UNPKG

@orbit/records

Version:

A flexible data access and synchronization layer.

208 lines 25.6 kB
"use strict"; var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) { var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; return c > 3 && r && Object.defineProperty(target, key, r), r; }; Object.defineProperty(exports, "__esModule", { value: true }); exports.RecordSchema = void 0; /* eslint-disable valid-jsdoc */ const core_1 = require("@orbit/core"); const record_exceptions_1 = require("./record-exceptions"); const { uuid, deprecate } = core_1.Orbit; /** * A `Schema` defines the models allowed in a source, including their keys, * attributes, and relationships. A single schema may be shared across multiple * sources. */ let RecordSchema = class RecordSchema { constructor(settings = {}) { if (settings.version === undefined) { settings.version = 1; } if (settings.models === undefined) { settings.models = {}; } this._applySettings(settings); } /** * Version */ get version() { return this._version; } /** * Upgrades Schema to a new version with new settings. * * Emits the `upgrade` event to cue sources to upgrade their data. */ async upgrade(settings = {}) { if (settings.version === undefined) { settings.version = this._version + 1; } this._applySettings(settings); await (0, core_1.fulfillAll)(this, 'upgrade', this._version); } /** * Registers a complete set of settings */ _applySettings(settings) { // Version if (settings.version !== undefined) { this._version = settings.version; } // Allow overrides if (settings.generateId) { this.generateId = settings.generateId; } if (settings.pluralize) { deprecate('Schema#pluralize has been deprecated. Use inflectors from in @orbit/serializers instead.'); this.pluralize = settings.pluralize; } if (settings.singularize) { deprecate('Schema#singularize has been deprecated. Use inflectors from @orbit/serializers instead.'); this.singularize = settings.singularize; } // Register model schemas if (settings.models) { this._deprecateRelationshipModel(settings.models); this._models = settings.models; } } /** * Generate an id for a given model type. */ // eslint-disable-next-line @typescript-eslint/no-unused-vars generateId(type) { return uuid(); } /** * A naive pluralization method. * * Deprecated in favor of inflectors now in @orbit/serializers * * @deprecated since v0.17, remove in v0.18 */ pluralize(word) { deprecate('Schema#pluralize has been deprecated. Use inflectors from @orbit/serializers instead.'); return word + 's'; } /** * A naive singularization method. * * Deprecated in favor of inflectors now in @orbit/serializers * * @deprecated since v0.17, remove in v0.18 */ singularize(word) { deprecate('Schema#singularize has been deprecated. Use inflectors from @orbit/serializers instead.'); if (word.lastIndexOf('s') === word.length - 1) { return word.substr(0, word.length - 1); } else { console.warn(`Orbit's built-in naive singularization rules cannot singularize ${word}. Pass singularize & pluralize functions to Schema to customize.`); return word; } } get models() { return this._models; } getModel(type) { const model = this.models[type]; if (model) { return model; } else { throw new record_exceptions_1.ModelNotDefined(type); } } getAttribute(type, attribute) { var _a; const model = this.getModel(type); const attributeDef = (_a = model.attributes) === null || _a === void 0 ? void 0 : _a[attribute]; if (attributeDef) { return attributeDef; } else { throw new record_exceptions_1.AttributeNotDefined(type, attribute); } } getKey(type, key) { var _a; const model = this.getModel(type); const keyDef = (_a = model.keys) === null || _a === void 0 ? void 0 : _a[key]; if (keyDef) { return keyDef; } else { throw new record_exceptions_1.KeyNotDefined(type, key); } } getRelationship(type, relationship) { var _a; const model = this.getModel(type); const relationshipDef = (_a = model.relationships) === null || _a === void 0 ? void 0 : _a[relationship]; if (relationshipDef) { return relationshipDef; } else { throw new record_exceptions_1.RelationshipNotDefined(type, relationship); } } hasModel(type) { return this.models[type] !== undefined; } hasAttribute(type, attribute) { var _a, _b; return ((_b = (_a = this.models[type]) === null || _a === void 0 ? void 0 : _a.attributes) === null || _b === void 0 ? void 0 : _b[attribute]) !== undefined; } hasKey(type, key) { var _a, _b; return ((_b = (_a = this.models[type]) === null || _a === void 0 ? void 0 : _a.keys) === null || _b === void 0 ? void 0 : _b[key]) !== undefined; } hasRelationship(type, relationship) { var _a, _b; return ((_b = (_a = this.models[type]) === null || _a === void 0 ? void 0 : _a.relationships) === null || _b === void 0 ? void 0 : _b[relationship]) !== undefined; } eachAttribute(type, callbackFn) { const model = this.getModel(type); const attributes = model.attributes || {}; for (let name in attributes) { callbackFn(name, attributes[name]); } } eachKey(type, callbackFn) { const model = this.getModel(type); const keys = model.keys || {}; for (let name in keys) { callbackFn(name, keys[name]); } } eachRelationship(type, callbackFn) { const model = this.getModel(type); const relationships = model.relationships || {}; for (let name in relationships) { callbackFn(name, relationships[name]); } } _deprecateRelationshipModel(models) { for (let type in models) { if (models[type].relationships) { let relationships = models[type] .relationships; for (let name in relationships) { let relationship = relationships[name]; if (relationship.model) { deprecate('RelationshipDefinition.model is deprecated, use `type` and `kind` instead.'); } } } } } }; RecordSchema = __decorate([ core_1.evented ], RecordSchema); exports.RecordSchema = RecordSchema; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVjb3JkLXNjaGVtYS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9yZWNvcmQtc2NoZW1hLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7OztBQUFBLGdDQUFnQztBQUNoQyxzQ0FBa0U7QUFHbEUsMkRBSzZCO0FBRTdCLE1BQU0sRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLEdBQUcsWUFBSyxDQUFDO0FBcUdsQzs7OztHQUlHO0FBRUgsSUFBYSxZQUFZLEdBQXpCLE1BQWEsWUFBWTtJQUl2QixZQUFZLFdBQWlDLEVBQUU7UUFDN0MsSUFBSSxRQUFRLENBQUMsT0FBTyxLQUFLLFNBQVMsRUFBRTtZQUNsQyxRQUFRLENBQUMsT0FBTyxHQUFHLENBQUMsQ0FBQztTQUN0QjtRQUVELElBQUksUUFBUSxDQUFDLE1BQU0sS0FBSyxTQUFTLEVBQUU7WUFDakMsUUFBUSxDQUFDLE1BQU0sR0FBRyxFQUFFLENBQUM7U0FDdEI7UUFFRCxJQUFJLENBQUMsY0FBYyxDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBQ2hDLENBQUM7SUFFRDs7T0FFRztJQUNILElBQUksT0FBTztRQUNULE9BQU8sSUFBSSxDQUFDLFFBQVEsQ0FBQztJQUN2QixDQUFDO0lBRUQ7Ozs7T0FJRztJQUNILEtBQUssQ0FBQyxPQUFPLENBQUMsV0FBaUMsRUFBRTtRQUMvQyxJQUFJLFFBQVEsQ0FBQyxPQUFPLEtBQUssU0FBUyxFQUFFO1lBQ2xDLFFBQVEsQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDLFFBQVEsR0FBRyxDQUFDLENBQUM7U0FDdEM7UUFDRCxJQUFJLENBQUMsY0FBYyxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQzlCLE1BQU0sSUFBQSxpQkFBVSxFQUFDLElBQWUsRUFBRSxTQUFTLEVBQUUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBQzlELENBQUM7SUFFRDs7T0FFRztJQUNPLGNBQWMsQ0FBQyxRQUE4QjtRQUNyRCxVQUFVO1FBQ1YsSUFBSSxRQUFR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Q0FBQyxJQUFJLENBQUMsQ0FBQztvQkFDdkMsSUFBSSxZQUFZLENBQUMsS0FBSyxFQUFFO3dCQUN0QixTQUFTLENBQ1AsNEVBQTRFLENBQzdFLENBQUM7cUJBQ0g7aUJBQ0Y7YUFDRjtTQUNGO0lBQ0gsQ0FBQztDQUNGLENBQUE7QUE1TlksWUFBWTtJQUR4QixjQUFPO0dBQ0ssWUFBWSxDQTROeEI7QUE1Tlksb0NBQVkiLCJzb3VyY2VzQ29udGVudCI6WyIvKiBlc2xpbnQtZGlzYWJsZSB2YWxpZC1qc2RvYyAqL1xuaW1wb3J0IHsgZXZlbnRlZCwgRXZlbnRlZCwgZnVsZmlsbEFsbCwgT3JiaXQgfSBmcm9tICdAb3JiaXQvY29yZSc7XG5pbXBvcnQgeyBEaWN0IH0gZnJvbSAnQG9yYml0L3V0aWxzJztcbmltcG9ydCB7IEFycmF5VmFsaWRhdGlvbk9wdGlvbnMgfSBmcm9tICdAb3JiaXQvdmFsaWRhdG9ycyc7XG5pbXBvcnQge1xuICBBdHRyaWJ1dGVOb3REZWZpbmVkLFxuICBLZXlOb3REZWZpbmVkLFxuICBNb2RlbE5vdERlZmluZWQsXG4gIFJlbGF0aW9uc2hpcE5vdERlZmluZWRcbn0gZnJvbSAnLi9yZWNvcmQtZXhjZXB0aW9ucyc7XG5cbmNvbnN0IHsgdXVpZCwgZGVwcmVjYXRlIH0gPSBPcmJpdDtcblxuZXhwb3J0IGludGVyZmFjZSBGaWVsZFZhbGlkYXRpb25PcHRpb25zIHtcbiAgcmVxdWlyZWQ/OiBib29sZWFuO1xuICBba2V5OiBzdHJpbmddOiB1bmtub3duO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEF0dHJpYnV0ZURlZmluaXRpb24ge1xuICB0eXBlPzogc3RyaW5nO1xuICBzZXJpYWxpemF0aW9uPzogRGljdDx1bmtub3duPjtcbiAgZGVzZXJpYWxpemF0aW9uPzogRGljdDx1bmtub3duPjtcbiAgdmFsaWRhdGlvbj86IEZpZWxkVmFsaWRhdGlvbk9wdGlvbnMgJiB7XG4gICAgbm90TnVsbD86IGJvb2xlYW47XG4gIH07XG4gIG1ldGE/OiBEaWN0PHVua25vd24+O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEhhc09uZVJlbGF0aW9uc2hpcERlZmluaXRpb24ge1xuICBraW5kOiAnaGFzT25lJztcbiAgdHlwZT86IHN0cmluZyB8IHN0cmluZ1tdO1xuICBtb2RlbD86IHN0cmluZyB8IHN0cmluZ1tdO1xuICBpbnZlcnNlPzogc3RyaW5nO1xuICBkZXBlbmRlbnQ/OiAncmVtb3ZlJztcbiAgdmFsaWRhdGlvbj86IEZpZWxkVmFsaWRhdGlvbk9wdGlvbnMgJiB7XG4gICAgbm90TnVsbD86IGJvb2xlYW47XG4gIH07XG4gIG1ldGE/OiBEaWN0PHVua25vd24+O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEhhc01hbnlSZWxhdGlvbnNoaXBEZWZpbml0aW9uIHtcbiAga2luZDogJ2hhc01hbnknO1xuICB0eXBlPzogc3RyaW5nIHwgc3RyaW5nW107XG4gIG1vZGVsPzogc3RyaW5nIHwgc3RyaW5nW107XG4gIGludmVyc2U/OiBzdHJpbmc7XG4gIGRlcGVuZGVudD86ICdyZW1vdmUnO1xuICB2YWxpZGF0aW9uPzogRmllbGRWYWxpZGF0aW9uT3B0aW9ucyAmIEFycmF5VmFsaWRhdGlvbk9wdGlvbnM7XG4gIG1ldGE/OiBEaWN0PHVua25vd24+O1xufVxuXG5leHBvcnQgdHlwZSBSZWxhdGlvbnNoaXBEZWZpbml0aW9uID1cbiAgfCBIYXNPbmVSZWxhdGlvbnNoaXBEZWZpbml0aW9uXG4gIHwgSGFzTWFueVJlbGF0aW9uc2hpcERlZmluaXRpb247XG5cbmV4cG9ydCBpbnRlcmZhY2UgS2V5RGVmaW5pdGlvbiB7XG4gIC8qKlxuICAgKiBAZGVwcmVjYXRlZCBzaW5jZSB2MC4xNyAtIG5vdCB1c2VkIGJ5IGFueSBzdGFuZGFyZCBzZXJpYWxpemVyc1xuICAgKi9cbiAgcHJpbWFyeUtleT86IGJvb2xlYW47XG5cbiAgdmFsaWRhdGlvbj86IEZpZWxkVmFsaWRhdGlvbk9wdGlvbnMgJiB7XG4gICAgbm90TnVsbD86IGJvb2xlYW47XG4gIH07XG5cbiAgbWV0YT86IERpY3Q8dW5rbm93bj47XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgTW9kZWxEZWZpbml0aW9uIHtcbiAga2V5cz86IERpY3Q8S2V5RGVmaW5pdGlvbj47XG4gIGF0dHJpYnV0ZXM/OiBEaWN0PEF0dHJpYnV0ZURlZmluaXRpb24+O1xuICByZWxhdGlvbnNoaXBzPzogRGljdDxSZWxhdGlvbnNoaXBEZWZpbml0aW9uPjtcbn1cblxuLyoqXG4gKiBTZXR0aW5ncyB1c2VkIHRvIGluaXRpYWx6ZSBhbmQvb3IgdXBncmFkZSBzY2hlbWFzLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFJlY29yZFNjaGVtYVNldHRpbmdzIHtcbiAgLyoqXG4gICAqIFNjaGVtYSB2ZXJzaW9uLiBEZWZhdWx0cyB0byAxLlxuICAgKi9cbiAgdmVyc2lvbj86IG51bWJlcjtcblxuICAvKipcbiAgICogRnVuY3Rpb24gdXNlZCB0byBnZW5lcmF0ZSByZWNvcmQgSURzLlxuICAgKi9cbiAgZ2VuZXJhdGVJZD86IChtb2RlbD86IHN0cmluZykgPT4gc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBGdW5jdGlvbiB1c2VkIHRvIHBsdXJhbGl6ZSBuYW1lcy5cbiAgICpcbiAgICogQGRlcHJlY2F0ZWRcbiAgICovXG4gIHBsdXJhbGl6ZT86ICh3b3JkOiBzdHJpbmcpID0+IHN0cmluZztcblxuICAvKipcbiAgICogRnVuY3Rpb24gdXNlZCB0byBzaW5ndWxhcml6ZSBuYW1lcy5cbiAgICpcbiAgICogQGRlcHJlY2F0ZWRcbiAgICovXG4gIHNpbmd1bGFyaXplPzogKHdvcmQ6IHN0cmluZykgPT4gc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBNYXAgb2YgbW9kZWwgZGVmaW5pdGlvbnMuXG4gICAqL1xuICBtb2RlbHM/OiBEaWN0PE1vZGVsRGVmaW5pdGlvbj47XG59XG5cbmV4cG9ydCB0eXBlIFJlY29yZFNjaGVtYUV2ZW50ID0gJ3VwZ3JhZGUnO1xuXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWVtcHR5LWludGVyZmFjZVxuZXhwb3J0IGludGVyZmFjZSBSZWNvcmRTY2hlbWEgZXh0ZW5kcyBFdmVudGVkPFJlY29yZFNjaGVtYUV2ZW50PiB7fVxuXG4vKipcbiAqIEEgYFNjaGVtYWAgZGVmaW5lcyB0aGUgbW9kZWxzIGFsbG93ZWQgaW4gYSBzb3VyY2UsIGluY2x1ZGluZyB0aGVpciBrZXlzLFxuICogYXR0cmlidXRlcywgYW5kIHJlbGF0aW9uc2hpcHMuIEEgc2luZ2xlIHNjaGVtYSBtYXkgYmUgc2hhcmVkIGFjcm9zcyBtdWx0aXBsZVxuICogc291cmNlcy5cbiAqL1xuQGV2ZW50ZWRcbmV4cG9ydCBjbGFzcyBSZWNvcmRTY2hlbWEge1xuICBwcml2YXRlIF9tb2RlbHMhOiBEaWN0PE1vZGVsRGVmaW5pdGlvbj47XG4gIHByaXZhdGUgX3ZlcnNpb24hOiBudW1iZXI7XG5cbiAgY29uc3RydWN0b3Ioc2V0dGluZ3M6IFJlY29yZFNjaGVtYVNldHRpbmdzID0ge30pIHtcbiAgICBpZiAoc2V0dGluZ3MudmVyc2lvbiA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBzZXR0aW5ncy52ZXJzaW9uID0gMTtcbiAgICB9XG5cbiAgICBpZiAoc2V0dGluZ3MubW9kZWxzID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHNldHRpbmdzLm1vZGVscyA9IHt9O1xuICAgIH1cblxuICAgIHRoaXMuX2FwcGx5U2V0dGluZ3Moc2V0dGluZ3MpO1xuICB9XG5cbiAgLyoqXG4gICAqIFZlcnNpb25cbiAgICovXG4gIGdldCB2ZXJzaW9uKCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuX3ZlcnNpb247XG4gIH1cblxuICAvKipcbiAgICogVXBncmFkZXMgU2NoZW1hIHRvIGEgbmV3IHZlcnNpb24gd2l0aCBuZXcgc2V0dGluZ3MuXG4gICAqXG4gICAqIEVtaXRzIHRoZSBgdXBncmFkZWAgZXZlbnQgdG8gY3VlIHNvdXJjZXMgdG8gdXBncmFkZSB0aGVpciBkYXRhLlxuICAgKi9cbiAgYXN5bmMgdXBncmFkZShzZXR0aW5nczogUmVjb3JkU2NoZW1hU2V0dGluZ3MgPSB7fSk6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmIChzZXR0aW5ncy52ZXJzaW9uID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHNldHRpbmdzLnZlcnNpb24gPSB0aGlzLl92ZXJzaW9uICsgMTtcbiAgICB9XG4gICAgdGhpcy5fYXBwbHlTZXR0aW5ncyhzZXR0aW5ncyk7XG4gICAgYXdhaXQgZnVsZmlsbEFsbCh0aGlzIGFzIEV2ZW50ZWQsICd1cGdyYWRlJywgdGhpcy5fdmVyc2lvbik7XG4gIH1cblxuICAvKipcbiAgICogUmVnaXN0ZXJzIGEgY29tcGxldGUgc2V0IG9mIHNldHRpbmdzXG4gICAqL1xuICBwcm90ZWN0ZWQgX2FwcGx5U2V0dGluZ3Moc2V0dGluZ3M6IFJlY29yZFNjaGVtYVNldHRpbmdzKTogdm9pZCB7XG4gICAgLy8gVmVyc2lvblxuICAgIGlmIChzZXR0aW5ncy52ZXJzaW9uICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMuX3ZlcnNpb24gPSBzZXR0aW5ncy52ZXJzaW9uO1xuICAgIH1cblxuICAgIC8vIEFsbG93IG92ZXJyaWRlc1xuICAgIGlmIChzZXR0aW5ncy5nZW5lcmF0ZUlkKSB7XG4gICAgICB0aGlzLmdlbmVyYXRlSWQgPSBzZXR0aW5ncy5nZW5lcmF0ZUlkO1xuICAgIH1cbiAgICBpZiAoc2V0dGluZ3MucGx1cmFsaXplKSB7XG4gICAgICBkZXByZWNhdGUoXG4gICAgICAgICdTY2hlbWEjcGx1cmFsaXplIGhhcyBiZWVuIGRlcHJlY2F0ZWQuIFVzZSBpbmZsZWN0b3JzIGZyb20gaW4gQG9yYml0L3NlcmlhbGl6ZXJzIGluc3RlYWQuJ1xuICAgICAgKTtcbiAgICAgIHRoaXMucGx1cmFsaXplID0gc2V0dGluZ3MucGx1cmFsaXplO1xuICAgIH1cbiAgICBpZiAoc2V0dGluZ3Muc2luZ3VsYXJpemUpIHtcbiAgICAgIGRlcHJlY2F0ZShcbiAgICAgICAgJ1NjaGVtYSNzaW5ndWxhcml6ZSBoYXMgYmVlbiBkZXByZWNhdGVkLiBVc2UgaW5mbGVjdG9ycyBmcm9tIEBvcmJpdC9zZXJpYWxpemVycyBpbnN0ZWFkLidcbiAgICAgICk7XG4gICAgICB0aGlzLnNpbmd1bGFyaXplID0gc2V0dGluZ3Muc2luZ3VsYXJpemU7XG4gICAgfVxuXG4gICAgLy8gUmVnaXN0ZXIgbW9kZWwgc2NoZW1hc1xuICAgIGlmIChzZXR0aW5ncy5tb2RlbHMpIHtcbiAgICAgIHRoaXMuX2RlcHJlY2F0ZVJlbGF0aW9uc2hpcE1vZGVsKHNldHRpbmdzLm1vZGVscyk7XG4gICAgICB0aGlzLl9tb2RlbHMgPSBzZXR0aW5ncy5tb2RlbHM7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEdlbmVyYXRlIGFuIGlkIGZvciBhIGdpdmVuIG1vZGVsIHR5cGUuXG4gICAqL1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gIGdlbmVyYXRlSWQodHlwZT86IHN0cmluZyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHV1aWQoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBIG5haXZlIHBsdXJhbGl6YXRpb24gbWV0aG9kLlxuICAgKlxuICAgKiBEZXByZWNhdGVkIGluIGZhdm9yIG9mIGluZmxlY3RvcnMgbm93IGluIEBvcmJpdC9zZXJpYWxpemVyc1xuICAgKlxuICAgKiBAZGVwcmVjYXRlZCBzaW5jZSB2MC4xNywgcmVtb3ZlIGluIHYwLjE4XG4gICAqL1xuICBwbHVyYWxpemUod29yZDogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBkZXByZWNhdGUoXG4gICAgICAnU2NoZW1hI3BsdXJhbGl6ZSBoYXMgYmVlbiBkZXByZWNhdGVkLiBVc2UgaW5mbGVjdG9ycyBmcm9tIEBvcmJpdC9zZXJpYWxpemVycyBpbnN0ZWFkLidcbiAgICApO1xuICAgIHJldHVybiB3b3JkICsgJ3MnO1xuICB9XG5cbiAgLyoqXG4gICAqIEEgbmFpdmUgc2luZ3VsYXJpemF0aW9uIG1ldGhvZC5cbiAgICpcbiAgICogRGVwcmVjYXRlZCBpbiBmYXZvciBvZiBpbmZsZWN0b3JzIG5vdyBpbiBAb3JiaXQvc2VyaWFsaXplcnNcbiAgICpcbiAgICogQGRlcHJlY2F0ZWQgc2luY2UgdjAuMTcsIHJlbW92ZSBpbiB2MC4xOFxuICAgKi9cbiAgc2luZ3VsYXJpemUod29yZDogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBkZXByZWNhdGUoXG4gICAgICAnU2NoZW1hI3Npbmd1bGFyaXplIGhhcyBiZWVuIGRlcHJlY2F0ZWQuIFVzZSBpbmZsZWN0b3JzIGZyb20gQG9yYml0L3NlcmlhbGl6ZXJzIGluc3RlYWQuJ1xuICAgICk7XG4gICAgaWYgKHdvcmQubGFzdEluZGV4T2YoJ3MnKSA9PT0gd29yZC5sZW5ndGggLSAxKSB7XG4gICAgICByZXR1cm4gd29yZC5zdWJzdHIoMCwgd29yZC5sZW5ndGggLSAxKTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICBgT3JiaXQncyBidWlsdC1pbiBuYWl2ZSBzaW5ndWxhcml6YXRpb24gcnVsZXMgY2Fubm90IHNpbmd1bGFyaXplICR7d29yZH0uIFBhc3Mgc2luZ3VsYXJpemUgJiBwbHVyYWxpemUgZnVuY3Rpb25zIHRvIFNjaGVtYSB0byBjdXN0b21pemUuYFxuICAgICAgKTtcbiAgICAgIHJldHVybiB3b3JkO1xuICAgIH1cbiAgfVxuXG4gIGdldCBtb2RlbHMoKTogRGljdDxNb2RlbERlZmluaXRpb24+IHtcbiAgICByZXR1cm4gdGhpcy5fbW9kZWxzO1xuICB9XG5cbiAgZ2V0TW9kZWwodHlwZTogc3RyaW5nKTogTW9kZWxEZWZpbml0aW9uIHtcbiAgICBjb25zdCBtb2RlbCA9IHRoaXMubW9kZWxzW3R5cGVdO1xuICAgIGlmIChtb2RlbCkge1xuICAgICAgcmV0dXJuIG1vZGVsO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyBuZXcgTW9kZWxOb3REZWZpbmVkKHR5cGUpO1xuICAgIH1cbiAgfVxuXG4gIGdldEF0dHJpYnV0ZSh0eXBlOiBzdHJpbmcsIGF0dHJpYnV0ZTogc3RyaW5nKTogQXR0cmlidXRlRGVmaW5pdGlvbiB7XG4gICAgY29uc3QgbW9kZWwgPSB0aGlzLmdldE1vZGVsKHR5cGUpO1xuICAgIGNvbnN0IGF0dHJpYnV0ZURlZiA9IG1vZGVsLmF0dHJpYnV0ZXM/LlthdHRyaWJ1dGVdO1xuICAgIGlmIChhdHRyaWJ1dGVEZWYpIHtcbiAgICAgIHJldHVybiBhdHRyaWJ1dGVEZWY7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IG5ldyBBdHRyaWJ1dGVOb3REZWZpbmVkKHR5cGUsIGF0dHJpYnV0ZSk7XG4gICAgfVxuICB9XG5cbiAgZ2V0S2V5KHR5cGU6IHN0cmluZywga2V5OiBzdHJpbmcpOiBLZXlEZWZpbml0aW9uIHtcbiAgICBjb25zdCBtb2RlbCA9IHRoaXMuZ2V0TW9kZWwodHlwZSk7XG4gICAgY29uc3Qga2V5RGVmID0gbW9kZWwua2V5cz8uW2tleV07XG4gICAgaWYgKGtleURlZikge1xuICAgICAgcmV0dXJuIGtleURlZjtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhyb3cgbmV3IEtleU5vdERlZmluZWQodHlwZSwga2V5KTtcbiAgICB9XG4gIH1cblxuICBnZXRSZWxhdGlvbnNoaXAodHlwZTogc3RyaW5nLCByZWxhdGlvbnNoaXA6IHN0cmluZyk6IFJlbGF0aW9uc2hpcERlZmluaXRpb24ge1xuICAgIGNvbnN0IG1vZGVsID0gdGhpcy5nZXRNb2RlbCh0eXBlKTtcbiAgICBjb25zdCByZWxhdGlvbnNoaXBEZWYgPSBtb2RlbC5yZWxhdGlvbnNoaXBzPy5bcmVsYXRpb25zaGlwXTtcbiAgICBpZiAocmVsYXRpb25zaGlwRGVmKSB7XG4gICAgICByZXR1cm4gcmVsYXRpb25zaGlwRGVmO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyBuZXcgUmVsYXRpb25zaGlwTm90RGVmaW5lZCh0eXBlLCByZWxhdGlvbnNoaXApO1xuICAgIH1cbiAgfVxuXG4gIGhhc01vZGVsKHR5cGU6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLm1vZGVsc1t0eXBlXSAhPT0gdW5kZWZpbmVkO1xuICB9XG5cbiAgaGFzQXR0cmlidXRlKHR5cGU6IHN0cmluZywgYXR0cmlidXRlOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5tb2RlbHNbdHlwZV0/LmF0dHJpYnV0ZXM/LlthdHRyaWJ1dGVdICE9PSB1bmRlZmluZWQ7XG4gIH1cblxuICBoYXNLZXkodHlwZTogc3RyaW5nLCBrZXk6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLm1vZGVsc1t0eXBlXT8ua2V5cz8uW2tleV0gIT09IHVuZGVmaW5lZDtcbiAgfVxuXG4gIGhhc1JlbGF0aW9uc2hpcCh0eXBlOiBzdHJpbmcsIHJlbGF0aW9uc2hpcDogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMubW9kZWxzW3R5cGVdPy5yZWxhdGlvbnNoaXBzPy5bcmVsYXRpb25zaGlwXSAhPT0gdW5kZWZpbmVkO1xuICB9XG5cbiAgZWFjaEF0dHJpYnV0ZShcbiAgICB0eXBlOiBzdHJpbmcsXG4gICAgY2FsbGJhY2tGbjogKG5hbWU6IHN0cmluZywgYXR0cmlidXRlOiBBdHRyaWJ1dGVEZWZpbml0aW9uKSA9PiB2b2lkXG4gICk6IHZvaWQge1xuICAgIGNvbnN0IG1vZGVsID0gdGhpcy5nZXRNb2RlbCh0eXBlKTtcbiAgICBjb25zdCBhdHRyaWJ1dGVzID0gbW9kZWwuYXR0cmlidXRlcyB8fCB7fTtcbiAgICBmb3IgKGxldCBuYW1lIGluIGF0dHJpYnV0ZXMpIHtcbiAgICAgIGNhbGxiYWNrRm4obmFtZSwgYXR0cmlidXRlc1tuYW1lXSk7XG4gICAgfVxuICB9XG5cbiAgZWFjaEtleShcbiAgICB0eXBlOiBzdHJpbmcsXG4gICAgY2FsbGJhY2tGbjogKG5hbWU6IHN0cmluZywga2V5OiBLZXlEZWZpbml0aW9uKSA9PiB2b2lkXG4gICk6IHZvaWQge1xuICAgIGNvbnN0IG1vZGVsID0gdGhpcy5nZXRNb2RlbCh0eXBlKTtcbiAgICBjb25zdCBrZXlzID0gbW9kZWwua2V5cyB8fCB7fTtcbiAgICBmb3IgKGxldCBuYW1lIGluIGtleXMpIHtcbiAgICAgIGNhbGxiYWNrRm4obmFtZSwga2V5c1tuYW1lXSk7XG4gICAgfVxuICB9XG5cbiAgZWFjaFJlbGF0aW9uc2hpcChcbiAgICB0eXBlOiBzdHJpbmcsXG4gICAgY2FsbGJhY2tGbjogKG5hbWU6IHN0cmluZywgcmVsYXRpb25zaGlwOiBSZWxhdGlvbnNoaXBEZWZpbml0aW9uKSA9PiB2b2lkXG4gICk6IHZvaWQge1xuICAgIGNvbnN0IG1vZGVsID0gdGhpcy5nZXRNb2RlbCh0eXBlKTtcbiAgICBjb25zdCByZWxhdGlvbnNoaXBzID0gbW9kZWwucmVsYXRpb25zaGlwcyB8fCB7fTtcbiAgICBmb3IgKGxldCBuYW1lIGluIHJlbGF0aW9uc2hpcHMpIHtcbiAgICAgIGNhbGxiYWNrRm4obmFtZSwgcmVsYXRpb25zaGlwc1tuYW1lXSk7XG4gICAgfVxuICB9XG5cbiAgX2RlcHJlY2F0ZVJlbGF0aW9uc2hpcE1vZGVsKG1vZGVsczogRGljdDxNb2RlbERlZmluaXRpb24+KTogdm9pZCB7XG4gICAgZm9yIChsZXQgdHlwZSBpbiBtb2RlbHMpIHtcbiAgICAgIGlmIChtb2RlbHNbdHlwZV0ucmVsYXRpb25zaGlwcykge1xuICAgICAgICBsZXQgcmVsYXRpb25zaGlwcyA9IG1vZGVsc1t0eXBlXVxuICAgICAgICAgIC5yZWxhdGlvbnNoaXBzIGFzIERpY3Q8UmVsYXRpb25zaGlwRGVmaW5pdGlvbj47XG4gICAgICAgIGZvciAobGV0IG5hbWUgaW4gcmVsYXRpb25zaGlwcykge1xuICAgICAgICAgIGxldCByZWxhdGlvbnNoaXAgPSByZWxhdGlvbnNoaXBzW25hbWVdO1xuICAgICAgICAgIGlmIChyZWxhdGlvbnNoaXAubW9kZWwpIHtcbiAgICAgICAgICAgIGRlcHJlY2F0ZShcbiAgICAgICAgICAgICAgJ1JlbGF0aW9uc2hpcERlZmluaXRpb24ubW9kZWwgaXMgZGVwcmVjYXRlZCwgdXNlIGB0eXBlYCBhbmQgYGtpbmRgIGluc3RlYWQuJ1xuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cbiJdfQ==