tailwindcss 0.0.0-insiders.ff2c25f → 0.0.0-internal.b2586d4e

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.
Files changed (248) hide show
  1. package/README.md +5 -6
  2. package/dist/lib.d.mts +339 -0
  3. package/dist/lib.d.ts +339 -0
  4. package/dist/lib.js +17 -0
  5. package/dist/lib.mjs +17 -0
  6. package/index.css +5 -0
  7. package/package.json +36 -107
  8. package/preflight.css +334 -0
  9. package/theme.css +463 -0
  10. package/base.css +0 -1
  11. package/colors.d.ts +0 -3
  12. package/colors.js +0 -2
  13. package/components.css +0 -1
  14. package/defaultConfig.d.ts +0 -3
  15. package/defaultConfig.js +0 -2
  16. package/defaultTheme.d.ts +0 -4
  17. package/defaultTheme.js +0 -2
  18. package/lib/cli/build/deps.js +0 -54
  19. package/lib/cli/build/index.js +0 -48
  20. package/lib/cli/build/plugin.js +0 -367
  21. package/lib/cli/build/utils.js +0 -78
  22. package/lib/cli/build/watching.js +0 -178
  23. package/lib/cli/help/index.js +0 -71
  24. package/lib/cli/index.js +0 -239
  25. package/lib/cli/init/index.js +0 -46
  26. package/lib/cli-peer-dependencies.js +0 -28
  27. package/lib/cli.js +0 -7
  28. package/lib/constants.js +0 -44
  29. package/lib/corePluginList.js +0 -181
  30. package/lib/corePlugins.js +0 -4062
  31. package/lib/css/LICENSE +0 -25
  32. package/lib/css/preflight.css +0 -367
  33. package/lib/featureFlags.js +0 -71
  34. package/lib/index.js +0 -6
  35. package/lib/lib/cacheInvalidation.js +0 -90
  36. package/lib/lib/collapseAdjacentRules.js +0 -59
  37. package/lib/lib/collapseDuplicateDeclarations.js +0 -83
  38. package/lib/lib/content.js +0 -177
  39. package/lib/lib/defaultExtractor.js +0 -241
  40. package/lib/lib/detectNesting.js +0 -43
  41. package/lib/lib/evaluateTailwindFunctions.js +0 -234
  42. package/lib/lib/expandApplyAtRules.js +0 -526
  43. package/lib/lib/expandTailwindAtRules.js +0 -273
  44. package/lib/lib/findAtConfigPath.js +0 -44
  45. package/lib/lib/generateRules.js +0 -866
  46. package/lib/lib/getModuleDependencies.js +0 -51
  47. package/lib/lib/normalizeTailwindDirectives.js +0 -87
  48. package/lib/lib/offsets.js +0 -299
  49. package/lib/lib/partitionApplyAtRules.js +0 -56
  50. package/lib/lib/regex.js +0 -60
  51. package/lib/lib/remap-bitfield.js +0 -87
  52. package/lib/lib/resolveDefaultsAtRules.js +0 -161
  53. package/lib/lib/setupContextUtils.js +0 -1218
  54. package/lib/lib/setupTrackingContext.js +0 -163
  55. package/lib/lib/sharedState.js +0 -78
  56. package/lib/lib/substituteScreenAtRules.js +0 -29
  57. package/lib/oxide/cli/build/deps.js +0 -81
  58. package/lib/oxide/cli/build/index.js +0 -47
  59. package/lib/oxide/cli/build/plugin.js +0 -364
  60. package/lib/oxide/cli/build/utils.js +0 -77
  61. package/lib/oxide/cli/build/watching.js +0 -177
  62. package/lib/oxide/cli/help/index.js +0 -70
  63. package/lib/oxide/cli/index.js +0 -220
  64. package/lib/oxide/cli/init/index.js +0 -35
  65. package/lib/oxide/cli.js +0 -5
  66. package/lib/oxide/postcss-plugin.js +0 -2
  67. package/lib/plugin.js +0 -48
  68. package/lib/postcss-plugins/nesting/README.md +0 -42
  69. package/lib/postcss-plugins/nesting/index.js +0 -19
  70. package/lib/postcss-plugins/nesting/plugin.js +0 -87
  71. package/lib/processTailwindFeatures.js +0 -62
  72. package/lib/public/colors.js +0 -331
  73. package/lib/public/create-plugin.js +0 -15
  74. package/lib/public/default-config.js +0 -16
  75. package/lib/public/default-theme.js +0 -16
  76. package/lib/public/resolve-config.js +0 -22
  77. package/lib/util/bigSign.js +0 -11
  78. package/lib/util/buildMediaQuery.js +0 -25
  79. package/lib/util/cloneDeep.js +0 -20
  80. package/lib/util/cloneNodes.js +0 -32
  81. package/lib/util/color.js +0 -98
  82. package/lib/util/configurePlugins.js +0 -21
  83. package/lib/util/createPlugin.js +0 -30
  84. package/lib/util/createUtilityPlugin.js +0 -51
  85. package/lib/util/dataTypes.js +0 -266
  86. package/lib/util/defaults.js +0 -25
  87. package/lib/util/escapeClassName.js +0 -22
  88. package/lib/util/escapeCommas.js +0 -11
  89. package/lib/util/flattenColorPalette.js +0 -16
  90. package/lib/util/formatVariantSelector.js +0 -351
  91. package/lib/util/getAllConfigs.js +0 -48
  92. package/lib/util/hashConfig.js +0 -19
  93. package/lib/util/isKeyframeRule.js +0 -11
  94. package/lib/util/isPlainObject.js +0 -15
  95. package/lib/util/isSyntacticallyValidPropertyValue.js +0 -72
  96. package/lib/util/log.js +0 -57
  97. package/lib/util/nameClass.js +0 -43
  98. package/lib/util/negateValue.js +0 -34
  99. package/lib/util/normalizeConfig.js +0 -281
  100. package/lib/util/normalizeScreens.js +0 -170
  101. package/lib/util/parseAnimationValue.js +0 -91
  102. package/lib/util/parseBoxShadowValue.js +0 -84
  103. package/lib/util/parseDependency.js +0 -45
  104. package/lib/util/parseGlob.js +0 -34
  105. package/lib/util/parseObjectStyles.js +0 -34
  106. package/lib/util/pluginUtils.js +0 -283
  107. package/lib/util/prefixSelector.js +0 -37
  108. package/lib/util/removeAlphaVariables.js +0 -29
  109. package/lib/util/resolveConfig.js +0 -254
  110. package/lib/util/resolveConfigPath.js +0 -54
  111. package/lib/util/responsive.js +0 -22
  112. package/lib/util/splitAtTopLevelOnly.js +0 -43
  113. package/lib/util/tap.js +0 -12
  114. package/lib/util/toColorValue.js +0 -11
  115. package/lib/util/toPath.js +0 -30
  116. package/lib/util/transformThemeValue.js +0 -71
  117. package/lib/util/validateConfig.js +0 -24
  118. package/lib/util/validateFormalSyntax.js +0 -24
  119. package/lib/util/withAlphaVariable.js +0 -75
  120. package/nesting/index.js +0 -2
  121. package/oxide-node-api-shim/index.js +0 -21
  122. package/oxide-node-api-shim/package.json +0 -5
  123. package/peers/index.js +0 -79461
  124. package/plugin.d.ts +0 -11
  125. package/plugin.js +0 -2
  126. package/prettier.config.js +0 -19
  127. package/resolveConfig.d.ts +0 -12
  128. package/resolveConfig.js +0 -2
  129. package/screens.css +0 -1
  130. package/scripts/create-plugin-list.js +0 -10
  131. package/scripts/generate-types.js +0 -105
  132. package/scripts/release-channel.js +0 -18
  133. package/scripts/release-notes.js +0 -21
  134. package/scripts/swap-engines.js +0 -40
  135. package/scripts/type-utils.js +0 -27
  136. package/src/cli/build/deps.js +0 -56
  137. package/src/cli/build/index.js +0 -49
  138. package/src/cli/build/plugin.js +0 -439
  139. package/src/cli/build/utils.js +0 -76
  140. package/src/cli/build/watching.js +0 -227
  141. package/src/cli/help/index.js +0 -70
  142. package/src/cli/index.js +0 -234
  143. package/src/cli/init/index.js +0 -50
  144. package/src/cli-peer-dependencies.js +0 -15
  145. package/src/cli.js +0 -7
  146. package/src/constants.js +0 -17
  147. package/src/corePluginList.js +0 -1
  148. package/src/corePlugins.js +0 -2744
  149. package/src/css/LICENSE +0 -25
  150. package/src/css/preflight.css +0 -367
  151. package/src/featureFlags.js +0 -64
  152. package/src/index.js +0 -5
  153. package/src/lib/cacheInvalidation.js +0 -52
  154. package/src/lib/collapseAdjacentRules.js +0 -58
  155. package/src/lib/collapseDuplicateDeclarations.js +0 -93
  156. package/src/lib/content.js +0 -208
  157. package/src/lib/defaultExtractor.js +0 -217
  158. package/src/lib/detectNesting.js +0 -47
  159. package/src/lib/evaluateTailwindFunctions.js +0 -269
  160. package/src/lib/expandApplyAtRules.js +0 -606
  161. package/src/lib/expandTailwindAtRules.js +0 -285
  162. package/src/lib/findAtConfigPath.js +0 -48
  163. package/src/lib/generateRules.js +0 -899
  164. package/src/lib/getModuleDependencies.js +0 -39
  165. package/src/lib/normalizeTailwindDirectives.js +0 -84
  166. package/src/lib/offsets.js +0 -367
  167. package/src/lib/partitionApplyAtRules.js +0 -52
  168. package/src/lib/regex.js +0 -74
  169. package/src/lib/remap-bitfield.js +0 -82
  170. package/src/lib/resolveDefaultsAtRules.js +0 -163
  171. package/src/lib/setupContextUtils.js +0 -1308
  172. package/src/lib/setupTrackingContext.js +0 -171
  173. package/src/lib/sharedState.js +0 -67
  174. package/src/lib/substituteScreenAtRules.js +0 -19
  175. package/src/oxide/cli/build/deps.ts +0 -91
  176. package/src/oxide/cli/build/index.ts +0 -47
  177. package/src/oxide/cli/build/plugin.ts +0 -436
  178. package/src/oxide/cli/build/utils.ts +0 -74
  179. package/src/oxide/cli/build/watching.ts +0 -225
  180. package/src/oxide/cli/help/index.ts +0 -69
  181. package/src/oxide/cli/index.ts +0 -212
  182. package/src/oxide/cli/init/index.ts +0 -32
  183. package/src/oxide/cli.ts +0 -1
  184. package/src/oxide/postcss-plugin.ts +0 -1
  185. package/src/plugin.js +0 -47
  186. package/src/postcss-plugins/nesting/README.md +0 -42
  187. package/src/postcss-plugins/nesting/index.js +0 -13
  188. package/src/postcss-plugins/nesting/plugin.js +0 -80
  189. package/src/processTailwindFeatures.js +0 -58
  190. package/src/public/colors.js +0 -300
  191. package/src/public/create-plugin.js +0 -2
  192. package/src/public/default-config.js +0 -4
  193. package/src/public/default-theme.js +0 -4
  194. package/src/public/resolve-config.js +0 -7
  195. package/src/util/bigSign.js +0 -3
  196. package/src/util/buildMediaQuery.js +0 -22
  197. package/src/util/cloneDeep.js +0 -11
  198. package/src/util/cloneNodes.js +0 -28
  199. package/src/util/color.js +0 -73
  200. package/src/util/configurePlugins.js +0 -23
  201. package/src/util/createPlugin.js +0 -27
  202. package/src/util/createUtilityPlugin.js +0 -37
  203. package/src/util/dataTypes.js +0 -281
  204. package/src/util/defaults.js +0 -17
  205. package/src/util/escapeClassName.js +0 -8
  206. package/src/util/escapeCommas.js +0 -3
  207. package/src/util/flattenColorPalette.js +0 -13
  208. package/src/util/formatVariantSelector.js +0 -412
  209. package/src/util/getAllConfigs.js +0 -38
  210. package/src/util/hashConfig.js +0 -5
  211. package/src/util/isKeyframeRule.js +0 -3
  212. package/src/util/isPlainObject.js +0 -8
  213. package/src/util/isSyntacticallyValidPropertyValue.js +0 -61
  214. package/src/util/log.js +0 -29
  215. package/src/util/nameClass.js +0 -30
  216. package/src/util/negateValue.js +0 -24
  217. package/src/util/normalizeConfig.js +0 -300
  218. package/src/util/normalizeScreens.js +0 -140
  219. package/src/util/parseAnimationValue.js +0 -68
  220. package/src/util/parseBoxShadowValue.js +0 -72
  221. package/src/util/parseDependency.js +0 -44
  222. package/src/util/parseGlob.js +0 -24
  223. package/src/util/parseObjectStyles.js +0 -19
  224. package/src/util/pluginUtils.js +0 -314
  225. package/src/util/prefixSelector.js +0 -32
  226. package/src/util/removeAlphaVariables.js +0 -24
  227. package/src/util/resolveConfig.js +0 -277
  228. package/src/util/resolveConfigPath.js +0 -55
  229. package/src/util/responsive.js +0 -10
  230. package/src/util/splitAtTopLevelOnly.js +0 -45
  231. package/src/util/tap.js +0 -4
  232. package/src/util/toColorValue.js +0 -3
  233. package/src/util/toPath.js +0 -26
  234. package/src/util/transformThemeValue.js +0 -62
  235. package/src/util/validateConfig.js +0 -13
  236. package/src/util/validateFormalSyntax.js +0 -34
  237. package/src/util/withAlphaVariable.js +0 -49
  238. package/stubs/defaultConfig.stub.js +0 -956
  239. package/stubs/defaultPostCssConfig.stub.js +0 -6
  240. package/stubs/simpleConfig.stub.js +0 -8
  241. package/tailwind.css +0 -5
  242. package/types/config.d.ts +0 -367
  243. package/types/generated/.gitkeep +0 -0
  244. package/types/generated/colors.d.ts +0 -276
  245. package/types/generated/corePluginList.d.ts +0 -1
  246. package/types/generated/default-theme.d.ts +0 -345
  247. package/types/index.d.ts +0 -7
  248. package/variants.css +0 -1
