@tamagui/compiler-core 0.0.0-bootstrap.0 → 3.0.0-beta.1093.1

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 (98) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +57 -1
  3. package/dist/cjs/ast.cjs +108 -0
  4. package/dist/cjs/contracts.cjs +61 -0
  5. package/dist/cjs/diagnostics.cjs +68 -0
  6. package/dist/cjs/evaluate.cjs +602 -0
  7. package/dist/cjs/graph.cjs +335 -0
  8. package/dist/cjs/hash.cjs +48 -0
  9. package/dist/cjs/index.cjs +43 -0
  10. package/dist/cjs/ir.cjs +32 -0
  11. package/dist/cjs/lower.cjs +232 -0
  12. package/dist/cjs/materialize.cjs +222 -0
  13. package/dist/cjs/normalize.cjs +628 -0
  14. package/dist/cjs/output.cjs +148 -0
  15. package/dist/cjs/planCache.cjs +262 -0
  16. package/dist/cjs/session.cjs +127 -0
  17. package/dist/cjs/yuku.cjs +166 -0
  18. package/dist/cjs/zero.cjs +389 -0
  19. package/dist/esm/ast.mjs +79 -0
  20. package/dist/esm/ast.mjs.map +1 -0
  21. package/dist/esm/contracts.mjs +34 -0
  22. package/dist/esm/contracts.mjs.map +1 -0
  23. package/dist/esm/diagnostics.mjs +44 -0
  24. package/dist/esm/diagnostics.mjs.map +1 -0
  25. package/dist/esm/evaluate.mjs +576 -0
  26. package/dist/esm/evaluate.mjs.map +1 -0
  27. package/dist/esm/graph.mjs +313 -0
  28. package/dist/esm/graph.mjs.map +1 -0
  29. package/dist/esm/hash.mjs +26 -0
  30. package/dist/esm/hash.mjs.map +1 -0
  31. package/dist/esm/index.mjs +30 -0
  32. package/dist/esm/ir.mjs +12 -0
  33. package/dist/esm/ir.mjs.map +1 -0
  34. package/dist/esm/lower.mjs +210 -0
  35. package/dist/esm/lower.mjs.map +1 -0
  36. package/dist/esm/materialize.mjs +203 -0
  37. package/dist/esm/materialize.mjs.map +1 -0
  38. package/dist/esm/normalize.mjs +604 -0
  39. package/dist/esm/normalize.mjs.map +1 -0
  40. package/dist/esm/output.mjs +119 -0
  41. package/dist/esm/output.mjs.map +1 -0
  42. package/dist/esm/planCache.mjs +232 -0
  43. package/dist/esm/planCache.mjs.map +1 -0
  44. package/dist/esm/session.mjs +108 -0
  45. package/dist/esm/session.mjs.map +1 -0
  46. package/dist/esm/yuku.mjs +144 -0
  47. package/dist/esm/yuku.mjs.map +1 -0
  48. package/dist/esm/zero.mjs +354 -0
  49. package/dist/esm/zero.mjs.map +1 -0
  50. package/package.json +42 -4
  51. package/src/ast.ts +106 -0
  52. package/src/contracts.ts +150 -0
  53. package/src/diagnostics.ts +96 -0
  54. package/src/evaluate.ts +875 -0
  55. package/src/graph.ts +425 -0
  56. package/src/hash.ts +36 -0
  57. package/src/index.ts +15 -0
  58. package/src/ir.ts +156 -0
  59. package/src/lower.ts +435 -0
  60. package/src/materialize.ts +383 -0
  61. package/src/normalize.ts +834 -0
  62. package/src/output.ts +175 -0
  63. package/src/planCache.ts +362 -0
  64. package/src/session.ts +192 -0
  65. package/src/yuku.ts +197 -0
  66. package/src/zero.ts +609 -0
  67. package/types/ast.d.ts +11 -0
  68. package/types/ast.d.ts.map +1 -0
  69. package/types/contracts.d.ts +99 -0
  70. package/types/contracts.d.ts.map +1 -0
  71. package/types/diagnostics.d.ts +31 -0
  72. package/types/diagnostics.d.ts.map +1 -0
  73. package/types/evaluate.d.ts +48 -0
  74. package/types/evaluate.d.ts.map +1 -0
  75. package/types/graph.d.ts +51 -0
  76. package/types/graph.d.ts.map +1 -0
  77. package/types/hash.d.ts +8 -0
  78. package/types/hash.d.ts.map +1 -0
  79. package/types/index.d.ts +16 -0
  80. package/types/index.d.ts.map +1 -0
  81. package/types/ir.d.ts +120 -0
  82. package/types/ir.d.ts.map +1 -0
  83. package/types/lower.d.ts +99 -0
  84. package/types/lower.d.ts.map +1 -0
  85. package/types/materialize.d.ts +121 -0
  86. package/types/materialize.d.ts.map +1 -0
  87. package/types/normalize.d.ts +7 -0
  88. package/types/normalize.d.ts.map +1 -0
  89. package/types/output.d.ts +32 -0
  90. package/types/output.d.ts.map +1 -0
  91. package/types/planCache.d.ts +123 -0
  92. package/types/planCache.d.ts.map +1 -0
  93. package/types/session.d.ts +52 -0
  94. package/types/session.d.ts.map +1 -0
  95. package/types/yuku.d.ts +4 -0
  96. package/types/yuku.d.ts.map +1 -0
  97. package/types/zero.d.ts +99 -0
  98. package/types/zero.d.ts.map +1 -0
