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

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 5 additions & 1 deletion src/-private/system/ember-orbit-setup.ts
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@ import {
import type { Strategy } from '@orbit/coordinator';
import type { Bucket } from '@orbit/core';
import { type MemorySourceSettings } from '@orbit/memory';
import { camelize } from '@orbit/serializers';

interface FactoryForFolderType {
'/data-buckets/': { default: { create(injections: object): Bucket } };
Expand Down Expand Up @@ -63,7 +64,10 @@ function registerDataModels(

for (const [key, module] of Object.entries(modules)) {
let [, name] = key.split(folder);
name = getName(name as string);
// Model file names are kebab-case on disk but record types are camelCase,
// so normalize here: every other consumer of `registrations.models`
// (the schema service, Cache#modelFactoryFor) looks models up by type.
name = camelize(getName(name as string));

registry[name] =
(module as FactoryForFolderType['/data-models/']).default ??
Expand Down
3 changes: 1 addition & 2 deletions src/-private/utils/orbit-registry.ts
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,6 @@ import type {
StandardRecordValidator,
UninitializedRecord,
} from '@orbit/records';
import { camelize } from '@orbit/serializers';
import type { StandardValidator, ValidatorForFn } from '@orbit/validators';

export type ServicesMap = {
Expand All @@ -41,7 +40,7 @@ export class OrbitRegistry {
services: ServicesMap = {} as ServicesMap;
schemaVersion?: number;
getRegisteredModels(): string[] {
return Object.keys(this.registrations.models).map(camelize);
return Object.keys(this.registrations.models);
}
}

Expand Down
37 changes: 37 additions & 0 deletions tests/integration/kebab-case-model-names-test.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
import { setupTest } from 'ember-qunit';
import { module, test } from 'qunit';
import { Store } from '#src/index.ts';
import { PlanetarySystem } from '../support/dummy-models';
import { createStore } from '../support/store';

// Data model files are kebab-case on disk, so `import.meta.glob` hands
// `setupOrbit` keys like `../data-models/planetary-system.ts` while record
// types stay camelCase. Registering under a kebab-case key must still produce
// a model reachable as `planetarySystem`.
module('Integration - kebab-case model file names', function (hooks) {
setupTest(hooks);

let store: Store;

hooks.beforeEach(function () {
store = createStore(this.owner, {
'planetary-system': PlanetarySystem,
});
});

test('the model is present in the schema under its camelCase type', function (assert) {
assert.true(
store.schema.hasModel('planetarySystem'),
'schema knows the camelCase type',
);
});

test('records of that type can be added', async function (assert) {
const system = await store.addRecord<PlanetarySystem>({
type: 'planetarySystem',
name: 'Home',
});

assert.strictEqual(system.name, 'Home', 'record was created');
});
});