Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 0 additions & 1 deletion lib/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -137,7 +137,6 @@ const shim = addonV1Shim(path.join(__dirname, '..'), {
'./dist/dev/packages/@glimmer/destroyable/index.js',
'./dist/dev/packages/@glimmer/encoder/index.js',
'./dist/dev/packages/@glimmer/env/index.js',
'./dist/dev/packages/@glimmer/global-context/index.js',
'./dist/dev/packages/@glimmer/manager/index.js',
'./dist/dev/packages/@glimmer/node/index.js',
'./dist/dev/packages/@glimmer/opcode-compiler/index.js',
Expand Down
1 change: 0 additions & 1 deletion package.json
Original file line number Diff line number Diff line change
Expand Up @@ -319,7 +319,6 @@
"@glimmer/destroyable/index.js": "ember-source/@glimmer/destroyable/index.js",
"@glimmer/encoder/index.js": "ember-source/@glimmer/encoder/index.js",
"@glimmer/env/index.js": "ember-source/@glimmer/env/index.js",
"@glimmer/global-context/index.js": "ember-source/@glimmer/global-context/index.js",
"@glimmer/manager/index.js": "ember-source/@glimmer/manager/index.js",
"@glimmer/node/index.js": "ember-source/@glimmer/node/index.js",
"@glimmer/opcode-compiler/index.js": "ember-source/@glimmer/opcode-compiler/index.js",
Expand Down
119 changes: 8 additions & 111 deletions packages/@ember/-internals/glimmer/lib/environment.ts
Original file line number Diff line number Diff line change
@@ -1,91 +1,16 @@
import { ENV } from '@ember/-internals/environment';
import { get, set, _getProp, _setProp } from '@ember/-internals/metal';
import type { InternalOwner } from '@ember/-internals/owner';
import { getDebugName } from '@ember/-internals/utils';
import { constructStyleDeprecationMessage } from '@ember/-internals/views';
import { assert, deprecate, warn } from '@ember/debug';
import type { DeprecationOptions } from '@ember/debug';
import { schedule, _backburner } from '@ember/runloop';
import { setDestructionSchedulers } from '@glimmer/destroyable';
import { DEBUG } from '@glimmer/env';
import setGlobalContext from '@glimmer/global-context';
import type { EnvironmentDelegate } from '@glimmer/runtime';
import { debug } from '@glimmer/validator';
import toIterator from './utils/iterator';
import { isHTMLSafe } from './utils/string';
import toBool from './utils/to-bool';
import { debug, setScheduleRevalidate } from '@glimmer/validator';

///////////

// Setup global context

setGlobalContext({
scheduleRevalidate() {
_backburner.ensureInstance();
},

toBool,
toIterator,

getProp: _getProp,
setProp: _setProp,
getPath: get,
setPath: set,

scheduleDestroy(destroyable, destructor) {
schedule('actions', null, destructor, destroyable);
},

scheduleDestroyed(finalizeDestructor) {
schedule('destroy', null, finalizeDestructor);
},

warnIfStyleNotTrusted(value: unknown) {
warn(
constructStyleDeprecationMessage(String(value)),
(() => {
if (value === null || value === undefined || isHTMLSafe(value)) {
return true;
}
return false;
})(),
{ id: 'ember-htmlbars.style-xss-warning' }
);
},

assert(test: unknown, msg: string, options?: { id: string }) {
if (DEBUG) {
let id = options?.id;

let override = VM_ASSERTION_OVERRIDES.filter((o) => o.id === id)[0];

assert(override?.message ?? msg, test);
}
},

deprecate(msg: string, test: unknown, options: { id: string }) {
if (DEBUG) {
let { id } = options;

if (id === 'argument-less-helper-paren-less-invocation') {
throw new Error(
`A resolved helper cannot be passed as a named argument as the syntax is ` +
`ambiguously a pass-by-reference or invocation. Use the ` +
`\`{{helper 'foo-helper}}\` helper to pass by reference or explicitly ` +
`invoke the helper with parens: \`{{(fooHelper)}}\`.`
);
}

let override = VM_DEPRECATION_OVERRIDES.filter((o) => o.id === id)[0];

if (!override) throw new Error(`deprecation override for ${id} not found`);

// allow deprecations to be disabled in the VM_DEPRECATION_OVERRIDES array below
if (!override.disabled) {
deprecate(override.message ?? msg, Boolean(test), override);
}
}
},
});
setScheduleRevalidate(() => _backburner.ensureInstance());
setDestructionSchedulers(
(destroyable, destructor) => schedule('actions', null, destructor, destroyable),
(finalizer) => schedule('destroy', null, finalizer)
);

if (DEBUG) {
debug?.setTrackingTransactionEnv?.({
Expand All @@ -99,38 +24,10 @@ if (DEBUG) {
});
}

///////////

// VM Assertion/Deprecation overrides

const VM_DEPRECATION_OVERRIDES: (DeprecationOptions & {
disabled?: boolean;
message?: string;
})[] = [
{
id: 'setting-on-hash',
until: '4.4.0',
for: 'ember-source',
since: {
available: '3.28.0',
enabled: '3.28.0',
},
},
];

const VM_ASSERTION_OVERRIDES: { id: string; message: string }[] = [];

///////////

// Define environment delegate

export class EmberEnvironmentDelegate implements EnvironmentDelegate {
public enableDebugTooling: boolean = ENV._DEBUG_RENDER_TREE;

constructor(
public owner: InternalOwner,
public isInteractive: boolean
) {}
constructor(public isInteractive: boolean) {}

onTransactionCommit(): void {}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
export class EachInWrapper {
constructor(public inner: unknown) {}
}
5 changes: 1 addition & 4 deletions packages/@ember/-internals/glimmer/lib/helpers/each-in.ts
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ import { assert } from '@ember/debug';
import type { CapturedArguments } from '@glimmer/interfaces';
import { createComputeRef, valueForRef } from '@glimmer/reference';
import { consumeTag } from '@glimmer/validator';
import { EachInWrapper } from './each-in-wrapper';
import { internalHelper } from './internal-helper';

/**
Expand Down Expand Up @@ -163,10 +164,6 @@ import { internalHelper } from './internal-helper';
@public
@since 2.1.0
*/
export class EachInWrapper {
constructor(public inner: unknown) {}
}

export default internalHelper(({ positional }: CapturedArguments) => {
const inner = positional[0];
assert('expected at least one positional arg', inner);
Expand Down
2 changes: 1 addition & 1 deletion packages/@ember/-internals/glimmer/lib/renderer.ts
Original file line number Diff line number Diff line change
Expand Up @@ -750,7 +750,7 @@ class BaseRenderer {
* But for actual ember apps, you *need* to implement everything
* an app needs (which will actually change and become less over time)
*/
let env = new EmberEnvironmentDelegate(owner as InternalOwner, envOptions.isInteractive);
let env = new EmberEnvironmentDelegate(envOptions.isInteractive);
let options = runtimeOptions({ document }, env, sharedArtifacts, resolver);
let context = new EvaluationContextImpl(
sharedArtifacts,
Expand Down
2 changes: 1 addition & 1 deletion packages/@ember/-internals/glimmer/lib/utils/iterator.ts
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ import { isObject } from '@ember/-internals/utils';
import type { Nullable } from '@ember/-internals/utility-types';
import type { IteratorDelegate } from '@glimmer/reference';
import { consumeTag, isTracking, tagFor } from '@glimmer/validator';
import { EachInWrapper } from '../helpers/each-in';
import { EachInWrapper } from '../helpers/each-in-wrapper';
import type { NativeArray } from '@ember/array';

export default function toIterator(iterable: unknown): Nullable<IteratorDelegate> {
Expand Down
4 changes: 3 additions & 1 deletion packages/@ember/-internals/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,9 @@
"./error-handling": "./error-handling/index.ts",
"./glimmer": "./glimmer/index.ts",
"./glimmer/lib/components/internal": "./glimmer/lib/components/internal.ts",
"./glimmer/lib/utils/iterator": "./glimmer/lib/utils/iterator.ts",
"./glimmer/lib/utils/string": "./glimmer/lib/utils/string.ts",
"./glimmer/lib/utils/to-bool": "./glimmer/lib/utils/to-bool.ts",
"./meta": "./meta/index.ts",
"./metal": "./metal/index.ts",
"./owner": "./owner/index.ts",
Expand Down Expand Up @@ -48,7 +51,6 @@
"@glimmer/component": "workspace:*",
"@glimmer/destroyable": "workspace:*",
"@glimmer/env": "workspace:*",
"@glimmer/global-context": "workspace:*",
"@glimmer/interfaces": "workspace:*",
"@glimmer/manager": "workspace:*",
"@glimmer/node": "workspace:*",
Expand Down
2 changes: 1 addition & 1 deletion packages/@glimmer-workspace/integration-tests/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -14,10 +14,10 @@
},
"scripts": {},
"dependencies": {
"@ember/debug": "workspace:*",
"@glimmer-workspace/test-utils": "workspace:*",
"@glimmer/compiler": "workspace:*",
"@glimmer/destroyable": "workspace:*",
"@glimmer/global-context": "workspace:*",
"@glimmer/interfaces": "workspace:*",
"@glimmer/manager": "workspace:*",
"@glimmer/node": "workspace:*",
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,6 @@
"@glimmer/constants": "workspace:*",
"@glimmer/debug-util": "workspace:*",
"@glimmer/destroyable": "workspace:*",
"@glimmer/global-context": "workspace:*",
"@glimmer/local-debug-flags": "workspace:*",
"@glimmer/manager": "workspace:*",
"@glimmer/opcode-compiler": "workspace:*",
Expand Down
Original file line number Diff line number Diff line change
@@ -1,33 +1,28 @@
/* eslint-disable @typescript-eslint/no-extraneous-class */
import type { GlobalContext } from '@glimmer/global-context';
import { testOverrideGlobalContext } from '@glimmer/global-context';
import { registerWarnHandler } from '@ember/debug';
import { jitSuite, RenderTest, test } from '@glimmer-workspace/integration-tests';

import { assert } from './support';
import { DEBUG } from '@glimmer/env';

let warnings = 0;
let originalContext: GlobalContext | null;

class StyleWarningsTest extends RenderTest {
static suiteName = 'Style attributes';

beforeEach() {
warnings = 0;
originalContext =
testOverrideGlobalContext?.({
warnIfStyleNotTrusted() {
warnings++;
},

getProp(obj, key) {
return (obj as Record<string, unknown>)[key];
},
}) ?? null;
registerWarnHandler((_message, options, next) => {
if (options?.id === 'ember-htmlbars.style-xss-warning') {
warnings++;
} else {
next(_message, options);
}
});
}

afterEach() {
testOverrideGlobalContext?.(originalContext);
registerWarnHandler((message, options, next) => next(message, options));
}

@test
Expand Down
2 changes: 1 addition & 1 deletion packages/@glimmer/debug-util/index.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
export { assertNever, deprecate, default as assert } from './lib/assert';
export { assertNever, debugAssert, deprecate, default as assert } from './lib/assert';
export * from './lib/debug-brand';
export { default as debugToString } from './lib/debug-to-string';
export * from './lib/platform-utils';
Expand Down
7 changes: 7 additions & 0 deletions packages/@glimmer/debug-util/lib/assert.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
// import Logger from './logger';

import { DEBUG } from '@glimmer/env';
import { LOCAL_DEBUG } from '@glimmer/local-debug-flags';

export default function assert(test: unknown, msg: string): asserts test {
Expand All @@ -10,6 +11,12 @@ export default function assert(test: unknown, msg: string): asserts test {
}
}

export function debugAssert(test: unknown, msg: string | (() => string)): asserts test {
if (DEBUG && !test) {
throw new Error(typeof msg === 'string' ? msg : msg());
}
}

export function deprecate(desc: string) {
if (LOCAL_DEBUG) {
LOCAL_LOGGER.warn(`DEPRECATION: ${desc}`);
Expand Down
6 changes: 3 additions & 3 deletions packages/@glimmer/debug-util/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -8,11 +8,11 @@
"exports": "./index.ts",
"scripts": {},
"dependencies": {
"@glimmer/interfaces": "workspace:*"
"@glimmer/env": "workspace:*",
"@glimmer/interfaces": "workspace:*",
"@glimmer/local-debug-flags": "workspace:*"
},
"devDependencies": {
"@glimmer/env": "workspace:*",
"@glimmer/local-debug-flags": "workspace:*",
"eslint": "^9.20.1",
"typescript": "^5.7.3"
}
Expand Down
14 changes: 13 additions & 1 deletion packages/@glimmer/destroyable/index.ts
Original file line number Diff line number Diff line change
@@ -1,7 +1,19 @@
import { DEBUG } from '@glimmer/env';
import type { Destroyable, Destructor } from '@glimmer/interfaces';
import { debugToString } from '@glimmer/debug-util';
import { scheduleDestroy, scheduleDestroyed } from '@glimmer/global-context';

export let scheduleDestroy: <T extends Destroyable>(
destroyable: T,
destructor: Destructor<T>
) => void = () => {};
export let scheduleDestroyed: (finalizer: () => void) => void = () => {};
export function setDestructionSchedulers(
destroy: typeof scheduleDestroy,
destroyed: typeof scheduleDestroyed
): void {
scheduleDestroy = destroy;
scheduleDestroyed = destroyed;
}

const LIVE_STATE = 0;
const DESTROYING_STATE = 1;
Expand Down
1 change: 0 additions & 1 deletion packages/@glimmer/destroyable/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,6 @@
"test:publint": "publint"
},
"dependencies": {
"@glimmer/global-context": "workspace:*",
"@glimmer/interfaces": "workspace:*"
},
"devDependencies": {
Expand Down
1 change: 0 additions & 1 deletion packages/@glimmer/destroyable/test/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,6 @@
"scripts": {},
"dependencies": {
"@glimmer/destroyable": "workspace:*",
"@glimmer/global-context": "workspace:*",
"@glimmer/util": "workspace:*"
},
"devDependencies": {
Expand Down
1 change: 0 additions & 1 deletion packages/@glimmer/global-context/.npmignore

This file was deleted.

Loading
Loading