@linaria/atomic 5.0.3 → 6.0.0
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/processors/css.js +9 -15
- package/dist/processors/css.js.map +1 -1
- package/dist/processors/css.mjs +7 -13
- package/dist/processors/css.mjs.map +1 -1
- package/dist/processors/styled.js +10 -17
- package/dist/processors/styled.js.map +1 -1
- package/dist/processors/styled.mjs +8 -15
- package/dist/processors/styled.mjs.map +1 -1
- package/package.json +11 -11
- package/types/processors/css.d.ts +1 -1
- package/types/processors/styled.d.ts +1 -1
package/dist/processors/css.js
CHANGED
|
@@ -33,14 +33,14 @@ __export(css_exports, {
|
|
|
33
33
|
default: () => AtomicCssProcessor
|
|
34
34
|
});
|
|
35
35
|
module.exports = __toCommonJS(css_exports);
|
|
36
|
+
var import_shared2 = require("@wyw-in-js/shared");
|
|
36
37
|
var import_css = __toESM(require("@linaria/core/processors/css"));
|
|
37
|
-
var import_logger = require("@linaria/logger");
|
|
38
38
|
|
|
39
39
|
// src/processors/helpers/atomize.ts
|
|
40
|
+
var import_shared = require("@wyw-in-js/shared");
|
|
40
41
|
var import_known_css_properties = require("known-css-properties");
|
|
41
42
|
var import_postcss = __toESM(require("postcss"));
|
|
42
|
-
var import_stylis =
|
|
43
|
-
var import_utils = require("@linaria/utils");
|
|
43
|
+
var import_stylis = require("stylis");
|
|
44
44
|
|
|
45
45
|
// src/processors/helpers/propertyPriority.ts
|
|
46
46
|
var shorthandProperties = {
|
|
@@ -246,7 +246,7 @@ function hashProperty(property) {
|
|
|
246
246
|
if (index !== void 0) {
|
|
247
247
|
return index.toString(36);
|
|
248
248
|
}
|
|
249
|
-
return (0,
|
|
249
|
+
return (0, import_shared.slugify)(property);
|
|
250
250
|
}
|
|
251
251
|
var parseCss = (cssText) => {
|
|
252
252
|
try {
|
|
@@ -263,10 +263,6 @@ ${cssText}`);
|
|
|
263
263
|
}
|
|
264
264
|
};
|
|
265
265
|
function atomize(cssText, hasPriority = false) {
|
|
266
|
-
import_stylis.default.set({
|
|
267
|
-
prefix: false,
|
|
268
|
-
keyframe: false
|
|
269
|
-
});
|
|
270
266
|
const atomicRules = [];
|
|
271
267
|
const stylesheet = parseCss(cssText);
|
|
272
268
|
stylesheet.walkAtRules("keyframes", (atRule) => {
|
|
@@ -305,10 +301,11 @@ function atomize(cssText, hasPriority = false) {
|
|
|
305
301
|
container.append(decl.clone());
|
|
306
302
|
const css = root.toString();
|
|
307
303
|
const propertySlug = hashProperty([...atomicProperty].join(";"));
|
|
308
|
-
const valueSlug = (0,
|
|
304
|
+
const valueSlug = (0, import_shared.slugify)(decl.value);
|
|
309
305
|
const className = `atm_${propertySlug}_${valueSlug}`;
|
|
310
306
|
const propertyPriority = getPropertyPriority(decl.prop) + (hasAtRule ? 1 : 0) + (hasPriority ? 1 : 0);
|
|
311
|
-
const
|
|
307
|
+
const selector = `.${className}`.repeat(propertyPriority);
|
|
308
|
+
const processedCss = (0, import_stylis.serialize)((0, import_stylis.compile)(`${selector} {${css}}`), import_stylis.stringify);
|
|
312
309
|
atomicRules.push({
|
|
313
310
|
property: atomicProperty.join(" "),
|
|
314
311
|
className,
|
|
@@ -319,6 +316,7 @@ function atomize(cssText, hasPriority = false) {
|
|
|
319
316
|
}
|
|
320
317
|
|
|
321
318
|
// src/processors/css.ts
|
|
319
|
+
var debug = import_shared2.logger.extend("AtomicCssProcessor");
|
|
322
320
|
var AtomicCssProcessor = class extends import_css.default {
|
|
323
321
|
#classes;
|
|
324
322
|
get classes() {
|
|
@@ -341,11 +339,7 @@ var AtomicCssProcessor = class extends import_css.default {
|
|
|
341
339
|
displayName: this.displayName,
|
|
342
340
|
atom: true
|
|
343
341
|
};
|
|
344
|
-
(
|
|
345
|
-
"evaluator:template-processor:extracted-atomic-rule",
|
|
346
|
-
`
|
|
347
|
-
${rule.cssText}`
|
|
348
|
-
);
|
|
342
|
+
debug("extracted-atomic-rule:\n%s", rule.cssText);
|
|
349
343
|
});
|
|
350
344
|
this.#classes = atomicRules.filter((rule) => !!rule.className).map((rule) => rule.className).join(" ");
|
|
351
345
|
return rules;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/processors/css.ts","../../src/processors/helpers/atomize.ts","../../src/processors/helpers/propertyPriority.ts"],"sourcesContent":["import type { SourceLocation } from '@babel/types';\n\nimport CssProcessor from '@linaria/core/processors/css';\nimport { debug } from '@linaria/logger';\nimport type { Rules, ValueCache } from '@linaria/tags';\n\nimport atomize from './helpers/atomize';\n\nexport default class AtomicCssProcessor extends CssProcessor {\n #classes: string | undefined;\n\n private get classes(): string {\n if (typeof this.#classes !== 'undefined') {\n return this.#classes;\n }\n\n throw new Error('Styles are not extracted yet. Please call `build` first.');\n }\n\n public override doRuntimeReplacement(): void {\n this.replacer(this.astService.stringLiteral(this.classes), false);\n }\n\n public override extractRules(\n valueCache: ValueCache,\n cssText: string,\n loc?: SourceLocation | null\n ): Rules {\n const rules: Rules = {};\n\n const atomicRules = atomize(cssText, false);\n atomicRules.forEach((rule) => {\n // eslint-disable-next-line no-param-reassign\n rules[rule.cssText] = {\n cssText: rule.cssText,\n start: loc?.start ?? null,\n className: this.className!,\n displayName: this.displayName!,\n atom: true,\n };\n\n debug(\n 'evaluator:template-processor:extracted-atomic-rule',\n `\\n${rule.cssText}`\n );\n });\n\n this.#classes = atomicRules\n // Some atomic rules produced (eg. keyframes) don't have class names, and they also don't need to appear in the object\n .filter((rule) => !!rule.className)\n .map((rule) => rule.className!)\n .join(' ');\n\n return rules;\n }\n}\n","import { all as knownProperties } from 'known-css-properties';\nimport type { Document, AtRule, Container, Rule } from 'postcss';\nimport postcss from 'postcss';\nimport stylis from 'stylis';\n\nimport { slugify } from '@linaria/utils';\n\nimport { getPropertyPriority } from './propertyPriority';\n\nconst knownPropertiesMap = knownProperties.reduce(\n (acc: { [property: string]: number }, property, i) => {\n acc[property] = i;\n return acc;\n },\n {}\n);\n\nfunction hashProperty(property: string) {\n const index = knownPropertiesMap[property];\n // If it's a known property, let's use the index to cut down the length of the hash.\n // otherwise, slugify\n if (index !== undefined) {\n return index.toString(36); // base 36 so that we get a-z,0-9\n }\n return slugify(property);\n}\n\nconst parseCss = (cssText: string) => {\n try {\n return postcss.parse(cssText);\n } catch (e) {\n if (e instanceof Error) {\n throw new Error(`Error parsing CSS: ${e.message}\\nCSS:\\n${cssText}`);\n }\n\n throw new Error(`Unknown error parsing CSS.\\nCSS:\\n${cssText}`);\n }\n};\n\nexport default function atomize(cssText: string, hasPriority = false) {\n stylis.set({\n prefix: false,\n keyframe: false,\n });\n const atomicRules: {\n className?: string;\n cssText: string;\n property: string;\n }[] = [];\n\n const stylesheet = parseCss(cssText);\n\n // We want to extract all keyframes and leave them as-is.\n // This isn't scoped locally yet\n stylesheet.walkAtRules('keyframes', (atRule) => {\n atRule.remove();\n atomicRules.push({\n property: atRule.name,\n cssText: atRule.toString(),\n });\n });\n\n stylesheet.walkDecls((decl) => {\n let thisParent: Document | Container | undefined = decl.parent;\n const parents: (Document | Container)[] = [];\n const atomicProperty = [decl.prop];\n let hasAtRule = false;\n\n // Traverse the declarations parents, and collect them all.\n while (thisParent && thisParent !== stylesheet) {\n parents.unshift(thisParent);\n if (thisParent.type === 'atrule') {\n hasAtRule = true;\n // @media queries, @supports etc.\n atomicProperty.push(\n (thisParent as AtRule).name,\n (thisParent as AtRule).params\n );\n } else if (thisParent.type === 'rule') {\n // pseudo classes etc.\n atomicProperty.push((thisParent as Rule).selector);\n }\n\n thisParent = thisParent.parent;\n }\n\n // Create a new stylesheet that contains *just* the extracted atomic rule and wrapping selectors, eg.\n // `@media (max-width: 400px) { background: red; }`, or\n // `&:hover { background: red; }`, or\n // `background: red;`\n // We do this so we can run it through stylis, to produce a full atom, eg.\n // `@media (max-width: 400px) { .atm_foo { background: red; } }`\n const root = postcss.root();\n let container: Document | Container = root;\n parents.forEach((parent) => {\n const newNode = parent.clone();\n newNode.removeAll();\n container.append(newNode);\n container = newNode;\n });\n container.append(decl.clone());\n\n const css = root.toString();\n const propertySlug = hashProperty([...atomicProperty].join(';'));\n const valueSlug = slugify(decl.value);\n const className = `atm_${propertySlug}_${valueSlug}`;\n\n const propertyPriority =\n getPropertyPriority(decl.prop) +\n (hasAtRule ? 1 : 0) +\n (hasPriority ? 1 : 0);\n const processedCss = stylis(`.${className}`.repeat(propertyPriority), css);\n\n atomicRules.push({\n property: atomicProperty.join(' '),\n className,\n cssText: processedCss,\n });\n });\n\n return atomicRules;\n}\n","const shorthandProperties = {\n // The `all` property resets everything, and should effectively have priority zero.\n // In practice, this can be achieved by using: div { all: ... } to have even less specificity, but to avoid duplicating all selectors, we just let it be\n // 'all': []\n animation: [\n 'animation-name',\n 'animation-duration',\n 'animation-timing-function',\n 'animation-delay',\n 'animation-iteration-count',\n 'animation-direction',\n 'animation-fill-mode',\n 'animation-play-state',\n ],\n background: [\n 'background-attachment',\n 'background-clip',\n 'background-color',\n 'background-image',\n 'background-origin',\n 'background-position',\n 'background-repeat',\n 'background-size',\n ],\n border: ['border-color', 'border-style', 'border-width'],\n 'border-block-end': [\n 'border-block-end-color',\n 'border-block-end-style',\n 'border-block-end-width',\n ],\n 'border-block-start': [\n 'border-block-start-color',\n 'border-block-start-style',\n 'border-block-start-width',\n ],\n 'border-bottom': [\n 'border-bottom-color',\n 'border-bottom-style',\n 'border-bottom-width',\n ],\n 'border-color': [\n 'border-bottom-color',\n 'border-left-color',\n 'border-right-color',\n 'border-top-color',\n ],\n 'border-image': [\n 'border-image-outset',\n 'border-image-repeat',\n 'border-image-slice',\n 'border-image-source',\n 'border-image-width',\n ],\n 'border-inline-end': [\n 'border-inline-end-color',\n 'border-inline-end-style',\n 'border-inline-end-width',\n ],\n 'border-inline-start': [\n 'border-inline-start-color',\n 'border-inline-start-style',\n 'border-inline-start-width',\n ],\n 'border-left': [\n 'border-left-color',\n 'border-left-style',\n 'border-left-width',\n ],\n 'border-radius': [\n 'border-top-left-radius',\n 'border-top-right-radius',\n 'border-bottom-right-radius',\n 'border-bottom-left-radius',\n ],\n 'border-right': [\n 'border-right-color',\n 'border-right-style',\n 'border-right-width',\n ],\n 'border-style': [\n 'border-bottom-style',\n 'border-left-style',\n 'border-right-style',\n 'border-top-style',\n ],\n 'border-top': ['border-top-color', 'border-top-style', 'border-top-width'],\n 'border-width': [\n 'border-bottom-width',\n 'border-left-width',\n 'border-right-width',\n 'border-top-width',\n ],\n 'column-rule': [\n 'column-rule-width',\n 'column-rule-style',\n 'column-rule-color',\n ],\n columns: ['column-count', 'column-width'],\n flex: ['flex-grow', 'flex-shrink', 'flex-basis'],\n 'flex-flow': ['flex-direction', 'flex-wrap'],\n font: [\n 'font-family',\n 'font-size',\n 'font-stretch',\n 'font-style',\n 'font-variant',\n 'font-weight',\n 'line-height',\n ],\n gap: ['row-gap', 'column-gap'],\n grid: [\n 'grid-auto-columns',\n 'grid-auto-flow',\n 'grid-auto-rows',\n 'grid-template-areas',\n 'grid-template-columns',\n 'grid-template-rows',\n ],\n 'grid-area': [\n 'grid-row-start',\n 'grid-column-start',\n 'grid-row-end',\n 'grid-column-end',\n ],\n 'grid-column': ['grid-column-end', 'grid-column-start'],\n 'grid-row': ['grid-row-end', 'grid-row-start'],\n 'grid-template': [\n 'grid-template-areas',\n 'grid-template-columns',\n 'grid-template-rows',\n ],\n 'list-style': ['list-style-image', 'list-style-position', 'list-style-type'],\n margin: ['margin-bottom', 'margin-left', 'margin-right', 'margin-top'],\n mask: [\n 'mask-clip',\n 'mask-composite',\n 'mask-image',\n 'mask-mode',\n 'mask-origin',\n 'mask-position',\n 'mask-repeat',\n 'mask-size',\n ],\n offset: [\n 'offset-anchor',\n 'offset-distance',\n 'offset-path',\n 'offset-position',\n 'offset-rotate',\n ],\n outline: ['outline-color', 'outline-style', 'outline-width'],\n overflow: ['overflow-x', 'overflow-y'],\n padding: ['padding-bottom', 'padding-left', 'padding-right', 'padding-top'],\n 'place-content': ['align-content', 'justify-content'],\n 'place-items': ['align-items', 'justify-items'],\n 'place-self': ['align-self', 'justify-self'],\n 'scroll-margin': [\n 'scroll-margin-bottom',\n 'scroll-margin-left',\n 'scroll-margin-right',\n 'scroll-margin-top',\n ],\n 'scroll-padding': [\n 'scroll-padding-bottom',\n 'scroll-padding-left',\n 'scroll-padding-right',\n 'scroll-padding-top',\n ],\n 'text-decoration': [\n 'text-decoration-color',\n 'text-decoration-line',\n 'text-decoration-style',\n 'text-decoration-thickness',\n ],\n 'text-emphasis': ['text-emphasis-color', 'text-emphasis-style'],\n transition: [\n 'transition-delay',\n 'transition-duration',\n 'transition-property',\n 'transition-timing-function',\n ],\n};\n\n// Get the property priority: the higher the priority, the higher the resulting\n// specificity of the atom. For example, if we had:\n//\n// import { css } from '@linaria/atomic';\n// css`\n// background-color: blue;\n// background: red;\n// `;\n//\n// we would produce:\n//\n// .atm_a.atm_a { background-color: blue }\n// .atm_b { background: red }\n//\n// and so the more specific selector (.atm_a.atm_a) would win\nexport function getPropertyPriority(property: string) {\n const longhands = Object.values(shorthandProperties).reduce(\n (a, b) => [...a, ...b],\n []\n );\n\n return longhands.includes(property) ? 2 : 1;\n}\n"],"mappings":"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","names":["knownProperties","postcss","stylis","CssProcessor"]}
|
|
1
|
+
{"version":3,"sources":["../../src/processors/css.ts","../../src/processors/helpers/atomize.ts","../../src/processors/helpers/propertyPriority.ts"],"sourcesContent":["import type { SourceLocation } from '@babel/types';\nimport type { Rules, ValueCache } from '@wyw-in-js/processor-utils';\nimport { logger } from '@wyw-in-js/shared';\n\nimport CssProcessor from '@linaria/core/processors/css';\n\nimport atomize from './helpers/atomize';\n\nconst debug = logger.extend('AtomicCssProcessor');\n\nexport default class AtomicCssProcessor extends CssProcessor {\n #classes: string | undefined;\n\n private get classes(): string {\n if (typeof this.#classes !== 'undefined') {\n return this.#classes;\n }\n\n throw new Error('Styles are not extracted yet. Please call `build` first.');\n }\n\n public override doRuntimeReplacement(): void {\n this.replacer(this.astService.stringLiteral(this.classes), false);\n }\n\n public override extractRules(\n valueCache: ValueCache,\n cssText: string,\n loc?: SourceLocation | null\n ): Rules {\n const rules: Rules = {};\n\n const atomicRules = atomize(cssText, false);\n atomicRules.forEach((rule) => {\n // eslint-disable-next-line no-param-reassign\n rules[rule.cssText] = {\n cssText: rule.cssText,\n start: loc?.start ?? null,\n className: this.className!,\n displayName: this.displayName!,\n atom: true,\n };\n\n debug('extracted-atomic-rule:\\n%s', rule.cssText);\n });\n\n this.#classes = atomicRules\n // Some atomic rules produced (eg. keyframes) don't have class names, and they also don't need to appear in the object\n .filter((rule) => !!rule.className)\n .map((rule) => rule.className!)\n .join(' ');\n\n return rules;\n }\n}\n","import { slugify } from '@wyw-in-js/shared';\nimport { all as knownProperties } from 'known-css-properties';\nimport type { Document, AtRule, Container, Rule } from 'postcss';\nimport postcss from 'postcss';\nimport { compile, serialize, stringify } from 'stylis';\n\nimport { getPropertyPriority } from './propertyPriority';\n\nconst knownPropertiesMap = knownProperties.reduce(\n (acc: { [property: string]: number }, property, i) => {\n acc[property] = i;\n return acc;\n },\n {}\n);\n\nfunction hashProperty(property: string) {\n const index = knownPropertiesMap[property];\n // If it's a known property, let's use the index to cut down the length of the hash.\n // otherwise, slugify\n if (index !== undefined) {\n return index.toString(36); // base 36 so that we get a-z,0-9\n }\n return slugify(property);\n}\n\nconst parseCss = (cssText: string) => {\n try {\n return postcss.parse(cssText);\n } catch (e) {\n if (e instanceof Error) {\n throw new Error(`Error parsing CSS: ${e.message}\\nCSS:\\n${cssText}`);\n }\n\n throw new Error(`Unknown error parsing CSS.\\nCSS:\\n${cssText}`);\n }\n};\n\nexport default function atomize(cssText: string, hasPriority = false) {\n const atomicRules: {\n className?: string;\n cssText: string;\n property: string;\n }[] = [];\n\n const stylesheet = parseCss(cssText);\n\n // We want to extract all keyframes and leave them as-is.\n // This isn't scoped locally yet\n stylesheet.walkAtRules('keyframes', (atRule) => {\n atRule.remove();\n atomicRules.push({\n property: atRule.name,\n cssText: atRule.toString(),\n });\n });\n\n stylesheet.walkDecls((decl) => {\n let thisParent: Document | Container | undefined = decl.parent;\n const parents: (Document | Container)[] = [];\n const atomicProperty = [decl.prop];\n let hasAtRule = false;\n\n // Traverse the declarations parents, and collect them all.\n while (thisParent && thisParent !== stylesheet) {\n parents.unshift(thisParent);\n if (thisParent.type === 'atrule') {\n hasAtRule = true;\n // @media queries, @supports etc.\n atomicProperty.push(\n (thisParent as AtRule).name,\n (thisParent as AtRule).params\n );\n } else if (thisParent.type === 'rule') {\n // pseudo classes etc.\n atomicProperty.push((thisParent as Rule).selector);\n }\n\n thisParent = thisParent.parent;\n }\n\n // Create a new stylesheet that contains *just* the extracted atomic rule and wrapping selectors, eg.\n // `@media (max-width: 400px) { background: red; }`, or\n // `&:hover { background: red; }`, or\n // `background: red;`\n // We do this so we can run it through stylis, to produce a full atom, eg.\n // `@media (max-width: 400px) { .atm_foo { background: red; } }`\n const root = postcss.root();\n let container: Document | Container = root;\n parents.forEach((parent) => {\n const newNode = parent.clone();\n newNode.removeAll();\n container.append(newNode);\n container = newNode;\n });\n container.append(decl.clone());\n\n const css = root.toString();\n const propertySlug = hashProperty([...atomicProperty].join(';'));\n const valueSlug = slugify(decl.value);\n const className = `atm_${propertySlug}_${valueSlug}`;\n\n const propertyPriority =\n getPropertyPriority(decl.prop) +\n (hasAtRule ? 1 : 0) +\n (hasPriority ? 1 : 0);\n const selector = `.${className}`.repeat(propertyPriority);\n const processedCss = serialize(compile(`${selector} {${css}}`), stringify);\n\n atomicRules.push({\n property: atomicProperty.join(' '),\n className,\n cssText: processedCss,\n });\n });\n\n return atomicRules;\n}\n","const shorthandProperties = {\n // The `all` property resets everything, and should effectively have priority zero.\n // In practice, this can be achieved by using: div { all: ... } to have even less specificity, but to avoid duplicating all selectors, we just let it be\n // 'all': []\n animation: [\n 'animation-name',\n 'animation-duration',\n 'animation-timing-function',\n 'animation-delay',\n 'animation-iteration-count',\n 'animation-direction',\n 'animation-fill-mode',\n 'animation-play-state',\n ],\n background: [\n 'background-attachment',\n 'background-clip',\n 'background-color',\n 'background-image',\n 'background-origin',\n 'background-position',\n 'background-repeat',\n 'background-size',\n ],\n border: ['border-color', 'border-style', 'border-width'],\n 'border-block-end': [\n 'border-block-end-color',\n 'border-block-end-style',\n 'border-block-end-width',\n ],\n 'border-block-start': [\n 'border-block-start-color',\n 'border-block-start-style',\n 'border-block-start-width',\n ],\n 'border-bottom': [\n 'border-bottom-color',\n 'border-bottom-style',\n 'border-bottom-width',\n ],\n 'border-color': [\n 'border-bottom-color',\n 'border-left-color',\n 'border-right-color',\n 'border-top-color',\n ],\n 'border-image': [\n 'border-image-outset',\n 'border-image-repeat',\n 'border-image-slice',\n 'border-image-source',\n 'border-image-width',\n ],\n 'border-inline-end': [\n 'border-inline-end-color',\n 'border-inline-end-style',\n 'border-inline-end-width',\n ],\n 'border-inline-start': [\n 'border-inline-start-color',\n 'border-inline-start-style',\n 'border-inline-start-width',\n ],\n 'border-left': [\n 'border-left-color',\n 'border-left-style',\n 'border-left-width',\n ],\n 'border-radius': [\n 'border-top-left-radius',\n 'border-top-right-radius',\n 'border-bottom-right-radius',\n 'border-bottom-left-radius',\n ],\n 'border-right': [\n 'border-right-color',\n 'border-right-style',\n 'border-right-width',\n ],\n 'border-style': [\n 'border-bottom-style',\n 'border-left-style',\n 'border-right-style',\n 'border-top-style',\n ],\n 'border-top': ['border-top-color', 'border-top-style', 'border-top-width'],\n 'border-width': [\n 'border-bottom-width',\n 'border-left-width',\n 'border-right-width',\n 'border-top-width',\n ],\n 'column-rule': [\n 'column-rule-width',\n 'column-rule-style',\n 'column-rule-color',\n ],\n columns: ['column-count', 'column-width'],\n flex: ['flex-grow', 'flex-shrink', 'flex-basis'],\n 'flex-flow': ['flex-direction', 'flex-wrap'],\n font: [\n 'font-family',\n 'font-size',\n 'font-stretch',\n 'font-style',\n 'font-variant',\n 'font-weight',\n 'line-height',\n ],\n gap: ['row-gap', 'column-gap'],\n grid: [\n 'grid-auto-columns',\n 'grid-auto-flow',\n 'grid-auto-rows',\n 'grid-template-areas',\n 'grid-template-columns',\n 'grid-template-rows',\n ],\n 'grid-area': [\n 'grid-row-start',\n 'grid-column-start',\n 'grid-row-end',\n 'grid-column-end',\n ],\n 'grid-column': ['grid-column-end', 'grid-column-start'],\n 'grid-row': ['grid-row-end', 'grid-row-start'],\n 'grid-template': [\n 'grid-template-areas',\n 'grid-template-columns',\n 'grid-template-rows',\n ],\n 'list-style': ['list-style-image', 'list-style-position', 'list-style-type'],\n margin: ['margin-bottom', 'margin-left', 'margin-right', 'margin-top'],\n mask: [\n 'mask-clip',\n 'mask-composite',\n 'mask-image',\n 'mask-mode',\n 'mask-origin',\n 'mask-position',\n 'mask-repeat',\n 'mask-size',\n ],\n offset: [\n 'offset-anchor',\n 'offset-distance',\n 'offset-path',\n 'offset-position',\n 'offset-rotate',\n ],\n outline: ['outline-color', 'outline-style', 'outline-width'],\n overflow: ['overflow-x', 'overflow-y'],\n padding: ['padding-bottom', 'padding-left', 'padding-right', 'padding-top'],\n 'place-content': ['align-content', 'justify-content'],\n 'place-items': ['align-items', 'justify-items'],\n 'place-self': ['align-self', 'justify-self'],\n 'scroll-margin': [\n 'scroll-margin-bottom',\n 'scroll-margin-left',\n 'scroll-margin-right',\n 'scroll-margin-top',\n ],\n 'scroll-padding': [\n 'scroll-padding-bottom',\n 'scroll-padding-left',\n 'scroll-padding-right',\n 'scroll-padding-top',\n ],\n 'text-decoration': [\n 'text-decoration-color',\n 'text-decoration-line',\n 'text-decoration-style',\n 'text-decoration-thickness',\n ],\n 'text-emphasis': ['text-emphasis-color', 'text-emphasis-style'],\n transition: [\n 'transition-delay',\n 'transition-duration',\n 'transition-property',\n 'transition-timing-function',\n ],\n};\n\n// Get the property priority: the higher the priority, the higher the resulting\n// specificity of the atom. For example, if we had:\n//\n// import { css } from '@linaria/atomic';\n// css`\n// background-color: blue;\n// background: red;\n// `;\n//\n// we would produce:\n//\n// .atm_a.atm_a { background-color: blue }\n// .atm_b { background: red }\n//\n// and so the more specific selector (.atm_a.atm_a) would win\nexport function getPropertyPriority(property: string) {\n const longhands = Object.values(shorthandProperties).reduce(\n (a, b) => [...a, ...b],\n []\n );\n\n return longhands.includes(property) ? 2 : 1;\n}\n"],"mappings":"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","names":["import_shared","knownProperties","postcss","CssProcessor"]}
|
package/dist/processors/css.mjs
CHANGED
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
// src/processors/css.ts
|
|
2
|
+
import { logger } from "@wyw-in-js/shared";
|
|
2
3
|
import CssProcessor from "@linaria/core/processors/css";
|
|
3
|
-
import { debug } from "@linaria/logger";
|
|
4
4
|
|
|
5
5
|
// src/processors/helpers/atomize.ts
|
|
6
|
+
import { slugify } from "@wyw-in-js/shared";
|
|
6
7
|
import { all as knownProperties } from "known-css-properties";
|
|
7
8
|
import postcss from "postcss";
|
|
8
|
-
import
|
|
9
|
-
import { slugify } from "@linaria/utils";
|
|
9
|
+
import { compile, serialize, stringify } from "stylis";
|
|
10
10
|
|
|
11
11
|
// src/processors/helpers/propertyPriority.ts
|
|
12
12
|
var shorthandProperties = {
|
|
@@ -229,10 +229,6 @@ ${cssText}`);
|
|
|
229
229
|
}
|
|
230
230
|
};
|
|
231
231
|
function atomize(cssText, hasPriority = false) {
|
|
232
|
-
stylis.set({
|
|
233
|
-
prefix: false,
|
|
234
|
-
keyframe: false
|
|
235
|
-
});
|
|
236
232
|
const atomicRules = [];
|
|
237
233
|
const stylesheet = parseCss(cssText);
|
|
238
234
|
stylesheet.walkAtRules("keyframes", (atRule) => {
|
|
@@ -274,7 +270,8 @@ function atomize(cssText, hasPriority = false) {
|
|
|
274
270
|
const valueSlug = slugify(decl.value);
|
|
275
271
|
const className = `atm_${propertySlug}_${valueSlug}`;
|
|
276
272
|
const propertyPriority = getPropertyPriority(decl.prop) + (hasAtRule ? 1 : 0) + (hasPriority ? 1 : 0);
|
|
277
|
-
const
|
|
273
|
+
const selector = `.${className}`.repeat(propertyPriority);
|
|
274
|
+
const processedCss = serialize(compile(`${selector} {${css}}`), stringify);
|
|
278
275
|
atomicRules.push({
|
|
279
276
|
property: atomicProperty.join(" "),
|
|
280
277
|
className,
|
|
@@ -285,6 +282,7 @@ function atomize(cssText, hasPriority = false) {
|
|
|
285
282
|
}
|
|
286
283
|
|
|
287
284
|
// src/processors/css.ts
|
|
285
|
+
var debug = logger.extend("AtomicCssProcessor");
|
|
288
286
|
var AtomicCssProcessor = class extends CssProcessor {
|
|
289
287
|
#classes;
|
|
290
288
|
get classes() {
|
|
@@ -307,11 +305,7 @@ var AtomicCssProcessor = class extends CssProcessor {
|
|
|
307
305
|
displayName: this.displayName,
|
|
308
306
|
atom: true
|
|
309
307
|
};
|
|
310
|
-
debug(
|
|
311
|
-
"evaluator:template-processor:extracted-atomic-rule",
|
|
312
|
-
`
|
|
313
|
-
${rule.cssText}`
|
|
314
|
-
);
|
|
308
|
+
debug("extracted-atomic-rule:\n%s", rule.cssText);
|
|
315
309
|
});
|
|
316
310
|
this.#classes = atomicRules.filter((rule) => !!rule.className).map((rule) => rule.className).join(" ");
|
|
317
311
|
return rules;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/processors/css.ts","../../src/processors/helpers/atomize.ts","../../src/processors/helpers/propertyPriority.ts"],"sourcesContent":["import type { SourceLocation } from '@babel/types';\n\nimport CssProcessor from '@linaria/core/processors/css';\nimport { debug } from '@linaria/logger';\nimport type { Rules, ValueCache } from '@linaria/tags';\n\nimport atomize from './helpers/atomize';\n\nexport default class AtomicCssProcessor extends CssProcessor {\n #classes: string | undefined;\n\n private get classes(): string {\n if (typeof this.#classes !== 'undefined') {\n return this.#classes;\n }\n\n throw new Error('Styles are not extracted yet. Please call `build` first.');\n }\n\n public override doRuntimeReplacement(): void {\n this.replacer(this.astService.stringLiteral(this.classes), false);\n }\n\n public override extractRules(\n valueCache: ValueCache,\n cssText: string,\n loc?: SourceLocation | null\n ): Rules {\n const rules: Rules = {};\n\n const atomicRules = atomize(cssText, false);\n atomicRules.forEach((rule) => {\n // eslint-disable-next-line no-param-reassign\n rules[rule.cssText] = {\n cssText: rule.cssText,\n start: loc?.start ?? null,\n className: this.className!,\n displayName: this.displayName!,\n atom: true,\n };\n\n debug(\n 'evaluator:template-processor:extracted-atomic-rule',\n `\\n${rule.cssText}`\n );\n });\n\n this.#classes = atomicRules\n // Some atomic rules produced (eg. keyframes) don't have class names, and they also don't need to appear in the object\n .filter((rule) => !!rule.className)\n .map((rule) => rule.className!)\n .join(' ');\n\n return rules;\n }\n}\n","import { all as knownProperties } from 'known-css-properties';\nimport type { Document, AtRule, Container, Rule } from 'postcss';\nimport postcss from 'postcss';\nimport stylis from 'stylis';\n\nimport { slugify } from '@linaria/utils';\n\nimport { getPropertyPriority } from './propertyPriority';\n\nconst knownPropertiesMap = knownProperties.reduce(\n (acc: { [property: string]: number }, property, i) => {\n acc[property] = i;\n return acc;\n },\n {}\n);\n\nfunction hashProperty(property: string) {\n const index = knownPropertiesMap[property];\n // If it's a known property, let's use the index to cut down the length of the hash.\n // otherwise, slugify\n if (index !== undefined) {\n return index.toString(36); // base 36 so that we get a-z,0-9\n }\n return slugify(property);\n}\n\nconst parseCss = (cssText: string) => {\n try {\n return postcss.parse(cssText);\n } catch (e) {\n if (e instanceof Error) {\n throw new Error(`Error parsing CSS: ${e.message}\\nCSS:\\n${cssText}`);\n }\n\n throw new Error(`Unknown error parsing CSS.\\nCSS:\\n${cssText}`);\n }\n};\n\nexport default function atomize(cssText: string, hasPriority = false) {\n stylis.set({\n prefix: false,\n keyframe: false,\n });\n const atomicRules: {\n className?: string;\n cssText: string;\n property: string;\n }[] = [];\n\n const stylesheet = parseCss(cssText);\n\n // We want to extract all keyframes and leave them as-is.\n // This isn't scoped locally yet\n stylesheet.walkAtRules('keyframes', (atRule) => {\n atRule.remove();\n atomicRules.push({\n property: atRule.name,\n cssText: atRule.toString(),\n });\n });\n\n stylesheet.walkDecls((decl) => {\n let thisParent: Document | Container | undefined = decl.parent;\n const parents: (Document | Container)[] = [];\n const atomicProperty = [decl.prop];\n let hasAtRule = false;\n\n // Traverse the declarations parents, and collect them all.\n while (thisParent && thisParent !== stylesheet) {\n parents.unshift(thisParent);\n if (thisParent.type === 'atrule') {\n hasAtRule = true;\n // @media queries, @supports etc.\n atomicProperty.push(\n (thisParent as AtRule).name,\n (thisParent as AtRule).params\n );\n } else if (thisParent.type === 'rule') {\n // pseudo classes etc.\n atomicProperty.push((thisParent as Rule).selector);\n }\n\n thisParent = thisParent.parent;\n }\n\n // Create a new stylesheet that contains *just* the extracted atomic rule and wrapping selectors, eg.\n // `@media (max-width: 400px) { background: red; }`, or\n // `&:hover { background: red; }`, or\n // `background: red;`\n // We do this so we can run it through stylis, to produce a full atom, eg.\n // `@media (max-width: 400px) { .atm_foo { background: red; } }`\n const root = postcss.root();\n let container: Document | Container = root;\n parents.forEach((parent) => {\n const newNode = parent.clone();\n newNode.removeAll();\n container.append(newNode);\n container = newNode;\n });\n container.append(decl.clone());\n\n const css = root.toString();\n const propertySlug = hashProperty([...atomicProperty].join(';'));\n const valueSlug = slugify(decl.value);\n const className = `atm_${propertySlug}_${valueSlug}`;\n\n const propertyPriority =\n getPropertyPriority(decl.prop) +\n (hasAtRule ? 1 : 0) +\n (hasPriority ? 1 : 0);\n const processedCss = stylis(`.${className}`.repeat(propertyPriority), css);\n\n atomicRules.push({\n property: atomicProperty.join(' '),\n className,\n cssText: processedCss,\n });\n });\n\n return atomicRules;\n}\n","const shorthandProperties = {\n // The `all` property resets everything, and should effectively have priority zero.\n // In practice, this can be achieved by using: div { all: ... } to have even less specificity, but to avoid duplicating all selectors, we just let it be\n // 'all': []\n animation: [\n 'animation-name',\n 'animation-duration',\n 'animation-timing-function',\n 'animation-delay',\n 'animation-iteration-count',\n 'animation-direction',\n 'animation-fill-mode',\n 'animation-play-state',\n ],\n background: [\n 'background-attachment',\n 'background-clip',\n 'background-color',\n 'background-image',\n 'background-origin',\n 'background-position',\n 'background-repeat',\n 'background-size',\n ],\n border: ['border-color', 'border-style', 'border-width'],\n 'border-block-end': [\n 'border-block-end-color',\n 'border-block-end-style',\n 'border-block-end-width',\n ],\n 'border-block-start': [\n 'border-block-start-color',\n 'border-block-start-style',\n 'border-block-start-width',\n ],\n 'border-bottom': [\n 'border-bottom-color',\n 'border-bottom-style',\n 'border-bottom-width',\n ],\n 'border-color': [\n 'border-bottom-color',\n 'border-left-color',\n 'border-right-color',\n 'border-top-color',\n ],\n 'border-image': [\n 'border-image-outset',\n 'border-image-repeat',\n 'border-image-slice',\n 'border-image-source',\n 'border-image-width',\n ],\n 'border-inline-end': [\n 'border-inline-end-color',\n 'border-inline-end-style',\n 'border-inline-end-width',\n ],\n 'border-inline-start': [\n 'border-inline-start-color',\n 'border-inline-start-style',\n 'border-inline-start-width',\n ],\n 'border-left': [\n 'border-left-color',\n 'border-left-style',\n 'border-left-width',\n ],\n 'border-radius': [\n 'border-top-left-radius',\n 'border-top-right-radius',\n 'border-bottom-right-radius',\n 'border-bottom-left-radius',\n ],\n 'border-right': [\n 'border-right-color',\n 'border-right-style',\n 'border-right-width',\n ],\n 'border-style': [\n 'border-bottom-style',\n 'border-left-style',\n 'border-right-style',\n 'border-top-style',\n ],\n 'border-top': ['border-top-color', 'border-top-style', 'border-top-width'],\n 'border-width': [\n 'border-bottom-width',\n 'border-left-width',\n 'border-right-width',\n 'border-top-width',\n ],\n 'column-rule': [\n 'column-rule-width',\n 'column-rule-style',\n 'column-rule-color',\n ],\n columns: ['column-count', 'column-width'],\n flex: ['flex-grow', 'flex-shrink', 'flex-basis'],\n 'flex-flow': ['flex-direction', 'flex-wrap'],\n font: [\n 'font-family',\n 'font-size',\n 'font-stretch',\n 'font-style',\n 'font-variant',\n 'font-weight',\n 'line-height',\n ],\n gap: ['row-gap', 'column-gap'],\n grid: [\n 'grid-auto-columns',\n 'grid-auto-flow',\n 'grid-auto-rows',\n 'grid-template-areas',\n 'grid-template-columns',\n 'grid-template-rows',\n ],\n 'grid-area': [\n 'grid-row-start',\n 'grid-column-start',\n 'grid-row-end',\n 'grid-column-end',\n ],\n 'grid-column': ['grid-column-end', 'grid-column-start'],\n 'grid-row': ['grid-row-end', 'grid-row-start'],\n 'grid-template': [\n 'grid-template-areas',\n 'grid-template-columns',\n 'grid-template-rows',\n ],\n 'list-style': ['list-style-image', 'list-style-position', 'list-style-type'],\n margin: ['margin-bottom', 'margin-left', 'margin-right', 'margin-top'],\n mask: [\n 'mask-clip',\n 'mask-composite',\n 'mask-image',\n 'mask-mode',\n 'mask-origin',\n 'mask-position',\n 'mask-repeat',\n 'mask-size',\n ],\n offset: [\n 'offset-anchor',\n 'offset-distance',\n 'offset-path',\n 'offset-position',\n 'offset-rotate',\n ],\n outline: ['outline-color', 'outline-style', 'outline-width'],\n overflow: ['overflow-x', 'overflow-y'],\n padding: ['padding-bottom', 'padding-left', 'padding-right', 'padding-top'],\n 'place-content': ['align-content', 'justify-content'],\n 'place-items': ['align-items', 'justify-items'],\n 'place-self': ['align-self', 'justify-self'],\n 'scroll-margin': [\n 'scroll-margin-bottom',\n 'scroll-margin-left',\n 'scroll-margin-right',\n 'scroll-margin-top',\n ],\n 'scroll-padding': [\n 'scroll-padding-bottom',\n 'scroll-padding-left',\n 'scroll-padding-right',\n 'scroll-padding-top',\n ],\n 'text-decoration': [\n 'text-decoration-color',\n 'text-decoration-line',\n 'text-decoration-style',\n 'text-decoration-thickness',\n ],\n 'text-emphasis': ['text-emphasis-color', 'text-emphasis-style'],\n transition: [\n 'transition-delay',\n 'transition-duration',\n 'transition-property',\n 'transition-timing-function',\n ],\n};\n\n// Get the property priority: the higher the priority, the higher the resulting\n// specificity of the atom. For example, if we had:\n//\n// import { css } from '@linaria/atomic';\n// css`\n// background-color: blue;\n// background: red;\n// `;\n//\n// we would produce:\n//\n// .atm_a.atm_a { background-color: blue }\n// .atm_b { background: red }\n//\n// and so the more specific selector (.atm_a.atm_a) would win\nexport function getPropertyPriority(property: string) {\n const longhands = Object.values(shorthandProperties).reduce(\n (a, b) => [...a, ...b],\n []\n );\n\n return longhands.includes(property) ? 2 : 1;\n}\n"],"mappings":"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","names":[]}
|
|
1
|
+
{"version":3,"sources":["../../src/processors/css.ts","../../src/processors/helpers/atomize.ts","../../src/processors/helpers/propertyPriority.ts"],"sourcesContent":["import type { SourceLocation } from '@babel/types';\nimport type { Rules, ValueCache } from '@wyw-in-js/processor-utils';\nimport { logger } from '@wyw-in-js/shared';\n\nimport CssProcessor from '@linaria/core/processors/css';\n\nimport atomize from './helpers/atomize';\n\nconst debug = logger.extend('AtomicCssProcessor');\n\nexport default class AtomicCssProcessor extends CssProcessor {\n #classes: string | undefined;\n\n private get classes(): string {\n if (typeof this.#classes !== 'undefined') {\n return this.#classes;\n }\n\n throw new Error('Styles are not extracted yet. Please call `build` first.');\n }\n\n public override doRuntimeReplacement(): void {\n this.replacer(this.astService.stringLiteral(this.classes), false);\n }\n\n public override extractRules(\n valueCache: ValueCache,\n cssText: string,\n loc?: SourceLocation | null\n ): Rules {\n const rules: Rules = {};\n\n const atomicRules = atomize(cssText, false);\n atomicRules.forEach((rule) => {\n // eslint-disable-next-line no-param-reassign\n rules[rule.cssText] = {\n cssText: rule.cssText,\n start: loc?.start ?? null,\n className: this.className!,\n displayName: this.displayName!,\n atom: true,\n };\n\n debug('extracted-atomic-rule:\\n%s', rule.cssText);\n });\n\n this.#classes = atomicRules\n // Some atomic rules produced (eg. keyframes) don't have class names, and they also don't need to appear in the object\n .filter((rule) => !!rule.className)\n .map((rule) => rule.className!)\n .join(' ');\n\n return rules;\n }\n}\n","import { slugify } from '@wyw-in-js/shared';\nimport { all as knownProperties } from 'known-css-properties';\nimport type { Document, AtRule, Container, Rule } from 'postcss';\nimport postcss from 'postcss';\nimport { compile, serialize, stringify } from 'stylis';\n\nimport { getPropertyPriority } from './propertyPriority';\n\nconst knownPropertiesMap = knownProperties.reduce(\n (acc: { [property: string]: number }, property, i) => {\n acc[property] = i;\n return acc;\n },\n {}\n);\n\nfunction hashProperty(property: string) {\n const index = knownPropertiesMap[property];\n // If it's a known property, let's use the index to cut down the length of the hash.\n // otherwise, slugify\n if (index !== undefined) {\n return index.toString(36); // base 36 so that we get a-z,0-9\n }\n return slugify(property);\n}\n\nconst parseCss = (cssText: string) => {\n try {\n return postcss.parse(cssText);\n } catch (e) {\n if (e instanceof Error) {\n throw new Error(`Error parsing CSS: ${e.message}\\nCSS:\\n${cssText}`);\n }\n\n throw new Error(`Unknown error parsing CSS.\\nCSS:\\n${cssText}`);\n }\n};\n\nexport default function atomize(cssText: string, hasPriority = false) {\n const atomicRules: {\n className?: string;\n cssText: string;\n property: string;\n }[] = [];\n\n const stylesheet = parseCss(cssText);\n\n // We want to extract all keyframes and leave them as-is.\n // This isn't scoped locally yet\n stylesheet.walkAtRules('keyframes', (atRule) => {\n atRule.remove();\n atomicRules.push({\n property: atRule.name,\n cssText: atRule.toString(),\n });\n });\n\n stylesheet.walkDecls((decl) => {\n let thisParent: Document | Container | undefined = decl.parent;\n const parents: (Document | Container)[] = [];\n const atomicProperty = [decl.prop];\n let hasAtRule = false;\n\n // Traverse the declarations parents, and collect them all.\n while (thisParent && thisParent !== stylesheet) {\n parents.unshift(thisParent);\n if (thisParent.type === 'atrule') {\n hasAtRule = true;\n // @media queries, @supports etc.\n atomicProperty.push(\n (thisParent as AtRule).name,\n (thisParent as AtRule).params\n );\n } else if (thisParent.type === 'rule') {\n // pseudo classes etc.\n atomicProperty.push((thisParent as Rule).selector);\n }\n\n thisParent = thisParent.parent;\n }\n\n // Create a new stylesheet that contains *just* the extracted atomic rule and wrapping selectors, eg.\n // `@media (max-width: 400px) { background: red; }`, or\n // `&:hover { background: red; }`, or\n // `background: red;`\n // We do this so we can run it through stylis, to produce a full atom, eg.\n // `@media (max-width: 400px) { .atm_foo { background: red; } }`\n const root = postcss.root();\n let container: Document | Container = root;\n parents.forEach((parent) => {\n const newNode = parent.clone();\n newNode.removeAll();\n container.append(newNode);\n container = newNode;\n });\n container.append(decl.clone());\n\n const css = root.toString();\n const propertySlug = hashProperty([...atomicProperty].join(';'));\n const valueSlug = slugify(decl.value);\n const className = `atm_${propertySlug}_${valueSlug}`;\n\n const propertyPriority =\n getPropertyPriority(decl.prop) +\n (hasAtRule ? 1 : 0) +\n (hasPriority ? 1 : 0);\n const selector = `.${className}`.repeat(propertyPriority);\n const processedCss = serialize(compile(`${selector} {${css}}`), stringify);\n\n atomicRules.push({\n property: atomicProperty.join(' '),\n className,\n cssText: processedCss,\n });\n });\n\n return atomicRules;\n}\n","const shorthandProperties = {\n // The `all` property resets everything, and should effectively have priority zero.\n // In practice, this can be achieved by using: div { all: ... } to have even less specificity, but to avoid duplicating all selectors, we just let it be\n // 'all': []\n animation: [\n 'animation-name',\n 'animation-duration',\n 'animation-timing-function',\n 'animation-delay',\n 'animation-iteration-count',\n 'animation-direction',\n 'animation-fill-mode',\n 'animation-play-state',\n ],\n background: [\n 'background-attachment',\n 'background-clip',\n 'background-color',\n 'background-image',\n 'background-origin',\n 'background-position',\n 'background-repeat',\n 'background-size',\n ],\n border: ['border-color', 'border-style', 'border-width'],\n 'border-block-end': [\n 'border-block-end-color',\n 'border-block-end-style',\n 'border-block-end-width',\n ],\n 'border-block-start': [\n 'border-block-start-color',\n 'border-block-start-style',\n 'border-block-start-width',\n ],\n 'border-bottom': [\n 'border-bottom-color',\n 'border-bottom-style',\n 'border-bottom-width',\n ],\n 'border-color': [\n 'border-bottom-color',\n 'border-left-color',\n 'border-right-color',\n 'border-top-color',\n ],\n 'border-image': [\n 'border-image-outset',\n 'border-image-repeat',\n 'border-image-slice',\n 'border-image-source',\n 'border-image-width',\n ],\n 'border-inline-end': [\n 'border-inline-end-color',\n 'border-inline-end-style',\n 'border-inline-end-width',\n ],\n 'border-inline-start': [\n 'border-inline-start-color',\n 'border-inline-start-style',\n 'border-inline-start-width',\n ],\n 'border-left': [\n 'border-left-color',\n 'border-left-style',\n 'border-left-width',\n ],\n 'border-radius': [\n 'border-top-left-radius',\n 'border-top-right-radius',\n 'border-bottom-right-radius',\n 'border-bottom-left-radius',\n ],\n 'border-right': [\n 'border-right-color',\n 'border-right-style',\n 'border-right-width',\n ],\n 'border-style': [\n 'border-bottom-style',\n 'border-left-style',\n 'border-right-style',\n 'border-top-style',\n ],\n 'border-top': ['border-top-color', 'border-top-style', 'border-top-width'],\n 'border-width': [\n 'border-bottom-width',\n 'border-left-width',\n 'border-right-width',\n 'border-top-width',\n ],\n 'column-rule': [\n 'column-rule-width',\n 'column-rule-style',\n 'column-rule-color',\n ],\n columns: ['column-count', 'column-width'],\n flex: ['flex-grow', 'flex-shrink', 'flex-basis'],\n 'flex-flow': ['flex-direction', 'flex-wrap'],\n font: [\n 'font-family',\n 'font-size',\n 'font-stretch',\n 'font-style',\n 'font-variant',\n 'font-weight',\n 'line-height',\n ],\n gap: ['row-gap', 'column-gap'],\n grid: [\n 'grid-auto-columns',\n 'grid-auto-flow',\n 'grid-auto-rows',\n 'grid-template-areas',\n 'grid-template-columns',\n 'grid-template-rows',\n ],\n 'grid-area': [\n 'grid-row-start',\n 'grid-column-start',\n 'grid-row-end',\n 'grid-column-end',\n ],\n 'grid-column': ['grid-column-end', 'grid-column-start'],\n 'grid-row': ['grid-row-end', 'grid-row-start'],\n 'grid-template': [\n 'grid-template-areas',\n 'grid-template-columns',\n 'grid-template-rows',\n ],\n 'list-style': ['list-style-image', 'list-style-position', 'list-style-type'],\n margin: ['margin-bottom', 'margin-left', 'margin-right', 'margin-top'],\n mask: [\n 'mask-clip',\n 'mask-composite',\n 'mask-image',\n 'mask-mode',\n 'mask-origin',\n 'mask-position',\n 'mask-repeat',\n 'mask-size',\n ],\n offset: [\n 'offset-anchor',\n 'offset-distance',\n 'offset-path',\n 'offset-position',\n 'offset-rotate',\n ],\n outline: ['outline-color', 'outline-style', 'outline-width'],\n overflow: ['overflow-x', 'overflow-y'],\n padding: ['padding-bottom', 'padding-left', 'padding-right', 'padding-top'],\n 'place-content': ['align-content', 'justify-content'],\n 'place-items': ['align-items', 'justify-items'],\n 'place-self': ['align-self', 'justify-self'],\n 'scroll-margin': [\n 'scroll-margin-bottom',\n 'scroll-margin-left',\n 'scroll-margin-right',\n 'scroll-margin-top',\n ],\n 'scroll-padding': [\n 'scroll-padding-bottom',\n 'scroll-padding-left',\n 'scroll-padding-right',\n 'scroll-padding-top',\n ],\n 'text-decoration': [\n 'text-decoration-color',\n 'text-decoration-line',\n 'text-decoration-style',\n 'text-decoration-thickness',\n ],\n 'text-emphasis': ['text-emphasis-color', 'text-emphasis-style'],\n transition: [\n 'transition-delay',\n 'transition-duration',\n 'transition-property',\n 'transition-timing-function',\n ],\n};\n\n// Get the property priority: the higher the priority, the higher the resulting\n// specificity of the atom. For example, if we had:\n//\n// import { css } from '@linaria/atomic';\n// css`\n// background-color: blue;\n// background: red;\n// `;\n//\n// we would produce:\n//\n// .atm_a.atm_a { background-color: blue }\n// .atm_b { background: red }\n//\n// and so the more specific selector (.atm_a.atm_a) would win\nexport function getPropertyPriority(property: string) {\n const longhands = Object.values(shorthandProperties).reduce(\n (a, b) => [...a, ...b],\n []\n );\n\n return longhands.includes(property) ? 2 : 1;\n}\n"],"mappings":"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","names":[]}
|
|
@@ -33,15 +33,14 @@ __export(styled_exports, {
|
|
|
33
33
|
default: () => AtomicStyledProcessor
|
|
34
34
|
});
|
|
35
35
|
module.exports = __toCommonJS(styled_exports);
|
|
36
|
-
var
|
|
36
|
+
var import_shared2 = require("@wyw-in-js/shared");
|
|
37
37
|
var import_styled = __toESM(require("@linaria/react/processors/styled"));
|
|
38
|
-
var import_utils2 = require("@linaria/utils");
|
|
39
38
|
|
|
40
39
|
// src/processors/helpers/atomize.ts
|
|
40
|
+
var import_shared = require("@wyw-in-js/shared");
|
|
41
41
|
var import_known_css_properties = require("known-css-properties");
|
|
42
42
|
var import_postcss = __toESM(require("postcss"));
|
|
43
|
-
var import_stylis =
|
|
44
|
-
var import_utils = require("@linaria/utils");
|
|
43
|
+
var import_stylis = require("stylis");
|
|
45
44
|
|
|
46
45
|
// src/processors/helpers/propertyPriority.ts
|
|
47
46
|
var shorthandProperties = {
|
|
@@ -247,7 +246,7 @@ function hashProperty(property) {
|
|
|
247
246
|
if (index !== void 0) {
|
|
248
247
|
return index.toString(36);
|
|
249
248
|
}
|
|
250
|
-
return (0,
|
|
249
|
+
return (0, import_shared.slugify)(property);
|
|
251
250
|
}
|
|
252
251
|
var parseCss = (cssText) => {
|
|
253
252
|
try {
|
|
@@ -264,10 +263,6 @@ ${cssText}`);
|
|
|
264
263
|
}
|
|
265
264
|
};
|
|
266
265
|
function atomize(cssText, hasPriority = false) {
|
|
267
|
-
import_stylis.default.set({
|
|
268
|
-
prefix: false,
|
|
269
|
-
keyframe: false
|
|
270
|
-
});
|
|
271
266
|
const atomicRules = [];
|
|
272
267
|
const stylesheet = parseCss(cssText);
|
|
273
268
|
stylesheet.walkAtRules("keyframes", (atRule) => {
|
|
@@ -306,10 +301,11 @@ function atomize(cssText, hasPriority = false) {
|
|
|
306
301
|
container.append(decl.clone());
|
|
307
302
|
const css = root.toString();
|
|
308
303
|
const propertySlug = hashProperty([...atomicProperty].join(";"));
|
|
309
|
-
const valueSlug = (0,
|
|
304
|
+
const valueSlug = (0, import_shared.slugify)(decl.value);
|
|
310
305
|
const className = `atm_${propertySlug}_${valueSlug}`;
|
|
311
306
|
const propertyPriority = getPropertyPriority(decl.prop) + (hasAtRule ? 1 : 0) + (hasPriority ? 1 : 0);
|
|
312
|
-
const
|
|
307
|
+
const selector = `.${className}`.repeat(propertyPriority);
|
|
308
|
+
const processedCss = (0, import_stylis.serialize)((0, import_stylis.compile)(`${selector} {${css}}`), import_stylis.stringify);
|
|
313
309
|
atomicRules.push({
|
|
314
310
|
property: atomicProperty.join(" "),
|
|
315
311
|
className,
|
|
@@ -320,6 +316,7 @@ function atomize(cssText, hasPriority = false) {
|
|
|
320
316
|
}
|
|
321
317
|
|
|
322
318
|
// src/processors/styled.ts
|
|
319
|
+
var debug = import_shared2.logger.extend("AtomicStyledProcessor");
|
|
323
320
|
var AtomicStyledProcessor = class extends import_styled.default {
|
|
324
321
|
#classes;
|
|
325
322
|
get classes() {
|
|
@@ -333,7 +330,7 @@ var AtomicStyledProcessor = class extends import_styled.default {
|
|
|
333
330
|
extractRules(valueCache, cssText, loc) {
|
|
334
331
|
const rules = {};
|
|
335
332
|
const wrappedValue = typeof this.component === "string" ? null : valueCache.get(this.component.node.name);
|
|
336
|
-
const atomicRules = atomize(cssText, (0,
|
|
333
|
+
const atomicRules = atomize(cssText, (0, import_shared2.hasEvalMeta)(wrappedValue));
|
|
337
334
|
atomicRules.forEach((rule) => {
|
|
338
335
|
rules[rule.cssText] = {
|
|
339
336
|
cssText: rule.cssText,
|
|
@@ -342,11 +339,7 @@ var AtomicStyledProcessor = class extends import_styled.default {
|
|
|
342
339
|
displayName: this.displayName,
|
|
343
340
|
atom: true
|
|
344
341
|
};
|
|
345
|
-
(
|
|
346
|
-
"evaluator:template-processor:extracted-atomic-rule",
|
|
347
|
-
`
|
|
348
|
-
${rule.cssText}`
|
|
349
|
-
);
|
|
342
|
+
debug("extracted-atomic-rule:\n%s", rule.cssText);
|
|
350
343
|
});
|
|
351
344
|
this.#classes = atomicRules.filter((rule) => !!rule.className).map((rule) => rule.className).join(" ");
|
|
352
345
|
return rules;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/processors/styled.ts","../../src/processors/helpers/atomize.ts","../../src/processors/helpers/propertyPriority.ts"],"sourcesContent":["import type { SourceLocation } from '@babel/types';\n\nimport { debug } from '@linaria/logger';\nimport type { IProps } from '@linaria/react/processors/styled';\nimport StyledProcessor from '@linaria/react/processors/styled';\nimport type { Rules, ValueCache } from '@linaria/tags';\nimport { hasMeta } from '@linaria/utils';\n\nimport atomize from './helpers/atomize';\n\nexport default class AtomicStyledProcessor extends StyledProcessor {\n #classes: string | undefined;\n\n private get classes(): string {\n if (this.#classes) {\n return this.#classes;\n }\n\n throw new Error(\n 'Styles are not extracted yet. Please call `extractRules` first.'\n );\n }\n\n public override extractRules(\n valueCache: ValueCache,\n cssText: string,\n loc?: SourceLocation | null\n ): Rules {\n const rules: Rules = {};\n\n const wrappedValue =\n typeof this.component === 'string'\n ? null\n : valueCache.get(this.component.node.name);\n\n const atomicRules = atomize(cssText, hasMeta(wrappedValue));\n atomicRules.forEach((rule) => {\n // eslint-disable-next-line no-param-reassign\n rules[rule.cssText] = {\n cssText: rule.cssText,\n start: loc?.start ?? null,\n className: this.className,\n displayName: this.displayName,\n atom: true,\n };\n\n debug(\n 'evaluator:template-processor:extracted-atomic-rule',\n `\\n${rule.cssText}`\n );\n });\n\n this.#classes = atomicRules\n // Some atomic rules produced (eg. keyframes) don't have class names, and they also don't need to appear in the object\n .filter((rule) => !!rule.className)\n .map((rule) => rule.className!)\n .join(' ');\n\n return rules;\n }\n\n protected override getProps(): IProps {\n const props = super.getProps();\n props.class = [this.classes, this.className].filter(Boolean).join(' ');\n props.atomic = true;\n return props;\n }\n\n protected override getVariableId(\n source: string,\n unit: string,\n precedingCss: string\n ): string {\n const id = this.getCustomVariableId(source, unit, precedingCss);\n if (id) {\n return id;\n }\n\n const context = this.getVariableContext(source, unit, precedingCss);\n // id is based on the slugified value\n return context.valueSlug;\n }\n}\n","import { all as knownProperties } from 'known-css-properties';\nimport type { Document, AtRule, Container, Rule } from 'postcss';\nimport postcss from 'postcss';\nimport stylis from 'stylis';\n\nimport { slugify } from '@linaria/utils';\n\nimport { getPropertyPriority } from './propertyPriority';\n\nconst knownPropertiesMap = knownProperties.reduce(\n (acc: { [property: string]: number }, property, i) => {\n acc[property] = i;\n return acc;\n },\n {}\n);\n\nfunction hashProperty(property: string) {\n const index = knownPropertiesMap[property];\n // If it's a known property, let's use the index to cut down the length of the hash.\n // otherwise, slugify\n if (index !== undefined) {\n return index.toString(36); // base 36 so that we get a-z,0-9\n }\n return slugify(property);\n}\n\nconst parseCss = (cssText: string) => {\n try {\n return postcss.parse(cssText);\n } catch (e) {\n if (e instanceof Error) {\n throw new Error(`Error parsing CSS: ${e.message}\\nCSS:\\n${cssText}`);\n }\n\n throw new Error(`Unknown error parsing CSS.\\nCSS:\\n${cssText}`);\n }\n};\n\nexport default function atomize(cssText: string, hasPriority = false) {\n stylis.set({\n prefix: false,\n keyframe: false,\n });\n const atomicRules: {\n className?: string;\n cssText: string;\n property: string;\n }[] = [];\n\n const stylesheet = parseCss(cssText);\n\n // We want to extract all keyframes and leave them as-is.\n // This isn't scoped locally yet\n stylesheet.walkAtRules('keyframes', (atRule) => {\n atRule.remove();\n atomicRules.push({\n property: atRule.name,\n cssText: atRule.toString(),\n });\n });\n\n stylesheet.walkDecls((decl) => {\n let thisParent: Document | Container | undefined = decl.parent;\n const parents: (Document | Container)[] = [];\n const atomicProperty = [decl.prop];\n let hasAtRule = false;\n\n // Traverse the declarations parents, and collect them all.\n while (thisParent && thisParent !== stylesheet) {\n parents.unshift(thisParent);\n if (thisParent.type === 'atrule') {\n hasAtRule = true;\n // @media queries, @supports etc.\n atomicProperty.push(\n (thisParent as AtRule).name,\n (thisParent as AtRule).params\n );\n } else if (thisParent.type === 'rule') {\n // pseudo classes etc.\n atomicProperty.push((thisParent as Rule).selector);\n }\n\n thisParent = thisParent.parent;\n }\n\n // Create a new stylesheet that contains *just* the extracted atomic rule and wrapping selectors, eg.\n // `@media (max-width: 400px) { background: red; }`, or\n // `&:hover { background: red; }`, or\n // `background: red;`\n // We do this so we can run it through stylis, to produce a full atom, eg.\n // `@media (max-width: 400px) { .atm_foo { background: red; } }`\n const root = postcss.root();\n let container: Document | Container = root;\n parents.forEach((parent) => {\n const newNode = parent.clone();\n newNode.removeAll();\n container.append(newNode);\n container = newNode;\n });\n container.append(decl.clone());\n\n const css = root.toString();\n const propertySlug = hashProperty([...atomicProperty].join(';'));\n const valueSlug = slugify(decl.value);\n const className = `atm_${propertySlug}_${valueSlug}`;\n\n const propertyPriority =\n getPropertyPriority(decl.prop) +\n (hasAtRule ? 1 : 0) +\n (hasPriority ? 1 : 0);\n const processedCss = stylis(`.${className}`.repeat(propertyPriority), css);\n\n atomicRules.push({\n property: atomicProperty.join(' '),\n className,\n cssText: processedCss,\n });\n });\n\n return atomicRules;\n}\n","const shorthandProperties = {\n // The `all` property resets everything, and should effectively have priority zero.\n // In practice, this can be achieved by using: div { all: ... } to have even less specificity, but to avoid duplicating all selectors, we just let it be\n // 'all': []\n animation: [\n 'animation-name',\n 'animation-duration',\n 'animation-timing-function',\n 'animation-delay',\n 'animation-iteration-count',\n 'animation-direction',\n 'animation-fill-mode',\n 'animation-play-state',\n ],\n background: [\n 'background-attachment',\n 'background-clip',\n 'background-color',\n 'background-image',\n 'background-origin',\n 'background-position',\n 'background-repeat',\n 'background-size',\n ],\n border: ['border-color', 'border-style', 'border-width'],\n 'border-block-end': [\n 'border-block-end-color',\n 'border-block-end-style',\n 'border-block-end-width',\n ],\n 'border-block-start': [\n 'border-block-start-color',\n 'border-block-start-style',\n 'border-block-start-width',\n ],\n 'border-bottom': [\n 'border-bottom-color',\n 'border-bottom-style',\n 'border-bottom-width',\n ],\n 'border-color': [\n 'border-bottom-color',\n 'border-left-color',\n 'border-right-color',\n 'border-top-color',\n ],\n 'border-image': [\n 'border-image-outset',\n 'border-image-repeat',\n 'border-image-slice',\n 'border-image-source',\n 'border-image-width',\n ],\n 'border-inline-end': [\n 'border-inline-end-color',\n 'border-inline-end-style',\n 'border-inline-end-width',\n ],\n 'border-inline-start': [\n 'border-inline-start-color',\n 'border-inline-start-style',\n 'border-inline-start-width',\n ],\n 'border-left': [\n 'border-left-color',\n 'border-left-style',\n 'border-left-width',\n ],\n 'border-radius': [\n 'border-top-left-radius',\n 'border-top-right-radius',\n 'border-bottom-right-radius',\n 'border-bottom-left-radius',\n ],\n 'border-right': [\n 'border-right-color',\n 'border-right-style',\n 'border-right-width',\n ],\n 'border-style': [\n 'border-bottom-style',\n 'border-left-style',\n 'border-right-style',\n 'border-top-style',\n ],\n 'border-top': ['border-top-color', 'border-top-style', 'border-top-width'],\n 'border-width': [\n 'border-bottom-width',\n 'border-left-width',\n 'border-right-width',\n 'border-top-width',\n ],\n 'column-rule': [\n 'column-rule-width',\n 'column-rule-style',\n 'column-rule-color',\n ],\n columns: ['column-count', 'column-width'],\n flex: ['flex-grow', 'flex-shrink', 'flex-basis'],\n 'flex-flow': ['flex-direction', 'flex-wrap'],\n font: [\n 'font-family',\n 'font-size',\n 'font-stretch',\n 'font-style',\n 'font-variant',\n 'font-weight',\n 'line-height',\n ],\n gap: ['row-gap', 'column-gap'],\n grid: [\n 'grid-auto-columns',\n 'grid-auto-flow',\n 'grid-auto-rows',\n 'grid-template-areas',\n 'grid-template-columns',\n 'grid-template-rows',\n ],\n 'grid-area': [\n 'grid-row-start',\n 'grid-column-start',\n 'grid-row-end',\n 'grid-column-end',\n ],\n 'grid-column': ['grid-column-end', 'grid-column-start'],\n 'grid-row': ['grid-row-end', 'grid-row-start'],\n 'grid-template': [\n 'grid-template-areas',\n 'grid-template-columns',\n 'grid-template-rows',\n ],\n 'list-style': ['list-style-image', 'list-style-position', 'list-style-type'],\n margin: ['margin-bottom', 'margin-left', 'margin-right', 'margin-top'],\n mask: [\n 'mask-clip',\n 'mask-composite',\n 'mask-image',\n 'mask-mode',\n 'mask-origin',\n 'mask-position',\n 'mask-repeat',\n 'mask-size',\n ],\n offset: [\n 'offset-anchor',\n 'offset-distance',\n 'offset-path',\n 'offset-position',\n 'offset-rotate',\n ],\n outline: ['outline-color', 'outline-style', 'outline-width'],\n overflow: ['overflow-x', 'overflow-y'],\n padding: ['padding-bottom', 'padding-left', 'padding-right', 'padding-top'],\n 'place-content': ['align-content', 'justify-content'],\n 'place-items': ['align-items', 'justify-items'],\n 'place-self': ['align-self', 'justify-self'],\n 'scroll-margin': [\n 'scroll-margin-bottom',\n 'scroll-margin-left',\n 'scroll-margin-right',\n 'scroll-margin-top',\n ],\n 'scroll-padding': [\n 'scroll-padding-bottom',\n 'scroll-padding-left',\n 'scroll-padding-right',\n 'scroll-padding-top',\n ],\n 'text-decoration': [\n 'text-decoration-color',\n 'text-decoration-line',\n 'text-decoration-style',\n 'text-decoration-thickness',\n ],\n 'text-emphasis': ['text-emphasis-color', 'text-emphasis-style'],\n transition: [\n 'transition-delay',\n 'transition-duration',\n 'transition-property',\n 'transition-timing-function',\n ],\n};\n\n// Get the property priority: the higher the priority, the higher the resulting\n// specificity of the atom. For example, if we had:\n//\n// import { css } from '@linaria/atomic';\n// css`\n// background-color: blue;\n// background: red;\n// `;\n//\n// we would produce:\n//\n// .atm_a.atm_a { background-color: blue }\n// .atm_b { background: red }\n//\n// and so the more specific selector (.atm_a.atm_a) would win\nexport function getPropertyPriority(property: string) {\n const longhands = Object.values(shorthandProperties).reduce(\n (a, b) => [...a, ...b],\n []\n );\n\n return longhands.includes(property) ? 2 : 1;\n}\n"],"mappings":"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","names":["import_utils","knownProperties","postcss","stylis","StyledProcessor"]}
|
|
1
|
+
{"version":3,"sources":["../../src/processors/styled.ts","../../src/processors/helpers/atomize.ts","../../src/processors/helpers/propertyPriority.ts"],"sourcesContent":["import type { SourceLocation } from '@babel/types';\nimport type { Rules, ValueCache } from '@wyw-in-js/processor-utils';\nimport { logger, hasEvalMeta } from '@wyw-in-js/shared';\n\nimport type { IProps } from '@linaria/react/processors/styled';\nimport StyledProcessor from '@linaria/react/processors/styled';\n\nimport atomize from './helpers/atomize';\n\nconst debug = logger.extend('AtomicStyledProcessor');\n\nexport default class AtomicStyledProcessor extends StyledProcessor {\n #classes: string | undefined;\n\n private get classes(): string {\n if (this.#classes) {\n return this.#classes;\n }\n\n throw new Error(\n 'Styles are not extracted yet. Please call `extractRules` first.'\n );\n }\n\n public override extractRules(\n valueCache: ValueCache,\n cssText: string,\n loc?: SourceLocation | null\n ): Rules {\n const rules: Rules = {};\n\n const wrappedValue =\n typeof this.component === 'string'\n ? null\n : valueCache.get(this.component.node.name);\n\n const atomicRules = atomize(cssText, hasEvalMeta(wrappedValue));\n atomicRules.forEach((rule) => {\n // eslint-disable-next-line no-param-reassign\n rules[rule.cssText] = {\n cssText: rule.cssText,\n start: loc?.start ?? null,\n className: this.className,\n displayName: this.displayName,\n atom: true,\n };\n\n debug('extracted-atomic-rule:\\n%s', rule.cssText);\n });\n\n this.#classes = atomicRules\n // Some atomic rules produced (eg. keyframes) don't have class names, and they also don't need to appear in the object\n .filter((rule) => !!rule.className)\n .map((rule) => rule.className!)\n .join(' ');\n\n return rules;\n }\n\n protected override getProps(): IProps {\n const props = super.getProps();\n props.class = [this.classes, this.className].filter(Boolean).join(' ');\n props.atomic = true;\n return props;\n }\n\n protected override getVariableId(\n source: string,\n unit: string,\n precedingCss: string\n ): string {\n const id = this.getCustomVariableId(source, unit, precedingCss);\n if (id) {\n return id;\n }\n\n const context = this.getVariableContext(source, unit, precedingCss);\n // id is based on the slugified value\n return context.valueSlug;\n }\n}\n","import { slugify } from '@wyw-in-js/shared';\nimport { all as knownProperties } from 'known-css-properties';\nimport type { Document, AtRule, Container, Rule } from 'postcss';\nimport postcss from 'postcss';\nimport { compile, serialize, stringify } from 'stylis';\n\nimport { getPropertyPriority } from './propertyPriority';\n\nconst knownPropertiesMap = knownProperties.reduce(\n (acc: { [property: string]: number }, property, i) => {\n acc[property] = i;\n return acc;\n },\n {}\n);\n\nfunction hashProperty(property: string) {\n const index = knownPropertiesMap[property];\n // If it's a known property, let's use the index to cut down the length of the hash.\n // otherwise, slugify\n if (index !== undefined) {\n return index.toString(36); // base 36 so that we get a-z,0-9\n }\n return slugify(property);\n}\n\nconst parseCss = (cssText: string) => {\n try {\n return postcss.parse(cssText);\n } catch (e) {\n if (e instanceof Error) {\n throw new Error(`Error parsing CSS: ${e.message}\\nCSS:\\n${cssText}`);\n }\n\n throw new Error(`Unknown error parsing CSS.\\nCSS:\\n${cssText}`);\n }\n};\n\nexport default function atomize(cssText: string, hasPriority = false) {\n const atomicRules: {\n className?: string;\n cssText: string;\n property: string;\n }[] = [];\n\n const stylesheet = parseCss(cssText);\n\n // We want to extract all keyframes and leave them as-is.\n // This isn't scoped locally yet\n stylesheet.walkAtRules('keyframes', (atRule) => {\n atRule.remove();\n atomicRules.push({\n property: atRule.name,\n cssText: atRule.toString(),\n });\n });\n\n stylesheet.walkDecls((decl) => {\n let thisParent: Document | Container | undefined = decl.parent;\n const parents: (Document | Container)[] = [];\n const atomicProperty = [decl.prop];\n let hasAtRule = false;\n\n // Traverse the declarations parents, and collect them all.\n while (thisParent && thisParent !== stylesheet) {\n parents.unshift(thisParent);\n if (thisParent.type === 'atrule') {\n hasAtRule = true;\n // @media queries, @supports etc.\n atomicProperty.push(\n (thisParent as AtRule).name,\n (thisParent as AtRule).params\n );\n } else if (thisParent.type === 'rule') {\n // pseudo classes etc.\n atomicProperty.push((thisParent as Rule).selector);\n }\n\n thisParent = thisParent.parent;\n }\n\n // Create a new stylesheet that contains *just* the extracted atomic rule and wrapping selectors, eg.\n // `@media (max-width: 400px) { background: red; }`, or\n // `&:hover { background: red; }`, or\n // `background: red;`\n // We do this so we can run it through stylis, to produce a full atom, eg.\n // `@media (max-width: 400px) { .atm_foo { background: red; } }`\n const root = postcss.root();\n let container: Document | Container = root;\n parents.forEach((parent) => {\n const newNode = parent.clone();\n newNode.removeAll();\n container.append(newNode);\n container = newNode;\n });\n container.append(decl.clone());\n\n const css = root.toString();\n const propertySlug = hashProperty([...atomicProperty].join(';'));\n const valueSlug = slugify(decl.value);\n const className = `atm_${propertySlug}_${valueSlug}`;\n\n const propertyPriority =\n getPropertyPriority(decl.prop) +\n (hasAtRule ? 1 : 0) +\n (hasPriority ? 1 : 0);\n const selector = `.${className}`.repeat(propertyPriority);\n const processedCss = serialize(compile(`${selector} {${css}}`), stringify);\n\n atomicRules.push({\n property: atomicProperty.join(' '),\n className,\n cssText: processedCss,\n });\n });\n\n return atomicRules;\n}\n","const shorthandProperties = {\n // The `all` property resets everything, and should effectively have priority zero.\n // In practice, this can be achieved by using: div { all: ... } to have even less specificity, but to avoid duplicating all selectors, we just let it be\n // 'all': []\n animation: [\n 'animation-name',\n 'animation-duration',\n 'animation-timing-function',\n 'animation-delay',\n 'animation-iteration-count',\n 'animation-direction',\n 'animation-fill-mode',\n 'animation-play-state',\n ],\n background: [\n 'background-attachment',\n 'background-clip',\n 'background-color',\n 'background-image',\n 'background-origin',\n 'background-position',\n 'background-repeat',\n 'background-size',\n ],\n border: ['border-color', 'border-style', 'border-width'],\n 'border-block-end': [\n 'border-block-end-color',\n 'border-block-end-style',\n 'border-block-end-width',\n ],\n 'border-block-start': [\n 'border-block-start-color',\n 'border-block-start-style',\n 'border-block-start-width',\n ],\n 'border-bottom': [\n 'border-bottom-color',\n 'border-bottom-style',\n 'border-bottom-width',\n ],\n 'border-color': [\n 'border-bottom-color',\n 'border-left-color',\n 'border-right-color',\n 'border-top-color',\n ],\n 'border-image': [\n 'border-image-outset',\n 'border-image-repeat',\n 'border-image-slice',\n 'border-image-source',\n 'border-image-width',\n ],\n 'border-inline-end': [\n 'border-inline-end-color',\n 'border-inline-end-style',\n 'border-inline-end-width',\n ],\n 'border-inline-start': [\n 'border-inline-start-color',\n 'border-inline-start-style',\n 'border-inline-start-width',\n ],\n 'border-left': [\n 'border-left-color',\n 'border-left-style',\n 'border-left-width',\n ],\n 'border-radius': [\n 'border-top-left-radius',\n 'border-top-right-radius',\n 'border-bottom-right-radius',\n 'border-bottom-left-radius',\n ],\n 'border-right': [\n 'border-right-color',\n 'border-right-style',\n 'border-right-width',\n ],\n 'border-style': [\n 'border-bottom-style',\n 'border-left-style',\n 'border-right-style',\n 'border-top-style',\n ],\n 'border-top': ['border-top-color', 'border-top-style', 'border-top-width'],\n 'border-width': [\n 'border-bottom-width',\n 'border-left-width',\n 'border-right-width',\n 'border-top-width',\n ],\n 'column-rule': [\n 'column-rule-width',\n 'column-rule-style',\n 'column-rule-color',\n ],\n columns: ['column-count', 'column-width'],\n flex: ['flex-grow', 'flex-shrink', 'flex-basis'],\n 'flex-flow': ['flex-direction', 'flex-wrap'],\n font: [\n 'font-family',\n 'font-size',\n 'font-stretch',\n 'font-style',\n 'font-variant',\n 'font-weight',\n 'line-height',\n ],\n gap: ['row-gap', 'column-gap'],\n grid: [\n 'grid-auto-columns',\n 'grid-auto-flow',\n 'grid-auto-rows',\n 'grid-template-areas',\n 'grid-template-columns',\n 'grid-template-rows',\n ],\n 'grid-area': [\n 'grid-row-start',\n 'grid-column-start',\n 'grid-row-end',\n 'grid-column-end',\n ],\n 'grid-column': ['grid-column-end', 'grid-column-start'],\n 'grid-row': ['grid-row-end', 'grid-row-start'],\n 'grid-template': [\n 'grid-template-areas',\n 'grid-template-columns',\n 'grid-template-rows',\n ],\n 'list-style': ['list-style-image', 'list-style-position', 'list-style-type'],\n margin: ['margin-bottom', 'margin-left', 'margin-right', 'margin-top'],\n mask: [\n 'mask-clip',\n 'mask-composite',\n 'mask-image',\n 'mask-mode',\n 'mask-origin',\n 'mask-position',\n 'mask-repeat',\n 'mask-size',\n ],\n offset: [\n 'offset-anchor',\n 'offset-distance',\n 'offset-path',\n 'offset-position',\n 'offset-rotate',\n ],\n outline: ['outline-color', 'outline-style', 'outline-width'],\n overflow: ['overflow-x', 'overflow-y'],\n padding: ['padding-bottom', 'padding-left', 'padding-right', 'padding-top'],\n 'place-content': ['align-content', 'justify-content'],\n 'place-items': ['align-items', 'justify-items'],\n 'place-self': ['align-self', 'justify-self'],\n 'scroll-margin': [\n 'scroll-margin-bottom',\n 'scroll-margin-left',\n 'scroll-margin-right',\n 'scroll-margin-top',\n ],\n 'scroll-padding': [\n 'scroll-padding-bottom',\n 'scroll-padding-left',\n 'scroll-padding-right',\n 'scroll-padding-top',\n ],\n 'text-decoration': [\n 'text-decoration-color',\n 'text-decoration-line',\n 'text-decoration-style',\n 'text-decoration-thickness',\n ],\n 'text-emphasis': ['text-emphasis-color', 'text-emphasis-style'],\n transition: [\n 'transition-delay',\n 'transition-duration',\n 'transition-property',\n 'transition-timing-function',\n ],\n};\n\n// Get the property priority: the higher the priority, the higher the resulting\n// specificity of the atom. For example, if we had:\n//\n// import { css } from '@linaria/atomic';\n// css`\n// background-color: blue;\n// background: red;\n// `;\n//\n// we would produce:\n//\n// .atm_a.atm_a { background-color: blue }\n// .atm_b { background: red }\n//\n// and so the more specific selector (.atm_a.atm_a) would win\nexport function getPropertyPriority(property: string) {\n const longhands = Object.values(shorthandProperties).reduce(\n (a, b) => [...a, ...b],\n []\n );\n\n return longhands.includes(property) ? 2 : 1;\n}\n"],"mappings":"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","names":["import_shared","knownProperties","postcss","StyledProcessor"]}
|
|
@@ -1,13 +1,12 @@
|
|
|
1
1
|
// src/processors/styled.ts
|
|
2
|
-
import {
|
|
2
|
+
import { logger, hasEvalMeta } from "@wyw-in-js/shared";
|
|
3
3
|
import StyledProcessor from "@linaria/react/processors/styled";
|
|
4
|
-
import { hasMeta } from "@linaria/utils";
|
|
5
4
|
|
|
6
5
|
// src/processors/helpers/atomize.ts
|
|
6
|
+
import { slugify } from "@wyw-in-js/shared";
|
|
7
7
|
import { all as knownProperties } from "known-css-properties";
|
|
8
8
|
import postcss from "postcss";
|
|
9
|
-
import
|
|
10
|
-
import { slugify } from "@linaria/utils";
|
|
9
|
+
import { compile, serialize, stringify } from "stylis";
|
|
11
10
|
|
|
12
11
|
// src/processors/helpers/propertyPriority.ts
|
|
13
12
|
var shorthandProperties = {
|
|
@@ -230,10 +229,6 @@ ${cssText}`);
|
|
|
230
229
|
}
|
|
231
230
|
};
|
|
232
231
|
function atomize(cssText, hasPriority = false) {
|
|
233
|
-
stylis.set({
|
|
234
|
-
prefix: false,
|
|
235
|
-
keyframe: false
|
|
236
|
-
});
|
|
237
232
|
const atomicRules = [];
|
|
238
233
|
const stylesheet = parseCss(cssText);
|
|
239
234
|
stylesheet.walkAtRules("keyframes", (atRule) => {
|
|
@@ -275,7 +270,8 @@ function atomize(cssText, hasPriority = false) {
|
|
|
275
270
|
const valueSlug = slugify(decl.value);
|
|
276
271
|
const className = `atm_${propertySlug}_${valueSlug}`;
|
|
277
272
|
const propertyPriority = getPropertyPriority(decl.prop) + (hasAtRule ? 1 : 0) + (hasPriority ? 1 : 0);
|
|
278
|
-
const
|
|
273
|
+
const selector = `.${className}`.repeat(propertyPriority);
|
|
274
|
+
const processedCss = serialize(compile(`${selector} {${css}}`), stringify);
|
|
279
275
|
atomicRules.push({
|
|
280
276
|
property: atomicProperty.join(" "),
|
|
281
277
|
className,
|
|
@@ -286,6 +282,7 @@ function atomize(cssText, hasPriority = false) {
|
|
|
286
282
|
}
|
|
287
283
|
|
|
288
284
|
// src/processors/styled.ts
|
|
285
|
+
var debug = logger.extend("AtomicStyledProcessor");
|
|
289
286
|
var AtomicStyledProcessor = class extends StyledProcessor {
|
|
290
287
|
#classes;
|
|
291
288
|
get classes() {
|
|
@@ -299,7 +296,7 @@ var AtomicStyledProcessor = class extends StyledProcessor {
|
|
|
299
296
|
extractRules(valueCache, cssText, loc) {
|
|
300
297
|
const rules = {};
|
|
301
298
|
const wrappedValue = typeof this.component === "string" ? null : valueCache.get(this.component.node.name);
|
|
302
|
-
const atomicRules = atomize(cssText,
|
|
299
|
+
const atomicRules = atomize(cssText, hasEvalMeta(wrappedValue));
|
|
303
300
|
atomicRules.forEach((rule) => {
|
|
304
301
|
rules[rule.cssText] = {
|
|
305
302
|
cssText: rule.cssText,
|
|
@@ -308,11 +305,7 @@ var AtomicStyledProcessor = class extends StyledProcessor {
|
|
|
308
305
|
displayName: this.displayName,
|
|
309
306
|
atom: true
|
|
310
307
|
};
|
|
311
|
-
debug(
|
|
312
|
-
"evaluator:template-processor:extracted-atomic-rule",
|
|
313
|
-
`
|
|
314
|
-
${rule.cssText}`
|
|
315
|
-
);
|
|
308
|
+
debug("extracted-atomic-rule:\n%s", rule.cssText);
|
|
316
309
|
});
|
|
317
310
|
this.#classes = atomicRules.filter((rule) => !!rule.className).map((rule) => rule.className).join(" ");
|
|
318
311
|
return rules;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/processors/styled.ts","../../src/processors/helpers/atomize.ts","../../src/processors/helpers/propertyPriority.ts"],"sourcesContent":["import type { SourceLocation } from '@babel/types';\n\nimport { debug } from '@linaria/logger';\nimport type { IProps } from '@linaria/react/processors/styled';\nimport StyledProcessor from '@linaria/react/processors/styled';\nimport type { Rules, ValueCache } from '@linaria/tags';\nimport { hasMeta } from '@linaria/utils';\n\nimport atomize from './helpers/atomize';\n\nexport default class AtomicStyledProcessor extends StyledProcessor {\n #classes: string | undefined;\n\n private get classes(): string {\n if (this.#classes) {\n return this.#classes;\n }\n\n throw new Error(\n 'Styles are not extracted yet. Please call `extractRules` first.'\n );\n }\n\n public override extractRules(\n valueCache: ValueCache,\n cssText: string,\n loc?: SourceLocation | null\n ): Rules {\n const rules: Rules = {};\n\n const wrappedValue =\n typeof this.component === 'string'\n ? null\n : valueCache.get(this.component.node.name);\n\n const atomicRules = atomize(cssText, hasMeta(wrappedValue));\n atomicRules.forEach((rule) => {\n // eslint-disable-next-line no-param-reassign\n rules[rule.cssText] = {\n cssText: rule.cssText,\n start: loc?.start ?? null,\n className: this.className,\n displayName: this.displayName,\n atom: true,\n };\n\n debug(\n 'evaluator:template-processor:extracted-atomic-rule',\n `\\n${rule.cssText}`\n );\n });\n\n this.#classes = atomicRules\n // Some atomic rules produced (eg. keyframes) don't have class names, and they also don't need to appear in the object\n .filter((rule) => !!rule.className)\n .map((rule) => rule.className!)\n .join(' ');\n\n return rules;\n }\n\n protected override getProps(): IProps {\n const props = super.getProps();\n props.class = [this.classes, this.className].filter(Boolean).join(' ');\n props.atomic = true;\n return props;\n }\n\n protected override getVariableId(\n source: string,\n unit: string,\n precedingCss: string\n ): string {\n const id = this.getCustomVariableId(source, unit, precedingCss);\n if (id) {\n return id;\n }\n\n const context = this.getVariableContext(source, unit, precedingCss);\n // id is based on the slugified value\n return context.valueSlug;\n }\n}\n","import { all as knownProperties } from 'known-css-properties';\nimport type { Document, AtRule, Container, Rule } from 'postcss';\nimport postcss from 'postcss';\nimport stylis from 'stylis';\n\nimport { slugify } from '@linaria/utils';\n\nimport { getPropertyPriority } from './propertyPriority';\n\nconst knownPropertiesMap = knownProperties.reduce(\n (acc: { [property: string]: number }, property, i) => {\n acc[property] = i;\n return acc;\n },\n {}\n);\n\nfunction hashProperty(property: string) {\n const index = knownPropertiesMap[property];\n // If it's a known property, let's use the index to cut down the length of the hash.\n // otherwise, slugify\n if (index !== undefined) {\n return index.toString(36); // base 36 so that we get a-z,0-9\n }\n return slugify(property);\n}\n\nconst parseCss = (cssText: string) => {\n try {\n return postcss.parse(cssText);\n } catch (e) {\n if (e instanceof Error) {\n throw new Error(`Error parsing CSS: ${e.message}\\nCSS:\\n${cssText}`);\n }\n\n throw new Error(`Unknown error parsing CSS.\\nCSS:\\n${cssText}`);\n }\n};\n\nexport default function atomize(cssText: string, hasPriority = false) {\n stylis.set({\n prefix: false,\n keyframe: false,\n });\n const atomicRules: {\n className?: string;\n cssText: string;\n property: string;\n }[] = [];\n\n const stylesheet = parseCss(cssText);\n\n // We want to extract all keyframes and leave them as-is.\n // This isn't scoped locally yet\n stylesheet.walkAtRules('keyframes', (atRule) => {\n atRule.remove();\n atomicRules.push({\n property: atRule.name,\n cssText: atRule.toString(),\n });\n });\n\n stylesheet.walkDecls((decl) => {\n let thisParent: Document | Container | undefined = decl.parent;\n const parents: (Document | Container)[] = [];\n const atomicProperty = [decl.prop];\n let hasAtRule = false;\n\n // Traverse the declarations parents, and collect them all.\n while (thisParent && thisParent !== stylesheet) {\n parents.unshift(thisParent);\n if (thisParent.type === 'atrule') {\n hasAtRule = true;\n // @media queries, @supports etc.\n atomicProperty.push(\n (thisParent as AtRule).name,\n (thisParent as AtRule).params\n );\n } else if (thisParent.type === 'rule') {\n // pseudo classes etc.\n atomicProperty.push((thisParent as Rule).selector);\n }\n\n thisParent = thisParent.parent;\n }\n\n // Create a new stylesheet that contains *just* the extracted atomic rule and wrapping selectors, eg.\n // `@media (max-width: 400px) { background: red; }`, or\n // `&:hover { background: red; }`, or\n // `background: red;`\n // We do this so we can run it through stylis, to produce a full atom, eg.\n // `@media (max-width: 400px) { .atm_foo { background: red; } }`\n const root = postcss.root();\n let container: Document | Container = root;\n parents.forEach((parent) => {\n const newNode = parent.clone();\n newNode.removeAll();\n container.append(newNode);\n container = newNode;\n });\n container.append(decl.clone());\n\n const css = root.toString();\n const propertySlug = hashProperty([...atomicProperty].join(';'));\n const valueSlug = slugify(decl.value);\n const className = `atm_${propertySlug}_${valueSlug}`;\n\n const propertyPriority =\n getPropertyPriority(decl.prop) +\n (hasAtRule ? 1 : 0) +\n (hasPriority ? 1 : 0);\n const processedCss = stylis(`.${className}`.repeat(propertyPriority), css);\n\n atomicRules.push({\n property: atomicProperty.join(' '),\n className,\n cssText: processedCss,\n });\n });\n\n return atomicRules;\n}\n","const shorthandProperties = {\n // The `all` property resets everything, and should effectively have priority zero.\n // In practice, this can be achieved by using: div { all: ... } to have even less specificity, but to avoid duplicating all selectors, we just let it be\n // 'all': []\n animation: [\n 'animation-name',\n 'animation-duration',\n 'animation-timing-function',\n 'animation-delay',\n 'animation-iteration-count',\n 'animation-direction',\n 'animation-fill-mode',\n 'animation-play-state',\n ],\n background: [\n 'background-attachment',\n 'background-clip',\n 'background-color',\n 'background-image',\n 'background-origin',\n 'background-position',\n 'background-repeat',\n 'background-size',\n ],\n border: ['border-color', 'border-style', 'border-width'],\n 'border-block-end': [\n 'border-block-end-color',\n 'border-block-end-style',\n 'border-block-end-width',\n ],\n 'border-block-start': [\n 'border-block-start-color',\n 'border-block-start-style',\n 'border-block-start-width',\n ],\n 'border-bottom': [\n 'border-bottom-color',\n 'border-bottom-style',\n 'border-bottom-width',\n ],\n 'border-color': [\n 'border-bottom-color',\n 'border-left-color',\n 'border-right-color',\n 'border-top-color',\n ],\n 'border-image': [\n 'border-image-outset',\n 'border-image-repeat',\n 'border-image-slice',\n 'border-image-source',\n 'border-image-width',\n ],\n 'border-inline-end': [\n 'border-inline-end-color',\n 'border-inline-end-style',\n 'border-inline-end-width',\n ],\n 'border-inline-start': [\n 'border-inline-start-color',\n 'border-inline-start-style',\n 'border-inline-start-width',\n ],\n 'border-left': [\n 'border-left-color',\n 'border-left-style',\n 'border-left-width',\n ],\n 'border-radius': [\n 'border-top-left-radius',\n 'border-top-right-radius',\n 'border-bottom-right-radius',\n 'border-bottom-left-radius',\n ],\n 'border-right': [\n 'border-right-color',\n 'border-right-style',\n 'border-right-width',\n ],\n 'border-style': [\n 'border-bottom-style',\n 'border-left-style',\n 'border-right-style',\n 'border-top-style',\n ],\n 'border-top': ['border-top-color', 'border-top-style', 'border-top-width'],\n 'border-width': [\n 'border-bottom-width',\n 'border-left-width',\n 'border-right-width',\n 'border-top-width',\n ],\n 'column-rule': [\n 'column-rule-width',\n 'column-rule-style',\n 'column-rule-color',\n ],\n columns: ['column-count', 'column-width'],\n flex: ['flex-grow', 'flex-shrink', 'flex-basis'],\n 'flex-flow': ['flex-direction', 'flex-wrap'],\n font: [\n 'font-family',\n 'font-size',\n 'font-stretch',\n 'font-style',\n 'font-variant',\n 'font-weight',\n 'line-height',\n ],\n gap: ['row-gap', 'column-gap'],\n grid: [\n 'grid-auto-columns',\n 'grid-auto-flow',\n 'grid-auto-rows',\n 'grid-template-areas',\n 'grid-template-columns',\n 'grid-template-rows',\n ],\n 'grid-area': [\n 'grid-row-start',\n 'grid-column-start',\n 'grid-row-end',\n 'grid-column-end',\n ],\n 'grid-column': ['grid-column-end', 'grid-column-start'],\n 'grid-row': ['grid-row-end', 'grid-row-start'],\n 'grid-template': [\n 'grid-template-areas',\n 'grid-template-columns',\n 'grid-template-rows',\n ],\n 'list-style': ['list-style-image', 'list-style-position', 'list-style-type'],\n margin: ['margin-bottom', 'margin-left', 'margin-right', 'margin-top'],\n mask: [\n 'mask-clip',\n 'mask-composite',\n 'mask-image',\n 'mask-mode',\n 'mask-origin',\n 'mask-position',\n 'mask-repeat',\n 'mask-size',\n ],\n offset: [\n 'offset-anchor',\n 'offset-distance',\n 'offset-path',\n 'offset-position',\n 'offset-rotate',\n ],\n outline: ['outline-color', 'outline-style', 'outline-width'],\n overflow: ['overflow-x', 'overflow-y'],\n padding: ['padding-bottom', 'padding-left', 'padding-right', 'padding-top'],\n 'place-content': ['align-content', 'justify-content'],\n 'place-items': ['align-items', 'justify-items'],\n 'place-self': ['align-self', 'justify-self'],\n 'scroll-margin': [\n 'scroll-margin-bottom',\n 'scroll-margin-left',\n 'scroll-margin-right',\n 'scroll-margin-top',\n ],\n 'scroll-padding': [\n 'scroll-padding-bottom',\n 'scroll-padding-left',\n 'scroll-padding-right',\n 'scroll-padding-top',\n ],\n 'text-decoration': [\n 'text-decoration-color',\n 'text-decoration-line',\n 'text-decoration-style',\n 'text-decoration-thickness',\n ],\n 'text-emphasis': ['text-emphasis-color', 'text-emphasis-style'],\n transition: [\n 'transition-delay',\n 'transition-duration',\n 'transition-property',\n 'transition-timing-function',\n ],\n};\n\n// Get the property priority: the higher the priority, the higher the resulting\n// specificity of the atom. For example, if we had:\n//\n// import { css } from '@linaria/atomic';\n// css`\n// background-color: blue;\n// background: red;\n// `;\n//\n// we would produce:\n//\n// .atm_a.atm_a { background-color: blue }\n// .atm_b { background: red }\n//\n// and so the more specific selector (.atm_a.atm_a) would win\nexport function getPropertyPriority(property: string) {\n const longhands = Object.values(shorthandProperties).reduce(\n (a, b) => [...a, ...b],\n []\n );\n\n return longhands.includes(property) ? 2 : 1;\n}\n"],"mappings":"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","names":[]}
|
|
1
|
+
{"version":3,"sources":["../../src/processors/styled.ts","../../src/processors/helpers/atomize.ts","../../src/processors/helpers/propertyPriority.ts"],"sourcesContent":["import type { SourceLocation } from '@babel/types';\nimport type { Rules, ValueCache } from '@wyw-in-js/processor-utils';\nimport { logger, hasEvalMeta } from '@wyw-in-js/shared';\n\nimport type { IProps } from '@linaria/react/processors/styled';\nimport StyledProcessor from '@linaria/react/processors/styled';\n\nimport atomize from './helpers/atomize';\n\nconst debug = logger.extend('AtomicStyledProcessor');\n\nexport default class AtomicStyledProcessor extends StyledProcessor {\n #classes: string | undefined;\n\n private get classes(): string {\n if (this.#classes) {\n return this.#classes;\n }\n\n throw new Error(\n 'Styles are not extracted yet. Please call `extractRules` first.'\n );\n }\n\n public override extractRules(\n valueCache: ValueCache,\n cssText: string,\n loc?: SourceLocation | null\n ): Rules {\n const rules: Rules = {};\n\n const wrappedValue =\n typeof this.component === 'string'\n ? null\n : valueCache.get(this.component.node.name);\n\n const atomicRules = atomize(cssText, hasEvalMeta(wrappedValue));\n atomicRules.forEach((rule) => {\n // eslint-disable-next-line no-param-reassign\n rules[rule.cssText] = {\n cssText: rule.cssText,\n start: loc?.start ?? null,\n className: this.className,\n displayName: this.displayName,\n atom: true,\n };\n\n debug('extracted-atomic-rule:\\n%s', rule.cssText);\n });\n\n this.#classes = atomicRules\n // Some atomic rules produced (eg. keyframes) don't have class names, and they also don't need to appear in the object\n .filter((rule) => !!rule.className)\n .map((rule) => rule.className!)\n .join(' ');\n\n return rules;\n }\n\n protected override getProps(): IProps {\n const props = super.getProps();\n props.class = [this.classes, this.className].filter(Boolean).join(' ');\n props.atomic = true;\n return props;\n }\n\n protected override getVariableId(\n source: string,\n unit: string,\n precedingCss: string\n ): string {\n const id = this.getCustomVariableId(source, unit, precedingCss);\n if (id) {\n return id;\n }\n\n const context = this.getVariableContext(source, unit, precedingCss);\n // id is based on the slugified value\n return context.valueSlug;\n }\n}\n","import { slugify } from '@wyw-in-js/shared';\nimport { all as knownProperties } from 'known-css-properties';\nimport type { Document, AtRule, Container, Rule } from 'postcss';\nimport postcss from 'postcss';\nimport { compile, serialize, stringify } from 'stylis';\n\nimport { getPropertyPriority } from './propertyPriority';\n\nconst knownPropertiesMap = knownProperties.reduce(\n (acc: { [property: string]: number }, property, i) => {\n acc[property] = i;\n return acc;\n },\n {}\n);\n\nfunction hashProperty(property: string) {\n const index = knownPropertiesMap[property];\n // If it's a known property, let's use the index to cut down the length of the hash.\n // otherwise, slugify\n if (index !== undefined) {\n return index.toString(36); // base 36 so that we get a-z,0-9\n }\n return slugify(property);\n}\n\nconst parseCss = (cssText: string) => {\n try {\n return postcss.parse(cssText);\n } catch (e) {\n if (e instanceof Error) {\n throw new Error(`Error parsing CSS: ${e.message}\\nCSS:\\n${cssText}`);\n }\n\n throw new Error(`Unknown error parsing CSS.\\nCSS:\\n${cssText}`);\n }\n};\n\nexport default function atomize(cssText: string, hasPriority = false) {\n const atomicRules: {\n className?: string;\n cssText: string;\n property: string;\n }[] = [];\n\n const stylesheet = parseCss(cssText);\n\n // We want to extract all keyframes and leave them as-is.\n // This isn't scoped locally yet\n stylesheet.walkAtRules('keyframes', (atRule) => {\n atRule.remove();\n atomicRules.push({\n property: atRule.name,\n cssText: atRule.toString(),\n });\n });\n\n stylesheet.walkDecls((decl) => {\n let thisParent: Document | Container | undefined = decl.parent;\n const parents: (Document | Container)[] = [];\n const atomicProperty = [decl.prop];\n let hasAtRule = false;\n\n // Traverse the declarations parents, and collect them all.\n while (thisParent && thisParent !== stylesheet) {\n parents.unshift(thisParent);\n if (thisParent.type === 'atrule') {\n hasAtRule = true;\n // @media queries, @supports etc.\n atomicProperty.push(\n (thisParent as AtRule).name,\n (thisParent as AtRule).params\n );\n } else if (thisParent.type === 'rule') {\n // pseudo classes etc.\n atomicProperty.push((thisParent as Rule).selector);\n }\n\n thisParent = thisParent.parent;\n }\n\n // Create a new stylesheet that contains *just* the extracted atomic rule and wrapping selectors, eg.\n // `@media (max-width: 400px) { background: red; }`, or\n // `&:hover { background: red; }`, or\n // `background: red;`\n // We do this so we can run it through stylis, to produce a full atom, eg.\n // `@media (max-width: 400px) { .atm_foo { background: red; } }`\n const root = postcss.root();\n let container: Document | Container = root;\n parents.forEach((parent) => {\n const newNode = parent.clone();\n newNode.removeAll();\n container.append(newNode);\n container = newNode;\n });\n container.append(decl.clone());\n\n const css = root.toString();\n const propertySlug = hashProperty([...atomicProperty].join(';'));\n const valueSlug = slugify(decl.value);\n const className = `atm_${propertySlug}_${valueSlug}`;\n\n const propertyPriority =\n getPropertyPriority(decl.prop) +\n (hasAtRule ? 1 : 0) +\n (hasPriority ? 1 : 0);\n const selector = `.${className}`.repeat(propertyPriority);\n const processedCss = serialize(compile(`${selector} {${css}}`), stringify);\n\n atomicRules.push({\n property: atomicProperty.join(' '),\n className,\n cssText: processedCss,\n });\n });\n\n return atomicRules;\n}\n","const shorthandProperties = {\n // The `all` property resets everything, and should effectively have priority zero.\n // In practice, this can be achieved by using: div { all: ... } to have even less specificity, but to avoid duplicating all selectors, we just let it be\n // 'all': []\n animation: [\n 'animation-name',\n 'animation-duration',\n 'animation-timing-function',\n 'animation-delay',\n 'animation-iteration-count',\n 'animation-direction',\n 'animation-fill-mode',\n 'animation-play-state',\n ],\n background: [\n 'background-attachment',\n 'background-clip',\n 'background-color',\n 'background-image',\n 'background-origin',\n 'background-position',\n 'background-repeat',\n 'background-size',\n ],\n border: ['border-color', 'border-style', 'border-width'],\n 'border-block-end': [\n 'border-block-end-color',\n 'border-block-end-style',\n 'border-block-end-width',\n ],\n 'border-block-start': [\n 'border-block-start-color',\n 'border-block-start-style',\n 'border-block-start-width',\n ],\n 'border-bottom': [\n 'border-bottom-color',\n 'border-bottom-style',\n 'border-bottom-width',\n ],\n 'border-color': [\n 'border-bottom-color',\n 'border-left-color',\n 'border-right-color',\n 'border-top-color',\n ],\n 'border-image': [\n 'border-image-outset',\n 'border-image-repeat',\n 'border-image-slice',\n 'border-image-source',\n 'border-image-width',\n ],\n 'border-inline-end': [\n 'border-inline-end-color',\n 'border-inline-end-style',\n 'border-inline-end-width',\n ],\n 'border-inline-start': [\n 'border-inline-start-color',\n 'border-inline-start-style',\n 'border-inline-start-width',\n ],\n 'border-left': [\n 'border-left-color',\n 'border-left-style',\n 'border-left-width',\n ],\n 'border-radius': [\n 'border-top-left-radius',\n 'border-top-right-radius',\n 'border-bottom-right-radius',\n 'border-bottom-left-radius',\n ],\n 'border-right': [\n 'border-right-color',\n 'border-right-style',\n 'border-right-width',\n ],\n 'border-style': [\n 'border-bottom-style',\n 'border-left-style',\n 'border-right-style',\n 'border-top-style',\n ],\n 'border-top': ['border-top-color', 'border-top-style', 'border-top-width'],\n 'border-width': [\n 'border-bottom-width',\n 'border-left-width',\n 'border-right-width',\n 'border-top-width',\n ],\n 'column-rule': [\n 'column-rule-width',\n 'column-rule-style',\n 'column-rule-color',\n ],\n columns: ['column-count', 'column-width'],\n flex: ['flex-grow', 'flex-shrink', 'flex-basis'],\n 'flex-flow': ['flex-direction', 'flex-wrap'],\n font: [\n 'font-family',\n 'font-size',\n 'font-stretch',\n 'font-style',\n 'font-variant',\n 'font-weight',\n 'line-height',\n ],\n gap: ['row-gap', 'column-gap'],\n grid: [\n 'grid-auto-columns',\n 'grid-auto-flow',\n 'grid-auto-rows',\n 'grid-template-areas',\n 'grid-template-columns',\n 'grid-template-rows',\n ],\n 'grid-area': [\n 'grid-row-start',\n 'grid-column-start',\n 'grid-row-end',\n 'grid-column-end',\n ],\n 'grid-column': ['grid-column-end', 'grid-column-start'],\n 'grid-row': ['grid-row-end', 'grid-row-start'],\n 'grid-template': [\n 'grid-template-areas',\n 'grid-template-columns',\n 'grid-template-rows',\n ],\n 'list-style': ['list-style-image', 'list-style-position', 'list-style-type'],\n margin: ['margin-bottom', 'margin-left', 'margin-right', 'margin-top'],\n mask: [\n 'mask-clip',\n 'mask-composite',\n 'mask-image',\n 'mask-mode',\n 'mask-origin',\n 'mask-position',\n 'mask-repeat',\n 'mask-size',\n ],\n offset: [\n 'offset-anchor',\n 'offset-distance',\n 'offset-path',\n 'offset-position',\n 'offset-rotate',\n ],\n outline: ['outline-color', 'outline-style', 'outline-width'],\n overflow: ['overflow-x', 'overflow-y'],\n padding: ['padding-bottom', 'padding-left', 'padding-right', 'padding-top'],\n 'place-content': ['align-content', 'justify-content'],\n 'place-items': ['align-items', 'justify-items'],\n 'place-self': ['align-self', 'justify-self'],\n 'scroll-margin': [\n 'scroll-margin-bottom',\n 'scroll-margin-left',\n 'scroll-margin-right',\n 'scroll-margin-top',\n ],\n 'scroll-padding': [\n 'scroll-padding-bottom',\n 'scroll-padding-left',\n 'scroll-padding-right',\n 'scroll-padding-top',\n ],\n 'text-decoration': [\n 'text-decoration-color',\n 'text-decoration-line',\n 'text-decoration-style',\n 'text-decoration-thickness',\n ],\n 'text-emphasis': ['text-emphasis-color', 'text-emphasis-style'],\n transition: [\n 'transition-delay',\n 'transition-duration',\n 'transition-property',\n 'transition-timing-function',\n ],\n};\n\n// Get the property priority: the higher the priority, the higher the resulting\n// specificity of the atom. For example, if we had:\n//\n// import { css } from '@linaria/atomic';\n// css`\n// background-color: blue;\n// background: red;\n// `;\n//\n// we would produce:\n//\n// .atm_a.atm_a { background-color: blue }\n// .atm_b { background: red }\n//\n// and so the more specific selector (.atm_a.atm_a) would win\nexport function getPropertyPriority(property: string) {\n const longhands = Object.values(shorthandProperties).reduce(\n (a, b) => [...a, ...b],\n []\n );\n\n return longhands.includes(property) ? 2 : 1;\n}\n"],"mappings":"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","names":[]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@linaria/atomic",
|
|
3
|
-
"version": "
|
|
3
|
+
"version": "6.0.0",
|
|
4
4
|
"description": "Blazing fast zero-runtime CSS in JS library",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"css",
|
|
@@ -35,26 +35,26 @@
|
|
|
35
35
|
"processors/",
|
|
36
36
|
"types/"
|
|
37
37
|
],
|
|
38
|
-
"
|
|
38
|
+
"wyw-in-js": {
|
|
39
39
|
"tags": {
|
|
40
40
|
"css": "./dist/processors/css.js",
|
|
41
41
|
"styled": "./dist/processors/styled.js"
|
|
42
42
|
}
|
|
43
43
|
},
|
|
44
44
|
"dependencies": {
|
|
45
|
+
"@wyw-in-js/processor-utils": "^0.2.2",
|
|
46
|
+
"@wyw-in-js/shared": "^0.2.2",
|
|
45
47
|
"known-css-properties": "^0.24.0",
|
|
46
|
-
"postcss": "^8.
|
|
47
|
-
"stylis": "^3.
|
|
48
|
+
"postcss": "^8.4.31",
|
|
49
|
+
"stylis": "^4.3.0",
|
|
48
50
|
"ts-invariant": "^0.10.3",
|
|
49
|
-
"@linaria/core": "^
|
|
50
|
-
"@linaria/
|
|
51
|
-
"@linaria/react": "^5.0.3",
|
|
52
|
-
"@linaria/tags": "^5.0.2",
|
|
53
|
-
"@linaria/utils": "^5.0.2"
|
|
51
|
+
"@linaria/core": "^6.0.0",
|
|
52
|
+
"@linaria/react": "^6.0.0"
|
|
54
53
|
},
|
|
55
54
|
"devDependencies": {
|
|
56
|
-
"@babel/types": "^7.
|
|
57
|
-
"@types/node": "^17.0.39"
|
|
55
|
+
"@babel/types": "^7.23.5",
|
|
56
|
+
"@types/node": "^17.0.39",
|
|
57
|
+
"@types/stylis": "^4.2.1"
|
|
58
58
|
},
|
|
59
59
|
"peerDependencies": {
|
|
60
60
|
"react": ">=16"
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import type { SourceLocation } from '@babel/types';
|
|
2
|
+
import type { Rules, ValueCache } from '@wyw-in-js/processor-utils';
|
|
2
3
|
import CssProcessor from '@linaria/core/processors/css';
|
|
3
|
-
import type { Rules, ValueCache } from '@linaria/tags';
|
|
4
4
|
export default class AtomicCssProcessor extends CssProcessor {
|
|
5
5
|
#private;
|
|
6
6
|
private get classes();
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import type { SourceLocation } from '@babel/types';
|
|
2
|
+
import type { Rules, ValueCache } from '@wyw-in-js/processor-utils';
|
|
2
3
|
import type { IProps } from '@linaria/react/processors/styled';
|
|
3
4
|
import StyledProcessor from '@linaria/react/processors/styled';
|
|
4
|
-
import type { Rules, ValueCache } from '@linaria/tags';
|
|
5
5
|
export default class AtomicStyledProcessor extends StyledProcessor {
|
|
6
6
|
#private;
|
|
7
7
|
private get classes();
|