@zssz-soft/firebase-functions-shared 1.1.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 (86) hide show
  1. package/README.md +391 -0
  2. package/lib/config/app.config.d.ts +106 -0
  3. package/lib/config/app.config.d.ts.map +1 -0
  4. package/lib/config/app.config.js +55 -0
  5. package/lib/config/app.config.js.map +1 -0
  6. package/lib/config/index.d.ts +2 -0
  7. package/lib/config/index.d.ts.map +1 -0
  8. package/lib/config/index.js +18 -0
  9. package/lib/config/index.js.map +1 -0
  10. package/lib/index.d.ts +13 -0
  11. package/lib/index.d.ts.map +1 -0
  12. package/lib/index.js +29 -0
  13. package/lib/index.js.map +1 -0
  14. package/lib/modules/bootstrap/bootstrap.d.ts +4 -0
  15. package/lib/modules/bootstrap/bootstrap.d.ts.map +1 -0
  16. package/lib/modules/bootstrap/bootstrap.js +162 -0
  17. package/lib/modules/bootstrap/bootstrap.js.map +1 -0
  18. package/lib/modules/bootstrap/bootstrap.models.d.ts +20 -0
  19. package/lib/modules/bootstrap/bootstrap.models.d.ts.map +1 -0
  20. package/lib/modules/bootstrap/bootstrap.models.js +3 -0
  21. package/lib/modules/bootstrap/bootstrap.models.js.map +1 -0
  22. package/lib/modules/bootstrap/index.d.ts +3 -0
  23. package/lib/modules/bootstrap/index.d.ts.map +1 -0
  24. package/lib/modules/bootstrap/index.js +19 -0
  25. package/lib/modules/bootstrap/index.js.map +1 -0
  26. package/lib/modules/email/email.d.ts +5 -0
  27. package/lib/modules/email/email.d.ts.map +1 -0
  28. package/lib/modules/email/email.js +105 -0
  29. package/lib/modules/email/email.js.map +1 -0
  30. package/lib/modules/email/email.models.d.ts +25 -0
  31. package/lib/modules/email/email.models.d.ts.map +1 -0
  32. package/lib/modules/email/email.models.js +3 -0
  33. package/lib/modules/email/email.models.js.map +1 -0
  34. package/lib/modules/email/email.service.d.ts +11 -0
  35. package/lib/modules/email/email.service.d.ts.map +1 -0
  36. package/lib/modules/email/email.service.js +227 -0
  37. package/lib/modules/email/email.service.js.map +1 -0
  38. package/lib/modules/email/email.validator.d.ts +2 -0
  39. package/lib/modules/email/email.validator.d.ts.map +1 -0
  40. package/lib/modules/email/email.validator.js +9 -0
  41. package/lib/modules/email/email.validator.js.map +1 -0
  42. package/lib/modules/email/index.d.ts +5 -0
  43. package/lib/modules/email/index.d.ts.map +1 -0
  44. package/lib/modules/email/index.js +21 -0
  45. package/lib/modules/email/index.js.map +1 -0
  46. package/lib/modules/security/effective-permissions.d.ts +28 -0
  47. package/lib/modules/security/effective-permissions.d.ts.map +1 -0
  48. package/lib/modules/security/effective-permissions.js +133 -0
  49. package/lib/modules/security/effective-permissions.js.map +1 -0
  50. package/lib/modules/security/effective-permissions.models.d.ts +96 -0
  51. package/lib/modules/security/effective-permissions.models.d.ts.map +1 -0
  52. package/lib/modules/security/effective-permissions.models.js +24 -0
  53. package/lib/modules/security/effective-permissions.models.js.map +1 -0
  54. package/lib/modules/security/effective-permissions.triggers.d.ts +83 -0
  55. package/lib/modules/security/effective-permissions.triggers.d.ts.map +1 -0
  56. package/lib/modules/security/effective-permissions.triggers.js +307 -0
  57. package/lib/modules/security/effective-permissions.triggers.js.map +1 -0
  58. package/lib/modules/security/index.d.ts +10 -0
  59. package/lib/modules/security/index.d.ts.map +1 -0
  60. package/lib/modules/security/index.js +28 -0
  61. package/lib/modules/security/index.js.map +1 -0
  62. package/lib/modules/storage/index.d.ts +2 -0
  63. package/lib/modules/storage/index.d.ts.map +1 -0
  64. package/lib/modules/storage/index.js +18 -0
  65. package/lib/modules/storage/index.js.map +1 -0
  66. package/lib/modules/storage/thumbnail-functions.d.ts +10 -0
  67. package/lib/modules/storage/thumbnail-functions.d.ts.map +1 -0
  68. package/lib/modules/storage/thumbnail-functions.js +482 -0
  69. package/lib/modules/storage/thumbnail-functions.js.map +1 -0
  70. package/lib/modules/user/index.d.ts +4 -0
  71. package/lib/modules/user/index.d.ts.map +1 -0
  72. package/lib/modules/user/index.js +20 -0
  73. package/lib/modules/user/index.js.map +1 -0
  74. package/lib/modules/user/user-management.d.ts +29 -0
  75. package/lib/modules/user/user-management.d.ts.map +1 -0
  76. package/lib/modules/user/user-management.js +134 -0
  77. package/lib/modules/user/user-management.js.map +1 -0
  78. package/lib/modules/user/user.d.ts +2 -0
  79. package/lib/modules/user/user.d.ts.map +1 -0
  80. package/lib/modules/user/user.js +15 -0
  81. package/lib/modules/user/user.js.map +1 -0
  82. package/lib/modules/user/user.models.d.ts +15 -0
  83. package/lib/modules/user/user.models.d.ts.map +1 -0
  84. package/lib/modules/user/user.models.js +6 -0
  85. package/lib/modules/user/user.models.js.map +1 -0
  86. package/package.json +72 -0