@@ -1,39 +0,0 @@
1
- import fs from 'fs'
2
- import path from 'path'
3
- import resolve from 'resolve'
4
- import detective from 'detective'
5
-
6
- function createModule(file) {
7
- const source = fs.readFileSync(file, 'utf-8')
8
- const requires = detective(source)
9
-
10
- return { file, requires }
11
- }
12
-
13
- export default function getModuleDependencies(entryFile) {
14
- const rootModule = createModule(entryFile)
15
- const modules = [rootModule]
16
-
17
- // Iterate over the modules, even when new
18
- // ones are being added
19
- for (const mdl of modules) {
20
- mdl.requires
21
- .filter((dep) => {
22
- // Only track local modules, not node_modules
23
- return dep.startsWith('./') || dep.startsWith('../')
24
- })
25
- .forEach((dep) => {
26
- try {
27
- const basedir = path.dirname(mdl.file)
28
- const depPath = resolve.sync(dep, { basedir })
29
- const depModule = createModule(depPath)
30
-
31
- modules.push(depModule)
32
- } catch (_err) {
33
- // eslint-disable-next-line no-empty
34
- }
35
- })
36
- }
37
-
38
- return modules
39
- }
@@ -1,84 +0,0 @@
1
- import log from '../util/log'
2
-
3
- export default function normalizeTailwindDirectives(root) {
4
- let tailwindDirectives = new Set()
5
- let layerDirectives = new Set()
6
- let applyDirectives = new Set()
7
-
8
- root.walkAtRules((atRule) => {
9
- if (atRule.name === 'apply') {
10
- applyDirectives.add(atRule)
11
- }
12
-
13
- if (atRule.name === 'import') {
14
- if (atRule.params === '"tailwindcss/base"' || atRule.params === "'tailwindcss/base'") {
15
- atRule.name = 'tailwind'
16
- atRule.params = 'base'
17
- } else if (
18
- atRule.params === '"tailwindcss/components"' ||
19
- atRule.params === "'tailwindcss/components'"
20
- ) {
21
- atRule.name = 'tailwind'
22
- atRule.params = 'components'
23
- } else if (
24
- atRule.params === '"tailwindcss/utilities"' ||
25
- atRule.params === "'tailwindcss/utilities'"
26
- ) {
27
- atRule.name = 'tailwind'
28
- atRule.params = 'utilities'
29
- } else if (
30
- atRule.params === '"tailwindcss/screens"' ||
31
- atRule.params === "'tailwindcss/screens'" ||
32
- atRule.params === '"tailwindcss/variants"' ||
33
- atRule.params === "'tailwindcss/variants'"
34
- ) {
35
- atRule.name = 'tailwind'
36
- atRule.params = 'variants'
37
- }
38
- }
39
-
40
- if (atRule.name === 'tailwind') {
41
- if (atRule.params === 'screens') {
42
- atRule.params = 'variants'
43
- }
44
- tailwindDirectives.add(atRule.params)
45
- }
46
-
47
- if (['layer', 'responsive', 'variants'].includes(atRule.name)) {
48
- if (['responsive', 'variants'].includes(atRule.name)) {
49
- log.warn(`${atRule.name}-at-rule-deprecated`, [
50
- `The \`@${atRule.name}\` directive has been deprecated in Tailwind CSS v3.0.`,
51
- `Use \`@layer utilities\` or \`@layer components\` instead.`,
52
- 'https://tailwindcss.com/docs/upgrade-guide#replace-variants-with-layer',
53
- ])
54
- }
55
- layerDirectives.add(atRule)
56
- }
57
- })
58
-
59
- if (
60
- !tailwindDirectives.has('base') ||
61
- !tailwindDirectives.has('components') ||
62
- !tailwindDirectives.has('utilities')
63
- ) {
64
- for (let rule of layerDirectives) {
65
- if (rule.name === 'layer' && ['base', 'components', 'utilities'].includes(rule.params)) {
66
- if (!tailwindDirectives.has(rule.params)) {
67
- throw rule.error(
68
- `\`@layer ${rule.params}\` is used but no matching \`@tailwind ${rule.params}\` directive is present.`
69
- )
70
- }
71
- } else if (rule.name === 'responsive') {
72
- if (!tailwindDirectives.has('utilities')) {
73
- throw rule.error('`@responsive` is used but `@tailwind utilities` is missing.')
74
- }
75
- } else if (rule.name === 'variants') {
76
- if (!tailwindDirectives.has('utilities')) {
77
- throw rule.error('`@variants` is used but `@tailwind utilities` is missing.')
78
- }
79
- }
80
- }
81
- }
82
-
83
- return { tailwindDirectives, applyDirectives }
84
- }
@@ -1,367 +0,0 @@
1
- // @ts-check
2
-
3
- import bigSign from '../util/bigSign'
4
- import { remapBitfield } from './remap-bitfield.js'
5
-
6
- /**
7
- * @typedef {'base' | 'defaults' | 'components' | 'utilities' | 'variants' | 'user'} Layer
8
- */
9
-
10
- /**
11
- * @typedef {object} VariantOption
12
- * @property {number} id An unique identifier to identify `matchVariant`
13
- * @property {function | undefined} sort The sort function
14
- * @property {string|null} value The value we want to compare
15
- * @property {string|null} modifier The modifier that was used (if any)
16
- * @property {bigint} variant The variant bitmask
17
- */
18
-
19
- /**
20
- * @typedef {object} RuleOffset
21
- * @property {Layer} layer The layer that this rule belongs to
22
- * @property {Layer} parentLayer The layer that this rule originally belonged to. Only different from layer if this is a variant.
23
- * @property {bigint} arbitrary 0n if false, 1n if true
24
- * @property {bigint} variants Dynamic size. 1 bit per registered variant. 0n means no variants
25
- * @property {bigint} parallelIndex Rule index for the parallel variant. 0 if not applicable.
26
- * @property {bigint} index Index of the rule / utility in it's given *parent* layer. Monotonically increasing.
27
- * @property {VariantOption[]} options Some information on how we can sort arbitrary variants
28
- */
29
-
30
- export class Offsets {
31
- constructor() {
32
- /**
33
- * Offsets for the next rule in a given layer
34
- *
35
- * @type {Record<Layer, bigint>}
36
- */
37
- this.offsets = {
38
- defaults: 0n,
39
- base: 0n,
40
- components: 0n,
41
- utilities: 0n,
42
- variants: 0n,
43
- user: 0n,
44
- }
45
-
46
- /**
47
- * Positions for a given layer
48
- *
49
- * @type {Record<Layer, bigint>}
50
- */
51
- this.layerPositions = {
52
- defaults: 0n,
53
- base: 1n,
54
- components: 2n,
55
- utilities: 3n,
56
-
57
- // There isn't technically a "user" layer, but we need to give it a position
58
- // Because it's used for ordering user-css from @apply
59
- user: 4n,
60
-
61
- variants: 5n,
62
- }
63
-
64
- /**
65
- * The total number of functions currently registered across all variants (including arbitrary variants)
66
- *
67
- * @type {bigint}
68
- */
69
- this.reservedVariantBits = 0n
70
-
71
- /**
72
- * Positions for a given variant
73
- *
74
- * @type {Map<string, bigint>}
75
- */
76
- this.variantOffsets = new Map()
77
- }
78
-
79
- /**
80
- * @param {Layer} layer
81
- * @returns {RuleOffset}
82
- */
83
- create(layer) {
84
- return {
85
- layer,
86
- parentLayer: layer,
87
- arbitrary: 0n,
88
- variants: 0n,
89
- parallelIndex: 0n,
90
- index: this.offsets[layer]++,
91
- options: [],
92
- }
93
- }
94
-
95
- /**
96
- * @returns {RuleOffset}
97
- */
98
- arbitraryProperty() {
99
- return {
100
- ...this.create('utilities'),
101
- arbitrary: 1n,
102
- }
103
- }
104
-
105
- /**
106
- * Get the offset for a variant
107
- *
108
- * @param {string} variant
109
- * @param {number} index
110
- * @returns {RuleOffset}
111
- */
112
- forVariant(variant, index = 0) {
113
- let offset = this.variantOffsets.get(variant)
114
- if (offset === undefined) {
115
- throw new Error(`Cannot find offset for unknown variant ${variant}`)
116
- }
117
-
118
- return {
119
- ...this.create('variants'),
120
- variants: offset << BigInt(index),
121
- }
122
- }
123
-
124
- /**
125
- * @param {RuleOffset} rule
126
- * @param {RuleOffset} variant
127
- * @param {VariantOption} options
128
- * @returns {RuleOffset}
129
- */
130
- applyVariantOffset(rule, variant, options) {
131
- options.variant = variant.variants
132
-
133
- return {
134
- ...rule,
135
- layer: 'variants',
136
- parentLayer: rule.layer === 'variants' ? rule.parentLayer : rule.layer,
137
- variants: rule.variants | variant.variants,
138
- options: options.sort ? [].concat(options, rule.options) : rule.options,
139
-
140
- // TODO: Technically this is wrong. We should be handling parallel index on a per variant basis.
141
- // We'll take the max of all the parallel indexes for now.
142
- // @ts-ignore
143
- parallelIndex: max([rule.parallelIndex, variant.parallelIndex]),
144
- }
145
- }
146
-
147
- /**
148
- * @param {RuleOffset} offset
149
- * @param {number} parallelIndex
150
- * @returns {RuleOffset}
151
- */
152
- applyParallelOffset(offset, parallelIndex) {
153
- return {
154
- ...offset,
155
- parallelIndex: BigInt(parallelIndex),
156
- }
157
- }
158
-
159
- /**
160
- * Each variant gets 1 bit per function / rule registered.
161
- * This is because multiple variants can be applied to a single rule and we need to know which ones are present and which ones are not.
162
- * Additionally, every unique group of variants is grouped together in the stylesheet.
163
- *
164
- * This grouping is order-independent. For instance, we do not differentiate between `hover:focus` and `focus:hover`.
165
- *
166
- * @param {string[]} variants
167
- * @param {(name: string) => number} getLength
168
- */
169
- recordVariants(variants, getLength) {
170
- for (let variant of variants) {
171
- this.recordVariant(variant, getLength(variant))
172
- }
173
- }
174
-
175
- /**
176
- * The same as `recordVariants` but for a single arbitrary variant at runtime.
177
- * @param {string} variant
178
- * @param {number} fnCount
179
- *
180
- * @returns {RuleOffset} The highest offset for this variant
181
- */
182
- recordVariant(variant, fnCount = 1) {
183
- this.variantOffsets.set(variant, 1n << this.reservedVariantBits)
184
-
185
- // Ensure space is reserved for each "function" in the parallel variant
186
- // by offsetting the next variant by the number of parallel variants
187
- // in the one we just added.
188
-
189
- // Single functions that return parallel variants are NOT handled separately here
190
- // They're offset by 1 (or the number of functions) as usual
191
- // And each rule returned is tracked separately since the functions are evaluated lazily.
192
- // @see `RuleOffset.parallelIndex`
193
- this.reservedVariantBits += BigInt(fnCount)
194
-
195
- return {
196
- ...this.create('variants'),
197
- variants: this.variantOffsets.get(variant),
198
- }
199
- }
200
-
201
- /**
202
- * @param {RuleOffset} a
203
- * @param {RuleOffset} b
204
- * @returns {bigint}
205
- */
206
- compare(a, b) {
207
- // Sort layers together
208
- if (a.layer !== b.layer) {
209
- return this.layerPositions[a.layer] - this.layerPositions[b.layer]
210
- }
211
-
212
- // Sort based on the sorting function
213
- for (let aOptions of a.options) {
214
- for (let bOptions of b.options) {
215
- if (aOptions.id !== bOptions.id) continue
216
- if (!aOptions.sort || !bOptions.sort) continue
217
-
218
- let maxFnVariant = max([aOptions.variant, bOptions.variant]) ?? 0n
219
-
220
- // Create a mask of 0s from bits 1..N where N represents the mask of the Nth bit
221
- let mask = ~(maxFnVariant | (maxFnVariant - 1n))
222
- let aVariantsAfterFn = a.variants & mask
223
- let bVariantsAfterFn = b.variants & mask
224
-
225
- // If the variants the same, we _can_ sort them
226
- if (aVariantsAfterFn !== bVariantsAfterFn) {
227
- continue
228
- }
229
-
230
- let result = aOptions.sort(
231
- {
232
- value: aOptions.value,
233
- modifier: aOptions.modifier,
234
- },
235
- {
236
- value: bOptions.value,
237
- modifier: bOptions.modifier,
238
- }
239
- )
240
- if (result !== 0) return result
241
- }
242
- }
243
-
244
- // Sort variants in the order they were registered
245
- if (a.variants !== b.variants) {
246
- return a.variants - b.variants
247
- }
248
-
249
- // Make sure each rule returned by a parallel variant is sorted in ascending order
250
- if (a.parallelIndex !== b.parallelIndex) {
251
- return a.parallelIndex - b.parallelIndex
252
- }
253
-
254
- // Always sort arbitrary properties after other utilities
255
- if (a.arbitrary !== b.arbitrary) {
256
- return a.arbitrary - b.arbitrary
257
- }
258
-
259
- // Sort utilities, components, etc… in the order they were registered
260
- return a.index - b.index
261
- }
262
-
263
- /**
264
- * Arbitrary variants are recorded in the order they're encountered.
265
- * This means that the order is not stable between environments and sets of content files.
266
- *
267
- * In order to make the order stable, we need to remap the arbitrary variant offsets to
268
- * be in alphabetical order starting from the offset of the first arbitrary variant.
269
- */
270
- recalculateVariantOffsets() {
271
- // Sort the variants by their name
272
- let variants = Array.from(this.variantOffsets.entries())
273
- .filter(([v]) => v.startsWith('['))
274
- .sort(([a], [z]) => fastCompare(a, z))
275
-
276
- // Sort the list of offsets
277
- // This is not necessarily a discrete range of numbers which is why
278
- // we're using sort instead of creating a range from min/max
279
- let newOffsets = variants.map(([, offset]) => offset).sort((a, z) => bigSign(a - z))
280
-
281
- // Create a map from the old offsets to the new offsets in the new sort order
282
- /** @type {[bigint, bigint][]} */
283
- let mapping = variants.map(([, oldOffset], i) => [oldOffset, newOffsets[i]])
284
-
285
- // Remove any variants that will not move letting us skip
286
- // remapping if everything happens to be in order
287
- return mapping.filter(([a, z]) => a !== z)
288
- }
289
-
290
- /**
291
- * @template T
292
- * @param {[RuleOffset, T][]} list
293
- * @returns {[RuleOffset, T][]}
294
- */
295
- remapArbitraryVariantOffsets(list) {
296
- let mapping = this.recalculateVariantOffsets()
297
-
298
- // No arbitrary variants? Nothing to do.
299
- // Everyhing already in order? Nothing to do.
300
- if (mapping.length === 0) {
301
- return list
302
- }
303
-
304
- // Remap every variant offset in the list
305
- return list.map((item) => {
306
- let [offset, rule] = item
307
-
308
- offset = {
309
- ...offset,
310
- variants: remapBitfield(offset.variants, mapping),
311
- }
312
-
313
- return [offset, rule]
314
- })
315
- }
316
-
317
- /**
318
- * @template T
319
- * @param {[RuleOffset, T][]} list
320
- * @returns {[RuleOffset, T][]}
321
- */
322
- sort(list) {
323
- list = this.remapArbitraryVariantOffsets(list)
324
-
325
- return list.sort(([a], [b]) => bigSign(this.compare(a, b)))
326
- }
327
- }
328
-
329
- /**
330
- *
331
- * @param {bigint[]} nums
332
- * @returns {bigint|null}
333
- */
334
- function max(nums) {
335
- let max = null
336
-
337
- for (const num of nums) {
338
- max = max ?? num
339
- max = max > num ? max : num
340
- }
341
-
342
- return max
343
- }
344
-
345
- /**
346
- * A fast ASCII order string comparison function.
347
- *
348
- * Using `.sort()` without a custom compare function is faster
349
- * But you can only use that if you're sorting an array of
350
- * only strings. If you're sorting strings inside objects
351
- * or arrays, you need must use a custom compare function.
352
- *
353
- * @param {string} a
354
- * @param {string} b
355
- */
356
- function fastCompare(a, b) {
357
- let aLen = a.length
358
- let bLen = b.length
359
- let minLen = aLen < bLen ? aLen : bLen
360
-
361
- for (let i = 0; i < minLen; i++) {
362
- let cmp = a.charCodeAt(i) - b.charCodeAt(i)
363
- if (cmp !== 0) return cmp
364
- }
365
-
366
- return aLen - bLen
367
- }
@@ -1,52 +0,0 @@
1
- function partitionRules(root) {
2
- if (!root.walkAtRules) return
3
-
4
- let applyParents = new Set()
5
-
6
- root.walkAtRules('apply', (rule) => {
7
- applyParents.add(rule.parent)
8
- })
9
-
10
- if (applyParents.size === 0) {
11
- return
12
- }
13
-
14
- for (let rule of applyParents) {
15
- let nodeGroups = []
16
- let lastGroup = []
17
-
18
- for (let node of rule.nodes) {
19
- if (node.type === 'atrule' && node.name === 'apply') {
20
- if (lastGroup.length > 0) {
21
- nodeGroups.push(lastGroup)
22
- lastGroup = []
23
- }
24
- nodeGroups.push([node])
25
- } else {
26
- lastGroup.push(node)
27
- }
28
- }
29
-
30
- if (lastGroup.length > 0) {
31
- nodeGroups.push(lastGroup)
32
- }
33
-
34
- if (nodeGroups.length === 1) {
35
- continue
36
- }
37
-
38
- for (let group of [...nodeGroups].reverse()) {
39
- let clone = rule.clone({ nodes: [] })
40
- clone.append(group)
41
- rule.after(clone)
42
- }
43
-
44
- rule.remove()
45
- }
46
- }
47
-
48
- export default function expandApplyAtRules() {
49
- return (root) => {
50
- partitionRules(root)
51
- }
52
- }
package/src/lib/regex.js DELETED
@@ -1,74 +0,0 @@
1
- const REGEX_SPECIAL = /[\\^$.*+?()[\]{}|]/g
2
- const REGEX_HAS_SPECIAL = RegExp(REGEX_SPECIAL.source)
3
-
4
- /**
5
- * @param {string|RegExp|Array<string|RegExp>} source
6
- */
7
- function toSource(source) {
8
- source = Array.isArray(source) ? source : [source]
9
-
10
- source = source.map((item) => (item instanceof RegExp ? item.source : item))
11
-
12
- return source.join('')
13
- }
14
-
15
- /**
16
- * @param {string|RegExp|Array<string|RegExp>} source
17
- */
18
- export function pattern(source) {
19
- return new RegExp(toSource(source), 'g')
20
- }
21
-
22
- /**
23
- * @param {string|RegExp|Array<string|RegExp>} source
24
- */
25
- export function withoutCapturing(source) {
26
- return new RegExp(`(?:${toSource(source)})`, 'g')
27
- }
28
-
29
- /**
30
- * @param {Array<string|RegExp>} sources
31
- */
32
- export function any(sources) {
33
- return `(?:${sources.map(toSource).join('|')})`
34
- }
35
-
36
- /**
37
- * @param {string|RegExp} source
38
- */
39
- export function optional(source) {
40
- return `(?:${toSource(source)})?`
41
- }
42
-
43
- /**
44
- * @param {string|RegExp|Array<string|RegExp>} source
45
- */
46
- export function zeroOrMore(source) {
47
- return `(?:${toSource(source)})*`
48
- }
49
-
50
- /**
51
- * Generate a RegExp that matches balanced brackets for a given depth
52
- * We have to specify a depth because JS doesn't support recursive groups using ?R
53
- *
54
- * Based on https://stackoverflow.com/questions/17759004/how-to-match-string-within-parentheses-nested-in-java/17759264#17759264
55
- *
56
- * @param {string|RegExp|Array<string|RegExp>} source
57
- */
58
- export function nestedBrackets(open, close, depth = 1) {
59
- return withoutCapturing([
60
- escape(open),
61
- /[^\s]*/,
62
- depth === 1
63
- ? `[^${escape(open)}${escape(close)}\s]*`
64
- : any([`[^${escape(open)}${escape(close)}\s]*`, nestedBrackets(open, close, depth - 1)]),
65
- /[^\s]*/,
66
- escape(close),
67
- ])
68
- }
69
-
70
- export function escape(string) {
71
- return string && REGEX_HAS_SPECIAL.test(string)
72
- ? string.replace(REGEX_SPECIAL, '\\$&')
73
- : string || ''
74
- }
@@ -1,82 +0,0 @@
1
- // @ts-check
2
-
3
- /**
4
- * We must remap all the old bits to new bits for each set variant
5
- * Only arbitrary variants are considered as those are the only
6
- * ones that need to be re-sorted at this time
7
- *
8
- * An iterated process that removes and sets individual bits simultaneously
9
- * will not work because we may have a new bit that is also a later old bit
10
- * This means that we would be removing a previously set bit which we don't
11
- * want to do
12
- *
13
- * For example (assume `bN` = `1<<N`)
14
- * Given the "total" mapping `[[b1, b3], [b2, b4], [b3, b1], [b4, b2]]`
15
- * The mapping is "total" because:
16
- * 1. Every input and output is accounted for
17
- * 2. All combinations are unique
18
- * 3. No one input maps to multiple outputs and vice versa
19
- * And, given an offset with all bits set:
20
- * V = b1 | b2 | b3 | b4
21
- *
22
- * Let's explore the issue with removing and setting bits simultaneously:
23
- * V & ~b1 | b3 = b2 | b3 | b4
24
- * V & ~b2 | b4 = b3 | b4
25
- * V & ~b3 | b1 = b1 | b4
26
- * V & ~b4 | b2 = b1 | b2
27
- *
28
- * As you can see, we end up with the wrong result.
29
- * This is because we're removing a bit that was previously set.
30
- * And, thus the final result is missing b3 and b4.
31
- *
32
- * Now, let's explore the issue with removing the bits first:
33
- * V & ~b1 = b2 | b3 | b4
34
- * V & ~b2 = b3 | b4
35
- * V & ~b3 = b4
36
- * V & ~b4 = 0
37
- *
38
- * And then setting the bits:
39
- * V | b3 = b3
40
- * V | b4 = b3 | b4
41
- * V | b1 = b1 | b3 | b4
42
- * V | b2 = b1 | b2 | b3 | b4
43
- *
44
- * We get the correct result because we're not removing any bits that were
45
- * previously set thus properly remapping the bits to the new order
46
- *
47
- * To collect this into a single operation that can be done simultaneously
48
- * we must first create a mask for the old bits that are set and a mask for
49
- * the new bits that are set. Then we can remove the old bits and set the new
50
- * bits simultaneously in a "single" operation like so:
51
- * OldMask = b1 | b2 | b3 | b4
52
- * NewMask = b3 | b4 | b1 | b2
53
- *
54
- * So this:
55
- * V & ~oldMask | newMask
56
- *
57
- * Expands to this:
58
- * V & ~b1 & ~b2 & ~b3 & ~b4 | b3 | b4 | b1 | b2
59
- *
60
- * Which becomes this:
61
- * b1 | b2 | b3 | b4
62
- *
63
- * Which is the correct result!
64
- *
65
- * @param {bigint} num
66
- * @param {[bigint, bigint][]} mapping
67
- */
68
- export function remapBitfield(num, mapping) {
69
- // Create masks for the old and new bits that are set
70
- let oldMask = 0n
71
- let newMask = 0n
72
- for (let [oldBit, newBit] of mapping) {
73
- if (num & oldBit) {
74
- oldMask = oldMask | oldBit
75
- newMask = newMask | newBit
76
- }
77
- }
78
-
79
- // Remove all old bits
80
- // Set all new bits
81
- return (num & ~oldMask) | newMask
82
- }