@zssz-soft/firebase-functions-shared 1.1.2 → 1.2.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (31) hide show
  1. package/lib/__tests__/mocks/firebase-admin.mock.d.ts +81 -0
  2. package/lib/__tests__/mocks/firebase-admin.mock.d.ts.map +1 -0
  3. package/lib/__tests__/mocks/firebase-admin.mock.js +111 -0
  4. package/lib/__tests__/mocks/firebase-admin.mock.js.map +1 -0
  5. package/lib/__tests__/mocks/firebase-functions.mock.d.ts +37 -0
  6. package/lib/__tests__/mocks/firebase-functions.mock.d.ts.map +1 -0
  7. package/lib/__tests__/mocks/firebase-functions.mock.js +59 -0
  8. package/lib/__tests__/mocks/firebase-functions.mock.js.map +1 -0
  9. package/lib/config/app.config.d.ts +5 -0
  10. package/lib/config/app.config.d.ts.map +1 -1
  11. package/lib/config/app.config.js.map +1 -1
  12. package/lib/modules/bootstrap/bootstrap.d.ts +61 -2
  13. package/lib/modules/bootstrap/bootstrap.d.ts.map +1 -1
  14. package/lib/modules/bootstrap/bootstrap.js +200 -141
  15. package/lib/modules/bootstrap/bootstrap.js.map +1 -1
  16. package/lib/modules/email/email.d.ts.map +1 -1
  17. package/lib/modules/email/email.js +1 -1
  18. package/lib/modules/email/email.js.map +1 -1
  19. package/lib/modules/email/email.service.js +1 -1
  20. package/lib/modules/email/email.service.js.map +1 -1
  21. package/lib/modules/security/effective-permissions.d.ts.map +1 -1
  22. package/lib/modules/security/effective-permissions.js +7 -6
  23. package/lib/modules/security/effective-permissions.js.map +1 -1
  24. package/lib/modules/storage/thumbnail-functions.d.ts.map +1 -1
  25. package/lib/modules/storage/thumbnail-functions.js +24 -21
  26. package/lib/modules/storage/thumbnail-functions.js.map +1 -1
  27. package/lib/modules/user/user-management.d.ts +42 -7
  28. package/lib/modules/user/user-management.d.ts.map +1 -1
  29. package/lib/modules/user/user-management.js +131 -79
  30. package/lib/modules/user/user-management.js.map +1 -1
  31. package/package.json +1 -1
