Skip to content

Commit dfe4b5c

Browse files
Merge pull request #21326 from NullVoxPopuli-ai-agent/strict-resolver-review-cleanup
Address review: drop cache, simplify pluralize, collapse setup-resolver
2 parents c557ce6 + f11a87b commit dfe4b5c

8 files changed

Lines changed: 42 additions & 177 deletions

File tree

package.json

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -230,8 +230,6 @@
230230
"@ember/engine/instance.js": "ember-source/@ember/engine/instance.js",
231231
"@ember/engine/lib/engine-parent.js": "ember-source/@ember/engine/lib/engine-parent.js",
232232
"@ember/engine/lib/strict-resolver.js": "ember-source/@ember/engine/lib/strict-resolver.js",
233-
"@ember/engine/lib/strict-resolver/cache.js": "ember-source/@ember/engine/lib/strict-resolver/cache.js",
234-
"@ember/engine/lib/strict-resolver/string.js": "ember-source/@ember/engine/lib/strict-resolver/string.js",
235233
"@ember/engine/parent.js": "ember-source/@ember/engine/parent.js",
236234
"@ember/enumerable/index.js": "ember-source/@ember/enumerable/index.js",
237235
"@ember/enumerable/mutable.js": "ember-source/@ember/enumerable/mutable.js",

packages/@ember/engine/lib/strict-resolver.ts

Lines changed: 7 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
11
import type { Factory, Resolver } from '@ember/owner';
2-
import { dasherize } from './strict-resolver/string';
32

43
export class StrictResolver implements Resolver {
54
// Ember's router uses this flag to decide whether to auto-generate
@@ -36,7 +35,7 @@ export class StrictResolver implements Resolver {
3635
}
3736

3837
#plural(s: string) {
39-
return this.#plurals.get(s) ?? pluralize(s);
38+
return this.#plurals.get(s) ?? s + 's';
4039
}
4140

4241
resolve(fullName: string): Factory<object> | object | undefined {
@@ -128,38 +127,14 @@ export class StrictResolver implements Resolver {
128127
}
129128
}
130129

131-
// Handle the common irregular English plurals plus the standard -s / -es
132-
// suffix rules. Users can override any type via the `plurals` constructor
133-
// option (including overriding these defaults).
134-
const IRREGULAR_PLURALS: Record<string, string> = Object.freeze({
135-
child: 'children',
136-
man: 'men',
137-
woman: 'women',
138-
person: 'people',
139-
mouse: 'mice',
140-
tooth: 'teeth',
141-
foot: 'feet',
142-
});
143-
144-
const NEEDS_ES_SUFFIX = /(s|ss|sh|ch|x|z)$/;
145-
const ENDS_IN_CONSONANT_Y = /([^aeiou])y$/;
146-
147-
function pluralize(singular: string): string {
148-
let irregular = IRREGULAR_PLURALS[singular];
149-
if (irregular) {
150-
return irregular;
151-
}
152-
if (ENDS_IN_CONSONANT_Y.test(singular)) {
153-
return singular.replace(ENDS_IN_CONSONANT_Y, '$1ies');
154-
}
155-
if (NEEDS_ES_SUFFIX.test(singular)) {
156-
return singular + 'es';
157-
}
158-
return singular + 's';
159-
}
160-
161130
const fileExtension = /\.\w{1,4}$/;
162131
const leadingDotSlash = /^\.\//;
132+
const camelCaseBoundary = /([a-z\d])([A-Z])/g;
133+
const spacesAndUnderscores = /[ _]/g;
134+
135+
function dasherize(str: string): string {
136+
return str.replace(camelCaseBoundary, '$1_$2').toLowerCase().replace(spacesAndUnderscores, '-');
137+
}
163138

