@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/cli/index.js
DELETED
|
@@ -1,90 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env babel-node
|
|
2
|
-
"use strict";
|
|
3
|
-
|
|
4
|
-
require("core-js/modules/esnext.weak-map.delete-all.js");
|
|
5
|
-
|
|
6
|
-
require("core-js/modules/esnext.weak-map.emplace.js");
|
|
7
|
-
|
|
8
|
-
exports.__esModule = true;
|
|
9
|
-
exports.default = void 0;
|
|
10
|
-
|
|
11
|
-
require("core-js/modules/es.error.cause.js");
|
|
12
|
-
|
|
13
|
-
var _path = _interopRequireDefault(require("path"));
|
|
14
|
-
|
|
15
|
-
var _picocolors = _interopRequireDefault(require("picocolors"));
|
|
16
|
-
|
|
17
|
-
var _knex = _interopRequireDefault(require("knex"));
|
|
18
|
-
|
|
19
|
-
var _utils = require("@ditojs/utils");
|
|
20
|
-
|
|
21
|
-
var db = _interopRequireWildcard(require("./db"));
|
|
22
|
-
|
|
23
|
-
var _console = _interopRequireDefault(require("./console"));
|
|
24
|
-
|
|
25
|
-
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
26
|
-
|
|
27
|
-
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); }
|
|
28
|
-
|
|
29
|
-
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; }
|
|
30
|
-
|
|
31
|
-
const commands = {
|
|
32
|
-
db,
|
|
33
|
-
console: _console.default
|
|
34
|
-
};
|
|
35
|
-
|
|
36
|
-
function getCommand(commands, parts) {
|
|
37
|
-
const part = parts.shift();
|
|
38
|
-
return commands && part ? getCommand(commands[(0, _utils.camelize)(part)], parts) : commands;
|
|
39
|
-
}
|
|
40
|
-
|
|
41
|
-
function setSilent(silent) {
|
|
42
|
-
const oldValue = process.env.DITO_SILENT;
|
|
43
|
-
process.env.DITO_SILENT = silent;
|
|
44
|
-
return oldValue;
|
|
45
|
-
}
|
|
46
|
-
|
|
47
|
-
async function execute() {
|
|
48
|
-
try {
|
|
49
|
-
const [,, command, importPath, ...args] = process.argv;
|
|
50
|
-
const execute = command && getCommand(commands, command.split(':'));
|
|
51
|
-
|
|
52
|
-
if (!(0, _utils.isFunction)(execute)) {
|
|
53
|
-
throw new Error(`Unknown command: ${command}`);
|
|
54
|
-
}
|
|
55
|
-
|
|
56
|
-
const silent = setSilent(true);
|
|
57
|
-
let arg;
|
|
58
|
-
|
|
59
|
-
try {
|
|
60
|
-
arg = (await Promise.resolve(`${_path.default.resolve(importPath)}`).then(s => _interopRequireWildcard(require(s)))).default;
|
|
61
|
-
} finally {
|
|
62
|
-
setSilent(silent);
|
|
63
|
-
}
|
|
64
|
-
|
|
65
|
-
if ((0, _utils.isFunction)(arg)) {
|
|
66
|
-
arg = await arg();
|
|
67
|
-
} else if ((0, _utils.isPlainObject)(arg) && arg.knex) {
|
|
68
|
-
arg = (0, _knex.default)(arg.knex);
|
|
69
|
-
}
|
|
70
|
-
|
|
71
|
-
const res = await execute(arg, ...args);
|
|
72
|
-
process.exit(res === true ? 0 : 1);
|
|
73
|
-
} catch (err) {
|
|
74
|
-
if (err instanceof Error) {
|
|
75
|
-
console.error(_picocolors.default.red(`${err.detail ? `${err.detail}\n` : ''}${err.stack}`));
|
|
76
|
-
} else {
|
|
77
|
-
console.error(_picocolors.default.red(err));
|
|
78
|
-
}
|
|
79
|
-
|
|
80
|
-
process.exit(1);
|
|
81
|
-
}
|
|
82
|
-
}
|
|
83
|
-
|
|
84
|
-
if (require.main === module) {
|
|
85
|
-
execute();
|
|
86
|
-
}
|
|
87
|
-
|
|
88
|
-
var _default = execute;
|
|
89
|
-
exports.default = _default;
|
|
90
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9jbGkvaW5kZXguanMiXSwibmFtZXMiOlsiY29tbWFuZHMiLCJkYiIsImNvbnNvbGUiLCJzdGFydENvbnNvbGUiLCJnZXRDb21tYW5kIiwicGFydHMiLCJwYXJ0Iiwic2hpZnQiLCJzZXRTaWxlbnQiLCJzaWxlbnQiLCJvbGRWYWx1ZSIsInByb2Nlc3MiLCJlbnYiLCJESVRPX1NJTEVOVCIsImV4ZWN1dGUiLCJjb21tYW5kIiwiaW1wb3J0UGF0aCIsImFyZ3MiLCJhcmd2Iiwic3BsaXQiLCJFcnJvciIsImFyZyIsInBhdGgiLCJyZXNvbHZlIiwiZGVmYXVsdCIsImtuZXgiLCJyZXMiLCJleGl0IiwiZXJyIiwiZXJyb3IiLCJwaWNvIiwicmVkIiwiZGV0YWlsIiwic3RhY2siLCJyZXF1aXJlIiwibWFpbiIsIm1vZHVsZSJdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7OztBQUVBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOzs7Ozs7OztBQUVBLE1BQU1BLFFBQVEsR0FBRztBQUFFQyxFQUFBQSxFQUFGO0FBQU1DLEVBQUFBLE9BQU8sRUFBRUM7QUFBZixDQUFqQjs7QUFFQSxTQUFTQyxVQUFULENBQW9CSixRQUFwQixFQUE4QkssS0FBOUIsRUFBcUM7QUFDbkMsUUFBTUMsSUFBSSxHQUFHRCxLQUFLLENBQUNFLEtBQU4sRUFBYjtBQUNBLFNBQU9QLFFBQVEsSUFBSU0sSUFBWixHQUNIRixVQUFVLENBQUNKLFFBQVEsQ0FBQyxxQkFBU00sSUFBVCxDQUFELENBQVQsRUFBMkJELEtBQTNCLENBRFAsR0FFSEwsUUFGSjtBQUdEOztBQUVELFNBQVNRLFNBQVQsQ0FBbUJDLE1BQW5CLEVBQTJCO0FBQ3pCLFFBQU1DLFFBQVEsR0FBR0MsT0FBTyxDQUFDQyxHQUFSLENBQVlDLFdBQTdCO0FBQ0FGLEVBQUFBLE9BQU8sQ0FBQ0MsR0FBUixDQUFZQyxXQUFaLEdBQTBCSixNQUExQjtBQUNBLFNBQU9DLFFBQVA7QUFDRDs7QUFFRCxlQUFlSSxPQUFmLEdBQXlCO0FBQ3ZCLE1BQUk7QUFFRixVQUFNLElBQUlDLE9BQUosRUFBYUMsVUFBYixFQUF5QixHQUFHQyxJQUE1QixJQUFvQ04sT0FBTyxDQUFDTyxJQUFsRDtBQUNBLFVBQU1KLE9BQU8sR0FBR0MsT0FBTyxJQUFJWCxVQUFVLENBQUNKLFFBQUQsRUFBV2UsT0FBTyxDQUFDSSxLQUFSLENBQWMsR0FBZCxDQUFYLENBQXJDOztBQUNBLFFBQUksQ0FBQyx1QkFBV0wsT0FBWCxDQUFMLEVBQTBCO0FBQ3hCLFlBQU0sSUFBSU0sS0FBSixDQUFXLG9CQUFtQkwsT0FBUSxFQUF0QyxDQUFOO0FBQ0Q7O0FBQ0QsVUFBTU4sTUFBTSxHQUFHRCxTQUFTLENBQUMsSUFBRCxDQUF4QjtBQUNBLFFBQUlhLEdBQUo7O0FBQ0EsUUFBSTtBQUNGQSxNQUFBQSxHQUFHLEdBQUcsQ0FBQyx5QkFBYUMsY0FBS0MsT0FBTCxDQUFhUCxVQUFiLENBQWIsa0RBQUQsRUFBeUNRLE9BQS9DO0FBQ0QsS0FGRCxTQUVVO0FBQ1JoQixNQUFBQSxTQUFTLENBQUNDLE1BQUQsQ0FBVDtBQUNEOztBQUNELFFBQUksdUJBQVdZLEdBQVgsQ0FBSixFQUFxQjtBQUNuQkEsTUFBQUEsR0FBRyxHQUFHLE1BQU1BLEdBQUcsRUFBZjtBQUNELEtBRkQsTUFFTyxJQUFJLDBCQUFjQSxHQUFkLEtBQXNCQSxHQUFHLENBQUNJLElBQTlCLEVBQW9DO0FBQ3pDSixNQUFBQSxHQUFHLEdBQUcsbUJBQUtBLEdBQUcsQ0FBQ0ksSUFBVCxDQUFOO0FBQ0Q7O0FBQ0QsVUFBTUMsR0FBRyxHQUFHLE1BQU1aLE9BQU8sQ0FBQ08sR0FBRCxFQUFNLEdBQUdKLElBQVQsQ0FBekI7QUFDQU4sSUFBQUEsT0FBTyxDQUFDZ0IsSUFBUixDQUFhRCxHQUFHLEtBQUssSUFBUixHQUFlLENBQWYsR0FBbUIsQ0FBaEM7QUFDRCxHQXJCRCxDQXFCRSxPQUFPRSxHQUFQLEVBQVk7QUFDWixRQUFJQSxHQUFHLFlBQVlSLEtBQW5CLEVBQTBCO0FBQ3hCbEIsTUFBQUEsT0FBTyxDQUFDMkIsS0FBUixDQUNFQyxvQkFBS0MsR0FBTCxDQUFVLEdBQUVILEdBQUcsQ0FBQ0ksTUFBSixHQUFjLEdBQUVKLEdBQUcsQ0FBQ0ksTUFBTyxJQUEzQixHQUFpQyxFQUFHLEdBQUVKLEdBQUcsQ0FBQ0ssS0FBTSxFQUE1RCxDQURGO0FBR0QsS0FKRCxNQUlPO0FBQ0wvQixNQUFBQSxPQUFPLENBQUMyQixLQUFSLENBQWNDLG9CQUFLQyxHQUFMLENBQVNILEdBQVQsQ0FBZDtBQUNEOztBQUNEakIsSUFBQUEsT0FBTyxDQUFDZ0IsSUFBUixDQUFhLENBQWI7QUFDRDtBQUNGOztBQUdELElBQUlPLE9BQU8sQ0FBQ0MsSUFBUixLQUFpQkMsTUFBckIsRUFBNkI7QUFDM0J0QixFQUFBQSxPQUFPO0FBQ1I7O2VBRWNBLE8iLCJzb3VyY2VzQ29udGVudCI6WyIjIS91c3IvYmluL2VudiBiYWJlbC1ub2RlXG5cbmltcG9ydCBwYXRoIGZyb20gJ3BhdGgnXG5pbXBvcnQgcGljbyBmcm9tICdwaWNvY29sb3JzJ1xuaW1wb3J0IEtuZXggZnJvbSAna25leCdcbmltcG9ydCB7IGlzUGxhaW5PYmplY3QsIGlzRnVuY3Rpb24sIGNhbWVsaXplIH0gZnJvbSAnQGRpdG9qcy91dGlscydcbmltcG9ydCAqIGFzIGRiIGZyb20gJy4vZGInXG5pbXBvcnQgc3RhcnRDb25zb2xlIGZyb20gJy4vY29uc29sZSdcblxuY29uc3QgY29tbWFuZHMgPSB7IGRiLCBjb25zb2xlOiBzdGFydENvbnNvbGUgfVxuXG5mdW5jdGlvbiBnZXRDb21tYW5kKGNvbW1hbmRzLCBwYXJ0cykge1xuICBjb25zdCBwYXJ0ID0gcGFydHMuc2hpZnQoKVxuICByZXR1cm4gY29tbWFuZHMgJiYgcGFydFxuICAgID8gZ2V0Q29tbWFuZChjb21tYW5kc1tjYW1lbGl6ZShwYXJ0KV0sIHBhcnRzKVxuICAgIDogY29tbWFuZHNcbn1cblxuZnVuY3Rpb24gc2V0U2lsZW50KHNpbGVudCkge1xuICBjb25zdCBvbGRWYWx1ZSA9IHByb2Nlc3MuZW52LkRJVE9fU0lMRU5UXG4gIHByb2Nlc3MuZW52LkRJVE9fU0lMRU5UID0gc2lsZW50XG4gIHJldHVybiBvbGRWYWx1ZVxufVxuXG5hc3luYyBmdW5jdGlvbiBleGVjdXRlKCkge1xuICB0cnkge1xuICAgIC8vIER5bmFtaWNhbGx5IGxvYWQgYXBwIG9yIGNvbmZpZyBmcm9tIHRoZSBwYXRoIHByb3ZpZGVkIHBhY2thZ2UuanNvbiBzY3JpcHRcbiAgICBjb25zdCBbLCwgY29tbWFuZCwgaW1wb3J0UGF0aCwgLi4uYXJnc10gPSBwcm9jZXNzLmFyZ3ZcbiAgICBjb25zdCBleGVjdXRlID0gY29tbWFuZCAmJiBnZXRDb21tYW5kKGNvbW1hbmRzLCBjb21tYW5kLnNwbGl0KCc6JykpXG4gICAgaWYgKCFpc0Z1bmN0aW9uKGV4ZWN1dGUpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYFVua25vd24gY29tbWFuZDogJHtjb21tYW5kfWApXG4gICAgfVxuICAgIGNvbnN0IHNpbGVudCA9IHNldFNpbGVudCh0cnVlKVxuICAgIGxldCBhcmdcbiAgICB0cnkge1xuICAgICAgYXJnID0gKGF3YWl0IGltcG9ydChwYXRoLnJlc29sdmUoaW1wb3J0UGF0aCkpKS5kZWZhdWx0XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIHNldFNpbGVudChzaWxlbnQpXG4gICAgfVxuICAgIGlmIChpc0Z1bmN0aW9uKGFyZykpIHtcbiAgICAgIGFyZyA9IGF3YWl0IGFyZygpXG4gICAgfSBlbHNlIGlmIChpc1BsYWluT2JqZWN0KGFyZykgJiYgYXJnLmtuZXgpIHtcbiAgICAgIGFyZyA9IEtuZXgoYXJnLmtuZXgpXG4gICAgfVxuICAgIGNvbnN0IHJlcyA9IGF3YWl0IGV4ZWN1dGUoYXJnLCAuLi5hcmdzKVxuICAgIHByb2Nlc3MuZXhpdChyZXMgPT09IHRydWUgPyAwIDogMSlcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgaWYgKGVyciBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgICBjb25zb2xlLmVycm9yKFxuICAgICAgICBwaWNvLnJlZChgJHtlcnIuZGV0YWlsID8gYCR7ZXJyLmRldGFpbH1cXG5gIDogJyd9JHtlcnIuc3RhY2t9YClcbiAgICAgIClcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc29sZS5lcnJvcihwaWNvLnJlZChlcnIpKVxuICAgIH1cbiAgICBwcm9jZXNzLmV4aXQoMSlcbiAgfVxufVxuXG4vLyBTdGFydCB0aGUgY29uc29sZSBpZiBgbm9kZSAuL2xpYi9jbGkvaW5kZXguanNgXG5pZiAocmVxdWlyZS5tYWluID09PSBtb2R1bGUpIHtcbiAgZXhlY3V0ZSgpXG59XG5cbmV4cG9ydCBkZWZhdWx0IGV4ZWN1dGVcbiJdfQ==
|
|
@@ -1,258 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
|
|
3
|
-
exports.__esModule = true;
|
|
4
|
-
exports.AdminController = void 0;
|
|
5
|
-
|
|
6
|
-
require("core-js/modules/esnext.async-iterator.some.js");
|
|
7
|
-
|
|
8
|
-
require("core-js/modules/esnext.iterator.constructor.js");
|
|
9
|
-
|
|
10
|
-
require("core-js/modules/esnext.iterator.some.js");
|
|
11
|
-
|
|
12
|
-
require("core-js/modules/esnext.async-iterator.map.js");
|
|
13
|
-
|
|
14
|
-
require("core-js/modules/esnext.iterator.map.js");
|
|
15
|
-
|
|
16
|
-
var _path = _interopRequireDefault(require("path"));
|
|
17
|
-
|
|
18
|
-
var _koa = _interopRequireDefault(require("koa"));
|
|
19
|
-
|
|
20
|
-
var _koaMount = _interopRequireDefault(require("koa-mount"));
|
|
21
|
-
|
|
22
|
-
var _koaStatic = _interopRequireDefault(require("koa-static"));
|
|
23
|
-
|
|
24
|
-
var _koaWebpack = _interopRequireDefault(require("koa-webpack"));
|
|
25
|
-
|
|
26
|
-
var _koaConnectHistoryApiFallback = _interopRequireDefault(require("koa-connect-history-api-fallback"));
|
|
27
|
-
|
|
28
|
-
var _cliService = _interopRequireDefault(require("@vue/cli-service"));
|
|
29
|
-
|
|
30
|
-
var _htmlWebpackTagsPlugin = _interopRequireDefault(require("html-webpack-tags-plugin"));
|
|
31
|
-
|
|
32
|
-
var _Controller = require("./Controller");
|
|
33
|
-
|
|
34
|
-
var _errors = require("../errors");
|
|
35
|
-
|
|
36
|
-
var _utils = require("../utils");
|
|
37
|
-
|
|
38
|
-
var _utils2 = require("@ditojs/utils");
|
|
39
|
-
|
|
40
|
-
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
41
|
-
|
|
42
|
-
class AdminController extends _Controller.Controller {
|
|
43
|
-
constructor(app, namespace) {
|
|
44
|
-
super(app, namespace);
|
|
45
|
-
this.config = { ...this.app.config.admin,
|
|
46
|
-
...this.config
|
|
47
|
-
};
|
|
48
|
-
this.mode = this.config.mode || (this.app.config.env === 'development' ? 'development' : 'production');
|
|
49
|
-
}
|
|
50
|
-
|
|
51
|
-
getPath(name) {
|
|
52
|
-
var _this$config$name;
|
|
53
|
-
|
|
54
|
-
const str = (_this$config$name = this.config[name]) == null ? void 0 : _this$config$name.path;
|
|
55
|
-
|
|
56
|
-
if (!str) {
|
|
57
|
-
throw new _errors.ControllerError(this, `Missing admin.${name}.path configuration.`);
|
|
58
|
-
}
|
|
59
|
-
|
|
60
|
-
return _path.default.resolve(str);
|
|
61
|
-
}
|
|
62
|
-
|
|
63
|
-
getDitoObject() {
|
|
64
|
-
const {
|
|
65
|
-
api = {},
|
|
66
|
-
settings = {}
|
|
67
|
-
} = this.config;
|
|
68
|
-
|
|
69
|
-
if (api.normalizePaths == null) {
|
|
70
|
-
api.normalizePaths = this.app.config.app.normalizePaths;
|
|
71
|
-
}
|
|
72
|
-
|
|
73
|
-
return {
|
|
74
|
-
base: this.url,
|
|
75
|
-
api,
|
|
76
|
-
settings
|
|
77
|
-
};
|
|
78
|
-
}
|
|
79
|
-
|
|
80
|
-
sendDitoObject(ctx) {
|
|
81
|
-
ctx.type = 'text/javascript';
|
|
82
|
-
ctx.body = `window.dito = ${(0, _utils.formatJson)(this.getDitoObject())}`;
|
|
83
|
-
}
|
|
84
|
-
|
|
85
|
-
middleware() {
|
|
86
|
-
const authorization = this.processAuthorize(this.authorize);
|
|
87
|
-
return async (ctx, next) => {
|
|
88
|
-
if (/^\/dito\b/.test(ctx.url)) {
|
|
89
|
-
return this.sendDitoObject(ctx);
|
|
90
|
-
} else if (/\/views\b/.test(ctx.url)) {
|
|
91
|
-
await this.handleAuthorization(authorization, ctx);
|
|
92
|
-
}
|
|
93
|
-
|
|
94
|
-
await next();
|
|
95
|
-
};
|
|
96
|
-
}
|
|
97
|
-
|
|
98
|
-
compose() {
|
|
99
|
-
this.koa = new _koa.default();
|
|
100
|
-
this.koa.use(this.middleware());
|
|
101
|
-
|
|
102
|
-
if (this.mode === 'development') {
|
|
103
|
-
if (this.getPath('build')) {
|
|
104
|
-
this.app.once('after:start', () => this.setupKoaWebpack());
|
|
105
|
-
}
|
|
106
|
-
} else {
|
|
107
|
-
this.koa.use(async (ctx, next) => {
|
|
108
|
-
if (!ctx.url.match(/^\/(app\.|css\/|js\/)/)) {
|
|
109
|
-
ctx.url = '/';
|
|
110
|
-
}
|
|
111
|
-
|
|
112
|
-
await next();
|
|
113
|
-
});
|
|
114
|
-
this.koa.use((0, _koaStatic.default)(this.getPath('dist')));
|
|
115
|
-
}
|
|
116
|
-
|
|
117
|
-
return (0, _koaMount.default)(this.url, this.koa);
|
|
118
|
-
}
|
|
119
|
-
|
|
120
|
-
async setupKoaWebpack() {
|
|
121
|
-
const stats = {
|
|
122
|
-
all: false,
|
|
123
|
-
errors: true,
|
|
124
|
-
errorDetails: true
|
|
125
|
-
};
|
|
126
|
-
const middleware = await (0, _koaWebpack.default)({
|
|
127
|
-
config: this.getWebpackConfig(),
|
|
128
|
-
devMiddleware: {
|
|
129
|
-
publicPath: '/',
|
|
130
|
-
stats
|
|
131
|
-
},
|
|
132
|
-
hotClient: this.config.hotReload !== false && {
|
|
133
|
-
logLevel: 'error',
|
|
134
|
-
stats
|
|
135
|
-
}
|
|
136
|
-
});
|
|
137
|
-
this.koa.use((0, _koaConnectHistoryApiFallback.default)());
|
|
138
|
-
this.koa.use(middleware);
|
|
139
|
-
}
|
|
140
|
-
|
|
141
|
-
getVueConfig() {
|
|
142
|
-
const development = this.mode === 'development';
|
|
143
|
-
const {
|
|
144
|
-
build = {},
|
|
145
|
-
devtool = development ? 'source-map' : false
|
|
146
|
-
} = this.config;
|
|
147
|
-
return {
|
|
148
|
-
runtimeCompiler: true,
|
|
149
|
-
publicPath: `${this.url}/`,
|
|
150
|
-
configureWebpack: {
|
|
151
|
-
devtool,
|
|
152
|
-
entry: [this.getPath('build')],
|
|
153
|
-
resolve: {
|
|
154
|
-
alias: {
|
|
155
|
-
'webpack-hot-client/client': require.resolve('webpack-hot-client/client')
|
|
156
|
-
}
|
|
157
|
-
},
|
|
158
|
-
output: {
|
|
159
|
-
filename: '[name].[hash].js'
|
|
160
|
-
},
|
|
161
|
-
optimization: {
|
|
162
|
-
splitChunks: {
|
|
163
|
-
cacheGroups: {
|
|
164
|
-
common: {
|
|
165
|
-
name: 'common',
|
|
166
|
-
test: /\/node_modules\//,
|
|
167
|
-
chunks: 'all'
|
|
168
|
-
},
|
|
169
|
-
views: {
|
|
170
|
-
name: 'views',
|
|
171
|
-
test: /\/views\//,
|
|
172
|
-
chunks: 'all'
|
|
173
|
-
}
|
|
174
|
-
}
|
|
175
|
-
}
|
|
176
|
-
},
|
|
177
|
-
module: development ? {
|
|
178
|
-
rules: [{
|
|
179
|
-
test: /\.(js|css)$/,
|
|
180
|
-
enforce: 'pre',
|
|
181
|
-
use: [require.resolve('source-map-loader')]
|
|
182
|
-
}]
|
|
183
|
-
} : {},
|
|
184
|
-
plugins: [new _htmlWebpackTagsPlugin.default({
|
|
185
|
-
scripts: ['dito.js'],
|
|
186
|
-
useHash: true,
|
|
187
|
-
addHash: (path, hash) => path.replace(/\.js$/, `.${hash}.js`),
|
|
188
|
-
append: false
|
|
189
|
-
})],
|
|
190
|
-
stats: {
|
|
191
|
-
warningsFilter: /Failed to parse source map/
|
|
192
|
-
}
|
|
193
|
-
},
|
|
194
|
-
chainWebpack: conf => {
|
|
195
|
-
const {
|
|
196
|
-
template = 'index.html'
|
|
197
|
-
} = build;
|
|
198
|
-
conf.plugin('html').tap(args => {
|
|
199
|
-
args[0].template = /^[./]/.test(template) ? _path.default.resolve(template) : _path.default.join(this.getPath('build'), template);
|
|
200
|
-
return args;
|
|
201
|
-
});
|
|
202
|
-
|
|
203
|
-
if (development) {
|
|
204
|
-
var _jsRule$toConfig$use;
|
|
205
|
-
|
|
206
|
-
const jsRule = conf.module.rule('js');
|
|
207
|
-
const hasBabel = (_jsRule$toConfig$use = jsRule.toConfig().use) == null ? void 0 : _jsRule$toConfig$use.some(({
|
|
208
|
-
loader
|
|
209
|
-
}) => /\bbabel-loader\b/.test(loader));
|
|
210
|
-
|
|
211
|
-
if (hasBabel) {
|
|
212
|
-
jsRule.use('babel-loader').options({
|
|
213
|
-
compact: false
|
|
214
|
-
});
|
|
215
|
-
}
|
|
216
|
-
|
|
217
|
-
conf.plugins.delete('friendly-errors');
|
|
218
|
-
}
|
|
219
|
-
}
|
|
220
|
-
};
|
|
221
|
-
}
|
|
222
|
-
|
|
223
|
-
getVuePlugins() {
|
|
224
|
-
var _this$config$plugins;
|
|
225
|
-
|
|
226
|
-
return (_this$config$plugins = this.config.plugins) == null ? void 0 : _this$config$plugins.map(definition => {
|
|
227
|
-
const plugin = (0, _utils2.isString)(definition) ? {
|
|
228
|
-
id: definition
|
|
229
|
-
} : (0, _utils2.isObject)(definition) ? definition : {};
|
|
230
|
-
const {
|
|
231
|
-
id,
|
|
232
|
-
apply = require(id)
|
|
233
|
-
} = plugin;
|
|
234
|
-
|
|
235
|
-
if (!id) {
|
|
236
|
-
throw new _errors.ControllerError(this, `Invalid plugin definition: ${definition}`);
|
|
237
|
-
}
|
|
238
|
-
|
|
239
|
-
return {
|
|
240
|
-
id,
|
|
241
|
-
apply
|
|
242
|
-
};
|
|
243
|
-
});
|
|
244
|
-
}
|
|
245
|
-
|
|
246
|
-
getWebpackConfig() {
|
|
247
|
-
const service = new _cliService.default(this.getPath('build'), {
|
|
248
|
-
inlineOptions: this.getVueConfig(),
|
|
249
|
-
plugins: this.getVuePlugins()
|
|
250
|
-
});
|
|
251
|
-
service.init(this.mode);
|
|
252
|
-
return service.resolveWebpackConfig();
|
|
253
|
-
}
|
|
254
|
-
|
|
255
|
-
}
|
|
256
|
-
|
|
257
|
-
exports.AdminController = AdminController;
|
|
258
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9jb250cm9sbGVycy9BZG1pbkNvbnRyb2xsZXIuanMiXSwibmFtZXMiOlsiQWRtaW5Db250cm9sbGVyIiwiQ29udHJvbGxlciIsImNvbnN0cnVjdG9yIiwiYXBwIiwibmFtZXNwYWNlIiwiY29uZmlnIiwiYWRtaW4iLCJtb2RlIiwiZW52IiwiZ2V0UGF0aCIsIm5hbWUiLCJzdHIiLCJwYXRoIiwiQ29udHJvbGxlckVycm9yIiwicmVzb2x2ZSIsImdldERpdG9PYmplY3QiLCJhcGkiLCJzZXR0aW5ncyIsIm5vcm1hbGl6ZVBhdGhzIiwiYmFzZSIsInVybCIsInNlbmREaXRvT2JqZWN0IiwiY3R4IiwidHlwZSIsImJvZHkiLCJtaWRkbGV3YXJlIiwiYXV0aG9yaXphdGlvbiIsInByb2Nlc3NBdXRob3JpemUiLCJhdXRob3JpemUiLCJuZXh0IiwidGVzdCIsImhhbmRsZUF1dGhvcml6YXRpb24iLCJjb21wb3NlIiwia29hIiwiS29hIiwidXNlIiwib25jZSIsInNldHVwS29hV2VicGFjayIsIm1hdGNoIiwic3RhdHMiLCJhbGwiLCJlcnJvcnMiLCJlcnJvckRldGFpbHMiLCJnZXRXZWJwYWNrQ29uZmlnIiwiZGV2TWlkZGxld2FyZSIsInB1YmxpY1BhdGgiLCJob3RDbGllbnQiLCJob3RSZWxvYWQiLCJsb2dMZXZlbCIsImdldFZ1ZUNvbmZpZyIsImRldmVsb3BtZW50IiwiYnVpbGQiLCJkZXZ0b29sIiwicnVudGltZUNvbXBpbGVyIiwiY29uZmlndXJlV2VicGFjayIsImVudHJ5IiwiYWxpYXMiLCJyZXF1aXJlIiwib3V0cHV0IiwiZmlsZW5hbWUiLCJvcHRpbWl6YXRpb24iLCJzcGxpdENodW5rcyIsImNhY2hlR3JvdXBzIiwiY29tbW9uIiwiY2h1bmtzIiwidmlld3MiLCJtb2R1bGUiLCJydWxlcyIsImVuZm9yY2UiLCJwbHVnaW5zIiwiSHRtbFdlYnBhY2tUYWdzUGx1Z2luIiwic2NyaXB0cyIsInVzZUhhc2giLCJhZGRIYXNoIiwiaGFzaCIsInJlcGxhY2UiLCJhcHBlbmQiLCJ3YXJuaW5nc0ZpbHRlciIsImNoYWluV2VicGFjayIsImNvbmYiLCJ0ZW1wbGF0ZSIsInBsdWdpbiIsInRhcCIsImFyZ3MiLCJqb2luIiwianNSdWxlIiwicnVsZSIsImhhc0JhYmVsIiwidG9Db25maWciLCJzb21lIiwibG9hZGVyIiwib3B0aW9ucyIsImNvbXBhY3QiLCJkZWxldGUiLCJnZXRWdWVQbHVnaW5zIiwibWFwIiwiZGVmaW5pdGlvbiIsImlkIiwiYXBwbHkiLCJzZXJ2aWNlIiwiVnVlU2VydmljZSIsImlubGluZU9wdGlvbnMiLCJpbml0IiwicmVzb2x2ZVdlYnBhY2tDb25maWciXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7OztBQUFBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOzs7O0FBRU8sTUFBTUEsZUFBTixTQUE4QkMsc0JBQTlCLENBQXlDO0FBRTlDQyxFQUFBQSxXQUFXLENBQUNDLEdBQUQsRUFBTUMsU0FBTixFQUFpQjtBQUMxQixVQUFNRCxHQUFOLEVBQVdDLFNBQVg7QUFHQSxTQUFLQyxNQUFMLEdBQWMsRUFDWixHQUFHLEtBQUtGLEdBQUwsQ0FBU0UsTUFBVCxDQUFnQkMsS0FEUDtBQUVaLFNBQUcsS0FBS0Q7QUFGSSxLQUFkO0FBT0EsU0FBS0UsSUFBTCxHQUFZLEtBQUtGLE1BQUwsQ0FBWUUsSUFBWixLQUNWLEtBQUtKLEdBQUwsQ0FBU0UsTUFBVCxDQUFnQkcsR0FBaEIsS0FBd0IsYUFBeEIsR0FBd0MsYUFBeEMsR0FBd0QsWUFEOUMsQ0FBWjtBQUdEOztBQUVEQyxFQUFBQSxPQUFPLENBQUNDLElBQUQsRUFBTztBQUFBOztBQUNaLFVBQU1DLEdBQUcsd0JBQUcsS0FBS04sTUFBTCxDQUFZSyxJQUFaLENBQUgscUJBQUcsa0JBQW1CRSxJQUEvQjs7QUFDQSxRQUFJLENBQUNELEdBQUwsRUFBVTtBQUNSLFlBQU0sSUFBSUUsdUJBQUosQ0FDSixJQURJ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Q0FBQ3dDLEVBQUQ7QUFGWCxVQUdGaEIsTUFISjs7QUFJQSxVQUFJLENBQUNnQixFQUFMLEVBQVM7QUFDUCxjQUFNLElBQUlwRix1QkFBSixDQUNKLElBREksRUFFSCw4QkFBNkJtRixVQUFXLEVBRnJDLENBQU47QUFJRDs7QUFDRCxhQUFPO0FBQUVDLFFBQUFBLEVBQUY7QUFBTUMsUUFBQUE7QUFBTixPQUFQO0FBQ0QsS0FqQk0sQ0FBUDtBQWtCRDs7QUFFRHZELEVBQUFBLGdCQUFnQixHQUFHO0FBQ2pCLFVBQU13RCxPQUFPLEdBQUcsSUFBSUMsbUJBQUosQ0FBZSxLQUFLM0YsT0FBTCxDQUFhLE9BQWIsQ0FBZixFQUFzQztBQUNwRDRGLE1BQUFBLGFBQWEsRUFBRSxLQUFLcEQsWUFBTCxFQURxQztBQUVwRG9CLE1BQUFBLE9BQU8sRUFBRSxLQUFLeUIsYUFBTDtBQUYyQyxLQUF0QyxDQUFoQjtBQUlBSyxJQUFBQSxPQUFPLENBQUNHLElBQVIsQ0FBYSxLQUFLL0YsSUFBbEI7QUFDQSxXQUFPNEYsT0FBTyxDQUFDSSxvQkFBUixFQUFQO0FBQ0Q7O0FBclA2QyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBwYXRoIGZyb20gJ3BhdGgnXG5pbXBvcnQgS29hIGZyb20gJ2tvYSdcbmltcG9ydCBtb3VudCBmcm9tICdrb2EtbW91bnQnXG5pbXBvcnQgc2VydmUgZnJvbSAna29hLXN0YXRpYydcbmltcG9ydCBrb2FXZWJwYWNrIGZyb20gJ2tvYS13ZWJwYWNrJ1xuaW1wb3J0IGhpc3RvcnlBcGlGYWxsYmFjayBmcm9tICdrb2EtY29ubmVjdC1oaXN0b3J5LWFwaS1mYWxsYmFjaydcbmltcG9ydCBWdWVTZXJ2aWNlIGZyb20gJ0B2dWUvY2xpLXNlcnZpY2UnXG5pbXBvcnQgSHRtbFdlYnBhY2tUYWdzUGx1Z2luIGZyb20gJ2h0bWwtd2VicGFjay10YWdzLXBsdWdpbidcbmltcG9ydCB7IENvbnRyb2xsZXIgfSBmcm9tICcuL0NvbnRyb2xsZXInXG5pbXBvcnQgeyBDb250cm9sbGVyRXJyb3IgfSBmcm9tICdAL2Vycm9ycydcbmltcG9ydCB7IGZvcm1hdEpzb24gfSBmcm9tICdAL3V0aWxzJ1xuaW1wb3J0IHsgaXNTdHJpbmcsIGlzT2JqZWN0IH0gZnJvbSAnQGRpdG9qcy91dGlscydcblxuZXhwb3J0IGNsYXNzIEFkbWluQ29udHJvbGxlciBleHRlbmRzIENvbnRyb2xsZXIge1xuICAvLyBAb3ZlcnJpZGVcbiAgY29uc3RydWN0b3IoYXBwLCBuYW1lc3BhY2UpIHtcbiAgICBzdXBlcihhcHAsIG5hbWVzcGFjZSlcbiAgICAvLyBNZXJnZSBgdGhpcy5hcHAuY29uZmlnLmFkbWluYCBpbnRvIGNvbmZpZyBhcyBkZWZhdWx0LCBidXQgYWxsb3cgb3ZlcnJpZGVzXG4gICAgLy8gb24gdGhlIGNvbnRyb2xsZXIgaXRzZWxmOlxuICAgIHRoaXMuY29uZmlnID0ge1xuICAgICAgLi4udGhpcy5hcHAuY29uZmlnLmFkbWluLFxuICAgICAgLi4udGhpcy5jb25maWdcbiAgICB9XG4gICAgLy8gSWYgbm8gbW9kZSBpcyBzcGVjaWZpZWQsIHVzZSBgcHJvZHVjdGlvbmAgc2luY2UgdGhhdCdzIGp1c3QgdGhlIGhvc3RpbmdcbiAgICAvLyBvZiB0aGUgcHJlLWJ1aWx0IGFkbWluIGZpbGVzLiBgZGV2ZWxvcG1lbnRgIHNlcnZlcyB0aGUgYWRtaW4gZGlyZWN0bHlcbiAgICAvLyBzb3VyY2VzIHdpdGggSFJNLCBhbmQgdGh1cyBzaG91bGQgYmUgZXhwbGljaXRlbHkgYWN0aXZhdGVkLlxuICAgIHRoaXMubW9kZSA9IHRoaXMuY29uZmlnLm1vZGUgfHwgKFxuICAgICAgdGhpcy5hcHAuY29uZmlnLmVudiA9PT0gJ2RldmVsb3BtZW50JyA/ICdkZXZlbG9wbWVudCcgOiAncHJvZHVjdGlvbidcbiAgICApXG4gIH1cblxuICBnZXRQYXRoKG5hbWUpIHtcbiAgICBjb25zdCBzdHIgPSB0aGlzLmNvbmZpZ1tuYW1lXT8ucGF0aFxuICAgIGlmICghc3RyKSB7XG4gICAgICB0aHJvdyBuZXcgQ29udHJvbGxlckVycm9yKFxuICAgICAgICB0aGlzLFxuICAgICAgICBgTWlzc2luZyBhZG1pbi4ke25hbWV9LnBhdGggY29uZmlndXJhdGlvbi5gXG4gICAgICApXG4gICAgfVxuICAgIHJldHVybiBwYXRoLnJlc29sdmUoc3RyKVxuICB9XG5cbiAgZ2V0RGl0b09iamVjdCgpIHtcbiAgICAvLyBFeHBvc2UgYXBpIGNvbmZpZyBhbmQgZGVmaW5pdGlvbnMgdG8gYnJvd3NlciBzaWRlOlxuICAgIC8vIFBhc3Mgb24gdGhlIGBjb25maWcuYXBwLm5vcm1hbGl6ZVBhdGhzYCBzZXR0aW5nIHRvIERpdG8uanMgQWRtaW46XG4gICAgY29uc3Qge1xuICAgICAgYXBpID0ge30sXG4gICAgICBzZXR0aW5ncyA9IHt9XG4gICAgfSA9IHRoaXMuY29uZmlnXG4gICAgaWYgKGFwaS5ub3JtYWxpemVQYXRocyA9PSBudWxsKSB7XG4gICAgICBhcGkubm9ybWFsaXplUGF0aHMgPSB0aGlzLmFwcC5jb25maWcuYXBwLm5vcm1hbGl6ZVBhdGhzXG4gICAgfVxuICAgIHJldHVybiB7XG4gICAgICBiYXNlOiB0aGlzLnVybCxcbiAgICAgIGFwaSxcbiAgICAgIHNldHRpbmdzXG4gICAgfVxuICB9XG5cbiAgc2VuZERpdG9PYmplY3QoY3R4KSB7XG4gICAgLy8gU2VuZCBiYWNrIHRoZSBnbG9iYWwgZGl0byBvYmplY3QgYXMgSmF2YVNjcmlwdCBjb2RlLlxuICAgIGN0eC50eXBlID0gJ3RleHQvamF2YXNjcmlwdCdcbiAgICBjdHguYm9keSA9IGB3aW5kb3cuZGl0byA9ICR7Zm9ybWF0SnNvbih0aGlzLmdldERpdG9PYmplY3QoKSl9YFxuICB9XG5cbiAgbWlkZGxld2FyZSgpIHtcbiAgICAvLyBTaGllbGQgYWRtaW4gdmlld3MgYWdhaW5zdCB1bmF1dGhvcml6ZWQgYWNjZXNzLlxuICAgIGNvbnN0IGF1dGhvcml6YXRpb24gPSB0aGlzLnByb2Nlc3NBdXRob3JpemUodGhpcy5hdXRob3JpemUpXG4gICAgcmV0dXJuIGFzeW5jIChjdHgsIG5leHQpID0+IHtcbiAgICAgIGlmICgvXlxcL2RpdG9cXGIvLnRlc3QoY3R4LnVybCkpIHtcbiAgICAgICAgLy8gUmV0dXJuIHdpdGhvdXQgY2FsbGluZyBgbmV4dCgpYFxuICAgICAgICByZXR1cm4gdGhpcy5zZW5kRGl0b09iamVjdChjdHgpXG4gICAgICB9IGVsc2UgaWYgKC9cXC92aWV3c1xcYi8udGVzdChjdHgudXJsKSkge1xuICAgICAgICBhd2FpdCB0aGlzLmhhbmRsZUF1dGhvcml6YXRpb24oYXV0aG9yaXphdGlvbiwgY3R4KVxuICAgICAgfVxuICAgICAgYXdhaXQgbmV4dCgpXG4gICAgfVxuICB9XG5cbiAgY29tcG9zZSgpIHtcbiAgICB0aGlzLmtvYSA9IG5ldyBLb2EoKVxuICAgIHRoaXMua29hLnVzZSh0aGlzLm1pZGRsZXdhcmUoKSlcbiAgICBpZiAodGhpcy5tb2RlID09PSAnZGV2ZWxvcG1lbnQnKSB7XG4gICAgICAvLyBDYWxsaW5nIGdldFBhdGgoKSB0aHJvd3MgZXhjZXB0aW9uIGlmIGFkbWluLmJ1aWxkLnBhdGggaXMgbm90IGRlZmluZWQ6XG4gICAgICBpZiAodGhpcy5nZXRQYXRoKCdidWlsZCcpKSB7XG4gICAgICAgIHRoaXMuYXBwLm9uY2UoJ2FmdGVyOnN0YXJ0JywgKCkgPT4gdGhpcy5zZXR1cEtvYVdlYnBhY2soKSlcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgLy8gU3RhdGljYWxseSBzZXJ2ZSB0aGUgcHJlLWJ1aWx0IGFkbWluIFNQQS4gQnV0IGluIG9yZGVyIGZvciB2dWUtcm91dGVyXG4gICAgICAvLyByb3V0ZXMgaW5zaWRlIHRoZSBTUEEgdG8gd29yaywgdXNlIGEgdGlueSByZXdyaXRpbmcgbWlkZGxld2FyZTpcbiAgICAgIHRoaXMua29hLnVzZShhc3luYyAoY3R4LCBuZXh0KSA9PiB7XG4gICAgICAgIC8vIC8vIEV4Y2x1ZGUgYXNzZXQgcmVxdWVzdHMgKGNzcywganMsIGFwcClcbiAgICAgICAgaWYgKCFjdHgudXJsLm1hdGNoKC9eXFwvKGFwcFxcLnxjc3NcXC98anNcXC8pLykpIHtcbiAgICAgICAgICBjdHgudXJsID0gJy8nXG4gICAgICAgIH1cbiAgICAgICAgYXdhaXQgbmV4dCgpXG4gICAgICB9KVxuICAgICAgdGhpcy5rb2EudXNlKHNlcnZlKHRoaXMuZ2V0UGF0aCgnZGlzdCcpKSlcbiAgICB9XG4gICAgcmV0dXJuIG1vdW50KHRoaXMudXJsLCB0aGlzLmtvYSlcbiAgfVxuXG4gIGFzeW5jIHNldHVwS29hV2VicGFjaygpIHtcbiAgICAvLyBodHRwczovL3dlYnBhY2suanMub3JnL2NvbmZpZ3VyYXRpb24vc3RhdHMvI3N0YXRzXG4gICAgY29uc3Qgc3RhdHMgPSB7XG4gICAgICBhbGw6IGZhbHNlLFxuICAgICAgZXJyb3JzOiB0cnVlLFxuICAgICAgZXJyb3JEZXRhaWxzOiB0cnVlXG4gICAgfVxuXG4gICAgY29uc3QgbWlkZGxld2FyZSA9IGF3YWl0IGtvYVdlYnBhY2soe1xuICAgICAgY29uZmlnOiB0aGlzLmdldFdlYnBhY2tDb25maWcoKSxcbiAgICAgIGRldk1pZGRsZXdhcmU6IHtcbiAgICAgICAgcHVibGljUGF0aDogJy8nLFxuICAgICAgICBzdGF0c1xuICAgICAgfSxcbiAgICAgIGhvdENsaWVudDogdGhpcy5jb25maWcuaG90UmVsb2FkICE9PSBmYWxzZSAmJiB7XG4gICAgICAgIC8vIFRoZSBvbmx5IHdheSB0byBub3QgbG9nIGBGYWlsZWQgdG8gcGFyc2Ugc291cmNlIG1hcGAgd2FybmluZ3MgaXNcbiAgICAgICAgLy8gc2FkbHkgdG8gaWdub3JlIGFsbCB3YXJuaW5nczpcbiAgICAgICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL3dlYnBhY2stY29udHJpYi93ZWJwYWNrLWhvdC1jbGllbnQvaXNzdWVzLzk0XG4gICAgICAgIGxvZ0xldmVsOiAnZXJyb3InLFxuICAgICAgICBzdGF0c1xuICAgICAgfVxuICAgIH0pXG4gICAgdGhpcy5rb2EudXNlKGhpc3RvcnlBcGlGYWxsYmFjaygpKVxuICAgIHRoaXMua29hLnVzZShtaWRkbGV3YXJlKVxuICB9XG5cbiAgZ2V0VnVlQ29uZmlnKCkge1xuICAgIGNvbnN0IGRldmVsb3BtZW50ID0gdGhpcy5tb2RlID09PSAnZGV2ZWxvcG1lbnQnXG4gICAgY29uc3Qge1xuICAgICAgYnVpbGQgPSB7fSxcbiAgICAgIGRldnRvb2wgPSBkZXZlbG9wbWVudCA/ICdzb3VyY2UtbWFwJyA6IGZhbHNlXG4gICAgfSA9IHRoaXMuY29uZmlnXG4gICAgcmV0dXJuIHtcbiAgICAgIHJ1bnRpbWVDb21waWxlcjogdHJ1ZSxcbiAgICAgIHB1YmxpY1BhdGg6IGAke3RoaXMudXJsfS9gLFxuICAgICAgY29uZmlndXJlV2VicGFjazoge1xuICAgICAgICBkZXZ0b29sLFxuICAgICAgICAvLyBXZSBhbHdheXMgbmVlZCB0aGUgc291cmNlIGJ1aWxkIHBhdGggYXMgZW50cnksIGV2ZW4gZm9yIHByb2R1Y3Rpb24sXG4gICAgICAgIC8vIGZvciB0aGluZ3MgbGlrZSAuYmFiZWxyYyB0byB3b3JrIHdoZW4gYnVpbGRpbmcgZm9yIGRpc3Q6XG4gICAgICAgIGVudHJ5OiBbdGhpcy5nZXRQYXRoKCdidWlsZCcpXSxcbiAgICAgICAgcmVzb2x2ZToge1xuICAgICAgICAgIGFsaWFzOiB7XG4gICAgICAgICAgICAvLyBTZWUgaHR0cHM6Ly9naXRodWIuY29tL3dlYnBhY2stY29udHJpYi93ZWJwYWNrLWhvdC1jbGllbnQvcHVsbC82MlxuICAgICAgICAgICAgJ3dlYnBhY2staG90LWNsaWVudC9jbGllbnQnOlxuICAgICAgICAgICAgICByZXF1aXJlLnJlc29sdmUoJ3dlYnBhY2staG90LWNsaWVudC9jbGllbnQnKVxuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgb3V0cHV0OiB7XG4gICAgICAgICAgZmlsZW5hbWU6ICdbbmFtZV0uW2hhc2hdLmpzJ1xuICAgICAgICB9LFxuICAgICAgICBvcHRpbWl6YXRpb246IHtcbiAgICAgICAgICBzcGxpdENodW5rczoge1xuICAgICAgICAgICAgLy8gU3BsaXQgZGVwZW5kZW5jaWVzIGludG8gdHdvIGNodW5rcywgb25lIGZvciBhbGwgY29tbW9uIGxpYnJhcmllcyxcbiAgICAgICAgICAgIC8vIGFuZCBvbmUgZm9yIGFsbCB2aWV3cywgc28gdGhleSBjYW4gYmUgbG9hZGVkIHNlcGFyYXRlbHksIGFuZCBvbmx5XG4gICAgICAgICAgICAvLyBvbmNlIGF1dGhlbnRpY2F0aW9uIHdhcyBzdWNjZXNzZnVsLlxuICAgICAgICAgICAgY2FjaGVHcm91cHM6IHtcbiAgICAgICAgICAgICAgY29tbW9uOiB7XG4gICAgICAgICAgICAgICAgbmFtZTogJ2NvbW1vbicsXG4gICAgICAgICAgICAgICAgdGVzdDogL1xcL25vZGVfbW9kdWxlc1xcLy8sXG4gICAgICAgICAgICAgICAgY2h1bmtzOiAnYWxsJ1xuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICB2aWV3czoge1xuICAgICAgICAgICAgICAgIG5hbWU6ICd2aWV3cycsXG4gICAgICAgICAgICAgICAgdGVzdDogL1xcL3ZpZXdzXFwvLyxcbiAgICAgICAgICAgICAgICBjaHVua3M6ICdhbGwnXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIG1vZHVsZTogZGV2ZWxvcG1lbnRcbiAgICAgICAgICAvLyBQcmVzZXJ2ZSBzb3VyY2UtbWFwcyBpbiB0aGlyZCBwYXJ0eSBkZXBlbmRlbmNpZXMsIGJ1dCBkbyBub3QgbG9nXG4gICAgICAgICAgLy8gd2FybmluZ3MgYWJvdXQgZGVwZW5kZW5jaWVzIHRoYXQgZG9uJ3QgY29tZSB3aXRoIHNvdXJjZS1tYXBzLlxuICAgICAgICAgIC8vIGh0dHBzOi8vd2VicGFjay5qcy5vcmcvbG9hZGVycy9zb3VyY2UtbWFwLWxvYWRlci8jaWdub3Jpbmctd2FybmluZ3NcbiAgICAgICAgICA/IHtcbiAgICAgICAgICAgIHJ1bGVzOiBbXG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICB0ZXN0OiAvXFwuKGpzfGNzcykkLyxcbiAgICAgICAgICAgICAgICBlbmZvcmNlOiAncHJlJyxcbiAgICAgICAgICAgICAgICAvLyBVc2UgYHJlcXVpcmUucmVzb2x2ZSgpYCBoZXJlIHRvbywgdG8gYXZvaWQgaXNzdWVzIHNpbWlsYXIgdG9cbiAgICAgICAgICAgICAgICAvLyAnd2VicGFjay1ob3QtY2xpZW50L2NsaWVudCcgYWJvdmUuXG4gICAgICAgICAgICAgICAgdXNlOiBbcmVxdWlyZS5yZXNvbHZlKCdzb3VyY2UtbWFwLWxvYWRlcicpXVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICBdXG4gICAgICAgICAgfVxuICAgICAgICAgIDoge30sXG4gICAgICAgIHBsdWdpbnM6IFtcbiAgICAgICAgICAvLyBVc2UgYEh0bWxXZWJwYWNrVGFnc1BsdWdpbmAgcGx1Z2luIHRvIGluamVjdCBhIHNjcmlwdCB0YWcgdGhhdFxuICAgICAgICAgIC8vIGxvYWQgdGhlIGRpdG8gb2JqZWN0IGZyb20gdGhlIGNvbnRyb2xsZXIsIGluY2x1ZGluZyBgZGl0by5zZXR0aW5nc2BcbiAgICAgICAgICBuZXcgSHRtbFdlYnBhY2tUYWdzUGx1Z2luKHtcbiAgICAgICAgICAgIHNjcmlwdHM6IFsnZGl0by5qcyddLFxuICAgICAgICAgICAgdXNlSGFzaDogdHJ1ZSxcbiAgICAgICAgICAgIGFkZEhhc2g6IChwYXRoLCBoYXNoKSA9PiBwYXRoLnJlcGxhY2UoL1xcLmpzJC8sIGAuJHtoYXNofS5qc2ApLFxuICAgICAgICAgICAgYXBwZW5kOiBmYWxzZVxuICAgICAgICAgIH0pXG4gICAgICAgIF0sXG4gICAgICAgIHN0YXRzOiB7XG4gICAgICAgICAgd2FybmluZ3NGaWx0ZXI6IC9GYWlsZWQgdG8gcGFyc2Ugc291cmNlIG1hcC9cbiAgICAgICAgfVxuICAgICAgfSxcblxuICAgICAgY2hhaW5XZWJwYWNrOiBjb25mID0+IHtcbiAgICAgICAgLy8gQ2hhbmdlIHRoZSBsb2NhdGlvbiBvZiB0aGUgSFRNTCB0ZW1wbGF0ZTpcbiAgICAgICAgY29uc3QgeyB0ZW1wbGF0ZSA9ICdpbmRleC5odG1sJyB9ID0gYnVpbGRcbiAgICAgICAgY29uZi5wbHVnaW4oJ2h0bWwnKS50YXAoYXJncyA9PiB7XG4gICAgICAgICAgYXJnc1swXS50ZW1wbGF0ZSA9IC9eWy4vXS8udGVzdCh0ZW1wbGF0ZSlcbiAgICAgICAgICAgID8gcGF0aC5yZXNvbHZlKHRlbXBsYXRlKVxuICAgICAgICAgICAgOiBwYXRoLmpvaW4odGhpcy5nZXRQYXRoKCdidWlsZCcpLCB0ZW1wbGF0ZSlcbiAgICAgICAgICByZXR1cm4gYXJnc1xuICAgICAgICB9KVxuICAgICAgICBpZiAoZGV2ZWxvcG1lbnQpIHtcbiAgICAgICAgICAvLyBEaXNhYmxlIHRoZSAnY29tcGFjdCcgb3B0aW9uIGluIGJhYmVsLWxvYWRlciBkdXJpbmcgZGV2ZWxvcG1lbnQgdG9cbiAgICAgICAgICAvLyBwcmV2ZW50IGNvbXBsYWludHMgd2hlbiB3b3JraW5nIHdpdGggdGhlIGB5YXJuIHdhdGNoYCB2ZXJzaW9ucyBvZlxuICAgICAgICAgIC8vIGRpdG8tYWRtaW4udW1kLm1pbi5qcyBhbmQgZGl0by11aS51bWQubWluLmpzXG4gICAgICAgICAgY29uc3QganNSdWxlID0gY29uZi5tb2R1bGUucnVsZSgnanMnKVxuICAgICAgICAgIGNvbnN0IGhhc0JhYmVsID0ganNSdWxlLnRvQ29uZmlnKCkudXNlPy5zb21lKFxuICAgICAgICAgICAgKHsgbG9hZGVyIH0pID0+IC9cXGJiYWJlbC1sb2FkZXJcXGIvLnRlc3QobG9hZGVyKVxuICAgICAgICAgIClcbiAgICAgICAgICBpZiAoaGFzQmFiZWwpIHtcbiAgICAgICAgICAgIGpzUnVsZS51c2UoJ2JhYmVsLWxvYWRlcicpLm9wdGlvbnMoeyBjb21wYWN0OiBmYWxzZSB9KVxuICAgICAgICAgIH1cbiAgICAgICAgICAvLyBNYWtlIGBzdGF0cy53YXJuaW5nc0ZpbHRlcmAgd29yaywgc2VlOlxuICAgICAgICAgIC8vIGh0dHBzOi8vZm9ydW0udnVlanMub3JnL3Qvc3BwcmVzcy13YXJuaW5ncy1pbi12dWUtY2xpLTMvNDU5MDUvNFxuICAgICAgICAgIGNvbmYucGx1Z2lucy5kZWxldGUoJ2ZyaWVuZGx5LWVycm9ycycpXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBnZXRWdWVQbHVnaW5zKCkge1xuICAgIHJldHVybiB0aGlzLmNvbmZpZy5wbHVnaW5zPy5tYXAoZGVmaW5pdGlvbiA9PiB7XG4gICAgICBjb25zdCBwbHVnaW4gPSBpc1N0cmluZyhkZWZpbml0aW9uKVxuICAgICAgICA/IHsgaWQ6IGRlZmluaXRpb24gfVxuICAgICAgICA6IGlzT2JqZWN0KGRlZmluaXRpb24pXG4gICAgICAgICAgPyBkZWZpbml0aW9uXG4gICAgICAgICAgOiB7fVxuICAgICAgY29uc3Qge1xuICAgICAgICBpZCxcbiAgICAgICAgYXBwbHkgPSByZXF1aXJlKGlkKVxuICAgICAgfSA9IHBsdWdpblxuICAgICAgaWYgKCFpZCkge1xuICAgICAgICB0aHJvdyBuZXcgQ29udHJvbGxlckVycm9yKFxuICAgICAgICAgIHRoaXMsXG4gICAgICAgICAgYEludmFsaWQgcGx1Z2luIGRlZmluaXRpb246ICR7ZGVmaW5pdGlvbn1gXG4gICAgICAgIClcbiAgICAgIH1cbiAgICAgIHJldHVybiB7IGlkLCBhcHBseSB9XG4gICAgfSlcbiAgfVxuXG4gIGdldFdlYnBhY2tDb25maWcoKSB7XG4gICAgY29uc3Qgc2VydmljZSA9IG5ldyBWdWVTZXJ2aWNlKHRoaXMuZ2V0UGF0aCgnYnVpbGQnKSwge1xuICAgICAgaW5saW5lT3B0aW9uczogdGhpcy5nZXRWdWVDb25maWcoKSxcbiAgICAgIHBsdWdpbnM6IHRoaXMuZ2V0VnVlUGx1Z2lucygpXG4gICAgfSlcbiAgICBzZXJ2aWNlLmluaXQodGhpcy5tb2RlKVxuICAgIHJldHVybiBzZXJ2aWNlLnJlc29sdmVXZWJwYWNrQ29uZmlnKClcbiAgfVxufVxuIl19
|