@stemy/backend 5.2.2 → 6.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 (139) hide show
  1. package/commands/clear-command.d.ts +6 -6
  2. package/commands/fixtures-command.d.ts +9 -9
  3. package/commands/index.d.ts +2 -2
  4. package/common-types.d.ts +325 -326
  5. package/esm2022/commands/clear-command.mjs +15 -0
  6. package/esm2022/commands/fixtures-command.mjs +26 -0
  7. package/esm2022/commands/index.mjs +7 -0
  8. package/esm2022/common-types.mjs +26 -0
  9. package/esm2022/fixtures/index.mjs +5 -0
  10. package/esm2022/fixtures/ttl.fixture.mjs +23 -0
  11. package/esm2022/public_api.mjs +378 -0
  12. package/esm2022/requests/asset-image-params.mjs +60 -0
  13. package/esm2022/rest-controllers/assets.controller.mjs +177 -0
  14. package/esm2022/rest-controllers/auth.controller.mjs +57 -0
  15. package/esm2022/rest-controllers/gallery.controller.mjs +27 -0
  16. package/esm2022/rest-controllers/progresses.controller.mjs +38 -0
  17. package/esm2022/rest-controllers/terminal-styles.mjs +67 -0
  18. package/esm2022/rest-controllers/terminal.controller.mjs +132 -0
  19. package/esm2022/rest-middlewares/container.middleware.mjs +22 -0
  20. package/esm2022/rest-middlewares/error-handler.middleware.mjs +79 -0
  21. package/esm2022/rest-middlewares/language.middleware.mjs +21 -0
  22. package/esm2022/rest-middlewares/request-ended.middleware.mjs +26 -0
  23. package/esm2022/rest-middlewares/request-started.middleware.mjs +25 -0
  24. package/esm2022/services/asset-processor.mjs +90 -0
  25. package/esm2022/services/asset-resolver.mjs +36 -0
  26. package/esm2022/services/assets.mjs +154 -0
  27. package/esm2022/services/backend-provider.mjs +83 -0
  28. package/esm2022/services/cache-processor.mjs +16 -0
  29. package/esm2022/services/cache.mjs +70 -0
  30. package/esm2022/services/configuration.mjs +68 -0
  31. package/esm2022/services/drivers/asset-grid.driver.mjs +27 -0
  32. package/esm2022/services/drivers/asset-local.driver.mjs +41 -0
  33. package/esm2022/services/endpoint-provider.mjs +13 -0
  34. package/esm2022/services/entities/asset.mjs +61 -0
  35. package/esm2022/services/entities/base-entity.mjs +32 -0
  36. package/esm2022/services/entities/lazy-asset.mjs +87 -0
  37. package/esm2022/services/entities/progress.mjs +182 -0
  38. package/esm2022/services/entities/temp-asset.mjs +53 -0
  39. package/esm2022/services/fixtures.mjs +38 -0
  40. package/esm2022/services/gallery-cache.mjs +29 -0
  41. package/esm2022/services/gallery-image.mjs +42 -0
  42. package/esm2022/services/gallery.mjs +124 -0
  43. package/esm2022/services/id-generator.mjs +49 -0
  44. package/esm2022/services/job-manager.mjs +198 -0
  45. package/esm2022/services/lazy-assets.mjs +68 -0
  46. package/esm2022/services/logger.mjs +26 -0
  47. package/esm2022/services/mail-sender.mjs +42 -0
  48. package/esm2022/services/memory-cache.mjs +61 -0
  49. package/esm2022/services/mongo-connector.mjs +36 -0
  50. package/esm2022/services/open-api.mjs +124 -0
  51. package/esm2022/services/progresses.mjs +93 -0
  52. package/esm2022/services/template-renderer.mjs +71 -0
  53. package/esm2022/services/terminal-manager.mjs +88 -0
  54. package/esm2022/services/token-generator.mjs +37 -0
  55. package/esm2022/services/translation-provider.mjs +39 -0
  56. package/esm2022/services/translator.mjs +67 -0
  57. package/esm2022/services/user-manager.mjs +27 -0
  58. package/esm2022/socket-controllers/progress.controller.mjs +63 -0
  59. package/esm2022/socket-controllers/terminal.controller.mjs +61 -0
  60. package/esm2022/socket-controllers/terminal.mjs +89 -0
  61. package/esm2022/socket-middlewares/compression.middleware.mjs +14 -0
  62. package/esm2022/static.mjs +23 -0
  63. package/esm2022/stemy-backend.mjs +5 -0
  64. package/esm2022/utilities/base-doc.mjs +33 -0
  65. package/esm2022/utilities/decorators.mjs +51 -0
  66. package/esm2022/utilities/di-container.mjs +88 -0
  67. package/esm2022/utilities/empty-job.mjs +13 -0
  68. package/esm2022/utilities/lazy-asset-generator.mjs +38 -0
  69. package/esm2022/utilities/mongoose.mjs +216 -0
  70. package/esm2022/utilities/tree.mjs +119 -0
  71. package/esm2022/utils.mjs +726 -0
  72. package/esm2022/validators.mjs +46 -0
  73. package/fesm2022/stemy-backend.mjs +4690 -0
  74. package/fesm2022/stemy-backend.mjs.map +1 -0
  75. package/fixtures/index.d.ts +2 -2
  76. package/fixtures/ttl.fixture.d.ts +7 -7
  77. package/index.d.ts +5 -5
  78. package/package.json +43 -49
  79. package/public_api.d.ts +44 -44
  80. package/requests/asset-image-params.d.ts +12 -12
  81. package/rest-controllers/assets.controller.d.ts +25 -27
  82. package/rest-controllers/auth.controller.d.ts +14 -14
  83. package/rest-controllers/gallery.controller.d.ts +6 -7
  84. package/rest-controllers/progresses.controller.d.ts +9 -9
  85. package/rest-controllers/terminal-styles.d.ts +2 -2
  86. package/rest-controllers/terminal.controller.d.ts +10 -10
  87. package/rest-middlewares/container.middleware.d.ts +8 -8
  88. package/rest-middlewares/error-handler.middleware.d.ts +13 -13
  89. package/rest-middlewares/language.middleware.d.ts +8 -8
  90. package/rest-middlewares/request-ended.middleware.d.ts +8 -8
  91. package/rest-middlewares/request-started.middleware.d.ts +8 -8
  92. package/services/asset-processor.d.ts +10 -11
  93. package/services/asset-resolver.d.ts +10 -10
  94. package/services/assets.d.ts +24 -26
  95. package/services/backend-provider.d.ts +19 -20
  96. package/services/cache-processor.d.ts +4 -4
  97. package/services/cache.d.ts +23 -23
  98. package/services/configuration.d.ts +15 -15
  99. package/services/drivers/asset-grid.driver.d.ts +11 -11
  100. package/services/drivers/asset-local.driver.d.ts +10 -11
  101. package/services/endpoint-provider.d.ts +4 -4
  102. package/services/entities/asset.d.ts +19 -21
  103. package/services/entities/base-entity.d.ts +13 -13
  104. package/services/entities/lazy-asset.d.ts +25 -25
  105. package/services/entities/progress.d.ts +49 -49
  106. package/services/entities/temp-asset.d.ts +20 -22
  107. package/services/fixtures.d.ts +8 -8
  108. package/services/gallery-cache.d.ts +8 -9
  109. package/services/gallery-image.d.ts +10 -11
  110. package/services/gallery.d.ts +13 -13
  111. package/services/id-generator.d.ts +11 -11
  112. package/services/job-manager.d.ts +35 -35
  113. package/services/lazy-assets.d.ts +22 -22
  114. package/services/logger.d.ts +8 -8
  115. package/services/mail-sender.d.ts +20 -20
  116. package/services/memory-cache.d.ts +10 -10
  117. package/services/mongo-connector.d.ts +12 -12
  118. package/services/open-api.d.ts +13 -13
  119. package/services/progresses.d.ts +20 -20
  120. package/services/template-renderer.d.ts +14 -14
  121. package/services/terminal-manager.d.ts +15 -15
  122. package/services/token-generator.d.ts +6 -6
  123. package/services/translation-provider.d.ts +9 -9
  124. package/services/translator.d.ts +15 -15
  125. package/services/user-manager.d.ts +6 -6
  126. package/socket-controllers/progress.controller.d.ts +10 -10
  127. package/socket-controllers/terminal.controller.d.ts +13 -13
  128. package/socket-controllers/terminal.d.ts +19 -20
  129. package/socket-middlewares/compression.middleware.d.ts +4 -4
  130. package/static.d.ts +2 -2
  131. package/utilities/base-doc.d.ts +40 -40
  132. package/utilities/decorators.d.ts +10 -10
  133. package/utilities/di-container.d.ts +43 -43
  134. package/utilities/empty-job.d.ts +4 -4
  135. package/utilities/lazy-asset-generator.d.ts +15 -15
  136. package/utilities/mongoose.d.ts +36 -36
  137. package/utilities/tree.d.ts +15 -15
  138. package/utils.d.ts +120 -123
  139. package/validators.d.ts +7 -7
