react-native-unistyles 3.0.0-beta.7 → 3.0.0-beta.8

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 (79) hide show
  1. package/README.md +16 -0
  2. package/android/CMakeLists.txt +2 -1
  3. package/android/src/main/java/com/unistyles/NativePlatform+insets.kt +9 -1
  4. package/cxx/common/Helpers.h +85 -0
  5. package/cxx/core/UnistylesCommitHook.cpp +20 -17
  6. package/cxx/core/UnistylesMountHook.cpp +2 -2
  7. package/cxx/core/UnistylesMountHook.h +1 -4
  8. package/cxx/core/UnistylesRegistry.cpp +8 -6
  9. package/cxx/hybridObjects/HybridShadowRegistry.cpp +2 -5
  10. package/cxx/hybridObjects/HybridStyleSheet.cpp +1 -1
  11. package/cxx/hybridObjects/HybridUnistylesRuntime.cpp +5 -1
  12. package/cxx/parser/Parser.cpp +74 -9
  13. package/cxx/shadowTree/ShadowTrafficController.h +10 -4
  14. package/cxx/shadowTree/ShadowTreeManager.cpp +38 -35
  15. package/lib/commonjs/components/native/ImageBackground.js +26 -30
  16. package/lib/commonjs/components/native/ImageBackground.js.map +1 -1
  17. package/lib/commonjs/components/native/Pressable.native.js +12 -1
  18. package/lib/commonjs/components/native/Pressable.native.js.map +1 -1
  19. package/lib/commonjs/core/createUnistylesElement.native.js +4 -0
  20. package/lib/commonjs/core/createUnistylesElement.native.js.map +1 -1
  21. package/lib/commonjs/core/createUnistylesImageBackground.js +4 -0
  22. package/lib/commonjs/core/createUnistylesImageBackground.js.map +1 -1
  23. package/lib/commonjs/core/useProxifiedUnistyles/useProxifiedUnistyles.js +1 -1
  24. package/lib/commonjs/core/useProxifiedUnistyles/useProxifiedUnistyles.js.map +1 -1
  25. package/lib/commonjs/core/withUnistyles/withUnistyles.native.js +14 -7
  26. package/lib/commonjs/core/withUnistyles/withUnistyles.native.js.map +1 -1
  27. package/lib/commonjs/specs/ShadowRegistry/index.js +1 -1
  28. package/lib/commonjs/specs/ShadowRegistry/index.js.map +1 -1
  29. package/lib/module/components/native/ImageBackground.js +26 -30
  30. package/lib/module/components/native/ImageBackground.js.map +1 -1
  31. package/lib/module/components/native/Pressable.native.js +12 -1
  32. package/lib/module/components/native/Pressable.native.js.map +1 -1
  33. package/lib/module/core/createUnistylesElement.native.js +4 -0
  34. package/lib/module/core/createUnistylesElement.native.js.map +1 -1
  35. package/lib/module/core/createUnistylesImageBackground.js +4 -0
  36. package/lib/module/core/createUnistylesImageBackground.js.map +1 -1
  37. package/lib/module/core/useProxifiedUnistyles/useProxifiedUnistyles.js +1 -1
  38. package/lib/module/core/useProxifiedUnistyles/useProxifiedUnistyles.js.map +1 -1
  39. package/lib/module/core/withUnistyles/withUnistyles.native.js +14 -7
  40. package/lib/module/core/withUnistyles/withUnistyles.native.js.map +1 -1
  41. package/lib/module/specs/ShadowRegistry/index.js +1 -1
  42. package/lib/module/specs/ShadowRegistry/index.js.map +1 -1
  43. package/lib/typescript/src/components/native/ImageBackground.d.ts.map +1 -1
  44. package/lib/typescript/src/components/native/Pressable.native.d.ts.map +1 -1
  45. package/lib/typescript/src/core/createUnistylesElement.native.d.ts.map +1 -1
  46. package/lib/typescript/src/core/createUnistylesImageBackground.d.ts.map +1 -1
  47. package/lib/typescript/src/core/withUnistyles/withUnistyles.native.d.ts.map +1 -1
  48. package/lib/typescript/src/specs/ShadowRegistry/index.d.ts.map +1 -1
  49. package/lib/typescript/src/types/stylesheet.d.ts +1 -1
  50. package/lib/typescript/src/types/stylesheet.d.ts.map +1 -1
  51. package/nitrogen/generated/android/c++/JFunc_void_UnistylesNativeMiniRuntime.hpp +2 -2
  52. package/nitrogen/generated/android/c++/JFunc_void_std__vector_UnistyleDependency__UnistylesNativeMiniRuntime.hpp +2 -2
  53. package/nitrogen/generated/android/c++/JHybridNativePlatformSpec.cpp +19 -19
  54. package/nitrogen/generated/android/kotlin/com/margelo/nitro/unistyles/Func_void_UnistylesNativeMiniRuntime.kt +7 -2
  55. package/nitrogen/generated/android/kotlin/com/margelo/nitro/unistyles/Func_void_std__vector_UnistyleDependency__UnistylesNativeMiniRuntime.kt +7 -2
  56. package/nitrogen/generated/android/kotlin/com/margelo/nitro/unistyles/HybridNativePlatformSpec.kt +22 -22
  57. package/nitrogen/generated/android/unistyles+autolinking.cmake +16 -0
  58. package/nitrogen/generated/ios/Unistyles-Swift-Cxx-Umbrella.hpp +0 -1
  59. package/nitrogen/generated/shared/c++/Dimensions.hpp +1 -0
  60. package/nitrogen/generated/shared/c++/Insets.hpp +1 -0
  61. package/nitrogen/generated/shared/c++/UnistylesCxxMiniRuntime.hpp +1 -0
  62. package/nitrogen/generated/shared/c++/UnistylesNativeMiniRuntime.hpp +1 -0
  63. package/package.json +28 -18
  64. package/plugin/index.d.ts +51 -18
  65. package/plugin/index.js +791 -178
  66. package/src/components/native/ImageBackground.tsx +3 -4
  67. package/src/components/native/Pressable.native.tsx +16 -1
  68. package/src/core/createUnistylesElement.native.tsx +5 -0
  69. package/src/core/createUnistylesImageBackground.tsx +5 -0
  70. package/src/core/useProxifiedUnistyles/useProxifiedUnistyles.ts +1 -1
  71. package/src/core/withUnistyles/withUnistyles.native.tsx +40 -14
  72. package/src/specs/ShadowRegistry/index.ts +1 -0
  73. package/src/types/stylesheet.ts +1 -1
  74. package/plugin/consts.js +0 -63
  75. package/plugin/exotic.js +0 -54
  76. package/plugin/import.js +0 -51
  77. package/plugin/ref.js +0 -11
  78. package/plugin/stylesheet.js +0 -565
  79. package/plugin/variants.js +0 -66
