2
0
Fork 0
mirror of https://github.com/discourse/discourse.git synced 2025-10-03 17:21:20 +08:00

DEV: Drop support for template overrides and mobile-specific templates (#33101)

https://meta.discourse.org/t/355668
This commit is contained in:
David Taylor 2025-06-06 14:34:20 +01:00 committed by GitHub
parent 1cde45c2b4
commit cb6cc8dcd3
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
8 changed files with 92 additions and 694 deletions

View file

@ -1,116 +0,0 @@
import * as GlimmerManager from "@glimmer/manager";
import ClassicComponent from "@ember/component";
import deprecated from "discourse/lib/deprecated";
import DiscourseTemplateMap from "discourse/lib/discourse-template-map";
import { getThemeInfo } from "discourse/lib/source-identifier";

// We're using a patched version of Ember with a modified GlimmerManager to make the code below work.
// This patch is not ideal, but Ember does not allow us to change a component template after initial association
// https://github.com/glimmerjs/glimmer-vm/blob/03a4b55c03/packages/%40glimmer/manager/lib/public/template.ts#L14-L20

function sourceForModuleName(name) {
const pluginMatch = name.match(/^discourse\/plugins\/([^\/]+)\//)?.[1];
if (pluginMatch) {
return {
type: "plugin",
name: pluginMatch,
};
}

const themeMatch = name.match(/^discourse\/theme-(\d+)\//)?.[1];
if (themeMatch) {
return {
...getThemeInfo(parseInt(themeMatch, 10)),
type: "theme",
};
}
}

export default {
after: ["populate-template-map", "mobile"],

initialize(owner) {
this.site = owner.lookup("service:site");

this.eachThemePluginTemplate((templateKey, moduleNames, mobile) => {
if (!mobile && DiscourseTemplateMap.coreTemplates.has(templateKey)) {
// It's a non-colocated core component. Template will be overridden at runtime.
return;
}

let componentName = templateKey;
const finalOverrideModuleName = moduleNames.at(-1);

if (mobile) {
deprecated(
`Mobile-specific hbs templates are deprecated. Use responsive CSS or {{#if this.site.mobileView}} instead. [${templateKey}]`,
{
id: "discourse.mobile-templates",
url: "https://meta.discourse.org/t/355668",
source: sourceForModuleName(finalOverrideModuleName),
}
);
if (this.site.mobileView) {
componentName = componentName.slice("mobile/".length);
}
}

componentName = componentName.slice("components/".length);

const component = owner.resolveRegistration(`component:${componentName}`);

if (!component) {
// Plugin/theme component template with no backing class.
// Treat as classic component to emulate pre-template-only-glimmer-component behaviour.
owner.register(`component:${componentName}`, ClassicComponent);
return;
}

// patched function: Ember's OG won't return overridden templates. This version will.
// it's safe to call it original template here because the override wasn't set yet.
const originalTemplate = GlimmerManager.getComponentTemplate(component);

if (originalTemplate) {
deprecated(
`Overriding component templates is deprecated, and will soon be disabled. Use plugin outlets, CSS, or other customization APIs instead. [${finalOverrideModuleName}]`,
{
id: "discourse.component-template-overrides",
url: "https://meta.discourse.org/t/355668",
source: sourceForModuleName(finalOverrideModuleName),
}
);

const overrideTemplate = require(finalOverrideModuleName).default;

// patched function: Ember's OG does not allow overriding a component template
GlimmerManager.setComponentTemplate(overrideTemplate, component);
}
});
},

eachThemePluginTemplate(cb) {
const { coreTemplates, pluginTemplates, themeTemplates } =
DiscourseTemplateMap;

const orderedOverrides = [
[pluginTemplates, "components/", false],
[themeTemplates, "components/", false],
[coreTemplates, "mobile/components/", true],
[pluginTemplates, "mobile/components/", true],
[themeTemplates, "mobile/components/", true],
];

for (const [map, prefix, mobile] of orderedOverrides) {
for (const [key, value] of map) {
if (key.startsWith(prefix)) {
cb(key, value, mobile);
}
}
}
},

teardown() {
// patched function: doesn't exist on og GlimmerManager
GlimmerManager.clearTemplateOverrides();
},
};

View file

@ -1,14 +1,9 @@
import deprecated from "./deprecated";
import { isTesting } from "discourse/lib/environment";

const pluginRegex = /^discourse\/plugins\/([^\/]+)\/(.*)$/;
const themeRegex = /^discourse\/theme-([^\/]+)\/(.*)$/;

function appendToCache(cache, key, value) {
let cachedValue = cache.get(key);
cachedValue ??= [];
cachedValue.push(value);
cache.set(key, cachedValue);
}
const pluginRegex =
/^discourse\/plugins\/([^\/]+)\/(?:discourse\/templates\/)?(.*)$/;
const themeRegex =
/^discourse\/theme-([^\/]+)\/(?:discourse\/templates\/)?(.*)$/;

const NAMESPACES = ["discourse/", "admin/"];

@ -25,53 +20,65 @@ function isTemplate(moduleName) {
return moduleName.includes("/templates/");
}

function buildPrioritizedMaps(moduleNames) {
const coreTemplates = new Map();
const pluginTemplates = new Map();
const themeTemplates = new Map();

for (const moduleName of moduleNames) {
if (isInRecognisedNamespace(moduleName) && isTemplate(moduleName)) {
let pluginMatch, themeMatch;
if ((pluginMatch = moduleName.match(pluginRegex))) {
pluginTemplates.set(pluginMatch[2], moduleName);
} else if ((themeMatch = moduleName.match(themeRegex))) {
themeTemplates.set(themeMatch[2], moduleName);
} else {
coreTemplates.set(
moduleName.replace(/^discourse\/templates\//, ""),
moduleName
);
}
}
}

return [coreTemplates, pluginTemplates, themeTemplates];
}

/**
* This class provides takes set of core/plugin/theme modules, finds the template modules,
* and makes an efficient lookup table for the resolver to use. It takes care of sourcing
* component/route templates from themes/plugins, and also handles template overrides.
* component/route templates from themes/plugins, and also warns about clashes
*/
class DiscourseTemplateMap {
coreTemplates = new Map();
pluginTemplates = new Map();
themeTemplates = new Map();
prioritizedCaches = [
this.themeTemplates,
this.pluginTemplates,
this.coreTemplates,
];
templates = new Map();

/**
* Reset the TemplateMap to use the supplied module names. It is expected that the list
* will be generated using `Object.keys(requirejs.entries)`.
*/
setModuleNames(moduleNames) {
this.coreTemplates.clear();
this.pluginTemplates.clear();
this.themeTemplates.clear();
for (const moduleName of moduleNames) {
if (isInRecognisedNamespace(moduleName) && isTemplate(moduleName)) {
this.#add(moduleName);
this.templates.clear();

for (const templateMap of buildPrioritizedMaps(moduleNames)) {
for (const [path, moduleName] of templateMap) {
this.#add(path, moduleName);
}
}
}

#add(originalPath) {
let path = originalPath;
#add(path, moduleName) {
if (this.templates.has(path)) {
const msg = `Duplicate templates found for '${path}': '${moduleName}' clashes with '${this.templates.get(path)}'`;

let pluginMatch, themeMatch, cache;
if ((pluginMatch = path.match(pluginRegex))) {
path = pluginMatch[2];
cache = this.pluginTemplates;
} else if ((themeMatch = path.match(themeRegex))) {
path = themeMatch[2];
cache = this.themeTemplates;
if (isTesting()) {
throw new Error(msg);
} else {
// eslint-disable-next-line no-console
console.error(msg);
}
} else {
cache = this.coreTemplates;
this.templates.set(path, moduleName);
}

path = path.replace(/^discourse\/templates\//, "");

appendToCache(cache, path, originalPath);
}

/**
@ -79,41 +86,7 @@ class DiscourseTemplateMap {
* theme/plugin namespaces and overrides.
*/
resolve(name) {
const [themeMatch, pluginMatch, coreMatch] = this.prioritizedCaches.map(
(cache) => {
const val = cache.get(name);
if (val) {
return val[val.length - 1];
}
}
);

if ((themeMatch || pluginMatch) && coreMatch) {
deprecated(
`[${
themeMatch || pluginMatch
}] Overriding templates is deprecated, and will soon be disabled. Use plugin outlets, CSS, or other customization APIs instead.`,
{
id: "discourse.resolver-template-overrides",
url: "https://meta.discourse.org/t/247487",
}
);
}

return themeMatch || pluginMatch || coreMatch;
}

/**
* List all available template keys, after theme/plugin namespaces have
* been stripped.
*/
keys() {
const uniqueKeys = new Set([
...this.coreTemplates.keys(),
...this.pluginTemplates.keys(),
...this.themeTemplates.keys(),
]);
return [...uniqueKeys];
return this.templates.get(name);
}
}


View file

@ -270,7 +270,6 @@ export function buildResolver(baseName) {

resolveTemplate(parsedName) {
return (
this.findMobileTemplate(parsedName) ||
this.findTemplate(parsedName) ||
this.findAdminTemplate(parsedName) ||
this.findLoadingTemplate(parsedName) ||
@ -296,21 +295,6 @@ export function buildResolver(baseName) {
}
}

findMobileTemplate(parsedName) {
const result = this.findTemplate(parsedName, "mobile/");
if (result) {
deprecated(
`Mobile-specific hbs templates are deprecated. Use responsive CSS or {{#if this.site.mobileView}} instead. [${parsedName}]`,
{
id: "discourse.mobile-templates",
}
);
}
if (_options.mobileView) {
return result;
}
}

/**
* Given a template path, this function will return a template, taking into account
* priority rules for theme and plugin overrides. See `lib/discourse-template-map.js`

View file

@ -27,10 +27,6 @@ export const CRITICAL_DEPRECATIONS = [
"discourse.qunit.acceptance-function",
"discourse.qunit.global-exists",
"discourse.post-stream.trigger-new-post",
"discourse.mobile-templates",
"discourse.mobile-view",
"discourse.mobile-templates",
"discourse.component-template-overrides",
"discourse.plugin-outlet-classic-args-clash",
"discourse.decorate-plugin-outlet",
];

View file

@ -1,316 +0,0 @@
import Component from "@glimmer/component";
import { setComponentTemplate } from "@glimmer/manager";
import { render } from "@ember/test-helpers";
import { hbs } from "ember-cli-htmlbars";
import { module, test } from "qunit";
import { withSilencedDeprecationsAsync } from "discourse/lib/deprecated";
import { forceMobile } from "discourse/lib/mobile";
import { setupRenderingTest } from "discourse/tests/helpers/component-test";
import { registerTemporaryModule } from "../helpers/temporary-module-helper";

function silenceMobileAndOverrideDeprecations(hooks) {
let unsilenceCallback;
hooks.beforeEach(() => {
const promise = new Promise((resolve) => (unsilenceCallback = resolve));
withSilencedDeprecationsAsync(
[
"component-template-resolving", // silence ember's template resolving deprecation
"discourse.mobile-templates",
"discourse.resolver-template-overrides",
"discourse.component-template-overrides",
],
() => promise
);
});
hooks.afterEach(() => unsilenceCallback());
}

// eslint-disable-next-line ember/no-empty-glimmer-component-classes
class MockColocatedComponent extends Component {}
setComponentTemplate(hbs`Colocated Original`, MockColocatedComponent);

// eslint-disable-next-line ember/no-empty-glimmer-component-classes
class MockResolvedComponent extends Component {}
const MockResolvedComponentTemplate = hbs`Resolved Original`;

const TestTemplate = hbs`
<div id='mock-colocated'><MockColocated /></div>
<div id='mock-resolved'><MockResolved /></div>
`;

function registerBaseComponents(namespace = "discourse") {
registerTemporaryModule(
`${namespace}/components/mock-colocated`,
MockColocatedComponent
);
registerTemporaryModule(
`${namespace}/templates/mobile/components/mock-colocated`,
hbs`Core mobile template`
);
registerTemporaryModule(
`${namespace}/components/mock-resolved`,
MockResolvedComponent
);
registerTemporaryModule(
`${namespace}/templates/components/mock-resolved`,
MockResolvedComponentTemplate
);
registerTemporaryModule(
`${namespace}/templates/mobile/components/mock-resolved`,
hbs`Core resolved mobile`
);
}

function registerThemeOverrides() {
registerTemporaryModule(
"discourse/theme-12/discourse/templates/components/mock-colocated",
hbs`Colocated Theme Override`
);
registerTemporaryModule(
`discourse/theme-12/discourse/templates/mobile/components/mock-colocated`,
hbs`Colocated Mobile Theme Override`
);
registerTemporaryModule(
"discourse/theme-12/discourse/templates/components/mock-resolved",
hbs`Resolved Theme Override`
);
registerTemporaryModule(
"discourse/theme-12/discourse/templates/mobile/components/mock-resolved",
hbs`Resolved Mobile Theme Override`
);
}

function registerPluginOverrides() {
registerTemporaryModule(
`discourse/plugins/some-plugin-name/discourse/templates/components/mock-colocated`,
hbs`Colocated Plugin Override`
);
registerTemporaryModule(
`discourse/plugins/some-plugin-name/discourse/templates/components/mock-resolved`,
hbs`Resolved Plugin Override`
);
}

function registerOtherPluginOverrides() {
registerTemporaryModule(
`discourse/plugins/other-plugin-name/discourse/templates/components/mock-colocated`,
hbs`Colocated Other Plugin Override`
);
registerTemporaryModule(
`discourse/plugins/other-plugin-name/discourse/templates/components/mock-resolved`,
hbs`Resolved Other Plugin Override`
);
}

function registerTemplateOnlyComponents() {
registerTemporaryModule(
`discourse/templates/components/core-template-only-definition`,
hbs`glimmer template-only component`
);

registerTemporaryModule(
`discourse/plugins/some-plugin-name/discourse/templates/components/plugin-template-only-definition`,
hbs`classic component`
);
}

module("Integration | Initializers | plugin-component-templates", function (h) {
silenceMobileAndOverrideDeprecations(h);

module("template-only component definition behaviour", function (hooks) {
hooks.beforeEach(() => registerTemplateOnlyComponents());
setupRenderingTest(hooks);

test("treats plugin template-only definition as classic component", async function (assert) {
await render(hbs`<PluginTemplateOnlyDefinition class='test-class'/>`);
assert
.dom("div.test-class")
.hasText("classic component", "renders as classic component");
});

test("leaves core template-only definition as glimmer template-only component", async function (assert) {
await render(hbs`<CoreTemplateOnlyDefinition class='test-class'/>`);
assert
.dom("div.test-class")
.doesNotExist("no classic component rendered");
assert.dom().hasText("glimmer template-only component");
});
});

module("with no overrides", function (hooks) {
hooks.beforeEach(() => registerBaseComponents());
setupRenderingTest(hooks);

test("renders core templates when there are no overrides", async function (assert) {
await render(TestTemplate);
assert
.dom("#mock-colocated")
.hasText("Colocated Original", "colocated component correct");
assert
.dom("#mock-resolved")
.hasText("Resolved Original", "resolved component correct");
});
});

module("with core mobile overrides", function (hooks) {
hooks.beforeEach(() => {
registerBaseComponents();
forceMobile();
});

setupRenderingTest(hooks);

test("core mobile overrides are used", async function (assert) {
await render(TestTemplate);
assert
.dom("#mock-colocated")
.hasText("Core mobile template", "colocated component correct");
assert
.dom("#mock-resolved")
.hasText("Core resolved mobile", "resolved component correct");
});
});

module("with theme overrides", function (hooks) {
hooks.beforeEach(() => registerBaseComponents());
hooks.beforeEach(registerThemeOverrides);
setupRenderingTest(hooks);

test("theme overrides are used", async function (assert) {
await render(TestTemplate);
assert
.dom("#mock-colocated")
.hasText("Colocated Theme Override", "colocated component correct");
assert
.dom("#mock-resolved")
.hasText("Resolved Theme Override", "resolved component correct");
});
});

module("with mobile theme overrides", function (hooks) {
hooks.beforeEach(() => {
registerThemeOverrides();
forceMobile();
registerBaseComponents();
});

setupRenderingTest(hooks);

test("mobile theme overrides are used", async function (assert) {
await render(TestTemplate);
assert
.dom("#mock-colocated")
.hasText(
"Colocated Mobile Theme Override",
"colocated component correct"
);
assert
.dom("#mock-resolved")
.hasText(
"Resolved Mobile Theme Override",
"resolved component correct"
);
});
});

module("with plugin overrides", function (hooks) {
hooks.beforeEach(() => registerBaseComponents());
hooks.beforeEach(registerPluginOverrides);
setupRenderingTest(hooks);

test("plugin overrides are used", async function (assert) {
await render(TestTemplate);
assert
.dom("#mock-colocated")
.hasText("Colocated Plugin Override", "colocated component correct");
assert
.dom("#mock-resolved")
.hasText("Resolved Plugin Override", "resolved component correct");
});
});

module("with theme and plugin overrides", function (hooks) {
hooks.beforeEach(() => registerBaseComponents());
hooks.beforeEach(registerPluginOverrides);
hooks.beforeEach(registerThemeOverrides);
setupRenderingTest(hooks);

test("plugin overrides are used", async function (assert) {
await render(TestTemplate);
assert
.dom("#mock-colocated")
.hasText("Colocated Theme Override", "colocated component correct");
assert
.dom("#mock-resolved")
.hasText("Resolved Theme Override", "resolved component correct");
});
});

module("with multiple plugin overrides", function (hooks) {
hooks.beforeEach(() => registerBaseComponents());
hooks.beforeEach(registerPluginOverrides);
hooks.beforeEach(registerOtherPluginOverrides);
setupRenderingTest(hooks);

test("last-defined plugin overrides are used", async function (assert) {
await render(TestTemplate);
assert
.dom("#mock-colocated")
.hasText(
"Colocated Other Plugin Override",
"colocated component correct"
);
assert
.dom("#mock-resolved")
.hasText(
"Resolved Other Plugin Override",
"resolved component correct"
);
});
});

module("theme overriding plugin", function (hooks) {
hooks.beforeEach(() =>
registerBaseComponents("discourse/plugins/base-plugin/discourse")
);
hooks.beforeEach(registerThemeOverrides);
setupRenderingTest(hooks);

test("theme overrides plugin component", async function (assert) {
await render(TestTemplate);
assert
.dom("#mock-colocated")
.hasText("Colocated Theme Override", "colocated component correct");
assert
.dom("#mock-resolved")
.hasText("Resolved Theme Override", "resolved component correct");
});
});

module("overriding gjs component", function (hooks) {
hooks.beforeEach(() => {
registerTemporaryModule(
`discourse/components/mock-gjs-component`,
class MyComponent extends Component {
<template>
<span class="greeting">Hello world</span>
</template>
}
);

registerTemporaryModule(
`discourse/plugins/my-plugin/discourse/templates/components/mock-gjs-component`,
hbs`<span class="greeting">Overridden greeting</span>`
);
});

setupRenderingTest(hooks);

test("theme overrides plugin component", async function (assert) {
await render(hbs`<MockGjsComponent />`);
assert
.dom(".greeting")
.hasText("Overridden greeting", "it renders the overridden version");
});
});
});

View file

@ -2,7 +2,7 @@ import { setupTest } from "ember-qunit";
import { module, test } from "qunit";
import { withSilencedDeprecations } from "discourse/lib/deprecated";
import DiscourseTemplateMap from "discourse/lib/discourse-template-map";
import { buildResolver, setResolverOption } from "discourse/resolver";
import { buildResolver } from "discourse/resolver";
import { registerTemporaryModule } from "discourse/tests/helpers/temporary-module-helper";

let resolver;
@ -238,55 +238,14 @@ module("Unit | Ember | resolver", function (hooks) {
);
});

test("resolves mobile templates to 'mobile/' namespace", function (assert) {
setTemplates([
"discourse/templates/mobile/foo",
"discourse/templates/bar",
"discourse/templates/mobile/bar",
"discourse/templates/baz",
]);

setResolverOption("mobileView", true);

withSilencedDeprecations("discourse.mobile-templates", () => {
// Default with mobile/ added
lookupTemplate(
assert,
"template:foo",
"discourse/templates/mobile/foo",
"finding mobile version even if normal one is not present"
);

// Default with mobile preferred
lookupTemplate(
assert,
"template:bar",
"discourse/templates/mobile/bar",
"preferring mobile version when both mobile and normal versions are present"
);

// Default when mobile not present
lookupTemplate(
assert,
"template:baz",
"discourse/templates/baz",
"falling back to a normal version when mobile version is not present"
);
});
});

test("resolves templates to plugin and theme namespaces", function (assert) {
setTemplates([
"discourse/plugins/my-plugin/discourse/templates/foo",
"discourse/templates/bar",
"discourse/plugins/my-plugin/discourse/templates/bar",
"discourse/templates/baz",
"discourse/plugins/my-plugin/discourse/templates/baz",
"discourse/theme-12/discourse/templates/baz",
"discourse/templates/qux",
]);

// Defined in plugin only
// Defined in plugin
lookupTemplate(
assert,
"template:foo",
@ -294,17 +253,7 @@ module("Unit | Ember | resolver", function (hooks) {
"finding plugin version even if normal one is not present"
);

// Defined in core and plugin
withSilencedDeprecations("discourse.resolver-template-overrides", () => {
lookupTemplate(
assert,
"template:bar",
"discourse/plugins/my-plugin/discourse/templates/bar",
"prefers plugin version over core"
);
});

// Defined in core and plugin and theme
// Defined in theme
withSilencedDeprecations("discourse.resolver-template-overrides", () => {
lookupTemplate(
assert,
@ -314,7 +263,7 @@ module("Unit | Ember | resolver", function (hooks) {
);
});

// Defined in core only
// Defined in core
lookupTemplate(
assert,
"template:qux",
@ -323,47 +272,6 @@ module("Unit | Ember | resolver", function (hooks) {
);
});

test("resolves plugin mobile templates", function (assert) {
setTemplates([
"discourse/plugins/my-plugin/discourse/templates/mobile/foo",
"discourse/plugins/my-plugin/discourse/templates/mobile/bar",
"discourse/plugins/my-plugin/discourse/templates/bar",
"discourse/plugins/my-plugin/discourse/templates/mobile/baz",
"discourse/templates/mobile/baz",
]);

setResolverOption("mobileView", true);

withSilencedDeprecations(
["discourse.mobile-templates", "discourse.resolver-template-overrides"],
() => {
// Default with plugin template override
lookupTemplate(
assert,
"template:foo",
"discourse/plugins/my-plugin/discourse/templates/mobile/foo",
"finding plugin version even if normal one is not present"
);

// Default with plugin mobile added, takes precedence over non-mobile
lookupTemplate(
assert,
"template:bar",
"discourse/plugins/my-plugin/discourse/templates/mobile/bar",
"preferring plugin mobile version when both non-mobile plugin version is also present"
);

// Default with when non-plugin mobile version is present
lookupTemplate(
assert,
"template:baz",
"discourse/plugins/my-plugin/discourse/templates/mobile/baz",
"preferring plugin mobile version over non-plugin mobile version"
);
}
);
});

test("resolves templates with 'admin' prefix", function (assert) {
setTemplates([
"admin/templates/foo",

View file

@ -64,34 +64,3 @@ index cd68afe479229ed77b4e4c93759aa90913cdc49c..6e7d71bbeb28f18259fa8afb48ef7827
registerHandler = function registerHandler(type, callback) {
let nextHandler = HANDLERS[type] || (() => {});
HANDLERS[type] = (message, options) => {
diff --git a/dist/packages/@glimmer/manager/index.js b/dist/packages/@glimmer/manager/index.js
index ca6ac88fe0fcc7ad335b19fafa039fb6c5ebd14a..462672f9c1cdcca76e9e6713606c1b8d8797eff3 100644
--- a/dist/packages/@glimmer/manager/index.js
+++ b/dist/packages/@glimmer/manager/index.js
@@ -546,20 +546,23 @@ function setModifierManager(factory, obj) {
function setHelperManager(factory, obj) {
return setInternalHelperManager(new CustomHelperManager(factory), obj);
}
+let TEMPLATE_OVERRIDES = new WeakMap();
const TEMPLATES = new WeakMap(),
getPrototypeOf = Object.getPrototypeOf;
function setComponentTemplate(factory, obj) {
if (isDevelopingApp() && (null === obj || "object" != typeof obj && "function" != typeof obj)) throw new Error(`Cannot call \`setComponentTemplate\` on \`${debugToString$1(obj)}\``);
- if (isDevelopingApp() && TEMPLATES.has(obj)) throw new Error(`Cannot call \`setComponentTemplate\` multiple times on the same class (\`${debugToString$1(obj)}\`)`);
+ // if (isDevelopingApp() && TEMPLATES.has(obj)) throw new Error(`Cannot call \`setComponentTemplate\` multiple times on the same class (\`${debugToString$1(obj)}\`)`);
+ if (TEMPLATES.has(obj)) return TEMPLATE_OVERRIDES.set(obj, factory), obj;
return TEMPLATES.set(obj, factory), obj;
}
function getComponentTemplate(obj) {
let pointer = obj;
for (; null !== pointer;) {
- let template = TEMPLATES.get(pointer);
+ let template = TEMPLATE_OVERRIDES.get(pointer) ?? TEMPLATES.get(pointer);
if (void 0 !== template) return template;
pointer = getPrototypeOf(pointer);
}
}
+function clearTemplateOverrides() { TEMPLATE_OVERRIDES = new WeakMap() };
-export { CustomComponentManager, CustomHelperManager, CustomModifierManager, capabilityFlagsFrom, componentCapabilities, getComponentTemplate, getCustomTagFor, getInternalComponentManager, getInternalHelperManager, getInternalModifierManager, hasCapability, hasDestroyable, hasInternalComponentManager, hasInternalHelperManager, hasInternalModifierManager, hasValue, helperCapabilities, managerHasCapability, modifierCapabilities, setComponentManager, setComponentTemplate, setCustomTagFor, setHelperManager, setInternalComponentManager, setInternalHelperManager, setInternalModifierManager, setModifierManager };
+export { CustomComponentManager, CustomHelperManager, CustomModifierManager, capabilityFlagsFrom, componentCapabilities, getComponentTemplate, clearTemplateOverrides, getCustomTagFor, getInternalComponentManager, getInternalHelperManager, getInternalModifierManager, hasCapability, hasDestroyable, hasInternalComponentManager, hasInternalHelperManager, hasInternalModifierManager, hasValue, helperCapabilities, managerHasCapability, modifierCapabilities, setComponentManager, setComponentTemplate, setCustomTagFor, setHelperManager, setInternalComponentManager, setInternalHelperManager, setInternalModifierManager, setModifierManager };

82
pnpm-lock.yaml generated
View file

@ -12,7 +12,7 @@ patchedDependencies:
hash: wki6cycbrrm5sscamn5w4cujby
path: patches/babel-plugin-debug-macros@0.3.4.patch
ember-source@5.12.0:
hash: xx7mvsb7nmshqkkqhmf45r3hse
hash: pqnuctuxbp6ekxyjszyhrgmysm
path: patches/ember-source@5.12.0.patch
ember-this-fallback@0.4.0:
hash: znalyv6akdxlqfpmxunrdi3osa
@ -184,13 +184,13 @@ importers:
version: 1.1.3
ember-load-initializers:
specifier: ^3.0.1
version: 3.0.1(ember-source@5.12.0(patch_hash=xx7mvsb7nmshqkkqhmf45r3hse)(@glimmer/component@1.1.2(@babel/core@7.27.4))(@glint/template@1.4.1-unstable.34c4510)(rsvp@4.8.5)(webpack@5.99.9(@swc/core@1.11.29)(esbuild@0.25.5)))
version: 3.0.1(ember-source@5.12.0(patch_hash=pqnuctuxbp6ekxyjszyhrgmysm)(@glimmer/component@1.1.2(@babel/core@7.27.4))(@glint/template@1.4.1-unstable.34c4510)(rsvp@4.8.5)(webpack@5.99.9(@swc/core@1.11.29)(esbuild@0.25.5)))
ember-resolver:
specifier: ^13.1.1
version: 13.1.1
ember-source:
specifier: ~5.12.0
version: 5.12.0(patch_hash=xx7mvsb7nmshqkkqhmf45r3hse)(@glimmer/component@1.1.2(@babel/core@7.27.4))(@glint/template@1.4.1-unstable.34c4510)(rsvp@4.8.5)(webpack@5.99.9(@swc/core@1.11.29)(esbuild@0.25.5))
version: 5.12.0(patch_hash=pqnuctuxbp6ekxyjszyhrgmysm)(@glimmer/component@1.1.2(@babel/core@7.27.4))(@glint/template@1.4.1-unstable.34c4510)(rsvp@4.8.5)(webpack@5.99.9(@swc/core@1.11.29)(esbuild@0.25.5))
ember-source-channel-url:
specifier: ^3.0.0
version: 3.0.0(encoding@0.1.13)
@ -386,13 +386,13 @@ importers:
version: 0.9.1(patch_hash=s67qh4jsmpbr3llstdi3a5zeze)
'@ember/legacy-built-in-components':
specifier: ^0.5.0
version: 0.5.0(@glint/template@1.4.1-unstable.34c4510)(ember-source@5.12.0(patch_hash=xx7mvsb7nmshqkkqhmf45r3hse)(@glimmer/component@1.1.2(@babel/core@7.27.4))(@glint/template@1.4.1-unstable.34c4510)(rsvp@4.8.5)(webpack@5.99.9(@swc/core@1.11.29)(esbuild@0.25.5)))
version: 0.5.0(@glint/template@1.4.1-unstable.34c4510)(ember-source@5.12.0(patch_hash=pqnuctuxbp6ekxyjszyhrgmysm)(@glimmer/component@1.1.2(@babel/core@7.27.4))(@glint/template@1.4.1-unstable.34c4510)(rsvp@4.8.5)(webpack@5.99.9(@swc/core@1.11.29)(esbuild@0.25.5)))
'@ember/optional-features':
specifier: ^2.2.0
version: 2.2.0
'@ember/render-modifiers':
specifier: ^3.0.0
version: 3.0.0(@glint/template@1.4.1-unstable.34c4510)(ember-source@5.12.0(patch_hash=xx7mvsb7nmshqkkqhmf45r3hse)(@glimmer/component@1.1.2(@babel/core@7.27.4))(@glint/template@1.4.1-unstable.34c4510)(rsvp@4.8.5)(webpack@5.99.9(@swc/core@1.11.29)(esbuild@0.25.5)))
version: 3.0.0(@glint/template@1.4.1-unstable.34c4510)(ember-source@5.12.0(patch_hash=pqnuctuxbp6ekxyjszyhrgmysm)(@glimmer/component@1.1.2(@babel/core@7.27.4))(@glint/template@1.4.1-unstable.34c4510)(rsvp@4.8.5)(webpack@5.99.9(@swc/core@1.11.29)(esbuild@0.25.5)))
'@ember/string':
specifier: ^4.0.1
version: 4.0.1
@ -506,19 +506,19 @@ importers:
version: 2.1.1(@babel/core@7.27.4)
ember-cached-decorator-polyfill:
specifier: ^1.0.2
version: 1.0.2(@babel/core@7.27.4)(@glint/template@1.4.1-unstable.34c4510)(ember-source@5.12.0(patch_hash=xx7mvsb7nmshqkkqhmf45r3hse)(@glimmer/component@1.1.2(@babel/core@7.27.4))(@glint/template@1.4.1-unstable.34c4510)(rsvp@4.8.5)(webpack@5.99.9(@swc/core@1.11.29)(esbuild@0.25.5)))
version: 1.0.2(@babel/core@7.27.4)(@glint/template@1.4.1-unstable.34c4510)(ember-source@5.12.0(patch_hash=pqnuctuxbp6ekxyjszyhrgmysm)(@glimmer/component@1.1.2(@babel/core@7.27.4))(@glint/template@1.4.1-unstable.34c4510)(rsvp@4.8.5)(webpack@5.99.9(@swc/core@1.11.29)(esbuild@0.25.5)))
ember-cli:
specifier: ~6.4.0
version: 6.4.0(handlebars@4.7.8)(underscore@1.13.7)
ember-cli-app-version:
specifier: ^7.0.0
version: 7.0.0(ember-source@5.12.0(patch_hash=xx7mvsb7nmshqkkqhmf45r3hse)(@glimmer/component@1.1.2(@babel/core@7.27.4))(@glint/template@1.4.1-unstable.34c4510)(rsvp@4.8.5)(webpack@5.99.9(@swc/core@1.11.29)(esbuild@0.25.5)))
version: 7.0.0(ember-source@5.12.0(patch_hash=pqnuctuxbp6ekxyjszyhrgmysm)(@glimmer/component@1.1.2(@babel/core@7.27.4))(@glint/template@1.4.1-unstable.34c4510)(rsvp@4.8.5)(webpack@5.99.9(@swc/core@1.11.29)(esbuild@0.25.5)))
ember-cli-babel:
specifier: ^8.2.0
version: 8.2.0(@babel/core@7.27.4)
ember-cli-deprecation-workflow:
specifier: ^3.3.0
version: 3.3.0(ember-source@5.12.0(patch_hash=xx7mvsb7nmshqkkqhmf45r3hse)(@glimmer/component@1.1.2(@babel/core@7.27.4))(@glint/template@1.4.1-unstable.34c4510)(rsvp@4.8.5)(webpack@5.99.9(@swc/core@1.11.29)(esbuild@0.25.5)))
version: 3.3.0(ember-source@5.12.0(patch_hash=pqnuctuxbp6ekxyjszyhrgmysm)(@glimmer/component@1.1.2(@babel/core@7.27.4))(@glint/template@1.4.1-unstable.34c4510)(rsvp@4.8.5)(webpack@5.99.9(@swc/core@1.11.29)(esbuild@0.25.5)))
ember-cli-htmlbars:
specifier: ^6.3.0
version: 6.3.0
@ -539,10 +539,10 @@ importers:
version: 6.1.1
ember-exam:
specifier: ^9.1.0
version: 9.1.0(@glint/template@1.4.1-unstable.34c4510)(ember-qunit@9.0.3(@ember/test-helpers@5.2.2(@babel/core@7.27.4)(@glint/template@1.4.1-unstable.34c4510))(@glint/template@1.4.1-unstable.34c4510)(qunit@2.24.1))(ember-source@5.12.0(patch_hash=xx7mvsb7nmshqkkqhmf45r3hse)(@glimmer/component@1.1.2(@babel/core@7.27.4))(@glint/template@1.4.1-unstable.34c4510)(rsvp@4.8.5)(webpack@5.99.9(@swc/core@1.11.29)(esbuild@0.25.5)))(qunit@2.24.1)(webpack@5.99.9(@swc/core@1.11.29)(esbuild@0.25.5))
version: 9.1.0(@glint/template@1.4.1-unstable.34c4510)(ember-qunit@9.0.3(@ember/test-helpers@5.2.2(@babel/core@7.27.4)(@glint/template@1.4.1-unstable.34c4510))(@glint/template@1.4.1-unstable.34c4510)(qunit@2.24.1))(ember-source@5.12.0(patch_hash=pqnuctuxbp6ekxyjszyhrgmysm)(@glimmer/component@1.1.2(@babel/core@7.27.4))(@glint/template@1.4.1-unstable.34c4510)(rsvp@4.8.5)(webpack@5.99.9(@swc/core@1.11.29)(esbuild@0.25.5)))(qunit@2.24.1)(webpack@5.99.9(@swc/core@1.11.29)(esbuild@0.25.5))
ember-load-initializers:
specifier: ^3.0.1
version: 3.0.1(ember-source@5.12.0(patch_hash=xx7mvsb7nmshqkkqhmf45r3hse)(@glimmer/component@1.1.2(@babel/core@7.27.4))(@glint/template@1.4.1-unstable.34c4510)(rsvp@4.8.5)(webpack@5.99.9(@swc/core@1.11.29)(esbuild@0.25.5)))
version: 3.0.1(ember-source@5.12.0(patch_hash=pqnuctuxbp6ekxyjszyhrgmysm)(@glimmer/component@1.1.2(@babel/core@7.27.4))(@glint/template@1.4.1-unstable.34c4510)(rsvp@4.8.5)(webpack@5.99.9(@swc/core@1.11.29)(esbuild@0.25.5)))
ember-modifier:
specifier: ^4.2.2
version: 4.2.2(@babel/core@7.27.4)
@ -551,7 +551,7 @@ importers:
version: 9.0.3(@ember/test-helpers@5.2.2(@babel/core@7.27.4)(@glint/template@1.4.1-unstable.34c4510))(@glint/template@1.4.1-unstable.34c4510)(qunit@2.24.1)
ember-source:
specifier: ~5.12.0
version: 5.12.0(patch_hash=xx7mvsb7nmshqkkqhmf45r3hse)(@glimmer/component@1.1.2(@babel/core@7.27.4))(@glint/template@1.4.1-unstable.34c4510)(rsvp@4.8.5)(webpack@5.99.9(@swc/core@1.11.29)(esbuild@0.25.5))
version: 5.12.0(patch_hash=pqnuctuxbp6ekxyjszyhrgmysm)(@glimmer/component@1.1.2(@babel/core@7.27.4))(@glint/template@1.4.1-unstable.34c4510)(rsvp@4.8.5)(webpack@5.99.9(@swc/core@1.11.29)(esbuild@0.25.5))
ember-template-imports:
specifier: ^4.3.0
version: 4.3.0
@ -686,7 +686,7 @@ importers:
version: 4.3.0
ember-this-fallback:
specifier: ^0.4.0
version: 0.4.0(patch_hash=znalyv6akdxlqfpmxunrdi3osa)(ember-cli-htmlbars@6.3.0)(ember-source@5.12.0(patch_hash=xx7mvsb7nmshqkkqhmf45r3hse)(@glimmer/component@1.1.2(@babel/core@7.27.4))(@glint/template@1.4.1-unstable.34c4510)(rsvp@4.8.5)(webpack@5.99.9(@swc/core@1.11.29)(esbuild@0.25.5)))
version: 0.4.0(patch_hash=znalyv6akdxlqfpmxunrdi3osa)(ember-cli-htmlbars@6.3.0)(ember-source@5.12.0(patch_hash=pqnuctuxbp6ekxyjszyhrgmysm)(@glimmer/component@1.1.2(@babel/core@7.27.4))(@glint/template@1.4.1-unstable.34c4510)(rsvp@4.8.5)(webpack@5.99.9(@swc/core@1.11.29)(esbuild@0.25.5)))
devDependencies:
ember-cli:
specifier: ~6.4.0
@ -742,13 +742,13 @@ importers:
version: 1.1.3
ember-load-initializers:
specifier: ^3.0.1
version: 3.0.1(ember-source@5.12.0(patch_hash=xx7mvsb7nmshqkkqhmf45r3hse)(@glimmer/component@1.1.2(@babel/core@7.27.4))(@glint/template@1.4.1-unstable.34c4510)(rsvp@4.8.5)(webpack@5.99.9(@swc/core@1.11.29)(esbuild@0.25.5)))
version: 3.0.1(ember-source@5.12.0(patch_hash=pqnuctuxbp6ekxyjszyhrgmysm)(@glimmer/component@1.1.2(@babel/core@7.27.4))(@glint/template@1.4.1-unstable.34c4510)(rsvp@4.8.5)(webpack@5.99.9(@swc/core@1.11.29)(esbuild@0.25.5)))
ember-resolver:
specifier: ^13.1.1
version: 13.1.1
ember-source:
specifier: ~5.12.0
version: 5.12.0(patch_hash=xx7mvsb7nmshqkkqhmf45r3hse)(@glimmer/component@1.1.2(@babel/core@7.27.4))(@glint/template@1.4.1-unstable.34c4510)(rsvp@4.8.5)(webpack@5.99.9(@swc/core@1.11.29)(esbuild@0.25.5))
version: 5.12.0(patch_hash=pqnuctuxbp6ekxyjszyhrgmysm)(@glimmer/component@1.1.2(@babel/core@7.27.4))(@glint/template@1.4.1-unstable.34c4510)(rsvp@4.8.5)(webpack@5.99.9(@swc/core@1.11.29)(esbuild@0.25.5))
ember-source-channel-url:
specifier: ^3.0.0
version: 3.0.0(encoding@0.1.13)
@ -768,7 +768,7 @@ importers:
version: 7.27.4(supports-color@8.1.1)
'@ember/render-modifiers':
specifier: ^3.0.0
version: 3.0.0(@glint/template@1.4.1-unstable.34c4510)(ember-source@5.12.0(patch_hash=xx7mvsb7nmshqkkqhmf45r3hse)(@glimmer/component@1.1.2(@babel/core@7.27.4))(@glint/template@1.4.1-unstable.34c4510)(rsvp@4.8.5)(webpack@5.99.9(@swc/core@1.11.29)(esbuild@0.25.5)))
version: 3.0.0(@glint/template@1.4.1-unstable.34c4510)(ember-source@5.12.0(patch_hash=pqnuctuxbp6ekxyjszyhrgmysm)(@glimmer/component@1.1.2(@babel/core@7.27.4))(@glint/template@1.4.1-unstable.34c4510)(rsvp@4.8.5)(webpack@5.99.9(@swc/core@1.11.29)(esbuild@0.25.5)))
'@floating-ui/dom':
specifier: ^1.7.1
version: 1.7.1
@ -829,13 +829,13 @@ importers:
version: 1.1.3
ember-load-initializers:
specifier: ^3.0.1
version: 3.0.1(ember-source@5.12.0(patch_hash=xx7mvsb7nmshqkkqhmf45r3hse)(@glimmer/component@1.1.2(@babel/core@7.27.4))(@glint/template@1.4.1-unstable.34c4510)(rsvp@4.8.5)(webpack@5.99.9(@swc/core@1.11.29)(esbuild@0.25.5)))
version: 3.0.1(ember-source@5.12.0(patch_hash=pqnuctuxbp6ekxyjszyhrgmysm)(@glimmer/component@1.1.2(@babel/core@7.27.4))(@glint/template@1.4.1-unstable.34c4510)(rsvp@4.8.5)(webpack@5.99.9(@swc/core@1.11.29)(esbuild@0.25.5)))
ember-resolver:
specifier: ^13.1.1
version: 13.1.1
ember-source:
specifier: ~5.12.0
version: 5.12.0(patch_hash=xx7mvsb7nmshqkkqhmf45r3hse)(@glimmer/component@1.1.2(@babel/core@7.27.4))(@glint/template@1.4.1-unstable.34c4510)(rsvp@4.8.5)(webpack@5.99.9(@swc/core@1.11.29)(esbuild@0.25.5))
version: 5.12.0(patch_hash=pqnuctuxbp6ekxyjszyhrgmysm)(@glimmer/component@1.1.2(@babel/core@7.27.4))(@glint/template@1.4.1-unstable.34c4510)(rsvp@4.8.5)(webpack@5.99.9(@swc/core@1.11.29)(esbuild@0.25.5))
ember-source-channel-url:
specifier: ^3.0.0
version: 3.0.0(encoding@0.1.13)
@ -905,13 +905,13 @@ importers:
version: 1.1.3
ember-load-initializers:
specifier: ^3.0.1
version: 3.0.1(ember-source@5.12.0(patch_hash=xx7mvsb7nmshqkkqhmf45r3hse)(@glimmer/component@1.1.2(@babel/core@7.27.4))(@glint/template@1.4.1-unstable.34c4510)(rsvp@4.8.5)(webpack@5.99.9(@swc/core@1.11.29)(esbuild@0.25.5)))
version: 3.0.1(ember-source@5.12.0(patch_hash=pqnuctuxbp6ekxyjszyhrgmysm)(@glimmer/component@1.1.2(@babel/core@7.27.4))(@glint/template@1.4.1-unstable.34c4510)(rsvp@4.8.5)(webpack@5.99.9(@swc/core@1.11.29)(esbuild@0.25.5)))
ember-resolver:
specifier: ^13.1.1
version: 13.1.1
ember-source:
specifier: ~5.12.0
version: 5.12.0(patch_hash=xx7mvsb7nmshqkkqhmf45r3hse)(@glimmer/component@1.1.2(@babel/core@7.27.4))(@glint/template@1.4.1-unstable.34c4510)(rsvp@4.8.5)(webpack@5.99.9(@swc/core@1.11.29)(esbuild@0.25.5))
version: 5.12.0(patch_hash=pqnuctuxbp6ekxyjszyhrgmysm)(@glimmer/component@1.1.2(@babel/core@7.27.4))(@glint/template@1.4.1-unstable.34c4510)(rsvp@4.8.5)(webpack@5.99.9(@swc/core@1.11.29)(esbuild@0.25.5))
ember-source-channel-url:
specifier: ^3.0.0
version: 3.0.0(encoding@0.1.13)
@ -944,7 +944,7 @@ importers:
version: 2.10.0(@glint/template@1.4.1-unstable.34c4510)(webpack@5.99.9(@swc/core@1.11.29)(esbuild@0.25.5))
ember-cached-decorator-polyfill:
specifier: ^1.0.2
version: 1.0.2(@babel/core@7.27.4)(@glint/template@1.4.1-unstable.34c4510)(ember-source@5.12.0(patch_hash=xx7mvsb7nmshqkkqhmf45r3hse)(@glimmer/component@1.1.2(@babel/core@7.27.4))(@glint/template@1.4.1-unstable.34c4510)(rsvp@4.8.5)(webpack@5.99.9(@swc/core@1.11.29)(esbuild@0.25.5)))
version: 1.0.2(@babel/core@7.27.4)(@glint/template@1.4.1-unstable.34c4510)(ember-source@5.12.0(patch_hash=pqnuctuxbp6ekxyjszyhrgmysm)(@glimmer/component@1.1.2(@babel/core@7.27.4))(@glint/template@1.4.1-unstable.34c4510)(rsvp@4.8.5)(webpack@5.99.9(@swc/core@1.11.29)(esbuild@0.25.5)))
ember-cli-babel:
specifier: ^8.2.0
version: 8.2.0(@babel/core@7.27.4)
@ -999,13 +999,13 @@ importers:
version: 1.1.3
ember-load-initializers:
specifier: ^3.0.1
version: 3.0.1(ember-source@5.12.0(patch_hash=xx7mvsb7nmshqkkqhmf45r3hse)(@glimmer/component@1.1.2(@babel/core@7.27.4))(@glint/template@1.4.1-unstable.34c4510)(rsvp@4.8.5)(webpack@5.99.9(@swc/core@1.11.29)(esbuild@0.25.5)))
version: 3.0.1(ember-source@5.12.0(patch_hash=pqnuctuxbp6ekxyjszyhrgmysm)(@glimmer/component@1.1.2(@babel/core@7.27.4))(@glint/template@1.4.1-unstable.34c4510)(rsvp@4.8.5)(webpack@5.99.9(@swc/core@1.11.29)(esbuild@0.25.5)))
ember-resolver:
specifier: ^13.1.1
version: 13.1.1
ember-source:
specifier: ~5.12.0
version: 5.12.0(patch_hash=xx7mvsb7nmshqkkqhmf45r3hse)(@glimmer/component@1.1.2(@babel/core@7.27.4))(@glint/template@1.4.1-unstable.34c4510)(rsvp@4.8.5)(webpack@5.99.9(@swc/core@1.11.29)(esbuild@0.25.5))
version: 5.12.0(patch_hash=pqnuctuxbp6ekxyjszyhrgmysm)(@glimmer/component@1.1.2(@babel/core@7.27.4))(@glint/template@1.4.1-unstable.34c4510)(rsvp@4.8.5)(webpack@5.99.9(@swc/core@1.11.29)(esbuild@0.25.5))
ember-source-channel-url:
specifier: ^3.0.0
version: 3.0.0(encoding@0.1.13)
@ -1050,10 +1050,10 @@ importers:
version: 6.3.0
ember-source:
specifier: ~5.12.0
version: 5.12.0(patch_hash=xx7mvsb7nmshqkkqhmf45r3hse)(@glimmer/component@1.1.2(@babel/core@7.27.4))(@glint/template@1.4.1-unstable.34c4510)(rsvp@4.8.5)(webpack@5.99.9(@swc/core@1.11.29)(esbuild@0.25.5))
version: 5.12.0(patch_hash=pqnuctuxbp6ekxyjszyhrgmysm)(@glimmer/component@1.1.2(@babel/core@7.27.4))(@glint/template@1.4.1-unstable.34c4510)(rsvp@4.8.5)(webpack@5.99.9(@swc/core@1.11.29)(esbuild@0.25.5))
ember-this-fallback:
specifier: ^0.4.0
version: 0.4.0(patch_hash=znalyv6akdxlqfpmxunrdi3osa)(ember-cli-htmlbars@6.3.0)(ember-source@5.12.0(patch_hash=xx7mvsb7nmshqkkqhmf45r3hse)(@glimmer/component@1.1.2(@babel/core@7.27.4))(@glint/template@1.4.1-unstable.34c4510)(rsvp@4.8.5)(webpack@5.99.9(@swc/core@1.11.29)(esbuild@0.25.5)))
version: 0.4.0(patch_hash=znalyv6akdxlqfpmxunrdi3osa)(ember-cli-htmlbars@6.3.0)(ember-source@5.12.0(patch_hash=pqnuctuxbp6ekxyjszyhrgmysm)(@glimmer/component@1.1.2(@babel/core@7.27.4))(@glint/template@1.4.1-unstable.34c4510)(rsvp@4.8.5)(webpack@5.99.9(@swc/core@1.11.29)(esbuild@0.25.5)))
fastestsmallesttextencoderdecoder:
specifier: ^1.0.22
version: 1.0.22
@ -9730,13 +9730,13 @@ snapshots:

'@ember/edition-utils@1.2.0': {}

'@ember/legacy-built-in-components@0.5.0(@glint/template@1.4.1-unstable.34c4510)(ember-source@5.12.0(patch_hash=xx7mvsb7nmshqkkqhmf45r3hse)(@glimmer/component@1.1.2(@babel/core@7.27.4))(@glint/template@1.4.1-unstable.34c4510)(rsvp@4.8.5)(webpack@5.99.9(@swc/core@1.11.29)(esbuild@0.25.5)))':
'@ember/legacy-built-in-components@0.5.0(@glint/template@1.4.1-unstable.34c4510)(ember-source@5.12.0(patch_hash=pqnuctuxbp6ekxyjszyhrgmysm)(@glimmer/component@1.1.2(@babel/core@7.27.4))(@glint/template@1.4.1-unstable.34c4510)(rsvp@4.8.5)(webpack@5.99.9(@swc/core@1.11.29)(esbuild@0.25.5)))':
dependencies:
'@embroider/macros': 1.16.12(@glint/template@1.4.1-unstable.34c4510)
ember-cli-babel: 7.26.11
ember-cli-htmlbars: 5.7.2
ember-cli-typescript: 4.2.1
ember-source: 5.12.0(patch_hash=xx7mvsb7nmshqkkqhmf45r3hse)(@glimmer/component@1.1.2(@babel/core@7.27.4))(@glint/template@1.4.1-unstable.34c4510)(rsvp@4.8.5)(webpack@5.99.9(@swc/core@1.11.29)(esbuild@0.25.5))
ember-source: 5.12.0(patch_hash=pqnuctuxbp6ekxyjszyhrgmysm)(@glimmer/component@1.1.2(@babel/core@7.27.4))(@glint/template@1.4.1-unstable.34c4510)(rsvp@4.8.5)(webpack@5.99.9(@swc/core@1.11.29)(esbuild@0.25.5))
transitivePeerDependencies:
- '@glint/template'
- supports-color
@ -9752,13 +9752,13 @@ snapshots:
transitivePeerDependencies:
- supports-color

'@ember/render-modifiers@3.0.0(@glint/template@1.4.1-unstable.34c4510)(ember-source@5.12.0(patch_hash=xx7mvsb7nmshqkkqhmf45r3hse)(@glimmer/component@1.1.2(@babel/core@7.27.4))(@glint/template@1.4.1-unstable.34c4510)(rsvp@4.8.5)(webpack@5.99.9(@swc/core@1.11.29)(esbuild@0.25.5)))':
'@ember/render-modifiers@3.0.0(@glint/template@1.4.1-unstable.34c4510)(ember-source@5.12.0(patch_hash=pqnuctuxbp6ekxyjszyhrgmysm)(@glimmer/component@1.1.2(@babel/core@7.27.4))(@glint/template@1.4.1-unstable.34c4510)(rsvp@4.8.5)(webpack@5.99.9(@swc/core@1.11.29)(esbuild@0.25.5)))':
dependencies:
'@babel/core': 7.27.4(supports-color@8.1.1)
'@embroider/macros': 1.16.12(@glint/template@1.4.1-unstable.34c4510)
ember-cli-babel: 8.2.0(@babel/core@7.27.4)
ember-modifier-manager-polyfill: 1.2.0(@babel/core@7.27.4)
ember-source: 5.12.0(patch_hash=xx7mvsb7nmshqkkqhmf45r3hse)(@glimmer/component@1.1.2(@babel/core@7.27.4))(@glint/template@1.4.1-unstable.34c4510)(rsvp@4.8.5)(webpack@5.99.9(@swc/core@1.11.29)(esbuild@0.25.5))
ember-source: 5.12.0(patch_hash=pqnuctuxbp6ekxyjszyhrgmysm)(@glimmer/component@1.1.2(@babel/core@7.27.4))(@glint/template@1.4.1-unstable.34c4510)(rsvp@4.8.5)(webpack@5.99.9(@swc/core@1.11.29)(esbuild@0.25.5))
optionalDependencies:
'@glint/template': 1.4.1-unstable.34c4510
transitivePeerDependencies:
@ -12755,7 +12755,7 @@ snapshots:
- '@babel/core'
- supports-color

ember-cached-decorator-polyfill@1.0.2(@babel/core@7.27.4)(@glint/template@1.4.1-unstable.34c4510)(ember-source@5.12.0(patch_hash=xx7mvsb7nmshqkkqhmf45r3hse)(@glimmer/component@1.1.2(@babel/core@7.27.4))(@glint/template@1.4.1-unstable.34c4510)(rsvp@4.8.5)(webpack@5.99.9(@swc/core@1.11.29)(esbuild@0.25.5))):
ember-cached-decorator-polyfill@1.0.2(@babel/core@7.27.4)(@glint/template@1.4.1-unstable.34c4510)(ember-source@5.12.0(patch_hash=pqnuctuxbp6ekxyjszyhrgmysm)(@glimmer/component@1.1.2(@babel/core@7.27.4))(@glint/template@1.4.1-unstable.34c4510)(rsvp@4.8.5)(webpack@5.99.9(@swc/core@1.11.29)(esbuild@0.25.5))):
dependencies:
'@embroider/macros': 1.16.12(@glint/template@1.4.1-unstable.34c4510)
'@glimmer/tracking': 1.1.2
@ -12763,16 +12763,16 @@ snapshots:
ember-cache-primitive-polyfill: 1.0.1(@babel/core@7.27.4)
ember-cli-babel: 7.26.11
ember-cli-babel-plugin-helpers: 1.1.1
ember-source: 5.12.0(patch_hash=xx7mvsb7nmshqkkqhmf45r3hse)(@glimmer/component@1.1.2(@babel/core@7.27.4))(@glint/template@1.4.1-unstable.34c4510)(rsvp@4.8.5)(webpack@5.99.9(@swc/core@1.11.29)(esbuild@0.25.5))
ember-source: 5.12.0(patch_hash=pqnuctuxbp6ekxyjszyhrgmysm)(@glimmer/component@1.1.2(@babel/core@7.27.4))(@glint/template@1.4.1-unstable.34c4510)(rsvp@4.8.5)(webpack@5.99.9(@swc/core@1.11.29)(esbuild@0.25.5))
transitivePeerDependencies:
- '@babel/core'
- '@glint/template'
- supports-color

ember-cli-app-version@7.0.0(ember-source@5.12.0(patch_hash=xx7mvsb7nmshqkkqhmf45r3hse)(@glimmer/component@1.1.2(@babel/core@7.27.4))(@glint/template@1.4.1-unstable.34c4510)(rsvp@4.8.5)(webpack@5.99.9(@swc/core@1.11.29)(esbuild@0.25.5))):
ember-cli-app-version@7.0.0(ember-source@5.12.0(patch_hash=pqnuctuxbp6ekxyjszyhrgmysm)(@glimmer/component@1.1.2(@babel/core@7.27.4))(@glint/template@1.4.1-unstable.34c4510)(rsvp@4.8.5)(webpack@5.99.9(@swc/core@1.11.29)(esbuild@0.25.5))):
dependencies:
ember-cli-babel: 7.26.11
ember-source: 5.12.0(patch_hash=xx7mvsb7nmshqkkqhmf45r3hse)(@glimmer/component@1.1.2(@babel/core@7.27.4))(@glint/template@1.4.1-unstable.34c4510)(rsvp@4.8.5)(webpack@5.99.9(@swc/core@1.11.29)(esbuild@0.25.5))
ember-source: 5.12.0(patch_hash=pqnuctuxbp6ekxyjszyhrgmysm)(@glimmer/component@1.1.2(@babel/core@7.27.4))(@glint/template@1.4.1-unstable.34c4510)(rsvp@4.8.5)(webpack@5.99.9(@swc/core@1.11.29)(esbuild@0.25.5))
git-repo-info: 2.1.1
transitivePeerDependencies:
- supports-color
@ -12847,11 +12847,11 @@ snapshots:
transitivePeerDependencies:
- supports-color

ember-cli-deprecation-workflow@3.3.0(ember-source@5.12.0(patch_hash=xx7mvsb7nmshqkkqhmf45r3hse)(@glimmer/component@1.1.2(@babel/core@7.27.4))(@glint/template@1.4.1-unstable.34c4510)(rsvp@4.8.5)(webpack@5.99.9(@swc/core@1.11.29)(esbuild@0.25.5))):
ember-cli-deprecation-workflow@3.3.0(ember-source@5.12.0(patch_hash=pqnuctuxbp6ekxyjszyhrgmysm)(@glimmer/component@1.1.2(@babel/core@7.27.4))(@glint/template@1.4.1-unstable.34c4510)(rsvp@4.8.5)(webpack@5.99.9(@swc/core@1.11.29)(esbuild@0.25.5))):
dependencies:
'@babel/core': 7.27.4(supports-color@8.1.1)
ember-cli-babel: 8.2.0(@babel/core@7.27.4)
ember-source: 5.12.0(patch_hash=xx7mvsb7nmshqkkqhmf45r3hse)(@glimmer/component@1.1.2(@babel/core@7.27.4))(@glint/template@1.4.1-unstable.34c4510)(rsvp@4.8.5)(webpack@5.99.9(@swc/core@1.11.29)(esbuild@0.25.5))
ember-source: 5.12.0(patch_hash=pqnuctuxbp6ekxyjszyhrgmysm)(@glimmer/component@1.1.2(@babel/core@7.27.4))(@glint/template@1.4.1-unstable.34c4510)(rsvp@4.8.5)(webpack@5.99.9(@swc/core@1.11.29)(esbuild@0.25.5))
transitivePeerDependencies:
- supports-color

@ -13196,7 +13196,7 @@ snapshots:
transitivePeerDependencies:
- eslint

ember-exam@9.1.0(@glint/template@1.4.1-unstable.34c4510)(ember-qunit@9.0.3(@ember/test-helpers@5.2.2(@babel/core@7.27.4)(@glint/template@1.4.1-unstable.34c4510))(@glint/template@1.4.1-unstable.34c4510)(qunit@2.24.1))(ember-source@5.12.0(patch_hash=xx7mvsb7nmshqkkqhmf45r3hse)(@glimmer/component@1.1.2(@babel/core@7.27.4))(@glint/template@1.4.1-unstable.34c4510)(rsvp@4.8.5)(webpack@5.99.9(@swc/core@1.11.29)(esbuild@0.25.5)))(qunit@2.24.1)(webpack@5.99.9(@swc/core@1.11.29)(esbuild@0.25.5)):
ember-exam@9.1.0(@glint/template@1.4.1-unstable.34c4510)(ember-qunit@9.0.3(@ember/test-helpers@5.2.2(@babel/core@7.27.4)(@glint/template@1.4.1-unstable.34c4510))(@glint/template@1.4.1-unstable.34c4510)(qunit@2.24.1))(ember-source@5.12.0(patch_hash=pqnuctuxbp6ekxyjszyhrgmysm)(@glimmer/component@1.1.2(@babel/core@7.27.4))(@glint/template@1.4.1-unstable.34c4510)(rsvp@4.8.5)(webpack@5.99.9(@swc/core@1.11.29)(esbuild@0.25.5)))(qunit@2.24.1)(webpack@5.99.9(@swc/core@1.11.29)(esbuild@0.25.5)):
dependencies:
'@babel/core': 7.27.4(supports-color@8.1.1)
chalk: 5.4.1
@ -13205,7 +13205,7 @@ snapshots:
ember-auto-import: 2.10.0(@glint/template@1.4.1-unstable.34c4510)(webpack@5.99.9(@swc/core@1.11.29)(esbuild@0.25.5))
ember-cli-babel: 8.2.0(@babel/core@7.27.4)
ember-qunit: 9.0.3(@ember/test-helpers@5.2.2(@babel/core@7.27.4)(@glint/template@1.4.1-unstable.34c4510))(@glint/template@1.4.1-unstable.34c4510)(qunit@2.24.1)
ember-source: 5.12.0(patch_hash=xx7mvsb7nmshqkkqhmf45r3hse)(@glimmer/component@1.1.2(@babel/core@7.27.4))(@glint/template@1.4.1-unstable.34c4510)(rsvp@4.8.5)(webpack@5.99.9(@swc/core@1.11.29)(esbuild@0.25.5))
ember-source: 5.12.0(patch_hash=pqnuctuxbp6ekxyjszyhrgmysm)(@glimmer/component@1.1.2(@babel/core@7.27.4))(@glint/template@1.4.1-unstable.34c4510)(rsvp@4.8.5)(webpack@5.99.9(@swc/core@1.11.29)(esbuild@0.25.5))
execa: 8.0.1
fs-extra: 11.3.0
js-yaml: 4.1.0
@ -13219,9 +13219,9 @@ snapshots:
- supports-color
- webpack

ember-load-initializers@3.0.1(ember-source@5.12.0(patch_hash=xx7mvsb7nmshqkkqhmf45r3hse)(@glimmer/component@1.1.2(@babel/core@7.27.4))(@glint/template@1.4.1-unstable.34c4510)(rsvp@4.8.5)(webpack@5.99.9(@swc/core@1.11.29)(esbuild@0.25.5))):
ember-load-initializers@3.0.1(ember-source@5.12.0(patch_hash=pqnuctuxbp6ekxyjszyhrgmysm)(@glimmer/component@1.1.2(@babel/core@7.27.4))(@glint/template@1.4.1-unstable.34c4510)(rsvp@4.8.5)(webpack@5.99.9(@swc/core@1.11.29)(esbuild@0.25.5))):
dependencies:
ember-source: 5.12.0(patch_hash=xx7mvsb7nmshqkkqhmf45r3hse)(@glimmer/component@1.1.2(@babel/core@7.27.4))(@glint/template@1.4.1-unstable.34c4510)(rsvp@4.8.5)(webpack@5.99.9(@swc/core@1.11.29)(esbuild@0.25.5))
ember-source: 5.12.0(patch_hash=pqnuctuxbp6ekxyjszyhrgmysm)(@glimmer/component@1.1.2(@babel/core@7.27.4))(@glint/template@1.4.1-unstable.34c4510)(rsvp@4.8.5)(webpack@5.99.9(@swc/core@1.11.29)(esbuild@0.25.5))

ember-modifier-manager-polyfill@1.2.0(@babel/core@7.27.4):
dependencies:
@ -13281,7 +13281,7 @@ snapshots:
transitivePeerDependencies:
- encoding

ember-source@5.12.0(patch_hash=xx7mvsb7nmshqkkqhmf45r3hse)(@glimmer/component@1.1.2(@babel/core@7.27.4))(@glint/template@1.4.1-unstable.34c4510)(rsvp@4.8.5)(webpack@5.99.9(@swc/core@1.11.29)(esbuild@0.25.5)):
ember-source@5.12.0(patch_hash=pqnuctuxbp6ekxyjszyhrgmysm)(@glimmer/component@1.1.2(@babel/core@7.27.4))(@glint/template@1.4.1-unstable.34c4510)(rsvp@4.8.5)(webpack@5.99.9(@swc/core@1.11.29)(esbuild@0.25.5)):
dependencies:
'@babel/core': 7.27.4(supports-color@8.1.1)
'@ember/edition-utils': 1.2.0
@ -13394,7 +13394,7 @@ snapshots:
transitivePeerDependencies:
- supports-color

ember-this-fallback@0.4.0(patch_hash=znalyv6akdxlqfpmxunrdi3osa)(ember-cli-htmlbars@6.3.0)(ember-source@5.12.0(patch_hash=xx7mvsb7nmshqkkqhmf45r3hse)(@glimmer/component@1.1.2(@babel/core@7.27.4))(@glint/template@1.4.1-unstable.34c4510)(rsvp@4.8.5)(webpack@5.99.9(@swc/core@1.11.29)(esbuild@0.25.5))):
ember-this-fallback@0.4.0(patch_hash=znalyv6akdxlqfpmxunrdi3osa)(ember-cli-htmlbars@6.3.0)(ember-source@5.12.0(patch_hash=pqnuctuxbp6ekxyjszyhrgmysm)(@glimmer/component@1.1.2(@babel/core@7.27.4))(@glint/template@1.4.1-unstable.34c4510)(rsvp@4.8.5)(webpack@5.99.9(@swc/core@1.11.29)(esbuild@0.25.5))):
dependencies:
'@glimmer/syntax': 0.84.3
babel-plugin-ember-template-compilation: 2.4.1
@ -13402,7 +13402,7 @@ snapshots:
ember-cli-babel: 7.26.11
ember-cli-htmlbars: 6.3.0
ember-cli-typescript: 5.3.0
ember-source: 5.12.0(patch_hash=xx7mvsb7nmshqkkqhmf45r3hse)(@glimmer/component@1.1.2(@babel/core@7.27.4))(@glint/template@1.4.1-unstable.34c4510)(rsvp@4.8.5)(webpack@5.99.9(@swc/core@1.11.29)(esbuild@0.25.5))
ember-source: 5.12.0(patch_hash=pqnuctuxbp6ekxyjszyhrgmysm)(@glimmer/component@1.1.2(@babel/core@7.27.4))(@glint/template@1.4.1-unstable.34c4510)(rsvp@4.8.5)(webpack@5.99.9(@swc/core@1.11.29)(esbuild@0.25.5))
lodash: 4.17.21
winston: 3.14.2
zod: 3.25.48