Secure your code as it's written. Use Snyk Code to scan source code in minutes - no build needed - and fix issues immediately.
document?: SimpleDocument;
appendOperations?: GlimmerTreeConstruction;
updateOperations?: GlimmerTreeChanges;
program?: CompilableProgram;
}
export const DEFAULT_TEST_META: AnnotatedModuleLocator = Object.freeze({
kind: 'unknown',
meta: {},
module: 'some/template',
name: 'default',
});
export class TestCompilationContext implements WholeProgramCompilationContext, RuntimeProgram {
readonly runtimeResolver = new LazyRuntimeResolver();
readonly constants = new Constants(this.runtimeResolver);
readonly resolverDelegate = new LazyCompileTimeLookup(this.runtimeResolver);
readonly heap = new CompileTimeHeapImpl();
readonly mode = CompileMode.jit;
readonly stdlib: STDLib;
constructor() {
this.stdlib = compileStd(this);
this._opcode = new RuntimeOpImpl(this.heap);
}
// TODO: This sucks
private _opcode: RuntimeOpImpl;
opcode(offset: number): RuntimeOpImpl {
this._opcode.offset = offset;
return this.lookup('component', name, referrer);
}
lookupPartial(name: string, referrer?: TestSpecifier): Option {
return this.lookup('partial', name, referrer);
}
resolve(handle: number): T {
let registry = this.handleLookup[handle];
return registry.getByHandle(handle) as T;
}
}
export class TestEnvironment extends AbstractTestEnvironment {
public resolver = new TestResolver();
protected program = new Program(new LazyConstants(this.resolver));
public compileOptions: TemplateOptions = {
lookup: new LookupResolver(this.resolver),
program: this.program,
macros: new TestMacros(),
Builder: LazyOpcodeBuilder as OpcodeBuilderConstructor
};
constructor(options?: TestEnvironmentOptions) {
super(testOptions(options));
// recursive field, so "unsafely" set one half late (but before the resolver is actually used)
this.resolver['options'] = this.compileOptions;
this.registerHelper("if", ([cond, yes, no]) => cond ? yes : no);
this.registerHelper("unless", ([cond, yes, no]) => cond ? no : yes);
this.registerInternalHelper("-get-dynamic-var", getDynamicVar);
this.registerModifier("action", new InertModifierManager());
static _renderComponent(name: string, cursor: Cursor, compilable: number, data: {}): ElementNode {
let state = State(data);
const artifact = artifacts(Application.context);
const runtime = AotRuntime(Application.document as any, artifact, Application.resolver);
let iterator = renderAot(runtime, compilable, cursor, state);
// const treeBuilder = NewElementBuilder.forInitialRender(runtime.env, cursor);
// let iterator = renderAotMain(runtime, state, treeBuilder, compilable);
try {
const result = renderSync(runtime.env, iterator);
console.log(`Component ${name} Rendered`);
let node = result.firstNode() as any;
while (!node._nativeView) {
node = node.nextSibling;
}
node.meta.component = new NativeComponentResult(name, result, state, runtime);
return node as any;
} catch (error) {
console.log(`Error rendering component ${name}: ${error}`);
}
static _renderComponent(name, cursor, compilable, data) {
let state = State(data);
const artifact = artifacts(Application.context);
const runtime = AotRuntime(Application.document, artifact, Application.resolver);
let iterator = renderAot(runtime, compilable, cursor, state);
// const treeBuilder = NewElementBuilder.forInitialRender(runtime.env, cursor);
// let iterator = renderAotMain(runtime, state, treeBuilder, compilable);
try {
const result = renderSync(runtime.env, iterator);
console.log(`Component ${name} Rendered`);
let node = result.firstNode();
while (node && !node._nativeElement) {
node = node.nextSibling;
}
const component = new NativeComponentResult(name, result, state, runtime);
if (!Application.currentPageNode.listViewItems) {
Application.currentPageNode.listViewItems = [];
}
Application.currentPageNode.listViewItems.push({ component, cursor });
static _renderPage(name, containerElement, nextSibling, compilable, data = {}) {
let state = State(data);
const artifact = artifacts(Application.context);
Application.aotRuntime = AotRuntime(Application.document, artifact, Application.resolver);
const cursor = { element: containerElement ? containerElement : Application.rootFrame, nextSibling };
let iterator = renderAot(Application.aotRuntime, compilable, cursor, state);
try {
const result = renderSync(Application.aotRuntime.env, iterator);
console.log(`Page ${name} Rendered`);
Application.result = result;
Application._rendered = true;
let node = result.firstNode();
while (node && !node._nativeElement) {
node = node.nextSibling;
}
// (node as PageElement).parentNode = containerElement;
Application.currentPageNode = node;
Application.currentPageNode.listViewItems = [];
// containerElement.childNodes.push(node);
(vm, { op1: primitive }) => {
let stack = vm.stack;
let flag = primitive & 7; // 111
let value = primitive >> 3;
switch (flag) {
case PrimitiveType.NUMBER:
stack.push(value);
break;
case PrimitiveType.FLOAT:
stack.push(vm[CONSTANTS].getNumber(value));
break;
case PrimitiveType.STRING:
stack.push(vm[CONSTANTS].getString(value));
break;
case PrimitiveType.BOOLEAN_OR_VOID:
stack.pushEncodedImmediate(primitive);
break;
case PrimitiveType.NEGATIVE:
stack.push(vm[CONSTANTS].getNumber(value));
break;
case PrimitiveType.BIG_NUM:
stack.push(vm[CONSTANTS].getNumber(value));
APPEND_OPCODES.add(Op.Primitive, (vm, { op1: primitive }) => {
let stack = vm.stack;
let flag = primitive & 7; // 111
let value = primitive >> 3;
switch (flag) {
case PrimitiveType.NUMBER:
stack.push(value);
break;
case PrimitiveType.FLOAT:
stack.push(vm.constants.getFloat(value));
break;
case PrimitiveType.STRING:
stack.push(vm.constants.getString(value));
break;
case PrimitiveType.BOOLEAN_OR_VOID:
switch (value) {
case 0: stack.push(false); break;
case 1: stack.push(true); break;
case 2: stack.push(null); break;
case 3: stack.push(undefined); break;
}
break;
APPEND_OPCODES.add(Op.Primitive, (vm, { op1: primitive }) => {
let stack = vm.stack;
let flag = primitive & 7; // 111
let value = primitive >> 3;
switch (flag) {
case PrimitiveType.NUMBER:
stack.push(value);
break;
case PrimitiveType.FLOAT:
stack.push(vm.constants.getFloat(value));
break;
case PrimitiveType.STRING:
stack.push(vm.constants.getString(value));
break;
case PrimitiveType.BOOLEAN_OR_VOID:
switch (value) {
case 0: stack.push(false); break;
case 1: stack.push(true); break;
case 2: stack.push(null); break;
case 3: stack.push(undefined); break;
}
break;
}
});
(vm, { op1: primitive }) => {
let stack = vm.stack;
let flag = primitive & 7; // 111
let value = primitive >> 3;
switch (flag) {
case PrimitiveType.NUMBER:
stack.push(value);
break;
case PrimitiveType.FLOAT:
stack.push(vm[CONSTANTS].getNumber(value));
break;
case PrimitiveType.STRING:
stack.push(vm[CONSTANTS].getString(value));
break;
case PrimitiveType.BOOLEAN_OR_VOID:
stack.pushEncodedImmediate(primitive);
break;
case PrimitiveType.NEGATIVE:
stack.push(vm[CONSTANTS].getNumber(value));
break;
case PrimitiveType.BIG_NUM:
stack.push(vm[CONSTANTS].getNumber(value));
break;
}
},
OpcodeKind.Mut
APPEND_OPCODES.add(Op.Primitive, (vm, { op1: primitive }) => {
let stack = vm.stack;
let flag = primitive & 7; // 111
let value = primitive >> 3;
switch (flag) {
case PrimitiveType.NUMBER:
stack.push(value);
break;
case PrimitiveType.FLOAT:
stack.push(vm.constants.getFloat(value));
break;
case PrimitiveType.STRING:
stack.push(vm.constants.getString(value));
break;
case PrimitiveType.BOOLEAN_OR_VOID:
switch (value) {
case 0: stack.push(false); break;
case 1: stack.push(true); break;
case 2: stack.push(null); break;
case 3: stack.push(undefined); break;
}
break;
}
});