@@ -1,565 +0,0 @@
1
- const UnistyleDependency = {
2
- Theme: 0,
3
- ThemeName: 1,
4
- AdaptiveThemes: 2,
5
- Breakpoints: 3,
6
- Variants: 4,
7
- ColorScheme: 5,
8
- Dimensions: 6,
9
- Orientation: 7,
10
- ContentSizeCategory: 8,
11
- Insets: 9,
12
- PixelRatio: 10,
13
- FontScale: 11,
14
- StatusBar: 12,
15
- NavigationBar: 13,
16
- Ime: 14
17
- }
18
-
19
- function stringToUniqueId(str) {
20
- let hash = 0
21
-
22
- for (let i = 0; i < str.length; i++) {
23
- hash = (hash << 5) - hash + str.charCodeAt(i)
24
- hash |= 0
25
- }
26
-
27
- const absHash = Math.abs(hash)
28
-
29
- return absHash % 1000000000
30
- }
31
-
32
- function isUnistylesStyleSheet(t, path, state) {
33
- const callee = path.get('callee')
34
-
35
- return (
36
- t.isMemberExpression(callee.node) &&
37
- callee.node.property.name === 'create' &&
38
- t.isIdentifier(callee.node.object) &&
39
- callee.node.object.name === state.file.styleSheetLocalName
40
- )
41
- }
42
-
43
- function isKindOfStyleSheet(t, path, state) {
44
- if (!state.file.forceProcessing && !state.file.hasUnistylesImport) {
45
- return false
46
- }
47
-
48
- const callee = path.get('callee')
49
-
50
- return (
51
- t.isMemberExpression(callee.node) &&
52
- callee.node.property.name === 'create' &&
53
- t.isIdentifier(callee.node.object)
54
- )
55
- }
56
-
57
- function addStyleSheetTag(t, path, state) {
58
- const callee = path.get('callee')
59
- const uniqueId = stringToUniqueId(state.filename.replace(state.cwd, '')) + ++state.file.tagNumber
60
-
61
- callee.container.arguments.push(t.numericLiteral(uniqueId))
62
- }
63
-
64
- const getProperty = (t, property) => {
65
- if (!property) {
66
- return undefined
67
- }
68
-
69
- if (t.isIdentifier(property)) {
70
- return {
71
- properties: [property.name]
72
- }
73
- }
74
-
75
- if (t.isObjectPattern(property)) {
76
- const matchingProperties = property.properties.flatMap(p => getProperty(t, p))
77
-
78
- return {
79
- properties: matchingProperties.flatMap(properties => properties.properties)
80
- }
81
- }
82
-
83
- if (t.isObjectProperty(property) && t.isIdentifier(property.value)) {
84
- return {
85
- properties: [property.key.name]
86
- }
87
- }
88
-
89
- if (t.isObjectProperty(property) && t.isObjectPattern(property.value)) {
90
- const matchingProperties = property.value.properties.flatMap(p => getProperty(t, p))
91
-
92
- return {
93
- parent: property.key.name,
94
- properties: matchingProperties.flatMap(properties => properties.properties)
95
- }
96
- }
97
-
98
- return undefined
99
- }
100
-
101
- function getStylesDependenciesFromObject(t, path) {
102
- const detectedStylesWithVariants = new Set()
103
- const stylesheet = path.node.arguments[0]
104
-
105
- stylesheet.properties.forEach(property => {
106
- if (!t.isIdentifier(property.key)) {
107
- return
108
- }
109
-
110
- if (t.isObjectProperty(property)) {
111
- if(t.isObjectExpression(property.value)) {
112
- property.value.properties.forEach(innerProp => {
113
- if (t.isIdentifier(innerProp.key) && innerProp.key.name === 'variants') {
114
- detectedStylesWithVariants.add({
115
- label: 'variants',
116
- key: property.key.name
117
- })
118
- }
119
- })
120
-
121
- }
122
- }
123
-
124
- if (t.isArrowFunctionExpression(property.value)) {
125
- if(t.isObjectExpression(property.value.body)) {
126
- property.value.body.properties.forEach(innerProp => {
127
- if (t.isIdentifier(innerProp.key) && innerProp.key.name === 'variants') {
128
- detectedStylesWithVariants.add({
129
- label: 'variants',
130
- key: property.key.name
131
- })
132
- }
133
- })
134
-
135
- }
136
- }
137
- })
138
-
139
- const variants = Array.from(detectedStylesWithVariants)
140
-
141
- return variants.reduce((acc, { key, label }) => {
142
- if (acc[key]) {
143
- return {
144
- ...acc,
145
- [key]: [
146
- ...acc[key],
147
- label
148
- ]
149
- }
150
- }
151
-
152
- return {
153
- ...acc,
154
- [key]: [label]
155
- }
156
- }, {})
157
- }
158
-
159
- function getStylesDependenciesFromFunction(t, path) {
160
- const funcPath = path.get('arguments.0')
161
-
162
- if (!funcPath) {
163
- return
164
- }
165
-
166
- const params = funcPath.node.params
167
- const [themeParam, rtParam] = params
168
-
169
- let themeNames = []
170
-
171
- // destructured theme object
172
- if (themeParam && themeParam.type === 'ObjectPattern') {
173
- // If destructured, collect all property names
174
- for (const prop of themeParam.properties) {
175
- themeNames.push(getProperty(t, prop))
176
- }
177
- }
178
-
179
- // user used 'theme' without destructuring
180
- if (themeParam && themeParam.type === 'Identifier') {
181
- themeNames.push({
182
- properties: [themeParam.name]
183
- })
184
- }
185
-
186
- let rtNames = []
187
-
188
- // destructured rt object
189
- if (rtParam && rtParam.type === 'ObjectPattern') {
190
- // If destructured, collect all property names
191
- for (const prop of rtParam.properties) {
192
- rtNames.push(getProperty(t, prop))
193
- }
194
- }
195
-
196
- // user used 'rt' without destructuring
197
- if (rtParam && rtParam.type === 'Identifier') {
198
- rtNames.push({
199
- properties: [rtParam.name]
200
- })
201
- }
202
-
203
- // get returned object or return statement from StyleSheet.create function
204
- let returnedObjectPath = null
205
-
206
- if (funcPath.get('body').isObjectExpression()) {
207
- returnedObjectPath = funcPath.get('body')
208
- } else {
209
- funcPath.traverse({
210
- ReturnStatement(retPath) {
211
- if (!returnedObjectPath && retPath.get('argument').isObjectExpression()) {
212
- returnedObjectPath = retPath.get('argument')
213
- }
214
- }
215
- })
216
- }
217
-
218
- if (!returnedObjectPath) {
219
- // there is no returned object
220
- // abort
221
-
222
- return
223
- }
224
-
225
- const detectedStylesWithVariants = new Set()
226
-
227
- // detect variants via Scope
228
- returnedObjectPath.get('properties').forEach(propPath => {
229
- // get style name
230
- const stylePath = propPath.get('key')
231
-
232
- if (!stylePath.isIdentifier()) {
233
- return
234
- }
235
-
236
- const styleKey = stylePath.node.name
237
-
238
- const valuePath = propPath.get('value')
239
-
240
- if (valuePath.isObjectExpression()) {
241
- const hasVariants = valuePath.get('properties').some(innerProp => {
242
- const innerKey = innerProp.get('key')
243
-
244
- return innerKey.isIdentifier() && innerKey.node.name === 'variants'
245
- })
246
-
247
- if (hasVariants) {
248
- detectedStylesWithVariants.add({
249
- label: 'variants',
250
- key: styleKey
251
- })
252
- }
253
- }
254
-
255
- if (valuePath.isArrowFunctionExpression()) {
256
- if(t.isObjectExpression(valuePath.node.body)) {
257
- const hasVariants = valuePath.node.body.properties.some(innerProp => {
258
-
259
- return t.isIdentifier(innerProp.key) && innerProp.key.name === 'variants'
260
- })
261
-
262
- if (hasVariants) {
263
- detectedStylesWithVariants.add({
264
- label: 'variants',
265
- key: styleKey
266
- })
267
- }
268
- }
269
- }
270
- })
271
-
272
- const detectedStylesWithTheme = new Set()
273
-
274
- // detect theme dependencies via Scope
275
- themeNames.forEach(({ properties }) => {
276
- properties.forEach(property => {
277
- const binding = funcPath.scope.getBinding(property)
278
-
279
- if (!binding) {
280
- return
281
- }
282
-
283
- binding.referencePaths.forEach(refPath => {
284
- // find key of the style that we are referring to
285
- const containerProp = refPath
286
- .findParent(parent => parent.isObjectProperty() && parent.parentPath === returnedObjectPath)
287
-
288
- if (!containerProp) {
289
- return
290
- }
291
-
292
- const keyNode = containerProp.get('key')
293
- const styleKey = keyNode.isIdentifier()
294
- ? keyNode.node.name
295
- : keyNode.isLiteral()
296
- ? keyNode.node.value
297
- : null
298
-
299
- if (styleKey) {
300
- detectedStylesWithTheme.add({
301
- label: 'theme',
302
- key: styleKey
303
- })
304
- }
305
- })
306
- })
307
- })
308
-
309
- const detectedStylesWithRt = new Set()
310
- const localRtName = t.isIdentifier(rtParam)
311
- ? rtParam.name
312
- : undefined
313
-
314
- // detect rt dependencies via Scope
315
- rtNames.forEach(({ properties, parent }) => {
316
- properties.forEach(property => {
317
- const rtBinding = funcPath.scope.getBinding(property)
318
-
319
- if (!rtBinding) {
320
- return
321
- }
322
-
323
- const isValidDependency = Boolean(toUnistylesDependency(property))
324
-
325
- let validRtName = property
326
-
327
- // user used nested destructing, find out parent key
328
- if (!isValidDependency && (!localRtName || (localRtName && localRtName !== property))) {
329
- if (!parent) {
330
- return
331
- }
332
-
333
- if (!Boolean(toUnistylesDependency(parent))) {
334
- return
335
- }
336
-
337
- validRtName = parent
338
- }
339
-
340
- rtBinding.referencePaths.forEach(refPath => {
341
- // to detect rt dependencies we need to get parameter not rt itself
342
- // eg. rt.screen.width -> screen
343
- // rt.insets.top -> insets
344
- // special case: rt.insets.ime -> ime
345
-
346
- let usedLabel = validRtName
347
-
348
- if (refPath.parentPath.isMemberExpression() && refPath.parentPath.get('object') === refPath) {
349
- const memberExpr = refPath.parentPath
350
- const propPath = memberExpr.get('property')
351
-
352
- if (propPath.isIdentifier()) {
353
- if (localRtName) {
354
- usedLabel = propPath.node.name
355
- }
356
-
357
- if (
358
- usedLabel === 'insets' &&
359
- memberExpr.parentPath.isMemberExpression() &&
360
- memberExpr.parentPath.get('object') === memberExpr
361
- ) {
362
- const secondPropPath = memberExpr.parentPath.get('property')
363
-
364
- if (secondPropPath.isIdentifier() && secondPropPath.node.name === 'ime') {
365
- usedLabel = 'ime'
366
- }
367
- }
368
- }
369
- }
370
-
371
- // find key of the style that we are referring to
372
- const containerProp = refPath
373
- .findParent(parent => parent.isObjectProperty() && parent.parentPath === returnedObjectPath)
374
-
375
- if (!containerProp) {
376
- return
377
- }
378
-
379
- const keyNode = containerProp.get('key')
380
- const styleKey = keyNode.isIdentifier()
381
- ? keyNode.node.name
382
- : keyNode.isLiteral()
383
- ? keyNode.node.value
384
- : null
385
-
386
- if (styleKey) {
387
- detectedStylesWithRt.add({
388
- label: usedLabel,
389
- key: styleKey
390
- })
391
- }
392
- })
393
- })
394
- })
395
-
396
- const variants = Array.from(detectedStylesWithVariants)
397
- const theme = Array.from(detectedStylesWithTheme)
398
- const rt = Array.from(detectedStylesWithRt)
399
-
400
- return theme
401
- .concat(rt)
402
- .concat(variants)
403
- .reduce((acc, { key, label }) => {
404
- if (acc[key]) {
405
- return {
406
- ...acc,
407
- [key]: [
408
- ...acc[key],
409
- label
410
- ]
411
- }
412
- }
413
-
414
- return {
415
- ...acc,
416
- [key]: [label]
417
- }
418
- }, {})
419
- }
420
-
421
- function toUnistylesDependency(dependency) {
422
- switch (dependency) {
423
- case 'theme': {
424
- return UnistyleDependency.Theme
425
- }
426
- case 'themeName': {
427
- return UnistyleDependency.ThemeName
428
- }
429
- case 'adaptiveThemes': {
430
- return UnistyleDependency.AdaptiveThemes
431
- }
432
- case 'breakpoint': {
433
- return UnistyleDependency.Breakpoints
434
- }
435
- case 'colorScheme': {
436
- return UnistyleDependency.ColorScheme
437
- }
438
- case 'screen': {
439
- return UnistyleDependency.Dimensions
440
- }
441
- case 'isPortrait':
442
- case 'isLandscape': {
443
- return UnistyleDependency.Orientation
444
- }
445
- case 'contentSizeCategory': {
446
- return UnistyleDependency.ContentSizeCategory
447
- }
448
- case 'ime': {
449
- return UnistyleDependency.Ime
450
- }
451
- case 'insets': {
452
- return UnistyleDependency.Insets
453
- }
454
- case 'pixelRatio': {
455
- return UnistyleDependency.PixelRatio
456
- }
457
- case 'fontScale': {
458
- return UnistyleDependency.FontScale
459
- }
460
- case 'statusBar': {
461
- return UnistyleDependency.StatusBar
462
- }
463
- case 'navigationBar': {
464
- return UnistyleDependency.NavigationBar
465
- }
466
- case 'variants': {
467
- return UnistyleDependency.Variants
468
- }
469
-
470
- // breakpoints are too complex and are handled by C++
471
- }
472
- }
473
-
474
- function getReturnStatementsFromBody(t, node, results = []) {
475
- if (t.isReturnStatement(node)) {
476
- results.push(node)
477
- }
478
-
479
- if (t.isBlockStatement(node)) {
480
- node.body.forEach(child => getReturnStatementsFromBody(t, child, results))
481
- }
482
-
483
- if (t.isIfStatement(node)) {
484
- getReturnStatementsFromBody(t, node.consequent, results)
485
-
486
- if (node.alternate) {
487
- getReturnStatementsFromBody(t, node.alternate, results)
488
- }
489
- }
490
-
491
- return results
492
- }
493
-
494
- function addDependencies(t, state, styleName, unistyle, detectedDependencies) {
495
- const debugMessage = deps => {
496
- if (state.opts.debug) {
497
- const mappedDeps = deps
498
- .map(dep => Object.keys(UnistyleDependency).find(key => UnistyleDependency[key] === dep))
499
- .join(', ')
500
-
501
- console.log(`${state.filename.replace(`${state.file.opts.root}/`, '')}: styles.${styleName}: [${mappedDeps}]`)
502
- }
503
- }
504
-
505
- const styleDependencies = detectedDependencies.map(toUnistylesDependency)
506
-
507
- // add metadata about dependencies
508
- if (styleDependencies.length > 0) {
509
- const uniqueDependencies = Array.from(new Set(styleDependencies))
510
-
511
- debugMessage(uniqueDependencies)
512
-
513
- let targets = []
514
-
515
- if (t.isArrowFunctionExpression(unistyle.value) || t.isFunctionExpression(unistyle.value)) {
516
- if (t.isObjectExpression(unistyle.value.body)) {
517
- targets.push(unistyle.value.body)
518
- }
519
-
520
- if (t.isBlockStatement(unistyle.value.body)) {
521
- targets = getReturnStatementsFromBody(t, unistyle.value.body)
522
- .map(node => {
523
- if (t.isIdentifier(node.argument)) {
524
- node.argument = t.objectExpression([
525
- t.spreadElement(node.argument)
526
- ])
527
- }
528
-
529
- return node.argument
530
- })
531
- }
532
- }
533
-
534
- if (t.isObjectExpression(unistyle.value)) {
535
- targets.push(unistyle.value)
536
- }
537
-
538
- if (t.isMemberExpression(unistyle.value)) {
539
- // convert to object
540
- unistyle.value = t.objectExpression([t.spreadElement(unistyle.value)])
541
-
542
- targets.push(unistyle.value)
543
- }
544
-
545
- if (targets.length > 0) {
546
- targets.forEach(target => {
547
- target.properties.push(
548
- t.objectProperty(
549
- t.identifier('uni__dependencies'),
550
- t.arrayExpression(uniqueDependencies.map(dep => t.numericLiteral(dep)))
551
- )
552
- )
553
- })
554
- }
555
- }
556
- }
557
-
558
- module.exports = {
559
- isUnistylesStyleSheet,
560
- addDependencies,
561
- addStyleSheetTag,
562
- getStylesDependenciesFromObject,
563
- getStylesDependenciesFromFunction,
564
- isKindOfStyleSheet
565
- }
@@ -1,66 +0,0 @@
1
- function extractVariants(t, path, state) {
2
- const maybeVariants = path.node.body.filter(node => (
3
- t.isExpressionStatement(node) &&
4
- t.isCallExpression(node.expression) &&
5
- t.isMemberExpression(node.expression.callee)
6
- ))
7
-
8
- if (maybeVariants.length === 0) {
9
- return
10
- }
11
-
12
- const targetVariant = maybeVariants.find(variant => {
13
- const calleeName = variant.expression.callee.object.name
14
-
15
- return (
16
- t.isIdentifier(variant.expression.callee.object, { name: calleeName }) &&
17
- t.isIdentifier(variant.expression.callee.property, { name: 'useVariants' }) &&
18
- variant.expression.arguments.length === 1
19
- )
20
- })
21
-
22
- if (!targetVariant) {
23
- return
24
- }
25
-
26
- const calleeName = targetVariant.expression.callee.object.name
27
- const node = targetVariant.expression
28
- const newUniqueName = path.scope.generateUidIdentifier(calleeName)
29
-
30
- // Create shadow declaration eg. const _styles = styles
31
- const shadowDeclaration = t.variableDeclaration('const', [
32
- t.variableDeclarator(newUniqueName, t.identifier(calleeName))
33
- ])
34
-
35
- // Create the new call expression eg. const styles = _styles.useVariants(...)
36
- const newCallExpression = t.callExpression(
37
- t.memberExpression(t.identifier(newUniqueName.name), t.identifier('useVariants')),
38
- node.arguments
39
- )
40
- const finalDeclaration = t.variableDeclaration('const', [
41
- t.variableDeclarator(t.identifier(calleeName), newCallExpression)
42
- ])
43
-
44
- // Find the current node's index, we will move everything after to new block
45
- const pathIndex = path.node.body
46
- .findIndex(bodyPath => bodyPath === targetVariant)
47
- const rest = path.node.body.slice(pathIndex + 1)
48
-
49
- // move rest to new block (scope)
50
- const blockStatement = t.blockStatement([
51
- finalDeclaration,
52
- ...rest
53
- ])
54
-
55
- path.node.body = [
56
- ...path.node.body.slice(0, pathIndex),
57
- shadowDeclaration,
58
- blockStatement
59
- ]
60
-
61
- state.file.hasVariants = true
62
- }
63
-
64
- module.exports = {
65
- extractVariants
66
- }