Skip to content

Commit 42f1a68

Browse files
committed
feat: ember data primitives
1 parent 630ed26 commit 42f1a68

File tree

113 files changed

+6341
-3522
lines changed

Some content is hidden

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

113 files changed

+6341
-3522
lines changed

.gitignore

+1
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ packages/schema-record/addon/
2525
packages/serializer/addon
2626
packages/store/addon
2727
packages/tracking/addon
28+
packages/ember/addon
2829

2930
# dependencies
3031
bower_components

.prettierrc.js

+16
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,28 @@
11
module.exports = {
22
trailingComma: 'es5',
33
printWidth: 120,
4+
plugins: ['prettier-plugin-ember-template-tag'],
45
overrides: [
56
{
67
files: '*.{js,ts,cjs,cts,mjs,mts}',
78
options: {
89
singleQuote: true,
910
},
1011
},
12+
{
13+
files: ['*.hbs'],
14+
options: {
15+
singleQuote: false,
16+
},
17+
},
18+
{
19+
files: ['*.gjs', '*.gts'],
20+
options: {
21+
parser: 'ember-template-tag',
22+
singleQuote: true,
23+
templateSingleQuote: false,
24+
trailingComma: 'es5',
25+
},
26+
},
1127
],
1228
};

@types/@glimmer/tracking.d.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,3 @@
11
export function cached(target: object, key: string, desc: PropertyDescriptor): void;
22

3-
export function tracked(target: object, key: string): void;
3+
export function tracked(target: object, key: string, desc?: object): void;

config/package.json

+1-1
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@
1515
"eslint-plugin-n": "^16.5.0",
1616
"eslint-plugin-qunit": "^8.0.1",
1717
"eslint-plugin-simple-import-sort": "^10.0.0",
18-
"typescript": "~5.3.3"
18+
"typescript": "^5.4.2"
1919
},
2020
"engines": {
2121
"node": ">= 18.19.1"

package.json

+8-4
Original file line numberDiff line numberDiff line change
@@ -38,8 +38,9 @@
3838
"test-external:ember-data-relationship-tracker": "node ./scripts/test-external-partner-project.js ember-data-relationship-tracker https://github.com/ef4/ember-data-relationship-tracker.git"
3939
},
4040
"devDependencies": {
41-
"bun-types": "^1.0.25",
41+
"@glint/core": "^1.3.0",
4242
"@types/semver": "^7.5.6",
43+
"bun-types": "^1.0.25",
4344
"chalk": "^4.1.2",
4445
"co": "^4.6.0",
4546
"command-line-args": "^5.2.1",
@@ -51,9 +52,11 @@
5152
"lerna-changelog": "^2.2.0",
5253
"pnpm-sync-dependencies-meta-injected": "0.0.10",
5354
"prettier": "^3.1.1",
55+
"prettier-plugin-ember-template-tag": "^2.0.0",
5456
"rimraf": "^5.0.5",
5557
"semver": "^7.5.4",
5658
"silent-error": "^1.1.1",
59+
"typescript": "^5.4.2",
5760
"url": "^0.11.3",
5861
"yuidocjs": "^0.10.2",
5962
"zlib": "1.0.5"
@@ -117,8 +120,8 @@
117120
"@embroider/macros": "^1.13.4",
118121
"broccoli-funnel": "^3.0.8",
119122
"broccoli-merge-trees": "^4.2.0",
120-
"@glimmer/validator": "^0.84.3",
121-
"ember-cli-babel": "^8.1.0",
123+
"@glimmer/validator": "^0.89.0",
124+
"ember-cli-babel": "^8.2.0",
122125
"ember-cli-htmlbars": "^6.3.0",
123126
"ember-cli-typescript": "^5.2.1",
124127
"@ember/string": "3.1.1",
@@ -139,7 +142,8 @@
139142
},
140143
"patchedDependencies": {
141144
"qunit@2.19.4": "patches/qunit@2.19.4.patch",
142-
"testem@3.11.0": "patches/testem@3.11.0.patch"
145+
"testem@3.11.0": "patches/testem@3.11.0.patch",
146+
"@ember/test-helpers@3.3.0": "patches/@ember__test-helpers@3.3.0.patch"
143147
}
144148
}
145149
}

packages/-ember-data/package.json

+1-1
Original file line numberDiff line numberDiff line change
@@ -67,7 +67,7 @@
6767
"ember-auto-import": "^2.7.0",
6868
"ember-cli-babel": "^8.2.0",
6969
"ember-inflector": "^4.0.2",
70-
"typescript": "^5.3.3",
70+
"typescript": "^5.4.2",
7171
"pnpm-sync-dependencies-meta-injected": "0.0.10",
7272
"webpack": "^5.89.0"
7373
},

packages/active-record/package.json

