@90soft/parse-server-kit 1.0.0 → 2.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (85) hide show
  1. package/dist/decorators/cloudDecorator.d.ts +7 -0
  2. package/dist/decorators/cloudDecorator.d.ts.map +1 -0
  3. package/dist/decorators/cloudDecorator.js +77 -0
  4. package/dist/decorators/cloudDecorator.js.map +1 -0
  5. package/dist/decorators/cloudRegistry.d.ts +9 -0
  6. package/dist/decorators/cloudRegistry.d.ts.map +1 -0
  7. package/dist/decorators/cloudRegistry.js +26 -0
  8. package/dist/decorators/cloudRegistry.js.map +1 -0
  9. package/dist/decorators/cronDecorator.d.ts +6 -0
  10. package/dist/decorators/cronDecorator.d.ts.map +1 -0
  11. package/dist/decorators/cronDecorator.js +28 -0
  12. package/dist/decorators/cronDecorator.js.map +1 -0
  13. package/dist/decorators/cronRegistry.d.ts +13 -0
  14. package/dist/decorators/cronRegistry.d.ts.map +1 -0
  15. package/dist/decorators/cronRegistry.js +96 -0
  16. package/dist/decorators/cronRegistry.js.map +1 -0
  17. package/dist/decorators/routeDecorator.d.ts +35 -0
  18. package/dist/decorators/routeDecorator.d.ts.map +1 -0
  19. package/dist/decorators/routeDecorator.js +160 -0
  20. package/dist/decorators/routeDecorator.js.map +1 -0
  21. package/dist/decorators/triggerDecorator.d.ts +19 -0
  22. package/dist/decorators/triggerDecorator.d.ts.map +1 -0
  23. package/dist/decorators/triggerDecorator.js +45 -0
  24. package/dist/decorators/triggerDecorator.js.map +1 -0
  25. package/dist/decorators/triggerRegistry.d.ts +10 -0
  26. package/dist/decorators/triggerRegistry.d.ts.map +1 -0
  27. package/dist/decorators/triggerRegistry.js +87 -0
  28. package/dist/decorators/triggerRegistry.js.map +1 -0
  29. package/dist/decorators/types/cloudTypes.d.ts +32 -0
  30. package/dist/decorators/types/cloudTypes.d.ts.map +1 -0
  31. package/dist/decorators/types/cloudTypes.js +3 -0
  32. package/dist/decorators/types/cloudTypes.js.map +1 -0
  33. package/dist/decorators/types/common.d.ts +14 -0
  34. package/dist/decorators/types/common.d.ts.map +1 -0
  35. package/dist/decorators/types/common.js +3 -0
  36. package/dist/decorators/types/common.js.map +1 -0
  37. package/dist/decorators/types/cronTypes.d.ts +32 -0
  38. package/dist/decorators/types/cronTypes.d.ts.map +1 -0
  39. package/dist/decorators/types/cronTypes.js +21 -0
  40. package/dist/decorators/types/cronTypes.js.map +1 -0
  41. package/dist/decorators/types/fieldValidation.d.ts +36 -0
  42. package/dist/decorators/types/fieldValidation.d.ts.map +1 -0
  43. package/dist/decorators/types/fieldValidation.js +135 -0
  44. package/dist/decorators/types/fieldValidation.js.map +1 -0
  45. package/dist/decorators/types/triggerTypes.d.ts +14 -0
  46. package/dist/decorators/types/triggerTypes.d.ts.map +1 -0
  47. package/dist/decorators/types/triggerTypes.js +3 -0
  48. package/dist/decorators/types/triggerTypes.js.map +1 -0
  49. package/dist/index.d.ts +25 -4
  50. package/dist/index.d.ts.map +1 -1
  51. package/dist/index.js +78 -6
  52. package/dist/index.js.map +1 -1
  53. package/dist/middleware/middleware.d.ts +36 -0
  54. package/dist/middleware/middleware.d.ts.map +1 -0
  55. package/dist/middleware/middleware.js +133 -0
  56. package/dist/middleware/middleware.js.map +1 -0
  57. package/dist/swagger/index.d.ts +9 -0
  58. package/dist/swagger/index.d.ts.map +1 -0
  59. package/dist/swagger/index.js +37 -0
  60. package/dist/swagger/index.js.map +1 -0
  61. package/dist/swagger/swaggerRegistry.d.ts +79 -0
  62. package/dist/swagger/swaggerRegistry.d.ts.map +1 -0
  63. package/dist/swagger/swaggerRegistry.js +115 -0
  64. package/dist/swagger/swaggerRegistry.js.map +1 -0
  65. package/dist/swagger/swaggerSpec.d.ts +69 -0
  66. package/dist/swagger/swaggerSpec.d.ts.map +1 -0
  67. package/dist/swagger/swaggerSpec.js +174 -0
  68. package/dist/swagger/swaggerSpec.js.map +1 -0
  69. package/dist/utils/ACL.d.ts +19 -0
  70. package/dist/utils/ACL.d.ts.map +1 -0
  71. package/dist/utils/ACL.js +35 -0
  72. package/dist/utils/ACL.js.map +1 -0
  73. package/dist/utils/constants.d.ts +13 -0
  74. package/dist/utils/constants.d.ts.map +1 -0
  75. package/dist/utils/constants.js +19 -0
  76. package/dist/utils/constants.js.map +1 -0
  77. package/dist/utils/dynamicImport.d.ts +2 -0
  78. package/dist/utils/dynamicImport.d.ts.map +1 -0
  79. package/dist/utils/dynamicImport.js +21 -0
  80. package/dist/utils/dynamicImport.js.map +1 -0
  81. package/dist/utils/helper.d.ts +15 -0
  82. package/dist/utils/helper.d.ts.map +1 -0
  83. package/dist/utils/helper.js +93 -0
  84. package/dist/utils/helper.js.map +1 -0
  85. package/package.json +21 -5