@@ -0,0 +1,81 @@
1
+ /**
2
+ * Firebase Admin SDK mocks for unit testing
3
+ */
4
+ export declare const createMockDocumentSnapshot: (exists: boolean, data?: any) => {
5
+ exists: boolean;
6
+ data: () => any;
7
+ id: any;
8
+ ref: {
9
+ set: jest.Mock<any, any, any>;
10
+ update: jest.Mock<any, any, any>;
11
+ delete: jest.Mock<any, any, any>;
12
+ };
13
+ };
14
+ export declare const createMockQuerySnapshot: (docs: any[]) => {
15
+ empty: boolean;
16
+ size: number;
17
+ docs: {
18
+ exists: boolean;
19
+ data: () => any;
20
+ id: any;
21
+ ref: {
22
+ set: jest.Mock<any, any, any>;
23
+ update: jest.Mock<any, any, any>;
24
+ delete: jest.Mock<any, any, any>;
25
+ };
26
+ }[];
27
+ };
28
+ export declare const createMockCollectionRef: (querySnapshot?: any) => {
29
+ doc: jest.Mock<any, any, any>;
30
+ where: jest.Mock<any, any, any>;
31
+ limit: jest.Mock<any, any, any>;
32
+ get: jest.Mock<any, any, any>;
33
+ };
34
+ export declare const createMockFirestore: () => {
35
+ collection: jest.Mock<any, any, any>;
36
+ };
37
+ export declare const createMockUserRecord: (uid: string, email: string, displayName?: string) => {
38
+ uid: string;
39
+ email: string;
40
+ displayName: string;
41
+ emailVerified: boolean;
42
+ disabled: boolean;
43
+ metadata: {
44
+ creationTime: string;
45
+ lastSignInTime: null;
46
+ };
47
+ providerData: never[];
48
+ toJSON: () => {
49
+ uid: string;
50
+ email: string;
51
+ displayName: string | undefined;
52
+ };
53
+ };
54
+ export declare const createMockAuth: () => {
55
+ createUser: jest.Mock<any, any, any>;
56
+ getUser: jest.Mock<any, any, any>;
57
+ deleteUser: jest.Mock<any, any, any>;
58
+ updateUser: jest.Mock<any, any, any>;
59
+ };
60
+ export declare const createMockBucket: () => {
61
+ file: jest.Mock<any, any, any>;
62
+ name: string;
63
+ };
64
+ export declare const createMockStorage: () => {
65
+ bucket: jest.Mock<any, any, any>;
66
+ };
67
+ export declare const setupFirebaseAdminMocks: () => {
68
+ mockFirestore: {
69
+ collection: jest.Mock<any, any, any>;
70
+ };
71
+ mockAuth: {
72
+ createUser: jest.Mock<any, any, any>;
73
+ getUser: jest.Mock<any, any, any>;
74
+ deleteUser: jest.Mock<any, any, any>;
75
+ updateUser: jest.Mock<any, any, any>;
76
+ };
77
+ mockStorage: {
78
+ bucket: jest.Mock<any, any, any>;
79
+ };
80
+ };
81
+ //# sourceMappingURL=firebase-admin.mock.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"firebase-admin.mock.d.ts","sourceRoot":"","sources":["../../../src/__tests__/mocks/firebase-admin.mock.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,eAAO,MAAM,0BAA0B,GAAI,QAAQ,OAAO,EAAE,OAAO,GAAG;;;;;;;;;CASpE,CAAC;AAGH,eAAO,MAAM,uBAAuB,GAAI,MAAM,GAAG,EAAE;;;;;;;;;;;;;CAIjD,CAAC;AAGH,eAAO,MAAM,uBAAuB,GAAI,gBAAgB,GAAG;;;;;CAUzD,CAAC;AAGH,eAAO,MAAM,mBAAmB;;CAE9B,CAAC;AAGH,eAAO,MAAM,oBAAoB,GAAI,KAAK,MAAM,EAAE,OAAO,MAAM,EAAE,cAAc,MAAM;;;;;;;;;;;;;;;;CAYnF,CAAC;AAGH,eAAO,MAAM,cAAc;;;;;CAezB,CAAC;AAGH,eAAO,MAAM,gBAAgB;;;CAU3B,CAAC;AAGH,eAAO,MAAM,iBAAiB;;CAE5B,CAAC;AAGH,eAAO,MAAM,uBAAuB;;;;;;;;;;;;;CAqBnC,CAAC"}
@@ -0,0 +1,111 @@
1
+ "use strict";
2
+ /**
3
+ * Firebase Admin SDK mocks for unit testing
4
+ */
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.setupFirebaseAdminMocks = exports.createMockStorage = exports.createMockBucket = exports.createMockAuth = exports.createMockUserRecord = exports.createMockFirestore = exports.createMockCollectionRef = exports.createMockQuerySnapshot = exports.createMockDocumentSnapshot = void 0;
7
+ // Mock Firestore document snapshot
8
+ const createMockDocumentSnapshot = (exists, data) => ({
9
+ exists,
10
+ data: () => data,
11
+ id: (data === null || data === void 0 ? void 0 : data.id) || 'mock-doc-id',
12
+ ref: {
13
+ set: jest.fn().mockResolvedValue(undefined),
14
+ update: jest.fn().mockResolvedValue(undefined),
15
+ delete: jest.fn().mockResolvedValue(undefined),
16
+ },
17
+ });
18
+ exports.createMockDocumentSnapshot = createMockDocumentSnapshot;
19
+ // Mock Firestore query snapshot
20
+ const createMockQuerySnapshot = (docs) => ({
21
+ empty: docs.length === 0,
22
+ size: docs.length,
23
+ docs: docs.map((doc, index) => (0, exports.createMockDocumentSnapshot)(true, Object.assign({ id: `doc-${index}` }, doc))),
24
+ });
25
+ exports.createMockQuerySnapshot = createMockQuerySnapshot;
26
+ // Mock Firestore collection reference
27
+ const createMockCollectionRef = (querySnapshot) => ({
28
+ doc: jest.fn().mockReturnValue({
29
+ get: jest.fn().mockResolvedValue((0, exports.createMockDocumentSnapshot)(false)),
30
+ set: jest.fn().mockResolvedValue(undefined),
31
+ update: jest.fn().mockResolvedValue(undefined),
32
+ delete: jest.fn().mockResolvedValue(undefined),
33
+ }),
34
+ where: jest.fn().mockReturnThis(),
35
+ limit: jest.fn().mockReturnThis(),
36
+ get: jest.fn().mockResolvedValue(querySnapshot || (0, exports.createMockQuerySnapshot)([])),
37
+ });
38
+ exports.createMockCollectionRef = createMockCollectionRef;
39
+ // Mock Firestore instance
40
+ const createMockFirestore = () => ({
41
+ collection: jest.fn().mockReturnValue((0, exports.createMockCollectionRef)()),
42
+ });
43
+ exports.createMockFirestore = createMockFirestore;
44
+ // Mock Auth user record
45
+ const createMockUserRecord = (uid, email, displayName) => ({
46
+ uid,
47
+ email,
48
+ displayName: displayName || email.split('@')[0],
49
+ emailVerified: false,
50
+ disabled: false,
51
+ metadata: {
52
+ creationTime: new Date().toISOString(),
53
+ lastSignInTime: null,
54
+ },
55
+ providerData: [],
56
+ toJSON: () => ({ uid, email, displayName }),
57
+ });
58
+ exports.createMockUserRecord = createMockUserRecord;
59
+ // Mock Auth instance
60
+ const createMockAuth = () => ({
61
+ createUser: jest
62
+ .fn()
63
+ .mockImplementation(({ email, displayName }) => Promise.resolve((0, exports.createMockUserRecord)(`uid-${Date.now()}`, email, displayName))),
64
+ getUser: jest
65
+ .fn()
66
+ .mockImplementation((uid) => Promise.resolve((0, exports.createMockUserRecord)(uid, `${uid}@test.com`))),
67
+ deleteUser: jest.fn().mockResolvedValue(undefined),
68
+ updateUser: jest
69
+ .fn()
70
+ .mockImplementation((uid, data) => Promise.resolve((0, exports.createMockUserRecord)(uid, data.email || `${uid}@test.com`, data.displayName))),
71
+ });
72
+ exports.createMockAuth = createMockAuth;
73
+ // Mock Storage bucket
74
+ const createMockBucket = () => ({
75
+ file: jest.fn().mockReturnValue({
76
+ exists: jest.fn().mockResolvedValue([false]),
77
+ getMetadata: jest.fn().mockResolvedValue([{ contentType: 'image/jpeg', metadata: {} }]),
78
+ setMetadata: jest.fn().mockResolvedValue(undefined),
79
+ download: jest.fn().mockResolvedValue([Buffer.from('mock-file-content')]),
80
+ save: jest.fn().mockResolvedValue(undefined),
81
+ delete: jest.fn().mockResolvedValue(undefined),
82
+ }),
83
+ name: 'mock-bucket',
84
+ });
85
+ exports.createMockBucket = createMockBucket;
86
+ // Mock Storage instance
87
+ const createMockStorage = () => ({
88
+ bucket: jest.fn().mockReturnValue((0, exports.createMockBucket)()),
89
+ });
90
+ exports.createMockStorage = createMockStorage;
91
+ // Setup all Firebase Admin mocks
92
+ const setupFirebaseAdminMocks = () => {
93
+ const mockFirestore = (0, exports.createMockFirestore)();
94
+ const mockAuth = (0, exports.createMockAuth)();
95
+ const mockStorage = (0, exports.createMockStorage)();
96
+ jest.mock('firebase-admin/firestore', () => ({
97
+ getFirestore: jest.fn().mockReturnValue(mockFirestore),
98
+ FieldValue: {
99
+ serverTimestamp: jest.fn().mockReturnValue(new Date().toISOString()),
100
+ },
101
+ }));
102
+ jest.mock('firebase-admin/auth', () => ({
103
+ getAuth: jest.fn().mockReturnValue(mockAuth),
104
+ }));
105
+ jest.mock('firebase-admin/storage', () => ({
106
+ getStorage: jest.fn().mockReturnValue(mockStorage),
107
+ }));
108
+ return { mockFirestore, mockAuth, mockStorage };
109
+ };
110
+ exports.setupFirebaseAdminMocks = setupFirebaseAdminMocks;
111
+ //# sourceMappingURL=firebase-admin.mock.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"firebase-admin.mock.js","sourceRoot":"","sources":["../../../src/__tests__/mocks/firebase-admin.mock.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,37 @@
1
+ /**
2
+ * Firebase Functions mocks for unit testing
3
+ */
4
+ export declare const mockLogger: {
5
+ info: jest.Mock<any, any, any>;
6
+ warn: jest.Mock<any, any, any>;
7
+ error: jest.Mock<any, any, any>;
8
+ debug: jest.Mock<any, any, any>;
9
+ log: jest.Mock<any, any, any>;
10
+ };
11
+ export declare class MockHttpsError extends Error {
12
+ code: string;
13
+ details?: any | undefined;
14
+ constructor(code: string, message: string, details?: any | undefined);
15
+ }
16
+ export declare const createMockCallableRequest: <T>(data: T, auth?: {
17
+ uid: string;
18
+ token?: any;
19
+ }) => {
20
+ data: T;
21
+ auth: {
22
+ uid: string;
23
+ token: any;
24
+ } | undefined;
25
+ rawRequest: {};
26
+ };
27
+ export declare const setupFirebaseFunctionsMocks: () => {
28
+ mockLogger: {
29
+ info: jest.Mock<any, any, any>;
30
+ warn: jest.Mock<any, any, any>;
31
+ error: jest.Mock<any, any, any>;
32
+ debug: jest.Mock<any, any, any>;
33
+ log: jest.Mock<any, any, any>;
34
+ };
35
+ MockHttpsError: typeof MockHttpsError;
36
+ };
37
+ //# sourceMappingURL=firebase-functions.mock.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"firebase-functions.mock.d.ts","sourceRoot":"","sources":["../../../src/__tests__/mocks/firebase-functions.mock.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,eAAO,MAAM,UAAU;;;;;;CAMtB,CAAC;AAGF,qBAAa,cAAe,SAAQ,KAAK;IAE9B,IAAI,EAAE,MAAM;IAEZ,OAAO,CAAC,EAAE,GAAG;gBAFb,IAAI,EAAE,MAAM,EACnB,OAAO,EAAE,MAAM,EACR,OAAO,CAAC,EAAE,GAAG,YAAA;CAKvB;AAGD,eAAO,MAAM,yBAAyB,GAAI,CAAC,EAAE,MAAM,CAAC,EAAE,OAAO;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,GAAG,CAAA;CAAE;;;;;;;CAIvF,CAAC;AAGH,eAAO,MAAM,2BAA2B;;;;;;;;;CA4BvC,CAAC"}
@@ -0,0 +1,59 @@
1
+ "use strict";
2
+ /**
3
+ * Firebase Functions mocks for unit testing
4
+ */
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.setupFirebaseFunctionsMocks = exports.createMockCallableRequest = exports.MockHttpsError = exports.mockLogger = void 0;
7
+ // Mock logger
8
+ exports.mockLogger = {
9
+ info: jest.fn(),
10
+ warn: jest.fn(),
11
+ error: jest.fn(),
12
+ debug: jest.fn(),
13
+ log: jest.fn(),
14
+ };
15
+ // Mock HttpsError
16
+ class MockHttpsError extends Error {
17
+ constructor(code, message, details) {
18
+ super(message);
19
+ this.code = code;
20
+ this.details = details;
21
+ this.name = 'HttpsError';
22
+ }
23
+ }
24
+ exports.MockHttpsError = MockHttpsError;
25
+ // Mock callable request
26
+ const createMockCallableRequest = (data, auth) => ({
27
+ data,
28
+ auth: auth ? { uid: auth.uid, token: auth.token || {} } : undefined,
29
+ rawRequest: {},
30
+ });
31
+ exports.createMockCallableRequest = createMockCallableRequest;
32
+ // Setup Firebase Functions mocks
33
+ const setupFirebaseFunctionsMocks = () => {
34
+ jest.mock('firebase-functions', () => ({
35
+ logger: exports.mockLogger,
36
+ }));
37
+ jest.mock('firebase-functions/logger', () => exports.mockLogger);
38
+ jest.mock('firebase-functions/https', () => ({
39
+ HttpsError: MockHttpsError,
40
+ onCall: jest.fn().mockImplementation((options, handler) => {
41
+ if (typeof options === 'function') {
42
+ return options;
43
+ }
44
+ return handler;
45
+ }),
46
+ }));
47
+ jest.mock('firebase-functions/v2/https', () => ({
48
+ HttpsError: MockHttpsError,
49
+ onCall: jest.fn().mockImplementation((options, handler) => {
50
+ if (typeof options === 'function') {
51
+ return options;
52
+ }
53
+ return handler;
54
+ }),
55
+ }));
56
+ return { mockLogger: exports.mockLogger, MockHttpsError };
57
+ };
58
+ exports.setupFirebaseFunctionsMocks = setupFirebaseFunctionsMocks;
59
+ //# sourceMappingURL=firebase-functions.mock.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"firebase-functions.mock.js","sourceRoot":"","sources":["../../../src/__tests__/mocks/firebase-functions.mock.ts"],"names":[],"mappings":";AAAA;;GAEG;;;AAEH,cAAc;AACD,QAAA,UAAU,GAAG;IACxB,IAAI,EAAE,IAAI,CAAC,EAAE,EAAE;IACf,IAAI,EAAE,IAAI,CAAC,EAAE,EAAE;IACf,KAAK,EAAE,IAAI,CAAC,EAAE,EAAE;IAChB,KAAK,EAAE,IAAI,CAAC,EAAE,EAAE;IAChB,GAAG,EAAE,IAAI,CAAC,EAAE,EAAE;CACf,CAAC;AAEF,kBAAkB;AAClB,MAAa,cAAe,SAAQ,KAAK;IACvC,YACS,IAAY,EACnB,OAAe,EACR,OAAa;QAEpB,KAAK,CAAC,OAAO,CAAC,CAAC;QAJR,SAAI,GAAJ,IAAI,CAAQ;QAEZ,YAAO,GAAP,OAAO,CAAM;QAGpB,IAAI,CAAC,IAAI,GAAG,YAAY,CAAC;IAC3B,CAAC;CACF;AATD,wCASC;AAED,wBAAwB;AACjB,MAAM,yBAAyB,GAAG,CAAI,IAAO,EAAE,IAAmC,EAAE,EAAE,CAAC,CAAC;IAC7F,IAAI;IACJ,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,IAAI,CAAC,GAAG,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,IAAI,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS;IACnE,UAAU,EAAE,EAAE;CACf,CAAC,CAAC;AAJU,QAAA,yBAAyB,6BAInC;AAEH,iCAAiC;AAC1B,MAAM,2BAA2B,GAAG,GAAG,EAAE;IAC9C,IAAI,CAAC,IAAI,CAAC,oBAAoB,EAAE,GAAG,EAAE,CAAC,CAAC;QACrC,MAAM,EAAE,kBAAU;KACnB,CAAC,CAAC,CAAC;IAEJ,IAAI,CAAC,IAAI,CAAC,2BAA2B,EAAE,GAAG,EAAE,CAAC,kBAAU,CAAC,CAAC;IAEzD,IAAI,CAAC,IAAI,CAAC,0BAA0B,EAAE,GAAG,EAAE,CAAC,CAAC;QAC3C,UAAU,EAAE,cAAc;QAC1B,MAAM,EAAE,IAAI,CAAC,EAAE,EAAE,CAAC,kBAAkB,CAAC,CAAC,OAAO,EAAE,OAAO,EAAE,EAAE;YACxD,IAAI,OAAO,OAAO,KAAK,UAAU,EAAE,CAAC;gBAClC,OAAO,OAAO,CAAC;YACjB,CAAC;YACD,OAAO,OAAO,CAAC;QACjB,CAAC,CAAC;KACH,CAAC,CAAC,CAAC;IAEJ,IAAI,CAAC,IAAI,CAAC,6BAA6B,EAAE,GAAG,EAAE,CAAC,CAAC;QAC9C,UAAU,EAAE,cAAc;QAC1B,MAAM,EAAE,IAAI,CAAC,EAAE,EAAE,CAAC,kBAAkB,CAAC,CAAC,OAAO,EAAE,OAAO,EAAE,EAAE;YACxD,IAAI,OAAO,OAAO,KAAK,UAAU,EAAE,CAAC;gBAClC,OAAO,OAAO,CAAC;YACjB,CAAC;YACD,OAAO,OAAO,CAAC;QACjB,CAAC,CAAC;KACH,CAAC,CAAC,CAAC;IAEJ,OAAO,EAAE,UAAU,EAAV,kBAAU,EAAE,cAAc,EAAE,CAAC;AACxC,CAAC,CAAC;AA5BW,QAAA,2BAA2B,+BA4BtC"}
@@ -52,6 +52,11 @@ export interface AppConfig {
52
52
  * Maximum number of Cloud Function instances
53
53
  */
54
54
  maxInstances?: number;
55
+ /**
56
+ * Enable App Check enforcement for callable functions
57
+ * When true, only requests with valid App Check tokens will be accepted
58
+ */
59
+ enforceAppCheck?: boolean;
55
60
  }