@@ -0,0 +1,216 @@
1
+ import mongoose from "mongoose";
2
+ import { getValue as getMongoValue, setValue as setMongoValue } from "mongoose/lib/utils";
3
+ import { BadRequestError, createParamDecorator, HttpError } from "routing-controllers";
4
+ import { diContainers, isArray, isFunction, isObject, isString, valueToPromise } from "../utils";
5
+ const pluginsKey = "typegoose:plugins";
6
+ /**
7
+ * A mongoose/typegoose plugin to inject services from the main di container to a schema as virtuals
8
+ * @param schema
9
+ * @param services
10
+ */
11
+ export function injectServices(schema, services) {
12
+ const serviceMap = {};
13
+ if (!isObject(services)) {
14
+ throw new Error(`services object should be defined to inject services to schema!`);
15
+ }
16
+ Object.keys(services).forEach(prop => {
17
+ schema
18
+ .virtual(prop)
19
+ .get(() => {
20
+ const diContainer = diContainers.appContainer;
21
+ serviceMap[prop] = serviceMap[prop] || (!diContainer ? {} : diContainer.resolve(services[prop]));
22
+ return serviceMap[prop];
23
+ });
24
+ });
25
+ }
26
+ /**
27
+ * Decorates a property to inject a service with the help of the injectServices mongoose/typegoose plugin
28
+ * @param token optional InjectionToken to use
29
+ * @return PropertyDecorator
30
+ */
31
+ export function service(token) {
32
+ return (target, propertyKey) => {
33
+ const propertyType = Reflect.getOwnMetadata("design:type", target, propertyKey);
34
+ const plugins = Array.from(Reflect.getMetadata(pluginsKey, target.constructor) ?? []);
35
+ let plugin = plugins.find(t => t.mongoosePlugin === injectServices);
36
+ if (!plugin) {
37
+ plugin = { mongoosePlugin: injectServices, options: {} };
38
+ plugins.push(plugin);
39
+ }
40
+ plugin.options = Object.assign(plugin.options || {}, { [propertyKey]: token ?? propertyType });
41
+ Reflect.defineMetadata(pluginsKey, plugins, target.constructor);
42
+ };
43
+ }
44
+ /**
45
+ * Paginate using a typegoose model using a simple where query and pagination params
46
+ * @param model Typegoose model
47
+ * @param where Simple query to filter the results
48
+ * @param params Pagination params
49
+ */
50
+ export function paginate(model, where, params) {
51
+ return model.countDocuments(where).then(count => {
52
+ let query = model.find(where);
53
+ if (isString(params.sort)) {
54
+ query = query.sort(params.sort);
55
+ }
56
+ if (isArray(params.populate)) {
57
+ params.populate.forEach(field => {
58
+ query = query.populate(field);
59
+ });
60
+ }
61
+ return (params.limit > 0 ? query.skip(params.page * params.limit).limit(params.limit) : query).then(items => {
62
+ const meta = { total: count };
63
+ return { count, items, meta };
64
+ });
65
+ });
66
+ }
67
+ export function lookupStages(from, localField, as = null, foreignField = "_id", shouldUnwind = true) {
68
+ as = as || localField.replace("Id", "");
69
+ const stages = [
70
+ {
71
+ $lookup: {
72
+ from,
73
+ localField,
74
+ foreignField,
75
+ as
76
+ }
77
+ },
78
+ {
79
+ $unwind: {
80
+ path: `$${as}`,
81
+ preserveNullAndEmptyArrays: true
82
+ }
83
+ }
84
+ ];
85
+ if (!shouldUnwind) {
86
+ stages.splice(1, 1);
87
+ }
88
+ return stages;
89
+ }
90
+ export function letsLookupStage(from, pipeline, as = null, letFields = null) {
91
+ as = as || from;
92
+ letFields = letFields || { id: "$_id" };
93
+ return {
94
+ $lookup: {
95
+ from,
96
+ let: letFields,
97
+ pipeline,
98
+ as
99
+ }
100
+ };
101
+ }
102
+ export function matchStage(match) {
103
+ return { $match: match };
104
+ }
105
+ export function matchField(field, filter, when) {
106
+ return { field, filter, when };
107
+ }
108
+ export function matchFieldStages(...fields) {
109
+ const match = {};
110
+ fields.forEach(field => {
111
+ if (field.when) {
112
+ match[field.field] = field.filter;
113
+ }
114
+ });
115
+ return Object.keys(match).length > 0 ? [matchStage(match)] : [];
116
+ }
117
+ export function projectStage(fields) {
118
+ return { $project: fields };
119
+ }
120
+ export function unwindStage(fieldOrOpts) {
121
+ return { $unwind: fieldOrOpts };
122
+ }
123
+ export function hydratePopulated(modelType, json) {
124
+ let object = modelType.hydrate(json);
125
+ for (const [path, obj] of Object.entries(modelType.schema.obj)) {
126
+ let { ref, type } = obj;
127
+ if (Array.isArray(type) && type.length > 0) {
128
+ ref = type[0].ref;
129
+ }
130
+ if (!ref)
131
+ continue;
132
+ const value = getMongoValue(path, json);
133
+ const hydrateVal = val => {
134
+ if (val == null || val instanceof mongoose.Types.ObjectId)
135
+ return val;
136
+ return hydratePopulated(mongoose.model(ref), val);
137
+ };
138
+ if (Array.isArray(value)) {
139
+ setMongoValue(path, value.map(hydrateVal), object);
140
+ continue;
141
+ }
142
+ setMongoValue(path, hydrateVal(value), object);
143
+ }
144
+ return object;
145
+ }
146
+ export async function paginateAggregations(model, aggregations, params, metaProjection = {}) {
147
+ const sortField = !isString(params.sort) || !params.sort ? null : (params.sort.startsWith("-") ? params.sort.substr(1) : params.sort);
148
+ const sortAggregation = !sortField ? [] : [{
149
+ $sort: { [sortField]: sortField == params.sort ? 1 : -1 }
150
+ }];
151
+ const result = await model.aggregate([
152
+ ...aggregations,
153
+ ...sortAggregation,
154
+ {
155
+ $group: {
156
+ _id: "results",
157
+ result: { $push: "$$CURRENT" }
158
+ }
159
+ },
160
+ {
161
+ $project: {
162
+ _id: 0,
163
+ items: params.limit > 0 ? { $slice: ["$result", params.page * params.limit, params.limit] } : "$result",
164
+ count: { $size: "$result" },
165
+ meta: {
166
+ total: { $size: "$result" },
167
+ ...metaProjection
168
+ }
169
+ }
170
+ }
171
+ ]);
172
+ const pagination = result[0];
173
+ if (!pagination) {
174
+ return { items: [], count: 0, meta: { total: 0 } };
175
+ }
176
+ pagination.items = pagination.items.map(i => hydratePopulated(model, i));
177
+ return pagination;
178
+ }
179
+ export function ResolveEntity(model, extraCheck) {
180
+ const modelName = model.modelName;
181
+ const paramName = modelName.toLowerCase();
182
+ return createParamDecorator({
183
+ required: false,
184
+ value: async (action) => {
185
+ const req = action.request;
186
+ const token = req.header(`x-${paramName}-token`);
187
+ const id = req.params[`${paramName}Id`];
188
+ if (!id && !token) {
189
+ throw new BadRequestError(`${modelName} id or token should be defined!`);
190
+ }
191
+ const query = !token
192
+ ? model.findById(id)
193
+ : model.findOne({ token });
194
+ let doc = null;
195
+ if (isFunction(extraCheck)) {
196
+ try {
197
+ doc = await valueToPromise(extraCheck(query, action));
198
+ }
199
+ catch (e) {
200
+ throw new BadRequestError(`${modelName} check error: ${e.message || e}`);
201
+ }
202
+ }
203
+ else {
204
+ doc = await query;
205
+ }
206
+ if (!doc) {
207
+ throw new HttpError(404, !token
208
+ ? `${modelName} could not be found with id: ${id}`
209
+ : `${modelName} could not be found with token: ${token}`);
210
+ }
211
+ action.request[paramName] = doc;
212
+ return doc;
213
+ }
214
+ });
215
+ }
216
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibW9uZ29vc2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvdXRpbGl0aWVzL21vbmdvb3NlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUNBLE9BQU8sUUFBUSxNQUFNLFVBQVUsQ0FBQztBQUNoQyxPQUFPLEVBQUMsUUFBUSxJQUFJLGFBQWEsRUFBRSxRQUFRLElBQUksYUFBYSxFQUFDLE1BQU0sb0JBQW9CLENBQUM7QUFFeEYsT0FBTyxFQUFTLGVBQWUsRUFBRSxvQkFBb0IsRUFBRSxTQUFTLEVBQUMsTUFBTSxxQkFBcUIsQ0FBQztBQVk3RixPQUFPLEVBQUMsWUFBWSxFQUFFLE9BQU8sRUFBRSxVQUFVLEVBQUUsUUFBUSxFQUFFLFFBQVEsRUFBRSxjQUFjLEVBQUMsTUFBTSxVQUFVLENBQUM7QUFFL0YsTUFBTSxVQUFVLEdBQUcsbUJBQW1CLENBQUM7QUFPdkM7Ozs7R0FJRztBQUNILE1BQU0sVUFBVSxjQUFjLENBQUMsTUFBbUIsRUFBRSxRQUFrRDtJQUNsRyxNQUFNLFVBQVUsR0FBNEIsRUFBRSxDQUFDO0lBQy9DLElBQUksQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQztRQUN0QixNQUFNLElBQUksS0FBSyxDQUFDLGlFQUFpRSxDQUFDLENBQUE7SUFDdEYsQ0FBQztJQUNELE1BQU0sQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxFQUFFO1FBQ2pDLE1BQU07YUFDRCxPQUFPLENBQUMsSUFBSSxDQUFDO2FBQ2IsR0FBRyxDQUFDLEdBQUcsRUFBRTtZQUNOLE1BQU0sV0FBVyxHQUFHLFlBQVksQ0FBQyxZQUFZLENBQUM7WUFDOUMsVUFBVSxDQUFDLElBQUksQ0FBQyxHQUFHLFVBQVUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxPQUFPLENBQUMsUUFBUSxD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LEdBQUcsTUFBTSxjQUFjLENBQUMsVUFBVSxDQUFDLEtBQUssRUFBRSxNQUFNLENBQUMsQ0FBQyxDQUFDO2dCQUMxRCxDQUFDO2dCQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUM7b0JBQ1QsTUFBTSxJQUFJLGVBQWUsQ0FBQyxHQUFHLFNBQVMsaUJBQWlCLENBQUMsQ0FBQyxPQUFPLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQztnQkFDN0UsQ0FBQztZQUNMLENBQUM7aUJBQU0sQ0FBQztnQkFDSixHQUFHLEdBQUcsTUFBTSxLQUFLLENBQUM7WUFDdEIsQ0FBQztZQUNELElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQztnQkFDUCxNQUFNLElBQUksU0FBUyxDQUFDLEdBQUcsRUFBRSxDQUFDLEtBQUs7b0JBQzNCLENBQUMsQ0FBQyxHQUFHLFNBQVMsZ0NBQWdDLEVBQUUsRUFBRTtvQkFDbEQsQ0FBQyxDQUFDLEdBQUcsU0FBUyxtQ0FBbUMsS0FBSyxFQUFFLENBQUMsQ0FBQztZQUNsRSxDQUFDO1lBQ0QsTUFBTSxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsR0FBRyxHQUFHLENBQUM7WUFDaEMsT0FBTyxHQUFHLENBQUM7UUFDZixDQUFDO0tBQ0osQ0FBQyxDQUFDO0FBQ1AsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7RG9jdW1lbnQsIEZpbHRlclF1ZXJ5LCBNb2RlbCwgUGlwZWxpbmVTdGFnZSwgUXVlcnksIFNjaGVtYX0gZnJvbSBcIm1vbmdvb3NlXCI7XG5pbXBvcnQgbW9uZ29vc2UgZnJvbSBcIm1vbmdvb3NlXCI7XG5pbXBvcnQge2dldFZhbHVlIGFzIGdldE1vbmdvVmFsdWUsIHNldFZhbHVlIGFzIHNldE1vbmdvVmFsdWV9IGZyb20gXCJtb25nb29zZS9saWIvdXRpbHNcIjtcbmltcG9ydCB7RG9jdW1lbnRUeXBlLCBSZXR1cm5Nb2RlbFR5cGV9IGZyb20gXCJAdHlwZWdvb3NlL3R5cGVnb29zZVwiO1xuaW1wb3J0IHtBY3Rpb24sIEJhZFJlcXVlc3RFcnJvciwgY3JlYXRlUGFyYW1EZWNvcmF0b3IsIEh0dHBFcnJvcn0gZnJvbSBcInJvdXRpbmctY29udHJvbGxlcnNcIjtcbmltcG9ydCB7SW5qZWN0aW9uVG9rZW59IGZyb20gXCJ0c3lyaW5nZVwiO1xuaW1wb3J0IHtcbiAgICBJTWF0Y2hGaWVsZCxcbiAgICBJbmZlckdlbmVyaWMsXG4gICAgSVBhZ2luYXRpb25CYXNlLFxuICAgIElQYWdpbmF0aW9uUGFyYW1zLFxuICAgIElQcm9qZWN0T3B0aW9ucyxcbiAgICBJUmVxdWVzdCxcbiAgICBJVW53aW5kT3B0aW9ucyxcbiAgICBUeXBlXG59IGZyb20gXCIuLi9jb21tb24tdHlwZXNcIjtcbmltcG9ydCB7ZGlDb250YWluZXJzLCBpc0FycmF5LCBpc0Z1bmN0aW9uLCBpc09iamVjdCwgaXNTdHJpbmcsIHZhbHVlVG9Qcm9taXNlfSBmcm9tIFwiLi4vdXRpbHNcIjtcblxuY29uc3QgcGx1Z2luc0tleSA9IFwidHlwZWdvb3NlOnBsdWdpbnNcIjtcblxuaW50ZXJmYWNlIElQbHVnaW5XaXRoT3B0aW9ucyB7XG4gICAgbW9uZ29vc2VQbHVnaW46IEZ1bmN0aW9uO1xuICAgIG9wdGlvbnM6IGFueTtcbn1cblxuLyoqXG4gKiBBIG1vbmdvb3NlL3R5cGVnb29zZSBwbHVnaW4gdG8gaW5qZWN0IHNlcnZpY2VzIGZyb20gdGhlIG1haW4gZGkgY29udGFpbmVyIHRvIGEgc2NoZW1hIGFzIHZpcnR1YWxzXG4gKiBAcGFyYW0gc2NoZW1hXG4gKiBAcGFyYW0gc2VydmljZXNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGluamVjdFNlcnZpY2VzKHNjaGVtYTogU2NoZW1hPGFueT4sIHNlcnZpY2VzPzogeyBbcHJvcDogc3RyaW5nXTogSW5qZWN0aW9uVG9rZW48YW55PiB9KTogdm9pZCB7XG4gICAgY29uc3Qgc2VydmljZU1hcDogeyBbcHJvcDogc3RyaW5nXTogYW55IH0gPSB7fTtcbiAgICBpZiAoIWlzT2JqZWN0KHNlcnZpY2VzKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYHNlcnZpY2VzIG9iamVjdCBzaG91bGQgYmUgZGVmaW5lZCB0byBpbmplY3Qgc2VydmljZXMgdG8gc2NoZW1hIWApXG4gICAgfVxuICAgIE9iamVjdC5rZXlzKHNlcnZpY2VzKS5mb3JFYWNoKHByb3AgPT4ge1xuICAgICAgICBzY2hlbWFcbiAgICAgICAgICAgIC52aXJ0dWFsKHByb3ApXG4gICAgICAgICAgICAuZ2V0KCgpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBkaUNvbnRhaW5lciA9IGRpQ29udGFpbmVycy5hcHBDb250YWluZXI7XG4gICAgICAgICAgICAgICAgc2VydmljZU1hcFtwcm9wXSA9IHNlcnZpY2VNYXBbcHJvcF0gfHwgKCFkaUNvbnRhaW5lciA/IHt9IDogZGlDb250YWluZXIucmVzb2x2ZShzZXJ2aWNlc1twcm9wXSkpO1xuICAgICAgICAgICAgICAgIHJldHVybiBzZXJ2aWNlTWFwW3Byb3BdO1xuICAgICAgICAgICAgfSk7XG4gICAgfSk7XG59XG5cbi8qKlxuICogRGVjb3JhdGVzIGEgcHJvcGVydHkgdG8gaW5qZWN0IGEgc2VydmljZSB3aXRoIHRoZSBoZWxwIG9mIHRoZSBpbmplY3RTZXJ2aWNlcyBtb25nb29zZS90eXBlZ29vc2UgcGx1Z2luXG4gKiBAcGFyYW0gdG9rZW4gb3B0aW9uYWwgSW5qZWN0aW9uVG9rZW4gdG8gdXNlXG4gKiBAcmV0dXJuIFByb3BlcnR5RGVjb3JhdG9yXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzZXJ2aWNlKHRva2VuPzogSW5qZWN0aW9uVG9rZW48YW55Pik6IFByb3BlcnR5RGVjb3JhdG9yIHtcbiAgICByZXR1cm4gKHRhcmdldDogYW55LCBwcm9wZXJ0eUtleTogc3RyaW5nKTogdm9pZCA9PiB7XG4gICAgICAgIGNvbnN0IHByb3BlcnR5VHlwZSA9IFJlZmxlY3QuZ2V0T3duTWV0YWRhdGEoXCJkZXNpZ246dHlwZVwiLCB0YXJnZXQsIHByb3BlcnR5S2V5KTtcbiAgICAgICAgY29uc3QgcGx1Z2lucyA9IEFycmF5LmZyb20oUmVmbGVjdC5nZXRNZXRhZGF0YShwbHVnaW5zS2V5LCB0YXJnZXQuY29uc3RydWN0b3IpID8/IFtdKSBhcyBJUGx1Z2luV2l0aE9wdGlvbnNbXTtcbiAgICAgICAgbGV0IHBsdWdpbiA9IHBsdWdpbnMuZmluZCh0ID0+IHQubW9uZ29vc2VQbHVnaW4gPT09IGluamVjdFNlcnZpY2VzKTtcbiAgICAgICAgaWYgKCFwbHVnaW4pIHtcbiAgICAgICAgICAgIHBsdWdpbiA9IHsgbW9uZ29vc2VQbHVnaW46IGluamVjdFNlcnZpY2VzLCBvcHRpb25zOiB7fSB9O1xuICAgICAgICAgICAgcGx1Z2lucy5wdXNoKHBsdWdpbik7XG4gICAgICAgIH1cbiAgICAgICAgcGx1Z2luLm9wdGlvbnMgPSBPYmplY3QuYXNzaWduKHBsdWdpbi5vcHRpb25zIHx8IHt9LCB7W3Byb3BlcnR5S2V5XTogdG9rZW4gPz8gcHJvcGVydHlUeXBlfSk7XG4gICAgICAgIFJlZmxlY3QuZGVmaW5lTWV0YWRhdGEocGx1Z2luc0tleSwgcGx1Z2lucywgdGFyZ2V0LmNvbnN0cnVjdG9yKTtcbiAgICB9O1xufVxuXG4vKipcbiAqIFBhZ2luYXRlIHVzaW5nIGEgdHlwZWdvb3NlIG1vZGVsIHVzaW5nIGEgc2ltcGxlIHdoZXJlIHF1ZXJ5IGFuZCBwYWdpbmF0aW9uIHBhcmFtc1xuICogQHBhcmFtIG1vZGVsIFR5cGVnb29zZSBtb2RlbFxuICogQHBhcmFtIHdoZXJlIFNpbXBsZSBxdWVyeSB0byBmaWx0ZXIgdGhlIHJlc3VsdHNcbiAqIEBwYXJhbSBwYXJhbXMgUGFnaW5hdGlvbiBwYXJhbXNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHBhZ2luYXRlPFQgZXh0ZW5kcyBUeXBlPGFueT4sIFUgPSBJbmZlckdlbmVyaWM8VD4+KG1vZGVsOiBSZXR1cm5Nb2RlbFR5cGU8VD4sIHdoZXJlOiBGaWx0ZXJRdWVyeTxEb2N1bWVudFR5cGU8VT4+LCBwYXJhbXM6IElQYWdpbmF0aW9uUGFyYW1zKTogUHJvbWlzZTxJUGFnaW5hdGlvbkJhc2U8RG9jdW1lbnRUeXBlPFU+Pj4ge1xuICAgIHJldHVybiBtb2RlbC5jb3VudERvY3VtZW50cyh3aGVyZSkudGhlbihjb3VudCA9PiB7XG4gICAgICAgIGxldCBxdWVyeTogUXVlcnk8YW55LCBhbnk+ID0gbW9kZWwuZmluZCh3aGVyZSk7XG4gICAgICAgIGlmIChpc1N0cmluZyhwYXJhbXMuc29ydCkpIHtcbiAgICAgICAgICAgIHF1ZXJ5ID0gcXVlcnkuc29ydChwYXJhbXMuc29ydCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGlzQXJyYXkocGFyYW1zLnBvcHVsYXRlKSkge1xuICAgICAgICAgICAgcGFyYW1zLnBvcHVsYXRlLmZvckVhY2goZmllbGQgPT4ge1xuICAgICAgICAgICAgICAgIHF1ZXJ5ID0gcXVlcnkucG9wdWxhdGUoZmllbGQpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIChwYXJhbXMubGltaXQgPiAwID8gcXVlcnkuc2tpcChwYXJhbXMucGFnZSAqIHBhcmFtcy5saW1pdCkubGltaXQocGFyYW1zLmxpbWl0KSA6IHF1ZXJ5KS50aGVuKGl0ZW1zID0+IHtcbiAgICAgICAgICAgIGNvbnN0IG1ldGEgPSB7dG90YWw6IGNvdW50fTtcbiAgICAgICAgICAgIHJldHVybiB7Y291bnQsIGl0ZW1zLCBtZXRhfTtcbiAgICAgICAgfSk7XG4gICAgfSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBsb29rdXBTdGFnZXMoZnJvbTogc3RyaW5nLCBsb2NhbEZpZWxkOiBzdHJpbmcsIGFzOiBzdHJpbmcgPSBudWxsLCBmb3JlaWduRmllbGQ6IHN0cmluZyA9IFwiX2lkXCIsIHNob3VsZFVud2luZDogYm9vbGVhbiA9IHRydWUpOiBbUGlwZWxpbmVTdGFnZS5Mb29rdXAsIFBpcGVsaW5lU3RhZ2UuVW53aW5kXSB7XG4gICAgYXMgPSBhcyB8fCBsb2NhbEZpZWxkLnJlcGxhY2UoXCJJZFwiLCBcIlwiKTtcbiAgICBjb25zdCBzdGFnZXM6IFtQaXBlbGluZVN0YWdlLkxvb2t1cCwgUGlwZWxpbmVTdGFnZS5VbndpbmRdID0gW1xuICAgICAgICB7XG4gICAgICAgICAgICAkbG9va3VwOiB7XG4gICAgICAgICAgICAgICAgZnJvbSxcbiAgICAgICAgICAgICAgICBsb2NhbEZpZWxkLFxuICAgICAgICAgICAgICAgIGZvcmVpZ25GaWVsZCxcbiAgICAgICAgICAgICAgICBhc1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgICAkdW53aW5kOiB7XG4gICAgICAgICAgICAgICAgcGF0aDogYCQke2FzfWAsXG4gICAgICAgICAgICAgICAgcHJlc2VydmVOdWxsQW5kRW1wdHlBcnJheXM6IHRydWVcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIF07XG4gICAgaWYgKCFzaG91bGRVbndpbmQpIHtcbiAgICAgICAgc3RhZ2VzLnNwbGljZSgxLCAxKTtcbiAgICB9XG4gICAgcmV0dXJuIHN0YWdlcztcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGxldHNMb29rdXBTdGFnZShmcm9tOiBzdHJpbmcsIHBpcGVsaW5lOiBFeGNsdWRlPFBpcGVsaW5lU3RhZ2UsIFBpcGVsaW5lU3RhZ2UuTWVyZ2UgfCBQaXBlbGluZVN0YWdlLk91dCB8IFBpcGVsaW5lU3RhZ2UuU2VhcmNoPltdLCBhczogc3RyaW5nID0gbnVsbCwgbGV0RmllbGRzOiBhbnkgPSBudWxsKTogUGlwZWxpbmVTdGFnZS5Mb29rdXAge1xuICAgIGFzID0gYXMgfHwgZnJvbTtcbiAgICBsZXRGaWVsZHMgPSBsZXRGaWVsZHMgfHwge2lkOiBcIiRfaWRcIn07XG4gICAgcmV0dXJuIHtcbiAgICAgICAgJGxvb2t1cDoge1xuICAgICAgICAgICAgZnJvbSxcbiAgICAgICAgICAgIGxldDogbGV0RmllbGRzLFxuICAgICAgICAgICAgcGlwZWxpbmUsXG4gICAgICAgICAgICBhc1xuICAgICAgICB9XG4gICAgfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIG1hdGNoU3RhZ2UobWF0Y2g6IEZpbHRlclF1ZXJ5PGFueT4pOiBQaXBlbGluZVN0YWdlLk1hdGNoIHtcbiAgICByZXR1cm4geyRtYXRjaDogbWF0Y2h9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gbWF0Y2hGaWVsZChmaWVsZDogc3RyaW5nLCBmaWx0ZXI6IGFueSwgd2hlbjogYm9vbGVhbik6IElNYXRjaEZpZWxkIHtcbiAgICByZXR1cm4ge2ZpZWxkLCBmaWx0ZXIsIHdoZW59O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gbWF0Y2hGaWVsZFN0YWdlcyguLi5maWVsZHM6IElNYXRjaEZpZWxkW10pOiBSZWFkb25seUFycmF5PFBpcGVsaW5lU3RhZ2UuTWF0Y2g+IHtcbiAgICBjb25zdCBtYXRjaCA9IHt9O1xuICAgIGZpZWxkcy5mb3JFYWNoKGZpZWxkID0+IHtcbiAgICAgICAgaWYgKGZpZWxkLndoZW4pIHtcbiAgICAgICAgICAgIG1hdGNoW2ZpZWxkLmZpZWxkXSA9IGZpZWxkLmZpbHRlcjtcbiAgICAgICAgfVxuICAgIH0pO1xuICAgIHJldHVybiBPYmplY3Qua2V5cyhtYXRjaCkubGVuZ3RoID4gMCA/IFttYXRjaFN0YWdlKG1hdGNoKV0gOiBbXTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHByb2plY3RTdGFnZShmaWVsZHM6IElQcm9qZWN0T3B0aW9ucyk6IFBpcGVsaW5lU3RhZ2UuUHJvamVjdCB7XG4gICAgcmV0dXJuIHskcHJvamVjdDogZmllbGRzfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHVud2luZFN0YWdlKGZpZWxkT3JPcHRzOiBzdHJpbmcgfCBJVW53aW5kT3B0aW9ucyk6IFBpcGVsaW5lU3RhZ2UuVW53aW5kIHtcbiAgICByZXR1cm4geyR1bndpbmQ6IGZpZWxkT3JPcHRzfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGh5ZHJhdGVQb3B1bGF0ZWQ8VCBleHRlbmRzIERvY3VtZW50Pihtb2RlbFR5cGU6IE1vZGVsPFQ+LCBqc29uOiBhbnkpOiBUIHtcbiAgICBsZXQgb2JqZWN0ID0gbW9kZWxUeXBlLmh5ZHJhdGUoanNvbik7XG5cbiAgICBmb3IgKGNvbnN0IFtwYXRoLCBvYmpdIG9mIE9iamVjdC5lbnRyaWVzKG1vZGVsVHlwZS5zY2hlbWEub2JqKSkge1xuICAgICAgICBsZXQge3JlZiwgdHlwZX0gPSBvYmogYXMgYW55O1xuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheSh0eXBlKSAmJiB0eXBlLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIHJlZiA9IHR5cGVbMF0ucmVmO1xuICAgICAgICB9XG4gICAgICAgIGlmICghcmVmKSBjb250aW51ZTtcbiAgICAgICAgY29uc3QgdmFsdWUgPSBnZXRNb25nb1ZhbHVlKHBhdGgsIGpzb24pO1xuICAgICAgICBjb25zdCBoeWRyYXRlVmFsID0gdmFsID0+IHtcbiAgICAgICAgICAgIGlmICh2YWwgPT0gbnVsbCB8fCB2YWwgaW5zdGFuY2VvZiBtb25nb29zZS5UeXBlcy5PYmplY3RJZCkgcmV0dXJuIHZhbDtcbiAgICAgICAgICAgIHJldHVybiBoeWRyYXRlUG9wdWxhdGVkKG1vbmdvb3NlLm1vZGVsKHJlZikgYXMgYW55LCB2YWwpO1xuICAgICAgICB9O1xuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgICAgICAgIHNldE1vbmdvVmFsdWUocGF0aCwgdmFsdWUubWFwKGh5ZHJhdGVWYWwpLCBvYmplY3QpO1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgc2V0TW9uZ29WYWx1ZShwYXRoLCBoeWRyYXRlVmFsKHZhbHVlKSwgb2JqZWN0KTtcbiAgICB9XG5cbiAgICByZXR1cm4gb2JqZWN0O1xuXG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBwYWdpbmF0ZUFnZ3JlZ2F0aW9uczxUIGV4dGVuZHMgVHlwZTxhbnk+LCBVID0gSW5mZXJHZW5lcmljPFQ+Pihtb2RlbDogUmV0dXJuTW9kZWxUeXBlPFQ+LCBhZ2dyZWdhdGlvbnM6IFBpcGVsaW5lU3RhZ2VbXSwgcGFyYW1zOiBJUGFnaW5hdGlvblBhcmFtcywgbWV0YVByb2plY3Rpb246IGFueSA9IHt9KTogUHJvbWlzZTxJUGFnaW5hdGlvbkJhc2U8RG9jdW1lbnRUeXBlPFU+Pj4ge1xuICAgIGNvbnN0IHNvcnRGaWVsZCA9ICFpc1N0cmluZyhwYXJhbXMuc29ydCkgfHwgIXBhcmFtcy5zb3J0ID8gbnVsbCA6IChwYXJhbXMuc29ydC5zdGFydHNXaXRoKFwiLVwiKSA/IHBhcmFtcy5zb3J0LnN1YnN0cigxKSA6IHBhcmFtcy5zb3J0KTtcbiAgICBjb25zdCBzb3J0QWdncmVnYXRpb246IFBpcGVsaW5lU3RhZ2UuU29ydFtdID0gIXNvcnRGaWVsZCA/IFtdIDogW3tcbiAgICAgICAgJHNvcnQ6IHtbc29ydEZpZWxkXTogc29ydEZpZWxkID09IHBhcmFtcy5zb3J0ID8gMSA6IC0xfVxuICAgIH1dO1xuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IG1vZGVsLmFnZ3JlZ2F0ZShbXG4gICAgICAgIC4uLmFnZ3JlZ2F0aW9ucyxcbiAgICAgICAgLi4uc29ydEFnZ3JlZ2F0aW9uLFxuICAgICAgICB7XG4gICAgICAgICAgICAkZ3JvdXA6IHtcbiAgICAgICAgICAgICAgICBfaWQ6IFwicmVzdWx0c1wiLFxuICAgICAgICAgICAgICAgIHJlc3VsdDogeyRwdXNoOiBcIiQkQ1VSUkVOVFwifVxuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgICAkcHJvamVjdDoge1xuICAgICAgICAgICAgICAgIF9pZDogMCxcbiAgICAgICAgICAgICAgICBpdGVtczogcGFyYW1zLmxpbWl0ID4gMCA/IHskc2xpY2U6IFtcIiRyZXN1bHRcIiwgcGFyYW1zLnBhZ2UgKiBwYXJhbXMubGltaXQsIHBhcmFtcy5saW1pdF19IDogXCIkcmVzdWx0XCIsXG4gICAgICAgICAgICAgICAgY291bnQ6IHskc2l6ZTogXCIkcmVzdWx0XCJ9LFxuICAgICAgICAgICAgICAgIG1ldGE6IHtcbiAgICAgICAgICAgICAgICAgICAgdG90YWw6IHskc2l6ZTogXCIkcmVzdWx0XCJ9LFxuICAgICAgICAgICAgICAgICAgICAuLi5tZXRhUHJvamVjdGlvblxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIF0pO1xuICAgIGNvbnN0IHBhZ2luYXRpb24gPSByZXN1bHRbMF0gYXMgSVBhZ2luYXRpb25CYXNlPERvY3VtZW50VHlwZTxVPj47XG4gICAgaWYgKCFwYWdpbmF0aW9uKSB7XG4gICAgICAgIHJldHVybiB7aXRlbXM6IFtdLCBjb3VudDogMCwgbWV0YToge3RvdGFsOiAwfX07XG4gICAgfVxuICAgIHBhZ2luYXRpb24uaXRlbXMgPSBwYWdpbmF0aW9uLml0ZW1zLm1hcChpID0+IGh5ZHJhdGVQb3B1bGF0ZWQobW9kZWwsIGkpIGFzIGFueSk7XG4gICAgcmV0dXJuIHBhZ2luYXRpb247XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBSZXNvbHZlRW50aXR5PFQgZXh0ZW5kcyBUeXBlPGFueT4sIFUgPSBJbmZlckdlbmVyaWM8VD4+KG1vZGVsOiBSZXR1cm5Nb2RlbFR5cGU8VD4sIGV4dHJhQ2hlY2s/OiAocXVlcnk6IFF1ZXJ5PERvY3VtZW50VHlwZTxVPiwgYW55PiwgYWN0aW9uOiBBY3Rpb24pID0+IFByb21pc2U8RG9jdW1lbnRUeXBlPFU+Pik6IFBhcmFtZXRlckRlY29yYXRvciB7XG4gICAgY29uc3QgbW9kZWxOYW1lID0gbW9kZWwubW9kZWxOYW1lO1xuICAgIGNvbnN0IHBhcmFtTmFtZSA9IG1vZGVsTmFtZS50b0xvd2VyQ2FzZSgpO1xuICAgIHJldHVybiBjcmVhdGVQYXJhbURlY29yYXRvcih7XG4gICAgICAgIHJlcXVpcmVkOiBmYWxzZSxcbiAgICAgICAgdmFsdWU6IGFzeW5jIGFjdGlvbiA9PiB7XG4gICAgICAgICAgICBjb25zdCByZXEgPSBhY3Rpb24ucmVxdWVzdCBhcyBJUmVxdWVzdDtcbiAgICAgICAgICAgIGNvbnN0IHRva2VuID0gcmVxLmhlYWRlcihgeC0ke3BhcmFtTmFtZX0tdG9rZW5gKTtcbiAgICAgICAgICAgIGNvbnN0IGlkID0gcmVxLnBhcmFtc1tgJHtwYXJhbU5hbWV9SWRgXSBhcyBzdHJpbmc7XG4gICAgICAgICAgICBpZiAoIWlkICYmICF0b2tlbikge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBCYWRSZXF1ZXN0RXJyb3IoYCR7bW9kZWxOYW1lfSBpZCBvciB0b2tlbiBzaG91bGQgYmUgZGVmaW5lZCFgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IHF1ZXJ5ID0gIXRva2VuXG4gICAgICAgICAgICAgICAgPyBtb2RlbC5maW5kQnlJZChpZClcbiAgICAgICAgICAgICAgICA6IG1vZGVsLmZpbmRPbmUoe3Rva2VufSBhcyBhbnkpO1xuICAgICAgICAgICAgbGV0IGRvYzogRG9jdW1lbnQgPSBudWxsO1xuICAgICAgICAgICAgaWYgKGlzRnVuY3Rpb24oZXh0cmFDaGVjaykpIHtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICBkb2MgPSBhd2FpdCB2YWx1ZVRvUHJvbWlzZShleHRyYUNoZWNrKHF1ZXJ5LCBhY3Rpb24pKTtcbiAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBCYWRSZXF1ZXN0RXJyb3IoYCR7bW9kZWxOYW1lfSBjaGVjayBlcnJvcjogJHtlLm1lc3NhZ2UgfHwgZX1gKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGRvYyA9IGF3YWl0IHF1ZXJ5O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKCFkb2MpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSHR0cEVycm9yKDQwNCwgIXRva2VuXG4gICAgICAgICAgICAgICAgICAgID8gYCR7bW9kZWxOYW1lfSBjb3VsZCBub3QgYmUgZm91bmQgd2l0aCBpZDogJHtpZH1gXG4gICAgICAgICAgICAgICAgICAgIDogYCR7bW9kZWxOYW1lfSBjb3VsZCBub3QgYmUgZm91bmQgd2l0aCB0b2tlbjogJHt0b2tlbn1gKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGFjdGlvbi5yZXF1ZXN0W3BhcmFtTmFtZV0gPSBkb2M7XG4gICAgICAgICAgICByZXR1cm4gZG9jO1xuICAgICAgICB9XG4gICAgfSk7XG59XG4iXX0=
@@ -0,0 +1,119 @@
1
+ import { isString } from "../utils";
2
+ export class Tree {
3
+ container;
4
+ exists;
5
+ path;
6
+ map;
7
+ get parentTree() {
8
+ return this.container.parent.tree;
9
+ }
10
+ constructor(container, exists, path) {
11
+ this.container = container;
12
+ this.exists = exists;
13
+ this.path = path;
14
+ this.map = new Map();
15
+ }
16
+ resolveService() {
17
+ return !this.exists ? null : this.container.resolve(this.path);
18
+ }
19
+ resolveLeaves() {
20
+ let map;
21
+ try {
22
+ const parentTree = this.parentTree.resolvePath(this.path);
23
+ map = parentTree.resolveLeaves();
24
+ }
25
+ catch (e) {
26
+ map = new Map();
27
+ }
28
+ const visitor = (treeMap, path) => {
29
+ treeMap.forEach((tree, key) => {
30
+ const subKey = !path ? key : `${path}.${key}`;
31
+ if (tree.map.size == 0) {
32
+ map.set(subKey, tree);
33
+ return;
34
+ }
35
+ visitor(tree.map, subKey);
36
+ });
37
+ };
38
+ visitor(this.map, "");
39
+ return map;
40
+ }
41
+ resolveServices() {
42
+ const map = new Map();
43
+ this.resolveLeaves().forEach((leaf, key) => {
44
+ map.set(key, leaf.resolveService());
45
+ });
46
+ return map;
47
+ }
48
+ resolveAncestor(path) {
49
+ if (!isString(path) || path.length == 0) {
50
+ return this;
51
+ }
52
+ let parentTree;
53
+ try {
54
+ parentTree = this.parentTree.resolvePath(this.path);
55
+ parentTree = parentTree.resolveAncestor(path);
56
+ }
57
+ catch (e) {
58
+ parentTree = new Tree(this.container, false, "");
59
+ }
60
+ const pathParts = path.split(".");
61
+ let tree = this;
62
+ let previousTree = this;
63
+ for (let part of pathParts) {
64
+ tree = tree.map.get(part);
65
+ if (!tree) {
66
+ if (previousTree == this) {
67
+ if (parentTree.path.length > 0) {
68
+ return parentTree;
69
+ }
70
+ throw new Error(`Ancestor '${path}' not found in current tree: '${this.path}'`);
71
+ }
72
+ return previousTree;
73
+ }
74
+ previousTree = tree;
75
+ }
76
+ return parentTree.path.length > previousTree.path.length
77
+ ? parentTree : previousTree;
78
+ }
79
+ resolvePath(path, throwError = true) {
80
+ const absolutePath = !this.path ? path : `${this.path}.${path}`;
81
+ let tree = new Tree(this.container, false, absolutePath);
82
+ try {
83
+ tree = this.resolveAncestor(path);
84
+ }
85
+ catch (e) {
86
+ if (throwError) {
87
+ throw new Error(`Path '${path}' not found in current tree: '${this.path}'`);
88
+ }
89
+ return tree;
90
+ }
91
+ if (tree.path !== absolutePath) {
92
+ if (throwError) {
93
+ throw new Error(`Path '${path}' not found in current tree: '${this.path}'`);
94
+ }
95
+ return tree;
96
+ }
97
+ return tree;
98
+ }
99
+ addPath(path) {
100
+ if (!isString(path) || path.length == 0) {
101
+ return this;
102
+ }
103
+ const pathParts = path.split(".");
104
+ const maxIx = pathParts.length - 1;
105
+ let tree = this;
106
+ path = this.path;
107
+ for (let ix = 0; ix <= maxIx; ix++) {
108
+ const part = pathParts[ix];
109
+ if (!tree.map.has(part)) {
110
+ tree.map.set(part, new Tree(this.container, false, !path ? part : `${path}.${part}`));
111
+ }
112
+ tree = tree.map.get(part);
113
+ tree.exists = tree.exists || ix == maxIx;
114
+ path = tree.path;
115
+ }
116
+ return this;
117
+ }
118
+ }
119
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJlZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy91dGlsaXRpZXMvdHJlZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFDQSxPQUFPLEVBQUMsUUFBUSxFQUFDLE1BQU0sVUFBVSxDQUFDO0FBRWxDLE1BQU0sT0FBTyxJQUFJO0lBUVM7SUFBMkM7SUFBMEI7SUFOakYsR0FBRyxDQUFvQjtJQUVqQyxJQUFjLFVBQVU7UUFDcEIsT0FBTyxJQUFJLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUM7SUFDdEMsQ0FBQztJQUVELFlBQXNCLFNBQStCLEVBQVksTUFBZSxFQUFXLElBQVk7UUFBakYsY0FBUyxHQUFULFNBQVMsQ0FBc0I7UUFBWSxXQUFNLEdBQU4sTUFBTSxDQUFTO1FBQVcsU0FBSSxHQUFKLElBQUksQ0FBUTtRQUNuRyxJQUFJLENBQUMsR0FBRyxHQUFHLElBQUksR0FBRyxFQUFnQixDQUFDO0lBQ3ZDLENBQUM7SUFFRCxjQUFjO1FBQ1YsT0FBTyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ25FLENBQUM7SUFFRCxhQUFhO1FBQ1QsSUFBSSxHQUF1QixDQUFDO1FBQzVCLElBQUksQ0FBQztZQUNELE1BQU0sVUFBVSxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUMxRCxHQUFHLEdBQUcsVUFBVSxDQUFDLGFBQWEsRUFBRSxDQUFDO1FBQ3JDLENBQUM7UUFBQyxPQUFPLENBQUMsRUFBRSxDQUFDO1lBQ1QsR0FBRyxHQUFHLElBQUksR0FBRyxFQUFpQixDQUFDO1FBQ25DLENBQUM7UUFDRCxNQUFNLE9BQU8sR0FBRyxDQUFDLE9BQTBCLEVBQUUsSUFBWSxFQUFFLEVBQUU7WUFD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Q0FBQztRQUN0QixJQUFJLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQztRQUNqQixLQUFLLElBQUksRUFBRSxHQUFHLENBQUMsRUFBRSxFQUFFLElBQUksS0FBSyxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUM7WUFDakMsTUFBTSxJQUFJLEdBQUcsU0FBUyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1lBQzNCLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDO2dCQUN0QixJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxJQUFJLEVBQUUsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxLQUFLLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLElBQUksSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFBO1lBQ3pGLENBQUM7WUFDRCxJQUFJLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDMUIsSUFBSSxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUMsTUFBTSxJQUFJLEVBQUUsSUFBSSxLQUFLLENBQUM7WUFDekMsSUFBSSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUM7UUFDckIsQ0FBQztRQUNELE9BQU8sSUFBSSxDQUFDO0lBQ2hCLENBQUM7Q0FDSiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7SURlcGVuZGVuY3lDb250YWluZXIsIElUcmVlfSBmcm9tIFwiLi4vY29tbW9uLXR5cGVzXCI7XHJcbmltcG9ydCB7aXNTdHJpbmd9IGZyb20gXCIuLi91dGlsc1wiO1xyXG5cclxuZXhwb3J0IGNsYXNzIFRyZWUgaW1wbGVtZW50cyBJVHJlZSB7XHJcblxyXG4gICAgcHJvdGVjdGVkIG1hcDogTWFwPHN0cmluZywgVHJlZT47XHJcblxyXG4gICAgcHJvdGVjdGVkIGdldCBwYXJlbnRUcmVlKCk6IElUcmVlIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5jb250YWluZXIucGFyZW50LnRyZWU7XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3RydWN0b3IocHJvdGVjdGVkIGNvbnRhaW5lcjogSURlcGVuZGVuY3lDb250YWluZXIsIHByb3RlY3RlZCBleGlzdHM6IGJvb2xlYW4sIHJlYWRvbmx5IHBhdGg6IHN0cmluZykge1xyXG4gICAgICAgIHRoaXMubWFwID0gbmV3IE1hcDxzdHJpbmcsIFRyZWU+KCk7XHJcbiAgICB9XHJcblxyXG4gICAgcmVzb2x2ZVNlcnZpY2UoKTogYW55IHtcclxuICAgICAgICByZXR1cm4gIXRoaXMuZXhpc3RzID8gbnVsbCA6IHRoaXMuY29udGFpbmVyLnJlc29sdmUodGhpcy5wYXRoKTtcclxuICAgIH1cclxuXHJcbiAgICByZXNvbHZlTGVhdmVzKCk6IE1hcDxzdHJpbmcsIElUcmVlPiB7XHJcbiAgICAgICAgbGV0IG1hcDogTWFwPHN0cmluZywgSVRyZWU+O1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHBhcmVudFRyZWUgPSB0aGlzLnBhcmVudFRyZWUucmVzb2x2ZVBhdGgodGhpcy5wYXRoKTtcclxuICAgICAgICAgICAgbWFwID0gcGFyZW50VHJlZS5yZXNvbHZlTGVhdmVzKCk7XHJcbiAgICAgICAgfSBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgICBtYXAgPSBuZXcgTWFwPHN0cmluZywgSVRyZWU+KCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IHZpc2l0b3IgPSAodHJlZU1hcDogTWFwPHN0cmluZywgVHJlZT4sIHBhdGg6IHN0cmluZykgPT4ge1xyXG4gICAgICAgICAgICB0cmVlTWFwLmZvckVhY2goKHRyZWUsIGtleSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgY29uc3Qgc3ViS2V5ID0gIXBhdGggPyBrZXkgOiBgJHtwYXRofS4ke2tleX1gO1xyXG4gICAgICAgICAgICAgICAgaWYgKHRyZWUubWFwLnNpemUgPT0gMCkge1xyXG4gICAgICAgICAgICAgICAgICAgIG1hcC5zZXQoc3ViS2V5LCB0cmVlKTtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB2aXNpdG9yKHRyZWUubWFwLCBzdWJLZXkpO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9O1xyXG4gICAgICAgIHZpc2l0b3IodGhpcy5tYXAsIFwiXCIpO1xyXG4gICAgICAgIHJldHVybiBtYXA7XHJcbiAgICB9XHJcblxyXG4gICAgcmVzb2x2ZVNlcnZpY2VzKCk6IE1hcDxzdHJpbmcsIGFueT4ge1xyXG4gICAgICAgIGNvbnN0IG1hcCA9IG5ldyBNYXA8c3RyaW5nLCBhbnk+KCk7XHJcbiAgICAgICAgdGhpcy5yZXNvbHZlTGVhdmVzKCkuZm9yRWFjaCgobGVhZiwga2V5KSA9PiB7XHJcbiAgICAgICAgICAgIG1hcC5zZXQoa2V5LCBsZWFmLnJlc29sdmVTZXJ2aWNlKCkpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIHJldHVybiBtYXA7XHJcbiAgICB9XHJcblxyXG4gICAgcmVzb2x2ZUFuY2VzdG9yKHBhdGg6IHN0cmluZyk6IElUcmVlIHtcclxuICAgICAgICBpZiAoIWlzU3RyaW5nKHBhdGgpIHx8IHBhdGgubGVuZ3RoID09IDApIHtcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGxldCBwYXJlbnRUcmVlOiBJVHJlZTtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICBwYXJlbnRUcmVlID0gdGhpcy5wYXJlbnRUcmVlLnJlc29sdmVQYXRoKHRoaXMucGF0aCk7XHJcbiAgICAgICAgICAgIHBhcmVudFRyZWUgPSBwYXJlbnRUcmVlLnJlc29sdmVBbmNlc3RvcihwYXRoKTtcclxuICAgICAgICB9IGNhdGNoIChlKSB7XHJcbiAgICAgICAgICAgIHBhcmVudFRyZWUgPSBuZXcgVHJlZSh0aGlzLmNvbnRhaW5lciwgZmFsc2UsIFwiXCIpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjb25zdCBwYXRoUGFydHMgPSBwYXRoLnNwbGl0KFwiLlwiKTtcclxuICAgICAgICBsZXQgdHJlZTogVHJlZSA9IHRoaXM7XHJcbiAgICAgICAgbGV0IHByZXZpb3VzVHJlZTogVHJlZSA9IHRoaXM7XHJcbiAgICAgICAgZm9yIChsZXQgcGFydCBvZiBwYXRoUGFydHMpIHtcclxuICAgICAgICAgICAgdHJlZSA9IHRyZWUubWFwLmdldChwYXJ0KTtcclxuICAgICAgICAgICAgaWYgKCF0cmVlKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAocHJldmlvdXNUcmVlID09IHRoaXMpIHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAocGFyZW50VHJlZS5wYXRoLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHBhcmVudFRyZWU7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgQW5jZXN0b3IgJyR7cGF0aH0nIG5vdCBmb3VuZCBpbiBjdXJyZW50IHRyZWU6ICcke3RoaXMucGF0aH0nYCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gcHJldmlvdXNUcmVlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHByZXZpb3VzVHJlZSA9IHRyZWU7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBwYXJlbnRUcmVlLnBhdGgubGVuZ3RoID4gcHJldmlvdXNUcmVlLnBhdGgubGVuZ3RoXHJcbiAgICAgICAgICAgID8gcGFyZW50VHJlZSA6IHByZXZpb3VzVHJlZTtcclxuICAgIH1cclxuXHJcbiAgICByZXNvbHZlUGF0aChwYXRoOiBzdHJpbmcsIHRocm93RXJyb3I6IGJvb2xlYW4gPSB0cnVlKTogSVRyZWUge1xyXG4gICAgICAgIGNvbnN0IGFic29sdXRlUGF0aCA9ICF0aGlzLnBhdGggPyBwYXRoIDogYCR7dGhpcy5wYXRofS4ke3BhdGh9YDtcclxuICAgICAgICBsZXQgdHJlZTogSVRyZWUgPSBuZXcgVHJlZSh0aGlzLmNvbnRhaW5lciwgZmFsc2UsIGFic29sdXRlUGF0aCk7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgdHJlZSA9IHRoaXMucmVzb2x2ZUFuY2VzdG9yKHBhdGgpO1xyXG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgaWYgKHRocm93RXJyb3IpIHtcclxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgUGF0aCAnJHtwYXRofScgbm90IGZvdW5kIGluIGN1cnJlbnQgdHJlZTogJyR7dGhpcy5wYXRofSdgKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICByZXR1cm4gdHJlZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHRyZWUucGF0aCAhPT0gYWJzb2x1dGVQYXRoKSB7XHJcbiAgICAgICAgICAgIGlmICh0aHJvd0Vycm9yKSB7XHJcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFBhdGggJyR7cGF0aH0nIG5vdCBmb3VuZCBpbiBjdXJyZW50IHRyZWU6ICcke3RoaXMucGF0aH0nYCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcmV0dXJuIHRyZWU7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiB0cmVlO1xyXG4gICAgfVxyXG5cclxuICAgIGFkZFBhdGgocGF0aDogc3RyaW5nKTogdGhpcyB7XHJcbiAgICAgICAgaWYgKCFpc1N0cmluZyhwYXRoKSB8fCBwYXRoLmxlbmd0aCA9PSAwKSB7XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjb25zdCBwYXRoUGFydHMgPSBwYXRoLnNwbGl0KFwiLlwiKTtcclxuICAgICAgICBjb25zdCBtYXhJeCA9IHBhdGhQYXJ0cy5sZW5ndGggLSAxO1xyXG4gICAgICAgIGxldCB0cmVlOiBUcmVlID0gdGhpcztcclxuICAgICAgICBwYXRoID0gdGhpcy5wYXRoO1xyXG4gICAgICAgIGZvciAobGV0IGl4ID0gMDsgaXggPD0gbWF4SXg7IGl4KyspIHtcclxuICAgICAgICAgICAgY29uc3QgcGFydCA9IHBhdGhQYXJ0c1tpeF07XHJcbiAgICAgICAgICAgIGlmICghdHJlZS5tYXAuaGFzKHBhcnQpKSB7XHJcbiAgICAgICAgICAgICAgICB0cmVlLm1hcC5zZXQocGFydCwgbmV3IFRyZWUodGhpcy5jb250YWluZXIsIGZhbHNlLCAhcGF0aCA/IHBhcnQgOiBgJHtwYXRofS4ke3BhcnR9YCkpXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgdHJlZSA9IHRyZWUubWFwLmdldChwYXJ0KTtcclxuICAgICAgICAgICAgdHJlZS5leGlzdHMgPSB0cmVlLmV4aXN0cyB8fCBpeCA9PSBtYXhJeDtcclxuICAgICAgICAgICAgcGF0aCA9IHRyZWUucGF0aDtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9XHJcbn1cclxuIl19