Skip to content

Commit 46f881b

Browse files
committed
Make integration testing AST plugins possible
1 parent b38ab12 commit 46f881b

File tree

8 files changed

+86
-16
lines changed

8 files changed

+86
-16
lines changed

packages/@glimmer/integration-tests/lib/compile.ts

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -21,9 +21,10 @@ export const DEFAULT_TEST_META: AnnotatedModuleLocator = Object.freeze({
2121
// out of the test environment.
2222
export function preprocess(
2323
template: string,
24-
meta?: AnnotatedModuleLocator
24+
meta?: AnnotatedModuleLocator,
25+
options?: PrecompileOptions
2526
): Template<AnnotatedModuleLocator> {
26-
let wrapper = JSON.parse(rawPrecompile(template));
27+
let wrapper = JSON.parse(rawPrecompile(template, options));
2728
let factory = templateFactory<AnnotatedModuleLocator>(wrapper);
2829
return factory.create(meta || DEFAULT_TEST_META);
2930
}

packages/@glimmer/integration-tests/lib/modes/aot/delegate.ts

Lines changed: 23 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
import { PrecompileOptions } from '@glimmer/compiler';
12
import {
23
BundleCompiler,
34
DebugConstants,
@@ -31,6 +32,7 @@ import {
3132
renderSync,
3233
AotRuntime,
3334
} from '@glimmer/runtime';
35+
import { ASTPluginBuilder } from '@glimmer/syntax';
3436
import { assert, assign, expect, Option } from '@glimmer/util';
3537
import {
3638
SimpleElement,
@@ -99,6 +101,7 @@ export class AotRenderDelegate implements RenderDelegate {
99101
static readonly isEager = true;
100102
static style = 'aot';
101103

104+
private plugins: ASTPluginBuilder[] = [];
102105
protected registry = new AotCompilerRegistry();
103106
protected compileTimeModules = new Modules();
104107
protected symbolTables = new ModuleLocatorMap<ProgramSymbolTable, ModuleLocator>();
@@ -134,6 +137,10 @@ export class AotRenderDelegate implements RenderDelegate {
134137
return this.doc.createDocumentFragment();
135138
}
136139

140+
registerPlugin(plugin: ASTPluginBuilder): void {
141+
this.plugins.push(plugin);
142+
}
143+
137144
registerComponent(
138145
type: ComponentKind,
139146
testType: ComponentKind,
@@ -182,7 +189,10 @@ export class AotRenderDelegate implements RenderDelegate {
182189
}
183190

184191
registerPartial(name: string, source: string) {
185-
let definition = new PartialDefinitionImpl(name, preprocess(source));
192+
let definition = new PartialDefinitionImpl(
193+
name,
194+
preprocess(source, undefined, this.precompileOptions)
195+
);
186196
this.registry.register(name, 'partial', { default: definition });
187197
}
188198

@@ -192,6 +202,14 @@ export class AotRenderDelegate implements RenderDelegate {
192202
this.registry.register(name, 'modifier', { default: { manager, state } });
193203
}
194204

205+
private get precompileOptions(): PrecompileOptions {
206+
return {
207+
plugins: {
208+
ast: this.plugins,
209+
},
210+
};
211+
}
212+
195213
private addRegisteredComponents(bundleCompiler: BundleCompiler): void {
196214
let { registry, compileTimeModules } = this;
197215
Object.keys(registry.components).forEach(key => {
@@ -256,7 +274,7 @@ export class AotRenderDelegate implements RenderDelegate {
256274
}
257275

258276
private getBundleCompiler(): BundleCompiler {
259-
let { compiler, constants } = getBundleCompiler(this.registry);
277+
let { compiler, constants } = getBundleCompiler(this.registry, this.plugins);
260278
this.constants = constants;
261279

262280
return compiler;
@@ -320,13 +338,15 @@ export class AotRenderDelegate implements RenderDelegate {
320338
}
321339

322340
function getBundleCompiler(
323-
registry: AotCompilerRegistry
341+
registry: AotCompilerRegistry,
342+
plugins?: ASTPluginBuilder[]
324343
): { compiler: BundleCompiler; constants: DebugConstants } {
325344
let delegate: AotCompilerDelegate = new AotCompilerDelegate(registry);
326345
let constants = new DebugConstants();
327346
let compiler = new BundleCompiler(delegate, {
328347
macros: new TestMacros(),
329348
constants,
349+
plugins,
330350
});
331351
return { constants, compiler };
332352
}

packages/@glimmer/integration-tests/lib/modes/jit/delegate.ts

Lines changed: 18 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
import { PrecompileOptions } from '@glimmer/compiler';
12
import {
23
JitRuntimeContext,
34
SyntaxCompilationContext,
@@ -36,6 +37,7 @@ import {
3637
registerTemplate,
3738
componentHelper,
3839
} from './register';
40+
import { ASTPluginBuilder } from '@glimmer/syntax';
3941
import { TestMacros } from '../../compile/macros';
4042
import JitCompileTimeLookup from './compilation-context';
4143
import TestJitRuntimeResolver from './resolver';
@@ -74,6 +76,7 @@ export class JitRenderDelegate implements RenderDelegate {
7476
static readonly isEager = false;
7577
static style = 'jit';
7678

79+
private plugins: ASTPluginBuilder[] = [];
7780
private resolver: TestJitRuntimeResolver = new TestJitRuntimeResolver();
7881
private registry: TestJitRegistry = this.resolver.registry;
7982
private context: JitTestDelegateContext;
@@ -119,6 +122,10 @@ export class JitRenderDelegate implements RenderDelegate {
119122
return componentHelper(this.resolver, this.registry, name);
120123
}
121124

125+
registerPlugin(plugin: ASTPluginBuilder): void {
126+
this.plugins.push(plugin);
127+
}
128+
122129
registerComponent<K extends 'Basic' | 'Fragment' | 'Glimmer', L extends ComponentKind>(
123130
type: K,
124131
_testType: L,
@@ -200,7 +207,7 @@ export class JitRenderDelegate implements RenderDelegate {
200207
}
201208

202209
compileTemplate(template: string): HandleResult {
203-
let compiled = preprocess(template);
210+
let compiled = preprocess(template, undefined, this.precompileOptions);
204211

205212
return unwrapTemplate(compiled)
206213
.asLayout()
@@ -214,9 +221,18 @@ export class JitRenderDelegate implements RenderDelegate {
214221
template,
215222
this.context,
216223
this.getSelf(context),
217-
this.getElementBuilder(this.context.runtime.env, cursor)
224+
this.getElementBuilder(this.context.runtime.env, cursor),
225+
this.precompileOptions
218226
);
219227
}
228+
229+
private get precompileOptions(): PrecompileOptions {
230+
return {
231+
plugins: {
232+
ast: this.plugins,
233+
},
234+
};
235+
}
220236
}
221237

222238
function isBrowserTestDocument(doc: SimpleDocument): doc is SimpleDocument & Document {

packages/@glimmer/integration-tests/lib/modes/jit/render.ts

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import { JitTestDelegateContext } from './delegate';
2+
import { PrecompileOptions } from '@glimmer/compiler';
23
import { VersionedPathReference } from '@glimmer/reference';
34
import { ElementBuilder, RenderResult } from '@glimmer/interfaces';
45
import { preprocess } from '../../compile';
@@ -9,9 +10,10 @@ export function renderTemplate(
910
src: string,
1011
{ runtime, syntax }: JitTestDelegateContext,
1112
self: VersionedPathReference,
12-
builder: ElementBuilder
13+
builder: ElementBuilder,
14+
options?: PrecompileOptions
1315
): RenderResult {
14-
let template = preprocess(src);
16+
let template = preprocess(src, undefined, options);
1517
let handle = unwrapTemplate(template)
1618
.asLayout()
1719
.compile(syntax);

packages/@glimmer/integration-tests/lib/modes/rehydration/delegate.ts

Lines changed: 25 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
import { PrecompileOptions } from '@glimmer/compiler';
12
import {
23
Cursor,
34
Dict,
@@ -8,6 +9,7 @@ import {
89
Helper,
910
} from '@glimmer/interfaces';
1011
import { serializeBuilder } from '@glimmer/node';
12+
import { ASTPluginBuilder } from '@glimmer/syntax';
1113
import createHTMLDocument from '@simple-dom/document';
1214
import {
1315
SimpleDocument,
@@ -44,6 +46,8 @@ export class RehydrationDelegate implements RenderDelegate {
4446
static readonly isEager = false;
4547
static readonly style = 'rehydration';
4648

49+
private plugins: ASTPluginBuilder[] = [];
50+
4751
public clientEnv: JitTestDelegateContext;
4852
public serverEnv: JitTestDelegateContext;
4953

@@ -113,7 +117,8 @@ export class RehydrationDelegate implements RenderDelegate {
113117
template,
114118
this.serverEnv,
115119
this.getSelf(context),
116-
this.getElementBuilder(this.serverEnv.runtime.env, cursor)
120+
this.getElementBuilder(this.serverEnv.runtime.env, cursor),
121+
this.precompileOptions
117122
);
118123

119124
takeSnapshot();
@@ -139,7 +144,13 @@ export class RehydrationDelegate implements RenderDelegate {
139144
// Client-side rehydration
140145
let cursor = { element, nextSibling: null };
141146
let builder = this.getElementBuilder(env, cursor) as DebugRehydrationBuilder;
142-
let result = renderTemplate(template, this.clientEnv, this.getSelf(context), builder);
147+
let result = renderTemplate(
148+
template,
149+
this.clientEnv,
150+
this.getSelf(context),
151+
builder,
152+
this.precompileOptions
153+
);
143154

144155
this.rehydrationStats = {
145156
clearedNodes: builder['clearedNodes'],
@@ -161,6 +172,10 @@ export class RehydrationDelegate implements RenderDelegate {
161172
return this.renderClientSide(template, context, element);
162173
}
163174

175+
registerPlugin(plugin: ASTPluginBuilder): void {
176+
this.plugins.push(plugin);
177+
}
178+
164179
registerComponent(type: ComponentKind, _testType: string, name: string, layout: string): void {
165180
registerComponent(this.clientRegistry, type, name, layout);
166181
registerComponent(this.serverRegistry, type, name, layout);
@@ -185,6 +200,14 @@ export class RehydrationDelegate implements RenderDelegate {
185200
registerModifier(this.clientRegistry, name, ModifierClass);
186201
registerModifier(this.serverRegistry, name, ModifierClass);
187202
}
203+
204+
private get precompileOptions(): PrecompileOptions {
205+
return {
206+
plugins: {
207+
ast: this.plugins,
208+
},
209+
};
210+
}
188211
}
189212

190213
export function qunitFixture(): SimpleElement {

packages/@glimmer/integration-tests/lib/render-delegate.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import {
66
SimpleDocumentFragment,
77
SimpleDocument,
88
} from '@simple-dom/interface';
9+
import { ASTPluginBuilder } from '@glimmer/syntax';
910
import { ComponentKind, ComponentTypes } from './components';
1011
import { UserHelper } from './helpers';
1112
import {
@@ -39,6 +40,7 @@ export default interface RenderDelegate {
3940
layout: string,
4041
Class?: ComponentTypes[K]
4142
): void;
43+
registerPlugin(plugin: ASTPluginBuilder): void;
4244
registerHelper(name: string, helper: UserHelper): void;
4345
registerInternalHelper(name: string, helper: Helper): void;
4446
registerPartial(name: string, content: string): void;

packages/@glimmer/integration-tests/lib/render-test.ts

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import { Dict, Maybe, Option, RenderResult, Helper } from '@glimmer/interfaces';
2+
import { ASTPluginBuilder } from '@glimmer/syntax';
23
import { bump, isConst } from '@glimmer/validator';
34
import { clearElement, dict, expect, assign } from '@glimmer/util';
45
import { SimpleElement, SimpleNode } from '@simple-dom/interface';
@@ -54,19 +55,23 @@ export class RenderTest implements IRenderTest {
5455
this.element = delegate.getInitialElement();
5556
}
5657

57-
registerHelper(name: string, helper: UserHelper) {
58+
registerPlugin(plugin: ASTPluginBuilder): void {
59+
this.delegate.registerPlugin(plugin);
60+
}
61+
62+
registerHelper(name: string, helper: UserHelper): void {
5863
this.delegate.registerHelper(name, helper);
5964
}
6065

61-
registerInternalHelper(name: string, helper: Helper) {
66+
registerInternalHelper(name: string, helper: Helper): void {
6267
this.delegate.registerInternalHelper(name, helper);
6368
}
6469

65-
registerModifier(name: string, ModifierClass: TestModifierConstructor) {
70+
registerModifier(name: string, ModifierClass: TestModifierConstructor): void {
6671
this.delegate.registerModifier(name, ModifierClass);
6772
}
6873

69-
registerPartial(name: string, content: string) {
74+
registerPartial(name: string, content: string): void {
7075
this.delegate.registerPartial(name, content);
7176
}
7277

@@ -75,7 +80,7 @@ export class RenderTest implements IRenderTest {
7580
name: string,
7681
layout: string,
7782
Class?: ComponentTypes[K]
78-
) {
83+
): void {
7984
this.delegate.registerComponent(type, this.testType, name, layout, Class);
8085
}
8186

packages/@glimmer/integration-tests/package.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
"dependencies": {
77
"@glimmer/reference": "^0.52.0",
88
"@glimmer/runtime": "^0.52.0",
9+
"@glimmer/syntax": "^0.52.0",
910
"@glimmer/validator": "^0.52.0",
1011
"@glimmer/compiler": "^0.52.0",
1112
"@glimmer/util": "^0.52.0",

0 commit comments

Comments
 (0)