Skip to content

Commit 361b214

Browse files
Merge pull request #1649 from glimmerjs/feature/error-recovery-redux-pt3
Continue on with error-recovery infra refresh
2 parents 33ed91b + 35817f7 commit 361b214

File tree

112 files changed

+3851
-2305
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

112 files changed

+3851
-2305
lines changed

.prettierignore

+1-2
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,12 @@
1-
21
node_modules/
32

43
# output directories
54
dist/
65
ts-dist/
76

8-
97
# We don't need prettier here
108
*.md
9+
!packages/**/*.md
1110
*.yaml
1211
*.yml
1312
guides/

.vscode/settings.json

+7-3
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,10 @@
3131
"eslint.validate": ["javascript", "typescript", "json", "jsonc"],
3232
"files.exclude": {
3333
"**/.DS_Store": true,
34-
"**/.git": true
34+
"**/.git": true,
35+
"**/node_modules": true,
36+
"**/dist": true,
37+
"tracerbench-results": true
3538
},
3639
"files.insertFinalNewline": true,
3740
"files.trimTrailingWhitespace": true,
@@ -46,7 +49,7 @@
4649
"typescript.preferences.importModuleSpecifierEnding": "auto",
4750
"typescript.preferences.useAliasesForRenames": false,
4851
"typescript.tsdk": "node_modules/typescript/lib",
49-
"typescript.tsserver.experimental.enableProjectDiagnostics": false,
52+
"typescript.tsserver.experimental.enableProjectDiagnostics": true,
5053
"typescript.workspaceSymbols.scope": "currentProject",
5154
"typescript.experimental.updateImportsOnPaste": true,
5255
"eslint.problems.shortenToSingleLine": true,
@@ -226,5 +229,6 @@
226229
"rewrap.onSave": false,
227230
"rewrap.autoWrap.enabled": true,
228231
"rewrap.reformat": true,
229-
"rewrap.wholeComment": false
232+
"rewrap.wholeComment": false,
233+
"explorer.excludeGitIgnore": true
230234
}

benchmark/benchmarks/krausest/tsconfig.json

-2
Original file line numberDiff line numberDiff line change
@@ -5,13 +5,11 @@
55
"baseUrl": ".",
66
"allowJs": true,
77
"checkJs": true,
8-
98
"target": "es2020",
109
"module": "esnext",
1110
"moduleResolution": "bundler",
1211
"verbatimModuleSyntax": true,
1312
"noErrorTruncation": true,
14-
1513
"suppressImplicitAnyIndexErrors": false,
1614
"useDefineForClassFields": false,
1715
"exactOptionalPropertyTypes": true,

bin/setup-bench.mjs

+44-35
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,8 @@ import { readFile, writeFile } from 'node:fs/promises';
66
const ROOT = new URL('..', import.meta.url).pathname;
77
$.verbose = true;
88

9-
const REUSE_CONTROL = !!process.env['REUSE_CONTROL'];
9+
const REUSE_CONTROL = !!(process.env['REUSE_DIRS'] || process.env['REUSE_CONTROL']);
10+
const REUSE_EXPERIMENT = !!(process.env['REUSE_DIRS'] || process.env['REUSE_EXPERIMENT']);
1011

