/*! * Tiny Commercial License Key Manager * * Copyright (c) 2025 Ephox Corporation DBA Tiny Technologies, Inc. * Licensed under the Tiny commercial license. See https://www.tiny.cloud/legal/ * * Version: 8.3.0-112 */ (function () { "use strict"; const e = Object.getPrototypeOf; const r = (e, r, t) => !!t(e, r.prototype) || e.constructor?.name === r.name; const t = (e) => (t) => ((e) => { const t = typeof e; if (e === null) { return "null"; } else if (t === "object" && Array.isArray(e)) { return "array"; } else if (t === "object" && r(e, String, (e, r) => r.isPrototypeOf(e))) { return "string"; } else { return t; } })(t) === e; const n = (e) => (r) => typeof r === e; const o = t("string"); const s = t("object"); const a = (t) => ((t, n) => s(t) && r(t, n, (r, t) => e(r) === t))(t, Object); const i = n("boolean"); const l = (e) => e == null; const c = (e) => !l(e); const u = n("function"); const y = n("number"); const d = () => {}; const g = (e) => () => e; const p = (e) => e; const h = (e) => e(); const m = g(false); const v = g(true); class f { tag; value; static singletonNone = new f(false); constructor(e, r) { this.tag = e; this.value = r; } static some(e) { return new f(true, e); } static none() { return f.singletonNone; } fold(e, r) { if (this.tag) { return r(this.value); } else { return e(); } } isSome() { return this.tag; } isNone() { return !this.tag; } map(e) { if (this.tag) { return f.some(e(this.value)); } else { return f.none(); } } bind(e) { if (this.tag) { return e(this.value); } else { return f.none(); } } exists(e) { return this.tag && e(this.value); } forall(e) { return !this.tag || e(this.value); } filter(e) { if (!this.tag || e(this.value)) { return this; } else { return f.none(); } } getOr(e) { if (this.tag) { return this.value; } else { return e; } } or(e) { if (this.tag) { return this; } else { return e; } } getOrThunk(e) { if (this.tag) { return this.value; } else { return e(); } } orThunk(e) { if (this.tag) { return this; } else { return e(); } } getOrDie(e) { if (this.tag) { return this.value; } throw new Error(e ?? "Called getOrDie on None"); } static from(e) { if (c(e)) { return f.some(e); } else { return f.none(); } } getOrNull() { if (this.tag) { return this.value; } else { return null; } } getOrUndefined() { return this.value; } each(e) { if (this.tag) { e(this.value); } } toArray() { if (this.tag) { return [this.value]; } else { return []; } } toString() { if (this.tag) { return `some(${this.value})`; } else { return "none()"; } } } const k = Array.prototype.indexOf; const b = Object.keys; const w = Object.hasOwnProperty; const O = (e, r) => (_(e, r) ? f.from(e[r]) : f.none()); const _ = (e, r) => w.call(e, r); const T = (e) => { const r = (r) => r(e); const t = g(e); const n = () => o; const o = { tag: true, inner: e, fold: (r, t) => t(e), isValue: v, isError: m, map: (r) => K.value(r(e)), mapError: n, bind: r, exists: r, forall: r, getOr: t, or: n, getOrThunk: t, orThunk: n, getOrDie: t, each: (r) => { r(e); }, toOptional: () => f.some(e), }; return o; }; const $ = (e) => { const r = () => t; const t = { tag: false, inner: e, fold: (r, t) => r(e), isValue: m, isError: v, map: r, mapError: (r) => K.error(r(e)), bind: r, exists: m, forall: v, getOr: p, or: p, getOrThunk: h, orThunk: h, getOrDie: ((n = String(e)), () => { throw new Error(n); }), each: d, toOptional: f.none, }; var n; return t; }; const K = { value: T, error: $, fromOption: (e, r) => e.fold(() => $(r), T), }; E = (e, r) => (a(e) && a(r) ? j(e, r) : r); const j = (...e) => { if (e.length === 0) { throw new Error("Can't merge zero objects"); } const r = {}; for (let t = 0; t < e.length; t++) { const n = e[t]; for (const e in n) { if (_(n, e)) { r[e] = E(r[e], n[e]); } } } return r; }; var E; const S = (e, r) => { const { type: t, message: n } = r; e.notificationManager.open({ type: t, text: n, }); }; const C = (e, r) => { const { console: t, editor: n } = r; if (c(n)) { if (e._skinLoaded) { S(e, n); } else { e.on("SkinLoaded", () => { S(e, n); }); } } if (c(t)) { ((e) => { ((e) => { switch (e) { case "error": return console.error; case "info": return console.info; case "warn": return console.warn; default: return console.log; } })(e.type)(e.message); })(t); } }; const M = (e) => parseInt(e, 10); const x = (e, r) => { const t = e - r; if (t === 0) { return 0; } else if (t > 0) { return 1; } else { return -1; } }; const P = (e, r, t) => ({ major: e, minor: r, patch: t, }); const A = (e) => { const r = /([0-9]+)\.([0-9]+)\.([0-9]+)(?:(\-.+)?)/.exec(e); if (r) { return P(M(r[1]), M(r[2]), M(r[3])); } else { return P(0, 0, 0); } }; const N = (e, r) => !!e && ((e, r) => { const t = x(e.major, r.major); if (t !== 0) { return t; } const n = x(e.minor, r.minor); if (n !== 0) { return n; } const o = x(e.patch, r.patch); if (o !== 0) { return o; } else { return 0; } })( ((e) => A( ((e) => [e.majorVersion, e.minorVersion] .join(".") .split(".") .slice(0, 3) .join("."))(e), ))(e), A(r), ) === -1; const V = A("8.3.0"); const I = `${V.major}.${V.minor}.0`; const U = `${V.major + 1}.0.0`; const q = new WeakMap(); const D = (e) => {}; const R = (e, r = true) => `${e}${r ? " Read more: https://www.tiny.cloud/docs/tinymce/latest/license-key/" : ""}`; const z = (e, r, t, n) => { const o = c(n) ? `, status: ${n}` : ""; if (r === "fallback") { C(e, { console: { type: "warn", message: R( `The API key could not be validated by the API key validation server [type: ${t}${o}]. Attempting fallback to provided license key.`, ), }, }); } else { const r = "The editor is disabled because the API key could not be validated by the API key validation server"; C(e, { console: { type: "error", message: R(`${r} [type: ${t}${o}].`), }, editor: { type: "warning", message: `${r}.`, }, }); } }; const L = (e) => (r) => r.options.get(e); const F = L("license_key"); const W = L("online_license_key"); var J; (function (e) { e[(e.Error = 0)] = "Error"; e[(e.Value = 1)] = "Value"; })((J ||= {})); const B = (e, r, t) => (e.stype === J.Error ? r(e.serror) : t(e.svalue)); const G = (e) => ({ stype: J.Value, svalue: e, }); const H = (e) => ({ stype: J.Error, serror: e, }); const Q = B; const X = (e, r) => H([ { path: e, getErrorInfo: r, }, ]); const Y = (e) => ({ extract: (r, t) => { o = (e) => ((e, r) => X(e, g(r)))(r, e); if ((n = e(t)).stype === J.Error) { return o(n.serror); } else { return n; } var n; var o; }, toString: g("val"), }); const Z = (e, r) => Y((t) => { const n = typeof t; if (e(t)) { return G(t); } else { return H(`Expected type: ${r} but got: ${n}`); } }); const ee = Z(y, "number"); const re = Z(o, "string"); const te = Z(i, "boolean"); const ne = (e, r, t) => { switch (e.tag) { case "field": return r(e.key, e.newKey, e.presence, e.prop); case "custom": return t(e.newKey, e.instantiator); } }; const oe = (e, r, t, n) => n(O(e, r).getOrThunk(() => t(e))); const se = (e, r, t, n, o) => { const a = (e) => o.extract(r.concat([n]), e); const i = (e) => e.fold( () => G(f.none()), (e) => { t = o.extract(r.concat([n]), e); s = f.some; if (t.stype === J.Value) { return { stype: J.Value, svalue: s(t.svalue), }; } else { return t; } var t; var s; }, ); switch (e.tag) { case "required": return ((e, r, t, n) => O(r, t).fold( () => ((e, r, t) => X(e, () => { return ( 'Could not find valid *required* value for "' + r + '" in ' + (s((e = t)) && b(e).length > 100 ? " removed due to size" : JSON.stringify(e, null, 2)) ); var e; }))(e, t, r), n, ))(r, t, n, a); case "defaultedThunk": return oe(t, n, e.process, a); case "option": return ((e, r, t) => t(O(e, r)))(t, n, i); case "defaultedOptionThunk": return ((e, r, t, n) => n(O(e, r).map((r) => (r === true ? t(e) : r))))( t, n, e.process, i, ); case "mergeWithThunk": return oe(t, n, g({}), (r) => { const n = j(e.process(t), r); return a(n); }); } }; const ae = (e) => ({ extract: (r, t) => ((e, r, t) => { const n = {}; const o = []; for (const s of t) { ne( s, (t, s, a, i) => { const l = se(a, e, r, t, i); Q( l, (e) => { o.push(...e); }, (e) => { n[s] = e; }, ); }, (e, t) => { n[e] = t(r); }, ); } if (o.length > 0) { return H(o); } else { return G(n); } })(r, t, e), toString: () => { const r = ((e, r) => { const t = e.length; const n = new Array(t); for (let o = 0; o < t; o++) { const t = e[o]; n[o] = r(t); } return n; })(e, (e) => ne( e, (e, r, t, n) => e + " -> " + n.toString(), (e, r) => "state(" + e + ")", ), ); return "obj{\n" + r.join("\n") + "}"; }, }); const ie = (e, r, t) => { n = ((e, r, t) => ((e) => e.stype === J.Error ? { stype: J.Error, serror: ((e) => ({ input: t, errors: e, }))(e.serror), } : e)(r.extract([e], t)))(e, r, t); return B(n, K.error, K.value); var n; }; const le = (e, r, t, n) => ({ tag: "field", key: e, newKey: r, presence: t, prop: n, }); const ce = (e, r) => le( e, e, { tag: "required", process: {}, }, r, ); const ue = (e) => ce(e, re); const ye = (e) => ce(e, te); const de = (e, r) => ((e, r) => le( e, e, { tag: "option", process: {}, }, r, ))(e, ae(r)); const ge = (e, r, t) => ((e, r, t) => le( e, e, ((e) => ({ tag: "defaultedThunk", process: g(e), }))(r), t, ))( e, r, ((e) => { r = (r) => { t = e; n = r; if (k.call(t, n) > -1) { return K.value(r); } else { return K.error( `Unsupported value: "${r}", choose one of "${e.join(", ")}".`, ); } var t; var n; }; return Y((e) => r(e).fold(H, G)); var r; })(t), ); const pe = [ de("console", [ ge("type", "warn", ["error", "warn", "log", "info"]), ue("message"), ]), de("editor", [ ge("type", "warning", ["error", "warning", "info", "success"]), ue("message"), ]), ]; const he = [ye("ok"), ue("id"), ue("key"), de("message", pe)]; const me = [ye("ok"), ce("status", ee), ue("name"), de("message", pe)]; var ve; var fe; var ke; (ke = ve ||= {}).Timeout = "get_license_online_timeout_error"; ke.Missing = "get_license_online_missing_error"; ke.ParseResponse = "get_license_online_parse_response_error"; ke.Invalid = "get_license_online_invalid_error"; ke.Server = "get_license_online_server_error"; ke.Unknown = "get_license_online_unknown_error"; (fe ||= {}).NoKeySpecified = "get_license_no_key_specified"; const be = async (e, r, t, n = 30000) => { const o = (r, n, o) => t.fold( () => { z(e, "readonly", n, o); return K.error({ type: n, }); }, (t) => { z(e, r, n, o); if (r === "readonly") { return K.error({ type: n, }); } else { return K.value(t); } }, ); a = r.then( (r) => ((e) => { const r = s(e) && e.ok === true ? he : me; return ie("onlicenseKeyResult", ae(r), e); })(r) .mapError((r) => { z(e, "readonly", ve.ParseResponse); return { type: ve.ParseResponse, }; }) .bind((r) => { if (r.ok) { r.message .map((e) => ({ console: e.console.getOrUndefined(), editor: e.editor.getOrUndefined(), })) .each((r) => { C(e, r); }); return K.value(r.key); } { const t = r.status >= 400 && r.status < 500; const n = t ? ve.Invalid : ve.Server; r.message .map((e) => ({ console: e.console.getOrUndefined(), editor: e.editor.getOrUndefined(), })) .each((r) => { C(e, r); }); return o(t ? "readonly" : "fallback", n, r.status); } }), (r) => { if (c(r)) { try { C(e, { console: { type: "error", message: String(r), }, }); } catch (e) {} } const t = ve.Unknown; return o("fallback", t); }, ); i = n; l = () => { const e = ve.Timeout; return o("fallback", e); }; return new Promise((e, r) => { const t = setTimeout(() => e(l()), i); a.then(e, r).finally(() => { clearTimeout(t); }); }); var a; var i; var l; }; const we = async (e, r) => { const t = ((e) => { const { configKey: r, onlineKey: t } = e; if (l(t)) { if (l(r)) { return { type: "reportNoKey", }; } else { return { type: "useConfigKey", key: r, }; } } else if (l(r)) { return { type: "useOnlineKey", key: t, }; } else { return { type: "tryOnlineKeyPossibleFallback", configKey: r, onlineKey: t, }; } })({ configKey: F(e), onlineKey: W(e), }); switch (t.type) { case "reportNoKey": ((e) => { const r = "The editor is disabled because a TinyMCE license key has not been provided"; C(e, { console: { type: "error", message: R( `${r}. Make sure to provide a valid license key or add license_key: 'gpl' to the init config to agree to the open source license terms.`, ), }, editor: { type: "warning", message: `${r}.`, }, }); })(e); return K.error({ type: fe.NoKeySpecified, }); case "useConfigKey": { const { key: e } = t; return K.value(e); } case "useOnlineKey": { const { key: n } = t; return be(e, n, f.none(), r); } case "tryOnlineKeyPossibleFallback": { const { onlineKey: n, configKey: o } = t; return be(e, n, f.some(o), r); } } }; const Oe = (e, r) => { const t = ((e) => { let r; let t = false; return (...n) => { if (!t) { t = true; r = e.apply(null, n); } return r; }; })(we); a = e; const n = { validate: async () => D(a), }; var a; const i = ((e) => { let r = false; return { validate: async (t, n) => { var a; return ( s((a = n)) ? O(a, "plugin").filter((e) => o(e) && e.length > 0) : f.none() ).forall((t) => { var n; n = r; C(e, { console: { type: "error", message: R( `The "${t}" plugin requires a valid TinyMCE license key.`, ), }, ...(n ? {} : { editor: { type: "warning", message: "One or more premium plugins are disabled due to license key restrictions.", }, }), }); r = true; return false; }); }, }; })(e); const l = (async (e, r) => { try { return await (async (e, r) => { const t = `${r}/js/commerciallicensekeymanager${e.suffix}.js`; var n; return ( await ((n = t), tinymce.Resource.load("licensekeymanager.6nle0b3ulk", n)) )(e); })(e, r); } catch (r) { console.error(r); ((e) => { const r = "The editor is disabled because the TinyMCE license key could not be validated"; C(e, { console: { type: "error", message: R( `${r}. The TinyMCE Commercial License Key Manager plugin was unable to load additional required resources.`, ), }, editor: { type: "warning", message: `${r}.`, }, }); })(e); return { validate: async () => D(e), }; } })(e, r); return Object.freeze({ validate: Object.freeze(async (r) => { const o = (await t(e)).fold( () => ({ type: "none", }), (e) => e.toLowerCase() === "gpl" ? { type: "gpl", key: "gpl", } : { type: "commercial", key: e, }, ); switch (o.type) { case "none": return n.validate(r); case "gpl": { const { key: e } = o; return i.validate(e, r); } case "commercial": { const { key: e } = o; return (await l).validate(e, r); } } }), }); }; var _e; var Te; _e = tinymce; Te = "licensekeymanager"; if ( N(_e, I) ? (console.error( `The "${Te}" plugin requires at least version ${I} of TinyMCE.`, ), 0) : N(_e, U) || (console.error( `The "${Te}" plugin requires at least version ${I} of TinyMCE but less than ${U}.`, ), 0) ) { tinymce._addLicenseKeyManager((e, r) => { var t; (0, (t = e).options.register)("online_license_key", { processor: (e) => { var r; return { valid: true, }; }, immutable: true, }); const n = Oe(e, r); n.validate(e); return n; }); } })();