@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.
- package/LICENSE +21 -0
- package/README.md +57 -1
- package/dist/cjs/ast.cjs +108 -0
- package/dist/cjs/contracts.cjs +61 -0
- package/dist/cjs/diagnostics.cjs +68 -0
- package/dist/cjs/evaluate.cjs +602 -0
- package/dist/cjs/graph.cjs +335 -0
- package/dist/cjs/hash.cjs +48 -0
- package/dist/cjs/index.cjs +43 -0
- package/dist/cjs/ir.cjs +32 -0
- package/dist/cjs/lower.cjs +232 -0
- package/dist/cjs/materialize.cjs +222 -0
- package/dist/cjs/normalize.cjs +628 -0
- package/dist/cjs/output.cjs +148 -0
- package/dist/cjs/planCache.cjs +262 -0
- package/dist/cjs/session.cjs +127 -0
- package/dist/cjs/yuku.cjs +166 -0
- package/dist/cjs/zero.cjs +389 -0
- package/dist/esm/ast.mjs +79 -0
- package/dist/esm/ast.mjs.map +1 -0
- package/dist/esm/contracts.mjs +34 -0
- package/dist/esm/contracts.mjs.map +1 -0
- package/dist/esm/diagnostics.mjs +44 -0
- package/dist/esm/diagnostics.mjs.map +1 -0
- package/dist/esm/evaluate.mjs +576 -0
- package/dist/esm/evaluate.mjs.map +1 -0
- package/dist/esm/graph.mjs +313 -0
- package/dist/esm/graph.mjs.map +1 -0
- package/dist/esm/hash.mjs +26 -0
- package/dist/esm/hash.mjs.map +1 -0
- package/dist/esm/index.mjs +30 -0
- package/dist/esm/ir.mjs +12 -0
- package/dist/esm/ir.mjs.map +1 -0
- package/dist/esm/lower.mjs +210 -0
- package/dist/esm/lower.mjs.map +1 -0
- package/dist/esm/materialize.mjs +203 -0
- package/dist/esm/materialize.mjs.map +1 -0
- package/dist/esm/normalize.mjs +604 -0
- package/dist/esm/normalize.mjs.map +1 -0
- package/dist/esm/output.mjs +119 -0
- package/dist/esm/output.mjs.map +1 -0
- package/dist/esm/planCache.mjs +232 -0
- package/dist/esm/planCache.mjs.map +1 -0
- package/dist/esm/session.mjs +108 -0
- package/dist/esm/session.mjs.map +1 -0
- package/dist/esm/yuku.mjs +144 -0
- package/dist/esm/yuku.mjs.map +1 -0
- package/dist/esm/zero.mjs +354 -0
- package/dist/esm/zero.mjs.map +1 -0
- package/package.json +42 -4
- package/src/ast.ts +106 -0
- package/src/contracts.ts +150 -0
- package/src/diagnostics.ts +96 -0
- package/src/evaluate.ts +875 -0
- package/src/graph.ts +425 -0
- package/src/hash.ts +36 -0
- package/src/index.ts +15 -0
- package/src/ir.ts +156 -0
- package/src/lower.ts +435 -0
- package/src/materialize.ts +383 -0
- package/src/normalize.ts +834 -0
- package/src/output.ts +175 -0
- package/src/planCache.ts +362 -0
- package/src/session.ts +192 -0
- package/src/yuku.ts +197 -0
- package/src/zero.ts +609 -0
- package/types/ast.d.ts +11 -0
- package/types/ast.d.ts.map +1 -0
- package/types/contracts.d.ts +99 -0
- package/types/contracts.d.ts.map +1 -0
- package/types/diagnostics.d.ts +31 -0
- package/types/diagnostics.d.ts.map +1 -0
- package/types/evaluate.d.ts +48 -0
- package/types/evaluate.d.ts.map +1 -0
- package/types/graph.d.ts +51 -0
- package/types/graph.d.ts.map +1 -0
- package/types/hash.d.ts +8 -0
- package/types/hash.d.ts.map +1 -0
- package/types/index.d.ts +16 -0
- package/types/index.d.ts.map +1 -0
- package/types/ir.d.ts +120 -0
- package/types/ir.d.ts.map +1 -0
- package/types/lower.d.ts +99 -0
- package/types/lower.d.ts.map +1 -0
- package/types/materialize.d.ts +121 -0
- package/types/materialize.d.ts.map +1 -0
- package/types/normalize.d.ts +7 -0
- package/types/normalize.d.ts.map +1 -0
- package/types/output.d.ts +32 -0
- package/types/output.d.ts.map +1 -0
- package/types/planCache.d.ts +123 -0
- package/types/planCache.d.ts.map +1 -0
- package/types/session.d.ts +52 -0
- package/types/session.d.ts.map +1 -0
- package/types/yuku.d.ts +4 -0
- package/types/yuku.d.ts.map +1 -0
- package/types/zero.d.ts +99 -0
- 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
|
+
}
|