56
61
  /**
57
62
  * Email Configuration
@@ -1 +1 @@
1
- {"version":3,"file":"app.config.d.ts","sourceRoot":"","sources":["../../src/config/app.config.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,MAAM,WAAW,SAAS;IACxB;;;OAGG;IACH,SAAS,EAAE,MAAM,CAAC;IAElB;;;OAGG;IACH,MAAM,EAAE,MAAM,CAAC;IAEf;;;OAGG;IACH,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAE7B;;;OAGG;IACH,OAAO,EAAE,MAAM,CAAC;IAEhB;;;OAGG;IACH,oBAAoB,EAAE,MAAM,CAAC;IAE7B;;;OAGG;IACH,mBAAmB,EAAE,MAAM,CAAC;IAE5B;;OAEG;IACH,kBAAkB,EAAE,MAAM,CAAC;IAE3B;;OAEG;IACH,iBAAiB,EAAE,MAAM,CAAC;IAE1B;;;OAGG;IACH,eAAe,EAAE,MAAM,CAAC;IAExB;;OAEG;IACH,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED;;GAEG;AACH,MAAM,WAAW,WAAW;IAC1B;;OAEG;IACH,IAAI,EAAE,MAAM,CAAC;IAEb;;;OAGG;IACH,IAAI,EAAE,MAAM,CAAC;IAEb;;;OAGG;IACH,MAAM,EAAE,OAAO,CAAC;IAEhB;;OAEG;IACH,IAAI,EAAE,MAAM,CAAC;IAEb;;;OAGG;IACH,IAAI,EAAE,MAAM,CAAC;IAEb;;OAEG;IACH,QAAQ,EAAE,MAAM,CAAC;IAEjB;;OAEG;IACH,SAAS,EAAE,MAAM,CAAC;CACnB;AAID;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CAExD;AAED;;;GAGG;AACH,wBAAgB,SAAS,IAAI,SAAS,CAKrC;AAED;;GAEG;AACH,wBAAgB,cAAc,IAAI,WAAW,CA2B5C"}
1
+ {"version":3,"file":"app.config.d.ts","sourceRoot":"","sources":["../../src/config/app.config.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,MAAM,WAAW,SAAS;IACxB;;;OAGG;IACH,SAAS,EAAE,MAAM,CAAC;IAElB;;;OAGG;IACH,MAAM,EAAE,MAAM,CAAC;IAEf;;;OAGG;IACH,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAE7B;;;OAGG;IACH,OAAO,EAAE,MAAM,CAAC;IAEhB;;;OAGG;IACH,oBAAoB,EAAE,MAAM,CAAC;IAE7B;;;OAGG;IACH,mBAAmB,EAAE,MAAM,CAAC;IAE5B;;OAEG;IACH,kBAAkB,EAAE,MAAM,CAAC;IAE3B;;OAEG;IACH,iBAAiB,EAAE,MAAM,CAAC;IAE1B;;;OAGG;IACH,eAAe,EAAE,MAAM,CAAC;IAExB;;OAEG;IACH,YAAY,CAAC,EAAE,MAAM,CAAC;IAEtB;;;OAGG;IACH,eAAe,CAAC,EAAE,OAAO,CAAC;CAC3B;AAED;;GAEG;AACH,MAAM,WAAW,WAAW;IAC1B;;OAEG;IACH,IAAI,EAAE,MAAM,CAAC;IAEb;;;OAGG;IACH,IAAI,EAAE,MAAM,CAAC;IAEb;;;OAGG;IACH,MAAM,EAAE,OAAO,CAAC;IAEhB;;OAEG;IACH,IAAI,EAAE,MAAM,CAAC;IAEb;;;OAGG;IACH,IAAI,EAAE,MAAM,CAAC;IAEb;;OAEG;IACH,QAAQ,EAAE,MAAM,CAAC;IAEjB;;OAEG;IACH,SAAS,EAAE,MAAM,CAAC;CACnB;AAID;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CAExD;AAED;;;GAGG;AACH,wBAAgB,SAAS,IAAI,SAAS,CAKrC;AAED;;GAEG;AACH,wBAAgB,cAAc,IAAI,WAAW,CA2B5C"}
@@ -1 +1 @@
1
- {"version":3,"file":"app.config.js","sourceRoot":"","sources":["../../src/config/app.config.ts"],"names":[],"mappings":";AAAA;;;;;GAKG;;AA8GH,4CAEC;AAMD,8BAKC;AAKD,wCA2BC;AAnDD,IAAI,aAAa,GAAqB,IAAI,CAAC;AAE3C;;;GAGG;AACH,SAAgB,gBAAgB,CAAC,MAAiB;IAChD,aAAa,GAAG,MAAM,CAAC;AACzB,CAAC;AAED;;;GAGG;AACH,SAAgB,SAAS;IACvB,IAAI,CAAC,aAAa,EAAE,CAAC;QACnB,MAAM,IAAI,KAAK,CAAC,2EAA2E,CAAC,CAAC;IAC/F,CAAC;IACD,OAAO,aAAa,CAAC;AACvB,CAAC;AAED;;GAEG;AACH,SAAgB,cAAc;IAC5B,MAAM,IAAI,GAAG,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC;IACpC,MAAM,IAAI,GAAG,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC;IACpC,MAAM,IAAI,GAAG,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC;IAEpC,IAAI,CAAC,IAAI,IAAI,CAAC,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;QAC5B,MAAM,IAAI,KAAK,CACb,oGAAoG,CACrG,CAAC;IACJ,CAAC;IAED,MAAM,IAAI,GAAG,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,UAAU,IAAI,KAAK,EAAE,EAAE,CAAC,CAAC;IAC3D,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,YAAY,KAAK,MAAM,CAAC,CAAC,CAAC,IAAI,KAAK,GAAG,CAAC;IAE7F,MAAM,MAAM,GAAG,SAAS,EAAE,CAAC;IAC3B,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC,eAAe,IAAI,MAAM,CAAC,OAAO,CAAC;IAC/D,MAAM,SAAS,GAAG,OAAO,CAAC,GAAG,CAAC,gBAAgB,IAAI,OAAO,CAAC,GAAG,CAAC,kBAAkB,IAAI,IAAI,CAAC;IAEzF,OAAO;QACL,IAAI;QACJ,IAAI;QACJ,MAAM;QACN,IAAI;QACJ,IAAI;QACJ,QAAQ;QACR,SAAS;KACV,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"app.config.js","sourceRoot":"","sources":["../../src/config/app.config.ts"],"names":[],"mappings":";AAAA;;;;;GAKG;;AAoHH,4CAEC;AAMD,8BAKC;AAKD,wCA2BC;AAnDD,IAAI,aAAa,GAAqB,IAAI,CAAC;AAE3C;;;GAGG;AACH,SAAgB,gBAAgB,CAAC,MAAiB;IAChD,aAAa,GAAG,MAAM,CAAC;AACzB,CAAC;AAED;;;GAGG;AACH,SAAgB,SAAS;IACvB,IAAI,CAAC,aAAa,EAAE,CAAC;QACnB,MAAM,IAAI,KAAK,CAAC,2EAA2E,CAAC,CAAC;IAC/F,CAAC;IACD,OAAO,aAAa,CAAC;AACvB,CAAC;AAED;;GAEG;AACH,SAAgB,cAAc;IAC5B,MAAM,IAAI,GAAG,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC;IACpC,MAAM,IAAI,GAAG,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC;IACpC,MAAM,IAAI,GAAG,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC;IAEpC,IAAI,CAAC,IAAI,IAAI,CAAC,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;QAC5B,MAAM,IAAI,KAAK,CACb,oGAAoG,CACrG,CAAC;IACJ,CAAC;IAED,MAAM,IAAI,GAAG,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,UAAU,IAAI,KAAK,EAAE,EAAE,CAAC,CAAC;IAC3D,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,YAAY,KAAK,MAAM,CAAC,CAAC,CAAC,IAAI,KAAK,GAAG,CAAC;IAE7F,MAAM,MAAM,GAAG,SAAS,EAAE,CAAC;IAC3B,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC,eAAe,IAAI,MAAM,CAAC,OAAO,CAAC;IAC/D,MAAM,SAAS,GAAG,OAAO,CAAC,GAAG,CAAC,gBAAgB,IAAI,OAAO,CAAC,GAAG,CAAC,kBAAkB,IAAI,IAAI,CAAC;IAEzF,OAAO;QACL,IAAI;QACJ,IAAI;QACJ,MAAM;QACN,IAAI;QACJ,IAAI;QACJ,QAAQ;QACR,SAAS;KACV,CAAC;AACJ,CAAC"}
@@ -1,4 +1,63 @@
1
+ import { Firestore } from 'firebase-admin/firestore';
2
+ import { AppConfig } from '../../config';
3
+ import { Role } from '../user';
1
4
  import { BootstrapStatusResult, SystemBootstrapData, SystemBootstrapResult } from './bootstrap.models';
2
- export declare const systemBootstrap: import("firebase-functions/https").CallableFunction<SystemBootstrapData, Promise<SystemBootstrapResult>, unknown>;
3
- export declare const checkBootstrapStatus: import("firebase-functions/https").CallableFunction<any, Promise<BootstrapStatusResult>, unknown>;
5
+ export declare const PERMISSION_ADMIN = "ADMIN";
6
+ export declare const PERMISSION_USER = "USER";
7
+ export declare const PERMISSION_CREATE_THUMBNAIL = "createThumbnail";
8
+ /**
9
+ * Get Firestore instance based on config
10
+ */
11
+ export declare function getFirestoreInstance(config: AppConfig): Firestore;
12
+ /**
13
+ * Create bootstrap roles array based on config
14
+ */
15
+ export declare function createBootstrapRoles(config: AppConfig): Role[];
16
+ /**
17
+ * Validate bootstrap request data
18
+ */
19
+ export declare function validateBootstrapData(data: SystemBootstrapData): void;
20
+ /**
21
+ * Get password to use for admin user
22
+ */
23
+ export declare function getAdminPassword(providedPassword: string | undefined, defaultPassword: string): string;
24
+ /**
25
+ * Check if system is already bootstrapped
26
+ */
27
+ export declare function isSystemBootstrapped(firestore: Firestore): Promise<boolean>;
28
+ /**
29
+ * Create roles in Firestore if they don't exist
30
+ */
31
+ export declare function createRolesIfNotExist(firestore: Firestore, roles: Role[]): Promise<void>;
32
+ /**
33
+ * Create admin user document in Firestore
34
+ */
35
+ export declare function createAdminUserDocument(uid: string, email: string, displayName: string, roleIds: string[]): {
36
+ id: string;
37
+ email: string;
38
+ displayName: string;
39
+ firstName: string;
40
+ lastName: string;
41
+ meta: {
42
+ createdAt: Date;
43
+ updatedAt: Date;
44
+ createdBy: string;
45
+ };
46
+ status: string;
47
+ roleIds: string[];
48
+ };
49
+ /**
50
+ * Core bootstrap logic - exported for testing
51
+ */
52
+ export declare function executeSystemBootstrap(data: SystemBootstrapData, config: AppConfig): Promise<SystemBootstrapResult>;
53
+ /**
54
+ * Core check bootstrap status logic - exported for testing
55
+ */
56
+ export declare function executeCheckBootstrapStatus(config: AppConfig): Promise<BootstrapStatusResult>;
57
+ /**
58
+ * Handle bootstrap status check errors
59
+ */
60
+ export declare function handleBootstrapStatusError(error: any, config: AppConfig): never;
61
+ export declare function createSystemBootstrapFunction(): import("firebase-functions/https").CallableFunction<SystemBootstrapData, Promise<SystemBootstrapResult>, unknown>;
62
+ export declare function createCheckBootstrapStatusFunction(): import("firebase-functions/https").CallableFunction<any, Promise<BootstrapStatusResult>, unknown>;
4
63
  //# sourceMappingURL=bootstrap.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"bootstrap.d.ts","sourceRoot":"","sources":["../../../src/modules/bootstrap/bootstrap.ts"],"names":[],"mappings":"AAKA,OAAO,EACL,qBAAqB,EACrB,mBAAmB,EACnB,qBAAqB,EACtB,MAAM,oBAAoB,CAAC;AAE5B,eAAO,MAAM,eAAe,mHAwG3B,CAAC;AAEF,eAAO,MAAM,oBAAoB,mGAsC/B,CAAC"}
