(() => {
var COMMON_EMBED_COMMANDS = {
navigate: async (app, url) => {
if (await app.navigate(url)) return !0;
try {
return window.open(url, "_blank") != null;
} catch {
return !1;
}
},
prompt: async (app, ...args) => await app.prompt(...args),
alert: async (app, ...args) => await app.alert(...args),
getSettings: async (app) => app.settings,
setSetting: async (app, key, value) => app.setSetting(key, value),
getNoteTitleByUUID: async (app, noteUUID) => {
var _a;
return (_a = await app.notes.find(noteUUID)) == null ? void 0 : _a.name;
},
getNoteContentByUUID: async (app, noteUUID) => await app.notes.find(noteUUID) ? await app.getNoteContent({ uuid: noteUUID }) : null,
getNoteBacklinksByUUID: async (app, noteUUID) => {
var _a;
return await ((_a = await app.notes.find(noteUUID)) == null ? void 0 : _a.backlinks());
},
getNoteTagsByUUID: async (app, noteUUID) => {
var _a;
return (_a = await app.notes.find(noteUUID)) == null ? void 0 : _a.tags;
},
getNoteSections: async (app, ...args) => await app.getNoteSections(...args),
insertTask: async (app, ...args) => await app.insertTask(...args),
updateTask: async (app, ...args) => await app.updateTask(...args),
createNote: async (app, ...args) => await app.createNote(...args),
deleteNote: async (app, ...args) => await app.deleteNote(...args),
replaceNoteContent: async (app, ...args) => await app.replaceNoteContent(...args),
setNoteName: async (app, ...args) => await app.setNoteName(...args),
addNoteTag: async (app, ...args) => await app.addNoteTag(...args),
removeNoteTag: async (app, ...args) => await app.removeNoteTag(...args),
insertNoteContent: async (app, ...args) => await app.insertNoteContent(...args),
getTaskDomains: async (app) => await app.getTaskDomains(),
getTaskDomainTasks: async (app, ...args) => await app.getTaskDomainTasks(...args),
getTask: async (app, ...args) => await app.getTask(...args),
findNote: async (app, ...args) => await app.findNote(...args),
filterNotes: async (app, ...args) => await app.filterNotes(...args),
saveFile: async (app, ...args) => {
try {
let { name, data } = args[0];
return data.startsWith("data:") && (data = await (await fetch(data)).blob()), await app.saveFile(data, name);
} catch (e) {
throw e.message;
}
}
};
function createOnEmbedCallHandler(embedCommands = {}, logBlacklistedCommands = []) {
return async function(app, commandName, ...args) {
try {
if (commandName in embedCommands) {
let result = await embedCommands[commandName](app, ...args);
return logBlacklistedCommands.includes(commandName) || console.log("onEmbedCall:", commandName, args, result), result;
}
} catch (e) {
throw app.alert("Error:", e.message || e), console.error("onEmbedCall:", commandName, args, e), e;
}
throw new Error(`Unknown command: ${commandName}`);
};
}
var addScriptToHtmlString = (htmlString, scriptContent) => {
let doc = new DOMParser().parseFromString(htmlString, "text/html"), script = doc.createElement("script");
script.textContent = scriptContent;
let head = doc.head;
return head.firstChild ? head.insertBefore(script, head.firstChild) : head.appendChild(script), doc.documentElement.outerHTML.replaceAll("\\x3Cscript>", () => "<script>");
}, addWindowVariableToHtmlString = (htmlString, variableName, variableValue) => {
let scriptContent = `window.${variableName} = ${JSON.stringify(variableValue)};`;
return addScriptToHtmlString(htmlString, scriptContent);
};
var emoji_default = `<html lang="en">
<head>
<title>Emoji</title>
</head>
<body>
<div class="app-container"></div>
<script>(() => {
// package.json
var package_default = {
name: "amplenote-plugin-dev-env",
author: "debajandhar12",
version: "1.0.0",
type: "module",
repository: "https://github.com/debanjandhar12/my-amplenote-plugins-v2",
dependencies: {
"@ai-sdk/anthropic": "1.2.10",
"@ai-sdk/fireworks": "0.2.13",
"@ai-sdk/google": "1.2.14",
"@ai-sdk/groq": "1.2.8",
"@ai-sdk/openai": "1.3.21",
"@assistant-ui/react": "0.7.65",
"@assistant-ui/react-markdown": "0.7.16",
"@debanjandhar12/markmap-lib": "0.17.0-mod.3",
"@debanjandhar12/markmap-toolbar": "0.17.0-mod.3",
"@debanjandhar12/markmap-view": "0.17.0-mod.3",
"@duckdb/duckdb-wasm": "1.29.1-dev269.0",
"@emoji-mart/data": "^1.2.1",
"@emoji-mart/react": "^1.1.1",
"@huggingface/transformers": "3.2.4",
"@omnivore-app/api": "^1.0.4",
"@pinecone-database/pinecone": "4.1.0",
"@radix-ui/react-icons": "1.3.2",
"@radix-ui/themes": "3.2.0",
"@yiuayiu/telegram-markdown-escape": "^0.0.2-1",
ai: "4.3.13",
"apache-arrow": "^20.0.0",
"async-mutex": "0.5.0",
"chart.js": "^4.4.3",
"d3-svg-to-png": "^0.3.1",
"date-fns": "^3.6.0",
dayjs: "1.11.13",
"easy-web-worker": "7.0.2",
"emoji-mart": "^5.6.0",
"fast-dotproduct": "1.3.0",
fflate: "0.8.2",
fparser: "^3.1.0",
"fuse.js": "7.0.0",
idb: "8.0.2",
"iconv-lite": "^0.6.3",
"lodash-es": "^4.17.21",
luxon: "^3.4.4",
"markdown-it": "^14.1.0",
"mdast-util-to-string": "4.0.0",
"my-ample-plugin-external": "1.0.29",
nanoid: "^5.0.7",
"ollama-ai-provider": "1.2.0",
"parquetjs-lite": "^0.8.7",
react: "18.2.0",
"react-dom": "18.2.0",
"react-error-boundary": "5.0.0",
"react-string-diff": "0.2.0",
"react-virtuoso": "4.12.5",
"react-window": "1.8.11",
"remark-frontmatter": "5.0.0",
"remark-gfm": "4.0.0",
"remark-parse": "11.0.0",
"scheduler-polyfill": "^1.3.0",
stopword: "^3.1.5",
tributejs: "5.1.3",
unified: "11.0.0",
"unist-util-visit": "5.0.0",
"unist-util-visit-parents": "6.0.1",
zod: "3.23.8"
},
devDependencies: {
"@huggingface/transformers": "3.2.4",
"@playwright/test": "^1.49.1",
"@testing-library/jest-dom": "^6.5.0",
"@testing-library/react": "^16.0.1",
"@types/jest": "^29.5.0",
"core-js": "^3.38.1",
cors: "^2.8.5",
"cross-fetch": "^4.0.0",
dotenv: "^16.0.3",
esbuild: "0.25.3",
"esbuild-jest2": "0.6.7",
"esbuild-plugin-external-global": "^1.0.1",
"esbuild-plugins-node-modules-polyfill": "1.7.0",
express: "^5.0.1",
"isomorphic-fetch": "^3.0.0",
jest: "^29.5.0",
"jest-environment-jsdom": "^29.5.0",
"jest-html-reporter": "^4.1.0",
jsdom: "^24.1.0",
"make-synchronous": "^1.0.0",
"node-fetch": "4.0.0-beta.4",
"p-retry": "6.2.1",
playwright: "^1.49.1"
},
scripts: {
test: "jest --testPathPattern=src-bigmoji",
"test:watch": "jest --testPathPattern=src-bigmoji --watch",
"build:prod": "NODE_ENV=production node esbuild.js $(pwd)/src-bigmoji",
"build:dev": "node esbuild.js $(pwd)/src-bigmoji --watch --server"
}
};
// common-utils/dynamic-import-esm.js
var dynamicImportExternalPluginBundle = async (fileName) => {
let packageVersion = package_default.dependencies["my-ample-plugin-external"], pkg = \`my-ample-plugin-external/dist/\${fileName}\`, cdnList = getCDNList(pkg), abortController = new AbortController(), importPromises = cdnList.map(async (cdn, index) => {
let url = buildCDNUrl(cdn, pkg, packageVersion);
if (index > 0 && await new Promise((resolve) => setTimeout(resolve, 1e3)), abortController.signal.aborted)
throw new Error(\`Terminating as \${pkg} has already been imported\`);
return import(url).then((module) => {
if (abortController.signal.aborted)
throw new Error(\`Terminating as \${pkg} has already been imported\`);
return { module, url };
}).catch((e) => {
throw console.warn(\`Failed to import \${pkg} from \${cdn}: \${e.message}\`), e;
});
});
try {
let result = await Promise.any(importPromises);
abortController.abort();
let module = result.module;
if (!module.versions)
throw new Error(\`Failed to import module: \${fileName}. Returned bundle does not have version property.\`);
for (let [key, value] of Object.entries(module.versions))
if (value !== package_default.dependencies[key])
throw new Error(\`Failed to import module: \${fileName}. Version mismatch for \${key} (expected: \${package_default.dependencies[key]}, actual: \${value})\`);
return console.log(\`Imported \${pkg}@\${packageVersion} from \${result.url}\`), module.default;
} catch {
throw new Error(\`Failed to import \${pkg} from all available CDNs\`);
}
};
function getBasePackage(pkg) {
if (pkg.startsWith("@")) {
let [scope, name] = pkg.split("/");
return \`\${scope}/\${name}\`;
}
return pkg.split("/")[0];
}
function getPackageFolderString(pkg) {
let folders = [];
return pkg.startsWith("@") ? [, , ...folders] = pkg.split("/") : [, ...folders] = pkg.split("/"), folders && folders.length > 0 ? \`/\${folders.join("/")}\` : "";
}
function getCDNList(pkg) {
let basePkg = getBasePackage(pkg);
return basePkg.includes("react") || basePkg.includes("radix") || basePkg.includes("build") || basePkg.includes("dotenv") ? ["https://esm.sh/", "https://legacy.esm.sh/"] : ["https://cdn.jsdelivr.net/npm/", "https://esm.sh/"];
}
function buildCDNUrl(cdn, pkg, version) {
let basePkg = getBasePackage(pkg), versionString = version !== "latest" ? \`@\${version}\` : "", folderString = getPackageFolderString(pkg), url = new URL(\`\${cdn}\${basePkg}\${versionString}\${folderString}\`);
if (cdn !== "https://esm.sh/" && (basePkg.includes("react") || basePkg.includes("radix")) && !pkg.endsWith(".css"))
throw new Error(\`React based js packages is not supported in \${cdn}\`);
if (cdn !== "https://legacy.esm.sh/" && basePkg.includes("build"))
throw new Error(\`Build API package is not supported in \${cdn}\`);
cdn === "https://esm.sh/" && (basePkg !== "react-dom" && basePkg !== "react" && url.searchParams.set("bundle-deps", !1), !pkg.endsWith(".css") && pkg !== "build" && url.searchParams.set("deps", \`react@\${package_default.dependencies.react},react-dom@\${package_default.dependencies["react-dom"]}\`));
let urlString = url.toString();
return cdn === "https://cdn.jsdelivr.net/npm/" && !pkg.endsWith(".css") && (urlString += "/+esm"), urlString;
}
// common-utils/embed-comunication.js
function createCallAmplenotePluginMock(embedCommandsMock) {
return async (commandName, ...args) => {
if (commandName in embedCommandsMock)
return await embedCommandsMock[commandName](...args);
throw new Error(\`Unknown command: \${commandName}\`);
};
}
function deserializeWithFunctions(str) {
return JSON.parse(str, (key, value) => {
if (typeof value == "string" && value.startsWith("__FUNCTION:")) {
let functionBody = value.slice(11);
return new Function(\`return \${functionBody}\`)();
}
return value;
});
}
// src-bigmoji/embed/pages/EmojiPickerPage.jsx
var EmojiPickerPage = ({ onSelectEmoji, onAddCustomEmoji, initialSearch }) => {
let [data, setData] = React.useState(null);
setTimeout(() => setData(window.EmojiData), 1);
let [customEmojis, setCustomEmojis] = React.useState([]), pickerRef = React.useRef(), fetchCustomEmojis = async () => {
let customEmojis2 = await window.callAmplenotePlugin("getCustomEmojis");
if (setCustomEmojis(customEmojis2), pickerRef.current) {
let searchElement = document.getElementsByTagName("em-emoji-picker")[0].shadowRoot.querySelector(".search > input[type=search]");
searchElement && (await new Promise((resolve) => setTimeout(resolve, 320)), searchElement.dispatchEvent(new Event("input")));
}
}, handleAddCustomEmojiAndRefresh = async (emoji) => {
await onAddCustomEmoji(emoji), await fetchCustomEmojis();
}, addCustomEmojiInsertButton = async () => {
if (pickerRef.current) {
let searchContainer = document.getElementsByTagName("em-emoji-picker")[0].shadowRoot.querySelector(".search");
if (searchContainer && !document.getElementsByTagName("em-emoji-picker")[0].shadowRoot.querySelector("#custom-emoji-insert")) {
let button = document.createElement("button");
button.innerHTML = '<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><path d="M240 120v120H120c-8.8 0-16 7.2-16 16s7.2 16 16 16h120v120c0 8.8 7.2 16 16 16s16-7.2 16-16V272h120c8.8 0 16-7.2 16-16s-7.2-16-16-16H272V120c0-8.8-7.2-16-16-16s-16 7.2-16 16z"></path></svg>', button.style.marginLeft = "8px", button.title = "Add custom emoji", button.id = "custom-emoji-insert", button.onclick = async () => {
await handleAddCustomEmojiAndRefresh();
}, searchContainer.parentElement.appendChild(button);
}
}
}, setDefaultSearchValue = async () => {
if (pickerRef.current && initialSearch) {
let searchElement = document.getElementsByTagName("em-emoji-picker")[0].shadowRoot.querySelector(".search > input[type=search]");
searchElement && (searchElement.value = initialSearch, searchElement.dispatchEvent(new Event("input")));
}
};
return window.React.useEffect(() => {
fetchCustomEmojis();
}, []), window.React.useEffect(() => {
addCustomEmojiInsertButton(), setDefaultSearchValue(), setTimeout(addCustomEmojiInsertButton, 320), setTimeout(setDefaultSearchValue, 320);
}, [data, pickerRef]), window.Picker && /* @__PURE__ */ React.createElement("div", { ref: pickerRef }, /* @__PURE__ */ React.createElement(
window.Picker,
{
data,
defaultValue: initialSearch,
onEmojiSelect: onSelectEmoji,
theme: "dark",
onAddCustomEmoji: handleAddCustomEmojiAndRefresh,
set: "google",
emojiSize: 36,
skinTonePosition: "none",
emojiButtonSize: 48,
previewPosition: "none",
maxFrequentRows: 1,
dynamicWidth: !0,
custom: [{
id: "custom",
name: "Custom",
emojis: [
...customEmojis
]
}]
}
));
};
// src-bigmoji/embed/hooks/useCustomStyles.jsx
var useCustomStyles = () => {
window.React.useEffect(() => {
let style = document.createElement("style");
return style.textContent = \`
body {
margin: 0;
display: grid;
padding: 0;
min-height: 100%;
min-width: 100%;
--em-rgb-background: rgb(21, 22, 23);
}
.app-container {
position: relative;
}
/* Emoji Picker Page */
em-emoji-picker {
min-width: 100%;
max-width: 100%;
width: 100%;
min-height: 100vh;
max-height: 100vh;
height: 100%;
--border-radius: 0px;
}
/* Emoji Size Page */
.emoji-size-page {
background-color: var(--em-rgb-background);
color: rgb(222, 222, 221);
}
.emoji-size-page > h1 {
font-size: 24px;
font-weight: bold;
margin: 0;
padding: 10px;
}
.emoji-size-page-container {
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
color: white;
}
.emoji-size-page-container > div {
display: flex;
flex-direction: column;
align-items: center;
gap: 20px;
margin-bottom: 20px;
}
.emoji-size-page-container input[type="radio"] {
display: none;
}
.emoji-size-page-container label {
display: flex;
justify-content: center;
align-items: center;
cursor: pointer;
}
.emoji-size-page-container label img,
.emoji-size-page-container label span {
border: 1px solid transparent;
border-radius: 10%;
padding: 5px;
transition: all 0.2s ease;
}
.emoji-size-page-container input[type="radio"]:checked + label img,
.emoji-size-page-container input[type="radio"]:checked + label span {
border-radius: 50%;
background-color: rgba(255, 255, 255, .2);
}
.emoji-size-page-container button {
padding: 10px 30px;
background-color: #007bff;
color: white;
border: none;
border-radius: 5px;
cursor: pointer;
font-size: 16px;
margin-top: 20px;
}
.emoji-size-page-container button:hover {
background-color: #0056b3;
}
\`, document.head.append(style), () => {
document.head.removeChild(style);
};
}, []);
};
// src-bigmoji/embed/utils/getURLFromEmojiCode.jsx
var getURLFromEmojiObj = (emojiObj) => emojiObj.type === "default" ? \`https://cdn.jsdelivr.net/gh/iamcal/emoji-data@15.1.2/img-google-136/\${emojiObj.emojiCode}.png\` : emojiObj.url;
// src-bigmoji/embed/pages/EmojiSizePage.jsx
var EmojiSizePage = ({ selectedEmoji, onSubmit, setCurrentPage, setSelectedEmoji }) => {
let [isImageLoaded, setIsImageLoaded] = React.useState(!1), [selectedSize, setSelectedSize] = React.useState(null), [submitButtonName, setSubmitButtonName] = React.useState("Submit");
React.useEffect(() => {
let oldEmojiObj = window.emojiData, newDefaultSize = null;
oldEmojiObj && setSubmitButtonName("Update"), oldEmojiObj && !selectedEmoji.size ? newDefaultSize = oldEmojiObj.size : newDefaultSize = selectedEmoji.size || "32", newDefaultSize === "15" && !selectedEmoji.native && (newDefaultSize = "32"), setSelectedSize(newDefaultSize);
}, []), React.useEffect(() => {
let image = new Image();
image.onload = () => {
setIsImageLoaded(!0);
}, image.src = getURLFromEmojiObj(selectedEmoji);
}, [selectedEmoji]);
let handleSizeChange = (event) => {
setSelectedSize(event.target.value);
};
React.useEffect(() => {
setSelectedEmoji((prevEmoji) => ({
...prevEmoji,
size: selectedSize
}));
}, [selectedSize]);
let handleSubmit = () => {
onSubmit();
};
return /* @__PURE__ */ React.createElement("div", { className: "emoji-size-page" }, /* @__PURE__ */ React.createElement("div", { style: { display: "flex", justifyContent: "space-between", alignItems: "center" } }, /* @__PURE__ */ React.createElement("h1", null, "Select emoji size"), /* @__PURE__ */ React.createElement(
"a",
{
href: "#",
className: "emoji-size-page-back-button",
onClick: (e) => {
e.preventDefault(), setCurrentPage("emoji-picker");
},
style: { textDecoration: "none", color: "#4a90e2", fontSize: "16px", fontWeight: "500", marginRight: "10px" }
},
"\\u2190 Back"
)), isImageLoaded && /* @__PURE__ */ React.createElement("div", { className: "emoji-size-page-container" }, /* @__PURE__ */ React.createElement("div", null, /* @__PURE__ */ React.createElement("div", { style: { display: "flex", alignItems: "center", justifyContent: "space-between" } }, selectedEmoji.native ? /* @__PURE__ */ React.createElement(React.Fragment, null, /* @__PURE__ */ React.createElement("input", { type: "radio", name: "size", value: "15", id: "size-15px", onChange: handleSizeChange, checked: selectedSize === "15" }), /* @__PURE__ */ React.createElement("label", { htmlFor: "size-15px" }, /* @__PURE__ */ React.createElement("span", { style: { padding: "10px", marginRight: "10px" } }, selectedEmoji.native))) : null, /* @__PURE__ */ React.createElement("input", { type: "radio", name: "size", value: "32", id: "size-32px", onChange: handleSizeChange, checked: selectedSize === "32" }), /* @__PURE__ */ React.createElement("label", { htmlFor: "size-32px" }, /* @__PURE__ */ React.createElement("img", { src: getURLFromEmojiObj(selectedEmoji), style: { padding: "10px", marginRight: "10px" }, alt: selectedEmoji, width: "32", height: "32" })), /* @__PURE__ */ React.createElement("input", { type: "radio", name: "size", value: "64", id: "size-64px", onChange: handleSizeChange, checked: selectedSize === "64" }), /* @__PURE__ */ React.createElement("label", { htmlFor: "size-64px" }, /* @__PURE__ */ React.createElement("img", { src: getURLFromEmojiObj(selectedEmoji), style: { marginLeft: "10px" }, alt: selectedEmoji, width: "64", height: "64" }))), /* @__PURE__ */ React.createElement("div", { style: { marginTop: "10px" } }, /* @__PURE__ */ React.createElement("input", { type: "radio", name: "size", value: "128", id: "size-128px", onChange: handleSizeChange, checked: selectedSize === "128" }), /* @__PURE__ */ React.createElement("label", { htmlFor: "size-128px" }, /* @__PURE__ */ React.createElement("img", { src: getURLFromEmojiObj(selectedEmoji), alt: selectedEmoji, width: "128", height: "128" })))), /* @__PURE__ */ React.createElement(
"button",
{
className: "emoji-size-page-submit-button",
onClick: handleSubmit
},
submitButtonName
)));
};
// common-utils/embed-ui.js
function showEmbedLoader() {
window.LoadingStartTime = performance.now();
let overlay = document.createElement("div");
overlay.id = "embed-loader-overlay", overlay.style.cssText = \`
position: fixed;
top: 0;
left: 0;
width: 100%;
/*height: 100%;*/
background-color: rgba(0, 0, 0, 0.5);
z-index: 9998;
animation: fadeIn 0.3s ease-in-out;
\`;
let loader = document.createElement("div");
loader.id = "embed-loader", loader.style.cssText = \`
position: fixed;
left: 50%;
transform: translate(-50%, 0%);
width: 50px;
height: 50px;
border: 5px solid #f3f3f3;
border-top: 5px solid #3498db;
border-radius: 50%;
animation: spin 1s linear infinite;
z-index: 9999;
\`;
let keyframes = document.createElement("style");
keyframes.textContent = \`
@keyframes spin {
0% { transform: translate(-50%, -50%) rotate(0deg); }
100% { transform: translate(-50%, -50%) rotate(360deg); }
}
@keyframes fadeIn {
from { opacity: 0; }
to { opacity: 1; }
}
\`, document.head.appendChild(keyframes), document.body.appendChild(overlay), document.body.appendChild(loader), overlay.style.display = "none", loader.style.display = "none", setTimeout(() => {
document.getElementById("embed-loader") && (loader.style.display = "block"), document.getElementById("embed-loader-overlay") && (overlay.style.display = "block");
}, 240);
}
function hideEmbedLoader() {
window.LoadingEndTime = performance.now(), console.log("Loading time:", window.LoadingEndTime - window.LoadingStartTime);
let loader = document.getElementById("embed-loader"), overlay = document.getElementById("embed-loader-overlay");
loader && loader.remove(), overlay && overlay.remove();
}
// src-bigmoji/embed/emoji.jsx
window.INJECTED_EMBED_COMMANDS_MOCK && (window.callAmplenotePlugin = createCallAmplenotePluginMock(deserializeWithFunctions(window.INJECTED_EMBED_COMMANDS_MOCK))), window.INJECTED_EMOJI_DATA_MOCK && (window.emojiData = deserializeWithFunctions(window.INJECTED_EMOJI_DATA_MOCK));
window.appConnector = new Proxy({}, {
get: function(target, prop, receiver) {
return prop in target ? target[prop] : async function(...args) {
return await window.callAmplenotePlugin(prop, ...args);
};
}
});
window.appSettings = window.appSettings || {};
setInterval(async () => {
document.querySelector(".app-container") && (await window.appConnector.refreshTimeout() || showCloseWindowPage());
}, 100);
var body = document.body, html = document.documentElement;
window.addEventListener("resize", function() {
let iframeHeight = Math.min(html.clientHeight, html.scrollHeight);
body.style.height = iframeHeight - 24 + "px";
});
(async () => {
showEmbedLoader();
let [React2, ReactDOM, Picker, EmojiData] = await dynamicImportExternalPluginBundle("bigmojiUIBundle.js");
if (hideEmbedLoader(), window.React = React2, window.ReactDOM = ReactDOM, window.Picker = Picker.default, window.EmojiData = EmojiData.default, !window.React || !window.ReactDOM)
throw new Error("Failed to load React or ReactDOM");
document.querySelector(".app-container") && window.ReactDOM.createRoot(document.querySelector(".app-container")).render(React2.createElement(App));
})();
var showCloseWindowPage = () => {
document.body.style.backgroundColor = "#192025", document.body.innerHTML = '<span style="color: aliceblue">Please close this window.</span>', window.ReactDOM.unmountComponentAtNode(document.querySelector(".app-container"));
}, App = () => {
let [currentPage, setCurrentPage] = React.useState("emoji-picker"), [emojiObj, setEmojiObj] = React.useState(null);
useCustomStyles();
let getInitialSearch = () => {
var _a, _b;
return emojiObj != null && emojiObj.native ? emojiObj.native : (_a = window.emojiData) != null && _a.native ? window.emojiData.native : (emojiObj == null ? void 0 : emojiObj.emojiCode) || ((_b = window.emojiData) == null ? void 0 : _b.emojiCode);
}, handleEmojiSelect = (emoji) => {
console.log(emoji), setEmojiObj({
emojiUUID: Math.random().toString(36).substring(7),
type: emoji.unified ? "default" : "custom",
emojiCode: emoji.unified || emoji.id,
url: emoji.src,
// will be null if emoji is default
native: emoji.native,
// can be null
size: emojiObj == null ? void 0 : emojiObj.size,
skin: emoji.skin
// this can be null
}), setCurrentPage("emoji-size");
}, handleAddCustomEmoji = async () => new Promise((resolve, reject) => {
let input = document.createElement("input");
input.type = "file", input.accept = ".png, .jpeg", input.style.display = "none", document.body.appendChild(input), input.addEventListener("change", function(event) {
let file = event.target.files[0];
if (file) {
let reader = new FileReader();
reader.onload = async function(e) {
try {
let imageBase64 = e.target.result, emojiId = await appConnector.prompt("Enter emoji name:", {
inputs: [
{ label: "Emoji name", type: "text", value: file.name.replace(/\\.[^/.]+$/, "").replaceAll(" ", "_") }
]
});
(!emojiId || emojiId.trim() === "") && app.alert("Emoji name cannot be empty"), await appConnector.addCustomEmoji(emojiId.replaceAll(/\\s+/g, "_"), imageBase64), resolve();
} catch (error) {
reject(error);
}
}, reader.readAsDataURL(file);
} else
resolve();
}), input.click();
});
return currentPage === "emoji-picker" ? /* @__PURE__ */ React.createElement(
EmojiPickerPage,
{
initialSearch: getInitialSearch(),
onSelectEmoji: handleEmojiSelect,
onAddCustomEmoji: handleAddCustomEmoji
}
) : /* @__PURE__ */ React.createElement(
EmojiSizePage,
{
selectedEmoji: emojiObj,
setSelectedEmoji: setEmojiObj,
onSubmit: () => {
window.appConnector.setEmbedResult({
...emojiObj
}), showCloseWindowPage();
},
setCurrentPage
}
);
};
return plugin;
})()
<\/script>
</body>
</html>`;
var getURLFromEmojiObj = (emojiObj) => emojiObj.type === "default" ? `https://cdn.jsdelivr.net/gh/iamcal/emoji-data@15.1.2/img-google-136/${emojiObj.emojiCode}.png` : emojiObj.url;
var convert = (
function(test) {
if (test == null)
return ok;
if (typeof test == "function")
return castFactory(test);
if (typeof test == "object")
return Array.isArray(test) ? anyFactory(test) : propsFactory(test);
if (typeof test == "string")
return typeFactory(test);
throw new Error("Expected function, string, or object as test");
}
);
function anyFactory(tests) {
let checks = [], index = -1;
for (; ++index < tests.length; )
checks[index] = convert(tests[index]);
return castFactory(any);
function any(...parameters) {
let index2 = -1;
for (; ++index2 < checks.length; )
if (checks[index2].apply(this, parameters)) return !0;
return !1;
}
}
function propsFactory(check) {
let checkAsRecord = (
check
);
return castFactory(all);
function all(node) {
let nodeAsRecord = (
node
), key;
for (key in check)
if (nodeAsRecord[key] !== checkAsRecord[key]) return !1;
return !0;
}
}
function typeFactory(check) {
return castFactory(type);
function type(node) {
return node && node.type === check;
}
}
function castFactory(testFunction) {
return check;
function check(value, index, parent) {
return !!(looksLikeANode(value) && testFunction.call(
this,
value,
typeof index == "number" ? index : void 0,
parent || void 0
));
}
}
function ok() {
return !0;
}
function looksLikeANode(value) {
return value !== null && typeof value == "object" && "type" in value;
}
var empty = [], CONTINUE = !0, EXIT = !1, SKIP = "skip";
function visitParents(tree, test, visitor, reverse) {
let check;
typeof test == "function" && typeof visitor != "function" ? (reverse = visitor, visitor = test) : check = test;
let is2 = convert(check), step = reverse ? -1 : 1;
factory(tree, void 0, [])();
function factory(node, index, parents) {
let value = (
node && typeof node == "object" ? node : {}
);
if (typeof value.type == "string") {
let name = (
typeof value.tagName == "string" ? value.tagName : (
typeof value.name == "string" ? value.name : void 0
)
);
Object.defineProperty(visit2, "name", {
value: "node (" + (node.type + (name ? "<" + name + ">" : "")) + ")"
});
}
return visit2;
function visit2() {
let result = empty, subresult, offset, grandparents;
if ((!test || is2(node, index, parents[parents.length - 1] || void 0)) && (result = toResult(visitor(node, parents)), result[0] === EXIT))
return result;
if ("children" in node && node.children) {
let nodeAsParent = (
node
);
if (nodeAsParent.children && result[0] !== SKIP)
for (offset = (reverse ? nodeAsParent.children.length : -1) + step, grandparents = parents.concat(nodeAsParent); offset > -1 && offset < nodeAsParent.children.length; ) {
let child = nodeAsParent.children[offset];
if (subresult = factory(child, offset, grandparents)(), subresult[0] === EXIT)
return subresult;
offset = typeof subresult[1] == "number" ? subresult[1] : offset + step;
}
}
return result;
}
}
}
function toResult(value) {
return Array.isArray(value) ? value : typeof value == "number" ? [CONTINUE, value] : value == null ? empty : [value];
}
function visit(tree, testOrVisitor, visitorOrReverse, maybeReverse) {
let reverse, test, visitor;
typeof testOrVisitor == "function" && typeof visitorOrReverse != "function" ? (test = void 0, visitor = testOrVisitor, reverse = visitorOrReverse) : (test = testOrVisitor, visitor = visitorOrReverse, reverse = maybeReverse), visitParents(tree, test, overload, reverse);
function overload(node, parents) {
let parent = parents[parents.length - 1], index = parent ? parent.children.indexOf(node) : void 0;
return visitor(node, index, parent);
}
}
var package_default = {
name: "amplenote-plugin-dev-env",
author: "debajandhar12",
version: "1.0.0",
type: "module",
repository: "https://github.com/debanjandhar12/my-amplenote-plugins-v2",
dependencies: {
"@ai-sdk/anthropic": "1.2.10",
"@ai-sdk/fireworks": "0.2.13",
"@ai-sdk/google": "1.2.14",
"@ai-sdk/groq": "1.2.8",
"@ai-sdk/openai": "1.3.21",
"@assistant-ui/react": "0.7.65",
"@assistant-ui/react-markdown": "0.7.16",
"@debanjandhar12/markmap-lib": "0.17.0-mod.3",
"@debanjandhar12/markmap-toolbar": "0.17.0-mod.3",
"@debanjandhar12/markmap-view": "0.17.0-mod.3",
"@duckdb/duckdb-wasm": "1.29.1-dev269.0",
"@emoji-mart/data": "^1.2.1",
"@emoji-mart/react": "^1.1.1",
"@huggingface/transformers": "3.2.4",
"@omnivore-app/api": "^1.0.4",
"@pinecone-database/pinecone": "4.1.0",
"@radix-ui/react-icons": "1.3.2",
"@radix-ui/themes": "3.2.0",
"@yiuayiu/telegram-markdown-escape": "^0.0.2-1",
ai: "4.3.13",
"apache-arrow": "^20.0.0",
"async-mutex": "0.5.0",
"chart.js": "^4.4.3",
"d3-svg-to-png": "^0.3.1",
"date-fns": "^3.6.0",
dayjs: "1.11.13",
"easy-web-worker": "7.0.2",
"emoji-mart": "^5.6.0",
"fast-dotproduct": "1.3.0",
fflate: "0.8.2",
fparser: "^3.1.0",
"fuse.js": "7.0.0",
idb: "8.0.2",
"iconv-lite": "^0.6.3",
"lodash-es": "^4.17.21",
luxon: "^3.4.4",
"markdown-it": "^14.1.0",
"mdast-util-to-string": "4.0.0",
"my-ample-plugin-external": "1.0.29",
nanoid: "^5.0.7",
"ollama-ai-provider": "1.2.0",
"parquetjs-lite": "^0.8.7",
react: "18.2.0",
"react-dom": "18.2.0",
"react-error-boundary": "5.0.0",
"react-string-diff": "0.2.0",
"react-virtuoso": "4.12.5",
"react-window": "1.8.11",
"remark-frontmatter": "5.0.0",
"remark-gfm": "4.0.0",
"remark-parse": "11.0.0",
"scheduler-polyfill": "^1.3.0",
stopword: "^3.1.5",
tributejs: "5.1.3",
unified: "11.0.0",
"unist-util-visit": "5.0.0",
"unist-util-visit-parents": "6.0.1",
zod: "3.23.8"
},
devDependencies: {
"@huggingface/transformers": "3.2.4",
"@playwright/test": "^1.49.1",
"@testing-library/jest-dom": "^6.5.0",
"@testing-library/react": "^16.0.1",
"@types/jest": "^29.5.0",
"core-js": "^3.38.1",
cors: "^2.8.5",
"cross-fetch": "^4.0.0",
dotenv: "^16.0.3",
esbuild: "0.25.3",
"esbuild-jest2": "0.6.7",
"esbuild-plugin-external-global": "^1.0.1",
"esbuild-plugins-node-modules-polyfill": "1.7.0",
express: "^5.0.1",
"isomorphic-fetch": "^3.0.0",
jest: "^29.5.0",
"jest-environment-jsdom": "^29.5.0",
"jest-html-reporter": "^4.1.0",
jsdom: "^24.1.0",
"make-synchronous": "^1.0.0",
"node-fetch": "4.0.0-beta.4",
"p-retry": "6.2.1",
playwright: "^1.49.1"
},
scripts: {
test: "jest --testPathPattern=src-bigmoji",
"test:watch": "jest --testPathPattern=src-bigmoji --watch",
"build:prod": "NODE_ENV=production node esbuild.js $(pwd)/src-bigmoji",
"build:dev": "node esbuild.js $(pwd)/src-bigmoji --watch --server"
}
};
var dynamicImportExternalPluginBundle = async (fileName) => {
let packageVersion = package_default.dependencies["my-ample-plugin-external"], pkg = `my-ample-plugin-external/dist/${fileName}`, cdnList = getCDNList(pkg), abortController = new AbortController(), importPromises = cdnList.map(async (cdn, index) => {
let url = buildCDNUrl(cdn, pkg, packageVersion);
if (index > 0 && await new Promise((resolve) => setTimeout(resolve, 1e3)), abortController.signal.aborted)
throw new Error(`Terminating as ${pkg} has already been imported`);
return import(url).then((module) => {
if (abortController.signal.aborted)
throw new Error(`Terminating as ${pkg} has already been imported`);
return { module, url };
}).catch((e) => {
throw console.warn(`Failed to import ${pkg} from ${cdn}: ${e.message}`), e;
});
});
try {
let result = await Promise.any(importPromises);
abortController.abort();
let module = result.module;
if (!module.versions)
throw new Error(`Failed to import module: ${fileName}. Returned bundle does not have version property.`);
for (let [key, value] of Object.entries(module.versions))
if (value !== package_default.dependencies[key])
throw new Error(`Failed to import module: ${fileName}. Version mismatch for ${key} (expected: ${package_default.dependencies[key]}, actual: ${value})`);
return console.log(`Imported ${pkg}@${packageVersion} from ${result.url}`), module.default;
} catch {
throw new Error(`Failed to import ${pkg} from all available CDNs`);
}
};
var dynamicImportESM = async (pkg, pkgVersion = null) => {
let cdnList = getCDNList(pkg), resolvedVersion = resolvePackageVersion(pkg, pkgVersion), abortController = new AbortController(), importPromises = cdnList.map(async (cdn, index) => {
let url = buildCDNUrl(cdn, pkg, resolvedVersion);
if (index > 0 && await new Promise((resolve) => setTimeout(resolve, 1e3)), abortController.signal.aborted)
throw new Error(`Terminating as ${pkg} has already been imported`);
return import(url).then((module) => {
if (abortController.signal.aborted)
throw new Error(`Terminating as ${pkg} has already been imported`);
return { module, url };
}).catch((e) => {
throw console.warn(`Failed to import ${pkg} from ${cdn}: ${e.message}`), e;
});
});
try {
let result = await Promise.any(importPromises);
return abortController.abort(), console.log(`Imported ${pkg}@${resolvedVersion} from ${result.url}`), result.module;
} catch {
throw new Error(`Failed to import ${pkg} from all available CDNs`);
}
};
function getBasePackage(pkg) {
if (pkg.startsWith("@")) {
let [scope, name] = pkg.split("/");
return `${scope}/${name}`;
}
return pkg.split("/")[0];
}
function resolvePackageVersion(pkg, pkgVersion) {
let basePkg = getBasePackage(pkg), version = pkgVersion || package_default.dependencies[basePkg] || package_default.devDependencies[basePkg] || "latest";
return version.startsWith("^") || version.startsWith("~") ? version.substring(1) : version;
}
function getPackageFolderString(pkg) {
let folders = [];
return pkg.startsWith("@") ? [, , ...folders] = pkg.split("/") : [, ...folders] = pkg.split("/"), folders && folders.length > 0 ? `/${folders.join("/")}` : "";
}
function getCDNList(pkg) {
let basePkg = getBasePackage(pkg);
return basePkg.includes("react") || basePkg.includes("radix") || basePkg.includes("build") || basePkg.includes("dotenv") ? ["https://esm.sh/", "https://legacy.esm.sh/"] : ["https://cdn.jsdelivr.net/npm/", "https://esm.sh/"];
}
function buildCDNUrl(cdn, pkg, version) {
let basePkg = getBasePackage(pkg), versionString = version !== "latest" ? `@${version}` : "", folderString = getPackageFolderString(pkg), url = new URL(`${cdn}${basePkg}${versionString}${folderString}`);
if (cdn !== "https://esm.sh/" && (basePkg.includes("react") || basePkg.includes("radix")) && !pkg.endsWith(".css"))
throw new Error(`React based js packages is not supported in ${cdn}`);
if (cdn !== "https://legacy.esm.sh/" && basePkg.includes("build"))
throw new Error(`Build API package is not supported in ${cdn}`);
cdn === "https://esm.sh/" && (basePkg !== "react-dom" && basePkg !== "react" && url.searchParams.set("bundle-deps", !1), !pkg.endsWith(".css") && pkg !== "build" && url.searchParams.set("deps", `react@${package_default.dependencies.react},react-dom@${package_default.dependencies["react-dom"]}`));
let urlString = url.toString();
return cdn === "https://cdn.jsdelivr.net/npm/" && !pkg.endsWith(".css") && (urlString += "/+esm"), urlString;
}
var dynamic_import_esm_default = dynamicImportESM;
var remarkGfm, unified, remarkParse, pipe;
async function parse(markdownText) {
return (!remarkGfm || !unified || !remarkParse) && ([remarkGfm, unified, , remarkParse] = await dynamicImportExternalPluginBundle("remarkBundle.js"), unified = unified.unified, remarkGfm = remarkGfm.default, remarkParse = remarkParse.default), pipe || (pipe = unified().use(remarkParse).use(remarkGfm)), await pipe.parse(markdownText);
}
async function parseMarkdownTable(markdownText) {
let result = [], tree = await parse(markdownText);
return visit(tree, "table", (node) => (node.children.forEach((row) => {
let rowData = [];
row.children.forEach((cell) => {
let cellText = "";
visit(cell, "text", (textNode) => {
cellText += textNode.value;
}), visit(cell, "image", (imageNode) => {
cellText += ``;
}), rowData.push(cellText.trim());
}), result.push(rowData);
}), !1)), result.filter((row) => !row.every((cell) => cell.trim() === ""));
}
function getMarkdownFrom2dArray(array2d) {
if (!array2d || array2d.length === 0) return "";
let tableHeaders = array2d[0], columnWidths = tableHeaders.map((_, index) => Math.max(...array2d.map((row) => String(row[index]).length))), createRow = (row) => "| " + row.map((cell, index) => {
let cellStr = String(cell);
return cellStr + " ".repeat(columnWidths[index] - cellStr.length);
}).join(" | ") + " |", separatorRow = "| " + columnWidths.map((width) => "-".repeat(width)).join(" | ") + " |";
return [
createRow(tableHeaders),
separatorRow,
...array2d.slice(1).map(createRow)
].join(`
`);
}
var plugin = {
embedResult: !1,
waitTimeout: null,
insertText: {
"Insert emoji": async function(app) {
let isSidebarOpenSuccess = await app.openSidebarEmbed(1, null, "sidebar");
isSidebarOpenSuccess || await app.context.replaceSelection(`<object data="plugin://${app.context.pluginUUID}" data-aspect-ratio="1" />`), await plugin._waitForEmbedResult(app), await plugin._handlePluginEmbedResult(app, isSidebarOpenSuccess);
}
},
imageOption: {
"Modify emoji": {
check: (app, image) => {
try {
return !!JSON.parse(decodeURIComponent(image.src.split("?")[1]));
} catch {
}
return !1;
},
run: async (app, image) => {
let emojiObj = JSON.parse(decodeURIComponent(image.src.split("?")[1])), isSidebarOpenSuccess = await app.openSidebarEmbed(1, emojiObj, "sidebar");
isSidebarOpenSuccess || await app.context.replaceSelection(`<object data="plugin://${app.context.pluginUUID}?${encodeURIComponent(JSON.stringify(emojiObj))}" data-aspect-ratio="1" />`), await plugin._waitForEmbedResult(app), await plugin._handlePluginEmbedResult(app, isSidebarOpenSuccess);
}
}
},
replaceText: {
"Modify emoji": {
check: async (app, text) => {
try {
if (!plugin.getEmojiDataFromNative) {
let emojiMartData = (await dynamic_import_esm_default("@emoji-mart/data")).default, { init, getEmojiDataFromNative } = await dynamic_import_esm_default("emoji-mart");
await init({ data: emojiMartData }), plugin.getEmojiDataFromNative = getEmojiDataFromNative;
}
let emojiData = await plugin.getEmojiDataFromNative(text.trim());
return !(!emojiData || !emojiData.unified);
} catch {
}
return !1;
},
run: async (app, text) => {
let emojiObj = {
emojiUUID: Math.random().toString(36).substring(7),
type: "default",
native: (await plugin.getEmojiDataFromNative(text.trim())).native,
emojiCode: (await plugin.getEmojiDataFromNative(text.trim())).unified,
size: "15"
}, isSidebarOpenSuccess = await app.openSidebarEmbed(1, emojiObj, "sidebar");
isSidebarOpenSuccess || await app.context.replaceSelection(`<object data="plugin://${app.context.pluginUUID}?${encodeURIComponent(JSON.stringify(emojiObj))}" data-aspect-ratio="1" />`), await plugin._waitForEmbedResult(app), await plugin._handlePluginEmbedResult(app, isSidebarOpenSuccess);
}
}
},
_handlePluginEmbedResult: async function(app, isSidebarOpenSuccess) {
if (plugin.embedResult && isSidebarOpenSuccess)
await app.context.replaceSelection(plugin._getImageMarkdown(plugin.embedResult)) || await app.alert("Failed to insert emoji. Possibly due to user moving selection or note.");
else if (plugin.embedResult && !isSidebarOpenSuccess) {
let currentNote = await app.findNote({ uuid: app.context.noteUUID }), currentNoteContent = await app.getNoteContent({ uuid: currentNote.uuid }), objectTagRegex = new RegExp(`<object data="plugin://${app.context.pluginUUID}.*?" />`, "g");
if (currentNoteContent.match(objectTagRegex)) {
let newNoteContent = currentNoteContent.replace(objectTagRegex, plugin._getImageMarkdown(plugin.embedResult));
await app.replaceNoteContent({ uuid: currentNote.uuid }, newNoteContent);
} else throw new Error("Failed to replace selection with emoji. Possibly due to invalid note content.");
}
},
_waitForEmbedResult: async function(app) {
for (plugin.embedResult = null, plugin.waitTimeout = 1e3; !(plugin.embedResult != null || plugin.waitTimeout <= 0); )
plugin.waitTimeout -= 100, await new Promise((resolve) => setTimeout(resolve, 100));
},
renderEmbed(app, args, source = "embed") {
try {
let emojiObj = args;
return source !== "sidebar" && args && (emojiObj = JSON.parse(decodeURIComponent(args))), addWindowVariableToHtmlString(emoji_default, "emojiData", emojiObj);
} catch (e) {
return console.error(e), "Error parsing object tag";
}
},
_getImageMarkdown: function(emojiObj) {
if (emojiObj.size === "15")
return emojiObj.native;
let url = getURLFromEmojiObj(emojiObj);
return `)}) <!-- dummy comment -->`;
},
_findOrCreateCustomEmojisNote: async function(app) {
let customEmojisNoteTitle = "Custom Bigmojis", customEmojisNote = await app.findNote({ name: customEmojisNoteTitle });
if (!customEmojisNote && (customEmojisNote = await app.notes.create(customEmojisNoteTitle, []), !customEmojisNote || !customEmojisNote.uuid))
throw new Error(`Failed to create dashboard note: ${dashboardNoteTitle}`);
return customEmojisNote = await app.notes.find(customEmojisNote.uuid), customEmojisNote;
},
onEmbedCall: createOnEmbedCallHandler({
...COMMON_EMBED_COMMANDS,
refreshTimeout: async function(app) {
return plugin.waitTimeout > 0 ? (plugin.waitTimeout = 400, !0) : !1;
},
setEmbedResult: async function(app, emojiCode) {
try {
plugin.embedResult = emojiCode;
} catch (e) {
console.error(e), await app.alert(e);
}
},
getCustomEmojis: async function(app) {
let customEmojisNote = await plugin._findOrCreateCustomEmojisNote(app), customEmojis = await app.getNoteContent({ uuid: customEmojisNote.uuid });
return (await parseMarkdownTable(customEmojis)).map((row) => {
row.length !== 2 && console.error(`Possible invalid custom emoji row: ${row}. Will try to proceed.`);
let emojiId = row[0], emojiUrlMatch = row[1].match(/!\[.*?\]\((.*?)\)/), emojiUrl = emojiUrlMatch ? emojiUrlMatch[1] : null;
return !emojiId || !emojiUrl || emojiUrl.trim() === "" || emojiUrl.trim() === "" ? (console.error(`Emoji Id or Emoji URL is missing in row: ${row}.`), null) : emojiUrl.match(/^https?:\/\//) ? {
id: emojiId,
name: emojiId,
skins: [{ src: emojiUrl }]
} : (console.error(`Invalid emoji URL in row: ${row}.`), null);
}).filter((emoji) => emoji);
},
addCustomEmoji: async function(app, emojiId, emojiImgBase64) {
try {
let customEmojisNote = await plugin._findOrCreateCustomEmojisNote(app), customEmojis = await app.getNoteContent({ uuid: customEmojisNote.uuid }), customEmojis2dArray = await parseMarkdownTable(customEmojis), emojiUrl = await app.attachNoteMedia(customEmojisNote.uuid, emojiImgBase64), newEmojis2dArray = [...customEmojis2dArray, [emojiId, ``]];
newEmojis2dArray[0][0].trim() !== "Emoji ID" && newEmojis2dArray[0][1].trim() !== "Image" && newEmojis2dArray.unshift(["Emoji ID", "Emoji"]);
let newCustomEmojis = getMarkdownFrom2dArray(newEmojis2dArray);
await app.replaceNoteContent({ uuid: customEmojisNote.uuid }, newCustomEmojis);
} catch (e) {
console.error(e), await app.alert(e);
}
}
}, ["refreshTimeout"])
}, plugin_default = plugin;
return plugin;
})()