@beiguancyc/parse-server 9.9.0-ruixiang.1
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 +176 -0
- package/NOTICE +10 -0
- package/README.md +1311 -0
- package/bin/parse-live-query-server +3 -0
- package/bin/parse-server +3 -0
- package/lib/AccountLockout.js +149 -0
- package/lib/Adapters/AdapterLoader.js +60 -0
- package/lib/Adapters/Analytics/AnalyticsAdapter.js +32 -0
- package/lib/Adapters/Auth/AuthAdapter.js +132 -0
- package/lib/Adapters/Auth/BaseCodeAuthAdapter.js +119 -0
- package/lib/Adapters/Auth/OAuth1Client.js +204 -0
- package/lib/Adapters/Auth/apple.js +125 -0
- package/lib/Adapters/Auth/facebook.js +187 -0
- package/lib/Adapters/Auth/gcenter.js +217 -0
- package/lib/Adapters/Auth/github.js +125 -0
- package/lib/Adapters/Auth/google.js +122 -0
- package/lib/Adapters/Auth/gpgames.js +125 -0
- package/lib/Adapters/Auth/httpsRequest.js +41 -0
- package/lib/Adapters/Auth/index.js +248 -0
- package/lib/Adapters/Auth/instagram.js +118 -0
- package/lib/Adapters/Auth/janraincapture.js +85 -0
- package/lib/Adapters/Auth/janrainengage.js +57 -0
- package/lib/Adapters/Auth/keycloak.js +168 -0
- package/lib/Adapters/Auth/ldap.js +193 -0
- package/lib/Adapters/Auth/line.js +125 -0
- package/lib/Adapters/Auth/linkedin.js +117 -0
- package/lib/Adapters/Auth/meetup.js +44 -0
- package/lib/Adapters/Auth/mfa.js +334 -0
- package/lib/Adapters/Auth/microsoft.js +111 -0
- package/lib/Adapters/Auth/oauth2.js +115 -0
- package/lib/Adapters/Auth/phantauth.js +53 -0
- package/lib/Adapters/Auth/qq.js +113 -0
- package/lib/Adapters/Auth/spotify.js +115 -0
- package/lib/Adapters/Auth/twitter.js +197 -0
- package/lib/Adapters/Auth/utils.js +28 -0
- package/lib/Adapters/Auth/vkontakte.js +55 -0
- package/lib/Adapters/Auth/wechat.js +110 -0
- package/lib/Adapters/Auth/weibo.js +141 -0
- package/lib/Adapters/Cache/CacheAdapter.js +40 -0
- package/lib/Adapters/Cache/InMemoryCache.js +61 -0
- package/lib/Adapters/Cache/InMemoryCacheAdapter.js +34 -0
- package/lib/Adapters/Cache/LRUCache.js +35 -0
- package/lib/Adapters/Cache/NullCacheAdapter.js +26 -0
- package/lib/Adapters/Cache/RedisCacheAdapter.js +109 -0
- package/lib/Adapters/Cache/SchemaCache.js +25 -0
- package/lib/Adapters/Email/MailAdapter.js +32 -0
- package/lib/Adapters/Files/FilesAdapter.js +129 -0
- package/lib/Adapters/Files/GridFSBucketAdapter.js +280 -0
- package/lib/Adapters/Files/GridStoreAdapter.js +5 -0
- package/lib/Adapters/Logger/LoggerAdapter.js +27 -0
- package/lib/Adapters/Logger/WinstonLogger.js +107 -0
- package/lib/Adapters/Logger/WinstonLoggerAdapter.js +63 -0
- package/lib/Adapters/MessageQueue/EventEmitterMQ.js +55 -0
- package/lib/Adapters/PubSub/EventEmitterPubSub.js +53 -0
- package/lib/Adapters/PubSub/PubSubAdapter.js +34 -0
- package/lib/Adapters/PubSub/RedisPubSub.js +49 -0
- package/lib/Adapters/Push/PushAdapter.js +40 -0
- package/lib/Adapters/Storage/Mongo/MongoCollection.js +212 -0
- package/lib/Adapters/Storage/Mongo/MongoSchemaCollection.js +334 -0
- package/lib/Adapters/Storage/Mongo/MongoStorageAdapter.js +1047 -0
- package/lib/Adapters/Storage/Mongo/MongoTransform.js +1397 -0
- package/lib/Adapters/Storage/Postgres/PostgresClient.js +38 -0
- package/lib/Adapters/Storage/Postgres/PostgresConfigParser.js +73 -0
- package/lib/Adapters/Storage/Postgres/PostgresStorageAdapter.js +2409 -0
- package/lib/Adapters/Storage/Postgres/sql/array/add-unique.sql +11 -0
- package/lib/Adapters/Storage/Postgres/sql/array/add.sql +11 -0
- package/lib/Adapters/Storage/Postgres/sql/array/contains-all-regex.sql +14 -0
- package/lib/Adapters/Storage/Postgres/sql/array/contains-all.sql +14 -0
- package/lib/Adapters/Storage/Postgres/sql/array/contains.sql +11 -0
- package/lib/Adapters/Storage/Postgres/sql/array/remove.sql +11 -0
- package/lib/Adapters/Storage/Postgres/sql/index.js +32 -0
- package/lib/Adapters/Storage/Postgres/sql/misc/json-object-set-keys.sql +19 -0
- package/lib/Adapters/Storage/StorageAdapter.js +2 -0
- package/lib/Adapters/WebSocketServer/WSAdapter.js +35 -0
- package/lib/Adapters/WebSocketServer/WSSAdapter.js +66 -0
- package/lib/Auth.js +687 -0
- package/lib/AuthDataLock.js +53 -0
- package/lib/ClientSDK.js +39 -0
- package/lib/Config.js +879 -0
- package/lib/Controllers/AdaptableController.js +72 -0
- package/lib/Controllers/AnalyticsController.js +43 -0
- package/lib/Controllers/CacheController.js +71 -0
- package/lib/Controllers/DatabaseController.js +1685 -0
- package/lib/Controllers/FilesController.js +122 -0
- package/lib/Controllers/HooksController.js +254 -0
- package/lib/Controllers/LiveQueryController.js +72 -0
- package/lib/Controllers/LoggerController.js +222 -0
- package/lib/Controllers/ParseGraphQLController.js +294 -0
- package/lib/Controllers/PushController.js +224 -0
- package/lib/Controllers/SchemaController.js +1563 -0
- package/lib/Controllers/UserController.js +364 -0
- package/lib/Controllers/index.js +251 -0
- package/lib/Controllers/types.js +2 -0
- package/lib/Deprecator/Deprecations.js +100 -0
- package/lib/Deprecator/Deprecator.js +140 -0
- package/lib/Error.js +50 -0
- package/lib/FileUrlValidator.js +69 -0
- package/lib/GraphQL/ParseGraphQLSchema.js +375 -0
- package/lib/GraphQL/ParseGraphQLServer.js +241 -0
- package/lib/GraphQL/helpers/objectsMutations.js +30 -0
- package/lib/GraphQL/helpers/objectsQueries.js +246 -0
- package/lib/GraphQL/helpers/queryComplexity.js +138 -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 +1099 -0
- package/lib/GraphQL/loaders/defaultRelaySchema.js +53 -0
- package/lib/GraphQL/loaders/filesMutations.js +107 -0
- package/lib/GraphQL/loaders/functionsMutations.js +77 -0
- package/lib/GraphQL/loaders/parseClassMutations.js +267 -0
- package/lib/GraphQL/loaders/parseClassQueries.js +126 -0
- package/lib/GraphQL/loaders/parseClassTypes.js +493 -0
- package/lib/GraphQL/loaders/schemaDirectives.js +62 -0
- package/lib/GraphQL/loaders/schemaMutations.js +161 -0
- package/lib/GraphQL/loaders/schemaQueries.js +80 -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 +71 -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 +280 -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/InstallationDedup.js +178 -0
- package/lib/KeyPromiseQueue.js +48 -0
- package/lib/LiveQuery/Client.js +90 -0
- package/lib/LiveQuery/Id.js +20 -0
- package/lib/LiveQuery/ParseCloudCodePublisher.js +54 -0
- package/lib/LiveQuery/ParseLiveQueryServer.js +1071 -0
- package/lib/LiveQuery/ParsePubSub.js +37 -0
- package/lib/LiveQuery/ParseWebSocketServer.js +66 -0
- package/lib/LiveQuery/QueryTools.js +443 -0
- package/lib/LiveQuery/RequestSchema.js +161 -0
- package/lib/LiveQuery/SessionTokenCache.js +51 -0
- package/lib/LiveQuery/Subscription.js +47 -0
- package/lib/LiveQuery/equalObjects.js +50 -0
- package/lib/Options/Definitions.js +1599 -0
- package/lib/Options/docs.js +389 -0
- package/lib/Options/index.js +12 -0
- package/lib/Options/parsers.js +89 -0
- package/lib/Page.js +44 -0
- package/lib/ParseMessageQueue.js +24 -0
- package/lib/ParseServer.js +632 -0
- package/lib/ParseServerRESTController.js +173 -0
- package/lib/PromiseRouter.js +208 -0
- package/lib/Push/PushQueue.js +67 -0
- package/lib/Push/PushWorker.js +101 -0
- package/lib/Push/utils.js +129 -0
- package/lib/RestQuery.js +1208 -0
- package/lib/RestWrite.js +1671 -0
- package/lib/Routers/AggregateRouter.js +150 -0
- package/lib/Routers/AnalyticsRouter.js +26 -0
- package/lib/Routers/AudiencesRouter.js +54 -0
- package/lib/Routers/ClassesRouter.js +191 -0
- package/lib/Routers/CloudCodeRouter.js +87 -0
- package/lib/Routers/FeaturesRouter.js +72 -0
- package/lib/Routers/FilesRouter.js +772 -0
- package/lib/Routers/FunctionsRouter.js +341 -0
- package/lib/Routers/GlobalConfigRouter.js +123 -0
- package/lib/Routers/GraphQLRouter.js +41 -0
- package/lib/Routers/HooksRouter.js +121 -0
- package/lib/Routers/IAPValidationRouter.js +113 -0
- package/lib/Routers/InstallationsRouter.js +46 -0
- package/lib/Routers/LogsRouter.js +57 -0
- package/lib/Routers/PagesRouter.js +676 -0
- package/lib/Routers/PurgeRouter.js +45 -0
- package/lib/Routers/PushRouter.js +75 -0
- package/lib/Routers/RolesRouter.js +33 -0
- package/lib/Routers/SchemasRouter.js +118 -0
- package/lib/Routers/SecurityRouter.js +34 -0
- package/lib/Routers/SessionsRouter.js +126 -0
- package/lib/Routers/UsersRouter.js +733 -0
- 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 +160 -0
- package/lib/Security/CheckGroups/CheckGroups.js +21 -0
- package/lib/Security/CheckRunner.js +213 -0
- package/lib/SharedRest.js +34 -0
- package/lib/StatusHandler.js +329 -0
- package/lib/TestUtils.js +87 -0
- package/lib/Utils.js +577 -0
- package/lib/batch.js +185 -0
- package/lib/cache.js +12 -0
- package/lib/cli/definitions/parse-live-query-server.js +9 -0
- package/lib/cli/definitions/parse-server.js +9 -0
- package/lib/cli/parse-live-query-server.js +14 -0
- package/lib/cli/parse-server.js +101 -0
- package/lib/cli/utils/commander.js +132 -0
- package/lib/cli/utils/runner.js +53 -0
- package/lib/cloud-code/Parse.Cloud.js +797 -0
- package/lib/cloud-code/Parse.Server.js +21 -0
- package/lib/cryptoUtils.js +54 -0
- package/lib/defaults.js +58 -0
- package/lib/deprecated.js +12 -0
- package/lib/index.js +89 -0
- package/lib/logger.js +40 -0
- package/lib/middlewares.js +810 -0
- package/lib/password.js +40 -0
- package/lib/request.js +175 -0
- package/lib/requiredParameter.js +11 -0
- package/lib/rest.js +264 -0
- package/lib/triggers.js +949 -0
- package/lib/vendor/README.md +8 -0
- package/lib/vendor/mongodbUrl.js +1012 -0
- package/package.json +172 -0
- package/postinstall.js +38 -0
- package/public/custom_json.html +17 -0
- package/public/custom_json.json +23 -0
- package/public/custom_page.html +15 -0
- package/public/de/email_verification_link_expired.html +24 -0
- package/public/de/email_verification_link_invalid.html +21 -0
- package/public/de/email_verification_send_fail.html +21 -0
- package/public/de/email_verification_send_success.html +19 -0
- package/public/de/email_verification_success.html +18 -0
- package/public/de/password_reset.html +65 -0
- package/public/de/password_reset_link_invalid.html +19 -0
- package/public/de/password_reset_success.html +18 -0
- package/public/de-AT/email_verification_link_expired.html +24 -0
- package/public/de-AT/email_verification_link_invalid.html +21 -0
- package/public/de-AT/email_verification_send_fail.html +21 -0
- package/public/de-AT/email_verification_send_success.html +19 -0
- package/public/de-AT/email_verification_success.html +18 -0
- package/public/de-AT/password_reset.html +65 -0
- package/public/de-AT/password_reset_link_invalid.html +19 -0
- package/public/de-AT/password_reset_success.html +18 -0
- package/public/email_verification_link_expired.html +24 -0
- package/public/email_verification_link_invalid.html +21 -0
- package/public/email_verification_send_fail.html +21 -0
- package/public/email_verification_send_success.html +19 -0
- package/public/email_verification_success.html +18 -0
- package/public/password_reset.html +65 -0
- package/public/password_reset_link_invalid.html +19 -0
- package/public/password_reset_success.html +18 -0
- 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 +320 -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/views/choose_password +215 -0
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.load = exports.definitions = void 0;
|
|
7
|
+
var _utils = require("@graphql-tools/utils");
|
|
8
|
+
var _FunctionsRouter = require("../../Routers/FunctionsRouter");
|
|
9
|
+
const definitions = exports.definitions = `
|
|
10
|
+
directive @resolve(to: String) on FIELD_DEFINITION
|
|
11
|
+
directive @mock(with: Any!) on FIELD_DEFINITION
|
|
12
|
+
`;
|
|
13
|
+
const load = parseGraphQLSchema => {
|
|
14
|
+
parseGraphQLSchema.graphQLSchemaDirectivesDefinitions = definitions;
|
|
15
|
+
const resolveDirective = schema => (0, _utils.mapSchema)(schema, {
|
|
16
|
+
[_utils.MapperKind.OBJECT_FIELD]: fieldConfig => {
|
|
17
|
+
const directive = (0, _utils.getDirective)(schema, fieldConfig, 'resolve')?.[0];
|
|
18
|
+
if (directive) {
|
|
19
|
+
const {
|
|
20
|
+
to: targetCloudFunction
|
|
21
|
+
} = directive;
|
|
22
|
+
fieldConfig.resolve = async (_source, args, context, gqlInfo) => {
|
|
23
|
+
try {
|
|
24
|
+
const {
|
|
25
|
+
config,
|
|
26
|
+
auth,
|
|
27
|
+
info
|
|
28
|
+
} = context;
|
|
29
|
+
const functionName = targetCloudFunction || gqlInfo.fieldName;
|
|
30
|
+
return (await _FunctionsRouter.FunctionsRouter.handleCloudFunction({
|
|
31
|
+
params: {
|
|
32
|
+
functionName
|
|
33
|
+
},
|
|
34
|
+
config,
|
|
35
|
+
auth,
|
|
36
|
+
info,
|
|
37
|
+
body: args
|
|
38
|
+
})).response.result;
|
|
39
|
+
} catch (e) {
|
|
40
|
+
parseGraphQLSchema.handleError(e);
|
|
41
|
+
}
|
|
42
|
+
};
|
|
43
|
+
}
|
|
44
|
+
return fieldConfig;
|
|
45
|
+
}
|
|
46
|
+
});
|
|
47
|
+
const mockDirective = schema => (0, _utils.mapSchema)(schema, {
|
|
48
|
+
[_utils.MapperKind.OBJECT_FIELD]: fieldConfig => {
|
|
49
|
+
const directive = (0, _utils.getDirective)(schema, fieldConfig, 'mock')?.[0];
|
|
50
|
+
if (directive) {
|
|
51
|
+
const {
|
|
52
|
+
with: mockValue
|
|
53
|
+
} = directive;
|
|
54
|
+
fieldConfig.resolve = async () => mockValue;
|
|
55
|
+
}
|
|
56
|
+
return fieldConfig;
|
|
57
|
+
}
|
|
58
|
+
});
|
|
59
|
+
parseGraphQLSchema.graphQLSchemaDirectives = schema => mockDirective(resolveDirective(schema));
|
|
60
|
+
};
|
|
61
|
+
exports.load = load;
|
|
62
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfdXRpbHMiLCJyZXF1aXJlIiwiX0Z1bmN0aW9uc1JvdXRlciIsImRlZmluaXRpb25zIiwiZXhwb3J0cyIsImxvYWQiLCJwYXJzZUdyYXBoUUxTY2hlbWEiLCJncmFwaFFMU2NoZW1hRGlyZWN0aXZlc0RlZmluaXRpb25zIiwicmVzb2x2ZURpcmVjdGl2ZSIsInNjaGVtYSIsIm1hcFNjaGVtYSIsIk1hcHBlcktpbmQiLCJPQkpFQ1RfRklFTEQiLCJmaWVsZENvbmZpZyIsImRpcmVjdGl2ZSIsImdldERpcmVjdGl2ZSIsInRvIiwidGFyZ2V0Q2xvdWRGdW5jdGlvbiIsInJlc29sdmUiLCJfc291cmNlIiwiYXJncyIsImNvbnRleHQiLCJncWxJbmZvIiwiY29uZmlnIiwiYXV0aCIsImluZm8iLCJmdW5jdGlvbk5hbWUiLCJmaWVsZE5hbWUiLCJGdW5jdGlvbnNSb3V0ZXIiLCJoYW5kbGVDbG91ZEZ1bmN0aW9uIiwicGFyYW1zIiwiYm9keSIsInJlc3BvbnNlIiwicmVzdWx0IiwiZSIsImhhbmRsZUVycm9yIiwibW9ja0RpcmVjdGl2ZSIsIndpdGgiLCJtb2NrVmFsdWUiLCJncmFwaFFMU2NoZW1hRGlyZWN0aXZlcyJdLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9HcmFwaFFML2xvYWRlcnMvc2NoZW1hRGlyZWN0aXZlcy5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBtYXBTY2hlbWEsIGdldERpcmVjdGl2ZSwgTWFwcGVyS2luZCB9IGZyb20gJ0BncmFwaHFsLXRvb2xzL3V0aWxzJztcbmltcG9ydCB7IEZ1bmN0aW9uc1JvdXRlciB9IGZyb20gJy4uLy4uL1JvdXRlcnMvRnVuY3Rpb25zUm91dGVyJztcblxuZXhwb3J0IGNvbnN0IGRlZmluaXRpb25zID0gYFxuICBkaXJlY3RpdmUgQHJlc29sdmUodG86IFN0cmluZykgb24gRklFTERfREVGSU5JVElPTlxuICBkaXJlY3RpdmUgQG1vY2sod2l0aDogQW55ISkgb24gRklFTERfREVGSU5JVElPTlxuYDtcblxuY29uc3QgbG9hZCA9IHBhcnNlR3JhcGhRTFNjaGVtYSA9PiB7XG4gIHBhcnNlR3JhcGhRTFNjaGVtYS5ncmFwaFFMU2NoZW1hRGlyZWN0aXZlc0RlZmluaXRpb25zID0gZGVmaW5pdGlvbnM7XG5cbiAgY29uc3QgcmVzb2x2ZURpcmVjdGl2ZSA9IHNjaGVtYSA9PlxuICAgIG1hcFNjaGVtYShzY2hlbWEsIHtcbiAgICAgIFtNYXBwZXJLaW5kLk9CSkVDVF9GSUVMRF06IGZpZWxkQ29uZmlnID0+IHtcbiAgICAgICAgY29uc3QgZGlyZWN0aXZlID0gZ2V0RGlyZWN0aXZlKHNjaGVtYSwgZmllbGRDb25maWcsICdyZXNvbHZlJyk/LlswXTtcbiAgICAgICAgaWYgKGRpcmVjdGl2ZSkge1xuICAgICAgICAgIGNvbnN0IHsgdG86IHRhcmdldENsb3VkRnVuY3Rpb24gfSA9IGRpcmVjdGl2ZTtcbiAgICAgICAgICBmaWVsZENvbmZpZy5yZXNvbHZlID0gYXN5bmMgKF9zb3VyY2UsIGFyZ3MsIGNvbnRleHQsIGdxbEluZm8pID0+IHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgIGNvbnN0IHsgY29uZmlnLCBhdXRoLCBpbmZvIH0gPSBjb250ZXh0O1xuICAgICAgICAgICAgICBjb25zdCBmdW5jdGlvbk5hbWUgPSB0YXJnZXRDbG91ZEZ1bmN0aW9uIHx8IGdxbEluZm8uZmllbGROYW1lO1xuICAgICAgICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgICAgIGF3YWl0IEZ1bmN0aW9uc1JvdXRlci5oYW5kbGVDbG91ZEZ1bmN0aW9uKHtcbiAgICAgICAgICAgICAgICAgIHBhcmFtczoge1xuICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbk5hbWUsXG4gICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgY29uZmlnLFxuICAgICAgICAgICAgICAgICAgYXV0aCxcbiAgICAgICAgICAgICAgICAgIGluZm8sXG4gICAgICAgICAgICAgICAgICBib2R5OiBhcmdzLFxuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICkucmVzcG9uc2UucmVzdWx0O1xuICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICBwYXJzZUdyYXBoUUxTY2hlbWEuaGFuZGxlRXJyb3IoZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZmllbGRDb25maWc7XG4gICAgICB9LFxuICAgIH0pO1xuXG4gIGNvbnN0IG1vY2tEaXJlY3RpdmUgPSBzY2hlbWEgPT5cbiAgICBtYXBTY2hlbWEoc2NoZW1hLCB7XG4gICAgICBbTWFwcGVyS2luZC5PQkpFQ1RfRklFTERdOiBmaWVsZENvbmZpZyA9PiB7XG4gICAgICAgIGNvbnN0IGRpcmVjdGl2ZSA9IGdldERpcmVjdGl2ZShzY2hlbWEsIGZpZWxkQ29uZmlnLCAnbW9jaycpPy5bMF07XG4gICAgICAgIGlmIChkaXJlY3RpdmUpIHtcbiAgICAgICAgICBjb25zdCB7IHdpdGg6IG1vY2tWYWx1ZSB9ID0gZGlyZWN0aXZlO1xuICAgICAgICAgIGZpZWxkQ29uZmlnLnJlc29sdmUgPSBhc3luYyAoKSA9PiBtb2NrVmFsdWU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZpZWxkQ29uZmlnO1xuICAgICAgfSxcbiAgICB9KTtcblxuICBwYXJzZUdyYXBoUUxTY2hlbWEuZ3JhcGhRTFNjaGVtYURpcmVjdGl2ZXMgPSBzY2hlbWEgPT4gbW9ja0RpcmVjdGl2ZShyZXNvbHZlRGlyZWN0aXZlKHNjaGVtYSkpO1xufTtcbmV4cG9ydCB7IGxvYWQgfTtcbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBQUEsSUFBQUEsTUFBQSxHQUFBQyxPQUFBO0FBQ0EsSUFBQUMsZ0JBQUEsR0FBQUQsT0FBQTtBQUVPLE1BQU1FLFdBQVcsR0FBQUMsT0FBQSxDQUFBRCxXQUFBLEdBQUc7QUFDM0I7QUFDQTtBQUNBLENBQUM7QUFFRCxNQUFNRSxJQUFJLEdBQUdDLGtCQUFrQixJQUFJO0VBQ2pDQSxrQkFBa0IsQ0FBQ0Msa0NBQWtDLEdBQUdKLFdBQVc7RUFFbkUsTUFBTUssZ0JBQWdCLEdBQUdDLE1BQU0sSUFDN0IsSUFBQUMsZ0JBQVMsRUFBQ0QsTUFBTSxFQUFFO0lBQ2hCLENBQUNFLGlCQUFVLENBQUNDLFlBQVksR0FBR0MsV0FBVyxJQUFJO01BQ3hDLE1BQU1DLFNBQVMsR0FBRyxJQUFBQyxtQkFBWSxFQUFDTixNQUFNLEVBQUVJLFdBQVcsRUFBRSxTQUFTLENBQUMsR0FBRyxDQUFDLENBQUM7TUFDbkUsSUFBSUMsU0FBUyxFQUFFO1FBQ2IsTUFBTTtVQUFFRSxFQUFFLEVBQUVDO1FBQW9CLENBQUMsR0FBR0gsU0FBUztRQUM3Q0QsV0FBVyxDQUFDSyxPQUFPLEdBQUcsT0FBT0MsT0FBTyxFQUFFQyxJQUFJLEVBQUVDLE9BQU8sRUFBRUMsT0FBTyxLQUFLO1VBQy9ELElBQUk7WUFDRixNQUFNO2NBQUVDLE1BQU07Y0FBRUMsSUFBSTtjQUFFQztZQUFLLENBQUMsR0FBR0osT0FBTztZQUN0QyxNQUFNSyxZQUFZLEdBQUdULG1CQUFtQixJQUFJSyxPQUFPLENBQUNLLFNBQVM7WUFDN0QsT0FBTyxDQUNMLE1BQU1DLGdDQUFlLENBQUNDLG1CQUFtQixDQUFDO2NBQ3hDQyxNQUFNLEVBQUU7Z0JBQ05KO2NBQ0YsQ0FBQztjQUNESCxNQUFNO2NBQ05DLElBQUk7Y0FDSkMsSUFBSTtjQUNKTSxJQUFJLEVBQUVYO1lBQ1IsQ0FBQyxDQUFDLEVBQ0ZZLFFBQVEsQ0FBQ0MsTUFBTTtVQUNuQixDQUFDLENBQUMsT0FBT0MsQ0FBQyxFQUFFO1lBQ1Y1QixrQkFBa0IsQ0FBQzZCLFdBQVcsQ0FBQ0QsQ0FBQyxDQUFDO1VBQ25DO1FBQ0YsQ0FBQztNQUNIO01BQ0EsT0FBT3JCLFdBQVc7SUFDcEI7RUFDRixDQUFDLENBQUM7RUFFSixNQUFNdUIsYUFBYSxHQUFHM0IsTUFBTSxJQUMxQixJQUFBQyxnQkFBUyxFQUFDRCxNQUFNLEVBQUU7SUFDaEIsQ0FBQ0UsaUJBQVUsQ0FBQ0MsWUFBWSxHQUFHQyxXQUFXLElBQUk7TUFDeEMsTUFBTUMsU0FBUyxHQUFHLElBQUFDLG1CQUFZLEVBQUNOLE1BQU0sRUFBRUksV0FBVyxFQUFFLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQztNQUNoRSxJQUFJQyxTQUFTLEVBQUU7UUFDYixNQUFNO1VBQUV1QixJQUFJLEVBQUVDO1FBQVUsQ0FBQyxHQUFHeEIsU0FBUztRQUNyQ0QsV0FBVyxDQUFDSyxPQUFPLEdBQUcsWUFBWW9CLFNBQVM7TUFDN0M7TUFDQSxPQUFPekIsV0FBVztJQUNwQjtFQUNGLENBQUMsQ0FBQztFQUVKUCxrQkFBa0IsQ0FBQ2lDLHVCQUF1QixHQUFHOUIsTUFBTSxJQUFJMkIsYUFBYSxDQUFDNUIsZ0JBQWdCLENBQUNDLE1BQU0sQ0FBQyxDQUFDO0FBQ2hHLENBQUM7QUFBQ0wsT0FBQSxDQUFBQyxJQUFBLEdBQUFBLElBQUEiLCJpZ25vcmVMaXN0IjpbXX0=
|
|
@@ -0,0 +1,161 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.load = void 0;
|
|
7
|
+
var _node = _interopRequireDefault(require("parse/node"));
|
|
8
|
+
var _graphql = require("graphql");
|
|
9
|
+
var _graphqlRelay = require("graphql-relay");
|
|
10
|
+
var schemaTypes = _interopRequireWildcard(require("./schemaTypes"));
|
|
11
|
+
var _schemaFields = require("../transformers/schemaFields");
|
|
12
|
+
var _parseGraphQLUtils = require("../parseGraphQLUtils");
|
|
13
|
+
var _schemaQueries = require("./schemaQueries");
|
|
14
|
+
var _Error = require("../../Error");
|
|
15
|
+
function _interopRequireWildcard(e, t) { if ("function" == typeof WeakMap) var r = new WeakMap(), n = new WeakMap(); return (_interopRequireWildcard = function (e, t) { if (!t && e && e.__esModule) return e; var o, i, f = { __proto__: null, default: e }; if (null === e || "object" != typeof e && "function" != typeof e) return f; if (o = t ? n : r) { if (o.has(e)) return o.get(e); o.set(e, f); } for (const t in e) "default" !== t && {}.hasOwnProperty.call(e, t) && ((i = (o = Object.defineProperty) && Object.getOwnPropertyDescriptor(e, t)) && (i.get || i.set) ? o(f, t, i) : f[t] = e[t]); return f; })(e, t); }
|
|
16
|
+
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
|
|
17
|
+
const load = parseGraphQLSchema => {
|
|
18
|
+
const createClassMutation = (0, _graphqlRelay.mutationWithClientMutationId)({
|
|
19
|
+
name: 'CreateClass',
|
|
20
|
+
description: 'The createClass mutation can be used to create the schema for a new object class.',
|
|
21
|
+
inputFields: {
|
|
22
|
+
name: schemaTypes.CLASS_NAME_ATT,
|
|
23
|
+
schemaFields: {
|
|
24
|
+
description: "These are the schema's fields of the object class.",
|
|
25
|
+
type: schemaTypes.SCHEMA_FIELDS_INPUT
|
|
26
|
+
}
|
|
27
|
+
},
|
|
28
|
+
outputFields: {
|
|
29
|
+
class: {
|
|
30
|
+
description: 'This is the created class.',
|
|
31
|
+
type: new _graphql.GraphQLNonNull(schemaTypes.CLASS)
|
|
32
|
+
}
|
|
33
|
+
},
|
|
34
|
+
mutateAndGetPayload: async (args, context) => {
|
|
35
|
+
try {
|
|
36
|
+
const {
|
|
37
|
+
name,
|
|
38
|
+
schemaFields
|
|
39
|
+
} = (0, _parseGraphQLUtils.cloneArgs)(args);
|
|
40
|
+
const {
|
|
41
|
+
config,
|
|
42
|
+
auth
|
|
43
|
+
} = context;
|
|
44
|
+
(0, _parseGraphQLUtils.enforceMasterKeyAccess)(auth, config);
|
|
45
|
+
if (auth.isReadOnly) {
|
|
46
|
+
throw (0, _Error.createSanitizedError)(_node.default.Error.OPERATION_FORBIDDEN, "read-only masterKey isn't allowed to create a schema.", config);
|
|
47
|
+
}
|
|
48
|
+
const schema = await config.database.loadSchema({
|
|
49
|
+
clearCache: true
|
|
50
|
+
});
|
|
51
|
+
const parseClass = await schema.addClassIfNotExists(name, (0, _schemaFields.transformToParse)(schemaFields));
|
|
52
|
+
return {
|
|
53
|
+
class: {
|
|
54
|
+
name: parseClass.className,
|
|
55
|
+
schemaFields: (0, _schemaFields.transformToGraphQL)(parseClass.fields)
|
|
56
|
+
}
|
|
57
|
+
};
|
|
58
|
+
} catch (e) {
|
|
59
|
+
parseGraphQLSchema.handleError(e);
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
});
|
|
63
|
+
parseGraphQLSchema.addGraphQLType(createClassMutation.args.input.type.ofType, true, true);
|
|
64
|
+
parseGraphQLSchema.addGraphQLType(createClassMutation.type, true, true);
|
|
65
|
+
parseGraphQLSchema.addGraphQLMutation('createClass', createClassMutation, true, true);
|
|
66
|
+
const updateClassMutation = (0, _graphqlRelay.mutationWithClientMutationId)({
|
|
67
|
+
name: 'UpdateClass',
|
|
68
|
+
description: 'The updateClass mutation can be used to update the schema for an existing object class.',
|
|
69
|
+
inputFields: {
|
|
70
|
+
name: schemaTypes.CLASS_NAME_ATT,
|
|
71
|
+
schemaFields: {
|
|
72
|
+
description: "These are the schema's fields of the object class.",
|
|
73
|
+
type: schemaTypes.SCHEMA_FIELDS_INPUT
|
|
74
|
+
}
|
|
75
|
+
},
|
|
76
|
+
outputFields: {
|
|
77
|
+
class: {
|
|
78
|
+
description: 'This is the updated class.',
|
|
79
|
+
type: new _graphql.GraphQLNonNull(schemaTypes.CLASS)
|
|
80
|
+
}
|
|
81
|
+
},
|
|
82
|
+
mutateAndGetPayload: async (args, context) => {
|
|
83
|
+
try {
|
|
84
|
+
const {
|
|
85
|
+
name,
|
|
86
|
+
schemaFields
|
|
87
|
+
} = (0, _parseGraphQLUtils.cloneArgs)(args);
|
|
88
|
+
const {
|
|
89
|
+
config,
|
|
90
|
+
auth
|
|
91
|
+
} = context;
|
|
92
|
+
(0, _parseGraphQLUtils.enforceMasterKeyAccess)(auth, config);
|
|
93
|
+
if (auth.isReadOnly) {
|
|
94
|
+
throw (0, _Error.createSanitizedError)(_node.default.Error.OPERATION_FORBIDDEN, "read-only masterKey isn't allowed to update a schema.", config);
|
|
95
|
+
}
|
|
96
|
+
const schema = await config.database.loadSchema({
|
|
97
|
+
clearCache: true
|
|
98
|
+
});
|
|
99
|
+
const existingParseClass = await (0, _schemaQueries.getClass)(name, schema);
|
|
100
|
+
const parseClass = await schema.updateClass(name, (0, _schemaFields.transformToParse)(schemaFields, existingParseClass.fields), undefined, undefined, config.database);
|
|
101
|
+
return {
|
|
102
|
+
class: {
|
|
103
|
+
name: parseClass.className,
|
|
104
|
+
schemaFields: (0, _schemaFields.transformToGraphQL)(parseClass.fields)
|
|
105
|
+
}
|
|
106
|
+
};
|
|
107
|
+
} catch (e) {
|
|
108
|
+
parseGraphQLSchema.handleError(e);
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
});
|
|
112
|
+
parseGraphQLSchema.addGraphQLType(updateClassMutation.args.input.type.ofType, true, true);
|
|
113
|
+
parseGraphQLSchema.addGraphQLType(updateClassMutation.type, true, true);
|
|
114
|
+
parseGraphQLSchema.addGraphQLMutation('updateClass', updateClassMutation, true, true);
|
|
115
|
+
const deleteClassMutation = (0, _graphqlRelay.mutationWithClientMutationId)({
|
|
116
|
+
name: 'DeleteClass',
|
|
117
|
+
description: 'The deleteClass mutation can be used to delete an existing object class.',
|
|
118
|
+
inputFields: {
|
|
119
|
+
name: schemaTypes.CLASS_NAME_ATT
|
|
120
|
+
},
|
|
121
|
+
outputFields: {
|
|
122
|
+
class: {
|
|
123
|
+
description: 'This is the deleted class.',
|
|
124
|
+
type: new _graphql.GraphQLNonNull(schemaTypes.CLASS)
|
|
125
|
+
}
|
|
126
|
+
},
|
|
127
|
+
mutateAndGetPayload: async (args, context) => {
|
|
128
|
+
try {
|
|
129
|
+
const {
|
|
130
|
+
name
|
|
131
|
+
} = (0, _parseGraphQLUtils.cloneArgs)(args);
|
|
132
|
+
const {
|
|
133
|
+
config,
|
|
134
|
+
auth
|
|
135
|
+
} = context;
|
|
136
|
+
(0, _parseGraphQLUtils.enforceMasterKeyAccess)(auth, config);
|
|
137
|
+
if (auth.isReadOnly) {
|
|
138
|
+
throw (0, _Error.createSanitizedError)(_node.default.Error.OPERATION_FORBIDDEN, "read-only masterKey isn't allowed to delete a schema.", config);
|
|
139
|
+
}
|
|
140
|
+
const schema = await config.database.loadSchema({
|
|
141
|
+
clearCache: true
|
|
142
|
+
});
|
|
143
|
+
const existingParseClass = await (0, _schemaQueries.getClass)(name, schema);
|
|
144
|
+
await config.database.deleteSchema(name);
|
|
145
|
+
return {
|
|
146
|
+
class: {
|
|
147
|
+
name: existingParseClass.className,
|
|
148
|
+
schemaFields: (0, _schemaFields.transformToGraphQL)(existingParseClass.fields)
|
|
149
|
+
}
|
|
150
|
+
};
|
|
151
|
+
} catch (e) {
|
|
152
|
+
parseGraphQLSchema.handleError(e);
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
});
|
|
156
|
+
parseGraphQLSchema.addGraphQLType(deleteClassMutation.args.input.type.ofType, true, true);
|
|
157
|
+
parseGraphQLSchema.addGraphQLType(deleteClassMutation.type, true, true);
|
|
158
|
+
parseGraphQLSchema.addGraphQLMutation('deleteClass', deleteClassMutation, true, true);
|
|
159
|
+
};
|
|
160
|
+
exports.load = load;
|
|
161
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfbm9kZSIsIl9pbnRlcm9wUmVxdWlyZURlZmF1bHQiLCJyZXF1aXJlIiwiX2dyYXBocWwiLCJfZ3JhcGhxbFJlbGF5Iiwic2NoZW1hVHlwZXMiLCJfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZCIsIl9zY2hlbWFGaWVsZHMiLCJfcGFyc2VHcmFwaFFMVXRpbHMiLCJfc2NoZW1hUXVlcmllcyIsIl9FcnJvciIsImUiLCJ0IiwiV2Vha01hcCIsInIiLCJuIiwiX19lc01vZHVsZSIsIm8iLCJpIiwiZiIsIl9fcHJvdG9fXyIsImRlZmF1bHQiLCJoYXMiLCJnZXQiLCJzZXQiLCJoYXNPd25Qcm9wZXJ0eSIsImNhbGwiLCJPYmplY3QiLCJkZWZpbmVQcm9wZXJ0eSIsImdldE93blByb3BlcnR5RGVzY3JpcHRvciIsImxvYWQiLCJwYXJzZUdyYXBoUUxTY2hlbWEiLCJjcmVhdGVDbGFzc011dGF0aW9uIiwibXV0YXRpb25XaXRoQ2xpZW50TXV0YXRpb25JZCIsIm5hbWUiLCJkZXNjcmlwdGlvbiIsImlucHV0RmllbGRzIiwiQ0xBU1NfTkFNRV9BVFQiLCJzY2hlbWFGaWVsZHMiLCJ0eXBlIiwiU0NIRU1BX0ZJRUxEU19JTlBVVCIsIm91dHB1dEZpZWxkcyIsImNsYXNzIiwiR3JhcGhRTE5vbk51bGwiLCJDTEFTUyIsIm11dGF0ZUFuZEdldFBheWxvYWQiLCJhcmdzIiwiY29udGV4dCIsImNsb25lQXJncyIsImNvbmZpZyIsImF1dGgiLCJlbmZvcmNlTWFzdGVyS2V5QWNjZXNzIiwiaXNSZWFkT25seSIsImNyZWF0ZVNhbml0aXplZEVycm9yIiwiUGFyc2UiLCJFcnJvciIsIk9QRVJBVElPTl9GT1JCSURERU4iLCJzY2hlbWEiLCJkYXRhYmFzZSIsImxvYWRTY2hlbWEiLCJjbGVhckNhY2hlIiwicGFyc2VDbGFzcyIsImFkZENsYXNzSWZOb3RFeGlzdHMiLCJ0cmFuc2Zvcm1Ub1BhcnNlIiwiY2xhc3NOYW1lIiwidHJhbnNmb3JtVG9HcmFwaFFMIiwiZmllbGRzIiwiaGFuZGxlRXJyb3IiLCJhZGRHcmFwaFFMVHlwZSIsImlucHV0Iiwib2ZUeXBlIiwiYWRkR3JhcGhRTE11dGF0aW9uIiwidXBkYXRlQ2xhc3NNdXRhdGlvbiIsImV4aXN0aW5nUGFyc2VDbGFzcyIsImdldENsYXNzIiwidXBkYXRlQ2xhc3MiLCJ1bmRlZmluZWQiLCJkZWxldGVDbGFzc011dGF0aW9uIiwiZGVsZXRlU2NoZW1hIiwiZXhwb3J0cyJdLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9HcmFwaFFML2xvYWRlcnMvc2NoZW1hTXV0YXRpb25zLmpzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBQYXJzZSBmcm9tICdwYXJzZS9ub2RlJztcbmltcG9ydCB7IEdyYXBoUUxOb25OdWxsIH0gZnJvbSAnZ3JhcGhxbCc7XG5cbmltcG9ydCB7IG11dGF0aW9uV2l0aENsaWVudE11dGF0aW9uSWQgfSBmcm9tICdncmFwaHFsLXJlbGF5JztcbmltcG9ydCAqIGFzIHNjaGVtYVR5cGVzIGZyb20gJy4vc2NoZW1hVHlwZXMnO1xuaW1wb3J0IHsgdHJhbnNmb3JtVG9QYXJzZSwgdHJhbnNmb3JtVG9HcmFwaFFMIH0gZnJvbSAnLi4vdHJhbnNmb3JtZXJzL3NjaGVtYUZpZWxkcyc7XG5pbXBvcnQgeyBlbmZvcmNlTWFzdGVyS2V5QWNjZXNzLCBjbG9uZUFyZ3MgfSBmcm9tICcuLi9wYXJzZUdyYXBoUUxVdGlscyc7XG5pbXBvcnQgeyBnZXRDbGFzcyB9IGZyb20gJy4vc2NoZW1hUXVlcmllcyc7XG5pbXBvcnQgeyBjcmVhdGVTYW5pdGl6ZWRFcnJvciB9IGZyb20gJy4uLy4uL0Vycm9yJztcblxuY29uc3QgbG9hZCA9IHBhcnNlR3JhcGhRTFNjaGVtYSA9PiB7XG4gIGNvbnN0IGNyZWF0ZUNsYXNzTXV0YXRpb24gPSBtdXRhdGlvbldpdGhDbGllbnRNdXRhdGlvbklkKHtcbiAgICBuYW1lOiAnQ3JlYXRlQ2xhc3MnLFxuICAgIGRlc2NyaXB0aW9uOlxuICAgICAgJ1RoZSBjcmVhdGVDbGFzcyBtdXRhdGlvbiBjYW4gYmUgdXNlZCB0byBjcmVhdGUgdGhlIHNjaGVtYSBmb3IgYSBuZXcgb2JqZWN0IGNsYXNzLicsXG4gICAgaW5wdXRGaWVsZHM6IHtcbiAgICAgIG5hbWU6IHNjaGVtYVR5cGVzLkNMQVNTX05BTUVfQVRULFxuICAgICAgc2NoZW1hRmllbGRzOiB7XG4gICAgICAgIGRlc2NyaXB0aW9uOiBcIlRoZXNlIGFyZSB0aGUgc2NoZW1hJ3MgZmllbGRzIG9mIHRoZSBvYmplY3QgY2xhc3MuXCIsXG4gICAgICAgIHR5cGU6IHNjaGVtYVR5cGVzLlNDSEVNQV9GSUVMRFNfSU5QVVQsXG4gICAgICB9LFxuICAgIH0sXG4gICAgb3V0cHV0RmllbGRzOiB7XG4gICAgICBjbGFzczoge1xuICAgICAgICBkZXNjcmlwdGlvbjogJ1RoaXMgaXMgdGhlIGNyZWF0ZWQgY2xhc3MuJyxcbiAgICAgICAgdHlwZTogbmV3IEdyYXBoUUxOb25OdWxsKHNjaGVtYVR5cGVzLkNMQVNTKSxcbiAgICAgIH0sXG4gICAgfSxcbiAgICBtdXRhdGVBbmRHZXRQYXlsb2FkOiBhc3luYyAoYXJncywgY29udGV4dCkgPT4ge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgeyBuYW1lLCBzY2hlbWFGaWVsZHMgfSA9IGNsb25lQXJncyhhcmdzKTtcbiAgICAgICAgY29uc3QgeyBjb25maWcsIGF1dGggfSA9IGNvbnRleHQ7XG5cbiAgICAgICAgZW5mb3JjZU1hc3RlcktleUFjY2VzcyhhdXRoLCBjb25maWcpO1xuXG4gICAgICAgIGlmIChhdXRoLmlzUmVhZE9ubHkpIHtcbiAgICAgICAgICB0aHJvdyBjcmVhdGVTYW5pdGl6ZWRFcnJvcihcbiAgICAgICAgICAgIFBhcnNlLkVycm9yLk9QRVJBVElPTl9GT1JCSURERU4sXG4gICAgICAgICAgICBcInJlYWQtb25seSBtYXN0ZXJLZXkgaXNuJ3QgYWxsb3dlZCB0byBjcmVhdGUgYSBzY2hlbWEuXCIsXG4gICAgICAgICAgICBjb25maWdcbiAgICAgICAgICApO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3Qgc2NoZW1hID0gYXdhaXQgY29uZmlnLmRhdGFiYXNlLmxvYWRTY2hlbWEoeyBjbGVhckNhY2hlOiB0cnVlIH0pO1xuICAgICAgICBjb25zdCBwYXJzZUNsYXNzID0gYXdhaXQgc2NoZW1hLmFkZENsYXNzSWZOb3RFeGlzdHMobmFtZSwgdHJhbnNmb3JtVG9QYXJzZShzY2hlbWFGaWVsZHMpKTtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBjbGFzczoge1xuICAgICAgICAgICAgbmFtZTogcGFyc2VDbGFzcy5jbGFzc05hbWUsXG4gICAgICAgICAgICBzY2hlbWFGaWVsZHM6IHRyYW5zZm9ybVRvR3JhcGhRTChwYXJzZUNsYXNzLmZpZWxkcyksXG4gICAgICAgICAgfSxcbiAgICAgICAgfTtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgcGFyc2VHcmFwaFFMU2NoZW1hLmhhbmRsZUVycm9yKGUpO1xuICAgICAgfVxuICAgIH0sXG4gIH0pO1xuXG4gIHBhcnNlR3JhcGhRTFNjaGVtYS5hZGRHcmFwaFFMVHlwZShjcmVhdGVDbGFzc011dGF0aW9uLmFyZ3MuaW5wdXQudHlwZS5vZlR5cGUsIHRydWUsIHRydWUpO1xuICBwYXJzZUdyYXBoUUxTY2hlbWEuYWRkR3JhcGhRTFR5cGUoY3JlYXRlQ2xhc3NNdXRhdGlvbi50eXBlLCB0cnVlLCB0cnVlKTtcbiAgcGFyc2VHcmFwaFFMU2NoZW1hLmFkZEdyYXBoUUxNdXRhdGlvbignY3JlYXRlQ2xhc3MnLCBjcmVhdGVDbGFzc011dGF0aW9uLCB0cnVlLCB0cnVlKTtcblxuICBjb25zdCB1cGRhdGVDbGFzc011dGF0aW9uID0gbXV0YXRpb25XaXRoQ2xpZW50TXV0YXRpb25JZCh7XG4gICAgbmFtZTogJ1VwZGF0ZUNsYXNzJyxcbiAgICBkZXNjcmlwdGlvbjpcbiAgICAgICdUaGUgdXBkYXRlQ2xhc3MgbXV0YXRpb24gY2FuIGJlIHVzZWQgdG8gdXBkYXRlIHRoZSBzY2hlbWEgZm9yIGFuIGV4aXN0aW5nIG9iamVjdCBjbGFzcy4nLFxuICAgIGlucHV0RmllbGRzOiB7XG4gICAgICBuYW1lOiBzY2hlbWFUeXBlcy5DTEFTU19OQU1FX0FUVCxcbiAgICAgIHNjaGVtYUZpZWxkczoge1xuICAgICAgICBkZXNjcmlwdGlvbjogXCJUaGVzZSBhcmUgdGhlIHNjaGVtYSdzIGZpZWxkcyBvZiB0aGUgb2JqZWN0IGNsYXNzLlwiLFxuICAgICAgICB0eXBlOiBzY2hlbWFUeXBlcy5TQ0hFTUFfRklFTERTX0lOUFVULFxuICAgICAgfSxcbiAgICB9LFxuICAgIG91dHB1dEZpZWxkczoge1xuICAgICAgY2xhc3M6IHtcbiAgICAgICAgZGVzY3JpcHRpb246ICdUaGlzIGlzIHRoZSB1cGRhdGVkIGNsYXNzLicsXG4gICAgICAgIHR5cGU6IG5ldyBHcmFwaFFMTm9uTnVsbChzY2hlbWFUeXBlcy5DTEFTUyksXG4gICAgICB9LFxuICAgIH0sXG4gICAgbXV0YXRlQW5kR2V0UGF5bG9hZDogYXN5bmMgKGFyZ3MsIGNvbnRleHQpID0+IHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHsgbmFtZSwgc2NoZW1hRmllbGRzIH0gPSBjbG9uZUFyZ3MoYXJncyk7XG4gICAgICAgIGNvbnN0IHsgY29uZmlnLCBhdXRoIH0gPSBjb250ZXh0O1xuXG4gICAgICAgIGVuZm9yY2VNYXN0ZXJLZXlBY2Nlc3MoYXV0aCwgY29uZmlnKTtcblxuICAgICAgICBpZiAoYXV0aC5pc1JlYWRPbmx5KSB7XG4gICAgICAgICAgdGhyb3cgY3JlYXRlU2FuaXRpemVkRXJyb3IoXG4gICAgICAgICAgICBQYXJzZS5FcnJvci5PUEVSQVRJT05fRk9SQklEREVOLFxuICAgICAgICAgICAgXCJyZWFkLW9ubHkgbWFzdGVyS2V5IGlzbid0IGFsbG93ZWQgdG8gdXBkYXRlIGEgc2NoZW1hLlwiLFxuICAgICAgICAgICAgY29uZmlnXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHNjaGVtYSA9IGF3YWl0IGNvbmZpZy5kYXRhYmFzZS5sb2FkU2NoZW1hKHsgY2xlYXJDYWNoZTogdHJ1ZSB9KTtcbiAgICAgICAgY29uc3QgZXhpc3RpbmdQYXJzZUNsYXNzID0gYXdhaXQgZ2V0Q2xhc3MobmFtZSwgc2NoZW1hKTtcbiAgICAgICAgY29uc3QgcGFyc2VDbGFzcyA9IGF3YWl0IHNjaGVtYS51cGRhdGVDbGFzcyhcbiAgICAgICAgICBuYW1lLFxuICAgICAgICAgIHRyYW5zZm9ybVRvUGFyc2Uoc2NoZW1hRmllbGRzLCBleGlzdGluZ1BhcnNlQ2xhc3MuZmllbGRzKSxcbiAgICAgICAgICB1bmRlZmluZWQsXG4gICAgICAgICAgdW5kZWZpbmVkLFxuICAgICAgICAgIGNvbmZpZy5kYXRhYmFzZVxuICAgICAgICApO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIGNsYXNzOiB7XG4gICAgICAgICAgICBuYW1lOiBwYXJzZUNsYXNzLmNsYXNzTmFtZSxcbiAgICAgICAgICAgIHNjaGVtYUZpZWxkczogdHJhbnNmb3JtVG9HcmFwaFFMKHBhcnNlQ2xhc3MuZmllbGRzKSxcbiAgICAgICAgICB9LFxuICAgICAgICB9O1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBwYXJzZUdyYXBoUUxTY2hlbWEuaGFuZGxlRXJyb3IoZSk7XG4gICAgICB9XG4gICAgfSxcbiAgfSk7XG5cbiAgcGFyc2VHcmFwaFFMU2NoZW1hLmFkZEdyYXBoUUxUeXBlKHVwZGF0ZUNsYXNzTXV0YXRpb24uYXJncy5pbnB1dC50eXBlLm9mVHlwZSwgdHJ1ZSwgdHJ1ZSk7XG4gIHBhcnNlR3JhcGhRTFNjaGVtYS5hZGRHcmFwaFFMVHlwZSh1cGRhdGVDbGFzc011dGF0aW9uLnR5cGUsIHRydWUsIHRydWUpO1xuICBwYXJzZUdyYXBoUUxTY2hlbWEuYWRkR3JhcGhRTE11dGF0aW9uKCd1cGRhdGVDbGFzcycsIHVwZGF0ZUNsYXNzTXV0YXRpb24sIHRydWUsIHRydWUpO1xuXG4gIGNvbnN0IGRlbGV0ZUNsYXNzTXV0YXRpb24gPSBtdXRhdGlvbldpdGhDbGllbnRNdXRhdGlvbklkKHtcbiAgICBuYW1lOiAnRGVsZXRlQ2xhc3MnLFxuICAgIGRlc2NyaXB0aW9uOiAnVGhlIGRlbGV0ZUNsYXNzIG11dGF0aW9uIGNhbiBiZSB1c2VkIHRvIGRlbGV0ZSBhbiBleGlzdGluZyBvYmplY3QgY2xhc3MuJyxcbiAgICBpbnB1dEZpZWxkczoge1xuICAgICAgbmFtZTogc2NoZW1hVHlwZXMuQ0xBU1NfTkFNRV9BVFQsXG4gICAgfSxcbiAgICBvdXRwdXRGaWVsZHM6IHtcbiAgICAgIGNsYXNzOiB7XG4gICAgICAgIGRlc2NyaXB0aW9uOiAnVGhpcyBpcyB0aGUgZGVsZXRlZCBjbGFzcy4nLFxuICAgICAgICB0eXBlOiBuZXcgR3JhcGhRTE5vbk51bGwoc2NoZW1hVHlwZXMuQ0xBU1MpLFxuICAgICAgfSxcbiAgICB9LFxuICAgIG11dGF0ZUFuZEdldFBheWxvYWQ6IGFzeW5jIChhcmdzLCBjb250ZXh0KSA9PiB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCB7IG5hbWUgfSA9IGNsb25lQXJncyhhcmdzKTtcbiAgICAgICAgY29uc3QgeyBjb25maWcsIGF1dGggfSA9IGNvbnRleHQ7XG5cbiAgICAgICAgZW5mb3JjZU1hc3RlcktleUFjY2VzcyhhdXRoLCBjb25maWcpO1xuXG4gICAgICAgIGlmIChhdXRoLmlzUmVhZE9ubHkpIHtcbiAgICAgICAgICB0aHJvdyBjcmVhdGVTYW5pdGl6ZWRFcnJvcihcbiAgICAgICAgICAgIFBhcnNlLkVycm9yLk9QRVJBVElPTl9GT1JCSURERU4sXG4gICAgICAgICAgICBcInJlYWQtb25seSBtYXN0ZXJLZXkgaXNuJ3QgYWxsb3dlZCB0byBkZWxldGUgYSBzY2hlbWEuXCIsXG4gICAgICAgICAgICBjb25maWdcbiAgICAgICAgICApO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3Qgc2NoZW1hID0gYXdhaXQgY29uZmlnLmRhdGFiYXNlLmxvYWRTY2hlbWEoeyBjbGVhckNhY2hlOiB0cnVlIH0pO1xuICAgICAgICBjb25zdCBleGlzdGluZ1BhcnNlQ2xhc3MgPSBhd2FpdCBnZXRDbGFzcyhuYW1lLCBzY2hlbWEpO1xuICAgICAgICBhd2FpdCBjb25maWcuZGF0YWJhc2UuZGVsZXRlU2NoZW1hKG5hbWUpO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIGNsYXNzOiB7XG4gICAgICAgICAgICBuYW1lOiBleGlzdGluZ1BhcnNlQ2xhc3MuY2xhc3NOYW1lLFxuICAgICAgICAgICAgc2NoZW1hRmllbGRzOiB0cmFuc2Zvcm1Ub0dyYXBoUUwoZXhpc3RpbmdQYXJzZUNsYXNzLmZpZWxkcyksXG4gICAgICAgICAgfSxcbiAgICAgICAgfTtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgcGFyc2VHcmFwaFFMU2NoZW1hLmhhbmRsZUVycm9yKGUpO1xuICAgICAgfVxuICAgIH0sXG4gIH0pO1xuXG4gIHBhcnNlR3JhcGhRTFNjaGVtYS5hZGRHcmFwaFFMVHlwZShkZWxldGVDbGFzc011dGF0aW9uLmFyZ3MuaW5wdXQudHlwZS5vZlR5cGUsIHRydWUsIHRydWUpO1xuICBwYXJzZUdyYXBoUUxTY2hlbWEuYWRkR3JhcGhRTFR5cGUoZGVsZXRlQ2xhc3NNdXRhdGlvbi50eXBlLCB0cnVlLCB0cnVlKTtcbiAgcGFyc2VHcmFwaFFMU2NoZW1hLmFkZEdyYXBoUUxNdXRhdGlvbignZGVsZXRlQ2xhc3MnLCBkZWxldGVDbGFzc011dGF0aW9uLCB0cnVlLCB0cnVlKTtcbn07XG5cbmV4cG9ydCB7IGxvYWQgfTtcbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBQUEsSUFBQUEsS0FBQSxHQUFBQyxzQkFBQSxDQUFBQyxPQUFBO0FBQ0EsSUFBQUMsUUFBQSxHQUFBRCxPQUFBO0FBRUEsSUFBQUUsYUFBQSxHQUFBRixPQUFBO0FBQ0EsSUFBQUcsV0FBQSxHQUFBQyx1QkFBQSxDQUFBSixPQUFBO0FBQ0EsSUFBQUssYUFBQSxHQUFBTCxPQUFBO0FBQ0EsSUFBQU0sa0JBQUEsR0FBQU4sT0FBQTtBQUNBLElBQUFPLGNBQUEsR0FBQVAsT0FBQTtBQUNBLElBQUFR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
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.load = exports.getClass = void 0;
|
|
7
|
+
var _node = _interopRequireDefault(require("parse/node"));
|
|
8
|
+
var _graphql = require("graphql");
|
|
9
|
+
var _schemaFields = require("../transformers/schemaFields");
|
|
10
|
+
var schemaTypes = _interopRequireWildcard(require("./schemaTypes"));
|
|
11
|
+
var _parseGraphQLUtils = require("../parseGraphQLUtils");
|
|
12
|
+
function _interopRequireWildcard(e, t) { if ("function" == typeof WeakMap) var r = new WeakMap(), n = new WeakMap(); return (_interopRequireWildcard = function (e, t) { if (!t && e && e.__esModule) return e; var o, i, f = { __proto__: null, default: e }; if (null === e || "object" != typeof e && "function" != typeof e) return f; if (o = t ? n : r) { if (o.has(e)) return o.get(e); o.set(e, f); } for (const t in e) "default" !== t && {}.hasOwnProperty.call(e, t) && ((i = (o = Object.defineProperty) && Object.getOwnPropertyDescriptor(e, t)) && (i.get || i.set) ? o(f, t, i) : f[t] = e[t]); return f; })(e, t); }
|
|
13
|
+
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
|
|
14
|
+
const getClass = async (name, schema) => {
|
|
15
|
+
try {
|
|
16
|
+
return await schema.getOneSchema(name, true);
|
|
17
|
+
} catch (e) {
|
|
18
|
+
if (e === undefined) {
|
|
19
|
+
throw new _node.default.Error(_node.default.Error.INVALID_CLASS_NAME, `Class ${name} does not exist.`);
|
|
20
|
+
} else {
|
|
21
|
+
throw new _node.default.Error(_node.default.Error.INTERNAL_SERVER_ERROR, 'Database adapter error.');
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
};
|
|
25
|
+
exports.getClass = getClass;
|
|
26
|
+
const load = parseGraphQLSchema => {
|
|
27
|
+
parseGraphQLSchema.addGraphQLQuery('class', {
|
|
28
|
+
description: 'The class query can be used to retrieve an existing object class.',
|
|
29
|
+
args: {
|
|
30
|
+
name: schemaTypes.CLASS_NAME_ATT
|
|
31
|
+
},
|
|
32
|
+
type: new _graphql.GraphQLNonNull(schemaTypes.CLASS),
|
|
33
|
+
resolve: async (_source, args, context) => {
|
|
34
|
+
try {
|
|
35
|
+
const {
|
|
36
|
+
name
|
|
37
|
+
} = (0, _parseGraphQLUtils.cloneArgs)(args);
|
|
38
|
+
const {
|
|
39
|
+
config,
|
|
40
|
+
auth
|
|
41
|
+
} = context;
|
|
42
|
+
(0, _parseGraphQLUtils.enforceMasterKeyAccess)(auth, config);
|
|
43
|
+
const schema = await config.database.loadSchema({
|
|
44
|
+
clearCache: true
|
|
45
|
+
});
|
|
46
|
+
const parseClass = await getClass(name, schema);
|
|
47
|
+
return {
|
|
48
|
+
name: parseClass.className,
|
|
49
|
+
schemaFields: (0, _schemaFields.transformToGraphQL)(parseClass.fields)
|
|
50
|
+
};
|
|
51
|
+
} catch (e) {
|
|
52
|
+
parseGraphQLSchema.handleError(e);
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
}, true, true);
|
|
56
|
+
parseGraphQLSchema.addGraphQLQuery('classes', {
|
|
57
|
+
description: 'The classes query can be used to retrieve the existing object classes.',
|
|
58
|
+
type: new _graphql.GraphQLNonNull(new _graphql.GraphQLList(new _graphql.GraphQLNonNull(schemaTypes.CLASS))),
|
|
59
|
+
resolve: async (_source, _args, context) => {
|
|
60
|
+
try {
|
|
61
|
+
const {
|
|
62
|
+
config,
|
|
63
|
+
auth
|
|
64
|
+
} = context;
|
|
65
|
+
(0, _parseGraphQLUtils.enforceMasterKeyAccess)(auth, config);
|
|
66
|
+
const schema = await config.database.loadSchema({
|
|
67
|
+
clearCache: true
|
|
68
|
+
});
|
|
69
|
+
return (await schema.getAllClasses(true)).map(parseClass => ({
|
|
70
|
+
name: parseClass.className,
|
|
71
|
+
schemaFields: (0, _schemaFields.transformToGraphQL)(parseClass.fields)
|
|
72
|
+
}));
|
|
73
|
+
} catch (e) {
|
|
74
|
+
parseGraphQLSchema.handleError(e);
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
}, true, true);
|
|
78
|
+
};
|
|
79
|
+
exports.load = load;
|
|
80
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfbm9kZSIsIl9pbnRlcm9wUmVxdWlyZURlZmF1bHQiLCJyZXF1aXJlIiwiX2dyYXBocWwiLCJfc2NoZW1hRmllbGRzIiwic2NoZW1hVHlwZXMiLCJfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZCIsIl9wYXJzZUdyYXBoUUxVdGlscyIsImUiLCJ0IiwiV2Vha01hcCIsInIiLCJuIiwiX19lc01vZHVsZSIsIm8iLCJpIiwiZiIsIl9fcHJvdG9fXyIsImRlZmF1bHQiLCJoYXMiLCJnZXQiLCJzZXQiLCJoYXNPd25Qcm9wZXJ0eSIsImNhbGwiLCJPYmplY3QiLCJkZWZpbmVQcm9wZXJ0eSIsImdldE93blByb3BlcnR5RGVzY3JpcHRvciIsImdldENsYXNzIiwibmFtZSIsInNjaGVtYSIsImdldE9uZVNjaGVtYSIsInVuZGVmaW5lZCIsIlBhcnNlIiwiRXJyb3IiLCJJTlZBTElEX0NMQVNTX05BTUUiLCJJTlRFUk5BTF9TRVJWRVJfRVJST1IiLCJleHBvcnRzIiwibG9hZCIsInBhcnNlR3JhcGhRTFNjaGVtYSIsImFkZEdyYXBoUUxRdWVyeSIsImRlc2NyaXB0aW9uIiwiYXJncyIsIkNMQVNTX05BTUVfQVRUIiwidHlwZSIsIkdyYXBoUUxOb25OdWxsIiwiQ0xBU1MiLCJyZXNvbHZlIiwiX3NvdXJjZSIsImNvbnRleHQiLCJjbG9uZUFyZ3MiLCJjb25maWciLCJhdXRoIiwiZW5mb3JjZU1hc3RlcktleUFjY2VzcyIsImRhdGFiYXNlIiwibG9hZFNjaGVtYSIsImNsZWFyQ2FjaGUiLCJwYXJzZUNsYXNzIiwiY2xhc3NOYW1lIiwic2NoZW1hRmllbGRzIiwidHJhbnNmb3JtVG9HcmFwaFFMIiwiZmllbGRzIiwiaGFuZGxlRXJyb3IiLCJHcmFwaFFMTGlzdCIsIl9hcmdzIiwiZ2V0QWxsQ2xhc3NlcyIsIm1hcCJdLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9HcmFwaFFML2xvYWRlcnMvc2NoZW1hUXVlcmllcy5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgUGFyc2UgZnJvbSAncGFyc2Uvbm9kZSc7XG5cbmltcG9ydCB7IEdyYXBoUUxOb25OdWxsLCBHcmFwaFFMTGlzdCB9IGZyb20gJ2dyYXBocWwnO1xuaW1wb3J0IHsgdHJhbnNmb3JtVG9HcmFwaFFMIH0gZnJvbSAnLi4vdHJhbnNmb3JtZXJzL3NjaGVtYUZpZWxkcyc7XG5pbXBvcnQgKiBhcyBzY2hlbWFUeXBlcyBmcm9tICcuL3NjaGVtYVR5cGVzJztcbmltcG9ydCB7IGVuZm9yY2VNYXN0ZXJLZXlBY2Nlc3MsIGNsb25lQXJncyB9IGZyb20gJy4uL3BhcnNlR3JhcGhRTFV0aWxzJztcblxuY29uc3QgZ2V0Q2xhc3MgPSBhc3luYyAobmFtZSwgc2NoZW1hKSA9PiB7XG4gIHRyeSB7XG4gICAgcmV0dXJuIGF3YWl0IHNjaGVtYS5nZXRPbmVTY2hlbWEobmFtZSwgdHJ1ZSk7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICBpZiAoZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aHJvdyBuZXcgUGFyc2UuRXJyb3IoUGFyc2UuRXJyb3IuSU5WQUxJRF9DTEFTU19OQU1FLCBgQ2xhc3MgJHtuYW1lfSBkb2VzIG5vdCBleGlzdC5gKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhyb3cgbmV3IFBhcnNlLkVycm9yKFBhcnNlLkVycm9yLklOVEVSTkFMX1NFUlZFUl9FUlJPUiwgJ0RhdGFiYXNlIGFkYXB0ZXIgZXJyb3IuJyk7XG4gICAgfVxuICB9XG59O1xuXG5jb25zdCBsb2FkID0gcGFyc2VHcmFwaFFMU2NoZW1hID0+IHtcbiAgcGFyc2VHcmFwaFFMU2NoZW1hLmFkZEdyYXBoUUxRdWVyeShcbiAgICAnY2xhc3MnLFxuICAgIHtcbiAgICAgIGRlc2NyaXB0aW9uOiAnVGhlIGNsYXNzIHF1ZXJ5IGNhbiBiZSB1c2VkIHRvIHJldHJpZXZlIGFuIGV4aXN0aW5nIG9iamVjdCBjbGFzcy4nLFxuICAgICAgYXJnczoge1xuICAgICAgICBuYW1lOiBzY2hlbWFUeXBlcy5DTEFTU19OQU1FX0FUVCxcbiAgICAgIH0sXG4gICAgICB0eXBlOiBuZXcgR3JhcGhRTE5vbk51bGwoc2NoZW1hVHlwZXMuQ0xBU1MpLFxuICAgICAgcmVzb2x2ZTogYXN5bmMgKF9zb3VyY2UsIGFyZ3MsIGNvbnRleHQpID0+IHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBjb25zdCB7IG5hbWUgfSA9IGNsb25lQXJncyhhcmdzKTtcbiAgICAgICAgICBjb25zdCB7IGNvbmZpZywgYXV0aCB9ID0gY29udGV4dDtcblxuICAgICAgICAgIGVuZm9yY2VNYXN0ZXJLZXlBY2Nlc3MoYXV0aCwgY29uZmlnKTtcblxuICAgICAgICAgIGNvbnN0IHNjaGVtYSA9IGF3YWl0IGNvbmZpZy5kYXRhYmFzZS5sb2FkU2NoZW1hKHsgY2xlYXJDYWNoZTogdHJ1ZSB9KTtcbiAgICAgICAgICBjb25zdCBwYXJzZUNsYXNzID0gYXdhaXQgZ2V0Q2xhc3MobmFtZSwgc2NoZW1hKTtcbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgbmFtZTogcGFyc2VDbGFzcy5jbGFzc05hbWUsXG4gICAgICAgICAgICBzY2hlbWFGaWVsZHM6IHRyYW5zZm9ybVRvR3JhcGhRTChwYXJzZUNsYXNzLmZpZWxkcyksXG4gICAgICAgICAgfTtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgIHBhcnNlR3JhcGhRTFNjaGVtYS5oYW5kbGVFcnJvcihlKTtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICB9LFxuICAgIHRydWUsXG4gICAgdHJ1ZVxuICApO1xuXG4gIHBhcnNlR3JhcGhRTFNjaGVtYS5hZGRHcmFwaFFMUXVlcnkoXG4gICAgJ2NsYXNzZXMnLFxuICAgIHtcbiAgICAgIGRlc2NyaXB0aW9uOiAnVGhlIGNsYXNzZXMgcXVlcnkgY2FuIGJlIHVzZWQgdG8gcmV0cmlldmUgdGhlIGV4aXN0aW5nIG9iamVjdCBjbGFzc2VzLicsXG4gICAgICB0eXBlOiBuZXcgR3JhcGhRTE5vbk51bGwobmV3IEdyYXBoUUxMaXN0KG5ldyBHcmFwaFFMTm9uTnVsbChzY2hlbWFUeXBlcy5DTEFTUykpKSxcbiAgICAgIHJlc29sdmU6IGFzeW5jIChfc291cmNlLCBfYXJncywgY29udGV4dCkgPT4ge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGNvbnN0IHsgY29uZmlnLCBhdXRoIH0gPSBjb250ZXh0O1xuXG4gICAgICAgICAgZW5mb3JjZU1hc3RlcktleUFjY2VzcyhhdXRoLCBjb25maWcpO1xuXG4gICAgICAgICAgY29uc3Qgc2NoZW1hID0gYXdhaXQgY29uZmlnLmRhdGFiYXNlLmxvYWRTY2hlbWEoeyBjbGVhckNhY2hlOiB0cnVlIH0pO1xuICAgICAgICAgIHJldHVybiAoYXdhaXQgc2NoZW1hLmdldEFsbENsYXNzZXModHJ1ZSkpLm1hcChwYXJzZUNsYXNzID0+ICh7XG4gICAgICAgICAgICBuYW1lOiBwYXJzZUNsYXNzLmNsYXNzTmFtZSxcbiAgICAgICAgICAgIHNjaGVtYUZpZWxkczogdHJhbnNmb3JtVG9HcmFwaFFMKHBhcnNlQ2xhc3MuZmllbGRzKSxcbiAgICAgICAgICB9KSk7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICBwYXJzZUdyYXBoUUxTY2hlbWEuaGFuZGxlRXJyb3IoZSk7XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgfSxcbiAgICB0cnVlLFxuICAgIHRydWVcbiAgKTtcbn07XG5cbmV4cG9ydCB7IGdldENsYXNzLCBsb2FkIH07XG4iXSwibWFwcGluZ3MiOiI7Ozs7OztBQUFBLElBQUFBLEtBQUEsR0FBQUMsc0JBQUEsQ0FBQUMsT0FBQTtBQUVBLElBQUFDLFFBQUEsR0FBQUQsT0FBQTtBQUNBLElBQUFFLGFBQUEsR0FBQUYsT0FBQTtBQUNBLElBQUFHLFdBQUEsR0FBQUMsdUJBQUEsQ0FBQUosT0FBQTtBQUNBLElBQUFLLGtCQUFBLEdBQUFMLE9BQUE7QUFBeUUsU0FBQUksd0JBQUFFLENBQUEsRUFBQUMsQ0FBQSw2QkFBQUMsT0FBQSxNQUFBQyxDQUFBLE9BQUFELE9BQUEsSUFBQUUsQ0FBQSxPQUFBRixPQUFBLFlBQUFKLHVCQUFB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
|