@orbit/records
Version:
A flexible data access and synchronization layer.
208 lines • 25.6 kB
JavaScript
;
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==