@dereekb/firebase-server 13.6.9 → 13.6.11

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.
@@ -4,6 +4,31 @@ import { type StorageBucketId } from '@dereekb/firebase';
4
4
  import { type FirebaseServerEnvironmentConfig } from '../env/env.config';
5
5
  import { GlobalRoutePrefixConfig } from './middleware/globalprefix';
6
6
  import type * as admin from 'firebase-admin';
7
+ import { AssetLoader } from '@dereekb/rxjs';
8
+ /**
9
+ * Default base path for local assets on the server filesystem.
10
+ */
11
+ export declare const DEFAULT_SERVER_ASSETS_BASE_PATH = "./assets";
12
+ /**
13
+ * Configuration for the server-side asset loader.
14
+ *
15
+ * By default, local assets are loaded from {@link DEFAULT_SERVER_ASSETS_BASE_PATH}
16
+ * via `nodeJsLocalAssetLoader` and remote assets are loaded via `fetchAssetLoader`.
17
+ *
18
+ * Override `local` or `remote` to supply custom loader implementations.
19
+ */
20
+ export interface NestServerAssetConfig {
21
+ /**
22
+ * Optional override for the local asset loader.
23
+ * If omitted, uses `nodeJsLocalAssetLoader` with basePath {@link DEFAULT_SERVER_ASSETS_BASE_PATH}.
24
+ */
25
+ readonly local?: AssetLoader;
26
+ /**
27
+ * Optional override for the remote asset loader.
28
+ * If omitted, uses `fetchAssetLoader` with default global fetch.
29
+ */
30
+ readonly remote?: AssetLoader;
31
+ }
7
32
  export declare class FirebaseNestServerRootModule {
8
33
  }
9
34
  /**
@@ -57,6 +82,14 @@ export interface NestServerRootModuleConfig {
57
82
  * Defaults to false (production code sets this to true via `appCheckEnabled`).
58
83
  */
59
84
  readonly appCheckEnabled?: boolean;
85
+ /**
86
+ * Optional asset loader configuration.
87
+ *
88
+ * When provided, configures the {@link AssetLoader} with the given local base path
89
+ * and optional remote fetch config. When omitted, the {@link AssetLoader} is still
90
+ * provided globally with default settings (local base path `'./assets'`).
91
+ */
92
+ readonly assets?: Maybe<NestServerAssetConfig>;
60
93
  }
61
94
  /**
62
95
  * Result of {@link buildNestServerRootModule}.
@@ -89,6 +89,31 @@ export declare abstract class AbstractFirebaseNestContext<A, Y extends FirebaseM
89
89
  model(context: AuthDataRef, buildFn?: BuildFunction<FirebaseAppModelContext<A>>): InContextFirebaseModelsService<Y>;
90
90
  useModel<T extends FirebaseModelsServiceTypes<Y>, O>(type: T, select: UseModelInput<FirebaseAppModelContext<A>, Y, T, O>): Promise<O>;
91
91
  useModel<T extends FirebaseModelsServiceTypes<Y>>(type: T, select: UseModelInputForRolesReader<FirebaseAppModelContext<A>, Y, T>): Promise<FirebaseModelsServiceSelectionResultRolesReader<Y, T>>;
92
+ /**
93
+ * Loads and checks permissions for multiple models of the same type in parallel.
94
+ *
95
+ * Uses {@link performAsyncTasks} internally. The `use` function receives the array of
96
+ * successful {@link ContextGrantedModelRolesReader} values and an array of failed items.
97
+ *
98
+ * @param type - the model type to load
99
+ * @param select - selection params including keys array, roles, and use function
100
+ * @returns the result of the use function
101
+ *
102
+ * @example
103
+ * ```ts
104
+ * const result = await nest.useMultipleModels('storageFile', {
105
+ * request,
106
+ * keys: ['storageFile/abc', 'storageFile/def'],
107
+ * roles: 'download',
108
+ * throwOnFirstError: false,
109
+ * use: (successful, failed) => ({
110
+ * documents: successful.map((r) => r.document),
111
+ * errors: failed
112
+ * })
113
+ * });
114
+ * ```
115
+ */
116
+ useMultipleModels<T extends FirebaseModelsServiceTypes<Y>, O>(type: T, select: UseMultipleModelsInput<FirebaseAppModelContext<A>, Y, T, O>): Promise<O>;
92
117
  }