+1-1
Original file line numberDiff line numberDiff line change
@@ -107,7 +107,7 @@
107107
"ember-inflector": "^4.0.2",
108108
"ember-source": "~5.6.0",
109109
"rollup": "^4.9.6",
110-
"typescript": "^5.3.3",
110+
"typescript": "^5.4.2",
111111
"walk-sync": "^3.0.0"
112112
},
113113
"ember": {

packages/adapter/package.json

+1-1
Original file line numberDiff line numberDiff line change
@@ -124,7 +124,7 @@
124124
"ember-inflector": "^4.0.2",
125125
"ember-source": "~5.6.0",
126126
"rollup": "^4.9.6",
127-
"typescript": "^5.3.3",
127+
"typescript": "^5.4.2",
128128
"walk-sync": "^3.0.0",
129129
"webpack": "^5.89.0"
130130
},

packages/core-types/package.json

+1-1
Original file line numberDiff line numberDiff line change
@@ -67,7 +67,7 @@
6767
"@warp-drive/internal-config": "workspace:5.4.0-alpha.39",
6868
"ember-source": "~5.6.0",
6969
"rollup": "^4.9.6",
70-
"typescript": "^5.3.3",
70+
"typescript": "^5.4.2",
7171
"walk-sync": "^3.0.0",
7272
"webpack": "^5.89.0"
7373
},

packages/diagnostic/.eslintrc.cjs

+1-1
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ module.exports = {
1515
base.rules(),
1616
imports.rules(),
1717
isolation.rules({
18-
allowedImports: ['@ember/debug', '@ember/test-helpers'],
18+
allowedImports: ['@ember/debug', '@ember/test-helpers', '@glimmer/manager', '@ember/runloop'],
1919
}),
2020
{}
2121
),

packages/diagnostic/README.md

