tailwindcss 3.4.1 → 4.0.0-alpha.2

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 (280) hide show
  1. package/README.md +5 -6
  2. package/dist/lib.d.mts +324 -0
  3. package/dist/lib.d.ts +324 -0
  4. package/dist/lib.js +11 -0
  5. package/dist/lib.mjs +11 -0
  6. package/index.css +5 -0
  7. package/package.json +29 -107
  8. package/preflight.css +355 -0
  9. package/theme.css +465 -0
  10. package/CHANGELOG.md +0 -2571
  11. package/base.css +0 -1
  12. package/colors.d.ts +0 -3
  13. package/colors.js +0 -2
  14. package/components.css +0 -1
  15. package/defaultConfig.d.ts +0 -3
  16. package/defaultConfig.js +0 -2
  17. package/defaultTheme.d.ts +0 -4
  18. package/defaultTheme.js +0 -2
  19. package/lib/cli/build/deps.js +0 -62
  20. package/lib/cli/build/index.js +0 -54
  21. package/lib/cli/build/plugin.js +0 -378
  22. package/lib/cli/build/utils.js +0 -88
  23. package/lib/cli/build/watching.js +0 -182
  24. package/lib/cli/help/index.js +0 -73
  25. package/lib/cli/index.js +0 -230
  26. package/lib/cli/init/index.js +0 -63
  27. package/lib/cli-peer-dependencies.js +0 -36
  28. package/lib/cli.js +0 -7
  29. package/lib/corePluginList.js +0 -190
  30. package/lib/corePlugins.js +0 -4282
  31. package/lib/css/LICENSE +0 -25
  32. package/lib/css/preflight.css +0 -385
  33. package/lib/featureFlags.js +0 -83
  34. package/lib/index.js +0 -2
  35. package/lib/lib/cacheInvalidation.js +0 -92
  36. package/lib/lib/collapseAdjacentRules.js +0 -61
  37. package/lib/lib/collapseDuplicateDeclarations.js +0 -85
  38. package/lib/lib/content.js +0 -181
  39. package/lib/lib/defaultExtractor.js +0 -251
  40. package/lib/lib/detectNesting.js +0 -45
  41. package/lib/lib/evaluateTailwindFunctions.js +0 -238
  42. package/lib/lib/expandApplyAtRules.js +0 -540
  43. package/lib/lib/expandTailwindAtRules.js +0 -291
  44. package/lib/lib/findAtConfigPath.js +0 -46
  45. package/lib/lib/generateRules.js +0 -904
  46. package/lib/lib/getModuleDependencies.js +0 -99
  47. package/lib/lib/load-config.js +0 -53
  48. package/lib/lib/normalizeTailwindDirectives.js +0 -89
  49. package/lib/lib/offsets.js +0 -306
  50. package/lib/lib/partitionApplyAtRules.js +0 -58
  51. package/lib/lib/regex.js +0 -74
  52. package/lib/lib/remap-bitfield.js +0 -89
  53. package/lib/lib/resolveDefaultsAtRules.js +0 -165
  54. package/lib/lib/setupContextUtils.js +0 -1294
  55. package/lib/lib/setupTrackingContext.js +0 -166
  56. package/lib/lib/sharedState.js +0 -87
  57. package/lib/lib/substituteScreenAtRules.js +0 -31
  58. package/lib/oxide/cli/build/deps.js +0 -89
  59. package/lib/oxide/cli/build/index.js +0 -53
  60. package/lib/oxide/cli/build/plugin.js +0 -375
  61. package/lib/oxide/cli/build/utils.js +0 -87
  62. package/lib/oxide/cli/build/watching.js +0 -179
  63. package/lib/oxide/cli/help/index.js +0 -72
  64. package/lib/oxide/cli/index.js +0 -214
  65. package/lib/oxide/cli/init/index.js +0 -52
  66. package/lib/oxide/cli.js +0 -5
  67. package/lib/oxide/postcss-plugin.js +0 -2
  68. package/lib/plugin.js +0 -98
  69. package/lib/postcss-plugins/nesting/README.md +0 -42
  70. package/lib/postcss-plugins/nesting/index.js +0 -21
  71. package/lib/postcss-plugins/nesting/plugin.js +0 -89
  72. package/lib/processTailwindFeatures.js +0 -64
  73. package/lib/public/colors.js +0 -355
  74. package/lib/public/create-plugin.js +0 -17
  75. package/lib/public/default-config.js +0 -18
  76. package/lib/public/default-theme.js +0 -18
  77. package/lib/public/load-config.js +0 -12
  78. package/lib/public/resolve-config.js +0 -24
  79. package/lib/util/applyImportantSelector.js +0 -36
  80. package/lib/util/bigSign.js +0 -13
  81. package/lib/util/buildMediaQuery.js +0 -27
  82. package/lib/util/cloneDeep.js +0 -22
  83. package/lib/util/cloneNodes.js +0 -54
  84. package/lib/util/color.js +0 -116
  85. package/lib/util/colorNames.js +0 -752
  86. package/lib/util/configurePlugins.js +0 -23
  87. package/lib/util/createPlugin.js +0 -32
  88. package/lib/util/createUtilityPlugin.js +0 -53
  89. package/lib/util/dataTypes.js +0 -415
  90. package/lib/util/defaults.js +0 -27
  91. package/lib/util/escapeClassName.js +0 -24
  92. package/lib/util/escapeCommas.js +0 -13
  93. package/lib/util/flattenColorPalette.js +0 -18
  94. package/lib/util/formatVariantSelector.js +0 -270
  95. package/lib/util/getAllConfigs.js +0 -50
  96. package/lib/util/hashConfig.js +0 -21
  97. package/lib/util/isKeyframeRule.js +0 -13
  98. package/lib/util/isPlainObject.js +0 -17
  99. package/lib/util/isSyntacticallyValidPropertyValue.js +0 -74
  100. package/lib/util/log.js +0 -61
  101. package/lib/util/nameClass.js +0 -49
  102. package/lib/util/negateValue.js +0 -36
  103. package/lib/util/normalizeConfig.js +0 -282
  104. package/lib/util/normalizeScreens.js +0 -178
  105. package/lib/util/parseAnimationValue.js +0 -93
  106. package/lib/util/parseBoxShadowValue.js +0 -88
  107. package/lib/util/parseDependency.js +0 -47
  108. package/lib/util/parseGlob.js +0 -36
  109. package/lib/util/parseObjectStyles.js +0 -36
  110. package/lib/util/pluginUtils.js +0 -289
  111. package/lib/util/prefixSelector.js +0 -39
  112. package/lib/util/pseudoElements.js +0 -212
  113. package/lib/util/removeAlphaVariables.js +0 -31
  114. package/lib/util/resolveConfig.js +0 -256
  115. package/lib/util/resolveConfigPath.js +0 -70
  116. package/lib/util/responsive.js +0 -24
  117. package/lib/util/splitAtTopLevelOnly.js +0 -51
  118. package/lib/util/tap.js +0 -14
  119. package/lib/util/toColorValue.js +0 -13
  120. package/lib/util/toPath.js +0 -32
  121. package/lib/util/transformThemeValue.js +0 -73
  122. package/lib/util/validateConfig.js +0 -37
  123. package/lib/util/validateFormalSyntax.js +0 -26
  124. package/lib/util/withAlphaVariable.js +0 -79
  125. package/lib/value-parser/LICENSE +0 -22
  126. package/lib/value-parser/README.md +0 -3
  127. package/lib/value-parser/index.d.js +0 -2
  128. package/lib/value-parser/index.js +0 -22
  129. package/lib/value-parser/parse.js +0 -259
  130. package/lib/value-parser/stringify.js +0 -38
  131. package/lib/value-parser/unit.js +0 -86
  132. package/lib/value-parser/walk.js +0 -16
  133. package/loadConfig.d.ts +0 -4
  134. package/loadConfig.js +0 -2
  135. package/nesting/index.d.ts +0 -4
  136. package/nesting/index.js +0 -2
  137. package/peers/index.js +0 -96624
  138. package/plugin.d.ts +0 -11
  139. package/plugin.js +0 -2
  140. package/prettier.config.js +0 -19
  141. package/resolveConfig.d.ts +0 -31
  142. package/resolveConfig.js +0 -2
  143. package/screens.css +0 -1
  144. package/scripts/create-plugin-list.js +0 -10
  145. package/scripts/generate-types.js +0 -104
  146. package/scripts/release-channel.js +0 -18
  147. package/scripts/release-notes.js +0 -21
  148. package/scripts/swap-engines.js +0 -40
  149. package/scripts/type-utils.js +0 -27
  150. package/src/cli/build/deps.js +0 -56
  151. package/src/cli/build/index.js +0 -49
  152. package/src/cli/build/plugin.js +0 -444
  153. package/src/cli/build/utils.js +0 -76
  154. package/src/cli/build/watching.js +0 -229
  155. package/src/cli/help/index.js +0 -70
  156. package/src/cli/index.js +0 -216
  157. package/src/cli/init/index.js +0 -79
  158. package/src/cli-peer-dependencies.js +0 -15
  159. package/src/cli.js +0 -7
  160. package/src/corePluginList.js +0 -1
  161. package/src/corePlugins.js +0 -2943
  162. package/src/css/LICENSE +0 -25
  163. package/src/css/preflight.css +0 -385
  164. package/src/featureFlags.js +0 -66
  165. package/src/index.js +0 -1
  166. package/src/lib/cacheInvalidation.js +0 -52
  167. package/src/lib/collapseAdjacentRules.js +0 -58
  168. package/src/lib/collapseDuplicateDeclarations.js +0 -93
  169. package/src/lib/content.js +0 -208
  170. package/src/lib/defaultExtractor.js +0 -230
  171. package/src/lib/detectNesting.js +0 -47
  172. package/src/lib/evaluateTailwindFunctions.js +0 -272
  173. package/src/lib/expandApplyAtRules.js +0 -620
  174. package/src/lib/expandTailwindAtRules.js +0 -300
  175. package/src/lib/findAtConfigPath.js +0 -48
  176. package/src/lib/generateRules.js +0 -951
  177. package/src/lib/getModuleDependencies.js +0 -79
  178. package/src/lib/load-config.ts +0 -39
  179. package/src/lib/normalizeTailwindDirectives.js +0 -84
  180. package/src/lib/offsets.js +0 -373
  181. package/src/lib/partitionApplyAtRules.js +0 -52
  182. package/src/lib/regex.js +0 -74
  183. package/src/lib/remap-bitfield.js +0 -82
  184. package/src/lib/resolveDefaultsAtRules.js +0 -163
  185. package/src/lib/setupContextUtils.js +0 -1366
  186. package/src/lib/setupTrackingContext.js +0 -169
  187. package/src/lib/sharedState.js +0 -61
  188. package/src/lib/substituteScreenAtRules.js +0 -19
  189. package/src/oxide/cli/build/deps.ts +0 -91
  190. package/src/oxide/cli/build/index.ts +0 -47
  191. package/src/oxide/cli/build/plugin.ts +0 -442
  192. package/src/oxide/cli/build/utils.ts +0 -74
  193. package/src/oxide/cli/build/watching.ts +0 -225
  194. package/src/oxide/cli/help/index.ts +0 -69
  195. package/src/oxide/cli/index.ts +0 -204
  196. package/src/oxide/cli/init/index.ts +0 -59
  197. package/src/oxide/cli.ts +0 -1
  198. package/src/oxide/postcss-plugin.ts +0 -1
  199. package/src/plugin.js +0 -107
  200. package/src/postcss-plugins/nesting/README.md +0 -42
  201. package/src/postcss-plugins/nesting/index.js +0 -13
  202. package/src/postcss-plugins/nesting/plugin.js +0 -80
  203. package/src/processTailwindFeatures.js +0 -59
  204. package/src/public/colors.js +0 -322
  205. package/src/public/create-plugin.js +0 -2
  206. package/src/public/default-config.js +0 -4
  207. package/src/public/default-theme.js +0 -4
  208. package/src/public/load-config.js +0 -2
  209. package/src/public/resolve-config.js +0 -7
  210. package/src/util/applyImportantSelector.js +0 -27
  211. package/src/util/bigSign.js +0 -3
  212. package/src/util/buildMediaQuery.js +0 -22
  213. package/src/util/cloneDeep.js +0 -11
  214. package/src/util/cloneNodes.js +0 -49
  215. package/src/util/color.js +0 -88
  216. package/src/util/colorNames.js +0 -150
  217. package/src/util/configurePlugins.js +0 -23
  218. package/src/util/createPlugin.js +0 -27
  219. package/src/util/createUtilityPlugin.js +0 -37
  220. package/src/util/dataTypes.js +0 -406
  221. package/src/util/defaults.js +0 -17
  222. package/src/util/escapeClassName.js +0 -8
  223. package/src/util/escapeCommas.js +0 -3
  224. package/src/util/flattenColorPalette.js +0 -13
  225. package/src/util/formatVariantSelector.js +0 -324
  226. package/src/util/getAllConfigs.js +0 -38
  227. package/src/util/hashConfig.js +0 -5
  228. package/src/util/isKeyframeRule.js +0 -3
  229. package/src/util/isPlainObject.js +0 -8
  230. package/src/util/isSyntacticallyValidPropertyValue.js +0 -61
  231. package/src/util/log.js +0 -29
  232. package/src/util/nameClass.js +0 -30
  233. package/src/util/negateValue.js +0 -24
  234. package/src/util/normalizeConfig.js +0 -301
  235. package/src/util/normalizeScreens.js +0 -140
  236. package/src/util/parseAnimationValue.js +0 -68
  237. package/src/util/parseBoxShadowValue.js +0 -72
  238. package/src/util/parseDependency.js +0 -44
  239. package/src/util/parseGlob.js +0 -24
  240. package/src/util/parseObjectStyles.js +0 -19
  241. package/src/util/pluginUtils.js +0 -307
  242. package/src/util/prefixSelector.js +0 -33
  243. package/src/util/pseudoElements.js +0 -171
  244. package/src/util/removeAlphaVariables.js +0 -24
  245. package/src/util/resolveConfig.js +0 -277
  246. package/src/util/resolveConfigPath.js +0 -66
  247. package/src/util/responsive.js +0 -10
  248. package/src/util/splitAtTopLevelOnly.js +0 -52
  249. package/src/util/tap.js +0 -4
  250. package/src/util/toColorValue.js +0 -3
  251. package/src/util/toPath.js +0 -26
  252. package/src/util/transformThemeValue.js +0 -62
  253. package/src/util/validateConfig.js +0 -26
  254. package/src/util/validateFormalSyntax.js +0 -34
  255. package/src/util/withAlphaVariable.js +0 -49
  256. package/src/value-parser/LICENSE +0 -22
  257. package/src/value-parser/README.md +0 -3
  258. package/src/value-parser/index.d.ts +0 -177
  259. package/src/value-parser/index.js +0 -28
  260. package/src/value-parser/parse.js +0 -303
  261. package/src/value-parser/stringify.js +0 -41
  262. package/src/value-parser/unit.js +0 -118
  263. package/src/value-parser/walk.js +0 -18
  264. package/stubs/.gitignore +0 -1
  265. package/stubs/.prettierrc.json +0 -6
  266. package/stubs/config.full.js +0 -1062
  267. package/stubs/config.simple.js +0 -7
  268. package/stubs/postcss.config.cjs +0 -6
  269. package/stubs/postcss.config.js +0 -6
  270. package/stubs/tailwind.config.cjs +0 -2
  271. package/stubs/tailwind.config.js +0 -2
  272. package/stubs/tailwind.config.ts +0 -3
  273. package/tailwind.css +0 -5
  274. package/types/config.d.ts +0 -376
  275. package/types/generated/.gitkeep +0 -0
  276. package/types/generated/colors.d.ts +0 -298
  277. package/types/generated/corePluginList.d.ts +0 -1
  278. package/types/generated/default-theme.d.ts +0 -397
  279. package/types/index.d.ts +0 -11
  280. package/variants.css +0 -1
