From 760b23419b82078c0559919163e4ef84afbbfae4 Mon Sep 17 00:00:00 2001 From: Andre Natal Date: Fri, 28 May 2021 18:38:59 +0000 Subject: [PATCH] Bug 1710546 - Firefox Translations integration r=mossop,mixedpuppy,mhoye Bundle Firefox Translation as a builtin pref'd off addon in Nightly only Differential Revision: https://phabricator.services.mozilla.com/D114810 --- .eslintignore | 3 + browser/app/profile/firefox.js | 5 + .../static/browser_all_files_referenced.js | 5 + browser/components/BrowserGlue.jsm | 32 + browser/extensions/moz.build | 5 + browser/extensions/translations/README | 20 + .../extension/_locales/en_US/messages.json | 46 + .../extension/_locales/es_ES/messages.json | 46 + .../translations/extension/background.js | 10665 +++++++ .../translations/extension/commons.js | 26473 ++++++++++++++++ .../dom-translation-content-script.js | 2750 ++ .../extensionPreferences/api.js | 44 + .../extensionPreferences/schema.json | 15 + .../telemetryEnvironment/api.js | 58 + .../telemetryEnvironment/schema.json | 15 + .../telemetryPreferences/api.js | 57 + .../telemetryPreferences/schema.json | 34 + .../translateUi/TranslationBrowserChromeUi.js | 322 + .../TranslationBrowserChromeUiManager.js | 80 + .../experiment-apis/translateUi/api.js | 181 + .../content/translation-notification.js | 449 + .../experiment-apis/translateUi/schema.json | 100 + .../extension/icons/translation.16x16.png | Bin 0 -> 750 bytes .../extension/icons/translation.32x32.png | Bin 0 -> 1756 bytes .../translations/extension/manifest.json | 115 + .../extension/translation-worker.js | 8574 +++++ .../wasm/bergamot-translator-worker.wasm | Bin 0 -> 6732404 bytes .../translations/extension/wasm/cld-worker.js | 90 + .../extension/wasm/cld-worker.js.mem | Bin 0 -> 1097263 bytes browser/extensions/translations/import_xpi.py | 107 + browser/extensions/translations/jar.mn | 8 + browser/extensions/translations/moz.build | 4 + browser/installer/allowed-dupes.mn | 7 +- 33 files changed, 50309 insertions(+), 1 deletion(-) create mode 100644 browser/extensions/translations/README create mode 100644 browser/extensions/translations/extension/_locales/en_US/messages.json create mode 100644 browser/extensions/translations/extension/_locales/es_ES/messages.json create mode 100644 browser/extensions/translations/extension/background.js create mode 100644 browser/extensions/translations/extension/commons.js create mode 100644 browser/extensions/translations/extension/dom-translation-content-script.js create mode 100644 browser/extensions/translations/extension/experiment-apis/extensionPreferences/api.js create mode 100644 browser/extensions/translations/extension/experiment-apis/extensionPreferences/schema.json create mode 100644 browser/extensions/translations/extension/experiment-apis/telemetryEnvironment/api.js create mode 100644 browser/extensions/translations/extension/experiment-apis/telemetryEnvironment/schema.json create mode 100644 browser/extensions/translations/extension/experiment-apis/telemetryPreferences/api.js create mode 100644 browser/extensions/translations/extension/experiment-apis/telemetryPreferences/schema.json create mode 100644 browser/extensions/translations/extension/experiment-apis/translateUi/TranslationBrowserChromeUi.js create mode 100644 browser/extensions/translations/extension/experiment-apis/translateUi/TranslationBrowserChromeUiManager.js create mode 100644 browser/extensions/translations/extension/experiment-apis/translateUi/api.js create mode 100644 browser/extensions/translations/extension/experiment-apis/translateUi/content/translation-notification.js create mode 100644 browser/extensions/translations/extension/experiment-apis/translateUi/schema.json create mode 100644 browser/extensions/translations/extension/icons/translation.16x16.png create mode 100644 browser/extensions/translations/extension/icons/translation.32x32.png create mode 100644 browser/extensions/translations/extension/manifest.json create mode 100644 browser/extensions/translations/extension/translation-worker.js create mode 100644 browser/extensions/translations/extension/wasm/bergamot-translator-worker.wasm create mode 100644 browser/extensions/translations/extension/wasm/cld-worker.js create mode 100644 browser/extensions/translations/extension/wasm/cld-worker.js.mem create mode 100644 browser/extensions/translations/import_xpi.py create mode 100644 browser/extensions/translations/jar.mn create mode 100644 browser/extensions/translations/moz.build diff --git a/.eslintignore b/.eslintignore index b2746131a48b..3d076b89b3fe 100644 --- a/.eslintignore +++ b/.eslintignore @@ -218,3 +218,6 @@ tools/update-packaging/**/*refs.js # Ignore backgroundtasks preferences files. toolkit/components/backgroundtasks/defaults + +# Ignore pre-generated webpack and typescript transpiled files for translations +browser/extensions/translations/extension/ diff --git a/browser/app/profile/firefox.js b/browser/app/profile/firefox.js index 039455bbfc0f..cf7e150e4cc4 100644 --- a/browser/app/profile/firefox.js +++ b/browser/app/profile/firefox.js @@ -2583,3 +2583,8 @@ pref("first-startup.timeout", 30000); // are expected to go away once a standardized alternative becomes // available. pref("svg.context-properties.content.allowed-domains", "profile.accounts.firefox.com,profile.stage.mozaws.net"); + +// Preference that allows individual users to disable Firefox Translations. +#ifdef NIGHTLY_BUILD + pref("extensions.translations.disabled", true); +#endif diff --git a/browser/base/content/test/static/browser_all_files_referenced.js b/browser/base/content/test/static/browser_all_files_referenced.js index 514ee9286256..67192a17854f 100644 --- a/browser/base/content/test/static/browser_all_files_referenced.js +++ b/browser/base/content/test/static/browser_all_files_referenced.js @@ -69,6 +69,11 @@ if (AppConstants.MOZ_BACKGROUNDTASKS) { gExceptionPaths.push("resource://gre/modules/backgroundtasks/"); } +// Bug 1710546 https://bugzilla.mozilla.org/show_bug.cgi?id=1710546 +if (AppConstants.NIGHTLY_BUILD) { + gExceptionPaths.push("resource://builtin-addons/translations/"); +} + // Each whitelist entry should have a comment indicating which file is // referencing the whitelisted file in a way that the test can't detect, or a // bug number to remove or use the file if it is indeed currently unreferenced. diff --git a/browser/components/BrowserGlue.jsm b/browser/components/BrowserGlue.jsm index 114981e7f06d..b64317c3fc8b 100644 --- a/browser/components/BrowserGlue.jsm +++ b/browser/components/BrowserGlue.jsm @@ -1975,6 +1975,35 @@ BrowserGlue.prototype = { }); }, + // Set up a listener to enable/disable the translation extension + // based on its preference. + _monitorTranslationsPref() { + const PREF = "extensions.translations.disabled"; + const ID = "firefox-translations@mozilla.org"; + const _checkTranslationsPref = async () => { + let addon = await AddonManager.getAddonByID(ID); + let disabled = Services.prefs.getBoolPref(PREF, false); + if (!addon && disabled) { + // not installed, bail out early. + return; + } + if (!disabled) { + // first time install of addon and install on firefox update + addon = + (await AddonManager.maybeInstallBuiltinAddon( + ID, + "0.4.0", + "resource://builtin-addons/translations/" + )) || addon; + await addon.enable(); + } else if (addon) { + await addon.disable(); + } + }; + Services.prefs.addObserver(PREF, _checkTranslationsPref); + _checkTranslationsPref(); + }, + _monitorHTTPSOnlyPref() { const PREF_ENABLED = "dom.security.https_only_mode"; const PREF_WAS_ENABLED = "dom.security.https_only_mode_ever_enabled"; @@ -2172,6 +2201,9 @@ BrowserGlue.prototype = { this._monitorHTTPSOnlyPref(); this._monitorIonPref(); this._monitorIonStudies(); + if (AppConstants.NIGHTLY_BUILD) { + this._monitorTranslationsPref(); + } FirefoxMonitor.init(); }, diff --git a/browser/extensions/moz.build b/browser/extensions/moz.build index 269dcb2a32d6..1ab9167d870a 100644 --- a/browser/extensions/moz.build +++ b/browser/extensions/moz.build @@ -12,3 +12,8 @@ DIRS += [ "report-site-issue", "pictureinpicture", ] + +if CONFIG["NIGHTLY_BUILD"]: + DIRS += [ + "translations", + ] diff --git a/browser/extensions/translations/README b/browser/extensions/translations/README new file mode 100644 index 000000000000..23a62413c45a --- /dev/null +++ b/browser/extensions/translations/README @@ -0,0 +1,20 @@ +This folder contains the source files for Firefox Translations, which utilizes +the proceedings from Project Bergamot [1]. + +The feature is developed as a webextension [2] which utilizes a neural machine +translation decoder [3] ported to WebAssembly in order to process the +in page translation. The translation models [4] are downloaded on-demand by the +extension, so there's no need to bundle them too. + +The folder `extension_src` contains the entire code of the extension's xpi and +the wasm module (which lies inside the folder wasm), and is automatically +generated by the `import_xpi.py` script, which is responsibile for cloning +the extension repo [2], build it, and generate the `jar.mn` package containing +all the pertinent files necessary for running it. + +For any questions, reach out to anatal@mozilla.com. + +[1] https://browser.mt/ +[2] https://github.com/mozilla-extensions/bergamot-browser-extension +[3] https://github.com/mozilla/bergamot-translator/ +[4] https://github.com/mozilla-applied-ml/bergamot-models diff --git a/browser/extensions/translations/extension/_locales/en_US/messages.json b/browser/extensions/translations/extension/_locales/en_US/messages.json new file mode 100644 index 000000000000..e325d0aa8442 --- /dev/null +++ b/browser/extensions/translations/extension/_locales/en_US/messages.json @@ -0,0 +1,46 @@ +{ + "extensionName": { + "message": "Firefox Translations", + "description": "Name of the extension" + }, + "extensionDescription": { + "message": "Neural Machine Translation for the browser.", + "description": "Description of the extension." + }, + "currentlyDownloadingLanguageModel": { + "message": "Currently downloading language model", + "description": "Informs the user that the translations feature is currently downloading the language model files." + }, + "detailedDownloadProgress": { + "message": "$PERCENTAGE$% out of $MB$ mb downloaded", + "description": "Informs the user how the language model file downloading is progressing.", + "placeholders": { + "percentage": { + "content": "$1", + "example": "50" + }, + "mb": { + "content": "$2", + "example": "22.2" + } + } + }, + "currentlyLoadingLanguageModel": { + "message": "Currently loading language model", + "description": "Informs the user that the translations feature is currently loading the language model files into memory." + }, + "loadedLanguageModel": { + "message": "Language model loaded", + "description": "Informs the user that the translations feature is has loaded the language model files into memory." + }, + "partsLeftToTranslate": { + "message": "Parts left to translate: $NUM$", + "description": "Informs the user that the translations feature has $NUM$ parts left to translate.", + "placeholders": { + "num": { + "content": "$1", + "example": "3" + } + } + } +} diff --git a/browser/extensions/translations/extension/_locales/es_ES/messages.json b/browser/extensions/translations/extension/_locales/es_ES/messages.json new file mode 100644 index 000000000000..6c9395845925 --- /dev/null +++ b/browser/extensions/translations/extension/_locales/es_ES/messages.json @@ -0,0 +1,46 @@ +{ + "extensionName": { + "message": "Traducciones de Firefox", + "description": "Name of the extension" + }, + "extensionDescription": { + "message": "Traducción de la Máquina Neural para el navegador.", + "description": "Description of the extension." + }, + "currentlyDownloadingLanguageModel": { + "message": "Actualmente descargando el modelo de idioma", + "description": "Informs the user that the translations feature is currently downloading the language model files." + }, + "detailedDownloadProgress": { + "message": "$PERCENTAGE$% de $MB$ mb descargado", + "description": "Informs the user how the language model file downloading is progressing.", + "placeholders": { + "percentage": { + "content": "$1", + "example": "50" + }, + "mb": { + "content": "$2", + "example": "22.2" + } + } + }, + "currentlyLoadingLanguageModel": { + "message": "Actualmente cargar el modelo de idioma", + "description": "Informs the user that the translations feature is currently loading the language model files into memory." + }, + "loadedLanguageModel": { + "message": "Modelo de lenguaje cargado", + "description": "Informs the user that the translations feature is has loaded the language model files into memory." + }, + "partsLeftToTranslate": { + "message": "Partes que quedan para traducir: $NUM$", + "description": "Informs the user that the translations feature has $NUM$ parts left to translate.", + "placeholders": { + "num": { + "content": "$1", + "example": "3" + } + } + } +} diff --git a/browser/extensions/translations/extension/background.js b/browser/extensions/translations/extension/background.js new file mode 100644 index 000000000000..2976b4a1be34 --- /dev/null +++ b/browser/extensions/translations/extension/background.js @@ -0,0 +1,10665 @@ +/******/ (() => { // webpackBootstrap +/******/ var __webpack_modules__ = ({ + +/***/ 6789: +/*!*******************************************************************!*\ + !*** ./node_modules/@mozilla/glean/dist/webext/core/constants.js ***! + \*******************************************************************/ +/***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => { + +"use strict"; +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "Oo": () => (/* binding */ GLEAN_SCHEMA_VERSION), +/* harmony export */ "Q9": () => (/* binding */ GLEAN_VERSION), +/* harmony export */ "ni": () => (/* binding */ PING_INFO_STORAGE), +/* harmony export */ "xW": () => (/* binding */ CLIENT_INFO_STORAGE), +/* harmony export */ "Ei": () => (/* binding */ KNOWN_CLIENT_ID), +/* harmony export */ "ey": () => (/* binding */ DEFAULT_TELEMETRY_ENDPOINT), +/* harmony export */ "Ui": () => (/* binding */ DELETION_REQUEST_PING_NAME), +/* harmony export */ "og": () => (/* binding */ GLEAN_MAX_SOURCE_TAGS) +/* harmony export */ }); +const GLEAN_SCHEMA_VERSION = 1; +const GLEAN_VERSION = "0.14.1"; +const PING_INFO_STORAGE = "glean_ping_info"; +const CLIENT_INFO_STORAGE = "glean_client_info"; +const KNOWN_CLIENT_ID = "c0ffeec0-ffee-c0ff-eec0-ffeec0ffeec0"; +const DEFAULT_TELEMETRY_ENDPOINT = "https://incoming.telemetry.mozilla.org"; +const DELETION_REQUEST_PING_NAME = "deletion-request"; +const GLEAN_MAX_SOURCE_TAGS = 5; + + +/***/ }), + +/***/ 4658: +/*!*****************************************************************************!*\ + !*** ./node_modules/@mozilla/glean/dist/webext/core/context.js + 1 modules ***! + \*****************************************************************************/ +/***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => { + +"use strict"; + +// EXPORTS +__webpack_require__.d(__webpack_exports__, { + "_": () => (/* binding */ Context) +}); + +;// CONCATENATED MODULE: ./node_modules/@mozilla/glean/dist/webext/core/dispatcher.js +var DispatcherState; +(function (DispatcherState) { + DispatcherState[DispatcherState["Uninitialized"] = 0] = "Uninitialized"; + DispatcherState[DispatcherState["Idle"] = 1] = "Idle"; + DispatcherState[DispatcherState["Processing"] = 2] = "Processing"; + DispatcherState[DispatcherState["Stopped"] = 3] = "Stopped"; +})(DispatcherState || (DispatcherState = {})); +var Commands; +(function (Commands) { + Commands[Commands["Task"] = 0] = "Task"; + Commands[Commands["Stop"] = 1] = "Stop"; + Commands[Commands["Clear"] = 2] = "Clear"; + Commands[Commands["TestTask"] = 3] = "TestTask"; +})(Commands || (Commands = {})); +class Dispatcher { + constructor(maxPreInitQueueSize = 100) { + this.maxPreInitQueueSize = maxPreInitQueueSize; + this.queue = []; + this.state = 0; + } + getNextCommand() { + return this.queue.shift(); + } + async executeTask(task) { + try { + await task(); + } + catch (e) { + console.error("Error executing task:", e); + } + } + async execute() { + let nextCommand = this.getNextCommand(); + while (nextCommand) { + switch (nextCommand.command) { + case (1): + this.state = 3; + return; + case (2): + this.queue.forEach(c => { + if (c.command === 3) { + c.resolver(); + } + }); + this.queue = []; + this.state = 3; + return; + case (3): + await this.executeTask(nextCommand.task); + nextCommand.resolver(); + nextCommand = this.getNextCommand(); + continue; + case (0): + await this.executeTask(nextCommand.task); + nextCommand = this.getNextCommand(); + } + } + } + triggerExecution() { + if (this.state === 1 && this.queue.length > 0) { + this.state = 2; + this.currentJob = this.execute(); + this.currentJob + .then(() => { + this.currentJob = undefined; + if (this.state === 2) { + this.state = 1; + } + }) + .catch(error => { + console.error("IMPOSSIBLE: Something went wrong while the dispatcher was executing the tasks queue.", error); + }); + } + } + launchInternal(command, priorityTask = false) { + if (!priorityTask && this.state === 0) { + if (this.queue.length >= this.maxPreInitQueueSize) { + console.warn("Unable to enqueue task, pre init queue is full."); + return false; + } + } + if (priorityTask) { + this.queue.unshift(command); + } + else { + this.queue.push(command); + } + this.triggerExecution(); + return true; + } + launch(task) { + this.launchInternal({ + task, + command: 0 + }); + } + flushInit(task) { + if (this.state !== 0) { + console.warn("Attempted to initialize the Dispatcher, but it is already initialized. Ignoring."); + return; + } + if (task) { + this.launchInternal({ + task, + command: 0 + }, true); + } + this.state = 1; + this.triggerExecution(); + } + clear() { + this.launchInternal({ command: 2 }, true); + this.resume(); + } + stop() { + this.launchInternal({ command: 1 }, true); + } + resume() { + if (this.state === 3) { + this.state = 1; + this.triggerExecution(); + } + } + async testBlockOnQueue() { + return this.currentJob && await this.currentJob; + } + async testUninitialize() { + if (this.state === 0) { + return; + } + this.clear(); + await this.testBlockOnQueue(); + this.state = 0; + } + testLaunch(task) { + return new Promise((resolver, reject) => { + this.resume(); + const wasLaunched = this.launchInternal({ + resolver, + task, + command: 3 + }); + if (!wasLaunched) { + reject(); + } + }); + } +} +/* harmony default export */ const dispatcher = (Dispatcher); + +;// CONCATENATED MODULE: ./node_modules/@mozilla/glean/dist/webext/core/context.js + +class Context { + constructor() { + this._initialized = false; + } + static get instance() { + if (!Context._instance) { + Context._instance = new Context(); + } + return Context._instance; + } + static async testUninitialize() { + if (Context.instance._dispatcher) { + await Context.instance._dispatcher.testUninitialize(); + } + Context.instance._dispatcher = null; + Context.initialized = false; + } + static get dispatcher() { + if (!Context.instance._dispatcher) { + Context.instance._dispatcher = new dispatcher(); + } + return Context.instance._dispatcher; + } + static set dispatcher(dispatcher) { + Context.instance._dispatcher = dispatcher; + } + static get uploadEnabled() { + return Context.instance._uploadEnabled; + } + static set uploadEnabled(upload) { + Context.instance._uploadEnabled = upload; + } + static get metricsDatabase() { + return Context.instance._metricsDatabase; + } + static set metricsDatabase(db) { + Context.instance._metricsDatabase = db; + } + static get eventsDatabase() { + return Context.instance._eventsDatabase; + } + static set eventsDatabase(db) { + Context.instance._eventsDatabase = db; + } + static get pingsDatabase() { + return Context.instance._pingsDatabase; + } + static set pingsDatabase(db) { + Context.instance._pingsDatabase = db; + } + static get errorManager() { + return Context.instance._errorManager; + } + static set errorManager(db) { + Context.instance._errorManager = db; + } + static get applicationId() { + return Context.instance._applicationId; + } + static set applicationId(id) { + Context.instance._applicationId = id; + } + static get initialized() { + return Context.instance._initialized; + } + static set initialized(init) { + Context.instance._initialized = init; + } + static get debugOptions() { + return Context.instance._debugOptions; + } + static set debugOptions(options) { + Context.instance._debugOptions = options; + } +} + + +/***/ }), + +/***/ 7864: +/*!**************************************************************************!*\ + !*** ./node_modules/@mozilla/glean/dist/webext/core/error/error_type.js ***! + \**************************************************************************/ +/***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => { + +"use strict"; +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "N": () => (/* binding */ ErrorType) +/* harmony export */ }); +var ErrorType; +(function (ErrorType) { + ErrorType["InvalidValue"] = "invalid_value"; + ErrorType["InvalidLabel"] = "invalid_label"; + ErrorType["InvalidState"] = "invalid_state"; + ErrorType["InvalidOverflow"] = "invalid_overflow"; +})(ErrorType || (ErrorType = {})); + + +/***/ }), + +/***/ 4815: +/*!**********************************************************************!*\ + !*** ./node_modules/@mozilla/glean/dist/webext/core/events/index.js ***! + \**********************************************************************/ +/***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => { + +"use strict"; +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "Z": () => (__WEBPACK_DEFAULT_EXPORT__) +/* harmony export */ }); +/* unused harmony export CoreEvent */ +class CoreEvent { + constructor(name) { + this.name = name; + } + get registeredPluginIdentifier() { + var _a; + return (_a = this.plugin) === null || _a === void 0 ? void 0 : _a.name; + } + registerPlugin(plugin) { + if (this.plugin) { + console.error(`Attempted to register plugin '${plugin.name}', which listens to the event '${plugin.event}'.`, `That event is already watched by plugin '${this.plugin.name}'`, `Plugin '${plugin.name}' will be ignored.`); + return; + } + this.plugin = plugin; + } + deregisterPlugin() { + this.plugin = undefined; + } + trigger(...args) { + if (this.plugin) { + return this.plugin.action(...args); + } + } +} +const CoreEvents = { + afterPingCollection: new CoreEvent("afterPingCollection") +}; +/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (CoreEvents); + + +/***/ }), + +/***/ 9150: +/*!*********************************************************************************!*\ + !*** ./node_modules/@mozilla/glean/dist/webext/core/metrics/events_database.js ***! + \*********************************************************************************/ +/***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => { + +"use strict"; +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "K": () => (/* binding */ RecordedEvent), +/* harmony export */ "Z": () => (__WEBPACK_DEFAULT_EXPORT__) +/* harmony export */ }); +/* harmony import */ var _utils_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../utils.js */ 6222); + +class RecordedEvent { + constructor(category, name, timestamp, extra) { + this.category = category; + this.name = name; + this.timestamp = timestamp; + this.extra = extra; + } + static toJSONObject(e) { + return { + "category": e.category, + "name": e.name, + "timestamp": e.timestamp, + "extra": e.extra, + }; + } + static fromJSONObject(e) { + return new RecordedEvent(e["category"], e["name"], e["timestamp"], e["extra"]); + } +} +class EventsDatabase { + constructor(storage) { + this.eventsStore = new storage("events"); + } + async record(metric, value) { + if (metric.disabled) { + return; + } + for (const ping of metric.sendInPings) { + const transformFn = (v) => { + var _a; + const existing = (_a = v) !== null && _a !== void 0 ? _a : []; + existing.push(RecordedEvent.toJSONObject(value)); + return existing; + }; + await this.eventsStore.update([ping], transformFn); + } + } + async getEvents(ping, metric) { + const events = await this.getAndValidatePingData(ping); + if (events.length === 0) { + return; + } + return events + .filter((e) => { + return (e.category === metric.category) && (e.name === metric.name); + }); + } + async getAndValidatePingData(ping) { + const data = await this.eventsStore.get([ping]); + if ((0,_utils_js__WEBPACK_IMPORTED_MODULE_0__/* .isUndefined */ .o8)(data)) { + return []; + } + if (!Array.isArray(data)) { + console.error(`Unexpected value found for ping ${ping}: ${JSON.stringify(data)}. Clearing.`); + await this.eventsStore.delete([ping]); + return []; + } + return data.map((e) => RecordedEvent.fromJSONObject(e)); + } + async getPingEvents(ping, clearPingLifetimeData) { + const pingData = await this.getAndValidatePingData(ping); + if (clearPingLifetimeData) { + await this.eventsStore.delete([ping]); + } + if (pingData.length === 0) { + return; + } + const sortedData = pingData.sort((a, b) => { + return a.timestamp - b.timestamp; + }); + const firstTimestamp = sortedData[0].timestamp; + return sortedData.map((e) => { + const adjusted = RecordedEvent.toJSONObject(e); + adjusted["timestamp"] = e.timestamp - firstTimestamp; + return adjusted; + }); + } + async clearAll() { + await this.eventsStore.delete([]); + } +} +/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (EventsDatabase); + + +/***/ }), + +/***/ 8284: +/*!***********************************************************************!*\ + !*** ./node_modules/@mozilla/glean/dist/webext/core/metrics/index.js ***! + \***********************************************************************/ +/***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => { + +"use strict"; +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "t": () => (/* binding */ MetricType) +/* harmony export */ }); +/* harmony import */ var _utils_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../utils.js */ 6222); +/* harmony import */ var _types_labeled_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./types/labeled.js */ 3119); +/* harmony import */ var _context_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../context.js */ 4658); + + + +class MetricType { + constructor(type, meta) { + this.type = type; + this.name = meta.name; + this.category = meta.category; + this.sendInPings = meta.sendInPings; + this.lifetime = meta.lifetime; + this.disabled = meta.disabled; + this.dynamicLabel = meta.dynamicLabel; + } + baseIdentifier() { + if (this.category.length > 0) { + return `${this.category}.${this.name}`; + } + else { + return this.name; + } + } + async identifier(metricsDatabase) { + const baseIdentifier = this.baseIdentifier(); + if (!(0,_utils_js__WEBPACK_IMPORTED_MODULE_0__/* .isUndefined */ .o8)(this.dynamicLabel)) { + return await (0,_types_labeled_js__WEBPACK_IMPORTED_MODULE_1__/* .getValidDynamicLabel */ .qd)(metricsDatabase, this); + } + else { + return baseIdentifier; + } + } + shouldRecord(uploadEnabled) { + return (uploadEnabled && !this.disabled); + } + async testGetNumRecordedErrors(errorType, ping = this.sendInPings[0]) { + return _context_js__WEBPACK_IMPORTED_MODULE_2__/* .Context.errorManager.testGetNumRecordedErrors */ ._.errorManager.testGetNumRecordedErrors(this, errorType, ping); + } +} + + +/***/ }), + +/***/ 519: +/*!************************************************************************!*\ + !*** ./node_modules/@mozilla/glean/dist/webext/core/metrics/metric.js ***! + \************************************************************************/ +/***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => { + +"use strict"; +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "j": () => (/* binding */ Metric) +/* harmony export */ }); +class Metric { + constructor(v) { + if (!this.validate(v)) { + throw new Error("Unable to create new Metric instance, values is in unexpected format."); + } + this._inner = v; + } + get() { + return this._inner; + } + set(v) { + if (!this.validate(v)) { + console.error(`Unable to set metric to ${JSON.stringify(v)}. Value is in unexpected format. Ignoring.`); + return; + } + this._inner = v; + } +} + + +/***/ }), + +/***/ 9696: +/*!***************************************************************************!*\ + !*** ./node_modules/@mozilla/glean/dist/webext/core/metrics/time_unit.js ***! + \***************************************************************************/ +/***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => { + +"use strict"; +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "Z": () => (__WEBPACK_DEFAULT_EXPORT__) +/* harmony export */ }); +var TimeUnit; +(function (TimeUnit) { + TimeUnit["Nanosecond"] = "nanosecond"; + TimeUnit["Microsecond"] = "microsecond"; + TimeUnit["Millisecond"] = "millisecond"; + TimeUnit["Second"] = "second"; + TimeUnit["Minute"] = "minute"; + TimeUnit["Hour"] = "hour"; + TimeUnit["Day"] = "day"; +})(TimeUnit || (TimeUnit = {})); +/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (TimeUnit); + + +/***/ }), + +/***/ 4429: +/*!*******************************************************************************!*\ + !*** ./node_modules/@mozilla/glean/dist/webext/core/metrics/types/counter.js ***! + \*******************************************************************************/ +/***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "CounterMetric": () => (/* binding */ CounterMetric), +/* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__) +/* harmony export */ }); +/* harmony import */ var _index_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../index.js */ 8284); +/* harmony import */ var _utils_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../utils.js */ 6222); +/* harmony import */ var _context_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../context.js */ 4658); +/* harmony import */ var _metric_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../metric.js */ 519); +/* harmony import */ var _error_error_type_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../error/error_type.js */ 7864); + + + + + +class CounterMetric extends _metric_js__WEBPACK_IMPORTED_MODULE_4__/* .Metric */ .j { + constructor(v) { + super(v); + } + validate(v) { + if (!(0,_utils_js__WEBPACK_IMPORTED_MODULE_1__/* .isInteger */ .U)(v)) { + return false; + } + if (v <= 0) { + return false; + } + return true; + } + payload() { + return this._inner; + } +} +class CounterMetricType extends _index_js__WEBPACK_IMPORTED_MODULE_0__/* .MetricType */ .t { + constructor(meta) { + super("counter", meta); + } + static async _private_addUndispatched(instance, amount) { + if (!instance.shouldRecord(_context_js__WEBPACK_IMPORTED_MODULE_2__/* .Context.uploadEnabled */ ._.uploadEnabled)) { + return; + } + if ((0,_utils_js__WEBPACK_IMPORTED_MODULE_1__/* .isUndefined */ .o8)(amount)) { + amount = 1; + } + if (amount <= 0) { + await _context_js__WEBPACK_IMPORTED_MODULE_2__/* .Context.errorManager.record */ ._.errorManager.record(instance, _error_error_type_js__WEBPACK_IMPORTED_MODULE_3__/* .ErrorType.InvalidValue */ .N.InvalidValue, `Added negative and zero value ${amount}`); + return; + } + const transformFn = ((amount) => { + return (v) => { + let metric; + let result; + try { + metric = new CounterMetric(v); + result = metric.get() + amount; + } + catch (_a) { + metric = new CounterMetric(amount); + result = amount; + } + if (result > Number.MAX_SAFE_INTEGER) { + result = Number.MAX_SAFE_INTEGER; + } + metric.set(result); + return metric; + }; + })(amount); + await _context_js__WEBPACK_IMPORTED_MODULE_2__/* .Context.metricsDatabase.transform */ ._.metricsDatabase.transform(instance, transformFn); + } + add(amount) { + _context_js__WEBPACK_IMPORTED_MODULE_2__/* .Context.dispatcher.launch */ ._.dispatcher.launch(async () => CounterMetricType._private_addUndispatched(this, amount)); + } + async testGetValue(ping = this.sendInPings[0]) { + let metric; + await _context_js__WEBPACK_IMPORTED_MODULE_2__/* .Context.dispatcher.testLaunch */ ._.dispatcher.testLaunch(async () => { + metric = await _context_js__WEBPACK_IMPORTED_MODULE_2__/* .Context.metricsDatabase.getMetric */ ._.metricsDatabase.getMetric(ping, this); + }); + return metric; + } +} +/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (CounterMetricType); + + +/***/ }), + +/***/ 9303: +/*!********************************************************************************!*\ + !*** ./node_modules/@mozilla/glean/dist/webext/core/metrics/types/datetime.js ***! + \********************************************************************************/ +/***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => { + +"use strict"; +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "ui": () => (/* binding */ DatetimeMetric), +/* harmony export */ "ZP": () => (__WEBPACK_DEFAULT_EXPORT__) +/* harmony export */ }); +/* unused harmony export formatTimezoneOffset */ +/* harmony import */ var _index_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../index.js */ 8284); +/* harmony import */ var _metrics_time_unit_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../metrics/time_unit.js */ 9696); +/* harmony import */ var _context_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../context.js */ 4658); +/* harmony import */ var _metric_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../metric.js */ 519); +/* harmony import */ var _utils_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../utils.js */ 6222); + + + + + +function formatTimezoneOffset(timezone) { + const offset = (timezone / 60) * -1; + const sign = offset > 0 ? "+" : "-"; + const hours = Math.abs(offset).toString().padStart(2, "0"); + return `${sign}${hours}:00`; +} +class DatetimeMetric extends _metric_js__WEBPACK_IMPORTED_MODULE_4__/* .Metric */ .j { + constructor(v) { + super(v); + } + static fromDate(v, timeUnit) { + return new DatetimeMetric({ + timeUnit, + timezone: v.getTimezoneOffset(), + date: v.toISOString() + }); + } + get date() { + return new Date(this._inner.date); + } + get timezone() { + return this._inner.timezone; + } + get timeUnit() { + return this._inner.timeUnit; + } + get dateISOString() { + return this._inner.date; + } + validate(v) { + if (!(0,_utils_js__WEBPACK_IMPORTED_MODULE_3__/* .isObject */ .Kn)(v) || Object.keys(v).length !== 3) { + return false; + } + const timeUnitVerification = "timeUnit" in v && (0,_utils_js__WEBPACK_IMPORTED_MODULE_3__/* .isString */ .HD)(v.timeUnit) && Object.values(_metrics_time_unit_js__WEBPACK_IMPORTED_MODULE_1__/* .default */ .Z).includes(v.timeUnit); + const timezoneVerification = "timezone" in v && (0,_utils_js__WEBPACK_IMPORTED_MODULE_3__/* .isNumber */ .hj)(v.timezone); + const dateVerification = "date" in v && (0,_utils_js__WEBPACK_IMPORTED_MODULE_3__/* .isString */ .HD)(v.date) && v.date.length === 24 && !isNaN(Date.parse(v.date)); + if (!timeUnitVerification || !timezoneVerification || !dateVerification) { + return false; + } + return true; + } + payload() { + const extractedDateInfo = this.dateISOString.match(/\d+/g); + if (!extractedDateInfo || extractedDateInfo.length < 0) { + throw new Error("IMPOSSIBLE: Unable to extract date information from DatetimeMetric."); + } + const correctedDate = new Date(parseInt(extractedDateInfo[0]), parseInt(extractedDateInfo[1]) - 1, parseInt(extractedDateInfo[2]), parseInt(extractedDateInfo[3]) - (this.timezone / 60), parseInt(extractedDateInfo[4]), parseInt(extractedDateInfo[5]), parseInt(extractedDateInfo[6])); + const timezone = formatTimezoneOffset(this.timezone); + const year = correctedDate.getFullYear().toString().padStart(2, "0"); + const month = (correctedDate.getMonth() + 1).toString().padStart(2, "0"); + const day = correctedDate.getDate().toString().padStart(2, "0"); + if (this.timeUnit === _metrics_time_unit_js__WEBPACK_IMPORTED_MODULE_1__/* .default.Day */ .Z.Day) { + return `${year}-${month}-${day}${timezone}`; + } + const hours = correctedDate.getHours().toString().padStart(2, "0"); + if (this.timeUnit === _metrics_time_unit_js__WEBPACK_IMPORTED_MODULE_1__/* .default.Hour */ .Z.Hour) { + return `${year}-${month}-${day}T${hours}${timezone}`; + } + const minutes = correctedDate.getMinutes().toString().padStart(2, "0"); + if (this.timeUnit === _metrics_time_unit_js__WEBPACK_IMPORTED_MODULE_1__/* .default.Minute */ .Z.Minute) { + return `${year}-${month}-${day}T${hours}:${minutes}${timezone}`; + } + const seconds = correctedDate.getSeconds().toString().padStart(2, "0"); + if (this.timeUnit === _metrics_time_unit_js__WEBPACK_IMPORTED_MODULE_1__/* .default.Second */ .Z.Second) { + return `${year}-${month}-${day}T${hours}:${minutes}:${seconds}${timezone}`; + } + const milliseconds = correctedDate.getMilliseconds().toString().padStart(3, "0"); + if (this.timeUnit === _metrics_time_unit_js__WEBPACK_IMPORTED_MODULE_1__/* .default.Millisecond */ .Z.Millisecond) { + return `${year}-${month}-${day}T${hours}:${minutes}:${seconds}.${milliseconds}${timezone}`; + } + if (this.timeUnit === _metrics_time_unit_js__WEBPACK_IMPORTED_MODULE_1__/* .default.Microsecond */ .Z.Microsecond) { + return `${year}-${month}-${day}T${hours}:${minutes}:${seconds}.${milliseconds}000${timezone}`; + } + return `${year}-${month}-${day}T${hours}:${minutes}:${seconds}.${milliseconds}000000${timezone}`; + } +} +class DatetimeMetricType extends _index_js__WEBPACK_IMPORTED_MODULE_0__/* .MetricType */ .t { + constructor(meta, timeUnit) { + super("datetime", meta); + this.timeUnit = timeUnit; + } + static async _private_setUndispatched(instance, value) { + if (!instance.shouldRecord(_context_js__WEBPACK_IMPORTED_MODULE_2__/* .Context.uploadEnabled */ ._.uploadEnabled)) { + return; + } + if (!value) { + value = new Date(); + } + const truncatedDate = value; + switch (instance.timeUnit) { + case (_metrics_time_unit_js__WEBPACK_IMPORTED_MODULE_1__/* .default.Day */ .Z.Day): + truncatedDate.setMilliseconds(0); + truncatedDate.setSeconds(0); + truncatedDate.setMinutes(0); + truncatedDate.setMilliseconds(0); + case (_metrics_time_unit_js__WEBPACK_IMPORTED_MODULE_1__/* .default.Hour */ .Z.Hour): + truncatedDate.setMilliseconds(0); + truncatedDate.setSeconds(0); + truncatedDate.setMinutes(0); + case (_metrics_time_unit_js__WEBPACK_IMPORTED_MODULE_1__/* .default.Minute */ .Z.Minute): + truncatedDate.setMilliseconds(0); + truncatedDate.setSeconds(0); + case (_metrics_time_unit_js__WEBPACK_IMPORTED_MODULE_1__/* .default.Second */ .Z.Second): + truncatedDate.setMilliseconds(0); + default: + break; + } + const metric = DatetimeMetric.fromDate(value, instance.timeUnit); + await _context_js__WEBPACK_IMPORTED_MODULE_2__/* .Context.metricsDatabase.record */ ._.metricsDatabase.record(instance, metric); + } + set(value) { + _context_js__WEBPACK_IMPORTED_MODULE_2__/* .Context.dispatcher.launch */ ._.dispatcher.launch(() => DatetimeMetricType._private_setUndispatched(this, value)); + } + async testGetValueAsDatetimeMetric(ping) { + let value; + await _context_js__WEBPACK_IMPORTED_MODULE_2__/* .Context.dispatcher.testLaunch */ ._.dispatcher.testLaunch(async () => { + value = await _context_js__WEBPACK_IMPORTED_MODULE_2__/* .Context.metricsDatabase.getMetric */ ._.metricsDatabase.getMetric(ping, this); + }); + if (value) { + return new DatetimeMetric(value); + } + } + async testGetValueAsString(ping = this.sendInPings[0]) { + const metric = await this.testGetValueAsDatetimeMetric(ping); + return metric ? metric.payload() : undefined; + } + async testGetValue(ping = this.sendInPings[0]) { + const metric = await this.testGetValueAsDatetimeMetric(ping); + return metric ? metric.date : undefined; + } +} +/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (DatetimeMetricType); + + +/***/ }), + +/***/ 4986: +/*!*****************************************************************************!*\ + !*** ./node_modules/@mozilla/glean/dist/webext/core/metrics/types/event.js ***! + \*****************************************************************************/ +/***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__) +/* harmony export */ }); +/* harmony import */ var _index_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../index.js */ 8284); +/* harmony import */ var _events_database_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../events_database.js */ 9150); +/* harmony import */ var _utils_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../utils.js */ 6222); +/* harmony import */ var _context_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../context.js */ 4658); +/* harmony import */ var _error_error_type_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../error/error_type.js */ 7864); + + + + + +const MAX_LENGTH_EXTRA_KEY_VALUE = 100; +class EventMetricType extends _index_js__WEBPACK_IMPORTED_MODULE_0__/* .MetricType */ .t { + constructor(meta, allowedExtraKeys) { + super("event", meta); + this.allowedExtraKeys = allowedExtraKeys; + } + record(extra) { + _context_js__WEBPACK_IMPORTED_MODULE_3__/* .Context.dispatcher.launch */ ._.dispatcher.launch(async () => { + if (!this.shouldRecord(_context_js__WEBPACK_IMPORTED_MODULE_3__/* .Context.uploadEnabled */ ._.uploadEnabled)) { + return; + } + const timestamp = (0,_utils_js__WEBPACK_IMPORTED_MODULE_2__/* .getMonotonicNow */ .ts)(); + let truncatedExtra = undefined; + if (extra && this.allowedExtraKeys) { + truncatedExtra = {}; + for (const [name, value] of Object.entries(extra)) { + if (this.allowedExtraKeys.includes(name)) { + truncatedExtra[name] = await (0,_utils_js__WEBPACK_IMPORTED_MODULE_2__/* .truncateStringAtBoundaryWithError */ .hY)(this, value, MAX_LENGTH_EXTRA_KEY_VALUE); + } + else { + await _context_js__WEBPACK_IMPORTED_MODULE_3__/* .Context.errorManager.record */ ._.errorManager.record(this, _error_error_type_js__WEBPACK_IMPORTED_MODULE_4__/* .ErrorType.InvalidValue */ .N.InvalidValue, `Invalid key index: ${name}`); + continue; + } + } + } + const event = new _events_database_js__WEBPACK_IMPORTED_MODULE_1__/* .RecordedEvent */ .K(this.category, this.name, timestamp, truncatedExtra); + await _context_js__WEBPACK_IMPORTED_MODULE_3__/* .Context.eventsDatabase.record */ ._.eventsDatabase.record(this, event); + }); + } + async testGetValue(ping = this.sendInPings[0]) { + let events; + await _context_js__WEBPACK_IMPORTED_MODULE_3__/* .Context.dispatcher.testLaunch */ ._.dispatcher.testLaunch(async () => { + events = await _context_js__WEBPACK_IMPORTED_MODULE_3__/* .Context.eventsDatabase.getEvents */ ._.eventsDatabase.getEvents(ping, this); + }); + return events; + } +} +/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (EventMetricType); + + +/***/ }), + +/***/ 3119: +/*!*******************************************************************************!*\ + !*** ./node_modules/@mozilla/glean/dist/webext/core/metrics/types/labeled.js ***! + \*******************************************************************************/ +/***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => { + +"use strict"; +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "Dc": () => (/* binding */ LabeledMetric), +/* harmony export */ "lb": () => (/* binding */ combineIdentifierAndLabel), +/* harmony export */ "ho": () => (/* binding */ stripLabel), +/* harmony export */ "qd": () => (/* binding */ getValidDynamicLabel) +/* harmony export */ }); +/* unused harmony export OTHER_LABEL */ +/* harmony import */ var _metric_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../metric.js */ 519); +/* harmony import */ var _context_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../context.js */ 4658); +/* harmony import */ var _error_error_type_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../error/error_type.js */ 7864); + + + +class LabeledMetric extends _metric_js__WEBPACK_IMPORTED_MODULE_2__/* .Metric */ .j { + constructor(v) { + super(v); + } + validate(v) { + return true; + } + payload() { + return this._inner; + } +} +const MAX_LABELS = 16; +const MAX_LABEL_LENGTH = 61; +const OTHER_LABEL = "__other__"; +const LABEL_REGEX = /^[a-z_][a-z0-9_-]{0,29}(\.[a-z_][a-z0-9_-]{0,29})*$/; +function combineIdentifierAndLabel(metricName, label) { + return `${metricName}/${label}`; +} +function stripLabel(identifier) { + return identifier.split("/")[0]; +} +async function getValidDynamicLabel(metricsDatabase, metric) { + if (metric.dynamicLabel === undefined) { + throw new Error("This point should never be reached."); + } + const key = combineIdentifierAndLabel(metric.baseIdentifier(), metric.dynamicLabel); + for (const ping of metric.sendInPings) { + if (await metricsDatabase.hasMetric(metric.lifetime, ping, metric.type, key)) { + return key; + } + } + let numUsedKeys = 0; + for (const ping of metric.sendInPings) { + numUsedKeys += await metricsDatabase.countByBaseIdentifier(metric.lifetime, ping, metric.type, metric.baseIdentifier()); + } + let hitError = false; + if (numUsedKeys >= MAX_LABELS) { + hitError = true; + } + else if (metric.dynamicLabel.length > MAX_LABEL_LENGTH) { + hitError = true; + await _context_js__WEBPACK_IMPORTED_MODULE_0__/* .Context.errorManager.record */ ._.errorManager.record(metric, _error_error_type_js__WEBPACK_IMPORTED_MODULE_1__/* .ErrorType.InvalidLabel */ .N.InvalidLabel, `Label length ${metric.dynamicLabel.length} exceeds maximum of ${MAX_LABEL_LENGTH}.`); + } + else if (!LABEL_REGEX.test(metric.dynamicLabel)) { + hitError = true; + await _context_js__WEBPACK_IMPORTED_MODULE_0__/* .Context.errorManager.record */ ._.errorManager.record(metric, _error_error_type_js__WEBPACK_IMPORTED_MODULE_1__/* .ErrorType.InvalidLabel */ .N.InvalidLabel, `Label must be snake_case, got '${metric.dynamicLabel}'.`); + } + return (hitError) + ? combineIdentifierAndLabel(metric.baseIdentifier(), OTHER_LABEL) + : key; +} +class LabeledMetricType { + constructor(meta, submetric, labels) { + return new Proxy(this, { + get: (_target, label) => { + if (labels) { + return LabeledMetricType.createFromStaticLabel(meta, submetric, labels, label); + } + return LabeledMetricType.createFromDynamicLabel(meta, submetric, label); + } + }); + } + static createFromStaticLabel(meta, submetricClass, allowedLabels, label) { + const adjustedLabel = allowedLabels.includes(label) ? label : OTHER_LABEL; + const newMeta = { + ...meta, + name: combineIdentifierAndLabel(meta.name, adjustedLabel) + }; + return new submetricClass(newMeta); + } + static createFromDynamicLabel(meta, submetricClass, label) { + const newMeta = { + ...meta, + dynamicLabel: label + }; + return new submetricClass(newMeta); + } +} +/* unused harmony default export */ var __WEBPACK_DEFAULT_EXPORT__ = ((/* unused pure expression or super */ null && (LabeledMetricType))); + + +/***/ }), + +/***/ 6120: +/*!********************************************************************************!*\ + !*** ./node_modules/@mozilla/glean/dist/webext/core/metrics/types/quantity.js ***! + \********************************************************************************/ +/***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "QuantityMetric": () => (/* binding */ QuantityMetric), +/* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__) +/* harmony export */ }); +/* harmony import */ var _index_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../index.js */ 8284); +/* harmony import */ var _utils_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../utils.js */ 6222); +/* harmony import */ var _context_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../context.js */ 4658); +/* harmony import */ var _metric_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../metric.js */ 519); +/* harmony import */ var _error_error_type_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../error/error_type.js */ 7864); + + + + + +class QuantityMetric extends _metric_js__WEBPACK_IMPORTED_MODULE_4__/* .Metric */ .j { + constructor(v) { + super(v); + } + validate(v) { + if (!(0,_utils_js__WEBPACK_IMPORTED_MODULE_1__/* .isInteger */ .U)(v)) { + return false; + } + if (v < 0) { + return false; + } + return true; + } + payload() { + return this._inner; + } +} +class QuantityMetricType extends _index_js__WEBPACK_IMPORTED_MODULE_0__/* .MetricType */ .t { + constructor(meta) { + super("quantity", meta); + } + static async _private_setUndispatched(instance, value) { + if (!instance.shouldRecord(_context_js__WEBPACK_IMPORTED_MODULE_2__/* .Context.uploadEnabled */ ._.uploadEnabled)) { + return; + } + if (value < 0) { + await _context_js__WEBPACK_IMPORTED_MODULE_2__/* .Context.errorManager.record */ ._.errorManager.record(instance, _error_error_type_js__WEBPACK_IMPORTED_MODULE_3__/* .ErrorType.InvalidValue */ .N.InvalidValue, `Set negative value ${value}`); + return; + } + if (value > Number.MAX_SAFE_INTEGER) { + value = Number.MAX_SAFE_INTEGER; + } + const metric = new QuantityMetric(value); + await _context_js__WEBPACK_IMPORTED_MODULE_2__/* .Context.metricsDatabase.record */ ._.metricsDatabase.record(instance, metric); + } + set(value) { + _context_js__WEBPACK_IMPORTED_MODULE_2__/* .Context.dispatcher.launch */ ._.dispatcher.launch(() => QuantityMetricType._private_setUndispatched(this, value)); + } + async testGetValue(ping = this.sendInPings[0]) { + let metric; + await _context_js__WEBPACK_IMPORTED_MODULE_2__/* .Context.dispatcher.testLaunch */ ._.dispatcher.testLaunch(async () => { + metric = await _context_js__WEBPACK_IMPORTED_MODULE_2__/* .Context.metricsDatabase.getMetric */ ._.metricsDatabase.getMetric(ping, this); + }); + return metric; + } +} +/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (QuantityMetricType); + + +/***/ }), + +/***/ 5799: +/*!******************************************************************************!*\ + !*** ./node_modules/@mozilla/glean/dist/webext/core/metrics/types/string.js ***! + \******************************************************************************/ +/***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "MAX_LENGTH_VALUE": () => (/* binding */ MAX_LENGTH_VALUE), +/* harmony export */ "StringMetric": () => (/* binding */ StringMetric), +/* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__) +/* harmony export */ }); +/* harmony import */ var _index_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../index.js */ 8284); +/* harmony import */ var _context_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../context.js */ 4658); +/* harmony import */ var _metric_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../metric.js */ 519); +/* harmony import */ var _utils_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../utils.js */ 6222); + + + + +const MAX_LENGTH_VALUE = 100; +class StringMetric extends _metric_js__WEBPACK_IMPORTED_MODULE_3__/* .Metric */ .j { + constructor(v) { + super(v); + } + validate(v) { + if (!(0,_utils_js__WEBPACK_IMPORTED_MODULE_2__/* .isString */ .HD)(v)) { + return false; + } + if (v.length > MAX_LENGTH_VALUE) { + return false; + } + return true; + } + payload() { + return this._inner; + } +} +class StringMetricType extends _index_js__WEBPACK_IMPORTED_MODULE_0__/* .MetricType */ .t { + constructor(meta) { + super("string", meta); + } + static async _private_setUndispatched(instance, value) { + if (!instance.shouldRecord(_context_js__WEBPACK_IMPORTED_MODULE_1__/* .Context.uploadEnabled */ ._.uploadEnabled)) { + return; + } + const truncatedValue = await (0,_utils_js__WEBPACK_IMPORTED_MODULE_2__/* .truncateStringAtBoundaryWithError */ .hY)(instance, value, MAX_LENGTH_VALUE); + const metric = new StringMetric(truncatedValue); + await _context_js__WEBPACK_IMPORTED_MODULE_1__/* .Context.metricsDatabase.record */ ._.metricsDatabase.record(instance, metric); + } + set(value) { + _context_js__WEBPACK_IMPORTED_MODULE_1__/* .Context.dispatcher.launch */ ._.dispatcher.launch(() => StringMetricType._private_setUndispatched(this, value)); + } + async testGetValue(ping = this.sendInPings[0]) { + let metric; + await _context_js__WEBPACK_IMPORTED_MODULE_1__/* .Context.dispatcher.testLaunch */ ._.dispatcher.testLaunch(async () => { + metric = await _context_js__WEBPACK_IMPORTED_MODULE_1__/* .Context.metricsDatabase.getMetric */ ._.metricsDatabase.getMetric(ping, this); + }); + return metric; + } +} +/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (StringMetricType); + + +/***/ }), + +/***/ 4498: +/*!********************************************************************************!*\ + !*** ./node_modules/@mozilla/glean/dist/webext/core/metrics/types/timespan.js ***! + \********************************************************************************/ +/***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "TimespanMetric": () => (/* binding */ TimespanMetric), +/* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__) +/* harmony export */ }); +/* harmony import */ var _time_unit_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../time_unit.js */ 9696); +/* harmony import */ var _index_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../index.js */ 8284); +/* harmony import */ var _utils_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../utils.js */ 6222); +/* harmony import */ var _metric_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../metric.js */ 519); +/* harmony import */ var _context_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../context.js */ 4658); +/* harmony import */ var _error_error_type_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../error/error_type.js */ 7864); + + + + + + +class TimespanMetric extends _metric_js__WEBPACK_IMPORTED_MODULE_5__/* .Metric */ .j { + constructor(v) { + super(v); + } + get timespan() { + switch (this._inner.timeUnit) { + case _time_unit_js__WEBPACK_IMPORTED_MODULE_0__/* .default.Nanosecond */ .Z.Nanosecond: + return this._inner.timespan * 10 ** 6; + case _time_unit_js__WEBPACK_IMPORTED_MODULE_0__/* .default.Microsecond */ .Z.Microsecond: + return this._inner.timespan * 10 ** 3; + case _time_unit_js__WEBPACK_IMPORTED_MODULE_0__/* .default.Millisecond */ .Z.Millisecond: + return this._inner.timespan; + case _time_unit_js__WEBPACK_IMPORTED_MODULE_0__/* .default.Second */ .Z.Second: + return Math.round(this._inner.timespan / 1000); + case _time_unit_js__WEBPACK_IMPORTED_MODULE_0__/* .default.Minute */ .Z.Minute: + return Math.round(this._inner.timespan / 1000 / 60); + case _time_unit_js__WEBPACK_IMPORTED_MODULE_0__/* .default.Hour */ .Z.Hour: + return Math.round(this._inner.timespan / 1000 / 60 / 60); + case _time_unit_js__WEBPACK_IMPORTED_MODULE_0__/* .default.Day */ .Z.Day: + return Math.round(this._inner.timespan / 1000 / 60 / 60 / 24); + } + } + validate(v) { + if (!(0,_utils_js__WEBPACK_IMPORTED_MODULE_2__/* .isObject */ .Kn)(v) || Object.keys(v).length !== 2) { + return false; + } + const timeUnitVerification = "timeUnit" in v && (0,_utils_js__WEBPACK_IMPORTED_MODULE_2__/* .isString */ .HD)(v.timeUnit) && Object.values(_time_unit_js__WEBPACK_IMPORTED_MODULE_0__/* .default */ .Z).includes(v.timeUnit); + const timespanVerification = "timespan" in v && (0,_utils_js__WEBPACK_IMPORTED_MODULE_2__/* .isNumber */ .hj)(v.timespan) && v.timespan >= 0; + if (!timeUnitVerification || !timespanVerification) { + return false; + } + return true; + } + payload() { + return { + time_unit: this._inner.timeUnit, + value: this.timespan + }; + } +} +class TimespanMetricType extends _index_js__WEBPACK_IMPORTED_MODULE_1__/* .MetricType */ .t { + constructor(meta, timeUnit) { + super("timespan", meta); + this.timeUnit = timeUnit; + } + static async _private_setRawUndispatched(instance, elapsed) { + if (!instance.shouldRecord(_context_js__WEBPACK_IMPORTED_MODULE_3__/* .Context.uploadEnabled */ ._.uploadEnabled)) { + return; + } + if (!(0,_utils_js__WEBPACK_IMPORTED_MODULE_2__/* .isUndefined */ .o8)(instance.startTime)) { + await _context_js__WEBPACK_IMPORTED_MODULE_3__/* .Context.errorManager.record */ ._.errorManager.record(instance, _error_error_type_js__WEBPACK_IMPORTED_MODULE_4__/* .ErrorType.InvalidState */ .N.InvalidState, "Timespan already running. Raw value not recorded."); + return; + } + let reportValueExists = false; + const transformFn = ((elapsed) => { + return (old) => { + let metric; + try { + metric = new TimespanMetric(old); + reportValueExists = true; + } + catch (_a) { + metric = new TimespanMetric({ + timespan: elapsed, + timeUnit: instance.timeUnit, + }); + } + return metric; + }; + })(elapsed); + await _context_js__WEBPACK_IMPORTED_MODULE_3__/* .Context.metricsDatabase.transform */ ._.metricsDatabase.transform(instance, transformFn); + if (reportValueExists) { + await _context_js__WEBPACK_IMPORTED_MODULE_3__/* .Context.errorManager.record */ ._.errorManager.record(instance, _error_error_type_js__WEBPACK_IMPORTED_MODULE_4__/* .ErrorType.InvalidState */ .N.InvalidState, "Timespan value already recorded. New value discarded."); + } + } + start() { + const startTime = (0,_utils_js__WEBPACK_IMPORTED_MODULE_2__/* .getMonotonicNow */ .ts)(); + _context_js__WEBPACK_IMPORTED_MODULE_3__/* .Context.dispatcher.launch */ ._.dispatcher.launch(async () => { + if (!this.shouldRecord(_context_js__WEBPACK_IMPORTED_MODULE_3__/* .Context.uploadEnabled */ ._.uploadEnabled)) { + return; + } + if (!(0,_utils_js__WEBPACK_IMPORTED_MODULE_2__/* .isUndefined */ .o8)(this.startTime)) { + await _context_js__WEBPACK_IMPORTED_MODULE_3__/* .Context.errorManager.record */ ._.errorManager.record(this, _error_error_type_js__WEBPACK_IMPORTED_MODULE_4__/* .ErrorType.InvalidState */ .N.InvalidState, "Timespan already started"); + return; + } + this.startTime = startTime; + return Promise.resolve(); + }); + } + stop() { + const stopTime = (0,_utils_js__WEBPACK_IMPORTED_MODULE_2__/* .getMonotonicNow */ .ts)(); + _context_js__WEBPACK_IMPORTED_MODULE_3__/* .Context.dispatcher.launch */ ._.dispatcher.launch(async () => { + if (!this.shouldRecord(_context_js__WEBPACK_IMPORTED_MODULE_3__/* .Context.uploadEnabled */ ._.uploadEnabled)) { + this.startTime = undefined; + return; + } + if ((0,_utils_js__WEBPACK_IMPORTED_MODULE_2__/* .isUndefined */ .o8)(this.startTime)) { + await _context_js__WEBPACK_IMPORTED_MODULE_3__/* .Context.errorManager.record */ ._.errorManager.record(this, _error_error_type_js__WEBPACK_IMPORTED_MODULE_4__/* .ErrorType.InvalidState */ .N.InvalidState, "Timespan not running"); + return; + } + const elapsed = stopTime - this.startTime; + this.startTime = undefined; + if (elapsed < 0) { + await _context_js__WEBPACK_IMPORTED_MODULE_3__/* .Context.errorManager.record */ ._.errorManager.record(this, _error_error_type_js__WEBPACK_IMPORTED_MODULE_4__/* .ErrorType.InvalidState */ .N.InvalidState, "Timespan was negative."); + return; + } + await TimespanMetricType._private_setRawUndispatched(this, elapsed); + }); + } + cancel() { + _context_js__WEBPACK_IMPORTED_MODULE_3__/* .Context.dispatcher.launch */ ._.dispatcher.launch(() => { + this.startTime = undefined; + return Promise.resolve(); + }); + } + setRawNanos(elapsed) { + _context_js__WEBPACK_IMPORTED_MODULE_3__/* .Context.dispatcher.launch */ ._.dispatcher.launch(async () => { + const elapsedMillis = elapsed * 10 ** (-6); + await TimespanMetricType._private_setRawUndispatched(this, elapsedMillis); + }); + } + async testGetValue(ping = this.sendInPings[0]) { + let value; + await _context_js__WEBPACK_IMPORTED_MODULE_3__/* .Context.dispatcher.testLaunch */ ._.dispatcher.testLaunch(async () => { + value = await _context_js__WEBPACK_IMPORTED_MODULE_3__/* .Context.metricsDatabase.getMetric */ ._.metricsDatabase.getMetric(ping, this); + }); + if (value) { + return (new TimespanMetric(value)).timespan; + } + } +} +/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (TimespanMetricType); + + +/***/ }), + +/***/ 2455: +/*!*************************************************************************************!*\ + !*** ./node_modules/@mozilla/glean/dist/webext/core/pings/ping_type.js + 1 modules ***! + \*************************************************************************************/ +/***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => { + +"use strict"; +// ESM COMPAT FLAG +__webpack_require__.r(__webpack_exports__); + +// EXPORTS +__webpack_require__.d(__webpack_exports__, { + "default": () => (/* binding */ ping_type) +}); + +// EXTERNAL MODULE: ./node_modules/@mozilla/glean/dist/webext/core/constants.js +var constants = __webpack_require__(6789); +// EXTERNAL MODULE: ./node_modules/@mozilla/glean/dist/webext/core/utils.js + 5 modules +var utils = __webpack_require__(6222); +// EXTERNAL MODULE: ./node_modules/@mozilla/glean/dist/webext/core/metrics/types/counter.js +var counter = __webpack_require__(4429); +// EXTERNAL MODULE: ./node_modules/@mozilla/glean/dist/webext/core/metrics/types/datetime.js +var datetime = __webpack_require__(9303); +// EXTERNAL MODULE: ./node_modules/@mozilla/glean/dist/webext/core/metrics/time_unit.js +var time_unit = __webpack_require__(9696); +// EXTERNAL MODULE: ./node_modules/@mozilla/glean/dist/webext/core/events/index.js +var events = __webpack_require__(4815); +// EXTERNAL MODULE: ./node_modules/@mozilla/glean/dist/webext/core/context.js + 1 modules +var context = __webpack_require__(4658); +;// CONCATENATED MODULE: ./node_modules/@mozilla/glean/dist/webext/core/pings/maker.js + + + + + + +const GLEAN_START_TIME = new Date(); +async function getSequenceNumber(metricsDatabase, ping) { + const seq = new counter.default({ + category: "", + name: `${ping.name}#sequence`, + sendInPings: [constants/* PING_INFO_STORAGE */.ni], + lifetime: "user", + disabled: false + }); + const currentSeqData = await metricsDatabase.getMetric(constants/* PING_INFO_STORAGE */.ni, seq); + await counter.default._private_addUndispatched(seq, 1); + if (currentSeqData) { + try { + const metric = new counter.CounterMetric(currentSeqData); + return metric.payload(); + } + catch (e) { + console.warn(`Unexpected value found for sequence number in ping ${ping.name}. Ignoring.`); + } + } + return 0; +} +async function getStartEndTimes(metricsDatabase, ping) { + const start = new datetime/* default */.ZP({ + category: "", + name: `${ping.name}#start`, + sendInPings: [constants/* PING_INFO_STORAGE */.ni], + lifetime: "user", + disabled: false + }, time_unit/* default.Minute */.Z.Minute); + const startTimeData = await metricsDatabase.getMetric(constants/* PING_INFO_STORAGE */.ni, start); + let startTime; + if (startTimeData) { + startTime = new datetime/* DatetimeMetric */.ui(startTimeData); + } + else { + startTime = datetime/* DatetimeMetric.fromDate */.ui.fromDate(GLEAN_START_TIME, time_unit/* default.Minute */.Z.Minute); + } + const endTimeData = new Date(); + await datetime/* default._private_setUndispatched */.ZP._private_setUndispatched(start, endTimeData); + const endTime = datetime/* DatetimeMetric.fromDate */.ui.fromDate(endTimeData, time_unit/* default.Minute */.Z.Minute); + return { + startTime: startTime.payload(), + endTime: endTime.payload() + }; +} +async function buildPingInfoSection(metricsDatabase, ping, reason) { + const seq = await getSequenceNumber(metricsDatabase, ping); + const { startTime, endTime } = await getStartEndTimes(metricsDatabase, ping); + const pingInfo = { + seq, + start_time: startTime, + end_time: endTime + }; + if (reason) { + pingInfo.reason = reason; + } + return pingInfo; +} +async function buildClientInfoSection(metricsDatabase, ping) { + let clientInfo = await metricsDatabase.getPingMetrics(constants/* CLIENT_INFO_STORAGE */.xW, true); + if (!clientInfo) { + console.warn("Empty client info data. Will submit anyways."); + clientInfo = {}; + } + let finalClientInfo = { + "telemetry_sdk_build": constants/* GLEAN_VERSION */.Q9 + }; + for (const metricType in clientInfo) { + finalClientInfo = { ...finalClientInfo, ...clientInfo[metricType] }; + } + if (!ping.includeClientId) { + delete finalClientInfo["client_id"]; + } + return finalClientInfo; +} +function getPingHeaders(debugOptions) { + const headers = {}; + if (debugOptions === null || debugOptions === void 0 ? void 0 : debugOptions.debugViewTag) { + headers["X-Debug-ID"] = debugOptions.debugViewTag; + } + if (debugOptions === null || debugOptions === void 0 ? void 0 : debugOptions.sourceTags) { + headers["X-Source-Tags"] = debugOptions.sourceTags.toString(); + } + if (Object.keys(headers).length > 0) { + return headers; + } +} +async function collectPing(metricsDatabase, eventsDatabase, ping, reason) { + const metricsData = await metricsDatabase.getPingMetrics(ping.name, true); + const eventsData = await eventsDatabase.getPingEvents(ping.name, true); + if (!metricsData && !eventsData) { + if (!ping.sendIfEmpty) { + console.info(`Storage for ${ping.name} empty. Bailing out.`); + return; + } + console.info(`Storage for ${ping.name} empty. Ping will still be sent.`); + } + const metrics = metricsData ? { metrics: metricsData } : {}; + const events = eventsData ? { events: eventsData } : {}; + const pingInfo = await buildPingInfoSection(metricsDatabase, ping, reason); + const clientInfo = await buildClientInfoSection(metricsDatabase, ping); + return { + ...metrics, + ...events, + ping_info: pingInfo, + client_info: clientInfo, + }; +} +function makePath(applicationId, identifier, ping) { + return `/submit/${applicationId}/${ping.name}/${constants/* GLEAN_SCHEMA_VERSION */.Oo}/${identifier}`; +} +async function collectAndStorePing(identifier, ping, reason) { + const collectedPayload = await collectPing(context/* Context.metricsDatabase */._.metricsDatabase, context/* Context.eventsDatabase */._.eventsDatabase, ping, reason); + if (!collectedPayload) { + return; + } + let modifiedPayload; + try { + modifiedPayload = await events/* default.afterPingCollection.trigger */.Z.afterPingCollection.trigger(collectedPayload); + } + catch (e) { + console.error(`Error while attempting to modify ping payload for the "${ping.name}" ping using`, `the ${JSON.stringify(events/* default.afterPingCollection.registeredPluginIdentifier */.Z.afterPingCollection.registeredPluginIdentifier)} plugin.`, "Ping will not be submitted. See more logs below.\n\n", e); + return; + } + if (context/* Context.debugOptions.logPings */._.debugOptions.logPings) { + console.info(JSON.stringify(collectedPayload, null, 2)); + } + const finalPayload = modifiedPayload ? modifiedPayload : collectedPayload; + const headers = getPingHeaders(context/* Context.debugOptions */._.debugOptions); + return context/* Context.pingsDatabase.recordPing */._.pingsDatabase.recordPing(makePath(context/* Context.applicationId */._.applicationId, identifier, ping), identifier, finalPayload, headers); +} +/* harmony default export */ const maker = (collectAndStorePing); + +;// CONCATENATED MODULE: ./node_modules/@mozilla/glean/dist/webext/core/pings/ping_type.js + + + + +class PingType { + constructor(meta) { + var _a; + this.name = meta.name; + this.includeClientId = meta.includeClientId; + this.sendIfEmpty = meta.sendIfEmpty; + this.reasonCodes = (_a = meta.reasonCodes) !== null && _a !== void 0 ? _a : []; + } + isDeletionRequest() { + return this.name === constants/* DELETION_REQUEST_PING_NAME */.Ui; + } + submit(reason) { + if (this.testCallback) { + this.testCallback(reason) + .then(() => { + PingType._private_internalSubmit(this, reason, this.resolveTestPromiseFunction); + }) + .catch(e => { + console.error(`There was an error validating "${this.name}" (${reason !== null && reason !== void 0 ? reason : "no reason"}):`, e); + PingType._private_internalSubmit(this, reason, this.rejectTestPromiseFunction); + }); + } + else { + PingType._private_internalSubmit(this, reason); + } + } + static _private_internalSubmit(instance, reason, testResolver) { + context/* Context.dispatcher.launch */._.dispatcher.launch(async () => { + if (!context/* Context.initialized */._.initialized) { + console.info("Glean must be initialized before submitting pings."); + return; + } + if (!context/* Context.uploadEnabled */._.uploadEnabled && !instance.isDeletionRequest()) { + console.info("Glean disabled: not submitting pings. Glean may still submit the deletion-request ping."); + return; + } + let correctedReason = reason; + if (reason && !instance.reasonCodes.includes(reason)) { + console.error(`Invalid reason code ${reason} from ${this.name}. Ignoring.`); + correctedReason = undefined; + } + const identifier = (0,utils/* generateUUIDv4 */.Ln)(); + await maker(identifier, instance, correctedReason); + if (testResolver) { + testResolver(); + instance.resolveTestPromiseFunction = undefined; + instance.rejectTestPromiseFunction = undefined; + instance.testCallback = undefined; + } + }); + } + async testBeforeNextSubmit(callbackFn) { + if (this.testCallback) { + console.error(`There is an existing test call for ping "${this.name}". Ignoring.`); + return; + } + return new Promise((resolve, reject) => { + this.resolveTestPromiseFunction = resolve; + this.rejectTestPromiseFunction = reject; + this.testCallback = callbackFn; + }); + } +} +/* harmony default export */ const ping_type = (PingType); + + +/***/ }), + +/***/ 6222: +/*!***************************************************************************!*\ + !*** ./node_modules/@mozilla/glean/dist/webext/core/utils.js + 5 modules ***! + \***************************************************************************/ +/***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => { + +"use strict"; + +// EXPORTS +__webpack_require__.d(__webpack_exports__, { + "Ln": () => (/* binding */ generateUUIDv4), + "ts": () => (/* binding */ getMonotonicNow), + "jn": () => (/* binding */ isBoolean), + "U": () => (/* binding */ isInteger), + "qT": () => (/* binding */ isJSONValue), + "hj": () => (/* binding */ isNumber), + "Kn": () => (/* binding */ isObject), + "HD": () => (/* binding */ isString), + "o8": () => (/* binding */ isUndefined), + "hL": () => (/* binding */ sanitizeApplicationId), + "hY": () => (/* binding */ truncateStringAtBoundaryWithError), + "AK": () => (/* binding */ validateHeader), + "r4": () => (/* binding */ validateURL) +}); + +;// CONCATENATED MODULE: ./node_modules/@mozilla/glean/node_modules/uuid/dist/esm-browser/rng.js +// Unique ID creation requires a high quality random # generator. In the browser we therefore +// require the crypto API and do not support built-in fallback to lower quality random number +// generators (like Math.random()). +var getRandomValues; +var rnds8 = new Uint8Array(16); +function rng() { + // lazy load so that environments that need to polyfill have a chance to do so + if (!getRandomValues) { + // getRandomValues needs to be invoked in a context where "this" is a Crypto implementation. Also, + // find the complete implementation of crypto (msCrypto) on IE11. + getRandomValues = typeof crypto !== 'undefined' && crypto.getRandomValues && crypto.getRandomValues.bind(crypto) || typeof msCrypto !== 'undefined' && typeof msCrypto.getRandomValues === 'function' && msCrypto.getRandomValues.bind(msCrypto); + + if (!getRandomValues) { + throw new Error('crypto.getRandomValues() not supported. See https://github.com/uuidjs/uuid#getrandomvalues-not-supported'); + } + } + + return getRandomValues(rnds8); +} +;// CONCATENATED MODULE: ./node_modules/@mozilla/glean/node_modules/uuid/dist/esm-browser/regex.js +/* harmony default export */ const regex = (/^(?:[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}|00000000-0000-0000-0000-000000000000)$/i); +;// CONCATENATED MODULE: ./node_modules/@mozilla/glean/node_modules/uuid/dist/esm-browser/validate.js + + +function validate(uuid) { + return typeof uuid === 'string' && regex.test(uuid); +} + +/* harmony default export */ const esm_browser_validate = (validate); +;// CONCATENATED MODULE: ./node_modules/@mozilla/glean/node_modules/uuid/dist/esm-browser/stringify.js + +/** + * Convert array of 16 byte values to UUID string format of the form: + * XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX + */ + +var byteToHex = []; + +for (var i = 0; i < 256; ++i) { + byteToHex.push((i + 0x100).toString(16).substr(1)); +} + +function stringify(arr) { + var offset = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0; + // Note: Be careful editing this code! It's been tuned for performance + // and works in ways you may not expect. See https://github.com/uuidjs/uuid/pull/434 + var uuid = (byteToHex[arr[offset + 0]] + byteToHex[arr[offset + 1]] + byteToHex[arr[offset + 2]] + byteToHex[arr[offset + 3]] + '-' + byteToHex[arr[offset + 4]] + byteToHex[arr[offset + 5]] + '-' + byteToHex[arr[offset + 6]] + byteToHex[arr[offset + 7]] + '-' + byteToHex[arr[offset + 8]] + byteToHex[arr[offset + 9]] + '-' + byteToHex[arr[offset + 10]] + byteToHex[arr[offset + 11]] + byteToHex[arr[offset + 12]] + byteToHex[arr[offset + 13]] + byteToHex[arr[offset + 14]] + byteToHex[arr[offset + 15]]).toLowerCase(); // Consistency check for valid UUID. If this throws, it's likely due to one + // of the following: + // - One or more input array values don't map to a hex octet (leading to + // "undefined" in the uuid) + // - Invalid input values for the RFC `version` or `variant` fields + + if (!esm_browser_validate(uuid)) { + throw TypeError('Stringified UUID is invalid'); + } + + return uuid; +} + +/* harmony default export */ const esm_browser_stringify = (stringify); +;// CONCATENATED MODULE: ./node_modules/@mozilla/glean/node_modules/uuid/dist/esm-browser/v4.js + + + +function v4(options, buf, offset) { + options = options || {}; + var rnds = options.random || (options.rng || rng)(); // Per 4.4, set bits for version and `clock_seq_hi_and_reserved` + + rnds[6] = rnds[6] & 0x0f | 0x40; + rnds[8] = rnds[8] & 0x3f | 0x80; // Copy bytes to buffer, if provided + + if (buf) { + offset = offset || 0; + + for (var i = 0; i < 16; ++i) { + buf[offset + i] = rnds[i]; + } + + return buf; + } + + return esm_browser_stringify(rnds); +} + +/* harmony default export */ const esm_browser_v4 = (v4); +// EXTERNAL MODULE: ./node_modules/@mozilla/glean/dist/webext/core/context.js + 1 modules +var context = __webpack_require__(4658); +// EXTERNAL MODULE: ./node_modules/@mozilla/glean/dist/webext/core/error/error_type.js +var error_type = __webpack_require__(7864); +;// CONCATENATED MODULE: ./node_modules/@mozilla/glean/dist/webext/core/utils.js + + + +function isJSONValue(v) { + if (isString(v) || isBoolean(v) || isNumber(v)) { + return true; + } + if (isObject(v)) { + if (Object.keys(v).length === 0) { + return true; + } + for (const key in v) { + return isJSONValue(v[key]); + } + } + if (Array.isArray(v)) { + return v.every((e) => isJSONValue(e)); + } + return false; +} +function isObject(v) { + return (typeof v === "object" && v !== null && v.constructor === Object); +} +function isUndefined(v) { + return typeof v === "undefined"; +} +function isString(v) { + return typeof v === "string"; +} +function isBoolean(v) { + return typeof v === "boolean"; +} +function isNumber(v) { + return typeof v === "number" && !isNaN(v); +} +function isInteger(v) { + return isNumber(v) && Number.isInteger(v); +} +function sanitizeApplicationId(applicationId) { + return applicationId.replace(/[^a-z0-9]+/gi, "-").toLowerCase(); +} +function validateURL(v) { + const urlPattern = /^(http|https):\/\/[a-zA-Z0-9._-]+(:\d+){0,1}(\/{0,1})$/i; + return urlPattern.test(v); +} +function validateHeader(v) { + return /^[a-z0-9-]{1,20}$/i.test(v); +} +function generateUUIDv4() { + if (typeof crypto !== "undefined") { + return esm_browser_v4(); + } + else { + return "xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g, function (c) { + const r = Math.random() * 16 | 0, v = c == "x" ? r : (r & 0x3 | 0x8); + return v.toString(16); + }); + } +} +function getMonotonicNow() { + return typeof performance === "undefined" ? Date.now() : performance.now(); +} +async function truncateStringAtBoundaryWithError(metric, value, length) { + const truncated = value.substr(0, length); + if (truncated !== value) { + await context/* Context.errorManager.record */._.errorManager.record(metric, error_type/* ErrorType.InvalidOverflow */.N.InvalidOverflow, `Value length ${value.length} exceeds maximum of ${length}.`); + } + return truncated; +} + + +/***/ }), + +/***/ 6902: +/*!******************************************************************************!*\ + !*** ./node_modules/@mozilla/glean/dist/webext/index/webext.js + 20 modules ***! + \******************************************************************************/ +/***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => { + +"use strict"; +// ESM COMPAT FLAG +__webpack_require__.r(__webpack_exports__); + +// EXPORTS +__webpack_require__.d(__webpack_exports__, { + "default": () => (/* binding */ index_webext) +}); + +// EXTERNAL MODULE: ./node_modules/@mozilla/glean/dist/webext/core/constants.js +var constants = __webpack_require__(6789); +// EXTERNAL MODULE: ./node_modules/@mozilla/glean/dist/webext/core/utils.js + 5 modules +var utils = __webpack_require__(6222); +;// CONCATENATED MODULE: ./node_modules/@mozilla/glean/dist/webext/core/config.js + + +class Configuration { + constructor(config) { + this.appBuild = config === null || config === void 0 ? void 0 : config.appBuild; + this.appDisplayVersion = config === null || config === void 0 ? void 0 : config.appDisplayVersion; + this.debug = Configuration.sanitizeDebugOptions(config === null || config === void 0 ? void 0 : config.debug); + if ((config === null || config === void 0 ? void 0 : config.serverEndpoint) && !(0,utils/* validateURL */.r4)(config.serverEndpoint)) { + throw new Error(`Unable to initialize Glean, serverEndpoint ${config.serverEndpoint} is an invalid URL.`); + } + this.serverEndpoint = (config && config.serverEndpoint) + ? config.serverEndpoint : constants/* DEFAULT_TELEMETRY_ENDPOINT */.ey; + this.httpClient = config === null || config === void 0 ? void 0 : config.httpClient; + } + static sanitizeDebugOptions(debug) { + const correctedDebugOptions = debug || {}; + if ((debug === null || debug === void 0 ? void 0 : debug.debugViewTag) !== undefined && !Configuration.validateDebugViewTag(debug === null || debug === void 0 ? void 0 : debug.debugViewTag)) { + delete correctedDebugOptions["debugViewTag"]; + } + if ((debug === null || debug === void 0 ? void 0 : debug.sourceTags) !== undefined && !Configuration.validateSourceTags(debug === null || debug === void 0 ? void 0 : debug.sourceTags)) { + delete correctedDebugOptions["sourceTags"]; + } + return correctedDebugOptions; + } + static validateDebugViewTag(tag) { + const validation = (0,utils/* validateHeader */.AK)(tag); + if (!validation) { + console.error(`"${tag}" is not a valid \`debugViewTag\` value.`, "Please make sure the value passed satisfies the regex `^[a-zA-Z0-9-]{1,20}$`."); + } + return validation; + } + static validateSourceTags(tags) { + if (tags.length < 1 || tags.length > constants/* GLEAN_MAX_SOURCE_TAGS */.og) { + console.error(`A list of tags cannot contain more than ${constants/* GLEAN_MAX_SOURCE_TAGS */.og} elements.`); + return false; + } + for (const tag of tags) { + if (tag.startsWith("glean")) { + console.error("Tags starting with `glean` are reserved and must not be used."); + return false; + } + if (!(0,utils/* validateHeader */.AK)(tag)) { + return false; + } + } + return true; + } +} + +// EXTERNAL MODULE: ./node_modules/@mozilla/glean/dist/webext/core/metrics/types/labeled.js +var labeled = __webpack_require__(3119); +// EXTERNAL MODULE: ./node_modules/@mozilla/glean/dist/webext/core/metrics/index.js +var metrics = __webpack_require__(8284); +// EXTERNAL MODULE: ./node_modules/@mozilla/glean/dist/webext/core/context.js + 1 modules +var context = __webpack_require__(4658); +// EXTERNAL MODULE: ./node_modules/@mozilla/glean/dist/webext/core/metrics/metric.js +var metric = __webpack_require__(519); +;// CONCATENATED MODULE: ./node_modules/@mozilla/glean/dist/webext/core/metrics/types/boolean.js + + + + +class BooleanMetric extends metric/* Metric */.j { + constructor(v) { + super(v); + } + validate(v) { + return (0,utils/* isBoolean */.jn)(v); + } + payload() { + return this._inner; + } +} +class BooleanMetricType extends (/* unused pure expression or super */ null && (MetricType)) { + constructor(meta) { + super("boolean", meta); + } + set(value) { + Context.dispatcher.launch(async () => { + if (!this.shouldRecord(Context.uploadEnabled)) { + return; + } + const metric = new BooleanMetric(value); + await Context.metricsDatabase.record(this, metric); + }); + } + async testGetValue(ping = this.sendInPings[0]) { + let metric; + await Context.dispatcher.testLaunch(async () => { + metric = await Context.metricsDatabase.getMetric(ping, this); + }); + return metric; + } +} +/* harmony default export */ const types_boolean = ((/* unused pure expression or super */ null && (BooleanMetricType))); + +// EXTERNAL MODULE: ./node_modules/@mozilla/glean/dist/webext/core/metrics/types/counter.js +var counter = __webpack_require__(4429); +// EXTERNAL MODULE: ./node_modules/@mozilla/glean/dist/webext/core/metrics/types/datetime.js +var datetime = __webpack_require__(9303); +// EXTERNAL MODULE: ./node_modules/@mozilla/glean/dist/webext/core/metrics/types/quantity.js +var quantity = __webpack_require__(6120); +// EXTERNAL MODULE: ./node_modules/@mozilla/glean/dist/webext/core/metrics/types/string.js +var string = __webpack_require__(5799); +// EXTERNAL MODULE: ./node_modules/@mozilla/glean/dist/webext/core/metrics/types/timespan.js +var timespan = __webpack_require__(4498); +// EXTERNAL MODULE: ./node_modules/@mozilla/glean/dist/webext/core/error/error_type.js +var error_type = __webpack_require__(7864); +;// CONCATENATED MODULE: ./node_modules/@mozilla/glean/dist/webext/core/metrics/types/uuid.js + + + + + +const UUID_REGEX = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i; +class UUIDMetric extends metric/* Metric */.j { + constructor(v) { + super(v); + } + validate(v) { + if (!(0,utils/* isString */.HD)(v)) { + return false; + } + return UUID_REGEX.test(v); + } + payload() { + return this._inner; + } +} +class UUIDMetricType extends metrics/* MetricType */.t { + constructor(meta) { + super("uuid", meta); + } + static async _private_setUndispatched(instance, value) { + if (!instance.shouldRecord(context/* Context.uploadEnabled */._.uploadEnabled)) { + return; + } + if (!value) { + value = (0,utils/* generateUUIDv4 */.Ln)(); + } + let metric; + try { + metric = new UUIDMetric(value); + } + catch (_a) { + await context/* Context.errorManager.record */._.errorManager.record(instance, error_type/* ErrorType.InvalidValue */.N.InvalidValue, `"${value}" is not a valid UUID.`); + return; + } + await context/* Context.metricsDatabase.record */._.metricsDatabase.record(instance, metric); + } + set(value) { + context/* Context.dispatcher.launch */._.dispatcher.launch(() => UUIDMetricType._private_setUndispatched(this, value)); + } + generateAndSet() { + if (!this.shouldRecord(context/* Context.uploadEnabled */._.uploadEnabled)) { + return; + } + const value = (0,utils/* generateUUIDv4 */.Ln)(); + this.set(value); + return value; + } + async testGetValue(ping = this.sendInPings[0]) { + let metric; + await context/* Context.dispatcher.testLaunch */._.dispatcher.testLaunch(async () => { + metric = await context/* Context.metricsDatabase.getMetric */._.metricsDatabase.getMetric(ping, this); + }); + return metric; + } +} +/* harmony default export */ const uuid = (UUIDMetricType); + +;// CONCATENATED MODULE: ./node_modules/@mozilla/glean/dist/webext/core/metrics/utils.js + + + + + + + + +const METRIC_MAP = Object.freeze({ + "boolean": BooleanMetric, + "counter": counter.CounterMetric, + "datetime": datetime/* DatetimeMetric */.ui, + "labeled_boolean": labeled/* LabeledMetric */.Dc, + "labeled_counter": labeled/* LabeledMetric */.Dc, + "labeled_string": labeled/* LabeledMetric */.Dc, + "quantity": quantity.QuantityMetric, + "string": string.StringMetric, + "timespan": timespan.TimespanMetric, + "uuid": UUIDMetric, +}); +function createMetric(type, v) { + if (!(type in METRIC_MAP)) { + throw new Error(`Unable to create metric of unknown type ${type}`); + } + return new METRIC_MAP[type](v); +} +function validateMetricInternalRepresentation(type, v) { + try { + createMetric(type, v); + return true; + } + catch (_a) { + return false; + } +} + +;// CONCATENATED MODULE: ./node_modules/@mozilla/glean/dist/webext/core/metrics/database.js + + +function isValidInternalMetricsRepresentation(v) { + if ((0,utils/* isObject */.Kn)(v)) { + for (const metricType in v) { + const metrics = v[metricType]; + if ((0,utils/* isObject */.Kn)(metrics)) { + for (const metricIdentifier in metrics) { + if (!validateMetricInternalRepresentation(metricType, metrics[metricIdentifier])) { + return false; + } + } + } + else { + return false; + } + } + return true; + } + else { + return false; + } +} +function createMetricsPayload(v) { + const result = {}; + for (const metricType in v) { + const metrics = v[metricType]; + result[metricType] = {}; + for (const metricIdentifier in metrics) { + const metric = createMetric(metricType, metrics[metricIdentifier]); + result[metricType][metricIdentifier] = metric.payload(); + } + } + return result; +} +class MetricsDatabase { + constructor(storage) { + this.userStore = new storage("userLifetimeMetrics"); + this.pingStore = new storage("pingLifetimeMetrics"); + this.appStore = new storage("appLifetimeMetrics"); + } + _chooseStore(lifetime) { + switch (lifetime) { + case "user": + return this.userStore; + case "ping": + return this.pingStore; + case "application": + return this.appStore; + } + } + async record(metric, value) { + await this.transform(metric, () => value); + } + async transform(metric, transformFn) { + if (metric.disabled) { + return; + } + const store = this._chooseStore(metric.lifetime); + const storageKey = await metric.identifier(this); + for (const ping of metric.sendInPings) { + const finalTransformFn = (v) => transformFn(v).get(); + await store.update([ping, metric.type, storageKey], finalTransformFn); + } + } + async hasMetric(lifetime, ping, metricType, metricIdentifier) { + const store = this._chooseStore(lifetime); + const value = await store.get([ping, metricType, metricIdentifier]); + return !(0,utils/* isUndefined */.o8)(value); + } + async countByBaseIdentifier(lifetime, ping, metricType, metricIdentifier) { + const store = this._chooseStore(lifetime); + const pingStorage = await store.get([ping, metricType]); + if ((0,utils/* isUndefined */.o8)(pingStorage)) { + return 0; + } + return Object.keys(pingStorage).filter(n => n.startsWith(metricIdentifier)).length; + } + async getMetric(ping, metric) { + const store = this._chooseStore(metric.lifetime); + const storageKey = await metric.identifier(this); + const value = await store.get([ping, metric.type, storageKey]); + if (!(0,utils/* isUndefined */.o8)(value) && !validateMetricInternalRepresentation(metric.type, value)) { + console.error(`Unexpected value found for metric ${storageKey}: ${JSON.stringify(value)}. Clearing.`); + await store.delete([ping, metric.type, storageKey]); + return; + } + else { + return value; + } + } + async getAndValidatePingData(ping, lifetime) { + const store = this._chooseStore(lifetime); + const data = await store.get([ping]); + if ((0,utils/* isUndefined */.o8)(data)) { + return {}; + } + if (!isValidInternalMetricsRepresentation(data)) { + console.error(`Unexpected value found for ping ${ping} in ${lifetime} store: ${JSON.stringify(data)}. Clearing.`); + await store.delete([ping]); + return {}; + } + return data; + } + processLabeledMetric(snapshot, metricType, metricId, metricData) { + const newType = `labeled_${metricType}`; + const idLabelSplit = metricId.split("/", 2); + const newId = idLabelSplit[0]; + const label = idLabelSplit[1]; + if (newType in snapshot && newId in snapshot[newType]) { + const existingData = snapshot[newType][newId]; + snapshot[newType][newId] = { + ...existingData, + [label]: metricData + }; + } + else { + snapshot[newType] = { + ...snapshot[newType], + [newId]: { + [label]: metricData + } + }; + } + } + async getPingMetrics(ping, clearPingLifetimeData) { + const userData = await this.getAndValidatePingData(ping, "user"); + const pingData = await this.getAndValidatePingData(ping, "ping"); + const appData = await this.getAndValidatePingData(ping, "application"); + if (clearPingLifetimeData) { + await this.clear("ping", ping); + } + const response = {}; + for (const data of [userData, pingData, appData]) { + for (const metricType in data) { + for (const metricId in data[metricType]) { + if (metricId.includes("/")) { + this.processLabeledMetric(response, metricType, metricId, data[metricType][metricId]); + } + else { + response[metricType] = { + ...response[metricType], + [metricId]: data[metricType][metricId] + }; + } + } + } + } + if (Object.keys(response).length === 0) { + return; + } + else { + return createMetricsPayload(response); + } + } + async clear(lifetime, ping) { + const store = this._chooseStore(lifetime); + const storageIndex = ping ? [ping] : []; + await store.delete(storageIndex); + } + async clearAll() { + await this.userStore.delete([]); + await this.pingStore.delete([]); + await this.appStore.delete([]); + } +} +/* harmony default export */ const database = (MetricsDatabase); + +;// CONCATENATED MODULE: ./node_modules/@mozilla/glean/dist/webext/core/pings/database.js + +function isValidPingInternalRepresentation(v) { + if ((0,utils/* isObject */.Kn)(v) && (Object.keys(v).length === 2 || Object.keys(v).length === 3)) { + const hasValidPath = "path" in v && (0,utils/* isString */.HD)(v.path); + const hasValidPayload = "payload" in v && (0,utils/* isJSONValue */.qT)(v.payload) && (0,utils/* isObject */.Kn)(v.payload); + const hasValidHeaders = (!("headers" in v)) || ((0,utils/* isJSONValue */.qT)(v.headers) && (0,utils/* isObject */.Kn)(v.headers)); + if (!hasValidPath || !hasValidPayload || !hasValidHeaders) { + return false; + } + return true; + } + return false; +} +class PingsDatabase { + constructor(store) { + this.store = new store("pings"); + } + attachObserver(observer) { + this.observer = observer; + } + async recordPing(path, identifier, payload, headers) { + const ping = { + path, + payload + }; + if (headers) { + ping.headers = headers; + } + await this.store.update([identifier], () => ping); + this.observer && this.observer.update(identifier, ping); + } + async deletePing(identifier) { + await this.store.delete([identifier]); + } + async getAllPings() { + const allStoredPings = await this.store._getWholeStore(); + const finalPings = {}; + for (const identifier in allStoredPings) { + const ping = allStoredPings[identifier]; + if (isValidPingInternalRepresentation(ping)) { + finalPings[identifier] = ping; + } + else { + console.warn("Unexpected data found in pings database. Deleting."); + await this.store.delete([identifier]); + } + } + return finalPings; + } + async scanPendingPings() { + if (!this.observer) { + return; + } + const pings = await this.getAllPings(); + for (const identifier in pings) { + this.observer.update(identifier, pings[identifier]); + } + } + async clearAll() { + await this.store.delete([]); + } +} +/* harmony default export */ const pings_database = (PingsDatabase); + +;// CONCATENATED MODULE: ./node_modules/@mozilla/glean/dist/webext/core/upload/index.js + +var PingUploaderStatus; +(function (PingUploaderStatus) { + PingUploaderStatus[PingUploaderStatus["Idle"] = 0] = "Idle"; + PingUploaderStatus[PingUploaderStatus["Uploading"] = 1] = "Uploading"; + PingUploaderStatus[PingUploaderStatus["Cancelling"] = 2] = "Cancelling"; +})(PingUploaderStatus || (PingUploaderStatus = {})); +class PingUploader { + constructor(config, platform, pingsDatabase) { + this.initialized = false; + this.queue = []; + this.status = 0; + this.uploader = config.httpClient ? config.httpClient : platform.uploader; + this.platformInfo = platform.info; + this.serverEndpoint = config.serverEndpoint; + this.pingsDatabase = pingsDatabase; + } + setInitialized(state) { + this.initialized = state !== null && state !== void 0 ? state : true; + } + enqueuePing(ping) { + let isDuplicate = false; + for (const queuedPing of this.queue) { + if (queuedPing.identifier === ping.identifier) { + isDuplicate = true; + } + } + !isDuplicate && this.queue.push(ping); + } + getNextPing() { + return this.queue.shift(); + } + async preparePingForUpload(ping) { + const stringifiedBody = JSON.stringify(ping.payload); + let headers = ping.headers || {}; + headers = { + ...ping.headers, + "Content-Type": "application/json; charset=utf-8", + "Content-Length": stringifiedBody.length.toString(), + "Date": (new Date()).toISOString(), + "X-Client-Type": "Glean.js", + "X-Client-Version": constants/* GLEAN_VERSION */.Q9, + "X-Telemetry-Agent": `Glean/${constants/* GLEAN_VERSION */.Q9} (JS on ${await this.platformInfo.os()})` + }; + return { + headers, + payload: stringifiedBody + }; + } + async attemptPingUpload(ping) { + if (!this.initialized) { + console.warn("Attempted to upload a ping, but Glean is not initialized yet. Ignoring."); + return { result: 0 }; + } + const finalPing = await this.preparePingForUpload(ping); + const result = await this.uploader.post(`${this.serverEndpoint}${ping.path}`, finalPing.payload, finalPing.headers); + return result; + } + async processPingUploadResponse(identifier, response) { + const { status, result } = response; + if (status && status >= 200 && status < 300) { + console.info(`Ping ${identifier} succesfully sent ${status}.`); + await this.pingsDatabase.deletePing(identifier); + return false; + } + if (result === 1 || (status && status >= 400 && status < 500)) { + console.warn(`Unrecoverable upload failure while attempting to send ping ${identifier}. Error was ${status !== null && status !== void 0 ? status : "no status"}.`); + await this.pingsDatabase.deletePing(identifier); + return false; + } + console.warn(`Recoverable upload failure while attempting to send ping ${identifier}, will retry. Error was ${status !== null && status !== void 0 ? status : "no status"}.`); + return true; + } + async triggerUploadInternal() { + let retries = 0; + let nextPing = this.getNextPing(); + while (nextPing && this.status !== 2) { + const status = await this.attemptPingUpload(nextPing); + const shouldRetry = await this.processPingUploadResponse(nextPing.identifier, status); + if (shouldRetry) { + retries++; + this.enqueuePing(nextPing); + } + if (retries >= 3) { + console.info("Reached maximum recoverable failures for the current uploading window. You are done."); + return; + } + nextPing = this.getNextPing(); + } + } + async triggerUpload() { + if (this.status !== 0) { + return; + } + this.status = 1; + try { + this.currentJob = this.triggerUploadInternal(); + await this.currentJob; + } + finally { + this.status = 0; + } + } + async cancelUpload() { + if (this.status === 1) { + this.status = 2; + await this.currentJob; + } + return; + } + async clearPendingPingsQueue() { + await this.cancelUpload(); + this.queue = []; + } + update(identifier, ping) { + this.enqueuePing({ identifier, ...ping }); + void this.triggerUpload(); + } +} +/* harmony default export */ const upload = (PingUploader); + +// EXTERNAL MODULE: ./node_modules/@mozilla/glean/dist/webext/core/metrics/time_unit.js +var time_unit = __webpack_require__(9696); +;// CONCATENATED MODULE: ./node_modules/@mozilla/glean/dist/webext/core/internal_metrics.js + + + + + + + +class CoreMetrics { + constructor() { + this.clientId = new uuid({ + name: "client_id", + category: "", + sendInPings: ["glean_client_info"], + lifetime: "user", + disabled: false, + }); + this.firstRunDate = new datetime/* default */.ZP({ + name: "first_run_date", + category: "", + sendInPings: ["glean_client_info"], + lifetime: "user", + disabled: false, + }, time_unit/* default.Day */.Z.Day); + this.os = new string.default({ + name: "os", + category: "", + sendInPings: ["glean_client_info"], + lifetime: "application", + disabled: false, + }); + this.osVersion = new string.default({ + name: "os_version", + category: "", + sendInPings: ["glean_client_info"], + lifetime: "application", + disabled: false, + }); + this.architecture = new string.default({ + name: "architecture", + category: "", + sendInPings: ["glean_client_info"], + lifetime: "application", + disabled: false, + }); + this.locale = new string.default({ + name: "locale", + category: "", + sendInPings: ["glean_client_info"], + lifetime: "application", + disabled: false, + }); + this.appBuild = new string.default({ + name: "app_build", + category: "", + sendInPings: ["glean_client_info"], + lifetime: "application", + disabled: false, + }); + this.appDisplayVersion = new string.default({ + name: "app_display_version", + category: "", + sendInPings: ["glean_client_info"], + lifetime: "application", + disabled: false, + }); + } + async initialize(config, platform, metricsDatabase) { + await this.initializeClientId(metricsDatabase); + await this.initializeFirstRunDate(metricsDatabase); + await string.default._private_setUndispatched(this.os, await platform.info.os()); + await string.default._private_setUndispatched(this.osVersion, await platform.info.osVersion()); + await string.default._private_setUndispatched(this.architecture, await platform.info.arch()); + await string.default._private_setUndispatched(this.locale, await platform.info.locale()); + await string.default._private_setUndispatched(this.appBuild, config.appBuild || "Unknown"); + await string.default._private_setUndispatched(this.appDisplayVersion, config.appDisplayVersion || "Unknown"); + } + async initializeClientId(metricsDatabase) { + let needNewClientId = false; + const clientIdData = await metricsDatabase.getMetric(constants/* CLIENT_INFO_STORAGE */.xW, this.clientId); + if (clientIdData) { + try { + const currentClientId = createMetric("uuid", clientIdData); + if (currentClientId.payload() === constants/* KNOWN_CLIENT_ID */.Ei) { + needNewClientId = true; + } + } + catch (_a) { + console.warn("Unexpected value found for Glean clientId. Ignoring."); + needNewClientId = true; + } + } + else { + needNewClientId = true; + } + if (needNewClientId) { + await uuid._private_setUndispatched(this.clientId, (0,utils/* generateUUIDv4 */.Ln)()); + } + } + async initializeFirstRunDate(metricsDatabase) { + const firstRunDate = await metricsDatabase.getMetric(constants/* CLIENT_INFO_STORAGE */.xW, this.firstRunDate); + if (!firstRunDate) { + await datetime/* default._private_setUndispatched */.ZP._private_setUndispatched(this.firstRunDate); + } + } +} + +// EXTERNAL MODULE: ./node_modules/@mozilla/glean/dist/webext/core/metrics/events_database.js +var events_database = __webpack_require__(9150); +// EXTERNAL MODULE: ./node_modules/@mozilla/glean/dist/webext/core/pings/ping_type.js + 1 modules +var ping_type = __webpack_require__(2455); +;// CONCATENATED MODULE: ./node_modules/@mozilla/glean/dist/webext/core/internal_pings.js + + +class CorePings { + constructor() { + this.deletionRequest = new ping_type.default({ + name: constants/* DELETION_REQUEST_PING_NAME */.Ui, + includeClientId: true, + sendIfEmpty: true, + }); + } +} +/* harmony default export */ const internal_pings = (CorePings); + +// EXTERNAL MODULE: ./node_modules/@mozilla/glean/dist/webext/core/events/index.js +var events = __webpack_require__(4815); +;// CONCATENATED MODULE: ./node_modules/@mozilla/glean/dist/webext/core/events/utils.js + +function registerPluginToEvent(plugin) { + const eventName = plugin.event; + if (eventName in events/* default */.Z) { + const event = events/* default */.Z[eventName]; + event.registerPlugin(plugin); + return; + } + console.error(`Attempted to register plugin '${plugin.name}', which listens to the event '${plugin.event}'.`, "That is not a valid Glean event. Ignoring"); +} +function testResetEvents() { + for (const event in events/* default */.Z) { + events/* default */.Z[event].deregisterPlugin(); + } +} + +;// CONCATENATED MODULE: ./node_modules/@mozilla/glean/dist/webext/core/error/index.js + + +function getErrorMetricForMetric(metric, error) { + const identifier = metric.baseIdentifier(); + const name = (0,labeled/* stripLabel */.ho)(identifier); + return new counter.default({ + name: (0,labeled/* combineIdentifierAndLabel */.lb)(error, name), + category: "glean.error", + lifetime: "ping", + sendInPings: metric.sendInPings, + disabled: false, + }); +} +class ErrorManager { + async record(metric, error, message, numErrors = 1) { + const errorMetric = getErrorMetricForMetric(metric, error); + console.warn(`${metric.baseIdentifier()}: ${message}`); + if (numErrors > 0) { + await counter.default._private_addUndispatched(errorMetric, numErrors); + } + else { + } + } + async testGetNumRecordedErrors(metric, error, ping) { + const errorMetric = getErrorMetricForMetric(metric, error); + const numErrors = await errorMetric.testGetValue(ping); + return numErrors || 0; + } +} + +;// CONCATENATED MODULE: ./node_modules/@mozilla/glean/dist/webext/core/storage/utils.js + +function getValueFromNestedObject(obj, index) { + if (index.length === 0) { + throw Error("The index must contain at least one property to get."); + } + let target = obj; + for (const key of index) { + if ((0,utils/* isObject */.Kn)(target) && key in target) { + const temp = target[key]; + if ((0,utils/* isJSONValue */.qT)(temp)) { + target = temp; + } + } + else { + return; + } + } + return target; +} +function updateNestedObject(obj, index, transformFn) { + if (index.length === 0) { + throw Error("The index must contain at least one property to update."); + } + const returnObject = { ...obj }; + let target = returnObject; + for (const key of index.slice(0, index.length - 1)) { + if (!(0,utils/* isObject */.Kn)(target[key])) { + target[key] = {}; + } + target = target[key]; + } + const finalKey = index[index.length - 1]; + const current = target[finalKey]; + try { + const value = transformFn(current); + target[finalKey] = value; + return returnObject; + } + catch (e) { + console.error("Error while transforming stored value. Ignoring old value.", e); + target[finalKey] = transformFn(undefined); + return returnObject; + } +} +function deleteKeyFromNestedObject(obj, index) { + if (index.length === 0) { + return {}; + } + const returnObject = { ...obj }; + let target = returnObject; + for (const key of index.slice(0, index.length - 1)) { + const value = target[key]; + if (!(0,utils/* isObject */.Kn)(value)) { + throw Error("Attempted to delete an entry from an invalid index."); + } + else { + target = value; + } + } + const finalKey = index[index.length - 1]; + delete target[finalKey]; + return returnObject; +} + +;// CONCATENATED MODULE: ./node_modules/@mozilla/glean/dist/webext/platform/test/storage.js + +let globalStore = {}; +class MockStore { + constructor(rootKey) { + this.rootKey = rootKey; + } + _getWholeStore() { + const result = globalStore[this.rootKey] || {}; + return Promise.resolve(result); + } + get(index) { + try { + const value = getValueFromNestedObject(globalStore, [this.rootKey, ...index]); + return Promise.resolve(value); + } + catch (e) { + return Promise.reject(e); + } + } + update(index, transformFn) { + try { + globalStore = updateNestedObject(globalStore, [this.rootKey, ...index], transformFn); + return Promise.resolve(); + } + catch (e) { + return Promise.reject(e); + } + } + delete(index) { + try { + globalStore = deleteKeyFromNestedObject(globalStore, [this.rootKey, ...index]); + } + catch (e) { + console.warn(e.message, "Ignoring."); + } + return Promise.resolve(); + } +} +/* harmony default export */ const storage = (MockStore); + +;// CONCATENATED MODULE: ./node_modules/@mozilla/glean/dist/webext/platform/test/index.js + +class MockUploader { + post(_url, _body, _headers) { + const result = { + result: 2, + status: 200 + }; + return Promise.resolve(result); + } +} +const MockPlatformInfo = { + os() { + return Promise.resolve("Unknown"); + }, + osVersion() { + return Promise.resolve("Unknown"); + }, + arch() { + return Promise.resolve("Unknown"); + }, + locale() { + return Promise.resolve("Unknown"); + }, +}; +const TestPlatform = { + Storage: storage, + uploader: new MockUploader(), + info: MockPlatformInfo, + name: "test" +}; +/* harmony default export */ const test = (TestPlatform); + +;// CONCATENATED MODULE: ./node_modules/@mozilla/glean/dist/webext/core/glean.js + + + + + + + + + + + + + + + +class Glean { + constructor() { + if (!(0,utils/* isUndefined */.o8)(Glean._instance)) { + throw new Error(`Tried to instantiate Glean through \`new\`. + Use Glean.instance instead to access the Glean singleton.`); + } + this._coreMetrics = new CoreMetrics(); + this._corePings = new internal_pings(); + } + static get instance() { + if (!Glean._instance) { + Glean._instance = new Glean(); + } + return Glean._instance; + } + static get pingUploader() { + return Glean.instance._pingUploader; + } + static get coreMetrics() { + return Glean.instance._coreMetrics; + } + static get corePings() { + return Glean.instance._corePings; + } + static async onUploadEnabled() { + context/* Context.uploadEnabled */._.uploadEnabled = true; + await Glean.coreMetrics.initialize(Glean.instance._config, Glean.platform, context/* Context.metricsDatabase */._.metricsDatabase); + } + static async onUploadDisabled() { + context/* Context.uploadEnabled */._.uploadEnabled = false; + await Glean.clearMetrics(); + Glean.corePings.deletionRequest.submit(); + } + static async clearMetrics() { + await Glean.pingUploader.clearPendingPingsQueue(); + let firstRunDate; + try { + firstRunDate = new datetime/* DatetimeMetric */.ui(await context/* Context.metricsDatabase.getMetric */._.metricsDatabase.getMetric(constants/* CLIENT_INFO_STORAGE */.xW, Glean.coreMetrics.firstRunDate)).date; + } + catch (_a) { + firstRunDate = new Date(); + } + await context/* Context.eventsDatabase.clearAll */._.eventsDatabase.clearAll(); + await context/* Context.metricsDatabase.clearAll */._.metricsDatabase.clearAll(); + await context/* Context.pingsDatabase.clearAll */._.pingsDatabase.clearAll(); + context/* Context.uploadEnabled */._.uploadEnabled = true; + await uuid._private_setUndispatched(Glean.coreMetrics.clientId, constants/* KNOWN_CLIENT_ID */.Ei); + await datetime/* default._private_setUndispatched */.ZP._private_setUndispatched(Glean.coreMetrics.firstRunDate, firstRunDate); + context/* Context.uploadEnabled */._.uploadEnabled = false; + } + static initialize(applicationId, uploadEnabled, config) { + if (context/* Context.initialized */._.initialized) { + console.warn("Attempted to initialize Glean, but it has already been initialized. Ignoring."); + return; + } + if (applicationId.length === 0) { + console.error("Unable to initialize Glean, applicationId cannot be an empty string."); + return; + } + if (!Glean.instance._platform) { + console.error("Unable to initialize Glean, environment has not been set."); + return; + } + const correctConfig = new Configuration(config); + context/* Context.metricsDatabase */._.metricsDatabase = new database(Glean.platform.Storage); + context/* Context.eventsDatabase */._.eventsDatabase = new events_database/* default */.Z(Glean.platform.Storage); + context/* Context.pingsDatabase */._.pingsDatabase = new pings_database(Glean.platform.Storage); + context/* Context.errorManager */._.errorManager = new ErrorManager(); + Glean.instance._pingUploader = new upload(correctConfig, Glean.platform, context/* Context.pingsDatabase */._.pingsDatabase); + context/* Context.pingsDatabase.attachObserver */._.pingsDatabase.attachObserver(Glean.pingUploader); + if (config === null || config === void 0 ? void 0 : config.plugins) { + for (const plugin of config.plugins) { + registerPluginToEvent(plugin); + } + } + context/* Context.dispatcher.flushInit */._.dispatcher.flushInit(async () => { + context/* Context.applicationId */._.applicationId = (0,utils/* sanitizeApplicationId */.hL)(applicationId); + context/* Context.debugOptions */._.debugOptions = correctConfig.debug; + Glean.instance._config = correctConfig; + await context/* Context.metricsDatabase.clear */._.metricsDatabase.clear("application"); + context/* Context.initialized */._.initialized = true; + Glean.pingUploader.setInitialized(true); + if (uploadEnabled) { + await Glean.onUploadEnabled(); + } + else { + const clientId = await context/* Context.metricsDatabase.getMetric */._.metricsDatabase.getMetric(constants/* CLIENT_INFO_STORAGE */.xW, Glean.coreMetrics.clientId); + if (clientId) { + if (clientId !== constants/* KNOWN_CLIENT_ID */.Ei) { + await Glean.onUploadDisabled(); + } + } + else { + await Glean.clearMetrics(); + } + } + await context/* Context.pingsDatabase.scanPendingPings */._.pingsDatabase.scanPendingPings(); + void Glean.pingUploader.triggerUpload(); + }); + } + static get serverEndpoint() { + var _a; + return (_a = Glean.instance._config) === null || _a === void 0 ? void 0 : _a.serverEndpoint; + } + static get logPings() { + var _a, _b; + return ((_b = (_a = Glean.instance._config) === null || _a === void 0 ? void 0 : _a.debug) === null || _b === void 0 ? void 0 : _b.logPings) || false; + } + static get debugViewTag() { + var _a; + return (_a = Glean.instance._config) === null || _a === void 0 ? void 0 : _a.debug.debugViewTag; + } + static get sourceTags() { + var _a, _b; + return (_b = (_a = Glean.instance._config) === null || _a === void 0 ? void 0 : _a.debug.sourceTags) === null || _b === void 0 ? void 0 : _b.toString(); + } + static get platform() { + if (!Glean.instance._platform) { + throw new Error("IMPOSSIBLE: Attempted to access environment specific APIs before Glean was initialized."); + } + return Glean.instance._platform; + } + static setUploadEnabled(flag) { + context/* Context.dispatcher.launch */._.dispatcher.launch(async () => { + if (!context/* Context.initialized */._.initialized) { + console.error("Changing upload enabled before Glean is initialized is not supported.\n", "Pass the correct state into `Glean.initialize\n`.", "See documentation at https://mozilla.github.io/glean/book/user/general-api.html#initializing-the-glean-sdk`"); + return; + } + if (context/* Context.uploadEnabled */._.uploadEnabled !== flag) { + if (flag) { + await Glean.onUploadEnabled(); + } + else { + await Glean.onUploadDisabled(); + } + } + }); + } + static setLogPings(flag) { + context/* Context.dispatcher.launch */._.dispatcher.launch(() => { + Glean.instance._config.debug.logPings = flag; + return Promise.resolve(); + }); + } + static setDebugViewTag(value) { + if (!Configuration.validateDebugViewTag(value)) { + console.error(`Invalid \`debugViewTag\` ${value}. Ignoring.`); + return; + } + context/* Context.dispatcher.launch */._.dispatcher.launch(() => { + Glean.instance._config.debug.debugViewTag = value; + return Promise.resolve(); + }); + } + static unsetDebugViewTag() { + context/* Context.dispatcher.launch */._.dispatcher.launch(() => { + delete Glean.instance._config.debug.debugViewTag; + return Promise.resolve(); + }); + } + static setSourceTags(value) { + if (!Configuration.validateSourceTags(value)) { + console.error(`Invalid \`sourceTags\` ${value.toString()}. Ignoring.`); + return; + } + context/* Context.dispatcher.launch */._.dispatcher.launch(() => { + Glean.instance._config.debug.sourceTags = value; + return Promise.resolve(); + }); + } + static unsetSourceTags() { + context/* Context.dispatcher.launch */._.dispatcher.launch(() => { + delete Glean.instance._config.debug.sourceTags; + return Promise.resolve(); + }); + } + static setPlatform(platform) { + if (context/* Context.initialized */._.initialized) { + return; + } + if (Glean.instance._platform && Glean.instance._platform.name !== platform.name) { + console.debug(`Changing Glean platform from "${Glean.platform.name}" to "${platform.name}".`); + } + Glean.instance._platform = platform; + } + static async testInitialize(applicationId, uploadEnabled = true, config) { + Glean.setPlatform(test); + Glean.initialize(applicationId, uploadEnabled, config); + await context/* Context.dispatcher.testBlockOnQueue */._.dispatcher.testBlockOnQueue(); + } + static async testUninitialize() { + await context/* Context.testUninitialize */._.testUninitialize(); + testResetEvents(); + if (Glean.pingUploader) { + await Glean.pingUploader.clearPendingPingsQueue(); + } + } + static async testResetGlean(applicationId, uploadEnabled = true, config) { + await Glean.testUninitialize(); + try { + await context/* Context.eventsDatabase.clearAll */._.eventsDatabase.clearAll(); + await context/* Context.metricsDatabase.clearAll */._.metricsDatabase.clearAll(); + await context/* Context.pingsDatabase.clearAll */._.pingsDatabase.clearAll(); + } + catch (_a) { + } + await Glean.testInitialize(applicationId, uploadEnabled, config); + } +} +/* harmony default export */ const glean = (Glean); + +;// CONCATENATED MODULE: ./node_modules/@mozilla/glean/dist/webext/platform/webext/storage.js + + +function stripNulls(query) { + for (const key in query) { + const curr = query[key]; + if (curr === null) { + delete query[key]; + } + if ((0,utils/* isObject */.Kn)(curr)) { + if (Object.keys(curr).length === 0) { + delete query[key]; + } + else { + stripNulls(curr); + } + } + } +} +class WebExtStore { + constructor(rootKey) { + if (typeof browser === "undefined") { + throw Error(`The web extensions store should only be user in a browser extension context. + If running is a browser different from Firefox, make sure you have installed + the webextension-polyfill peer dependency. To do so, run \`npm i webextension-polyfill\`.`); + } + this.store = browser.storage.local; + this.rootKey = rootKey; + } + async _getWholeStore() { + const result = await this.store.get({ [this.rootKey]: {} }); + return result[this.rootKey]; + } + _buildQuery(index) { + let query = null; + for (const key of [this.rootKey, ...index].reverse()) { + query = { [key]: query }; + } + return query; + } + async _buildQueryFromStore(transformFn) { + const store = await this._getWholeStore(); + return { [this.rootKey]: transformFn(store) }; + } + async get(index) { + const query = this._buildQuery(index); + const response = await this.store.get(query); + stripNulls(response); + if (!response) { + return; + } + if ((0,utils/* isJSONValue */.qT)(response)) { + if ((0,utils/* isObject */.Kn)(response)) { + return getValueFromNestedObject(response, [this.rootKey, ...index]); + } + else { + return response; + } + } + console.warn(`Unexpected value found in storage for index ${JSON.stringify(index)}. Ignoring. + ${JSON.stringify(response, null, 2)}`); + } + async update(index, transformFn) { + if (index.length === 0) { + throw Error("The index must contain at least one property to update."); + } + const query = await this._buildQueryFromStore(store => updateNestedObject(store, index, transformFn)); + return this.store.set(query); + } + async delete(index) { + try { + const query = await this._buildQueryFromStore(store => deleteKeyFromNestedObject(store, index)); + return this.store.set(query); + } + catch (e) { + console.warn("Ignoring key", e); + } + } +} +/* harmony default export */ const webext_storage = (WebExtStore); + +;// CONCATENATED MODULE: ./node_modules/@mozilla/glean/dist/webext/core/upload/uploader.js +const DEFAULT_UPLOAD_TIMEOUT_MS = 10000; +var UploadResultStatus; +(function (UploadResultStatus) { + UploadResultStatus[UploadResultStatus["RecoverableFailure"] = 0] = "RecoverableFailure"; + UploadResultStatus[UploadResultStatus["UnrecoverableFailure"] = 1] = "UnrecoverableFailure"; + UploadResultStatus[UploadResultStatus["Success"] = 2] = "Success"; +})(UploadResultStatus || (UploadResultStatus = {})); + +;// CONCATENATED MODULE: ./node_modules/@mozilla/glean/dist/webext/platform/webext/uploader.js + +class BrowserUploader { + async post(url, body, headers = {}) { + const controller = new AbortController(); + const timeout = setTimeout(() => controller.abort(), DEFAULT_UPLOAD_TIMEOUT_MS); + let response; + try { + response = await fetch(url.toString(), { + headers, + method: "POST", + body: body, + keepalive: true, + credentials: "omit", + signal: controller.signal, + redirect: "error", + }); + } + catch (e) { + if (e instanceof DOMException) { + console.error("Timeout while attempting to upload ping.", e); + } + else if (e instanceof TypeError) { + console.error("Network while attempting to upload ping.", e); + } + else { + console.error("Unknown error while attempting to upload ping.", e); + } + clearTimeout(timeout); + return { result: 0 }; + } + clearTimeout(timeout); + return { + result: 2, + status: response.status + }; + } +} +/* harmony default export */ const uploader = (new BrowserUploader()); + +;// CONCATENATED MODULE: ./node_modules/@mozilla/glean/dist/webext/platform/webext/platform_info.js +const WebExtPlatformInfo = { + async os() { + const platformInfo = await browser.runtime.getPlatformInfo(); + switch (platformInfo.os) { + case "mac": + return "Darwin"; + case "win": + return "Windows"; + case "android": + return "Android"; + case "cros": + return "ChromeOS"; + case "linux": + return "Linux"; + case "openbsd": + return "OpenBSD"; + default: + return "Unknown"; + } + }, + async osVersion() { + return Promise.resolve("Unknown"); + }, + async arch() { + const platformInfo = await browser.runtime.getPlatformInfo(); + return platformInfo.arch; + }, + async locale() { + return Promise.resolve(navigator.language || "und"); + } +}; +/* harmony default export */ const platform_info = (WebExtPlatformInfo); + +;// CONCATENATED MODULE: ./node_modules/@mozilla/glean/dist/webext/platform/webext/index.js + + + +const WebExtPlatform = { + Storage: webext_storage, + uploader: uploader, + info: platform_info, + name: "webext" +}; +/* harmony default export */ const webext = (WebExtPlatform); + +;// CONCATENATED MODULE: ./node_modules/@mozilla/glean/dist/webext/index/webext.js + + +/* harmony default export */ const index_webext = ({ + initialize(applicationId, uploadEnabled, config) { + glean.setPlatform(webext); + glean.initialize(applicationId, uploadEnabled, config); + }, + setUploadEnabled(flag) { + glean.setUploadEnabled(flag); + }, + setLogPings(flag) { + glean.setLogPings(flag); + }, + setDebugViewTag(value) { + glean.setDebugViewTag(value); + }, + unsetDebugViewTag() { + glean.unsetDebugViewTag(); + }, + setSourceTags(value) { + glean.setSourceTags(value); + }, + unsetSourceTags() { + glean.unsetSourceTags(); + }, + async testResetGlean(applicationId, uploadEnabled = true, config) { + return glean.testResetGlean(applicationId, uploadEnabled, config); + } +}); + + +/***/ }), + +/***/ 8313: +/*!****************************************!*\ + !*** ./node_modules/base-64/base64.js ***! + \****************************************/ +/***/ (function(module, exports, __webpack_require__) { + +/* module decorator */ module = __webpack_require__.nmd(module); +var __WEBPACK_AMD_DEFINE_RESULT__;/*! http://mths.be/base64 v0.1.0 by @mathias | MIT license */ +;(function(root) { + + // Detect free variables `exports`. + var freeExports = true && exports; + + // Detect free variable `module`. + var freeModule = true && module && + module.exports == freeExports && module; + + // Detect free variable `global`, from Node.js or Browserified code, and use + // it as `root`. + var freeGlobal = typeof __webpack_require__.g == 'object' && __webpack_require__.g; + if (freeGlobal.global === freeGlobal || freeGlobal.window === freeGlobal) { + root = freeGlobal; + } + + /*--------------------------------------------------------------------------*/ + + var InvalidCharacterError = function(message) { + this.message = message; + }; + InvalidCharacterError.prototype = new Error; + InvalidCharacterError.prototype.name = 'InvalidCharacterError'; + + var error = function(message) { + // Note: the error messages used throughout this file match those used by + // the native `atob`/`btoa` implementation in Chromium. + throw new InvalidCharacterError(message); + }; + + var TABLE = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'; + // http://whatwg.org/html/common-microsyntaxes.html#space-character + var REGEX_SPACE_CHARACTERS = /[\t\n\f\r ]/g; + + // `decode` is designed to be fully compatible with `atob` as described in the + // HTML Standard. http://whatwg.org/html/webappapis.html#dom-windowbase64-atob + // The optimized base64-decoding algorithm used is based on @atk’s excellent + // implementation. https://gist.github.com/atk/1020396 + var decode = function(input) { + input = String(input) + .replace(REGEX_SPACE_CHARACTERS, ''); + var length = input.length; + if (length % 4 == 0) { + input = input.replace(/==?$/, ''); + length = input.length; + } + if ( + length % 4 == 1 || + // http://whatwg.org/C#alphanumeric-ascii-characters + /[^+a-zA-Z0-9/]/.test(input) + ) { + error( + 'Invalid character: the string to be decoded is not correctly encoded.' + ); + } + var bitCounter = 0; + var bitStorage; + var buffer; + var output = ''; + var position = -1; + while (++position < length) { + buffer = TABLE.indexOf(input.charAt(position)); + bitStorage = bitCounter % 4 ? bitStorage * 64 + buffer : buffer; + // Unless this is the first of a group of 4 characters… + if (bitCounter++ % 4) { + // …convert the first 8 bits to a single ASCII character. + output += String.fromCharCode( + 0xFF & bitStorage >> (-2 * bitCounter & 6) + ); + } + } + return output; + }; + + // `encode` is designed to be fully compatible with `btoa` as described in the + // HTML Standard: http://whatwg.org/html/webappapis.html#dom-windowbase64-btoa + var encode = function(input) { + input = String(input); + if (/[^\0-\xFF]/.test(input)) { + // Note: no need to special-case astral symbols here, as surrogates are + // matched, and the input is supposed to only contain ASCII anyway. + error( + 'The string to be encoded contains characters outside of the ' + + 'Latin1 range.' + ); + } + var padding = input.length % 3; + var output = ''; + var position = -1; + var a; + var b; + var c; + var d; + var buffer; + // Make sure any padding is handled outside of the loop. + var length = input.length - padding; + + while (++position < length) { + // Read three bytes, i.e. 24 bits. + a = input.charCodeAt(position) << 16; + b = input.charCodeAt(++position) << 8; + c = input.charCodeAt(++position); + buffer = a + b + c; + // Turn the 24 bits into four chunks of 6 bits each, and append the + // matching character for each of them to the output. + output += ( + TABLE.charAt(buffer >> 18 & 0x3F) + + TABLE.charAt(buffer >> 12 & 0x3F) + + TABLE.charAt(buffer >> 6 & 0x3F) + + TABLE.charAt(buffer & 0x3F) + ); + } + + if (padding == 2) { + a = input.charCodeAt(position) << 8; + b = input.charCodeAt(++position); + buffer = a + b; + output += ( + TABLE.charAt(buffer >> 10) + + TABLE.charAt((buffer >> 4) & 0x3F) + + TABLE.charAt((buffer << 2) & 0x3F) + + '=' + ); + } else if (padding == 1) { + buffer = input.charCodeAt(position); + output += ( + TABLE.charAt(buffer >> 2) + + TABLE.charAt((buffer << 4) & 0x3F) + + '==' + ); + } + + return output; + }; + + var base64 = { + 'encode': encode, + 'decode': decode, + 'version': '0.1.0' + }; + + // Some AMD build optimizers, like r.js, check for specific condition patterns + // like the following: + if ( + true + ) { + !(__WEBPACK_AMD_DEFINE_RESULT__ = (function() { + return base64; + }).call(exports, __webpack_require__, exports, module), + __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__)); + } else { var key; } + +}(this)); + + +/***/ }), + +/***/ 3305: +/*!*************************************!*\ + !*** ./node_modules/clone/clone.js ***! + \*************************************/ +/***/ ((module) => { + +var clone = (function() { +'use strict'; + +function _instanceof(obj, type) { + return type != null && obj instanceof type; +} + +var nativeMap; +try { + nativeMap = Map; +} catch(_) { + // maybe a reference error because no `Map`. Give it a dummy value that no + // value will ever be an instanceof. + nativeMap = function() {}; +} + +var nativeSet; +try { + nativeSet = Set; +} catch(_) { + nativeSet = function() {}; +} + +var nativePromise; +try { + nativePromise = Promise; +} catch(_) { + nativePromise = function() {}; +} + +/** + * Clones (copies) an Object using deep copying. + * + * This function supports circular references by default, but if you are certain + * there are no circular references in your object, you can save some CPU time + * by calling clone(obj, false). + * + * Caution: if `circular` is false and `parent` contains circular references, + * your program may enter an infinite loop and crash. + * + * @param `parent` - the object to be cloned + * @param `circular` - set to true if the object to be cloned may contain + * circular references. (optional - true by default) + * @param `depth` - set to a number if the object is only to be cloned to + * a particular depth. (optional - defaults to Infinity) + * @param `prototype` - sets the prototype to be used when cloning an object. + * (optional - defaults to parent prototype). + * @param `includeNonEnumerable` - set to true if the non-enumerable properties + * should be cloned as well. Non-enumerable properties on the prototype + * chain will be ignored. (optional - false by default) +*/ +function clone(parent, circular, depth, prototype, includeNonEnumerable) { + if (typeof circular === 'object') { + depth = circular.depth; + prototype = circular.prototype; + includeNonEnumerable = circular.includeNonEnumerable; + circular = circular.circular; + } + // maintain two arrays for circular references, where corresponding parents + // and children have the same index + var allParents = []; + var allChildren = []; + + var useBuffer = typeof Buffer != 'undefined'; + + if (typeof circular == 'undefined') + circular = true; + + if (typeof depth == 'undefined') + depth = Infinity; + + // recurse this function so we don't reset allParents and allChildren + function _clone(parent, depth) { + // cloning null always returns null + if (parent === null) + return null; + + if (depth === 0) + return parent; + + var child; + var proto; + if (typeof parent != 'object') { + return parent; + } + + if (_instanceof(parent, nativeMap)) { + child = new nativeMap(); + } else if (_instanceof(parent, nativeSet)) { + child = new nativeSet(); + } else if (_instanceof(parent, nativePromise)) { + child = new nativePromise(function (resolve, reject) { + parent.then(function(value) { + resolve(_clone(value, depth - 1)); + }, function(err) { + reject(_clone(err, depth - 1)); + }); + }); + } else if (clone.__isArray(parent)) { + child = []; + } else if (clone.__isRegExp(parent)) { + child = new RegExp(parent.source, __getRegExpFlags(parent)); + if (parent.lastIndex) child.lastIndex = parent.lastIndex; + } else if (clone.__isDate(parent)) { + child = new Date(parent.getTime()); + } else if (useBuffer && Buffer.isBuffer(parent)) { + child = new Buffer(parent.length); + parent.copy(child); + return child; + } else if (_instanceof(parent, Error)) { + child = Object.create(parent); + } else { + if (typeof prototype == 'undefined') { + proto = Object.getPrototypeOf(parent); + child = Object.create(proto); + } + else { + child = Object.create(prototype); + proto = prototype; + } + } + + if (circular) { + var index = allParents.indexOf(parent); + + if (index != -1) { + return allChildren[index]; + } + allParents.push(parent); + allChildren.push(child); + } + + if (_instanceof(parent, nativeMap)) { + parent.forEach(function(value, key) { + var keyChild = _clone(key, depth - 1); + var valueChild = _clone(value, depth - 1); + child.set(keyChild, valueChild); + }); + } + if (_instanceof(parent, nativeSet)) { + parent.forEach(function(value) { + var entryChild = _clone(value, depth - 1); + child.add(entryChild); + }); + } + + for (var i in parent) { + var attrs; + if (proto) { + attrs = Object.getOwnPropertyDescriptor(proto, i); + } + + if (attrs && attrs.set == null) { + continue; + } + child[i] = _clone(parent[i], depth - 1); + } + + if (Object.getOwnPropertySymbols) { + var symbols = Object.getOwnPropertySymbols(parent); + for (var i = 0; i < symbols.length; i++) { + // Don't need to worry about cloning a symbol because it is a primitive, + // like a number or string. + var symbol = symbols[i]; + var descriptor = Object.getOwnPropertyDescriptor(parent, symbol); + if (descriptor && !descriptor.enumerable && !includeNonEnumerable) { + continue; + } + child[symbol] = _clone(parent[symbol], depth - 1); + if (!descriptor.enumerable) { + Object.defineProperty(child, symbol, { + enumerable: false + }); + } + } + } + + if (includeNonEnumerable) { + var allPropertyNames = Object.getOwnPropertyNames(parent); + for (var i = 0; i < allPropertyNames.length; i++) { + var propertyName = allPropertyNames[i]; + var descriptor = Object.getOwnPropertyDescriptor(parent, propertyName); + if (descriptor && descriptor.enumerable) { + continue; + } + child[propertyName] = _clone(parent[propertyName], depth - 1); + Object.defineProperty(child, propertyName, { + enumerable: false + }); + } + } + + return child; + } + + return _clone(parent, depth); +} + +/** + * Simple flat clone using prototype, accepts only objects, usefull for property + * override on FLAT configuration object (no nested props). + * + * USE WITH CAUTION! This may not behave as you wish if you do not know how this + * works. + */ +clone.clonePrototype = function clonePrototype(parent) { + if (parent === null) + return null; + + var c = function () {}; + c.prototype = parent; + return new c(); +}; + +// private utility functions + +function __objToStr(o) { + return Object.prototype.toString.call(o); +} +clone.__objToStr = __objToStr; + +function __isDate(o) { + return typeof o === 'object' && __objToStr(o) === '[object Date]'; +} +clone.__isDate = __isDate; + +function __isArray(o) { + return typeof o === 'object' && __objToStr(o) === '[object Array]'; +} +clone.__isArray = __isArray; + +function __isRegExp(o) { + return typeof o === 'object' && __objToStr(o) === '[object RegExp]'; +} +clone.__isRegExp = __isRegExp; + +function __getRegExpFlags(re) { + var flags = ''; + if (re.global) flags += 'g'; + if (re.ignoreCase) flags += 'i'; + if (re.multiline) flags += 'm'; + return flags; +} +clone.__getRegExpFlags = __getRegExpFlags; + +return clone; +})(); + +if ( true && module.exports) { + module.exports = clone; +} + + +/***/ }), + +/***/ 2150: +/*!*************************************************!*\ + !*** ./node_modules/component-emitter/index.js ***! + \*************************************************/ +/***/ ((module) => { + + +/** + * Expose `Emitter`. + */ + +if (true) { + module.exports = Emitter; +} + +/** + * Initialize a new `Emitter`. + * + * @api public + */ + +function Emitter(obj) { + if (obj) return mixin(obj); +}; + +/** + * Mixin the emitter properties. + * + * @param {Object} obj + * @return {Object} + * @api private + */ + +function mixin(obj) { + for (var key in Emitter.prototype) { + obj[key] = Emitter.prototype[key]; + } + return obj; +} + +/** + * Listen on the given `event` with `fn`. + * + * @param {String} event + * @param {Function} fn + * @return {Emitter} + * @api public + */ + +Emitter.prototype.on = +Emitter.prototype.addEventListener = function(event, fn){ + this._callbacks = this._callbacks || {}; + (this._callbacks['$' + event] = this._callbacks['$' + event] || []) + .push(fn); + return this; +}; + +/** + * Adds an `event` listener that will be invoked a single + * time then automatically removed. + * + * @param {String} event + * @param {Function} fn + * @return {Emitter} + * @api public + */ + +Emitter.prototype.once = function(event, fn){ + function on() { + this.off(event, on); + fn.apply(this, arguments); + } + + on.fn = fn; + this.on(event, on); + return this; +}; + +/** + * Remove the given callback for `event` or all + * registered callbacks. + * + * @param {String} event + * @param {Function} fn + * @return {Emitter} + * @api public + */ + +Emitter.prototype.off = +Emitter.prototype.removeListener = +Emitter.prototype.removeAllListeners = +Emitter.prototype.removeEventListener = function(event, fn){ + this._callbacks = this._callbacks || {}; + + // all + if (0 == arguments.length) { + this._callbacks = {}; + return this; + } + + // specific event + var callbacks = this._callbacks['$' + event]; + if (!callbacks) return this; + + // remove all handlers + if (1 == arguments.length) { + delete this._callbacks['$' + event]; + return this; + } + + // remove specific handler + var cb; + for (var i = 0; i < callbacks.length; i++) { + cb = callbacks[i]; + if (cb === fn || cb.fn === fn) { + callbacks.splice(i, 1); + break; + } + } + return this; +}; + +/** + * Emit `event` with the given args. + * + * @param {String} event + * @param {Mixed} ... + * @return {Emitter} + */ + +Emitter.prototype.emit = function(event){ + this._callbacks = this._callbacks || {}; + var args = [].slice.call(arguments, 1) + , callbacks = this._callbacks['$' + event]; + + if (callbacks) { + callbacks = callbacks.slice(0); + for (var i = 0, len = callbacks.length; i < len; ++i) { + callbacks[i].apply(this, args); + } + } + + return this; +}; + +/** + * Return array of callbacks for `event`. + * + * @param {String} event + * @return {Array} + * @api public + */ + +Emitter.prototype.listeners = function(event){ + this._callbacks = this._callbacks || {}; + return this._callbacks['$' + event] || []; +}; + +/** + * Check if this emitter has `event` handlers. + * + * @param {String} event + * @return {Boolean} + * @api public + */ + +Emitter.prototype.hasListeners = function(event){ + return !! this.listeners(event).length; +}; + + +/***/ }), + +/***/ 3527: +/*!************************************!*\ + !*** ./node_modules/jsan/index.js ***! + \************************************/ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +module.exports = __webpack_require__(/*! ./lib */ 5661); + + +/***/ }), + +/***/ 1480: +/*!****************************************!*\ + !*** ./node_modules/jsan/lib/cycle.js ***! + \****************************************/ +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + +var pathGetter = __webpack_require__(/*! ./path-getter */ 6445); +var utils = __webpack_require__(/*! ./utils */ 4326); + +var WMap = typeof WeakMap !== 'undefined'? + WeakMap: + function() { + var keys = []; + var values = []; + return { + set: function(key, value) { + keys.push(key); + values.push(value); + }, + get: function(key) { + for (var i = 0; i < keys.length; i++) { + if (keys[i] === key) { + return values[i]; + } + } + } + } + }; + +// Based on https://github.com/douglascrockford/JSON-js/blob/master/cycle.js + +exports.decycle = function decycle(object, options, replacer) { + 'use strict'; + + var map = new WMap() + + var noCircularOption = !Object.prototype.hasOwnProperty.call(options, 'circular'); + var withRefs = options.refs !== false; + + return (function derez(_value, path, key) { + + // The derez recurses through the object, producing the deep copy. + + var i, // The loop counter + name, // Property name + nu; // The new object or array + + // typeof null === 'object', so go on if this value is really an object but not + // one of the weird builtin objects. + + var value = typeof replacer === 'function' ? replacer(key || '', _value) : _value; + + if (options.date && value instanceof Date) { + return {$jsan: 'd' + value.getTime()}; + } + if (options.regex && value instanceof RegExp) { + return {$jsan: 'r' + utils.getRegexFlags(value) + ',' + value.source}; + } + if (options['function'] && typeof value === 'function') { + return {$jsan: 'f' + utils.stringifyFunction(value, options['function'])} + } + if (options['nan'] && typeof value === 'number' && isNaN(value)) { + return {$jsan: 'n'} + } + if (options['infinity']) { + if (Number.POSITIVE_INFINITY === value) return {$jsan: 'i'} + if (Number.NEGATIVE_INFINITY === value) return {$jsan: 'y'} + } + if (options['undefined'] && value === undefined) { + return {$jsan: 'u'} + } + if (options['error'] && value instanceof Error) { + return {$jsan: 'e' + value.message} + } + if (options['symbol'] && typeof value === 'symbol') { + var symbolKey = Symbol.keyFor(value) + if (symbolKey !== undefined) { + return {$jsan: 'g' + symbolKey} + } + + // 'Symbol(foo)'.slice(7, -1) === 'foo' + return {$jsan: 's' + value.toString().slice(7, -1)} + } + + if (options['map'] && typeof Map === 'function' && value instanceof Map && typeof Array.from === 'function') { + return {$jsan: 'm' + JSON.stringify(decycle(Array.from(value), options, replacer))} + } + + if (options['set'] && typeof Set === 'function' && value instanceof Set && typeof Array.from === 'function') { + return {$jsan: 'l' + JSON.stringify(decycle(Array.from(value), options, replacer))} + } + + if (value && typeof value.toJSON === 'function') { + try { + value = value.toJSON(key); + } catch (error) { + var keyString = (key || '$'); + return "toJSON failed for '" + (map.get(value) || keyString) + "'"; + } + } + + if (typeof value === 'object' && value !== null && + !(value instanceof Boolean) && + !(value instanceof Date) && + !(value instanceof Number) && + !(value instanceof RegExp) && + !(value instanceof String) && + !(typeof value === 'symbol') && + !(value instanceof Error)) { + + // If the value is an object or array, look to see if we have already + // encountered it. If so, return a $ref/path object. + + if (typeof value === 'object') { + var foundPath = map.get(value); + if (foundPath) { + if (noCircularOption && withRefs) { + return {$jsan: foundPath}; + } + if (path.indexOf(foundPath) === 0) { + if (!noCircularOption) { + return typeof options.circular === 'function'? + options.circular(value, path, foundPath): + options.circular; + } + return {$jsan: foundPath}; + } + if (withRefs) return {$jsan: foundPath}; + } + map.set(value, path); + } + + + // If it is an array, replicate the array. + + if (Object.prototype.toString.apply(value) === '[object Array]') { + nu = []; + for (i = 0; i < value.length; i += 1) { + nu[i] = derez(value[i], path + '[' + i + ']', i); + } + } else { + + // If it is an object, replicate the object. + + nu = {}; + for (name in value) { + if (Object.prototype.hasOwnProperty.call(value, name)) { + var nextPath = /^\w+$/.test(name) ? + '.' + name : + '[' + JSON.stringify(name) + ']'; + nu[name] = name === '$jsan' ? [derez(value[name], path + nextPath)] : derez(value[name], path + nextPath, name); + } + } + } + return nu; + } + return value; + }(object, '$')); +}; + + +exports.retrocycle = function retrocycle($) { + 'use strict'; + + + return (function rez(value) { + + // The rez function walks recursively through the object looking for $jsan + // properties. When it finds one that has a value that is a path, then it + // replaces the $jsan object with a reference to the value that is found by + // the path. + + var i, item, name, path; + + if (value && typeof value === 'object') { + if (Object.prototype.toString.apply(value) === '[object Array]') { + for (i = 0; i < value.length; i += 1) { + item = value[i]; + if (item && typeof item === 'object') { + if (item.$jsan) { + value[i] = utils.restore(item.$jsan, $); + } else { + rez(item); + } + } + } + } else { + for (name in value) { + // base case passed raw object + if(typeof value[name] === 'string' && name === '$jsan'){ + return utils.restore(value.$jsan, $); + break; + } + else { + if (name === '$jsan') { + value[name] = value[name][0]; + } + if (typeof value[name] === 'object') { + item = value[name]; + if (item && typeof item === 'object') { + if (item.$jsan) { + value[name] = utils.restore(item.$jsan, $); + } else { + rez(item); + } + } + } + } + } + } + } + return value; + }($)); +}; + + +/***/ }), + +/***/ 5661: +/*!****************************************!*\ + !*** ./node_modules/jsan/lib/index.js ***! + \****************************************/ +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + +var cycle = __webpack_require__(/*! ./cycle */ 1480); + +exports.stringify = function stringify(value, replacer, space, _options) { + + if (arguments.length < 4) { + try { + if (arguments.length === 1) { + return JSON.stringify(value); + } else { + return JSON.stringify.apply(JSON, arguments); + } + } catch (e) {} + } + + var options = _options || false; + if (typeof options === 'boolean') { + options = { + 'date': options, + 'function': options, + 'regex': options, + 'undefined': options, + 'error': options, + 'symbol': options, + 'map': options, + 'set': options, + 'nan': options, + 'infinity': options + } + } + + var decycled = cycle.decycle(value, options, replacer); + if (arguments.length === 1) { + return JSON.stringify(decycled); + } else { + // decycle already handles when replacer is a function. + return JSON.stringify(decycled, Array.isArray(replacer) ? replacer : null, space); + } +} + +exports.parse = function parse(text, reviver) { + var needsRetrocycle = /"\$jsan"/.test(text); + var parsed; + if (arguments.length === 1) { + parsed = JSON.parse(text); + } else { + parsed = JSON.parse(text, reviver); + } + if (needsRetrocycle) { + parsed = cycle.retrocycle(parsed); + } + return parsed; +} + + +/***/ }), + +/***/ 6445: +/*!**********************************************!*\ + !*** ./node_modules/jsan/lib/path-getter.js ***! + \**********************************************/ +/***/ ((module) => { + +module.exports = pathGetter; + +function pathGetter(obj, path) { + if (path !== '$') { + var paths = getPaths(path); + for (var i = 0; i < paths.length; i++) { + path = paths[i].toString().replace(/\\"/g, '"'); + if (typeof obj[path] === 'undefined' && i !== paths.length - 1) continue; + obj = obj[path]; + } + } + return obj; +} + +function getPaths(pathString) { + var regex = /(?:\.(\w+))|(?:\[(\d+)\])|(?:\["((?:[^\\"]|\\.)*)"\])/g; + var matches = []; + var match; + while (match = regex.exec(pathString)) { + matches.push( match[1] || match[2] || match[3] ); + } + return matches; +} + + +/***/ }), + +/***/ 4326: +/*!****************************************!*\ + !*** ./node_modules/jsan/lib/utils.js ***! + \****************************************/ +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + +var pathGetter = __webpack_require__(/*! ./path-getter */ 6445); +var jsan = __webpack_require__(/*! ./ */ 5661); + +exports.getRegexFlags = function getRegexFlags(regex) { + var flags = ''; + if (regex.ignoreCase) flags += 'i'; + if (regex.global) flags += 'g'; + if (regex.multiline) flags += 'm'; + return flags; +}; + +exports.stringifyFunction = function stringifyFunction(fn, customToString) { + if (typeof customToString === 'function') { + return customToString(fn); + } + var str = fn.toString(); + var match = str.match(/^[^{]*{|^[^=]*=>/); + var start = match ? match[0] : ' '; + var end = str[str.length - 1] === '}' ? '}' : ''; + return start.replace(/\r\n|\n/g, ' ').replace(/\s+/g, ' ') + ' /* ... */ ' + end; +}; + +exports.restore = function restore(obj, root) { + var type = obj[0]; + var rest = obj.slice(1); + switch(type) { + case '$': + return pathGetter(root, obj); + case 'r': + var comma = rest.indexOf(','); + var flags = rest.slice(0, comma); + var source = rest.slice(comma + 1); + return RegExp(source, flags); + case 'd': + return new Date(+rest); + case 'f': + var fn = function() { throw new Error("can't run jsan parsed function") }; + fn.toString = function() { return rest; }; + return fn; + case 'u': + return undefined; + case 'e': + var error = new Error(rest); + error.stack = 'Stack is unavailable for jsan parsed errors'; + return error; + case 's': + return Symbol(rest); + case 'g': + return Symbol.for(rest); + case 'm': + return new Map(jsan.parse(rest)); + case 'l': + return new Set(jsan.parse(rest)); + case 'n': + return NaN; + case 'i': + return Infinity; + case 'y': + return -Infinity; + default: + console.warn('unknown type', obj); + return obj; + } +} + + +/***/ }), + +/***/ 8758: +/*!*********************************************************!*\ + !*** ./node_modules/linked-list/_source/linked-list.js ***! + \*********************************************************/ +/***/ ((module) => { + +"use strict"; + + +/** + * Constants. + */ + +var errorMessage; + +errorMessage = 'An argument without append, prepend, ' + + 'or detach methods was given to `List'; + +/** + * Creates a new List: A linked list is a bit like an Array, but + * knows nothing about how many items are in it, and knows only about its + * first (`head`) and last (`tail`) items. Each item (e.g. `head`, `tail`, + * &c.) knows which item comes before or after it (its more like the + * implementation of the DOM in JavaScript). + * @global + * @private + * @constructor + * @class Represents an instance of List. + */ + +function List(/*items...*/) { + if (arguments.length) { + return List.from(arguments); + } +} + +var ListPrototype; + +ListPrototype = List.prototype; + +/** + * Creates a new list from the arguments (each a list item) passed in. + * @name List.of + * @param {...ListItem} [items] - Zero or more items to attach. + * @returns {list} - A new instance of List. + */ + +List.of = function (/*items...*/) { + return List.from.call(this, arguments); +}; + +/** + * Creates a new list from the given array-like object (each a list item) + * passed in. + * @name List.from + * @param {ListItem[]} [items] - The items to append. + * @returns {list} - A new instance of List. + */ +List.from = function (items) { + var list = new this(), length, iterator, item; + + if (items && (length = items.length)) { + iterator = -1; + + while (++iterator < length) { + item = items[iterator]; + + if (item !== null && item !== undefined) { + list.append(item); + } + } + } + + return list; +}; + +/** + * List#head + * Default to `null`. + */ +ListPrototype.head = null; + +/** + * List#tail + * Default to `null`. + */ +ListPrototype.tail = null; + +/** + * Returns the list's items as an array. This does *not* detach the items. + * @name List#toArray + * @returns {ListItem[]} - An array of (still attached) ListItems. + */ +ListPrototype.toArray = function () { + var item = this.head, + result = []; + + while (item) { + result.push(item); + item = item.next; + } + + return result; +}; + +/** + * Prepends the given item to the list: Item will be the new first item + * (`head`). + * @name List#prepend + * @param {ListItem} item - The item to prepend. + * @returns {ListItem} - An instance of ListItem (the given item). + */ +ListPrototype.prepend = function (item) { + if (!item) { + return false; + } + + if (!item.append || !item.prepend || !item.detach) { + throw new Error(errorMessage + '#prepend`.'); + } + + var self, head; + + // Cache self. + self = this; + + // If self has a first item, defer prepend to the first items prepend + // method, and return the result. + head = self.head; + + if (head) { + return head.prepend(item); + } + + // ...otherwise, there is no `head` (or `tail`) item yet. + + // Detach the prependee. + item.detach(); + + // Set the prependees parent list to reference self. + item.list = self; + + // Set self's first item to the prependee, and return the item. + self.head = item; + + return item; +}; + +/** + * Appends the given item to the list: Item will be the new last item (`tail`) + * if the list had a first item, and its first item (`head`) otherwise. + * @name List#append + * @param {ListItem} item - The item to append. + * @returns {ListItem} - An instance of ListItem (the given item). + */ + +ListPrototype.append = function (item) { + if (!item) { + return false; + } + + if (!item.append || !item.prepend || !item.detach) { + throw new Error(errorMessage + '#append`.'); + } + + var self, head, tail; + + // Cache self. + self = this; + + // If self has a last item, defer appending to the last items append + // method, and return the result. + tail = self.tail; + + if (tail) { + return tail.append(item); + } + + // If self has a first item, defer appending to the first items append + // method, and return the result. + head = self.head; + + if (head) { + return head.append(item); + } + + // ...otherwise, there is no `tail` or `head` item yet. + + // Detach the appendee. + item.detach(); + + // Set the appendees parent list to reference self. + item.list = self; + + // Set self's first item to the appendee, and return the item. + self.head = item; + + return item; +}; + +/** + * Creates a new ListItem: A linked list item is a bit like DOM node: + * It knows only about its "parent" (`list`), the item before it (`prev`), + * and the item after it (`next`). + * @global + * @private + * @constructor + * @class Represents an instance of ListItem. + */ + +function ListItem() {} + +List.Item = ListItem; + +var ListItemPrototype = ListItem.prototype; + +ListItemPrototype.next = null; + +ListItemPrototype.prev = null; + +ListItemPrototype.list = null; + +/** + * Detaches the item operated on from its parent list. + * @name ListItem#detach + * @returns {ListItem} - The item operated on. + */ +ListItemPrototype.detach = function () { + // Cache self, the parent list, and the previous and next items. + var self = this, + list = self.list, + prev = self.prev, + next = self.next; + + // If the item is already detached, return self. + if (!list) { + return self; + } + + // If self is the last item in the parent list, link the lists last item + // to the previous item. + if (list.tail === self) { + list.tail = prev; + } + + // If self is the first item in the parent list, link the lists first item + // to the next item. + if (list.head === self) { + list.head = next; + } + + // If both the last and first items in the parent list are the same, + // remove the link to the last item. + if (list.tail === list.head) { + list.tail = null; + } + + // If a previous item exists, link its next item to selfs next item. + if (prev) { + prev.next = next; + } + + // If a next item exists, link its previous item to selfs previous item. + if (next) { + next.prev = prev; + } + + // Remove links from self to both the next and previous items, and to the + // parent list. + self.prev = self.next = self.list = null; + + // Return self. + return self; +}; + +/** + * Prepends the given item *before* the item operated on. + * @name ListItem#prepend + * @param {ListItem} item - The item to prepend. + * @returns {ListItem} - The item operated on, or false when that item is not + * attached. + */ +ListItemPrototype.prepend = function (item) { + if (!item || !item.append || !item.prepend || !item.detach) { + throw new Error(errorMessage + 'Item#prepend`.'); + } + + // Cache self, the parent list, and the previous item. + var self = this, + list = self.list, + prev = self.prev; + + // If self is detached, return false. + if (!list) { + return false; + } + + // Detach the prependee. + item.detach(); + + // If self has a previous item... + if (prev) { + // ...link the prependees previous item, to selfs previous item. + item.prev = prev; + + // ...link the previous items next item, to self. + prev.next = item; + } + + // Set the prependees next item to self. + item.next = self; + + // Set the prependees parent list to selfs parent list. + item.list = list; + + // Set the previous item of self to the prependee. + self.prev = item; + + // If self is the first item in the parent list, link the lists first item + // to the prependee. + if (self === list.head) { + list.head = item; + } + + // If the the parent list has no last item, link the lists last item to + // self. + if (!list.tail) { + list.tail = self; + } + + // Return the prependee. + return item; +}; + +/** + * Appends the given item *after* the item operated on. + * @name ListItem#append + * @param {ListItem} item - The item to append. + * @returns {ListItem} - The item operated on, or false when that item is not + * attached. + */ +ListItemPrototype.append = function (item) { + // If item is falsey, return false. + if (!item || !item.append || !item.prepend || !item.detach) { + throw new Error(errorMessage + 'Item#append`.'); + } + + // Cache self, the parent list, and the next item. + var self = this, + list = self.list, + next = self.next; + + // If self is detached, return false. + if (!list) { + return false; + } + + // Detach the appendee. + item.detach(); + + // If self has a next item... + if (next) { + // ...link the appendees next item, to selfs next item. + item.next = next; + + // ...link the next items previous item, to the appendee. + next.prev = item; + } + + // Set the appendees previous item to self. + item.prev = self; + + // Set the appendees parent list to selfs parent list. + item.list = list; + + // Set the next item of self to the appendee. + self.next = item; + + // If the the parent list has no last item or if self is the parent lists + // last item, link the lists last item to the appendee. + if (self === list.tail || !list.tail) { + list.tail = item; + } + + // Return the appendee. + return item; +}; + +/** + * Expose `List`. + */ + +module.exports = List; + + +/***/ }), + +/***/ 1441: +/*!*******************************************!*\ + !*** ./node_modules/linked-list/index.js ***! + \*******************************************/ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +"use strict"; + + +module.exports = __webpack_require__(/*! ./_source/linked-list.js */ 8758); + + +/***/ }), + +/***/ 4: +/*!********************************************!*\ + !*** ./node_modules/querystring/decode.js ***! + \********************************************/ +/***/ ((module) => { + +"use strict"; +// Copyright Joyent, Inc. and other Node contributors. +// +// Permission is hereby granted, free of charge, to any person obtaining a +// copy of this software and associated documentation files (the +// "Software"), to deal in the Software without restriction, including +// without limitation the rights to use, copy, modify, merge, publish, +// distribute, sublicense, and/or sell copies of the Software, and to permit +// persons to whom the Software is furnished to do so, subject to the +// following conditions: +// +// The above copyright notice and this permission notice shall be included +// in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS +// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN +// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, +// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR +// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE +// USE OR OTHER DEALINGS IN THE SOFTWARE. + + + +// If obj.hasOwnProperty has been overridden, then calling +// obj.hasOwnProperty(prop) will break. +// See: https://github.com/joyent/node/issues/1707 +function hasOwnProperty(obj, prop) { + return Object.prototype.hasOwnProperty.call(obj, prop); +} + +module.exports = function(qs, sep, eq, options) { + sep = sep || '&'; + eq = eq || '='; + var obj = {}; + + if (typeof qs !== 'string' || qs.length === 0) { + return obj; + } + + var regexp = /\+/g; + qs = qs.split(sep); + + var maxKeys = 1000; + if (options && typeof options.maxKeys === 'number') { + maxKeys = options.maxKeys; + } + + var len = qs.length; + // maxKeys <= 0 means that we should not limit keys count + if (maxKeys > 0 && len > maxKeys) { + len = maxKeys; + } + + for (var i = 0; i < len; ++i) { + var x = qs[i].replace(regexp, '%20'), + idx = x.indexOf(eq), + kstr, vstr, k, v; + + if (idx >= 0) { + kstr = x.substr(0, idx); + vstr = x.substr(idx + 1); + } else { + kstr = x; + vstr = ''; + } + + k = decodeURIComponent(kstr); + v = decodeURIComponent(vstr); + + if (!hasOwnProperty(obj, k)) { + obj[k] = v; + } else if (Array.isArray(obj[k])) { + obj[k].push(v); + } else { + obj[k] = [obj[k], v]; + } + } + + return obj; +}; + + +/***/ }), + +/***/ 3132: +/*!********************************************!*\ + !*** ./node_modules/querystring/encode.js ***! + \********************************************/ +/***/ ((module) => { + +"use strict"; +// Copyright Joyent, Inc. and other Node contributors. +// +// Permission is hereby granted, free of charge, to any person obtaining a +// copy of this software and associated documentation files (the +// "Software"), to deal in the Software without restriction, including +// without limitation the rights to use, copy, modify, merge, publish, +// distribute, sublicense, and/or sell copies of the Software, and to permit +// persons to whom the Software is furnished to do so, subject to the +// following conditions: +// +// The above copyright notice and this permission notice shall be included +// in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS +// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN +// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, +// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR +// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE +// USE OR OTHER DEALINGS IN THE SOFTWARE. + + + +var stringifyPrimitive = function(v) { + switch (typeof v) { + case 'string': + return v; + + case 'boolean': + return v ? 'true' : 'false'; + + case 'number': + return isFinite(v) ? v : ''; + + default: + return ''; + } +}; + +module.exports = function(obj, sep, eq, name) { + sep = sep || '&'; + eq = eq || '='; + if (obj === null) { + obj = undefined; + } + + if (typeof obj === 'object') { + return Object.keys(obj).map(function(k) { + var ks = encodeURIComponent(stringifyPrimitive(k)) + eq; + if (Array.isArray(obj[k])) { + return obj[k].map(function(v) { + return ks + encodeURIComponent(stringifyPrimitive(v)); + }).join(sep); + } else { + return ks + encodeURIComponent(stringifyPrimitive(obj[k])); + } + }).join(sep); + + } + + if (!name) return ''; + return encodeURIComponent(stringifyPrimitive(name)) + eq + + encodeURIComponent(stringifyPrimitive(obj)); +}; + + +/***/ }), + +/***/ 6774: +/*!*******************************************!*\ + !*** ./node_modules/querystring/index.js ***! + \*******************************************/ +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + +"use strict"; + + +exports.decode = exports.parse = __webpack_require__(/*! ./decode */ 4); +exports.encode = exports.stringify = __webpack_require__(/*! ./encode */ 3132); + + +/***/ }), + +/***/ 3288: +/*!*************************************************!*\ + !*** ./node_modules/remotedev/lib/constants.js ***! + \*************************************************/ +/***/ ((__unused_webpack_module, exports) => { + +"use strict"; + + +exports.__esModule = true; +var defaultSocketOptions = exports.defaultSocketOptions = { + secure: true, + hostname: 'remotedev.io', + port: 443, + autoReconnect: true, + autoReconnectOptions: { + randomness: 60000 + } +}; + +/***/ }), + +/***/ 4952: +/*!************************************************!*\ + !*** ./node_modules/remotedev/lib/devTools.js ***! + \************************************************/ +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + +"use strict"; + + +exports.__esModule = true; +exports.send = undefined; +exports.extractState = extractState; +exports.generateId = generateId; +exports.start = start; +exports.connect = connect; +exports.connectViaExtension = connectViaExtension; + +var _jsan = __webpack_require__(/*! jsan */ 3527); + +var _socketclusterClient = __webpack_require__(/*! socketcluster-client */ 8401); + +var _socketclusterClient2 = _interopRequireDefault(_socketclusterClient); + +var _rnHostDetect = __webpack_require__(/*! rn-host-detect */ 5826); + +var _rnHostDetect2 = _interopRequireDefault(_rnHostDetect); + +var _constants = __webpack_require__(/*! ./constants */ 3288); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +var socket = undefined; +var channel = undefined; +var listeners = {}; + +function extractState(message) { + if (!message || !message.state) return undefined; + if (typeof message.state === 'string') return (0, _jsan.parse)(message.state); + return message.state; +} + +function generateId() { + return Math.random().toString(36).substr(2); +} + +function handleMessages(message) { + if (!message.payload) message.payload = message.action; + Object.keys(listeners).forEach(function (id) { + if (message.instanceId && id !== message.instanceId) return; + if (typeof listeners[id] === 'function') listeners[id](message);else listeners[id].forEach(function (fn) { + fn(message); + }); + }); +} + +function watch() { + if (channel) return; + socket.emit('login', 'master', function (err, channelName) { + if (err) { + console.log(err);return; + } + channel = socket.subscribe(channelName); + channel.watch(handleMessages); + socket.on(channelName, handleMessages); + }); +} + +function connectToServer(options) { + if (socket) return; + var socketOptions = undefined; + if (options.port) { + socketOptions = { + port: options.port, + hostname: (0, _rnHostDetect2.default)(options.hostname || 'localhost'), + secure: !!options.secure + }; + } else socketOptions = _constants.defaultSocketOptions; + socket = _socketclusterClient2.default.create(socketOptions); + watch(); +} + +function start(options) { + if (options) { + if (options.port && !options.hostname) { + options.hostname = 'localhost'; + } + } + connectToServer(options); +} + +function transformAction(action, config) { + if (action.action) return action; + var liftedAction = { timestamp: Date.now() }; + if (action) { + if (config.getActionType) liftedAction.action = config.getActionType(action);else { + if (typeof action === 'string') liftedAction.action = { type: action };else if (!action.type) liftedAction.action = { type: 'update' };else liftedAction.action = action; + } + } else { + liftedAction.action = { type: action }; + } + return liftedAction; +} + +function _send(action, state, options, type, instanceId) { + start(options); + setTimeout(function () { + var message = { + payload: state ? (0, _jsan.stringify)(state) : '', + action: type === 'ACTION' ? (0, _jsan.stringify)(transformAction(action, options)) : action, + type: type || 'ACTION', + id: socket.id, + instanceId: instanceId, + name: options.name + }; + socket.emit(socket.id ? 'log' : 'log-noid', message); + }, 0); +} + +exports.send = _send; +function connect() { + var options = arguments.length <= 0 || arguments[0] === undefined ? {} : arguments[0]; + + var id = generateId(options.instanceId); + start(options); + return { + init: function init(state, action) { + _send(action || {}, state, options, 'INIT', id); + }, + subscribe: function subscribe(listener) { + if (!listener) return undefined; + if (!listeners[id]) listeners[id] = []; + listeners[id].push(listener); + + return function unsubscribe() { + var index = listeners[id].indexOf(listener); + listeners[id].splice(index, 1); + }; + }, + unsubscribe: function unsubscribe() { + delete listeners[id]; + }, + send: function send(action, payload) { + if (action) { + _send(action, payload, options, 'ACTION', id); + } else { + _send(undefined, payload, options, 'STATE', id); + } + }, + error: function error(payload) { + socket.emit({ type: 'ERROR', payload: payload, id: socket.id, instanceId: id }); + } + }; +} + +function connectViaExtension(options) { + if (options && options.remote || typeof window === 'undefined' || !window.__REDUX_DEVTOOLS_EXTENSION__) { + return connect(options); + } + return window.__REDUX_DEVTOOLS_EXTENSION__.connect(options); +} + +exports.default = { connect: connect, connectViaExtension: connectViaExtension, send: _send, extractState: extractState, generateId: generateId }; + +/***/ }), + +/***/ 9607: +/*!*********************************************!*\ + !*** ./node_modules/remotedev/lib/index.js ***! + \*********************************************/ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +"use strict"; + + +module.exports = __webpack_require__(/*! ./devTools */ 4952); + +/***/ }), + +/***/ 5826: +/*!**********************************************!*\ + !*** ./node_modules/rn-host-detect/index.js ***! + \**********************************************/ +/***/ ((module) => { + +"use strict"; + + +/* + * It only for Debug Remotely mode for Android + * When __DEV__ === false, we can't use window.require('NativeModules') + */ +function getByRemoteConfig(hostname) { + var remoteModuleConfig = typeof window !== 'undefined' && + window.__fbBatchedBridgeConfig && + window.__fbBatchedBridgeConfig.remoteModuleConfig + + if ( + !Array.isArray(remoteModuleConfig) || + hostname !== 'localhost' && hostname !== '127.0.0.1' + ) return { hostname: hostname, passed: false } + + var result = hostname + var passed = false + remoteModuleConfig.some(function (config) { + if (!config) return false + + var name = config[0] + var content = config[1] + if ( + (name === 'AndroidConstants' || name === 'PlatformConstants') && + content && + content.ServerHost + ) { + result = content.ServerHost.split(':')[0] + passed = true + return true + } + + if ( + name === 'SourceCode' && + content && + content.scriptURL + ) { + result = content.scriptURL.replace(/https?:\/\//, '').split(':')[0] + passed = true + return true + } + return false + }) + + return { hostname: result, passed: passed } +} + +function getByRNRequirePolyfill(hostname) { + var originalWarn = console.warn + var NativeModules + var Constants + var SourceCode + if ( + typeof window === 'undefined' || + !window.__DEV__ || + typeof window.require !== 'function' || + // RN >= 0.56 + // TODO: Get NativeModules for RN >= 0.56 + window.require.name === 'metroRequire' + ) { + return hostname + } + console.warn = function() { + if ( + arguments[0] && + typeof arguments[0].indexOf == 'function' && + arguments[0].indexOf("Requiring module 'NativeModules' by name") > -1 + ) + return + return originalWarn.apply(console, arguments) + } + try { + NativeModules = window.require('NativeModules') + } catch (e) {} + console.warn = originalWarn + if (!NativeModules) return hostname + + Constants = NativeModules.PlatformConstants || NativeModules.AndroidConstants + SourceCode = NativeModules.SourceCode + + if (Constants && Constants.ServerHost) { + return Constants.ServerHost.split(':')[0] + } else if (SourceCode && SourceCode.scriptURL) { + return SourceCode.scriptURL.replace(/https?:\/\//, '').split(':')[0] + } + return hostname +} + +/* + * Get React Native server IP if hostname is `localhost` + * On Android emulator, the IP of host is `10.0.2.2` (Genymotion: 10.0.3.2) + */ +module.exports = function (hostname) { + // Check if it in React Native environment + if ( + typeof __fbBatchedBridgeConfig !== 'object' || + hostname !== 'localhost' && hostname !== '127.0.0.1' + ) { + return hostname + } + var result = getByRemoteConfig(hostname) + + // Leave if get hostname by remote config successful + if (result.passed) { + return result.hostname + } + + // Otherwise, use RN's require polyfill + return getByRNRequirePolyfill(hostname) +} + + +/***/ }), + +/***/ 6125: +/*!******************************************!*\ + !*** ./node_modules/sc-channel/index.js ***! + \******************************************/ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +var Emitter = __webpack_require__(/*! component-emitter */ 2150); + +var SCChannel = function (name, client, options) { + var self = this; + + Emitter.call(this); + + this.PENDING = 'pending'; + this.SUBSCRIBED = 'subscribed'; + this.UNSUBSCRIBED = 'unsubscribed'; + + this.name = name; + this.state = this.UNSUBSCRIBED; + this.client = client; + + this.options = options || {}; + this.setOptions(this.options); +}; + +SCChannel.prototype = Object.create(Emitter.prototype); + +SCChannel.prototype.setOptions = function (options) { + if (!options) { + options = {}; + } + this.waitForAuth = options.waitForAuth || false; + this.batch = options.batch || false; + + if (options.data !== undefined) { + this.data = options.data; + } +}; + +SCChannel.prototype.getState = function () { + return this.state; +}; + +SCChannel.prototype.subscribe = function (options) { + this.client.subscribe(this.name, options); +}; + +SCChannel.prototype.unsubscribe = function () { + this.client.unsubscribe(this.name); +}; + +SCChannel.prototype.isSubscribed = function (includePending) { + return this.client.isSubscribed(this.name, includePending); +}; + +SCChannel.prototype.publish = function (data, callback) { + this.client.publish(this.name, data, callback); +}; + +SCChannel.prototype.watch = function (handler) { + this.client.watch(this.name, handler); +}; + +SCChannel.prototype.unwatch = function (handler) { + this.client.unwatch(this.name, handler); +}; + +SCChannel.prototype.watchers = function () { + return this.client.watchers(this.name); +}; + +SCChannel.prototype.destroy = function () { + this.client.destroyChannel(this.name); +}; + +module.exports.X = SCChannel; + + +/***/ }), + +/***/ 5932: +/*!*******************************************!*\ + !*** ./node_modules/sc-errors/decycle.js ***! + \*******************************************/ +/***/ ((module) => { + +// Based on https://github.com/dscape/cycle/blob/master/cycle.js + +module.exports = function decycle(object) { +// Make a deep copy of an object or array, assuring that there is at most +// one instance of each object or array in the resulting structure. The +// duplicate references (which might be forming cycles) are replaced with +// an object of the form +// {$ref: PATH} +// where the PATH is a JSONPath string that locates the first occurance. +// So, +// var a = []; +// a[0] = a; +// return JSON.stringify(JSON.decycle(a)); +// produces the string '[{"$ref":"$"}]'. + +// JSONPath is used to locate the unique object. $ indicates the top level of +// the object or array. [NUMBER] or [STRING] indicates a child member or +// property. + + var objects = [], // Keep a reference to each unique object or array + paths = []; // Keep the path to each unique object or array + + return (function derez(value, path) { + +// The derez recurses through the object, producing the deep copy. + + var i, // The loop counter + name, // Property name + nu; // The new object or array + +// typeof null === 'object', so go on if this value is really an object but not +// one of the weird builtin objects. + + if (typeof value === 'object' && value !== null && + !(value instanceof Boolean) && + !(value instanceof Date) && + !(value instanceof Number) && + !(value instanceof RegExp) && + !(value instanceof String)) { + +// If the value is an object or array, look to see if we have already +// encountered it. If so, return a $ref/path object. This is a hard way, +// linear search that will get slower as the number of unique objects grows. + + for (i = 0; i < objects.length; i += 1) { + if (objects[i] === value) { + return {$ref: paths[i]}; + } + } + +// Otherwise, accumulate the unique value and its path. + + objects.push(value); + paths.push(path); + +// If it is an array, replicate the array. + + if (Object.prototype.toString.apply(value) === '[object Array]') { + nu = []; + for (i = 0; i < value.length; i += 1) { + nu[i] = derez(value[i], path + '[' + i + ']'); + } + } else { + +// If it is an object, replicate the object. + + nu = {}; + for (name in value) { + if (Object.prototype.hasOwnProperty.call(value, name)) { + nu[name] = derez(value[name], + path + '[' + JSON.stringify(name) + ']'); + } + } + } + return nu; + } + return value; + }(object, '$')); +}; + + +/***/ }), + +/***/ 5588: +/*!*****************************************!*\ + !*** ./node_modules/sc-errors/index.js ***! + \*****************************************/ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +var decycle = __webpack_require__(/*! ./decycle */ 5932); + +var isStrict = (function () { return !this; })(); + +function AuthTokenExpiredError(message, expiry) { + this.name = 'AuthTokenExpiredError'; + this.message = message; + this.expiry = expiry; + if (Error.captureStackTrace && !isStrict) { + Error.captureStackTrace(this, arguments.callee); + } else { + this.stack = (new Error()).stack; + } +} +AuthTokenExpiredError.prototype = Object.create(Error.prototype); + + +function AuthTokenInvalidError(message) { + this.name = 'AuthTokenInvalidError'; + this.message = message; + if (Error.captureStackTrace && !isStrict) { + Error.captureStackTrace(this, arguments.callee); + } else { + this.stack = (new Error()).stack; + } +} +AuthTokenInvalidError.prototype = Object.create(Error.prototype); + + +function AuthTokenNotBeforeError(message, date) { + this.name = 'AuthTokenNotBeforeError'; + this.message = message; + this.date = date; + if (Error.captureStackTrace && !isStrict) { + Error.captureStackTrace(this, arguments.callee); + } else { + this.stack = (new Error()).stack; + } +} +AuthTokenNotBeforeError.prototype = Object.create(Error.prototype); + + +// For any other auth token error. +function AuthTokenError(message) { + this.name = 'AuthTokenError'; + this.message = message; + if (Error.captureStackTrace && !isStrict) { + Error.captureStackTrace(this, arguments.callee); + } else { + this.stack = (new Error()).stack; + } +} +AuthTokenError.prototype = Object.create(Error.prototype); + + +function SilentMiddlewareBlockedError(message, type) { + this.name = 'SilentMiddlewareBlockedError'; + this.message = message; + this.type = type; + if (Error.captureStackTrace && !isStrict) { + Error.captureStackTrace(this, arguments.callee); + } else { + this.stack = (new Error()).stack; + } +} +SilentMiddlewareBlockedError.prototype = Object.create(Error.prototype); + + +function InvalidActionError(message) { + this.name = 'InvalidActionError'; + this.message = message; + if (Error.captureStackTrace && !isStrict) { + Error.captureStackTrace(this, arguments.callee); + } else { + this.stack = (new Error()).stack; + } +} +InvalidActionError.prototype = Object.create(Error.prototype); + +function InvalidArgumentsError(message) { + this.name = 'InvalidArgumentsError'; + this.message = message; + if (Error.captureStackTrace && !isStrict) { + Error.captureStackTrace(this, arguments.callee); + } else { + this.stack = (new Error()).stack; + } +} +InvalidArgumentsError.prototype = Object.create(Error.prototype); + +function InvalidOptionsError(message) { + this.name = 'InvalidOptionsError'; + this.message = message; + if (Error.captureStackTrace && !isStrict) { + Error.captureStackTrace(this, arguments.callee); + } else { + this.stack = (new Error()).stack; + } +} +InvalidOptionsError.prototype = Object.create(Error.prototype); + + +function InvalidMessageError(message) { + this.name = 'InvalidMessageError'; + this.message = message; + if (Error.captureStackTrace && !isStrict) { + Error.captureStackTrace(this, arguments.callee); + } else { + this.stack = (new Error()).stack; + } +} +InvalidMessageError.prototype = Object.create(Error.prototype); + + +function SocketProtocolError(message, code) { + this.name = 'SocketProtocolError'; + this.message = message; + this.code = code; + if (Error.captureStackTrace && !isStrict) { + Error.captureStackTrace(this, arguments.callee); + } else { + this.stack = (new Error()).stack; + } +} +SocketProtocolError.prototype = Object.create(Error.prototype); + + +function ServerProtocolError(message) { + this.name = 'ServerProtocolError'; + this.message = message; + if (Error.captureStackTrace && !isStrict) { + Error.captureStackTrace(this, arguments.callee); + } else { + this.stack = (new Error()).stack; + } +} +ServerProtocolError.prototype = Object.create(Error.prototype); + +function HTTPServerError(message) { + this.name = 'HTTPServerError'; + this.message = message; + if (Error.captureStackTrace && !isStrict) { + Error.captureStackTrace(this, arguments.callee); + } else { + this.stack = (new Error()).stack; + } +} +HTTPServerError.prototype = Object.create(Error.prototype); + + +function ResourceLimitError(message) { + this.name = 'ResourceLimitError'; + this.message = message; + if (Error.captureStackTrace && !isStrict) { + Error.captureStackTrace(this, arguments.callee); + } else { + this.stack = (new Error()).stack; + } +} +ResourceLimitError.prototype = Object.create(Error.prototype); + + +function TimeoutError(message) { + this.name = 'TimeoutError'; + this.message = message; + if (Error.captureStackTrace && !isStrict) { + Error.captureStackTrace(this, arguments.callee); + } else { + this.stack = (new Error()).stack; + } +} +TimeoutError.prototype = Object.create(Error.prototype); + + +function BadConnectionError(message, type) { + this.name = 'BadConnectionError'; + this.message = message; + this.type = type; + if (Error.captureStackTrace && !isStrict) { + Error.captureStackTrace(this, arguments.callee); + } else { + this.stack = (new Error()).stack; + } +} +BadConnectionError.prototype = Object.create(Error.prototype); + + +function BrokerError(message) { + this.name = 'BrokerError'; + this.message = message; + if (Error.captureStackTrace && !isStrict) { + Error.captureStackTrace(this, arguments.callee); + } else { + this.stack = (new Error()).stack; + } +} +BrokerError.prototype = Object.create(Error.prototype); + + +function ProcessExitError(message, code) { + this.name = 'ProcessExitError'; + this.message = message; + this.code = code; + if (Error.captureStackTrace && !isStrict) { + Error.captureStackTrace(this, arguments.callee); + } else { + this.stack = (new Error()).stack; + } +} +ProcessExitError.prototype = Object.create(Error.prototype); + + +function UnknownError(message) { + this.name = 'UnknownError'; + this.message = message; + if (Error.captureStackTrace && !isStrict) { + Error.captureStackTrace(this, arguments.callee); + } else { + this.stack = (new Error()).stack; + } +} +UnknownError.prototype = Object.create(Error.prototype); + + +// Expose all error types. + +module.exports = { + AuthTokenExpiredError: AuthTokenExpiredError, + AuthTokenInvalidError: AuthTokenInvalidError, + AuthTokenNotBeforeError: AuthTokenNotBeforeError, + AuthTokenError: AuthTokenError, + SilentMiddlewareBlockedError: SilentMiddlewareBlockedError, + InvalidActionError: InvalidActionError, + InvalidArgumentsError: InvalidArgumentsError, + InvalidOptionsError: InvalidOptionsError, + InvalidMessageError: InvalidMessageError, + SocketProtocolError: SocketProtocolError, + ServerProtocolError: ServerProtocolError, + HTTPServerError: HTTPServerError, + ResourceLimitError: ResourceLimitError, + TimeoutError: TimeoutError, + BadConnectionError: BadConnectionError, + BrokerError: BrokerError, + ProcessExitError: ProcessExitError, + UnknownError: UnknownError +}; + +module.exports.socketProtocolErrorStatuses = { + 1001: 'Socket was disconnected', + 1002: 'A WebSocket protocol error was encountered', + 1003: 'Server terminated socket because it received invalid data', + 1005: 'Socket closed without status code', + 1006: 'Socket hung up', + 1007: 'Message format was incorrect', + 1008: 'Encountered a policy violation', + 1009: 'Message was too big to process', + 1010: 'Client ended the connection because the server did not comply with extension requirements', + 1011: 'Server encountered an unexpected fatal condition', + 4000: 'Server ping timed out', + 4001: 'Client pong timed out', + 4002: 'Server failed to sign auth token', + 4003: 'Failed to complete handshake', + 4004: 'Client failed to save auth token', + 4005: 'Did not receive #handshake from client before timeout', + 4006: 'Failed to bind socket to message broker', + 4007: 'Client connection establishment timed out', + 4008: 'Server rejected handshake from client' +}; + +module.exports.socketProtocolIgnoreStatuses = { + 1000: 'Socket closed normally', + 1001: 'Socket hung up' +}; + +// Properties related to error domains cannot be serialized. +var unserializableErrorProperties = { + domain: 1, + domainEmitter: 1, + domainThrown: 1 +}; + +// Convert an error into a JSON-compatible type which can later be hydrated +// back to its *original* form. +module.exports.dehydrateError = function dehydrateError(error, includeStackTrace) { + var dehydratedError; + + if (error && typeof error === 'object') { + dehydratedError = { + message: error.message + }; + if (includeStackTrace) { + dehydratedError.stack = error.stack; + } + for (var i in error) { + if (!unserializableErrorProperties[i]) { + dehydratedError[i] = error[i]; + } + } + } else if (typeof error === 'function') { + dehydratedError = '[function ' + (error.name || 'anonymous') + ']'; + } else { + dehydratedError = error; + } + + return decycle(dehydratedError); +}; + +// Convert a dehydrated error back to its *original* form. +module.exports.hydrateError = function hydrateError(error) { + var hydratedError = null; + if (error != null) { + if (typeof error === 'object') { + hydratedError = new Error(error.message); + for (var i in error) { + if (error.hasOwnProperty(i)) { + hydratedError[i] = error[i]; + } + } + } else { + hydratedError = error; + } + } + return hydratedError; +}; + +module.exports.decycle = decycle; + + +/***/ }), + +/***/ 2973: +/*!********************************************!*\ + !*** ./node_modules/sc-formatter/index.js ***! + \********************************************/ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +var base64Chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; +var validJSONStartRegex = /^[ \n\r\t]*[{\[]/; + +var arrayBufferToBase64 = function (arraybuffer) { + var bytes = new Uint8Array(arraybuffer); + var len = bytes.length; + var base64 = ''; + + for (var i = 0; i < len; i += 3) { + base64 += base64Chars[bytes[i] >> 2]; + base64 += base64Chars[((bytes[i] & 3) << 4) | (bytes[i + 1] >> 4)]; + base64 += base64Chars[((bytes[i + 1] & 15) << 2) | (bytes[i + 2] >> 6)]; + base64 += base64Chars[bytes[i + 2] & 63]; + } + + if ((len % 3) === 2) { + base64 = base64.substring(0, base64.length - 1) + '='; + } else if (len % 3 === 1) { + base64 = base64.substring(0, base64.length - 2) + '=='; + } + + return base64; +}; + +var binaryToBase64Replacer = function (key, value) { + if (__webpack_require__.g.ArrayBuffer && value instanceof __webpack_require__.g.ArrayBuffer) { + return { + base64: true, + data: arrayBufferToBase64(value) + }; + } else if (__webpack_require__.g.Buffer) { + if (value instanceof __webpack_require__.g.Buffer){ + return { + base64: true, + data: value.toString('base64') + }; + } + // Some versions of Node.js convert Buffers to Objects before they are passed to + // the replacer function - Because of this, we need to rehydrate Buffers + // before we can convert them to base64 strings. + if (value && value.type === 'Buffer' && Array.isArray(value.data)) { + var rehydratedBuffer; + if (__webpack_require__.g.Buffer.from) { + rehydratedBuffer = __webpack_require__.g.Buffer.from(value.data); + } else { + rehydratedBuffer = new __webpack_require__.g.Buffer(value.data); + } + return { + base64: true, + data: rehydratedBuffer.toString('base64') + }; + } + } + return value; +}; + +// Decode the data which was transmitted over the wire to a JavaScript Object in a format which SC understands. +// See encode function below for more details. +module.exports.decode = function (input) { + if (input == null) { + return null; + } + // Leave ping or pong message as is + if (input === '#1' || input === '#2') { + return input; + } + var message = input.toString(); + + // Performance optimization to detect invalid JSON packet sooner. + if (!validJSONStartRegex.test(message)) { + return message; + } + + try { + return JSON.parse(message); + } catch (err) {} + return message; +}; + +// Encode a raw JavaScript object (which is in the SC protocol format) into a format for +// transfering it over the wire. In this case, we just convert it into a simple JSON string. +// If you want to create your own custom codec, you can encode the object into any format +// (e.g. binary ArrayBuffer or string with any kind of compression) so long as your decode +// function is able to rehydrate that object back into its original JavaScript Object format +// (which adheres to the SC protocol). +// See https://github.com/SocketCluster/socketcluster/blob/master/socketcluster-protocol.md +// for details about the SC protocol. +module.exports.encode = function (object) { + // Leave ping or pong message as is + if (object === '#1' || object === '#2') { + return object; + } + return JSON.stringify(object, binaryToBase64Replacer); +}; + + +/***/ }), + +/***/ 8401: +/*!****************************************************!*\ + !*** ./node_modules/socketcluster-client/index.js ***! + \****************************************************/ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +var SCClientSocket = __webpack_require__(/*! ./lib/scclientsocket */ 4363); +var factory = __webpack_require__(/*! ./lib/factory */ 9620); + +module.exports.factory = factory; +module.exports.SCClientSocket = SCClientSocket; + +module.exports.Emitter = __webpack_require__(/*! component-emitter */ 2150); + +module.exports.create = function (options) { + return factory.create(options); +}; + +module.exports.connect = module.exports.create; + +module.exports.destroy = function (socket) { + return factory.destroy(socket); +}; + +module.exports.clients = factory.clients; + +module.exports.version = '13.0.1'; + + +/***/ }), + +/***/ 4539: +/*!*******************************************************!*\ + !*** ./node_modules/socketcluster-client/lib/auth.js ***! + \*******************************************************/ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +var AuthEngine = function () { + this._internalStorage = {}; + this.isLocalStorageEnabled = this._checkLocalStorageEnabled(); +}; + +AuthEngine.prototype._checkLocalStorageEnabled = function () { + var err; + try { + // Some browsers will throw an error here if localStorage is disabled. + __webpack_require__.g.localStorage; + + // Safari, in Private Browsing Mode, looks like it supports localStorage but all calls to setItem + // throw QuotaExceededError. We're going to detect this and avoid hard to debug edge cases. + __webpack_require__.g.localStorage.setItem('__scLocalStorageTest', 1); + __webpack_require__.g.localStorage.removeItem('__scLocalStorageTest'); + } catch (e) { + err = e; + } + return !err; +}; + +AuthEngine.prototype.saveToken = function (name, token, options, callback) { + if (this.isLocalStorageEnabled && __webpack_require__.g.localStorage) { + __webpack_require__.g.localStorage.setItem(name, token); + } else { + this._internalStorage[name] = token; + } + callback && callback(null, token); +}; + +AuthEngine.prototype.removeToken = function (name, callback) { + var token; + + this.loadToken(name, function (err, authToken) { + token = authToken; + }); + + if (this.isLocalStorageEnabled && __webpack_require__.g.localStorage) { + __webpack_require__.g.localStorage.removeItem(name); + } else { + delete this._internalStorage[name]; + } + + callback && callback(null, token); +}; + +AuthEngine.prototype.loadToken = function (name, callback) { + var token; + + if (this.isLocalStorageEnabled && __webpack_require__.g.localStorage) { + token = __webpack_require__.g.localStorage.getItem(name); + } else { + token = this._internalStorage[name] || null; + } + callback(null, token); +}; + +module.exports.K = AuthEngine; + + +/***/ }), + +/***/ 9620: +/*!**********************************************************!*\ + !*** ./node_modules/socketcluster-client/lib/factory.js ***! + \**********************************************************/ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +var SCClientSocket = __webpack_require__(/*! ./scclientsocket */ 4363); +var scErrors = __webpack_require__(/*! sc-errors */ 5588); +var uuid = __webpack_require__(/*! uuid */ 6205); +var InvalidArgumentsError = scErrors.InvalidArgumentsError; + +var _clients = {}; + +function getMultiplexId(options) { + var protocolPrefix = options.secure ? 'https://' : 'http://'; + var queryString = ''; + if (options.query) { + if (typeof options.query == 'string') { + queryString = options.query; + } else { + var queryArray = []; + var queryMap = options.query; + for (var key in queryMap) { + if (queryMap.hasOwnProperty(key)) { + queryArray.push(key + '=' + queryMap[key]); + } + } + if (queryArray.length) { + queryString = '?' + queryArray.join('&'); + } + } + } + var host; + if (options.host) { + host = options.host; + } else { + host = options.hostname + ':' + options.port; + } + return protocolPrefix + host + options.path + queryString; +} + +function isUrlSecure() { + return __webpack_require__.g.location && location.protocol == 'https:'; +} + +function getPort(options, isSecureDefault) { + var isSecure = options.secure == null ? isSecureDefault : options.secure; + return options.port || (__webpack_require__.g.location && location.port ? location.port : isSecure ? 443 : 80); +} + +function create(options) { + var self = this; + + options = options || {}; + + if (options.host && !options.host.match(/[^:]+:\d{2,5}/)) { + throw new InvalidArgumentsError('The host option should include both' + + ' the hostname and the port number in the format "hostname:port"'); + } + + if (options.host && options.hostname) { + throw new InvalidArgumentsError('The host option should already include' + + ' the hostname and the port number in the format "hostname:port"' + + ' - Because of this, you should never use host and hostname options together'); + } + + if (options.host && options.port) { + throw new InvalidArgumentsError('The host option should already include' + + ' the hostname and the port number in the format "hostname:port"' + + ' - Because of this, you should never use host and port options together'); + } + + var isSecureDefault = isUrlSecure(); + + var opts = { + port: getPort(options, isSecureDefault), + hostname: __webpack_require__.g.location && location.hostname || 'localhost', + path: '/socketcluster/', + secure: isSecureDefault, + autoConnect: true, + autoReconnect: true, + autoSubscribeOnConnect: true, + connectTimeout: 20000, + ackTimeout: 10000, + timestampRequests: false, + timestampParam: 't', + authEngine: null, + authTokenName: 'socketCluster.authToken', + binaryType: 'arraybuffer', + multiplex: true, + pubSubBatchDuration: null, + cloneData: false + }; + for (var i in options) { + if (options.hasOwnProperty(i)) { + opts[i] = options[i]; + } + } + opts.clientMap = _clients; + + if (opts.multiplex === false) { + opts.clientId = uuid.v4(); + var socket = new SCClientSocket(opts); + _clients[opts.clientId] = socket; + return socket; + } + opts.clientId = getMultiplexId(opts); + + if (_clients[opts.clientId]) { + if (opts.autoConnect) { + _clients[opts.clientId].connect(); + } + } else { + _clients[opts.clientId] = new SCClientSocket(opts); + } + return _clients[opts.clientId]; +} + +function destroy(socket) { + socket.destroy(); +} + +module.exports = { + create: create, + destroy: destroy, + clients: _clients +}; + + +/***/ }), + +/***/ 9165: +/*!***********************************************************!*\ + !*** ./node_modules/socketcluster-client/lib/response.js ***! + \***********************************************************/ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +var scErrors = __webpack_require__(/*! sc-errors */ 5588); +var InvalidActionError = scErrors.InvalidActionError; + +var Response = function (socket, id) { + this.socket = socket; + this.id = id; + this.sent = false; +}; + +Response.prototype._respond = function (responseData) { + if (this.sent) { + throw new InvalidActionError('Response ' + this.id + ' has already been sent'); + } else { + this.sent = true; + this.socket.send(this.socket.encode(responseData)); + } +}; + +Response.prototype.end = function (data) { + if (this.id) { + var responseData = { + rid: this.id + }; + if (data !== undefined) { + responseData.data = data; + } + this._respond(responseData); + } +}; + +Response.prototype.error = function (error, data) { + if (this.id) { + var err = scErrors.dehydrateError(error); + + var responseData = { + rid: this.id, + error: err + }; + if (data !== undefined) { + responseData.data = data; + } + + this._respond(responseData); + } +}; + +Response.prototype.callback = function (error, data) { + if (error) { + this.error(error, data); + } else { + this.end(data); + } +}; + +module.exports.H = Response; + + +/***/ }), + +/***/ 4363: +/*!*****************************************************************!*\ + !*** ./node_modules/socketcluster-client/lib/scclientsocket.js ***! + \*****************************************************************/ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +var Emitter = __webpack_require__(/*! component-emitter */ 2150); +var SCChannel = __webpack_require__(/*! sc-channel */ 6125)/* .SCChannel */ .X; +var Response = __webpack_require__(/*! ./response */ 9165)/* .Response */ .H; +var AuthEngine = __webpack_require__(/*! ./auth */ 4539)/* .AuthEngine */ .K; +var formatter = __webpack_require__(/*! sc-formatter */ 2973); +var SCTransport = __webpack_require__(/*! ./sctransport */ 4868)/* .SCTransport */ .U; +var querystring = __webpack_require__(/*! querystring */ 6774); +var LinkedList = __webpack_require__(/*! linked-list */ 1441); +var base64 = __webpack_require__(/*! base-64 */ 8313); +var clone = __webpack_require__(/*! clone */ 3305); + +var scErrors = __webpack_require__(/*! sc-errors */ 5588); +var InvalidArgumentsError = scErrors.InvalidArgumentsError; +var InvalidMessageError = scErrors.InvalidMessageError; +var InvalidActionError = scErrors.InvalidActionError; +var SocketProtocolError = scErrors.SocketProtocolError; +var TimeoutError = scErrors.TimeoutError; +var BadConnectionError = scErrors.BadConnectionError; + +var isBrowser = typeof window != 'undefined'; + + +var SCClientSocket = function (opts) { + var self = this; + + Emitter.call(this); + + this.id = null; + this.state = this.CLOSED; + this.authState = this.UNAUTHENTICATED; + this.signedAuthToken = null; + this.authToken = null; + this.pendingReconnect = false; + this.pendingReconnectTimeout = null; + this.preparingPendingSubscriptions = false; + this.clientId = opts.clientId; + + this.connectTimeout = opts.connectTimeout; + this.ackTimeout = opts.ackTimeout; + this.channelPrefix = opts.channelPrefix || null; + this.disconnectOnUnload = opts.disconnectOnUnload == null ? true : opts.disconnectOnUnload; + this.authTokenName = opts.authTokenName; + + // pingTimeout will be ackTimeout at the start, but it will + // be updated with values provided by the 'connect' event + this.pingTimeout = this.ackTimeout; + this.pingTimeoutDisabled = !!opts.pingTimeoutDisabled; + this.active = true; + + this._clientMap = opts.clientMap || {}; + + var maxTimeout = Math.pow(2, 31) - 1; + + var verifyDuration = function (propertyName) { + if (self[propertyName] > maxTimeout) { + throw new InvalidArgumentsError('The ' + propertyName + + ' value provided exceeded the maximum amount allowed'); + } + }; + + verifyDuration('connectTimeout'); + verifyDuration('ackTimeout'); + + this._localEvents = { + 'connect': 1, + 'connectAbort': 1, + 'close': 1, + 'disconnect': 1, + 'message': 1, + 'error': 1, + 'raw': 1, + 'kickOut': 1, + 'subscribe': 1, + 'unsubscribe': 1, + 'subscribeStateChange': 1, + 'authStateChange': 1, + 'authenticate': 1, + 'deauthenticate': 1, + 'removeAuthToken': 1, + 'subscribeRequest': 1 + }; + + this.connectAttempts = 0; + + this._emitBuffer = new LinkedList(); + this.channels = {}; + + this.options = opts; + + this._cid = 1; + + this.options.callIdGenerator = function () { + return self._cid++; + }; + + if (this.options.autoReconnect) { + if (this.options.autoReconnectOptions == null) { + this.options.autoReconnectOptions = {}; + } + + // Add properties to the this.options.autoReconnectOptions object. + // We assign the reference to a reconnectOptions variable to avoid repetition. + var reconnectOptions = this.options.autoReconnectOptions; + if (reconnectOptions.initialDelay == null) { + reconnectOptions.initialDelay = 10000; + } + if (reconnectOptions.randomness == null) { + reconnectOptions.randomness = 10000; + } + if (reconnectOptions.multiplier == null) { + reconnectOptions.multiplier = 1.5; + } + if (reconnectOptions.maxDelay == null) { + reconnectOptions.maxDelay = 60000; + } + } + + if (this.options.subscriptionRetryOptions == null) { + this.options.subscriptionRetryOptions = {}; + } + + if (this.options.authEngine) { + this.auth = this.options.authEngine; + } else { + this.auth = new AuthEngine(); + } + + if (this.options.codecEngine) { + this.codec = this.options.codecEngine; + } else { + // Default codec engine + this.codec = formatter; + } + + this.options.path = this.options.path.replace(/\/$/, '') + '/'; + + this.options.query = opts.query || {}; + if (typeof this.options.query == 'string') { + this.options.query = querystring.parse(this.options.query); + } + + this._channelEmitter = new Emitter(); + + this._unloadHandler = function () { + self.disconnect(); + }; + + if (isBrowser && this.disconnectOnUnload && __webpack_require__.g.addEventListener) { + __webpack_require__.g.addEventListener('beforeunload', this._unloadHandler, false); + } + this._clientMap[this.clientId] = this; + + if (this.options.autoConnect) { + this.connect(); + } +}; + +SCClientSocket.prototype = Object.create(Emitter.prototype); + +SCClientSocket.CONNECTING = SCClientSocket.prototype.CONNECTING = SCTransport.prototype.CONNECTING; +SCClientSocket.OPEN = SCClientSocket.prototype.OPEN = SCTransport.prototype.OPEN; +SCClientSocket.CLOSED = SCClientSocket.prototype.CLOSED = SCTransport.prototype.CLOSED; + +SCClientSocket.AUTHENTICATED = SCClientSocket.prototype.AUTHENTICATED = 'authenticated'; +SCClientSocket.UNAUTHENTICATED = SCClientSocket.prototype.UNAUTHENTICATED = 'unauthenticated'; + +SCClientSocket.PENDING = SCClientSocket.prototype.PENDING = 'pending'; + +SCClientSocket.ignoreStatuses = scErrors.socketProtocolIgnoreStatuses; +SCClientSocket.errorStatuses = scErrors.socketProtocolErrorStatuses; + +SCClientSocket.prototype._privateEventHandlerMap = { + '#publish': function (data) { + var undecoratedChannelName = this._undecorateChannelName(data.channel); + var isSubscribed = this.isSubscribed(undecoratedChannelName, true); + + if (isSubscribed) { + this._channelEmitter.emit(undecoratedChannelName, data.data); + } + }, + '#kickOut': function (data) { + var undecoratedChannelName = this._undecorateChannelName(data.channel); + var channel = this.channels[undecoratedChannelName]; + if (channel) { + Emitter.prototype.emit.call(this, 'kickOut', data.message, undecoratedChannelName); + channel.emit('kickOut', data.message, undecoratedChannelName); + this._triggerChannelUnsubscribe(channel); + } + }, + '#setAuthToken': function (data, response) { + var self = this; + + if (data) { + var triggerAuthenticate = function (err) { + if (err) { + // This is a non-fatal error, we don't want to close the connection + // because of this but we do want to notify the server and throw an error + // on the client. + response.error(err); + self._onSCError(err); + } else { + self._changeToAuthenticatedState(data.token); + response.end(); + } + }; + + this.auth.saveToken(this.authTokenName, data.token, {}, triggerAuthenticate); + } else { + response.error(new InvalidMessageError('No token data provided by #setAuthToken event')); + } + }, + '#removeAuthToken': function (data, response) { + var self = this; + + this.auth.removeToken(this.authTokenName, function (err, oldToken) { + if (err) { + // Non-fatal error - Do not close the connection + response.error(err); + self._onSCError(err); + } else { + Emitter.prototype.emit.call(self, 'removeAuthToken', oldToken); + self._changeToUnauthenticatedStateAndClearTokens(); + response.end(); + } + }); + }, + '#disconnect': function (data) { + this.transport.close(data.code, data.data); + } +}; + +SCClientSocket.prototype.getState = function () { + return this.state; +}; + +SCClientSocket.prototype.getBytesReceived = function () { + return this.transport.getBytesReceived(); +}; + +SCClientSocket.prototype.deauthenticate = function (callback) { + var self = this; + + this.auth.removeToken(this.authTokenName, function (err, oldToken) { + if (err) { + // Non-fatal error - Do not close the connection + self._onSCError(err); + } else { + Emitter.prototype.emit.call(self, 'removeAuthToken', oldToken); + if (self.state != self.CLOSED) { + self.emit('#removeAuthToken'); + } + self._changeToUnauthenticatedStateAndClearTokens(); + } + callback && callback(err); + }); +}; + +SCClientSocket.prototype.connect = SCClientSocket.prototype.open = function () { + var self = this; + + if (!this.active) { + var error = new InvalidActionError('Cannot connect a destroyed client'); + this._onSCError(error); + return; + } + + if (this.state == this.CLOSED) { + this.pendingReconnect = false; + this.pendingReconnectTimeout = null; + clearTimeout(this._reconnectTimeoutRef); + + this.state = this.CONNECTING; + Emitter.prototype.emit.call(this, 'connecting'); + + if (this.transport) { + this.transport.off(); + } + + this.transport = new SCTransport(this.auth, this.codec, this.options); + + this.transport.on('open', function (status) { + self.state = self.OPEN; + self._onSCOpen(status); + }); + + this.transport.on('error', function (err) { + self._onSCError(err); + }); + + this.transport.on('close', function (code, data) { + self.state = self.CLOSED; + self._onSCClose(code, data); + }); + + this.transport.on('openAbort', function (code, data) { + self.state = self.CLOSED; + self._onSCClose(code, data, true); + }); + + this.transport.on('event', function (event, data, res) { + self._onSCEvent(event, data, res); + }); + } +}; + +SCClientSocket.prototype.reconnect = function (code, data) { + this.disconnect(code, data); + this.connect(); +}; + +SCClientSocket.prototype.disconnect = function (code, data) { + code = code || 1000; + + if (typeof code != 'number') { + throw new InvalidArgumentsError('If specified, the code argument must be a number'); + } + + if (this.state == this.OPEN || this.state == this.CONNECTING) { + this.transport.close(code, data); + } else { + this.pendingReconnect = false; + this.pendingReconnectTimeout = null; + clearTimeout(this._reconnectTimeoutRef); + } +}; + +SCClientSocket.prototype.destroy = function (code, data) { + if (isBrowser && __webpack_require__.g.removeEventListener) { + __webpack_require__.g.removeEventListener('beforeunload', this._unloadHandler, false); + } + this.active = false; + this.disconnect(code, data); + delete this._clientMap[this.clientId]; +}; + +SCClientSocket.prototype._changeToUnauthenticatedStateAndClearTokens = function () { + if (this.authState != this.UNAUTHENTICATED) { + var oldState = this.authState; + var oldSignedToken = this.signedAuthToken; + this.authState = this.UNAUTHENTICATED; + this.signedAuthToken = null; + this.authToken = null; + + var stateChangeData = { + oldState: oldState, + newState: this.authState + }; + Emitter.prototype.emit.call(this, 'authStateChange', stateChangeData); + Emitter.prototype.emit.call(this, 'deauthenticate', oldSignedToken); + } +}; + +SCClientSocket.prototype._changeToAuthenticatedState = function (signedAuthToken) { + this.signedAuthToken = signedAuthToken; + this.authToken = this._extractAuthTokenData(signedAuthToken); + + if (this.authState != this.AUTHENTICATED) { + var oldState = this.authState; + this.authState = this.AUTHENTICATED; + var stateChangeData = { + oldState: oldState, + newState: this.authState, + signedAuthToken: signedAuthToken, + authToken: this.authToken + }; + if (!this.preparingPendingSubscriptions) { + this.processPendingSubscriptions(); + } + + Emitter.prototype.emit.call(this, 'authStateChange', stateChangeData); + } + Emitter.prototype.emit.call(this, 'authenticate', signedAuthToken); +}; + +SCClientSocket.prototype.decodeBase64 = function (encodedString) { + var decodedString; + if (typeof Buffer == 'undefined') { + if (__webpack_require__.g.atob) { + decodedString = __webpack_require__.g.atob(encodedString); + } else { + decodedString = base64.decode(encodedString); + } + } else { + var buffer = new Buffer(encodedString, 'base64'); + decodedString = buffer.toString('utf8'); + } + return decodedString; +}; + +SCClientSocket.prototype.encodeBase64 = function (decodedString) { + var encodedString; + if (typeof Buffer == 'undefined') { + if (__webpack_require__.g.btoa) { + encodedString = __webpack_require__.g.btoa(decodedString); + } else { + encodedString = base64.encode(decodedString); + } + } else { + var buffer = new Buffer(decodedString, 'utf8'); + encodedString = buffer.toString('base64'); + } + return encodedString; +}; + +SCClientSocket.prototype._extractAuthTokenData = function (signedAuthToken) { + var tokenParts = (signedAuthToken || '').split('.'); + var encodedTokenData = tokenParts[1]; + if (encodedTokenData != null) { + var tokenData = encodedTokenData; + try { + tokenData = this.decodeBase64(tokenData); + return JSON.parse(tokenData); + } catch (e) { + return tokenData; + } + } + return null; +}; + +SCClientSocket.prototype.getAuthToken = function () { + return this.authToken; +}; + +SCClientSocket.prototype.getSignedAuthToken = function () { + return this.signedAuthToken; +}; + +// Perform client-initiated authentication by providing an encrypted token string. +SCClientSocket.prototype.authenticate = function (signedAuthToken, callback) { + var self = this; + + this.emit('#authenticate', signedAuthToken, function (err, authStatus) { + if (authStatus && authStatus.isAuthenticated != null) { + // If authStatus is correctly formatted (has an isAuthenticated property), + // then we will rehydrate the authError. + if (authStatus.authError) { + authStatus.authError = scErrors.hydrateError(authStatus.authError); + } + } else { + // Some errors like BadConnectionError and TimeoutError will not pass a valid + // authStatus object to the current function, so we need to create it ourselves. + authStatus = { + isAuthenticated: self.authState, + authError: null + }; + } + if (err) { + if (err.name != 'BadConnectionError' && err.name != 'TimeoutError') { + // In case of a bad/closed connection or a timeout, we maintain the last + // known auth state since those errors don't mean that the token is invalid. + + self._changeToUnauthenticatedStateAndClearTokens(); + } + callback && callback(err, authStatus); + } else { + self.auth.saveToken(self.authTokenName, signedAuthToken, {}, function (err) { + if (err) { + self._onSCError(err); + } + if (authStatus.isAuthenticated) { + self._changeToAuthenticatedState(signedAuthToken); + } else { + self._changeToUnauthenticatedStateAndClearTokens(); + } + callback && callback(err, authStatus); + }); + } + }); +}; + +SCClientSocket.prototype._tryReconnect = function (initialDelay) { + var self = this; + + var exponent = this.connectAttempts++; + var reconnectOptions = this.options.autoReconnectOptions; + var timeout; + + if (initialDelay == null || exponent > 0) { + var initialTimeout = Math.round(reconnectOptions.initialDelay + (reconnectOptions.randomness || 0) * Math.random()); + + timeout = Math.round(initialTimeout * Math.pow(reconnectOptions.multiplier, exponent)); + } else { + timeout = initialDelay; + } + + if (timeout > reconnectOptions.maxDelay) { + timeout = reconnectOptions.maxDelay; + } + + clearTimeout(this._reconnectTimeoutRef); + + this.pendingReconnect = true; + this.pendingReconnectTimeout = timeout; + this._reconnectTimeoutRef = setTimeout(function () { + self.connect(); + }, timeout); +}; + +SCClientSocket.prototype._onSCOpen = function (status) { + var self = this; + + this.preparingPendingSubscriptions = true; + + if (status) { + this.id = status.id; + this.pingTimeout = status.pingTimeout; + this.transport.pingTimeout = this.pingTimeout; + if (status.isAuthenticated) { + this._changeToAuthenticatedState(status.authToken); + } else { + this._changeToUnauthenticatedStateAndClearTokens(); + } + } else { + // This can happen if auth.loadToken (in sctransport.js) fails with + // an error - This means that the signedAuthToken cannot be loaded by + // the auth engine and therefore, we need to unauthenticate the client. + this._changeToUnauthenticatedStateAndClearTokens(); + } + + this.connectAttempts = 0; + + if (this.options.autoSubscribeOnConnect) { + this.processPendingSubscriptions(); + } + + // If the user invokes the callback while in autoSubscribeOnConnect mode, it + // won't break anything. + Emitter.prototype.emit.call(this, 'connect', status, function () { + self.processPendingSubscriptions(); + }); + + if (this.state == this.OPEN) { + this._flushEmitBuffer(); + } +}; + +SCClientSocket.prototype._onSCError = function (err) { + var self = this; + + // Throw error in different stack frame so that error handling + // cannot interfere with a reconnect action. + setTimeout(function () { + if (self.listeners('error').length < 1) { + throw err; + } else { + Emitter.prototype.emit.call(self, 'error', err); + } + }, 0); +}; + +SCClientSocket.prototype._suspendSubscriptions = function () { + var channel, newState; + for (var channelName in this.channels) { + if (this.channels.hasOwnProperty(channelName)) { + channel = this.channels[channelName]; + if (channel.state == channel.SUBSCRIBED || + channel.state == channel.PENDING) { + + newState = channel.PENDING; + } else { + newState = channel.UNSUBSCRIBED; + } + + this._triggerChannelUnsubscribe(channel, newState); + } + } +}; + +SCClientSocket.prototype._abortAllPendingEventsDueToBadConnection = function (failureType) { + var currentNode = this._emitBuffer.head; + var nextNode; + + while (currentNode) { + nextNode = currentNode.next; + var eventObject = currentNode.data; + clearTimeout(eventObject.timeout); + delete eventObject.timeout; + currentNode.detach(); + currentNode = nextNode; + + var callback = eventObject.callback; + if (callback) { + delete eventObject.callback; + var errorMessage = "Event '" + eventObject.event + + "' was aborted due to a bad connection"; + var error = new BadConnectionError(errorMessage, failureType); + callback.call(eventObject, error, eventObject); + } + // Cleanup any pending response callback in the transport layer too. + if (eventObject.cid) { + this.transport.cancelPendingResponse(eventObject.cid); + } + } +}; + +SCClientSocket.prototype._onSCClose = function (code, data, openAbort) { + var self = this; + + this.id = null; + + if (this.transport) { + this.transport.off(); + } + this.pendingReconnect = false; + this.pendingReconnectTimeout = null; + clearTimeout(this._reconnectTimeoutRef); + + this._suspendSubscriptions(); + this._abortAllPendingEventsDueToBadConnection(openAbort ? 'connectAbort' : 'disconnect'); + + // Try to reconnect + // on server ping timeout (4000) + // or on client pong timeout (4001) + // or on close without status (1005) + // or on handshake failure (4003) + // or on handshake rejection (4008) + // or on socket hung up (1006) + if (this.options.autoReconnect) { + if (code == 4000 || code == 4001 || code == 1005) { + // If there is a ping or pong timeout or socket closes without + // status, don't wait before trying to reconnect - These could happen + // if the client wakes up after a period of inactivity and in this case we + // want to re-establish the connection as soon as possible. + this._tryReconnect(0); + + // Codes 4500 and above will be treated as permanent disconnects. + // Socket will not try to auto-reconnect. + } else if (code != 1000 && code < 4500) { + this._tryReconnect(); + } + } + + if (openAbort) { + Emitter.prototype.emit.call(self, 'connectAbort', code, data); + } else { + Emitter.prototype.emit.call(self, 'disconnect', code, data); + } + Emitter.prototype.emit.call(self, 'close', code, data); + + if (!SCClientSocket.ignoreStatuses[code]) { + var closeMessage; + if (data) { + closeMessage = 'Socket connection closed with status code ' + code + ' and reason: ' + data; + } else { + closeMessage = 'Socket connection closed with status code ' + code; + } + var err = new SocketProtocolError(SCClientSocket.errorStatuses[code] || closeMessage, code); + this._onSCError(err); + } +}; + +SCClientSocket.prototype._onSCEvent = function (event, data, res) { + var handler = this._privateEventHandlerMap[event]; + if (handler) { + handler.call(this, data, res); + } else { + Emitter.prototype.emit.call(this, event, data, function () { + res && res.callback.apply(res, arguments); + }); + } +}; + +SCClientSocket.prototype.decode = function (message) { + return this.transport.decode(message); +}; + +SCClientSocket.prototype.encode = function (object) { + return this.transport.encode(object); +}; + +SCClientSocket.prototype._flushEmitBuffer = function () { + var currentNode = this._emitBuffer.head; + var nextNode; + + while (currentNode) { + nextNode = currentNode.next; + var eventObject = currentNode.data; + currentNode.detach(); + this.transport.emitObject(eventObject); + currentNode = nextNode; + } +}; + +SCClientSocket.prototype._handleEventAckTimeout = function (eventObject, eventNode) { + if (eventNode) { + eventNode.detach(); + } + delete eventObject.timeout; + + var callback = eventObject.callback; + if (callback) { + delete eventObject.callback; + var error = new TimeoutError("Event response for '" + eventObject.event + "' timed out"); + callback.call(eventObject, error, eventObject); + } + // Cleanup any pending response callback in the transport layer too. + if (eventObject.cid) { + this.transport.cancelPendingResponse(eventObject.cid); + } +}; + +SCClientSocket.prototype._emit = function (event, data, callback) { + var self = this; + + if (this.state == this.CLOSED) { + this.connect(); + } + var eventObject = { + event: event, + callback: callback + }; + + var eventNode = new LinkedList.Item(); + + if (this.options.cloneData) { + eventObject.data = clone(data); + } else { + eventObject.data = data; + } + eventNode.data = eventObject; + + eventObject.timeout = setTimeout(function () { + self._handleEventAckTimeout(eventObject, eventNode); + }, this.ackTimeout); + + this._emitBuffer.append(eventNode); + if (this.state == this.OPEN) { + this._flushEmitBuffer(); + } +}; + +SCClientSocket.prototype.send = function (data) { + this.transport.send(data); +}; + +SCClientSocket.prototype.emit = function (event, data, callback) { + if (this._localEvents[event] == null) { + this._emit(event, data, callback); + } else if (event == 'error') { + Emitter.prototype.emit.call(this, event, data); + } else { + var error = new InvalidActionError('The "' + event + '" event is reserved and cannot be emitted on a client socket'); + this._onSCError(error); + } +}; + +SCClientSocket.prototype.publish = function (channelName, data, callback) { + var pubData = { + channel: this._decorateChannelName(channelName), + data: data + }; + this.emit('#publish', pubData, callback); +}; + +SCClientSocket.prototype._triggerChannelSubscribe = function (channel, subscriptionOptions) { + var channelName = channel.name; + + if (channel.state != channel.SUBSCRIBED) { + var oldState = channel.state; + channel.state = channel.SUBSCRIBED; + + var stateChangeData = { + channel: channelName, + oldState: oldState, + newState: channel.state, + subscriptionOptions: subscriptionOptions + }; + channel.emit('subscribeStateChange', stateChangeData); + channel.emit('subscribe', channelName, subscriptionOptions); + Emitter.prototype.emit.call(this, 'subscribeStateChange', stateChangeData); + Emitter.prototype.emit.call(this, 'subscribe', channelName, subscriptionOptions); + } +}; + +SCClientSocket.prototype._triggerChannelSubscribeFail = function (err, channel, subscriptionOptions) { + var channelName = channel.name; + var meetsAuthRequirements = !channel.waitForAuth || this.authState == this.AUTHENTICATED; + + if (channel.state != channel.UNSUBSCRIBED && meetsAuthRequirements) { + channel.state = channel.UNSUBSCRIBED; + + channel.emit('subscribeFail', err, channelName, subscriptionOptions); + Emitter.prototype.emit.call(this, 'subscribeFail', err, channelName, subscriptionOptions); + } +}; + +// Cancel any pending subscribe callback +SCClientSocket.prototype._cancelPendingSubscribeCallback = function (channel) { + if (channel._pendingSubscriptionCid != null) { + this.transport.cancelPendingResponse(channel._pendingSubscriptionCid); + delete channel._pendingSubscriptionCid; + } +}; + +SCClientSocket.prototype._decorateChannelName = function (channelName) { + if (this.channelPrefix) { + channelName = this.channelPrefix + channelName; + } + return channelName; +}; + +SCClientSocket.prototype._undecorateChannelName = function (decoratedChannelName) { + if (this.channelPrefix && decoratedChannelName.indexOf(this.channelPrefix) == 0) { + return decoratedChannelName.replace(this.channelPrefix, ''); + } + return decoratedChannelName; +}; + +SCClientSocket.prototype._trySubscribe = function (channel) { + var self = this; + + var meetsAuthRequirements = !channel.waitForAuth || this.authState == this.AUTHENTICATED; + + // We can only ever have one pending subscribe action at any given time on a channel + if (this.state == this.OPEN && !this.preparingPendingSubscriptions && + channel._pendingSubscriptionCid == null && meetsAuthRequirements) { + + var options = { + noTimeout: true + }; + + var subscriptionOptions = { + channel: this._decorateChannelName(channel.name) + }; + if (channel.waitForAuth) { + options.waitForAuth = true; + subscriptionOptions.waitForAuth = options.waitForAuth; + } + if (channel.data) { + subscriptionOptions.data = channel.data; + } + if (channel.batch) { + options.batch = true; + subscriptionOptions.batch = true; + } + + channel._pendingSubscriptionCid = this.transport.emit( + '#subscribe', subscriptionOptions, options, + function (err) { + delete channel._pendingSubscriptionCid; + if (err) { + self._triggerChannelSubscribeFail(err, channel, subscriptionOptions); + } else { + self._triggerChannelSubscribe(channel, subscriptionOptions); + } + } + ); + Emitter.prototype.emit.call(this, 'subscribeRequest', channel.name, subscriptionOptions); + } +}; + +SCClientSocket.prototype.subscribe = function (channelName, options) { + var channel = this.channels[channelName]; + + if (!channel) { + channel = new SCChannel(channelName, this, options); + this.channels[channelName] = channel; + } else if (options) { + channel.setOptions(options); + } + + if (channel.state == channel.UNSUBSCRIBED) { + channel.state = channel.PENDING; + this._trySubscribe(channel); + } + + return channel; +}; + +SCClientSocket.prototype._triggerChannelUnsubscribe = function (channel, newState) { + var channelName = channel.name; + var oldState = channel.state; + + if (newState) { + channel.state = newState; + } else { + channel.state = channel.UNSUBSCRIBED; + } + this._cancelPendingSubscribeCallback(channel); + + if (oldState == channel.SUBSCRIBED) { + var stateChangeData = { + channel: channelName, + oldState: oldState, + newState: channel.state + }; + channel.emit('subscribeStateChange', stateChangeData); + channel.emit('unsubscribe', channelName); + Emitter.prototype.emit.call(this, 'subscribeStateChange', stateChangeData); + Emitter.prototype.emit.call(this, 'unsubscribe', channelName); + } +}; + +SCClientSocket.prototype._tryUnsubscribe = function (channel) { + var self = this; + + if (this.state == this.OPEN) { + var options = { + noTimeout: true + }; + if (channel.batch) { + options.batch = true; + } + // If there is a pending subscribe action, cancel the callback + this._cancelPendingSubscribeCallback(channel); + + // This operation cannot fail because the TCP protocol guarantees delivery + // so long as the connection remains open. If the connection closes, + // the server will automatically unsubscribe the client and thus complete + // the operation on the server side. + var decoratedChannelName = this._decorateChannelName(channel.name); + this.transport.emit('#unsubscribe', decoratedChannelName, options); + } +}; + +SCClientSocket.prototype.unsubscribe = function (channelName) { + var channel = this.channels[channelName]; + + if (channel) { + if (channel.state != channel.UNSUBSCRIBED) { + + this._triggerChannelUnsubscribe(channel); + this._tryUnsubscribe(channel); + } + } +}; + +SCClientSocket.prototype.channel = function (channelName, options) { + var currentChannel = this.channels[channelName]; + + if (!currentChannel) { + currentChannel = new SCChannel(channelName, this, options); + this.channels[channelName] = currentChannel; + } + return currentChannel; +}; + +SCClientSocket.prototype.destroyChannel = function (channelName) { + var channel = this.channels[channelName]; + + if (channel) { + channel.unwatch(); + channel.unsubscribe(); + delete this.channels[channelName]; + } +}; + +SCClientSocket.prototype.subscriptions = function (includePending) { + var subs = []; + var channel, includeChannel; + for (var channelName in this.channels) { + if (this.channels.hasOwnProperty(channelName)) { + channel = this.channels[channelName]; + + if (includePending) { + includeChannel = channel && (channel.state == channel.SUBSCRIBED || + channel.state == channel.PENDING); + } else { + includeChannel = channel && channel.state == channel.SUBSCRIBED; + } + + if (includeChannel) { + subs.push(channelName); + } + } + } + return subs; +}; + +SCClientSocket.prototype.isSubscribed = function (channelName, includePending) { + var channel = this.channels[channelName]; + if (includePending) { + return !!channel && (channel.state == channel.SUBSCRIBED || + channel.state == channel.PENDING); + } + return !!channel && channel.state == channel.SUBSCRIBED; +}; + +SCClientSocket.prototype.processPendingSubscriptions = function () { + var self = this; + + this.preparingPendingSubscriptions = false; + + var pendingChannels = []; + + for (var i in this.channels) { + if (this.channels.hasOwnProperty(i)) { + var channel = this.channels[i]; + if (channel.state == channel.PENDING) { + pendingChannels.push(channel); + } + } + } + + pendingChannels.sort(function (a, b) { + var ap = a.priority || 0; + var bp = b.priority || 0; + if (ap > bp) { + return -1; + } + if (ap < bp) { + return 1; + } + return 0; + }); + + pendingChannels.forEach(function (channel) { + self._trySubscribe(channel); + }); +}; + +SCClientSocket.prototype.watch = function (channelName, handler) { + if (typeof handler != 'function') { + throw new InvalidArgumentsError('No handler function was provided'); + } + this._channelEmitter.on(channelName, handler); +}; + +SCClientSocket.prototype.unwatch = function (channelName, handler) { + if (handler) { + this._channelEmitter.removeListener(channelName, handler); + } else { + this._channelEmitter.removeAllListeners(channelName); + } +}; + +SCClientSocket.prototype.watchers = function (channelName) { + return this._channelEmitter.listeners(channelName); +}; + +module.exports = SCClientSocket; + + +/***/ }), + +/***/ 4868: +/*!**************************************************************!*\ + !*** ./node_modules/socketcluster-client/lib/sctransport.js ***! + \**************************************************************/ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +var Emitter = __webpack_require__(/*! component-emitter */ 2150); +var Response = __webpack_require__(/*! ./response */ 9165)/* .Response */ .H; +var querystring = __webpack_require__(/*! querystring */ 6774); +var WebSocket; +var createWebSocket; + +if (__webpack_require__.g.WebSocket) { + WebSocket = __webpack_require__.g.WebSocket; + createWebSocket = function (uri, options) { + return new WebSocket(uri); + }; +} else { + WebSocket = __webpack_require__(/*! ws */ 5381); + createWebSocket = function (uri, options) { + return new WebSocket(uri, null, options); + }; +} + +var scErrors = __webpack_require__(/*! sc-errors */ 5588); +var TimeoutError = scErrors.TimeoutError; +var BadConnectionError = scErrors.BadConnectionError; + + +var SCTransport = function (authEngine, codecEngine, options) { + var self = this; + + this.state = this.CLOSED; + this.auth = authEngine; + this.codec = codecEngine; + this.options = options; + this.connectTimeout = options.connectTimeout; + this.pingTimeout = options.ackTimeout; + this.pingTimeoutDisabled = !!options.pingTimeoutDisabled; + this.callIdGenerator = options.callIdGenerator; + this.authTokenName = options.authTokenName; + + this._pingTimeoutTicker = null; + this._callbackMap = {}; + this._batchSendList = []; + + // Open the connection. + + this.state = this.CONNECTING; + var uri = this.uri(); + + var wsSocket = createWebSocket(uri, this.options); + wsSocket.binaryType = this.options.binaryType; + + this.socket = wsSocket; + + wsSocket.onopen = function () { + self._onOpen(); + }; + + wsSocket.onclose = function (event) { + var code; + if (event.code == null) { + // This is to handle an edge case in React Native whereby + // event.code is undefined when the mobile device is locked. + // TODO: This is not perfect since this condition could also apply to + // an abnormal close (no close control frame) which would be a 1006. + code = 1005; + } else { + code = event.code; + } + self._onClose(code, event.reason); + }; + + wsSocket.onmessage = function (message, flags) { + self._onMessage(message.data); + }; + + wsSocket.onerror = function (error) { + // The onclose event will be called automatically after the onerror event + // if the socket is connected - Otherwise, if it's in the middle of + // connecting, we want to close it manually with a 1006 - This is necessary + // to prevent inconsistent behavior when running the client in Node.js + // vs in a browser. + + if (self.state === self.CONNECTING) { + self._onClose(1006); + } + }; + + this._connectTimeoutRef = setTimeout(function () { + self._onClose(4007); + self.socket.close(4007); + }, this.connectTimeout); +}; + +SCTransport.prototype = Object.create(Emitter.prototype); + +SCTransport.CONNECTING = SCTransport.prototype.CONNECTING = 'connecting'; +SCTransport.OPEN = SCTransport.prototype.OPEN = 'open'; +SCTransport.CLOSED = SCTransport.prototype.CLOSED = 'closed'; + +SCTransport.prototype.uri = function () { + var query = this.options.query || {}; + var schema = this.options.secure ? 'wss' : 'ws'; + + if (this.options.timestampRequests) { + query[this.options.timestampParam] = (new Date()).getTime(); + } + + query = querystring.encode(query); + + if (query.length) { + query = '?' + query; + } + + var host; + if (this.options.host) { + host = this.options.host; + } else { + var port = ''; + + if (this.options.port && ((schema == 'wss' && this.options.port != 443) + || (schema == 'ws' && this.options.port != 80))) { + port = ':' + this.options.port; + } + host = this.options.hostname + port; + } + + return schema + '://' + host + this.options.path + query; +}; + +SCTransport.prototype._onOpen = function () { + var self = this; + + clearTimeout(this._connectTimeoutRef); + this._resetPingTimeout(); + + this._handshake(function (err, status) { + if (err) { + var statusCode; + if (status && status.code) { + statusCode = status.code; + } else { + statusCode = 4003; + } + self._onError(err); + self._onClose(statusCode, err.toString()); + self.socket.close(statusCode); + } else { + self.state = self.OPEN; + Emitter.prototype.emit.call(self, 'open', status); + self._resetPingTimeout(); + } + }); +}; + +SCTransport.prototype._handshake = function (callback) { + var self = this; + this.auth.loadToken(this.authTokenName, function (err, token) { + if (err) { + callback(err); + } else { + // Don't wait for this.state to be 'open'. + // The underlying WebSocket (this.socket) is already open. + var options = { + force: true + }; + self.emit('#handshake', { + authToken: token + }, options, function (err, status) { + if (status) { + // Add the token which was used as part of authentication attempt + // to the status object. + status.authToken = token; + if (status.authError) { + status.authError = scErrors.hydrateError(status.authError); + } + } + callback(err, status); + }); + } + }); +}; + +SCTransport.prototype._abortAllPendingEventsDueToBadConnection = function (failureType) { + for (var i in this._callbackMap) { + if (this._callbackMap.hasOwnProperty(i)) { + var eventObject = this._callbackMap[i]; + delete this._callbackMap[i]; + + clearTimeout(eventObject.timeout); + delete eventObject.timeout; + + var errorMessage = "Event '" + eventObject.event + + "' was aborted due to a bad connection"; + var badConnectionError = new BadConnectionError(errorMessage, failureType); + + var callback = eventObject.callback; + delete eventObject.callback; + callback.call(eventObject, badConnectionError, eventObject); + } + } +}; + +SCTransport.prototype._onClose = function (code, data) { + delete this.socket.onopen; + delete this.socket.onclose; + delete this.socket.onmessage; + delete this.socket.onerror; + + clearTimeout(this._connectTimeoutRef); + clearTimeout(this._pingTimeoutTicker); + clearTimeout(this._batchTimeout); + + if (this.state == this.OPEN) { + this.state = this.CLOSED; + Emitter.prototype.emit.call(this, 'close', code, data); + this._abortAllPendingEventsDueToBadConnection('disconnect'); + + } else if (this.state == this.CONNECTING) { + this.state = this.CLOSED; + Emitter.prototype.emit.call(this, 'openAbort', code, data); + this._abortAllPendingEventsDueToBadConnection('connectAbort'); + } +}; + +SCTransport.prototype._handleEventObject = function (obj, message) { + if (obj && obj.event != null) { + var response = new Response(this, obj.cid); + Emitter.prototype.emit.call(this, 'event', obj.event, obj.data, response); + } else if (obj && obj.rid != null) { + var eventObject = this._callbackMap[obj.rid]; + if (eventObject) { + clearTimeout(eventObject.timeout); + delete eventObject.timeout; + delete this._callbackMap[obj.rid]; + + if (eventObject.callback) { + var rehydratedError = scErrors.hydrateError(obj.error); + eventObject.callback(rehydratedError, obj.data); + } + } + } else { + Emitter.prototype.emit.call(this, 'event', 'raw', message); + } +}; + +SCTransport.prototype._onMessage = function (message) { + Emitter.prototype.emit.call(this, 'event', 'message', message); + + var obj = this.decode(message); + + // If ping + if (obj == '#1') { + this._resetPingTimeout(); + if (this.socket.readyState == this.socket.OPEN) { + this.sendObject('#2'); + } + } else { + if (Array.isArray(obj)) { + var len = obj.length; + for (var i = 0; i < len; i++) { + this._handleEventObject(obj[i], message); + } + } else { + this._handleEventObject(obj, message); + } + } +}; + +SCTransport.prototype._onError = function (err) { + Emitter.prototype.emit.call(this, 'error', err); +}; + +SCTransport.prototype._resetPingTimeout = function () { + if (this.pingTimeoutDisabled) { + return; + } + var self = this; + + var now = (new Date()).getTime(); + clearTimeout(this._pingTimeoutTicker); + + this._pingTimeoutTicker = setTimeout(function () { + self._onClose(4000); + self.socket.close(4000); + }, this.pingTimeout); +}; + +SCTransport.prototype.getBytesReceived = function () { + return this.socket.bytesReceived; +}; + +SCTransport.prototype.close = function (code, data) { + code = code || 1000; + + if (this.state == this.OPEN) { + var packet = { + code: code, + data: data + }; + this.emit('#disconnect', packet); + + this._onClose(code, data); + this.socket.close(code); + + } else if (this.state == this.CONNECTING) { + this._onClose(code, data); + this.socket.close(code); + } +}; + +SCTransport.prototype.emitObject = function (eventObject, options) { + var simpleEventObject = { + event: eventObject.event, + data: eventObject.data + }; + + if (eventObject.callback) { + simpleEventObject.cid = eventObject.cid = this.callIdGenerator(); + this._callbackMap[eventObject.cid] = eventObject; + } + + this.sendObject(simpleEventObject, options); + + return eventObject.cid || null; +}; + +SCTransport.prototype._handleEventAckTimeout = function (eventObject) { + if (eventObject.cid) { + delete this._callbackMap[eventObject.cid]; + } + delete eventObject.timeout; + + var callback = eventObject.callback; + if (callback) { + delete eventObject.callback; + var error = new TimeoutError("Event response for '" + eventObject.event + "' timed out"); + callback.call(eventObject, error, eventObject); + } +}; + +// The last two optional arguments (a and b) can be options and/or callback +SCTransport.prototype.emit = function (event, data, a, b) { + var self = this; + + var callback, options; + + if (b) { + options = a; + callback = b; + } else { + if (a instanceof Function) { + options = {}; + callback = a; + } else { + options = a; + } + } + + var eventObject = { + event: event, + data: data, + callback: callback + }; + + if (callback && !options.noTimeout) { + eventObject.timeout = setTimeout(function () { + self._handleEventAckTimeout(eventObject); + }, this.options.ackTimeout); + } + + var cid = null; + if (this.state == this.OPEN || options.force) { + cid = this.emitObject(eventObject, options); + } + return cid; +}; + +SCTransport.prototype.cancelPendingResponse = function (cid) { + delete this._callbackMap[cid]; +}; + +SCTransport.prototype.decode = function (message) { + return this.codec.decode(message); +}; + +SCTransport.prototype.encode = function (object) { + return this.codec.encode(object); +}; + +SCTransport.prototype.send = function (data) { + if (this.socket.readyState != this.socket.OPEN) { + this._onClose(1005); + } else { + this.socket.send(data); + } +}; + +SCTransport.prototype.serializeObject = function (object) { + var str, formatError; + try { + str = this.encode(object); + } catch (err) { + formatError = err; + this._onError(formatError); + } + if (!formatError) { + return str; + } + return null; +}; + +SCTransport.prototype.sendObjectBatch = function (object) { + var self = this; + + this._batchSendList.push(object); + if (this._batchTimeout) { + return; + } + + this._batchTimeout = setTimeout(function () { + delete self._batchTimeout; + if (self._batchSendList.length) { + var str = self.serializeObject(self._batchSendList); + if (str != null) { + self.send(str); + } + self._batchSendList = []; + } + }, this.options.pubSubBatchDuration || 0); +}; + +SCTransport.prototype.sendObjectSingle = function (object) { + var str = this.serializeObject(object); + if (str != null) { + this.send(str); + } +}; + +SCTransport.prototype.sendObject = function (object, options) { + if (options && options.batch) { + this.sendObjectBatch(object); + } else { + this.sendObjectSingle(object); + } +}; + +module.exports.U = SCTransport; + + +/***/ }), + +/***/ 5381: +/*!*************************************************************!*\ + !*** ./node_modules/socketcluster-client/lib/ws-browser.js ***! + \*************************************************************/ +/***/ ((module) => { + +var global; +if (typeof WorkerGlobalScope !== 'undefined') { + global = self; +} else { + global = typeof window != 'undefined' && window || (function() { return this; })(); +} + +var WebSocket = global.WebSocket || global.MozWebSocket; + +/** + * WebSocket constructor. + * + * The third `opts` options object gets ignored in web browsers, since it's + * non-standard, and throws a TypeError if passed to the constructor. + * See: https://github.com/einaros/ws/issues/227 + * + * @param {String} uri + * @param {Array} protocols (optional) + * @param {Object} opts (optional) + * @api public + */ + +function ws(uri, protocols, opts) { + var instance; + if (protocols) { + instance = new WebSocket(uri, protocols); + } else { + instance = new WebSocket(uri); + } + return instance; +} + +if (WebSocket) ws.prototype = WebSocket.prototype; + +module.exports = WebSocket ? ws : null; + + +/***/ }), + +/***/ 6205: +/*!**********************************************************************!*\ + !*** ./node_modules/socketcluster-client/node_modules/uuid/index.js ***! + \**********************************************************************/ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +var v1 = __webpack_require__(/*! ./v1 */ 9390); +var v4 = __webpack_require__(/*! ./v4 */ 7547); + +var uuid = v4; +uuid.v1 = v1; +uuid.v4 = v4; + +module.exports = uuid; + + +/***/ }), + +/***/ 4599: +/*!********************************************************************************!*\ + !*** ./node_modules/socketcluster-client/node_modules/uuid/lib/bytesToUuid.js ***! + \********************************************************************************/ +/***/ ((module) => { + +/** + * Convert array of 16 byte values to UUID string format of the form: + * XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX + */ +var byteToHex = []; +for (var i = 0; i < 256; ++i) { + byteToHex[i] = (i + 0x100).toString(16).substr(1); +} + +function bytesToUuid(buf, offset) { + var i = offset || 0; + var bth = byteToHex; + return bth[buf[i++]] + bth[buf[i++]] + + bth[buf[i++]] + bth[buf[i++]] + '-' + + bth[buf[i++]] + bth[buf[i++]] + '-' + + bth[buf[i++]] + bth[buf[i++]] + '-' + + bth[buf[i++]] + bth[buf[i++]] + '-' + + bth[buf[i++]] + bth[buf[i++]] + + bth[buf[i++]] + bth[buf[i++]] + + bth[buf[i++]] + bth[buf[i++]]; +} + +module.exports = bytesToUuid; + + +/***/ }), + +/***/ 9341: +/*!********************************************************************************!*\ + !*** ./node_modules/socketcluster-client/node_modules/uuid/lib/rng-browser.js ***! + \********************************************************************************/ +/***/ ((module) => { + +// Unique ID creation requires a high quality random # generator. In the +// browser this is a little complicated due to unknown quality of Math.random() +// and inconsistent support for the `crypto` API. We do the best we can via +// feature-detection + +// getRandomValues needs to be invoked in a context where "this" is a Crypto implementation. +var getRandomValues = (typeof(crypto) != 'undefined' && crypto.getRandomValues.bind(crypto)) || + (typeof(msCrypto) != 'undefined' && msCrypto.getRandomValues.bind(msCrypto)); +if (getRandomValues) { + // WHATWG crypto RNG - http://wiki.whatwg.org/wiki/Crypto + var rnds8 = new Uint8Array(16); // eslint-disable-line no-undef + + module.exports = function whatwgRNG() { + getRandomValues(rnds8); + return rnds8; + }; +} else { + // Math.random()-based (RNG) + // + // If all else fails, use Math.random(). It's fast, but is of unspecified + // quality. + var rnds = new Array(16); + + module.exports = function mathRNG() { + for (var i = 0, r; i < 16; i++) { + if ((i & 0x03) === 0) r = Math.random() * 0x100000000; + rnds[i] = r >>> ((i & 0x03) << 3) & 0xff; + } + + return rnds; + }; +} + + +/***/ }), + +/***/ 9390: +/*!*******************************************************************!*\ + !*** ./node_modules/socketcluster-client/node_modules/uuid/v1.js ***! + \*******************************************************************/ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +var rng = __webpack_require__(/*! ./lib/rng */ 9341); +var bytesToUuid = __webpack_require__(/*! ./lib/bytesToUuid */ 4599); + +// **`v1()` - Generate time-based UUID** +// +// Inspired by https://github.com/LiosK/UUID.js +// and http://docs.python.org/library/uuid.html + +var _nodeId; +var _clockseq; + +// Previous uuid creation time +var _lastMSecs = 0; +var _lastNSecs = 0; + +// See https://github.com/broofa/node-uuid for API details +function v1(options, buf, offset) { + var i = buf && offset || 0; + var b = buf || []; + + options = options || {}; + var node = options.node || _nodeId; + var clockseq = options.clockseq !== undefined ? options.clockseq : _clockseq; + + // node and clockseq need to be initialized to random values if they're not + // specified. We do this lazily to minimize issues related to insufficient + // system entropy. See #189 + if (node == null || clockseq == null) { + var seedBytes = rng(); + if (node == null) { + // Per 4.5, create and 48-bit node id, (47 random bits + multicast bit = 1) + node = _nodeId = [ + seedBytes[0] | 0x01, + seedBytes[1], seedBytes[2], seedBytes[3], seedBytes[4], seedBytes[5] + ]; + } + if (clockseq == null) { + // Per 4.2.2, randomize (14 bit) clockseq + clockseq = _clockseq = (seedBytes[6] << 8 | seedBytes[7]) & 0x3fff; + } + } + + // UUID timestamps are 100 nano-second units since the Gregorian epoch, + // (1582-10-15 00:00). JSNumbers aren't precise enough for this, so + // time is handled internally as 'msecs' (integer milliseconds) and 'nsecs' + // (100-nanoseconds offset from msecs) since unix epoch, 1970-01-01 00:00. + var msecs = options.msecs !== undefined ? options.msecs : new Date().getTime(); + + // Per 4.2.1.2, use count of uuid's generated during the current clock + // cycle to simulate higher resolution clock + var nsecs = options.nsecs !== undefined ? options.nsecs : _lastNSecs + 1; + + // Time since last uuid creation (in msecs) + var dt = (msecs - _lastMSecs) + (nsecs - _lastNSecs)/10000; + + // Per 4.2.1.2, Bump clockseq on clock regression + if (dt < 0 && options.clockseq === undefined) { + clockseq = clockseq + 1 & 0x3fff; + } + + // Reset nsecs if clock regresses (new clockseq) or we've moved onto a new + // time interval + if ((dt < 0 || msecs > _lastMSecs) && options.nsecs === undefined) { + nsecs = 0; + } + + // Per 4.2.1.2 Throw error if too many uuids are requested + if (nsecs >= 10000) { + throw new Error('uuid.v1(): Can\'t create more than 10M uuids/sec'); + } + + _lastMSecs = msecs; + _lastNSecs = nsecs; + _clockseq = clockseq; + + // Per 4.1.4 - Convert from unix epoch to Gregorian epoch + msecs += 12219292800000; + + // `time_low` + var tl = ((msecs & 0xfffffff) * 10000 + nsecs) % 0x100000000; + b[i++] = tl >>> 24 & 0xff; + b[i++] = tl >>> 16 & 0xff; + b[i++] = tl >>> 8 & 0xff; + b[i++] = tl & 0xff; + + // `time_mid` + var tmh = (msecs / 0x100000000 * 10000) & 0xfffffff; + b[i++] = tmh >>> 8 & 0xff; + b[i++] = tmh & 0xff; + + // `time_high_and_version` + b[i++] = tmh >>> 24 & 0xf | 0x10; // include version + b[i++] = tmh >>> 16 & 0xff; + + // `clock_seq_hi_and_reserved` (Per 4.2.2 - include variant) + b[i++] = clockseq >>> 8 | 0x80; + + // `clock_seq_low` + b[i++] = clockseq & 0xff; + + // `node` + for (var n = 0; n < 6; ++n) { + b[i + n] = node[n]; + } + + return buf ? buf : bytesToUuid(b); +} + +module.exports = v1; + + +/***/ }), + +/***/ 7547: +/*!*******************************************************************!*\ + !*** ./node_modules/socketcluster-client/node_modules/uuid/v4.js ***! + \*******************************************************************/ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +var rng = __webpack_require__(/*! ./lib/rng */ 9341); +var bytesToUuid = __webpack_require__(/*! ./lib/bytesToUuid */ 4599); + +function v4(options, buf, offset) { + var i = buf && offset || 0; + + if (typeof(options) == 'string') { + buf = options === 'binary' ? new Array(16) : null; + options = null; + } + options = options || {}; + + var rnds = options.random || (options.rng || rng)(); + + // Per 4.4, set bits for version and `clock_seq_hi_and_reserved` + rnds[6] = (rnds[6] & 0x0f) | 0x40; + rnds[8] = (rnds[8] & 0x3f) | 0x80; + + // Copy bytes to buffer, if provided + if (buf) { + for (var ii = 0; ii < 16; ++ii) { + buf[i + ii] = rnds[ii]; + } + } + + return buf || bytesToUuid(rnds); +} + +module.exports = v4; + + +/***/ }), + +/***/ 410: +/*!****************************************************************************************************!*\ + !*** ./src/core/ts/background-scripts/background.js/contentScriptBergamotApiClientPortListener.ts ***! + \****************************************************************************************************/ +/***/ (function(__unused_webpack_module, exports, __webpack_require__) { + +"use strict"; + +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ +var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { + function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } + return new (P || (P = Promise))(function (resolve, reject) { + function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } + function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } + function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } + step((generator = generator.apply(thisArg, _arguments || [])).next()); + }); +}; +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.contentScriptBergamotApiClientPortListener = void 0; +const BergamotWasmApiClient_1 = __webpack_require__(/*! ./translation-api-clients/BergamotWasmApiClient */ 4222); +const BergamotRestApiClient_1 = __webpack_require__(/*! ./translation-api-clients/BergamotRestApiClient */ 484); +const config_1 = __webpack_require__(/*! ../../config */ 964); +// Currently it is possible build variants of the extension that uses the REST API - eg for performance testing / research +const bergamotApiClient = config_1.config.useBergamotRestApi + ? new BergamotRestApiClient_1.BergamotRestApiClient() + : new BergamotWasmApiClient_1.BergamotWasmApiClient(); +const contentScriptBergamotApiClientPortListener = (port) => { + if (port.name !== "port-from-content-script-bergamot-api-client") { + return; + } + port.onMessage.addListener(function (m) { + return __awaiter(this, void 0, void 0, function* () { + // console.debug("Message from content-script-bergamot-api-client:", {m}); + const { texts, from, to, requestId } = m; + try { + const results = yield bergamotApiClient.sendTranslationRequest(texts, from, to, (translationRequestProgress) => { + const translationRequestUpdate = { + translationRequestProgress, + requestId, + }; + port.postMessage({ + translationRequestUpdate, + }); + }); + // console.log({ results }); + const translationRequestUpdate = { + results, + requestId, + }; + port.postMessage({ + translationRequestUpdate, + }); + } + catch (err) { + if (err.message === "Attempt to postMessage on disconnected port") { + console.warn("Attempt to postMessage on disconnected port, but it is ok", err); + } + else { + console.info(`Caught exception/error in content script bergamot api client port listener:`, err); + // Make possibly unserializable errors serializable by only sending name, message and stack + let communicatedError; + if (err instanceof Error) { + const { name, message, stack } = err; + communicatedError = { name, message, stack }; + } + else { + communicatedError = err; + } + const translationRequestUpdate = { + error: communicatedError, + requestId, + }; + port.postMessage({ + translationRequestUpdate, + }); + } + } + }); + }); +}; +exports.contentScriptBergamotApiClientPortListener = contentScriptBergamotApiClientPortListener; + + +/***/ }), + +/***/ 220: +/*!********************************************************************************************!*\ + !*** ./src/core/ts/background-scripts/background.js/contentScriptFrameInfoPortListener.ts ***! + \********************************************************************************************/ +/***/ (function(__unused_webpack_module, exports) { + +"use strict"; + +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ +var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { + function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } + return new (P || (P = Promise))(function (resolve, reject) { + function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } + function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } + function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } + step((generator = generator.apply(thisArg, _arguments || [])).next()); + }); +}; +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.contentScriptFrameInfoPortListener = void 0; +const contentScriptFrameInfoPortListener = (port) => { + if (port.name !== "port-from-content-script-frame-info") { + return; + } + port.onMessage.addListener(function (m, senderPort) { + var _a, _b; + return __awaiter(this, void 0, void 0, function* () { + // console.debug("Message from port-from-content-script-frame-info:", {m}); + const { requestId } = m; + const frameInfo = { + windowId: (_a = senderPort.sender.tab) === null || _a === void 0 ? void 0 : _a.windowId, + tabId: (_b = senderPort.sender.tab) === null || _b === void 0 ? void 0 : _b.id, + frameId: senderPort.sender.frameId, + }; + try { + port.postMessage({ + requestId, + frameInfo, + }); + } + catch (err) { + if (err.message === "Attempt to postMessage on disconnected port") { + console.warn("Attempt to postMessage on disconnected port, but it is ok", err); + } + else { + throw err; + } + } + }); + }); +}; +exports.contentScriptFrameInfoPortListener = contentScriptFrameInfoPortListener; + + +/***/ }), + +/***/ 6047: +/*!********************************************************************************************************!*\ + !*** ./src/core/ts/background-scripts/background.js/contentScriptLanguageDetectorProxyPortListener.ts ***! + \********************************************************************************************************/ +/***/ (function(__unused_webpack_module, exports, __webpack_require__) { + +"use strict"; + +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ +var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { + function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } + return new (P || (P = Promise))(function (resolve, reject) { + function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } + function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } + function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } + step((generator = generator.apply(thisArg, _arguments || [])).next()); + }); +}; +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.contentScriptLanguageDetectorProxyPortListener = void 0; +const LanguageDetector_1 = __webpack_require__(/*! ./lib/LanguageDetector */ 7991); +const contentScriptLanguageDetectorProxyPortListener = (port) => { + if (port.name !== "port-from-content-script-language-detector-proxy") { + return; + } + port.onMessage.addListener(function (m) { + return __awaiter(this, void 0, void 0, function* () { + // console.debug("Message from content-script-language-detector-proxy:", { m }); + const { str, requestId } = m; + const results = yield LanguageDetector_1.LanguageDetector.detectLanguage({ text: str }); + // console.debug({ results }); + try { + port.postMessage({ + languageDetectorResults: { + results, + requestId, + }, + }); + } + catch (err) { + if (err.message === "Attempt to postMessage on disconnected port") { + console.warn("Attempt to postMessage on disconnected port, but it is ok", err); + } + else { + throw err; + } + } + }); + }); +}; +exports.contentScriptLanguageDetectorProxyPortListener = contentScriptLanguageDetectorProxyPortListener; + + +/***/ }), + +/***/ 7333: +/*!***********************************************************************************!*\ + !*** ./src/core/ts/background-scripts/background.js/lib/BergamotTranslatorAPI.ts ***! + \***********************************************************************************/ +/***/ (function(__unused_webpack_module, exports, __webpack_require__) { + +"use strict"; +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this file, + * You can obtain one at http://mozilla.org/MPL/2.0/. */ + +var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { + function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } + return new (P || (P = Promise))(function (resolve, reject) { + function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } + function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } + function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } + step((generator = generator.apply(thisArg, _arguments || [])).next()); + }); +}; +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.BergamotTranslatorAPI = exports.BergamotTranslatorAPIModelDownloadError = exports.BergamotTranslatorAPIModelLoadError = exports.BergamotTranslatorAPITranslationError = void 0; +const webextension_polyfill_ts_1 = __webpack_require__(/*! webextension-polyfill-ts */ 3624); +const nanoid_1 = __webpack_require__(/*! nanoid */ 350); +const config_1 = __webpack_require__(/*! ../../../config */ 964); +// Since Emscripten can handle heap growth, but not heap shrinkage, we +// need to refresh the worker after we've loaded/processed large models/translations +// in order to prevent unnecessary resident memory growth. +// +// These values define the cut-off estimated heap growth size and the idle +// timeout (in milliseconds) before destroying a worker. Once the heap growth +// is estimated to have exceeded a certain size, the worker is marked for +// destruction, and is terminated as soon as it has been idle for the +// given timeout. +// +// TODO: Update to reflect relevant checks for translation-related heap growth +// const FOO_LIMIT = X * 1024 * 1024; +const IDLE_TIMEOUT = 10 * 1000; +const WORKER_URL = webextension_polyfill_ts_1.browser.runtime.getURL(`translation-worker.js`); +class BergamotTranslatorAPITranslationError extends Error { + constructor() { + super(...arguments); + this.name = "BergamotTranslatorAPITranslationError"; + } +} +exports.BergamotTranslatorAPITranslationError = BergamotTranslatorAPITranslationError; +class BergamotTranslatorAPIModelLoadError extends Error { + constructor() { + super(...arguments); + this.name = "BergamotTranslatorAPIModelLoadError"; + } +} +exports.BergamotTranslatorAPIModelLoadError = BergamotTranslatorAPIModelLoadError; +class BergamotTranslatorAPIModelDownloadError extends Error { + constructor() { + super(...arguments); + this.name = "BergamotTranslatorAPIModelDownloadError"; + } +} +exports.BergamotTranslatorAPIModelDownloadError = BergamotTranslatorAPIModelDownloadError; +/** + * Class responsible for instantiating and communicating between this script + * and the translation worker process. + */ +class WorkerManager { + constructor() { + this.pendingRequests = new Map(); + // Holds the ID of the current pending idle cleanup setTimeout. + this._idleTimeout = null; + } + // private estimatedHeapGrowth: number; + loadModel(loadModelRequestWorkerMessage, onModelDownloadProgress) { + return __awaiter(this, void 0, void 0, function* () { + const worker = yield this.workerReady; + const loadModelResults = yield new Promise((resolve, reject) => { + const { requestId } = loadModelRequestWorkerMessage; + this.pendingRequests.set(requestId, { + resolve, + reject, + onModelDownloadProgress, + }); + worker.postMessage(loadModelRequestWorkerMessage); + }); + // TODO: Update estimatedHeapGrowth + this.checkEstimatedHeapGrowth(); + return loadModelResults; + }); + } + translate(translateRequestWorkerMessage) { + return __awaiter(this, void 0, void 0, function* () { + const worker = yield this.workerReady; + const translationResults = yield new Promise((resolve, reject) => { + const { requestId } = translateRequestWorkerMessage; + this.pendingRequests.set(requestId, { resolve, reject }); + worker.postMessage(translateRequestWorkerMessage); + }); + // TODO: Update estimatedHeapGrowth + this.checkEstimatedHeapGrowth(); + return translationResults; + }); + } + /** + * Triggers after we have our asynchronous result from the worker. + */ + checkEstimatedHeapGrowth() { + /* + // Determine if our input was large enough to trigger heap growth, + // or if we're already waiting to destroy the worker when it's + // idle. If so, schedule termination after the idle timeout. + if (this.estimatedHeapGrowth >= FOO_LIMIT || this._idleTimeout !== null) { + this.flushWorker(); + } + */ + } + onLoadModelResults(loadModelResultsWorkerMessage) { + const { requestId, loadModelResults } = loadModelResultsWorkerMessage; + this.pendingRequests.get(requestId).resolve(loadModelResults); + } + onTranslateWorkerResult(translationResultsWorkerMessage) { + const { requestId, translationResults } = translationResultsWorkerMessage; + this.pendingRequests.get(requestId).resolve(translationResults); + } + onModelDownloadProgress(modelDownloadProgressWorkerMessage) { + const { requestId, modelDownloadProgress, } = modelDownloadProgressWorkerMessage; + this.pendingRequests + .get(requestId) + .onModelDownloadProgress(modelDownloadProgress); + } + onError(errorWorkerMessage) { + const { requestId, message, errorSource } = errorWorkerMessage; + const apiErrorMessage = `Error event occurred during ${errorSource} in worker (requestId=${requestId}): ${message}`; + let error; + if (errorSource === "loadModel") { + error = new BergamotTranslatorAPIModelLoadError(apiErrorMessage); + } + else if (errorSource === "downloadModel") { + error = new BergamotTranslatorAPIModelDownloadError(apiErrorMessage); + } + else if (errorSource === "translate") { + error = new BergamotTranslatorAPITranslationError(apiErrorMessage); + } + else { + error = new Error(apiErrorMessage); + } + this.pendingRequests.get(requestId).reject(error); + } + get workerReady() { + if (!this._workerReadyPromise) { + this._workerReadyPromise = new Promise((resolve, reject) => { + const worker = new Worker(WORKER_URL); + worker.onerror = err => { + console.warn("Worker onerror callback fired", err); + reject(err); + }; + worker.onmessage = (msg) => { + // console.debug("Incoming message from worker", { msg }); + if (msg.data === "ready") { + resolve(worker); + } + else if (msg.data.type === "loadModelResults") { + this.onLoadModelResults(msg.data); + } + else if (msg.data.type === "translationResults") { + this.onTranslateWorkerResult(msg.data); + } + else if (msg.data.type === "modelDownloadProgress") { + this.onModelDownloadProgress(msg.data); + } + else if (msg.data.type === "log") { + console.log(`Relayed log message from worker: ${msg.data.message}`); + } + else if (msg.data.type === "error") { + this.onError(msg.data); + } + else { + throw new Error("Unknown worker message payload"); + } + }; + this._worker = worker; + }); + } + return this._workerReadyPromise; + } + // Schedule the current worker to be terminated after the idle timeout. + flushWorker() { + if (this._idleTimeout !== null) { + clearTimeout(this._idleTimeout); + } + this._idleTimeout = setTimeout(this._flushWorker.bind(this), IDLE_TIMEOUT); + } + // Immediately terminate the worker, as long as there no pending + // results. Otherwise, reschedule termination until after the next + // idle timeout. + _flushWorker() { + if (this.pendingRequests.size) { + this.flushWorker(); + } + else { + if (this._worker) { + this._worker.terminate(); + } + this._worker = null; + this._workerReadyPromise = null; + this._idleTimeout = null; + } + } +} +const workerManager = new WorkerManager(); +const translationPerformanceStats = (texts, translationWallTimeMs) => { + const seconds = translationWallTimeMs / 1000; + const textCount = texts.length; + const wordCount = texts + .map(text => text + .trim() + .split(" ") + .filter(word => word.trim() !== "").length) + .reduce((a, b) => a + b, 0); + const characterCount = texts + .map(text => text.trim().length) + .reduce((a, b) => a + b, 0); + const wordsPerSecond = Math.round(wordCount / seconds); + const charactersPerSecond = Math.round(characterCount / seconds); + return { + seconds, + textCount, + wordCount, + characterCount, + wordsPerSecond, + charactersPerSecond, + }; +}; +/** + * Class responsible for sending translations requests to the translation worker process + * in a compatible and somewhat efficient order. + * Emits events that can be used to track translation progress at a low level. + */ +class TranslationRequestDispatcher extends EventTarget { + constructor() { + super(...arguments); + this.queuedRequests = []; + this.queuedRequestsByRequestId = new Map(); + } + processQueue() { + return __awaiter(this, void 0, void 0, function* () { + if (this.processing) { + return; + } + this.processing = true; + while (this.queuedRequests.length) { + console.info(`Processing translation request queue of ${this.queuedRequests.length} requests`); + yield this.processNextItemInQueue(); + } + this.processing = false; + }); + } + processNextItemInQueue() { + return __awaiter(this, void 0, void 0, function* () { + // Shift the next request off the queue + const translateRequestWorkerMessage = this.queuedRequests.shift(); + const { translateParams, requestId } = translateRequestWorkerMessage; + try { + const { loadModelParams } = translateParams; + const { from, to } = loadModelParams; + const languagePair = `${from}${to}`; + // First check if we need to load a model + if (!this.loadedLanguagePair || + this.loadedLanguagePair !== languagePair) { + const modelWillLoadEventData = { + requestId, + loadModelParams, + }; + this.dispatchEvent(new CustomEvent("modelWillLoad", { + detail: modelWillLoadEventData, + })); + const loadModelRequestWorkerMessage = { + type: "loadModel", + requestId, + loadModelParams, + }; + const loadModelResults = yield workerManager.loadModel(loadModelRequestWorkerMessage, (modelDownloadProgress) => { + const modelDownloadProgressEventData = { + requestId, + modelDownloadProgress, + }; + this.dispatchEvent(new CustomEvent("modelDownloadProgress", { + detail: modelDownloadProgressEventData, + })); + }); + this.loadedLanguagePair = languagePair; + const modelLoadedEventData = { + requestId, + loadModelParams, + loadModelResults, + }; + this.dispatchEvent(new CustomEvent("modelLoaded", { + detail: modelLoadedEventData, + })); + } + // Send the translation request + const start = performance.now(); + const translationResults = yield workerManager.translate(translateRequestWorkerMessage); + // Summarize performance stats + const end = performance.now(); + const translationWallTimeMs = end - start; + const originalTextsTranslationPerformanceStats = translationPerformanceStats(translationResults.originalTexts, translationWallTimeMs); + const translationFinishedEventData = { + requestId, + translationWallTimeMs, + originalTextsTranslationPerformanceStats, + }; + this.dispatchEvent(new CustomEvent("translationFinished", { + detail: translationFinishedEventData, + })); + // Resolve the translation request + this.queuedRequestsByRequestId.get(requestId).resolve(translationResults); + } + catch (error) { + // Reject the translation request + this.queuedRequestsByRequestId.get(requestId).reject(error); + } + }); + } + translate(requestId, texts, from, to) { + const loadModelParams = { + from, + to, + bergamotModelsBaseUrl: config_1.config.bergamotModelsBaseUrl, + }; + const translateParams = { + texts, + loadModelParams, + }; + const translateRequestWorkerMessage = { + type: "translate", + requestId, + translateParams, + }; + this.queuedRequests.push(translateRequestWorkerMessage); + const queueLength = this.queuedRequests.length + (this.processing ? 1 : 0); + const translationRequestQueuedEventData = { + requestId, + queueLength, + }; + this.dispatchEvent(new CustomEvent("translationRequestQueued", { + detail: translationRequestQueuedEventData, + })); + const requestPromise = new Promise((resolve, reject) => { + this.queuedRequestsByRequestId.set(requestId, { resolve, reject }); + }); + // Kick off queue processing async + /* eslint-disable no-unused-vars */ + this.processQueue().then(_r => void 0); + /* eslint-enable no-unused-vars */ + // Return the promise that resolves when the in-scope translation request resolves + return requestPromise; + } +} +const translationRequestDispatcher = new TranslationRequestDispatcher(); +/** + * Provide a simpler public interface (compared to above) + */ +exports.BergamotTranslatorAPI = { + translate(texts, from, to, onTranslationRequestQueued, onModelWillLoad, onModelDownloadProgress, onModelLoaded, onTranslationFinished) { + return __awaiter(this, void 0, void 0, function* () { + const requestId = nanoid_1.nanoid(); + const translationRequestQueuedListener = (e) => { + // console.debug('Listener received "translationRequestQueued".', e.detail); + if (e.detail.requestId !== requestId) { + return; + } + translationRequestDispatcher.removeEventListener("translationRequestQueued", translationRequestQueuedListener); + if (e.detail.queueLength > 1) { + console.info(`BergamotTranslatorAPI[${requestId}]: Queued translation request to be processed after ${e + .detail.queueLength - 1} already queued requests`); + } + else { + console.info(`BergamotTranslatorAPI[${requestId}]: Queued translation request for immediate execution`); + } + onTranslationRequestQueued(e.detail); + }; + const modelWillLoadListener = (e) => { + // console.debug('Listener received "modelWillLoad".', e.detail); + if (e.detail.requestId !== requestId) { + return; + } + translationRequestDispatcher.removeEventListener("modelWillLoad", modelWillLoadListener); + const languagePair = `${from}${to}`; + console.info(`BergamotTranslatorAPI[${requestId}]: Model ${languagePair} will load`); + onModelWillLoad(e.detail); + }; + const modelDownloadProgressListener = (e) => { + // console.debug('Listener received "modelDownloadProgress".', e.detail); + if (e.detail.requestId !== requestId) { + return; + } + const languagePair = `${from}${to}`; + const { modelDownloadProgress } = e.detail; + console.info(`BergamotTranslatorAPI[${requestId}]: Model ${languagePair} download progress: `, `${languagePair}: onDownloadProgressUpdate - ${Math.round((modelDownloadProgress.bytesDownloaded / + modelDownloadProgress.bytesToDownload) * + 100)}% out of ${Math.round((modelDownloadProgress.bytesToDownload / 1024 / 1024) * 10) / 10} mb downloaded`, { modelDownloadProgress }); + onModelDownloadProgress(e.detail); + }; + const modelLoadedListener = (e) => { + // console.debug('Listener received "modelLoaded".', e.detail); + if (e.detail.requestId !== requestId) { + return; + } + translationRequestDispatcher.removeEventListener("modelLoaded", modelLoadedListener); + const { loadModelResults } = e.detail; + const languagePair = `${from}${to}`; + const { modelLoadWallTimeMs } = loadModelResults; + console.info(`BergamotTranslatorAPI[${requestId}]: Model ${languagePair} loaded in ${modelLoadWallTimeMs / + 1000} secs`); + onModelLoaded(e.detail); + }; + const translationFinishedListener = (e) => { + // console.debug('Listener received "translationFinished".', e.detail); + if (e.detail.requestId !== requestId) { + return; + } + translationRequestDispatcher.removeEventListener("translationFinished", translationFinishedListener); + const { originalTextsTranslationPerformanceStats } = e.detail; + const { wordCount, seconds, wordsPerSecond, } = originalTextsTranslationPerformanceStats; + console.info(`BergamotTranslatorAPI[${requestId}]: Translation of ${texts.length} texts (wordCount ${wordCount}) took ${seconds} secs (${wordsPerSecond} words per second)`); + onTranslationFinished(e.detail); + }; + try { + // console.debug(`Adding listeners for request id ${requestId}`); + translationRequestDispatcher.addEventListener("translationRequestQueued", translationRequestQueuedListener); + translationRequestDispatcher.addEventListener("modelWillLoad", modelWillLoadListener); + translationRequestDispatcher.addEventListener("modelDownloadProgress", modelDownloadProgressListener); + translationRequestDispatcher.addEventListener("modelLoaded", modelLoadedListener); + translationRequestDispatcher.addEventListener("translationFinished", translationFinishedListener); + const requestPromise = translationRequestDispatcher.translate(requestId, texts, from, to); + const [translationResults] = yield Promise.all([ + requestPromise, + ]); + return translationResults; + } + finally { + translationRequestDispatcher.removeEventListener("translationRequestQueued", translationRequestQueuedListener); + translationRequestDispatcher.removeEventListener("modelWillLoad", modelWillLoadListener); + translationRequestDispatcher.removeEventListener("modelDownloadProgress", modelDownloadProgressListener); + translationRequestDispatcher.removeEventListener("modelLoaded", modelLoadedListener); + translationRequestDispatcher.removeEventListener("translationFinished", translationFinishedListener); + } + }); + }, +}; + + +/***/ }), + +/***/ 7991: +/*!******************************************************************************!*\ + !*** ./src/core/ts/background-scripts/background.js/lib/LanguageDetector.ts ***! + \******************************************************************************/ +/***/ (function(__unused_webpack_module, exports, __webpack_require__) { + +"use strict"; + +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this file, + * You can obtain one at http://mozilla.org/MPL/2.0/. */ +var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { + function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } + return new (P || (P = Promise))(function (resolve, reject) { + function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } + function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } + function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } + step((generator = generator.apply(thisArg, _arguments || [])).next()); + }); +}; +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.LanguageDetector = void 0; +const webextension_polyfill_ts_1 = __webpack_require__(/*! webextension-polyfill-ts */ 3624); +// Since Emscripten can handle heap growth, but not heap shrinkage, we +// need to refresh the worker after we've processed a particularly large +// string in order to prevent unnecessary resident memory growth. +// +// These values define the cut-off string length and the idle timeout +// (in milliseconds) before destroying a worker. Once a string of the +// maximum size has been processed, the worker is marked for +// destruction, and is terminated as soon as it has been idle for the +// given timeout. +// +// 1.5MB. This is the approximate string length that forces heap growth +// for a 2MB heap. +const LARGE_STRING = 1.5 * 1024 * 1024; +const IDLE_TIMEOUT = 10 * 1000; +const WORKER_URL = webextension_polyfill_ts_1.browser.runtime.getURL(`wasm/cld-worker.js`); +const workerManager = { + // TODO: Make into a map instead to avoid the implicit assumption that the order of requests and results are the same + detectionQueue: [], + detectLanguage(params) { + return __awaiter(this, void 0, void 0, function* () { + const worker = yield this.workerReady; + const result = yield new Promise(resolve => { + this.detectionQueue.push({ resolve }); + worker.postMessage(params); + }); + // We have our asynchronous result from the worker. + // + // Determine if our input was large enough to trigger heap growth, + // or if we're already waiting to destroy the worker when it's + // idle. If so, schedule termination after the idle timeout. + if (params.text.length >= LARGE_STRING || this._idleTimeout !== null) { + this.flushWorker(); + } + return result; + }); + }, + onDetectLanguageWorkerResult(detectedLanguageResults) { + this.detectionQueue.shift().resolve(detectedLanguageResults); + }, + _worker: null, + _workerReadyPromise: null, + get workerReady() { + if (!this._workerReadyPromise) { + this._workerReadyPromise = new Promise(resolve => { + const worker = new Worker(WORKER_URL); + worker.onmessage = msg => { + if (msg.data === "ready") { + resolve(worker); + } + else { + this.onDetectLanguageWorkerResult(msg.data); + } + }; + this._worker = worker; + }); + } + return this._workerReadyPromise; + }, + // Holds the ID of the current pending idle cleanup setTimeout. + _idleTimeout: null, + // Schedule the current worker to be terminated after the idle timeout. + flushWorker() { + if (this._idleTimeout !== null) { + clearTimeout(this._idleTimeout); + } + this._idleTimeout = setTimeout(this._flushWorker.bind(this), IDLE_TIMEOUT); + }, + // Immediately terminate the worker, as long as there no pending + // results. Otherwise, reschedule termination until after the next + // idle timeout. + _flushWorker() { + if (this.detectionQueue.length) { + this.flushWorker(); + } + else { + if (this._worker) { + this._worker.terminate(); + } + this._worker = null; + this._workerReadyPromise = null; + this._idleTimeout = null; + } + }, +}; +exports.LanguageDetector = { + /** + * Detect the language of a given string. + * + * The argument may be either a string containing the text to analyze, + * or an object with the following properties: + * + * - 'text' The text to analyze. + * + * - 'isHTML' (optional) A boolean, indicating whether the text + * should be analyzed as HTML rather than plain text. + * + * - 'language' (optional) A string indicating the expected language. + * For text extracted from HTTP documents, this is expected to + * come from the Content-Language header. + * + * - 'tld' (optional) A string indicating the top-level domain of the + * document the text was extracted from. + * + * - 'encoding' (optional) A string describing the encoding of the + * document the string was extracted from. Note that, regardless + * of the value of this property, the 'text' property must be a + * UTF-16 JavaScript string. + * + * @returns {Promise} + * @resolves When detection is finished, with a object containing + * these fields: + * - 'language' (string with a language code) + * - 'confident' (boolean) Whether the detector is confident of the + * result. + * - 'languages' (array) An array of up to three elements, containing + * the most prevalent languages detected. It contains a + * 'languageCode' property, containing the ISO language code of + * the language, and a 'percent' property, describing the + * approximate percentage of the input which is in that language. + * For text of an unknown language, the result may contain an + * entry with the language code 'un', indicating the percent of + * the text which is unknown. + */ + detectLanguage(params) { + return __awaiter(this, void 0, void 0, function* () { + if (typeof params === "string") { + params = { text: params }; + } + return workerManager.detectLanguage(params); + }); + }, +}; + + +/***/ }), + +/***/ 5692: +/*!*************************************************************************************!*\ + !*** ./src/core/ts/background-scripts/background.js/lib/translateAllFramesInTab.ts ***! + \*************************************************************************************/ +/***/ (function(__unused_webpack_module, exports, __webpack_require__) { + +"use strict"; + +var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { + function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } + return new (P || (P = Promise))(function (resolve, reject) { + function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } + function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } + function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } + step((generator = generator.apply(thisArg, _arguments || [])).next()); + }); +}; +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.translateAllFramesInTab = void 0; +const mobx_1 = __webpack_require__(/*! mobx */ 9637); +const BaseTranslationState_1 = __webpack_require__(/*! ../../../shared-resources/models/BaseTranslationState */ 4779); +const mobx_keystone_1 = __webpack_require__(/*! mobx-keystone */ 7680); +const Telemetry_1 = __webpack_require__(/*! ../telemetry/Telemetry */ 647); +const translateAllFramesInTab = (tabId, from, to, extensionState) => __awaiter(void 0, void 0, void 0, function* () { + // Start timing + const start = performance.now(); + // Request translation of all frames in a specific tab + extensionState.requestTranslationOfAllFramesInTab(tabId, from, to); + // Wait for translation in all frames in tab to complete + yield mobx_1.when(() => { + const { tabTranslationStates } = extensionState; + const currentTabTranslationState = tabTranslationStates.get(tabId); + return (currentTabTranslationState && + [BaseTranslationState_1.TranslationStatus.TRANSLATED, BaseTranslationState_1.TranslationStatus.ERROR].includes(currentTabTranslationState.translationStatus)); + }); + // End timing + const end = performance.now(); + const timeToFullPageTranslatedMs = end - start; + const { tabTranslationStates } = extensionState; + const currentTabTranslationState = mobx_keystone_1.getSnapshot(tabTranslationStates.get(tabId)); + const { totalModelLoadWallTimeMs, totalTranslationEngineRequestCount, totalTranslationWallTimeMs, wordCount, translationStatus, modelDownloadProgress, } = currentTabTranslationState; + if (translationStatus === BaseTranslationState_1.TranslationStatus.TRANSLATED) { + // Record "translation attempt concluded" telemetry + const timeToFullPageTranslatedSeconds = timeToFullPageTranslatedMs / 1000; + const timeToFullPageTranslatedWordsPerSecond = Math.round(wordCount / timeToFullPageTranslatedSeconds); + const translationEngineTimeMs = totalTranslationWallTimeMs; + const translationEngineWordsPerSecond = Math.round(wordCount / (translationEngineTimeMs / 1000)); + const modelDownloadTimeMs = modelDownloadProgress.durationMs || 0; + const modelLoadTimeMs = totalModelLoadWallTimeMs; + const unaccountedTranslationTimeMs = timeToFullPageTranslatedMs - + modelDownloadTimeMs - + modelLoadTimeMs - + translationEngineTimeMs; + console.info(`Translation of the full page in tab with id ${tabId} (${wordCount} words) took ${timeToFullPageTranslatedSeconds} secs (perceived as ${timeToFullPageTranslatedWordsPerSecond} words per second) across ${totalTranslationEngineRequestCount} translation engine requests (which took ${totalTranslationWallTimeMs / + 1000} seconds, operating at ${translationEngineWordsPerSecond} words per second). Model loading took ${modelLoadTimeMs / + 1000} seconds, after spending ${modelDownloadTimeMs / 1000} seconds ${modelDownloadProgress.bytesToDownload === 0 + ? "hydrating" + : "downloading and persisting"} model files. The remaining ${unaccountedTranslationTimeMs / + 1000} seconds where spent elsewhere.`); + Telemetry_1.telemetry.onTranslationFinished(tabId, from, to, timeToFullPageTranslatedMs, timeToFullPageTranslatedWordsPerSecond, modelDownloadTimeMs, modelLoadTimeMs, translationEngineTimeMs, translationEngineWordsPerSecond); + } + else { + // TODO: Record error telemetry + } +}); +exports.translateAllFramesInTab = translateAllFramesInTab; + + +/***/ }), + +/***/ 805: +/*!************************************************************************************************************!*\ + !*** ./src/core/ts/background-scripts/background.js/state-management/MobxKeystoneBackgroundContextHost.ts ***! + \************************************************************************************************************/ +/***/ (function(__unused_webpack_module, exports, __webpack_require__) { + +"use strict"; + +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ +var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { + function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } + return new (P || (P = Promise))(function (resolve, reject) { + function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } + function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } + function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } + step((generator = generator.apply(thisArg, _arguments || [])).next()); + }); +}; +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.MobxKeystoneBackgroundContextHost = void 0; +const webextension_polyfill_ts_1 = __webpack_require__(/*! webextension-polyfill-ts */ 3624); +const mobx_keystone_1 = __webpack_require__(/*! mobx-keystone */ 7680); +const ErrorReporting_1 = __webpack_require__(/*! ../../../shared-resources/ErrorReporting */ 3345); +const DocumentTranslationState_1 = __webpack_require__(/*! ../../../shared-resources/models/DocumentTranslationState */ 5482); +const TranslateOwnTextTranslationState_1 = __webpack_require__(/*! ../../../shared-resources/models/TranslateOwnTextTranslationState */ 8238); +// If we don't import and use all relevant models here, we can't reference models in this build +// Ref: https://github.com/xaviergonz/mobx-keystone/issues/183 +DocumentTranslationState_1.DocumentTranslationState; +TranslateOwnTextTranslationState_1.TranslateOwnTextTranslationState; +// disable runtime data checking (we rely on TypeScript at compile time so that our model definitions can be cleaner) +mobx_keystone_1.setGlobalConfig({ + modelAutoTypeChecking: mobx_keystone_1.ModelAutoTypeCheckingMode.AlwaysOff, +}); +class MobxKeystoneBackgroundContextHost { + constructor() { + this.connectedPorts = []; + } + init(backgroundContextRootStore) { + let actionIsBeingAppliedForPropagationToContentScripts = false; + // Set up a connection / listener for the mobx-keystone-proxy + // allowing state changes to be sent from content scripts + this.mobxKeystoneProxyPortListener = port => { + if (port.name !== "port-from-mobx-keystone-proxy") { + return; + } + this.connectedPorts.push(port); + port.onMessage.addListener((m) => __awaiter(this, void 0, void 0, function* () { + // console.debug("Message from mobx-keystone-proxy:", { m }); + const { requestInitialState, actionCall, requestId } = m; + if (requestInitialState) { + const initialState = mobx_keystone_1.getSnapshot(backgroundContextRootStore); + // console.debug({ initialState }); + port.postMessage({ + initialState, + requestId, + }); + return; + } + if (actionCall) { + const _ = actionIsBeingAppliedForPropagationToContentScripts; + actionIsBeingAppliedForPropagationToContentScripts = true; + this.handleLocallyCancelledActionCall(actionCall, backgroundContextRootStore); + actionIsBeingAppliedForPropagationToContentScripts = _; + return; + } + ErrorReporting_1.captureExceptionWithExtras(new Error("Unexpected message"), { m }); + console.error("Unexpected message", { m }); + })); + port.onDisconnect.addListener(($port) => { + const existingPortIndex = this.connectedPorts.findIndex(p => p === $port); + this.connectedPorts.splice(existingPortIndex, 1); + }); + }; + webextension_polyfill_ts_1.browser.runtime.onConnect.addListener(this.mobxKeystoneProxyPortListener); + // Set up a listener for local (background context) actions to be replicated to content scripts + // in the same way that actions stemming from content scripts do + mobx_keystone_1.onActionMiddleware(backgroundContextRootStore, { + onStart: (actionCall, ctx) => { + if (!actionIsBeingAppliedForPropagationToContentScripts) { + // if the action comes from the background context cancel it silently + // and send resubmit it in the same way that content script actions are treated + // it will then be replicated by the server (background context) and properly executed everywhere + const serializedActionCall = mobx_keystone_1.serializeActionCall(actionCall, backgroundContextRootStore); + this.handleLocallyCancelledActionCall(serializedActionCall, backgroundContextRootStore); + ctx.data.cancelled = true; // just for logging purposes + // "cancel" the action by returning undefined + return { + result: mobx_keystone_1.ActionTrackingResult.Return, + value: undefined, + }; + } + // run actions that are being applied for propagation to content scripts unmodified + /* eslint-disable consistent-return */ + return undefined; + /* eslint-enable consistent-return */ + }, + }); + } + handleLocallyCancelledActionCall(serializedActionCall, backgroundContextRootStore) { + // apply the action over the server root store + // sometimes applying actions might fail (for example on invalid operations + // such as when one client asks to delete a model from an array and other asks to mutate it) + // so we try / catch it + let serializedActionCallToReplicate; + try { + // apply the action on the background context side and keep track of new model IDs being + // generated, so the clients will have the chance to keep those in sync + const applyActionResult = mobx_keystone_1.applySerializedActionAndTrackNewModelIds(backgroundContextRootStore, serializedActionCall); + serializedActionCallToReplicate = applyActionResult.serializedActionCall; + } + catch (err) { + console.error("Error applying action to server:", err); + } + if (serializedActionCallToReplicate) { + this.propagateActionToContentScripts(serializedActionCallToReplicate); + } + } + propagateActionToContentScripts(serializedActionCallToReplicate) { + // and distribute message, which includes new model IDs to keep them in sync + this.connectedPorts.forEach($port => { + try { + $port.postMessage({ + serializedActionCallToReplicate, + }); + } + catch (err) { + if (err.message === "Attempt to postMessage on disconnected port") { + console.warn("Attempt to postMessage on disconnected port, but it is ok", err); + } + else { + throw err; + } + } + }); + } +} +exports.MobxKeystoneBackgroundContextHost = MobxKeystoneBackgroundContextHost; + + +/***/ }), + +/***/ 4517: +/*!********************************************************************************!*\ + !*** ./src/core/ts/background-scripts/background.js/state-management/Store.ts ***! + \********************************************************************************/ +/***/ (function(__unused_webpack_module, exports, __webpack_require__) { + +"use strict"; + +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ +var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { + function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } + return new (P || (P = Promise))(function (resolve, reject) { + function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } + function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } + function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } + step((generator = generator.apply(thisArg, _arguments || [])).next()); + }); +}; +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.Store = void 0; +const nanoid_1 = __webpack_require__(/*! nanoid */ 350); +const webextension_polyfill_ts_1 = __webpack_require__(/*! webextension-polyfill-ts */ 3624); +class Store { + constructor(localStorageWrapper) { + this.get = (_keys) => __awaiter(this, void 0, void 0, function* () { return ({}); }); + this.set = (_items) => __awaiter(this, void 0, void 0, function* () { }); + this.initialExtensionPreferences = () => __awaiter(this, void 0, void 0, function* () { + return { + enableErrorReporting: false, + hidePrivacySummaryBanner: false, + extensionInstallationErrorReportingId: "", + extensionInstallationId: "", + extensionVersion: "", + }; + }); + /** + * Returns a persistent unique identifier of the extension installation + * sent with each report. Not related to the Firefox client id + */ + this.extensionInstallationId = () => __awaiter(this, void 0, void 0, function* () { + const { extensionInstallationId } = yield this.get("extensionInstallationId"); + if (extensionInstallationId) { + return extensionInstallationId; + } + const generatedId = nanoid_1.nanoid(); + yield this.set({ extensionInstallationId: generatedId }); + return generatedId; + }); + /** + * Returns a persistent unique identifier of the extension installation + * sent with each error report. Not related to the Firefox client id + * nor the extension installation id that identifies shared data. + */ + this.extensionInstallationErrorReportingId = () => __awaiter(this, void 0, void 0, function* () { + const { extensionInstallationErrorReportingId } = yield this.get("extensionInstallationErrorReportingId"); + if (extensionInstallationErrorReportingId) { + return extensionInstallationErrorReportingId; + } + const generatedId = nanoid_1.nanoid(); + yield this.set({ extensionInstallationErrorReportingId: generatedId }); + return generatedId; + }); + this.getExtensionPreferences = () => __awaiter(this, void 0, void 0, function* () { + const { extensionPreferences } = yield this.get("extensionPreferences"); + return Object.assign(Object.assign(Object.assign({}, (yield this.initialExtensionPreferences())), extensionPreferences), { + // The following are not editable extension preferences, but attributes + // that we want to display on the extension preferences dialog and/or + // add as context in error reports + extensionInstallationErrorReportingId: yield this.extensionInstallationErrorReportingId(), + extensionInstallationId: yield this.extensionInstallationId(), + extensionVersion: webextension_polyfill_ts_1.browser.runtime.getManifest().version, + }); + }); + this.setExtensionPreferences = (extensionPreferences) => __awaiter(this, void 0, void 0, function* () { + yield this.set({ extensionPreferences }); + }); + this.get = localStorageWrapper.get; + this.set = localStorageWrapper.set; + } +} +exports.Store = Store; + + +/***/ }), + +/***/ 6432: +/*!*****************************************************************************************************!*\ + !*** ./src/core/ts/background-scripts/background.js/state-management/connectRootStoreToDevTools.ts ***! + \*****************************************************************************************************/ +/***/ (function(__unused_webpack_module, exports, __webpack_require__) { + +"use strict"; + +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ +var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } }); +}) : (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + o[k2] = m[k]; +})); +var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { + Object.defineProperty(o, "default", { enumerable: true, value: v }); +}) : function(o, v) { + o["default"] = v; +}); +var __importStar = (this && this.__importStar) || function (mod) { + if (mod && mod.__esModule) return mod; + var result = {}; + if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k); + __setModuleDefault(result, mod); + return result; +}; +var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { + function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } + return new (P || (P = Promise))(function (resolve, reject) { + function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } + function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } + function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } + step((generator = generator.apply(thisArg, _arguments || [])).next()); + }); +}; +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.connectRootStoreToDevTools = void 0; +const mobx_keystone_1 = __webpack_require__(/*! mobx-keystone */ 7680); +function connectRootStoreToDevTools(rootStore) { + return __awaiter(this, void 0, void 0, function* () { + // connect the store to the redux dev tools + // (different ports for different build variants developed simultaneously) + const { default: remotedev } = yield Promise.resolve().then(() => __importStar(__webpack_require__(/*! remotedev */ 9607))); + const port = process.env.REMOTE_DEV_SERVER_PORT; + console.info(`Connecting the background store to the Redux dev tools on port ${port}`); + const connection = remotedev.connectViaExtension({ + name: `Background Context (Port ${port})`, + realtime: true, + port, + }); + mobx_keystone_1.connectReduxDevTools(remotedev, connection, rootStore); + }); +} +exports.connectRootStoreToDevTools = connectRootStoreToDevTools; + + +/***/ }), + +/***/ 8911: +/*!***********************************************************************************************************!*\ + !*** ./src/core/ts/background-scripts/background.js/state-management/createBackgroundContextRootStore.ts ***! + \***********************************************************************************************************/ +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + +"use strict"; + +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.createBackgroundContextRootStore = void 0; +const mobx_keystone_1 = __webpack_require__(/*! mobx-keystone */ 7680); +const ExtensionState_1 = __webpack_require__(/*! ../../../shared-resources/models/ExtensionState */ 65); +// enable runtime data checking even in production mode +mobx_keystone_1.setGlobalConfig({ + modelAutoTypeChecking: mobx_keystone_1.ModelAutoTypeCheckingMode.AlwaysOn, +}); +function createBackgroundContextRootStore() { + // the parameter is the initial data for the model + const rootStore = new ExtensionState_1.ExtensionState({}); + // recommended by mobx-keystone (allows the model hook `onAttachedToRootStore` to work and other goodies) + mobx_keystone_1.registerRootStore(rootStore); + return rootStore; +} +exports.createBackgroundContextRootStore = createBackgroundContextRootStore; + + +/***/ }), + +/***/ 5813: +/*!**********************************************************************************************!*\ + !*** ./src/core/ts/background-scripts/background.js/state-management/localStorageWrapper.ts ***! + \**********************************************************************************************/ +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + +"use strict"; + +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.localStorageWrapper = void 0; +const webextension_polyfill_ts_1 = __webpack_require__(/*! webextension-polyfill-ts */ 3624); +exports.localStorageWrapper = { + get: webextension_polyfill_ts_1.browser.storage.local.get, + set: webextension_polyfill_ts_1.browser.storage.local.set, +}; + + +/***/ }), + +/***/ 647: +/*!*****************************************************************************!*\ + !*** ./src/core/ts/background-scripts/background.js/telemetry/Telemetry.ts ***! + \*****************************************************************************/ +/***/ (function(__unused_webpack_module, exports, __webpack_require__) { + +"use strict"; + +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ +var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { + function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } + return new (P || (P = Promise))(function (resolve, reject) { + function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } + function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } + function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } + step((generator = generator.apply(thisArg, _arguments || [])).next()); + }); +}; +var __importDefault = (this && this.__importDefault) || function (mod) { + return (mod && mod.__esModule) ? mod : { "default": mod }; +}; +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.telemetry = exports.Telemetry = void 0; +const webext_1 = __importDefault(__webpack_require__(/*! @mozilla/glean/webext */ 6902)); +const pings_1 = __webpack_require__(/*! ./generated/pings */ 3177); +const config_1 = __webpack_require__(/*! ../../../config */ 964); +const performance_1 = __webpack_require__(/*! ./generated/performance */ 1714); +const metadata_1 = __webpack_require__(/*! ./generated/metadata */ 9085); +const infobar_1 = __webpack_require__(/*! ./generated/infobar */ 2457); +const service_1 = __webpack_require__(/*! ./generated/service */ 7659); +const errors_1 = __webpack_require__(/*! ./generated/errors */ 5352); +const webextension_polyfill_ts_1 = __webpack_require__(/*! webextension-polyfill-ts */ 3624); +const bergamot_translator_version_1 = __webpack_require__(/*! ../../../web-worker-scripts/translation-worker.js/bergamot-translator-version */ 8471); +/** + * This class contains general telemetry initialization and helper code and synchronous telemetry-recording functions. + * + * Synchronous methods here is important, since it is the only way to guarantee that multiple Glean API calls are + * executed sequentially and not interleaved with other asynchronous Telemetry recording. + * For more information, see: https://github.com/mozilla-extensions/bergamot-browser-extension/pull/76#discussion_r602128568 + * + * Glean.js guarantees zero exceptions, but our glue code or specific way of invoking Glean.js may result in exceptions. + * For this reason we surround all code invoking Glean.js in try/catch blocks. + * + * Pings are grouped by tab id and submitted on specific triggers (see below), or after 1 minute of inactivity. + * + * The "1 minute" period can be overridden to facilitate testing by setting + * the telemetryInactivityThresholdInSecondsOverride string argument at initialization. + * + * Submit triggers: + * 1. Regular translation: infobar displayed -> translated pressed -> translation finished or error -> submit + * 2. Switch language: infobar displayed -> switch source or target lang -> submit (further actions will be submitted in translation scenario) + * 3. Reject: infobar displayed -> press never, not now or close -> submit + * 4. No action: infobar displayed -> no action -> submit on timer after a period of inactivity. + * 5. Language pair unsupported -> submit + */ +class Telemetry { + constructor() { + this.queuedRecordingsByTabId = {}; + this.inactivityDispatchTimersByTabId = {}; + /** + * Submits all collected metrics in a custom ping. + */ + this.queueRecording = (telemetryRecordingFunction, tabId) => { + if (!this.initialized) { + console.warn("Telemetry: ignoring ping that was submitted before Telemetry was initialized"); + return; + } + const tabIdString = String(tabId); + if (!this.queuedRecordingsByTabId[tabIdString]) { + this.queuedRecordingsByTabId[tabIdString] = []; + } + this.queuedRecordingsByTabId[tabIdString].push(telemetryRecordingFunction); + console.info(`Telemetry: Queued a recording in tab ${tabId}`); + }; + this.updateInactivityTimerForTab = (tabId) => { + const tabIdString = String(tabId); + this.clearInactivityTimerForTab(tabId); + // Submit queued recordings after a period of inactivity + this.inactivityDispatchTimersByTabId[tabIdString] = setTimeout(() => { + this.submitQueuedRecordings(tabIdString); + }, this.telemetryInactivityThresholdInSeconds * 1000); + // console.debug(`Telemetry: Inactivity timer ${this.inactivityDispatchTimersByTabId[tabIdString]} for tab ${tabId} set to fire in ${this.telemetryInactivityThresholdInSeconds} seconds.`, new Error()) + }; + this.updateInactivityTimerForAllTabs = () => { + Object.keys(this.queuedRecordingsByTabId).forEach((tabId) => { + this.updateInactivityTimerForTab(tabId); + }); + }; + this.clearInactivityTimerForTab = (tabId) => { + const tabIdString = String(tabId); + if (this.inactivityDispatchTimersByTabId[tabIdString]) { + // console.debug(`Telemetry: Inactivity timer ${this.inactivityDispatchTimersByTabId[tabIdString]} for tab ${tabId} cleared.`) + clearTimeout(this.inactivityDispatchTimersByTabId[tabIdString]); + delete this.inactivityDispatchTimersByTabId[tabIdString]; + } + }; + } + initialize(uploadEnabled, $firefoxClientId, telemetryInactivityThresholdInSecondsOverride) { + const appId = config_1.config.telemetryAppId; + this.setFirefoxClientId($firefoxClientId); + const manifest = webextension_polyfill_ts_1.browser.runtime.getManifest(); + this.extensionVersion = manifest.version; + try { + webext_1.default.initialize(appId, uploadEnabled, { + debug: { logPings: config_1.config.telemetryDebugMode }, + }); + this.telemetryInactivityThresholdInSeconds = telemetryInactivityThresholdInSecondsOverride + ? telemetryInactivityThresholdInSecondsOverride + : 60; + console.info(`Telemetry: initialization completed with application ID ${appId}. Inactivity threshold is set to ${this.telemetryInactivityThresholdInSeconds} seconds.`); + this.initialized = true; + } + catch (err) { + console.error(`Telemetry initialization error`, err); + } + } + uploadEnabledPreferenceUpdated(uploadEnabled) { + console.log("Telemetry: communicating updated uploadEnabled preference to Glean.js", { uploadEnabled }); + webext_1.default.setUploadEnabled(uploadEnabled); + } + setFirefoxClientId($firefoxClientId) { + this.firefoxClientId = $firefoxClientId; + } + setTranslationRelevantFxTelemetryMetrics(translationRelevantFxTelemetryMetrics) { + this.translationRelevantFxTelemetryMetrics = translationRelevantFxTelemetryMetrics; + } + recordCommonMetadata(from, to) { + metadata_1.fromLang.set(from); + metadata_1.toLang.set(to); + metadata_1.firefoxClientId.set(this.firefoxClientId); + metadata_1.extensionVersion.set(this.extensionVersion); + metadata_1.extensionBuildId.set(config_1.config.extensionBuildId.substring(0, 100)); + metadata_1.bergamotTranslatorVersion.set(bergamot_translator_version_1.BERGAMOT_VERSION_FULL); + if (this.translationRelevantFxTelemetryMetrics) { + const { systemMemoryMb, systemCpuCount, systemCpuCores, systemCpuVendor, systemCpuFamily, systemCpuModel, systemCpuStepping, systemCpuL2cacheKB, systemCpuL3cacheKB, systemCpuSpeedMhz, systemCpuExtensions, } = this.translationRelevantFxTelemetryMetrics; + metadata_1.systemMemory.set(systemMemoryMb); + metadata_1.cpuCount.set(systemCpuCount); + metadata_1.cpuCoresCount.set(systemCpuCores); + metadata_1.cpuVendor.set(systemCpuVendor); + metadata_1.cpuFamily.set(systemCpuFamily); + metadata_1.cpuModel.set(systemCpuModel); + metadata_1.cpuStepping.set(systemCpuStepping); + metadata_1.cpuL2Cache.set(systemCpuL2cacheKB); + metadata_1.cpuL3Cache.set(systemCpuL3cacheKB); + metadata_1.cpuSpeed.set(systemCpuSpeedMhz); + metadata_1.cpuExtensions.set(systemCpuExtensions.join(",")); + } + } + onInfoBarDisplayed(tabId, from, to) { + this.queueRecording(() => { + infobar_1.displayed.record(); + this.recordCommonMetadata(from, to); + }, tabId); + this.updateInactivityTimerForAllTabs(); + } + onSelectTranslateFrom(tabId, newFrom, to) { + this.queueRecording(() => { + infobar_1.changeLang.record(); + this.recordCommonMetadata(newFrom, to); + }, tabId); + this.submitQueuedRecordings(tabId); + } + onSelectTranslateTo(tabId, from, newTo) { + this.queueRecording(() => { + infobar_1.changeLang.record(); + this.recordCommonMetadata(from, newTo); + }, tabId); + this.submitQueuedRecordings(tabId); + } + onInfoBarClosed(tabId, from, to) { + this.queueRecording(() => { + infobar_1.closed.record(); + this.recordCommonMetadata(from, to); + }, tabId); + this.submitQueuedRecordings(tabId); + } + onNeverTranslateSelectedLanguage(tabId, from, to) { + this.queueRecording(() => { + infobar_1.neverTranslateLang.record(); + this.recordCommonMetadata(from, to); + }, tabId); + this.updateInactivityTimerForAllTabs(); + } + onNeverTranslateThisSite(tabId, from, to) { + this.queueRecording(() => { + infobar_1.neverTranslateSite.record(); + this.recordCommonMetadata(from, to); + }, tabId); + this.updateInactivityTimerForAllTabs(); + } + onShowOriginalButtonPressed(tabId, _from, _to) { + this.updateInactivityTimerForAllTabs(); + // TODO? + } + onShowTranslatedButtonPressed(tabId, _from, _to) { + this.updateInactivityTimerForAllTabs(); + // TODO? + } + onTranslateButtonPressed(tabId, from, to) { + this.queueRecording(() => { + infobar_1.translate.record(); + this.recordCommonMetadata(from, to); + }, tabId); + this.updateInactivityTimerForAllTabs(); + } + onNotNowButtonPressed(tabId, from, to) { + this.queueRecording(() => { + infobar_1.notNow.record(); + this.recordCommonMetadata(from, to); + }, tabId); + this.updateInactivityTimerForAllTabs(); + } + /** + * A translation attempt starts when a translation is requested in a + * specific tab and ends when all translations in that tab has completed + */ + onTranslationFinished(tabId, from, to, timeToFullPageTranslatedMs, timeToFullPageTranslatedWordsPerSecond, modelDownloadTimeMs, modelLoadTimeMs, translationEngineTimeMs, translationEngineWordsPerSecond) { + this.queueRecording(() => { + performance_1.fullPageTranslatedTime.setRawNanos(timeToFullPageTranslatedMs * 1000000); + performance_1.fullPageTranslatedWps.set(timeToFullPageTranslatedWordsPerSecond); + performance_1.modelDownloadTimeNum.setRawNanos(modelDownloadTimeMs * 1000000); + performance_1.modelLoadTimeNum.setRawNanos(modelLoadTimeMs * 1000000); + performance_1.translationEngineTime.setRawNanos(translationEngineTimeMs * 1000000); + performance_1.translationEngineWps.set(translationEngineWordsPerSecond); + this.recordCommonMetadata(from, to); + }, tabId); + this.submitQueuedRecordings(tabId); + } + onTranslationStatusOffer(tabId, from, to) { + this.queueRecording(() => { + service_1.langMismatch.add(1); + this.recordCommonMetadata(from, to); + }, tabId); + this.updateInactivityTimerForAllTabs(); + } + onTranslationStatusTranslationUnsupported(tabId, from, to) { + this.queueRecording(() => { + service_1.notSupported.add(1); + this.recordCommonMetadata(from, to); + }, tabId); + this.updateInactivityTimerForAllTabs(); + } + onModelLoadErrorOccurred(tabId, from, to) { + this.submitQueuedRecordings(tabId); + // TODO? + } + onModelDownloadErrorOccurred(tabId, from, to) { + this.queueRecording(() => { + errors_1.modelDownload.add(1); + this.recordCommonMetadata(from, to); + }, tabId); + this.submitQueuedRecordings(tabId); + } + onTranslationErrorOccurred(tabId, from, to) { + this.queueRecording(() => { + errors_1.translation.add(1); + this.recordCommonMetadata(from, to); + }, tabId); + this.submitQueuedRecordings(tabId); + } + onOtherErrorOccurred(tabId, from, to) { + this.submitQueuedRecordings(tabId); + // TODO? + } + submitQueuedRecordings(tabId) { + const tabIdString = String(tabId); + const recordings = this + .queuedRecordingsByTabId[tabIdString]; + if (recordings.length === 0) { + // console.debug(`Telemetry: Submit of 0 recordings from tab ${tabId} requested. Ignoring.`) + return; + } + delete this.queuedRecordingsByTabId[tabIdString]; + this.queuedRecordingsByTabId[tabIdString] = []; + this.clearInactivityTimerForTab(tabId); + try { + recordings.forEach(telemetryRecordingFunction => { + telemetryRecordingFunction(); + }); + pings_1.custom.submit(); + console.info(`Telemetry: A ping based on ${recordings.length} recordings for tab ${tabId} have been dispatched to Glean.js`); + } + catch (err) { + console.error(`Telemetry dispatch error`, err); + } + } + cleanup() { + return __awaiter(this, void 0, void 0, function* () { + // Cancel ongoing timers + Object.keys(this.inactivityDispatchTimersByTabId).forEach((tabId) => { + this.clearInactivityTimerForTab(tabId); + }); + // Make sure to send buffered telemetry events + Object.keys(this.queuedRecordingsByTabId).forEach((tabId) => { + this.submitQueuedRecordings(tabId); + }); + }); + } +} +exports.Telemetry = Telemetry; +// Expose singleton instances +exports.telemetry = new Telemetry(); + + +/***/ }), + +/***/ 5352: +/*!************************************************************************************!*\ + !*** ./src/core/ts/background-scripts/background.js/telemetry/generated/errors.ts ***! + \************************************************************************************/ +/***/ (function(__unused_webpack_module, exports, __webpack_require__) { + +"use strict"; + +/* eslint-disable */ +var __importDefault = (this && this.__importDefault) || function (mod) { + return (mod && mod.__esModule) ? mod : { "default": mod }; +}; +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.modelDownload = exports.memory = exports.marian = exports.translation = void 0; +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ +// AUTOGENERATED BY glean_parser. DO NOT EDIT. DO NOT COMMIT. +const counter_1 = __importDefault(__webpack_require__(/*! @mozilla/glean/webext/private/metrics/counter */ 4429)); +/** + * The translation procedure has failed. + * + * Generated from `errors.translation`. + */ +exports.translation = new counter_1.default({ + category: "errors", + name: "translation", + sendInPings: ["custom"], + lifetime: "ping", + disabled: false, +}); +/** + * Marian code related error. + * + * Generated from `errors.marian`. + */ +exports.marian = new counter_1.default({ + category: "errors", + name: "marian", + sendInPings: ["custom"], + lifetime: "ping", + disabled: false, +}); +/** + * Memory allocation error. + * + * Generated from `errors.memory`. + */ +exports.memory = new counter_1.default({ + category: "errors", + name: "memory", + sendInPings: ["custom"], + lifetime: "ping", + disabled: false, +}); +/** + * Failed to download a model for a supported language pair. + * + * Generated from `errors.model_download`. + */ +exports.modelDownload = new counter_1.default({ + category: "errors", + name: "model_download", + sendInPings: ["custom"], + lifetime: "ping", + disabled: false, +}); + + +/***/ }), + +/***/ 2457: +/*!*************************************************************************************!*\ + !*** ./src/core/ts/background-scripts/background.js/telemetry/generated/infobar.ts ***! + \*************************************************************************************/ +/***/ (function(__unused_webpack_module, exports, __webpack_require__) { + +"use strict"; + +/* eslint-disable */ +var __importDefault = (this && this.__importDefault) || function (mod) { + return (mod && mod.__esModule) ? mod : { "default": mod }; +}; +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.changeLang = exports.notNow = exports.neverTranslateSite = exports.neverTranslateLang = exports.translate = exports.closed = exports.displayed = void 0; +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ +// AUTOGENERATED BY glean_parser. DO NOT EDIT. DO NOT COMMIT. +const event_1 = __importDefault(__webpack_require__(/*! @mozilla/glean/webext/private/metrics/event */ 4986)); +/** + * The translation infobar was automatically displayed in a browser. + * + * Generated from `infobar.displayed`. + */ +exports.displayed = new event_1.default({ + category: "infobar", + name: "displayed", + sendInPings: ["custom"], + lifetime: "ping", + disabled: false, +}, []); +/** + * The translation infobar was closed. + * + * Generated from `infobar.closed`. + */ +exports.closed = new event_1.default({ + category: "infobar", + name: "closed", + sendInPings: ["custom"], + lifetime: "ping", + disabled: false, +}, []); +/** + * The "Translate" button was pressed on translation infobar. + * + * Generated from `infobar.translate`. + */ +exports.translate = new event_1.default({ + category: "infobar", + name: "translate", + sendInPings: ["custom"], + lifetime: "ping", + disabled: false, +}, []); +/** + * "Never translate language" button in the infobar options was pressed. + * + * Generated from `infobar.never_translate_lang`. + */ +exports.neverTranslateLang = new event_1.default({ + category: "infobar", + name: "never_translate_lang", + sendInPings: ["custom"], + lifetime: "ping", + disabled: false, +}, []); +/** + * "Never translate site" button in the infobar options was pressed. + * + * Generated from `infobar.never_translate_site`. + */ +exports.neverTranslateSite = new event_1.default({ + category: "infobar", + name: "never_translate_site", + sendInPings: ["custom"], + lifetime: "ping", + disabled: false, +}, []); +/** + * "Not now" button on the infobar was pressed. + * + * Generated from `infobar.not_now`. + */ +exports.notNow = new event_1.default({ + category: "infobar", + name: "not_now", + sendInPings: ["custom"], + lifetime: "ping", + disabled: false, +}, []); +/** + * "This page is in" language was changed manually. + * + * Generated from `infobar.change_lang`. + */ +exports.changeLang = new event_1.default({ + category: "infobar", + name: "change_lang", + sendInPings: ["custom"], + lifetime: "ping", + disabled: false, +}, []); + + +/***/ }), + +/***/ 9085: +/*!**************************************************************************************!*\ + !*** ./src/core/ts/background-scripts/background.js/telemetry/generated/metadata.ts ***! + \**************************************************************************************/ +/***/ (function(__unused_webpack_module, exports, __webpack_require__) { + +"use strict"; + +/* eslint-disable */ +var __importDefault = (this && this.__importDefault) || function (mod) { + return (mod && mod.__esModule) ? mod : { "default": mod }; +}; +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.cpuExtensions = exports.cpuSpeed = exports.cpuL3Cache = exports.cpuL2Cache = exports.cpuStepping = exports.cpuModel = exports.cpuFamily = exports.cpuVendor = exports.cpuCoresCount = exports.cpuCount = exports.systemMemory = exports.bergamotTranslatorVersion = exports.extensionBuildId = exports.extensionVersion = exports.firefoxClientId = exports.toLang = exports.fromLang = void 0; +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ +// AUTOGENERATED BY glean_parser. DO NOT EDIT. DO NOT COMMIT. +const quantity_1 = __importDefault(__webpack_require__(/*! @mozilla/glean/webext/private/metrics/quantity */ 6120)); +const string_1 = __importDefault(__webpack_require__(/*! @mozilla/glean/webext/private/metrics/string */ 5799)); +/** + * Translation source language. + * + * Generated from `metadata.from_lang`. + */ +exports.fromLang = new string_1.default({ + category: "metadata", + name: "from_lang", + sendInPings: ["custom"], + lifetime: "ping", + disabled: false, +}); +/** + * Translation target language. + * + * Generated from `metadata.to_lang`. + */ +exports.toLang = new string_1.default({ + category: "metadata", + name: "to_lang", + sendInPings: ["custom"], + lifetime: "ping", + disabled: false, +}); +/** + * Firefox Telemetry client id. + * + * Generated from `metadata.firefox_client_id`. + */ +exports.firefoxClientId = new string_1.default({ + category: "metadata", + name: "firefox_client_id", + sendInPings: ["custom"], + lifetime: "ping", + disabled: false, +}); +/** + * Extension version + * + * Generated from `metadata.extension_version`. + */ +exports.extensionVersion = new string_1.default({ + category: "metadata", + name: "extension_version", + sendInPings: ["custom"], + lifetime: "ping", + disabled: false, +}); +/** + * Extension build id, indicating which git revision + * and build config was used to produce this build + * + * Generated from `metadata.extension_build_id`. + */ +exports.extensionBuildId = new string_1.default({ + category: "metadata", + name: "extension_build_id", + sendInPings: ["custom"], + lifetime: "ping", + disabled: false, +}); +/** + * Bergamot translator engine version + * + * Generated from `metadata.bergamot_translator_version`. + */ +exports.bergamotTranslatorVersion = new string_1.default({ + category: "metadata", + name: "bergamot_translator_version", + sendInPings: ["custom"], + lifetime: "ping", + disabled: false, +}); +/** + * Telemetry Environment `system.memoryMB` metric + * + * Generated from `metadata.system_memory`. + */ +exports.systemMemory = new quantity_1.default({ + category: "metadata", + name: "system_memory", + sendInPings: ["custom"], + lifetime: "ping", + disabled: false, +}); +/** + * Telemetry Environment `system.cpu.count` metric + * + * Generated from `metadata.cpu_count`. + */ +exports.cpuCount = new quantity_1.default({ + category: "metadata", + name: "cpu_count", + sendInPings: ["custom"], + lifetime: "ping", + disabled: false, +}); +/** + * Telemetry Environment `system.cpu.cores` metric + * + * Generated from `metadata.cpu_cores_count`. + */ +exports.cpuCoresCount = new quantity_1.default({ + category: "metadata", + name: "cpu_cores_count", + sendInPings: ["custom"], + lifetime: "ping", + disabled: false, +}); +/** + * Telemetry Environment `system.cpu.vendor` metric + * + * Generated from `metadata.cpu_vendor`. + */ +exports.cpuVendor = new string_1.default({ + category: "metadata", + name: "cpu_vendor", + sendInPings: ["custom"], + lifetime: "ping", + disabled: false, +}); +/** + * Telemetry Environment `system.cpu.family` metric + * + * Generated from `metadata.cpu_family`. + */ +exports.cpuFamily = new string_1.default({ + category: "metadata", + name: "cpu_family", + sendInPings: ["custom"], + lifetime: "ping", + disabled: false, +}); +/** + * Telemetry Environment `system.cpu.model` metric + * + * Generated from `metadata.cpu_model`. + */ +exports.cpuModel = new string_1.default({ + category: "metadata", + name: "cpu_model", + sendInPings: ["custom"], + lifetime: "ping", + disabled: false, +}); +/** + * Telemetry Environment `system.cpu.stepping` metric + * + * Generated from `metadata.cpu_stepping`. + */ +exports.cpuStepping = new string_1.default({ + category: "metadata", + name: "cpu_stepping", + sendInPings: ["custom"], + lifetime: "ping", + disabled: false, +}); +/** + * Telemetry Environment `system.cpu.l2cacheKB` metric + * + * Generated from `metadata.cpu_l2_cache`. + */ +exports.cpuL2Cache = new quantity_1.default({ + category: "metadata", + name: "cpu_l2_cache", + sendInPings: ["custom"], + lifetime: "ping", + disabled: false, +}); +/** + * Telemetry Environment `system.cpu.l3cacheKB` metric + * + * Generated from `metadata.cpu_l3_cache`. + */ +exports.cpuL3Cache = new quantity_1.default({ + category: "metadata", + name: "cpu_l3_cache", + sendInPings: ["custom"], + lifetime: "ping", + disabled: false, +}); +/** + * Telemetry Environment `system.cpu.speedMHz` metric + * + * Generated from `metadata.cpu_speed`. + */ +exports.cpuSpeed = new quantity_1.default({ + category: "metadata", + name: "cpu_speed", + sendInPings: ["custom"], + lifetime: "ping", + disabled: false, +}); +/** + * Telemetry Environment `system.cpu.extensions` metric + * + * Generated from `metadata.cpu_extensions`. + */ +exports.cpuExtensions = new string_1.default({ + category: "metadata", + name: "cpu_extensions", + sendInPings: ["custom"], + lifetime: "ping", + disabled: false, +}); + + +/***/ }), + +/***/ 1714: +/*!*****************************************************************************************!*\ + !*** ./src/core/ts/background-scripts/background.js/telemetry/generated/performance.ts ***! + \*****************************************************************************************/ +/***/ (function(__unused_webpack_module, exports, __webpack_require__) { + +"use strict"; + +/* eslint-disable */ +var __importDefault = (this && this.__importDefault) || function (mod) { + return (mod && mod.__esModule) ? mod : { "default": mod }; +}; +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.translationQuality = exports.translationEngineWps = exports.translationEngineTime = exports.modelLoadTimeNum = exports.modelDownloadTimeNum = exports.fullPageTranslatedWps = exports.fullPageTranslatedTime = void 0; +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ +// AUTOGENERATED BY glean_parser. DO NOT EDIT. DO NOT COMMIT. +const timespan_1 = __importDefault(__webpack_require__(/*! @mozilla/glean/webext/private/metrics/timespan */ 4498)); +const quantity_1 = __importDefault(__webpack_require__(/*! @mozilla/glean/webext/private/metrics/quantity */ 6120)); +const string_1 = __importDefault(__webpack_require__(/*! @mozilla/glean/webext/private/metrics/string */ 5799)); +/** + * Timing from "translation button pressed" + * to "full page is translated". + * + * Generated from `performance.full_page_translated_time`. + */ +exports.fullPageTranslatedTime = new timespan_1.default({ + category: "performance", + name: "full_page_translated_time", + sendInPings: ["custom"], + lifetime: "ping", + disabled: false, +}, "millisecond"); +/** + * Speed of the translation from "translation button + * pressed" to "full page is translated". + * + * Generated from `performance.full_page_translated_wps`. + */ +exports.fullPageTranslatedWps = new quantity_1.default({ + category: "performance", + name: "full_page_translated_wps", + sendInPings: ["custom"], + lifetime: "ping", + disabled: false, +}); +/** + * Time spent on downloading a translation model for a language pair. + * (Renamed from model_download_time to model_download_time_num as part of + * changing type from string to quantity) + * + * Generated from `performance.model_download_time_num`. + */ +exports.modelDownloadTimeNum = new timespan_1.default({ + category: "performance", + name: "model_download_time_num", + sendInPings: ["custom"], + lifetime: "ping", + disabled: false, +}, "millisecond"); +/** + * Time spent on loading a model into memory to start translation. + * (Renamed from model_load_time to model_load_time_num as part of + * changing type from string to quantity) + * + * Generated from `performance.model_load_time_num`. + */ +exports.modelLoadTimeNum = new timespan_1.default({ + category: "performance", + name: "model_load_time_num", + sendInPings: ["custom"], + lifetime: "ping", + disabled: false, +}, "millisecond"); +/** + * Time spent on translation by the translation engine. + * + * Generated from `performance.translation_engine_time`. + */ +exports.translationEngineTime = new timespan_1.default({ + category: "performance", + name: "translation_engine_time", + sendInPings: ["custom"], + lifetime: "ping", + disabled: false, +}, "millisecond"); +/** + * Speed of translation as measured by the translation engine. + * + * Generated from `performance.translation_engine_wps`. + */ +exports.translationEngineWps = new quantity_1.default({ + category: "performance", + name: "translation_engine_wps", + sendInPings: ["custom"], + lifetime: "ping", + disabled: false, +}); +/** + * Quality estimation of translation. + * + * Generated from `performance.translation_quality`. + */ +exports.translationQuality = new string_1.default({ + category: "performance", + name: "translation_quality", + sendInPings: ["custom"], + lifetime: "ping", + disabled: false, +}); + + +/***/ }), + +/***/ 3177: +/*!***********************************************************************************!*\ + !*** ./src/core/ts/background-scripts/background.js/telemetry/generated/pings.ts ***! + \***********************************************************************************/ +/***/ (function(__unused_webpack_module, exports, __webpack_require__) { + +"use strict"; + +/* eslint-disable */ +var __importDefault = (this && this.__importDefault) || function (mod) { + return (mod && mod.__esModule) ? mod : { "default": mod }; +}; +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.custom = void 0; +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ +// AUTOGENERATED BY glean_parser. DO NOT EDIT. DO NOT COMMIT. +const ping_1 = __importDefault(__webpack_require__(/*! @mozilla/glean/webext/private/ping */ 2455)); +/** + * A custom ping, sending time is fully controlled by the application. + * + * Generated from `custom`. + */ +exports.custom = new ping_1.default({ + includeClientId: true, + sendIfEmpty: false, + name: "custom", + reasonCodes: [], +}); + + +/***/ }), + +/***/ 7659: +/*!*************************************************************************************!*\ + !*** ./src/core/ts/background-scripts/background.js/telemetry/generated/service.ts ***! + \*************************************************************************************/ +/***/ (function(__unused_webpack_module, exports, __webpack_require__) { + +"use strict"; + +/* eslint-disable */ +var __importDefault = (this && this.__importDefault) || function (mod) { + return (mod && mod.__esModule) ? mod : { "default": mod }; +}; +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.langMismatch = exports.notSupported = void 0; +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ +// AUTOGENERATED BY glean_parser. DO NOT EDIT. DO NOT COMMIT. +const counter_1 = __importDefault(__webpack_require__(/*! @mozilla/glean/webext/private/metrics/counter */ 4429)); +/** + * Language pair of user and website languages is not supported. + * + * Generated from `service.not_supported`. + */ +exports.notSupported = new counter_1.default({ + category: "service", + name: "not_supported", + sendInPings: ["custom"], + lifetime: "ping", + disabled: false, +}); +/** + * The user and website languages do not match. + * + * Generated from `service.lang_mismatch`. + */ +exports.langMismatch = new counter_1.default({ + category: "service", + name: "lang_mismatch", + sendInPings: ["custom"], + lifetime: "ping", + disabled: false, +}); + + +/***/ }), + +/***/ 484: +/*!*******************************************************************************************************!*\ + !*** ./src/core/ts/background-scripts/background.js/translation-api-clients/BergamotRestApiClient.ts ***! + \*******************************************************************************************************/ +/***/ (function(__unused_webpack_module, exports, __webpack_require__) { + +"use strict"; + +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ +var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { + function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } + return new (P || (P = Promise))(function (resolve, reject) { + function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } + function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } + function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } + step((generator = generator.apply(thisArg, _arguments || [])).next()); + }); +}; +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.BergamotRestApiClient = void 0; +const config_1 = __webpack_require__(/*! ../../../config */ 964); +const MS_IN_A_MINUTE = 60 * 1000; +// https://stackoverflow.com/a/57888548/682317 +const fetchWithTimeout = (url, ms, options = {}) => { + const controller = new AbortController(); + const promise = fetch(url, Object.assign({ signal: controller.signal }, options)); + const timeout = setTimeout(() => controller.abort(), ms); + return promise.finally(() => clearTimeout(timeout)); +}; +class BergamotRestApiClient { + constructor(requestTimeoutMs = null) { + /** + * Timeout after which we consider a ping submission failed. + */ + this.requestTimeoutMs = 1.5 * MS_IN_A_MINUTE; + /** + * See https://github.com/browsermt/mts/wiki/BergamotAPI + */ + this.composeSubmitRequestPath = () => { + return `/api/bergamot/v1`; + }; + this.composeUrl = () => { + return `${config_1.config.bergamotRestApiUrl}${this.composeSubmitRequestPath()}`; + }; + this.sendTranslationRequest = (texts, _from, _to, _translationRequestProgressCallback) => __awaiter(this, void 0, void 0, function* () { + const payload = { + text: texts, + options: { + // "inputFormat": "wrappedText", + // "returnWordAlignment": true, + returnSentenceScore: true, + // "returnSoftAlignment": true, + // "returnQualityEstimate": true, + // "returnWordScores": true, + // "returnTokenization": true, + // "returnOriginal": true, + }, + }; + const dataResponse = yield fetchWithTimeout(this.composeUrl(), this.requestTimeoutMs, { + method: "POST", + headers: { + Accept: "application/json", + "Content-Type": "application/json; charset=UTF-8", + }, + body: JSON.stringify(payload), + }).catch((error) => __awaiter(this, void 0, void 0, function* () { + return Promise.reject(error); + })); + if (!dataResponse.ok) { + throw new Error("Data response failed"); + } + const parsedResponse = yield dataResponse.json(); + // console.log({ parsedResponse }); + const originalTexts = texts; + const translatedTexts = []; + const qeAnnotatedTranslatedTexts = []; + parsedResponse.text.map((paragraph) => { + const translationObjects = getBestTranslationObjectsOfEachSentenceInBergamotRestApiParagraph(paragraph); + // TODO: Currently the rest server doesn't retain the leading/trailing + // whitespace information of sentences. It is a bug on rest server side. + // Once it is fixed there, we need to stop appending whitespaces. + const separator = " "; + // Join sentence translations + const translatedPlainTextString = translationObjects + .map(({ translation }) => translation) + .join(separator); + translatedTexts.push(translatedPlainTextString); + // Generate QE Annotated HTML for each sentence + const qeAnnotatedSentenceHTMLs = translationObjects.map(({ translation, sentenceScore }) => generateQEAnnotatedHTML(translation, sentenceScore)); + const qeAnnotatedTranslatedMarkup = qeAnnotatedSentenceHTMLs.join(separator); + qeAnnotatedTranslatedTexts.push(qeAnnotatedTranslatedMarkup); + }); + return { + originalTexts, + translatedTexts, + qeAnnotatedTranslatedTexts, + }; + }); + if (requestTimeoutMs) { + this.requestTimeoutMs = requestTimeoutMs; + } + } +} +exports.BergamotRestApiClient = BergamotRestApiClient; +/** + * This function parses 'Paragraph' entity of the response for the + * the best translations and returns them + */ +function getBestTranslationObjectsOfEachSentenceInBergamotRestApiParagraph(paragraph) { + const bestTranslations = []; + paragraph[0].forEach(sentenceTranslationList => { + // Depending on the request, there might be multiple 'best translations'. + // We are fetching the best one (present in 'translation' field). + const bestTranslation = sentenceTranslationList.nBest[0]; + bestTranslations.push(bestTranslation); + }); + return bestTranslations; +} +/** + * This function generates the Quality Estimation annotated HTML of a string + * based on its score. + * + * @param translation input string + * @param score score of the input string + * @returns string QE annotated HTML of input string + */ +function generateQEAnnotatedHTML(translation, score) { + // Color choices and thresholds below are chosen based on intuitiveness. + // They will be changed according to the UI design of Translator once it + // is fixed. + let color; + if (score >= -0.2) { + color = "green"; + } + else if (score >= -0.5 && score < -0.2) { + color = "black"; + } + else if (score >= -0.8 && score < -0.5) { + color = "mediumvioletred"; + } + else { + color = "red"; + } + return ` ${translation}`; +} + + +/***/ }), + +/***/ 4222: +/*!*******************************************************************************************************!*\ + !*** ./src/core/ts/background-scripts/background.js/translation-api-clients/BergamotWasmApiClient.ts ***! + \*******************************************************************************************************/ +/***/ (function(__unused_webpack_module, exports, __webpack_require__) { + +"use strict"; + +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ +var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { + function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } + return new (P || (P = Promise))(function (resolve, reject) { + function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } + function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } + function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } + step((generator = generator.apply(thisArg, _arguments || [])).next()); + }); +}; +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.BergamotWasmApiClient = void 0; +const BergamotTranslatorAPI_1 = __webpack_require__(/*! ../lib/BergamotTranslatorAPI */ 7333); +class BergamotWasmApiClient { + constructor() { + this.sendTranslationRequest = (texts, from, to, translationRequestProgressCallback) => __awaiter(this, void 0, void 0, function* () { + if (typeof texts === "string") { + texts = [texts]; + } + const translationRequestProgress = { + requestId: undefined, + initiationTimestamp: Date.now(), + queued: false, + modelLoadNecessary: undefined, + modelDownloadNecessary: undefined, + modelDownloading: false, + modelDownloadProgress: undefined, + modelLoading: false, + modelLoaded: undefined, + modelLoadWallTimeMs: undefined, + translationFinished: false, + translationWallTimeMs: undefined, + errorOccurred: false, + }; + try { + const translationResults = yield BergamotTranslatorAPI_1.BergamotTranslatorAPI.translate(texts, from, to, (translationRequestQueuedEventData) => { + translationRequestProgress.requestId = + translationRequestQueuedEventData.requestId; + translationRequestProgress.queued = true; + translationRequestProgressCallback(Object.assign({}, translationRequestProgress)); + }, (_modelWillLoadEventData) => { + translationRequestProgress.modelLoadNecessary = true; + translationRequestProgress.modelLoading = true; + translationRequestProgressCallback(Object.assign({}, translationRequestProgress)); + }, (modelDownloadProgressEventData) => { + translationRequestProgress.modelDownloadNecessary = true; + translationRequestProgress.modelDownloading = + modelDownloadProgressEventData.modelDownloadProgress + .bytesDownloaded < + modelDownloadProgressEventData.modelDownloadProgress + .bytesToDownload; + translationRequestProgress.modelDownloadProgress = + modelDownloadProgressEventData.modelDownloadProgress; + translationRequestProgressCallback(Object.assign({}, translationRequestProgress)); + }, (modelLoadedEventData) => { + translationRequestProgress.modelLoading = false; + translationRequestProgress.modelDownloading = false; + translationRequestProgress.modelLoaded = true; + translationRequestProgress.modelLoadWallTimeMs = + modelLoadedEventData.loadModelResults.modelLoadWallTimeMs; + translationRequestProgressCallback(Object.assign({}, translationRequestProgress)); + }, (translationFinishedEventData) => { + translationRequestProgress.queued = false; + translationRequestProgress.translationFinished = true; + translationRequestProgress.translationWallTimeMs = + translationFinishedEventData.translationWallTimeMs; + translationRequestProgressCallback(Object.assign({}, translationRequestProgress)); + }); + console.log({ translationResults }); + return translationResults; + } + catch (error) { + translationRequestProgress.queued = false; + translationRequestProgress.translationFinished = false; + translationRequestProgress.errorOccurred = true; + translationRequestProgressCallback(Object.assign({}, translationRequestProgress)); + throw error; + } + }); + } +} +exports.BergamotWasmApiClient = BergamotWasmApiClient; + + +/***/ }), + +/***/ 8471: +/*!*********************************************************************************************!*\ + !*** ./src/core/ts/web-worker-scripts/translation-worker.js/bergamot-translator-version.ts ***! + \*********************************************************************************************/ +/***/ ((__unused_webpack_module, exports) => { + +"use strict"; + +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.BERGAMOT_VERSION_FULL = void 0; +exports.BERGAMOT_VERSION_FULL = "v0.3.1+d264450"; + + +/***/ }), + +/***/ 7983: +/*!***********************************************************************************************!*\ + !*** ./src/firefox-infobar-ui/ts/background-scripts/background.js/NativeTranslateUiBroker.ts ***! + \***********************************************************************************************/ +/***/ (function(__unused_webpack_module, exports, __webpack_require__) { + +"use strict"; + +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ +var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { + function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } + return new (P || (P = Promise))(function (resolve, reject) { + function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } + function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } + function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } + step((generator = generator.apply(thisArg, _arguments || [])).next()); + }); +}; +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.NativeTranslateUiBroker = void 0; +const LanguageSupport_1 = __webpack_require__(/*! ../../../../core/ts/shared-resources/LanguageSupport */ 5602); +const BaseTranslationState_1 = __webpack_require__(/*! ../../../../core/ts/shared-resources/models/BaseTranslationState */ 4779); +const Telemetry_1 = __webpack_require__(/*! ../../../../core/ts/background-scripts/background.js/telemetry/Telemetry */ 647); +const mobx_keystone_1 = __webpack_require__(/*! mobx-keystone */ 7680); +const mobx_1 = __webpack_require__(/*! mobx */ 9637); +const translateAllFramesInTab_1 = __webpack_require__(/*! ../../../../core/ts/background-scripts/background.js/lib/translateAllFramesInTab */ 5692); +/* eslint-disable no-unused-vars, no-shadow */ +// TODO: update typescript-eslint when support for this kind of declaration is supported +var NativeTranslateUiStateInfobarState; +(function (NativeTranslateUiStateInfobarState) { + NativeTranslateUiStateInfobarState[NativeTranslateUiStateInfobarState["STATE_OFFER"] = 0] = "STATE_OFFER"; + NativeTranslateUiStateInfobarState[NativeTranslateUiStateInfobarState["STATE_TRANSLATING"] = 1] = "STATE_TRANSLATING"; + NativeTranslateUiStateInfobarState[NativeTranslateUiStateInfobarState["STATE_TRANSLATED"] = 2] = "STATE_TRANSLATED"; + NativeTranslateUiStateInfobarState[NativeTranslateUiStateInfobarState["STATE_ERROR"] = 3] = "STATE_ERROR"; + NativeTranslateUiStateInfobarState[NativeTranslateUiStateInfobarState["STATE_UNAVAILABLE"] = 4] = "STATE_UNAVAILABLE"; +})(NativeTranslateUiStateInfobarState || (NativeTranslateUiStateInfobarState = {})); +const browserWithExperimentAPIs = browser; +class NativeTranslateUiBroker { + constructor(extensionState) { + this.extensionState = extensionState; + this.telemetryPreferencesEventsToObserve = [ + "onUploadEnabledPrefChange", + "onCachedClientIDPrefChange", + ]; + this.translateUiEventsToObserve = [ + "onInfoBarDisplayed", + "onSelectTranslateTo", + "onSelectTranslateFrom", + "onInfoBarClosed", + "onNeverTranslateSelectedLanguage", + "onNeverTranslateThisSite", + "onShowOriginalButtonPressed", + "onShowTranslatedButtonPressed", + "onTranslateButtonPressed", + "onNotNowButtonPressed", + ]; + } + start() { + return __awaiter(this, void 0, void 0, function* () { + // Current value of Telemetry preferences + const uploadEnabled = yield browserWithExperimentAPIs.experiments.telemetryPreferences.getUploadEnabledPref(); + const cachedClientID = yield browserWithExperimentAPIs.experiments.telemetryPreferences.getCachedClientIDPref(); + // Initialize telemetry + const telemetryInactivityThresholdInSecondsOverride = yield browserWithExperimentAPIs.experiments.extensionPreferences.getTelemetryInactivityThresholdInSecondsOverridePref(); + Telemetry_1.telemetry.initialize(uploadEnabled, cachedClientID, telemetryInactivityThresholdInSecondsOverride); + // The translationRelevantFxTelemetryMetrics gets available first once the telemetry environment has initialized + browserWithExperimentAPIs.experiments.telemetryEnvironment + .getTranslationRelevantFxTelemetryMetrics() + .then((translationRelevantFxTelemetryMetrics) => { + Telemetry_1.telemetry.setTranslationRelevantFxTelemetryMetrics(translationRelevantFxTelemetryMetrics); + }); + // Hook up experiment API events with listeners in this class + this.telemetryPreferencesEventsToObserve.map((eventRef) => { + browserWithExperimentAPIs.experiments.telemetryPreferences[eventRef].addListener(this[eventRef].bind(this)); + }); + this.translateUiEventsToObserve.map((eventRef) => { + browserWithExperimentAPIs.experiments.translateUi[eventRef].addListener(this[eventRef].bind(this)); + }); + yield browserWithExperimentAPIs.experiments.translateUi.start(); + const { summarizeLanguageSupport } = new LanguageSupport_1.LanguageSupport(); + // Boils down extension state to the subset relevant for the native translate ui + const nativeTranslateUiStateFromTabTranslationState = (tts) => __awaiter(this, void 0, void 0, function* () { + const infobarState = nativeTranslateUiStateInfobarStateFromTranslationStatus(tts.translationStatus); + const detectedLanguageResults = tts.detectedLanguageResults; + const { acceptedTargetLanguages, + // defaultSourceLanguage, + defaultTargetLanguage, supportedSourceLanguages, + // supportedTargetLanguagesGivenDefaultSourceLanguage, + allPossiblySupportedTargetLanguages, } = yield summarizeLanguageSupport(detectedLanguageResults); + const translationDurationMs = Date.now() - tts.translationInitiationTimestamp; + // Localized translation progress text + const { modelLoading, queuedTranslationEngineRequestCount, modelDownloading, modelDownloadProgress, } = tts; + let localizedTranslationProgressText; + if (modelDownloading) { + const showDetailedProgress = modelDownloadProgress && modelDownloadProgress.bytesDownloaded > 0; + const percentDownloaded = Math.round((modelDownloadProgress.bytesDownloaded / + modelDownloadProgress.bytesToDownload) * + 100); + const mbToDownload = Math.round((modelDownloadProgress.bytesToDownload / 1024 / 1024) * 10) / 10; + const localizedDetailedDownloadProgressText = browser.i18n.getMessage("detailedDownloadProgress", [percentDownloaded, mbToDownload]); + localizedTranslationProgressText = `(${browser.i18n.getMessage("currentlyDownloadingLanguageModel")}...${showDetailedProgress + ? ` ${localizedDetailedDownloadProgressText}` + : ``})`; + } + else if (modelLoading) { + localizedTranslationProgressText = `(${browser.i18n.getMessage("currentlyLoadingLanguageModel")}...)`; + } + else if (queuedTranslationEngineRequestCount > 0) { + // Using neutral plural form since there is no support for plural form in browser.i18n + localizedTranslationProgressText = `(${browser.i18n.getMessage("loadedLanguageModel")}. ${browser.i18n.getMessage("partsLeftToTranslate", queuedTranslationEngineRequestCount)})`; + } + else { + localizedTranslationProgressText = ""; + } + return { + acceptedTargetLanguages, + detectedLanguageResults, + // defaultSourceLanguage, + defaultTargetLanguage, + infobarState, + translatedFrom: tts.translateFrom, + translatedTo: tts.translateTo, + originalShown: tts.showOriginal, + // Additionally, since supported source and target languages are only supported in specific pairs, keep these dynamic: + supportedSourceLanguages, + supportedTargetLanguages: allPossiblySupportedTargetLanguages, + // Translation progress + modelDownloading, + translationDurationMs, + localizedTranslationProgressText, + }; + }); + const nativeTranslateUiStateInfobarStateFromTranslationStatus = (translationStatus) => { + switch (translationStatus) { + case BaseTranslationState_1.TranslationStatus.UNKNOWN: + return NativeTranslateUiStateInfobarState.STATE_UNAVAILABLE; + case BaseTranslationState_1.TranslationStatus.UNAVAILABLE: + return NativeTranslateUiStateInfobarState.STATE_UNAVAILABLE; + case BaseTranslationState_1.TranslationStatus.DETECTING_LANGUAGE: + return NativeTranslateUiStateInfobarState.STATE_UNAVAILABLE; + case BaseTranslationState_1.TranslationStatus.LANGUAGE_NOT_DETECTED: + return NativeTranslateUiStateInfobarState.STATE_OFFER; + case BaseTranslationState_1.TranslationStatus.SOURCE_LANGUAGE_UNDERSTOOD: + return NativeTranslateUiStateInfobarState.STATE_UNAVAILABLE; + case BaseTranslationState_1.TranslationStatus.TRANSLATION_UNSUPPORTED: + return NativeTranslateUiStateInfobarState.STATE_UNAVAILABLE; + case BaseTranslationState_1.TranslationStatus.OFFER: + return NativeTranslateUiStateInfobarState.STATE_OFFER; + case BaseTranslationState_1.TranslationStatus.DOWNLOADING_TRANSLATION_MODEL: + case BaseTranslationState_1.TranslationStatus.TRANSLATING: + return NativeTranslateUiStateInfobarState.STATE_TRANSLATING; + case BaseTranslationState_1.TranslationStatus.TRANSLATED: + return NativeTranslateUiStateInfobarState.STATE_TRANSLATED; + case BaseTranslationState_1.TranslationStatus.ERROR: + return NativeTranslateUiStateInfobarState.STATE_ERROR; + } + throw Error(`No corresponding NativeTranslateUiStateInfobarState available for translationStatus "${translationStatus}"`); + }; + // React to tab translation state changes + mobx_1.reaction(() => this.extensionState.tabTranslationStates, (tabTranslationStates, _previousTabTranslationStates) => __awaiter(this, void 0, void 0, function* () { + tabTranslationStates.forEach((tts, tabId) => __awaiter(this, void 0, void 0, function* () { + const uiState = yield nativeTranslateUiStateFromTabTranslationState(mobx_keystone_1.getSnapshot(tts)); + browserWithExperimentAPIs.experiments.translateUi.setUiState(tabId, uiState); + // Send telemetry on some translation status changes + const hasChanged = property => { + const previousTabTranslationState = _previousTabTranslationStates.get(tabId); + return (!previousTabTranslationState || + tts[property] !== previousTabTranslationState[property]); + }; + if (hasChanged("translationStatus")) { + if (tts.translationStatus === BaseTranslationState_1.TranslationStatus.OFFER) { + Telemetry_1.telemetry.onTranslationStatusOffer(tabId, tts.effectiveTranslateFrom, tts.effectiveTranslateTo); + } + if (tts.translationStatus === + BaseTranslationState_1.TranslationStatus.TRANSLATION_UNSUPPORTED) { + Telemetry_1.telemetry.onTranslationStatusTranslationUnsupported(tabId, tts.effectiveTranslateFrom, tts.effectiveTranslateTo); + } + } + if (hasChanged("modelLoadErrorOccurred")) { + if (tts.modelLoadErrorOccurred) { + Telemetry_1.telemetry.onModelLoadErrorOccurred(tabId, tts.effectiveTranslateFrom, tts.effectiveTranslateTo); + } + } + if (hasChanged("modelDownloadErrorOccurred")) { + if (tts.modelDownloadErrorOccurred) { + Telemetry_1.telemetry.onModelDownloadErrorOccurred(tabId, tts.effectiveTranslateFrom, tts.effectiveTranslateTo); + } + } + if (hasChanged("translationErrorOccurred")) { + if (tts.translationErrorOccurred) { + Telemetry_1.telemetry.onTranslationErrorOccurred(tabId, tts.effectiveTranslateFrom, tts.effectiveTranslateTo); + } + } + if (hasChanged("otherErrorOccurred")) { + if (tts.otherErrorOccurred) { + Telemetry_1.telemetry.onOtherErrorOccurred(tabId, tts.effectiveTranslateFrom, tts.effectiveTranslateTo); + } + } + if (hasChanged("modelDownloadProgress")) { + if (tts.modelDownloadProgress) { + Telemetry_1.telemetry.updateInactivityTimerForAllTabs(); + } + } + })); + // TODO: check _previousTabTranslationStates for those that had something and now should be inactive + })); + }); + } + onUploadEnabledPrefChange() { + return __awaiter(this, void 0, void 0, function* () { + const uploadEnabled = yield browserWithExperimentAPIs.experiments.telemetryPreferences.getUploadEnabledPref(); + // console.debug("onUploadEnabledPrefChange", { uploadEnabled }); + Telemetry_1.telemetry.uploadEnabledPreferenceUpdated(uploadEnabled); + }); + } + onCachedClientIDPrefChange() { + return __awaiter(this, void 0, void 0, function* () { + const cachedClientID = yield browserWithExperimentAPIs.experiments.telemetryPreferences.getCachedClientIDPref(); + // console.debug("onCachedClientIDPrefChange", { cachedClientID }); + Telemetry_1.telemetry.setFirefoxClientId(cachedClientID); + }); + } + onInfoBarDisplayed(tabId, from, to) { + console.debug("onInfoBarDisplayed", { tabId, from, to }); + Telemetry_1.telemetry.onInfoBarDisplayed(tabId, from, to); + } + onSelectTranslateFrom(tabId, newFrom, to) { + console.debug("onSelectTranslateFrom", { tabId, newFrom, to }); + Telemetry_1.telemetry.onSelectTranslateFrom(tabId, newFrom, to); + } + onSelectTranslateTo(tabId, from, newTo) { + console.debug("onSelectTranslateTo", { tabId, from, newTo }); + Telemetry_1.telemetry.onSelectTranslateFrom(tabId, from, newTo); + } + onInfoBarClosed(tabId, from, to) { + console.debug("onInfoBarClosed", { tabId, from, to }); + Telemetry_1.telemetry.onInfoBarClosed(tabId, from, to); + } + onNeverTranslateSelectedLanguage(tabId, from, to) { + console.debug("onNeverTranslateSelectedLanguage", { tabId, from, to }); + Telemetry_1.telemetry.onNeverTranslateSelectedLanguage(tabId, from, to); + } + onNeverTranslateThisSite(tabId, from, to) { + console.debug("onNeverTranslateThisSite", { tabId, from, to }); + Telemetry_1.telemetry.onNeverTranslateThisSite(tabId, from, to); + } + onShowOriginalButtonPressed(tabId, from, to) { + console.debug("onShowOriginalButtonPressed", { tabId, from, to }); + Telemetry_1.telemetry.onShowOriginalButtonPressed(tabId, from, to); + this.extensionState.showOriginalInTab(tabId); + } + onShowTranslatedButtonPressed(tabId, from, to) { + console.debug("onShowTranslatedButtonPressed", { tabId, from, to }); + Telemetry_1.telemetry.onShowTranslatedButtonPressed(tabId, from, to); + this.extensionState.hideOriginalInTab(tabId); + } + onTranslateButtonPressed(tabId, from, to) { + console.debug("onTranslateButtonPressed", { tabId, from, to }); + Telemetry_1.telemetry.onTranslateButtonPressed(tabId, from, to); + translateAllFramesInTab_1.translateAllFramesInTab(tabId, from, to, this.extensionState); + } + onNotNowButtonPressed(tabId, from, to) { + console.debug("onNotNowButtonPressed", { tabId, from, to }); + Telemetry_1.telemetry.onNotNowButtonPressed(tabId, from, to); + } + stop() { + return __awaiter(this, void 0, void 0, function* () { + yield browserWithExperimentAPIs.experiments.translateUi.stop(); + this.telemetryPreferencesEventsToObserve.map(eventRef => { + browserWithExperimentAPIs.experiments.telemetryPreferences[eventRef].removeListener(this[eventRef]); + }); + this.translateUiEventsToObserve.map(eventRef => { + browserWithExperimentAPIs.experiments.translateUi[eventRef].removeListener(this[eventRef]); + }); + yield Telemetry_1.telemetry.cleanup(); + }); + } +} +exports.NativeTranslateUiBroker = NativeTranslateUiBroker; + + +/***/ }), + +/***/ 9755: +/*!*****************************************************************************!*\ + !*** ./src/firefox-infobar-ui/ts/background-scripts/background.js/index.ts ***! + \*****************************************************************************/ +/***/ (function(__unused_webpack_module, exports, __webpack_require__) { + +"use strict"; + +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ +var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { + function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } + return new (P || (P = Promise))(function (resolve, reject) { + function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } + function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } + function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } + step((generator = generator.apply(thisArg, _arguments || [])).next()); + }); +}; +Object.defineProperty(exports, "__esModule", ({ value: true })); +/* eslint no-unused-vars: ["error", { "varsIgnorePattern": "(extensionGlue)" }]*/ +const ErrorReporting_1 = __webpack_require__(/*! ../../../../core/ts/shared-resources/ErrorReporting */ 3345); +const webextension_polyfill_ts_1 = __webpack_require__(/*! webextension-polyfill-ts */ 3624); +const localStorageWrapper_1 = __webpack_require__(/*! ../../../../core/ts/background-scripts/background.js/state-management/localStorageWrapper */ 5813); +const contentScriptFrameInfoPortListener_1 = __webpack_require__(/*! ../../../../core/ts/background-scripts/background.js/contentScriptFrameInfoPortListener */ 220); +const createBackgroundContextRootStore_1 = __webpack_require__(/*! ../../../../core/ts/background-scripts/background.js/state-management/createBackgroundContextRootStore */ 8911); +const contentScriptLanguageDetectorProxyPortListener_1 = __webpack_require__(/*! ../../../../core/ts/background-scripts/background.js/contentScriptLanguageDetectorProxyPortListener */ 6047); +const Store_1 = __webpack_require__(/*! ../../../../core/ts/background-scripts/background.js/state-management/Store */ 4517); +const connectRootStoreToDevTools_1 = __webpack_require__(/*! ../../../../core/ts/background-scripts/background.js/state-management/connectRootStoreToDevTools */ 6432); +const MobxKeystoneBackgroundContextHost_1 = __webpack_require__(/*! ../../../../core/ts/background-scripts/background.js/state-management/MobxKeystoneBackgroundContextHost */ 805); +const NativeTranslateUiBroker_1 = __webpack_require__(/*! ./NativeTranslateUiBroker */ 7983); +const contentScriptBergamotApiClientPortListener_1 = __webpack_require__(/*! ../../../../core/ts/background-scripts/background.js/contentScriptBergamotApiClientPortListener */ 410); +const bergamot_translator_version_1 = __webpack_require__(/*! ../../../../core/ts/web-worker-scripts/translation-worker.js/bergamot-translator-version */ 8471); +const config_1 = __webpack_require__(/*! ../../../../core/ts/config */ 964); +const store = new Store_1.Store(localStorageWrapper_1.localStorageWrapper); +/* eslint-enable no-unused-vars */ +/** + * Ties together overall execution logic and allows content scripts + * to access persistent storage and background-context API:s via cross-process messaging + */ +class ExtensionGlue { + constructor() { + this.extensionState = createBackgroundContextRootStore_1.createBackgroundContextRootStore(); + } + init() { + return __awaiter(this, void 0, void 0, function* () { + // Add version to extension log output to facilitate general troubleshooting + const manifest = webextension_polyfill_ts_1.browser.runtime.getManifest(); + console.info(`Extension ${manifest.name} version ${manifest.version} [build id "${config_1.config.extensionBuildId}"] (with bergamot-translator ${bergamot_translator_version_1.BERGAMOT_VERSION_FULL}) initializing.`); + // Initiate the root extension state store + this.extensionState = createBackgroundContextRootStore_1.createBackgroundContextRootStore(); + // Allow for easy introspection of extension state in development mode + if (false) {} + // Make the root extension state store available to content script contexts + const mobxKeystoneBackgroundContextHost = new MobxKeystoneBackgroundContextHost_1.MobxKeystoneBackgroundContextHost(); + mobxKeystoneBackgroundContextHost.init(this.extensionState); + // Enable error reporting if not opted out + this.extensionPreferencesPortListener = yield ErrorReporting_1.initErrorReportingInBackgroundScript(store, [ + "port-from-options-ui:index", + "port-from-options-ui:form", + "port-from-main-interface:index", + "port-from-get-started:index", + "port-from-get-started:component", + "port-from-dom-translation-content-script:index", + ]); + }); + } + start() { + return __awaiter(this, void 0, void 0, function* () { + // Set up native translate ui + this.nativeTranslateUiBroker = new NativeTranslateUiBroker_1.NativeTranslateUiBroker(this.extensionState); + yield this.nativeTranslateUiBroker.start(); + // Set up content script port listeners + this.contentScriptLanguageDetectorProxyPortListener = contentScriptLanguageDetectorProxyPortListener_1.contentScriptLanguageDetectorProxyPortListener; + this.contentScriptBergamotApiClientPortListener = contentScriptBergamotApiClientPortListener_1.contentScriptBergamotApiClientPortListener; + this.contentScriptFrameInfoPortListener = contentScriptFrameInfoPortListener_1.contentScriptFrameInfoPortListener; + [ + "contentScriptLanguageDetectorProxyPortListener", + "contentScriptBergamotApiClientPortListener", + "contentScriptFrameInfoPortListener", + ].forEach(listenerName => { + webextension_polyfill_ts_1.browser.runtime.onConnect.addListener(this[listenerName]); + }); + }); + } + // TODO: Run this cleanup-method when relevant + cleanup() { + return __awaiter(this, void 0, void 0, function* () { + yield this.nativeTranslateUiBroker.stop(); + // Tear down content script port listeners + [ + this.extensionPreferencesPortListener, + this.contentScriptLanguageDetectorProxyPortListener, + this.contentScriptBergamotApiClientPortListener, + this.contentScriptFrameInfoPortListener, + ].forEach((listener) => { + try { + webextension_polyfill_ts_1.browser.runtime.onConnect.removeListener(listener); + } + catch (err) { + console.warn(`Port listener removal error`, err); + } + }); + }); + } +} +// make an instance of the ExtensionGlue class available to the extension background context +const extensionGlue = (window.extensionGlue = new ExtensionGlue()); +// migrations +const runMigrations = () => __awaiter(void 0, void 0, void 0, function* () { + console.info("Running relevant migrations"); +}); +// init the extension glue on every extension load +function onEveryExtensionLoad() { + return __awaiter(this, void 0, void 0, function* () { + yield extensionGlue.init(); + yield runMigrations(); + yield extensionGlue.start(); + }); +} +onEveryExtensionLoad().then(); +// Open and keep the test-runner open after each extension reload when in development mode +if (false) {} + + +/***/ }) + +/******/ }); +/************************************************************************/ +/******/ // The module cache +/******/ var __webpack_module_cache__ = {}; +/******/ +/******/ // The require function +/******/ function __webpack_require__(moduleId) { +/******/ // Check if module is in cache +/******/ if(__webpack_module_cache__[moduleId]) { +/******/ return __webpack_module_cache__[moduleId].exports; +/******/ } +/******/ // Create a new module (and put it into the cache) +/******/ var module = __webpack_module_cache__[moduleId] = { +/******/ id: moduleId, +/******/ loaded: false, +/******/ exports: {} +/******/ }; +/******/ +/******/ // Execute the module function +/******/ __webpack_modules__[moduleId].call(module.exports, module, module.exports, __webpack_require__); +/******/ +/******/ // Flag the module as loaded +/******/ module.loaded = true; +/******/ +/******/ // Return the exports of the module +/******/ return module.exports; +/******/ } +/******/ +/******/ // expose the modules object (__webpack_modules__) +/******/ __webpack_require__.m = __webpack_modules__; +/******/ +/******/ // the startup function +/******/ // It's empty as some runtime module handles the default behavior +/******/ __webpack_require__.x = x => {}; +/************************************************************************/ +/******/ /* webpack/runtime/compat get default export */ +/******/ (() => { +/******/ // getDefaultExport function for compatibility with non-harmony modules +/******/ __webpack_require__.n = (module) => { +/******/ var getter = module && module.__esModule ? +/******/ () => (module['default']) : +/******/ () => (module); +/******/ __webpack_require__.d(getter, { a: getter }); +/******/ return getter; +/******/ }; +/******/ })(); +/******/ +/******/ /* webpack/runtime/define property getters */ +/******/ (() => { +/******/ // define getter functions for harmony exports +/******/ __webpack_require__.d = (exports, definition) => { +/******/ for(var key in definition) { +/******/ if(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) { +/******/ Object.defineProperty(exports, key, { enumerable: true, get: definition[key] }); +/******/ } +/******/ } +/******/ }; +/******/ })(); +/******/ +/******/ /* webpack/runtime/global */ +/******/ (() => { +/******/ __webpack_require__.g = (function() { +/******/ if (typeof globalThis === 'object') return globalThis; +/******/ try { +/******/ return this || new Function('return this')(); +/******/ } catch (e) { +/******/ if (typeof window === 'object') return window; +/******/ } +/******/ })(); +/******/ })(); +/******/ +/******/ /* webpack/runtime/harmony module decorator */ +/******/ (() => { +/******/ __webpack_require__.hmd = (module) => { +/******/ module = Object.create(module); +/******/ if (!module.children) module.children = []; +/******/ Object.defineProperty(module, 'exports', { +/******/ enumerable: true, +/******/ set: () => { +/******/ throw new Error('ES Modules may not assign module.exports or exports.*, Use ESM export syntax, instead: ' + module.id); +/******/ } +/******/ }); +/******/ return module; +/******/ }; +/******/ })(); +/******/ +/******/ /* webpack/runtime/hasOwnProperty shorthand */ +/******/ (() => { +/******/ __webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop)) +/******/ })(); +/******/ +/******/ /* webpack/runtime/make namespace object */ +/******/ (() => { +/******/ // define __esModule on exports +/******/ __webpack_require__.r = (exports) => { +/******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) { +/******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' }); +/******/ } +/******/ Object.defineProperty(exports, '__esModule', { value: true }); +/******/ }; +/******/ })(); +/******/ +/******/ /* webpack/runtime/node module decorator */ +/******/ (() => { +/******/ __webpack_require__.nmd = (module) => { +/******/ module.paths = []; +/******/ if (!module.children) module.children = []; +/******/ return module; +/******/ }; +/******/ })(); +/******/ +/******/ /* webpack/runtime/jsonp chunk loading */ +/******/ (() => { +/******/ // no baseURI +/******/ +/******/ // object to store loaded and loading chunks +/******/ // undefined = chunk not loaded, null = chunk preloaded/prefetched +/******/ // Promise = chunk loading, 0 = chunk loaded +/******/ var installedChunks = { +/******/ 352: 0 +/******/ }; +/******/ +/******/ var deferredModules = [ +/******/ [9755,351] +/******/ ]; +/******/ // no chunk on demand loading +/******/ +/******/ // no prefetching +/******/ +/******/ // no preloaded +/******/ +/******/ // no HMR +/******/ +/******/ // no HMR manifest +/******/ +/******/ var checkDeferredModules = x => {}; +/******/ +/******/ // install a JSONP callback for chunk loading +/******/ var webpackJsonpCallback = (parentChunkLoadingFunction, data) => { +/******/ var [chunkIds, moreModules, runtime, executeModules] = data; +/******/ // add "moreModules" to the modules object, +/******/ // then flag all "chunkIds" as loaded and fire callback +/******/ var moduleId, chunkId, i = 0, resolves = []; +/******/ for(;i < chunkIds.length; i++) { +/******/ chunkId = chunkIds[i]; +/******/ if(__webpack_require__.o(installedChunks, chunkId) && installedChunks[chunkId]) { +/******/ resolves.push(installedChunks[chunkId][0]); +/******/ } +/******/ installedChunks[chunkId] = 0; +/******/ } +/******/ for(moduleId in moreModules) { +/******/ if(__webpack_require__.o(moreModules, moduleId)) { +/******/ __webpack_require__.m[moduleId] = moreModules[moduleId]; +/******/ } +/******/ } +/******/ if(runtime) runtime(__webpack_require__); +/******/ if(parentChunkLoadingFunction) parentChunkLoadingFunction(data); +/******/ while(resolves.length) { +/******/ resolves.shift()(); +/******/ } +/******/ +/******/ // add entry modules from loaded chunk to deferred list +/******/ if(executeModules) deferredModules.push.apply(deferredModules, executeModules); +/******/ +/******/ // run deferred modules when all chunks ready +/******/ return checkDeferredModules(); +/******/ } +/******/ +/******/ var chunkLoadingGlobal = self["webpackChunkbergamot_browser_extension"] = self["webpackChunkbergamot_browser_extension"] || []; +/******/ chunkLoadingGlobal.forEach(webpackJsonpCallback.bind(null, 0)); +/******/ chunkLoadingGlobal.push = webpackJsonpCallback.bind(null, chunkLoadingGlobal.push.bind(chunkLoadingGlobal)); +/******/ +/******/ function checkDeferredModulesImpl() { +/******/ var result; +/******/ for(var i = 0; i < deferredModules.length; i++) { +/******/ var deferredModule = deferredModules[i]; +/******/ var fulfilled = true; +/******/ for(var j = 1; j < deferredModule.length; j++) { +/******/ var depId = deferredModule[j]; +/******/ if(installedChunks[depId] !== 0) fulfilled = false; +/******/ } +/******/ if(fulfilled) { +/******/ deferredModules.splice(i--, 1); +/******/ result = __webpack_require__(__webpack_require__.s = deferredModule[0]); +/******/ } +/******/ } +/******/ if(deferredModules.length === 0) { +/******/ __webpack_require__.x(); +/******/ __webpack_require__.x = x => {}; +/******/ } +/******/ return result; +/******/ } +/******/ var startup = __webpack_require__.x; +/******/ __webpack_require__.x = () => { +/******/ // reset startup function so it can be called again when more startup code is added +/******/ __webpack_require__.x = startup || (x => {}); +/******/ return (checkDeferredModules = checkDeferredModulesImpl)(); +/******/ }; +/******/ })(); +/******/ +/************************************************************************/ +/******/ +/******/ // run startup +/******/ var __webpack_exports__ = __webpack_require__.x(); +/******/ +/******/ })() +; +//# sourceMappingURL=background.js.map \ No newline at end of file diff --git a/browser/extensions/translations/extension/commons.js b/browser/extensions/translations/extension/commons.js new file mode 100644 index 000000000000..9daa96ee725a --- /dev/null +++ b/browser/extensions/translations/extension/commons.js @@ -0,0 +1,26473 @@ +(self["webpackChunkbergamot_browser_extension"] = self["webpackChunkbergamot_browser_extension"] || []).push([[351],{ + +/***/ 6614: +/*!****************************************************************!*\ + !*** ./node_modules/@sentry/browser/esm/index.js + 51 modules ***! + \****************************************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +"use strict"; +// ESM COMPAT FLAG +__webpack_require__.r(__webpack_exports__); + +// EXPORTS +__webpack_require__.d(__webpack_exports__, { + "BrowserClient": () => (/* reexport */ BrowserClient), + "Hub": () => (/* reexport */ Hub), + "Integrations": () => (/* binding */ INTEGRATIONS), + "SDK_NAME": () => (/* reexport */ SDK_NAME), + "SDK_VERSION": () => (/* reexport */ SDK_VERSION), + "Scope": () => (/* reexport */ Scope), + "Severity": () => (/* reexport */ Severity), + "Status": () => (/* reexport */ Status), + "Transports": () => (/* reexport */ transports_namespaceObject), + "addBreadcrumb": () => (/* reexport */ addBreadcrumb), + "addGlobalEventProcessor": () => (/* reexport */ addGlobalEventProcessor), + "captureEvent": () => (/* reexport */ captureEvent), + "captureException": () => (/* reexport */ captureException), + "captureMessage": () => (/* reexport */ captureMessage), + "close": () => (/* reexport */ sdk_close), + "configureScope": () => (/* reexport */ configureScope), + "defaultIntegrations": () => (/* reexport */ defaultIntegrations), + "eventFromException": () => (/* reexport */ eventFromException), + "eventFromMessage": () => (/* reexport */ eventFromMessage), + "flush": () => (/* reexport */ flush), + "forceLoad": () => (/* reexport */ forceLoad), + "getCurrentHub": () => (/* reexport */ getCurrentHub), + "getHubFromCarrier": () => (/* reexport */ getHubFromCarrier), + "init": () => (/* reexport */ init), + "injectReportDialog": () => (/* reexport */ injectReportDialog), + "lastEventId": () => (/* reexport */ lastEventId), + "makeMain": () => (/* reexport */ makeMain), + "onLoad": () => (/* reexport */ onLoad), + "setContext": () => (/* reexport */ setContext), + "setExtra": () => (/* reexport */ setExtra), + "setExtras": () => (/* reexport */ setExtras), + "setTag": () => (/* reexport */ setTag), + "setTags": () => (/* reexport */ setTags), + "setUser": () => (/* reexport */ setUser), + "showReportDialog": () => (/* reexport */ showReportDialog), + "startTransaction": () => (/* reexport */ startTransaction), + "withScope": () => (/* reexport */ withScope), + "wrap": () => (/* reexport */ sdk_wrap) +}); + +// NAMESPACE OBJECT: ./node_modules/@sentry/core/esm/integrations/index.js +var integrations_namespaceObject = {}; +__webpack_require__.r(integrations_namespaceObject); +__webpack_require__.d(integrations_namespaceObject, { + "FunctionToString": () => (FunctionToString), + "InboundFilters": () => (InboundFilters) +}); + +// NAMESPACE OBJECT: ./node_modules/@sentry/browser/esm/integrations/index.js +var esm_integrations_namespaceObject = {}; +__webpack_require__.r(esm_integrations_namespaceObject); +__webpack_require__.d(esm_integrations_namespaceObject, { + "Breadcrumbs": () => (Breadcrumbs), + "GlobalHandlers": () => (GlobalHandlers), + "LinkedErrors": () => (LinkedErrors), + "TryCatch": () => (TryCatch), + "UserAgent": () => (UserAgent) +}); + +// NAMESPACE OBJECT: ./node_modules/@sentry/browser/esm/transports/index.js +var transports_namespaceObject = {}; +__webpack_require__.r(transports_namespaceObject); +__webpack_require__.d(transports_namespaceObject, { + "BaseTransport": () => (BaseTransport), + "FetchTransport": () => (FetchTransport), + "XHRTransport": () => (XHRTransport) +}); + +;// CONCATENATED MODULE: ./node_modules/tslib/tslib.es6.js +/*! ***************************************************************************** +Copyright (c) Microsoft Corporation. + +Permission to use, copy, modify, and/or distribute this software for any +purpose with or without fee is hereby granted. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH +REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY +AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, +INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM +LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR +OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR +PERFORMANCE OF THIS SOFTWARE. +***************************************************************************** */ +/* global Reflect, Promise */ + +var extendStatics = function(d, b) { + extendStatics = Object.setPrototypeOf || + ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || + function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; }; + return extendStatics(d, b); +}; + +function __extends(d, b) { + extendStatics(d, b); + function __() { this.constructor = d; } + d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); +} + +var __assign = function() { + __assign = Object.assign || function __assign(t) { + for (var s, i = 1, n = arguments.length; i < n; i++) { + s = arguments[i]; + for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p]; + } + return t; + } + return __assign.apply(this, arguments); +} + +function __rest(s, e) { + var t = {}; + for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0) + t[p] = s[p]; + if (s != null && typeof Object.getOwnPropertySymbols === "function") + for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) { + if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i])) + t[p[i]] = s[p[i]]; + } + return t; +} + +function __decorate(decorators, target, key, desc) { + var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; + if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); + else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; + return c > 3 && r && Object.defineProperty(target, key, r), r; +} + +function __param(paramIndex, decorator) { + return function (target, key) { decorator(target, key, paramIndex); } +} + +function __metadata(metadataKey, metadataValue) { + if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(metadataKey, metadataValue); +} + +function __awaiter(thisArg, _arguments, P, generator) { + function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } + return new (P || (P = Promise))(function (resolve, reject) { + function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } + function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } + function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } + step((generator = generator.apply(thisArg, _arguments || [])).next()); + }); +} + +function __generator(thisArg, body) { + var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g; + return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g; + function verb(n) { return function (v) { return step([n, v]); }; } + function step(op) { + if (f) throw new TypeError("Generator is already executing."); + while (_) try { + if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t; + if (y = 0, t) op = [op[0] & 2, t.value]; + switch (op[0]) { + case 0: case 1: t = op; break; + case 4: _.label++; return { value: op[1], done: false }; + case 5: _.label++; y = op[1]; op = [0]; continue; + case 7: op = _.ops.pop(); _.trys.pop(); continue; + default: + if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; } + if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; } + if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; } + if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; } + if (t[2]) _.ops.pop(); + _.trys.pop(); continue; + } + op = body.call(thisArg, _); + } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; } + if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true }; + } +} + +function __createBinding(o, m, k, k2) { + if (k2 === undefined) k2 = k; + o[k2] = m[k]; +} + +function __exportStar(m, exports) { + for (var p in m) if (p !== "default" && !exports.hasOwnProperty(p)) exports[p] = m[p]; +} + +function __values(o) { + var s = typeof Symbol === "function" && Symbol.iterator, m = s && o[s], i = 0; + if (m) return m.call(o); + if (o && typeof o.length === "number") return { + next: function () { + if (o && i >= o.length) o = void 0; + return { value: o && o[i++], done: !o }; + } + }; + throw new TypeError(s ? "Object is not iterable." : "Symbol.iterator is not defined."); +} + +function __read(o, n) { + var m = typeof Symbol === "function" && o[Symbol.iterator]; + if (!m) return o; + var i = m.call(o), r, ar = [], e; + try { + while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value); + } + catch (error) { e = { error: error }; } + finally { + try { + if (r && !r.done && (m = i["return"])) m.call(i); + } + finally { if (e) throw e.error; } + } + return ar; +} + +function tslib_es6_spread() { + for (var ar = [], i = 0; i < arguments.length; i++) + ar = ar.concat(__read(arguments[i])); + return ar; +} + +function __spreadArrays() { + for (var s = 0, i = 0, il = arguments.length; i < il; i++) s += arguments[i].length; + for (var r = Array(s), k = 0, i = 0; i < il; i++) + for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++) + r[k] = a[j]; + return r; +}; + +function __await(v) { + return this instanceof __await ? (this.v = v, this) : new __await(v); +} + +function __asyncGenerator(thisArg, _arguments, generator) { + if (!Symbol.asyncIterator) throw new TypeError("Symbol.asyncIterator is not defined."); + var g = generator.apply(thisArg, _arguments || []), i, q = []; + return i = {}, verb("next"), verb("throw"), verb("return"), i[Symbol.asyncIterator] = function () { return this; }, i; + function verb(n) { if (g[n]) i[n] = function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]) > 1 || resume(n, v); }); }; } + function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(q[0][3], e); } } + function step(r) { r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r); } + function fulfill(value) { resume("next", value); } + function reject(value) { resume("throw", value); } + function settle(f, v) { if (f(v), q.shift(), q.length) resume(q[0][0], q[0][1]); } +} + +function __asyncDelegator(o) { + var i, p; + return i = {}, verb("next"), verb("throw", function (e) { throw e; }), verb("return"), i[Symbol.iterator] = function () { return this; }, i; + function verb(n, f) { i[n] = o[n] ? function (v) { return (p = !p) ? { value: __await(o[n](v)), done: n === "return" } : f ? f(v) : v; } : f; } +} + +function __asyncValues(o) { + if (!Symbol.asyncIterator) throw new TypeError("Symbol.asyncIterator is not defined."); + var m = o[Symbol.asyncIterator], i; + return m ? m.call(o) : (o = typeof __values === "function" ? __values(o) : o[Symbol.iterator](), i = {}, verb("next"), verb("throw"), verb("return"), i[Symbol.asyncIterator] = function () { return this; }, i); + function verb(n) { i[n] = o[n] && function (v) { return new Promise(function (resolve, reject) { v = o[n](v), settle(resolve, reject, v.done, v.value); }); }; } + function settle(resolve, reject, d, v) { Promise.resolve(v).then(function(v) { resolve({ value: v, done: d }); }, reject); } +} + +function __makeTemplateObject(cooked, raw) { + if (Object.defineProperty) { Object.defineProperty(cooked, "raw", { value: raw }); } else { cooked.raw = raw; } + return cooked; +}; + +function __importStar(mod) { + if (mod && mod.__esModule) return mod; + var result = {}; + if (mod != null) for (var k in mod) if (Object.hasOwnProperty.call(mod, k)) result[k] = mod[k]; + result.default = mod; + return result; +} + +function __importDefault(mod) { + return (mod && mod.__esModule) ? mod : { default: mod }; +} + +function __classPrivateFieldGet(receiver, privateMap) { + if (!privateMap.has(receiver)) { + throw new TypeError("attempted to get private field on non-instance"); + } + return privateMap.get(receiver); +} + +function __classPrivateFieldSet(receiver, privateMap, value) { + if (!privateMap.has(receiver)) { + throw new TypeError("attempted to set private field on non-instance"); + } + privateMap.set(receiver, value); + return value; +} + +;// CONCATENATED MODULE: ./node_modules/@sentry/types/esm/severity.js +/** JSDoc */ +// eslint-disable-next-line import/export +var Severity; +(function (Severity) { + /** JSDoc */ + Severity["Fatal"] = "fatal"; + /** JSDoc */ + Severity["Error"] = "error"; + /** JSDoc */ + Severity["Warning"] = "warning"; + /** JSDoc */ + Severity["Log"] = "log"; + /** JSDoc */ + Severity["Info"] = "info"; + /** JSDoc */ + Severity["Debug"] = "debug"; + /** JSDoc */ + Severity["Critical"] = "critical"; +})(Severity || (Severity = {})); +// eslint-disable-next-line @typescript-eslint/no-namespace, import/export +(function (Severity) { + /** + * Converts a string-based level into a {@link Severity}. + * + * @param level string representation of Severity + * @returns Severity + */ + function fromString(level) { + switch (level) { + case 'debug': + return Severity.Debug; + case 'info': + return Severity.Info; + case 'warn': + case 'warning': + return Severity.Warning; + case 'error': + return Severity.Error; + case 'fatal': + return Severity.Fatal; + case 'critical': + return Severity.Critical; + case 'log': + default: + return Severity.Log; + } + } + Severity.fromString = fromString; +})(Severity || (Severity = {})); + +;// CONCATENATED MODULE: ./node_modules/@sentry/types/esm/status.js +/** The status of an event. */ +// eslint-disable-next-line import/export +var Status; +(function (Status) { + /** The status could not be determined. */ + Status["Unknown"] = "unknown"; + /** The event was skipped due to configuration or callbacks. */ + Status["Skipped"] = "skipped"; + /** The event was sent to Sentry successfully. */ + Status["Success"] = "success"; + /** The client is currently rate limited and will try again later. */ + Status["RateLimit"] = "rate_limit"; + /** The event could not be processed. */ + Status["Invalid"] = "invalid"; + /** A server-side error ocurred during submission. */ + Status["Failed"] = "failed"; +})(Status || (Status = {})); +// eslint-disable-next-line @typescript-eslint/no-namespace, import/export +(function (Status) { + /** + * Converts a HTTP status code into a {@link Status}. + * + * @param code The HTTP response status code. + * @returns The send status or {@link Status.Unknown}. + */ + function fromHttpCode(code) { + if (code >= 200 && code < 300) { + return Status.Success; + } + if (code === 429) { + return Status.RateLimit; + } + if (code >= 400 && code < 500) { + return Status.Invalid; + } + if (code >= 500) { + return Status.Failed; + } + return Status.Unknown; + } + Status.fromHttpCode = fromHttpCode; +})(Status || (Status = {})); + +;// CONCATENATED MODULE: ./node_modules/@sentry/utils/esm/is.js +/* eslint-disable @typescript-eslint/no-explicit-any */ +/* eslint-disable @typescript-eslint/explicit-module-boundary-types */ +/** + * Checks whether given value's type is one of a few Error or Error-like + * {@link isError}. + * + * @param wat A value to be checked. + * @returns A boolean representing the result. + */ +function isError(wat) { + switch (Object.prototype.toString.call(wat)) { + case '[object Error]': + return true; + case '[object Exception]': + return true; + case '[object DOMException]': + return true; + default: + return isInstanceOf(wat, Error); + } +} +/** + * Checks whether given value's type is ErrorEvent + * {@link isErrorEvent}. + * + * @param wat A value to be checked. + * @returns A boolean representing the result. + */ +function isErrorEvent(wat) { + return Object.prototype.toString.call(wat) === '[object ErrorEvent]'; +} +/** + * Checks whether given value's type is DOMError + * {@link isDOMError}. + * + * @param wat A value to be checked. + * @returns A boolean representing the result. + */ +function isDOMError(wat) { + return Object.prototype.toString.call(wat) === '[object DOMError]'; +} +/** + * Checks whether given value's type is DOMException + * {@link isDOMException}. + * + * @param wat A value to be checked. + * @returns A boolean representing the result. + */ +function isDOMException(wat) { + return Object.prototype.toString.call(wat) === '[object DOMException]'; +} +/** + * Checks whether given value's type is a string + * {@link isString}. + * + * @param wat A value to be checked. + * @returns A boolean representing the result. + */ +function isString(wat) { + return Object.prototype.toString.call(wat) === '[object String]'; +} +/** + * Checks whether given value's is a primitive (undefined, null, number, boolean, string) + * {@link isPrimitive}. + * + * @param wat A value to be checked. + * @returns A boolean representing the result. + */ +function isPrimitive(wat) { + return wat === null || (typeof wat !== 'object' && typeof wat !== 'function'); +} +/** + * Checks whether given value's type is an object literal + * {@link isPlainObject}. + * + * @param wat A value to be checked. + * @returns A boolean representing the result. + */ +function isPlainObject(wat) { + return Object.prototype.toString.call(wat) === '[object Object]'; +} +/** + * Checks whether given value's type is an Event instance + * {@link isEvent}. + * + * @param wat A value to be checked. + * @returns A boolean representing the result. + */ +function isEvent(wat) { + return typeof Event !== 'undefined' && isInstanceOf(wat, Event); +} +/** + * Checks whether given value's type is an Element instance + * {@link isElement}. + * + * @param wat A value to be checked. + * @returns A boolean representing the result. + */ +function isElement(wat) { + return typeof Element !== 'undefined' && isInstanceOf(wat, Element); +} +/** + * Checks whether given value's type is an regexp + * {@link isRegExp}. + * + * @param wat A value to be checked. + * @returns A boolean representing the result. + */ +function isRegExp(wat) { + return Object.prototype.toString.call(wat) === '[object RegExp]'; +} +/** + * Checks whether given value has a then function. + * @param wat A value to be checked. + */ +function isThenable(wat) { + // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access + return Boolean(wat && wat.then && typeof wat.then === 'function'); +} +/** + * Checks whether given value's type is a SyntheticEvent + * {@link isSyntheticEvent}. + * + * @param wat A value to be checked. + * @returns A boolean representing the result. + */ +function isSyntheticEvent(wat) { + return isPlainObject(wat) && 'nativeEvent' in wat && 'preventDefault' in wat && 'stopPropagation' in wat; +} +/** + * Checks whether given value's type is an instance of provided constructor. + * {@link isInstanceOf}. + * + * @param wat A value to be checked. + * @param base A constructor to be used in a check. + * @returns A boolean representing the result. + */ +function isInstanceOf(wat, base) { + try { + return wat instanceof base; + } + catch (_e) { + return false; + } +} + +// EXTERNAL MODULE: ./node_modules/@sentry/utils/esm/time.js +var time = __webpack_require__(7685); +;// CONCATENATED MODULE: ./node_modules/@sentry/utils/esm/syncpromise.js +/* eslint-disable @typescript-eslint/explicit-function-return-type */ +/* eslint-disable @typescript-eslint/typedef */ +/* eslint-disable @typescript-eslint/explicit-module-boundary-types */ +/* eslint-disable @typescript-eslint/no-explicit-any */ + +/** SyncPromise internal states */ +var States; +(function (States) { + /** Pending */ + States["PENDING"] = "PENDING"; + /** Resolved / OK */ + States["RESOLVED"] = "RESOLVED"; + /** Rejected / Error */ + States["REJECTED"] = "REJECTED"; +})(States || (States = {})); +/** + * Thenable class that behaves like a Promise and follows it's interface + * but is not async internally + */ +var SyncPromise = /** @class */ (function () { + function SyncPromise(executor) { + var _this = this; + this._state = States.PENDING; + this._handlers = []; + /** JSDoc */ + this._resolve = function (value) { + _this._setResult(States.RESOLVED, value); + }; + /** JSDoc */ + this._reject = function (reason) { + _this._setResult(States.REJECTED, reason); + }; + /** JSDoc */ + this._setResult = function (state, value) { + if (_this._state !== States.PENDING) { + return; + } + if (isThenable(value)) { + value.then(_this._resolve, _this._reject); + return; + } + _this._state = state; + _this._value = value; + _this._executeHandlers(); + }; + // TODO: FIXME + /** JSDoc */ + this._attachHandler = function (handler) { + _this._handlers = _this._handlers.concat(handler); + _this._executeHandlers(); + }; + /** JSDoc */ + this._executeHandlers = function () { + if (_this._state === States.PENDING) { + return; + } + var cachedHandlers = _this._handlers.slice(); + _this._handlers = []; + cachedHandlers.forEach(function (handler) { + if (handler.done) { + return; + } + if (_this._state === States.RESOLVED) { + if (handler.onfulfilled) { + // eslint-disable-next-line @typescript-eslint/no-floating-promises + handler.onfulfilled(_this._value); + } + } + if (_this._state === States.REJECTED) { + if (handler.onrejected) { + handler.onrejected(_this._value); + } + } + handler.done = true; + }); + }; + try { + executor(this._resolve, this._reject); + } + catch (e) { + this._reject(e); + } + } + /** JSDoc */ + SyncPromise.resolve = function (value) { + return new SyncPromise(function (resolve) { + resolve(value); + }); + }; + /** JSDoc */ + SyncPromise.reject = function (reason) { + return new SyncPromise(function (_, reject) { + reject(reason); + }); + }; + /** JSDoc */ + SyncPromise.all = function (collection) { + return new SyncPromise(function (resolve, reject) { + if (!Array.isArray(collection)) { + reject(new TypeError("Promise.all requires an array as input.")); + return; + } + if (collection.length === 0) { + resolve([]); + return; + } + var counter = collection.length; + var resolvedCollection = []; + collection.forEach(function (item, index) { + SyncPromise.resolve(item) + .then(function (value) { + resolvedCollection[index] = value; + counter -= 1; + if (counter !== 0) { + return; + } + resolve(resolvedCollection); + }) + .then(null, reject); + }); + }); + }; + /** JSDoc */ + SyncPromise.prototype.then = function (onfulfilled, onrejected) { + var _this = this; + return new SyncPromise(function (resolve, reject) { + _this._attachHandler({ + done: false, + onfulfilled: function (result) { + if (!onfulfilled) { + // TODO: ¯\_(ツ)_/¯ + // TODO: FIXME + resolve(result); + return; + } + try { + resolve(onfulfilled(result)); + return; + } + catch (e) { + reject(e); + return; + } + }, + onrejected: function (reason) { + if (!onrejected) { + reject(reason); + return; + } + try { + resolve(onrejected(reason)); + return; + } + catch (e) { + reject(e); + return; + } + }, + }); + }); + }; + /** JSDoc */ + SyncPromise.prototype.catch = function (onrejected) { + return this.then(function (val) { return val; }, onrejected); + }; + /** JSDoc */ + SyncPromise.prototype.finally = function (onfinally) { + var _this = this; + return new SyncPromise(function (resolve, reject) { + var val; + var isRejected; + return _this.then(function (value) { + isRejected = false; + val = value; + if (onfinally) { + onfinally(); + } + }, function (reason) { + isRejected = true; + val = reason; + if (onfinally) { + onfinally(); + } + }).then(function () { + if (isRejected) { + reject(val); + return; + } + resolve(val); + }); + }); + }; + /** JSDoc */ + SyncPromise.prototype.toString = function () { + return '[object SyncPromise]'; + }; + return SyncPromise; +}()); + + +// EXTERNAL MODULE: ./node_modules/@sentry/utils/esm/misc.js +var misc = __webpack_require__(2681); +;// CONCATENATED MODULE: ./node_modules/@sentry/hub/esm/scope.js + + +/** + * Holds additional event information. {@link Scope.applyToEvent} will be + * called by the client before an event will be sent. + */ +var Scope = /** @class */ (function () { + function Scope() { + /** Flag if notifiying is happening. */ + this._notifyingListeners = false; + /** Callback for client to receive scope changes. */ + this._scopeListeners = []; + /** Callback list that will be called after {@link applyToEvent}. */ + this._eventProcessors = []; + /** Array of breadcrumbs. */ + this._breadcrumbs = []; + /** User */ + this._user = {}; + /** Tags */ + this._tags = {}; + /** Extra */ + this._extra = {}; + /** Contexts */ + this._contexts = {}; + } + /** + * Inherit values from the parent scope. + * @param scope to clone. + */ + Scope.clone = function (scope) { + var newScope = new Scope(); + if (scope) { + newScope._breadcrumbs = tslib_es6_spread(scope._breadcrumbs); + newScope._tags = __assign({}, scope._tags); + newScope._extra = __assign({}, scope._extra); + newScope._contexts = __assign({}, scope._contexts); + newScope._user = scope._user; + newScope._level = scope._level; + newScope._span = scope._span; + newScope._session = scope._session; + newScope._transactionName = scope._transactionName; + newScope._fingerprint = scope._fingerprint; + newScope._eventProcessors = tslib_es6_spread(scope._eventProcessors); + } + return newScope; + }; + /** + * Add internal on change listener. Used for sub SDKs that need to store the scope. + * @hidden + */ + Scope.prototype.addScopeListener = function (callback) { + this._scopeListeners.push(callback); + }; + /** + * @inheritDoc + */ + Scope.prototype.addEventProcessor = function (callback) { + this._eventProcessors.push(callback); + return this; + }; + /** + * @inheritDoc + */ + Scope.prototype.setUser = function (user) { + this._user = user || {}; + if (this._session) { + this._session.update({ user: user }); + } + this._notifyScopeListeners(); + return this; + }; + /** + * @inheritDoc + */ + Scope.prototype.getUser = function () { + return this._user; + }; + /** + * @inheritDoc + */ + Scope.prototype.setTags = function (tags) { + this._tags = __assign(__assign({}, this._tags), tags); + this._notifyScopeListeners(); + return this; + }; + /** + * @inheritDoc + */ + Scope.prototype.setTag = function (key, value) { + var _a; + this._tags = __assign(__assign({}, this._tags), (_a = {}, _a[key] = value, _a)); + this._notifyScopeListeners(); + return this; + }; + /** + * @inheritDoc + */ + Scope.prototype.setExtras = function (extras) { + this._extra = __assign(__assign({}, this._extra), extras); + this._notifyScopeListeners(); + return this; + }; + /** + * @inheritDoc + */ + Scope.prototype.setExtra = function (key, extra) { + var _a; + this._extra = __assign(__assign({}, this._extra), (_a = {}, _a[key] = extra, _a)); + this._notifyScopeListeners(); + return this; + }; + /** + * @inheritDoc + */ + Scope.prototype.setFingerprint = function (fingerprint) { + this._fingerprint = fingerprint; + this._notifyScopeListeners(); + return this; + }; + /** + * @inheritDoc + */ + Scope.prototype.setLevel = function (level) { + this._level = level; + this._notifyScopeListeners(); + return this; + }; + /** + * @inheritDoc + */ + Scope.prototype.setTransactionName = function (name) { + this._transactionName = name; + this._notifyScopeListeners(); + return this; + }; + /** + * Can be removed in major version. + * @deprecated in favor of {@link this.setTransactionName} + */ + Scope.prototype.setTransaction = function (name) { + return this.setTransactionName(name); + }; + /** + * @inheritDoc + */ + Scope.prototype.setContext = function (key, context) { + var _a; + if (context === null) { + // eslint-disable-next-line @typescript-eslint/no-dynamic-delete + delete this._contexts[key]; + } + else { + this._contexts = __assign(__assign({}, this._contexts), (_a = {}, _a[key] = context, _a)); + } + this._notifyScopeListeners(); + return this; + }; + /** + * @inheritDoc + */ + Scope.prototype.setSpan = function (span) { + this._span = span; + this._notifyScopeListeners(); + return this; + }; + /** + * @inheritDoc + */ + Scope.prototype.getSpan = function () { + return this._span; + }; + /** + * @inheritDoc + */ + Scope.prototype.getTransaction = function () { + var _a, _b, _c, _d; + // often, this span will be a transaction, but it's not guaranteed to be + var span = this.getSpan(); + // try it the new way first + if ((_a = span) === null || _a === void 0 ? void 0 : _a.transaction) { + return (_b = span) === null || _b === void 0 ? void 0 : _b.transaction; + } + // fallback to the old way (known bug: this only finds transactions with sampled = true) + if ((_d = (_c = span) === null || _c === void 0 ? void 0 : _c.spanRecorder) === null || _d === void 0 ? void 0 : _d.spans[0]) { + return span.spanRecorder.spans[0]; + } + // neither way found a transaction + return undefined; + }; + /** + * @inheritDoc + */ + Scope.prototype.setSession = function (session) { + if (!session) { + delete this._session; + } + else { + this._session = session; + } + this._notifyScopeListeners(); + return this; + }; + /** + * @inheritDoc + */ + Scope.prototype.getSession = function () { + return this._session; + }; + /** + * @inheritDoc + */ + Scope.prototype.update = function (captureContext) { + if (!captureContext) { + return this; + } + if (typeof captureContext === 'function') { + var updatedScope = captureContext(this); + return updatedScope instanceof Scope ? updatedScope : this; + } + if (captureContext instanceof Scope) { + this._tags = __assign(__assign({}, this._tags), captureContext._tags); + this._extra = __assign(__assign({}, this._extra), captureContext._extra); + this._contexts = __assign(__assign({}, this._contexts), captureContext._contexts); + if (captureContext._user && Object.keys(captureContext._user).length) { + this._user = captureContext._user; + } + if (captureContext._level) { + this._level = captureContext._level; + } + if (captureContext._fingerprint) { + this._fingerprint = captureContext._fingerprint; + } + } + else if (isPlainObject(captureContext)) { + // eslint-disable-next-line no-param-reassign + captureContext = captureContext; + this._tags = __assign(__assign({}, this._tags), captureContext.tags); + this._extra = __assign(__assign({}, this._extra), captureContext.extra); + this._contexts = __assign(__assign({}, this._contexts), captureContext.contexts); + if (captureContext.user) { + this._user = captureContext.user; + } + if (captureContext.level) { + this._level = captureContext.level; + } + if (captureContext.fingerprint) { + this._fingerprint = captureContext.fingerprint; + } + } + return this; + }; + /** + * @inheritDoc + */ + Scope.prototype.clear = function () { + this._breadcrumbs = []; + this._tags = {}; + this._extra = {}; + this._user = {}; + this._contexts = {}; + this._level = undefined; + this._transactionName = undefined; + this._fingerprint = undefined; + this._span = undefined; + this._session = undefined; + this._notifyScopeListeners(); + return this; + }; + /** + * @inheritDoc + */ + Scope.prototype.addBreadcrumb = function (breadcrumb, maxBreadcrumbs) { + var mergedBreadcrumb = __assign({ timestamp: (0,time/* dateTimestampInSeconds */.yW)() }, breadcrumb); + this._breadcrumbs = + maxBreadcrumbs !== undefined && maxBreadcrumbs >= 0 + ? tslib_es6_spread(this._breadcrumbs, [mergedBreadcrumb]).slice(-maxBreadcrumbs) + : tslib_es6_spread(this._breadcrumbs, [mergedBreadcrumb]); + this._notifyScopeListeners(); + return this; + }; + /** + * @inheritDoc + */ + Scope.prototype.clearBreadcrumbs = function () { + this._breadcrumbs = []; + this._notifyScopeListeners(); + return this; + }; + /** + * Applies the current context and fingerprint to the event. + * Note that breadcrumbs will be added by the client. + * Also if the event has already breadcrumbs on it, we do not merge them. + * @param event Event + * @param hint May contain additional informartion about the original exception. + * @hidden + */ + Scope.prototype.applyToEvent = function (event, hint) { + if (this._extra && Object.keys(this._extra).length) { + event.extra = __assign(__assign({}, this._extra), event.extra); + } + if (this._tags && Object.keys(this._tags).length) { + event.tags = __assign(__assign({}, this._tags), event.tags); + } + if (this._user && Object.keys(this._user).length) { + event.user = __assign(__assign({}, this._user), event.user); + } + if (this._contexts && Object.keys(this._contexts).length) { + event.contexts = __assign(__assign({}, this._contexts), event.contexts); + } + if (this._level) { + event.level = this._level; + } + if (this._transactionName) { + event.transaction = this._transactionName; + } + // We want to set the trace context for normal events only if there isn't already + // a trace context on the event. There is a product feature in place where we link + // errors with transaction and it relys on that. + if (this._span) { + event.contexts = __assign({ trace: this._span.getTraceContext() }, event.contexts); + } + this._applyFingerprint(event); + event.breadcrumbs = tslib_es6_spread((event.breadcrumbs || []), this._breadcrumbs); + event.breadcrumbs = event.breadcrumbs.length > 0 ? event.breadcrumbs : undefined; + return this._notifyEventProcessors(tslib_es6_spread(getGlobalEventProcessors(), this._eventProcessors), event, hint); + }; + /** + * This will be called after {@link applyToEvent} is finished. + */ + Scope.prototype._notifyEventProcessors = function (processors, event, hint, index) { + var _this = this; + if (index === void 0) { index = 0; } + return new SyncPromise(function (resolve, reject) { + var processor = processors[index]; + if (event === null || typeof processor !== 'function') { + resolve(event); + } + else { + var result = processor(__assign({}, event), hint); + if (isThenable(result)) { + result + .then(function (final) { return _this._notifyEventProcessors(processors, final, hint, index + 1).then(resolve); }) + .then(null, reject); + } + else { + _this._notifyEventProcessors(processors, result, hint, index + 1) + .then(resolve) + .then(null, reject); + } + } + }); + }; + /** + * This will be called on every set call. + */ + Scope.prototype._notifyScopeListeners = function () { + var _this = this; + if (!this._notifyingListeners) { + this._notifyingListeners = true; + setTimeout(function () { + _this._scopeListeners.forEach(function (callback) { + callback(_this); + }); + _this._notifyingListeners = false; + }); + } + }; + /** + * Applies fingerprint from the scope to the event if there's one, + * uses message if there's one instead or get rid of empty fingerprint + */ + Scope.prototype._applyFingerprint = function (event) { + // Make sure it's an array first and we actually have something in place + event.fingerprint = event.fingerprint + ? Array.isArray(event.fingerprint) + ? event.fingerprint + : [event.fingerprint] + : []; + // If we have something on the scope, then merge it with event + if (this._fingerprint) { + event.fingerprint = event.fingerprint.concat(this._fingerprint); + } + // If we have no data at all, remove empty array default + if (event.fingerprint && !event.fingerprint.length) { + delete event.fingerprint; + } + }; + return Scope; +}()); + +/** + * Retruns the global event processors. + */ +function getGlobalEventProcessors() { + var global = (0,misc/* getGlobalObject */.Rf)(); + global.__SENTRY__ = global.__SENTRY__ || {}; + global.__SENTRY__.globalEventProcessors = global.__SENTRY__.globalEventProcessors || []; + return global.__SENTRY__.globalEventProcessors; +} +/** + * Add a EventProcessor to be kept globally. + * @param callback EventProcessor to add + */ +function addGlobalEventProcessor(callback) { + getGlobalEventProcessors().push(callback); +} + +;// CONCATENATED MODULE: ./node_modules/@sentry/utils/esm/logger.js +/* eslint-disable @typescript-eslint/no-explicit-any */ + +// TODO: Implement different loggers for different environments +var global = (0,misc/* getGlobalObject */.Rf)(); +/** Prefix for logging strings */ +var PREFIX = 'Sentry Logger '; +/** JSDoc */ +var Logger = /** @class */ (function () { + /** JSDoc */ + function Logger() { + this._enabled = false; + } + /** JSDoc */ + Logger.prototype.disable = function () { + this._enabled = false; + }; + /** JSDoc */ + Logger.prototype.enable = function () { + this._enabled = true; + }; + /** JSDoc */ + Logger.prototype.log = function () { + var args = []; + for (var _i = 0; _i < arguments.length; _i++) { + args[_i] = arguments[_i]; + } + if (!this._enabled) { + return; + } + (0,misc/* consoleSandbox */.Cf)(function () { + global.console.log(PREFIX + "[Log]: " + args.join(' ')); + }); + }; + /** JSDoc */ + Logger.prototype.warn = function () { + var args = []; + for (var _i = 0; _i < arguments.length; _i++) { + args[_i] = arguments[_i]; + } + if (!this._enabled) { + return; + } + (0,misc/* consoleSandbox */.Cf)(function () { + global.console.warn(PREFIX + "[Warn]: " + args.join(' ')); + }); + }; + /** JSDoc */ + Logger.prototype.error = function () { + var args = []; + for (var _i = 0; _i < arguments.length; _i++) { + args[_i] = arguments[_i]; + } + if (!this._enabled) { + return; + } + (0,misc/* consoleSandbox */.Cf)(function () { + global.console.error(PREFIX + "[Error]: " + args.join(' ')); + }); + }; + return Logger; +}()); +// Ensure we only have a single logger instance, even if multiple versions of @sentry/utils are being used +global.__SENTRY__ = global.__SENTRY__ || {}; +var logger = global.__SENTRY__.logger || (global.__SENTRY__.logger = new Logger()); + + +// EXTERNAL MODULE: ./node_modules/@sentry/utils/esm/node.js +var node = __webpack_require__(8612); +;// CONCATENATED MODULE: ./node_modules/@sentry/types/esm/session.js +/** + * Session Status + */ +var SessionStatus; +(function (SessionStatus) { + /** JSDoc */ + SessionStatus["Ok"] = "ok"; + /** JSDoc */ + SessionStatus["Exited"] = "exited"; + /** JSDoc */ + SessionStatus["Crashed"] = "crashed"; + /** JSDoc */ + SessionStatus["Abnormal"] = "abnormal"; +})(SessionStatus || (SessionStatus = {})); + +;// CONCATENATED MODULE: ./node_modules/@sentry/utils/esm/browser.js + +/** + * Given a child DOM element, returns a query-selector statement describing that + * and its ancestors + * e.g. [HTMLElement] => body > div > input#foo.btn[name=baz] + * @returns generated DOM path + */ +function htmlTreeAsString(elem) { + // try/catch both: + // - accessing event.target (see getsentry/raven-js#838, #768) + // - `htmlTreeAsString` because it's complex, and just accessing the DOM incorrectly + // - can throw an exception in some circumstances. + try { + var currentElem = elem; + var MAX_TRAVERSE_HEIGHT = 5; + var MAX_OUTPUT_LEN = 80; + var out = []; + var height = 0; + var len = 0; + var separator = ' > '; + var sepLength = separator.length; + var nextStr = void 0; + // eslint-disable-next-line no-plusplus + while (currentElem && height++ < MAX_TRAVERSE_HEIGHT) { + nextStr = _htmlElementAsString(currentElem); + // bail out if + // - nextStr is the 'html' element + // - the length of the string that would be created exceeds MAX_OUTPUT_LEN + // (ignore this limit if we are on the first iteration) + if (nextStr === 'html' || (height > 1 && len + out.length * sepLength + nextStr.length >= MAX_OUTPUT_LEN)) { + break; + } + out.push(nextStr); + len += nextStr.length; + currentElem = currentElem.parentNode; + } + return out.reverse().join(separator); + } + catch (_oO) { + return ''; + } +} +/** + * Returns a simple, query-selector representation of a DOM element + * e.g. [HTMLElement] => input#foo.btn[name=baz] + * @returns generated DOM path + */ +function _htmlElementAsString(el) { + var elem = el; + var out = []; + var className; + var classes; + var key; + var attr; + var i; + if (!elem || !elem.tagName) { + return ''; + } + out.push(elem.tagName.toLowerCase()); + if (elem.id) { + out.push("#" + elem.id); + } + // eslint-disable-next-line prefer-const + className = elem.className; + if (className && isString(className)) { + classes = className.split(/\s+/); + for (i = 0; i < classes.length; i++) { + out.push("." + classes[i]); + } + } + var allowedAttrs = ['type', 'name', 'title', 'alt']; + for (i = 0; i < allowedAttrs.length; i++) { + key = allowedAttrs[i]; + attr = elem.getAttribute(key); + if (attr) { + out.push("[" + key + "=\"" + attr + "\"]"); + } + } + return out.join(''); +} + +;// CONCATENATED MODULE: ./node_modules/@sentry/utils/esm/memo.js +/* eslint-disable @typescript-eslint/no-unsafe-member-access */ +/* eslint-disable @typescript-eslint/no-explicit-any */ +/* eslint-disable @typescript-eslint/explicit-module-boundary-types */ +/** + * Memo class used for decycle json objects. Uses WeakSet if available otherwise array. + */ +var Memo = /** @class */ (function () { + function Memo() { + this._hasWeakSet = typeof WeakSet === 'function'; + this._inner = this._hasWeakSet ? new WeakSet() : []; + } + /** + * Sets obj to remember. + * @param obj Object to remember + */ + Memo.prototype.memoize = function (obj) { + if (this._hasWeakSet) { + if (this._inner.has(obj)) { + return true; + } + this._inner.add(obj); + return false; + } + // eslint-disable-next-line @typescript-eslint/prefer-for-of + for (var i = 0; i < this._inner.length; i++) { + var value = this._inner[i]; + if (value === obj) { + return true; + } + } + this._inner.push(obj); + return false; + }; + /** + * Removes object from internal storage. + * @param obj Object to forget + */ + Memo.prototype.unmemoize = function (obj) { + if (this._hasWeakSet) { + this._inner.delete(obj); + } + else { + for (var i = 0; i < this._inner.length; i++) { + if (this._inner[i] === obj) { + this._inner.splice(i, 1); + break; + } + } + } + }; + return Memo; +}()); + + +;// CONCATENATED MODULE: ./node_modules/@sentry/utils/esm/stacktrace.js +var defaultFunctionName = ''; +/** + * Safely extract function name from itself + */ +function getFunctionName(fn) { + try { + if (!fn || typeof fn !== 'function') { + return defaultFunctionName; + } + return fn.name || defaultFunctionName; + } + catch (e) { + // Just accessing custom props in some Selenium environments + // can cause a "Permission denied" exception (see raven-js#495). + return defaultFunctionName; + } +} + +;// CONCATENATED MODULE: ./node_modules/@sentry/utils/esm/string.js + +/** + * Truncates given string to the maximum characters count + * + * @param str An object that contains serializable values + * @param max Maximum number of characters in truncated string + * @returns string Encoded + */ +function truncate(str, max) { + if (max === void 0) { max = 0; } + if (typeof str !== 'string' || max === 0) { + return str; + } + return str.length <= max ? str : str.substr(0, max) + "..."; +} +/** + * This is basically just `trim_line` from + * https://github.com/getsentry/sentry/blob/master/src/sentry/lang/javascript/processor.py#L67 + * + * @param str An object that contains serializable values + * @param max Maximum number of characters in truncated string + * @returns string Encoded + */ +function snipLine(line, colno) { + var newLine = line; + var ll = newLine.length; + if (ll <= 150) { + return newLine; + } + if (colno > ll) { + // eslint-disable-next-line no-param-reassign + colno = ll; + } + var start = Math.max(colno - 60, 0); + if (start < 5) { + start = 0; + } + var end = Math.min(start + 140, ll); + if (end > ll - 5) { + end = ll; + } + if (end === ll) { + start = Math.max(end - 140, 0); + } + newLine = newLine.slice(start, end); + if (start > 0) { + newLine = "'{snip} " + newLine; + } + if (end < ll) { + newLine += ' {snip}'; + } + return newLine; +} +/** + * Join values in array + * @param input array of values to be joined together + * @param delimiter string to be placed in-between values + * @returns Joined values + */ +// eslint-disable-next-line @typescript-eslint/no-explicit-any +function safeJoin(input, delimiter) { + if (!Array.isArray(input)) { + return ''; + } + var output = []; + // eslint-disable-next-line @typescript-eslint/prefer-for-of + for (var i = 0; i < input.length; i++) { + var value = input[i]; + try { + output.push(String(value)); + } + catch (e) { + output.push('[value cannot be serialized]'); + } + } + return output.join(delimiter); +} +/** + * Checks if the value matches a regex or includes the string + * @param value The string value to be checked against + * @param pattern Either a regex or a string that must be contained in value + */ +function isMatchingPattern(value, pattern) { + if (!isString(value)) { + return false; + } + if (isRegExp(pattern)) { + return pattern.test(value); + } + if (typeof pattern === 'string') { + return value.indexOf(pattern) !== -1; + } + return false; +} + +;// CONCATENATED MODULE: ./node_modules/@sentry/utils/esm/object.js + + + + + + +/** + * Wrap a given object method with a higher-order function + * + * @param source An object that contains a method to be wrapped. + * @param name A name of method to be wrapped. + * @param replacement A function that should be used to wrap a given method. + * @returns void + */ +function fill(source, name, replacement) { + if (!(name in source)) { + return; + } + var original = source[name]; + var wrapped = replacement(original); + // Make sure it's a function first, as we need to attach an empty prototype for `defineProperties` to work + // otherwise it'll throw "TypeError: Object.defineProperties called on non-object" + if (typeof wrapped === 'function') { + try { + wrapped.prototype = wrapped.prototype || {}; + Object.defineProperties(wrapped, { + __sentry_original__: { + enumerable: false, + value: original, + }, + }); + } + catch (_Oo) { + // This can throw if multiple fill happens on a global object like XMLHttpRequest + // Fixes https://github.com/getsentry/sentry-javascript/issues/2043 + } + } + source[name] = wrapped; +} +/** + * Encodes given object into url-friendly format + * + * @param object An object that contains serializable values + * @returns string Encoded + */ +function urlEncode(object) { + return Object.keys(object) + .map(function (key) { return encodeURIComponent(key) + "=" + encodeURIComponent(object[key]); }) + .join('&'); +} +/** + * Transforms any object into an object literal with all it's attributes + * attached to it. + * + * @param value Initial source that we have to transform in order to be usable by the serializer + */ +function getWalkSource(value) { + if (isError(value)) { + var error = value; + var err = { + message: error.message, + name: error.name, + stack: error.stack, + }; + for (var i in error) { + if (Object.prototype.hasOwnProperty.call(error, i)) { + err[i] = error[i]; + } + } + return err; + } + if (isEvent(value)) { + var event_1 = value; + var source = {}; + source.type = event_1.type; + // Accessing event.target can throw (see getsentry/raven-js#838, #768) + try { + source.target = isElement(event_1.target) + ? htmlTreeAsString(event_1.target) + : Object.prototype.toString.call(event_1.target); + } + catch (_oO) { + source.target = ''; + } + try { + source.currentTarget = isElement(event_1.currentTarget) + ? htmlTreeAsString(event_1.currentTarget) + : Object.prototype.toString.call(event_1.currentTarget); + } + catch (_oO) { + source.currentTarget = ''; + } + if (typeof CustomEvent !== 'undefined' && isInstanceOf(value, CustomEvent)) { + source.detail = event_1.detail; + } + for (var i in event_1) { + if (Object.prototype.hasOwnProperty.call(event_1, i)) { + source[i] = event_1; + } + } + return source; + } + return value; +} +/** Calculates bytes size of input string */ +function utf8Length(value) { + // eslint-disable-next-line no-bitwise + return ~-encodeURI(value).split(/%..|./).length; +} +/** Calculates bytes size of input object */ +function jsonSize(value) { + return utf8Length(JSON.stringify(value)); +} +/** JSDoc */ +function normalizeToSize(object, +// Default Node.js REPL depth +depth, +// 100kB, as 200kB is max payload size, so half sounds reasonable +maxSize) { + if (depth === void 0) { depth = 3; } + if (maxSize === void 0) { maxSize = 100 * 1024; } + var serialized = normalize(object, depth); + if (jsonSize(serialized) > maxSize) { + return normalizeToSize(object, depth - 1, maxSize); + } + return serialized; +} +/** Transforms any input value into a string form, either primitive value or a type of the input */ +function serializeValue(value) { + var type = Object.prototype.toString.call(value); + // Node.js REPL notation + if (typeof value === 'string') { + return value; + } + if (type === '[object Object]') { + return '[Object]'; + } + if (type === '[object Array]') { + return '[Array]'; + } + var normalized = normalizeValue(value); + return isPrimitive(normalized) ? normalized : type; +} +/** + * normalizeValue() + * + * Takes unserializable input and make it serializable friendly + * + * - translates undefined/NaN values to "[undefined]"/"[NaN]" respectively, + * - serializes Error objects + * - filter global objects + */ +function normalizeValue(value, key) { + if (key === 'domain' && value && typeof value === 'object' && value._events) { + return '[Domain]'; + } + if (key === 'domainEmitter') { + return '[DomainEmitter]'; + } + if (typeof __webpack_require__.g !== 'undefined' && value === __webpack_require__.g) { + return '[Global]'; + } + if (typeof window !== 'undefined' && value === window) { + return '[Window]'; + } + if (typeof document !== 'undefined' && value === document) { + return '[Document]'; + } + // React's SyntheticEvent thingy + if (isSyntheticEvent(value)) { + return '[SyntheticEvent]'; + } + if (typeof value === 'number' && value !== value) { + return '[NaN]'; + } + if (value === void 0) { + return '[undefined]'; + } + if (typeof value === 'function') { + return "[Function: " + getFunctionName(value) + "]"; + } + return value; +} +/** + * Walks an object to perform a normalization on it + * + * @param key of object that's walked in current iteration + * @param value object to be walked + * @param depth Optional number indicating how deep should walking be performed + * @param memo Optional Memo class handling decycling + */ +// eslint-disable-next-line @typescript-eslint/explicit-module-boundary-types +function walk(key, value, depth, memo) { + if (depth === void 0) { depth = +Infinity; } + if (memo === void 0) { memo = new Memo(); } + // If we reach the maximum depth, serialize whatever has left + if (depth === 0) { + return serializeValue(value); + } + /* eslint-disable @typescript-eslint/no-unsafe-member-access */ + // If value implements `toJSON` method, call it and return early + if (value !== null && value !== undefined && typeof value.toJSON === 'function') { + return value.toJSON(); + } + /* eslint-enable @typescript-eslint/no-unsafe-member-access */ + // If normalized value is a primitive, there are no branches left to walk, so we can just bail out, as theres no point in going down that branch any further + var normalized = normalizeValue(value, key); + if (isPrimitive(normalized)) { + return normalized; + } + // Create source that we will use for next itterations, either objectified error object (Error type with extracted keys:value pairs) or the input itself + var source = getWalkSource(value); + // Create an accumulator that will act as a parent for all future itterations of that branch + var acc = Array.isArray(value) ? [] : {}; + // If we already walked that branch, bail out, as it's circular reference + if (memo.memoize(value)) { + return '[Circular ~]'; + } + // Walk all keys of the source + for (var innerKey in source) { + // Avoid iterating over fields in the prototype if they've somehow been exposed to enumeration. + if (!Object.prototype.hasOwnProperty.call(source, innerKey)) { + continue; + } + // Recursively walk through all the child nodes + acc[innerKey] = walk(innerKey, source[innerKey], depth - 1, memo); + } + // Once walked through all the branches, remove the parent from memo storage + memo.unmemoize(value); + // Return accumulated values + return acc; +} +/** + * normalize() + * + * - Creates a copy to prevent original input mutation + * - Skip non-enumerablers + * - Calls `toJSON` if implemented + * - Removes circular references + * - Translates non-serializeable values (undefined/NaN/Functions) to serializable format + * - Translates known global objects/Classes to a string representations + * - Takes care of Error objects serialization + * - Optionally limit depth of final output + */ +// eslint-disable-next-line @typescript-eslint/explicit-module-boundary-types +function normalize(input, depth) { + try { + return JSON.parse(JSON.stringify(input, function (key, value) { return walk(key, value, depth); })); + } + catch (_oO) { + return '**non-serializable**'; + } +} +/** + * Given any captured exception, extract its keys and create a sorted + * and truncated list that will be used inside the event message. + * eg. `Non-error exception captured with keys: foo, bar, baz` + */ +// eslint-disable-next-line @typescript-eslint/explicit-module-boundary-types +function extractExceptionKeysForMessage(exception, maxLength) { + if (maxLength === void 0) { maxLength = 40; } + var keys = Object.keys(getWalkSource(exception)); + keys.sort(); + if (!keys.length) { + return '[object has no keys]'; + } + if (keys[0].length >= maxLength) { + return truncate(keys[0], maxLength); + } + for (var includedKeys = keys.length; includedKeys > 0; includedKeys--) { + var serialized = keys.slice(0, includedKeys).join(', '); + if (serialized.length > maxLength) { + continue; + } + if (includedKeys === keys.length) { + return serialized; + } + return truncate(serialized, maxLength); + } + return ''; +} +/** + * Given any object, return the new object with removed keys that value was `undefined`. + * Works recursively on objects and arrays. + */ +function dropUndefinedKeys(val) { + var e_1, _a; + if (isPlainObject(val)) { + var obj = val; + var rv = {}; + try { + for (var _b = __values(Object.keys(obj)), _c = _b.next(); !_c.done; _c = _b.next()) { + var key = _c.value; + if (typeof obj[key] !== 'undefined') { + rv[key] = dropUndefinedKeys(obj[key]); + } + } + } + catch (e_1_1) { e_1 = { error: e_1_1 }; } + finally { + try { + if (_c && !_c.done && (_a = _b.return)) _a.call(_b); + } + finally { if (e_1) throw e_1.error; } + } + return rv; + } + if (Array.isArray(val)) { + return val.map(dropUndefinedKeys); + } + return val; +} + +;// CONCATENATED MODULE: ./node_modules/@sentry/hub/esm/session.js + + +/** + * @inheritdoc + */ +var Session = /** @class */ (function () { + function Session(context) { + this.errors = 0; + this.sid = (0,misc/* uuid4 */.DM)(); + this.timestamp = Date.now(); + this.started = Date.now(); + this.duration = 0; + this.status = SessionStatus.Ok; + if (context) { + this.update(context); + } + } + /** JSDoc */ + // eslint-disable-next-line complexity + Session.prototype.update = function (context) { + if (context === void 0) { context = {}; } + if (context.user) { + if (context.user.ip_address) { + this.ipAddress = context.user.ip_address; + } + if (!context.did) { + this.did = context.user.id || context.user.email || context.user.username; + } + } + this.timestamp = context.timestamp || Date.now(); + if (context.sid) { + // Good enough uuid validation. — Kamil + this.sid = context.sid.length === 32 ? context.sid : (0,misc/* uuid4 */.DM)(); + } + if (context.did) { + this.did = "" + context.did; + } + if (typeof context.started === 'number') { + this.started = context.started; + } + if (typeof context.duration === 'number') { + this.duration = context.duration; + } + else { + this.duration = this.timestamp - this.started; + } + if (context.release) { + this.release = context.release; + } + if (context.environment) { + this.environment = context.environment; + } + if (context.ipAddress) { + this.ipAddress = context.ipAddress; + } + if (context.userAgent) { + this.userAgent = context.userAgent; + } + if (typeof context.errors === 'number') { + this.errors = context.errors; + } + if (context.status) { + this.status = context.status; + } + }; + /** JSDoc */ + Session.prototype.close = function (status) { + if (status) { + this.update({ status: status }); + } + else if (this.status === SessionStatus.Ok) { + this.update({ status: SessionStatus.Exited }); + } + else { + this.update(); + } + }; + /** JSDoc */ + Session.prototype.toJSON = function () { + return dropUndefinedKeys({ + sid: "" + this.sid, + init: true, + started: new Date(this.started).toISOString(), + timestamp: new Date(this.timestamp).toISOString(), + status: this.status, + errors: this.errors, + did: typeof this.did === 'number' || typeof this.did === 'string' ? "" + this.did : undefined, + duration: this.duration, + attrs: dropUndefinedKeys({ + release: this.release, + environment: this.environment, + ip_address: this.ipAddress, + user_agent: this.userAgent, + }), + }); + }; + return Session; +}()); + + +;// CONCATENATED MODULE: ./node_modules/@sentry/hub/esm/hub.js + + + + +/** + * API compatibility version of this hub. + * + * WARNING: This number should only be increased when the global interface + * changes and new methods are introduced. + * + * @hidden + */ +var API_VERSION = 3; +/** + * Default maximum number of breadcrumbs added to an event. Can be overwritten + * with {@link Options.maxBreadcrumbs}. + */ +var DEFAULT_BREADCRUMBS = 100; +/** + * Absolute maximum number of breadcrumbs added to an event. The + * `maxBreadcrumbs` option cannot be higher than this value. + */ +var MAX_BREADCRUMBS = 100; +/** + * @inheritDoc + */ +var Hub = /** @class */ (function () { + /** + * Creates a new instance of the hub, will push one {@link Layer} into the + * internal stack on creation. + * + * @param client bound to the hub. + * @param scope bound to the hub. + * @param version number, higher number means higher priority. + */ + function Hub(client, scope, _version) { + if (scope === void 0) { scope = new Scope(); } + if (_version === void 0) { _version = API_VERSION; } + this._version = _version; + /** Is a {@link Layer}[] containing the client and scope */ + this._stack = [{}]; + this.getStackTop().scope = scope; + this.bindClient(client); + } + /** + * @inheritDoc + */ + Hub.prototype.isOlderThan = function (version) { + return this._version < version; + }; + /** + * @inheritDoc + */ + Hub.prototype.bindClient = function (client) { + var top = this.getStackTop(); + top.client = client; + if (client && client.setupIntegrations) { + client.setupIntegrations(); + } + }; + /** + * @inheritDoc + */ + Hub.prototype.pushScope = function () { + // We want to clone the content of prev scope + var scope = Scope.clone(this.getScope()); + this.getStack().push({ + client: this.getClient(), + scope: scope, + }); + return scope; + }; + /** + * @inheritDoc + */ + Hub.prototype.popScope = function () { + if (this.getStack().length <= 1) + return false; + return !!this.getStack().pop(); + }; + /** + * @inheritDoc + */ + Hub.prototype.withScope = function (callback) { + var scope = this.pushScope(); + try { + callback(scope); + } + finally { + this.popScope(); + } + }; + /** + * @inheritDoc + */ + Hub.prototype.getClient = function () { + return this.getStackTop().client; + }; + /** Returns the scope of the top stack. */ + Hub.prototype.getScope = function () { + return this.getStackTop().scope; + }; + /** Returns the scope stack for domains or the process. */ + Hub.prototype.getStack = function () { + return this._stack; + }; + /** Returns the topmost scope layer in the order domain > local > process. */ + Hub.prototype.getStackTop = function () { + return this._stack[this._stack.length - 1]; + }; + /** + * @inheritDoc + */ + // eslint-disable-next-line @typescript-eslint/no-explicit-any, @typescript-eslint/explicit-module-boundary-types + Hub.prototype.captureException = function (exception, hint) { + var eventId = (this._lastEventId = (0,misc/* uuid4 */.DM)()); + var finalHint = hint; + // If there's no explicit hint provided, mimick the same thing that would happen + // in the minimal itself to create a consistent behavior. + // We don't do this in the client, as it's the lowest level API, and doing this, + // would prevent user from having full control over direct calls. + if (!hint) { + var syntheticException = void 0; + try { + throw new Error('Sentry syntheticException'); + } + catch (exception) { + syntheticException = exception; + } + finalHint = { + originalException: exception, + syntheticException: syntheticException, + }; + } + this._invokeClient('captureException', exception, __assign(__assign({}, finalHint), { event_id: eventId })); + return eventId; + }; + /** + * @inheritDoc + */ + Hub.prototype.captureMessage = function (message, level, hint) { + var eventId = (this._lastEventId = (0,misc/* uuid4 */.DM)()); + var finalHint = hint; + // If there's no explicit hint provided, mimick the same thing that would happen + // in the minimal itself to create a consistent behavior. + // We don't do this in the client, as it's the lowest level API, and doing this, + // would prevent user from having full control over direct calls. + if (!hint) { + var syntheticException = void 0; + try { + throw new Error(message); + } + catch (exception) { + syntheticException = exception; + } + finalHint = { + originalException: message, + syntheticException: syntheticException, + }; + } + this._invokeClient('captureMessage', message, level, __assign(__assign({}, finalHint), { event_id: eventId })); + return eventId; + }; + /** + * @inheritDoc + */ + Hub.prototype.captureEvent = function (event, hint) { + var eventId = (this._lastEventId = (0,misc/* uuid4 */.DM)()); + this._invokeClient('captureEvent', event, __assign(__assign({}, hint), { event_id: eventId })); + return eventId; + }; + /** + * @inheritDoc + */ + Hub.prototype.lastEventId = function () { + return this._lastEventId; + }; + /** + * @inheritDoc + */ + Hub.prototype.addBreadcrumb = function (breadcrumb, hint) { + var _a = this.getStackTop(), scope = _a.scope, client = _a.client; + if (!scope || !client) + return; + // eslint-disable-next-line @typescript-eslint/unbound-method + var _b = (client.getOptions && client.getOptions()) || {}, _c = _b.beforeBreadcrumb, beforeBreadcrumb = _c === void 0 ? null : _c, _d = _b.maxBreadcrumbs, maxBreadcrumbs = _d === void 0 ? DEFAULT_BREADCRUMBS : _d; + if (maxBreadcrumbs <= 0) + return; + var timestamp = (0,time/* dateTimestampInSeconds */.yW)(); + var mergedBreadcrumb = __assign({ timestamp: timestamp }, breadcrumb); + var finalBreadcrumb = beforeBreadcrumb + ? (0,misc/* consoleSandbox */.Cf)(function () { return beforeBreadcrumb(mergedBreadcrumb, hint); }) + : mergedBreadcrumb; + if (finalBreadcrumb === null) + return; + scope.addBreadcrumb(finalBreadcrumb, Math.min(maxBreadcrumbs, MAX_BREADCRUMBS)); + }; + /** + * @inheritDoc + */ + Hub.prototype.setUser = function (user) { + var scope = this.getScope(); + if (scope) + scope.setUser(user); + }; + /** + * @inheritDoc + */ + Hub.prototype.setTags = function (tags) { + var scope = this.getScope(); + if (scope) + scope.setTags(tags); + }; + /** + * @inheritDoc + */ + Hub.prototype.setExtras = function (extras) { + var scope = this.getScope(); + if (scope) + scope.setExtras(extras); + }; + /** + * @inheritDoc + */ + Hub.prototype.setTag = function (key, value) { + var scope = this.getScope(); + if (scope) + scope.setTag(key, value); + }; + /** + * @inheritDoc + */ + Hub.prototype.setExtra = function (key, extra) { + var scope = this.getScope(); + if (scope) + scope.setExtra(key, extra); + }; + /** + * @inheritDoc + */ + // eslint-disable-next-line @typescript-eslint/no-explicit-any + Hub.prototype.setContext = function (name, context) { + var scope = this.getScope(); + if (scope) + scope.setContext(name, context); + }; + /** + * @inheritDoc + */ + Hub.prototype.configureScope = function (callback) { + var _a = this.getStackTop(), scope = _a.scope, client = _a.client; + if (scope && client) { + callback(scope); + } + }; + /** + * @inheritDoc + */ + Hub.prototype.run = function (callback) { + var oldHub = makeMain(this); + try { + callback(this); + } + finally { + makeMain(oldHub); + } + }; + /** + * @inheritDoc + */ + Hub.prototype.getIntegration = function (integration) { + var client = this.getClient(); + if (!client) + return null; + try { + return client.getIntegration(integration); + } + catch (_oO) { + logger.warn("Cannot retrieve integration " + integration.id + " from the current Hub"); + return null; + } + }; + /** + * @inheritDoc + */ + Hub.prototype.startSpan = function (context) { + return this._callExtensionMethod('startSpan', context); + }; + /** + * @inheritDoc + */ + Hub.prototype.startTransaction = function (context, customSamplingContext) { + return this._callExtensionMethod('startTransaction', context, customSamplingContext); + }; + /** + * @inheritDoc + */ + Hub.prototype.traceHeaders = function () { + return this._callExtensionMethod('traceHeaders'); + }; + /** + * @inheritDoc + */ + Hub.prototype.startSession = function (context) { + // End existing session if there's one + this.endSession(); + var _a = this.getStackTop(), scope = _a.scope, client = _a.client; + var _b = (client && client.getOptions()) || {}, release = _b.release, environment = _b.environment; + var session = new Session(__assign(__assign({ release: release, + environment: environment }, (scope && { user: scope.getUser() })), context)); + if (scope) { + scope.setSession(session); + } + return session; + }; + /** + * @inheritDoc + */ + Hub.prototype.endSession = function () { + var _a = this.getStackTop(), scope = _a.scope, client = _a.client; + if (!scope) + return; + var session = scope.getSession(); + if (session) { + session.close(); + if (client && client.captureSession) { + client.captureSession(session); + } + scope.setSession(); + } + }; + /** + * Internal helper function to call a method on the top client if it exists. + * + * @param method The method to call on the client. + * @param args Arguments to pass to the client function. + */ + // eslint-disable-next-line @typescript-eslint/no-explicit-any + Hub.prototype._invokeClient = function (method) { + var _a; + var args = []; + for (var _i = 1; _i < arguments.length; _i++) { + args[_i - 1] = arguments[_i]; + } + var _b = this.getStackTop(), scope = _b.scope, client = _b.client; + if (client && client[method]) { + // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access, @typescript-eslint/no-explicit-any + (_a = client)[method].apply(_a, tslib_es6_spread(args, [scope])); + } + }; + /** + * Calls global extension method and binding current instance to the function call + */ + // @ts-ignore Function lacks ending return statement and return type does not include 'undefined'. ts(2366) + // eslint-disable-next-line @typescript-eslint/no-explicit-any + Hub.prototype._callExtensionMethod = function (method) { + var args = []; + for (var _i = 1; _i < arguments.length; _i++) { + args[_i - 1] = arguments[_i]; + } + var carrier = getMainCarrier(); + var sentry = carrier.__SENTRY__; + if (sentry && sentry.extensions && typeof sentry.extensions[method] === 'function') { + return sentry.extensions[method].apply(this, args); + } + logger.warn("Extension method " + method + " couldn't be found, doing nothing."); + }; + return Hub; +}()); + +/** Returns the global shim registry. */ +function getMainCarrier() { + var carrier = (0,misc/* getGlobalObject */.Rf)(); + carrier.__SENTRY__ = carrier.__SENTRY__ || { + extensions: {}, + hub: undefined, + }; + return carrier; +} +/** + * Replaces the current main hub with the passed one on the global object + * + * @returns The old replaced hub + */ +function makeMain(hub) { + var registry = getMainCarrier(); + var oldHub = getHubFromCarrier(registry); + setHubOnCarrier(registry, hub); + return oldHub; +} +/** + * Returns the default hub instance. + * + * If a hub is already registered in the global carrier but this module + * contains a more recent version, it replaces the registered version. + * Otherwise, the currently registered hub will be returned. + */ +function getCurrentHub() { + // Get main carrier (global for every environment) + var registry = getMainCarrier(); + // If there's no hub, or its an old API, assign a new one + if (!hasHubOnCarrier(registry) || getHubFromCarrier(registry).isOlderThan(API_VERSION)) { + setHubOnCarrier(registry, new Hub()); + } + // Prefer domains over global if they are there (applicable only to Node environment) + if ((0,node/* isNodeEnv */.KV)()) { + return getHubFromActiveDomain(registry); + } + // Return hub that lives on a global object + return getHubFromCarrier(registry); +} +/** + * Returns the active domain, if one exists + * + * @returns The domain, or undefined if there is no active domain + */ +function getActiveDomain() { + var sentry = getMainCarrier().__SENTRY__; + return sentry && sentry.extensions && sentry.extensions.domain && sentry.extensions.domain.active; +} +/** + * Try to read the hub from an active domain, and fallback to the registry if one doesn't exist + * @returns discovered hub + */ +function getHubFromActiveDomain(registry) { + try { + var activeDomain = getActiveDomain(); + // If there's no active domain, just return global hub + if (!activeDomain) { + return getHubFromCarrier(registry); + } + // If there's no hub on current domain, or it's an old API, assign a new one + if (!hasHubOnCarrier(activeDomain) || getHubFromCarrier(activeDomain).isOlderThan(API_VERSION)) { + var registryHubTopStack = getHubFromCarrier(registry).getStackTop(); + setHubOnCarrier(activeDomain, new Hub(registryHubTopStack.client, Scope.clone(registryHubTopStack.scope))); + } + // Return hub that lives on a domain + return getHubFromCarrier(activeDomain); + } + catch (_Oo) { + // Return hub that lives on a global object + return getHubFromCarrier(registry); + } +} +/** + * This will tell whether a carrier has a hub on it or not + * @param carrier object + */ +function hasHubOnCarrier(carrier) { + return !!(carrier && carrier.__SENTRY__ && carrier.__SENTRY__.hub); +} +/** + * This will create a new {@link Hub} and add to the passed object on + * __SENTRY__.hub. + * @param carrier object + * @hidden + */ +function getHubFromCarrier(carrier) { + if (carrier && carrier.__SENTRY__ && carrier.__SENTRY__.hub) + return carrier.__SENTRY__.hub; + carrier.__SENTRY__ = carrier.__SENTRY__ || {}; + carrier.__SENTRY__.hub = new Hub(); + return carrier.__SENTRY__.hub; +} +/** + * This will set passed {@link Hub} on the passed object's __SENTRY__.hub attribute + * @param carrier object + * @param hub Hub + */ +function setHubOnCarrier(carrier, hub) { + if (!carrier) + return false; + carrier.__SENTRY__ = carrier.__SENTRY__ || {}; + carrier.__SENTRY__.hub = hub; + return true; +} + +;// CONCATENATED MODULE: ./node_modules/@sentry/minimal/esm/index.js + + +/** + * This calls a function on the current hub. + * @param method function to call on hub. + * @param args to pass to function. + */ +// eslint-disable-next-line @typescript-eslint/no-explicit-any +function callOnHub(method) { + var args = []; + for (var _i = 1; _i < arguments.length; _i++) { + args[_i - 1] = arguments[_i]; + } + var hub = getCurrentHub(); + if (hub && hub[method]) { + // eslint-disable-next-line @typescript-eslint/no-explicit-any + return hub[method].apply(hub, tslib_es6_spread(args)); + } + throw new Error("No hub defined or " + method + " was not found on the hub, please open a bug report."); +} +/** + * Captures an exception event and sends it to Sentry. + * + * @param exception An exception-like object. + * @returns The generated eventId. + */ +// eslint-disable-next-line @typescript-eslint/no-explicit-any, @typescript-eslint/explicit-module-boundary-types +function captureException(exception, captureContext) { + var syntheticException; + try { + throw new Error('Sentry syntheticException'); + } + catch (exception) { + syntheticException = exception; + } + return callOnHub('captureException', exception, { + captureContext: captureContext, + originalException: exception, + syntheticException: syntheticException, + }); +} +/** + * Captures a message event and sends it to Sentry. + * + * @param message The message to send to Sentry. + * @param level Define the level of the message. + * @returns The generated eventId. + */ +function captureMessage(message, captureContext) { + var syntheticException; + try { + throw new Error(message); + } + catch (exception) { + syntheticException = exception; + } + // This is necessary to provide explicit scopes upgrade, without changing the original + // arity of the `captureMessage(message, level)` method. + var level = typeof captureContext === 'string' ? captureContext : undefined; + var context = typeof captureContext !== 'string' ? { captureContext: captureContext } : undefined; + return callOnHub('captureMessage', message, level, __assign({ originalException: message, syntheticException: syntheticException }, context)); +} +/** + * Captures a manually created event and sends it to Sentry. + * + * @param event The event to send to Sentry. + * @returns The generated eventId. + */ +function captureEvent(event) { + return callOnHub('captureEvent', event); +} +/** + * Callback to set context information onto the scope. + * @param callback Callback function that receives Scope. + */ +function configureScope(callback) { + callOnHub('configureScope', callback); +} +/** + * Records a new breadcrumb which will be attached to future events. + * + * Breadcrumbs will be added to subsequent events to provide more context on + * user's actions prior to an error or crash. + * + * @param breadcrumb The breadcrumb to record. + */ +function addBreadcrumb(breadcrumb) { + callOnHub('addBreadcrumb', breadcrumb); +} +/** + * Sets context data with the given name. + * @param name of the context + * @param context Any kind of data. This data will be normalized. + */ +// eslint-disable-next-line @typescript-eslint/no-explicit-any +function setContext(name, context) { + callOnHub('setContext', name, context); +} +/** + * Set an object that will be merged sent as extra data with the event. + * @param extras Extras object to merge into current context. + */ +function setExtras(extras) { + callOnHub('setExtras', extras); +} +/** + * Set an object that will be merged sent as tags data with the event. + * @param tags Tags context object to merge into current context. + */ +function setTags(tags) { + callOnHub('setTags', tags); +} +/** + * Set key:value that will be sent as extra data with the event. + * @param key String of extra + * @param extra Any kind of data. This data will be normalized. + */ +function setExtra(key, extra) { + callOnHub('setExtra', key, extra); +} +/** + * Set key:value that will be sent as tags data with the event. + * @param key String key of tag + * @param value String value of tag + */ +function setTag(key, value) { + callOnHub('setTag', key, value); +} +/** + * Updates user context information for future events. + * + * @param user User context object to be set in the current context. Pass `null` to unset the user. + */ +function setUser(user) { + callOnHub('setUser', user); +} +/** + * Creates a new scope with and executes the given operation within. + * The scope is automatically removed once the operation + * finishes or throws. + * + * This is essentially a convenience function for: + * + * pushScope(); + * callback(); + * popScope(); + * + * @param callback that will be enclosed into push/popScope. + */ +function withScope(callback) { + callOnHub('withScope', callback); +} +/** + * Calls a function on the latest client. Use this with caution, it's meant as + * in "internal" helper so we don't need to expose every possible function in + * the shim. It is not guaranteed that the client actually implements the + * function. + * + * @param method The method to call on the client/client. + * @param args Arguments to pass to the client/fontend. + * @hidden + */ +// eslint-disable-next-line @typescript-eslint/no-explicit-any +function _callOnClient(method) { + var args = []; + for (var _i = 1; _i < arguments.length; _i++) { + args[_i - 1] = arguments[_i]; + } + callOnHub.apply(void 0, __spread(['_invokeClient', method], args)); +} +/** + * Starts a new `Transaction` and returns it. This is the entry point to manual tracing instrumentation. + * + * A tree structure can be built by adding child spans to the transaction, and child spans to other spans. To start a + * new child span within the transaction or any span, call the respective `.startChild()` method. + * + * Every child span must be finished before the transaction is finished, otherwise the unfinished spans are discarded. + * + * The transaction must be finished with a call to its `.finish()` method, at which point the transaction with all its + * finished child spans will be sent to Sentry. + * + * @param context Properties of the new `Transaction`. + * @param customSamplingContext Information given to the transaction sampling function (along with context-dependent + * default values). See {@link Options.tracesSampler}. + * + * @returns The transaction which was just started + */ +function startTransaction(context, customSamplingContext) { + return callOnHub('startTransaction', __assign({}, context), customSamplingContext); +} + +;// CONCATENATED MODULE: ./node_modules/@sentry/utils/esm/polyfill.js +var setPrototypeOf = Object.setPrototypeOf || ({ __proto__: [] } instanceof Array ? setProtoOf : mixinProperties); +/** + * setPrototypeOf polyfill using __proto__ + */ +// eslint-disable-next-line @typescript-eslint/ban-types +function setProtoOf(obj, proto) { + // @ts-ignore __proto__ does not exist on obj + obj.__proto__ = proto; + return obj; +} +/** + * setPrototypeOf polyfill using mixin + */ +// eslint-disable-next-line @typescript-eslint/ban-types +function mixinProperties(obj, proto) { + for (var prop in proto) { + // eslint-disable-next-line no-prototype-builtins + if (!obj.hasOwnProperty(prop)) { + // @ts-ignore typescript complains about indexing so we remove + obj[prop] = proto[prop]; + } + } + return obj; +} + +;// CONCATENATED MODULE: ./node_modules/@sentry/utils/esm/error.js + + +/** An error emitted by Sentry SDKs and related utilities. */ +var SentryError = /** @class */ (function (_super) { + __extends(SentryError, _super); + function SentryError(message) { + var _newTarget = this.constructor; + var _this = _super.call(this, message) || this; + _this.message = message; + _this.name = _newTarget.prototype.constructor.name; + setPrototypeOf(_this, _newTarget.prototype); + return _this; + } + return SentryError; +}(Error)); + + +;// CONCATENATED MODULE: ./node_modules/@sentry/utils/esm/dsn.js + + +/** Regular expression used to parse a Dsn. */ +var DSN_REGEX = /^(?:(\w+):)\/\/(?:(\w+)(?::(\w+))?@)([\w.-]+)(?::(\d+))?\/(.+)/; +/** Error message */ +var ERROR_MESSAGE = 'Invalid Dsn'; +/** The Sentry Dsn, identifying a Sentry instance and project. */ +var Dsn = /** @class */ (function () { + /** Creates a new Dsn component */ + function Dsn(from) { + if (typeof from === 'string') { + this._fromString(from); + } + else { + this._fromComponents(from); + } + this._validate(); + } + /** + * Renders the string representation of this Dsn. + * + * By default, this will render the public representation without the password + * component. To get the deprecated private representation, set `withPassword` + * to true. + * + * @param withPassword When set to true, the password will be included. + */ + Dsn.prototype.toString = function (withPassword) { + if (withPassword === void 0) { withPassword = false; } + var _a = this, host = _a.host, path = _a.path, pass = _a.pass, port = _a.port, projectId = _a.projectId, protocol = _a.protocol, user = _a.user; + return (protocol + "://" + user + (withPassword && pass ? ":" + pass : '') + + ("@" + host + (port ? ":" + port : '') + "/" + (path ? path + "/" : path) + projectId)); + }; + /** Parses a string into this Dsn. */ + Dsn.prototype._fromString = function (str) { + var match = DSN_REGEX.exec(str); + if (!match) { + throw new SentryError(ERROR_MESSAGE); + } + var _a = __read(match.slice(1), 6), protocol = _a[0], user = _a[1], _b = _a[2], pass = _b === void 0 ? '' : _b, host = _a[3], _c = _a[4], port = _c === void 0 ? '' : _c, lastPath = _a[5]; + var path = ''; + var projectId = lastPath; + var split = projectId.split('/'); + if (split.length > 1) { + path = split.slice(0, -1).join('/'); + projectId = split.pop(); + } + if (projectId) { + var projectMatch = projectId.match(/^\d+/); + if (projectMatch) { + projectId = projectMatch[0]; + } + } + this._fromComponents({ host: host, pass: pass, path: path, projectId: projectId, port: port, protocol: protocol, user: user }); + }; + /** Maps Dsn components into this instance. */ + Dsn.prototype._fromComponents = function (components) { + this.protocol = components.protocol; + this.user = components.user; + this.pass = components.pass || ''; + this.host = components.host; + this.port = components.port || ''; + this.path = components.path || ''; + this.projectId = components.projectId; + }; + /** Validates this Dsn and throws on error. */ + Dsn.prototype._validate = function () { + var _this = this; + ['protocol', 'user', 'host', 'projectId'].forEach(function (component) { + if (!_this[component]) { + throw new SentryError(ERROR_MESSAGE + ": " + component + " missing"); + } + }); + if (!this.projectId.match(/^\d+$/)) { + throw new SentryError(ERROR_MESSAGE + ": Invalid projectId " + this.projectId); + } + if (this.protocol !== 'http' && this.protocol !== 'https') { + throw new SentryError(ERROR_MESSAGE + ": Invalid protocol " + this.protocol); + } + if (this.port && isNaN(parseInt(this.port, 10))) { + throw new SentryError(ERROR_MESSAGE + ": Invalid port " + this.port); + } + }; + return Dsn; +}()); + + +;// CONCATENATED MODULE: ./node_modules/@sentry/core/esm/integration.js + + + +var installedIntegrations = []; +/** Gets integration to install */ +function getIntegrationsToSetup(options) { + var defaultIntegrations = (options.defaultIntegrations && tslib_es6_spread(options.defaultIntegrations)) || []; + var userIntegrations = options.integrations; + var integrations = []; + if (Array.isArray(userIntegrations)) { + var userIntegrationsNames_1 = userIntegrations.map(function (i) { return i.name; }); + var pickedIntegrationsNames_1 = []; + // Leave only unique default integrations, that were not overridden with provided user integrations + defaultIntegrations.forEach(function (defaultIntegration) { + if (userIntegrationsNames_1.indexOf(defaultIntegration.name) === -1 && + pickedIntegrationsNames_1.indexOf(defaultIntegration.name) === -1) { + integrations.push(defaultIntegration); + pickedIntegrationsNames_1.push(defaultIntegration.name); + } + }); + // Don't add same user integration twice + userIntegrations.forEach(function (userIntegration) { + if (pickedIntegrationsNames_1.indexOf(userIntegration.name) === -1) { + integrations.push(userIntegration); + pickedIntegrationsNames_1.push(userIntegration.name); + } + }); + } + else if (typeof userIntegrations === 'function') { + integrations = userIntegrations(defaultIntegrations); + integrations = Array.isArray(integrations) ? integrations : [integrations]; + } + else { + integrations = tslib_es6_spread(defaultIntegrations); + } + // Make sure that if present, `Debug` integration will always run last + var integrationsNames = integrations.map(function (i) { return i.name; }); + var alwaysLastToRun = 'Debug'; + if (integrationsNames.indexOf(alwaysLastToRun) !== -1) { + integrations.push.apply(integrations, tslib_es6_spread(integrations.splice(integrationsNames.indexOf(alwaysLastToRun), 1))); + } + return integrations; +} +/** Setup given integration */ +function setupIntegration(integration) { + if (installedIntegrations.indexOf(integration.name) !== -1) { + return; + } + integration.setupOnce(addGlobalEventProcessor, getCurrentHub); + installedIntegrations.push(integration.name); + logger.log("Integration installed: " + integration.name); +} +/** + * Given a list of integration instances this installs them all. When `withDefaults` is set to `true` then all default + * integrations are added unless they were already provided before. + * @param integrations array of integration instances + * @param withDefault should enable default integrations + */ +function setupIntegrations(options) { + var integrations = {}; + getIntegrationsToSetup(options).forEach(function (integration) { + integrations[integration.name] = integration; + setupIntegration(integration); + }); + return integrations; +} + +;// CONCATENATED MODULE: ./node_modules/@sentry/core/esm/baseclient.js + +/* eslint-disable max-lines */ + + + + +/** + * Base implementation for all JavaScript SDK clients. + * + * Call the constructor with the corresponding backend constructor and options + * specific to the client subclass. To access these options later, use + * {@link Client.getOptions}. Also, the Backend instance is available via + * {@link Client.getBackend}. + * + * If a Dsn is specified in the options, it will be parsed and stored. Use + * {@link Client.getDsn} to retrieve the Dsn at any moment. In case the Dsn is + * invalid, the constructor will throw a {@link SentryException}. Note that + * without a valid Dsn, the SDK will not send any events to Sentry. + * + * Before sending an event via the backend, it is passed through + * {@link BaseClient.prepareEvent} to add SDK information and scope data + * (breadcrumbs and context). To add more custom information, override this + * method and extend the resulting prepared event. + * + * To issue automatically created events (e.g. via instrumentation), use + * {@link Client.captureEvent}. It will prepare the event and pass it through + * the callback lifecycle. To issue auto-breadcrumbs, use + * {@link Client.addBreadcrumb}. + * + * @example + * class NodeClient extends BaseClient { + * public constructor(options: NodeOptions) { + * super(NodeBackend, options); + * } + * + * // ... + * } + */ +var BaseClient = /** @class */ (function () { + /** + * Initializes this client instance. + * + * @param backendClass A constructor function to create the backend. + * @param options Options for the client. + */ + function BaseClient(backendClass, options) { + /** Array of used integrations. */ + this._integrations = {}; + /** Number of call being processed */ + this._processing = 0; + this._backend = new backendClass(options); + this._options = options; + if (options.dsn) { + this._dsn = new Dsn(options.dsn); + } + } + /** + * @inheritDoc + */ + // eslint-disable-next-line @typescript-eslint/no-explicit-any, @typescript-eslint/explicit-module-boundary-types + BaseClient.prototype.captureException = function (exception, hint, scope) { + var _this = this; + var eventId = hint && hint.event_id; + this._process(this._getBackend() + .eventFromException(exception, hint) + .then(function (event) { return _this._captureEvent(event, hint, scope); }) + .then(function (result) { + eventId = result; + })); + return eventId; + }; + /** + * @inheritDoc + */ + BaseClient.prototype.captureMessage = function (message, level, hint, scope) { + var _this = this; + var eventId = hint && hint.event_id; + var promisedEvent = isPrimitive(message) + ? this._getBackend().eventFromMessage("" + message, level, hint) + : this._getBackend().eventFromException(message, hint); + this._process(promisedEvent + .then(function (event) { return _this._captureEvent(event, hint, scope); }) + .then(function (result) { + eventId = result; + })); + return eventId; + }; + /** + * @inheritDoc + */ + BaseClient.prototype.captureEvent = function (event, hint, scope) { + var eventId = hint && hint.event_id; + this._process(this._captureEvent(event, hint, scope).then(function (result) { + eventId = result; + })); + return eventId; + }; + /** + * @inheritDoc + */ + BaseClient.prototype.captureSession = function (session) { + if (!session.release) { + logger.warn('Discarded session because of missing release'); + } + else { + this._sendSession(session); + } + }; + /** + * @inheritDoc + */ + BaseClient.prototype.getDsn = function () { + return this._dsn; + }; + /** + * @inheritDoc + */ + BaseClient.prototype.getOptions = function () { + return this._options; + }; + /** + * @inheritDoc + */ + BaseClient.prototype.flush = function (timeout) { + var _this = this; + return this._isClientProcessing(timeout).then(function (ready) { + return _this._getBackend() + .getTransport() + .close(timeout) + .then(function (transportFlushed) { return ready && transportFlushed; }); + }); + }; + /** + * @inheritDoc + */ + BaseClient.prototype.close = function (timeout) { + var _this = this; + return this.flush(timeout).then(function (result) { + _this.getOptions().enabled = false; + return result; + }); + }; + /** + * Sets up the integrations + */ + BaseClient.prototype.setupIntegrations = function () { + if (this._isEnabled()) { + this._integrations = setupIntegrations(this._options); + } + }; + /** + * @inheritDoc + */ + BaseClient.prototype.getIntegration = function (integration) { + try { + return this._integrations[integration.id] || null; + } + catch (_oO) { + logger.warn("Cannot retrieve integration " + integration.id + " from the current Client"); + return null; + } + }; + /** Updates existing session based on the provided event */ + BaseClient.prototype._updateSessionFromEvent = function (session, event) { + var e_1, _a; + var crashed = false; + var errored = false; + var userAgent; + var exceptions = event.exception && event.exception.values; + if (exceptions) { + errored = true; + try { + for (var exceptions_1 = __values(exceptions), exceptions_1_1 = exceptions_1.next(); !exceptions_1_1.done; exceptions_1_1 = exceptions_1.next()) { + var ex = exceptions_1_1.value; + var mechanism = ex.mechanism; + if (mechanism && mechanism.handled === false) { + crashed = true; + break; + } + } + } + catch (e_1_1) { e_1 = { error: e_1_1 }; } + finally { + try { + if (exceptions_1_1 && !exceptions_1_1.done && (_a = exceptions_1.return)) _a.call(exceptions_1); + } + finally { if (e_1) throw e_1.error; } + } + } + var user = event.user; + if (!session.userAgent) { + var headers = event.request ? event.request.headers : {}; + for (var key in headers) { + if (key.toLowerCase() === 'user-agent') { + userAgent = headers[key]; + break; + } + } + } + session.update(__assign(__assign({}, (crashed && { status: SessionStatus.Crashed })), { user: user, + userAgent: userAgent, errors: session.errors + Number(errored || crashed) })); + }; + /** Deliver captured session to Sentry */ + BaseClient.prototype._sendSession = function (session) { + this._getBackend().sendSession(session); + }; + /** Waits for the client to be done with processing. */ + BaseClient.prototype._isClientProcessing = function (timeout) { + var _this = this; + return new SyncPromise(function (resolve) { + var ticked = 0; + var tick = 1; + var interval = setInterval(function () { + if (_this._processing == 0) { + clearInterval(interval); + resolve(true); + } + else { + ticked += tick; + if (timeout && ticked >= timeout) { + clearInterval(interval); + resolve(false); + } + } + }, tick); + }); + }; + /** Returns the current backend. */ + BaseClient.prototype._getBackend = function () { + return this._backend; + }; + /** Determines whether this SDK is enabled and a valid Dsn is present. */ + BaseClient.prototype._isEnabled = function () { + return this.getOptions().enabled !== false && this._dsn !== undefined; + }; + /** + * Adds common information to events. + * + * The information includes release and environment from `options`, + * breadcrumbs and context (extra, tags and user) from the scope. + * + * Information that is already present in the event is never overwritten. For + * nested objects, such as the context, keys are merged. + * + * @param event The original event. + * @param hint May contain additional information about the original exception. + * @param scope A scope containing event metadata. + * @returns A new event with more information. + */ + BaseClient.prototype._prepareEvent = function (event, scope, hint) { + var _this = this; + var _a = this.getOptions().normalizeDepth, normalizeDepth = _a === void 0 ? 3 : _a; + var prepared = __assign(__assign({}, event), { event_id: event.event_id || (hint && hint.event_id ? hint.event_id : (0,misc/* uuid4 */.DM)()), timestamp: event.timestamp || (0,time/* dateTimestampInSeconds */.yW)() }); + this._applyClientOptions(prepared); + this._applyIntegrationsMetadata(prepared); + // If we have scope given to us, use it as the base for further modifications. + // This allows us to prevent unnecessary copying of data if `captureContext` is not provided. + var finalScope = scope; + if (hint && hint.captureContext) { + finalScope = Scope.clone(finalScope).update(hint.captureContext); + } + // We prepare the result here with a resolved Event. + var result = SyncPromise.resolve(prepared); + // This should be the last thing called, since we want that + // {@link Hub.addEventProcessor} gets the finished prepared event. + if (finalScope) { + // In case we have a hub we reassign it. + result = finalScope.applyToEvent(prepared, hint); + } + return result.then(function (evt) { + if (typeof normalizeDepth === 'number' && normalizeDepth > 0) { + return _this._normalizeEvent(evt, normalizeDepth); + } + return evt; + }); + }; + /** + * Applies `normalize` function on necessary `Event` attributes to make them safe for serialization. + * Normalized keys: + * - `breadcrumbs.data` + * - `user` + * - `contexts` + * - `extra` + * @param event Event + * @returns Normalized event + */ + BaseClient.prototype._normalizeEvent = function (event, depth) { + if (!event) { + return null; + } + var normalized = __assign(__assign(__assign(__assign(__assign({}, event), (event.breadcrumbs && { + breadcrumbs: event.breadcrumbs.map(function (b) { return (__assign(__assign({}, b), (b.data && { + data: normalize(b.data, depth), + }))); }), + })), (event.user && { + user: normalize(event.user, depth), + })), (event.contexts && { + contexts: normalize(event.contexts, depth), + })), (event.extra && { + extra: normalize(event.extra, depth), + })); + // event.contexts.trace stores information about a Transaction. Similarly, + // event.spans[] stores information about child Spans. Given that a + // Transaction is conceptually a Span, normalization should apply to both + // Transactions and Spans consistently. + // For now the decision is to skip normalization of Transactions and Spans, + // so this block overwrites the normalized event to add back the original + // Transaction information prior to normalization. + if (event.contexts && event.contexts.trace) { + // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access + normalized.contexts.trace = event.contexts.trace; + } + return normalized; + }; + /** + * Enhances event using the client configuration. + * It takes care of all "static" values like environment, release and `dist`, + * as well as truncating overly long values. + * @param event event instance to be enhanced + */ + BaseClient.prototype._applyClientOptions = function (event) { + var options = this.getOptions(); + var environment = options.environment, release = options.release, dist = options.dist, _a = options.maxValueLength, maxValueLength = _a === void 0 ? 250 : _a; + if (!('environment' in event)) { + event.environment = 'environment' in options ? environment : 'production'; + } + if (event.release === undefined && release !== undefined) { + event.release = release; + } + if (event.dist === undefined && dist !== undefined) { + event.dist = dist; + } + if (event.message) { + event.message = truncate(event.message, maxValueLength); + } + var exception = event.exception && event.exception.values && event.exception.values[0]; + if (exception && exception.value) { + exception.value = truncate(exception.value, maxValueLength); + } + var request = event.request; + if (request && request.url) { + request.url = truncate(request.url, maxValueLength); + } + }; + /** + * This function adds all used integrations to the SDK info in the event. + * @param sdkInfo The sdkInfo of the event that will be filled with all integrations. + */ + BaseClient.prototype._applyIntegrationsMetadata = function (event) { + var sdkInfo = event.sdk; + var integrationsArray = Object.keys(this._integrations); + if (sdkInfo && integrationsArray.length > 0) { + sdkInfo.integrations = integrationsArray; + } + }; + /** + * Tells the backend to send this event + * @param event The Sentry event to send + */ + BaseClient.prototype._sendEvent = function (event) { + this._getBackend().sendEvent(event); + }; + /** + * Processes the event and logs an error in case of rejection + * @param event + * @param hint + * @param scope + */ + BaseClient.prototype._captureEvent = function (event, hint, scope) { + return this._processEvent(event, hint, scope).then(function (finalEvent) { + return finalEvent.event_id; + }, function (reason) { + logger.error(reason); + return undefined; + }); + }; + /** + * Processes an event (either error or message) and sends it to Sentry. + * + * This also adds breadcrumbs and context information to the event. However, + * platform specific meta data (such as the User's IP address) must be added + * by the SDK implementor. + * + * + * @param event The event to send to Sentry. + * @param hint May contain additional information about the original exception. + * @param scope A scope containing event metadata. + * @returns A SyncPromise that resolves with the event or rejects in case event was/will not be send. + */ + BaseClient.prototype._processEvent = function (event, hint, scope) { + var _this = this; + // eslint-disable-next-line @typescript-eslint/unbound-method + var _a = this.getOptions(), beforeSend = _a.beforeSend, sampleRate = _a.sampleRate; + if (!this._isEnabled()) { + return SyncPromise.reject(new SentryError('SDK not enabled, will not send event.')); + } + var isTransaction = event.type === 'transaction'; + // 1.0 === 100% events are sent + // 0.0 === 0% events are sent + // Sampling for transaction happens somewhere else + if (!isTransaction && typeof sampleRate === 'number' && Math.random() > sampleRate) { + return SyncPromise.reject(new SentryError('This event has been sampled, will not send event.')); + } + return this._prepareEvent(event, scope, hint) + .then(function (prepared) { + if (prepared === null) { + throw new SentryError('An event processor returned null, will not send event.'); + } + var isInternalException = hint && hint.data && hint.data.__sentry__ === true; + if (isInternalException || isTransaction || !beforeSend) { + return prepared; + } + var beforeSendResult = beforeSend(prepared, hint); + if (typeof beforeSendResult === 'undefined') { + throw new SentryError('`beforeSend` method has to return `null` or a valid event.'); + } + else if (isThenable(beforeSendResult)) { + return beforeSendResult.then(function (event) { return event; }, function (e) { + throw new SentryError("beforeSend rejected with " + e); + }); + } + return beforeSendResult; + }) + .then(function (processedEvent) { + if (processedEvent === null) { + throw new SentryError('`beforeSend` returned `null`, will not send event.'); + } + var session = scope && scope.getSession(); + if (!isTransaction && session) { + _this._updateSessionFromEvent(session, processedEvent); + } + _this._sendEvent(processedEvent); + return processedEvent; + }) + .then(null, function (reason) { + if (reason instanceof SentryError) { + throw reason; + } + _this.captureException(reason, { + data: { + __sentry__: true, + }, + originalException: reason, + }); + throw new SentryError("Event processing pipeline threw an error, original event will not be sent. Details have been sent as a new event.\nReason: " + reason); + }); + }; + /** + * Occupies the client with processing and event + */ + BaseClient.prototype._process = function (promise) { + var _this = this; + this._processing += 1; + promise.then(function (value) { + _this._processing -= 1; + return value; + }, function (reason) { + _this._processing -= 1; + return reason; + }); + }; + return BaseClient; +}()); + + +;// CONCATENATED MODULE: ./node_modules/@sentry/core/esm/transports/noop.js + + +/** Noop transport */ +var NoopTransport = /** @class */ (function () { + function NoopTransport() { + } + /** + * @inheritDoc + */ + NoopTransport.prototype.sendEvent = function (_) { + return SyncPromise.resolve({ + reason: "NoopTransport: Event has been skipped because no Dsn is configured.", + status: Status.Skipped, + }); + }; + /** + * @inheritDoc + */ + NoopTransport.prototype.close = function (_) { + return SyncPromise.resolve(true); + }; + return NoopTransport; +}()); + + +;// CONCATENATED MODULE: ./node_modules/@sentry/core/esm/basebackend.js + + +/** + * This is the base implemention of a Backend. + * @hidden + */ +var BaseBackend = /** @class */ (function () { + /** Creates a new backend instance. */ + function BaseBackend(options) { + this._options = options; + if (!this._options.dsn) { + logger.warn('No DSN provided, backend will not do anything.'); + } + this._transport = this._setupTransport(); + } + /** + * @inheritDoc + */ + // eslint-disable-next-line @typescript-eslint/no-explicit-any, @typescript-eslint/explicit-module-boundary-types + BaseBackend.prototype.eventFromException = function (_exception, _hint) { + throw new SentryError('Backend has to implement `eventFromException` method'); + }; + /** + * @inheritDoc + */ + BaseBackend.prototype.eventFromMessage = function (_message, _level, _hint) { + throw new SentryError('Backend has to implement `eventFromMessage` method'); + }; + /** + * @inheritDoc + */ + BaseBackend.prototype.sendEvent = function (event) { + this._transport.sendEvent(event).then(null, function (reason) { + logger.error("Error while sending event: " + reason); + }); + }; + /** + * @inheritDoc + */ + BaseBackend.prototype.sendSession = function (session) { + if (!this._transport.sendSession) { + logger.warn("Dropping session because custom transport doesn't implement sendSession"); + return; + } + this._transport.sendSession(session).then(null, function (reason) { + logger.error("Error while sending session: " + reason); + }); + }; + /** + * @inheritDoc + */ + BaseBackend.prototype.getTransport = function () { + return this._transport; + }; + /** + * Sets up the transport so it can be used later to send requests. + */ + BaseBackend.prototype._setupTransport = function () { + return new NoopTransport(); + }; + return BaseBackend; +}()); + + +;// CONCATENATED MODULE: ./node_modules/@sentry/utils/esm/supports.js + + +/** + * Tells whether current environment supports ErrorEvent objects + * {@link supportsErrorEvent}. + * + * @returns Answer to the given question. + */ +function supportsErrorEvent() { + try { + new ErrorEvent(''); + return true; + } + catch (e) { + return false; + } +} +/** + * Tells whether current environment supports DOMError objects + * {@link supportsDOMError}. + * + * @returns Answer to the given question. + */ +function supportsDOMError() { + try { + // Chrome: VM89:1 Uncaught TypeError: Failed to construct 'DOMError': + // 1 argument required, but only 0 present. + // @ts-ignore It really needs 1 argument, not 0. + new DOMError(''); + return true; + } + catch (e) { + return false; + } +} +/** + * Tells whether current environment supports DOMException objects + * {@link supportsDOMException}. + * + * @returns Answer to the given question. + */ +function supportsDOMException() { + try { + new DOMException(''); + return true; + } + catch (e) { + return false; + } +} +/** + * Tells whether current environment supports Fetch API + * {@link supportsFetch}. + * + * @returns Answer to the given question. + */ +function supportsFetch() { + if (!('fetch' in (0,misc/* getGlobalObject */.Rf)())) { + return false; + } + try { + new Headers(); + new Request(''); + new Response(); + return true; + } + catch (e) { + return false; + } +} +/** + * isNativeFetch checks if the given function is a native implementation of fetch() + */ +// eslint-disable-next-line @typescript-eslint/ban-types +function isNativeFetch(func) { + return func && /^function fetch\(\)\s+\{\s+\[native code\]\s+\}$/.test(func.toString()); +} +/** + * Tells whether current environment supports Fetch API natively + * {@link supportsNativeFetch}. + * + * @returns true if `window.fetch` is natively implemented, false otherwise + */ +function supportsNativeFetch() { + if (!supportsFetch()) { + return false; + } + var global = (0,misc/* getGlobalObject */.Rf)(); + // Fast path to avoid DOM I/O + // eslint-disable-next-line @typescript-eslint/unbound-method + if (isNativeFetch(global.fetch)) { + return true; + } + // window.fetch is implemented, but is polyfilled or already wrapped (e.g: by a chrome extension) + // so create a "pure" iframe to see if that has native fetch + var result = false; + var doc = global.document; + // eslint-disable-next-line deprecation/deprecation + if (doc && typeof doc.createElement === "function") { + try { + var sandbox = doc.createElement('iframe'); + sandbox.hidden = true; + doc.head.appendChild(sandbox); + if (sandbox.contentWindow && sandbox.contentWindow.fetch) { + // eslint-disable-next-line @typescript-eslint/unbound-method + result = isNativeFetch(sandbox.contentWindow.fetch); + } + doc.head.removeChild(sandbox); + } + catch (err) { + logger.warn('Could not create sandbox iframe for pure fetch check, bailing to window.fetch: ', err); + } + } + return result; +} +/** + * Tells whether current environment supports ReportingObserver API + * {@link supportsReportingObserver}. + * + * @returns Answer to the given question. + */ +function supportsReportingObserver() { + return 'ReportingObserver' in getGlobalObject(); +} +/** + * Tells whether current environment supports Referrer Policy API + * {@link supportsReferrerPolicy}. + * + * @returns Answer to the given question. + */ +function supportsReferrerPolicy() { + // Despite all stars in the sky saying that Edge supports old draft syntax, aka 'never', 'always', 'origin' and 'default + // https://caniuse.com/#feat=referrer-policy + // It doesn't. And it throw exception instead of ignoring this parameter... + // REF: https://github.com/getsentry/raven-js/issues/1233 + if (!supportsFetch()) { + return false; + } + try { + new Request('_', { + referrerPolicy: 'origin', + }); + return true; + } + catch (e) { + return false; + } +} +/** + * Tells whether current environment supports History API + * {@link supportsHistory}. + * + * @returns Answer to the given question. + */ +function supportsHistory() { + // NOTE: in Chrome App environment, touching history.pushState, *even inside + // a try/catch block*, will cause Chrome to output an error to console.error + // borrowed from: https://github.com/angular/angular.js/pull/13945/files + var global = (0,misc/* getGlobalObject */.Rf)(); + /* eslint-disable @typescript-eslint/no-unsafe-member-access */ + // eslint-disable-next-line @typescript-eslint/no-explicit-any + var chrome = global.chrome; + var isChromePackagedApp = chrome && chrome.app && chrome.app.runtime; + /* eslint-enable @typescript-eslint/no-unsafe-member-access */ + var hasHistoryApi = 'history' in global && !!global.history.pushState && !!global.history.replaceState; + return !isChromePackagedApp && hasHistoryApi; +} + +;// CONCATENATED MODULE: ./node_modules/@sentry/browser/esm/tracekit.js +/** + * This was originally forked from https://github.com/occ/TraceKit, but has since been + * largely modified and is now maintained as part of Sentry JS SDK. + */ + +// global reference to slice +var UNKNOWN_FUNCTION = '?'; +// Chromium based browsers: Chrome, Brave, new Opera, new Edge +var chrome = /^\s*at (?:(.*?) ?\()?((?:file|https?|blob|chrome-extension|address|native|eval|webpack||[-a-z]+:|.*bundle|\/).*?)(?::(\d+))?(?::(\d+))?\)?\s*$/i; +// gecko regex: `(?:bundle|\d+\.js)`: `bundle` is for react native, `\d+\.js` also but specifically for ram bundles because it +// generates filenames without a prefix like `file://` the filenames in the stacktrace are just 42.js +// We need this specific case for now because we want no other regex to match. +var gecko = /^\s*(.*?)(?:\((.*?)\))?(?:^|@)?((?:file|https?|blob|chrome|webpack|resource|moz-extension|capacitor).*?:\/.*?|\[native code\]|[^@]*(?:bundle|\d+\.js))(?::(\d+))?(?::(\d+))?\s*$/i; +var winjs = /^\s*at (?:((?:\[object object\])?.+) )?\(?((?:file|ms-appx|https?|webpack|blob):.*?):(\d+)(?::(\d+))?\)?\s*$/i; +var geckoEval = /(\S+) line (\d+)(?: > eval line \d+)* > eval/i; +var chromeEval = /\((\S*)(?::(\d+))(?::(\d+))\)/; +// Based on our own mapping pattern - https://github.com/getsentry/sentry/blob/9f08305e09866c8bd6d0c24f5b0aabdd7dd6c59c/src/sentry/lang/javascript/errormapping.py#L83-L108 +var reactMinifiedRegexp = /Minified React error #\d+;/i; +/** JSDoc */ +// eslint-disable-next-line @typescript-eslint/no-explicit-any, @typescript-eslint/explicit-module-boundary-types +function computeStackTrace(ex) { + var stack = null; + var popSize = 0; + if (ex) { + if (typeof ex.framesToPop === 'number') { + popSize = ex.framesToPop; + } + else if (reactMinifiedRegexp.test(ex.message)) { + popSize = 1; + } + } + try { + // This must be tried first because Opera 10 *destroys* + // its stacktrace property if you try to access the stack + // property first!! + stack = computeStackTraceFromStacktraceProp(ex); + if (stack) { + return popFrames(stack, popSize); + } + } + catch (e) { + // no-empty + } + try { + stack = computeStackTraceFromStackProp(ex); + if (stack) { + return popFrames(stack, popSize); + } + } + catch (e) { + // no-empty + } + return { + message: extractMessage(ex), + name: ex && ex.name, + stack: [], + failed: true, + }; +} +/** JSDoc */ +// eslint-disable-next-line @typescript-eslint/no-explicit-any, complexity +function computeStackTraceFromStackProp(ex) { + if (!ex || !ex.stack) { + return null; + } + var stack = []; + var lines = ex.stack.split('\n'); + var isEval; + var submatch; + var parts; + var element; + for (var i = 0; i < lines.length; ++i) { + if ((parts = chrome.exec(lines[i]))) { + var isNative = parts[2] && parts[2].indexOf('native') === 0; // start of line + isEval = parts[2] && parts[2].indexOf('eval') === 0; // start of line + if (isEval && (submatch = chromeEval.exec(parts[2]))) { + // throw out eval line/column and use top-most line/column number + parts[2] = submatch[1]; // url + parts[3] = submatch[2]; // line + parts[4] = submatch[3]; // column + } + element = { + // working with the regexp above is super painful. it is quite a hack, but just stripping the `address at ` + // prefix here seems like the quickest solution for now. + url: parts[2] && parts[2].indexOf('address at ') === 0 ? parts[2].substr('address at '.length) : parts[2], + func: parts[1] || UNKNOWN_FUNCTION, + args: isNative ? [parts[2]] : [], + line: parts[3] ? +parts[3] : null, + column: parts[4] ? +parts[4] : null, + }; + } + else if ((parts = winjs.exec(lines[i]))) { + element = { + url: parts[2], + func: parts[1] || UNKNOWN_FUNCTION, + args: [], + line: +parts[3], + column: parts[4] ? +parts[4] : null, + }; + } + else if ((parts = gecko.exec(lines[i]))) { + isEval = parts[3] && parts[3].indexOf(' > eval') > -1; + if (isEval && (submatch = geckoEval.exec(parts[3]))) { + // throw out eval line/column and use top-most line number + parts[1] = parts[1] || "eval"; + parts[3] = submatch[1]; + parts[4] = submatch[2]; + parts[5] = ''; // no column when eval + } + else if (i === 0 && !parts[5] && ex.columnNumber !== void 0) { + // FireFox uses this awesome columnNumber property for its top frame + // Also note, Firefox's column number is 0-based and everything else expects 1-based, + // so adding 1 + // NOTE: this hack doesn't work if top-most frame is eval + stack[0].column = ex.columnNumber + 1; + } + element = { + url: parts[3], + func: parts[1] || UNKNOWN_FUNCTION, + args: parts[2] ? parts[2].split(',') : [], + line: parts[4] ? +parts[4] : null, + column: parts[5] ? +parts[5] : null, + }; + } + else { + continue; + } + if (!element.func && element.line) { + element.func = UNKNOWN_FUNCTION; + } + stack.push(element); + } + if (!stack.length) { + return null; + } + return { + message: extractMessage(ex), + name: ex.name, + stack: stack, + }; +} +/** JSDoc */ +// eslint-disable-next-line @typescript-eslint/no-explicit-any +function computeStackTraceFromStacktraceProp(ex) { + if (!ex || !ex.stacktrace) { + return null; + } + // Access and store the stacktrace property before doing ANYTHING + // else to it because Opera is not very good at providing it + // reliably in other circumstances. + var stacktrace = ex.stacktrace; + var opera10Regex = / line (\d+).*script (?:in )?(\S+)(?:: in function (\S+))?$/i; + var opera11Regex = / line (\d+), column (\d+)\s*(?:in (?:]+)>|([^)]+))\((.*)\))? in (.*):\s*$/i; + var lines = stacktrace.split('\n'); + var stack = []; + var parts; + for (var line = 0; line < lines.length; line += 2) { + var element = null; + if ((parts = opera10Regex.exec(lines[line]))) { + element = { + url: parts[2], + func: parts[3], + args: [], + line: +parts[1], + column: null, + }; + } + else if ((parts = opera11Regex.exec(lines[line]))) { + element = { + url: parts[6], + func: parts[3] || parts[4], + args: parts[5] ? parts[5].split(',') : [], + line: +parts[1], + column: +parts[2], + }; + } + if (element) { + if (!element.func && element.line) { + element.func = UNKNOWN_FUNCTION; + } + stack.push(element); + } + } + if (!stack.length) { + return null; + } + return { + message: extractMessage(ex), + name: ex.name, + stack: stack, + }; +} +/** Remove N number of frames from the stack */ +function popFrames(stacktrace, popSize) { + try { + return __assign(__assign({}, stacktrace), { stack: stacktrace.stack.slice(popSize) }); + } + catch (e) { + return stacktrace; + } +} +/** + * There are cases where stacktrace.message is an Event object + * https://github.com/getsentry/sentry-javascript/issues/1949 + * In this specific case we try to extract stacktrace.message.error.message + */ +// eslint-disable-next-line @typescript-eslint/no-explicit-any +function extractMessage(ex) { + var message = ex && ex.message; + if (!message) { + return 'No error message'; + } + if (message.error && typeof message.error.message === 'string') { + return message.error.message; + } + return message; +} + +;// CONCATENATED MODULE: ./node_modules/@sentry/browser/esm/parsers.js + + +var STACKTRACE_LIMIT = 50; +/** + * This function creates an exception from an TraceKitStackTrace + * @param stacktrace TraceKitStackTrace that will be converted to an exception + * @hidden + */ +function exceptionFromStacktrace(stacktrace) { + var frames = prepareFramesForEvent(stacktrace.stack); + var exception = { + type: stacktrace.name, + value: stacktrace.message, + }; + if (frames && frames.length) { + exception.stacktrace = { frames: frames }; + } + if (exception.type === undefined && exception.value === '') { + exception.value = 'Unrecoverable error caught'; + } + return exception; +} +/** + * @hidden + */ +function eventFromPlainObject(exception, syntheticException, rejection) { + var event = { + exception: { + values: [ + { + type: isEvent(exception) ? exception.constructor.name : rejection ? 'UnhandledRejection' : 'Error', + value: "Non-Error " + (rejection ? 'promise rejection' : 'exception') + " captured with keys: " + extractExceptionKeysForMessage(exception), + }, + ], + }, + extra: { + __serialized__: normalizeToSize(exception), + }, + }; + if (syntheticException) { + var stacktrace = computeStackTrace(syntheticException); + var frames_1 = prepareFramesForEvent(stacktrace.stack); + event.stacktrace = { + frames: frames_1, + }; + } + return event; +} +/** + * @hidden + */ +function eventFromStacktrace(stacktrace) { + var exception = exceptionFromStacktrace(stacktrace); + return { + exception: { + values: [exception], + }, + }; +} +/** + * @hidden + */ +function prepareFramesForEvent(stack) { + if (!stack || !stack.length) { + return []; + } + var localStack = stack; + var firstFrameFunction = localStack[0].func || ''; + var lastFrameFunction = localStack[localStack.length - 1].func || ''; + // If stack starts with one of our API calls, remove it (starts, meaning it's the top of the stack - aka last call) + if (firstFrameFunction.indexOf('captureMessage') !== -1 || firstFrameFunction.indexOf('captureException') !== -1) { + localStack = localStack.slice(1); + } + // If stack ends with one of our internal API calls, remove it (ends, meaning it's the bottom of the stack - aka top-most call) + if (lastFrameFunction.indexOf('sentryWrapped') !== -1) { + localStack = localStack.slice(0, -1); + } + // The frame where the crash happened, should be the last entry in the array + return localStack + .slice(0, STACKTRACE_LIMIT) + .map(function (frame) { return ({ + colno: frame.column === null ? undefined : frame.column, + filename: frame.url || localStack[0].url, + function: frame.func || '?', + in_app: true, + lineno: frame.line === null ? undefined : frame.line, + }); }) + .reverse(); +} + +;// CONCATENATED MODULE: ./node_modules/@sentry/browser/esm/eventbuilder.js + + + + +/** + * Builds and Event from a Exception + * @hidden + */ +function eventFromException(options, exception, hint) { + var syntheticException = (hint && hint.syntheticException) || undefined; + var event = eventFromUnknownInput(exception, syntheticException, { + attachStacktrace: options.attachStacktrace, + }); + (0,misc/* addExceptionMechanism */.EG)(event, { + handled: true, + type: 'generic', + }); + event.level = Severity.Error; + if (hint && hint.event_id) { + event.event_id = hint.event_id; + } + return SyncPromise.resolve(event); +} +/** + * Builds and Event from a Message + * @hidden + */ +function eventFromMessage(options, message, level, hint) { + if (level === void 0) { level = Severity.Info; } + var syntheticException = (hint && hint.syntheticException) || undefined; + var event = eventFromString(message, syntheticException, { + attachStacktrace: options.attachStacktrace, + }); + event.level = level; + if (hint && hint.event_id) { + event.event_id = hint.event_id; + } + return SyncPromise.resolve(event); +} +/** + * @hidden + */ +function eventFromUnknownInput(exception, syntheticException, options) { + if (options === void 0) { options = {}; } + var event; + if (isErrorEvent(exception) && exception.error) { + // If it is an ErrorEvent with `error` property, extract it to get actual Error + var errorEvent = exception; + // eslint-disable-next-line no-param-reassign + exception = errorEvent.error; + event = eventFromStacktrace(computeStackTrace(exception)); + return event; + } + if (isDOMError(exception) || isDOMException(exception)) { + // If it is a DOMError or DOMException (which are legacy APIs, but still supported in some browsers) + // then we just extract the name and message, as they don't provide anything else + // https://developer.mozilla.org/en-US/docs/Web/API/DOMError + // https://developer.mozilla.org/en-US/docs/Web/API/DOMException + var domException = exception; + var name_1 = domException.name || (isDOMError(domException) ? 'DOMError' : 'DOMException'); + var message = domException.message ? name_1 + ": " + domException.message : name_1; + event = eventFromString(message, syntheticException, options); + (0,misc/* addExceptionTypeValue */.Db)(event, message); + return event; + } + if (isError(exception)) { + // we have a real Error object, do nothing + event = eventFromStacktrace(computeStackTrace(exception)); + return event; + } + if (isPlainObject(exception) || isEvent(exception)) { + // If it is plain Object or Event, serialize it manually and extract options + // This will allow us to group events based on top-level keys + // which is much better than creating new group when any key/value change + var objectException = exception; + event = eventFromPlainObject(objectException, syntheticException, options.rejection); + (0,misc/* addExceptionMechanism */.EG)(event, { + synthetic: true, + }); + return event; + } + // If none of previous checks were valid, then it means that it's not: + // - an instance of DOMError + // - an instance of DOMException + // - an instance of Event + // - an instance of Error + // - a valid ErrorEvent (one with an error property) + // - a plain Object + // + // So bail out and capture it as a simple message: + event = eventFromString(exception, syntheticException, options); + (0,misc/* addExceptionTypeValue */.Db)(event, "" + exception, undefined); + (0,misc/* addExceptionMechanism */.EG)(event, { + synthetic: true, + }); + return event; +} +/** + * @hidden + */ +function eventFromString(input, syntheticException, options) { + if (options === void 0) { options = {}; } + var event = { + message: input, + }; + if (options.attachStacktrace && syntheticException) { + var stacktrace = computeStackTrace(syntheticException); + var frames_1 = prepareFramesForEvent(stacktrace.stack); + event.stacktrace = { + frames: frames_1, + }; + } + return event; +} + +;// CONCATENATED MODULE: ./node_modules/@sentry/core/esm/request.js +/** Creates a SentryRequest from an event. */ +function sessionToSentryRequest(session, api) { + var envelopeHeaders = JSON.stringify({ + sent_at: new Date().toISOString(), + }); + var itemHeaders = JSON.stringify({ + type: 'session', + }); + return { + body: envelopeHeaders + "\n" + itemHeaders + "\n" + JSON.stringify(session), + type: 'session', + url: api.getEnvelopeEndpointWithUrlEncodedAuth(), + }; +} +/** Creates a SentryRequest from an event. */ +function eventToSentryRequest(event, api) { + var useEnvelope = event.type === 'transaction'; + var req = { + body: JSON.stringify(event), + type: event.type || 'event', + url: useEnvelope ? api.getEnvelopeEndpointWithUrlEncodedAuth() : api.getStoreEndpointWithUrlEncodedAuth(), + }; + // https://develop.sentry.dev/sdk/envelopes/ + // Since we don't need to manipulate envelopes nor store them, there is no + // exported concept of an Envelope with operations including serialization and + // deserialization. Instead, we only implement a minimal subset of the spec to + // serialize events inline here. + if (useEnvelope) { + var envelopeHeaders = JSON.stringify({ + event_id: event.event_id, + // We need to add * 1000 since we divide it by 1000 by default but JS works with ms precision + // The reason we use timestampWithMs here is that all clocks across the SDK use the same clock + sent_at: new Date().toISOString(), + }); + var itemHeaders = JSON.stringify({ + type: event.type, + }); + // The trailing newline is optional. We intentionally don't send it to avoid + // sending unnecessary bytes. + // + // const envelope = `${envelopeHeaders}\n${itemHeaders}\n${req.body}\n`; + var envelope = envelopeHeaders + "\n" + itemHeaders + "\n" + req.body; + req.body = envelope; + } + return req; +} + +;// CONCATENATED MODULE: ./node_modules/@sentry/core/esm/api.js + +var SENTRY_API_VERSION = '7'; +/** Helper class to provide urls to different Sentry endpoints. */ +var API = /** @class */ (function () { + /** Create a new instance of API */ + function API(dsn) { + this.dsn = dsn; + this._dsnObject = new Dsn(dsn); + } + /** Returns the Dsn object. */ + API.prototype.getDsn = function () { + return this._dsnObject; + }; + /** Returns the prefix to construct Sentry ingestion API endpoints. */ + API.prototype.getBaseApiEndpoint = function () { + var dsn = this._dsnObject; + var protocol = dsn.protocol ? dsn.protocol + ":" : ''; + var port = dsn.port ? ":" + dsn.port : ''; + return protocol + "//" + dsn.host + port + (dsn.path ? "/" + dsn.path : '') + "/api/"; + }; + /** Returns the store endpoint URL. */ + API.prototype.getStoreEndpoint = function () { + return this._getIngestEndpoint('store'); + }; + /** + * Returns the store endpoint URL with auth in the query string. + * + * Sending auth as part of the query string and not as custom HTTP headers avoids CORS preflight requests. + */ + API.prototype.getStoreEndpointWithUrlEncodedAuth = function () { + return this.getStoreEndpoint() + "?" + this._encodedAuth(); + }; + /** + * Returns the envelope endpoint URL with auth in the query string. + * + * Sending auth as part of the query string and not as custom HTTP headers avoids CORS preflight requests. + */ + API.prototype.getEnvelopeEndpointWithUrlEncodedAuth = function () { + return this._getEnvelopeEndpoint() + "?" + this._encodedAuth(); + }; + /** Returns only the path component for the store endpoint. */ + API.prototype.getStoreEndpointPath = function () { + var dsn = this._dsnObject; + return (dsn.path ? "/" + dsn.path : '') + "/api/" + dsn.projectId + "/store/"; + }; + /** + * Returns an object that can be used in request headers. + * This is needed for node and the old /store endpoint in sentry + */ + API.prototype.getRequestHeaders = function (clientName, clientVersion) { + var dsn = this._dsnObject; + var header = ["Sentry sentry_version=" + SENTRY_API_VERSION]; + header.push("sentry_client=" + clientName + "/" + clientVersion); + header.push("sentry_key=" + dsn.user); + if (dsn.pass) { + header.push("sentry_secret=" + dsn.pass); + } + return { + 'Content-Type': 'application/json', + 'X-Sentry-Auth': header.join(', '), + }; + }; + /** Returns the url to the report dialog endpoint. */ + API.prototype.getReportDialogEndpoint = function (dialogOptions) { + if (dialogOptions === void 0) { dialogOptions = {}; } + var dsn = this._dsnObject; + var endpoint = this.getBaseApiEndpoint() + "embed/error-page/"; + var encodedOptions = []; + encodedOptions.push("dsn=" + dsn.toString()); + for (var key in dialogOptions) { + if (key === 'user') { + if (!dialogOptions.user) { + continue; + } + if (dialogOptions.user.name) { + encodedOptions.push("name=" + encodeURIComponent(dialogOptions.user.name)); + } + if (dialogOptions.user.email) { + encodedOptions.push("email=" + encodeURIComponent(dialogOptions.user.email)); + } + } + else { + encodedOptions.push(encodeURIComponent(key) + "=" + encodeURIComponent(dialogOptions[key])); + } + } + if (encodedOptions.length) { + return endpoint + "?" + encodedOptions.join('&'); + } + return endpoint; + }; + /** Returns the envelope endpoint URL. */ + API.prototype._getEnvelopeEndpoint = function () { + return this._getIngestEndpoint('envelope'); + }; + /** Returns the ingest API endpoint for target. */ + API.prototype._getIngestEndpoint = function (target) { + var base = this.getBaseApiEndpoint(); + var dsn = this._dsnObject; + return "" + base + dsn.projectId + "/" + target + "/"; + }; + /** Returns a URL-encoded string with auth config suitable for a query string. */ + API.prototype._encodedAuth = function () { + var dsn = this._dsnObject; + var auth = { + // We send only the minimum set of required information. See + // https://github.com/getsentry/sentry-javascript/issues/2572. + sentry_key: dsn.user, + sentry_version: SENTRY_API_VERSION, + }; + return urlEncode(auth); + }; + return API; +}()); + + +;// CONCATENATED MODULE: ./node_modules/@sentry/utils/esm/promisebuffer.js + + +/** A simple queue that holds promises. */ +var PromiseBuffer = /** @class */ (function () { + function PromiseBuffer(_limit) { + this._limit = _limit; + /** Internal set of queued Promises */ + this._buffer = []; + } + /** + * Says if the buffer is ready to take more requests + */ + PromiseBuffer.prototype.isReady = function () { + return this._limit === undefined || this.length() < this._limit; + }; + /** + * Add a promise to the queue. + * + * @param task Can be any PromiseLike + * @returns The original promise. + */ + PromiseBuffer.prototype.add = function (task) { + var _this = this; + if (!this.isReady()) { + return SyncPromise.reject(new SentryError('Not adding Promise due to buffer limit reached.')); + } + if (this._buffer.indexOf(task) === -1) { + this._buffer.push(task); + } + task + .then(function () { return _this.remove(task); }) + .then(null, function () { + return _this.remove(task).then(null, function () { + // We have to add this catch here otherwise we have an unhandledPromiseRejection + // because it's a new Promise chain. + }); + }); + return task; + }; + /** + * Remove a promise to the queue. + * + * @param task Can be any PromiseLike + * @returns Removed promise. + */ + PromiseBuffer.prototype.remove = function (task) { + var removedTask = this._buffer.splice(this._buffer.indexOf(task), 1)[0]; + return removedTask; + }; + /** + * This function returns the number of unresolved promises in the queue. + */ + PromiseBuffer.prototype.length = function () { + return this._buffer.length; + }; + /** + * This will drain the whole queue, returns true if queue is empty or drained. + * If timeout is provided and the queue takes longer to drain, the promise still resolves but with false. + * + * @param timeout Number in ms to wait until it resolves with false. + */ + PromiseBuffer.prototype.drain = function (timeout) { + var _this = this; + return new SyncPromise(function (resolve) { + var capturedSetTimeout = setTimeout(function () { + if (timeout && timeout > 0) { + resolve(false); + } + }, timeout); + SyncPromise.all(_this._buffer) + .then(function () { + clearTimeout(capturedSetTimeout); + resolve(true); + }) + .then(null, function () { + resolve(true); + }); + }); + }; + return PromiseBuffer; +}()); + + +;// CONCATENATED MODULE: ./node_modules/@sentry/browser/esm/transports/base.js + + + + +/** Base Transport class implementation */ +var BaseTransport = /** @class */ (function () { + function BaseTransport(options) { + this.options = options; + /** A simple buffer holding all requests. */ + this._buffer = new PromiseBuffer(30); + /** Locks transport after receiving rate limits in a response */ + this._rateLimits = {}; + this._api = new API(this.options.dsn); + // eslint-disable-next-line deprecation/deprecation + this.url = this._api.getStoreEndpointWithUrlEncodedAuth(); + } + /** + * @inheritDoc + */ + BaseTransport.prototype.sendEvent = function (_) { + throw new SentryError('Transport Class has to implement `sendEvent` method'); + }; + /** + * @inheritDoc + */ + BaseTransport.prototype.close = function (timeout) { + return this._buffer.drain(timeout); + }; + /** + * Handle Sentry repsonse for promise-based transports. + */ + BaseTransport.prototype._handleResponse = function (_a) { + var requestType = _a.requestType, response = _a.response, headers = _a.headers, resolve = _a.resolve, reject = _a.reject; + var status = Status.fromHttpCode(response.status); + /** + * "The name is case-insensitive." + * https://developer.mozilla.org/en-US/docs/Web/API/Headers/get + */ + var limited = this._handleRateLimit(headers); + if (limited) + logger.warn("Too many requests, backing off till: " + this._disabledUntil(requestType)); + if (status === Status.Success) { + resolve({ status: status }); + return; + } + reject(response); + }; + /** + * Gets the time that given category is disabled until for rate limiting + */ + BaseTransport.prototype._disabledUntil = function (category) { + return this._rateLimits[category] || this._rateLimits.all; + }; + /** + * Checks if a category is rate limited + */ + BaseTransport.prototype._isRateLimited = function (category) { + return this._disabledUntil(category) > new Date(Date.now()); + }; + /** + * Sets internal _rateLimits from incoming headers. Returns true if headers contains a non-empty rate limiting header. + */ + BaseTransport.prototype._handleRateLimit = function (headers) { + var e_1, _a, e_2, _b; + var now = Date.now(); + var rlHeader = headers['x-sentry-rate-limits']; + var raHeader = headers['retry-after']; + if (rlHeader) { + try { + for (var _c = __values(rlHeader.trim().split(',')), _d = _c.next(); !_d.done; _d = _c.next()) { + var limit = _d.value; + var parameters = limit.split(':', 2); + var headerDelay = parseInt(parameters[0], 10); + var delay = (!isNaN(headerDelay) ? headerDelay : 60) * 1000; // 60sec default + try { + for (var _e = (e_2 = void 0, __values(parameters[1].split(';'))), _f = _e.next(); !_f.done; _f = _e.next()) { + var category = _f.value; + this._rateLimits[category || 'all'] = new Date(now + delay); + } + } + catch (e_2_1) { e_2 = { error: e_2_1 }; } + finally { + try { + if (_f && !_f.done && (_b = _e.return)) _b.call(_e); + } + finally { if (e_2) throw e_2.error; } + } + } + } + catch (e_1_1) { e_1 = { error: e_1_1 }; } + finally { + try { + if (_d && !_d.done && (_a = _c.return)) _a.call(_c); + } + finally { if (e_1) throw e_1.error; } + } + return true; + } + else if (raHeader) { + this._rateLimits.all = new Date(now + (0,misc/* parseRetryAfterHeader */.JY)(now, raHeader)); + return true; + } + return false; + }; + return BaseTransport; +}()); + + +;// CONCATENATED MODULE: ./node_modules/@sentry/browser/esm/transports/fetch.js + + + + +var fetch_global = (0,misc/* getGlobalObject */.Rf)(); +/** `fetch` based transport */ +var FetchTransport = /** @class */ (function (_super) { + __extends(FetchTransport, _super); + function FetchTransport() { + return _super !== null && _super.apply(this, arguments) || this; + } + /** + * @inheritDoc + */ + FetchTransport.prototype.sendEvent = function (event) { + return this._sendRequest(eventToSentryRequest(event, this._api), event); + }; + /** + * @inheritDoc + */ + FetchTransport.prototype.sendSession = function (session) { + return this._sendRequest(sessionToSentryRequest(session, this._api), session); + }; + /** + * @param sentryRequest Prepared SentryRequest to be delivered + * @param originalPayload Original payload used to create SentryRequest + */ + FetchTransport.prototype._sendRequest = function (sentryRequest, originalPayload) { + var _this = this; + if (this._isRateLimited(sentryRequest.type)) { + return Promise.reject({ + event: originalPayload, + type: sentryRequest.type, + reason: "Transport locked till " + this._disabledUntil(sentryRequest.type) + " due to too many requests.", + status: 429, + }); + } + var options = { + body: sentryRequest.body, + method: 'POST', + // Despite all stars in the sky saying that Edge supports old draft syntax, aka 'never', 'always', 'origin' and 'default + // https://caniuse.com/#feat=referrer-policy + // It doesn't. And it throw exception instead of ignoring this parameter... + // REF: https://github.com/getsentry/raven-js/issues/1233 + referrerPolicy: (supportsReferrerPolicy() ? 'origin' : ''), + }; + if (this.options.fetchParameters !== undefined) { + Object.assign(options, this.options.fetchParameters); + } + if (this.options.headers !== undefined) { + options.headers = this.options.headers; + } + return this._buffer.add(new SyncPromise(function (resolve, reject) { + fetch_global + .fetch(sentryRequest.url, options) + .then(function (response) { + var headers = { + 'x-sentry-rate-limits': response.headers.get('X-Sentry-Rate-Limits'), + 'retry-after': response.headers.get('Retry-After'), + }; + _this._handleResponse({ requestType: sentryRequest.type, response: response, headers: headers, resolve: resolve, reject: reject }); + }) + .catch(reject); + })); + }; + return FetchTransport; +}(BaseTransport)); + + +;// CONCATENATED MODULE: ./node_modules/@sentry/browser/esm/transports/xhr.js + + + + +/** `XHR` based transport */ +var XHRTransport = /** @class */ (function (_super) { + __extends(XHRTransport, _super); + function XHRTransport() { + return _super !== null && _super.apply(this, arguments) || this; + } + /** + * @inheritDoc + */ + XHRTransport.prototype.sendEvent = function (event) { + return this._sendRequest(eventToSentryRequest(event, this._api), event); + }; + /** + * @inheritDoc + */ + XHRTransport.prototype.sendSession = function (session) { + return this._sendRequest(sessionToSentryRequest(session, this._api), session); + }; + /** + * @param sentryRequest Prepared SentryRequest to be delivered + * @param originalPayload Original payload used to create SentryRequest + */ + XHRTransport.prototype._sendRequest = function (sentryRequest, originalPayload) { + var _this = this; + if (this._isRateLimited(sentryRequest.type)) { + return Promise.reject({ + event: originalPayload, + type: sentryRequest.type, + reason: "Transport locked till " + this._disabledUntil(sentryRequest.type) + " due to too many requests.", + status: 429, + }); + } + return this._buffer.add(new SyncPromise(function (resolve, reject) { + var request = new XMLHttpRequest(); + request.onreadystatechange = function () { + if (request.readyState === 4) { + var headers = { + 'x-sentry-rate-limits': request.getResponseHeader('X-Sentry-Rate-Limits'), + 'retry-after': request.getResponseHeader('Retry-After'), + }; + _this._handleResponse({ requestType: sentryRequest.type, response: request, headers: headers, resolve: resolve, reject: reject }); + } + }; + request.open('POST', sentryRequest.url); + for (var header in _this.options.headers) { + if (_this.options.headers.hasOwnProperty(header)) { + request.setRequestHeader(header, _this.options.headers[header]); + } + } + request.send(sentryRequest.body); + })); + }; + return XHRTransport; +}(BaseTransport)); + + +;// CONCATENATED MODULE: ./node_modules/@sentry/browser/esm/backend.js + + + + + + +/** + * The Sentry Browser SDK Backend. + * @hidden + */ +var BrowserBackend = /** @class */ (function (_super) { + __extends(BrowserBackend, _super); + function BrowserBackend() { + return _super !== null && _super.apply(this, arguments) || this; + } + /** + * @inheritDoc + */ + BrowserBackend.prototype.eventFromException = function (exception, hint) { + return eventFromException(this._options, exception, hint); + }; + /** + * @inheritDoc + */ + BrowserBackend.prototype.eventFromMessage = function (message, level, hint) { + if (level === void 0) { level = Severity.Info; } + return eventFromMessage(this._options, message, level, hint); + }; + /** + * @inheritDoc + */ + BrowserBackend.prototype._setupTransport = function () { + if (!this._options.dsn) { + // We return the noop transport here in case there is no Dsn. + return _super.prototype._setupTransport.call(this); + } + var transportOptions = __assign(__assign({}, this._options.transportOptions), { dsn: this._options.dsn }); + if (this._options.transport) { + return new this._options.transport(transportOptions); + } + if (supportsFetch()) { + return new FetchTransport(transportOptions); + } + return new XHRTransport(transportOptions); + }; + return BrowserBackend; +}(BaseBackend)); + + +;// CONCATENATED MODULE: ./node_modules/@sentry/browser/esm/helpers.js + + + +var ignoreOnError = 0; +/** + * @hidden + */ +function shouldIgnoreOnError() { + return ignoreOnError > 0; +} +/** + * @hidden + */ +function ignoreNextOnError() { + // onerror should trigger before setTimeout + ignoreOnError += 1; + setTimeout(function () { + ignoreOnError -= 1; + }); +} +/** + * Instruments the given function and sends an event to Sentry every time the + * function throws an exception. + * + * @param fn A function to wrap. + * @returns The wrapped function. + * @hidden + */ +function wrap(fn, options, before) { + if (options === void 0) { options = {}; } + if (typeof fn !== 'function') { + return fn; + } + try { + // We don't wanna wrap it twice + if (fn.__sentry__) { + return fn; + } + // If this has already been wrapped in the past, return that wrapped function + if (fn.__sentry_wrapped__) { + return fn.__sentry_wrapped__; + } + } + catch (e) { + // Just accessing custom props in some Selenium environments + // can cause a "Permission denied" exception (see raven-js#495). + // Bail on wrapping and return the function as-is (defers to window.onerror). + return fn; + } + /* eslint-disable prefer-rest-params */ + // eslint-disable-next-line @typescript-eslint/no-explicit-any + var sentryWrapped = function () { + var args = Array.prototype.slice.call(arguments); + try { + if (before && typeof before === 'function') { + before.apply(this, arguments); + } + // eslint-disable-next-line @typescript-eslint/no-explicit-any, @typescript-eslint/no-unsafe-member-access + var wrappedArguments = args.map(function (arg) { return wrap(arg, options); }); + if (fn.handleEvent) { + // Attempt to invoke user-land function + // NOTE: If you are a Sentry user, and you are seeing this stack frame, it + // means the sentry.javascript SDK caught an error invoking your application code. This + // is expected behavior and NOT indicative of a bug with sentry.javascript. + // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access + return fn.handleEvent.apply(this, wrappedArguments); + } + // Attempt to invoke user-land function + // NOTE: If you are a Sentry user, and you are seeing this stack frame, it + // means the sentry.javascript SDK caught an error invoking your application code. This + // is expected behavior and NOT indicative of a bug with sentry.javascript. + return fn.apply(this, wrappedArguments); + } + catch (ex) { + ignoreNextOnError(); + withScope(function (scope) { + scope.addEventProcessor(function (event) { + var processedEvent = __assign({}, event); + if (options.mechanism) { + (0,misc/* addExceptionTypeValue */.Db)(processedEvent, undefined, undefined); + (0,misc/* addExceptionMechanism */.EG)(processedEvent, options.mechanism); + } + processedEvent.extra = __assign(__assign({}, processedEvent.extra), { arguments: args }); + return processedEvent; + }); + captureException(ex); + }); + throw ex; + } + }; + /* eslint-enable prefer-rest-params */ + // Accessing some objects may throw + // ref: https://github.com/getsentry/sentry-javascript/issues/1168 + try { + for (var property in fn) { + if (Object.prototype.hasOwnProperty.call(fn, property)) { + sentryWrapped[property] = fn[property]; + } + } + } + catch (_oO) { } // eslint-disable-line no-empty + fn.prototype = fn.prototype || {}; + sentryWrapped.prototype = fn.prototype; + Object.defineProperty(fn, '__sentry_wrapped__', { + enumerable: false, + value: sentryWrapped, + }); + // Signal that this function has been wrapped/filled already + // for both debugging and to prevent it to being wrapped/filled twice + Object.defineProperties(sentryWrapped, { + __sentry__: { + enumerable: false, + value: true, + }, + __sentry_original__: { + enumerable: false, + value: fn, + }, + }); + // Restore original function name (not all browsers allow that) + try { + var descriptor = Object.getOwnPropertyDescriptor(sentryWrapped, 'name'); + if (descriptor.configurable) { + Object.defineProperty(sentryWrapped, 'name', { + get: function () { + return fn.name; + }, + }); + } + // eslint-disable-next-line no-empty + } + catch (_oO) { } + return sentryWrapped; +} +/** + * Injects the Report Dialog script + * @hidden + */ +function injectReportDialog(options) { + if (options === void 0) { options = {}; } + if (!options.eventId) { + logger.error("Missing eventId option in showReportDialog call"); + return; + } + if (!options.dsn) { + logger.error("Missing dsn option in showReportDialog call"); + return; + } + var script = document.createElement('script'); + script.async = true; + script.src = new API(options.dsn).getReportDialogEndpoint(options); + if (options.onLoad) { + // eslint-disable-next-line @typescript-eslint/unbound-method + script.onload = options.onLoad; + } + (document.head || document.body).appendChild(script); +} + +;// CONCATENATED MODULE: ./node_modules/@sentry/utils/esm/instrument.js + + + + + + + +var instrument_global = (0,misc/* getGlobalObject */.Rf)(); +/** + * Instrument native APIs to call handlers that can be used to create breadcrumbs, APM spans etc. + * - Console API + * - Fetch API + * - XHR API + * - History API + * - DOM API (click/typing) + * - Error API + * - UnhandledRejection API + */ +var handlers = {}; +var instrumented = {}; +/** Instruments given API */ +function instrument(type) { + if (instrumented[type]) { + return; + } + instrumented[type] = true; + switch (type) { + case 'console': + instrumentConsole(); + break; + case 'dom': + instrumentDOM(); + break; + case 'xhr': + instrumentXHR(); + break; + case 'fetch': + instrumentFetch(); + break; + case 'history': + instrumentHistory(); + break; + case 'error': + instrumentError(); + break; + case 'unhandledrejection': + instrumentUnhandledRejection(); + break; + default: + logger.warn('unknown instrumentation type:', type); + } +} +/** + * Add handler that will be called when given type of instrumentation triggers. + * Use at your own risk, this might break without changelog notice, only used internally. + * @hidden + */ +function addInstrumentationHandler(handler) { + if (!handler || typeof handler.type !== 'string' || typeof handler.callback !== 'function') { + return; + } + handlers[handler.type] = handlers[handler.type] || []; + handlers[handler.type].push(handler.callback); + instrument(handler.type); +} +/** JSDoc */ +function triggerHandlers(type, data) { + var e_1, _a; + if (!type || !handlers[type]) { + return; + } + try { + for (var _b = __values(handlers[type] || []), _c = _b.next(); !_c.done; _c = _b.next()) { + var handler = _c.value; + try { + handler(data); + } + catch (e) { + logger.error("Error while triggering instrumentation handler.\nType: " + type + "\nName: " + getFunctionName(handler) + "\nError: " + e); + } + } + } + catch (e_1_1) { e_1 = { error: e_1_1 }; } + finally { + try { + if (_c && !_c.done && (_a = _b.return)) _a.call(_b); + } + finally { if (e_1) throw e_1.error; } + } +} +/** JSDoc */ +function instrumentConsole() { + if (!('console' in instrument_global)) { + return; + } + ['debug', 'info', 'warn', 'error', 'log', 'assert'].forEach(function (level) { + if (!(level in instrument_global.console)) { + return; + } + fill(instrument_global.console, level, function (originalConsoleLevel) { + return function () { + var args = []; + for (var _i = 0; _i < arguments.length; _i++) { + args[_i] = arguments[_i]; + } + triggerHandlers('console', { args: args, level: level }); + // this fails for some browsers. :( + if (originalConsoleLevel) { + Function.prototype.apply.call(originalConsoleLevel, instrument_global.console, args); + } + }; + }); + }); +} +/** JSDoc */ +function instrumentFetch() { + if (!supportsNativeFetch()) { + return; + } + fill(instrument_global, 'fetch', function (originalFetch) { + return function () { + var args = []; + for (var _i = 0; _i < arguments.length; _i++) { + args[_i] = arguments[_i]; + } + var handlerData = { + args: args, + fetchData: { + method: getFetchMethod(args), + url: getFetchUrl(args), + }, + startTimestamp: Date.now(), + }; + triggerHandlers('fetch', __assign({}, handlerData)); + // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access + return originalFetch.apply(instrument_global, args).then(function (response) { + triggerHandlers('fetch', __assign(__assign({}, handlerData), { endTimestamp: Date.now(), response: response })); + return response; + }, function (error) { + triggerHandlers('fetch', __assign(__assign({}, handlerData), { endTimestamp: Date.now(), error: error })); + // NOTE: If you are a Sentry user, and you are seeing this stack frame, + // it means the sentry.javascript SDK caught an error invoking your application code. + // This is expected behavior and NOT indicative of a bug with sentry.javascript. + throw error; + }); + }; + }); +} +/* eslint-disable @typescript-eslint/no-unsafe-member-access */ +/** Extract `method` from fetch call arguments */ +function getFetchMethod(fetchArgs) { + if (fetchArgs === void 0) { fetchArgs = []; } + if ('Request' in instrument_global && isInstanceOf(fetchArgs[0], Request) && fetchArgs[0].method) { + return String(fetchArgs[0].method).toUpperCase(); + } + if (fetchArgs[1] && fetchArgs[1].method) { + return String(fetchArgs[1].method).toUpperCase(); + } + return 'GET'; +} +/** Extract `url` from fetch call arguments */ +function getFetchUrl(fetchArgs) { + if (fetchArgs === void 0) { fetchArgs = []; } + if (typeof fetchArgs[0] === 'string') { + return fetchArgs[0]; + } + if ('Request' in instrument_global && isInstanceOf(fetchArgs[0], Request)) { + return fetchArgs[0].url; + } + return String(fetchArgs[0]); +} +/* eslint-enable @typescript-eslint/no-unsafe-member-access */ +/** JSDoc */ +function instrumentXHR() { + if (!('XMLHttpRequest' in instrument_global)) { + return; + } + // Poor man's implementation of ES6 `Map`, tracking and keeping in sync key and value separately. + var requestKeys = []; + var requestValues = []; + var xhrproto = XMLHttpRequest.prototype; + fill(xhrproto, 'open', function (originalOpen) { + return function () { + var args = []; + for (var _i = 0; _i < arguments.length; _i++) { + args[_i] = arguments[_i]; + } + // eslint-disable-next-line @typescript-eslint/no-this-alias + var xhr = this; + var url = args[1]; + xhr.__sentry_xhr__ = { + // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access + method: isString(args[0]) ? args[0].toUpperCase() : args[0], + url: args[1], + }; + // if Sentry key appears in URL, don't capture it as a request + // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access + if (isString(url) && xhr.__sentry_xhr__.method === 'POST' && url.match(/sentry_key/)) { + xhr.__sentry_own_request__ = true; + } + var onreadystatechangeHandler = function () { + if (xhr.readyState === 4) { + try { + // touching statusCode in some platforms throws + // an exception + if (xhr.__sentry_xhr__) { + xhr.__sentry_xhr__.status_code = xhr.status; + } + } + catch (e) { + /* do nothing */ + } + try { + var requestPos = requestKeys.indexOf(xhr); + if (requestPos !== -1) { + // Make sure to pop both key and value to keep it in sync. + requestKeys.splice(requestPos); + var args_1 = requestValues.splice(requestPos)[0]; + if (xhr.__sentry_xhr__ && args_1[0] !== undefined) { + xhr.__sentry_xhr__.body = args_1[0]; + } + } + } + catch (e) { + /* do nothing */ + } + triggerHandlers('xhr', { + args: args, + endTimestamp: Date.now(), + startTimestamp: Date.now(), + xhr: xhr, + }); + } + }; + if ('onreadystatechange' in xhr && typeof xhr.onreadystatechange === 'function') { + fill(xhr, 'onreadystatechange', function (original) { + return function () { + var readyStateArgs = []; + for (var _i = 0; _i < arguments.length; _i++) { + readyStateArgs[_i] = arguments[_i]; + } + onreadystatechangeHandler(); + return original.apply(xhr, readyStateArgs); + }; + }); + } + else { + xhr.addEventListener('readystatechange', onreadystatechangeHandler); + } + return originalOpen.apply(xhr, args); + }; + }); + fill(xhrproto, 'send', function (originalSend) { + return function () { + var args = []; + for (var _i = 0; _i < arguments.length; _i++) { + args[_i] = arguments[_i]; + } + requestKeys.push(this); + requestValues.push(args); + triggerHandlers('xhr', { + args: args, + startTimestamp: Date.now(), + xhr: this, + }); + return originalSend.apply(this, args); + }; + }); +} +var lastHref; +/** JSDoc */ +function instrumentHistory() { + if (!supportsHistory()) { + return; + } + var oldOnPopState = instrument_global.onpopstate; + instrument_global.onpopstate = function () { + var args = []; + for (var _i = 0; _i < arguments.length; _i++) { + args[_i] = arguments[_i]; + } + var to = instrument_global.location.href; + // keep track of the current URL state, as we always receive only the updated state + var from = lastHref; + lastHref = to; + triggerHandlers('history', { + from: from, + to: to, + }); + if (oldOnPopState) { + return oldOnPopState.apply(this, args); + } + }; + /** @hidden */ + function historyReplacementFunction(originalHistoryFunction) { + return function () { + var args = []; + for (var _i = 0; _i < arguments.length; _i++) { + args[_i] = arguments[_i]; + } + var url = args.length > 2 ? args[2] : undefined; + if (url) { + // coerce to string (this is what pushState does) + var from = lastHref; + var to = String(url); + // keep track of the current URL state, as we always receive only the updated state + lastHref = to; + triggerHandlers('history', { + from: from, + to: to, + }); + } + return originalHistoryFunction.apply(this, args); + }; + } + fill(instrument_global.history, 'pushState', historyReplacementFunction); + fill(instrument_global.history, 'replaceState', historyReplacementFunction); +} +/** JSDoc */ +function instrumentDOM() { + if (!('document' in instrument_global)) { + return; + } + // Capture breadcrumbs from any click that is unhandled / bubbled up all the way + // to the document. Do this before we instrument addEventListener. + instrument_global.document.addEventListener('click', domEventHandler('click', triggerHandlers.bind(null, 'dom')), false); + instrument_global.document.addEventListener('keypress', keypressEventHandler(triggerHandlers.bind(null, 'dom')), false); + // After hooking into document bubbled up click and keypresses events, we also hook into user handled click & keypresses. + ['EventTarget', 'Node'].forEach(function (target) { + /* eslint-disable @typescript-eslint/no-unsafe-member-access */ + var proto = instrument_global[target] && instrument_global[target].prototype; + // eslint-disable-next-line no-prototype-builtins + if (!proto || !proto.hasOwnProperty || !proto.hasOwnProperty('addEventListener')) { + return; + } + /* eslint-enable @typescript-eslint/no-unsafe-member-access */ + fill(proto, 'addEventListener', function (original) { + return function (eventName, fn, options) { + if (fn && fn.handleEvent) { + if (eventName === 'click') { + fill(fn, 'handleEvent', function (innerOriginal) { + return function (event) { + domEventHandler('click', triggerHandlers.bind(null, 'dom'))(event); + return innerOriginal.call(this, event); + }; + }); + } + if (eventName === 'keypress') { + fill(fn, 'handleEvent', function (innerOriginal) { + return function (event) { + keypressEventHandler(triggerHandlers.bind(null, 'dom'))(event); + return innerOriginal.call(this, event); + }; + }); + } + } + else { + if (eventName === 'click') { + domEventHandler('click', triggerHandlers.bind(null, 'dom'), true)(this); + } + if (eventName === 'keypress') { + keypressEventHandler(triggerHandlers.bind(null, 'dom'))(this); + } + } + return original.call(this, eventName, fn, options); + }; + }); + fill(proto, 'removeEventListener', function (original) { + return function (eventName, fn, options) { + try { + original.call(this, eventName, fn.__sentry_wrapped__, options); + } + catch (e) { + // ignore, accessing __sentry_wrapped__ will throw in some Selenium environments + } + return original.call(this, eventName, fn, options); + }; + }); + }); +} +var debounceDuration = 1000; +var debounceTimer = 0; +var keypressTimeout; +var lastCapturedEvent; +/** + * Wraps addEventListener to capture UI breadcrumbs + * @param name the event name (e.g. "click") + * @param handler function that will be triggered + * @param debounce decides whether it should wait till another event loop + * @returns wrapped breadcrumb events handler + * @hidden + */ +function domEventHandler(name, handler, debounce) { + if (debounce === void 0) { debounce = false; } + return function (event) { + // reset keypress timeout; e.g. triggering a 'click' after + // a 'keypress' will reset the keypress debounce so that a new + // set of keypresses can be recorded + keypressTimeout = undefined; + // It's possible this handler might trigger multiple times for the same + // event (e.g. event propagation through node ancestors). Ignore if we've + // already captured the event. + if (!event || lastCapturedEvent === event) { + return; + } + lastCapturedEvent = event; + if (debounceTimer) { + clearTimeout(debounceTimer); + } + if (debounce) { + debounceTimer = setTimeout(function () { + handler({ event: event, name: name }); + }); + } + else { + handler({ event: event, name: name }); + } + }; +} +/** + * Wraps addEventListener to capture keypress UI events + * @param handler function that will be triggered + * @returns wrapped keypress events handler + * @hidden + */ +function keypressEventHandler(handler) { + // TODO: if somehow user switches keypress target before + // debounce timeout is triggered, we will only capture + // a single breadcrumb from the FIRST target (acceptable?) + return function (event) { + var target; + try { + target = event.target; + } + catch (e) { + // just accessing event properties can throw an exception in some rare circumstances + // see: https://github.com/getsentry/raven-js/issues/838 + return; + } + var tagName = target && target.tagName; + // only consider keypress events on actual input elements + // this will disregard keypresses targeting body (e.g. tabbing + // through elements, hotkeys, etc) + if (!tagName || (tagName !== 'INPUT' && tagName !== 'TEXTAREA' && !target.isContentEditable)) { + return; + } + // record first keypress in a series, but ignore subsequent + // keypresses until debounce clears + if (!keypressTimeout) { + domEventHandler('input', handler)(event); + } + clearTimeout(keypressTimeout); + keypressTimeout = setTimeout(function () { + keypressTimeout = undefined; + }, debounceDuration); + }; +} +var _oldOnErrorHandler = null; +/** JSDoc */ +function instrumentError() { + _oldOnErrorHandler = instrument_global.onerror; + instrument_global.onerror = function (msg, url, line, column, error) { + triggerHandlers('error', { + column: column, + error: error, + line: line, + msg: msg, + url: url, + }); + if (_oldOnErrorHandler) { + // eslint-disable-next-line prefer-rest-params + return _oldOnErrorHandler.apply(this, arguments); + } + return false; + }; +} +var _oldOnUnhandledRejectionHandler = null; +/** JSDoc */ +function instrumentUnhandledRejection() { + _oldOnUnhandledRejectionHandler = instrument_global.onunhandledrejection; + instrument_global.onunhandledrejection = function (e) { + triggerHandlers('unhandledrejection', e); + if (_oldOnUnhandledRejectionHandler) { + // eslint-disable-next-line prefer-rest-params + return _oldOnUnhandledRejectionHandler.apply(this, arguments); + } + return true; + }; +} + +;// CONCATENATED MODULE: ./node_modules/@sentry/browser/esm/integrations/breadcrumbs.js + +/* eslint-disable @typescript-eslint/no-unsafe-member-access */ +/* eslint-disable max-lines */ + + + +/** + * Default Breadcrumbs instrumentations + * TODO: Deprecated - with v6, this will be renamed to `Instrument` + */ +var Breadcrumbs = /** @class */ (function () { + /** + * @inheritDoc + */ + function Breadcrumbs(options) { + /** + * @inheritDoc + */ + this.name = Breadcrumbs.id; + this._options = __assign({ console: true, dom: true, fetch: true, history: true, sentry: true, xhr: true }, options); + } + /** + * Create a breadcrumb of `sentry` from the events themselves + */ + Breadcrumbs.prototype.addSentryBreadcrumb = function (event) { + if (!this._options.sentry) { + return; + } + getCurrentHub().addBreadcrumb({ + category: "sentry." + (event.type === 'transaction' ? 'transaction' : 'event'), + event_id: event.event_id, + level: event.level, + message: (0,misc/* getEventDescription */.jH)(event), + }, { + event: event, + }); + }; + /** + * Instrument browser built-ins w/ breadcrumb capturing + * - Console API + * - DOM API (click/typing) + * - XMLHttpRequest API + * - Fetch API + * - History API + */ + Breadcrumbs.prototype.setupOnce = function () { + var _this = this; + if (this._options.console) { + addInstrumentationHandler({ + callback: function () { + var args = []; + for (var _i = 0; _i < arguments.length; _i++) { + args[_i] = arguments[_i]; + } + _this._consoleBreadcrumb.apply(_this, tslib_es6_spread(args)); + }, + type: 'console', + }); + } + if (this._options.dom) { + addInstrumentationHandler({ + callback: function () { + var args = []; + for (var _i = 0; _i < arguments.length; _i++) { + args[_i] = arguments[_i]; + } + _this._domBreadcrumb.apply(_this, tslib_es6_spread(args)); + }, + type: 'dom', + }); + } + if (this._options.xhr) { + addInstrumentationHandler({ + callback: function () { + var args = []; + for (var _i = 0; _i < arguments.length; _i++) { + args[_i] = arguments[_i]; + } + _this._xhrBreadcrumb.apply(_this, tslib_es6_spread(args)); + }, + type: 'xhr', + }); + } + if (this._options.fetch) { + addInstrumentationHandler({ + callback: function () { + var args = []; + for (var _i = 0; _i < arguments.length; _i++) { + args[_i] = arguments[_i]; + } + _this._fetchBreadcrumb.apply(_this, tslib_es6_spread(args)); + }, + type: 'fetch', + }); + } + if (this._options.history) { + addInstrumentationHandler({ + callback: function () { + var args = []; + for (var _i = 0; _i < arguments.length; _i++) { + args[_i] = arguments[_i]; + } + _this._historyBreadcrumb.apply(_this, tslib_es6_spread(args)); + }, + type: 'history', + }); + } + }; + /** + * Creates breadcrumbs from console API calls + */ + // eslint-disable-next-line @typescript-eslint/no-explicit-any + Breadcrumbs.prototype._consoleBreadcrumb = function (handlerData) { + var breadcrumb = { + category: 'console', + data: { + arguments: handlerData.args, + logger: 'console', + }, + level: Severity.fromString(handlerData.level), + message: safeJoin(handlerData.args, ' '), + }; + if (handlerData.level === 'assert') { + if (handlerData.args[0] === false) { + breadcrumb.message = "Assertion failed: " + (safeJoin(handlerData.args.slice(1), ' ') || 'console.assert'); + breadcrumb.data.arguments = handlerData.args.slice(1); + } + else { + // Don't capture a breadcrumb for passed assertions + return; + } + } + getCurrentHub().addBreadcrumb(breadcrumb, { + input: handlerData.args, + level: handlerData.level, + }); + }; + /** + * Creates breadcrumbs from DOM API calls + */ + // eslint-disable-next-line @typescript-eslint/no-explicit-any + Breadcrumbs.prototype._domBreadcrumb = function (handlerData) { + var target; + // Accessing event.target can throw (see getsentry/raven-js#838, #768) + try { + target = handlerData.event.target + ? htmlTreeAsString(handlerData.event.target) + : htmlTreeAsString(handlerData.event); + } + catch (e) { + target = ''; + } + if (target.length === 0) { + return; + } + getCurrentHub().addBreadcrumb({ + category: "ui." + handlerData.name, + message: target, + }, { + event: handlerData.event, + name: handlerData.name, + }); + }; + /** + * Creates breadcrumbs from XHR API calls + */ + // eslint-disable-next-line @typescript-eslint/no-explicit-any + Breadcrumbs.prototype._xhrBreadcrumb = function (handlerData) { + if (handlerData.endTimestamp) { + // We only capture complete, non-sentry requests + if (handlerData.xhr.__sentry_own_request__) { + return; + } + var _a = handlerData.xhr.__sentry_xhr__ || {}, method = _a.method, url = _a.url, status_code = _a.status_code, body = _a.body; + getCurrentHub().addBreadcrumb({ + category: 'xhr', + data: { + method: method, + url: url, + status_code: status_code, + }, + type: 'http', + }, { + xhr: handlerData.xhr, + input: body, + }); + return; + } + }; + /** + * Creates breadcrumbs from fetch API calls + */ + // eslint-disable-next-line @typescript-eslint/no-explicit-any + Breadcrumbs.prototype._fetchBreadcrumb = function (handlerData) { + // We only capture complete fetch requests + if (!handlerData.endTimestamp) { + return; + } + if (handlerData.fetchData.url.match(/sentry_key/) && handlerData.fetchData.method === 'POST') { + // We will not create breadcrumbs for fetch requests that contain `sentry_key` (internal sentry requests) + return; + } + if (handlerData.error) { + getCurrentHub().addBreadcrumb({ + category: 'fetch', + data: handlerData.fetchData, + level: Severity.Error, + type: 'http', + }, { + data: handlerData.error, + input: handlerData.args, + }); + } + else { + getCurrentHub().addBreadcrumb({ + category: 'fetch', + data: __assign(__assign({}, handlerData.fetchData), { status_code: handlerData.response.status }), + type: 'http', + }, { + input: handlerData.args, + response: handlerData.response, + }); + } + }; + /** + * Creates breadcrumbs from history API calls + */ + // eslint-disable-next-line @typescript-eslint/no-explicit-any + Breadcrumbs.prototype._historyBreadcrumb = function (handlerData) { + var global = (0,misc/* getGlobalObject */.Rf)(); + var from = handlerData.from; + var to = handlerData.to; + var parsedLoc = (0,misc/* parseUrl */.en)(global.location.href); + var parsedFrom = (0,misc/* parseUrl */.en)(from); + var parsedTo = (0,misc/* parseUrl */.en)(to); + // Initial pushState doesn't provide `from` information + if (!parsedFrom.path) { + parsedFrom = parsedLoc; + } + // Use only the path component of the URL if the URL matches the current + // document (almost all the time when using pushState) + if (parsedLoc.protocol === parsedTo.protocol && parsedLoc.host === parsedTo.host) { + to = parsedTo.relative; + } + if (parsedLoc.protocol === parsedFrom.protocol && parsedLoc.host === parsedFrom.host) { + from = parsedFrom.relative; + } + getCurrentHub().addBreadcrumb({ + category: 'navigation', + data: { + from: from, + to: to, + }, + }); + }; + /** + * @inheritDoc + */ + Breadcrumbs.id = 'Breadcrumbs'; + return Breadcrumbs; +}()); + + +;// CONCATENATED MODULE: ./node_modules/@sentry/browser/esm/version.js +var SDK_NAME = 'sentry.javascript.browser'; +var SDK_VERSION = '5.27.2'; + +;// CONCATENATED MODULE: ./node_modules/@sentry/browser/esm/client.js + + + + + + + +/** + * The Sentry Browser SDK Client. + * + * @see BrowserOptions for documentation on configuration options. + * @see SentryClient for usage documentation. + */ +var BrowserClient = /** @class */ (function (_super) { + __extends(BrowserClient, _super); + /** + * Creates a new Browser SDK instance. + * + * @param options Configuration options for this SDK. + */ + function BrowserClient(options) { + if (options === void 0) { options = {}; } + return _super.call(this, BrowserBackend, options) || this; + } + /** + * Show a report dialog to the user to send feedback to a specific event. + * + * @param options Set individual options for the dialog + */ + BrowserClient.prototype.showReportDialog = function (options) { + if (options === void 0) { options = {}; } + // doesn't work without a document (React Native) + var document = (0,misc/* getGlobalObject */.Rf)().document; + if (!document) { + return; + } + if (!this._isEnabled()) { + logger.error('Trying to call showReportDialog with Sentry Client disabled'); + return; + } + injectReportDialog(__assign(__assign({}, options), { dsn: options.dsn || this.getDsn() })); + }; + /** + * @inheritDoc + */ + BrowserClient.prototype._prepareEvent = function (event, scope, hint) { + event.platform = event.platform || 'javascript'; + event.sdk = __assign(__assign({}, event.sdk), { name: SDK_NAME, packages: tslib_es6_spread(((event.sdk && event.sdk.packages) || []), [ + { + name: 'npm:@sentry/browser', + version: SDK_VERSION, + }, + ]), version: SDK_VERSION }); + return _super.prototype._prepareEvent.call(this, event, scope, hint); + }; + /** + * @inheritDoc + */ + BrowserClient.prototype._sendEvent = function (event) { + var integration = this.getIntegration(Breadcrumbs); + if (integration) { + integration.addSentryBreadcrumb(event); + } + _super.prototype._sendEvent.call(this, event); + }; + return BrowserClient; +}(BaseClient)); + + +;// CONCATENATED MODULE: ./node_modules/@sentry/core/esm/sdk.js + + +/** + * Internal function to create a new SDK client instance. The client is + * installed and then bound to the current scope. + * + * @param clientClass The client class to instantiate. + * @param options Options to pass to the client. + */ +function initAndBind(clientClass, options) { + if (options.debug === true) { + logger.enable(); + } + var hub = getCurrentHub(); + var client = new clientClass(options); + hub.bindClient(client); +} + +;// CONCATENATED MODULE: ./node_modules/@sentry/core/esm/integrations/inboundfilters.js + + + +// "Script error." is hard coded into browsers for errors that it can't read. +// this is the result of a script being pulled in from an external domain and CORS. +var DEFAULT_IGNORE_ERRORS = [/^Script error\.?$/, /^Javascript error: Script error\.? on line 0$/]; +/** Inbound filters configurable by the user */ +var InboundFilters = /** @class */ (function () { + function InboundFilters(_options) { + if (_options === void 0) { _options = {}; } + this._options = _options; + /** + * @inheritDoc + */ + this.name = InboundFilters.id; + } + /** + * @inheritDoc + */ + InboundFilters.prototype.setupOnce = function () { + addGlobalEventProcessor(function (event) { + var hub = getCurrentHub(); + if (!hub) { + return event; + } + var self = hub.getIntegration(InboundFilters); + if (self) { + var client = hub.getClient(); + var clientOptions = client ? client.getOptions() : {}; + var options = self._mergeOptions(clientOptions); + if (self._shouldDropEvent(event, options)) { + return null; + } + } + return event; + }); + }; + /** JSDoc */ + InboundFilters.prototype._shouldDropEvent = function (event, options) { + if (this._isSentryError(event, options)) { + logger.warn("Event dropped due to being internal Sentry Error.\nEvent: " + (0,misc/* getEventDescription */.jH)(event)); + return true; + } + if (this._isIgnoredError(event, options)) { + logger.warn("Event dropped due to being matched by `ignoreErrors` option.\nEvent: " + (0,misc/* getEventDescription */.jH)(event)); + return true; + } + if (this._isDeniedUrl(event, options)) { + logger.warn("Event dropped due to being matched by `denyUrls` option.\nEvent: " + (0,misc/* getEventDescription */.jH)(event) + ".\nUrl: " + this._getEventFilterUrl(event)); + return true; + } + if (!this._isAllowedUrl(event, options)) { + logger.warn("Event dropped due to not being matched by `allowUrls` option.\nEvent: " + (0,misc/* getEventDescription */.jH)(event) + ".\nUrl: " + this._getEventFilterUrl(event)); + return true; + } + return false; + }; + /** JSDoc */ + InboundFilters.prototype._isSentryError = function (event, options) { + if (!options.ignoreInternal) { + return false; + } + try { + return ((event && + event.exception && + event.exception.values && + event.exception.values[0] && + event.exception.values[0].type === 'SentryError') || + false); + } + catch (_oO) { + return false; + } + }; + /** JSDoc */ + InboundFilters.prototype._isIgnoredError = function (event, options) { + if (!options.ignoreErrors || !options.ignoreErrors.length) { + return false; + } + return this._getPossibleEventMessages(event).some(function (message) { + // Not sure why TypeScript complains here... + return options.ignoreErrors.some(function (pattern) { return isMatchingPattern(message, pattern); }); + }); + }; + /** JSDoc */ + InboundFilters.prototype._isDeniedUrl = function (event, options) { + // TODO: Use Glob instead? + if (!options.denyUrls || !options.denyUrls.length) { + return false; + } + var url = this._getEventFilterUrl(event); + return !url ? false : options.denyUrls.some(function (pattern) { return isMatchingPattern(url, pattern); }); + }; + /** JSDoc */ + InboundFilters.prototype._isAllowedUrl = function (event, options) { + // TODO: Use Glob instead? + if (!options.allowUrls || !options.allowUrls.length) { + return true; + } + var url = this._getEventFilterUrl(event); + return !url ? true : options.allowUrls.some(function (pattern) { return isMatchingPattern(url, pattern); }); + }; + /** JSDoc */ + InboundFilters.prototype._mergeOptions = function (clientOptions) { + if (clientOptions === void 0) { clientOptions = {}; } + return { + allowUrls: tslib_es6_spread(([]), (this._options.allowUrls || []), ([]), (clientOptions.allowUrls || [])), + denyUrls: tslib_es6_spread(([]), (this._options.denyUrls || []), ([]), (clientOptions.denyUrls || [])), + ignoreErrors: tslib_es6_spread(([]), (clientOptions.ignoreErrors || []), DEFAULT_IGNORE_ERRORS), + ignoreInternal: typeof this._options.ignoreInternal !== 'undefined' ? this._options.ignoreInternal : true, + }; + }; + /** JSDoc */ + InboundFilters.prototype._getPossibleEventMessages = function (event) { + if (event.message) { + return [event.message]; + } + if (event.exception) { + try { + var _a = (event.exception.values && event.exception.values[0]) || {}, _b = _a.type, type = _b === void 0 ? '' : _b, _c = _a.value, value = _c === void 0 ? '' : _c; + return ["" + value, type + ": " + value]; + } + catch (oO) { + logger.error("Cannot extract message for event " + (0,misc/* getEventDescription */.jH)(event)); + return []; + } + } + return []; + }; + /** JSDoc */ + InboundFilters.prototype._getEventFilterUrl = function (event) { + try { + if (event.stacktrace) { + var frames_1 = event.stacktrace.frames; + return (frames_1 && frames_1[frames_1.length - 1].filename) || null; + } + if (event.exception) { + var frames_2 = event.exception.values && event.exception.values[0].stacktrace && event.exception.values[0].stacktrace.frames; + return (frames_2 && frames_2[frames_2.length - 1].filename) || null; + } + return null; + } + catch (oO) { + logger.error("Cannot extract url for event " + (0,misc/* getEventDescription */.jH)(event)); + return null; + } + }; + /** + * @inheritDoc + */ + InboundFilters.id = 'InboundFilters'; + return InboundFilters; +}()); + + +;// CONCATENATED MODULE: ./node_modules/@sentry/core/esm/integrations/functiontostring.js +var originalFunctionToString; +/** Patch toString calls to return proper name for wrapped functions */ +var FunctionToString = /** @class */ (function () { + function FunctionToString() { + /** + * @inheritDoc + */ + this.name = FunctionToString.id; + } + /** + * @inheritDoc + */ + FunctionToString.prototype.setupOnce = function () { + // eslint-disable-next-line @typescript-eslint/unbound-method + originalFunctionToString = Function.prototype.toString; + // eslint-disable-next-line @typescript-eslint/no-explicit-any + Function.prototype.toString = function () { + var args = []; + for (var _i = 0; _i < arguments.length; _i++) { + args[_i] = arguments[_i]; + } + var context = this.__sentry_original__ || this; + return originalFunctionToString.apply(context, args); + }; + }; + /** + * @inheritDoc + */ + FunctionToString.id = 'FunctionToString'; + return FunctionToString; +}()); + + +;// CONCATENATED MODULE: ./node_modules/@sentry/browser/esm/integrations/trycatch.js + + + +var DEFAULT_EVENT_TARGET = [ + 'EventTarget', + 'Window', + 'Node', + 'ApplicationCache', + 'AudioTrackList', + 'ChannelMergerNode', + 'CryptoOperation', + 'EventSource', + 'FileReader', + 'HTMLUnknownElement', + 'IDBDatabase', + 'IDBRequest', + 'IDBTransaction', + 'KeyOperation', + 'MediaController', + 'MessagePort', + 'ModalWindow', + 'Notification', + 'SVGElementInstance', + 'Screen', + 'TextTrack', + 'TextTrackCue', + 'TextTrackList', + 'WebSocket', + 'WebSocketWorker', + 'Worker', + 'XMLHttpRequest', + 'XMLHttpRequestEventTarget', + 'XMLHttpRequestUpload', +]; +/** Wrap timer functions and event targets to catch errors and provide better meta data */ +var TryCatch = /** @class */ (function () { + /** + * @inheritDoc + */ + function TryCatch(options) { + /** + * @inheritDoc + */ + this.name = TryCatch.id; + this._options = __assign({ XMLHttpRequest: true, eventTarget: true, requestAnimationFrame: true, setInterval: true, setTimeout: true }, options); + } + /** + * Wrap timer functions and event targets to catch errors + * and provide better metadata. + */ + TryCatch.prototype.setupOnce = function () { + var global = (0,misc/* getGlobalObject */.Rf)(); + if (this._options.setTimeout) { + fill(global, 'setTimeout', this._wrapTimeFunction.bind(this)); + } + if (this._options.setInterval) { + fill(global, 'setInterval', this._wrapTimeFunction.bind(this)); + } + if (this._options.requestAnimationFrame) { + fill(global, 'requestAnimationFrame', this._wrapRAF.bind(this)); + } + if (this._options.XMLHttpRequest && 'XMLHttpRequest' in global) { + fill(XMLHttpRequest.prototype, 'send', this._wrapXHR.bind(this)); + } + if (this._options.eventTarget) { + var eventTarget = Array.isArray(this._options.eventTarget) ? this._options.eventTarget : DEFAULT_EVENT_TARGET; + eventTarget.forEach(this._wrapEventTarget.bind(this)); + } + }; + /** JSDoc */ + TryCatch.prototype._wrapTimeFunction = function (original) { + // eslint-disable-next-line @typescript-eslint/no-explicit-any + return function () { + var args = []; + for (var _i = 0; _i < arguments.length; _i++) { + args[_i] = arguments[_i]; + } + var originalCallback = args[0]; + args[0] = wrap(originalCallback, { + mechanism: { + data: { function: getFunctionName(original) }, + handled: true, + type: 'instrument', + }, + }); + return original.apply(this, args); + }; + }; + /** JSDoc */ + // eslint-disable-next-line @typescript-eslint/no-explicit-any + TryCatch.prototype._wrapRAF = function (original) { + // eslint-disable-next-line @typescript-eslint/no-explicit-any + return function (callback) { + // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access + return original.call(this, wrap(callback, { + mechanism: { + data: { + function: 'requestAnimationFrame', + handler: getFunctionName(original), + }, + handled: true, + type: 'instrument', + }, + })); + }; + }; + /** JSDoc */ + TryCatch.prototype._wrapEventTarget = function (target) { + // eslint-disable-next-line @typescript-eslint/no-explicit-any + var global = (0,misc/* getGlobalObject */.Rf)(); + // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access + var proto = global[target] && global[target].prototype; + // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access + if (!proto || !proto.hasOwnProperty || !proto.hasOwnProperty('addEventListener')) { + return; + } + fill(proto, 'addEventListener', function (original) { + return function (eventName, fn, options) { + try { + if (typeof fn.handleEvent === 'function') { + fn.handleEvent = wrap(fn.handleEvent.bind(fn), { + mechanism: { + data: { + function: 'handleEvent', + handler: getFunctionName(fn), + target: target, + }, + handled: true, + type: 'instrument', + }, + }); + } + } + catch (err) { + // can sometimes get 'Permission denied to access property "handle Event' + } + return original.call(this, eventName, + // eslint-disable-next-line @typescript-eslint/no-explicit-any + wrap(fn, { + mechanism: { + data: { + function: 'addEventListener', + handler: getFunctionName(fn), + target: target, + }, + handled: true, + type: 'instrument', + }, + }), options); + }; + }); + fill(proto, 'removeEventListener', function (original) { + return function (eventName, fn, options) { + /** + * There are 2 possible scenarios here: + * + * 1. Someone passes a callback, which was attached prior to Sentry initialization, or by using unmodified + * method, eg. `document.addEventListener.call(el, name, handler). In this case, we treat this function + * as a pass-through, and call original `removeEventListener` with it. + * + * 2. Someone passes a callback, which was attached after Sentry was initialized, which means that it was using + * our wrapped version of `addEventListener`, which internally calls `wrap` helper. + * This helper "wraps" whole callback inside a try/catch statement, and attached appropriate metadata to it, + * in order for us to make a distinction between wrapped/non-wrapped functions possible. + * If a function was wrapped, it has additional property of `__sentry_wrapped__`, holding the handler. + * + * When someone adds a handler prior to initialization, and then do it again, but after, + * then we have to detach both of them. Otherwise, if we'd detach only wrapped one, it'd be impossible + * to get rid of the initial handler and it'd stick there forever. + */ + try { + original.call(this, eventName, fn.__sentry_wrapped__, options); + } + catch (e) { + // ignore, accessing __sentry_wrapped__ will throw in some Selenium environments + } + return original.call(this, eventName, fn, options); + }; + }); + }; + /** JSDoc */ + TryCatch.prototype._wrapXHR = function (originalSend) { + // eslint-disable-next-line @typescript-eslint/no-explicit-any + return function () { + var args = []; + for (var _i = 0; _i < arguments.length; _i++) { + args[_i] = arguments[_i]; + } + // eslint-disable-next-line @typescript-eslint/no-this-alias + var xhr = this; + var xmlHttpRequestProps = ['onload', 'onerror', 'onprogress', 'onreadystatechange']; + xmlHttpRequestProps.forEach(function (prop) { + if (prop in xhr && typeof xhr[prop] === 'function') { + // eslint-disable-next-line @typescript-eslint/no-explicit-any + fill(xhr, prop, function (original) { + var wrapOptions = { + mechanism: { + data: { + function: prop, + handler: getFunctionName(original), + }, + handled: true, + type: 'instrument', + }, + }; + // If Instrument integration has been called before TryCatch, get the name of original function + if (original.__sentry_original__) { + wrapOptions.mechanism.data.handler = getFunctionName(original.__sentry_original__); + } + // Otherwise wrap directly + return wrap(original, wrapOptions); + }); + } + }); + return originalSend.apply(this, args); + }; + }; + /** + * @inheritDoc + */ + TryCatch.id = 'TryCatch'; + return TryCatch; +}()); + + +;// CONCATENATED MODULE: ./node_modules/@sentry/browser/esm/integrations/globalhandlers.js + +/* eslint-disable @typescript-eslint/no-unsafe-member-access */ + + + + + +/** Global handlers */ +var GlobalHandlers = /** @class */ (function () { + /** JSDoc */ + function GlobalHandlers(options) { + /** + * @inheritDoc + */ + this.name = GlobalHandlers.id; + /** JSDoc */ + this._onErrorHandlerInstalled = false; + /** JSDoc */ + this._onUnhandledRejectionHandlerInstalled = false; + this._options = __assign({ onerror: true, onunhandledrejection: true }, options); + } + /** + * @inheritDoc + */ + GlobalHandlers.prototype.setupOnce = function () { + Error.stackTraceLimit = 50; + if (this._options.onerror) { + logger.log('Global Handler attached: onerror'); + this._installGlobalOnErrorHandler(); + } + if (this._options.onunhandledrejection) { + logger.log('Global Handler attached: onunhandledrejection'); + this._installGlobalOnUnhandledRejectionHandler(); + } + }; + /** JSDoc */ + GlobalHandlers.prototype._installGlobalOnErrorHandler = function () { + var _this = this; + if (this._onErrorHandlerInstalled) { + return; + } + addInstrumentationHandler({ + // eslint-disable-next-line @typescript-eslint/no-explicit-any + callback: function (data) { + var error = data.error; + var currentHub = getCurrentHub(); + var hasIntegration = currentHub.getIntegration(GlobalHandlers); + var isFailedOwnDelivery = error && error.__sentry_own_request__ === true; + if (!hasIntegration || shouldIgnoreOnError() || isFailedOwnDelivery) { + return; + } + var client = currentHub.getClient(); + var event = isPrimitive(error) + ? _this._eventFromIncompleteOnError(data.msg, data.url, data.line, data.column) + : _this._enhanceEventWithInitialFrame(eventFromUnknownInput(error, undefined, { + attachStacktrace: client && client.getOptions().attachStacktrace, + rejection: false, + }), data.url, data.line, data.column); + (0,misc/* addExceptionMechanism */.EG)(event, { + handled: false, + type: 'onerror', + }); + currentHub.captureEvent(event, { + originalException: error, + }); + }, + type: 'error', + }); + this._onErrorHandlerInstalled = true; + }; + /** JSDoc */ + GlobalHandlers.prototype._installGlobalOnUnhandledRejectionHandler = function () { + var _this = this; + if (this._onUnhandledRejectionHandlerInstalled) { + return; + } + addInstrumentationHandler({ + // eslint-disable-next-line @typescript-eslint/no-explicit-any + callback: function (e) { + var error = e; + // dig the object of the rejection out of known event types + try { + // PromiseRejectionEvents store the object of the rejection under 'reason' + // see https://developer.mozilla.org/en-US/docs/Web/API/PromiseRejectionEvent + if ('reason' in e) { + error = e.reason; + } + // something, somewhere, (likely a browser extension) effectively casts PromiseRejectionEvents + // to CustomEvents, moving the `promise` and `reason` attributes of the PRE into + // the CustomEvent's `detail` attribute, since they're not part of CustomEvent's spec + // see https://developer.mozilla.org/en-US/docs/Web/API/CustomEvent and + // https://github.com/getsentry/sentry-javascript/issues/2380 + else if ('detail' in e && 'reason' in e.detail) { + error = e.detail.reason; + } + } + catch (_oO) { + // no-empty + } + var currentHub = getCurrentHub(); + var hasIntegration = currentHub.getIntegration(GlobalHandlers); + var isFailedOwnDelivery = error && error.__sentry_own_request__ === true; + if (!hasIntegration || shouldIgnoreOnError() || isFailedOwnDelivery) { + return true; + } + var client = currentHub.getClient(); + var event = isPrimitive(error) + ? _this._eventFromIncompleteRejection(error) + : eventFromUnknownInput(error, undefined, { + attachStacktrace: client && client.getOptions().attachStacktrace, + rejection: true, + }); + event.level = Severity.Error; + (0,misc/* addExceptionMechanism */.EG)(event, { + handled: false, + type: 'onunhandledrejection', + }); + currentHub.captureEvent(event, { + originalException: error, + }); + return; + }, + type: 'unhandledrejection', + }); + this._onUnhandledRejectionHandlerInstalled = true; + }; + /** + * This function creates a stack from an old, error-less onerror handler. + */ + // eslint-disable-next-line @typescript-eslint/no-explicit-any + GlobalHandlers.prototype._eventFromIncompleteOnError = function (msg, url, line, column) { + var ERROR_TYPES_RE = /^(?:[Uu]ncaught (?:exception: )?)?(?:((?:Eval|Internal|Range|Reference|Syntax|Type|URI|)Error): )?(.*)$/i; + // If 'message' is ErrorEvent, get real message from inside + var message = isErrorEvent(msg) ? msg.message : msg; + var name; + if (isString(message)) { + var groups = message.match(ERROR_TYPES_RE); + if (groups) { + name = groups[1]; + message = groups[2]; + } + } + var event = { + exception: { + values: [ + { + type: name || 'Error', + value: message, + }, + ], + }, + }; + return this._enhanceEventWithInitialFrame(event, url, line, column); + }; + /** + * This function creates an Event from an TraceKitStackTrace that has part of it missing. + */ + // eslint-disable-next-line @typescript-eslint/no-explicit-any + GlobalHandlers.prototype._eventFromIncompleteRejection = function (error) { + return { + exception: { + values: [ + { + type: 'UnhandledRejection', + value: "Non-Error promise rejection captured with value: " + error, + }, + ], + }, + }; + }; + /** JSDoc */ + // eslint-disable-next-line @typescript-eslint/no-explicit-any + GlobalHandlers.prototype._enhanceEventWithInitialFrame = function (event, url, line, column) { + event.exception = event.exception || {}; + event.exception.values = event.exception.values || []; + event.exception.values[0] = event.exception.values[0] || {}; + event.exception.values[0].stacktrace = event.exception.values[0].stacktrace || {}; + event.exception.values[0].stacktrace.frames = event.exception.values[0].stacktrace.frames || []; + var colno = isNaN(parseInt(column, 10)) ? undefined : column; + var lineno = isNaN(parseInt(line, 10)) ? undefined : line; + var filename = isString(url) && url.length > 0 ? url : (0,misc/* getLocationHref */.l4)(); + if (event.exception.values[0].stacktrace.frames.length === 0) { + event.exception.values[0].stacktrace.frames.push({ + colno: colno, + filename: filename, + function: '?', + in_app: true, + lineno: lineno, + }); + } + return event; + }; + /** + * @inheritDoc + */ + GlobalHandlers.id = 'GlobalHandlers'; + return GlobalHandlers; +}()); + + +;// CONCATENATED MODULE: ./node_modules/@sentry/browser/esm/integrations/linkederrors.js + + + + + +var DEFAULT_KEY = 'cause'; +var DEFAULT_LIMIT = 5; +/** Adds SDK info to an event. */ +var LinkedErrors = /** @class */ (function () { + /** + * @inheritDoc + */ + function LinkedErrors(options) { + if (options === void 0) { options = {}; } + /** + * @inheritDoc + */ + this.name = LinkedErrors.id; + this._key = options.key || DEFAULT_KEY; + this._limit = options.limit || DEFAULT_LIMIT; + } + /** + * @inheritDoc + */ + LinkedErrors.prototype.setupOnce = function () { + addGlobalEventProcessor(function (event, hint) { + var self = getCurrentHub().getIntegration(LinkedErrors); + if (self) { + return self._handler(event, hint); + } + return event; + }); + }; + /** + * @inheritDoc + */ + LinkedErrors.prototype._handler = function (event, hint) { + if (!event.exception || !event.exception.values || !hint || !isInstanceOf(hint.originalException, Error)) { + return event; + } + var linkedErrors = this._walkErrorTree(hint.originalException, this._key); + event.exception.values = tslib_es6_spread(linkedErrors, event.exception.values); + return event; + }; + /** + * @inheritDoc + */ + LinkedErrors.prototype._walkErrorTree = function (error, key, stack) { + if (stack === void 0) { stack = []; } + if (!isInstanceOf(error[key], Error) || stack.length + 1 >= this._limit) { + return stack; + } + var stacktrace = computeStackTrace(error[key]); + var exception = exceptionFromStacktrace(stacktrace); + return this._walkErrorTree(error[key], key, tslib_es6_spread([exception], stack)); + }; + /** + * @inheritDoc + */ + LinkedErrors.id = 'LinkedErrors'; + return LinkedErrors; +}()); + + +;// CONCATENATED MODULE: ./node_modules/@sentry/browser/esm/integrations/useragent.js + + + +var useragent_global = (0,misc/* getGlobalObject */.Rf)(); +/** UserAgent */ +var UserAgent = /** @class */ (function () { + function UserAgent() { + /** + * @inheritDoc + */ + this.name = UserAgent.id; + } + /** + * @inheritDoc + */ + UserAgent.prototype.setupOnce = function () { + addGlobalEventProcessor(function (event) { + var _a, _b, _c; + if (getCurrentHub().getIntegration(UserAgent)) { + // if none of the information we want exists, don't bother + if (!useragent_global.navigator && !useragent_global.location && !useragent_global.document) { + return event; + } + // grab as much info as exists and add it to the event + var url = ((_a = event.request) === null || _a === void 0 ? void 0 : _a.url) || ((_b = useragent_global.location) === null || _b === void 0 ? void 0 : _b.href); + var referrer = (useragent_global.document || {}).referrer; + var userAgent = (useragent_global.navigator || {}).userAgent; + var headers = __assign(__assign(__assign({}, (_c = event.request) === null || _c === void 0 ? void 0 : _c.headers), (referrer && { Referer: referrer })), (userAgent && { 'User-Agent': userAgent })); + var request = __assign(__assign({}, (url && { url: url })), { headers: headers }); + return __assign(__assign({}, event), { request: request }); + } + return event; + }); + }; + /** + * @inheritDoc + */ + UserAgent.id = 'UserAgent'; + return UserAgent; +}()); + + +;// CONCATENATED MODULE: ./node_modules/@sentry/browser/esm/sdk.js + + + + + +var defaultIntegrations = [ + new InboundFilters(), + new FunctionToString(), + new TryCatch(), + new Breadcrumbs(), + new GlobalHandlers(), + new LinkedErrors(), + new UserAgent(), +]; +/** + * The Sentry Browser SDK Client. + * + * To use this SDK, call the {@link init} function as early as possible when + * loading the web page. To set context information or send manual events, use + * the provided methods. + * + * @example + * + * ``` + * + * import { init } from '@sentry/browser'; + * + * init({ + * dsn: '__DSN__', + * // ... + * }); + * ``` + * + * @example + * ``` + * + * import { configureScope } from '@sentry/browser'; + * configureScope((scope: Scope) => { + * scope.setExtra({ battery: 0.7 }); + * scope.setTag({ user_mode: 'admin' }); + * scope.setUser({ id: '4711' }); + * }); + * ``` + * + * @example + * ``` + * + * import { addBreadcrumb } from '@sentry/browser'; + * addBreadcrumb({ + * message: 'My Breadcrumb', + * // ... + * }); + * ``` + * + * @example + * + * ``` + * + * import * as Sentry from '@sentry/browser'; + * Sentry.captureMessage('Hello, world!'); + * Sentry.captureException(new Error('Good bye')); + * Sentry.captureEvent({ + * message: 'Manual', + * stacktrace: [ + * // ... + * ], + * }); + * ``` + * + * @see {@link BrowserOptions} for documentation on configuration options. + */ +function init(options) { + if (options === void 0) { options = {}; } + if (options.defaultIntegrations === undefined) { + options.defaultIntegrations = defaultIntegrations; + } + if (options.release === undefined) { + var window_1 = (0,misc/* getGlobalObject */.Rf)(); + // This supports the variable that sentry-webpack-plugin injects + if (window_1.SENTRY_RELEASE && window_1.SENTRY_RELEASE.id) { + options.release = window_1.SENTRY_RELEASE.id; + } + } + if (options.autoSessionTracking === undefined) { + options.autoSessionTracking = false; + } + initAndBind(BrowserClient, options); + if (options.autoSessionTracking) { + startSessionTracking(); + } +} +/** + * Present the user with a report dialog. + * + * @param options Everything is optional, we try to fetch all info need from the global scope. + */ +function showReportDialog(options) { + if (options === void 0) { options = {}; } + if (!options.eventId) { + options.eventId = getCurrentHub().lastEventId(); + } + var client = getCurrentHub().getClient(); + if (client) { + client.showReportDialog(options); + } +} +/** + * This is the getter for lastEventId. + * + * @returns The last event id of a captured event. + */ +function lastEventId() { + return getCurrentHub().lastEventId(); +} +/** + * This function is here to be API compatible with the loader. + * @hidden + */ +function forceLoad() { + // Noop +} +/** + * This function is here to be API compatible with the loader. + * @hidden + */ +function onLoad(callback) { + callback(); +} +/** + * A promise that resolves when all current events have been sent. + * If you provide a timeout and the queue takes longer to drain the promise returns false. + * + * @param timeout Maximum time in ms the client should wait. + */ +function flush(timeout) { + var client = getCurrentHub().getClient(); + if (client) { + return client.flush(timeout); + } + return SyncPromise.reject(false); +} +/** + * A promise that resolves when all current events have been sent. + * If you provide a timeout and the queue takes longer to drain the promise returns false. + * + * @param timeout Maximum time in ms the client should wait. + */ +function sdk_close(timeout) { + var client = getCurrentHub().getClient(); + if (client) { + return client.close(timeout); + } + return SyncPromise.reject(false); +} +/** + * Wrap code within a try/catch block so the SDK is able to capture errors. + * + * @param fn A function to wrap. + * + * @returns The result of wrapped function call. + */ +// eslint-disable-next-line @typescript-eslint/no-explicit-any +function sdk_wrap(fn) { + return wrap(fn)(); +} +/** + * Enable automatic Session Tracking for the initial page load. + */ +function startSessionTracking() { + var window = (0,misc/* getGlobalObject */.Rf)(); + var hub = getCurrentHub(); + /** + * We should be using `Promise.all([windowLoaded, firstContentfulPaint])` here, + * but, as always, it's not available in the IE10-11. Thanks IE. + */ + var loadResolved = document.readyState === 'complete'; + var fcpResolved = false; + var possiblyEndSession = function () { + if (fcpResolved && loadResolved) { + hub.endSession(); + } + }; + var resolveWindowLoaded = function () { + loadResolved = true; + possiblyEndSession(); + window.removeEventListener('load', resolveWindowLoaded); + }; + hub.startSession(); + if (!loadResolved) { + // IE doesn't support `{ once: true }` for event listeners, so we have to manually + // attach and then detach it once completed. + window.addEventListener('load', resolveWindowLoaded); + } + try { + var po = new PerformanceObserver(function (entryList, po) { + entryList.getEntries().forEach(function (entry) { + if (entry.name === 'first-contentful-paint' && entry.startTime < firstHiddenTime_1) { + po.disconnect(); + fcpResolved = true; + possiblyEndSession(); + } + }); + }); + // There's no need to even attach this listener if `PerformanceObserver` constructor will fail, + // so we do it below here. + var firstHiddenTime_1 = document.visibilityState === 'hidden' ? 0 : Infinity; + document.addEventListener('visibilitychange', function (event) { + firstHiddenTime_1 = Math.min(firstHiddenTime_1, event.timeStamp); + }, { once: true }); + po.observe({ + type: 'paint', + buffered: true, + }); + } + catch (e) { + fcpResolved = true; + possiblyEndSession(); + } +} + +;// CONCATENATED MODULE: ./node_modules/@sentry/browser/esm/exports.js + + + + + + + + +;// CONCATENATED MODULE: ./node_modules/@sentry/core/esm/integrations/index.js + + + +;// CONCATENATED MODULE: ./node_modules/@sentry/browser/esm/integrations/index.js + + + + + + +;// CONCATENATED MODULE: ./node_modules/@sentry/browser/esm/transports/index.js + + + + +;// CONCATENATED MODULE: ./node_modules/@sentry/browser/esm/index.js + + + + + + +var windowIntegrations = {}; +// This block is needed to add compatibility with the integrations packages when used with a CDN +var _window = (0,misc/* getGlobalObject */.Rf)(); +if (_window.Sentry && _window.Sentry.Integrations) { + windowIntegrations = _window.Sentry.Integrations; +} +var INTEGRATIONS = __assign(__assign(__assign({}, windowIntegrations), integrations_namespaceObject), esm_integrations_namespaceObject); + + + +/***/ }), + +/***/ 2681: +/*!************************************************!*\ + !*** ./node_modules/@sentry/utils/esm/misc.js ***! + \************************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +"use strict"; +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "Rf": () => (/* binding */ getGlobalObject), +/* harmony export */ "DM": () => (/* binding */ uuid4), +/* harmony export */ "en": () => (/* binding */ parseUrl), +/* harmony export */ "jH": () => (/* binding */ getEventDescription), +/* harmony export */ "Cf": () => (/* binding */ consoleSandbox), +/* harmony export */ "Db": () => (/* binding */ addExceptionTypeValue), +/* harmony export */ "EG": () => (/* binding */ addExceptionMechanism), +/* harmony export */ "l4": () => (/* binding */ getLocationHref), +/* harmony export */ "JY": () => (/* binding */ parseRetryAfterHeader) +/* harmony export */ }); +/* unused harmony exports parseSemver, addContextToFrame, stripUrlQueryAndFragment */ +/* harmony import */ var _node__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./node */ 8612); + + +var fallbackGlobalObject = {}; +/** + * Safely get global scope object + * + * @returns Global scope object + */ +function getGlobalObject() { + return ((0,_node__WEBPACK_IMPORTED_MODULE_0__/* .isNodeEnv */ .KV)() + ? __webpack_require__.g + : typeof window !== 'undefined' + ? window + : typeof self !== 'undefined' + ? self + : fallbackGlobalObject); +} +/** + * UUID4 generator + * + * @returns string Generated UUID4. + */ +function uuid4() { + var global = getGlobalObject(); + var crypto = global.crypto || global.msCrypto; + if (!(crypto === void 0) && crypto.getRandomValues) { + // Use window.crypto API if available + var arr = new Uint16Array(8); + crypto.getRandomValues(arr); + // set 4 in byte 7 + // eslint-disable-next-line no-bitwise + arr[3] = (arr[3] & 0xfff) | 0x4000; + // set 2 most significant bits of byte 9 to '10' + // eslint-disable-next-line no-bitwise + arr[4] = (arr[4] & 0x3fff) | 0x8000; + var pad = function (num) { + var v = num.toString(16); + while (v.length < 4) { + v = "0" + v; + } + return v; + }; + return (pad(arr[0]) + pad(arr[1]) + pad(arr[2]) + pad(arr[3]) + pad(arr[4]) + pad(arr[5]) + pad(arr[6]) + pad(arr[7])); + } + // http://stackoverflow.com/questions/105034/how-to-create-a-guid-uuid-in-javascript/2117523#2117523 + return 'xxxxxxxxxxxx4xxxyxxxxxxxxxxxxxxx'.replace(/[xy]/g, function (c) { + // eslint-disable-next-line no-bitwise + var r = (Math.random() * 16) | 0; + // eslint-disable-next-line no-bitwise + var v = c === 'x' ? r : (r & 0x3) | 0x8; + return v.toString(16); + }); +} +/** + * Parses string form of URL into an object + * // borrowed from https://tools.ietf.org/html/rfc3986#appendix-B + * // intentionally using regex and not href parsing trick because React Native and other + * // environments where DOM might not be available + * @returns parsed URL object + */ +function parseUrl(url) { + if (!url) { + return {}; + } + var match = url.match(/^(([^:/?#]+):)?(\/\/([^/?#]*))?([^?#]*)(\?([^#]*))?(#(.*))?$/); + if (!match) { + return {}; + } + // coerce to undefined values to empty string so we don't get 'undefined' + var query = match[6] || ''; + var fragment = match[8] || ''; + return { + host: match[4], + path: match[5], + protocol: match[2], + relative: match[5] + query + fragment, + }; +} +/** + * Extracts either message or type+value from an event that can be used for user-facing logs + * @returns event's description + */ +function getEventDescription(event) { + if (event.message) { + return event.message; + } + if (event.exception && event.exception.values && event.exception.values[0]) { + var exception = event.exception.values[0]; + if (exception.type && exception.value) { + return exception.type + ": " + exception.value; + } + return exception.type || exception.value || event.event_id || ''; + } + return event.event_id || ''; +} +/** JSDoc */ +function consoleSandbox(callback) { + var global = getGlobalObject(); + var levels = ['debug', 'info', 'warn', 'error', 'log', 'assert']; + if (!('console' in global)) { + return callback(); + } + // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access + var originalConsole = global.console; + var wrappedLevels = {}; + // Restore all wrapped console methods + levels.forEach(function (level) { + // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access + if (level in global.console && originalConsole[level].__sentry_original__) { + wrappedLevels[level] = originalConsole[level]; + originalConsole[level] = originalConsole[level].__sentry_original__; + } + }); + // Perform callback manipulations + var result = callback(); + // Revert restoration to wrapped state + Object.keys(wrappedLevels).forEach(function (level) { + originalConsole[level] = wrappedLevels[level]; + }); + return result; +} +/** + * Adds exception values, type and value to an synthetic Exception. + * @param event The event to modify. + * @param value Value of the exception. + * @param type Type of the exception. + * @hidden + */ +function addExceptionTypeValue(event, value, type) { + event.exception = event.exception || {}; + event.exception.values = event.exception.values || []; + event.exception.values[0] = event.exception.values[0] || {}; + event.exception.values[0].value = event.exception.values[0].value || value || ''; + event.exception.values[0].type = event.exception.values[0].type || type || 'Error'; +} +/** + * Adds exception mechanism to a given event. + * @param event The event to modify. + * @param mechanism Mechanism of the mechanism. + * @hidden + */ +function addExceptionMechanism(event, mechanism) { + if (mechanism === void 0) { mechanism = {}; } + // TODO: Use real type with `keyof Mechanism` thingy and maybe make it better? + try { + // @ts-ignore Type 'Mechanism | {}' is not assignable to type 'Mechanism | undefined' + // eslint-disable-next-line @typescript-eslint/no-non-null-assertion + event.exception.values[0].mechanism = event.exception.values[0].mechanism || {}; + Object.keys(mechanism).forEach(function (key) { + // @ts-ignore Mechanism has no index signature + // eslint-disable-next-line @typescript-eslint/no-non-null-assertion + event.exception.values[0].mechanism[key] = mechanism[key]; + }); + } + catch (_oO) { + // no-empty + } +} +/** + * A safe form of location.href + */ +function getLocationHref() { + try { + return document.location.href; + } + catch (oO) { + return ''; + } +} +// https://semver.org/#is-there-a-suggested-regular-expression-regex-to-check-a-semver-string +var SEMVER_REGEXP = /^(0|[1-9]\d*)\.(0|[1-9]\d*)\.(0|[1-9]\d*)(?:-((?:0|[1-9]\d*|\d*[a-zA-Z-][0-9a-zA-Z-]*)(?:\.(?:0|[1-9]\d*|\d*[a-zA-Z-][0-9a-zA-Z-]*))*))?(?:\+([0-9a-zA-Z-]+(?:\.[0-9a-zA-Z-]+)*))?$/; +/** + * Parses input into a SemVer interface + * @param input string representation of a semver version + */ +function parseSemver(input) { + var match = input.match(SEMVER_REGEXP) || []; + var major = parseInt(match[1], 10); + var minor = parseInt(match[2], 10); + var patch = parseInt(match[3], 10); + return { + buildmetadata: match[5], + major: isNaN(major) ? undefined : major, + minor: isNaN(minor) ? undefined : minor, + patch: isNaN(patch) ? undefined : patch, + prerelease: match[4], + }; +} +var defaultRetryAfter = 60 * 1000; // 60 seconds +/** + * Extracts Retry-After value from the request header or returns default value + * @param now current unix timestamp + * @param header string representation of 'Retry-After' header + */ +function parseRetryAfterHeader(now, header) { + if (!header) { + return defaultRetryAfter; + } + var headerDelay = parseInt("" + header, 10); + if (!isNaN(headerDelay)) { + return headerDelay * 1000; + } + var headerDate = Date.parse("" + header); + if (!isNaN(headerDate)) { + return headerDate - now; + } + return defaultRetryAfter; +} +/** + * This function adds context (pre/post/line) lines to the provided frame + * + * @param lines string[] containing all lines + * @param frame StackFrame that will be mutated + * @param linesOfContext number of context lines we want to add pre/post + */ +function addContextToFrame(lines, frame, linesOfContext) { + if (linesOfContext === void 0) { linesOfContext = 5; } + var lineno = frame.lineno || 0; + var maxLines = lines.length; + var sourceLine = Math.max(Math.min(maxLines, lineno - 1), 0); + frame.pre_context = lines + .slice(Math.max(0, sourceLine - linesOfContext), sourceLine) + .map(function (line) { return snipLine(line, 0); }); + frame.context_line = snipLine(lines[Math.min(maxLines - 1, sourceLine)], frame.colno || 0); + frame.post_context = lines + .slice(Math.min(sourceLine + 1, maxLines), sourceLine + 1 + linesOfContext) + .map(function (line) { return snipLine(line, 0); }); +} +/** + * Strip the query string and fragment off of a given URL or path (if present) + * + * @param urlPath Full URL or path, including possible query string and/or fragment + * @returns URL or path without query string or fragment + */ +function stripUrlQueryAndFragment(urlPath) { + // eslint-disable-next-line no-useless-escape + return urlPath.split(/[\?#]/, 1)[0]; +} + + +/***/ }), + +/***/ 8612: +/*!************************************************!*\ + !*** ./node_modules/@sentry/utils/esm/node.js ***! + \************************************************/ +/***/ ((module, __webpack_exports__, __webpack_require__) => { + +"use strict"; +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "KV": () => (/* binding */ isNodeEnv), +/* harmony export */ "l$": () => (/* binding */ dynamicRequire) +/* harmony export */ }); +/* unused harmony export extractNodeRequestData */ +/* module decorator */ module = __webpack_require__.hmd(module); + + +/** + * Checks whether we're in the Node.js or Browser environment + * + * @returns Answer to given question + */ +function isNodeEnv() { + return Object.prototype.toString.call(typeof process !== 'undefined' ? process : 0) === '[object process]'; +} +/** + * Requires a module which is protected against bundler minification. + * + * @param request The module path to resolve + */ +// eslint-disable-next-line @typescript-eslint/explicit-module-boundary-types +function dynamicRequire(mod, request) { + // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access + return mod.require(request); +} +/** Default request keys that'll be used to extract data from the request */ +var DEFAULT_REQUEST_KEYS = (/* unused pure expression or super */ null && (['cookies', 'data', 'headers', 'method', 'query_string', 'url'])); +/** + * Normalizes data from the request object, accounting for framework differences. + * + * @param req The request object from which to extract data + * @param keys An optional array of keys to include in the normalized data. Defaults to DEFAULT_REQUEST_KEYS if not + * provided. + * @returns An object containing normalized request data + */ +function extractNodeRequestData(req, keys) { + if (keys === void 0) { keys = DEFAULT_REQUEST_KEYS; } + // make sure we can safely use dynamicRequire below + if (!isNodeEnv()) { + throw new Error("Can't get node request data outside of a node environment"); + } + var requestData = {}; + // headers: + // node, express: req.headers + // koa: req.header + var headers = (req.headers || req.header || {}); + // method: + // node, express, koa: req.method + var method = req.method; + // host: + // express: req.hostname in > 4 and req.host in < 4 + // koa: req.host + // node: req.headers.host + var host = req.hostname || req.host || headers.host || ''; + // protocol: + // node: + // express, koa: req.protocol + var protocol = req.protocol === 'https' || req.secure || (req.socket || {}).encrypted + ? 'https' + : 'http'; + // url (including path and query string): + // node, express: req.originalUrl + // koa: req.url + var originalUrl = (req.originalUrl || req.url || ''); + // absolute url + var absoluteUrl = protocol + "://" + host + originalUrl; + keys.forEach(function (key) { + switch (key) { + case 'headers': + requestData.headers = headers; + break; + case 'method': + requestData.method = method; + break; + case 'url': + requestData.url = absoluteUrl; + break; + case 'cookies': + // cookies: + // node, express, koa: req.headers.cookie + // vercel, sails.js, express (w/ cookie middleware): req.cookies + // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access + requestData.cookies = req.cookies || dynamicRequire(module, 'cookie').parse(headers.cookie || ''); + break; + case 'query_string': + // query string: + // node: req.url (raw) + // express, koa: req.query + // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access + requestData.query_string = dynamicRequire(module, 'url').parse(originalUrl || '', false).query; + break; + case 'data': + if (method === 'GET' || method === 'HEAD') { + break; + } + // body data: + // node, express, koa: req.body + if (req.body !== undefined) { + requestData.data = isString(req.body) ? req.body : JSON.stringify(normalize(req.body)); + } + break; + default: + if ({}.hasOwnProperty.call(req, key)) { + requestData[key] = req[key]; + } + } + }); + return requestData; +} + + +/***/ }), + +/***/ 7685: +/*!************************************************!*\ + !*** ./node_modules/@sentry/utils/esm/time.js ***! + \************************************************/ +/***/ ((module, __webpack_exports__, __webpack_require__) => { + +"use strict"; +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "yW": () => (/* binding */ dateTimestampInSeconds) +/* harmony export */ }); +/* unused harmony exports timestampInSeconds, timestampWithMs, usingPerformanceAPI, browserPerformanceTimeOrigin */ +/* harmony import */ var _misc__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./misc */ 2681); +/* harmony import */ var _node__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./node */ 8612); +/* module decorator */ module = __webpack_require__.hmd(module); + + +/** + * A TimestampSource implementation for environments that do not support the Performance Web API natively. + * + * Note that this TimestampSource does not use a monotonic clock. A call to `nowSeconds` may return a timestamp earlier + * than a previously returned value. We do not try to emulate a monotonic behavior in order to facilitate debugging. It + * is more obvious to explain "why does my span have negative duration" than "why my spans have zero duration". + */ +var dateTimestampSource = { + nowSeconds: function () { return Date.now() / 1000; }, +}; +/** + * Returns a wrapper around the native Performance API browser implementation, or undefined for browsers that do not + * support the API. + * + * Wrapping the native API works around differences in behavior from different browsers. + */ +function getBrowserPerformance() { + var performance = (0,_misc__WEBPACK_IMPORTED_MODULE_0__/* .getGlobalObject */ .Rf)().performance; + if (!performance || !performance.now) { + return undefined; + } + // Replace performance.timeOrigin with our own timeOrigin based on Date.now(). + // + // This is a partial workaround for browsers reporting performance.timeOrigin such that performance.timeOrigin + + // performance.now() gives a date arbitrarily in the past. + // + // Additionally, computing timeOrigin in this way fills the gap for browsers where performance.timeOrigin is + // undefined. + // + // The assumption that performance.timeOrigin + performance.now() ~= Date.now() is flawed, but we depend on it to + // interact with data coming out of performance entries. + // + // Note that despite recommendations against it in the spec, browsers implement the Performance API with a clock that + // might stop when the computer is asleep (and perhaps under other circumstances). Such behavior causes + // performance.timeOrigin + performance.now() to have an arbitrary skew over Date.now(). In laptop computers, we have + // observed skews that can be as long as days, weeks or months. + // + // See https://github.com/getsentry/sentry-javascript/issues/2590. + // + // BUG: despite our best intentions, this workaround has its limitations. It mostly addresses timings of pageload + // transactions, but ignores the skew built up over time that can aversely affect timestamps of navigation + // transactions of long-lived web pages. + var timeOrigin = Date.now() - performance.now(); + return { + now: function () { return performance.now(); }, + timeOrigin: timeOrigin, + }; +} +/** + * Returns the native Performance API implementation from Node.js. Returns undefined in old Node.js versions that don't + * implement the API. + */ +function getNodePerformance() { + try { + var perfHooks = (0,_node__WEBPACK_IMPORTED_MODULE_1__/* .dynamicRequire */ .l$)(module, 'perf_hooks'); + return perfHooks.performance; + } + catch (_) { + return undefined; + } +} +/** + * The Performance API implementation for the current platform, if available. + */ +var platformPerformance = (0,_node__WEBPACK_IMPORTED_MODULE_1__/* .isNodeEnv */ .KV)() ? getNodePerformance() : getBrowserPerformance(); +var timestampSource = platformPerformance === undefined + ? dateTimestampSource + : { + nowSeconds: function () { return (platformPerformance.timeOrigin + platformPerformance.now()) / 1000; }, + }; +/** + * Returns a timestamp in seconds since the UNIX epoch using the Date API. + */ +var dateTimestampInSeconds = dateTimestampSource.nowSeconds.bind(dateTimestampSource); +/** + * Returns a timestamp in seconds since the UNIX epoch using either the Performance or Date APIs, depending on the + * availability of the Performance API. + * + * See `usingPerformanceAPI` to test whether the Performance API is used. + * + * BUG: Note that because of how browsers implement the Performance API, the clock might stop when the computer is + * asleep. This creates a skew between `dateTimestampInSeconds` and `timestampInSeconds`. The + * skew can grow to arbitrary amounts like days, weeks or months. + * See https://github.com/getsentry/sentry-javascript/issues/2590. + */ +var timestampInSeconds = timestampSource.nowSeconds.bind(timestampSource); +// Re-exported with an old name for backwards-compatibility. +var timestampWithMs = (/* unused pure expression or super */ null && (timestampInSeconds)); +/** + * A boolean that is true when timestampInSeconds uses the Performance API to produce monotonic timestamps. + */ +var usingPerformanceAPI = platformPerformance !== undefined; +/** + * The number of milliseconds since the UNIX epoch. This value is only usable in a browser, and only when the + * performance API is available. + */ +var browserPerformanceTimeOrigin = (function () { + var performance = (0,_misc__WEBPACK_IMPORTED_MODULE_0__/* .getGlobalObject */ .Rf)().performance; + if (!performance) { + return undefined; + } + if (performance.timeOrigin) { + return performance.timeOrigin; + } + // While performance.timing.navigationStart is deprecated in favor of performance.timeOrigin, performance.timeOrigin + // is not as widely supported. Namely, performance.timeOrigin is undefined in Safari as of writing. + // Also as of writing, performance.timing is not available in Web Workers in mainstream browsers, so it is not always + // a valid fallback. In the absence of an initial time provided by the browser, fallback to the current time from the + // Date API. + // eslint-disable-next-line deprecation/deprecation + return (performance.timing && performance.timing.navigationStart) || Date.now(); +})(); + + +/***/ }), + +/***/ 4050: +/*!***************************************************!*\ + !*** ./node_modules/fast-deep-equal/es6/index.js ***! + \***************************************************/ +/***/ ((module) => { + +"use strict"; + + +// do not edit .js files directly - edit src/index.jst + + + var envHasBigInt64Array = typeof BigInt64Array !== 'undefined'; + + +module.exports = function equal(a, b) { + if (a === b) return true; + + if (a && b && typeof a == 'object' && typeof b == 'object') { + if (a.constructor !== b.constructor) return false; + + var length, i, keys; + if (Array.isArray(a)) { + length = a.length; + if (length != b.length) return false; + for (i = length; i-- !== 0;) + if (!equal(a[i], b[i])) return false; + return true; + } + + + if ((a instanceof Map) && (b instanceof Map)) { + if (a.size !== b.size) return false; + for (i of a.entries()) + if (!b.has(i[0])) return false; + for (i of a.entries()) + if (!equal(i[1], b.get(i[0]))) return false; + return true; + } + + if ((a instanceof Set) && (b instanceof Set)) { + if (a.size !== b.size) return false; + for (i of a.entries()) + if (!b.has(i[0])) return false; + return true; + } + + if (ArrayBuffer.isView(a) && ArrayBuffer.isView(b)) { + length = a.length; + if (length != b.length) return false; + for (i = length; i-- !== 0;) + if (a[i] !== b[i]) return false; + return true; + } + + + if (a.constructor === RegExp) return a.source === b.source && a.flags === b.flags; + if (a.valueOf !== Object.prototype.valueOf) return a.valueOf() === b.valueOf(); + if (a.toString !== Object.prototype.toString) return a.toString() === b.toString(); + + keys = Object.keys(a); + length = keys.length; + if (length !== Object.keys(b).length) return false; + + for (i = length; i-- !== 0;) + if (!Object.prototype.hasOwnProperty.call(b, keys[i])) return false; + + for (i = length; i-- !== 0;) { + var key = keys[i]; + + if (!equal(a[key], b[key])) return false; + } + + return true; + } + + // true if both NaN, false otherwise + return a!==a && b!==b; +}; + + +/***/ }), + +/***/ 9602: +/*!************************************!*\ + !*** ./node_modules/flat/index.js ***! + \************************************/ +/***/ ((module) => { + +module.exports = flatten +flatten.flatten = flatten +flatten.unflatten = unflatten + +function isBuffer (obj) { + return obj && + obj.constructor && + (typeof obj.constructor.isBuffer === 'function') && + obj.constructor.isBuffer(obj) +} + +function keyIdentity (key) { + return key +} + +function flatten (target, opts) { + opts = opts || {} + + const delimiter = opts.delimiter || '.' + const maxDepth = opts.maxDepth + const transformKey = opts.transformKey || keyIdentity + const output = {} + + function step (object, prev, currentDepth) { + currentDepth = currentDepth || 1 + Object.keys(object).forEach(function (key) { + const value = object[key] + const isarray = opts.safe && Array.isArray(value) + const type = Object.prototype.toString.call(value) + const isbuffer = isBuffer(value) + const isobject = ( + type === '[object Object]' || + type === '[object Array]' + ) + + const newKey = prev + ? prev + delimiter + transformKey(key) + : transformKey(key) + + if (!isarray && !isbuffer && isobject && Object.keys(value).length && + (!opts.maxDepth || currentDepth < maxDepth)) { + return step(value, newKey, currentDepth + 1) + } + + output[newKey] = value + }) + } + + step(target) + + return output +} + +function unflatten (target, opts) { + opts = opts || {} + + const delimiter = opts.delimiter || '.' + const overwrite = opts.overwrite || false + const transformKey = opts.transformKey || keyIdentity + const result = {} + + const isbuffer = isBuffer(target) + if (isbuffer || Object.prototype.toString.call(target) !== '[object Object]') { + return target + } + + // safely ensure that the key is + // an integer. + function getkey (key) { + const parsedKey = Number(key) + + return ( + isNaN(parsedKey) || + key.indexOf('.') !== -1 || + opts.object + ) ? key + : parsedKey + } + + function addKeys (keyPrefix, recipient, target) { + return Object.keys(target).reduce(function (result, key) { + result[keyPrefix + delimiter + key] = target[key] + + return result + }, recipient) + } + + function isEmpty (val) { + const type = Object.prototype.toString.call(val) + const isArray = type === '[object Array]' + const isObject = type === '[object Object]' + + if (!val) { + return true + } else if (isArray) { + return !val.length + } else if (isObject) { + return !Object.keys(val).length + } + } + + target = Object.keys(target).reduce(function (result, key) { + const type = Object.prototype.toString.call(target[key]) + const isObject = (type === '[object Object]' || type === '[object Array]') + if (!isObject || isEmpty(target[key])) { + result[key] = target[key] + return result + } else { + return addKeys( + key, + result, + flatten(target[key], opts) + ) + } + }, {}) + + Object.keys(target).forEach(function (key) { + const split = key.split(delimiter).map(transformKey) + let key1 = getkey(split.shift()) + let key2 = getkey(split[0]) + let recipient = result + + while (key2 !== undefined) { + if (key1 === '__proto__') { + return + } + + const type = Object.prototype.toString.call(recipient[key1]) + const isobject = ( + type === '[object Object]' || + type === '[object Array]' + ) + + // do not write over falsey, non-undefined values if overwrite is false + if (!overwrite && !isobject && typeof recipient[key1] !== 'undefined') { + return + } + + if ((overwrite && !isobject) || (!overwrite && recipient[key1] == null)) { + recipient[key1] = ( + typeof key2 === 'number' && + !opts.object ? [] : {} + ) + } + + recipient = recipient[key1] + if (split.length > 0) { + key1 = getkey(split.shift()) + key2 = getkey(split[0]) + } + } + + // unflatten again for 'messy objects' + recipient[key1] = unflatten(target[key], opts) + }) + + return result +} + + +/***/ }), + +/***/ 7680: +/*!*************************************************************************!*\ + !*** ./node_modules/mobx-keystone/dist/mobxkeystone.esm.js + 6 modules ***! + \*************************************************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +"use strict"; +// ESM COMPAT FLAG +__webpack_require__.r(__webpack_exports__); + +// EXPORTS +__webpack_require__.d(__webpack_exports__, { + "ActionContextActionType": () => (/* binding */ ActionContextActionType), + "ActionContextAsyncStepType": () => (/* binding */ ActionContextAsyncStepType), + "ActionTrackingResult": () => (/* binding */ ActionTrackingResult), + "ArraySet": () => (/* binding */ ArraySet), + "ArraySetTypeInfo": () => (/* binding */ ArraySetTypeInfo), + "ArrayTypeInfo": () => (/* binding */ ArrayTypeInfo), + "BaseModel": () => (/* binding */ BaseModel), + "BooleanTypeInfo": () => (/* binding */ BooleanTypeInfo), + "BuiltInAction": () => (/* binding */ BuiltInAction), + "Draft": () => (/* binding */ Draft), + "ExtendedModel": () => (/* binding */ ExtendedModel), + "Frozen": () => (/* binding */ Frozen), + "FrozenCheckMode": () => (/* binding */ FrozenCheckMode), + "FrozenTypeInfo": () => (/* binding */ FrozenTypeInfo), + "HookAction": () => (/* binding */ HookAction), + "InternalPatchRecorder": () => (/* binding */ InternalPatchRecorder), + "LiteralTypeInfo": () => (/* binding */ LiteralTypeInfo), + "MobxKeystoneError": () => (/* binding */ MobxKeystoneError), + "Model": () => (/* binding */ Model), + "ModelAutoTypeCheckingMode": () => (/* binding */ ModelAutoTypeCheckingMode), + "ModelTypeInfo": () => (/* binding */ ModelTypeInfo), + "NumberTypeInfo": () => (/* binding */ NumberTypeInfo), + "ObjectMap": () => (/* binding */ ObjectMap), + "ObjectMapTypeInfo": () => (/* binding */ ObjectMapTypeInfo), + "ObjectTypeInfo": () => (/* binding */ ObjectTypeInfo), + "OrTypeInfo": () => (/* binding */ OrTypeInfo), + "RecordTypeInfo": () => (/* binding */ RecordTypeInfo), + "Ref": () => (/* binding */ Ref), + "RefTypeInfo": () => (/* binding */ RefTypeInfo), + "RefinementTypeInfo": () => (/* binding */ RefinementTypeInfo), + "SandboxManager": () => (/* binding */ SandboxManager), + "StringTypeInfo": () => (/* binding */ StringTypeInfo), + "TupleTypeInfo": () => (/* binding */ TupleTypeInfo), + "TypeCheckError": () => (/* binding */ TypeCheckError), + "TypeInfo": () => (/* binding */ TypeInfo), + "UncheckedTypeInfo": () => (/* binding */ UncheckedTypeInfo), + "UndoManager": () => (/* binding */ UndoManager), + "UndoStore": () => (/* binding */ UndoStore), + "WalkTreeMode": () => (/* binding */ WalkTreeMode), + "_async": () => (/* binding */ _async), + "_await": () => (/* binding */ _await), + "abstractModelClass": () => (/* binding */ abstractModelClass), + "actionCallToReduxAction": () => (/* binding */ actionCallToReduxAction), + "actionTrackingMiddleware": () => (/* binding */ actionTrackingMiddleware), + "addActionMiddleware": () => (/* binding */ addActionMiddleware), + "addActionToFnModel": () => (/* binding */ addActionToFnModel), + "addHiddenProp": () => (/* binding */ addHiddenProp), + "addLateInitializationFunction": () => (/* binding */ addLateInitializationFunction), + "applyAction": () => (/* binding */ applyAction), + "applyDelete": () => (/* binding */ applyDelete), + "applyMethodCall": () => (/* binding */ applyMethodCall), + "applyPatches": () => (/* binding */ applyPatches), + "applySerializedActionAndSyncNewModelIds": () => (/* binding */ applySerializedActionAndSyncNewModelIds), + "applySerializedActionAndTrackNewModelIds": () => (/* binding */ applySerializedActionAndTrackNewModelIds), + "applySet": () => (/* binding */ applySet), + "applySnapshot": () => (/* binding */ applySnapshot), + "arraySet": () => (/* binding */ arraySet), + "asMap": () => (/* binding */ asMap), + "asReduxStore": () => (/* binding */ asReduxStore), + "asSet": () => (/* binding */ asSet), + "assertCanWrite": () => (/* binding */ assertCanWrite), + "assertFnModelKeyNotInUse": () => (/* binding */ assertFnModelKeyNotInUse), + "assertIsFunction": () => (/* binding */ assertIsFunction), + "assertIsMap": () => (/* binding */ assertIsMap), + "assertIsModel": () => (/* binding */ assertIsModel), + "assertIsModelClass": () => (/* binding */ assertIsModelClass), + "assertIsObject": () => (/* binding */ assertIsObject), + "assertIsObservableArray": () => (/* binding */ assertIsObservableArray), + "assertIsObservableObject": () => (/* binding */ assertIsObservableObject), + "assertIsPlainObject": () => (/* binding */ assertIsPlainObject), + "assertIsPrimitive": () => (/* binding */ assertIsPrimitive), + "assertIsSet": () => (/* binding */ assertIsSet), + "assertIsString": () => (/* binding */ assertIsString), + "assertIsTreeNode": () => (/* binding */ assertIsTreeNode), + "assertTweakedObject": () => (/* binding */ assertTweakedObject), + "baseModelPropNames": () => (/* binding */ baseModelPropNames), + "canWrite": () => (/* binding */ canWrite), + "cannotSerialize": () => (/* binding */ cannotSerialize), + "checkModelDecoratorArgs": () => (/* binding */ checkModelDecoratorArgs), + "clone": () => (/* binding */ clone), + "computedWalkTreeAggregate": () => (/* binding */ computedWalkTreeAggregate), + "connectReduxDevTools": () => (/* binding */ connectReduxDevTools), + "createContext": () => (/* binding */ createContext), + "customRef": () => (/* binding */ customRef), + "debugFreeze": () => (/* binding */ debugFreeze), + "decorateWrapMethodOrField": () => (/* binding */ decorateWrapMethodOrField), + "decoratedModel": () => (/* binding */ decoratedModel), + "deepEquals": () => (/* binding */ deepEquals), + "deleteFromArray": () => (/* binding */ deleteFromArray), + "deserializeActionCall": () => (/* binding */ deserializeActionCall), + "deserializeActionCallArgument": () => (/* binding */ deserializeActionCallArgument), + "detach": () => (/* binding */ detach), + "draft": () => (/* binding */ draft), + "extendFnModelActions": () => (/* binding */ extendFnModelActions), + "extendFnModelSetterActions": () => (/* binding */ extendFnModelSetterActions), + "extendFnModelViews": () => (/* binding */ extendFnModelViews), + "failure": () => (/* binding */ failure), + "fastGetParent": () => (/* binding */ fastGetParent), + "fastGetParentIncludingDataObjects": () => (/* binding */ fastGetParentIncludingDataObjects), + "fastGetParentPath": () => (/* binding */ fastGetParentPath), + "fastGetParentPathIncludingDataObjects": () => (/* binding */ fastGetParentPathIncludingDataObjects), + "fastGetRoot": () => (/* binding */ fastGetRoot), + "fastGetRootPath": () => (/* binding */ fastGetRootPath), + "fastGetRootStore": () => (/* binding */ fastGetRootStore), + "fastIsModelDataObject": () => (/* binding */ fastIsModelDataObject), + "fastIsRootStore": () => (/* binding */ fastIsRootStore), + "findParent": () => (/* binding */ findParent), + "findParentPath": () => (/* binding */ findParentPath), + "flow": () => (/* binding */ flow), + "fnArray": () => (/* binding */ fnArray), + "fnModel": () => (/* binding */ fnModel), + "fnObject": () => (/* binding */ fnObject), + "fromSnapshot": () => (/* binding */ fromSnapshot), + "frozen": () => (/* binding */ frozen), + "frozenKey": () => (/* binding */ frozenKey), + "getActionMiddlewares": () => (/* binding */ getActionMiddlewares), + "getActionProtection": () => (/* binding */ getActionProtection), + "getChildrenObjects": () => (/* binding */ getChildrenObjects), + "getCurrentActionContext": () => (/* binding */ getCurrentActionContext), + "getFnModelAction": () => (/* binding */ getFnModelAction), + "getGlobalConfig": () => (/* binding */ getGlobalConfig), + "getMobxVersion": () => (/* binding */ getMobxVersion), + "getModelDataType": () => (/* binding */ getModelDataType), + "getModelRefId": () => (/* binding */ getModelRefId), + "getNodeSandboxManager": () => (/* binding */ getNodeSandboxManager), + "getParent": () => (/* binding */ getParent), + "getParentPath": () => (/* binding */ getParentPath), + "getParentToChildPath": () => (/* binding */ getParentToChildPath), + "getRefsResolvingTo": () => (/* binding */ getRefsResolvingTo), + "getRoot": () => (/* binding */ getRoot), + "getRootPath": () => (/* binding */ getRootPath), + "getRootStore": () => (/* binding */ getRootStore), + "getSnapshot": () => (/* binding */ getSnapshot), + "getTypeInfo": () => (/* binding */ getTypeInfo), + "inDevMode": () => (/* binding */ inDevMode), + "instanceCreationDataTypeSymbol": () => (/* binding */ instanceCreationDataTypeSymbol), + "instanceDataTypeSymbol": () => (/* binding */ instanceDataTypeSymbol), + "internalApplyDelete": () => (/* binding */ internalApplyDelete), + "internalApplyMethodCall": () => (/* binding */ internalApplyMethodCall), + "internalApplyPatches": () => (/* binding */ internalApplyPatches), + "internalCustomRef": () => (/* binding */ internalCustomRef), + "internalPatchRecorder": () => (/* binding */ internalPatchRecorder), + "isArray": () => (/* binding */ isArray), + "isBuiltInAction": () => (/* binding */ isBuiltInAction), + "isChildOfParent": () => (/* binding */ isChildOfParent), + "isFrozenSnapshot": () => (/* binding */ isFrozenSnapshot), + "isHookAction": () => (/* binding */ isHookAction), + "isMap": () => (/* binding */ isMap), + "isModel": () => (/* binding */ isModel), + "isModelAction": () => (/* binding */ isModelAction), + "isModelAutoTypeCheckingEnabled": () => (/* binding */ isModelAutoTypeCheckingEnabled), + "isModelClass": () => (/* binding */ isModelClass), + "isModelDataObject": () => (/* binding */ isModelDataObject), + "isModelFlow": () => (/* binding */ isModelFlow), + "isModelSnapshot": () => (/* binding */ isModelSnapshot), + "isObject": () => (/* binding */ isObject), + "isParentOfChild": () => (/* binding */ isParentOfChild), + "isPlainObject": () => (/* binding */ isPlainObject), + "isPrimitive": () => (/* binding */ isPrimitive), + "isRefOfType": () => (/* binding */ isRefOfType), + "isReservedModelKey": () => (/* binding */ isReservedModelKey), + "isRoot": () => (/* binding */ isRoot), + "isRootStore": () => (/* binding */ isRootStore), + "isSandboxedNode": () => (/* binding */ isSandboxedNode), + "isSet": () => (/* binding */ isSet), + "isTreeNode": () => (/* binding */ isTreeNode), + "isTweakedObject": () => (/* binding */ isTweakedObject), + "jsonPatchToPatch": () => (/* binding */ jsonPatchToPatch), + "jsonPointerToPath": () => (/* binding */ jsonPointerToPath), + "lateVal": () => (/* binding */ lateVal), + "lazy": () => (/* binding */ lazy), + "logWarning": () => (/* binding */ logWarning), + "makePropReadonly": () => (/* binding */ makePropReadonly), + "mapToArray": () => (/* binding */ mapToArray), + "mapToObject": () => (/* binding */ mapToObject), + "model": () => (/* binding */ model), + "modelAction": () => (/* binding */ modelAction), + "modelClass": () => (/* binding */ modelClass), + "modelFlow": () => (/* binding */ modelFlow), + "modelIdKey": () => (/* binding */ modelIdKey), + "modelInitializedSymbol": () => (/* binding */ modelInitializedSymbol), + "modelSnapshotInWithMetadata": () => (/* binding */ modelSnapshotInWithMetadata), + "modelSnapshotOutWithMetadata": () => (/* binding */ modelSnapshotOutWithMetadata), + "modelTypeKey": () => (/* binding */ modelTypeKey), + "noDefaultValue": () => (/* binding */ noDefaultValue), + "objectMap": () => (/* binding */ objectMap), + "onActionMiddleware": () => (/* binding */ onActionMiddleware), + "onChildAttachedTo": () => (/* binding */ onChildAttachedTo), + "onGlobalPatches": () => (/* binding */ onGlobalPatches), + "onPatches": () => (/* binding */ onPatches), + "onSnapshot": () => (/* binding */ onSnapshot), + "patchRecorder": () => (/* binding */ patchRecorder), + "patchToJsonPatch": () => (/* binding */ patchToJsonPatch), + "pathToJsonPointer": () => (/* binding */ pathToJsonPointer), + "prop": () => (/* binding */ prop), + "propTransform": () => (/* binding */ propTransform), + "prop_dateString": () => (/* binding */ prop_dateString), + "prop_dateTimestamp": () => (/* binding */ prop_dateTimestamp), + "prop_mapArray": () => (/* binding */ prop_mapArray), + "prop_mapObject": () => (/* binding */ prop_mapObject), + "prop_setArray": () => (/* binding */ prop_setArray), + "propsCreationDataTypeSymbol": () => (/* binding */ propsCreationDataTypeSymbol), + "propsDataTypeSymbol": () => (/* binding */ propsDataTypeSymbol), + "readonlyMiddleware": () => (/* binding */ readonlyMiddleware), + "reduxActionType": () => (/* binding */ reduxActionType), + "registerActionCallArgumentSerializer": () => (/* binding */ registerActionCallArgumentSerializer), + "registerRootStore": () => (/* binding */ registerRootStore), + "resolvePath": () => (/* binding */ resolvePath), + "resolvePathCheckingIds": () => (/* binding */ resolvePathCheckingIds), + "rootRef": () => (/* binding */ rootRef), + "runLateInitializationFunctions": () => (/* binding */ runLateInitializationFunctions), + "runUnprotected": () => (/* binding */ runUnprotected), + "runWithoutSnapshotOrPatches": () => (/* binding */ runWithoutSnapshotOrPatches), + "runningWithoutSnapshotOrPatches": () => (/* binding */ runningWithoutSnapshotOrPatches), + "sandbox": () => (/* binding */ sandbox), + "serializeActionCall": () => (/* binding */ serializeActionCall), + "serializeActionCallArgument": () => (/* binding */ serializeActionCallArgument), + "setCurrentActionContext": () => (/* binding */ setCurrentActionContext), + "setGlobalConfig": () => (/* binding */ setGlobalConfig), + "setToArray": () => (/* binding */ setToArray), + "simplifyActionContext": () => (/* binding */ simplifyActionContext), + "skipIdChecking": () => (/* binding */ skipIdChecking), + "stringAsDate": () => (/* binding */ stringAsDate), + "tProp": () => (/* binding */ tProp), + "tProp_dateString": () => (/* binding */ tProp_dateString), + "tProp_dateTimestamp": () => (/* binding */ tProp_dateTimestamp), + "tProp_mapArray": () => (/* binding */ tProp_mapArray), + "tProp_mapObject": () => (/* binding */ tProp_mapObject), + "tProp_setArray": () => (/* binding */ tProp_setArray), + "tag": () => (/* binding */ tag), + "timestampAsDate": () => (/* binding */ timestampAsDate), + "toTreeNode": () => (/* binding */ toTreeNode), + "transaction": () => (/* binding */ transaction), + "transactionMiddleware": () => (/* binding */ transactionMiddleware), + "tryUntweak": () => (/* binding */ tryUntweak), + "tweak": () => (/* binding */ tweak), + "tweakedObjects": () => (/* binding */ tweakedObjects), + "typeCheck": () => (/* binding */ typeCheck), + "types": () => (/* binding */ types), + "undoMiddleware": () => (/* binding */ undoMiddleware), + "unregisterRootStore": () => (/* binding */ unregisterRootStore), + "walkTree": () => (/* binding */ walkTree), + "withoutUndo": () => (/* binding */ withoutUndo) +}); + +// EXTERNAL MODULE: ./node_modules/mobx/dist/mobx.esm.js +var mobx_esm = __webpack_require__(9637); +;// CONCATENATED MODULE: ./node_modules/mobx-keystone/node_modules/uuid/dist/esm-browser/rng.js +// Unique ID creation requires a high quality random # generator. In the browser we therefore +// require the crypto API and do not support built-in fallback to lower quality random number +// generators (like Math.random()). +// getRandomValues needs to be invoked in a context where "this" is a Crypto implementation. Also, +// find the complete implementation of crypto (msCrypto) on IE11. +var getRandomValues = typeof crypto !== 'undefined' && crypto.getRandomValues && crypto.getRandomValues.bind(crypto) || typeof msCrypto !== 'undefined' && typeof msCrypto.getRandomValues === 'function' && msCrypto.getRandomValues.bind(msCrypto); +var rnds8 = new Uint8Array(16); +function rng() { + if (!getRandomValues) { + throw new Error('crypto.getRandomValues() not supported. See https://github.com/uuidjs/uuid#getrandomvalues-not-supported'); + } + + return getRandomValues(rnds8); +} +;// CONCATENATED MODULE: ./node_modules/mobx-keystone/node_modules/uuid/dist/esm-browser/regex.js +/* harmony default export */ const regex = (/^(?:[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}|00000000-0000-0000-0000-000000000000)$/i); +;// CONCATENATED MODULE: ./node_modules/mobx-keystone/node_modules/uuid/dist/esm-browser/validate.js + + +function validate(uuid) { + return typeof uuid === 'string' && regex.test(uuid); +} + +/* harmony default export */ const esm_browser_validate = (validate); +;// CONCATENATED MODULE: ./node_modules/mobx-keystone/node_modules/uuid/dist/esm-browser/stringify.js + +/** + * Convert array of 16 byte values to UUID string format of the form: + * XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX + */ + +var byteToHex = []; + +for (var i = 0; i < 256; ++i) { + byteToHex.push((i + 0x100).toString(16).substr(1)); +} + +function stringify(arr) { + var offset = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0; + // Note: Be careful editing this code! It's been tuned for performance + // and works in ways you may not expect. See https://github.com/uuidjs/uuid/pull/434 + var uuid = (byteToHex[arr[offset + 0]] + byteToHex[arr[offset + 1]] + byteToHex[arr[offset + 2]] + byteToHex[arr[offset + 3]] + '-' + byteToHex[arr[offset + 4]] + byteToHex[arr[offset + 5]] + '-' + byteToHex[arr[offset + 6]] + byteToHex[arr[offset + 7]] + '-' + byteToHex[arr[offset + 8]] + byteToHex[arr[offset + 9]] + '-' + byteToHex[arr[offset + 10]] + byteToHex[arr[offset + 11]] + byteToHex[arr[offset + 12]] + byteToHex[arr[offset + 13]] + byteToHex[arr[offset + 14]] + byteToHex[arr[offset + 15]]).toLowerCase(); // Consistency check for valid UUID. If this throws, it's likely due to one + // of the following: + // - One or more input array values don't map to a hex octet (leading to + // "undefined" in the uuid) + // - Invalid input values for the RFC `version` or `variant` fields + + if (!esm_browser_validate(uuid)) { + throw TypeError('Stringified UUID is invalid'); + } + + return uuid; +} + +/* harmony default export */ const esm_browser_stringify = (stringify); +;// CONCATENATED MODULE: ./node_modules/mobx-keystone/node_modules/uuid/dist/esm-browser/v4.js + + + +function v4(options, buf, offset) { + options = options || {}; + var rnds = options.random || (options.rng || rng)(); // Per 4.4, set bits for version and `clock_seq_hi_and_reserved` + + rnds[6] = rnds[6] & 0x0f | 0x40; + rnds[8] = rnds[8] & 0x3f | 0x80; // Copy bytes to buffer, if provided + + if (buf) { + offset = offset || 0; + + for (var i = 0; i < 16; ++i) { + buf[offset + i] = rnds[i]; + } + + return buf; + } + + return esm_browser_stringify(rnds); +} + +/* harmony default export */ const esm_browser_v4 = (v4); +;// CONCATENATED MODULE: ./node_modules/mobx-keystone/node_modules/tslib/tslib.es6.js +/*! ***************************************************************************** +Copyright (c) Microsoft Corporation. + +Permission to use, copy, modify, and/or distribute this software for any +purpose with or without fee is hereby granted. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH +REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY +AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, +INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM +LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR +OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR +PERFORMANCE OF THIS SOFTWARE. +***************************************************************************** */ +/* global Reflect, Promise */ + +var extendStatics = function(d, b) { + extendStatics = Object.setPrototypeOf || + ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || + function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; }; + return extendStatics(d, b); +}; + +function __extends(d, b) { + extendStatics(d, b); + function __() { this.constructor = d; } + d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); +} + +var __assign = function() { + __assign = Object.assign || function __assign(t) { + for (var s, i = 1, n = arguments.length; i < n; i++) { + s = arguments[i]; + for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p]; + } + return t; + } + return __assign.apply(this, arguments); +} + +function __rest(s, e) { + var t = {}; + for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0) + t[p] = s[p]; + if (s != null && typeof Object.getOwnPropertySymbols === "function") + for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) { + if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i])) + t[p[i]] = s[p[i]]; + } + return t; +} + +function __decorate(decorators, target, key, desc) { + var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; + if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); + else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; + return c > 3 && r && Object.defineProperty(target, key, r), r; +} + +function __param(paramIndex, decorator) { + return function (target, key) { decorator(target, key, paramIndex); } +} + +function __metadata(metadataKey, metadataValue) { + if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(metadataKey, metadataValue); +} + +function __awaiter(thisArg, _arguments, P, generator) { + function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } + return new (P || (P = Promise))(function (resolve, reject) { + function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } + function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } + function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } + step((generator = generator.apply(thisArg, _arguments || [])).next()); + }); +} + +function __generator(thisArg, body) { + var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g; + return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g; + function verb(n) { return function (v) { return step([n, v]); }; } + function step(op) { + if (f) throw new TypeError("Generator is already executing."); + while (_) try { + if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t; + if (y = 0, t) op = [op[0] & 2, t.value]; + switch (op[0]) { + case 0: case 1: t = op; break; + case 4: _.label++; return { value: op[1], done: false }; + case 5: _.label++; y = op[1]; op = [0]; continue; + case 7: op = _.ops.pop(); _.trys.pop(); continue; + default: + if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; } + if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; } + if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; } + if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; } + if (t[2]) _.ops.pop(); + _.trys.pop(); continue; + } + op = body.call(thisArg, _); + } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; } + if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true }; + } +} + +var __createBinding = Object.create ? (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } }); +}) : (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + o[k2] = m[k]; +}); + +function __exportStar(m, o) { + for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(o, p)) __createBinding(o, m, p); +} + +function __values(o) { + var s = typeof Symbol === "function" && Symbol.iterator, m = s && o[s], i = 0; + if (m) return m.call(o); + if (o && typeof o.length === "number") return { + next: function () { + if (o && i >= o.length) o = void 0; + return { value: o && o[i++], done: !o }; + } + }; + throw new TypeError(s ? "Object is not iterable." : "Symbol.iterator is not defined."); +} + +function __read(o, n) { + var m = typeof Symbol === "function" && o[Symbol.iterator]; + if (!m) return o; + var i = m.call(o), r, ar = [], e; + try { + while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value); + } + catch (error) { e = { error: error }; } + finally { + try { + if (r && !r.done && (m = i["return"])) m.call(i); + } + finally { if (e) throw e.error; } + } + return ar; +} + +function __spread() { + for (var ar = [], i = 0; i < arguments.length; i++) + ar = ar.concat(__read(arguments[i])); + return ar; +} + +function __spreadArrays() { + for (var s = 0, i = 0, il = arguments.length; i < il; i++) s += arguments[i].length; + for (var r = Array(s), k = 0, i = 0; i < il; i++) + for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++) + r[k] = a[j]; + return r; +}; + +function __await(v) { + return this instanceof __await ? (this.v = v, this) : new __await(v); +} + +function __asyncGenerator(thisArg, _arguments, generator) { + if (!Symbol.asyncIterator) throw new TypeError("Symbol.asyncIterator is not defined."); + var g = generator.apply(thisArg, _arguments || []), i, q = []; + return i = {}, verb("next"), verb("throw"), verb("return"), i[Symbol.asyncIterator] = function () { return this; }, i; + function verb(n) { if (g[n]) i[n] = function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]) > 1 || resume(n, v); }); }; } + function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(q[0][3], e); } } + function step(r) { r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r); } + function fulfill(value) { resume("next", value); } + function reject(value) { resume("throw", value); } + function settle(f, v) { if (f(v), q.shift(), q.length) resume(q[0][0], q[0][1]); } +} + +function __asyncDelegator(o) { + var i, p; + return i = {}, verb("next"), verb("throw", function (e) { throw e; }), verb("return"), i[Symbol.iterator] = function () { return this; }, i; + function verb(n, f) { i[n] = o[n] ? function (v) { return (p = !p) ? { value: __await(o[n](v)), done: n === "return" } : f ? f(v) : v; } : f; } +} + +function __asyncValues(o) { + if (!Symbol.asyncIterator) throw new TypeError("Symbol.asyncIterator is not defined."); + var m = o[Symbol.asyncIterator], i; + return m ? m.call(o) : (o = typeof __values === "function" ? __values(o) : o[Symbol.iterator](), i = {}, verb("next"), verb("throw"), verb("return"), i[Symbol.asyncIterator] = function () { return this; }, i); + function verb(n) { i[n] = o[n] && function (v) { return new Promise(function (resolve, reject) { v = o[n](v), settle(resolve, reject, v.done, v.value); }); }; } + function settle(resolve, reject, d, v) { Promise.resolve(v).then(function(v) { resolve({ value: v, done: d }); }, reject); } +} + +function __makeTemplateObject(cooked, raw) { + if (Object.defineProperty) { Object.defineProperty(cooked, "raw", { value: raw }); } else { cooked.raw = raw; } + return cooked; +}; + +var __setModuleDefault = Object.create ? (function(o, v) { + Object.defineProperty(o, "default", { enumerable: true, value: v }); +}) : function(o, v) { + o["default"] = v; +}; + +function __importStar(mod) { + if (mod && mod.__esModule) return mod; + var result = {}; + if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k); + __setModuleDefault(result, mod); + return result; +} + +function __importDefault(mod) { + return (mod && mod.__esModule) ? mod : { default: mod }; +} + +function __classPrivateFieldGet(receiver, privateMap) { + if (!privateMap.has(receiver)) { + throw new TypeError("attempted to get private field on non-instance"); + } + return privateMap.get(receiver); +} + +function __classPrivateFieldSet(receiver, privateMap, value) { + if (!privateMap.has(receiver)) { + throw new TypeError("attempted to set private field on non-instance"); + } + privateMap.set(receiver, value); + return value; +} + +// EXTERNAL MODULE: ./node_modules/fast-deep-equal/es6/index.js +var es6 = __webpack_require__(4050); +var es6_default = /*#__PURE__*/__webpack_require__.n(es6); +;// CONCATENATED MODULE: ./node_modules/mobx-keystone/dist/mobxkeystone.esm.js + + + + + +/** + * Action type, sync or async. + */ +var ActionContextActionType; + +(function (ActionContextActionType) { + ActionContextActionType["Sync"] = "sync"; + ActionContextActionType["Async"] = "async"; +})(ActionContextActionType || (ActionContextActionType = {})); +/** + * An async step type. + */ + + +var ActionContextAsyncStepType; + +(function (ActionContextAsyncStepType) { + /** + * The flow is about to start. + */ + ActionContextAsyncStepType["Spawn"] = "spawn"; + /** + * The flow is about to return (finish). + */ + + ActionContextAsyncStepType["Return"] = "return"; + /** + * The flow is about to continue. + */ + + ActionContextAsyncStepType["Resume"] = "resume"; + /** + * The flow yield just threw, which might be recovered (caught) or not. + */ + + ActionContextAsyncStepType["ResumeError"] = "resumeError"; + /** + * The flow is about to throw an error to the flow caller. + */ + + ActionContextAsyncStepType["Throw"] = "throw"; +})(ActionContextAsyncStepType || (ActionContextAsyncStepType = {})); + +var currentActionContext; +/** + * Gets the currently running action context, or undefined if none. + * + * @returns + */ + +function getCurrentActionContext() { + return currentActionContext; +} +/** + * @ignore + * @internal + * + * Sets the current action context. + * + * @param ctx Current action context. + */ + +function setCurrentActionContext(ctx) { + currentActionContext = ctx; +} + +function _defineProperties(target, props) { + for (var i = 0; i < props.length; i++) { + var descriptor = props[i]; + descriptor.enumerable = descriptor.enumerable || false; + descriptor.configurable = true; + if ("value" in descriptor) descriptor.writable = true; + Object.defineProperty(target, descriptor.key, descriptor); + } +} + +function _createClass(Constructor, protoProps, staticProps) { + if (protoProps) _defineProperties(Constructor.prototype, protoProps); + if (staticProps) _defineProperties(Constructor, staticProps); + return Constructor; +} + +function _extends() { + _extends = Object.assign || function (target) { + for (var i = 1; i < arguments.length; i++) { + var source = arguments[i]; + + for (var key in source) { + if (Object.prototype.hasOwnProperty.call(source, key)) { + target[key] = source[key]; + } + } + } + + return target; + }; + + return _extends.apply(this, arguments); +} + +function _inheritsLoose(subClass, superClass) { + subClass.prototype = Object.create(superClass.prototype); + subClass.prototype.constructor = subClass; + subClass.__proto__ = superClass; +} + +function _getPrototypeOf(o) { + _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { + return o.__proto__ || Object.getPrototypeOf(o); + }; + return _getPrototypeOf(o); +} + +function _setPrototypeOf(o, p) { + _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { + o.__proto__ = p; + return o; + }; + + return _setPrototypeOf(o, p); +} + +function _isNativeReflectConstruct() { + if (typeof Reflect === "undefined" || !Reflect.construct) return false; + if (Reflect.construct.sham) return false; + if (typeof Proxy === "function") return true; + + try { + Date.prototype.toString.call(Reflect.construct(Date, [], function () {})); + return true; + } catch (e) { + return false; + } +} + +function _construct(Parent, args, Class) { + if (_isNativeReflectConstruct()) { + _construct = Reflect.construct; + } else { + _construct = function _construct(Parent, args, Class) { + var a = [null]; + a.push.apply(a, args); + var Constructor = Function.bind.apply(Parent, a); + var instance = new Constructor(); + if (Class) _setPrototypeOf(instance, Class.prototype); + return instance; + }; + } + + return _construct.apply(null, arguments); +} + +function _isNativeFunction(fn) { + return Function.toString.call(fn).indexOf("[native code]") !== -1; +} + +function _wrapNativeSuper(Class) { + var _cache = typeof Map === "function" ? new Map() : undefined; + + _wrapNativeSuper = function _wrapNativeSuper(Class) { + if (Class === null || !_isNativeFunction(Class)) return Class; + + if (typeof Class !== "function") { + throw new TypeError("Super expression must either be null or a function"); + } + + if (typeof _cache !== "undefined") { + if (_cache.has(Class)) return _cache.get(Class); + + _cache.set(Class, Wrapper); + } + + function Wrapper() { + return _construct(Class, arguments, _getPrototypeOf(this).constructor); + } + + Wrapper.prototype = Object.create(Class.prototype, { + constructor: { + value: Wrapper, + enumerable: false, + writable: true, + configurable: true + } + }); + return _setPrototypeOf(Wrapper, Class); + }; + + return _wrapNativeSuper(Class); +} + +function _assertThisInitialized(self) { + if (self === void 0) { + throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); + } + + return self; +} + +function _unsupportedIterableToArray(o, minLen) { + if (!o) return; + if (typeof o === "string") return _arrayLikeToArray(o, minLen); + var n = Object.prototype.toString.call(o).slice(8, -1); + if (n === "Object" && o.constructor) n = o.constructor.name; + if (n === "Map" || n === "Set") return Array.from(o); + if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); +} + +function _arrayLikeToArray(arr, len) { + if (len == null || len > arr.length) len = arr.length; + + for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i]; + + return arr2; +} + +function _createForOfIteratorHelperLoose(o, allowArrayLike) { + var it; + + if (typeof Symbol === "undefined" || o[Symbol.iterator] == null) { + if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === "number") { + if (it) o = it; + var i = 0; + return function () { + if (i >= o.length) return { + done: true + }; + return { + done: false, + value: o[i++] + }; + }; + } + + throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); + } + + it = o[Symbol.iterator](); + return it.next.bind(it); +} + +/** + * A mobx-keystone error. + */ + +var MobxKeystoneError = /*#__PURE__*/function (_Error) { + _inheritsLoose(MobxKeystoneError, _Error); + + function MobxKeystoneError(msg) { + var _this; + + _this = _Error.call(this, msg) || this; // Set the prototype explicitly. + + Object.setPrototypeOf(_assertThisInitialized(_this), MobxKeystoneError.prototype); + return _this; + } + + return MobxKeystoneError; +}( /*#__PURE__*/_wrapNativeSuper(Error)); +/** + * @ignore + * @internal + */ + +function failure(msg) { + return new MobxKeystoneError(msg); +} +var writableHiddenPropDescriptor = { + enumerable: false, + writable: true, + configurable: false, + value: undefined +}; +/** + * @ignore + * @internal + */ + +function addHiddenProp(object, propName, value, writable) { + if (writable === void 0) { + writable = true; + } + + if (writable) { + Object.defineProperty(object, propName, writableHiddenPropDescriptor); + object[propName] = value; + } else { + Object.defineProperty(object, propName, { + enumerable: false, + writable: writable, + configurable: true, + value: value + }); + } +} +/** + * @ignore + * @internal + */ + +function makePropReadonly(object, propName, enumerable) { + var propDesc = Object.getOwnPropertyDescriptor(object, propName); + + if (propDesc) { + propDesc.enumerable = enumerable; + + if (propDesc.get) { + delete propDesc.set; + } else { + propDesc.writable = false; + } + + Object.defineProperty(object, propName, propDesc); + } +} +/** + * @ignore + * @internal + */ + +function isPlainObject(value) { + if (!isObject(value)) return false; + var proto = Object.getPrototypeOf(value); + return proto === Object.prototype || proto === null; +} +/** + * @ignore + * @internal + */ + +function isObject(value) { + return value !== null && typeof value === "object"; +} +/** + * @ignore + * @internal + */ + +function isPrimitive(value) { + switch (typeof value) { + case "number": + case "string": + case "boolean": + case "undefined": + case "bigint": + return true; + } + + return value === null; +} +/** + * @ignore + * @internal + */ + +function debugFreeze(value) { + if (inDevMode()) { + Object.freeze(value); + } +} +/** + * @ignore + * @internal + */ + +function deleteFromArray(array, value) { + var index = array.indexOf(value); + + if (index >= 0) { + array.splice(index, 1); + return true; + } + + return false; +} +/** + * @ignore + * @internal + */ + +function isMap(val) { + return val instanceof Map || (0,mobx_esm.isObservableMap)(val); +} +/** + * @ignore + * @internal + */ + +function isSet(val) { + return val instanceof Set || (0,mobx_esm.isObservableSet)(val); +} +/** + * @ignore + * @internal + */ + +function isArray(val) { + return Array.isArray(val) || (0,mobx_esm.isObservableArray)(val); +} +/** + * @ignore + * @internal + */ + +function inDevMode() { + return "production" !== "production"; +} +/** + * @ignore + * @internal + */ + +function assertIsObject(value, argName) { + if (!isObject(value)) { + throw failure(argName + " must be an object"); + } +} +/** + * @ignore + * @internal + */ + +function assertIsPlainObject(value, argName) { + if (!isPlainObject(value)) { + throw failure(argName + " must be a plain object"); + } +} +/** + * @ignore + * @internal + */ + +function assertIsObservableObject(value, argName) { + if (!(0,mobx_esm.isObservableObject)(value)) { + throw failure(argName + " must be an observable object"); + } +} +/** + * @ignore + * @internal + */ + +function assertIsObservableArray(value, argName) { + if (!(0,mobx_esm.isObservableArray)(value)) { + throw failure(argName + " must be an observable array"); + } +} +/** + * @ignore + * @internal + */ + +function assertIsMap(value, argName) { + if (!isMap(value)) { + throw failure(argName + " must be a map"); + } +} +/** + * @ignore + * @internal + */ + +function assertIsSet(value, argName) { + if (!isSet(value)) { + throw failure(argName + " must be a set"); + } +} +/** + * @ignore + * @internal + */ + +function assertIsFunction(value, argName) { + if (typeof value !== "function") { + throw failure(argName + " must be a function"); + } +} +/** + * @ignore + * @internal + */ + +function assertIsPrimitive(value, argName) { + if (!isPrimitive(value)) { + throw failure(argName + " must be a primitive"); + } +} +/** + * @ignore + * @internal + */ + +function assertIsString(value, argName) { + if (typeof value !== "string") { + throw failure(argName + " must be a string"); + } +} +var decoratorsSymbol = /*#__PURE__*/Symbol("decorators"); +/** + * @ignore + * @internal + */ + +function addLateInitializationFunction(target, fn) { + var decoratorsArray = target[decoratorsSymbol]; + + if (!decoratorsArray) { + decoratorsArray = []; + addHiddenProp(target, decoratorsSymbol, decoratorsArray); + } + + decoratorsArray.push(fn); +} +/** + * @ignore + * @internal + */ + +function decorateWrapMethodOrField(decoratorName, data, wrap) { + var target = data.target, + propertyKey = data.propertyKey, + baseDescriptor = data.baseDescriptor; + + var addFieldDecorator = function addFieldDecorator() { + addLateInitializationFunction(target, function (instance) { + instance[propertyKey] = wrap(data, instance[propertyKey]); + }); + }; + + if (baseDescriptor) { + if (baseDescriptor.get !== undefined) { + throw failure("@" + decoratorName + " cannot be used with getters"); + } + + if (baseDescriptor.value) { + // babel / typescript - method decorator + // @action method() { } + return { + enumerable: false, + writable: true, + configurable: true, + value: wrap(data, baseDescriptor.value) + }; + } else { + // babel - field decorator: @action method = () => {} + addFieldDecorator(); + } + } else { + // typescript - field decorator + addFieldDecorator(); + } +} +/** + * @ignore + * @internal + */ + +function runLateInitializationFunctions(instance) { + var fns = instance[decoratorsSymbol]; + + if (fns) { + for (var _iterator = _createForOfIteratorHelperLoose(fns), _step; !(_step = _iterator()).done;) { + var fn = _step.value; + fn(instance); + } + } +} +var warningsAlreadyDisplayed = /*#__PURE__*/new Set(); +/** + * @ignore + * @internal + */ + +function logWarning(type, msg, uniqueKey) { + if (uniqueKey) { + if (warningsAlreadyDisplayed.has(uniqueKey)) { + return; + } + + warningsAlreadyDisplayed.add(uniqueKey); + } + + msg = "[mobx-keystone] " + msg; + + switch (type) { + case "warn": + console.warn(msg); + break; + + case "error": + console.error(msg); + break; + + default: + throw failure("unknown log type - " + type); + } +} +var notMemoized = /*#__PURE__*/Symbol("notMemoized"); +/** + * @ignore + * @internal + */ + +function lateVal(getter) { + var memoized = notMemoized; + + var fn = function fn() { + if (memoized === notMemoized) { + memoized = getter.apply(void 0, arguments); + } + + return memoized; + }; + + return fn; +} +/** + * @ignore + * @internal + */ + +function lazy(valueGen) { + var inited = false; + var val; + return function () { + if (!inited) { + val = valueGen(); + inited = true; + } + + return val; + }; +} +/** + * @ignore + * @internal + */ + +function getMobxVersion() { + if (mobx_esm.makeObservable) { + return 6; + } else { + return 5; + } +} + +var chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/="; +function toBase64(input) { + if (typeof __webpack_require__.g === "object" && typeof __webpack_require__.g.Buffer === "function") { + // node + return Buffer.from(input).toString("base64"); + } + + if (typeof btoa === "function") { + // browser + return btoa(input); + } + + var str = String(input); + var output = ""; + + for ( // initialize result and counter + var block = 0, charCode, idx = 0, map = chars; // if the next str index does not exist: + // change the mapping table to "=" + // check if d has no fractional digits + str.charAt(idx | 0) || (map = "=", idx % 1); // "8 - idx % 1 * 8" generates the sequence 2, 4, 6, 8 + output += map.charAt(63 & block >> 8 - idx % 1 * 8)) { + charCode = str.charCodeAt(idx += 3 / 4); + + if (charCode > 0xff) { + throw new Error("the string to be encoded contains characters outside of the Latin1 range."); + } + + block = block << 8 | charCode; + } + + return output; +} + +/** + * Model auto type-checking mode. + */ + +var ModelAutoTypeCheckingMode; + +(function (ModelAutoTypeCheckingMode) { + /** + * Auto type check models only in dev mode + */ + ModelAutoTypeCheckingMode["DevModeOnly"] = "devModeOnly"; + /** + * Auto type check models no matter the current environment + */ + + ModelAutoTypeCheckingMode["AlwaysOn"] = "alwaysOn"; + /** + * Do not auto type check models no matter the current environment + */ + + ModelAutoTypeCheckingMode["AlwaysOff"] = "alwaysOff"; +})(ModelAutoTypeCheckingMode || (ModelAutoTypeCheckingMode = {})); + +var localId = 0; +var localBaseId = /*#__PURE__*/shortenUuid( /*#__PURE__*/esm_browser_v4()); + +function defaultModelIdGenerator() { + // we use base 36 for local id since it is short and fast + var id = localId.toString(36) + "-" + localBaseId; + localId++; + return id; +} // defaults + + +var globalConfig = { + modelAutoTypeChecking: ModelAutoTypeCheckingMode.DevModeOnly, + modelIdGenerator: defaultModelIdGenerator, + allowUndefinedArrayElements: false +}; +/** + * Partially sets the current global config. + * + * @param config Partial object with the new configurations. Options not included in the object won't be changed. + */ + +function setGlobalConfig(config) { + globalConfig = Object.freeze(_extends({}, globalConfig, config)); +} +/** + * Returns the current global config object. + * + * @returns + */ + +function getGlobalConfig() { + return globalConfig; +} +/** + * @ignore + * @internal + * + * Returns if the auto type checking for models is enabled. + * + * @returns + */ + +function isModelAutoTypeCheckingEnabled() { + switch (getGlobalConfig().modelAutoTypeChecking) { + case ModelAutoTypeCheckingMode.DevModeOnly: + return inDevMode(); + + case ModelAutoTypeCheckingMode.AlwaysOff: + return false; + + case ModelAutoTypeCheckingMode.AlwaysOn: + return true; + + default: + throw failure("invalid 'modelAutoTypeChecking' config value - " + globalConfig.modelAutoTypeChecking); + } +} + +function shortenUuid(uuid) { + // remove non-hex chars + var hex = uuid.split("-").join(""); // convert to base64 + + var hexMatch = hex.match(/\w{2}/g); + var str = String.fromCharCode.apply(null, hexMatch.map(function (a) { + return parseInt(a, 16); + })); + return toBase64(str); +} + +/** + * @ignore + */ + +var noDefaultValue = /*#__PURE__*/Symbol("noDefaultValue"); +function prop(arg1, arg2) { + var def; + var opts = {}; + var hasDefaultValue = false; + + if (arguments.length >= 2) { + // default, options + def = arg1; + hasDefaultValue = true; + opts = _extends({}, arg2); + } else if (arguments.length === 1) { + // default | options + if (isObject(arg1)) { + // options + opts = _extends({}, arg1); + } else { + // default + def = arg1; + hasDefaultValue = true; + } + } + + var isDefFn = typeof def === "function"; + return { + $propValueType: null, + $propCreationValueType: null, + $isOptional: null, + $instanceValueType: null, + $instanceCreationValueType: null, + defaultFn: hasDefaultValue && isDefFn ? def : noDefaultValue, + defaultValue: hasDefaultValue && !isDefFn ? def : noDefaultValue, + typeChecker: undefined, + transform: undefined, + options: opts + }; +} + +/** + * Creates a prop transform, useful to transform property data into another kind of data. + * + * For example, to transform from a number timestamp into a date: + * ```ts + * const asDate = propTransform({ + * propToData(prop: number) { + * return new Date(prop) + * }, + * dataToProp(data: Date) { + * return +data + * } + * }) + * + * @model("myApp/MyModel") + * class MyModel extends Model({ + * timestamp: prop() + * }) { + * @asDate("timestamp") + * date!: Date + * } + * + * const date: Date = myModel.date + * // inside some model action + * myModel.date = new Date() + * ``` + * + * @typename TProp Property value type. + * @typename TData Data value type. + * @param transform Transform to apply. + * @returns A decorator that can be used to decorate model class fields. + */ + +function propTransform(transform) { + var parametrizedDecorator = function parametrizedDecorator(boundPropName) { + var decorator = function decorator(target, propertyKey) { + addLateInitializationFunction(target, function (instance) { + // make the field a getter setter + Object.defineProperty(instance, propertyKey, { + get: function get() { + var memoTransform = memoTransformCache.getOrCreateMemoTransform(this, propertyKey, transform); + return memoTransform.propToData(this.$[boundPropName]); + }, + set: function set(value) { + var memoTransform = memoTransformCache.getOrCreateMemoTransform(this, propertyKey, transform); + this.$[boundPropName] = memoTransform.dataToProp(value); + return true; + } + }); + }); + }; + + return decorator; + }; + + parametrizedDecorator.propToData = transform.propToData.bind(transform); + parametrizedDecorator.dataToProp = transform.dataToProp.bind(transform); + return parametrizedDecorator; +} + +var MemoTransformCache = /*#__PURE__*/function () { + function MemoTransformCache() { + this.cache = new WeakMap(); + } + + var _proto = MemoTransformCache.prototype; + + _proto.getOrCreateMemoTransform = function getOrCreateMemoTransform(target, propName, baseTransform) { + var transformsPerProperty = this.cache.get(target); + + if (!transformsPerProperty) { + transformsPerProperty = new Map(); + this.cache.set(target, transformsPerProperty); + } + + var memoTransform = transformsPerProperty.get(propName); + + if (!memoTransform) { + memoTransform = toMemoPropTransform(baseTransform, function (newPropValue) { + target.$[propName] = newPropValue; + }); + transformsPerProperty.set(propName, memoTransform); + } + + return memoTransform; + }; + + return MemoTransformCache; +}(); +/** + * @ignore + * @internal + */ + + +var memoTransformCache = /*#__PURE__*/new MemoTransformCache(); +var valueNotMemoized = /*#__PURE__*/Symbol("valueNotMemoized"); + +function toMemoPropTransform(transform, propSetter) { + var lastPropValue = valueNotMemoized; + var lastDataValue = valueNotMemoized; + return { + isMemoPropTransform: true, + propToData: function propToData(propValue) { + if (lastPropValue !== propValue) { + lastDataValue = transform.propToData(propValue, propSetter); + lastPropValue = propValue; + } + + return lastDataValue; + }, + dataToProp: function dataToProp(newDataValue) { + // clear caches in this case + lastPropValue = valueNotMemoized; + lastDataValue = valueNotMemoized; + return transform.dataToProp(newDataValue); + } + }; +} +/** + * @ignore + * @internal + */ + + +function transformedProp(prop, transform, transformDefault) { + if (prop.transform) { + throw failure("a property cannot have more than one transform"); + } + + var p = _extends({}, prop, { + transform: transform + }); // transform defaults if needed + + + if (transformDefault) { + if (p.defaultValue !== noDefaultValue) { + var originalDefaultValue = p.defaultValue; + p.defaultValue = transform.dataToProp(originalDefaultValue); + } + + if (p.defaultFn !== noDefaultValue) { + var originalDefaultFn = p.defaultFn; + + p.defaultFn = function () { + return transform.dataToProp(originalDefaultFn()); + }; + } + } + + return p; +} + +/** + * @ignore + */ + +var objectParents = /*#__PURE__*/new WeakMap(); +/** + * @ignore + */ + +var objectParentsAtoms = /*#__PURE__*/new WeakMap(); +/** + * @ignore + */ + +function parentPathEquals(parentPath1, parentPath2, comparePath) { + if (comparePath === void 0) { + comparePath = true; + } + + if (!parentPath1 && !parentPath2) return true; + if (!parentPath1 || !parentPath2) return false; + var parentEquals = parentPath1.parent === parentPath2.parent; + if (!parentEquals) return false; + return comparePath ? parentPath1.path === parentPath2.path : true; +} + +function createParentPathAtom(obj) { + var atom = objectParentsAtoms.get(obj); + + if (!atom) { + atom = (0,mobx_esm.createAtom)("parentAtom"); + objectParentsAtoms.set(obj, atom); + } + + return atom; +} +/** + * @ignore + */ + + +function reportParentPathObserved(node) { + createParentPathAtom(node).reportObserved(); +} +/** + * @ignore + */ + +function reportParentPathChanged(node) { + createParentPathAtom(node).reportChanged(); +} +/** + * @ignore + */ + +var dataObjectParent = /*#__PURE__*/new WeakMap(); +/** + * @ignore + */ + +function dataToModelNode(node) { + var modelNode = dataObjectParent.get(node); + return modelNode != null ? modelNode : node; +} +/** + * @ignore + */ + +function modelToDataNode(node) { + return isModel(node) ? node.$ : node; +} + +/** + * @ignore + * @internal + */ + +var tweakedObjects = /*#__PURE__*/new WeakMap(); +/** + * @ignore + * @internal + */ + +function isTweakedObject(value, canBeDataObject) { + if (!canBeDataObject && dataObjectParent.has(value)) { + return false; + } + + return tweakedObjects.has(value); +} +/** + * Checks if a given object is now a tree node. + * + * @param value Value to check. + * @returns true if it is a tree node, false otherwise. + */ + +function isTreeNode(value) { + return !isPrimitive(value) && isTweakedObject(value, false); +} +/** + * @ignore + * @internal + */ + +function assertTweakedObject(treeNode, argName, canBeDataObject) { + if (canBeDataObject === void 0) { + canBeDataObject = false; + } + + if (!canBeDataObject && dataObjectParent.has(treeNode)) { + throw failure(argName + " must be the model object instance instead of the '$' sub-object"); + } + + if (isPrimitive(treeNode) || !isTweakedObject(treeNode, true)) { + throw failure(argName + " must be a tree node (usually a model or a shallow / deep child part of a model 'data' object)"); + } +} +/** + * Asserts a given object is now a tree node, or throws otherwise. + * + * @param value Value to check. + * @param argName Argument name, part of the thrown error description. + */ + +function assertIsTreeNode(value, argName) { + if (argName === void 0) { + argName = "argument"; + } + + assertTweakedObject(value, argName, false); +} +/** + * @ignore + * @internal + */ + +var runningWithoutSnapshotOrPatches = false; +/** + * @ignore + * @internal + */ + +function runWithoutSnapshotOrPatches(fn) { + var old = runningWithoutSnapshotOrPatches; + runningWithoutSnapshotOrPatches = true; + + try { + (0,mobx_esm.runInAction)(function () { + fn(); + }); + } finally { + runningWithoutSnapshotOrPatches = old; + } +} + +/** + * Key where model snapshots will store model type metadata. + */ +var modelTypeKey = "$modelType"; +/** + * Key where model snapshots will store model internal IDs metadata. + */ + +var modelIdKey = "$modelId"; +/** + * @internal + * Returns if a given key is a reserved key in model snapshots. + * + * @param key + * @returns + */ + +function isReservedModelKey(key) { + return key === modelTypeKey || key === modelIdKey; +} + +var defaultObservableSetOptions = { + deep: false +}; +var objectChildren = /*#__PURE__*/new WeakMap(); +/** + * @ignore + * @internal + */ + +function initializeObjectChildren(node) { + if (objectChildren.has(node)) { + return; + } + + objectChildren.set(node, { + shallow: mobx_esm.observable.set(undefined, defaultObservableSetOptions), + deep: new Set(), + deepByModelTypeAndId: new Map(), + deepDirty: true, + deepAtom: (0,mobx_esm.createAtom)("deepChildrenAtom") + }); +} +/** + * @ignore + * @internal + */ + +function getObjectChildren(node) { + return objectChildren.get(node).shallow; +} +/** + * @ignore + * @internal + */ + +function getDeepObjectChildren(node) { + var obj = objectChildren.get(node); + + if (obj.deepDirty) { + updateDeepObjectChildren(node); + } + + obj.deepAtom.reportObserved(); + return { + deep: obj.deep, + deepByModelTypeAndId: obj.deepByModelTypeAndId + }; +} + +function addNodeToDeepLists(node, deep, deepByModelTypeAndId) { + deep.add(node); + + if (isModel(node)) { + deepByModelTypeAndId.set(byModelTypeAndIdKey(node[modelTypeKey], node[modelIdKey]), node); + } +} + +var updateDeepObjectChildren = /*#__PURE__*/(0,mobx_esm.action)(function (node) { + var obj = objectChildren.get(node); + + if (!obj.deepDirty) { + return { + deep: obj.deep, + deepByModelTypeAndId: obj.deepByModelTypeAndId + }; + } + + var deep = new Set(); + var deepByModelTypeAndId = new Map(); + var childrenIter = getObjectChildren(node).values(); + var ch = childrenIter.next(); + + while (!ch.done) { + addNodeToDeepLists(ch.value, deep, deepByModelTypeAndId); + var ret = updateDeepObjectChildren(ch.value).deep; + var retIter = ret.values(); + var retCur = retIter.next(); + + while (!retCur.done) { + addNodeToDeepLists(retCur.value, deep, deepByModelTypeAndId); + retCur = retIter.next(); + } + + ch = childrenIter.next(); + } + + obj.deep = deep; + obj.deepByModelTypeAndId = deepByModelTypeAndId; + obj.deepDirty = false; + obj.deepAtom.reportChanged(); + return { + deep: deep, + deepByModelTypeAndId: deepByModelTypeAndId + }; +}); +/** + * @ignore + * @internal + */ + +var addObjectChild = /*#__PURE__*/(0,mobx_esm.action)(function (node, child) { + var obj = objectChildren.get(node); + obj.shallow.add(child); + invalidateDeepChildren(node); +}); +/** + * @ignore + * @internal + */ + +var removeObjectChild = /*#__PURE__*/(0,mobx_esm.action)(function (node, child) { + var obj = objectChildren.get(node); + obj.shallow["delete"](child); + invalidateDeepChildren(node); +}); + +function invalidateDeepChildren(node) { + var obj = objectChildren.get(node); + + if (!obj.deepDirty) { + obj.deepDirty = true; + obj.deepAtom.reportChanged(); + } + + var parent = fastGetParent(node); + + if (parent) { + invalidateDeepChildren(parent); + } +} +/** + * @ignore + * @internal + */ + + +function byModelTypeAndIdKey(modelType, modelId) { + return modelType + " " + modelId; +} + +/** + * Returns the parent of the target plus the path from the parent to the target, or undefined if it has no parent. + * + * @typeparam T Parent object type. + * @param value Target object. + * @returns + */ + +function getParentPath(value) { + assertTweakedObject(value, "value"); + return fastGetParentPath(value); +} +/** + * @ignore + * @internal + */ + +function fastGetParentPath(value) { + reportParentPathObserved(value); + return objectParents.get(value); +} +/** + * @ignore + * @internal + */ + +function fastGetParentPathIncludingDataObjects(value) { + var parentModel = dataObjectParent.get(value); + + if (parentModel) { + return { + parent: parentModel, + path: "$" + }; + } + + var parentPath = fastGetParentPath(value); + + if (parentPath && isModel(parentPath.parent)) { + return { + parent: parentPath.parent.$, + path: parentPath.path + }; + } + + return parentPath; +} +/** + * Returns the parent object of the target object, or undefined if there's no parent. + * + * @typeparam T Parent object type. + * @param value Target object. + * @returns + */ + +function getParent(value) { + assertTweakedObject(value, "value"); + return fastGetParent(value); +} +/** + * @ignore + * @internal + */ + +function fastGetParent(value) { + var parentPath = fastGetParentPath(value); + return parentPath ? parentPath.parent : undefined; +} +/** + * @ignore + * @internal + */ + +function fastGetParentIncludingDataObjects(value) { + var parentPath = fastGetParentPathIncludingDataObjects(value); + return parentPath ? parentPath.parent : undefined; +} +/** + * Returns if a given object is a model interim data object (`$`). + * + * @param value Object to check. + * @returns true if it is, false otherwise. + */ + +function isModelDataObject(value) { + assertTweakedObject(value, "value", true); + return fastIsModelDataObject(value); +} +/** + * @ignore + * @internal + */ + +function fastIsModelDataObject(value) { + return dataObjectParent.has(value); +} +/** + * Returns the root of the target plus the path from the root to get to the target. + * + * @typeparam T Root object type. + * @param value Target object. + * @returns + */ + +function getRootPath(value) { + assertTweakedObject(value, "value"); + return fastGetRootPath(value); +} // we use computeds so they are cached whenever possible + +var computedsGetRootPath = /*#__PURE__*/new WeakMap(); + +function internalGetRootPath(value) { + var rootPath = { + root: value, + path: [], + pathObjects: [value] + }; + var parentPath; + + while (parentPath = fastGetParentPath(rootPath.root)) { + rootPath.root = parentPath.parent; + rootPath.path.unshift(parentPath.path); + rootPath.pathObjects.unshift(parentPath.parent); + } + + return rootPath; +} +/** + * @ignore + * @internal + */ + + +function fastGetRootPath(value) { + var computedGetRootPathForNode = computedsGetRootPath.get(value); + + if (!computedGetRootPathForNode) { + computedGetRootPathForNode = (0,mobx_esm.computed)(function () { + return internalGetRootPath(value); + }); + computedsGetRootPath.set(value, computedGetRootPathForNode); + } + + return computedGetRootPathForNode.get(); +} +/** + * Returns the root of the target object, or itself if the target is a root. + * + * @typeparam T Root object type. + * @param value Target object. + * @returns + */ + +function getRoot(value) { + assertTweakedObject(value, "value"); + return fastGetRoot(value); +} +/** + * @ignore + * @internal + */ + +function fastGetRoot(value) { + return fastGetRootPath(value).root; +} +/** + * Returns if a given object is a root object. + * + * @param value Target object. + * @returns + */ + +function isRoot(value) { + assertTweakedObject(value, "value"); + return !fastGetParent(value); +} +/** + * Returns if the target is a "child" of the tree of the given "parent" object. + * + * @param child Target object. + * @param parent Parent object. + * @returns + */ + +function isChildOfParent(child, parent) { + assertTweakedObject(child, "child"); + assertTweakedObject(parent, "parent"); + return getDeepObjectChildren(parent).deep.has(child); +} +/** + * Returns if the target is a "parent" that has in its tree the given "child" object. + * + * @param parent Target object. + * @param child Child object. + * @returns + */ + +function isParentOfChild(parent, child) { + return isChildOfParent(child, parent); +} +var unresolved = { + resolved: false +}; +/** + * Tries to resolve a path from an object. + * + * @typeparam T Returned value type. + * @param pathRootObject Object that serves as path root. + * @param path Path as an string or number array. + * @returns An object with `{ resolved: true, value: T }` or `{ resolved: false }`. + */ + +function resolvePath(pathRootObject, path) { + // unit tests rely on this to work with any object + // assertTweakedObject(pathRootObject, "pathRootObject") + var current = modelToDataNode(pathRootObject); + var len = path.length; + + for (var i = 0; i < len; i++) { + if (!isObject(current)) { + return unresolved; + } + + var p = path[i]; // check just to avoid mobx warnings about trying to access out of bounds index + + if (isArray(current) && +p >= current.length) { + return unresolved; + } + + current = modelToDataNode(current[p]); + } + + return { + resolved: true, + value: dataToModelNode(current) + }; +} +/** + * @ignore + */ + +var skipIdChecking = /*#__PURE__*/Symbol("skipIdChecking"); +/** + * @ignore + * + * Tries to resolve a path from an object while checking ids. + * + * @typeparam T Returned value type. + * @param pathRootObject Object that serves as path root. + * @param path Path as an string or number array. + * @param pathIds An array of ids of the models that must be checked, null if not a model or `skipIdChecking` to skip it. + * @returns An object with `{ resolved: true, value: T }` or `{ resolved: false }`. + */ + +function resolvePathCheckingIds(pathRootObject, path, pathIds) { + // unit tests rely on this to work with any object + // assertTweakedObject(pathRootObject, "pathRootObject") + var current = modelToDataNode(pathRootObject); // root id is never checked + + var len = path.length; + + for (var i = 0; i < len; i++) { + if (!isObject(current)) { + return { + resolved: false + }; + } + + var p = path[i]; // check just to avoid mobx warnings about trying to access out of bounds index + + if (isArray(current) && +p >= current.length) { + return { + resolved: false + }; + } + + var currentMaybeModel = current[p]; + current = modelToDataNode(currentMaybeModel); + var expectedId = pathIds[i]; + + if (expectedId !== skipIdChecking) { + var currentId = isModel(currentMaybeModel) ? currentMaybeModel[modelIdKey] : null; + + if (expectedId !== currentId) { + return { + resolved: false + }; + } + } + } + + return { + resolved: true, + value: dataToModelNode(current) + }; +} +/** + * Gets the path to get from a parent to a given child. + * Returns an empty array if the child is actually the given parent or undefined if the child is not a child of the parent. + * + * @param fromParent + * @param toChild + * @returns + */ + +function getParentToChildPath(fromParent, toChild) { + assertTweakedObject(fromParent, "fromParent"); + assertTweakedObject(toChild, "toChild"); + + if (fromParent === toChild) { + return []; + } + + var path = []; + var current = toChild; + var parentPath; + + while (parentPath = fastGetParentPath(current)) { + path.unshift(parentPath.path); + current = parentPath.parent; + + if (current === fromParent) { + return path; + } + } + + return undefined; +} + +var snapshots = /*#__PURE__*/new WeakMap(); +/** + * @ignore + * @internal + */ + +function getInternalSnapshot(value) { + return snapshots.get(value); +} + +function getInternalSnapshotParent(sn, parentPath) { + return (0,mobx_esm.untracked)(function () { + if (!parentPath) { + return undefined; + } + + var parentSn = getInternalSnapshot(parentPath.parent); + + if (!parentSn) { + return undefined; + } + + return sn ? { + parentSnapshot: parentSn, + parentPath: parentPath + } : undefined; + }); +} +/** + * @ignore + * @internal + */ + + +var unsetInternalSnapshot = /*#__PURE__*/(0,mobx_esm.action)("unsetInternalSnapshot", function (value) { + var oldSn = getInternalSnapshot(value); + + if (oldSn) { + snapshots["delete"](value); + oldSn.atom.reportChanged(); + } +}); +/** + * @ignore + * @internal + */ + +var setInternalSnapshot = /*#__PURE__*/(0,mobx_esm.action)("setInternalSnapshot", function (value, standard) { + var oldSn = getInternalSnapshot(value); // do not actually update if not needed + + if (oldSn && oldSn.standard === standard) { + return; + } + + debugFreeze(standard); + var sn; + + if (oldSn) { + sn = oldSn; + sn.standard = standard; + } else { + sn = { + standard: standard, + atom: (0,mobx_esm.createAtom)("snapshot") + }; + snapshots.set(value, sn); + } + + sn.atom.reportChanged(); // also update parent(s) snapshot(s) if needed + + var parent = getInternalSnapshotParent(oldSn, fastGetParentPath(value)); + + if (parent) { + var parentSnapshot = parent.parentSnapshot, + parentPath = parent.parentPath; // might be false in the cases where the parent has not yet been created + + if (parentSnapshot) { + var path = parentPath.path; // patches for parent changes should not be emitted + + var parentStandardSn = parentSnapshot.standard; + + if (parentStandardSn[path] !== sn.standard) { + if (Array.isArray(parentStandardSn)) { + parentStandardSn = parentStandardSn.slice(); + } else { + parentStandardSn = Object.assign({}, parentStandardSn); + } + + parentStandardSn[path] = sn.standard; + setInternalSnapshot(parentPath.parent, parentStandardSn); + } + } + } +}); +/** + * @ignore + */ + +function reportInternalSnapshotObserved(sn) { + sn.atom.reportObserved(); +} + +/** + * Retrieves an immutable snapshot for a data structure. + * Since returned snapshots are immutable they will respect shallow equality, this is, + * if no changes are made then the snapshot will be kept the same. + * + * @typeparam T Object type. + * @param nodeOrPrimitive Data structure, including primtives. + * @returns The snapshot. + */ + +function getSnapshot(nodeOrPrimitive) { + if (isPrimitive(nodeOrPrimitive)) { + return nodeOrPrimitive; + } + + assertTweakedObject(nodeOrPrimitive, "nodeOrPrimitive"); + var snapshot = getInternalSnapshot(nodeOrPrimitive); + + if (!snapshot) { + throw failure("getSnapshot is not supported for this kind of object"); + } + + reportInternalSnapshotObserved(snapshot); + return snapshot.standard; +} + +var modelDataTypeCheckerSymbol = /*#__PURE__*/Symbol("modelDataTypeChecker"); +var modelUnwrappedClassSymbol = /*#__PURE__*/Symbol("modelUnwrappedClass"); + +/** + * Returns the associated data type for run-time checking (if any) to a model instance or class. + * + * @param modelClassOrInstance Model class or instance. + * @returns The associated data type, or undefined if none. + */ + +function getModelDataType(modelClassOrInstance) { + if (isModel(modelClassOrInstance)) { + return modelClassOrInstance.constructor[modelDataTypeCheckerSymbol]; + } else if (isModelClass(modelClassOrInstance)) { + return modelClassOrInstance[modelDataTypeCheckerSymbol]; + } else { + throw failure("modelClassOrInstance must be a model class or instance"); + } +} + +/** + * @ignore + */ + +var modelInfoByName = {}; +/** + * @ignore + */ + +var modelInfoByClass = /*#__PURE__*/new Map(); +/** + * @ignore + */ + +function getModelInfoForName(name) { + return modelInfoByName[name]; +} + +var modelPropertiesSymbol = /*#__PURE__*/Symbol("modelProperties"); +/** + * @ignore + * @internal + * + * Gets the info related to a model class properties. + * + * @param modelClass + */ + +function getInternalModelClassPropsInfo(modelClass) { + return modelClass[modelPropertiesSymbol]; +} +/** + * @ignore + * @internal + * + * Sets the info related to a model class properties. + * + * @param modelClass + */ + +function setInternalModelClassPropsInfo(modelClass, props) { + modelClass[modelPropertiesSymbol] = props; +} + +/** + * A type checking error. + */ + +var TypeCheckError = /*#__PURE__*/function () { + /** + * Creates an instance of TypeError. + * @param path Sub-path where the error occured. + * @param expectedTypeName Name of the expected type. + * @param actualValue Actual value. + */ + function TypeCheckError(path, expectedTypeName, actualValue) { + this.path = void 0; + this.expectedTypeName = void 0; + this.actualValue = void 0; + this.path = path; + this.expectedTypeName = expectedTypeName; + this.actualValue = actualValue; + } + /** + * Throws the type check error as an actual error. + * + * @param typeCheckedValue Usually the value where the type check was invoked. + */ + + + var _proto = TypeCheckError.prototype; + + _proto["throw"] = function _throw(typeCheckedValue) { + var msg = "TypeCheckError: "; + var rootPath = []; + + if (isTweakedObject(typeCheckedValue, true)) { + rootPath = getRootPath(typeCheckedValue).path; + } + + msg += "[/" + [].concat(rootPath, this.path).join("/") + "] "; + msg += "Expected: " + this.expectedTypeName; + throw failure(msg); + }; + + return TypeCheckError; +}(); + +var emptyPath = []; +var typeCheckersWithCachedResultsOfObject = /*#__PURE__*/new WeakMap(); +/** + * @ignore + */ + +function invalidateCachedTypeCheckerResult(obj) { + // we need to invalidate it for the object and all its parents + var current = obj; + + while (current) { + var set = typeCheckersWithCachedResultsOfObject.get(current); + + if (set) { + for (var _iterator = _createForOfIteratorHelperLoose(set), _step; !(_step = _iterator()).done;) { + var typeChecker = _step.value; + typeChecker.invalidateCachedResult(current); + } + + typeCheckersWithCachedResultsOfObject["delete"](current); + } + + current = fastGetParentIncludingDataObjects(current); + } +} +/** + * @ignore + */ + +var TypeChecker = /*#__PURE__*/function () { + var _proto = TypeChecker.prototype; + + _proto.createCacheIfNeeded = function createCacheIfNeeded() { + if (!this.checkResultCache) { + this.checkResultCache = new WeakMap(); + } + + return this.checkResultCache; + }; + + _proto.setCachedResult = function setCachedResult(obj, newCacheValue) { + this.createCacheIfNeeded().set(obj, newCacheValue); // register this type checker as listener of that object changes + + var typeCheckerSet = typeCheckersWithCachedResultsOfObject.get(obj); + + if (!typeCheckerSet) { + typeCheckerSet = new Set(); + typeCheckersWithCachedResultsOfObject.set(obj, typeCheckerSet); + } + + typeCheckerSet.add(this); + }; + + _proto.invalidateCachedResult = function invalidateCachedResult(obj) { + if (this.checkResultCache) { + this.checkResultCache["delete"](obj); + } + }; + + _proto.getCachedResult = function getCachedResult(obj) { + return this.checkResultCache ? this.checkResultCache.get(obj) : undefined; + }; + + _proto.check = function check(value, path) { + if (this.unchecked) { + return null; + } + + if (!isTweakedObject(value, true)) { + return this._check(value, path); + } // optimized checking with cached values + + + var cachedResult = this.getCachedResult(value); + + if (cachedResult === undefined) { + // we set the path empty since the resoult could be used for another paths other than this base + cachedResult = this._check(value, emptyPath); + this.setCachedResult(value, cachedResult); + } + + if (cachedResult) { + return new TypeCheckError([].concat(path, cachedResult.path), cachedResult.expectedTypeName, cachedResult.actualValue); + } else { + return null; + } + }; + + _createClass(TypeChecker, [{ + key: "typeInfo", + get: function get() { + return this._cachedTypeInfoGen(this); + } + }]); + + function TypeChecker(_check, getTypeName, typeInfoGen) { + this._check = void 0; + this.getTypeName = void 0; + this.checkResultCache = void 0; + this.unchecked = void 0; + this._cachedTypeInfoGen = void 0; + this._check = _check; + this.getTypeName = getTypeName; + this.unchecked = !_check; + this._cachedTypeInfoGen = lateVal(typeInfoGen); + } + + return TypeChecker; +}(); +var lateTypeCheckerSymbol = /*#__PURE__*/Symbol("lateTypeCheker"); +/** + * @ignore + */ + +function lateTypeChecker(fn, typeInfoGen) { + var cached; + + var ltc = function ltc() { + if (cached) { + return cached; + } + + cached = fn(); + return cached; + }; + + ltc[lateTypeCheckerSymbol] = true; + var cachedTypeInfoGen = lateVal(typeInfoGen); + Object.defineProperty(ltc, "typeInfo", { + enumerable: true, + configurable: true, + get: function get() { + return cachedTypeInfoGen(ltc); + } + }); + return ltc; +} +/** + * @ignore + */ + +function isLateTypeChecker(ltc) { + return typeof ltc === "function" && ltc[lateTypeCheckerSymbol]; +} +/** + * Type info base class. + */ + +var TypeInfo = function TypeInfo(thisType) { + this.thisType = void 0; + this.thisType = thisType; +}; +/** + * Gets the type info of a given type. + * + * @param type Type to get the info from. + * @returns The type info. + */ + +function getTypeInfo(type) { + var stdType = resolveStandardType(type); + var typeInfo = stdType.typeInfo; + + if (!typeInfo) { + throw failure("type info not found for " + type); + } + + return typeInfo; +} + +/** + * A refinement over a given type. This allows you to do extra checks + * over models, ensure numbers are integers, etc. + * + * Example: + * ```ts + * const integerType = types.refinement(types.number, (n) => { + * return Number.isInteger(n) + * }, "integer") + * + * const sumModelType = types.refinement(types.model(Sum), (sum) => { + * // imagine that for some reason sum includes a number 'a', a number 'b' + * // and the result + * + * const rightResult = sum.a + sum.b === sum.result + * + * // simple mode that will just return that the whole model is incorrect + * return rightResult + * + * // this will return that the result field is wrong + * return rightResult ? null : new TypeCheckError(["result"], "a+b", sum.result) + * }) + * ``` + * + * @template T Base type. + * @param baseType Base type. + * @param checkFn Function that will receive the data (if it passes the base type + * check) and return null or false if there were no errors or either a TypeCheckError instance or + * true if there were. + * @returns + */ + +function typesRefinement(baseType, checkFn, typeName) { + var typeInfoGen = function typeInfoGen(t) { + return new RefinementTypeInfo(t, resolveStandardType(baseType), checkFn, typeName); + }; + + return lateTypeChecker(function () { + var baseChecker = resolveTypeChecker(baseType); + + var getTypeName = function getTypeName() { + for (var _len = arguments.length, recursiveTypeCheckers = new Array(_len), _key = 0; _key < _len; _key++) { + recursiveTypeCheckers[_key] = arguments[_key]; + } + + var baseTypeName = baseChecker.getTypeName.apply(baseChecker, recursiveTypeCheckers.concat([baseChecker])); + var refinementName = typeName || "refinementOf"; + return refinementName + "<" + baseTypeName + ">"; + }; + + var thisTc = new TypeChecker(function (data, path) { + var baseErr = baseChecker.check(data, path); + + if (baseErr) { + return baseErr; + } + + var refinementErr = checkFn(data); + + if (refinementErr === true) { + return null; + } else if (refinementErr === false) { + return new TypeCheckError([], getTypeName(thisTc), data); + } else { + return refinementErr != null ? refinementErr : null; + } + }, getTypeName, typeInfoGen); + return thisTc; + }, typeInfoGen); +} +/** + * `types.refinement` type info. + */ + +var RefinementTypeInfo = /*#__PURE__*/function (_TypeInfo) { + _inheritsLoose(RefinementTypeInfo, _TypeInfo); + + _createClass(RefinementTypeInfo, [{ + key: "baseTypeInfo", + get: function get() { + return getTypeInfo(this.baseType); + } + }]); + + function RefinementTypeInfo(thisType, baseType, checkFunction, typeName) { + var _this; + + _this = _TypeInfo.call(this, thisType) || this; + _this.baseType = void 0; + _this.checkFunction = void 0; + _this.typeName = void 0; + _this.baseType = baseType; + _this.checkFunction = checkFunction; + _this.typeName = typeName; + return _this; + } + + return RefinementTypeInfo; +}(TypeInfo); + +/** + * A type that represents a certain value of a primitive (for example an *exact* number or string). + * + * Example + * ```ts + * const hiType = types.literal("hi") // the string with value "hi" + * const number5Type = types.literal(5) // the number with value 5 + * ``` + * + * @typeparam T Literal value type. + * @param literal Literal value. + * @returns + */ + +function typesLiteral(literal) { + assertIsPrimitive(literal, "literal"); + var typeName; + + switch (literal) { + case undefined: + typeName = "undefined"; + break; + + case null: + typeName = "null"; + break; + + default: + typeName = JSON.stringify(literal); + break; + } + + var typeInfoGen = function typeInfoGen(t) { + return new LiteralTypeInfo(t, literal); + }; + + return new TypeChecker(function (value, path) { + return value === literal ? null : new TypeCheckError(path, typeName, value); + }, function () { + return typeName; + }, typeInfoGen); +} +/** + * `types.literal` type info. + */ + +var LiteralTypeInfo = /*#__PURE__*/function (_TypeInfo) { + _inheritsLoose(LiteralTypeInfo, _TypeInfo); + + function LiteralTypeInfo(thisType, literal) { + var _this; + + _this = _TypeInfo.call(this, thisType) || this; + _this.literal = void 0; + _this.literal = literal; + return _this; + } + + return LiteralTypeInfo; +}(TypeInfo); +/** + * A type that represents the value undefined. + * Syntactic sugar for `types.literal(undefined)`. + * + * ```ts + * types.undefined + * ``` + */ + +var typesUndefined = /*#__PURE__*/typesLiteral(undefined); +/** + * A type that represents the value null. + * Syntactic sugar for `types.literal(null)`. + * + * ```ts + * types.null + * ``` + */ + +var typesNull = /*#__PURE__*/typesLiteral(null); +/** + * A type that represents any boolean value. + * + * ```ts + * types.boolean + * ``` + */ + +var typesBoolean = /*#__PURE__*/new TypeChecker(function (value, path) { + return typeof value === "boolean" ? null : new TypeCheckError(path, "boolean", value); +}, function () { + return "boolean"; +}, function (t) { + return new BooleanTypeInfo(t); +}); +/** + * `types.boolean` type info. + */ + +var BooleanTypeInfo = /*#__PURE__*/function (_TypeInfo2) { + _inheritsLoose(BooleanTypeInfo, _TypeInfo2); + + function BooleanTypeInfo() { + return _TypeInfo2.apply(this, arguments) || this; + } + + return BooleanTypeInfo; +}(TypeInfo); +/** + * A type that represents any number value. + * + * ```ts + * types.number + * ``` + */ + +var typesNumber = /*#__PURE__*/new TypeChecker(function (value, path) { + return typeof value === "number" ? null : new TypeCheckError(path, "number", value); +}, function () { + return "number"; +}, function (t) { + return new NumberTypeInfo(t); +}); +/** + * `types.number` type info. + */ + +var NumberTypeInfo = /*#__PURE__*/function (_TypeInfo3) { + _inheritsLoose(NumberTypeInfo, _TypeInfo3); + + function NumberTypeInfo() { + return _TypeInfo3.apply(this, arguments) || this; + } + + return NumberTypeInfo; +}(TypeInfo); +/** + * A type that represents any string value. + * + * ```ts + * types.string + * ``` + */ + +var typesString = /*#__PURE__*/new TypeChecker(function (value, path) { + return typeof value === "string" ? null : new TypeCheckError(path, "string", value); +}, function () { + return "string"; +}, function (t) { + return new StringTypeInfo(t); +}); +/** + * `types.string` type info. + */ + +var StringTypeInfo = /*#__PURE__*/function (_TypeInfo4) { + _inheritsLoose(StringTypeInfo, _TypeInfo4); + + function StringTypeInfo() { + return _TypeInfo4.apply(this, arguments) || this; + } + + return StringTypeInfo; +}(TypeInfo); +/** + * A type that represents any integer number value. + * Syntactic sugar for `types.refinement(types.number, n => Number.isInteger(n), "integer")` + * + * ```ts + * types.integer + * ``` + */ + +var typesInteger = /*#__PURE__*/typesRefinement(typesNumber, function (n) { + return Number.isInteger(n); +}, "integer"); +/** + * A type that represents any string value other than "". + * Syntactic sugar for `types.refinement(types.string, s => s !== "", "nonEmpty")` + * + * ```ts + * types.nonEmptyString + * ``` + */ + +var typesNonEmptyString = /*#__PURE__*/typesRefinement(typesString, function (s) { + return s !== ""; +}, "nonEmpty"); + +/** + * @ignore + */ + +function resolveTypeChecker(v) { + var next = v; + + while (true) { + if (next instanceof TypeChecker) { + return next; + } else if (v === String) { + return typesString; + } else if (v === Number) { + return typesNumber; + } else if (v === Boolean) { + return typesBoolean; + } else if (v === null) { + return typesNull; + } else if (v === undefined) { + return typesUndefined; + } else if (isLateTypeChecker(next)) { + next = next(); + } else { + throw failure("type checker could not be resolved"); + } + } +} +/** + * @ignore + */ + +function resolveStandardType(v) { + if (v instanceof TypeChecker || isLateTypeChecker(v)) { + return v; + } else if (v === String) { + return typesString; + } else if (v === Number) { + return typesNumber; + } else if (v === Boolean) { + return typesBoolean; + } else if (v === null) { + return typesNull; + } else if (v === undefined) { + return typesUndefined; + } else { + throw failure("standard type could not be resolved"); + } +} + +var cachedModelTypeChecker = /*#__PURE__*/new WeakMap(); +/** + * A type that represents a model. The type referenced in the model decorator will be used for type checking. + * + * Example: + * ```ts + * const someModelType = types.model(SomeModel) + * // or for recursive models + * const someModelType = types.model(() => SomeModel) + * ``` + * + * @typeparam M Model type. + * @param modelClass Model class. + * @returns + */ + +function typesModel(modelClass) { + // if we type it any stronger then recursive defs and so on stop working + if (!isModelClass(modelClass) && typeof modelClass === "function") { + // resolve later + var typeInfoGen = function typeInfoGen(t) { + return new ModelTypeInfo(t, modelClass()); + }; + + return lateTypeChecker(function () { + return typesModel(modelClass()); + }, typeInfoGen); + } else { + var modelClazz = modelClass; + assertIsModelClass(modelClazz, "modelClass"); + var cachedTypeChecker = cachedModelTypeChecker.get(modelClazz); + + if (cachedTypeChecker) { + return cachedTypeChecker; + } + + var _typeInfoGen = function _typeInfoGen(t) { + return new ModelTypeInfo(t, modelClazz); + }; + + var tc = lateTypeChecker(function () { + var modelInfo = modelInfoByClass.get(modelClazz); + var typeName = "Model(" + modelInfo.name + ")"; + return new TypeChecker(function (value, path) { + if (!(value instanceof modelClazz)) { + return new TypeCheckError(path, typeName, value); + } + + var dataTypeChecker = getModelDataType(value); + + if (!dataTypeChecker) { + throw failure("type checking cannot be performed over model of type '" + modelInfo.name + "' at path " + path.join("/") + " since that model type has no data type declared, consider adding a data type or using types.unchecked() instead"); + } + + var resolvedTc = resolveTypeChecker(dataTypeChecker); + + if (!resolvedTc.unchecked) { + return resolvedTc.check(value.$, path); + } + + return null; + }, function () { + return typeName; + }, _typeInfoGen); + }, _typeInfoGen); + cachedModelTypeChecker.set(modelClazz, tc); + return tc; + } +} +/** + * `types.model` type info. + */ + +var ModelTypeInfo = /*#__PURE__*/function (_TypeInfo) { + _inheritsLoose(ModelTypeInfo, _TypeInfo); + + _createClass(ModelTypeInfo, [{ + key: "props", + get: function get() { + return this._props(); + } + }, { + key: "modelType", + get: function get() { + var modelInfo = modelInfoByClass.get(this.modelClass); + return modelInfo.name; + } + }]); + + function ModelTypeInfo(thisType, modelClass) { + var _this; + + _this = _TypeInfo.call(this, thisType) || this; + _this.modelClass = void 0; + _this._props = lateVal(function () { + var objSchema = getInternalModelClassPropsInfo(_this.modelClass); + var propTypes = {}; + Object.keys(objSchema).forEach(function (propName) { + var propData = objSchema[propName]; + var type = propData.typeChecker; + var typeInfo; + + if (type) { + typeInfo = getTypeInfo(type); + } + + var hasDefault = false; + var defaultValue; + + if (propData.defaultFn !== noDefaultValue) { + defaultValue = propData.defaultFn; + hasDefault = true; + } else if (propData.defaultValue !== noDefaultValue) { + defaultValue = propData.defaultValue; + hasDefault = true; + } + + propTypes[propName] = { + type: type, + typeInfo: typeInfo, + hasDefault: hasDefault, + "default": defaultValue + }; + }); + return propTypes; + }); + _this.modelClass = modelClass; + return _this; + } + + return ModelTypeInfo; +}(TypeInfo); + +/** + * Checks if a value conforms to a given type. + * + * @typename S Type. + * @param type Type to check for. + * @param value Value to check. + * @returns A TypeError if the check fails or null if no error. + */ + +function typeCheck(type, value) { + var typeChecker = resolveTypeChecker(type); + + if (typeChecker.unchecked) { + return null; + } else { + return typeChecker.check(value, []); + } +} + +/** + * @ignore + * @internal + */ + +function canWrite() { + return !getActionProtection() || !!getCurrentActionContext(); +} +/** + * @ignore + * @internal + */ + +function assertCanWrite() { + if (!canWrite()) { + throw failure("data changes must be performed inside model actions"); + } +} +var actionProtection = true; +/** + * @ignore + * @internal + * + * Gets if the action protection is currently enabled or not. + * + * @returns + */ + +function getActionProtection() { + return actionProtection; +} // base case + +function runUnprotected(arg1, arg2) { + var name = typeof arg1 === "string" ? arg1 : undefined; + var fn = typeof arg1 === "string" ? arg2 : arg1; + + var innerAction = function innerAction() { + var oldActionProtection = actionProtection; + actionProtection = false; + + try { + return fn(); + } finally { + actionProtection = oldActionProtection; + tryRunPendingActions(); + } + }; + + if (name) { + return (0,mobx_esm.action)(name, innerAction)(); + } else { + return (0,mobx_esm.action)(innerAction)(); + } +} + +var pendingActions = []; + +function isActionRunning() { + return !getActionProtection() || getCurrentActionContext(); +} +/** + * @ignore + */ + + +function enqueuePendingAction(action) { + // delay action until all current actions are finished + if (isActionRunning()) { + pendingActions.push(action); + } else { + action(); + } +} +/** + * @ignore + */ + +function tryRunPendingActions() { + if (isActionRunning()) { + return false; + } + + while (pendingActions.length > 0) { + var nextAction = pendingActions.shift(); + nextAction(); + } + + return true; +} + +/** + * A hook action. + */ +var HookAction; + +(function (HookAction) { + /** + * onInit hook + */ + HookAction["OnInit"] = "$$onInit"; + /** + * onAttachedToRootStore hook + */ + + HookAction["OnAttachedToRootStore"] = "$$onAttachedToRootStore"; + /** + * disposer for onAttachedToRootStore hook + */ + + HookAction["OnAttachedToRootStoreDisposer"] = "$$onAttachedToRootStoreDisposer"; +})(HookAction || (HookAction = {})); + +var hookActionValues = /*#__PURE__*/new Set( /*#__PURE__*/Object.values(HookAction)); +/** + * Returns if a given action name corresponds to a hook, this is, one of: + * - onInit() hook + * - onAttachedToRootStore() hook + * - disposer returned by a onAttachedToRootStore() hook + * + * @param actionName Action name to check. + * @returns true if it is a hook, false otherwise. + */ + +function isHookAction(actionName) { + return hookActionValues.has(actionName); +} + +var perObjectActionMiddlewares = /*#__PURE__*/new WeakMap(); +var perObjectActionMiddlewaresIterator = /*#__PURE__*/new WeakMap(); +/** + * @ignore + * @internal + * + * Gets the current action middlewares to be run over a given object as an iterable object. + * + * @returns + */ + +function getActionMiddlewares(obj) { + // when we call a middleware we will call the middlewares of that object plus all parent objects + // the parent object middlewares are run last + // since an array like [a, b, c] will be called like c(b(a())) this means that we need to put + // the parent object ones at the end of the array + var iterable = perObjectActionMiddlewaresIterator.get(obj); + + if (!iterable) { + var _iterable; + + iterable = (_iterable = {}, _iterable[Symbol.iterator] = function () { + var current = obj; + + function getCurrentIterator() { + var objMwares = current ? perObjectActionMiddlewares.get(current) : undefined; + + if (!objMwares || objMwares.length <= 0) { + return undefined; + } + + return objMwares[Symbol.iterator](); + } + + function findNextIterator() { + var nextIter; + + while (current && !nextIter) { + current = fastGetParent(current); + nextIter = getCurrentIterator(); + } + + return nextIter; + } + + var iter = getCurrentIterator(); + + if (!iter) { + iter = findNextIterator(); + } + + var iterator = { + next: function next() { + if (!iter) { + return { + value: undefined, + done: true + }; + } + + var result = iter.next(); + + if (!result.done) { + return result; + } + + iter = findNextIterator(); + return this.next(); + } + }; + return iterator; + }, _iterable); + perObjectActionMiddlewaresIterator.set(obj, iterable); + } + + return iterable; +} +/** + * Adds a global action middleware to be run when an action is performed. + * It is usually preferable to use `onActionMiddleware` instead to limit it to a given tree and only to topmost level actions + * or `actionTrackingMiddleware` for a simplified middleware. + * + * @param mware Action middleware to be run. + * @returns A disposer to cancel the middleware. Note that if you don't plan to do an early disposal of the middleware + * calling this function becomes optional. + */ + +function addActionMiddleware(mware) { + assertIsObject(mware, "middleware"); + var middleware = mware.middleware, + filter = mware.filter, + subtreeRoot = mware.subtreeRoot; + assertTweakedObject(subtreeRoot, "middleware.subtreeRoot"); + assertIsFunction(middleware, "middleware.middleware"); + + if (filter && typeof filter !== "function") { + throw failure("middleware.filter must be a function or undefined"); + } + + if (!(0,mobx_esm.isAction)(middleware)) { + middleware = (0,mobx_esm.action)(middleware.name || "actionMiddleware", middleware); + } + + if (subtreeRoot) { + var targetFilter = function targetFilter(ctx) { + return ctx.target === subtreeRoot || isChildOfParent(ctx.target, subtreeRoot); + }; + + if (!filter) { + filter = targetFilter; + } else { + var customFilter = filter; + + filter = function filter(ctx) { + return targetFilter(ctx) && customFilter(ctx); + }; + } + } + + var actualMware = { + middleware: middleware, + filter: filter + }; + var objMwares = perObjectActionMiddlewares.get(subtreeRoot); + + if (!objMwares) { + objMwares = [actualMware]; + perObjectActionMiddlewares.set(subtreeRoot, objMwares); + } else { + objMwares.push(actualMware); + } + + return function () { + deleteFromArray(objMwares, actualMware); + }; +} + +/** + * @ignore + */ + +var modelActionSymbol = /*#__PURE__*/Symbol("modelAction"); +/** + * @ignore + */ + +function wrapInAction(_ref) { + var name = _ref.name, + fn = _ref.fn, + actionType = _ref.actionType, + overrideContext = _ref.overrideContext, + _ref$isFlowFinisher = _ref.isFlowFinisher, + isFlowFinisher = _ref$isFlowFinisher === void 0 ? false : _ref$isFlowFinisher; + var wrappedAction = (0,mobx_esm.action)(name, function () { + var target = this; + + if (inDevMode()) { + assertTweakedObject(target, "wrappedAction"); + } + + var parentContext = getCurrentActionContext(); + var context = { + actionName: name, + type: actionType, + target: target, + args: Array.from(arguments), + parentContext: parentContext, + data: {}, + rootContext: undefined + }; + + if (overrideContext) { + overrideContext(context); + } + + if (!context.rootContext) { + if (context.previousAsyncStepContext) { + context.rootContext = context.previousAsyncStepContext.rootContext; + } else if (context.parentContext) { + context.rootContext = context.parentContext.rootContext; + } else { + context.rootContext = context; + } + } + + setCurrentActionContext(context); + var mwareFn = fn.bind.apply(fn, [target].concat(Array.prototype.slice.call(arguments))); + var mwareIter = getActionMiddlewares(target)[Symbol.iterator](); + var mwareCur = mwareIter.next(); + + while (!mwareCur.done) { + var mware = mwareCur.value; + var filterPassed = mware.filter ? mware.filter(context) : true; + + if (filterPassed) { + mwareFn = mware.middleware.bind(undefined, context, mwareFn); + } + + mwareCur = mwareIter.next(); + } + + try { + var ret = mwareFn(); + + if (isFlowFinisher) { + var flowFinisher = ret; + var value = flowFinisher.value; + + if (flowFinisher.resolution === "accept") { + flowFinisher.accepter(value); + } else { + flowFinisher.rejecter(value); + } + + return value; // not sure if this is even needed + } else { + return ret; + } + } finally { + setCurrentActionContext(context.parentContext); + tryRunPendingActions(); + } + }); + wrappedAction[modelActionSymbol] = true; + return wrappedAction; +} +/** + * @ignore + */ + +function wrapModelMethodInActionIfNeeded(model, propertyKey, name) { + var fn = model[propertyKey]; + + if (isModelAction(fn)) { + return; + } + + var wrappedFn = wrapInAction({ + name: name, + fn: fn, + actionType: ActionContextActionType.Sync + }); + var proto = Object.getPrototypeOf(model); + var protoFn = proto[propertyKey]; + + if (protoFn === fn) { + proto[propertyKey] = wrappedFn; + } else { + model[propertyKey] = wrappedFn; + } +} + +/** + * Mode for the `walkTree` method. + */ + +var WalkTreeMode; + +(function (WalkTreeMode) { + /** + * The walk will be done parent (roots) first, then children. + */ + WalkTreeMode["ParentFirst"] = "parentFirst"; + /** + * The walk will be done children (leafs) first, then parents. + */ + + WalkTreeMode["ChildrenFirst"] = "childrenFirst"; +})(WalkTreeMode || (WalkTreeMode = {})); +/** + * Walks a tree, running the predicate function for each node. + * If the predicate function returns something other than undefined, + * then the walk will be stopped and the function will return the returned value. + * + * @typeparam T Returned object type, defaults to void. + * @param target Subtree root object. + * @param predicate Function that will be run for each node of the tree. + * @param mode Mode to walk the tree, as defined in `WalkTreeMode`. + * @returns + */ + + +function walkTree(target, predicate, mode) { + assertTweakedObject(target, "target"); + + if (mode === WalkTreeMode.ParentFirst) { + var recurse = function recurse(child) { + return walkTreeParentFirst(child, predicate, recurse); + }; + + return walkTreeParentFirst(target, predicate, recurse); + } else { + var _recurse = function _recurse(child) { + return walkTreeChildrenFirst(child, predicate, _recurse); + }; + + return walkTreeChildrenFirst(target, predicate, _recurse); + } +} + +function walkTreeParentFirst(target, rootPredicate, recurse) { + var ret = rootPredicate(target); + + if (ret !== undefined) { + return ret; + } + + var childrenIter = getObjectChildren(target).values(); + var ch = childrenIter.next(); + + while (!ch.done) { + var _ret = recurse(ch.value); + + if (_ret !== undefined) { + return _ret; + } + + ch = childrenIter.next(); + } + + return undefined; +} + +function walkTreeChildrenFirst(target, rootPredicate, recurse) { + var childrenIter = getObjectChildren(target).values(); + var ch = childrenIter.next(); + + while (!ch.done) { + var _ret2 = recurse(ch.value); + + if (_ret2 !== undefined) { + return _ret2; + } + + ch = childrenIter.next(); + } + + var ret = rootPredicate(target); + + if (ret !== undefined) { + return ret; + } + + return undefined; +} +/** + * @ignore + * @internal + */ + + +function computedWalkTreeAggregate(predicate) { + var computedFns = new WeakMap(); + + var getComputedTreeResult = function getComputedTreeResult(tree) { + var cmpted = computedFns.get(tree); + + if (!cmpted) { + cmpted = (0,mobx_esm.computed)(function () { + return walkTreeAggregate(tree, predicate, recurse); + }); + computedFns.set(tree, cmpted); + } + + return cmpted.get(); + }; + + var recurse = function recurse(ch) { + return getComputedTreeResult(ch); + }; + + return { + walk: function walk(target) { + return getComputedTreeResult(target); + } + }; +} + +function walkTreeAggregate(target, rootPredicate, recurse) { + var map; + var rootVal = rootPredicate(target); + var childrenMap = getObjectChildren(target); + var childrenIter = childrenMap.values(); + var ch = childrenIter.next(); // small optimization, if there is only one child and this + // object provides no value we can just reuse the child ones + + if (rootVal === undefined && childrenMap.size === 1) { + return recurse(ch.value); + } + + while (!ch.done) { + var childMap = recurse(ch.value); + + if (childMap) { + if (!map) { + map = new Map(); + } // add child map keys/values to own map + + + var mapIter = childMap.keys(); + var mapCur = mapIter.next(); + + while (!mapCur.done) { + var key = mapCur.value; + var val = childMap.get(key); + map.set(key, val); + mapCur = mapIter.next(); + } + } + + ch = childrenIter.next(); + } // add it at the end so parent resolutions have higher + // priority than child ones + + + if (rootVal !== undefined) { + if (!map) { + map = new Map(); + } + + map.set(rootVal, target); + } + + return map; +} + +var onAttachedDisposers = /*#__PURE__*/new WeakMap(); +/** + * @ignore + * @internal + */ + +var attachToRootStore = /*#__PURE__*/(0,mobx_esm.action)("attachToRootStore", function (rootStore, child) { + // we use an array to ensure they will get called even if the actual hook modifies the tree + var childrenToCall = []; + walkTree(child, function (ch) { + if (ch instanceof BaseModel && ch.onAttachedToRootStore) { + wrapModelMethodInActionIfNeeded(ch, "onAttachedToRootStore", HookAction.OnAttachedToRootStore); + childrenToCall.push(ch); + } + }, WalkTreeMode.ParentFirst); + var childrenToCallLen = childrenToCall.length; + + for (var i = 0; i < childrenToCallLen; i++) { + var ch = childrenToCall[i]; + var disposer = ch.onAttachedToRootStore(rootStore); + + if (disposer) { + onAttachedDisposers.set(ch, disposer); + } + } +}); +/** + * @ignore + * @internal + */ + +var detachFromRootStore = /*#__PURE__*/(0,mobx_esm.action)("detachFromRootStore", function (child) { + // we use an array to ensure they will get called even if the actual hook modifies the tree + var disposersToCall = []; + walkTree(child, function (ch) { + var disposer = onAttachedDisposers.get(ch); + + if (disposer) { + // wrap disposer in action + var disposerAction = wrapInAction({ + name: HookAction.OnAttachedToRootStoreDisposer, + fn: disposer, + actionType: ActionContextActionType.Sync + }).bind(ch); + onAttachedDisposers["delete"](ch); + disposersToCall.push(disposerAction); + } + }, WalkTreeMode.ChildrenFirst); + var disposersToCallLen = disposersToCall.length; + + for (var i = 0; i < disposersToCallLen; i++) { + disposersToCall[i](); + } +}); + +var rootStores = /*#__PURE__*/new WeakSet(); +var rootStoreAtoms = /*#__PURE__*/new WeakMap(); +/** + * Registers a model / tree node object as a root store tree. + * Marking a model object as a root store tree serves several purposes: + * - It allows the `onAttachedToRootStore` hook (plus disposer) to be invoked on models once they become part of this tree. + * These hooks can be used for example to attach effects and serve as some sort of initialization. + * - It allows auto detachable references to work properly. + * + * @typeparam T Object type. + * @param node Node object to register as root store. + * @returns The same model object that was passed. + */ + +var registerRootStore = /*#__PURE__*/(0,mobx_esm.action)("registerRootStore", function (node) { + assertTweakedObject(node, "node"); + + if (rootStores.has(node)) { + throw failure("object already registered as root store"); + } + + if (!isRoot(node)) { + throw failure("a root store must not have a parent"); + } + + rootStores.add(node); + attachToRootStore(node, node); + getOrCreateRootStoreAtom(node).reportChanged(); + return node; +}); +/** + * Unregisters an object to mark it as no longer a root store. + * + * @param node Node object to unregister as root store. + */ + +var unregisterRootStore = /*#__PURE__*/(0,mobx_esm.action)("unregisterRootStore", function (node) { + if (!isRootStore(node)) { + throw failure("not a root store"); + } + + rootStores["delete"](node); + detachFromRootStore(node); + getOrCreateRootStoreAtom(node).reportChanged(); +}); +/** + * Checks if a given object is marked as a root store. + * + * @param node Object. + * @returns + */ + +function isRootStore(node) { + assertTweakedObject(node, "node"); + return fastIsRootStore(node); +} +/** + * @ignore + * @internal + */ + +function fastIsRootStore(node) { + getOrCreateRootStoreAtom(node).reportObserved(); + return rootStores.has(node); +} +/** + * Gets the root store of a given tree child, or undefined if none. + * + * @typeparam T Root store type. + * @param node Target to find the root store for. + * @returns + */ + +function getRootStore(node) { + assertTweakedObject(node, "node"); + return fastGetRootStore(node); +} +/** + * @ignore + * @internal + */ + +function fastGetRootStore(node) { + var root = fastGetRoot(node); + return fastIsRootStore(root) ? root : undefined; +} + +function getOrCreateRootStoreAtom(node) { + var atom = rootStoreAtoms.get(node); + + if (!atom) { + atom = (0,mobx_esm.createAtom)("rootStore"); + rootStoreAtoms.set(node, atom); + } + + return atom; +} + +/** + * @ignore + * @internal + */ + +var setParent = /*#__PURE__*/(0,mobx_esm.action)("setParent", function (value, parentPath, indexChangeAllowed, isDataObject) { + if (isPrimitive(value)) { + return; + } + + if (inDevMode()) { + if (typeof value === "function" || typeof value === "symbol") { + throw failure("assertion failed: value cannot be a function or a symbol"); + } + + if (!isTweakedObject(value, true)) { + throw failure("assertion failed: value is not ready to take a parent"); + } + + if (parentPath) { + if (!isTweakedObject(parentPath.parent, true)) { + throw failure("assertion failed: parent is not ready to take children"); + } + } + } + + if (isDataObject) { + dataObjectParent.set(value, parentPath.parent); // data object will proxy to use the actual parent model for child/parent stuff + + return; + } + + initializeObjectChildren(value); // make sure the new parent actually points to models when we give model data objs + + if (parentPath) { + var actualParent = dataToModelNode(parentPath.parent); + + if (parentPath.parent !== actualParent) { + parentPath = { + parent: actualParent, + path: parentPath.path + }; + } + } + + var oldParentPath = fastGetParentPath(value); + + if (parentPathEquals(oldParentPath, parentPath)) { + return; + } + + if (isRootStore(value)) { + throw failure("root stores cannot be attached to any parents"); + } + + if (oldParentPath && parentPath) { + if (oldParentPath.parent === parentPath.parent && indexChangeAllowed) { + // just changing the index + objectParents.set(value, parentPath); + reportParentPathChanged(value); + return; + } else { + throw failure("an object cannot be assigned a new parent when it already has one"); + } + } + + var removeFromOldParent = function removeFromOldParent() { + if (oldParentPath == null ? void 0 : oldParentPath.parent) { + removeObjectChild(oldParentPath.parent, value); + } + }; + + var attachToNewParent = function attachToNewParent() { + var _parentPath; + + objectParents.set(value, parentPath); + + if ((_parentPath = parentPath) == null ? void 0 : _parentPath.parent) { + addObjectChild(parentPath.parent, value); + } + + reportParentPathChanged(value); + }; + + if (value instanceof BaseModel) { + var oldRoot = fastGetRoot(value); + var oldRootStore = isRootStore(oldRoot) ? oldRoot : undefined; + removeFromOldParent(); + attachToNewParent(); + var newRoot = fastGetRoot(value); + var newRootStore = isRootStore(newRoot) ? newRoot : undefined; // invoke model root store events + + if (oldRootStore !== newRootStore && (oldRootStore || newRootStore)) { + enqueuePendingAction(function () { + if (oldRootStore) { + detachFromRootStore(value); + } + + if (newRootStore) { + attachToRootStore(newRootStore, value); + } + }); + } + } else { + removeFromOldParent(); + attachToNewParent(); + } +}); + +/** + * @ignore + */ + +function tweakModel(value, parentPath) { + tweakedObjects.set(value, undefined); + setParent(value, parentPath, false, false); // nothing to do for models, data is already proxified and its parent is set + // for snapshots we will use its "$" object snapshot directly + + return value; +} + +/** + * @ignore + * @internal + */ + +var InternalPatchRecorder = /*#__PURE__*/function () { + function InternalPatchRecorder() { + this.patches = void 0; + this.invPatches = void 0; + } + + var _proto = InternalPatchRecorder.prototype; + + _proto.record = function record(patches, invPatches) { + this.patches = patches; + this.invPatches = invPatches; + }; + + _proto.emit = function emit(obj) { + emitPatch(obj, this.patches, this.invPatches, true); + }; + + return InternalPatchRecorder; +}(); +var patchListeners = /*#__PURE__*/new WeakMap(); +var globalPatchListeners = []; +/** + * Adds a listener that will be called every time a patch is generated for the tree of the given target object. + * + * @param subtreeRoot Subtree root object of the patch listener. + * @param listener The listener function that will be called everytime a patch is generated for the object or its children. + * @returns A disposer to stop listening to patches. + */ + +function onPatches(subtreeRoot, listener) { + assertTweakedObject(subtreeRoot, "subtreeRoot"); + assertIsFunction(listener, "listener"); + + if (!(0,mobx_esm.isAction)(listener)) { + listener = (0,mobx_esm.action)(listener.name || "onPatchesListener", listener); + } + + var listenersForObject = patchListeners.get(subtreeRoot); + + if (!listenersForObject) { + listenersForObject = []; + patchListeners.set(subtreeRoot, listenersForObject); + } + + listenersForObject.push(listener); + return function () { + deleteFromArray(listenersForObject, listener); + }; +} +/** + * Adds a listener that will be called every time a patch is generated anywhere. + * Usually prefer using `onPatches`. + * + * @param listener The listener function that will be called everytime a patch is generated anywhere. + * @returns A disposer to stop listening to patches. + */ + +function onGlobalPatches(listener) { + assertIsFunction(listener, "listener"); + + if (!(0,mobx_esm.isAction)(listener)) { + listener = (0,mobx_esm.action)(listener.name || "onGlobalPatchesListener", listener); + } + + globalPatchListeners.push(listener); + return function () { + deleteFromArray(globalPatchListeners, listener); + }; +} + +function emitPatch(obj, patches, inversePatches, emitGlobally) { + if (patches.length <= 0 && inversePatches.length <= 0) { + return; + } // first emit global listeners + + + if (emitGlobally) { + for (var i = 0; i < globalPatchListeners.length; i++) { + var listener = globalPatchListeners[i]; + listener(obj, patches, inversePatches); + } + } // then per subtree listeners + + + var listenersForObject = patchListeners.get(obj); + + if (listenersForObject) { + for (var _i = 0; _i < listenersForObject.length; _i++) { + var _listener = listenersForObject[_i]; + + _listener(patches, inversePatches); + } + } // and also emit subtree listeners all the way to the root + + + var parentPath = fastGetParentPath(obj); + + if (parentPath) { + // tweak patches so they include the child path + var childPath = parentPath.path; + var newPatches = patches.map(function (p) { + return addPathToPatch(p, childPath); + }); + var newInversePatches = inversePatches.map(function (p) { + return addPathToPatch(p, childPath); + }); // false to avoid emitting global patches again for the same change + + emitPatch(parentPath.parent, newPatches, newInversePatches, false); + } +} + +function addPathToPatch(patch, path) { + return _extends({}, patch, { + path: [path].concat(patch.path) + }); +} + +/** + * Should freeze and plain json checks be done when creating the frozen object? + */ + +var FrozenCheckMode; + +(function (FrozenCheckMode) { + /** Only when in dev mode */ + FrozenCheckMode["DevModeOnly"] = "devModeOnly"; + /** Always */ + + FrozenCheckMode["On"] = "on"; + /** Never */ + + FrozenCheckMode["Off"] = "off"; +})(FrozenCheckMode || (FrozenCheckMode = {})); +/** + * @ignore + */ + + +var frozenKey = "$frozen"; +/** + * A class that contains frozen data. + * Use `frozen` to create an instance of this class. + * + * @typeparam T Data type. + */ + +var Frozen = +/** + * Frozen data, deeply immutable. + */ + +/** + * Creates an instance of Frozen. + * Do not use directly, use `frozen` instead. + * + * @param dataToFreeze + * @param checkMode + */ +function Frozen(dataToFreeze, checkMode) { + if (checkMode === void 0) { + checkMode = FrozenCheckMode.DevModeOnly; + } + + this.data = void 0; + var check = checkMode === FrozenCheckMode.On || checkMode === FrozenCheckMode.DevModeOnly && inDevMode(); + + if (check) { + checkDataIsSerializableAndFreeze(dataToFreeze); + } + + this.data = dataToFreeze; + + if (check) { + Object.freeze(this.data); + } + + tweak(this, undefined); +}; +/** + * Marks some data as frozen. Frozen data becomes immutable (at least in dev mode), and is not enhanced + * with capabilities such as getting the parent of the objects (except for the root object), it is not + * made deeply observable (though the root object is observable by reference), etc. + * On the other hand, this means it will be much faster to create/access. Use this for big data pieces + * that are unlikely to change unless all of them change (for example lists of points for a polygon, etc). + * + * Note that data passed to frozen must be serializable to JSON, this is: + * - primitive, plain object, or array + * - without cycles + * + * @param data + * @param checkMode + */ + +function frozen(data, checkMode) { + if (checkMode === void 0) { + checkMode = FrozenCheckMode.DevModeOnly; + } + + return new Frozen(data, checkMode); +} + +function checkDataIsSerializableAndFreeze(data) { + // TODO: detect cycles and throw if present? + // primitives are ok + if (isPrimitive(data)) { + return; + } + + if (Array.isArray(data)) { + var arrLen = data.length; + + for (var i = 0; i < arrLen; i++) { + var v = data[i]; + + if (v === undefined && !getGlobalConfig().allowUndefinedArrayElements) { + throw failure("undefined is not supported inside arrays since it is not serializable in JSON, consider using null instead"); + } + + checkDataIsSerializableAndFreeze(v); + } + + Object.freeze(data); + return; + } + + if (isPlainObject(data)) { + var dataKeys = Object.keys(data); + var dataKeysLen = dataKeys.length; + + for (var _i = 0; _i < dataKeysLen; _i++) { + var k = dataKeys[_i]; + var _v = data[k]; + checkDataIsSerializableAndFreeze(k); + checkDataIsSerializableAndFreeze(_v); + } + + Object.freeze(data); + return; + } + + throw failure("frozen data must be plainly serializable to JSON, but " + data + " is not"); +} +/** + * @ignore + * @internal + * + * Checks if an snapshot is an snapshot for a frozen data. + * + * @param snapshot + * @returns + */ + + +function isFrozenSnapshot(snapshot) { + return isPlainObject(snapshot) && !!snapshot[frozenKey]; +} + +/** + * Iterates through all the parents (from the nearest until the root) + * until one of them matches the given predicate. + * If the predicate is matched it will return the found node. + * If none is found it will return undefined. + * + * @typeparam T Parent object type. + * @param child Target object. + * @param predicate Function that will be run for every parent of the target object, from immediate parent to the root. + * @param maxDepth Max depth, or 0 for infinite. + * @returns + */ + +function findParent(child, predicate, maxDepth) { + if (maxDepth === void 0) { + maxDepth = 0; + } + + var foundParentPath = findParentPath(child, predicate, maxDepth); + return foundParentPath ? foundParentPath.parent : undefined; +} +/** + * Iterates through all the parents (from the nearest until the root) + * until one of them matches the given predicate. + * If the predicate is matched it will return the found node plus the + * path to get from the parent to the child. + * If none is found it will return undefined. + * + * @typeparam T Parent object type. + * @param child Target object. + * @param predicate Function that will be run for every parent of the target object, from immediate parent to the root. + * @param maxDepth Max depth, or 0 for infinite. + * @returns + */ + +function findParentPath(child, predicate, maxDepth) { + if (maxDepth === void 0) { + maxDepth = 0; + } + + assertTweakedObject(child, "child"); + var path = []; + var current = child; + var depth = 0; + var parentPath; + + while (parentPath = fastGetParentPath(current)) { + path.unshift(parentPath.path); + current = parentPath.parent; + + if (predicate(current)) { + return { + parent: current, + path: path + }; + } + + depth++; + + if (maxDepth > 0 && depth === maxDepth) { + break; + } + } + + return undefined; +} + +/** + * A built-in action. + */ +var BuiltInAction; + +(function (BuiltInAction) { + /** + * applyPatches + */ + BuiltInAction["ApplyPatches"] = "$$applyPatches"; + /** + * applySnapshot + */ + + BuiltInAction["ApplySnapshot"] = "$$applySnapshot"; + /** + * detach + */ + + BuiltInAction["Detach"] = "$$detach"; + /** + * applySet + */ + + BuiltInAction["ApplySet"] = "$$applySet"; + /** + * applyDelete + */ + + BuiltInAction["ApplyDelete"] = "$$applyDelete"; + /** + * applyMethodCall + */ + + BuiltInAction["ApplyMethodCall"] = "$$applyMethodCall"; +})(BuiltInAction || (BuiltInAction = {})); + +var builtInActionValues = /*#__PURE__*/new Set( /*#__PURE__*/Object.values(BuiltInAction)); +/** + * Returns if a given action name is a built-in action, this is, one of: + * - applyPatches() + * - applySnapshot() + * - detach() + * + * @param actionName Action name to check. + * @returns true if it is a built-in action, false otherwise. + */ + +function isBuiltInAction(actionName) { + return builtInActionValues.has(actionName); +} + +/** + * Detaches a given object from a tree. + * If the parent is an object / model, detaching will delete the property. + * If the parent is an array detaching will remove the node by splicing it. + * If there's no parent it will throw. + * + * @param node Object to be detached. + */ + +function detach(node) { + assertTweakedObject(node, "node"); + wrappedInternalDetach().call(node); +} +var wrappedInternalDetach = /*#__PURE__*/lazy(function () { + return wrapInAction({ + name: BuiltInAction.Detach, + fn: internalDetach, + actionType: ActionContextActionType.Sync + }); +}); + +function internalDetach() { + var node = this; + var parentPath = fastGetParentPathIncludingDataObjects(node); + if (!parentPath) return; + var parent = parentPath.parent, + path = parentPath.path; + + if ((0,mobx_esm.isObservableArray)(parent)) { + parent.splice(+path, 1); + } else if ((0,mobx_esm.isObservableObject)(parent)) { + (0,mobx_esm.remove)(parent, "" + path); + } else { + throw failure("parent must be an observable object or an observable array"); + } +} + +/** + * Returns all the children objects (this is, excluding primitives) of an object. + * + * @param node Object to get the list of children from. + * @param [options] An optional object with the `deep` option (defaults to false) to true to get + * the children deeply or false to get them shallowly. + * @returns A readonly observable set with the children. + */ + +function getChildrenObjects(node, options) { + assertTweakedObject(node, "node"); + + if (!options || !options.deep) { + return getObjectChildren(node); + } else { + return getDeepObjectChildren(node).deep; + } +} + +/** + * Runs a callback everytime a new object is attached to a given node. + * The callback can optionally return a disposer which will be run when the child is detached. + * + * The optional options parameter accepts and object with the following options: + * - `deep: boolean` (default: `false`) - true if the callback should be run for all children deeply + * or false if it it should only run for shallow children. + * - `fireForCurrentChildren: boolean` (default: `true`) - true if the callback should be immediately + * called for currently attached children, false if only for future attachments. + * + * Returns a disposer, which has a boolean parameter which should be true if pending detachment + * callbacks should be run or false otherwise. + * + * @param target Function that returns the object whose children should be tracked. + * @param fn Callback called when a child is attached to the target object. + * @param [options] + * @returns + */ + +function onChildAttachedTo(target, fn, options) { + assertIsFunction(target, "target"); + assertIsFunction(fn, "fn"); + + var opts = _extends({ + deep: false, + runForCurrentChildren: true + }, options); + + var detachDisposers = new WeakMap(); + + var runDetachDisposer = function runDetachDisposer(n) { + var detachDisposer = detachDisposers.get(n); + + if (detachDisposer) { + detachDisposers["delete"](n); + detachDisposer(); + } + }; + + var addDetachDisposer = function addDetachDisposer(n, disposer) { + if (disposer) { + detachDisposers.set(n, disposer); + } + }; + + var getChildrenObjectOpts = { + deep: opts.deep + }; + + var getCurrentChildren = function getCurrentChildren() { + var t = target(); + assertTweakedObject(t, "target()"); + var children = getChildrenObjects(t, getChildrenObjectOpts); + var set = new Set(); + var iter = children.values(); + var cur = iter.next(); + + while (!cur.done) { + set.add(cur.value); + cur = iter.next(); + } + + return set; + }; + + var currentChildren = opts.runForCurrentChildren ? new Set() : getCurrentChildren(); + var disposer = (0,mobx_esm.reaction)(function () { + return getCurrentChildren(); + }, function (newChildren) { + var disposersToRun = []; // find dead + + var currentChildrenIter = currentChildren.values(); + var currentChildrenCur = currentChildrenIter.next(); + + while (!currentChildrenCur.done) { + var n = currentChildrenCur.value; + + if (!newChildren.has(n)) { + currentChildren["delete"](n); // we should run it in inverse order + + disposersToRun.push(n); + } + + currentChildrenCur = currentChildrenIter.next(); + } + + if (disposersToRun.length > 0) { + for (var i = disposersToRun.length - 1; i >= 0; i--) { + runDetachDisposer(disposersToRun[i]); + } + } // find new + + + var newChildrenIter = newChildren.values(); + var newChildrenCur = newChildrenIter.next(); + + while (!newChildrenCur.done) { + var _n = newChildrenCur.value; + + if (!currentChildren.has(_n)) { + currentChildren.add(_n); + addDetachDisposer(_n, fn(_n)); + } + + newChildrenCur = newChildrenIter.next(); + } + }, { + fireImmediately: true + }); + return function (runDetachDisposers) { + disposer(); + + if (runDetachDisposers) { + var currentChildrenIter = currentChildren.values(); + var currentChildrenCur = currentChildrenIter.next(); + + while (!currentChildrenCur.done) { + var n = currentChildrenCur.value; + runDetachDisposer(n); + currentChildrenCur = currentChildrenIter.next(); + } + } + + currentChildren.clear(); + }; +} + +/** + * Deserializers a data structure from its snapshot form. + * + * @typeparam T Object type. + * @param snapshot Snapshot, even if a primitive. + * @param [options] Options. + * @returns The deserialized object. + */ + +var fromSnapshot = function fromSnapshot(snapshot, options) { + var opts = _extends({ + generateNewIds: false, + overrideRootModelId: undefined + }, options); + + var ctx = { + options: opts + }; + ctx.snapshotToInitialData = snapshotToInitialData.bind(undefined, ctx); + return internalFromSnapshot(snapshot, ctx); +}; +fromSnapshot = /*#__PURE__*/(0,mobx_esm.action)("fromSnapshot", fromSnapshot); + +function internalFromSnapshot(sn, ctx) { + if (isPrimitive(sn)) { + return sn; + } + + if (isMap(sn)) { + throw failure("a snapshot must not contain maps"); + } + + if (isSet(sn)) { + throw failure("a snapshot must not contain sets"); + } + + if (isArray(sn)) { + return fromArraySnapshot(sn, ctx); + } + + if (isFrozenSnapshot(sn)) { + return frozen(sn.data); + } + + if (isModelSnapshot(sn)) { + return fromModelSnapshot(sn, ctx); + } + + if (isPlainObject(sn)) { + return fromPlainObjectSnapshot(sn, ctx); + } + + throw failure("unsupported snapshot - " + sn); +} + +function fromArraySnapshot(sn, ctx) { + var arr = mobx_esm.observable.array([], observableOptions); + var ln = sn.length; + + for (var i = 0; i < ln; i++) { + arr.push(internalFromSnapshot(sn[i], ctx)); + } + + return tweakArray(arr, undefined, true); +} + +function fromModelSnapshot(sn, ctx) { + var type = sn[modelTypeKey]; + + if (!type) { + throw failure("a model snapshot must contain a type key (" + modelTypeKey + "), but none was found"); + } + + var modelInfo = getModelInfoForName(type); + + if (!modelInfo) { + throw failure("model with name \"" + type + "\" not found in the registry"); + } + + if (!sn[modelIdKey]) { + throw failure("a model snapshot must contain an id key (" + modelIdKey + "), but none was found"); + } + + return new modelInfo["class"](undefined, { + snapshotInitialData: { + unprocessedSnapshot: sn, + snapshotToInitialData: ctx.snapshotToInitialData + }, + generateNewIds: ctx.options.generateNewIds + }); +} + +function snapshotToInitialData(ctx, processedSn) { + var initialData = mobx_esm.observable.object({}, undefined, observableOptions); + var processedSnKeys = Object.keys(processedSn); + var processedSnKeysLen = processedSnKeys.length; + + for (var i = 0; i < processedSnKeysLen; i++) { + var k = processedSnKeys[i]; + + if (!isReservedModelKey(k)) { + var v = processedSn[k]; + (0,mobx_esm.set)(initialData, k, internalFromSnapshot(v, ctx)); + } + } + + return initialData; +} + +function fromPlainObjectSnapshot(sn, ctx) { + var plainObj = mobx_esm.observable.object({}, undefined, observableOptions); + var snKeys = Object.keys(sn); + var snKeysLen = snKeys.length; + + for (var i = 0; i < snKeysLen; i++) { + var k = snKeys[i]; + var v = sn[k]; + (0,mobx_esm.set)(plainObj, k, internalFromSnapshot(v, ctx)); + } + + return tweakPlainObject(plainObj, undefined, undefined, true, false); +} + +var observableOptions = { + deep: false +}; + +/** + * @ignore + */ + +function reconcileSnapshot(value, sn, modelPool) { + if (isPrimitive(sn)) { + return sn; + } + + if (isArray(sn)) { + return reconcileArraySnapshot(value, sn, modelPool); + } + + if (isFrozenSnapshot(sn)) { + return reconcileFrozenSnapshot(value, sn); + } + + if (isModelSnapshot(sn)) { + return reconcileModelSnapshot(value, sn, modelPool); + } + + if (isPlainObject(sn)) { + return reconcilePlainObjectSnapshot(value, sn, modelPool); + } + + if (isMap(sn)) { + throw failure("a snapshot must not contain maps"); + } + + if (isSet(sn)) { + throw failure("a snapshot must not contain sets"); + } + + throw failure("unsupported snapshot - " + sn); +} + +function reconcileArraySnapshot(value, sn, modelPool) { + if (!isArray(value)) { + // no reconciliation possible + return fromSnapshot(sn); + } // remove excess items + + + if (value.length > sn.length) { + value.splice(sn.length, value.length - sn.length); + } // reconcile present items + + + for (var i = 0; i < value.length; i++) { + var oldValue = value[i]; + var newValue = reconcileSnapshot(oldValue, sn[i], modelPool); + detachIfNeeded(newValue, oldValue, modelPool); + (0,mobx_esm.set)(value, i, newValue); + } // add excess items + + + for (var _i = value.length; _i < sn.length; _i++) { + value.push(reconcileSnapshot(undefined, sn[_i], modelPool)); + } + + return value; +} + +function reconcileFrozenSnapshot(value, sn) { + // reconciliation is only possible if the target is a Frozen instance with the same data (by ref) + // in theory we could compare the JSON representation of both datas or do a deep comparison, but that'd be too slow + if (value instanceof Frozen && value.data === sn.data) { + return value; + } + + return frozen(sn.data); +} + +function reconcileModelSnapshot(value, sn, modelPool) { + var type = sn[modelTypeKey]; + var modelInfo = getModelInfoForName(type); + + if (!modelInfo) { + throw failure("model with name \"" + type + "\" not found in the registry"); + } + + var id = sn[modelIdKey]; // try to use model from pool if possible + + var modelInPool = modelPool.findModelForSnapshot(sn); + + if (modelInPool) { + value = modelInPool; + } + + if (!(value instanceof modelInfo["class"]) || value[modelTypeKey] !== type || value[modelIdKey] !== id) { + // different kind of model / model instance, no reconciliation possible + return fromSnapshot(sn); + } + + var modelObj = value; + var processedSn = sn; + + if (modelObj.fromSnapshot) { + processedSn = modelObj.fromSnapshot(sn); + } + + var data = modelObj.$; // remove excess props + + var dataKeys = Object.keys(data); + var dataKeysLen = dataKeys.length; + + for (var i = 0; i < dataKeysLen; i++) { + var k = dataKeys[i]; + + if (!(k in processedSn)) { + (0,mobx_esm.remove)(data, k); + } + } // reconcile the rest + + + var processedSnKeys = Object.keys(processedSn); + var processedSnKeysLen = processedSnKeys.length; + + for (var _i2 = 0; _i2 < processedSnKeysLen; _i2++) { + var _k = processedSnKeys[_i2]; + + if (!isReservedModelKey(_k)) { + var v = processedSn[_k]; + var oldValue = data[_k]; + var newValue = reconcileSnapshot(oldValue, v, modelPool); + detachIfNeeded(newValue, oldValue, modelPool); + (0,mobx_esm.set)(data, _k, newValue); + } + } + + return modelObj; +} + +function reconcilePlainObjectSnapshot(value, sn, modelPool) { + // plain obj + if (!isPlainObject(value) && !(0,mobx_esm.isObservableObject)(value)) { + // no reconciliation possible + return fromSnapshot(sn); + } + + var plainObj = value; // remove excess props + + var plainObjKeys = Object.keys(plainObj); + var plainObjKeysLen = plainObjKeys.length; + + for (var i = 0; i < plainObjKeysLen; i++) { + var k = plainObjKeys[i]; + + if (!(k in sn)) { + (0,mobx_esm.remove)(plainObj, k); + } + } // reconcile the rest + + + var snKeys = Object.keys(sn); + var snKeysLen = snKeys.length; + + for (var _i3 = 0; _i3 < snKeysLen; _i3++) { + var _k2 = snKeys[_i3]; + var v = sn[_k2]; + var oldValue = plainObj[_k2]; + var newValue = reconcileSnapshot(oldValue, v, modelPool); + detachIfNeeded(newValue, oldValue, modelPool); + (0,mobx_esm.set)(plainObj, _k2, newValue); + } + + return plainObj; +} + +function detachIfNeeded(newValue, oldValue, modelPool) { + // edge case for when we are swapping models around the tree + if (newValue === oldValue) { + // already where it should be + return; + } + + if (isModel(newValue) && modelPool.findModelByTypeAndId(newValue[modelTypeKey], newValue[modelIdKey])) { + var parentPath = fastGetParentPathIncludingDataObjects(newValue); + + if (parentPath) { + (0,mobx_esm.set)(parentPath.parent, parentPath.path, null); + } + } +} + +var ModelPool = /*#__PURE__*/function () { + function ModelPool(root) { + var _dataObjectParent$get; + + this.pool = void 0; + // make sure we don't use the sub-data $ object + root = (_dataObjectParent$get = dataObjectParent.get(root)) != null ? _dataObjectParent$get : root; + this.pool = getDeepObjectChildren(root).deepByModelTypeAndId; + } + + var _proto = ModelPool.prototype; + + _proto.findModelByTypeAndId = function findModelByTypeAndId(modelType, modelId) { + return this.pool.get(byModelTypeAndIdKey(modelType, modelId)); + }; + + _proto.findModelForSnapshot = function findModelForSnapshot(sn) { + if (!isModelSnapshot(sn)) { + return undefined; + } + + return this.findModelByTypeAndId(sn[modelTypeKey], sn[modelIdKey]); + }; + + return ModelPool; +}(); + +/** + * Applies the given patches to the given target object. + * + * @param node Target object. + * @param patches List of patches to apply. + * @param reverse Whether patches are applied in reverse order. + */ + +function applyPatches(node, patches, reverse) { + if (reverse === void 0) { + reverse = false; + } + + assertTweakedObject(node, "node"); + + if (patches.length <= 0) { + return; + } + + wrappedInternalApplyPatches().call(node, patches, reverse); +} +/** + * @ignore + * @internal + */ + +function internalApplyPatches(patches, reverse) { + if (reverse === void 0) { + reverse = false; + } + + var obj = this; + var modelPool = new ModelPool(obj); + + if (reverse) { + var i = patches.length; + + while (i--) { + var p = patches[i]; + + if (!isArray(p)) { + applySinglePatch(obj, p, modelPool); + } else { + var j = p.length; + + while (j--) { + applySinglePatch(obj, p[j], modelPool); + } + } + } + } else { + var len = patches.length; + + for (var _i = 0; _i < len; _i++) { + var _p = patches[_i]; + + if (!isArray(_p)) { + applySinglePatch(obj, _p, modelPool); + } else { + var len2 = _p.length; + + for (var _j = 0; _j < len2; _j++) { + applySinglePatch(obj, _p[_j], modelPool); + } + } + } + } +} +var wrappedInternalApplyPatches = /*#__PURE__*/lazy(function () { + return wrapInAction({ + name: BuiltInAction.ApplyPatches, + fn: internalApplyPatches, + actionType: ActionContextActionType.Sync + }); +}); + +function applySinglePatch(obj, patch, modelPool) { + var _pathArrayToObjectAnd = pathArrayToObjectAndProp(obj, patch.path), + target = _pathArrayToObjectAnd.target, + prop = _pathArrayToObjectAnd.prop; + + if (isArray(target)) { + switch (patch.op) { + case "add": + { + var index = +prop; // reconcile from the pool if possible + + var newValue = reconcileSnapshot(undefined, patch.value, modelPool); + target.splice(index, 0, newValue); + break; + } + + case "remove": + { + var _index = +prop; // no reconciliation, removing + + + target.splice(_index, 1); + break; + } + + case "replace": + { + if (prop === "length") { + target.length = patch.value; + } else { + var _index2 = +prop; // try to reconcile + + + var _newValue = reconcileSnapshot(target[_index2], patch.value, modelPool); + + (0,mobx_esm.set)(target, _index2, _newValue); + } + + break; + } + + default: + throw failure("unsupported patch operation: " + patch.op); + } + } else { + switch (patch.op) { + case "add": + { + // reconcile from the pool if possible + var _newValue2 = reconcileSnapshot(undefined, patch.value, modelPool); + + (0,mobx_esm.set)(target, prop, _newValue2); + break; + } + + case "remove": + { + // no reconciliation, removing + (0,mobx_esm.remove)(target, prop); + break; + } + + case "replace": + { + // try to reconcile + // we don't need to tweak the pool since reconcileSnapshot will do that for us + var _newValue3 = reconcileSnapshot(target[prop], patch.value, modelPool); + + (0,mobx_esm.set)(target, prop, _newValue3); + break; + } + + default: + throw failure("unsupported patch operation: " + patch.op); + } + } +} + +function pathArrayToObjectAndProp(obj, path) { + if (inDevMode()) { + if (!isArray(path)) { + throw failure("invalid path: " + path); + } + } + + var target = modelToDataNode(obj); + + if (path.length === 0) { + return { + target: target + }; + } + + for (var i = 0; i <= path.length - 2; i++) { + target = modelToDataNode(target[path[i]]); + } + + return { + target: target, + prop: path[path.length - 1] + }; +} + +/** + * @ignore + * @internal + */ + +function runTypeCheckingAfterChange(obj, patchRecorder) { + // invalidate type check cached result + invalidateCachedTypeCheckerResult(obj); + + if (isModelAutoTypeCheckingEnabled()) { + var parentModelWithTypeChecker = findNearestParentModelWithTypeChecker(obj); + + if (parentModelWithTypeChecker) { + var err = parentModelWithTypeChecker.typeCheck(); + + if (err) { + // quietly apply inverse patches (do not generate patches, snapshots, actions, etc) + runWithoutSnapshotOrPatches(function () { + internalApplyPatches.call(obj, patchRecorder.invPatches, true); + }); // at the end of apply patches it will be type checked again and its result cached once more + + err["throw"](parentModelWithTypeChecker); + } + } + } +} +/** + * @ignore + * + * Finds the closest parent model that has a type checker defined. + * + * @param child + * @returns + */ + +function findNearestParentModelWithTypeChecker(child) { + // child might be .$, so we need to check the parent model in that case + var actualChild = dataToModelNode(child); + + if (child !== actualChild) { + child = actualChild; + + if (isModel(child) && !!getModelDataType(child)) { + return child; + } + } + + return findParent(child, function (parent) { + return isModel(parent) && !!getModelDataType(parent); + }); +} + +/** + * @ignore + */ + +function tweakArray(value, parentPath, doNotTweakChildren) { + var originalArr = value; + var arrLn = originalArr.length; + var tweakedArr = (0,mobx_esm.isObservableArray)(originalArr) ? originalArr : mobx_esm.observable.array([], observableOptions$1); + + if (tweakedArr !== originalArr) { + tweakedArr.length = originalArr.length; + } + + var interceptDisposer; + var observeDisposer; + + var untweak = function untweak() { + interceptDisposer(); + observeDisposer(); + }; + + tweakedObjects.set(tweakedArr, untweak); + setParent(tweakedArr, parentPath, false, false); + var standardSn = []; + standardSn.length = arrLn; // substitute initial values by proxied values + + for (var i = 0; i < arrLn; i++) { + var v = originalArr[i]; + + if (isPrimitive(v)) { + if (!doNotTweakChildren) { + (0,mobx_esm.set)(tweakedArr, i, v); + } + + standardSn[i] = v; + } else { + var path = { + parent: tweakedArr, + path: i + }; + var tweakedValue = void 0; + + if (doNotTweakChildren) { + tweakedValue = v; + setParent(tweakedValue, path, false, false); + } else { + tweakedValue = tweak(v, path); + (0,mobx_esm.set)(tweakedArr, i, tweakedValue); + } + + var valueSn = getInternalSnapshot(tweakedValue); + standardSn[i] = valueSn.standard; + } + } + + setInternalSnapshot(tweakedArr, standardSn); + interceptDisposer = (0,mobx_esm.intercept)(tweakedArr, interceptArrayMutation.bind(undefined, tweakedArr)); + observeDisposer = (0,mobx_esm.observe)(tweakedArr, arrayDidChange); + return tweakedArr; +} + +function arrayDidChange(change +/*IArrayDidChange*/ +) { + var arr = change.object; + + var _getInternalSnapshot = getInternalSnapshot(arr), + oldSnapshot = _getInternalSnapshot.standard; + + var patchRecorder = new InternalPatchRecorder(); + var newSnapshot = oldSnapshot.slice(); + + switch (change.type) { + case "splice": + { + var index = change.index; + var addedCount = change.addedCount; + var removedCount = change.removedCount; + var addedItems = []; + addedItems.length = addedCount; + + for (var i = 0; i < addedCount; i++) { + var v = change.added[i]; + + if (isPrimitive(v)) { + addedItems[i] = v; + } else { + addedItems[i] = getInternalSnapshot(v).standard; + } + } + + var oldLen = oldSnapshot.length; + newSnapshot.splice.apply(newSnapshot, [index, removedCount].concat(addedItems)); + var patches = []; + var invPatches = []; // optimization: if we add as many as we remove then replace instead + + if (addedCount === removedCount) { + for (var _i = 0; _i < addedCount; _i++) { + var realIndex = index + _i; + var newVal = newSnapshot[realIndex]; + var oldVal = oldSnapshot[realIndex]; + + if (newVal !== oldVal) { + var path = [realIndex]; // replace 0, 1, 2... + + patches.push({ + op: "replace", + path: path, + value: newVal + }); // replace ...2, 1, 0 since inverse patches are applied in reverse + + invPatches.push({ + op: "replace", + path: path, + value: oldVal + }); + } + } + } else { + var interimLen = oldLen - removedCount; // first remove items + + if (removedCount > 0) { + // optimization, when removing from the end set the length instead + var removeUsingSetLength = index >= interimLen; + + if (removeUsingSetLength) { + patches.push({ + op: "replace", + path: ["length"], + value: interimLen + }); + } + + for (var _i2 = removedCount - 1; _i2 >= 0; _i2--) { + var _realIndex = index + _i2; + + var _path = [_realIndex]; + + if (!removeUsingSetLength) { + // remove ...2, 1, 0 + patches.push({ + op: "remove", + path: _path + }); + } // add 0, 1, 2... since inverse patches are applied in reverse + + + invPatches.push({ + op: "add", + path: _path, + value: oldSnapshot[_realIndex] + }); + } + } // then add items + + + if (addedCount > 0) { + // optimization, for inverse patches, when adding from the end set the length to restore instead + var restoreUsingSetLength = index >= interimLen; + + if (restoreUsingSetLength) { + invPatches.push({ + op: "replace", + path: ["length"], + value: interimLen + }); + } + + for (var _i3 = 0; _i3 < addedCount; _i3++) { + var _realIndex2 = index + _i3; + + var _path2 = [_realIndex2]; // add 0, 1, 2... + + patches.push({ + op: "add", + path: _path2, + value: newSnapshot[_realIndex2] + }); // remove ...2, 1, 0 since inverse patches are applied in reverse + + if (!restoreUsingSetLength) { + invPatches.push({ + op: "remove", + path: _path2 + }); + } + } + } + } + + patchRecorder.record(patches, invPatches); + } + break; + + case "update": + { + var k = change.index; + var val = change.newValue; + var _oldVal = newSnapshot[k]; + + if (isPrimitive(val)) { + newSnapshot[k] = val; + } else { + var valueSn = getInternalSnapshot(val); + newSnapshot[k] = valueSn.standard; + } + + var _path3 = [k]; + patchRecorder.record([{ + op: "replace", + path: _path3, + value: newSnapshot[k] + }], [{ + op: "replace", + path: _path3, + value: _oldVal + }]); + } + break; + } + + runTypeCheckingAfterChange(arr, patchRecorder); + + if (!runningWithoutSnapshotOrPatches) { + setInternalSnapshot(arr, newSnapshot); + patchRecorder.emit(arr); + } +} + +var undefinedInsideArrayErrorMsg = "undefined is not supported inside arrays since it is not serializable in JSON, consider using null instead"; // TODO: remove array parameter and just use change.object once mobx update event is fixed + +function interceptArrayMutation(array, change) { + assertCanWrite(); + + switch (change.type) { + case "splice": + { + if (inDevMode() && !getGlobalConfig().allowUndefinedArrayElements) { + var len = change.added.length; + + for (var i = 0; i < len; i++) { + var v = change.added[i]; + + if (v === undefined) { + throw failure(undefinedInsideArrayErrorMsg); + } + } + } + + for (var _i4 = 0; _i4 < change.removedCount; _i4++) { + var removedValue = change.object[change.index + _i4]; + tweak(removedValue, undefined); + tryUntweak(removedValue); + } + + for (var _i5 = 0; _i5 < change.added.length; _i5++) { + change.added[_i5] = tweak(change.added[_i5], { + parent: change.object, + path: change.index + _i5 + }); + } // we might also need to update the parent of the next indexes + + + var oldNextIndex = change.index + change.removedCount; + var newNextIndex = change.index + change.added.length; + + if (oldNextIndex !== newNextIndex) { + for (var _i6 = oldNextIndex, j = newNextIndex; _i6 < change.object.length; _i6++, j++) { + setParent(change.object[_i6], { + parent: change.object, + path: j + }, true, false); + } + } + } + break; + + case "update": + if (inDevMode() && !getGlobalConfig().allowUndefinedArrayElements && change.newValue === undefined) { + throw failure(undefinedInsideArrayErrorMsg); + } // TODO: should be change.object, but mobx is bugged and doesn't send the proxy + + + var oldVal = array[change.index]; + tweak(oldVal, undefined); // set old prop obj parent to undefined + + tryUntweak(oldVal); + change.newValue = tweak(change.newValue, { + parent: array, + path: change.index + }); + break; + } + + return change; +} + +var observableOptions$1 = { + deep: false +}; + +/** + * @ingore + */ + +function tweakFrozen(frozenObj, parentPath) { + var _setInternalSnapshot; + + tweakedObjects.set(frozenObj, undefined); + setParent(frozenObj, parentPath, false, false); // we DON'T want data proxified, but the snapshot is the data itself + + setInternalSnapshot(frozenObj, (_setInternalSnapshot = {}, _setInternalSnapshot[frozenKey] = true, _setInternalSnapshot.data = frozenObj.data, _setInternalSnapshot)); + return frozenObj; +} + +/** + * Turns an object (array, plain object) into a tree node, + * which then can accept calls to `getParent`, `getSnapshot`, etc. + * If a tree node is passed it will return the passed argument directly. + * + * @param value Object to turn into a tree node. + * @returns The object as a tree node. + */ + +function toTreeNode(value) { + if (!isObject(value)) { + throw failure("only objects can be turned into tree nodes"); + } + + if (!isTweakedObject(value, true)) { + return tweak(value, undefined); + } + + return value; +} +/** + * @ignore + */ + +function internalTweak(value, parentPath) { + if (isPrimitive(value)) { + return value; + } + + if (isTweakedObject(value, true)) { + setParent(value, parentPath, false, false); + return value; + } + + if (isModel(value)) { + return tweakModel(value, parentPath); + } + + if (isArray(value)) { + return tweakArray(value, parentPath, false); + } // plain object + + + if ((0,mobx_esm.isObservableObject)(value) || isPlainObject(value)) { + return tweakPlainObject(value, parentPath, undefined, false, false); + } + + if (value instanceof Frozen) { + return tweakFrozen(value, parentPath); + } // unsupported + + + if (isMap(value)) { + throw failure("maps are not directly supported. consider applying 'transformObjectAsMap' over a '{[k: string]: V}' property, or 'transformArrayAsMap' over a '[string, V][]' property instead."); + } // unsupported + + + if (isSet(value)) { + throw failure("sets are not directly supported. consider applying 'transformArrayAsSet' over a 'V[]' property instead."); + } + + throw failure("tweak can only work over models, observable objects/arrays, or primitives, but got " + value + " instead"); +} +/** + * @ignore + * @internal + */ + + +var tweak = /*#__PURE__*/(0,mobx_esm.action)("tweak", internalTweak); +/** + * @ignore + * @internal + */ + +function tryUntweak(value) { + if (isPrimitive(value)) { + return true; + } + + if (inDevMode()) { + if (fastGetParent(value)) { + throw failure("assertion error: object cannot be untweaked while it has a parent"); + } + } + + var untweaker = tweakedObjects.get(value); + + if (!untweaker) { + return false; + } // we have to make a copy since it will be changed + // we have to iterate ourselves since it seems like babel does not do downlevel iteration + + + var children = []; + var childrenIter = getObjectChildren(value).values(); + var childrenCur = childrenIter.next(); + + while (!childrenCur.done) { + children.push(childrenCur.value); + childrenCur = childrenIter.next(); + } + + for (var i = 0; i < children.length; i++) { + var v = children[i]; + setParent(v, undefined, false, false); + } + + untweaker(); + tweakedObjects["delete"](value); + unsetInternalSnapshot(value); + return true; +} + +/** + * @ignore + */ + +function tweakPlainObject(value, parentPath, snapshotModelType, doNotTweakChildren, isDataObject) { + var originalObj = value; + var tweakedObj = (0,mobx_esm.isObservableObject)(originalObj) ? originalObj : mobx_esm.observable.object({}, undefined, observableOptions$2); + var interceptDisposer; + var observeDisposer; + + var untweak = function untweak() { + interceptDisposer(); + observeDisposer(); + }; + + tweakedObjects.set(tweakedObj, untweak); + setParent(tweakedObj, parentPath, false, isDataObject); + var standardSn = {}; // substitute initial values by tweaked values + + var originalObjKeys = Object.keys(originalObj); + var originalObjKeysLen = originalObjKeys.length; + + for (var i = 0; i < originalObjKeysLen; i++) { + var k = originalObjKeys[i]; + var v = originalObj[k]; + + if (isPrimitive(v)) { + if (!doNotTweakChildren) { + (0,mobx_esm.set)(tweakedObj, k, v); + } + + standardSn[k] = v; + } else { + var path = { + parent: tweakedObj, + path: k + }; + var tweakedValue = void 0; + + if (doNotTweakChildren) { + tweakedValue = v; + setParent(tweakedValue, path, false, false); + } else { + tweakedValue = tweak(v, path); + (0,mobx_esm.set)(tweakedObj, k, tweakedValue); + } + + var valueSn = getInternalSnapshot(tweakedValue); + standardSn[k] = valueSn.standard; + } + } + + if (snapshotModelType) { + standardSn[modelTypeKey] = snapshotModelType; + } + + setInternalSnapshot(isDataObject ? dataToModelNode(tweakedObj) : tweakedObj, standardSn); + interceptDisposer = (0,mobx_esm.intercept)(tweakedObj, interceptObjectMutation); + observeDisposer = (0,mobx_esm.observe)(tweakedObj, objectDidChange); + return tweakedObj; +} +var observableOptions$2 = { + deep: false +}; + +function objectDidChange(change) { + var obj = change.object; + var actualNode = dataToModelNode(obj); + + var _getInternalSnapshot = getInternalSnapshot(actualNode), + standardSn = _getInternalSnapshot.standard; + + var patchRecorder = new InternalPatchRecorder(); + standardSn = Object.assign({}, standardSn); + + switch (change.type) { + case "add": + case "update": + { + var k = change.name; + var val = change.newValue; + var oldVal = standardSn[k]; + + if (isPrimitive(val)) { + standardSn[k] = val; + } else { + var valueSn = getInternalSnapshot(val); + standardSn[k] = valueSn.standard; + } + + var path = [k]; + + if (change.type === "add") { + patchRecorder.record([{ + op: "add", + path: path, + value: standardSn[k] + }], [{ + op: "remove", + path: path + }]); + } else { + patchRecorder.record([{ + op: "replace", + path: path, + value: standardSn[k] + }], [{ + op: "replace", + path: path, + value: oldVal + }]); + } + } + break; + + case "remove": + { + var _k = change.name; + var _oldVal = standardSn[_k]; + delete standardSn[_k]; + var _path = [_k]; + patchRecorder.record([{ + op: "remove", + path: _path + }], [{ + op: "add", + path: _path, + value: _oldVal + }]); + } + break; + } + + runTypeCheckingAfterChange(obj, patchRecorder); + + if (!runningWithoutSnapshotOrPatches) { + setInternalSnapshot(actualNode, standardSn); + patchRecorder.emit(actualNode); + } +} + +function interceptObjectMutation(change) { + assertCanWrite(); + + if (typeof change.name === "symbol") { + throw failure("symbol properties are not supported"); + } + + switch (change.type) { + case "add": + change.newValue = tweak(change.newValue, { + parent: change.object, + path: "" + change.name + }); + break; + + case "remove": + { + var oldVal = change.object[change.name]; + tweak(oldVal, undefined); + tryUntweak(oldVal); + break; + } + + case "update": + { + var _oldVal2 = change.object[change.name]; + tweak(_oldVal2, undefined); + tryUntweak(_oldVal2); + change.newValue = tweak(change.newValue, { + parent: change.object, + path: "" + change.name + }); + break; + } + } + + return change; +} + +/** + * @internal + * @ignore + */ +var modelInitializersSymbol = /*#__PURE__*/Symbol("modelInitializers"); +/** + * @internal + * @ignore + */ + +function addModelClassInitializer(modelClass, init) { + var initializers = modelClass[modelInitializersSymbol]; + + if (!initializers) { + initializers = []; + modelClass[modelInitializersSymbol] = initializers; + } + + initializers.push(init); +} +/** + * @internal + * @ignore + */ + +function getModelClassInitializers(modelClass) { + return modelClass[modelInitializersSymbol]; +} + +/** + * @ignore + * @internal + */ + +var internalNewModel = /*#__PURE__*/(0,mobx_esm.action)("newModel", function (origModelObj, initialData, options) { + var _modelClass = options.modelClass, + snapshotInitialData = options.snapshotInitialData, + generateNewIds = options.generateNewIds; + var modelClass = _modelClass; + + if (inDevMode()) { + assertIsModelClass(modelClass, "modelClass"); + } + + var modelObj = origModelObj; + var modelInfo = modelInfoByClass.get(modelClass); + + if (!modelInfo) { + throw failure("no model info for class " + modelClass.name + " could be found - did you forget to add the @model decorator?"); + } + + var id; + + if (snapshotInitialData) { + var sn = snapshotInitialData.unprocessedSnapshot; + + if (generateNewIds) { + id = getGlobalConfig().modelIdGenerator(); + } else { + id = sn[modelIdKey]; + } + + if (modelObj.fromSnapshot) { + sn = modelObj.fromSnapshot(sn); + } + + initialData = snapshotInitialData.snapshotToInitialData(sn); + } else { + // use symbol if provided + if (initialData[modelIdKey]) { + id = initialData[modelIdKey]; + } else { + id = getGlobalConfig().modelIdGenerator(); + } + } + + modelObj[modelTypeKey] = modelInfo.name; // fill in defaults in initial data + + var modelProps = getInternalModelClassPropsInfo(modelClass); + var modelPropsKeys = Object.keys(modelProps); + + for (var i = 0; i < modelPropsKeys.length; i++) { + var k = modelPropsKeys[i]; + var v = initialData[k]; + + if (v === undefined || v === null) { + var newValue = v; + var propData = modelProps[k]; + + if (propData.defaultFn !== noDefaultValue) { + newValue = propData.defaultFn(); + } else if (propData.defaultValue !== noDefaultValue) { + newValue = propData.defaultValue; + } + + (0,mobx_esm.set)(initialData, k, newValue); + } + } + + (0,mobx_esm.set)(initialData, modelIdKey, id); + tweakModel(modelObj, undefined); // create observable data object with initial data + + var obsData = tweakPlainObject(initialData, { + parent: modelObj, + path: "$" + }, modelObj[modelTypeKey], false, true); // hide $.$modelId + + Object.defineProperty(obsData, modelIdKey, _extends({}, Object.getOwnPropertyDescriptor(obsData, modelIdKey), { + enumerable: false + })); // link it, and make it readonly + + modelObj.$ = obsData; + + if (inDevMode()) { + makePropReadonly(modelObj, "$", true); + } // type check it if needed + + + if (isModelAutoTypeCheckingEnabled() && getModelDataType(modelClass)) { + var err = modelObj.typeCheck(); + + if (err) { + err["throw"](modelObj); + } + } // run any extra initializers for the class as needed + + + var initializers = getModelClassInitializers(modelClass); + + if (initializers) { + var len = initializers.length; + + for (var _i = 0; _i < len; _i++) { + var init = initializers[_i]; + init(modelObj); + } + } + + return modelObj; +}); + +/** + * @ignore + */ + +var propsDataTypeSymbol = /*#__PURE__*/Symbol(); +/** + * @ignore + */ + +var propsCreationDataTypeSymbol = /*#__PURE__*/Symbol(); +/** + * @ignore + */ + +var instanceDataTypeSymbol = /*#__PURE__*/Symbol(); +/** + * @ignore + */ + +var instanceCreationDataTypeSymbol = /*#__PURE__*/Symbol(); +/** + * @ignore + * @internal + */ + +var modelInitializedSymbol = /*#__PURE__*/Symbol("modelInitialized"); +/** + * Base abstract class for models. Use `Model` instead when extending. + * + * Never override the constructor, use `onInit` or `onAttachedToRootStore` instead. + * + * @typeparam Data Data type. + * @typeparam CreationData Creation data type. + */ + +var BaseModel = /*#__PURE__*/function () { + var _proto = BaseModel.prototype; + + // just to make typing work properly + + /** + * Model type name. + */ + + /** + * Model internal id. Can be modified inside a model action. + */ + + /** + * Can be overriden to offer a reference id to be used in reference resolution. + * By default it will use `$modelId`. + */ + _proto.getRefId = function getRefId() { + return this[modelIdKey]; + } + /** + * Data part of the model, which is observable and will be serialized in snapshots. + * Use it if one of the data properties matches one of the model properties/functions. + * This also allows access to the backed values of transformed properties. + */ + ; + + /** + * Performs a type check over the model instance. + * For this to work a data type has to be declared in the model decorator. + * + * @returns A `TypeCheckError` or `null` if there is no error. + */ + _proto.typeCheck = function typeCheck$1() { + var type = typesModel(this.constructor); + return typeCheck(type, this); + } + /** + * Creates an instance of Model. + */ + ; + + function BaseModel(data) { + this[propsDataTypeSymbol] = void 0; + this[propsCreationDataTypeSymbol] = void 0; + this[instanceDataTypeSymbol] = void 0; + this[instanceCreationDataTypeSymbol] = void 0; + this[modelTypeKey] = void 0; + this[modelIdKey] = void 0; + this.$ = void 0; + var initialData = data; + var _arguments$ = arguments[1], + snapshotInitialData = _arguments$.snapshotInitialData, + modelClass = _arguments$.modelClass, + propsWithTransforms = _arguments$.propsWithTransforms, + generateNewIds = _arguments$.generateNewIds; + Object.setPrototypeOf(this, modelClass.prototype); + var self = this; // let's always use the one from the prototype + + delete self[modelIdKey]; // delete unnecessary props + + delete self[propsDataTypeSymbol]; + delete self[propsCreationDataTypeSymbol]; + delete self[instanceDataTypeSymbol]; + delete self[instanceCreationDataTypeSymbol]; + + if (!snapshotInitialData) { + // plain new + assertIsObject(initialData, "initialData"); // apply transforms to initial data if needed + + var propsWithTransformsLen = propsWithTransforms.length; + + if (propsWithTransformsLen > 0) { + initialData = Object.assign(initialData); + + for (var i = 0; i < propsWithTransformsLen; i++) { + var propWithTransform = propsWithTransforms[i]; + var propName = propWithTransform[0]; + var propTransform = propWithTransform[1]; + var memoTransform = memoTransformCache.getOrCreateMemoTransform(this, propName, propTransform); + initialData[propName] = memoTransform.dataToProp(initialData[propName]); + } + } + + internalNewModel(this, mobx_esm.observable.object(initialData, undefined, { + deep: false + }), { + modelClass: modelClass, + generateNewIds: true + }); + } else { + // from snapshot + internalNewModel(this, undefined, { + modelClass: modelClass, + snapshotInitialData: snapshotInitialData, + generateNewIds: generateNewIds + }); + } + } + + _proto.toString = function toString(options) { + var finalOptions = _extends({ + withData: true + }, options); + + var firstPart = this.constructor.name + "#" + this[modelTypeKey]; + return finalOptions.withData ? "[" + firstPart + " " + JSON.stringify(getSnapshot(this)) + "]" : "[" + firstPart + "]"; + }; + + return BaseModel; +}(); // these props will never be hoisted to this (except for model id) + +/** + * @internal + */ + +var baseModelPropNames = /*#__PURE__*/new Set([modelTypeKey, modelIdKey, "onInit", "$", "getRefId", "onAttachedToRootStore", "fromSnapshot", "typeCheck"]); +/** + * @deprecated Should not be needed anymore. + * + * Tricks Typescript into accepting abstract classes as a parameter for `ExtendedModel`. + * Does nothing in runtime. + * + * @typeparam T Abstract model class type. + * @param type Abstract model class. + * @returns + */ + +function abstractModelClass(type) { + return type; +} +/** + * Tricks Typescript into accepting a particular kind of generic class as a parameter for `ExtendedModel`. + * Does nothing in runtime. + * + * @typeparam T Generic model class type. + * @param type Generic model class. + * @returns + */ + +function modelClass(type) { + return type; +} +/** + * Add missing model metadata to a model creation snapshot to generate a proper model snapshot. + * Usually used alongside `fromSnapshot`. + * + * @typeparam M Model type. + * @param modelClass Model class. + * @param snapshot Model creation snapshot without metadata. + * @param [internalId] Model internal ID, or `undefined` to generate a new one. + * @returns The model snapshot (including metadata). + */ + +function modelSnapshotInWithMetadata(modelClass, snapshot, internalId) { + var _extends2; + + if (internalId === void 0) { + internalId = getGlobalConfig().modelIdGenerator(); + } + + assertIsModelClass(modelClass, "modelClass"); + assertIsObject(snapshot, "initialData"); + var modelInfo = modelInfoByClass.get(modelClass); + return _extends({}, snapshot, (_extends2 = {}, _extends2[modelTypeKey] = modelInfo.name, _extends2[modelIdKey] = internalId, _extends2)); +} +/** + * Add missing model metadata to a model output snapshot to generate a proper model snapshot. + * Usually used alongside `applySnapshot`. + * + * @typeparam M Model type. + * @param modelClass Model class. + * @param snapshot Model output snapshot without metadata. + * @param [internalId] Model internal ID, or `undefined` to generate a new one. + * @returns The model snapshot (including metadata). + */ + +function modelSnapshotOutWithMetadata(modelClass, snapshot, internalId) { + var _extends3; + + if (internalId === void 0) { + internalId = getGlobalConfig().modelIdGenerator(); + } + + assertIsModelClass(modelClass, "modelClass"); + assertIsObject(snapshot, "initialData"); + var modelInfo = modelInfoByClass.get(modelClass); + return _extends({}, snapshot, (_extends3 = {}, _extends3[modelTypeKey] = modelInfo.name, _extends3[modelIdKey] = internalId, _extends3)); +} + +/** + * Checks if an object is a model instance. + * + * @param model + * @returns + */ + +function isModel(model) { + return model instanceof BaseModel; +} +/** + * @ignore + * @internal + * + * Asserts something is actually a model. + * + * @param model + * @param argName + */ + +function assertIsModel(model, argName, customErrMsg) { + if (customErrMsg === void 0) { + customErrMsg = "must be a model instance"; + } + + if (!isModel(model)) { + throw failure(argName + " " + customErrMsg); + } +} +/** + * @ignore + * @internal + */ + +function isModelClass(modelClass) { + if (typeof modelClass !== "function") { + return false; + } + + if (modelClass !== BaseModel && !(modelClass.prototype instanceof BaseModel)) { + return false; + } + + return true; +} +/** + * @ignore + * @internal + */ + +function assertIsModelClass(modelClass, argName) { + if (typeof modelClass !== "function") { + throw failure(argName + " must be a class"); + } + + if (modelClass !== BaseModel && !(modelClass.prototype instanceof BaseModel)) { + throw failure(argName + " must extend Model"); + } +} +/** + * @ignore + * @internal + */ + +function isModelSnapshot(sn) { + return isPlainObject(sn) && !!sn[modelTypeKey]; +} +/** + * @ignore + * @internal + */ + +function checkModelDecoratorArgs(fnName, target, propertyKey) { + if (typeof propertyKey !== "string") { + throw failure(fnName + " cannot be used over symbol properties"); + } + + var errMessage = fnName + " must be used over model classes or instances"; + + if (!target) { + throw failure(errMessage); + } // check target is a model object or extended class + + + if (!(target instanceof BaseModel) && target !== BaseModel && !(target.prototype instanceof BaseModel)) { + throw failure(errMessage); + } +} + +/** + * Returns if the given function is a model action or not. + * + * @param fn Function to check. + * @returns + */ + +function isModelAction(fn) { + return typeof fn === "function" && !!fn[modelActionSymbol]; +} + +function checkModelActionArgs(target, propertyKey, value) { + if (typeof value !== "function") { + throw failure("modelAction has to be used over functions"); + } + + checkModelDecoratorArgs("modelAction", target, propertyKey); +} +/** + * Decorator that turns a function into a model action. + * + * @param target + * @param propertyKey + * @param [baseDescriptor] + * @returns + */ + + +function modelAction(target, propertyKey, baseDescriptor) { + return decorateWrapMethodOrField("modelAction", { + target: target, + propertyKey: propertyKey, + baseDescriptor: baseDescriptor + }, function (data, fn) { + if (isModelAction(fn)) { + return fn; + } else { + checkModelActionArgs(data.target, data.propertyKey, fn); + return wrapInAction({ + name: data.propertyKey, + fn: fn, + actionType: ActionContextActionType.Sync + }); + } + }); +} + +var modelFlowSymbol = /*#__PURE__*/Symbol("modelFlow"); +/** + * @ignore + * @internal + */ + +function flow(name, generator) { + // Implementation based on https://github.com/tj/co/blob/master/index.js + var flowFn = function flowFn() { + for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) { + args[_key] = arguments[_key]; + } + + var target = this; + + if (inDevMode()) { + assertTweakedObject(target, "flow"); + } + + var previousAsyncStepContext; + + var ctxOverride = function ctxOverride(stepType) { + return function (ctx) { + ctx.previousAsyncStepContext = previousAsyncStepContext; + ctx.spawnAsyncStepContext = previousAsyncStepContext ? previousAsyncStepContext.spawnAsyncStepContext : ctx; + ctx.asyncStepType = stepType; + ctx.args = args; + previousAsyncStepContext = ctx; + }; + }; + + var generatorRun = false; + var gen = wrapInAction({ + name: name, + fn: function fn() { + generatorRun = true; + return generator.apply(target, args); + }, + actionType: ActionContextActionType.Async, + overrideContext: ctxOverride(ActionContextAsyncStepType.Spawn) + }).apply(target); + + if (!generatorRun) { + // maybe it got overridden into a sync action + return gen instanceof Promise ? gen : Promise.resolve(gen); + } // use bound functions to fix es6 compilation + + + var genNext = gen.next.bind(gen); + var genThrow = gen["throw"].bind(gen); + var promise = new Promise(function (resolve, reject) { + function onFulfilled(res) { + var ret; + + try { + ret = wrapInAction({ + name: name, + fn: genNext, + actionType: ActionContextActionType.Async, + overrideContext: ctxOverride(ActionContextAsyncStepType.Resume) + }).call(target, res); + } catch (e) { + wrapInAction({ + name: name, + fn: function fn(err) { + // we use a flow finisher to allow middlewares to tweak the return value before resolution + return { + value: err, + resolution: "reject", + accepter: resolve, + rejecter: reject + }; + }, + actionType: ActionContextActionType.Async, + overrideContext: ctxOverride(ActionContextAsyncStepType.Throw), + isFlowFinisher: true + }).call(target, e); + return; + } + + next(ret); + } + + function onRejected(err) { + var ret; + + try { + ret = wrapInAction({ + name: name, + fn: genThrow, + actionType: ActionContextActionType.Async, + overrideContext: ctxOverride(ActionContextAsyncStepType.ResumeError) + }).call(target, err); + } catch (e) { + wrapInAction({ + name: name, + fn: function fn(err) { + // we use a flow finisher to allow middlewares to tweak the return value before resolution + return { + value: err, + resolution: "reject", + accepter: resolve, + rejecter: reject + }; + }, + actionType: ActionContextActionType.Async, + overrideContext: ctxOverride(ActionContextAsyncStepType.Throw), + isFlowFinisher: true + }).call(target, e); + return; + } + + next(ret); + } + + function next(ret) { + if (ret && typeof ret.then === "function") { + // an async iterator + ret.then(next, reject); + } else if (ret.done) { + // done + wrapInAction({ + name: name, + fn: function fn(val) { + // we use a flow finisher to allow middlewares to tweak the return value before resolution + return { + value: val, + resolution: "accept", + accepter: resolve, + rejecter: reject + }; + }, + actionType: ActionContextActionType.Async, + overrideContext: ctxOverride(ActionContextAsyncStepType.Return), + isFlowFinisher: true + }).call(target, ret.value); + } else { + // continue + Promise.resolve(ret.value).then(onFulfilled, onRejected); + } + } + + onFulfilled(undefined); // kick off the process + }); + return promise; + }; + + flowFn[modelFlowSymbol] = true; + return flowFn; +} +/** + * Returns if the given function is a model flow or not. + * + * @param fn Function to check. + * @returns + */ + +function isModelFlow(fn) { + return typeof fn === "function" && fn[modelFlowSymbol]; +} +/** + * Decorator that turns a function generator into a model flow. + * + * @param target + * @param propertyKey + * @param [baseDescriptor] + * @returns + */ + +function modelFlow(target, propertyKey, baseDescriptor) { + return decorateWrapMethodOrField("modelFlow", { + target: target, + propertyKey: propertyKey, + baseDescriptor: baseDescriptor + }, function (data, fn) { + if (isModelFlow(fn)) { + return fn; + } else { + checkModelFlowArgs(data.target, data.propertyKey, fn); + return flow(data.propertyKey, fn); + } + }); +} + +function checkModelFlowArgs(target, propertyKey, value) { + if (typeof value !== "function") { + throw failure("modelFlow has to be used over functions"); + } + + checkModelDecoratorArgs("modelFlow", target, propertyKey); +} +/** + * Tricks the TS compiler into thinking that a model flow generator function can be awaited + * (is a promise). + * + * @typeparam A Function arguments. + * @typeparam R Return value. + * @param fn Flow function. + * @returns + */ + + +function _async(fn) { + return fn; +} +/** + * Makes a promise a flow, so it can be awaited with yield*. + * + * @typeparam T Promise return type. + * @param promise Promise. + * @returns + */ + +function _await(promise) { + return promiseGenerator.call(promise); +} +/* +function* promiseGenerator( + this: Promise +) { + const ret: T = yield this + return ret +} +*/ +// above code but compiled by TS for ES5 +// so we don't include a dependency to regenerator runtime + +var mobxkeystone_esm_generator = function __generator(thisArg, body) { + var _ = { + label: 0, + sent: function sent() { + if (t[0] & 1) throw t[1]; + return t[1]; + }, + trys: [], + ops: [] + }, + f, + y, + t, + g; + return g = { + next: verb(0), + "throw": verb(1), + "return": verb(2) + }, typeof Symbol === "function" && (g[Symbol.iterator] = function () { + return this; + }), g; + + function verb(n) { + return function (v) { + return step([n, v]); + }; + } + + function step(op) { + if (f) throw new TypeError("Generator is already executing."); + + while (_) { + try { + if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t; + if (y = 0, t) op = [op[0] & 2, t.value]; + + switch (op[0]) { + case 0: + case 1: + t = op; + break; + + case 4: + _.label++; + return { + value: op[1], + done: false + }; + + case 5: + _.label++; + y = op[1]; + op = [0]; + continue; + + case 7: + op = _.ops.pop(); + + _.trys.pop(); + + continue; + + default: + if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { + _ = 0; + continue; + } + + if (op[0] === 3 && (!t || op[1] > t[0] && op[1] < t[3])) { + _.label = op[1]; + break; + } + + if (op[0] === 6 && _.label < t[1]) { + _.label = t[1]; + t = op; + break; + } + + if (t && _.label < t[2]) { + _.label = t[2]; + + _.ops.push(op); + + break; + } + + if (t[2]) _.ops.pop(); + + _.trys.pop(); + + continue; + } + + op = body.call(thisArg, _); + } catch (e) { + op = [6, e]; + y = 0; + } finally { + f = t = 0; + } + } + + if (op[0] & 5) throw op[1]; + return { + value: op[0] ? op[1] : void 0, + done: true + }; + } +}; + +function promiseGenerator() { + var ret; + return mobxkeystone_esm_generator(this, function (_a) { + switch (_a.label) { + case 0: + return [4 + /*yield*/ + , this]; + + case 1: + ret = _a.sent(); + return [2 + /*return*/ + , ret]; + + default: + return; + } + }); +} + +/** + * @ignore + * @internal + */ + +function assertFnModelKeyNotInUse(fnModelObj, key) { + if (fnModelObj[key] !== undefined) { + throw failure("key '" + key + "' cannot be redeclared"); + } +} + +var fnModelActionRegistry = /*#__PURE__*/new Map(); +/** + * @ignore + * @internal + */ + +function getFnModelAction(actionName) { + return fnModelActionRegistry.get(actionName); +} +/** + * @ignore + * @internal + */ + +function extendFnModelActions(fnModelObj, namespace, actions) { + for (var _i = 0, _Object$entries = Object.entries(actions); _i < _Object$entries.length; _i++) { + var _Object$entries$_i = _Object$entries[_i], + name = _Object$entries$_i[0], + fn = _Object$entries$_i[1]; + addActionToFnModel(fnModelObj, namespace, name, fn, false); + } + + return fnModelObj; +} +/** + * @ignore + * @internal + */ + +function addActionToFnModel(fnModelObj, namespace, name, fn, isFlow) { + assertFnModelKeyNotInUse(fnModelObj, name); + var fullActionName = namespace + "::" + name; + assertIsFunction(fn, fullActionName); + + if (fnModelActionRegistry.has(fullActionName)) { + logWarning("warn", "an standalone action with name \"" + fullActionName + "\" already exists (if you are using hot-reloading you may safely ignore this warning)", "duplicateActionName - " + name); + } + + if (isModelAction(fn)) { + throw failure("the standalone action must not be previously marked as an action"); + } + + if (isModelFlow(fn)) { + throw failure("the standalone action must not be previously marked as a flow action"); + } + + var wrappedAction = isFlow ? flow(fullActionName, fn) : wrapInAction({ + name: fullActionName, + fn: fn, + actionType: ActionContextActionType.Sync + }); + + fnModelObj[name] = function (target) { + for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) { + args[_key - 1] = arguments[_key]; + } + + return wrappedAction.apply(target, args); + }; + + fnModelActionRegistry.set(fullActionName, fnModelObj[name]); +} + +/** + * Applies a full snapshot over an object, reconciling it with the current contents of the object. + * + * @typeparam T Object type. + * @param node Target object (model object, object or array). + * @param snapshot Snapshot to apply. + */ + +function applySnapshot(node, snapshot) { + assertTweakedObject(node, "node"); + assertIsObject(snapshot, "snapshot"); + wrappedInternalApplySnapshot().call(node, snapshot); +} + +function internalApplySnapshot(sn) { + var obj = this; + + var reconcile = function reconcile() { + var modelPool = new ModelPool(obj); + var ret = reconcileSnapshot(obj, sn, modelPool); + + if (inDevMode()) { + if (ret !== obj) { + throw failure("assertion error: reconciled object has to be the same"); + } + } + }; + + if (isArray(sn)) { + if (!isArray(obj)) { + throw failure("if the snapshot is an array the target must be an array too"); + } + + return reconcile(); + } + + if (isFrozenSnapshot(sn)) { + throw failure("applySnapshot cannot be used over frozen objects"); + } + + if (isModelSnapshot(sn)) { + var type = sn[modelTypeKey]; + var modelInfo = getModelInfoForName(type); + + if (!modelInfo) { + throw failure("model with name \"" + type + "\" not found in the registry"); + } // we don't check by actual instance since it might be a different one due to hot reloading + + + if (!isModel(obj)) { + // not a model instance, no reconciliation possible + throw failure("the target for a model snapshot must be a model instance"); + } + + if (obj[modelTypeKey] !== type) { + // different kind of model, no reconciliation possible + throw failure("snapshot model type '" + type + "' does not match target model type '" + obj[modelTypeKey] + "'"); + } + + var id = sn[modelIdKey]; + + if (obj[modelIdKey] !== id) { + // different id, no reconciliation possible + throw failure("snapshot model id '" + id + "' does not match target model id '" + obj[modelIdKey] + "'"); + } + + return reconcile(); + } + + if (isPlainObject(sn)) { + if (!isPlainObject(obj) && !(0,mobx_esm.isObservableObject)(obj)) { + // no reconciliation possible + throw failure("if the snapshot is an object the target must be an object too"); + } + + return reconcile(); + } + + throw failure("unsupported snapshot - " + sn); +} + +var wrappedInternalApplySnapshot = /*#__PURE__*/lazy(function () { + return wrapInAction({ + name: BuiltInAction.ApplySnapshot, + fn: internalApplySnapshot, + actionType: ActionContextActionType.Sync + }); +}); + +/** + * Deletes an object field wrapped in an action. + * + * @param node Target object. + * @param fieldName Field name. + */ + +function applyDelete(node, fieldName) { + assertTweakedObject(node, "node"); + wrappedInternalApplyDelete().call(node, fieldName); +} +/** + * @ignore + * @internal + */ + +function internalApplyDelete(fieldName) { + (0,mobx_esm.remove)(this, "" + fieldName); +} +var wrappedInternalApplyDelete = /*#__PURE__*/lazy(function () { + return wrapInAction({ + name: BuiltInAction.ApplyDelete, + fn: internalApplyDelete, + actionType: ActionContextActionType.Sync + }); +}); + +/** + * Calls an object method wrapped in an action. + * + * @param node Target object. + * @param methodName Method name. + */ + +function applyMethodCall(node, methodName) { + assertTweakedObject(node, "node"); + + for (var _len = arguments.length, args = new Array(_len > 2 ? _len - 2 : 0), _key = 2; _key < _len; _key++) { + args[_key - 2] = arguments[_key]; + } + + return wrappedInternalApplyMethodCall().call(node, methodName, args); +} +/** + * @ignore + * @internal + */ + +function internalApplyMethodCall(methodName, args) { + return this[methodName].apply(this, args); +} +var wrappedInternalApplyMethodCall = /*#__PURE__*/lazy(function () { + return wrapInAction({ + name: BuiltInAction.ApplyMethodCall, + fn: internalApplyMethodCall, + actionType: ActionContextActionType.Sync + }); +}); + +/** + * Sets an object field wrapped in an action. + * + * @param node Target object. + * @param fieldName Field name. + * @param value Value to set. + */ + +function applySet(node, fieldName, value) { + assertTweakedObject(node, "node"); + wrappedInternalApplySet().call(node, fieldName, value); +} + +function internalApplySet(fieldName, value) { + // we need to check if it is a model since models can become observable objects + // (e.g. by having a computed value) + if (!isModel(this) && (0,mobx_esm.isObservable)(this)) { + (0,mobx_esm.set)(this, fieldName, value); + } else { + this[fieldName] = value; + } +} + +var wrappedInternalApplySet = /*#__PURE__*/lazy(function () { + return wrapInAction({ + name: BuiltInAction.ApplySet, + fn: internalApplySet, + actionType: ActionContextActionType.Sync + }); +}); + +var _builtInActionToFunct; +var builtInActionToFunction = (_builtInActionToFunct = {}, _builtInActionToFunct[BuiltInAction.ApplySnapshot] = applySnapshot, _builtInActionToFunct[BuiltInAction.ApplyPatches] = applyPatches, _builtInActionToFunct[BuiltInAction.Detach] = detach, _builtInActionToFunct[BuiltInAction.ApplySet] = applySet, _builtInActionToFunct[BuiltInAction.ApplyDelete] = applyDelete, _builtInActionToFunct[BuiltInAction.ApplyMethodCall] = applyMethodCall, _builtInActionToFunct); +/** + * Applies (runs) an action over a target object. + * + * If you intend to apply serialized actions check one of the `applySerializedAction` methods instead. + * + * @param subtreeRoot Subtree root target object to run the action over. + * @param call The action, usually as coming from `onActionMiddleware`. + * @returns The return value of the action, if any. + */ + +function applyAction(subtreeRoot, call) { + if (call.serialized) { + throw failure("cannot apply a serialized action call, use one of the 'applySerializedAction' methods instead"); + } + + assertTweakedObject(subtreeRoot, "subtreeRoot"); // resolve path while checking ids + + var _resolvePathCheckingI = resolvePathCheckingIds(subtreeRoot, call.targetPath, call.targetPathIds), + current = _resolvePathCheckingI.value, + resolved = _resolvePathCheckingI.resolved; + + if (!resolved) { + throw failure("object at path " + JSON.stringify(call.targetPath) + " with ids " + JSON.stringify(call.targetPathIds) + " could not be resolved"); + } + + assertTweakedObject(current, "resolved " + current, true); + + if (isBuiltInAction(call.actionName)) { + var fnToCall = builtInActionToFunction[call.actionName]; + + if (!fnToCall) { + throw failure("assertion error: unknown built-in action - " + call.actionName); + } + + return fnToCall.apply(current, [current].concat(call.args)); + } else if (isHookAction(call.actionName)) { + throw failure("calls to hooks (" + call.actionName + ") cannot be applied"); + } else { + var standaloneAction = getFnModelAction(call.actionName); + + if (standaloneAction) { + return standaloneAction.apply(current, call.args); + } else { + return current[call.actionName].apply(current, call.args); + } + } +} + +var cannotSerialize = /*#__PURE__*/Symbol("cannotSerialize"); + +var arraySerializer = { + id: "mobx-keystone/array", + serialize: function serialize(value, _serialize) { + if (!isArray(value)) return cannotSerialize; // this will also transform observable arrays into non-observable ones + + return value.map(_serialize); + }, + deserialize: function deserialize(arr, _deserialize) { + return arr.map(_deserialize); + } +}; + +var dateSerializer = { + id: "mobx-keystone/dateAsTimestamp", + serialize: function serialize(date) { + if (!(date instanceof Date)) return cannotSerialize; + return +date; + }, + deserialize: function deserialize(timestamp) { + return new Date(timestamp); + } +}; + +var mapSerializer = { + id: "mobx-keystone/mapAsArray", + serialize: function serialize(map, _serialize) { + if (!(map instanceof Map) && !(0,mobx_esm.isObservableMap)(map)) return cannotSerialize; + var arr = []; + var iter = map.keys(); + var cur = iter.next(); + + while (!cur.done) { + var k = cur.value; + var v = map.get(k); + arr.push([_serialize(k), _serialize(v)]); + cur = iter.next(); + } + + return arr; + }, + deserialize: function deserialize(arr, _deserialize) { + var map = new Map(); + var len = arr.length; + + for (var i = 0; i < len; i++) { + var k = arr[i][0]; + var v = arr[i][1]; + map.set(_deserialize(k), _deserialize(v)); + } + + return map; + } +}; + +/** + * @ignore + */ + +function rootPathToTargetPathIds(rootPath) { + var targetPathIds = []; + + for (var i = 0; i < rootPath.path.length; i++) { + var targetObj = rootPath.pathObjects[i + 1]; // first is root, we don't care about its ID + + var targetObjId = isModel(targetObj) ? targetObj[modelIdKey] : null; + targetPathIds.push(targetObjId); + } + + return targetPathIds; +} +/** + * @ignore + */ + +function pathToTargetPathIds(root, path) { + var targetPathIds = []; + var current = root; // we don't care about the root ID + + for (var i = 0; i < path.length; i++) { + current = current[path[i]]; + var targetObjId = isModel(current) ? current[modelIdKey] : null; + targetPathIds.push(targetObjId); + } + + return targetPathIds; +} + +var objectPathSerializer = { + id: "mobx-keystone/objectPath", + serialize: function serialize(value, _, targetRoot) { + if (typeof value !== "object" || value === null || !isTweakedObject(value, false)) return cannotSerialize; // try to serialize a ref to its path if possible instead + + if (targetRoot) { + var rootPath = fastGetRootPath(value); + + if (rootPath.root === targetRoot) { + return { + targetPath: rootPath.path, + targetPathIds: rootPathToTargetPathIds(rootPath) + }; + } + } + + return cannotSerialize; + }, + deserialize: function deserialize(ref, _, targetRoot) { + // try to resolve the node back + if (targetRoot) { + var result = resolvePathCheckingIds(targetRoot, ref.targetPath, ref.targetPathIds); + + if (result.resolved) { + return result.value; + } + } + + throw failure("object at path " + JSON.stringify(ref.targetPath) + " with ids " + JSON.stringify(ref.targetPathIds) + " could not be resolved"); + } +}; + +var objectSnapshotSerializer = { + id: "mobx-keystone/objectSnapshot", + serialize: function serialize(value) { + if (typeof value !== "object" || value === null || !isTweakedObject(value, false)) return cannotSerialize; + return getSnapshot(value); + }, + deserialize: function deserialize(snapshot) { + return fromSnapshot(snapshot); + } +}; + +var plainObjectSerializer = { + id: "mobx-keystone/plainObject", + serialize: function serialize(value, _serialize) { + if (!isPlainObject(value) && !(0,mobx_esm.isObservableObject)(value)) return cannotSerialize; // this will make observable objects non-observable ones + + return mapObjectFields(value, _serialize); + }, + deserialize: function deserialize(obj, serialize) { + return mapObjectFields(obj, serialize); + } +}; + +function mapObjectFields(originalObj, mapFn) { + var obj = {}; + var keys = Object.keys(originalObj); + var len = keys.length; + + for (var i = 0; i < len; i++) { + var k = keys[i]; + var v = originalObj[k]; + obj[k] = mapFn(v); + } + + return obj; +} + +var setSerializer = { + id: "mobx-keystone/setAsArray", + serialize: function serialize(set, _serialize) { + if (!(set instanceof Set)) return cannotSerialize; + var arr = []; + var iter = set.keys(); + var cur = iter.next(); + + while (!cur.done) { + var k = cur.value; + arr.push(_serialize(k)); + cur = iter.next(); + } + + return arr; + }, + deserialize: function deserialize(arr, _deserialize) { + var set = new Set(); + var len = arr.length; + + for (var i = 0; i < len; i++) { + var k = arr[i]; + set.add(_deserialize(k)); + } + + return set; + } +}; + +var serializersArray = []; +var serializersMap = /*#__PURE__*/new Map(); +/** + * Registers a new action call argument serializers. + * Serializers are called in the inverse order they are registered, meaning the + * latest one registered will be called first. + * + * @param serializer Serializer to register. + * @returns A disposer to unregister the serializer. + */ + +function registerActionCallArgumentSerializer(serializer) { + if (serializersArray.includes(serializer)) { + throw failure("action call argument serializer already registered"); + } + + if (serializersMap.has(serializer.id)) { + throw failure("action call argument serializer with id '" + serializer.id + "' already registered"); + } + + serializersArray.unshift(serializer); + serializersMap.set(serializer.id, serializer); + return function () { + var index = serializersArray.indexOf(serializer); + + if (index >= 0) { + serializersArray.splice(index, 1); + } + + serializersMap["delete"](serializer.id); + }; +} +/** + * Transforms an action call argument by returning a `SerializedActionCallArgument`. + * The following are supported out of the box: + * - Primitives. + * - Nodes that are under the same root node as the target root (when provided) will be serialized + * as a path. + * - Nodes that are not under the same root node as the target root will be serialized as their snapshot. + * - Arrays (observable or not). + * - Dates. + * - Maps (observable or not). + * - Sets (observable or not). + * - Plain objects (observable or not). + * + * If the value cannot be serialized it will throw an exception. + * + * @param argValue Argument value to be transformed into its serializable form. + * @param [targetRoot] Target root node of the model where this action is being performed. + * @returns The serializable form of the passed value. + */ + +function serializeActionCallArgument(argValue, targetRoot) { + if (isPrimitive(argValue)) { + return argValue; + } + + var origValue = argValue; + + var serialize = function serialize(v) { + return serializeActionCallArgument(v, targetRoot); + }; // try serializers + + + for (var i = 0; i < serializersArray.length; i++) { + var serializer = serializersArray[i]; + var serializedValue = serializer.serialize(argValue, serialize, targetRoot); + + if (serializedValue !== cannotSerialize) { + return { + $mobxKeystoneSerializer: serializer.id, + value: serializedValue + }; + } + } + + throw failure("serializeActionCallArgument could not serialize the given value: " + origValue); +} +/** + * Ensures that an action call is serializable by mapping the action arguments into its + * serializable version by using `serializeActionCallArgument`. + * + * @param actionCall Action call to convert. + * @param [targetRoot] Target root node of the model where this action is being performed. + * @returns The serializable action call. + */ + +function serializeActionCall(actionCall, targetRoot) { + if (actionCall.serialized) { + throw failure("cannot serialize an already serialized action call"); + } + + if (targetRoot !== undefined) { + assertTweakedObject(targetRoot, "targetRoot"); + } + + var serialize = function serialize(v) { + return serializeActionCallArgument(v, targetRoot); + }; + + return _extends({}, actionCall, { + serialized: true, + args: actionCall.args.map(serialize) + }); +} +/** + * Transforms an action call argument by returning its deserialized equivalent. + * + * @param argValue Argument value to be transformed into its deserialized form. + * @param [targetRoot] Target root node of the model where this action is being performed. + * @returns The deserialized form of the passed value. + */ + +function deserializeActionCallArgument(argValue, targetRoot) { + if (isPrimitive(argValue)) { + return argValue; + } + + if (!isPlainObject(argValue) || typeof argValue.$mobxKeystoneSerializer !== "string") { + throw failure("invalid serialized action call argument"); + } + + var serializerId = argValue.$mobxKeystoneSerializer; + var serializer = serializersMap.get(serializerId); + + if (!serializer) { + throw failure("a serializer with id '" + serializerId + "' could not be found"); + } + + var serializedValue = argValue; + + var deserialize = function deserialize(v) { + return deserializeActionCallArgument(v, targetRoot); + }; + + return serializer.deserialize(serializedValue.value, deserialize, targetRoot); +} +/** + * Ensures that an action call is deserialized by mapping the action arguments into its + * deserialized version by using `deserializeActionCallArgument`. + * + * @param actionCall Action call to convert. + * @param [targetRoot] Target root node of the model where this action is being performed. + * @returns The deserialized action call. + */ + +function deserializeActionCall(actionCall, targetRoot) { + if (!actionCall.serialized) { + throw failure("cannot deserialize a non-serialized action call"); + } + + if (targetRoot !== undefined) { + assertTweakedObject(targetRoot, "targetRoot"); + } + + var deserialize = function deserialize(v) { + return deserializeActionCallArgument(v, targetRoot); + }; + + var deserializedActionCall = _extends({}, actionCall, { + serialized: undefined, + args: actionCall.args.map(deserialize) + }); + + delete deserializedActionCall.serialized; + return deserializedActionCall; +} // serializer registration (from low priority to high priority) + +registerActionCallArgumentSerializer(plainObjectSerializer); +registerActionCallArgumentSerializer(setSerializer); +registerActionCallArgumentSerializer(mapSerializer); +registerActionCallArgumentSerializer(dateSerializer); +registerActionCallArgumentSerializer(arraySerializer); +registerActionCallArgumentSerializer(objectSnapshotSerializer); +registerActionCallArgumentSerializer(objectPathSerializer); + +function typesObjectHelper(objFn, frozen, typeInfoGen) { + assertIsFunction(objFn, "objFn"); + return lateTypeChecker(function () { + var objectSchema = objFn(); + assertIsObject(objectSchema, "objectSchema"); + var schemaEntries = Object.entries(objectSchema); + + var getTypeName = function getTypeName() { + var propsMsg = []; + + for (var _len = arguments.length, recursiveTypeCheckers = new Array(_len), _key = 0; _key < _len; _key++) { + recursiveTypeCheckers[_key] = arguments[_key]; + } + + for (var _iterator = _createForOfIteratorHelperLoose(schemaEntries), _step; !(_step = _iterator()).done;) { + var _step$value = _step.value, + k = _step$value[0], + unresolvedTc = _step$value[1]; + var tc = resolveTypeChecker(unresolvedTc); + var propTypename = "..."; + + if (!recursiveTypeCheckers.includes(tc)) { + propTypename = tc.getTypeName.apply(tc, recursiveTypeCheckers.concat([tc])); + } + + propsMsg.push(k + ": " + propTypename + ";"); + } + + return "{ " + propsMsg.join(" ") + " }"; + }; + + var thisTc = new TypeChecker(function (obj, path) { + if (!isObject(obj) || frozen && !(obj instanceof Frozen)) return new TypeCheckError(path, getTypeName(thisTc), obj); // note: we allow excess properties when checking objects + + for (var _iterator2 = _createForOfIteratorHelperLoose(schemaEntries), _step2; !(_step2 = _iterator2()).done;) { + var _step2$value = _step2.value, + k = _step2$value[0], + unresolvedTc = _step2$value[1]; + var tc = resolveTypeChecker(unresolvedTc); + var objVal = obj[k]; + var valueError = !tc.unchecked ? tc.check(objVal, [].concat(path, [k])) : null; + + if (valueError) { + return valueError; + } + } + + return null; + }, getTypeName, typeInfoGen); + return thisTc; + }, typeInfoGen); +} +/** + * A type that represents a plain object. + * Note that the parameter must be a function that returns an object. This is done so objects can support self / cross types. + * + * Example: + * ```ts + * // notice the ({ ... }), not just { ... } + * const pointType = types.object(() => ({ + * x: types.number, + * y: types.number + * })) + * ``` + * + * @typeparam T Type. + * @param objectFunction Function that generates an object with types. + * @returns + */ + + +function typesObject(objectFunction) { + // we can't type this function or else we won't be able to make it work recursively + var typeInfoGen = function typeInfoGen(t) { + return new ObjectTypeInfo(t, objectFunction); + }; + + return typesObjectHelper(objectFunction, false, typeInfoGen); +} +/** + * `types.object` type info. + */ + +var ObjectTypeInfo = /*#__PURE__*/function (_TypeInfo) { + _inheritsLoose(ObjectTypeInfo, _TypeInfo); + + _createClass(ObjectTypeInfo, [{ + key: "props", + // memoize to always return the same object + get: function get() { + return this._props(); + } + }]); + + function ObjectTypeInfo(thisType, _objTypeFn) { + var _this; + + _this = _TypeInfo.call(this, thisType) || this; + _this._objTypeFn = void 0; + _this._props = lateVal(function () { + var objSchema = _this._objTypeFn(); + + var propTypes = {}; + Object.keys(objSchema).forEach(function (propName) { + var type = resolveStandardType(objSchema[propName]); + propTypes[propName] = { + type: type, + typeInfo: getTypeInfo(type) + }; + }); + return propTypes; + }); + _this._objTypeFn = _objTypeFn; + return _this; + } + + return ObjectTypeInfo; +}(TypeInfo); +/** + * A type that represents frozen data. + * + * Example: + * ```ts + * const frozenNumberType = types.frozen(types.number) + * const frozenAnyType = types.frozen(types.unchecked()) + * const frozenNumberArrayType = types.frozen(types.array(types.number)) + * const frozenUncheckedNumberArrayType = types.frozen(types.unchecked()) + * ``` + * + * @typeParam T Type. + * @param dataType Type of the frozen data. + * @returns + */ + +function typesFrozen(dataType) { + return typesObjectHelper(function () { + return { + data: dataType + }; + }, true, function (t) { + return new FrozenTypeInfo(t, resolveStandardType(dataType)); + }); +} +/** + * `types.frozen` type info. + */ + +var FrozenTypeInfo = /*#__PURE__*/function (_TypeInfo2) { + _inheritsLoose(FrozenTypeInfo, _TypeInfo2); + + _createClass(FrozenTypeInfo, [{ + key: "dataTypeInfo", + get: function get() { + return getTypeInfo(this.dataType); + } + }]); + + function FrozenTypeInfo(thisType, dataType) { + var _this2; + + _this2 = _TypeInfo2.call(this, thisType) || this; + _this2.dataType = void 0; + _this2.dataType = dataType; + return _this2; + } + + return FrozenTypeInfo; +}(TypeInfo); + +var unchecked = /*#__PURE__*/new TypeChecker(null, function () { + return "any"; +}, function (t) { + return new UncheckedTypeInfo(t); +}); +/** + * A type that represents a given value that won't be type checked. + * This is basically a way to bail out of the runtime type checking system. + * + * Example: + * ```ts + * const uncheckedSomeModel = types.unchecked() + * const anyType = types.unchecked() + * const customUncheckedType = types.unchecked<(A & B) | C>() + * ``` + * + * @typeparam T Type of the value, or unkown if not given. + * @returns + */ + +function typesUnchecked() { + return unchecked; +} +/** + * `types.unchecked` type info. + */ + +var UncheckedTypeInfo = /*#__PURE__*/function (_TypeInfo) { + _inheritsLoose(UncheckedTypeInfo, _TypeInfo); + + function UncheckedTypeInfo() { + return _TypeInfo.apply(this, arguments) || this; + } + + return UncheckedTypeInfo; +}(TypeInfo); + +/** + * Base abstract class for models that extends another model. + * + * @typeparam TProps New model properties type. + * @typeparam TBaseModel Base class type. + * @param baseModel Base model type. + * @param modelProps Model properties. + * @returns + */ + +function ExtendedModel(baseModel, modelProps) { + // note that & Object is there to support abstract classes + return internalModel(modelProps, baseModel); +} +/** + * Base abstract class for models. + * + * Never override the constructor, use `onInit` or `onAttachedToRootStore` instead. + * + * @typeparam TProps Model properties type. + * @param modelProps Model properties. + */ + +function Model(modelProps) { + return internalModel(modelProps); +} + +function internalModel(modelProps, baseModel) { + var _baseModel; + + assertIsObject(modelProps, "modelProps"); + + if (baseModel) { + assertIsModelClass(baseModel, "baseModel"); // if the baseModel is wrapped with the model decorator get the original one + + var unwrappedClass = baseModel[modelUnwrappedClassSymbol]; + + if (unwrappedClass) { + baseModel = unwrappedClass; + assertIsModelClass(baseModel, "baseModel"); + } + } + + var extraDescriptors = {}; + var composedModelProps = modelProps; + + if (baseModel) { + var oldModelProps = getInternalModelClassPropsInfo(baseModel); + + for (var _i = 0, _Object$keys = Object.keys(oldModelProps); _i < _Object$keys.length; _i++) { + var oldModelPropKey = _Object$keys[_i]; + + if (modelProps[oldModelPropKey]) { + throw failure("extended model cannot redeclare base model property named '" + oldModelPropKey + "'"); + } + + composedModelProps[oldModelPropKey] = oldModelProps[oldModelPropKey]; + } + } else { + // define $modelId on the base + extraDescriptors[modelIdKey] = createModelPropDescriptor(modelIdKey, undefined, true); + } // create type checker if needed + + + var dataTypeChecker; + + if (Object.values(composedModelProps).some(function (mp) { + return !!mp.typeChecker; + })) { + var typeCheckerObj = {}; + + for (var _i2 = 0, _Object$entries = Object.entries(composedModelProps); _i2 < _Object$entries.length; _i2++) { + var _Object$entries$_i = _Object$entries[_i2], + k = _Object$entries$_i[0], + mp = _Object$entries$_i[1]; + typeCheckerObj[k] = !mp.typeChecker ? typesUnchecked() : mp.typeChecker; + } + + dataTypeChecker = typesObject(function () { + return typeCheckerObj; + }); + } // skip props that are on base model, these have to be accessed through $ + // we only need to proxy new props, not old ones + + + for (var _iterator = _createForOfIteratorHelperLoose(Object.keys(modelProps).filter(function (mp) { + return !baseModelPropNames.has(mp); + })), _step; !(_step = _iterator()).done;) { + var modelPropName = _step.value; + extraDescriptors[modelPropName] = createModelPropDescriptor(modelPropName, modelProps[modelPropName], false); + } + + var extraPropNames = Object.keys(extraDescriptors); + var extraPropNamesLen = extraPropNames.length; + var base = (_baseModel = baseModel) != null ? _baseModel : BaseModel; + var propsWithTransforms = Object.entries(modelProps).filter(function (_ref) { + var _propName = _ref[0], + prop = _ref[1]; + return !!prop.transform; + }).map(function (_ref2) { + var propName = _ref2[0], + prop = _ref2[1]; + return [propName, prop.transform]; + }); // we use this weird hack rather than just class CustomBaseModel extends base {} + // in order to work around problems with ES5 classes extending ES6 classes + // see https://github.com/xaviergonz/mobx-keystone/issues/15 + + var CustomBaseModel = function (_base) { + _inheritsLoose$1(CustomBaseModel, _base); + + function CustomBaseModel(initialData, constructorOptions) { + var _constructorOptions$m; + + var baseModel = new base(initialData, _extends({}, constructorOptions, { + modelClass: (_constructorOptions$m = constructorOptions == null ? void 0 : constructorOptions.modelClass) != null ? _constructorOptions$m : this.constructor, + propsWithTransforms: propsWithTransforms + })); // make sure abstract classes do not override prototype props + + for (var i = 0; i < extraPropNamesLen; i++) { + var extraPropName = extraPropNames[i]; + + if (Object.getOwnPropertyDescriptor(baseModel, extraPropName)) { + delete baseModel[extraPropName]; + } + } + + return baseModel; + } + + return CustomBaseModel; + }(base); + + var initializers = base[modelInitializersSymbol]; + + if (initializers) { + CustomBaseModel[modelInitializersSymbol] = initializers.slice(); + } + + setInternalModelClassPropsInfo(CustomBaseModel, composedModelProps); + CustomBaseModel[modelDataTypeCheckerSymbol] = dataTypeChecker; + Object.defineProperties(CustomBaseModel.prototype, extraDescriptors); + return CustomBaseModel; +} + +function _inheritsLoose$1(subClass, superClass) { + subClass.prototype = Object.create(superClass.prototype); + subClass.prototype.constructor = subClass; + subClass.__proto__ = superClass; +} + +function createModelPropDescriptor(modelPropName, modelProp, enumerable) { + return { + enumerable: enumerable, + configurable: true, + get: function get() { + return getModelInstanceDataField(this, modelProp, modelPropName); + }, + set: function set(v) { + // hack to only permit setting these values once fully constructed + // this is to ignore abstract properties being set by babel + // see https://github.com/xaviergonz/mobx-keystone/issues/18 + if (!this[modelInitializedSymbol]) { + return; + } + + setModelInstanceDataField(this, modelProp, modelPropName, v); + } + }; +} + +function getModelInstanceDataField(model, modelProp, modelPropName) { + var transform = modelProp ? modelProp.transform : undefined; + + if (transform) { + // no need to use get since these vars always get on the initial $ + var memoTransform = memoTransformCache.getOrCreateMemoTransform(model, modelPropName, transform); + return memoTransform.propToData(model.$[modelPropName]); + } else { + // no need to use get since these vars always get on the initial $ + return model.$[modelPropName]; + } +} + +function setModelInstanceDataField(model, modelProp, modelPropName, value) { + if ((modelProp == null ? void 0 : modelProp.options.setterAction) && !getCurrentActionContext()) { + // use apply set instead to wrap it in an action + applySet(model, modelPropName, value); + return; + } + + var transform = modelProp == null ? void 0 : modelProp.transform; + + if (transform) { + // no need to use set since these vars always get on the initial $ + var memoTransform = memoTransformCache.getOrCreateMemoTransform(model, modelPropName, transform); + model.$[modelPropName] = memoTransform.dataToProp(value); + } else { + // no need to use set since these vars always get on the initial $ + model.$[modelPropName] = value; + } +} + +/** + * Decorator that marks this class (which MUST inherit from the `Model` abstract class) + * as a model. + * + * @param name Unique name for the model type. Note that this name must be unique for your whole + * application, so it is usually a good idea to use some prefix unique to your application domain. + */ + +var model = function model(name) { + return function (clazz) { + return internalModel$1(name)(clazz); + }; +}; + +var internalModel$1 = function internalModel(name) { + return function (clazz) { + assertIsModelClass(clazz, "a model class"); + + if (modelInfoByName[name]) { + logWarning("warn", "a model with name \"" + name + "\" already exists (if you are using hot-reloading you may safely ignore this warning)", "duplicateModelName - " + name); + } + + if (clazz[modelUnwrappedClassSymbol]) { + throw failure("a class already decorated with `@model` cannot be re-decorated"); + } // trick so plain new works + + + var newClazz = function newClazz(initialData, snapshotInitialData, generateNewIds) { + var instance = new clazz(initialData, snapshotInitialData, this.constructor, generateNewIds); + runLateInitializationFunctions(instance); // compatibility with mobx 6 + + if (getMobxVersion() >= 6) { + try { + ; + (0,mobx_esm.makeObservable)(instance); + } catch (err) { + // sadly we need to use this hack since the PR to do this the proper way + // was rejected on the mobx side + if (err.message !== "[MobX] No annotations were passed to makeObservable, but no decorator members have been found either") { + throw err; + } + } + } // the object is ready + + + addHiddenProp(instance, modelInitializedSymbol, true, false); + + if (instance.onInit) { + wrapModelMethodInActionIfNeeded(instance, "onInit", HookAction.OnInit); + instance.onInit(); + } + + return instance; + }; + + clazz.toString = function () { + return "class " + clazz.name + "#" + name; + }; + + clazz[modelTypeKey] = name; // this also gives access to modelInitializersSymbol, modelPropertiesSymbol, modelDataTypeCheckerSymbol + + Object.setPrototypeOf(newClazz, clazz); + newClazz.prototype = clazz.prototype; + Object.defineProperty(newClazz, "name", _extends({}, Object.getOwnPropertyDescriptor(newClazz, "name"), { + value: clazz.name + })); + newClazz[modelUnwrappedClassSymbol] = clazz; + var modelInfo = { + name: name, + "class": newClazz + }; + modelInfoByName[name] = modelInfo; + modelInfoByClass.set(newClazz, modelInfo); + modelInfoByClass.set(clazz, modelInfo); + return newClazz; + }; +}; // basically taken from TS + + +function tsDecorate(decorators, target, key, desc) { + var c = arguments.length, + r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, + d; + if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);else for (var i = decorators.length - 1; i >= 0; i--) { + if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; + } // eslint-disable-next-line no-sequences + + return c > 3 && r && Object.defineProperty(target, key, r), r; +} +/** + * Marks a class (which MUST inherit from the `Model` abstract class) + * as a model and decorates some of its methods/properties. + * + * @param name Unique name for the model type. Note that this name must be unique for your whole + * application, so it is usually a good idea to use some prefix unique to your application domain. + * If you don't want to assign a name yet (e.g. for a base model) pass `undefined`. + * @param clazz Model class. + * @param decorators Decorators. + */ + + +function decoratedModel(name, clazz, decorators) { + // decorate class members + for (var _i = 0, _Object$entries = Object.entries(decorators); _i < _Object$entries.length; _i++) { + var _Object$entries$_i = _Object$entries[_i], + k = _Object$entries$_i[0], + decorator = _Object$entries$_i[1]; + var prototypeValueDesc = Object.getOwnPropertyDescriptor(clazz.prototype, k); // TS seems to send null for methods in the prototype + // (which we substitute for the descriptor to avoid a double look-up) and void 0 (undefined) for props + + tsDecorate(Array.isArray(decorator) ? decorator : [decorator], clazz.prototype, k, prototypeValueDesc ? prototypeValueDesc : void 0); + } + + return name ? model(name)(clazz) : clazz; +} + +/** + * Applies (runs) a serialized action over a target object. + * In this mode newly generated / modified model IDs will be tracked + * so they can be later synchronized when applying it on another machine + * via `applySerializedActionAndSyncNewModelIds`. + * This means this method is usually used on the server side. + * + * If you intend to apply non-serialized actions check `applyAction` instead. + * + * @param subtreeRoot Subtree root target object to run the action over. + * @param call The serialized action, usually as coming from the server/client. + * @returns The return value of the action, if any, plus a new serialized action + * with model overrides. + */ + +function applySerializedActionAndTrackNewModelIds(subtreeRoot, call) { + if (!call.serialized) { + throw failure("cannot apply a non-serialized action call, use 'applyAction' instead"); + } + + assertTweakedObject(subtreeRoot, "subtreeRoot"); + var deserializedCall = deserializeActionCall(call, subtreeRoot); + var modelIdOverrides = []; // set a patch listener to track changes to model ids + + var patchDisposer = onPatches(subtreeRoot, function (patches) { + scanPatchesForModelIdChanges(subtreeRoot, modelIdOverrides, patches); + }); + + try { + var returnValue = applyAction(subtreeRoot, deserializedCall); + return { + returnValue: returnValue, + serializedActionCall: _extends({}, call, { + modelIdOverrides: modelIdOverrides + }) + }; + } finally { + patchDisposer(); + } +} + +function scanPatchesForModelIdChanges(root, modelIdOverrides, patches) { + var len = patches.length; + + for (var i = 0; i < len; i++) { + var patch = patches[i]; + + if (patch.op === "replace" || patch.op === "add") { + deepScanValueForModelIdChanges(root, modelIdOverrides, patch.value, patch.path); + } + } +} + +function deepScanValueForModelIdChanges(root, modelIdOverrides, value, path) { + if (path.length >= 1 && path[path.length - 1] === modelIdKey && typeof value === "string") { + // ensure the parent is an actual model + var parent = resolvePath(root, path.slice(0, path.length - 1)).value; + + if (isModel(parent)) { + // found one + modelIdOverrides.push({ + op: "replace", + path: path.slice(), + value: value + }); + } + } else if (Array.isArray(value)) { + var len = value.length; + + for (var i = 0; i < len; i++) { + path.push(i); + deepScanValueForModelIdChanges(root, modelIdOverrides, value[i], path); + path.pop(); + } + } else if (isObject(value)) { + // skip frozen values + if (!value[frozenKey]) { + var keys = Object.keys(value); + var _len = keys.length; + + for (var _i = 0; _i < _len; _i++) { + var propName = keys[_i]; + var propValue = value[propName]; + path.push(propName); + deepScanValueForModelIdChanges(root, modelIdOverrides, propValue, path); + path.pop(); + } + } + } +} +/** + * Applies (runs) a serialized action over a target object. + * In this mode newly generated / modified model IDs will be tracked + * so they can be later synchronized when applying it on another machine + * via `applySerializedActionAndSyncNewModelIds`. + * This means this method is usually used on the server side. + * + * If you intend to apply non-serialized actions check `applyAction` instead. + * + * @param subtreeRoot Subtree root target object to run the action over. + * @param call The serialized action, usually as coming from the server/client. + * @returns The return value of the action, if any, plus a new serialized action + * with model overrides. + */ + + +function applySerializedActionAndSyncNewModelIds(subtreeRoot, call) { + if (!call.serialized) { + throw failure("cannot apply a non-serialized action call, use 'applyAction' instead"); + } + + assertTweakedObject(subtreeRoot, "subtreeRoot"); + var deserializedCall = deserializeActionCall(call, subtreeRoot); + var returnValue; + (0,mobx_esm.runInAction)(function () { + returnValue = applyAction(subtreeRoot, deserializedCall); // apply model id overrides + + applyPatches(subtreeRoot, call.modelIdOverrides); + }); + return returnValue; +} + +/** + * Action tracking middleware finish result. + */ + +var ActionTrackingResult; + +(function (ActionTrackingResult) { + /** + * The action returned normally (without throwing). + */ + ActionTrackingResult["Return"] = "return"; + /** + * The action threw an error. + */ + + ActionTrackingResult["Throw"] = "throw"; +})(ActionTrackingResult || (ActionTrackingResult = {})); +/** + * Creates an action tracking middleware, which is a simplified version + * of the standard action middleware. + * + * @param subtreeRoot Subtree root target object. + * @param hooks Middleware hooks. + * @returns The middleware disposer. + */ + + +function actionTrackingMiddleware(subtreeRoot, hooks) { + assertTweakedObject(subtreeRoot, "subtreeRoot"); + var dataSymbol = Symbol("actionTrackingMiddlewareData"); + + function getCtxData(ctx) { + return ctx.data[dataSymbol]; + } + + function setCtxData(ctx, partialData) { + var currentData = ctx.data[dataSymbol]; + + if (!currentData) { + ctx.data[dataSymbol] = partialData; + } else { + Object.assign(currentData, partialData); + } + } + + var userFilter = function userFilter(ctx) { + if (hooks.filter) { + return hooks.filter(simplifyActionContext(ctx)); + } + + return true; + }; + + var resumeSuspendSupport = !!hooks.onResume || !!hooks.onSuspend; + + var filter = function filter(ctx) { + if (ctx.type === ActionContextActionType.Sync) { + // start and finish is on the same context + var accepted = userFilter(ctx); + + if (accepted) { + setCtxData(ctx, { + startAccepted: true, + state: "idle" + }); + } + + return accepted; + } else { + switch (ctx.asyncStepType) { + case ActionContextAsyncStepType.Spawn: + var _accepted = userFilter(ctx); + + if (_accepted) { + setCtxData(ctx, { + startAccepted: true, + state: "idle" + }); + } + + return _accepted; + + case ActionContextAsyncStepType.Return: + case ActionContextAsyncStepType.Throw: + // depends if the spawn one was accepted or not + var data = getCtxData(ctx.spawnAsyncStepContext); + return data ? data.startAccepted : false; + + case ActionContextAsyncStepType.Resume: + case ActionContextAsyncStepType.ResumeError: + if (!resumeSuspendSupport) { + return false; + } else { + // depends if the spawn one was accepted or not + var _data = getCtxData(ctx.spawnAsyncStepContext); + + return _data ? _data.startAccepted : false; + } + + default: + return false; + } + } + }; + + var start = function start(simpleCtx) { + setCtxData(simpleCtx, { + state: "started" + }); + + if (hooks.onStart) { + return hooks.onStart(simpleCtx) || undefined; + } + + return undefined; + }; + + var finish = function finish(simpleCtx, ret) { + // fakely resume and suspend the parent if needed + var parentCtx = simpleCtx.parentContext; + var parentResumed = false; + + if (parentCtx) { + var parentData = getCtxData(parentCtx); + + if (parentData && parentData.startAccepted && parentData.state === "suspended") { + parentResumed = true; + resume(parentCtx, false); + } + } + + setCtxData(simpleCtx, { + state: "finished" + }); + + if (hooks.onFinish) { + ret = hooks.onFinish(simpleCtx, ret) || ret; + } + + if (parentResumed) { + suspend(parentCtx); + } + + return ret; + }; + + var resume = function resume(simpleCtx, real) { + // ensure parents are resumed + var parentCtx = simpleCtx.parentContext; + + if (parentCtx) { + var parentData = getCtxData(parentCtx); + + if (parentData && parentData.startAccepted && parentData.state === "suspended") { + resume(parentCtx, false); + } + } + + setCtxData(simpleCtx, { + state: real ? "realResumed" : "fakeResumed" + }); + + if (hooks.onResume) { + hooks.onResume(simpleCtx); + } + }; + + var suspend = function suspend(simpleCtx) { + setCtxData(simpleCtx, { + state: "suspended" + }); + + if (hooks.onSuspend) { + hooks.onSuspend(simpleCtx); + } // ensure parents are suspended if they were fakely resumed + + + var parentCtx = simpleCtx.parentContext; + + if (parentCtx) { + var parentData = getCtxData(parentCtx); + + if (parentData && parentData.startAccepted && parentData.state === "fakeResumed") { + suspend(parentCtx); + } + } + }; + + var mware = function mware(ctx, next) { + var simpleCtx = simplifyActionContext(ctx); + var origNext = next; + + next = function next() { + resume(simpleCtx, true); + + try { + return origNext(); + } finally { + suspend(simpleCtx); + } + }; + + if (ctx.type === ActionContextActionType.Sync) { + var retObj = start(simpleCtx); + + if (retObj) { + // action cancelled / overriden by onStart + resume(simpleCtx, true); + suspend(simpleCtx); + retObj = finish(simpleCtx, retObj); + } else { + try { + retObj = finish(simpleCtx, { + result: ActionTrackingResult.Return, + value: next() + }); + } catch (err) { + retObj = finish(simpleCtx, { + result: ActionTrackingResult.Throw, + value: err + }); + } + } + + return returnOrThrowActionTrackingReturn(retObj); + } else { + // async + switch (ctx.asyncStepType) { + case ActionContextAsyncStepType.Spawn: + { + var _retObj = start(simpleCtx); + + if (_retObj) { + // action cancelled / overriden by onStart + resume(simpleCtx, true); + suspend(simpleCtx); + _retObj = finish(simpleCtx, _retObj); + return returnOrThrowActionTrackingReturn(_retObj); + } else { + return next(); + } + } + + case ActionContextAsyncStepType.Return: + { + var flowFinisher = next(); + + var _retObj2 = finish(simpleCtx, { + result: ActionTrackingResult.Return, + value: flowFinisher.value + }); + + flowFinisher.resolution = _retObj2.result === ActionTrackingResult.Return ? "accept" : "reject"; + flowFinisher.value = _retObj2.value; + return flowFinisher; + } + + case ActionContextAsyncStepType.Throw: + { + var _flowFinisher = next(); + + var _retObj3 = finish(simpleCtx, { + result: ActionTrackingResult.Throw, + value: _flowFinisher.value + }); + + _flowFinisher.resolution = _retObj3.result === ActionTrackingResult.Return ? "accept" : "reject"; + _flowFinisher.value = _retObj3.value; + return _flowFinisher; + } + + case ActionContextAsyncStepType.Resume: + case ActionContextAsyncStepType.ResumeError: + if (resumeSuspendSupport) { + return next(); + } else { + throw failure("asssertion error: async step should have been filtered out - " + ctx.asyncStepType); + } + + default: + throw failure("asssertion error: async step should have been filtered out - " + ctx.asyncStepType); + } + } + }; + + return addActionMiddleware({ + middleware: mware, + filter: filter, + subtreeRoot: subtreeRoot + }); +} + +function returnOrThrowActionTrackingReturn(retObj) { + if (retObj.result === ActionTrackingResult.Return) { + return retObj.value; + } else { + throw retObj.value; + } +} + +var simpleDataContextSymbol = /*#__PURE__*/Symbol("simpleDataContext"); +/** + * Simplifies an action context by converting an async call hierarchy into a simpler one. + * + * @param ctx Action context to convert. + * @returns Simplified action context. + */ + +function simplifyActionContext(ctx) { + while (ctx.previousAsyncStepContext) { + ctx = ctx.previousAsyncStepContext; + } + + var simpleCtx = ctx.data[simpleDataContextSymbol]; + + if (!simpleCtx) { + var parentContext = ctx.parentContext ? simplifyActionContext(ctx.parentContext) : undefined; + simpleCtx = { + actionName: ctx.actionName, + type: ctx.type, + target: ctx.target, + args: ctx.args, + data: ctx.data, + parentContext: parentContext + }; + simpleCtx.rootContext = parentContext ? parentContext.rootContext : simpleCtx; + ctx.data[simpleDataContextSymbol] = simpleCtx; + } + + return simpleCtx; +} + +/** + * Attaches an action middleware that invokes a listener for all actions of a given tree. + * Note that the listener will only be invoked for the topmost level actions, so it won't run for child actions or intermediary flow steps. + * Also it won't trigger the listener for calls to hooks such as `onAttachedToRootStore` or its returned disposer. + * + * Its main use is to keep track of top level actions that can be later replicated via `applyAction` somewhere else (another machine, etc.). + * + * There are two kind of possible listeners, `onStart` and `onFinish` listeners. + * `onStart` listeners are called before the action executes and allow cancellation by returning a new return value (which might be a return or a throw). + * `onFinish` listeners are called after the action executes, have access to the action actual return value and allow overriding by returning a + * new return value (which might be a return or a throw). + * + * If you want to ensure that the actual action calls are serializable you should use either `serializeActionCallArgument` over the arguments + * or `serializeActionCall` over the whole action before sending the action call over the wire / storing them . + * + * @param subtreeRoot Subtree root target object. + * @param listeners Listener functions that will be invoked everytime a topmost action is invoked on the model or any children. + * @returns The middleware disposer. + */ + +function onActionMiddleware(subtreeRoot, listeners) { + assertTweakedObject(subtreeRoot, "subtreeRoot"); + assertIsObject(listeners, "listeners"); + return actionTrackingMiddleware(subtreeRoot, { + filter: function filter(ctx) { + if (ctx.parentContext) { + // sub-action, do nothing + return false; + } // skip hooks + + + if (isHookAction(ctx.actionName)) { + return false; + } + + return true; + }, + onStart: function onStart(ctx) { + if (listeners.onStart) { + var actionCall = actionContextToActionCall(ctx); + return listeners.onStart(actionCall, ctx); + } + }, + onFinish: function onFinish(ctx, ret) { + if (listeners.onFinish) { + var actionCall = actionContextToActionCall(ctx); + return listeners.onFinish(actionCall, ctx, ret); + } + } + }); +} + +function actionContextToActionCall(ctx) { + var rootPath = fastGetRootPath(ctx.target); + return { + actionName: ctx.actionName, + args: ctx.args, + targetPath: rootPath.path, + targetPathIds: rootPathToTargetPathIds(rootPath) + }; +} + +/** + * Attaches an action middleware that will throw when any action is started + * over the node or any of the child nodes, thus effectively making the subtree + * readonly. + * + * It will return an object with a `dispose` function to remove the middleware and a `allowWrite` function + * that will allow actions to be started inside the provided code block. + * + * Example: + * ```ts + * // given a model instance named todo + * const { dispose, allowWrite } = readonlyMiddleware(todo) + * + * // this will throw + * todo.setDone(false) + * await todo.setDoneAsync(false) + * + * // this will work + * allowWrite(() => todo.setDone(false)) + * // note: for async always use one action invocation per allowWrite! + * await allowWrite(() => todo.setDoneAsync(false)) + * ``` + * + * @param subtreeRoot Subtree root target object. + * @returns An object with the middleware disposer (`dispose`) and a `allowWrite` function. + */ + +function readonlyMiddleware(subtreeRoot) { + assertTweakedObject(subtreeRoot, "subtreeRoot"); + var writable = false; + var writableSymbol = Symbol("writable"); + var disposer = actionTrackingMiddleware(subtreeRoot, { + filter: function filter(ctx) { + // skip hooks + if (isHookAction(ctx.actionName)) { + return false; + } // if we are inside allowWrite it is writable + + + var currentlyWritable = writable; + + if (!currentlyWritable) { + // if a parent context was writable then the child should be as well + var currentCtx = ctx; + + while (currentCtx && !currentlyWritable) { + currentlyWritable = !!currentCtx.data[writableSymbol]; + currentCtx = currentCtx.parentContext; + } + } + + if (currentlyWritable) { + ctx.data[writableSymbol] = true; + return false; + } + + return true; + }, + onStart: function onStart(ctx) { + // if we get here (wasn't filtered out) it is not writable + return { + result: ActionTrackingResult.Throw, + value: failure("tried to invoke action '" + ctx.actionName + "' over a readonly node") + }; + } + }); + return { + dispose: disposer, + allowWrite: function allowWrite(fn) { + var oldWritable = writable; + writable = true; + + try { + return fn(); + } finally { + writable = oldWritable; + } + } + }; +} + +/** + * Escapes a json pointer path. + * + * @param path The raw pointer + * @return the Escaped path + */ + +function escapePathComponent(path) { + if (typeof path === "number") { + return "" + path; + } + + if (path.indexOf("/") === -1 && path.indexOf("~") === -1) { + return path; + } + + return path.replace(/~/g, "~0").replace(/\//g, "~1"); +} +/** + * Unescapes a json pointer path. + * + * @param path The escaped pointer + * @return The unescaped path + */ + + +function unescapePathComponent(path) { + return path.replace(/~1/g, "/").replace(/~0/g, "~"); +} +/** + * Converts a path into a JSON pointer. + * + * @param path Path to convert. + * @returns Converted JSON pointer. + */ + + +function pathToJsonPointer(path) { + if (path.length <= 0) { + return ""; + } + + return "/" + path.map(escapePathComponent).join("/"); +} +/** + * Converts a JSON pointer into a path. + * + * @param jsonPointer JSON pointer to convert. + * @returns Converted path. + */ + +function jsonPointerToPath(jsonPointer) { + if (jsonPointer === "") { + return []; + } + + if (!jsonPointer.startsWith("/")) { + throw failure("a JSON pointer must start with '/' or be empty"); + } + + jsonPointer = jsonPointer.slice(1); + return jsonPointer.split("/").map(unescapePathComponent); +} +/** + * Convert a patch into a JSON patch. + * + * @param patch A patch. + * @returns A JSON patch. + */ + +function patchToJsonPatch(patch) { + return _extends({}, patch, { + path: pathToJsonPointer(patch.path) + }); +} +/** + * Converts a JSON patch into a patch. + * + * @param jsonPatch A JSON patch. + * @returns A patch. + */ + +function jsonPatchToPatch(jsonPatch) { + return _extends({}, jsonPatch, { + path: jsonPointerToPath(jsonPatch.path) + }); +} + +/** + * Creates a patch recorder. + * + * @param subtreeRoot + * @param [opts] + * @returns The patch recorder. + */ + +function patchRecorder(subtreeRoot, opts) { + assertTweakedObject(subtreeRoot, "subtreeRoot"); + return internalPatchRecorder(subtreeRoot, opts); +} +/** + * @ignore + * @internal + * + * Creates a global or local patch recorder. + * + * @param subtreeRoot + * @param [opts] + * @returns The patch recorder. + */ + +function internalPatchRecorder(subtreeRoot, opts) { + var _recording$filter$opt = _extends({ + recording: true, + filter: alwaysAcceptFilter + }, opts), + recording = _recording$filter$opt.recording, + filter = _recording$filter$opt.filter; + + var events = mobx_esm.observable.array([], { + deep: false + }); + var onPatchesDisposer; + + if (subtreeRoot) { + onPatchesDisposer = onPatches(subtreeRoot, function (p, invP) { + if (recording && filter(p, invP)) { + events.push({ + target: subtreeRoot, + patches: p, + inversePatches: invP + }); + opts == null ? void 0 : opts.onPatches == null ? void 0 : opts.onPatches(p, invP); + } + }); + } else { + onPatchesDisposer = onGlobalPatches(function (target, p, invP) { + if (recording && filter(p, invP)) { + events.push({ + target: target, + patches: p, + inversePatches: invP + }); + opts == null ? void 0 : opts.onPatches == null ? void 0 : opts.onPatches(p, invP); + } + }); + } + + return { + get recording() { + return recording; + }, + + set recording(enabled) { + recording = enabled; + }, + + get events() { + return events; + }, + + dispose: function dispose() { + onPatchesDisposer(); + } + }; +} + +var alwaysAcceptFilter = function alwaysAcceptFilter() { + return true; +}; + +/** + * Creates a transaction middleware, which reverts changes made by an action / child + * actions when the root action throws an exception by applying inverse patches. + * + * @typeparam M Model + * @param target Object with the root target model object (`model`) and root action name (`actionName`). + * @returns The middleware disposer. + */ + +function transactionMiddleware(target) { + assertIsObject(target, "target"); + var model = target.model, + actionName = target.actionName; + assertIsModel(model, "target.model"); + + if (typeof actionName !== "string") { + throw failure("target.actionName must be a string"); + } + + var patchRecorderSymbol = Symbol("patchRecorder"); + + function initPatchRecorder(ctx) { + ctx.rootContext.data[patchRecorderSymbol] = internalPatchRecorder(undefined, { + recording: false + }); + } + + function getPatchRecorder(ctx) { + return ctx.rootContext.data[patchRecorderSymbol]; + } + + return actionTrackingMiddleware(model, { + filter: function filter(ctx) { + // the primary action must be on the root object + var rootContext = ctx.rootContext; + return rootContext.target === model && rootContext.actionName === actionName; + }, + onStart: function onStart(ctx) { + if (ctx === ctx.rootContext) { + initPatchRecorder(ctx); + } + }, + onResume: function onResume(ctx) { + getPatchRecorder(ctx).recording = true; + }, + onSuspend: function onSuspend(ctx) { + getPatchRecorder(ctx).recording = false; + }, + onFinish: function onFinish(ctx, ret) { + if (ctx === ctx.rootContext) { + var patchRecorder = getPatchRecorder(ctx); + + try { + if (ret.result === ActionTrackingResult.Throw) { + // undo changes (backwards for inverse patches) + var events = patchRecorder.events; + + for (var i = events.length - 1; i >= 0; i--) { + var event = events[i]; + applyPatches(event.target, event.inversePatches, true); + } + } + } finally { + patchRecorder.dispose(); + } + } + } + }); +} +/** + * Transaction middleware as a decorator. + * + * @param target + * @param propertyKey + */ + +function transaction(target, propertyKey) { + checkModelDecoratorArgs("transaction", target, propertyKey); + addModelClassInitializer(target.constructor, function (modelInstance) { + transactionMiddleware({ + model: modelInstance, + actionName: propertyKey + }); + }); +} + +/** + * A type that represents an array of values of a given type. + * + * Example: + * ```ts + * const numberArrayType = types.array(types.number) + * ``` + * + * @typeparam T Item type. + * @param itemType Type of inner items. + * @returns + */ + +function typesArray(itemType) { + var typeInfoGen = function typeInfoGen(t) { + return new ArrayTypeInfo(t, resolveStandardType(itemType)); + }; + + return lateTypeChecker(function () { + var itemChecker = resolveTypeChecker(itemType); + + var getTypeName = function getTypeName() { + for (var _len = arguments.length, recursiveTypeCheckers = new Array(_len), _key = 0; _key < _len; _key++) { + recursiveTypeCheckers[_key] = arguments[_key]; + } + + return "Array<" + itemChecker.getTypeName.apply(itemChecker, recursiveTypeCheckers.concat([itemChecker])) + ">"; + }; + + var thisTc = new TypeChecker(function (array, path) { + if (!isArray(array)) { + return new TypeCheckError(path, getTypeName(thisTc), array); + } + + if (!itemChecker.unchecked) { + for (var i = 0; i < array.length; i++) { + var itemError = itemChecker.check(array[i], [].concat(path, [i])); + + if (itemError) { + return itemError; + } + } + } + + return null; + }, getTypeName, typeInfoGen); + return thisTc; + }, typeInfoGen); +} +/** + * `types.array` type info. + */ + +var ArrayTypeInfo = /*#__PURE__*/function (_TypeInfo) { + _inheritsLoose(ArrayTypeInfo, _TypeInfo); + + _createClass(ArrayTypeInfo, [{ + key: "itemTypeInfo", + get: function get() { + return getTypeInfo(this.itemType); + } + }]); + + function ArrayTypeInfo(thisType, itemType) { + var _this; + + _this = _TypeInfo.call(this, thisType) || this; + _this.itemType = void 0; + _this.itemType = itemType; + return _this; + } + + return ArrayTypeInfo; +}(TypeInfo); + +function tProp(typeOrDefaultValue, arg1, arg2) { + var def; + var opts = {}; + var hasDefaultValue = false; + + switch (typeof typeOrDefaultValue) { + case "string": + return tProp(typesString, typeOrDefaultValue, arg1); + + case "number": + return tProp(typesNumber, typeOrDefaultValue, arg1); + + case "boolean": + return tProp(typesBoolean, typeOrDefaultValue, arg1); + } + + if (arguments.length >= 3) { + // type, default, options + def = arg1; + hasDefaultValue = true; + opts = _extends({}, arg2); + } else if (arguments.length === 2) { + // type, default | options + if (isObject(arg1)) { + // options + opts = _extends({}, arg1); + } else { + // default + def = arg1; + hasDefaultValue = true; + } + } + + var isDefFn = typeof def === "function"; + return { + $propValueType: null, + $propCreationValueType: null, + $isOptional: null, + $instanceValueType: null, + $instanceCreationValueType: null, + defaultFn: hasDefaultValue && isDefFn ? def : noDefaultValue, + defaultValue: hasDefaultValue && !isDefFn ? def : noDefaultValue, + typeChecker: resolveStandardType(typeOrDefaultValue), + transform: undefined, + options: opts + }; +} + +/** + * Store model instance for undo/redo actions. + * Do not manipulate directly, other that creating it. + */ + +var UndoStore = /*#__PURE__*/function (_Model) { + _inheritsLoose(UndoStore, _Model); + + function UndoStore() { + return _Model.apply(this, arguments) || this; + } + + var _proto = UndoStore.prototype; + + /** + * @ignore + */ + _proto._clearUndo = function _clearUndo() { + var _this = this; + + withoutUndo(function () { + _this.undoEvents.length = 0; + }); + } + /** + * @ignore + */ + ; + + _proto._clearRedo = function _clearRedo() { + var _this2 = this; + + withoutUndo(function () { + _this2.redoEvents.length = 0; + }); + } + /** + * @ignore + */ + ; + + _proto._undo = function _undo() { + var _this3 = this; + + withoutUndo(function () { + var event = _this3.undoEvents.pop(); + + _this3.redoEvents.push(event); + }); + } + /** + * @ignore + */ + ; + + _proto._redo = function _redo() { + var _this4 = this; + + withoutUndo(function () { + var event = _this4.redoEvents.pop(); + + _this4.undoEvents.push(event); + }); + } + /** + * @ignore + */ + ; + + _proto._addUndo = function _addUndo(event) { + var _this5 = this; + + withoutUndo(function () { + _this5.undoEvents.push(event); // once an undo event is added redo queue is no longer valid + + + _this5.redoEvents.length = 0; + }); + }; + + return UndoStore; +}( /*#__PURE__*/Model({ + // TODO: add proper type checking to undo store + undoEvents: /*#__PURE__*/tProp( /*#__PURE__*/typesArray( /*#__PURE__*/typesUnchecked()), function () { + return []; + }), + redoEvents: /*#__PURE__*/tProp( /*#__PURE__*/typesArray( /*#__PURE__*/typesUnchecked()), function () { + return []; + }) +})); + +__decorate([modelAction], UndoStore.prototype, "_clearUndo", null); + +__decorate([modelAction], UndoStore.prototype, "_clearRedo", null); + +__decorate([modelAction], UndoStore.prototype, "_undo", null); + +__decorate([modelAction], UndoStore.prototype, "_redo", null); + +__decorate([modelAction], UndoStore.prototype, "_addUndo", null); + +UndoStore = /*#__PURE__*/__decorate([/*#__PURE__*/model("mobx-keystone/UndoStore")], UndoStore); +/** + * Manager class returned by `undoMiddleware` that allows you to perform undo/redo actions. + */ + +var UndoManager = /*#__PURE__*/function () { + var _proto2 = UndoManager.prototype; + + /** + * Clears the undo queue. + */ + _proto2.clearUndo = function clearUndo() { + this.store._clearUndo(); + } + /** + * The number of redo actions available. + */ + ; + + /** + * Clears the redo queue. + */ + _proto2.clearRedo = function clearRedo() { + this.store._clearRedo(); + } + /** + * Undoes the last action. + * Will throw if there is no action to undo. + */ + ; + + _proto2.undo = function undo() { + var _this6 = this; + + if (!this.canUndo) { + throw failure("nothing to undo"); + } + + var event = this.undoQueue[this.undoQueue.length - 1]; + withoutUndo(function () { + applyPatches(_this6.subtreeRoot, event.inversePatches, true); + }); + + this.store._undo(); + } + /** + * Redoes the previous action. + * Will throw if there is no action to redo. + */ + ; + + _proto2.redo = function redo() { + var _this7 = this; + + if (!this.canRedo) { + throw failure("nothing to redo"); + } + + var event = this.redoQueue[this.redoQueue.length - 1]; + withoutUndo(function () { + applyPatches(_this7.subtreeRoot, event.patches); + }); + + this.store._redo(); + } + /** + * Disposes the undo middleware. + */ + ; + + _proto2.dispose = function dispose() { + this.disposer(); + } + /** + * Creates an instance of `UndoManager`. + * Do not use directly, use `undoMiddleware` instead. + * + * @param disposer + * @param subtreeRoot + * @param [store] + */ + ; + + _createClass(UndoManager, [{ + key: "undoQueue", + + /** + * The store currently being used to store undo/redo action events. + */ + + /** + * The undo stack, where the first operation to undo will be the last of the array. + * Do not manipulate this array directly. + */ + get: function get() { + return this.store.undoEvents; + } + /** + * The redo stack, where the first operation to redo will be the last of the array. + * Do not manipulate this array directly. + */ + + }, { + key: "redoQueue", + get: function get() { + return this.store.redoEvents; + } + /** + * The number of undo actions available. + */ + + }, { + key: "undoLevels", + get: function get() { + return this.undoQueue.length; + } + /** + * If undo can be performed (if there is at least one undo action available). + */ + + }, { + key: "canUndo", + get: function get() { + return this.undoLevels > 0; + } + }, { + key: "redoLevels", + get: function get() { + return this.redoQueue.length; + } + /** + * If redo can be performed (if there is at least one redo action available) + */ + + }, { + key: "canRedo", + get: function get() { + return this.redoLevels > 0; + } + }]); + + function UndoManager(disposer, subtreeRoot, store) { + this.disposer = void 0; + this.subtreeRoot = void 0; + this.store = void 0; + this.disposer = disposer; + this.subtreeRoot = subtreeRoot; + this.store = store != null ? store : new UndoStore({}); + } + + return UndoManager; +}(); + +__decorate([mobx_esm.computed], UndoManager.prototype, "undoQueue", null); + +__decorate([mobx_esm.computed], UndoManager.prototype, "redoQueue", null); + +__decorate([mobx_esm.computed], UndoManager.prototype, "undoLevels", null); + +__decorate([mobx_esm.computed], UndoManager.prototype, "canUndo", null); + +__decorate([mobx_esm.action], UndoManager.prototype, "clearUndo", null); + +__decorate([mobx_esm.computed], UndoManager.prototype, "redoLevels", null); + +__decorate([mobx_esm.computed], UndoManager.prototype, "canRedo", null); + +__decorate([mobx_esm.action], UndoManager.prototype, "clearRedo", null); + +__decorate([mobx_esm.action], UndoManager.prototype, "undo", null); + +__decorate([mobx_esm.action], UndoManager.prototype, "redo", null); +/** + * Creates an undo middleware. + * + * @param subtreeRoot Subtree root target object. + * @param [store] Optional `UndoStore` where to store the undo/redo queues. Use this if you want to + * store such queues somewhere in your models. If none is provided it will reside in memory. + * @returns An `UndoManager` which allows you to do the manage the undo/redo operations and dispose of the middleware. + */ + + +function undoMiddleware(subtreeRoot, store) { + assertTweakedObject(subtreeRoot, "subtreeRoot"); + var patchRecorderSymbol = Symbol("patchRecorder"); + + function initPatchRecorder(ctx) { + ctx.rootContext.data[patchRecorderSymbol] = { + recorder: patchRecorder(subtreeRoot, { + recording: false, + filter: undoDisabledFilter + }), + recorderStack: 0, + undoRootContext: ctx + }; + } + + function getPatchRecorderData(ctx) { + return ctx.rootContext.data[patchRecorderSymbol]; + } + + var manager; + var middlewareDisposer = actionTrackingMiddleware(subtreeRoot, { + onStart: function onStart(ctx) { + if (!getPatchRecorderData(ctx)) { + initPatchRecorder(ctx); + } + }, + onResume: function onResume(ctx) { + var patchRecorderData = getPatchRecorderData(ctx); + patchRecorderData.recorderStack++; + patchRecorderData.recorder.recording = patchRecorderData.recorderStack > 0; + }, + onSuspend: function onSuspend(ctx) { + var patchRecorderData = getPatchRecorderData(ctx); + patchRecorderData.recorderStack--; + patchRecorderData.recorder.recording = patchRecorderData.recorderStack > 0; + }, + onFinish: function onFinish(ctx) { + var patchRecorderData = getPatchRecorderData(ctx); + + if (patchRecorderData && patchRecorderData.undoRootContext === ctx) { + var _patchRecorder = patchRecorderData.recorder; + + if (_patchRecorder.events.length > 0) { + var patches = []; + var inversePatches = []; + + for (var _iterator = _createForOfIteratorHelperLoose(_patchRecorder.events), _step; !(_step = _iterator()).done;) { + var event = _step.value; + patches.push.apply(patches, event.patches); + inversePatches.push.apply(inversePatches, event.inversePatches); + } + + manager.store._addUndo({ + targetPath: fastGetRootPath(ctx.target).path, + actionName: ctx.actionName, + patches: patches, + inversePatches: inversePatches + }); + } + + _patchRecorder.dispose(); + } + } + }); + manager = new UndoManager(middlewareDisposer, subtreeRoot, store); + return manager; +} +var undoDisabled = false; + +var undoDisabledFilter = function undoDisabledFilter() { + return !undoDisabled; +}; +/** + * Skips the undo recording mechanism for the code block that gets run synchronously inside. + * + * @typeparam T + * @param fn + * @returns + */ + + +function withoutUndo(fn) { + var savedUndoDisabled = undoDisabled; + undoDisabled = true; + + try { + return fn(); + } finally { + undoDisabled = savedUndoDisabled; + } +} + +function getContextValue(contextValue) { + if (contextValue.type === "value") { + return contextValue.value; + } else { + return contextValue.value.get(); + } +} + +var ContextClass = /*#__PURE__*/function () { + var _proto = ContextClass.prototype; + + _proto.getNodeAtom = function getNodeAtom(node) { + var atomPerNode = this.nodeAtom.get(node); + + if (!atomPerNode) { + atomPerNode = (0,mobx_esm.createAtom)("contextValue"); + this.nodeAtom.set(node, atomPerNode); + } + + return atomPerNode; + }; + + _proto.fastGet = function fastGet(node) { + this.getNodeAtom(node).reportObserved(); + var obsForNode = this.nodeContextValue.get(node); + + if (obsForNode) { + return getContextValue(obsForNode); + } + + var parent = fastGetParent(node); + + if (!parent) { + return this.getDefault(); + } + + return this.fastGet(parent); + }; + + _proto.get = function get(node) { + assertTweakedObject(node, "node"); + return this.fastGet(node); + }; + + _proto.fastGetProviderNode = function fastGetProviderNode(node) { + this.getNodeAtom(node).reportObserved(); + var obsForNode = this.nodeContextValue.get(node); + + if (obsForNode) { + return node; + } + + var parent = fastGetParent(node); + + if (!parent) { + return undefined; + } + + return this.fastGetProviderNode(parent); + }; + + _proto.getProviderNode = function getProviderNode(node) { + assertTweakedObject(node, "node"); + return this.fastGetProviderNode(node); + }; + + _proto.getDefault = function getDefault() { + return getContextValue(this.defaultContextValue); + }; + + _proto.setDefault = function setDefault(value) { + this.defaultContextValue = { + type: "value", + value: value + }; + }; + + _proto.setDefaultComputed = function setDefaultComputed(valueFn) { + this.defaultContextValue = { + type: "computed", + value: (0,mobx_esm.computed)(valueFn) + }; + }; + + _proto.set = function set(node, value) { + assertTweakedObject(node, "node"); + this.nodeContextValue.set(node, { + type: "value", + value: value + }); + this.getNodeAtom(node).reportChanged(); + }; + + _proto.setComputed = function setComputed(node, valueFn) { + assertTweakedObject(node, "node"); + this.nodeContextValue.set(node, { + type: "computed", + value: (0,mobx_esm.computed)(valueFn) + }); + this.getNodeAtom(node).reportChanged(); + }; + + _proto.unset = function unset(node) { + assertTweakedObject(node, "node"); + this.nodeContextValue["delete"](node); + this.getNodeAtom(node).reportChanged(); + }; + + function ContextClass(defaultValue) { + this.defaultContextValue = void 0; + this.nodeContextValue = new WeakMap(); + this.nodeAtom = new WeakMap(); + + if (getMobxVersion() >= 6) { + (0,mobx_esm.makeObservable)(this); + } + + this.setDefault(defaultValue); + } + + return ContextClass; +}(); + +__decorate([mobx_esm.observable.ref], ContextClass.prototype, "defaultContextValue", void 0); + +__decorate([mobx_esm.action], ContextClass.prototype, "setDefault", null); + +__decorate([mobx_esm.action], ContextClass.prototype, "setDefaultComputed", null); + +__decorate([mobx_esm.action], ContextClass.prototype, "set", null); + +__decorate([mobx_esm.action], ContextClass.prototype, "setComputed", null); + +__decorate([mobx_esm.action], ContextClass.prototype, "unset", null); // base + + +function createContext(defaultValue) { + return new ContextClass(defaultValue); +} + +/** + * @ignore + * @internal + */ + +function extendFnModelFlowActions(fnModelObj, namespace, flowActions) { + for (var _i = 0, _Object$entries = Object.entries(flowActions); _i < _Object$entries.length; _i++) { + var _Object$entries$_i = _Object$entries[_i], + name = _Object$entries$_i[0], + fn = _Object$entries$_i[1]; + addActionToFnModel(fnModelObj, namespace, name, fn, true); + } + + return fnModelObj; +} + +/** + * @ignore + * @internal + */ + +function extendFnModelSetterActions(fnModelObj, namespace, setterActions) { + var _loop = function _loop() { + var _Object$entries$_i = _Object$entries[_i], + name = _Object$entries$_i[0], + fieldName = _Object$entries$_i[1]; + + // make strings setters + var fn = function fn(value) { + this[fieldName] = value; + }; + + addActionToFnModel(fnModelObj, namespace, name, fn, false); + }; + + for (var _i = 0, _Object$entries = Object.entries(setterActions); _i < _Object$entries.length; _i++) { + _loop(); + } + + return fnModelObj; +} + +/** + * @ignore + * @internal + */ + +function extendFnModelViews(fnModelObj, views) { + var _loop = function _loop() { + var _Object$entries$_i = _Object$entries[_i], + name = _Object$entries$_i[0], + fnOrFnWithOptions = _Object$entries$_i[1]; + assertFnModelKeyNotInUse(fnModelObj, name); + var computedsPerObject = new WeakMap(); + var fn = void 0; + var equals = void 0; + + if (typeof fnOrFnWithOptions === "function") { + fn = fnOrFnWithOptions; + } else { + fn = fnOrFnWithOptions.get; + equals = fnOrFnWithOptions.equals; + } + + fnModelObj[name] = function (target) { + var computedFn = computedsPerObject.get(target); + + if (!computedFn) { + computedFn = (0,mobx_esm.computed)(fn, { + name: name, + context: target, + equals: equals + }); + computedsPerObject.set(target, computedFn); + } + + return computedFn.get(); + }; + }; + + for (var _i = 0, _Object$entries = Object.entries(views); _i < _Object$entries.length; _i++) { + _loop(); + } + + return fnModelObj; +} + +function fnModel(arg1, arg2) { + var actualType = arguments.length >= 2 ? arg1 : null; + var namespace = arguments.length >= 2 ? arg2 : arg1; + assertIsString(namespace, "namespace"); + var fnModelObj = { + create: actualType ? fnModelCreateWithType.bind(undefined, actualType) : fnModelCreateWithoutType, + type: actualType + }; + fnModelObj.views = extendFnModelViews.bind(undefined, fnModelObj); + fnModelObj.actions = extendFnModelActions.bind(undefined, fnModelObj, namespace); + fnModelObj.flowActions = extendFnModelFlowActions.bind(undefined, fnModelObj, namespace); + fnModelObj.setterActions = extendFnModelSetterActions.bind(undefined, fnModelObj, namespace); + return fnModelObj; +} + +function fnModelCreateWithoutType(data) { + return toTreeNode(data); +} + +function fnModelCreateWithType(actualType, data) { + if (isModelAutoTypeCheckingEnabled()) { + var errors = typeCheck(actualType, data); + + if (errors) { + errors["throw"](data); + } + } + + return toTreeNode(data); +} + +function _splice() { + return this.splice.apply(this, arguments); +} + +var _fnArray = /*#__PURE__*/fnModel("mobx-keystone/fnArray").actions({ + set: function set$1(index, value) { + (0,mobx_esm.set)(this, index, value); + }, + "delete": function _delete(index) { + return (0,mobx_esm.remove)(this, "" + index); + }, + setLength: function setLength(length) { + this.length = length; + }, + concat: function concat() { + return this.concat.apply(this, arguments); + }, + copyWithin: function copyWithin(target, start, end) { + return this.copyWithin(target, start, end); + }, + fill: function fill(value, start, end) { + return this.fill(value, start, end); + }, + pop: function pop() { + return this.pop(); + }, + push: function push() { + return this.push.apply(this, arguments); + }, + reverse: function reverse() { + return this.reverse(); + }, + shift: function shift() { + return this.shift(); + }, + slice: function slice(start, end) { + return this.slice(start, end); + }, + sort: function sort(compareFn) { + return this.sort(compareFn); + }, + splice: _splice, + unshift: function unshift() { + return this.unshift.apply(this, arguments); + } +}); + +var fnArray = { + set: _fnArray.set, + "delete": _fnArray["delete"], + setLength: _fnArray.setLength, + concat: _fnArray.concat, + copyWithin: _fnArray.copyWithin, + fill: _fnArray.fill, + pop: _fnArray.pop, + push: _fnArray.push, + reverse: _fnArray.reverse, + shift: _fnArray.shift, + slice: _fnArray.slice, + sort: _fnArray.sort, + splice: _fnArray.splice, + unshift: _fnArray.unshift, + create: _fnArray.create +}; + +var _fnObject = /*#__PURE__*/fnModel("mobx-keystone/fnObject").actions({ + set: function set$1(key, value) { + (0,mobx_esm.set)(this, key, value); + }, + "delete": function _delete(key) { + return (0,mobx_esm.remove)(this, key); + }, + call: function call(methodName) { + for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) { + args[_key - 1] = arguments[_key]; + } + + return this[methodName].apply(this, args); + } +}); + +var fnObject = { + set: _fnObject.set, + "delete": _fnObject["delete"], + call: _fnObject.call, + create: _fnObject.create +}; + +var Lock = /*#__PURE__*/function () { + function Lock() { + this._locked = true; + } + + var _proto = Lock.prototype; + + _proto.unlockedFn = function unlockedFn(fn) { + var _this = this; + + var innerFn = function innerFn() { + var oldLocked = _this._locked; + _this._locked = false; + + try { + return fn.apply(void 0, arguments); + } finally { + _this._locked = oldLocked; + } + }; + + return innerFn; + }; + + _proto.withUnlock = function withUnlock(fn) { + var oldLocked = this._locked; + this._locked = false; + + try { + return fn(); + } finally { + this._locked = oldLocked; + } + }; + + _createClass(Lock, [{ + key: "isLocked", + get: function get() { + return this._locked; + } + }]); + + return Lock; +}(); + +/** + * Creates a tag data accessor for a target object of a certain type. + * Tag data will be lazy created on access and reused for the same target object. + * + * @typeparam Target Target type. + * @typeparam TagData Tag data type. + * @param tagDataConstructor Function that will be called the first time the tag + * for a given object is requested. + * @returns The tag data associated with the target object. + */ +function tag(tagDataConstructor) { + var map = new WeakMap(); + return { + "for": function _for(target) { + if (!map.has(target)) { + var data = tagDataConstructor(target); + map.set(target, data); + return data; + } else { + return map.get(target); + } + } + }; +} + +var observableMapBackedByObservableObject = /*#__PURE__*/(0,mobx_esm.action)(function (obj) { + if (inDevMode()) { + if (!(0,mobx_esm.isObservableObject)(obj)) { + throw failure("assertion failed: expected an observable object"); + } + } + + var map = mobx_esm.observable.map(); + map.dataObject = obj; + var keys = Object.keys(obj); + + for (var i = 0; i < keys.length; i++) { + var k = keys[i]; + map.set(k, obj[k]); + } + + var mutationLock = new Lock(); // when the object changes the map changes + + (0,mobx_esm.observe)(obj, (0,mobx_esm.action)(mutationLock.unlockedFn(function (change) { + switch (change.type) { + case "add": + case "update": + { + map.set(change.name, change.newValue); + break; + } + + case "remove": + { + map["delete"](change.name); + break; + } + } + }))); // when the map changes also change the object + + (0,mobx_esm.intercept)(map, (0,mobx_esm.action)(function (change) { + if (!mutationLock.isLocked) { + return null; // already changed + } + + switch (change.type) { + case "add": + case "update": + { + (0,mobx_esm.set)(obj, change.name, change.newValue); + break; + } + + case "delete": + { + (0,mobx_esm.remove)(obj, change.name); + break; + } + } + + return change; + })); + return map; +}); +var observableMapBackedByObservableArray = /*#__PURE__*/(0,mobx_esm.action)(function (array) { + if (inDevMode()) { + if (!(0,mobx_esm.isObservableArray)(array)) { + throw failure("assertion failed: expected an observable array"); + } + } + + var map = mobx_esm.observable.map(array); + map.dataObject = array; + + if (map.size !== array.length) { + throw failure("arrays backing a map cannot contain duplicate keys"); + } + + var mutationLock = new Lock(); // for speed reasons we will just assume distinct values are only once in the array + // also we assume tuples themselves are immutable + // when the array changes the map changes + + (0,mobx_esm.observe)(array, (0,mobx_esm.action)(mutationLock.unlockedFn(function (change + /*IArrayDidChange<[string, T]>*/ + ) { + switch (change.type) { + case "splice": + { + { + var removed = change.removed; + + for (var i = 0; i < removed.length; i++) { + map["delete"](removed[i][0]); + } + } + { + var added = change.added; + + for (var _i = 0; _i < added.length; _i++) { + map.set(added[_i][0], added[_i][1]); + } + } + break; + } + + case "update": + { + map["delete"](change.oldValue[0]); + map.set(change.newValue[0], change.newValue[1]); + break; + } + } + }))); // when the map changes also change the array + + (0,mobx_esm.intercept)(map, (0,mobx_esm.action)(function (change) { + if (!mutationLock.isLocked) { + return null; // already changed + } + + switch (change.type) { + case "update": + { + // replace the whole tuple to keep tuple immutability + var i = array.findIndex(function (i) { + return i[0] === change.name; + }); + array[i] = [change.name, change.newValue]; + break; + } + + case "add": + { + array.push([change.name, change.newValue]); + break; + } + + case "delete": + { + var _i2 = array.findIndex(function (i) { + return i[0] === change.name; + }); + + if (_i2 >= 0) { + array.splice(_i2, 1); + } + + break; + } + } + + return change; + })); + return map; +}); +var asMapTag = /*#__PURE__*/tag(function (objOrArray) { + if (isArray(objOrArray)) { + assertIsObservableArray(objOrArray, "objOrArray"); + return observableMapBackedByObservableArray(objOrArray); + } else { + assertIsObservableObject(objOrArray, "objOrArray"); + return observableMapBackedByObservableObject(objOrArray); + } +}); +/** + * Wraps an observable object or a tuple array to offer a map like interface. + * + * @param objOrArray Object or array. + */ + +function asMap(objOrArray) { + return asMapTag["for"](objOrArray); +} +/** + * Converts a map to an object. If the map is a collection wrapper it will return the backed object. + * + * @param map + */ + +function mapToObject(map) { + assertIsMap(map, "map"); + var dataObject = map.dataObject; + + if (dataObject && !isArray(dataObject)) { + return dataObject; + } + + var obj = {}; + + for (var _iterator = _createForOfIteratorHelperLoose(map.keys()), _step; !(_step = _iterator()).done;) { + var k = _step.value; + obj[k] = map.get(k); + } + + return obj; +} +/** + * Converts a map to an array. If the map is a collection wrapper it will return the backed array. + * + * @param map + */ + +function mapToArray(map) { + assertIsMap(map, "map"); + var dataObject = map.dataObject; + + if (dataObject && isArray(dataObject)) { + return dataObject; + } + + var arr = []; + + for (var _iterator2 = _createForOfIteratorHelperLoose(map.keys()), _step2; !(_step2 = _iterator2()).done;) { + var k = _step2.value; + arr.push([k, map.get(k)]); + } + + return arr; +} + +var arrayAsMapInnerTransform = { + propToData: function propToData(arr) { + return isArray(arr) ? asMap(arr) : arr; + }, + dataToProp: function dataToProp(newMap) { + if (!isMap(newMap)) { + return newMap; + } + + return mapToArray(newMap); + } +}; +function prop_mapArray(def) { + return transformedProp(prop(def), arrayAsMapInnerTransform, true); +} +function tProp_mapArray(typeOrDefaultValue, def) { + return transformedProp(tProp(typeOrDefaultValue, def), arrayAsMapInnerTransform, true); +} + +var observableSetBackedByObservableArray = /*#__PURE__*/(0,mobx_esm.action)(function (array) { + if (inDevMode()) { + if (!(0,mobx_esm.isObservableArray)(array)) { + throw failure("assertion failed: expected an observable array"); + } + } + + var set = mobx_esm.observable.set(array); + set.dataObject = array; + + if (set.size !== array.length) { + throw failure("arrays backing a set cannot contain duplicate values"); + } + + var mutationLock = new Lock(); // for speed reasons we will just assume distinct values are only once in the array + // when the array changes the set changes + + (0,mobx_esm.observe)(array, (0,mobx_esm.action)(mutationLock.unlockedFn(function (change + /*IArrayDidChange*/ + ) { + switch (change.type) { + case "splice": + { + { + var removed = change.removed; + + for (var i = 0; i < removed.length; i++) { + set["delete"](removed[i]); + } + } + { + var added = change.added; + + for (var _i = 0; _i < added.length; _i++) { + set.add(added[_i]); + } + } + break; + } + + case "update": + { + set["delete"](change.oldValue); + set.add(change.newValue); + break; + } + } + }))); // when the set changes also change the array + + (0,mobx_esm.intercept)(set, (0,mobx_esm.action)(function (change) { + if (!mutationLock.isLocked) { + return null; // already changed + } + + switch (change.type) { + case "add": + { + array.push(change.newValue); + break; + } + + case "delete": + { + var i = array.indexOf(change.oldValue); + + if (i >= 0) { + array.splice(i, 1); + } + + break; + } + } + + return change; + })); + return set; +}); +var asSetTag = /*#__PURE__*/tag(function (array) { + assertIsObservableArray(array, "array"); + return observableSetBackedByObservableArray(array); +}); +/** + * Wraps an observable array to offer a set like interface. + * + * @param array + */ + +function asSet(array) { + return asSetTag["for"](array); +} +/** + * Converts a set to an array. If the set is a collection wrapper it will return the backed array. + * + * @param set + */ + +function setToArray(set) { + assertIsSet(set, "set"); + var dataObject = set.dataObject; + + if (dataObject) { + return dataObject; + } + + return Array.from(set.values()); +} + +var arrayAsSetInnerTransform = { + propToData: function propToData(arr) { + return isArray(arr) ? asSet(arr) : arr; + }, + dataToProp: function dataToProp(newSet) { + return isSet(newSet) ? setToArray(newSet) : newSet; + } +}; +function prop_setArray(def) { + return transformedProp(prop(def), arrayAsSetInnerTransform, true); +} +function tProp_setArray(typeOrDefaultValue, def) { + return transformedProp(tProp(typeOrDefaultValue, def), arrayAsSetInnerTransform, true); +} + +var objectAsMapInnerTransform = { + propToData: function propToData(obj) { + return isObject(obj) ? asMap(obj) : obj; + }, + dataToProp: function dataToProp(newMap) { + if (!isMap(newMap)) { + return newMap; + } + + return mapToObject(newMap); + } +}; +function prop_mapObject(def) { + return transformedProp(prop(def), objectAsMapInnerTransform, true); +} +function tProp_mapObject(typeOrDefaultValue, def) { + return transformedProp(tProp(typeOrDefaultValue, def), objectAsMapInnerTransform, true); +} + +/** + * @ignore + * @internal + */ + +function immutableDate(value) { + return new InternalImmutableDate(value); +} +var errMessage = "this Date object is immutable"; + +var InternalImmutableDate = /*#__PURE__*/function (_Date) { + _inheritsLoose(InternalImmutableDate, _Date); + + function InternalImmutableDate() { + return _Date.apply(this, arguments) || this; + } + + var _proto = InternalImmutableDate.prototype; + + // disable mutable methods + _proto.setTime = function setTime() { + throw failure(errMessage); + }; + + _proto.setMilliseconds = function setMilliseconds() { + throw failure(errMessage); + }; + + _proto.setUTCMilliseconds = function setUTCMilliseconds() { + throw failure(errMessage); + }; + + _proto.setSeconds = function setSeconds() { + throw failure(errMessage); + }; + + _proto.setUTCSeconds = function setUTCSeconds() { + throw failure(errMessage); + }; + + _proto.setMinutes = function setMinutes() { + throw failure(errMessage); + }; + + _proto.setUTCMinutes = function setUTCMinutes() { + throw failure(errMessage); + }; + + _proto.setHours = function setHours() { + throw failure(errMessage); + }; + + _proto.setUTCHours = function setUTCHours() { + throw failure(errMessage); + }; + + _proto.setDate = function setDate() { + throw failure(errMessage); + }; + + _proto.setUTCDate = function setUTCDate() { + throw failure(errMessage); + }; + + _proto.setMonth = function setMonth() { + throw failure(errMessage); + }; + + _proto.setUTCMonth = function setUTCMonth() { + throw failure(errMessage); + }; + + _proto.setFullYear = function setFullYear() { + throw failure(errMessage); + }; + + _proto.setUTCFullYear = function setUTCFullYear() { + throw failure(errMessage); + }; + + return InternalImmutableDate; +}( /*#__PURE__*/_wrapNativeSuper(Date)); + +/** + * Property transform for ISO date strings to Date objects and vice-versa. + * If a model property, consider using `prop_dateString` or `tProp_dateString` instead. + */ + +var stringAsDate = /*#__PURE__*/propTransform({ + propToData: function propToData(prop) { + if (typeof prop !== "string") { + return prop; + } + + return immutableDate(prop); + }, + dataToProp: function dataToProp(date) { + return date instanceof Date ? date.toJSON() : date; + } +}); +function prop_dateString(def) { + return transformedProp(prop(def), stringAsDate, true); +} +function tProp_dateString(typeOrDefaultValue, def) { + return transformedProp(tProp(typeOrDefaultValue, def), stringAsDate, true); +} + +/** + * Property transform for number timestamps to Date objects and vice-versa. + * If a model property, consider using `prop_dateTimestamp` or `tProp_dateTimestamp` instead. + */ + +var timestampAsDate = /*#__PURE__*/propTransform({ + propToData: function propToData(prop) { + if (typeof prop !== "number") { + return prop; + } + + return immutableDate(prop); + }, + dataToProp: function dataToProp(date) { + return date instanceof Date ? date.getTime() : date; + } +}); +function prop_dateTimestamp(def) { + return transformedProp(prop(def), timestampAsDate, true); +} +function tProp_dateTimestamp(typeOrDefaultValue, def) { + return transformedProp(tProp(typeOrDefaultValue, def), timestampAsDate, true); +} + +/** + * Connects a tree node to a redux dev tools instance. + * + * @param remotedevPackage The remotedev package (usually the result of `require("remoteDev")`) (https://www.npmjs.com/package/remotedev). + * @param remotedevConnection The result of a connect method from the remotedev package (usually the result of `remoteDev.connectViaExtension(...)`). + * @param target Object to use as root. + * @param storeName Name to be shown in the redux dev tools. + * @param [options] Optional options object. `logArgsNearName` if it should show the arguments near the action name (default is `true`). + */ + +function connectReduxDevTools(remotedevPackage, remotedevConnection, target, options) { + assertTweakedObject(target, "target"); + + var opts = _extends({ + logArgsNearName: true + }, options); + + var handlingMonitorAction = 0; // subscribe to change state (if need more than just logging) + + remotedevConnection.subscribe(function (message) { + if (message.type === "DISPATCH") { + handleMonitorActions(remotedevConnection, target, message); + } + }); + var initialState = getSnapshot(target); + remotedevConnection.init(initialState); + var currentActionId = 0; + var actionIdSymbol = Symbol("actionId"); + actionTrackingMiddleware(target, { + onStart: function onStart(ctx) { + ctx.data[actionIdSymbol] = currentActionId++; + }, + onResume: function onResume(ctx) { + // give a chance to the parent to log its own changes before the child starts + if (ctx.parentContext) { + log(ctx.parentContext, undefined); + } + + log(ctx, undefined); + }, + onSuspend: function onSuspend(ctx) { + log(ctx, undefined); + }, + onFinish: function onFinish(ctx, ret) { + log(ctx, ret.result); + } + }); + + function handleMonitorActions(remotedev2, target2, message) { + try { + handlingMonitorAction++; + + switch (message.payload.type) { + case "RESET": + applySnapshot(target2, initialState); + return remotedev2.init(initialState); + + case "COMMIT": + return remotedev2.init(getSnapshot(target2)); + + case "ROLLBACK": + return remotedev2.init(remotedevPackage.extractState(message)); + + case "JUMP_TO_STATE": + case "JUMP_TO_ACTION": + applySnapshot(target2, remotedevPackage.extractState(message)); + return; + + case "IMPORT_STATE": + var nextLiftedState = message.payload.nextLiftedState; + var computedStates = nextLiftedState.computedStates; + applySnapshot(target2, computedStates[computedStates.length - 1].state); + remotedev2.send(null, nextLiftedState); + return; + + default: + } + } finally { + handlingMonitorAction--; + } + } + + var lastLoggedSnapshot = initialState; + + function log(ctx, result) { + if (handlingMonitorAction) { + return; + } + + var sn = getSnapshot(target); // ignore actions that don't change anything (unless it is a throw) + + if (sn === lastLoggedSnapshot && result !== ActionTrackingResult.Throw) { + return; + } + + lastLoggedSnapshot = sn; + var rootPath = fastGetRootPath(ctx.target); + var name = getActionContextNameAndTypePath(ctx, rootPath, result); + var copy = { + type: name, + path: rootPath.path, + args: ctx.args + }; + remotedevConnection.send(copy, sn); + } + + function getActionContextNameAndTypePath(ctx, rootPath, result) { + var pathStr = "[/" + rootPath.path.join("/") + "] "; + var name = pathStr + ctx.actionName; + + if (opts.logArgsNearName) { + var args = ctx.args.map(function (a) { + try { + return JSON.stringify(a); + } catch (_unused) { + return "**unserializable**"; + } + }).join(", "); + + if (args.length > 64) { + args = args.slice(0, 64) + "..."; + } + + name += "(" + args + ")"; + } + + var actionId = ctx.data[actionIdSymbol]; + name += " (id " + (actionId !== undefined ? actionId : "?"); + + if (ctx.type === ActionContextActionType.Async) { + name += ", async"; + } + + name += ")"; + + if (result === ActionTrackingResult.Throw) { + name += " -error thrown-"; + } + + if (ctx.parentContext) { + var parentName = getActionContextNameAndTypePath(ctx.parentContext, fastGetRootPath(ctx.parentContext.target), undefined); + + if (parentName) { + name = parentName + " >>> " + name; + } + } + + return name; + } +} + +/** + * Adds a reaction that will trigger every time an snapshot changes. + * + * @typeparam T Object type. + * @param node Object to get the snapshot from. + * @param listener Function that will be triggered when the snapshot changes. + * @returns A disposer. + */ + +function onSnapshot(node, listener) { + assertTweakedObject(node, "node"); + var currentSnapshot = getSnapshot(node); + return (0,mobx_esm.reaction)(function () { + return getSnapshot(node); + }, function (newSnapshot) { + var prevSn = currentSnapshot; + currentSnapshot = newSnapshot; + listener(newSnapshot, prevSn); + }); +} + +var reduxActionType = "applyAction"; +/** + * Transforms an action call into a redux action. + * + * @param actionCall Action call. + * @returns A redux action. + */ + +function actionCallToReduxAction(actionCall) { + return { + type: reduxActionType, + payload: actionCall + }; +} +/** + * Generates a redux compatible store out of a mobx-keystone object. + * + * @template T Object type. + * @param target Root object. + * @param middlewares Optional list of redux middlewares. + * @returns A redux compatible store. + */ + +function asReduxStore(target) { + assertTweakedObject(target, "target"); + + var defaultDispatch = function defaultDispatch(action) { + if (action.type !== reduxActionType) { + throw failure("action type was expected to be '" + reduxActionType + "', but it was '" + action.type + "'"); + } + + applyAction(target, action.payload); + return action; + }; + + var store = { + getState: function getState() { + return getSnapshot(target); + }, + dispatch: function dispatch(action) { + return runMiddlewares(action, runners, defaultDispatch); + }, + subscribe: function subscribe(listener) { + return onSnapshot(target, listener); + } + }; + + for (var _len = arguments.length, middlewares = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) { + middlewares[_key - 1] = arguments[_key]; + } + + var runners = middlewares.map(function (mw) { + return mw(store); + }); + return store; +} + +function runMiddlewares(initialAction, runners, next) { + var i = 0; + + function runNextMiddleware(action) { + var runner = runners[i]; + i++; + + if (runner) { + return runner(runNextMiddleware)(action); + } else { + return next(action); + } + } + + return runNextMiddleware(initialAction); +} + +/** + * A reference model base type. + * Use `customRef` to create a custom ref constructor. + */ + +var Ref = /*#__PURE__*/function (_Model) { + _inheritsLoose(Ref, _Model); + + function Ref() { + return _Model.apply(this, arguments) || this; + } + + _createClass(Ref, [{ + key: "maybeCurrent", + + /** + * The object this reference points to, or `undefined` if the reference is currently invalid. + */ + get: function get() { + return this.resolve(); + } + /** + * If the reference is currently valid. + */ + + }, { + key: "isValid", + get: function get() { + return !!this.maybeCurrent; + } + /** + * The object this reference points to, or throws if invalid. + */ + + }, { + key: "current", + get: function get() { + var current = this.maybeCurrent; + + if (!current) { + throw failure("a reference of type '" + this[modelTypeKey] + "' could not resolve an object with id '" + this.id + "'"); + } + + return current; + } + }]); + + return Ref; +}( /*#__PURE__*/Model({ + /** + * Reference id. + */ + id: /*#__PURE__*/tProp(typesString) +})); + +__decorate([mobx_esm.computed], Ref.prototype, "maybeCurrent", null); + +__decorate([mobx_esm.computed], Ref.prototype, "isValid", null); + +__decorate([mobx_esm.computed], Ref.prototype, "current", null); +/** + * Checks if a ref object is of a given ref type. + * + * @typeparam T Referenced object type. + * @param ref Reference object. + * @param refType Reference type. + * @returns `true` if it is of the given type, false otherwise. + */ + + +function isRefOfType(ref, refType) { + return ref instanceof refType.refClass; +} + +/** + * Back-references from object to the references that point to it. + */ + +var objectBackRefs = /*#__PURE__*/new WeakMap(); +/** + * @ignore + * @internal + */ + +function internalCustomRef(modelTypeId, resolverGen, getId, onResolvedValueChange) { + var _temp; + + var CustomRef = (_temp = /*#__PURE__*/function (_Ref) { + _inheritsLoose(CustomRef, _Ref); + + function CustomRef() { + var _this; + + for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) { + args[_key] = arguments[_key]; + } + + _this = _Ref.call.apply(_Ref, [this].concat(args)) || this; + _this.resolver = void 0; + return _this; + } + + var _proto = CustomRef.prototype; + + _proto.resolve = function resolve() { + if (!this.resolver) { + this.resolver = resolverGen(this); + } + + return this.resolver(this); + }; + + _proto.onInit = function onInit() { + var _this2 = this; + + // listen to changes + var savedOldTarget; + var savedFirstTime = true; // according to mwestrate this won't leak as long as we don't keep the disposer around + + (0,mobx_esm.reaction)(function () { + return _this2.maybeCurrent; + }, function (newTarget) { + var oldTarget = savedOldTarget; + var firstTime = savedFirstTime; // update early in case of thrown exceptions + + savedOldTarget = newTarget; + savedFirstTime = false; + updateBackRefs(_this2, fn, newTarget, oldTarget); + + if (!firstTime && onResolvedValueChange && newTarget !== oldTarget) { + onResolvedValueChange(_this2, newTarget, oldTarget); + } + }, { + fireImmediately: true + }); + }; + + return CustomRef; + }(Ref), _temp); + CustomRef = __decorate([model(modelTypeId)], CustomRef); + + var fn = function fn(target) { + var id; + + if (typeof target === "string") { + id = target; + } else { + assertIsObject(target, "target"); + id = getId(target); + } + + if (typeof id !== "string") { + throw failure("ref target object must have an id of string type"); + } + + var ref = new CustomRef({ + id: id + }); + return ref; + }; + + fn.refClass = CustomRef; + return fn; +} +/** + * Uses a model `getRefId()` method whenever possible to get a reference ID. + * If the model does not have an implementation of that method it returns `undefined`. + * If the model has an implementation, but that implementation returns anything other than + * a `string` it will throw. + * + * @param target Target object to get the ID from. + * @returns The string ID or `undefined`. + */ + +function getModelRefId(target) { + if (isModel(target) && target.getRefId) { + var id = target.getRefId(); + + if (typeof id !== "string") { + throw failure("'getRefId()' must return a string when present"); + } + + return id; + } + + return undefined; +} + +function getBackRefs(target, refType) { + var backRefs = objectBackRefs.get(target); + + if (!backRefs) { + backRefs = { + all: mobx_esm.observable.set(undefined, { + deep: false + }), + byType: new WeakMap() + }; + objectBackRefs.set(target, backRefs); + } + + if (!refType) { + return backRefs.all; + } else { + var byType = backRefs.byType.get(refType); + + if (!byType) { + byType = mobx_esm.observable.set(undefined, { + deep: false + }); + backRefs.byType.set(refType, byType); + } + + return byType; + } +} +/** + * Gets all references that resolve to a given object. + * + * @typeparam T Referenced object type. + * @param target Node the references point to. + * @param [refType] Pass it to filter by only references of a given type, or do not to get references of any type. + * @returns An observable set with all reference objects that point to the given object. + */ + + +function getRefsResolvingTo(target, refType) { + assertTweakedObject(target, "target"); + var refTypeObject = refType; + return getBackRefs(target, refTypeObject); +} + +function updateBackRefs(ref, refClass, newTarget, oldTarget) { + if (newTarget === oldTarget) { + return; + } + + if (oldTarget) { + getBackRefs(oldTarget)["delete"](ref); + getBackRefs(oldTarget, refClass)["delete"](ref); + } + + if (newTarget) { + getBackRefs(newTarget).add(ref); + getBackRefs(newTarget, refClass).add(ref); + } +} + +/** + * Creates a custom ref to an object, which in its snapshot form has an id. + * + * @typeparam T Target object type. + * @param modelTypeId Unique model type id. + * @param options Custom reference options. + * @returns A function that allows you to construct that type of custom reference. + */ + +var customRef = /*#__PURE__*/(0,mobx_esm.action)("customRef", function (modelTypeId, options) { + var _options$getId; + + var getId = (_options$getId = options.getId) != null ? _options$getId : getModelRefId; + return internalCustomRef(modelTypeId, function () { + return options.resolve; + }, getId, options.onResolvedValueChange); +}); + +var computedIdTrees = /*#__PURE__*/new WeakMap(); +/** + * Creates a root ref to an object, which in its snapshot form has an id. + * A root ref will only be able to resolve references as long as both the Ref + * and the referenced object share a common root. + * + * @typeparam T Target object type. + * @param modelTypeId Unique model type id. + * @param [options] Root reference options. + * @returns A function that allows you to construct that type of root reference. + */ + +var rootRef = /*#__PURE__*/(0,mobx_esm.action)("rootRef", function (modelTypeId, options) { + var _options$getId; + + var getId = (_options$getId = options == null ? void 0 : options.getId) != null ? _options$getId : getModelRefId; + var onResolvedValueChange = options == null ? void 0 : options.onResolvedValueChange; // cache/reuse computedIdTrees for same getId function + + var computedIdTree = computedIdTrees.get(getId); + + if (!computedIdTree) { + computedIdTree = computedWalkTreeAggregate(getId); + computedIdTrees.set(getId, computedIdTree); + } + + var resolverGen = function resolverGen(ref) { + var cachedTarget; + return function () { + var refRoot = fastGetRoot(ref); + + if (isRefRootCachedTargetOk(ref, refRoot, cachedTarget, getId)) { + return cachedTarget; + } // when not found, everytime a child is added/removed or its id changes we will perform another search + // this search is only done once for every distinct getId function + + + var idMap = computedIdTree.walk(refRoot); + var newTarget = idMap ? idMap.get(ref.id) : undefined; + + if (newTarget) { + cachedTarget = newTarget; + } + + return newTarget; + }; + }; + + return internalCustomRef(modelTypeId, resolverGen, getId, onResolvedValueChange); +}); + +function isRefRootCachedTargetOk(ref, refRoot, cachedTarget, getId) { + if (!cachedTarget) return false; + if (ref.id !== getId(cachedTarget)) return false; + if (refRoot !== fastGetRoot(cachedTarget)) return false; + return true; +} + +/** + * Clones an object by doing a `fromSnapshot(getSnapshot(value), { generateNewIds: true })`. + * + * @typeparam T Object type. + * @param node Object to clone. + * @param [options] Options. + * @returns The cloned object. + */ + +function clone(node, options) { + assertTweakedObject(node, "node"); + + var opts = _extends({ + generateNewIds: true + }, options); + + var sn = getSnapshot(node); + return fromSnapshot(sn, opts); +} + +/** + * Deeply compares two values. + * + * Supported values are: + * - Primitives + * - Boxed observables + * - Objects, observable objects + * - Arrays, observable arrays + * - Typed arrays + * - Maps, observable maps + * - Sets, observable sets + * - Tree nodes (optimized by using snapshot comparison internally) + * + * Note that in the case of models the result will be false if their model IDs are different. + * + * @param a First value to compare. + * @param b Second value to compare. + * @returns `true` if they are the equivalent, `false` otherwise. + */ + +function deepEquals(a, b) { + // quick check for reference + if (a === b) { + return true; + } // use snapshots to compare if possible + // since snapshots use structural sharing it is more likely + // to speed up comparisons + + + if (isTreeNode(a)) { + a = getSnapshot(a); + } else if ((0,mobx_esm.isObservable)(a)) { + a = (0,mobx_esm.toJS)(a, toJSOptions); + } + + if (isTreeNode(b)) { + b = getSnapshot(b); + } else if ((0,mobx_esm.isObservable)(b)) { + b = (0,mobx_esm.toJS)(b, toJSOptions); + } + + return es6_default()(a, b); +} +var toJSOptions = /*#__PURE__*/getMobxVersion() >= 6 ? undefined : { + exportMapsAsObjects: false, + recurseEverything: false +}; + +/** + * A class with the implementationm of draft. + * Use `draft` to create an instance of this class. + * + * @typeparam T Data type. + */ + +var Draft = /*#__PURE__*/function () { + var _proto = Draft.prototype; + + /** + * Draft data object. + */ + + /** + * Commits current draft changes to the original object. + */ + _proto.commit = function commit() { + applySnapshot(this.originalData, getSnapshot(this.data)); + } + /** + * Partially commits current draft changes to the original object. + * If the path cannot be resolved in either the draft or the original object it will throw. + * Note that model IDs are checked to be the same when resolving the paths. + * + * @param path Path to commit. + */ + ; + + _proto.commitByPath = function commitByPath(path) { + var draftTarget = resolvePath(this.data, path); + + if (!draftTarget.resolved) { + throw failure("path " + JSON.stringify(path) + " could not be resolved in draft object"); + } + + var draftPathIds = pathToTargetPathIdsIgnoringLast(this.data, path); + var originalTarget = resolvePathCheckingIds(this.originalData, path, draftPathIds); + + if (!originalTarget.resolved) { + throw failure("path " + JSON.stringify(path) + " could not be resolved in original object"); + } + + applyPatches(this.originalData, [{ + path: path, + op: "replace", + value: getSnapshot(draftTarget.value) + }]); + } + /** + * Resets the draft to be an exact copy of the current state of the original object. + */ + ; + + _proto.reset = function reset() { + applySnapshot(this.data, this.originalSnapshot); + } + /** + * Partially resets current draft changes to be the same as the original object. + * If the path cannot be resolved in either the draft or the original object it will throw. + * Note that model IDs are checked to be the same when resolving the paths. + * + * @param path Path to reset. + */ + ; + + _proto.resetByPath = function resetByPath(path) { + var originalTarget = resolvePath(this.originalData, path); + + if (!originalTarget.resolved) { + throw failure("path " + JSON.stringify(path) + " could not be resolved in original object"); + } + + var originalPathIds = pathToTargetPathIdsIgnoringLast(this.originalData, path); + var draftTarget = resolvePathCheckingIds(this.data, path, originalPathIds); + + if (!draftTarget.resolved) { + throw failure("path " + JSON.stringify(path) + " could not be resolved in draft object"); + } + + applyPatches(this.data, [{ + path: path, + op: "replace", + value: getSnapshot(originalTarget.value) + }]); + } + /** + * Returns `true` if the draft has changed compared to the original object, `false` otherwise. + */ + ; + + /** + * Returns `true` if the value at the given path of the draft has changed compared to the original object. + * If the path cannot be resolved in the draft it will throw. + * If the path cannot be resolved in the original object it will return `true`. + * Note that model IDs are checked to be the same when resolving the paths. + * + * @param path Path to check. + */ + _proto.isDirtyByPath = function isDirtyByPath(path) { + var draftTarget = resolvePath(this.data, path); + + if (!draftTarget.resolved) { + throw failure("path " + JSON.stringify(path) + " could not be resolved in draft object"); + } + + var draftPathIds = pathToTargetPathIdsIgnoringLast(this.data, path); + var originalTarget = resolvePathCheckingIds(this.originalData, path, draftPathIds); + + if (!originalTarget.resolved) { + return true; + } + + return !deepEquals(draftTarget.value, originalTarget.value); + } + /** + * Original data object. + */ + ; + + _createClass(Draft, [{ + key: "isDirty", + get: function get() { + return !deepEquals(getSnapshot(this.data), this.originalSnapshot); + } + }, { + key: "originalSnapshot", + get: function get() { + return getSnapshot(this.originalData); + } + /** + * Creates an instance of Draft. + * Do not use directly, use `draft` instead. + * + * @param original + */ + + }]); + + function Draft(original) { + this.data = void 0; + this.originalData = void 0; + assertTweakedObject(original, "original"); + this.originalData = original; + this.data = fromSnapshot(this.originalSnapshot, { + generateNewIds: false + }); + } + + return Draft; +}(); + +__decorate([mobx_esm.action], Draft.prototype, "commit", null); + +__decorate([mobx_esm.action], Draft.prototype, "commitByPath", null); + +__decorate([mobx_esm.action], Draft.prototype, "reset", null); + +__decorate([mobx_esm.action], Draft.prototype, "resetByPath", null); + +__decorate([mobx_esm.computed], Draft.prototype, "isDirty", null); + +__decorate([mobx_esm.computed], Draft.prototype, "originalSnapshot", null); +/** + * Creates a draft copy of a tree node and all its children. + * + * @typeparam T Data type. + * @param original Original node. + * @returns The draft object. + */ + + +function draft(original) { + return new Draft(original); +} + +function pathToTargetPathIdsIgnoringLast(root, path) { + var pathIds = pathToTargetPathIds(root, path); + + if (pathIds.length >= 1) { + // never check the last object id + pathIds[pathIds.length - 1] = skipIdChecking; + } + + return pathIds; +} + +/** + * Context that allows access to the sandbox manager this node runs under (if any). + */ + +var sandboxManagerContext = /*#__PURE__*/createContext(); +/** + * Returns the sandbox manager of a node, or `undefined` if none. + * + * @param node Node to check. + * @returns The sandbox manager of a node, or `undefined` if none. + */ + +function getNodeSandboxManager(node) { + return sandboxManagerContext.get(node); +} +/** + * Returns if a given node is a sandboxed node. + * + * @param node Node to check. + * @returns `true` if it is sandboxed, `false` + */ + +function isSandboxedNode(node) { + return !!getNodeSandboxManager(node); +} +/** + * Manager class returned by `sandbox` that allows you to make changes to a sandbox copy of the + * original subtree and apply them to the original subtree or reject them. + */ + +var SandboxManager = /*#__PURE__*/function () { + /** + * The sandbox copy of the original subtree. + */ + + /** + * The internal disposer. + */ + + /** + * The internal `withSandbox` patch recorder. If `undefined`, no `withSandbox` call is being + * executed. + */ + + /** + * Function from `readonlyMiddleware` that will allow actions to be started inside the provided + * code block on a readonly node. + */ + + /** + * Creates an instance of `SandboxManager`. + * Do not use directly, use `sandbox` instead. + * + * @param subtreeRoot Subtree root target object. + */ + function SandboxManager(subtreeRoot) { + var _this = this; + + this.subtreeRoot = void 0; + this.subtreeRootClone = void 0; + this.disposer = void 0; + this.withSandboxPatchRecorder = void 0; + this.allowWrite = void 0; + this.subtreeRoot = subtreeRoot; + assertTweakedObject(subtreeRoot, "subtreeRoot"); // we temporarily set the default value of the context manager so that + // cloned nodes can access it while in their onInit phase + + var previousContextDefault = sandboxManagerContext.getDefault(); + sandboxManagerContext.setDefault(this); + + try { + this.subtreeRootClone = clone(subtreeRoot, { + generateNewIds: false + }); + sandboxManagerContext.set(this.subtreeRootClone, this); + } catch (err) { + throw err; + } finally { + sandboxManagerContext.setDefault(previousContextDefault); + } + + var wasRS = false; + var disposeReactionRS = (0,mobx_esm.reaction)(function () { + return isRootStore(subtreeRoot); + }, function (isRS) { + if (isRS !== wasRS) { + wasRS = isRS; + + if (isRS) { + registerRootStore(_this.subtreeRootClone); + } else { + unregisterRootStore(_this.subtreeRootClone); + } + } + }, { + fireImmediately: true + }); + var disposeOnPatches = onPatches(subtreeRoot, function (patches) { + if (_this.withSandboxPatchRecorder) { + throw failure("original subtree must not change while 'withSandbox' executes"); + } + + _this.allowWrite(function () { + applyPatches(_this.subtreeRootClone, patches); + }); + }); + + var _readonlyMiddleware = readonlyMiddleware(this.subtreeRootClone), + allowWrite = _readonlyMiddleware.allowWrite, + disposeReadonlyMW = _readonlyMiddleware.dispose; + + this.allowWrite = allowWrite; + + this.disposer = function () { + disposeReactionRS(); + disposeOnPatches(); + disposeReadonlyMW(); + + if (isRootStore(_this.subtreeRootClone)) { + unregisterRootStore(_this.subtreeRootClone); + } + + _this.disposer = function () {}; + }; + } + /** + * Executes `fn` with a sandbox copy of `node`. The changes made to the sandbox in `fn` can be + * accepted, i.e. applied to the original subtree, or rejected. + * + * @typeparam T Object type. + * @typeparam R Return type. + * @param node Object or tuple of objects for which to obtain a sandbox copy. + * @param fn Function that is called with a sandbox copy of `node`. Any changes made to the + * sandbox are applied to the original subtree when `fn` returns `true` or + * `{ commit: true, ... }`. When `fn` returns `false` or `{ commit: false, ... }` the changes made + * to the sandbox are rejected. + * @returns Value of type `R` when `fn` returns an object of type `{ commit: boolean; return: R }` + * or `void` when `fn` returns a boolean. + */ + + + var _proto = SandboxManager.prototype; + + _proto.withSandbox = function withSandbox(node, fn) { + assertIsFunction(fn, "fn"); + var isNodesArray = Array.isArray(node) && !isTweakedObject(node, false); + var nodes = isNodesArray ? node : [node]; + + var _this$prepareSandboxC = this.prepareSandboxChanges(nodes), + sandboxNodes = _this$prepareSandboxC.sandboxNodes, + applyRecorderChanges = _this$prepareSandboxC.applyRecorderChanges; + + var commit = false; + + try { + var returnValue = this.allowWrite(function () { + return fn(isNodesArray ? sandboxNodes : sandboxNodes[0]); + }); + + if (typeof returnValue === "boolean") { + commit = returnValue; + return undefined; + } else { + commit = returnValue.commit; + return returnValue["return"]; + } + } finally { + applyRecorderChanges(commit); + } + } + /** + * Disposes of the sandbox. + */ + ; + + _proto.dispose = function dispose() { + this.disposer(); + }; + + _proto.prepareSandboxChanges = function prepareSandboxChanges(nodes) { + var _this2 = this; + + var isNestedWithSandboxCall = !!this.withSandboxPatchRecorder; + var sandboxNodes = nodes.map(function (node) { + assertTweakedObject(node, "node"); + var path = getParentToChildPath(isNestedWithSandboxCall ? _this2.subtreeRootClone : _this2.subtreeRoot, node); + + if (!path) { + throw failure("node is not a child of subtreeRoot" + (isNestedWithSandboxCall ? "Clone" : "")); + } + + var sandboxNode = resolvePath(_this2.subtreeRootClone, path).value; + + if (!sandboxNode) { + throw failure("path could not be resolved - sandbox may be out of sync with original tree"); + } + + return sandboxNode; + }); + + if (!this.withSandboxPatchRecorder) { + this.withSandboxPatchRecorder = patchRecorder(this.subtreeRootClone); + } + + var recorder = this.withSandboxPatchRecorder; + var numRecorderEvents = recorder.events.length; + + var applyRecorderChanges = function applyRecorderChanges(commit) { + if (!isNestedWithSandboxCall) { + recorder.dispose(); + _this2.withSandboxPatchRecorder = undefined; + } + + (0,mobx_esm.runInAction)(function () { + if (commit) { + if (!isNestedWithSandboxCall) { + var len = recorder.events.length; + + for (var i = 0; i < len; i++) { + applyPatches(_this2.subtreeRoot, recorder.events[i].patches); + } + } + } else { + _this2.allowWrite(function () { + var i = recorder.events.length; + + while (i-- > numRecorderEvents) { + applyPatches(_this2.subtreeRootClone, recorder.events[i].inversePatches, true); + } + }); + } + }); + }; + + return { + sandboxNodes: sandboxNodes, + applyRecorderChanges: applyRecorderChanges + }; + }; + + return SandboxManager; +}(); +/** + * Creates a sandbox. + * + * @param subtreeRoot Subtree root target object. + * @returns A `SandboxManager` which allows you to manage the sandbox operations and dispose of the + * sandbox. + */ + +function sandbox(subtreeRoot) { + return new SandboxManager(subtreeRoot); +} + +/** + * A set that is backed by an array. + * Use `arraySet` to create it. + */ + +var ArraySet = /*#__PURE__*/function (_Model) { + _inheritsLoose(ArraySet, _Model); + + function ArraySet() { + return _Model.apply(this, arguments) || this; + } + + var _proto = ArraySet.prototype; + + _proto.add = function add(value) { + var items = this.items; + + if (!items.includes(value)) { + items.push(value); + } + + return this; + }; + + _proto.clear = function clear() { + this.items.length = 0; + }; + + _proto["delete"] = function _delete(value) { + var items = this.items; + var index = items.findIndex(function (t) { + return t === value; + }); + + if (index >= 0) { + items.splice(index, 1); + return true; + } else { + return false; + } + }; + + _proto.forEach = function forEach(callbackfn, thisArg) { + // we cannot use the set implementation since we need to pass this as set + var items = this.items; + var len = items.length; + + for (var i = 0; i < len; i++) { + var k = items[i]; + callbackfn.call(thisArg, k, k, this); + } + }; + + _proto.has = function has(value) { + return this.items.includes(value); + }; + + _proto.keys = function keys() { + return this.values(); // yes, values + }; + + _proto.values = function values$1() { + var items = this.items; + return (0,mobx_esm.values)(items)[Symbol.iterator](); + }; + + _proto.entries = function entries() { + var items = this.items; // TODO: should use an actual iterator + + return items.map(function (v) { + return [v, v]; + }).values(); + }; + + _proto[Symbol.iterator] = function () { + return this.values(); + }; + + _createClass(ArraySet, [{ + key: "size", + get: function get() { + return this.items.length; + } + }, { + key: Symbol.toStringTag, + get: function get() { + return "ArraySet"; + } + }]); + + return ArraySet; +}( /*#__PURE__*/Model({ + items: /*#__PURE__*/tProp( /*#__PURE__*/typesArray( /*#__PURE__*/typesUnchecked()), function () { + return []; + }) +})); + +__decorate([modelAction], ArraySet.prototype, "add", null); + +__decorate([modelAction], ArraySet.prototype, "clear", null); + +__decorate([modelAction], ArraySet.prototype, "delete", null); + +ArraySet = /*#__PURE__*/__decorate([/*#__PURE__*/model("mobx-keystone/ArraySet")], ArraySet); +/** + * Creates a new ArraySet model instance. + * + * @typeparam V Value type. + * @param [entries] Optional initial values. + */ + +function arraySet(values) { + var initialArr = values ? values.slice() : []; + return new ArraySet({ + items: initialArr + }); +} + +/** + * A type that represents an array backed set ArraySet. + * + * Example: + * ```ts + * const numberSetType = types.arraySet(types.number) + * ``` + * + * @typeparam T Value type. + * @param valueType Value type. + * @returns + */ + +function typesArraySet(valueType) { + var typeInfoGen = function typeInfoGen(t) { + return new ArraySetTypeInfo(t, resolveStandardType(valueType)); + }; + + return lateTypeChecker(function () { + var valueChecker = resolveTypeChecker(valueType); + + var getTypeName = function getTypeName() { + for (var _len = arguments.length, recursiveTypeCheckers = new Array(_len), _key = 0; _key < _len; _key++) { + recursiveTypeCheckers[_key] = arguments[_key]; + } + + return "ArraySet<" + valueChecker.getTypeName.apply(valueChecker, recursiveTypeCheckers.concat([valueChecker])) + ">"; + }; + + var thisTc = new TypeChecker(function (obj, path) { + if (!(obj instanceof ArraySet)) { + return new TypeCheckError(path, getTypeName(thisTc), obj); + } + + var dataTypeChecker = typesObject(function () { + return { + items: typesArray(valueChecker) + }; + }); + var resolvedTc = resolveTypeChecker(dataTypeChecker); + return resolvedTc.check(obj.$, path); + }, getTypeName, typeInfoGen); + return thisTc; + }, typeInfoGen); +} +/** + * `types.arraySet` type info. + */ + +var ArraySetTypeInfo = /*#__PURE__*/function (_TypeInfo) { + _inheritsLoose(ArraySetTypeInfo, _TypeInfo); + + _createClass(ArraySetTypeInfo, [{ + key: "valueTypeInfo", + get: function get() { + return getTypeInfo(this.valueType); + } + }]); + + function ArraySetTypeInfo(originalType, valueType) { + var _this; + + _this = _TypeInfo.call(this, originalType) || this; + _this.valueType = void 0; + _this.valueType = valueType; + return _this; + } + + return ArraySetTypeInfo; +}(TypeInfo); + +/** + * A type that represents the union of several other types (a | b | c | ...). + * + * Example: + * ```ts + * const booleanOrNumberType = types.or(types.boolean, types.number) + * ``` + * + * @typeparam T Type. + * @param orTypes Possible types. + * @returns + */ + +function typesOr() { + for (var _len = arguments.length, orTypes = new Array(_len), _key = 0; _key < _len; _key++) { + orTypes[_key] = arguments[_key]; + } + + var typeInfoGen = function typeInfoGen(t) { + return new OrTypeInfo(t, orTypes.map(resolveStandardType)); + }; + + return lateTypeChecker(function () { + var checkers = orTypes.map(resolveTypeChecker); // if the or includes unchecked then it is unchecked + + if (checkers.some(function (tc) { + return tc.unchecked; + })) { + return typesUnchecked(); + } + + var getTypeName = function getTypeName() { + for (var _len2 = arguments.length, recursiveTypeCheckers = new Array(_len2), _key2 = 0; _key2 < _len2; _key2++) { + recursiveTypeCheckers[_key2] = arguments[_key2]; + } + + var typeNames = checkers.map(function (tc) { + if (recursiveTypeCheckers.includes(tc)) { + return "..."; + } + + return tc.getTypeName.apply(tc, recursiveTypeCheckers.concat([tc])); + }); + return typeNames.join(" | "); + }; + + var thisTc = new TypeChecker(function (value, path) { + var noMatchingType = checkers.every(function (tc) { + return !!tc.check(value, path); + }); + + if (noMatchingType) { + return new TypeCheckError(path, getTypeName(thisTc), value); + } else { + return null; + } + }, getTypeName, typeInfoGen); + return thisTc; + }, typeInfoGen); +} +/** + * `types.or` type info. + */ + +var OrTypeInfo = /*#__PURE__*/function (_TypeInfo) { + _inheritsLoose(OrTypeInfo, _TypeInfo); + + _createClass(OrTypeInfo, [{ + key: "orTypeInfos", + // memoize to always return the same array on the getter + get: function get() { + return this._orTypeInfos(); + } + }]); + + function OrTypeInfo(thisType, orTypes) { + var _this; + + _this = _TypeInfo.call(this, thisType) || this; + _this.orTypes = void 0; + _this._orTypeInfos = lateVal(function () { + return _this.orTypes.map(getTypeInfo); + }); + _this.orTypes = orTypes; + return _this; + } + + return OrTypeInfo; +}(TypeInfo); + +function enumValues(e) { + var vals = []; + + for (var _i = 0, _Object$keys = Object.keys(e); _i < _Object$keys.length; _i++) { + var k = _Object$keys[_i]; + var v = e[k]; // we have to do this since TS does something weird + // to number values + // Hi = 0 -> { Hi: 0, 0: "Hi" } + + if (typeof v !== "string" || e[v] !== +k) { + vals.push(v); + } + } + + return vals; +} + +function typesEnum(enumObject) { + assertIsObject(enumObject, "enumObject"); + var literals = enumValues(enumObject).map(function (e) { + return typesLiteral(e); + }); + return typesOr.apply(void 0, literals); +} + +/** + * A type that represents either a type or undefined. + * Syntactic sugar for `types.or(baseType, types.undefined)` + * + * Example: + * ```ts + * const numberOrUndefinedType = types.maybe(types.number) + * ``` + * + * @typeparam S Type. + * @param baseType Type. + * @returns + */ + +function typesMaybe(baseType) { + return typesOr(baseType, typesUndefined); +} +/** + * A type that represents either a type or null. + * Syntactic sugar for `types.or(baseType, types.null)` + * + * * Example: + * ```ts + * const numberOrNullType = types.maybeNull(types.number) + * ``` + * + * @typeparam S Type. + * @param type Type. + * @returns + */ + +function typesMaybeNull(type) { + return typesOr(type, typesNull); +} + +/** + * A type that represents an object-like map, an object with string keys and values all of a same given type. + * + * Example: + * ```ts + * // { [k: string]: number } + * const numberMapType = types.record(types.number) + * ``` + * + * @typeparam T Type. + * @param valueType Type of the values of the object-like map. + * @returns + */ + +function typesRecord(valueType) { + var typeInfoGen = function typeInfoGen(tc) { + return new RecordTypeInfo(tc, resolveStandardType(valueType)); + }; + + return lateTypeChecker(function () { + var valueChecker = resolveTypeChecker(valueType); + + var getTypeName = function getTypeName() { + for (var _len = arguments.length, recursiveTypeCheckers = new Array(_len), _key = 0; _key < _len; _key++) { + recursiveTypeCheckers[_key] = arguments[_key]; + } + + return "Record<" + valueChecker.getTypeName.apply(valueChecker, recursiveTypeCheckers.concat([valueChecker])) + ">"; + }; + + var thisTc = new TypeChecker(function (obj, path) { + if (!isObject(obj)) return new TypeCheckError(path, getTypeName(thisTc), obj); + + if (!valueChecker.unchecked) { + var keys = Object.keys(obj); + + for (var i = 0; i < keys.length; i++) { + var k = keys[i]; + var v = obj[k]; + var valueError = valueChecker.check(v, [].concat(path, [k])); + + if (valueError) { + return valueError; + } + } + } + + return null; + }, getTypeName, typeInfoGen); + return thisTc; + }, typeInfoGen); +} +/** + * `types.record` type info. + */ + +var RecordTypeInfo = /*#__PURE__*/function (_TypeInfo) { + _inheritsLoose(RecordTypeInfo, _TypeInfo); + + _createClass(RecordTypeInfo, [{ + key: "valueTypeInfo", + get: function get() { + return getTypeInfo(this.valueType); + } + }]); + + function RecordTypeInfo(thisType, valueType) { + var _this; + + _this = _TypeInfo.call(this, thisType) || this; + _this.valueType = void 0; + _this.valueType = valueType; + return _this; + } + + return RecordTypeInfo; +}(TypeInfo); + +/** + * A map that is backed by an object-like map. + * Use `objectMap` to create it. + */ + +var ObjectMap = /*#__PURE__*/function (_Model) { + _inheritsLoose(ObjectMap, _Model); + + function ObjectMap() { + return _Model.apply(this, arguments) || this; + } + + var _proto = ObjectMap.prototype; + + _proto.clear = function clear() { + var items = this.items; + var keys = Object.keys(items); + var len = keys.length; + + for (var i = 0; i < len; i++) { + var k = keys[i]; + (0,mobx_esm.remove)(items, k); + } + }; + + _proto["delete"] = function _delete(key) { + var hasKey = this.has(key); + + if (hasKey) { + (0,mobx_esm.remove)(this.items, key); + return true; + } else { + return false; + } + }; + + _proto.forEach = function forEach(callbackfn, thisArg) { + // we cannot use the map implementation since we need to pass this as map + var items = this.items; + var keys = Object.keys(items); + var len = keys.length; + + for (var i = 0; i < len; i++) { + var k = keys[i]; + callbackfn.call(thisArg, items[k], k, this); + } + }; + + _proto.get = function get$1(key) { + return (0,mobx_esm.get)(this.items, key); + }; + + _proto.has = function has$1(key) { + return (0,mobx_esm.has)(this.items, key); + }; + + _proto.set = function set$1(key, value) { + (0,mobx_esm.set)(this.items, key, value); + + return this; + }; + + _proto.keys = function keys$1() { + // TODO: should use an actual iterator + return (0,mobx_esm.keys)(this.items)[Symbol.iterator](); + }; + + _proto.values = function values$1() { + // TODO: should use an actual iterator + return (0,mobx_esm.values)(this.items)[Symbol.iterator](); + }; + + _proto.entries = function entries$1() { + // TODO: should use an actual iterator + return (0,mobx_esm.entries)(this.items)[Symbol.iterator](); + }; + + _proto[Symbol.iterator] = function () { + return this.entries(); + }; + + _createClass(ObjectMap, [{ + key: "size", + get: function get() { + return (0,mobx_esm.keys)(this.items).length; + } + }, { + key: Symbol.toStringTag, + get: function get() { + return "ObjectMap"; + } + }]); + + return ObjectMap; +}( /*#__PURE__*/Model({ + items: /*#__PURE__*/tProp( /*#__PURE__*/typesRecord( /*#__PURE__*/typesUnchecked()), function () { + return {}; + }) +})); + +__decorate([modelAction], ObjectMap.prototype, "clear", null); + +__decorate([modelAction], ObjectMap.prototype, "delete", null); + +__decorate([modelAction], ObjectMap.prototype, "set", null); + +ObjectMap = /*#__PURE__*/__decorate([/*#__PURE__*/model("mobx-keystone/ObjectMap")], ObjectMap); +/** + * Creates a new ObjectMap model instance. + * + * @typeparam V Value type. + * @param [entries] Optional initial values. + */ + +function objectMap(entries) { + var initialObj = {}; + + if (entries) { + var len = entries.length; + + for (var i = 0; i < len; i++) { + var entry = entries[i]; + initialObj[entry[0]] = entry[1]; + } + } + + return new ObjectMap({ + items: initialObj + }); +} + +/** + * A type that represents an object-like map ObjectMap. + * + * Example: + * ```ts + * const numberMapType = types.objectMap(types.number) + * ``` + * + * @typeparam T Value type. + * @param valueType Value type. + * @returns + */ + +function typesObjectMap(valueType) { + var typeInfoGen = function typeInfoGen(t) { + return new ObjectMapTypeInfo(t, resolveStandardType(valueType)); + }; + + return lateTypeChecker(function () { + var valueChecker = resolveTypeChecker(valueType); + + var getTypeName = function getTypeName() { + for (var _len = arguments.length, recursiveTypeCheckers = new Array(_len), _key = 0; _key < _len; _key++) { + recursiveTypeCheckers[_key] = arguments[_key]; + } + + return "ObjectMap<" + valueChecker.getTypeName.apply(valueChecker, recursiveTypeCheckers.concat([valueChecker])) + ">"; + }; + + var thisTc = new TypeChecker(function (obj, path) { + if (!(obj instanceof ObjectMap)) { + return new TypeCheckError(path, getTypeName(thisTc), obj); + } + + var dataTypeChecker = typesObject(function () { + return { + items: typesRecord(valueChecker) + }; + }); + var resolvedTc = resolveTypeChecker(dataTypeChecker); + return resolvedTc.check(obj.$, path); + }, getTypeName, typeInfoGen); + return thisTc; + }, typeInfoGen); +} +/** + * `types.objectMap` type info. + */ + +var ObjectMapTypeInfo = /*#__PURE__*/function (_TypeInfo) { + _inheritsLoose(ObjectMapTypeInfo, _TypeInfo); + + _createClass(ObjectMapTypeInfo, [{ + key: "valueTypeInfo", + get: function get() { + return getTypeInfo(this.valueType); + } + }]); + + function ObjectMapTypeInfo(thisType, valueType) { + var _this; + + _this = _TypeInfo.call(this, thisType) || this; + _this.valueType = void 0; + _this.valueType = valueType; + return _this; + } + + return ObjectMapTypeInfo; +}(TypeInfo); + +/** + * A type that represents a reference to an object or model. + * + * Example: + * ```ts + * const refToSomeObject = types.ref() + * ``` + * + * @typeparam M Model type. + * @returns + */ + +function typesRef() { + return refTypeChecker; +} +var typeName = "Ref"; +var refDataTypeChecker = /*#__PURE__*/typesObject(function () { + return { + id: typesString + }; +}); +var refTypeChecker = /*#__PURE__*/new TypeChecker(function (value, path) { + if (!(value instanceof Ref)) { + return new TypeCheckError(path, typeName, value); + } + + var resolvedTc = resolveTypeChecker(refDataTypeChecker); + return resolvedTc.check(value.$, path); +}, function () { + return typeName; +}, function (t) { + return new RefTypeInfo(t); +}); +/** + * `types.ref` type info. + */ + +var RefTypeInfo = /*#__PURE__*/function (_TypeInfo) { + _inheritsLoose(RefTypeInfo, _TypeInfo); + + function RefTypeInfo() { + return _TypeInfo.apply(this, arguments) || this; + } + + return RefTypeInfo; +}(TypeInfo); + +/** + * A type that represents an tuple of values of a given type. + * + * Example: + * ```ts + * const stringNumberTupleType = types.tuple(types.string, types.number) + * ``` + * + * @typeparam T Item types. + * @param itemType Type of inner items. + * @returns + */ + +function typesTuple() { + for (var _len = arguments.length, itemTypes = new Array(_len), _key = 0; _key < _len; _key++) { + itemTypes[_key] = arguments[_key]; + } + + var typeInfoGen = function typeInfoGen(t) { + return new TupleTypeInfo(t, itemTypes.map(resolveStandardType)); + }; + + return lateTypeChecker(function () { + var checkers = itemTypes.map(resolveTypeChecker); + + var getTypeName = function getTypeName() { + for (var _len2 = arguments.length, recursiveTypeCheckers = new Array(_len2), _key2 = 0; _key2 < _len2; _key2++) { + recursiveTypeCheckers[_key2] = arguments[_key2]; + } + + var typeNames = checkers.map(function (tc) { + if (recursiveTypeCheckers.includes(tc)) { + return "..."; + } + + return tc.getTypeName.apply(tc, recursiveTypeCheckers.concat([tc])); + }); + return "[" + typeNames.join(", ") + "]"; + }; + + var thisTc = new TypeChecker(function (array, path) { + if (!isArray(array) || array.length !== itemTypes.length) { + return new TypeCheckError(path, getTypeName(thisTc), array); + } + + for (var i = 0; i < array.length; i++) { + var itemChecker = checkers[i]; + + if (!itemChecker.unchecked) { + var itemError = itemChecker.check(array[i], [].concat(path, [i])); + + if (itemError) { + return itemError; + } + } + } + + return null; + }, getTypeName, typeInfoGen); + return thisTc; + }, typeInfoGen); +} +/** + * `types.tuple` type info. + */ + +var TupleTypeInfo = /*#__PURE__*/function (_TypeInfo) { + _inheritsLoose(TupleTypeInfo, _TypeInfo); + + _createClass(TupleTypeInfo, [{ + key: "itemTypeInfos", + // memoize to always return the same array on the getter + get: function get() { + return this._itemTypeInfos(); + } + }]); + + function TupleTypeInfo(thisType, itemTypes) { + var _this; + + _this = _TypeInfo.call(this, thisType) || this; + _this.itemTypes = void 0; + _this._itemTypeInfos = lateVal(function () { + return _this.itemTypes.map(getTypeInfo); + }); + _this.itemTypes = itemTypes; + return _this; + } + + return TupleTypeInfo; +}(TypeInfo); + +var types = { + literal: typesLiteral, + undefined: typesUndefined, + "null": typesNull, + "boolean": typesBoolean, + number: typesNumber, + string: typesString, + or: typesOr, + maybe: typesMaybe, + maybeNull: typesMaybeNull, + array: typesArray, + record: typesRecord, + unchecked: typesUnchecked, + model: typesModel, + object: typesObject, + ref: typesRef, + frozen: typesFrozen, + "enum": typesEnum, + refinement: typesRefinement, + integer: typesInteger, + nonEmptyString: typesNonEmptyString, + objectMap: typesObjectMap, + arraySet: typesArraySet, + tuple: typesTuple, + mapArray: function mapArray(valueType) { + return typesArray(typesTuple(typesString, valueType)); + }, + setArray: function setArray(valueType) { + return typesArray(valueType); + }, + mapObject: function mapObject(valueType) { + return typesRecord(valueType); + }, + dateString: typesNonEmptyString, + dateTimestamp: typesInteger +}; + + + + +/***/ }), + +/***/ 9637: +/*!********************************************!*\ + !*** ./node_modules/mobx/dist/mobx.esm.js ***! + \********************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "$mobx": () => (/* binding */ $mobx), +/* harmony export */ "FlowCancellationError": () => (/* binding */ FlowCancellationError), +/* harmony export */ "ObservableMap": () => (/* binding */ ObservableMap), +/* harmony export */ "ObservableSet": () => (/* binding */ ObservableSet), +/* harmony export */ "Reaction": () => (/* binding */ Reaction), +/* harmony export */ "_allowStateChanges": () => (/* binding */ allowStateChanges), +/* harmony export */ "_allowStateChangesInsideComputed": () => (/* binding */ runInAction), +/* harmony export */ "_allowStateReadsEnd": () => (/* binding */ allowStateReadsEnd), +/* harmony export */ "_allowStateReadsStart": () => (/* binding */ allowStateReadsStart), +/* harmony export */ "_autoAction": () => (/* binding */ autoAction), +/* harmony export */ "_endAction": () => (/* binding */ _endAction), +/* harmony export */ "_getAdministration": () => (/* binding */ getAdministration), +/* harmony export */ "_getGlobalState": () => (/* binding */ getGlobalState), +/* harmony export */ "_interceptReads": () => (/* binding */ interceptReads), +/* harmony export */ "_isComputingDerivation": () => (/* binding */ isComputingDerivation), +/* harmony export */ "_resetGlobalState": () => (/* binding */ resetGlobalState), +/* harmony export */ "_startAction": () => (/* binding */ _startAction), +/* harmony export */ "action": () => (/* binding */ action), +/* harmony export */ "autorun": () => (/* binding */ autorun), +/* harmony export */ "comparer": () => (/* binding */ comparer), +/* harmony export */ "computed": () => (/* binding */ computed), +/* harmony export */ "configure": () => (/* binding */ configure), +/* harmony export */ "createAtom": () => (/* binding */ createAtom), +/* harmony export */ "entries": () => (/* binding */ entries), +/* harmony export */ "extendObservable": () => (/* binding */ extendObservable), +/* harmony export */ "flow": () => (/* binding */ flow), +/* harmony export */ "flowResult": () => (/* binding */ flowResult), +/* harmony export */ "get": () => (/* binding */ get), +/* harmony export */ "getAtom": () => (/* binding */ getAtom), +/* harmony export */ "getDebugName": () => (/* binding */ getDebugName), +/* harmony export */ "getDependencyTree": () => (/* binding */ getDependencyTree), +/* harmony export */ "getObserverTree": () => (/* binding */ getObserverTree), +/* harmony export */ "has": () => (/* binding */ has), +/* harmony export */ "intercept": () => (/* binding */ intercept), +/* harmony export */ "isAction": () => (/* binding */ isAction), +/* harmony export */ "isBoxedObservable": () => (/* binding */ isObservableValue), +/* harmony export */ "isComputed": () => (/* binding */ isComputed), +/* harmony export */ "isComputedProp": () => (/* binding */ isComputedProp), +/* harmony export */ "isFlowCancellationError": () => (/* binding */ isFlowCancellationError), +/* harmony export */ "isObservable": () => (/* binding */ isObservable), +/* harmony export */ "isObservableArray": () => (/* binding */ isObservableArray), +/* harmony export */ "isObservableMap": () => (/* binding */ isObservableMap), +/* harmony export */ "isObservableObject": () => (/* binding */ isObservableObject), +/* harmony export */ "isObservableProp": () => (/* binding */ isObservableProp), +/* harmony export */ "isObservableSet": () => (/* binding */ isObservableSet), +/* harmony export */ "keys": () => (/* binding */ keys), +/* harmony export */ "makeAutoObservable": () => (/* binding */ makeAutoObservable), +/* harmony export */ "makeObservable": () => (/* binding */ makeObservable), +/* harmony export */ "observable": () => (/* binding */ observable), +/* harmony export */ "observe": () => (/* binding */ observe), +/* harmony export */ "onBecomeObserved": () => (/* binding */ onBecomeObserved), +/* harmony export */ "onBecomeUnobserved": () => (/* binding */ onBecomeUnobserved), +/* harmony export */ "onReactionError": () => (/* binding */ onReactionError), +/* harmony export */ "reaction": () => (/* binding */ reaction), +/* harmony export */ "remove": () => (/* binding */ remove), +/* harmony export */ "runInAction": () => (/* binding */ runInAction), +/* harmony export */ "set": () => (/* binding */ set), +/* harmony export */ "spy": () => (/* binding */ spy), +/* harmony export */ "toJS": () => (/* binding */ toJS), +/* harmony export */ "trace": () => (/* binding */ trace), +/* harmony export */ "transaction": () => (/* binding */ transaction), +/* harmony export */ "untracked": () => (/* binding */ untracked), +/* harmony export */ "values": () => (/* binding */ values), +/* harmony export */ "when": () => (/* binding */ when) +/* harmony export */ }); +var niceErrors = { + 0: "Invalid value for configuration 'enforceActions', expected 'never', 'always' or 'observed'", + 1: function _(prop) { + return "Cannot decorate undefined property: '" + prop.toString() + "'"; + }, + 2: function _(prop) { + return "invalid decorator for '" + prop.toString() + "'"; + }, + 3: function _(prop) { + return "Cannot decorate '" + prop.toString() + "': action can only be used on properties with a function value."; + }, + 4: function _(prop) { + return "Cannot decorate '" + prop.toString() + "': computed can only be used on getter properties."; + }, + 5: "'keys()' can only be used on observable objects, arrays, sets and maps", + 6: "'values()' can only be used on observable objects, arrays, sets and maps", + 7: "'entries()' can only be used on observable objects, arrays and maps", + 8: "'set()' can only be used on observable objects, arrays and maps", + 9: "'remove()' can only be used on observable objects, arrays and maps", + 10: "'has()' can only be used on observable objects, arrays and maps", + 11: "'get()' can only be used on observable objects, arrays and maps", + 12: "Invalid annotation", + 13: "Dynamic observable objects cannot be frozen", + 14: "Intercept handlers should return nothing or a change object", + 15: "Observable arrays cannot be frozen", + 16: "Modification exception: the internal structure of an observable array was changed.", + 17: function _(index, length) { + return "[mobx.array] Index out of bounds, " + index + " is larger than " + length; + }, + 18: "mobx.map requires Map polyfill for the current browser. Check babel-polyfill or core-js/es6/map.js", + 19: function _(other) { + return "Cannot initialize from classes that inherit from Map: " + other.constructor.name; + }, + 20: function _(other) { + return "Cannot initialize map from " + other; + }, + 21: function _(dataStructure) { + return "Cannot convert to map from '" + dataStructure + "'"; + }, + 22: "mobx.set requires Set polyfill for the current browser. Check babel-polyfill or core-js/es6/set.js", + 23: "It is not possible to get index atoms from arrays", + 24: function _(thing) { + return "Cannot obtain administration from " + thing; + }, + 25: function _(property, name) { + return "the entry '" + property + "' does not exist in the observable map '" + name + "'"; + }, + 26: "please specify a property", + 27: function _(property, name) { + return "no observable property '" + property.toString() + "' found on the observable object '" + name + "'"; + }, + 28: function _(thing) { + return "Cannot obtain atom from " + thing; + }, + 29: "Expecting some object", + 30: "invalid action stack. did you forget to finish an action?", + 31: "missing option for computed: get", + 32: function _(name, derivation) { + return "Cycle detected in computation " + name + ": " + derivation; + }, + 33: function _(name) { + return "The setter of computed value '" + name + "' is trying to update itself. Did you intend to update an _observable_ value, instead of the computed property?"; + }, + 34: function _(name) { + return "[ComputedValue '" + name + "'] It is not possible to assign a new value to a computed value."; + }, + 35: "There are multiple, different versions of MobX active. Make sure MobX is loaded only once or use `configure({ isolateGlobalState: true })`", + 36: "isolateGlobalState should be called before MobX is running any reactions", + 37: function _(method) { + return "[mobx] `observableArray." + method + "()` mutates the array in-place, which is not allowed inside a derivation. Use `array.slice()." + method + "()` instead"; + } +}; +var errors = false ? 0 : {}; +function die(error) { + for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) { + args[_key - 1] = arguments[_key]; + } + + if (false) { var e; } + + throw new Error(typeof error === "number" ? "[MobX] minified error nr: " + error + (args.length ? " " + args.join(",") : "") + ". Find the full error at: https://github.com/mobxjs/mobx/blob/mobx6/src/errors.ts" : "[MobX] " + error); +} + +var mockGlobal = {}; +function getGlobal() { + if (typeof window !== "undefined") { + return window; + } + + if (typeof __webpack_require__.g !== "undefined") { + return __webpack_require__.g; + } + + if (typeof self !== "undefined") { + return self; + } + + return mockGlobal; +} + +var assign = Object.assign; +var getDescriptor = Object.getOwnPropertyDescriptor; +var defineProperty = Object.defineProperty; +var objectPrototype = Object.prototype; +var EMPTY_ARRAY = []; +Object.freeze(EMPTY_ARRAY); +var EMPTY_OBJECT = {}; +Object.freeze(EMPTY_OBJECT); +var hasProxy = typeof Proxy !== "undefined"; +var plainObjectString = /*#__PURE__*/Object.toString(); +function assertProxies() { + if (!hasProxy) { + die( false ? 0 : "Proxy not available"); + } +} +function warnAboutProxyRequirement(msg) { + if (false) {} +} +function getNextId() { + return ++globalState.mobxGuid; +} +/** + * Makes sure that the provided function is invoked at most once. + */ + +function once(func) { + var invoked = false; + return function () { + if (invoked) return; + invoked = true; + return func.apply(this, arguments); + }; +} +var noop = function noop() {}; +function isFunction(fn) { + return typeof fn === "function"; +} +function isStringish(value) { + var t = typeof value; + + switch (t) { + case "string": + case "symbol": + case "number": + return true; + } + + return false; +} +function isObject(value) { + return value !== null && typeof value === "object"; +} +function isPlainObject(value) { + var _proto$constructor; + + if (!isObject(value)) return false; + var proto = Object.getPrototypeOf(value); + if (proto == null) return true; + return ((_proto$constructor = proto.constructor) == null ? void 0 : _proto$constructor.toString()) === plainObjectString; +} // https://stackoverflow.com/a/37865170 + +function isGenerator(obj) { + var constructor = obj == null ? void 0 : obj.constructor; + if (!constructor) return false; + if ("GeneratorFunction" === constructor.name || "GeneratorFunction" === constructor.displayName) return true; + return false; +} +function addHiddenProp(object, propName, value) { + defineProperty(object, propName, { + enumerable: false, + writable: true, + configurable: true, + value: value + }); +} +function addHiddenFinalProp(object, propName, value) { + defineProperty(object, propName, { + enumerable: false, + writable: false, + configurable: true, + value: value + }); +} +function assertPropertyConfigurable(object, prop) { + if (false) { var descriptor; } +} +function createInstanceofPredicate(name, theClass) { + var propName = "isMobX" + name; + theClass.prototype[propName] = true; + return function (x) { + return isObject(x) && x[propName] === true; + }; +} +function isES6Map(thing) { + return thing instanceof Map; +} +function isES6Set(thing) { + return thing instanceof Set; +} +var hasGetOwnPropertySymbols = typeof Object.getOwnPropertySymbols !== "undefined"; +/** + * Returns the following: own keys, prototype keys & own symbol keys, if they are enumerable. + */ + +function getPlainObjectKeys(object) { + var keys = Object.keys(object); // Not supported in IE, so there are not going to be symbol props anyway... + + if (!hasGetOwnPropertySymbols) return keys; + var symbols = Object.getOwnPropertySymbols(object); + if (!symbols.length) return keys; + return [].concat(keys, symbols.filter(function (s) { + return objectPrototype.propertyIsEnumerable.call(object, s); + })); +} // From Immer utils +// Returns all own keys, including non-enumerable and symbolic + +var ownKeys = typeof Reflect !== "undefined" && Reflect.ownKeys ? Reflect.ownKeys : hasGetOwnPropertySymbols ? function (obj) { + return Object.getOwnPropertyNames(obj).concat(Object.getOwnPropertySymbols(obj)); +} : +/* istanbul ignore next */ +Object.getOwnPropertyNames; +function stringifyKey(key) { + if (typeof key === "string") return key; + if (typeof key === "symbol") return key.toString(); + return new String(key).toString(); +} +function toPrimitive(value) { + return value === null ? null : typeof value === "object" ? "" + value : value; +} +function hasProp(target, prop) { + return objectPrototype.hasOwnProperty.call(target, prop); +} // From Immer utils + +var getOwnPropertyDescriptors = Object.getOwnPropertyDescriptors || function getOwnPropertyDescriptors(target) { + // Polyfill needed for Hermes and IE, see https://github.com/facebook/hermes/issues/274 + var res = {}; // Note: without polyfill for ownKeys, symbols won't be picked up + + ownKeys(target).forEach(function (key) { + res[key] = getDescriptor(target, key); + }); + return res; +}; + +var mobxDecoratorsSymbol = /*#__PURE__*/Symbol("mobx-decorators"); +var mobxAppliedDecoratorsSymbol = /*#__PURE__*/Symbol("mobx-applied-decorators"); +function createDecorator(type) { + return assign(function (target, property) { + if (property === undefined) { + // @decorator(arg) member + createDecoratorAndAnnotation(type, target); + } else { + // @decorator member + storeDecorator(target, property, type); + } + }, { + annotationType_: type + }); +} +function createDecoratorAndAnnotation(type, arg_) { + return assign(function (target, property) { + storeDecorator(target, property, type, arg_); + }, { + annotationType_: type, + arg_: arg_ + }); +} +function storeDecorator(target, property, type, arg_) { + var desc = getDescriptor(target, mobxDecoratorsSymbol); + var map; + + if (desc) { + map = desc.value; + } else { + map = {}; + addHiddenProp(target, mobxDecoratorsSymbol, map); + } + + map[property] = { + annotationType_: type, + arg_: arg_ + }; +} +function applyDecorators(target) { + if (target[mobxAppliedDecoratorsSymbol]) return true; + var current = target; // optimization: this could be cached per prototype! + // (then we can remove the weird short circuiting as well..) + + var annotations = []; + + while (current && current !== objectPrototype) { + var desc = getDescriptor(current, mobxDecoratorsSymbol); + + if (desc) { + if (!annotations.length) { + for (var key in desc.value) { + // second conditions is to recognize actions + if (!hasProp(target, key) && !hasProp(current, key)) { + // not all fields are defined yet, so we are in the makeObservable call of some super class, + // short circuit, here, we will do this again in a later makeObservable call + return true; + } + } + } + + annotations.unshift(desc.value); + } + + current = Object.getPrototypeOf(current); + } + + annotations.forEach(function (a) { + makeObservable(target, a); + }); + addHiddenProp(target, mobxAppliedDecoratorsSymbol, true); + return annotations.length > 0; +} + +var $mobx = /*#__PURE__*/Symbol("mobx administration"); +var Atom = /*#__PURE__*/function () { + // for effective unobserving. BaseAtom has true, for extra optimization, so its onBecomeUnobserved never gets called, because it's not needed + + /** + * Create a new atom. For debugging purposes it is recommended to give it a name. + * The onBecomeObserved and onBecomeUnobserved callbacks can be used for resource management. + */ + function Atom(name_) { + if (name_ === void 0) { + name_ = "Atom@" + getNextId(); + } + + this.name_ = void 0; + this.isPendingUnobservation_ = false; + this.isBeingObserved_ = false; + this.observers_ = new Set(); + this.diffValue_ = 0; + this.lastAccessedBy_ = 0; + this.lowestObserverState_ = IDerivationState_.NOT_TRACKING_; + this.onBOL = void 0; + this.onBUOL = void 0; + this.name_ = name_; + } // onBecomeObservedListeners + + + var _proto = Atom.prototype; + + _proto.onBO = function onBO() { + if (this.onBOL) { + this.onBOL.forEach(function (listener) { + return listener(); + }); + } + }; + + _proto.onBUO = function onBUO() { + if (this.onBUOL) { + this.onBUOL.forEach(function (listener) { + return listener(); + }); + } + } + /** + * Invoke this method to notify mobx that your atom has been used somehow. + * Returns true if there is currently a reactive context. + */ + ; + + _proto.reportObserved = function reportObserved$1() { + return reportObserved(this); + } + /** + * Invoke this method _after_ this method has changed to signal mobx that all its observers should invalidate. + */ + ; + + _proto.reportChanged = function reportChanged() { + startBatch(); + propagateChanged(this); + endBatch(); + }; + + _proto.toString = function toString() { + return this.name_; + }; + + return Atom; +}(); +var isAtom = /*#__PURE__*/createInstanceofPredicate("Atom", Atom); +function createAtom(name, onBecomeObservedHandler, onBecomeUnobservedHandler) { + if (onBecomeObservedHandler === void 0) { + onBecomeObservedHandler = noop; + } + + if (onBecomeUnobservedHandler === void 0) { + onBecomeUnobservedHandler = noop; + } + + var atom = new Atom(name); // default `noop` listener will not initialize the hook Set + + if (onBecomeObservedHandler !== noop) { + onBecomeObserved(atom, onBecomeObservedHandler); + } + + if (onBecomeUnobservedHandler !== noop) { + onBecomeUnobserved(atom, onBecomeUnobservedHandler); + } + + return atom; +} + +function identityComparer(a, b) { + return a === b; +} + +function structuralComparer(a, b) { + return deepEqual(a, b); +} + +function shallowComparer(a, b) { + return deepEqual(a, b, 1); +} + +function defaultComparer(a, b) { + return Object.is(a, b); +} + +var comparer = { + identity: identityComparer, + structural: structuralComparer, + "default": defaultComparer, + shallow: shallowComparer +}; + +function deepEnhancer(v, _, name) { + // it is an observable already, done + if (isObservable(v)) return v; // something that can be converted and mutated? + + if (Array.isArray(v)) return observable.array(v, { + name: name + }); + if (isPlainObject(v)) return observable.object(v, undefined, { + name: name + }); + if (isES6Map(v)) return observable.map(v, { + name: name + }); + if (isES6Set(v)) return observable.set(v, { + name: name + }); + return v; +} +function shallowEnhancer(v, _, name) { + if (v === undefined || v === null) return v; + if (isObservableObject(v) || isObservableArray(v) || isObservableMap(v) || isObservableSet(v)) return v; + if (Array.isArray(v)) return observable.array(v, { + name: name, + deep: false + }); + if (isPlainObject(v)) return observable.object(v, undefined, { + name: name, + deep: false + }); + if (isES6Map(v)) return observable.map(v, { + name: name, + deep: false + }); + if (isES6Set(v)) return observable.set(v, { + name: name, + deep: false + }); + if (false) {} +} +function referenceEnhancer(newValue) { + // never turn into an observable + return newValue; +} +function refStructEnhancer(v, oldValue) { + if (false) {} + if (deepEqual(v, oldValue)) return oldValue; + return v; +} + +var _annotationToEnhancer; +var OBSERVABLE = "observable"; +var OBSERVABLE_REF = "observable.ref"; +var OBSERVABLE_SHALLOW = "observable.shallow"; +var OBSERVABLE_STRUCT = "observable.struct"; // Predefined bags of create observable options, to avoid allocating temporarily option objects +// in the majority of cases + +var defaultCreateObservableOptions = { + deep: true, + name: undefined, + defaultDecorator: undefined, + proxy: true +}; +Object.freeze(defaultCreateObservableOptions); +function asCreateObservableOptions(thing) { + return thing || defaultCreateObservableOptions; +} +function getEnhancerFromOption(options) { + return options.deep === true ? deepEnhancer : options.deep === false ? referenceEnhancer : getEnhancerFromAnnotation(options.defaultDecorator); +} +var annotationToEnhancer = (_annotationToEnhancer = {}, _annotationToEnhancer[OBSERVABLE] = deepEnhancer, _annotationToEnhancer[OBSERVABLE_REF] = referenceEnhancer, _annotationToEnhancer[OBSERVABLE_SHALLOW] = shallowEnhancer, _annotationToEnhancer[OBSERVABLE_STRUCT] = refStructEnhancer, _annotationToEnhancer); +function getEnhancerFromAnnotation(annotation) { + var _annotationToEnhancer2; + + return !annotation ? deepEnhancer : (_annotationToEnhancer2 = annotationToEnhancer[annotation.annotationType_]) != null ? _annotationToEnhancer2 : die(12); +} +/** + * Turns an object, array or function into a reactive structure. + * @param v the value which should become observable. + */ + +function createObservable(v, arg2, arg3) { + // @observable someProp; + if (isStringish(arg2)) { + storeDecorator(v, arg2, OBSERVABLE); + return; + } // it is an observable already, done + + + if (isObservable(v)) return v; // something that can be converted and mutated? + + var res = isPlainObject(v) ? observable.object(v, arg2, arg3) : Array.isArray(v) ? observable.array(v, arg2) : isES6Map(v) ? observable.map(v, arg2) : isES6Set(v) ? observable.set(v, arg2) : v; // this value could be converted to a new observable data structure, return it + + if (res !== v) return res; + return observable.box(v); +} + +createObservable.annotationType_ = OBSERVABLE; +var observableFactories = { + box: function box(value, options) { + var o = asCreateObservableOptions(options); + return new ObservableValue(value, getEnhancerFromOption(o), o.name, true, o.equals); + }, + array: function array(initialValues, options) { + var o = asCreateObservableOptions(options); + return (globalState.useProxies === false || o.proxy === false ? createLegacyArray : createObservableArray)(initialValues, getEnhancerFromOption(o), o.name); + }, + map: function map(initialValues, options) { + var o = asCreateObservableOptions(options); + return new ObservableMap(initialValues, getEnhancerFromOption(o), o.name); + }, + set: function set(initialValues, options) { + var o = asCreateObservableOptions(options); + return new ObservableSet(initialValues, getEnhancerFromOption(o), o.name); + }, + object: function object(props, decorators, options) { + var o = asCreateObservableOptions(options); + var base = {}; + asObservableObject(base, options == null ? void 0 : options.name, getEnhancerFromOption(o)); + return extendObservable(globalState.useProxies === false || o.proxy === false ? base : createDynamicObservableObject(base), props, decorators, options); + }, + ref: /*#__PURE__*/createDecorator(OBSERVABLE_REF), + shallow: /*#__PURE__*/createDecorator(OBSERVABLE_SHALLOW), + deep: /*#__PURE__*/createDecorator(OBSERVABLE), + struct: /*#__PURE__*/createDecorator(OBSERVABLE_STRUCT) +}; // eslint-disable-next-line + +var observable = /*#__PURE__*/assign(createObservable, observableFactories); + +var COMPUTED = "computed"; +var COMPUTED_STRUCT = "computed.struct"; +/** + * Decorator for class properties: @computed get value() { return expr; }. + * For legacy purposes also invokable as ES5 observable created: `computed(() => expr)`; + */ + +var computed = function computed(arg1, arg2, arg3) { + if (isStringish(arg2)) { + // @computed + return storeDecorator(arg1, arg2, COMPUTED); + } + + if (isPlainObject(arg1)) { + // @computed({ options }) + return createDecoratorAndAnnotation(COMPUTED, arg1); + } // computed(expr, options?) + + + if (false) {} + + var opts = isPlainObject(arg2) ? arg2 : {}; + opts.get = arg1; + opts.name = opts.name || arg1.name || ""; + /* for generated name */ + + return new ComputedValue(opts); +}; +computed.annotationType_ = COMPUTED; +computed.struct = /*#__PURE__*/assign(function (target, property) { + storeDecorator(target, property, COMPUTED_STRUCT); +}, { + annotationType_: COMPUTED_STRUCT +}); + +var _getDescriptor$config, _getDescriptor; +// mobx versions + +var currentActionId = 0; +var nextActionId = 1; +var isFunctionNameConfigurable = (_getDescriptor$config = (_getDescriptor = /*#__PURE__*/getDescriptor(function () {}, "name")) == null ? void 0 : _getDescriptor.configurable) != null ? _getDescriptor$config : false; // we can safely recycle this object + +var tmpNameDescriptor = { + value: "action", + configurable: true, + writable: false, + enumerable: false +}; +function createAction(actionName, fn, autoAction, ref) { + if (autoAction === void 0) { + autoAction = false; + } + + if (false) {} + + function res() { + return executeAction(actionName, autoAction, fn, ref || this, arguments); + } + + res.isMobxAction = true; + + if (isFunctionNameConfigurable) { + tmpNameDescriptor.value = actionName; + Object.defineProperty(res, "name", tmpNameDescriptor); + } + + return res; +} +function executeAction(actionName, canRunAsDerivation, fn, scope, args) { + var runInfo = _startAction(actionName, canRunAsDerivation, scope, args); + + try { + return fn.apply(scope, args); + } catch (err) { + runInfo.error_ = err; + throw err; + } finally { + _endAction(runInfo); + } +} +function _startAction(actionName, canRunAsDerivation, // true for autoAction +scope, args) { + var notifySpy_ = false && 0; + var startTime_ = 0; + + if (false) { var flattenedArgs; } + + var prevDerivation_ = globalState.trackingDerivation; + var runAsAction = !canRunAsDerivation || !prevDerivation_; + startBatch(); + var prevAllowStateChanges_ = globalState.allowStateChanges; // by default preserve previous allow + + if (runAsAction) { + untrackedStart(); + prevAllowStateChanges_ = allowStateChangesStart(true); + } + + var prevAllowStateReads_ = allowStateReadsStart(true); + var runInfo = { + runAsAction_: runAsAction, + prevDerivation_: prevDerivation_, + prevAllowStateChanges_: prevAllowStateChanges_, + prevAllowStateReads_: prevAllowStateReads_, + notifySpy_: notifySpy_, + startTime_: startTime_, + actionId_: nextActionId++, + parentActionId_: currentActionId + }; + currentActionId = runInfo.actionId_; + return runInfo; +} +function _endAction(runInfo) { + if (currentActionId !== runInfo.actionId_) { + die(30); + } + + currentActionId = runInfo.parentActionId_; + + if (runInfo.error_ !== undefined) { + globalState.suppressReactionErrors = true; + } + + allowStateChangesEnd(runInfo.prevAllowStateChanges_); + allowStateReadsEnd(runInfo.prevAllowStateReads_); + endBatch(); + if (runInfo.runAsAction_) untrackedEnd(runInfo.prevDerivation_); + + if (false) {} + + globalState.suppressReactionErrors = false; +} +function allowStateChanges(allowStateChanges, func) { + var prev = allowStateChangesStart(allowStateChanges); + + try { + return func(); + } finally { + allowStateChangesEnd(prev); + } +} +function allowStateChangesStart(allowStateChanges) { + var prev = globalState.allowStateChanges; + globalState.allowStateChanges = allowStateChanges; + return prev; +} +function allowStateChangesEnd(prev) { + globalState.allowStateChanges = prev; +} + +function _defineProperties(target, props) { + for (var i = 0; i < props.length; i++) { + var descriptor = props[i]; + descriptor.enumerable = descriptor.enumerable || false; + descriptor.configurable = true; + if ("value" in descriptor) descriptor.writable = true; + Object.defineProperty(target, descriptor.key, descriptor); + } +} + +function _createClass(Constructor, protoProps, staticProps) { + if (protoProps) _defineProperties(Constructor.prototype, protoProps); + if (staticProps) _defineProperties(Constructor, staticProps); + return Constructor; +} + +function _extends() { + _extends = Object.assign || function (target) { + for (var i = 1; i < arguments.length; i++) { + var source = arguments[i]; + + for (var key in source) { + if (Object.prototype.hasOwnProperty.call(source, key)) { + target[key] = source[key]; + } + } + } + + return target; + }; + + return _extends.apply(this, arguments); +} + +function _inheritsLoose(subClass, superClass) { + subClass.prototype = Object.create(superClass.prototype); + subClass.prototype.constructor = subClass; + subClass.__proto__ = superClass; +} + +function _assertThisInitialized(self) { + if (self === void 0) { + throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); + } + + return self; +} + +function _unsupportedIterableToArray(o, minLen) { + if (!o) return; + if (typeof o === "string") return _arrayLikeToArray(o, minLen); + var n = Object.prototype.toString.call(o).slice(8, -1); + if (n === "Object" && o.constructor) n = o.constructor.name; + if (n === "Map" || n === "Set") return Array.from(o); + if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); +} + +function _arrayLikeToArray(arr, len) { + if (len == null || len > arr.length) len = arr.length; + + for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i]; + + return arr2; +} + +function _createForOfIteratorHelperLoose(o, allowArrayLike) { + var it; + + if (typeof Symbol === "undefined" || o[Symbol.iterator] == null) { + if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === "number") { + if (it) o = it; + var i = 0; + return function () { + if (i >= o.length) return { + done: true + }; + return { + done: false, + value: o[i++] + }; + }; + } + + throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); + } + + it = o[Symbol.iterator](); + return it.next.bind(it); +} + +var _Symbol$toPrimitive; +var CREATE = "create"; +_Symbol$toPrimitive = Symbol.toPrimitive; +var ObservableValue = /*#__PURE__*/function (_Atom) { + _inheritsLoose(ObservableValue, _Atom); + + function ObservableValue(value, enhancer, name_, notifySpy, equals) { + var _this; + + if (name_ === void 0) { + name_ = "ObservableValue@" + getNextId(); + } + + if (notifySpy === void 0) { + notifySpy = true; + } + + if (equals === void 0) { + equals = comparer["default"]; + } + + _this = _Atom.call(this, name_) || this; + _this.enhancer = void 0; + _this.name_ = void 0; + _this.equals = void 0; + _this.hasUnreportedChange_ = false; + _this.interceptors_ = void 0; + _this.changeListeners_ = void 0; + _this.value_ = void 0; + _this.dehancer = void 0; + _this.enhancer = enhancer; + _this.name_ = name_; + _this.equals = equals; + _this.value_ = enhancer(value, undefined, name_); + + if (false) {} + + return _this; + } + + var _proto = ObservableValue.prototype; + + _proto.dehanceValue = function dehanceValue(value) { + if (this.dehancer !== undefined) return this.dehancer(value); + return value; + }; + + _proto.set = function set(newValue) { + var oldValue = this.value_; + newValue = this.prepareNewValue_(newValue); + + if (newValue !== globalState.UNCHANGED) { + var notifySpy = isSpyEnabled(); + + if (false) {} + + this.setNewValue_(newValue); + if (false) {} + } + }; + + _proto.prepareNewValue_ = function prepareNewValue_(newValue) { + checkIfStateModificationsAreAllowed(this); + + if (hasInterceptors(this)) { + var change = interceptChange(this, { + object: this, + type: UPDATE, + newValue: newValue + }); + if (!change) return globalState.UNCHANGED; + newValue = change.newValue; + } // apply modifier + + + newValue = this.enhancer(newValue, this.value_, this.name_); + return this.equals(this.value_, newValue) ? globalState.UNCHANGED : newValue; + }; + + _proto.setNewValue_ = function setNewValue_(newValue) { + var oldValue = this.value_; + this.value_ = newValue; + this.reportChanged(); + + if (hasListeners(this)) { + notifyListeners(this, { + type: UPDATE, + object: this, + newValue: newValue, + oldValue: oldValue + }); + } + }; + + _proto.get = function get() { + this.reportObserved(); + return this.dehanceValue(this.value_); + }; + + _proto.intercept_ = function intercept_(handler) { + return registerInterceptor(this, handler); + }; + + _proto.observe_ = function observe_(listener, fireImmediately) { + if (fireImmediately) listener({ + observableKind: "value", + debugObjectName: this.name_, + object: this, + type: UPDATE, + newValue: this.value_, + oldValue: undefined + }); + return registerListener(this, listener); + }; + + _proto.raw = function raw() { + // used by MST ot get undehanced value + return this.value_; + }; + + _proto.toJSON = function toJSON() { + return this.get(); + }; + + _proto.toString = function toString() { + return this.name_ + "[" + this.value_ + "]"; + }; + + _proto.valueOf = function valueOf() { + return toPrimitive(this.get()); + }; + + _proto[_Symbol$toPrimitive] = function () { + return this.valueOf(); + }; + + return ObservableValue; +}(Atom); +var isObservableValue = /*#__PURE__*/createInstanceofPredicate("ObservableValue", ObservableValue); + +var _Symbol$toPrimitive$1; +/** + * A node in the state dependency root that observes other nodes, and can be observed itself. + * + * ComputedValue will remember the result of the computation for the duration of the batch, or + * while being observed. + * + * During this time it will recompute only when one of its direct dependencies changed, + * but only when it is being accessed with `ComputedValue.get()`. + * + * Implementation description: + * 1. First time it's being accessed it will compute and remember result + * give back remembered result until 2. happens + * 2. First time any deep dependency change, propagate POSSIBLY_STALE to all observers, wait for 3. + * 3. When it's being accessed, recompute if any shallow dependency changed. + * if result changed: propagate STALE to all observers, that were POSSIBLY_STALE from the last step. + * go to step 2. either way + * + * If at any point it's outside batch and it isn't observed: reset everything and go to 1. + */ + +_Symbol$toPrimitive$1 = Symbol.toPrimitive; +var ComputedValue = /*#__PURE__*/function () { + // nodes we are looking at. Our value depends on these nodes + // during tracking it's an array with new observed observers + // to check for cycles + // N.B: unminified as it is used by MST + + /** + * Create a new computed value based on a function expression. + * + * The `name` property is for debug purposes only. + * + * The `equals` property specifies the comparer function to use to determine if a newly produced + * value differs from the previous value. Two comparers are provided in the library; `defaultComparer` + * compares based on identity comparison (===), and `structuralComparer` deeply compares the structure. + * Structural comparison can be convenient if you always produce a new aggregated object and + * don't want to notify observers if it is structurally the same. + * This is useful for working with vectors, mouse coordinates etc. + */ + function ComputedValue(options) { + this.dependenciesState_ = IDerivationState_.NOT_TRACKING_; + this.observing_ = []; + this.newObserving_ = null; + this.isBeingObserved_ = false; + this.isPendingUnobservation_ = false; + this.observers_ = new Set(); + this.diffValue_ = 0; + this.runId_ = 0; + this.lastAccessedBy_ = 0; + this.lowestObserverState_ = IDerivationState_.UP_TO_DATE_; + this.unboundDepsCount_ = 0; + this.mapid_ = "#" + getNextId(); + this.value_ = new CaughtException(null); + this.name_ = void 0; + this.triggeredBy_ = void 0; + this.isComputing_ = false; + this.isRunningSetter_ = false; + this.derivation = void 0; + this.setter_ = void 0; + this.isTracing_ = TraceMode.NONE; + this.scope_ = void 0; + this.equals_ = void 0; + this.requiresReaction_ = void 0; + this.keepAlive_ = void 0; + this.onBOL = void 0; + this.onBUOL = void 0; + if (!options.get) die(31); + this.derivation = options.get; + this.name_ = options.name || "ComputedValue@" + getNextId(); + if (options.set) this.setter_ = createAction(this.name_ + "-setter", options.set); + this.equals_ = options.equals || (options.compareStructural || options.struct ? comparer.structural : comparer["default"]); + this.scope_ = options.context; + this.requiresReaction_ = !!options.requiresReaction; + this.keepAlive_ = !!options.keepAlive; + } + + var _proto = ComputedValue.prototype; + + _proto.onBecomeStale_ = function onBecomeStale_() { + propagateMaybeChanged(this); + }; + + _proto.onBO = function onBO() { + if (this.onBOL) { + this.onBOL.forEach(function (listener) { + return listener(); + }); + } + }; + + _proto.onBUO = function onBUO() { + if (this.onBUOL) { + this.onBUOL.forEach(function (listener) { + return listener(); + }); + } + } + /** + * Returns the current value of this computed value. + * Will evaluate its computation first if needed. + */ + ; + + _proto.get = function get() { + if (this.isComputing_) die(32, this.name_, this.derivation); + + if (globalState.inBatch === 0 && // !globalState.trackingDerivatpion && + this.observers_.size === 0 && !this.keepAlive_) { + if (shouldCompute(this)) { + this.warnAboutUntrackedRead_(); + startBatch(); // See perf test 'computed memoization' + + this.value_ = this.computeValue_(false); + endBatch(); + } + } else { + reportObserved(this); + + if (shouldCompute(this)) { + var prevTrackingContext = globalState.trackingContext; + if (this.keepAlive_ && !prevTrackingContext) globalState.trackingContext = this; + if (this.trackAndCompute()) propagateChangeConfirmed(this); + globalState.trackingContext = prevTrackingContext; + } + } + + var result = this.value_; + if (isCaughtException(result)) throw result.cause; + return result; + }; + + _proto.set = function set(value) { + if (this.setter_) { + if (this.isRunningSetter_) die(33, this.name_); + this.isRunningSetter_ = true; + + try { + this.setter_.call(this.scope_, value); + } finally { + this.isRunningSetter_ = false; + } + } else die(34, this.name_); + }; + + _proto.trackAndCompute = function trackAndCompute() { + // N.B: unminified as it is used by MST + var oldValue = this.value_; + var wasSuspended = + /* see #1208 */ + this.dependenciesState_ === IDerivationState_.NOT_TRACKING_; + var newValue = this.computeValue_(true); + + if (false) {} + + var changed = wasSuspended || isCaughtException(oldValue) || isCaughtException(newValue) || !this.equals_(oldValue, newValue); + + if (changed) { + this.value_ = newValue; + } + + return changed; + }; + + _proto.computeValue_ = function computeValue_(track) { + this.isComputing_ = true; // don't allow state changes during computation + + var prev = allowStateChangesStart(false); + var res; + + if (track) { + res = trackDerivedFunction(this, this.derivation, this.scope_); + } else { + if (globalState.disableErrorBoundaries === true) { + res = this.derivation.call(this.scope_); + } else { + try { + res = this.derivation.call(this.scope_); + } catch (e) { + res = new CaughtException(e); + } + } + } + + allowStateChangesEnd(prev); + this.isComputing_ = false; + return res; + }; + + _proto.suspend_ = function suspend_() { + if (!this.keepAlive_) { + clearObserving(this); + this.value_ = undefined; // don't hold on to computed value! + } + }; + + _proto.observe_ = function observe_(listener, fireImmediately) { + var _this = this; + + var firstTime = true; + var prevValue = undefined; + return autorun(function () { + // TODO: why is this in a different place than the spyReport() function? in all other observables it's called in the same place + var newValue = _this.get(); + + if (!firstTime || fireImmediately) { + var prevU = untrackedStart(); + listener({ + observableKind: "computed", + debugObjectName: _this.name_, + type: UPDATE, + object: _this, + newValue: newValue, + oldValue: prevValue + }); + untrackedEnd(prevU); + } + + firstTime = false; + prevValue = newValue; + }); + }; + + _proto.warnAboutUntrackedRead_ = function warnAboutUntrackedRead_() { + if (true) return; + + if (this.requiresReaction_ === true) { + die("[mobx] Computed value " + this.name_ + " is read outside a reactive context"); + } + + if (this.isTracing_ !== TraceMode.NONE) { + console.log("[mobx.trace] '" + this.name_ + "' is being read outside a reactive context. Doing a full recompute"); + } + + if (globalState.computedRequiresReaction) { + console.warn("[mobx] Computed value " + this.name_ + " is being read outside a reactive context. Doing a full recompute"); + } + }; + + _proto.toString = function toString() { + return this.name_ + "[" + this.derivation.toString() + "]"; + }; + + _proto.valueOf = function valueOf() { + return toPrimitive(this.get()); + }; + + _proto[_Symbol$toPrimitive$1] = function () { + return this.valueOf(); + }; + + return ComputedValue; +}(); +var isComputedValue = /*#__PURE__*/createInstanceofPredicate("ComputedValue", ComputedValue); + +var IDerivationState_; + +(function (IDerivationState_) { + // before being run or (outside batch and not being observed) + // at this point derivation is not holding any data about dependency tree + IDerivationState_[IDerivationState_["NOT_TRACKING_"] = -1] = "NOT_TRACKING_"; // no shallow dependency changed since last computation + // won't recalculate derivation + // this is what makes mobx fast + + IDerivationState_[IDerivationState_["UP_TO_DATE_"] = 0] = "UP_TO_DATE_"; // some deep dependency changed, but don't know if shallow dependency changed + // will require to check first if UP_TO_DATE or POSSIBLY_STALE + // currently only ComputedValue will propagate POSSIBLY_STALE + // + // having this state is second big optimization: + // don't have to recompute on every dependency change, but only when it's needed + + IDerivationState_[IDerivationState_["POSSIBLY_STALE_"] = 1] = "POSSIBLY_STALE_"; // A shallow dependency has changed since last computation and the derivation + // will need to recompute when it's needed next. + + IDerivationState_[IDerivationState_["STALE_"] = 2] = "STALE_"; +})(IDerivationState_ || (IDerivationState_ = {})); + +var TraceMode; + +(function (TraceMode) { + TraceMode[TraceMode["NONE"] = 0] = "NONE"; + TraceMode[TraceMode["LOG"] = 1] = "LOG"; + TraceMode[TraceMode["BREAK"] = 2] = "BREAK"; +})(TraceMode || (TraceMode = {})); + +var CaughtException = function CaughtException(cause) { + this.cause = void 0; + this.cause = cause; // Empty +}; +function isCaughtException(e) { + return e instanceof CaughtException; +} +/** + * Finds out whether any dependency of the derivation has actually changed. + * If dependenciesState is 1 then it will recalculate dependencies, + * if any dependency changed it will propagate it by changing dependenciesState to 2. + * + * By iterating over the dependencies in the same order that they were reported and + * stopping on the first change, all the recalculations are only called for ComputedValues + * that will be tracked by derivation. That is because we assume that if the first x + * dependencies of the derivation doesn't change then the derivation should run the same way + * up until accessing x-th dependency. + */ + +function shouldCompute(derivation) { + switch (derivation.dependenciesState_) { + case IDerivationState_.UP_TO_DATE_: + return false; + + case IDerivationState_.NOT_TRACKING_: + case IDerivationState_.STALE_: + return true; + + case IDerivationState_.POSSIBLY_STALE_: + { + // state propagation can occur outside of action/reactive context #2195 + var prevAllowStateReads = allowStateReadsStart(true); + var prevUntracked = untrackedStart(); // no need for those computeds to be reported, they will be picked up in trackDerivedFunction. + + var obs = derivation.observing_, + l = obs.length; + + for (var i = 0; i < l; i++) { + var obj = obs[i]; + + if (isComputedValue(obj)) { + if (globalState.disableErrorBoundaries) { + obj.get(); + } else { + try { + obj.get(); + } catch (e) { + // we are not interested in the value *or* exception at this moment, but if there is one, notify all + untrackedEnd(prevUntracked); + allowStateReadsEnd(prevAllowStateReads); + return true; + } + } // if ComputedValue `obj` actually changed it will be computed and propagated to its observers. + // and `derivation` is an observer of `obj` + // invariantShouldCompute(derivation) + + + if (derivation.dependenciesState_ === IDerivationState_.STALE_) { + untrackedEnd(prevUntracked); + allowStateReadsEnd(prevAllowStateReads); + return true; + } + } + } + + changeDependenciesStateTo0(derivation); + untrackedEnd(prevUntracked); + allowStateReadsEnd(prevAllowStateReads); + return false; + } + } +} +function isComputingDerivation() { + return globalState.trackingDerivation !== null; // filter out actions inside computations +} +function checkIfStateModificationsAreAllowed(atom) { + if (true) { + return; + } + + var hasObservers = atom.observers_.size > 0; // Should not be possible to change observed state outside strict mode, except during initialization, see #563 + + if (!globalState.allowStateChanges && (hasObservers || globalState.enforceActions === "always")) console.warn("[MobX] " + (globalState.enforceActions ? "Since strict-mode is enabled, changing (observed) observable values without using an action is not allowed. Tried to modify: " : "Side effects like changing state are not allowed at this point. Are you trying to modify state from, for example, a computed value or the render function of a React component? You can wrap side effects in 'runInAction' (or decorate functions with 'action') if needed. Tried to modify: ") + atom.name_); +} +function checkIfStateReadsAreAllowed(observable) { + if (false) {} +} +/** + * Executes the provided function `f` and tracks which observables are being accessed. + * The tracking information is stored on the `derivation` object and the derivation is registered + * as observer of any of the accessed observables. + */ + +function trackDerivedFunction(derivation, f, context) { + var prevAllowStateReads = allowStateReadsStart(true); // pre allocate array allocation + room for variation in deps + // array will be trimmed by bindDependencies + + changeDependenciesStateTo0(derivation); + derivation.newObserving_ = new Array(derivation.observing_.length + 100); + derivation.unboundDepsCount_ = 0; + derivation.runId_ = ++globalState.runId; + var prevTracking = globalState.trackingDerivation; + globalState.trackingDerivation = derivation; + globalState.inBatch++; + var result; + + if (globalState.disableErrorBoundaries === true) { + result = f.call(context); + } else { + try { + result = f.call(context); + } catch (e) { + result = new CaughtException(e); + } + } + + globalState.inBatch--; + globalState.trackingDerivation = prevTracking; + bindDependencies(derivation); + warnAboutDerivationWithoutDependencies(derivation); + allowStateReadsEnd(prevAllowStateReads); + return result; +} + +function warnAboutDerivationWithoutDependencies(derivation) { + if (true) return; + if (derivation.observing_.length !== 0) return; + + if (globalState.reactionRequiresObservable || derivation.requiresObservable_) { + console.warn("[mobx] Derivation " + derivation.name_ + " is created/updated without reading any observable value"); + } +} +/** + * diffs newObserving with observing. + * update observing to be newObserving with unique observables + * notify observers that become observed/unobserved + */ + + +function bindDependencies(derivation) { + // invariant(derivation.dependenciesState !== IDerivationState.NOT_TRACKING, "INTERNAL ERROR bindDependencies expects derivation.dependenciesState !== -1"); + var prevObserving = derivation.observing_; + var observing = derivation.observing_ = derivation.newObserving_; + var lowestNewObservingDerivationState = IDerivationState_.UP_TO_DATE_; // Go through all new observables and check diffValue: (this list can contain duplicates): + // 0: first occurrence, change to 1 and keep it + // 1: extra occurrence, drop it + + var i0 = 0, + l = derivation.unboundDepsCount_; + + for (var i = 0; i < l; i++) { + var dep = observing[i]; + + if (dep.diffValue_ === 0) { + dep.diffValue_ = 1; + if (i0 !== i) observing[i0] = dep; + i0++; + } // Upcast is 'safe' here, because if dep is IObservable, `dependenciesState` will be undefined, + // not hitting the condition + + + if (dep.dependenciesState_ > lowestNewObservingDerivationState) { + lowestNewObservingDerivationState = dep.dependenciesState_; + } + } + + observing.length = i0; + derivation.newObserving_ = null; // newObserving shouldn't be needed outside tracking (statement moved down to work around FF bug, see #614) + // Go through all old observables and check diffValue: (it is unique after last bindDependencies) + // 0: it's not in new observables, unobserve it + // 1: it keeps being observed, don't want to notify it. change to 0 + + l = prevObserving.length; + + while (l--) { + var _dep = prevObserving[l]; + + if (_dep.diffValue_ === 0) { + removeObserver(_dep, derivation); + } + + _dep.diffValue_ = 0; + } // Go through all new observables and check diffValue: (now it should be unique) + // 0: it was set to 0 in last loop. don't need to do anything. + // 1: it wasn't observed, let's observe it. set back to 0 + + + while (i0--) { + var _dep2 = observing[i0]; + + if (_dep2.diffValue_ === 1) { + _dep2.diffValue_ = 0; + addObserver(_dep2, derivation); + } + } // Some new observed derivations may become stale during this derivation computation + // so they have had no chance to propagate staleness (#916) + + + if (lowestNewObservingDerivationState !== IDerivationState_.UP_TO_DATE_) { + derivation.dependenciesState_ = lowestNewObservingDerivationState; + derivation.onBecomeStale_(); + } +} + +function clearObserving(derivation) { + // invariant(globalState.inBatch > 0, "INTERNAL ERROR clearObserving should be called only inside batch"); + var obs = derivation.observing_; + derivation.observing_ = []; + var i = obs.length; + + while (i--) { + removeObserver(obs[i], derivation); + } + + derivation.dependenciesState_ = IDerivationState_.NOT_TRACKING_; +} +function untracked(action) { + var prev = untrackedStart(); + + try { + return action(); + } finally { + untrackedEnd(prev); + } +} +function untrackedStart() { + var prev = globalState.trackingDerivation; + globalState.trackingDerivation = null; + return prev; +} +function untrackedEnd(prev) { + globalState.trackingDerivation = prev; +} +function allowStateReadsStart(allowStateReads) { + var prev = globalState.allowStateReads; + globalState.allowStateReads = allowStateReads; + return prev; +} +function allowStateReadsEnd(prev) { + globalState.allowStateReads = prev; +} +/** + * needed to keep `lowestObserverState` correct. when changing from (2 or 1) to 0 + * + */ + +function changeDependenciesStateTo0(derivation) { + if (derivation.dependenciesState_ === IDerivationState_.UP_TO_DATE_) return; + derivation.dependenciesState_ = IDerivationState_.UP_TO_DATE_; + var obs = derivation.observing_; + var i = obs.length; + + while (i--) { + obs[i].lowestObserverState_ = IDerivationState_.UP_TO_DATE_; + } +} + +/** + * These values will persist if global state is reset + */ + +var persistentKeys = ["mobxGuid", "spyListeners", "enforceActions", "computedRequiresReaction", "reactionRequiresObservable", "observableRequiresReaction", "allowStateReads", "disableErrorBoundaries", "runId", "UNCHANGED", "useProxies"]; +var MobXGlobals = function MobXGlobals() { + this.version = 6; + this.UNCHANGED = {}; + this.trackingDerivation = null; + this.trackingContext = null; + this.runId = 0; + this.mobxGuid = 0; + this.inBatch = 0; + this.pendingUnobservations = []; + this.pendingReactions = []; + this.isRunningReactions = false; + this.allowStateChanges = false; + this.allowStateReads = true; + this.enforceActions = true; + this.spyListeners = []; + this.globalReactionErrorHandlers = []; + this.computedRequiresReaction = false; + this.reactionRequiresObservable = false; + this.observableRequiresReaction = false; + this.disableErrorBoundaries = false; + this.suppressReactionErrors = false; + this.useProxies = true; + this.verifyProxies = false; +}; +var canMergeGlobalState = true; +var isolateCalled = false; +var globalState = /*#__PURE__*/function () { + var global = /*#__PURE__*/getGlobal(); + if (global.__mobxInstanceCount > 0 && !global.__mobxGlobals) canMergeGlobalState = false; + if (global.__mobxGlobals && global.__mobxGlobals.version !== new MobXGlobals().version) canMergeGlobalState = false; + + if (!canMergeGlobalState) { + setTimeout(function () { + if (!isolateCalled) { + die(35); + } + }, 1); + return new MobXGlobals(); + } else if (global.__mobxGlobals) { + global.__mobxInstanceCount += 1; + if (!global.__mobxGlobals.UNCHANGED) global.__mobxGlobals.UNCHANGED = {}; // make merge backward compatible + + return global.__mobxGlobals; + } else { + global.__mobxInstanceCount = 1; + return global.__mobxGlobals = /*#__PURE__*/new MobXGlobals(); + } +}(); +function isolateGlobalState() { + if (globalState.pendingReactions.length || globalState.inBatch || globalState.isRunningReactions) die(36); + isolateCalled = true; + + if (canMergeGlobalState) { + var global = getGlobal(); + if (--global.__mobxInstanceCount === 0) global.__mobxGlobals = undefined; + globalState = new MobXGlobals(); + } +} +function getGlobalState() { + return globalState; +} +/** + * For testing purposes only; this will break the internal state of existing observables, + * but can be used to get back at a stable state after throwing errors + */ + +function resetGlobalState() { + var defaultGlobals = new MobXGlobals(); + + for (var key in defaultGlobals) { + if (persistentKeys.indexOf(key) === -1) globalState[key] = defaultGlobals[key]; + } + + globalState.allowStateChanges = !globalState.enforceActions; +} + +function hasObservers(observable) { + return observable.observers_ && observable.observers_.size > 0; +} +function getObservers(observable) { + return observable.observers_; +} // function invariantObservers(observable: IObservable) { +// const list = observable.observers +// const map = observable.observersIndexes +// const l = list.length +// for (let i = 0; i < l; i++) { +// const id = list[i].__mapid +// if (i) { +// invariant(map[id] === i, "INTERNAL ERROR maps derivation.__mapid to index in list") // for performance +// } else { +// invariant(!(id in map), "INTERNAL ERROR observer on index 0 shouldn't be held in map.") // for performance +// } +// } +// invariant( +// list.length === 0 || Object.keys(map).length === list.length - 1, +// "INTERNAL ERROR there is no junk in map" +// ) +// } + +function addObserver(observable, node) { + // invariant(node.dependenciesState !== -1, "INTERNAL ERROR, can add only dependenciesState !== -1"); + // invariant(observable._observers.indexOf(node) === -1, "INTERNAL ERROR add already added node"); + // invariantObservers(observable); + observable.observers_.add(node); + if (observable.lowestObserverState_ > node.dependenciesState_) observable.lowestObserverState_ = node.dependenciesState_; // invariantObservers(observable); + // invariant(observable._observers.indexOf(node) !== -1, "INTERNAL ERROR didn't add node"); +} +function removeObserver(observable, node) { + // invariant(globalState.inBatch > 0, "INTERNAL ERROR, remove should be called only inside batch"); + // invariant(observable._observers.indexOf(node) !== -1, "INTERNAL ERROR remove already removed node"); + // invariantObservers(observable); + observable.observers_["delete"](node); + + if (observable.observers_.size === 0) { + // deleting last observer + queueForUnobservation(observable); + } // invariantObservers(observable); + // invariant(observable._observers.indexOf(node) === -1, "INTERNAL ERROR remove already removed node2"); + +} +function queueForUnobservation(observable) { + if (observable.isPendingUnobservation_ === false) { + // invariant(observable._observers.length === 0, "INTERNAL ERROR, should only queue for unobservation unobserved observables"); + observable.isPendingUnobservation_ = true; + globalState.pendingUnobservations.push(observable); + } +} +/** + * Batch starts a transaction, at least for purposes of memoizing ComputedValues when nothing else does. + * During a batch `onBecomeUnobserved` will be called at most once per observable. + * Avoids unnecessary recalculations. + */ + +function startBatch() { + globalState.inBatch++; +} +function endBatch() { + if (--globalState.inBatch === 0) { + runReactions(); // the batch is actually about to finish, all unobserving should happen here. + + var list = globalState.pendingUnobservations; + + for (var i = 0; i < list.length; i++) { + var observable = list[i]; + observable.isPendingUnobservation_ = false; + + if (observable.observers_.size === 0) { + if (observable.isBeingObserved_) { + // if this observable had reactive observers, trigger the hooks + observable.isBeingObserved_ = false; + observable.onBUO(); + } + + if (observable instanceof ComputedValue) { + // computed values are automatically teared down when the last observer leaves + // this process happens recursively, this computed might be the last observabe of another, etc.. + observable.suspend_(); + } + } + } + + globalState.pendingUnobservations = []; + } +} +function reportObserved(observable) { + checkIfStateReadsAreAllowed(observable); + var derivation = globalState.trackingDerivation; + + if (derivation !== null) { + /** + * Simple optimization, give each derivation run an unique id (runId) + * Check if last time this observable was accessed the same runId is used + * if this is the case, the relation is already known + */ + if (derivation.runId_ !== observable.lastAccessedBy_) { + observable.lastAccessedBy_ = derivation.runId_; // Tried storing newObserving, or observing, or both as Set, but performance didn't come close... + + derivation.newObserving_[derivation.unboundDepsCount_++] = observable; + + if (!observable.isBeingObserved_ && globalState.trackingContext) { + observable.isBeingObserved_ = true; + observable.onBO(); + } + } + + return true; + } else if (observable.observers_.size === 0 && globalState.inBatch > 0) { + queueForUnobservation(observable); + } + + return false; +} // function invariantLOS(observable: IObservable, msg: string) { +// // it's expensive so better not run it in produciton. but temporarily helpful for testing +// const min = getObservers(observable).reduce((a, b) => Math.min(a, b.dependenciesState), 2) +// if (min >= observable.lowestObserverState) return // <- the only assumption about `lowestObserverState` +// throw new Error( +// "lowestObserverState is wrong for " + +// msg + +// " because " + +// min + +// " < " + +// observable.lowestObserverState +// ) +// } + +/** + * NOTE: current propagation mechanism will in case of self reruning autoruns behave unexpectedly + * It will propagate changes to observers from previous run + * It's hard or maybe impossible (with reasonable perf) to get it right with current approach + * Hopefully self reruning autoruns aren't a feature people should depend on + * Also most basic use cases should be ok + */ +// Called by Atom when its value changes + +function propagateChanged(observable) { + // invariantLOS(observable, "changed start"); + if (observable.lowestObserverState_ === IDerivationState_.STALE_) return; + observable.lowestObserverState_ = IDerivationState_.STALE_; // Ideally we use for..of here, but the downcompiled version is really slow... + + observable.observers_.forEach(function (d) { + if (d.dependenciesState_ === IDerivationState_.UP_TO_DATE_) { + if (false) {} + + d.onBecomeStale_(); + } + + d.dependenciesState_ = IDerivationState_.STALE_; + }); // invariantLOS(observable, "changed end"); +} // Called by ComputedValue when it recalculate and its value changed + +function propagateChangeConfirmed(observable) { + // invariantLOS(observable, "confirmed start"); + if (observable.lowestObserverState_ === IDerivationState_.STALE_) return; + observable.lowestObserverState_ = IDerivationState_.STALE_; + observable.observers_.forEach(function (d) { + if (d.dependenciesState_ === IDerivationState_.POSSIBLY_STALE_) d.dependenciesState_ = IDerivationState_.STALE_;else if (d.dependenciesState_ === IDerivationState_.UP_TO_DATE_ // this happens during computing of `d`, just keep lowestObserverState up to date. + ) observable.lowestObserverState_ = IDerivationState_.UP_TO_DATE_; + }); // invariantLOS(observable, "confirmed end"); +} // Used by computed when its dependency changed, but we don't wan't to immediately recompute. + +function propagateMaybeChanged(observable) { + // invariantLOS(observable, "maybe start"); + if (observable.lowestObserverState_ !== IDerivationState_.UP_TO_DATE_) return; + observable.lowestObserverState_ = IDerivationState_.POSSIBLY_STALE_; + observable.observers_.forEach(function (d) { + if (d.dependenciesState_ === IDerivationState_.UP_TO_DATE_) { + d.dependenciesState_ = IDerivationState_.POSSIBLY_STALE_; + + if (false) {} + + d.onBecomeStale_(); + } + }); // invariantLOS(observable, "maybe end"); +} + +function logTraceInfo(derivation, observable) { + console.log("[mobx.trace] '" + derivation.name_ + "' is invalidated due to a change in: '" + observable.name_ + "'"); + + if (derivation.isTracing_ === TraceMode.BREAK) { + var lines = []; + printDepTree(getDependencyTree(derivation), lines, 1); // prettier-ignore + + new Function("debugger;\n/*\nTracing '" + derivation.name_ + "'\n\nYou are entering this break point because derivation '" + derivation.name_ + "' is being traced and '" + observable.name_ + "' is now forcing it to update.\nJust follow the stacktrace you should now see in the devtools to see precisely what piece of your code is causing this update\nThe stackframe you are looking for is at least ~6-8 stack-frames up.\n\n" + (derivation instanceof ComputedValue ? derivation.derivation.toString().replace(/[*]\//g, "/") : "") + "\n\nThe dependencies for this derivation are:\n\n" + lines.join("\n") + "\n*/\n ")(); + } +} + +function printDepTree(tree, lines, depth) { + if (lines.length >= 1000) { + lines.push("(and many more)"); + return; + } + + lines.push("" + new Array(depth).join("\t") + tree.name); // MWE: not the fastest, but the easiest way :) + + if (tree.dependencies) tree.dependencies.forEach(function (child) { + return printDepTree(child, lines, depth + 1); + }); +} + +var Reaction = /*#__PURE__*/function () { + // nodes we are looking at. Our value depends on these nodes + function Reaction(name_, onInvalidate_, errorHandler_, requiresObservable_) { + if (name_ === void 0) { + name_ = "Reaction@" + getNextId(); + } + + if (requiresObservable_ === void 0) { + requiresObservable_ = false; + } + + this.name_ = void 0; + this.onInvalidate_ = void 0; + this.errorHandler_ = void 0; + this.requiresObservable_ = void 0; + this.observing_ = []; + this.newObserving_ = []; + this.dependenciesState_ = IDerivationState_.NOT_TRACKING_; + this.diffValue_ = 0; + this.runId_ = 0; + this.unboundDepsCount_ = 0; + this.mapid_ = "#" + getNextId(); + this.isDisposed_ = false; + this.isScheduled_ = false; + this.isTrackPending_ = false; + this.isRunning_ = false; + this.isTracing_ = TraceMode.NONE; + this.name_ = name_; + this.onInvalidate_ = onInvalidate_; + this.errorHandler_ = errorHandler_; + this.requiresObservable_ = requiresObservable_; + } + + var _proto = Reaction.prototype; + + _proto.onBecomeStale_ = function onBecomeStale_() { + this.schedule_(); + }; + + _proto.schedule_ = function schedule_() { + if (!this.isScheduled_) { + this.isScheduled_ = true; + globalState.pendingReactions.push(this); + runReactions(); + } + }; + + _proto.isScheduled = function isScheduled() { + return this.isScheduled_; + } + /** + * internal, use schedule() if you intend to kick off a reaction + */ + ; + + _proto.runReaction_ = function runReaction_() { + if (!this.isDisposed_) { + startBatch(); + this.isScheduled_ = false; + + if (shouldCompute(this)) { + this.isTrackPending_ = true; + + try { + this.onInvalidate_(); + + if (false) {} + } catch (e) { + this.reportExceptionInDerivation_(e); + } + } + + endBatch(); + } + }; + + _proto.track = function track(fn) { + if (this.isDisposed_) { + return; // console.warn("Reaction already disposed") // Note: Not a warning / error in mobx 4 either + } + + startBatch(); + var notify = isSpyEnabled(); + var startTime; + + if (false) {} + + this.isRunning_ = true; + var prevReaction = globalState.trackingContext; // reactions could create reactions... + + globalState.trackingContext = this; + var result = trackDerivedFunction(this, fn, undefined); + globalState.trackingContext = prevReaction; + this.isRunning_ = false; + this.isTrackPending_ = false; + + if (this.isDisposed_) { + // disposed during last run. Clean up everything that was bound after the dispose call. + clearObserving(this); + } + + if (isCaughtException(result)) this.reportExceptionInDerivation_(result.cause); + + if (false) {} + + endBatch(); + }; + + _proto.reportExceptionInDerivation_ = function reportExceptionInDerivation_(error) { + var _this = this; + + if (this.errorHandler_) { + this.errorHandler_(error, this); + return; + } + + if (globalState.disableErrorBoundaries) throw error; + var message = false ? 0 : "[mobx] uncaught error in '" + this + "'"; + + if (!globalState.suppressReactionErrors) { + console.error(message, error); + /** If debugging brought you here, please, read the above message :-). Tnx! */ + } else if (false) {} // prettier-ignore + + + if (false) {} + + globalState.globalReactionErrorHandlers.forEach(function (f) { + return f(error, _this); + }); + }; + + _proto.dispose = function dispose() { + if (!this.isDisposed_) { + this.isDisposed_ = true; + + if (!this.isRunning_) { + // if disposed while running, clean up later. Maybe not optimal, but rare case + startBatch(); + clearObserving(this); + endBatch(); + } + } + }; + + _proto.getDisposer_ = function getDisposer_() { + var r = this.dispose.bind(this); + r[$mobx] = this; + return r; + }; + + _proto.toString = function toString() { + return "Reaction[" + this.name_ + "]"; + }; + + _proto.trace = function trace$1(enterBreakPoint) { + if (enterBreakPoint === void 0) { + enterBreakPoint = false; + } + + trace(this, enterBreakPoint); + }; + + return Reaction; +}(); +function onReactionError(handler) { + globalState.globalReactionErrorHandlers.push(handler); + return function () { + var idx = globalState.globalReactionErrorHandlers.indexOf(handler); + if (idx >= 0) globalState.globalReactionErrorHandlers.splice(idx, 1); + }; +} +/** + * Magic number alert! + * Defines within how many times a reaction is allowed to re-trigger itself + * until it is assumed that this is gonna be a never ending loop... + */ + +var MAX_REACTION_ITERATIONS = 100; + +var reactionScheduler = function reactionScheduler(f) { + return f(); +}; + +function runReactions() { + // Trampolining, if runReactions are already running, new reactions will be picked up + if (globalState.inBatch > 0 || globalState.isRunningReactions) return; + reactionScheduler(runReactionsHelper); +} + +function runReactionsHelper() { + globalState.isRunningReactions = true; + var allReactions = globalState.pendingReactions; + var iterations = 0; // While running reactions, new reactions might be triggered. + // Hence we work with two variables and check whether + // we converge to no remaining reactions after a while. + + while (allReactions.length > 0) { + if (++iterations === MAX_REACTION_ITERATIONS) { + console.error( false ? 0 : "[mobx] cycle in reaction: " + allReactions[0]); + allReactions.splice(0); // clear reactions + } + + var remainingReactions = allReactions.splice(0); + + for (var i = 0, l = remainingReactions.length; i < l; i++) { + remainingReactions[i].runReaction_(); + } + } + + globalState.isRunningReactions = false; +} + +var isReaction = /*#__PURE__*/createInstanceofPredicate("Reaction", Reaction); +function setReactionScheduler(fn) { + var baseScheduler = reactionScheduler; + + reactionScheduler = function reactionScheduler(f) { + return fn(function () { + return baseScheduler(f); + }); + }; +} + +function isSpyEnabled() { + return false && 0; +} +function spyReport(event) { + if (true) return; // dead code elimination can do the rest + + if (!globalState.spyListeners.length) return; + var listeners = globalState.spyListeners; + + for (var i = 0, l = listeners.length; i < l; i++) { + listeners[i](event); + } +} +function spyReportStart(event) { + if (true) return; + + var change = _extends({}, event, { + spyReportStart: true + }); + + spyReport(change); +} +var END_EVENT = { + type: "report-end", + spyReportEnd: true +}; +function spyReportEnd(change) { + if (true) return; + if (change) spyReport(_extends({}, change, { + type: "report-end", + spyReportEnd: true + }));else spyReport(END_EVENT); +} +function spy(listener) { + if (true) { + console.warn("[mobx.spy] Is a no-op in production builds"); + return function () {}; + } else {} +} + +var ACTION = "action"; +var ACTION_BOUND = "action.bound"; +var AUTOACTION = "autoAction"; +var AUTOACTION_BOUND = "autoAction.bound"; +var ACTION_UNNAMED = ""; + +function createActionFactory(autoAction, annotation) { + var res = function action(arg1, arg2) { + // action(fn() {}) + if (isFunction(arg1)) return createAction(arg1.name || ACTION_UNNAMED, arg1, autoAction); // action("name", fn() {}) + + if (isFunction(arg2)) return createAction(arg1, arg2, autoAction); // @action + + if (isStringish(arg2)) { + return storeDecorator(arg1, arg2, annotation); + } // Annation: action("name") & @action("name") + + + if (isStringish(arg1)) { + return createDecoratorAndAnnotation(annotation, arg1); + } + + if (false) {} + }; + + res.annotationType_ = annotation; + return res; +} + +var action = /*#__PURE__*/createActionFactory(false, ACTION); +var autoAction = /*#__PURE__*/createActionFactory(true, AUTOACTION); +action.bound = /*#__PURE__*/createDecorator(ACTION_BOUND); +autoAction.bound = /*#__PURE__*/createDecorator(AUTOACTION_BOUND); +function runInAction(fn) { + return executeAction(fn.name || ACTION_UNNAMED, false, fn, this, undefined); +} +function isAction(thing) { + return isFunction(thing) && thing.isMobxAction === true; +} + +/** + * Creates a named reactive view and keeps it alive, so that the view is always + * updated if one of the dependencies changes, even when the view is not further used by something else. + * @param view The reactive view + * @returns disposer function, which can be used to stop the view from being updated in the future. + */ + +function autorun(view, opts) { + if (opts === void 0) { + opts = EMPTY_OBJECT; + } + + if (false) {} + + var name = opts && opts.name || view.name || "Autorun@" + getNextId(); + var runSync = !opts.scheduler && !opts.delay; + var reaction; + + if (runSync) { + // normal autorun + reaction = new Reaction(name, function () { + this.track(reactionRunner); + }, opts.onError, opts.requiresObservable); + } else { + var scheduler = createSchedulerFromOptions(opts); // debounced autorun + + var isScheduled = false; + reaction = new Reaction(name, function () { + if (!isScheduled) { + isScheduled = true; + scheduler(function () { + isScheduled = false; + if (!reaction.isDisposed_) reaction.track(reactionRunner); + }); + } + }, opts.onError, opts.requiresObservable); + } + + function reactionRunner() { + view(reaction); + } + + reaction.schedule_(); + return reaction.getDisposer_(); +} + +var run = function run(f) { + return f(); +}; + +function createSchedulerFromOptions(opts) { + return opts.scheduler ? opts.scheduler : opts.delay ? function (f) { + return setTimeout(f, opts.delay); + } : run; +} + +function reaction(expression, effect, opts) { + if (opts === void 0) { + opts = EMPTY_OBJECT; + } + + if (false) {} + + var name = opts.name || "Reaction@" + getNextId(); + var effectAction = action(name, opts.onError ? wrapErrorHandler(opts.onError, effect) : effect); + var runSync = !opts.scheduler && !opts.delay; + var scheduler = createSchedulerFromOptions(opts); + var firstTime = true; + var isScheduled = false; + var value; + var oldValue = undefined; // only an issue with fireImmediately + + var equals = opts.compareStructural ? comparer.structural : opts.equals || comparer["default"]; + var r = new Reaction(name, function () { + if (firstTime || runSync) { + reactionRunner(); + } else if (!isScheduled) { + isScheduled = true; + scheduler(reactionRunner); + } + }, opts.onError, opts.requiresObservable); + + function reactionRunner() { + isScheduled = false; + if (r.isDisposed_) return; + var changed = false; + r.track(function () { + var nextValue = allowStateChanges(false, function () { + return expression(r); + }); + changed = firstTime || !equals(value, nextValue); + oldValue = value; + value = nextValue; + }); + if (firstTime && opts.fireImmediately) effectAction(value, oldValue, r);else if (!firstTime && changed) effectAction(value, oldValue, r); + firstTime = false; + } + + r.schedule_(); + return r.getDisposer_(); +} + +function wrapErrorHandler(errorHandler, baseFn) { + return function () { + try { + return baseFn.apply(this, arguments); + } catch (e) { + errorHandler.call(this, e); + } + }; +} + +var ON_BECOME_OBSERVED = "onBO"; +var ON_BECOME_UNOBSERVED = "onBUO"; +function onBecomeObserved(thing, arg2, arg3) { + return interceptHook(ON_BECOME_OBSERVED, thing, arg2, arg3); +} +function onBecomeUnobserved(thing, arg2, arg3) { + return interceptHook(ON_BECOME_UNOBSERVED, thing, arg2, arg3); +} + +function interceptHook(hook, thing, arg2, arg3) { + var atom = typeof arg3 === "function" ? getAtom(thing, arg2) : getAtom(thing); + var cb = isFunction(arg3) ? arg3 : arg2; + var listenersKey = hook + "L"; + + if (atom[listenersKey]) { + atom[listenersKey].add(cb); + } else { + atom[listenersKey] = new Set([cb]); + } + + return function () { + var hookListeners = atom[listenersKey]; + + if (hookListeners) { + hookListeners["delete"](cb); + + if (hookListeners.size === 0) { + delete atom[listenersKey]; + } + } + }; +} + +var NEVER = "never"; +var ALWAYS = "always"; +var OBSERVED = "observed"; // const IF_AVAILABLE = "ifavailable" + +function configure(options) { + if (options.isolateGlobalState === true) { + isolateGlobalState(); + } + + var useProxies = options.useProxies, + enforceActions = options.enforceActions; + + if (useProxies !== undefined) { + globalState.useProxies = useProxies === ALWAYS ? true : useProxies === NEVER ? false : typeof Proxy !== "undefined"; + } + + if (useProxies === "ifavailable") globalState.verifyProxies = true; + + if (enforceActions !== undefined) { + var ea = enforceActions === ALWAYS ? ALWAYS : enforceActions === OBSERVED; + globalState.enforceActions = ea; + globalState.allowStateChanges = ea === true || ea === ALWAYS ? false : true; + } + ["computedRequiresReaction", "reactionRequiresObservable", "observableRequiresReaction", "disableErrorBoundaries"].forEach(function (key) { + if (key in options) globalState[key] = !!options[key]; + }); + globalState.allowStateReads = !globalState.observableRequiresReaction; + + if (false) {} + + if (options.reactionScheduler) { + setReactionScheduler(options.reactionScheduler); + } +} + +function extendObservable(target, properties, annotations, options) { + if (false) {} + + var o = asCreateObservableOptions(options); + var adm = asObservableObject(target, o.name, getEnhancerFromOption(o)); + startBatch(); + + try { + var descs = getOwnPropertyDescriptors(properties); + getPlainObjectKeys(descs).forEach(function (key) { + makeProperty(adm, target, key, descs[key], !annotations ? true : key in annotations ? annotations[key] : true, true, !!(options == null ? void 0 : options.autoBind)); + }); + } finally { + endBatch(); + } + + return target; +} + +function getDependencyTree(thing, property) { + return nodeToDependencyTree(getAtom(thing, property)); +} + +function nodeToDependencyTree(node) { + var result = { + name: node.name_ + }; + if (node.observing_ && node.observing_.length > 0) result.dependencies = unique(node.observing_).map(nodeToDependencyTree); + return result; +} + +function getObserverTree(thing, property) { + return nodeToObserverTree(getAtom(thing, property)); +} + +function nodeToObserverTree(node) { + var result = { + name: node.name_ + }; + if (hasObservers(node)) result.observers = Array.from(getObservers(node)).map(nodeToObserverTree); + return result; +} + +function unique(list) { + return Array.from(new Set(list)); +} + +var FLOW = "flow"; +var generatorId = 0; +function FlowCancellationError() { + this.message = "FLOW_CANCELLED"; +} +FlowCancellationError.prototype = /*#__PURE__*/Object.create(Error.prototype); +function isFlowCancellationError(error) { + return error instanceof FlowCancellationError; +} +var flow = /*#__PURE__*/Object.assign(function flow(arg1, arg2) { + // @flow + if (isStringish(arg2)) { + return storeDecorator(arg1, arg2, "flow"); + } // flow(fn) + + + if (false) {} + var generator = arg1; + var name = generator.name || ""; // Implementation based on https://github.com/tj/co/blob/master/index.js + + var res = function res() { + var ctx = this; + var args = arguments; + var runId = ++generatorId; + var gen = action(name + " - runid: " + runId + " - init", generator).apply(ctx, args); + var rejector; + var pendingPromise = undefined; + var promise = new Promise(function (resolve, reject) { + var stepId = 0; + rejector = reject; + + function onFulfilled(res) { + pendingPromise = undefined; + var ret; + + try { + ret = action(name + " - runid: " + runId + " - yield " + stepId++, gen.next).call(gen, res); + } catch (e) { + return reject(e); + } + + next(ret); + } + + function onRejected(err) { + pendingPromise = undefined; + var ret; + + try { + ret = action(name + " - runid: " + runId + " - yield " + stepId++, gen["throw"]).call(gen, err); + } catch (e) { + return reject(e); + } + + next(ret); + } + + function next(ret) { + if (isFunction(ret == null ? void 0 : ret.then)) { + // an async iterator + ret.then(next, reject); + return; + } + + if (ret.done) return resolve(ret.value); + pendingPromise = Promise.resolve(ret.value); + return pendingPromise.then(onFulfilled, onRejected); + } + + onFulfilled(undefined); // kick off the process + }); + promise.cancel = action(name + " - runid: " + runId + " - cancel", function () { + try { + if (pendingPromise) cancelPromise(pendingPromise); // Finally block can return (or yield) stuff.. + + var _res = gen["return"](undefined); // eat anything that promise would do, it's cancelled! + + + var yieldedPromise = Promise.resolve(_res.value); + yieldedPromise.then(noop, noop); + cancelPromise(yieldedPromise); // maybe it can be cancelled :) + // reject our original promise + + rejector(new FlowCancellationError()); + } catch (e) { + rejector(e); // there could be a throwing finally block + } + }); + return promise; + }; + + res.isMobXFlow = true; + return res; +}, { + annotationType_: "flow" +}); + +function cancelPromise(promise) { + if (isFunction(promise.cancel)) promise.cancel(); +} + +function flowResult(result) { + return result; // just tricking TypeScript :) +} +function isFlow(fn) { + return (fn == null ? void 0 : fn.isMobXFlow) === true; +} + +function interceptReads(thing, propOrHandler, handler) { + var target; + + if (isObservableMap(thing) || isObservableArray(thing) || isObservableValue(thing)) { + target = getAdministration(thing); + } else if (isObservableObject(thing)) { + if (false) {} + target = getAdministration(thing, propOrHandler); + } else if (false) {} + + if (false) {} + target.dehancer = typeof propOrHandler === "function" ? propOrHandler : handler; + return function () { + target.dehancer = undefined; + }; +} + +function intercept(thing, propOrHandler, handler) { + if (isFunction(handler)) return interceptProperty(thing, propOrHandler, handler);else return interceptInterceptable(thing, propOrHandler); +} + +function interceptInterceptable(thing, handler) { + return getAdministration(thing).intercept_(handler); +} + +function interceptProperty(thing, property, handler) { + return getAdministration(thing, property).intercept_(handler); +} + +function _isComputed(value, property) { + if (property !== undefined) { + if (isObservableObject(value) === false) return false; + if (!value[$mobx].values_.has(property)) return false; + var atom = getAtom(value, property); + return isComputedValue(atom); + } + + return isComputedValue(value); +} +function isComputed(value) { + if (false) {} + return _isComputed(value); +} +function isComputedProp(value, propName) { + if (false) {} + return _isComputed(value, propName); +} + +function _isObservable(value, property) { + if (!value) return false; + + if (property !== undefined) { + if (false) {} + + if (isObservableObject(value)) { + return value[$mobx].values_.has(property); + } + + return false; + } // For first check, see #701 + + + return isObservableObject(value) || !!value[$mobx] || isAtom(value) || isReaction(value) || isComputedValue(value); +} + +function isObservable(value) { + if (false) {} + return _isObservable(value); +} +function isObservableProp(value, propName) { + if (false) {} + return _isObservable(value, propName); +} + +function keys(obj) { + if (isObservableObject(obj)) { + return obj[$mobx].getKeys_(); + } + + if (isObservableMap(obj) || isObservableSet(obj)) { + return Array.from(obj.keys()); + } + + if (isObservableArray(obj)) { + return obj.map(function (_, index) { + return index; + }); + } + + die(5); +} +function values(obj) { + if (isObservableObject(obj)) { + return keys(obj).map(function (key) { + return obj[key]; + }); + } + + if (isObservableMap(obj)) { + return keys(obj).map(function (key) { + return obj.get(key); + }); + } + + if (isObservableSet(obj)) { + return Array.from(obj.values()); + } + + if (isObservableArray(obj)) { + return obj.slice(); + } + + die(6); +} +function entries(obj) { + if (isObservableObject(obj)) { + return keys(obj).map(function (key) { + return [key, obj[key]]; + }); + } + + if (isObservableMap(obj)) { + return keys(obj).map(function (key) { + return [key, obj.get(key)]; + }); + } + + if (isObservableSet(obj)) { + return Array.from(obj.entries()); + } + + if (isObservableArray(obj)) { + return obj.map(function (key, index) { + return [index, key]; + }); + } + + die(7); +} +function set(obj, key, value) { + if (arguments.length === 2 && !isObservableSet(obj)) { + startBatch(); + var _values = key; + + try { + for (var _key in _values) { + set(obj, _key, _values[_key]); + } + } finally { + endBatch(); + } + + return; + } + + if (isObservableObject(obj)) { + var adm = obj[$mobx]; + var existingObservable = adm.values_.get(key); + + if (existingObservable) { + adm.write_(key, value); + } else { + adm.addObservableProp_(key, value, adm.defaultEnhancer_); + } + } else if (isObservableMap(obj)) { + obj.set(key, value); + } else if (isObservableSet(obj)) { + obj.add(key); + } else if (isObservableArray(obj)) { + if (typeof key !== "number") key = parseInt(key, 10); + if (key < 0) die("Invalid index: '" + key + "'"); + startBatch(); + if (key >= obj.length) obj.length = key + 1; + obj[key] = value; + endBatch(); + } else die(8); +} +function remove(obj, key) { + if (isObservableObject(obj)) { + obj[$mobx].remove_(key); + } else if (isObservableMap(obj)) { + obj["delete"](key); + } else if (isObservableSet(obj)) { + obj["delete"](key); + } else if (isObservableArray(obj)) { + if (typeof key !== "number") key = parseInt(key, 10); + obj.splice(key, 1); + } else { + die(9); + } +} +function has(obj, key) { + if (isObservableObject(obj)) { + // return keys(obj).indexOf(key) >= 0 + return getAdministration(obj).has_(key); + } else if (isObservableMap(obj)) { + return obj.has(key); + } else if (isObservableSet(obj)) { + return obj.has(key); + } else if (isObservableArray(obj)) { + return key >= 0 && key < obj.length; + } + + die(10); +} +function get(obj, key) { + if (!has(obj, key)) return undefined; + + if (isObservableObject(obj)) { + return obj[key]; + } else if (isObservableMap(obj)) { + return obj.get(key); + } else if (isObservableArray(obj)) { + return obj[key]; + } + + die(11); +} + +function observe(thing, propOrCb, cbOrFire, fireImmediately) { + if (isFunction(cbOrFire)) return observeObservableProperty(thing, propOrCb, cbOrFire, fireImmediately);else return observeObservable(thing, propOrCb, cbOrFire); +} + +function observeObservable(thing, listener, fireImmediately) { + return getAdministration(thing).observe_(listener, fireImmediately); +} + +function observeObservableProperty(thing, property, listener, fireImmediately) { + return getAdministration(thing, property).observe_(listener, fireImmediately); +} + +function cache(map, key, value) { + map.set(key, value); + return value; +} + +function toJSHelper(source, __alreadySeen) { + if (source == null || typeof source !== "object" || source instanceof Date || !isObservable(source)) return source; + if (isObservableValue(source)) return toJSHelper(source.get(), __alreadySeen); + + if (__alreadySeen.has(source)) { + return __alreadySeen.get(source); + } + + if (isObservableArray(source)) { + var res = cache(__alreadySeen, source, new Array(source.length)); + source.forEach(function (value, idx) { + res[idx] = toJSHelper(value, __alreadySeen); + }); + return res; + } + + if (isObservableSet(source)) { + var _res = cache(__alreadySeen, source, new Set()); + + source.forEach(function (value) { + _res.add(toJSHelper(value, __alreadySeen)); + }); + return _res; + } + + if (isObservableMap(source)) { + var _res2 = cache(__alreadySeen, source, new Map()); + + source.forEach(function (value, key) { + _res2.set(key, toJSHelper(value, __alreadySeen)); + }); + return _res2; + } else { + // must be observable object + keys(source); // make sure keys are observed + + var _res3 = cache(__alreadySeen, source, {}); + + getPlainObjectKeys(source).forEach(function (key) { + _res3[key] = toJSHelper(source[key], __alreadySeen); + }); + return _res3; + } +} +/** + * Basically, a deep clone, so that no reactive property will exist anymore. + */ + + +function toJS(source, options) { + if (false) {} + return toJSHelper(source, new Map()); +} + +function trace() { + if (true) die("trace() is not available in production builds"); + var enterBreakPoint = false; + + for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) { + args[_key] = arguments[_key]; + } + + if (typeof args[args.length - 1] === "boolean") enterBreakPoint = args.pop(); + var derivation = getAtomFromArgs(args); + + if (!derivation) { + return die("'trace(break?)' can only be used inside a tracked computed value or a Reaction. Consider passing in the computed value or reaction explicitly"); + } + + if (derivation.isTracing_ === TraceMode.NONE) { + console.log("[mobx.trace] '" + derivation.name_ + "' tracing enabled"); + } + + derivation.isTracing_ = enterBreakPoint ? TraceMode.BREAK : TraceMode.LOG; +} + +function getAtomFromArgs(args) { + switch (args.length) { + case 0: + return globalState.trackingDerivation; + + case 1: + return getAtom(args[0]); + + case 2: + return getAtom(args[0], args[1]); + } +} + +/** + * During a transaction no views are updated until the end of the transaction. + * The transaction will be run synchronously nonetheless. + * + * @param action a function that updates some reactive state + * @returns any value that was returned by the 'action' parameter. + */ + +function transaction(action, thisArg) { + if (thisArg === void 0) { + thisArg = undefined; + } + + startBatch(); + + try { + return action.apply(thisArg); + } finally { + endBatch(); + } +} + +function when(predicate, arg1, arg2) { + if (arguments.length === 1 || arg1 && typeof arg1 === "object") return whenPromise(predicate, arg1); + return _when(predicate, arg1, arg2 || {}); +} + +function _when(predicate, effect, opts) { + var timeoutHandle; + + if (typeof opts.timeout === "number") { + timeoutHandle = setTimeout(function () { + if (!disposer[$mobx].isDisposed_) { + disposer(); + var error = new Error("WHEN_TIMEOUT"); + if (opts.onError) opts.onError(error);else throw error; + } + }, opts.timeout); + } + + opts.name = opts.name || "When@" + getNextId(); + var effectAction = createAction(opts.name + "-effect", effect); // eslint-disable-next-line + + var disposer = autorun(function (r) { + // predicate should not change state + var cond = allowStateChanges(false, predicate); + + if (cond) { + r.dispose(); + if (timeoutHandle) clearTimeout(timeoutHandle); + effectAction(); + } + }, opts); + return disposer; +} + +function whenPromise(predicate, opts) { + if (false) {} + var cancel; + var res = new Promise(function (resolve, reject) { + var disposer = _when(predicate, resolve, _extends({}, opts, { + onError: reject + })); + + cancel = function cancel() { + disposer(); + reject("WHEN_CANCELLED"); + }; + }); + res.cancel = cancel; + return res; +} + +function getAdm(target) { + return target[$mobx]; +} // Optimization: we don't need the intermediate objects and could have a completely custom administration for DynamicObjects, +// and skip either the internal values map, or the base object with its property descriptors! + + +var objectProxyTraps = { + has: function has(target, name) { + if (name === $mobx || name === "constructor") return true; + if (false) {} + var adm = getAdm(target); // MWE: should `in` operator be reactive? If not, below code path will be faster / more memory efficient + // check performance stats! + // if (adm.values.get(name as string)) return true + + if (isStringish(name)) return adm.has_(name); + return name in target; + }, + get: function get(target, name) { + if (name === $mobx || name === "constructor") return target[name]; + var adm = getAdm(target); + var observable = adm.values_.get(name); + + if (observable instanceof Atom) { + var result = observable.get(); + + if (result === undefined) { + // This fixes #1796, because deleting a prop that has an + // undefined value won't retrigger a observer (no visible effect), + // the autorun wouldn't subscribe to future key changes (see also next comment) + adm.has_(name); + } + + return result; + } // make sure we start listening to future keys + // note that we only do this here for optimization + + + if (isStringish(name)) adm.has_(name); + return target[name]; + }, + set: function set$1(target, name, value) { + if (!isStringish(name)) return false; + + if (false) {} + + set(target, name, value); + + return true; + }, + deleteProperty: function deleteProperty(target, name) { + if (false) {} + if (!isStringish(name)) return false; + var adm = getAdm(target); + adm.remove_(name); + return true; + }, + ownKeys: function ownKeys(target) { + if (false) {} + var adm = getAdm(target); + adm.keysAtom_.reportObserved(); + return Reflect.ownKeys(target); + }, + preventExtensions: function preventExtensions(target) { + die(13); + } +}; +function createDynamicObservableObject(base) { + assertProxies(); + var proxy = new Proxy(base, objectProxyTraps); + base[$mobx].proxy_ = proxy; + return proxy; +} + +function hasInterceptors(interceptable) { + return interceptable.interceptors_ !== undefined && interceptable.interceptors_.length > 0; +} +function registerInterceptor(interceptable, handler) { + var interceptors = interceptable.interceptors_ || (interceptable.interceptors_ = []); + interceptors.push(handler); + return once(function () { + var idx = interceptors.indexOf(handler); + if (idx !== -1) interceptors.splice(idx, 1); + }); +} +function interceptChange(interceptable, change) { + var prevU = untrackedStart(); + + try { + // Interceptor can modify the array, copy it to avoid concurrent modification, see #1950 + var interceptors = [].concat(interceptable.interceptors_ || []); + + for (var i = 0, l = interceptors.length; i < l; i++) { + change = interceptors[i](change); + if (change && !change.type) die(14); + if (!change) break; + } + + return change; + } finally { + untrackedEnd(prevU); + } +} + +function hasListeners(listenable) { + return listenable.changeListeners_ !== undefined && listenable.changeListeners_.length > 0; +} +function registerListener(listenable, handler) { + var listeners = listenable.changeListeners_ || (listenable.changeListeners_ = []); + listeners.push(handler); + return once(function () { + var idx = listeners.indexOf(handler); + if (idx !== -1) listeners.splice(idx, 1); + }); +} +function notifyListeners(listenable, change) { + var prevU = untrackedStart(); + var listeners = listenable.changeListeners_; + if (!listeners) return; + listeners = listeners.slice(); + + for (var i = 0, l = listeners.length; i < l; i++) { + listeners[i](change); + } + + untrackedEnd(prevU); +} + +var CACHED_ANNOTATIONS = /*#__PURE__*/Symbol("mobx-cached-annotations"); + +function makeAction(target, key, name, fn, asAutoAction) { + addHiddenProp(target, key, asAutoAction ? autoAction(name || key, fn) : action(name || key, fn)); +} + +function getInferredAnnotation(desc, defaultAnnotation, autoBind) { + if (desc.get) return computed; + if (desc.set) return false; // ignore pure setters + // if already wrapped in action, don't do that another time, but assume it is already set up properly + + if (isFunction(desc.value)) return isGenerator(desc.value) ? flow : isAction(desc.value) ? false : autoBind ? autoAction.bound : autoAction; // if (!desc.configurable || !desc.writable) return false + + return defaultAnnotation != null ? defaultAnnotation : observable.deep; +} + +function getDescriptorInChain(target, prop) { + var current = target; + + while (current && current !== objectPrototype) { + // Optimization: cache meta data, especially for members from prototypes? + var desc = getDescriptor(current, prop); + + if (desc) { + return [desc, current]; + } + + current = Object.getPrototypeOf(current); + } + + die(1, prop); +} + +function makeProperty(adm, owner, key, descriptor, annotation, forceCopy, // extend observable will copy even unannotated properties +autoBind) { + var _annotation$annotatio; + + var target = adm.target_; + var defaultAnnotation = observable; // ideally grap this from adm's defaultEnahncer instead! + + var originAnnotation = annotation; + + if (annotation === true) { + annotation = getInferredAnnotation(descriptor, defaultAnnotation, autoBind); + } + + if (annotation === false) { + if (forceCopy) { + defineProperty(target, key, descriptor); + } + + return; + } + + if (!annotation || annotation === true || !annotation.annotationType_) { + return die(2, key); + } + + var type = annotation.annotationType_; + + switch (type) { + case AUTOACTION: + case ACTION: + { + var fn = descriptor.value; + if (!isFunction(fn)) die(3, key); + + if (owner !== target && !forceCopy) { + if (!isAction(owner[key])) makeAction(owner, key, annotation.arg_, fn, type === AUTOACTION); + } else { + makeAction(target, key, annotation.arg_, fn, type === AUTOACTION); + } + + break; + } + + case AUTOACTION_BOUND: + case ACTION_BOUND: + { + var _fn = descriptor.value; + if (!isFunction(_fn)) die(3, key); + makeAction(target, key, annotation.arg_, _fn.bind(adm.proxy_ || target), type === AUTOACTION_BOUND); + break; + } + + case FLOW: + { + if (owner !== target && !forceCopy) { + if (!isFlow(owner[key])) addHiddenProp(owner, key, flow(descriptor.value)); + } else { + addHiddenProp(target, key, flow(descriptor.value)); + } + + break; + } + + case COMPUTED: + case COMPUTED_STRUCT: + { + if (!descriptor.get) die(4, key); + adm.addComputedProp_(target, key, _extends({ + get: descriptor.get, + set: descriptor.set, + compareStructural: annotation.annotationType_ === COMPUTED_STRUCT + }, annotation.arg_)); + break; + } + + case OBSERVABLE: + case OBSERVABLE_REF: + case OBSERVABLE_SHALLOW: + case OBSERVABLE_STRUCT: + { + if (false) {} + if (false) {} // if the originAnnotation was true, preferred the adm's default enhancer over the inferred one + + var enhancer = originAnnotation === true ? adm.defaultEnhancer_ : getEnhancerFromAnnotation(annotation); + adm.addObservableProp_(key, descriptor.value, enhancer); + break; + } + + default: + if (false) {} + } +} +function makeObservable(target, annotations, options) { + var autoBind = !!(options == null ? void 0 : options.autoBind); + var adm = asObservableObject(target, options == null ? void 0 : options.name, getEnhancerFromAnnotation(options == null ? void 0 : options.defaultDecorator)); + startBatch(); + + try { + if (!annotations) { + var didDecorate = applyDecorators(target); + if (false) {} + return target; + } + + var make = function make(key) { + var annotation = annotations[key]; + + var _getDescriptorInChain = getDescriptorInChain(target, key), + desc = _getDescriptorInChain[0], + owner = _getDescriptorInChain[1]; + + makeProperty(adm, owner, key, desc, annotation, false, autoBind); + }; + + ownKeys(annotations).forEach(make); + } finally { + endBatch(); + } + + return target; +} +function makeAutoObservable(target, overrides, options) { + var proto = Object.getPrototypeOf(target); + var isPlain = proto == null || proto === objectPrototype; + + if (false) {} + + var annotations; + + if (!isPlain && hasProp(proto, CACHED_ANNOTATIONS)) { + // shortcut, reuse inferred annotations for this type from the previous time + annotations = proto[CACHED_ANNOTATIONS]; + } else { + annotations = _extends({}, overrides); + extractAnnotationsFromObject(target, annotations, options); + + if (!isPlain) { + extractAnnotationsFromProto(proto, annotations, options); + addHiddenProp(proto, CACHED_ANNOTATIONS, annotations); + } + } + + makeObservable(target, annotations, options); + return target; +} + +function extractAnnotationsFromObject(target, collector, options) { + var _options$defaultDecor; + + var autoBind = !!(options == null ? void 0 : options.autoBind); + var defaultAnnotation = (options == null ? void 0 : options.deep) === undefined ? (_options$defaultDecor = options == null ? void 0 : options.defaultDecorator) != null ? _options$defaultDecor : observable.deep : (options == null ? void 0 : options.deep) ? observable.deep : observable.ref; + Object.entries(getOwnPropertyDescriptors(target)).forEach(function (_ref) { + var key = _ref[0], + descriptor = _ref[1]; + if (key in collector || key === "constructor") return; + collector[key] = getInferredAnnotation(descriptor, defaultAnnotation, autoBind); + }); +} + +function extractAnnotationsFromProto(proto, collector, options) { + Object.entries(getOwnPropertyDescriptors(proto)).forEach(function (_ref2) { + var key = _ref2[0], + prop = _ref2[1]; + if (key in collector || key === "constructor") return; + + if (prop.get) { + collector[key] = computed; + } else if (isFunction(prop.value)) { + collector[key] = isGenerator(prop.value) ? flow : (options == null ? void 0 : options.autoBind) ? autoAction.bound : autoAction; + } + }); +} + +var SPLICE = "splice"; +var UPDATE = "update"; +var MAX_SPLICE_SIZE = 10000; // See e.g. https://github.com/mobxjs/mobx/issues/859 + +var arrayTraps = { + get: function get(target, name) { + var adm = target[$mobx]; + if (name === $mobx) return adm; + if (name === "length") return adm.getArrayLength_(); + + if (typeof name === "string" && !isNaN(name)) { + return adm.get_(parseInt(name)); + } + + if (hasProp(arrayExtensions, name)) { + return arrayExtensions[name]; + } + + return target[name]; + }, + set: function set(target, name, value) { + var adm = target[$mobx]; + + if (name === "length") { + adm.setArrayLength_(value); + } + + if (typeof name === "symbol" || isNaN(name)) { + target[name] = value; + } else { + // numeric string + adm.set_(parseInt(name), value); + } + + return true; + }, + preventExtensions: function preventExtensions() { + die(15); + } +}; +var ObservableArrayAdministration = /*#__PURE__*/function () { + // this is the prop that gets proxied, so can't replace it! + function ObservableArrayAdministration(name, enhancer, owned_, legacyMode_) { + this.owned_ = void 0; + this.legacyMode_ = void 0; + this.atom_ = void 0; + this.values_ = []; + this.interceptors_ = void 0; + this.changeListeners_ = void 0; + this.enhancer_ = void 0; + this.dehancer = void 0; + this.proxy_ = void 0; + this.lastKnownLength_ = 0; + this.owned_ = owned_; + this.legacyMode_ = legacyMode_; + this.atom_ = new Atom(name || "ObservableArray@" + getNextId()); + + this.enhancer_ = function (newV, oldV) { + return enhancer(newV, oldV, name + "[..]"); + }; + } + + var _proto = ObservableArrayAdministration.prototype; + + _proto.dehanceValue_ = function dehanceValue_(value) { + if (this.dehancer !== undefined) return this.dehancer(value); + return value; + }; + + _proto.dehanceValues_ = function dehanceValues_(values) { + if (this.dehancer !== undefined && values.length > 0) return values.map(this.dehancer); + return values; + }; + + _proto.intercept_ = function intercept_(handler) { + return registerInterceptor(this, handler); + }; + + _proto.observe_ = function observe_(listener, fireImmediately) { + if (fireImmediately === void 0) { + fireImmediately = false; + } + + if (fireImmediately) { + listener({ + observableKind: "array", + object: this.proxy_, + debugObjectName: this.atom_.name_, + type: "splice", + index: 0, + added: this.values_.slice(), + addedCount: this.values_.length, + removed: [], + removedCount: 0 + }); + } + + return registerListener(this, listener); + }; + + _proto.getArrayLength_ = function getArrayLength_() { + this.atom_.reportObserved(); + return this.values_.length; + }; + + _proto.setArrayLength_ = function setArrayLength_(newLength) { + if (typeof newLength !== "number" || newLength < 0) die("Out of range: " + newLength); + var currentLength = this.values_.length; + if (newLength === currentLength) return;else if (newLength > currentLength) { + var newItems = new Array(newLength - currentLength); + + for (var i = 0; i < newLength - currentLength; i++) { + newItems[i] = undefined; + } // No Array.fill everywhere... + + + this.spliceWithArray_(currentLength, 0, newItems); + } else this.spliceWithArray_(newLength, currentLength - newLength); + }; + + _proto.updateArrayLength_ = function updateArrayLength_(oldLength, delta) { + if (oldLength !== this.lastKnownLength_) die(16); + this.lastKnownLength_ += delta; + if (this.legacyMode_ && delta > 0) reserveArrayBuffer(oldLength + delta + 1); + }; + + _proto.spliceWithArray_ = function spliceWithArray_(index, deleteCount, newItems) { + var _this = this; + + checkIfStateModificationsAreAllowed(this.atom_); + var length = this.values_.length; + if (index === undefined) index = 0;else if (index > length) index = length;else if (index < 0) index = Math.max(0, length + index); + if (arguments.length === 1) deleteCount = length - index;else if (deleteCount === undefined || deleteCount === null) deleteCount = 0;else deleteCount = Math.max(0, Math.min(deleteCount, length - index)); + if (newItems === undefined) newItems = EMPTY_ARRAY; + + if (hasInterceptors(this)) { + var change = interceptChange(this, { + object: this.proxy_, + type: SPLICE, + index: index, + removedCount: deleteCount, + added: newItems + }); + if (!change) return EMPTY_ARRAY; + deleteCount = change.removedCount; + newItems = change.added; + } + + newItems = newItems.length === 0 ? newItems : newItems.map(function (v) { + return _this.enhancer_(v, undefined); + }); + + if (this.legacyMode_ || "production" !== "production") { + var lengthDelta = newItems.length - deleteCount; + this.updateArrayLength_(length, lengthDelta); // checks if internal array wasn't modified + } + + var res = this.spliceItemsIntoValues_(index, deleteCount, newItems); + if (deleteCount !== 0 || newItems.length !== 0) this.notifyArraySplice_(index, newItems, res); + return this.dehanceValues_(res); + }; + + _proto.spliceItemsIntoValues_ = function spliceItemsIntoValues_(index, deleteCount, newItems) { + if (newItems.length < MAX_SPLICE_SIZE) { + var _this$values_; + + return (_this$values_ = this.values_).splice.apply(_this$values_, [index, deleteCount].concat(newItems)); + } else { + var res = this.values_.slice(index, index + deleteCount); + var oldItems = this.values_.slice(index + deleteCount); + this.values_.length = index + newItems.length - deleteCount; + + for (var i = 0; i < newItems.length; i++) { + this.values_[index + i] = newItems[i]; + } + + for (var _i = 0; _i < oldItems.length; _i++) { + this.values_[index + newItems.length + _i] = oldItems[_i]; + } + + return res; + } + }; + + _proto.notifyArrayChildUpdate_ = function notifyArrayChildUpdate_(index, newValue, oldValue) { + var notifySpy = !this.owned_ && isSpyEnabled(); + var notify = hasListeners(this); + var change = notify || notifySpy ? { + observableKind: "array", + object: this.proxy_, + type: UPDATE, + debugObjectName: this.atom_.name_, + index: index, + newValue: newValue, + oldValue: oldValue + } : null; // The reason why this is on right hand side here (and not above), is this way the uglifier will drop it, but it won't + // cause any runtime overhead in development mode without NODE_ENV set, unless spying is enabled + + if (false) {} + this.atom_.reportChanged(); + if (notify) notifyListeners(this, change); + if (false) {} + }; + + _proto.notifyArraySplice_ = function notifyArraySplice_(index, added, removed) { + var notifySpy = !this.owned_ && isSpyEnabled(); + var notify = hasListeners(this); + var change = notify || notifySpy ? { + observableKind: "array", + object: this.proxy_, + debugObjectName: this.atom_.name_, + type: SPLICE, + index: index, + removed: removed, + added: added, + removedCount: removed.length, + addedCount: added.length + } : null; + if (false) {} + this.atom_.reportChanged(); // conform: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/observe + + if (notify) notifyListeners(this, change); + if (false) {} + }; + + _proto.get_ = function get_(index) { + if (index < this.values_.length) { + this.atom_.reportObserved(); + return this.dehanceValue_(this.values_[index]); + } + + console.warn( false ? 0 : "[mobx.array] Attempt to read an array index (" + index + ") that is out of bounds (" + this.values_.length + "). Please check length first. Out of bound indices will not be tracked by MobX"); + }; + + _proto.set_ = function set_(index, newValue) { + var values = this.values_; + + if (index < values.length) { + // update at index in range + checkIfStateModificationsAreAllowed(this.atom_); + var oldValue = values[index]; + + if (hasInterceptors(this)) { + var change = interceptChange(this, { + type: UPDATE, + object: this.proxy_, + index: index, + newValue: newValue + }); + if (!change) return; + newValue = change.newValue; + } + + newValue = this.enhancer_(newValue, oldValue); + var changed = newValue !== oldValue; + + if (changed) { + values[index] = newValue; + this.notifyArrayChildUpdate_(index, newValue, oldValue); + } + } else if (index === values.length) { + // add a new item + this.spliceWithArray_(index, 0, [newValue]); + } else { + // out of bounds + die(17, index, values.length); + } + }; + + return ObservableArrayAdministration; +}(); +function createObservableArray(initialValues, enhancer, name, owned) { + if (name === void 0) { + name = "ObservableArray@" + getNextId(); + } + + if (owned === void 0) { + owned = false; + } + + assertProxies(); + var adm = new ObservableArrayAdministration(name, enhancer, owned, false); + addHiddenFinalProp(adm.values_, $mobx, adm); + var proxy = new Proxy(adm.values_, arrayTraps); + adm.proxy_ = proxy; + + if (initialValues && initialValues.length) { + var prev = allowStateChangesStart(true); + adm.spliceWithArray_(0, 0, initialValues); + allowStateChangesEnd(prev); + } + + return proxy; +} // eslint-disable-next-line + +var arrayExtensions = { + clear: function clear() { + return this.splice(0); + }, + replace: function replace(newItems) { + var adm = this[$mobx]; + return adm.spliceWithArray_(0, adm.values_.length, newItems); + }, + // Used by JSON.stringify + toJSON: function toJSON() { + return this.slice(); + }, + + /* + * functions that do alter the internal structure of the array, (based on lib.es6.d.ts) + * since these functions alter the inner structure of the array, the have side effects. + * Because the have side effects, they should not be used in computed function, + * and for that reason the do not call dependencyState.notifyObserved + */ + splice: function splice(index, deleteCount) { + for (var _len = arguments.length, newItems = new Array(_len > 2 ? _len - 2 : 0), _key = 2; _key < _len; _key++) { + newItems[_key - 2] = arguments[_key]; + } + + var adm = this[$mobx]; + + switch (arguments.length) { + case 0: + return []; + + case 1: + return adm.spliceWithArray_(index); + + case 2: + return adm.spliceWithArray_(index, deleteCount); + } + + return adm.spliceWithArray_(index, deleteCount, newItems); + }, + spliceWithArray: function spliceWithArray(index, deleteCount, newItems) { + return this[$mobx].spliceWithArray_(index, deleteCount, newItems); + }, + push: function push() { + var adm = this[$mobx]; + + for (var _len2 = arguments.length, items = new Array(_len2), _key2 = 0; _key2 < _len2; _key2++) { + items[_key2] = arguments[_key2]; + } + + adm.spliceWithArray_(adm.values_.length, 0, items); + return adm.values_.length; + }, + pop: function pop() { + return this.splice(Math.max(this[$mobx].values_.length - 1, 0), 1)[0]; + }, + shift: function shift() { + return this.splice(0, 1)[0]; + }, + unshift: function unshift() { + var adm = this[$mobx]; + + for (var _len3 = arguments.length, items = new Array(_len3), _key3 = 0; _key3 < _len3; _key3++) { + items[_key3] = arguments[_key3]; + } + + adm.spliceWithArray_(0, 0, items); + return adm.values_.length; + }, + reverse: function reverse() { + // reverse by default mutates in place before returning the result + // which makes it both a 'derivation' and a 'mutation'. + if (globalState.trackingDerivation) { + die(37, "reverse"); + } + + this.replace(this.slice().reverse()); + return this; + }, + sort: function sort() { + // sort by default mutates in place before returning the result + // which goes against all good practices. Let's not change the array in place! + if (globalState.trackingDerivation) { + die(37, "sort"); + } + + var copy = this.slice(); + copy.sort.apply(copy, arguments); + this.replace(copy); + return this; + }, + remove: function remove(value) { + var adm = this[$mobx]; + var idx = adm.dehanceValues_(adm.values_).indexOf(value); + + if (idx > -1) { + this.splice(idx, 1); + return true; + } + + return false; + } +}; +/** + * Wrap function from prototype + * Without this, everything works as well, but this works + * faster as everything works on unproxied values + */ + +addArrayExtension("concat", simpleFunc); +addArrayExtension("flat", simpleFunc); +addArrayExtension("includes", simpleFunc); +addArrayExtension("indexOf", simpleFunc); +addArrayExtension("join", simpleFunc); +addArrayExtension("lastIndexOf", simpleFunc); +addArrayExtension("slice", simpleFunc); +addArrayExtension("toString", simpleFunc); +addArrayExtension("toLocaleString", simpleFunc); // map + +addArrayExtension("every", mapLikeFunc); +addArrayExtension("filter", mapLikeFunc); +addArrayExtension("find", mapLikeFunc); +addArrayExtension("findIndex", mapLikeFunc); +addArrayExtension("flatMap", mapLikeFunc); +addArrayExtension("forEach", mapLikeFunc); +addArrayExtension("map", mapLikeFunc); +addArrayExtension("some", mapLikeFunc); // reduce + +addArrayExtension("reduce", reduceLikeFunc); +addArrayExtension("reduceRight", reduceLikeFunc); + +function addArrayExtension(funcName, funcFactory) { + if (typeof Array.prototype[funcName] === "function") { + arrayExtensions[funcName] = funcFactory(funcName); + } +} // Report and delegate to dehanced array + + +function simpleFunc(funcName) { + return function () { + var adm = this[$mobx]; + adm.atom_.reportObserved(); + var dehancedValues = adm.dehanceValues_(adm.values_); + return dehancedValues[funcName].apply(dehancedValues, arguments); + }; +} // Make sure callbacks recieve correct array arg #2326 + + +function mapLikeFunc(funcName) { + return function (callback, thisArg) { + var _this2 = this; + + var adm = this[$mobx]; + adm.atom_.reportObserved(); + var dehancedValues = adm.dehanceValues_(adm.values_); + return dehancedValues[funcName](function (element, index) { + return callback.call(thisArg, element, index, _this2); + }); + }; +} // Make sure callbacks recieve correct array arg #2326 + + +function reduceLikeFunc(funcName) { + return function () { + var _this3 = this; + + var adm = this[$mobx]; + adm.atom_.reportObserved(); + var dehancedValues = adm.dehanceValues_(adm.values_); // #2432 - reduce behavior depends on arguments.length + + var callback = arguments[0]; + + arguments[0] = function (accumulator, currentValue, index) { + return callback(accumulator, currentValue, index, _this3); + }; + + return dehancedValues[funcName].apply(dehancedValues, arguments); + }; +} + +var isObservableArrayAdministration = /*#__PURE__*/createInstanceofPredicate("ObservableArrayAdministration", ObservableArrayAdministration); +function isObservableArray(thing) { + return isObject(thing) && isObservableArrayAdministration(thing[$mobx]); +} + +var _Symbol$iterator, _Symbol$toStringTag; +var ObservableMapMarker = {}; +var ADD = "add"; +var DELETE = "delete"; // just extend Map? See also https://gist.github.com/nestharus/13b4d74f2ef4a2f4357dbd3fc23c1e54 +// But: https://github.com/mobxjs/mobx/issues/1556 + +_Symbol$iterator = Symbol.iterator; +_Symbol$toStringTag = Symbol.toStringTag; +var ObservableMap = /*#__PURE__*/function () { + // hasMap, not hashMap >-). + function ObservableMap(initialData, enhancer_, name_) { + if (enhancer_ === void 0) { + enhancer_ = deepEnhancer; + } + + if (name_ === void 0) { + name_ = "ObservableMap@" + getNextId(); + } + + this.enhancer_ = void 0; + this.name_ = void 0; + this[$mobx] = ObservableMapMarker; + this.data_ = void 0; + this.hasMap_ = void 0; + this.keysAtom_ = void 0; + this.interceptors_ = void 0; + this.changeListeners_ = void 0; + this.dehancer = void 0; + this.enhancer_ = enhancer_; + this.name_ = name_; + + if (!isFunction(Map)) { + die(18); + } + + this.keysAtom_ = createAtom(this.name_ + ".keys()"); + this.data_ = new Map(); + this.hasMap_ = new Map(); + this.merge(initialData); + } + + var _proto = ObservableMap.prototype; + + _proto.has_ = function has_(key) { + return this.data_.has(key); + }; + + _proto.has = function has(key) { + var _this = this; + + if (!globalState.trackingDerivation) return this.has_(key); + var entry = this.hasMap_.get(key); + + if (!entry) { + var newEntry = entry = new ObservableValue(this.has_(key), referenceEnhancer, this.name_ + "." + stringifyKey(key) + "?", false); + this.hasMap_.set(key, newEntry); + onBecomeUnobserved(newEntry, function () { + return _this.hasMap_["delete"](key); + }); + } + + return entry.get(); + }; + + _proto.set = function set(key, value) { + var hasKey = this.has_(key); + + if (hasInterceptors(this)) { + var change = interceptChange(this, { + type: hasKey ? UPDATE : ADD, + object: this, + newValue: value, + name: key + }); + if (!change) return this; + value = change.newValue; + } + + if (hasKey) { + this.updateValue_(key, value); + } else { + this.addValue_(key, value); + } + + return this; + }; + + _proto["delete"] = function _delete(key) { + var _this2 = this; + + checkIfStateModificationsAreAllowed(this.keysAtom_); + + if (hasInterceptors(this)) { + var change = interceptChange(this, { + type: DELETE, + object: this, + name: key + }); + if (!change) return false; + } + + if (this.has_(key)) { + var notifySpy = isSpyEnabled(); + var notify = hasListeners(this); + + var _change = notify || notifySpy ? { + observableKind: "map", + debugObjectName: this.name_, + type: DELETE, + object: this, + oldValue: this.data_.get(key).value_, + name: key + } : null; + + if (false) {} + transaction(function () { + _this2.keysAtom_.reportChanged(); + + _this2.updateHasMapEntry_(key, false); + + var observable = _this2.data_.get(key); + + observable.setNewValue_(undefined); + + _this2.data_["delete"](key); + }); + if (notify) notifyListeners(this, _change); + if (false) {} + return true; + } + + return false; + }; + + _proto.updateHasMapEntry_ = function updateHasMapEntry_(key, value) { + var entry = this.hasMap_.get(key); + + if (entry) { + entry.setNewValue_(value); + } + }; + + _proto.updateValue_ = function updateValue_(key, newValue) { + var observable = this.data_.get(key); + newValue = observable.prepareNewValue_(newValue); + + if (newValue !== globalState.UNCHANGED) { + var notifySpy = isSpyEnabled(); + var notify = hasListeners(this); + var change = notify || notifySpy ? { + observableKind: "map", + debugObjectName: this.name_, + type: UPDATE, + object: this, + oldValue: observable.value_, + name: key, + newValue: newValue + } : null; + if (false) {} + observable.setNewValue_(newValue); + if (notify) notifyListeners(this, change); + if (false) {} + } + }; + + _proto.addValue_ = function addValue_(key, newValue) { + var _this3 = this; + + checkIfStateModificationsAreAllowed(this.keysAtom_); + transaction(function () { + var observable = new ObservableValue(newValue, _this3.enhancer_, _this3.name_ + "." + stringifyKey(key), false); + + _this3.data_.set(key, observable); + + newValue = observable.value_; // value might have been changed + + _this3.updateHasMapEntry_(key, true); + + _this3.keysAtom_.reportChanged(); + }); + var notifySpy = isSpyEnabled(); + var notify = hasListeners(this); + var change = notify || notifySpy ? { + observableKind: "map", + debugObjectName: this.name_, + type: ADD, + object: this, + name: key, + newValue: newValue + } : null; + if (false) {} + if (notify) notifyListeners(this, change); + if (false) {} + }; + + _proto.get = function get(key) { + if (this.has(key)) return this.dehanceValue_(this.data_.get(key).get()); + return this.dehanceValue_(undefined); + }; + + _proto.dehanceValue_ = function dehanceValue_(value) { + if (this.dehancer !== undefined) { + return this.dehancer(value); + } + + return value; + }; + + _proto.keys = function keys() { + this.keysAtom_.reportObserved(); + return this.data_.keys(); + }; + + _proto.values = function values() { + var self = this; + var keys = this.keys(); + return makeIterable({ + next: function next() { + var _keys$next = keys.next(), + done = _keys$next.done, + value = _keys$next.value; + + return { + done: done, + value: done ? undefined : self.get(value) + }; + } + }); + }; + + _proto.entries = function entries() { + var self = this; + var keys = this.keys(); + return makeIterable({ + next: function next() { + var _keys$next2 = keys.next(), + done = _keys$next2.done, + value = _keys$next2.value; + + return { + done: done, + value: done ? undefined : [value, self.get(value)] + }; + } + }); + }; + + _proto[_Symbol$iterator] = function () { + return this.entries(); + }; + + _proto.forEach = function forEach(callback, thisArg) { + for (var _iterator = _createForOfIteratorHelperLoose(this), _step; !(_step = _iterator()).done;) { + var _step$value = _step.value, + key = _step$value[0], + value = _step$value[1]; + callback.call(thisArg, value, key, this); + } + } + /** Merge another object into this object, returns this. */ + ; + + _proto.merge = function merge(other) { + var _this4 = this; + + if (isObservableMap(other)) { + other = new Map(other); + } + + transaction(function () { + if (isPlainObject(other)) getPlainObjectKeys(other).forEach(function (key) { + return _this4.set(key, other[key]); + });else if (Array.isArray(other)) other.forEach(function (_ref) { + var key = _ref[0], + value = _ref[1]; + return _this4.set(key, value); + });else if (isES6Map(other)) { + if (other.constructor !== Map) die(19, other); + other.forEach(function (value, key) { + return _this4.set(key, value); + }); + } else if (other !== null && other !== undefined) die(20, other); + }); + return this; + }; + + _proto.clear = function clear() { + var _this5 = this; + + transaction(function () { + untracked(function () { + for (var _iterator2 = _createForOfIteratorHelperLoose(_this5.keys()), _step2; !(_step2 = _iterator2()).done;) { + var key = _step2.value; + + _this5["delete"](key); + } + }); + }); + }; + + _proto.replace = function replace(values) { + var _this6 = this; + + // Implementation requirements: + // - respect ordering of replacement map + // - allow interceptors to run and potentially prevent individual operations + // - don't recreate observables that already exist in original map (so we don't destroy existing subscriptions) + // - don't _keysAtom.reportChanged if the keys of resulting map are indentical (order matters!) + // - note that result map may differ from replacement map due to the interceptors + transaction(function () { + // Convert to map so we can do quick key lookups + var replacementMap = convertToMap(values); + var orderedData = new Map(); // Used for optimization + + var keysReportChangedCalled = false; // Delete keys that don't exist in replacement map + // if the key deletion is prevented by interceptor + // add entry at the beginning of the result map + + for (var _iterator3 = _createForOfIteratorHelperLoose(_this6.data_.keys()), _step3; !(_step3 = _iterator3()).done;) { + var key = _step3.value; + + // Concurrently iterating/deleting keys + // iterator should handle this correctly + if (!replacementMap.has(key)) { + var deleted = _this6["delete"](key); // Was the key removed? + + + if (deleted) { + // _keysAtom.reportChanged() was already called + keysReportChangedCalled = true; + } else { + // Delete prevented by interceptor + var value = _this6.data_.get(key); + + orderedData.set(key, value); + } + } + } // Merge entries + + + for (var _iterator4 = _createForOfIteratorHelperLoose(replacementMap.entries()), _step4; !(_step4 = _iterator4()).done;) { + var _step4$value = _step4.value, + _key = _step4$value[0], + _value = _step4$value[1]; + + // We will want to know whether a new key is added + var keyExisted = _this6.data_.has(_key); // Add or update value + + + _this6.set(_key, _value); // The addition could have been prevent by interceptor + + + if (_this6.data_.has(_key)) { + // The update could have been prevented by interceptor + // and also we want to preserve existing values + // so use value from _data map (instead of replacement map) + var _value2 = _this6.data_.get(_key); + + orderedData.set(_key, _value2); // Was a new key added? + + if (!keyExisted) { + // _keysAtom.reportChanged() was already called + keysReportChangedCalled = true; + } + } + } // Check for possible key order change + + + if (!keysReportChangedCalled) { + if (_this6.data_.size !== orderedData.size) { + // If size differs, keys are definitely modified + _this6.keysAtom_.reportChanged(); + } else { + var iter1 = _this6.data_.keys(); + + var iter2 = orderedData.keys(); + var next1 = iter1.next(); + var next2 = iter2.next(); + + while (!next1.done) { + if (next1.value !== next2.value) { + _this6.keysAtom_.reportChanged(); + + break; + } + + next1 = iter1.next(); + next2 = iter2.next(); + } + } + } // Use correctly ordered map + + + _this6.data_ = orderedData; + }); + return this; + }; + + _proto.toString = function toString() { + return "[object ObservableMap]"; + }; + + _proto.toJSON = function toJSON() { + return Array.from(this); + }; + + /** + * Observes this object. Triggers for the events 'add', 'update' and 'delete'. + * See: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/observe + * for callback details + */ + _proto.observe_ = function observe_(listener, fireImmediately) { + if (false) {} + return registerListener(this, listener); + }; + + _proto.intercept_ = function intercept_(handler) { + return registerInterceptor(this, handler); + }; + + _createClass(ObservableMap, [{ + key: "size", + get: function get() { + this.keysAtom_.reportObserved(); + return this.data_.size; + } + }, { + key: _Symbol$toStringTag, + get: function get() { + return "Map"; + } + }]); + + return ObservableMap; +}(); // eslint-disable-next-line + +var isObservableMap = /*#__PURE__*/createInstanceofPredicate("ObservableMap", ObservableMap); + +function convertToMap(dataStructure) { + if (isES6Map(dataStructure) || isObservableMap(dataStructure)) { + return dataStructure; + } else if (Array.isArray(dataStructure)) { + return new Map(dataStructure); + } else if (isPlainObject(dataStructure)) { + var map = new Map(); + + for (var key in dataStructure) { + map.set(key, dataStructure[key]); + } + + return map; + } else { + return die(21, dataStructure); + } +} + +var _Symbol$iterator$1, _Symbol$toStringTag$1; +var ObservableSetMarker = {}; +_Symbol$iterator$1 = Symbol.iterator; +_Symbol$toStringTag$1 = Symbol.toStringTag; +var ObservableSet = /*#__PURE__*/function () { + function ObservableSet(initialData, enhancer, name_) { + if (enhancer === void 0) { + enhancer = deepEnhancer; + } + + if (name_ === void 0) { + name_ = "ObservableSet@" + getNextId(); + } + + this.name_ = void 0; + this[$mobx] = ObservableSetMarker; + this.data_ = new Set(); + this.atom_ = void 0; + this.changeListeners_ = void 0; + this.interceptors_ = void 0; + this.dehancer = void 0; + this.enhancer_ = void 0; + this.name_ = name_; + + if (!isFunction(Set)) { + die(22); + } + + this.atom_ = createAtom(this.name_); + + this.enhancer_ = function (newV, oldV) { + return enhancer(newV, oldV, name_); + }; + + if (initialData) { + this.replace(initialData); + } + } + + var _proto = ObservableSet.prototype; + + _proto.dehanceValue_ = function dehanceValue_(value) { + if (this.dehancer !== undefined) { + return this.dehancer(value); + } + + return value; + }; + + _proto.clear = function clear() { + var _this = this; + + transaction(function () { + untracked(function () { + for (var _iterator = _createForOfIteratorHelperLoose(_this.data_.values()), _step; !(_step = _iterator()).done;) { + var value = _step.value; + + _this["delete"](value); + } + }); + }); + }; + + _proto.forEach = function forEach(callbackFn, thisArg) { + for (var _iterator2 = _createForOfIteratorHelperLoose(this), _step2; !(_step2 = _iterator2()).done;) { + var value = _step2.value; + callbackFn.call(thisArg, value, value, this); + } + }; + + _proto.add = function add(value) { + var _this2 = this; + + checkIfStateModificationsAreAllowed(this.atom_); + + if (hasInterceptors(this)) { + var change = interceptChange(this, { + type: ADD, + object: this, + newValue: value + }); + if (!change) return this; // ideally, value = change.value would be done here, so that values can be + // changed by interceptor. Same applies for other Set and Map api's. + } + + if (!this.has(value)) { + transaction(function () { + _this2.data_.add(_this2.enhancer_(value, undefined)); + + _this2.atom_.reportChanged(); + }); + var notifySpy = false && 0; + var notify = hasListeners(this); + + var _change = notify || notifySpy ? { + observableKind: "set", + debugObjectName: this.name_, + type: ADD, + object: this, + newValue: value + } : null; + + if (notifySpy && "production" !== "production") spyReportStart(_change); + if (notify) notifyListeners(this, _change); + if (notifySpy && "production" !== "production") spyReportEnd(); + } + + return this; + }; + + _proto["delete"] = function _delete(value) { + var _this3 = this; + + if (hasInterceptors(this)) { + var change = interceptChange(this, { + type: DELETE, + object: this, + oldValue: value + }); + if (!change) return false; + } + + if (this.has(value)) { + var notifySpy = false && 0; + var notify = hasListeners(this); + + var _change2 = notify || notifySpy ? { + observableKind: "set", + debugObjectName: this.name_, + type: DELETE, + object: this, + oldValue: value + } : null; + + if (notifySpy && "production" !== "production") spyReportStart(_change2); + transaction(function () { + _this3.atom_.reportChanged(); + + _this3.data_["delete"](value); + }); + if (notify) notifyListeners(this, _change2); + if (notifySpy && "production" !== "production") spyReportEnd(); + return true; + } + + return false; + }; + + _proto.has = function has(value) { + this.atom_.reportObserved(); + return this.data_.has(this.dehanceValue_(value)); + }; + + _proto.entries = function entries() { + var nextIndex = 0; + var keys = Array.from(this.keys()); + var values = Array.from(this.values()); + return makeIterable({ + next: function next() { + var index = nextIndex; + nextIndex += 1; + return index < values.length ? { + value: [keys[index], values[index]], + done: false + } : { + done: true + }; + } + }); + }; + + _proto.keys = function keys() { + return this.values(); + }; + + _proto.values = function values() { + this.atom_.reportObserved(); + var self = this; + var nextIndex = 0; + var observableValues = Array.from(this.data_.values()); + return makeIterable({ + next: function next() { + return nextIndex < observableValues.length ? { + value: self.dehanceValue_(observableValues[nextIndex++]), + done: false + } : { + done: true + }; + } + }); + }; + + _proto.replace = function replace(other) { + var _this4 = this; + + if (isObservableSet(other)) { + other = new Set(other); + } + + transaction(function () { + if (Array.isArray(other)) { + _this4.clear(); + + other.forEach(function (value) { + return _this4.add(value); + }); + } else if (isES6Set(other)) { + _this4.clear(); + + other.forEach(function (value) { + return _this4.add(value); + }); + } else if (other !== null && other !== undefined) { + die("Cannot initialize set from " + other); + } + }); + return this; + }; + + _proto.observe_ = function observe_(listener, fireImmediately) { + // ... 'fireImmediately' could also be true? + if (false) {} + return registerListener(this, listener); + }; + + _proto.intercept_ = function intercept_(handler) { + return registerInterceptor(this, handler); + }; + + _proto.toJSON = function toJSON() { + return Array.from(this); + }; + + _proto.toString = function toString() { + return "[object ObservableSet]"; + }; + + _proto[_Symbol$iterator$1] = function () { + return this.values(); + }; + + _createClass(ObservableSet, [{ + key: "size", + get: function get() { + this.atom_.reportObserved(); + return this.data_.size; + } + }, { + key: _Symbol$toStringTag$1, + get: function get() { + return "Set"; + } + }]); + + return ObservableSet; +}(); // eslint-disable-next-line + +var isObservableSet = /*#__PURE__*/createInstanceofPredicate("ObservableSet", ObservableSet); + +var REMOVE = "remove"; +var ObservableObjectAdministration = /*#__PURE__*/function () { + function ObservableObjectAdministration(target_, values_, name_, defaultEnhancer_) { + if (values_ === void 0) { + values_ = new Map(); + } + + this.target_ = void 0; + this.values_ = void 0; + this.name_ = void 0; + this.defaultEnhancer_ = void 0; + this.keysAtom_ = void 0; + this.changeListeners_ = void 0; + this.interceptors_ = void 0; + this.proxy_ = void 0; + this.pendingKeys_ = void 0; + this.keysValue_ = []; + this.isStaledKeysValue_ = true; + this.target_ = target_; + this.values_ = values_; + this.name_ = name_; + this.defaultEnhancer_ = defaultEnhancer_; + this.keysAtom_ = new Atom(name_ + ".keys"); + } + + var _proto = ObservableObjectAdministration.prototype; + + _proto.read_ = function read_(key) { + return this.values_.get(key).get(); + }; + + _proto.write_ = function write_(key, newValue) { + var instance = this.target_; + var observable = this.values_.get(key); + + if (observable instanceof ComputedValue) { + observable.set(newValue); + return; + } // intercept + + + if (hasInterceptors(this)) { + var change = interceptChange(this, { + type: UPDATE, + object: this.proxy_ || instance, + name: key, + newValue: newValue + }); + if (!change) return; + newValue = change.newValue; + } + + newValue = observable.prepareNewValue_(newValue); // notify spy & observers + + if (newValue !== globalState.UNCHANGED) { + var notify = hasListeners(this); + var notifySpy = false && 0; + + var _change = notify || notifySpy ? { + type: UPDATE, + observableKind: "object", + debugObjectName: this.name_, + object: this.proxy_ || instance, + oldValue: observable.value_, + name: key, + newValue: newValue + } : null; + + if (false) {} + observable.setNewValue_(newValue); + if (notify) notifyListeners(this, _change); + if (false) {} + } + }; + + _proto.has_ = function has_(key) { + var map = this.pendingKeys_ || (this.pendingKeys_ = new Map()); + var entry = map.get(key); + if (entry) return entry.get();else { + var exists = !!this.values_.get(key); // Possible optimization: Don't have a separate map for non existing keys, + // but store them in the values map instead, using a special symbol to denote "not existing" + + entry = new ObservableValue(exists, referenceEnhancer, this.name_ + "." + stringifyKey(key) + "?", false); + map.set(key, entry); + return entry.get(); // read to subscribe + } + }; + + _proto.addObservableProp_ = function addObservableProp_(propName, newValue, enhancer) { + if (enhancer === void 0) { + enhancer = this.defaultEnhancer_; + } + + var target = this.target_; + if (false) {} + + if (hasInterceptors(this)) { + var change = interceptChange(this, { + object: this.proxy_ || target, + name: propName, + type: ADD, + newValue: newValue + }); + if (!change) return; + newValue = change.newValue; + } + + var observable = new ObservableValue(newValue, enhancer, this.name_ + "." + stringifyKey(propName), false); + this.values_.set(propName, observable); + newValue = observable.value_; // observableValue might have changed it + + defineProperty(target, propName, generateObservablePropConfig(propName)); + this.notifyPropertyAddition_(propName, newValue); + }; + + _proto.addComputedProp_ = function addComputedProp_(propertyOwner, // where is the property declared? + propName, options) { + var target = this.target_; + options.name = options.name || this.name_ + "." + stringifyKey(propName); + options.context = this.proxy_ || target; + this.values_.set(propName, new ComputedValue(options)); // Doesn't seem we need this condition: + // if (propertyOwner === target || isPropertyConfigurable(propertyOwner, propName)) + + defineProperty(propertyOwner, propName, generateComputedPropConfig(propName)); + }; + + _proto.remove_ = function remove_(key) { + if (!this.values_.has(key)) return; + var target = this.target_; + + if (hasInterceptors(this)) { + var change = interceptChange(this, { + object: this.proxy_ || target, + name: key, + type: REMOVE + }); + if (!change) return; + } + + try { + startBatch(); + var notify = hasListeners(this); + var notifySpy = false && 0; + var oldObservable = this.values_.get(key); + var oldValue = oldObservable && oldObservable.get(); + oldObservable && oldObservable.set(undefined); // notify key and keyset listeners + + this.reportKeysChanged(); + this.values_["delete"](key); + + if (this.pendingKeys_) { + var entry = this.pendingKeys_.get(key); + if (entry) entry.set(false); + } // delete the prop + + + delete this.target_[key]; + + var _change2 = notify || notifySpy ? { + type: REMOVE, + observableKind: "object", + object: this.proxy_ || target, + debugObjectName: this.name_, + oldValue: oldValue, + name: key + } : null; + + if (false) {} + if (notify) notifyListeners(this, _change2); + if (false) {} + } finally { + endBatch(); + } + } + /** + * Observes this object. Triggers for the events 'add', 'update' and 'delete'. + * See: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/observe + * for callback details + */ + ; + + _proto.observe_ = function observe_(callback, fireImmediately) { + if (false) {} + return registerListener(this, callback); + }; + + _proto.intercept_ = function intercept_(handler) { + return registerInterceptor(this, handler); + }; + + _proto.notifyPropertyAddition_ = function notifyPropertyAddition_(key, newValue) { + var notify = hasListeners(this); + var notifySpy = false && 0; + var change = notify || notifySpy ? { + type: ADD, + observableKind: "object", + debugObjectName: this.name_, + object: this.proxy_ || this.target_, + name: key, + newValue: newValue + } : null; + if (false) {} + if (notify) notifyListeners(this, change); + if (false) {} + + if (this.pendingKeys_) { + var entry = this.pendingKeys_.get(key); + if (entry) entry.set(true); + } + + this.reportKeysChanged(); + }; + + _proto.getKeys_ = function getKeys_() { + this.keysAtom_.reportObserved(); + + if (!this.isStaledKeysValue_) { + return this.keysValue_; + } // return Reflect.ownKeys(this.values) as any + + + this.keysValue_ = []; + + for (var _iterator = _createForOfIteratorHelperLoose(this.values_), _step; !(_step = _iterator()).done;) { + var _step$value = _step.value, + key = _step$value[0], + value = _step$value[1]; + if (value instanceof ObservableValue) this.keysValue_.push(key); + } + + if (false) {} + this.isStaledKeysValue_ = false; + return this.keysValue_; + }; + + _proto.reportKeysChanged = function reportKeysChanged() { + this.isStaledKeysValue_ = true; + this.keysAtom_.reportChanged(); + }; + + return ObservableObjectAdministration; +}(); +function asObservableObject(target, name, defaultEnhancer) { + if (name === void 0) { + name = ""; + } + + if (defaultEnhancer === void 0) { + defaultEnhancer = deepEnhancer; + } + + if (hasProp(target, $mobx)) return target[$mobx]; + if (false) {} + if (!isPlainObject(target)) name = (target.constructor.name || "ObservableObject") + "@" + getNextId(); + if (!name) name = "ObservableObject@" + getNextId(); + var adm = new ObservableObjectAdministration(target, new Map(), stringifyKey(name), defaultEnhancer); + addHiddenProp(target, $mobx, adm); + return adm; +} +var observablePropertyConfigs = /*#__PURE__*/Object.create(null); +var computedPropertyConfigs = /*#__PURE__*/Object.create(null); +function generateObservablePropConfig(propName) { + return observablePropertyConfigs[propName] || (observablePropertyConfigs[propName] = { + configurable: true, + enumerable: true, + get: function get() { + return this[$mobx].read_(propName); + }, + set: function set(v) { + this[$mobx].write_(propName, v); + } + }); +} +function generateComputedPropConfig(propName) { + return computedPropertyConfigs[propName] || (computedPropertyConfigs[propName] = { + configurable: true, + enumerable: false, + get: function get() { + return this[$mobx].read_(propName); + }, + set: function set(v) { + this[$mobx].write_(propName, v); + } + }); +} +var isObservableObjectAdministration = /*#__PURE__*/createInstanceofPredicate("ObservableObjectAdministration", ObservableObjectAdministration); +function isObservableObject(thing) { + if (isObject(thing)) { + return isObservableObjectAdministration(thing[$mobx]); + } + + return false; +} + +/** + * This array buffer contains two lists of properties, so that all arrays + * can recycle their property definitions, which significantly improves performance of creating + * properties on the fly. + */ + +var OBSERVABLE_ARRAY_BUFFER_SIZE = 0; // Typescript workaround to make sure ObservableArray extends Array + +var StubArray = function StubArray() {}; + +function inherit(ctor, proto) { + if (Object.setPrototypeOf) { + Object.setPrototypeOf(ctor.prototype, proto); + } else if (ctor.prototype.__proto__ !== undefined) { + ctor.prototype.__proto__ = proto; + } else { + ctor.prototype = proto; + } +} + +inherit(StubArray, Array.prototype); // Weex proto freeze protection was here, +// but it is unclear why the hack is need as MobX never changed the prototype +// anyway, so removed it in V6 + +var LegacyObservableArray = /*#__PURE__*/function (_StubArray) { + _inheritsLoose(LegacyObservableArray, _StubArray); + + function LegacyObservableArray(initialValues, enhancer, name, owned) { + var _this; + + if (name === void 0) { + name = "ObservableArray@" + getNextId(); + } + + if (owned === void 0) { + owned = false; + } + + _this = _StubArray.call(this) || this; + var adm = new ObservableArrayAdministration(name, enhancer, owned, true); + adm.proxy_ = _assertThisInitialized(_this); + addHiddenFinalProp(_assertThisInitialized(_this), $mobx, adm); + + if (initialValues && initialValues.length) { + var prev = allowStateChangesStart(true); // @ts-ignore + + _this.spliceWithArray(0, 0, initialValues); + + allowStateChangesEnd(prev); + } + + return _this; + } + + var _proto = LegacyObservableArray.prototype; + + _proto.concat = function concat() { + this[$mobx].atom_.reportObserved(); + + for (var _len = arguments.length, arrays = new Array(_len), _key = 0; _key < _len; _key++) { + arrays[_key] = arguments[_key]; + } + + return Array.prototype.concat.apply(this.slice(), //@ts-ignore + arrays.map(function (a) { + return isObservableArray(a) ? a.slice() : a; + })); + }; + + _proto[Symbol.iterator] = function () { + var self = this; + var nextIndex = 0; + return makeIterable({ + next: function next() { + // @ts-ignore + return nextIndex < self.length ? { + value: self[nextIndex++], + done: false + } : { + done: true, + value: undefined + }; + } + }); + }; + + _createClass(LegacyObservableArray, [{ + key: "length", + get: function get() { + return this[$mobx].getArrayLength_(); + }, + set: function set(newLength) { + this[$mobx].setArrayLength_(newLength); + } + }, { + key: Symbol.toStringTag, + get: function get() { + return "Array"; + } + }]); + + return LegacyObservableArray; +}(StubArray); + +Object.entries(arrayExtensions).forEach(function (_ref) { + var prop = _ref[0], + fn = _ref[1]; + if (prop !== "concat") addHiddenProp(LegacyObservableArray.prototype, prop, fn); +}); + +function createArrayEntryDescriptor(index) { + return { + enumerable: false, + configurable: true, + get: function get() { + return this[$mobx].get_(index); + }, + set: function set(value) { + this[$mobx].set_(index, value); + } + }; +} + +function createArrayBufferItem(index) { + defineProperty(LegacyObservableArray.prototype, "" + index, createArrayEntryDescriptor(index)); +} + +function reserveArrayBuffer(max) { + if (max > OBSERVABLE_ARRAY_BUFFER_SIZE) { + for (var index = OBSERVABLE_ARRAY_BUFFER_SIZE; index < max + 100; index++) { + createArrayBufferItem(index); + } + + OBSERVABLE_ARRAY_BUFFER_SIZE = max; + } +} +reserveArrayBuffer(1000); +function createLegacyArray(initialValues, enhancer, name) { + return new LegacyObservableArray(initialValues, enhancer, name); +} + +function getAtom(thing, property) { + if (typeof thing === "object" && thing !== null) { + if (isObservableArray(thing)) { + if (property !== undefined) die(23); + return thing[$mobx].atom_; + } + + if (isObservableSet(thing)) { + return thing[$mobx]; + } + + if (isObservableMap(thing)) { + if (property === undefined) return thing.keysAtom_; + var observable = thing.data_.get(property) || thing.hasMap_.get(property); + if (!observable) die(25, property, getDebugName(thing)); + return observable; + } + + if (isObservableObject(thing)) { + if (!property) return die(26); + + var _observable = thing[$mobx].values_.get(property); + + if (!_observable) die(27, property, getDebugName(thing)); + return _observable; + } + + if (isAtom(thing) || isComputedValue(thing) || isReaction(thing)) { + return thing; + } + } else if (isFunction(thing)) { + if (isReaction(thing[$mobx])) { + // disposer function + return thing[$mobx]; + } + } + + die(28); +} +function getAdministration(thing, property) { + if (!thing) die(29); + if (property !== undefined) return getAdministration(getAtom(thing, property)); + if (isAtom(thing) || isComputedValue(thing) || isReaction(thing)) return thing; + if (isObservableMap(thing) || isObservableSet(thing)) return thing; + if (thing[$mobx]) return thing[$mobx]; + die(24, thing); +} +function getDebugName(thing, property) { + var named; + if (property !== undefined) named = getAtom(thing, property);else if (isObservableObject(thing) || isObservableMap(thing) || isObservableSet(thing)) named = getAdministration(thing);else named = getAtom(thing); // valid for arrays as well + + return named.name_; +} + +var toString = objectPrototype.toString; +function deepEqual(a, b, depth) { + if (depth === void 0) { + depth = -1; + } + + return eq(a, b, depth); +} // Copied from https://github.com/jashkenas/underscore/blob/5c237a7c682fb68fd5378203f0bf22dce1624854/underscore.js#L1186-L1289 +// Internal recursive comparison function for `isEqual`. + +function eq(a, b, depth, aStack, bStack) { + // Identical objects are equal. `0 === -0`, but they aren't identical. + // See the [Harmony `egal` proposal](http://wiki.ecmascript.org/doku.php?id=harmony:egal). + if (a === b) return a !== 0 || 1 / a === 1 / b; // `null` or `undefined` only equal to itself (strict comparison). + + if (a == null || b == null) return false; // `NaN`s are equivalent, but non-reflexive. + + if (a !== a) return b !== b; // Exhaust primitive checks + + var type = typeof a; + if (!isFunction(type) && type !== "object" && typeof b != "object") return false; // Compare `[[Class]]` names. + + var className = toString.call(a); + if (className !== toString.call(b)) return false; + + switch (className) { + // Strings, numbers, regular expressions, dates, and booleans are compared by value. + case "[object RegExp]": // RegExps are coerced to strings for comparison (Note: '' + /a/i === '/a/i') + + case "[object String]": + // Primitives and their corresponding object wrappers are equivalent; thus, `"5"` is + // equivalent to `new String("5")`. + return "" + a === "" + b; + + case "[object Number]": + // `NaN`s are equivalent, but non-reflexive. + // Object(NaN) is equivalent to NaN. + if (+a !== +a) return +b !== +b; // An `egal` comparison is performed for other numeric values. + + return +a === 0 ? 1 / +a === 1 / b : +a === +b; + + case "[object Date]": + case "[object Boolean]": + // Coerce dates and booleans to numeric primitive values. Dates are compared by their + // millisecond representations. Note that invalid dates with millisecond representations + // of `NaN` are not equivalent. + return +a === +b; + + case "[object Symbol]": + return typeof Symbol !== "undefined" && Symbol.valueOf.call(a) === Symbol.valueOf.call(b); + + case "[object Map]": + case "[object Set]": + // Maps and Sets are unwrapped to arrays of entry-pairs, adding an incidental level. + // Hide this extra level by increasing the depth. + if (depth >= 0) { + depth++; + } + + break; + } // Unwrap any wrapped objects. + + + a = unwrap(a); + b = unwrap(b); + var areArrays = className === "[object Array]"; + + if (!areArrays) { + if (typeof a != "object" || typeof b != "object") return false; // Objects with different constructors are not equivalent, but `Object`s or `Array`s + // from different frames are. + + var aCtor = a.constructor, + bCtor = b.constructor; + + if (aCtor !== bCtor && !(isFunction(aCtor) && aCtor instanceof aCtor && isFunction(bCtor) && bCtor instanceof bCtor) && "constructor" in a && "constructor" in b) { + return false; + } + } + + if (depth === 0) { + return false; + } else if (depth < 0) { + depth = -1; + } // Assume equality for cyclic structures. The algorithm for detecting cyclic + // structures is adapted from ES 5.1 section 15.12.3, abstract operation `JO`. + // Initializing stack of traversed objects. + // It's done here since we only need them for objects and arrays comparison. + + + aStack = aStack || []; + bStack = bStack || []; + var length = aStack.length; + + while (length--) { + // Linear search. Performance is inversely proportional to the number of + // unique nested structures. + if (aStack[length] === a) return bStack[length] === b; + } // Add the first object to the stack of traversed objects. + + + aStack.push(a); + bStack.push(b); // Recursively compare objects and arrays. + + if (areArrays) { + // Compare array lengths to determine if a deep comparison is necessary. + length = a.length; + if (length !== b.length) return false; // Deep compare the contents, ignoring non-numeric properties. + + while (length--) { + if (!eq(a[length], b[length], depth - 1, aStack, bStack)) return false; + } + } else { + // Deep compare objects. + var keys = Object.keys(a); + var key; + length = keys.length; // Ensure that both objects contain the same number of properties before comparing deep equality. + + if (Object.keys(b).length !== length) return false; + + while (length--) { + // Deep compare each member + key = keys[length]; + if (!(hasProp(b, key) && eq(a[key], b[key], depth - 1, aStack, bStack))) return false; + } + } // Remove the first object from the stack of traversed objects. + + + aStack.pop(); + bStack.pop(); + return true; +} + +function unwrap(a) { + if (isObservableArray(a)) return a.slice(); + if (isES6Map(a) || isObservableMap(a)) return Array.from(a.entries()); + if (isES6Set(a) || isObservableSet(a)) return Array.from(a.entries()); + return a; +} + +function makeIterable(iterator) { + iterator[Symbol.iterator] = getSelf; + return iterator; +} + +function getSelf() { + return this; +} + +/** + * (c) Michel Weststrate 2015 - 2020 + * MIT Licensed + * + * Welcome to the mobx sources! To get an global overview of how MobX internally works, + * this is a good place to start: + * https://medium.com/@mweststrate/becoming-fully-reactive-an-in-depth-explanation-of-mobservable-55995262a254#.xvbh6qd74 + * + * Source folders: + * =============== + * + * - api/ Most of the public static methods exposed by the module can be found here. + * - core/ Implementation of the MobX algorithm; atoms, derivations, reactions, dependency trees, optimizations. Cool stuff can be found here. + * - types/ All the magic that is need to have observable objects, arrays and values is in this folder. Including the modifiers like `asFlat`. + * - utils/ Utility stuff. + * + */ +["Symbol", "Map", "Set", "Symbol"].forEach(function (m) { + var g = getGlobal(); + + if (typeof g[m] === "undefined") { + die("MobX requires global '" + m + "' to be available or polyfilled"); + } +}); + +if (typeof __MOBX_DEVTOOLS_GLOBAL_HOOK__ === "object") { + // See: https://github.com/andykog/mobx-devtools/ + __MOBX_DEVTOOLS_GLOBAL_HOOK__.injectMobx({ + spy: spy, + extras: { + getDebugName: getDebugName + }, + $mobx: $mobx + }); +} + + + + +/***/ }), + +/***/ 350: +/*!**********************************************************!*\ + !*** ./node_modules/nanoid/index.browser.js + 1 modules ***! + \**********************************************************/ +/***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => { + +"use strict"; +// ESM COMPAT FLAG +__webpack_require__.r(__webpack_exports__); + +// EXPORTS +__webpack_require__.d(__webpack_exports__, { + "customAlphabet": () => (/* binding */ customAlphabet), + "customRandom": () => (/* binding */ customRandom), + "nanoid": () => (/* binding */ nanoid), + "random": () => (/* binding */ random), + "urlAlphabet": () => (/* reexport */ urlAlphabet) +}); + +;// CONCATENATED MODULE: ./node_modules/nanoid/url-alphabet/index.js +// This alphabet uses `A-Za-z0-9_-` symbols. The genetic algorithm helped +// optimize the gzip compression for this alphabet. +let urlAlphabet = + 'ModuleSymbhasOwnPr-0123456789ABCDEFGHNRVfgctiUvz_KqYTJkLxpZXIjQW' + + + +;// CONCATENATED MODULE: ./node_modules/nanoid/index.browser.js +// This file replaces `index.js` in bundlers like webpack or Rollup, +// according to `browser` config in `package.json`. + + + +if (false) {} + +let random = bytes => crypto.getRandomValues(new Uint8Array(bytes)) + +let customRandom = (alphabet, size, getRandom) => { + // First, a bitmask is necessary to generate the ID. The bitmask makes bytes + // values closer to the alphabet size. The bitmask calculates the closest + // `2^31 - 1` number, which exceeds the alphabet size. + // For example, the bitmask for the alphabet size 30 is 31 (00011111). + // `Math.clz32` is not used, because it is not available in browsers. + let mask = (2 << (Math.log(alphabet.length - 1) / Math.LN2)) - 1 + // Though, the bitmask solution is not perfect since the bytes exceeding + // the alphabet size are refused. Therefore, to reliably generate the ID, + // the random bytes redundancy has to be satisfied. + + // Note: every hardware random generator call is performance expensive, + // because the system call for entropy collection takes a lot of time. + // So, to avoid additional system calls, extra bytes are requested in advance. + + // Next, a step determines how many random bytes to generate. + // The number of random bytes gets decided upon the ID size, mask, + // alphabet size, and magic number 1.6 (using 1.6 peaks at performance + // according to benchmarks). + + // `-~f => Math.ceil(f)` if f is a float + // `-~i => i + 1` if i is an integer + let step = -~((1.6 * mask * size) / alphabet.length) + + return () => { + let id = '' + while (true) { + let bytes = getRandom(step) + // A compact alternative for `for (var i = 0; i < step; i++)`. + let j = step + while (j--) { + // Adding `|| ''` refuses a random byte that exceeds the alphabet size. + id += alphabet[bytes[j] & mask] || '' + // `id.length + 1 === size` is a more compact option. + if (id.length === +size) return id + } + } + } +} + +let customAlphabet = (alphabet, size) => customRandom(alphabet, size, random) + +let nanoid = (size = 21) => { + let id = '' + let bytes = crypto.getRandomValues(new Uint8Array(size)) + + // A compact alternative for `for (var i = 0; i < step; i++)`. + while (size--) { + // It is incorrect to use bytes exceeding the alphabet size. + // The following mask reduces the random byte in the 0-255 value + // range to the 0-63 value range. Therefore, adding hacks, such + // as empty string fallback or magic numbers, is unneccessary because + // the bitmask trims bytes down to the alphabet size. + let byte = bytes[size] & 63 + if (byte < 36) { + // `0-9a-z` + id += byte.toString(36) + } else if (byte < 62) { + // `A-Z` + id += (byte - 26).toString(36).toUpperCase() + } else if (byte < 63) { + id += '_' + } else { + id += '-' + } + } + return id +} + + + + +/***/ }), + +/***/ 3624: +/*!************************************************************!*\ + !*** ./node_modules/webextension-polyfill-ts/lib/index.js ***! + \************************************************************/ +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + +"use strict"; + +Object.defineProperty(exports, "__esModule", ({ value: true })); + +// if not in a browser, assume we're in a test, return a dummy +if (typeof window === "undefined") exports.browser = {}; +else exports.browser = __webpack_require__(/*! webextension-polyfill */ 4390); + + +/***/ }), + +/***/ 4390: +/*!*********************************************************************!*\ + !*** ./node_modules/webextension-polyfill/dist/browser-polyfill.js ***! + \*********************************************************************/ +/***/ (function(module, exports) { + +var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;(function (global, factory) { + if (true) { + !(__WEBPACK_AMD_DEFINE_ARRAY__ = [module], __WEBPACK_AMD_DEFINE_FACTORY__ = (factory), + __WEBPACK_AMD_DEFINE_RESULT__ = (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === 'function' ? + (__WEBPACK_AMD_DEFINE_FACTORY__.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__)) : __WEBPACK_AMD_DEFINE_FACTORY__), + __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__)); + } else { var mod; } +})(typeof globalThis !== "undefined" ? globalThis : typeof self !== "undefined" ? self : this, function (module) { + /* webextension-polyfill - v0.6.0 - Mon Dec 23 2019 12:32:53 */ + + /* -*- Mode: indent-tabs-mode: nil; js-indent-level: 2 -*- */ + + /* vim: set sts=2 sw=2 et tw=80: */ + + /* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + "use strict"; + + if (typeof browser === "undefined" || Object.getPrototypeOf(browser) !== Object.prototype) { + const CHROME_SEND_MESSAGE_CALLBACK_NO_RESPONSE_MESSAGE = "The message port closed before a response was received."; + const SEND_RESPONSE_DEPRECATION_WARNING = "Returning a Promise is the preferred way to send a reply from an onMessage/onMessageExternal listener, as the sendResponse will be removed from the specs (See https://developer.mozilla.org/docs/Mozilla/Add-ons/WebExtensions/API/runtime/onMessage)"; // Wrapping the bulk of this polyfill in a one-time-use function is a minor + // optimization for Firefox. Since Spidermonkey does not fully parse the + // contents of a function until the first time it's called, and since it will + // never actually need to be called, this allows the polyfill to be included + // in Firefox nearly for free. + + const wrapAPIs = extensionAPIs => { + // NOTE: apiMetadata is associated to the content of the api-metadata.json file + // at build time by replacing the following "include" with the content of the + // JSON file. + const apiMetadata = { + "alarms": { + "clear": { + "minArgs": 0, + "maxArgs": 1 + }, + "clearAll": { + "minArgs": 0, + "maxArgs": 0 + }, + "get": { + "minArgs": 0, + "maxArgs": 1 + }, + "getAll": { + "minArgs": 0, + "maxArgs": 0 + } + }, + "bookmarks": { + "create": { + "minArgs": 1, + "maxArgs": 1 + }, + "get": { + "minArgs": 1, + "maxArgs": 1 + }, + "getChildren": { + "minArgs": 1, + "maxArgs": 1 + }, + "getRecent": { + "minArgs": 1, + "maxArgs": 1 + }, + "getSubTree": { + "minArgs": 1, + "maxArgs": 1 + }, + "getTree": { + "minArgs": 0, + "maxArgs": 0 + }, + "move": { + "minArgs": 2, + "maxArgs": 2 + }, + "remove": { + "minArgs": 1, + "maxArgs": 1 + }, + "removeTree": { + "minArgs": 1, + "maxArgs": 1 + }, + "search": { + "minArgs": 1, + "maxArgs": 1 + }, + "update": { + "minArgs": 2, + "maxArgs": 2 + } + }, + "browserAction": { + "disable": { + "minArgs": 0, + "maxArgs": 1, + "fallbackToNoCallback": true + }, + "enable": { + "minArgs": 0, + "maxArgs": 1, + "fallbackToNoCallback": true + }, + "getBadgeBackgroundColor": { + "minArgs": 1, + "maxArgs": 1 + }, + "getBadgeText": { + "minArgs": 1, + "maxArgs": 1 + }, + "getPopup": { + "minArgs": 1, + "maxArgs": 1 + }, + "getTitle": { + "minArgs": 1, + "maxArgs": 1 + }, + "openPopup": { + "minArgs": 0, + "maxArgs": 0 + }, + "setBadgeBackgroundColor": { + "minArgs": 1, + "maxArgs": 1, + "fallbackToNoCallback": true + }, + "setBadgeText": { + "minArgs": 1, + "maxArgs": 1, + "fallbackToNoCallback": true + }, + "setIcon": { + "minArgs": 1, + "maxArgs": 1 + }, + "setPopup": { + "minArgs": 1, + "maxArgs": 1, + "fallbackToNoCallback": true + }, + "setTitle": { + "minArgs": 1, + "maxArgs": 1, + "fallbackToNoCallback": true + } + }, + "browsingData": { + "remove": { + "minArgs": 2, + "maxArgs": 2 + }, + "removeCache": { + "minArgs": 1, + "maxArgs": 1 + }, + "removeCookies": { + "minArgs": 1, + "maxArgs": 1 + }, + "removeDownloads": { + "minArgs": 1, + "maxArgs": 1 + }, + "removeFormData": { + "minArgs": 1, + "maxArgs": 1 + }, + "removeHistory": { + "minArgs": 1, + "maxArgs": 1 + }, + "removeLocalStorage": { + "minArgs": 1, + "maxArgs": 1 + }, + "removePasswords": { + "minArgs": 1, + "maxArgs": 1 + }, + "removePluginData": { + "minArgs": 1, + "maxArgs": 1 + }, + "settings": { + "minArgs": 0, + "maxArgs": 0 + } + }, + "commands": { + "getAll": { + "minArgs": 0, + "maxArgs": 0 + } + }, + "contextMenus": { + "remove": { + "minArgs": 1, + "maxArgs": 1 + }, + "removeAll": { + "minArgs": 0, + "maxArgs": 0 + }, + "update": { + "minArgs": 2, + "maxArgs": 2 + } + }, + "cookies": { + "get": { + "minArgs": 1, + "maxArgs": 1 + }, + "getAll": { + "minArgs": 1, + "maxArgs": 1 + }, + "getAllCookieStores": { + "minArgs": 0, + "maxArgs": 0 + }, + "remove": { + "minArgs": 1, + "maxArgs": 1 + }, + "set": { + "minArgs": 1, + "maxArgs": 1 + } + }, + "devtools": { + "inspectedWindow": { + "eval": { + "minArgs": 1, + "maxArgs": 2, + "singleCallbackArg": false + } + }, + "panels": { + "create": { + "minArgs": 3, + "maxArgs": 3, + "singleCallbackArg": true + } + } + }, + "downloads": { + "cancel": { + "minArgs": 1, + "maxArgs": 1 + }, + "download": { + "minArgs": 1, + "maxArgs": 1 + }, + "erase": { + "minArgs": 1, + "maxArgs": 1 + }, + "getFileIcon": { + "minArgs": 1, + "maxArgs": 2 + }, + "open": { + "minArgs": 1, + "maxArgs": 1, + "fallbackToNoCallback": true + }, + "pause": { + "minArgs": 1, + "maxArgs": 1 + }, + "removeFile": { + "minArgs": 1, + "maxArgs": 1 + }, + "resume": { + "minArgs": 1, + "maxArgs": 1 + }, + "search": { + "minArgs": 1, + "maxArgs": 1 + }, + "show": { + "minArgs": 1, + "maxArgs": 1, + "fallbackToNoCallback": true + } + }, + "extension": { + "isAllowedFileSchemeAccess": { + "minArgs": 0, + "maxArgs": 0 + }, + "isAllowedIncognitoAccess": { + "minArgs": 0, + "maxArgs": 0 + } + }, + "history": { + "addUrl": { + "minArgs": 1, + "maxArgs": 1 + }, + "deleteAll": { + "minArgs": 0, + "maxArgs": 0 + }, + "deleteRange": { + "minArgs": 1, + "maxArgs": 1 + }, + "deleteUrl": { + "minArgs": 1, + "maxArgs": 1 + }, + "getVisits": { + "minArgs": 1, + "maxArgs": 1 + }, + "search": { + "minArgs": 1, + "maxArgs": 1 + } + }, + "i18n": { + "detectLanguage": { + "minArgs": 1, + "maxArgs": 1 + }, + "getAcceptLanguages": { + "minArgs": 0, + "maxArgs": 0 + } + }, + "identity": { + "launchWebAuthFlow": { + "minArgs": 1, + "maxArgs": 1 + } + }, + "idle": { + "queryState": { + "minArgs": 1, + "maxArgs": 1 + } + }, + "management": { + "get": { + "minArgs": 1, + "maxArgs": 1 + }, + "getAll": { + "minArgs": 0, + "maxArgs": 0 + }, + "getSelf": { + "minArgs": 0, + "maxArgs": 0 + }, + "setEnabled": { + "minArgs": 2, + "maxArgs": 2 + }, + "uninstallSelf": { + "minArgs": 0, + "maxArgs": 1 + } + }, + "notifications": { + "clear": { + "minArgs": 1, + "maxArgs": 1 + }, + "create": { + "minArgs": 1, + "maxArgs": 2 + }, + "getAll": { + "minArgs": 0, + "maxArgs": 0 + }, + "getPermissionLevel": { + "minArgs": 0, + "maxArgs": 0 + }, + "update": { + "minArgs": 2, + "maxArgs": 2 + } + }, + "pageAction": { + "getPopup": { + "minArgs": 1, + "maxArgs": 1 + }, + "getTitle": { + "minArgs": 1, + "maxArgs": 1 + }, + "hide": { + "minArgs": 1, + "maxArgs": 1, + "fallbackToNoCallback": true + }, + "setIcon": { + "minArgs": 1, + "maxArgs": 1 + }, + "setPopup": { + "minArgs": 1, + "maxArgs": 1, + "fallbackToNoCallback": true + }, + "setTitle": { + "minArgs": 1, + "maxArgs": 1, + "fallbackToNoCallback": true + }, + "show": { + "minArgs": 1, + "maxArgs": 1, + "fallbackToNoCallback": true + } + }, + "permissions": { + "contains": { + "minArgs": 1, + "maxArgs": 1 + }, + "getAll": { + "minArgs": 0, + "maxArgs": 0 + }, + "remove": { + "minArgs": 1, + "maxArgs": 1 + }, + "request": { + "minArgs": 1, + "maxArgs": 1 + } + }, + "runtime": { + "getBackgroundPage": { + "minArgs": 0, + "maxArgs": 0 + }, + "getPlatformInfo": { + "minArgs": 0, + "maxArgs": 0 + }, + "openOptionsPage": { + "minArgs": 0, + "maxArgs": 0 + }, + "requestUpdateCheck": { + "minArgs": 0, + "maxArgs": 0 + }, + "sendMessage": { + "minArgs": 1, + "maxArgs": 3 + }, + "sendNativeMessage": { + "minArgs": 2, + "maxArgs": 2 + }, + "setUninstallURL": { + "minArgs": 1, + "maxArgs": 1 + } + }, + "sessions": { + "getDevices": { + "minArgs": 0, + "maxArgs": 1 + }, + "getRecentlyClosed": { + "minArgs": 0, + "maxArgs": 1 + }, + "restore": { + "minArgs": 0, + "maxArgs": 1 + } + }, + "storage": { + "local": { + "clear": { + "minArgs": 0, + "maxArgs": 0 + }, + "get": { + "minArgs": 0, + "maxArgs": 1 + }, + "getBytesInUse": { + "minArgs": 0, + "maxArgs": 1 + }, + "remove": { + "minArgs": 1, + "maxArgs": 1 + }, + "set": { + "minArgs": 1, + "maxArgs": 1 + } + }, + "managed": { + "get": { + "minArgs": 0, + "maxArgs": 1 + }, + "getBytesInUse": { + "minArgs": 0, + "maxArgs": 1 + } + }, + "sync": { + "clear": { + "minArgs": 0, + "maxArgs": 0 + }, + "get": { + "minArgs": 0, + "maxArgs": 1 + }, + "getBytesInUse": { + "minArgs": 0, + "maxArgs": 1 + }, + "remove": { + "minArgs": 1, + "maxArgs": 1 + }, + "set": { + "minArgs": 1, + "maxArgs": 1 + } + } + }, + "tabs": { + "captureVisibleTab": { + "minArgs": 0, + "maxArgs": 2 + }, + "create": { + "minArgs": 1, + "maxArgs": 1 + }, + "detectLanguage": { + "minArgs": 0, + "maxArgs": 1 + }, + "discard": { + "minArgs": 0, + "maxArgs": 1 + }, + "duplicate": { + "minArgs": 1, + "maxArgs": 1 + }, + "executeScript": { + "minArgs": 1, + "maxArgs": 2 + }, + "get": { + "minArgs": 1, + "maxArgs": 1 + }, + "getCurrent": { + "minArgs": 0, + "maxArgs": 0 + }, + "getZoom": { + "minArgs": 0, + "maxArgs": 1 + }, + "getZoomSettings": { + "minArgs": 0, + "maxArgs": 1 + }, + "highlight": { + "minArgs": 1, + "maxArgs": 1 + }, + "insertCSS": { + "minArgs": 1, + "maxArgs": 2 + }, + "move": { + "minArgs": 2, + "maxArgs": 2 + }, + "query": { + "minArgs": 1, + "maxArgs": 1 + }, + "reload": { + "minArgs": 0, + "maxArgs": 2 + }, + "remove": { + "minArgs": 1, + "maxArgs": 1 + }, + "removeCSS": { + "minArgs": 1, + "maxArgs": 2 + }, + "sendMessage": { + "minArgs": 2, + "maxArgs": 3 + }, + "setZoom": { + "minArgs": 1, + "maxArgs": 2 + }, + "setZoomSettings": { + "minArgs": 1, + "maxArgs": 2 + }, + "update": { + "minArgs": 1, + "maxArgs": 2 + } + }, + "topSites": { + "get": { + "minArgs": 0, + "maxArgs": 0 + } + }, + "webNavigation": { + "getAllFrames": { + "minArgs": 1, + "maxArgs": 1 + }, + "getFrame": { + "minArgs": 1, + "maxArgs": 1 + } + }, + "webRequest": { + "handlerBehaviorChanged": { + "minArgs": 0, + "maxArgs": 0 + } + }, + "windows": { + "create": { + "minArgs": 0, + "maxArgs": 1 + }, + "get": { + "minArgs": 1, + "maxArgs": 2 + }, + "getAll": { + "minArgs": 0, + "maxArgs": 1 + }, + "getCurrent": { + "minArgs": 0, + "maxArgs": 1 + }, + "getLastFocused": { + "minArgs": 0, + "maxArgs": 1 + }, + "remove": { + "minArgs": 1, + "maxArgs": 1 + }, + "update": { + "minArgs": 2, + "maxArgs": 2 + } + } + }; + + if (Object.keys(apiMetadata).length === 0) { + throw new Error("api-metadata.json has not been included in browser-polyfill"); + } + /** + * A WeakMap subclass which creates and stores a value for any key which does + * not exist when accessed, but behaves exactly as an ordinary WeakMap + * otherwise. + * + * @param {function} createItem + * A function which will be called in order to create the value for any + * key which does not exist, the first time it is accessed. The + * function receives, as its only argument, the key being created. + */ + + + class DefaultWeakMap extends WeakMap { + constructor(createItem, items = undefined) { + super(items); + this.createItem = createItem; + } + + get(key) { + if (!this.has(key)) { + this.set(key, this.createItem(key)); + } + + return super.get(key); + } + + } + /** + * Returns true if the given object is an object with a `then` method, and can + * therefore be assumed to behave as a Promise. + * + * @param {*} value The value to test. + * @returns {boolean} True if the value is thenable. + */ + + + const isThenable = value => { + return value && typeof value === "object" && typeof value.then === "function"; + }; + /** + * Creates and returns a function which, when called, will resolve or reject + * the given promise based on how it is called: + * + * - If, when called, `chrome.runtime.lastError` contains a non-null object, + * the promise is rejected with that value. + * - If the function is called with exactly one argument, the promise is + * resolved to that value. + * - Otherwise, the promise is resolved to an array containing all of the + * function's arguments. + * + * @param {object} promise + * An object containing the resolution and rejection functions of a + * promise. + * @param {function} promise.resolve + * The promise's resolution function. + * @param {function} promise.rejection + * The promise's rejection function. + * @param {object} metadata + * Metadata about the wrapped method which has created the callback. + * @param {integer} metadata.maxResolvedArgs + * The maximum number of arguments which may be passed to the + * callback created by the wrapped async function. + * + * @returns {function} + * The generated callback function. + */ + + + const makeCallback = (promise, metadata) => { + return (...callbackArgs) => { + if (extensionAPIs.runtime.lastError) { + promise.reject(extensionAPIs.runtime.lastError); + } else if (metadata.singleCallbackArg || callbackArgs.length <= 1 && metadata.singleCallbackArg !== false) { + promise.resolve(callbackArgs[0]); + } else { + promise.resolve(callbackArgs); + } + }; + }; + + const pluralizeArguments = numArgs => numArgs == 1 ? "argument" : "arguments"; + /** + * Creates a wrapper function for a method with the given name and metadata. + * + * @param {string} name + * The name of the method which is being wrapped. + * @param {object} metadata + * Metadata about the method being wrapped. + * @param {integer} metadata.minArgs + * The minimum number of arguments which must be passed to the + * function. If called with fewer than this number of arguments, the + * wrapper will raise an exception. + * @param {integer} metadata.maxArgs + * The maximum number of arguments which may be passed to the + * function. If called with more than this number of arguments, the + * wrapper will raise an exception. + * @param {integer} metadata.maxResolvedArgs + * The maximum number of arguments which may be passed to the + * callback created by the wrapped async function. + * + * @returns {function(object, ...*)} + * The generated wrapper function. + */ + + + const wrapAsyncFunction = (name, metadata) => { + return function asyncFunctionWrapper(target, ...args) { + if (args.length < metadata.minArgs) { + throw new Error(`Expected at least ${metadata.minArgs} ${pluralizeArguments(metadata.minArgs)} for ${name}(), got ${args.length}`); + } + + if (args.length > metadata.maxArgs) { + throw new Error(`Expected at most ${metadata.maxArgs} ${pluralizeArguments(metadata.maxArgs)} for ${name}(), got ${args.length}`); + } + + return new Promise((resolve, reject) => { + if (metadata.fallbackToNoCallback) { + // This API method has currently no callback on Chrome, but it return a promise on Firefox, + // and so the polyfill will try to call it with a callback first, and it will fallback + // to not passing the callback if the first call fails. + try { + target[name](...args, makeCallback({ + resolve, + reject + }, metadata)); + } catch (cbError) { + console.warn(`${name} API method doesn't seem to support the callback parameter, ` + "falling back to call it without a callback: ", cbError); + target[name](...args); // Update the API method metadata, so that the next API calls will not try to + // use the unsupported callback anymore. + + metadata.fallbackToNoCallback = false; + metadata.noCallback = true; + resolve(); + } + } else if (metadata.noCallback) { + target[name](...args); + resolve(); + } else { + target[name](...args, makeCallback({ + resolve, + reject + }, metadata)); + } + }); + }; + }; + /** + * Wraps an existing method of the target object, so that calls to it are + * intercepted by the given wrapper function. The wrapper function receives, + * as its first argument, the original `target` object, followed by each of + * the arguments passed to the original method. + * + * @param {object} target + * The original target object that the wrapped method belongs to. + * @param {function} method + * The method being wrapped. This is used as the target of the Proxy + * object which is created to wrap the method. + * @param {function} wrapper + * The wrapper function which is called in place of a direct invocation + * of the wrapped method. + * + * @returns {Proxy} + * A Proxy object for the given method, which invokes the given wrapper + * method in its place. + */ + + + const wrapMethod = (target, method, wrapper) => { + return new Proxy(method, { + apply(targetMethod, thisObj, args) { + return wrapper.call(thisObj, target, ...args); + } + + }); + }; + + let hasOwnProperty = Function.call.bind(Object.prototype.hasOwnProperty); + /** + * Wraps an object in a Proxy which intercepts and wraps certain methods + * based on the given `wrappers` and `metadata` objects. + * + * @param {object} target + * The target object to wrap. + * + * @param {object} [wrappers = {}] + * An object tree containing wrapper functions for special cases. Any + * function present in this object tree is called in place of the + * method in the same location in the `target` object tree. These + * wrapper methods are invoked as described in {@see wrapMethod}. + * + * @param {object} [metadata = {}] + * An object tree containing metadata used to automatically generate + * Promise-based wrapper functions for asynchronous. Any function in + * the `target` object tree which has a corresponding metadata object + * in the same location in the `metadata` tree is replaced with an + * automatically-generated wrapper function, as described in + * {@see wrapAsyncFunction} + * + * @returns {Proxy} + */ + + const wrapObject = (target, wrappers = {}, metadata = {}) => { + let cache = Object.create(null); + let handlers = { + has(proxyTarget, prop) { + return prop in target || prop in cache; + }, + + get(proxyTarget, prop, receiver) { + if (prop in cache) { + return cache[prop]; + } + + if (!(prop in target)) { + return undefined; + } + + let value = target[prop]; + + if (typeof value === "function") { + // This is a method on the underlying object. Check if we need to do + // any wrapping. + if (typeof wrappers[prop] === "function") { + // We have a special-case wrapper for this method. + value = wrapMethod(target, target[prop], wrappers[prop]); + } else if (hasOwnProperty(metadata, prop)) { + // This is an async method that we have metadata for. Create a + // Promise wrapper for it. + let wrapper = wrapAsyncFunction(prop, metadata[prop]); + value = wrapMethod(target, target[prop], wrapper); + } else { + // This is a method that we don't know or care about. Return the + // original method, bound to the underlying object. + value = value.bind(target); + } + } else if (typeof value === "object" && value !== null && (hasOwnProperty(wrappers, prop) || hasOwnProperty(metadata, prop))) { + // This is an object that we need to do some wrapping for the children + // of. Create a sub-object wrapper for it with the appropriate child + // metadata. + value = wrapObject(value, wrappers[prop], metadata[prop]); + } else if (hasOwnProperty(metadata, "*")) { + // Wrap all properties in * namespace. + value = wrapObject(value, wrappers[prop], metadata["*"]); + } else { + // We don't need to do any wrapping for this property, + // so just forward all access to the underlying object. + Object.defineProperty(cache, prop, { + configurable: true, + enumerable: true, + + get() { + return target[prop]; + }, + + set(value) { + target[prop] = value; + } + + }); + return value; + } + + cache[prop] = value; + return value; + }, + + set(proxyTarget, prop, value, receiver) { + if (prop in cache) { + cache[prop] = value; + } else { + target[prop] = value; + } + + return true; + }, + + defineProperty(proxyTarget, prop, desc) { + return Reflect.defineProperty(cache, prop, desc); + }, + + deleteProperty(proxyTarget, prop) { + return Reflect.deleteProperty(cache, prop); + } + + }; // Per contract of the Proxy API, the "get" proxy handler must return the + // original value of the target if that value is declared read-only and + // non-configurable. For this reason, we create an object with the + // prototype set to `target` instead of using `target` directly. + // Otherwise we cannot return a custom object for APIs that + // are declared read-only and non-configurable, such as `chrome.devtools`. + // + // The proxy handlers themselves will still use the original `target` + // instead of the `proxyTarget`, so that the methods and properties are + // dereferenced via the original targets. + + let proxyTarget = Object.create(target); + return new Proxy(proxyTarget, handlers); + }; + /** + * Creates a set of wrapper functions for an event object, which handles + * wrapping of listener functions that those messages are passed. + * + * A single wrapper is created for each listener function, and stored in a + * map. Subsequent calls to `addListener`, `hasListener`, or `removeListener` + * retrieve the original wrapper, so that attempts to remove a + * previously-added listener work as expected. + * + * @param {DefaultWeakMap} wrapperMap + * A DefaultWeakMap object which will create the appropriate wrapper + * for a given listener function when one does not exist, and retrieve + * an existing one when it does. + * + * @returns {object} + */ + + + const wrapEvent = wrapperMap => ({ + addListener(target, listener, ...args) { + target.addListener(wrapperMap.get(listener), ...args); + }, + + hasListener(target, listener) { + return target.hasListener(wrapperMap.get(listener)); + }, + + removeListener(target, listener) { + target.removeListener(wrapperMap.get(listener)); + } + + }); // Keep track if the deprecation warning has been logged at least once. + + + let loggedSendResponseDeprecationWarning = false; + const onMessageWrappers = new DefaultWeakMap(listener => { + if (typeof listener !== "function") { + return listener; + } + /** + * Wraps a message listener function so that it may send responses based on + * its return value, rather than by returning a sentinel value and calling a + * callback. If the listener function returns a Promise, the response is + * sent when the promise either resolves or rejects. + * + * @param {*} message + * The message sent by the other end of the channel. + * @param {object} sender + * Details about the sender of the message. + * @param {function(*)} sendResponse + * A callback which, when called with an arbitrary argument, sends + * that value as a response. + * @returns {boolean} + * True if the wrapped listener returned a Promise, which will later + * yield a response. False otherwise. + */ + + + return function onMessage(message, sender, sendResponse) { + let didCallSendResponse = false; + let wrappedSendResponse; + let sendResponsePromise = new Promise(resolve => { + wrappedSendResponse = function (response) { + if (!loggedSendResponseDeprecationWarning) { + console.warn(SEND_RESPONSE_DEPRECATION_WARNING, new Error().stack); + loggedSendResponseDeprecationWarning = true; + } + + didCallSendResponse = true; + resolve(response); + }; + }); + let result; + + try { + result = listener(message, sender, wrappedSendResponse); + } catch (err) { + result = Promise.reject(err); + } + + const isResultThenable = result !== true && isThenable(result); // If the listener didn't returned true or a Promise, or called + // wrappedSendResponse synchronously, we can exit earlier + // because there will be no response sent from this listener. + + if (result !== true && !isResultThenable && !didCallSendResponse) { + return false; + } // A small helper to send the message if the promise resolves + // and an error if the promise rejects (a wrapped sendMessage has + // to translate the message into a resolved promise or a rejected + // promise). + + + const sendPromisedResult = promise => { + promise.then(msg => { + // send the message value. + sendResponse(msg); + }, error => { + // Send a JSON representation of the error if the rejected value + // is an instance of error, or the object itself otherwise. + let message; + + if (error && (error instanceof Error || typeof error.message === "string")) { + message = error.message; + } else { + message = "An unexpected error occurred"; + } + + sendResponse({ + __mozWebExtensionPolyfillReject__: true, + message + }); + }).catch(err => { + // Print an error on the console if unable to send the response. + console.error("Failed to send onMessage rejected reply", err); + }); + }; // If the listener returned a Promise, send the resolved value as a + // result, otherwise wait the promise related to the wrappedSendResponse + // callback to resolve and send it as a response. + + + if (isResultThenable) { + sendPromisedResult(result); + } else { + sendPromisedResult(sendResponsePromise); + } // Let Chrome know that the listener is replying. + + + return true; + }; + }); + + const wrappedSendMessageCallback = ({ + reject, + resolve + }, reply) => { + if (extensionAPIs.runtime.lastError) { + // Detect when none of the listeners replied to the sendMessage call and resolve + // the promise to undefined as in Firefox. + // See https://github.com/mozilla/webextension-polyfill/issues/130 + if (extensionAPIs.runtime.lastError.message === CHROME_SEND_MESSAGE_CALLBACK_NO_RESPONSE_MESSAGE) { + resolve(); + } else { + reject(extensionAPIs.runtime.lastError); + } + } else if (reply && reply.__mozWebExtensionPolyfillReject__) { + // Convert back the JSON representation of the error into + // an Error instance. + reject(new Error(reply.message)); + } else { + resolve(reply); + } + }; + + const wrappedSendMessage = (name, metadata, apiNamespaceObj, ...args) => { + if (args.length < metadata.minArgs) { + throw new Error(`Expected at least ${metadata.minArgs} ${pluralizeArguments(metadata.minArgs)} for ${name}(), got ${args.length}`); + } + + if (args.length > metadata.maxArgs) { + throw new Error(`Expected at most ${metadata.maxArgs} ${pluralizeArguments(metadata.maxArgs)} for ${name}(), got ${args.length}`); + } + + return new Promise((resolve, reject) => { + const wrappedCb = wrappedSendMessageCallback.bind(null, { + resolve, + reject + }); + args.push(wrappedCb); + apiNamespaceObj.sendMessage(...args); + }); + }; + + const staticWrappers = { + runtime: { + onMessage: wrapEvent(onMessageWrappers), + onMessageExternal: wrapEvent(onMessageWrappers), + sendMessage: wrappedSendMessage.bind(null, "sendMessage", { + minArgs: 1, + maxArgs: 3 + }) + }, + tabs: { + sendMessage: wrappedSendMessage.bind(null, "sendMessage", { + minArgs: 2, + maxArgs: 3 + }) + } + }; + const settingMetadata = { + clear: { + minArgs: 1, + maxArgs: 1 + }, + get: { + minArgs: 1, + maxArgs: 1 + }, + set: { + minArgs: 1, + maxArgs: 1 + } + }; + apiMetadata.privacy = { + network: { + "*": settingMetadata + }, + services: { + "*": settingMetadata + }, + websites: { + "*": settingMetadata + } + }; + return wrapObject(extensionAPIs, staticWrappers, apiMetadata); + }; + + if (typeof chrome != "object" || !chrome || !chrome.runtime || !chrome.runtime.id) { + throw new Error("This script should only be loaded in a browser extension."); + } // The build process adds a UMD wrapper around this file, which makes the + // `module` variable available. + + + module.exports = wrapAPIs(chrome); + } else { + module.exports = browser; + } +}); + + +/***/ }), + +/***/ 964: +/*!*******************************!*\ + !*** ./src/core/ts/config.ts ***! + \*******************************/ +/***/ ((__unused_webpack_module, exports) => { + +"use strict"; + +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.modelRegistry = exports.config = void 0; +const developmentBuild = "production" !== "production"; +exports.config = { + bergamotRestApiUrl: "http://127.0.0.1:8787", + useBergamotRestApi: "0" === "1", + sentryDsn: "https://@.ingest.sentry.io/", + bergamotModelsBaseUrl: developmentBuild + ? "http://0.0.0.0:4000/models" + : "https://storage.googleapis.com/bergamot-models-sandbox/0.2.0", + telemetryAppId: "org-mozilla-bergamot", + telemetryDebugMode: developmentBuild, + extensionBuildId: `${"v0.4.0"}-${"local"}#${"HEAD"}`, + supportedLanguagePairs: [ + // "German, French, Spanish, Polish, Czech, and Estonian in and out of English" + // ISO 639-1 codes + // Language pairs that are not available are commented out + // ["de","en"], + // ["fr","en"], + ["es", "en"], + // ["pl","en"], + // ["cs", "en"], + ["et", "en"], + ["en", "de"], + // ["en","fr"], + ["en", "es"], + // ["en","pl"], + // ["en", "cs"], + ["en", "et"], + ], + privacyNoticeUrl: "https://example.com/privacy-notice", + feedbackSurveyUrl: "https://qsurvey.mozilla.com/s3/bergamot-translate-product-feedback", +}; +exports.modelRegistry = { + esen: { + lex: { + name: "lex.50.50.esen.s2t.bin", + size: 3860888, + estimatedCompressedSize: 1978538, + expectedSha256Hash: "f11a2c23ef85ab1fee1c412b908d69bc20d66fd59faa8f7da5a5f0347eddf969", + }, + model: { + name: "model.esen.intgemm.alphas.bin", + size: 17140755, + estimatedCompressedSize: 13215960, + expectedSha256Hash: "4b6b7f451094aaa447d012658af158ffc708fc8842dde2f871a58404f5457fe0", + }, + vocab: { + name: "vocab.esen.spm", + size: 825463, + estimatedCompressedSize: 414566, + expectedSha256Hash: "909b1eea1face0d7f90a474fe29a8c0fef8d104b6e41e65616f864c964ba8845", + }, + }, + eten: { + lex: { + name: "lex.50.50.eten.s2t.bin", + size: 3974944, + estimatedCompressedSize: 1920655, + expectedSha256Hash: "6992bedc590e60e610a28129c80746fe5f33144a4520e2c5508d87db14ca54f8", + }, + model: { + name: "model.eten.intgemm.alphas.bin", + size: 17140754, + estimatedCompressedSize: 12222624, + expectedSha256Hash: "aac98a2371e216ee2d4843cbe896c617f6687501e17225ac83482eba52fd0028", + }, + vocab: { + name: "vocab.eten.spm", + size: 828426, + estimatedCompressedSize: 416995, + expectedSha256Hash: "e3b66bc141f6123cd40746e2fb9b8ee4f89cbf324ab27d6bbf3782e52f15fa2d", + }, + }, + ende: { + lex: { + name: "lex.50.50.ende.s2t.bin", + size: 3062492, + estimatedCompressedSize: 1575385, + expectedSha256Hash: "764797d075f0642c0b079cce6547348d65fe4e92ac69fa6a8605cd8b53dacb3f", + }, + model: { + name: "model.ende.intgemm.alphas.bin", + size: 17140498, + estimatedCompressedSize: 13207068, + expectedSha256Hash: "f0946515c6645304f0706fa66a051c3b7b7c507f12d0c850f276c18165a10c14", + }, + vocab: { + name: "vocab.deen.spm", + size: 797501, + estimatedCompressedSize: 412505, + expectedSha256Hash: "bc8f8229933d8294c727f3eab12f6f064e7082b929f2d29494c8a1e619ba174c", + }, + }, + enes: { + lex: { + name: "lex.50.50.enes.s2t.bin", + size: 3347104, + estimatedCompressedSize: 1720700, + expectedSha256Hash: "3a113d713dec3cf1d12bba5b138ae616e28bba4bbc7fe7fd39ba145e26b86d7f", + }, + model: { + name: "model.enes.intgemm.alphas.bin", + size: 17140755, + estimatedCompressedSize: 12602853, + expectedSha256Hash: "fa7460037a3163e03fe1d23602f964bff2331da6ee813637e092ddf37156ef53", + }, + vocab: { + name: "vocab.esen.spm", + size: 825463, + estimatedCompressedSize: 414566, + expectedSha256Hash: "909b1eea1face0d7f90a474fe29a8c0fef8d104b6e41e65616f864c964ba8845", + }, + }, + enet: { + lex: { + name: "lex.50.50.enet.s2t.bin", + size: 2700780, + estimatedCompressedSize: 1336443, + expectedSha256Hash: "3d1b40ff43ebef82cf98d416a88a1ea19eb325a85785eef102f59878a63a829d", + }, + model: { + name: "model.enet.intgemm.alphas.bin", + size: 17140754, + estimatedCompressedSize: 12543318, + expectedSha256Hash: "a28874a8b702a519a14dc71bcee726a5cb4b539eeaada2d06492f751469a1fd6", + }, + vocab: { + name: "vocab.eten.spm", + size: 828426, + estimatedCompressedSize: 416995, + expectedSha256Hash: "e3b66bc141f6123cd40746e2fb9b8ee4f89cbf324ab27d6bbf3782e52f15fa2d", + }, + }, +}; + + +/***/ }), + +/***/ 3345: +/*!********************************************************!*\ + !*** ./src/core/ts/shared-resources/ErrorReporting.ts ***! + \********************************************************/ +/***/ (function(__unused_webpack_module, exports, __webpack_require__) { + +"use strict"; + +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ +var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } }); +}) : (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + o[k2] = m[k]; +})); +var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { + Object.defineProperty(o, "default", { enumerable: true, value: v }); +}) : function(o, v) { + o["default"] = v; +}); +var __importStar = (this && this.__importStar) || function (mod) { + if (mod && mod.__esModule) return mod; + var result = {}; + if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k); + __setModuleDefault(result, mod); + return result; +}; +var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { + function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } + return new (P || (P = Promise))(function (resolve, reject) { + function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } + function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } + function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } + step((generator = generator.apply(thisArg, _arguments || [])).next()); + }); +}; +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.Sentry = exports.captureExceptionWithExtras = exports.initErrorReportingInContentScript = exports.initErrorReportingInBackgroundScript = exports.toggleErrorReportingBasedAsPerExtensionPreferences = void 0; +const Sentry = __importStar(__webpack_require__(/*! @sentry/browser */ 6614)); +exports.Sentry = Sentry; +const config_1 = __webpack_require__(/*! ../config */ 964); +const subscribeToExtensionPreferenceChanges_1 = __webpack_require__(/*! ./state-management/subscribeToExtensionPreferenceChanges */ 4971); +const flat_1 = __webpack_require__(/*! flat */ 9602); +// Initialize Sentry SDK if we have a non-placeholder DSN configured +let sentryIntialized = false; +if (!config_1.config.sentryDsn.includes("")) { + Sentry.init({ dsn: config_1.config.sentryDsn }); + sentryIntialized = true; +} +const enableErrorReporting = () => sentryIntialized && + (Sentry.getCurrentHub() + .getClient() + .getOptions().enabled = true); +const disableErrorReporting = () => sentryIntialized && + (Sentry.getCurrentHub() + .getClient() + .getOptions().enabled = false); +// Start with Sentry disabled +disableErrorReporting(); +const toggleErrorReportingBasedAsPerExtensionPreferences = (extensionPreferences) => { + if (extensionPreferences.enableErrorReporting) { + enableErrorReporting(); + Sentry.configureScope(function (scope) { + scope.setTag("extension.version", extensionPreferences.extensionVersion); + scope.setUser({ + id: extensionPreferences.extensionInstallationErrorReportingId, + }); + }); + console.info("Enabled error reporting"); + } + else { + disableErrorReporting(); + console.info("Disabled error reporting"); + } +}; +exports.toggleErrorReportingBasedAsPerExtensionPreferences = toggleErrorReportingBasedAsPerExtensionPreferences; +const initErrorReportingInBackgroundScript = (store, portNames) => __awaiter(void 0, void 0, void 0, function* () { + console.info(`Inquiring about error reporting preference in background script`); + yield subscribeToExtensionPreferenceChanges_1.subscribeToExtensionPreferenceChangesInBackgroundScript(store, exports.toggleErrorReportingBasedAsPerExtensionPreferences); + // Set up the port listeners that initErrorReportingInContentScript() + // expects to be available + return subscribeToExtensionPreferenceChanges_1.communicateExtensionPreferenceChangesToContentScripts(store, portNames); +}); +exports.initErrorReportingInBackgroundScript = initErrorReportingInBackgroundScript; +const initErrorReportingInContentScript = (portName) => __awaiter(void 0, void 0, void 0, function* () { + console.info(`Inquiring about error reporting preference in "${portName}"`); + yield subscribeToExtensionPreferenceChanges_1.subscribeToExtensionPreferenceChangesInContentScript(portName, exports.toggleErrorReportingBasedAsPerExtensionPreferences); +}); +exports.initErrorReportingInContentScript = initErrorReportingInContentScript; +const captureExceptionWithExtras = (exception, extras = null, level = null) => { + Sentry.withScope(scope => { + if (extras !== null) { + scope.setExtras(flat_1.flatten(extras)); + } + if (level !== null) { + scope.setLevel(level); + } + Sentry.captureException(exception); + }); +}; +exports.captureExceptionWithExtras = captureExceptionWithExtras; +Sentry.configureScope(scope => { + scope.addEventProcessor((event) => __awaiter(void 0, void 0, void 0, function* () { + // console.log("Unprocessed sentry event", Object.assign({}, { event })); + const normalizeUrl = url => { + return url.replace(/(webpack_require__@)?(moz|chrome)-extension:\/\/[^\/]+\//, "~/"); + }; + if (event.exception && + event.exception.values && + event.exception.values[0]) { + // Required for Sentry to map web extension sourcemap paths properly + if (event.culprit) { + event.culprit = normalizeUrl(event.culprit); + } + if (event.exception.values[0].stacktrace && + event.exception.values[0].stacktrace.frames) { + event.exception.values[0].stacktrace.frames = event.exception.values[0].stacktrace.frames.map(frame => { + frame.filename = normalizeUrl(frame.filename); + return frame; + }); + } + // console.log("Processed sentry event", { event }); + return event; + } + return null; + })); +}); + + +/***/ }), + +/***/ 5602: +/*!*********************************************************!*\ + !*** ./src/core/ts/shared-resources/LanguageSupport.ts ***! + \*********************************************************/ +/***/ (function(__unused_webpack_module, exports, __webpack_require__) { + +"use strict"; + +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ +var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { + function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } + return new (P || (P = Promise))(function (resolve, reject) { + function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } + function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } + function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } + step((generator = generator.apply(thisArg, _arguments || [])).next()); + }); +}; +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.LanguageSupport = void 0; +const webextension_polyfill_ts_1 = __webpack_require__(/*! webextension-polyfill-ts */ 3624); +const config_1 = __webpack_require__(/*! ../config */ 964); +class LanguageSupport { + constructor() { + this.getAcceptedTargetLanguages = () => __awaiter(this, void 0, void 0, function* () { + return [ + ...new Set([ + webextension_polyfill_ts_1.browser.i18n.getUILanguage(), + ...(yield webextension_polyfill_ts_1.browser.i18n.getAcceptLanguages()), + ].map(localeCode => localeCode.split("-")[0])), + ]; + }); + this.getSupportedSourceLanguages = () => { + return [...new Set(config_1.config.supportedLanguagePairs.map(lp => lp[0]))]; + }; + this.getSupportedTargetLanguagesGivenASourceLanguage = (translateFrom) => { + return [ + ...new Set(config_1.config.supportedLanguagePairs + .filter(lp => lp[0] === translateFrom) + .map(lp => lp[1])), + ]; + }; + this.getAllPossiblySupportedTargetLanguages = () => { + return [...new Set(config_1.config.supportedLanguagePairs.map(lp => lp[1]))]; + }; + this.getDefaultSourceLanguage = (translateFrom, detectedLanguage) => { + return translateFrom || detectedLanguage; + }; + this.getDefaultTargetLanguage = (translateFrom, acceptedTargetLanguages) => { + const supportedTargetLanguages = translateFrom + ? this.getSupportedTargetLanguagesGivenASourceLanguage(translateFrom) + : this.getAllPossiblySupportedTargetLanguages(); + const possibleDefaultTargetLanguages = acceptedTargetLanguages.filter(languageCode => supportedTargetLanguages.includes(languageCode)); + if (possibleDefaultTargetLanguages.length) { + return possibleDefaultTargetLanguages[0]; + } + return null; + }; + this.summarizeLanguageSupport = (detectedLanguageResults) => __awaiter(this, void 0, void 0, function* () { + const acceptedTargetLanguages = yield this.getAcceptedTargetLanguages(); + const defaultSourceLanguage = this.getDefaultSourceLanguage(null, detectedLanguageResults === null || detectedLanguageResults === void 0 ? void 0 : detectedLanguageResults.language); + const defaultTargetLanguage = this.getDefaultTargetLanguage(defaultSourceLanguage, acceptedTargetLanguages); + const supportedSourceLanguages = this.getSupportedSourceLanguages(); + const supportedTargetLanguagesGivenDefaultSourceLanguage = this.getSupportedTargetLanguagesGivenASourceLanguage(defaultSourceLanguage); + const allPossiblySupportedTargetLanguages = this.getAllPossiblySupportedTargetLanguages(); + return { + acceptedTargetLanguages, + defaultSourceLanguage, + defaultTargetLanguage, + supportedSourceLanguages, + supportedTargetLanguagesGivenDefaultSourceLanguage, + allPossiblySupportedTargetLanguages, + }; + }); + } +} +exports.LanguageSupport = LanguageSupport; + + +/***/ }), + +/***/ 4779: +/*!*********************************************************************!*\ + !*** ./src/core/ts/shared-resources/models/BaseTranslationState.ts ***! + \*********************************************************************/ +/***/ (function(__unused_webpack_module, exports, __webpack_require__) { + +"use strict"; + +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ +var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) { + var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; + if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); + else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; + return c > 3 && r && Object.defineProperty(target, key, r), r; +}; +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.BaseTranslationState = exports.TranslationStatus = void 0; +const mobx_keystone_1 = __webpack_require__(/*! mobx-keystone */ 7680); +const mobx_1 = __webpack_require__(/*! mobx */ 9637); +const webextension_polyfill_ts_1 = __webpack_require__(/*! webextension-polyfill-ts */ 3624); +/* eslint-disable no-unused-vars, no-shadow */ +// TODO: update typescript-eslint when support for this kind of declaration is supported +var TranslationStatus; +(function (TranslationStatus) { + TranslationStatus["UNKNOWN"] = "UNKNOWN"; + TranslationStatus["UNAVAILABLE"] = "UNAVAILABLE"; + TranslationStatus["DETECTING_LANGUAGE"] = "DETECTING_LANGUAGE"; + TranslationStatus["LANGUAGE_NOT_DETECTED"] = "LANGUAGE_NOT_DETECTED"; + TranslationStatus["SOURCE_LANGUAGE_UNDERSTOOD"] = "SOURCE_LANGUAGE_UNDERSTOOD"; + TranslationStatus["TRANSLATION_UNSUPPORTED"] = "TRANSLATION_UNSUPPORTED"; + TranslationStatus["OFFER"] = "OFFER"; + TranslationStatus["DOWNLOADING_TRANSLATION_MODEL"] = "DOWNLOADING_TRANSLATION_MODEL"; + TranslationStatus["TRANSLATING"] = "TRANSLATING"; + TranslationStatus["TRANSLATED"] = "TRANSLATED"; + TranslationStatus["ERROR"] = "ERROR"; +})(TranslationStatus = exports.TranslationStatus || (exports.TranslationStatus = {})); +/* eslint-enable no-unused-vars, no-shadow */ +let BaseTranslationState = class BaseTranslationState extends mobx_keystone_1.Model({ + isVisible: mobx_keystone_1.prop({ setterAction: true }), + displayQualityEstimation: mobx_keystone_1.prop({ setterAction: true }), + translationRequested: mobx_keystone_1.prop({ setterAction: true }), + cancellationRequested: mobx_keystone_1.prop({ setterAction: true }), + detectedLanguageResults: mobx_keystone_1.prop(() => null, { + setterAction: true, + }), + translateFrom: mobx_keystone_1.prop({ setterAction: true }), + translateTo: mobx_keystone_1.prop({ setterAction: true }), + translationStatus: mobx_keystone_1.prop(TranslationStatus.UNKNOWN, { + setterAction: true, + }), + tabId: mobx_keystone_1.prop(), + wordCount: mobx_keystone_1.prop(), + wordCountVisible: mobx_keystone_1.prop(), + wordCountVisibleInViewport: mobx_keystone_1.prop(), + translationInitiationTimestamp: mobx_keystone_1.prop(), + totalModelLoadWallTimeMs: mobx_keystone_1.prop(), + totalTranslationWallTimeMs: mobx_keystone_1.prop(), + totalTranslationEngineRequestCount: mobx_keystone_1.prop(), + queuedTranslationEngineRequestCount: mobx_keystone_1.prop(), + modelLoadNecessary: mobx_keystone_1.prop(), + modelDownloadNecessary: mobx_keystone_1.prop(), + modelDownloading: mobx_keystone_1.prop(), + modelDownloadProgress: mobx_keystone_1.prop(), + modelLoading: mobx_keystone_1.prop(), + modelLoaded: mobx_keystone_1.prop(), + translationFinished: mobx_keystone_1.prop(), + modelLoadErrorOccurred: mobx_keystone_1.prop(), + modelDownloadErrorOccurred: mobx_keystone_1.prop(), + translationErrorOccurred: mobx_keystone_1.prop(), + otherErrorOccurred: mobx_keystone_1.prop(), +}) { + get effectiveTranslateFrom() { + var _a; + return this.translateFrom || ((_a = this.detectedLanguageResults) === null || _a === void 0 ? void 0 : _a.language); + } + get effectiveTranslateTo() { + const browserUiLanguageCode = webextension_polyfill_ts_1.browser.i18n.getUILanguage().split("-")[0]; + return this.translateTo || browserUiLanguageCode; + } +}; +__decorate([ + mobx_1.computed +], BaseTranslationState.prototype, "effectiveTranslateFrom", null); +__decorate([ + mobx_1.computed +], BaseTranslationState.prototype, "effectiveTranslateTo", null); +BaseTranslationState = __decorate([ + mobx_keystone_1.model("bergamotTranslate/BaseTranslationState") +], BaseTranslationState); +exports.BaseTranslationState = BaseTranslationState; + + +/***/ }), + +/***/ 5482: +/*!*************************************************************************!*\ + !*** ./src/core/ts/shared-resources/models/DocumentTranslationState.ts ***! + \*************************************************************************/ +/***/ (function(__unused_webpack_module, exports, __webpack_require__) { + +"use strict"; + +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ +var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) { + var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; + if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); + else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; + return c > 3 && r && Object.defineProperty(target, key, r), r; +}; +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.DocumentTranslationState = void 0; +const mobx_keystone_1 = __webpack_require__(/*! mobx-keystone */ 7680); +const TabTranslationState_1 = __webpack_require__(/*! ./TabTranslationState */ 6556); +let DocumentTranslationState = class DocumentTranslationState extends mobx_keystone_1.ExtendedModel(TabTranslationState_1.TabTranslationState, { + frameId: mobx_keystone_1.prop(), +}) { +}; +DocumentTranslationState = __decorate([ + mobx_keystone_1.model("bergamotTranslate/DocumentTranslationState") +], DocumentTranslationState); +exports.DocumentTranslationState = DocumentTranslationState; + + +/***/ }), + +/***/ 65: +/*!***************************************************************!*\ + !*** ./src/core/ts/shared-resources/models/ExtensionState.ts ***! + \***************************************************************/ +/***/ (function(__unused_webpack_module, exports, __webpack_require__) { + +"use strict"; + +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ +var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) { + var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; + if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); + else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; + return c > 3 && r && Object.defineProperty(target, key, r), r; +}; +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.ExtensionState = exports.translateOwnTextTranslationStateMapKey = exports.documentTranslationStateMapKey = void 0; +const mobx_keystone_1 = __webpack_require__(/*! mobx-keystone */ 7680); +const mobx_1 = __webpack_require__(/*! mobx */ 9637); +const TabTranslationState_1 = __webpack_require__(/*! ./TabTranslationState */ 6556); +const BaseTranslationState_1 = __webpack_require__(/*! ./BaseTranslationState */ 4779); +const documentTranslationStateMapKey = (frameInfo) => `${frameInfo.tabId}-${frameInfo.frameId}`; +exports.documentTranslationStateMapKey = documentTranslationStateMapKey; +const translateOwnTextTranslationStateMapKey = (totts) => `${totts.tabId}`; +exports.translateOwnTextTranslationStateMapKey = translateOwnTextTranslationStateMapKey; +let ExtensionState = class ExtensionState extends mobx_keystone_1.Model({ + documentTranslationStates: mobx_keystone_1.prop_mapObject(() => new Map()), + fragmentTranslationStates: mobx_keystone_1.prop_mapObject(() => new Map()), + translateOwnTextTranslationStates: mobx_keystone_1.prop_mapObject(() => new Map()), +}) { + setDocumentTranslationState(documentTranslationState) { + this.documentTranslationStates.set(exports.documentTranslationStateMapKey(documentTranslationState), documentTranslationState); + } + patchDocumentTranslationStateByFrameInfo(frameInfo, patches) { + const key = exports.documentTranslationStateMapKey(frameInfo); + const dts = this.documentTranslationStates.get(key); + mobx_keystone_1.applyPatches(dts, patches); + this.documentTranslationStates.set(key, dts); + } + deleteDocumentTranslationStateByFrameInfo(frameInfo) { + this.documentTranslationStates.delete(exports.documentTranslationStateMapKey(frameInfo)); + } + setTranslateOwnTextTranslationState(translateOwnTextTranslationState) { + this.translateOwnTextTranslationStates.set(exports.translateOwnTextTranslationStateMapKey(translateOwnTextTranslationState), translateOwnTextTranslationState); + } + deleteTranslateOwnTextTranslationState(translateOwnTextTranslationState) { + this.translateOwnTextTranslationStates.delete(exports.translateOwnTextTranslationStateMapKey(translateOwnTextTranslationState)); + } + get documentTranslationStatesByTabId() { + const map = new Map(); + this.documentTranslationStates.forEach((documentTranslationState) => { + if (map.has(documentTranslationState.tabId)) { + map.set(documentTranslationState.tabId, [ + ...map.get(documentTranslationState.tabId), + documentTranslationState, + ]); + } + else { + map.set(documentTranslationState.tabId, [documentTranslationState]); + } + }); + return map; + } + get tabTranslationStates() { + const map = new Map(); + this.documentTranslationStatesByTabId.forEach((documentTranslationStates, tabId) => { + const tabTopFrameState = documentTranslationStates.find((dts) => dts.frameId === 0); + // If the top frame state is unavailable (may happen during the early stages of a + // document translation state model instance), return an equally uninformative tab translation state + if (!tabTopFrameState) { + const tabTranslationState = new TabTranslationState_1.TabTranslationState(Object.assign({ tabId }, mobx_keystone_1.getSnapshot(documentTranslationStates[0]))); + map.set(tabId, tabTranslationState); + return; + } + // Use top frame state attributes to represent most of the tab state if available + const { isVisible, displayQualityEstimation, translationRequested, cancellationRequested, detectedLanguageResults, translateFrom, translateTo, windowId, showOriginal, url, } = mobx_keystone_1.getSnapshot(tabTopFrameState); + // Sum some state attributes + const wordCount = documentTranslationStates + .map(dts => dts.wordCount) + .reduce((a, b) => a + b, 0); + const wordCountVisible = documentTranslationStates + .map(dts => dts.wordCountVisible) + .reduce((a, b) => a + b, 0); + const wordCountVisibleInViewport = documentTranslationStates + .map(dts => dts.wordCountVisibleInViewport) + .reduce((a, b) => a + b, 0); + const totalModelLoadWallTimeMs = documentTranslationStates + .map(dts => dts.totalModelLoadWallTimeMs) + .reduce((a, b) => a + b, 0); + const totalTranslationWallTimeMs = documentTranslationStates + .map(dts => dts.totalTranslationWallTimeMs) + .reduce((a, b) => a + b, 0); + const totalTranslationEngineRequestCount = documentTranslationStates + .map(dts => dts.totalTranslationEngineRequestCount) + .reduce((a, b) => a + b, 0); + const queuedTranslationEngineRequestCount = documentTranslationStates + .map(dts => dts.queuedTranslationEngineRequestCount) + .reduce((a, b) => a + b, 0); + // Merge translation-progress-related booleans as per src/core/ts/shared-resources/state-management/DocumentTranslationStateCommunicator.ts + const translationInitiationTimestamps = documentTranslationStates.map((dts) => dts.translationInitiationTimestamp); + const translationInitiationTimestamp = Math.min(...translationInitiationTimestamps); + const modelLoadNecessary = !!documentTranslationStates.filter((dts) => dts.modelLoadNecessary).length; + const modelDownloadNecessary = !!documentTranslationStates.filter((dts) => dts.modelDownloadNecessary).length; + const modelDownloading = !!documentTranslationStates.filter((dts) => dts.modelDownloading).length; + const modelLoading = modelLoadNecessary + ? !!documentTranslationStates.find((dts) => dts.modelLoading) + : undefined; + const modelLoaded = modelLoadNecessary + ? !!documentTranslationStates.find((dts) => !dts.modelLoaded) + : undefined; + const translationFinished = documentTranslationStates.filter((dts) => !dts.translationFinished).length === 0; + // Merge model download progress as per src/core/ts/shared-resources/state-management/DocumentTranslationStateCommunicator.ts + const emptyDownloadProgress = { + bytesDownloaded: 0, + bytesToDownload: 0, + startTs: undefined, + durationMs: 0, + endTs: undefined, + }; + const modelDownloadProgress = documentTranslationStates + .map((dts) => mobx_keystone_1.getSnapshot(dts.modelDownloadProgress)) + .filter((mdp) => mdp) + .reduce((a, b) => { + const startTs = a.startTs && a.startTs <= b.startTs ? a.startTs : b.startTs; + const endTs = a.endTs && a.endTs >= b.endTs ? a.endTs : b.endTs; + return { + bytesDownloaded: a.bytesDownloaded + b.bytesDownloaded, + bytesToDownload: a.bytesToDownload + b.bytesToDownload, + startTs, + durationMs: endTs ? endTs - startTs : Date.now() - startTs, + endTs, + }; + }, emptyDownloadProgress); + // Merge errorOccurred attributes + const modelLoadErrorOccurred = !!documentTranslationStates.filter((dts) => dts.modelLoadErrorOccurred).length; + const modelDownloadErrorOccurred = !!documentTranslationStates.filter((dts) => dts.modelDownloadErrorOccurred).length; + const translationErrorOccurred = !!documentTranslationStates.filter((dts) => dts.translationErrorOccurred).length; + const otherErrorOccurred = !!documentTranslationStates.filter((dts) => dts.otherErrorOccurred).length; + // Special merging of translation status + const anyTabHasTranslationStatus = (translationStatus) => documentTranslationStates.find(dts => dts.translationStatus === translationStatus); + const tabTranslationStatus = () => { + if (anyTabHasTranslationStatus(BaseTranslationState_1.TranslationStatus.DETECTING_LANGUAGE)) { + return BaseTranslationState_1.TranslationStatus.DETECTING_LANGUAGE; + } + if (anyTabHasTranslationStatus(BaseTranslationState_1.TranslationStatus.DOWNLOADING_TRANSLATION_MODEL)) { + return BaseTranslationState_1.TranslationStatus.DOWNLOADING_TRANSLATION_MODEL; + } + if (anyTabHasTranslationStatus(BaseTranslationState_1.TranslationStatus.TRANSLATING)) { + return BaseTranslationState_1.TranslationStatus.TRANSLATING; + } + if (anyTabHasTranslationStatus(BaseTranslationState_1.TranslationStatus.ERROR)) { + return BaseTranslationState_1.TranslationStatus.ERROR; + } + return tabTopFrameState.translationStatus; + }; + const translationStatus = tabTranslationStatus(); + const tabTranslationStateData = { + isVisible, + displayQualityEstimation, + translationRequested, + cancellationRequested, + detectedLanguageResults, + translateFrom, + translateTo, + translationStatus, + tabId, + windowId, + showOriginal, + url, + wordCount, + wordCountVisible, + wordCountVisibleInViewport, + translationInitiationTimestamp, + totalModelLoadWallTimeMs, + totalTranslationWallTimeMs, + totalTranslationEngineRequestCount, + queuedTranslationEngineRequestCount, + modelLoadNecessary, + modelDownloadNecessary, + modelDownloading, + modelDownloadProgress, + modelLoading, + modelLoaded, + translationFinished, + modelLoadErrorOccurred, + modelDownloadErrorOccurred, + translationErrorOccurred, + otherErrorOccurred, + }; + const tabTranslationState = new TabTranslationState_1.TabTranslationState(tabTranslationStateData); + map.set(tabId, tabTranslationState); + }); + return map; + } + tabSpecificDocumentTranslationStates(tabId) { + const result = []; + this.documentTranslationStates.forEach((documentTranslationState) => { + if (documentTranslationState.tabId === tabId) { + result.push(documentTranslationState); + } + }); + return result; + } + requestTranslationOfAllFramesInTab(tabId, from, to) { + // Request translation of all frames in a specific tab + this.tabSpecificDocumentTranslationStates(tabId).forEach((dts) => { + this.patchDocumentTranslationStateByFrameInfo(dts, [ + { + op: "replace", + path: ["translateFrom"], + value: from, + }, + { + op: "replace", + path: ["translateTo"], + value: to, + }, + { + op: "replace", + path: ["translationRequested"], + value: true, + }, + ]); + }); + } + showOriginalInTab(tabId) { + this.tabSpecificDocumentTranslationStates(tabId).forEach((dts) => { + this.patchDocumentTranslationStateByFrameInfo(dts, [ + { + op: "replace", + path: ["showOriginal"], + value: true, + }, + ]); + }); + } + hideOriginalInTab(tabId) { + this.tabSpecificDocumentTranslationStates(tabId).forEach((dts) => { + this.patchDocumentTranslationStateByFrameInfo(dts, [ + { + op: "replace", + path: ["showOriginal"], + value: false, + }, + ]); + }); + } +}; +__decorate([ + mobx_keystone_1.modelAction +], ExtensionState.prototype, "setDocumentTranslationState", null); +__decorate([ + mobx_keystone_1.modelAction +], ExtensionState.prototype, "patchDocumentTranslationStateByFrameInfo", null); +__decorate([ + mobx_keystone_1.modelAction +], ExtensionState.prototype, "deleteDocumentTranslationStateByFrameInfo", null); +__decorate([ + mobx_keystone_1.modelAction +], ExtensionState.prototype, "setTranslateOwnTextTranslationState", null); +__decorate([ + mobx_keystone_1.modelAction +], ExtensionState.prototype, "deleteTranslateOwnTextTranslationState", null); +__decorate([ + mobx_1.computed +], ExtensionState.prototype, "documentTranslationStatesByTabId", null); +__decorate([ + mobx_1.computed +], ExtensionState.prototype, "tabTranslationStates", null); +ExtensionState = __decorate([ + mobx_keystone_1.model("bergamotTranslate/ExtensionState") +], ExtensionState); +exports.ExtensionState = ExtensionState; + + +/***/ }), + +/***/ 6556: +/*!********************************************************************!*\ + !*** ./src/core/ts/shared-resources/models/TabTranslationState.ts ***! + \********************************************************************/ +/***/ (function(__unused_webpack_module, exports, __webpack_require__) { + +"use strict"; + +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ +var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) { + var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; + if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); + else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; + return c > 3 && r && Object.defineProperty(target, key, r), r; +}; +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.TabTranslationState = void 0; +const mobx_keystone_1 = __webpack_require__(/*! mobx-keystone */ 7680); +const BaseTranslationState_1 = __webpack_require__(/*! ./BaseTranslationState */ 4779); +let TabTranslationState = class TabTranslationState extends mobx_keystone_1.ExtendedModel(BaseTranslationState_1.BaseTranslationState, { + windowId: mobx_keystone_1.prop(), + showOriginal: mobx_keystone_1.prop({ setterAction: true }), + url: mobx_keystone_1.prop(), +}) { +}; +TabTranslationState = __decorate([ + mobx_keystone_1.model("bergamotTranslate/TabTranslationState") +], TabTranslationState); +exports.TabTranslationState = TabTranslationState; + + +/***/ }), + +/***/ 8238: +/*!*********************************************************************************!*\ + !*** ./src/core/ts/shared-resources/models/TranslateOwnTextTranslationState.ts ***! + \*********************************************************************************/ +/***/ (function(__unused_webpack_module, exports, __webpack_require__) { + +"use strict"; + +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ +var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) { + var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; + if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); + else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; + return c > 3 && r && Object.defineProperty(target, key, r), r; +}; +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.TranslateOwnTextTranslationState = void 0; +const mobx_keystone_1 = __webpack_require__(/*! mobx-keystone */ 7680); +const BaseTranslationState_1 = __webpack_require__(/*! ./BaseTranslationState */ 4779); +let TranslateOwnTextTranslationState = class TranslateOwnTextTranslationState extends mobx_keystone_1.ExtendedModel(BaseTranslationState_1.BaseTranslationState, { + translateAutomatically: mobx_keystone_1.prop(true), +}) { +}; +TranslateOwnTextTranslationState = __decorate([ + mobx_keystone_1.model("bergamotTranslate/TranslateOwnTextTranslationState") +], TranslateOwnTextTranslationState); +exports.TranslateOwnTextTranslationState = TranslateOwnTextTranslationState; + + +/***/ }), + +/***/ 4971: +/*!************************************************************************************************!*\ + !*** ./src/core/ts/shared-resources/state-management/subscribeToExtensionPreferenceChanges.ts ***! + \************************************************************************************************/ +/***/ (function(__unused_webpack_module, exports, __webpack_require__) { + +"use strict"; + +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ +var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { + function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } + return new (P || (P = Promise))(function (resolve, reject) { + function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } + function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } + function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } + step((generator = generator.apply(thisArg, _arguments || [])).next()); + }); +}; +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.communicateExtensionPreferenceChangesToContentScripts = exports.subscribeToExtensionPreferenceChangesInContentScript = exports.subscribeToExtensionPreferenceChangesInBackgroundScript = void 0; +const webextension_polyfill_ts_1 = __webpack_require__(/*! webextension-polyfill-ts */ 3624); +const subscribeToExtensionPreferenceChangesInBackgroundScript = (store, callback) => __awaiter(void 0, void 0, void 0, function* () { + const extensionPreferences = yield store.getExtensionPreferences(); + callback(extensionPreferences); + const originalSetExtensionPreferences = store.setExtensionPreferences.bind(store); + store.setExtensionPreferences = ($extensionPreferences) => __awaiter(void 0, void 0, void 0, function* () { + yield originalSetExtensionPreferences($extensionPreferences); + callback(yield store.getExtensionPreferences()); + }); +}); +exports.subscribeToExtensionPreferenceChangesInBackgroundScript = subscribeToExtensionPreferenceChangesInBackgroundScript; +const subscribeToExtensionPreferenceChangesInContentScript = (portName, callback) => __awaiter(void 0, void 0, void 0, function* () { + const port = webextension_polyfill_ts_1.browser.runtime.connect(webextension_polyfill_ts_1.browser.runtime.id, { + name: portName, + }); + return new Promise((resolve, reject) => { + port.postMessage({ + requestExtensionPreferences: true, + }); + port.onMessage.addListener((m) => __awaiter(void 0, void 0, void 0, function* () { + if (m.extensionPreferences) { + const { extensionPreferences } = m; + callback(extensionPreferences); + resolve(); + } + reject("Unexpected message"); + })); + }); +}); +exports.subscribeToExtensionPreferenceChangesInContentScript = subscribeToExtensionPreferenceChangesInContentScript; +/** + * Set up communication channels with content scripts so that they + * can subscribe to changes in extension preferences + * @param store + * @param portNames + */ +const communicateExtensionPreferenceChangesToContentScripts = (store, portNames) => __awaiter(void 0, void 0, void 0, function* () { + const connectedPorts = {}; + // Broadcast updates to extension preferences + const originalSetExtensionPreferences = store.setExtensionPreferences.bind(store); + store.setExtensionPreferences = (extensionPreferences) => __awaiter(void 0, void 0, void 0, function* () { + yield originalSetExtensionPreferences(extensionPreferences); + Object.keys(connectedPorts).forEach((portName) => __awaiter(void 0, void 0, void 0, function* () { + const port = connectedPorts[portName]; + port.postMessage({ + extensionPreferences: yield store.getExtensionPreferences(), + }); + })); + }); + const extensionPreferencesContentScriptPortListener = (port) => { + if (!portNames.includes(port.name)) { + return; + } + port.onMessage.addListener(function (m) { + return __awaiter(this, void 0, void 0, function* () { + connectedPorts[port.name] = port; + // console.debug(`Message from port "${port.name}"`, { m }); + if (m.requestExtensionPreferences) { + port.postMessage({ + extensionPreferences: yield store.getExtensionPreferences(), + }); + } + if (m.saveExtensionPreferences) { + const { updatedExtensionPreferences } = m.saveExtensionPreferences; + yield store.setExtensionPreferences(updatedExtensionPreferences); + port.postMessage({ + extensionPreferences: yield store.getExtensionPreferences(), + }); + } + }); + }); + port.onDisconnect.addListener(($port) => { + delete connectedPorts[$port.name]; + }); + }; + webextension_polyfill_ts_1.browser.runtime.onConnect.addListener(extensionPreferencesContentScriptPortListener); + return extensionPreferencesContentScriptPortListener; +}); +exports.communicateExtensionPreferenceChangesToContentScripts = communicateExtensionPreferenceChangesToContentScripts; + + +/***/ }) + +}]); +//# sourceMappingURL=commons.js.map \ No newline at end of file diff --git a/browser/extensions/translations/extension/dom-translation-content-script.js b/browser/extensions/translations/extension/dom-translation-content-script.js new file mode 100644 index 000000000000..b7a31cd00d95 --- /dev/null +++ b/browser/extensions/translations/extension/dom-translation-content-script.js @@ -0,0 +1,2750 @@ +/******/ (() => { // webpackBootstrap +/******/ "use strict"; +/******/ var __webpack_modules__ = ({ + +/***/ 9023: +/*!************************************************************************************************!*\ + !*** ./src/core/ts/content-scripts/dom-translation-content-script.js/DomTranslationManager.ts ***! + \************************************************************************************************/ +/***/ (function(__unused_webpack_module, exports, __webpack_require__) { + + +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this file, + * You can obtain one at http://mozilla.org/MPL/2.0/. */ +var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { + function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } + return new (P || (P = Promise))(function (resolve, reject) { + function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } + function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } + function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } + step((generator = generator.apply(thisArg, _arguments || [])).next()); + }); +}; +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.DomTranslationManager = void 0; +const TranslationDocument_1 = __webpack_require__(/*! ./TranslationDocument */ 992); +const BergamotDomTranslator_1 = __webpack_require__(/*! ./dom-translators/BergamotDomTranslator */ 1518); +const getTranslationNodes_1 = __webpack_require__(/*! ./getTranslationNodes */ 5173); +const ContentScriptLanguageDetectorProxy_1 = __webpack_require__(/*! ../../shared-resources/ContentScriptLanguageDetectorProxy */ 6336); +const BaseTranslationState_1 = __webpack_require__(/*! ../../shared-resources/models/BaseTranslationState */ 4779); +const LanguageSupport_1 = __webpack_require__(/*! ../../shared-resources/LanguageSupport */ 5602); +const detagAndProject_1 = __webpack_require__(/*! ./dom-translators/detagAndProject */ 961); +class DomTranslationManager { + constructor(documentTranslationStateCommunicator, document, contentWindow) { + this.documentTranslationStateCommunicator = documentTranslationStateCommunicator; + this.document = document; + this.contentWindow = contentWindow; + this.languageDetector = new ContentScriptLanguageDetectorProxy_1.ContentScriptLanguageDetectorProxy(); + } + attemptToDetectLanguage() { + return __awaiter(this, void 0, void 0, function* () { + console.debug("Attempting to detect language"); + const url = String(this.document.location); + if (!url.startsWith("http://") && !url.startsWith("https://")) { + console.debug("Not a HTTP(S) url, translation unavailable", { url }); + this.documentTranslationStateCommunicator.broadcastUpdatedTranslationStatus(BaseTranslationState_1.TranslationStatus.UNAVAILABLE); + return; + } + console.debug("Setting status to reflect detection of language ongoing"); + this.documentTranslationStateCommunicator.broadcastUpdatedTranslationStatus(BaseTranslationState_1.TranslationStatus.DETECTING_LANGUAGE); + // Grab a 60k sample of text from the page. + // (The CLD2 library used by the language detector is capable of + // analyzing raw HTML. Unfortunately, that takes much more memory, + // and since it's hosted by emscripten, and therefore can't shrink + // its heap after it's grown, it has a performance cost. + // So we send plain text instead.) + const translationNodes = getTranslationNodes_1.getTranslationNodes(document.body); + const domElementsToStringWithMaxLength = (elements, maxLength) => { + return elements + .map(el => el.textContent) + .join("\n") + .substr(0, maxLength); + }; + const string = domElementsToStringWithMaxLength(translationNodes.map(tn => tn.content), 60 * 1024); + // Language detection isn't reliable on very short strings. + if (string.length < 100) { + console.debug("Language detection isn't reliable on very short strings. Skipping language detection", { string }); + this.documentTranslationStateCommunicator.broadcastUpdatedTranslationStatus(BaseTranslationState_1.TranslationStatus.LANGUAGE_NOT_DETECTED); + return; + } + const detectedLanguageResults = yield this.languageDetector.detectLanguage(string); + console.debug("Language detection results are in", { + detectedLanguageResults, + }); + // The window might be gone by now. + if (!this.contentWindow) { + console.info("Content window reference invalid, deleting document translation state"); + this.documentTranslationStateCommunicator.clear(); + return; + } + // Save results in extension state + this.documentTranslationStateCommunicator.updatedDetectedLanguageResults(detectedLanguageResults); + if (!detectedLanguageResults.confident) { + console.debug("Language detection results not confident enough, bailing."); + this.documentTranslationStateCommunicator.broadcastUpdatedTranslationStatus(BaseTranslationState_1.TranslationStatus.LANGUAGE_NOT_DETECTED); + return; + } + console.debug("Updating state to reflect that language has been detected"); + yield this.checkLanguageSupport(detectedLanguageResults); + }); + } + checkLanguageSupport(detectedLanguageResults) { + return __awaiter(this, void 0, void 0, function* () { + const { summarizeLanguageSupport } = new LanguageSupport_1.LanguageSupport(); + const detectedLanguage = detectedLanguageResults.language; + const { acceptedTargetLanguages, + // defaultSourceLanguage, + defaultTargetLanguage, supportedSourceLanguages, supportedTargetLanguagesGivenDefaultSourceLanguage, allPossiblySupportedTargetLanguages, } = yield summarizeLanguageSupport(detectedLanguageResults); + if (acceptedTargetLanguages.includes(detectedLanguage)) { + // Detected language is the same as the user's accepted target languages. + console.info("Detected language is in one of the user's accepted target languages.", { + acceptedTargetLanguages, + }); + this.documentTranslationStateCommunicator.broadcastUpdatedTranslationStatus(BaseTranslationState_1.TranslationStatus.SOURCE_LANGUAGE_UNDERSTOOD); + return; + } + if (!supportedSourceLanguages.includes(detectedLanguage)) { + // Detected language is not part of the supported source languages. + console.info("Detected language is not part of the supported source languages.", { detectedLanguage, supportedSourceLanguages }); + this.documentTranslationStateCommunicator.broadcastUpdatedTranslationStatus(BaseTranslationState_1.TranslationStatus.TRANSLATION_UNSUPPORTED); + return; + } + if (!allPossiblySupportedTargetLanguages.includes(defaultTargetLanguage)) { + // Detected language is not part of the supported source languages. + console.info("Default target language is not part of the supported target languages.", { + acceptedTargetLanguages, + defaultTargetLanguage, + allPossiblySupportedTargetLanguages, + }); + this.documentTranslationStateCommunicator.broadcastUpdatedTranslationStatus(BaseTranslationState_1.TranslationStatus.TRANSLATION_UNSUPPORTED); + return; + } + if (!defaultTargetLanguage || + !supportedTargetLanguagesGivenDefaultSourceLanguage.includes(defaultTargetLanguage)) { + // Combination of source and target languages unsupported + console.info("Combination of source and target languages unsupported.", { + acceptedTargetLanguages, + defaultTargetLanguage, + supportedTargetLanguagesGivenDefaultSourceLanguage, + }); + this.documentTranslationStateCommunicator.broadcastUpdatedTranslationStatus(BaseTranslationState_1.TranslationStatus.TRANSLATION_UNSUPPORTED); + return; + } + this.documentTranslationStateCommunicator.broadcastUpdatedTranslationStatus(BaseTranslationState_1.TranslationStatus.OFFER); + }); + } + doTranslation(from, to) { + return __awaiter(this, void 0, void 0, function* () { + // If a TranslationDocument already exists for this document, it should + // be used instead of creating a new one so that we can use the original + // content of the page for the new translation instead of the newly + // translated text. + const translationDocument = this.contentWindow.translationDocument || + new TranslationDocument_1.TranslationDocument(this.document); + console.info("Translating web page"); + this.documentTranslationStateCommunicator.broadcastUpdatedTranslationStatus(BaseTranslationState_1.TranslationStatus.TRANSLATING); + const domTranslator = new BergamotDomTranslator_1.BergamotDomTranslator(translationDocument, from, to); + this.contentWindow.translationDocument = translationDocument; + translationDocument.translatedFrom = from; + translationDocument.translatedTo = to; + translationDocument.translationError = false; + try { + console.info(`About to translate web page document (${translationDocument.translationRoots.length} translation items)`, { from, to }); + // TODO: Timeout here to be able to abort UI in case translation hangs + yield domTranslator.translate((frameTranslationProgress) => { + this.documentTranslationStateCommunicator.broadcastUpdatedFrameTranslationProgress(frameTranslationProgress); + }); + console.info(`Translation of web page document completed (translated ${translationDocument.translationRoots.filter(translationRoot => translationRoot.currentDisplayMode === "translation").length} out of ${translationDocument.translationRoots.length} translation items)`, { from, to }); + console.info("Translated web page"); + this.documentTranslationStateCommunicator.broadcastUpdatedTranslationStatus(BaseTranslationState_1.TranslationStatus.TRANSLATED); + } + catch (err) { + console.warn("Translation error occurred: ", err); + translationDocument.translationError = true; + this.documentTranslationStateCommunicator.broadcastUpdatedTranslationStatus(BaseTranslationState_1.TranslationStatus.ERROR); + } + finally { + // Communicate that errors occurred + // Positioned in finally-clause so that it gets communicated whether the + // translation attempt resulted in some translated content or not + domTranslator.errorsEncountered.forEach((error) => { + if (error.name === "BergamotTranslatorAPIModelLoadError") { + this.documentTranslationStateCommunicator.broadcastUpdatedAttributeValue("modelLoadErrorOccurred", true); + } + else if (error.name === "BergamotTranslatorAPIModelDownloadError") { + this.documentTranslationStateCommunicator.broadcastUpdatedAttributeValue("modelDownloadErrorOccurred", true); + } + else if (error.name === "BergamotTranslatorAPITranslationError") { + this.documentTranslationStateCommunicator.broadcastUpdatedAttributeValue("translationErrorOccurred", true); + } + else { + this.documentTranslationStateCommunicator.broadcastUpdatedAttributeValue("otherErrorOccurred", true); + } + }); + } + }); + } + getDocumentTranslationStatistics() { + return __awaiter(this, void 0, void 0, function* () { + const translationDocument = this.contentWindow.translationDocument || + new TranslationDocument_1.TranslationDocument(this.document); + const { translationRoots } = translationDocument; + const { translationRootsVisible, translationRootsVisibleInViewport, } = yield translationDocument.determineVisibilityOfTranslationRoots(); + const generateOriginalMarkupToTranslate = translationRoot => translationDocument.generateMarkupToTranslate(translationRoot); + const removeTags = originalString => { + const detaggedString = detagAndProject_1.detag(originalString); + return detaggedString.plainString; + }; + const texts = translationRoots + .map(generateOriginalMarkupToTranslate) + .map(removeTags); + const textsVisible = translationRootsVisible + .map(generateOriginalMarkupToTranslate) + .map(removeTags); + const textsVisibleInViewport = translationRootsVisibleInViewport + .map(generateOriginalMarkupToTranslate) + .map(removeTags); + const wordCount = texts.join(" ").split(" ").length; + const wordCountVisible = textsVisible.join(" ").split(" ").length; + const wordCountVisibleInViewport = textsVisibleInViewport + .join(" ") + .split(" ").length; + const translationRootsCount = translationRoots.length; + const simpleTranslationRootsCount = translationRoots.filter(translationRoot => translationRoot.isSimleTranslationRoot).length; + return { + translationRootsCount, + simpleTranslationRootsCount, + texts, + textsVisible, + textsVisibleInViewport, + wordCount, + wordCountVisible, + wordCountVisibleInViewport, + }; + }); + } +} +exports.DomTranslationManager = DomTranslationManager; + + +/***/ }), + +/***/ 992: +/*!**********************************************************************************************!*\ + !*** ./src/core/ts/content-scripts/dom-translation-content-script.js/TranslationDocument.ts ***! + \**********************************************************************************************/ +/***/ (function(__unused_webpack_module, exports, __webpack_require__) { + + +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ +var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { + function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } + return new (P || (P = Promise))(function (resolve, reject) { + function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } + function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } + function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } + step((generator = generator.apply(thisArg, _arguments || [])).next()); + }); +}; +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.generateMarkupToTranslateForItem = exports.TranslationDocument = void 0; +const getTranslationNodes_1 = __webpack_require__(/*! ./getTranslationNodes */ 5173); +const TranslationItem_1 = __webpack_require__(/*! ./TranslationItem */ 6771); +/** + * This class represents a document that is being translated, + * and it is responsible for parsing the document, + * generating the data structures translation (the list of + * translation items and roots), and managing the original + * and translated texts on the translation items. + * + * @param document The document to be translated + */ +class TranslationDocument { + constructor(document) { + this.translatedFrom = ""; + this.translatedTo = ""; + this.translationError = false; + this.originalShown = true; + this.qualityEstimationShown = true; + // Set temporarily to true during development to visually inspect which nodes have been processed and in which way + this.paintProcessedNodes = false; + this.nodeTranslationItemsMap = new Map(); + this.translationRoots = []; + this._init(document); + } + /** + * Initializes the object and populates + * the translation roots lists. + * + * @param document The document to be translated + */ + _init(document) { + // Get all the translation nodes in the document's body: + // a translation node is a node from the document which + // contains useful content for translation, and therefore + // must be included in the translation process. + const translationNodes = getTranslationNodes_1.getTranslationNodes(document.body); + console.info(`The document has a total of ${translationNodes.length} translation nodes, of which ${translationNodes.filter(tn => tn.isTranslationRoot).length} are translation roots`); + translationNodes.forEach((translationNode, index) => { + const { content, isTranslationRoot } = translationNode; + if (this.paintProcessedNodes) { + content.style.backgroundColor = "darkorange"; + } + // Create a TranslationItem object for this node. + // This function will also add it to the this.translationRoots array. + this._createItemForNode(content, index, isTranslationRoot); + }); + // At first all translation roots are stored in the translation roots list, and only after + // the process has finished we're able to determine which translation roots are + // simple, and which ones are not. + // A simple root is defined by a translation root with no children items, which + // basically represents an element from a page with only text content + // inside. + // This distinction is useful for optimization purposes: we treat a + // simple root as plain-text in the translation process and with that + // we are able to reduce their data payload sent to the translation service. + for (const translationRoot of this.translationRoots) { + if (!translationRoot.children.length && + translationRoot.nodeRef instanceof Element && + translationRoot.nodeRef.childElementCount === 0) { + translationRoot.isSimleTranslationRoot = true; + if (this.paintProcessedNodes) { + translationRoot.nodeRef.style.backgroundColor = "orange"; + } + } + } + } + /** + * Creates a TranslationItem object, which should be called + * for each node returned by getTranslationNodes. + * + * @param node The DOM node for this item. + * @param id A unique, numeric id for this item. + * @param isTranslationRoot A boolean saying whether this item is a translation root. + * + * @returns A TranslationItem object. + */ + _createItemForNode(node, id, isTranslationRoot) { + if (this.nodeTranslationItemsMap.has(node)) { + return this.nodeTranslationItemsMap.get(node); + } + const item = new TranslationItem_1.TranslationItem(node, id, isTranslationRoot); + if (isTranslationRoot) { + // Translation root items do not have a parent item. + this.translationRoots.push(item); + } + else { + // Other translation nodes have at least one ancestor which is a translation root + let ancestorTranslationItem; + for (let ancestor = node.parentNode; ancestor; ancestor = ancestor.parentNode) { + ancestorTranslationItem = this.nodeTranslationItemsMap.get(ancestor); + if (ancestorTranslationItem) { + ancestorTranslationItem.children.push(item); + break; + } + else { + // make intermediate ancestors link to the descendent translation item + // so that it gets picked up on in generateOriginalStructureElements + this.nodeTranslationItemsMap.set(ancestor, item); + } + } + } + this.nodeTranslationItemsMap.set(node, item); + return item; + } + /** + * Generate the markup that represents a TranslationItem object. + * Besides generating the markup, it also stores a fuller representation + * of the TranslationItem in the "original" field of the TranslationItem object, + * which needs to be stored for later to be used in the "Show Original" functionality. + * If this function had already been called for the given item (determined + * by the presence of the "original" array in the item), the markup will + * be regenerated from the "original" data instead of from the related + * DOM nodes (because the nodes might contain translated data). + * + * @param item A TranslationItem object + * + * @returns A markup representation of the TranslationItem. + */ + generateMarkupToTranslate(item) { + if (!item.original) { + item.original = this.generateOriginalStructureElements(item); + } + return regenerateMarkupToTranslateFromOriginal(item); + } + /** + * Generates a fuller representation of the TranslationItem + * @param item + */ + generateOriginalStructureElements(item) { + const original = []; + if (item.isSimleTranslationRoot) { + const text = item.nodeRef.firstChild.nodeValue.trim(); + original.push(text); + return original; + } + let wasLastItemPlaceholder = false; + for (const child of Array.from(item.nodeRef.childNodes)) { + if (child.nodeType === child.TEXT_NODE) { + const x = child.nodeValue; + const hasLeadingWhitespace = x.length !== x.trimStart().length; + const hasTrailingWhitespace = x.length !== x.trimEnd().length; + if (x.trim() !== "") { + const xWithNormalizedWhitespace = `${hasLeadingWhitespace ? " " : ""}${x.trim()}${hasTrailingWhitespace ? " " : ""}`; + original.push(xWithNormalizedWhitespace); + wasLastItemPlaceholder = false; + } + continue; + } + const objInMap = this.nodeTranslationItemsMap.get(child); + if (objInMap && !objInMap.isTranslationRoot) { + // If this childNode is present in the nodeTranslationItemsMap, it means + // it's a translation node: it has useful content for translation. + // In this case, we need to stringify this node. + // However, if this item is a translation root, we should skip it here in this + // object's child list (and just add a placeholder for it), because + // it will be stringified separately for being a translation root. + original.push(objInMap); + objInMap.original = this.generateOriginalStructureElements(objInMap); + wasLastItemPlaceholder = false; + } + else if (!wasLastItemPlaceholder) { + // Otherwise, if this node doesn't contain any useful content, + // or if it is a translation root itself, we can replace it with a placeholder node. + // We can't simply eliminate this node from our string representation + // because that could change the HTML structure (e.g., it would + // probably merge two separate text nodes). + // It's not necessary to add more than one placeholder in sequence; + // we can optimize them away. + original.push(new TranslationItem_1.TranslationItem_NodePlaceholder()); + wasLastItemPlaceholder = true; + } + } + return original; + } + /** + * Changes the document to display its translated + * content. + */ + showTranslation() { + this.originalShown = false; + this.qualityEstimationShown = false; + this._swapDocumentContent("translation"); + } + /** + * Changes the document to display its original + * content. + */ + showOriginal() { + this.originalShown = true; + this.qualityEstimationShown = false; + this._swapDocumentContent("original"); + // TranslationTelemetry.recordShowOriginalContent(); + } + /** + * Changes the document to display the translation with quality estimation metadata + * content. + */ + showQualityEstimation() { + this.originalShown = false; + this.qualityEstimationShown = true; + this._swapDocumentContent("qeAnnotatedTranslation"); + } + /** + * Swap the document with the resulting translation, + * or back with the original content. + */ + _swapDocumentContent(target) { + (() => __awaiter(this, void 0, void 0, function* () { + this.translationRoots + .filter(translationRoot => translationRoot.currentDisplayMode !== target) + .forEach(translationRoot => translationRoot.swapText(target, this.paintProcessedNodes)); + // TODO: Make sure that the above does not lock the main event loop + /* + // Let the event loop breath on every 100 nodes + // that are replaced. + const YIELD_INTERVAL = 100; + await Async.yieldingForEach( + this.roots, + root => root.swapText(target, this.paintProcessedNodes), + YIELD_INTERVAL + ); + */ + }))(); + } + determineVisibilityOfTranslationRoots() { + return __awaiter(this, void 0, void 0, function* () { + const { translationRoots } = this; + const elements = translationRoots.map(translationRoot => translationRoot.nodeRef); + const elementsVisibleInViewport = yield getElementsVisibleInViewport(elements); + const translationRootsVisible = []; + const translationRootsVisibleInViewport = []; + for (let i = 0; i < translationRoots.length; i++) { + const translationRoot = translationRoots[i]; + const visible = isElementVisible(translationRoot.nodeRef); + if (visible) { + translationRootsVisible.push(translationRoot); + } + const visibleInViewport = isElementVisibleInViewport(elementsVisibleInViewport, translationRoot.nodeRef); + if (visibleInViewport) { + translationRootsVisibleInViewport.push(translationRoot); + } + } + if (this.paintProcessedNodes) { + translationRootsVisible.forEach(translationRoot => { + translationRoot.nodeRef.style.color = "purple"; + }); + translationRootsVisibleInViewport.forEach(translationRoot => { + translationRoot.nodeRef.style.color = "maroon"; + }); + } + return { + translationRootsVisible, + translationRootsVisibleInViewport, + }; + }); + } +} +exports.TranslationDocument = TranslationDocument; +/** + * Generate the translation markup for a given item. + * + * @param item A TranslationItem object. + * @param content The inner content for this item. + * @returns string The outer HTML needed for translation + * of this item. + */ +function generateMarkupToTranslateForItem(item, content) { + const localName = item.isTranslationRoot ? "div" : "b"; + return ("<" + localName + " id=n" + item.id + ">" + content + ""); +} +exports.generateMarkupToTranslateForItem = generateMarkupToTranslateForItem; +/** + * Regenerate the markup that represents a TranslationItem object, + * with data from its "original" array. The array must have already + * been created by TranslationDocument.generateMarkupToTranslate(). + * + * @param item A TranslationItem object + * + * @returns A markup representation of the TranslationItem. + */ +function regenerateMarkupToTranslateFromOriginal(item) { + if (item.isSimleTranslationRoot) { + return item.original[0]; + } + let str = ""; + for (const child of item.original) { + if (child instanceof TranslationItem_1.TranslationItem) { + str += regenerateMarkupToTranslateFromOriginal(child); + } + else if (child instanceof TranslationItem_1.TranslationItem_NodePlaceholder) { + str += "
"; + } + else { + str += child; + } + } + return generateMarkupToTranslateForItem(item, str); +} +const isElementVisible = (el) => { + const rect = el.getBoundingClientRect(); + // Elements that are not visible will have a zero width/height bounding client rect + return rect.width > 0 && rect.height > 0; +}; +const isElementVisibleInViewport = (elementsVisibleInViewport, el) => { + return !!elementsVisibleInViewport.filter($el => $el === el).length; +}; +const getElementsVisibleInViewport = (elements) => __awaiter(void 0, void 0, void 0, function* () { + return new Promise(resolve => { + const options = { + threshold: 0.0, + }; + const callback = (entries, $observer) => { + // console.debug("InteractionObserver callback", entries.length, entries); + const elementsInViewport = entries + .filter(entry => entry.isIntersecting) + .map(entry => entry.target); + $observer.disconnect(); + resolve(elementsInViewport); + }; + const observer = new IntersectionObserver(callback, options); + elements.forEach(el => observer.observe(el)); + }); +}); + + +/***/ }), + +/***/ 6771: +/*!******************************************************************************************!*\ + !*** ./src/core/ts/content-scripts/dom-translation-content-script.js/TranslationItem.ts ***! + \******************************************************************************************/ +/***/ ((__unused_webpack_module, exports) => { + + +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.TranslationItem_NodePlaceholder = exports.TranslationItem = void 0; +/** + * This class represents an item for translation. It's basically our + * wrapper class around a node returned by getTranslationNode, with + * more data and structural information on it. + * + * At the end of the translation process, besides the properties below, + * a TranslationItem will contain two other properties: one called "original" + * and one called "translation". They are twin objects, one which reflect + * the structure of that node in its original state, and the other in its + * translated state. + * + * The "original" array is generated in the + * TranslationDocument.generateMarkupToTranslate function, + * and the "translation" array is generated when the translation results + * are parsed. + * + * They are both arrays, which contain a mix of strings and references to + * child TranslationItems. The references in both arrays point to the * same * + * TranslationItem object, but they might appear in different orders between the + * "original" and "translation" arrays. + * + * An example: + * + * English:
Welcome to Mozilla's website
+ * Portuguese:
Bem vindo a pagina da Mozilla
+ * + * TranslationItem n1 = { + * id: 1, + * original: ["Welcome to", ptr to n2, "website"] + * translation: ["Bem vindo a pagina", ptr to n2] + * } + * + * TranslationItem n2 = { + * id: 2, + * original: ["Mozilla's"], + * translation: ["da Mozilla"] + * } + */ +class TranslationItem { + constructor(node, id, isTranslationRoot) { + this.isTranslationRoot = false; + this.isSimleTranslationRoot = false; + this.children = []; + this.nodeRef = node; + this.id = id; + this.isTranslationRoot = isTranslationRoot; + } + toString() { + let rootType = ""; + if (this.isTranslationRoot) { + if (this.isSimleTranslationRoot) { + rootType = " (simple root)"; + } + else { + rootType = " (non simple root)"; + } + } + return ("[object TranslationItem: <" + + this.nodeRef.toString() + + ">" + + rootType + + "]"); + } + /** + * This function will parse the result of the translation of one translation + * item. If this item was a simple root, all we sent was a plain-text version + * of it, so the result is also straightforward text. + * + * For non-simple roots, we sent a simplified HTML representation of that + * node, and we'll first parse that into an HTML doc and then call the + * parseResultNode helper function to parse it. + * + * While parsing, the result is stored in the "translation" field of the + * TranslationItem, which will be used to display the final translation when + * all items are finished. It remains stored too to allow back-and-forth + * switching between the "Show Original" and "Show Translation" functions. + * + * @param translatedMarkup A string with the textual result received from the translation engine, + * which can be plain-text or a serialized HTML doc. + */ + parseTranslationResult(translatedMarkup) { + this.translatedMarkup = translatedMarkup; + if (this.isSimleTranslationRoot) { + // If translation contains HTML entities, we need to convert them. + // It is because simple roots expect a plain text result. + if (this.isSimleTranslationRoot && + translatedMarkup.match(/&([a-z0-9]+|#[0-9]{1,6}|#x[0-9a-f]{1,6});/gi)) { + const doc = new DOMParser().parseFromString(translatedMarkup, "text/html"); + translatedMarkup = doc.body.firstChild.nodeValue; + } + this.translation = [translatedMarkup]; + return; + } + const domParser = new DOMParser(); + const doc = domParser.parseFromString(translatedMarkup, "text/html"); + this.translation = []; + parseResultNode(this, doc.body.firstChild, "translation"); + } + /** + * Note: QE-annotated translation results are never plain text nodes, despite that + * the original translation item may be a simple translation root. + * This wreaks havoc. + * @param qeAnnotatedTranslatedMarkup + */ + parseQeAnnotatedTranslationResult(qeAnnotatedTranslatedMarkup) { + const domParser = new DOMParser(); + const doc = domParser.parseFromString(qeAnnotatedTranslatedMarkup, "text/html"); + this.qeAnnotatedTranslation = []; + parseResultNode(this, doc.body.firstChild, "qeAnnotatedTranslation"); + } + /** + * This function finds a child TranslationItem + * with the given id. + * @param id The id to look for, in the format "n#" + * @returns A TranslationItem with the given id, or null if + * it was not found. + */ + getChildById(id) { + for (const child of this.children) { + const childId = "n" + child.id; + if (childId === id) { + return child; + } + } + return null; + } + /** + * Swap the text of this TranslationItem between + * its original and translated states. + */ + swapText(target, paintProcessedNodes) { + swapTextForItem(this, target, paintProcessedNodes); + } +} +exports.TranslationItem = TranslationItem; +/** + * This object represents a placeholder item for translation. It's similar to + * the TranslationItem class, but it represents nodes that have no meaningful + * content for translation. These nodes will be replaced by "
" in a + * translation request. It's necessary to keep them to use it as a mark + * for correct positioning and splitting of text nodes. + */ +class TranslationItem_NodePlaceholder { + static toString() { + return "[object TranslationItem_NodePlaceholder]"; + } +} +exports.TranslationItem_NodePlaceholder = TranslationItem_NodePlaceholder; +/** + * Helper function to parse a HTML doc result. + * How it works: + * + * An example result string is: + * + *
Hello World of Mozilla.
+ * + * For an element node, we look at its id and find the corresponding + * TranslationItem that was associated with this node, and then we + * walk down it repeating the process. + * + * For text nodes we simply add it as a string. + */ +function parseResultNode(item, node, target) { + try { + const into = item[target]; + // @ts-ignore + for (const child of node.childNodes) { + if (child.nodeType === Node.TEXT_NODE) { + into.push(child.nodeValue); + } + else if (child.localName === "br") { + into.push(new TranslationItem_NodePlaceholder()); + } + else if (child.dataset && + typeof child.dataset.translationQeScore !== "undefined") { + // handle the special case of quality estimate annotated nodes + into.push(child); + } + else { + const translationRootChild = item.getChildById(child.id); + if (translationRootChild) { + into.push(translationRootChild); + translationRootChild[target] = []; + parseResultNode(translationRootChild, child, target); + } + else { + console.warn(`Result node's (belonging to translation item with id ${item.id}) child node (child.id: ${child.id}) lacks an associated translation root child`, { item, node, child }); + } + } + } + } + catch (err) { + console.error(err); + throw err; + } +} +/* eslint-disable complexity */ +// TODO: Simplify swapTextForItem to avoid the following eslint error: +// Function 'swapTextForItem' has a complexity of 35. Maximum allowed is 34 complexity +/** + * Helper function to swap the text of a TranslationItem + * between its original and translated states. + * How it works: + * + * The function iterates through the target array (either the `original` or + * `translation` array from the TranslationItem), while also keeping a pointer + * to a current position in the child nodes from the actual DOM node that we + * are modifying. This pointer is moved forward after each item of the array + * is translated. If, at any given time, the pointer doesn't match the expected + * node that was supposed to be seen, it means that the original and translated + * contents have a different ordering, and thus we need to adjust that. + * + * A full example of the reordering process, swapping from Original to + * Translation: + * + * Original (en):
I miss you
+ * + * Translation (fr):
Tu me manques
+ * + * Step 1: + * pointer points to firstChild of the DOM node, textnode "I " + * first item in item.translation is [object TranslationItem ] + * + * pointer does not match the expected element, . So let's move to the + * pointer position. + * + * Current state of the DOM: + *
youI miss
+ * + * Step 2: + * pointer moves forward to nextSibling, textnode "I " again. + * second item in item.translation is the string " me " + * + * pointer points to a text node, and we were expecting a text node. Match! + * just replace the text content. + * + * Current state of the DOM: + *
you me miss
+ * + * Step 3: + * pointer moves forward to nextSibling, miss + * third item in item.translation is [object TranslationItem ] + * + * pointer points to the expected node. Match! Nothing to do. + * + * Step 4: + * all items in this item.translation were transformed. The remaining + * text nodes are cleared to "", and domNode.normalize() removes them. + * + * Current state of the DOM: + *
you me miss
+ * + * Further steps: + * After that, the function will visit the child items (from the visitStack), + * and the text inside the and nodes will be swapped as well, + * yielding the final result: + * + *
Tu me manques
+ */ +function swapTextForItem(item, target, paintProcessedNodes) { + // visitStack is the stack of items that we still need to visit. + // Let's start the process by adding the translation root item. + const visitStack = [item]; + if (paintProcessedNodes) { + item.nodeRef.style.border = "1px solid maroon"; + } + while (visitStack.length) { + const curItem = visitStack.shift(); + if (paintProcessedNodes) { + item.nodeRef.style.border = "1px solid yellow"; + } + const domNode = curItem.nodeRef; + if (!domNode) { + // Skipping this item due to a missing node. + continue; + } + if (!curItem[target]) { + // Translation not found for this item. This could be due to + // the translation not yet being available from the translation engine + // For example, if a translation was broken in various + // chunks, and not all of them has completed, the items from that + // chunk will be missing its "translation" field. + if (paintProcessedNodes) { + curItem.nodeRef.style.border = "1px solid red"; + } + continue; + } + domNode.normalize(); + if (paintProcessedNodes) { + curItem.nodeRef.style.border = "1px solid green"; + } + // curNode points to the child nodes of the DOM node that we are + // modifying. During most of the process, while the target array is + // being iterated (in the for loop below), it should walk together with + // the array and be pointing to the correct node that needs to modified. + // If it's not pointing to it, that means some sort of node reordering + // will be necessary to produce the correct translation. + // Note that text nodes don't need to be reordered, as we can just replace + // the content of one text node with another. + // + // curNode starts in the firstChild... + let curNode = domNode.firstChild; + if (paintProcessedNodes && curNode instanceof HTMLElement) { + curNode.style.border = "1px solid blue"; + } + // ... actually, let's make curNode start at the first useful node (either + // a non-blank text node or something else). This is not strictly necessary, + // as the reordering algorithm would correctly handle this case. However, + // this better aligns the resulting translation with the DOM content of the + // page, avoiding cases that would need to be unnecessarily reordered. + // + // An example of how this helps: + // + // ---- Original:
Hello world.
+ // ^textnode 1 ^item 1 ^textnode 2 + // + // - Translation:
Hallo Welt.
+ // + // Transformation process without this optimization: + // 1 - start pointer at textnode 1 + // 2 - move item 1 to first position inside the
+ // + // Node now looks like:
Hello [ ][ world.]
+ // textnode 1^ ^textnode 2 + // + // 3 - replace textnode 1 with " Welt." + // 4 - clear remaining text nodes (in this case, textnode 2) + // + // Transformation process with this optimization: + // 1 - start pointer at item 1 + // 2 - item 1 is already in position + // 3 - replace textnode 2 with " Welt." + // + // which completely avoids any node reordering, and requires only one + // text change instead of two (while also leaving the page closer to + // its original state). + while (curNode && + curNode.nodeType === Node.TEXT_NODE && + curNode.nodeValue.trim() === "") { + curNode = curNode.nextSibling; + } + // Now let's walk through all items in the `target` array of the + // TranslationItem. This means either the TranslationItem.original or + // TranslationItem.translation array. + for (const targetItem of curItem[target]) { + if (targetItem instanceof TranslationItem) { + // If the array element is another TranslationItem object, let's + // add it to the stack to be visited. + visitStack.push(targetItem); + const targetNode = targetItem.nodeRef; + // If the node is not in the expected position, let's reorder + // it into position... + if (curNode !== targetNode && + // ...unless the page has reparented this node under a totally + // different node (or removed it). In this case, all bets are off + // on being able to do anything correctly, so it's better not to + // bring back the node to this parent. + // @ts-ignore + targetNode.parentNode === domNode) { + // We don't need to null-check curNode because insertBefore(..., null) + // does what we need in that case: reorder this node to the end + // of child nodes. + domNode.insertBefore(targetNode, curNode); + curNode = targetNode; + } + // Move pointer forward. Since we do not add empty text nodes to the + // list of translation items, we must skip them here too while + // traversing the DOM in order to get better alignment between the + // text nodes and the translation items. + if (curNode) { + curNode = getNextSiblingSkippingEmptyTextNodes(curNode); + } + } + else if (targetItem instanceof TranslationItem_NodePlaceholder) { + // If the current item is a placeholder node, we need to move + // our pointer "past" it, jumping from one side of a block of + // elements + empty text nodes to the other side. Even if + // non-placeholder elements exists inside the jumped block, + // they will be pulled correctly later in the process when the + // targetItem for those nodes are handled. + while (curNode && + (curNode.nodeType !== Node.TEXT_NODE || + curNode.nodeValue.trim() === "")) { + curNode = curNode.nextSibling; + } + } + else { + // Finally, if it's a text item, we just need to find the next + // text node to use. Text nodes don't need to be reordered, so + // the first one found can be used. + while (curNode && curNode.nodeType !== Node.TEXT_NODE) { + curNode = curNode.nextSibling; + } + // If none was found and we reached the end of the child nodes, + // let's create a new one. + if (!curNode) { + // We don't know if the original content had a space or not, + // so the best bet is to create the text node with " " which + // will add one space at the beginning and one at the end. + curNode = domNode.appendChild(domNode.ownerDocument.createTextNode(" ")); + } + if (target === "translation") { + // A trailing and a leading space must be preserved because + // they are meaningful in HTML. + const preSpace = /^\s/.test(curNode.nodeValue) ? " " : ""; + const endSpace = /\s$/.test(curNode.nodeValue) ? " " : ""; + curNode.nodeValue = preSpace + targetItem + endSpace; + } + else { + curNode.nodeValue = targetItem; + } + if (["original", "translation"].includes(target)) { + // Workaround necessary when switching "back" from QE display + // since quality estimated annotated nodes + // replaced the simple text nodes of the original document + // @ts-ignore + for (const child of curNode.parentNode.childNodes) { + if (child.dataset && + typeof child.dataset.translationQeScore !== "undefined") { + // There should be only 1 such node. Remove the curNode from the + // parent's children and replace the qe-annotated node with it to + // maintain the right order in original DOM tree of the document. + curNode.remove(); + child.parentNode.replaceChild(curNode, child); + } + } + curNode = getNextSiblingSkippingEmptyTextNodes(curNode); + } + else if (target === "qeAnnotatedTranslation") { + const nextSibling = getNextSiblingSkippingEmptyTextNodes(curNode); + // Replace the text node with the qe-annotated node to maintain the + // right order in original DOM tree of the document. + curNode.parentNode.replaceChild(targetItem, curNode); + curNode = nextSibling; + } + } + } + // The translated version of a node might have less text nodes than its + // original version. If that's the case, let's clear the remaining nodes. + if (curNode) { + clearRemainingNonEmptyTextNodesFromElement(curNode); + } + // And remove any garbage "" nodes left after clearing. + domNode.normalize(); + // Mark the translation item as displayed in the requested target + curItem.currentDisplayMode = target; + if (paintProcessedNodes) { + curItem.nodeRef.style.border = "2px solid green"; + } + } +} +/* eslint-enable complexity */ +function getNextSiblingSkippingEmptyTextNodes(startSibling) { + let item = startSibling.nextSibling; + while (item && + item.nodeType === Node.TEXT_NODE && + item.nodeValue.trim() === "") { + item = item.nextSibling; + } + return item; +} +function clearRemainingNonEmptyTextNodesFromElement(startSibling) { + let item = startSibling; + while (item) { + if (item.nodeType === Node.TEXT_NODE && item.nodeValue !== "") { + item.nodeValue = ""; + } + item = item.nextSibling; + } +} + + +/***/ }), + +/***/ 1435: +/*!************************************************************************************************************!*\ + !*** ./src/core/ts/content-scripts/dom-translation-content-script.js/dom-translators/BaseDomTranslator.ts ***! + \************************************************************************************************************/ +/***/ (function(__unused_webpack_module, exports, __webpack_require__) { + + +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ +var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { + function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } + return new (P || (P = Promise))(function (resolve, reject) { + function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } + function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } + function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } + step((generator = generator.apply(thisArg, _arguments || [])).next()); + }); +}; +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.BaseDomTranslator = exports.DomTranslatorError = void 0; +const MinimalDomTranslator_1 = __webpack_require__(/*! ./MinimalDomTranslator */ 1975); +class DomTranslatorError extends Error { + constructor() { + super(...arguments); + this.name = "DomTranslatorError"; + } +} +exports.DomTranslatorError = DomTranslatorError; +/** + * Base class for DOM translators that splits the document into several chunks + * respecting the data limits of the backing API. + */ +class BaseDomTranslator extends MinimalDomTranslator_1.MinimalDomTranslator { + /** + * @param translationDocument The TranslationDocument object that represents + * the webpage to be translated + * @param sourceLanguage The source language of the document + * @param targetLanguage The target language for the translation + * @param translationApiClient + * @param parseChunkResult + * @param translationApiLimits + * @param domTranslatorRequestFactory + */ + constructor(translationDocument, sourceLanguage, targetLanguage, translationApiClient, parseChunkResult, translationApiLimits, domTranslatorRequestFactory) { + super(translationDocument, sourceLanguage, targetLanguage); + this.translatedCharacterCount = 0; + this.errorsEncountered = []; + this.partialSuccess = false; + this.translationApiClient = translationApiClient; + this.parseChunkResult = parseChunkResult; + this.translationApiLimits = translationApiLimits; + this.domTranslatorRequestFactory = domTranslatorRequestFactory; + } + /** + * Performs the translation, splitting the document into several chunks + * respecting the data limits of the API. + * + * @returns {Promise} A promise that will resolve when the translation + * task is finished. + */ + translate(frameTranslationProgressCallback) { + return __awaiter(this, void 0, void 0, function* () { + const chunksBeingProcessed = []; + const { MAX_REQUESTS } = this.translationApiLimits; + const { translationRoots } = this.translationDocument; + const { translationRootsVisible, translationRootsVisibleInViewport, } = yield this.translationDocument.determineVisibilityOfTranslationRoots(); + this.translationRootsPickedUpForTranslation = []; + const progressOfIndividualTranslationRequests = new Map(); + // Split the document into various requests to be sent to the translation API + for (let currentRequestOrdinal = 0; currentRequestOrdinal < MAX_REQUESTS; currentRequestOrdinal++) { + // Determine the data for the next request. + const domTranslationChunk = this.generateNextDomTranslationChunk(translationRoots, translationRootsVisible, translationRootsVisibleInViewport); + // Break if there was nothing left to translate + if (domTranslationChunk.translationRoots.length === 0) { + break; + } + // Create a real request for the translation engine and add it to the pending requests list. + const translationRequestData = domTranslationChunk.translationRequestData; + const domTranslatorRequest = this.domTranslatorRequestFactory(translationRequestData, this.sourceLanguage, this.targetLanguage); + // Fire off the requests in parallel to existing requests + const chunkBeingProcessed = domTranslatorRequest.fireRequest(this.translationApiClient, (translationRequestProgress) => { + progressOfIndividualTranslationRequests.set(translationRequestProgress.requestId, translationRequestProgress); + frameTranslationProgressCallback({ + progressOfIndividualTranslationRequests, + }); + }); + chunksBeingProcessed.push(chunkBeingProcessed); + chunkBeingProcessed + .then((translationResponseData) => { + if (translationResponseData) { + this.chunkCompleted(translationResponseData, domTranslationChunk, domTranslatorRequest); + } + else { + throw new Error("The returned translationResponseData was false/empty"); + } + }) + .catch(err => { + this.errorsEncountered.push(err); + }); + console.info(`Fired off request with ${domTranslationChunk.translationRoots.length} translation roots to the translation backend`, { domTranslationChunk }); + if (domTranslationChunk.isLastChunk) { + break; + } + } + // Return early with a noop if there is nothing to translate + if (chunksBeingProcessed.length === 0) { + console.info("Found nothing to translate"); + return { characterCount: 0 }; + } + console.info(`Fired off ${chunksBeingProcessed.length} requests to the translation backend`); + // Wait for all requests to settle + yield Promise.allSettled(chunksBeingProcessed); + // Surface encountered errors + if (this.errorsEncountered.length) { + console.warn("Errors were encountered during translation", this.errorsEncountered); + } + // If at least one chunk was successful, the + // translation should be displayed, albeit incomplete. + // Otherwise, the "Error" state will appear. + if (!this.partialSuccess) { + throw new DomTranslatorError("No content was translated"); + } + return { + characterCount: this.translatedCharacterCount, + }; + }); + } + /** + * Function called when a request sent to the translation engine completed successfully. + * This function handles calling the function to parse the result and the + * function to resolve the promise returned by the public `translate()` + * method when there's no pending request left. + */ + chunkCompleted(translationResponseData, domTranslationChunk, domTranslatorRequest) { + if (this.parseChunkResult(translationResponseData, domTranslationChunk)) { + this.partialSuccess = true; + // Count the number of characters successfully translated. + this.translatedCharacterCount += domTranslatorRequest.characterCount; + // Show translated chunks as they arrive + console.info("Part of the web page document translated. Showing translations that have completed so far..."); + this.translationDocument.showTranslation(); + } + } + /** + * This function will determine what is the data to be used for + * the Nth request we are generating, based on the input params. + */ + generateNextDomTranslationChunk(translationRoots, translationRootsVisible, translationRootsVisibleInViewport) { + let currentDataSize = 0; + let currentChunks = 0; + const translationRequestData = { + markupsToTranslate: [], + }; + const chunkTranslationRoots = []; + const { MAX_REQUEST_DATA, MAX_REQUEST_TEXTS } = this.translationApiLimits; + let translationRootsToConsider; + // Don't consider translation roots that are already picked up for translation + const notYetPickedUp = ($translationRoots) => $translationRoots.filter(value => !this.translationRootsPickedUpForTranslation.includes(value)); + // Prioritize the translation roots visible in viewport + translationRootsToConsider = notYetPickedUp(translationRootsVisibleInViewport); + // Then prioritize the translation roots that are visible + if (translationRootsToConsider.length === 0) { + translationRootsToConsider = notYetPickedUp(translationRootsVisible); + } + // Then prioritize the remaining translation roots + if (translationRootsToConsider.length === 0) { + translationRootsToConsider = notYetPickedUp(translationRoots); + } + for (let i = 0; i < translationRootsToConsider.length; i++) { + const translationRoot = translationRootsToConsider[i]; + const markupToTranslate = this.translationDocument.generateMarkupToTranslate(translationRoot); + const newCurSize = currentDataSize + markupToTranslate.length; + const newChunks = currentChunks + 1; + if (newCurSize > MAX_REQUEST_DATA || newChunks > MAX_REQUEST_TEXTS) { + // If we've reached the API limits, let's stop accumulating data + // for this request and return. We return information useful for + // the caller to pass back on the next call, so that the function + // can keep working from where it stopped. + console.info("We have reached the specified translation API limits and will process remaining translation roots in a separate request", { + newCurSize, + newChunks, + translationApiLimits: this.translationApiLimits, + }); + return { + translationRequestData, + translationRoots: chunkTranslationRoots, + isLastChunk: false, + }; + } + currentDataSize = newCurSize; + currentChunks = newChunks; + chunkTranslationRoots.push(translationRoot); + this.translationRootsPickedUpForTranslation.push(translationRoot); + translationRequestData.markupsToTranslate.push(markupToTranslate); + } + const remainingTranslationRoots = notYetPickedUp(translationRoots); + const isLastChunk = remainingTranslationRoots.length === 0; + return { + translationRequestData, + translationRoots: chunkTranslationRoots, + isLastChunk, + }; + } +} +exports.BaseDomTranslator = BaseDomTranslator; + + +/***/ }), + +/***/ 1518: +/*!****************************************************************************************************************!*\ + !*** ./src/core/ts/content-scripts/dom-translation-content-script.js/dom-translators/BergamotDomTranslator.ts ***! + \****************************************************************************************************************/ +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + + +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.BergamotDomTranslator = exports.MAX_REQUESTS = exports.MAX_REQUEST_TEXTS = exports.MAX_REQUEST_DATA = void 0; +const ContentScriptBergamotApiClient_1 = __webpack_require__(/*! ../../../shared-resources/ContentScriptBergamotApiClient */ 449); +const TranslationDocument_1 = __webpack_require__(/*! ../TranslationDocument */ 992); +const BaseDomTranslator_1 = __webpack_require__(/*! ./BaseDomTranslator */ 1435); +const BergamotDomTranslatorRequest_1 = __webpack_require__(/*! ./BergamotDomTranslatorRequest */ 9943); +// The maximum amount of net data allowed per request on Bergamot's API. +exports.MAX_REQUEST_DATA = 500000; +// The maximum number of texts allowed to be translated in a single request. +exports.MAX_REQUEST_TEXTS = 100; +// Self-imposed limit of requests. This means that a page that would need +// to be broken in more than this amount of requests won't be fully translated. +exports.MAX_REQUESTS = 15; +/** + * Translates a webpage using Bergamot's Translation backend. + */ +class BergamotDomTranslator extends BaseDomTranslator_1.BaseDomTranslator { + /** + * @param translationDocument The TranslationDocument object that represents + * the webpage to be translated + * @param sourceLanguage The source language of the document + * @param targetLanguage The target language for the translation + */ + constructor(translationDocument, sourceLanguage, targetLanguage) { + super(translationDocument, sourceLanguage, targetLanguage, new ContentScriptBergamotApiClient_1.ContentScriptBergamotApiClient(), parseChunkResult, { MAX_REQUEST_DATA: exports.MAX_REQUEST_DATA, MAX_REQUEST_TEXTS: exports.MAX_REQUEST_TEXTS, MAX_REQUESTS: exports.MAX_REQUESTS }, (translationRequestData, $sourceLanguage, $targetLanguage) => new BergamotDomTranslatorRequest_1.BergamotDomTranslatorRequest(translationRequestData, $sourceLanguage, $targetLanguage)); + } +} +exports.BergamotDomTranslator = BergamotDomTranslator; +/** + * This function parses the result returned by Bergamot's Translation API for + * the translated text in the target language. + * + * @returns boolean True if parsing of this chunk was successful. + */ +function parseChunkResult(translationResponseData, domTranslationChunk) { + const len = translationResponseData.translatedMarkups.length; + if (len === 0) { + throw new Error("Translation response data has no translated strings"); + } + if (len !== domTranslationChunk.translationRoots.length) { + // This should never happen, but if the service returns a different number + // of items (from the number of items submitted), we can't use this chunk + // because all items would be paired incorrectly. + throw new Error("Translation response data has a different number of items (from the number of items submitted)"); + } + console.info(`Parsing translation chunk result with ${len} translation entries`); + let errorOccurred = false; + domTranslationChunk.translationRoots.forEach((translationRoot, index) => { + try { + const translatedMarkup = translationResponseData.translatedMarkups[index]; + translationRoot.parseTranslationResult(translatedMarkup); + if (translationResponseData.qeAnnotatedTranslatedMarkups) { + let qeAnnotatedTranslatedMarkup = translationResponseData.qeAnnotatedTranslatedMarkups[index]; + qeAnnotatedTranslatedMarkup = TranslationDocument_1.generateMarkupToTranslateForItem(translationRoot, qeAnnotatedTranslatedMarkup); + translationRoot.parseQeAnnotatedTranslationResult(qeAnnotatedTranslatedMarkup); + } + } + catch (e) { + errorOccurred = true; + console.error("Translation error: ", e); + } + }); + console.info(`Parsed translation chunk result with ${len} translation entries`, { errorOccurred }); + return !errorOccurred; +} + + +/***/ }), + +/***/ 9943: +/*!***********************************************************************************************************************!*\ + !*** ./src/core/ts/content-scripts/dom-translation-content-script.js/dom-translators/BergamotDomTranslatorRequest.ts ***! + \***********************************************************************************************************************/ +/***/ (function(__unused_webpack_module, exports, __webpack_require__) { + + +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ +var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { + function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } + return new (P || (P = Promise))(function (resolve, reject) { + function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } + function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } + function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } + step((generator = generator.apply(thisArg, _arguments || [])).next()); + }); +}; +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.BergamotDomTranslatorRequest = void 0; +const detagAndProject_1 = __webpack_require__(/*! ./detagAndProject */ 961); +/** + * Represents a request (for 1 chunk) sent off to Bergamot's translation backend. + * + * @params translationRequestData The data to be used for this translation. + * @param sourceLanguage The source language of the document. + * @param targetLanguage The target language for the translation. + * @param characterCount A counter for tracking the amount of characters translated. + * + */ +class BergamotDomTranslatorRequest { + constructor(translationRequestData, sourceLanguage, targetLanguage) { + this.translationRequestData = translationRequestData; + this.sourceLanguage = sourceLanguage; + this.targetLanguage = targetLanguage; + this.translationRequestData.markupsToTranslate.forEach(text => { + this.characterCount += text.length; + }); + } + /** + * Initiates the request + */ + fireRequest(bergamotApiClient, translationRequestProgressCallback) { + return __awaiter(this, void 0, void 0, function* () { + // The server can only deal with pure text, so we detag the strings to + // translate and later project the tags back into the result + const detaggedStrings = this.translationRequestData.markupsToTranslate.map(detagAndProject_1.detag); + const plainStringsToTranslate = detaggedStrings.map(detaggedString => detaggedString.plainString); + const results = yield bergamotApiClient.sendTranslationRequest(plainStringsToTranslate, this.sourceLanguage, this.targetLanguage, translationRequestProgressCallback); + return Object.assign(Object.assign({}, this.parseResults(results, detaggedStrings)), { plainStringsToTranslate }); + }); + } + parseResults(results, detaggedStrings) { + const len = results.translatedTexts.length; + if (len !== this.translationRequestData.markupsToTranslate.length) { + // This should never happen, but if the service returns a different number + // of items (from the number of items submitted), we can't use this chunk + // because all items would be paired incorrectly. + throw new Error("Translation backend returned a different number of results (from the number of strings to translate)"); + } + const translatedMarkups = []; + const translatedPlainTextStrings = []; + const qeAnnotatedTranslatedMarkups = results.qeAnnotatedTranslatedTexts; + // The 'text' field of results is a list of 'Paragraph'. Parse each 'Paragraph' entry + results.translatedTexts.forEach((translatedPlainTextString, index) => { + const detaggedString = detaggedStrings[index]; + // Work around issue with doubled periods returned at the end of the translated string + const originalEndedWithASinglePeriod = /([^\.])\.(\s+)?$/gm.exec(detaggedString.plainString); + const translationEndsWithTwoPeriods = /([^\.])\.\.(\s+)?$/gm.exec(translatedPlainTextString); + if (originalEndedWithASinglePeriod && translationEndsWithTwoPeriods) { + translatedPlainTextString = translatedPlainTextString.replace(/([^\.])\.\.(\s+)?$/gm, "$1.$2"); + } + let translatedMarkup; + // Use original rather than an empty or obviously invalid translation + // TODO: Address this upstream + if (["", "*", "* ()"].includes(translatedPlainTextString)) { + translatedMarkup = this.translationRequestData.markupsToTranslate[index]; + } + else { + // Project original tags/markup onto translated plain text string + // TODO: Use alignment info returned from the translation engine when it becomes available + translatedMarkup = detagAndProject_1.project(detaggedString, translatedPlainTextString); + } + translatedMarkups.push(translatedMarkup); + translatedPlainTextStrings.push(translatedPlainTextString); + }); + return { + translatedMarkups, + translatedPlainTextStrings, + qeAnnotatedTranslatedMarkups, + }; + } +} +exports.BergamotDomTranslatorRequest = BergamotDomTranslatorRequest; + + +/***/ }), + +/***/ 1975: +/*!***************************************************************************************************************!*\ + !*** ./src/core/ts/content-scripts/dom-translation-content-script.js/dom-translators/MinimalDomTranslator.ts ***! + \***************************************************************************************************************/ +/***/ (function(__unused_webpack_module, exports) { + + +var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { + function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } + return new (P || (P = Promise))(function (resolve, reject) { + function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } + function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } + function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } + step((generator = generator.apply(thisArg, _arguments || [])).next()); + }); +}; +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.MinimalDomTranslator = void 0; +class MinimalDomTranslator { + /** + * @param translationDocument The TranslationDocument object that represents + * the webpage to be translated + * @param sourceLanguage The source language of the document + * @param targetLanguage The target language for the translation + */ + constructor(translationDocument, sourceLanguage, targetLanguage) { + this.translationDocument = translationDocument; + this.sourceLanguage = sourceLanguage; + this.targetLanguage = targetLanguage; + } + translate(_translationProgressCallback) { + return __awaiter(this, void 0, void 0, function* () { + return { characterCount: -1 }; + }); + } +} +exports.MinimalDomTranslator = MinimalDomTranslator; + + +/***/ }), + +/***/ 961: +/*!**********************************************************************************************************!*\ + !*** ./src/core/ts/content-scripts/dom-translation-content-script.js/dom-translators/detagAndProject.ts ***! + \**********************************************************************************************************/ +/***/ ((__unused_webpack_module, exports) => { + + +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.project = exports.detag = void 0; +const isTagTokenWithImpliedWhitespace = (token) => { + return token.type === "tag" && token.tagName === "br"; +}; +const detag = (originalString) => { + // console.info("detag", { originalString }); + const originalStringDoc = new DOMParser().parseFromString(originalString, "text/html"); + // console.debug("originalStringDoc.body", originalStringDoc.body); + const tokens = serializeNodeIntoTokens(originalStringDoc.body); + // console.debug({ tokens }); + const plainString = tokens + .map(token => { + if (token.type === "tag") { + return isTagTokenWithImpliedWhitespace(token) ? " " : ""; + } + return token.textRepresentation; + }) + .join(""); + return { + originalString, + tokens, + plainString, + }; +}; +exports.detag = detag; +function serializeNodeIntoTokens(node) { + const tokens = []; + try { + // @ts-ignore + for (const child of node.childNodes) { + if (child.nodeType === Node.TEXT_NODE) { + const textChunk = child.nodeValue.trim(); + // If this is only whitespace, only add such a token and then visit the next node + if (textChunk === "") { + tokens.push({ + type: "whitespace", + textRepresentation: " ", + }); + continue; + } + // Otherwise, parse the text content and add whitespace + word tokens as necessary + const leadingSpace = /^\s+/.exec(child.nodeValue); + const trailingSpace = /\s+$/.exec(child.nodeValue); + if (leadingSpace !== null) { + tokens.push({ + type: "whitespace", + textRepresentation: leadingSpace[0], + }); + } + const words = textChunk.split(" "); + words.forEach((word, wordIndex) => { + // Don't add empty words + if (word !== "") { + tokens.push({ + type: "word", + textRepresentation: word, + }); + } + // Add whitespace tokens for spaces in between words, eg not after the last word + if (wordIndex !== words.length - 1) { + tokens.push({ + type: "whitespace", + textRepresentation: " ", + }); + } + }); + if (trailingSpace !== null) { + tokens.push({ + type: "whitespace", + textRepresentation: trailingSpace[0], + }); + } + } + else { + const startTagMatch = /^<[^>]*>/gm.exec(child.outerHTML); + const endTagMatch = /<\/[^>]*>$/gm.exec(child.outerHTML); + const tagName = child.tagName.toLowerCase(); + tokens.push({ + type: "tag", + tagName, + textRepresentation: startTagMatch[0], + }); + const childTokens = serializeNodeIntoTokens(child); + tokens.push(...childTokens); + if (endTagMatch) { + tokens.push({ + type: "tag", + tagName, + textRepresentation: endTagMatch[0], + }); + } + } + } + } + catch (err) { + console.error(err); + throw err; + } + return tokens; +} +const project = (detaggedString, translatedString) => { + // console.info("project", { detaggedString, translatedString }); + // Return the translated string as is if there were no tokens in the original string + if (detaggedString.tokens.filter(token => token.type === "tag").length === 0) { + return translatedString; + } + // If the last token is a tag, we pop it off the token array and re-add it + // last so that the last tag gets any additional translation content injected into it + const lastToken = detaggedString.tokens.slice(-1)[0]; + if (lastToken.type === "tag") { + detaggedString.tokens.pop(); + } + // Inject the tags naively in the translated string assuming a 1:1 + // relationship between original text nodes and words in the translated string + const translatedStringWords = translatedString.split(" "); + const remainingTranslatedStringWords = [...translatedStringWords]; + let whitespaceHaveBeenInjectedSinceTheLastWordWasInjected = true; + const projectedStringParts = detaggedString.tokens.map((token) => { + const determineProjectedStringPart = () => { + if (token.type === "word") { + const correspondingTranslatedWord = remainingTranslatedStringWords.shift(); + // If we have run out of translated words, don't attempt to add to the projected string + if (correspondingTranslatedWord === undefined) { + return ""; + } + // Otherwise, inject the translated word + // ... possibly with a space injected in case none has been injected since the last word + const $projectedStringPart = `${whitespaceHaveBeenInjectedSinceTheLastWordWasInjected ? "" : " "}${correspondingTranslatedWord}`; + whitespaceHaveBeenInjectedSinceTheLastWordWasInjected = false; + return $projectedStringPart; + } + else if (token.type === "whitespace") { + // Don't pad whitespace onto each other when there are no more words + if (remainingTranslatedStringWords.length === 0) { + return ""; + } + whitespaceHaveBeenInjectedSinceTheLastWordWasInjected = true; + return token.textRepresentation; + } + else if (token.type === "tag") { + if (isTagTokenWithImpliedWhitespace(token)) { + whitespaceHaveBeenInjectedSinceTheLastWordWasInjected = true; + } + return token.textRepresentation; + } + throw new Error(`Unexpected token type: ${token.type}`); + }; + const projectedStringPart = determineProjectedStringPart(); + return projectedStringPart; + }); + let projectedString = projectedStringParts.join(""); + // Add any remaining translated words to the end + if (remainingTranslatedStringWords.length) { + // Add a whitespace to the end first in case there was none, or else two words will be joined together + if (lastToken.type !== "whitespace") { + projectedString += " "; + } + projectedString += remainingTranslatedStringWords.join(" "); + } + // If the last token is a tag, see above + if (lastToken.type === "tag") { + projectedString += lastToken.textRepresentation; + } + // console.debug({translatedStringWords, projectedString}); + return projectedString; +}; +exports.project = project; + + +/***/ }), + +/***/ 5173: +/*!**********************************************************************************************!*\ + !*** ./src/core/ts/content-scripts/dom-translation-content-script.js/getTranslationNodes.ts ***! + \**********************************************************************************************/ +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + + +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.getTranslationNodes = void 0; +const hasTextForTranslation_1 = __webpack_require__(/*! ./hasTextForTranslation */ 4874); +const isBlockFrameOrSubclass = (element) => { + // TODO: Make this generalize like the corresponding C code invoked by: + /* + nsIFrame* frame = childElement->GetPrimaryFrame(); + frame->IsBlockFrameOrSubclass(); + */ + const nodeTagName = element.tagName.toLowerCase(); + const blockLevelElementTagNames = [ + "address", + "article", + "aside", + "blockquote", + "canvas", + "dd", + "div", + "dl", + "dt", + "fieldset", + "figcaption", + "figure", + "footer", + "form", + "h1", + "h2", + "h3", + "h4", + "h5", + "h6", + "header", + "hr", + "li", + "main", + "nav", + "noscript", + "ol", + "p", + "pre", + "section", + "table", + "tfoot", + "ul", + "video", + ]; + const result = (blockLevelElementTagNames.includes(nodeTagName) || + element.style.display === "block") && + element.style.display !== "inline"; + return result; +}; +const getTranslationNodes = (rootElement, seenTranslationNodes = [], limit = 15000) => { + const translationNodes = []; + // Query child elements in order to explicitly skip the root element from being classified as a translation node + const childElements = rootElement.children; + for (let i = 0; i < limit && i < childElements.length; i++) { + const childElement = childElements[i]; + const tagName = childElement.tagName.toLowerCase(); + const isTextNode = childElement.nodeType === Node.TEXT_NODE; + if (isTextNode) { + console.warn(`We are not supposed to run into text nodes here. childElement.textContent: "${childElement.textContent}"`); + continue; + } + // Skip elements that usually contain non-translatable text content. + if ([ + "script", + "iframe", + "frameset", + "frame", + "code", + "noscript", + "style", + "svg", + "math", + ].includes(tagName)) { + continue; + } + const nodeHasTextForTranslation = hasTextForTranslation_1.hasTextForTranslation(childElement.textContent); + // Only empty or non-translatable content in this part of the tree + if (!nodeHasTextForTranslation) { + continue; + } + // An element is a translation node if it contains + // at least one text node that has meaningful data + // for translation + const childChildTextNodes = Array.from(childElement.childNodes).filter((childChildNode) => childChildNode.nodeType === Node.TEXT_NODE); + const childChildTextNodesWithTextForTranslation = childChildTextNodes + .map(textNode => textNode.textContent) + .filter(hasTextForTranslation_1.hasTextForTranslation); + const isTranslationNode = !!childChildTextNodesWithTextForTranslation.length; + if (isTranslationNode) { + // At this point, we know we have a translation node at hand, but we need + // to figure out it the node is a translation root or not + let isTranslationRoot; + // Block elements are translation roots + isTranslationRoot = isBlockFrameOrSubclass(childElement); + // If an element is not a block element, it still + // can be considered a translation root if all ancestors + // of this element are not translation nodes + seenTranslationNodes.push(childElement); + if (!isTranslationRoot) { + // Walk up tree and check if an ancestor was a translation node + let ancestorWasATranslationNode = false; + for (let ancestor = childElement.parentNode; ancestor; ancestor = ancestor.parentNode) { + if (seenTranslationNodes.includes(ancestor)) { + ancestorWasATranslationNode = true; + break; + } + } + isTranslationRoot = !ancestorWasATranslationNode; + } + const translationNode = { + content: childElement, + isTranslationRoot, + }; + translationNodes.push(translationNode); + } + // Now traverse any element children to find nested translation nodes + if (childElement.firstElementChild) { + const childTranslationNodes = exports.getTranslationNodes(childElement, seenTranslationNodes, limit - translationNodes.length); + translationNodes.push(...childTranslationNodes); + } + } + return translationNodes; +}; +exports.getTranslationNodes = getTranslationNodes; + + +/***/ }), + +/***/ 4874: +/*!************************************************************************************************!*\ + !*** ./src/core/ts/content-scripts/dom-translation-content-script.js/hasTextForTranslation.ts ***! + \************************************************************************************************/ +/***/ ((__unused_webpack_module, exports) => { + + +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.hasTextForTranslation = void 0; +const hasTextForTranslation = text => { + const trimmed = text.trim(); + if (trimmed === "") { + return false; + } + /* tslint:disable:no-empty-character-class */ + // https://github.com/buzinas/tslint-eslint-rules/issues/289 + return /\p{L}/gu.test(trimmed); +}; +exports.hasTextForTranslation = hasTextForTranslation; + + +/***/ }), + +/***/ 5543: +/*!********************************************************************************!*\ + !*** ./src/core/ts/content-scripts/dom-translation-content-script.js/index.ts ***! + \********************************************************************************/ +/***/ (function(__unused_webpack_module, exports, __webpack_require__) { + + +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ +var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { + function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } + return new (P || (P = Promise))(function (resolve, reject) { + function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } + function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } + function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } + step((generator = generator.apply(thisArg, _arguments || [])).next()); + }); +}; +Object.defineProperty(exports, "__esModule", ({ value: true })); +const mobx_keystone_1 = __webpack_require__(/*! mobx-keystone */ 7680); +const DomTranslationManager_1 = __webpack_require__(/*! ./DomTranslationManager */ 9023); +const subscribeToExtensionState_1 = __webpack_require__(/*! ../../shared-resources/state-management/subscribeToExtensionState */ 6523); +const DocumentTranslationStateCommunicator_1 = __webpack_require__(/*! ../../shared-resources/state-management/DocumentTranslationStateCommunicator */ 2187); +const ContentScriptFrameInfo_1 = __webpack_require__(/*! ../../shared-resources/ContentScriptFrameInfo */ 9181); +const ExtensionState_1 = __webpack_require__(/*! ../../shared-resources/models/ExtensionState */ 65); +const BaseTranslationState_1 = __webpack_require__(/*! ../../shared-resources/models/BaseTranslationState */ 4779); +const TranslateOwnTextTranslationState_1 = __webpack_require__(/*! ../../shared-resources/models/TranslateOwnTextTranslationState */ 8238); +const DocumentTranslationState_1 = __webpack_require__(/*! ../../shared-resources/models/DocumentTranslationState */ 5482); +// Workaround for https://github.com/xaviergonz/mobx-keystone/issues/183 +// We need to import some models explicitly lest they fail to be registered by mobx +new ExtensionState_1.ExtensionState({}); +new TranslateOwnTextTranslationState_1.TranslateOwnTextTranslationState({}); +/** + * Note this content script runs at "document_idle" ie after the DOM is complete + */ +const init = () => __awaiter(void 0, void 0, void 0, function* () { + /* + await initErrorReportingInContentScript( + "port-from-dom-translation-content-script:index", + ); + */ + const contentScriptFrameInfo = new ContentScriptFrameInfo_1.ContentScriptFrameInfo(); + // Get window, tab and frame id + const frameInfo = yield contentScriptFrameInfo.getCurrentFrameInfo(); + const tabFrameReference = `${frameInfo.tabId}-${frameInfo.frameId}`; + const extensionState = yield subscribeToExtensionState_1.subscribeToExtensionState(); + const documentTranslationStateCommunicator = new DocumentTranslationStateCommunicator_1.DocumentTranslationStateCommunicator(frameInfo, extensionState); + const domTranslationManager = new DomTranslationManager_1.DomTranslationManager(documentTranslationStateCommunicator, document, window); + const documentTranslationStatistics = yield domTranslationManager.getDocumentTranslationStatistics(); + console.log({ documentTranslationStatistics }); + // TODO: Prevent multiple translations from occurring simultaneously + enable cancellations of existing translation jobs + // Any subsequent actions are determined by document translation state changes + mobx_keystone_1.onSnapshot(extensionState.$.documentTranslationStates, (documentTranslationStates, previousDocumentTranslationStates) => __awaiter(void 0, void 0, void 0, function* () { + // console.debug("dom-translation-content-script.js - documentTranslationStates snapshot HAS CHANGED", {documentTranslationStates}); + var _a, _b; + const currentTabFrameDocumentTranslationState = documentTranslationStates[tabFrameReference]; + const previousTabFrameDocumentTranslationState = previousDocumentTranslationStates[tabFrameReference]; + // console.log({ currentTabFrameDocumentTranslationState }); + // TODO: Possibly react to no current state in some other way + if (!currentTabFrameDocumentTranslationState) { + return; + } + const hasChanged = property => { + return (!previousTabFrameDocumentTranslationState || + currentTabFrameDocumentTranslationState[property] !== + previousTabFrameDocumentTranslationState[property]); + }; + if (hasChanged("translationRequested")) { + if (currentTabFrameDocumentTranslationState.translationRequested) { + /* TODO: Do not translate if already translated + if ( + domTranslationManager?.contentWindow?.translationDocument && + currentTabFrameDocumentTranslationState.translateFrom !== + domTranslationManager.contentWindow.translationDocument.sourceLanguage + ) { + */ + const translationPromise = domTranslationManager.doTranslation(currentTabFrameDocumentTranslationState.translateFrom, currentTabFrameDocumentTranslationState.translateTo); + extensionState.patchDocumentTranslationStateByFrameInfo(frameInfo, [ + { + op: "replace", + path: ["translationRequested"], + value: false, + }, + ]); + yield translationPromise; + } + } + if (hasChanged("translationStatus")) { + if (currentTabFrameDocumentTranslationState.translationStatus === + BaseTranslationState_1.TranslationStatus.UNKNOWN) { + yield domTranslationManager.attemptToDetectLanguage(); + } + if (currentTabFrameDocumentTranslationState.translationStatus === + BaseTranslationState_1.TranslationStatus.TRANSLATING) { + if (currentTabFrameDocumentTranslationState.cancellationRequested) { + console.debug("Cancellation requested"); + console.debug("TODO: Implement"); + } + } + } + if ((_a = domTranslationManager === null || domTranslationManager === void 0 ? void 0 : domTranslationManager.contentWindow) === null || _a === void 0 ? void 0 : _a.translationDocument) { + const translationDocument = (_b = domTranslationManager === null || domTranslationManager === void 0 ? void 0 : domTranslationManager.contentWindow) === null || _b === void 0 ? void 0 : _b.translationDocument; + if (hasChanged("showOriginal")) { + if (currentTabFrameDocumentTranslationState.showOriginal !== + translationDocument.originalShown) { + if (translationDocument.originalShown) { + translationDocument.showTranslation(); + } + else { + translationDocument.showOriginal(); + } + } + } + if (hasChanged("displayQualityEstimation")) { + if (currentTabFrameDocumentTranslationState.displayQualityEstimation !== + translationDocument.qualityEstimationShown) { + if (translationDocument.qualityEstimationShown) { + translationDocument.showTranslation(); + } + else { + translationDocument.showQualityEstimation(); + } + } + } + } + })); + // Add an initial document translation state + try { + extensionState.setDocumentTranslationState(new DocumentTranslationState_1.DocumentTranslationState(Object.assign(Object.assign({}, frameInfo), { translationStatus: BaseTranslationState_1.TranslationStatus.UNKNOWN, url: window.location.href, wordCount: documentTranslationStatistics.wordCount, wordCountVisible: documentTranslationStatistics.wordCountVisible, wordCountVisibleInViewport: documentTranslationStatistics.wordCountVisibleInViewport }))); + // Schedule removal of this document translation state when the document is closed + const onBeforeunloadEventListener = function (e) { + extensionState.deleteDocumentTranslationStateByFrameInfo(frameInfo); + // the absence of a returnValue property on the event will guarantee the browser unload happens + delete e.returnValue; + // balanced-listeners + window.removeEventListener("beforeunload", onBeforeunloadEventListener); + }; + window.addEventListener("beforeunload", onBeforeunloadEventListener); + } + catch (err) { + console.error("Instantiate DocumentTranslationState error", err); + } +}); +// noinspection JSIgnoredPromiseFromCall +init(); + + +/***/ }), + +/***/ 449: +/*!************************************************************************!*\ + !*** ./src/core/ts/shared-resources/ContentScriptBergamotApiClient.ts ***! + \************************************************************************/ +/***/ (function(__unused_webpack_module, exports, __webpack_require__) { + + +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ +var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { + function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } + return new (P || (P = Promise))(function (resolve, reject) { + function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } + function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } + function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } + step((generator = generator.apply(thisArg, _arguments || [])).next()); + }); +}; +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.ContentScriptBergamotApiClient = void 0; +const webextension_polyfill_ts_1 = __webpack_require__(/*! webextension-polyfill-ts */ 3624); +const nanoid_1 = __webpack_require__(/*! nanoid */ 350); +const ErrorReporting_1 = __webpack_require__(/*! ./ErrorReporting */ 3345); +class ContentScriptBergamotApiClient { + constructor() { + // console.debug("ContentScriptBergamotApiClient: Connecting to the background script"); + this.backgroundContextPort = webextension_polyfill_ts_1.browser.runtime.connect(webextension_polyfill_ts_1.browser.runtime.id, { + name: "port-from-content-script-bergamot-api-client", + }); + } + sendTranslationRequest(texts, from, to, translationRequestProgressCallback) { + return __awaiter(this, void 0, void 0, function* () { + return new Promise((resolve, reject) => { + const requestId = nanoid_1.nanoid(); + const resultsMessageListener = (m) => __awaiter(this, void 0, void 0, function* () { + if (m.translationRequestUpdate) { + const { translationRequestUpdate } = m; + if (translationRequestUpdate.requestId !== requestId) { + return; + } + // console.debug("ContentScriptBergamotApiClient received translationRequestUpdate", { translationRequestUpdate }); + const { results, translationRequestProgress, error, } = translationRequestUpdate; + if (translationRequestProgress) { + translationRequestProgressCallback(translationRequestProgress); + return; + } + if (results) { + this.backgroundContextPort.onMessage.removeListener(resultsMessageListener); + resolve(translationRequestUpdate.results); + return; + } + if (error) { + this.backgroundContextPort.onMessage.removeListener(resultsMessageListener); + reject(error); + return; + } + } + ErrorReporting_1.captureExceptionWithExtras(new Error("Unexpected message structure"), { + m, + }); + console.error("Unexpected message structure", { m }); + reject({ m }); + }); + this.backgroundContextPort.onMessage.addListener(resultsMessageListener); + // console.debug("ContentScriptBergamotApiClient: Sending translation request", {texts}); + this.backgroundContextPort.postMessage({ + texts, + from, + to, + requestId, + }); + }); + }); + } +} +exports.ContentScriptBergamotApiClient = ContentScriptBergamotApiClient; + + +/***/ }), + +/***/ 9181: +/*!****************************************************************!*\ + !*** ./src/core/ts/shared-resources/ContentScriptFrameInfo.ts ***! + \****************************************************************/ +/***/ (function(__unused_webpack_module, exports, __webpack_require__) { + + +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ +var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { + function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } + return new (P || (P = Promise))(function (resolve, reject) { + function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } + function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } + function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } + step((generator = generator.apply(thisArg, _arguments || [])).next()); + }); +}; +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.ContentScriptFrameInfo = void 0; +const webextension_polyfill_ts_1 = __webpack_require__(/*! webextension-polyfill-ts */ 3624); +const ErrorReporting_1 = __webpack_require__(/*! ./ErrorReporting */ 3345); +const nanoid_1 = __webpack_require__(/*! nanoid */ 350); +class ContentScriptFrameInfo { + constructor() { + // console.debug("ContentScriptFrameInfo: Connecting to the background script"); + this.backgroundContextPort = webextension_polyfill_ts_1.browser.runtime.connect(webextension_polyfill_ts_1.browser.runtime.id, { + name: "port-from-content-script-frame-info", + }); + } + getCurrentFrameInfo() { + return __awaiter(this, void 0, void 0, function* () { + return new Promise((resolve, reject) => { + const requestId = nanoid_1.nanoid(); + const resultsMessageListener = (m) => __awaiter(this, void 0, void 0, function* () { + if (m.frameInfo) { + const { frameInfo } = m; + if (m.requestId !== requestId) { + return; + } + // console.debug("ContentScriptFrameInfo received results", {frameInfo}); + this.backgroundContextPort.onMessage.removeListener(resultsMessageListener); + resolve(frameInfo); + return; + } + ErrorReporting_1.captureExceptionWithExtras(new Error("Unexpected message"), { m }); + console.error("Unexpected message", { m }); + reject({ m }); + }); + this.backgroundContextPort.onMessage.addListener(resultsMessageListener); + this.backgroundContextPort.postMessage({ + requestId, + }); + }); + }); + } +} +exports.ContentScriptFrameInfo = ContentScriptFrameInfo; + + +/***/ }), + +/***/ 6336: +/*!****************************************************************************!*\ + !*** ./src/core/ts/shared-resources/ContentScriptLanguageDetectorProxy.ts ***! + \****************************************************************************/ +/***/ (function(__unused_webpack_module, exports, __webpack_require__) { + + +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ +var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { + function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } + return new (P || (P = Promise))(function (resolve, reject) { + function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } + function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } + function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } + step((generator = generator.apply(thisArg, _arguments || [])).next()); + }); +}; +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.ContentScriptLanguageDetectorProxy = void 0; +const webextension_polyfill_ts_1 = __webpack_require__(/*! webextension-polyfill-ts */ 3624); +const ErrorReporting_1 = __webpack_require__(/*! ./ErrorReporting */ 3345); +const nanoid_1 = __webpack_require__(/*! nanoid */ 350); +class ContentScriptLanguageDetectorProxy { + constructor() { + // console.debug("ContentScriptLanguageDetectorProxy: Connecting to the background script"); + this.backgroundContextPort = webextension_polyfill_ts_1.browser.runtime.connect(webextension_polyfill_ts_1.browser.runtime.id, { + name: "port-from-content-script-language-detector-proxy", + }); + } + detectLanguage(str) { + return __awaiter(this, void 0, void 0, function* () { + return new Promise((resolve, reject) => { + const requestId = nanoid_1.nanoid(); + const resultsMessageListener = (m) => __awaiter(this, void 0, void 0, function* () { + if (m.languageDetectorResults) { + const { languageDetectorResults } = m; + if (languageDetectorResults.requestId !== requestId) { + return; + } + // console.debug("ContentScriptLanguageDetectorProxy received language detector results", {languageDetectorResults}); + this.backgroundContextPort.onMessage.removeListener(resultsMessageListener); + resolve(languageDetectorResults.results); + return; + } + ErrorReporting_1.captureExceptionWithExtras(new Error("Unexpected message"), { m }); + console.error("Unexpected message", { m }); + reject({ m }); + }); + this.backgroundContextPort.onMessage.addListener(resultsMessageListener); + // console.debug("Attempting detectLanguage via content script proxy", {str}); + this.backgroundContextPort.postMessage({ + str, + requestId, + }); + }); + }); + } +} +exports.ContentScriptLanguageDetectorProxy = ContentScriptLanguageDetectorProxy; + + +/***/ }), + +/***/ 2187: +/*!***********************************************************************************************!*\ + !*** ./src/core/ts/shared-resources/state-management/DocumentTranslationStateCommunicator.ts ***! + \***********************************************************************************************/ +/***/ ((__unused_webpack_module, exports) => { + + +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.DocumentTranslationStateCommunicator = void 0; +/** + * Helper class to communicate updated document translation states. + * + * State patching code is wrapped in setTimeout to prevent + * automatic (by mobx) batching of updates which leads to much less frequent + * state updates communicated to subscribers. No state updates during a translation + * session is not useful since we want to communicate the translation progress) + */ +class DocumentTranslationStateCommunicator { + constructor(frameInfo, extensionState) { + this.frameInfo = frameInfo; + this.extensionState = extensionState; + } + patchDocumentTranslationState(patches) { + setTimeout(() => { + this.extensionState.patchDocumentTranslationStateByFrameInfo(this.frameInfo, patches); + }, 0); + } + broadcastUpdatedAttributeValue(attribute, value) { + this.patchDocumentTranslationState([ + { + op: "replace", + path: [attribute], + value, + }, + ]); + } + broadcastUpdatedTranslationStatus(translationStatus) { + this.broadcastUpdatedAttributeValue("translationStatus", translationStatus); + } + /** + * This method was chosen as the place to sum up the progress of individual translation + * requests into the similar translation progress attributes present at the frame level + * in document translation state objects (totalTranslationWallTimeMs, totalTranslationEngineRequestCount etc). + * + * Another natural place to do this conversion would be as computed properties in the mobx models + * but it proved problematic to maintain/patch/sync map attributes (such as progressOfIndividualTranslationRequests) + * in document translation state objects, so reduction to simpler attributes is done here instead. + * + * @param frameTranslationProgress + */ + broadcastUpdatedFrameTranslationProgress(frameTranslationProgress) { + const { progressOfIndividualTranslationRequests, } = frameTranslationProgress; + const translationRequestProgressEntries = Array.from(progressOfIndividualTranslationRequests).map(([, translationRequestProgress]) => translationRequestProgress); + const translationInitiationTimestamps = translationRequestProgressEntries.map((trp) => trp.initiationTimestamp); + const translationInitiationTimestamp = Math.min(...translationInitiationTimestamps); + const totalModelLoadWallTimeMs = translationRequestProgressEntries + .map((trp) => trp.modelLoadWallTimeMs || 0) + .reduce((a, b) => a + b, 0); + const totalTranslationWallTimeMs = translationRequestProgressEntries + .map((trp) => trp.translationWallTimeMs || 0) + .reduce((a, b) => a + b, 0); + const totalTranslationEngineRequestCount = translationRequestProgressEntries.length; + const queuedTranslationEngineRequestCount = translationRequestProgressEntries.filter((trp) => trp.queued).length; + // Merge translation-progress-related booleans + const modelLoadNecessary = !!translationRequestProgressEntries.filter((trp) => trp.modelLoadNecessary).length; + const modelDownloadNecessary = !!translationRequestProgressEntries.filter((trp) => trp.modelDownloadNecessary).length; + const modelDownloading = !!translationRequestProgressEntries.filter((trp) => trp.modelDownloading).length; + const modelLoading = modelLoadNecessary + ? !!translationRequestProgressEntries.find((trp) => trp.modelLoading) + : undefined; + const modelLoaded = modelLoadNecessary + ? !!translationRequestProgressEntries + .filter((trp) => trp.modelLoadNecessary) + .find((trp) => trp.modelLoaded) + : undefined; + const translationFinished = translationRequestProgressEntries.filter((trp) => !trp.translationFinished).length === 0; + // Merge model download progress + const emptyDownloadProgress = { + bytesDownloaded: 0, + bytesToDownload: 0, + startTs: undefined, + durationMs: 0, + endTs: undefined, + }; + const modelDownloadProgress = translationRequestProgressEntries + .map((trp) => trp.modelDownloadProgress) + .filter((mdp) => mdp) + .reduce((a, b) => { + const startTs = a.startTs && a.startTs <= b.startTs ? a.startTs : b.startTs; + const endTs = a.endTs && a.endTs >= b.endTs ? a.endTs : b.endTs; + return { + bytesDownloaded: a.bytesDownloaded + b.bytesDownloaded, + bytesToDownload: a.bytesToDownload + b.bytesToDownload, + startTs, + durationMs: endTs ? endTs - startTs : Date.now() - startTs, + endTs, + }; + }, emptyDownloadProgress); + this.patchDocumentTranslationState([ + { + op: "replace", + path: ["translationInitiationTimestamp"], + value: translationInitiationTimestamp, + }, + { + op: "replace", + path: ["totalModelLoadWallTimeMs"], + value: totalModelLoadWallTimeMs, + }, + { + op: "replace", + path: ["modelDownloadNecessary"], + value: modelDownloadNecessary, + }, + { + op: "replace", + path: ["modelDownloading"], + value: modelDownloading, + }, + { + op: "replace", + path: ["modelDownloadProgress"], + value: modelDownloadProgress, + }, + { + op: "replace", + path: ["totalTranslationWallTimeMs"], + value: totalTranslationWallTimeMs, + }, + { + op: "replace", + path: ["totalTranslationEngineRequestCount"], + value: totalTranslationEngineRequestCount, + }, + { + op: "replace", + path: ["queuedTranslationEngineRequestCount"], + value: queuedTranslationEngineRequestCount, + }, + { + op: "replace", + path: ["modelLoadNecessary"], + value: modelLoadNecessary, + }, + { + op: "replace", + path: ["modelLoading"], + value: modelLoading, + }, + { + op: "replace", + path: ["modelLoaded"], + value: modelLoaded, + }, + { + op: "replace", + path: ["translationFinished"], + value: translationFinished, + }, + ]); + } + clear() { + setTimeout(() => { + this.extensionState.deleteDocumentTranslationStateByFrameInfo(this.frameInfo); + }, 0); + } + updatedDetectedLanguageResults(detectedLanguageResults) { + this.broadcastUpdatedAttributeValue("detectedLanguageResults", detectedLanguageResults); + } +} +exports.DocumentTranslationStateCommunicator = DocumentTranslationStateCommunicator; + + +/***/ }), + +/***/ 6523: +/*!************************************************************************************!*\ + !*** ./src/core/ts/shared-resources/state-management/subscribeToExtensionState.ts ***! + \************************************************************************************/ +/***/ (function(__unused_webpack_module, exports, __webpack_require__) { + + +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ +var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { + function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } + return new (P || (P = Promise))(function (resolve, reject) { + function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } + function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } + function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } + step((generator = generator.apply(thisArg, _arguments || [])).next()); + }); +}; +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.subscribeToExtensionState = void 0; +const mobx_keystone_1 = __webpack_require__(/*! mobx-keystone */ 7680); +const webextension_polyfill_ts_1 = __webpack_require__(/*! webextension-polyfill-ts */ 3624); +const ErrorReporting_1 = __webpack_require__(/*! ../ErrorReporting */ 3345); +const nanoid_1 = __webpack_require__(/*! nanoid */ 350); +// disable runtime data checking (we rely on TypeScript at compile time so that our model definitions can be cleaner) +mobx_keystone_1.setGlobalConfig({ + modelAutoTypeChecking: mobx_keystone_1.ModelAutoTypeCheckingMode.AlwaysOff, +}); +class MobxKeystoneProxy { + constructor(msgListeners) { + this.msgListeners = []; + this.msgListeners = msgListeners; + // console.debug("MobxKeystoneProxy: Connecting to the background script"); + this.backgroundContextPort = webextension_polyfill_ts_1.browser.runtime.connect(webextension_polyfill_ts_1.browser.runtime.id, { + name: "port-from-mobx-keystone-proxy", + }); + // listen to updates from host + const actionCallResultsMessageListener = (m) => __awaiter(this, void 0, void 0, function* () { + if (m.serializedActionCallToReplicate) { + const { serializedActionCallToReplicate } = m; + // console.log("MobxKeystoneProxy received applyActionResult", {serializedActionCallToReplicate}); + this.msgListeners.forEach(listener => listener(serializedActionCallToReplicate)); + return; + } + if (m.initialState) { + // handled in another listener, do nothing here + return; + } + ErrorReporting_1.captureExceptionWithExtras(new Error("Unexpected message"), { m }); + console.error("Unexpected message", { m }); + }); + this.backgroundContextPort.onMessage.addListener(actionCallResultsMessageListener); + } + requestInitialState() { + return __awaiter(this, void 0, void 0, function* () { + return new Promise((resolve, reject) => { + const requestId = nanoid_1.nanoid(); + const resultsMessageListener = (m) => __awaiter(this, void 0, void 0, function* () { + if (m.initialState) { + const { initialState } = m; + if (m.requestId !== requestId) { + return; + } + // console.debug("MobxKeystoneProxy received initialState", {initialState}); + this.backgroundContextPort.onMessage.removeListener(resultsMessageListener); + resolve(initialState); + return; + } + if (m.serializedActionCallToReplicate) { + // handled in another listener, do nothing here + return; + } + ErrorReporting_1.captureExceptionWithExtras(new Error("Unexpected message"), { m }); + console.error("Unexpected message", { m }); + reject({ m }); + }); + this.backgroundContextPort.onMessage.addListener(resultsMessageListener); + // console.debug("requestInitialState via content script mobx keystone proxy", {}); + this.backgroundContextPort.postMessage({ + requestInitialState: true, + requestId, + }); + }); + }); + } + actionCall(actionCall) { + return __awaiter(this, void 0, void 0, function* () { + return new Promise((resolve, _reject) => { + const requestId = nanoid_1.nanoid(); + // console.debug("MobxKeystoneProxy (Content Script Context): actionCall via content script mobx keystone proxy", { actionCall }); + this.backgroundContextPort.postMessage({ + actionCall, + requestId, + }); + resolve(); + }); + }); + } +} +class BackgroundContextCommunicator { + constructor() { + this.msgListeners = []; + this.mobxKeystoneProxy = new MobxKeystoneProxy(this.msgListeners); + } + requestInitialState() { + return __awaiter(this, void 0, void 0, function* () { + return this.mobxKeystoneProxy.requestInitialState(); + }); + } + onMessage(listener) { + this.msgListeners.push(listener); + } + sendMessage(actionCall) { + // send the action to be taken to the host + this.mobxKeystoneProxy.actionCall(actionCall); + } +} +const server = new BackgroundContextCommunicator(); +function subscribeToExtensionState() { + return __awaiter(this, void 0, void 0, function* () { + // we get the snapshot from the server, which is a serializable object + const rootStoreSnapshot = yield server.requestInitialState(); + // and hydrate it into a proper object + const rootStore = mobx_keystone_1.fromSnapshot(rootStoreSnapshot); + let serverAction = false; + const runServerActionLocally = (actionCall) => { + const wasServerAction = serverAction; + serverAction = true; + try { + // in clients we use the sync new model ids version to make sure that + // any model ids that were generated in the server side end up being + // the same in the client side + mobx_keystone_1.applySerializedActionAndSyncNewModelIds(rootStore, actionCall); + } + finally { + serverAction = wasServerAction; + } + }; + // listen to action messages to be replicated into the local root store + server.onMessage(actionCall => { + runServerActionLocally(actionCall); + }); + // also listen to local actions, cancel them and send them to the server (background context) + mobx_keystone_1.onActionMiddleware(rootStore, { + onStart(actionCall, ctx) { + if (!serverAction) { + // if the action does not come from the server (background context) cancel it silently + // and send it to the server (background context) + // it will then be replicated by the server (background context) and properly executed + server.sendMessage(mobx_keystone_1.serializeActionCall(actionCall, rootStore)); + ctx.data.cancelled = true; // just for logging purposes + // "cancel" the action by returning undefined + return { + result: mobx_keystone_1.ActionTrackingResult.Return, + value: undefined, + }; + } + // run actions that comes from the server (background context) unmodified + /* eslint-disable consistent-return */ + return undefined; + /* eslint-enable consistent-return */ + }, + }); + // recommended by mobx-keystone (allows the model hook `onAttachedToRootStore` to work) + mobx_keystone_1.registerRootStore(rootStore); + return rootStore; + }); +} +exports.subscribeToExtensionState = subscribeToExtensionState; + + +/***/ }) + +/******/ }); +/************************************************************************/ +/******/ // The module cache +/******/ var __webpack_module_cache__ = {}; +/******/ +/******/ // The require function +/******/ function __webpack_require__(moduleId) { +/******/ // Check if module is in cache +/******/ if(__webpack_module_cache__[moduleId]) { +/******/ return __webpack_module_cache__[moduleId].exports; +/******/ } +/******/ // Create a new module (and put it into the cache) +/******/ var module = __webpack_module_cache__[moduleId] = { +/******/ id: moduleId, +/******/ loaded: false, +/******/ exports: {} +/******/ }; +/******/ +/******/ // Execute the module function +/******/ __webpack_modules__[moduleId].call(module.exports, module, module.exports, __webpack_require__); +/******/ +/******/ // Flag the module as loaded +/******/ module.loaded = true; +/******/ +/******/ // Return the exports of the module +/******/ return module.exports; +/******/ } +/******/ +/******/ // expose the modules object (__webpack_modules__) +/******/ __webpack_require__.m = __webpack_modules__; +/******/ +/******/ // the startup function +/******/ // It's empty as some runtime module handles the default behavior +/******/ __webpack_require__.x = x => {}; +/************************************************************************/ +/******/ /* webpack/runtime/compat get default export */ +/******/ (() => { +/******/ // getDefaultExport function for compatibility with non-harmony modules +/******/ __webpack_require__.n = (module) => { +/******/ var getter = module && module.__esModule ? +/******/ () => (module['default']) : +/******/ () => (module); +/******/ __webpack_require__.d(getter, { a: getter }); +/******/ return getter; +/******/ }; +/******/ })(); +/******/ +/******/ /* webpack/runtime/define property getters */ +/******/ (() => { +/******/ // define getter functions for harmony exports +/******/ __webpack_require__.d = (exports, definition) => { +/******/ for(var key in definition) { +/******/ if(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) { +/******/ Object.defineProperty(exports, key, { enumerable: true, get: definition[key] }); +/******/ } +/******/ } +/******/ }; +/******/ })(); +/******/ +/******/ /* webpack/runtime/global */ +/******/ (() => { +/******/ __webpack_require__.g = (function() { +/******/ if (typeof globalThis === 'object') return globalThis; +/******/ try { +/******/ return this || new Function('return this')(); +/******/ } catch (e) { +/******/ if (typeof window === 'object') return window; +/******/ } +/******/ })(); +/******/ })(); +/******/ +/******/ /* webpack/runtime/harmony module decorator */ +/******/ (() => { +/******/ __webpack_require__.hmd = (module) => { +/******/ module = Object.create(module); +/******/ if (!module.children) module.children = []; +/******/ Object.defineProperty(module, 'exports', { +/******/ enumerable: true, +/******/ set: () => { +/******/ throw new Error('ES Modules may not assign module.exports or exports.*, Use ESM export syntax, instead: ' + module.id); +/******/ } +/******/ }); +/******/ return module; +/******/ }; +/******/ })(); +/******/ +/******/ /* webpack/runtime/hasOwnProperty shorthand */ +/******/ (() => { +/******/ __webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop)) +/******/ })(); +/******/ +/******/ /* webpack/runtime/make namespace object */ +/******/ (() => { +/******/ // define __esModule on exports +/******/ __webpack_require__.r = (exports) => { +/******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) { +/******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' }); +/******/ } +/******/ Object.defineProperty(exports, '__esModule', { value: true }); +/******/ }; +/******/ })(); +/******/ +/******/ /* webpack/runtime/jsonp chunk loading */ +/******/ (() => { +/******/ // no baseURI +/******/ +/******/ // object to store loaded and loading chunks +/******/ // undefined = chunk not loaded, null = chunk preloaded/prefetched +/******/ // Promise = chunk loading, 0 = chunk loaded +/******/ var installedChunks = { +/******/ 840: 0 +/******/ }; +/******/ +/******/ var deferredModules = [ +/******/ [5543,351] +/******/ ]; +/******/ // no chunk on demand loading +/******/ +/******/ // no prefetching +/******/ +/******/ // no preloaded +/******/ +/******/ // no HMR +/******/ +/******/ // no HMR manifest +/******/ +/******/ var checkDeferredModules = x => {}; +/******/ +/******/ // install a JSONP callback for chunk loading +/******/ var webpackJsonpCallback = (parentChunkLoadingFunction, data) => { +/******/ var [chunkIds, moreModules, runtime, executeModules] = data; +/******/ // add "moreModules" to the modules object, +/******/ // then flag all "chunkIds" as loaded and fire callback +/******/ var moduleId, chunkId, i = 0, resolves = []; +/******/ for(;i < chunkIds.length; i++) { +/******/ chunkId = chunkIds[i]; +/******/ if(__webpack_require__.o(installedChunks, chunkId) && installedChunks[chunkId]) { +/******/ resolves.push(installedChunks[chunkId][0]); +/******/ } +/******/ installedChunks[chunkId] = 0; +/******/ } +/******/ for(moduleId in moreModules) { +/******/ if(__webpack_require__.o(moreModules, moduleId)) { +/******/ __webpack_require__.m[moduleId] = moreModules[moduleId]; +/******/ } +/******/ } +/******/ if(runtime) runtime(__webpack_require__); +/******/ if(parentChunkLoadingFunction) parentChunkLoadingFunction(data); +/******/ while(resolves.length) { +/******/ resolves.shift()(); +/******/ } +/******/ +/******/ // add entry modules from loaded chunk to deferred list +/******/ if(executeModules) deferredModules.push.apply(deferredModules, executeModules); +/******/ +/******/ // run deferred modules when all chunks ready +/******/ return checkDeferredModules(); +/******/ } +/******/ +/******/ var chunkLoadingGlobal = self["webpackChunkbergamot_browser_extension"] = self["webpackChunkbergamot_browser_extension"] || []; +/******/ chunkLoadingGlobal.forEach(webpackJsonpCallback.bind(null, 0)); +/******/ chunkLoadingGlobal.push = webpackJsonpCallback.bind(null, chunkLoadingGlobal.push.bind(chunkLoadingGlobal)); +/******/ +/******/ function checkDeferredModulesImpl() { +/******/ var result; +/******/ for(var i = 0; i < deferredModules.length; i++) { +/******/ var deferredModule = deferredModules[i]; +/******/ var fulfilled = true; +/******/ for(var j = 1; j < deferredModule.length; j++) { +/******/ var depId = deferredModule[j]; +/******/ if(installedChunks[depId] !== 0) fulfilled = false; +/******/ } +/******/ if(fulfilled) { +/******/ deferredModules.splice(i--, 1); +/******/ result = __webpack_require__(__webpack_require__.s = deferredModule[0]); +/******/ } +/******/ } +/******/ if(deferredModules.length === 0) { +/******/ __webpack_require__.x(); +/******/ __webpack_require__.x = x => {}; +/******/ } +/******/ return result; +/******/ } +/******/ var startup = __webpack_require__.x; +/******/ __webpack_require__.x = () => { +/******/ // reset startup function so it can be called again when more startup code is added +/******/ __webpack_require__.x = startup || (x => {}); +/******/ return (checkDeferredModules = checkDeferredModulesImpl)(); +/******/ }; +/******/ })(); +/******/ +/************************************************************************/ +/******/ +/******/ // run startup +/******/ var __webpack_exports__ = __webpack_require__.x(); +/******/ +/******/ })() +; +//# sourceMappingURL=dom-translation-content-script.js.map \ No newline at end of file diff --git a/browser/extensions/translations/extension/experiment-apis/extensionPreferences/api.js b/browser/extensions/translations/extension/experiment-apis/extensionPreferences/api.js new file mode 100644 index 000000000000..f6d98817ccca --- /dev/null +++ b/browser/extensions/translations/extension/experiment-apis/extensionPreferences/api.js @@ -0,0 +1,44 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +/* global ExtensionAPI, ExtensionCommon, Services */ + +"use strict"; + +this.extensionPreferences = class extends ExtensionAPI { + getAPI() { + const { Preferences } = ChromeUtils.import( + "resource://gre/modules/Preferences.jsm", + {}, + ); + const { ExtensionUtils } = ChromeUtils.import( + "resource://gre/modules/ExtensionUtils.jsm", + {}, + ); + const { ExtensionError } = ExtensionUtils; + const telemetryInactivityThresholdInSecondsOverridePrefName = `extensions.translations.telemetryInactivityThresholdInSecondsOverride`; + return { + experiments: { + extensionPreferences: { + async getTelemetryInactivityThresholdInSecondsOverridePref() { + try { + const value = Preferences.get( + telemetryInactivityThresholdInSecondsOverridePrefName, + false, + ); + if (!value) { + return false; + } + return parseFloat(value); + } catch (error) { + // Surface otherwise silent or obscurely reported errors + console.error(error.message, error.stack); + throw new ExtensionError(error.message); + } + }, + }, + }, + }; + } +}; diff --git a/browser/extensions/translations/extension/experiment-apis/extensionPreferences/schema.json b/browser/extensions/translations/extension/experiment-apis/extensionPreferences/schema.json new file mode 100644 index 000000000000..c58a4b16d75c --- /dev/null +++ b/browser/extensions/translations/extension/experiment-apis/extensionPreferences/schema.json @@ -0,0 +1,15 @@ +[ + { + "namespace": "experiments.extensionPreferences", + "description": "Enables read-only access to specific Extensions-related about:config preferences", + "functions": [ + { + "name": "getTelemetryInactivityThresholdInSecondsOverridePref", + "type": "function", + "description": "Get the `extensions.translations.telemetryInactivityThresholdInSecondsOverride` preference's value", + "parameters": [], + "async": true + } + ] + } +] diff --git a/browser/extensions/translations/extension/experiment-apis/telemetryEnvironment/api.js b/browser/extensions/translations/extension/experiment-apis/telemetryEnvironment/api.js new file mode 100644 index 000000000000..a3c302e9bcfd --- /dev/null +++ b/browser/extensions/translations/extension/experiment-apis/telemetryEnvironment/api.js @@ -0,0 +1,58 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +/* global ExtensionAPI, ExtensionCommon, Services */ + +"use strict"; + +this.telemetryEnvironment = class extends ExtensionAPI { + getAPI(context) { + const { TelemetryController } = ChromeUtils.import( + "resource://gre/modules/TelemetryController.jsm", + {}, + ); + const { TelemetryEnvironment } = ChromeUtils.import( + "resource://gre/modules/TelemetryEnvironment.jsm", + {}, + ); + + /** + * These attributes are already sent as part of the telemetry ping envelope + * @returns {{}} + */ + const collectTelemetryEnvironmentBasedAttributes = () => { + const environment = TelemetryEnvironment.currentEnvironment; + // console.debug("TelemetryEnvironment.currentEnvironment", environment); + + return { + systemMemoryMb: environment.system.memoryMB, + systemCpuCount: environment.system.cpu.count, + systemCpuCores: environment.system.cpu.cores, + systemCpuVendor: environment.system.cpu.vendor, + systemCpuFamily: environment.system.cpu.family, + systemCpuModel: environment.system.cpu.model, + systemCpuStepping: environment.system.cpu.stepping, + systemCpuL2cacheKB: environment.system.cpu.l2cacheKB, + systemCpuL3cacheKB: environment.system.cpu.l3cacheKB, + systemCpuSpeedMhz: environment.system.cpu.speedMHz, + systemCpuExtensions: environment.system.cpu.extensions, + }; + }; + + return { + experiments: { + telemetryEnvironment: { + async getTranslationRelevantFxTelemetryMetrics() { + await TelemetryController.promiseInitialized(); + const telemetryEnvironmentBasedAttributes = collectTelemetryEnvironmentBasedAttributes(); + // console.debug("telemetryEnvironmentBasedAttributes", telemetryEnvironmentBasedAttributes); + return { + ...telemetryEnvironmentBasedAttributes, + }; + }, + }, + }, + }; + } +}; diff --git a/browser/extensions/translations/extension/experiment-apis/telemetryEnvironment/schema.json b/browser/extensions/translations/extension/experiment-apis/telemetryEnvironment/schema.json new file mode 100644 index 000000000000..d31d43a39b4f --- /dev/null +++ b/browser/extensions/translations/extension/experiment-apis/telemetryEnvironment/schema.json @@ -0,0 +1,15 @@ +[ + { + "namespace": "experiments.telemetryEnvironment", + "description": "Enables read-only access to the translation-relevant info from the current telemetry environment", + "functions": [ + { + "name": "getTranslationRelevantFxTelemetryMetrics", + "type": "function", + "description": "Get the translation-relevant info from the current telemetry environment", + "parameters": [], + "async": true + } + ] + } +] diff --git a/browser/extensions/translations/extension/experiment-apis/telemetryPreferences/api.js b/browser/extensions/translations/extension/experiment-apis/telemetryPreferences/api.js new file mode 100644 index 000000000000..8baa57902515 --- /dev/null +++ b/browser/extensions/translations/extension/experiment-apis/telemetryPreferences/api.js @@ -0,0 +1,57 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +/* global ExtensionAPI, ExtensionCommon, Services */ + +"use strict"; + +this.telemetryPreferences = class extends ExtensionAPI { + getAPI(context) { + const EventManager = ExtensionCommon.EventManager; + const uploadEnabledPrefName = `datareporting.healthreport.uploadEnabled`; + const cachedClientIDPrefName = `toolkit.telemetry.cachedClientID`; + + return { + experiments: { + telemetryPreferences: { + onUploadEnabledPrefChange: new EventManager({ + context, + name: "telemetryPreferences.onUploadEnabledPrefChange", + register: fire => { + const callback = () => { + fire.async().catch(() => {}); // ignore Message Manager disconnects + }; + Services.prefs.addObserver(uploadEnabledPrefName, callback); + return () => { + Services.prefs.removeObserver(uploadEnabledPrefName, callback); + }; + }, + }).api(), + async getUploadEnabledPref() { + return Services.prefs.getBoolPref(uploadEnabledPrefName, undefined); + }, + onCachedClientIDPrefChange: new EventManager({ + context, + name: "telemetryPreferences.onCachedClientIDPrefChange", + register: fire => { + const callback = () => { + fire.async().catch(() => {}); // ignore Message Manager disconnects + }; + Services.prefs.addObserver(cachedClientIDPrefName, callback); + return () => { + Services.prefs.removeObserver(cachedClientIDPrefName, callback); + }; + }, + }).api(), + async getCachedClientIDPref() { + return Services.prefs.getStringPref( + cachedClientIDPrefName, + undefined, + ); + }, + }, + }, + }; + } +}; diff --git a/browser/extensions/translations/extension/experiment-apis/telemetryPreferences/schema.json b/browser/extensions/translations/extension/experiment-apis/telemetryPreferences/schema.json new file mode 100644 index 000000000000..e508dcfe116c --- /dev/null +++ b/browser/extensions/translations/extension/experiment-apis/telemetryPreferences/schema.json @@ -0,0 +1,34 @@ +[ + { + "namespace": "experiments.telemetryPreferences", + "description": "Enables read-only access to specific Telemetry-related about:config preferences", + "events": [ + { + "name": "onUploadEnabledPrefChange", + "type": "function", + "parameters": [] + }, + { + "name": "onCachedClientIDPrefChange", + "type": "function", + "parameters": [] + } + ], + "functions": [ + { + "name": "getUploadEnabledPref", + "type": "function", + "description": "Get the uploadEnabled preference's value", + "parameters": [], + "async": true + }, + { + "name": "getCachedClientIDPref", + "type": "function", + "description": "Get the cachedClientID preference's value", + "parameters": [], + "async": true + } + ] + } +] diff --git a/browser/extensions/translations/extension/experiment-apis/translateUi/TranslationBrowserChromeUi.js b/browser/extensions/translations/extension/experiment-apis/translateUi/TranslationBrowserChromeUi.js new file mode 100644 index 000000000000..a46f3a46c5ee --- /dev/null +++ b/browser/extensions/translations/extension/experiment-apis/translateUi/TranslationBrowserChromeUi.js @@ -0,0 +1,322 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +/* global TranslationBrowserChromeUiNotificationManager */ +/* eslint no-unused-vars: ["error", { "varsIgnorePattern": "(TranslationBrowserChromeUi)" }]*/ + +const { setTimeout, clearTimeout } = ChromeUtils.import( + "resource://gre/modules/Timer.jsm", + {}, +); + +const TranslationInfoBarStates = { + STATE_OFFER: 0, + STATE_TRANSLATING: 1, + STATE_TRANSLATED: 2, + STATE_ERROR: 3, + STATE_UNAVAILABLE: 4, +}; + +class TranslationBrowserChromeUi { + constructor(Services, browser, context, apiEventEmitter, tabId) { + this.Services = Services; + this.uiState = null; + this.browser = browser; + this.context = context; + this.translationInfoBarShown = false; + this.shouldShowTranslationProgressTimer = undefined; + this.importTranslationNotification(); + + // The manager instance is injected into the translation notification bar and handles events from therein + this.translationBrowserChromeUiNotificationManager = new TranslationBrowserChromeUiNotificationManager( + browser, + apiEventEmitter, + tabId, + TranslationInfoBarStates, + ); + } + + get notificationBox() { + return this.browser.ownerGlobal.gBrowser.getNotificationBox(this.browser); + } + + importTranslationNotification() { + const chromeWin = this.browser.ownerGlobal; + + // As a workaround to be able to load updates for the translation notification on extension reload + // we use the current unix timestamp as part of the element id. + // TODO: Restrict use of Date.now() as cachebuster to development mode only + chromeWin.now = Date.now(); + + try { + chromeWin.customElements.setElementCreationCallback( + `translation-notification-${chromeWin.now}`, + () => { + this.Services.scriptloader.loadSubScript( + this.context.extension.getURL( + "experiment-apis/translateUi/content/translation-notification.js", + ) + + "?cachebuster=" + + chromeWin.now, + chromeWin, + ); + }, + ); + } catch (e) { + console.log( + "Error occurred when attempting to load the translation notification script, but we continue nevertheless", + e, + ); + } + } + + onUiStateUpdate(uiState) { + // Set all values before showing a new translation infobar. + this.translationBrowserChromeUiNotificationManager.uiState = uiState; + this.setInfobarState(uiState.infobarState); + this.updateTranslationProgress(uiState); + if (this.shouldShowInfoBar(this.browser.contentPrincipal)) { + this.showTranslationInfoBarIfNotAlreadyShown(); + } else { + this.hideTranslationInfoBarIfShown(); + } + } + + /** + * Syncs infobarState with the inner infobar state variable of the infobar + * @param val + */ + setInfobarState(val) { + const notif = this.notificationBox.getNotificationWithValue("translation"); + if (notif) { + notif.state = val; + } + } + + /** + * Informs the infobar element of the current translation progress + */ + updateTranslationProgress(uiState) { + // Don't bother updating translation progress if not currently translating + if ( + this.translationBrowserChromeUiNotificationManager.uiState + .infobarState !== TranslationInfoBarStates.STATE_TRANSLATING + ) { + return; + } + const notif = this.notificationBox.getNotificationWithValue("translation"); + if (notif) { + const { + modelDownloading, + translationDurationMs, + localizedTranslationProgressText, + } = uiState; + + // Always cancel ongoing timers so that we start from a clean state + if (this.shouldShowTranslationProgressTimer) { + clearTimeout(this.shouldShowTranslationProgressTimer); + } + + // Only show progress if translation has been going on for at least 3 seconds + // or we are currently downloading a model + let shouldShowTranslationProgress; + const thresholdMsAfterWhichToShouldTranslationProgress = 3000; + if ( + translationDurationMs >= + thresholdMsAfterWhichToShouldTranslationProgress || + modelDownloading + ) { + shouldShowTranslationProgress = true; + } else { + // Use a timer to show the translation progress after the threshold + this.shouldShowTranslationProgressTimer = setTimeout(() => { + notif.updateTranslationProgress( + true, + localizedTranslationProgressText, + ); + clearTimeout(this.shouldShowTranslationProgressTimer); + }, thresholdMsAfterWhichToShouldTranslationProgress - translationDurationMs); + // Don't show until then + shouldShowTranslationProgress = false; + } + notif.updateTranslationProgress( + shouldShowTranslationProgress, + localizedTranslationProgressText, + ); + } + } + + shouldShowInfoBar(principal) { + if ( + ![ + TranslationInfoBarStates.STATE_OFFER, + TranslationInfoBarStates.STATE_TRANSLATING, + TranslationInfoBarStates.STATE_TRANSLATED, + TranslationInfoBarStates.STATE_ERROR, + ].includes( + this.translationBrowserChromeUiNotificationManager.uiState.infobarState, + ) + ) { + return false; + } + + // Don't show the infobar if we have no language detection results yet + if ( + !this.translationBrowserChromeUiNotificationManager.uiState + .detectedLanguageResults + ) { + return false; + } + + // Don't show the infobar if we couldn't confidently detect the language + if ( + !this.translationBrowserChromeUiNotificationManager.uiState + .detectedLanguageResults.confident + ) { + return false; + } + + // Check if we should never show the infobar for this language. + const neverForLangs = this.Services.prefs.getCharPref( + "browser.translation.neverForLanguages", + ); + if ( + neverForLangs + .split(",") + .includes( + this.translationBrowserChromeUiNotificationManager.uiState + .detectedLanguageResults.language, + ) + ) { + // TranslationTelemetry.recordAutoRejectedTranslationOffer(); + return false; + } + + // or if we should never show the infobar for this domain. + const perms = this.Services.perms; + if ( + perms.testExactPermissionFromPrincipal(principal, "translate") === + perms.DENY_ACTION + ) { + // TranslationTelemetry.recordAutoRejectedTranslationOffer(); + return false; + } + + return true; + } + + hideURLBarIcon() { + const chromeWin = this.browser.ownerGlobal; + const PopupNotifications = chromeWin.PopupNotifications; + const removeId = this.translationBrowserChromeUiNotificationManager.uiState + .originalShown + ? "translated" + : "translate"; + const notification = PopupNotifications.getNotification( + removeId, + this.browser, + ); + if (notification) { + PopupNotifications.remove(notification); + } + } + + showURLBarIcon() { + const chromeWin = this.browser.ownerGlobal; + const PopupNotifications = chromeWin.PopupNotifications; + const removeId = this.translationBrowserChromeUiNotificationManager.uiState + .originalShown + ? "translated" + : "translate"; + const notification = PopupNotifications.getNotification( + removeId, + this.browser, + ); + if (notification) { + PopupNotifications.remove(notification); + } + + const callback = (topic /* , aNewBrowser */) => { + if (topic === "swapping") { + const infoBarVisible = this.notificationBox.getNotificationWithValue( + "translation", + ); + if (infoBarVisible) { + this.showTranslationInfoBar(); + } + return true; + } + + if (topic !== "showing") { + return false; + } + const translationNotification = this.notificationBox.getNotificationWithValue( + "translation", + ); + if (translationNotification) { + translationNotification.close(); + } else { + this.showTranslationInfoBar(); + } + return true; + }; + + const addId = this.translationBrowserChromeUiNotificationManager.uiState + .originalShown + ? "translate" + : "translated"; + PopupNotifications.show( + this.browser, + addId, + null, + addId + "-notification-icon", + null, + null, + { dismissed: true, eventCallback: callback }, + ); + } + + showTranslationInfoBarIfNotAlreadyShown() { + const translationNotification = this.notificationBox.getNotificationWithValue( + "translation", + ); + if (!translationNotification && !this.translationInfoBarShown) { + this.showTranslationInfoBar(); + } + this.showURLBarIcon(); + } + + hideTranslationInfoBarIfShown() { + const translationNotification = this.notificationBox.getNotificationWithValue( + "translation", + ); + if (translationNotification) { + translationNotification.close(); + } + this.hideURLBarIcon(); + this.translationInfoBarShown = false; + } + + showTranslationInfoBar() { + console.debug("showTranslationInfoBar"); + this.translationInfoBarShown = true; + const notificationBox = this.notificationBox; + const chromeWin = this.browser.ownerGlobal; + const notif = notificationBox.appendNotification( + "", + "translation", + null, + notificationBox.PRIORITY_INFO_HIGH, + null, + null, + `translation-notification-${chromeWin.now}`, + ); + notif.init(this.translationBrowserChromeUiNotificationManager); + this.translationBrowserChromeUiNotificationManager.infobarDisplayed( + notif._getSourceLang(), + notif._getTargetLang(), + ); + return notif; + } +} diff --git a/browser/extensions/translations/extension/experiment-apis/translateUi/TranslationBrowserChromeUiManager.js b/browser/extensions/translations/extension/experiment-apis/translateUi/TranslationBrowserChromeUiManager.js new file mode 100644 index 000000000000..fa4bdb96fbf4 --- /dev/null +++ b/browser/extensions/translations/extension/experiment-apis/translateUi/TranslationBrowserChromeUiManager.js @@ -0,0 +1,80 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +/* eslint no-unused-vars: ["error", { "varsIgnorePattern": "(TranslationBrowserChromeUiNotificationManager)" }]*/ + +class TranslationBrowserChromeUiNotificationManager { + constructor(browser, apiEventEmitter, tabId, TranslationInfoBarStates) { + this.uiState = null; + this.TranslationInfoBarStates = TranslationInfoBarStates; + this.apiEventEmitter = apiEventEmitter; + this.tabId = tabId; + this.browser = browser; + } + + infobarDisplayed(from, to) { + console.log("infobarDisplayed", { from, to }); + this.apiEventEmitter.emit("onInfoBarDisplayed", this.tabId, from, to); + } + + toLanguageChanged(from, newTo) { + console.log("toLanguageChanged", { from, newTo }); + this.apiEventEmitter.emit("onSelectTranslateTo", this.tabId, from, newTo); + } + + fromLanguageChanged(newFrom, to) { + console.log("fromLanguageChanged", { newFrom, to }); + this.apiEventEmitter.emit("onSelectTranslateFrom", this.tabId, newFrom, to); + } + + infobarClosed(from, to) { + console.log("infobarClosed", { from, to }); + this.apiEventEmitter.emit("onInfoBarClosed", this.tabId, from, to); + } + + neverForLanguage(from, to) { + console.log("neverForLanguage", { from, to }); + this.apiEventEmitter.emit( + "onNeverTranslateSelectedLanguage", + this.tabId, + from, + to, + ); + } + + neverForSite(from, to) { + console.log("neverForSite", { from, to }); + this.apiEventEmitter.emit("onNeverTranslateThisSite", this.tabId, from, to); + } + + showOriginalContent(from, to) { + console.log("showOriginalContent", { from, to }); + this.apiEventEmitter.emit( + "onShowOriginalButtonPressed", + this.tabId, + from, + to, + ); + } + + showTranslatedContent(from, to) { + console.log("showTranslatedContent", { from, to }); + this.apiEventEmitter.emit( + "onShowTranslatedButtonPressed", + this.tabId, + from, + to, + ); + } + + translate(from, to) { + console.log("translate", { from, to }); + this.apiEventEmitter.emit("onTranslateButtonPressed", this.tabId, from, to); + } + + notNow(from, to) { + console.log("notNow", { from, to }); + this.apiEventEmitter.emit("onNotNowButtonPressed", this.tabId, from, to); + } +} diff --git a/browser/extensions/translations/extension/experiment-apis/translateUi/api.js b/browser/extensions/translations/extension/experiment-apis/translateUi/api.js new file mode 100644 index 000000000000..3247efbfbd72 --- /dev/null +++ b/browser/extensions/translations/extension/experiment-apis/translateUi/api.js @@ -0,0 +1,181 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +/* eslint-env commonjs */ +/* eslint no-unused-vars: off */ +/* eslint no-inner-declarations: off */ +/* eslint no-console: ["warn", { allow: ["info", "warn", "error"] }] */ +/* global ExtensionAPI */ + +"use strict"; + +this.translateUi = class extends ExtensionAPI { + getAPI(context) { + const { Services } = ChromeUtils.import( + "resource://gre/modules/Services.jsm", + {}, + ); + + const now = Date.now(); + + /* global TranslationBrowserChromeUiManager */ + Services.scriptloader.loadSubScript( + context.extension.getURL( + "experiment-apis/translateUi/TranslationBrowserChromeUiManager.js", + ) + + "?cachebuster=" + + now, + ); + /* global TranslationBrowserChromeUi */ + Services.scriptloader.loadSubScript( + context.extension.getURL( + "experiment-apis/translateUi/TranslationBrowserChromeUi.js", + ) + + "?cachebuster=" + + now, + ); + + const { ExtensionCommon } = ChromeUtils.import( + "resource://gre/modules/ExtensionCommon.jsm", + {}, + ); + + const { EventManager, EventEmitter } = ExtensionCommon; + + const apiEventEmitter = new EventEmitter(); + + const { ExtensionUtils } = ChromeUtils.import( + "resource://gre/modules/ExtensionUtils.jsm", + {}, + ); + const { ExtensionError } = ExtensionUtils; + + /** + * Boilerplate-reducing factory method translating between + * apiEventEmitter.emit("translateUi.onFoo", ...args) + * and the actual web extension event being emitted + * + * @param {string} eventRef the event reference, eg "onFoo" + * @returns {void} + */ + const eventManagerFactory = eventRef => { + const eventId = `translateUi.${eventRef}`; + return new EventManager({ + context, + name: eventId, + register: fire => { + const listener = (event, ...args) => fire.async(...args); + apiEventEmitter.on(eventRef, listener); + return () => { + apiEventEmitter.off(eventRef, listener); + }; + }, + }); + }; + + const { tabManager } = context.extension; + const translationBrowserChromeUiInstancesByTabId = new Map(); + const getTranslationBrowserChromeUiInstanceByTabId = tabId => { + if (translationBrowserChromeUiInstancesByTabId.has(tabId)) { + return translationBrowserChromeUiInstancesByTabId.get(tabId); + } + const tab = tabManager.get(tabId); + const { browser } = tab; + const translationBrowserChromeUi = new TranslationBrowserChromeUi( + Services, + browser, + context, + apiEventEmitter, + tabId, + ); + translationBrowserChromeUiInstancesByTabId.set( + tabId, + translationBrowserChromeUi, + ); + return translationBrowserChromeUi; + }; + + return { + experiments: { + translateUi: { + /* Start reacting to translation state updates */ + start: async function start() { + try { + console.log("Called start()"); + + console.log( + "Inactivating legacy built-in translation feature (by setting browser.translation.ui.show and browser.translation.detectLanguage to false)", + ); + Services.prefs.setBoolPref(`browser.translation.ui.show`, false); + Services.prefs.setBoolPref( + `browser.translation.detectLanguage`, + false, + ); + + return undefined; + } catch (error) { + // Surface otherwise silent or obscurely reported errors + console.error(error.message, error.stack); + throw new ExtensionError(error.message); + } + }, + + /* Set current ui state */ + setUiState: async function setUiState(tabId, uiState) { + try { + // console.log("Called setUiState(tabId, uiState)", {tabId,uiState}); + const translationBrowserChromeUi = getTranslationBrowserChromeUiInstanceByTabId( + tabId, + ); + translationBrowserChromeUi.onUiStateUpdate(uiState); + return undefined; + } catch (error) { + // Surface otherwise silent or obscurely reported errors + console.error(error.message, error.stack); + throw new ExtensionError(error.message); + } + }, + + /* Stop reacting to translation state updates */ + stop: async function stop() { + try { + console.log("Called stop()"); + return undefined; + } catch (error) { + // Surface otherwise silent or obscurely reported errors + console.error(error.message, error.stack); + throw new ExtensionError(error.message); + } + }, + + /* Event boilerplate with listeners that forwards all but the first argument to the web extension event */ + onInfoBarDisplayed: eventManagerFactory("onInfoBarDisplayed").api(), + onSelectTranslateTo: eventManagerFactory("onSelectTranslateTo").api(), + onSelectTranslateFrom: eventManagerFactory( + "onSelectTranslateFrom", + ).api(), + onInfoBarClosed: eventManagerFactory("onInfoBarClosed").api(), + onNeverTranslateSelectedLanguage: eventManagerFactory( + "onNeverTranslateSelectedLanguage", + ).api(), + onNeverTranslateThisSite: eventManagerFactory( + "onNeverTranslateThisSite", + ).api(), + onShowOriginalButtonPressed: eventManagerFactory( + "onShowOriginalButtonPressed", + ).api(), + onShowTranslatedButtonPressed: eventManagerFactory( + "onShowTranslatedButtonPressed", + ).api(), + onTranslateButtonPressed: eventManagerFactory( + "onTranslateButtonPressed", + ).api(), + onNotNowButtonPressed: eventManagerFactory( + "onNotNowButtonPressed", + ).api(), + }, + }, + }; + } +}; diff --git a/browser/extensions/translations/extension/experiment-apis/translateUi/content/translation-notification.js b/browser/extensions/translations/extension/experiment-apis/translateUi/content/translation-notification.js new file mode 100644 index 000000000000..2e83ba7e9fca --- /dev/null +++ b/browser/extensions/translations/extension/experiment-apis/translateUi/content/translation-notification.js @@ -0,0 +1,449 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +/* global MozElements */ + +"use strict"; + +window.MozTranslationNotification = class extends MozElements.Notification { + static get markup() { + return ` + + + + + + + + + + + `; + } + + static get entities() { + return [ + "chrome://global/locale/notification.dtd", + "chrome://browser/locale/translation.dtd", + ]; + } + + connectedCallback() { + this.appendChild(this.constructor.fragment); + + for (const [propertyName, selector] of [ + ["details", "[anonid=details]"], + ["messageImage", ".messageImage"], + ["spacer", "[anonid=spacer]"], + ]) { + this[propertyName] = this.querySelector(selector); + } + } + + async updateTranslationProgress( + shouldShowTranslationProgress, + localizedTranslationProgressText, + ) { + const progressLabelValue = shouldShowTranslationProgress + ? localizedTranslationProgressText + : ""; + this._getAnonElt("progress-label").setAttribute( + "value", + progressLabelValue, + ); + } + + set state(val) { + const deck = this._getAnonElt("translationStates"); + + const activeElt = document.activeElement; + if (activeElt && deck.contains(activeElt)) { + activeElt.blur(); + } + + let stateName; + for (const name of ["OFFER", "TRANSLATING", "TRANSLATED", "ERROR"]) { + if (Translation["STATE_" + name] === val) { + stateName = name.toLowerCase(); + break; + } + } + this.setAttribute("state", stateName); + + if (val === this.translation.TranslationInfoBarStates.STATE_TRANSLATED) { + this._handleButtonHiding(); + } + + deck.selectedIndex = val; + } + + get state() { + return this._getAnonElt("translationStates").selectedIndex; + } + + init(translationBrowserChromeUiNotificationManager) { + this.translation = translationBrowserChromeUiNotificationManager; + + const sortByLocalizedName = function(list) { + const names = Services.intl.getLanguageDisplayNames(undefined, list); + return list + .map((code, i) => [code, names[i]]) + .sort((a, b) => a[1].localeCompare(b[1])); + }; + + // Fill the lists of supported source languages. + const detectedLanguage = this._getAnonElt("detectedLanguage"); + const fromLanguage = this._getAnonElt("fromLanguage"); + const sourceLanguages = sortByLocalizedName( + this.translation.uiState.supportedSourceLanguages, + ); + for (const [code, name] of sourceLanguages) { + detectedLanguage.appendItem(name, code); + fromLanguage.appendItem(name, code); + } + detectedLanguage.value = this.translation.uiState.detectedLanguageResults.language; + + // translatedFrom is only set if we have already translated this page. + if (translationBrowserChromeUiNotificationManager.uiState.translatedFrom) { + fromLanguage.value = + translationBrowserChromeUiNotificationManager.uiState.translatedFrom; + } + + // Fill the list of supported target languages. + const toLanguage = this._getAnonElt("toLanguage"); + const targetLanguages = sortByLocalizedName( + this.translation.uiState.supportedTargetLanguages, + ); + for (const [code, name] of targetLanguages) { + toLanguage.appendItem(name, code); + } + + if (translationBrowserChromeUiNotificationManager.uiState.translatedTo) { + toLanguage.value = + translationBrowserChromeUiNotificationManager.uiState.translatedTo; + } + + if (translationBrowserChromeUiNotificationManager.uiState.infobarState) { + this.state = + translationBrowserChromeUiNotificationManager.uiState.infobarState; + } + + /* + // The welcome popup/notification is currently disabled + const kWelcomePref = "browser.translation.ui.welcomeMessageShown"; + if ( + Services.prefs.prefHasUserValue(kWelcomePref) || + this.translation.browser !== gBrowser.selectedBrowser + ) { + return; + } + + this.addEventListener( + "transitionend", + function() { + // These strings are hardcoded because they need to reach beta + // without riding the trains. + const localizedStrings = { + en: [ + "Hey look! It's something new!", + "Now the Web is even more accessible with our new in-page translation feature. Click the translate button to try it!", + "Learn more.", + "Thanks", + ], + "es-AR": [ + "\xA1Mir\xE1! \xA1Hay algo nuevo!", + "Ahora la web es a\xFAn m\xE1s accesible con nuestra nueva funcionalidad de traducci\xF3n integrada. \xA1Hac\xE9 clic en el bot\xF3n traducir para probarla!", + "Conoc\xE9 m\xE1s.", + "Gracias", + ], + "es-ES": [ + "\xA1Mira! \xA1Hay algo nuevo!", + "Con la nueva funcionalidad de traducci\xF3n integrada, ahora la Web es a\xFAn m\xE1s accesible. \xA1Pulsa el bot\xF3n Traducir y pru\xE9bala!", + "M\xE1s informaci\xF3n.", + "Gracias", + ], + pl: [ + "Sp\xF3jrz tutaj! To co\u015B nowego!", + "Sie\u0107 sta\u0142a si\u0119 w\u0142a\u015Bnie jeszcze bardziej dost\u0119pna dzi\u0119ki opcji bezpo\u015Bredniego t\u0142umaczenia stron. Kliknij przycisk t\u0142umaczenia, aby spr\xF3bowa\u0107!", + "Dowiedz si\u0119 wi\u0119cej", + "Dzi\u0119kuj\u0119", + ], + tr: [ + "Bak\u0131n, burada yeni bir \u015Fey var!", + "Yeni sayfa i\xE7i \xE7eviri \xF6zelli\u011Fimiz sayesinde Web art\u0131k \xE7ok daha anla\u015F\u0131l\u0131r olacak. Denemek i\xE7in \xC7evir d\xFC\u011Fmesine t\u0131klay\u0131n!", + "Daha fazla bilgi al\u0131n.", + "Te\u015Fekk\xFCrler", + ], + vi: [ + "Nh\xECn n\xE0y! \u0110\u1ED3 m\u1EDBi!", + "Gi\u1EDD \u0111\xE2y ch\xFAng ta c\xF3 th\u1EC3 ti\u1EBFp c\u1EADn web d\u1EC5 d\xE0ng h\u01A1n n\u1EEFa v\u1EDBi t\xEDnh n\u0103ng d\u1ECBch ngay trong trang. Hay nh\u1EA5n n\xFAt d\u1ECBch \u0111\u1EC3 th\u1EED!", + "T\xECm hi\u1EC3u th\xEAm.", + "C\u1EA3m \u01A1n", + ], + }; + + let locale = Services.locale.appLocaleAsBCP47; + if (!(locale in localizedStrings)) { + locale = "en"; + } + const strings = localizedStrings[locale]; + + this._getAnonElt("welcomeHeadline").setAttribute("value", strings[0]); + this._getAnonElt("welcomeBody").textContent = strings[1]; + this._getAnonElt("learnMore").setAttribute("value", strings[2]); + this._getAnonElt("thanksButton").setAttribute("label", strings[3]); + + // TODO: Figure out why this shows a strangely rendered popup at the corner of the window instead next to the URL bar + const panel = this._getAnonElt("welcomePanel"); + panel.openPopup( + this._getAnonElt("messageImage"), + "bottomcenter topleft", + ); + + Services.prefs.setBoolPref(kWelcomePref, true); + }, + { once: true }, + ); + */ + } + + _getAnonElt(anonId) { + return this.querySelector("[anonid=" + anonId + "]"); + } + + fromLanguageChanged() { + this.translation.fromLanguageChanged( + this._getSourceLang(), + this._getTargetLang(), + ); + this.translate(); + } + + toLanguageChanged() { + this.translation.toLanguageChanged( + this._getSourceLang(), + this._getTargetLang(), + ); + this.translate(); + } + + translate() { + const from = this._getSourceLang(); + const to = this._getTargetLang(); + + // Initiate translation + this.translation.translate(from, to); + + // Store the values used in the translation in the from and to inputs + if ( + this.translation.uiState.infobarState === + this.translation.TranslationInfoBarStates.STATE_OFFER + ) { + this._getAnonElt("fromLanguage").value = from; + this._getAnonElt("toLanguage").value = to; + } + } + + /** + * To be called when the infobar should be closed per user's wish (e.g. + * by clicking the notification's close button, the not now button or choosing never to translate) + */ + closeCommand() { + const from = this._getSourceLang(); + const to = this._getTargetLang(); + this.close(); + this.translation.infobarClosed(from, to); + } + + /** + * To be called when the infobar should be closed per user's wish + * by clicking the Not now button + */ + notNow() { + this.translation.notNow(this._getSourceLang(), this._getTargetLang()); + this.closeCommand(); + } + + _handleButtonHiding() { + const originalShown = this.translation.uiState.originalShown; + this._getAnonElt("showOriginal").hidden = originalShown; + this._getAnonElt("showTranslation").hidden = !originalShown; + } + + showOriginal() { + this.translation.showOriginalContent( + this._getSourceLang(), + this._getTargetLang(), + ); + this._handleButtonHiding(); + } + + showTranslation() { + this.translation.showTranslatedContent( + this._getSourceLang(), + this._getTargetLang(), + ); + this._handleButtonHiding(); + } + + _getSourceLang() { + let lang; + if ( + this.translation.uiState.infobarState === + this.translation.TranslationInfoBarStates.STATE_OFFER + ) { + lang = this._getAnonElt("detectedLanguage").value; + } else { + lang = this._getAnonElt("fromLanguage").value; + + // If we have never attempted to translate the page before the + // service became unavailable, "fromLanguage" isn't set. + if ( + !lang && + this.translation.uiState.infobarState === + this.translation.TranslationInfoBarStates.STATE_UNAVAILABLE + ) { + lang = this.translation.uiState.defaultTargetLanguage; + } + } + if (!lang) { + throw new Error("Source language is not defined"); + } + return lang; + } + + _getTargetLang() { + return ( + this._getAnonElt("toLanguage").value || + this.translation.uiState.defaultTargetLanguage + ); + } + + optionsShowing() { + const lang = this._getSourceLang(); + + // Get the source language name. + const langName = Services.intl.getLanguageDisplayNames(undefined, [ + lang, + ])[0]; + + // Set the label and accesskey on the menuitem. + const bundle = Services.strings.createBundle( + "chrome://browser/locale/translation.properties", + ); + let item = this._getAnonElt("neverForLanguage"); + const kStrId = "translation.options.neverForLanguage"; + item.setAttribute( + "label", + bundle.formatStringFromName(kStrId + ".label", [langName]), + ); + item.setAttribute( + "accesskey", + bundle.GetStringFromName(kStrId + ".accesskey"), + ); + + // We may need to disable the menuitems if they have already been used. + // Check if translation is already disabled for this language: + const neverForLangs = Services.prefs.getCharPref( + "browser.translation.neverForLanguages", + ); + item.disabled = neverForLangs.split(",").includes(lang); + + // Check if translation is disabled for the domain: + const principal = this.translation.browser.contentPrincipal; + const perms = Services.perms; + item = this._getAnonElt("neverForSite"); + item.disabled = + perms.testExactPermissionFromPrincipal(principal, "translate") === + perms.DENY_ACTION; + } + + neverForLanguage() { + const kPrefName = "browser.translation.neverForLanguages"; + const sourceLang = this._getSourceLang(); + + let val = Services.prefs.getCharPref(kPrefName); + if (val) { + val += ","; + } + val += sourceLang; + + Services.prefs.setCharPref(kPrefName, val); + + this.translation.neverForLanguage( + this._getSourceLang(), + this._getTargetLang(), + ); + this.closeCommand(); + } + + neverForSite() { + const principal = this.translation.browser.contentPrincipal; + const perms = Services.perms; + perms.addFromPrincipal(principal, "translate", perms.DENY_ACTION); + + this.translation.neverForSite(this._getSourceLang(), this._getTargetLang()); + this.closeCommand(); + } +}; + +customElements.define( + `translation-notification-${window.now}`, + window.MozTranslationNotification, + { + extends: "notification", + }, +); diff --git a/browser/extensions/translations/extension/experiment-apis/translateUi/schema.json b/browser/extensions/translations/extension/experiment-apis/translateUi/schema.json new file mode 100644 index 000000000000..508126b4c7e9 --- /dev/null +++ b/browser/extensions/translations/extension/experiment-apis/translateUi/schema.json @@ -0,0 +1,100 @@ +[ + { + "namespace": "experiments.translateUi", + "description": "Provides browser chrome UI that reacts to translation states and fires events on user interaction", + "functions": [ + { + "name": "start", + "type": "function", + "async": true, + "description": "Start reacting to translation state updates", + "parameters": [] + }, + { + "name": "setUiState", + "type": "function", + "async": true, + "description": "Set current ui state", + "parameters": [ + { + "name": "tabId", + "type": "number" + }, + { + "name": "uiState", + "type": "any" + } + ] + }, + { + "name": "stop", + "type": "function", + "async": true, + "description": "Stop reacting to translation state updates", + "parameters": [] + } + ], + "events": [ + { + "name": "onInfoBarDisplayed", + "type": "function", + "description": "Foo", + "parameters": [] + }, + { + "name": "onSelectTranslateTo", + "type": "function", + "description": "Foo", + "parameters": [] + }, + { + "name": "onSelectTranslateFrom", + "type": "function", + "description": "Foo", + "parameters": [] + }, + { + "name": "onInfoBarClosed", + "type": "function", + "description": "Foo", + "parameters": [] + }, + { + "name": "onNeverTranslateSelectedLanguage", + "type": "function", + "description": "Foo", + "parameters": [] + }, + { + "name": "onNeverTranslateThisSite", + "type": "function", + "description": "Foo", + "parameters": [] + }, + { + "name": "onShowOriginalButtonPressed", + "type": "function", + "description": "Foo", + "parameters": [] + }, + { + "name": "onShowTranslatedButtonPressed", + "type": "function", + "description": "Foo", + "parameters": [] + }, + { + "name": "onTranslateButtonPressed", + "type": "function", + "description": "Foo", + "parameters": [] + }, + { + "name": "onNotNowButtonPressed", + "type": "function", + "description": "Foo", + "parameters": [] + } + ] + } +] diff --git a/browser/extensions/translations/extension/icons/translation.16x16.png b/browser/extensions/translations/extension/icons/translation.16x16.png new file mode 100644 index 0000000000000000000000000000000000000000..bc843397f45afd1ae9d91640ff51172c204f2fc2 GIT binary patch literal 750 zcmVi>9LJ>Tb!RKIltA(nDJq*lRC=R!CuF6on6k1W{(vMe3oV5`rkJhm`E0 zm*^oBByxiyh={xtu8Ef-Em~Pu-T$0v&c7F3SR5G6IWu#raIm-J&ROiV+TXiPfE(5=p6y}x*^#hCX zB8-DX>JneeKo}!X$N2u--ed(N6$YoGIQJofIsW|RkHp}#1(Pe#KC&!}VY&t2XMhKg z)Lqv5uQ36TL6*YSq6}QAad9hvZG|SXxY!n^bL(>in2yMv$>Z)Pc0|HadV97>nprQWTXN>te%N$pX2@<}8sRhn!$!S1)heZYjFr%U zw`-~(CCE~K#U*PMl5ARuxAqy{>pzZ>B`>qGK~~cu^?N&4LE?5?tj)n_O9`t74VA8> zJxRfHH8{er?wJbT4co9!NPU!a2JMFAyG#^sG|{><54pT>^-q7s_8^%_3f?yLu=s0` zlwrIzJI3qCFu&<6PE+7{qZ=V!G<}ciC9`6UHWC1{?YAVCOtkH?}VY#kDWw{uMHci{?DqGi;#3p7y_tY(I28W$-VBYwHzq2OX(ILqAK-iJAzZwVnr)2me1gg_}{C^1R$ z^0VVZYXcM5cALOAgMu+EUU5&h>p%+;XmJYEwQ-cSa4b63;i-VJJR$f-dJ6VuKtSA( zAWbQIDQvrc0$ZEi1VR)BlLQP)Q1JP{V5~mffs#rm@-tMFHtX0~;q*};OQwN3ckZXh zFu~YfiQ#uj4cWz$r1(X8Z+IjatHBkh1)+1KrnTZMQ$FYuYY)Orv2}6!n49{E!+?0-GD%+EOeM zz8h{q8l3lr3I@c;=vwCweKw2m zobAHWNzigqfd6F3a*e;>Evw*`lE>o|WRs^G&$VOK@it7#He*nN2|7(LJY+{BZNf7R z8bwKUoeBgn?t<1dv`y2C)4y-%%%g7nami=XyX&{4Iw&Fq?g&JxosoQ;Jp5olh+EhD z2krQ?#(_tzG6pA_Ty{@U8hVOA*=tdIXnW=f&K+HH-9{9RNWocQ`K!_UB$q}Shiwj2 z+jTr-RWL5oj8+Q&hSP1hKZH^;A{;x$M7Z|Am&b3SvROmdx<8&Z^|?Cq zVu{IfDyH8yZh+1kn@Za2yu#!j4hjR;{mt~S!tV2;Vu%oFbhp9PF{Iu5`rV%&r$2;K)jnk;&R(`UE^!1kFZ;lD%Z8*loi#v zJrf9QAe7pWjGjrbPUF?nq4Tx$%io@G$dD#f%}pxtM<8)omB;ybD#eUhPlTg?yoxZh ze{U~I~d1(g#bX2$6{&kK#>T|+7FR@mAkd$X>`f%5}IE#!UbCO}Ac%QF#;GL3dxPFu4;2TM<`PB!Tu=v-; zo+DtOc469$5b~za@>)N%Pi)x``og%3Z*A!-K@4lle8=US>g}g^B_;jQd zTPNSH(9dOu8XqFQb)Yv$E4&mGf;4`nka_guxP=!yT>5ateR%zuNcZn@BDM2GE8ZL$ zg;TW-j4bkOF})@b2yqKaeH!%xaVoN6R5a0@;%_>Z#&JxDP!JI$" + ], + "all_frames": true, + "run_at": "document_idle", + "match_about_blank": false + }, + { + "js": [ + "dom-translation-content-script.js" + ], + "matches": [ + "" + ], + "all_frames": true, + "run_at": "document_idle", + "match_about_blank": false + } + ], + "permissions": [ + "", + "storage" + ], + "icons": { + "16": "icons/translation.16x16.png", + "32": "icons/translation.32x32.png" + }, + "hidden": false, + "experiment_apis": { + "extensionPreferences": { + "schema": "./experiment-apis/extensionPreferences/schema.json", + "parent": { + "scopes": [ + "addon_parent" + ], + "script": "./experiment-apis/extensionPreferences/api.js", + "paths": [ + [ + "experiments", + "extensionPreferences" + ] + ] + } + }, + "telemetryEnvironment": { + "schema": "./experiment-apis/telemetryEnvironment/schema.json", + "parent": { + "scopes": [ + "addon_parent" + ], + "script": "./experiment-apis/telemetryEnvironment/api.js", + "paths": [ + [ + "experiments", + "telemetryEnvironment" + ] + ] + } + }, + "telemetryPreferences": { + "schema": "./experiment-apis/telemetryPreferences/schema.json", + "parent": { + "scopes": [ + "addon_parent" + ], + "script": "./experiment-apis/telemetryPreferences/api.js", + "paths": [ + [ + "experiments", + "telemetryPreferences" + ] + ] + } + }, + "translateUi": { + "schema": "./experiment-apis/translateUi/schema.json", + "parent": { + "scopes": [ + "addon_parent" + ], + "script": "./experiment-apis/translateUi/api.js", + "paths": [ + [ + "experiments", + "translateUi" + ] + ] + } + } + }, + "applications": { + "gecko": { + "id": "firefox-translations@mozilla.org", + "strict_min_version": "90.0a1" + } + } +} diff --git a/browser/extensions/translations/extension/translation-worker.js b/browser/extensions/translations/extension/translation-worker.js new file mode 100644 index 000000000000..5cc5b0d38b96 --- /dev/null +++ b/browser/extensions/translations/extension/translation-worker.js @@ -0,0 +1,8574 @@ +/******/ (() => { // webpackBootstrap +/******/ "use strict"; +/******/ var __webpack_modules__ = ({ + +/***/ 964: +/*!*******************************!*\ + !*** ./src/core/ts/config.ts ***! + \*******************************/ +/***/ ((__unused_webpack_module, exports) => { + + +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.modelRegistry = exports.config = void 0; +const developmentBuild = "production" !== "production"; +exports.config = { + bergamotRestApiUrl: "http://127.0.0.1:8787", + useBergamotRestApi: "0" === "1", + sentryDsn: "https://@.ingest.sentry.io/", + bergamotModelsBaseUrl: developmentBuild + ? "http://0.0.0.0:4000/models" + : "https://storage.googleapis.com/bergamot-models-sandbox/0.2.0", + telemetryAppId: "org-mozilla-bergamot", + telemetryDebugMode: developmentBuild, + extensionBuildId: `${"v0.4.0"}-${"local"}#${"HEAD"}`, + supportedLanguagePairs: [ + // "German, French, Spanish, Polish, Czech, and Estonian in and out of English" + // ISO 639-1 codes + // Language pairs that are not available are commented out + // ["de","en"], + // ["fr","en"], + ["es", "en"], + // ["pl","en"], + // ["cs", "en"], + ["et", "en"], + ["en", "de"], + // ["en","fr"], + ["en", "es"], + // ["en","pl"], + // ["en", "cs"], + ["en", "et"], + ], + privacyNoticeUrl: "https://example.com/privacy-notice", + feedbackSurveyUrl: "https://qsurvey.mozilla.com/s3/bergamot-translate-product-feedback", +}; +exports.modelRegistry = { + esen: { + lex: { + name: "lex.50.50.esen.s2t.bin", + size: 3860888, + estimatedCompressedSize: 1978538, + expectedSha256Hash: "f11a2c23ef85ab1fee1c412b908d69bc20d66fd59faa8f7da5a5f0347eddf969", + }, + model: { + name: "model.esen.intgemm.alphas.bin", + size: 17140755, + estimatedCompressedSize: 13215960, + expectedSha256Hash: "4b6b7f451094aaa447d012658af158ffc708fc8842dde2f871a58404f5457fe0", + }, + vocab: { + name: "vocab.esen.spm", + size: 825463, + estimatedCompressedSize: 414566, + expectedSha256Hash: "909b1eea1face0d7f90a474fe29a8c0fef8d104b6e41e65616f864c964ba8845", + }, + }, + eten: { + lex: { + name: "lex.50.50.eten.s2t.bin", + size: 3974944, + estimatedCompressedSize: 1920655, + expectedSha256Hash: "6992bedc590e60e610a28129c80746fe5f33144a4520e2c5508d87db14ca54f8", + }, + model: { + name: "model.eten.intgemm.alphas.bin", + size: 17140754, + estimatedCompressedSize: 12222624, + expectedSha256Hash: "aac98a2371e216ee2d4843cbe896c617f6687501e17225ac83482eba52fd0028", + }, + vocab: { + name: "vocab.eten.spm", + size: 828426, + estimatedCompressedSize: 416995, + expectedSha256Hash: "e3b66bc141f6123cd40746e2fb9b8ee4f89cbf324ab27d6bbf3782e52f15fa2d", + }, + }, + ende: { + lex: { + name: "lex.50.50.ende.s2t.bin", + size: 3062492, + estimatedCompressedSize: 1575385, + expectedSha256Hash: "764797d075f0642c0b079cce6547348d65fe4e92ac69fa6a8605cd8b53dacb3f", + }, + model: { + name: "model.ende.intgemm.alphas.bin", + size: 17140498, + estimatedCompressedSize: 13207068, + expectedSha256Hash: "f0946515c6645304f0706fa66a051c3b7b7c507f12d0c850f276c18165a10c14", + }, + vocab: { + name: "vocab.deen.spm", + size: 797501, + estimatedCompressedSize: 412505, + expectedSha256Hash: "bc8f8229933d8294c727f3eab12f6f064e7082b929f2d29494c8a1e619ba174c", + }, + }, + enes: { + lex: { + name: "lex.50.50.enes.s2t.bin", + size: 3347104, + estimatedCompressedSize: 1720700, + expectedSha256Hash: "3a113d713dec3cf1d12bba5b138ae616e28bba4bbc7fe7fd39ba145e26b86d7f", + }, + model: { + name: "model.enes.intgemm.alphas.bin", + size: 17140755, + estimatedCompressedSize: 12602853, + expectedSha256Hash: "fa7460037a3163e03fe1d23602f964bff2331da6ee813637e092ddf37156ef53", + }, + vocab: { + name: "vocab.esen.spm", + size: 825463, + estimatedCompressedSize: 414566, + expectedSha256Hash: "909b1eea1face0d7f90a474fe29a8c0fef8d104b6e41e65616f864c964ba8845", + }, + }, + enet: { + lex: { + name: "lex.50.50.enet.s2t.bin", + size: 2700780, + estimatedCompressedSize: 1336443, + expectedSha256Hash: "3d1b40ff43ebef82cf98d416a88a1ea19eb325a85785eef102f59878a63a829d", + }, + model: { + name: "model.enet.intgemm.alphas.bin", + size: 17140754, + estimatedCompressedSize: 12543318, + expectedSha256Hash: "a28874a8b702a519a14dc71bcee726a5cb4b539eeaada2d06492f751469a1fd6", + }, + vocab: { + name: "vocab.eten.spm", + size: 828426, + estimatedCompressedSize: 416995, + expectedSha256Hash: "e3b66bc141f6123cd40746e2fb9b8ee4f89cbf324ab27d6bbf3782e52f15fa2d", + }, + }, +}; + + +/***/ }), + +/***/ 3662: +/*!********************************************************************************************!*\ + !*** ./src/core/ts/web-worker-scripts/translation-worker.js/bergamot-translator-worker.ts ***! + \********************************************************************************************/ +/***/ ((__unused_webpack_module, exports) => { + + +// @ts-nocheck +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.Module = exports.addOnPreMain = void 0; +// Note: The source code in this file is imported from bergamot-translator via +// the import-bergamot-translator.sh script in the root of this repo. +// Changes will be overwritten on each import! +var BERGAMOT_VERSION_FULL = "v0.3.1+d264450"; +function GROWABLE_HEAP_I8() { + if (wasmMemory.buffer != buffer) { + updateGlobalBufferAndViews(wasmMemory.buffer); + } + return HEAP8; +} +function GROWABLE_HEAP_U8() { + if (wasmMemory.buffer != buffer) { + updateGlobalBufferAndViews(wasmMemory.buffer); + } + return HEAPU8; +} +function GROWABLE_HEAP_I16() { + if (wasmMemory.buffer != buffer) { + updateGlobalBufferAndViews(wasmMemory.buffer); + } + return HEAP16; +} +function GROWABLE_HEAP_U16() { + if (wasmMemory.buffer != buffer) { + updateGlobalBufferAndViews(wasmMemory.buffer); + } + return HEAPU16; +} +function GROWABLE_HEAP_I32() { + if (wasmMemory.buffer != buffer) { + updateGlobalBufferAndViews(wasmMemory.buffer); + } + return HEAP32; +} +function GROWABLE_HEAP_U32() { + if (wasmMemory.buffer != buffer) { + updateGlobalBufferAndViews(wasmMemory.buffer); + } + return HEAPU32; +} +function GROWABLE_HEAP_F32() { + if (wasmMemory.buffer != buffer) { + updateGlobalBufferAndViews(wasmMemory.buffer); + } + return HEAPF32; +} +function GROWABLE_HEAP_F64() { + if (wasmMemory.buffer != buffer) { + updateGlobalBufferAndViews(wasmMemory.buffer); + } + return HEAPF64; +} +var Module = typeof Module !== "undefined" ? Module : {}; +exports.Module = Module; +var moduleOverrides = {}; +var key; +for (key in Module) { + if (Module.hasOwnProperty(key)) { + moduleOverrides[key] = Module[key]; + } +} +var arguments_ = []; +var thisProgram = "./this.program"; +var quit_ = function (status, toThrow) { + throw toThrow; +}; +var ENVIRONMENT_IS_WEB = false; +var ENVIRONMENT_IS_WORKER = false; +var ENVIRONMENT_IS_NODE = false; +var ENVIRONMENT_IS_SHELL = false; +ENVIRONMENT_IS_WEB = typeof window === "object"; +ENVIRONMENT_IS_WORKER = typeof importScripts === "function"; +ENVIRONMENT_IS_NODE = + typeof process === "object" && + typeof process.versions === "object" && + typeof process.versions.node === "string"; +ENVIRONMENT_IS_SHELL = + !ENVIRONMENT_IS_WEB && !ENVIRONMENT_IS_NODE && !ENVIRONMENT_IS_WORKER; +var ENVIRONMENT_IS_PTHREAD = Module["ENVIRONMENT_IS_PTHREAD"] || false; +if (ENVIRONMENT_IS_PTHREAD) { + buffer = Module["buffer"]; +} +var _scriptDir = typeof document !== "undefined" && document.currentScript + ? document.currentScript.src + : undefined; +if (ENVIRONMENT_IS_WORKER) { + _scriptDir = self.location.href; +} +var scriptDirectory = ""; +function locateFile(path) { + if (Module["locateFile"]) { + return Module["locateFile"](path, scriptDirectory); + } + return scriptDirectory + path; +} +var read_, readAsync, readBinary, setWindowTitle; +if (ENVIRONMENT_IS_WEB || ENVIRONMENT_IS_WORKER) { + if (ENVIRONMENT_IS_WORKER) { + scriptDirectory = self.location.href; + } + else if (typeof document !== "undefined" && document.currentScript) { + scriptDirectory = document.currentScript.src; + } + if (scriptDirectory.indexOf("blob:") !== 0) { + scriptDirectory = scriptDirectory.substr(0, scriptDirectory.lastIndexOf("/") + 1); + } + else { + scriptDirectory = ""; + } + { + read_ = function shell_read(url) { + var xhr = new XMLHttpRequest(); + xhr.open("GET", url, false); + xhr.send(null); + return xhr.responseText; + }; + if (ENVIRONMENT_IS_WORKER) { + readBinary = function readBinary(url) { + var xhr = new XMLHttpRequest(); + xhr.open("GET", url, false); + xhr.responseType = "arraybuffer"; + xhr.send(null); + return new Uint8Array(xhr.response); + }; + } + readAsync = function readAsync(url, onload, onerror) { + var xhr = new XMLHttpRequest(); + xhr.open("GET", url, true); + xhr.responseType = "arraybuffer"; + xhr.onload = function xhr_onload() { + if (xhr.status == 200 || (xhr.status == 0 && xhr.response)) { + onload(xhr.response); + return; + } + onerror(); + }; + xhr.onerror = onerror; + xhr.send(null); + }; + } + setWindowTitle = function (title) { + document.title = title; + }; +} +else { +} +var out = Module["print"] || console.log.bind(console); +var err = Module["printErr"] || console.warn.bind(console); +for (key in moduleOverrides) { + if (moduleOverrides.hasOwnProperty(key)) { + Module[key] = moduleOverrides[key]; + } +} +moduleOverrides = null; +if (Module["arguments"]) + arguments_ = Module["arguments"]; +if (Module["thisProgram"]) + thisProgram = Module["thisProgram"]; +if (Module["quit"]) + quit_ = Module["quit"]; +var STACK_ALIGN = 16; +function alignMemory(size, factor) { + if (!factor) + factor = STACK_ALIGN; + return Math.ceil(size / factor) * factor; +} +function warnOnce(text) { + if (!warnOnce.shown) + warnOnce.shown = {}; + if (!warnOnce.shown[text]) { + warnOnce.shown[text] = 1; + err(text); + } +} +function convertJsFunctionToWasm(func, sig) { + if (typeof WebAssembly.Function === "function") { + var typeNames = { + i: "i32", + j: "i64", + f: "f32", + d: "f64", + }; + var type = { + parameters: [], + results: sig[0] == "v" ? [] : [typeNames[sig[0]]], + }; + for (var i = 1; i < sig.length; ++i) { + type.parameters.push(typeNames[sig[i]]); + } + return new WebAssembly.Function(type, func); + } + var typeSection = [1, 0, 1, 96]; + var sigRet = sig.slice(0, 1); + var sigParam = sig.slice(1); + var typeCodes = { + i: 127, + j: 126, + f: 125, + d: 124, + }; + typeSection.push(sigParam.length); + for (var i = 0; i < sigParam.length; ++i) { + typeSection.push(typeCodes[sigParam[i]]); + } + if (sigRet == "v") { + typeSection.push(0); + } + else { + typeSection = typeSection.concat([1, typeCodes[sigRet]]); + } + typeSection[1] = typeSection.length - 2; + var bytes = new Uint8Array([0, 97, 115, 109, 1, 0, 0, 0].concat(typeSection, [ + 2, + 7, + 1, + 1, + 101, + 1, + 102, + 0, + 0, + 7, + 5, + 1, + 1, + 102, + 0, + 0, + ])); + var module = new WebAssembly.Module(bytes, { simdWormhole: true }); + var instance = new WebAssembly.Instance(module, { + e: { + f: func, + }, + }); + var wrappedFunc = instance.exports["f"]; + return wrappedFunc; +} +var freeTableIndexes = (/* unused pure expression or super */ null && ([])); +var functionsInTableMap; +function getEmptyTableSlot() { + if (freeTableIndexes.length) { + return freeTableIndexes.pop(); + } + try { + wasmTable.grow(1); + } + catch (err) { + if (!(err instanceof RangeError)) { + throw err; + } + throw "Unable to grow wasm table. Set ALLOW_TABLE_GROWTH."; + } + return wasmTable.length - 1; +} +function addFunctionWasm(func, sig) { + if (!functionsInTableMap) { + functionsInTableMap = new WeakMap(); + for (var i = 0; i < wasmTable.length; i++) { + var item = wasmTable.get(i); + if (item) { + functionsInTableMap.set(item, i); + } + } + } + if (functionsInTableMap.has(func)) { + return functionsInTableMap.get(func); + } + var ret = getEmptyTableSlot(); + try { + wasmTable.set(ret, func); + } + catch (err) { + if (!(err instanceof TypeError)) { + throw err; + } + var wrapped = convertJsFunctionToWasm(func, sig); + wasmTable.set(ret, wrapped); + } + functionsInTableMap.set(func, ret); + return ret; +} +var tempRet0 = 0; +var setTempRet0 = function (value) { + tempRet0 = value; +}; +var Atomics_load = Atomics.load; +var Atomics_store = Atomics.store; +var Atomics_compareExchange = Atomics.compareExchange; +var wasmBinary; +if (Module["wasmBinary"]) + wasmBinary = Module["wasmBinary"]; +var noExitRuntime; +if (Module["noExitRuntime"]) + noExitRuntime = Module["noExitRuntime"]; +if (typeof WebAssembly !== "object") { + abort("no native wasm support detected"); +} +var wasmMemory; +var wasmModule; +var threadInfoStruct = 0; +var selfThreadId = 0; +var ABORT = false; +var EXITSTATUS = 0; +function assert(condition, text) { + if (!condition) { + abort("Assertion failed: " + text); + } +} +function getCFunc(ident) { + var func = Module["_" + ident]; + assert(func, "Cannot call unknown function " + ident + ", make sure it is exported"); + return func; +} +function ccall(ident, returnType, argTypes, args, opts) { + var toC = { + string: function (str) { + var ret = 0; + if (str !== null && str !== undefined && str !== 0) { + var len = (str.length << 2) + 1; + ret = stackAlloc(len); + stringToUTF8(str, ret, len); + } + return ret; + }, + array: function (arr) { + var ret = stackAlloc(arr.length); + writeArrayToMemory(arr, ret); + return ret; + }, + }; + function convertReturnValue(ret) { + if (returnType === "string") + return UTF8ToString(ret); + if (returnType === "boolean") + return Boolean(ret); + return ret; + } + var func = getCFunc(ident); + var cArgs = []; + var stack = 0; + if (args) { + for (var i = 0; i < args.length; i++) { + var converter = toC[argTypes[i]]; + if (converter) { + if (stack === 0) + stack = stackSave(); + cArgs[i] = converter(args[i]); + } + else { + cArgs[i] = args[i]; + } + } + } + var ret = func.apply(null, cArgs); + ret = convertReturnValue(ret); + if (stack !== 0) + stackRestore(stack); + return ret; +} +var ALLOC_STACK = 1; +function UTF8ArrayToString(heap, idx, maxBytesToRead) { + var endIdx = idx + maxBytesToRead; + var str = ""; + while (!(idx >= endIdx)) { + var u0 = heap[idx++]; + if (!u0) + return str; + if (!(u0 & 128)) { + str += String.fromCharCode(u0); + continue; + } + var u1 = heap[idx++] & 63; + if ((u0 & 224) == 192) { + str += String.fromCharCode(((u0 & 31) << 6) | u1); + continue; + } + var u2 = heap[idx++] & 63; + if ((u0 & 240) == 224) { + u0 = ((u0 & 15) << 12) | (u1 << 6) | u2; + } + else { + u0 = ((u0 & 7) << 18) | (u1 << 12) | (u2 << 6) | (heap[idx++] & 63); + } + if (u0 < 65536) { + str += String.fromCharCode(u0); + } + else { + var ch = u0 - 65536; + str += String.fromCharCode(55296 | (ch >> 10), 56320 | (ch & 1023)); + } + } + return str; +} +function UTF8ToString(ptr, maxBytesToRead) { + return ptr ? UTF8ArrayToString(GROWABLE_HEAP_U8(), ptr, maxBytesToRead) : ""; +} +function stringToUTF8Array(str, heap, outIdx, maxBytesToWrite) { + if (!(maxBytesToWrite > 0)) + return 0; + var startIdx = outIdx; + var endIdx = outIdx + maxBytesToWrite - 1; + for (var i = 0; i < str.length; ++i) { + var u = str.charCodeAt(i); + if (u >= 55296 && u <= 57343) { + var u1 = str.charCodeAt(++i); + u = (65536 + ((u & 1023) << 10)) | (u1 & 1023); + } + if (u <= 127) { + if (outIdx >= endIdx) + break; + heap[outIdx++] = u; + } + else if (u <= 2047) { + if (outIdx + 1 >= endIdx) + break; + heap[outIdx++] = 192 | (u >> 6); + heap[outIdx++] = 128 | (u & 63); + } + else if (u <= 65535) { + if (outIdx + 2 >= endIdx) + break; + heap[outIdx++] = 224 | (u >> 12); + heap[outIdx++] = 128 | ((u >> 6) & 63); + heap[outIdx++] = 128 | (u & 63); + } + else { + if (outIdx + 3 >= endIdx) + break; + heap[outIdx++] = 240 | (u >> 18); + heap[outIdx++] = 128 | ((u >> 12) & 63); + heap[outIdx++] = 128 | ((u >> 6) & 63); + heap[outIdx++] = 128 | (u & 63); + } + } + heap[outIdx] = 0; + return outIdx - startIdx; +} +function stringToUTF8(str, outPtr, maxBytesToWrite) { + return stringToUTF8Array(str, GROWABLE_HEAP_U8(), outPtr, maxBytesToWrite); +} +function lengthBytesUTF8(str) { + var len = 0; + for (var i = 0; i < str.length; ++i) { + var u = str.charCodeAt(i); + if (u >= 55296 && u <= 57343) + u = (65536 + ((u & 1023) << 10)) | (str.charCodeAt(++i) & 1023); + if (u <= 127) + ++len; + else if (u <= 2047) + len += 2; + else if (u <= 65535) + len += 3; + else + len += 4; + } + return len; +} +function UTF16ToString(ptr, maxBytesToRead) { + var str = ""; + for (var i = 0; !(i >= maxBytesToRead / 2); ++i) { + var codeUnit = GROWABLE_HEAP_I16()[(ptr + i * 2) >> 1]; + if (codeUnit == 0) + break; + str += String.fromCharCode(codeUnit); + } + return str; +} +function stringToUTF16(str, outPtr, maxBytesToWrite) { + if (maxBytesToWrite === undefined) { + maxBytesToWrite = 2147483647; + } + if (maxBytesToWrite < 2) + return 0; + maxBytesToWrite -= 2; + var startPtr = outPtr; + var numCharsToWrite = maxBytesToWrite < str.length * 2 ? maxBytesToWrite / 2 : str.length; + for (var i = 0; i < numCharsToWrite; ++i) { + var codeUnit = str.charCodeAt(i); + GROWABLE_HEAP_I16()[outPtr >> 1] = codeUnit; + outPtr += 2; + } + GROWABLE_HEAP_I16()[outPtr >> 1] = 0; + return outPtr - startPtr; +} +function lengthBytesUTF16(str) { + return str.length * 2; +} +function UTF32ToString(ptr, maxBytesToRead) { + var i = 0; + var str = ""; + while (!(i >= maxBytesToRead / 4)) { + var utf32 = GROWABLE_HEAP_I32()[(ptr + i * 4) >> 2]; + if (utf32 == 0) + break; + ++i; + if (utf32 >= 65536) { + var ch = utf32 - 65536; + str += String.fromCharCode(55296 | (ch >> 10), 56320 | (ch & 1023)); + } + else { + str += String.fromCharCode(utf32); + } + } + return str; +} +function stringToUTF32(str, outPtr, maxBytesToWrite) { + if (maxBytesToWrite === undefined) { + maxBytesToWrite = 2147483647; + } + if (maxBytesToWrite < 4) + return 0; + var startPtr = outPtr; + var endPtr = startPtr + maxBytesToWrite - 4; + for (var i = 0; i < str.length; ++i) { + var codeUnit = str.charCodeAt(i); + if (codeUnit >= 55296 && codeUnit <= 57343) { + var trailSurrogate = str.charCodeAt(++i); + codeUnit = (65536 + ((codeUnit & 1023) << 10)) | (trailSurrogate & 1023); + } + GROWABLE_HEAP_I32()[outPtr >> 2] = codeUnit; + outPtr += 4; + if (outPtr + 4 > endPtr) + break; + } + GROWABLE_HEAP_I32()[outPtr >> 2] = 0; + return outPtr - startPtr; +} +function lengthBytesUTF32(str) { + var len = 0; + for (var i = 0; i < str.length; ++i) { + var codeUnit = str.charCodeAt(i); + if (codeUnit >= 55296 && codeUnit <= 57343) + ++i; + len += 4; + } + return len; +} +function allocateUTF8(str) { + var size = lengthBytesUTF8(str) + 1; + var ret = _malloc(size); + if (ret) + stringToUTF8Array(str, GROWABLE_HEAP_I8(), ret, size); + return ret; +} +function writeArrayToMemory(array, buffer) { + GROWABLE_HEAP_I8().set(array, buffer); +} +function writeAsciiToMemory(str, buffer, dontAddNull) { + for (var i = 0; i < str.length; ++i) { + GROWABLE_HEAP_I8()[buffer++ >> 0] = str.charCodeAt(i); + } + if (!dontAddNull) + GROWABLE_HEAP_I8()[buffer >> 0] = 0; +} +function alignUp(x, multiple) { + if (x % multiple > 0) { + x += multiple - (x % multiple); + } + return x; +} +var buffer, HEAP8, HEAPU8, HEAP16, HEAPU16, HEAP32, HEAPU32, HEAPF32, HEAPF64; +function updateGlobalBufferAndViews(buf) { + buffer = buf; + Module["HEAP8"] = HEAP8 = new Int8Array(buf); + Module["HEAP16"] = HEAP16 = new Int16Array(buf); + Module["HEAP32"] = HEAP32 = new Int32Array(buf); + Module["HEAPU8"] = HEAPU8 = new Uint8Array(buf); + Module["HEAPU16"] = HEAPU16 = new Uint16Array(buf); + Module["HEAPU32"] = HEAPU32 = new Uint32Array(buf); + Module["HEAPF32"] = HEAPF32 = new Float32Array(buf); + Module["HEAPF64"] = HEAPF64 = new Float64Array(buf); +} +var INITIAL_MEMORY = Module["INITIAL_MEMORY"] || 16777216; +if (ENVIRONMENT_IS_PTHREAD) { + wasmMemory = Module["wasmMemory"]; + buffer = Module["buffer"]; +} +else { + if (Module["wasmMemory"]) { + wasmMemory = Module["wasmMemory"]; + } + else { + wasmMemory = new WebAssembly.Memory({ + initial: INITIAL_MEMORY / 65536, + maximum: 2147483648 / 65536, + shared: true, + }); + if (!(wasmMemory.buffer instanceof SharedArrayBuffer)) { + err("requested a shared WebAssembly.Memory but the returned buffer is not a SharedArrayBuffer, indicating that while the browser has SharedArrayBuffer it does not have WebAssembly threads support - you may need to set a flag"); + if (ENVIRONMENT_IS_NODE) { + console.log("(on node you may need: --experimental-wasm-threads --experimental-wasm-bulk-memory and also use a recent version)"); + } + throw Error("bad memory"); + } + } +} +if (wasmMemory) { + buffer = wasmMemory.buffer; +} +INITIAL_MEMORY = buffer.byteLength; +updateGlobalBufferAndViews(buffer); +var wasmTable; +var __ATPRERUN__ = []; +var __ATINIT__ = []; +var __ATMAIN__ = []; +var __ATEXIT__ = []; +var __ATPOSTRUN__ = []; +var runtimeInitialized = false; +var runtimeExited = false; +if (ENVIRONMENT_IS_PTHREAD) + runtimeInitialized = true; +function preRun() { + if (ENVIRONMENT_IS_PTHREAD) + return; + if (Module["preRun"]) { + if (typeof Module["preRun"] == "function") + Module["preRun"] = [Module["preRun"]]; + while (Module["preRun"].length) { + addOnPreRun(Module["preRun"].shift()); + } + } + callRuntimeCallbacks(__ATPRERUN__); +} +function initRuntime() { + runtimeInitialized = true; + if (!Module["noFSInit"] && !FS.init.initialized) + FS.init(); + TTY.init(); + callRuntimeCallbacks(__ATINIT__); +} +function preMain() { + if (ENVIRONMENT_IS_PTHREAD) + return; + FS.ignorePermissions = false; + callRuntimeCallbacks(__ATMAIN__); +} +function exitRuntime() { + if (ENVIRONMENT_IS_PTHREAD) + return; + runtimeExited = true; +} +function postRun() { + if (ENVIRONMENT_IS_PTHREAD) + return; + if (Module["postRun"]) { + if (typeof Module["postRun"] == "function") + Module["postRun"] = [Module["postRun"]]; + while (Module["postRun"].length) { + addOnPostRun(Module["postRun"].shift()); + } + } + callRuntimeCallbacks(__ATPOSTRUN__); +} +function addOnPreRun(cb) { + __ATPRERUN__.unshift(cb); +} +function addOnPreMain(cb) { + __ATMAIN__.unshift(cb); +} +exports.addOnPreMain = addOnPreMain; +function addOnPostRun(cb) { + __ATPOSTRUN__.unshift(cb); +} +var runDependencies = 0; +var runDependencyWatcher = null; +var dependenciesFulfilled = null; +function getUniqueRunDependency(id) { + return id; +} +function addRunDependency(id) { + assert(!ENVIRONMENT_IS_PTHREAD, "addRunDependency cannot be used in a pthread worker"); + runDependencies++; + if (Module["monitorRunDependencies"]) { + Module["monitorRunDependencies"](runDependencies); + } +} +function removeRunDependency(id) { + runDependencies--; + if (Module["monitorRunDependencies"]) { + Module["monitorRunDependencies"](runDependencies); + } + if (runDependencies == 0) { + if (runDependencyWatcher !== null) { + clearInterval(runDependencyWatcher); + runDependencyWatcher = null; + } + if (dependenciesFulfilled) { + var callback = dependenciesFulfilled; + dependenciesFulfilled = null; + callback(); + } + } +} +Module["preloadedImages"] = {}; +Module["preloadedAudios"] = {}; +function abort(what) { + if (Module["onAbort"]) { + Module["onAbort"](what); + } + if (ENVIRONMENT_IS_PTHREAD) + console.error("Pthread aborting at " + new Error().stack); + what += ""; + err(what); + ABORT = true; + EXITSTATUS = 1; + what = "abort(" + what + "). Build with -s ASSERTIONS=1 for more info."; + var e = new WebAssembly.RuntimeError(what); + throw e; +} +function hasPrefix(str, prefix) { + return String.prototype.startsWith + ? str.startsWith(prefix) + : str.indexOf(prefix) === 0; +} +var dataURIPrefix = "data:application/octet-stream;base64,"; +function isDataURI(filename) { + return hasPrefix(filename, dataURIPrefix); +} +var fileURIPrefix = "file://"; +var wasmBinaryFile = "wasm/bergamot-translator-worker.wasm"; +if (!isDataURI(wasmBinaryFile)) { + wasmBinaryFile = locateFile(wasmBinaryFile); +} +function getBinary() { + try { + if (wasmBinary) { + return new Uint8Array(wasmBinary); + } + if (readBinary) { + return readBinary(wasmBinaryFile); + } + else { + throw "both async and sync fetching of the wasm failed"; + } + } + catch (err) { + abort(err); + } +} +function getBinaryPromise() { + if (!wasmBinary && + (ENVIRONMENT_IS_WEB || ENVIRONMENT_IS_WORKER) && + typeof fetch === "function") { + return fetch(wasmBinaryFile, { + credentials: "same-origin", + }) + .then(function (response) { + if (!response["ok"]) { + throw "failed to load wasm binary file at '" + wasmBinaryFile + "'"; + } + return response["arrayBuffer"](); + }) + .catch(function () { + return getBinary(); + }); + } + return Promise.resolve().then(getBinary); +} +function createWasm() { + var info = { + env: asmLibraryArg, + wasi_snapshot_preview1: asmLibraryArg, + }; + function receiveInstance(instance, module) { + var exports = instance.exports; + Module["asm"] = exports; + wasmTable = Module["asm"]["__indirect_function_table"]; + wasmModule = module; + if (!ENVIRONMENT_IS_PTHREAD) { + removeRunDependency("wasm-instantiate"); + } + } + if (!ENVIRONMENT_IS_PTHREAD) { + addRunDependency("wasm-instantiate"); + } + function receiveInstantiatedSource(output) { + receiveInstance(output["instance"], output["module"]); + } + function instantiateArrayBuffer(receiver) { + return getBinaryPromise() + .then(function (binary) { + return WebAssembly.instantiate(binary, info, { simdWormhole: true }); + }) + .then(receiver, function (reason) { + err("failed to asynchronously prepare wasm: " + reason); + abort(reason); + }); + } + function instantiateAsync() { + if (!wasmBinary && + typeof WebAssembly.instantiateStreaming === "function" && + !isDataURI(wasmBinaryFile) && + typeof fetch === "function") { + return fetch(wasmBinaryFile, { + credentials: "same-origin", + }).then(function (response) { + var result = WebAssembly.instantiateStreaming(response, info, { + simdWormhole: true, + }); + return result.then(receiveInstantiatedSource, function (reason) { + err("wasm streaming compile failed: " + reason); + err("falling back to ArrayBuffer instantiation"); + return instantiateArrayBuffer(receiveInstantiatedSource); + }); + }); + } + else { + return instantiateArrayBuffer(receiveInstantiatedSource); + } + } + if (Module["instantiateWasm"]) { + try { + var exports = Module["instantiateWasm"](info, receiveInstance); + return exports; + } + catch (e) { + err("Module.instantiateWasm callback failed with error: " + e); + return false; + } + } + instantiateAsync(); + return {}; +} +var tempDouble; +var tempI64; +var ASM_CONSTS = { + 1467408: function () { + throw "Canceled!"; + }, + 1467630: function ($0, $1) { + setTimeout(function () { + _do_emscripten_dispatch_to_thread($0, $1); + }, 0); + }, +}; +function initPthreadsJS() { + PThread.initRuntime(); +} +function callRuntimeCallbacks(callbacks) { + while (callbacks.length > 0) { + var callback = callbacks.shift(); + if (typeof callback == "function") { + callback(Module); + continue; + } + var func = callback.func; + if (typeof func === "number") { + if (callback.arg === undefined) { + wasmTable.get(func)(); + } + else { + wasmTable.get(func)(callback.arg); + } + } + else { + func(callback.arg === undefined ? null : callback.arg); + } + } +} +function demangle(func) { + return func; +} +function demangleAll(text) { + var regex = /\b_Z[\w\d_]+/g; + return text.replace(regex, function (x) { + var y = demangle(x); + return x === y ? x : y + " [" + x + "]"; + }); +} +function dynCallLegacy(sig, ptr, args) { + if (args && args.length) { + return Module["dynCall_" + sig].apply(null, [ptr].concat(args)); + } + return Module["dynCall_" + sig].call(null, ptr); +} +function dynCall(sig, ptr, args) { + if (sig.indexOf("j") != -1) { + return dynCallLegacy(sig, ptr, args); + } + return wasmTable.get(ptr).apply(null, args); +} +Module["dynCall"] = dynCall; +var __pthread_ptr = 0; +var __pthread_is_main_runtime_thread = 0; +var __pthread_is_main_browser_thread = 0; +function registerPthreadPtr(pthreadPtr, isMainBrowserThread, isMainRuntimeThread) { + pthreadPtr = pthreadPtr | 0; + isMainBrowserThread = isMainBrowserThread | 0; + isMainRuntimeThread = isMainRuntimeThread | 0; + __pthread_ptr = pthreadPtr; + __pthread_is_main_browser_thread = isMainBrowserThread; + __pthread_is_main_runtime_thread = isMainRuntimeThread; +} +Module["registerPthreadPtr"] = registerPthreadPtr; +var ERRNO_CODES = { + EPERM: 63, + ENOENT: 44, + ESRCH: 71, + EINTR: 27, + EIO: 29, + ENXIO: 60, + E2BIG: 1, + ENOEXEC: 45, + EBADF: 8, + ECHILD: 12, + EAGAIN: 6, + EWOULDBLOCK: 6, + ENOMEM: 48, + EACCES: 2, + EFAULT: 21, + ENOTBLK: 105, + EBUSY: 10, + EEXIST: 20, + EXDEV: 75, + ENODEV: 43, + ENOTDIR: 54, + EISDIR: 31, + EINVAL: 28, + ENFILE: 41, + EMFILE: 33, + ENOTTY: 59, + ETXTBSY: 74, + EFBIG: 22, + ENOSPC: 51, + ESPIPE: 70, + EROFS: 69, + EMLINK: 34, + EPIPE: 64, + EDOM: 18, + ERANGE: 68, + ENOMSG: 49, + EIDRM: 24, + ECHRNG: 106, + EL2NSYNC: 156, + EL3HLT: 107, + EL3RST: 108, + ELNRNG: 109, + EUNATCH: 110, + ENOCSI: 111, + EL2HLT: 112, + EDEADLK: 16, + ENOLCK: 46, + EBADE: 113, + EBADR: 114, + EXFULL: 115, + ENOANO: 104, + EBADRQC: 103, + EBADSLT: 102, + EDEADLOCK: 16, + EBFONT: 101, + ENOSTR: 100, + ENODATA: 116, + ETIME: 117, + ENOSR: 118, + ENONET: 119, + ENOPKG: 120, + EREMOTE: 121, + ENOLINK: 47, + EADV: 122, + ESRMNT: 123, + ECOMM: 124, + EPROTO: 65, + EMULTIHOP: 36, + EDOTDOT: 125, + EBADMSG: 9, + ENOTUNIQ: 126, + EBADFD: 127, + EREMCHG: 128, + ELIBACC: 129, + ELIBBAD: 130, + ELIBSCN: 131, + ELIBMAX: 132, + ELIBEXEC: 133, + ENOSYS: 52, + ENOTEMPTY: 55, + ENAMETOOLONG: 37, + ELOOP: 32, + EOPNOTSUPP: 138, + EPFNOSUPPORT: 139, + ECONNRESET: 15, + ENOBUFS: 42, + EAFNOSUPPORT: 5, + EPROTOTYPE: 67, + ENOTSOCK: 57, + ENOPROTOOPT: 50, + ESHUTDOWN: 140, + ECONNREFUSED: 14, + EADDRINUSE: 3, + ECONNABORTED: 13, + ENETUNREACH: 40, + ENETDOWN: 38, + ETIMEDOUT: 73, + EHOSTDOWN: 142, + EHOSTUNREACH: 23, + EINPROGRESS: 26, + EALREADY: 7, + EDESTADDRREQ: 17, + EMSGSIZE: 35, + EPROTONOSUPPORT: 66, + ESOCKTNOSUPPORT: 137, + EADDRNOTAVAIL: 4, + ENETRESET: 39, + EISCONN: 30, + ENOTCONN: 53, + ETOOMANYREFS: 141, + EUSERS: 136, + EDQUOT: 19, + ESTALE: 72, + ENOTSUP: 138, + ENOMEDIUM: 148, + EILSEQ: 25, + EOVERFLOW: 61, + ECANCELED: 11, + ENOTRECOVERABLE: 56, + EOWNERDEAD: 62, + ESTRPIPE: 135, +}; +function _emscripten_futex_wake(addr, count) { + if (addr <= 0 || + addr > GROWABLE_HEAP_I8().length || + addr & (3 != 0) || + count < 0) + return -28; + if (count == 0) + return 0; + if (count >= 2147483647) + count = Infinity; + var mainThreadWaitAddress = Atomics.load(GROWABLE_HEAP_I32(), PThread.mainThreadFutex >> 2); + var mainThreadWoken = 0; + if (mainThreadWaitAddress == addr) { + var loadedAddr = Atomics.compareExchange(GROWABLE_HEAP_I32(), PThread.mainThreadFutex >> 2, mainThreadWaitAddress, 0); + if (loadedAddr == mainThreadWaitAddress) { + --count; + mainThreadWoken = 1; + if (count <= 0) + return 1; + } + } + var ret = Atomics.notify(GROWABLE_HEAP_I32(), addr >> 2, count); + if (ret >= 0) + return ret + mainThreadWoken; + throw "Atomics.notify returned an unexpected value " + ret; +} +Module["_emscripten_futex_wake"] = _emscripten_futex_wake; +function killThread(pthread_ptr) { + if (ENVIRONMENT_IS_PTHREAD) + throw "Internal Error! killThread() can only ever be called from main application thread!"; + if (!pthread_ptr) + throw "Internal Error! Null pthread_ptr in killThread!"; + GROWABLE_HEAP_I32()[(pthread_ptr + 12) >> 2] = 0; + var pthread = PThread.pthreads[pthread_ptr]; + pthread.worker.terminate(); + PThread.freeThreadData(pthread); + PThread.runningWorkers.splice(PThread.runningWorkers.indexOf(pthread.worker), 1); + pthread.worker.pthread = undefined; +} +function cancelThread(pthread_ptr) { + if (ENVIRONMENT_IS_PTHREAD) + throw "Internal Error! cancelThread() can only ever be called from main application thread!"; + if (!pthread_ptr) + throw "Internal Error! Null pthread_ptr in cancelThread!"; + var pthread = PThread.pthreads[pthread_ptr]; + pthread.worker.postMessage({ + cmd: "cancel", + }); +} +function cleanupThread(pthread_ptr) { + if (ENVIRONMENT_IS_PTHREAD) + throw "Internal Error! cleanupThread() can only ever be called from main application thread!"; + if (!pthread_ptr) + throw "Internal Error! Null pthread_ptr in cleanupThread!"; + GROWABLE_HEAP_I32()[(pthread_ptr + 12) >> 2] = 0; + var pthread = PThread.pthreads[pthread_ptr]; + if (pthread) { + var worker = pthread.worker; + PThread.returnWorkerToPool(worker); + } +} +var PThread = { + MAIN_THREAD_ID: 1, + mainThreadInfo: { + schedPolicy: 0, + schedPrio: 0, + }, + unusedWorkers: [], + runningWorkers: [], + initMainThreadBlock: function () { }, + initRuntime: function () { + PThread.mainThreadBlock = _malloc(232); + for (var i = 0; i < 232 / 4; ++i) + GROWABLE_HEAP_U32()[PThread.mainThreadBlock / 4 + i] = 0; + GROWABLE_HEAP_I32()[(PThread.mainThreadBlock + 12) >> 2] = + PThread.mainThreadBlock; + var headPtr = PThread.mainThreadBlock + 156; + GROWABLE_HEAP_I32()[headPtr >> 2] = headPtr; + var tlsMemory = _malloc(512); + for (var i = 0; i < 128; ++i) + GROWABLE_HEAP_U32()[tlsMemory / 4 + i] = 0; + Atomics.store(GROWABLE_HEAP_U32(), (PThread.mainThreadBlock + 104) >> 2, tlsMemory); + Atomics.store(GROWABLE_HEAP_U32(), (PThread.mainThreadBlock + 40) >> 2, PThread.mainThreadBlock); + Atomics.store(GROWABLE_HEAP_U32(), (PThread.mainThreadBlock + 44) >> 2, 42); + PThread.initShared(); + registerPthreadPtr(PThread.mainThreadBlock, !ENVIRONMENT_IS_WORKER, 1); + _emscripten_register_main_browser_thread_id(PThread.mainThreadBlock); + }, + initWorker: function () { + PThread.initShared(); + }, + initShared: function () { + PThread.mainThreadFutex = _main_thread_futex; + }, + pthreads: {}, + threadExitHandlers: [], + setThreadStatus: function () { }, + runExitHandlers: function () { + while (PThread.threadExitHandlers.length > 0) { + PThread.threadExitHandlers.pop()(); + } + if (ENVIRONMENT_IS_PTHREAD && threadInfoStruct) + ___pthread_tsd_run_dtors(); + }, + threadExit: function (exitCode) { + var tb = _pthread_self(); + if (tb) { + Atomics.store(GROWABLE_HEAP_U32(), (tb + 4) >> 2, exitCode); + Atomics.store(GROWABLE_HEAP_U32(), (tb + 0) >> 2, 1); + Atomics.store(GROWABLE_HEAP_U32(), (tb + 60) >> 2, 1); + Atomics.store(GROWABLE_HEAP_U32(), (tb + 64) >> 2, 0); + PThread.runExitHandlers(); + _emscripten_futex_wake(tb + 0, 2147483647); + registerPthreadPtr(0, 0, 0); + threadInfoStruct = 0; + if (ENVIRONMENT_IS_PTHREAD) { + postMessage({ + cmd: "exit", + }); + } + } + }, + threadCancel: function () { + PThread.runExitHandlers(); + Atomics.store(GROWABLE_HEAP_U32(), (threadInfoStruct + 4) >> 2, -1); + Atomics.store(GROWABLE_HEAP_U32(), (threadInfoStruct + 0) >> 2, 1); + _emscripten_futex_wake(threadInfoStruct + 0, 2147483647); + threadInfoStruct = selfThreadId = 0; + registerPthreadPtr(0, 0, 0); + postMessage({ + cmd: "cancelDone", + }); + }, + terminateAllThreads: function () { + for (var t in PThread.pthreads) { + var pthread = PThread.pthreads[t]; + if (pthread && pthread.worker) { + PThread.returnWorkerToPool(pthread.worker); + } + } + PThread.pthreads = {}; + for (var i = 0; i < PThread.unusedWorkers.length; ++i) { + var worker = PThread.unusedWorkers[i]; + worker.terminate(); + } + PThread.unusedWorkers = []; + for (var i = 0; i < PThread.runningWorkers.length; ++i) { + var worker = PThread.runningWorkers[i]; + var pthread = worker.pthread; + PThread.freeThreadData(pthread); + worker.terminate(); + } + PThread.runningWorkers = []; + }, + freeThreadData: function (pthread) { + if (!pthread) + return; + if (pthread.threadInfoStruct) { + var tlsMemory = GROWABLE_HEAP_I32()[(pthread.threadInfoStruct + 104) >> 2]; + GROWABLE_HEAP_I32()[(pthread.threadInfoStruct + 104) >> 2] = 0; + _free(tlsMemory); + _free(pthread.threadInfoStruct); + } + pthread.threadInfoStruct = 0; + if (pthread.allocatedOwnStack && pthread.stackBase) + _free(pthread.stackBase); + pthread.stackBase = 0; + if (pthread.worker) + pthread.worker.pthread = null; + }, + returnWorkerToPool: function (worker) { + delete PThread.pthreads[worker.pthread.thread]; + PThread.unusedWorkers.push(worker); + PThread.runningWorkers.splice(PThread.runningWorkers.indexOf(worker), 1); + PThread.freeThreadData(worker.pthread); + worker.pthread = undefined; + }, + receiveObjectTransfer: function (data) { }, + loadWasmModuleToWorker: function (worker, onFinishedLoading) { + worker.onmessage = function (e) { + var d = e["data"]; + var cmd = d["cmd"]; + if (worker.pthread) + PThread.currentProxiedOperationCallerThread = + worker.pthread.threadInfoStruct; + if (d["targetThread"] && d["targetThread"] != _pthread_self()) { + var thread = PThread.pthreads[d.targetThread]; + if (thread) { + thread.worker.postMessage(e.data, d["transferList"]); + } + else { + console.error('Internal error! Worker sent a message "' + + cmd + + '" to target pthread ' + + d["targetThread"] + + ", but that thread no longer exists!"); + } + PThread.currentProxiedOperationCallerThread = undefined; + return; + } + if (cmd === "processQueuedMainThreadWork") { + _emscripten_main_thread_process_queued_calls(); + } + else if (cmd === "spawnThread") { + spawnThread(e.data); + } + else if (cmd === "cleanupThread") { + cleanupThread(d["thread"]); + } + else if (cmd === "killThread") { + killThread(d["thread"]); + } + else if (cmd === "cancelThread") { + cancelThread(d["thread"]); + } + else if (cmd === "loaded") { + worker.loaded = true; + if (onFinishedLoading) + onFinishedLoading(worker); + if (worker.runPthread) { + worker.runPthread(); + delete worker.runPthread; + } + } + else if (cmd === "print") { + out("Thread " + d["threadId"] + ": " + d["text"]); + } + else if (cmd === "printErr") { + err("Thread " + d["threadId"] + ": " + d["text"]); + } + else if (cmd === "alert") { + alert("Thread " + d["threadId"] + ": " + d["text"]); + } + else if (cmd === "exit") { + var detached = worker.pthread && + Atomics.load(GROWABLE_HEAP_U32(), (worker.pthread.thread + 68) >> 2); + if (detached) { + PThread.returnWorkerToPool(worker); + } + } + else if (cmd === "cancelDone") { + PThread.returnWorkerToPool(worker); + } + else if (cmd === "objectTransfer") { + PThread.receiveObjectTransfer(e.data); + } + else if (e.data.target === "setimmediate") { + worker.postMessage(e.data); + } + else { + err("worker sent an unknown command " + cmd); + } + PThread.currentProxiedOperationCallerThread = undefined; + }; + worker.onerror = function (e) { + err("pthread sent an error! " + + e.filename + + ":" + + e.lineno + + ": " + + e.message); + }; + worker.postMessage({ + cmd: "load", + urlOrBlob: Module["mainScriptUrlOrBlob"] || _scriptDir, + wasmMemory: wasmMemory, + wasmModule: wasmModule, + }); + }, + allocateUnusedWorker: function () { + var pthreadMainJs = locateFile("bergamot-translator-worker.worker.js"); + PThread.unusedWorkers.push(new Worker(pthreadMainJs)); + }, + getNewWorker: function () { + if (PThread.unusedWorkers.length == 0) { + PThread.allocateUnusedWorker(); + PThread.loadWasmModuleToWorker(PThread.unusedWorkers[0]); + } + if (PThread.unusedWorkers.length > 0) + return PThread.unusedWorkers.pop(); + else + return null; + }, + busySpinWait: function (msecs) { + var t = performance.now() + msecs; + while (performance.now() < t) { } + }, +}; +function establishStackSpace(stackTop, stackMax) { + _emscripten_stack_set_limits(stackTop, stackMax); + stackRestore(stackTop); +} +Module["establishStackSpace"] = establishStackSpace; +function getNoExitRuntime() { + return noExitRuntime; +} +Module["getNoExitRuntime"] = getNoExitRuntime; +function jsStackTrace() { + var error = new Error(); + if (!error.stack) { + try { + throw new Error(); + } + catch (e) { + error = e; + } + if (!error.stack) { + return "(no stack trace available)"; + } + } + return error.stack.toString(); +} +function ___assert_fail(condition, filename, line, func) { + abort("Assertion failed: " + + UTF8ToString(condition) + + ", at: " + + [ + filename ? UTF8ToString(filename) : "unknown filename", + line, + func ? UTF8ToString(func) : "unknown function", + ]); +} +var _emscripten_get_now; +if (ENVIRONMENT_IS_PTHREAD) { + _emscripten_get_now = function () { + return performance.now() - Module["__performance_now_clock_drift"]; + }; +} +else + _emscripten_get_now = function () { + return performance.now(); + }; +var _emscripten_get_now_is_monotonic = true; +function setErrNo(value) { + GROWABLE_HEAP_I32()[___errno_location() >> 2] = value; + return value; +} +function _clock_gettime(clk_id, tp) { + var now; + if (clk_id === 0) { + now = Date.now(); + } + else if ((clk_id === 1 || clk_id === 4) && + _emscripten_get_now_is_monotonic) { + now = _emscripten_get_now(); + } + else { + setErrNo(28); + return -1; + } + GROWABLE_HEAP_I32()[tp >> 2] = (now / 1e3) | 0; + GROWABLE_HEAP_I32()[(tp + 4) >> 2] = ((now % 1e3) * 1e3 * 1e3) | 0; + return 0; +} +function ___clock_gettime(a0, a1) { + return _clock_gettime(a0, a1); +} +var ExceptionInfoAttrs = { + DESTRUCTOR_OFFSET: 0, + REFCOUNT_OFFSET: 4, + TYPE_OFFSET: 8, + CAUGHT_OFFSET: 12, + RETHROWN_OFFSET: 13, + SIZE: 16, +}; +function ___cxa_allocate_exception(size) { + return _malloc(size + ExceptionInfoAttrs.SIZE) + ExceptionInfoAttrs.SIZE; +} +function _atexit(func, arg) { + if (ENVIRONMENT_IS_PTHREAD) + return _emscripten_proxy_to_main_thread_js(1, 1, func, arg); +} +function ___cxa_atexit(a0, a1) { + return _atexit(a0, a1); +} +function _pthread_cleanup_push(routine, arg) { + PThread.threadExitHandlers.push(function () { + wasmTable.get(routine)(arg); + }); +} +function ___cxa_thread_atexit(a0, a1) { + return _pthread_cleanup_push(a0, a1); +} +function ExceptionInfo(excPtr) { + this.excPtr = excPtr; + this.ptr = excPtr - ExceptionInfoAttrs.SIZE; + this.set_type = function (type) { + GROWABLE_HEAP_I32()[(this.ptr + ExceptionInfoAttrs.TYPE_OFFSET) >> 2] = type; + }; + this.get_type = function () { + return GROWABLE_HEAP_I32()[(this.ptr + ExceptionInfoAttrs.TYPE_OFFSET) >> 2]; + }; + this.set_destructor = function (destructor) { + GROWABLE_HEAP_I32()[(this.ptr + ExceptionInfoAttrs.DESTRUCTOR_OFFSET) >> 2] = destructor; + }; + this.get_destructor = function () { + return GROWABLE_HEAP_I32()[(this.ptr + ExceptionInfoAttrs.DESTRUCTOR_OFFSET) >> 2]; + }; + this.set_refcount = function (refcount) { + GROWABLE_HEAP_I32()[(this.ptr + ExceptionInfoAttrs.REFCOUNT_OFFSET) >> 2] = refcount; + }; + this.set_caught = function (caught) { + caught = caught ? 1 : 0; + GROWABLE_HEAP_I8()[(this.ptr + ExceptionInfoAttrs.CAUGHT_OFFSET) >> 0] = caught; + }; + this.get_caught = function () { + return (GROWABLE_HEAP_I8()[(this.ptr + ExceptionInfoAttrs.CAUGHT_OFFSET) >> 0] != + 0); + }; + this.set_rethrown = function (rethrown) { + rethrown = rethrown ? 1 : 0; + GROWABLE_HEAP_I8()[(this.ptr + ExceptionInfoAttrs.RETHROWN_OFFSET) >> 0] = rethrown; + }; + this.get_rethrown = function () { + return (GROWABLE_HEAP_I8()[(this.ptr + ExceptionInfoAttrs.RETHROWN_OFFSET) >> 0] != 0); + }; + this.init = function (type, destructor) { + this.set_type(type); + this.set_destructor(destructor); + this.set_refcount(0); + this.set_caught(false); + this.set_rethrown(false); + }; + this.add_ref = function () { + Atomics.add(GROWABLE_HEAP_I32(), (this.ptr + ExceptionInfoAttrs.REFCOUNT_OFFSET) >> 2, 1); + }; + this.release_ref = function () { + var prev = Atomics.sub(GROWABLE_HEAP_I32(), (this.ptr + ExceptionInfoAttrs.REFCOUNT_OFFSET) >> 2, 1); + return prev === 1; + }; +} +var exceptionLast = 0; +var uncaughtExceptionCount = 0; +function ___cxa_throw(ptr, type, destructor) { + var info = new ExceptionInfo(ptr); + info.init(type, destructor); + exceptionLast = ptr; + uncaughtExceptionCount++; + throw ptr; +} +var PATH = { + splitPath: function (filename) { + var splitPathRe = /^(\/?|)([\s\S]*?)((?:\.{1,2}|[^\/]+?|)(\.[^.\/]*|))(?:[\/]*)$/; + return splitPathRe.exec(filename).slice(1); + }, + normalizeArray: function (parts, allowAboveRoot) { + var up = 0; + for (var i = parts.length - 1; i >= 0; i--) { + var last = parts[i]; + if (last === ".") { + parts.splice(i, 1); + } + else if (last === "..") { + parts.splice(i, 1); + up++; + } + else if (up) { + parts.splice(i, 1); + up--; + } + } + if (allowAboveRoot) { + for (; up; up--) { + parts.unshift(".."); + } + } + return parts; + }, + normalize: function (path) { + var isAbsolute = path.charAt(0) === "/", trailingSlash = path.substr(-1) === "/"; + path = PATH.normalizeArray(path.split("/").filter(function (p) { + return !!p; + }), !isAbsolute).join("/"); + if (!path && !isAbsolute) { + path = "."; + } + if (path && trailingSlash) { + path += "/"; + } + return (isAbsolute ? "/" : "") + path; + }, + dirname: function (path) { + var result = PATH.splitPath(path), root = result[0], dir = result[1]; + if (!root && !dir) { + return "."; + } + if (dir) { + dir = dir.substr(0, dir.length - 1); + } + return root + dir; + }, + basename: function (path) { + if (path === "/") + return "/"; + path = PATH.normalize(path); + path = path.replace(/\/$/, ""); + var lastSlash = path.lastIndexOf("/"); + if (lastSlash === -1) + return path; + return path.substr(lastSlash + 1); + }, + extname: function (path) { + return PATH.splitPath(path)[3]; + }, + join: function () { + var paths = Array.prototype.slice.call(arguments, 0); + return PATH.normalize(paths.join("/")); + }, + join2: function (l, r) { + return PATH.normalize(l + "/" + r); + }, +}; +function getRandomDevice() { + if (typeof crypto === "object" && + typeof crypto["getRandomValues"] === "function") { + var randomBuffer = new Uint8Array(1); + return function () { + crypto.getRandomValues(randomBuffer); + return randomBuffer[0]; + }; + } + else + return function () { + abort("randomDevice"); + }; +} +var PATH_FS = { + resolve: function () { + var resolvedPath = "", resolvedAbsolute = false; + for (var i = arguments.length - 1; i >= -1 && !resolvedAbsolute; i--) { + var path = i >= 0 ? arguments[i] : FS.cwd(); + if (typeof path !== "string") { + throw new TypeError("Arguments to path.resolve must be strings"); + } + else if (!path) { + return ""; + } + resolvedPath = path + "/" + resolvedPath; + resolvedAbsolute = path.charAt(0) === "/"; + } + resolvedPath = PATH.normalizeArray(resolvedPath.split("/").filter(function (p) { + return !!p; + }), !resolvedAbsolute).join("/"); + return (resolvedAbsolute ? "/" : "") + resolvedPath || "."; + }, + relative: function (from, to) { + from = PATH_FS.resolve(from).substr(1); + to = PATH_FS.resolve(to).substr(1); + function trim(arr) { + var start = 0; + for (; start < arr.length; start++) { + if (arr[start] !== "") + break; + } + var end = arr.length - 1; + for (; end >= 0; end--) { + if (arr[end] !== "") + break; + } + if (start > end) + return []; + return arr.slice(start, end - start + 1); + } + var fromParts = trim(from.split("/")); + var toParts = trim(to.split("/")); + var length = Math.min(fromParts.length, toParts.length); + var samePartsLength = length; + for (var i = 0; i < length; i++) { + if (fromParts[i] !== toParts[i]) { + samePartsLength = i; + break; + } + } + var outputParts = []; + for (var i = samePartsLength; i < fromParts.length; i++) { + outputParts.push(".."); + } + outputParts = outputParts.concat(toParts.slice(samePartsLength)); + return outputParts.join("/"); + }, +}; +var TTY = { + ttys: [], + init: function () { }, + shutdown: function () { }, + register: function (dev, ops) { + TTY.ttys[dev] = { + input: [], + output: [], + ops: ops, + }; + FS.registerDevice(dev, TTY.stream_ops); + }, + stream_ops: { + open: function (stream) { + var tty = TTY.ttys[stream.node.rdev]; + if (!tty) { + throw new FS.ErrnoError(43); + } + stream.tty = tty; + stream.seekable = false; + }, + close: function (stream) { + stream.tty.ops.flush(stream.tty); + }, + flush: function (stream) { + stream.tty.ops.flush(stream.tty); + }, + read: function (stream, buffer, offset, length, pos) { + if (!stream.tty || !stream.tty.ops.get_char) { + throw new FS.ErrnoError(60); + } + var bytesRead = 0; + for (var i = 0; i < length; i++) { + var result; + try { + result = stream.tty.ops.get_char(stream.tty); + } + catch (e) { + throw new FS.ErrnoError(29); + } + if (result === undefined && bytesRead === 0) { + throw new FS.ErrnoError(6); + } + if (result === null || result === undefined) + break; + bytesRead++; + buffer[offset + i] = result; + } + if (bytesRead) { + stream.node.timestamp = Date.now(); + } + return bytesRead; + }, + write: function (stream, buffer, offset, length, pos) { + if (!stream.tty || !stream.tty.ops.put_char) { + throw new FS.ErrnoError(60); + } + try { + for (var i = 0; i < length; i++) { + stream.tty.ops.put_char(stream.tty, buffer[offset + i]); + } + } + catch (e) { + throw new FS.ErrnoError(29); + } + if (length) { + stream.node.timestamp = Date.now(); + } + return i; + }, + }, + default_tty_ops: { + get_char: function (tty) { + if (!tty.input.length) { + var result = null; + if (typeof window != "undefined" && + typeof window.prompt == "function") { + result = window.prompt("Input: "); + if (result !== null) { + result += "\n"; + } + } + else if (typeof readline == "function") { + result = readline(); + if (result !== null) { + result += "\n"; + } + } + if (!result) { + return null; + } + tty.input = intArrayFromString(result, true); + } + return tty.input.shift(); + }, + put_char: function (tty, val) { + if (val === null || val === 10) { + out(UTF8ArrayToString(tty.output, 0)); + tty.output = []; + } + else { + if (val != 0) + tty.output.push(val); + } + }, + flush: function (tty) { + if (tty.output && tty.output.length > 0) { + out(UTF8ArrayToString(tty.output, 0)); + tty.output = []; + } + }, + }, + default_tty1_ops: { + put_char: function (tty, val) { + if (val === null || val === 10) { + err(UTF8ArrayToString(tty.output, 0)); + tty.output = []; + } + else { + if (val != 0) + tty.output.push(val); + } + }, + flush: function (tty) { + if (tty.output && tty.output.length > 0) { + err(UTF8ArrayToString(tty.output, 0)); + tty.output = []; + } + }, + }, +}; +function mmapAlloc(size) { + var alignedSize = alignMemory(size, 16384); + var ptr = _malloc(alignedSize); + while (size < alignedSize) + GROWABLE_HEAP_I8()[ptr + size++] = 0; + return ptr; +} +var MEMFS = { + ops_table: null, + mount: function (mount) { + return MEMFS.createNode(null, "/", 16384 | 511, 0); + }, + createNode: function (parent, name, mode, dev) { + if (FS.isBlkdev(mode) || FS.isFIFO(mode)) { + throw new FS.ErrnoError(63); + } + if (!MEMFS.ops_table) { + MEMFS.ops_table = { + dir: { + node: { + getattr: MEMFS.node_ops.getattr, + setattr: MEMFS.node_ops.setattr, + lookup: MEMFS.node_ops.lookup, + mknod: MEMFS.node_ops.mknod, + rename: MEMFS.node_ops.rename, + unlink: MEMFS.node_ops.unlink, + rmdir: MEMFS.node_ops.rmdir, + readdir: MEMFS.node_ops.readdir, + symlink: MEMFS.node_ops.symlink, + }, + stream: { + llseek: MEMFS.stream_ops.llseek, + }, + }, + file: { + node: { + getattr: MEMFS.node_ops.getattr, + setattr: MEMFS.node_ops.setattr, + }, + stream: { + llseek: MEMFS.stream_ops.llseek, + read: MEMFS.stream_ops.read, + write: MEMFS.stream_ops.write, + allocate: MEMFS.stream_ops.allocate, + mmap: MEMFS.stream_ops.mmap, + msync: MEMFS.stream_ops.msync, + }, + }, + link: { + node: { + getattr: MEMFS.node_ops.getattr, + setattr: MEMFS.node_ops.setattr, + readlink: MEMFS.node_ops.readlink, + }, + stream: {}, + }, + chrdev: { + node: { + getattr: MEMFS.node_ops.getattr, + setattr: MEMFS.node_ops.setattr, + }, + stream: FS.chrdev_stream_ops, + }, + }; + } + var node = FS.createNode(parent, name, mode, dev); + if (FS.isDir(node.mode)) { + node.node_ops = MEMFS.ops_table.dir.node; + node.stream_ops = MEMFS.ops_table.dir.stream; + node.contents = {}; + } + else if (FS.isFile(node.mode)) { + node.node_ops = MEMFS.ops_table.file.node; + node.stream_ops = MEMFS.ops_table.file.stream; + node.usedBytes = 0; + node.contents = null; + } + else if (FS.isLink(node.mode)) { + node.node_ops = MEMFS.ops_table.link.node; + node.stream_ops = MEMFS.ops_table.link.stream; + } + else if (FS.isChrdev(node.mode)) { + node.node_ops = MEMFS.ops_table.chrdev.node; + node.stream_ops = MEMFS.ops_table.chrdev.stream; + } + node.timestamp = Date.now(); + if (parent) { + parent.contents[name] = node; + } + return node; + }, + getFileDataAsRegularArray: function (node) { + if (node.contents && node.contents.subarray) { + var arr = []; + for (var i = 0; i < node.usedBytes; ++i) + arr.push(node.contents[i]); + return arr; + } + return node.contents; + }, + getFileDataAsTypedArray: function (node) { + if (!node.contents) + return new Uint8Array(0); + if (node.contents.subarray) + return node.contents.subarray(0, node.usedBytes); + return new Uint8Array(node.contents); + }, + expandFileStorage: function (node, newCapacity) { + var prevCapacity = node.contents ? node.contents.length : 0; + if (prevCapacity >= newCapacity) + return; + var CAPACITY_DOUBLING_MAX = 1024 * 1024; + newCapacity = Math.max(newCapacity, (prevCapacity * (prevCapacity < CAPACITY_DOUBLING_MAX ? 2 : 1.125)) >>> 0); + if (prevCapacity != 0) + newCapacity = Math.max(newCapacity, 256); + var oldContents = node.contents; + node.contents = new Uint8Array(newCapacity); + if (node.usedBytes > 0) + node.contents.set(oldContents.subarray(0, node.usedBytes), 0); + return; + }, + resizeFileStorage: function (node, newSize) { + if (node.usedBytes == newSize) + return; + if (newSize == 0) { + node.contents = null; + node.usedBytes = 0; + return; + } + if (!node.contents || node.contents.subarray) { + var oldContents = node.contents; + node.contents = new Uint8Array(newSize); + if (oldContents) { + node.contents.set(oldContents.subarray(0, Math.min(newSize, node.usedBytes))); + } + node.usedBytes = newSize; + return; + } + if (!node.contents) + node.contents = []; + if (node.contents.length > newSize) + node.contents.length = newSize; + else + while (node.contents.length < newSize) + node.contents.push(0); + node.usedBytes = newSize; + }, + node_ops: { + getattr: function (node) { + var attr = {}; + attr.dev = FS.isChrdev(node.mode) ? node.id : 1; + attr.ino = node.id; + attr.mode = node.mode; + attr.nlink = 1; + attr.uid = 0; + attr.gid = 0; + attr.rdev = node.rdev; + if (FS.isDir(node.mode)) { + attr.size = 4096; + } + else if (FS.isFile(node.mode)) { + attr.size = node.usedBytes; + } + else if (FS.isLink(node.mode)) { + attr.size = node.link.length; + } + else { + attr.size = 0; + } + attr.atime = new Date(node.timestamp); + attr.mtime = new Date(node.timestamp); + attr.ctime = new Date(node.timestamp); + attr.blksize = 4096; + attr.blocks = Math.ceil(attr.size / attr.blksize); + return attr; + }, + setattr: function (node, attr) { + if (attr.mode !== undefined) { + node.mode = attr.mode; + } + if (attr.timestamp !== undefined) { + node.timestamp = attr.timestamp; + } + if (attr.size !== undefined) { + MEMFS.resizeFileStorage(node, attr.size); + } + }, + lookup: function (parent, name) { + throw FS.genericErrors[44]; + }, + mknod: function (parent, name, mode, dev) { + return MEMFS.createNode(parent, name, mode, dev); + }, + rename: function (old_node, new_dir, new_name) { + if (FS.isDir(old_node.mode)) { + var new_node; + try { + new_node = FS.lookupNode(new_dir, new_name); + } + catch (e) { } + if (new_node) { + for (var i in new_node.contents) { + throw new FS.ErrnoError(55); + } + } + } + delete old_node.parent.contents[old_node.name]; + old_node.name = new_name; + new_dir.contents[new_name] = old_node; + old_node.parent = new_dir; + }, + unlink: function (parent, name) { + delete parent.contents[name]; + }, + rmdir: function (parent, name) { + var node = FS.lookupNode(parent, name); + for (var i in node.contents) { + throw new FS.ErrnoError(55); + } + delete parent.contents[name]; + }, + readdir: function (node) { + var entries = [".", ".."]; + for (var key in node.contents) { + if (!node.contents.hasOwnProperty(key)) { + continue; + } + entries.push(key); + } + return entries; + }, + symlink: function (parent, newname, oldpath) { + var node = MEMFS.createNode(parent, newname, 511 | 40960, 0); + node.link = oldpath; + return node; + }, + readlink: function (node) { + if (!FS.isLink(node.mode)) { + throw new FS.ErrnoError(28); + } + return node.link; + }, + }, + stream_ops: { + read: function (stream, buffer, offset, length, position) { + var contents = stream.node.contents; + if (position >= stream.node.usedBytes) + return 0; + var size = Math.min(stream.node.usedBytes - position, length); + if (size > 8 && contents.subarray) { + buffer.set(contents.subarray(position, position + size), offset); + } + else { + for (var i = 0; i < size; i++) + buffer[offset + i] = contents[position + i]; + } + return size; + }, + write: function (stream, buffer, offset, length, position, canOwn) { + if (buffer.buffer === GROWABLE_HEAP_I8().buffer) { + canOwn = false; + } + if (!length) + return 0; + var node = stream.node; + node.timestamp = Date.now(); + if (buffer.subarray && (!node.contents || node.contents.subarray)) { + if (canOwn) { + node.contents = buffer.subarray(offset, offset + length); + node.usedBytes = length; + return length; + } + else if (node.usedBytes === 0 && position === 0) { + node.contents = buffer.slice(offset, offset + length); + node.usedBytes = length; + return length; + } + else if (position + length <= node.usedBytes) { + node.contents.set(buffer.subarray(offset, offset + length), position); + return length; + } + } + MEMFS.expandFileStorage(node, position + length); + if (node.contents.subarray && buffer.subarray) { + node.contents.set(buffer.subarray(offset, offset + length), position); + } + else { + for (var i = 0; i < length; i++) { + node.contents[position + i] = buffer[offset + i]; + } + } + node.usedBytes = Math.max(node.usedBytes, position + length); + return length; + }, + llseek: function (stream, offset, whence) { + var position = offset; + if (whence === 1) { + position += stream.position; + } + else if (whence === 2) { + if (FS.isFile(stream.node.mode)) { + position += stream.node.usedBytes; + } + } + if (position < 0) { + throw new FS.ErrnoError(28); + } + return position; + }, + allocate: function (stream, offset, length) { + MEMFS.expandFileStorage(stream.node, offset + length); + stream.node.usedBytes = Math.max(stream.node.usedBytes, offset + length); + }, + mmap: function (stream, address, length, position, prot, flags) { + assert(address === 0); + if (!FS.isFile(stream.node.mode)) { + throw new FS.ErrnoError(43); + } + var ptr; + var allocated; + var contents = stream.node.contents; + if (!(flags & 2) && contents.buffer === buffer) { + allocated = false; + ptr = contents.byteOffset; + } + else { + if (position > 0 || position + length < contents.length) { + if (contents.subarray) { + contents = contents.subarray(position, position + length); + } + else { + contents = Array.prototype.slice.call(contents, position, position + length); + } + } + allocated = true; + ptr = mmapAlloc(length); + if (!ptr) { + throw new FS.ErrnoError(48); + } + GROWABLE_HEAP_I8().set(contents, ptr); + } + return { + ptr: ptr, + allocated: allocated, + }; + }, + msync: function (stream, buffer, offset, length, mmapFlags) { + if (!FS.isFile(stream.node.mode)) { + throw new FS.ErrnoError(43); + } + if (mmapFlags & 2) { + return 0; + } + var bytesWritten = MEMFS.stream_ops.write(stream, buffer, 0, length, offset, false); + return 0; + }, + }, +}; +var FS = { + root: null, + mounts: [], + devices: {}, + streams: [], + nextInode: 1, + nameTable: null, + currentPath: "/", + initialized: false, + ignorePermissions: true, + trackingDelegate: {}, + tracking: { + openFlags: { + READ: 1, + WRITE: 2, + }, + }, + ErrnoError: null, + genericErrors: {}, + filesystems: null, + syncFSRequests: 0, + lookupPath: function (path, opts) { + path = PATH_FS.resolve(FS.cwd(), path); + opts = opts || {}; + if (!path) + return { + path: "", + node: null, + }; + var defaults = { + follow_mount: true, + recurse_count: 0, + }; + for (var key in defaults) { + if (opts[key] === undefined) { + opts[key] = defaults[key]; + } + } + if (opts.recurse_count > 8) { + throw new FS.ErrnoError(32); + } + var parts = PATH.normalizeArray(path.split("/").filter(function (p) { + return !!p; + }), false); + var current = FS.root; + var current_path = "/"; + for (var i = 0; i < parts.length; i++) { + var islast = i === parts.length - 1; + if (islast && opts.parent) { + break; + } + current = FS.lookupNode(current, parts[i]); + current_path = PATH.join2(current_path, parts[i]); + if (FS.isMountpoint(current)) { + if (!islast || (islast && opts.follow_mount)) { + current = current.mounted.root; + } + } + if (!islast || opts.follow) { + var count = 0; + while (FS.isLink(current.mode)) { + var link = FS.readlink(current_path); + current_path = PATH_FS.resolve(PATH.dirname(current_path), link); + var lookup = FS.lookupPath(current_path, { + recurse_count: opts.recurse_count, + }); + current = lookup.node; + if (count++ > 40) { + throw new FS.ErrnoError(32); + } + } + } + } + return { + path: current_path, + node: current, + }; + }, + getPath: function (node) { + var path; + while (true) { + if (FS.isRoot(node)) { + var mount = node.mount.mountpoint; + if (!path) + return mount; + return mount[mount.length - 1] !== "/" + ? mount + "/" + path + : mount + path; + } + path = path ? node.name + "/" + path : node.name; + node = node.parent; + } + }, + hashName: function (parentid, name) { + var hash = 0; + for (var i = 0; i < name.length; i++) { + hash = ((hash << 5) - hash + name.charCodeAt(i)) | 0; + } + return ((parentid + hash) >>> 0) % FS.nameTable.length; + }, + hashAddNode: function (node) { + var hash = FS.hashName(node.parent.id, node.name); + node.name_next = FS.nameTable[hash]; + FS.nameTable[hash] = node; + }, + hashRemoveNode: function (node) { + var hash = FS.hashName(node.parent.id, node.name); + if (FS.nameTable[hash] === node) { + FS.nameTable[hash] = node.name_next; + } + else { + var current = FS.nameTable[hash]; + while (current) { + if (current.name_next === node) { + current.name_next = node.name_next; + break; + } + current = current.name_next; + } + } + }, + lookupNode: function (parent, name) { + var errCode = FS.mayLookup(parent); + if (errCode) { + throw new FS.ErrnoError(errCode, parent); + } + var hash = FS.hashName(parent.id, name); + for (var node = FS.nameTable[hash]; node; node = node.name_next) { + var nodeName = node.name; + if (node.parent.id === parent.id && nodeName === name) { + return node; + } + } + return FS.lookup(parent, name); + }, + createNode: function (parent, name, mode, rdev) { + var node = new FS.FSNode(parent, name, mode, rdev); + FS.hashAddNode(node); + return node; + }, + destroyNode: function (node) { + FS.hashRemoveNode(node); + }, + isRoot: function (node) { + return node === node.parent; + }, + isMountpoint: function (node) { + return !!node.mounted; + }, + isFile: function (mode) { + return (mode & 61440) === 32768; + }, + isDir: function (mode) { + return (mode & 61440) === 16384; + }, + isLink: function (mode) { + return (mode & 61440) === 40960; + }, + isChrdev: function (mode) { + return (mode & 61440) === 8192; + }, + isBlkdev: function (mode) { + return (mode & 61440) === 24576; + }, + isFIFO: function (mode) { + return (mode & 61440) === 4096; + }, + isSocket: function (mode) { + return (mode & 49152) === 49152; + }, + flagModes: { + r: 0, + "r+": 2, + w: 577, + "w+": 578, + a: 1089, + "a+": 1090, + }, + modeStringToFlags: function (str) { + var flags = FS.flagModes[str]; + if (typeof flags === "undefined") { + throw new Error("Unknown file open mode: " + str); + } + return flags; + }, + flagsToPermissionString: function (flag) { + var perms = ["r", "w", "rw"][flag & 3]; + if (flag & 512) { + perms += "w"; + } + return perms; + }, + nodePermissions: function (node, perms) { + if (FS.ignorePermissions) { + return 0; + } + if (perms.indexOf("r") !== -1 && !(node.mode & 292)) { + return 2; + } + else if (perms.indexOf("w") !== -1 && !(node.mode & 146)) { + return 2; + } + else if (perms.indexOf("x") !== -1 && !(node.mode & 73)) { + return 2; + } + return 0; + }, + mayLookup: function (dir) { + var errCode = FS.nodePermissions(dir, "x"); + if (errCode) + return errCode; + if (!dir.node_ops.lookup) + return 2; + return 0; + }, + mayCreate: function (dir, name) { + try { + var node = FS.lookupNode(dir, name); + return 20; + } + catch (e) { } + return FS.nodePermissions(dir, "wx"); + }, + mayDelete: function (dir, name, isdir) { + var node; + try { + node = FS.lookupNode(dir, name); + } + catch (e) { + return e.errno; + } + var errCode = FS.nodePermissions(dir, "wx"); + if (errCode) { + return errCode; + } + if (isdir) { + if (!FS.isDir(node.mode)) { + return 54; + } + if (FS.isRoot(node) || FS.getPath(node) === FS.cwd()) { + return 10; + } + } + else { + if (FS.isDir(node.mode)) { + return 31; + } + } + return 0; + }, + mayOpen: function (node, flags) { + if (!node) { + return 44; + } + if (FS.isLink(node.mode)) { + return 32; + } + else if (FS.isDir(node.mode)) { + if (FS.flagsToPermissionString(flags) !== "r" || flags & 512) { + return 31; + } + } + return FS.nodePermissions(node, FS.flagsToPermissionString(flags)); + }, + MAX_OPEN_FDS: 4096, + nextfd: function (fd_start, fd_end) { + fd_start = fd_start || 0; + fd_end = fd_end || FS.MAX_OPEN_FDS; + for (var fd = fd_start; fd <= fd_end; fd++) { + if (!FS.streams[fd]) { + return fd; + } + } + throw new FS.ErrnoError(33); + }, + getStream: function (fd) { + return FS.streams[fd]; + }, + createStream: function (stream, fd_start, fd_end) { + if (!FS.FSStream) { + FS.FSStream = function () { }; + FS.FSStream.prototype = { + object: { + get: function () { + return this.node; + }, + set: function (val) { + this.node = val; + }, + }, + isRead: { + get: function () { + return (this.flags & 2097155) !== 1; + }, + }, + isWrite: { + get: function () { + return (this.flags & 2097155) !== 0; + }, + }, + isAppend: { + get: function () { + return this.flags & 1024; + }, + }, + }; + } + var newStream = new FS.FSStream(); + for (var p in stream) { + newStream[p] = stream[p]; + } + stream = newStream; + var fd = FS.nextfd(fd_start, fd_end); + stream.fd = fd; + FS.streams[fd] = stream; + return stream; + }, + closeStream: function (fd) { + FS.streams[fd] = null; + }, + chrdev_stream_ops: { + open: function (stream) { + var device = FS.getDevice(stream.node.rdev); + stream.stream_ops = device.stream_ops; + if (stream.stream_ops.open) { + stream.stream_ops.open(stream); + } + }, + llseek: function () { + throw new FS.ErrnoError(70); + }, + }, + major: function (dev) { + return dev >> 8; + }, + minor: function (dev) { + return dev & 255; + }, + makedev: function (ma, mi) { + return (ma << 8) | mi; + }, + registerDevice: function (dev, ops) { + FS.devices[dev] = { + stream_ops: ops, + }; + }, + getDevice: function (dev) { + return FS.devices[dev]; + }, + getMounts: function (mount) { + var mounts = []; + var check = [mount]; + while (check.length) { + var m = check.pop(); + mounts.push(m); + check.push.apply(check, m.mounts); + } + return mounts; + }, + syncfs: function (populate, callback) { + if (typeof populate === "function") { + callback = populate; + populate = false; + } + FS.syncFSRequests++; + if (FS.syncFSRequests > 1) { + err("warning: " + + FS.syncFSRequests + + " FS.syncfs operations in flight at once, probably just doing extra work"); + } + var mounts = FS.getMounts(FS.root.mount); + var completed = 0; + function doCallback(errCode) { + FS.syncFSRequests--; + return callback(errCode); + } + function done(errCode) { + if (errCode) { + if (!done.errored) { + done.errored = true; + return doCallback(errCode); + } + return; + } + if (++completed >= mounts.length) { + doCallback(null); + } + } + mounts.forEach(function (mount) { + if (!mount.type.syncfs) { + return done(null); + } + mount.type.syncfs(mount, populate, done); + }); + }, + mount: function (type, opts, mountpoint) { + var root = mountpoint === "/"; + var pseudo = !mountpoint; + var node; + if (root && FS.root) { + throw new FS.ErrnoError(10); + } + else if (!root && !pseudo) { + var lookup = FS.lookupPath(mountpoint, { + follow_mount: false, + }); + mountpoint = lookup.path; + node = lookup.node; + if (FS.isMountpoint(node)) { + throw new FS.ErrnoError(10); + } + if (!FS.isDir(node.mode)) { + throw new FS.ErrnoError(54); + } + } + var mount = { + type: type, + opts: opts, + mountpoint: mountpoint, + mounts: [], + }; + var mountRoot = type.mount(mount); + mountRoot.mount = mount; + mount.root = mountRoot; + if (root) { + FS.root = mountRoot; + } + else if (node) { + node.mounted = mount; + if (node.mount) { + node.mount.mounts.push(mount); + } + } + return mountRoot; + }, + unmount: function (mountpoint) { + var lookup = FS.lookupPath(mountpoint, { + follow_mount: false, + }); + if (!FS.isMountpoint(lookup.node)) { + throw new FS.ErrnoError(28); + } + var node = lookup.node; + var mount = node.mounted; + var mounts = FS.getMounts(mount); + Object.keys(FS.nameTable).forEach(function (hash) { + var current = FS.nameTable[hash]; + while (current) { + var next = current.name_next; + if (mounts.indexOf(current.mount) !== -1) { + FS.destroyNode(current); + } + current = next; + } + }); + node.mounted = null; + var idx = node.mount.mounts.indexOf(mount); + node.mount.mounts.splice(idx, 1); + }, + lookup: function (parent, name) { + return parent.node_ops.lookup(parent, name); + }, + mknod: function (path, mode, dev) { + var lookup = FS.lookupPath(path, { + parent: true, + }); + var parent = lookup.node; + var name = PATH.basename(path); + if (!name || name === "." || name === "..") { + throw new FS.ErrnoError(28); + } + var errCode = FS.mayCreate(parent, name); + if (errCode) { + throw new FS.ErrnoError(errCode); + } + if (!parent.node_ops.mknod) { + throw new FS.ErrnoError(63); + } + return parent.node_ops.mknod(parent, name, mode, dev); + }, + create: function (path, mode) { + mode = mode !== undefined ? mode : 438; + mode &= 4095; + mode |= 32768; + return FS.mknod(path, mode, 0); + }, + mkdir: function (path, mode) { + mode = mode !== undefined ? mode : 511; + mode &= 511 | 512; + mode |= 16384; + return FS.mknod(path, mode, 0); + }, + mkdirTree: function (path, mode) { + var dirs = path.split("/"); + var d = ""; + for (var i = 0; i < dirs.length; ++i) { + if (!dirs[i]) + continue; + d += "/" + dirs[i]; + try { + FS.mkdir(d, mode); + } + catch (e) { + if (e.errno != 20) + throw e; + } + } + }, + mkdev: function (path, mode, dev) { + if (typeof dev === "undefined") { + dev = mode; + mode = 438; + } + mode |= 8192; + return FS.mknod(path, mode, dev); + }, + symlink: function (oldpath, newpath) { + if (!PATH_FS.resolve(oldpath)) { + throw new FS.ErrnoError(44); + } + var lookup = FS.lookupPath(newpath, { + parent: true, + }); + var parent = lookup.node; + if (!parent) { + throw new FS.ErrnoError(44); + } + var newname = PATH.basename(newpath); + var errCode = FS.mayCreate(parent, newname); + if (errCode) { + throw new FS.ErrnoError(errCode); + } + if (!parent.node_ops.symlink) { + throw new FS.ErrnoError(63); + } + return parent.node_ops.symlink(parent, newname, oldpath); + }, + rename: function (old_path, new_path) { + var old_dirname = PATH.dirname(old_path); + var new_dirname = PATH.dirname(new_path); + var old_name = PATH.basename(old_path); + var new_name = PATH.basename(new_path); + var lookup, old_dir, new_dir; + lookup = FS.lookupPath(old_path, { + parent: true, + }); + old_dir = lookup.node; + lookup = FS.lookupPath(new_path, { + parent: true, + }); + new_dir = lookup.node; + if (!old_dir || !new_dir) + throw new FS.ErrnoError(44); + if (old_dir.mount !== new_dir.mount) { + throw new FS.ErrnoError(75); + } + var old_node = FS.lookupNode(old_dir, old_name); + var relative = PATH_FS.relative(old_path, new_dirname); + if (relative.charAt(0) !== ".") { + throw new FS.ErrnoError(28); + } + relative = PATH_FS.relative(new_path, old_dirname); + if (relative.charAt(0) !== ".") { + throw new FS.ErrnoError(55); + } + var new_node; + try { + new_node = FS.lookupNode(new_dir, new_name); + } + catch (e) { } + if (old_node === new_node) { + return; + } + var isdir = FS.isDir(old_node.mode); + var errCode = FS.mayDelete(old_dir, old_name, isdir); + if (errCode) { + throw new FS.ErrnoError(errCode); + } + errCode = new_node + ? FS.mayDelete(new_dir, new_name, isdir) + : FS.mayCreate(new_dir, new_name); + if (errCode) { + throw new FS.ErrnoError(errCode); + } + if (!old_dir.node_ops.rename) { + throw new FS.ErrnoError(63); + } + if (FS.isMountpoint(old_node) || (new_node && FS.isMountpoint(new_node))) { + throw new FS.ErrnoError(10); + } + if (new_dir !== old_dir) { + errCode = FS.nodePermissions(old_dir, "w"); + if (errCode) { + throw new FS.ErrnoError(errCode); + } + } + try { + if (FS.trackingDelegate["willMovePath"]) { + FS.trackingDelegate["willMovePath"](old_path, new_path); + } + } + catch (e) { + err("FS.trackingDelegate['willMovePath']('" + + old_path + + "', '" + + new_path + + "') threw an exception: " + + e.message); + } + FS.hashRemoveNode(old_node); + try { + old_dir.node_ops.rename(old_node, new_dir, new_name); + } + catch (e) { + throw e; + } + finally { + FS.hashAddNode(old_node); + } + try { + if (FS.trackingDelegate["onMovePath"]) + FS.trackingDelegate["onMovePath"](old_path, new_path); + } + catch (e) { + err("FS.trackingDelegate['onMovePath']('" + + old_path + + "', '" + + new_path + + "') threw an exception: " + + e.message); + } + }, + rmdir: function (path) { + var lookup = FS.lookupPath(path, { + parent: true, + }); + var parent = lookup.node; + var name = PATH.basename(path); + var node = FS.lookupNode(parent, name); + var errCode = FS.mayDelete(parent, name, true); + if (errCode) { + throw new FS.ErrnoError(errCode); + } + if (!parent.node_ops.rmdir) { + throw new FS.ErrnoError(63); + } + if (FS.isMountpoint(node)) { + throw new FS.ErrnoError(10); + } + try { + if (FS.trackingDelegate["willDeletePath"]) { + FS.trackingDelegate["willDeletePath"](path); + } + } + catch (e) { + err("FS.trackingDelegate['willDeletePath']('" + + path + + "') threw an exception: " + + e.message); + } + parent.node_ops.rmdir(parent, name); + FS.destroyNode(node); + try { + if (FS.trackingDelegate["onDeletePath"]) + FS.trackingDelegate["onDeletePath"](path); + } + catch (e) { + err("FS.trackingDelegate['onDeletePath']('" + + path + + "') threw an exception: " + + e.message); + } + }, + readdir: function (path) { + var lookup = FS.lookupPath(path, { + follow: true, + }); + var node = lookup.node; + if (!node.node_ops.readdir) { + throw new FS.ErrnoError(54); + } + return node.node_ops.readdir(node); + }, + unlink: function (path) { + var lookup = FS.lookupPath(path, { + parent: true, + }); + var parent = lookup.node; + var name = PATH.basename(path); + var node = FS.lookupNode(parent, name); + var errCode = FS.mayDelete(parent, name, false); + if (errCode) { + throw new FS.ErrnoError(errCode); + } + if (!parent.node_ops.unlink) { + throw new FS.ErrnoError(63); + } + if (FS.isMountpoint(node)) { + throw new FS.ErrnoError(10); + } + try { + if (FS.trackingDelegate["willDeletePath"]) { + FS.trackingDelegate["willDeletePath"](path); + } + } + catch (e) { + err("FS.trackingDelegate['willDeletePath']('" + + path + + "') threw an exception: " + + e.message); + } + parent.node_ops.unlink(parent, name); + FS.destroyNode(node); + try { + if (FS.trackingDelegate["onDeletePath"]) + FS.trackingDelegate["onDeletePath"](path); + } + catch (e) { + err("FS.trackingDelegate['onDeletePath']('" + + path + + "') threw an exception: " + + e.message); + } + }, + readlink: function (path) { + var lookup = FS.lookupPath(path); + var link = lookup.node; + if (!link) { + throw new FS.ErrnoError(44); + } + if (!link.node_ops.readlink) { + throw new FS.ErrnoError(28); + } + return PATH_FS.resolve(FS.getPath(link.parent), link.node_ops.readlink(link)); + }, + stat: function (path, dontFollow) { + var lookup = FS.lookupPath(path, { + follow: !dontFollow, + }); + var node = lookup.node; + if (!node) { + throw new FS.ErrnoError(44); + } + if (!node.node_ops.getattr) { + throw new FS.ErrnoError(63); + } + return node.node_ops.getattr(node); + }, + lstat: function (path) { + return FS.stat(path, true); + }, + chmod: function (path, mode, dontFollow) { + var node; + if (typeof path === "string") { + var lookup = FS.lookupPath(path, { + follow: !dontFollow, + }); + node = lookup.node; + } + else { + node = path; + } + if (!node.node_ops.setattr) { + throw new FS.ErrnoError(63); + } + node.node_ops.setattr(node, { + mode: (mode & 4095) | (node.mode & ~4095), + timestamp: Date.now(), + }); + }, + lchmod: function (path, mode) { + FS.chmod(path, mode, true); + }, + fchmod: function (fd, mode) { + var stream = FS.getStream(fd); + if (!stream) { + throw new FS.ErrnoError(8); + } + FS.chmod(stream.node, mode); + }, + chown: function (path, uid, gid, dontFollow) { + var node; + if (typeof path === "string") { + var lookup = FS.lookupPath(path, { + follow: !dontFollow, + }); + node = lookup.node; + } + else { + node = path; + } + if (!node.node_ops.setattr) { + throw new FS.ErrnoError(63); + } + node.node_ops.setattr(node, { + timestamp: Date.now(), + }); + }, + lchown: function (path, uid, gid) { + FS.chown(path, uid, gid, true); + }, + fchown: function (fd, uid, gid) { + var stream = FS.getStream(fd); + if (!stream) { + throw new FS.ErrnoError(8); + } + FS.chown(stream.node, uid, gid); + }, + truncate: function (path, len) { + if (len < 0) { + throw new FS.ErrnoError(28); + } + var node; + if (typeof path === "string") { + var lookup = FS.lookupPath(path, { + follow: true, + }); + node = lookup.node; + } + else { + node = path; + } + if (!node.node_ops.setattr) { + throw new FS.ErrnoError(63); + } + if (FS.isDir(node.mode)) { + throw new FS.ErrnoError(31); + } + if (!FS.isFile(node.mode)) { + throw new FS.ErrnoError(28); + } + var errCode = FS.nodePermissions(node, "w"); + if (errCode) { + throw new FS.ErrnoError(errCode); + } + node.node_ops.setattr(node, { + size: len, + timestamp: Date.now(), + }); + }, + ftruncate: function (fd, len) { + var stream = FS.getStream(fd); + if (!stream) { + throw new FS.ErrnoError(8); + } + if ((stream.flags & 2097155) === 0) { + throw new FS.ErrnoError(28); + } + FS.truncate(stream.node, len); + }, + utime: function (path, atime, mtime) { + var lookup = FS.lookupPath(path, { + follow: true, + }); + var node = lookup.node; + node.node_ops.setattr(node, { + timestamp: Math.max(atime, mtime), + }); + }, + open: function (path, flags, mode, fd_start, fd_end) { + if (path === "") { + throw new FS.ErrnoError(44); + } + flags = typeof flags === "string" ? FS.modeStringToFlags(flags) : flags; + mode = typeof mode === "undefined" ? 438 : mode; + if (flags & 64) { + mode = (mode & 4095) | 32768; + } + else { + mode = 0; + } + var node; + if (typeof path === "object") { + node = path; + } + else { + path = PATH.normalize(path); + try { + var lookup = FS.lookupPath(path, { + follow: !(flags & 131072), + }); + node = lookup.node; + } + catch (e) { } + } + var created = false; + if (flags & 64) { + if (node) { + if (flags & 128) { + throw new FS.ErrnoError(20); + } + } + else { + node = FS.mknod(path, mode, 0); + created = true; + } + } + if (!node) { + throw new FS.ErrnoError(44); + } + if (FS.isChrdev(node.mode)) { + flags &= ~512; + } + if (flags & 65536 && !FS.isDir(node.mode)) { + throw new FS.ErrnoError(54); + } + if (!created) { + var errCode = FS.mayOpen(node, flags); + if (errCode) { + throw new FS.ErrnoError(errCode); + } + } + if (flags & 512) { + FS.truncate(node, 0); + } + flags &= ~(128 | 512 | 131072); + var stream = FS.createStream({ + node: node, + path: FS.getPath(node), + flags: flags, + seekable: true, + position: 0, + stream_ops: node.stream_ops, + ungotten: [], + error: false, + }, fd_start, fd_end); + if (stream.stream_ops.open) { + stream.stream_ops.open(stream); + } + if (Module["logReadFiles"] && !(flags & 1)) { + if (!FS.readFiles) + FS.readFiles = {}; + if (!(path in FS.readFiles)) { + FS.readFiles[path] = 1; + err("FS.trackingDelegate error on read file: " + path); + } + } + try { + if (FS.trackingDelegate["onOpenFile"]) { + var trackingFlags = 0; + if ((flags & 2097155) !== 1) { + trackingFlags |= FS.tracking.openFlags.READ; + } + if ((flags & 2097155) !== 0) { + trackingFlags |= FS.tracking.openFlags.WRITE; + } + FS.trackingDelegate["onOpenFile"](path, trackingFlags); + } + } + catch (e) { + err("FS.trackingDelegate['onOpenFile']('" + + path + + "', flags) threw an exception: " + + e.message); + } + return stream; + }, + close: function (stream) { + if (FS.isClosed(stream)) { + throw new FS.ErrnoError(8); + } + if (stream.getdents) + stream.getdents = null; + try { + if (stream.stream_ops.close) { + stream.stream_ops.close(stream); + } + } + catch (e) { + throw e; + } + finally { + FS.closeStream(stream.fd); + } + stream.fd = null; + }, + isClosed: function (stream) { + return stream.fd === null; + }, + llseek: function (stream, offset, whence) { + if (FS.isClosed(stream)) { + throw new FS.ErrnoError(8); + } + if (!stream.seekable || !stream.stream_ops.llseek) { + throw new FS.ErrnoError(70); + } + if (whence != 0 && whence != 1 && whence != 2) { + throw new FS.ErrnoError(28); + } + stream.position = stream.stream_ops.llseek(stream, offset, whence); + stream.ungotten = []; + return stream.position; + }, + read: function (stream, buffer, offset, length, position) { + if (length < 0 || position < 0) { + throw new FS.ErrnoError(28); + } + if (FS.isClosed(stream)) { + throw new FS.ErrnoError(8); + } + if ((stream.flags & 2097155) === 1) { + throw new FS.ErrnoError(8); + } + if (FS.isDir(stream.node.mode)) { + throw new FS.ErrnoError(31); + } + if (!stream.stream_ops.read) { + throw new FS.ErrnoError(28); + } + var seeking = typeof position !== "undefined"; + if (!seeking) { + position = stream.position; + } + else if (!stream.seekable) { + throw new FS.ErrnoError(70); + } + var bytesRead = stream.stream_ops.read(stream, buffer, offset, length, position); + if (!seeking) + stream.position += bytesRead; + return bytesRead; + }, + write: function (stream, buffer, offset, length, position, canOwn) { + if (length < 0 || position < 0) { + throw new FS.ErrnoError(28); + } + if (FS.isClosed(stream)) { + throw new FS.ErrnoError(8); + } + if ((stream.flags & 2097155) === 0) { + throw new FS.ErrnoError(8); + } + if (FS.isDir(stream.node.mode)) { + throw new FS.ErrnoError(31); + } + if (!stream.stream_ops.write) { + throw new FS.ErrnoError(28); + } + if (stream.seekable && stream.flags & 1024) { + FS.llseek(stream, 0, 2); + } + var seeking = typeof position !== "undefined"; + if (!seeking) { + position = stream.position; + } + else if (!stream.seekable) { + throw new FS.ErrnoError(70); + } + var bytesWritten = stream.stream_ops.write(stream, buffer, offset, length, position, canOwn); + if (!seeking) + stream.position += bytesWritten; + try { + if (stream.path && FS.trackingDelegate["onWriteToFile"]) + FS.trackingDelegate["onWriteToFile"](stream.path); + } + catch (e) { + err("FS.trackingDelegate['onWriteToFile']('" + + stream.path + + "') threw an exception: " + + e.message); + } + return bytesWritten; + }, + allocate: function (stream, offset, length) { + if (FS.isClosed(stream)) { + throw new FS.ErrnoError(8); + } + if (offset < 0 || length <= 0) { + throw new FS.ErrnoError(28); + } + if ((stream.flags & 2097155) === 0) { + throw new FS.ErrnoError(8); + } + if (!FS.isFile(stream.node.mode) && !FS.isDir(stream.node.mode)) { + throw new FS.ErrnoError(43); + } + if (!stream.stream_ops.allocate) { + throw new FS.ErrnoError(138); + } + stream.stream_ops.allocate(stream, offset, length); + }, + mmap: function (stream, address, length, position, prot, flags) { + if ((prot & 2) !== 0 && + (flags & 2) === 0 && + (stream.flags & 2097155) !== 2) { + throw new FS.ErrnoError(2); + } + if ((stream.flags & 2097155) === 1) { + throw new FS.ErrnoError(2); + } + if (!stream.stream_ops.mmap) { + throw new FS.ErrnoError(43); + } + return stream.stream_ops.mmap(stream, address, length, position, prot, flags); + }, + msync: function (stream, buffer, offset, length, mmapFlags) { + if (!stream || !stream.stream_ops.msync) { + return 0; + } + return stream.stream_ops.msync(stream, buffer, offset, length, mmapFlags); + }, + munmap: function (stream) { + return 0; + }, + ioctl: function (stream, cmd, arg) { + if (!stream.stream_ops.ioctl) { + throw new FS.ErrnoError(59); + } + return stream.stream_ops.ioctl(stream, cmd, arg); + }, + readFile: function (path, opts) { + opts = opts || {}; + opts.flags = opts.flags || 0; + opts.encoding = opts.encoding || "binary"; + if (opts.encoding !== "utf8" && opts.encoding !== "binary") { + throw new Error('Invalid encoding type "' + opts.encoding + '"'); + } + var ret; + var stream = FS.open(path, opts.flags); + var stat = FS.stat(path); + var length = stat.size; + var buf = new Uint8Array(length); + FS.read(stream, buf, 0, length, 0); + if (opts.encoding === "utf8") { + ret = UTF8ArrayToString(buf, 0); + } + else if (opts.encoding === "binary") { + ret = buf; + } + FS.close(stream); + return ret; + }, + writeFile: function (path, data, opts) { + opts = opts || {}; + opts.flags = opts.flags || 577; + var stream = FS.open(path, opts.flags, opts.mode); + if (typeof data === "string") { + var buf = new Uint8Array(lengthBytesUTF8(data) + 1); + var actualNumBytes = stringToUTF8Array(data, buf, 0, buf.length); + FS.write(stream, buf, 0, actualNumBytes, undefined, opts.canOwn); + } + else if (ArrayBuffer.isView(data)) { + FS.write(stream, data, 0, data.byteLength, undefined, opts.canOwn); + } + else { + throw new Error("Unsupported data type"); + } + FS.close(stream); + }, + cwd: function () { + return FS.currentPath; + }, + chdir: function (path) { + var lookup = FS.lookupPath(path, { + follow: true, + }); + if (lookup.node === null) { + throw new FS.ErrnoError(44); + } + if (!FS.isDir(lookup.node.mode)) { + throw new FS.ErrnoError(54); + } + var errCode = FS.nodePermissions(lookup.node, "x"); + if (errCode) { + throw new FS.ErrnoError(errCode); + } + FS.currentPath = lookup.path; + }, + createDefaultDirectories: function () { + FS.mkdir("/tmp"); + FS.mkdir("/home"); + FS.mkdir("/home/web_user"); + }, + createDefaultDevices: function () { + FS.mkdir("/dev"); + FS.registerDevice(FS.makedev(1, 3), { + read: function () { + return 0; + }, + write: function (stream, buffer, offset, length, pos) { + return length; + }, + }); + FS.mkdev("/dev/null", FS.makedev(1, 3)); + TTY.register(FS.makedev(5, 0), TTY.default_tty_ops); + TTY.register(FS.makedev(6, 0), TTY.default_tty1_ops); + FS.mkdev("/dev/tty", FS.makedev(5, 0)); + FS.mkdev("/dev/tty1", FS.makedev(6, 0)); + var random_device = getRandomDevice(); + FS.createDevice("/dev", "random", random_device); + FS.createDevice("/dev", "urandom", random_device); + FS.mkdir("/dev/shm"); + FS.mkdir("/dev/shm/tmp"); + }, + createSpecialDirectories: function () { + FS.mkdir("/proc"); + FS.mkdir("/proc/self"); + FS.mkdir("/proc/self/fd"); + FS.mount({ + mount: function () { + var node = FS.createNode("/proc/self", "fd", 16384 | 511, 73); + node.node_ops = { + lookup: function (parent, name) { + var fd = +name; + var stream = FS.getStream(fd); + if (!stream) + throw new FS.ErrnoError(8); + var ret = { + parent: null, + mount: { + mountpoint: "fake", + }, + node_ops: { + readlink: function () { + return stream.path; + }, + }, + }; + ret.parent = ret; + return ret; + }, + }; + return node; + }, + }, {}, "/proc/self/fd"); + }, + createStandardStreams: function () { + if (Module["stdin"]) { + FS.createDevice("/dev", "stdin", Module["stdin"]); + } + else { + FS.symlink("/dev/tty", "/dev/stdin"); + } + if (Module["stdout"]) { + FS.createDevice("/dev", "stdout", null, Module["stdout"]); + } + else { + FS.symlink("/dev/tty", "/dev/stdout"); + } + if (Module["stderr"]) { + FS.createDevice("/dev", "stderr", null, Module["stderr"]); + } + else { + FS.symlink("/dev/tty1", "/dev/stderr"); + } + var stdin = FS.open("/dev/stdin", 0); + var stdout = FS.open("/dev/stdout", 1); + var stderr = FS.open("/dev/stderr", 1); + }, + ensureErrnoError: function () { + if (FS.ErrnoError) + return; + FS.ErrnoError = function ErrnoError(errno, node) { + this.node = node; + this.setErrno = function (errno) { + this.errno = errno; + }; + this.setErrno(errno); + this.message = "FS error"; + }; + FS.ErrnoError.prototype = new Error(); + FS.ErrnoError.prototype.constructor = FS.ErrnoError; + [44].forEach(function (code) { + FS.genericErrors[code] = new FS.ErrnoError(code); + FS.genericErrors[code].stack = ""; + }); + }, + staticInit: function () { + FS.ensureErrnoError(); + FS.nameTable = new Array(4096); + FS.mount(MEMFS, {}, "/"); + FS.createDefaultDirectories(); + FS.createDefaultDevices(); + FS.createSpecialDirectories(); + FS.filesystems = { + MEMFS: MEMFS, + }; + }, + init: function (input, output, error) { + FS.init.initialized = true; + FS.ensureErrnoError(); + Module["stdin"] = input || Module["stdin"]; + Module["stdout"] = output || Module["stdout"]; + Module["stderr"] = error || Module["stderr"]; + FS.createStandardStreams(); + }, + quit: function () { + FS.init.initialized = false; + var fflush = Module["_fflush"]; + if (fflush) + fflush(0); + for (var i = 0; i < FS.streams.length; i++) { + var stream = FS.streams[i]; + if (!stream) { + continue; + } + FS.close(stream); + } + }, + getMode: function (canRead, canWrite) { + var mode = 0; + if (canRead) + mode |= 292 | 73; + if (canWrite) + mode |= 146; + return mode; + }, + findObject: function (path, dontResolveLastLink) { + var ret = FS.analyzePath(path, dontResolveLastLink); + if (ret.exists) { + return ret.object; + } + else { + return null; + } + }, + analyzePath: function (path, dontResolveLastLink) { + try { + var lookup = FS.lookupPath(path, { + follow: !dontResolveLastLink, + }); + path = lookup.path; + } + catch (e) { } + var ret = { + isRoot: false, + exists: false, + error: 0, + name: null, + path: null, + object: null, + parentExists: false, + parentPath: null, + parentObject: null, + }; + try { + var lookup = FS.lookupPath(path, { + parent: true, + }); + ret.parentExists = true; + ret.parentPath = lookup.path; + ret.parentObject = lookup.node; + ret.name = PATH.basename(path); + lookup = FS.lookupPath(path, { + follow: !dontResolveLastLink, + }); + ret.exists = true; + ret.path = lookup.path; + ret.object = lookup.node; + ret.name = lookup.node.name; + ret.isRoot = lookup.path === "/"; + } + catch (e) { + ret.error = e.errno; + } + return ret; + }, + createPath: function (parent, path, canRead, canWrite) { + parent = typeof parent === "string" ? parent : FS.getPath(parent); + var parts = path.split("/").reverse(); + while (parts.length) { + var part = parts.pop(); + if (!part) + continue; + var current = PATH.join2(parent, part); + try { + FS.mkdir(current); + } + catch (e) { } + parent = current; + } + return current; + }, + createFile: function (parent, name, properties, canRead, canWrite) { + var path = PATH.join2(typeof parent === "string" ? parent : FS.getPath(parent), name); + var mode = FS.getMode(canRead, canWrite); + return FS.create(path, mode); + }, + createDataFile: function (parent, name, data, canRead, canWrite, canOwn) { + var path = name + ? PATH.join2(typeof parent === "string" ? parent : FS.getPath(parent), name) + : parent; + var mode = FS.getMode(canRead, canWrite); + var node = FS.create(path, mode); + if (data) { + if (typeof data === "string") { + var arr = new Array(data.length); + for (var i = 0, len = data.length; i < len; ++i) + arr[i] = data.charCodeAt(i); + data = arr; + } + FS.chmod(node, mode | 146); + var stream = FS.open(node, 577); + FS.write(stream, data, 0, data.length, 0, canOwn); + FS.close(stream); + FS.chmod(node, mode); + } + return node; + }, + createDevice: function (parent, name, input, output) { + var path = PATH.join2(typeof parent === "string" ? parent : FS.getPath(parent), name); + var mode = FS.getMode(!!input, !!output); + if (!FS.createDevice.major) + FS.createDevice.major = 64; + var dev = FS.makedev(FS.createDevice.major++, 0); + FS.registerDevice(dev, { + open: function (stream) { + stream.seekable = false; + }, + close: function (stream) { + if (output && output.buffer && output.buffer.length) { + output(10); + } + }, + read: function (stream, buffer, offset, length, pos) { + var bytesRead = 0; + for (var i = 0; i < length; i++) { + var result; + try { + result = input(); + } + catch (e) { + throw new FS.ErrnoError(29); + } + if (result === undefined && bytesRead === 0) { + throw new FS.ErrnoError(6); + } + if (result === null || result === undefined) + break; + bytesRead++; + buffer[offset + i] = result; + } + if (bytesRead) { + stream.node.timestamp = Date.now(); + } + return bytesRead; + }, + write: function (stream, buffer, offset, length, pos) { + for (var i = 0; i < length; i++) { + try { + output(buffer[offset + i]); + } + catch (e) { + throw new FS.ErrnoError(29); + } + } + if (length) { + stream.node.timestamp = Date.now(); + } + return i; + }, + }); + return FS.mkdev(path, mode, dev); + }, + forceLoadFile: function (obj) { + if (obj.isDevice || obj.isFolder || obj.link || obj.contents) + return true; + if (typeof XMLHttpRequest !== "undefined") { + throw new Error("Lazy loading should have been performed (contents set) in createLazyFile, but it was not. Lazy loading only works in web workers. Use --embed-file or --preload-file in emcc on the main thread."); + } + else if (read_) { + try { + obj.contents = intArrayFromString(read_(obj.url), true); + obj.usedBytes = obj.contents.length; + } + catch (e) { + throw new FS.ErrnoError(29); + } + } + else { + throw new Error("Cannot load without read() or XMLHttpRequest."); + } + }, + createLazyFile: function (parent, name, url, canRead, canWrite) { + function LazyUint8Array() { + this.lengthKnown = false; + this.chunks = []; + } + LazyUint8Array.prototype.get = function LazyUint8Array_get(idx) { + if (idx > this.length - 1 || idx < 0) { + return undefined; + } + var chunkOffset = idx % this.chunkSize; + var chunkNum = (idx / this.chunkSize) | 0; + return this.getter(chunkNum)[chunkOffset]; + }; + LazyUint8Array.prototype.setDataGetter = function LazyUint8Array_setDataGetter(getter) { + this.getter = getter; + }; + LazyUint8Array.prototype.cacheLength = function LazyUint8Array_cacheLength() { + var xhr = new XMLHttpRequest(); + xhr.open("HEAD", url, false); + xhr.send(null); + if (!((xhr.status >= 200 && xhr.status < 300) || xhr.status === 304)) + throw new Error("Couldn't load " + url + ". Status: " + xhr.status); + var datalength = Number(xhr.getResponseHeader("Content-length")); + var header; + var hasByteServing = (header = xhr.getResponseHeader("Accept-Ranges")) && header === "bytes"; + var usesGzip = (header = xhr.getResponseHeader("Content-Encoding")) && + header === "gzip"; + var chunkSize = 1024 * 1024; + if (!hasByteServing) + chunkSize = datalength; + var doXHR = function (from, to) { + if (from > to) + throw new Error("invalid range (" + from + ", " + to + ") or no bytes requested!"); + if (to > datalength - 1) + throw new Error("only " + datalength + " bytes available! programmer error!"); + var xhr = new XMLHttpRequest(); + xhr.open("GET", url, false); + if (datalength !== chunkSize) + xhr.setRequestHeader("Range", "bytes=" + from + "-" + to); + if (typeof Uint8Array != "undefined") + xhr.responseType = "arraybuffer"; + if (xhr.overrideMimeType) { + xhr.overrideMimeType("text/plain; charset=x-user-defined"); + } + xhr.send(null); + if (!((xhr.status >= 200 && xhr.status < 300) || xhr.status === 304)) + throw new Error("Couldn't load " + url + ". Status: " + xhr.status); + if (xhr.response !== undefined) { + return new Uint8Array(xhr.response || []); + } + else { + return intArrayFromString(xhr.responseText || "", true); + } + }; + var lazyArray = this; + lazyArray.setDataGetter(function (chunkNum) { + var start = chunkNum * chunkSize; + var end = (chunkNum + 1) * chunkSize - 1; + end = Math.min(end, datalength - 1); + if (typeof lazyArray.chunks[chunkNum] === "undefined") { + lazyArray.chunks[chunkNum] = doXHR(start, end); + } + if (typeof lazyArray.chunks[chunkNum] === "undefined") + throw new Error("doXHR failed!"); + return lazyArray.chunks[chunkNum]; + }); + if (usesGzip || !datalength) { + chunkSize = datalength = 1; + datalength = this.getter(0).length; + chunkSize = datalength; + out("LazyFiles on gzip forces download of the whole file when length is accessed"); + } + this._length = datalength; + this._chunkSize = chunkSize; + this.lengthKnown = true; + }; + if (typeof XMLHttpRequest !== "undefined") { + if (!ENVIRONMENT_IS_WORKER) + throw "Cannot do synchronous binary XHRs outside webworkers in modern browsers. Use --embed-file or --preload-file in emcc"; + var lazyArray = new LazyUint8Array(); + Object.defineProperties(lazyArray, { + length: { + get: function () { + if (!this.lengthKnown) { + this.cacheLength(); + } + return this._length; + }, + }, + chunkSize: { + get: function () { + if (!this.lengthKnown) { + this.cacheLength(); + } + return this._chunkSize; + }, + }, + }); + var properties = { + isDevice: false, + contents: lazyArray, + }; + } + else { + var properties = { + isDevice: false, + url: url, + }; + } + var node = FS.createFile(parent, name, properties, canRead, canWrite); + if (properties.contents) { + node.contents = properties.contents; + } + else if (properties.url) { + node.contents = null; + node.url = properties.url; + } + Object.defineProperties(node, { + usedBytes: { + get: function () { + return this.contents.length; + }, + }, + }); + var stream_ops = {}; + var keys = Object.keys(node.stream_ops); + keys.forEach(function (key) { + var fn = node.stream_ops[key]; + stream_ops[key] = function forceLoadLazyFile() { + FS.forceLoadFile(node); + return fn.apply(null, arguments); + }; + }); + stream_ops.read = function stream_ops_read(stream, buffer, offset, length, position) { + FS.forceLoadFile(node); + var contents = stream.node.contents; + if (position >= contents.length) + return 0; + var size = Math.min(contents.length - position, length); + if (contents.slice) { + for (var i = 0; i < size; i++) { + buffer[offset + i] = contents[position + i]; + } + } + else { + for (var i = 0; i < size; i++) { + buffer[offset + i] = contents.get(position + i); + } + } + return size; + }; + node.stream_ops = stream_ops; + return node; + }, + createPreloadedFile: function (parent, name, url, canRead, canWrite, onload, onerror, dontCreateFile, canOwn, preFinish) { + Browser.init(); + var fullname = name ? PATH_FS.resolve(PATH.join2(parent, name)) : parent; + var dep = getUniqueRunDependency("cp " + fullname); + function processData(byteArray) { + function finish(byteArray) { + if (preFinish) + preFinish(); + if (!dontCreateFile) { + FS.createDataFile(parent, name, byteArray, canRead, canWrite, canOwn); + } + if (onload) + onload(); + removeRunDependency(dep); + } + var handled = false; + Module["preloadPlugins"].forEach(function (plugin) { + if (handled) + return; + if (plugin["canHandle"](fullname)) { + plugin["handle"](byteArray, fullname, finish, function () { + if (onerror) + onerror(); + removeRunDependency(dep); + }); + handled = true; + } + }); + if (!handled) + finish(byteArray); + } + addRunDependency(dep); + if (typeof url == "string") { + Browser.asyncLoad(url, function (byteArray) { + processData(byteArray); + }, onerror); + } + else { + processData(url); + } + }, + indexedDB: function () { + return (window.indexedDB || + window.mozIndexedDB || + window.webkitIndexedDB || + window.msIndexedDB); + }, + DB_NAME: function () { + return "EM_FS_" + window.location.pathname; + }, + DB_VERSION: 20, + DB_STORE_NAME: "FILE_DATA", + saveFilesToDB: function (paths, onload, onerror) { + onload = onload || function () { }; + onerror = onerror || function () { }; + var indexedDB = FS.indexedDB(); + try { + var openRequest = indexedDB.open(FS.DB_NAME(), FS.DB_VERSION); + } + catch (e) { + return onerror(e); + } + openRequest.onupgradeneeded = function openRequest_onupgradeneeded() { + out("creating db"); + var db = openRequest.result; + db.createObjectStore(FS.DB_STORE_NAME); + }; + openRequest.onsuccess = function openRequest_onsuccess() { + var db = openRequest.result; + var transaction = db.transaction([FS.DB_STORE_NAME], "readwrite"); + var files = transaction.objectStore(FS.DB_STORE_NAME); + var ok = 0, fail = 0, total = paths.length; + function finish() { + if (fail == 0) + onload(); + else + onerror(); + } + paths.forEach(function (path) { + var putRequest = files.put(FS.analyzePath(path).object.contents, path); + putRequest.onsuccess = function putRequest_onsuccess() { + ok++; + if (ok + fail == total) + finish(); + }; + putRequest.onerror = function putRequest_onerror() { + fail++; + if (ok + fail == total) + finish(); + }; + }); + transaction.onerror = onerror; + }; + openRequest.onerror = onerror; + }, + loadFilesFromDB: function (paths, onload, onerror) { + onload = onload || function () { }; + onerror = onerror || function () { }; + var indexedDB = FS.indexedDB(); + try { + var openRequest = indexedDB.open(FS.DB_NAME(), FS.DB_VERSION); + } + catch (e) { + return onerror(e); + } + openRequest.onupgradeneeded = onerror; + openRequest.onsuccess = function openRequest_onsuccess() { + var db = openRequest.result; + try { + var transaction = db.transaction([FS.DB_STORE_NAME], "readonly"); + } + catch (e) { + onerror(e); + return; + } + var files = transaction.objectStore(FS.DB_STORE_NAME); + var ok = 0, fail = 0, total = paths.length; + function finish() { + if (fail == 0) + onload(); + else + onerror(); + } + paths.forEach(function (path) { + var getRequest = files.get(path); + getRequest.onsuccess = function getRequest_onsuccess() { + if (FS.analyzePath(path).exists) { + FS.unlink(path); + } + FS.createDataFile(PATH.dirname(path), PATH.basename(path), getRequest.result, true, true, true); + ok++; + if (ok + fail == total) + finish(); + }; + getRequest.onerror = function getRequest_onerror() { + fail++; + if (ok + fail == total) + finish(); + }; + }); + transaction.onerror = onerror; + }; + openRequest.onerror = onerror; + }, +}; +var SYSCALLS = { + mappings: {}, + DEFAULT_POLLMASK: 5, + umask: 511, + calculateAt: function (dirfd, path) { + if (path[0] !== "/") { + var dir; + if (dirfd === -100) { + dir = FS.cwd(); + } + else { + var dirstream = FS.getStream(dirfd); + if (!dirstream) + throw new FS.ErrnoError(8); + dir = dirstream.path; + } + path = PATH.join2(dir, path); + } + return path; + }, + doStat: function (func, path, buf) { + try { + var stat = func(path); + } + catch (e) { + if (e && + e.node && + PATH.normalize(path) !== PATH.normalize(FS.getPath(e.node))) { + return -54; + } + throw e; + } + GROWABLE_HEAP_I32()[buf >> 2] = stat.dev; + GROWABLE_HEAP_I32()[(buf + 4) >> 2] = 0; + GROWABLE_HEAP_I32()[(buf + 8) >> 2] = stat.ino; + GROWABLE_HEAP_I32()[(buf + 12) >> 2] = stat.mode; + GROWABLE_HEAP_I32()[(buf + 16) >> 2] = stat.nlink; + GROWABLE_HEAP_I32()[(buf + 20) >> 2] = stat.uid; + GROWABLE_HEAP_I32()[(buf + 24) >> 2] = stat.gid; + GROWABLE_HEAP_I32()[(buf + 28) >> 2] = stat.rdev; + GROWABLE_HEAP_I32()[(buf + 32) >> 2] = 0; + (tempI64 = [ + stat.size >>> 0, + ((tempDouble = stat.size), + +Math.abs(tempDouble) >= 1 + ? tempDouble > 0 + ? (Math.min(+Math.floor(tempDouble / 4294967296), 4294967295) | 0) >>> + 0 + : ~~+Math.ceil((tempDouble - +(~~tempDouble >>> 0)) / 4294967296) >>> + 0 + : 0), + ]), + (GROWABLE_HEAP_I32()[(buf + 40) >> 2] = tempI64[0]), + (GROWABLE_HEAP_I32()[(buf + 44) >> 2] = tempI64[1]); + GROWABLE_HEAP_I32()[(buf + 48) >> 2] = 4096; + GROWABLE_HEAP_I32()[(buf + 52) >> 2] = stat.blocks; + GROWABLE_HEAP_I32()[(buf + 56) >> 2] = (stat.atime.getTime() / 1e3) | 0; + GROWABLE_HEAP_I32()[(buf + 60) >> 2] = 0; + GROWABLE_HEAP_I32()[(buf + 64) >> 2] = (stat.mtime.getTime() / 1e3) | 0; + GROWABLE_HEAP_I32()[(buf + 68) >> 2] = 0; + GROWABLE_HEAP_I32()[(buf + 72) >> 2] = (stat.ctime.getTime() / 1e3) | 0; + GROWABLE_HEAP_I32()[(buf + 76) >> 2] = 0; + (tempI64 = [ + stat.ino >>> 0, + ((tempDouble = stat.ino), + +Math.abs(tempDouble) >= 1 + ? tempDouble > 0 + ? (Math.min(+Math.floor(tempDouble / 4294967296), 4294967295) | 0) >>> + 0 + : ~~+Math.ceil((tempDouble - +(~~tempDouble >>> 0)) / 4294967296) >>> + 0 + : 0), + ]), + (GROWABLE_HEAP_I32()[(buf + 80) >> 2] = tempI64[0]), + (GROWABLE_HEAP_I32()[(buf + 84) >> 2] = tempI64[1]); + return 0; + }, + doMsync: function (addr, stream, len, flags, offset) { + var buffer = GROWABLE_HEAP_U8().slice(addr, addr + len); + FS.msync(stream, buffer, offset, len, flags); + }, + doMkdir: function (path, mode) { + path = PATH.normalize(path); + if (path[path.length - 1] === "/") + path = path.substr(0, path.length - 1); + FS.mkdir(path, mode, 0); + return 0; + }, + doMknod: function (path, mode, dev) { + switch (mode & 61440) { + case 32768: + case 8192: + case 24576: + case 4096: + case 49152: + break; + default: + return -28; + } + FS.mknod(path, mode, dev); + return 0; + }, + doReadlink: function (path, buf, bufsize) { + if (bufsize <= 0) + return -28; + var ret = FS.readlink(path); + var len = Math.min(bufsize, lengthBytesUTF8(ret)); + var endChar = GROWABLE_HEAP_I8()[buf + len]; + stringToUTF8(ret, buf, bufsize + 1); + GROWABLE_HEAP_I8()[buf + len] = endChar; + return len; + }, + doAccess: function (path, amode) { + if (amode & ~7) { + return -28; + } + var node; + var lookup = FS.lookupPath(path, { + follow: true, + }); + node = lookup.node; + if (!node) { + return -44; + } + var perms = ""; + if (amode & 4) + perms += "r"; + if (amode & 2) + perms += "w"; + if (amode & 1) + perms += "x"; + if (perms && FS.nodePermissions(node, perms)) { + return -2; + } + return 0; + }, + doDup: function (path, flags, suggestFD) { + var suggest = FS.getStream(suggestFD); + if (suggest) + FS.close(suggest); + return FS.open(path, flags, 0, suggestFD, suggestFD).fd; + }, + doReadv: function (stream, iov, iovcnt, offset) { + var ret = 0; + for (var i = 0; i < iovcnt; i++) { + var ptr = GROWABLE_HEAP_I32()[(iov + i * 8) >> 2]; + var len = GROWABLE_HEAP_I32()[(iov + (i * 8 + 4)) >> 2]; + var curr = FS.read(stream, GROWABLE_HEAP_I8(), ptr, len, offset); + if (curr < 0) + return -1; + ret += curr; + if (curr < len) + break; + } + return ret; + }, + doWritev: function (stream, iov, iovcnt, offset) { + var ret = 0; + for (var i = 0; i < iovcnt; i++) { + var ptr = GROWABLE_HEAP_I32()[(iov + i * 8) >> 2]; + var len = GROWABLE_HEAP_I32()[(iov + (i * 8 + 4)) >> 2]; + var curr = FS.write(stream, GROWABLE_HEAP_I8(), ptr, len, offset); + if (curr < 0) + return -1; + ret += curr; + } + return ret; + }, + varargs: undefined, + get: function () { + SYSCALLS.varargs += 4; + var ret = GROWABLE_HEAP_I32()[(SYSCALLS.varargs - 4) >> 2]; + return ret; + }, + getStr: function (ptr) { + var ret = UTF8ToString(ptr); + return ret; + }, + getStreamFromFD: function (fd) { + var stream = FS.getStream(fd); + if (!stream) + throw new FS.ErrnoError(8); + return stream; + }, + get64: function (low, high) { + return low; + }, +}; +function ___sys_access(path, amode) { + if (ENVIRONMENT_IS_PTHREAD) + return _emscripten_proxy_to_main_thread_js(2, 1, path, amode); + try { + path = SYSCALLS.getStr(path); + return SYSCALLS.doAccess(path, amode); + } + catch (e) { + if (typeof FS === "undefined" || !(e instanceof FS.ErrnoError)) + abort(e); + return -e.errno; + } +} +function ___sys_fcntl64(fd, cmd, varargs) { + if (ENVIRONMENT_IS_PTHREAD) + return _emscripten_proxy_to_main_thread_js(3, 1, fd, cmd, varargs); + SYSCALLS.varargs = varargs; + try { + var stream = SYSCALLS.getStreamFromFD(fd); + switch (cmd) { + case 0: { + var arg = SYSCALLS.get(); + if (arg < 0) { + return -28; + } + var newStream; + newStream = FS.open(stream.path, stream.flags, 0, arg); + return newStream.fd; + } + case 1: + case 2: + return 0; + case 3: + return stream.flags; + case 4: { + var arg = SYSCALLS.get(); + stream.flags |= arg; + return 0; + } + case 12: { + var arg = SYSCALLS.get(); + var offset = 0; + GROWABLE_HEAP_I16()[(arg + offset) >> 1] = 2; + return 0; + } + case 13: + case 14: + return 0; + case 16: + case 8: + return -28; + case 9: + setErrNo(28); + return -1; + default: { + return -28; + } + } + } + catch (e) { + if (typeof FS === "undefined" || !(e instanceof FS.ErrnoError)) + abort(e); + return -e.errno; + } +} +function ___sys_fstat64(fd, buf) { + if (ENVIRONMENT_IS_PTHREAD) + return _emscripten_proxy_to_main_thread_js(4, 1, fd, buf); + try { + var stream = SYSCALLS.getStreamFromFD(fd); + return SYSCALLS.doStat(FS.stat, stream.path, buf); + } + catch (e) { + if (typeof FS === "undefined" || !(e instanceof FS.ErrnoError)) + abort(e); + return -e.errno; + } +} +function ___sys_getcwd(buf, size) { + if (ENVIRONMENT_IS_PTHREAD) + return _emscripten_proxy_to_main_thread_js(5, 1, buf, size); + try { + if (size === 0) + return -28; + var cwd = FS.cwd(); + var cwdLengthInBytes = lengthBytesUTF8(cwd); + if (size < cwdLengthInBytes + 1) + return -68; + stringToUTF8(cwd, buf, size); + return buf; + } + catch (e) { + if (typeof FS === "undefined" || !(e instanceof FS.ErrnoError)) + abort(e); + return -e.errno; + } +} +function ___sys_ioctl(fd, op, varargs) { + if (ENVIRONMENT_IS_PTHREAD) + return _emscripten_proxy_to_main_thread_js(6, 1, fd, op, varargs); + SYSCALLS.varargs = varargs; + try { + var stream = SYSCALLS.getStreamFromFD(fd); + switch (op) { + case 21509: + case 21505: { + if (!stream.tty) + return -59; + return 0; + } + case 21510: + case 21511: + case 21512: + case 21506: + case 21507: + case 21508: { + if (!stream.tty) + return -59; + return 0; + } + case 21519: { + if (!stream.tty) + return -59; + var argp = SYSCALLS.get(); + GROWABLE_HEAP_I32()[argp >> 2] = 0; + return 0; + } + case 21520: { + if (!stream.tty) + return -59; + return -28; + } + case 21531: { + var argp = SYSCALLS.get(); + return FS.ioctl(stream, op, argp); + } + case 21523: { + if (!stream.tty) + return -59; + return 0; + } + case 21524: { + if (!stream.tty) + return -59; + return 0; + } + default: + abort("bad ioctl syscall " + op); + } + } + catch (e) { + if (typeof FS === "undefined" || !(e instanceof FS.ErrnoError)) + abort(e); + return -e.errno; + } +} +function syscallMmap2(addr, len, prot, flags, fd, off) { + off <<= 12; + var ptr; + var allocated = false; + if ((flags & 16) !== 0 && addr % 16384 !== 0) { + return -28; + } + if ((flags & 32) !== 0) { + ptr = _memalign(16384, len); + if (!ptr) + return -48; + _memset(ptr, 0, len); + allocated = true; + } + else { + var info = FS.getStream(fd); + if (!info) + return -8; + var res = FS.mmap(info, addr, len, off, prot, flags); + ptr = res.ptr; + allocated = res.allocated; + } + SYSCALLS.mappings[ptr] = { + malloc: ptr, + len: len, + allocated: allocated, + fd: fd, + prot: prot, + flags: flags, + offset: off, + }; + return ptr; +} +function ___sys_mmap2(addr, len, prot, flags, fd, off) { + if (ENVIRONMENT_IS_PTHREAD) + return _emscripten_proxy_to_main_thread_js(7, 1, addr, len, prot, flags, fd, off); + try { + return syscallMmap2(addr, len, prot, flags, fd, off); + } + catch (e) { + if (typeof FS === "undefined" || !(e instanceof FS.ErrnoError)) + abort(e); + return -e.errno; + } +} +function syscallMunmap(addr, len) { + if ((addr | 0) === -1 || len === 0) { + return -28; + } + var info = SYSCALLS.mappings[addr]; + if (!info) + return 0; + if (len === info.len) { + var stream = FS.getStream(info.fd); + if (info.prot & 2) { + SYSCALLS.doMsync(addr, stream, len, info.flags, info.offset); + } + FS.munmap(stream); + SYSCALLS.mappings[addr] = null; + if (info.allocated) { + _free(info.malloc); + } + } + return 0; +} +function ___sys_munmap(addr, len) { + if (ENVIRONMENT_IS_PTHREAD) + return _emscripten_proxy_to_main_thread_js(8, 1, addr, len); + try { + return syscallMunmap(addr, len); + } + catch (e) { + if (typeof FS === "undefined" || !(e instanceof FS.ErrnoError)) + abort(e); + return -e.errno; + } +} +function ___sys_open(path, flags, varargs) { + if (ENVIRONMENT_IS_PTHREAD) + return _emscripten_proxy_to_main_thread_js(9, 1, path, flags, varargs); + SYSCALLS.varargs = varargs; + try { + var pathname = SYSCALLS.getStr(path); + var mode = SYSCALLS.get(); + var stream = FS.open(pathname, flags, mode); + return stream.fd; + } + catch (e) { + if (typeof FS === "undefined" || !(e instanceof FS.ErrnoError)) + abort(e); + return -e.errno; + } +} +function ___sys_rename(old_path, new_path) { + if (ENVIRONMENT_IS_PTHREAD) + return _emscripten_proxy_to_main_thread_js(10, 1, old_path, new_path); + try { + old_path = SYSCALLS.getStr(old_path); + new_path = SYSCALLS.getStr(new_path); + FS.rename(old_path, new_path); + return 0; + } + catch (e) { + if (typeof FS === "undefined" || !(e instanceof FS.ErrnoError)) + abort(e); + return -e.errno; + } +} +function ___sys_rmdir(path) { + if (ENVIRONMENT_IS_PTHREAD) + return _emscripten_proxy_to_main_thread_js(11, 1, path); + try { + path = SYSCALLS.getStr(path); + FS.rmdir(path); + return 0; + } + catch (e) { + if (typeof FS === "undefined" || !(e instanceof FS.ErrnoError)) + abort(e); + return -e.errno; + } +} +function ___sys_stat64(path, buf) { + if (ENVIRONMENT_IS_PTHREAD) + return _emscripten_proxy_to_main_thread_js(12, 1, path, buf); + try { + path = SYSCALLS.getStr(path); + return SYSCALLS.doStat(FS.stat, path, buf); + } + catch (e) { + if (typeof FS === "undefined" || !(e instanceof FS.ErrnoError)) + abort(e); + return -e.errno; + } +} +function ___sys_unlink(path) { + if (ENVIRONMENT_IS_PTHREAD) + return _emscripten_proxy_to_main_thread_js(13, 1, path); + try { + path = SYSCALLS.getStr(path); + FS.unlink(path); + return 0; + } + catch (e) { + if (typeof FS === "undefined" || !(e instanceof FS.ErrnoError)) + abort(e); + return -e.errno; + } +} +function ___sys_wait4(pid, wstart, options, rusage) { + try { + abort("cannot wait on child processes"); + } + catch (e) { + if (typeof FS === "undefined" || !(e instanceof FS.ErrnoError)) + abort(e); + return -e.errno; + } +} +function getShiftFromSize(size) { + switch (size) { + case 1: + return 0; + case 2: + return 1; + case 4: + return 2; + case 8: + return 3; + default: + throw new TypeError("Unknown type size: " + size); + } +} +function embind_init_charCodes() { + var codes = new Array(256); + for (var i = 0; i < 256; ++i) { + codes[i] = String.fromCharCode(i); + } + embind_charCodes = codes; +} +var embind_charCodes = undefined; +function readLatin1String(ptr) { + var ret = ""; + var c = ptr; + while (GROWABLE_HEAP_U8()[c]) { + ret += embind_charCodes[GROWABLE_HEAP_U8()[c++]]; + } + return ret; +} +var awaitingDependencies = {}; +var registeredTypes = {}; +var typeDependencies = {}; +var char_0 = 48; +var char_9 = 57; +function makeLegalFunctionName(name) { + if (undefined === name) { + return "_unknown"; + } + name = name.replace(/[^a-zA-Z0-9_]/g, "$"); + var f = name.charCodeAt(0); + if (f >= char_0 && f <= char_9) { + return "_" + name; + } + else { + return name; + } +} +function createNamedFunction(name, body) { + name = makeLegalFunctionName(name); + return function () { + "use strict"; + return body.apply(this, arguments); + }; +} +function extendError(baseErrorType, errorName) { + var errorClass = createNamedFunction(errorName, function (message) { + this.name = errorName; + this.message = message; + var stack = new Error(message).stack; + if (stack !== undefined) { + this.stack = + this.toString() + "\n" + stack.replace(/^Error(:[^\n]*)?\n/, ""); + } + }); + errorClass.prototype = Object.create(baseErrorType.prototype); + errorClass.prototype.constructor = errorClass; + errorClass.prototype.toString = function () { + if (this.message === undefined) { + return this.name; + } + else { + return this.name + ": " + this.message; + } + }; + return errorClass; +} +var BindingError = undefined; +function throwBindingError(message) { + throw new BindingError(message); +} +var InternalError = undefined; +function throwInternalError(message) { + throw new InternalError(message); +} +function whenDependentTypesAreResolved(myTypes, dependentTypes, getTypeConverters) { + myTypes.forEach(function (type) { + typeDependencies[type] = dependentTypes; + }); + function onComplete(typeConverters) { + var myTypeConverters = getTypeConverters(typeConverters); + if (myTypeConverters.length !== myTypes.length) { + throwInternalError("Mismatched type converter count"); + } + for (var i = 0; i < myTypes.length; ++i) { + registerType(myTypes[i], myTypeConverters[i]); + } + } + var typeConverters = new Array(dependentTypes.length); + var unregisteredTypes = []; + var registered = 0; + dependentTypes.forEach(function (dt, i) { + if (registeredTypes.hasOwnProperty(dt)) { + typeConverters[i] = registeredTypes[dt]; + } + else { + unregisteredTypes.push(dt); + if (!awaitingDependencies.hasOwnProperty(dt)) { + awaitingDependencies[dt] = []; + } + awaitingDependencies[dt].push(function () { + typeConverters[i] = registeredTypes[dt]; + ++registered; + if (registered === unregisteredTypes.length) { + onComplete(typeConverters); + } + }); + } + }); + if (0 === unregisteredTypes.length) { + onComplete(typeConverters); + } +} +function registerType(rawType, registeredInstance, options) { + options = options || {}; + if (!("argPackAdvance" in registeredInstance)) { + throw new TypeError("registerType registeredInstance requires argPackAdvance"); + } + var name = registeredInstance.name; + if (!rawType) { + throwBindingError('type "' + name + '" must have a positive integer typeid pointer'); + } + if (registeredTypes.hasOwnProperty(rawType)) { + if (options.ignoreDuplicateRegistrations) { + return; + } + else { + throwBindingError("Cannot register type '" + name + "' twice"); + } + } + registeredTypes[rawType] = registeredInstance; + delete typeDependencies[rawType]; + if (awaitingDependencies.hasOwnProperty(rawType)) { + var callbacks = awaitingDependencies[rawType]; + delete awaitingDependencies[rawType]; + callbacks.forEach(function (cb) { + cb(); + }); + } +} +function __embind_register_bool(rawType, name, size, trueValue, falseValue) { + var shift = getShiftFromSize(size); + name = readLatin1String(name); + registerType(rawType, { + name: name, + fromWireType: function (wt) { + return !!wt; + }, + toWireType: function (destructors, o) { + return o ? trueValue : falseValue; + }, + argPackAdvance: 8, + readValueFromPointer: function (pointer) { + var heap; + if (size === 1) { + heap = GROWABLE_HEAP_I8(); + } + else if (size === 2) { + heap = GROWABLE_HEAP_I16(); + } + else if (size === 4) { + heap = GROWABLE_HEAP_I32(); + } + else { + throw new TypeError("Unknown boolean type size: " + name); + } + return this["fromWireType"](heap[pointer >> shift]); + }, + destructorFunction: null, + }); +} +function ClassHandle_isAliasOf(other) { + if (!(this instanceof ClassHandle)) { + return false; + } + if (!(other instanceof ClassHandle)) { + return false; + } + var leftClass = this.$$.ptrType.registeredClass; + var left = this.$$.ptr; + var rightClass = other.$$.ptrType.registeredClass; + var right = other.$$.ptr; + while (leftClass.baseClass) { + left = leftClass.upcast(left); + leftClass = leftClass.baseClass; + } + while (rightClass.baseClass) { + right = rightClass.upcast(right); + rightClass = rightClass.baseClass; + } + return leftClass === rightClass && left === right; +} +function shallowCopyInternalPointer(o) { + return { + count: o.count, + deleteScheduled: o.deleteScheduled, + preservePointerOnDelete: o.preservePointerOnDelete, + ptr: o.ptr, + ptrType: o.ptrType, + smartPtr: o.smartPtr, + smartPtrType: o.smartPtrType, + }; +} +function throwInstanceAlreadyDeleted(obj) { + function getInstanceTypeName(handle) { + return handle.$$.ptrType.registeredClass.name; + } + throwBindingError(getInstanceTypeName(obj) + " instance already deleted"); +} +var finalizationGroup = false; +function detachFinalizer(handle) { } +function runDestructor($$) { + if ($$.smartPtr) { + $$.smartPtrType.rawDestructor($$.smartPtr); + } + else { + $$.ptrType.registeredClass.rawDestructor($$.ptr); + } +} +function releaseClassHandle($$) { + $$.count.value -= 1; + var toDelete = 0 === $$.count.value; + if (toDelete) { + runDestructor($$); + } +} +function attachFinalizer(handle) { + if ("undefined" === typeof FinalizationGroup) { + attachFinalizer = function (handle) { + return handle; + }; + return handle; + } + finalizationGroup = new FinalizationGroup(function (iter) { + for (var result = iter.next(); !result.done; result = iter.next()) { + var $$ = result.value; + if (!$$.ptr) { + console.warn("object already deleted: " + $$.ptr); + } + else { + releaseClassHandle($$); + } + } + }); + attachFinalizer = function (handle) { + finalizationGroup.register(handle, handle.$$, handle.$$); + return handle; + }; + detachFinalizer = function (handle) { + finalizationGroup.unregister(handle.$$); + }; + return attachFinalizer(handle); +} +function ClassHandle_clone() { + if (!this.$$.ptr) { + throwInstanceAlreadyDeleted(this); + } + if (this.$$.preservePointerOnDelete) { + this.$$.count.value += 1; + return this; + } + else { + var clone = attachFinalizer(Object.create(Object.getPrototypeOf(this), { + $$: { + value: shallowCopyInternalPointer(this.$$), + }, + })); + clone.$$.count.value += 1; + clone.$$.deleteScheduled = false; + return clone; + } +} +function ClassHandle_delete() { + if (!this.$$.ptr) { + throwInstanceAlreadyDeleted(this); + } + if (this.$$.deleteScheduled && !this.$$.preservePointerOnDelete) { + throwBindingError("Object already scheduled for deletion"); + } + detachFinalizer(this); + releaseClassHandle(this.$$); + if (!this.$$.preservePointerOnDelete) { + this.$$.smartPtr = undefined; + this.$$.ptr = undefined; + } +} +function ClassHandle_isDeleted() { + return !this.$$.ptr; +} +var delayFunction = undefined; +var deletionQueue = []; +function flushPendingDeletes() { + while (deletionQueue.length) { + var obj = deletionQueue.pop(); + obj.$$.deleteScheduled = false; + obj["delete"](); + } +} +function ClassHandle_deleteLater() { + if (!this.$$.ptr) { + throwInstanceAlreadyDeleted(this); + } + if (this.$$.deleteScheduled && !this.$$.preservePointerOnDelete) { + throwBindingError("Object already scheduled for deletion"); + } + deletionQueue.push(this); + if (deletionQueue.length === 1 && delayFunction) { + delayFunction(flushPendingDeletes); + } + this.$$.deleteScheduled = true; + return this; +} +function init_ClassHandle() { + ClassHandle.prototype["isAliasOf"] = ClassHandle_isAliasOf; + ClassHandle.prototype["clone"] = ClassHandle_clone; + ClassHandle.prototype["delete"] = ClassHandle_delete; + ClassHandle.prototype["isDeleted"] = ClassHandle_isDeleted; + ClassHandle.prototype["deleteLater"] = ClassHandle_deleteLater; +} +function ClassHandle() { } +var registeredPointers = {}; +function ensureOverloadTable(proto, methodName, humanName) { + if (undefined === proto[methodName].overloadTable) { + var prevFunc = proto[methodName]; + proto[methodName] = function () { + if (!proto[methodName].overloadTable.hasOwnProperty(arguments.length)) { + throwBindingError("Function '" + + humanName + + "' called with an invalid number of arguments (" + + arguments.length + + ") - expects one of (" + + proto[methodName].overloadTable + + ")!"); + } + return proto[methodName].overloadTable[arguments.length].apply(this, arguments); + }; + proto[methodName].overloadTable = []; + proto[methodName].overloadTable[prevFunc.argCount] = prevFunc; + } +} +function exposePublicSymbol(name, value, numArguments) { + if (Module.hasOwnProperty(name)) { + if (undefined === numArguments || + (undefined !== Module[name].overloadTable && + undefined !== Module[name].overloadTable[numArguments])) { + throwBindingError("Cannot register public name '" + name + "' twice"); + } + ensureOverloadTable(Module, name, name); + if (Module.hasOwnProperty(numArguments)) { + throwBindingError("Cannot register multiple overloads of a function with the same number of arguments (" + + numArguments + + ")!"); + } + Module[name].overloadTable[numArguments] = value; + } + else { + Module[name] = value; + if (undefined !== numArguments) { + Module[name].numArguments = numArguments; + } + } +} +function RegisteredClass(name, constructor, instancePrototype, rawDestructor, baseClass, getActualType, upcast, downcast) { + this.name = name; + this.constructor = constructor; + this.instancePrototype = instancePrototype; + this.rawDestructor = rawDestructor; + this.baseClass = baseClass; + this.getActualType = getActualType; + this.upcast = upcast; + this.downcast = downcast; + this.pureVirtualFunctions = []; +} +function upcastPointer(ptr, ptrClass, desiredClass) { + while (ptrClass !== desiredClass) { + if (!ptrClass.upcast) { + throwBindingError("Expected null or instance of " + + desiredClass.name + + ", got an instance of " + + ptrClass.name); + } + ptr = ptrClass.upcast(ptr); + ptrClass = ptrClass.baseClass; + } + return ptr; +} +function constNoSmartPtrRawPointerToWireType(destructors, handle) { + if (handle === null) { + if (this.isReference) { + throwBindingError("null is not a valid " + this.name); + } + return 0; + } + if (!handle.$$) { + throwBindingError('Cannot pass "' + _embind_repr(handle) + '" as a ' + this.name); + } + if (!handle.$$.ptr) { + throwBindingError("Cannot pass deleted object as a pointer of type " + this.name); + } + var handleClass = handle.$$.ptrType.registeredClass; + var ptr = upcastPointer(handle.$$.ptr, handleClass, this.registeredClass); + return ptr; +} +function genericPointerToWireType(destructors, handle) { + var ptr; + if (handle === null) { + if (this.isReference) { + throwBindingError("null is not a valid " + this.name); + } + if (this.isSmartPointer) { + ptr = this.rawConstructor(); + if (destructors !== null) { + destructors.push(this.rawDestructor, ptr); + } + return ptr; + } + else { + return 0; + } + } + if (!handle.$$) { + throwBindingError('Cannot pass "' + _embind_repr(handle) + '" as a ' + this.name); + } + if (!handle.$$.ptr) { + throwBindingError("Cannot pass deleted object as a pointer of type " + this.name); + } + if (!this.isConst && handle.$$.ptrType.isConst) { + throwBindingError("Cannot convert argument of type " + + (handle.$$.smartPtrType + ? handle.$$.smartPtrType.name + : handle.$$.ptrType.name) + + " to parameter type " + + this.name); + } + var handleClass = handle.$$.ptrType.registeredClass; + ptr = upcastPointer(handle.$$.ptr, handleClass, this.registeredClass); + if (this.isSmartPointer) { + if (undefined === handle.$$.smartPtr) { + throwBindingError("Passing raw pointer to smart pointer is illegal"); + } + switch (this.sharingPolicy) { + case 0: + if (handle.$$.smartPtrType === this) { + ptr = handle.$$.smartPtr; + } + else { + throwBindingError("Cannot convert argument of type " + + (handle.$$.smartPtrType + ? handle.$$.smartPtrType.name + : handle.$$.ptrType.name) + + " to parameter type " + + this.name); + } + break; + case 1: + ptr = handle.$$.smartPtr; + break; + case 2: + if (handle.$$.smartPtrType === this) { + ptr = handle.$$.smartPtr; + } + else { + var clonedHandle = handle["clone"](); + ptr = this.rawShare(ptr, __emval_register(function () { + clonedHandle["delete"](); + })); + if (destructors !== null) { + destructors.push(this.rawDestructor, ptr); + } + } + break; + default: + throwBindingError("Unsupporting sharing policy"); + } + } + return ptr; +} +function nonConstNoSmartPtrRawPointerToWireType(destructors, handle) { + if (handle === null) { + if (this.isReference) { + throwBindingError("null is not a valid " + this.name); + } + return 0; + } + if (!handle.$$) { + throwBindingError('Cannot pass "' + _embind_repr(handle) + '" as a ' + this.name); + } + if (!handle.$$.ptr) { + throwBindingError("Cannot pass deleted object as a pointer of type " + this.name); + } + if (handle.$$.ptrType.isConst) { + throwBindingError("Cannot convert argument of type " + + handle.$$.ptrType.name + + " to parameter type " + + this.name); + } + var handleClass = handle.$$.ptrType.registeredClass; + var ptr = upcastPointer(handle.$$.ptr, handleClass, this.registeredClass); + return ptr; +} +function simpleReadValueFromPointer(pointer) { + return this["fromWireType"](GROWABLE_HEAP_U32()[pointer >> 2]); +} +function RegisteredPointer_getPointee(ptr) { + if (this.rawGetPointee) { + ptr = this.rawGetPointee(ptr); + } + return ptr; +} +function RegisteredPointer_destructor(ptr) { + if (this.rawDestructor) { + this.rawDestructor(ptr); + } +} +function RegisteredPointer_deleteObject(handle) { + if (handle !== null) { + handle["delete"](); + } +} +function downcastPointer(ptr, ptrClass, desiredClass) { + if (ptrClass === desiredClass) { + return ptr; + } + if (undefined === desiredClass.baseClass) { + return null; + } + var rv = downcastPointer(ptr, ptrClass, desiredClass.baseClass); + if (rv === null) { + return null; + } + return desiredClass.downcast(rv); +} +function getInheritedInstanceCount() { + return Object.keys(registeredInstances).length; +} +function getLiveInheritedInstances() { + var rv = []; + for (var k in registeredInstances) { + if (registeredInstances.hasOwnProperty(k)) { + rv.push(registeredInstances[k]); + } + } + return rv; +} +function setDelayFunction(fn) { + delayFunction = fn; + if (deletionQueue.length && delayFunction) { + delayFunction(flushPendingDeletes); + } +} +function init_embind() { + Module["getInheritedInstanceCount"] = getInheritedInstanceCount; + Module["getLiveInheritedInstances"] = getLiveInheritedInstances; + Module["flushPendingDeletes"] = flushPendingDeletes; + Module["setDelayFunction"] = setDelayFunction; +} +var registeredInstances = {}; +function getBasestPointer(class_, ptr) { + if (ptr === undefined) { + throwBindingError("ptr should not be undefined"); + } + while (class_.baseClass) { + ptr = class_.upcast(ptr); + class_ = class_.baseClass; + } + return ptr; +} +function getInheritedInstance(class_, ptr) { + ptr = getBasestPointer(class_, ptr); + return registeredInstances[ptr]; +} +function makeClassHandle(prototype, record) { + if (!record.ptrType || !record.ptr) { + throwInternalError("makeClassHandle requires ptr and ptrType"); + } + var hasSmartPtrType = !!record.smartPtrType; + var hasSmartPtr = !!record.smartPtr; + if (hasSmartPtrType !== hasSmartPtr) { + throwInternalError("Both smartPtrType and smartPtr must be specified"); + } + record.count = { + value: 1, + }; + return attachFinalizer(Object.create(prototype, { + $$: { + value: record, + }, + })); +} +function RegisteredPointer_fromWireType(ptr) { + var rawPointer = this.getPointee(ptr); + if (!rawPointer) { + this.destructor(ptr); + return null; + } + var registeredInstance = getInheritedInstance(this.registeredClass, rawPointer); + if (undefined !== registeredInstance) { + if (0 === registeredInstance.$$.count.value) { + registeredInstance.$$.ptr = rawPointer; + registeredInstance.$$.smartPtr = ptr; + return registeredInstance["clone"](); + } + else { + var rv = registeredInstance["clone"](); + this.destructor(ptr); + return rv; + } + } + function makeDefaultHandle() { + if (this.isSmartPointer) { + return makeClassHandle(this.registeredClass.instancePrototype, { + ptrType: this.pointeeType, + ptr: rawPointer, + smartPtrType: this, + smartPtr: ptr, + }); + } + else { + return makeClassHandle(this.registeredClass.instancePrototype, { + ptrType: this, + ptr: ptr, + }); + } + } + var actualType = this.registeredClass.getActualType(rawPointer); + var registeredPointerRecord = registeredPointers[actualType]; + if (!registeredPointerRecord) { + return makeDefaultHandle.call(this); + } + var toType; + if (this.isConst) { + toType = registeredPointerRecord.constPointerType; + } + else { + toType = registeredPointerRecord.pointerType; + } + var dp = downcastPointer(rawPointer, this.registeredClass, toType.registeredClass); + if (dp === null) { + return makeDefaultHandle.call(this); + } + if (this.isSmartPointer) { + return makeClassHandle(toType.registeredClass.instancePrototype, { + ptrType: toType, + ptr: dp, + smartPtrType: this, + smartPtr: ptr, + }); + } + else { + return makeClassHandle(toType.registeredClass.instancePrototype, { + ptrType: toType, + ptr: dp, + }); + } +} +function init_RegisteredPointer() { + RegisteredPointer.prototype.getPointee = RegisteredPointer_getPointee; + RegisteredPointer.prototype.destructor = RegisteredPointer_destructor; + RegisteredPointer.prototype["argPackAdvance"] = 8; + RegisteredPointer.prototype["readValueFromPointer"] = simpleReadValueFromPointer; + RegisteredPointer.prototype["deleteObject"] = RegisteredPointer_deleteObject; + RegisteredPointer.prototype["fromWireType"] = RegisteredPointer_fromWireType; +} +function RegisteredPointer(name, registeredClass, isReference, isConst, isSmartPointer, pointeeType, sharingPolicy, rawGetPointee, rawConstructor, rawShare, rawDestructor) { + this.name = name; + this.registeredClass = registeredClass; + this.isReference = isReference; + this.isConst = isConst; + this.isSmartPointer = isSmartPointer; + this.pointeeType = pointeeType; + this.sharingPolicy = sharingPolicy; + this.rawGetPointee = rawGetPointee; + this.rawConstructor = rawConstructor; + this.rawShare = rawShare; + this.rawDestructor = rawDestructor; + if (!isSmartPointer && registeredClass.baseClass === undefined) { + if (isConst) { + this["toWireType"] = constNoSmartPtrRawPointerToWireType; + this.destructorFunction = null; + } + else { + this["toWireType"] = nonConstNoSmartPtrRawPointerToWireType; + this.destructorFunction = null; + } + } + else { + this["toWireType"] = genericPointerToWireType; + } +} +function replacePublicSymbol(name, value, numArguments) { + if (!Module.hasOwnProperty(name)) { + throwInternalError("Replacing nonexistant public symbol"); + } + if (undefined !== Module[name].overloadTable && undefined !== numArguments) { + Module[name].overloadTable[numArguments] = value; + } + else { + Module[name] = value; + Module[name].argCount = numArguments; + } +} +function getDynCaller(sig, ptr) { + assert(sig.indexOf("j") >= 0, "getDynCaller should only be called with i64 sigs"); + var argCache = []; + return function () { + argCache.length = arguments.length; + for (var i = 0; i < arguments.length; i++) { + argCache[i] = arguments[i]; + } + return dynCall(sig, ptr, argCache); + }; +} +function embind__requireFunction(signature, rawFunction) { + signature = readLatin1String(signature); + function makeDynCaller() { + if (signature.indexOf("j") != -1) { + return getDynCaller(signature, rawFunction); + } + return wasmTable.get(rawFunction); + } + var fp = makeDynCaller(); + if (typeof fp !== "function") { + throwBindingError("unknown function pointer with signature " + + signature + + ": " + + rawFunction); + } + return fp; +} +var UnboundTypeError = undefined; +function getTypeName(type) { + var ptr = ___getTypeName(type); + var rv = readLatin1String(ptr); + _free(ptr); + return rv; +} +function throwUnboundTypeError(message, types) { + var unboundTypes = []; + var seen = {}; + function visit(type) { + if (seen[type]) { + return; + } + if (registeredTypes[type]) { + return; + } + if (typeDependencies[type]) { + typeDependencies[type].forEach(visit); + return; + } + unboundTypes.push(type); + seen[type] = true; + } + types.forEach(visit); + throw new UnboundTypeError(message + ": " + unboundTypes.map(getTypeName).join([", "])); +} +function __embind_register_class(rawType, rawPointerType, rawConstPointerType, baseClassRawType, getActualTypeSignature, getActualType, upcastSignature, upcast, downcastSignature, downcast, name, destructorSignature, rawDestructor) { + name = readLatin1String(name); + getActualType = embind__requireFunction(getActualTypeSignature, getActualType); + if (upcast) { + upcast = embind__requireFunction(upcastSignature, upcast); + } + if (downcast) { + downcast = embind__requireFunction(downcastSignature, downcast); + } + rawDestructor = embind__requireFunction(destructorSignature, rawDestructor); + var legalFunctionName = makeLegalFunctionName(name); + exposePublicSymbol(legalFunctionName, function () { + throwUnboundTypeError("Cannot construct " + name + " due to unbound types", [baseClassRawType]); + }); + whenDependentTypesAreResolved([rawType, rawPointerType, rawConstPointerType], baseClassRawType ? [baseClassRawType] : [], function (base) { + base = base[0]; + var baseClass; + var basePrototype; + if (baseClassRawType) { + baseClass = base.registeredClass; + basePrototype = baseClass.instancePrototype; + } + else { + basePrototype = ClassHandle.prototype; + } + var constructor = createNamedFunction(legalFunctionName, function () { + if (Object.getPrototypeOf(this) !== instancePrototype) { + throw new BindingError("Use 'new' to construct " + name); + } + if (undefined === registeredClass.constructor_body) { + throw new BindingError(name + " has no accessible constructor"); + } + var body = registeredClass.constructor_body[arguments.length]; + if (undefined === body) { + throw new BindingError("Tried to invoke ctor of " + + name + + " with invalid number of parameters (" + + arguments.length + + ") - expected (" + + Object.keys(registeredClass.constructor_body).toString() + + ") parameters instead!"); + } + return body.apply(this, arguments); + }); + var instancePrototype = Object.create(basePrototype, { + constructor: { + value: constructor, + }, + }); + constructor.prototype = instancePrototype; + var registeredClass = new RegisteredClass(name, constructor, instancePrototype, rawDestructor, baseClass, getActualType, upcast, downcast); + var referenceConverter = new RegisteredPointer(name, registeredClass, true, false, false); + var pointerConverter = new RegisteredPointer(name + "*", registeredClass, false, false, false); + var constPointerConverter = new RegisteredPointer(name + " const*", registeredClass, false, true, false); + registeredPointers[rawType] = { + pointerType: pointerConverter, + constPointerType: constPointerConverter, + }; + replacePublicSymbol(legalFunctionName, constructor); + return [referenceConverter, pointerConverter, constPointerConverter]; + }); +} +function heap32VectorToArray(count, firstElement) { + var array = []; + for (var i = 0; i < count; i++) { + array.push(GROWABLE_HEAP_I32()[(firstElement >> 2) + i]); + } + return array; +} +function runDestructors(destructors) { + while (destructors.length) { + var ptr = destructors.pop(); + var del = destructors.pop(); + del(ptr); + } +} +function __embind_register_class_constructor(rawClassType, argCount, rawArgTypesAddr, invokerSignature, invoker, rawConstructor) { + assert(argCount > 0); + var rawArgTypes = heap32VectorToArray(argCount, rawArgTypesAddr); + invoker = embind__requireFunction(invokerSignature, invoker); + var args = [rawConstructor]; + var destructors = []; + whenDependentTypesAreResolved([], [rawClassType], function (classType) { + classType = classType[0]; + var humanName = "constructor " + classType.name; + if (undefined === classType.registeredClass.constructor_body) { + classType.registeredClass.constructor_body = []; + } + if (undefined !== classType.registeredClass.constructor_body[argCount - 1]) { + throw new BindingError("Cannot register multiple constructors with identical number of parameters (" + + (argCount - 1) + + ") for class '" + + classType.name + + "'! Overload resolution is currently only performed using the parameter count, not actual type info!"); + } + classType.registeredClass.constructor_body[argCount - 1] = function unboundTypeHandler() { + throwUnboundTypeError("Cannot construct " + classType.name + " due to unbound types", rawArgTypes); + }; + whenDependentTypesAreResolved([], rawArgTypes, function (argTypes) { + classType.registeredClass.constructor_body[argCount - 1] = function constructor_body() { + if (arguments.length !== argCount - 1) { + throwBindingError(humanName + + " called with " + + arguments.length + + " arguments, expected " + + (argCount - 1)); + } + destructors.length = 0; + args.length = argCount; + for (var i = 1; i < argCount; ++i) { + args[i] = argTypes[i]["toWireType"](destructors, arguments[i - 1]); + } + var ptr = invoker.apply(null, args); + runDestructors(destructors); + return argTypes[0]["fromWireType"](ptr); + }; + return []; + }); + return []; + }); +} +function craftInvokerFunction(humanName, argTypes, classType, cppInvokerFunc, cppTargetFunc) { + var argCount = argTypes.length; + if (argCount < 2) { + throwBindingError("argTypes array size mismatch! Must at least get return value and 'this' types!"); + } + var isClassMethodFunc = argTypes[1] !== null && classType !== null; + var needsDestructorStack = false; + for (var i = 1; i < argTypes.length; ++i) { + if (argTypes[i] !== null && argTypes[i].destructorFunction === undefined) { + needsDestructorStack = true; + break; + } + } + var returns = argTypes[0].name !== "void"; + var expectedArgCount = argCount - 2; + var argsWired = new Array(expectedArgCount); + var invokerFuncArgs = []; + var destructors = []; + return function () { + if (arguments.length !== expectedArgCount) { + throwBindingError("function " + + humanName + + " called with " + + arguments.length + + " arguments, expected " + + expectedArgCount + + " args!"); + } + destructors.length = 0; + var thisWired; + invokerFuncArgs.length = isClassMethodFunc ? 2 : 1; + invokerFuncArgs[0] = cppTargetFunc; + if (isClassMethodFunc) { + thisWired = argTypes[1].toWireType(destructors, this); + invokerFuncArgs[1] = thisWired; + } + for (var i = 0; i < expectedArgCount; ++i) { + argsWired[i] = argTypes[i + 2].toWireType(destructors, arguments[i]); + invokerFuncArgs.push(argsWired[i]); + } + var rv = cppInvokerFunc.apply(null, invokerFuncArgs); + if (needsDestructorStack) { + runDestructors(destructors); + } + else { + for (var i = isClassMethodFunc ? 1 : 2; i < argTypes.length; i++) { + var param = i === 1 ? thisWired : argsWired[i - 2]; + if (argTypes[i].destructorFunction !== null) { + argTypes[i].destructorFunction(param); + } + } + } + if (returns) { + return argTypes[0].fromWireType(rv); + } + }; +} +function __embind_register_class_function(rawClassType, methodName, argCount, rawArgTypesAddr, invokerSignature, rawInvoker, context, isPureVirtual) { + var rawArgTypes = heap32VectorToArray(argCount, rawArgTypesAddr); + methodName = readLatin1String(methodName); + rawInvoker = embind__requireFunction(invokerSignature, rawInvoker); + whenDependentTypesAreResolved([], [rawClassType], function (classType) { + classType = classType[0]; + var humanName = classType.name + "." + methodName; + if (isPureVirtual) { + classType.registeredClass.pureVirtualFunctions.push(methodName); + } + function unboundTypesHandler() { + throwUnboundTypeError("Cannot call " + humanName + " due to unbound types", rawArgTypes); + } + var proto = classType.registeredClass.instancePrototype; + var method = proto[methodName]; + if (undefined === method || + (undefined === method.overloadTable && + method.className !== classType.name && + method.argCount === argCount - 2)) { + unboundTypesHandler.argCount = argCount - 2; + unboundTypesHandler.className = classType.name; + proto[methodName] = unboundTypesHandler; + } + else { + ensureOverloadTable(proto, methodName, humanName); + proto[methodName].overloadTable[argCount - 2] = unboundTypesHandler; + } + whenDependentTypesAreResolved([], rawArgTypes, function (argTypes) { + var memberFunction = craftInvokerFunction(humanName, argTypes, classType, rawInvoker, context); + if (undefined === proto[methodName].overloadTable) { + memberFunction.argCount = argCount - 2; + proto[methodName] = memberFunction; + } + else { + proto[methodName].overloadTable[argCount - 2] = memberFunction; + } + return []; + }); + return []; + }); +} +var emval_free_list = []; +var emval_handle_array = [ + {}, + { + value: undefined, + }, + { + value: null, + }, + { + value: true, + }, + { + value: false, + }, +]; +function __emval_decref(handle) { + if (handle > 4 && 0 === --emval_handle_array[handle].refcount) { + emval_handle_array[handle] = undefined; + emval_free_list.push(handle); + } +} +function count_emval_handles() { + var count = 0; + for (var i = 5; i < emval_handle_array.length; ++i) { + if (emval_handle_array[i] !== undefined) { + ++count; + } + } + return count; +} +function get_first_emval() { + for (var i = 5; i < emval_handle_array.length; ++i) { + if (emval_handle_array[i] !== undefined) { + return emval_handle_array[i]; + } + } + return null; +} +function init_emval() { + Module["count_emval_handles"] = count_emval_handles; + Module["get_first_emval"] = get_first_emval; +} +function __emval_register(value) { + switch (value) { + case undefined: { + return 1; + } + case null: { + return 2; + } + case true: { + return 3; + } + case false: { + return 4; + } + default: { + var handle = emval_free_list.length + ? emval_free_list.pop() + : emval_handle_array.length; + emval_handle_array[handle] = { + refcount: 1, + value: value, + }; + return handle; + } + } +} +function __embind_register_emval(rawType, name) { + name = readLatin1String(name); + registerType(rawType, { + name: name, + fromWireType: function (handle) { + var rv = emval_handle_array[handle].value; + __emval_decref(handle); + return rv; + }, + toWireType: function (destructors, value) { + return __emval_register(value); + }, + argPackAdvance: 8, + readValueFromPointer: simpleReadValueFromPointer, + destructorFunction: null, + }); +} +function _embind_repr(v) { + if (v === null) { + return "null"; + } + var t = typeof v; + if (t === "object" || t === "array" || t === "function") { + return v.toString(); + } + else { + return "" + v; + } +} +function floatReadValueFromPointer(name, shift) { + switch (shift) { + case 2: + return function (pointer) { + return this["fromWireType"](GROWABLE_HEAP_F32()[pointer >> 2]); + }; + case 3: + return function (pointer) { + return this["fromWireType"](GROWABLE_HEAP_F64()[pointer >> 3]); + }; + default: + throw new TypeError("Unknown float type: " + name); + } +} +function __embind_register_float(rawType, name, size) { + var shift = getShiftFromSize(size); + name = readLatin1String(name); + registerType(rawType, { + name: name, + fromWireType: function (value) { + return value; + }, + toWireType: function (destructors, value) { + if (typeof value !== "number" && typeof value !== "boolean") { + throw new TypeError('Cannot convert "' + _embind_repr(value) + '" to ' + this.name); + } + return value; + }, + argPackAdvance: 8, + readValueFromPointer: floatReadValueFromPointer(name, shift), + destructorFunction: null, + }); +} +function integerReadValueFromPointer(name, shift, signed) { + switch (shift) { + case 0: + return signed + ? function readS8FromPointer(pointer) { + return GROWABLE_HEAP_I8()[pointer]; + } + : function readU8FromPointer(pointer) { + return GROWABLE_HEAP_U8()[pointer]; + }; + case 1: + return signed + ? function readS16FromPointer(pointer) { + return GROWABLE_HEAP_I16()[pointer >> 1]; + } + : function readU16FromPointer(pointer) { + return GROWABLE_HEAP_U16()[pointer >> 1]; + }; + case 2: + return signed + ? function readS32FromPointer(pointer) { + return GROWABLE_HEAP_I32()[pointer >> 2]; + } + : function readU32FromPointer(pointer) { + return GROWABLE_HEAP_U32()[pointer >> 2]; + }; + default: + throw new TypeError("Unknown integer type: " + name); + } +} +function __embind_register_integer(primitiveType, name, size, minRange, maxRange) { + name = readLatin1String(name); + if (maxRange === -1) { + maxRange = 4294967295; + } + var shift = getShiftFromSize(size); + var fromWireType = function (value) { + return value; + }; + if (minRange === 0) { + var bitshift = 32 - 8 * size; + fromWireType = function (value) { + return (value << bitshift) >>> bitshift; + }; + } + var isUnsignedType = name.indexOf("unsigned") != -1; + registerType(primitiveType, { + name: name, + fromWireType: fromWireType, + toWireType: function (destructors, value) { + if (typeof value !== "number" && typeof value !== "boolean") { + throw new TypeError('Cannot convert "' + _embind_repr(value) + '" to ' + this.name); + } + if (value < minRange || value > maxRange) { + throw new TypeError('Passing a number "' + + _embind_repr(value) + + '" from JS side to C/C++ side to an argument of type "' + + name + + '", which is outside the valid range [' + + minRange + + ", " + + maxRange + + "]!"); + } + return isUnsignedType ? value >>> 0 : value | 0; + }, + argPackAdvance: 8, + readValueFromPointer: integerReadValueFromPointer(name, shift, minRange !== 0), + destructorFunction: null, + }); +} +function __embind_register_memory_view(rawType, dataTypeIndex, name) { + var typeMapping = [ + Int8Array, + Uint8Array, + Int16Array, + Uint16Array, + Int32Array, + Uint32Array, + Float32Array, + Float64Array, + ]; + var TA = typeMapping[dataTypeIndex]; + function decodeMemoryView(handle) { + handle = handle >> 2; + var heap = GROWABLE_HEAP_U32(); + var size = heap[handle]; + var data = heap[handle + 1]; + return new TA(buffer, data, size); + } + name = readLatin1String(name); + registerType(rawType, { + name: name, + fromWireType: decodeMemoryView, + argPackAdvance: 8, + readValueFromPointer: decodeMemoryView, + }, { + ignoreDuplicateRegistrations: true, + }); +} +function __embind_register_std_string(rawType, name) { + name = readLatin1String(name); + var stdStringIsUTF8 = name === "std::string"; + registerType(rawType, { + name: name, + fromWireType: function (value) { + var length = GROWABLE_HEAP_U32()[value >> 2]; + var str; + if (stdStringIsUTF8) { + var decodeStartPtr = value + 4; + for (var i = 0; i <= length; ++i) { + var currentBytePtr = value + 4 + i; + if (i == length || GROWABLE_HEAP_U8()[currentBytePtr] == 0) { + var maxRead = currentBytePtr - decodeStartPtr; + var stringSegment = UTF8ToString(decodeStartPtr, maxRead); + if (str === undefined) { + str = stringSegment; + } + else { + str += String.fromCharCode(0); + str += stringSegment; + } + decodeStartPtr = currentBytePtr + 1; + } + } + } + else { + var a = new Array(length); + for (var i = 0; i < length; ++i) { + a[i] = String.fromCharCode(GROWABLE_HEAP_U8()[value + 4 + i]); + } + str = a.join(""); + } + _free(value); + return str; + }, + toWireType: function (destructors, value) { + if (value instanceof ArrayBuffer) { + value = new Uint8Array(value); + } + var getLength; + var valueIsOfTypeString = typeof value === "string"; + if (!(valueIsOfTypeString || + value instanceof Uint8Array || + value instanceof Uint8ClampedArray || + value instanceof Int8Array)) { + throwBindingError("Cannot pass non-string to std::string"); + } + if (stdStringIsUTF8 && valueIsOfTypeString) { + getLength = function () { + return lengthBytesUTF8(value); + }; + } + else { + getLength = function () { + return value.length; + }; + } + var length = getLength(); + var ptr = _malloc(4 + length + 1); + GROWABLE_HEAP_U32()[ptr >> 2] = length; + if (stdStringIsUTF8 && valueIsOfTypeString) { + stringToUTF8(value, ptr + 4, length + 1); + } + else { + if (valueIsOfTypeString) { + for (var i = 0; i < length; ++i) { + var charCode = value.charCodeAt(i); + if (charCode > 255) { + _free(ptr); + throwBindingError("String has UTF-16 code units that do not fit in 8 bits"); + } + GROWABLE_HEAP_U8()[ptr + 4 + i] = charCode; + } + } + else { + for (var i = 0; i < length; ++i) { + GROWABLE_HEAP_U8()[ptr + 4 + i] = value[i]; + } + } + } + if (destructors !== null) { + destructors.push(_free, ptr); + } + return ptr; + }, + argPackAdvance: 8, + readValueFromPointer: simpleReadValueFromPointer, + destructorFunction: function (ptr) { + _free(ptr); + }, + }); +} +function __embind_register_std_wstring(rawType, charSize, name) { + name = readLatin1String(name); + var decodeString, encodeString, getHeap, lengthBytesUTF, shift; + if (charSize === 2) { + decodeString = UTF16ToString; + encodeString = stringToUTF16; + lengthBytesUTF = lengthBytesUTF16; + getHeap = function () { + return GROWABLE_HEAP_U16(); + }; + shift = 1; + } + else if (charSize === 4) { + decodeString = UTF32ToString; + encodeString = stringToUTF32; + lengthBytesUTF = lengthBytesUTF32; + getHeap = function () { + return GROWABLE_HEAP_U32(); + }; + shift = 2; + } + registerType(rawType, { + name: name, + fromWireType: function (value) { + var length = GROWABLE_HEAP_U32()[value >> 2]; + var HEAP = getHeap(); + var str; + var decodeStartPtr = value + 4; + for (var i = 0; i <= length; ++i) { + var currentBytePtr = value + 4 + i * charSize; + if (i == length || HEAP[currentBytePtr >> shift] == 0) { + var maxReadBytes = currentBytePtr - decodeStartPtr; + var stringSegment = decodeString(decodeStartPtr, maxReadBytes); + if (str === undefined) { + str = stringSegment; + } + else { + str += String.fromCharCode(0); + str += stringSegment; + } + decodeStartPtr = currentBytePtr + charSize; + } + } + _free(value); + return str; + }, + toWireType: function (destructors, value) { + if (!(typeof value === "string")) { + throwBindingError("Cannot pass non-string to C++ string type " + name); + } + var length = lengthBytesUTF(value); + var ptr = _malloc(4 + length + charSize); + GROWABLE_HEAP_U32()[ptr >> 2] = length >> shift; + encodeString(value, ptr + 4, length + charSize); + if (destructors !== null) { + destructors.push(_free, ptr); + } + return ptr; + }, + argPackAdvance: 8, + readValueFromPointer: simpleReadValueFromPointer, + destructorFunction: function (ptr) { + _free(ptr); + }, + }); +} +function __embind_register_void(rawType, name) { + name = readLatin1String(name); + registerType(rawType, { + isVoid: true, + name: name, + argPackAdvance: 0, + fromWireType: function () { + return undefined; + }, + toWireType: function (destructors, o) { + return undefined; + }, + }); +} +function __emscripten_notify_thread_queue(targetThreadId, mainThreadId) { + if (targetThreadId == mainThreadId) { + postMessage({ + cmd: "processQueuedMainThreadWork", + }); + } + else if (ENVIRONMENT_IS_PTHREAD) { + postMessage({ + targetThread: targetThreadId, + cmd: "processThreadQueue", + }); + } + else { + var pthread = PThread.pthreads[targetThreadId]; + var worker = pthread && pthread.worker; + if (!worker) { + return; + } + worker.postMessage({ + cmd: "processThreadQueue", + }); + } + return 1; +} +function __emval_incref(handle) { + if (handle > 4) { + emval_handle_array[handle].refcount += 1; + } +} +function requireRegisteredType(rawType, humanName) { + var impl = registeredTypes[rawType]; + if (undefined === impl) { + throwBindingError(humanName + " has unknown type " + getTypeName(rawType)); + } + return impl; +} +function __emval_take_value(type, argv) { + type = requireRegisteredType(type, "_emval_take_value"); + var v = type["readValueFromPointer"](argv); + return __emval_register(v); +} +function _abort() { + abort(); +} +function _emscripten_asm_const_int(code, sigPtr, argbuf) { + var args = readAsmConstArgs(sigPtr, argbuf); + return ASM_CONSTS[code].apply(null, args); +} +function _emscripten_check_blocking_allowed() { + if (ENVIRONMENT_IS_WORKER) + return; + warnOnce("Blocking on the main thread is very dangerous, see https://emscripten.org/docs/porting/pthreads.html#blocking-on-the-main-browser-thread"); +} +function _emscripten_conditional_set_current_thread_status(expectedStatus, newStatus) { + expectedStatus = expectedStatus | 0; + newStatus = newStatus | 0; +} +function _emscripten_futex_wait(addr, val, timeout) { + if (addr <= 0 || addr > GROWABLE_HEAP_I8().length || addr & (3 != 0)) + return -28; + if (!ENVIRONMENT_IS_WEB) { + var ret = Atomics.wait(GROWABLE_HEAP_I32(), addr >> 2, val, timeout); + if (ret === "timed-out") + return -73; + if (ret === "not-equal") + return -6; + if (ret === "ok") + return 0; + throw "Atomics.wait returned an unexpected value " + ret; + } + else { + if (Atomics.load(GROWABLE_HEAP_I32(), addr >> 2) != val) { + return -6; + } + var tNow = performance.now(); + var tEnd = tNow + timeout; + var lastAddr = Atomics.exchange(GROWABLE_HEAP_I32(), PThread.mainThreadFutex >> 2, addr); + while (1) { + tNow = performance.now(); + if (tNow > tEnd) { + lastAddr = Atomics.exchange(GROWABLE_HEAP_I32(), PThread.mainThreadFutex >> 2, 0); + return -73; + } + lastAddr = Atomics.exchange(GROWABLE_HEAP_I32(), PThread.mainThreadFutex >> 2, 0); + if (lastAddr == 0) { + break; + } + _emscripten_main_thread_process_queued_calls(); + if (Atomics.load(GROWABLE_HEAP_I32(), addr >> 2) != val) { + return -6; + } + lastAddr = Atomics.exchange(GROWABLE_HEAP_I32(), PThread.mainThreadFutex >> 2, addr); + } + return 0; + } +} +function _emscripten_is_main_browser_thread() { + return __pthread_is_main_browser_thread | 0; +} +function _emscripten_is_main_runtime_thread() { + return __pthread_is_main_runtime_thread | 0; +} +function _emscripten_memcpy_big(dest, src, num) { + GROWABLE_HEAP_U8().copyWithin(dest, src, src + num); +} +function _emscripten_proxy_to_main_thread_js(index, sync) { + var numCallArgs = arguments.length - 2; + var stack = stackSave(); + var args = stackAlloc(numCallArgs * 8); + var b = args >> 3; + for (var i = 0; i < numCallArgs; i++) { + GROWABLE_HEAP_F64()[b + i] = arguments[2 + i]; + } + var ret = _emscripten_run_in_main_runtime_thread_js(index, numCallArgs, args, sync); + stackRestore(stack); + return ret; +} +var _emscripten_receive_on_main_thread_js_callArgs = []; +var readAsmConstArgsArray = []; +function readAsmConstArgs(sigPtr, buf) { + readAsmConstArgsArray.length = 0; + var ch; + buf >>= 2; + while ((ch = GROWABLE_HEAP_U8()[sigPtr++])) { + var double = ch < 105; + if (double && buf & 1) + buf++; + readAsmConstArgsArray.push(double ? GROWABLE_HEAP_F64()[buf++ >> 1] : GROWABLE_HEAP_I32()[buf]); + ++buf; + } + return readAsmConstArgsArray; +} +function _emscripten_receive_on_main_thread_js(index, numCallArgs, args) { + _emscripten_receive_on_main_thread_js_callArgs.length = numCallArgs; + var b = args >> 3; + for (var i = 0; i < numCallArgs; i++) { + _emscripten_receive_on_main_thread_js_callArgs[i] = GROWABLE_HEAP_F64()[b + i]; + } + var isEmAsmConst = index < 0; + var func = !isEmAsmConst + ? proxiedFunctionTable[index] + : ASM_CONSTS[-index - 1]; + return func.apply(null, _emscripten_receive_on_main_thread_js_callArgs); +} +function _emscripten_get_heap_size() { + return GROWABLE_HEAP_U8().length; +} +function emscripten_realloc_buffer(size) { + try { + wasmMemory.grow((size - buffer.byteLength + 65535) >>> 16); + updateGlobalBufferAndViews(wasmMemory.buffer); + return 1; + } + catch (e) { } +} +function _emscripten_resize_heap(requestedSize) { + requestedSize = requestedSize >>> 0; + var oldSize = _emscripten_get_heap_size(); + if (requestedSize <= oldSize) { + return false; + } + var maxHeapSize = 2147483648; + if (requestedSize > maxHeapSize) { + return false; + } + var minHeapSize = 16777216; + for (var cutDown = 1; cutDown <= 4; cutDown *= 2) { + var overGrownHeapSize = oldSize * (1 + 0.2 / cutDown); + overGrownHeapSize = Math.min(overGrownHeapSize, requestedSize + 100663296); + var newSize = Math.min(maxHeapSize, alignUp(Math.max(minHeapSize, requestedSize, overGrownHeapSize), 65536)); + var replacement = emscripten_realloc_buffer(newSize); + if (replacement) { + return true; + } + } + return false; +} +var JSEvents = { + inEventHandler: 0, + removeAllEventListeners: function () { + for (var i = JSEvents.eventHandlers.length - 1; i >= 0; --i) { + JSEvents._removeHandler(i); + } + JSEvents.eventHandlers = []; + JSEvents.deferredCalls = []; + }, + registerRemoveEventListeners: function () { + if (!JSEvents.removeEventListenersRegistered) { + __ATEXIT__.push(JSEvents.removeAllEventListeners); + JSEvents.removeEventListenersRegistered = true; + } + }, + deferredCalls: [], + deferCall: function (targetFunction, precedence, argsList) { + function arraysHaveEqualContent(arrA, arrB) { + if (arrA.length != arrB.length) + return false; + for (var i in arrA) { + if (arrA[i] != arrB[i]) + return false; + } + return true; + } + for (var i in JSEvents.deferredCalls) { + var call = JSEvents.deferredCalls[i]; + if (call.targetFunction == targetFunction && + arraysHaveEqualContent(call.argsList, argsList)) { + return; + } + } + JSEvents.deferredCalls.push({ + targetFunction: targetFunction, + precedence: precedence, + argsList: argsList, + }); + JSEvents.deferredCalls.sort(function (x, y) { + return x.precedence < y.precedence; + }); + }, + removeDeferredCalls: function (targetFunction) { + for (var i = 0; i < JSEvents.deferredCalls.length; ++i) { + if (JSEvents.deferredCalls[i].targetFunction == targetFunction) { + JSEvents.deferredCalls.splice(i, 1); + --i; + } + } + }, + canPerformEventHandlerRequests: function () { + return (JSEvents.inEventHandler && + JSEvents.currentEventHandler.allowsDeferredCalls); + }, + runDeferredCalls: function () { + if (!JSEvents.canPerformEventHandlerRequests()) { + return; + } + for (var i = 0; i < JSEvents.deferredCalls.length; ++i) { + var call = JSEvents.deferredCalls[i]; + JSEvents.deferredCalls.splice(i, 1); + --i; + call.targetFunction.apply(null, call.argsList); + } + }, + eventHandlers: [], + removeAllHandlersOnTarget: function (target, eventTypeString) { + for (var i = 0; i < JSEvents.eventHandlers.length; ++i) { + if (JSEvents.eventHandlers[i].target == target && + (!eventTypeString || + eventTypeString == JSEvents.eventHandlers[i].eventTypeString)) { + JSEvents._removeHandler(i--); + } + } + }, + _removeHandler: function (i) { + var h = JSEvents.eventHandlers[i]; + h.target.removeEventListener(h.eventTypeString, h.eventListenerFunc, h.useCapture); + JSEvents.eventHandlers.splice(i, 1); + }, + registerOrRemoveHandler: function (eventHandler) { + var jsEventHandler = function jsEventHandler(event) { + ++JSEvents.inEventHandler; + JSEvents.currentEventHandler = eventHandler; + JSEvents.runDeferredCalls(); + eventHandler.handlerFunc(event); + JSEvents.runDeferredCalls(); + --JSEvents.inEventHandler; + }; + if (eventHandler.callbackfunc) { + eventHandler.eventListenerFunc = jsEventHandler; + eventHandler.target.addEventListener(eventHandler.eventTypeString, jsEventHandler, eventHandler.useCapture); + JSEvents.eventHandlers.push(eventHandler); + JSEvents.registerRemoveEventListeners(); + } + else { + for (var i = 0; i < JSEvents.eventHandlers.length; ++i) { + if (JSEvents.eventHandlers[i].target == eventHandler.target && + JSEvents.eventHandlers[i].eventTypeString == + eventHandler.eventTypeString) { + JSEvents._removeHandler(i--); + } + } + } + }, + queueEventHandlerOnThread_iiii: function (targetThread, eventHandlerFunc, eventTypeId, eventData, userData) { + var stackTop = stackSave(); + var varargs = stackAlloc(12); + GROWABLE_HEAP_I32()[varargs >> 2] = eventTypeId; + GROWABLE_HEAP_I32()[(varargs + 4) >> 2] = eventData; + GROWABLE_HEAP_I32()[(varargs + 8) >> 2] = userData; + __emscripten_call_on_thread(0, targetThread, 637534208, eventHandlerFunc, eventData, varargs); + stackRestore(stackTop); + }, + getTargetThreadForEventCallback: function (targetThread) { + switch (targetThread) { + case 1: + return 0; + case 2: + return PThread.currentProxiedOperationCallerThread; + default: + return targetThread; + } + }, + getNodeNameForTarget: function (target) { + if (!target) + return ""; + if (target == window) + return "#window"; + if (target == screen) + return "#screen"; + return target && target.nodeName ? target.nodeName : ""; + }, + fullscreenEnabled: function () { + return document.fullscreenEnabled || document.webkitFullscreenEnabled; + }, +}; +function stringToNewUTF8(jsString) { + var length = lengthBytesUTF8(jsString) + 1; + var cString = _malloc(length); + stringToUTF8(jsString, cString, length); + return cString; +} +function _emscripten_set_offscreencanvas_size_on_target_thread_js(targetThread, targetCanvas, width, height) { + var stackTop = stackSave(); + var varargs = stackAlloc(12); + var targetCanvasPtr = 0; + if (targetCanvas) { + targetCanvasPtr = stringToNewUTF8(targetCanvas); + } + GROWABLE_HEAP_I32()[varargs >> 2] = targetCanvasPtr; + GROWABLE_HEAP_I32()[(varargs + 4) >> 2] = width; + GROWABLE_HEAP_I32()[(varargs + 8) >> 2] = height; + __emscripten_call_on_thread(0, targetThread, 657457152, 0, targetCanvasPtr, varargs); + stackRestore(stackTop); +} +function _emscripten_set_offscreencanvas_size_on_target_thread(targetThread, targetCanvas, width, height) { + targetCanvas = targetCanvas ? UTF8ToString(targetCanvas) : ""; + _emscripten_set_offscreencanvas_size_on_target_thread_js(targetThread, targetCanvas, width, height); +} +function maybeCStringToJsString(cString) { + return cString > 2 ? UTF8ToString(cString) : cString; +} +var specialHTMLTargets = [ + 0, + typeof document !== "undefined" ? document : 0, + typeof window !== "undefined" ? window : 0, +]; +function findEventTarget(target) { + target = maybeCStringToJsString(target); + var domElement = specialHTMLTargets[target] || + (typeof document !== "undefined" + ? document.querySelector(target) + : undefined); + return domElement; +} +function findCanvasEventTarget(target) { + return findEventTarget(target); +} +function _emscripten_set_canvas_element_size_calling_thread(target, width, height) { + var canvas = findCanvasEventTarget(target); + if (!canvas) + return -4; + if (canvas.canvasSharedPtr) { + GROWABLE_HEAP_I32()[canvas.canvasSharedPtr >> 2] = width; + GROWABLE_HEAP_I32()[(canvas.canvasSharedPtr + 4) >> 2] = height; + } + if (canvas.offscreenCanvas || !canvas.controlTransferredOffscreen) { + if (canvas.offscreenCanvas) + canvas = canvas.offscreenCanvas; + var autoResizeViewport = false; + if (canvas.GLctxObject && canvas.GLctxObject.GLctx) { + var prevViewport = canvas.GLctxObject.GLctx.getParameter(2978); + autoResizeViewport = + prevViewport[0] === 0 && + prevViewport[1] === 0 && + prevViewport[2] === canvas.width && + prevViewport[3] === canvas.height; + } + canvas.width = width; + canvas.height = height; + if (autoResizeViewport) { + canvas.GLctxObject.GLctx.viewport(0, 0, width, height); + } + } + else if (canvas.canvasSharedPtr) { + var targetThread = GROWABLE_HEAP_I32()[(canvas.canvasSharedPtr + 8) >> 2]; + _emscripten_set_offscreencanvas_size_on_target_thread(targetThread, target, width, height); + return 1; + } + else { + return -4; + } + return 0; +} +function _emscripten_set_canvas_element_size_main_thread(target, width, height) { + if (ENVIRONMENT_IS_PTHREAD) + return _emscripten_proxy_to_main_thread_js(14, 1, target, width, height); + return _emscripten_set_canvas_element_size_calling_thread(target, width, height); +} +function _emscripten_set_canvas_element_size(target, width, height) { + var canvas = findCanvasEventTarget(target); + if (canvas) { + return _emscripten_set_canvas_element_size_calling_thread(target, width, height); + } + else { + return _emscripten_set_canvas_element_size_main_thread(target, width, height); + } +} +function _emscripten_set_current_thread_status(newStatus) { + newStatus = newStatus | 0; +} +function __webgl_enable_ANGLE_instanced_arrays(ctx) { + var ext = ctx.getExtension("ANGLE_instanced_arrays"); + if (ext) { + ctx["vertexAttribDivisor"] = function (index, divisor) { + ext["vertexAttribDivisorANGLE"](index, divisor); + }; + ctx["drawArraysInstanced"] = function (mode, first, count, primcount) { + ext["drawArraysInstancedANGLE"](mode, first, count, primcount); + }; + ctx["drawElementsInstanced"] = function (mode, count, type, indices, primcount) { + ext["drawElementsInstancedANGLE"](mode, count, type, indices, primcount); + }; + return 1; + } +} +function __webgl_enable_OES_vertex_array_object(ctx) { + var ext = ctx.getExtension("OES_vertex_array_object"); + if (ext) { + ctx["createVertexArray"] = function () { + return ext["createVertexArrayOES"](); + }; + ctx["deleteVertexArray"] = function (vao) { + ext["deleteVertexArrayOES"](vao); + }; + ctx["bindVertexArray"] = function (vao) { + ext["bindVertexArrayOES"](vao); + }; + ctx["isVertexArray"] = function (vao) { + return ext["isVertexArrayOES"](vao); + }; + return 1; + } +} +function __webgl_enable_WEBGL_draw_buffers(ctx) { + var ext = ctx.getExtension("WEBGL_draw_buffers"); + if (ext) { + ctx["drawBuffers"] = function (n, bufs) { + ext["drawBuffersWEBGL"](n, bufs); + }; + return 1; + } +} +function __webgl_enable_WEBGL_multi_draw(ctx) { + return !!(ctx.multiDrawWebgl = ctx.getExtension("WEBGL_multi_draw")); +} +var GL = { + counter: 1, + buffers: [], + programs: [], + framebuffers: [], + renderbuffers: [], + textures: [], + uniforms: [], + shaders: [], + vaos: [], + contexts: {}, + offscreenCanvases: {}, + timerQueriesEXT: [], + programInfos: {}, + stringCache: {}, + unpackAlignment: 4, + recordError: function recordError(errorCode) { + if (!GL.lastError) { + GL.lastError = errorCode; + } + }, + getNewId: function (table) { + var ret = GL.counter++; + for (var i = table.length; i < ret; i++) { + table[i] = null; + } + return ret; + }, + getSource: function (shader, count, string, length) { + var source = ""; + for (var i = 0; i < count; ++i) { + var len = length ? GROWABLE_HEAP_I32()[(length + i * 4) >> 2] : -1; + source += UTF8ToString(GROWABLE_HEAP_I32()[(string + i * 4) >> 2], len < 0 ? undefined : len); + } + return source; + }, + createContext: function (canvas, webGLContextAttributes) { + var ctx = canvas.getContext("webgl", webGLContextAttributes); + if (!ctx) + return 0; + var handle = GL.registerContext(ctx, webGLContextAttributes); + return handle; + }, + registerContext: function (ctx, webGLContextAttributes) { + var handle = _malloc(8); + GROWABLE_HEAP_I32()[(handle + 4) >> 2] = _pthread_self(); + var context = { + handle: handle, + attributes: webGLContextAttributes, + version: webGLContextAttributes.majorVersion, + GLctx: ctx, + }; + if (ctx.canvas) + ctx.canvas.GLctxObject = context; + GL.contexts[handle] = context; + if (typeof webGLContextAttributes.enableExtensionsByDefault === "undefined" || + webGLContextAttributes.enableExtensionsByDefault) { + GL.initExtensions(context); + } + return handle; + }, + makeContextCurrent: function (contextHandle) { + GL.currentContext = GL.contexts[contextHandle]; + Module.ctx = GLctx = GL.currentContext && GL.currentContext.GLctx; + return !(contextHandle && !GLctx); + }, + getContext: function (contextHandle) { + return GL.contexts[contextHandle]; + }, + deleteContext: function (contextHandle) { + if (GL.currentContext === GL.contexts[contextHandle]) + GL.currentContext = null; + if (typeof JSEvents === "object") + JSEvents.removeAllHandlersOnTarget(GL.contexts[contextHandle].GLctx.canvas); + if (GL.contexts[contextHandle] && GL.contexts[contextHandle].GLctx.canvas) + GL.contexts[contextHandle].GLctx.canvas.GLctxObject = undefined; + _free(GL.contexts[contextHandle].handle); + GL.contexts[contextHandle] = null; + }, + initExtensions: function (context) { + if (!context) + context = GL.currentContext; + if (context.initExtensionsDone) + return; + context.initExtensionsDone = true; + var GLctx = context.GLctx; + __webgl_enable_ANGLE_instanced_arrays(GLctx); + __webgl_enable_OES_vertex_array_object(GLctx); + __webgl_enable_WEBGL_draw_buffers(GLctx); + GLctx.disjointTimerQueryExt = GLctx.getExtension("EXT_disjoint_timer_query"); + __webgl_enable_WEBGL_multi_draw(GLctx); + var automaticallyEnabledExtensions = [ + "OES_texture_float", + "OES_texture_half_float", + "OES_standard_derivatives", + "OES_vertex_array_object", + "WEBGL_compressed_texture_s3tc", + "WEBGL_depth_texture", + "OES_element_index_uint", + "EXT_texture_filter_anisotropic", + "EXT_frag_depth", + "WEBGL_draw_buffers", + "ANGLE_instanced_arrays", + "OES_texture_float_linear", + "OES_texture_half_float_linear", + "EXT_blend_minmax", + "EXT_shader_texture_lod", + "EXT_texture_norm16", + "WEBGL_compressed_texture_pvrtc", + "EXT_color_buffer_half_float", + "WEBGL_color_buffer_float", + "EXT_sRGB", + "WEBGL_compressed_texture_etc1", + "EXT_disjoint_timer_query", + "WEBGL_compressed_texture_etc", + "WEBGL_compressed_texture_astc", + "EXT_color_buffer_float", + "WEBGL_compressed_texture_s3tc_srgb", + "EXT_disjoint_timer_query_webgl2", + "WEBKIT_WEBGL_compressed_texture_pvrtc", + ]; + var exts = GLctx.getSupportedExtensions() || []; + exts.forEach(function (ext) { + if (automaticallyEnabledExtensions.indexOf(ext) != -1) { + GLctx.getExtension(ext); + } + }); + }, + populateUniformTable: function (program) { + var p = GL.programs[program]; + var ptable = (GL.programInfos[program] = { + uniforms: {}, + maxUniformLength: 0, + maxAttributeLength: -1, + maxUniformBlockNameLength: -1, + }); + var utable = ptable.uniforms; + var numUniforms = GLctx.getProgramParameter(p, 35718); + for (var i = 0; i < numUniforms; ++i) { + var u = GLctx.getActiveUniform(p, i); + var name = u.name; + ptable.maxUniformLength = Math.max(ptable.maxUniformLength, name.length + 1); + if (name.slice(-1) == "]") { + name = name.slice(0, name.lastIndexOf("[")); + } + var loc = GLctx.getUniformLocation(p, name); + if (loc) { + var id = GL.getNewId(GL.uniforms); + utable[name] = [u.size, id]; + GL.uniforms[id] = loc; + for (var j = 1; j < u.size; ++j) { + var n = name + "[" + j + "]"; + loc = GLctx.getUniformLocation(p, n); + id = GL.getNewId(GL.uniforms); + GL.uniforms[id] = loc; + } + } + } + }, +}; +var __emscripten_webgl_power_preferences = [ + "default", + "low-power", + "high-performance", +]; +function _emscripten_webgl_do_create_context(target, attributes) { + var a = attributes >> 2; + var powerPreference = GROWABLE_HEAP_I32()[a + (24 >> 2)]; + var contextAttributes = { + alpha: !!GROWABLE_HEAP_I32()[a + (0 >> 2)], + depth: !!GROWABLE_HEAP_I32()[a + (4 >> 2)], + stencil: !!GROWABLE_HEAP_I32()[a + (8 >> 2)], + antialias: !!GROWABLE_HEAP_I32()[a + (12 >> 2)], + premultipliedAlpha: !!GROWABLE_HEAP_I32()[a + (16 >> 2)], + preserveDrawingBuffer: !!GROWABLE_HEAP_I32()[a + (20 >> 2)], + powerPreference: __emscripten_webgl_power_preferences[powerPreference], + failIfMajorPerformanceCaveat: !!GROWABLE_HEAP_I32()[a + (28 >> 2)], + majorVersion: GROWABLE_HEAP_I32()[a + (32 >> 2)], + minorVersion: GROWABLE_HEAP_I32()[a + (36 >> 2)], + enableExtensionsByDefault: GROWABLE_HEAP_I32()[a + (40 >> 2)], + explicitSwapControl: GROWABLE_HEAP_I32()[a + (44 >> 2)], + proxyContextToMainThread: GROWABLE_HEAP_I32()[a + (48 >> 2)], + renderViaOffscreenBackBuffer: GROWABLE_HEAP_I32()[a + (52 >> 2)], + }; + var canvas = findCanvasEventTarget(target); + if (!canvas) { + return 0; + } + if (contextAttributes.explicitSwapControl) { + return 0; + } + var contextHandle = GL.createContext(canvas, contextAttributes); + return contextHandle; +} +function _emscripten_webgl_create_context(a0, a1) { + return _emscripten_webgl_do_create_context(a0, a1); +} +var ENV = {}; +function getExecutableName() { + return thisProgram || "./this.program"; +} +function getEnvStrings() { + if (!getEnvStrings.strings) { + var lang = ((typeof navigator === "object" && + navigator.languages && + navigator.languages[0]) || + "C").replace("-", "_") + ".UTF-8"; + var env = { + USER: "web_user", + LOGNAME: "web_user", + PATH: "/", + PWD: "/", + HOME: "/home/web_user", + LANG: lang, + _: getExecutableName(), + }; + for (var x in ENV) { + env[x] = ENV[x]; + } + var strings = []; + for (var x in env) { + strings.push(x + "=" + env[x]); + } + getEnvStrings.strings = strings; + } + return getEnvStrings.strings; +} +function _environ_get(__environ, environ_buf) { + if (ENVIRONMENT_IS_PTHREAD) + return _emscripten_proxy_to_main_thread_js(15, 1, __environ, environ_buf); + try { + var bufSize = 0; + getEnvStrings().forEach(function (string, i) { + var ptr = environ_buf + bufSize; + GROWABLE_HEAP_I32()[(__environ + i * 4) >> 2] = ptr; + writeAsciiToMemory(string, ptr); + bufSize += string.length + 1; + }); + return 0; + } + catch (e) { + if (typeof FS === "undefined" || !(e instanceof FS.ErrnoError)) + abort(e); + return e.errno; + } +} +function _environ_sizes_get(penviron_count, penviron_buf_size) { + if (ENVIRONMENT_IS_PTHREAD) + return _emscripten_proxy_to_main_thread_js(16, 1, penviron_count, penviron_buf_size); + try { + var strings = getEnvStrings(); + GROWABLE_HEAP_I32()[penviron_count >> 2] = strings.length; + var bufSize = 0; + strings.forEach(function (string) { + bufSize += string.length + 1; + }); + GROWABLE_HEAP_I32()[penviron_buf_size >> 2] = bufSize; + return 0; + } + catch (e) { + if (typeof FS === "undefined" || !(e instanceof FS.ErrnoError)) + abort(e); + return e.errno; + } +} +function _exit(status) { + exit(status); +} +function _fd_close(fd) { + if (ENVIRONMENT_IS_PTHREAD) + return _emscripten_proxy_to_main_thread_js(17, 1, fd); + try { + var stream = SYSCALLS.getStreamFromFD(fd); + FS.close(stream); + return 0; + } + catch (e) { + if (typeof FS === "undefined" || !(e instanceof FS.ErrnoError)) + abort(e); + return e.errno; + } +} +function _fd_fdstat_get(fd, pbuf) { + if (ENVIRONMENT_IS_PTHREAD) + return _emscripten_proxy_to_main_thread_js(18, 1, fd, pbuf); + try { + var stream = SYSCALLS.getStreamFromFD(fd); + var type = stream.tty + ? 2 + : FS.isDir(stream.mode) + ? 3 + : FS.isLink(stream.mode) + ? 7 + : 4; + GROWABLE_HEAP_I8()[pbuf >> 0] = type; + return 0; + } + catch (e) { + if (typeof FS === "undefined" || !(e instanceof FS.ErrnoError)) + abort(e); + return e.errno; + } +} +function _fd_read(fd, iov, iovcnt, pnum) { + if (ENVIRONMENT_IS_PTHREAD) + return _emscripten_proxy_to_main_thread_js(19, 1, fd, iov, iovcnt, pnum); + try { + var stream = SYSCALLS.getStreamFromFD(fd); + var num = SYSCALLS.doReadv(stream, iov, iovcnt); + GROWABLE_HEAP_I32()[pnum >> 2] = num; + return 0; + } + catch (e) { + if (typeof FS === "undefined" || !(e instanceof FS.ErrnoError)) + abort(e); + return e.errno; + } +} +function _fd_seek(fd, offset_low, offset_high, whence, newOffset) { + if (ENVIRONMENT_IS_PTHREAD) + return _emscripten_proxy_to_main_thread_js(20, 1, fd, offset_low, offset_high, whence, newOffset); + try { + var stream = SYSCALLS.getStreamFromFD(fd); + var HIGH_OFFSET = 4294967296; + var offset = offset_high * HIGH_OFFSET + (offset_low >>> 0); + var DOUBLE_LIMIT = 9007199254740992; + if (offset <= -DOUBLE_LIMIT || offset >= DOUBLE_LIMIT) { + return -61; + } + FS.llseek(stream, offset, whence); + (tempI64 = [ + stream.position >>> 0, + ((tempDouble = stream.position), + +Math.abs(tempDouble) >= 1 + ? tempDouble > 0 + ? (Math.min(+Math.floor(tempDouble / 4294967296), 4294967295) | 0) >>> + 0 + : ~~+Math.ceil((tempDouble - +(~~tempDouble >>> 0)) / 4294967296) >>> + 0 + : 0), + ]), + (GROWABLE_HEAP_I32()[newOffset >> 2] = tempI64[0]), + (GROWABLE_HEAP_I32()[(newOffset + 4) >> 2] = tempI64[1]); + if (stream.getdents && offset === 0 && whence === 0) + stream.getdents = null; + return 0; + } + catch (e) { + if (typeof FS === "undefined" || !(e instanceof FS.ErrnoError)) + abort(e); + return e.errno; + } +} +function _fd_write(fd, iov, iovcnt, pnum) { + if (ENVIRONMENT_IS_PTHREAD) + return _emscripten_proxy_to_main_thread_js(21, 1, fd, iov, iovcnt, pnum); + try { + var stream = SYSCALLS.getStreamFromFD(fd); + var num = SYSCALLS.doWritev(stream, iov, iovcnt); + GROWABLE_HEAP_I32()[pnum >> 2] = num; + return 0; + } + catch (e) { + if (typeof FS === "undefined" || !(e instanceof FS.ErrnoError)) + abort(e); + return e.errno; + } +} +function _getentropy(buffer, size) { + if (!_getentropy.randomDevice) { + _getentropy.randomDevice = getRandomDevice(); + } + for (var i = 0; i < size; i++) { + GROWABLE_HEAP_I8()[(buffer + i) >> 0] = _getentropy.randomDevice(); + } + return 0; +} +function _tzset() { + if (ENVIRONMENT_IS_PTHREAD) + return _emscripten_proxy_to_main_thread_js(22, 1); + if (_tzset.called) + return; + _tzset.called = true; + var currentYear = new Date().getFullYear(); + var winter = new Date(currentYear, 0, 1); + var summer = new Date(currentYear, 6, 1); + var winterOffset = winter.getTimezoneOffset(); + var summerOffset = summer.getTimezoneOffset(); + var stdTimezoneOffset = Math.max(winterOffset, summerOffset); + GROWABLE_HEAP_I32()[__get_timezone() >> 2] = stdTimezoneOffset * 60; + GROWABLE_HEAP_I32()[__get_daylight() >> 2] = Number(winterOffset != summerOffset); + function extractZone(date) { + var match = date.toTimeString().match(/\(([A-Za-z ]+)\)$/); + return match ? match[1] : "GMT"; + } + var winterName = extractZone(winter); + var summerName = extractZone(summer); + var winterNamePtr = allocateUTF8(winterName); + var summerNamePtr = allocateUTF8(summerName); + if (summerOffset < winterOffset) { + GROWABLE_HEAP_I32()[__get_tzname() >> 2] = winterNamePtr; + GROWABLE_HEAP_I32()[(__get_tzname() + 4) >> 2] = summerNamePtr; + } + else { + GROWABLE_HEAP_I32()[__get_tzname() >> 2] = summerNamePtr; + GROWABLE_HEAP_I32()[(__get_tzname() + 4) >> 2] = winterNamePtr; + } +} +function _localtime_r(time, tmPtr) { + _tzset(); + var date = new Date(GROWABLE_HEAP_I32()[time >> 2] * 1e3); + GROWABLE_HEAP_I32()[tmPtr >> 2] = date.getSeconds(); + GROWABLE_HEAP_I32()[(tmPtr + 4) >> 2] = date.getMinutes(); + GROWABLE_HEAP_I32()[(tmPtr + 8) >> 2] = date.getHours(); + GROWABLE_HEAP_I32()[(tmPtr + 12) >> 2] = date.getDate(); + GROWABLE_HEAP_I32()[(tmPtr + 16) >> 2] = date.getMonth(); + GROWABLE_HEAP_I32()[(tmPtr + 20) >> 2] = date.getFullYear() - 1900; + GROWABLE_HEAP_I32()[(tmPtr + 24) >> 2] = date.getDay(); + var start = new Date(date.getFullYear(), 0, 1); + var yday = ((date.getTime() - start.getTime()) / (1e3 * 60 * 60 * 24)) | 0; + GROWABLE_HEAP_I32()[(tmPtr + 28) >> 2] = yday; + GROWABLE_HEAP_I32()[(tmPtr + 36) >> 2] = -(date.getTimezoneOffset() * 60); + var summerOffset = new Date(date.getFullYear(), 6, 1).getTimezoneOffset(); + var winterOffset = start.getTimezoneOffset(); + var dst = (summerOffset != winterOffset && + date.getTimezoneOffset() == Math.min(winterOffset, summerOffset)) | 0; + GROWABLE_HEAP_I32()[(tmPtr + 32) >> 2] = dst; + var zonePtr = GROWABLE_HEAP_I32()[(__get_tzname() + (dst ? 4 : 0)) >> 2]; + GROWABLE_HEAP_I32()[(tmPtr + 40) >> 2] = zonePtr; + return tmPtr; +} +function spawnThread(threadParams) { + if (ENVIRONMENT_IS_PTHREAD) + throw "Internal Error! spawnThread() can only ever be called from main application thread!"; + var worker = PThread.getNewWorker(); + if (worker.pthread !== undefined) + throw "Internal error!"; + if (!threadParams.pthread_ptr) + throw "Internal error, no pthread ptr!"; + PThread.runningWorkers.push(worker); + var tlsMemory = _malloc(128 * 4); + for (var i = 0; i < 128; ++i) { + GROWABLE_HEAP_I32()[(tlsMemory + i * 4) >> 2] = 0; + } + var stackHigh = threadParams.stackBase + threadParams.stackSize; + var pthread = (PThread.pthreads[threadParams.pthread_ptr] = { + worker: worker, + stackBase: threadParams.stackBase, + stackSize: threadParams.stackSize, + allocatedOwnStack: threadParams.allocatedOwnStack, + thread: threadParams.pthread_ptr, + threadInfoStruct: threadParams.pthread_ptr, + }); + var tis = pthread.threadInfoStruct >> 2; + Atomics.store(GROWABLE_HEAP_U32(), tis + (0 >> 2), 0); + Atomics.store(GROWABLE_HEAP_U32(), tis + (4 >> 2), 0); + Atomics.store(GROWABLE_HEAP_U32(), tis + (8 >> 2), 0); + Atomics.store(GROWABLE_HEAP_U32(), tis + (68 >> 2), threadParams.detached); + Atomics.store(GROWABLE_HEAP_U32(), tis + (104 >> 2), tlsMemory); + Atomics.store(GROWABLE_HEAP_U32(), tis + (48 >> 2), 0); + Atomics.store(GROWABLE_HEAP_U32(), tis + (40 >> 2), pthread.threadInfoStruct); + Atomics.store(GROWABLE_HEAP_U32(), tis + (44 >> 2), 42); + Atomics.store(GROWABLE_HEAP_U32(), tis + (108 >> 2), threadParams.stackSize); + Atomics.store(GROWABLE_HEAP_U32(), tis + (84 >> 2), threadParams.stackSize); + Atomics.store(GROWABLE_HEAP_U32(), tis + (80 >> 2), stackHigh); + Atomics.store(GROWABLE_HEAP_U32(), tis + ((108 + 8) >> 2), stackHigh); + Atomics.store(GROWABLE_HEAP_U32(), tis + ((108 + 12) >> 2), threadParams.detached); + Atomics.store(GROWABLE_HEAP_U32(), tis + ((108 + 20) >> 2), threadParams.schedPolicy); + Atomics.store(GROWABLE_HEAP_U32(), tis + ((108 + 24) >> 2), threadParams.schedPrio); + var global_libc = _emscripten_get_global_libc(); + var global_locale = global_libc + 40; + Atomics.store(GROWABLE_HEAP_U32(), tis + (176 >> 2), global_locale); + worker.pthread = pthread; + var msg = { + cmd: "run", + start_routine: threadParams.startRoutine, + arg: threadParams.arg, + threadInfoStruct: threadParams.pthread_ptr, + selfThreadId: threadParams.pthread_ptr, + parentThreadId: threadParams.parent_pthread_ptr, + stackBase: threadParams.stackBase, + stackSize: threadParams.stackSize, + }; + worker.runPthread = function () { + msg.time = performance.now(); + worker.postMessage(msg, threadParams.transferList); + }; + if (worker.loaded) { + worker.runPthread(); + delete worker.runPthread; + } +} +function _pthread_getschedparam(thread, policy, schedparam) { + if (!policy && !schedparam) + return ERRNO_CODES.EINVAL; + if (!thread) { + err("pthread_getschedparam called with a null thread pointer!"); + return ERRNO_CODES.ESRCH; + } + var self = GROWABLE_HEAP_I32()[(thread + 12) >> 2]; + if (self !== thread) { + err("pthread_getschedparam attempted on thread " + + thread + + ", which does not point to a valid thread, or does not exist anymore!"); + return ERRNO_CODES.ESRCH; + } + var schedPolicy = Atomics.load(GROWABLE_HEAP_U32(), (thread + 108 + 20) >> 2); + var schedPrio = Atomics.load(GROWABLE_HEAP_U32(), (thread + 108 + 24) >> 2); + if (policy) + GROWABLE_HEAP_I32()[policy >> 2] = schedPolicy; + if (schedparam) + GROWABLE_HEAP_I32()[schedparam >> 2] = schedPrio; + return 0; +} +function _pthread_self() { + return __pthread_ptr | 0; +} +Module["_pthread_self"] = _pthread_self; +function _pthread_create(pthread_ptr, attr, start_routine, arg) { + if (typeof SharedArrayBuffer === "undefined") { + err("Current environment does not support SharedArrayBuffer, pthreads are not available!"); + return 6; + } + if (!pthread_ptr) { + err("pthread_create called with a null thread pointer!"); + return 28; + } + var transferList = []; + var error = 0; + if (ENVIRONMENT_IS_PTHREAD && (transferList.length === 0 || error)) { + return _emscripten_sync_run_in_main_thread_4(687865856, pthread_ptr, attr, start_routine, arg); + } + if (error) + return error; + var stackSize = 0; + var stackBase = 0; + var detached = 0; + var schedPolicy = 0; + var schedPrio = 0; + if (attr) { + stackSize = GROWABLE_HEAP_I32()[attr >> 2]; + stackSize += 81920; + stackBase = GROWABLE_HEAP_I32()[(attr + 8) >> 2]; + detached = GROWABLE_HEAP_I32()[(attr + 12) >> 2] !== 0; + var inheritSched = GROWABLE_HEAP_I32()[(attr + 16) >> 2] === 0; + if (inheritSched) { + var prevSchedPolicy = GROWABLE_HEAP_I32()[(attr + 20) >> 2]; + var prevSchedPrio = GROWABLE_HEAP_I32()[(attr + 24) >> 2]; + var parentThreadPtr = PThread.currentProxiedOperationCallerThread + ? PThread.currentProxiedOperationCallerThread + : _pthread_self(); + _pthread_getschedparam(parentThreadPtr, attr + 20, attr + 24); + schedPolicy = GROWABLE_HEAP_I32()[(attr + 20) >> 2]; + schedPrio = GROWABLE_HEAP_I32()[(attr + 24) >> 2]; + GROWABLE_HEAP_I32()[(attr + 20) >> 2] = prevSchedPolicy; + GROWABLE_HEAP_I32()[(attr + 24) >> 2] = prevSchedPrio; + } + else { + schedPolicy = GROWABLE_HEAP_I32()[(attr + 20) >> 2]; + schedPrio = GROWABLE_HEAP_I32()[(attr + 24) >> 2]; + } + } + else { + stackSize = 2097152; + } + var allocatedOwnStack = stackBase == 0; + if (allocatedOwnStack) { + stackBase = _memalign(16, stackSize); + } + else { + stackBase -= stackSize; + assert(stackBase > 0); + } + var threadInfoStruct = _malloc(232); + for (var i = 0; i < 232 >> 2; ++i) + GROWABLE_HEAP_U32()[(threadInfoStruct >> 2) + i] = 0; + GROWABLE_HEAP_I32()[pthread_ptr >> 2] = threadInfoStruct; + GROWABLE_HEAP_I32()[(threadInfoStruct + 12) >> 2] = threadInfoStruct; + var headPtr = threadInfoStruct + 156; + GROWABLE_HEAP_I32()[headPtr >> 2] = headPtr; + var threadParams = { + stackBase: stackBase, + stackSize: stackSize, + allocatedOwnStack: allocatedOwnStack, + schedPolicy: schedPolicy, + schedPrio: schedPrio, + detached: detached, + startRoutine: start_routine, + pthread_ptr: threadInfoStruct, + parent_pthread_ptr: _pthread_self(), + arg: arg, + transferList: transferList, + }; + if (ENVIRONMENT_IS_PTHREAD) { + threadParams.cmd = "spawnThread"; + postMessage(threadParams, transferList); + } + else { + spawnThread(threadParams); + } + return 0; +} +function __pthread_testcancel_js() { + if (!ENVIRONMENT_IS_PTHREAD) + return; + if (!threadInfoStruct) + return; + var cancelDisabled = Atomics.load(GROWABLE_HEAP_U32(), (threadInfoStruct + 60) >> 2); + if (cancelDisabled) + return; + var canceled = Atomics.load(GROWABLE_HEAP_U32(), (threadInfoStruct + 0) >> 2); + if (canceled == 2) + throw "Canceled!"; +} +function __emscripten_do_pthread_join(thread, status, block) { + if (!thread) { + err("pthread_join attempted on a null thread pointer!"); + return ERRNO_CODES.ESRCH; + } + if (ENVIRONMENT_IS_PTHREAD && selfThreadId == thread) { + err("PThread " + thread + " is attempting to join to itself!"); + return ERRNO_CODES.EDEADLK; + } + else if (!ENVIRONMENT_IS_PTHREAD && PThread.mainThreadBlock == thread) { + err("Main thread " + thread + " is attempting to join to itself!"); + return ERRNO_CODES.EDEADLK; + } + var self = GROWABLE_HEAP_I32()[(thread + 12) >> 2]; + if (self !== thread) { + err("pthread_join attempted on thread " + + thread + + ", which does not point to a valid thread, or does not exist anymore!"); + return ERRNO_CODES.ESRCH; + } + var detached = Atomics.load(GROWABLE_HEAP_U32(), (thread + 68) >> 2); + if (detached) { + err("Attempted to join thread " + thread + ", which was already detached!"); + return ERRNO_CODES.EINVAL; + } + if (block) { + _emscripten_check_blocking_allowed(); + } + for (;;) { + var threadStatus = Atomics.load(GROWABLE_HEAP_U32(), (thread + 0) >> 2); + if (threadStatus == 1) { + var threadExitCode = Atomics.load(GROWABLE_HEAP_U32(), (thread + 4) >> 2); + if (status) + GROWABLE_HEAP_I32()[status >> 2] = threadExitCode; + Atomics.store(GROWABLE_HEAP_U32(), (thread + 68) >> 2, 1); + if (!ENVIRONMENT_IS_PTHREAD) + cleanupThread(thread); + else + postMessage({ + cmd: "cleanupThread", + thread: thread, + }); + return 0; + } + if (!block) { + return ERRNO_CODES.EBUSY; + } + __pthread_testcancel_js(); + if (!ENVIRONMENT_IS_PTHREAD) + _emscripten_main_thread_process_queued_calls(); + _emscripten_futex_wait(thread + 0, threadStatus, ENVIRONMENT_IS_PTHREAD ? 100 : 1); + } +} +function _pthread_join(thread, status) { + return __emscripten_do_pthread_join(thread, status, true); +} +function _setTempRet0($i) { + setTempRet0($i | 0); +} +function __isLeapYear(year) { + return year % 4 === 0 && (year % 100 !== 0 || year % 400 === 0); +} +function __arraySum(array, index) { + var sum = 0; + for (var i = 0; i <= index; sum += array[i++]) { } + return sum; +} +var __MONTH_DAYS_LEAP = [31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]; +var __MONTH_DAYS_REGULAR = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]; +function __addDays(date, days) { + var newDate = new Date(date.getTime()); + while (days > 0) { + var leap = __isLeapYear(newDate.getFullYear()); + var currentMonth = newDate.getMonth(); + var daysInCurrentMonth = (leap ? __MONTH_DAYS_LEAP : __MONTH_DAYS_REGULAR)[currentMonth]; + if (days > daysInCurrentMonth - newDate.getDate()) { + days -= daysInCurrentMonth - newDate.getDate() + 1; + newDate.setDate(1); + if (currentMonth < 11) { + newDate.setMonth(currentMonth + 1); + } + else { + newDate.setMonth(0); + newDate.setFullYear(newDate.getFullYear() + 1); + } + } + else { + newDate.setDate(newDate.getDate() + days); + return newDate; + } + } + return newDate; +} +function _strftime(s, maxsize, format, tm) { + var tm_zone = GROWABLE_HEAP_I32()[(tm + 40) >> 2]; + var date = { + tm_sec: GROWABLE_HEAP_I32()[tm >> 2], + tm_min: GROWABLE_HEAP_I32()[(tm + 4) >> 2], + tm_hour: GROWABLE_HEAP_I32()[(tm + 8) >> 2], + tm_mday: GROWABLE_HEAP_I32()[(tm + 12) >> 2], + tm_mon: GROWABLE_HEAP_I32()[(tm + 16) >> 2], + tm_year: GROWABLE_HEAP_I32()[(tm + 20) >> 2], + tm_wday: GROWABLE_HEAP_I32()[(tm + 24) >> 2], + tm_yday: GROWABLE_HEAP_I32()[(tm + 28) >> 2], + tm_isdst: GROWABLE_HEAP_I32()[(tm + 32) >> 2], + tm_gmtoff: GROWABLE_HEAP_I32()[(tm + 36) >> 2], + tm_zone: tm_zone ? UTF8ToString(tm_zone) : "", + }; + var pattern = UTF8ToString(format); + var EXPANSION_RULES_1 = { + "%c": "%a %b %d %H:%M:%S %Y", + "%D": "%m/%d/%y", + "%F": "%Y-%m-%d", + "%h": "%b", + "%r": "%I:%M:%S %p", + "%R": "%H:%M", + "%T": "%H:%M:%S", + "%x": "%m/%d/%y", + "%X": "%H:%M:%S", + "%Ec": "%c", + "%EC": "%C", + "%Ex": "%m/%d/%y", + "%EX": "%H:%M:%S", + "%Ey": "%y", + "%EY": "%Y", + "%Od": "%d", + "%Oe": "%e", + "%OH": "%H", + "%OI": "%I", + "%Om": "%m", + "%OM": "%M", + "%OS": "%S", + "%Ou": "%u", + "%OU": "%U", + "%OV": "%V", + "%Ow": "%w", + "%OW": "%W", + "%Oy": "%y", + }; + for (var rule in EXPANSION_RULES_1) { + pattern = pattern.replace(new RegExp(rule, "g"), EXPANSION_RULES_1[rule]); + } + var WEEKDAYS = [ + "Sunday", + "Monday", + "Tuesday", + "Wednesday", + "Thursday", + "Friday", + "Saturday", + ]; + var MONTHS = [ + "January", + "February", + "March", + "April", + "May", + "June", + "July", + "August", + "September", + "October", + "November", + "December", + ]; + function leadingSomething(value, digits, character) { + var str = typeof value === "number" ? value.toString() : value || ""; + while (str.length < digits) { + str = character[0] + str; + } + return str; + } + function leadingNulls(value, digits) { + return leadingSomething(value, digits, "0"); + } + function compareByDay(date1, date2) { + function sgn(value) { + return value < 0 ? -1 : value > 0 ? 1 : 0; + } + var compare; + if ((compare = sgn(date1.getFullYear() - date2.getFullYear())) === 0) { + if ((compare = sgn(date1.getMonth() - date2.getMonth())) === 0) { + compare = sgn(date1.getDate() - date2.getDate()); + } + } + return compare; + } + function getFirstWeekStartDate(janFourth) { + switch (janFourth.getDay()) { + case 0: + return new Date(janFourth.getFullYear() - 1, 11, 29); + case 1: + return janFourth; + case 2: + return new Date(janFourth.getFullYear(), 0, 3); + case 3: + return new Date(janFourth.getFullYear(), 0, 2); + case 4: + return new Date(janFourth.getFullYear(), 0, 1); + case 5: + return new Date(janFourth.getFullYear() - 1, 11, 31); + case 6: + return new Date(janFourth.getFullYear() - 1, 11, 30); + } + } + function getWeekBasedYear(date) { + var thisDate = __addDays(new Date(date.tm_year + 1900, 0, 1), date.tm_yday); + var janFourthThisYear = new Date(thisDate.getFullYear(), 0, 4); + var janFourthNextYear = new Date(thisDate.getFullYear() + 1, 0, 4); + var firstWeekStartThisYear = getFirstWeekStartDate(janFourthThisYear); + var firstWeekStartNextYear = getFirstWeekStartDate(janFourthNextYear); + if (compareByDay(firstWeekStartThisYear, thisDate) <= 0) { + if (compareByDay(firstWeekStartNextYear, thisDate) <= 0) { + return thisDate.getFullYear() + 1; + } + else { + return thisDate.getFullYear(); + } + } + else { + return thisDate.getFullYear() - 1; + } + } + var EXPANSION_RULES_2 = { + "%a": function (date) { + return WEEKDAYS[date.tm_wday].substring(0, 3); + }, + "%A": function (date) { + return WEEKDAYS[date.tm_wday]; + }, + "%b": function (date) { + return MONTHS[date.tm_mon].substring(0, 3); + }, + "%B": function (date) { + return MONTHS[date.tm_mon]; + }, + "%C": function (date) { + var year = date.tm_year + 1900; + return leadingNulls((year / 100) | 0, 2); + }, + "%d": function (date) { + return leadingNulls(date.tm_mday, 2); + }, + "%e": function (date) { + return leadingSomething(date.tm_mday, 2, " "); + }, + "%g": function (date) { + return getWeekBasedYear(date) + .toString() + .substring(2); + }, + "%G": function (date) { + return getWeekBasedYear(date); + }, + "%H": function (date) { + return leadingNulls(date.tm_hour, 2); + }, + "%I": function (date) { + var twelveHour = date.tm_hour; + if (twelveHour == 0) + twelveHour = 12; + else if (twelveHour > 12) + twelveHour -= 12; + return leadingNulls(twelveHour, 2); + }, + "%j": function (date) { + return leadingNulls(date.tm_mday + + __arraySum(__isLeapYear(date.tm_year + 1900) + ? __MONTH_DAYS_LEAP + : __MONTH_DAYS_REGULAR, date.tm_mon - 1), 3); + }, + "%m": function (date) { + return leadingNulls(date.tm_mon + 1, 2); + }, + "%M": function (date) { + return leadingNulls(date.tm_min, 2); + }, + "%n": function () { + return "\n"; + }, + "%p": function (date) { + if (date.tm_hour >= 0 && date.tm_hour < 12) { + return "AM"; + } + else { + return "PM"; + } + }, + "%S": function (date) { + return leadingNulls(date.tm_sec, 2); + }, + "%t": function () { + return "\t"; + }, + "%u": function (date) { + return date.tm_wday || 7; + }, + "%U": function (date) { + var janFirst = new Date(date.tm_year + 1900, 0, 1); + var firstSunday = janFirst.getDay() === 0 + ? janFirst + : __addDays(janFirst, 7 - janFirst.getDay()); + var endDate = new Date(date.tm_year + 1900, date.tm_mon, date.tm_mday); + if (compareByDay(firstSunday, endDate) < 0) { + var februaryFirstUntilEndMonth = __arraySum(__isLeapYear(endDate.getFullYear()) + ? __MONTH_DAYS_LEAP + : __MONTH_DAYS_REGULAR, endDate.getMonth() - 1) - 31; + var firstSundayUntilEndJanuary = 31 - firstSunday.getDate(); + var days = firstSundayUntilEndJanuary + + februaryFirstUntilEndMonth + + endDate.getDate(); + return leadingNulls(Math.ceil(days / 7), 2); + } + return compareByDay(firstSunday, janFirst) === 0 ? "01" : "00"; + }, + "%V": function (date) { + var janFourthThisYear = new Date(date.tm_year + 1900, 0, 4); + var janFourthNextYear = new Date(date.tm_year + 1901, 0, 4); + var firstWeekStartThisYear = getFirstWeekStartDate(janFourthThisYear); + var firstWeekStartNextYear = getFirstWeekStartDate(janFourthNextYear); + var endDate = __addDays(new Date(date.tm_year + 1900, 0, 1), date.tm_yday); + if (compareByDay(endDate, firstWeekStartThisYear) < 0) { + return "53"; + } + if (compareByDay(firstWeekStartNextYear, endDate) <= 0) { + return "01"; + } + var daysDifference; + if (firstWeekStartThisYear.getFullYear() < date.tm_year + 1900) { + daysDifference = date.tm_yday + 32 - firstWeekStartThisYear.getDate(); + } + else { + daysDifference = date.tm_yday + 1 - firstWeekStartThisYear.getDate(); + } + return leadingNulls(Math.ceil(daysDifference / 7), 2); + }, + "%w": function (date) { + return date.tm_wday; + }, + "%W": function (date) { + var janFirst = new Date(date.tm_year, 0, 1); + var firstMonday = janFirst.getDay() === 1 + ? janFirst + : __addDays(janFirst, janFirst.getDay() === 0 ? 1 : 7 - janFirst.getDay() + 1); + var endDate = new Date(date.tm_year + 1900, date.tm_mon, date.tm_mday); + if (compareByDay(firstMonday, endDate) < 0) { + var februaryFirstUntilEndMonth = __arraySum(__isLeapYear(endDate.getFullYear()) + ? __MONTH_DAYS_LEAP + : __MONTH_DAYS_REGULAR, endDate.getMonth() - 1) - 31; + var firstMondayUntilEndJanuary = 31 - firstMonday.getDate(); + var days = firstMondayUntilEndJanuary + + februaryFirstUntilEndMonth + + endDate.getDate(); + return leadingNulls(Math.ceil(days / 7), 2); + } + return compareByDay(firstMonday, janFirst) === 0 ? "01" : "00"; + }, + "%y": function (date) { + return (date.tm_year + 1900).toString().substring(2); + }, + "%Y": function (date) { + return date.tm_year + 1900; + }, + "%z": function (date) { + var off = date.tm_gmtoff; + var ahead = off >= 0; + off = Math.abs(off) / 60; + off = (off / 60) * 100 + (off % 60); + return (ahead ? "+" : "-") + String("0000" + off).slice(-4); + }, + "%Z": function (date) { + return date.tm_zone; + }, + "%%": function () { + return "%"; + }, + }; + for (var rule in EXPANSION_RULES_2) { + if (pattern.indexOf(rule) >= 0) { + pattern = pattern.replace(new RegExp(rule, "g"), EXPANSION_RULES_2[rule](date)); + } + } + var bytes = intArrayFromString(pattern, false); + if (bytes.length > maxsize) { + return 0; + } + writeArrayToMemory(bytes, s); + return bytes.length - 1; +} +function _strftime_l(s, maxsize, format, tm) { + return _strftime(s, maxsize, format, tm); +} +function _sysconf(name) { + if (ENVIRONMENT_IS_PTHREAD) + return _emscripten_proxy_to_main_thread_js(23, 1, name); + switch (name) { + case 30: + return 16384; + case 85: + var maxHeapSize = 2147483648; + return maxHeapSize / 16384; + case 132: + case 133: + case 12: + case 137: + case 138: + case 15: + case 235: + case 16: + case 17: + case 18: + case 19: + case 20: + case 149: + case 13: + case 10: + case 236: + case 153: + case 9: + case 21: + case 22: + case 159: + case 154: + case 14: + case 77: + case 78: + case 139: + case 80: + case 81: + case 82: + case 68: + case 67: + case 164: + case 11: + case 29: + case 47: + case 48: + case 95: + case 52: + case 51: + case 46: + case 79: + return 200809; + case 27: + case 246: + case 127: + case 128: + case 23: + case 24: + case 160: + case 161: + case 181: + case 182: + case 242: + case 183: + case 184: + case 243: + case 244: + case 245: + case 165: + case 178: + case 179: + case 49: + case 50: + case 168: + case 169: + case 175: + case 170: + case 171: + case 172: + case 97: + case 76: + case 32: + case 173: + case 35: + return -1; + case 176: + case 177: + case 7: + case 155: + case 8: + case 157: + case 125: + case 126: + case 92: + case 93: + case 129: + case 130: + case 131: + case 94: + case 91: + return 1; + case 74: + case 60: + case 69: + case 70: + case 4: + return 1024; + case 31: + case 42: + case 72: + return 32; + case 87: + case 26: + case 33: + return 2147483647; + case 34: + case 1: + return 47839; + case 38: + case 36: + return 99; + case 43: + case 37: + return 2048; + case 0: + return 2097152; + case 3: + return 65536; + case 28: + return 32768; + case 44: + return 32767; + case 75: + return 16384; + case 39: + return 1e3; + case 89: + return 700; + case 71: + return 256; + case 40: + return 255; + case 2: + return 100; + case 180: + return 64; + case 25: + return 20; + case 5: + return 16; + case 6: + return 6; + case 73: + return 4; + case 84: { + if (typeof navigator === "object") + return navigator["hardwareConcurrency"] || 1; + return 1; + } + } + setErrNo(28); + return -1; +} +function _time(ptr) { + var ret = (Date.now() / 1e3) | 0; + if (ptr) { + GROWABLE_HEAP_I32()[ptr >> 2] = ret; + } + return ret; +} +if (!ENVIRONMENT_IS_PTHREAD) + PThread.initMainThreadBlock(); +var FSNode = function (parent, name, mode, rdev) { + if (!parent) { + parent = this; + } + this.parent = parent; + this.mount = parent.mount; + this.mounted = null; + this.id = FS.nextInode++; + this.name = name; + this.mode = mode; + this.node_ops = {}; + this.stream_ops = {}; + this.rdev = rdev; +}; +var readMode = 292 | 73; +var writeMode = 146; +Object.defineProperties(FSNode.prototype, { + read: { + get: function () { + return (this.mode & readMode) === readMode; + }, + set: function (val) { + val ? (this.mode |= readMode) : (this.mode &= ~readMode); + }, + }, + write: { + get: function () { + return (this.mode & writeMode) === writeMode; + }, + set: function (val) { + val ? (this.mode |= writeMode) : (this.mode &= ~writeMode); + }, + }, + isFolder: { + get: function () { + return FS.isDir(this.mode); + }, + }, + isDevice: { + get: function () { + return FS.isChrdev(this.mode); + }, + }, +}); +FS.FSNode = FSNode; +FS.staticInit(); +embind_init_charCodes(); +BindingError = Module["BindingError"] = extendError(Error, "BindingError"); +InternalError = Module["InternalError"] = extendError(Error, "InternalError"); +init_ClassHandle(); +init_RegisteredPointer(); +init_embind(); +UnboundTypeError = Module["UnboundTypeError"] = extendError(Error, "UnboundTypeError"); +init_emval(); +var GLctx; +var proxiedFunctionTable = [ + null, + _atexit, + ___sys_access, + ___sys_fcntl64, + ___sys_fstat64, + ___sys_getcwd, + ___sys_ioctl, + ___sys_mmap2, + ___sys_munmap, + ___sys_open, + ___sys_rename, + ___sys_rmdir, + ___sys_stat64, + ___sys_unlink, + _emscripten_set_canvas_element_size_main_thread, + _environ_get, + _environ_sizes_get, + _fd_close, + _fd_fdstat_get, + _fd_read, + _fd_seek, + _fd_write, + _tzset, + _sysconf, +]; +var ASSERTIONS = false; +function intArrayFromString(stringy, dontAddNull, length) { + var len = length > 0 ? length : lengthBytesUTF8(stringy) + 1; + var u8array = new Array(len); + var numBytesWritten = stringToUTF8Array(stringy, u8array, 0, u8array.length); + if (dontAddNull) + u8array.length = numBytesWritten; + return u8array; +} +if (!ENVIRONMENT_IS_PTHREAD) + __ATINIT__.push({ + func: function () { + ___wasm_call_ctors(); + }, + }); +var asmLibraryArg = { + __assert_fail: ___assert_fail, + __clock_gettime: ___clock_gettime, + __cxa_allocate_exception: ___cxa_allocate_exception, + __cxa_atexit: ___cxa_atexit, + __cxa_thread_atexit: ___cxa_thread_atexit, + __cxa_throw: ___cxa_throw, + __sys_access: ___sys_access, + __sys_fcntl64: ___sys_fcntl64, + __sys_fstat64: ___sys_fstat64, + __sys_getcwd: ___sys_getcwd, + __sys_ioctl: ___sys_ioctl, + __sys_mmap2: ___sys_mmap2, + __sys_munmap: ___sys_munmap, + __sys_open: ___sys_open, + __sys_rename: ___sys_rename, + __sys_rmdir: ___sys_rmdir, + __sys_stat64: ___sys_stat64, + __sys_unlink: ___sys_unlink, + __sys_wait4: ___sys_wait4, + _embind_register_bool: __embind_register_bool, + _embind_register_class: __embind_register_class, + _embind_register_class_constructor: __embind_register_class_constructor, + _embind_register_class_function: __embind_register_class_function, + _embind_register_emval: __embind_register_emval, + _embind_register_float: __embind_register_float, + _embind_register_integer: __embind_register_integer, + _embind_register_memory_view: __embind_register_memory_view, + _embind_register_std_string: __embind_register_std_string, + _embind_register_std_wstring: __embind_register_std_wstring, + _embind_register_void: __embind_register_void, + _emscripten_notify_thread_queue: __emscripten_notify_thread_queue, + _emval_decref: __emval_decref, + _emval_incref: __emval_incref, + _emval_take_value: __emval_take_value, + abort: _abort, + clock_gettime: _clock_gettime, + emscripten_asm_const_int: _emscripten_asm_const_int, + emscripten_check_blocking_allowed: _emscripten_check_blocking_allowed, + emscripten_conditional_set_current_thread_status: _emscripten_conditional_set_current_thread_status, + emscripten_futex_wait: _emscripten_futex_wait, + emscripten_futex_wake: _emscripten_futex_wake, + emscripten_get_now: _emscripten_get_now, + emscripten_is_main_browser_thread: _emscripten_is_main_browser_thread, + emscripten_is_main_runtime_thread: _emscripten_is_main_runtime_thread, + emscripten_memcpy_big: _emscripten_memcpy_big, + emscripten_receive_on_main_thread_js: _emscripten_receive_on_main_thread_js, + emscripten_resize_heap: _emscripten_resize_heap, + emscripten_set_canvas_element_size: _emscripten_set_canvas_element_size, + emscripten_set_current_thread_status: _emscripten_set_current_thread_status, + emscripten_webgl_create_context: _emscripten_webgl_create_context, + environ_get: _environ_get, + environ_sizes_get: _environ_sizes_get, + exit: _exit, + fd_close: _fd_close, + fd_fdstat_get: _fd_fdstat_get, + fd_read: _fd_read, + fd_seek: _fd_seek, + fd_write: _fd_write, + getentropy: _getentropy, + initPthreadsJS: initPthreadsJS, + localtime_r: _localtime_r, + memory: wasmMemory, + pthread_cleanup_push: _pthread_cleanup_push, + pthread_create: _pthread_create, + pthread_join: _pthread_join, + pthread_self: _pthread_self, + setTempRet0: _setTempRet0, + strftime_l: _strftime_l, + sysconf: _sysconf, + time: _time, +}; +var asm = createWasm(); +var ___wasm_call_ctors = (Module["___wasm_call_ctors"] = function () { + return (___wasm_call_ctors = Module["___wasm_call_ctors"] = + Module["asm"]["__wasm_call_ctors"]).apply(null, arguments); +}); +var _free = (Module["_free"] = function () { + return (_free = Module["_free"] = Module["asm"]["free"]).apply(null, arguments); +}); +var _malloc = (Module["_malloc"] = function () { + return (_malloc = Module["_malloc"] = Module["asm"]["malloc"]).apply(null, arguments); +}); +var ___errno_location = (Module["___errno_location"] = function () { + return (___errno_location = Module["___errno_location"] = + Module["asm"]["__errno_location"]).apply(null, arguments); +}); +var _memset = (Module["_memset"] = function () { + return (_memset = Module["_memset"] = Module["asm"]["memset"]).apply(null, arguments); +}); +var ___getTypeName = (Module["___getTypeName"] = function () { + return (___getTypeName = Module["___getTypeName"] = + Module["asm"]["__getTypeName"]).apply(null, arguments); +}); +var ___embind_register_native_and_builtin_types = (Module["___embind_register_native_and_builtin_types"] = function () { + return (___embind_register_native_and_builtin_types = Module["___embind_register_native_and_builtin_types"] = Module["asm"]["__embind_register_native_and_builtin_types"]).apply(null, arguments); +}); +var ___emscripten_pthread_data_constructor = (Module["___emscripten_pthread_data_constructor"] = function () { + return (___emscripten_pthread_data_constructor = Module["___emscripten_pthread_data_constructor"] = Module["asm"]["__emscripten_pthread_data_constructor"]).apply(null, arguments); +}); +var _emscripten_get_global_libc = (Module["_emscripten_get_global_libc"] = function () { + return (_emscripten_get_global_libc = Module["_emscripten_get_global_libc"] = + Module["asm"]["emscripten_get_global_libc"]).apply(null, arguments); +}); +var __get_tzname = (Module["__get_tzname"] = function () { + return (__get_tzname = Module["__get_tzname"] = + Module["asm"]["_get_tzname"]).apply(null, arguments); +}); +var __get_daylight = (Module["__get_daylight"] = function () { + return (__get_daylight = Module["__get_daylight"] = + Module["asm"]["_get_daylight"]).apply(null, arguments); +}); +var __get_timezone = (Module["__get_timezone"] = function () { + return (__get_timezone = Module["__get_timezone"] = + Module["asm"]["_get_timezone"]).apply(null, arguments); +}); +var stackSave = (Module["stackSave"] = function () { + return (stackSave = Module["stackSave"] = Module["asm"]["stackSave"]).apply(null, arguments); +}); +var stackRestore = (Module["stackRestore"] = function () { + return (stackRestore = Module["stackRestore"] = + Module["asm"]["stackRestore"]).apply(null, arguments); +}); +var stackAlloc = (Module["stackAlloc"] = function () { + return (stackAlloc = Module["stackAlloc"] = + Module["asm"]["stackAlloc"]).apply(null, arguments); +}); +var _emscripten_stack_set_limits = (Module["_emscripten_stack_set_limits"] = function () { + return (_emscripten_stack_set_limits = Module["_emscripten_stack_set_limits"] = Module["asm"]["emscripten_stack_set_limits"]).apply(null, arguments); +}); +var _setThrew = (Module["_setThrew"] = function () { + return (_setThrew = Module["_setThrew"] = Module["asm"]["setThrew"]).apply(null, arguments); +}); +var _memalign = (Module["_memalign"] = function () { + return (_memalign = Module["_memalign"] = Module["asm"]["memalign"]).apply(null, arguments); +}); +var _emscripten_main_browser_thread_id = (Module["_emscripten_main_browser_thread_id"] = function () { + return (_emscripten_main_browser_thread_id = Module["_emscripten_main_browser_thread_id"] = Module["asm"]["emscripten_main_browser_thread_id"]).apply(null, arguments); +}); +var ___pthread_tsd_run_dtors = (Module["___pthread_tsd_run_dtors"] = function () { + return (___pthread_tsd_run_dtors = Module["___pthread_tsd_run_dtors"] = + Module["asm"]["__pthread_tsd_run_dtors"]).apply(null, arguments); +}); +var _emscripten_main_thread_process_queued_calls = (Module["_emscripten_main_thread_process_queued_calls"] = function () { + return (_emscripten_main_thread_process_queued_calls = Module["_emscripten_main_thread_process_queued_calls"] = Module["asm"]["emscripten_main_thread_process_queued_calls"]).apply(null, arguments); +}); +var _emscripten_current_thread_process_queued_calls = (Module["_emscripten_current_thread_process_queued_calls"] = function () { + return (_emscripten_current_thread_process_queued_calls = Module["_emscripten_current_thread_process_queued_calls"] = Module["asm"]["emscripten_current_thread_process_queued_calls"]).apply(null, arguments); +}); +var _emscripten_register_main_browser_thread_id = (Module["_emscripten_register_main_browser_thread_id"] = function () { + return (_emscripten_register_main_browser_thread_id = Module["_emscripten_register_main_browser_thread_id"] = Module["asm"]["emscripten_register_main_browser_thread_id"]).apply(null, arguments); +}); +var _do_emscripten_dispatch_to_thread = (Module["_do_emscripten_dispatch_to_thread"] = function () { + return (_do_emscripten_dispatch_to_thread = Module["_do_emscripten_dispatch_to_thread"] = Module["asm"]["do_emscripten_dispatch_to_thread"]).apply(null, arguments); +}); +var _emscripten_async_run_in_main_thread = (Module["_emscripten_async_run_in_main_thread"] = function () { + return (_emscripten_async_run_in_main_thread = Module["_emscripten_async_run_in_main_thread"] = Module["asm"]["emscripten_async_run_in_main_thread"]).apply(null, arguments); +}); +var _emscripten_sync_run_in_main_thread = (Module["_emscripten_sync_run_in_main_thread"] = function () { + return (_emscripten_sync_run_in_main_thread = Module["_emscripten_sync_run_in_main_thread"] = Module["asm"]["emscripten_sync_run_in_main_thread"]).apply(null, arguments); +}); +var _emscripten_sync_run_in_main_thread_0 = (Module["_emscripten_sync_run_in_main_thread_0"] = function () { + return (_emscripten_sync_run_in_main_thread_0 = Module["_emscripten_sync_run_in_main_thread_0"] = Module["asm"]["emscripten_sync_run_in_main_thread_0"]).apply(null, arguments); +}); +var _emscripten_sync_run_in_main_thread_1 = (Module["_emscripten_sync_run_in_main_thread_1"] = function () { + return (_emscripten_sync_run_in_main_thread_1 = Module["_emscripten_sync_run_in_main_thread_1"] = Module["asm"]["emscripten_sync_run_in_main_thread_1"]).apply(null, arguments); +}); +var _emscripten_sync_run_in_main_thread_2 = (Module["_emscripten_sync_run_in_main_thread_2"] = function () { + return (_emscripten_sync_run_in_main_thread_2 = Module["_emscripten_sync_run_in_main_thread_2"] = Module["asm"]["emscripten_sync_run_in_main_thread_2"]).apply(null, arguments); +}); +var _emscripten_sync_run_in_main_thread_xprintf_varargs = (Module["_emscripten_sync_run_in_main_thread_xprintf_varargs"] = function () { + return (_emscripten_sync_run_in_main_thread_xprintf_varargs = Module["_emscripten_sync_run_in_main_thread_xprintf_varargs"] = + Module["asm"]["emscripten_sync_run_in_main_thread_xprintf_varargs"]).apply(null, arguments); +}); +var _emscripten_sync_run_in_main_thread_3 = (Module["_emscripten_sync_run_in_main_thread_3"] = function () { + return (_emscripten_sync_run_in_main_thread_3 = Module["_emscripten_sync_run_in_main_thread_3"] = Module["asm"]["emscripten_sync_run_in_main_thread_3"]).apply(null, arguments); +}); +var _emscripten_sync_run_in_main_thread_4 = (Module["_emscripten_sync_run_in_main_thread_4"] = function () { + return (_emscripten_sync_run_in_main_thread_4 = Module["_emscripten_sync_run_in_main_thread_4"] = Module["asm"]["emscripten_sync_run_in_main_thread_4"]).apply(null, arguments); +}); +var _emscripten_sync_run_in_main_thread_5 = (Module["_emscripten_sync_run_in_main_thread_5"] = function () { + return (_emscripten_sync_run_in_main_thread_5 = Module["_emscripten_sync_run_in_main_thread_5"] = Module["asm"]["emscripten_sync_run_in_main_thread_5"]).apply(null, arguments); +}); +var _emscripten_sync_run_in_main_thread_6 = (Module["_emscripten_sync_run_in_main_thread_6"] = function () { + return (_emscripten_sync_run_in_main_thread_6 = Module["_emscripten_sync_run_in_main_thread_6"] = Module["asm"]["emscripten_sync_run_in_main_thread_6"]).apply(null, arguments); +}); +var _emscripten_sync_run_in_main_thread_7 = (Module["_emscripten_sync_run_in_main_thread_7"] = function () { + return (_emscripten_sync_run_in_main_thread_7 = Module["_emscripten_sync_run_in_main_thread_7"] = Module["asm"]["emscripten_sync_run_in_main_thread_7"]).apply(null, arguments); +}); +var _emscripten_run_in_main_runtime_thread_js = (Module["_emscripten_run_in_main_runtime_thread_js"] = function () { + return (_emscripten_run_in_main_runtime_thread_js = Module["_emscripten_run_in_main_runtime_thread_js"] = Module["asm"]["emscripten_run_in_main_runtime_thread_js"]).apply(null, arguments); +}); +var __emscripten_call_on_thread = (Module["__emscripten_call_on_thread"] = function () { + return (__emscripten_call_on_thread = Module["__emscripten_call_on_thread"] = + Module["asm"]["_emscripten_call_on_thread"]).apply(null, arguments); +}); +var _emscripten_tls_init = (Module["_emscripten_tls_init"] = function () { + return (_emscripten_tls_init = Module["_emscripten_tls_init"] = + Module["asm"]["emscripten_tls_init"]).apply(null, arguments); +}); +var dynCall_viijii = (Module["dynCall_viijii"] = function () { + return (dynCall_viijii = Module["dynCall_viijii"] = + Module["asm"]["dynCall_viijii"]).apply(null, arguments); +}); +var dynCall_ji = (Module["dynCall_ji"] = function () { + return (dynCall_ji = Module["dynCall_ji"] = + Module["asm"]["dynCall_ji"]).apply(null, arguments); +}); +var dynCall_jiji = (Module["dynCall_jiji"] = function () { + return (dynCall_jiji = Module["dynCall_jiji"] = + Module["asm"]["dynCall_jiji"]).apply(null, arguments); +}); +var dynCall_iiiiij = (Module["dynCall_iiiiij"] = function () { + return (dynCall_iiiiij = Module["dynCall_iiiiij"] = + Module["asm"]["dynCall_iiiiij"]).apply(null, arguments); +}); +var dynCall_iiiiijj = (Module["dynCall_iiiiijj"] = function () { + return (dynCall_iiiiijj = Module["dynCall_iiiiijj"] = + Module["asm"]["dynCall_iiiiijj"]).apply(null, arguments); +}); +var dynCall_iiiiiijj = (Module["dynCall_iiiiiijj"] = function () { + return (dynCall_iiiiiijj = Module["dynCall_iiiiiijj"] = + Module["asm"]["dynCall_iiiiiijj"]).apply(null, arguments); +}); +var _main_thread_futex = (Module["_main_thread_futex"] = 1564224); +Module["addOnPreMain"] = addOnPreMain; +Module["PThread"] = PThread; +Module["PThread"] = PThread; +Module["_pthread_self"] = _pthread_self; +Module["wasmMemory"] = wasmMemory; +Module["ExitStatus"] = ExitStatus; +var calledRun; +function ExitStatus(status) { + this.name = "ExitStatus"; + this.message = "Program terminated with exit(" + status + ")"; + this.status = status; +} +dependenciesFulfilled = function runCaller() { + if (!calledRun) + run(); + if (!calledRun) + dependenciesFulfilled = runCaller; +}; +function run(args) { + args = args || arguments_; + if (runDependencies > 0) { + return; + } + preRun(); + if (runDependencies > 0) + return; + function doRun() { + if (calledRun) + return; + calledRun = true; + Module["calledRun"] = true; + if (ABORT) + return; + initRuntime(); + preMain(); + if (Module["onRuntimeInitialized"]) + Module["onRuntimeInitialized"](); + postRun(); + } + if (Module["setStatus"]) { + Module["setStatus"]("Running..."); + setTimeout(function () { + setTimeout(function () { + Module["setStatus"](""); + }, 1); + doRun(); + }, 1); + } + else { + doRun(); + } +} +Module["run"] = run; +function exit(status, implicit) { + if (implicit && noExitRuntime && status === 0) { + return; + } + if (noExitRuntime) { + } + else { + PThread.terminateAllThreads(); + EXITSTATUS = status; + exitRuntime(); + if (Module["onExit"]) + Module["onExit"](status); + ABORT = true; + } + quit_(status, new ExitStatus(status)); +} +if (Module["preInit"]) { + if (typeof Module["preInit"] == "function") + Module["preInit"] = [Module["preInit"]]; + while (Module["preInit"].length > 0) { + Module["preInit"].pop()(); + } +} +if (!ENVIRONMENT_IS_PTHREAD) + noExitRuntime = true; +if (!ENVIRONMENT_IS_PTHREAD) { + run(); +} +else { + PThread.initWorker(); +} + + +/***/ }), + +/***/ 4064: +/*!******************************************************************************!*\ + !*** ./src/core/ts/web-worker-scripts/translation-worker.js/digestSha256.ts ***! + \******************************************************************************/ +/***/ (function(__unused_webpack_module, exports) { + + +var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { + function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } + return new (P || (P = Promise))(function (resolve, reject) { + function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } + function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } + function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } + step((generator = generator.apply(thisArg, _arguments || [])).next()); + }); +}; +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.digestSha256 = void 0; +/** + * Derived from https://developer.mozilla.org/en-US/docs/Web/API/SubtleCrypto/digest + */ +const digestSha256 = (buffer) => __awaiter(void 0, void 0, void 0, function* () { + // hash the message + const hashBuffer = yield crypto.subtle.digest("SHA-256", buffer); + // convert buffer to byte array + const hashArray = Array.from(new Uint8Array(hashBuffer)); + // convert bytes to hex string + return hashArray.map(b => b.toString(16).padStart(2, "0")).join(""); +}); +exports.digestSha256 = digestSha256; + + +/***/ }), + +/***/ 92: +/*!**************************************************************************************************!*\ + !*** ./src/core/ts/web-worker-scripts/translation-worker.js/getBergamotModelsForLanguagePair.ts ***! + \**************************************************************************************************/ +/***/ (function(__unused_webpack_module, exports, __webpack_require__) { + + +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ +var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { + function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } + return new (P || (P = Promise))(function (resolve, reject) { + function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } + function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } + function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } + step((generator = generator.apply(thisArg, _arguments || [])).next()); + }); +}; +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.getBergamotModelsForLanguagePair = exports.ModelDownloadError = void 0; +const digestSha256_1 = __webpack_require__(/*! ./digestSha256 */ 4064); +const instrumentResponseWithProgressCallback_1 = __webpack_require__(/*! ./instrumentResponseWithProgressCallback */ 14); +const persistResponse_1 = __webpack_require__(/*! ./persistResponse */ 6824); +const throttle_1 = __webpack_require__(/*! ./throttle */ 7424); +const mb = bytes => Math.round((bytes / 1024 / 1024) * 10) / 10; +class ModelDownloadError extends Error { + constructor() { + super(...arguments); + this.name = "ModelDownloadError"; + } +} +exports.ModelDownloadError = ModelDownloadError; +const getBergamotModelsForLanguagePair = (languagePair, bergamotModelsBaseUrl, modelRegistry, cache, log, onModelDownloadProgress) => __awaiter(void 0, void 0, void 0, function* () { + if (!modelRegistry[languagePair]) { + throw new ModelDownloadError(`Language pair '${languagePair}' not supported`); + } + const downloadStart = Date.now(); + const modelRegistryEntry = modelRegistry[languagePair]; + const modelFiles = Object.keys(modelRegistryEntry).map((type) => { + const { name, size, expectedSha256Hash } = modelRegistryEntry[type]; + const url = `${bergamotModelsBaseUrl}/${languagePair}/${name}`; + return { type, url, name, size, expectedSha256Hash }; + }); + // Check remaining storage quota + const quota = yield navigator.storage.estimate(); + const percentageUsed = (quota.usage / quota.quota) * 100; + console.info(`${Math.round(percentageUsed * 100) / + 100}% used of the available storage (${mb(quota.quota)} mb).`); + const approximateRemainingQuota = quota.quota - quota.usage; + console.info(`Remaining storage quota: ${mb(approximateRemainingQuota)} mb.`); + // Don't attempt to persist model files if remaining quota suggest that it won't work + let persistFiles = true; + const modelFilesSize = modelFiles + .map(({ size }) => size) + .reduce((a, b) => a + b, 0); + if (modelFilesSize > approximateRemainingQuota) { + persistFiles = false; + log(`${languagePair}: Will not attempt to persist the model files (${mb(modelFilesSize)} mb) since approximate remaining quota (${mb(approximateRemainingQuota)} mb) is too small`); + } + // Summarize periodical updates on total language pair download progress + const bytesTransferredByType = { + lex: 0, + model: 0, + vocab: 0, + }; + const filesToTransferByType = { + lex: false, + model: false, + vocab: false, + }; + const sumLanguagePairFileToTransferSize = attribute => { + return ["lex", "model", "vocab"] + .map(type => filesToTransferByType[type] ? modelRegistryEntry[type][attribute] : 0) + .reduce((a, b) => a + b, 0); + }; + const broadcastDownloadProgressUpdate = () => { + const languagePairBytesTransferred = bytesTransferredByType.lex + + bytesTransferredByType.model + + bytesTransferredByType.vocab; + const languagePairBytesToTransfer = sumLanguagePairFileToTransferSize("size"); + const languagePairEstimatedCompressedBytesToTransfer = sumLanguagePairFileToTransferSize("estimatedCompressedSize"); + const percentTransferred = languagePairBytesToTransfer > 0 + ? languagePairBytesTransferred / languagePairBytesToTransfer + : 1.0; + const downloadDurationMs = Date.now() - downloadStart; + const modelDownloadProgress = { + bytesDownloaded: Math.round(percentTransferred * languagePairEstimatedCompressedBytesToTransfer), + bytesToDownload: languagePairEstimatedCompressedBytesToTransfer, + startTs: downloadStart, + durationMs: downloadDurationMs, + endTs: undefined, + }; + onModelDownloadProgress(modelDownloadProgress); + /* + console.debug( + `${languagePair}: onDownloadProgressUpdate - ${Math.round( + percentTransferred * 100, + )}% out of ${mb(languagePairEstimatedCompressedBytesToTransfer)} mb (${mb( + languagePairBytesToTransfer, + )} mb uncompressed) transferred`, + ); + */ + }; + const throttledBroadcastDownloadProgressUpdate = throttle_1.throttle(broadcastDownloadProgressUpdate, 100); + // Download or restore model files from persistent cache + const downloadedModelFiles = yield Promise.all(modelFiles.map(({ type, url, name, expectedSha256Hash }) => __awaiter(void 0, void 0, void 0, function* () { + let response = yield cache.match(url); + let downloaded = false; + if (!response || response.status >= 400) { + log(`Downloading model file ${name} from ${url}`); + downloaded = true; + filesToTransferByType[type] = true; + try { + const downloadResponsePromise = fetch(url); + // Await initial response headers before continuing + const downloadResponseRaw = yield downloadResponsePromise; + // Hook up progress callbacks to track actual download of the model files + const onProgress = (bytesTransferred) => { + // console.debug(`${name}: onProgress - ${mb(bytesTransferred)} mb out of ${mb(size)} mb transferred`); + bytesTransferredByType[type] = bytesTransferred; + throttledBroadcastDownloadProgressUpdate(); + }; + response = instrumentResponseWithProgressCallback_1.instrumentResponseWithProgressCallback(downloadResponseRaw, onProgress); + log(`Response for ${url} from network is: ${response.status}`); + if (persistFiles) { + // This avoids caching responses that we know are errors (i.e. HTTP status code of 4xx or 5xx). + if (response.status < 400) { + yield persistResponse_1.persistResponse(cache, url, response, log); + } + else { + log(`${name}: Not caching the response to ${url} since the status was >= 400`); + } + } + } + catch ($$err) { + console.warn(`${name}: An error occurred while downloading/persisting the file`, { $$err }); + const errorToThrow = new ModelDownloadError($$err.message); + errorToThrow.stack = $$err.stack; + throw errorToThrow; + } + } + else { + log(`${name}: Model file from ${url} previously downloaded already`); + } + if (response.status >= 400) { + throw new ModelDownloadError("Model file download failed"); + } + const arrayBuffer = yield response.arrayBuffer(); + // Verify the hash of downloaded model files + const sha256Hash = yield digestSha256_1.digestSha256(arrayBuffer); + if (sha256Hash !== expectedSha256Hash) { + console.warn(`Model file download integrity check failed for ${languagePair}'s ${type} file`, { + sha256Hash, + expectedSha256Hash, + }); + throw new ModelDownloadError(`Model file download integrity check failed for ${languagePair}'s ${type} file`); + } + return { type, name, arrayBuffer, downloaded, sha256Hash }; + }))); + // Measure the time it took to acquire model files + const downloadEnd = Date.now(); + const downloadDurationMs = downloadEnd - downloadStart; + const totalBytes = downloadedModelFiles + .map(({ arrayBuffer }) => arrayBuffer.byteLength) + .reduce((a, b) => a + b, 0); + const totalBytesDownloaded = downloadedModelFiles + .filter(({ downloaded }) => downloaded) + .map(({ arrayBuffer }) => arrayBuffer.byteLength) + .reduce((a, b) => a + b, 0); + // Either report the total time for downloading or the time it has taken to load cached model files + if (totalBytesDownloaded > 0) { + const languagePairEstimatedCompressedBytesToTransfer = sumLanguagePairFileToTransferSize("estimatedCompressedSize"); + const finalModelDownloadProgress = { + bytesDownloaded: languagePairEstimatedCompressedBytesToTransfer, + bytesToDownload: languagePairEstimatedCompressedBytesToTransfer, + startTs: downloadStart, + durationMs: downloadDurationMs, + endTs: downloadEnd, + }; + onModelDownloadProgress(finalModelDownloadProgress); + } + else { + const finalModelDownloadProgress = { + bytesDownloaded: 0, + bytesToDownload: 0, + startTs: downloadStart, + durationMs: downloadDurationMs, + endTs: downloadEnd, + }; + onModelDownloadProgress(finalModelDownloadProgress); + } + log(`All model files for ${languagePair} downloaded / restored from persistent cache in ${downloadDurationMs / + 1000} seconds (total uncompressed size of model files: ${mb(totalBytes)} mb, of which ${Math.round((totalBytesDownloaded / totalBytes) * 100)}% was downloaded)`); + return downloadedModelFiles; +}); +exports.getBergamotModelsForLanguagePair = getBergamotModelsForLanguagePair; + + +/***/ }), + +/***/ 4611: +/*!***********************************************************************!*\ + !*** ./src/core/ts/web-worker-scripts/translation-worker.js/index.ts ***! + \***********************************************************************/ +/***/ (function(__unused_webpack_module, exports, __webpack_require__) { + + +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ +var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { + function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } + return new (P || (P = Promise))(function (resolve, reject) { + function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } + function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } + function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } + step((generator = generator.apply(thisArg, _arguments || [])).next()); + }); +}; +Object.defineProperty(exports, "__esModule", ({ value: true })); +const bergamot_translator_worker_1 = __webpack_require__(/*! ./bergamot-translator-worker */ 3662); +const getBergamotModelsForLanguagePair_1 = __webpack_require__(/*! ./getBergamotModelsForLanguagePair */ 92); +const config_1 = __webpack_require__(/*! ../../config */ 964); +bergamot_translator_worker_1.addOnPreMain(function () { + let model; + const log = message => { + postMessage({ + type: "log", + message, + }); + }; + /** + * If we end up in a situation where we want to make sure that an instance is deleted + * and the instance was in fact already deleted, then let that happen without throwing + * a fatal error. + * + * @param instance + */ + const safelyDeleteInstance = instance => { + try { + instance.delete(); + } + catch (err) { + if (err.name === "BindingError" && + err.message.includes("instance already deleted")) { + // ignore + return; + } + throw err; + } + }; + /** + * Automatically download the appropriate translation models, vocabularies and lexical shortlists if not already locally present + */ + const downloadModel = (from, to, bergamotModelsBaseUrl, onModelDownloadProgress) => __awaiter(this, void 0, void 0, function* () { + log(`downloadModel(${from}, ${to}, ${bergamotModelsBaseUrl})`); + const languagePair = `${from}${to}`; + const cache = yield caches.open("bergamot-models"); + const downloadedModelFiles = yield getBergamotModelsForLanguagePair_1.getBergamotModelsForLanguagePair(languagePair, bergamotModelsBaseUrl, config_1.modelRegistry, cache, log, onModelDownloadProgress); + const downloadedModelFilesByType = { + lex: undefined, + model: undefined, + vocab: undefined, + }; + downloadedModelFiles.forEach(downloadedModelFile => { + downloadedModelFilesByType[downloadedModelFile.type] = downloadedModelFile; + }); + return downloadedModelFilesByType; + }); + const loadModel = (from, to, bergamotModelsBaseUrl, onModelDownloadProgress) => __awaiter(this, void 0, void 0, function* () { + log(`loadModel(${from}, ${to})`); + // Delete previous instance if a model is already loaded + if (model) { + safelyDeleteInstance(model); + } + // Download or hydrate model files to/from persistent storage + const downloadedModelFilesByType = yield downloadModel(from, to, bergamotModelsBaseUrl, onModelDownloadProgress); + const loadModelStart = performance.now(); + // This function constructs the AlignedMemory from the array buffer and the alignment size + const constructAlignedMemoryFromBuffer = (buffer, alignmentSize) => { + const byteArray = new Int8Array(buffer); + // console.debug("byteArray size: ", byteArray.byteLength); + const alignedMemory = new bergamot_translator_worker_1.Module.AlignedMemory(byteArray.byteLength, alignmentSize); + const alignedByteArrayView = alignedMemory.getByteArrayView(); + alignedByteArrayView.set(byteArray); + return alignedMemory; + }; + // Set the Model Configuration as YAML formatted string. + // For available configuration options, please check: https://marian-nmt.github.io/docs/cmd/marian-decoder/ + // This example captures the most relevant options: model file, vocabulary files and shortlist file + const modelConfig = `beam-size: 1 +normalize: 1.0 +word-penalty: 0 +max-length-break: 128 +mini-batch-words: 1024 +workspace: 128 +max-length-factor: 2.0 +skip-cost: true +cpu-threads: 0 +quiet: true +quiet-translation: true +gemm-precision: int8shift +`; + console.log("modelConfig: ", modelConfig); + // Instantiate the TranslationModel + const modelBuffer = downloadedModelFilesByType.model.arrayBuffer; + const shortListBuffer = downloadedModelFilesByType.lex.arrayBuffer; + const vocabBuffers = [downloadedModelFilesByType.vocab.arrayBuffer]; + // Construct AlignedMemory objects with downloaded buffers + const alignedModelMemory = constructAlignedMemoryFromBuffer(modelBuffer, 256); + const alignedShortlistMemory = constructAlignedMemoryFromBuffer(shortListBuffer, 64); + const alignedVocabsMemoryList = new bergamot_translator_worker_1.Module.AlignedMemoryList(); + vocabBuffers.forEach(item => alignedVocabsMemoryList.push_back(constructAlignedMemoryFromBuffer(item, 64))); + model = new bergamot_translator_worker_1.Module.TranslationModel(modelConfig, alignedModelMemory, alignedShortlistMemory, alignedVocabsMemoryList); + const loadModelEnd = performance.now(); + const modelLoadWallTimeMs = loadModelEnd - loadModelStart; + const alignmentIsSupported = model.isAlignmentSupported(); + console.debug("Alignment:", alignmentIsSupported); + return { alignmentIsSupported, modelLoadWallTimeMs }; + }); + const translate = (texts) => { + log(`translate()`); + if (!model) { + throw new Error("Translate attempted before model was loaded"); + } + // TODO: Check that the loaded model supports the translation direction + // Prepare results object + const translationResults = { + originalTexts: [], + translatedTexts: [], + }; + // Instantiate the arguments of translate() API i.e. TranslationRequest and input (vector) + const request = new bergamot_translator_worker_1.Module.TranslationRequest(); + const input = new bergamot_translator_worker_1.Module.VectorString(); + // Add texts to translate + texts.forEach(text => { + input.push_back(text); + }); + // Access input (just for debugging) + console.debug("Input size=", input.size()); + /* + for (let i = 0; i < input.size(); i++) { + console.debug(" val:" + input.get(i)); + } + */ + // Translate the input; the result is a vector + const result = model.translate(input, request); + // Access input after translation (just for debugging) + console.debug("Input size after translate API call =", input.size()); + // Access original and translated text from each entry of vector + console.debug("Result size=", result.size()); + for (let i = 0; i < result.size(); i++) { + const originalText = result.get(i).getOriginalText(); + const translatedText = result.get(i).getTranslatedText(); + translationResults.originalTexts.push(originalText); + translationResults.translatedTexts.push(translatedText); + } + // Clean up the instances + safelyDeleteInstance(request); + safelyDeleteInstance(input); + return translationResults; + }; + const handleError = (error, requestId, errorSource) => { + console.info(`Error/exception caught in worker during ${errorSource}:`, error); + log(`Error/exception caught in worker during ${errorSource}: ${error} ${error.stack}`); + const message = { + type: `error`, + message: `Error/exception caught in worker during ${errorSource}: ${error.toString()}`, + requestId, + errorSource, + }; + postMessage(message); + }; + onmessage = function (msg) { + const { data } = msg; + if (!data.type || !data.requestId) { + return; + } + const requestId = data.requestId; + if (data.type === "loadModel") { + try { + loadModel(data.loadModelParams.from, data.loadModelParams.to, data.loadModelParams.bergamotModelsBaseUrl, (modelDownloadProgress) => { + const message = { + type: "modelDownloadProgress", + requestId, + modelDownloadProgress, + }; + postMessage(message); + }) + .then(loadModelResults => { + const message = { + type: "loadModelResults", + requestId, + loadModelResults, + }; + postMessage(message); + }) + .catch(error => { + if (error.name === "ModelDownloadError") { + handleError(error, requestId, "downloadModel"); + } + else { + handleError(error, requestId, "loadModel"); + } + }); + } + catch (error) { + handleError(error, requestId, "loadModel"); + } + } + else if (data.type === "translate") { + try { + console.log("Messages to translate: ", data.translateParams.texts); + const translationResults = translate(data.translateParams.texts); + const message = { + type: "translationResults", + requestId, + translationResults, + }; + postMessage(message); + } + catch (error) { + handleError(error, requestId, "translate"); + } + } + else { + throw new Error(`Unexpected message data payload sent to translation worker: "${JSON.stringify(data)}"`); + } + }; + // Send a message indicating that the worker is ready to receive WASM-related messages + postMessage("ready"); + log("The worker is ready to receive translation-related messages"); +}); + + +/***/ }), + +/***/ 14: +/*!********************************************************************************************************!*\ + !*** ./src/core/ts/web-worker-scripts/translation-worker.js/instrumentResponseWithProgressCallback.ts ***! + \********************************************************************************************************/ +/***/ ((__unused_webpack_module, exports) => { + + +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.instrumentResponseWithProgressCallback = void 0; +const instrumentResponseWithProgressCallback = (response, onProgress) => { + const { body, headers, status } = response; + // Only attempt to track download progress on valid responses + if (status >= 400) { + return response; + } + const reader = body.getReader(); + let bytesTransferred = 0; + const stream = new ReadableStream({ + start(controller) { + function push() { + reader.read().then(({ done, value }) => { + if (done) { + controller.close(); + return; + } + if (value) { + onProgress(bytesTransferred); + bytesTransferred += value.length; + } + controller.enqueue(value); + push(); + }); + } + push(); + }, + }); + return new Response(stream, { headers, status }); +}; +exports.instrumentResponseWithProgressCallback = instrumentResponseWithProgressCallback; + + +/***/ }), + +/***/ 6824: +/*!*********************************************************************************!*\ + !*** ./src/core/ts/web-worker-scripts/translation-worker.js/persistResponse.ts ***! + \*********************************************************************************/ +/***/ (function(__unused_webpack_module, exports) { + + +var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { + function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } + return new (P || (P = Promise))(function (resolve, reject) { + function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } + function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } + function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } + step((generator = generator.apply(thisArg, _arguments || [])).next()); + }); +}; +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.persistResponse = void 0; +const persistResponse = (cache, url, response, log) => __awaiter(void 0, void 0, void 0, function* () { + // Both fetch() and cache.put() "consume" the request, so we need to make a copy. + // (see https://developer.mozilla.org/en-US/docs/Web/API/Request/clone) + try { + // Store fetched contents in cache + yield cache.put(url, response.clone()); + } + catch (err) { + console.warn("Error occurred during cache.put()", { err }); + // Note that this error is currently not thrown at all due to https://github.com/jimmywarting/cache-polyfill/issues/4 + if (err && err.name === "QuotaExceededError") { + // Don't bail just because we can't persist the model file across browser restarts + console.warn(err); + log(`${name}: Ran into and ignored a QuotaExceededError`); + } + else { + throw err; + } + } +}); +exports.persistResponse = persistResponse; + + +/***/ }), + +/***/ 7424: +/*!**************************************************************************!*\ + !*** ./src/core/ts/web-worker-scripts/translation-worker.js/throttle.ts ***! + \**************************************************************************/ +/***/ ((__unused_webpack_module, exports) => { + + +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.throttle = void 0; +/** + * Execute a callback immediately and then at most once each {ms} ms + * Derived from https://stackoverflow.com/a/27078401/682317 + */ +const throttle = (callback, ms) => { + let waiting = false; + return function () { + if (!waiting) { + callback.apply(this, arguments); + waiting = true; + setTimeout(function () { + waiting = false; + }, ms); + } + }; +}; +exports.throttle = throttle; + + +/***/ }) + +/******/ }); +/************************************************************************/ +/******/ // The module cache +/******/ var __webpack_module_cache__ = {}; +/******/ +/******/ // The require function +/******/ function __webpack_require__(moduleId) { +/******/ // Check if module is in cache +/******/ if(__webpack_module_cache__[moduleId]) { +/******/ return __webpack_module_cache__[moduleId].exports; +/******/ } +/******/ // Create a new module (and put it into the cache) +/******/ var module = __webpack_module_cache__[moduleId] = { +/******/ // no module.id needed +/******/ // no module.loaded needed +/******/ exports: {} +/******/ }; +/******/ +/******/ // Execute the module function +/******/ __webpack_modules__[moduleId].call(module.exports, module, module.exports, __webpack_require__); +/******/ +/******/ // Return the exports of the module +/******/ return module.exports; +/******/ } +/******/ +/************************************************************************/ +/******/ +/******/ // startup +/******/ // Load entry module and return exports +/******/ // This entry module is referenced by other modules so it can't be inlined +/******/ var __webpack_exports__ = __webpack_require__(4611); +/******/ +/******/ })() +; +//# sourceMappingURL=translation-worker.js.map \ No newline at end of file diff --git a/browser/extensions/translations/extension/wasm/bergamot-translator-worker.wasm b/browser/extensions/translations/extension/wasm/bergamot-translator-worker.wasm new file mode 100644 index 0000000000000000000000000000000000000000..de07ca49e5c24906e0d7fd3d80c40d0f1952c6bf GIT binary patch literal 6732404 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

lZr5Oylc5lP+>(> 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

M{pcLd3XKaEk1v$kz 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

W^hv>43qt>D30 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

${FcRtUb7O?+4hWUQ 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℞c}Mg^q8O+Cj|#;Jqrz{Xeh|gR6@pQ4 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%0De%*<_Xm7xzPqeZ3WQ%80F1Ino8QAT2j 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 }t^_Y}{p!j;y|mPo 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%0A|hG}8PPGv1HFJbG&y|It*;+W2H+E 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

yyY2$J4hp*tp2V&*x#8>a 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

|Zk9c}8eBEpM@gHMwuRHZ+{XhOH32Q^VAB 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%0AoAHt06tqf{%2X}%(M#oz)=@c-5 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%0At#55SP!_$TP%U{Pcp$X`Op;Z7x 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%0DEf)y$M5!<_`n7ZM8;Swo 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%0A2a^FhyQ)Q)i_^mjpH0!=l}K2*?_p# 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%0A@~dY4JILoZ~FpR3+v!!xE+2EkANNupbDDd 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 zr~g0w|LOlv|9|@b)Bm6T|MdT-|3Cfz>HkmvfBOH^|DXQ<^#7;-KmGsd|4;va`v24a zpZ@>!|EK>y{r~CzPyc`V|I`1U{{QsHkmv zfBOH^|DXQ<^#7;-KmGsd|4;va`v24apZ@>!|EK>y{r~CzPyc`V|I`1U{{QsHkmvfBOH^|DXQ<^#7;-KmGsd|4;va`v24apZ@>! z|EK>y{r~CzPyc`V|I`1U{{QsHkmvfBOH^ z|DXQ<^#7;-KmGsd|4;va`v24apZ@>!|EK>y{r~CzPyc`V|I`1U{{QsHkmvfBOH^|DXQ<^#7;-KmGsd|4;va`v24apZ@>!|EK>y z{r~CzPyc`V|I`1U{{QsHkmvfBOH^|DXQ< z^#7;-KmGsd|4;va`v24apZ@>!|EK>y{r~CzPyc`V|I`1U{{QsHkmvfBOH^|DXQ<^#7;-KmGsd|4;va`v24apZ@>!|EK>y{r~Cz zPyc`V|I`1U{{QsHkmvfBOH^|DXQ<^#7;- zKmGsd|4;va`v24apZ@>!|EK>y{r~CzPyc`V|I`1U{{QsHkmvfBOH^|DXQ<^#7;-KmGsd|4;va`v24apZ@>!|EK>y{r~CzPyc`V z|I`1U{{QsHkmvfBOH^|DXQ<^#7;-KmGsd z|4;va`v24apZ@>!|EK>y{r~CzPyc`V|I`1U{{QsHkmvfBOH^|DXQ<^#7;-KmGsd|4;va`v24apZ@>!|EK>y{r~CzPyc`V|I`1U z{{QsHkmvfBOH^|DXQ<^#7;-KmGsd|4;va z`v24apZ@>!|EK>y{r~CzPyc`V|I`1U{{QsHkmvfBOH^|DXQ<^#7;-KmGsd|4;va`v24apZ@>!|EK>y{r~CzPyc`V|I`1U{{Qs< zr~g0w|LOlv|9|@b)Bm6T|MdT-|3Cfz>HkmvfBOH^|DXQ<^#7;-KmGsd|4;va`v24a zpZ@>!|EK>y{r~CzPyc`V|I`1U{{QsHkmv zfBOH^|DXQ<^#7;-KmGsd|4;va`v24apZ@>!|EK>y{r~CzPyc`V|I`1U{{QsHkmvfBOH^|DXQ<^#7;-KmGsd|4;va`v24apZ@>! z|EK>y{r~CzPyc`V|I`1U{{QsHkmvfBOH^ z|DXQ<^#7;-KmGsd|4;va`v24apZ@>!|EK>y{r~CzPyc`V|I`1U{{QsHkmvfBOH^|DXQ<^#7;-KmGsd|4;va`v24apZ@>!|EK>y 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 z|EK>?|DXOp{eSxZ^#AGq)BmUcPye6(KmC9D|MdUq|I`1c|4;v){y+VH`v3I*>HpLJ zr~gm?pZ-7nfBOIQ|LOnJ|EK>?|DXOp{eSxZ^#AGq)BmUcPye6(KmC9D|MdUq|I`1c z|4;v){y+VH`v3I*>HpLJr~gm?pZ-7nfBOIQ|LOnJ|EK>?|DXOp{eSxZ^#AGq)BmUc zPye6(KmC9D|MdUq|I`1c|4;v){y+VH`v3I*>HpLJr~gm?pZ-7nfBOIQ|LOnJ|EK>? z|DXOp{eSxZ^#AGq)BmUcPye6(KmC9D|MdUq|I`1c|4;v){y+VH`v3I*>HpLJr~gm? zpZ-7nfBOIQ|LOnJ|EK>?|DXOp{eSxZ^#AGq)BmUcPye6(KmC9D|MdUq|I`1c|4;v) z{y+VH`v3I*>HpLJr~gm?pZ-7nfBOIQ|LOnJ|EK>?|DXOp{eSxZ^#AGq)BmUcPye6( zKmC9D|MdUq|I`1c|4;v){y+VH`v3I*>HpLJr~gm?pZ-7nfBOIQ|LOnJ|EK>?|DXOp z{eSxZ^#AGq)BmUcPye6(KmC9D|MdUq|I`1c|4;v){y+VH`v3I*>HpLJr~gm?pZ-7n zfBOIQ|LOnJ|EK>?|DXOp{eSxZ^#AGq)BmUcPye6(KmC9D|MdUq|I`1c|4;v){y+VH z`v3I*>HpLJr~gm?pZ-7nfBOIQ|LOnJ|EK>?|DXOp{eSxZ^#AGq)BmUcPye6(KmC9D z|MdUq|I`1c|4;v){y+VH`v3I*>HpLJr~gm?pZ-7nfBOIQ|LOnJ|EK>?|DXOp{eSxZ z^#AGq)BmUcPye6(KmC9D|MdUq|I`1c|4;v){y+VH`v3I*>HpLJr~gm?pZ-7nfBOIQ z|LOnJ|EK>?|DXOp{eSxZ^#AGq)BmUcPye6(KmC9D|MdUq|I`1c|4;v){y+VH`v3I* z>HpLJr~gm?pZ-7nfBOIQ|LOnJ|EK>?|DXOp{eSxZ^#AGq)BmUcPye6(KmC9D|MdUq z|I`1c|4;v){y+VH`v3I*>HpLJr~gm?pZ-7nfBOIQ|LOnJ|EK>?|DXOp{eSxZ^#AGq z)BmUcPye6(KmC9D|MdUq|I`1c|4;v){y+VH`v3I*>HpLJr~gm?pZ-7nfBOIQ|LOnJ z|EK>?|DXOp{eSxZ^#AGq)BmUcPye6(KmC9D|MdUq|I`1c|4;v){y+VH`v3I*>HpLJ zr~gm?pZ-7nfBOIQ|LOnJ|EK>?|DXOp{eSxZ^#AGq)BmUcPye6(KmC9D|MdUq|I`1c z|4;v){y+VH`v3I*>HpLJr~gm?pZ-7nfBOIQ|LOnJ|EK>?|DXOp{eSxZ^#AGq)BmUc zPye6(KmC9D|MdUq|I`1c|4;v){y+VH`v3I*>HpLJr~gm?pZ-7nfBOIQ|LOnJ|EK>? z|DXOp{eSxZ^#AGq)BmUcPye6(KmC9D|MdUq|I`1c|4;v){y+VH`v3I*>HpLJr~gm? zpZ-7nfBOIQ|LOnJ|EK>?|DXOp{eSxZ^#AGq)BmUcPye6(KmC9D|MdUq|I`1c|4;v) z{y+VH`v3I*>HpLJr~gm?pZ-7nfBOIQ|LOnJ|EK>?|DXOp{eSxZ^#AGq)BmUcPye6( zKmC9D|MdUq|I`1c|4;v){y+VH`v3I*>HpLJr~gm?pZ-7nfBOIQ|LOnJ|EK>?|DXOp z{eSxZ^#AGq)BmUcPye6(KmC9D|MdUq|I`1c|4;v){y+VH`v3I*>HpLJr~gm?pZ-7n zfBOIQ|LOnJ|EK>?|DXOp{eSxZ^#AGq)BmUcPye6(KmC9D|MdUq|I`1c|4;v){y+VH z`v3I*>HpLJr~gm?pZ-7nfBOIQ|LOnJ|EK>?|DXOp{eSxZ^#AGq)BmUcPye6(KmC9D z|MdUq|I`1c|4;v){y+VH`v3I*>HpLJr~gm?pZ-7nfBOIQ|LOnJ|EK>?|DXOp{eSxZ z^#AGq)BmUcPye6(KmC9D|MdUq|I`1c|4;v){y+VH`v3I*>HpLJr~gm?pZ-7nfBOIQ z|LOnJ|EK>?|DXOp{eSxZ^#AGq)BmUcPye6(KmC9D|MdUq|I`1c|4;v){y+VH`v3I* z>HpLJr~gm?pZ-7nfBOIQ|LOnJ|EK>?|DXOp{eSxZ^#AGq)BmUcPye6(KmC9D|MdUq z|I`1c|4;v){y+VH`v3I*>HpLJr~gm?pZ-7nfBOIQ|LOnJ|EK>?|DXOp{eSxZ^#AGq z)BmUcPye6(KmC9D|MdUq|I`1c|4;v){y+VH`v3I*>HpLJr~gm?pZ-7nfBOIQ|LOnJ z|EK>?|DXOp{eSxZ^#AGq)BmUcPye6(KmC9D|MdUq|I`1c|4;v){y+VH`v3I*>HpLJ zr~gm?pZ-7nfBOIQ|LOnJ|EK>?|DXOp{eSxZ^#AGq)BmUcPye6(KmC9D|MdUq|I`1c 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 zhz1Z1AR0h4fM@{G0HOgz1BeC?4ImmoG=OLT(Ey?WL<5Kh5Dg$2Ks1180MP)V0Yn3c z1`rJ(8bCCFXaLawq5(t$hz1Z1AR0h4fM@{G0HOgz1BeC?4ImmoG=OLT(Ey?WL<5Kh z5Dg$2Ks1180MP)V0Yn3c1`rJ(8bCCFXaLawq5(t$hz1Z1AR0h4fM@{G0HOgz1BeC? z4ImmoG=OLT(Ey?WL<5Kh5Dg$2Ks1180MP)V0Yn3c1`rJ(8bCCFXaLawq5(t$hz1Z1 zAR0h4fM@{G0HOgz1BeC?4ImmoG=OLT(Ey?WL<5Kh5Dg$2Ks1180MP)V0Yn3c1`rJ( z8bCCFXaLawq5(t$hz1Z1AR0h4fM@{G0HOgz1BeC?4ImmoG=OLT(Ey?WL<5Kh5Dg$2 zKs1180MP)V0Yn3c1`rJ(8bCCFXaLawq5(t$hz1Z1AR0h4fM@{G0HOgz1BeC?4Immo zG=OLT(Ey?WL<5Kh5Dg$2Ks1180MP)V0Yn3c1`rJ(8bCCFXaLawq5(t$hz1Z1AR0h4 zfM@{G0HOgz1BeC?4ImmoG=OLT(Ey?WL<5Kh5Dg$2Ks1180MP)V0Yn3c1`rJ(8bCCF zXaLawq5(t$hz1Z1AR0h4fM@{G0HOgz1BeC?4ImmoG=OLT(Ey?WL<5Kh5Dg$2Ks118 z0MP)V0Yn3c1`rJ(8bCCFXaLawq5(t$hz1Z1AR0h4fM@{G0HOgz1BeC?4ImmoG=OLT z(Ey?WL<5Kh5Dg$2Ks1180MP)V0Yn3c1`rJ(8bCCFXaLawq5(t$hz1Z1AR0h4fM@{G z0HOgz1BeC?4ImmoG=OLT(Ey?WL<5Kh5Dg$2Ks1180MP)V0Yn3c1`rJ(8bCCFXaLaw zq5(t$hz1Z1AR0h4fM@{G0HOgz1BeC?4ImmoG=OLT(Ey?WL<5Kh5Dg$2Ks1180MP)V z0Yn3c1`rJ(8bCCFXaLawq5(t$hz1Z1AR0h4fM@{G0HOgz1BeC?4ImmoG=OLT(Ey?W zL<5Kh5Dg$2Ks1180MP)V0Yn3c1`rJ(8bCCFXaLawq5(t$hz1Z1AR0h4fM@{G0HOgz z1BeC?4ImmoG=OLT(Ey?WL<5Kh5Dg$2Ks1180MP)V0Yn3c1`rJ(8bCCFXaLawq5(t$ zhz1Z1AR0h4fM@{G0HOgz1BeC?4ImmoG=OLT(Ey?WL<5Kh5Dg$2Ks1180MP)V0Yn3c z1`rJ(8bCCFXaLawq5(t$hz1Z1AR0h4fM@{G0HOgz1BeC?4ImmoG=OLT(Ey?WL<5Kh z5Dg$2Ks1180MP)V0Yn3c1`rJ(8bCCFXaLawq5(t$hz1Z1AR0h4fM@{G0HOgz1BeC? z4ImmoG=OLT(Ey?WL<5Kh5Dg$2Ks1180MP)V0Yn3c1`rJ(8bCCFXaLawq5(t$hz1Z1 zAR0h4fM@{G0HOgz1BeC?4ImmoG=OLT(Ey?WL<5Kh5Dg$2Ks1180MP)V0Yn3c1`rJ( z8bCCFXaLawq5(t$hz1Z1AR0h4fM@{G0HOgz1BeC?4ImmoG=OLT(Ey?WL<5Kh5Dg$2 zKs1180MP)V0Yn3c1`rJ(8bCCFXaLawq5(t$hz1Z1AR0h4fM@{G0HOgz1BeC?4Immo zG=OLT(Ey?WL<5Kh5Dg$2Ks1180MP)V0Yn3c1`rJ(8bCCFXaLawq5(t$hz1Z1AR0h4 zfM@{G0HOgz1BeC?4ImmoG=OLT(Ey?WL<5Kh5Dg$2Ks1180MP)V0Yn3c1`rJ(8bCCF zXaLawq5(t$hz1Z1AR0h4fM@{G0HOgz1BeC?4ImmoG=OLT(Ey?WL<5Kh5Dg$2Ks118 z0MP)V0Yn3c1`rJ(8bCCFXaLawq5(t$hz1Z1AR0h4fM@{G0HOgz1BeC?4ImmoG=OLT z(Ey?WL<5Kh5Dg$2Ks1180MP)V0Yn3c1`rJ(8bCCFXaLawq5(t$hz1Z1AR0h4fM@{G z0HOgz1BeC?4Imo8XaJ)Dj0P|oz-R!Y0gMJP8o+1(qXCQtFdD#U0HXnn1~3}HXaJ)D zj0P|oz-R!Y0gMJP8o+1(qXCQtFdD#U0HXnn1~3}HXaJ)Dj0P|oz-R!Y0gMJP8o+1( zqXCQtFdD#U0HXnn1~3}HXaJ)Dj0P|oz-R!Y0gMJP8o+1(qXCQtFdD#U0HXnn1~3}H zXaJ)Dj0P|oz-R!Y0gMJP8o+1(qXCQtFdD#U0HXnn1~3}HXaJ)Dj0P|oz-R!Y0gMJP z8o+1(qXCQtFdD#U0HXnn1~3}HXaJ)Dj0P|oz-R!Y0gMJP8o+1(qXCQtFdD#U0HXnn z1~3}HXaJ)Dj0P|oz-R!Y0gMJP8o+1(qXCQtFdD#U0HXnn1~3}HXaJ)Dj0P|oz-R!Y z0gMJP8o+1(qXCQtFdD#U0HXnn1~3}HXaJ)Dj0P|oz-R!Y0gMJP8o+1(qXCQtFdD#U z0HXnn1~3}HXaJ)Dj0P|oz-R!Y0gMJP8o+1(`ycyh0HXnn1~3}HXaJ)Dj0P|oz-R!Y z0gMJP8o+1(qXCQtFdD#U0HXnn1~3}HXaJ)Dj0P|oz-R!Y0gMJP8o+1(qXCQtu>ZB6 z1~3}HXaJ)Dj0P|oz-R!Y0gMJP8o+1(qXCQtFdD#U0HXnn1~3}HXaJ)Dj0P|oz-R!Y z0gMJP8o+1(qXCQtFdD#U0HXnn1~3}HXaJ)Dj0P|oz-R!Y0gMJP8o+1(qXCQtFdD#U z0HXnn1~3}HXaJ)Dj0P|oz-R!Y0gMJP8o+1(qXCQtFdD#U0HXnn1~3}HXaJ)Dj0P|o zz-R!Y0gMJP8o+1(qXCQtFdD#U0HXnn1~3}HXaJ)Dj0P|oz-R!Y0gMJP8o+1(qXCQt zFdD#U0HXnn1~3}HXaJ)Dj0P|oz-R!Y0gMJP8o+1(qXCQtFdD#U0HXnn1~3}HXaJ)D zj0P|oz-R!Y0gMJP8o+1(qXCQtFdD#U0HXnn1~3}HXaJ)Dj0P|oz-R!Y0gMJP8o+1( zqXCQtFdD#U0HXnn1~3}HXaJ)Dj0P|oz-R!Y0gMJP8o+1(qXCQtFdD#U0HXnn1~3}H zXaJ)Dj0P|oz-R!Y0gMJP8o+1(qXCQtFdD#U0HXnn1~3}HXaJ)Dj0P|oz-R!Y0gMJP z8o+1(qXCQtFdD#U0HXnn1~3}HXaJ)Dj0P|oz-R!Y0gMJP8o+1(qXCQtFdD#U0HXnn z1~3}HXaJ)Dj0P|oz-R!Y0gMJP8o+1(qXCQtFdD#U0HXnn1~3}HXaJ)Dj0P|oz-R!Y z0gMJP8o+1(qXCQtFdD#U0HXnn1~3}HXaJ)Dj0P|oz-R!Y0gMJP8o+1(qXCQtFdD#U z0HXnn1~3}HXaJ)Dj0P|oz-R!Y0gMJP8o+1(qXCQtFdD#U0HXnn1~3}HXaJ)Dj0P|o zz-R!Y0gMJP8o+1(qXCQtFdD#U0HXnn1~3}HXaJ)Dj0P|oz-R!Y0gMJP8o+1(qXCQt zFdD#U0HXnn1~3}HXaJ)Dj0P|oz-R!Y0gMJP8o+1(qXCQtFdD#U0HXnn1~3}HXaJ)D zj0P|oz-R!Y0gMJP8o+1(qXCQtFdD#U0HXnn1~3}HXaJ)Dj0P|oz-R!Y0gMJP8o+1( zqXCQtFdD#U0HXnn1~3}HXaJ)Dj0P|oz-R!Y0gMJP8o+1(qXCQtFdD#U0HXnn1~3}H zXaJ)Dj0P|oz-R!Y0gMJP8o+1(qXCQtFdD#U0HXnn1~3}HXaJ)Dj0P|oz-R!Y0gMJP z8o+1(qXCQtFdD#U0HXnn1~3}HXaJ)Dj0P|oz-R!Y0gMJP8o+1(qXCQtFdD#U0HXnn z1~3}HXaJ)Dj0P|oz-R!Y0gMJP8o+1(qXCQtFdD#U0HXnn1~3}HXaJ)Dj0P|oz-R!Y z0gMJP8o+1(qXCQtFdD#U0HXnn1~3}HXaJ)Dj0P|oz-R!Y0gMJP8o+1(qXCQtFdD#U z0HXnn1~3}HXaJ)Dj0P|oz-R!Y0gMJP8o+1(qXCQtFdD#U0HXnn1~3}HXaJ)Dj0P|o zz-R!Y0gMJP8o+1(qXF!l{WO5l07e5C4PZ2Y(EvsR7!6=FfYAU(0~ifpG=R|nMgtfP zU^IZy07e5C4PZ2Y(EvsR7!6=FfYAU(0~ifpG=R|nMg!P;`)L590gMJP8o+1(qXCQt zFdD#U0HXnn1~3}HXaJ)Dj0P|oz-R!Y0gMJP8o+1(qXCQtFdD#U0HXnn1~3}HXaJ)D zj0P|oz-R!Y0gMJP8o+1(qXCQtFdD#U0HXnn1~3}HXaJ)Dj0P|oz-Rz_u>ZmS2m2rF zrvZ!xFdD#U0DG|i!TtyPAMAgy|H1wT`ycFou>ZmS2m2rFf3W|-{s;RX?0>NT!TtyP zAMAgy|H1wT`ycFou>ZmS2m2rFf3W|-{s;RX?0>NT!TtyPAMAgy|H1wT`ycFou>ZmS z2m2rFf3W|-{s;RX?0>ZX(f&vKAMJm%|Iz+O`ycIpwExlmNBbY`f3*M6{zv;C?SHiY z(f&vKAMJm%|Iz+O`ycIpwExlmNBbY`f3*M6{zv;C?WX~Z1~3}HXaJ)Dj0P|oz-R!Y z0gMK)NBbY`rvZ!xFdD#U0DH9m(f&vKAMJm%|Iz+O`ycIpwExlmNBbY`f3*M6{zv;C z?WX~Z1~3}HXaJ)Dj0P|oz-R!Y0gMJP8o+1(qXCQtFdD#U0HXnn1~3}HXaJ)Dj0P|o zz-R!Y0gMJP8o+1(qXCQtFdD#U0HXnn1~3}HXaJ)Dj0P|oz-R!Y0gMJP8o+1(qXCQt zFdD#U0HXnn1~3}HXaJ)Dj0P|oz-R!Y0gMJP8o+1(qXCQtFdD#U0HXnn1~3}HXaJ)D zj0P|oz-R!Y0gMJP8o+1(qXCQtFdD#U0HXnn1~3}HXaJ)Dj0P|oz-R!Y0gMJP8o+1( zqXCQtFdD#U0HXnn1~3}HXaJ)Dj0P|oz-R!Y0gMJP8o+1(qXCQtFdD#U0HXnn1~3}H zXaJ)Dj0P|oz-R!Y0gMJP8o+1(qXCQtFdD#U0HXnn1~3}HXaJ)Dj0P|oz-R!Y0gMJP z8o+1(qXCQtFdD#U0HXnn1~3}HXaJ)Dj0P|oz-R!Y0gMJP8o+1(qXCQtFdD#U0HXnn z1~3}HXaJ)Dj0P|oz-R!Y0gMJP8o+1(qXCQtFdD#U0HXnn1~3}HXaJ)Dj0P|oz-R!Y z0gMJP8o+1(qXCQtFdD#U0HXnn1~3}HXaJ)Dj0P|oz-R!Y0gMJP8o+1(qXCQtFdD#U z0HXnn1~3}HXaJ)Dj0P|oz-R!Y0gMJP8o+1(qXCQtFdD#U0HXnn1~3}HXaJ)Dj0P|o zz-R!Y0gMJP8o+1(qXCQtFdD#U0HXnn1~3}HXaJ)Dj0P|oz-R!Y0gMJP8o+1(qXCQt zFdD#U0QT<`)L590gMJP8o+1(qXCQtFdD#U0HXnn1~3}HXaJ)Dj0P|o zz-R!Y0gMJP8o+1(qXCQtFdD#U0HXnn1~3}HXaJ)Dj0P|oz-R!Y0gMJP8o+1(qXCQt zFdD#U0HXnn1~3}HXaJ)Dj0P|oz-R!Y0gMJP8o+1(qXCQtFdD#U0HXnn1~3}HXaJ)D zj0P|oz-R!Y0gMJP8o+1(qXCQtFdD#U0HXnn1~3}HXaJ)Dj0P|oz-R!Y0gMJP8o+1( zqXCQtFdD#U0HXnn1~3}HXaJ)Dj0P|oz-R!Y0gMJP8o+1(qXCQtFdD#U0HXnn1~3}H zXaJ)Dj0P|oz-R!Y0gMJP8o+1(qXCQtFdD#U0HXnn1~3}HXaJ)Dj0P|oz-R!Y0gMJP z8o+1(qXCQtFdD#U0HXnn1~3}HXaJ)Dj0P|oz-R!Y0gMJP8o+1(qXCQtFdD#U0HXnn z1~3}HXaJ)Dj0P|oz-R!Y0gMJP8o+1(qXCQtFdD#U0HXnn1~3}HXaJ)Dj0P|oz-R!Y z0gMJP8o+1(qXCQtFdD#U0HXnn1~3}HXaJ)Dj0P|oz-R!Y0gMJP8o+1(qXCQtFdD#U z0HXnn1~3}HXaJ)Dj0P|oz-R!Y0gMJP8o+1(qXCQtFdD#U0HXnn1~3}HXaJ)Dj0P|o zz-R!Y0gMJP8o+1(qXCQtFdD#U0HXnn1~3}HXaJ)Dj0P|oz-R!Y0gMJP8o+1(qXCQt zFdD#U0HXnn1~3}HXaJ)Dj0P|oz-R!Y0gMJP8o+1(qXCQtFdD#U0HXnn1~3}HXaJ)D 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