@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.
Files changed (216) hide show
  1. package/package.json +25 -43
  2. package/src/app/Application.js +105 -111
  3. package/src/app/Validator.js +6 -3
  4. package/src/app/index.js +2 -2
  5. package/src/cli/db/createMigration.js +1 -1
  6. package/src/cli/db/index.js +7 -7
  7. package/src/cli/db/listAssetConfig.js +1 -1
  8. package/src/cli/db/reset.js +1 -1
  9. package/src/cli/index.js +14 -5
  10. package/src/controllers/AdminController.js +181 -158
  11. package/src/controllers/CollectionController.js +8 -29
  12. package/src/controllers/Controller.js +71 -76
  13. package/src/controllers/ControllerAction.js +39 -17
  14. package/src/controllers/MemberAction.js +2 -2
  15. package/src/controllers/ModelController.js +4 -4
  16. package/src/controllers/RelationController.js +3 -3
  17. package/src/controllers/{UserController.js → UsersController.js} +8 -13
  18. package/src/controllers/index.js +5 -5
  19. package/src/decorators/action.js +3 -3
  20. package/src/decorators/authorize.js +1 -1
  21. package/src/decorators/index.js +6 -6
  22. package/src/decorators/parameters.js +1 -1
  23. package/src/decorators/returns.js +1 -1
  24. package/src/decorators/scope.js +1 -1
  25. package/src/decorators/transacted.js +1 -1
  26. package/src/errors/AssetError.js +1 -1
  27. package/src/errors/AuthenticationError.js +1 -1
  28. package/src/errors/AuthorizationError.js +1 -1
  29. package/src/errors/ControllerError.js +1 -1
  30. package/src/errors/DatabaseError.js +12 -3
  31. package/src/errors/GraphError.js +1 -1
  32. package/src/errors/ModelError.js +1 -1
  33. package/src/errors/NotFoundError.js +1 -1
  34. package/src/errors/NotImplementedError.js +1 -1
  35. package/src/errors/QueryBuilderError.js +1 -1
  36. package/src/errors/RelationError.js +1 -1
  37. package/src/errors/ValidationError.js +1 -1
  38. package/src/errors/WrappedError.js +1 -1
  39. package/src/errors/index.js +14 -14
  40. package/src/graph/DitoGraphProcessor.js +2 -1
  41. package/src/graph/graph.js +1 -1
  42. package/src/graph/index.js +3 -3
  43. package/src/index.js +11 -9
  44. package/src/lib/index.js +2 -2
  45. package/src/middleware/createTransaction.js +1 -1
  46. package/src/middleware/findRoute.js +3 -2
  47. package/src/middleware/handleConnectMiddleware.js +88 -0
  48. package/src/middleware/handleError.js +1 -1
  49. package/src/middleware/handleRoute.js +3 -3
  50. package/src/middleware/index.js +8 -7
  51. package/src/mixins/AssetMixin.js +1 -1
  52. package/src/mixins/UserMixin.js +1 -1
  53. package/src/mixins/index.js +4 -4
  54. package/src/models/AssetModel.js +2 -2
  55. package/src/models/Model.js +16 -12
  56. package/src/models/RelationAccessor.js +1 -1
  57. package/src/models/SessionModel.js +2 -2
  58. package/src/models/TimeStampedModel.js +2 -2
  59. package/src/models/UserModel.js +2 -2
  60. package/src/models/definitions/assets.js +1 -1
  61. package/src/models/definitions/filters.js +57 -44
  62. package/src/models/definitions/hooks.js +1 -1
  63. package/src/models/definitions/index.js +9 -9
  64. package/src/models/definitions/modifiers.js +1 -1
  65. package/src/models/definitions/options.js +1 -1
  66. package/src/models/definitions/properties.js +2 -2
  67. package/src/models/definitions/relations.js +1 -1
  68. package/src/models/definitions/schema.js +1 -1
  69. package/src/models/definitions/scopes.js +2 -2
  70. package/src/models/index.js +5 -5
  71. package/src/query/QueryBuilder.js +5 -5
  72. package/src/query/QueryFilters.js +50 -50
  73. package/src/query/QueryParameters.js +2 -2
  74. package/src/query/index.js +3 -3
  75. package/src/schema/formats/index.js +2 -2
  76. package/src/schema/index.js +4 -4
  77. package/src/schema/keywords/_relate.js +1 -1
  78. package/src/schema/keywords/index.js +12 -12
  79. package/src/schema/properties.test.js +1 -1
  80. package/src/schema/relations.js +1 -1
  81. package/src/schema/relations.test.js +2 -2
  82. package/src/services/index.js +1 -1
  83. package/src/storage/DiskStorage.js +1 -1
  84. package/src/storage/S3Storage.js +4 -4
  85. package/src/storage/Storage.js +1 -1
  86. package/src/storage/index.js +4 -4
  87. package/src/utils/function.test.js +1 -1
  88. package/src/utils/handler.js +17 -0
  89. package/src/utils/index.js +8 -7
  90. package/src/utils/object.test.js +1 -1
  91. package/lib/app/Application.js +0 -961
  92. package/lib/app/SessionStore.js +0 -40
  93. package/lib/app/Validator.js +0 -355
  94. package/lib/app/index.js +0 -26
  95. package/lib/cli/console.js +0 -175
  96. package/lib/cli/db/createMigration.js +0 -237
  97. package/lib/cli/db/index.js +0 -66
  98. package/lib/cli/db/listAssetConfig.js +0 -16
  99. package/lib/cli/db/migrate.js +0 -15
  100. package/lib/cli/db/reset.js +0 -27
  101. package/lib/cli/db/rollback.js +0 -15
  102. package/lib/cli/db/seed.js +0 -104
  103. package/lib/cli/db/unlock.js +0 -15
  104. package/lib/cli/index.js +0 -90
  105. package/lib/controllers/AdminController.js +0 -258
  106. package/lib/controllers/CollectionController.js +0 -263
  107. package/lib/controllers/Controller.js +0 -462
  108. package/lib/controllers/ControllerAction.js +0 -276
  109. package/lib/controllers/MemberAction.js +0 -22
  110. package/lib/controllers/ModelController.js +0 -64
  111. package/lib/controllers/RelationController.js +0 -82
  112. package/lib/controllers/UserController.js +0 -98
  113. package/lib/controllers/index.js +0 -50
  114. package/lib/decorators/action.js +0 -14
  115. package/lib/decorators/authorize.js +0 -13
  116. package/lib/decorators/index.js +0 -58
  117. package/lib/decorators/parameters.js +0 -35
  118. package/lib/decorators/returns.js +0 -26
  119. package/lib/decorators/scope.js +0 -14
  120. package/lib/decorators/transacted.js +0 -12
  121. package/lib/errors/AssetError.js +0 -19
  122. package/lib/errors/AuthenticationError.js +0 -19
  123. package/lib/errors/AuthorizationError.js +0 -19
  124. package/lib/errors/ControllerError.js +0 -24
  125. package/lib/errors/DatabaseError.js +0 -27
  126. package/lib/errors/GraphError.js +0 -19
  127. package/lib/errors/ModelError.js +0 -24
  128. package/lib/errors/NotFoundError.js +0 -19
  129. package/lib/errors/NotImplementedError.js +0 -19
  130. package/lib/errors/QueryBuilderError.js +0 -19
  131. package/lib/errors/RelationError.js +0 -36
  132. package/lib/errors/ResponseError.js +0 -46
  133. package/lib/errors/ValidationError.js +0 -19
  134. package/lib/errors/WrappedError.js +0 -24
  135. package/lib/errors/index.js +0 -122
  136. package/lib/graph/DitoGraphProcessor.js +0 -185
  137. package/lib/graph/expression.js +0 -76
  138. package/lib/graph/graph.js +0 -300
  139. package/lib/graph/index.js +0 -34
  140. package/lib/index.js +0 -82
  141. package/lib/lib/EventEmitter.js +0 -76
  142. package/lib/lib/KnexHelper.js +0 -40
  143. package/lib/lib/index.js +0 -26
  144. package/lib/middleware/attachLogger.js +0 -16
  145. package/lib/middleware/createTransaction.js +0 -36
  146. package/lib/middleware/findRoute.js +0 -35
  147. package/lib/middleware/handleError.js +0 -26
  148. package/lib/middleware/handleRoute.js +0 -29
  149. package/lib/middleware/handleUser.js +0 -36
  150. package/lib/middleware/index.js +0 -66
  151. package/lib/middleware/logRequests.js +0 -122
  152. package/lib/mixins/AssetMixin.js +0 -81
  153. package/lib/mixins/SessionMixin.js +0 -22
  154. package/lib/mixins/TimeStampedMixin.js +0 -47
  155. package/lib/mixins/UserMixin.js +0 -151
  156. package/lib/mixins/index.js +0 -42
  157. package/lib/models/AssetModel.js +0 -12
  158. package/lib/models/Model.js +0 -953
  159. package/lib/models/RelationAccessor.js +0 -41
  160. package/lib/models/SessionModel.js +0 -12
  161. package/lib/models/TimeStampedModel.js +0 -12
  162. package/lib/models/UserModel.js +0 -12
  163. package/lib/models/definitions/assets.js +0 -11
  164. package/lib/models/definitions/filters.js +0 -101
  165. package/lib/models/definitions/hooks.js +0 -11
  166. package/lib/models/definitions/index.js +0 -38
  167. package/lib/models/definitions/modifiers.js +0 -11
  168. package/lib/models/definitions/options.js +0 -11
  169. package/lib/models/definitions/properties.js +0 -87
  170. package/lib/models/definitions/relations.js +0 -11
  171. package/lib/models/definitions/schema.js +0 -11
  172. package/lib/models/definitions/scopes.js +0 -51
  173. package/lib/models/index.js +0 -50
  174. package/lib/query/QueryBuilder.js +0 -745
  175. package/lib/query/QueryFilters.js +0 -82
  176. package/lib/query/QueryParameters.js +0 -77
  177. package/lib/query/Registry.js +0 -40
  178. package/lib/query/index.js +0 -34
  179. package/lib/schema/formats/_empty.js +0 -10
  180. package/lib/schema/formats/_required.js +0 -10
  181. package/lib/schema/formats/index.js +0 -26
  182. package/lib/schema/index.js +0 -49
  183. package/lib/schema/keywords/_computed.js +0 -11
  184. package/lib/schema/keywords/_foreign.js +0 -11
  185. package/lib/schema/keywords/_hidden.js +0 -11
  186. package/lib/schema/keywords/_index.js +0 -11
  187. package/lib/schema/keywords/_instanceof.js +0 -49
  188. package/lib/schema/keywords/_primary.js +0 -11
  189. package/lib/schema/keywords/_range.js +0 -26
  190. package/lib/schema/keywords/_relate.js +0 -19
  191. package/lib/schema/keywords/_specificType.js +0 -11
  192. package/lib/schema/keywords/_unique.js +0 -11
  193. package/lib/schema/keywords/_unsigned.js +0 -11
  194. package/lib/schema/keywords/_validate.js +0 -80
  195. package/lib/schema/keywords/index.js +0 -106
  196. package/lib/schema/properties.js +0 -227
  197. package/lib/schema/properties.test.js +0 -573
  198. package/lib/schema/relations.js +0 -274
  199. package/lib/schema/relations.test.js +0 -155
  200. package/lib/services/Service.js +0 -34
  201. package/lib/services/index.js +0 -18
  202. package/lib/storage/AssetFile.js +0 -97
  203. package/lib/storage/DiskStorage.js +0 -125
  204. package/lib/storage/S3Storage.js +0 -171
  205. package/lib/storage/Storage.js +0 -209
  206. package/lib/storage/index.js +0 -34
  207. package/lib/utils/decorator.js +0 -16
  208. package/lib/utils/deprecate.js +0 -46
  209. package/lib/utils/emitter.js +0 -13
  210. package/lib/utils/function.js +0 -14
  211. package/lib/utils/function.test.js +0 -49
  212. package/lib/utils/index.js +0 -66
  213. package/lib/utils/json.js +0 -9
  214. package/lib/utils/object.js +0 -92
  215. package/lib/utils/object.test.js +0 -65
  216. 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