UNPKG

vite-plugin-scope-tailwind

Version:

A vite-plugin to encapsulate and scope your TailwindCSS styles to your library and prevent them affecting styles outside

1 lines 25.7 kB
{"version":3,"file":"index.mjs","sources":["../../__vite-browser-external","../../node_modules/uniqid/index.js","../../src/postcss/state.ts","../../src/util/class-string-utils.ts","../../src/append-classes.ts","../../src/postcss/preflight.ts","../../src/append-tags.ts","../../src/get-postcss-config.ts","../../src/postcss/tailwind-edgecases.ts","../../src/postcss/prefix-tailwind.ts","../../src/main.ts"],"sourcesContent":["export default {}","/* \n(The MIT License)\nCopyright (c) 2014-2021 Halász Ádám <adam@aimform.com>\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n*/\n\n// Unique Hexatridecimal ID Generator\n// ================================================\n\n// Dependencies\n// ================================================\nvar pid = typeof process !== 'undefined' && process.pid ? process.pid.toString(36) : '' ;\nvar address = '';\nif(typeof __webpack_require__ !== 'function' && typeof require !== 'undefined'){\n var mac = '', os = require('os'); \n if(os.networkInterfaces) var networkInterfaces = os.networkInterfaces();\n if(networkInterfaces){\n loop:\n for(let interface_key in networkInterfaces){\n const networkInterface = networkInterfaces[interface_key];\n const length = networkInterface.length;\n for(var i = 0; i < length; i++){\n if(networkInterface[i] !== undefined && networkInterface[i].mac && networkInterface[i].mac != '00:00:00:00:00:00'){\n mac = networkInterface[i].mac; break loop;\n }\n }\n }\n address = mac ? parseInt(mac.replace(/\\:|\\D+/gi, '')).toString(36) : '' ;\n }\n} \n\n// Exports\n// ================================================\nmodule.exports = module.exports.default = function(prefix, suffix){ return (prefix ? prefix : '') + address + pid + now().toString(36) + (suffix ? suffix : ''); }\nmodule.exports.process = function(prefix, suffix){ return (prefix ? prefix : '') + pid + now().toString(36) + (suffix ? suffix : ''); }\nmodule.exports.time = function(prefix, suffix){ return (prefix ? prefix : '') + now().toString(36) + (suffix ? suffix : ''); }\n\n// Helpers\n// ================================================\nfunction now(){\n var time = Date.now();\n var last = now.last || time;\n return now.last = time > last ? time : last + 1;\n}\n","export const globalState: { tailwindClassNames: Set<string> } = {\n tailwindClassNames: new Set<string>(),\n};\n\nexport const persistTailwindClassNames = (classes: string[]): void => {\n for (const item of classes) {\n if (item === \"\") {\n continue;\n }\n\n const unEscaped = item.replace(/\\\\/gi, \"\");\n if (unEscaped.startsWith(\"[\")) {\n const matches = [...unEscaped.matchAll(/(\\[.+?\\]:.+?):/g)];\n const [[_, match = unEscaped]] = [\n ...(matches.length > 0 ? matches : [[]]),\n ];\n globalState.tailwindClassNames.add(match);\n globalState.tailwindClassNames.add(item);\n } else {\n // Case where it is a pseudo class like focus:\n const [matches] = [...unEscaped.matchAll(/^([a-z]+):/g)];\n\n if (matches && matches[1]) {\n const re = new RegExp(`(${matches[1]}:.+):${matches[1]}`, \"gi\");\n const [newMatches] = [...unEscaped.matchAll(re)];\n if (newMatches && newMatches[1]) {\n globalState.tailwindClassNames.add(newMatches[1]);\n }\n }\n globalState.tailwindClassNames.add(unEscaped);\n }\n }\n};\n\nexport const getTailwindClassNames = (): Set<string> =>\n globalState.tailwindClassNames;\n","export const getNonQuotedCleanedOutput = (input: string) => {\n return input.replace(/\"/g, \"\").replace(/'/g, \"\");\n};\n\nexport const appendIdWithQuotesInMind = (input: string, id: string) => {\n if (input.startsWith(\"'\") && input.endsWith(\"'\")) {\n return `'${id}-${getNonQuotedCleanedOutput(input)}'`;\n }\n\n if (input.startsWith('\"') && input.endsWith('\"')) {\n return `\"${id}-${getNonQuotedCleanedOutput(input)}\"`;\n }\n\n if (input.endsWith('\"')) {\n return `${id}-${getNonQuotedCleanedOutput(input)}\"`;\n }\n\n if (input.endsWith(\"'\")) {\n return `${id}-${getNonQuotedCleanedOutput(input)}'`;\n }\n\n if (input.startsWith('\"')) {\n return `\"${id}-${getNonQuotedCleanedOutput(input)}`;\n }\n\n if (input.startsWith(\"'\")) {\n return `'${id}-${getNonQuotedCleanedOutput(input)}`;\n }\n\n return `${id}-${input}`;\n};\n","import { getTailwindClassNames } from \"./postcss/state\";\nimport {\n appendIdWithQuotesInMind,\n getNonQuotedCleanedOutput,\n} from \"./util/class-string-utils\";\n\nconst appendClassWithId = (input: string, id: string): string => {\n if (getTailwindClassNames().has(getNonQuotedCleanedOutput(input))) {\n return appendIdWithQuotesInMind(input, id);\n } else {\n return input;\n }\n};\n\nexport const transformClasses = ({\n c,\n classIdentifier,\n id,\n}: {\n c: string;\n id: string;\n classIdentifier: string;\n}): string => {\n const re = new RegExp(`${classIdentifier}: \"(.+?)\"`, \"gi\");\n const matches = c.matchAll(re);\n\n for (const [fullText, classes] of matches) {\n c = c.replace(\n fullText,\n `${classIdentifier}: \"${classes\n .split(\" \")\n .map((c) => appendClassWithId(c, id))\n .join(\" \")}\"`,\n );\n }\n return c;\n};\n\nexport const tildeTransformClasses = ({\n c,\n classIdentifier,\n id,\n}: {\n c: string;\n id: string;\n classIdentifier: string;\n}): string => {\n const re = new RegExp(`${classIdentifier}: \\`(.+?)\\``, \"gi\");\n const matches = c.matchAll(re);\n\n for (const [fullText, classes] of matches) {\n c = c.replace(\n fullText,\n `${classIdentifier}: \\`${classes\n .split(\" \")\n .map((c) => appendClassWithId(c, id))\n .join(\" \")}\\``,\n );\n }\n return c;\n};\n\nexport const appendClassForReact = (id: string) => (code: string) => {\n const regex = /className/g;\n const found = code.match(regex);\n if (found) {\n let c = code\n .replace(/className: \"/g, `className: \"${id} `)\n .replace(/className: `/g, `className: \\`${id} `);\n\n c = transformClasses({\n c,\n id,\n classIdentifier: \"className\",\n });\n\n c = tildeTransformClasses({\n c,\n id,\n classIdentifier: \"className\",\n });\n\n return {\n code: c,\n map: null,\n };\n } else {\n return {\n code,\n map: null,\n };\n }\n};\n\nexport const appendClass = (id: string) => (code: string) => {\n const regex = /class/g;\n const found = code.match(regex);\n if (found) {\n let c = code\n .replace(/class: \"/g, `class: \"${id} `)\n .replace(/class=\"/g, `class=\"${id} `);\n\n c = transformClasses({\n c,\n id,\n classIdentifier: \"class\",\n });\n\n c = tildeTransformClasses({\n c,\n id,\n classIdentifier: \"class\",\n });\n return {\n code: c,\n map: null,\n };\n } else {\n return {\n code,\n map: null,\n };\n }\n};\n","export const PREFLIGHT_AFFECTED_TAGS = new Set([\n \"blockquote\",\n \"dl\",\n \"dd\",\n \"h1\",\n \"h2\",\n \"h3\",\n \"h4\",\n \"h5\",\n \"h6\",\n \"hr\",\n \"figure\",\n \"p\",\n \"pr\",\n \"ol\",\n \"ul\",\n \"img\",\n \"svg\",\n \"video\",\n \"canvas\",\n \"audio\",\n \"iframe\",\n \"embed\",\n \"object\",\n]);\n","import { appendClass, appendClassForReact } from \"./append-classes\";\nimport { PREFLIGHT_AFFECTED_TAGS } from \"./postcss/preflight\";\n\nexport const appendTagsForReact = (id: string) => (code: string) => {\n return append({\n id,\n regex: (tag) => new RegExp(`\"${tag}\", {(?:.|\\\\s)+?}\\\\)`, \"g\"),\n innerRegex: (tag) => new RegExp(`\"${tag}\", ({(?:.|\\\\s)+?})+?`, \"i\"),\n classText: \"className\",\n replace: {\n from: () => `, {`,\n to: () => `, {\\nclassName: \"${id}\",`,\n },\n appendClassFn: appendClassForReact,\n })(code);\n};\n\nexport const appendTags = (id: string) => (code: string) => {\n return append({\n id,\n regex: (tag) => new RegExp(`<${tag}(?:.|\\\\s)*?>[^<]*</${tag}>`, \"g\"),\n innerRegex: (tag) => new RegExp(`<${tag}(?:.|\\\\s)*?>`, \"i\"),\n classText: \"class\",\n replace: {\n from: (tag) => `<${tag}`,\n to: (tag) => `<${tag} class=\"${id}\"`,\n },\n appendClassFn: appendClass,\n })(code);\n};\n\nconst append =\n ({\n id,\n regex,\n innerRegex,\n classText,\n replace: { from, to },\n appendClassFn,\n }: {\n id: string;\n regex: (tag: string) => RegExp;\n innerRegex: (tag: string) => RegExp;\n classText: \"class\" | \"className\";\n replace: { from: (tag: string) => string; to: (tag: string) => string };\n appendClassFn: (id: string) => (code: string) => {\n code: string;\n map: null;\n };\n }) =>\n (code: string) => {\n let currCode = code;\n for (const tag of PREFLIGHT_AFFECTED_TAGS) {\n const matches = [...currCode.matchAll(regex(tag))].map((m) => m[0]);\n\n for (const match of matches) {\n const [obj] = [...(currCode.match(innerRegex(tag)) ?? [])];\n if (obj.includes(classText)) {\n const output = appendClassFn(id)(match);\n currCode = currCode.replace(match, output.code);\n } else {\n // That means that className is not present\n // We need to add it\n currCode = currCode.replace(match, match.replace(from(tag), to(tag)));\n }\n }\n }\n\n return {\n code: currCode,\n map: null,\n };\n };\n","import path from \"path\";\n\ntype PostCssConfig = {\n plugins: {\n [key: string]: any;\n };\n};\n\nexport const getPostCssConfig = (): PostCssConfig => {\n try {\n const file = require(path.join(process.cwd(), \"postcss.config.js\"));\n\n return fileToConfig(file);\n } catch {}\n\n try {\n const file = require(path.join(process.cwd(), \"postcss.config.cjs\"));\n\n return fileToConfig(file);\n } catch {}\n\n try {\n const file = require(path.join(process.cwd(), \"postcss.config.json\"));\n\n return fileToConfig(file);\n } catch {}\n\n return {\n plugins: {\n tailwindcss: {},\n autoprefixer: {},\n },\n };\n};\n\nexport const postCssPluginsToArray = (config: PostCssConfig): string[] => {\n return Object.keys(config.plugins);\n};\n\n/* v8 ignore start */\n// Difficult to test because `require()` can't be mocked for this code path to run\nconst fileToConfig = (file: any): PostCssConfig => {\n if (file.default) {\n return file.default();\n }\n\n return file;\n};\n/* v8 ignore stop */\n","export const splitClassNames = (classNames: string): string[] => {\n return classNames.split(/(?<!\\\\)\\./);\n};\n","import { AcceptedPlugin } from \"postcss\";\nimport { PREFLIGHT_AFFECTED_TAGS } from \"./preflight\";\nimport { persistTailwindClassNames } from \"./state\";\nimport { splitClassNames } from \"./tailwind-edgecases\";\n\nimport { syncWait } from \"../util/sync-wait\";\n\n/**\n * Determine if class passes test\n *\n * @param {string} cssClass\n * @param {RegExp | RegExp[]} test\n */\nconst classMatchesTest = (\n cssClass: string,\n test: RegExp | RegExp[] | string | string[],\n): boolean => {\n cssClass = cssClass.trim();\n\n if (test instanceof RegExp) {\n return !!test.exec(cssClass);\n }\n\n if (typeof test === \"string\") {\n return cssClass === test;\n }\n\n if (Array.isArray(test)) {\n // Reassign arguments\n return test.some((t) => {\n if (t instanceof RegExp) {\n return t.exec(cssClass);\n } else {\n return cssClass === t;\n }\n });\n /* c8 ignore next */\n }\n /* c8 ignore next 4 */\n // This will never happen so it is safe to ignore\n // Deleting it will change the return type of the function\n return cssClass === test;\n};\n\nexport const prefixPlugin = ({\n prefix,\n ignore,\n}: {\n prefix: string;\n ignore: RegExp | RegExp[] | string | string[];\n}): AcceptedPlugin => {\n // From 'foo.' to 'foo'\n // This '.' is added further up the chain\n // TODO: make all prefixes clean\n const cleanPrefix = prefix.replace(\".\", \"\");\n\n return {\n postcssPlugin: \"prefix-tailwind-classes\",\n\n Root(root) {\n root.walkRules((rule) => {\n if (!rule.selectors) {\n return false;\n }\n\n rule.selectors = rule.selectors.map((selector) => {\n // Is tag selector\n if (selector.indexOf(\".\") !== 0) {\n // Need this so that the library's preflight reset doesn't affect the outside app\n // This still allows the outside app to affect the library's tags, but that's ok, there is no way around that\n // This is because a h1 tag is the same in all cases.\n // Fix for preflight reset\n if (PREFLIGHT_AFFECTED_TAGS.has(selector)) {\n return selector + \".\" + cleanPrefix;\n }\n return selector;\n }\n\n // Is class selector\n var classes = splitClassNames(selector);\n\n // This is necessary because there is a race condition where the PostCSS plugin runs before the vite transform step!\n // Since they're two separate plugins, it is unclear how to figure out when Vite's transform finishes. So a simple wait is added for now until we have a better idea\n syncWait(2000);\n\n persistTailwindClassNames(classes);\n\n return classes\n .map((cssClass) => {\n if (\n classMatchesTest(cssClass, ignore) ||\n cssClass.trim().length === 0\n ) {\n return cssClass;\n }\n return `${cleanPrefix}-${cssClass}`;\n })\n .join(\".\");\n });\n });\n },\n };\n};\n","import path from \"path\";\nimport { AcceptedPlugin } from \"postcss\";\nimport uniqid from \"uniqid\";\nimport { Plugin } from \"vite\";\n\nimport { appendClass, appendClassForReact } from \"./append-classes\";\nimport { appendTags, appendTagsForReact } from \"./append-tags\";\nimport { getPostCssConfig, postCssPluginsToArray } from \"./get-postcss-config\";\nimport { prefixPlugin } from \"./postcss/prefix-tailwind\";\n\nconst id = uniqid(\"d\");\n\nconst appendForReact = (id: string) => (code: string) => {\n return {\n code: appendClassForReact(id)(appendTagsForReact(id)(code).code).code,\n map: null,\n };\n};\n\nconst append = (id: string) => (code: string) => {\n return {\n code: appendClass(id)(appendTags(id)(code).code).code,\n map: null,\n };\n};\n\nconst plugin = ({\n react = false,\n ignore = [],\n}: { react?: boolean; ignore?: RegExp | RegExp[] } = {}): Plugin => ({\n name: \"vite-plugin-scope-tailwind\",\n config: (config) => {\n const currentPostCssPlugins =\n (config.css?.postcss as any)?.plugins ?? ([] as AcceptedPlugin[]);\n const postCssConfigFile = getPostCssConfig();\n\n return {\n css: {\n postcss: {\n plugins: [\n ...currentPostCssPlugins,\n ...postCssPluginsToArray(postCssConfigFile).map((f) =>\n require(path.join(process.cwd(), \"node_modules\", f)),\n ),\n prefixPlugin({ prefix: id, ignore }),\n ],\n },\n },\n };\n },\n transform: react ? appendForReact(id) : append(id),\n});\n\nexport default plugin;\n"],"names":["__viteBrowserExternal","pid","address","require","mac","os","require$$0","networkInterfaces","loop","interface_key","networkInterface","length","i","uniqidModule","prefix","suffix","now","time","last","globalState","persistTailwindClassNames","classes","item","unEscaped","matches","_","match","re","newMatches","getTailwindClassNames","getNonQuotedCleanedOutput","input","appendIdWithQuotesInMind","id","appendClassWithId","transformClasses","c","classIdentifier","fullText","tildeTransformClasses","appendClassForReact","code","regex","appendClass","PREFLIGHT_AFFECTED_TAGS","appendTagsForReact","append","tag","appendTags","innerRegex","classText","from","to","appendClassFn","currCode","m","obj","output","getPostCssConfig","file","path","fileToConfig","postCssPluginsToArray","config","splitClassNames","classNames","classMatchesTest","cssClass","test","t","prefixPlugin","ignore","cleanPrefix","root","rule","selector","uniqid","appendForReact","plugin","react","currentPostCssPlugins","_b","_a","postCssConfigFile","f"],"mappings":"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","x_google_ignoreList":[1]}