@firebase-function-kits/bigquery-firestore-export 0.0.2-rc.3 → 0.0.2-rc.4

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/CHANGELOG.md CHANGED
@@ -1 +1,3 @@
1
1
  - Initial release of kit, see README for differences between the legacy extension and this kit
2
+ - The instance id now comes from `FIREBASE_KIT_INSTANCE_ID`, which the Firebase CLI (15.27.0 or later) provides to each kit instance; `INSTANCE_ID` is no longer a configuration parameter
3
+ - A BigQuery `TIME` column no longer crashes a run: its value is written to Firestore as the string BigQuery returned (`"10:30:00"`) rather than passed to `Timestamp.fromDate`, which threw and lost the whole run. This is a deliberate divergence from the legacy extension, which throws on the same line
package/README.md CHANGED
@@ -49,7 +49,6 @@ export {
49
49
  and configure them with a `.env` (or `.env.<projectId>`):
50
50
 
51
51
  ```sh
52
- INSTANCE_ID=analytics-export
53
52
  BIGQUERY_DATASET_LOCATION=US
54
53
  DATASET_ID=analytics
55
54
  TABLE_NAME=users
@@ -67,8 +66,9 @@ only deploys what your entry file exports.
67
66
 
68
67
  ## Deploy
69
68
 
70
- The package's `firebase.json` declares a `kit` stanza (Firebase CLI 15.25.1 or
71
- later, behind the `kits` experiment):
69
+ The package's `firebase.json` declares a `kit` stanza (Firebase CLI 15.27.0 or
70
+ later, behind the `kits` experiment - earlier CLIs do not provide the
71
+ `FIREBASE_KIT_INSTANCE_ID` variable this kit reads its instance id from):
72
72
 
73
73
  ```json
74
74
  {
@@ -103,9 +103,13 @@ Set these values in a `.env` (or `.env.<projectId>`) file. The Firebase CLI
103
103
  loads them at deploy time and prompts for required values that are missing.
104
104
  `PROJECT_ID` is supplied by the Firebase CLI.
105
105
 
106
+ The instance id is not a setting: the CLI provides it to each instance as
107
+ `FIREBASE_KIT_INSTANCE_ID`, set to that instance's key in the `instances` map.
108
+ `FIREBASE_` is a reserved prefix in `.env` files, so it cannot be set or
109
+ overridden there.
110
+
106
111
  | Field | Env var | Required | Default | Description |
107
112
  | ------------------------- | --------------------------- | -------- | ----------------- | ------------------------------------------------------------ |
108
- | `instanceId` | `INSTANCE_ID` | yes | — | Must match this instance's key in the `instances` map |
109
113
  | `bigqueryDatasetLocation` | `BIGQUERY_DATASET_LOCATION` | no | `US` | BigQuery destination dataset location |
110
114
  | `transferConfigName` | `TRANSFER_CONFIG_NAME` | no | (empty) | Existing DTS config resource to link instead of creating one |
111
115
  | `datasetId` | `DATASET_ID` | yes | — | BigQuery destination dataset id |
@@ -114,7 +118,7 @@ loads them at deploy time and prompts for required values that are missing.
114
118
  | `displayName` | `DISPLAY_NAME` | yes | — | Human-readable scheduled-query name |
115
119
  | `partitioningField` | `PARTITIONING_FIELD` | no | (empty) | Destination-table partitioning field |
116
120
  | `schedule` | `SCHEDULE` | yes | — | DTS schedule, such as `every 24 hours` |
117
- | `pubSubTopic` | `PUB_SUB_TOPIC` | no | `kit-<INSTANCE_ID>-processMessages` | Pub/Sub topic ID, not a full resource name, receiving DTS completion notifications |
121
+ | `pubSubTopic` | `PUB_SUB_TOPIC` | no | `kit-<instance id>-processMessages` | Pub/Sub topic ID, not a full resource name, receiving DTS completion notifications |
118
122
  | `firestoreCollection` | `COLLECTION_PATH` | no | `transferConfigs` | Root Firestore collection for configs and output |
119
123
  | `logLevel` | `LOG_LEVEL` | no | `info` | `debug`, `info`, `warn`, `error`, or `silent` |
120
124
 
@@ -140,10 +144,10 @@ To run several reverse-sync instances, add one entry per instance to the
140
144
 
141
145
  Instance ids must be unique across all kit stanzas in the project, and every
142
146
  instance's function names are namespaced by its `kit-<instance id>-` prefix, so
143
- the instances cannot collide. Set `INSTANCE_ID` in each config directory to the
144
- same value as that directory's key in the `instances` map; it also namespaces
145
- the Pub/Sub notification topic and associates the deployment with its transfer
146
- config.
147
+ the instances cannot collide. Each instance learns its own id from the
148
+ `FIREBASE_KIT_INSTANCE_ID` variable the CLI provides; there is nothing to keep
149
+ in sync by hand. The id also namespaces the Pub/Sub notification topic and
150
+ associates the deployment with its transfer config.
147
151
 
148
152
  ## Provisioning
149
153
 
@@ -185,18 +189,19 @@ variable name and default, so a `.env` copied from your installed instance needs
185
189
  no value changes. What changes is the instance id, the Pub/Sub topic, the identity
186
190
  the scheduled query runs as, and how repeated BigQuery columns land in Firestore.
187
191
 
188
- ### You set `INSTANCE_ID` yourself, and the Pub/Sub topic is renamed
192
+ ### The instance id comes from `firebase.json`, and the Pub/Sub topic is renamed
189
193
 
190
194
  The extension derived an instance id at install and used it to name its
191
195
  notification topic (`ext-<instance id>-processMessages`) and to tag its transfer
192
- config document with `extInstanceId`. Here `INSTANCE_ID` is a setting you
193
- provide, and it must match this instance's key in the `instances` map in
194
- `firebase.json`.
195
-
196
- The topic defaults to `kit-<INSTANCE_ID>-processMessages`, and the kit creates it
197
- on first run if it does not already exist. Set `INSTANCE_ID` to your installed
198
- instance's id if you want the kit to adopt the scheduled query that instance
199
- created, because the lookup is by `extInstanceId` on the documents in
196
+ config document with `extInstanceId`. Here the CLI derives it from this
197
+ instance's key in the `instances` map in `firebase.json` and provides it to the
198
+ functions as `FIREBASE_KIT_INSTANCE_ID`. There is no `INSTANCE_ID` setting to
199
+ configure.
200
+
201
+ The topic defaults to `kit-<instance id>-processMessages`, and the kit creates it
202
+ on first run if it does not already exist. Use your installed instance's id as
203
+ the `instances` key if you want the kit to adopt the scheduled query that
204
+ instance created, because the lookup is by `extInstanceId` on the documents in
200
205
  `COLLECTION_PATH`. With a different id the kit finds nothing, creates a second
201
206
  scheduled query, and you end up with two writing into the same collection.
202
207
 
@@ -209,7 +214,7 @@ there are two ways to migrate:
209
214
  left untouched: anything else subscribed to that topic, including an extension
210
215
  instance still installed, keeps receiving run notifications.
211
216
  - Take the default. The first deploy repoints the transfer config at
212
- `kit-<INSTANCE_ID>-processMessages`, which stops notifications reaching the
217
+ `kit-<instance id>-processMessages`, which stops notifications reaching the
213
218
  extension and any other subscriber on the old topic. Do this once the extension
214
219
  is uninstalled, and the old topic can then be deleted.
215
220
 
@@ -224,7 +229,21 @@ position, `{ "0": ..., "1": ... }`, because the conversion treated every
224
229
  non-scalar value as an object. The kit writes a real Firestore array instead.
225
230
  Anything reading those fields by numeric string key needs updating, and rows
226
231
  written before and after the change are not the same shape. Scalars, timestamps,
227
- dates, times, datetimes, bytes and geography values convert exactly as before.
232
+ dates, datetimes, bytes and geography values convert exactly as before.
233
+
234
+ ### A TIME column is written as a string
235
+
236
+ A `TIME` value arrives from BigQuery as `"10:30:00"`, and the extension passed it
237
+ to `Timestamp.fromDate(new Date(...))`, which throws `Value for argument "seconds"
238
+ is not a valid integer.` A run whose results included a `TIME` column therefore
239
+ wrote nothing at all: no rows, no run document, no `latest`. The kit stores the
240
+ string BigQuery returned instead, so the run completes.
241
+
242
+ Firestore has no time-of-day type, and any `Timestamp` would have to invent a date
243
+ to attach the time to. The string also keeps the microsecond precision a
244
+ `Timestamp` cannot hold. This is the only scalar type whose value differs from
245
+ the extension, and no installed instance can have stored one, because the run
246
+ crashed before the write.
228
247
 
229
248
  ### The scheduled query runs as a different service account
230
249
 
@@ -285,7 +304,7 @@ result query where your dataset lives.
285
304
  extension's 1st gen trigger did not retry. A run whose results fail to copy, for
286
305
  example because BigQuery or Firestore is briefly unavailable, is now retried
287
306
  rather than dropped. A notification that keeps failing, such as one for a transfer
288
- config not tagged with this `INSTANCE_ID`, is also retried until Pub/Sub gives up.
307
+ config not tagged with this instance id, is also retried until Pub/Sub gives up.
289
308
 
290
309
  Both functions' service accounts need `roles/eventarc.eventReceiver` and
291
310
  `roles/run.invoker` on top of the three roles the extension asked for, and the
@@ -1 +1 @@
1
- {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAsBA,OAAO,KAAK,EACV,6BAA6B,EAC7B,iBAAiB,EAElB,MAAM,iBAAiB,CAAC;AA+JzB,eAAO,MAAM,kBAAkB,EAAE,iBAEhC,CAAC;AAcF,iEAAiE;AACjE,wBAAgB,aAAa,IAAI,6BAA6B,CAkB7D"}
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAiBA,OAAO,KAAK,EACV,6BAA6B,EAC7B,iBAAiB,EAElB,MAAM,iBAAiB,CAAC;AAkLzB,eAAO,MAAM,kBAAkB,EAAE,iBAEhC,CAAC;AAcF,iEAAiE;AACjE,wBAAgB,aAAa,IAAI,6BAA6B,CAgB7D"}
package/lib/config.js CHANGED
@@ -19,9 +19,24 @@ exports.CONFIG_EXPRESSIONS = void 0;
19
19
  exports.configFromEnv = configFromEnv;
20
20
  const params_1 = require("firebase-functions/params");
21
21
  const LOG_LEVEL_OPTIONS = ["debug", "info", "warn", "error", "silent"];
22
- const instanceId = (0, params_1.defineString)("INSTANCE_ID");
22
+ // firebase-tools injects this for kit instances (set to the instance's key in
23
+ // firebase.json) during discovery, in the emulator, and on deployed functions.
24
+ // The FIREBASE_ prefix is reserved in .env files and the params machinery never
25
+ // sees injected values, so it must be a plain env read, not a defineString.
26
+ function instanceIdFromEnv() {
27
+ const instanceId = process.env.FIREBASE_KIT_INSTANCE_ID;
28
+ if (!instanceId) {
29
+ throw new Error("FIREBASE_KIT_INSTANCE_ID is not set. It is provided automatically to " +
30
+ "kit instances by firebase-tools >= 15.27.0; deploy or emulate this " +
31
+ "kit with a supported CLI version.");
32
+ }
33
+ return instanceId;
34
+ }
35
+ // Resolved at import so the topic default is a concrete name at discovery. An
36
+ // unsupported CLI fails the discovery pass here rather than freezing
37
+ // "kit-undefined-processMessages" into the manifest.
38
+ const instanceId = instanceIdFromEnv();
23
39
  const params = {
24
- instanceId,
25
40
  bigqueryDatasetLocation: (0, params_1.defineString)("BIGQUERY_DATASET_LOCATION", {
26
41
  label: "BigQuery Dataset Location",
27
42
  description: "What is the location of the BigQuery dataset referenced in the query?",
@@ -68,7 +83,7 @@ const params = {
68
83
  pubSubTopic: (0, params_1.defineString)("PUB_SUB_TOPIC", {
69
84
  label: "Pub/Sub Topic",
70
85
  description: "Which Pub/Sub topic should receive BigQuery Data Transfer completion notifications? Leave the default unless you are migrating from the bigquery-firestore-export extension, whose topic is named ext-<instance id>-processMessages. Pointing this at the extension's topic keeps the existing scheduled query's notification settings untouched.",
71
- default: (0, params_1.expr) `kit-${instanceId}-processMessages`,
86
+ default: `kit-${instanceId}-processMessages`,
72
87
  input: {
73
88
  text: {
74
89
  nonEmpty: true,
@@ -174,11 +189,10 @@ function normalizeLogLevel(value) {
174
189
  }
175
190
  /** Reads runtime values from Firebase deploy-time parameters. */
176
191
  function configFromEnv() {
177
- const resolvedInstanceId = params.instanceId.value();
178
192
  return {
179
193
  bigqueryDatasetLocation: params.bigqueryDatasetLocation.value(),
180
194
  projectId: params_1.projectID.value(),
181
- instanceId: resolvedInstanceId,
195
+ instanceId: instanceIdFromEnv(),
182
196
  transferConfigName: optional(params.transferConfigName.value()),
183
197
  datasetId: params.datasetId.value(),
184
198
  tableName: params.tableName.value(),
package/lib/config.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"helper.d.ts","sourceRoot":"","sources":["../src/helper.ts"],"names":[],"mappings":"AAgBA,OAAO,EACL,KAAK,QAAQ,EAMd,MAAM,wBAAwB,CAAC;AAChC,OAAO,EAGL,KAAK,SAAS,EAEf,MAAM,0BAA0B,CAAC;AAClC,OAAO,KAAK,EAAE,qCAAqC,EAAE,MAAM,iBAAiB,CAAC;AAE7E,OAAO,KAAK,EACV,WAAW,EACX,gBAAgB,EAChB,YAAY,EACZ,iBAAiB,EACjB,kBAAkB,EACnB,MAAM,SAAS,CAAC;AAEjB,MAAM,WAAW,qBAAqB;IACpC,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,gBAAgB,EAAE,MAAM,CAAC;IACzB,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,wBAAwB;IACvC,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,gBAAgB,EAAE,MAAM,CAAC;CAC1B;AAED,MAAM,WAAW,oBAAoB;IACnC,EAAE,EAAE,SAAS,CAAC;IACd,QAAQ,EAAE,QAAQ,CAAC;IACnB,MAAM,EAAE,qCAAqC,CAAC;CAC/C;AAQD,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,MAAM,GAAG,qBAAqB,CAcxE;AAED,wBAAgB,uBAAuB,CACrC,IAAI,EAAE,MAAM,GACX,wBAAwB,CAa1B;AAED,wBAAsB,uBAAuB,CAC3C,EAAE,EAAE,SAAS,EACb,MAAM,EAAE,qCAAqC,EAC7C,gBAAgB,EAAE,MAAM,EACxB,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,kBAAkB,EAC3B,SAAS,EAAE;IAAE,cAAc,EAAE,MAAM,CAAC;IAAC,aAAa,EAAE,MAAM,CAAA;CAAE,GAC3D,OAAO,CAAC,IAAI,CAAC,CAiCf;AAED,wBAAsB,kBAAkB,CACtC,QAAQ,EAAE,QAAQ,EAClB,MAAM,EAAE,qCAAqC,EAC7C,gBAAgB,EAAE,MAAM,EACxB,KAAK,EAAE,MAAM,EACb,SAAS,EAAE,MAAM,EACjB,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC,WAAW,EAAE,CAAC,CAgBxB;AAED,wBAAgB,2BAA2B,CAAC,GAAG,EAAE,IAAI,GAAG,IAAI,CAAC;AAC7D,wBAAgB,2BAA2B,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAAC;AACjE,wBAAgB,2BAA2B,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAAC;AACjE,wBAAgB,2BAA2B,CAAC,GAAG,EAAE,OAAO,GAAG,OAAO,CAAC;AACnE,wBAAgB,2BAA2B,CAAC,GAAG,EAAE,WAAW,GAAG,YAAY,CAAC;AAC5E,wBAAgB,2BAA2B,CACzC,GAAG,EAAE,gBAAgB,GACpB,iBAAiB,CAAC;AA+BrB,wBAAsB,0BAA0B,CAC9C,GAAG,EAAE,oBAAoB,EACzB,OAAO,EAAE,kBAAkB,GAC1B,OAAO,CAAC,IAAI,CAAC,CAgEf;AAED,wBAAsB,oCAAoC,CACxD,EAAE,EAAE,SAAS,EACb,MAAM,EAAE,qCAAqC,EAC7C,gBAAgB,EAAE,MAAM,GACvB,OAAO,CAAC,OAAO,CAAC,CAMlB;AAED,wBAAsB,wBAAwB,CAC5C,GAAG,EAAE,oBAAoB,EACzB,OAAO,EAAE,kBAAkB,GAC1B,OAAO,CAAC,IAAI,CAAC,CAiCf"}
1
+ {"version":3,"file":"helper.d.ts","sourceRoot":"","sources":["../src/helper.ts"],"names":[],"mappings":"AAgBA,OAAO,EACL,KAAK,QAAQ,EAMd,MAAM,wBAAwB,CAAC;AAChC,OAAO,EAGL,KAAK,SAAS,EAEf,MAAM,0BAA0B,CAAC;AAClC,OAAO,KAAK,EAAE,qCAAqC,EAAE,MAAM,iBAAiB,CAAC;AAE7E,OAAO,KAAK,EACV,WAAW,EACX,gBAAgB,EAChB,YAAY,EACZ,iBAAiB,EACjB,kBAAkB,EACnB,MAAM,SAAS,CAAC;AAEjB,MAAM,WAAW,qBAAqB;IACpC,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,gBAAgB,EAAE,MAAM,CAAC;IACzB,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,wBAAwB;IACvC,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,gBAAgB,EAAE,MAAM,CAAC;CAC1B;AAED,MAAM,WAAW,oBAAoB;IACnC,EAAE,EAAE,SAAS,CAAC;IACd,QAAQ,EAAE,QAAQ,CAAC;IACnB,MAAM,EAAE,qCAAqC,CAAC;CAC/C;AAQD,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,MAAM,GAAG,qBAAqB,CAcxE;AAED,wBAAgB,uBAAuB,CACrC,IAAI,EAAE,MAAM,GACX,wBAAwB,CAa1B;AAED,wBAAsB,uBAAuB,CAC3C,EAAE,EAAE,SAAS,EACb,MAAM,EAAE,qCAAqC,EAC7C,gBAAgB,EAAE,MAAM,EACxB,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,kBAAkB,EAC3B,SAAS,EAAE;IAAE,cAAc,EAAE,MAAM,CAAC;IAAC,aAAa,EAAE,MAAM,CAAA;CAAE,GAC3D,OAAO,CAAC,IAAI,CAAC,CAiCf;AAED,wBAAsB,kBAAkB,CACtC,QAAQ,EAAE,QAAQ,EAClB,MAAM,EAAE,qCAAqC,EAC7C,gBAAgB,EAAE,MAAM,EACxB,KAAK,EAAE,MAAM,EACb,SAAS,EAAE,MAAM,EACjB,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC,WAAW,EAAE,CAAC,CAgBxB;AAED,wBAAgB,2BAA2B,CAAC,GAAG,EAAE,IAAI,GAAG,IAAI,CAAC;AAC7D,wBAAgB,2BAA2B,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAAC;AACjE,wBAAgB,2BAA2B,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAAC;AACjE,wBAAgB,2BAA2B,CAAC,GAAG,EAAE,OAAO,GAAG,OAAO,CAAC;AACnE,wBAAgB,2BAA2B,CAAC,GAAG,EAAE,WAAW,GAAG,YAAY,CAAC;AAC5E,wBAAgB,2BAA2B,CACzC,GAAG,EAAE,gBAAgB,GACpB,iBAAiB,CAAC;AAiCrB,wBAAsB,0BAA0B,CAC9C,GAAG,EAAE,oBAAoB,EACzB,OAAO,EAAE,kBAAkB,GAC1B,OAAO,CAAC,IAAI,CAAC,CAgEf;AAED,wBAAsB,oCAAoC,CACxD,EAAE,EAAE,SAAS,EACb,MAAM,EAAE,qCAAqC,EAC7C,gBAAgB,EAAE,MAAM,GACvB,OAAO,CAAC,OAAO,CAAC,CAMlB;AAED,wBAAsB,wBAAwB,CAC5C,GAAG,EAAE,oBAAoB,EACzB,OAAO,EAAE,kBAAkB,GAC1B,OAAO,CAAC,IAAI,CAAC,CAiCf"}
package/lib/helper.js CHANGED
@@ -132,9 +132,12 @@ function convertUnsupportedDataTypes(row) {
132
132
  if (row === null || typeof row !== "object") {
133
133
  return row;
134
134
  }
135
+ // A TIME is a time of day with no date, so no Timestamp can hold it without
136
+ // inventing one. BigQuery's own "HH:MM:SS[.ffffff]" string is kept instead.
137
+ if (row instanceof bigquery_1.BigQueryTime)
138
+ return row.value;
135
139
  if (row instanceof bigquery_1.BigQueryTimestamp ||
136
140
  row instanceof bigquery_1.BigQueryDate ||
137
- row instanceof bigquery_1.BigQueryTime ||
138
141
  row instanceof bigquery_1.BigQueryDatetime) {
139
142
  return firestore_1.Timestamp.fromDate(new Date(row.value));
140
143
  }
package/lib/helper.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"helper.js","sourceRoot":"","sources":["../src/helper.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"helper.js","sourceRoot":"","sources":["../src/helper.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AA4CA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,SAAS,CAAC;AAElD,cAAc,OAAO,CAAC;AA+DtB,gEAAgE;AAChE,eAAO,MAAM,eAAe,gLAM3B,CAAC;AAEF,uEAAuE;AACvE,eAAO,MAAM,oBAAoB,8DAMhC,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AA4CA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,SAAS,CAAC;AAElD,cAAc,OAAO,CAAC;AAmEtB,gEAAgE;AAChE,eAAO,MAAM,eAAe,gLAM3B,CAAC;AAEF,uEAAuE;AACvE,eAAO,MAAM,oBAAoB,8DAMhC,CAAC"}
package/lib/index.js CHANGED
@@ -80,6 +80,10 @@ const REQUIRED_ROLES = [
80
80
  "roles/run.invoker",
81
81
  ];
82
82
  const REQUIRED_APIS = [
83
+ {
84
+ api: "firestore.googleapis.com",
85
+ reason: "Writes BigQuery export run state to Cloud Firestore.",
86
+ },
83
87
  {
84
88
  api: "bigquery.googleapis.com",
85
89
  reason: "Runs scheduled queries and reads their destination tables.",
package/lib/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
@@ -1,12 +1,12 @@
1
1
  {
2
2
  "name": "@firebase-function-kits/bigquery-firestore-export",
3
- "version": "0.0.2-rc.3",
3
+ "version": "0.0.2-rc.4",
4
4
  "lockfileVersion": 3,
5
5
  "requires": true,
6
6
  "packages": {
7
7
  "": {
8
8
  "name": "@firebase-function-kits/bigquery-firestore-export",
9
- "version": "0.0.2-rc.3",
9
+ "version": "0.0.2-rc.4",
10
10
  "license": "Apache-2.0",
11
11
  "dependencies": {
12
12
  "@firebase/app": "^0.16.0",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@firebase-function-kits/bigquery-firestore-export",
3
- "version": "0.0.2-rc.3",
3
+ "version": "0.0.2-rc.4",
4
4
  "repository": {
5
5
  "type": "git",
6
6
  "url": "https://github.com/firebase/extensions.git",
package/src/config.ts CHANGED
@@ -14,12 +14,7 @@
14
14
  * limitations under the License.
15
15
  */
16
16
 
17
- import {
18
- defineString,
19
- expr,
20
- projectID,
21
- select,
22
- } from "firebase-functions/params";
17
+ import { defineString, projectID, select } from "firebase-functions/params";
23
18
  import type {
24
19
  BigqueryFirestoreExportConfig,
25
20
  DeployTimeOptions,
@@ -27,10 +22,29 @@ import type {
27
22
  } from "./export-config";
28
23
 
29
24
  const LOG_LEVEL_OPTIONS = ["debug", "info", "warn", "error", "silent"] as const;
30
- const instanceId = defineString("INSTANCE_ID");
25
+
26
+ // firebase-tools injects this for kit instances (set to the instance's key in
27
+ // firebase.json) during discovery, in the emulator, and on deployed functions.
28
+ // The FIREBASE_ prefix is reserved in .env files and the params machinery never
29
+ // sees injected values, so it must be a plain env read, not a defineString.
30
+ function instanceIdFromEnv(): string {
31
+ const instanceId = process.env.FIREBASE_KIT_INSTANCE_ID;
32
+ if (!instanceId) {
33
+ throw new Error(
34
+ "FIREBASE_KIT_INSTANCE_ID is not set. It is provided automatically to " +
35
+ "kit instances by firebase-tools >= 15.27.0; deploy or emulate this " +
36
+ "kit with a supported CLI version."
37
+ );
38
+ }
39
+ return instanceId;
40
+ }
41
+
42
+ // Resolved at import so the topic default is a concrete name at discovery. An
43
+ // unsupported CLI fails the discovery pass here rather than freezing
44
+ // "kit-undefined-processMessages" into the manifest.
45
+ const instanceId = instanceIdFromEnv();
31
46
 
32
47
  const params = {
33
- instanceId,
34
48
  bigqueryDatasetLocation: defineString("BIGQUERY_DATASET_LOCATION", {
35
49
  label: "BigQuery Dataset Location",
36
50
  description:
@@ -81,7 +95,7 @@ const params = {
81
95
  description:
82
96
  "Which Pub/Sub topic should receive BigQuery Data Transfer completion notifications? Leave the default unless you are migrating from the bigquery-firestore-export extension, whose topic is named ext-<instance id>-processMessages. Pointing this at the extension's topic keeps the existing scheduled query's notification settings untouched.",
83
97
 
84
- default: expr`kit-${instanceId}-processMessages`,
98
+ default: `kit-${instanceId}-processMessages`,
85
99
  input: {
86
100
  text: {
87
101
  nonEmpty: true,
@@ -201,12 +215,10 @@ function normalizeLogLevel(value: string): LogLevel {
201
215
 
202
216
  /** Reads runtime values from Firebase deploy-time parameters. */
203
217
  export function configFromEnv(): BigqueryFirestoreExportConfig {
204
- const resolvedInstanceId = params.instanceId.value();
205
-
206
218
  return {
207
219
  bigqueryDatasetLocation: params.bigqueryDatasetLocation.value(),
208
220
  projectId: projectID.value(),
209
- instanceId: resolvedInstanceId,
221
+ instanceId: instanceIdFromEnv(),
210
222
  transferConfigName: optional(params.transferConfigName.value()),
211
223
  datasetId: params.datasetId.value(),
212
224
  tableName: params.tableName.value(),
package/src/helper.ts CHANGED
@@ -178,10 +178,12 @@ export function convertUnsupportedDataTypes(
178
178
  return row as FirestoreRowValue;
179
179
  }
180
180
 
181
+ // A TIME is a time of day with no date, so no Timestamp can hold it without
182
+ // inventing one. BigQuery's own "HH:MM:SS[.ffffff]" string is kept instead.
183
+ if (row instanceof BigQueryTime) return row.value;
181
184
  if (
182
185
  row instanceof BigQueryTimestamp ||
183
186
  row instanceof BigQueryDate ||
184
- row instanceof BigQueryTime ||
185
187
  row instanceof BigQueryDatetime
186
188
  ) {
187
189
  return Timestamp.fromDate(new Date(row.value));
package/src/index.ts CHANGED
@@ -55,6 +55,10 @@ const REQUIRED_ROLES: ReadonlyArray<Role> = [
55
55
  "roles/run.invoker",
56
56
  ];
57
57
  const REQUIRED_APIS = [
58
+ {
59
+ api: "firestore.googleapis.com",
60
+ reason: "Writes BigQuery export run state to Cloud Firestore.",
61
+ },
58
62
  {
59
63
  api: "bigquery.googleapis.com",
60
64
  reason: "Runs scheduled queries and reads their destination tables.",
@@ -14,32 +14,59 @@
14
14
  * limitations under the License.
15
15
  */
16
16
 
17
- import { Expression } from "firebase-functions/params";
17
+ import { declaredParams, Expression } from "firebase-functions/params";
18
18
  import { afterEach, describe, expect, test, vi } from "vitest";
19
- import { CONFIG_EXPRESSIONS, configFromEnv } from "../src/config";
19
+
20
+ const INSTANCE_ID = "users-export";
21
+
22
+ // The instance id is read when the module loads, so the environment has to be
23
+ // in place before each import.
24
+ async function importConfig(instanceId: string | undefined) {
25
+ vi.resetModules();
26
+ vi.stubEnv("FIREBASE_KIT_INSTANCE_ID", instanceId);
27
+ return import("../src/config");
28
+ }
29
+
30
+ function stubRuntimeEnv() {
31
+ vi.stubEnv("FIREBASE_CONFIG", JSON.stringify({ projectId: "test-project" }));
32
+ vi.stubEnv("BIGQUERY_DATASET_LOCATION", "EU");
33
+ vi.stubEnv("DATASET_ID", "analytics");
34
+ vi.stubEnv("TABLE_NAME", "users");
35
+ vi.stubEnv("QUERY_STRING", "SELECT * FROM source.users");
36
+ vi.stubEnv("DISPLAY_NAME", "Users export");
37
+ vi.stubEnv("SCHEDULE", "every 24 hours");
38
+ vi.stubEnv("COLLECTION_PATH", "transferConfigs");
39
+ vi.stubEnv("LOG_LEVEL", "info");
40
+ }
20
41
 
21
42
  afterEach(() => {
22
43
  vi.unstubAllEnvs();
23
44
  });
24
45
 
25
46
  describe("CONFIG_EXPRESSIONS", () => {
26
- test("binds the trigger to the Pub/Sub topic parameter", () => {
47
+ test("binds the trigger to the Pub/Sub topic parameter", async () => {
48
+ const { CONFIG_EXPRESSIONS } = await importConfig(INSTANCE_ID);
49
+
27
50
  expect(CONFIG_EXPRESSIONS.pubSubTopic).toBeInstanceOf(Expression);
28
51
  expect((CONFIG_EXPRESSIONS.pubSubTopic as Expression<string>).toCEL()).toBe(
29
52
  "{{ params.PUB_SUB_TOPIC }}"
30
53
  );
31
54
  });
32
55
 
33
- test("defaults the topic parameter to the instance-namespaced kit topic", () => {
56
+ test("defaults the topic parameter to the instance-namespaced kit topic", async () => {
57
+ const { CONFIG_EXPRESSIONS } = await importConfig(INSTANCE_ID);
58
+
34
59
  const spec = (
35
60
  CONFIG_EXPRESSIONS.pubSubTopic as unknown as {
36
61
  toSpec: () => { default?: string };
37
62
  }
38
63
  ).toSpec();
39
- expect(spec.default).toBe("kit-{{ params.INSTANCE_ID }}-processMessages");
64
+ expect(spec.default).toBe("kit-users-export-processMessages");
40
65
  });
41
66
 
42
- test("accepts a topic ID but rejects a full resource name", () => {
67
+ test("accepts a topic ID but rejects a full resource name", async () => {
68
+ const { CONFIG_EXPRESSIONS } = await importConfig(INSTANCE_ID);
69
+
43
70
  const spec = (
44
71
  CONFIG_EXPRESSIONS.pubSubTopic as unknown as {
45
72
  toSpec: () => { input?: { text?: { validationRegex?: string } } };
@@ -60,22 +87,40 @@ describe("CONFIG_EXPRESSIONS", () => {
60
87
  });
61
88
  });
62
89
 
63
- describe("configFromEnv", () => {
64
- test("reads runtime parameters and derives the same topic", () => {
65
- vi.stubEnv(
66
- "FIREBASE_CONFIG",
67
- JSON.stringify({ projectId: "test-project" })
90
+ describe("instance id", () => {
91
+ // The CLI injects FIREBASE_KIT_INSTANCE_ID as a reserved env var; declaring
92
+ // it (or INSTANCE_ID) as a param makes the CLI prompt for a value it cannot
93
+ // accept and abort loading the kit.
94
+ test("is not declared as a param", async () => {
95
+ await importConfig(INSTANCE_ID);
96
+
97
+ const declared = declaredParams.map((param) => param.name);
98
+ expect(declared).toContain("PUB_SUB_TOPIC");
99
+ expect(declared).not.toContain("INSTANCE_ID");
100
+ expect(declared).not.toContain("FIREBASE_KIT_INSTANCE_ID");
101
+ });
102
+
103
+ test("fails discovery when FIREBASE_KIT_INSTANCE_ID is missing", async () => {
104
+ await expect(importConfig(undefined)).rejects.toThrow(
105
+ /FIREBASE_KIT_INSTANCE_ID is not set/
68
106
  );
69
- vi.stubEnv("INSTANCE_ID", "users-export");
70
- vi.stubEnv("BIGQUERY_DATASET_LOCATION", "EU");
71
- vi.stubEnv("DATASET_ID", "analytics");
72
- vi.stubEnv("TABLE_NAME", "users");
73
- vi.stubEnv("QUERY_STRING", "SELECT * FROM source.users");
74
- vi.stubEnv("DISPLAY_NAME", "Users export");
75
- vi.stubEnv("SCHEDULE", "every 24 hours");
76
- vi.stubEnv("COLLECTION_PATH", "transferConfigs");
77
- vi.stubEnv("LOG_LEVEL", "info");
107
+ });
108
+
109
+ test("throws at runtime when FIREBASE_KIT_INSTANCE_ID is missing", async () => {
110
+ const { configFromEnv } = await importConfig(INSTANCE_ID);
111
+ stubRuntimeEnv();
112
+ vi.stubEnv("FIREBASE_KIT_INSTANCE_ID", undefined);
78
113
 
114
+ expect(() => configFromEnv()).toThrow(
115
+ /FIREBASE_KIT_INSTANCE_ID is not set/
116
+ );
117
+ });
118
+ });
119
+
120
+ describe("configFromEnv", () => {
121
+ test("reads runtime parameters and derives the same topic", async () => {
122
+ const { configFromEnv } = await importConfig(INSTANCE_ID);
123
+ stubRuntimeEnv();
79
124
  vi.stubEnv("PUB_SUB_TOPIC", "kit-users-export-processMessages");
80
125
 
81
126
  expect(configFromEnv()).toMatchObject({
@@ -90,20 +135,9 @@ describe("configFromEnv", () => {
90
135
  });
91
136
  });
92
137
 
93
- test("passes through a topic pointing at the extension's own topic", () => {
94
- vi.stubEnv(
95
- "FIREBASE_CONFIG",
96
- JSON.stringify({ projectId: "test-project" })
97
- );
98
- vi.stubEnv("INSTANCE_ID", "users-export");
99
- vi.stubEnv("BIGQUERY_DATASET_LOCATION", "EU");
100
- vi.stubEnv("DATASET_ID", "analytics");
101
- vi.stubEnv("TABLE_NAME", "users");
102
- vi.stubEnv("QUERY_STRING", "SELECT * FROM source.users");
103
- vi.stubEnv("DISPLAY_NAME", "Users export");
104
- vi.stubEnv("SCHEDULE", "every 24 hours");
105
- vi.stubEnv("COLLECTION_PATH", "transferConfigs");
106
- vi.stubEnv("LOG_LEVEL", "info");
138
+ test("passes through a topic pointing at the extension's own topic", async () => {
139
+ const { configFromEnv } = await importConfig(INSTANCE_ID);
140
+ stubRuntimeEnv();
107
141
  vi.stubEnv("PUB_SUB_TOPIC", "ext-users-export-processMessages");
108
142
 
109
143
  expect(configFromEnv().pubSubTopic).toBe(
@@ -110,10 +110,46 @@ describe("convertUnsupportedDataTypes", () => {
110
110
  );
111
111
  });
112
112
 
113
- test("throws on a TIME value, which no Date can represent", () => {
114
- expect(() =>
115
- convertUnsupportedDataTypes({ time: new BigQueryTime("10:30:00") })
116
- ).toThrow('Value for argument "seconds" is not a valid integer.');
113
+ // The strings here are the values a live query returns for
114
+ // TIME "10:30:00", TIME "10:30:00.123456" and TIME "00:00:00".
115
+ test("keeps a TIME value as the string BigQuery returned", () => {
116
+ expect(
117
+ convertUnsupportedDataTypes({
118
+ plain: new BigQueryTime("10:30:00"),
119
+ micros: new BigQueryTime("10:30:00.123456"),
120
+ midnight: new BigQueryTime("00:00:00"),
121
+ })
122
+ ).toEqual({
123
+ plain: "10:30:00",
124
+ micros: "10:30:00.123456",
125
+ midnight: "00:00:00",
126
+ });
127
+ });
128
+
129
+ test("keeps TIME values nested in arrays and structs", () => {
130
+ expect(
131
+ convertUnsupportedDataTypes({
132
+ times: [new BigQueryTime("01:02:03"), new BigQueryTime("04:05:06")],
133
+ outer: { inner: new BigQueryTime("07:08:09") },
134
+ })
135
+ ).toEqual({
136
+ times: ["01:02:03", "04:05:06"],
137
+ outer: { inner: "07:08:09" },
138
+ });
139
+ });
140
+
141
+ test("still converts the other temporal types alongside a TIME", () => {
142
+ const converted = convertUnsupportedDataTypes({
143
+ time: new BigQueryTime("10:30:00"),
144
+ timestamp: new BigQueryTimestamp("2023-01-15T10:30:00.000Z"),
145
+ date: new BigQueryDate("2023-01-15"),
146
+ datetime: new BigQueryDatetime("2023-01-15T10:30:00"),
147
+ });
148
+
149
+ expect(converted.time).toBe("10:30:00");
150
+ expect(converted.timestamp).toBeInstanceOf(Timestamp);
151
+ expect(converted.date).toBeInstanceOf(Timestamp);
152
+ expect(converted.datetime).toBeInstanceOf(Timestamp);
117
153
  });
118
154
 
119
155
  test("converts a plain Date to a Firestore Timestamp", () => {