@@ -1,272 +0,0 @@
1
- import dlv from 'dlv'
2
- import didYouMean from 'didyoumean'
3
- import transformThemeValue from '../util/transformThemeValue'
4
- import parseValue from '../value-parser/index'
5
- import { normalizeScreens } from '../util/normalizeScreens'
6
- import buildMediaQuery from '../util/buildMediaQuery'
7
- import { toPath } from '../util/toPath'
8
- import { withAlphaValue } from '../util/withAlphaVariable'
9
- import { parseColorFormat } from '../util/pluginUtils'
10
- import log from '../util/log'
11
-
12
- function isObject(input) {
13
- return typeof input === 'object' && input !== null
14
- }
15
-
16
- function findClosestExistingPath(theme, path) {
17
- let parts = toPath(path)
18
- do {
19
- parts.pop()
20
-
21
- if (dlv(theme, parts) !== undefined) break
22
- } while (parts.length)
23
-
24
- return parts.length ? parts : undefined
25
- }
26
-
27
- function pathToString(path) {
28
- if (typeof path === 'string') return path
29
- return path.reduce((acc, cur, i) => {
30
- if (cur.includes('.')) return `${acc}[${cur}]`
31
- return i === 0 ? cur : `${acc}.${cur}`
32
- }, '')
33
- }
34
-
35
- function list(items) {
36
- return items.map((key) => `'${key}'`).join(', ')
37
- }
38
-
39
- function listKeys(obj) {
40
- return list(Object.keys(obj))
41
- }
42
-
43
- function validatePath(config, path, defaultValue, themeOpts = {}) {
44
- const pathString = Array.isArray(path) ? pathToString(path) : path.replace(/^['"]+|['"]+$/g, '')
45
- const pathSegments = Array.isArray(path) ? path : toPath(pathString)
46
- const value = dlv(config.theme, pathSegments, defaultValue)
47
-
48
- if (value === undefined) {
49
- let error = `'${pathString}' does not exist in your theme config.`
50
- const parentSegments = pathSegments.slice(0, -1)
51
- const parentValue = dlv(config.theme, parentSegments)
52
-
53
- if (isObject(parentValue)) {
54
- const validKeys = Object.keys(parentValue).filter(
55
- (key) => validatePath(config, [...parentSegments, key]).isValid
56
- )
57
- const suggestion = didYouMean(pathSegments[pathSegments.length - 1], validKeys)
58
- if (suggestion) {
59
- error += ` Did you mean '${pathToString([...parentSegments, suggestion])}'?`
60
- } else if (validKeys.length > 0) {
61
- error += ` '${pathToString(parentSegments)}' has the following valid keys: ${list(
62
- validKeys
63
- )}`
64
- }
65
- } else {
66
- const closestPath = findClosestExistingPath(config.theme, pathString)
67
- if (closestPath) {
68
- const closestValue = dlv(config.theme, closestPath)
69
- if (isObject(closestValue)) {
70
- error += ` '${pathToString(closestPath)}' has the following keys: ${listKeys(
71
- closestValue
72
- )}`
73
- } else {
74
- error += ` '${pathToString(closestPath)}' is not an object.`
75
- }
76
- } else {
77
- error += ` Your theme has the following top-level keys: ${listKeys(config.theme)}`
78
- }
79
- }
80
-
81
- return {
82
- isValid: false,
83
- error,
84
- }
85
- }
86
-
87
- if (
88
- !(
89
- typeof value === 'string' ||
90
- typeof value === 'number' ||
91
- typeof value === 'function' ||
92
- value instanceof String ||
93
- value instanceof Number ||
94
- Array.isArray(value)
95
- )
96
- ) {
97
- let error = `'${pathString}' was found but does not resolve to a string.`
98
-
99
- if (isObject(value)) {
100
- let validKeys = Object.keys(value).filter(
101
- (key) => validatePath(config, [...pathSegments, key]).isValid
102
- )
103
- if (validKeys.length) {
104
- error += ` Did you mean something like '${pathToString([...pathSegments, validKeys[0]])}'?`
105
- }
106
- }
107
-
108
- return {
109
- isValid: false,
110
- error,
111
- }
112
- }
113
-
114
- const [themeSection] = pathSegments
115
-
116
- return {
117
- isValid: true,
118
- value: transformThemeValue(themeSection)(value, themeOpts),
119
- }
120
- }
121
-
122
- function extractArgs(node, vNodes, functions) {
123
- vNodes = vNodes.map((vNode) => resolveVNode(node, vNode, functions))
124
-
125
- let args = ['']
126
-
127
- for (let vNode of vNodes) {
128
- if (vNode.type === 'div' && vNode.value === ',') {
129
- args.push('')
130
- } else {
131
- args[args.length - 1] += parseValue.stringify(vNode)
132
- }
133
- }
134
-
135
- return args
136
- }
137
-
138
- function resolveVNode(node, vNode, functions) {
139
- if (vNode.type === 'function' && functions[vNode.value] !== undefined) {
140
- let args = extractArgs(node, vNode.nodes, functions)
141
- vNode.type = 'word'
142
- vNode.value = functions[vNode.value](node, ...args)
143
- }
144
-
145
- return vNode
146
- }
147
-
148
- function resolveFunctions(node, input, functions) {
149
- let hasAnyFn = Object.keys(functions).some((fn) => input.includes(`${fn}(`))
150
- if (!hasAnyFn) return input
151
-
152
- return parseValue(input)
153
- .walk((vNode) => {
154
- resolveVNode(node, vNode, functions)
155
- })
156
- .toString()
157
- }
158
-
159
- let nodeTypePropertyMap = {
160
- atrule: 'params',
161
- decl: 'value',
162
- }
163
-
164
- /**
165
- * @param {string} path
166
- * @returns {Iterable<[path: string, alpha: string|undefined]>}
167
- */
168
- function* toPaths(path) {
169
- // Strip quotes from beginning and end of string
170
- // This allows the alpha value to be present inside of quotes
171
- path = path.replace(/^['"]+|['"]+$/g, '')
172
-
173
- let matches = path.match(/^([^\s]+)(?![^\[]*\])(?:\s*\/\s*([^\/\s]+))$/)
174
- let alpha = undefined
175
-
176
- yield [path, undefined]
177
-
178
- if (matches) {
179
- path = matches[1]
180
- alpha = matches[2]
181
-
182
- yield [path, alpha]
183
- }
184
- }
185
-
186
- /**
187
- *
188
- * @param {any} config
189
- * @param {string} path
190
- * @param {any} defaultValue
191
- */
192
- function resolvePath(config, path, defaultValue) {
193
- const results = Array.from(toPaths(path)).map(([path, alpha]) => {
194
- return Object.assign(validatePath(config, path, defaultValue, { opacityValue: alpha }), {
195
- resolvedPath: path,
196
- alpha,
197
- })
198
- })
199
-
200
- return results.find((result) => result.isValid) ?? results[0]
201
- }
202
-
203
- export default function (context) {
204
- let config = context.tailwindConfig
205
-
206
- let functions = {
207
- theme: (node, path, ...defaultValue) => {
208
- let { isValid, value, error, alpha } = resolvePath(
209
- config,
210
- path,
211
- defaultValue.length ? defaultValue : undefined
212
- )
213
-
214
- if (!isValid) {
215
- let parentNode = node.parent
216
- let candidate = parentNode?.raws.tailwind?.candidate
217
-
218
- if (parentNode && candidate !== undefined) {
219
- // Remove this utility from any caches
220
- context.markInvalidUtilityNode(parentNode)
221
-
222
- // Remove the CSS node from the markup
223
- parentNode.remove()
224
-
225
- // Show a warning
226
- log.warn('invalid-theme-key-in-class', [
227
- `The utility \`${candidate}\` contains an invalid theme value and was not generated.`,
228
- ])
229
-
230
- return
231
- }
232
-
233
- throw node.error(error)
234
- }
235
-
236
- let maybeColor = parseColorFormat(value)
237
- let isColorFunction = maybeColor !== undefined && typeof maybeColor === 'function'
238
-
239
- if (alpha !== undefined || isColorFunction) {
240
- if (alpha === undefined) {
241
- alpha = 1.0
242
- }
243
-
244
- value = withAlphaValue(maybeColor, alpha, maybeColor)
245
- }
246
-
247
- return value
248
- },
249
- screen: (node, screen) => {
250
- screen = screen.replace(/^['"]+/g, '').replace(/['"]+$/g, '')
251
- let screens = normalizeScreens(config.theme.screens)
252
- let screenDefinition = screens.find(({ name }) => name === screen)
253
-
254
- if (!screenDefinition) {
255
- throw node.error(`The '${screen}' screen does not exist in your theme.`)
256
- }
257
-
258
- return buildMediaQuery(screenDefinition)
259
- },
260
- }
261
- return (root) => {
262
- root.walk((node) => {
263
- let property = nodeTypePropertyMap[node.type]
264
-
265
- if (property === undefined) {
266
- return
267
- }
268
-
269
- node[property] = resolveFunctions(node, node[property], functions)
270
- })
271
- }
272
- }