diff --git a/CLAUDE.md b/CLAUDE.md
new file mode 100644
index 000000000..be3a8d255
--- /dev/null
+++ b/CLAUDE.md
@@ -0,0 +1,76 @@
+# CLAUDE.md
+
+This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository.
+
+## Project Overview
+
+ember-cli-addon-docs is an Ember addon that generates documentation sites for other Ember addons. It provides components for building doc sites, a build pipeline that extracts API docs and search indexes, and a deploy pipeline for GitHub Pages.
+
+## Commands
+
+- **Install:** `pnpm install`
+- **Dev server:** `pnpm start` (serves dummy app at http://localhost:4200)
+- **Build:** `pnpm build`
+- **Lint all:** `pnpm lint`
+- **Lint fix:** `pnpm lint:fix`
+- **Run all tests:** `pnpm test`
+- **Ember tests only:** `pnpm test:ember`
+- **Ember tests in watch mode:** `pnpm test:ember --server`
+- **Node tests only:** `pnpm test:node` (mocha, runs tests in `tests-node/`)
+- **Test app tests:** `pnpm test:test-apps` (runs tests in `test-apps/new-addon`)
+
+Uses pnpm as the package manager. The workspace includes `test-apps/*`.
+
+## Architecture
+
+### Build Pipeline (lib/)
+
+The core build logic lives in `index.js` and `lib/`. During Ember's build process:
+
+1. **`index.js`** — Main addon entry point. Hooks into Ember CLI's `treeForApp`, `treeForAddon`, `treeForPublic`, and `treeForVendor`. Compiles markdown templates, extracts API docs via plugin registry, and builds a search index.
+
+2. **`lib/broccoli/`** — Broccoli plugins for the build pipeline:
+ - `docs-compiler.js` — Compiles extracted API documentation into JSON API format
+ - `search-indexer.js` — Builds a lunr.js search index from docs and template content
+ - `docs-filter.js` / `hbs-content-filter.js` — Broccoli filters for processing files
+
+3. **`lib/preprocessors/`** — Template preprocessors:
+ - `markdown-template-compiler.js` — Compiles `.md` files into Handlebars templates
+ - `hbs-content-extractor.js` — Extracts content from HBS templates for search indexing
+
+4. **`lib/deploy/`** — ember-cli-deploy plugin for deploying docs to GitHub Pages
+
+5. **`lib/models/plugin-registry.js`** — Registry for doc generation plugins (e.g., `ember-cli-addon-docs-yuidoc`)
+
+### Runtime Addon (addon/)
+
+Ember Octane components and services that consuming addons use in their doc sites:
+
+- **Components:** `docs-viewer`, `docs-header`, `docs-hero`, `docs-demo`, `docs-snippet`, `docs-code-highlight`, `api/` (API doc viewer components), etc.
+- **Services:** `docs-routes` (navigation), `docs-search` (lunr-based search), `project-version` (version management)
+- **Styles:** Uses Tailwind CSS 1.x compiled via PostCSS/Sass pipeline
+
+### App Re-exports (app/)
+
+Standard Ember addon pattern — re-exports addon modules into the consuming app's namespace.
+
+### Blueprints (blueprints/)
+
+- `ember-cli-addon-docs` — Default blueprint run on `ember install`
+- `docs-page` — Generator for new documentation pages
+
+### Sandbox (sandbox/)
+
+A "sandbox" addon used as a secondary documented project in the dummy app, demonstrating multi-project documentation support.
+
+### Tests
+
+- `tests/` — Ember tests (acceptance, integration, unit) using QUnit, run via testem in Chrome
+- `tests-node/` — Node.js unit tests using Mocha/Chai for the build pipeline code in `lib/`
+- `test-apps/new-addon` — Separate test app in the pnpm workspace
+
+### Key Concepts
+
+- **Plugin system:** API doc extraction is pluggable via addons with keyword `ember-cli-addon-docs-plugin`. The default plugin is `ember-cli-addon-docs-yuidoc`.
+- **`documentingAddonAt`:** Config option allowing a standalone app (not a dummy app) to document an addon at a specific path.
+- **Version support:** The addon manages doc versions for deployment, with a "latest" version concept (`-latest`).
diff --git a/addon/adapters/-addon-docs.js b/addon/adapters/-addon-docs.js
deleted file mode 100644
index 69dc53679..000000000
--- a/addon/adapters/-addon-docs.js
+++ /dev/null
@@ -1,28 +0,0 @@
-import Adapter from '@ember-data/adapter';
-import { getRootURL } from 'ember-cli-addon-docs/-private/config';
-
-export default class AddonDocsAdapter extends Adapter {
- defaultSerializer = '-addon-docs';
-
- get namespace() {
- return `${getRootURL(this).replace(/\/$/, '')}/docs`;
- }
-
- shouldBackgroundReloadAll() {
- return false;
- }
-
- shouldBackgroundReloadRecord() {
- return false;
- }
-
- findRecord(store, modelClass, id, snapshot) {
- if (modelClass.modelName === 'project') {
- return fetch(`${this.namespace}/${id}.json`).then((response) =>
- response.json(),
- );
- } else {
- return store.peekRecord(modelClass.modelName, id);
- }
- }
-}
diff --git a/addon/adapters/class.js b/addon/adapters/class.js
deleted file mode 100644
index 5688abd77..000000000
--- a/addon/adapters/class.js
+++ /dev/null
@@ -1 +0,0 @@
-export { default } from './-addon-docs';
diff --git a/addon/adapters/component.js b/addon/adapters/component.js
deleted file mode 100644
index 5688abd77..000000000
--- a/addon/adapters/component.js
+++ /dev/null
@@ -1 +0,0 @@
-export { default } from './-addon-docs';
diff --git a/addon/adapters/module.js b/addon/adapters/module.js
deleted file mode 100644
index 5688abd77..000000000
--- a/addon/adapters/module.js
+++ /dev/null
@@ -1 +0,0 @@
-export { default } from './-addon-docs';
diff --git a/addon/adapters/project.js b/addon/adapters/project.js
deleted file mode 100644
index 5688abd77..000000000
--- a/addon/adapters/project.js
+++ /dev/null
@@ -1 +0,0 @@
-export { default } from './-addon-docs';
diff --git a/addon/components/api/x-class/index.js b/addon/components/api/x-class/index.js
index e0d390c80..2e954a815 100644
--- a/addon/components/api/x-class/index.js
+++ b/addon/components/api/x-class/index.js
@@ -1,8 +1,7 @@
import Component from '@glimmer/component';
import { tracked } from '@glimmer/tracking';
-import { or } from '@ember/object/computed';
import { capitalize } from '../../../utils/string';
-import { memberFilter } from '../../../utils/computed';
+import { filterMembers } from '../../../utils/computed';
import { addonDocsConfig } from 'ember-cli-addon-docs/-private/config';
export default class XClass extends Component {
@@ -13,22 +12,27 @@ export default class XClass extends Component {
@tracked showPrivate = false;
@tracked showDeprecated = false;
- @memberFilter('args.class', 'accessors')
- accessors;
+ get accessors() {
+ return filterMembers(this.args.class, 'accessors', this);
+ }
- @memberFilter('args.class', 'methods')
- methods;
+ get methods() {
+ return filterMembers(this.args.class, 'methods', this);
+ }
- @memberFilter('args.class', 'fields')
- fields;
+ get fields() {
+ return filterMembers(this.args.class, 'fields', this);
+ }
- @or(
- 'component.hasInherited',
- 'component.hasProtected',
- 'component.hasPrivate',
- 'component.hasDeprecated',
- )
- hasToggles;
+ get hasToggles() {
+ let klass = this.args.class;
+ return !!(
+ klass.hasInherited ||
+ klass.hasProtected ||
+ klass.hasPrivate ||
+ klass.hasDeprecated
+ );
+ }
get hasContents() {
let klass = this.args.class;
diff --git a/addon/components/api/x-component/index.js b/addon/components/api/x-component/index.js
index 4c15e8553..d3fdc09de 100644
--- a/addon/components/api/x-component/index.js
+++ b/addon/components/api/x-component/index.js
@@ -1,9 +1,8 @@
import Component from '@glimmer/component';
import { tracked } from '@glimmer/tracking';
import { action } from '@ember/object';
-import { alias, or } from '@ember/object/computed';
import { capitalize } from '../../../utils/string';
-import { memberFilter } from '../../../utils/computed';
+import { filterMembers } from '../../../utils/computed';
export default class XComponent extends Component {
@tracked showInherited = false;
@@ -12,29 +11,36 @@ export default class XComponent extends Component {
@tracked showPrivate = false;
@tracked showDeprecated = false;
- @alias('args.component.overloadedYields')
- yields;
+ get yields() {
+ return this.args.component.overloadedYields;
+ }
- @memberFilter('args.component', 'arguments')
- arguments;
+ get arguments() {
+ return filterMembers(this.args.component, 'arguments', this);
+ }
- @memberFilter('args.component', 'accessors')
- accessors;
+ get accessors() {
+ return filterMembers(this.args.component, 'accessors', this);
+ }
- @memberFilter('args.component', 'methods')
- methods;
+ get methods() {
+ return filterMembers(this.args.component, 'methods', this);
+ }
- @memberFilter('args.component', 'fields')
- fields;
+ get fields() {
+ return filterMembers(this.args.component, 'fields', this);
+ }
- @or(
- 'args.component.hasInherited',
- 'args.component.hasInternal',
- 'args.component.hasProtected',
- 'args.component.hasPrivate',
- 'args.component.hasDeprecated',
- )
- hasToggles;
+ get hasToggles() {
+ let c = this.args.component;
+ return !!(
+ c.hasInherited ||
+ c.hasInternal ||
+ c.hasProtected ||
+ c.hasPrivate ||
+ c.hasDeprecated
+ );
+ }
get hasContents() {
let component = this.args.component;
diff --git a/addon/components/docs-header/search-box/index.js b/addon/components/docs-header/search-box/index.js
index 3ebf1f5f7..423216975 100644
--- a/addon/components/docs-header/search-box/index.js
+++ b/addon/components/docs-header/search-box/index.js
@@ -6,7 +6,7 @@ import { formElementHasFocus } from 'ember-cli-addon-docs/keyboard-config';
import { addonDocsConfig } from 'ember-cli-addon-docs/-private/config';
export default class DocsHeaderSearchBox extends Component {
- @service store;
+ @service docsStore;
constructor() {
super(...arguments);
@@ -16,13 +16,8 @@ export default class DocsHeaderSearchBox extends Component {
@addonDocsConfig config;
- // TODO: The searchbox doesn't work without the project being fetched.
- // We should move this logic (and everywhere else in the code that's fetching
- // the project) within a new addonDocs service that wires all that up together.
- // I think it's fine if our Docs-* components assume there is a single global
- // project.
fetchProject = task(async () => {
- await this.store.findRecord('project', this.config.projectName);
+ await this.docsStore.findRecord('project', this.config.projectName);
});
@action
diff --git a/addon/components/docs-header/search-results/index.js b/addon/components/docs-header/search-results/index.js
index e66c285a0..cdc2b29b3 100644
--- a/addon/components/docs-header/search-results/index.js
+++ b/addon/components/docs-header/search-results/index.js
@@ -10,7 +10,7 @@ import { addonDocsConfig } from 'ember-cli-addon-docs/-private/config';
export default class DocsHeaderSearchResults extends Component {
@service docsSearch;
@service router;
- @service store;
+ @service docsStore;
@tracked selectedIndex = null;
@tracked rawSearchResults = [];
@@ -25,7 +25,7 @@ export default class DocsHeaderSearchResults extends Component {
}
get project() {
- return this.store.peekRecord('project', this.config.projectName);
+ return this.docsStore.peekRecord('project', this.config.projectName);
}
get trimmedQuery() {
@@ -91,12 +91,11 @@ export default class DocsHeaderSearchResults extends Component {
}
})
- // Add a reference to the Ember Data model to each API item search result
+ // Add a reference to the model to each API item search result
.map((searchResult) => {
let { document } = searchResult;
if (document.type !== 'template') {
- let store = this.store;
- searchResult.model = store.peekRecord(
+ searchResult.model = this.docsStore.peekRecord(
document.type,
document.item.id,
);
diff --git a/addon/components/docs-viewer/x-autogenerated-api-docs/index.js b/addon/components/docs-viewer/x-autogenerated-api-docs/index.js
index d1dee83ba..13f1f6e1f 100644
--- a/addon/components/docs-viewer/x-autogenerated-api-docs/index.js
+++ b/addon/components/docs-viewer/x-autogenerated-api-docs/index.js
@@ -4,7 +4,7 @@ import Component from '@glimmer/component';
import { set as _set } from 'lodash';
export default class XAutogeneratedApiDocs extends Component {
- @service store;
+ @service docsStore;
@readOnly('args.project.navigationIndex')
sections;
diff --git a/addon/components/docs-viewer/x-nav/index.js b/addon/components/docs-viewer/x-nav/index.js
index 93143e3c2..e2f9bdb90 100644
--- a/addon/components/docs-viewer/x-nav/index.js
+++ b/addon/components/docs-viewer/x-nav/index.js
@@ -12,7 +12,7 @@ export default class XNav extends Component {
@localCopy('args.root', 'docs')
root;
- @service store;
+ @service docsStore;
@tracked isShowingMenu;
@@ -31,6 +31,6 @@ export default class XNav extends Component {
return this.args.project;
}
- return this.store.peekRecord('project', this.config.projectName);
+ return this.docsStore.peekRecord('project', this.config.projectName);
}
}
diff --git a/addon/models/class.js b/addon/models/class.js
index b7e5ea53b..9a394d374 100644
--- a/addon/models/class.js
+++ b/addon/models/class.js
@@ -1,135 +1,175 @@
-import Model, { attr, belongsTo } from '@ember-data/model';
-import { filterBy, or, union } from '@ember/object/computed';
-import { memberUnion, hasMemberType } from '../utils/computed';
-
-export default class Class extends Model {
- @belongsTo('class', { async: false, inverse: null, polymorphic: false })
- parentClass;
-
- isClass = true;
-
- @attr
- name;
-
- @attr
- file;
-
- @attr
- exportType;
-
- @attr
- description;
-
- @attr
- lineNumber;
-
- @attr
- access;
-
- @attr
- accessors;
-
- @attr
- methods;
-
- @attr
- fields;
-
- @attr
- tags;
-
- @filterBy('accessors', 'access', 'public')
- publicAccessors;
-
- @filterBy('methods', 'access', 'public')
- publicMethods;
-
- @filterBy('fields', 'access', 'public')
- publicFields;
-
- @filterBy('accessors', 'access', 'private')
- privateAccessors;
-
- @filterBy('methods', 'access', 'private')
- privateMethods;
-
- @filterBy('fields', 'access', 'private')
- privateFields;
-
- @filterBy('accessors', 'access', 'protected')
- protectedAccessors;
-
- @filterBy('methods', 'access', 'protected')
- protectedMethods;
-
- @filterBy('fields', 'access', 'protected')
- protectedFields;
-
- @memberUnion('parentClass.allPublicAccessors', 'publicAccessors')
- allPublicAccessors;
-
- @memberUnion('parentClass.allPublicMethods', 'publicMethods')
- allPublicMethods;
-
- @memberUnion('parentClass.allPublicFields', 'publicFields')
- allPublicFields;
-
- @memberUnion('parentClass.allPrivateAccessors', 'privateAccessors')
- allPrivateAccessors;
-
- @memberUnion('parentClass.allPrivateMethods', 'privateMethods')
- allPrivateMethods;
-
- @memberUnion('parentClass.allPrivateFields', 'privateFields')
- allPrivateFields;
-
- @memberUnion('parentClass.allProtectedAccessors', 'protectedAccessors')
- allProtectedAccessors;
-
- @memberUnion('parentClass.allProtectedMethods', 'protectedMethods')
- allProtectedMethods;
-
- @memberUnion('parentClass.allProtectedFields', 'protectedFields')
- allProtectedFields;
-
- @union('allPublicAccessors', 'allPrivateAccessors', 'allProtectedAccessors')
- allAccessors;
-
- @union('allPublicMethods', 'allPrivateMethods', 'allProtectedMethods')
- allMethods;
-
- @union('allPublicFields', 'allPrivateFields', 'allProtectedFields')
- allFields;
-
- @or(
- 'parentClass.allAccessors.length',
- 'parentClass.allMethods.length',
- 'parentClass.allFields.length',
- )
- hasInherited;
+function filterBy(array, key, value) {
+ return (array || []).filter((item) => item[key] === value);
+}
- @or(
- 'allPrivateAccessors.length',
- 'allPrivateMethods.length',
- 'allPrivateFields.length',
- )
- hasPrivate;
+function memberUnionFn(parentMembers, childMembers) {
+ if (!parentMembers) return childMembers || [];
+
+ let union = {};
+ for (let member of parentMembers) {
+ union[member.name] = member;
+ }
+ for (let member of childMembers || []) {
+ union[member.name] = member;
+ }
+ return Object.values(union);
+}
- @or(
- 'allProtectedAccessors.length',
- 'allProtectedMethods.length',
- 'allProtectedFields.length',
- )
- hasProtected;
+export default class Class {
+ id = null;
+ parentClass = null;
- @hasMemberType(
- 'allFields',
- 'allAccessors',
- 'allMethods',
+ isClass = true;
- function (member) {
- return member.tags && member.tags.find((t) => t.name === 'deprecated');
- },
- )
- hasDeprecated;
+ name = null;
+ file = null;
+ exportType = null;
+ description = null;
+ lineNumber = null;
+ access = null;
+ accessors = null;
+ methods = null;
+ fields = null;
+ tags = null;
+
+ get publicAccessors() {
+ return filterBy(this.accessors, 'access', 'public');
+ }
+ get publicMethods() {
+ return filterBy(this.methods, 'access', 'public');
+ }
+ get publicFields() {
+ return filterBy(this.fields, 'access', 'public');
+ }
+
+ get privateAccessors() {
+ return filterBy(this.accessors, 'access', 'private');
+ }
+ get privateMethods() {
+ return filterBy(this.methods, 'access', 'private');
+ }
+ get privateFields() {
+ return filterBy(this.fields, 'access', 'private');
+ }
+
+ get protectedAccessors() {
+ return filterBy(this.accessors, 'access', 'protected');
+ }
+ get protectedMethods() {
+ return filterBy(this.methods, 'access', 'protected');
+ }
+ get protectedFields() {
+ return filterBy(this.fields, 'access', 'protected');
+ }
+
+ get allPublicAccessors() {
+ return memberUnionFn(
+ this.parentClass?.allPublicAccessors,
+ this.publicAccessors,
+ );
+ }
+ get allPublicMethods() {
+ return memberUnionFn(
+ this.parentClass?.allPublicMethods,
+ this.publicMethods,
+ );
+ }
+ get allPublicFields() {
+ return memberUnionFn(this.parentClass?.allPublicFields, this.publicFields);
+ }
+
+ get allPrivateAccessors() {
+ return memberUnionFn(
+ this.parentClass?.allPrivateAccessors,
+ this.privateAccessors,
+ );
+ }
+ get allPrivateMethods() {
+ return memberUnionFn(
+ this.parentClass?.allPrivateMethods,
+ this.privateMethods,
+ );
+ }
+ get allPrivateFields() {
+ return memberUnionFn(
+ this.parentClass?.allPrivateFields,
+ this.privateFields,
+ );
+ }
+
+ get allProtectedAccessors() {
+ return memberUnionFn(
+ this.parentClass?.allProtectedAccessors,
+ this.protectedAccessors,
+ );
+ }
+ get allProtectedMethods() {
+ return memberUnionFn(
+ this.parentClass?.allProtectedMethods,
+ this.protectedMethods,
+ );
+ }
+ get allProtectedFields() {
+ return memberUnionFn(
+ this.parentClass?.allProtectedFields,
+ this.protectedFields,
+ );
+ }
+
+ get allAccessors() {
+ return [
+ ...this.allPublicAccessors,
+ ...this.allPrivateAccessors,
+ ...this.allProtectedAccessors,
+ ];
+ }
+ get allMethods() {
+ return [
+ ...this.allPublicMethods,
+ ...this.allPrivateMethods,
+ ...this.allProtectedMethods,
+ ];
+ }
+ get allFields() {
+ return [
+ ...this.allPublicFields,
+ ...this.allPrivateFields,
+ ...this.allProtectedFields,
+ ];
+ }
+
+ get hasInherited() {
+ return !!(
+ this.parentClass?.allAccessors?.length ||
+ this.parentClass?.allMethods?.length ||
+ this.parentClass?.allFields?.length
+ );
+ }
+
+ get hasPrivate() {
+ return !!(
+ this.allPrivateAccessors.length ||
+ this.allPrivateMethods.length ||
+ this.allPrivateFields.length
+ );
+ }
+
+ get hasProtected() {
+ return !!(
+ this.allProtectedAccessors.length ||
+ this.allProtectedMethods.length ||
+ this.allProtectedFields.length
+ );
+ }
+
+ get hasDeprecated() {
+ let isDeprecated = (member) =>
+ member.tags && member.tags.find((t) => t.name === 'deprecated');
+
+ return (
+ this.allFields.some(isDeprecated) ||
+ this.allAccessors.some(isDeprecated) ||
+ this.allMethods.some(isDeprecated)
+ );
+ }
}
diff --git a/addon/models/component.js b/addon/models/component.js
index c8008c589..cc430699e 100644
--- a/addon/models/component.js
+++ b/addon/models/component.js
@@ -1,92 +1,114 @@
-import { attr } from '@ember-data/model';
-import { filterBy, or } from '@ember/object/computed';
import { dasherize } from '../utils/string';
-
import Class from './class';
-import { memberUnion, hasMemberType } from '../utils/computed';
+
+function filterBy(array, key, value) {
+ return (array || []).filter((item) => item[key] === value);
+}
+
+function memberUnionFn(parentMembers, childMembers) {
+ if (!parentMembers) return childMembers || [];
+
+ let union = {};
+ for (let member of parentMembers) {
+ union[member.name] = member;
+ }
+ for (let member of childMembers || []) {
+ union[member.name] = member;
+ }
+ return Object.values(union);
+}
export default class Component extends Class {
isComponent = true;
- @attr
- yields;
-
- @attr
- arguments;
-
- @or('yields', 'inheritedYields')
- overloadedYields;
-
- @filterBy('arguments', 'access', 'public')
- publicArguments;
-
- @filterBy('arguments', 'access', 'private')
- privateArguments;
-
- @filterBy('arguments', 'access', 'protected')
- protectedArguments;
-
- @memberUnion('parentClass.allPublicArguments', 'publicArguments')
- allPublicArguments;
-
- @memberUnion('parentClass.allPrivateArguments', 'privateArguments')
- allPrivateArguments;
-
- @memberUnion('parentClass.allProtectedArguments', 'protectedArguments')
- allProtectedArguments;
-
- @memberUnion('parentClass.allArguments', 'arguments')
- allArguments;
-
- @or(
- 'parentClass.overloadedYields.length',
- 'parentClass.allArguments.length',
- 'parentClass.allAccessors.length',
- 'parentClass.allMethods.length',
- 'parentClass.allFields.length',
- )
- hasInherited;
-
- @or('allAccessors.length', 'allMethods.length', 'allFields.length')
- hasInternal;
-
- @or(
- 'allPrivateAccessors.length',
- 'allPrivateArguments.length',
- 'allPrivateMethods.length',
- 'allPrivateFields.length',
- )
- hasPrivate;
-
- @or(
- 'allProtectedAccessors.length',
- 'allProtectedArguments.length',
- 'allProtectedMethods.length',
- 'allProtectedFields.length',
- )
- hasProtected;
-
- @hasMemberType(
- 'allAccessors',
- 'allArguments',
- 'allMethods',
- 'allFields',
-
- function (member) {
- return member.tags && member.tags.find((t) => t.name === 'deprecated');
- },
- )
- hasDeprecated;
-
- /*
- This gives us a way to link to a model, since we don't always link by the actual ID:
-
-
- Go to item
-
-
- Possible refactoring is to always link by actual ID, and implement redirects.
- */
+ yields = null;
+ arguments = null;
+
+ get overloadedYields() {
+ return this.yields || this.inheritedYields;
+ }
+
+ get publicArguments() {
+ return filterBy(this.arguments, 'access', 'public');
+ }
+ get privateArguments() {
+ return filterBy(this.arguments, 'access', 'private');
+ }
+ get protectedArguments() {
+ return filterBy(this.arguments, 'access', 'protected');
+ }
+
+ get allPublicArguments() {
+ return memberUnionFn(
+ this.parentClass?.allPublicArguments,
+ this.publicArguments,
+ );
+ }
+ get allPrivateArguments() {
+ return memberUnionFn(
+ this.parentClass?.allPrivateArguments,
+ this.privateArguments,
+ );
+ }
+ get allProtectedArguments() {
+ return memberUnionFn(
+ this.parentClass?.allProtectedArguments,
+ this.protectedArguments,
+ );
+ }
+
+ get allArguments() {
+ return memberUnionFn(this.parentClass?.allArguments, this.arguments);
+ }
+
+ get hasInherited() {
+ return !!(
+ this.parentClass?.overloadedYields?.length ||
+ this.parentClass?.allArguments?.length ||
+ this.parentClass?.allAccessors?.length ||
+ this.parentClass?.allMethods?.length ||
+ this.parentClass?.allFields?.length
+ );
+ }
+
+ get hasInternal() {
+ return !!(
+ this.allAccessors.length ||
+ this.allMethods.length ||
+ this.allFields.length
+ );
+ }
+
+ get hasPrivate() {
+ return !!(
+ this.allPrivateAccessors.length ||
+ this.allPrivateArguments.length ||
+ this.allPrivateMethods.length ||
+ this.allPrivateFields.length
+ );
+ }
+
+ get hasProtected() {
+ return !!(
+ this.allProtectedAccessors.length ||
+ this.allProtectedArguments.length ||
+ this.allProtectedMethods.length ||
+ this.allProtectedFields.length
+ );
+ }
+
+ get hasDeprecated() {
+ let isDeprecated = (member) =>
+ member.tags && member.tags.find((t) => t.name === 'deprecated');
+
+ return (
+ this.allAccessors.some(isDeprecated) ||
+ this.allArguments.some(isDeprecated) ||
+ this.allMethods.some(isDeprecated) ||
+ this.allFields.some(isDeprecated)
+ );
+ }
+
get routingId() {
return `components/${dasherize(this.name)}`;
}
diff --git a/addon/models/module.js b/addon/models/module.js
index eb40ea0b9..5802b7229 100644
--- a/addon/models/module.js
+++ b/addon/models/module.js
@@ -1,30 +1,11 @@
-import Model, { attr, hasMany } from '@ember-data/model';
+export default class Module {
+ id = null;
+ file = null;
+ variables = null;
+ functions = null;
+ classes = null;
+ components = null;
-export default class Module extends Model {
- @attr
- file;
-
- @attr
- variables;
-
- @attr
- functions;
-
- @hasMany('class', { async: false, inverse: null, polymorphic: true })
- classes;
-
- @hasMany('class', { async: false, inverse: null, polymorphic: true })
- components;
-
- /*
- This gives us a way to link to a model, since we don't always link by the actual ID:
-
-
- Go to item
-
-
- Possible refactoring is to always link by actual ID, and implement redirects.
- */
get routingId() {
return `modules/${this.id}`;
}
diff --git a/addon/models/project.js b/addon/models/project.js
index 4186a39c0..a5981ed26 100644
--- a/addon/models/project.js
+++ b/addon/models/project.js
@@ -1,18 +1,8 @@
-import Model, { attr, hasMany } from '@ember-data/model';
-
-export default class Project extends Model {
- @attr
- name;
-
- @attr
- githubUrl;
-
- @attr
- version;
-
- @attr
- navigationIndex;
-
- @hasMany('module', { async: false, inverse: null, polymorphic: false })
- modules;
+export default class Project {
+ id = null;
+ name = null;
+ githubUrl = null;
+ version = null;
+ navigationIndex = null;
+ modules = null;
}
diff --git a/addon/routes/docs.js b/addon/routes/docs.js
index 85927ccbd..779bb07c3 100644
--- a/addon/routes/docs.js
+++ b/addon/routes/docs.js
@@ -3,10 +3,10 @@ import { inject as service } from '@ember/service';
import { getAddonDocsConfig } from 'ember-cli-addon-docs/-private/config';
export default class DocsRoute extends Route {
- @service store;
+ @service docsStore;
model() {
- return this.store.findRecord(
+ return this.docsStore.findRecord(
'project',
getAddonDocsConfig(this).projectName,
);
diff --git a/addon/routes/docs/api/item.js b/addon/routes/docs/api/item.js
index bbca9c198..b819f1133 100644
--- a/addon/routes/docs/api/item.js
+++ b/addon/routes/docs/api/item.js
@@ -3,7 +3,7 @@ import { inject as service } from '@ember/service';
import { assert } from '@ember/debug';
export default class DocsApiRoute extends Route {
- @service store;
+ @service docsStore;
model({ path }) {
let item;
@@ -13,11 +13,11 @@ export default class DocsApiRoute extends Route {
let itemId = path.replace(/^modules\//, '');
let [moduleId] = itemId.split(/~|#/);
- let module = this.store.peekRecord('module', moduleId);
+ let module = this.docsStore.peekRecord('module', moduleId);
item =
- module.get('components').find((component) => component.id === itemId) ||
- module.get('classes').find((_class) => _class.id === itemId) ||
+ module.components.find((component) => component.id === itemId) ||
+ module.classes.find((_class) => _class.id === itemId) ||
module;
} else {
// Create a regex that will match modules by either the path, or the
@@ -25,25 +25,23 @@ export default class DocsApiRoute extends Route {
let type = path.match(/^([\w-]*)s\//)[1];
let pathRegex = new RegExp(`${path}(/${type})?$`);
- let modules = this.store.peekAll('module');
+ let modules = this.docsStore.peekAll('module');
let matches = modules.filter((m) => m.id.match(pathRegex));
let module = matches[0];
assert(`no modules match the path '${path}'`, matches.length > 0);
assert(
`multiple modules match the path '${path}', ids: ${matches
- .mapBy('id')
+ .map((m) => m.id)
.join(', ')}`,
matches.length <= 1,
);
item =
- module
- .get('components')
- .find((component) => component.exportType === 'default') ||
- module
- .get('classes')
- .find((_class) => _class.exportType === 'default') ||
+ module.components.find(
+ (component) => component.exportType === 'default',
+ ) ||
+ module.classes.find((_class) => _class.exportType === 'default') ||
module;
}
diff --git a/addon/serializers/-addon-docs.js b/addon/serializers/-addon-docs.js
deleted file mode 100644
index 634d78822..000000000
--- a/addon/serializers/-addon-docs.js
+++ /dev/null
@@ -1,7 +0,0 @@
-import Serializer from '@ember-data/serializer';
-
-export default class AddonDocsSerializer extends Serializer {
- normalizeResponse(store, primaryModelClass, payload) {
- return payload;
- }
-}
diff --git a/addon/serializers/class.js b/addon/serializers/class.js
deleted file mode 100644
index 5688abd77..000000000
--- a/addon/serializers/class.js
+++ /dev/null
@@ -1 +0,0 @@
-export { default } from './-addon-docs';
diff --git a/addon/serializers/component.js b/addon/serializers/component.js
deleted file mode 100644
index 5688abd77..000000000
--- a/addon/serializers/component.js
+++ /dev/null
@@ -1 +0,0 @@
-export { default } from './-addon-docs';
diff --git a/addon/serializers/module.js b/addon/serializers/module.js
deleted file mode 100644
index 5688abd77..000000000
--- a/addon/serializers/module.js
+++ /dev/null
@@ -1 +0,0 @@
-export { default } from './-addon-docs';
diff --git a/addon/serializers/project.js b/addon/serializers/project.js
deleted file mode 100644
index 5688abd77..000000000
--- a/addon/serializers/project.js
+++ /dev/null
@@ -1 +0,0 @@
-export { default } from './-addon-docs';
diff --git a/addon/services/docs-store.js b/addon/services/docs-store.js
new file mode 100644
index 000000000..f90ca998f
--- /dev/null
+++ b/addon/services/docs-store.js
@@ -0,0 +1,118 @@
+import Service from '@ember/service';
+import { tracked } from '@glimmer/tracking';
+import { getRootURL } from 'ember-cli-addon-docs/-private/config';
+
+import Project from '../models/project';
+import Module from '../models/module';
+import Class from '../models/class';
+import Component from '../models/component';
+
+const MODEL_CLASSES = {
+ project: Project,
+ module: Module,
+ class: Class,
+ component: Component,
+};
+
+/**
+ * A lightweight store that replaces ember-data for loading and caching
+ * documentation JSON. Fetches JSON API payloads from the build output
+ * and deserializes them into plain tracked objects.
+ */
+export default class DocsStoreService extends Service {
+ @tracked _records = {
+ project: {},
+ module: {},
+ class: {},
+ component: {},
+ };
+
+ _fetches = {};
+
+ async findRecord(type, id) {
+ let existing = this._records[type]?.[id];
+ if (existing) return existing;
+
+ if (type === 'project') {
+ if (!this._fetches[id]) {
+ this._fetches[id] = this._fetchProject(id);
+ }
+ return this._fetches[id];
+ }
+
+ return null;
+ }
+
+ peekRecord(type, id) {
+ return this._records[type]?.[id] || null;
+ }
+
+ peekAll(type) {
+ return Object.values(this._records[type] || {});
+ }
+
+ async _fetchProject(id) {
+ let namespace = `${getRootURL(this).replace(/\/$/, '')}/docs`;
+ let url = `${namespace}/${id}.json`;
+
+ let response = await fetch(url);
+ let payload = await response.json();
+
+ this._loadPayload(payload);
+
+ return this._records.project[id];
+ }
+
+ _loadPayload(payload) {
+ let allRecords = [];
+
+ // Collect data (can be single or array)
+ let dataItems = Array.isArray(payload.data) ? payload.data : [payload.data];
+ allRecords.push(...dataItems);
+
+ // Collect included
+ if (payload.included) {
+ allRecords.push(...payload.included);
+ }
+
+ // First pass: create all record instances with attributes
+ for (let raw of allRecords) {
+ let { type, id, attributes } = raw;
+ if (!MODEL_CLASSES[type]) continue;
+
+ let ModelClass = MODEL_CLASSES[type];
+ let record = new ModelClass();
+ record.id = id;
+
+ if (attributes) {
+ for (let [key, value] of Object.entries(attributes)) {
+ record[key] = value;
+ }
+ }
+
+ this._records[type][id] = record;
+ }
+
+ // Second pass: resolve relationships
+ for (let raw of allRecords) {
+ let { type, id, relationships } = raw;
+ if (!relationships || !this._records[type]?.[id]) continue;
+
+ let record = this._records[type][id];
+ for (let [key, rel] of Object.entries(relationships)) {
+ if (rel.data === null || rel.data === undefined) {
+ record[key] = null;
+ } else if (Array.isArray(rel.data)) {
+ record[key] = rel.data
+ .map((ref) => this._records[ref.type]?.[ref.id])
+ .filter(Boolean);
+ } else {
+ record[key] = this._records[rel.data.type]?.[rel.data.id] || null;
+ }
+ }
+ }
+
+ // Trigger reactivity update
+ this._records = { ...this._records };
+ }
+}
diff --git a/addon/utils/computed.js b/addon/utils/computed.js
index 16ad61c0e..fcf3a26a0 100644
--- a/addon/utils/computed.js
+++ b/addon/utils/computed.js
@@ -1,37 +1,5 @@
-import { computed, get } from '@ember/object';
import { capitalize } from './string';
-/**
- @function initialize
- @hide
-*/
-export function memberUnion(parentMembersKey, childMembersKey) {
- return computed(
- `${parentMembersKey}.[]`,
- `${childMembersKey}.[]`,
- function () {
- let parentMembers = get(this, parentMembersKey);
- let childMembers = get(this, childMembersKey);
-
- if (!parentMembers) {
- return childMembers;
- }
-
- let union = {};
-
- for (let member of parentMembers) {
- union[member.name] = member;
- }
-
- for (let member of childMembers) {
- union[member.name] = member;
- }
-
- return Object.values(union);
- },
- );
-}
-
function memberSort(a, b) {
if (a.isStatic && !b.isStatic) {
return -1;
@@ -55,78 +23,55 @@ function memberSort(a, b) {
}
/**
- @function initialize
- @hide
-*/
-export function memberFilter(classKey, memberType) {
- return computed(
- classKey,
- 'showInherited',
- 'showInternal',
- 'showProtected',
- 'showPrivate',
- 'showDeprecated',
- function () {
- let klass = get(this, classKey);
- let showInternal = this.showInternal;
- let showInherited = this.showInherited;
- let showProtected = this.showProtected;
- let showPrivate = this.showPrivate;
- let showDeprecated = this.showDeprecated;
-
- let members = [];
-
- if (showInternal === false && memberType !== 'arguments') {
- return members;
- }
-
- let capitalKey = capitalize(memberType);
-
- let publicMembers = showInherited
- ? klass.get(`allPublic${capitalKey}`)
- : klass.get(`public${capitalKey}`);
- let privateMembers = showInherited
- ? klass.get(`allPrivate${capitalKey}`)
- : klass.get(`private${capitalKey}`);
- let protectedMembers = showInherited
- ? klass.get(`allProtected${capitalKey}`)
- : klass.get(`protected${capitalKey}`);
-
- members.push(...publicMembers);
-
- if (showPrivate) {
- members.push(...privateMembers);
- }
-
- if (showProtected) {
- members.push(...protectedMembers);
- }
-
- if (!showDeprecated) {
- members = members.filter((m) => {
- return !m.tags || !m.tags.find((t) => t.name === 'deprecated');
- });
- }
-
- return members.sort(memberSort);
- },
- );
-}
+ * Filters members of a class/component based on the current toggle state.
+ *
+ * @param {Object} klass - The class or component model
+ * @param {string} memberType - The type of member ('accessors', 'methods', 'fields', 'arguments')
+ * @param {Object} context - The component context with showInherited, showPrivate, etc.
+ * @returns {Array} Filtered and sorted members
+ */
+export function filterMembers(klass, memberType, context) {
+ let showInternal = context.showInternal;
+ let showInherited = context.showInherited;
+ let showProtected = context.showProtected;
+ let showPrivate = context.showPrivate;
+ let showDeprecated = context.showDeprecated;
+
+ let members = [];
+
+ if (showInternal === false && memberType !== 'arguments') {
+ return members;
+ }
-/**
- @function initialize
- @hide
-*/
-export function hasMemberType(...memberKeys) {
- let filter = memberKeys.pop();
-
- return computed(...memberKeys.map((k) => `${k}.[]`), {
- get() {
- return memberKeys.some((memberKey) => {
- return get(this, memberKey).some((member) => filter(member, memberKey));
- });
- },
- });
+ let capitalKey = capitalize(memberType);
+
+ let publicMembers = showInherited
+ ? klass[`allPublic${capitalKey}`]
+ : klass[`public${capitalKey}`];
+ let privateMembers = showInherited
+ ? klass[`allPrivate${capitalKey}`]
+ : klass[`private${capitalKey}`];
+ let protectedMembers = showInherited
+ ? klass[`allProtected${capitalKey}`]
+ : klass[`protected${capitalKey}`];
+
+ members.push(...(publicMembers || []));
+
+ if (showPrivate) {
+ members.push(...(privateMembers || []));
+ }
+
+ if (showProtected) {
+ members.push(...(protectedMembers || []));
+ }
+
+ if (!showDeprecated) {
+ members = members.filter((m) => {
+ return !m.tags || !m.tags.find((t) => t.name === 'deprecated');
+ });
+ }
+
+ return members.sort(memberSort);
}
/**
diff --git a/app/adapters/-addon-docs.js b/app/adapters/-addon-docs.js
deleted file mode 100644
index d740b0266..000000000
--- a/app/adapters/-addon-docs.js
+++ /dev/null
@@ -1 +0,0 @@
-export { default } from 'ember-cli-addon-docs/adapters/-addon-docs';
diff --git a/app/adapters/class.js b/app/adapters/class.js
deleted file mode 100644
index 34a3dbcf2..000000000
--- a/app/adapters/class.js
+++ /dev/null
@@ -1 +0,0 @@
-export { default } from 'ember-cli-addon-docs/adapters/class';
diff --git a/app/adapters/component.js b/app/adapters/component.js
deleted file mode 100644
index c960b8695..000000000
--- a/app/adapters/component.js
+++ /dev/null
@@ -1 +0,0 @@
-export { default } from 'ember-cli-addon-docs/adapters/component';
diff --git a/app/adapters/module.js b/app/adapters/module.js
deleted file mode 100644
index ca1d765e7..000000000
--- a/app/adapters/module.js
+++ /dev/null
@@ -1 +0,0 @@
-export { default } from 'ember-cli-addon-docs/adapters/module';
diff --git a/app/adapters/project.js b/app/adapters/project.js
deleted file mode 100644
index d9cefea54..000000000
--- a/app/adapters/project.js
+++ /dev/null
@@ -1 +0,0 @@
-export { default } from 'ember-cli-addon-docs/adapters/project';
diff --git a/app/models/class.js b/app/models/class.js
deleted file mode 100644
index 7785f76bb..000000000
--- a/app/models/class.js
+++ /dev/null
@@ -1 +0,0 @@
-export { default } from 'ember-cli-addon-docs/models/class';
diff --git a/app/models/component.js b/app/models/component.js
deleted file mode 100644
index 9fc4bd47d..000000000
--- a/app/models/component.js
+++ /dev/null
@@ -1 +0,0 @@
-export { default } from 'ember-cli-addon-docs/models/component';
diff --git a/app/models/module.js b/app/models/module.js
deleted file mode 100644
index b5ca51008..000000000
--- a/app/models/module.js
+++ /dev/null
@@ -1 +0,0 @@
-export { default } from 'ember-cli-addon-docs/models/module';
diff --git a/app/models/project.js b/app/models/project.js
deleted file mode 100644
index ccb5bf8e3..000000000
--- a/app/models/project.js
+++ /dev/null
@@ -1 +0,0 @@
-export { default } from 'ember-cli-addon-docs/models/project';
diff --git a/app/serializers/-addon-docs.js b/app/serializers/-addon-docs.js
deleted file mode 100644
index e0ae1047f..000000000
--- a/app/serializers/-addon-docs.js
+++ /dev/null
@@ -1 +0,0 @@
-export { default } from 'ember-cli-addon-docs/serializers/-addon-docs';
diff --git a/app/serializers/class.js b/app/serializers/class.js
deleted file mode 100644
index 0c5aa5466..000000000
--- a/app/serializers/class.js
+++ /dev/null
@@ -1 +0,0 @@
-export { default } from 'ember-cli-addon-docs/serializers/class';
diff --git a/app/serializers/component.js b/app/serializers/component.js
deleted file mode 100644
index f8685ffe5..000000000
--- a/app/serializers/component.js
+++ /dev/null
@@ -1 +0,0 @@
-export { default } from 'ember-cli-addon-docs/serializers/component';
diff --git a/app/serializers/module.js b/app/serializers/module.js
deleted file mode 100644
index ea8f79a56..000000000
--- a/app/serializers/module.js
+++ /dev/null
@@ -1 +0,0 @@
-export { default } from 'ember-cli-addon-docs/serializers/module';
diff --git a/app/serializers/project.js b/app/serializers/project.js
deleted file mode 100644
index 31a04ede8..000000000
--- a/app/serializers/project.js
+++ /dev/null
@@ -1 +0,0 @@
-export { default } from 'ember-cli-addon-docs/serializers/project';
diff --git a/app/services/docs-store.js b/app/services/docs-store.js
new file mode 100644
index 000000000..fda2ca9de
--- /dev/null
+++ b/app/services/docs-store.js
@@ -0,0 +1 @@
+export { default } from 'ember-cli-addon-docs/services/docs-store';
diff --git a/blueprints/ember-cli-addon-docs/index.js b/blueprints/ember-cli-addon-docs/index.js
index 715910974..b2f40b658 100644
--- a/blueprints/ember-cli-addon-docs/index.js
+++ b/blueprints/ember-cli-addon-docs/index.js
@@ -19,7 +19,6 @@ module.exports = {
'ember-cli-deploy-build',
'ember-cli-deploy-git',
'ember-cli-deploy-git-ci',
- 'ember-data',
],
});
},
diff --git a/package.json b/package.json
index a439a85f4..1c3ded33f 100644
--- a/package.json
+++ b/package.json
@@ -102,10 +102,6 @@
"@babel/helper-split-export-declaration": "^7.24.7",
"@babel/plugin-proposal-decorators": "^7.28.0",
"@babel/preset-env": "^7.28.5",
- "@ember-data/adapter": "^5.8.0",
- "@ember-data/model": "^5.8.0",
- "@ember-data/serializer": "^5.8.0",
- "@ember-data/store": "^5.8.0",
"@ember/optional-features": "^2.3.0",
"@ember/test-helpers": "^3.3.1",
"@ember/test-waiters": "^3.1.0",
@@ -127,11 +123,8 @@
"ember-cli-deploy-git": "^1.3.4",
"ember-cli-deploy-git-ci": "^1.0.1",
"ember-cli-inject-live-reload": "^2.1.0",
- "ember-cli-mirage": "^3.0.4",
"ember-cli-sri": "^2.1.1",
"ember-cli-terser": "^4.0.2",
- "ember-data": "~5.8.0",
- "ember-inflector": "^5.0.2",
"ember-load-initializers": "^2.1.2",
"ember-qunit": "^8.1.1",
"ember-resolver": "^13.1.1",
@@ -147,7 +140,7 @@
"eslint-plugin-prettier": "^5.5.4",
"eslint-plugin-qunit": "^8.2.5",
"loader.js": "^4.7.0",
- "miragejs": "^0.1.48",
+ "pretender": "^3.4.7",
"mocha": "^11.7.5",
"prettier": "^3.7.2",
"qunit": "^2.24.2",
@@ -159,38 +152,11 @@
"webpack": "^5.103.0"
},
"peerDependencies": {
- "@ember-data/adapter": ">= 3.0.0",
- "@ember-data/model": ">= 3.0.0",
- "@ember-data/serializer": ">= 3.0.0",
- "@ember-data/store": ">= 3.0.0",
"@ember/test-waiters": "^3.1.0 || ^4.0.0",
- "ember-data": ">= 3.0.0",
- "ember-inflector": ">= 4.0.0",
"ember-source": ">= 4.0.0"
},
- "peerDependenciesMeta": {
- "@ember-data/adapter": {
- "optional": true
- },
- "@ember-data/model": {
- "optional": true
- },
- "@ember-data/serializer": {
- "optional": true
- },
- "@ember-data/store": {
- "optional": true
- },
- "ember-inflector": {
- "optional": true
- }
- },
"pnpm": {
"overrides": {
- "@ember-data/adapter": "$@ember-data/adapter",
- "@ember-data/model": "$@ember-data/model",
- "@ember-data/serializer": "$@ember-data/serializer",
- "@ember-data/store": "$@ember-data/store",
"@ember/test-helpers": "$@ember/test-helpers",
"@ember/test-waiters": "$@ember/test-waiters",
"ember-cli-babel": "$ember-cli-babel",
@@ -199,7 +165,6 @@
"ember-cli-dependency-checker": "$ember-cli-dependency-checker",
"ember-cli-htmlbars": "$ember-cli-htmlbars",
"ember-cli-inject-live-reload": "$ember-cli-inject-live-reload",
- "ember-data": "$ember-data",
"ember-qunit": "$ember-qunit",
"ember-cli-sri": "$ember-cli-sri",
"ember-cli-terser": "$ember-cli-terser",
@@ -212,7 +177,10 @@
"eslint-plugin-n": "$eslint-plugin-n",
"loader.js": "$loader.js",
"webpack": "$webpack"
- }
+ },
+ "onlyBuiltDependencies": [
+ "core-js"
+ ]
},
"engines": {
"node": ">= 22.21.1"
diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml
index f0a9a4027..ec788d86d 100644
--- a/pnpm-lock.yaml
+++ b/pnpm-lock.yaml
@@ -5,10 +5,6 @@ settings:
excludeLinksFromLockfile: false
overrides:
- '@ember-data/adapter': ^5.8.0
- '@ember-data/model': ^5.8.0
- '@ember-data/serializer': ^5.8.0
- '@ember-data/store': ^5.8.0
'@ember/test-helpers': ^3.3.1
'@ember/test-waiters': ^3.1.0
ember-cli-babel: ^8.2.0
@@ -17,7 +13,6 @@ overrides:
ember-cli-dependency-checker: ^3.3.3
ember-cli-htmlbars: ^6.3.0
ember-cli-inject-live-reload: ^2.1.0
- ember-data: ~5.8.0
ember-qunit: ^8.1.1
ember-cli-sri: ^2.1.1
ember-cli-terser: ^4.0.2
@@ -246,18 +241,6 @@ importers:
'@babel/preset-env':
specifier: ^7.28.5
version: 7.28.5(@babel/core@7.28.5)
- '@ember-data/adapter':
- specifier: ^5.8.0
- version: 5.8.0(@babel/core@7.28.5)
- '@ember-data/model':
- specifier: ^5.8.0
- version: 5.8.0(@babel/core@7.28.5)
- '@ember-data/serializer':
- specifier: ^5.8.0
- version: 5.8.0(@babel/core@7.28.5)
- '@ember-data/store':
- specifier: ^5.8.0
- version: 5.8.0(@babel/core@7.28.5)(@ember-data/tracking@5.8.0(@babel/core@7.28.5)(@ember/test-waiters@3.1.0(@babel/core@7.28.5)))(@ember/test-waiters@3.1.0(@babel/core@7.28.5))
'@ember/optional-features':
specifier: ^2.3.0
version: 2.3.0
@@ -321,21 +304,12 @@ importers:
ember-cli-inject-live-reload:
specifier: ^2.1.0
version: 2.1.0
- ember-cli-mirage:
- specifier: ^3.0.4
- version: 3.0.4(@ember-data/model@5.8.0(@babel/core@7.28.5))(@ember/test-helpers@3.3.1(@babel/core@7.28.5)(ember-source@5.11.1(@glimmer/component@1.1.2(@babel/core@7.28.5))(rsvp@4.8.5)(webpack@5.103.0))(webpack@5.103.0))(ember-data@5.8.0(@babel/core@7.28.5)(@ember/test-helpers@3.3.1(@babel/core@7.28.5)(ember-source@5.11.1(@glimmer/component@1.1.2(@babel/core@7.28.5))(rsvp@4.8.5)(webpack@5.103.0))(webpack@5.103.0))(@ember/test-waiters@3.1.0(@babel/core@7.28.5))(ember-inflector@5.0.2(@babel/core@7.28.5))(qunit@2.24.2))(ember-qunit@8.1.1(@babel/core@7.28.5)(@ember/test-helpers@3.3.1(@babel/core@7.28.5)(ember-source@5.11.1(@glimmer/component@1.1.2(@babel/core@7.28.5))(rsvp@4.8.5)(webpack@5.103.0))(webpack@5.103.0))(ember-source@5.11.1(@glimmer/component@1.1.2(@babel/core@7.28.5))(rsvp@4.8.5)(webpack@5.103.0))(qunit@2.24.2))(ember-source@5.11.1(@glimmer/component@1.1.2(@babel/core@7.28.5))(rsvp@4.8.5)(webpack@5.103.0))(miragejs@0.1.48)(webpack@5.103.0)
ember-cli-sri:
specifier: ^2.1.1
version: 2.1.1
ember-cli-terser:
specifier: ^4.0.2
version: 4.0.2
- ember-data:
- specifier: ~5.8.0
- version: 5.8.0(@babel/core@7.28.5)(@ember/test-helpers@3.3.1(@babel/core@7.28.5)(ember-source@5.11.1(@glimmer/component@1.1.2(@babel/core@7.28.5))(rsvp@4.8.5)(webpack@5.103.0))(webpack@5.103.0))(@ember/test-waiters@3.1.0(@babel/core@7.28.5))(ember-inflector@5.0.2(@babel/core@7.28.5))(qunit@2.24.2)
- ember-inflector:
- specifier: ^5.0.2
- version: 5.0.2(@babel/core@7.28.5)
ember-load-initializers:
specifier: ^2.1.2
version: 2.1.2(@babel/core@7.28.5)
@@ -381,12 +355,12 @@ importers:
loader.js:
specifier: ^4.7.0
version: 4.7.0
- miragejs:
- specifier: ^0.1.48
- version: 0.1.48
mocha:
specifier: ^11.7.5
version: 11.7.5
+ pretender:
+ specifier: ^3.4.7
+ version: 3.4.7
prettier:
specifier: ^3.7.2
version: 3.7.2
@@ -421,18 +395,6 @@ importers:
specifier: ^8.2.0
version: 8.2.0(@babel/core@7.28.5)
devDependencies:
- '@ember-data/adapter':
- specifier: ^5.8.0
- version: 5.8.0(@babel/core@7.28.5)
- '@ember-data/model':
- specifier: ^5.8.0
- version: 5.8.0(@babel/core@7.28.5)
- '@ember-data/serializer':
- specifier: ^5.8.0
- version: 5.8.0(@babel/core@7.28.5)
- '@ember-data/store':
- specifier: ^5.8.0
- version: 5.8.0(@babel/core@7.28.5)(@ember-data/tracking@5.8.0(@babel/core@7.28.5)(@ember/test-waiters@3.1.0(@babel/core@7.28.5)))(@ember/test-waiters@3.1.0(@babel/core@7.28.5))
'@ember/optional-features':
specifier: ^2.2.0
version: 2.2.0
@@ -469,9 +431,6 @@ importers:
ember-cli-terser:
specifier: ^4.0.2
version: 4.0.2
- ember-data:
- specifier: ~5.8.0
- version: 5.8.0(@babel/core@7.28.5)(@ember/test-helpers@3.3.1(@babel/core@7.28.5)(ember-source@5.11.1(@glimmer/component@1.1.2(@babel/core@7.28.5))(rsvp@4.8.5)(webpack@5.103.0))(webpack@5.103.0))(@ember/test-waiters@3.1.0(@babel/core@7.28.5))(ember-inflector@5.0.2(@babel/core@7.28.5))(qunit@2.22.0)
ember-load-initializers:
specifier: ^2.1.2
version: 2.1.2(@babel/core@7.28.5)
@@ -1178,58 +1137,9 @@ packages:
peerDependencies:
postcss-selector-parser: ^6.0.13
- '@ember-data/adapter@5.8.0':
- resolution: {integrity: sha512-loXvPVVQOprobBhr60chwB1dqJ4LpY5T1yRYoygibNlydoDp8kJE4ppR0hN8W7onkUVDaTfYKX9UX/3nFjmMQA==}
-
- '@ember-data/debug@5.8.0':
- resolution: {integrity: sha512-nNKy0wvD8Bzqk7GIij9qIbsVGiCRwVWMV7UNTr3BcZqiSSKyu6D+jeolcWYvKlz1XojDCLe5/uRUk4sE2j+9jA==}
-
- '@ember-data/graph@5.8.0':
- resolution: {integrity: sha512-p5A0AHtTbNvCLoKEIGfU4ex4jMIRhO0vMrsEy0wmJHLW6cosE4FQMEPUka/9v2HwJ+1N81T/cPTqS5h7Y+NFRw==}
-
- '@ember-data/json-api@5.8.0':
- resolution: {integrity: sha512-E1OY1UAELXgl+Li2eSzceUPteWz1CMls2GV65C6EI7Bn0pJBjPlj06qbjcYnGiOzvjZKTfYqmdKTvNsouW93DQ==}
-
- '@ember-data/legacy-compat@5.8.0':
- resolution: {integrity: sha512-f4bDqpMZrCVMXyj+vT5S9hyBLzbrbvEAs+1B5iuDwOiXssYmBUnu5pnlb2hhvCDaFCuZ0XevL8tXLG/QuFM35g==}
-
- '@ember-data/model@5.8.0':
- resolution: {integrity: sha512-dfdXJkD/q4HowkZaRdv0cwVu+cP9/4wK0fglXOtNjJmxKXJQ3be5e9ged9SYFKNKALSbNIU6FuFhWm1EA0N3LA==}
-
- '@ember-data/request-utils@5.8.0':
- resolution: {integrity: sha512-xTNh3OMEAZsf5AjC6HZ12onHXu08VszV70xINYRbP5V5nQLhyXkUnPBn/GfTcjFoOqnSGdNGOmbHQL2HbiTqFg==}
- peerDependencies:
- ember-inflector: ^4.0.2 || ^5.0.0 || ^6.0.0
- peerDependenciesMeta:
- ember-inflector:
- optional: true
-
- '@ember-data/request@5.8.0':
- resolution: {integrity: sha512-ys17D2XZAUMihwLR7rQWrgMgZ0MDvrtz8gcGeaLVurC/MEhE9O5iPchUMD6T9okoKOdgRgeQYh88Sn0cl0jVtQ==}
-
'@ember-data/rfc395-data@0.0.4':
resolution: {integrity: sha512-tGRdvgC9/QMQSuSuJV45xoyhI0Pzjm7A9o/MVVA3HakXIImJbbzx/k/6dO9CUEQXIyS2y0fW6C1XaYOG7rY0FQ==}
- '@ember-data/serializer@5.8.0':
- resolution: {integrity: sha512-HsfX8pWU9Q6NjKpCvttWsOLnzFISAIP/CJ0BjgDixRG9lWCju68gPJvdO284yI6Nf78NIZoJ6S7GK+iyLBYPlQ==}
-
- '@ember-data/store@5.8.0':
- resolution: {integrity: sha512-vlycjD6PGzqmtdUbgUhQF2e3v+fniH+69uE2UAtpI3RHu9Al6TwoNAmWzK7U/7VC6E8bRN+EXNyzuX3ho+mybw==}
- peerDependencies:
- '@ember-data/tracking': 5.8.0
- '@ember/test-waiters': ^3.1.0
- peerDependenciesMeta:
- '@ember-data/tracking':
- optional: true
- '@ember/test-waiters':
- optional: true
-
- '@ember-data/tracking@5.8.0':
- resolution: {integrity: sha512-tDLLMFD+oH9N83S4A4hLxWjG0ohomKnHDU4s9iYUhVCX0n3S8UnYuxmiBjVrjLKhWD83VJBt7o2VQ4vC0pY9gQ==}
- deprecated: Use @warp-drive/ember
- peerDependencies:
- '@ember/test-waiters': ^3.1.0
-
'@ember/edition-utils@1.2.0':
resolution: {integrity: sha512-VmVq/8saCaPdesQmftPqbFtxJWrzxNGSQ+e8x8LLe3Hjm36pJ04Q8LeORGZkAeOhldoUX9seLGmSaHeXkIqoog==}
@@ -1672,9 +1582,6 @@ packages:
resolution: {integrity: sha512-F5z53uvRIF4dYfFfJP3a2Cqg+4P1dgJchJsFnsZE0eZp0LK8X7g2J0CsJHRgns+skpXOlM7n5vFGwkWCWj8qJg==}
engines: {node: 12.* || >= 14}
- '@miragejs/pretender-node-polyfill@0.1.2':
- resolution: {integrity: sha512-M/BexG/p05C5lFfMunxo/QcgIJnMT2vDVCd00wNqK2ImZONIlEETZwWJu1QtLxtmYlSHlCFl3JNzp0tLe7OJ5g==}
-
'@nicolo-ribaudo/eslint-scope-5-internals@5.1.1-v1':
resolution: {integrity: sha512-54/JRvkLIzzDWshCWfuhadfrfZVPiElY8Fcgmg1HroEly/EDSszzhBAsarCux+D/kOslTRquNzuyGSmUSTTHGg==}
@@ -2026,40 +1933,6 @@ packages:
'@ungap/structured-clone@1.3.0':
resolution: {integrity: sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==}
- '@warp-drive/build-config@5.8.0':
- resolution: {integrity: sha512-p0Cgf/9qO9Ocv33RbsHhKTyQpiw+8FKHFOSvruAUrjtZCXzniqfnzLDv12XtufV7HIKe2aN5HCip6r5Q+xk6fg==}
-
- '@warp-drive/core-types@5.8.0':
- resolution: {integrity: sha512-jJRDRcJBiIvI27HRq/E9PVsXEAay2iWU27AzQ5zsU6mugo0cCgIC7F0aPd1Wfjq81j6ooL/tIg05cJ9TZJ32kA==}
-
- '@warp-drive/core@5.8.0':
- resolution: {integrity: sha512-DkY8AjaeiMtijz9Ho1W3wKlaWGbhK7gOaOCXdRzCqNyKiwM+nOn2dkS/8uib5lpuv4m7QYgL2oF4uAWlINUFDA==}
-
- '@warp-drive/ember@5.8.0':
- resolution: {integrity: sha512-+V1KUZpsezyc2oMB68DGOYNMsvZEnWJ1cjnTO0OhqtId4viLSW9vPKzSbJ8MLz3TcyCepj4Y6b17CJj6Ksy9EA==}
- peerDependencies:
- '@ember/test-waiters': ^3.1.0
- ember-provide-consume-context: ^0.8.0
- peerDependenciesMeta:
- ember-provide-consume-context:
- optional: true
-
- '@warp-drive/json-api@5.8.0':
- resolution: {integrity: sha512-aJKQx2T51d/neaz8clGe/uC7nHm+8A+ho7OMou2R1yYJuIXNvYYXvTPErA/kABg0RDfAoafqdphe+3Tviut1cA==}
- peerDependencies:
- '@warp-drive/core': 5.8.0
-
- '@warp-drive/legacy@5.8.0':
- resolution: {integrity: sha512-fWCZUW6oZ3AL3zaeI3fC3YTfHe+lkgIinSr4ip79nEPE8RKfuSbB8OLKv6AnBy6fJreI+Ts6+wgxkqMJxIIY/g==}
- peerDependencies:
- '@warp-drive/core': 5.8.0
- '@warp-drive/utilities': 5.8.0
-
- '@warp-drive/utilities@5.8.0':
- resolution: {integrity: sha512-ctVFGylQJ0gZjssmFxPvoOcJ2kM/F5FqsWnvIqn5l30gVxISonm7xU3UoQ4bXpA5VXzaQ25PFFwGobdZOJELQA==}
- peerDependencies:
- '@warp-drive/core': 5.8.0
-
'@webassemblyjs/ast@1.14.1':
resolution: {integrity: sha512-nuBEDgQfm1ccRp/8bCQrx1frohyufl4JlbMMZ4P1wpeOfDhF6FQkxZJ1b/e+PLwr6X1Nhw6OLme5usuBWYBvuQ==}
@@ -2464,12 +2337,6 @@ packages:
peerDependencies:
'@babel/core': ^7.0.0
- babel-plugin-debug-macros@2.0.0:
- resolution: {integrity: sha512-7ZaLtXIY01PAPhLyjV3OACePnl+X5iQO7F4O/sOJHTfMf/36zyu14uVUxNiZmOUntYBsyT/VVplf1LrH6NcwvQ==}
- engines: {node: '>=16'}
- peerDependencies:
- '@babel/core': ^7.0.0
-
babel-plugin-ember-data-packages-polyfill@0.1.2:
resolution: {integrity: sha512-kTHnOwoOXfPXi00Z8yAgyD64+jdSXk3pknnS7NlqnCKAU6YDkXZ4Y7irl66kaZjZn0FBBt0P4YOZFZk85jYOww==}
engines: {node: 6.* || 8.* || 10.* || >= 12.*}
@@ -3047,10 +2914,6 @@ packages:
resolution: {integrity: sha512-q5/jG+YQnSy4nRTV4F7lPepBJZ8qBNJJDBuJdoejDyLXgmL7IEo+Le2JDZudFTFt7mrCqIRaSjws4ygRCTCAXA==}
engines: {node: '>= 4.0'}
- code-error-fragment@0.0.230:
- resolution: {integrity: sha512-cadkfKp6932H8UkhzE/gcUqhRMNf8jHzkAN7+5Myabswaghu4xABTgPHDCjW+dBAJxj/SpkTYokpzDqY4pCzQw==}
- engines: {node: '>= 4'}
-
coffeescript@1.12.7:
resolution: {integrity: sha512-pLXHFxQMPklVoEekowk8b3erNynC+DVJzChxS/LCBBgR6/8AJkHivkm//zbowcfc7BTCAjryuhx6gPqPRfsFoA==}
engines: {node: '>=0.8.0'}
@@ -3891,26 +3754,6 @@ packages:
resolution: {integrity: sha512-QkLGcYv1WRK35g4MWu/uIeJ5Suk2eJXKtZ+8s+qE7C9INmpCPyPxzaqZABquYzcWNzIdw6kYwz3NWAFdKYFxwg==}
engines: {node: ^4.5 || 6.* || >= 7.*}
- ember-cli-mirage@3.0.4:
- resolution: {integrity: sha512-JpfZJIrvUAcwOVQ44aAzlYSbGiO4/nqnVAbzAKU4kztqgYvYGBa27FX5WxfpIGZMBdnt6OKh78rsimChWo6f/Q==}
- engines: {node: 16.* || >= 18}
- peerDependencies:
- '@ember-data/model': ^5.8.0
- '@ember/test-helpers': ^3.3.1
- ember-data: ~5.8.0
- ember-qunit: ^8.1.1
- ember-source: ~5.11.1
- miragejs: ^0.1.43
- peerDependenciesMeta:
- '@ember-data/model':
- optional: true
- '@ember/test-helpers':
- optional: true
- ember-data:
- optional: true
- ember-qunit:
- optional: true
-
ember-cli-normalize-entity-name@1.0.0:
resolution: {integrity: sha512-rF4P1rW2P1gVX1ynZYPmuIf7TnAFDiJmIUFI1Xz16VYykUAyiOCme0Y22LeZq8rTzwBMiwBwoE3RO4GYWehXZA==}
@@ -3946,9 +3789,6 @@ packages:
resolution: {integrity: sha512-Ej77K+YhCZImotoi/CU2cfsoZaswoPlGaM5TB3LvjvPDlVPRhxUHO2RsaUVC5lsGeRLRiHCOxVtoJ6GyqexzFA==}
engines: {node: 10.* || 12.* || >= 14}
- ember-cli-test-info@1.0.0:
- resolution: {integrity: sha512-dEVTIpmUfCzweC97NGf6p7L6XKBwV2GmSM4elmzKvkttEp5P7AvGA9uGyN4GqFq+RwhW+2b0I2qlX00w+skm+A==}
-
ember-cli-test-loader@3.1.0:
resolution: {integrity: sha512-0aocZV9SIoOHiU3hrH3IuLR6busWhTX6UVXgd490hmJkIymmOXNH2+jJoC7Ebkeo3PiOfAdjqhb765QDlHSJOw==}
engines: {node: 10.* || >= 12}
@@ -4006,18 +3846,6 @@ packages:
'@glint/template':
optional: true
- ember-data@5.8.0:
- resolution: {integrity: sha512-VRb3fh2x/9G9kXONQ6YHTYjAFGO7q5R/2M1ZAApLXecuyEBm0oT5SsrWfWlDyZCyGsd3jNQV17Vd0gklcB9pRg==}
- peerDependencies:
- '@ember/test-helpers': ^3.3.1
- '@ember/test-waiters': ^3.1.0
- qunit: ^2.18.0
- peerDependenciesMeta:
- '@ember/test-helpers':
- optional: true
- qunit:
- optional: true
-
ember-functions-as-helper-polyfill@2.1.3:
resolution: {integrity: sha512-Hte8jfOmSNzrz/vOchf68CGaBWXN2/5qKgFaylqr9omW2i4Wt9JmaBWRkeR0AJ53N57q3DX2TOb166Taq6QjiA==}
engines: {node: '>= 14.0.0'}
@@ -4028,9 +3856,6 @@ packages:
resolution: {integrity: sha512-uNmv1cPG/4qsac8oIf5txJ2FZ8p88LEpG4P3dNcjsJS98Y8hd0GPMFwVqpnzI78Lz7VYRGQWY4jnE4qm5R3j4g==}
engines: {node: 12.* || 14.* || >= 16}
- ember-inflector@5.0.2:
- resolution: {integrity: sha512-aoPaT7B3pbUHSi4ulf02iRaMMvPteuDBO8jA1SLLOl/JwnO2YI5F/MhNPaolxp8DWwAd/P6MNN+wD5bLwmiUIA==}
-
ember-keyboard@9.0.4:
resolution: {integrity: sha512-lReOVCwvPt8aTLynuyh1rVoZx9LITqcwdCiUltGMkoJNyuE8snuGMIEpEj3RtiPLWm0UCnTfod8bjEqOoEEFtA==}
peerDependencies:
@@ -4742,10 +4567,6 @@ packages:
resolution: {integrity: sha512-cJaJkxCCxC8qIIcPBF9yGxY0W/tVZS3uEISDxhYIdtk8OL93pe+6Zj7LjCqVV4dzbqcriOZ+kQ/NE4RXZHsIGA==}
engines: {node: '>=10'}
- fuse.js@7.1.0:
- resolution: {integrity: sha512-trLf4SzuuUxfusZADLINj+dE8clK1frKdmqiJNb1Es75fmI5oY6X2mxLVUciLLjxqw/xr72Dhy+lER6dGd02FQ==}
- engines: {node: '>=10'}
-
gauge@4.0.4:
resolution: {integrity: sha512-f9m+BEN5jkg6a0fZjleidjN51VE1X+mPFQ2DJ0uv1V39oCLCbsGe6yjbBnp7eK7z/+GAon99a3nHuqbuuthyPg==}
engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0}
@@ -4937,9 +4758,6 @@ packages:
graceful-fs@4.2.11:
resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==}
- grapheme-splitter@1.0.4:
- resolution: {integrity: sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ==}
-
graphemer@1.4.0:
resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==}
@@ -5194,17 +5012,10 @@ packages:
infer-owner@1.0.4:
resolution: {integrity: sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A==}
- inflected@2.1.0:
- resolution: {integrity: sha512-hAEKNxvHf2Iq3H60oMBHkB4wl5jn3TPF3+fXek/sRwAB5gP9xWs4r7aweSF95f99HFoz69pnZTcu8f0SIHV18w==}
-
inflection@2.0.1:
resolution: {integrity: sha512-wzkZHqpb4eGrOKBl34xy3umnYHx8Si5R1U4fwmdxLo5gdH6mEK8gclckTj/qWqy4Je0bsDYe/qazZYuO7xe3XQ==}
engines: {node: '>=14.0.0'}
- inflection@3.0.2:
- resolution: {integrity: sha512-+Bg3+kg+J6JUWn8J6bzFmOWkTQ6L/NHfDRSYU+EVvuKHDxUDHAXgqixHfVlzuBQaPOTac8hn43aPhMNk6rMe3g==}
- engines: {node: '>=18.0.0'}
-
inflight@1.0.6:
resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==}
deprecated: This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.
@@ -5635,10 +5446,6 @@ packages:
json-stringify-safe@5.0.1:
resolution: {integrity: sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==}
- json-to-ast@2.1.0:
- resolution: {integrity: sha512-W9Lq347r8tA1DfMvAGn9QNcgYm4Wm7Yc+k8e6vezpMnRT+NHbtlxgNBXRVjXe9YM6eTn6+p/MKOlV/aABJcSnQ==}
- engines: {node: '>= 4'}
-
json5@0.5.1:
resolution: {integrity: sha512-4xrs1aW+6N5DalkqSVA8fxh458CXvR99WU8WLKmq4v8eWAL86Xo3BVqyd3SkA9wEVjCMqyvvRRkshAdOnBp5rw==}
hasBin: true
@@ -6204,10 +6011,6 @@ packages:
resolution: {integrity: sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==}
engines: {node: '>= 8'}
- miragejs@0.1.48:
- resolution: {integrity: sha512-MGZAq0Q3OuRYgZKvlB69z4gLN4G3PvgC4A2zhkCXCXrLD5wm2cCnwNB59xOBVA+srZ0zEes6u+VylcPIkB4SqA==}
- engines: {node: 6.* || 8.* || >= 10.*}
-
mixin-deep@1.3.2:
resolution: {integrity: sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==}
engines: {node: '>=0.10.0'}
@@ -9420,138 +9223,8 @@ snapshots:
dependencies:
postcss-selector-parser: 6.1.2
- '@ember-data/adapter@5.8.0(@babel/core@7.28.5)':
- dependencies:
- '@ember/edition-utils': 1.2.0
- '@embroider/macros': 1.19.5(@babel/core@7.28.5)
- '@warp-drive/core': 5.8.0(@babel/core@7.28.5)
- '@warp-drive/legacy': 5.8.0(@babel/core@7.28.5)(@warp-drive/core@5.8.0(@babel/core@7.28.5))(@warp-drive/utilities@5.8.0(@babel/core@7.28.5)(@warp-drive/core@5.8.0(@babel/core@7.28.5)))
- '@warp-drive/utilities': 5.8.0(@babel/core@7.28.5)(@warp-drive/core@5.8.0(@babel/core@7.28.5))
- ember-cli-path-utils: 1.0.0
- ember-cli-string-utils: 1.1.0
- ember-cli-test-info: 1.0.0
- transitivePeerDependencies:
- - '@babel/core'
- - '@glint/template'
- - supports-color
-
- '@ember-data/debug@5.8.0(@babel/core@7.28.5)':
- dependencies:
- '@ember/edition-utils': 1.2.0
- '@embroider/macros': 1.19.5(@babel/core@7.28.5)
- '@warp-drive/core': 5.8.0(@babel/core@7.28.5)
- '@warp-drive/utilities': 5.8.0(@babel/core@7.28.5)(@warp-drive/core@5.8.0(@babel/core@7.28.5))
- transitivePeerDependencies:
- - '@babel/core'
- - '@glint/template'
- - supports-color
-
- '@ember-data/graph@5.8.0(@babel/core@7.28.5)':
- dependencies:
- '@embroider/macros': 1.19.5(@babel/core@7.28.5)
- '@warp-drive/core': 5.8.0(@babel/core@7.28.5)
- transitivePeerDependencies:
- - '@babel/core'
- - '@glint/template'
- - supports-color
-
- '@ember-data/json-api@5.8.0(@babel/core@7.28.5)':
- dependencies:
- '@embroider/macros': 1.19.5(@babel/core@7.28.5)
- '@warp-drive/core': 5.8.0(@babel/core@7.28.5)
- '@warp-drive/json-api': 5.8.0(@babel/core@7.28.5)(@warp-drive/core@5.8.0(@babel/core@7.28.5))
- '@warp-drive/utilities': 5.8.0(@babel/core@7.28.5)(@warp-drive/core@5.8.0(@babel/core@7.28.5))
- transitivePeerDependencies:
- - '@babel/core'
- - '@glint/template'
- - supports-color
-
- '@ember-data/legacy-compat@5.8.0(@babel/core@7.28.5)':
- dependencies:
- '@embroider/macros': 1.19.5(@babel/core@7.28.5)
- '@warp-drive/core': 5.8.0(@babel/core@7.28.5)
- '@warp-drive/legacy': 5.8.0(@babel/core@7.28.5)(@warp-drive/core@5.8.0(@babel/core@7.28.5))(@warp-drive/utilities@5.8.0(@babel/core@7.28.5)(@warp-drive/core@5.8.0(@babel/core@7.28.5)))
- '@warp-drive/utilities': 5.8.0(@babel/core@7.28.5)(@warp-drive/core@5.8.0(@babel/core@7.28.5))
- transitivePeerDependencies:
- - '@babel/core'
- - '@glint/template'
- - supports-color
-
- '@ember-data/model@5.8.0(@babel/core@7.28.5)':
- dependencies:
- '@ember/edition-utils': 1.2.0
- '@embroider/macros': 1.19.5(@babel/core@7.28.5)
- '@warp-drive/core': 5.8.0(@babel/core@7.28.5)
- '@warp-drive/legacy': 5.8.0(@babel/core@7.28.5)(@warp-drive/core@5.8.0(@babel/core@7.28.5))(@warp-drive/utilities@5.8.0(@babel/core@7.28.5)(@warp-drive/core@5.8.0(@babel/core@7.28.5)))
- '@warp-drive/utilities': 5.8.0(@babel/core@7.28.5)(@warp-drive/core@5.8.0(@babel/core@7.28.5))
- ember-cli-string-utils: 1.1.0
- ember-cli-test-info: 1.0.0
- inflection: 3.0.2
- transitivePeerDependencies:
- - '@babel/core'
- - '@glint/template'
- - supports-color
-
- '@ember-data/request-utils@5.8.0(@babel/core@7.28.5)(ember-inflector@5.0.2(@babel/core@7.28.5))':
- dependencies:
- '@embroider/macros': 1.19.5(@babel/core@7.28.5)
- '@warp-drive/core': 5.8.0(@babel/core@7.28.5)
- '@warp-drive/utilities': 5.8.0(@babel/core@7.28.5)(@warp-drive/core@5.8.0(@babel/core@7.28.5))
- optionalDependencies:
- ember-inflector: 5.0.2(@babel/core@7.28.5)
- transitivePeerDependencies:
- - '@babel/core'
- - '@glint/template'
- - supports-color
-
- '@ember-data/request@5.8.0(@babel/core@7.28.5)':
- dependencies:
- '@embroider/macros': 1.19.5(@babel/core@7.28.5)
- '@warp-drive/core': 5.8.0(@babel/core@7.28.5)
- transitivePeerDependencies:
- - '@babel/core'
- - '@glint/template'
- - supports-color
-
'@ember-data/rfc395-data@0.0.4': {}
- '@ember-data/serializer@5.8.0(@babel/core@7.28.5)':
- dependencies:
- '@ember/edition-utils': 1.2.0
- '@embroider/macros': 1.19.5(@babel/core@7.28.5)
- '@warp-drive/core': 5.8.0(@babel/core@7.28.5)
- '@warp-drive/legacy': 5.8.0(@babel/core@7.28.5)(@warp-drive/core@5.8.0(@babel/core@7.28.5))(@warp-drive/utilities@5.8.0(@babel/core@7.28.5)(@warp-drive/core@5.8.0(@babel/core@7.28.5)))
- '@warp-drive/utilities': 5.8.0(@babel/core@7.28.5)(@warp-drive/core@5.8.0(@babel/core@7.28.5))
- ember-cli-path-utils: 1.0.0
- ember-cli-string-utils: 1.1.0
- ember-cli-test-info: 1.0.0
- transitivePeerDependencies:
- - '@babel/core'
- - '@glint/template'
- - supports-color
-
- '@ember-data/store@5.8.0(@babel/core@7.28.5)(@ember-data/tracking@5.8.0(@babel/core@7.28.5)(@ember/test-waiters@3.1.0(@babel/core@7.28.5)))(@ember/test-waiters@3.1.0(@babel/core@7.28.5))':
- dependencies:
- '@embroider/macros': 1.19.5(@babel/core@7.28.5)
- '@warp-drive/core': 5.8.0(@babel/core@7.28.5)
- optionalDependencies:
- '@ember-data/tracking': 5.8.0(@babel/core@7.28.5)(@ember/test-waiters@3.1.0(@babel/core@7.28.5))
- '@ember/test-waiters': 3.1.0(@babel/core@7.28.5)
- transitivePeerDependencies:
- - '@babel/core'
- - '@glint/template'
- - supports-color
-
- '@ember-data/tracking@5.8.0(@babel/core@7.28.5)(@ember/test-waiters@3.1.0(@babel/core@7.28.5))':
- dependencies:
- '@ember/test-waiters': 3.1.0(@babel/core@7.28.5)
- '@embroider/macros': 1.19.5(@babel/core@7.28.5)
- '@warp-drive/core': 5.8.0(@babel/core@7.28.5)
- transitivePeerDependencies:
- - '@babel/core'
- - '@glint/template'
- - supports-color
-
'@ember/edition-utils@1.2.0': {}
'@ember/optional-features@2.2.0':
@@ -10197,8 +9870,6 @@ snapshots:
tslib: 2.8.1
upath: 2.0.1
- '@miragejs/pretender-node-polyfill@0.1.2': {}
-
'@nicolo-ribaudo/eslint-scope-5-internals@5.1.1-v1':
dependencies:
eslint-scope: 5.1.1
@@ -10563,76 +10234,6 @@ snapshots:
'@ungap/structured-clone@1.3.0': {}
- '@warp-drive/build-config@5.8.0(@babel/core@7.28.5)':
- dependencies:
- '@embroider/addon-shim': 1.10.2
- '@embroider/macros': 1.19.5(@babel/core@7.28.5)
- babel-import-util: 2.1.1
- babel-plugin-debug-macros: 2.0.0(@babel/core@7.28.5)
- semver: 7.7.3
- transitivePeerDependencies:
- - '@babel/core'
- - '@glint/template'
- - supports-color
-
- '@warp-drive/core-types@5.8.0(@babel/core@7.28.5)':
- dependencies:
- '@embroider/macros': 1.19.5(@babel/core@7.28.5)
- '@warp-drive/core': 5.8.0(@babel/core@7.28.5)
- transitivePeerDependencies:
- - '@babel/core'
- - '@glint/template'
- - supports-color
-
- '@warp-drive/core@5.8.0(@babel/core@7.28.5)':
- dependencies:
- '@embroider/macros': 1.19.5(@babel/core@7.28.5)
- '@warp-drive/build-config': 5.8.0(@babel/core@7.28.5)
- transitivePeerDependencies:
- - '@babel/core'
- - '@glint/template'
- - supports-color
-
- '@warp-drive/ember@5.8.0(@babel/core@7.28.5)(@ember/test-waiters@3.1.0(@babel/core@7.28.5))':
- dependencies:
- '@ember/test-waiters': 3.1.0(@babel/core@7.28.5)
- '@embroider/macros': 1.19.5(@babel/core@7.28.5)
- '@warp-drive/core': 5.8.0(@babel/core@7.28.5)
- transitivePeerDependencies:
- - '@babel/core'
- - '@glint/template'
- - supports-color
-
- '@warp-drive/json-api@5.8.0(@babel/core@7.28.5)(@warp-drive/core@5.8.0(@babel/core@7.28.5))':
- dependencies:
- '@embroider/macros': 1.19.5(@babel/core@7.28.5)
- '@warp-drive/core': 5.8.0(@babel/core@7.28.5)
- fuse.js: 7.1.0
- json-to-ast: 2.1.0
- transitivePeerDependencies:
- - '@babel/core'
- - '@glint/template'
- - supports-color
-
- '@warp-drive/legacy@5.8.0(@babel/core@7.28.5)(@warp-drive/core@5.8.0(@babel/core@7.28.5))(@warp-drive/utilities@5.8.0(@babel/core@7.28.5)(@warp-drive/core@5.8.0(@babel/core@7.28.5)))':
- dependencies:
- '@embroider/macros': 1.19.5(@babel/core@7.28.5)
- '@warp-drive/core': 5.8.0(@babel/core@7.28.5)
- '@warp-drive/utilities': 5.8.0(@babel/core@7.28.5)(@warp-drive/core@5.8.0(@babel/core@7.28.5))
- transitivePeerDependencies:
- - '@babel/core'
- - '@glint/template'
- - supports-color
-
- '@warp-drive/utilities@5.8.0(@babel/core@7.28.5)(@warp-drive/core@5.8.0(@babel/core@7.28.5))':
- dependencies:
- '@embroider/macros': 1.19.5(@babel/core@7.28.5)
- '@warp-drive/core': 5.8.0(@babel/core@7.28.5)
- transitivePeerDependencies:
- - '@babel/core'
- - '@glint/template'
- - supports-color
-
'@webassemblyjs/ast@1.14.1':
dependencies:
'@webassemblyjs/helper-numbers': 1.13.2
@@ -11091,12 +10692,6 @@ snapshots:
'@babel/core': 7.28.5
semver: 5.7.2
- babel-plugin-debug-macros@2.0.0(@babel/core@7.28.5):
- dependencies:
- '@babel/core': 7.28.5
- babel-import-util: 2.1.1
- semver: 7.7.3
-
babel-plugin-ember-data-packages-polyfill@0.1.2:
dependencies:
'@ember-data/rfc395-data': 0.0.4
@@ -12112,8 +11707,6 @@ snapshots:
chalk: 2.4.2
q: 1.5.1
- code-error-fragment@0.0.230: {}
-
coffeescript@1.12.7:
optional: true
@@ -12956,29 +12549,6 @@ snapshots:
ember-cli-lodash-subset@2.0.1: {}
- ember-cli-mirage@3.0.4(@ember-data/model@5.8.0(@babel/core@7.28.5))(@ember/test-helpers@3.3.1(@babel/core@7.28.5)(ember-source@5.11.1(@glimmer/component@1.1.2(@babel/core@7.28.5))(rsvp@4.8.5)(webpack@5.103.0))(webpack@5.103.0))(ember-data@5.8.0(@babel/core@7.28.5)(@ember/test-helpers@3.3.1(@babel/core@7.28.5)(ember-source@5.11.1(@glimmer/component@1.1.2(@babel/core@7.28.5))(rsvp@4.8.5)(webpack@5.103.0))(webpack@5.103.0))(@ember/test-waiters@3.1.0(@babel/core@7.28.5))(ember-inflector@5.0.2(@babel/core@7.28.5))(qunit@2.24.2))(ember-qunit@8.1.1(@babel/core@7.28.5)(@ember/test-helpers@3.3.1(@babel/core@7.28.5)(ember-source@5.11.1(@glimmer/component@1.1.2(@babel/core@7.28.5))(rsvp@4.8.5)(webpack@5.103.0))(webpack@5.103.0))(ember-source@5.11.1(@glimmer/component@1.1.2(@babel/core@7.28.5))(rsvp@4.8.5)(webpack@5.103.0))(qunit@2.24.2))(ember-source@5.11.1(@glimmer/component@1.1.2(@babel/core@7.28.5))(rsvp@4.8.5)(webpack@5.103.0))(miragejs@0.1.48)(webpack@5.103.0):
- dependencies:
- '@babel/core': 7.28.5
- '@embroider/macros': 1.19.5(@babel/core@7.28.5)
- broccoli-file-creator: 2.1.1
- broccoli-funnel: 3.0.8
- broccoli-merge-trees: 4.2.0
- ember-auto-import: 2.12.0(webpack@5.103.0)
- ember-cli-babel: 8.2.0(@babel/core@7.28.5)
- ember-get-config: 2.1.1(@babel/core@7.28.5)
- ember-inflector: 5.0.2(@babel/core@7.28.5)
- ember-source: 5.11.1(@glimmer/component@1.1.2(@babel/core@7.28.5))(rsvp@4.8.5)(webpack@5.103.0)
- miragejs: 0.1.48
- optionalDependencies:
- '@ember-data/model': 5.8.0(@babel/core@7.28.5)
- '@ember/test-helpers': 3.3.1(@babel/core@7.28.5)(ember-source@5.11.1(@glimmer/component@1.1.2(@babel/core@7.28.5))(rsvp@4.8.5)(webpack@5.103.0))(webpack@5.103.0)
- ember-data: 5.8.0(@babel/core@7.28.5)(@ember/test-helpers@3.3.1(@babel/core@7.28.5)(ember-source@5.11.1(@glimmer/component@1.1.2(@babel/core@7.28.5))(rsvp@4.8.5)(webpack@5.103.0))(webpack@5.103.0))(@ember/test-waiters@3.1.0(@babel/core@7.28.5))(ember-inflector@5.0.2(@babel/core@7.28.5))(qunit@2.24.2)
- ember-qunit: 8.1.1(@babel/core@7.28.5)(@ember/test-helpers@3.3.1(@babel/core@7.28.5)(ember-source@5.11.1(@glimmer/component@1.1.2(@babel/core@7.28.5))(rsvp@4.8.5)(webpack@5.103.0))(webpack@5.103.0))(ember-source@5.11.1(@glimmer/component@1.1.2(@babel/core@7.28.5))(rsvp@4.8.5)(webpack@5.103.0))(qunit@2.24.2)
- transitivePeerDependencies:
- - '@glint/template'
- - supports-color
- - webpack
-
ember-cli-normalize-entity-name@1.0.0:
dependencies:
silent-error: 1.1.1
@@ -13029,10 +12599,6 @@ snapshots:
transitivePeerDependencies:
- supports-color
- ember-cli-test-info@1.0.0:
- dependencies:
- ember-cli-string-utils: 1.1.0
-
ember-cli-test-loader@3.1.0(@babel/core@7.28.5):
dependencies:
ember-cli-babel: 8.2.0(@babel/core@7.28.5)
@@ -13303,70 +12869,6 @@ snapshots:
- '@babel/core'
- supports-color
- ember-data@5.8.0(@babel/core@7.28.5)(@ember/test-helpers@3.3.1(@babel/core@7.28.5)(ember-source@5.11.1(@glimmer/component@1.1.2(@babel/core@7.28.5))(rsvp@4.8.5)(webpack@5.103.0))(webpack@5.103.0))(@ember/test-waiters@3.1.0(@babel/core@7.28.5))(ember-inflector@5.0.2(@babel/core@7.28.5))(qunit@2.22.0):
- dependencies:
- '@ember-data/adapter': 5.8.0(@babel/core@7.28.5)
- '@ember-data/debug': 5.8.0(@babel/core@7.28.5)
- '@ember-data/graph': 5.8.0(@babel/core@7.28.5)
- '@ember-data/json-api': 5.8.0(@babel/core@7.28.5)
- '@ember-data/legacy-compat': 5.8.0(@babel/core@7.28.5)
- '@ember-data/model': 5.8.0(@babel/core@7.28.5)
- '@ember-data/request': 5.8.0(@babel/core@7.28.5)
- '@ember-data/request-utils': 5.8.0(@babel/core@7.28.5)(ember-inflector@5.0.2(@babel/core@7.28.5))
- '@ember-data/serializer': 5.8.0(@babel/core@7.28.5)
- '@ember-data/store': 5.8.0(@babel/core@7.28.5)(@ember-data/tracking@5.8.0(@babel/core@7.28.5)(@ember/test-waiters@3.1.0(@babel/core@7.28.5)))(@ember/test-waiters@3.1.0(@babel/core@7.28.5))
- '@ember-data/tracking': 5.8.0(@babel/core@7.28.5)(@ember/test-waiters@3.1.0(@babel/core@7.28.5))
- '@ember/edition-utils': 1.2.0
- '@ember/test-waiters': 3.1.0(@babel/core@7.28.5)
- '@embroider/macros': 1.19.5(@babel/core@7.28.5)
- '@warp-drive/core': 5.8.0(@babel/core@7.28.5)
- '@warp-drive/core-types': 5.8.0(@babel/core@7.28.5)
- '@warp-drive/ember': 5.8.0(@babel/core@7.28.5)(@ember/test-waiters@3.1.0(@babel/core@7.28.5))
- '@warp-drive/json-api': 5.8.0(@babel/core@7.28.5)(@warp-drive/core@5.8.0(@babel/core@7.28.5))
- '@warp-drive/legacy': 5.8.0(@babel/core@7.28.5)(@warp-drive/core@5.8.0(@babel/core@7.28.5))(@warp-drive/utilities@5.8.0(@babel/core@7.28.5)(@warp-drive/core@5.8.0(@babel/core@7.28.5)))
- '@warp-drive/utilities': 5.8.0(@babel/core@7.28.5)(@warp-drive/core@5.8.0(@babel/core@7.28.5))
- optionalDependencies:
- '@ember/test-helpers': 3.3.1(@babel/core@7.28.5)(ember-source@5.11.1(@glimmer/component@1.1.2(@babel/core@7.28.5))(rsvp@4.8.5)(webpack@5.103.0))(webpack@5.103.0)
- qunit: 2.22.0
- transitivePeerDependencies:
- - '@babel/core'
- - '@glint/template'
- - ember-inflector
- - ember-provide-consume-context
- - supports-color
-
- ember-data@5.8.0(@babel/core@7.28.5)(@ember/test-helpers@3.3.1(@babel/core@7.28.5)(ember-source@5.11.1(@glimmer/component@1.1.2(@babel/core@7.28.5))(rsvp@4.8.5)(webpack@5.103.0))(webpack@5.103.0))(@ember/test-waiters@3.1.0(@babel/core@7.28.5))(ember-inflector@5.0.2(@babel/core@7.28.5))(qunit@2.24.2):
- dependencies:
- '@ember-data/adapter': 5.8.0(@babel/core@7.28.5)
- '@ember-data/debug': 5.8.0(@babel/core@7.28.5)
- '@ember-data/graph': 5.8.0(@babel/core@7.28.5)
- '@ember-data/json-api': 5.8.0(@babel/core@7.28.5)
- '@ember-data/legacy-compat': 5.8.0(@babel/core@7.28.5)
- '@ember-data/model': 5.8.0(@babel/core@7.28.5)
- '@ember-data/request': 5.8.0(@babel/core@7.28.5)
- '@ember-data/request-utils': 5.8.0(@babel/core@7.28.5)(ember-inflector@5.0.2(@babel/core@7.28.5))
- '@ember-data/serializer': 5.8.0(@babel/core@7.28.5)
- '@ember-data/store': 5.8.0(@babel/core@7.28.5)(@ember-data/tracking@5.8.0(@babel/core@7.28.5)(@ember/test-waiters@3.1.0(@babel/core@7.28.5)))(@ember/test-waiters@3.1.0(@babel/core@7.28.5))
- '@ember-data/tracking': 5.8.0(@babel/core@7.28.5)(@ember/test-waiters@3.1.0(@babel/core@7.28.5))
- '@ember/edition-utils': 1.2.0
- '@ember/test-waiters': 3.1.0(@babel/core@7.28.5)
- '@embroider/macros': 1.19.5(@babel/core@7.28.5)
- '@warp-drive/core': 5.8.0(@babel/core@7.28.5)
- '@warp-drive/core-types': 5.8.0(@babel/core@7.28.5)
- '@warp-drive/ember': 5.8.0(@babel/core@7.28.5)(@ember/test-waiters@3.1.0(@babel/core@7.28.5))
- '@warp-drive/json-api': 5.8.0(@babel/core@7.28.5)(@warp-drive/core@5.8.0(@babel/core@7.28.5))
- '@warp-drive/legacy': 5.8.0(@babel/core@7.28.5)(@warp-drive/core@5.8.0(@babel/core@7.28.5))(@warp-drive/utilities@5.8.0(@babel/core@7.28.5)(@warp-drive/core@5.8.0(@babel/core@7.28.5)))
- '@warp-drive/utilities': 5.8.0(@babel/core@7.28.5)(@warp-drive/core@5.8.0(@babel/core@7.28.5))
- optionalDependencies:
- '@ember/test-helpers': 3.3.1(@babel/core@7.28.5)(ember-source@5.11.1(@glimmer/component@1.1.2(@babel/core@7.28.5))(rsvp@4.8.5)(webpack@5.103.0))(webpack@5.103.0)
- qunit: 2.24.2
- transitivePeerDependencies:
- - '@babel/core'
- - '@glint/template'
- - ember-inflector
- - ember-provide-consume-context
- - supports-color
-
ember-functions-as-helper-polyfill@2.1.3(@babel/core@7.28.5)(ember-source@5.11.1(@glimmer/component@1.1.2(@babel/core@7.28.5))(rsvp@4.8.5)(webpack@5.103.0)):
dependencies:
ember-cli-babel: 8.2.0(@babel/core@7.28.5)
@@ -13386,14 +12888,6 @@ snapshots:
- '@glint/template'
- supports-color
- ember-inflector@5.0.2(@babel/core@7.28.5):
- dependencies:
- '@embroider/addon-shim': 1.10.2
- decorator-transforms: 2.3.0(@babel/core@7.28.5)
- transitivePeerDependencies:
- - '@babel/core'
- - supports-color
-
ember-keyboard@9.0.4(@babel/core@7.28.5)(@ember/test-helpers@3.3.1(@babel/core@7.28.5)(ember-source@5.11.1(@glimmer/component@1.1.2(@babel/core@7.28.5))(rsvp@4.8.5)(webpack@5.103.0))(webpack@5.103.0)):
dependencies:
'@embroider/addon-shim': 1.10.2
@@ -14553,8 +14047,6 @@ snapshots:
fuse.js@6.6.2: {}
- fuse.js@7.1.0: {}
-
gauge@4.0.4:
dependencies:
aproba: 2.1.0
@@ -14801,8 +14293,6 @@ snapshots:
graceful-fs@4.2.11: {}
- grapheme-splitter@1.0.4: {}
-
graphemer@1.4.0: {}
growly@1.3.0: {}
@@ -15073,12 +14563,8 @@ snapshots:
infer-owner@1.0.4: {}
- inflected@2.1.0: {}
-
inflection@2.0.1: {}
- inflection@3.0.2: {}
-
inflight@1.0.6:
dependencies:
once: 1.4.0
@@ -15518,11 +15004,6 @@ snapshots:
json-stringify-safe@5.0.1: {}
- json-to-ast@2.1.0:
- dependencies:
- code-error-fragment: 0.0.230
- grapheme-splitter: 1.0.4
-
json5@0.5.1:
optional: true
@@ -16195,13 +15676,6 @@ snapshots:
minipass: 3.3.6
yallist: 4.0.0
- miragejs@0.1.48:
- dependencies:
- '@miragejs/pretender-node-polyfill': 0.1.2
- inflected: 2.1.0
- lodash: 4.17.21
- pretender: 3.4.7
-
mixin-deep@1.3.2:
dependencies:
for-in: 1.0.2
diff --git a/test-apps/new-addon/package.json b/test-apps/new-addon/package.json
index 6ce31d23c..3bad314bb 100644
--- a/test-apps/new-addon/package.json
+++ b/test-apps/new-addon/package.json
@@ -24,10 +24,6 @@
"ember-auto-import": "*"
},
"devDependencies": {
- "@ember-data/adapter": "*",
- "@ember-data/model": "*",
- "@ember-data/serializer": "*",
- "@ember-data/store": "*",
"@ember/optional-features": "^2.2.0",
"@ember/test-helpers": "*",
"@ember/test-waiters": "*",
@@ -38,7 +34,6 @@
"ember-cli-dependency-checker": "*",
"ember-cli-htmlbars": "*",
"ember-cli-inject-live-reload": "*",
- "ember-data": "*",
"ember-qunit": "*",
"ember-cli-sri": "*",
"ember-cli-terser": "*",
diff --git a/tests/acceptance/docs-route-test.js b/tests/acceptance/docs-route-test.js
index cfa93b6a0..ea4db8999 100644
--- a/tests/acceptance/docs-route-test.js
+++ b/tests/acceptance/docs-route-test.js
@@ -1,11 +1,11 @@
import { module, test } from 'qunit';
import { setupApplicationTest } from 'ember-qunit';
-import setupMirage from 'ember-cli-mirage/test-support/setup-mirage';
+import { setupMockVersions } from '../helpers/mock-versions';
import { visit, click, currentURL } from '@ember/test-helpers';
module('Acceptance | Docs route test', function (hooks) {
setupApplicationTest(hooks);
- setupMirage(hooks);
+ setupMockVersions(hooks);
test('the docs route renders', async function (assert) {
await visit('/docs');
diff --git a/tests/acceptance/sandbox/api/components-test.js b/tests/acceptance/sandbox/api/components-test.js
index f88fe74fe..9a813cc2f 100644
--- a/tests/acceptance/sandbox/api/components-test.js
+++ b/tests/acceptance/sandbox/api/components-test.js
@@ -1,13 +1,13 @@
import { module, test } from 'qunit';
import { setupApplicationTest } from 'ember-qunit';
-import setupMirage from 'ember-cli-mirage/test-support/setup-mirage';
+import { setupMockVersions } from '../../../helpers/mock-versions';
import { currentURL, visit } from '@ember/test-helpers';
import modulePage from '../../../pages/api/module';
module('Acceptance | Sandbox | API | components', function (hooks) {
setupApplicationTest(hooks);
- setupMirage(hooks);
+ setupMockVersions(hooks);
test('nested components work', async function (assert) {
await visit('/sandbox');
diff --git a/tests/acceptance/sandbox/api/guides-test.js b/tests/acceptance/sandbox/api/guides-test.js
index a0f56531f..0908d509b 100644
--- a/tests/acceptance/sandbox/api/guides-test.js
+++ b/tests/acceptance/sandbox/api/guides-test.js
@@ -1,13 +1,13 @@
import { module, test } from 'qunit';
import { setupApplicationTest } from 'ember-qunit';
-import setupMirage from 'ember-cli-mirage/test-support/setup-mirage';
+import { setupMockVersions } from '../../../helpers/mock-versions';
import { currentURL, visit } from '@ember/test-helpers';
import modulePage from '../../../pages/api/module';
module('Acceptance | Sandbox | API | Guides', function (hooks) {
setupApplicationTest(hooks);
- setupMirage(hooks);
+ setupMockVersions(hooks);
test('page index works', async function (assert) {
await visit('/sandbox');
diff --git a/tests/acceptance/sandbox/api/helpers-test.js b/tests/acceptance/sandbox/api/helpers-test.js
index b8b9e238e..bc3ab0f66 100644
--- a/tests/acceptance/sandbox/api/helpers-test.js
+++ b/tests/acceptance/sandbox/api/helpers-test.js
@@ -1,6 +1,6 @@
import { module, test } from 'qunit';
import { setupApplicationTest } from 'ember-qunit';
-import setupMirage from 'ember-cli-mirage/test-support/setup-mirage';
+import { setupMockVersions } from '../../../helpers/mock-versions';
import { currentURL, visit } from '@ember/test-helpers';
import modulePage from '../../../pages/api/module';
@@ -8,7 +8,7 @@ import classPage from '../../../pages/api/class';
module('Acceptance | Sandbox | API | helpers', function (hooks) {
setupApplicationTest(hooks);
- setupMirage(hooks);
+ setupMockVersions(hooks);
module('standard helpers', function () {
for (let documenter of ['yuidoc']) {
diff --git a/tests/acceptance/search-test.js b/tests/acceptance/search-test.js
index e6a4fd58c..803594616 100644
--- a/tests/acceptance/search-test.js
+++ b/tests/acceptance/search-test.js
@@ -1,11 +1,11 @@
import { module, test } from 'qunit';
import { setupApplicationTest } from 'ember-qunit';
-import setupMirage from 'ember-cli-mirage/test-support/setup-mirage';
+import { setupMockVersions } from '../helpers/mock-versions';
import { click, currentURL, fillIn, visit, waitFor } from '@ember/test-helpers';
module('Acceptance | Search', function (hooks) {
setupApplicationTest(hooks);
- setupMirage(hooks);
+ setupMockVersions(hooks);
test('search works for guides pages', async function (assert) {
await visit('/');
diff --git a/tests/acceptance/version-selector-test.js b/tests/acceptance/version-selector-test.js
index f71a38c90..800dc0369 100644
--- a/tests/acceptance/version-selector-test.js
+++ b/tests/acceptance/version-selector-test.js
@@ -1,13 +1,16 @@
import { module, test } from 'qunit';
import { setupApplicationTest } from 'ember-qunit';
-import setupMirage from 'ember-cli-mirage/test-support/setup-mirage';
+import {
+ setupMockVersions,
+ mockVersionsEndpoint,
+} from '../helpers/mock-versions';
import { visit, click } from '@ember/test-helpers';
let config;
module('Acceptance | Version selector test', function (hooks) {
setupApplicationTest(hooks);
- setupMirage(hooks);
+ setupMockVersions(hooks);
hooks.beforeEach(async function () {
config = this.owner.resolveRegistration('config:environment');
@@ -42,7 +45,7 @@ module('Acceptance | Version selector test', function (hooks) {
});
test(`the version selector renders correctly`, async function (assert) {
- server.get('/versions.json', {
+ mockVersionsEndpoint(this.server, {
'-latest': {
sha: '53b73465d31925f26fd1f77881aefcaccce2915a',
tag: null,
@@ -106,7 +109,7 @@ module('Acceptance | Version selector test', function (hooks) {
});
test(`the version selector renders a tag for latest if present`, async function (assert) {
- server.get('/versions.json', {
+ mockVersionsEndpoint(this.server, {
'-latest': {
sha: '53b73465d31925f26fd1f77881aefcaccce2915a',
tag: 'v0.1.0',
@@ -160,7 +163,7 @@ module('Acceptance | Version selector test', function (hooks) {
});
test(`the version selector honors the primary branch`, async function (assert) {
- server.get('/versions.json', {
+ mockVersionsEndpoint(this.server, {
'-latest': {
sha: '53b73465d31925f26fd1f77881aefcaccce2915a',
tag: null,
diff --git a/tests/dummy/app/pods/sandbox/route.js b/tests/dummy/app/pods/sandbox/route.js
index 1beb22a92..342656b0f 100644
--- a/tests/dummy/app/pods/sandbox/route.js
+++ b/tests/dummy/app/pods/sandbox/route.js
@@ -2,9 +2,9 @@ import Route from '@ember/routing/route';
import { inject as service } from '@ember/service';
export default class SandboxRoute extends Route {
- @service store;
+ @service docsStore;
model() {
- return this.store.findRecord('project', 'sandbox');
+ return this.docsStore.findRecord('project', 'sandbox');
}
}
diff --git a/tests/dummy/app/templates/docs/quickstart.md b/tests/dummy/app/templates/docs/quickstart.md
index 2cc07e752..6d9593894 100644
--- a/tests/dummy/app/templates/docs/quickstart.md
+++ b/tests/dummy/app/templates/docs/quickstart.md
@@ -6,12 +6,6 @@
ember install ember-cli-addon-docs
```
-[Ember Data](https://github.com/emberjs/data) is a required peer dependency, so if you're not already using it in your addon, you'll need to install it.
-
-```sh
-ember install ember-data
-```
-
## 2. Install ember-cli-addon-docs-yuidoc
API docs are autogenerated from comments in your source code, and require an additional plugin to be installed.
diff --git a/tests/dummy/config/ember-try.js b/tests/dummy/config/ember-try.js
index fefa4e740..03dfa652c 100644
--- a/tests/dummy/config/ember-try.js
+++ b/tests/dummy/config/ember-try.js
@@ -11,13 +11,8 @@ module.exports = async function () {
name: 'ember-lts-4.4',
npm: {
devDependencies: {
- '@ember-data/adapter': '~4.11.3',
- '@ember-data/model': '~4.11.3',
- '@ember-data/serializer': '~4.11.3',
- '@ember-data/store': '~4.11.3',
'@ember/test-helpers': '^2.5.0',
'ember-cli-babel': '^7.26.11',
- 'ember-data': '~4.11.3',
'ember-source': '~4.4.0',
},
},
@@ -26,14 +21,9 @@ module.exports = async function () {
name: 'ember-lts-4.8',
npm: {
devDependencies: {
- '@ember-data/adapter': '~4.11.3',
- '@ember-data/model': '~4.11.3',
- '@ember-data/serializer': '~4.11.3',
- '@ember-data/store': '~4.11.3',
'@ember/test-helpers': '^2.5.0',
'@ember/test-waiters': '^3.1.0',
'ember-cli-babel': '^7.26.11',
- 'ember-data': '~4.11.3',
'ember-source': '~4.8.0',
},
},
@@ -42,14 +32,9 @@ module.exports = async function () {
name: 'ember-lts-4.12',
npm: {
devDependencies: {
- '@ember-data/adapter': '~4.11.3',
- '@ember-data/model': '~4.11.3',
- '@ember-data/serializer': '~4.11.3',
- '@ember-data/store': '~4.11.3',
'@ember/test-helpers': '^2.5.0',
'@ember/test-waiters': '^3.1.0',
'ember-cli-babel': '^7.26.11',
- 'ember-data': '~4.11.3',
'ember-source': '~4.12.0',
},
},
diff --git a/tests/dummy/mirage/config.js b/tests/dummy/mirage/config.js
deleted file mode 100644
index 0c324ffcc..000000000
--- a/tests/dummy/mirage/config.js
+++ /dev/null
@@ -1,31 +0,0 @@
-import config from '../config/environment';
-const projectTag = config['ember-cli-addon-docs']?.projectTag;
-import { createServer } from 'miragejs';
-
-export default function (config) {
- let finalConfig = {
- ...config,
- routes() {
- this.get('/versions.json', () => {
- return {
- '-latest': {
- sha: '53b73465d31925f26fd1f77881aefcaccce2915a',
- tag: projectTag,
- path: '',
- name: '-latest',
- },
- main: {
- sha: '12345',
- tag: null,
- path: 'main',
- name: 'main',
- },
- };
- });
-
- this.passthrough();
- },
- };
-
- return createServer(finalConfig);
-}
diff --git a/tests/dummy/mirage/scenarios/default.js b/tests/dummy/mirage/scenarios/default.js
deleted file mode 100644
index d388296b5..000000000
--- a/tests/dummy/mirage/scenarios/default.js
+++ /dev/null
@@ -1,7 +0,0 @@
-export default function (/* server */) {
- /*
- Seed your development database using your factories.
- This data will not be loaded in your tests.
- */
- // server.createList('post', 10);
-}
diff --git a/tests/dummy/mirage/serializers/application.js b/tests/dummy/mirage/serializers/application.js
deleted file mode 100644
index fbb4ad235..000000000
--- a/tests/dummy/mirage/serializers/application.js
+++ /dev/null
@@ -1 +0,0 @@
-export { JSONAPISerializer as default } from 'miragejs';
diff --git a/tests/helpers/mock-versions.js b/tests/helpers/mock-versions.js
new file mode 100644
index 000000000..9ac79eb92
--- /dev/null
+++ b/tests/helpers/mock-versions.js
@@ -0,0 +1,48 @@
+import Pretender from 'pretender';
+import config from 'dummy/config/environment';
+
+const projectTag = config['ember-cli-addon-docs']?.projectTag;
+
+const DEFAULT_VERSIONS = {
+ '-latest': {
+ sha: '53b73465d31925f26fd1f77881aefcaccce2915a',
+ tag: projectTag,
+ path: '',
+ name: '-latest',
+ },
+ main: {
+ sha: '12345',
+ tag: null,
+ path: 'main',
+ name: 'main',
+ },
+};
+
+export function setupMockVersions(hooks) {
+ hooks.beforeEach(function () {
+ this.server = new Pretender(function () {
+ this.get('/versions.json', () => [
+ 200,
+ { 'Content-Type': 'application/json' },
+ JSON.stringify(DEFAULT_VERSIONS),
+ ]);
+ });
+
+ // Let unhandled requests pass through
+ this.server.unhandledRequest = function (verb, path, request) {
+ request.passthrough();
+ };
+ });
+
+ hooks.afterEach(function () {
+ this.server.shutdown();
+ });
+}
+
+export function mockVersionsEndpoint(server, versions) {
+ server.get('/versions.json', () => [
+ 200,
+ { 'Content-Type': 'application/json' },
+ JSON.stringify(versions),
+ ]);
+}