Skip to content

Commit

Permalink
feat: findRecord as legacy op, native promises
Browse files Browse the repository at this point in the history
  • Loading branch information
runspired committed Mar 26, 2023
1 parent 25d477e commit 7154acb
Show file tree
Hide file tree
Showing 136 changed files with 3,238 additions and 3,719 deletions.
1 change: 0 additions & 1 deletion .eslintrc.js
Original file line number Diff line number Diff line change
Expand Up @@ -217,7 +217,6 @@ module.exports = {
'ember-data-types/q/ember-data-json-api.ts',
'ember-data-types/q/ds-model.ts',
'packages/store/src/-private/managers/record-data-store-wrapper.ts',
'packages/store/src/-private/network/snapshot.ts',
'packages/store/src/-private/legacy-model-support/schema-definition-service.ts',
'packages/store/src/-private/network/request-cache.ts',
'packages/store/src/-private/legacy-model-support/record-reference.ts',
Expand Down
1 change: 1 addition & 0 deletions @types/@ember-data/env.d.ts
Original file line number Diff line number Diff line change
@@ -1 +1,2 @@
export const DEBUG: boolean;
export const TESTING: boolean;
1 change: 1 addition & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -163,6 +163,7 @@ let app = new EmberApp(defaults, {
LOG_OPERATIONS: false, // updates to cache remote state
LOG_MUTATIONS: false, // updates to cache local state
LOG_NOTIFICATIONS: false,
LOG_REQUESTS: false, // log Requests issued via the request manager
LOG_REQUEST_STATUS: false,
LOG_IDENTIFIERS: false,
LOG_GRAPH: false, // relationship storage
Expand Down
3 changes: 1 addition & 2 deletions ember-data-types/q/minimum-adapter-interface.ts
Original file line number Diff line number Diff line change
@@ -1,9 +1,8 @@
/**
* @module @ember-data/experimental-preview-types
*/
import type { SnapshotRecordArray } from '@ember-data/legacy-compat/-private';
import type { Snapshot, SnapshotRecordArray } from '@ember-data/legacy-compat/-private';
import type Store from '@ember-data/store';
import type Snapshot from '@ember-data/store/-private/network/snapshot';
import type { Collection } from '@ember-data/store/-private/record-arrays/identifier-array';

import type { ModelSchema } from './ds-model';
Expand Down
2 changes: 1 addition & 1 deletion ember-data-types/q/minimum-serializer-interface.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,8 +3,8 @@
*/
import type { Object as JSONObject } from 'json-typescript';

import type { Snapshot } from '@ember-data/legacy-compat/-private';
import type Store from '@ember-data/store';
import type Snapshot from '@ember-data/store/-private/network/snapshot';

import type { ModelSchema } from './ds-model';
import type { JsonApiDocument, SingleResourceDocument } from './ember-data-json-api';
Expand Down
1 change: 1 addition & 0 deletions packages/-ember-data/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -163,6 +163,7 @@ let app = new EmberApp(defaults, {
LOG_OPERATIONS: false, // updates to cache remote state
LOG_MUTATIONS: false, // updates to cache local state
LOG_NOTIFICATIONS: false,
LOG_REQUESTS: false, // log Requests issued via the request manager
LOG_REQUEST_STATUS: false,
LOG_IDENTIFIERS: false,
LOG_GRAPH: false, // relationship storage
Expand Down
30 changes: 30 additions & 0 deletions packages/-ember-data/addon-test-support/index.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
import { assert } from '@ember/debug';
import { render as renderTemplate, settled } from '@ember/test-helpers';

import * as QUnit from 'qunit';

import { PRODUCTION } from '@ember-data/env';

/*
Temporary replacement for the render test helper
which we will deprecate in EmberData 5.0, this allows
an app to incrementally migrate to tests that render async
relationships in stages with potential for tests in between.
*/
export async function render(template) {
await renderTemplate(template);
const owner = QUnit.config.current.testEnvironment.owner;
const pending = owner.lookup('service:store')._getAllPending();

// this should only be necessary in production tests
// where @ember/test-waiters is deactivated :()
if (PRODUCTION) {
assert(
`No pending requests exist in this test, use \`import { render } from '@ember/test-helpers';\``,
pending.length
);

await pending;
await settled();
}
}
4 changes: 1 addition & 3 deletions packages/-ember-data/addon/-private/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4,23 +4,21 @@ import PromiseProxyMixin from '@ember/object/promise-proxy-mixin';
import ObjectProxy from '@ember/object/proxy';

import { LegacyNetworkHandler } from '@ember-data/legacy-compat';
import { FetchManager } from '@ember-data/legacy-compat/-private';
import { RequestManager } from '@ember-data/request';
import { Fetch } from '@ember-data/request/fetch';
import BaseStore from '@ember-data/store';

export class Store extends BaseStore {
constructor(args: Record<string, unknown>) {
super(args);
this._fetchManager = new FetchManager(this);
this.requestManager = new RequestManager();
this.requestManager.use([LegacyNetworkHandler, Fetch]);
}
}

export { default as DS } from './core';
export { Errors } from '@ember-data/model/-private';
export { Snapshot } from '@ember-data/store/-private';
export { Snapshot } from '@ember-data/legacy-compat/-private';

// `ember-data-model-fragments' and `ember-data-change-tracker` rely on `normalizeModelName`
export { RecordArrayManager, normalizeModelName, coerceId } from '@ember-data/store/-private';
Expand Down
1 change: 1 addition & 0 deletions packages/-ember-data/addon/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -148,6 +148,7 @@ that has not explicitly activated it. To activate it set the appropriate flag to
LOG_OPERATIONS: false, // updates to cache remote state
LOG_MUTATIONS: false, // updates to cache local state
LOG_NOTIFICATIONS: false,
LOG_REQUESTS: false, // log Requests issued via the request manager
LOG_REQUEST_STATUS: false,
LOG_IDENTIFIERS: false,
LOG_GRAPH: false,
Expand Down
2 changes: 1 addition & 1 deletion packages/-ember-data/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ const merge = require('broccoli-merge-trees');
const addonBuildConfigForDataPackage = require('@ember-data/private-build-infra/src/addon-build-config-for-data-package');
const version = require('@ember-data/private-build-infra/src/create-version-module');

const addonBaseConfig = addonBuildConfigForDataPackage('ember-data');
const addonBaseConfig = addonBuildConfigForDataPackage(require('./package.json'));

module.exports = Object.assign({}, addonBaseConfig, {
shouldRollupPrivate: true,
Expand Down
38 changes: 7 additions & 31 deletions packages/adapter/addon-main.js
Original file line number Diff line number Diff line change
@@ -1,35 +1,9 @@
const requireModule = require('@ember-data/private-build-infra/src/utilities/require-module');
const getEnv = require('@ember-data/private-build-infra/src/utilities/get-env');
const detectModule = require('@ember-data/private-build-infra/src/utilities/detect-module');

const pkg = require('./package.json');

// do our best to detect being present
// Note: when this is not enough, consuming apps may need
// to "hoist" peer-deps or specify us as a direct dependency
// in order to deal with peer-dep bugs in package managers
function detectModule(moduleName) {
try {
// package managers have peer-deps bugs where another library
// bringing a peer-dependency doesn't necessarily result in all
// versions of the dependent getting the peer-dependency
//
// so we resolve from project as well as from our own location
//
// eslint-disable-next-line node/no-missing-require
require.resolve(moduleName, { paths: [process.cwd(), __dirname] });
return true;
} catch {
try {
// ember-data brings all packages so if present we are present
//
// eslint-disable-next-line node/no-missing-require
require.resolve('ember-data', { paths: [process.cwd(), __dirname] });
return true;
} catch {
return false;
}
}
}

module.exports = {
name: pkg.name,

Expand All @@ -53,6 +27,7 @@ module.exports = {
LOG_OPERATIONS: false,
LOG_MUTATIONS: false,
LOG_NOTIFICATIONS: false,
LOG_REQUESTS: false,
LOG_REQUEST_STATUS: false,
LOG_IDENTIFIERS: false,
LOG_GRAPH: false,
Expand All @@ -61,8 +36,8 @@ module.exports = {
hostOptions.debug || {}
);

const HAS_DEBUG_PACKAGE = detectModule('@ember-data/debug');
const HAS_META_PACKAGE = detectModule('ember-data');
const HAS_DEBUG_PACKAGE = detectModule(require, '@ember-data/debug', __dirname, pkg);
const HAS_META_PACKAGE = detectModule(require, 'ember-data', __dirname, pkg);

const includeDataAdapterInProduction =
typeof hostOptions.includeDataAdapterInProduction === 'boolean'
Expand All @@ -78,7 +53,7 @@ module.exports = {
delete MACRO_PACKAGE_FLAGS['HAS_DEBUG_PACKAGE'];

Object.keys(MACRO_PACKAGE_FLAGS).forEach((key) => {
MACRO_PACKAGE_FLAGS[key] = detectModule(MACRO_PACKAGE_FLAGS[key]);
MACRO_PACKAGE_FLAGS[key] = detectModule(require, MACRO_PACKAGE_FLAGS[key], __dirname, pkg);
});

// copy configs forward
Expand All @@ -89,6 +64,7 @@ module.exports = {
ownConfig.features = Object.assign({}, FEATURES);
ownConfig.includeDataAdapter = includeDataAdapter;
ownConfig.packages = MACRO_PACKAGE_FLAGS;
ownConfig.env = getEnv(ownConfig);

this._emberDataConfig = ownConfig;
return ownConfig;
Expand Down
1 change: 0 additions & 1 deletion packages/adapter/rollup.config.mjs
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,6 @@ export default {
'@ember/service',
'@ember-data/store/-private',
'require',
'rsvp',
'ember-inflector',
'@ember/debug',
'@ember/string',
Expand Down
3 changes: 1 addition & 2 deletions packages/adapter/src/-private/build-url-mixin.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,8 +3,7 @@ import { camelize } from '@ember/string';

import { pluralize } from 'ember-inflector';

import type { SnapshotRecordArray } from '@ember-data/legacy-compat/-private';
import type Snapshot from '@ember-data/store/-private/network/snapshot';
import type { Snapshot, SnapshotRecordArray } from '@ember-data/legacy-compat/-private';
import type { Dict } from '@ember-data/types/q/utils';

/**
Expand Down
4 changes: 1 addition & 3 deletions packages/adapter/src/-private/utils/continue-on-reject.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,3 @@
import { resolve } from 'rsvp';

export default function continueOnReject<T>(promise: Promise<T>): Promise<T> {
return resolve(promise).catch((e) => e);
return Promise.resolve(promise).catch((e) => e);
}
26 changes: 8 additions & 18 deletions packages/adapter/src/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -138,12 +138,9 @@
import EmberObject from '@ember/object';
import { inject as service } from '@ember/service';

import { Promise as RSVPPromise } from 'rsvp';

import { DEBUG } from '@ember-data/env';
import type { SnapshotRecordArray } from '@ember-data/legacy-compat/-private';
import type { Snapshot, SnapshotRecordArray } from '@ember-data/legacy-compat/-private';
import type Store from '@ember-data/store';
import type { Snapshot } from '@ember-data/store/-private';
import type ShimModelClass from '@ember-data/store/-private/legacy-model-support/shim-model-class';
import type { AdapterPayload, MinimumAdapterInterface } from '@ember-data/types/q/minimum-adapter-interface';
import type { Dict } from '@ember-data/types/q/utils';
Expand Down Expand Up @@ -246,12 +243,11 @@ export default class Adapter extends EmberObject implements MinimumAdapterInterf
@return {Promise} promise
@public
*/
// @ts-expect-error
findRecord(store: Store, type: ShimModelClass, id: string, snapshot: Snapshot): Promise<AdapterPayload> {
if (DEBUG) {
throw new Error('You subclassed the Adapter class but missing a findRecord override');
}

return RSVPPromise.resolve();
}

/**
Expand Down Expand Up @@ -290,12 +286,11 @@ export default class Adapter extends EmberObject implements MinimumAdapterInterf
type: ShimModelClass,
neverSet,
snapshotRecordArray: SnapshotRecordArray
// @ts-expect-error
): Promise<AdapterPayload> {
if (DEBUG) {
throw new Error('You subclassed the Adapter class but missing a findAll override');
}

return RSVPPromise.resolve();
}

/**
Expand Down Expand Up @@ -330,12 +325,11 @@ export default class Adapter extends EmberObject implements MinimumAdapterInterf
@return {Promise} promise
@public
*/
// @ts-expect-error
query(store: Store, type: ShimModelClass, query): Promise<AdapterPayload> {
if (DEBUG) {
throw new Error('You subclassed the Adapter class but missing a query override');
}

return RSVPPromise.resolve();
}

/**
Expand Down Expand Up @@ -376,12 +370,11 @@ export default class Adapter extends EmberObject implements MinimumAdapterInterf
@return {Promise} promise
@public
*/
// @ts-expect-error
queryRecord(store: Store, type: ShimModelClass, query, adapterOptions): Promise<AdapterPayload> {
if (DEBUG) {
throw new Error('You subclassed the Adapter class but missing a queryRecord override');
}

return RSVPPromise.resolve();
}

/**
Expand Down Expand Up @@ -487,12 +480,11 @@ export default class Adapter extends EmberObject implements MinimumAdapterInterf
@return {Promise} promise
@public
*/
// @ts-expect-error
createRecord(store: Store, type: ShimModelClass, snapshot: Snapshot): Promise<AdapterPayload> {
if (DEBUG) {
throw new Error('You subclassed the Adapter class but missing a createRecord override');
}

return RSVPPromise.resolve();
}

/**
Expand Down Expand Up @@ -545,12 +537,11 @@ export default class Adapter extends EmberObject implements MinimumAdapterInterf
@return {Promise} promise
@public
*/
// @ts-expect-error
updateRecord(store: Store, type: ShimModelClass, snapshot: Snapshot): Promise<AdapterPayload> {
if (DEBUG) {
throw new Error('You subclassed the Adapter class but missing a updateRecord override');
}

return RSVPPromise.resolve();
}

/**
Expand Down Expand Up @@ -595,12 +586,11 @@ export default class Adapter extends EmberObject implements MinimumAdapterInterf
@return {Promise} promise
@public
*/
// @ts-expect-error
deleteRecord(store: Store, type: ShimModelClass, snapshot: Snapshot): Promise<AdapterPayload> {
if (DEBUG) {
throw new Error('You subclassed the Adapter class but missing a deleteRecord override');
}

return RSVPPromise.resolve();
}

/**
Expand Down
2 changes: 1 addition & 1 deletion packages/adapter/src/json-api.ts
Original file line number Diff line number Diff line change
Expand Up @@ -6,9 +6,9 @@ import { dasherize } from '@ember/string';

import { pluralize } from 'ember-inflector';

import type { Snapshot } from '@ember-data/legacy-compat/-private';
import type Store from '@ember-data/store';
import type ShimModelClass from '@ember-data/store/-private/legacy-model-support/shim-model-class';
import type Snapshot from '@ember-data/store/-private/network/snapshot';
import type { AdapterPayload } from '@ember-data/types/q/minimum-adapter-interface';

import { serializeIntoHash } from './-private';
Expand Down
13 changes: 5 additions & 8 deletions packages/adapter/src/rest.ts
Original file line number Diff line number Diff line change
Expand Up @@ -6,13 +6,10 @@ import { assert, warn } from '@ember/debug';
import { computed } from '@ember/object';
import { join } from '@ember/runloop';

import { Promise as RSVPPromise } from 'rsvp';

import { DEBUG } from '@ember-data/env';
import type { SnapshotRecordArray } from '@ember-data/legacy-compat/-private';
import type { Snapshot, SnapshotRecordArray } from '@ember-data/legacy-compat/-private';
import type Store from '@ember-data/store';
import type ShimModelClass from '@ember-data/store/-private/legacy-model-support/shim-model-class';
import type Snapshot from '@ember-data/store/-private/network/snapshot';
import type { AdapterPayload } from '@ember-data/types/q/minimum-adapter-interface';
import type { Dict } from '@ember-data/types/q/utils';

Expand Down Expand Up @@ -1114,7 +1111,7 @@ class RESTAdapter extends Adapter.extend(BuildURLMixin) {
} else {
let hash: JQueryRequestInit = adapter.ajaxOptions(url, type, options);

return new RSVPPromise(function (resolve, reject) {
return new Promise(function (resolve, reject) {
hash.success = function (payload, textStatus, jqXHR) {
let response = ajaxSuccessHandler(adapter, payload, jqXHR, requestData);
join(null, resolve, response);
Expand All @@ -1126,7 +1123,7 @@ class RESTAdapter extends Adapter.extend(BuildURLMixin) {
};

adapter._ajax(hash);
}, 'DS: RESTAdapter#ajax ' + type + ' to ' + url);
});
}
}

Expand Down Expand Up @@ -1336,11 +1333,11 @@ function ajaxSuccess(
try {
response = adapter.handleResponse(responseData.status, responseData.headers, payload, requestData);
} catch (error) {
return RSVPPromise.reject(error);
return Promise.reject(error);
}

if (response && response.isAdapterError) {
return RSVPPromise.reject(response);
return Promise.reject(response);
} else {
return response;
}
Expand Down
Loading

0 comments on commit 7154acb

Please sign in to comment.