UNPKG

create-codepen

Version:
1 lines 17.6 kB
{"version":3,"file":"index.cjs","sources":["../src/options.ts","../src/postlink.ts","../src/types.ts","../src/utils.ts","../src/dom.ts","../src/api.ts"],"sourcesContent":["export interface CodePenStyleOptions {\n /**\n * @default 300\n */\n height?: number | string;\n\n /**\n * @default none\n */\n border?: \"none\" | \"thin\" | \"thick\";\n\n /**\n * @default #000000\n */\n \"border-color\"?: string;\n\n /**\n * @default #3d3d3e\n */\n \"tab-bar-color\"?: string;\n\n /**\n * @default #76daff\n */\n \"tab-link-color\"?: string;\n\n /**\n * @default #cccccc\n */\n \"active-tab-color\"?: string;\n\n /**\n * @default #000000\n */\n \"active-link-color\"?: string;\n\n /**\n * @default #ffffff\n */\n \"link-logo-color\"?: string;\n\n /**\n * Additional class name\n */\n class?: string;\n\n \"custom-css-url\"?: string;\n}\n\nexport interface CodePenDomOptions\n extends CodePenStyleOptions,\n Record<string, unknown> {\n /**\n * Id of theme\n * @default 0\n */\n \"theme-id\"?: string | number;\n\n \"slug-hash\"?: string;\n\n user?: string;\n\n /**\n * @description one of or a set of \"html\" | \"css\" | \"js\" | \"result\"\n * @default \"result\"\n */\n \"default-tab\"?: string;\n\n animations?: \"run\" | \"stop-after-5\";\n\n preview?: \"true\" | \"false\";\n\n /**\n * @default 1\n */\n zoom?: 1 | 0.5 | 0.25;\n\n token?: string;\n\n \"pen-title\"?: string;\n\n /**\n * @default \"false\"\n */\n open?: \"true\" | \"false\";\n\n /**\n * @deprecated use \"slug-hash\" instead\n */\n href?: string;\n /**\n * @deprecated use \"animations\" instead\n */\n safe?: \"true\";\n /**\n * @deprecated use \"default-tab\" instead\n */\n type?: string;\n\n /** @private */\n name?: string;\n}\n\nexport interface CodePenPrefillOptions {\n title?: string;\n description?: string;\n head?: string;\n tags?: string | string[];\n // eslint-disable-next-line @typescript-eslint/naming-convention\n html_classes?: string | string[];\n stylesheets?: string | string[];\n scripts?: string | string[];\n}\n\nexport interface CodePenOptions\n extends Omit<CodePenDomOptions, \"name\" | \"type\" | \"href\" | \"safe\"> {\n /** @private */\n data?: string;\n prefill?: CodePenPrefillOptions;\n\n /**\n * @default \"false\"\n */\n editable?: \"true\" | \"false\";\n}\n\nconst getUserFromDom = (\n result: CodePenDomOptions,\n container: HTMLElement,\n): string => {\n if (typeof result.user === \"string\") return result.user;\n\n // try to find a link in users\n for (let index = 0; index < container.children.length; index++) {\n const link = (\n (<HTMLAnchorElement>container.children[index]).href || \"\"\n ).match(/codepen\\.(io|dev)\\/(\\w+)\\/pen\\//i);\n\n if (link) return link[2];\n }\n\n return \"anon\";\n};\n\nexport const getOptionsFromDom = (\n container: HTMLElement,\n): CodePenDomOptions | null => {\n const { attributes } = container;\n const result: CodePenDomOptions = {};\n\n for (let index = 0; index < attributes.length; index++) {\n const name = attributes[index].name;\n\n if (name.startsWith(\"data-\"))\n result[name.replace(\"data-\", \"\")] = attributes[index].value;\n }\n\n if (result.href) result[\"slug-hash\"] = result.href;\n if (result.type) result[\"default-tab\"] = result.type;\n if (result.safe)\n result.animations = result.safe === \"true\" ? \"run\" : \"stop-after-5\";\n\n if (\"prefill\" in result || result[\"slug-hash\"]) {\n result.user = getUserFromDom(result, container);\n\n return result;\n }\n\n return null;\n};\n","import { type CodePenDomOptions } from \"./options.js\";\n\nconst HOST = \"https://codepen.io\";\n\nconst encodeOptions = (options: CodePenDomOptions): string => {\n let result = \"\";\n\n for (const key in options)\n if (key !== \"prefill\" && key !== \"open\") {\n if (result !== \"\") result += \"&\";\n\n result +=\n key + \"=\" + encodeURIComponent(<string | number | boolean>options[key]);\n }\n\n return result;\n};\n\nexport const getPostLink = (options: CodePenDomOptions): string => {\n const path = options.preview === \"true\" ? \"embed/preview\" : \"embed\";\n\n if (\"prefill\" in options) return [HOST, path, \"prefill\"].join(\"/\");\n\n let slugHash = options[\"slug-hash\"];\n\n if (!slugHash) throw new Error(\"slug-hash is required\");\n\n if (options.token) slugHash += \"/\" + options.token;\n\n return [\n HOST,\n options.user || \"anon\",\n path,\n slugHash + \"?\" + encodeOptions(options),\n ]\n .join(\"/\")\n .replace(/\\/\\//g, \"//\");\n};\n","const HTML_TYPES = [\n \"html\",\n \"xml\",\n \"haml\",\n \"markdown\",\n \"slim\",\n \"pug\",\n \"application/x-slim\",\n];\n\nconst CSS_TYPES = [\n \"css\",\n \"less\",\n \"scss\",\n \"sass\",\n \"stylus\",\n \"postcss\",\n \"text/css\",\n \"text/x-sass\",\n \"text/x-scss\",\n \"text/x-less\",\n \"text/x-styl\",\n];\n\nconst JS_TYPES = [\n \"js\",\n \"javascript\",\n \"coffeescript\",\n \"livescript\",\n \"typescript\",\n \"babel\",\n \"text/javascript\",\n \"text/x-coffeescript\",\n \"text/x-livescript\",\n \"text/typescript\",\n];\n\nconst CUSTOM_EDITOR_TYPES: Record<string, string> = {\n vue: \"js\",\n flutter: \"js\",\n};\n\nexport const getType = (type = \"\"): string =>\n HTML_TYPES.includes(type)\n ? \"html\"\n : CSS_TYPES.includes(type)\n ? \"css\"\n : JS_TYPES.includes(type)\n ? \"js\"\n : CUSTOM_EDITOR_TYPES[type]\n ? CUSTOM_EDITOR_TYPES[type]\n : \"unknown\";\n","export const createElement = <K extends keyof HTMLElementTagNameMap>(\n tagName: K,\n attributes: Record<string, string | number>,\n): HTMLElementTagNameMap[K] => {\n const element = document.createElement<K>(tagName);\n\n for (const attribute in attributes)\n Object.prototype.hasOwnProperty.call(attributes, attribute) &&\n element.setAttribute(attribute, attributes[attribute].toString());\n\n return element;\n};\n","import { type CodePenDomOptions, getOptionsFromDom } from \"./options.js\";\nimport { getPostLink } from \"./postlink.js\";\nimport { getType } from \"./types.js\";\nimport { createElement } from \"./utils.js\";\n\nconst ALLOWED_ATTRIBUTES = [\n \"title\",\n \"description\",\n \"tags\",\n \"html_classes\",\n \"head\",\n \"stylesheets\",\n \"scripts\",\n];\n\nconst getDataFromDOM = (container: HTMLElement): string | void => {\n if (Object.hasOwn(container.dataset, \"prefill\")) {\n const options: Record<string, unknown> = {};\n\n const prefillOptions = <Record<string, unknown>>(\n JSON.parse(decodeURI(container.dataset[\"prefill\"]!) || \"{}\")\n );\n\n for (const key in prefillOptions)\n if (ALLOWED_ATTRIBUTES.includes(key)) options[key] = prefillOptions[key];\n\n const elements = Array.from(\n container.querySelectorAll<HTMLElement>(\"[data-lang]\"),\n );\n\n elements.forEach((element) => {\n const { lang, langVersion, optionsAutoprefixer } = element.dataset;\n\n if (optionsAutoprefixer) options[\"css_prefix\"] = \"autoprefixer\";\n\n const type = getType(lang);\n\n options[type] = element.innerText;\n\n if (lang !== type) options[type + \"_pre_processor\"] = lang;\n if (langVersion) options[type + \"_version\"] = langVersion;\n });\n\n return JSON.stringify(options);\n }\n};\n\nexport const getForm = (options: CodePenDomOptions): HTMLFormElement => {\n const form = createElement(\"form\", {\n class: \"code-pen-embed-form\",\n style: \"display: none;\",\n method: \"post\",\n action: getPostLink(options),\n target: options.name || \"\",\n });\n\n for (const key in options)\n if (key !== \"prefill\")\n form.append(\n createElement(\"input\", {\n type: \"hidden\",\n name: key,\n value: String(options[key]),\n }),\n );\n\n return form;\n};\n\nexport const getIframe = (options: CodePenDomOptions): HTMLIFrameElement => {\n const {\n height = 300,\n class: className = \"\",\n name = \"CodePen Embed\",\n } = options;\n const attribute: Record<string, string | number> = {\n class: `cp_embed_iframe ${className}`,\n src: getPostLink(options),\n allowfullscreen: \"\",\n allowpaymentrequest: \"\",\n allowTransparency: \"\",\n frameborder: 0,\n width: \"100%\",\n height,\n name,\n scrolling: \"no\",\n style: \"width: 100%; overflow: hidden; display: block;\",\n title: options[\"pen-title\"] || name,\n };\n\n if (!(\"prefill\" in options)) attribute[\"loading\"] = \"lazy\";\n\n if (options[\"slug-hash\"])\n attribute[\"id\"] = `code-pen-embed-${options[\"slug-hash\"].replace(\n \"/\",\n \"_\",\n )}`;\n\n return createElement(\"iframe\", attribute);\n};\n\nexport const appendFragment = (\n container: HTMLElement,\n docFragment: DocumentFragment,\n): HTMLElement => {\n if (container.parentNode) {\n const div = document.createElement(\"div\");\n\n div.className = \"code-pen-embed-wrapper\";\n div.append(docFragment);\n\n container.parentNode.replaceChild(div, container);\n\n return div;\n }\n\n container.append(docFragment);\n\n return container;\n};\n\nconst generateFormWrapper = (\n options: CodePenDomOptions,\n container: HTMLElement,\n): void => {\n const docFragment = document.createDocumentFragment();\n let form: HTMLFormElement | null = null;\n\n if (options.open === \"true\") {\n if (\"prefill\" in options) {\n const data = getDataFromDOM(container);\n\n if (data) options.data = data;\n\n form = getForm(options);\n container.appendChild(form);\n form.submit();\n } else {\n window.open(getPostLink(options), \"_blank\");\n }\n\n return;\n }\n\n if (\"prefill\" in options) {\n const data = getDataFromDOM(container);\n\n if (data) options.data = data;\n\n form = getForm(options);\n docFragment.append(form);\n }\n\n docFragment.append(getIframe(options));\n appendFragment(container, docFragment);\n\n if (form) form.submit();\n};\n\nlet idIndex = 1;\n\nconst renderCodePens = (\n selector: string,\n _options: CodePenDomOptions,\n): void => {\n const containers = document.querySelectorAll<HTMLElement>(selector);\n\n for (let index = 0; index < containers.length; index++) {\n const container = containers[index];\n const options = { ..._options, ...getOptionsFromDom(container) };\n\n if (options) {\n options.name = `code-pen-embed-${idIndex++}`;\n generateFormWrapper(options, container);\n }\n }\n};\n\nexport const loadCodePens = (\n selector = \".codepen\",\n options: CodePenDomOptions = {},\n): void => {\n if (document.readyState === \"loading\")\n document.addEventListener(\"DOMContentLoaded\", () => {\n renderCodePens(selector, options);\n });\n else renderCodePens(selector, options);\n};\n\nexport const openCodePens = (selector = \".codepen\"): void =>\n loadCodePens(selector, { open: \"true\" });\n","import { appendFragment, getForm, getIframe } from \"./dom.js\";\nimport { type CodePenOptions } from \"./options.js\";\n\nlet idIndex = 1;\n\nexport const renderCodePen = (\n options: CodePenOptions,\n selector?: string | HTMLElement,\n): void => {\n const container =\n typeof selector === \"string\"\n ? document.querySelector<HTMLElement>(selector)\n : selector instanceof HTMLElement\n ? selector\n : null;\n\n if (!options.user) options.user = \"anon\";\n if (!options.name)\n options.name = container ? `code-pen-api-${idIndex++}` : \"_blank\";\n\n const docFragment = document.createDocumentFragment();\n let form: HTMLFormElement | null = null;\n\n if (\"prefill\" in options) {\n options.data = JSON.stringify(options.prefill || \"{}\");\n form = getForm(options);\n docFragment.append(form);\n }\n\n if (container) {\n docFragment.append(getIframe(options));\n appendFragment(container, docFragment);\n } else {\n document.body.appendChild(docFragment);\n }\n\n if (form) form.submit();\n};\n"],"names":["getUserFromDom","result","container","index","link","getOptionsFromDom","attributes","name","HOST","encodeOptions","options","key","getPostLink","path","slugHash","HTML_TYPES","CSS_TYPES","JS_TYPES","CUSTOM_EDITOR_TYPES","getType","type","createElement","tagName","element","attribute","ALLOWED_ATTRIBUTES","getDataFromDOM","prefillOptions","lang","langVersion","optionsAutoprefixer","getForm","form","getIframe","height","className","appendFragment","docFragment","div","generateFormWrapper","data","idIndex","renderCodePens","selector","_options","containers","loadCodePens","openCodePens","renderCodePen"],"mappings":"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"}