dromo-uploader-js 2.1.2 → 2.1.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/DromoUploader.js +1 -1
- package/dist/DromoUploader.js.map +1 -1
- package/dist/index.d.ts +9 -0
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/interfaces.d.ts +13 -2
- package/package.json +1 -5
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sources":["../node_modules/tslib/tslib.es6.js","../src/constants.ts","../node_modules/penpal/lib/enums.js","../node_modules/penpal/lib/parent/getOriginFromSrc.js","../node_modules/penpal/lib/errorSerialization.js","../node_modules/penpal/lib/generateId.js","../node_modules/penpal/lib/connectCallSender.js","../node_modules/penpal/lib/parent/handleAckMessageFactory.js","../node_modules/penpal/lib/connectCallReceiver.js","../node_modules/penpal/lib/parent/connectToChild.js","../node_modules/penpal/lib/createLogger.js","../node_modules/penpal/lib/createDestructor.js","../node_modules/penpal/lib/parent/validateIframeHasSrcOrSrcDoc.js","../node_modules/penpal/lib/parent/handleSynMessageFactory.js","../node_modules/penpal/lib/startConnectionTimeout.js","../node_modules/penpal/lib/parent/monitorIframeRemoval.js","../src/executeHooks.ts","../src/index.ts"],"sourcesContent":["/*! *****************************************************************************\r\nCopyright (c) Microsoft Corporation.\r\n\r\nPermission to use, copy, modify, and/or distribute this software for any\r\npurpose with or without fee is hereby granted.\r\n\r\nTHE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH\r\nREGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY\r\nAND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,\r\nINDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM\r\nLOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR\r\nOTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR\r\nPERFORMANCE OF THIS SOFTWARE.\r\n***************************************************************************** */\r\n/* global Reflect, Promise */\r\n\r\nvar extendStatics = function(d, b) {\r\n extendStatics = Object.setPrototypeOf ||\r\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\r\n function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\r\n return extendStatics(d, b);\r\n};\r\n\r\nexport function __extends(d, b) {\r\n extendStatics(d, b);\r\n function __() { this.constructor = d; }\r\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\r\n}\r\n\r\nexport var __assign = function() {\r\n __assign = Object.assign || function __assign(t) {\r\n for (var s, i = 1, n = arguments.length; i < n; i++) {\r\n s = arguments[i];\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];\r\n }\r\n return t;\r\n }\r\n return __assign.apply(this, arguments);\r\n}\r\n\r\nexport function __rest(s, e) {\r\n var t = {};\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\r\n t[p] = s[p];\r\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\r\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\r\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\r\n t[p[i]] = s[p[i]];\r\n }\r\n return t;\r\n}\r\n\r\nexport function __decorate(decorators, target, key, desc) {\r\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\r\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\r\n 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;\r\n return c > 3 && r && Object.defineProperty(target, key, r), r;\r\n}\r\n\r\nexport function __param(paramIndex, decorator) {\r\n return function (target, key) { decorator(target, key, paramIndex); }\r\n}\r\n\r\nexport function __metadata(metadataKey, metadataValue) {\r\n if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(metadataKey, metadataValue);\r\n}\r\n\r\nexport function __awaiter(thisArg, _arguments, P, generator) {\r\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\r\n return new (P || (P = Promise))(function (resolve, reject) {\r\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\r\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\r\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\r\n step((generator = generator.apply(thisArg, _arguments || [])).next());\r\n });\r\n}\r\n\r\nexport function __generator(thisArg, body) {\r\n var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;\r\n return g = { next: verb(0), \"throw\": verb(1), \"return\": verb(2) }, typeof Symbol === \"function\" && (g[Symbol.iterator] = function() { return this; }), g;\r\n function verb(n) { return function (v) { return step([n, v]); }; }\r\n function step(op) {\r\n if (f) throw new TypeError(\"Generator is already executing.\");\r\n while (_) try {\r\n 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;\r\n if (y = 0, t) op = [op[0] & 2, t.value];\r\n switch (op[0]) {\r\n case 0: case 1: t = op; break;\r\n case 4: _.label++; return { value: op[1], done: false };\r\n case 5: _.label++; y = op[1]; op = [0]; continue;\r\n case 7: op = _.ops.pop(); _.trys.pop(); continue;\r\n default:\r\n if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }\r\n if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }\r\n if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }\r\n if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }\r\n if (t[2]) _.ops.pop();\r\n _.trys.pop(); continue;\r\n }\r\n op = body.call(thisArg, _);\r\n } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }\r\n if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };\r\n }\r\n}\r\n\r\nexport function __createBinding(o, m, k, k2) {\r\n if (k2 === undefined) k2 = k;\r\n o[k2] = m[k];\r\n}\r\n\r\nexport function __exportStar(m, exports) {\r\n for (var p in m) if (p !== \"default\" && !exports.hasOwnProperty(p)) exports[p] = m[p];\r\n}\r\n\r\nexport function __values(o) {\r\n var s = typeof Symbol === \"function\" && Symbol.iterator, m = s && o[s], i = 0;\r\n if (m) return m.call(o);\r\n if (o && typeof o.length === \"number\") return {\r\n next: function () {\r\n if (o && i >= o.length) o = void 0;\r\n return { value: o && o[i++], done: !o };\r\n }\r\n };\r\n throw new TypeError(s ? \"Object is not iterable.\" : \"Symbol.iterator is not defined.\");\r\n}\r\n\r\nexport function __read(o, n) {\r\n var m = typeof Symbol === \"function\" && o[Symbol.iterator];\r\n if (!m) return o;\r\n var i = m.call(o), r, ar = [], e;\r\n try {\r\n while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);\r\n }\r\n catch (error) { e = { error: error }; }\r\n finally {\r\n try {\r\n if (r && !r.done && (m = i[\"return\"])) m.call(i);\r\n }\r\n finally { if (e) throw e.error; }\r\n }\r\n return ar;\r\n}\r\n\r\nexport function __spread() {\r\n for (var ar = [], i = 0; i < arguments.length; i++)\r\n ar = ar.concat(__read(arguments[i]));\r\n return ar;\r\n}\r\n\r\nexport function __spreadArrays() {\r\n for (var s = 0, i = 0, il = arguments.length; i < il; i++) s += arguments[i].length;\r\n for (var r = Array(s), k = 0, i = 0; i < il; i++)\r\n for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++)\r\n r[k] = a[j];\r\n return r;\r\n};\r\n\r\nexport function __await(v) {\r\n return this instanceof __await ? (this.v = v, this) : new __await(v);\r\n}\r\n\r\nexport function __asyncGenerator(thisArg, _arguments, generator) {\r\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n var g = generator.apply(thisArg, _arguments || []), i, q = [];\r\n return i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i;\r\n 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); }); }; }\r\n function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(q[0][3], e); } }\r\n function step(r) { r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r); }\r\n function fulfill(value) { resume(\"next\", value); }\r\n function reject(value) { resume(\"throw\", value); }\r\n function settle(f, v) { if (f(v), q.shift(), q.length) resume(q[0][0], q[0][1]); }\r\n}\r\n\r\nexport function __asyncDelegator(o) {\r\n var i, p;\r\n return i = {}, verb(\"next\"), verb(\"throw\", function (e) { throw e; }), verb(\"return\"), i[Symbol.iterator] = function () { return this; }, i;\r\n 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; }\r\n}\r\n\r\nexport function __asyncValues(o) {\r\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n var m = o[Symbol.asyncIterator], i;\r\n 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);\r\n 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); }); }; }\r\n function settle(resolve, reject, d, v) { Promise.resolve(v).then(function(v) { resolve({ value: v, done: d }); }, reject); }\r\n}\r\n\r\nexport function __makeTemplateObject(cooked, raw) {\r\n if (Object.defineProperty) { Object.defineProperty(cooked, \"raw\", { value: raw }); } else { cooked.raw = raw; }\r\n return cooked;\r\n};\r\n\r\nexport function __importStar(mod) {\r\n if (mod && mod.__esModule) return mod;\r\n var result = {};\r\n if (mod != null) for (var k in mod) if (Object.hasOwnProperty.call(mod, k)) result[k] = mod[k];\r\n result.default = mod;\r\n return result;\r\n}\r\n\r\nexport function __importDefault(mod) {\r\n return (mod && mod.__esModule) ? mod : { default: mod };\r\n}\r\n\r\nexport function __classPrivateFieldGet(receiver, privateMap) {\r\n if (!privateMap.has(receiver)) {\r\n throw new TypeError(\"attempted to get private field on non-instance\");\r\n }\r\n return privateMap.get(receiver);\r\n}\r\n\r\nexport function __classPrivateFieldSet(receiver, privateMap, value) {\r\n if (!privateMap.has(receiver)) {\r\n throw new TypeError(\"attempted to set private field on non-instance\");\r\n }\r\n privateMap.set(receiver, value);\r\n return value;\r\n}\r\n","/* eslint-disable no-unused-vars */\ninterface IEnvironmentConstants {\n IFRAME_URL: string;\n}\n\nlet EnvironmentConstants: IEnvironmentConstants;\n// @ts-ignore\nif (ENV_IS_PRODUCTION) {\n EnvironmentConstants = {\n IFRAME_URL: \"https://widget.dromo.io/\",\n };\n} else {\n EnvironmentConstants = {\n IFRAME_URL: \"http://localhost:3000/\",\n };\n}\n\n/** @internal */\nexport const IFRAME_URL = EnvironmentConstants.IFRAME_URL;\n\n/** @internal */\nexport const V1_IFRAME_URL = \"https://widget-v1.dromo.io/\";\n\n/** @internal */\nexport enum EventTypes {\n INIT_IFRAME = \"INIT_IFRAME\",\n}\n","export var MessageType;\n(function (MessageType) {\n MessageType[\"Call\"] = \"call\";\n MessageType[\"Reply\"] = \"reply\";\n MessageType[\"Syn\"] = \"syn\";\n MessageType[\"SynAck\"] = \"synAck\";\n MessageType[\"Ack\"] = \"ack\";\n})(MessageType || (MessageType = {}));\nexport var Resolution;\n(function (Resolution) {\n Resolution[\"Fulfilled\"] = \"fulfilled\";\n Resolution[\"Rejected\"] = \"rejected\";\n})(Resolution || (Resolution = {}));\nexport var ErrorCode;\n(function (ErrorCode) {\n ErrorCode[\"ConnectionDestroyed\"] = \"ConnectionDestroyed\";\n ErrorCode[\"ConnectionTimeout\"] = \"ConnectionTimeout\";\n ErrorCode[\"NotInIframe\"] = \"NotInIframe\";\n ErrorCode[\"NoIframeSrc\"] = \"NoIframeSrc\";\n})(ErrorCode || (ErrorCode = {}));\nexport var NativeErrorName;\n(function (NativeErrorName) {\n NativeErrorName[\"DataCloneError\"] = \"DataCloneError\";\n})(NativeErrorName || (NativeErrorName = {}));\nexport var NativeEventType;\n(function (NativeEventType) {\n NativeEventType[\"Message\"] = \"message\";\n})(NativeEventType || (NativeEventType = {}));\n","const DEFAULT_PORT_BY_PROTOCOL = {\n 'http:': '80',\n 'https:': '443'\n};\nconst URL_REGEX = /^(https?:)?\\/\\/([^/:]+)?(:(\\d+))?/;\nconst opaqueOriginSchemes = ['file:', 'data:'];\n/**\n * Converts a src value into an origin.\n */\nexport default (src) => {\n if (src && opaqueOriginSchemes.find(scheme => src.startsWith(scheme))) {\n // The origin of the child document is an opaque origin and its\n // serialization is \"null\"\n // https://html.spec.whatwg.org/multipage/origin.html#origin\n return 'null';\n }\n // Note that if src is undefined, then srcdoc is being used instead of src\n // and we can follow this same logic below to get the origin of the parent,\n // which is the origin that we will need to use.\n const location = document.location;\n const regexResult = URL_REGEX.exec(src);\n let protocol;\n let hostname;\n let port;\n if (regexResult) {\n // It's an absolute URL. Use the parsed info.\n // regexResult[1] will be undefined if the URL starts with //\n protocol = (regexResult[1] ? regexResult[1] : location.protocol);\n hostname = regexResult[2];\n port = regexResult[4];\n }\n else {\n // It's a relative path. Use the current location's info.\n protocol = location.protocol;\n hostname = location.hostname;\n port = location.port;\n }\n // If the port is the default for the protocol, we don't want to add it to the origin string\n // or it won't match the message's event.origin.\n const portSuffix = port && port !== DEFAULT_PORT_BY_PROTOCOL[protocol] ? `:${port}` : '';\n return `${protocol}//${hostname}${portSuffix}`;\n};\n","/**\n * Converts an error object into a plain object.\n */\nexport const serializeError = ({ name, message, stack }) => ({\n name,\n message,\n stack\n});\n/**\n * Converts a plain object into an error object.\n */\nexport const deserializeError = (obj) => {\n const deserializedError = new Error();\n // @ts-ignore\n Object.keys(obj).forEach(key => (deserializedError[key] = obj[key]));\n return deserializedError;\n};\n","let id = 0;\n/**\n * @return {number} A unique ID (not universally unique)\n */\nexport default () => ++id;\n","import generateId from './generateId';\nimport { deserializeError } from './errorSerialization';\nimport { ErrorCode, MessageType, NativeEventType, Resolution } from './enums';\n/**\n * Augments an object with methods that match those defined by the remote. When these methods are\n * called, a \"call\" message will be sent to the remote, the remote's corresponding method will be\n * executed, and the method's return value will be returned via a message.\n * @param {Object} callSender Sender object that should be augmented with methods.\n * @param {Object} info Information about the local and remote windows.\n * @param {Array} methodNames Names of methods available to be called on the remote.\n * @param {Promise} destructionPromise A promise resolved when destroy() is called on the penpal\n * connection.\n * @returns {Object} The call sender object with methods that may be called.\n */\nexport default (callSender, info, methodNames, destroyConnection, log) => {\n const { localName, local, remote, originForSending, originForReceiving } = info;\n let destroyed = false;\n log(`${localName}: Connecting call sender`);\n const createMethodProxy = (methodName) => {\n return (...args) => {\n log(`${localName}: Sending ${methodName}() call`);\n // This handles the case where the iframe has been removed from the DOM\n // (and therefore its window closed), the consumer has not yet\n // called destroy(), and the user calls a method exposed by\n // the remote. We detect the iframe has been removed and force\n // a destroy() immediately so that the consumer sees the error saying\n // the connection has been destroyed. We wrap this check in a try catch\n // because Edge throws an \"Object expected\" error when accessing\n // contentWindow.closed on a contentWindow from an iframe that's been\n // removed from the DOM.\n let iframeRemoved;\n try {\n if (remote.closed) {\n iframeRemoved = true;\n }\n }\n catch (e) {\n iframeRemoved = true;\n }\n if (iframeRemoved) {\n destroyConnection();\n }\n if (destroyed) {\n const error = new Error(`Unable to send ${methodName}() call due ` + `to destroyed connection`);\n error.code = ErrorCode.ConnectionDestroyed;\n throw error;\n }\n return new Promise((resolve, reject) => {\n const id = generateId();\n const handleMessageEvent = (event) => {\n if (event.source !== remote ||\n event.data.penpal !== MessageType.Reply ||\n event.data.id !== id) {\n return;\n }\n if (event.origin !== originForReceiving) {\n log(`${localName} received message from origin ${event.origin} which did not match expected origin ${originForReceiving}`);\n return;\n }\n const replyMessage = event.data;\n log(`${localName}: Received ${methodName}() reply`);\n local.removeEventListener(NativeEventType.Message, handleMessageEvent);\n let returnValue = replyMessage.returnValue;\n if (replyMessage.returnValueIsError) {\n returnValue = deserializeError(returnValue);\n }\n (replyMessage.resolution === Resolution.Fulfilled ? resolve : reject)(returnValue);\n };\n local.addEventListener(NativeEventType.Message, handleMessageEvent);\n const callMessage = {\n penpal: MessageType.Call,\n id,\n methodName,\n args\n };\n remote.postMessage(callMessage, originForSending);\n });\n };\n };\n methodNames.reduce((api, methodName) => {\n api[methodName] = createMethodProxy(methodName);\n return api;\n }, callSender);\n return () => {\n destroyed = true;\n };\n};\n","import connectCallReceiver from '../connectCallReceiver';\nimport connectCallSender from '../connectCallSender';\n/**\n * Handles an ACK handshake message.\n */\nexport default (methods, childOrigin, originForSending, destructor, log) => {\n const { destroy, onDestroy } = destructor;\n let destroyCallReceiver;\n let receiverMethodNames;\n // We resolve the promise with the call sender. If the child reconnects\n // (for example, after refreshing or navigating to another page that\n // uses Penpal, we'll update the call sender with methods that match the\n // latest provided by the child.\n const callSender = {};\n return (event) => {\n if (event.origin !== childOrigin) {\n log(`Parent: Handshake - Received ACK message from origin ${event.origin} which did not match expected origin ${childOrigin}`);\n return;\n }\n log('Parent: Handshake - Received ACK');\n const info = {\n localName: 'Parent',\n local: window,\n remote: event.source,\n originForSending: originForSending,\n originForReceiving: childOrigin\n };\n // If the child reconnected, we need to destroy the prior call receiver\n // before setting up a new one.\n if (destroyCallReceiver) {\n destroyCallReceiver();\n }\n destroyCallReceiver = connectCallReceiver(info, methods, log);\n onDestroy(destroyCallReceiver);\n // If the child reconnected, we need to remove the methods from the\n // previous call receiver off the sender.\n if (receiverMethodNames) {\n receiverMethodNames.forEach(receiverMethodName => {\n delete callSender[receiverMethodName];\n });\n }\n receiverMethodNames = event.data.methodNames;\n const destroyCallSender = connectCallSender(callSender, info, receiverMethodNames, destroy, log);\n onDestroy(destroyCallSender);\n return callSender;\n };\n};\n","import { serializeError } from './errorSerialization';\nimport { MessageType, NativeEventType, NativeErrorName, Resolution } from './enums';\n/**\n * Listens for \"call\" messages coming from the remote, executes the corresponding method, and\n * responds with the return value.\n */\nexport default (info, methods, log) => {\n const { localName, local, remote, originForSending, originForReceiving } = info;\n let destroyed = false;\n const handleMessageEvent = (event) => {\n if (event.source !== remote || event.data.penpal !== MessageType.Call) {\n return;\n }\n if (event.origin !== originForReceiving) {\n log(`${localName} received message from origin ${event.origin} which did not match expected origin ${originForReceiving}`);\n return;\n }\n const callMessage = event.data;\n const { methodName, args, id } = callMessage;\n log(`${localName}: Received ${methodName}() call`);\n const createPromiseHandler = (resolution) => {\n return (returnValue) => {\n log(`${localName}: Sending ${methodName}() reply`);\n if (destroyed) {\n // It's possible to throw an error here, but it would need to be thrown asynchronously\n // and would only be catchable using window.onerror. This is because the consumer\n // is merely returning a value from their method and not calling any function\n // that they could wrap in a try-catch. Even if the consumer were to catch the error,\n // the value of doing so is questionable. Instead, we'll just log a message.\n log(`${localName}: Unable to send ${methodName}() reply due to destroyed connection`);\n return;\n }\n const message = {\n penpal: MessageType.Reply,\n id,\n resolution,\n returnValue\n };\n if (resolution === Resolution.Rejected &&\n returnValue instanceof Error) {\n message.returnValue = serializeError(returnValue);\n message.returnValueIsError = true;\n }\n try {\n remote.postMessage(message, originForSending);\n }\n catch (err) {\n // If a consumer attempts to send an object that's not cloneable (e.g., window),\n // we want to ensure the receiver's promise gets rejected.\n if (err.name === NativeErrorName.DataCloneError) {\n const errorReplyMessage = {\n penpal: MessageType.Reply,\n id,\n resolution: Resolution.Rejected,\n returnValue: serializeError(err),\n returnValueIsError: true\n };\n remote.postMessage(errorReplyMessage, originForSending);\n }\n throw err;\n }\n };\n };\n new Promise(resolve => resolve(methods[methodName].apply(methods, args))).then(createPromiseHandler(Resolution.Fulfilled), createPromiseHandler(Resolution.Rejected));\n };\n local.addEventListener(NativeEventType.Message, handleMessageEvent);\n return () => {\n destroyed = true;\n local.removeEventListener(NativeEventType.Message, handleMessageEvent);\n };\n};\n","import { ErrorCode, MessageType, NativeEventType } from '../enums';\nimport createDestructor from '../createDestructor';\nimport createLogger from '../createLogger';\nimport getOriginFromSrc from './getOriginFromSrc';\nimport handleAckMessageFactory from './handleAckMessageFactory';\nimport handleSynMessageFactory from './handleSynMessageFactory';\nimport monitorIframeRemoval from './monitorIframeRemoval';\nimport startConnectionTimeout from '../startConnectionTimeout';\nimport validateIframeHasSrcOrSrcDoc from './validateIframeHasSrcOrSrcDoc';\n/**\n * Attempts to establish communication with an iframe.\n */\nexport default (options) => {\n let { iframe, methods = {}, childOrigin, timeout, debug = false } = options;\n const log = createLogger(debug);\n const destructor = createDestructor();\n const { onDestroy, destroy } = destructor;\n if (!childOrigin) {\n validateIframeHasSrcOrSrcDoc(iframe);\n childOrigin = getOriginFromSrc(iframe.src);\n }\n // If event.origin is \"null\", the remote protocol is file: or data: and we\n // must post messages with \"*\" as targetOrigin when sending messages.\n // https://developer.mozilla.org/en-US/docs/Web/API/Window/postMessage#Using_window.postMessage_in_extensions\n const originForSending = childOrigin === 'null' ? '*' : childOrigin;\n const handleSynMessage = handleSynMessageFactory(log, methods, childOrigin, originForSending);\n const handleAckMessage = handleAckMessageFactory(methods, childOrigin, originForSending, destructor, log);\n const promise = new Promise((resolve, reject) => {\n const stopConnectionTimeout = startConnectionTimeout(timeout, destroy);\n const handleMessage = (event) => {\n if (event.source !== iframe.contentWindow || !event.data) {\n return;\n }\n if (event.data.penpal === MessageType.Syn) {\n handleSynMessage(event);\n return;\n }\n if (event.data.penpal === MessageType.Ack) {\n const callSender = handleAckMessage(event);\n if (callSender) {\n stopConnectionTimeout();\n resolve(callSender);\n }\n return;\n }\n };\n window.addEventListener(NativeEventType.Message, handleMessage);\n log('Parent: Awaiting handshake');\n monitorIframeRemoval(iframe, destructor);\n onDestroy((error) => {\n window.removeEventListener(NativeEventType.Message, handleMessage);\n if (!error) {\n error = new Error('Connection destroyed');\n error.code = ErrorCode.ConnectionDestroyed;\n }\n reject(error);\n });\n });\n return {\n promise,\n destroy() {\n // Don't allow consumer to pass an error into destroy.\n destroy();\n }\n };\n};\n","export default (debug) => {\n /**\n * Logs a message if debug is enabled.\n */\n return (...args) => {\n if (debug) {\n console.log('[Penpal]', ...args); // eslint-disable-line no-console\n }\n };\n};\n","export default () => {\n const callbacks = [];\n let destroyed = false;\n return {\n destroy(error) {\n destroyed = true;\n callbacks.forEach(callback => {\n callback(error);\n });\n },\n onDestroy(callback) {\n destroyed ? callback() : callbacks.push(callback);\n }\n };\n};\n","import { ErrorCode } from '../enums';\nexport default (iframe) => {\n if (!iframe.src && !iframe.srcdoc) {\n const error = new Error('Iframe must have src or srcdoc property defined.');\n error.code = ErrorCode.NoIframeSrc;\n throw error;\n }\n};\n","import { MessageType } from '../enums';\n/**\n * Handles a SYN handshake message.\n */\nexport default (log, methods, childOrigin, originForSending) => {\n return (event) => {\n if (event.origin !== childOrigin) {\n log(`Parent: Handshake - Received SYN message from origin ${event.origin} which did not match expected origin ${childOrigin}`);\n return;\n }\n log('Parent: Handshake - Received SYN, responding with SYN-ACK');\n const synAckMessage = {\n penpal: MessageType.SynAck,\n methodNames: Object.keys(methods)\n };\n event.source.postMessage(synAckMessage, originForSending);\n };\n};\n","import { ErrorCode } from './enums';\n/**\n * Starts a timeout and calls the callback with an error\n * if the timeout completes before the stop function is called.\n */\nexport default (timeout, callback) => {\n let timeoutId;\n if (timeout !== undefined) {\n timeoutId = window.setTimeout(() => {\n const error = new Error(`Connection timed out after ${timeout}ms`);\n error.code = ErrorCode.ConnectionTimeout;\n callback(error);\n }, timeout);\n }\n return () => {\n clearTimeout(timeoutId);\n };\n};\n","const CHECK_IFRAME_IN_DOC_INTERVAL = 60000;\n/**\n * Monitors for iframe removal and destroys connection if iframe\n * is found to have been removed from DOM. This is to prevent memory\n * leaks when the iframe is removed from the document and the consumer\n * hasn't called destroy(). Without this, event listeners attached to\n * the window would stick around and since the event handlers have a\n * reference to the iframe in their closures, the iframe would stick\n * around too.\n */\nexport default (iframe, destructor) => {\n const { destroy, onDestroy } = destructor;\n const checkIframeInDocIntervalId = setInterval(() => {\n if (!iframe.isConnected) {\n clearInterval(checkIframeInDocIntervalId);\n destroy();\n }\n }, CHECK_IFRAME_IN_DOC_INTERVAL);\n onDestroy(() => {\n clearInterval(checkIframeInDocIntervalId);\n });\n};\n","import {\n EStepHook,\n IBeforeFinishCallback,\n IBeforeFinishOutput,\n IBulkRowHook,\n IColumnHook,\n IColumnHookInput,\n IColumnHookOutput,\n IPublicConnectionMethods,\n IResultMetadataWithValues,\n IReviewStepData,\n IReviewStepPostHooksData,\n IRow,\n IRowCell,\n IRowCellBasic,\n IRowDeleteHook,\n IRowHook,\n IRowHookCellBasic,\n IRowHookInput,\n IRowHookOutput,\n IRowHookOutputInternal,\n IStepHook,\n ITableMessage,\n IUploadStepData,\n} from \"./interfaces\";\n\nexport type HookErrorHandlerFn = (err: unknown, hookType: string) => void;\nconst MAX_HOOK_TIME_MS = 10000;\n\nexport const consoleErrorHandler: HookErrorHandlerFn = (\n err: unknown,\n hookType: string\n) =>\n console.error(\n `[Dromo-External-Error] There was an error running your ${hookType}.`,\n err\n );\n\nconst setHookTimer = (hookType: string) => {\n return setTimeout(() => {\n // eslint-disable-next-line no-console\n console.warn(\n `[Dromo Error] Slow ${hookType} detected (>10s). Long running hooks can degrade user experience and importer performance.`\n );\n }, MAX_HOOK_TIME_MS);\n};\n\nconst clearHookTimer = (timeoutId: NodeJS.Timeout) => {\n clearTimeout(timeoutId);\n};\n\nexport const executeColumnHooks = async (\n hooks: IColumnHook[],\n data: IColumnHookInput[],\n errorHandler: HookErrorHandlerFn\n): Promise<IColumnHookOutput[]> => {\n const changes = new Map<\n number,\n { newValue?: string; info?: ITableMessage[] }\n >();\n // Each hook call updates this tmpData object with the latest values.\n // This allows us to run hooks sequentially with each subsequent call\n // having the most up to date data\n const tmpData: IColumnHookInput[] = data.map((d) => ({ ...d }));\n\n // For each registered hook, call the developer defined callback\n await hooks.reduce(async (previousHookPromise, currentHook) => {\n await previousHookPromise.then(async () => {\n try {\n const timerId = setHookTimer(\"column hook\");\n const hookResponse = await currentHook.callback(tmpData);\n clearHookTimer(timerId);\n hookResponse.forEach((hookOutput: IColumnHookOutput) => {\n // If the user has updated the value or info for a particular\n // index update the changes map, and the tmpData\n if (hookOutput.value !== undefined || hookOutput.info !== undefined) {\n const change: {\n value?: string;\n info?: ITableMessage[];\n } = {};\n if (hookOutput.value !== undefined) {\n change.value = hookOutput.value;\n tmpData[hookOutput.index].value = hookOutput.value;\n }\n if (hookOutput.info !== undefined) change.info = hookOutput.info;\n changes.set(hookOutput.index, change);\n }\n });\n } catch (err) {\n errorHandler(err, \"column hooks\");\n }\n });\n }, Promise.resolve());\n\n // Change the map into IColumnHookOuput for the application to process\n const columnHookOutput: IColumnHookOutput[] = [];\n changes.forEach((change, index) =>\n columnHookOutput.push({ ...change, index })\n );\n return columnHookOutput;\n};\n\nconst fieldOutputEmpty = (fieldOutput: IRowCell): boolean =>\n fieldOutput.value === undefined &&\n fieldOutput.info === undefined &&\n fieldOutput.selectOptions === undefined &&\n fieldOutput.manyToOne === undefined;\n\nexport const executeRowHooks = async (\n data: IRowHookInput[],\n mode: \"init\" | \"update\",\n rowHooks: IRowHook[],\n bulkRowHooks: IBulkRowHook[],\n errorHandler: HookErrorHandlerFn\n): Promise<IRowHookOutputInternal[]> => {\n // Changes is the final changes that will be sent to the frontend\n const changes = new Map<number, IRow>();\n const inputRowMap = new Map(\n data.map((inputRow) => [inputRow.index, inputRow])\n );\n\n // a helper function called for each row that updates the final changes\n // as well as the row data which will be passed to subsequent hooks\n const mutateInputDataWithChanges = (\n rowIndex: number,\n rowOutput: IRowHookOutput[\"row\"]\n ) => {\n const inputRow = inputRowMap.get(rowIndex)!;\n\n for (const [fieldName, fieldOutput] of Object.entries(rowOutput ?? {})) {\n if (fieldOutputEmpty(fieldOutput as IRowCell)) continue;\n\n const inputRowField = inputRow.row[fieldName];\n const inputFieldIsManyToOne = Array.isArray(inputRowField.manyToOne);\n const outputFieldIsManyToOne =\n \"manyToOne\" in fieldOutput && Array.isArray(fieldOutput.manyToOne);\n\n if (inputFieldIsManyToOne && !outputFieldIsManyToOne) {\n throw new Error(\n `${fieldName} should have manyToOne defined as an array.`\n );\n } else if (\n inputFieldIsManyToOne &&\n outputFieldIsManyToOne &&\n inputRowField.manyToOne!.length !== fieldOutput.manyToOne.length\n ) {\n throw new Error(\n `${fieldName} should be array of length ${\n inputRowField.manyToOne!.length\n }`\n );\n }\n\n const rowChanges = changes.get(rowIndex) || {};\n const cellChange: IRowCell = rowChanges[fieldName] ?? {};\n\n const fieldChanges: {\n fieldOutput: IRowCellBasic;\n rowDataField: IRowHookCellBasic;\n cellChange: IRowCellBasic;\n }[] = [];\n\n if (outputFieldIsManyToOne) {\n cellChange.manyToOne = [];\n\n fieldOutput.manyToOne.forEach((fieldOutputCell, index) => {\n if (!fieldOutputEmpty(fieldOutputCell as IRowCell)) {\n const manyToOneCellChange: IRowCellBasic = {};\n cellChange.manyToOne!.push(manyToOneCellChange);\n fieldChanges.push({\n fieldOutput: fieldOutputCell,\n rowDataField: inputRowField.manyToOne![index],\n cellChange: manyToOneCellChange,\n });\n }\n });\n } else {\n fieldChanges.push({\n fieldOutput: fieldOutput as IRowCellBasic,\n rowDataField: inputRowField,\n cellChange,\n });\n }\n // if there are any changes, we want to both update the changes\n // object sent to the app, and the rowInput sent to subsequent\n // row hooks running on this row so they see the changes from\n // prior row hooks\n fieldChanges.forEach(\n ({ fieldOutput, rowDataField: inputRowDataField, cellChange }) => {\n if (fieldOutput.value !== undefined) {\n cellChange.value = fieldOutput.value;\n inputRowDataField.value = fieldOutput.value;\n }\n\n if (fieldOutput.info !== undefined) {\n cellChange.info = fieldOutput.info;\n inputRowDataField.info = fieldOutput.info;\n }\n\n if (fieldOutput.selectOptions !== undefined) {\n cellChange.selectOptions = fieldOutput.selectOptions;\n inputRowDataField.selectOptions = fieldOutput.selectOptions;\n }\n }\n );\n rowChanges[fieldName] = cellChange;\n changes.set(rowIndex, rowChanges);\n }\n };\n // First we run the bulk row hooks with all of the input data\n for (const bulkRowHook of bulkRowHooks) {\n try {\n const timerId = setHookTimer(\"bulk row hook\");\n const hookOutput = await bulkRowHook(data, mode);\n clearHookTimer(timerId);\n for (const rowOutput of hookOutput) {\n mutateInputDataWithChanges(rowOutput.index, rowOutput.row);\n }\n } catch (err) {\n errorHandler(err, \"bulk row hooks\");\n }\n }\n\n // We want to loop through each row independently. Because each\n // row's execution is independent, we can do row by row first vs\n // hook by hook\n await Promise.all(\n data.map(async (rowInput) => {\n for (const rowHook of rowHooks) {\n try {\n const timerId = setHookTimer(\"row hook\");\n const hookOutput = await rowHook(rowInput, mode);\n clearHookTimer(timerId);\n mutateInputDataWithChanges(rowInput.index, hookOutput.row);\n } catch (err) {\n errorHandler(err, \"row hooks\");\n }\n }\n })\n );\n\n const finalChanges: IRowHookOutputInternal[] = [];\n\n changes.forEach((rowChanges, rowIndex) => {\n finalChanges.push({ index: rowIndex, row: rowChanges });\n });\n return finalChanges;\n};\n\nexport const executeRowDeleteHooks = async (\n deletedRows: IRowHookInput[],\n rowDeleteHooks: IRowDeleteHook[],\n errorHandler: HookErrorHandlerFn\n): Promise<void[]> => {\n // We want to loop through each row independently. Because each\n // row's execution is independent, we can do row by row first vs\n // hook by hook\n return Promise.all(\n deletedRows.map(async (rowData) => {\n rowDeleteHooks.forEach(async (currentHook) => {\n try {\n const timerId = setHookTimer(\"row delete hook\");\n await currentHook(rowData);\n clearHookTimer(timerId);\n } catch (err) {\n errorHandler(err, \"row delete hooks\");\n }\n });\n })\n );\n};\n\nexport const executeStepHooks = async (\n step: EStepHook,\n data: IUploadStepData | IReviewStepData | IReviewStepPostHooksData,\n stepHooks: IStepHook[],\n instance: IPublicConnectionMethods,\n errorHandler: HookErrorHandlerFn\n) => {\n await Promise.all(\n stepHooks.map(async (hook) => {\n if (step !== hook.type) return Promise.resolve();\n\n try {\n return await hook.callback(instance, data);\n } catch (err) {\n errorHandler(err, `step hook ${step}`);\n return Promise.resolve();\n }\n })\n );\n};\n\nexport const executeBeforeFinishCallback = async (\n data: Record<string, unknown>[],\n metadata: IResultMetadataWithValues,\n beforeFinishCallback: IBeforeFinishCallback,\n instance: IPublicConnectionMethods,\n errorHandler: HookErrorHandlerFn\n): Promise<IBeforeFinishOutput> => {\n try {\n return await beforeFinishCallback(data, metadata, instance);\n } catch (err) {\n errorHandler(err, \"before finish callback\");\n }\n};\n","import { IFRAME_URL, V1_IFRAME_URL } from \"./constants\";\nimport { connectToChild } from \"penpal\";\nimport { Connection } from \"penpal/lib/types\";\n\nimport {\n ITableMessage,\n IMessagesForCell,\n IColumnHook,\n IColumnHookInput,\n IColumnHookOutput,\n IRowHook,\n IRowHookInput,\n IRowHookOutput,\n IDeveloperField,\n IDeveloperSettings,\n IDeveloperStyleOverrides,\n IUser,\n IValidatorField,\n IRowHookOutputInternal,\n IResultMetadata,\n EStepHook,\n IReviewStepData,\n IStepHook,\n IUploadStepData,\n IRowDeleteHook,\n IBulkRowHook,\n IBeforeFinishCallback,\n IBeforeFinishOutput,\n IPositionSpec,\n IConnectionMethods,\n ISelectField,\n IImporterOptions,\n IAllHooks,\n IRowToAdd,\n IResultMetadataWithValues,\n} from \"./interfaces\";\nimport {\n consoleErrorHandler,\n executeBeforeFinishCallback,\n executeColumnHooks,\n executeRowDeleteHooks,\n executeRowHooks,\n executeStepHooks,\n} from \"./executeHooks\";\n\nconst DROMO_WRAPPER_SUFFIX = \"dromo-container\";\nconst IFRAME_SUFFIX = \"dromo-iframe-element\";\n\ndeclare global {\n interface Window {\n DROMO_WIDGET_OVERRIDE?: string;\n }\n}\n\nconst makeFieldSerializable = (field: IDeveloperField) => {\n const newField = { ...field };\n if (newField.validators) {\n newField.validators = newField.validators.map((validator) => {\n if (\n (validator.validate === \"regex_match\" ||\n validator.validate === \"regex_exclude\") &&\n validator.regex instanceof RegExp\n ) {\n return {\n ...validator,\n regex: validator.regex.source,\n regexOptions: {\n ignoreCase: validator.regex.flags.includes(\"i\"),\n dotAll: validator.regex.flags.includes(\"s\"),\n multiline: validator.regex.flags.includes(\"m\"),\n unicode: validator.regex.flags.includes(\"u\"),\n },\n };\n }\n return validator;\n });\n }\n return newField;\n};\n\nexport default class DromoUploader {\n // Unique IDs for iframe and container\n /** @internal */\n iframeId: string;\n /** @internal */\n wrapperId: string;\n /** @internal */\n embedInline: boolean = false;\n\n // Refers to unique backend license key\n /** @internal */\n licenseKey: string;\n // See DeveloperFieldsSchema\n /** @internal */\n fields: IDeveloperField[] | undefined;\n // See DeveloperSettingsSchema\n /** @internal */\n settings: IDeveloperSettings | undefined;\n // See UserSchema\n /** @internal */\n user: IUser | undefined;\n // If the user is using a saved schema, its ID\n // (Could also be a schema name for backwards compatibility)\n /** @internal */\n schemaId: string | undefined;\n // DevelopmentMode\n /** @internal */\n developmentMode: boolean | undefined;\n // Header Row Override\n /** @internal */\n headerRowOverride: number | null | undefined;\n\n // HTML references\n /** @internal */\n iframe: HTMLIFrameElement | undefined;\n /** @internal */\n wrapper: HTMLElement | undefined;\n\n // Penpal connection reference\n /** @internal */\n connection: Connection<IConnectionMethods> | undefined;\n\n // Data Hooks\n /** @internal */\n columnHooks: IColumnHook[] = [];\n /** @internal */\n bulkRowHooks: IBulkRowHook[] = [];\n /** @internal */\n rowHooks: { callback: IRowHook }[] = [];\n /** @internal */\n stepHooks: IStepHook[] = [];\n /** @internal */\n rowDeleteHooks: IRowDeleteHook[] = [];\n\n // Callbacks\n /** @internal */\n beforeFinishCallback: IBeforeFinishCallback | undefined;\n /** @internal */\n resultsCallback:\n | ((data: any, metadata: IResultMetadata) => Promise<void> | void)\n | undefined;\n\n /** @internal */\n cancelCallback: (() => void) | undefined;\n\n /** @internal */\n appHost: string;\n\n constructor(\n licenseKey: string,\n fields: IDeveloperField[],\n settings: IDeveloperSettings,\n user: IUser\n );\n\n constructor(licenseKey: string, schemaId: string);\n\n constructor(\n licenseKey: string,\n fieldsOrSchemaId: IDeveloperField[] | string,\n settings?: IDeveloperSettings,\n user?: IUser\n ) {\n this.iframeId =\n Math.random().toString(36).substring(7) + \"-\" + IFRAME_SUFFIX;\n this.wrapperId =\n Math.random().toString(36).substring(7) + \"-\" + DROMO_WRAPPER_SUFFIX;\n this.appHost = document.location.hostname;\n\n if (settings !== undefined && user !== undefined) {\n this.licenseKey = licenseKey;\n this.fields = (fieldsOrSchemaId as IDeveloperField[]).map(\n makeFieldSerializable\n );\n this.settings = settings;\n this.user = user;\n\n this.checkCloneable({\n licenseKey: this.licenseKey,\n fields: this.fields,\n settings: this.settings,\n user: this.user,\n });\n } else {\n this.licenseKey = licenseKey;\n this.schemaId = fieldsOrSchemaId as string;\n\n this.checkCloneable({\n licenseKey: this.licenseKey,\n schemaId: this.schemaId,\n });\n }\n }\n\n initChild = async () => {\n if (!this.connection) {\n console.error(\"shim cannot connect with Dromo service.\");\n alert(\n \"There was en error opening the importer. Please contact support if this issue persists.\"\n );\n return;\n }\n\n const child = await this.connection.promise;\n\n // We check to see if this was loaded from either an SDK or snippet that didn't specify a version\n // If it was, this is a legacy snippet/sdk and we should NOT show the redesigned UI\n const loadedFromUnVersionedScript = Array.from(\n document.getElementsByTagName(\"script\")\n ).some(\n (s) =>\n s.src === \"https://unpkg.com/dromo-uploader-js/dist/DromoUploader.js\" ||\n s.src ===\n \"https://cdn.jsdelivr.net/npm/dromo-uploader-js@latest/dist/DromoUploader.js\"\n );\n\n // We need to register the hooks with the widget before we init, because\n // init might go directly to the review screen and we need to make sure\n // the hooks are already registered at that point\n await child.setNumRegisteredRowHooks(this.totalNumRowHooks());\n await child.setNumRegisteredColHooks(this.columnHooks.length);\n await child.setNumRegisteredRowDeleteHooks(this.rowDeleteHooks.length);\n await child.setEmbedInline(this.embedInline);\n\n if (this.fields && this.settings && this.user) {\n const settings = { ...this.settings };\n if (!loadedFromUnVersionedScript) {\n settings.version = settings.version ?? \"v2\";\n }\n settings.browserExcelParsing = settings.browserExcelParsing ?? true;\n\n await child.init(\n this.licenseKey,\n this.fields,\n settings,\n this.user,\n this.appHost\n );\n } else if (this.schemaId) {\n await child.initFromSavedSchema(\n this.licenseKey,\n this.schemaId,\n this.appHost,\n {\n user: this.user,\n developmentMode: this.developmentMode,\n headerRowOverride: this.headerRowOverride,\n }\n );\n } else {\n console.error(\"Invalid Dromo configuration\");\n }\n };\n\n /**\n * Creates the iframe object\n * @internal\n */\n initIFrame = () => {\n let widgetUrl: string;\n\n if (window.DROMO_WIDGET_OVERRIDE) {\n widgetUrl = window.DROMO_WIDGET_OVERRIDE;\n } else if (this.settings?.alternateDomain) {\n const url = new URL(this.settings.alternateDomain);\n widgetUrl = url.protocol + \"//widget.\" + url.host;\n } else if (this.settings?.version === \"v1\") {\n widgetUrl = V1_IFRAME_URL;\n } else {\n widgetUrl = IFRAME_URL;\n }\n\n if (!document.getElementById(this.iframeId)) {\n const iframe = document.createElement(\"iframe\");\n const identifier = this.settings?.importIdentifier ?? this.schemaId;\n iframe.title = identifier\n ? `Dromo Importer: ${identifier}`\n : \"Dromo Importer\";\n iframe.src = widgetUrl;\n iframe.id = this.iframeId;\n iframe.style.height = \"100%\";\n iframe.style.width = \"100%\";\n iframe.style.border = \"0\";\n // @ts-ignore\n iframe.crossorigin = \"anonymous\";\n this.iframe = iframe;\n }\n };\n\n /**\n * Uses Penpal to create a connection with the iframe that was created\n * @internal\n */\n createConnection = () => {\n // eslint-disable-next-line @typescript-eslint/no-this-alias\n const self = this;\n const iframe = this.iframe;\n\n if (!iframe) {\n console.error(\"shim cannot connect to Dromo.\");\n return;\n }\n this.connection = connectToChild<IConnectionMethods>({\n iframe,\n methods: {\n /**\n * Called for each column/field. Sends all data and expects all the\n * relevant column hooks to be evaluated.\n *\n * @param fieldName the fieldname key for the column\n * @param data the full column of data for the particular key\n */\n async handleColumnHooks(\n fieldName: string,\n data: IColumnHookInput[]\n ): Promise<IColumnHookOutput[]> {\n const hooks = self.columnHooks.filter(\n (h) => h.fieldName === fieldName\n );\n return await executeColumnHooks(hooks, data, consoleErrorHandler);\n },\n\n /**\n * Called singularly for each row. Goes through all row hooks and\n * evaluates them.\n *\n * @param data an array of row data objects\n */\n async handleRowHooks(\n data: IRowHookInput[],\n mode: \"init\" | \"update\"\n ): Promise<IRowHookOutputInternal[]> {\n return await executeRowHooks(\n data,\n mode,\n self.rowHooks.map((rh) => rh.callback),\n self.bulkRowHooks,\n consoleErrorHandler\n );\n },\n async handleStepHook(\n step: EStepHook,\n data: IUploadStepData | IReviewStepData\n ) {\n return await executeStepHooks(\n step,\n data,\n self.stepHooks,\n self,\n consoleErrorHandler\n );\n },\n /**\n * Called singularly for each row. Goes through all delete hooks and\n * evaluates them.\n *\n * @param deletedRows - an array of rows deleted from the data\n */\n async handleRowDeleteHooks(\n deletedRows: IRowHookInput[]\n ): Promise<void> {\n // We want to loop through each row independently. Because each\n // row's execution is independent, we can do row by row first vs\n // hook by hook\n await executeRowDeleteHooks(\n deletedRows,\n self.rowDeleteHooks,\n consoleErrorHandler\n );\n },\n async handleBeforeFinishCallback(\n data: Record<string, any>[],\n metadata: IResultMetadataWithValues\n ): Promise<IBeforeFinishOutput> {\n if (self.beforeFinishCallback) {\n return await executeBeforeFinishCallback(\n data,\n metadata,\n self.beforeFinishCallback,\n self,\n consoleErrorHandler\n );\n }\n },\n /**\n * Called after the user has completed the Dromo flow, send the\n * cleaned data to the developer\n *\n * TODO: data cannot be of type any. We need to standardize our return\n * type to be Map<string, any>[]\n * @param data cleaned data after the flow is complete\n */\n async handleResults(\n data: any,\n metadata: IResultMetadata\n ): Promise<void> {\n if (self.resultsCallback) {\n try {\n await self.resultsCallback(data, metadata);\n } catch (err) {\n console.error(\n \"[Dromo-External-Error] There was an error in your onResult callback.\",\n err\n );\n }\n }\n self.close();\n },\n /**\n * Called when the modal has been closed by the finishing of the flow\n */\n handleCloseModal() {\n self.close();\n },\n /**\n * Called when the modal has been closed due to the user canceling the\n * flow\n */\n handleCancel() {\n if (self.cancelCallback) {\n try {\n self.cancelCallback();\n } catch (err) {\n console.error(\n \"[Dromo-External-Error] There was an error in your cancel callback.\",\n err\n );\n }\n }\n self.close();\n },\n },\n });\n };\n\n /**\n * Mounts the iframe in the parent HTML page\n * NOTE: Should be called AFTER the PenPal connection has been created\n * @internal\n */\n mountIFrame = () => {\n if (!document.getElementById(this.iframeId!)) {\n const wrapper = document.createElement(\"div\");\n wrapper.id = this.wrapperId;\n wrapper.style.zIndex = Number.MAX_SAFE_INTEGER.toString();\n wrapper.style.visibility = \"hidden\";\n wrapper.style.width = \"0px\";\n wrapper.style.height = \"0px\";\n wrapper.style.position = \"fixed\";\n wrapper.style.top = \"0px\";\n wrapper.style.left = \"0px\";\n wrapper.style.right = \"0px\";\n wrapper.style.bottom = \"0px\";\n wrapper.appendChild(this.iframe as HTMLIFrameElement);\n document.body.appendChild(wrapper);\n this.wrapper = wrapper;\n }\n };\n\n addIFrameToWrapper = () => {\n if (this.wrapper && this.iframe) {\n this.iframe.style.visibility = \"hidden\";\n this.wrapper.appendChild(this.iframe);\n }\n };\n\n showIframe = () => {\n if (this.iframe) {\n this.iframe.style.visibility = \"visible\";\n }\n };\n\n showWrapper = () => {\n if (this.wrapper) {\n this.wrapper.style.visibility = \"visible\";\n this.wrapper.style.width = \"100%\";\n this.wrapper.style.height = \"100%\";\n document.body.style.overflow = \"hidden\";\n }\n };\n\n /**\n * Function called by the developer to set a callback\n *\n * @param fieldName the key of the column for which we want to trigger the\n * callback\n * @param callback developer defined callback that is callback that is added\n * to a list of column hooks\n */\n registerColumnHook = (\n fieldName: IColumnHook[\"fieldName\"],\n callback: IColumnHook[\"callback\"]\n ) => {\n this.columnHooks.push({\n fieldName: fieldName,\n callback: callback,\n });\n\n // This is kept for the JS version - a user can register after the connection\n // has been made and the modal has been opened. It's bad form, but possible\n if (this.connection) {\n this.connection.promise.then((child) => {\n child.setNumRegisteredColHooks(this.columnHooks.length);\n });\n }\n };\n\n /** @internal */\n totalNumRowHooks = () => {\n return this.rowHooks.length + this.bulkRowHooks.length;\n };\n\n /**\n * Function called by the developer to set a callback\n *\n * @param callback developer defined callback that is added to a list of row\n * hooks\n */\n registerBulkRowHook = (bulkRowHook: IBulkRowHook) => {\n this.bulkRowHooks.push(bulkRowHook);\n\n // This is kept for the JS version - a user can register after the connection\n // has been made and the modal has been opened. It's bad form, but possible\n if (this.connection) {\n this.connection.promise.then((child) => {\n child.setNumRegisteredRowHooks(this.totalNumRowHooks());\n });\n }\n };\n\n /**\n * Function called by the developer to set a callback\n *\n * @param callback developer defined callback that is added to a list of row\n * hooks\n */\n registerRowHook = (callback: IRowHook) => {\n this.rowHooks.push({\n callback: callback,\n });\n\n // This is kept for the JS version - a user can register after the connection\n // has been made and the modal has been opened. It's bad form, but possible\n if (this.connection) {\n this.connection.promise.then((child) => {\n child.setNumRegisteredRowHooks(this.totalNumRowHooks());\n });\n }\n };\n\n /**\n * Function called by the developer to set a callback\n *\n * @param callback developer defined callback that is called per step of the\n * import flow\n */\n registerStepHook = (\n type: IStepHook[\"type\"],\n callback: IStepHook[\"callback\"]\n ) => {\n this.stepHooks.push({ type, callback });\n };\n\n /**\n * Function called by the developer to set a row delete callback\n *\n * @param callback developer defined callback that is called per step of the\n * import flow\n */\n registerRowDeleteHook = (callback: IRowDeleteHook) => {\n this.rowDeleteHooks.push(callback);\n // This is kept for the JS version - a user can register after the connection\n // has been made and the modal has been opened. It's bad form, but possible\n if (this.connection) {\n this.connection.promise.then((child) => {\n child.setNumRegisteredRowDeleteHooks(this.rowDeleteHooks.length);\n });\n }\n };\n\n /**\n * Function called by the developer to set the beforeFinish callback\n *\n * @param callback developer defined callback that is called when the user submits\n */\n beforeFinish = (callback: IBeforeFinishCallback): void => {\n this.beforeFinishCallback = callback;\n };\n\n /**\n * Convenience function for setting all hooks at once.\n *\n * @param hooks object containing all hooks to register\n */\n registerAllHooks = (hooks: IAllHooks): void => {\n if (hooks.columnHooks) {\n for (const { fieldName, callback } of hooks.columnHooks) {\n this.registerColumnHook(fieldName, callback);\n }\n }\n\n if (hooks.rowHooks) {\n for (const rowHook of hooks.rowHooks) {\n this.registerRowHook(rowHook);\n }\n }\n\n if (hooks.bulkRowHooks) {\n for (const bulkRowHook of hooks.bulkRowHooks) {\n this.registerBulkRowHook(bulkRowHook);\n }\n }\n\n if (hooks.rowDeleteHooks) {\n for (const rowDeleteHook of hooks.rowDeleteHooks) {\n this.registerRowDeleteHook(rowDeleteHook);\n }\n }\n\n if (hooks.stepHooks) {\n for (const { type, callback } of hooks.stepHooks) {\n this.registerStepHook(type, callback);\n }\n }\n\n if (hooks.beforeFinishCallback) {\n this.beforeFinish(hooks.beforeFinishCallback);\n }\n };\n\n /**\n * Function called by the developer to set a callback\n *\n * @param callback developer defined callback that is called when the import\n * flow completes\n */\n onResults = (\n callback: (\n data: Record<string, string | number | boolean | null>[],\n metadata: IResultMetadata\n ) => Promise<void> | void\n ) => {\n this.resultsCallback = callback;\n };\n\n /**\n * Function called by the developer to set a callback\n *\n * @param callback developer defined callback that is called when the user\n * cancels the import\n */\n onCancel = (callback: () => void) => {\n this.cancelCallback = callback;\n };\n\n /**\n * Function called by the developer to set or reset the user information\n */\n setUser = async (user: IUser) => {\n this.user = user;\n if (this.connection) {\n const child = await this.connection!.promise;\n await child.setUser(this.user);\n }\n };\n\n /**\n * Function called by the developer to add a field midway through the import\n * process\n */\n addField = async (field: IDeveloperField, position?: IPositionSpec) => {\n if (this.connection) {\n const child = await this.connection!.promise;\n await child.addField(makeFieldSerializable(field), position);\n } else {\n console.error(\"[Dromo-Error] Invalid connection to Dromo Uploader.\");\n }\n };\n\n /**\n * Function called by the developer to remove a field. The data won't appear\n * in the user interface nor in the result data.\n */\n removeField = async (fieldKey: string) => {\n if (this.connection) {\n const child = await this.connection!.promise;\n await child.removeField(fieldKey);\n } else {\n console.error(\"[Dromo-Error] Invalid connection to Dromo Uploader.\");\n }\n };\n\n /**\n * Function called by the developer to add new table messages throughout the\n * import process\n */\n updateInfoMessages = async (messages: IMessagesForCell[]) => {\n if (this.connection) {\n const child = await this.connection!.promise;\n await child.updateInfoMessages(messages);\n } else {\n console.error(\"[Dromo-Error] Invalid connection to Dromo Uploader.\");\n }\n };\n\n /**\n * Function called by the developer to change the matchingStep.headerRowOverride\n * setting from a step hook\n */\n setHeaderRowOverride = async (headerRowOverride: number | null) => {\n this.headerRowOverride = headerRowOverride;\n if (this.connection) {\n const child = await this.connection!.promise;\n await child.setHeaderRowOverride(headerRowOverride);\n }\n };\n\n /**\n * Function called by developer called to open the iframe\n */\n open = async () => {\n if (!this.wrapper) {\n this.initIFrame();\n this.createConnection();\n this.mountIFrame();\n }\n\n await this.initChild();\n this.showWrapper();\n };\n\n initInline = async (wrapperIdOrElement: string | HTMLElement) => {\n this.embedInline = true;\n\n try {\n if (wrapperIdOrElement instanceof HTMLElement) {\n this.wrapper = wrapperIdOrElement;\n this.wrapperId = wrapperIdOrElement.id;\n\n if (this.wrapperId === \"\" || this.wrapperId === undefined) {\n this.wrapperId =\n Math.random().toString(36).substring(7) +\n \"-\" +\n DROMO_WRAPPER_SUFFIX;\n }\n }\n\n if (typeof wrapperIdOrElement === \"string\") {\n const wrapperEl = document.getElementById(wrapperIdOrElement);\n\n if (wrapperEl === null) {\n throw new Error(\"WRAPPER_NOT_FOUND\");\n }\n\n this.wrapper = wrapperEl;\n this.wrapperId = wrapperIdOrElement;\n }\n\n if (!this.iframe) {\n this.initIFrame();\n this.createConnection();\n this.addIFrameToWrapper();\n }\n\n await this.initChild();\n this.showIframe();\n } catch (error) {\n if (error.message === \"WRAPPER_NOT_FOUND\") {\n console.error(\n \"[Dromo-Error] Could not find wrapper using provided ID.\"\n );\n }\n\n throw error;\n }\n };\n\n /**\n * Function called by the developer to add rows during the import\n */\n addRows = async (rows: IRowToAdd[]) => {\n if (this.connection) {\n const child = await this.connection!.promise;\n await child.addRows(rows);\n } else {\n console.error(\"[Dromo-Error] Invalid connection to Dromo Uploader.\");\n }\n };\n\n /**\n * Function called by the developer to remove rows\n */\n removeRows = async (rowIds: string[]) => {\n if (this.connection) {\n const child = await this.connection!.promise;\n await child.removeRows(rowIds);\n } else {\n console.error(\"[Dromo-Error] Invalid connection to Dromo Uploader.\");\n }\n };\n\n /**\n * Function called by developer to close the iframe\n */\n close = () => {\n if (this.wrapper) {\n this.wrapper.style.visibility = \"hidden\";\n this.wrapper.style.width = \"0px\";\n this.wrapper.style.height = \"0px\";\n document.body.style.overflow = \"inherit\";\n }\n };\n\n /**\n * Function called by the developer to set developmentMode\n */\n setDevelopmentMode = async (developmentMode: boolean) => {\n this.developmentMode = developmentMode;\n if (this.connection) {\n const child = await this.connection!.promise;\n await child.setDevelopmentMode(this.developmentMode);\n }\n };\n\n /**\n * @internal\n */\n static rehydrateHeadless = async ({\n licenseKey,\n headlessImportId,\n fields,\n settings,\n hooks,\n rehydrateState,\n }: {\n licenseKey: string;\n headlessImportId: string;\n fields: IDeveloperField[];\n settings: IDeveloperSettings;\n hooks: IAllHooks;\n rehydrateState: any;\n }): Promise<DromoUploader> => {\n const headlessUser: IUser = { id: \"headless-review\" };\n const dromo = new DromoUploader(licenseKey, fields, settings, headlessUser);\n dromo.registerAllHooks(hooks);\n await dromo.rehydrate(rehydrateState, headlessImportId);\n dromo.open();\n return dromo;\n };\n\n /**\n * @internal\n */\n rehydrate = async (rehydrateState: any, headlessImportId: string) => {\n if (!this.wrapper) {\n this.initIFrame();\n this.createConnection();\n this.mountIFrame();\n }\n await this.initChild();\n const child = await this.connection!.promise;\n await child.rehydrate(rehydrateState, headlessImportId);\n this.showWrapper();\n };\n\n /**\n * @internal\n */\n checkCloneable(values: Record<string, any>): void {\n if (typeof structuredClone !== \"function\") return;\n\n const notCloneable = Object.entries(values)\n .filter(([_name, value]) => {\n try {\n structuredClone(value);\n return false;\n } catch (e) {\n return true;\n }\n })\n .map(([name]) => name);\n\n if (notCloneable.length > 0) {\n const badValues = notCloneable.join(\", \");\n throw new Error(\n `[Dromo-External-Error] The Dromo importer received non-cloneable parameters: ${badValues}. See https://dromo.dev/err/clone`\n );\n }\n }\n}\n\nexport {\n ITableMessage,\n IMessagesForCell,\n IColumnHook,\n IColumnHookInput,\n IColumnHookOutput,\n IRowHook,\n IRowHookInput,\n IRowHookOutput,\n IDeveloperField,\n IDeveloperSettings,\n IDeveloperStyleOverrides,\n IUser,\n IValidatorField,\n IRowHookOutputInternal,\n IResultMetadata,\n IReviewStepData,\n IStepHook,\n IUploadStepData,\n IRowDeleteHook,\n IBulkRowHook,\n IBeforeFinishCallback,\n IBeforeFinishOutput,\n IPositionSpec,\n IConnectionMethods,\n ISelectField,\n IImporterOptions,\n IAllHooks,\n};\n"],"names":["__assign","Object","assign","t","s","i","n","arguments","length","p","prototype","hasOwnProperty","call","apply","this","__awaiter","thisArg","_arguments","P","generator","Promise","resolve","reject","fulfilled","value","step","next","e","rejected","result","done","then","__generator","body","f","y","g","_","label","sent","trys","ops","verb","throw","return","Symbol","iterator","v","op","TypeError","pop","push","EventTypes","MessageType","Resolution","ErrorCode","NativeErrorName","NativeEventType","IFRAME_URL","DEFAULT_PORT_BY_PROTOCOL","http:","https:","URL_REGEX","opaqueOriginSchemes","serializeError","name","message","stack","id","callSender","info","methodNames","destroyConnection","log","localName","local","remote","originForSending","originForReceiving","destroyed","createMethodProxy","methodName","args","iframeRemoved","closed","error","Error","code","ConnectionDestroyed","generateId","handleMessageEvent","event","source","data","penpal","Reply","origin","replyMessage","removeEventListener","Message","returnValue","returnValueIsError","obj","deserializedError","keys","forEach","key","deserializeError","resolution","Fulfilled","addEventListener","callMessage","Call","postMessage","reduce","api","methods","childOrigin","destructor","destroy","onDestroy","destroyCallReceiver","receiverMethodNames","window","createPromiseHandler","Rejected","err","DataCloneError","errorReplyMessage","connectCallReceiver","receiverMethodName","destroyCallSender","connectCallSender","options","iframe","timeout","debug","console","createLogger","callbacks","[object Object]","callback","createDestructor","src","srcdoc","NoIframeSrc","validateIframeHasSrcOrSrcDoc","find","scheme","startsWith","location","document","regexResult","exec","protocol","hostname","port","getOriginFromSrc","handleSynMessage","synAckMessage","SynAck","handleSynMessageFactory","handleAckMessage","handleAckMessageFactory","promise","stopConnectionTimeout","timeoutId","undefined","setTimeout","ConnectionTimeout","clearTimeout","startConnectionTimeout","handleMessage","contentWindow","Syn","Ack","checkIframeInDocIntervalId","setInterval","isConnected","clearInterval","monitorIframeRemoval","consoleErrorHandler","hookType","setHookTimer","warn","clearHookTimer","executeColumnHooks","hooks","errorHandler","changes","Map","tmpData","map","d","previousHookPromise","currentHook","timerId","hookResponse","_a","hookOutput","change","index","set","err_1","columnHookOutput","fieldOutputEmpty","fieldOutput","selectOptions","manyToOne","executeRowHooks","mode","rowHooks","bulkRowHooks","inputRowMap","inputRow","mutateInputDataWithChanges","rowIndex","rowOutput","get","fieldName","inputRowField","row","inputFieldIsManyToOne","Array","isArray","outputFieldIsManyToOne","rowChanges","cellChange","fieldChanges","fieldOutputCell","manyToOneCellChange","rowDataField","inputRowDataField","_b","entries","_i","_c","bulkRowHooks_1","bulkRowHook","hookOutput_1","err_2","all","rowInput","rowHooks_1","rowHook","err_3","finalChanges","executeRowDeleteHooks","deletedRows","rowDeleteHooks","rowData","err_4","executeStepHooks","stepHooks","instance","hook","type","err_5","executeBeforeFinishCallback","metadata","beforeFinishCallback","err_6","DROMO_WRAPPER_SUFFIX","makeFieldSerializable","field","newField","validators","validator","validate","regex","RegExp","regexOptions","ignoreCase","flags","includes","dotAll","multiline","unicode","licenseKey","fieldsOrSchemaId","settings","user","connection","alert","child","_d","loadedFromUnVersionedScript","from","getElementsByTagName","some","setNumRegisteredRowHooks","totalNumRowHooks","setNumRegisteredColHooks","columnHooks","setNumRegisteredRowDeleteHooks","setEmbedInline","embedInline","fields","version","browserExcelParsing","init","appHost","schemaId","initFromSavedSchema","developmentMode","headerRowOverride","widgetUrl","DROMO_WIDGET_OVERRIDE","_this","alternateDomain","url","URL","host","getElementById","iframeId","createElement","identifier","importIdentifier","title","style","height","width","border","crossorigin","self","connectToChild","handleColumnHooks","filter","h","handleRowHooks","rh","handleStepHook","handleRowDeleteHooks","handleBeforeFinishCallback","handleResults","resultsCallback","close","handleCloseModal","handleCancel","cancelCallback","wrapper","wrapperId","zIndex","Number","MAX_SAFE_INTEGER","toString","visibility","position","top","left","right","bottom","appendChild","overflow","registerColumnHook","_e","registerRowHook","_g","_f","registerBulkRowHook","_j","_h","rowDeleteHook","registerRowDeleteHook","_l","_k","_m","registerStepHook","beforeFinish","setUser","addField","fieldKey","removeField","messages","updateInfoMessages","setHeaderRowOverride","initIFrame","createConnection","mountIFrame","initChild","showWrapper","wrapperIdOrElement","HTMLElement","Math","random","substring","wrapperEl","addIFrameToWrapper","showIframe","error_1","rows","addRows","rowIds","removeRows","setDevelopmentMode","rehydrateState","headlessImportId","rehydrate","checkCloneable","DromoUploader","values","structuredClone","notCloneable","badValues","join","dromo","registerAllHooks","open"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../node_modules/tslib/tslib.es6.js","../src/constants.ts","../node_modules/penpal/lib/enums.js","../node_modules/penpal/lib/parent/getOriginFromSrc.js","../node_modules/penpal/lib/errorSerialization.js","../node_modules/penpal/lib/generateId.js","../node_modules/penpal/lib/connectCallSender.js","../node_modules/penpal/lib/parent/handleAckMessageFactory.js","../node_modules/penpal/lib/connectCallReceiver.js","../node_modules/penpal/lib/parent/connectToChild.js","../node_modules/penpal/lib/createLogger.js","../node_modules/penpal/lib/createDestructor.js","../node_modules/penpal/lib/parent/validateIframeHasSrcOrSrcDoc.js","../node_modules/penpal/lib/parent/handleSynMessageFactory.js","../node_modules/penpal/lib/startConnectionTimeout.js","../node_modules/penpal/lib/parent/monitorIframeRemoval.js","../src/executeHooks.ts","../src/index.ts"],"sourcesContent":["/*! *****************************************************************************\r\nCopyright (c) Microsoft Corporation.\r\n\r\nPermission to use, copy, modify, and/or distribute this software for any\r\npurpose with or without fee is hereby granted.\r\n\r\nTHE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH\r\nREGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY\r\nAND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,\r\nINDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM\r\nLOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR\r\nOTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR\r\nPERFORMANCE OF THIS SOFTWARE.\r\n***************************************************************************** */\r\n/* global Reflect, Promise */\r\n\r\nvar extendStatics = function(d, b) {\r\n extendStatics = Object.setPrototypeOf ||\r\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\r\n function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\r\n return extendStatics(d, b);\r\n};\r\n\r\nexport function __extends(d, b) {\r\n extendStatics(d, b);\r\n function __() { this.constructor = d; }\r\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\r\n}\r\n\r\nexport var __assign = function() {\r\n __assign = Object.assign || function __assign(t) {\r\n for (var s, i = 1, n = arguments.length; i < n; i++) {\r\n s = arguments[i];\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];\r\n }\r\n return t;\r\n }\r\n return __assign.apply(this, arguments);\r\n}\r\n\r\nexport function __rest(s, e) {\r\n var t = {};\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\r\n t[p] = s[p];\r\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\r\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\r\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\r\n t[p[i]] = s[p[i]];\r\n }\r\n return t;\r\n}\r\n\r\nexport function __decorate(decorators, target, key, desc) {\r\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\r\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\r\n 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;\r\n return c > 3 && r && Object.defineProperty(target, key, r), r;\r\n}\r\n\r\nexport function __param(paramIndex, decorator) {\r\n return function (target, key) { decorator(target, key, paramIndex); }\r\n}\r\n\r\nexport function __metadata(metadataKey, metadataValue) {\r\n if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(metadataKey, metadataValue);\r\n}\r\n\r\nexport function __awaiter(thisArg, _arguments, P, generator) {\r\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\r\n return new (P || (P = Promise))(function (resolve, reject) {\r\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\r\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\r\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\r\n step((generator = generator.apply(thisArg, _arguments || [])).next());\r\n });\r\n}\r\n\r\nexport function __generator(thisArg, body) {\r\n var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;\r\n return g = { next: verb(0), \"throw\": verb(1), \"return\": verb(2) }, typeof Symbol === \"function\" && (g[Symbol.iterator] = function() { return this; }), g;\r\n function verb(n) { return function (v) { return step([n, v]); }; }\r\n function step(op) {\r\n if (f) throw new TypeError(\"Generator is already executing.\");\r\n while (_) try {\r\n 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;\r\n if (y = 0, t) op = [op[0] & 2, t.value];\r\n switch (op[0]) {\r\n case 0: case 1: t = op; break;\r\n case 4: _.label++; return { value: op[1], done: false };\r\n case 5: _.label++; y = op[1]; op = [0]; continue;\r\n case 7: op = _.ops.pop(); _.trys.pop(); continue;\r\n default:\r\n if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }\r\n if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }\r\n if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }\r\n if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }\r\n if (t[2]) _.ops.pop();\r\n _.trys.pop(); continue;\r\n }\r\n op = body.call(thisArg, _);\r\n } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }\r\n if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };\r\n }\r\n}\r\n\r\nexport function __createBinding(o, m, k, k2) {\r\n if (k2 === undefined) k2 = k;\r\n o[k2] = m[k];\r\n}\r\n\r\nexport function __exportStar(m, exports) {\r\n for (var p in m) if (p !== \"default\" && !exports.hasOwnProperty(p)) exports[p] = m[p];\r\n}\r\n\r\nexport function __values(o) {\r\n var s = typeof Symbol === \"function\" && Symbol.iterator, m = s && o[s], i = 0;\r\n if (m) return m.call(o);\r\n if (o && typeof o.length === \"number\") return {\r\n next: function () {\r\n if (o && i >= o.length) o = void 0;\r\n return { value: o && o[i++], done: !o };\r\n }\r\n };\r\n throw new TypeError(s ? \"Object is not iterable.\" : \"Symbol.iterator is not defined.\");\r\n}\r\n\r\nexport function __read(o, n) {\r\n var m = typeof Symbol === \"function\" && o[Symbol.iterator];\r\n if (!m) return o;\r\n var i = m.call(o), r, ar = [], e;\r\n try {\r\n while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);\r\n }\r\n catch (error) { e = { error: error }; }\r\n finally {\r\n try {\r\n if (r && !r.done && (m = i[\"return\"])) m.call(i);\r\n }\r\n finally { if (e) throw e.error; }\r\n }\r\n return ar;\r\n}\r\n\r\nexport function __spread() {\r\n for (var ar = [], i = 0; i < arguments.length; i++)\r\n ar = ar.concat(__read(arguments[i]));\r\n return ar;\r\n}\r\n\r\nexport function __spreadArrays() {\r\n for (var s = 0, i = 0, il = arguments.length; i < il; i++) s += arguments[i].length;\r\n for (var r = Array(s), k = 0, i = 0; i < il; i++)\r\n for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++)\r\n r[k] = a[j];\r\n return r;\r\n};\r\n\r\nexport function __await(v) {\r\n return this instanceof __await ? (this.v = v, this) : new __await(v);\r\n}\r\n\r\nexport function __asyncGenerator(thisArg, _arguments, generator) {\r\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n var g = generator.apply(thisArg, _arguments || []), i, q = [];\r\n return i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i;\r\n 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); }); }; }\r\n function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(q[0][3], e); } }\r\n function step(r) { r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r); }\r\n function fulfill(value) { resume(\"next\", value); }\r\n function reject(value) { resume(\"throw\", value); }\r\n function settle(f, v) { if (f(v), q.shift(), q.length) resume(q[0][0], q[0][1]); }\r\n}\r\n\r\nexport function __asyncDelegator(o) {\r\n var i, p;\r\n return i = {}, verb(\"next\"), verb(\"throw\", function (e) { throw e; }), verb(\"return\"), i[Symbol.iterator] = function () { return this; }, i;\r\n 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; }\r\n}\r\n\r\nexport function __asyncValues(o) {\r\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n var m = o[Symbol.asyncIterator], i;\r\n 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);\r\n 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); }); }; }\r\n function settle(resolve, reject, d, v) { Promise.resolve(v).then(function(v) { resolve({ value: v, done: d }); }, reject); }\r\n}\r\n\r\nexport function __makeTemplateObject(cooked, raw) {\r\n if (Object.defineProperty) { Object.defineProperty(cooked, \"raw\", { value: raw }); } else { cooked.raw = raw; }\r\n return cooked;\r\n};\r\n\r\nexport function __importStar(mod) {\r\n if (mod && mod.__esModule) return mod;\r\n var result = {};\r\n if (mod != null) for (var k in mod) if (Object.hasOwnProperty.call(mod, k)) result[k] = mod[k];\r\n result.default = mod;\r\n return result;\r\n}\r\n\r\nexport function __importDefault(mod) {\r\n return (mod && mod.__esModule) ? mod : { default: mod };\r\n}\r\n\r\nexport function __classPrivateFieldGet(receiver, privateMap) {\r\n if (!privateMap.has(receiver)) {\r\n throw new TypeError(\"attempted to get private field on non-instance\");\r\n }\r\n return privateMap.get(receiver);\r\n}\r\n\r\nexport function __classPrivateFieldSet(receiver, privateMap, value) {\r\n if (!privateMap.has(receiver)) {\r\n throw new TypeError(\"attempted to set private field on non-instance\");\r\n }\r\n privateMap.set(receiver, value);\r\n return value;\r\n}\r\n","/* eslint-disable no-unused-vars */\ninterface IEnvironmentConstants {\n IFRAME_URL: string;\n}\n\nlet EnvironmentConstants: IEnvironmentConstants;\n// @ts-ignore\nif (ENV_IS_PRODUCTION) {\n EnvironmentConstants = {\n IFRAME_URL: \"https://widget.dromo.io/\",\n };\n} else {\n EnvironmentConstants = {\n IFRAME_URL: \"http://localhost:3000/\",\n };\n}\n\n/** @internal */\nexport const IFRAME_URL = EnvironmentConstants.IFRAME_URL;\n\n/** @internal */\nexport const V1_IFRAME_URL = \"https://widget-v1.dromo.io/\";\n\n/** @internal */\nexport enum EventTypes {\n INIT_IFRAME = \"INIT_IFRAME\",\n}\n","export var MessageType;\n(function (MessageType) {\n MessageType[\"Call\"] = \"call\";\n MessageType[\"Reply\"] = \"reply\";\n MessageType[\"Syn\"] = \"syn\";\n MessageType[\"SynAck\"] = \"synAck\";\n MessageType[\"Ack\"] = \"ack\";\n})(MessageType || (MessageType = {}));\nexport var Resolution;\n(function (Resolution) {\n Resolution[\"Fulfilled\"] = \"fulfilled\";\n Resolution[\"Rejected\"] = \"rejected\";\n})(Resolution || (Resolution = {}));\nexport var ErrorCode;\n(function (ErrorCode) {\n ErrorCode[\"ConnectionDestroyed\"] = \"ConnectionDestroyed\";\n ErrorCode[\"ConnectionTimeout\"] = \"ConnectionTimeout\";\n ErrorCode[\"NotInIframe\"] = \"NotInIframe\";\n ErrorCode[\"NoIframeSrc\"] = \"NoIframeSrc\";\n})(ErrorCode || (ErrorCode = {}));\nexport var NativeErrorName;\n(function (NativeErrorName) {\n NativeErrorName[\"DataCloneError\"] = \"DataCloneError\";\n})(NativeErrorName || (NativeErrorName = {}));\nexport var NativeEventType;\n(function (NativeEventType) {\n NativeEventType[\"Message\"] = \"message\";\n})(NativeEventType || (NativeEventType = {}));\n","const DEFAULT_PORT_BY_PROTOCOL = {\n 'http:': '80',\n 'https:': '443'\n};\nconst URL_REGEX = /^(https?:)?\\/\\/([^/:]+)?(:(\\d+))?/;\nconst opaqueOriginSchemes = ['file:', 'data:'];\n/**\n * Converts a src value into an origin.\n */\nexport default (src) => {\n if (src && opaqueOriginSchemes.find(scheme => src.startsWith(scheme))) {\n // The origin of the child document is an opaque origin and its\n // serialization is \"null\"\n // https://html.spec.whatwg.org/multipage/origin.html#origin\n return 'null';\n }\n // Note that if src is undefined, then srcdoc is being used instead of src\n // and we can follow this same logic below to get the origin of the parent,\n // which is the origin that we will need to use.\n const location = document.location;\n const regexResult = URL_REGEX.exec(src);\n let protocol;\n let hostname;\n let port;\n if (regexResult) {\n // It's an absolute URL. Use the parsed info.\n // regexResult[1] will be undefined if the URL starts with //\n protocol = (regexResult[1] ? regexResult[1] : location.protocol);\n hostname = regexResult[2];\n port = regexResult[4];\n }\n else {\n // It's a relative path. Use the current location's info.\n protocol = location.protocol;\n hostname = location.hostname;\n port = location.port;\n }\n // If the port is the default for the protocol, we don't want to add it to the origin string\n // or it won't match the message's event.origin.\n const portSuffix = port && port !== DEFAULT_PORT_BY_PROTOCOL[protocol] ? `:${port}` : '';\n return `${protocol}//${hostname}${portSuffix}`;\n};\n","/**\n * Converts an error object into a plain object.\n */\nexport const serializeError = ({ name, message, stack }) => ({\n name,\n message,\n stack\n});\n/**\n * Converts a plain object into an error object.\n */\nexport const deserializeError = (obj) => {\n const deserializedError = new Error();\n // @ts-ignore\n Object.keys(obj).forEach(key => (deserializedError[key] = obj[key]));\n return deserializedError;\n};\n","let id = 0;\n/**\n * @return {number} A unique ID (not universally unique)\n */\nexport default () => ++id;\n","import generateId from './generateId';\nimport { deserializeError } from './errorSerialization';\nimport { ErrorCode, MessageType, NativeEventType, Resolution } from './enums';\n/**\n * Augments an object with methods that match those defined by the remote. When these methods are\n * called, a \"call\" message will be sent to the remote, the remote's corresponding method will be\n * executed, and the method's return value will be returned via a message.\n * @param {Object} callSender Sender object that should be augmented with methods.\n * @param {Object} info Information about the local and remote windows.\n * @param {Array} methodNames Names of methods available to be called on the remote.\n * @param {Promise} destructionPromise A promise resolved when destroy() is called on the penpal\n * connection.\n * @returns {Object} The call sender object with methods that may be called.\n */\nexport default (callSender, info, methodNames, destroyConnection, log) => {\n const { localName, local, remote, originForSending, originForReceiving } = info;\n let destroyed = false;\n log(`${localName}: Connecting call sender`);\n const createMethodProxy = (methodName) => {\n return (...args) => {\n log(`${localName}: Sending ${methodName}() call`);\n // This handles the case where the iframe has been removed from the DOM\n // (and therefore its window closed), the consumer has not yet\n // called destroy(), and the user calls a method exposed by\n // the remote. We detect the iframe has been removed and force\n // a destroy() immediately so that the consumer sees the error saying\n // the connection has been destroyed. We wrap this check in a try catch\n // because Edge throws an \"Object expected\" error when accessing\n // contentWindow.closed on a contentWindow from an iframe that's been\n // removed from the DOM.\n let iframeRemoved;\n try {\n if (remote.closed) {\n iframeRemoved = true;\n }\n }\n catch (e) {\n iframeRemoved = true;\n }\n if (iframeRemoved) {\n destroyConnection();\n }\n if (destroyed) {\n const error = new Error(`Unable to send ${methodName}() call due ` + `to destroyed connection`);\n error.code = ErrorCode.ConnectionDestroyed;\n throw error;\n }\n return new Promise((resolve, reject) => {\n const id = generateId();\n const handleMessageEvent = (event) => {\n if (event.source !== remote ||\n event.data.penpal !== MessageType.Reply ||\n event.data.id !== id) {\n return;\n }\n if (event.origin !== originForReceiving) {\n log(`${localName} received message from origin ${event.origin} which did not match expected origin ${originForReceiving}`);\n return;\n }\n const replyMessage = event.data;\n log(`${localName}: Received ${methodName}() reply`);\n local.removeEventListener(NativeEventType.Message, handleMessageEvent);\n let returnValue = replyMessage.returnValue;\n if (replyMessage.returnValueIsError) {\n returnValue = deserializeError(returnValue);\n }\n (replyMessage.resolution === Resolution.Fulfilled ? resolve : reject)(returnValue);\n };\n local.addEventListener(NativeEventType.Message, handleMessageEvent);\n const callMessage = {\n penpal: MessageType.Call,\n id,\n methodName,\n args\n };\n remote.postMessage(callMessage, originForSending);\n });\n };\n };\n methodNames.reduce((api, methodName) => {\n api[methodName] = createMethodProxy(methodName);\n return api;\n }, callSender);\n return () => {\n destroyed = true;\n };\n};\n","import connectCallReceiver from '../connectCallReceiver';\nimport connectCallSender from '../connectCallSender';\n/**\n * Handles an ACK handshake message.\n */\nexport default (methods, childOrigin, originForSending, destructor, log) => {\n const { destroy, onDestroy } = destructor;\n let destroyCallReceiver;\n let receiverMethodNames;\n // We resolve the promise with the call sender. If the child reconnects\n // (for example, after refreshing or navigating to another page that\n // uses Penpal, we'll update the call sender with methods that match the\n // latest provided by the child.\n const callSender = {};\n return (event) => {\n if (event.origin !== childOrigin) {\n log(`Parent: Handshake - Received ACK message from origin ${event.origin} which did not match expected origin ${childOrigin}`);\n return;\n }\n log('Parent: Handshake - Received ACK');\n const info = {\n localName: 'Parent',\n local: window,\n remote: event.source,\n originForSending: originForSending,\n originForReceiving: childOrigin\n };\n // If the child reconnected, we need to destroy the prior call receiver\n // before setting up a new one.\n if (destroyCallReceiver) {\n destroyCallReceiver();\n }\n destroyCallReceiver = connectCallReceiver(info, methods, log);\n onDestroy(destroyCallReceiver);\n // If the child reconnected, we need to remove the methods from the\n // previous call receiver off the sender.\n if (receiverMethodNames) {\n receiverMethodNames.forEach(receiverMethodName => {\n delete callSender[receiverMethodName];\n });\n }\n receiverMethodNames = event.data.methodNames;\n const destroyCallSender = connectCallSender(callSender, info, receiverMethodNames, destroy, log);\n onDestroy(destroyCallSender);\n return callSender;\n };\n};\n","import { serializeError } from './errorSerialization';\nimport { MessageType, NativeEventType, NativeErrorName, Resolution } from './enums';\n/**\n * Listens for \"call\" messages coming from the remote, executes the corresponding method, and\n * responds with the return value.\n */\nexport default (info, methods, log) => {\n const { localName, local, remote, originForSending, originForReceiving } = info;\n let destroyed = false;\n const handleMessageEvent = (event) => {\n if (event.source !== remote || event.data.penpal !== MessageType.Call) {\n return;\n }\n if (event.origin !== originForReceiving) {\n log(`${localName} received message from origin ${event.origin} which did not match expected origin ${originForReceiving}`);\n return;\n }\n const callMessage = event.data;\n const { methodName, args, id } = callMessage;\n log(`${localName}: Received ${methodName}() call`);\n const createPromiseHandler = (resolution) => {\n return (returnValue) => {\n log(`${localName}: Sending ${methodName}() reply`);\n if (destroyed) {\n // It's possible to throw an error here, but it would need to be thrown asynchronously\n // and would only be catchable using window.onerror. This is because the consumer\n // is merely returning a value from their method and not calling any function\n // that they could wrap in a try-catch. Even if the consumer were to catch the error,\n // the value of doing so is questionable. Instead, we'll just log a message.\n log(`${localName}: Unable to send ${methodName}() reply due to destroyed connection`);\n return;\n }\n const message = {\n penpal: MessageType.Reply,\n id,\n resolution,\n returnValue\n };\n if (resolution === Resolution.Rejected &&\n returnValue instanceof Error) {\n message.returnValue = serializeError(returnValue);\n message.returnValueIsError = true;\n }\n try {\n remote.postMessage(message, originForSending);\n }\n catch (err) {\n // If a consumer attempts to send an object that's not cloneable (e.g., window),\n // we want to ensure the receiver's promise gets rejected.\n if (err.name === NativeErrorName.DataCloneError) {\n const errorReplyMessage = {\n penpal: MessageType.Reply,\n id,\n resolution: Resolution.Rejected,\n returnValue: serializeError(err),\n returnValueIsError: true\n };\n remote.postMessage(errorReplyMessage, originForSending);\n }\n throw err;\n }\n };\n };\n new Promise(resolve => resolve(methods[methodName].apply(methods, args))).then(createPromiseHandler(Resolution.Fulfilled), createPromiseHandler(Resolution.Rejected));\n };\n local.addEventListener(NativeEventType.Message, handleMessageEvent);\n return () => {\n destroyed = true;\n local.removeEventListener(NativeEventType.Message, handleMessageEvent);\n };\n};\n","import { ErrorCode, MessageType, NativeEventType } from '../enums';\nimport createDestructor from '../createDestructor';\nimport createLogger from '../createLogger';\nimport getOriginFromSrc from './getOriginFromSrc';\nimport handleAckMessageFactory from './handleAckMessageFactory';\nimport handleSynMessageFactory from './handleSynMessageFactory';\nimport monitorIframeRemoval from './monitorIframeRemoval';\nimport startConnectionTimeout from '../startConnectionTimeout';\nimport validateIframeHasSrcOrSrcDoc from './validateIframeHasSrcOrSrcDoc';\n/**\n * Attempts to establish communication with an iframe.\n */\nexport default (options) => {\n let { iframe, methods = {}, childOrigin, timeout, debug = false } = options;\n const log = createLogger(debug);\n const destructor = createDestructor();\n const { onDestroy, destroy } = destructor;\n if (!childOrigin) {\n validateIframeHasSrcOrSrcDoc(iframe);\n childOrigin = getOriginFromSrc(iframe.src);\n }\n // If event.origin is \"null\", the remote protocol is file: or data: and we\n // must post messages with \"*\" as targetOrigin when sending messages.\n // https://developer.mozilla.org/en-US/docs/Web/API/Window/postMessage#Using_window.postMessage_in_extensions\n const originForSending = childOrigin === 'null' ? '*' : childOrigin;\n const handleSynMessage = handleSynMessageFactory(log, methods, childOrigin, originForSending);\n const handleAckMessage = handleAckMessageFactory(methods, childOrigin, originForSending, destructor, log);\n const promise = new Promise((resolve, reject) => {\n const stopConnectionTimeout = startConnectionTimeout(timeout, destroy);\n const handleMessage = (event) => {\n if (event.source !== iframe.contentWindow || !event.data) {\n return;\n }\n if (event.data.penpal === MessageType.Syn) {\n handleSynMessage(event);\n return;\n }\n if (event.data.penpal === MessageType.Ack) {\n const callSender = handleAckMessage(event);\n if (callSender) {\n stopConnectionTimeout();\n resolve(callSender);\n }\n return;\n }\n };\n window.addEventListener(NativeEventType.Message, handleMessage);\n log('Parent: Awaiting handshake');\n monitorIframeRemoval(iframe, destructor);\n onDestroy((error) => {\n window.removeEventListener(NativeEventType.Message, handleMessage);\n if (!error) {\n error = new Error('Connection destroyed');\n error.code = ErrorCode.ConnectionDestroyed;\n }\n reject(error);\n });\n });\n return {\n promise,\n destroy() {\n // Don't allow consumer to pass an error into destroy.\n destroy();\n }\n };\n};\n","export default (debug) => {\n /**\n * Logs a message if debug is enabled.\n */\n return (...args) => {\n if (debug) {\n console.log('[Penpal]', ...args); // eslint-disable-line no-console\n }\n };\n};\n","export default () => {\n const callbacks = [];\n let destroyed = false;\n return {\n destroy(error) {\n destroyed = true;\n callbacks.forEach(callback => {\n callback(error);\n });\n },\n onDestroy(callback) {\n destroyed ? callback() : callbacks.push(callback);\n }\n };\n};\n","import { ErrorCode } from '../enums';\nexport default (iframe) => {\n if (!iframe.src && !iframe.srcdoc) {\n const error = new Error('Iframe must have src or srcdoc property defined.');\n error.code = ErrorCode.NoIframeSrc;\n throw error;\n }\n};\n","import { MessageType } from '../enums';\n/**\n * Handles a SYN handshake message.\n */\nexport default (log, methods, childOrigin, originForSending) => {\n return (event) => {\n if (event.origin !== childOrigin) {\n log(`Parent: Handshake - Received SYN message from origin ${event.origin} which did not match expected origin ${childOrigin}`);\n return;\n }\n log('Parent: Handshake - Received SYN, responding with SYN-ACK');\n const synAckMessage = {\n penpal: MessageType.SynAck,\n methodNames: Object.keys(methods)\n };\n event.source.postMessage(synAckMessage, originForSending);\n };\n};\n","import { ErrorCode } from './enums';\n/**\n * Starts a timeout and calls the callback with an error\n * if the timeout completes before the stop function is called.\n */\nexport default (timeout, callback) => {\n let timeoutId;\n if (timeout !== undefined) {\n timeoutId = window.setTimeout(() => {\n const error = new Error(`Connection timed out after ${timeout}ms`);\n error.code = ErrorCode.ConnectionTimeout;\n callback(error);\n }, timeout);\n }\n return () => {\n clearTimeout(timeoutId);\n };\n};\n","const CHECK_IFRAME_IN_DOC_INTERVAL = 60000;\n/**\n * Monitors for iframe removal and destroys connection if iframe\n * is found to have been removed from DOM. This is to prevent memory\n * leaks when the iframe is removed from the document and the consumer\n * hasn't called destroy(). Without this, event listeners attached to\n * the window would stick around and since the event handlers have a\n * reference to the iframe in their closures, the iframe would stick\n * around too.\n */\nexport default (iframe, destructor) => {\n const { destroy, onDestroy } = destructor;\n const checkIframeInDocIntervalId = setInterval(() => {\n if (!iframe.isConnected) {\n clearInterval(checkIframeInDocIntervalId);\n destroy();\n }\n }, CHECK_IFRAME_IN_DOC_INTERVAL);\n onDestroy(() => {\n clearInterval(checkIframeInDocIntervalId);\n });\n};\n","import {\n EStepHook,\n IBeforeFinishCallback,\n IBeforeFinishOutput,\n IBulkRowHook,\n IColumnHook,\n IColumnHookInput,\n IColumnHookOutput,\n IPublicConnectionMethods,\n IResultMetadataWithValues,\n IReviewStepData,\n IReviewStepPostHooksData,\n IRow,\n IRowCell,\n IRowCellBasic,\n IRowDeleteHook,\n IRowHook,\n IRowHookCellBasic,\n IRowHookInput,\n IRowHookOutput,\n IRowHookOutputInternal,\n IStepHook,\n ITableMessage,\n IUploadStepData,\n} from \"./interfaces\";\n\nexport type HookErrorHandlerFn = (err: unknown, hookType: string) => void;\nconst MAX_HOOK_TIME_MS = 10000;\n\nexport const consoleErrorHandler: HookErrorHandlerFn = (\n err: unknown,\n hookType: string\n) =>\n console.error(\n `[Dromo-External-Error] There was an error running your ${hookType}.`,\n err\n );\n\nconst setHookTimer = (hookType: string) => {\n return setTimeout(() => {\n // eslint-disable-next-line no-console\n console.warn(\n `[Dromo Error] Slow ${hookType} detected (>10s). Long running hooks can degrade user experience and importer performance.`\n );\n }, MAX_HOOK_TIME_MS);\n};\n\nconst clearHookTimer = (timeoutId: NodeJS.Timeout) => {\n clearTimeout(timeoutId);\n};\n\nexport const executeColumnHooks = async (\n hooks: IColumnHook[],\n data: IColumnHookInput[],\n errorHandler: HookErrorHandlerFn\n): Promise<IColumnHookOutput[]> => {\n const changes = new Map<\n number,\n { newValue?: string; info?: ITableMessage[] }\n >();\n // Each hook call updates this tmpData object with the latest values.\n // This allows us to run hooks sequentially with each subsequent call\n // having the most up to date data\n const tmpData: IColumnHookInput[] = data.map((d) => ({ ...d }));\n\n // For each registered hook, call the developer defined callback\n await hooks.reduce(async (previousHookPromise, currentHook) => {\n await previousHookPromise.then(async () => {\n try {\n const timerId = setHookTimer(\"column hook\");\n const hookResponse = await currentHook.callback(tmpData);\n clearHookTimer(timerId);\n hookResponse.forEach((hookOutput: IColumnHookOutput) => {\n // If the user has updated the value or info for a particular\n // index update the changes map, and the tmpData\n if (hookOutput.value !== undefined || hookOutput.info !== undefined) {\n const change: {\n value?: string;\n info?: ITableMessage[];\n } = {};\n if (hookOutput.value !== undefined) {\n change.value = hookOutput.value;\n tmpData[hookOutput.index].value = hookOutput.value;\n }\n if (hookOutput.info !== undefined) change.info = hookOutput.info;\n changes.set(hookOutput.index, change);\n }\n });\n } catch (err) {\n errorHandler(err, \"column hooks\");\n }\n });\n }, Promise.resolve());\n\n // Change the map into IColumnHookOuput for the application to process\n const columnHookOutput: IColumnHookOutput[] = [];\n changes.forEach((change, index) =>\n columnHookOutput.push({ ...change, index })\n );\n return columnHookOutput;\n};\n\nconst fieldOutputEmpty = (fieldOutput: IRowCell): boolean =>\n fieldOutput.value === undefined &&\n fieldOutput.info === undefined &&\n fieldOutput.selectOptions === undefined &&\n fieldOutput.manyToOne === undefined;\n\nexport const executeRowHooks = async (\n data: IRowHookInput[],\n mode: \"init\" | \"update\",\n rowHooks: IRowHook[],\n bulkRowHooks: IBulkRowHook[],\n errorHandler: HookErrorHandlerFn\n): Promise<IRowHookOutputInternal[]> => {\n // Changes is the final changes that will be sent to the frontend\n const changes = new Map<number, IRow>();\n const inputRowMap = new Map(\n data.map((inputRow) => [inputRow.index, inputRow])\n );\n\n // a helper function called for each row that updates the final changes\n // as well as the row data which will be passed to subsequent hooks\n const mutateInputDataWithChanges = (\n rowIndex: number,\n rowOutput: IRowHookOutput[\"row\"]\n ) => {\n const inputRow = inputRowMap.get(rowIndex)!;\n\n for (const [fieldName, fieldOutput] of Object.entries(rowOutput ?? {})) {\n if (fieldOutputEmpty(fieldOutput as IRowCell)) continue;\n\n const inputRowField = inputRow.row[fieldName];\n const inputFieldIsManyToOne = Array.isArray(inputRowField.manyToOne);\n const outputFieldIsManyToOne =\n \"manyToOne\" in fieldOutput && Array.isArray(fieldOutput.manyToOne);\n\n if (inputFieldIsManyToOne && !outputFieldIsManyToOne) {\n throw new Error(\n `${fieldName} should have manyToOne defined as an array.`\n );\n } else if (\n inputFieldIsManyToOne &&\n outputFieldIsManyToOne &&\n inputRowField.manyToOne!.length !== fieldOutput.manyToOne.length\n ) {\n throw new Error(\n `${fieldName} should be array of length ${\n inputRowField.manyToOne!.length\n }`\n );\n }\n\n const rowChanges = changes.get(rowIndex) || {};\n const cellChange: IRowCell = rowChanges[fieldName] ?? {};\n\n const fieldChanges: {\n fieldOutput: IRowCellBasic;\n rowDataField: IRowHookCellBasic;\n cellChange: IRowCellBasic;\n }[] = [];\n\n if (outputFieldIsManyToOne) {\n cellChange.manyToOne = [];\n\n fieldOutput.manyToOne.forEach((fieldOutputCell, index) => {\n if (!fieldOutputEmpty(fieldOutputCell as IRowCell)) {\n const manyToOneCellChange: IRowCellBasic = {};\n cellChange.manyToOne!.push(manyToOneCellChange);\n fieldChanges.push({\n fieldOutput: fieldOutputCell,\n rowDataField: inputRowField.manyToOne![index],\n cellChange: manyToOneCellChange,\n });\n }\n });\n } else {\n fieldChanges.push({\n fieldOutput: fieldOutput as IRowCellBasic,\n rowDataField: inputRowField,\n cellChange,\n });\n }\n // if there are any changes, we want to both update the changes\n // object sent to the app, and the rowInput sent to subsequent\n // row hooks running on this row so they see the changes from\n // prior row hooks\n fieldChanges.forEach(\n ({ fieldOutput, rowDataField: inputRowDataField, cellChange }) => {\n if (fieldOutput.value !== undefined) {\n cellChange.value = fieldOutput.value;\n inputRowDataField.value = fieldOutput.value;\n }\n\n if (fieldOutput.info !== undefined) {\n cellChange.info = fieldOutput.info;\n inputRowDataField.info = fieldOutput.info;\n }\n\n if (fieldOutput.selectOptions !== undefined) {\n cellChange.selectOptions = fieldOutput.selectOptions;\n inputRowDataField.selectOptions = fieldOutput.selectOptions;\n }\n }\n );\n rowChanges[fieldName] = cellChange;\n changes.set(rowIndex, rowChanges);\n }\n };\n // First we run the bulk row hooks with all of the input data\n for (const bulkRowHook of bulkRowHooks) {\n try {\n const timerId = setHookTimer(\"bulk row hook\");\n const hookOutput = await bulkRowHook(data, mode);\n clearHookTimer(timerId);\n for (const rowOutput of hookOutput) {\n mutateInputDataWithChanges(rowOutput.index, rowOutput.row);\n }\n } catch (err) {\n errorHandler(err, \"bulk row hooks\");\n }\n }\n\n // We want to loop through each row independently. Because each\n // row's execution is independent, we can do row by row first vs\n // hook by hook\n await Promise.all(\n data.map(async (rowInput) => {\n for (const rowHook of rowHooks) {\n try {\n const timerId = setHookTimer(\"row hook\");\n const hookOutput = await rowHook(rowInput, mode);\n clearHookTimer(timerId);\n mutateInputDataWithChanges(rowInput.index, hookOutput.row);\n } catch (err) {\n errorHandler(err, \"row hooks\");\n }\n }\n })\n );\n\n const finalChanges: IRowHookOutputInternal[] = [];\n\n changes.forEach((rowChanges, rowIndex) => {\n finalChanges.push({ index: rowIndex, row: rowChanges });\n });\n return finalChanges;\n};\n\nexport const executeRowDeleteHooks = async (\n deletedRows: IRowHookInput[],\n rowDeleteHooks: IRowDeleteHook[],\n errorHandler: HookErrorHandlerFn\n): Promise<void[]> => {\n // We want to loop through each row independently. Because each\n // row's execution is independent, we can do row by row first vs\n // hook by hook\n return Promise.all(\n deletedRows.map(async (rowData) => {\n rowDeleteHooks.forEach(async (currentHook) => {\n try {\n const timerId = setHookTimer(\"row delete hook\");\n await currentHook(rowData);\n clearHookTimer(timerId);\n } catch (err) {\n errorHandler(err, \"row delete hooks\");\n }\n });\n })\n );\n};\n\nexport const executeStepHooks = async (\n step: EStepHook,\n data: IUploadStepData | IReviewStepData | IReviewStepPostHooksData,\n stepHooks: IStepHook[],\n instance: IPublicConnectionMethods,\n errorHandler: HookErrorHandlerFn\n) => {\n await Promise.all(\n stepHooks.map(async (hook) => {\n if (step !== hook.type) return Promise.resolve();\n\n try {\n return await hook.callback(instance, data);\n } catch (err) {\n errorHandler(err, `step hook ${step}`);\n return Promise.resolve();\n }\n })\n );\n};\n\nexport const executeBeforeFinishCallback = async (\n data: Record<string, unknown>[],\n metadata: IResultMetadataWithValues,\n beforeFinishCallback: IBeforeFinishCallback,\n instance: IPublicConnectionMethods,\n errorHandler: HookErrorHandlerFn\n): Promise<IBeforeFinishOutput> => {\n try {\n return await beforeFinishCallback(data, metadata, instance);\n } catch (err) {\n errorHandler(err, \"before finish callback\");\n }\n};\n","import { IFRAME_URL, V1_IFRAME_URL } from \"./constants\";\nimport { connectToChild } from \"penpal\";\nimport { Connection } from \"penpal/lib/types\";\n\nimport {\n ITableMessage,\n IMessagesForCell,\n IColumnHook,\n IColumnHookInput,\n IColumnHookOutput,\n IRowHook,\n IRowHookInput,\n IRowHookOutput,\n IDeveloperField,\n IDeveloperSettings,\n IDeveloperStyleOverrides,\n IUser,\n IValidatorField,\n IRowHookOutputInternal,\n IResultMetadata,\n EStepHook,\n IReviewStepData,\n IStepHook,\n IUploadStepData,\n IRowDeleteHook,\n IBulkRowHook,\n IBeforeFinishCallback,\n IBeforeFinishOutput,\n IPositionSpec,\n IConnectionMethods,\n ISelectField,\n IImporterOptions,\n IAllHooks,\n IRowToAdd,\n IResultMetadataWithValues,\n} from \"./interfaces\";\nimport {\n consoleErrorHandler,\n executeBeforeFinishCallback,\n executeColumnHooks,\n executeRowDeleteHooks,\n executeRowHooks,\n executeStepHooks,\n} from \"./executeHooks\";\n\nconst DROMO_WRAPPER_SUFFIX = \"dromo-container\";\nconst IFRAME_SUFFIX = \"dromo-iframe-element\";\n\ndeclare global {\n interface Window {\n DROMO_WIDGET_OVERRIDE?: string;\n }\n}\n\nconst makeFieldSerializable = (field: IDeveloperField) => {\n const newField = { ...field };\n if (newField.validators) {\n newField.validators = newField.validators.map((validator) => {\n if (\n (validator.validate === \"regex_match\" ||\n validator.validate === \"regex_exclude\") &&\n validator.regex instanceof RegExp\n ) {\n return {\n ...validator,\n regex: validator.regex.source,\n regexOptions: {\n ignoreCase: validator.regex.flags.includes(\"i\"),\n dotAll: validator.regex.flags.includes(\"s\"),\n multiline: validator.regex.flags.includes(\"m\"),\n unicode: validator.regex.flags.includes(\"u\"),\n },\n };\n }\n return validator;\n });\n }\n return newField;\n};\n\nexport default class DromoUploader {\n // Unique IDs for iframe and container\n /** @internal */\n iframeId: string;\n /** @internal */\n wrapperId: string;\n /** @internal */\n embedInline: boolean = false;\n\n // Refers to unique backend license key\n /** @internal */\n licenseKey: string;\n // See DeveloperFieldsSchema\n /** @internal */\n fields: IDeveloperField[] | undefined;\n // See DeveloperSettingsSchema\n /** @internal */\n settings: IDeveloperSettings | undefined;\n // See UserSchema\n /** @internal */\n user: IUser | undefined;\n // If the user is using a saved schema, its ID\n // (Could also be a schema name for backwards compatibility)\n /** @internal */\n schemaId: string | undefined;\n // DevelopmentMode\n /** @internal */\n developmentMode: boolean | undefined;\n // Header Row Override\n /** @internal */\n headerRowOverride: number | null | undefined;\n\n // HTML references\n /** @internal */\n iframe: HTMLIFrameElement | undefined;\n /** @internal */\n wrapper: HTMLElement | undefined;\n\n // Penpal connection reference\n /** @internal */\n connection: Connection<IConnectionMethods> | undefined;\n\n // Data Hooks\n /** @internal */\n columnHooks: IColumnHook[] = [];\n /** @internal */\n bulkRowHooks: IBulkRowHook[] = [];\n /** @internal */\n rowHooks: { callback: IRowHook }[] = [];\n /** @internal */\n stepHooks: IStepHook[] = [];\n /** @internal */\n rowDeleteHooks: IRowDeleteHook[] = [];\n\n // Callbacks\n /** @internal */\n beforeFinishCallback: IBeforeFinishCallback | undefined;\n /** @internal */\n resultsCallback:\n | ((data: any, metadata: IResultMetadata) => Promise<void> | void)\n | undefined;\n\n /** @internal */\n cancelCallback: (() => void) | undefined;\n\n /** @internal */\n appHost: string;\n\n constructor(\n licenseKey: string,\n fields: IDeveloperField[],\n settings: IDeveloperSettings,\n user: IUser\n );\n\n constructor(licenseKey: string, schemaId: string);\n\n constructor(\n licenseKey: string,\n fieldsOrSchemaId: IDeveloperField[] | string,\n settings?: IDeveloperSettings,\n user?: IUser\n ) {\n this.iframeId =\n Math.random().toString(36).substring(7) + \"-\" + IFRAME_SUFFIX;\n this.wrapperId =\n Math.random().toString(36).substring(7) + \"-\" + DROMO_WRAPPER_SUFFIX;\n this.appHost = document.location.hostname;\n\n if (settings !== undefined && user !== undefined) {\n this.licenseKey = licenseKey;\n this.fields = (fieldsOrSchemaId as IDeveloperField[]).map(\n makeFieldSerializable\n );\n this.settings = settings;\n this.user = user;\n\n this.checkCloneable({\n licenseKey: this.licenseKey,\n fields: this.fields,\n settings: this.settings,\n user: this.user,\n });\n } else {\n this.licenseKey = licenseKey;\n this.schemaId = fieldsOrSchemaId as string;\n\n this.checkCloneable({\n licenseKey: this.licenseKey,\n schemaId: this.schemaId,\n });\n }\n }\n\n initChild = async () => {\n if (!this.connection) {\n console.error(\"shim cannot connect with Dromo service.\");\n alert(\n \"There was en error opening the importer. Please contact support if this issue persists.\"\n );\n return;\n }\n\n const child = await this.connection.promise;\n\n // We check to see if this was loaded from either an SDK or snippet that didn't specify a version\n // If it was, this is a legacy snippet/sdk and we should NOT show the redesigned UI\n const loadedFromUnVersionedScript = Array.from(\n document.getElementsByTagName(\"script\")\n ).some(\n (s) =>\n s.src === \"https://unpkg.com/dromo-uploader-js/dist/DromoUploader.js\" ||\n s.src ===\n \"https://cdn.jsdelivr.net/npm/dromo-uploader-js@latest/dist/DromoUploader.js\"\n );\n\n // We need to register the hooks with the widget before we init, because\n // init might go directly to the review screen and we need to make sure\n // the hooks are already registered at that point\n await child.setNumRegisteredRowHooks(this.totalNumRowHooks());\n await child.setNumRegisteredColHooks(this.columnHooks.length);\n await child.setNumRegisteredRowDeleteHooks(this.rowDeleteHooks.length);\n await child.setEmbedInline(this.embedInline);\n\n if (this.fields && this.settings && this.user) {\n const settings = { ...this.settings };\n if (!loadedFromUnVersionedScript) {\n settings.version = settings.version ?? \"v2\";\n }\n settings.browserExcelParsing = settings.browserExcelParsing ?? true;\n\n await child.init(\n this.licenseKey,\n this.fields,\n settings,\n this.user,\n this.appHost\n );\n } else if (this.schemaId) {\n await child.initFromSavedSchema(\n this.licenseKey,\n this.schemaId,\n this.appHost,\n {\n user: this.user,\n developmentMode: this.developmentMode,\n headerRowOverride: this.headerRowOverride,\n }\n );\n } else {\n console.error(\"Invalid Dromo configuration\");\n }\n };\n\n /**\n * Creates the iframe object\n * @internal\n */\n initIFrame = () => {\n let widgetUrl: string;\n\n if (window.DROMO_WIDGET_OVERRIDE) {\n widgetUrl = window.DROMO_WIDGET_OVERRIDE;\n } else if (this.settings?.alternateDomain) {\n const url = new URL(this.settings.alternateDomain);\n widgetUrl = url.protocol + \"//widget.\" + url.host;\n } else if (this.settings?.version === \"v1\") {\n widgetUrl = V1_IFRAME_URL;\n } else {\n widgetUrl = IFRAME_URL;\n }\n\n if (!document.getElementById(this.iframeId)) {\n const iframe = document.createElement(\"iframe\");\n const identifier = this.settings?.importIdentifier ?? this.schemaId;\n iframe.title = identifier\n ? `Dromo Importer: ${identifier}`\n : \"Dromo Importer\";\n iframe.src = widgetUrl;\n iframe.id = this.iframeId;\n iframe.style.height = \"100%\";\n iframe.style.width = \"100%\";\n iframe.style.border = \"0\";\n // @ts-ignore\n iframe.crossorigin = \"anonymous\";\n this.iframe = iframe;\n }\n };\n\n /**\n * Uses Penpal to create a connection with the iframe that was created\n * @internal\n */\n createConnection = () => {\n // eslint-disable-next-line @typescript-eslint/no-this-alias\n const self = this;\n const iframe = this.iframe;\n\n if (!iframe) {\n console.error(\"shim cannot connect to Dromo.\");\n return;\n }\n this.connection = connectToChild<IConnectionMethods>({\n iframe,\n methods: {\n /**\n * Called for each column/field. Sends all data and expects all the\n * relevant column hooks to be evaluated.\n *\n * @param fieldName the fieldname key for the column\n * @param data the full column of data for the particular key\n */\n async handleColumnHooks(\n fieldName: string,\n data: IColumnHookInput[]\n ): Promise<IColumnHookOutput[]> {\n const hooks = self.columnHooks.filter(\n (h) => h.fieldName === fieldName\n );\n return await executeColumnHooks(hooks, data, consoleErrorHandler);\n },\n\n /**\n * Called singularly for each row. Goes through all row hooks and\n * evaluates them.\n *\n * @param data an array of row data objects\n */\n async handleRowHooks(\n data: IRowHookInput[],\n mode: \"init\" | \"update\"\n ): Promise<IRowHookOutputInternal[]> {\n return await executeRowHooks(\n data,\n mode,\n self.rowHooks.map((rh) => rh.callback),\n self.bulkRowHooks,\n consoleErrorHandler\n );\n },\n async handleStepHook(\n step: EStepHook,\n data: IUploadStepData | IReviewStepData\n ) {\n return await executeStepHooks(\n step,\n data,\n self.stepHooks,\n self,\n consoleErrorHandler\n );\n },\n /**\n * Called singularly for each row. Goes through all delete hooks and\n * evaluates them.\n *\n * @param deletedRows - an array of rows deleted from the data\n */\n async handleRowDeleteHooks(\n deletedRows: IRowHookInput[]\n ): Promise<void> {\n // We want to loop through each row independently. Because each\n // row's execution is independent, we can do row by row first vs\n // hook by hook\n await executeRowDeleteHooks(\n deletedRows,\n self.rowDeleteHooks,\n consoleErrorHandler\n );\n },\n async handleBeforeFinishCallback(\n data: Record<string, any>[],\n metadata: IResultMetadataWithValues\n ): Promise<IBeforeFinishOutput> {\n if (self.beforeFinishCallback) {\n return await executeBeforeFinishCallback(\n data,\n metadata,\n self.beforeFinishCallback,\n self,\n consoleErrorHandler\n );\n }\n },\n /**\n * Called after the user has completed the Dromo flow, send the\n * cleaned data to the developer\n *\n * TODO: data cannot be of type any. We need to standardize our return\n * type to be Map<string, any>[]\n * @param data cleaned data after the flow is complete\n */\n async handleResults(\n data: any,\n metadata: IResultMetadata\n ): Promise<void> {\n if (self.resultsCallback) {\n try {\n await self.resultsCallback(data, metadata);\n } catch (err) {\n console.error(\n \"[Dromo-External-Error] There was an error in your onResult callback.\",\n err\n );\n }\n }\n self.close();\n },\n /**\n * Called when the modal has been closed by the finishing of the flow\n */\n handleCloseModal() {\n self.close();\n },\n /**\n * Called when the modal has been closed due to the user canceling the\n * flow\n */\n handleCancel() {\n if (self.cancelCallback) {\n try {\n self.cancelCallback();\n } catch (err) {\n console.error(\n \"[Dromo-External-Error] There was an error in your cancel callback.\",\n err\n );\n }\n }\n self.close();\n },\n },\n });\n };\n\n /**\n * Mounts the iframe in the parent HTML page\n * NOTE: Should be called AFTER the PenPal connection has been created\n * @internal\n */\n mountIFrame = () => {\n if (!document.getElementById(this.iframeId!)) {\n const wrapper = document.createElement(\"div\");\n wrapper.id = this.wrapperId;\n wrapper.style.zIndex = Number.MAX_SAFE_INTEGER.toString();\n wrapper.style.visibility = \"hidden\";\n wrapper.style.width = \"0px\";\n wrapper.style.height = \"0px\";\n wrapper.style.position = \"fixed\";\n wrapper.style.top = \"0px\";\n wrapper.style.left = \"0px\";\n wrapper.style.right = \"0px\";\n wrapper.style.bottom = \"0px\";\n wrapper.appendChild(this.iframe as HTMLIFrameElement);\n document.body.appendChild(wrapper);\n this.wrapper = wrapper;\n }\n };\n\n addIFrameToWrapper = () => {\n if (this.wrapper && this.iframe) {\n this.iframe.style.visibility = \"hidden\";\n this.wrapper.appendChild(this.iframe);\n }\n };\n\n showIframe = () => {\n if (this.iframe) {\n this.iframe.style.visibility = \"visible\";\n }\n };\n\n showWrapper = () => {\n if (this.wrapper) {\n this.wrapper.style.visibility = \"visible\";\n this.wrapper.style.width = \"100%\";\n this.wrapper.style.height = \"100%\";\n document.body.style.overflow = \"hidden\";\n }\n };\n\n /**\n * Function called by the developer to set a callback\n *\n * @param fieldName the key of the column for which we want to trigger the\n * callback\n * @param callback developer defined callback that is callback that is added\n * to a list of column hooks\n */\n registerColumnHook = (\n fieldName: IColumnHook[\"fieldName\"],\n callback: IColumnHook[\"callback\"]\n ) => {\n this.columnHooks.push({\n fieldName: fieldName,\n callback: callback,\n });\n\n // This is kept for the JS version - a user can register after the connection\n // has been made and the modal has been opened. It's bad form, but possible\n if (this.connection) {\n this.connection.promise.then((child) => {\n child.setNumRegisteredColHooks(this.columnHooks.length);\n });\n }\n };\n\n /** @internal */\n totalNumRowHooks = () => {\n return this.rowHooks.length + this.bulkRowHooks.length;\n };\n\n /**\n * Function called by the developer to set a callback\n *\n * @param callback developer defined callback that is added to a list of row\n * hooks\n */\n registerBulkRowHook = (bulkRowHook: IBulkRowHook) => {\n this.bulkRowHooks.push(bulkRowHook);\n\n // This is kept for the JS version - a user can register after the connection\n // has been made and the modal has been opened. It's bad form, but possible\n if (this.connection) {\n this.connection.promise.then((child) => {\n child.setNumRegisteredRowHooks(this.totalNumRowHooks());\n });\n }\n };\n\n /**\n * Function called by the developer to set a callback\n *\n * @param callback developer defined callback that is added to a list of row\n * hooks\n */\n registerRowHook = (callback: IRowHook) => {\n this.rowHooks.push({\n callback: callback,\n });\n\n // This is kept for the JS version - a user can register after the connection\n // has been made and the modal has been opened. It's bad form, but possible\n if (this.connection) {\n this.connection.promise.then((child) => {\n child.setNumRegisteredRowHooks(this.totalNumRowHooks());\n });\n }\n };\n\n /**\n * Function called by the developer to set a callback\n *\n * @param callback developer defined callback that is called per step of the\n * import flow\n */\n registerStepHook = (\n type: IStepHook[\"type\"],\n callback: IStepHook[\"callback\"]\n ) => {\n this.stepHooks.push({ type, callback });\n };\n\n /**\n * Function called by the developer to set a row delete callback\n *\n * @param callback developer defined callback that is called per step of the\n * import flow\n */\n registerRowDeleteHook = (callback: IRowDeleteHook) => {\n this.rowDeleteHooks.push(callback);\n // This is kept for the JS version - a user can register after the connection\n // has been made and the modal has been opened. It's bad form, but possible\n if (this.connection) {\n this.connection.promise.then((child) => {\n child.setNumRegisteredRowDeleteHooks(this.rowDeleteHooks.length);\n });\n }\n };\n\n /**\n * Function called by the developer to set the beforeFinish callback\n *\n * @param callback developer defined callback that is called when the user submits\n */\n beforeFinish = (callback: IBeforeFinishCallback): void => {\n this.beforeFinishCallback = callback;\n };\n\n /**\n * Convenience function for setting all hooks at once.\n *\n * @param hooks object containing all hooks to register\n */\n registerAllHooks = (hooks: IAllHooks): void => {\n if (hooks.columnHooks) {\n for (const { fieldName, callback } of hooks.columnHooks) {\n this.registerColumnHook(fieldName, callback);\n }\n }\n\n if (hooks.rowHooks) {\n for (const rowHook of hooks.rowHooks) {\n this.registerRowHook(rowHook);\n }\n }\n\n if (hooks.bulkRowHooks) {\n for (const bulkRowHook of hooks.bulkRowHooks) {\n this.registerBulkRowHook(bulkRowHook);\n }\n }\n\n if (hooks.rowDeleteHooks) {\n for (const rowDeleteHook of hooks.rowDeleteHooks) {\n this.registerRowDeleteHook(rowDeleteHook);\n }\n }\n\n if (hooks.stepHooks) {\n for (const { type, callback } of hooks.stepHooks) {\n this.registerStepHook(type, callback);\n }\n }\n\n if (hooks.beforeFinishCallback) {\n this.beforeFinish(hooks.beforeFinishCallback);\n }\n };\n\n /**\n * Function called by the developer to set a callback\n *\n * @param callback developer defined callback that is called when the import\n * flow completes\n */\n onResults = (\n callback: (\n data: Record<string, string | number | boolean | null>[],\n metadata: IResultMetadata\n ) => Promise<void> | void\n ) => {\n this.resultsCallback = callback;\n };\n\n /**\n * Function called by the developer to set a callback\n *\n * @param callback developer defined callback that is called when the user\n * cancels the import\n */\n onCancel = (callback: () => void) => {\n this.cancelCallback = callback;\n };\n\n /**\n * Function called by the developer to set or reset the user information\n */\n setUser = async (user: IUser) => {\n this.user = user;\n if (this.connection) {\n const child = await this.connection!.promise;\n await child.setUser(this.user);\n }\n };\n\n /**\n * Function called by the developer to add a field midway through the import\n * process\n */\n addField = async (field: IDeveloperField, position?: IPositionSpec) => {\n if (this.connection) {\n const child = await this.connection!.promise;\n await child.addField(makeFieldSerializable(field), position);\n } else {\n console.error(\"[Dromo-Error] Invalid connection to Dromo Uploader.\");\n }\n };\n\n /**\n * Function called by the developer to remove a field. The data won't appear\n * in the user interface nor in the result data.\n */\n removeField = async (fieldKey: string) => {\n if (this.connection) {\n const child = await this.connection!.promise;\n await child.removeField(fieldKey);\n } else {\n console.error(\"[Dromo-Error] Invalid connection to Dromo Uploader.\");\n }\n };\n\n /**\n * Function called by the developer to add new table messages throughout the\n * import process\n */\n updateInfoMessages = async (messages: IMessagesForCell[]) => {\n if (this.connection) {\n const child = await this.connection!.promise;\n await child.updateInfoMessages(messages);\n } else {\n console.error(\"[Dromo-Error] Invalid connection to Dromo Uploader.\");\n }\n };\n\n /**\n * Function called by the developer to change the matchingStep.headerRowOverride\n * setting from a step hook\n */\n setHeaderRowOverride = async (headerRowOverride: number | null) => {\n this.headerRowOverride = headerRowOverride;\n if (this.connection) {\n const child = await this.connection!.promise;\n await child.setHeaderRowOverride(headerRowOverride);\n }\n };\n\n /**\n * Function called by the developer to change the message displayed when the\n * user clicks 'Finish' on the review screen. Can optionally also override\n * the button text.\n */\n setConfirmationMessage = async (\n messageHTML: string,\n options?: { submitButtonText?: string; cancelButtonText?: string }\n ) => {\n if (this.connection) {\n const child = await this.connection!.promise;\n await child.setConfirmationMessage(messageHTML, options);\n } else {\n console.error(\"[Dromo-Error] Invalid connection to Dromo Uploader.\");\n }\n };\n\n /**\n * Function called by developer called to open the iframe\n */\n open = async () => {\n if (!this.wrapper) {\n this.initIFrame();\n this.createConnection();\n this.mountIFrame();\n }\n\n await this.initChild();\n this.showWrapper();\n };\n\n initInline = async (wrapperIdOrElement: string | HTMLElement) => {\n this.embedInline = true;\n\n try {\n if (wrapperIdOrElement instanceof HTMLElement) {\n this.wrapper = wrapperIdOrElement;\n this.wrapperId = wrapperIdOrElement.id;\n\n if (this.wrapperId === \"\" || this.wrapperId === undefined) {\n this.wrapperId =\n Math.random().toString(36).substring(7) +\n \"-\" +\n DROMO_WRAPPER_SUFFIX;\n }\n }\n\n if (typeof wrapperIdOrElement === \"string\") {\n const wrapperEl = document.getElementById(wrapperIdOrElement);\n\n if (wrapperEl === null) {\n throw new Error(\"WRAPPER_NOT_FOUND\");\n }\n\n this.wrapper = wrapperEl;\n this.wrapperId = wrapperIdOrElement;\n }\n\n if (!this.iframe) {\n this.initIFrame();\n this.createConnection();\n this.addIFrameToWrapper();\n }\n\n await this.initChild();\n this.showIframe();\n } catch (error) {\n if (error.message === \"WRAPPER_NOT_FOUND\") {\n console.error(\n \"[Dromo-Error] Could not find wrapper using provided ID.\"\n );\n }\n\n throw error;\n }\n };\n\n /**\n * Function called by the developer to add rows during the import\n */\n addRows = async (rows: IRowToAdd[]) => {\n if (this.connection) {\n const child = await this.connection!.promise;\n await child.addRows(rows);\n } else {\n console.error(\"[Dromo-Error] Invalid connection to Dromo Uploader.\");\n }\n };\n\n /**\n * Function called by the developer to remove rows\n */\n removeRows = async (rowIds: string[]) => {\n if (this.connection) {\n const child = await this.connection!.promise;\n await child.removeRows(rowIds);\n } else {\n console.error(\"[Dromo-Error] Invalid connection to Dromo Uploader.\");\n }\n };\n\n /**\n * Function called by developer to close the iframe\n */\n close = () => {\n if (this.wrapper) {\n this.wrapper.style.visibility = \"hidden\";\n this.wrapper.style.width = \"0px\";\n this.wrapper.style.height = \"0px\";\n document.body.style.overflow = \"inherit\";\n }\n };\n\n /**\n * Function called by the developer to set developmentMode\n */\n setDevelopmentMode = async (developmentMode: boolean) => {\n this.developmentMode = developmentMode;\n if (this.connection) {\n const child = await this.connection!.promise;\n await child.setDevelopmentMode(this.developmentMode);\n }\n };\n\n /**\n * @internal\n */\n static rehydrateHeadless = async ({\n licenseKey,\n headlessImportId,\n fields,\n settings,\n hooks,\n rehydrateState,\n }: {\n licenseKey: string;\n headlessImportId: string;\n fields: IDeveloperField[];\n settings: IDeveloperSettings;\n hooks: IAllHooks;\n rehydrateState: any;\n }): Promise<DromoUploader> => {\n const headlessUser: IUser = { id: \"headless-review\" };\n const dromo = new DromoUploader(licenseKey, fields, settings, headlessUser);\n dromo.registerAllHooks(hooks);\n await dromo.rehydrate(rehydrateState, headlessImportId);\n dromo.open();\n return dromo;\n };\n\n /**\n * @internal\n */\n rehydrate = async (rehydrateState: any, headlessImportId: string) => {\n if (!this.wrapper) {\n this.initIFrame();\n this.createConnection();\n this.mountIFrame();\n }\n await this.initChild();\n const child = await this.connection!.promise;\n await child.rehydrate(rehydrateState, headlessImportId);\n this.showWrapper();\n };\n\n /**\n * @internal\n */\n checkCloneable(values: Record<string, any>): void {\n if (typeof structuredClone !== \"function\") return;\n\n const notCloneable = Object.entries(values)\n .filter(([_name, value]) => {\n try {\n structuredClone(value);\n return false;\n } catch (e) {\n return true;\n }\n })\n .map(([name]) => name);\n\n if (notCloneable.length > 0) {\n const badValues = notCloneable.join(\", \");\n throw new Error(\n `[Dromo-External-Error] The Dromo importer received non-cloneable parameters: ${badValues}. See https://dromo.dev/err/clone`\n );\n }\n }\n}\n\nexport {\n ITableMessage,\n IMessagesForCell,\n IColumnHook,\n IColumnHookInput,\n IColumnHookOutput,\n IRowHook,\n IRowHookInput,\n IRowHookOutput,\n IDeveloperField,\n IDeveloperSettings,\n IDeveloperStyleOverrides,\n IUser,\n IValidatorField,\n IRowHookOutputInternal,\n IResultMetadata,\n IReviewStepData,\n IStepHook,\n IUploadStepData,\n IRowDeleteHook,\n IBulkRowHook,\n IBeforeFinishCallback,\n IBeforeFinishOutput,\n IPositionSpec,\n IConnectionMethods,\n ISelectField,\n IImporterOptions,\n IAllHooks,\n};\n"],"names":["__assign","Object","assign","t","s","i","n","arguments","length","p","prototype","hasOwnProperty","call","apply","this","__awaiter","thisArg","_arguments","P","generator","Promise","resolve","reject","fulfilled","value","step","next","e","rejected","result","done","then","__generator","body","f","y","g","_","label","sent","trys","ops","verb","throw","return","Symbol","iterator","v","op","TypeError","pop","push","EventTypes","MessageType","Resolution","ErrorCode","NativeErrorName","NativeEventType","IFRAME_URL","DEFAULT_PORT_BY_PROTOCOL","http:","https:","URL_REGEX","opaqueOriginSchemes","serializeError","name","message","stack","id","callSender","info","methodNames","destroyConnection","log","localName","local","remote","originForSending","originForReceiving","destroyed","createMethodProxy","methodName","args","iframeRemoved","closed","error","Error","code","ConnectionDestroyed","generateId","handleMessageEvent","event","source","data","penpal","Reply","origin","replyMessage","removeEventListener","Message","returnValue","returnValueIsError","obj","deserializedError","keys","forEach","key","deserializeError","resolution","Fulfilled","addEventListener","callMessage","Call","postMessage","reduce","api","methods","childOrigin","destructor","destroy","onDestroy","destroyCallReceiver","receiverMethodNames","window","createPromiseHandler","Rejected","err","DataCloneError","errorReplyMessage","connectCallReceiver","receiverMethodName","destroyCallSender","connectCallSender","options","iframe","timeout","debug","console","createLogger","callbacks","[object Object]","callback","createDestructor","src","srcdoc","NoIframeSrc","validateIframeHasSrcOrSrcDoc","find","scheme","startsWith","location","document","regexResult","exec","protocol","hostname","port","getOriginFromSrc","handleSynMessage","synAckMessage","SynAck","handleSynMessageFactory","handleAckMessage","handleAckMessageFactory","promise","stopConnectionTimeout","timeoutId","undefined","setTimeout","ConnectionTimeout","clearTimeout","startConnectionTimeout","handleMessage","contentWindow","Syn","Ack","checkIframeInDocIntervalId","setInterval","isConnected","clearInterval","monitorIframeRemoval","consoleErrorHandler","hookType","setHookTimer","warn","clearHookTimer","executeColumnHooks","hooks","errorHandler","changes","Map","tmpData","map","d","previousHookPromise","currentHook","timerId","hookResponse","_a","hookOutput","change","index","set","err_1","columnHookOutput","fieldOutputEmpty","fieldOutput","selectOptions","manyToOne","executeRowHooks","mode","rowHooks","bulkRowHooks","inputRowMap","inputRow","mutateInputDataWithChanges","rowIndex","rowOutput","get","fieldName","inputRowField","row","inputFieldIsManyToOne","Array","isArray","outputFieldIsManyToOne","rowChanges","cellChange","fieldChanges","fieldOutputCell","manyToOneCellChange","rowDataField","inputRowDataField","_b","entries","_i","_c","bulkRowHooks_1","bulkRowHook","hookOutput_1","err_2","all","rowInput","rowHooks_1","rowHook","err_3","finalChanges","executeRowDeleteHooks","deletedRows","rowDeleteHooks","rowData","err_4","executeStepHooks","stepHooks","instance","hook","type","err_5","executeBeforeFinishCallback","metadata","beforeFinishCallback","err_6","DROMO_WRAPPER_SUFFIX","makeFieldSerializable","field","newField","validators","validator","validate","regex","RegExp","regexOptions","ignoreCase","flags","includes","dotAll","multiline","unicode","licenseKey","fieldsOrSchemaId","settings","user","connection","alert","child","_d","loadedFromUnVersionedScript","from","getElementsByTagName","some","setNumRegisteredRowHooks","totalNumRowHooks","setNumRegisteredColHooks","columnHooks","setNumRegisteredRowDeleteHooks","setEmbedInline","embedInline","fields","version","browserExcelParsing","init","appHost","schemaId","initFromSavedSchema","developmentMode","headerRowOverride","widgetUrl","DROMO_WIDGET_OVERRIDE","_this","alternateDomain","url","URL","host","getElementById","iframeId","createElement","identifier","importIdentifier","title","style","height","width","border","crossorigin","self","connectToChild","handleColumnHooks","filter","h","handleRowHooks","rh","handleStepHook","handleRowDeleteHooks","handleBeforeFinishCallback","handleResults","resultsCallback","close","handleCloseModal","handleCancel","cancelCallback","wrapper","wrapperId","zIndex","Number","MAX_SAFE_INTEGER","toString","visibility","position","top","left","right","bottom","appendChild","overflow","registerColumnHook","_e","registerRowHook","_g","_f","registerBulkRowHook","_j","_h","rowDeleteHook","registerRowDeleteHook","_l","_k","_m","registerStepHook","beforeFinish","setUser","addField","fieldKey","removeField","messages","updateInfoMessages","setHeaderRowOverride","messageHTML","setConfirmationMessage","initIFrame","createConnection","mountIFrame","initChild","showWrapper","wrapperIdOrElement","HTMLElement","Math","random","substring","wrapperEl","addIFrameToWrapper","showIframe","error_1","rows","addRows","rowIds","removeRows","setDevelopmentMode","rehydrateState","headlessImportId","rehydrate","checkCloneable","DromoUploader","values","structuredClone","notCloneable","badValues","join","dromo","registerAllHooks","open"],"mappings":"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"}
|
package/dist/interfaces.d.ts
CHANGED
|
@@ -548,8 +548,12 @@ export interface IConnectionMethods {
|
|
|
548
548
|
rehydrate: (rehydrateState: any, headlessImportId?: string) => void;
|
|
549
549
|
addRows: (rows: IRowToAdd[]) => void;
|
|
550
550
|
removeRows: (rowIds: string[]) => void;
|
|
551
|
+
setConfirmationMessage: (messageHTML: string, options?: {
|
|
552
|
+
submitButtonText?: string;
|
|
553
|
+
cancelButtonText?: string;
|
|
554
|
+
}) => void;
|
|
551
555
|
}
|
|
552
|
-
export type IPublicConnectionMethods = Pick<IConnectionMethods, "addField" | "updateInfoMessages" | "setHeaderRowOverride" | "setUser" | "removeField" | "setDevelopmentMode" | "addRows" | "removeRows">;
|
|
556
|
+
export type IPublicConnectionMethods = Pick<IConnectionMethods, "addField" | "updateInfoMessages" | "setHeaderRowOverride" | "setUser" | "removeField" | "setDevelopmentMode" | "addRows" | "removeRows" | "setConfirmationMessage">;
|
|
553
557
|
export type IDeveloperFieldType = "string" | "checkbox" | "select" | "number" | "domain" | "date" | "ssn" | "datetime" | "phone-number" | "time" | "url" | "us-zip-code" | "country" | "uuid" | "us-state-territory" | "email";
|
|
554
558
|
export interface ICellRef {
|
|
555
559
|
rowIndex: number;
|
|
@@ -669,7 +673,8 @@ export type IResultMetadataWithValues = ResultMetadata<IErrorWithValue>;
|
|
|
669
673
|
export declare enum EStepHook {
|
|
670
674
|
UPLOAD_STEP = "UPLOAD_STEP",
|
|
671
675
|
REVIEW_STEP = "REVIEW_STEP",
|
|
672
|
-
REVIEW_STEP_POST_HOOKS = "REVIEW_STEP_POST_HOOKS"
|
|
676
|
+
REVIEW_STEP_POST_HOOKS = "REVIEW_STEP_POST_HOOKS",
|
|
677
|
+
REVIEW_STEP_PRE_SUBMIT = "REVIEW_STEP_PRE_SUBMIT"
|
|
673
678
|
}
|
|
674
679
|
export interface IUploadStepData {
|
|
675
680
|
filename: string | null;
|
|
@@ -688,6 +693,12 @@ export interface IReviewStepPostHooksData {
|
|
|
688
693
|
};
|
|
689
694
|
fields: IFieldMetadata;
|
|
690
695
|
}
|
|
696
|
+
export interface IReviewStepPreSubmitData {
|
|
697
|
+
headerMapping: {
|
|
698
|
+
[header: string]: string | undefined;
|
|
699
|
+
};
|
|
700
|
+
fields: IFieldMetadata;
|
|
701
|
+
}
|
|
691
702
|
export interface IStepHook {
|
|
692
703
|
type: keyof typeof EStepHook;
|
|
693
704
|
callback: (uploader: IPublicConnectionMethods, data: IUploadStepData | IReviewStepData | IReviewStepPostHooksData) => MaybeAsync<void>;
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "dromo-uploader-js",
|
|
3
|
-
"version": "2.1.
|
|
3
|
+
"version": "2.1.4",
|
|
4
4
|
"description": "Easy to use data (CSV, TSV, Excel) importer",
|
|
5
5
|
"author": "ankitgoyal100",
|
|
6
6
|
"license": "MIT",
|
|
@@ -13,10 +13,6 @@
|
|
|
13
13
|
"serve": "serve -l 5050 dist"
|
|
14
14
|
},
|
|
15
15
|
"dependencies": {
|
|
16
|
-
"@sentry/browser": "^5.29.2",
|
|
17
|
-
"@sentry/integrations": "^5.29.2",
|
|
18
|
-
"@sentry/react": "^5.29.0",
|
|
19
|
-
"@sentry/tracing": "^5.29.2",
|
|
20
16
|
"penpal": "^5.3.0"
|
|
21
17
|
},
|
|
22
18
|
"devDependencies": {
|