164139
type Result =
165140
| {

packages/@ember/engine/lib/strict-resolver/cache.js

Lines changed: 0 additions & 35 deletions
This file was deleted.

packages/@ember/engine/lib/strict-resolver/string.js

Lines changed: 0 additions & 16 deletions
This file was deleted.

packages/@ember/engine/tests/resolver/-setup-resolver.js

Lines changed: 0 additions & 9 deletions
This file was deleted.

packages/@ember/engine/tests/resolver/basic-test.js

Lines changed: 7 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,13 @@
11
import { module, test } from 'qunit';
22
import { StrictResolver } from '@ember/engine/lib/strict-resolver';
3-
import { setupResolver } from './-setup-resolver';
43

54
module('strict-resolver | basic', function (hooks) {
65
let resolver;
76
let modules;
87

98
hooks.beforeEach(function () {
10-
({ resolver, modules } = setupResolver());
9+
modules = {};
10+
resolver = new StrictResolver(modules);
1111
});
1212

1313
test('can lookup something', function (assert) {
@@ -356,49 +356,11 @@ module('strict-resolver | basic', function (hooks) {
356356
assert.strictEqual(result, 'whatever', 'super-duper-config/environment is found');
357357
});
358358

359-
test('default plural handles -s / -ss / -sh / -ch / -x / -z suffixes', function (assert) {
360-
let cases = {
361-
'./buses/red': 'bus:red',
362-
'./brushes/broom': 'brush:broom',
363-
'./benches/park': 'bench:park',
364-
'./boxes/cardboard': 'box:cardboard',
365-
'./buzzes/loud': 'buzz:loud',
366-
'./classes/math': 'class:math',
367-
};
368-
369-
for (let [modulePath, lookup] of Object.entries(cases)) {
370-
let r = new StrictResolver({ [modulePath]: modulePath });
371-
assert.strictEqual(r.resolve(lookup), modulePath, `${lookup} -> ${modulePath}`);
372-
}
373-
});
374-
375-
test('default plural handles consonant + y suffix (y -> ies)', function (assert) {
376-
let r = new StrictResolver({ './categories/widgets': 'widgets-cat' });
377-
378-
assert.strictEqual(r.resolve('category:widgets'), 'widgets-cat');
379-
});
380-
381-
test('default plural handles common irregular nouns', function (assert) {
382-
let cases = {
383-
'./children/alice': 'child:alice',
384-
'./people/bob': 'person:bob',
385-
'./men/carl': 'man:carl',
386-
'./women/dana': 'woman:dana',
387-
'./mice/squeaky': 'mouse:squeaky',
388-
'./teeth/molar': 'tooth:molar',
389-
'./feet/left': 'foot:left',
390-
};
391-
392-
for (let [modulePath, lookup] of Object.entries(cases)) {
393-
let r = new StrictResolver({ [modulePath]: modulePath });
394-
assert.strictEqual(r.resolve(lookup), modulePath, `${lookup} -> ${modulePath}`);
395-
}
396-
});
397-
398-
test('custom plural overrides irregular default', function (assert) {
399-
// a user who insists on "childs" should be able to opt out of the
400-
// built-in irregular plural
401-
let r = new StrictResolver({ './childs/alice': 'alice' }, { child: 'childs' });
359+
test('irregular plurals must be opted into via the plurals option', function (assert) {
360+
// Default pluralization is naive (type + 's'), matching ember-resolver's
361+
// behavior. A consumer that wants proper English irregulars registers
362+
// them up-front via the plurals map.
363+
let r = new StrictResolver({ './children/alice': 'alice' }, { child: 'children' });
402364

403365
assert.strictEqual(r.resolve('child:alice'), 'alice');
404366
});

packages/@ember/engine/tests/resolver/dasherize_test.js

Lines changed: 0 additions & 36 deletions
This file was deleted.

smoke-tests/scenarios/scenarios.ts

Lines changed: 28 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,34 @@ function embroiderWebpack(project: Project) {
2121

2222
function embroiderVite(project: Project) {}
2323

24+
// Swap the v2-app-template's default app.js for a strict-resolver variant:
25+
// no ember-resolver, no compatModules, no modulePrefix — just a `modules =
26+
// {...import.meta.glob(...)}` literal. Making this a variant of
27+
// v2AppScenarios means every test that runs against v2AppScenarios also
28+
// runs against this configuration.
29+
function strictResolver(project: Project) {
30+
project.mergeFiles({
31+
app: {
32+
'app.js': `
33+
import Application from '@ember/application';
34+
import Router from './router';
35+
36+
export default class App extends Application {
37+
modules = {
38+
'./router': { default: Router },
39+
...import.meta.glob('./services/**/*.{js,ts}', { eager: true }),
40+
...import.meta.glob('./controllers/**/*.{js,ts}', { eager: true }),
41+
...import.meta.glob('./routes/**/*.{js,ts}', { eager: true }),
42+
...import.meta.glob('./components/**/*.{gjs,gts,js,ts}', { eager: true }),
43+
...import.meta.glob('./helpers/**/*.{js,ts}', { eager: true }),
44+
...import.meta.glob('./templates/**/*.{hbs,gjs,gts}', { eager: true }),
45+
};
46+
}
47+
`,
48+
},
49+
});
50+
}
51+
2452
export const v1AppScenarios = Scenarios.fromProject(() =>
2553
Project.fromDir(dirname(require.resolve('../app-template/package.json')), { linkDevDeps: true })
2654
).expand({
@@ -36,8 +64,6 @@ export const v2AppScenarios = Scenarios.fromProject(() =>
3664
embroiderVite,
3765
});
3866

39-
function strictResolver(project: Project) {}
40-
4167
export const strictAppScenarios = Scenarios.fromProject(() =>
4268
Project.fromDir(dirname(require.resolve('../v2-app-template/package.json')), {
4369
linkDevDeps: true,

0 commit comments

Comments
 (0)