93
118
  /**
94
119
  * Input for {@link AbstractFirebaseNestContext.useModel} when only a roles reader is needed (no custom use function).
@@ -103,3 +128,60 @@ export type UseModelInputForRolesReader<C extends FirebaseModelServiceContext, Y
103
128
  export type UseModelInput<C extends FirebaseModelServiceContext, Y extends FirebaseModelsService<any, C>, T extends FirebaseModelsServiceTypes<Y>, O> = UseModelInputForRolesReader<C, Y, T> & {
104
129
  readonly use: UseFirebaseModelsServiceSelectionUseFunction<Y, T, O>;
105
130
  };
131
+ /**
132
+ * Extracts the key type from a {@link UseFirebaseModelsServiceSelection} for a given model type.
133
+ */
134
+ export type UseFirebaseModelsServiceSelectionKeyType<Y extends FirebaseModelsService<any, any>, T extends FirebaseModelsServiceTypes<Y>> = UseFirebaseModelsServiceSelection<Y, T> extends {
135
+ key: infer K;
136
+ } ? K : never;
137
+ /**
138
+ * Input for {@link AbstractFirebaseNestContext.useMultipleModels}.
139
+ *
140
+ * Takes an array of keys and a `use` function that receives the successful roles readers
141
+ * and a {@link UseMultipleModelsFailure} describing any errors. Shared `roles` and `rolesSetIncludes` apply to all keys.
142
+ */
143
+ export type UseMultipleModelsInput<C extends FirebaseModelServiceContext, Y extends FirebaseModelsService<any, C>, T extends FirebaseModelsServiceTypes<Y>, O> = Omit<UseModelInputForRolesReader<C, Y, T>, 'key'> & {
144
+ readonly keys: UseFirebaseModelsServiceSelectionKeyType<Y, T>[];
145
+ readonly use: UseMultipleModelsUseFunction<Y, T, O>;
146
+ /**
147
+ * When true, throws the first error directly without calling `use`.
148
+ *
149
+ * Defaults to true (unless `useOnFirstError` is set).
150
+ */
151
+ readonly throwOnFirstError?: boolean;
152
+ /**
153
+ * When true, calls `use` on the first error with an empty successful array
154
+ * and `abortedEarly: true` in the failure object.
155
+ *
156
+ * Takes precedence over `throwOnFirstError` when both are set.
157
+ */
158
+ readonly useOnFirstError?: boolean;
159
+ };
160
+ /**
161
+ * Use function for {@link UseMultipleModelsInput}.
162
+ *
163
+ * Receives the successful roles readers and a failure object containing any errors.
164
+ */
165
+ export type UseMultipleModelsUseFunction<Y extends FirebaseModelsService<any, any>, T extends FirebaseModelsServiceTypes<Y>, O> = (successful: FirebaseModelsServiceSelectionResultRolesReader<Y, T>[], failure: UseMultipleModelsFailure<Y, T>) => Promise<O> | O;
166
+ /**
167
+ * Failure information passed to the {@link UseMultipleModelsUseFunction}.
168
+ *
169
+ * Contains the array of failed items and whether the operation was aborted early
170
+ * (via `useOnFirstError`) before all keys were processed.
171
+ */
172
+ export interface UseMultipleModelsFailure<Y extends FirebaseModelsService<any, any>, T extends FirebaseModelsServiceTypes<Y>> {
173
+ readonly errors: UseMultipleModelsFailedItem<Y, T>[];
174
+ /**
175
+ * True when the operation was aborted on the first error (via `useOnFirstError`).
176
+ *
177
+ * When true, the successful array will be empty and not all keys may have been attempted.
178
+ */
179
+ readonly abortedEarly: boolean;
180
+ }
181
+ /**
182
+ * Represents a key that failed permission checking in {@link AbstractFirebaseNestContext.useMultipleModels}.
183
+ */
184
+ export interface UseMultipleModelsFailedItem<Y extends FirebaseModelsService<any, any>, T extends FirebaseModelsServiceTypes<Y>> {
185
+ readonly key: UseFirebaseModelsServiceSelectionKeyType<Y, T>;
186
+ readonly error: unknown;
187
+ }
package/test/package.json CHANGED
@@ -1,15 +1,15 @@
1
1
  {
2
2
  "name": "@dereekb/firebase-server/test",
3
- "version": "13.6.9",
3
+ "version": "13.6.11",
4
4
  "peerDependencies": {
5
- "@dereekb/analytics": "13.6.9",
6
- "@dereekb/date": "13.6.9",
7
- "@dereekb/firebase": "13.6.9",
8
- "@dereekb/firebase-server": "13.6.9",
9
- "@dereekb/model": "13.6.9",
10
- "@dereekb/nestjs": "13.6.9",
11
- "@dereekb/rxjs": "13.6.9",
12
- "@dereekb/util": "13.6.9",
5
+ "@dereekb/analytics": "13.6.11",
6
+ "@dereekb/date": "13.6.11",
7
+ "@dereekb/firebase": "13.6.11",
8
+ "@dereekb/firebase-server": "13.6.11",
9
+ "@dereekb/model": "13.6.11",
10
+ "@dereekb/nestjs": "13.6.11",
11
+ "@dereekb/rxjs": "13.6.11",
12
+ "@dereekb/util": "13.6.11",
13
13
  "@google-cloud/firestore": "^7.11.6",
14
14
  "@google-cloud/storage": "^7.19.0",
15
15
  "@nestjs/common": "^11.1.17",
@@ -21,7 +21,7 @@
21
21
  "make-error": "^1.3.0"
22
22
  },
23
23
  "devDependencies": {
24
- "@dereekb/nestjs": "13.6.9"
24
+ "@dereekb/nestjs": "13.6.11"
25
25
  },
26
26
  "exports": {
27
27
  "./package.json": "./package.json",
package/zoho/package.json CHANGED
@@ -1,15 +1,15 @@
1
1
  {
2
2
  "name": "@dereekb/firebase-server/zoho",
3
- "version": "13.6.9",
3
+ "version": "13.6.11",
4
4
  "peerDependencies": {
5
- "@dereekb/analytics": "13.6.9",
6
- "@dereekb/date": "13.6.9",
7
- "@dereekb/model": "13.6.9",
8
- "@dereekb/nestjs": "13.6.9",
9
- "@dereekb/rxjs": "13.6.9",
10
- "@dereekb/firebase": "13.6.9",
11
- "@dereekb/util": "13.6.9",
12
- "@dereekb/zoho": "13.6.9"
5
+ "@dereekb/analytics": "13.6.11",
6
+ "@dereekb/date": "13.6.11",
7
+ "@dereekb/model": "13.6.11",
8
+ "@dereekb/nestjs": "13.6.11",
9
+ "@dereekb/rxjs": "13.6.11",
10
+ "@dereekb/firebase": "13.6.11",
11
+ "@dereekb/util": "13.6.11",
12
+ "@dereekb/zoho": "13.6.11"
13
13
  },
14
14
  "exports": {
15
15
  "./package.json": "./package.json",