1
+ {"version":3,"file":"bootstrap.d.ts","sourceRoot":"","sources":["../../../src/modules/bootstrap/bootstrap.ts"],"names":[],"mappings":"AAAA,OAAO,EAAgB,SAAS,EAAE,MAAM,0BAA0B,CAAC;AAInE,OAAO,EAAE,SAAS,EAAa,MAAM,cAAc,CAAC;AACpD,OAAO,EAAkB,IAAI,EAAsC,MAAM,SAAS,CAAC;AACnF,OAAO,EACL,qBAAqB,EACrB,mBAAmB,EACnB,qBAAqB,EACtB,MAAM,oBAAoB,CAAC;AAG5B,eAAO,MAAM,gBAAgB,UAAU,CAAC;AACxC,eAAO,MAAM,eAAe,SAAS,CAAC;AACtC,eAAO,MAAM,2BAA2B,oBAAoB,CAAC;AAE7D;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,SAAS,GAAG,SAAS,CAEjE;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,EAAE,CA4B9D;AAED;;GAEG;AACH,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,mBAAmB,GAAG,IAAI,CAIrE;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAC9B,gBAAgB,EAAE,MAAM,GAAG,SAAS,EACpC,eAAe,EAAE,MAAM,GACtB,MAAM,CAER;AAED;;GAEG;AACH,wBAAsB,oBAAoB,CAAC,SAAS,EAAE,SAAS,GAAG,OAAO,CAAC,OAAO,CAAC,CAGjF;AAED;;GAEG;AACH,wBAAsB,qBAAqB,CAAC,SAAS,EAAE,SAAS,EAAE,KAAK,EAAE,IAAI,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAQ9F;AAED;;GAEG;AACH,wBAAgB,uBAAuB,CACrC,GAAG,EAAE,MAAM,EACX,KAAK,EAAE,MAAM,EACb,WAAW,EAAE,MAAM,EACnB,OAAO,EAAE,MAAM,EAAE;;;;;;;;;;;;;EAgBlB;AAED;;GAEG;AACH,wBAAsB,sBAAsB,CAC1C,IAAI,EAAE,mBAAmB,EACzB,MAAM,EAAE,SAAS,GAChB,OAAO,CAAC,qBAAqB,CAAC,CAiDhC;AAED;;GAEG;AACH,wBAAsB,2BAA2B,CAC/C,MAAM,EAAE,SAAS,GAChB,OAAO,CAAC,qBAAqB,CAAC,CAgBhC;AAED;;GAEG;AACH,wBAAgB,0BAA0B,CAAC,KAAK,EAAE,GAAG,EAAE,MAAM,EAAE,SAAS,GAAG,KAAK,CAa/E;AAGD,wBAAgB,6BAA6B,sHAsB5C;AAGD,wBAAgB,kCAAkC,sGAgBjD"}