@90soft/parse-server-kit 2.5.3 → 2.8.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +613 -424
- package/dist/database/schema.d.ts +14 -0
- package/dist/database/schema.d.ts.map +1 -1
- package/dist/database/schema.js +2 -1
- package/dist/database/schema.js.map +1 -1
- package/dist/database/versionRegistry.d.ts +35 -0
- package/dist/database/versionRegistry.d.ts.map +1 -0
- package/dist/database/versionRegistry.js +153 -0
- package/dist/database/versionRegistry.js.map +1 -0
- package/dist/database/versionedMongoAdapter.d.ts +51 -0
- package/dist/database/versionedMongoAdapter.d.ts.map +1 -0
- package/dist/database/versionedMongoAdapter.js +131 -0
- package/dist/database/versionedMongoAdapter.js.map +1 -0
- package/dist/decorators/cloudRegistry.d.ts.map +1 -1
- package/dist/decorators/cloudRegistry.js +5 -0
- package/dist/decorators/cloudRegistry.js.map +1 -1
- package/dist/decorators/triggerDecorator.d.ts +8 -0
- package/dist/decorators/triggerDecorator.d.ts.map +1 -1
- package/dist/decorators/triggerDecorator.js +10 -1
- package/dist/decorators/triggerDecorator.js.map +1 -1
- package/dist/decorators/triggerRegistry.d.ts.map +1 -1
- package/dist/decorators/triggerRegistry.js +52 -8
- package/dist/decorators/triggerRegistry.js.map +1 -1
- package/dist/decorators/types/triggerTypes.d.ts +1 -1
- package/dist/decorators/types/triggerTypes.d.ts.map +1 -1
- package/dist/index.d.ts +8 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +30 -2
- package/dist/index.js.map +1 -1
- package/dist/middleware/middleware.d.ts.map +1 -1
- package/dist/middleware/middleware.js +34 -1
- package/dist/middleware/middleware.js.map +1 -1
- package/dist/middleware/rateLimit.d.ts.map +1 -1
- package/dist/middleware/rateLimit.js +7 -1
- package/dist/middleware/rateLimit.js.map +1 -1
- package/dist/swagger/index.d.ts +5 -1
- package/dist/swagger/index.d.ts.map +1 -1
- package/dist/swagger/index.js +32 -8
- package/dist/swagger/index.js.map +1 -1
- package/dist/transactions/ambientSession.d.ts +39 -0
- package/dist/transactions/ambientSession.d.ts.map +1 -0
- package/dist/transactions/ambientSession.js +88 -0
- package/dist/transactions/ambientSession.js.map +1 -0
- package/dist/transactions/context.d.ts +86 -0
- package/dist/transactions/context.d.ts.map +1 -0
- package/dist/transactions/context.js +124 -0
- package/dist/transactions/context.js.map +1 -0
- package/dist/utils/dynamicImport.d.ts +22 -1
- package/dist/utils/dynamicImport.d.ts.map +1 -1
- package/dist/utils/dynamicImport.js +13 -4
- package/dist/utils/dynamicImport.js.map +1 -1
- package/dist/utils/helper.d.ts +10 -1
- package/dist/utils/helper.d.ts.map +1 -1
- package/dist/utils/helper.js +10 -1
- package/dist/utils/helper.js.map +1 -1
- package/dist/utils/imageAcl.d.ts +28 -0
- package/dist/utils/imageAcl.d.ts.map +1 -0
- package/dist/utils/imageAcl.js +74 -0
- package/dist/utils/imageAcl.js.map +1 -0
- package/package.json +75 -54
|
@@ -1,6 +1,27 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.TriggerRegistry = void 0;
|
|
4
|
+
/**
|
|
5
|
+
* Triggers on Parse's own built-in entities.
|
|
6
|
+
*
|
|
7
|
+
* These are not registered by class *name* — parse-server wants the class
|
|
8
|
+
* itself, and maps it internally to a reserved name (`@File`, `@Config`). It
|
|
9
|
+
* used to expose a dedicated method per file trigger (`beforeSaveFile` and
|
|
10
|
+
* friends); those were removed, and calling them on parse-server 9 throws
|
|
11
|
+
* `TypeError: not a function`. The class-argument form is the supported one.
|
|
12
|
+
*
|
|
13
|
+
* Resolved lazily, inside `initialize()`: `Parse` is a global supplied by
|
|
14
|
+
* parse-server, and reading it at module load would break importing the kit
|
|
15
|
+
* before the server is up.
|
|
16
|
+
*/
|
|
17
|
+
function builtInTarget(type) {
|
|
18
|
+
const P = Parse;
|
|
19
|
+
if (type.endsWith('File'))
|
|
20
|
+
return P.File;
|
|
21
|
+
if (type.endsWith('Config'))
|
|
22
|
+
return P.Config;
|
|
23
|
+
return undefined;
|
|
24
|
+
}
|
|
4
25
|
class TriggerRegistry {
|
|
5
26
|
static getKey(className, type) {
|
|
6
27
|
return `${className}:${type}`;
|
|
@@ -27,6 +48,11 @@ class TriggerRegistry {
|
|
|
27
48
|
console.log(`[Triggers] Registering ${triggers.length} trigger(s)...`);
|
|
28
49
|
for (const metadata of triggers) {
|
|
29
50
|
const { type, className, handler, validation } = metadata;
|
|
51
|
+
const Cloud = Parse.Cloud;
|
|
52
|
+
// For a built-in entity the "class" is Parse.File / Parse.Config itself;
|
|
53
|
+
// for everything else it is the registered class name.
|
|
54
|
+
const target = builtInTarget(type) ?? className;
|
|
55
|
+
const label = target === className ? className : type.replace(/^(before|after)/, '');
|
|
30
56
|
switch (type) {
|
|
31
57
|
case 'beforeSave':
|
|
32
58
|
Parse.Cloud.beforeSave(className, handler, validation);
|
|
@@ -55,29 +81,47 @@ class TriggerRegistry {
|
|
|
55
81
|
case 'afterLogout':
|
|
56
82
|
Parse.Cloud.afterLogout(handler, validation);
|
|
57
83
|
break;
|
|
84
|
+
case 'beforePasswordResetRequest':
|
|
85
|
+
Cloud.beforePasswordResetRequest(handler, validation);
|
|
86
|
+
break;
|
|
87
|
+
// File triggers — the class-argument form. The old dedicated methods
|
|
88
|
+
// (`beforeSaveFile` etc.) no longer exist on parse-server 9.
|
|
58
89
|
case 'beforeSaveFile':
|
|
59
|
-
|
|
90
|
+
Cloud.beforeSave(target, handler, validation);
|
|
60
91
|
break;
|
|
61
92
|
case 'afterSaveFile':
|
|
62
|
-
|
|
93
|
+
Cloud.afterSave(target, handler, validation);
|
|
63
94
|
break;
|
|
64
95
|
case 'beforeDeleteFile':
|
|
65
|
-
|
|
96
|
+
Cloud.beforeDelete(target, handler, validation);
|
|
66
97
|
break;
|
|
67
98
|
case 'afterDeleteFile':
|
|
68
|
-
|
|
99
|
+
Cloud.afterDelete(target, handler, validation);
|
|
100
|
+
break;
|
|
101
|
+
case 'beforeFindFile':
|
|
102
|
+
Cloud.beforeFind(target, handler, validation);
|
|
103
|
+
break;
|
|
104
|
+
case 'afterFindFile':
|
|
105
|
+
Cloud.afterFind(target, handler, validation);
|
|
106
|
+
break;
|
|
107
|
+
// Parse Config triggers — same class-argument form.
|
|
108
|
+
case 'beforeSaveConfig':
|
|
109
|
+
Cloud.beforeSave(target, handler, validation);
|
|
110
|
+
break;
|
|
111
|
+
case 'afterSaveConfig':
|
|
112
|
+
Cloud.afterSave(target, handler, validation);
|
|
69
113
|
break;
|
|
70
114
|
case 'beforeConnect':
|
|
71
|
-
|
|
115
|
+
Cloud.beforeConnect(handler, validation);
|
|
72
116
|
break;
|
|
73
117
|
case 'beforeSubscribe':
|
|
74
|
-
|
|
118
|
+
Cloud.beforeSubscribe(className, handler, validation);
|
|
75
119
|
break;
|
|
76
120
|
case 'afterEvent':
|
|
77
|
-
|
|
121
|
+
Cloud.afterLiveQueryEvent(className, handler, validation);
|
|
78
122
|
break;
|
|
79
123
|
}
|
|
80
|
-
console.log(`[Triggers] Registered ${type} for: ${
|
|
124
|
+
console.log(`[Triggers] Registered ${type} for: ${label}`);
|
|
81
125
|
}
|
|
82
126
|
console.log('[Triggers] All triggers registered');
|
|
83
127
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"triggerRegistry.js","sourceRoot":"","sources":["../../src/decorators/triggerRegistry.ts"],"names":[],"mappings":";;;AAEA,MAAa,eAAe;IAGlB,MAAM,CAAC,MAAM,CAAC,SAAiB,EAAE,IAAiB;QACxD,OAAO,GAAG,SAAS,IAAI,IAAI,EAAE,CAAC;IAChC,CAAC;IAED,MAAM,CAAC,QAAQ,CAAC,QAAyB;QACvC,MAAM,GAAG,GAAG,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,SAAS,EAAE,QAAQ,CAAC,IAAI,CAAC,CAAC;QAC3D,IAAI,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;YAC3B,OAAO,CAAC,IAAI,CAAC,4CAA4C,QAAQ,CAAC,IAAI,gBAAgB,QAAQ,CAAC,SAAS,EAAE,CAAC,CAAC;QAC9G,CAAC;QACD,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;IACnC,CAAC;IAED,MAAM,CAAC,WAAW;QAChB,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC;IAC5C,CAAC;IAED,MAAM,CAAC,mBAAmB,CAAC,SAAiB;QAC1C,OAAO,IAAI,CAAC,WAAW,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,SAAS,KAAK,SAAS,CAAC,CAAC;IACnE,CAAC;IAED,MAAM,CAAC,UAAU;QACf,MAAM,QAAQ,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC;QACpC,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC1B,OAAO,CAAC,GAAG,CAAC,oCAAoC,CAAC,CAAC;YAClD,OAAO;QACT,CAAC;QAED,OAAO,CAAC,GAAG,CAAC,0BAA0B,QAAQ,CAAC,MAAM,gBAAgB,CAAC,CAAC;QAEvE,KAAK,MAAM,QAAQ,IAAI,QAAQ,EAAE,CAAC;YAChC,MAAM,EAAC,IAAI,EAAE,SAAS,EAAE,OAAO,EAAE,UAAU,EAAC,GAAG,QAAQ,CAAC;
|
|
1
|
+
{"version":3,"file":"triggerRegistry.js","sourceRoot":"","sources":["../../src/decorators/triggerRegistry.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { ClassNameType } from './schemaTypes';
|
|
2
|
-
export type TriggerType = 'beforeSave' | 'afterSave' | 'beforeDelete' | 'afterDelete' | 'beforeFind' | 'afterFind' | 'beforeLogin' | 'afterLogin' | 'afterLogout' | 'beforeSaveFile' | 'afterSaveFile' | 'beforeDeleteFile' | 'afterDeleteFile' | 'beforeConnect' | 'beforeSubscribe' | 'afterEvent';
|
|
2
|
+
export type TriggerType = 'beforeSave' | 'afterSave' | 'beforeDelete' | 'afterDelete' | 'beforeFind' | 'afterFind' | 'beforeLogin' | 'afterLogin' | 'afterLogout' | 'beforePasswordResetRequest' | 'beforeSaveFile' | 'afterSaveFile' | 'beforeDeleteFile' | 'afterDeleteFile' | 'beforeFindFile' | 'afterFindFile' | 'beforeSaveConfig' | 'afterSaveConfig' | 'beforeConnect' | 'beforeSubscribe' | 'afterEvent';
|
|
3
3
|
export interface TriggerMetadata {
|
|
4
4
|
type: TriggerType;
|
|
5
5
|
className: ClassNameType;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"triggerTypes.d.ts","sourceRoot":"","sources":["../../../src/decorators/types/triggerTypes.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,aAAa,EAAC,MAAM,eAAe,CAAC;AAE5C,MAAM,MAAM,WAAW,GACnB,YAAY,GAAG,WAAW,GAAG,cAAc,GAAG,aAAa,GAC3D,YAAY,GAAG,WAAW,GAC1B,aAAa,GAAG,YAAY,GAAG,aAAa,
|
|
1
|
+
{"version":3,"file":"triggerTypes.d.ts","sourceRoot":"","sources":["../../../src/decorators/types/triggerTypes.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,aAAa,EAAC,MAAM,eAAe,CAAC;AAE5C,MAAM,MAAM,WAAW,GACnB,YAAY,GAAG,WAAW,GAAG,cAAc,GAAG,aAAa,GAC3D,YAAY,GAAG,WAAW,GAC1B,aAAa,GAAG,YAAY,GAAG,aAAa,GAAG,4BAA4B,GAC3E,gBAAgB,GAAG,eAAe,GAAG,kBAAkB,GAAG,iBAAiB,GAC3E,gBAAgB,GAAG,eAAe,GAClC,kBAAkB,GAAG,iBAAiB,GACtC,eAAe,GAAG,iBAAiB,GAAG,YAAY,CAAC;AAEvD,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,WAAW,CAAC;IAClB,SAAS,EAAE,aAAa,CAAC;IACzB,OAAO,EAAE,QAAQ,CAAC;IAClB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,UAAU,CAAC,EAAE,KAAK,CAAC,KAAK,CAAC,SAAS,CAAC;CACpC;AAED,MAAM,WAAW,aAAa;IAC5B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,UAAU,CAAC,EAAE,KAAK,CAAC,KAAK,CAAC,SAAS,CAAC;CACpC"}
|
package/dist/index.d.ts
CHANGED
|
@@ -2,7 +2,7 @@ export { ParseClass, ParseField, getSchemaDefinition, onClassRegistered, onField
|
|
|
2
2
|
export type { ParseClassOptions, ParseFieldOptions, AllowedFieldType } from './decorators/parseDecorators';
|
|
3
3
|
export { CloudFunction, ProtectedCloudFunction, onFunctionRegistered } from './decorators/cloudDecorator';
|
|
4
4
|
export { CloudFunctionRegistry } from './decorators/cloudRegistry';
|
|
5
|
-
export { BeforeSave, AfterSave, BeforeDelete, AfterDelete, BeforeFind, AfterFind, BeforeLogin, AfterLogin, AfterLogout, BeforeSaveFile, AfterSaveFile, BeforeDeleteFile, AfterDeleteFile, BeforeConnect, BeforeSubscribe, AfterEvent } from './decorators/triggerDecorator';
|
|
5
|
+
export { BeforeSave, AfterSave, BeforeDelete, AfterDelete, BeforeFind, AfterFind, BeforeLogin, AfterLogin, AfterLogout, BeforePasswordResetRequest, BeforeSaveFile, AfterSaveFile, BeforeDeleteFile, AfterDeleteFile, BeforeFindFile, AfterFindFile, BeforeSaveConfig, AfterSaveConfig, BeforeConnect, BeforeSubscribe, AfterEvent } from './decorators/triggerDecorator';
|
|
6
6
|
export { TriggerRegistry } from './decorators/triggerRegistry';
|
|
7
7
|
export { Cron, CronSchedule, CronRegistry } from './decorators/cronDecorator';
|
|
8
8
|
export { Route, RouteRegistry } from './decorators/routeDecorator';
|
|
@@ -15,6 +15,7 @@ export type { AuthRole, MultiLangs, Filter } from './decorators/types/common';
|
|
|
15
15
|
export { validateObject, validateOrThrow, getValidators, applyMongoValidators } from './decorators/types/fieldValidation';
|
|
16
16
|
export { BaseModel } from './models/BaseModel';
|
|
17
17
|
export { implementACL } from './utils/ACL';
|
|
18
|
+
export { syncImageAcl, cloneAcl } from './utils/imageAcl';
|
|
18
19
|
export { UserRoles, roleKey, MAX_QUERY_LIMIT } from './utils/constants';
|
|
19
20
|
export type { RoleString } from './utils/constants';
|
|
20
21
|
export { catchError, getUserRoles, getUsersRoles, formatCount, generateRandomPassword, generateRandomInteger, generateRandomString, sleep } from './utils/helper';
|
|
@@ -24,6 +25,12 @@ export { checkRateLimit } from './middleware/rateLimit';
|
|
|
24
25
|
export { createSchemaConfig } from './database/schema';
|
|
25
26
|
export type { SchemaConfigOptions } from './database/schema';
|
|
26
27
|
export { applyAllIndexes, applyUniqueIndexes, getUniqueIndexes, getCompoundIndexes, getFieldIndexes } from './database/indexes';
|
|
28
|
+
export { ParseVersionField, VersionRegistry } from './database/versionRegistry';
|
|
29
|
+
export { createVersionedMongoAdapter, VERSION_CONFLICT, VERSION_CONFLICT_MESSAGE } from './database/versionedMongoAdapter';
|
|
30
|
+
export type { VersionedMongoAdapter, MongoAdapterConstructor } from './database/versionedMongoAdapter';
|
|
31
|
+
export { Transactional, withTransaction, inTransaction, currentSession, useTransactionAdapter, CONFLICT, CONFLICT_MESSAGE } from './transactions/context';
|
|
32
|
+
export type { TransactionalAdapter } from './transactions/context';
|
|
33
|
+
export { withAmbientSession, NO_AMBIENT_TRANSACTION } from './transactions/ambientSession';
|
|
27
34
|
export { SwaggerRegistry } from './swagger/swaggerRegistry';
|
|
28
35
|
export type { SwaggerModelSchema, SwaggerPropertySchema, SwaggerFunctionSchema } from './swagger/swaggerRegistry';
|
|
29
36
|
export { generateSwaggerSpec, getSwaggerJson } from './swagger/swaggerSpec';
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,mBAAmB,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,MAAM,8BAA8B,CAAC;AACjI,YAAY,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,MAAM,8BAA8B,CAAC;AAE3G,OAAO,EAAE,aAAa,EAAE,sBAAsB,EAAE,oBAAoB,EAAE,MAAM,6BAA6B,CAAC;AAC1G,OAAO,EAAE,qBAAqB,EAAE,MAAM,4BAA4B,CAAC;AAEnE,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,YAAY,EAAE,WAAW,EAAE,UAAU,EAAE,SAAS,EAC9E,WAAW,EAAE,UAAU,EAAE,WAAW,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/dist/index.js
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
// @90soft/parse-server-kit — complete toolkit for Parse Server
|
|
3
3
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
4
|
-
exports.
|
|
5
|
-
exports.setupSwagger = exports.getSwaggerJson = exports.generateSwaggerSpec = exports.SwaggerRegistry = exports.getFieldIndexes = exports.getCompoundIndexes = exports.getUniqueIndexes = exports.applyUniqueIndexes = exports.applyAllIndexes = exports.createSchemaConfig = exports.checkRateLimit = exports.conditionalJsonMiddleware = exports.removeResultMiddleware = exports.restrictRoutes = exports.validateEntityRoutes = exports.validateFunctionRoutes = void 0;
|
|
4
|
+
exports.getUserRoles = exports.catchError = exports.MAX_QUERY_LIMIT = exports.roleKey = exports.UserRoles = exports.cloneAcl = exports.syncImageAcl = exports.implementACL = exports.BaseModel = exports.applyMongoValidators = exports.getValidators = exports.validateOrThrow = exports.validateObject = exports.classNames = exports.RouteRegistry = exports.Route = exports.CronRegistry = exports.CronSchedule = exports.Cron = exports.TriggerRegistry = exports.AfterEvent = exports.BeforeSubscribe = exports.BeforeConnect = exports.AfterSaveConfig = exports.BeforeSaveConfig = exports.AfterFindFile = exports.BeforeFindFile = exports.AfterDeleteFile = exports.BeforeDeleteFile = exports.AfterSaveFile = exports.BeforeSaveFile = exports.BeforePasswordResetRequest = exports.AfterLogout = exports.AfterLogin = exports.BeforeLogin = exports.AfterFind = exports.BeforeFind = exports.AfterDelete = exports.BeforeDelete = exports.AfterSave = exports.BeforeSave = exports.CloudFunctionRegistry = exports.onFunctionRegistered = exports.ProtectedCloudFunction = exports.CloudFunction = exports.onFieldRegistered = exports.onClassRegistered = exports.getSchemaDefinition = exports.ParseField = exports.ParseClass = void 0;
|
|
5
|
+
exports.setupSwagger = exports.getSwaggerJson = exports.generateSwaggerSpec = exports.SwaggerRegistry = exports.NO_AMBIENT_TRANSACTION = exports.withAmbientSession = exports.CONFLICT_MESSAGE = exports.CONFLICT = exports.useTransactionAdapter = exports.currentSession = exports.inTransaction = exports.withTransaction = exports.Transactional = exports.VERSION_CONFLICT_MESSAGE = exports.VERSION_CONFLICT = exports.createVersionedMongoAdapter = exports.VersionRegistry = exports.ParseVersionField = exports.getFieldIndexes = exports.getCompoundIndexes = exports.getUniqueIndexes = exports.applyUniqueIndexes = exports.applyAllIndexes = exports.createSchemaConfig = exports.checkRateLimit = exports.conditionalJsonMiddleware = exports.removeResultMiddleware = exports.restrictRoutes = exports.validateEntityRoutes = exports.validateFunctionRoutes = exports.importFiles = exports.sleep = exports.generateRandomString = exports.generateRandomInteger = exports.generateRandomPassword = exports.formatCount = exports.getUsersRoles = void 0;
|
|
6
6
|
// ── Decorators ──
|
|
7
7
|
var parseDecorators_1 = require("./decorators/parseDecorators");
|
|
8
8
|
Object.defineProperty(exports, "ParseClass", { enumerable: true, get: function () { return parseDecorators_1.ParseClass; } });
|
|
@@ -26,10 +26,15 @@ Object.defineProperty(exports, "AfterFind", { enumerable: true, get: function ()
|
|
|
26
26
|
Object.defineProperty(exports, "BeforeLogin", { enumerable: true, get: function () { return triggerDecorator_1.BeforeLogin; } });
|
|
27
27
|
Object.defineProperty(exports, "AfterLogin", { enumerable: true, get: function () { return triggerDecorator_1.AfterLogin; } });
|
|
28
28
|
Object.defineProperty(exports, "AfterLogout", { enumerable: true, get: function () { return triggerDecorator_1.AfterLogout; } });
|
|
29
|
+
Object.defineProperty(exports, "BeforePasswordResetRequest", { enumerable: true, get: function () { return triggerDecorator_1.BeforePasswordResetRequest; } });
|
|
29
30
|
Object.defineProperty(exports, "BeforeSaveFile", { enumerable: true, get: function () { return triggerDecorator_1.BeforeSaveFile; } });
|
|
30
31
|
Object.defineProperty(exports, "AfterSaveFile", { enumerable: true, get: function () { return triggerDecorator_1.AfterSaveFile; } });
|
|
31
32
|
Object.defineProperty(exports, "BeforeDeleteFile", { enumerable: true, get: function () { return triggerDecorator_1.BeforeDeleteFile; } });
|
|
32
33
|
Object.defineProperty(exports, "AfterDeleteFile", { enumerable: true, get: function () { return triggerDecorator_1.AfterDeleteFile; } });
|
|
34
|
+
Object.defineProperty(exports, "BeforeFindFile", { enumerable: true, get: function () { return triggerDecorator_1.BeforeFindFile; } });
|
|
35
|
+
Object.defineProperty(exports, "AfterFindFile", { enumerable: true, get: function () { return triggerDecorator_1.AfterFindFile; } });
|
|
36
|
+
Object.defineProperty(exports, "BeforeSaveConfig", { enumerable: true, get: function () { return triggerDecorator_1.BeforeSaveConfig; } });
|
|
37
|
+
Object.defineProperty(exports, "AfterSaveConfig", { enumerable: true, get: function () { return triggerDecorator_1.AfterSaveConfig; } });
|
|
33
38
|
Object.defineProperty(exports, "BeforeConnect", { enumerable: true, get: function () { return triggerDecorator_1.BeforeConnect; } });
|
|
34
39
|
Object.defineProperty(exports, "BeforeSubscribe", { enumerable: true, get: function () { return triggerDecorator_1.BeforeSubscribe; } });
|
|
35
40
|
Object.defineProperty(exports, "AfterEvent", { enumerable: true, get: function () { return triggerDecorator_1.AfterEvent; } });
|
|
@@ -57,6 +62,9 @@ Object.defineProperty(exports, "BaseModel", { enumerable: true, get: function ()
|
|
|
57
62
|
// ── ACL & Permissions ──
|
|
58
63
|
var ACL_1 = require("./utils/ACL");
|
|
59
64
|
Object.defineProperty(exports, "implementACL", { enumerable: true, get: function () { return ACL_1.implementACL; } });
|
|
65
|
+
var imageAcl_1 = require("./utils/imageAcl");
|
|
66
|
+
Object.defineProperty(exports, "syncImageAcl", { enumerable: true, get: function () { return imageAcl_1.syncImageAcl; } });
|
|
67
|
+
Object.defineProperty(exports, "cloneAcl", { enumerable: true, get: function () { return imageAcl_1.cloneAcl; } });
|
|
60
68
|
var constants_1 = require("./utils/constants");
|
|
61
69
|
Object.defineProperty(exports, "UserRoles", { enumerable: true, get: function () { return constants_1.UserRoles; } });
|
|
62
70
|
Object.defineProperty(exports, "roleKey", { enumerable: true, get: function () { return constants_1.roleKey; } });
|
|
@@ -91,6 +99,26 @@ Object.defineProperty(exports, "applyUniqueIndexes", { enumerable: true, get: fu
|
|
|
91
99
|
Object.defineProperty(exports, "getUniqueIndexes", { enumerable: true, get: function () { return indexes_1.getUniqueIndexes; } });
|
|
92
100
|
Object.defineProperty(exports, "getCompoundIndexes", { enumerable: true, get: function () { return indexes_1.getCompoundIndexes; } });
|
|
93
101
|
Object.defineProperty(exports, "getFieldIndexes", { enumerable: true, get: function () { return indexes_1.getFieldIndexes; } });
|
|
102
|
+
// ── Optimistic Locking ──
|
|
103
|
+
var versionRegistry_1 = require("./database/versionRegistry");
|
|
104
|
+
Object.defineProperty(exports, "ParseVersionField", { enumerable: true, get: function () { return versionRegistry_1.ParseVersionField; } });
|
|
105
|
+
Object.defineProperty(exports, "VersionRegistry", { enumerable: true, get: function () { return versionRegistry_1.VersionRegistry; } });
|
|
106
|
+
var versionedMongoAdapter_1 = require("./database/versionedMongoAdapter");
|
|
107
|
+
Object.defineProperty(exports, "createVersionedMongoAdapter", { enumerable: true, get: function () { return versionedMongoAdapter_1.createVersionedMongoAdapter; } });
|
|
108
|
+
Object.defineProperty(exports, "VERSION_CONFLICT", { enumerable: true, get: function () { return versionedMongoAdapter_1.VERSION_CONFLICT; } });
|
|
109
|
+
Object.defineProperty(exports, "VERSION_CONFLICT_MESSAGE", { enumerable: true, get: function () { return versionedMongoAdapter_1.VERSION_CONFLICT_MESSAGE; } });
|
|
110
|
+
// ── Transactions ──
|
|
111
|
+
var context_1 = require("./transactions/context");
|
|
112
|
+
Object.defineProperty(exports, "Transactional", { enumerable: true, get: function () { return context_1.Transactional; } });
|
|
113
|
+
Object.defineProperty(exports, "withTransaction", { enumerable: true, get: function () { return context_1.withTransaction; } });
|
|
114
|
+
Object.defineProperty(exports, "inTransaction", { enumerable: true, get: function () { return context_1.inTransaction; } });
|
|
115
|
+
Object.defineProperty(exports, "currentSession", { enumerable: true, get: function () { return context_1.currentSession; } });
|
|
116
|
+
Object.defineProperty(exports, "useTransactionAdapter", { enumerable: true, get: function () { return context_1.useTransactionAdapter; } });
|
|
117
|
+
Object.defineProperty(exports, "CONFLICT", { enumerable: true, get: function () { return context_1.CONFLICT; } });
|
|
118
|
+
Object.defineProperty(exports, "CONFLICT_MESSAGE", { enumerable: true, get: function () { return context_1.CONFLICT_MESSAGE; } });
|
|
119
|
+
var ambientSession_1 = require("./transactions/ambientSession");
|
|
120
|
+
Object.defineProperty(exports, "withAmbientSession", { enumerable: true, get: function () { return ambientSession_1.withAmbientSession; } });
|
|
121
|
+
Object.defineProperty(exports, "NO_AMBIENT_TRANSACTION", { enumerable: true, get: function () { return ambientSession_1.NO_AMBIENT_TRANSACTION; } });
|
|
94
122
|
// ── Swagger ──
|
|
95
123
|
var swaggerRegistry_1 = require("./swagger/swaggerRegistry");
|
|
96
124
|
Object.defineProperty(exports, "SwaggerRegistry", { enumerable: true, get: function () { return swaggerRegistry_1.SwaggerRegistry; } });
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAAA,+DAA+D;;;;AAE/D,mBAAmB;AACnB,gEAAiI;AAAxH,6GAAA,UAAU,OAAA;AAAE,6GAAA,UAAU,OAAA;AAAE,sHAAA,mBAAmB,OAAA;AAAE,oHAAA,iBAAiB,OAAA;AAAE,oHAAA,iBAAiB,OAAA;AAG1F,8DAA0G;AAAjG,+GAAA,aAAa,OAAA;AAAE,wHAAA,sBAAsB,OAAA;AAAE,sHAAA,oBAAoB,OAAA;AACpE,4DAAmE;AAA1D,sHAAA,qBAAqB,OAAA;AAE9B,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"middleware.d.ts","sourceRoot":"","sources":["../../src/middleware/middleware.ts"],"names":[],"mappings":"AAAA,OAAO,OAAO,EAAE,EAAC,YAAY,EAAE,OAAO,EAAE,QAAQ,EAAC,MAAM,SAAS,CAAC;AAMjE;;;GAGG;AACH,wBAAgB,sBAAsB,CACpC,GAAG,EAAE,OAAO,EACZ,GAAG,EAAE,QAAQ,EACb,IAAI,EAAE,YAAY,qDAoBnB;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,oBAAoB,CAClC,GAAG,EAAE,OAAO,EACZ,GAAG,EAAE,QAAQ,EACb,IAAI,EAAE,YAAY,qDAgDnB;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,CAC9B,GAAG,EAAE,GAAG,EACR,GAAG,EAAE,QAAQ,EACb,GAAG,EAAE,MAAM,EACX,QAAQ,EAAE,cAAc,QAUzB;
|
|
1
|
+
{"version":3,"file":"middleware.d.ts","sourceRoot":"","sources":["../../src/middleware/middleware.ts"],"names":[],"mappings":"AAAA,OAAO,OAAO,EAAE,EAAC,YAAY,EAAE,OAAO,EAAE,QAAQ,EAAC,MAAM,SAAS,CAAC;AAMjE;;;GAGG;AACH,wBAAgB,sBAAsB,CACpC,GAAG,EAAE,OAAO,EACZ,GAAG,EAAE,QAAQ,EACb,IAAI,EAAE,YAAY,qDAoBnB;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,oBAAoB,CAClC,GAAG,EAAE,OAAO,EACZ,GAAG,EAAE,QAAQ,EACb,IAAI,EAAE,YAAY,qDAgDnB;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,CAC9B,GAAG,EAAE,GAAG,EACR,GAAG,EAAE,QAAQ,EACb,GAAG,EAAE,MAAM,EACX,QAAQ,EAAE,cAAc,QAUzB;AAwCD;;;;GAIG;AACH,wBAAgB,cAAc,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,QAAQ,EAAE,IAAI,EAAE,YAAY,qDAwBzE;AAED;;GAEG;AACH,wBAAgB,yBAAyB,CACvC,GAAG,EAAE,OAAO,EACZ,GAAG,EAAE,QAAQ,EACb,IAAI,EAAE,YAAY,QAWnB;AAED;;;GAGG;AACH,wBAAgB,sBAAsB,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,GAAG,QAWnE"}
|
|
@@ -100,6 +100,39 @@ function extractMasterKey(req, res, buf, encoding) {
|
|
|
100
100
|
throw res.status(400).json({ message: 'Error parsing JSON body' });
|
|
101
101
|
}
|
|
102
102
|
}
|
|
103
|
+
/**
|
|
104
|
+
* Whether this request carries the master key.
|
|
105
|
+
*
|
|
106
|
+
* Two channels. The **header** is the one to use: it is where every Parse client
|
|
107
|
+
* already puts it, it never lands in a request-body log, and it survives a route
|
|
108
|
+
* that does not parse a body at all.
|
|
109
|
+
*
|
|
110
|
+
* The **body** channel is the original one and still works, so nothing that
|
|
111
|
+
* relies on it breaks — but it is deprecated and will be removed. A secret in a
|
|
112
|
+
* JSON body is a secret in every log, proxy and error report that ever echoes
|
|
113
|
+
* that body.
|
|
114
|
+
*
|
|
115
|
+
* An unset `masterKey` env var never matches, so a misconfigured server fails
|
|
116
|
+
* closed rather than letting every request through as master.
|
|
117
|
+
*/
|
|
118
|
+
function hasMasterKey(req) {
|
|
119
|
+
const expected = process.env.masterKey;
|
|
120
|
+
if (!expected)
|
|
121
|
+
return false;
|
|
122
|
+
if (req.headers?.['x-parse-master-key'] === expected)
|
|
123
|
+
return true;
|
|
124
|
+
if (req['x-master-key'] === expected) {
|
|
125
|
+
if (!warnedBodyMasterKey) {
|
|
126
|
+
warnedBodyMasterKey = true;
|
|
127
|
+
console.warn('[Security] Master key received in the request body. This is deprecated ' +
|
|
128
|
+
'and will be removed — send it as the X-Parse-Master-Key header instead. ' +
|
|
129
|
+
'A key in the body ends up in any log that records request bodies.');
|
|
130
|
+
}
|
|
131
|
+
return true;
|
|
132
|
+
}
|
|
133
|
+
return false;
|
|
134
|
+
}
|
|
135
|
+
let warnedBodyMasterKey = false;
|
|
103
136
|
/**
|
|
104
137
|
* Restricts access to internal Parse Server endpoints.
|
|
105
138
|
* Only entity routes, system routes, and rewritten /functions routes pass through.
|
|
@@ -108,7 +141,7 @@ function extractMasterKey(req, res, buf, encoding) {
|
|
|
108
141
|
function restrictRoutes(req, res, next) {
|
|
109
142
|
const systemRoutes = ['/health', '/serverInfo', '/files'];
|
|
110
143
|
// Master key bypasses all restrictions
|
|
111
|
-
if (req
|
|
144
|
+
if (hasMasterKey(req)) {
|
|
112
145
|
return next();
|
|
113
146
|
}
|
|
114
147
|
// Allow system routes
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"middleware.js","sourceRoot":"","sources":["../../src/middleware/middleware.ts"],"names":[],"mappings":";;;;;AAUA,wDAuBC;AAeD,oDAmDC;AAMD,4CAcC;
|
|
1
|
+
{"version":3,"file":"middleware.js","sourceRoot":"","sources":["../../src/middleware/middleware.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"rateLimit.d.ts","sourceRoot":"","sources":["../../src/middleware/rateLimit.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,OAAO,EAAE,QAAQ,EAAC,MAAM,SAAS,CAAC;
|
|
1
|
+
{"version":3,"file":"rateLimit.d.ts","sourceRoot":"","sources":["../../src/middleware/rateLimit.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,OAAO,EAAE,QAAQ,EAAC,MAAM,SAAS,CAAC;AAuC1C;;;GAGG;AACH,wBAAgB,cAAc,CAC5B,GAAG,EAAE,OAAO,EACZ,GAAG,EAAE,QAAQ,EACb,YAAY,EAAE,MAAM,EACpB,MAAM,EAAE;IAAE,QAAQ,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAA;CAAE,GACxC,OAAO,CAiCT"}
|
|
@@ -4,7 +4,7 @@ exports.checkRateLimit = checkRateLimit;
|
|
|
4
4
|
// Map<functionName, Map<clientKey, RateLimitEntry>>
|
|
5
5
|
const store = new Map();
|
|
6
6
|
// Cleanup old entries every 5 minutes
|
|
7
|
-
setInterval(() => {
|
|
7
|
+
const cleanupTimer = setInterval(() => {
|
|
8
8
|
const now = Date.now();
|
|
9
9
|
for (const [fnName, clients] of store) {
|
|
10
10
|
for (const [key, entry] of clients) {
|
|
@@ -17,6 +17,12 @@ setInterval(() => {
|
|
|
17
17
|
}
|
|
18
18
|
}
|
|
19
19
|
}, 5 * 60 * 1000);
|
|
20
|
+
// A sweep of an in-memory map is never a reason to hold the process open.
|
|
21
|
+
// Without this, merely importing the kit keeps the event loop alive forever —
|
|
22
|
+
// a seed script, a migration or a Jest run would hang instead of exiting.
|
|
23
|
+
// The sweep still runs for as long as something else is keeping the process up,
|
|
24
|
+
// which is the only time it has anything to do.
|
|
25
|
+
cleanupTimer.unref();
|
|
20
26
|
/**
|
|
21
27
|
* Get client key — session token if available, fallback to IP.
|
|
22
28
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"rateLimit.js","sourceRoot":"","sources":["../../src/middleware/rateLimit.ts"],"names":[],"mappings":";;
|
|
1
|
+
{"version":3,"file":"rateLimit.js","sourceRoot":"","sources":["../../src/middleware/rateLimit.ts"],"names":[],"mappings":";;AA2CA,wCAsCC;AA1ED,oDAAoD;AACpD,MAAM,KAAK,GAA6C,IAAI,GAAG,EAAE,CAAC;AAElE,sCAAsC;AACtC,MAAM,YAAY,GAAG,WAAW,CAAC,GAAG,EAAE;IACpC,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IACvB,KAAK,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,IAAI,KAAK,EAAE,CAAC;QACtC,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,OAAO,EAAE,CAAC;YACnC,IAAI,GAAG,GAAG,KAAK,CAAC,OAAO,EAAE,CAAC;gBACxB,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;YACtB,CAAC;QACH,CAAC;QACD,IAAI,OAAO,CAAC,IAAI,KAAK,CAAC,EAAE,CAAC;YACvB,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;QACvB,CAAC;IACH,CAAC;AACH,CAAC,EAAE,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC;AAElB,0EAA0E;AAC1E,8EAA8E;AAC9E,0EAA0E;AAC1E,gFAAgF;AAChF,gDAAgD;AAChD,YAAY,CAAC,KAAK,EAAE,CAAC;AAErB;;GAEG;AACH,SAAS,YAAY,CAAC,GAAY;IAChC,OAAQ,GAAG,CAAC,OAAO,CAAC,uBAAuB,CAAY,IAAI,GAAG,CAAC,EAAE,IAAI,SAAS,CAAC;AACjF,CAAC;AAED;;;GAGG;AACH,SAAgB,cAAc,CAC5B,GAAY,EACZ,GAAa,EACb,YAAoB,EACpB,MAAyC;IAEzC,MAAM,SAAS,GAAG,YAAY,CAAC,GAAG,CAAC,CAAC;IACpC,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IAEvB,6BAA6B;IAC7B,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,YAAY,CAAC,EAAE,CAAC;QAC7B,KAAK,CAAC,GAAG,CAAC,YAAY,EAAE,IAAI,GAAG,EAAE,CAAC,CAAC;IACrC,CAAC;IACD,MAAM,OAAO,GAAG,KAAK,CAAC,GAAG,CAAC,YAAY,CAAE,CAAC;IAEzC,6BAA6B;IAC7B,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;IAErC,IAAI,CAAC,KAAK,IAAI,GAAG,GAAG,KAAK,CAAC,OAAO,EAAE,CAAC;QAClC,gDAAgD;QAChD,OAAO,CAAC,GAAG,CAAC,SAAS,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,OAAO,EAAE,GAAG,GAAG,MAAM,CAAC,QAAQ,EAAE,CAAC,CAAC;QACrE,OAAO,IAAI,CAAC,CAAC,UAAU;IACzB,CAAC;IAED,IAAI,KAAK,CAAC,KAAK,GAAG,MAAM,CAAC,GAAG,EAAE,CAAC;QAC7B,cAAc;QACd,KAAK,CAAC,KAAK,EAAE,CAAC;QACd,OAAO,IAAI,CAAC,CAAC,UAAU;IACzB,CAAC;IAED,sBAAsB;IACtB,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,OAAO,GAAG,GAAG,CAAC,GAAG,IAAI,CAAC,CAAC;IAC3D,GAAG,CAAC,GAAG,CAAC,aAAa,EAAE,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC;IAC3C,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC;QACnB,OAAO,EAAE,mCAAmC,UAAU,WAAW;QACjE,UAAU;KACX,CAAC,CAAC;IACH,OAAO,KAAK,CAAC,CAAC,UAAU;AAC1B,CAAC"}
|
package/dist/swagger/index.d.ts
CHANGED
|
@@ -3,7 +3,11 @@ import { SwaggerConfig } from './swaggerSpec';
|
|
|
3
3
|
export { SwaggerRegistry } from './swaggerRegistry';
|
|
4
4
|
export { generateSwaggerSpec, getSwaggerJson } from './swaggerSpec';
|
|
5
5
|
/**
|
|
6
|
-
* Setup Swagger UI for the Express app
|
|
6
|
+
* Setup Swagger UI for the Express app.
|
|
7
|
+
*
|
|
8
|
+
* The spec itself has no dependencies, so `{path}/json` is served whether or not
|
|
9
|
+
* the UI package is installed — a missing `swagger-ui-express` costs you the
|
|
10
|
+
* browser page, not the document.
|
|
7
11
|
*/
|
|
8
12
|
export declare function setupSwagger(app: Express, config: SwaggerConfig, path?: string): void;
|
|
9
13
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/swagger/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,OAAO,EAAC,MAAM,SAAS,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/swagger/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,OAAO,EAAC,MAAM,SAAS,CAAC;AAChC,OAAO,EAAsB,aAAa,EAAC,MAAM,eAAe,CAAC;AAEjE,OAAO,EAAC,eAAe,EAAC,MAAM,mBAAmB,CAAC;AAClD,OAAO,EAAC,mBAAmB,EAAE,cAAc,EAAC,MAAM,eAAe,CAAC;AAqBlE;;;;;;GAMG;AACH,wBAAgB,YAAY,CAC1B,GAAG,EAAE,OAAO,EACZ,MAAM,EAAE,aAAa,EACrB,IAAI,GAAE,MAAoB,QAkC3B"}
|
package/dist/swagger/index.js
CHANGED
|
@@ -1,11 +1,7 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
-
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
-
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
-
};
|
|
5
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
3
|
exports.getSwaggerJson = exports.generateSwaggerSpec = exports.SwaggerRegistry = void 0;
|
|
7
4
|
exports.setupSwagger = setupSwagger;
|
|
8
|
-
const swagger_ui_express_1 = __importDefault(require("swagger-ui-express"));
|
|
9
5
|
const swaggerSpec_1 = require("./swaggerSpec");
|
|
10
6
|
var swaggerRegistry_1 = require("./swaggerRegistry");
|
|
11
7
|
Object.defineProperty(exports, "SwaggerRegistry", { enumerable: true, get: function () { return swaggerRegistry_1.SwaggerRegistry; } });
|
|
@@ -13,18 +9,47 @@ var swaggerSpec_2 = require("./swaggerSpec");
|
|
|
13
9
|
Object.defineProperty(exports, "generateSwaggerSpec", { enumerable: true, get: function () { return swaggerSpec_2.generateSwaggerSpec; } });
|
|
14
10
|
Object.defineProperty(exports, "getSwaggerJson", { enumerable: true, get: function () { return swaggerSpec_2.getSwaggerJson; } });
|
|
15
11
|
/**
|
|
16
|
-
*
|
|
12
|
+
* `swagger-ui-express` is optional, so it is reached for only when the UI is
|
|
13
|
+
* actually being mounted.
|
|
14
|
+
*
|
|
15
|
+
* It used to be a top-level import, which made it mandatory in practice: the
|
|
16
|
+
* package root re-exports `setupSwagger`, so importing anything at all from the
|
|
17
|
+
* kit loaded this module and threw `MODULE_NOT_FOUND` for a dependency the docs
|
|
18
|
+
* called optional. Requiring it here, the way `node-cron` is handled, makes the
|
|
19
|
+
* promise true.
|
|
20
|
+
*/
|
|
21
|
+
function loadSwaggerUi() {
|
|
22
|
+
try {
|
|
23
|
+
// eslint-disable-next-line @typescript-eslint/no-var-requires
|
|
24
|
+
return require('swagger-ui-express');
|
|
25
|
+
}
|
|
26
|
+
catch {
|
|
27
|
+
return null;
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Setup Swagger UI for the Express app.
|
|
32
|
+
*
|
|
33
|
+
* The spec itself has no dependencies, so `{path}/json` is served whether or not
|
|
34
|
+
* the UI package is installed — a missing `swagger-ui-express` costs you the
|
|
35
|
+
* browser page, not the document.
|
|
17
36
|
*/
|
|
18
37
|
function setupSwagger(app, config, path = '/api-docs') {
|
|
19
|
-
console.log(path);
|
|
20
38
|
// Generate spec dynamically (after all models and functions are loaded)
|
|
21
39
|
const getSpec = () => (0, swaggerSpec_1.generateSwaggerSpec)(config);
|
|
22
40
|
// Serve Swagger JSON BEFORE the UI middleware (so it doesn't get caught)
|
|
23
41
|
app.get(`${path}/json`, (req, res) => {
|
|
24
42
|
res.json(getSpec());
|
|
25
43
|
});
|
|
44
|
+
console.log(`[Swagger] API spec available at ${path}/json`);
|
|
45
|
+
const swaggerUi = loadSwaggerUi();
|
|
46
|
+
if (!swaggerUi) {
|
|
47
|
+
console.warn(`[Swagger] swagger-ui-express not installed — serving the spec at ${path}/json only. ` +
|
|
48
|
+
'Install it to get the browser UI.');
|
|
49
|
+
return;
|
|
50
|
+
}
|
|
26
51
|
// Serve Swagger UI
|
|
27
|
-
app.use(path,
|
|
52
|
+
app.use(path, swaggerUi.serve, swaggerUi.setup(null, {
|
|
28
53
|
swaggerOptions: {
|
|
29
54
|
url: `${path}/json`,
|
|
30
55
|
persistAuthorization: true,
|
|
@@ -32,6 +57,5 @@ function setupSwagger(app, config, path = '/api-docs') {
|
|
|
32
57
|
customSiteTitle: config.title || 'API Documentation',
|
|
33
58
|
}));
|
|
34
59
|
console.log(`[Swagger] API documentation available at ${path}`);
|
|
35
|
-
console.log(`[Swagger] API spec available at ${path}/json`);
|
|
36
60
|
}
|
|
37
61
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/swagger/index.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/swagger/index.ts"],"names":[],"mappings":";;;AAgCA,oCAqCC;AApED,+CAAiE;AAEjE,qDAAkD;AAA1C,kHAAA,eAAe,OAAA;AACvB,6CAAkE;AAA1D,kHAAA,mBAAmB,OAAA;AAAE,6GAAA,cAAc,OAAA;AAE3C;;;;;;;;;GASG;AACH,SAAS,aAAa;IACpB,IAAI,CAAC;QACH,8DAA8D;QAC9D,OAAO,OAAO,CAAC,oBAAoB,CAAC,CAAC;IACvC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED;;;;;;GAMG;AACH,SAAgB,YAAY,CAC1B,GAAY,EACZ,MAAqB,EACrB,OAAe,WAAW;IAE1B,wEAAwE;IACxE,MAAM,OAAO,GAAG,GAAG,EAAE,CAAC,IAAA,iCAAmB,EAAC,MAAM,CAAC,CAAC;IAElD,yEAAyE;IACzE,GAAG,CAAC,GAAG,CAAC,GAAG,IAAI,OAAO,EAAE,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE;QACnC,GAAG,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC;IACtB,CAAC,CAAC,CAAC;IACH,OAAO,CAAC,GAAG,CAAC,mCAAmC,IAAI,OAAO,CAAC,CAAC;IAE5D,MAAM,SAAS,GAAG,aAAa,EAAE,CAAC;IAClC,IAAI,CAAC,SAAS,EAAE,CAAC;QACf,OAAO,CAAC,IAAI,CACV,oEAAoE,IAAI,cAAc;YACpF,mCAAmC,CACtC,CAAC;QACF,OAAO;IACT,CAAC;IAED,mBAAmB;IACnB,GAAG,CAAC,GAAG,CACL,IAAI,EACJ,SAAS,CAAC,KAAK,EACf,SAAS,CAAC,KAAK,CAAC,IAAI,EAAE;QACpB,cAAc,EAAE;YACd,GAAG,EAAE,GAAG,IAAI,OAAO;YACnB,oBAAoB,EAAE,IAAI;SAC3B;QACD,eAAe,EAAE,MAAM,CAAC,KAAK,IAAI,mBAAmB;KACrD,CAAC,CACH,CAAC;IAEF,OAAO,CAAC,GAAG,CAAC,4CAA4C,IAAI,EAAE,CAAC,CAAC;AAClE,CAAC"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Where each driver method keeps its options argument.
|
|
3
|
+
*
|
|
4
|
+
* Both the injection table and the allowlist: a method that is not here is
|
|
5
|
+
* passed through untouched, which is what keeps index management, change
|
|
6
|
+
* streams and `drop` out of a transaction.
|
|
7
|
+
*
|
|
8
|
+
* `estimatedDocumentCount` is left out **deliberately**. Parse's own
|
|
9
|
+
* `MongoCollection.count()` switches to it whenever the query is empty, and
|
|
10
|
+
* MongoDB refuses the `count` command inside a transaction — joining one would
|
|
11
|
+
* break every unfiltered count. The price is that such a count reads outside
|
|
12
|
+
* the transaction's snapshot, which is the lesser problem.
|
|
13
|
+
*
|
|
14
|
+
* Exported so the integration tests can verify, against the driver parse-server
|
|
15
|
+
* actually ships, that every position here is still where the options live.
|
|
16
|
+
*/
|
|
17
|
+
export declare const OPTIONS_ARGUMENT: Readonly<Record<string, number>>;
|
|
18
|
+
/**
|
|
19
|
+
* Classes that must never be dragged into somebody's transaction.
|
|
20
|
+
*
|
|
21
|
+
* Parse writes these as a side effect of ordinary work — creating a class on
|
|
22
|
+
* first insert, recording an idempotency key — and they have to survive whether
|
|
23
|
+
* or not the work does. A rolled-back schema would be worse than useless.
|
|
24
|
+
*/
|
|
25
|
+
export declare const NO_AMBIENT_TRANSACTION: ReadonlySet<string>;
|
|
26
|
+
type DriverCollection = Record<string, unknown>;
|
|
27
|
+
/**
|
|
28
|
+
* A driver collection that joins whatever transaction the caller is in.
|
|
29
|
+
*
|
|
30
|
+
* The session is read at **call** time rather than when the collection is
|
|
31
|
+
* wrapped, because one collection object serves every caller and only the call
|
|
32
|
+
* knows whose transaction it belongs to.
|
|
33
|
+
*
|
|
34
|
+
* A session already threaded through by hand wins, so Parse Server's own
|
|
35
|
+
* transactional paths keep working untouched.
|
|
36
|
+
*/
|
|
37
|
+
export declare function withAmbientSession<T extends DriverCollection>(raw: T): T;
|
|
38
|
+
export {};
|
|
39
|
+
//# sourceMappingURL=ambientSession.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ambientSession.d.ts","sourceRoot":"","sources":["../../src/transactions/ambientSession.ts"],"names":[],"mappings":"AAEA;;;;;;;;;;;;;;;GAeG;AACH,eAAO,MAAM,gBAAgB,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAe7D,CAAC;AAEF;;;;;;GAMG;AACH,eAAO,MAAM,sBAAsB,EAAE,WAAW,CAAC,MAAM,CAMrD,CAAC;AAEH,KAAK,gBAAgB,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;AAEhD;;;;;;;;;GASG;AACH,wBAAgB,kBAAkB,CAAC,CAAC,SAAS,gBAAgB,EAAE,GAAG,EAAE,CAAC,GAAG,CAAC,CA6BxE"}
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.NO_AMBIENT_TRANSACTION = exports.OPTIONS_ARGUMENT = void 0;
|
|
4
|
+
exports.withAmbientSession = withAmbientSession;
|
|
5
|
+
const context_1 = require("./context");
|
|
6
|
+
/**
|
|
7
|
+
* Where each driver method keeps its options argument.
|
|
8
|
+
*
|
|
9
|
+
* Both the injection table and the allowlist: a method that is not here is
|
|
10
|
+
* passed through untouched, which is what keeps index management, change
|
|
11
|
+
* streams and `drop` out of a transaction.
|
|
12
|
+
*
|
|
13
|
+
* `estimatedDocumentCount` is left out **deliberately**. Parse's own
|
|
14
|
+
* `MongoCollection.count()` switches to it whenever the query is empty, and
|
|
15
|
+
* MongoDB refuses the `count` command inside a transaction — joining one would
|
|
16
|
+
* break every unfiltered count. The price is that such a count reads outside
|
|
17
|
+
* the transaction's snapshot, which is the lesser problem.
|
|
18
|
+
*
|
|
19
|
+
* Exported so the integration tests can verify, against the driver parse-server
|
|
20
|
+
* actually ships, that every position here is still where the options live.
|
|
21
|
+
*/
|
|
22
|
+
exports.OPTIONS_ARGUMENT = {
|
|
23
|
+
updateOne: 2,
|
|
24
|
+
updateMany: 2,
|
|
25
|
+
findOneAndUpdate: 2,
|
|
26
|
+
findOneAndDelete: 1,
|
|
27
|
+
replaceOne: 2,
|
|
28
|
+
distinct: 2,
|
|
29
|
+
insertOne: 1,
|
|
30
|
+
insertMany: 1,
|
|
31
|
+
deleteOne: 1,
|
|
32
|
+
deleteMany: 1,
|
|
33
|
+
find: 1,
|
|
34
|
+
findOne: 1,
|
|
35
|
+
aggregate: 1,
|
|
36
|
+
countDocuments: 1,
|
|
37
|
+
};
|
|
38
|
+
/**
|
|
39
|
+
* Classes that must never be dragged into somebody's transaction.
|
|
40
|
+
*
|
|
41
|
+
* Parse writes these as a side effect of ordinary work — creating a class on
|
|
42
|
+
* first insert, recording an idempotency key — and they have to survive whether
|
|
43
|
+
* or not the work does. A rolled-back schema would be worse than useless.
|
|
44
|
+
*/
|
|
45
|
+
exports.NO_AMBIENT_TRANSACTION = new Set([
|
|
46
|
+
'_SCHEMA',
|
|
47
|
+
'_Idempotency',
|
|
48
|
+
'_Hooks',
|
|
49
|
+
'_JobStatus',
|
|
50
|
+
'_GlobalConfig',
|
|
51
|
+
]);
|
|
52
|
+
/**
|
|
53
|
+
* A driver collection that joins whatever transaction the caller is in.
|
|
54
|
+
*
|
|
55
|
+
* The session is read at **call** time rather than when the collection is
|
|
56
|
+
* wrapped, because one collection object serves every caller and only the call
|
|
57
|
+
* knows whose transaction it belongs to.
|
|
58
|
+
*
|
|
59
|
+
* A session already threaded through by hand wins, so Parse Server's own
|
|
60
|
+
* transactional paths keep working untouched.
|
|
61
|
+
*/
|
|
62
|
+
function withAmbientSession(raw) {
|
|
63
|
+
return new Proxy(raw, {
|
|
64
|
+
get(target, property) {
|
|
65
|
+
const optionsIndex = exports.OPTIONS_ARGUMENT[property];
|
|
66
|
+
if (optionsIndex === undefined) {
|
|
67
|
+
const value = target[property];
|
|
68
|
+
return typeof value === 'function' ? value.bind(target) : value;
|
|
69
|
+
}
|
|
70
|
+
return (...args) => {
|
|
71
|
+
const session = (0, context_1.currentSession)();
|
|
72
|
+
if (session) {
|
|
73
|
+
const options = {
|
|
74
|
+
...(args[optionsIndex] ?? {}),
|
|
75
|
+
};
|
|
76
|
+
options.session ?? (options.session = session);
|
|
77
|
+
if (options.session === session) {
|
|
78
|
+
// A transaction reads from the primary; anything else is refused.
|
|
79
|
+
delete options.readPreference;
|
|
80
|
+
}
|
|
81
|
+
args[optionsIndex] = options;
|
|
82
|
+
}
|
|
83
|
+
return target[property](...args);
|
|
84
|
+
};
|
|
85
|
+
},
|
|
86
|
+
});
|
|
87
|
+
}
|
|
88
|
+
//# sourceMappingURL=ambientSession.js.map
|