@@ -0,0 +1,307 @@
1
+ "use strict";
2
+ /**
3
+ * Effective Permissions Trigger Factories
4
+ *
5
+ * Factory functions that create Firebase Cloud Functions v2 triggers
6
+ * for automatically maintaining the effective permissions cache.
7
+ */
8
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
9
+ if (k2 === undefined) k2 = k;
10
+ var desc = Object.getOwnPropertyDescriptor(m, k);
11
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
12
+ desc = { enumerable: true, get: function() { return m[k]; } };
13
+ }
14
+ Object.defineProperty(o, k2, desc);
15
+ }) : (function(o, m, k, k2) {
16
+ if (k2 === undefined) k2 = k;
17
+ o[k2] = m[k];
18
+ }));
19
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
20
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
21
+ }) : function(o, v) {
22
+ o["default"] = v;
23
+ });
24
+ var __importStar = (this && this.__importStar) || (function () {
25
+ var ownKeys = function(o) {
26
+ ownKeys = Object.getOwnPropertyNames || function (o) {
27
+ var ar = [];
28
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
29
+ return ar;
30
+ };
31
+ return ownKeys(o);
32
+ };
33
+ return function (mod) {
34
+ if (mod && mod.__esModule) return mod;
35
+ var result = {};
36
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
37
+ __setModuleDefault(result, mod);
38
+ return result;
39
+ };
40
+ })();
41
+ Object.defineProperty(exports, "__esModule", { value: true });
42
+ exports.createUserPermissionTriggers = createUserPermissionTriggers;
43
+ exports.createRolePermissionTriggers = createRolePermissionTriggers;
44
+ exports.createAdminPermissionEndpoints = createAdminPermissionEndpoints;
45
+ const admin = __importStar(require("firebase-admin"));
46
+ const firestore_1 = require("firebase-functions/v2/firestore");
47
+ const https_1 = require("firebase-functions/v2/https");
48
+ const effective_permissions_1 = require("./effective-permissions");
49
+ const effective_permissions_models_1 = require("./effective-permissions.models");
50
+ /**
51
+ * Create user lifecycle triggers
52
+ * Automatically maintains permission cache when users are created, updated, or deleted
53
+ *
54
+ * @param config - Configuration for the permission system
55
+ * @returns Object containing the three trigger functions
56
+ */
57
+ function createUserPermissionTriggers(config = {}) {
58
+ const cfg = Object.assign(Object.assign({}, effective_permissions_models_1.DEFAULT_EFFECTIVE_PERMISSIONS_CONFIG), config);
59
+ return {
60
+ /**
61
+ * Trigger when a new user is created
62
+ * Calculates initial effective permissions
63
+ */
64
+ onUserCreate: (0, firestore_1.onDocumentCreated)({
65
+ document: `${cfg.userCollection}/{userId}`,
66
+ region: cfg.region,
67
+ maxInstances: cfg.maxInstances,
68
+ }, async (event) => {
69
+ const userId = event.params.userId;
70
+ console.log(`New user created: ${userId}`);
71
+ await (0, effective_permissions_1.calculateEffectivePermissions)(userId, config);
72
+ }),
73
+ /**
74
+ * Trigger when a user document is updated
75
+ * Recalculates effective permissions if roles changed
76
+ */
77
+ onUserRoleChange: (0, firestore_1.onDocumentUpdated)({
78
+ document: `${cfg.userCollection}/{userId}`,
79
+ region: cfg.region,
80
+ maxInstances: cfg.maxInstances,
81
+ }, async (event) => {
82
+ var _a, _b;
83
+ const userId = event.params.userId;
84
+ const before = (_a = event.data) === null || _a === void 0 ? void 0 : _a.before.data();
85
+ const after = (_b = event.data) === null || _b === void 0 ? void 0 : _b.after.data();
86
+ if (!before || !after)
87
+ return;
88
+ const roleIdsBefore = before[cfg.userRoleIdsField] || [];
89
+ const roleIdsAfter = after[cfg.userRoleIdsField] || [];
90
+ // Check if roles actually changed
91
+ const rolesChanged = roleIdsBefore.length !== roleIdsAfter.length ||
92
+ roleIdsBefore.some((id) => !roleIdsAfter.includes(id)) ||
93
+ roleIdsAfter.some((id) => !roleIdsBefore.includes(id));
94
+ if (rolesChanged) {
95
+ console.log(`User ${userId} ${cfg.userRoleIdsField} changed`);
96
+ await (0, effective_permissions_1.calculateEffectivePermissions)(userId, config);
97
+ }
98
+ }),
99
+ /**
100
+ * Trigger when a user is deleted
101
+ * Cleans up the permission cache
102
+ */
103
+ onUserDelete: (0, firestore_1.onDocumentDeleted)({
104
+ document: `${cfg.userCollection}/{userId}`,
105
+ region: cfg.region,
106
+ maxInstances: cfg.maxInstances,
107
+ }, async (event) => {
108
+ const userId = event.params.userId;
109
+ console.log(`User deleted: ${userId}`);
110
+ await (0, effective_permissions_1.deleteEffectivePermissions)(userId, config);
111
+ }),
112
+ };
113
+ }
114
+ /**
115
+ * Create role permission change triggers
116
+ * Automatically updates all affected users when role permissions change
117
+ *
118
+ * @param config - Configuration for the permission system
119
+ * @returns Object containing the two trigger functions
120
+ */
121
+ function createRolePermissionTriggers(config = {}) {
122
+ const cfg = Object.assign(Object.assign({}, effective_permissions_models_1.DEFAULT_EFFECTIVE_PERMISSIONS_CONFIG), config);
123
+ return {
124
+ /**
125
+ * Trigger when a role's permissions are updated
126
+ * Updates all users who have this role
127
+ */
128
+ onRolePermissionsChange: (0, firestore_1.onDocumentUpdated)({
129
+ document: `${cfg.roleCollection}/{roleId}`,
130
+ region: cfg.region,
131
+ maxInstances: cfg.maxInstances,
132
+ }, async (event) => {
133
+ var _a, _b;
134
+ const roleId = event.params.roleId;
135
+ const before = (_a = event.data) === null || _a === void 0 ? void 0 : _a.before.data();
136
+ const after = (_b = event.data) === null || _b === void 0 ? void 0 : _b.after.data();
137
+ if (!before || !after)
138
+ return;
139
+ const permissionsBefore = before[cfg.rolePermissionsField] || [];
140
+ const permissionsAfter = after[cfg.rolePermissionsField] || [];
141
+ // Check if permissions actually changed
142
+ const permissionsChanged = permissionsBefore.length !== permissionsAfter.length ||
143
+ permissionsBefore.some((p) => !permissionsAfter.includes(p)) ||
144
+ permissionsAfter.some((p) => !permissionsBefore.includes(p));
145
+ if (!permissionsChanged) {
146
+ return;
147
+ }
148
+ console.log(`Role ${roleId} ${cfg.rolePermissionsField} changed`);
149
+ // Find all users with this role
150
+ const db = admin.firestore();
151
+ const usersSnapshot = await db
152
+ .collection(cfg.userCollection)
153
+ .where(cfg.userRoleIdsField, 'array-contains', roleId)
154
+ .get();
155
+ console.log(`Found ${usersSnapshot.size} users with role ${roleId}`);
156
+ const userIds = usersSnapshot.docs.map((doc) => doc.id);
157
+ await (0, effective_permissions_1.batchUpdateEffectivePermissions)(userIds, config);
158
+ }),
159
+ /**
160
+ * Trigger when a role is deleted
161
+ * Updates all users who had this role
162
+ */
163
+ onRoleDelete: (0, firestore_1.onDocumentDeleted)({
164
+ document: `${cfg.roleCollection}/{roleId}`,
165
+ region: cfg.region,
166
+ maxInstances: cfg.maxInstances,
167
+ }, async (event) => {
168
+ const roleId = event.params.roleId;
169
+ console.log(`Role ${roleId} deleted`);
170
+ // Find all users with this role
171
+ const db = admin.firestore();
172
+ const usersSnapshot = await db
173
+ .collection(cfg.userCollection)
174
+ .where(cfg.userRoleIdsField, 'array-contains', roleId)
175
+ .get();
176
+ const userIds = usersSnapshot.docs.map((doc) => doc.id);
177
+ await (0, effective_permissions_1.batchUpdateEffectivePermissions)(userIds, config);
178
+ console.log(`Updated ${usersSnapshot.size} users after role deletion`);
179
+ }),
180
+ };
181
+ }
182
+ /**
183
+ * Create admin HTTP endpoints for manual permission management
184
+ *
185
+ * @param config - Configuration for the permission system
186
+ * @param adminSecretKey - Key in functions config where admin secret is stored (e.g., 'admin.secret')
187
+ * @returns Object containing bootstrap and recalculate endpoints
188
+ */
189
+ function createAdminPermissionEndpoints(config = {}, adminSecretKey = 'admin.secret') {
190
+ const cfg = Object.assign(Object.assign({}, effective_permissions_models_1.DEFAULT_EFFECTIVE_PERMISSIONS_CONFIG), config);
191
+ /**
192
+ * Validate admin secret from request headers
193
+ */
194
+ function validateAdminSecret(req) {
195
+ var _a;
196
+ const providedSecret = (_a = req.headers.authorization) === null || _a === void 0 ? void 0 : _a.replace('Bearer ', '');
197
+ const configPath = adminSecretKey.split('.');
198
+ let secret = require('firebase-functions').config();
199
+ for (const key of configPath) {
200
+ secret = secret === null || secret === void 0 ? void 0 : secret[key];
201
+ }
202
+ return providedSecret === secret;
203
+ }
204
+ return {
205
+ /**
206
+ * Bootstrap endpoint - initialize permissions for all existing users
207
+ * POST /bootstrapEffectivePermissions
208
+ * Requires Authorization: Bearer <admin-secret>
209
+ */
210
+ bootstrapEffectivePermissions: (0, https_1.onRequest)({
211
+ region: cfg.region,
212
+ maxInstances: cfg.maxInstances,
213
+ }, async (req, res) => {
214
+ // CORS
215
+ res.set('Access-Control-Allow-Origin', '*');
216
+ if (req.method === 'OPTIONS') {
217
+ res.set('Access-Control-Allow-Methods', 'POST');
218
+ res.set('Access-Control-Allow-Headers', 'Authorization,Content-Type');
219
+ res.status(204).send('');
220
+ return;
221
+ }
222
+ // Validate admin secret
223
+ if (!validateAdminSecret(req)) {
224
+ res.status(403).json({ error: 'Forbidden: Invalid admin secret' });
225
+ return;
226
+ }
227
+ try {
228
+ console.log('Starting bootstrap of effective permissions for all users...');
229
+ const db = admin.firestore();
230
+ const usersSnapshot = await db.collection(cfg.userCollection).get();
231
+ const totalUsers = usersSnapshot.size;
232
+ console.log(`Found ${totalUsers} users to bootstrap`);
233
+ if (totalUsers === 0) {
234
+ res.json({
235
+ success: true,
236
+ message: 'No users found to bootstrap',
237
+ usersProcessed: 0,
238
+ });
239
+ return;
240
+ }
241
+ const userIds = usersSnapshot.docs.map((doc) => doc.id);
242
+ await (0, effective_permissions_1.batchUpdateEffectivePermissions)(userIds, config);
243
+ res.json({
244
+ success: true,
245
+ message: `Bootstrapped effective permissions for ${totalUsers} users`,
246
+ usersProcessed: totalUsers,
247
+ totalUsers,
248
+ });
249
+ }
250
+ catch (error) {
251
+ console.error('Error during bootstrap:', error);
252
+ res.status(500).json({
253
+ error: 'Bootstrap failed',
254
+ message: error.message,
255
+ });
256
+ }
257
+ }),
258
+ /**
259
+ * Recalculate endpoint - manually recalculate permissions for a single user
260
+ * POST /recalculateUserPermissions
261
+ * Body: { userId: string }
262
+ * Requires Authorization: Bearer <admin-secret>
263
+ */
264
+ recalculateUserPermissions: (0, https_1.onRequest)({
265
+ region: cfg.region,
266
+ maxInstances: cfg.maxInstances,
267
+ }, async (req, res) => {
268
+ var _a;
269
+ // CORS
270
+ res.set('Access-Control-Allow-Origin', '*');
271
+ if (req.method === 'OPTIONS') {
272
+ res.set('Access-Control-Allow-Methods', 'POST');
273
+ res.set('Access-Control-Allow-Headers', 'Authorization,Content-Type');
274
+ res.status(204).send('');
275
+ return;
276
+ }
277
+ // Validate admin secret
278
+ if (!validateAdminSecret(req)) {
279
+ res.status(403).json({ error: 'Forbidden: Invalid admin secret' });
280
+ return;
281
+ }
282
+ const userId = ((_a = req.body) === null || _a === void 0 ? void 0 : _a.userId) || req.query.userId;
283
+ if (!userId) {
284
+ res.status(400).json({ error: 'Missing userId parameter' });
285
+ return;
286
+ }
287
+ try {
288
+ console.log(`Manual recalculation requested for user: ${userId}`);
289
+ await (0, effective_permissions_1.calculateEffectivePermissions)(userId, config);
290
+ res.json({
291
+ success: true,
292
+ message: `Effective permissions recalculated for user ${userId}`,
293
+ userId,
294
+ });
295
+ }
296
+ catch (error) {
297
+ console.error(`Error recalculating permissions for ${userId}:`, error);
298
+ res.status(500).json({
299
+ error: 'Recalculation failed',
300
+ message: error.message,
301
+ userId,
302
+ });
303
+ }
304
+ }),
305
+ };
306
+ }
307
+ //# sourceMappingURL=effective-permissions.triggers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"effective-permissions.triggers.js","sourceRoot":"","sources":["../../../src/modules/security/effective-permissions.triggers.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ /**
2
+ * Security Module - Effective Permissions System
3
+ *
4
+ * Provides automatic permission caching for Firebase security rules.
5
+ * Maintains denormalized cache based on user roles and permissions.
6
+ */
7
+ export { EffectivePermissionsConfig, DEFAULT_EFFECTIVE_PERMISSIONS_CONFIG, EffectivePermissions, UserDocument, } from './effective-permissions.models';
8
+ export * from './effective-permissions';
9
+ export * from './effective-permissions.triggers';
10
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/modules/security/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EACL,0BAA0B,EAC1B,oCAAoC,EACpC,oBAAoB,EACpB,YAAY,GACb,MAAM,gCAAgC,CAAC;AAExC,cAAc,yBAAyB,CAAC;AACxC,cAAc,kCAAkC,CAAC"}
@@ -0,0 +1,28 @@
1
+ "use strict";
2
+ /**
3
+ * Security Module - Effective Permissions System
4
+ *
5
+ * Provides automatic permission caching for Firebase security rules.
6
+ * Maintains denormalized cache based on user roles and permissions.
7
+ */
8
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
9
+ if (k2 === undefined) k2 = k;
10
+ var desc = Object.getOwnPropertyDescriptor(m, k);
11
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
12
+ desc = { enumerable: true, get: function() { return m[k]; } };
13
+ }
14
+ Object.defineProperty(o, k2, desc);
15
+ }) : (function(o, m, k, k2) {
16
+ if (k2 === undefined) k2 = k;
17
+ o[k2] = m[k];
18
+ }));
19
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
20
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
21
+ };
22
+ Object.defineProperty(exports, "__esModule", { value: true });
23
+ exports.DEFAULT_EFFECTIVE_PERMISSIONS_CONFIG = void 0;
24
+ var effective_permissions_models_1 = require("./effective-permissions.models");
25
+ Object.defineProperty(exports, "DEFAULT_EFFECTIVE_PERMISSIONS_CONFIG", { enumerable: true, get: function () { return effective_permissions_models_1.DEFAULT_EFFECTIVE_PERMISSIONS_CONFIG; } });
26
+ __exportStar(require("./effective-permissions"), exports);
27
+ __exportStar(require("./effective-permissions.triggers"), exports);
28
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/modules/security/index.ts"],"names":[],"mappings":";AAAA;;;;;GAKG;;;;;;;;;;;;;;;;;AAEH,+EAKwC;AAHtC,oJAAA,oCAAoC,OAAA;AAKtC,0DAAwC;AACxC,mEAAiD"}
@@ -0,0 +1,2 @@
1
+ export * from './thumbnail-functions';
2
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/modules/storage/index.ts"],"names":[],"mappings":"AAAA,cAAc,uBAAuB,CAAC"}
@@ -0,0 +1,18 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
+ };
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ __exportStar(require("./thumbnail-functions"), exports);
18
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/modules/storage/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,wDAAsC"}
@@ -0,0 +1,10 @@
1
+ interface GenerateThumbnailRequest {
2
+ path: string;
3
+ maxWidth?: number;
4
+ maxHeight?: number;
5
+ force?: boolean;
6
+ documentId?: string;
7
+ }
8
+ export declare const generateThumbnail: import("firebase-functions/v2/https").CallableFunction<GenerateThumbnailRequest, any, unknown>;
9
+ export {};
10
+ //# sourceMappingURL=thumbnail-functions.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"thumbnail-functions.d.ts","sourceRoot":"","sources":["../../../src/modules/storage/thumbnail-functions.ts"],"names":[],"mappings":"AASA,UAAU,wBAAwB;IAChC,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAiTD,eAAO,MAAM,iBAAiB,gGAwO7B,CAAC"}