@@ -0,0 +1,174 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.generateSwaggerSpec = generateSwaggerSpec;
4
+ exports.getSwaggerJson = getSwaggerJson;
5
+ const swaggerRegistry_1 = require("./swaggerRegistry");
6
+ /**
7
+ * Generate OpenAPI 3.0 specification from registered metadata
8
+ */
9
+ function generateSwaggerSpec(config) {
10
+ const models = swaggerRegistry_1.SwaggerRegistry.getModels();
11
+ const functions = swaggerRegistry_1.SwaggerRegistry.getFunctions();
12
+ // Build schemas from models
13
+ const schemas = {};
14
+ for (const model of models) {
15
+ schemas[model.className] = {
16
+ type: 'object',
17
+ description: model.description,
18
+ properties: model.properties,
19
+ required: model.required.length > 0 ? model.required : undefined,
20
+ };
21
+ }
22
+ // Add common schemas
23
+ schemas['ParseError'] = {
24
+ type: 'object',
25
+ properties: {
26
+ code: { type: 'number', description: 'Error code' },
27
+ error: { type: 'string', description: 'Error message' },
28
+ },
29
+ };
30
+ schemas['CloudFunctionRequest'] = {
31
+ type: 'object',
32
+ properties: {
33
+ _ApplicationId: { type: 'string', description: 'Application ID' },
34
+ _SessionToken: {
35
+ type: 'string',
36
+ description: 'Session token for authentication',
37
+ },
38
+ },
39
+ };
40
+ // Build paths from functions
41
+ const paths = {};
42
+ const tagSet = new Set();
43
+ for (const func of functions) {
44
+ const path = `/functions/${func.name}`;
45
+ const method = func.method.toLowerCase();
46
+ // Collect tags
47
+ if (func.tags) {
48
+ func.tags.forEach(tag => tagSet.add(tag));
49
+ }
50
+ // Build request body schema
51
+ let requestBody = undefined;
52
+ if (func.requestBody &&
53
+ Object.keys(func.requestBody.properties).length > 0) {
54
+ requestBody = {
55
+ required: true,
56
+ content: {
57
+ 'application/json': {
58
+ schema: {
59
+ type: 'object',
60
+ properties: func.requestBody.properties,
61
+ required: Object.entries(func.requestBody.properties)
62
+ .filter(([_, v]) => v.required)
63
+ .map(([k]) => k),
64
+ },
65
+ },
66
+ },
67
+ };
68
+ }
69
+ // Build responses
70
+ const responses = {};
71
+ if (func.responses) {
72
+ for (const [code, response] of Object.entries(func.responses)) {
73
+ responses[code] = {
74
+ description: response.description,
75
+ content: response.schema
76
+ ? {
77
+ 'application/json': {
78
+ schema: response.schema,
79
+ },
80
+ }
81
+ : {
82
+ 'application/json': {
83
+ schema: {
84
+ type: 'object',
85
+ properties: {
86
+ result: { type: 'object', description: 'Function result' },
87
+ },
88
+ },
89
+ },
90
+ },
91
+ };
92
+ }
93
+ }
94
+ // Build security requirements (applicationId and restApiKey are always required)
95
+ const security = func.requiresAuth
96
+ ? [
97
+ { applicationId: [], restApiKey: [], sessionToken: [] },
98
+ { applicationId: [], restApiKey: [], masterKey: [] },
99
+ ]
100
+ : [{ applicationId: [], restApiKey: [] }];
101
+ paths[path] = {
102
+ ...paths[path],
103
+ [method]: {
104
+ tags: func.tags || ['Default'],
105
+ summary: func.summary,
106
+ description: func.description,
107
+ operationId: func.name,
108
+ security,
109
+ requestBody,
110
+ responses,
111
+ },
112
+ };
113
+ }
114
+ // Build tags array
115
+ const tags = Array.from(tagSet).map(tag => ({
116
+ name: tag,
117
+ description: `${tag} related operations`,
118
+ }));
119
+ // Build final spec
120
+ const spec = {
121
+ openapi: '3.0.3',
122
+ info: {
123
+ title: config.title,
124
+ version: config.version,
125
+ description: config.description || 'Auto-generated API documentation',
126
+ },
127
+ servers: [
128
+ {
129
+ url: config.basePath || process.env.mountPath || '/parse',
130
+ description: 'Parse Server API',
131
+ },
132
+ ],
133
+ tags,
134
+ paths,
135
+ components: {
136
+ schemas,
137
+ securitySchemes: {
138
+ applicationId: {
139
+ type: 'apiKey',
140
+ in: 'header',
141
+ name: 'X-Parse-Application-Id',
142
+ description: 'Parse Application ID',
143
+ },
144
+ sessionToken: {
145
+ type: 'apiKey',
146
+ in: 'header',
147
+ name: 'X-Parse-Session-Token',
148
+ description: 'User session token for authentication',
149
+ },
150
+ masterKey: {
151
+ type: 'apiKey',
152
+ in: 'header',
153
+ name: 'X-Parse-Master-Key',
154
+ description: 'Master key for admin operations',
155
+ },
156
+ restApiKey: {
157
+ type: 'apiKey',
158
+ in: 'header',
159
+ name: 'X-Parse-REST-API-Key',
160
+ description: 'REST API key for client requests',
161
+ },
162
+ },
163
+ },
164
+ security: [{ applicationId: [] }, { restApiKey: [] }],
165
+ };
166
+ return spec;
167
+ }
168
+ /**
169
+ * Get the Swagger specification as JSON
170
+ */
171
+ function getSwaggerJson(config) {
172
+ return JSON.stringify(generateSwaggerSpec(config), null, 2);
173
+ }
174
+ //# sourceMappingURL=swaggerSpec.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"swaggerSpec.js","sourceRoot":"","sources":["../../src/swagger/swaggerSpec.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,19 @@
1
+ type RoleRule = {
2
+ role: string;
3
+ read?: boolean;
4
+ write?: boolean;
5
+ };
6
+ type OwnerRule = {
7
+ user?: string | any;
8
+ read?: boolean;
9
+ write?: boolean;
10
+ };
11
+ export declare function implementACL(params: {
12
+ publicRead?: boolean;
13
+ publicWrite?: boolean;
14
+ roleRules?: RoleRule[] | undefined;
15
+ excludedRoles?: string[];
16
+ owner?: OwnerRule[];
17
+ }, existingACL?: Parse.ACL): Parse.ACL;
18
+ export {};
19
+ //# sourceMappingURL=ACL.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ACL.d.ts","sourceRoot":"","sources":["../../src/utils/ACL.ts"],"names":[],"mappings":"AAAA,KAAK,QAAQ,GAAG;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,OAAO,CAAC;IAAC,KAAK,CAAC,EAAE,OAAO,CAAA;CAAC,CAAC;AAChE,KAAK,SAAS,GAAG;IAAC,IAAI,CAAC,EAAE,MAAM,GAAG,GAAG,CAAC;IAAC,IAAI,CAAC,EAAE,OAAO,CAAC;IAAC,KAAK,CAAC,EAAE,OAAO,CAAA;CAAC,CAAC;AAExE,wBAAgB,YAAY,CAC1B,MAAM,EAAE;IACN,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,SAAS,CAAC,EAAE,QAAQ,EAAE,GAAG,SAAS,CAAC;IACnC,aAAa,CAAC,EAAE,MAAM,EAAE,CAAC;IACzB,KAAK,CAAC,EAAE,SAAS,EAAE,CAAC;CACrB,EACD,WAAW,CAAC,EAAE,KAAK,CAAC,GAAG,GACtB,KAAK,CAAC,GAAG,CAgCX"}
@@ -0,0 +1,35 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.implementACL = implementACL;
4
+ function implementACL(params, existingACL) {
5
+ const { publicRead = false, publicWrite = false, roleRules, excludedRoles = [], owner = [], } = params;
6
+ const acl = existingACL ?? new Parse.ACL();
7
+ acl.setPublicReadAccess(!!publicRead);
8
+ acl.setPublicWriteAccess(!!publicWrite);
9
+ for (const { role, read = false, write = false } of roleRules ?? []) {
10
+ if (excludedRoles.includes(role))
11
+ continue;
12
+ if (read)
13
+ acl.setRoleReadAccess(role, true);
14
+ else
15
+ acl.setRoleReadAccess(role, false);
16
+ if (write)
17
+ acl.setRoleWriteAccess(role, true);
18
+ else
19
+ acl.setRoleWriteAccess(role, false);
20
+ }
21
+ for (const { user, read = false, write = false } of owner) {
22
+ if (user !== undefined) {
23
+ if (read)
24
+ acl.setReadAccess(user, true);
25
+ else
26
+ acl.setReadAccess(user, false);
27
+ if (write)
28
+ acl.setWriteAccess(user, true);
29
+ else
30
+ acl.setWriteAccess(user, false);
31
+ }
32
+ }
33
+ return acl;
34
+ }
35
+ //# sourceMappingURL=ACL.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ACL.js","sourceRoot":"","sources":["../../src/utils/ACL.ts"],"names":[],"mappings":";;AAGA,oCAyCC;AAzCD,SAAgB,YAAY,CAC1B,MAMC,EACD,WAAuB;IAEvB,MAAM,EACJ,UAAU,GAAG,KAAK,EAClB,WAAW,GAAG,KAAK,EACnB,SAAS,EACT,aAAa,GAAG,EAAE,EAClB,KAAK,GAAG,EAAE,GACX,GAAG,MAAM,CAAC;IAEX,MAAM,GAAG,GAAG,WAAW,IAAI,IAAI,KAAK,CAAC,GAAG,EAAE,CAAC;IAE3C,GAAG,CAAC,mBAAmB,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC;IACtC,GAAG,CAAC,oBAAoB,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC;IAExC,KAAK,MAAM,EAAC,IAAI,EAAE,IAAI,GAAG,KAAK,EAAE,KAAK,GAAG,KAAK,EAAC,IAAI,SAAS,IAAI,EAAE,EAAE,CAAC;QAClE,IAAI,aAAa,CAAC,QAAQ,CAAC,IAAI,CAAC;YAAE,SAAS;QAC3C,IAAI,IAAI;YAAE,GAAG,CAAC,iBAAiB,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;;YACvC,GAAG,CAAC,iBAAiB,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;QACxC,IAAI,KAAK;YAAE,GAAG,CAAC,kBAAkB,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;;YACzC,GAAG,CAAC,kBAAkB,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;IAC3C,CAAC;IAED,KAAK,MAAM,EAAC,IAAI,EAAE,IAAI,GAAG,KAAK,EAAE,KAAK,GAAG,KAAK,EAAC,IAAI,KAAK,EAAE,CAAC;QACxD,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;YACvB,IAAI,IAAI;gBAAE,GAAG,CAAC,aAAa,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;;gBACnC,GAAG,CAAC,aAAa,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;YACpC,IAAI,KAAK;gBAAE,GAAG,CAAC,cAAc,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;;gBACrC,GAAG,CAAC,cAAc,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;QACvC,CAAC;IACH,CAAC;IAED,OAAO,GAAG,CAAC;AACb,CAAC"}
@@ -0,0 +1,13 @@
1
+ /**
2
+ * User Roles — override these in your project by re-exporting with your own values.
3
+ * These are the defaults for the template.
4
+ */
5
+ export declare enum UserRoles {
6
+ ADMIN = "SuperAdmin",
7
+ EMPLOYEE = "Employee"
8
+ }
9
+ export type RoleString = `role:${UserRoles}`;
10
+ export declare function roleKey(role: UserRoles): RoleString;
11
+ /** Maximum limit for unbounded Parse queries */
12
+ export declare const MAX_QUERY_LIMIT = 10000;
13
+ //# sourceMappingURL=constants.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../../src/utils/constants.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,oBAAY,SAAS;IACnB,KAAK,eAAe;IACpB,QAAQ,aAAa;CACtB;AAED,MAAM,MAAM,UAAU,GAAG,QAAQ,SAAS,EAAE,CAAC;AAE7C,wBAAgB,OAAO,CAAC,IAAI,EAAE,SAAS,GAAG,UAAU,CAEnD;AAED,gDAAgD;AAChD,eAAO,MAAM,eAAe,QAAQ,CAAC"}
@@ -0,0 +1,19 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.MAX_QUERY_LIMIT = exports.UserRoles = void 0;
4
+ exports.roleKey = roleKey;
5
+ /**
6
+ * User Roles — override these in your project by re-exporting with your own values.
7
+ * These are the defaults for the template.
8
+ */
9
+ var UserRoles;
10
+ (function (UserRoles) {
11
+ UserRoles["ADMIN"] = "SuperAdmin";
12
+ UserRoles["EMPLOYEE"] = "Employee";
13
+ })(UserRoles || (exports.UserRoles = UserRoles = {}));
14
+ function roleKey(role) {
15
+ return `role:${role}`;
16
+ }
17
+ /** Maximum limit for unbounded Parse queries */
18
+ exports.MAX_QUERY_LIMIT = 10000;
19
+ //# sourceMappingURL=constants.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"constants.js","sourceRoot":"","sources":["../../src/utils/constants.ts"],"names":[],"mappings":";;;AAWA,0BAEC;AAbD;;;GAGG;AACH,IAAY,SAGX;AAHD,WAAY,SAAS;IACnB,iCAAoB,CAAA;IACpB,kCAAqB,CAAA;AACvB,CAAC,EAHW,SAAS,yBAAT,SAAS,QAGpB;AAID,SAAgB,OAAO,CAAC,IAAe;IACrC,OAAO,QAAQ,IAAI,EAAE,CAAC;AACxB,CAAC;AAED,gDAAgD;AACnC,QAAA,eAAe,GAAG,KAAK,CAAC"}
@@ -0,0 +1,2 @@
1
+ export declare const importFiles: (directoryPath: string) => void;
2
+ //# sourceMappingURL=dynamicImport.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dynamicImport.d.ts","sourceRoot":"","sources":["../../src/utils/dynamicImport.ts"],"names":[],"mappings":"AAKA,eAAO,MAAM,WAAW,GAAI,eAAe,MAAM,SAWhD,CAAC"}
@@ -0,0 +1,21 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.importFiles = void 0;
4
+ const fs_1 = require("fs");
5
+ const path_1 = require("path");
6
+ const isDirectory = (path) => (0, fs_1.statSync)(path).isDirectory();
7
+ const importFiles = (directoryPath) => {
8
+ const files = (0, fs_1.readdirSync)(directoryPath);
9
+ files.forEach(file => {
10
+ const filePath = (0, path_1.join)(directoryPath, file);
11
+ if (isDirectory(filePath)) {
12
+ (0, exports.importFiles)(filePath);
13
+ }
14
+ else if ((0, path_1.extname)(filePath) === '.js') {
15
+ console.log(filePath);
16
+ require(filePath);
17
+ }
18
+ });
19
+ };
20
+ exports.importFiles = importFiles;
21
+ //# sourceMappingURL=dynamicImport.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dynamicImport.js","sourceRoot":"","sources":["../../src/utils/dynamicImport.ts"],"names":[],"mappings":";;;AAAA,2BAAyC;AACzC,+BAAmC;AAEnC,MAAM,WAAW,GAAG,CAAC,IAAY,EAAE,EAAE,CAAC,IAAA,aAAQ,EAAC,IAAI,CAAC,CAAC,WAAW,EAAE,CAAC;AAE5D,MAAM,WAAW,GAAG,CAAC,aAAqB,EAAE,EAAE;IACnD,MAAM,KAAK,GAAG,IAAA,gBAAW,EAAC,aAAa,CAAC,CAAC;IACzC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE;QACnB,MAAM,QAAQ,GAAG,IAAA,WAAI,EAAC,aAAa,EAAE,IAAI,CAAC,CAAC;QAC3C,IAAI,WAAW,CAAC,QAAQ,CAAC,EAAE,CAAC;YAC1B,IAAA,mBAAW,EAAC,QAAQ,CAAC,CAAC;QACxB,CAAC;aAAM,IAAI,IAAA,cAAO,EAAC,QAAQ,CAAC,KAAK,KAAK,EAAE,CAAC;YACvC,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;YACtB,OAAO,CAAC,QAAQ,CAAC,CAAC;QACpB,CAAC;IACH,CAAC,CAAC,CAAC;AACL,CAAC,CAAC;AAXW,QAAA,WAAW,eAWtB"}
@@ -0,0 +1,15 @@
1
+ export declare function formatCount(num: any, locale?: string): string;
2
+ export declare function generateRandomPassword(length?: number, includeNumbers?: boolean, includeSymbols?: boolean): string;
3
+ export declare function generateRandomInteger(length: number): string;
4
+ export declare function generateRandomString(length?: number): string;
5
+ export declare function sleep(ms: number): Promise<unknown>;
6
+ export declare function catchError<T>(promise: Promise<T>): Promise<[undefined, T] | [Error]>;
7
+ /**
8
+ * Get role names for a single user
9
+ */
10
+ export declare function getUserRoles(user: Parse.User): Promise<string[]>;
11
+ /**
12
+ * Get role names for multiple users (batch — avoids N+1)
13
+ */
14
+ export declare function getUsersRoles(users: Parse.User[]): Promise<Map<string, string[]>>;
15
+ //# sourceMappingURL=helper.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"helper.d.ts","sourceRoot":"","sources":["../../src/utils/helper.ts"],"names":[],"mappings":"AAAA,wBAAgB,WAAW,CAAC,GAAG,EAAE,GAAG,EAAE,MAAM,SAAO,UAMlD;AAED,wBAAgB,sBAAsB,CACpC,MAAM,SAAI,EACV,cAAc,UAAO,EACrB,cAAc,UAAO,UAiBtB;AAED,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,MAAM,UAInD;AAED,wBAAgB,oBAAoB,CAAC,MAAM,SAAI,GAAG,MAAM,CAOvD;AAED,wBAAgB,KAAK,CAAC,EAAE,EAAE,MAAM,oBAE/B;AAED,wBAAsB,UAAU,CAAC,CAAC,EAChC,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC,GAClB,OAAO,CAAC,CAAC,SAAS,EAAE,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAQnC;AAED;;GAEG;AACH,wBAAsB,YAAY,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAKtE;AAED;;GAEG;AACH,wBAAsB,aAAa,CAAC,KAAK,EAAE,KAAK,CAAC,IAAI,EAAE,GAAG,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC,CAmBvF"}
@@ -0,0 +1,93 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.formatCount = formatCount;
4
+ exports.generateRandomPassword = generateRandomPassword;
5
+ exports.generateRandomInteger = generateRandomInteger;
6
+ exports.generateRandomString = generateRandomString;
7
+ exports.sleep = sleep;
8
+ exports.catchError = catchError;
9
+ exports.getUserRoles = getUserRoles;
10
+ exports.getUsersRoles = getUsersRoles;
11
+ function formatCount(num, locale = 'en') {
12
+ return new Intl.NumberFormat(locale, {
13
+ notation: 'compact',
14
+ compactDisplay: 'short',
15
+ maximumFractionDigits: 1,
16
+ }).format(num ?? 0);
17
+ }
18
+ function generateRandomPassword(length = 8, includeNumbers = true, includeSymbols = true) {
19
+ const lowerCaseChars = 'abcdefghijklmnopqrstuvwxyz';
20
+ const upperCaseChars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ';
21
+ const numberChars = '0123456789';
22
+ const symbolChars = '!@#$%^&*()-_=+[]{}|;:,.<>?';
23
+ let charSet = lowerCaseChars + upperCaseChars;
24
+ if (includeNumbers)
25
+ charSet += numberChars;
26
+ if (includeSymbols)
27
+ charSet += symbolChars;
28
+ let password = '';
29
+ for (let i = 0; i < length; i++) {
30
+ const randomIndex = Math.floor(Math.random() * charSet.length);
31
+ password += charSet[randomIndex];
32
+ }
33
+ return password;
34
+ }
35
+ function generateRandomInteger(length) {
36
+ const min = Math.pow(10, length - 1);
37
+ const max = Math.pow(10, length) - 1;
38
+ return (Math.floor(Math.random() * (max - min + 1)) + min).toString();
39
+ }
40
+ function generateRandomString(length = 8) {
41
+ const chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';
42
+ let result = '';
43
+ for (let i = 0; i < length; i++) {
44
+ result += chars.charAt(Math.floor(Math.random() * chars.length));
45
+ }
46
+ return result;
47
+ }
48
+ function sleep(ms) {
49
+ return new Promise(resolve => setTimeout(resolve, ms));
50
+ }
51
+ async function catchError(promise) {
52
+ return promise
53
+ .then(data => {
54
+ return [undefined, data];
55
+ })
56
+ .catch(err => {
57
+ return [err];
58
+ });
59
+ }
60
+ /**
61
+ * Get role names for a single user
62
+ */
63
+ async function getUserRoles(user) {
64
+ const roleQuery = new Parse.Query('_Role');
65
+ roleQuery.equalTo('users', user);
66
+ const roles = await roleQuery.find({ useMasterKey: true });
67
+ return roles.map(r => r.get('name'));
68
+ }
69
+ /**
70
+ * Get role names for multiple users (batch — avoids N+1)
71
+ */
72
+ async function getUsersRoles(users) {
73
+ if (users.length === 0)
74
+ return new Map();
75
+ const allRoles = await new Parse.Query('_Role').limit(100).find({ useMasterKey: true });
76
+ const userRolesMap = new Map();
77
+ for (const user of users) {
78
+ userRolesMap.set(user.id, []);
79
+ }
80
+ for (const role of allRoles) {
81
+ const usersRelation = role.getUsers().query();
82
+ usersRelation.containedIn('objectId', users.map(u => u.id));
83
+ usersRelation.limit(users.length);
84
+ const roleUsers = await usersRelation.find({ useMasterKey: true });
85
+ for (const u of roleUsers) {
86
+ const existing = userRolesMap.get(u.id) || [];
87
+ existing.push(role.get('name'));
88
+ userRolesMap.set(u.id, existing);
89
+ }
90
+ }
91
+ return userRolesMap;
92
+ }
93
+ //# sourceMappingURL=helper.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"helper.js","sourceRoot":"","sources":["../../src/utils/helper.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@90soft/parse-server-kit",
3
- "version": "1.0.0",
4
- "description": "Decorator-driven development kit for Parse Server — @ParseClass, @ParseField, BaseModel, and more.",
3
+ "version": "2.0.0",
4
+ "description": "Complete decorator-driven development kit for Parse Server — models, cloud functions, triggers, cron, routing, ACL, Swagger, and more.",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",
7
7
  "files": [
@@ -17,7 +17,10 @@
17
17
  "typescript",
18
18
  "backend",
19
19
  "cloud-functions",
20
- "mongodb"
20
+ "mongodb",
21
+ "acl",
22
+ "swagger",
23
+ "cron"
21
24
  ],
22
25
  "author": "90Soft",
23
26
  "license": "MIT",
@@ -27,12 +30,25 @@
27
30
  },
28
31
  "peerDependencies": {
29
32
  "parse": ">=5.0.0",
30
- "reflect-metadata": ">=0.1.13"
33
+ "reflect-metadata": ">=0.1.13",
34
+ "express": ">=4.0.0"
35
+ },
36
+ "peerDependenciesMeta": {
37
+ "node-cron": {
38
+ "optional": true
39
+ },
40
+ "swagger-ui-express": {
41
+ "optional": true
42
+ }
31
43
  },
32
44
  "devDependencies": {
33
45
  "typescript": "^5.5.0",
34
46
  "@types/node": "^20.0.0",
47
+ "@types/express": "^5.0.0",
35
48
  "parse": "^5.3.0",
36
- "reflect-metadata": "^0.2.2"
49
+ "reflect-metadata": "^0.2.2",
50
+ "express": "^5.0.0",
51
+ "swagger-ui-express": "^5.0.1",
52
+ "node-cron": "^4.0.0"
37
53
  }
38
54
  }