+1-1
Original file line numberDiff line numberDiff line change
@@ -442,7 +442,7 @@ module('My Module', function(hooks) {
442442
1. Add the following peer-deps to your app:
443443

444444
```diff
445-
+ "@ember/test-helpers": ">= 3.2.0",
445+
+ "@ember/test-helpers": ">= 3.3.0",
446446
+ "ember-cli-test-loader": ">= 3.1.0",
447447
+ "@embroider/addon-shim": ">= 1.8.6"
448448
```

packages/diagnostic/package.json

+9-4
Original file line numberDiff line numberDiff line change
@@ -73,9 +73,10 @@
7373
"_syncPnpm": "bun run sync-dependencies-meta-injected"
7474
},
7575
"peerDependencies": {
76-
"@ember/test-helpers": ">= 3.2.1",
76+
"@ember/test-helpers": ">= 3.3.0",
7777
"@embroider/addon-shim": ">= 1.8.7",
78-
"ember-cli-test-loader": ">= 3.1.0"
78+
"ember-cli-test-loader": ">= 3.1.0",
79+
"ember-source": ">= 4.12.0"
7980
},
8081
"peerDependenciesMeta": {
8182
"@ember/test-helpers": {
@@ -86,12 +87,16 @@
8687
},
8788
"@embroider/addon-shim": {
8889
"optional": true
90+
},
91+
"ember-source": {
92+
"optional": true
8993
}
9094
},
9195
"dependencies": {
9296
"chalk": "^5.3.0",
9397
"debug": "^4.3.4",
9498
"pnpm-sync-dependencies-meta-injected": "0.0.10",
99+
"ember-cli-htmlbars": "^6.3.0",
95100
"tmp": "^0.2.1"
96101
},
97102
"devDependencies": {
@@ -107,12 +112,12 @@
107112
"@rollup/plugin-node-resolve": "^15.2.3",
108113
"@warp-drive/internal-config": "workspace:5.4.0-alpha.39",
109114
"bun-types": "^1.0.25",
110-
"@ember/test-helpers": "^3.2.1",
115+
"@ember/test-helpers": "^3.3.0",
111116
"ember-source": "~5.6.0",
112117
"@glimmer/component": "^1.1.2",
113118
"ember-cli-test-loader": "^3.1.0",
114119
"rollup": "^4.9.6",
115-
"typescript": "^5.3.3",
120+
"typescript": "^5.4.2",
116121
"walk-sync": "^3.0.0"
117122
},
118123
"engines": {

packages/diagnostic/rollup.config.mjs

+1-1
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ export default {
1414
// You can augment this if you need to.
1515
output: addon.output(),
1616

17-
external: external(['@ember/test-helpers', 'ember-cli-test-loader/test-support/index']),
17+
external: external(['@ember/runloop', '@ember/test-helpers', 'ember-cli-test-loader/test-support/index']),
1818

1919
plugins: [
2020
// These are the modules that users should be able to import from your

packages/diagnostic/src/-define.ts

+116
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,116 @@
1+
import type { ModuleCallback, ModuleInfo, OrderedMap, TestCallback, TestContext, TestInfo } from './-types';
2+
import { assert, generateHash } from './-utils';
3+
import { Config, getCurrentModule, HooksDelegate, setCurrentModule } from './internals/config';
4+
5+
export { registerReporter } from './internals/delegating-reporter';
6+
export { setupGlobalHooks, configure } from './internals/config';
7+
export { PublicTestInfo } from './internals/run';
8+
9+
export const Modules: OrderedMap<ModuleInfo<TestContext>> = {
10+
byName: new Map(),
11+
byOrder: [],
12+
};
13+
14+
export type { Diagnostic, Hooks as NestedHooks, GlobalHooks, TestContext } from './-types';
15+
16+
export function module<TC extends TestContext = TestContext>(name: string, cb: ModuleCallback<TC>): void {
17+
const parentModule = getCurrentModule<TC>() ?? null;
18+
let moduleName = name;
19+
if (parentModule) {
20+
moduleName = `${parentModule.name} > ${name}`;
21+
} else {
22+
Config.totals.primaryModules++;
23+
}
24+
Config.totals.modules++;
25+
26+
assert(`Cannot add the same module name twice: ${moduleName}`, !Modules.byName.has(moduleName));
27+
const moduleConfig: ModuleInfo<TC>['config'] = {
28+
beforeEach: [],
29+
afterEach: [],
30+
beforeModule: [],
31+
afterModule: [],
32+
};
33+
const tests: OrderedMap<TestInfo<TC>> = { byName: new Map(), byOrder: [] };
34+
const modules: OrderedMap<ModuleInfo<TC>> = { byName: new Map(), byOrder: [] };
35+
const moduleInfo = {
36+
moduleName,
37+
name,
38+
cb,
39+
config: moduleConfig,
40+
tests,
41+
modules,
42+
parent: parentModule,
43+
};
44+
45+
setCurrentModule(moduleInfo);
46+
47+
if (parentModule) {
48+
parentModule.modules.byName.set(name, moduleInfo);
49+
parentModule.modules.byOrder.push(moduleInfo);
50+
} else {
51+
// @ts-expect-error TS poorly handles subtype constraints
52+
Modules.byName.set(name, moduleInfo);
53+
// @ts-expect-error TS poorly handles subtype constraints
54+
Modules.byOrder.push(moduleInfo);
55+
}
56+
57+
cb(HooksDelegate);
58+
setCurrentModule(parentModule as unknown as ModuleInfo<TC>);
59+
}
60+
61+
export function test<TC extends TestContext = TestContext>(name: string, cb: TestCallback<TC>): void {
62+
const currentModule = getCurrentModule<TC>();
63+
assert(`Cannot add a test outside of a module`, !!currentModule);
64+
assert(`Cannot add the same test name twice: ${name}`, !currentModule.tests.byName.has(name));
65+
Config.totals.tests++;
66+
67+
const testInfo = {
68+
id: generateHash(currentModule.moduleName + ' > ' + name),
69+
name,
70+
cb,
71+
skip: false,
72+
todo: false,
73+
module: currentModule,
74+
};
75+
76+
currentModule.tests.byName.set(name, testInfo);
77+
currentModule.tests.byOrder.push(testInfo);
78+
}
79+
80+
export function todo<TC extends TestContext = TestContext>(name: string, cb: TestCallback<TC>): void {
81+
const currentModule = getCurrentModule<TC>();
82+
assert(`Cannot add a test outside of a module`, !!currentModule);
83+
assert(`Cannot add the same test name twice: ${name}`, !currentModule.tests.byName.has(name));
84+
Config.totals.todo++;
85+
86+
const testInfo = {
87+
id: generateHash(currentModule.moduleName + ' > ' + name),
88+
name,
89+
cb,
90+
skip: false,
91+
todo: true,
92+
module: currentModule,
93+
};
94+
95+
currentModule.tests.byName.set(name, testInfo);
96+
currentModule.tests.byOrder.push(testInfo);
97+
}
98+
99+
export function skip<TC extends TestContext = TestContext>(name: string, cb: TestCallback<TC>): void {
100+
const currentModule = getCurrentModule<TC>();
101+
assert(`Cannot add a test outside of a module`, !!currentModule);
102+
assert(`Cannot add the same test name twice: ${name}`, !currentModule.tests.byName.has(name));
103+
Config.totals.skipped++;
104+
105+
const testInfo = {
106+
id: generateHash(currentModule.moduleName + ' > ' + name),
107+
name,
108+
cb,
109+
skip: true,
110+
todo: false,
111+
module: currentModule,
112+
};
113+
114+
currentModule.tests.byName.set(name, testInfo);
115+
currentModule.tests.byOrder.push(testInfo);
116+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
// @ts-expect-error: types for this API is not consistently available (via transitive
2+
// deps) and we do not currently want to make it an explicit dependency. It
3+
// does, however, consistently work at runtime. :sigh:
4+
import { getInternalComponentManager as getComponentManager } from '@glimmer/manager';
5+
6+
export type ComponentLike = object;
7+
8+
/**
9+
* We should ultimately get a new API from @glimmer/runtime that provides this functionality
10+
* (see https://github.com/emberjs/rfcs/pull/785 for more info).
11+
* @private
12+
* @param {Object} maybeComponent The thing you think might be a component
13+
* @returns {boolean} True if it's a component, false if not
14+
*/
15+
function isComponent(maybeComponent: object): maybeComponent is ComponentLike {
16+
return !!getComponentManager(maybeComponent, true);
17+
}
18+
19+
export default isComponent;

0 commit comments

Comments
 (0)