@ditojs/server 0.275.0 → 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/package.json +25 -43
- package/src/app/Application.js +105 -111
- package/src/app/Validator.js +6 -3
- package/src/app/index.js +2 -2
- package/src/cli/db/createMigration.js +1 -1
- package/src/cli/db/index.js +7 -7
- package/src/cli/db/listAssetConfig.js +1 -1
- package/src/cli/db/reset.js +1 -1
- package/src/cli/index.js +14 -5
- package/src/controllers/AdminController.js +181 -158
- package/src/controllers/CollectionController.js +8 -29
- package/src/controllers/Controller.js +71 -76
- package/src/controllers/ControllerAction.js +39 -17
- package/src/controllers/MemberAction.js +2 -2
- package/src/controllers/ModelController.js +4 -4
- package/src/controllers/RelationController.js +3 -3
- package/src/controllers/{UserController.js → UsersController.js} +8 -13
- package/src/controllers/index.js +5 -5
- package/src/decorators/action.js +3 -3
- package/src/decorators/authorize.js +1 -1
- package/src/decorators/index.js +6 -6
- package/src/decorators/parameters.js +1 -1
- package/src/decorators/returns.js +1 -1
- package/src/decorators/scope.js +1 -1
- package/src/decorators/transacted.js +1 -1
- package/src/errors/AssetError.js +1 -1
- package/src/errors/AuthenticationError.js +1 -1
- package/src/errors/AuthorizationError.js +1 -1
- package/src/errors/ControllerError.js +1 -1
- package/src/errors/DatabaseError.js +12 -3
- package/src/errors/GraphError.js +1 -1
- package/src/errors/ModelError.js +1 -1
- package/src/errors/NotFoundError.js +1 -1
- package/src/errors/NotImplementedError.js +1 -1
- package/src/errors/QueryBuilderError.js +1 -1
- package/src/errors/RelationError.js +1 -1
- package/src/errors/ValidationError.js +1 -1
- package/src/errors/WrappedError.js +1 -1
- package/src/errors/index.js +14 -14
- package/src/graph/DitoGraphProcessor.js +2 -1
- package/src/graph/graph.js +1 -1
- package/src/graph/index.js +3 -3
- package/src/index.js +11 -9
- package/src/lib/index.js +2 -2
- package/src/middleware/createTransaction.js +1 -1
- package/src/middleware/findRoute.js +3 -2
- package/src/middleware/handleConnectMiddleware.js +88 -0
- package/src/middleware/handleError.js +1 -1
- package/src/middleware/handleRoute.js +3 -3
- package/src/middleware/index.js +8 -7
- package/src/mixins/AssetMixin.js +1 -1
- package/src/mixins/UserMixin.js +1 -1
- package/src/mixins/index.js +4 -4
- package/src/models/AssetModel.js +2 -2
- package/src/models/Model.js +16 -12
- package/src/models/RelationAccessor.js +1 -1
- package/src/models/SessionModel.js +2 -2
- package/src/models/TimeStampedModel.js +2 -2
- package/src/models/UserModel.js +2 -2
- package/src/models/definitions/assets.js +1 -1
- package/src/models/definitions/filters.js +57 -44
- package/src/models/definitions/hooks.js +1 -1
- package/src/models/definitions/index.js +9 -9
- package/src/models/definitions/modifiers.js +1 -1
- package/src/models/definitions/options.js +1 -1
- package/src/models/definitions/properties.js +2 -2
- package/src/models/definitions/relations.js +1 -1
- package/src/models/definitions/schema.js +1 -1
- package/src/models/definitions/scopes.js +2 -2
- package/src/models/index.js +5 -5
- package/src/query/QueryBuilder.js +5 -5
- package/src/query/QueryFilters.js +50 -50
- package/src/query/QueryParameters.js +2 -2
- package/src/query/index.js +3 -3
- package/src/schema/formats/index.js +2 -2
- package/src/schema/index.js +4 -4
- package/src/schema/keywords/_relate.js +1 -1
- package/src/schema/keywords/index.js +12 -12
- package/src/schema/properties.test.js +1 -1
- package/src/schema/relations.js +1 -1
- package/src/schema/relations.test.js +2 -2
- package/src/services/index.js +1 -1
- package/src/storage/DiskStorage.js +1 -1
- package/src/storage/S3Storage.js +4 -4
- package/src/storage/Storage.js +1 -1
- package/src/storage/index.js +4 -4
- package/src/utils/function.test.js +1 -1
- package/src/utils/handler.js +17 -0
- package/src/utils/index.js +8 -7
- package/src/utils/object.test.js +1 -1
- package/lib/app/Application.js +0 -961
- package/lib/app/SessionStore.js +0 -40
- package/lib/app/Validator.js +0 -355
- package/lib/app/index.js +0 -26
- package/lib/cli/console.js +0 -175
- package/lib/cli/db/createMigration.js +0 -237
- package/lib/cli/db/index.js +0 -66
- package/lib/cli/db/listAssetConfig.js +0 -16
- package/lib/cli/db/migrate.js +0 -15
- package/lib/cli/db/reset.js +0 -27
- package/lib/cli/db/rollback.js +0 -15
- package/lib/cli/db/seed.js +0 -104
- package/lib/cli/db/unlock.js +0 -15
- package/lib/cli/index.js +0 -90
- package/lib/controllers/AdminController.js +0 -258
- package/lib/controllers/CollectionController.js +0 -263
- package/lib/controllers/Controller.js +0 -462
- package/lib/controllers/ControllerAction.js +0 -276
- package/lib/controllers/MemberAction.js +0 -22
- package/lib/controllers/ModelController.js +0 -64
- package/lib/controllers/RelationController.js +0 -82
- package/lib/controllers/UserController.js +0 -98
- package/lib/controllers/index.js +0 -50
- package/lib/decorators/action.js +0 -14
- package/lib/decorators/authorize.js +0 -13
- package/lib/decorators/index.js +0 -58
- package/lib/decorators/parameters.js +0 -35
- package/lib/decorators/returns.js +0 -26
- package/lib/decorators/scope.js +0 -14
- package/lib/decorators/transacted.js +0 -12
- package/lib/errors/AssetError.js +0 -19
- package/lib/errors/AuthenticationError.js +0 -19
- package/lib/errors/AuthorizationError.js +0 -19
- package/lib/errors/ControllerError.js +0 -24
- package/lib/errors/DatabaseError.js +0 -27
- package/lib/errors/GraphError.js +0 -19
- package/lib/errors/ModelError.js +0 -24
- package/lib/errors/NotFoundError.js +0 -19
- package/lib/errors/NotImplementedError.js +0 -19
- package/lib/errors/QueryBuilderError.js +0 -19
- package/lib/errors/RelationError.js +0 -36
- package/lib/errors/ResponseError.js +0 -46
- package/lib/errors/ValidationError.js +0 -19
- package/lib/errors/WrappedError.js +0 -24
- package/lib/errors/index.js +0 -122
- package/lib/graph/DitoGraphProcessor.js +0 -185
- package/lib/graph/expression.js +0 -76
- package/lib/graph/graph.js +0 -300
- package/lib/graph/index.js +0 -34
- package/lib/index.js +0 -82
- package/lib/lib/EventEmitter.js +0 -76
- package/lib/lib/KnexHelper.js +0 -40
- package/lib/lib/index.js +0 -26
- package/lib/middleware/attachLogger.js +0 -16
- package/lib/middleware/createTransaction.js +0 -36
- package/lib/middleware/findRoute.js +0 -35
- package/lib/middleware/handleError.js +0 -26
- package/lib/middleware/handleRoute.js +0 -29
- package/lib/middleware/handleUser.js +0 -36
- package/lib/middleware/index.js +0 -66
- package/lib/middleware/logRequests.js +0 -122
- package/lib/mixins/AssetMixin.js +0 -81
- package/lib/mixins/SessionMixin.js +0 -22
- package/lib/mixins/TimeStampedMixin.js +0 -47
- package/lib/mixins/UserMixin.js +0 -151
- package/lib/mixins/index.js +0 -42
- package/lib/models/AssetModel.js +0 -12
- package/lib/models/Model.js +0 -953
- package/lib/models/RelationAccessor.js +0 -41
- package/lib/models/SessionModel.js +0 -12
- package/lib/models/TimeStampedModel.js +0 -12
- package/lib/models/UserModel.js +0 -12
- package/lib/models/definitions/assets.js +0 -11
- package/lib/models/definitions/filters.js +0 -101
- package/lib/models/definitions/hooks.js +0 -11
- package/lib/models/definitions/index.js +0 -38
- package/lib/models/definitions/modifiers.js +0 -11
- package/lib/models/definitions/options.js +0 -11
- package/lib/models/definitions/properties.js +0 -87
- package/lib/models/definitions/relations.js +0 -11
- package/lib/models/definitions/schema.js +0 -11
- package/lib/models/definitions/scopes.js +0 -51
- package/lib/models/index.js +0 -50
- package/lib/query/QueryBuilder.js +0 -745
- package/lib/query/QueryFilters.js +0 -82
- package/lib/query/QueryParameters.js +0 -77
- package/lib/query/Registry.js +0 -40
- package/lib/query/index.js +0 -34
- package/lib/schema/formats/_empty.js +0 -10
- package/lib/schema/formats/_required.js +0 -10
- package/lib/schema/formats/index.js +0 -26
- package/lib/schema/index.js +0 -49
- package/lib/schema/keywords/_computed.js +0 -11
- package/lib/schema/keywords/_foreign.js +0 -11
- package/lib/schema/keywords/_hidden.js +0 -11
- package/lib/schema/keywords/_index.js +0 -11
- package/lib/schema/keywords/_instanceof.js +0 -49
- package/lib/schema/keywords/_primary.js +0 -11
- package/lib/schema/keywords/_range.js +0 -26
- package/lib/schema/keywords/_relate.js +0 -19
- package/lib/schema/keywords/_specificType.js +0 -11
- package/lib/schema/keywords/_unique.js +0 -11
- package/lib/schema/keywords/_unsigned.js +0 -11
- package/lib/schema/keywords/_validate.js +0 -80
- package/lib/schema/keywords/index.js +0 -106
- package/lib/schema/properties.js +0 -227
- package/lib/schema/properties.test.js +0 -573
- package/lib/schema/relations.js +0 -274
- package/lib/schema/relations.test.js +0 -155
- package/lib/services/Service.js +0 -34
- package/lib/services/index.js +0 -18
- package/lib/storage/AssetFile.js +0 -97
- package/lib/storage/DiskStorage.js +0 -125
- package/lib/storage/S3Storage.js +0 -171
- package/lib/storage/Storage.js +0 -209
- package/lib/storage/index.js +0 -34
- package/lib/utils/decorator.js +0 -16
- package/lib/utils/deprecate.js +0 -46
- package/lib/utils/emitter.js +0 -13
- package/lib/utils/function.js +0 -14
- package/lib/utils/function.test.js +0 -49
- package/lib/utils/index.js +0 -66
- package/lib/utils/json.js +0 -9
- package/lib/utils/object.js +0 -92
- package/lib/utils/object.test.js +0 -65
- package/lib/utils/scope.js +0 -14
package/lib/app/SessionStore.js
DELETED
|
@@ -1,40 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
|
|
3
|
-
exports.__esModule = true;
|
|
4
|
-
exports.default = void 0;
|
|
5
|
-
|
|
6
|
-
require("core-js/modules/es.error.cause.js");
|
|
7
|
-
|
|
8
|
-
var _default = modelName => class SessionStore {
|
|
9
|
-
constructor(ctx) {
|
|
10
|
-
this.ctx = ctx;
|
|
11
|
-
this.modelClass = ctx.app.models[modelName];
|
|
12
|
-
|
|
13
|
-
if (!this.modelClass) {
|
|
14
|
-
throw new Error(`Unable to find model class: '${modelName}'`);
|
|
15
|
-
}
|
|
16
|
-
}
|
|
17
|
-
|
|
18
|
-
query() {
|
|
19
|
-
return this.modelClass.query(this.ctx.transaction);
|
|
20
|
-
}
|
|
21
|
-
|
|
22
|
-
async get(id) {
|
|
23
|
-
const session = await this.query().findById(id);
|
|
24
|
-
return (session == null ? void 0 : session.value) || {};
|
|
25
|
-
}
|
|
26
|
-
|
|
27
|
-
async set(id, value) {
|
|
28
|
-
await this.query().findById(id).upsert({ ...this.modelClass.getReference(id),
|
|
29
|
-
value
|
|
30
|
-
});
|
|
31
|
-
}
|
|
32
|
-
|
|
33
|
-
async destroy(key) {
|
|
34
|
-
return this.query().deleteById(key);
|
|
35
|
-
}
|
|
36
|
-
|
|
37
|
-
};
|
|
38
|
-
|
|
39
|
-
exports.default = _default;
|
|
40
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9hcHAvU2Vzc2lvblN0b3JlLmpzIl0sIm5hbWVzIjpbIm1vZGVsTmFtZSIsIlNlc3Npb25TdG9yZSIsImNvbnN0cnVjdG9yIiwiY3R4IiwibW9kZWxDbGFzcyIsImFwcCIsIm1vZGVscyIsIkVycm9yIiwicXVlcnkiLCJ0cmFuc2FjdGlvbiIsImdldCIsImlkIiwic2Vzc2lvbiIsImZpbmRCeUlkIiwidmFsdWUiLCJzZXQiLCJ1cHNlcnQiLCJnZXRSZWZlcmVuY2UiLCJkZXN0cm95Iiwia2V5IiwiZGVsZXRlQnlJZCJdLCJtYXBwaW5ncyI6Ijs7Ozs7OztlQUFlQSxTQUFTLElBQUksTUFBTUMsWUFBTixDQUFtQjtBQUM3Q0MsRUFBQUEsV0FBVyxDQUFDQyxHQUFELEVBQU07QUFDZixTQUFLQSxHQUFMLEdBQVdBLEdBQVg7QUFDQSxTQUFLQyxVQUFMLEdBQWtCRCxHQUFHLENBQUNFLEdBQUosQ0FBUUMsTUFBUixDQUFlTixTQUFmLENBQWxCOztBQUNBLFFBQUksQ0FBQyxLQUFLSSxVQUFWLEVBQXNCO0FBQ3BCLFlBQU0sSUFBSUcsS0FBSixDQUFXLGdDQUErQlAsU0FBVSxHQUFwRCxDQUFOO0FBQ0Q7QUFDRjs7QUFFRFEsRUFBQUEsS0FBSyxHQUFHO0FBQ04sV0FBTyxLQUFLSixVQUFMLENBQWdCSSxLQUFoQixDQUFzQixLQUFLTCxHQUFMLENBQVNNLFdBQS9CLENBQVA7QUFDRDs7QUFFUSxRQUFIQyxHQUFHLENBQUNDLEVBQUQsRUFBSztBQUNaLFVBQU1DLE9BQU8sR0FBRyxNQUFNLEtBQUtKLEtBQUwsR0FBYUssUUFBYixDQUFzQkYsRUFBdEIsQ0FBdEI7QUFDQSxXQUFPLENBQUFDLE9BQU8sUUFBUCxZQUFBQSxPQUFPLENBQUVFLEtBQVQsS0FBa0IsRUFBekI7QUFDRDs7QUFFUSxRQUFIQyxHQUFHLENBQUNKLEVBQUQsRUFBS0csS0FBTCxFQUFZO0FBQ25CLFVBQU0sS0FBS04sS0FBTCxHQUNISyxRQURHLENBQ01GLEVBRE4sRUFFSEssTUFGRyxDQUVJLEVBQ04sR0FBRyxLQUFLWixVQUFMLENBQWdCYSxZQUFoQixDQUE2Qk4sRUFBN0IsQ0FERztBQUVORyxNQUFBQTtBQUZNLEtBRkosQ0FBTjtBQU1EOztBQUVZLFFBQVBJLE9BQU8sQ0FBQ0MsR0FBRCxFQUFNO0FBQ2pCLFdBQU8sS0FBS1gsS0FBTCxHQUFhWSxVQUFiLENBQXdCRCxHQUF4QixDQUFQO0FBQ0Q7O0FBN0I0QyxDIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IGRlZmF1bHQgbW9kZWxOYW1lID0+IGNsYXNzIFNlc3Npb25TdG9yZSB7XG4gIGNvbnN0cnVjdG9yKGN0eCkge1xuICAgIHRoaXMuY3R4ID0gY3R4XG4gICAgdGhpcy5tb2RlbENsYXNzID0gY3R4LmFwcC5tb2RlbHNbbW9kZWxOYW1lXVxuICAgIGlmICghdGhpcy5tb2RlbENsYXNzKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYFVuYWJsZSB0byBmaW5kIG1vZGVsIGNsYXNzOiAnJHttb2RlbE5hbWV9J2ApXG4gICAgfVxuICB9XG5cbiAgcXVlcnkoKSB7XG4gICAgcmV0dXJuIHRoaXMubW9kZWxDbGFzcy5xdWVyeSh0aGlzLmN0eC50cmFuc2FjdGlvbilcbiAgfVxuXG4gIGFzeW5jIGdldChpZCkge1xuICAgIGNvbnN0IHNlc3Npb24gPSBhd2FpdCB0aGlzLnF1ZXJ5KCkuZmluZEJ5SWQoaWQpXG4gICAgcmV0dXJuIHNlc3Npb24/LnZhbHVlIHx8IHt9XG4gIH1cblxuICBhc3luYyBzZXQoaWQsIHZhbHVlKSB7XG4gICAgYXdhaXQgdGhpcy5xdWVyeSgpXG4gICAgICAuZmluZEJ5SWQoaWQpXG4gICAgICAudXBzZXJ0KHtcbiAgICAgICAgLi4udGhpcy5tb2RlbENsYXNzLmdldFJlZmVyZW5jZShpZCksXG4gICAgICAgIHZhbHVlXG4gICAgICB9KVxuICB9XG5cbiAgYXN5bmMgZGVzdHJveShrZXkpIHtcbiAgICByZXR1cm4gdGhpcy5xdWVyeSgpLmRlbGV0ZUJ5SWQoa2V5KVxuICB9XG59XG4iXX0=
|
package/lib/app/Validator.js
DELETED
|
@@ -1,355 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
|
|
3
|
-
require("core-js/modules/esnext.weak-map.delete-all.js");
|
|
4
|
-
|
|
5
|
-
require("core-js/modules/esnext.weak-map.emplace.js");
|
|
6
|
-
|
|
7
|
-
exports.__esModule = true;
|
|
8
|
-
exports.Validator = void 0;
|
|
9
|
-
|
|
10
|
-
require("core-js/modules/esnext.async-iterator.reduce.js");
|
|
11
|
-
|
|
12
|
-
require("core-js/modules/esnext.iterator.constructor.js");
|
|
13
|
-
|
|
14
|
-
require("core-js/modules/esnext.iterator.reduce.js");
|
|
15
|
-
|
|
16
|
-
require("core-js/modules/esnext.async-iterator.map.js");
|
|
17
|
-
|
|
18
|
-
require("core-js/modules/esnext.iterator.map.js");
|
|
19
|
-
|
|
20
|
-
var _objection = _interopRequireDefault(require("objection"));
|
|
21
|
-
|
|
22
|
-
var _ajv = _interopRequireDefault(require("ajv"));
|
|
23
|
-
|
|
24
|
-
var _ajvFormats = _interopRequireDefault(require("ajv-formats"));
|
|
25
|
-
|
|
26
|
-
var _utils = require("@ditojs/utils");
|
|
27
|
-
|
|
28
|
-
var _utils2 = require("../utils");
|
|
29
|
-
|
|
30
|
-
var schema = _interopRequireWildcard(require("../schema"));
|
|
31
|
-
|
|
32
|
-
function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function (nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
|
|
33
|
-
|
|
34
|
-
function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
|
|
35
|
-
|
|
36
|
-
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
37
|
-
|
|
38
|
-
class Validator extends _objection.default.Validator {
|
|
39
|
-
constructor({
|
|
40
|
-
options,
|
|
41
|
-
keywords,
|
|
42
|
-
formats
|
|
43
|
-
} = {}) {
|
|
44
|
-
super();
|
|
45
|
-
this.options = { ...defaultOptions,
|
|
46
|
-
...options
|
|
47
|
-
};
|
|
48
|
-
this.keywords = { ...schema.keywords,
|
|
49
|
-
...keywords
|
|
50
|
-
};
|
|
51
|
-
this.formats = { ...schema.formats,
|
|
52
|
-
...formats
|
|
53
|
-
};
|
|
54
|
-
this.schemas = [];
|
|
55
|
-
this.ajvCache = Object.create(null);
|
|
56
|
-
}
|
|
57
|
-
|
|
58
|
-
createAjv(options) {
|
|
59
|
-
const {
|
|
60
|
-
async,
|
|
61
|
-
patch,
|
|
62
|
-
...opts
|
|
63
|
-
} = options;
|
|
64
|
-
const ajv = new _ajv.default({ ...this.options,
|
|
65
|
-
...opts,
|
|
66
|
-
...(patch && {
|
|
67
|
-
useDefaults: false
|
|
68
|
-
})
|
|
69
|
-
});
|
|
70
|
-
(0, _ajvFormats.default)(ajv, {
|
|
71
|
-
mode: 'full'
|
|
72
|
-
});
|
|
73
|
-
|
|
74
|
-
const addSchemas = (schemas, callback) => {
|
|
75
|
-
for (const [name, schema] of Object.entries(schemas)) {
|
|
76
|
-
if (schema) {
|
|
77
|
-
callback(name.replace(/^_/, ''), schema);
|
|
78
|
-
}
|
|
79
|
-
}
|
|
80
|
-
};
|
|
81
|
-
|
|
82
|
-
addSchemas(this.keywords, (keyword, schema) => ajv.addKeyword({
|
|
83
|
-
keyword,
|
|
84
|
-
...schema
|
|
85
|
-
}));
|
|
86
|
-
addSchemas(this.formats, (format, schema) => ajv.addFormat(format, { ...schema
|
|
87
|
-
}));
|
|
88
|
-
|
|
89
|
-
for (const schema of this.schemas) {
|
|
90
|
-
ajv.addSchema(this.processSchema(schema, options));
|
|
91
|
-
}
|
|
92
|
-
|
|
93
|
-
return ajv;
|
|
94
|
-
}
|
|
95
|
-
|
|
96
|
-
getAjv(options = {}) {
|
|
97
|
-
const opts = Object.entries(options).reduce((opts, [key, value]) => {
|
|
98
|
-
if (key in validatorOptions && value !== validatorOptions[key]) {
|
|
99
|
-
opts[key] = value;
|
|
100
|
-
}
|
|
101
|
-
|
|
102
|
-
return opts;
|
|
103
|
-
}, {});
|
|
104
|
-
const cacheKey = (0, _utils2.formatJson)(opts, false);
|
|
105
|
-
const {
|
|
106
|
-
ajv
|
|
107
|
-
} = this.ajvCache[cacheKey] || (this.ajvCache[cacheKey] = {
|
|
108
|
-
ajv: this.createAjv(opts),
|
|
109
|
-
options
|
|
110
|
-
});
|
|
111
|
-
return ajv;
|
|
112
|
-
}
|
|
113
|
-
|
|
114
|
-
compile(jsonSchema, options = {}) {
|
|
115
|
-
const ajv = this.getAjv(options);
|
|
116
|
-
const validator = ajv.compile(this.processSchema(jsonSchema, options));
|
|
117
|
-
const dontThrow = options.throw === false;
|
|
118
|
-
return options.async ? dontThrow ? async function validate(data) {
|
|
119
|
-
let result;
|
|
120
|
-
|
|
121
|
-
try {
|
|
122
|
-
result = await validator.call(this, data);
|
|
123
|
-
} catch (error) {
|
|
124
|
-
if (error.errors) {
|
|
125
|
-
validate.errors = error.errors;
|
|
126
|
-
result = false;
|
|
127
|
-
} else {
|
|
128
|
-
throw error;
|
|
129
|
-
}
|
|
130
|
-
}
|
|
131
|
-
|
|
132
|
-
return result;
|
|
133
|
-
} : validator : dontThrow ? validator : function (data) {
|
|
134
|
-
const result = validator.call(this, data);
|
|
135
|
-
|
|
136
|
-
if (!result) {
|
|
137
|
-
throw new _ajv.default.ValidationError(validator.errors);
|
|
138
|
-
}
|
|
139
|
-
|
|
140
|
-
return result;
|
|
141
|
-
};
|
|
142
|
-
}
|
|
143
|
-
|
|
144
|
-
getKeyword(keyword) {
|
|
145
|
-
return this.keywords[keyword];
|
|
146
|
-
}
|
|
147
|
-
|
|
148
|
-
getFormat(format) {
|
|
149
|
-
return this.formats[format];
|
|
150
|
-
}
|
|
151
|
-
|
|
152
|
-
addSchema(jsonSchema) {
|
|
153
|
-
this.schemas.push(jsonSchema);
|
|
154
|
-
|
|
155
|
-
for (const {
|
|
156
|
-
ajv,
|
|
157
|
-
options
|
|
158
|
-
} of Object.values(this.ajvCache)) {
|
|
159
|
-
ajv.addSchema(this.processSchema(jsonSchema, options));
|
|
160
|
-
}
|
|
161
|
-
}
|
|
162
|
-
|
|
163
|
-
processSchema(jsonSchema, options = {}) {
|
|
164
|
-
const {
|
|
165
|
-
patch,
|
|
166
|
-
async
|
|
167
|
-
} = options;
|
|
168
|
-
const schema = (0, _utils.clone)(jsonSchema, value => {
|
|
169
|
-
if ((0, _utils.isObject)(value)) {
|
|
170
|
-
if (patch) {
|
|
171
|
-
delete value.required;
|
|
172
|
-
|
|
173
|
-
if (value.format === 'required') {
|
|
174
|
-
delete value.format;
|
|
175
|
-
}
|
|
176
|
-
}
|
|
177
|
-
|
|
178
|
-
if ((0, _utils.isAsync)(value.validate)) {
|
|
179
|
-
value.validateAsync = value.validate;
|
|
180
|
-
delete value.validate;
|
|
181
|
-
}
|
|
182
|
-
|
|
183
|
-
if (!async) {
|
|
184
|
-
for (const key in value) {
|
|
185
|
-
const keyword = this.getKeyword(key);
|
|
186
|
-
|
|
187
|
-
if (keyword != null && keyword.async) {
|
|
188
|
-
delete value[key];
|
|
189
|
-
}
|
|
190
|
-
}
|
|
191
|
-
}
|
|
192
|
-
}
|
|
193
|
-
});
|
|
194
|
-
|
|
195
|
-
if (async) {
|
|
196
|
-
schema.$async = true;
|
|
197
|
-
}
|
|
198
|
-
|
|
199
|
-
return schema;
|
|
200
|
-
}
|
|
201
|
-
|
|
202
|
-
parseErrors(errors, options = {}) {
|
|
203
|
-
const errorHash = {};
|
|
204
|
-
const duplicates = {};
|
|
205
|
-
|
|
206
|
-
for (const error of errors) {
|
|
207
|
-
const dataPath = `${(options == null ? void 0 : options.dataPath) || ''}${error.dataPath}`;
|
|
208
|
-
const key = dataPath.replace(/\['([^']*)'\]/g, '.$1').slice(1);
|
|
209
|
-
const {
|
|
210
|
-
message,
|
|
211
|
-
keyword,
|
|
212
|
-
params
|
|
213
|
-
} = error;
|
|
214
|
-
const definition = keyword === 'format' ? this.getFormat(params.format) : this.getKeyword(keyword);
|
|
215
|
-
const identifier = `${key}_${keyword}`;
|
|
216
|
-
|
|
217
|
-
if (!duplicates[identifier] && !/^\$/.test(keyword) && !(definition != null && definition.macro) && !(definition != null && definition.silent)) {
|
|
218
|
-
const array = errorHash[key] || (errorHash[key] = []);
|
|
219
|
-
array.push({
|
|
220
|
-
message: (definition == null ? void 0 : definition.message) || message,
|
|
221
|
-
keyword,
|
|
222
|
-
params
|
|
223
|
-
});
|
|
224
|
-
duplicates[identifier] = true;
|
|
225
|
-
}
|
|
226
|
-
}
|
|
227
|
-
|
|
228
|
-
for (const [dataPath, errors] of Object.entries(errorHash)) {
|
|
229
|
-
if (errors.length === 2) {
|
|
230
|
-
const [error1, error2] = errors;
|
|
231
|
-
|
|
232
|
-
if (error1.keyword === 'type' && error1.params.type === 'null' && error2.keyword === 'oneOf') {
|
|
233
|
-
delete errorHash[dataPath];
|
|
234
|
-
}
|
|
235
|
-
}
|
|
236
|
-
}
|
|
237
|
-
|
|
238
|
-
return errorHash;
|
|
239
|
-
}
|
|
240
|
-
|
|
241
|
-
prefixDataPaths(errors, dataPathPrefix) {
|
|
242
|
-
return errors.map(error => ({ ...error,
|
|
243
|
-
dataPath: error.dataPath ? `${dataPathPrefix}${error.dataPath}` : dataPathPrefix
|
|
244
|
-
}));
|
|
245
|
-
}
|
|
246
|
-
|
|
247
|
-
beforeValidate({
|
|
248
|
-
json,
|
|
249
|
-
model,
|
|
250
|
-
ctx,
|
|
251
|
-
options
|
|
252
|
-
}) {
|
|
253
|
-
ctx.validator = this;
|
|
254
|
-
ctx.app = this.app;
|
|
255
|
-
ctx.options = options;
|
|
256
|
-
ctx.jsonSchema = model.constructor.getJsonSchema();
|
|
257
|
-
const {
|
|
258
|
-
$beforeValidate
|
|
259
|
-
} = model;
|
|
260
|
-
|
|
261
|
-
if ($beforeValidate !== _objection.default.Model.prototype.$beforeValidate) {
|
|
262
|
-
if ($beforeValidate.length > 0) {
|
|
263
|
-
ctx.jsonSchema = (0, _utils.clone)(ctx.jsonSchema);
|
|
264
|
-
}
|
|
265
|
-
|
|
266
|
-
const ret = model.$beforeValidate(ctx.jsonSchema, json, options);
|
|
267
|
-
|
|
268
|
-
if (ret !== undefined) {
|
|
269
|
-
ctx.jsonSchema = ret;
|
|
270
|
-
}
|
|
271
|
-
}
|
|
272
|
-
}
|
|
273
|
-
|
|
274
|
-
validate({
|
|
275
|
-
json,
|
|
276
|
-
model,
|
|
277
|
-
ctx,
|
|
278
|
-
options
|
|
279
|
-
}) {
|
|
280
|
-
const {
|
|
281
|
-
jsonSchema
|
|
282
|
-
} = ctx;
|
|
283
|
-
|
|
284
|
-
if (jsonSchema) {
|
|
285
|
-
if (!options.mutable && !options.patch && hasDefaults(jsonSchema.properties)) {
|
|
286
|
-
json = (0, _utils.clone)(json);
|
|
287
|
-
}
|
|
288
|
-
|
|
289
|
-
const validate = this.getAjv(options).getSchema(jsonSchema.$id);
|
|
290
|
-
const res = validate.call(ctx, json);
|
|
291
|
-
|
|
292
|
-
const handleErrors = errors => {
|
|
293
|
-
if (errors) {
|
|
294
|
-
throw model.constructor.createValidationError({
|
|
295
|
-
type: 'ModelValidation',
|
|
296
|
-
errors,
|
|
297
|
-
options,
|
|
298
|
-
json
|
|
299
|
-
});
|
|
300
|
-
}
|
|
301
|
-
};
|
|
302
|
-
|
|
303
|
-
if ((0, _utils.isPromise)(res)) {
|
|
304
|
-
return res.catch(error => handleErrors(error.errors)).then(() => json);
|
|
305
|
-
} else {
|
|
306
|
-
handleErrors(validate.errors);
|
|
307
|
-
return json;
|
|
308
|
-
}
|
|
309
|
-
}
|
|
310
|
-
}
|
|
311
|
-
|
|
312
|
-
}
|
|
313
|
-
|
|
314
|
-
exports.Validator = Validator;
|
|
315
|
-
|
|
316
|
-
function hasDefaults(obj) {
|
|
317
|
-
if ((0, _utils.isArray)(obj)) {
|
|
318
|
-
for (const val of obj) {
|
|
319
|
-
if (val && hasDefaults(val)) {
|
|
320
|
-
return true;
|
|
321
|
-
}
|
|
322
|
-
}
|
|
323
|
-
} else if ((0, _utils.isObject)(obj)) {
|
|
324
|
-
for (const [key, val] of Object.entries(obj)) {
|
|
325
|
-
if (key === 'default' || val && hasDefaults(val)) {
|
|
326
|
-
return true;
|
|
327
|
-
}
|
|
328
|
-
}
|
|
329
|
-
}
|
|
330
|
-
|
|
331
|
-
return false;
|
|
332
|
-
}
|
|
333
|
-
|
|
334
|
-
const defaultOptions = {
|
|
335
|
-
strict: false,
|
|
336
|
-
allErrors: true,
|
|
337
|
-
ownProperties: true,
|
|
338
|
-
passContext: true,
|
|
339
|
-
useDefaults: true,
|
|
340
|
-
validateSchema: true
|
|
341
|
-
};
|
|
342
|
-
const validatorOptions = {
|
|
343
|
-
async: false,
|
|
344
|
-
patch: false,
|
|
345
|
-
$data: false,
|
|
346
|
-
$comment: false,
|
|
347
|
-
coerceTypes: false,
|
|
348
|
-
multipleOfPrecision: false,
|
|
349
|
-
ownProperties: true,
|
|
350
|
-
removeAdditional: false,
|
|
351
|
-
uniqueItems: true,
|
|
352
|
-
useDefaults: true,
|
|
353
|
-
verbose: false
|
|
354
|
-
};
|
|
355
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9hcHAvVmFsaWRhdG9yLmpzIl0sIm5hbWVzIjpbIlZhbGlkYXRvciIsIm9iamVjdGlvbiIsImNvbnN0cnVjdG9yIiwib3B0aW9ucyIsImtleXdvcmRzIiwiZm9ybWF0cyIsImRlZmF1bHRPcHRpb25zIiwic2NoZW1hIiwic2NoZW1hcyIsImFqdkNhY2hlIiwiT2JqZWN0IiwiY3JlYXRlIiwiY3JlYXRlQWp2IiwiYXN5bmMiLCJwYXRjaCIsIm9wdHMiLCJhanYiLCJBanYiLCJ1c2VEZWZhdWx0cyIsIm1vZGUiLCJhZGRTY2hlbWFzIiwiY2FsbGJhY2siLCJuYW1lIiwiZW50cmllcyIsInJlcGxhY2UiLCJrZXl3b3JkIiwiYWRkS2V5d29yZCIsImZvcm1hdCIsImFkZEZvcm1hdCIsImFkZFNjaGVtYSIsInByb2Nlc3NTY2hlbWEiLCJnZXRBanYiLCJyZWR1Y2UiLCJrZXkiLCJ2YWx1ZSIsInZhbGlkYXRvck9wdGlvbnMiLCJjYWNoZUtleSIsImNvbXBpbGUiLCJqc29uU2NoZW1hIiwidmFsaWRhdG9yIiwiZG9udFRocm93IiwidGhyb3ciLCJ2YWxpZGF0ZSIsImRhdGEiLCJyZXN1bHQiLCJjYWxsIiwiZXJyb3IiLCJlcnJvcnMiLCJWYWxpZGF0aW9uRXJyb3IiLCJnZXRLZXl3b3JkIiwiZ2V0Rm9ybWF0IiwicHVzaCIsInZhbHVlcyIsInJlcXVpcmVkIiwidmFsaWRhdGVBc3luYyIsIiRhc3luYyIsInBhcnNlRXJyb3JzIiwiZXJyb3JIYXNoIiwiZHVwbGljYXRlcyIsImRhdGFQYXRoIiwic2xpY2UiLCJtZXNzYWdlIiwicGFyYW1zIiwiZGVmaW5pdGlvbiIsImlkZW50aWZpZXIiLCJ0ZXN0IiwibWFjcm8iLCJzaWxlbnQiLCJhcnJheSIsImxlbmd0aCIsImVycm9yMSIsImVycm9yMiIsInR5cGUiLCJwcmVmaXhEYXRhUGF0aHMiLCJkYXRhUGF0aFByZWZpeCIsIm1hcCIsImJlZm9yZVZhbGlkYXRlIiwianNvbiIsIm1vZGVsIiwiY3R4IiwiYXBwIiwiZ2V0SnNvblNjaGVtYSIsIiRiZWZvcmVWYWxpZGF0ZSIsIk1vZGVsIiwicHJvdG90eXBlIiwicmV0IiwidW5kZWZpbmVkIiwibXV0YWJsZSIsImhhc0RlZmF1bHRzIiwicHJvcGVydGllcyIsImdldFNjaGVtYSIsIiRpZCIsInJlcyIsImhhbmRsZUVycm9ycyIsImNyZWF0ZVZhbGlkYXRpb25FcnJvciIsImNhdGNoIiwidGhlbiIsIm9iaiIsInZhbCIsInN0cmljdCIsImFsbEVycm9ycyIsIm93blByb3BlcnRpZXMiLCJwYXNzQ29udGV4dCIsInZhbGlkYXRlU2NoZW1hIiwiJGRhdGEiLCIkY29tbWVudCIsImNvZXJjZVR5cGVzIiwibXVsdGlwbGVPZlByZWNpc2lvbiIsInJlbW92ZUFkZGl0aW9uYWwiLCJ1bmlxdWVJdGVtcyIsInZlcmJvc2UiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7Ozs7Ozs7QUFVTyxNQUFNQSxTQUFOLFNBQXdCQyxtQkFBVUQsU0FBbEMsQ0FBNEM7QUFDakRFLEVBQUFBLFdBQVcsQ0FBQztBQUFFQyxJQUFBQSxPQUFGO0FBQVdDLElBQUFBLFFBQVg7QUFBcUJDLElBQUFBO0FBQXJCLE1BQWlDLEVBQWxDLEVBQXNDO0FBQy9DO0FBRUEsU0FBS0YsT0FBTCxHQUFlLEVBQ2IsR0FBR0csY0FEVTtBQUViLFNBQUdIO0FBRlUsS0FBZjtBQUtBLFNBQUtDLFFBQUwsR0FBZ0IsRUFDZCxHQUFHRyxNQUFNLENBQUNILFFBREk7QUFFZCxTQUFHQTtBQUZXLEtBQWhCO0FBS0EsU0FBS0MsT0FBTCxHQUFlLEVBQ2IsR0FBR0UsTUFBTSxDQUFDRixPQURHO0FBRWIsU0FBR0E7QUFGVSxLQUFmO0FBS0EsU0FBS0csT0FBTCxHQUFlLEVBQWY7QUFJQSxTQUFLQyxRQUFMLEdBQWdCQyxNQUFNLENBQUNDLE1BQVAsQ0FBYyxJQUFkLENBQWhCO0FBQ0Q7O0FBRURDLEVBQUFBLFNBQVMsQ0FBQ1QsT0FBRCxF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c0NvbnRlbnQiOlsiaW1wb3J0IG9iamVjdGlvbiBmcm9tICdvYmplY3Rpb24nXG5pbXBvcnQgQWp2IGZyb20gJ2FqdidcbmltcG9ydCBhZGRGb3JtYXRzIGZyb20gJ2Fqdi1mb3JtYXRzJ1xuaW1wb3J0IHsgaXNBcnJheSwgaXNPYmplY3QsIGNsb25lLCBpc0FzeW5jLCBpc1Byb21pc2UgfSBmcm9tICdAZGl0b2pzL3V0aWxzJ1xuaW1wb3J0IHsgZm9ybWF0SnNvbiB9IGZyb20gJ0AvdXRpbHMnXG5pbXBvcnQgKiBhcyBzY2hlbWEgZnJvbSAnQC9zY2hlbWEnXG5cbi8vIERpdG8gZG9lcyBub3QgcmVseSBvbiBvYmplY3Rpb24uQWp2VmFsaWRhdG9yIGJ1dCBpbnN0ZWFkIGltcGxlbWVudHMgaXRzIG93blxuLy8gdmFsaWRhdG9yIGluc3RhbmNlIHRoYXQgaXMgc2hhcmVkIGFjcm9zcyB0aGUgd2hvbGUgYXBwIGFuZCBoYW5kbGVzIHNjaGVtYVxuLy8gY29tcGlsYXRpb24gYW5kIGNhY2hpbmcgZGlmZmVyZW50bHk6XG4vLyBJdCByZWxpZXMgb24gQWp2J3MgYWRkU2NoZW1hKCkgLyBnZXRTY2hlbWEoKSBwYXR0ZXJuIGluIGNvbmp1bmN0aW9uIHdpdGggdGhlXG4vLyBgc2NoZW1hSWQ6ICckaWQnYCBvcHRpb24sIGFuZCBlYWNoIHNjaGVtYSBpcyBhc3NpZ25lZCBhbiAkaWQgYmFzZWQgb24gdGhlXG4vLyBtb2RlbCBjbGFzcyBuYW1lLiBUaGF0IHdheSwgc2NoZW1hcyBjYW4gcmVmZXJlbmNlIGVhY2ggb3RoZXIsIGFuZCB0aGV5IGNhblxuLy8gZWFzaWx5IHZhbGlkYXRlIG5lc3RlZCBzdHJ1Y3R1cmVzLlxuXG5leHBvcnQgY2xhc3MgVmFsaWRhdG9yIGV4dGVuZHMgb2JqZWN0aW9uLlZhbGlkYXRvciB7XG4gIGNvbnN0cnVjdG9yKHsgb3B0aW9ucywga2V5d29yZHMsIGZvcm1hdHMgfSA9IHt9KSB7XG4gICAgc3VwZXIoKVxuXG4gICAgdGhpcy5vcHRpb25zID0ge1xuICAgICAgLi4uZGVmYXVsdE9wdGlvbnMsXG4gICAgICAuLi5vcHRpb25zXG4gICAgfVxuXG4gICAgdGhpcy5rZXl3b3JkcyA9IHtcbiAgICAgIC4uLnNjaGVtYS5rZXl3b3JkcyxcbiAgICAgIC4uLmtleXdvcmRzXG4gICAgfVxuXG4gICAgdGhpcy5mb3JtYXRzID0ge1xuICAgICAgLi4uc2NoZW1hLmZvcm1hdHMsXG4gICAgICAuLi5mb3JtYXRzXG4gICAgfVxuXG4gICAgdGhpcy5zY2hlbWFzID0gW11cblxuICAgIC8vIERpY3Rpb25hcnkgdG8gaG9sZCBhbGwgY3JlYXRlZCBBanYgaW5zdGFuY2VzLCB1c2luZyB0aGUgc3RyaW5naWZpZWRcbiAgICAvLyBvcHRpb25zIHdpdGggd2hpY2ggdGhleSB3ZXJlIGNyZWF0ZWQgYXMgdGhlaXIga2V5cy5cbiAgICB0aGlzLmFqdkNhY2hlID0gT2JqZWN0LmNyZWF0ZShudWxsKVxuICB9XG5cbiAgY3JlYXRlQWp2KG9wdGlvbnMpIHtcbiAgICAvLyBTcGxpdCBvcHRpb25zIGludG8gbmF0aXZlIEFqdiBvcHRpb25zIGFuZCBvdXIgYWRkaXRpb25zIChhc3luYywgcGF0Y2gpOlxuICAgIGNvbnN0IHsgYXN5bmMsIHBhdGNoLCAuLi5vcHRzIH0gPSBvcHRpb25zXG4gICAgY29uc3QgYWp2ID0gbmV3IEFqdih7XG4gICAgICAuLi50aGlzLm9wdGlvbnMsXG4gICAgICAuLi5vcHRzLFxuICAgICAgLy8gUGF0Y2gtdmFsaWRhdG9ycyBkb24ndCB1c2UgZGVmYXVsdCB2YWx1ZXM6XG4gICAgICAuLi4ocGF0Y2ggJiYgeyB1c2VEZWZhdWx0czogZmFsc2UgfSlcbiAgICB9KVxuICAgIGFkZEZvcm1hdHMoYWp2LCB7IG1vZGU6ICdmdWxsJyB9KVxuXG4gICAgY29uc3QgYWRkU2NoZW1hcyA9IChzY2hlbWFzLCBjYWxsYmFjaykgPT4ge1xuICAgICAgZm9yIChjb25zdCBbbmFtZSwgc2NoZW1hXSBvZiBPYmplY3QuZW50cmllcyhzY2hlbWFzKSkge1xuICAgICAgICBpZiAoc2NoZW1hKSB7XG4gICAgICAgICAgLy8gUmVtb3ZlIGxlYWRpbmcgJ18nIHRvIHNpbXBsaWZ5IHNwZWNpYWwga2V5d29yZHMgKGUuZy4gaW5zdGFuY2VvZilcbiAgICAgICAgICBjYWxsYmFjayhuYW1lLnJlcGxhY2UoL15fLywgJycpLCBzY2hlbWEpXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBhZGRTY2hlbWFzKHRoaXMua2V5d29yZHMsIChrZXl3b3JkLCBzY2hlbWEpID0+IGFqdi5hZGRLZXl3b3JkKHtcbiAgICAgIGtleXdvcmQsXG4gICAgICAuLi5zY2hlbWFcbiAgICB9KSlcbiAgICBhZGRTY2hlbWFzKHRoaXMuZm9ybWF0cywgKGZvcm1hdCwgc2NoZW1hKSA9PiBhanYuYWRkRm9ybWF0KGZvcm1hdCwge1xuICAgICAgLi4uc2NoZW1hXG4gICAgfSkpXG5cbiAgICAvLyBBbHNvIGFkZCBhbGwgbW9kZWwgc2NoZW1hcyB0aGF0IHdlcmUgYWxyZWFkeSBjb21waWxlZCBzbyBmYXIuXG4gICAgZm9yIChjb25zdCBzY2hlbWEgb2YgdGhpcy5zY2hlbWFzKSB7XG4gICAgICBhanYuYWRkU2NoZW1hKHRoaXMucHJvY2Vzc1NjaGVtYShzY2hlbWEsIG9wdGlvbnMpKVxuICAgIH1cblxuICAgIHJldHVybiBhanZcbiAgfVxuXG4gIGdldEFqdihvcHRpb25zID0ge30pIHtcbiAgICAvLyBDYWNoZSBBanYgaW5zdGFuY2VzIGJ5IGtleXMgdGhhdCByZXByZXNlbnQgdGhlaXIgb3B0aW9ucy4gRm9yIGltcHJvdmVkXG4gICAgLy8gbWF0Y2hpbmcsIGNvbnZlcnQgb3B0aW9ucyB0byBhIHZlcnNpb24gd2l0aCBhbGwgZGVmYXVsdCB2YWx1ZXMgbWlzc2luZzpcbiAgICBjb25zdCBvcHRzID0gT2JqZWN0LmVudHJpZXMob3B0aW9ucykucmVkdWNlKChvcHRzLCBba2V5LCB2YWx1ZV0pID0+IHtcbiAgICAgIGlmIChrZXkgaW4gdmFsaWRhdG9yT3B0aW9ucyAmJiB2YWx1ZSAhPT0gdmFsaWRhdG9yT3B0aW9uc1trZXldKSB7XG4gICAgICAgIG9wdHNba2V5XSA9IHZhbHVlXG4gICAgICB9XG4gICAgICByZXR1cm4gb3B0c1xuICAgIH0sIHt9KVxuICAgIGNvbnN0IGNhY2hlS2V5ID0gZm9ybWF0SnNvbihvcHRzLCBmYWxzZSlcbiAgICBjb25zdCB7IGFqdiB9ID0gdGhpcy5hanZDYWNoZVtjYWNoZUtleV0gfHwgKHRoaXMuYWp2Q2FjaGVbY2FjaGVLZXldID0ge1xuICAgICAgYWp2OiB0aGlzLmNyZWF0ZUFqdihvcHRzKSxcbiAgICAgIG9wdGlvbnNcbiAgICB9KVxuICAgIHJldHVybiBhanZcbiAgfVxuXG4gIGNvbXBpbGUoanNvblNjaGVtYSwgb3B0aW9ucyA9IHt9KSB7XG4gICAgY29uc3QgYWp2ID0gdGhpcy5nZXRBanYob3B0aW9ucylcbiAgICBjb25zdCB2YWxpZGF0b3IgPSBhanYuY29tcGlsZSh0aGlzLnByb2Nlc3NTY2hlbWEoanNvblNjaGVtYSwgb3B0aW9ucykpXG4gICAgLy8gQXNzdW1lIGBvcHRpb25zLnRocm93ID0gdHJ1ZWAgYXMgdGhlIGRlZmF1bHQuXG4gICAgY29uc3QgZG9udFRocm93ID0gb3B0aW9ucy50aHJvdyA9PT0gZmFsc2VcbiAgICByZXR1cm4gb3B0aW9ucy5hc3luY1xuICAgICAgLy8gRm9yIGFzeW5jOlxuICAgICAgPyBkb250VGhyb3dcbiAgICAgICAgPyBhc3luYyBmdW5jdGlvbiB2YWxpZGF0ZShkYXRhKSB7XG4gICAgICAgICAgLy8gRW11bGF0ZSBgb3B0aW9ucy50aHJvdyA9PSBmYWxzZWAgYmVoYXZpb3IgZm9yIGFzeW5jIHZhbGlkYXRpb246XG4gICAgICAgICAgLy8gUmV0dXJuIGB0cnVlYCBvciBgZmFsc2VgLCBhbmQgc3RvcmUgZXJyb3JzIG9uIGB2YWxpZGF0ZS5lcnJvcnNgXG4gICAgICAgICAgLy8gaWYgdmFsaWRhdGlvbiBmYWlsZWQuXG4gICAgICAgICAgbGV0IHJlc3VsdFxuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAvLyBVc2UgYGNhbGwoKWAgdG8gcGFzcyBgdGhpc2AgYXMgY29udGV4dCB0byBBanYsIHNlZSBwYXNzQ29udGV4dDpcbiAgICAgICAgICAgIHJlc3VsdCA9IGF3YWl0IHZhbGlkYXRvci5jYWxsKHRoaXMsIGRhdGEpXG4gICAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgIGlmIChlcnJvci5lcnJvcnMpIHtcbiAgICAgICAgICAgICAgdmFsaWRhdGUuZXJyb3JzID0gZXJyb3IuZXJyb3JzXG4gICAgICAgICAgICAgIHJlc3VsdCA9IGZhbHNlXG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICB0aHJvdyBlcnJvclxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gcmVzdWx0XG4gICAgICAgIH1cbiAgICAgICAgOiB2YWxpZGF0b3IgLy8gVGhlIGRlZmF1bHQgZm9yIGFzeW5jIGlzIHRvIHRocm93LlxuICAgICAgLy8gRm9yIHN5bmM6XG4gICAgICA6IGRvbnRUaHJvd1xuICAgICAgICA/IHZhbGlkYXRvciAvLyBUaGUgZGVmYXVsdCBmb3Igc3luYyBpcyB0byBub3QgdGhyb3cuXG4gICAgICAgIDogZnVuY3Rpb24oZGF0YSkge1xuICAgICAgICAgIC8vIEVtdWxhdGUgYG9wdGlvbnMudGhyb3cgPT0gdHJ1ZWAgYmVoYXZpb3IgZm9yIHN5bmMgdmFsaWRhdGlvbjpcbiAgICAgICAgICAvLyBSZXR1cm4gYHRydWVgIGlmIHN1Y2Nlc3NmdWwsIHRocm93IGBBanYuVmFsaWRhdGlvbkVycm9yYCBvdGhlcndpc2UuXG4gICAgICAgICAgLy8gVXNlIGBjYWxsKClgIHRvIHBhc3MgYHRoaXNgIGFzIGNvbnRleHQgdG8gQWp2LCBzZWUgcGFzc0NvbnRleHQ6XG4gICAgICAgICAgY29uc3QgcmVzdWx0ID0gdmFsaWRhdG9yLmNhbGwodGhpcywgZGF0YSlcbiAgICAgICAgICBpZiAoIXJlc3VsdCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEFqdi5WYWxpZGF0aW9uRXJyb3IodmFsaWRhdG9yLmVycm9ycylcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIHJlc3VsdFxuICAgICAgICB9XG4gIH1cblxuICBnZXRLZXl3b3JkKGtleXdvcmQpIHtcbiAgICByZXR1cm4gdGhpcy5rZXl3b3Jkc1trZXl3b3JkXVxuICB9XG5cbiAgZ2V0Rm9ybWF0KGZvcm1hdCkge1xuICAgIHJldHVybiB0aGlzLmZvcm1hdHNbZm9ybWF0XVxuICB9XG5cbiAgYWRkU2NoZW1hKGpzb25TY2hlbWEpIHtcbiAgICB0aGlzLnNjaGVtYXMucHVzaChqc29uU2NoZW1hKVxuICAgIC8vIEFkZCBzY2hlbWEgdG8gYWxsIHByZXZpb3VzbHkgY3JlYXRlZCBBanYgaW5zdGFuY2VzLCBzbyB0aGV5IGNhbiByZWZlcmVuY2VcbiAgICAvLyB0aGUgbW9kZWxzLlxuICAgIGZvciAoY29uc3QgeyBhanYsIG9wdGlvbnMgfSBvZiBPYmplY3QudmFsdWVzKHRoaXMuYWp2Q2FjaGUpKSB7XG4gICAgICBhanYuYWRkU2NoZW1hKHRoaXMucHJvY2Vzc1NjaGVtYShqc29uU2NoZW1hLCBvcHRpb25zKSlcbiAgICB9XG4gIH1cblxuICBwcm9jZXNzU2NoZW1hKGpzb25TY2hlbWEsIG9wdGlvbnMgPSB7fSkge1xuICAgIGNvbnN0IHsgcGF0Y2gsIGFzeW5jIH0gPSBvcHRpb25zXG4gICAgY29uc3Qgc2NoZW1hID0gY2xvbmUoanNvblNjaGVtYSwgdmFsdWUgPT4ge1xuICAgICAgaWYgKGlzT2JqZWN0KHZhbHVlKSkge1xuICAgICAgICBpZiAocGF0Y2gpIHtcbiAgICAgICAgICAvLyBSZW1vdmUgYWxsIHJlcXVpcmVkIGtleXdvcmRzIGFuZCBmb3JtYXRzIGZyb20gc2NoZW1hIGZvciBwYXRjaFxuICAgICAgICAgIC8vIHZhbGlkYXRpb24uXG4gICAgICAgICAgZGVsZXRlIHZhbHVlLnJlcXVpcmVkXG4gICAgICAgICAgaWYgKHZhbHVlLmZvcm1hdCA9PT0gJ3JlcXVpcmVkJykge1xuICAgICAgICAgICAgZGVsZXRlIHZhbHVlLmZvcm1hdFxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvLyBDb252ZXJ0IGFzeW5jIGB2YWxpZGF0ZSgpYCBrZXl3b3JkcyB0byBgdmFsaWRhdGVBc3luYygpYDpcbiAgICAgICAgaWYgKGlzQXN5bmModmFsdWUudmFsaWRhdGUpKSB7XG4gICAgICAgICAgdmFsdWUudmFsaWRhdGVBc3luYyA9IHZhbHVlLnZhbGlkYXRlXG4gICAgICAgICAgZGVsZXRlIHZhbHVlLnZhbGlkYXRlXG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFhc3luYykge1xuICAgICAgICAgIC8vIFJlbW92ZSBhbGwgYXN5bmMga2V5d29yZHMgZm9yIHN5bmNocm9ub3VzIHZhbGlkYXRpb24uXG4gICAgICAgICAgZm9yIChjb25zdCBrZXkgaW4gdmFsdWUpIHtcbiAgICAgICAgICAgIGNvbnN0IGtleXdvcmQgPSB0aGlzLmdldEtleXdvcmQoa2V5KVxuICAgICAgICAgICAgaWYgKGtleXdvcmQ/LmFzeW5jKSB7XG4gICAgICAgICAgICAgIGRlbGV0ZSB2YWx1ZVtrZXldXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSlcbiAgICBpZiAoYXN5bmMpIHtcbiAgICAgIHNjaGVtYS4kYXN5bmMgPSB0cnVlXG4gICAgfVxuICAgIHJldHVybiBzY2hlbWFcbiAgfVxuXG4gIHBhcnNlRXJyb3JzKGVycm9ycywgb3B0aW9ucyA9IHt9KSB7XG4gICAgLy8gQ29udmVydCBmcm9tIEFqdiBlcnJvcnMgYXJyYXkgdG8gT2JqZWN0aW9uLXN0eWxlIGVycm9ySGFzaCxcbiAgICAvLyB3aXRoIGFkZGl0aW9uYWwgcGFyc2luZyBhbmQgcHJvY2Vzc2luZy5cbiAgICBjb25zdCBlcnJvckhhc2ggPSB7fVxuICAgIGNvbnN0IGR1cGxpY2F0ZXMgPSB7fVxuICAgIGZvciAoY29uc3QgZXJyb3Igb2YgZXJyb3JzKSB7XG4gICAgICAvLyBBZGp1c3QgZGF0YVBhdGhzIHRvIHJlZmxlY3QgbmVzdGVkIHZhbGlkYXRpb24gaW4gT2JqZWN0aW9uLlxuICAgICAgY29uc3QgZGF0YVBhdGggPSBgJHtvcHRpb25zPy5kYXRhUGF0aCB8fCAnJ30ke2Vycm9yLmRhdGFQYXRofWBcbiAgICAgIC8vIFVua25vd24gcHJvcGVydGllcyBhcmUgcmVwb3J0ZWQgaW4gYFsncHJvcGVydHlOYW1lJ11gIG5vdGF0aW9uLFxuICAgICAgLy8gc28gcmVwbGFjZSB0aG9zZSB3aXRoIGRvdC1ub3RhdGlvbiwgc2VlOlxuICAgICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL2Vwb2JlcmV6a2luL2Fqdi9pc3N1ZXMvNjcxXG4gICAgICBjb25zdCBrZXkgPSBkYXRhUGF0aC5yZXBsYWNlKC9cXFsnKFteJ10qKSdcXF0vZywgJy4kMScpLnNsaWNlKDEpXG4gICAgICBjb25zdCB7IG1lc3NhZ2UsIGtleXdvcmQsIHBhcmFtcyB9ID0gZXJyb3JcbiAgICAgIGNvbnN0IGRlZmluaXRpb24gPSBrZXl3b3JkID09PSAnZm9ybWF0J1xuICAgICAgICA/IHRoaXMuZ2V0Rm9ybWF0KHBhcmFtcy5mb3JtYXQpXG4gICAgICAgIDogdGhpcy5nZXRLZXl3b3JkKGtleXdvcmQpXG4gICAgICBjb25zdCBpZGVudGlmaWVyID0gYCR7a2V5fV8ke2tleXdvcmR9YFxuICAgICAgaWYgKFxuICAgICAgICAvLyBBanYgcHJvZHVjZXMgZHVwbGljYXRlIHZhbGlkYXRpb24gZXJyb3JzIHNvbWV0aW1lcywgZmlsdGVyIHRoZW0gb3V0LlxuICAgICAgICAhZHVwbGljYXRlc1tpZGVudGlmaWVyXSAmJlxuICAgICAgICAvLyBTa2lwIGtleXdvcmRzIHRoYXQgc3RhcnQgd2l0aCAkIHN1Y2ggYXMgJG1lcmdlIGFuZCAkcGF0Y2guXG4gICAgICAgICEvXlxcJC8udGVzdChrZXl3b3JkKSAmJlxuICAgICAgICAvLyBTa2lwIG1hY3JvIGtleXdvcmRzIHRoYXQgYXJlIG9ubHkgZGVsZWdhdGluZyB0byBvdGhlciBrZXl3b3Jkcy5cbiAgICAgICAgIWRlZmluaXRpb24/Lm1hY3JvICYmXG4gICAgICAgIC8vIEZpbHRlciBvdXQgYWxsIGN1c3RvbSBrZXl3b3JkcyBhbmQgZm9ybWF0cyB0aGF0IHdhbnQgdG8gYmUgc2lsZW50LlxuICAgICAgICAhZGVmaW5pdGlvbj8uc2lsZW50XG4gICAgICApIHtcbiAgICAgICAgY29uc3QgYXJyYXkgPSBlcnJvckhhc2hba2V5XSB8fCAoZXJyb3JIYXNoW2tleV0gPSBbXSlcbiAgICAgICAgYXJyYXkucHVzaCh7XG4gICAgICAgICAgLy8gQWxsb3cgY3VzdG9tIGZvcm1hdHMgYW5kIGtleXdvcmRzIHRvIG92ZXJyaWRlIGVycm9yIG1lc3NhZ2VzLlxuICAgICAgICAgIG1lc3NhZ2U6IGRlZmluaXRpb24/Lm1lc3NhZ2UgfHwgbWVzc2FnZSxcbiAgICAgICAgICBrZXl3b3JkLFxuICAgICAgICAgIHBhcmFtc1xuICAgICAgICB9KVxuICAgICAgICBkdXBsaWNhdGVzW2lkZW50aWZpZXJdID0gdHJ1ZVxuICAgICAgfVxuICAgIH1cbiAgICAvLyBOb3cgZmlsdGVyIHRocm91Z2ggdGhlIHJlc3VsdGluZyBlcnJvcnMgYW5kIHBlcmZvcm0gc29tZSBwb3N0LXByb2Nlc3Npbmc6XG4gICAgZm9yIChjb25zdCBbZGF0YVBhdGgsIGVycm9yc10gb2YgT2JqZWN0LmVudHJpZXMoZXJyb3JIYXNoKSkge1xuICAgICAgLy8gV2hlbiB3ZSBnZXQgdGhlc2UgZXJyb3JzIChjYXVzZWQgYnkgYG51bGxhYmxlOiB0cnVlYCksIGl0IG1lYW5zIHRoYXQgd2VcbiAgICAgIC8vIGhhdmUgZGF0YSB0aGF0IGlzbid0IG51bGwgYW5kIGlzIGNhdXNpbmcgb3RoZXIgZXJyb3JzLCBhbmQgd2Ugc2hvdWxkbid0XG4gICAgICAvLyBkaXNwbGF5IHRoZSAnbnVsbCcgcGF0aDpcbiAgICAgIC8vIFtkYXRhUGF0aF06IFtcbiAgICAgIC8vICAge1xuICAgICAgLy8gICAgIG1lc3NhZ2U6ICdzaG91bGQgYmUgbnVsbCcsXG4gICAgICAvLyAgICAga2V5d29yZDogJ3R5cGUnLFxuICAgICAgLy8gICAgIHBhcmFtczogeyB0eXBlOiAnbnVsbCcgfVxuICAgICAgLy8gICB9LFxuICAgICAgLy8gICB7XG4gICAgICAvLyAgICAgbWVzc2FnZTogJ3Nob3VsZCBtYXRjaCBleGFjdGx5IG9uZSBzY2hlbWEgaW4gb25lT2YnLFxuICAgICAgLy8gICAgIGtleXdvcmQ6ICdvbmVPZidcbiAgICAgIC8vICAgfVxuICAgICAgLy8gXVxuICAgICAgaWYgKGVycm9ycy5sZW5ndGggPT09IDIpIHtcbiAgICAgICAgY29uc3QgW2Vycm9yMSwgZXJyb3IyXSA9IGVycm9yc1xuICAgICAgICBpZiAoXG4gICAgICAgICAgZXJyb3IxLmtleXdvcmQgPT09ICd0eXBlJyAmJiBlcnJvcjEucGFyYW1zLnR5cGUgPT09ICdudWxsJyAmJlxuICAgICAgICAgIGVycm9yMi5rZXl3b3JkID09PSAnb25lT2YnXG4gICAgICAgICkge1xuICAgICAgICAgIGRlbGV0ZSBlcnJvckhhc2hbZGF0YVBhdGhdXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGVycm9ySGFzaFxuICB9XG5cbiAgcHJlZml4RGF0YVBhdGhzKGVycm9ycywgZGF0YVBhdGhQcmVmaXgpIHtcbiAgICByZXR1cm4gZXJyb3JzLm1hcChlcnJvciA9PiAoe1xuICAgICAgLi4uZXJyb3IsXG4gICAgICBkYXRhUGF0aDogZXJyb3IuZGF0YVBhdGhcbiAgICAgICAgPyBgJHtkYXRhUGF0aFByZWZpeH0ke2Vycm9yLmRhdGFQYXRofWBcbiAgICAgICAgOiBkYXRhUGF0aFByZWZpeFxuICAgIH0pKVxuICB9XG5cbiAgLy8gQG92ZXJyaWRlXG4gIGJlZm9yZVZhbGlkYXRlKHsganNvbiwgbW9kZWwsIGN0eCwgb3B0aW9ucyB9KSB7XG4gICAgLy8gQWRkIHZhbGlkYXRvciBpbnN0YW5jZSwgYXBwIGFuZCBvcHRpb25zIHRvIGNvbnRleHRcbiAgICBjdHgudmFsaWRhdG9yID0gdGhpc1xuICAgIGN0eC5hcHAgPSB0aGlzLmFwcFxuICAgIGN0eC5vcHRpb25zID0gb3B0aW9uc1xuICAgIGN0eC5qc29uU2NoZW1hID0gbW9kZWwuY29uc3RydWN0b3IuZ2V0SnNvblNjaGVtYSgpXG4gICAgY29uc3QgeyAkYmVmb3JlVmFsaWRhdGUgfSA9IG1vZGVsXG4gICAgaWYgKCRiZWZvcmVWYWxpZGF0ZSAhPT0gb2JqZWN0aW9uLk1vZGVsLnByb3RvdHlwZS4kYmVmb3JlVmFsaWRhdGUpIHtcbiAgICAgIC8vIFRPRE86IENvbnNpZGVyIGFkZGluZyBob29rcyBmb3IgJ2JlZm9yZTp2YWxpZGF0ZScgYW5kICdhZnRlcjp2YWxpZGF0ZScsXG4gICAgICAvLyBhbmQgaWYgc28sIGRlY2lkZSB3aGF0IHRvIGRvIGFib3V0IG1vZGlmeWluZyAvIHJldHVybmluZyBqc29uLXNjaGVtYS5cbiAgICAgIC8vIFByb2JhYmx5IHdlIHNob3VsZG4ndCBhbGxvdyBpdCB0aGVyZS5cblxuICAgICAgLy8gT25seSBjbG9uZSBqc29uU2NoZW1hIGlmIHRoZSBoYW5kbGVyIGFjdHVhbGx5IHJlY2VpdmVzIGl0LlxuICAgICAgaWYgKCRiZWZvcmVWYWxpZGF0ZS5sZW5ndGggPiAwKSB7XG4gICAgICAgIGN0eC5qc29uU2NoZW1hID0gY2xvbmUoY3R4Lmpzb25TY2hlbWEpXG4gICAgICB9XG4gICAgICBjb25zdCByZXQgPSBtb2RlbC4kYmVmb3JlVmFsaWRhdGUoY3R4Lmpzb25TY2hlbWEsIGpzb24sIG9wdGlvbnMpXG4gICAgICBpZiAocmV0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgY3R4Lmpzb25TY2hlbWEgPSByZXRcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvLyBAb3ZlcnJpZGVcbiAgdmFsaWRhdGUoeyBqc29uLCBtb2RlbCwgY3R4LCBvcHRpb25zIH0pIHtcbiAgICBjb25zdCB7IGpzb25TY2hlbWEgfSA9IGN0eFxuICAgIGlmIChqc29uU2NoZW1hKSB7XG4gICAgICAvLyBXZSBuZWVkIHRvIGNsb25lIHRoZSBpbnB1dCBqc29uIGlmIHdlIGFyZSBhYm91dCB0byBzZXQgZGVmYXVsdCB2YWx1ZXMuXG4gICAgICBpZiAoXG4gICAgICAgICFvcHRpb25zLm11dGFibGUgJiZcbiAgICAgICAgIW9wdGlvbnMucGF0Y2ggJiZcbiAgICAgICAgaGFzRGVmYXVsdHMoanNvblNjaGVtYS5wcm9wZXJ0aWVzKVxuICAgICAgKSB7XG4gICAgICAgIGpzb24gPSBjbG9uZShqc29uKVxuICAgICAgfVxuICAgICAgLy8gR2V0IHRoZSByaWdodCBBanYgaW5zdGFuY2UgZm9yIHRoZSBnaXZlbiBwYXRjaCBhbmQgYXN5bmMgb3B0aW9uc1xuICAgICAgY29uc3QgdmFsaWRhdGUgPSB0aGlzLmdldEFqdihvcHRpb25zKS5nZXRTY2hlbWEoanNvblNjaGVtYS4kaWQpXG4gICAgICAvLyBVc2UgYGNhbGwoKWAgdG8gcGFzcyBjdHggYXMgY29udGV4dCB0byBBanYsIHNlZSBwYXNzQ29udGV4dDpcbiAgICAgIGNvbnN0IHJlcyA9IHZhbGlkYXRlLmNhbGwoY3R4LCBqc29uKVxuICAgICAgY29uc3QgaGFuZGxlRXJyb3JzID0gZXJyb3JzID0+IHtcbiAgICAgICAgaWYgKGVycm9ycykge1xuICAgICAgICAgIC8vIE5PVEU6IFRoZSBjb252ZXJzaW9uIGZyb20gQWp2IGVycm9ycyB0byBPYmplY3Rpb24gZXJyb3JzIGhhcHBlbiBpblxuICAgICAgICAgIC8vIE1vZGVsLmNyZWF0ZVZhbGlkYXRpb25FcnJvcigpLCB3aGljaCBjYWxscyBWYWxpZGF0b3IucGFyc2VFcnJvcigpXG4gICAgICAgICAgdGhyb3cgbW9kZWwuY29uc3RydWN0b3IuY3JlYXRlVmFsaWRhdGlvbkVycm9yKHtcbiAgICAgICAgICAgIHR5cGU6ICdNb2RlbFZhbGlkYXRpb24nLFxuICAgICAgICAgICAgZXJyb3JzLFxuICAgICAgICAgICAgb3B0aW9ucyxcbiAgICAgICAgICAgIGpzb25cbiAgICAgICAgICB9KVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICAvLyBIYW5kbGUgYm90aCBhc3luYyBhbmQgc3luYyB2YWxpZGF0aW9uIGhlcmU6XG4gICAgICBpZiAoaXNQcm9taXNlKHJlcykpIHtcbiAgICAgICAgcmV0dXJuIHJlc1xuICAgICAgICAgIC5jYXRjaChlcnJvciA9PiBoYW5kbGVFcnJvcnMoZXJyb3IuZXJyb3JzKSlcbiAgICAgICAgICAudGhlbigoKSA9PiBqc29uKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaGFuZGxlRXJyb3JzKHZhbGlkYXRlLmVycm9ycylcbiAgICAgICAgcmV0dXJuIGpzb25cbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gaGFzRGVmYXVsdHMob2JqKSB7XG4gIGlmIChpc0FycmF5KG9iaikpIHtcbiAgICBmb3IgKGNvbnN0IHZhbCBvZiBvYmopIHtcbiAgICAgIGlmICh2YWwgJiYgaGFzRGVmYXVsdHModmFsKSkge1xuICAgICAgICByZXR1cm4gdHJ1ZVxuICAgICAgfVxuICAgIH1cbiAgfSBlbHNlIGlmIChpc09iamVjdChvYmopKSB7XG4gICAgZm9yIChjb25zdCBba2V5LCB2YWxdIG9mIE9iamVjdC5lbnRyaWVzKG9iaikpIHtcbiAgICAgIGlmIChrZXkgPT09ICdkZWZhdWx0JyB8fCB2YWwgJiYgaGFzRGVmYXVsdHModmFsKSkge1xuICAgICAgICByZXR1cm4gdHJ1ZVxuICAgICAgfVxuICAgIH1cbiAgfVxuICByZXR1cm4gZmFsc2Vcbn1cblxuY29uc3QgZGVmYXVsdE9wdGlvbnMgPSB7XG4gIHN0cmljdDogZmFsc2UsXG4gIGFsbEVycm9yczogdHJ1ZSxcbiAgb3duUHJvcGVydGllczogdHJ1ZSxcbiAgcGFzc0NvbnRleHQ6IHRydWUsXG4gIHVzZURlZmF1bHRzOiB0cnVlLFxuICB2YWxpZGF0ZVNjaGVtYTogdHJ1ZVxufVxuXG4vLyBPcHRpb25zIHRoYXQgYXJlIGFsbG93ZWQgdG8gYmUgcGFzc2VkIG9uIHRvIHRoZSBjcmVhdGVkIEFqdiBpbnN0YW5jZXMsIHdpdGhcbi8vIHRoZWlyIGRlZmF1bHQgc2V0dGluZ3MgKHNvbWUgZGVmYXVsdHMgYXJlIGZyb20gQWp2LCBzb21lIGZyb20gZGVmYXVsdE9wdGlvbnMpXG5jb25zdCB2YWxpZGF0b3JPcHRpb25zID0ge1xuICAvLyBPdXIgZXh0ZW5zaW9uczpcbiAgYXN5bmM6IGZhbHNlLFxuICBwYXRjaDogZmFsc2UsXG4gIC8vIEFqdiBPcHRpb25zOlxuICAkZGF0YTogZmFsc2UsXG4gICRjb21tZW50OiBmYWxzZSxcbiAgY29lcmNlVHlwZXM6IGZhbHNlLFxuICBtdWx0aXBsZU9mUHJlY2lzaW9uOiBmYWxzZSxcbiAgb3duUHJvcGVydGllczogdHJ1ZSxcbiAgcmVtb3ZlQWRkaXRpb25hbDogZmFsc2UsXG4gIHVuaXF1ZUl0ZW1zOiB0cnVlLFxuICB1c2VEZWZhdWx0czogdHJ1ZSxcbiAgdmVyYm9zZTogZmFsc2Vcbn1cbiJdfQ==
|
package/lib/app/index.js
DELETED
|
@@ -1,26 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
|
|
3
|
-
require("core-js/modules/esnext.async-iterator.for-each.js");
|
|
4
|
-
|
|
5
|
-
require("core-js/modules/esnext.iterator.constructor.js");
|
|
6
|
-
|
|
7
|
-
require("core-js/modules/esnext.iterator.for-each.js");
|
|
8
|
-
|
|
9
|
-
exports.__esModule = true;
|
|
10
|
-
|
|
11
|
-
var _Application = require("./Application");
|
|
12
|
-
|
|
13
|
-
Object.keys(_Application).forEach(function (key) {
|
|
14
|
-
if (key === "default" || key === "__esModule") return;
|
|
15
|
-
if (key in exports && exports[key] === _Application[key]) return;
|
|
16
|
-
exports[key] = _Application[key];
|
|
17
|
-
});
|
|
18
|
-
|
|
19
|
-
var _Validator = require("./Validator");
|
|
20
|
-
|
|
21
|
-
Object.keys(_Validator).forEach(function (key) {
|
|
22
|
-
if (key === "default" || key === "__esModule") return;
|
|
23
|
-
if (key in exports && exports[key] === _Validator[key]) return;
|
|
24
|
-
exports[key] = _Validator[key];
|
|
25
|
-
});
|
|
26
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9hcHAvaW5kZXguanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7OztBQUFBOztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7O0FBQ0E7O0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCAqIGZyb20gJy4vQXBwbGljYXRpb24nXG5leHBvcnQgKiBmcm9tICcuL1ZhbGlkYXRvcidcbiJdfQ==
|
package/lib/cli/console.js
DELETED
|
@@ -1,175 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
|
|
3
|
-
exports.__esModule = true;
|
|
4
|
-
exports.default = startConsole;
|
|
5
|
-
|
|
6
|
-
require("core-js/modules/esnext.async-iterator.map.js");
|
|
7
|
-
|
|
8
|
-
require("core-js/modules/esnext.iterator.map.js");
|
|
9
|
-
|
|
10
|
-
require("core-js/modules/esnext.async-iterator.filter.js");
|
|
11
|
-
|
|
12
|
-
require("core-js/modules/esnext.iterator.constructor.js");
|
|
13
|
-
|
|
14
|
-
require("core-js/modules/esnext.iterator.filter.js");
|
|
15
|
-
|
|
16
|
-
var _repl = _interopRequireDefault(require("repl"));
|
|
17
|
-
|
|
18
|
-
var _path = _interopRequireDefault(require("path"));
|
|
19
|
-
|
|
20
|
-
var _fsExtra = _interopRequireDefault(require("fs-extra"));
|
|
21
|
-
|
|
22
|
-
var _picocolors = _interopRequireDefault(require("picocolors"));
|
|
23
|
-
|
|
24
|
-
var _objection = _interopRequireDefault(require("objection"));
|
|
25
|
-
|
|
26
|
-
var _utils = require("@ditojs/utils");
|
|
27
|
-
|
|
28
|
-
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
29
|
-
|
|
30
|
-
let started = false;
|
|
31
|
-
let server = null;
|
|
32
|
-
|
|
33
|
-
async function startConsole(app, config) {
|
|
34
|
-
config = {
|
|
35
|
-
quiet: false,
|
|
36
|
-
prompt: 'dito > ',
|
|
37
|
-
useColors: true,
|
|
38
|
-
ignoreUndefined: true,
|
|
39
|
-
...config
|
|
40
|
-
};
|
|
41
|
-
|
|
42
|
-
if (started) {
|
|
43
|
-
return server;
|
|
44
|
-
}
|
|
45
|
-
|
|
46
|
-
started = true;
|
|
47
|
-
server = _repl.default.start({ ...config,
|
|
48
|
-
prompt: ''
|
|
49
|
-
});
|
|
50
|
-
server.pause();
|
|
51
|
-
Object.assign(server.context, {
|
|
52
|
-
app,
|
|
53
|
-
objection: _objection.default,
|
|
54
|
-
...app.models
|
|
55
|
-
});
|
|
56
|
-
server.eval = wrapEval(server);
|
|
57
|
-
server.defineCommand('usage', {
|
|
58
|
-
help: 'Detailed Dito Console usage information',
|
|
59
|
-
|
|
60
|
-
action() {
|
|
61
|
-
displayUsage(app, config, true);
|
|
62
|
-
this.displayPrompt();
|
|
63
|
-
}
|
|
64
|
-
|
|
65
|
-
});
|
|
66
|
-
server.defineCommand('models', {
|
|
67
|
-
help: 'Display available Dito models',
|
|
68
|
-
|
|
69
|
-
action() {
|
|
70
|
-
console.info(Object.keys(app.models).join(', '));
|
|
71
|
-
this.displayPrompt();
|
|
72
|
-
}
|
|
73
|
-
|
|
74
|
-
});
|
|
75
|
-
|
|
76
|
-
const historyFile = _path.default.join(process.cwd(), '.console_history');
|
|
77
|
-
|
|
78
|
-
try {
|
|
79
|
-
await _fsExtra.default.stat(historyFile);
|
|
80
|
-
const lines = await _fsExtra.default.readFile(historyFile);
|
|
81
|
-
lines.toString().split('\n').reverse().slice(0, config.historySize).filter(line => line.trim()).map(line => server.history.push(line));
|
|
82
|
-
} catch (e) {
|
|
83
|
-
console.info((0, _utils.deindent)`
|
|
84
|
-
Unable to REPL history file at ${historyFile}.
|
|
85
|
-
A history file will be created on shutdown
|
|
86
|
-
`);
|
|
87
|
-
}
|
|
88
|
-
|
|
89
|
-
await app.start();
|
|
90
|
-
|
|
91
|
-
if (!config.quiet) {
|
|
92
|
-
displayUsage(app, config);
|
|
93
|
-
}
|
|
94
|
-
|
|
95
|
-
server.setPrompt(config.prompt);
|
|
96
|
-
server.resume();
|
|
97
|
-
server.write('', {
|
|
98
|
-
name: 'return'
|
|
99
|
-
});
|
|
100
|
-
return new Promise(resolve => {
|
|
101
|
-
server.once('exit', async () => {
|
|
102
|
-
try {
|
|
103
|
-
await app.stop();
|
|
104
|
-
} catch (err) {
|
|
105
|
-
logError(err);
|
|
106
|
-
}
|
|
107
|
-
|
|
108
|
-
try {
|
|
109
|
-
const lines = (server.history || []).reverse().filter(line => line.trim()).join('\n');
|
|
110
|
-
await _fsExtra.default.writeFile(historyFile, lines);
|
|
111
|
-
} catch (err) {
|
|
112
|
-
logError(err);
|
|
113
|
-
}
|
|
114
|
-
|
|
115
|
-
resolve(true);
|
|
116
|
-
});
|
|
117
|
-
});
|
|
118
|
-
}
|
|
119
|
-
|
|
120
|
-
function displayUsage(app, config, details) {
|
|
121
|
-
const modelHandleNames = Object.keys(app.models);
|
|
122
|
-
console.info((0, _utils.deindent)`
|
|
123
|
-
|
|
124
|
-
------------------------------------------------------------
|
|
125
|
-
Dito Console
|
|
126
|
-
|
|
127
|
-
Available references:
|
|
128
|
-
- Dito app: ${_picocolors.default.cyan('app')}
|
|
129
|
-
${modelHandleNames.length > 0 ? ` - Dito models: ${modelHandleNames.map(m => _picocolors.default.cyan(m)).join(', ')}` : ''}
|
|
130
|
-
`);
|
|
131
|
-
|
|
132
|
-
if (details) {
|
|
133
|
-
console.info((0, _utils.deindent)`
|
|
134
|
-
Examples:
|
|
135
|
-
|
|
136
|
-
${config.prompt} user = User.where({ lastName: 'Doe' }).first()
|
|
137
|
-
${config.prompt} user.$patch({ firstName: 'Joe' })
|
|
138
|
-
${config.prompt} user.$comments.insert({ ... })
|
|
139
|
-
`);
|
|
140
|
-
}
|
|
141
|
-
|
|
142
|
-
console.info('------------------------------------------------------------');
|
|
143
|
-
}
|
|
144
|
-
|
|
145
|
-
function wrapEval({
|
|
146
|
-
eval: defaultEval
|
|
147
|
-
}) {
|
|
148
|
-
return async function (code, context, file, cb) {
|
|
149
|
-
return defaultEval.call(this, code, context, file, async (err, result) => {
|
|
150
|
-
if (err || !(result && (0, _utils.isFunction)(result.then))) {
|
|
151
|
-
return cb(err, result);
|
|
152
|
-
}
|
|
153
|
-
|
|
154
|
-
try {
|
|
155
|
-
const resolved = await result;
|
|
156
|
-
|
|
157
|
-
for (const key in context) {
|
|
158
|
-
if (context[key] === result) {
|
|
159
|
-
context[key] = resolved;
|
|
160
|
-
}
|
|
161
|
-
}
|
|
162
|
-
|
|
163
|
-
cb(null, resolved);
|
|
164
|
-
} catch (error) {
|
|
165
|
-
logError(error);
|
|
166
|
-
cb();
|
|
167
|
-
}
|
|
168
|
-
});
|
|
169
|
-
};
|
|
170
|
-
}
|
|
171
|
-
|
|
172
|
-
function logError(error) {
|
|
173
|
-
console.info(`\x1b[31m${error}\x1b[0m`);
|
|
174
|
-
}
|
|
175
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9jbGkvY29uc29sZS5qcyJdLCJuYW1lcyI6WyJzdGFydGVkIiwic2VydmVyIiwic3RhcnRDb25zb2xlIiwiYXBwIiwiY29uZmlnIiwicXVpZXQiLCJwcm9tcHQiLCJ1c2VDb2xvcnMiLCJpZ25vcmVVbmRlZmluZWQiLCJyZXBsIiwic3RhcnQiLCJwYXVzZSIsIk9iamVjdCIsImFzc2lnbiIsImNvbnRleHQiLCJvYmplY3Rpb24iLCJtb2RlbHMiLCJldmFsIiwid3JhcEV2YWwiLCJkZWZpbmVDb21tYW5kIiwiaGVscCIsImFjdGlvbiIsImRpc3BsYXlVc2FnZSIsImRpc3BsYXlQcm9tcHQiLCJjb25zb2xlIiwiaW5mbyIsImtleXMiLCJqb2luIiwiaGlzdG9yeUZpbGUiLCJwYXRoIiwicHJvY2VzcyIsImN3ZCIsImZzIiwic3RhdCIsImxpbmVzIiwicmVhZEZpbGUiLCJ0b1N0cmluZyIsInNwbGl0IiwicmV2ZXJzZSIsInNsaWNlIiwiaGlzdG9yeVNpemUiLCJmaWx0ZXIiLCJsaW5lIiwidHJpbSIsIm1hcCIsImhpc3RvcnkiLCJwdXNoIiwiZSIsInNldFByb21wdCIsInJlc3VtZSIsIndyaXRlIiwibmFtZSIsIlByb21pc2UiLCJyZXNvbHZlIiwib25jZSIsInN0b3AiLCJlcnIiLCJsb2dFcnJvciIsIndyaXRlRmlsZSIsImRldGFpbHMiLCJtb2RlbEhhbmRsZU5hbWVzIiwicGljbyIsImN5YW4iLCJsZW5ndGgiLCJtIiwiZGVmYXVsdEV2YWwiLCJjb2RlIiwiZmlsZSIsImNiIiwiY2FsbCIsInJlc3VsdCIsInRoZW4iLCJyZXNvbHZlZCIsImtleSIsImVycm9yIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7QUFBQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7OztBQUVBLElBQUlBLE9BQU8sR0FBRyxLQUFkO0FBQ0EsSUFBSUMsTUFBTSxHQUFHLElBQWI7O0FBRWUsZUFBZUMsWUFBZixDQUE0QkMsR0FBNUIsRUFBaUND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LEVBQU9JLFFBQVAsQ0FBRjtBQUNELE9BVEQsQ0FTRSxPQUFPRSxLQUFQLEVBQWM7QUFDZGpCLFFBQUFBLFFBQVEsQ0FBQ2lCLEtBQUQsQ0FBUjtBQUNBTixRQUFBQSxFQUFFO0FBQ0g7QUFDRixLQWpCTSxDQUFQO0FBa0JELEdBbkJEO0FBb0JEOztBQUVELFNBQVNYLFFBQVQsQ0FBa0JpQixLQUFsQixFQUF5QjtBQUN2QmxELEVBQUFBLE9BQU8sQ0FBQ0MsSUFBUixDQUFjLFdBQVVpRCxLQUFNLFNBQTlCO0FBQ0QiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgcmVwbCBmcm9tICdyZXBsJ1xuaW1wb3J0IHBhdGggZnJvbSAncGF0aCdcbmltcG9ydCBmcyBmcm9tICdmcy1leHRyYSdcbmltcG9ydCBwaWNvIGZyb20gJ3BpY29jb2xvcnMnXG5pbXBvcnQgb2JqZWN0aW9uIGZyb20gJ29iamVjdGlvbidcbmltcG9ydCB7IGlzRnVuY3Rpb24sIGRlaW5kZW50IH0gZnJvbSAnQGRpdG9qcy91dGlscydcblxubGV0IHN0YXJ0ZWQgPSBmYWxzZVxubGV0IHNlcnZlciA9IG51bGxcblxuZXhwb3J0IGRlZmF1bHQgYXN5bmMgZnVuY3Rpb24gc3RhcnRDb25zb2xlKGFwcCwgY29uZmlnKSB7XG4gIGNvbmZpZyA9IHtcbiAgICBxdWlldDogZmFsc2UsXG4gICAgcHJvbXB0OiAnZGl0byA+ICcsXG4gICAgdXNlQ29sb3JzOiB0cnVlLFxuICAgIGlnbm9yZVVuZGVmaW5lZDogdHJ1ZSxcbiAgICAuLi5jb25maWdcbiAgfVxuXG4gIGlmIChzdGFydGVkKSB7XG4gICAgcmV0dXJuIHNlcnZlclxuICB9XG4gIHN0YXJ0ZWQgPSB0cnVlXG5cbiAgc2VydmVyID0gcmVwbC5zdGFydCh7IC4uLmNvbmZpZywgcHJvbXB0OiAnJyB9KVxuICBzZXJ2ZXIucGF1c2UoKVxuICBPYmplY3QuYXNzaWduKHNlcnZlci5jb250ZXh0LCB7XG4gICAgYXBwLFxuICAgIG9iamVjdGlvbixcbiAgICAuLi5hcHAubW9kZWxzXG4gIH0pXG4gIHNlcnZlci5ldmFsID0gd3JhcEV2YWwoc2VydmVyKVxuXG4gIHNlcnZlci5kZWZpbmVDb21tYW5kKCd1c2FnZScsIHtcbiAgICBoZWxwOiAnRGV0YWlsZWQgRGl0byBDb25zb2xlIHVzYWdlIGluZm9ybWF0aW9uJyxcbiAgICBhY3Rpb24oKSB7XG4gICAgICBkaXNwbGF5VXNhZ2UoYXBwLCBjb25maWcsIHRydWUpXG4gICAgICB0aGlzLmRpc3BsYXlQcm9tcHQoKVxuICAgIH1cbiAgfSlcblxuICBzZXJ2ZXIuZGVmaW5lQ29tbWFuZCgnbW9kZWxzJywge1xuICAgIGhlbHA6ICdEaXNwbGF5IGF2YWlsYWJsZSBEaXRvIG1vZGVscycsXG4gICAgYWN0aW9uKCkge1xuICAgICAgY29uc29sZS5pbmZvKE9iamVjdC5rZXlzKGFwcC5tb2RlbHMpLmpvaW4oJywgJykpXG4gICAgICB0aGlzLmRpc3BsYXlQcm9tcHQoKVxuICAgIH1cbiAgfSlcblxuICAvLyBTZXQgdXAgaGlzdG9yeSBmaWxlXG4gIGNvbnN0IGhpc3RvcnlGaWxlID0gcGF0aC5qb2luKHByb2Nlc3MuY3dkKCksICcuY29uc29sZV9oaXN0b3J5JylcbiAgdHJ5IHtcbiAgICBhd2FpdCBmcy5zdGF0KGhpc3RvcnlGaWxlKVxuICAgIGNvbnN0IGxpbmVzID0gYXdhaXQgZnMucmVhZEZpbGUoaGlzdG9yeUZpbGUpXG4gICAgbGluZXMudG9TdHJpbmcoKS5zcGxpdCgnXFxuJylcbiAgICAgIC5yZXZlcnNlKClcbiAgICAgIC5zbGljZSgwLCBjb25maWcuaGlzdG9yeVNpemUpXG4gICAgICAuZmlsdGVyKGxpbmUgPT4gbGluZS50cmltKCkpXG4gICAgICAubWFwKGxpbmUgPT4gc2VydmVyLmhpc3RvcnkucHVzaChsaW5lKSlcbiAgfSBjYXRjaCAoZSkge1xuICAgIGNvbnNvbGUuaW5mbyhkZWluZGVudGBcbiAgICAgIFVuYWJsZSB0byBSRVBMIGhpc3RvcnkgZmlsZSBhdCAke2hpc3RvcnlGaWxlfS5cbiAgICAgIEEgaGlzdG9yeSBmaWxlIHdpbGwgYmUgY3JlYXRlZCBvbiBzaHV0ZG93blxuICAgIGApXG4gIH1cblxuICBhd2FpdCBhcHAuc3RhcnQoKVxuICBpZiAoIWNvbmZpZy5xdWlldCkge1xuICAgIGRpc3BsYXlVc2FnZShhcHAsIGNvbmZpZylcbiAgfVxuICBzZXJ2ZXIuc2V0UHJvbXB0KGNvbmZpZy5wcm9tcHQpXG4gIHNlcnZlci5yZXN1bWUoKVxuICBzZXJ2ZXIud3JpdGUoJycsIHsgbmFtZTogJ3JldHVybicgfSlcbiAgcmV0dXJuIG5ldyBQcm9taXNlKHJlc29sdmUgPT4ge1xuICAgIHNlcnZlci5vbmNlKCdleGl0JywgYXN5bmMgKCkgPT4ge1xuICAgICAgdHJ5IHtcbiAgICAgICAgYXdhaXQgYXBwLnN0b3AoKVxuICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgIGxvZ0Vycm9yKGVycilcbiAgICAgIH1cbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IGxpbmVzID0gKHNlcnZlci5oaXN0b3J5IHx8IFtdKVxuICAgICAgICAgIC5yZXZlcnNlKClcbiAgICAgICAgICAuZmlsdGVyKGxpbmUgPT4gbGluZS50cmltKCkpXG4gICAgICAgICAgLmpvaW4oJ1xcbicpXG4gICAgICAgIGF3YWl0IGZzLndyaXRlRmlsZShoaXN0b3J5RmlsZSwgbGluZXMpXG4gICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgbG9nRXJyb3IoZXJyKVxuICAgICAgfVxuICAgICAgcmVzb2x2ZSh0cnVlKVxuICAgIH0pXG4gIH0pXG59XG5cbmZ1bmN0aW9uIGRpc3BsYXlVc2FnZShhcHAsIGNvbmZpZywgZGV0YWlscykge1xuICBjb25zdCBtb2RlbEhhbmRsZU5hbWVzID0gT2JqZWN0LmtleXMoYXBwLm1vZGVscylcbiAgY29uc29sZS5pbmZvKGRlaW5kZW50YFxuXG4gICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgRGl0byBDb25zb2xlXG5cbiAgICBBdmFpbGFibGUgcmVmZXJlbmNlczpcbiAgICAgLSBEaXRvIGFwcDogJHtwaWNvLmN5YW4oJ2FwcCcpfVxuICAgICR7XG4gICAgICBtb2RlbEhhbmRsZU5hbWVzLmxlbmd0aCA+IDBcbiAgICAgICAgPyBgIC0gRGl0byBtb2RlbHM6ICR7XG4gICAgICAgICAgbW9kZWxIYW5kbGVOYW1lcy5tYXAobSA9PiBwaWNvLmN5YW4obSkpLmpvaW4oJywgJylcbiAgICAgICAgfWBcbiAgICAgICAgOiAnJ1xuICAgIH1cbiAgYClcbiAgaWYgKGRldGFpbHMpIHtcbiAgICBjb25zb2xlLmluZm8oZGVpbmRlbnRgXG4gICAgICBFeGFtcGxlczpcblxuICAgICAgJHtjb25maWcucHJvbXB0fSB1c2VyID0gVXNlci53aGVyZSh7IGxhc3ROYW1lOiAnRG9lJyB9KS5maXJzdCgpXG4gICAgICAke2NvbmZpZy5wcm9tcHR9IHVzZXIuJHBhdGNoKHsgZmlyc3ROYW1lOiAnSm9lJyB9KVxuICAgICAgJHtjb25maWcucHJvbXB0fSB1c2VyLiRjb21tZW50cy5pbnNlcnQoeyAuLi4gfSlcbiAgICBgKVxuICB9XG4gIGNvbnNvbGUuaW5mbygnLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tJylcbn1cblxuLy8gV3JhcHMgdGhlIGRlZmF1bHQgZXZhbCB3aXRoIGEgaGFuZGxlciB0aGF0IHJlc29sdmVzIHByb21pc2VzXG5mdW5jdGlvbiB3cmFwRXZhbCh7IGV2YWw6IGRlZmF1bHRFdmFsIH0pIHtcbiAgcmV0dXJuIGFzeW5jIGZ1bmN0aW9uKGNvZGUsIGNvbnRleHQsIGZpbGUsIGNiKSB7XG4gICAgcmV0dXJuIGRlZmF1bHRFdmFsLmNhbGwodGhpcywgY29kZSwgY29udGV4dCwgZmlsZSwgYXN5bmMgKGVyciwgcmVzdWx0KSA9PiB7XG4gICAgICBpZiAoZXJyIHx8ICEocmVzdWx0ICYmIGlzRnVuY3Rpb24ocmVzdWx0LnRoZW4pKSkge1xuICAgICAgICByZXR1cm4gY2IoZXJyLCByZXN1bHQpXG4gICAgICB9XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCByZXNvbHZlZCA9IGF3YWl0IHJlc3VsdFxuICAgICAgICAvLyBSZXBsYWNlIGFueSBwcm9taXNlcyBpbiB0aGUgUkVQTCBjb250ZXh0IHdpdGggdGhlIHJlc29sdmVkIHByb21pc2UuXG4gICAgICAgIGZvciAoY29uc3Qga2V5IGluIGNvbnRleHQpIHtcbiAgICAgICAgICBpZiAoY29udGV4dFtrZXldID09PSByZXN1bHQpIHtcbiAgICAgICAgICAgIGNvbnRleHRba2V5XSA9IHJlc29sdmVkXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGNiKG51bGwsIHJlc29sdmVkKVxuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgbG9nRXJyb3IoZXJyb3IpXG4gICAgICAgIGNiKCkgLy8gQXBwbGljYXRpb24gZXJyb3JzIGFyZSBub3QgUkVQTCBlcnJvcnNcbiAgICAgIH1cbiAgICB9KVxuICB9XG59XG5cbmZ1bmN0aW9uIGxvZ0Vycm9yKGVycm9yKSB7XG4gIGNvbnNvbGUuaW5mbyhgXFx4MWJbMzFtJHtlcnJvcn1cXHgxYlswbWApXG59XG4iXX0=
|