UNPKG

@orbit/records

Version:

A flexible data access and synchronization layer.

106 lines 15.9 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.StandardRecordNormalizer = void 0; const core_1 = require("@orbit/core"); const utils_1 = require("@orbit/utils"); const record_1 = require("./record"); const record_exceptions_1 = require("./record-exceptions"); const { assert, deprecate } = core_1.Orbit; class StandardRecordNormalizer { constructor(settings) { const { schema, keyMap, cloneInputs, validateInputs } = settings; assert("StandardRecordNormalizer's `schema` must be specified in the `settings.schema` constructor argument", !!schema); this.schema = schema; this.keyMap = keyMap; this.cloneInputs = cloneInputs; this.validateInputs = validateInputs; } normalizeRecordType(type) { if (this.validateInputs) { if (typeof type !== 'string') { throw new core_1.Assertion('StandardRecordNormalizer expects record types to be strings'); } if (!this.schema.hasModel(type)) { throw new record_exceptions_1.ModelNotDefined(type); } } return type; } normalizeRecordIdentity(identity) { const { schema, keyMap, cloneInputs, validateInputs } = this; const { type } = identity; if (validateInputs && !schema.hasModel(type)) { throw new record_exceptions_1.ModelNotDefined(type); } if ((0, record_1.isRecordIdentity)(identity)) { return cloneInputs ? this.cloneRecordIdentity(identity) : identity; } else { if (keyMap === undefined) { throw new core_1.Assertion("StandardRecordNormalizer's `keyMap` must be specified in order to lookup an `id` from a `key`"); } const { key, value } = identity; if (typeof key !== 'string' || typeof value !== 'string') { throw new core_1.Assertion('StandardRecordNormalizer expects record identities in the form `{ type: string, id: string }` or `{ type: string, key: string, value: string }`'); } if (validateInputs && !schema.hasKey(type, key)) { throw new record_exceptions_1.KeyNotDefined(type, key); } let id = keyMap.keyToId(type, key, value); if (id === undefined) { id = this.schema.generateId(type); keyMap.pushRecord({ type, id, keys: { [key]: value } }); } return { type, id }; } } normalizeRecord(record) { const { keyMap, schema, cloneInputs, validateInputs } = this; const { type } = record; if (validateInputs && !schema.hasModel(type)) { throw new record_exceptions_1.ModelNotDefined(type); } let result = cloneInputs ? this.cloneRecord(record) : record; // If `initializeRecord` has been defined on the schema, continue to call it // but issue a deprecation warning. // TODO: Remove in v0.18 if (schema.initializeRecord !== undefined) { deprecate("RecordSchema's `initializeRecord` method should NOT be defined. Instead override `normalizeRecord` on the RecordNormalizer to initialize records."); result = schema.initializeRecord(result); } if (result.id === undefined) { const { keys } = result; // Lookup id from keys if possible if (keyMap !== undefined && keys !== undefined) { if (validateInputs) { Object.keys(keys).forEach((key) => { if (!schema.hasKey(type, key)) { throw new record_exceptions_1.KeyNotDefined(type, key); } }); } const id = keyMap.idFromKeys(result.type, keys); if (id) { result.id = id; } } // Generate an id if one has still not been assigned if (result.id === undefined) { result.id = schema.generateId(result.type); // Register any generated ids in the keyMap, if present if (keyMap && result.keys !== undefined) { keyMap.pushRecord(result); } } } return result; } cloneRecordIdentity(rid) { return (0, record_1.cloneRecordIdentity)(rid); } cloneRecord(record) { return (0, utils_1.clone)(record); } } exports.StandardRecordNormalizer = StandardRecordNormalizer; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RhbmRhcmQtcmVjb3JkLW5vcm1hbGl6ZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvc3RhbmRhcmQtcmVjb3JkLW5vcm1hbGl6ZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsc0NBQStDO0FBQy9DLHdDQUFxQztBQUNyQyxxQ0FPa0I7QUFDbEIsMkRBQXFFO0FBS3JFLE1BQU0sRUFBRSxNQUFNLEVBQUUsU0FBUyxFQUFFLEdBQUcsWUFBSyxDQUFDO0FBU3BDLE1BQWEsd0JBQXdCO0lBWW5DLFlBQVksUUFBMEM7UUFDcEQsTUFBTSxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsV0FBVyxFQUFFLGNBQWMsRUFBRSxHQUFHLFFBQVEsQ0FBQztRQUVqRSxNQUFNLENBQ0oscUdBQXFHLEVBQ3JHLENBQUMsQ0FBQyxNQUFNLENBQ1QsQ0FBQztRQUVGLElBQUksQ0FBQyxNQUFNLEdBQUcsTUFBTSxDQUFDO1FBQ3JCLElBQUksQ0FBQyxNQUFNLEdBQUcsTUFBTSxDQUFDO1FBQ3JCLElBQUksQ0FBQyxXQUFXLEdBQUcsV0FBVyxDQUFDO1FBQy9CLElBQUksQ0FBQyxjQUFjLEdBQUcsY0FBYyxDQUFDO0lBQ3ZDLENBQUM7SUFFRCxtQkFBbUIsQ0FBQyxJQUFZO1FBQzlCLElBQUksSUFBSSxDQUFDLGNBQWMsRUFBRTtZQUN2QixJQUFJLE9BQU8sSUFBSSxLQUFLLFFBQVEsRUFBRTtnQkFDNUIsTUFBTSxJQUFJLGdCQUFTLENBQ2pCLDZEQUE2RCxDQUM5RCxDQUFDO2FBQ0g7WUFFRCxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLEVBQUU7Z0JBQy9CLE1BQU0sSUFBSSxtQ0FBZSxDQUFDLElBQUksQ0FBQyxDQUFDO2FBQ2pDO1NBQ0Y7UUFFRCxPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7SUFFRCx1QkFBdUIsQ0FDckIsUUFBeUM7UUFFekMsTUFBTSxFQUFFLE1BQU0sRUFBRSxN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O3dCQUNoQyxJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxJQUFJLEVBQUUsR0FBRyxDQUFDLEVBQUU7NEJBQzdCLE1BQU0sSUFBSSxpQ0FBYSxDQUFDLElBQUksRUFBRSxHQUFHLENBQUMsQ0FBQzt5QkFDcEM7b0JBQ0gsQ0FBQyxDQUFDLENBQUM7aUJBQ0o7Z0JBRUQsTUFBTSxFQUFFLEdBQUcsTUFBTSxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDO2dCQUNoRCxJQUFJLEVBQUUsRUFBRTtvQkFDTixNQUFNLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQztpQkFDaEI7YUFDRjtZQUVELG9EQUFvRDtZQUNwRCxJQUFJLE1BQU0sQ0FBQyxFQUFFLEtBQUssU0FBUyxFQUFFO2dCQUMzQixNQUFNLENBQUMsRUFBRSxHQUFHLE1BQU0sQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDO2dCQUUzQyx1REFBdUQ7Z0JBQ3ZELElBQUksTUFBTSxJQUFJLE1BQU0sQ0FBQyxJQUFJLEtBQUssU0FBUyxFQUFFO29CQUN2QyxNQUFNLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxDQUFDO2lCQUMzQjthQUNGO1NBQ0Y7UUFFRCxPQUFPLE1BQTJCLENBQUM7SUFDckMsQ0FBQztJQUVTLG1CQUFtQixDQUFDLEdBQW1CO1FBQy9DLE9BQU8sSUFBQSw0QkFBbUIsRUFBQyxHQUFHLENBQUMsQ0FBQztJQUNsQyxDQUFDO0lBRVMsV0FBVyxDQUFDLE1BQTJCO1FBQy9DLE9BQU8sSUFBQSxhQUFLLEVBQUMsTUFBTSxDQUFDLENBQUM7SUFDdkIsQ0FBQztDQUNGO0FBaEpELDREQWdKQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEFzc2VydGlvbiwgT3JiaXQgfSBmcm9tICdAb3JiaXQvY29yZSc7XG5pbXBvcnQgeyBjbG9uZSB9IGZyb20gJ0BvcmJpdC91dGlscyc7XG5pbXBvcnQge1xuICBjbG9uZVJlY29yZElkZW50aXR5LFxuICBJbml0aWFsaXplZFJlY29yZCxcbiAgaXNSZWNvcmRJZGVudGl0eSxcbiAgUmVjb3JkSWRlbnRpdHksXG4gIFJlY29yZEtleVZhbHVlLFxuICBVbmluaXRpYWxpemVkUmVjb3JkXG59IGZyb20gJy4vcmVjb3JkJztcbmltcG9ydCB7IEtleU5vdERlZmluZWQsIE1vZGVsTm90RGVmaW5lZCB9IGZyb20gJy4vcmVjb3JkLWV4Y2VwdGlvbnMnO1xuaW1wb3J0IHsgUmVjb3JkS2V5TWFwIH0gZnJvbSAnLi9yZWNvcmQta2V5LW1hcCc7XG5pbXBvcnQgeyBSZWNvcmROb3JtYWxpemVyIH0gZnJvbSAnLi9yZWNvcmQtbm9ybWFsaXplcic7XG5pbXBvcnQgeyBSZWNvcmRTY2hlbWEgfSBmcm9tICcuL3JlY29yZC1zY2hlbWEnO1xuXG5jb25zdCB7IGFzc2VydCwgZGVwcmVjYXRlIH0gPSBPcmJpdDtcblxuZXhwb3J0IGludGVyZmFjZSBTdGFuZGFyZFJlY29yZE5vcm1hbGl6ZXJTZXR0aW5ncyB7XG4gIHNjaGVtYTogUmVjb3JkU2NoZW1hO1xuICBrZXlNYXA/OiBSZWNvcmRLZXlNYXA7XG4gIGNsb25lSW5wdXRzPzogYm9vbGVhbjtcbiAgdmFsaWRhdGVJbnB1dHM/OiBib29sZWFuO1xufVxuXG5leHBvcnQgY2xhc3MgU3RhbmRhcmRSZWNvcmROb3JtYWxpemVyXG4gIGltcGxlbWVudHNcbiAgICBSZWNvcmROb3JtYWxpemVyPFxuICAgICAgc3RyaW5nLFxuICAgICAgUmVjb3JkSWRlbnRpdHkgfCBSZWNvcmRLZXlWYWx1ZSxcbiAgICAgIFVuaW5pdGlhbGl6ZWRSZWNvcmRcbiAgICA+IHtcbiAgc2NoZW1hOiBSZWNvcmRTY2hlbWE7XG4gIGtleU1hcD86IFJlY29yZEtleU1hcDtcbiAgY2xvbmVJbnB1dHM/OiBib29sZWFuO1xuICB2YWxpZGF0ZUlucHV0cz86IGJvb2xlYW47XG5cbiAgY29uc3RydWN0b3Ioc2V0dGluZ3M6IFN0YW5kYXJkUmVjb3JkTm9ybWFsaXplclNldHRpbmdzKSB7XG4gICAgY29uc3QgeyBzY2hlbWEsIGtleU1hcCwgY2xvbmVJbnB1dHMsIHZhbGlkYXRlSW5wdXRzIH0gPSBzZXR0aW5ncztcblxuICAgIGFzc2VydChcbiAgICAgIFwiU3RhbmRhcmRSZWNvcmROb3JtYWxpemVyJ3MgYHNjaGVtYWAgbXVzdCBiZSBzcGVjaWZpZWQgaW4gdGhlIGBzZXR0aW5ncy5zY2hlbWFgIGNvbnN0cnVjdG9yIGFyZ3VtZW50XCIsXG4gICAgICAhIXNjaGVtYVxuICAgICk7XG5cbiAgICB0aGlzLnNjaGVtYSA9IHNjaGVtYTtcbiAgICB0aGlzLmtleU1hcCA9IGtleU1hcDtcbiAgICB0aGlzLmNsb25lSW5wdXRzID0gY2xvbmVJbnB1dHM7XG4gICAgdGhpcy52YWxpZGF0ZUlucHV0cyA9IHZhbGlkYXRlSW5wdXRzO1xuICB9XG5cbiAgbm9ybWFsaXplUmVjb3JkVHlwZSh0eXBlOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGlmICh0aGlzLnZhbGlkYXRlSW5wdXRzKSB7XG4gICAgICBpZiAodHlwZW9mIHR5cGUgIT09ICdzdHJpbmcnKSB7XG4gICAgICAgIHRocm93IG5ldyBBc3NlcnRpb24oXG4gICAgICAgICAgJ1N0YW5kYXJkUmVjb3JkTm9ybWFsaXplciBleHBlY3RzIHJlY29yZCB0eXBlcyB0byBiZSBzdHJpbmdzJ1xuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICBpZiAoIXRoaXMuc2NoZW1hLmhhc01vZGVsKHR5cGUpKSB7XG4gICAgICAgIHRocm93IG5ldyBNb2RlbE5vdERlZmluZWQodHlwZSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHR5cGU7XG4gIH1cblxuICBub3JtYWxpemVSZWNvcmRJZGVudGl0eShcbiAgICBpZGVudGl0eTogUmVjb3JkSWRlbnRpdHkgfCBSZWNvcmRLZXlWYWx1ZVxuICApOiBSZWNvcmRJZGVudGl0eSB7XG4gICAgY29uc3QgeyBzY2hlbWEsIGtleU1hcCwgY2xvbmVJbnB1dHMsIHZhbGlkYXRlSW5wdXRzIH0gPSB0aGlzO1xuICAgIGNvbnN0IHsgdHlwZSB9ID0gaWRlbnRpdHk7XG5cbiAgICBpZiAodmFsaWRhdGVJbnB1dHMgJiYgIXNjaGVtYS5oYXNNb2RlbCh0eXBlKSkge1xuICAgICAgdGhyb3cgbmV3IE1vZGVsTm90RGVmaW5lZCh0eXBlKTtcbiAgICB9XG5cbiAgICBpZiAoaXNSZWNvcmRJZGVudGl0eShpZGVudGl0eSkpIHtcbiAgICAgIHJldHVybiBjbG9uZUlucHV0cyA/IHRoaXMuY2xvbmVSZWNvcmRJZGVudGl0eShpZGVudGl0eSkgOiBpZGVudGl0eTtcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKGtleU1hcCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHRocm93IG5ldyBBc3NlcnRpb24oXG4gICAgICAgICAgXCJTdGFuZGFyZFJlY29yZE5vcm1hbGl6ZXIncyBga2V5TWFwYCBtdXN0IGJlIHNwZWNpZmllZCBpbiBvcmRlciB0byBsb29rdXAgYW4gYGlkYCBmcm9tIGEgYGtleWBcIlxuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICBjb25zdCB7IGtleSwgdmFsdWUgfSA9IGlkZW50aXR5O1xuXG4gICAgICBpZiAodHlwZW9mIGtleSAhPT0gJ3N0cmluZycgfHwgdHlwZW9mIHZhbHVlICE9PSAnc3RyaW5nJykge1xuICAgICAgICB0aHJvdyBuZXcgQXNzZXJ0aW9uKFxuICAgICAgICAgICdTdGFuZGFyZFJlY29yZE5vcm1hbGl6ZXIgZXhwZWN0cyByZWNvcmQgaWRlbnRpdGllcyBpbiB0aGUgZm9ybSBgeyB0eXBlOiBzdHJpbmcsIGlkOiBzdHJpbmcgfWAgb3IgYHsgdHlwZTogc3RyaW5nLCBrZXk6IHN0cmluZywgdmFsdWU6IHN0cmluZyB9YCdcbiAgICAgICAgKTtcbiAgICAgIH1cblxuICAgICAgaWYgKHZhbGlkYXRlSW5wdXRzICYmICFzY2hlbWEuaGFzS2V5KHR5cGUsIGtleSkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEtleU5vdERlZmluZWQodHlwZSwga2V5KTtcbiAgICAgIH1cblxuICAgICAgbGV0IGlkID0ga2V5TWFwLmtleVRvSWQodHlwZSwga2V5LCB2YWx1ZSk7XG5cbiAgICAgIGlmIChpZCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGlkID0gdGhpcy5zY2hlbWEuZ2VuZXJhdGVJZCh0eXBlKTtcbiAgICAgICAga2V5TWFwLnB1c2hSZWNvcmQoeyB0eXBlLCBpZCwga2V5czogeyBba2V5XTogdmFsdWUgfSB9KTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHsgdHlwZSwgaWQgfTtcbiAgICB9XG4gIH1cblxuICBub3JtYWxpemVSZWNvcmQocmVjb3JkOiBVbmluaXRpYWxpemVkUmVjb3JkKTogSW5pdGlhbGl6ZWRSZWNvcmQge1xuICAgIGNvbnN0IHsga2V5TWFwLCBzY2hlbWEsIGNsb25lSW5wdXRzLCB2YWxpZGF0ZUlucHV0cyB9ID0gdGhpcztcbiAgICBjb25zdCB7IHR5cGUgfSA9IHJlY29yZDtcblxuICAgIGlmICh2YWxpZGF0ZUlucHV0cyAmJiAhc2NoZW1hLmhhc01vZGVsKHR5cGUpKSB7XG4gICAgICB0aHJvdyBuZXcgTW9kZWxOb3REZWZpbmVkKHR5cGUpO1xuICAgIH1cblxuICAgIGxldCByZXN1bHQgPSBjbG9uZUlucHV0cyA/IHRoaXMuY2xvbmVSZWNvcmQocmVjb3JkKSA6IHJlY29yZDtcblxuICAgIC8vIElmIGBpbml0aWFsaXplUmVjb3JkYCBoYXMgYmVlbiBkZWZpbmVkIG9uIHRoZSBzY2hlbWEsIGNvbnRpbnVlIHRvIGNhbGwgaXRcbiAgICAvLyBidXQgaXNzdWUgYSBkZXByZWNhdGlvbiB3YXJuaW5nLlxuICAgIC8vIFRPRE86IFJlbW92ZSBpbiB2MC4xOFxuICAgIGlmICgoc2NoZW1hIGFzIGFueSkuaW5pdGlhbGl6ZVJlY29yZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBkZXByZWNhdGUoXG4gICAgICAgIFwiUmVjb3JkU2NoZW1hJ3MgYGluaXRpYWxpemVSZWNvcmRgIG1ldGhvZCBzaG91bGQgTk9UIGJlIGRlZmluZWQuIEluc3RlYWQgb3ZlcnJpZGUgYG5vcm1hbGl6ZVJlY29yZGAgb24gdGhlIFJlY29yZE5vcm1hbGl6ZXIgdG8gaW5pdGlhbGl6ZSByZWNvcmRzLlwiXG4gICAgICApO1xuICAgICAgcmVzdWx0ID0gKHNjaGVtYSBhcyBhbnkpLmluaXRpYWxpemVSZWNvcmQocmVzdWx0KTtcbiAgICB9XG5cbiAgICBpZiAocmVzdWx0LmlkID09PSB1bmRlZmluZWQpIHtcbiAgICAgIGNvbnN0IHsga2V5cyB9ID0gcmVzdWx0O1xuXG4gICAgICAvLyBMb29rdXAgaWQgZnJvbSBrZXlzIGlmIHBvc3NpYmxlXG4gICAgICBpZiAoa2V5TWFwICE9PSB1bmRlZmluZWQgJiYga2V5cyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGlmICh2YWxpZGF0ZUlucHV0cykge1xuICAgICAgICAgIE9iamVjdC5rZXlzKGtleXMpLmZvckVhY2goKGtleSkgPT4ge1xuICAgICAgICAgICAgaWYgKCFzY2hlbWEuaGFzS2V5KHR5cGUsIGtleSkpIHtcbiAgICAgICAgICAgICAgdGhyb3cgbmV3IEtleU5vdERlZmluZWQodHlwZSwga2V5KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGlkID0ga2V5TWFwLmlkRnJvbUtleXMocmVzdWx0LnR5cGUsIGtleXMpO1xuICAgICAgICBpZiAoaWQpIHtcbiAgICAgICAgICByZXN1bHQuaWQgPSBpZDtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBHZW5lcmF0ZSBhbiBpZCBpZiBvbmUgaGFzIHN0aWxsIG5vdCBiZWVuIGFzc2lnbmVkXG4gICAgICBpZiAocmVzdWx0LmlkID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgcmVzdWx0LmlkID0gc2NoZW1hLmdlbmVyYXRlSWQocmVzdWx0LnR5cGUpO1xuXG4gICAgICAgIC8vIFJlZ2lzdGVyIGFueSBnZW5lcmF0ZWQgaWRzIGluIHRoZSBrZXlNYXAsIGlmIHByZXNlbnRcbiAgICAgICAgaWYgKGtleU1hcCAmJiByZXN1bHQua2V5cyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAga2V5TWFwLnB1c2hSZWNvcmQocmVzdWx0KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiByZXN1bHQgYXMgSW5pdGlhbGl6ZWRSZWNvcmQ7XG4gIH1cblxuICBwcm90ZWN0ZWQgY2xvbmVSZWNvcmRJZGVudGl0eShyaWQ6IFJlY29yZElkZW50aXR5KTogUmVjb3JkSWRlbnRpdHkge1xuICAgIHJldHVybiBjbG9uZVJlY29yZElkZW50aXR5KHJpZCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgY2xvbmVSZWNvcmQocmVjb3JkOiBVbmluaXRpYWxpemVkUmVjb3JkKTogVW5pbml0aWFsaXplZFJlY29yZCB7XG4gICAgcmV0dXJuIGNsb25lKHJlY29yZCk7XG4gIH1cbn1cbiJdfQ==