1112
/*
1213
@@ -81,8 +82,10 @@ if (!REUSE_CONTROL) {
8182
await $`mkdir ${CONTROL_DIR}`;
8283
}
8384

84-
await $`rm -rf ${EXPERIMENT_DIR}`;
85-
await $`mkdir ${EXPERIMENT_DIR}`;
85+
if (!REUSE_EXPERIMENT) {
86+
await $`rm -rf ${EXPERIMENT_DIR}`;
87+
await $`mkdir ${EXPERIMENT_DIR}`;
88+
}
8689

8790
// Intentionally use the same folder for both experiment and control to make it easier to
8891
// make changes to the benchmark suite itself and compare the results.
@@ -138,16 +141,10 @@ console.info({
138141
});
139142

140143
// setup experiment
141-
await within(async () => {
142-
await buildRepo(EXPERIMENT_DIR, experimentRef);
143-
});
144+
await buildRepo(EXPERIMENT_DIR, experimentRef, REUSE_EXPERIMENT);
144145

145-
if (!REUSE_CONTROL) {
146-
// setup control
147-
await within(async () => {
148-
await buildRepo(CONTROL_DIR, controlRef);
149-
});
150-
}
146+
// setup control
147+
await buildRepo(CONTROL_DIR, controlRef, REUSE_CONTROL);
151148

152149
// start build assets
153150
$`cd ${CONTROL_BENCH_DIR} && pnpm vite preview --port ${CONTROL_PORT}`;
@@ -177,36 +174,48 @@ process.exit(0);
177174
/**
178175
* @param {string} directory the directory to clone into
179176
* @param {string} ref the ref to checkout
177+
* @param {boolean} reuse reuse the existing directory
180178
*/
181-
async function buildRepo(directory, ref) {
182-
// the benchmark directory is located in `packages/@glimmer/benchmark` in each of the
183-
// experiment and control checkouts
184-
const benchDir = join(directory, 'benchmark', 'benchmarks', 'krausest');
179+
async function buildRepo(directory, ref, reuse) {
180+
if (!reuse) {
181+
await $`rm -rf ${directory}`;
182+
await $`mkdir ${directory}`;
183+
}
185184

186-
await cd(directory);
185+
await within(async () => {
186+
// the benchmark directory is located in `packages/@glimmer/benchmark` in each of the
187+
// experiment and control checkouts
188+
const benchDir = join(directory, 'benchmark', 'benchmarks', 'krausest');
187189

188-
// write the `pwd` to the output to make it easier to debug if something goes wrong
189-
await $`pwd`;
190+
await cd(directory);
190191

191-
// clone the raw git repo for the experiment
192-
await $`git clone ${join(ROOT, '.git')} .`;
192+
// write the `pwd` to the output to make it easier to debug if something goes wrong
193+
await $`pwd`;
193194

194-
// checkout the repo to the HEAD of the current branch
195-
await $`git checkout --force ${ref}`;
195+
if (reuse) {
196+
await $`git fetch`;
197+
} else {
198+
// clone the raw git repo for the experiment
199+
await $`git clone ${join(ROOT, '.git')} .`;
200+
}
196201

197-
// recreate the benchmark directory
198-
await $`rm -rf ./benchmark`;
199-
// intentionally use the same folder for both experiment and control
200-
await $`cp -r ${BENCHMARK_FOLDER} ./benchmark`;
202+
// checkout the repo to the HEAD of the current branch
203+
await $`git checkout --force ${ref}`;
201204

202-
// `pnpm install` and build the repo
203-
await $`pnpm install --no-frozen-lockfile`;
204-
await $`pnpm build`;
205+
// recreate the benchmark directory
206+
await $`rm -rf ./benchmark`;
207+
// intentionally use the same folder for both experiment and control
208+
await $`cp -r ${BENCHMARK_FOLDER} ./benchmark`;
205209

206-
// rewrite all `package.json`s to behave like published packages
207-
await rewritePackageJson();
210+
// `pnpm install` and build the repo
211+
await $`pnpm install --no-frozen-lockfile`;
212+
await $`pnpm build`;
208213

209-
// build the benchmarks using vite
210-
await cd(benchDir);
211-
await $`pnpm vite build`;
214+
// rewrite all `package.json`s to behave like published packages
215+
await rewritePackageJson();
216+
217+
// build the benchmarks using vite
218+
await cd(benchDir);
219+
await $`pnpm vite build`;
220+
});
212221
}

package.json

+1-1
Original file line numberDiff line numberDiff line change
@@ -103,7 +103,7 @@
103103
"tracerbench": "^8.0.1",
104104
"ts-node": "^10.9.1",
105105
"turbo": "^1.9.3",
106-
"typescript": "^5.0.4",
106+
"typescript": "~5.0.4",
107107
"vite": "^5.4.10",
108108
"xo": "^0.54.2",
109109
"zx": "^8.1.9"

packages/@glimmer-workspace/benchmark-env/lib/benchmark/create-registry.ts

+13-16
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import type {
2+
ClassicResolver,
23
Dict,
34
Helper,
45
HelperDefinitionState,
@@ -16,7 +17,7 @@ import {
1617
} from '@glimmer/manager';
1718
import { EvaluationContextImpl } from '@glimmer/opcode-compiler';
1819
import { artifacts, RuntimeOpImpl } from '@glimmer/program';
19-
import { runtimeContext } from '@glimmer/runtime';
20+
import { runtimeOptions } from '@glimmer/runtime';
2021

2122
import type { UpdateBenchmark } from '../interfaces';
2223

@@ -84,21 +85,17 @@ export default function createRegistry(): Registry {
8485
const sharedArtifacts = artifacts();
8586
const document = element.ownerDocument as SimpleDocument;
8687
const envDelegate = createEnvDelegate(isInteractive ?? true);
87-
const runtime = runtimeContext(
88-
{
89-
document,
90-
},
91-
envDelegate,
92-
sharedArtifacts,
93-
{
94-
lookupHelper: (name) => helpers.get(name) ?? null,
95-
lookupModifier: (name) => modifiers.get(name) ?? null,
96-
lookupComponent: (name) => components.get(name) ?? null,
9788

98-
lookupBuiltInHelper: () => null,
99-
lookupBuiltInModifier: () => null,
100-
}
101-
);
89+
const resolver = {
90+
lookupHelper: (name) => helpers.get(name) ?? null,
91+
lookupModifier: (name) => modifiers.get(name) ?? null,
92+
lookupComponent: (name) => components.get(name) ?? null,
93+
94+
lookupBuiltInHelper: () => null,
95+
lookupBuiltInModifier: () => null,
96+
} satisfies ClassicResolver;
97+
98+
const runtime = runtimeOptions({ document }, envDelegate, sharedArtifacts, resolver);
10299

103100
const context = new EvaluationContextImpl(
104101
sharedArtifacts,
@@ -110,7 +107,7 @@ export default function createRegistry(): Registry {
110107
throw new Error(`missing ${entry} component`);
111108
}
112109

113-
return renderBenchmark(context, component, args, element as SimpleElement);
110+
return renderBenchmark(sharedArtifacts, context, component, args, element as SimpleElement);
114111
},
115112
};
116113
}

packages/@glimmer-workspace/benchmark-env/lib/benchmark/render-benchmark.ts

+2
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ import type {
22
Dict,
33
EvaluationContext,
44
ResolvedComponentDefinition,
5+
RuntimeArtifacts,
56
SimpleElement,
67
} from '@glimmer/interfaces';
78
import { NewTreeBuilder, renderComponent, renderSync } from '@glimmer/runtime';
@@ -12,6 +13,7 @@ import { registerResult } from './create-env-delegate';
1213
import { measureRender } from './util';
1314

1415
export default async function renderBenchmark(
16+
artifacts: RuntimeArtifacts,
1517
context: EvaluationContext,
1618
component: ResolvedComponentDefinition,
1719
args: Dict,
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,19 @@
11
import type { CapturedArguments, Dict } from '@glimmer/interfaces';
22
import type { Reference } from '@glimmer/reference';
3+
import { setLocalDebugType } from '@glimmer/debug-util';
4+
import { LOCAL_DEBUG } from '@glimmer/local-debug-flags';
35
import { createComputeRef } from '@glimmer/reference';
46
import { reifyNamed, reifyPositional } from '@glimmer/runtime';
57

68
export type UserHelper = (args: ReadonlyArray<unknown>, named: Dict<unknown>) => unknown;
79

810
export function createHelperRef(helper: UserHelper, args: CapturedArguments): Reference {
9-
return createComputeRef(() => helper(reifyPositional(args.positional), reifyNamed(args.named)));
11+
return createComputeRef(
12+
() => helper(reifyPositional(args.positional), reifyNamed(args.named)),
13+
undefined
14+
);
15+
}
16+
17+
if (LOCAL_DEBUG) {
18+
setLocalDebugType('factory:helper', createHelperRef, { name: 'createHelper' });
1019
}

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

+2-2
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@ import {
3333
on,
3434
renderComponent,
3535
renderSync,
36-
runtimeContext,
36+
runtimeOptions,
3737
} from '@glimmer/runtime';
3838
import { assign } from '@glimmer/util';
3939

@@ -63,7 +63,7 @@ export function JitDelegateContext(
6363
env: EnvironmentDelegate
6464
): EvaluationContext {
6565
let sharedArtifacts = artifacts();
66-
let runtime = runtimeContext(
66+
let runtime = runtimeOptions(
6767
{ document: doc },
6868
env,
6969
sharedArtifacts,

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

+4-4
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
import type { Cursor, Environment, SimpleNode, TreeBuilder } from '@glimmer/interfaces';
22
import { COMMENT_NODE, ELEMENT_NODE } from '@glimmer/constants';
3-
import { RehydrateBuilder } from '@glimmer/runtime';
3+
import { RehydrateTree } from '@glimmer/runtime';
44

5-
export class DebugRehydrationBuilder extends RehydrateBuilder {
5+
export class DebugRehydrateTree extends RehydrateTree {
66
clearedNodes: SimpleNode[] = [];
77

88
override remove(node: SimpleNode) {
@@ -23,6 +23,6 @@ export class DebugRehydrationBuilder extends RehydrateBuilder {
2323
}
2424
}
2525

26-
export function debugRehydration(env: Environment, cursor: Cursor): TreeBuilder {
27-
return DebugRehydrationBuilder.forInitialRender(env, cursor);
26+
export function debugRehydrateTree(env: Environment, cursor: Cursor): TreeBuilder {
27+
return DebugRehydrateTree.forInitialRender(env, cursor);
2828
}

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

+4-4
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ import type { UserHelper } from '../../helpers';
2727
import type { TestModifierConstructor } from '../../modifiers';
2828
import type RenderDelegate from '../../render-delegate';
2929
import type { RenderDelegateOptions } from '../../render-delegate';
30-
import type { DebugRehydrationBuilder } from './builder';
30+
import type { DebugRehydrateTree } from './builder';
3131

3232
import { BaseEnv } from '../../base-env';
3333
import { replaceHTML, toInnerHTML } from '../../dom/simple-utils';
@@ -41,7 +41,7 @@ import {
4141
import { TestJitRegistry } from '../jit/registry';
4242
import { renderTemplate } from '../jit/render';
4343
import { TestJitRuntimeResolver } from '../jit/resolver';
44-
import { debugRehydration } from './builder';
44+
import { debugRehydrateTree } from './builder';
4545

4646
export interface RehydrationStats {
4747
clearedNodes: SimpleNode[];
@@ -105,7 +105,7 @@ export class RehydrationDelegate implements RenderDelegate {
105105

106106
getElementBuilder(env: Environment, cursor: Cursor): TreeBuilder {
107107
if (cursor.element instanceof Node) {
108-
return debugRehydration(env, cursor);
108+
return debugRehydrateTree(env, cursor);
109109
}
110110

111111
return serializeBuilder(env, cursor);
@@ -152,7 +152,7 @@ export class RehydrationDelegate implements RenderDelegate {
152152

153153
// Client-side rehydration
154154
let cursor = { element, nextSibling: null };
155-
let builder = this.getElementBuilder(env, cursor) as DebugRehydrationBuilder;
155+
let builder = this.getElementBuilder(env, cursor) as DebugRehydrateTree;
156156
let result = renderTemplate(
157157
template,
158158
this.clientContext,

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

+4-4
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import type { Dict, RenderResult, SimpleElement } from '@glimmer/interfaces';
22
import { renderComponent, renderSync } from '@glimmer/runtime';
33

4-
import type { DebugRehydrationBuilder } from './builder';
4+
import type { DebugRehydrateTree } from './builder';
55

66
import { RehydrationDelegate } from './delegate';
77

@@ -17,15 +17,15 @@ export class PartialRehydrationDelegate extends RehydrationDelegate {
1717
): RenderResult {
1818
let cursor = { element, nextSibling: null };
1919
let context = this.clientContext;
20-
let builder = this.getElementBuilder(context.env, cursor) as DebugRehydrationBuilder;
20+
let tree = this.getElementBuilder(context.env, cursor) as DebugRehydrateTree;
2121
let component = this.clientRegistry.lookupComponent(name)!;
2222

23-
let iterator = renderComponent(context, builder, {}, component.state, args);
23+
let iterator = renderComponent(context, tree, {}, component.state, args);
2424

2525
const result = renderSync(context.env, iterator);
2626

2727
this.rehydrationStats = {
28-
clearedNodes: builder.clearedNodes,
28+
clearedNodes: tree.clearedNodes,
2929
};
3030

3131
return result;

0 commit comments

Comments
 (0)