parse-server 2.8.4 → 8.6.2
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/LICENSE +167 -25
- package/NOTICE +10 -0
- package/README.md +929 -278
- package/lib/AccountLockout.js +47 -30
- package/lib/Adapters/AdapterLoader.js +21 -6
- package/lib/Adapters/Analytics/AnalyticsAdapter.js +15 -12
- package/lib/Adapters/Auth/AuthAdapter.js +116 -13
- package/lib/Adapters/Auth/BaseCodeAuthAdapter.js +99 -0
- package/lib/Adapters/Auth/OAuth1Client.js +27 -46
- package/lib/Adapters/Auth/apple.js +123 -0
- package/lib/Adapters/Auth/facebook.js +162 -35
- package/lib/Adapters/Auth/gcenter.js +217 -0
- package/lib/Adapters/Auth/github.js +118 -48
- package/lib/Adapters/Auth/google.js +160 -51
- package/lib/Adapters/Auth/gpgames.js +125 -0
- package/lib/Adapters/Auth/httpsRequest.js +6 -7
- package/lib/Adapters/Auth/index.js +170 -62
- package/lib/Adapters/Auth/instagram.js +114 -40
- package/lib/Adapters/Auth/janraincapture.js +52 -23
- package/lib/Adapters/Auth/janrainengage.js +19 -36
- package/lib/Adapters/Auth/keycloak.js +148 -0
- package/lib/Adapters/Auth/ldap.js +167 -0
- package/lib/Adapters/Auth/line.js +125 -0
- package/lib/Adapters/Auth/linkedin.js +111 -55
- package/lib/Adapters/Auth/meetup.js +24 -34
- package/lib/Adapters/Auth/mfa.js +324 -0
- package/lib/Adapters/Auth/microsoft.js +111 -0
- package/lib/Adapters/Auth/oauth2.js +97 -162
- package/lib/Adapters/Auth/phantauth.js +53 -0
- package/lib/Adapters/Auth/qq.js +108 -49
- package/lib/Adapters/Auth/spotify.js +107 -55
- package/lib/Adapters/Auth/twitter.js +188 -48
- package/lib/Adapters/Auth/utils.js +28 -0
- package/lib/Adapters/Auth/vkontakte.js +26 -39
- package/lib/Adapters/Auth/wechat.js +106 -44
- package/lib/Adapters/Auth/weibo.js +132 -58
- package/lib/Adapters/Cache/CacheAdapter.js +13 -8
- package/lib/Adapters/Cache/InMemoryCache.js +3 -13
- package/lib/Adapters/Cache/InMemoryCacheAdapter.js +5 -13
- package/lib/Adapters/Cache/LRUCache.js +13 -27
- package/lib/Adapters/Cache/NullCacheAdapter.js +3 -8
- package/lib/Adapters/Cache/RedisCacheAdapter.js +85 -76
- package/lib/Adapters/Cache/SchemaCache.js +25 -0
- package/lib/Adapters/Email/MailAdapter.js +10 -8
- package/lib/Adapters/Files/FilesAdapter.js +83 -25
- package/lib/Adapters/Files/GridFSBucketAdapter.js +231 -0
- package/lib/Adapters/Files/GridStoreAdapter.js +4 -91
- package/lib/Adapters/Logger/LoggerAdapter.js +18 -14
- package/lib/Adapters/Logger/WinstonLogger.js +69 -88
- package/lib/Adapters/Logger/WinstonLoggerAdapter.js +7 -16
- package/lib/Adapters/MessageQueue/EventEmitterMQ.js +8 -26
- package/lib/Adapters/PubSub/EventEmitterPubSub.js +12 -25
- package/lib/Adapters/PubSub/PubSubAdapter.js +34 -0
- package/lib/Adapters/PubSub/RedisPubSub.js +42 -19
- package/lib/Adapters/Push/PushAdapter.js +14 -7
- package/lib/Adapters/Storage/Mongo/MongoCollection.js +137 -45
- package/lib/Adapters/Storage/Mongo/MongoSchemaCollection.js +158 -63
- package/lib/Adapters/Storage/Mongo/MongoStorageAdapter.js +320 -168
- package/lib/Adapters/Storage/Mongo/MongoTransform.js +279 -306
- package/lib/Adapters/Storage/Postgres/PostgresClient.js +14 -10
- package/lib/Adapters/Storage/Postgres/PostgresConfigParser.js +47 -21
- package/lib/Adapters/Storage/Postgres/PostgresStorageAdapter.js +854 -468
- package/lib/Adapters/Storage/Postgres/sql/index.js +4 -6
- package/lib/Adapters/Storage/StorageAdapter.js +1 -1
- package/lib/Adapters/WebSocketServer/WSAdapter.js +35 -0
- package/lib/Adapters/WebSocketServer/WSSAdapter.js +66 -0
- package/lib/Auth.js +488 -125
- package/lib/ClientSDK.js +2 -6
- package/lib/Config.js +525 -94
- package/lib/Controllers/AdaptableController.js +5 -25
- package/lib/Controllers/AnalyticsController.js +22 -23
- package/lib/Controllers/CacheController.js +10 -31
- package/lib/Controllers/DatabaseController.js +767 -313
- package/lib/Controllers/FilesController.js +49 -54
- package/lib/Controllers/HooksController.js +80 -84
- package/lib/Controllers/LiveQueryController.js +35 -22
- package/lib/Controllers/LoggerController.js +22 -58
- package/lib/Controllers/ParseGraphQLController.js +293 -0
- package/lib/Controllers/PushController.js +58 -49
- package/lib/Controllers/SchemaController.js +916 -422
- package/lib/Controllers/UserController.js +265 -180
- package/lib/Controllers/index.js +90 -125
- package/lib/Controllers/types.js +1 -1
- package/lib/Deprecator/Deprecations.js +30 -0
- package/lib/Deprecator/Deprecator.js +127 -0
- package/lib/Error.js +48 -0
- package/lib/GraphQL/ParseGraphQLSchema.js +375 -0
- package/lib/GraphQL/ParseGraphQLServer.js +214 -0
- package/lib/GraphQL/helpers/objectsMutations.js +30 -0
- package/lib/GraphQL/helpers/objectsQueries.js +246 -0
- package/lib/GraphQL/loaders/configMutations.js +87 -0
- package/lib/GraphQL/loaders/configQueries.js +79 -0
- package/lib/GraphQL/loaders/defaultGraphQLMutations.js +21 -0
- package/lib/GraphQL/loaders/defaultGraphQLQueries.js +23 -0
- package/lib/GraphQL/loaders/defaultGraphQLTypes.js +1098 -0
- package/lib/GraphQL/loaders/defaultRelaySchema.js +53 -0
- package/lib/GraphQL/loaders/filesMutations.js +107 -0
- package/lib/GraphQL/loaders/functionsMutations.js +78 -0
- package/lib/GraphQL/loaders/parseClassMutations.js +268 -0
- package/lib/GraphQL/loaders/parseClassQueries.js +127 -0
- package/lib/GraphQL/loaders/parseClassTypes.js +493 -0
- package/lib/GraphQL/loaders/schemaDirectives.js +62 -0
- package/lib/GraphQL/loaders/schemaMutations.js +162 -0
- package/lib/GraphQL/loaders/schemaQueries.js +81 -0
- package/lib/GraphQL/loaders/schemaTypes.js +341 -0
- package/lib/GraphQL/loaders/usersMutations.js +433 -0
- package/lib/GraphQL/loaders/usersQueries.js +90 -0
- package/lib/GraphQL/parseGraphQLUtils.js +63 -0
- package/lib/GraphQL/transformers/className.js +14 -0
- package/lib/GraphQL/transformers/constraintType.js +53 -0
- package/lib/GraphQL/transformers/inputType.js +51 -0
- package/lib/GraphQL/transformers/mutation.js +274 -0
- package/lib/GraphQL/transformers/outputType.js +51 -0
- package/lib/GraphQL/transformers/query.js +237 -0
- package/lib/GraphQL/transformers/schemaFields.js +99 -0
- package/lib/KeyPromiseQueue.js +48 -0
- package/lib/LiveQuery/Client.js +25 -33
- package/lib/LiveQuery/Id.js +2 -5
- package/lib/LiveQuery/ParseCloudCodePublisher.js +26 -23
- package/lib/LiveQuery/ParseLiveQueryServer.js +560 -285
- package/lib/LiveQuery/ParsePubSub.js +7 -16
- package/lib/LiveQuery/ParseWebSocketServer.js +42 -39
- package/lib/LiveQuery/QueryTools.js +76 -15
- package/lib/LiveQuery/RequestSchema.js +111 -97
- package/lib/LiveQuery/SessionTokenCache.js +23 -36
- package/lib/LiveQuery/Subscription.js +8 -17
- package/lib/LiveQuery/equalObjects.js +2 -3
- package/lib/Options/Definitions.js +1355 -382
- package/lib/Options/docs.js +301 -62
- package/lib/Options/index.js +11 -1
- package/lib/Options/parsers.js +14 -10
- package/lib/Page.js +44 -0
- package/lib/ParseMessageQueue.js +6 -13
- package/lib/ParseServer.js +474 -235
- package/lib/ParseServerRESTController.js +102 -40
- package/lib/PromiseRouter.js +39 -50
- package/lib/Push/PushQueue.js +24 -30
- package/lib/Push/PushWorker.js +32 -56
- package/lib/Push/utils.js +22 -35
- package/lib/RestQuery.js +361 -139
- package/lib/RestWrite.js +713 -344
- package/lib/Routers/AggregateRouter.js +97 -71
- package/lib/Routers/AnalyticsRouter.js +8 -14
- package/lib/Routers/AudiencesRouter.js +16 -35
- package/lib/Routers/ClassesRouter.js +86 -72
- package/lib/Routers/CloudCodeRouter.js +28 -37
- package/lib/Routers/FeaturesRouter.js +22 -25
- package/lib/Routers/FilesRouter.js +266 -171
- package/lib/Routers/FunctionsRouter.js +87 -103
- package/lib/Routers/GlobalConfigRouter.js +94 -33
- package/lib/Routers/GraphQLRouter.js +41 -0
- package/lib/Routers/HooksRouter.js +43 -47
- package/lib/Routers/IAPValidationRouter.js +57 -70
- package/lib/Routers/InstallationsRouter.js +17 -25
- package/lib/Routers/LogsRouter.js +10 -25
- package/lib/Routers/PagesRouter.js +647 -0
- package/lib/Routers/PublicAPIRouter.js +104 -112
- package/lib/Routers/PurgeRouter.js +19 -29
- package/lib/Routers/PushRouter.js +14 -28
- package/lib/Routers/RolesRouter.js +7 -14
- package/lib/Routers/SchemasRouter.js +63 -42
- package/lib/Routers/SecurityRouter.js +34 -0
- package/lib/Routers/SessionsRouter.js +25 -38
- package/lib/Routers/UsersRouter.js +463 -190
- package/lib/SchemaMigrations/DefinedSchemas.js +379 -0
- package/lib/SchemaMigrations/Migrations.js +30 -0
- package/lib/Security/Check.js +109 -0
- package/lib/Security/CheckGroup.js +44 -0
- package/lib/Security/CheckGroups/CheckGroupDatabase.js +44 -0
- package/lib/Security/CheckGroups/CheckGroupServerConfig.js +96 -0
- package/lib/Security/CheckGroups/CheckGroups.js +21 -0
- package/lib/Security/CheckRunner.js +213 -0
- package/lib/SharedRest.js +29 -0
- package/lib/StatusHandler.js +96 -93
- package/lib/TestUtils.js +70 -14
- package/lib/Utils.js +468 -0
- package/lib/batch.js +74 -40
- package/lib/cache.js +8 -8
- package/lib/cli/definitions/parse-live-query-server.js +4 -3
- package/lib/cli/definitions/parse-server.js +4 -3
- package/lib/cli/parse-live-query-server.js +9 -17
- package/lib/cli/parse-server.js +49 -47
- package/lib/cli/utils/commander.js +20 -29
- package/lib/cli/utils/runner.js +31 -32
- package/lib/cloud-code/Parse.Cloud.js +711 -36
- package/lib/cloud-code/Parse.Server.js +21 -0
- package/lib/cryptoUtils.js +6 -11
- package/lib/defaults.js +21 -15
- package/lib/deprecated.js +1 -1
- package/lib/index.js +78 -67
- package/lib/logger.js +12 -20
- package/lib/middlewares.js +484 -160
- package/lib/password.js +10 -6
- package/lib/request.js +175 -0
- package/lib/requiredParameter.js +4 -3
- package/lib/rest.js +157 -82
- package/lib/triggers.js +627 -185
- package/lib/vendor/README.md +3 -3
- package/lib/vendor/mongodbUrl.js +224 -137
- package/package.json +135 -57
- package/postinstall.js +38 -50
- package/public_html/invalid_verification_link.html +3 -3
- package/types/@types/@parse/fs-files-adapter/index.d.ts +5 -0
- package/types/@types/deepcopy/index.d.ts +5 -0
- package/types/LiveQuery/ParseLiveQueryServer.d.ts +40 -0
- package/types/Options/index.d.ts +301 -0
- package/types/ParseServer.d.ts +65 -0
- package/types/eslint.config.mjs +30 -0
- package/types/index.d.ts +21 -0
- package/types/logger.d.ts +2 -0
- package/types/tests.ts +44 -0
- package/types/tsconfig.json +24 -0
- package/CHANGELOG.md +0 -1246
- package/PATENTS +0 -37
- package/bin/dev +0 -37
- package/lib/.DS_Store +0 -0
- package/lib/Adapters/Auth/common.js +0 -2
- package/lib/Adapters/Auth/facebookaccountkit.js +0 -69
- package/lib/Controllers/SchemaCache.js +0 -97
- package/lib/LiveQuery/.DS_Store +0 -0
- package/lib/cli/utils/parsers.js +0 -77
- package/lib/cloud-code/.DS_Store +0 -0
- package/lib/cloud-code/HTTPResponse.js +0 -57
- package/lib/cloud-code/Untitled-1 +0 -123
- package/lib/cloud-code/httpRequest.js +0 -102
- package/lib/cloud-code/team.html +0 -123
- package/lib/graphql/ParseClass.js +0 -234
- package/lib/graphql/Schema.js +0 -197
- package/lib/graphql/index.js +0 -1
- package/lib/graphql/types/ACL.js +0 -35
- package/lib/graphql/types/Date.js +0 -25
- package/lib/graphql/types/File.js +0 -24
- package/lib/graphql/types/GeoPoint.js +0 -35
- package/lib/graphql/types/JSONObject.js +0 -30
- package/lib/graphql/types/NumberInput.js +0 -43
- package/lib/graphql/types/NumberQuery.js +0 -42
- package/lib/graphql/types/Pointer.js +0 -35
- package/lib/graphql/types/QueryConstraint.js +0 -61
- package/lib/graphql/types/StringQuery.js +0 -39
- package/lib/graphql/types/index.js +0 -110
|
@@ -1,21 +1,12 @@
|
|
|
1
|
-
|
|
1
|
+
"use strict";
|
|
2
2
|
|
|
3
3
|
Object.defineProperty(exports, "__esModule", {
|
|
4
4
|
value: true
|
|
5
5
|
});
|
|
6
|
-
|
|
7
|
-
var
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
var _MongoCollection2 = _interopRequireDefault(_MongoCollection);
|
|
12
|
-
|
|
13
|
-
var _node = require('parse/node');
|
|
14
|
-
|
|
15
|
-
var _node2 = _interopRequireDefault(_node);
|
|
16
|
-
|
|
17
|
-
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
18
|
-
|
|
6
|
+
exports.default = void 0;
|
|
7
|
+
var _MongoCollection = _interopRequireDefault(require("./MongoCollection"));
|
|
8
|
+
var _node = _interopRequireDefault(require("parse/node"));
|
|
9
|
+
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
|
|
19
10
|
function mongoFieldToParseSchemaField(type) {
|
|
20
11
|
if (type[0] === '*') {
|
|
21
12
|
return {
|
|
@@ -31,70 +22,128 @@ function mongoFieldToParseSchemaField(type) {
|
|
|
31
22
|
}
|
|
32
23
|
switch (type) {
|
|
33
24
|
case 'number':
|
|
34
|
-
return {
|
|
25
|
+
return {
|
|
26
|
+
type: 'Number'
|
|
27
|
+
};
|
|
35
28
|
case 'string':
|
|
36
|
-
return {
|
|
29
|
+
return {
|
|
30
|
+
type: 'String'
|
|
31
|
+
};
|
|
37
32
|
case 'boolean':
|
|
38
|
-
return {
|
|
33
|
+
return {
|
|
34
|
+
type: 'Boolean'
|
|
35
|
+
};
|
|
39
36
|
case 'date':
|
|
40
|
-
return {
|
|
37
|
+
return {
|
|
38
|
+
type: 'Date'
|
|
39
|
+
};
|
|
41
40
|
case 'map':
|
|
42
41
|
case 'object':
|
|
43
|
-
return {
|
|
42
|
+
return {
|
|
43
|
+
type: 'Object'
|
|
44
|
+
};
|
|
44
45
|
case 'array':
|
|
45
|
-
return {
|
|
46
|
+
return {
|
|
47
|
+
type: 'Array'
|
|
48
|
+
};
|
|
46
49
|
case 'geopoint':
|
|
47
|
-
return {
|
|
50
|
+
return {
|
|
51
|
+
type: 'GeoPoint'
|
|
52
|
+
};
|
|
48
53
|
case 'file':
|
|
49
|
-
return {
|
|
54
|
+
return {
|
|
55
|
+
type: 'File'
|
|
56
|
+
};
|
|
50
57
|
case 'bytes':
|
|
51
|
-
return {
|
|
58
|
+
return {
|
|
59
|
+
type: 'Bytes'
|
|
60
|
+
};
|
|
52
61
|
case 'polygon':
|
|
53
|
-
return {
|
|
62
|
+
return {
|
|
63
|
+
type: 'Polygon'
|
|
64
|
+
};
|
|
54
65
|
}
|
|
55
66
|
}
|
|
56
|
-
|
|
57
67
|
const nonFieldSchemaKeys = ['_id', '_metadata', '_client_permissions'];
|
|
58
68
|
function mongoSchemaFieldsToParseSchemaFields(schema) {
|
|
59
69
|
var fieldNames = Object.keys(schema).filter(key => nonFieldSchemaKeys.indexOf(key) === -1);
|
|
60
70
|
var response = fieldNames.reduce((obj, fieldName) => {
|
|
61
71
|
obj[fieldName] = mongoFieldToParseSchemaField(schema[fieldName]);
|
|
72
|
+
if (schema._metadata && schema._metadata.fields_options && schema._metadata.fields_options[fieldName]) {
|
|
73
|
+
obj[fieldName] = Object.assign({}, obj[fieldName], schema._metadata.fields_options[fieldName]);
|
|
74
|
+
}
|
|
62
75
|
return obj;
|
|
63
76
|
}, {});
|
|
64
|
-
response.ACL = {
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
response.
|
|
77
|
+
response.ACL = {
|
|
78
|
+
type: 'ACL'
|
|
79
|
+
};
|
|
80
|
+
response.createdAt = {
|
|
81
|
+
type: 'Date'
|
|
82
|
+
};
|
|
83
|
+
response.updatedAt = {
|
|
84
|
+
type: 'Date'
|
|
85
|
+
};
|
|
86
|
+
response.objectId = {
|
|
87
|
+
type: 'String'
|
|
88
|
+
};
|
|
68
89
|
return response;
|
|
69
90
|
}
|
|
70
|
-
|
|
71
91
|
const emptyCLPS = Object.freeze({
|
|
72
92
|
find: {},
|
|
93
|
+
count: {},
|
|
73
94
|
get: {},
|
|
74
95
|
create: {},
|
|
75
96
|
update: {},
|
|
76
97
|
delete: {},
|
|
77
|
-
addField: {}
|
|
98
|
+
addField: {},
|
|
99
|
+
protectedFields: {}
|
|
78
100
|
});
|
|
79
|
-
|
|
80
101
|
const defaultCLPS = Object.freeze({
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
102
|
+
ACL: {
|
|
103
|
+
'*': {
|
|
104
|
+
read: true,
|
|
105
|
+
write: true
|
|
106
|
+
}
|
|
107
|
+
},
|
|
108
|
+
find: {
|
|
109
|
+
'*': true
|
|
110
|
+
},
|
|
111
|
+
count: {
|
|
112
|
+
'*': true
|
|
113
|
+
},
|
|
114
|
+
get: {
|
|
115
|
+
'*': true
|
|
116
|
+
},
|
|
117
|
+
create: {
|
|
118
|
+
'*': true
|
|
119
|
+
},
|
|
120
|
+
update: {
|
|
121
|
+
'*': true
|
|
122
|
+
},
|
|
123
|
+
delete: {
|
|
124
|
+
'*': true
|
|
125
|
+
},
|
|
126
|
+
addField: {
|
|
127
|
+
'*': true
|
|
128
|
+
},
|
|
129
|
+
protectedFields: {
|
|
130
|
+
'*': []
|
|
131
|
+
}
|
|
87
132
|
});
|
|
88
|
-
|
|
89
133
|
function mongoSchemaToParseSchema(mongoSchema) {
|
|
90
134
|
let clps = defaultCLPS;
|
|
91
135
|
let indexes = {};
|
|
92
136
|
if (mongoSchema._metadata) {
|
|
93
137
|
if (mongoSchema._metadata.class_permissions) {
|
|
94
|
-
clps =
|
|
138
|
+
clps = {
|
|
139
|
+
...emptyCLPS,
|
|
140
|
+
...mongoSchema._metadata.class_permissions
|
|
141
|
+
};
|
|
95
142
|
}
|
|
96
143
|
if (mongoSchema._metadata.indexes) {
|
|
97
|
-
indexes =
|
|
144
|
+
indexes = {
|
|
145
|
+
...mongoSchema._metadata.indexes
|
|
146
|
+
};
|
|
98
147
|
}
|
|
99
148
|
}
|
|
100
149
|
return {
|
|
@@ -104,9 +153,10 @@ function mongoSchemaToParseSchema(mongoSchema) {
|
|
|
104
153
|
indexes: indexes
|
|
105
154
|
};
|
|
106
155
|
}
|
|
107
|
-
|
|
108
156
|
function _mongoSchemaQueryFromNameQuery(name, query) {
|
|
109
|
-
const object = {
|
|
157
|
+
const object = {
|
|
158
|
+
_id: name
|
|
159
|
+
};
|
|
110
160
|
if (query) {
|
|
111
161
|
Object.keys(query).forEach(key => {
|
|
112
162
|
object[key] = query[key];
|
|
@@ -117,7 +167,10 @@ function _mongoSchemaQueryFromNameQuery(name, query) {
|
|
|
117
167
|
|
|
118
168
|
// Returns a type suitable for inserting into mongo _SCHEMA collection.
|
|
119
169
|
// Does no validation. That is expected to be done in Parse Server.
|
|
120
|
-
function parseFieldTypeToMongoFieldType({
|
|
170
|
+
function parseFieldTypeToMongoFieldType({
|
|
171
|
+
type,
|
|
172
|
+
targetClass
|
|
173
|
+
}) {
|
|
121
174
|
switch (type) {
|
|
122
175
|
case 'Pointer':
|
|
123
176
|
return `*${targetClass}`;
|
|
@@ -145,19 +198,17 @@ function parseFieldTypeToMongoFieldType({ type, targetClass }) {
|
|
|
145
198
|
return 'polygon';
|
|
146
199
|
}
|
|
147
200
|
}
|
|
148
|
-
|
|
149
201
|
class MongoSchemaCollection {
|
|
150
|
-
|
|
151
202
|
constructor(collection) {
|
|
152
203
|
this._collection = collection;
|
|
153
204
|
}
|
|
154
|
-
|
|
155
205
|
_fetchAllSchemasFrom_SCHEMA() {
|
|
156
206
|
return this._collection._rawFind({}).then(schemas => schemas.map(mongoSchemaToParseSchema));
|
|
157
207
|
}
|
|
158
|
-
|
|
159
208
|
_fetchOneSchemaFrom_SCHEMA(name) {
|
|
160
|
-
return this._collection._rawFind(_mongoSchemaQueryFromNameQuery(name), {
|
|
209
|
+
return this._collection._rawFind(_mongoSchemaQueryFromNameQuery(name), {
|
|
210
|
+
limit: 1
|
|
211
|
+
}).then(results => {
|
|
161
212
|
if (results.length === 1) {
|
|
162
213
|
return mongoSchemaToParseSchema(results[0]);
|
|
163
214
|
} else {
|
|
@@ -168,24 +219,21 @@ class MongoSchemaCollection {
|
|
|
168
219
|
|
|
169
220
|
// Atomically find and delete an object based on query.
|
|
170
221
|
findAndDeleteSchema(name) {
|
|
171
|
-
return this._collection._mongoCollection.
|
|
222
|
+
return this._collection._mongoCollection.findOneAndDelete(_mongoSchemaQueryFromNameQuery(name));
|
|
172
223
|
}
|
|
173
|
-
|
|
174
224
|
insertSchema(schema) {
|
|
175
|
-
return this._collection.insertOne(schema).then(
|
|
225
|
+
return this._collection.insertOne(schema).then(() => mongoSchemaToParseSchema(schema)).catch(error => {
|
|
176
226
|
if (error.code === 11000) {
|
|
177
227
|
//Mongo's duplicate key error
|
|
178
|
-
throw new
|
|
228
|
+
throw new _node.default.Error(_node.default.Error.DUPLICATE_VALUE, 'Class already exists.');
|
|
179
229
|
} else {
|
|
180
230
|
throw error;
|
|
181
231
|
}
|
|
182
232
|
});
|
|
183
233
|
}
|
|
184
|
-
|
|
185
234
|
updateSchema(name, update) {
|
|
186
235
|
return this._collection.updateOne(_mongoSchemaQueryFromNameQuery(name), update);
|
|
187
236
|
}
|
|
188
|
-
|
|
189
237
|
upsertSchema(name, query, update) {
|
|
190
238
|
return this._collection.upsertOne(_mongoSchemaQueryFromNameQuery(name, query), update);
|
|
191
239
|
}
|
|
@@ -201,17 +249,17 @@ class MongoSchemaCollection {
|
|
|
201
249
|
// Support additional types that Mongo doesn't, like Money, or something.
|
|
202
250
|
|
|
203
251
|
// TODO: don't spend an extra query on finding the schema if the type we are trying to add isn't a GeoPoint.
|
|
204
|
-
addFieldIfNotExists(className, fieldName,
|
|
252
|
+
addFieldIfNotExists(className, fieldName, fieldType) {
|
|
205
253
|
return this._fetchOneSchemaFrom_SCHEMA(className).then(schema => {
|
|
206
254
|
// If a field with this name already exists, it will be handled elsewhere.
|
|
207
|
-
if (schema.fields[fieldName]
|
|
255
|
+
if (schema.fields[fieldName] !== undefined) {
|
|
208
256
|
return;
|
|
209
257
|
}
|
|
210
258
|
// The schema exists. Check for existing GeoPoints.
|
|
211
|
-
if (
|
|
259
|
+
if (fieldType.type === 'GeoPoint') {
|
|
212
260
|
// Make sure there are not other geopoint fields
|
|
213
261
|
if (Object.keys(schema.fields).some(existingField => schema.fields[existingField].type === 'GeoPoint')) {
|
|
214
|
-
throw new
|
|
262
|
+
throw new _node.default.Error(_node.default.Error.INCORRECT_TYPE, 'MongoDB only supports one GeoPoint field in a class.');
|
|
215
263
|
}
|
|
216
264
|
}
|
|
217
265
|
return;
|
|
@@ -223,9 +271,57 @@ class MongoSchemaCollection {
|
|
|
223
271
|
}
|
|
224
272
|
throw error;
|
|
225
273
|
}).then(() => {
|
|
274
|
+
const {
|
|
275
|
+
type,
|
|
276
|
+
targetClass,
|
|
277
|
+
...fieldOptions
|
|
278
|
+
} = fieldType;
|
|
226
279
|
// We use $exists and $set to avoid overwriting the field type if it
|
|
227
280
|
// already exists. (it could have added inbetween the last query and the update)
|
|
228
|
-
|
|
281
|
+
if (fieldOptions && Object.keys(fieldOptions).length > 0) {
|
|
282
|
+
return this.upsertSchema(className, {
|
|
283
|
+
[fieldName]: {
|
|
284
|
+
$exists: false
|
|
285
|
+
}
|
|
286
|
+
}, {
|
|
287
|
+
$set: {
|
|
288
|
+
[fieldName]: parseFieldTypeToMongoFieldType({
|
|
289
|
+
type,
|
|
290
|
+
targetClass
|
|
291
|
+
}),
|
|
292
|
+
[`_metadata.fields_options.${fieldName}`]: fieldOptions
|
|
293
|
+
}
|
|
294
|
+
});
|
|
295
|
+
} else {
|
|
296
|
+
return this.upsertSchema(className, {
|
|
297
|
+
[fieldName]: {
|
|
298
|
+
$exists: false
|
|
299
|
+
}
|
|
300
|
+
}, {
|
|
301
|
+
$set: {
|
|
302
|
+
[fieldName]: parseFieldTypeToMongoFieldType({
|
|
303
|
+
type,
|
|
304
|
+
targetClass
|
|
305
|
+
})
|
|
306
|
+
}
|
|
307
|
+
});
|
|
308
|
+
}
|
|
309
|
+
});
|
|
310
|
+
}
|
|
311
|
+
async updateFieldOptions(className, fieldName, fieldType) {
|
|
312
|
+
const {
|
|
313
|
+
...fieldOptions
|
|
314
|
+
} = fieldType;
|
|
315
|
+
delete fieldOptions.type;
|
|
316
|
+
delete fieldOptions.targetClass;
|
|
317
|
+
await this.upsertSchema(className, {
|
|
318
|
+
[fieldName]: {
|
|
319
|
+
$exists: true
|
|
320
|
+
}
|
|
321
|
+
}, {
|
|
322
|
+
$set: {
|
|
323
|
+
[`_metadata.fields_options.${fieldName}`]: fieldOptions
|
|
324
|
+
}
|
|
229
325
|
});
|
|
230
326
|
}
|
|
231
327
|
}
|
|
@@ -234,6 +330,5 @@ class MongoSchemaCollection {
|
|
|
234
330
|
// related logic into the database adapter yet.
|
|
235
331
|
MongoSchemaCollection._TESTmongoSchemaToParseSchema = mongoSchemaToParseSchema;
|
|
236
332
|
MongoSchemaCollection.parseFieldTypeToMongoFieldType = parseFieldTypeToMongoFieldType;
|
|
237
|
-
|
|
238
|
-
exports.default = MongoSchemaCollection;
|
|
239
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9BZGFwdGVycy9TdG9yYWdlL01vbmdvL01vbmdvU2NoZW1hQ29sbGVjdGlvbi5qcyJdLCJuYW1lcyI6WyJtb25nb0ZpZWxkVG9QYXJzZVNjaGVtYUZpZWxkIiwidHlwZSIsInRhcmdldENsYXNzIiwic2xpY2UiLCJzdGFydHNXaXRoIiwibGVuZ3RoIiwibm9uRmllbGRTY2hlbWFLZXlzIiwibW9uZ29TY2hlbWFGaWVsZHNUb1BhcnNlU2NoZW1hRmllbGRzIiwic2NoZW1hIiwiZmllbGROYW1lcyIsIk9iamVjdCIsImtleXMiLCJmaWx0ZXIiLCJrZXkiLCJpbmRleE9mIiwicmVzcG9uc2UiLCJyZWR1Y2UiLCJvYmoiLCJmaWVsZE5hbWUiLCJBQ0wiLCJjcmVhdGVkQXQiLCJ1cGRhdGVkQXQiLCJvYmplY3RJZCIsImVtcHR5Q0xQUyIsImZyZWV6ZSIsImZpbmQiLCJnZXQiLCJjcmVhdGUiLCJ1cGRhdGUiLCJkZWxldGUiLCJhZGRGaWVsZCIsImRlZmF1bHRDTFBTIiwibW9uZ29TY2hlbWFUb1BhcnNlU2NoZW1hIiwibW9uZ29TY2hlbWEiLCJjbHBzIiwiaW5kZXhlcyIsIl9tZXRhZGF0YSIsImNsYXNzX3Blcm1pc3Npb25zIiwiY2xhc3NOYW1lIiwiX2lkIiwiZmllbGRzIiwiY2xhc3NMZXZlbFBlcm1pc3Npb25zIiwiX21vbmdvU2NoZW1hUXVlcnlGcm9tTmFtZVF1ZXJ5IiwibmFtZSIsInF1ZXJ5Iiwib2JqZWN0IiwiZm9yRWFjaCIsInBhcnNlRmllbGRUeXBlVG9Nb25nb0ZpZWxkVHlwZSIsIk1vbmdvU2NoZW1hQ29sbGVjdGlvbiIsImNvbnN0cnVjdG9yIiwiY29sbGVjdGlvbiIsIl9jb2xsZWN0aW9uIiwiX2ZldGNoQWxsU2NoZW1hc0Zyb21fU0NIRU1BIiwiX3Jhd0ZpbmQiLCJ0aGVuIiwic2NoZW1hcyIsIm1hcCIsIl9mZXRjaE9uZVNjaGVtYUZyb21fU0NIRU1BIiwibGltaXQiLCJyZXN1bHRzIiwidW5kZWZpbmVkIiwiZmluZEFuZERlbGV0ZVNjaGVtYSIsIl9tb25nb0NvbGxlY3Rpb24iLCJmaW5kQW5kUmVtb3ZlIiwiaW5zZXJ0U2NoZW1hIiwiaW5zZXJ0T25lIiwicmVzdWx0Iiwib3BzIiwiY2F0Y2giLCJlcnJvciIsImNvZGUiLCJQYXJzZSIsIkVycm9yIiwiRFVQTElDQVRFX1ZBTFVFIiwidXBkYXRlU2NoZW1hIiwidXBkYXRlT25lIiwidXBzZXJ0U2NoZW1hIiwidXBzZXJ0T25lIiwiYWRkRmllbGRJZk5vdEV4aXN0cyIsInNvbWUiLCJleGlzdGluZ0ZpZWxkIiwiSU5DT1JSRUNUX1RZUEUiLCJfVEVTVG1vbmdvU2NoZW1hVG9QYXJzZVNjaGVtYSJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7QUFBQTs7OztBQUNBOzs7Ozs7QUFFQSxTQUFTQSw0QkFBVCxDQUFzQ0MsSUFBdEMsRUFBNEM7QUFDMUMsTUFBSUEsS0FBSyxDQUFMLE1BQVksR0FBaEIsRUFBcUI7QUFDbkIsV0FBTztBQUNMQSxZQUFNLFNBREQ7QUFFTEMsbUJBQWFELEtBQUtFLEtBQUwsQ0FBVyxDQUFYO0FBRlIsS0FBUDtBQUlEO0FBQ0QsTUFBSUYsS0FBS0csVUFBTCxDQUFnQixXQUFoQixDQUFKLEVBQWtDO0FBQ2hDLFdBQU87QUFDTEgsWUFBTSxVQUREO0FBRUxDLG1CQUFhRCxLQUFLRSxLQUFMLENBQVcsWUFBWUUsTUFBdkIsRUFBK0JKLEtBQUtJLE1BQUwsR0FBYyxDQUE3QztBQUZSLEtBQVA7QUFJRDtBQUNELFVBQVFKLElBQVI7QUFDQSxTQUFLLFFBQUw7QUFBaUIsYUFBTyxFQUFDQSxNQUFNLFFBQVAsRUFBUDtBQUNqQixTQUFLLFFBQUw7QUFBaUIsYUFBTyxFQUFDQSxNQUFNLFFBQVAsRUFBUDtBQUNqQixTQUFLLFNBQUw7QUFBaUIsYUFBTyxFQUFDQSxNQUFNLFNBQVAsRUFBUDtBQUNqQixTQUFLLE1BQUw7QUFBaUIsYUFBTyxFQUFDQSxNQUFNLE1BQVAsRUFBUDtBQUNqQixTQUFLLEtBQUw7QUFDQSxTQUFLLFFBQUw7QUFBaUIsYUFBTyxF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LHNCQUFzQmtDLDZCQUF0QixHQUFzRGxELHdCQUF0RDtBQUNBZ0Isc0JBQXNCRCw4QkFBdEIsR0FBdURBLDhCQUF2RDs7a0JBRWVDLHFCIiwiZmlsZSI6Ik1vbmdvU2NoZW1hQ29sbGVjdGlvbi5qcyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBNb25nb0NvbGxlY3Rpb24gZnJvbSAnLi9Nb25nb0NvbGxlY3Rpb24nO1xuaW1wb3J0IFBhcnNlICAgICAgICAgICBmcm9tICdwYXJzZS9ub2RlJztcblxuZnVuY3Rpb24gbW9uZ29GaWVsZFRvUGFyc2VTY2hlbWFGaWVsZCh0eXBlKSB7XG4gIGlmICh0eXBlWzBdID09PSAnKicpIHtcbiAgICByZXR1cm4ge1xuICAgICAgdHlwZTogJ1BvaW50ZXInLFxuICAgICAgdGFyZ2V0Q2xhc3M6IHR5cGUuc2xpY2UoMSksXG4gICAgfTtcbiAgfVxuICBpZiAodHlwZS5zdGFydHNXaXRoKCdyZWxhdGlvbjwnKSkge1xuICAgIHJldHVybiB7XG4gICAgICB0eXBlOiAnUmVsYXRpb24nLFxuICAgICAgdGFyZ2V0Q2xhc3M6IHR5cGUuc2xpY2UoJ3JlbGF0aW9uPCcubGVuZ3RoLCB0eXBlLmxlbmd0aCAtIDEpLFxuICAgIH07XG4gIH1cbiAgc3dpdGNoICh0eXBlKSB7XG4gIGNhc2UgJ251bWJlcic6ICAgcmV0dXJuIHt0eXBlOiAnTnVtYmVyJ307XG4gIGNhc2UgJ3N0cmluZyc6ICAgcmV0dXJuIHt0eXBlOiAnU3RyaW5nJ307XG4gIGNhc2UgJ2Jvb2xlYW4nOiAgcmV0dXJuIHt0eXBlOiAnQm9vbGVhbid9O1xuICBjYXNlICdkYXRlJzogICAgIHJldHVybiB7dHlwZTogJ0RhdGUnfTtcbiAgY2FzZSAnbWFwJzpcbiAgY2FzZSAnb2JqZWN0JzogICByZXR1cm4ge3R5cGU6ICdPYmplY3QnfTtcbiAgY2FzZSAnYXJyYXknOiAgICByZXR1cm4ge3R5cGU6ICdBcnJheSd9O1xuICBjYXNlICdnZW9wb2ludCc6IHJldHVybiB7dHlwZTogJ0dlb1BvaW50J307XG4gIGNhc2UgJ2ZpbGUnOiAgICAgcmV0dXJuIHt0eXBlOiAnRmlsZSd9O1xuICBjYXNlICdieXRlcyc6ICAgIHJldHVybiB7dHlwZTogJ0J5dGVzJ307XG4gIGNhc2UgJ3BvbHlnb24nOiAgcmV0dXJuIHt0eXBlOiAnUG9seWdvbid9O1xuICB9XG59XG5cbmNvbnN0IG5vbkZpZWxkU2NoZW1hS2V5cyA9IFsnX2lkJywgJ19tZXRhZGF0YScsICdfY2xpZW50X3Blcm1pc3Npb25zJ107XG5mdW5jdGlvbiBtb25nb1NjaGVtYUZpZWxkc1RvUGFyc2VTY2hlbWFGaWVsZHMoc2NoZW1hKSB7XG4gIHZhciBmaWVsZE5hbWVzID0gT2JqZWN0LmtleXMoc2NoZW1hKS5maWx0ZXIoa2V5ID0+IG5vbkZpZWxkU2NoZW1hS2V5cy5pbmRleE9mKGtleSkgPT09IC0xKTtcbiAgdmFyIHJlc3BvbnNlID0gZmllbGROYW1lcy5yZWR1Y2UoKG9iaiwgZmllbGROYW1lKSA9PiB7XG4gICAgb2JqW2ZpZWxkTmFtZV0gPSBtb25nb0ZpZWxkVG9QYXJzZVNjaGVtYUZpZWxkKHNjaGVtYVtmaWVsZE5hbWVdKVxuICAgIHJldHVybiBvYmo7XG4gIH0sIHt9KTtcbiAgcmVzcG9uc2UuQUNMID0ge3R5cGU6ICdBQ0wnfTtcbiAgcmVzcG9uc2UuY3JlYXRlZEF0ID0ge3R5cGU6ICdEYXRlJ307XG4gIHJlc3BvbnNlLnVwZGF0ZWRBdCA9IHt0eXBlOiAnRGF0ZSd9O1xuICByZXNwb25zZS5vYmplY3RJZCA9IHt0eXBlOiAnU3RyaW5nJ307XG4gIHJldHVybiByZXNwb25zZTtcbn1cblxuY29uc3QgZW1wdHlDTFBTID0gT2JqZWN0LmZyZWV6ZSh7XG4gIGZpbmQ6IHt9LFxuICBnZXQ6IHt9LFxuICBjcmVhdGU6IHt9LFxuICB1cGRhdGU6IHt9LFxuICBkZWxldGU6IHt9LFxuICBhZGRGaWVsZDoge30sXG59KTtcblxuY29uc3QgZGVmYXVsdENMUFMgPSBPYmplY3QuZnJlZXplKHtcbiAgZmluZDogeycqJzogdHJ1ZX0sXG4gIGdldDogeycqJzogdHJ1ZX0sXG4gIGNyZWF0ZTogeycqJzogdHJ1ZX0sXG4gIHVwZGF0ZTogeycqJzogdHJ1ZX0sXG4gIGRlbGV0ZTogeycqJzogdHJ1ZX0sXG4gIGFkZEZpZWxkOiB7JyonOiB0cnVlfSxcbn0pO1xuXG5mdW5jdGlvbiBtb25nb1NjaGVtYVRvUGFyc2VTY2hlbWEobW9uZ29TY2hlbWEpIHtcbiAgbGV0IGNscHMgPSBkZWZhdWx0Q0xQUztcbiAgbGV0IGluZGV4ZXMgPSB7fVxuICBpZiAobW9uZ29TY2hlbWEuX21ldGFkYXRhKSB7XG4gICAgaWYgKG1vbmdvU2NoZW1hLl9tZXRhZGF0YS5jbGFzc19wZXJtaXNzaW9ucykge1xuICAgICAgY2xwcyA9IHsuLi5lbXB0eUNMUFMsIC4uLm1vbmdvU2NoZW1hLl9tZXRhZGF0YS5jbGFzc19wZXJtaXNzaW9uc307XG4gICAgfVxuICAgIGlmIChtb25nb1NjaGVtYS5fbWV0YWRhdGEuaW5kZXhlcykge1xuICAgICAgaW5kZXhlcyA9IHsuLi5tb25nb1NjaGVtYS5fbWV0YWRhdGEuaW5kZXhlc307XG4gICAgfVxuICB9XG4gIHJldHVybiB7XG4gICAgY2xhc3NOYW1lOiBtb25nb1NjaGVtYS5faWQsXG4gICAgZmllbGRzOiBtb25nb1NjaGVtYUZpZWxkc1RvUGFyc2VTY2hlbWFGaWVsZHMobW9uZ29TY2hlbWEpLFxuICAgIGNsYXNzTGV2ZWxQZXJtaXNzaW9uczogY2xwcyxcbiAgICBpbmRleGVzOiBpbmRleGVzLFxuICB9O1xufVxuXG5mdW5jdGlvbiBfbW9uZ29TY2hlbWFRdWVyeUZyb21OYW1lUXVlcnkobmFtZTogc3RyaW5nLCBxdWVyeSkge1xuICBjb25zdCBvYmplY3QgPSB7IF9pZDogbmFtZSB9O1xuICBpZiAocXVlcnkpIHtcbiAgICBPYmplY3Qua2V5cyhxdWVyeSkuZm9yRWFjaChrZXkgPT4ge1xuICAgICAgb2JqZWN0W2tleV0gPSBxdWVyeVtrZXldO1xuICAgIH0pO1xuICB9XG4gIHJldHVybiBvYmplY3Q7XG59XG5cblxuLy8gUmV0dXJucyBhIHR5cGUgc3VpdGFibGUgZm9yIGluc2VydGluZyBpbnRvIG1vbmdvIF9TQ0hFTUEgY29sbGVjdGlvbi5cbi8vIERvZXMgbm8gdmFsaWRhdGlvbi4gVGhhdCBpcyBleHBlY3RlZCB0byBiZSBkb25lIGluIFBhcnNlIFNlcnZlci5cbmZ1bmN0aW9uIHBhcnNlRmllbGRUeXBlVG9Nb25nb0ZpZWxkVHlwZSh7IHR5cGUsIHRhcmdldENsYXNzIH0pIHtcbiAgc3dpdGNoICh0eXBlKSB7XG4gIGNhc2UgJ1BvaW50ZXInOiAgcmV0dXJuIGAqJHt0YXJnZXRDbGFzc31gO1xuICBjYXNlICdSZWxhdGlvbic6IHJldHVybiBgcmVsYXRpb248JHt0YXJnZXRDbGFzc30+YDtcbiAgY2FzZSAnTnVtYmVyJzogICByZXR1cm4gJ251bWJlcic7XG4gIGNhc2UgJ1N0cmluZyc6ICAgcmV0dXJuICdzdHJpbmcnO1xuICBjYXNlICdCb29sZWFuJzogIHJldHVybiAnYm9vbGVhbic7XG4gIGNhc2UgJ0RhdGUnOiAgICAgcmV0dXJuICdkYXRlJztcbiAgY2FzZSAnT2JqZWN0JzogICByZXR1cm4gJ29iamVjdCc7XG4gIGNhc2UgJ0FycmF5JzogICAgcmV0dXJuICdhcnJheSc7XG4gIGNhc2UgJ0dlb1BvaW50JzogcmV0dXJuICdnZW9wb2ludCc7XG4gIGNhc2UgJ0ZpbGUnOiAgICAgcmV0dXJuICdmaWxlJztcbiAgY2FzZSAnQnl0ZXMnOiAgICByZXR1cm4gJ2J5dGVzJztcbiAgY2FzZSAnUG9seWdvbic6ICByZXR1cm4gJ3BvbHlnb24nO1xuICB9XG59XG5cbmNsYXNzIE1vbmdvU2NoZW1hQ29sbGVjdGlvbiB7XG4gIF9jb2xsZWN0aW9uOiBNb25nb0NvbGxlY3Rpb247XG5cbiAgY29uc3RydWN0b3IoY29sbGVjdGlvbjogTW9uZ29Db2xsZWN0aW9uKSB7XG4gICAgdGhpcy5fY29sbGVjdGlvbiA9IGNvbGxlY3Rpb247XG4gIH1cblxuICBfZmV0Y2hBbGxTY2hlbWFzRnJvbV9TQ0hFTUEoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2NvbGxlY3Rpb24uX3Jhd0ZpbmQoe30pXG4gICAgICAudGhlbihzY2hlbWFzID0+IHNjaGVtYXMubWFwKG1vbmdvU2NoZW1hVG9QYXJzZVNjaGVtYSkpO1xuICB9XG5cbiAgX2ZldGNoT25lU2NoZW1hRnJvbV9TQ0hFTUEobmFtZTogc3RyaW5nKSB7XG4gICAgcmV0dXJuIHRoaXMuX2NvbGxlY3Rpb24uX3Jhd0ZpbmQoX21vbmdvU2NoZW1hUXVlcnlGcm9tTmFtZVF1ZXJ5KG5hbWUpLCB7IGxpbWl0OiAxIH0pLnRoZW4ocmVzdWx0cyA9PiB7XG4gICAgICBpZiAocmVzdWx0cy5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgcmV0dXJuIG1vbmdvU2NoZW1hVG9QYXJzZVNjaGVtYShyZXN1bHRzWzBdKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRocm93IHVuZGVmaW5lZDtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIC8vIEF0b21pY2FsbHkgZmluZCBhbmQgZGVsZXRlIGFuIG9iamVjdCBiYXNlZCBvbiBxdWVyeS5cbiAgZmluZEFuZERlbGV0ZVNjaGVtYShuYW1lOiBzdHJpbmcpIHtcbiAgICByZXR1cm4gdGhpcy5fY29sbGVjdGlvbi5fbW9uZ29Db2xsZWN0aW9uLmZpbmRBbmRSZW1vdmUoX21vbmdvU2NoZW1hUXVlcnlGcm9tTmFtZVF1ZXJ5KG5hbWUpLCBbXSk7XG4gIH1cblxuICBpbnNlcnRTY2hlbWEoc2NoZW1hOiBhbnkpIHtcbiAgICByZXR1cm4gdGhpcy5fY29sbGVjdGlvbi5pbnNlcnRPbmUoc2NoZW1hKVxuICAgICAgLnRoZW4ocmVzdWx0ID0+IG1vbmdvU2NoZW1hVG9QYXJzZVNjaGVtYShyZXN1bHQub3BzWzBdKSlcbiAgICAgIC5jYXRjaChlcnJvciA9PiB7XG4gICAgICAgIGlmIChlcnJvci5jb2RlID09PSAxMTAwMCkgeyAvL01vbmdvJ3MgZHVwbGljYXRlIGtleSBlcnJvclxuICAgICAgICAgIHRocm93IG5ldyBQYXJzZS5FcnJvcihQYXJzZS5FcnJvci5EVVBMSUNBVEVfVkFMVUUsICdDbGFzcyBhbHJlYWR5IGV4aXN0cy4nKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgICAgfVxuICAgICAgfSlcbiAgfVxuXG4gIHVwZGF0ZVNjaGVtYShuYW1lOiBzdHJpbmcsIHVwZGF0ZSkge1xuICAgIHJldHVybiB0aGlzLl9jb2xsZWN0aW9uLnVwZGF0ZU9uZShfbW9uZ29TY2hlbWFRdWVyeUZyb21OYW1lUXVlcnkobmFtZSksIHVwZGF0ZSk7XG4gIH1cblxuICB1cHNlcnRTY2hlbWEobmFtZTogc3RyaW5nLCBxdWVyeTogc3RyaW5nLCB1cGRhdGUpIHtcbiAgICByZXR1cm4gdGhpcy5fY29sbGVjdGlvbi51cHNlcnRPbmUoX21vbmdvU2NoZW1hUXVlcnlGcm9tTmFtZVF1ZXJ5KG5hbWUsIHF1ZXJ5KSwgdXBkYXRlKTtcbiAgfVxuXG4gIC8vIEFkZCBhIGZpZWxkIHRvIHRoZSBzY2hlbWEuIElmIGRhdGFiYXNlIGRvZXMgbm90IHN1cHBvcnQgdGhlIGZpZWxkXG4gIC8vIHR5cGUgKGUuZy4gbW9uZ28gZG9lc24ndCBzdXBwb3J0IG1vcmUgdGhhbiBvbmUgR2VvUG9pbnQgaW4gYSBjbGFzcykgcmVqZWN0IHdpdGggYW4gXCJJbmNvcnJlY3QgVHlwZVwiXG4gIC8vIFBhcnNlIGVycm9yIHdpdGggYSBkZXNjaXB0aXZlIG1lc3NhZ2UuIElmIHRoZSBmaWVsZCBhbHJlYWR5IGV4aXN0cywgdGhpcyBmdW5jdGlvbiBtdXN0XG4gIC8vIG5vdCBtb2RpZnkgdGhlIHNjaGVtYSwgYW5kIG11c3QgcmVqZWN0IHdpdGggRFVQTElDQVRFX1ZBTFVFIGVycm9yLlxuICAvLyBJZiB0aGlzIGlzIGNhbGxlZCBmb3IgYSBjbGFzcyB0aGF0IGRvZXNuJ3QgZXhpc3QsIHRoaXMgZnVuY3Rpb24gbXVzdCBjcmVhdGUgdGhhdCBjbGFzcy5cblxuICAvLyBUT0RPOiB0aHJvdyBhbiBlcnJvciBpZiBhbiB1bnN1cHBvcnRlZCBmaWVsZCB0eXBlIGlzIHBhc3NlZC4gRGVjaWRpbmcgd2hldGhlciBhIHR5cGUgaXMgc3VwcG9ydGVkXG4gIC8vIHNob3VsZCBiZSB0aGUgam9iIG9mIHRoZSBhZGFwdGVyLiBTb21lIGFkYXB0ZXJzIG1heSBub3Qgc3VwcG9ydCBHZW9Qb2ludCBhdCBhbGwuIE90aGVycyBtYXlcbiAgLy8gU3VwcG9ydCBhZGRpdGlvbmFsIHR5cGVzIHRoYXQgTW9uZ28gZG9lc24ndCwgbGlrZSBNb25leSwgb3Igc29tZXRoaW5nLlxuXG4gIC8vIFRPRE86IGRvbid0IHNwZW5kIGFuIGV4dHJhIHF1ZXJ5IG9uIGZpbmRpbmcgdGhlIHNjaGVtYSBpZiB0aGUgdHlwZSB3ZSBhcmUgdHJ5aW5nIHRvIGFkZCBpc24ndCBhIEdlb1BvaW50LlxuICBhZGRGaWVsZElmTm90RXhpc3RzKGNsYXNzTmFtZTogc3RyaW5nLCBmaWVsZE5hbWU6IHN0cmluZywgdHlwZTogc3RyaW5nKSB7XG4gICAgcmV0dXJuIHRoaXMuX2ZldGNoT25lU2NoZW1hRnJvbV9TQ0hFTUEoY2xhc3NOYW1lKVxuICAgICAgLnRoZW4oc2NoZW1hID0+IHtcbiAgICAgICAgLy8gSWYgYSBmaWVsZCB3aXRoIHRoaXMgbmFtZSBhbHJlYWR5IGV4aXN0cywgaXQgd2lsbCBiZSBoYW5kbGVkIGVsc2V3aGVyZS5cbiAgICAgICAgaWYgKHNjaGVtYS5maWVsZHNbZmllbGROYW1lXSAhPSB1bmRlZmluZWQpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgLy8gVGhlIHNjaGVtYSBleGlzdHMuIENoZWNrIGZvciBleGlzdGluZyBHZW9Qb2ludHMuXG4gICAgICAgIGlmICh0eXBlLnR5cGUgPT09ICdHZW9Qb2ludCcpIHtcbiAgICAgICAgLy8gTWFrZSBzdXJlIHRoZXJlIGFyZSBub3Qgb3RoZXIgZ2VvcG9pbnQgZmllbGRzXG4gICAgICAgICAgaWYgKE9iamVjdC5rZXlzKHNjaGVtYS5maWVsZHMpLnNvbWUoZXhpc3RpbmdGaWVsZCA9PiBzY2hlbWEuZmllbGRzW2V4aXN0aW5nRmllbGRdLnR5cGUgPT09ICdHZW9Qb2ludCcpKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgUGFyc2UuRXJyb3IoUGFyc2UuRXJyb3IuSU5DT1JSRUNUX1RZUEUsICdNb25nb0RCIG9ubHkgc3VwcG9ydHMgb25lIEdlb1BvaW50IGZpZWxkIGluIGEgY2xhc3MuJyk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybjtcbiAgICAgIH0sIGVycm9yID0+IHtcbiAgICAgIC8vIElmIGVycm9yIGlzIHVuZGVmaW5lZCwgdGhlIHNjaGVtYSBkb2Vzbid0IGV4aXN0LCBhbmQgd2UgY2FuIGNyZWF0ZSB0aGUgc2NoZW1hIHdpdGggdGhlIGZpZWxkLlxuICAgICAgLy8gSWYgc29tZSBvdGhlciBlcnJvciwgcmVqZWN0IHdpdGggaXQuXG4gICAgICAgIGlmIChlcnJvciA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHRocm93IGVycm9yO1xuICAgICAgfSlcbiAgICAgIC50aGVuKCgpID0+IHtcbiAgICAgIC8vIFdlIHVzZSAkZXhpc3RzIGFuZCAkc2V0IHRvIGF2b2lkIG92ZXJ3cml0aW5nIHRoZSBmaWVsZCB0eXBlIGlmIGl0XG4gICAgICAvLyBhbHJlYWR5IGV4aXN0cy4gKGl0IGNvdWxkIGhhdmUgYWRkZWQgaW5iZXR3ZWVuIHRoZSBsYXN0IHF1ZXJ5IGFuZCB0aGUgdXBkYXRlKVxuICAgICAgICByZXR1cm4gdGhpcy51cHNlcnRTY2hlbWEoXG4gICAgICAgICAgY2xhc3NOYW1lLFxuICAgICAgICAgIHsgW2ZpZWxkTmFtZV06IHsgJyRleGlzdHMnOiBmYWxzZSB9IH0sXG4gICAgICAgICAgeyAnJHNldCcgOiB7IFtmaWVsZE5hbWVdOiBwYXJzZUZpZWxkVHlwZVRvTW9uZ29GaWVsZFR5cGUodHlwZSkgfSB9XG4gICAgICAgICk7XG4gICAgICB9KTtcbiAgfVxufVxuXG4vLyBFeHBvcnRlZCBmb3IgdGVzdGluZyByZWFzb25zIGFuZCBiZWNhdXNlIHdlIGhhdmVuJ3QgbW92ZWQgYWxsIG1vbmdvIHNjaGVtYSBmb3JtYXRcbi8vIHJlbGF0ZWQgbG9naWMgaW50byB0aGUgZGF0YWJhc2UgYWRhcHRlciB5ZXQuXG5Nb25nb1NjaGVtYUNvbGxlY3Rpb24uX1RFU1Rtb25nb1NjaGVtYVRvUGFyc2VTY2hlbWEgPSBtb25nb1NjaGVtYVRvUGFyc2VTY2hlbWFcbk1vbmdvU2NoZW1hQ29sbGVjdGlvbi5wYXJzZUZpZWxkVHlwZVRvTW9uZ29GaWVsZFR5cGUgPSBwYXJzZUZpZWxkVHlwZVRvTW9uZ29GaWVsZFR5cGVcblxuZXhwb3J0IGRlZmF1bHQgTW9uZ29TY2hlbWFDb2xsZWN0aW9uXG4iXX0=
|
|
333
|
+
var _default = exports.default = MongoSchemaCollection;
|
|
334
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfTW9uZ29Db2xsZWN0aW9uIiwiX2ludGVyb3BSZXF1aXJlRGVmYXVsdCIsInJlcXVpcmUiLCJfbm9kZSIsImUiLCJfX2VzTW9kdWxlIiwiZGVmYXVsdCIsIm1vbmdvRmllbGRUb1BhcnNlU2NoZW1hRmllbGQiLCJ0eXBlIiwidGFyZ2V0Q2xhc3MiLCJzbGljZSIsInN0YXJ0c1dpdGgiLCJsZW5ndGgiLCJub25GaWVsZFNjaGVtYUtleXMiLCJtb25nb1NjaGVtYUZpZWxkc1RvUGFyc2VTY2hlbWFGaWVsZHMiLCJzY2hlbWEiLCJmaWVsZE5hbWVzIiwiT2JqZWN0Iiwia2V5cyIsImZpbHRlciIsImtleSIsImluZGV4T2YiLCJyZXNwb25zZSIsInJlZHVjZSIsIm9iaiIsImZpZWxkTmFtZSIsIl9tZXRhZGF0YSIsImZpZWxkc19vcHRpb25zIiwiYXNzaWduIiwiQUNMIiwiY3JlYXRlZEF0IiwidXBkYXRlZEF0Iiwib2JqZWN0SWQiLCJlbXB0eUNMUFMiLCJmcmVlemUiLCJmaW5kIiwiY291bnQiLCJnZXQiLCJjcmVhdGUiLCJ1cGRhdGUiLCJkZWxldGUiLCJhZGRGaWVsZCIsInByb3RlY3RlZEZpZWxkcyIsImRlZmF1bHRDTFBTIiwicmVhZCIsIndyaXRlIiwibW9uZ29TY2hlbWFUb1BhcnNlU2NoZW1hIiwibW9uZ29TY2hlbWEiLCJjbHBzIiwiaW5kZXhlcyIsImNsYXNzX3Blcm1pc3Npb25zIiwiY2xhc3NOYW1lIiwiX2lkIiwiZmllbGRzIiwiY2xhc3NMZXZlbFBlcm1pc3Npb25zIiwiX21vbmdvU2NoZW1hUXVlcnlGcm9tTmFtZVF1ZXJ5IiwibmFtZSIsInF1ZXJ5Iiwib2JqZWN0IiwiZm9yRWFjaCIsInBhcnNlRmllbGRUeXBlVG9Nb25nb0ZpZWxkVHlwZSIsIk1vbmdvU2NoZW1hQ29sbGVjdGlvbiIsImNvbnN0cnVjdG9yIiwiY29sbGVjdGlvbiIsIl9jb2xsZWN0aW9uIiwiX2ZldGNoQWxsU2NoZW1hc0Zyb21fU0NIRU1BIiwiX3Jhd0ZpbmQiLCJ0aGVuIiwic2NoZW1hcyIsIm1hcCIsIl9mZXRjaE9uZVNjaGVtYUZyb21fU0NIRU1BIiwibGltaXQiLCJyZXN1bHRzIiwidW5kZWZpbmVkIiwiZmluZEFuZERlbGV0ZVNjaGVtYSIsIl9tb25nb0NvbGxlY3Rpb24iLCJmaW5kT25lQW5kRGVsZXRlIiwiaW5zZXJ0U2NoZW1hIiwiaW5zZXJ0T25lIiwiY2F0Y2giLCJlcnJvciIsImNvZGUiLCJQYXJzZSIsIkVycm9yIiwiRFVQTElDQVRFX1ZBTFVFIiwidXBkYXRlU2NoZW1hIiwidXBkYXRlT25lIiwidXBzZXJ0U2NoZW1hIiwidXBzZXJ0T25lIiwiYWRkRmllbGRJZk5vdEV4aXN0cyIsImZpZWxkVHlwZSIsInNvbWUiLCJleGlzdGluZ0ZpZWxkIiwiSU5DT1JSRUNUX1RZUEUiLCJmaWVsZE9wdGlvbnMiLCIkZXhpc3RzIiwiJHNldCIsInVwZGF0ZUZpZWxkT3B0aW9ucyIsIl9URVNUbW9uZ29TY2hlbWFUb1BhcnNlU2NoZW1hIiwiX2RlZmF1bHQiLCJleHBvcnRzIl0sInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL0FkYXB0ZXJzL1N0b3JhZ2UvTW9uZ28vTW9uZ29TY2hlbWFDb2xsZWN0aW9uLmpzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBNb25nb0NvbGxlY3Rpb24gZnJvbSAnLi9Nb25nb0NvbGxlY3Rpb24nO1xuaW1wb3J0IFBhcnNlIGZyb20gJ3BhcnNlL25vZGUnO1xuXG5mdW5jdGlvbiBtb25nb0ZpZWxkVG9QYXJzZVNjaGVtYUZpZWxkKHR5cGUpIHtcbiAgaWYgKHR5cGVbMF0gPT09ICcqJykge1xuICAgIHJldHVybiB7XG4gICAgICB0eXBlOiAnUG9pbnRlcicsXG4gICAgICB0YXJnZXRDbGFzczogdHlwZS5zbGljZSgxKSxcbiAgICB9O1xuICB9XG4gIGlmICh0eXBlLnN0YXJ0c1dpdGgoJ3JlbGF0aW9uPCcpKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHR5cGU6ICdSZWxhdGlvbicsXG4gICAgICB0YXJnZXRDbGFzczogdHlwZS5zbGljZSgncmVsYXRpb248Jy5sZW5ndGgsIHR5cGUubGVuZ3RoIC0gMSksXG4gICAgfTtcbiAgfVxuICBzd2l0Y2ggKHR5cGUpIHtcbiAgICBjYXNlICdudW1iZXInOlxuICAgICAgcmV0dXJuIHsgdHlwZTogJ051bWJlcicgfTtcbiAgICBjYXNlICdzdHJpbmcnOlxuICAgICAgcmV0dXJuIHsgdHlwZTogJ1N0cmluZycgfTtcbiAgICBjYXNlICdib29sZWFuJzpcbiAgICAgIHJldHVybiB7IHR5cGU6ICdCb29sZWFuJyB9O1xuICAgIGNhc2UgJ2RhdGUnOlxuICAgICAgcmV0dXJuIHsgdHlwZTogJ0RhdGUnIH07XG4gICAgY2FzZSAnbWFwJzpcbiAgICBjYXNlICdvYmplY3QnOlxuICAgICAgcmV0dXJuIHsgdHlwZTogJ09iamVjdCcgfTtcbiAgICBjYXNlICdhcnJheSc6XG4gICAgICByZXR1cm4geyB0eXBlOiAnQXJyYXknIH07XG4gICAgY2FzZSAnZ2VvcG9pbnQnOlxuICAgICAgcmV0dXJuIHsgdHlwZTogJ0dlb1BvaW50JyB9O1xuICAgIGNhc2UgJ2ZpbGUnOlxuICAgICAgcmV0dXJuIHsgdHlwZTogJ0ZpbGUnIH07XG4gICAgY2FzZSAnYnl0ZXMnOlxuICAgICAgcmV0dXJuIHsgdHlwZTogJ0J5dGVzJyB9O1xuICAgIGNhc2UgJ3BvbHlnb24nOlxuICAgICAgcmV0dXJuIHsgdHlwZTogJ1BvbHlnb24nIH07XG4gIH1cbn1cblxuY29uc3Qgbm9uRmllbGRTY2hlbWFLZXlzID0gWydfaWQnLCAnX21ldGFkYXRhJywgJ19jbGllbnRfcGVybWlzc2lvbnMnXTtcbmZ1bmN0aW9uIG1vbmdvU2NoZW1hRmllbGRzVG9QYXJzZVNjaGVtYUZpZWxkcyhzY2hlbWEpIHtcbiAgdmFyIGZpZWxkTmFtZXMgPSBPYmplY3Qua2V5cyhzY2hlbWEpLmZpbHRlcihrZXkgPT4gbm9uRmllbGRTY2hlbWFLZXlzLmluZGV4T2Yoa2V5KSA9PT0gLTEpO1xuICB2YXIgcmVzcG9uc2UgPSBmaWVsZE5hbWVzLnJlZHVjZSgob2JqLCBmaWVsZE5hbWUpID0+IHtcbiAgICBvYmpbZmllbGROYW1lXSA9IG1vbmdvRmllbGRUb1BhcnNlU2NoZW1hRmllbGQoc2NoZW1hW2ZpZWxkTmFtZV0pO1xuICAgIGlmIChcbiAgICAgIHNjaGVtYS5fbWV0YWRhdGEgJiZcbiAgICAgIHNjaGVtYS5fbWV0YWRhdGEuZmllbGRzX29wdGlvbnMgJiZcbiAgICAgIHNjaGVtYS5fbWV0YWRhdGEuZmllbGRzX29wdGlvbnNbZmllbGROYW1lXVxuICAgICkge1xuICAgICAgb2JqW2ZpZWxkTmFtZV0gPSBPYmplY3QuYXNzaWduKFxuICAgICAgICB7fSxcbiAgICAgICAgb2JqW2ZpZWxkTmFtZV0sXG4gICAgICAgIHNjaGVtYS5fbWV0YWRhdGEuZmllbGRzX29wdGlvbnNbZmllbGROYW1lXVxuICAgICAgKTtcbiAgICB9XG4gICAgcmV0dXJuIG9iajtcbiAgfSwge30pO1xuICByZXNwb25zZS5BQ0wgPSB7IHR5cGU6ICdBQ0wnIH07XG4gIHJlc3BvbnNlLmNyZWF0ZWRBdCA9IHsgdHlwZTogJ0RhdGUnIH07XG4gIHJlc3BvbnNlLnVwZGF0ZWRBdCA9IHsgdHlwZTogJ0RhdGUnIH07XG4gIHJlc3BvbnNlLm9iamVjdElkID0geyB0eXBlOiAnU3RyaW5nJyB9O1xuICByZXR1cm4gcmVzcG9uc2U7XG59XG5cbmNvbnN0IGVtcHR5Q0xQUyA9IE9iamVjdC5mcmVlemUoe1xuICBmaW5kOiB7fSxcbiAgY291bnQ6IHt9LFxuICBnZXQ6IHt9LFxuICBjcmVhdGU6IHt9LFxuICB1cGRhdGU6IHt9LFxuICBkZWxldGU6IHt9LFxuICBhZGRGaWVsZDoge30sXG4gIHByb3RlY3RlZEZpZWxkczoge30sXG59KTtcblxuY29uc3QgZGVmYXVsdENMUFMgPSBPYmplY3QuZnJlZXplKHtcbiAgQUNMOiB7XG4gICAgJyonOiB7XG4gICAgICByZWFkOiB0cnVlLFxuICAgICAgd3JpdGU6IHRydWUsXG4gICAgfSxcbiAgfSxcbiAgZmluZDogeyAnKic6IHRydWUgfSxcbiAgY291bnQ6IHsgJyonOiB0cnVlIH0sXG4gIGdldDogeyAnKic6IHRydWUgfSxcbiAgY3JlYXRlOiB7ICcqJzogdHJ1ZSB9LFxuICB1cGRhdGU6IHsgJyonOiB0cnVlIH0sXG4gIGRlbGV0ZTogeyAnKic6IHRydWUgfSxcbiAgYWRkRmllbGQ6IHsgJyonOiB0cnVlIH0sXG4gIHByb3RlY3RlZEZpZWxkczogeyAnKic6IFtdIH0sXG59KTtcblxuZnVuY3Rpb24gbW9uZ29TY2hlbWFUb1BhcnNlU2NoZW1hKG1vbmdvU2NoZW1hKSB7XG4gIGxldCBjbHBzID0gZGVmYXVsdENMUFM7XG4gIGxldCBpbmRleGVzID0ge307XG4gIGlmIChtb25nb1NjaGVtYS5fbWV0YWRhdGEpIHtcbiAgICBpZiAobW9uZ29TY2hlbWEuX21ldGFkYXRhLmNsYXNzX3Blcm1pc3Npb25zKSB7XG4gICAgICBjbHBzID0geyAuLi5lbXB0eUNMUFMsIC4uLm1vbmdvU2NoZW1hLl9tZXRhZGF0YS5jbGFzc19wZXJtaXNzaW9ucyB9O1xuICAgIH1cbiAgICBpZiAobW9uZ29TY2hlbWEuX21ldGFkYXRhLmluZGV4ZXMpIHtcbiAgICAgIGluZGV4ZXMgPSB7IC4uLm1vbmdvU2NoZW1hLl9tZXRhZGF0YS5pbmRleGVzIH07XG4gICAgfVxuICB9XG4gIHJldHVybiB7XG4gICAgY2xhc3NOYW1lOiBtb25nb1NjaGVtYS5faWQsXG4gICAgZmllbGRzOiBtb25nb1NjaGVtYUZpZWxkc1RvUGFyc2VTY2hlbWFGaWVsZHMobW9uZ29TY2hlbWEpLFxuICAgIGNsYXNzTGV2ZWxQZXJtaXNzaW9uczogY2xwcyxcbiAgICBpbmRleGVzOiBpbmRleGVzLFxuICB9O1xufVxuXG5mdW5jdGlvbiBfbW9uZ29TY2hlbWFRdWVyeUZyb21OYW1lUXVlcnkobmFtZTogc3RyaW5nLCBxdWVyeSkge1xuICBjb25zdCBvYmplY3QgPSB7IF9pZDogbmFtZSB9O1xuICBpZiAocXVlcnkpIHtcbiAgICBPYmplY3Qua2V5cyhxdWVyeSkuZm9yRWFjaChrZXkgPT4ge1xuICAgICAgb2JqZWN0W2tleV0gPSBxdWVyeVtrZXldO1xuICAgIH0pO1xuICB9XG4gIHJldHVybiBvYmplY3Q7XG59XG5cbi8vIFJldHVybnMgYSB0eXBlIHN1aXRhYmxlIGZvciBpbnNlcnRpbmcgaW50byBtb25nbyBfU0NIRU1BIGNvbGxlY3Rpb24uXG4vLyBEb2VzIG5vIHZhbGlkYXRpb24uIFRoYXQgaXMgZXhwZWN0ZWQgdG8gYmUgZG9uZSBpbiBQYXJzZSBTZXJ2ZXIuXG5mdW5jdGlvbiBwYXJzZUZpZWxkVHlwZVRvTW9uZ29GaWVsZFR5cGUoeyB0eXBlLCB0YXJnZXRDbGFzcyB9KSB7XG4gIHN3aXRjaCAodHlwZSkge1xuICAgIGNhc2UgJ1BvaW50ZXInOlxuICAgICAgcmV0dXJuIGAqJHt0YXJnZXRDbGFzc31gO1xuICAgIGNhc2UgJ1JlbGF0aW9uJzpcbiAgICAgIHJldHVybiBgcmVsYXRpb248JHt0YXJnZXRDbGFzc30+YDtcbiAgICBjYXNlICdOdW1iZXInOlxuICAgICAgcmV0dXJuICdudW1iZXInO1xuICAgIGNhc2UgJ1N0cmluZyc6XG4gICAgICByZXR1cm4gJ3N0cmluZyc7XG4gICAgY2FzZSAnQm9vbGVhbic6XG4gICAgICByZXR1cm4gJ2Jvb2xlYW4nO1xuICAgIGNhc2UgJ0RhdGUnOlxuICAgICAgcmV0dXJuICdkYXRlJztcbiAgICBjYXNlICdPYmplY3QnOlxuICAgICAgcmV0dXJuICdvYmplY3QnO1xuICAgIGNhc2UgJ0FycmF5JzpcbiAgICAgIHJldHVybiAnYXJyYXknO1xuICAgIGNhc2UgJ0dlb1BvaW50JzpcbiAgICAgIHJldHVybiAnZ2VvcG9pbnQnO1xuICAgIGNhc2UgJ0ZpbGUnOlxuICAgICAgcmV0dXJuICdmaWxlJztcbiAgICBjYXNlICdCeXRlcyc6XG4gICAgICByZXR1cm4gJ2J5dGVzJztcbiAgICBjYXNlICdQb2x5Z29uJzpcbiAgICAgIHJldHVybiAncG9seWdvbic7XG4gIH1cbn1cblxuY2xhc3MgTW9uZ29TY2hlbWFDb2xsZWN0aW9uIHtcbiAgX2NvbGxlY3Rpb246IE1vbmdvQ29sbGVjdGlvbjtcblxuICBjb25zdHJ1Y3Rvcihjb2xsZWN0aW9uOiBNb25nb0NvbGxlY3Rpb24pIHtcbiAgICB0aGlzLl9jb2xsZWN0aW9uID0gY29sbGVjdGlvbjtcbiAgfVxuXG4gIF9mZXRjaEFsbFNjaGVtYXNGcm9tX1NDSEVNQSgpIHtcbiAgICByZXR1cm4gdGhpcy5fY29sbGVjdGlvbi5fcmF3RmluZCh7fSkudGhlbihzY2hlbWFzID0+IHNjaGVtYXMubWFwKG1vbmdvU2NoZW1hVG9QYXJzZVNjaGVtYSkpO1xuICB9XG5cbiAgX2ZldGNoT25lU2NoZW1hRnJvbV9TQ0hFTUEobmFtZTogc3RyaW5nKSB7XG4gICAgcmV0dXJuIHRoaXMuX2NvbGxlY3Rpb25cbiAgICAgIC5fcmF3RmluZChfbW9uZ29TY2hlbWFRdWVyeUZyb21OYW1lUXVlcnkobmFtZSksIHsgbGltaXQ6IDEgfSlcbiAgICAgIC50aGVuKHJlc3VsdHMgPT4ge1xuICAgICAgICBpZiAocmVzdWx0cy5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgICByZXR1cm4gbW9uZ29TY2hlbWFUb1BhcnNlU2NoZW1hKHJlc3VsdHNbMF0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRocm93IHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gIH1cblxuICAvLyBBdG9taWNhbGx5IGZpbmQgYW5kIGRlbGV0ZSBhbiBvYmplY3QgYmFzZWQgb24gcXVlcnkuXG4gIGZpbmRBbmREZWxldGVTY2hlbWEobmFtZTogc3RyaW5nKSB7XG4gICAgcmV0dXJuIHRoaXMuX2NvbGxlY3Rpb24uX21vbmdvQ29sbGVjdGlvbi5maW5kT25lQW5kRGVsZXRlKF9tb25nb1NjaGVtYVF1ZXJ5RnJvbU5hbWVRdWVyeShuYW1lKSk7XG4gIH1cblxuICBpbnNlcnRTY2hlbWEoc2NoZW1hOiBhbnkpIHtcbiAgICByZXR1cm4gdGhpcy5fY29sbGVjdGlvblxuICAgICAgLmluc2VydE9uZShzY2hlbWEpXG4gICAgICAudGhlbigoKSA9PiBtb25nb1NjaGVtYVRvUGFyc2VTY2hlbWEoc2NoZW1hKSlcbiAgICAgIC5jYXRjaChlcnJvciA9PiB7XG4gICAgICAgIGlmIChlcnJvci5jb2RlID09PSAxMTAwMCkge1xuICAgICAgICAgIC8vTW9uZ28ncyBkdXBsaWNhdGUga2V5IGVycm9yXG4gICAgICAgICAgdGhyb3cgbmV3IFBhcnNlLkVycm9yKFBhcnNlLkVycm9yLkRVUExJQ0FURV9WQUxVRSwgJ0NsYXNzIGFscmVhZHkgZXhpc3RzLicpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRocm93IGVycm9yO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgfVxuXG4gIHVwZGF0ZVNjaGVtYShuYW1lOiBzdHJpbmcsIHVwZGF0ZSkge1xuICAgIHJldHVybiB0aGlzLl9jb2xsZWN0aW9uLnVwZGF0ZU9uZShfbW9uZ29TY2hlbWFRdWVyeUZyb21OYW1lUXVlcnkobmFtZSksIHVwZGF0ZSk7XG4gIH1cblxuICB1cHNlcnRTY2hlbWEobmFtZTogc3RyaW5nLCBxdWVyeTogc3RyaW5nLCB1cGRhdGUpIHtcbiAgICByZXR1cm4gdGhpcy5fY29sbGVjdGlvbi51cHNlcnRPbmUoX21vbmdvU2NoZW1hUXVlcnlGcm9tTmFtZVF1ZXJ5KG5hbWUsIHF1ZXJ5KSwgdXBkYXRlKTtcbiAgfVxuXG4gIC8vIEFkZCBhIGZpZWxkIHRvIHRoZSBzY2hlbWEuIElmIGRhdGFiYXNlIGRvZXMgbm90IHN1cHBvcnQgdGhlIGZpZWxkXG4gIC8vIHR5cGUgKGUuZy4gbW9uZ28gZG9lc24ndCBzdXBwb3J0IG1vcmUgdGhhbiBvbmUgR2VvUG9pbnQgaW4gYSBjbGFzcykgcmVqZWN0IHdpdGggYW4gXCJJbmNvcnJlY3QgVHlwZVwiXG4gIC8vIFBhcnNlIGVycm9yIHdpdGggYSBkZXNjaXB0aXZlIG1lc3NhZ2UuIElmIHRoZSBmaWVsZCBhbHJlYWR5IGV4aXN0cywgdGhpcyBmdW5jdGlvbiBtdXN0XG4gIC8vIG5vdCBtb2RpZnkgdGhlIHNjaGVtYSwgYW5kIG11c3QgcmVqZWN0IHdpdGggRFVQTElDQVRFX1ZBTFVFIGVycm9yLlxuICAvLyBJZiB0aGlzIGlzIGNhbGxlZCBmb3IgYSBjbGFzcyB0aGF0IGRvZXNuJ3QgZXhpc3QsIHRoaXMgZnVuY3Rpb24gbXVzdCBjcmVhdGUgdGhhdCBjbGFzcy5cblxuICAvLyBUT0RPOiB0aHJvdyBhbiBlcnJvciBpZiBhbiB1bnN1cHBvcnRlZCBmaWVsZCB0eXBlIGlzIHBhc3NlZC4gRGVjaWRpbmcgd2hldGhlciBhIHR5cGUgaXMgc3VwcG9ydGVkXG4gIC8vIHNob3VsZCBiZSB0aGUgam9iIG9mIHRoZSBhZGFwdGVyLiBTb21lIGFkYXB0ZXJzIG1heSBub3Qgc3VwcG9ydCBHZW9Qb2ludCBhdCBhbGwuIE90aGVycyBtYXlcbiAgLy8gU3VwcG9ydCBhZGRpdGlvbmFsIHR5cGVzIHRoYXQgTW9uZ28gZG9lc24ndCwgbGlrZSBNb25leSwgb3Igc29tZXRoaW5nLlxuXG4gIC8vIFRPRE86IGRvbid0IHNwZW5kIGFuIGV4dHJhIHF1ZXJ5IG9uIGZpbmRpbmcgdGhlIHNjaGVtYSBpZiB0aGUgdHlwZSB3ZSBhcmUgdHJ5aW5nIHRvIGFkZCBpc24ndCBhIEdlb1BvaW50LlxuICBhZGRGaWVsZElmTm90RXhpc3RzKGNsYXNzTmFtZTogc3RyaW5nLCBmaWVsZE5hbWU6IHN0cmluZywgZmllbGRUeXBlOiBzdHJpbmcpIHtcbiAgICByZXR1cm4gdGhpcy5fZmV0Y2hPbmVTY2hlbWFGcm9tX1NDSEVNQShjbGFzc05hbWUpXG4gICAgICAudGhlbihcbiAgICAgICAgc2NoZW1hID0+IHtcbiAgICAgICAgICAvLyBJZiBhIGZpZWxkIHdpdGggdGhpcyBuYW1lIGFscmVhZHkgZXhpc3RzLCBpdCB3aWxsIGJlIGhhbmRsZWQgZWxzZXdoZXJlLlxuICAgICAgICAgIGlmIChzY2hlbWEuZmllbGRzW2ZpZWxkTmFtZV0gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cbiAgICAgICAgICAvLyBUaGUgc2NoZW1hIGV4aXN0cy4gQ2hlY2sgZm9yIGV4aXN0aW5nIEdlb1BvaW50cy5cbiAgICAgICAgICBpZiAoZmllbGRUeXBlLnR5cGUgPT09ICdHZW9Qb2ludCcpIHtcbiAgICAgICAgICAgIC8vIE1ha2Ugc3VyZSB0aGVyZSBhcmUgbm90IG90aGVyIGdlb3BvaW50IGZpZWxkc1xuICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICBPYmplY3Qua2V5cyhzY2hlbWEuZmllbGRzKS5zb21lKFxuICAgICAgICAgICAgICAgIGV4aXN0aW5nRmllbGQgPT4gc2NoZW1hLmZpZWxkc1tleGlzdGluZ0ZpZWxkXS50eXBlID09PSAnR2VvUG9pbnQnXG4gICAgICAgICAgICAgIClcbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICB0aHJvdyBuZXcgUGFyc2UuRXJyb3IoXG4gICAgICAgICAgICAgICAgUGFyc2UuRXJyb3IuSU5DT1JSRUNUX1RZUEUsXG4gICAgICAgICAgICAgICAgJ01vbmdvREIgb25seSBzdXBwb3J0cyBvbmUgR2VvUG9pbnQgZmllbGQgaW4gYSBjbGFzcy4nXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfSxcbiAgICAgICAgZXJyb3IgPT4ge1xuICAgICAgICAgIC8vIElmIGVycm9yIGlzIHVuZGVmaW5lZCwgdGhlIHNjaGVtYSBkb2Vzbid0IGV4aXN0LCBhbmQgd2UgY2FuIGNyZWF0ZSB0aGUgc2NoZW1hIHdpdGggdGhlIGZpZWxkLlxuICAgICAgICAgIC8vIElmIHNvbWUgb3RoZXIgZXJyb3IsIHJlamVjdCB3aXRoIGl0LlxuICAgICAgICAgIGlmIChlcnJvciA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuICAgICAgICAgIHRocm93IGVycm9yO1xuICAgICAgICB9XG4gICAgICApXG4gICAgICAudGhlbigoKSA9PiB7XG4gICAgICAgIGNvbnN0IHsgdHlwZSwgdGFyZ2V0Q2xhc3MsIC4uLmZpZWxkT3B0aW9ucyB9ID0gZmllbGRUeXBlO1xuICAgICAgICAvLyBXZSB1c2UgJGV4aXN0cyBhbmQgJHNldCB0byBhdm9pZCBvdmVyd3JpdGluZyB0aGUgZmllbGQgdHlwZSBpZiBpdFxuICAgICAgICAvLyBhbHJlYWR5IGV4aXN0cy4gKGl0IGNvdWxkIGhhdmUgYWRkZWQgaW5iZXR3ZWVuIHRoZSBsYXN0IHF1ZXJ5IGFuZCB0aGUgdXBkYXRlKVxuICAgICAgICBpZiAoZmllbGRPcHRpb25zICYmIE9iamVjdC5rZXlzKGZpZWxkT3B0aW9ucykubGVuZ3RoID4gMCkge1xuICAgICAgICAgIHJldHVybiB0aGlzLnVwc2VydFNjaGVtYShcbiAgICAgICAgICAgIGNsYXNzTmFtZSxcbiAgICAgICAgICAgIHsgW2ZpZWxkTmFtZV06IHsgJGV4aXN0czogZmFsc2UgfSB9LFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAkc2V0OiB7XG4gICAgICAgICAgICAgICAgW2ZpZWxkTmFtZV06IHBhcnNlRmllbGRUeXBlVG9Nb25nb0ZpZWxkVHlwZSh7XG4gICAgICAgICAgICAgICAgICB0eXBlLFxuICAgICAgICAgICAgICAgICAgdGFyZ2V0Q2xhc3MsXG4gICAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICAgICAgW2BfbWV0YWRhdGEuZmllbGRzX29wdGlvbnMuJHtmaWVsZE5hbWV9YF06IGZpZWxkT3B0aW9ucyxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH1cbiAgICAgICAgICApO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJldHVybiB0aGlzLnVwc2VydFNjaGVtYShcbiAgICAgICAgICAgIGNsYXNzTmFtZSxcbiAgICAgICAgICAgIHsgW2ZpZWxkTmFtZV06IHsgJGV4aXN0czogZmFsc2UgfSB9LFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAkc2V0OiB7XG4gICAgICAgICAgICAgICAgW2ZpZWxkTmFtZV06IHBhcnNlRmllbGRUeXBlVG9Nb25nb0ZpZWxkVHlwZSh7XG4gICAgICAgICAgICAgICAgICB0eXBlLFxuICAgICAgICAgICAgICAgICAgdGFyZ2V0Q2xhc3MsXG4gICAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9XG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gIH1cblxuICBhc3luYyB1cGRhdGVGaWVsZE9wdGlvbnMoY2xhc3NOYW1lOiBzdHJpbmcsIGZpZWxkTmFtZTogc3RyaW5nLCBmaWVsZFR5cGU6IGFueSkge1xuICAgIGNvbnN0IHsgLi4uZmllbGRPcHRpb25zIH0gPSBmaWVsZFR5cGU7XG4gICAgZGVsZXRlIGZpZWxkT3B0aW9ucy50eXBlO1xuICAgIGRlbGV0ZSBmaWVsZE9wdGlvbnMudGFyZ2V0Q2xhc3M7XG5cbiAgICBhd2FpdCB0aGlzLnVwc2VydFNjaGVtYShcbiAgICAgIGNsYXNzTmFtZSxcbiAgICAgIHsgW2ZpZWxkTmFtZV06IHsgJGV4aXN0czogdHJ1ZSB9IH0sXG4gICAgICB7XG4gICAgICAgICRzZXQ6IHtcbiAgICAgICAgICBbYF9tZXRhZGF0YS5maWVsZHNfb3B0aW9ucy4ke2ZpZWxkTmFtZX1gXTogZmllbGRPcHRpb25zLFxuICAgICAgICB9LFxuICAgICAgfVxuICAgICk7XG4gIH1cbn1cblxuLy8gRXhwb3J0ZWQgZm9yIHRlc3RpbmcgcmVhc29ucyBhbmQgYmVjYXVzZSB3ZSBoYXZlbid0IG1vdmVkIGFsbCBtb25nbyBzY2hlbWEgZm9ybWF0XG4vLyByZWxhdGVkIGxvZ2ljIGludG8gdGhlIGRhdGFiYXNlIGFkYXB0ZXIgeWV0LlxuTW9uZ29TY2hlbWFDb2xsZWN0aW9uLl9URVNUbW9uZ29TY2hlbWFUb1BhcnNlU2NoZW1hID0gbW9uZ29TY2hlbWFUb1BhcnNlU2NoZW1hO1xuTW9uZ29TY2hlbWFDb2xsZWN0aW9uLnBhcnNlRmllbGRUeXBlVG9Nb25nb0ZpZWxkVHlwZSA9IHBhcnNlRmllbGRUeXBlVG9Nb25nb0ZpZWxkVHlwZTtcblxu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
|