@@ -0,0 +1,383 @@
1
+ import type { ExpressionReference, ResolvedModuleId, SourceSpan } from './contracts'
2
+ import type { BailoutReason } from './diagnostics'
3
+ import type { BranchDecisionNode, StaticEvaluationValue } from './evaluate'
4
+ import { collectBranchDependencies } from './evaluate'
5
+ import type { ProjectGraph } from './graph'
6
+ import type {
7
+ ComponentImportProvenance,
8
+ ElementComponentIR,
9
+ ElementEntryIR,
10
+ ElementIR,
11
+ StyledDefinitionIR,
12
+ DOMStyleDefinitionIR,
13
+ } from './ir'
14
+
15
+ export type MaterializedValue =
16
+ | {
17
+ kind: 'static'
18
+ value: StaticEvaluationValue
19
+ dependencies: ResolvedModuleId[]
20
+ span: SourceSpan
21
+ /**
22
+ * Present only when normalization received syntax-level literal input:
23
+ * a string, number, boolean, or null AST literal, or JSXText. Template
24
+ * literals, constant-folded expressions, and values reached through a
25
+ * binding are evaluated static values but do not have literal origin.
26
+ */
27
+ literalOrigin?: true
28
+ }
29
+ | {
30
+ kind: 'bailout'
31
+ bailout: BailoutReason
32
+ span: SourceSpan
33
+ dynamic: ReturnType<ProjectGraph['evaluateDynamic']>
34
+ }
35
+ | {
36
+ /**
37
+ * A conditional whose branches evaluated statically while the test did
38
+ * not: `cond ? 'body' : 'heading'`. Lowerings that cannot use it treat
39
+ * it exactly like a bailout (the bailout it would otherwise have been
40
+ * is preserved for that purpose).
41
+ */
42
+ kind: 'conditional'
43
+ tree: BranchDecisionNode
44
+ dependencies: ResolvedModuleId[]
45
+ bailout: BailoutReason
46
+ span: SourceSpan
47
+ }
48
+ | {
49
+ kind: 'dom-style'
50
+ span: SourceSpan
51
+ items: {
52
+ condition: SourceSpan | null
53
+ value: Exclude<MaterializedValue, { kind: 'dom-style' }>
54
+ }[]
55
+ }
56
+ | {
57
+ /**
58
+ * A `style` object literal that did not evaluate as a whole:
59
+ * `style={{ width: expr, height: 10 }}`. Each member carries its own
60
+ * value, so a lowering keeps the static members as one style object and
61
+ * treats each dynamic member like the direct prop of its name.
62
+ */
63
+ kind: 'object'
64
+ span: SourceSpan
65
+ members: {
66
+ name: string
67
+ span: SourceSpan
68
+ value: Exclude<MaterializedValue, { kind: 'dom-style' | 'object' }>
69
+ }[]
70
+ bailout: BailoutReason
71
+ }
72
+
73
+ export type MaterializedElementEntry =
74
+ | {
75
+ kind: 'prop'
76
+ name: string
77
+ span: SourceSpan
78
+ value: MaterializedValue
79
+ }
80
+ | {
81
+ kind: 'spread'
82
+ span: SourceSpan
83
+ value: MaterializedValue
84
+ }
85
+ | {
86
+ kind: 'child'
87
+ span: SourceSpan
88
+ value:
89
+ | MaterializedValue
90
+ | { kind: 'element'; span: SourceSpan }
91
+ | { kind: 'empty'; span: SourceSpan }
92
+ }
93
+
94
+ export interface MaterializedElement {
95
+ kind: 'element'
96
+ form: ElementIR['form']
97
+ id: ResolvedModuleId
98
+ span: SourceSpan
99
+ propsSpan: SourceSpan | null
100
+ component: ElementComponentIR
101
+ complete: boolean
102
+ entries: MaterializedElementEntry[]
103
+ bailouts: BailoutReason[]
104
+ }
105
+
106
+ export interface MaterializedStyledDefinition {
107
+ kind: 'styled-definition'
108
+ id: ResolvedModuleId
109
+ name: string
110
+ span: SourceSpan
111
+ definitionSpan: SourceSpan
112
+ factory: ComponentImportProvenance
113
+ base: ElementComponentIR
114
+ baseClassName: MaterializedValue | null
115
+ options: MaterializedValue
116
+ staticConfig: MaterializedValue | null
117
+ complete: boolean
118
+ bailouts: BailoutReason[]
119
+ }
120
+
121
+ export interface MaterializedDOMStyleDefinition extends Omit<
122
+ DOMStyleDefinitionIR,
123
+ 'value'
124
+ > {
125
+ value: MaterializedValue
126
+ }
127
+
128
+ export interface MaterializedModule {
129
+ version: 1
130
+ id: ResolvedModuleId
131
+ inputHash: string
132
+ elements: MaterializedElement[]
133
+ styledDefinitions: MaterializedStyledDefinition[]
134
+ domStyleDefinitions: MaterializedDOMStyleDefinition[]
135
+ diagnostics: BailoutReason[]
136
+ dependencies: ResolvedModuleId[]
137
+ }
138
+
139
+ function compareCodeUnits(left: string, right: string): number {
140
+ return left < right ? -1 : left > right ? 1 : 0
141
+ }
142
+
143
+ function materializeValue(
144
+ graph: ProjectGraph,
145
+ value: Extract<ElementEntryIR, { kind: 'prop' }>['value']
146
+ ): MaterializedValue {
147
+ if (value.kind === 'static') {
148
+ return {
149
+ kind: 'static',
150
+ value: value.value,
151
+ dependencies: [],
152
+ span: value.span,
153
+ literalOrigin: true,
154
+ }
155
+ }
156
+ if (value.kind === 'dom-style') {
157
+ return {
158
+ kind: 'dom-style',
159
+ span: value.span,
160
+ items: value.items.map((item) => ({
161
+ condition: item.condition,
162
+ value: materializeValue(graph, item.value) as Exclude<
163
+ MaterializedValue,
164
+ { kind: 'dom-style' }
165
+ >,
166
+ })),
167
+ }
168
+ }
169
+ const result = graph.evaluate(value)
170
+ if (result.ok) {
171
+ return {
172
+ kind: 'static',
173
+ value: result.value,
174
+ dependencies: result.dependencies,
175
+ span: value,
176
+ }
177
+ }
178
+ const tree = graph.evaluateBranches(value)
179
+ if (tree) {
180
+ return {
181
+ kind: 'conditional',
182
+ tree,
183
+ dependencies: collectBranchDependencies(tree).sort(compareCodeUnits),
184
+ bailout: result.bailout,
185
+ span: value,
186
+ }
187
+ }
188
+ return {
189
+ kind: 'bailout',
190
+ bailout: result.bailout,
191
+ span: value,
192
+ dynamic: graph.evaluateDynamic(value),
193
+ }
194
+ }
195
+
196
+ function materializeStyleObject(
197
+ graph: ProjectGraph,
198
+ reference: ExpressionReference,
199
+ bailout: BailoutReason
200
+ ): MaterializedValue | null {
201
+ const members = graph.objectMembers(reference)
202
+ if (!members) return null
203
+ return {
204
+ kind: 'object',
205
+ span: reference,
206
+ members: members.map((member) => ({
207
+ name: member.name,
208
+ span: member.span,
209
+ value: materializeValue(graph, member.value) as Exclude<
210
+ MaterializedValue,
211
+ { kind: 'dom-style' | 'object' }
212
+ >,
213
+ })),
214
+ bailout,
215
+ }
216
+ }
217
+
218
+ function materializeEntry(
219
+ graph: ProjectGraph,
220
+ entry: ElementEntryIR
221
+ ): MaterializedElementEntry {
222
+ if (entry.kind === 'prop') {
223
+ const value = materializeValue(graph, entry.value)
224
+ return {
225
+ kind: entry.kind,
226
+ name: entry.name,
227
+ span: entry.span,
228
+ value:
229
+ entry.name === 'style' &&
230
+ value.kind === 'bailout' &&
231
+ entry.value.kind === 'expression'
232
+ ? (materializeStyleObject(graph, entry.value, value.bailout) ?? value)
233
+ : value,
234
+ }
235
+ }
236
+ if (entry.kind === 'spread') {
237
+ return {
238
+ kind: entry.kind,
239
+ span: entry.span,
240
+ value: materializeValue(graph, entry.value),
241
+ }
242
+ }
243
+ if (entry.value.kind === 'element' || entry.value.kind === 'empty') {
244
+ return { kind: entry.kind, span: entry.span, value: entry.value }
245
+ }
246
+ return {
247
+ kind: entry.kind,
248
+ span: entry.span,
249
+ value: materializeValue(graph, entry.value),
250
+ }
251
+ }
252
+
253
+ function materializeElement(
254
+ graph: ProjectGraph,
255
+ element: ElementIR
256
+ ): MaterializedElement {
257
+ const entries = element.complete ? element.entries : element.bailedEntries
258
+ return {
259
+ kind: element.kind,
260
+ form: element.form,
261
+ id: element.id,
262
+ span: element.span,
263
+ propsSpan: element.propsSpan,
264
+ component: element.component,
265
+ complete: element.complete,
266
+ entries: entries.map((entry) => materializeEntry(graph, entry)),
267
+ bailouts: [...element.bailouts],
268
+ }
269
+ }
270
+
271
+ function materializeStyledDefinition(
272
+ graph: ProjectGraph,
273
+ definition: StyledDefinitionIR
274
+ ): MaterializedStyledDefinition {
275
+ return {
276
+ kind: definition.kind,
277
+ id: definition.id,
278
+ name: definition.name,
279
+ span: definition.span,
280
+ definitionSpan: definition.definitionSpan,
281
+ factory: definition.factory,
282
+ base: definition.base,
283
+ baseClassName: definition.baseClassName
284
+ ? materializeValue(graph, definition.baseClassName)
285
+ : null,
286
+ options: materializeValue(graph, definition.options),
287
+ staticConfig: definition.staticConfig
288
+ ? materializeValue(graph, definition.staticConfig)
289
+ : null,
290
+ complete: definition.complete,
291
+ bailouts: [...definition.bailouts],
292
+ }
293
+ }
294
+
295
+ function collectDependencies(module: Omit<MaterializedModule, 'dependencies'>) {
296
+ const dependencies = new Set<ResolvedModuleId>()
297
+ const collect = (value: MaterializedValue) => {
298
+ if (value.kind === 'static' || value.kind === 'conditional') {
299
+ for (const dependency of value.dependencies) dependencies.add(dependency)
300
+ } else if (value.kind === 'dom-style') {
301
+ for (const item of value.items) collect(item.value)
302
+ } else if (value.kind === 'object') {
303
+ for (const member of value.members) collect(member.value)
304
+ if (value.bailout.dependencyId) dependencies.add(value.bailout.dependencyId)
305
+ } else {
306
+ for (const dependency of value.dynamic?.dependencies ?? []) {
307
+ dependencies.add(dependency)
308
+ }
309
+ if (value.bailout.dependencyId) dependencies.add(value.bailout.dependencyId)
310
+ }
311
+ }
312
+ for (const element of module.elements) {
313
+ if (element.component.provenance) {
314
+ dependencies.add(element.component.provenance.resolvedId)
315
+ }
316
+ if (element.component.definition) dependencies.add(element.component.definition.id)
317
+ for (const entry of element.entries) {
318
+ if (
319
+ 'value' in entry &&
320
+ entry.value.kind !== 'element' &&
321
+ entry.value.kind !== 'empty'
322
+ ) {
323
+ collect(entry.value)
324
+ }
325
+ }
326
+ }
327
+ for (const definition of module.styledDefinitions) {
328
+ dependencies.add(definition.factory.resolvedId)
329
+ if (definition.base.provenance)
330
+ dependencies.add(definition.base.provenance.resolvedId)
331
+ if (definition.base.definition) dependencies.add(definition.base.definition.id)
332
+ if (definition.baseClassName) collect(definition.baseClassName)
333
+ collect(definition.options)
334
+ if (definition.staticConfig) collect(definition.staticConfig)
335
+ }
336
+ for (const definition of module.domStyleDefinitions) {
337
+ dependencies.add(definition.factory.resolvedId)
338
+ collect(definition.value)
339
+ }
340
+ return [...dependencies].sort(compareCodeUnits)
341
+ }
342
+
343
+ export function materializeModule(
344
+ graph: ProjectGraph,
345
+ id: ResolvedModuleId
346
+ ): MaterializedModule {
347
+ const inputHash = graph.contentHash(id)
348
+ if (!inputHash) throw new Error(`Cannot materialize unknown host module ${id}`)
349
+ const result = graph.elementsOf(id)
350
+ const definitions = [...result.styledDefinitions]
351
+ const definitionKeys = new Set(
352
+ definitions.map((definition) => `${definition.id}\0${definition.name}`)
353
+ )
354
+ for (const element of result.elements) {
355
+ const linked = element.component.definition
356
+ if (!linked || linked.id === id) continue
357
+ const definition = graph
358
+ .elementsOf(linked.id)
359
+ .styledDefinitions.find(
360
+ (candidate) => candidate.id === linked.id && candidate.name === linked.name
361
+ )
362
+ const key = definition && `${definition.id}\0${definition.name}`
363
+ if (definition && key && !definitionKeys.has(key)) {
364
+ definitionKeys.add(key)
365
+ definitions.push(definition)
366
+ }
367
+ }
368
+ const base = {
369
+ version: 1 as const,
370
+ id,
371
+ inputHash,
372
+ elements: result.elements.map((element) => materializeElement(graph, element)),
373
+ styledDefinitions: definitions.map((definition) =>
374
+ materializeStyledDefinition(graph, definition)
375
+ ),
376
+ domStyleDefinitions: result.domStyleDefinitions.map((definition) => ({
377
+ ...definition,
378
+ value: materializeValue(graph, definition.value),
379
+ })),
380
+ diagnostics: graph.diagnostics().filter(({ span }) => span.id === id),
381
+ }
382
+ return { ...base, dependencies: collectDependencies(base) }
383
+ }