@firebase-function-kits/bigquery-firestore-export 0.0.1 → 0.0.2-rc.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 (63) hide show
  1. package/CHANGELOG.md +1 -0
  2. package/README.md +308 -0
  3. package/lib/config.d.ts +5 -0
  4. package/lib/config.d.ts.map +1 -0
  5. package/lib/config.js +181 -0
  6. package/lib/config.js.map +1 -0
  7. package/lib/dts.d.ts +21 -0
  8. package/lib/dts.d.ts.map +1 -0
  9. package/lib/dts.js +193 -0
  10. package/lib/dts.js.map +1 -0
  11. package/lib/export-config.d.ts +55 -0
  12. package/lib/export-config.d.ts.map +1 -0
  13. package/lib/export-config.js +55 -0
  14. package/lib/export-config.js.map +1 -0
  15. package/lib/handlers.d.ts +22 -0
  16. package/lib/handlers.d.ts.map +1 -0
  17. package/lib/handlers.js +125 -0
  18. package/lib/handlers.js.map +1 -0
  19. package/lib/helper.d.ts +37 -0
  20. package/lib/helper.d.ts.map +1 -0
  21. package/lib/helper.js +219 -0
  22. package/lib/helper.js.map +1 -0
  23. package/lib/index.d.ts +7 -0
  24. package/lib/index.d.ts.map +1 -0
  25. package/lib/index.js +137 -0
  26. package/lib/index.js.map +1 -0
  27. package/lib/lib.d.ts +11 -0
  28. package/lib/lib.d.ts.map +1 -0
  29. package/lib/lib.js +47 -0
  30. package/lib/lib.js.map +1 -0
  31. package/lib/logs.d.ts +21 -0
  32. package/lib/logs.d.ts.map +1 -0
  33. package/lib/logs.js +122 -0
  34. package/lib/logs.js.map +1 -0
  35. package/lib/metadata.d.ts +6 -0
  36. package/lib/metadata.d.ts.map +1 -0
  37. package/lib/metadata.js +34 -0
  38. package/lib/metadata.js.map +1 -0
  39. package/lib/types.d.ts +44 -0
  40. package/lib/types.d.ts.map +1 -0
  41. package/lib/types.js +18 -0
  42. package/lib/types.js.map +1 -0
  43. package/npm-shrinkwrap.json +5049 -0
  44. package/package.json +40 -4
  45. package/src/config.ts +205 -0
  46. package/src/dts.ts +217 -0
  47. package/src/export-config.ts +119 -0
  48. package/src/handlers.ts +141 -0
  49. package/src/helper.ts +320 -0
  50. package/src/index.ts +126 -0
  51. package/src/lib.ts +69 -0
  52. package/src/logs.ts +145 -0
  53. package/src/metadata.ts +31 -0
  54. package/src/types.ts +100 -0
  55. package/tests/config.test.ts +61 -0
  56. package/tests/dts.test.ts +120 -0
  57. package/tests/export-config.test.ts +74 -0
  58. package/tests/handlers.test.ts +170 -0
  59. package/tests/helper.test.ts +74 -0
  60. package/tests/lib.test.ts +43 -0
  61. package/tsconfig.json +18 -0
  62. package/tsconfig.tsbuildinfo +1 -0
  63. package/index.js +0 -0
package/lib/dts.js ADDED
@@ -0,0 +1,193 @@
1
+ "use strict";
2
+ /*
3
+ * Copyright 2025 Google LLC
4
+ *
5
+ * Licensed under the Apache License, Version 2.0 (the "License");
6
+ * you may not use this file except in compliance with the License.
7
+ * You may obtain a copy of the License at
8
+ *
9
+ * https://www.apache.org/licenses/LICENSE-2.0
10
+ *
11
+ * Unless required by applicable law or agreed to in writing, software
12
+ * distributed under the License is distributed on an "AS IS" BASIS,
13
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14
+ * See the License for the specific language governing permissions and
15
+ * limitations under the License.
16
+ */
17
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
18
+ if (k2 === undefined) k2 = k;
19
+ var desc = Object.getOwnPropertyDescriptor(m, k);
20
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
21
+ desc = { enumerable: true, get: function() { return m[k]; } };
22
+ }
23
+ Object.defineProperty(o, k2, desc);
24
+ }) : (function(o, m, k, k2) {
25
+ if (k2 === undefined) k2 = k;
26
+ o[k2] = m[k];
27
+ }));
28
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
29
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
30
+ }) : function(o, v) {
31
+ o["default"] = v;
32
+ });
33
+ var __importStar = (this && this.__importStar) || (function () {
34
+ var ownKeys = function(o) {
35
+ ownKeys = Object.getOwnPropertyNames || function (o) {
36
+ var ar = [];
37
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
38
+ return ar;
39
+ };
40
+ return ownKeys(o);
41
+ };
42
+ return function (mod) {
43
+ if (mod && mod.__esModule) return mod;
44
+ var result = {};
45
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
46
+ __setModuleDefault(result, mod);
47
+ return result;
48
+ };
49
+ })();
50
+ Object.defineProperty(exports, "__esModule", { value: true });
51
+ exports.PARTITIONING_FIELD_REMOVAL_ERROR = exports.PARTITIONING_FIELD_REMOVAL_ERROR_PREFIX = void 0;
52
+ exports.createTransferConfigRequest = createTransferConfigRequest;
53
+ exports.getTransferConfig = getTransferConfig;
54
+ exports.createTransferConfig = createTransferConfig;
55
+ exports.constructUpdateTransferConfigRequest = constructUpdateTransferConfigRequest;
56
+ exports.updateTransferConfig = updateTransferConfig;
57
+ const bigqueryDataTransfer = __importStar(require("@google-cloud/bigquery-data-transfer"));
58
+ const logs = __importStar(require("./logs"));
59
+ const GRPC_NOT_FOUND = 5;
60
+ const PACKAGE_PARTITIONING_ERROR = "Cannot remove partitioning_field from an existing transfer config";
61
+ exports.PARTITIONING_FIELD_REMOVAL_ERROR_PREFIX = PACKAGE_PARTITIONING_ERROR;
62
+ exports.PARTITIONING_FIELD_REMOVAL_ERROR = `${PACKAGE_PARTITIONING_ERROR}. The BigQuery Data Transfer API does not support clearing this parameter once it has been set. To change partitioning, create a new transfer config with the desired setting.`;
63
+ function isNotFoundError(err) {
64
+ return (typeof err === "object" &&
65
+ err !== null &&
66
+ "code" in err &&
67
+ err.code === GRPC_NOT_FOUND);
68
+ }
69
+ function transferConfigFields(config) {
70
+ const fields = config.params?.fields;
71
+ if (!fields) {
72
+ throw new Error("Transfer config has invalid structure: missing params.fields");
73
+ }
74
+ if (!fields.query) {
75
+ throw new Error("Transfer config has invalid structure: missing params.fields.query");
76
+ }
77
+ if (!fields.destination_table_name_template) {
78
+ throw new Error("Transfer config has invalid structure: missing params.fields.destination_table_name_template");
79
+ }
80
+ return fields;
81
+ }
82
+ function stringField(value) {
83
+ return { stringValue: value ?? "" };
84
+ }
85
+ /**
86
+ * Creates the protobuf-shaped request used for a scheduled query.
87
+ *
88
+ * The query runs as whichever identity creates it, which is this function. To
89
+ * name a different account, `serviceAccountName` goes on the request rather
90
+ * than on the transfer config, and the caller needs `actAs` on the account it
91
+ * names, including its own.
92
+ */
93
+ function createTransferConfigRequest(config) {
94
+ return {
95
+ parent: `projects/${config.projectId}`,
96
+ transferConfig: {
97
+ destinationDatasetId: config.datasetId,
98
+ displayName: config.displayName,
99
+ dataSourceId: "scheduled_query",
100
+ params: {
101
+ fields: {
102
+ query: stringField(config.queryString),
103
+ destination_table_name_template: stringField(`${config.tableName}_{run_time|"%H%M%S"}`),
104
+ write_disposition: stringField("WRITE_TRUNCATE"),
105
+ partitioning_field: stringField(config.partitioningField),
106
+ },
107
+ },
108
+ schedule: config.schedule,
109
+ notificationPubsubTopic: `projects/${config.projectId}/topics/${config.pubSubTopic}`,
110
+ },
111
+ };
112
+ }
113
+ async function getTransferConfig(client, transferConfigName) {
114
+ try {
115
+ const [config] = await client.getTransferConfig({
116
+ name: transferConfigName,
117
+ });
118
+ return config;
119
+ }
120
+ catch (err) {
121
+ if (isNotFoundError(err)) {
122
+ logs.transferConfigNotFound(transferConfigName);
123
+ return null;
124
+ }
125
+ logs.getTransferConfigFailed(transferConfigName, err);
126
+ throw err;
127
+ }
128
+ }
129
+ async function createTransferConfig(client, config) {
130
+ logs.createTransferConfig();
131
+ const [created] = await client.createTransferConfig(createTransferConfigRequest(config));
132
+ if (!created.name) {
133
+ throw new Error("BigQuery API returned a transfer config without a name");
134
+ }
135
+ logs.transferConfigCreated(created.name);
136
+ return created;
137
+ }
138
+ /** Builds a minimal update mask while retaining unsupported immutable fields. */
139
+ async function constructUpdateTransferConfigRequest(client, transferConfigName, config) {
140
+ const transferConfig = await getTransferConfig(client, transferConfigName);
141
+ if (!transferConfig)
142
+ throw new Error("Transfer config not found");
143
+ const fields = transferConfigFields(transferConfig);
144
+ const updatedConfig = JSON.parse(JSON.stringify(transferConfig));
145
+ const updatedFields = transferConfigFields(updatedConfig);
146
+ const updateMask = [];
147
+ if (config.datasetId !== transferConfig.destinationDatasetId) {
148
+ updateMask.push("destination_dataset_id");
149
+ updatedConfig.destinationDatasetId = config.datasetId;
150
+ }
151
+ if (config.queryString !== fields.query.stringValue) {
152
+ updateMask.push("params");
153
+ updatedFields.query.stringValue = config.queryString;
154
+ }
155
+ const tableTemplate = `${config.tableName}_{run_time|"%H%M%S"}`;
156
+ if (tableTemplate !== fields.destination_table_name_template.stringValue) {
157
+ updateMask.push("params");
158
+ updatedFields.destination_table_name_template.stringValue = tableTemplate;
159
+ }
160
+ const existingPartitioningField = fields.partitioning_field?.stringValue ?? "";
161
+ const newPartitioningField = config.partitioningField ?? "";
162
+ if (newPartitioningField !== existingPartitioningField) {
163
+ if (!newPartitioningField) {
164
+ logs.partitioningFieldRemovalAttempted(transferConfigName, existingPartitioningField);
165
+ throw new Error(exports.PARTITIONING_FIELD_REMOVAL_ERROR);
166
+ }
167
+ updateMask.push("params");
168
+ updatedFields.partitioning_field ??= {};
169
+ updatedFields.partitioning_field.stringValue = newPartitioningField;
170
+ }
171
+ if (config.schedule !== transferConfig.schedule) {
172
+ updateMask.push("schedule");
173
+ updatedConfig.schedule = config.schedule;
174
+ }
175
+ const expectedTopic = `projects/${config.projectId}/topics/${config.pubSubTopic}`;
176
+ if (expectedTopic !== transferConfig.notificationPubsubTopic) {
177
+ updateMask.push("notification_pubsub_topic");
178
+ updatedConfig.notificationPubsubTopic = expectedTopic;
179
+ }
180
+ return {
181
+ transferConfig: updatedConfig,
182
+ updateMask: { paths: [...new Set(updateMask)] },
183
+ };
184
+ }
185
+ async function updateTransferConfig(client, transferConfigName, config) {
186
+ const request = await constructUpdateTransferConfigRequest(client, transferConfigName, config);
187
+ logs.updateTransferConfig(transferConfigName);
188
+ const converted = bigqueryDataTransfer.protos.google.cloud.bigquery.datatransfer.v1.UpdateTransferConfigRequest.fromObject(request);
189
+ const [updated] = await client.updateTransferConfig(converted);
190
+ logs.transferConfigUpdated(transferConfigName);
191
+ return updated;
192
+ }
193
+ //# sourceMappingURL=dts.js.map
package/lib/dts.js.map ADDED
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dts.js","sourceRoot":"","sources":["../src/dts.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,55 @@
1
+ import type { Expression } from "firebase-functions/params";
2
+ /** Log levels supported by the original extension. */
3
+ export type LogLevel = "debug" | "info" | "warn" | "error" | "silent";
4
+ /** Public configuration for the BigQuery-to-Firestore functions. */
5
+ export interface BigqueryFirestoreExportConfig {
6
+ /** Location of the BigQuery destination dataset, for example `US`. */
7
+ bigqueryDatasetLocation: string;
8
+ /** Google Cloud project id. */
9
+ projectId: string;
10
+ /** Stable id used to associate a DTS config with this deployment. */
11
+ instanceId: string;
12
+ /** Link this existing DTS config instead of creating one. */
13
+ transferConfigName?: string;
14
+ /** BigQuery destination dataset id. */
15
+ datasetId: string;
16
+ /** Prefix for per-run destination tables. */
17
+ tableName: string;
18
+ /** Scheduled query text. */
19
+ queryString: string;
20
+ /** Human-readable DTS scheduled-query name. */
21
+ displayName: string;
22
+ /** Optional destination-table partitioning field. */
23
+ partitioningField?: string;
24
+ /** BigQuery Data Transfer schedule, for example `every 15 minutes`. */
25
+ schedule: string;
26
+ /** Pub/Sub topic receiving DTS completion notifications. */
27
+ pubSubTopic?: string;
28
+ /** Root Firestore collection for configs and run output. */
29
+ firestoreCollection?: string;
30
+ /** Log verbosity. Defaults to `info`. */
31
+ logLevel?: LogLevel;
32
+ }
33
+ /** Configuration after defaults and validation have been applied. */
34
+ export interface ResolvedBigqueryFirestoreExportConfig {
35
+ bigqueryDatasetLocation: string;
36
+ projectId: string;
37
+ instanceId: string;
38
+ transferConfigName?: string;
39
+ datasetId: string;
40
+ tableName: string;
41
+ queryString: string;
42
+ displayName: string;
43
+ partitioningField?: string;
44
+ schedule: string;
45
+ pubSubTopic: string;
46
+ firestoreCollection: string;
47
+ logLevel: LogLevel;
48
+ }
49
+ /** Deploy-time values used to construct the v2 triggers. */
50
+ export interface DeployTimeOptions {
51
+ pubSubTopic: string | Expression<string>;
52
+ }
53
+ /** Applies package defaults and validates a user-supplied configuration. */
54
+ export declare function resolveConfig(config: BigqueryFirestoreExportConfig): ResolvedBigqueryFirestoreExportConfig;
55
+ //# sourceMappingURL=export-config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"export-config.d.ts","sourceRoot":"","sources":["../src/export-config.ts"],"names":[],"mappings":"AAgBA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,2BAA2B,CAAC;AAE5D,sDAAsD;AACtD,MAAM,MAAM,QAAQ,GAAG,OAAO,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,QAAQ,CAAC;AAEtE,oEAAoE;AACpE,MAAM,WAAW,6BAA6B;IAC5C,sEAAsE;IACtE,uBAAuB,EAAE,MAAM,CAAC;IAChC,+BAA+B;IAC/B,SAAS,EAAE,MAAM,CAAC;IAClB,qEAAqE;IACrE,UAAU,EAAE,MAAM,CAAC;IACnB,6DAA6D;IAC7D,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,uCAAuC;IACvC,SAAS,EAAE,MAAM,CAAC;IAClB,6CAA6C;IAC7C,SAAS,EAAE,MAAM,CAAC;IAClB,4BAA4B;IAC5B,WAAW,EAAE,MAAM,CAAC;IACpB,+CAA+C;IAC/C,WAAW,EAAE,MAAM,CAAC;IACpB,qDAAqD;IACrD,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,uEAAuE;IACvE,QAAQ,EAAE,MAAM,CAAC;IACjB,4DAA4D;IAC5D,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,4DAA4D;IAC5D,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,yCAAyC;IACzC,QAAQ,CAAC,EAAE,QAAQ,CAAC;CACrB;AAED,qEAAqE;AACrE,MAAM,WAAW,qCAAqC;IACpD,uBAAuB,EAAE,MAAM,CAAC;IAChC,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;IACpB,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,EAAE,MAAM,CAAC;IACpB,mBAAmB,EAAE,MAAM,CAAC;IAC5B,QAAQ,EAAE,QAAQ,CAAC;CACpB;AAED,4DAA4D;AAC5D,MAAM,WAAW,iBAAiB;IAChC,WAAW,EAAE,MAAM,GAAG,UAAU,CAAC,MAAM,CAAC,CAAC;CAC1C;AAgBD,4EAA4E;AAC5E,wBAAgB,aAAa,CAC3B,MAAM,EAAE,6BAA6B,GACpC,qCAAqC,CA4BvC"}
@@ -0,0 +1,55 @@
1
+ "use strict";
2
+ /*
3
+ * Copyright 2026 Google LLC
4
+ *
5
+ * Licensed under the Apache License, Version 2.0 (the "License");
6
+ * you may not use this file except in compliance with the License.
7
+ * You may obtain a copy of the License at
8
+ *
9
+ * https://www.apache.org/licenses/LICENSE-2.0
10
+ *
11
+ * Unless required by applicable law or agreed to in writing, software
12
+ * distributed under the License is distributed on an "AS IS" BASIS,
13
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14
+ * See the License for the specific language governing permissions and
15
+ * limitations under the License.
16
+ */
17
+ Object.defineProperty(exports, "__esModule", { value: true });
18
+ exports.resolveConfig = resolveConfig;
19
+ function required(value, field) {
20
+ const normalized = value.trim();
21
+ if (!normalized) {
22
+ throw new Error(`${field} must be a non-empty string.`);
23
+ }
24
+ return normalized;
25
+ }
26
+ function optional(value) {
27
+ if (value === undefined)
28
+ return undefined;
29
+ const normalized = value.trim();
30
+ return normalized || undefined;
31
+ }
32
+ /** Applies package defaults and validates a user-supplied configuration. */
33
+ function resolveConfig(config) {
34
+ const instanceId = required(config.instanceId, "instanceId");
35
+ const logLevel = config.logLevel ?? "info";
36
+ if (!["debug", "info", "warn", "error", "silent"].includes(logLevel)) {
37
+ throw new Error(`Unsupported logLevel: ${logLevel}`);
38
+ }
39
+ return {
40
+ bigqueryDatasetLocation: required(config.bigqueryDatasetLocation, "bigqueryDatasetLocation"),
41
+ projectId: required(config.projectId, "projectId"),
42
+ instanceId,
43
+ transferConfigName: optional(config.transferConfigName),
44
+ datasetId: required(config.datasetId, "datasetId"),
45
+ tableName: required(config.tableName, "tableName"),
46
+ queryString: required(config.queryString, "queryString"),
47
+ displayName: required(config.displayName, "displayName"),
48
+ partitioningField: optional(config.partitioningField),
49
+ schedule: required(config.schedule, "schedule"),
50
+ pubSubTopic: optional(config.pubSubTopic) ?? `kit-${instanceId}-processMessages`,
51
+ firestoreCollection: optional(config.firestoreCollection) ?? "transferConfigs",
52
+ logLevel,
53
+ };
54
+ }
55
+ //# sourceMappingURL=export-config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"export-config.js","sourceRoot":"","sources":["../src/export-config.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;GAcG;;;AA2DH,SAAS,QAAQ,CAAC,KAAa,EAAE,KAAa;IAC5C,MAAM,UAAU,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC;IAChC,IAAI,CAAC,UAAU,EAAE,CAAC;QAChB,MAAM,IAAI,KAAK,CAAC,GAAG,KAAK,8BAA8B,CAAC,CAAC;IAC1D,CAAC;IACD,OAAO,UAAU,CAAC;AACpB,CAAC;AAED,SAAS,QAAQ,CAAC,KAAyB;IACzC,IAAI,KAAK,KAAK,SAAS;QAAE,OAAO,SAAS,CAAC;IAC1C,MAAM,UAAU,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC;IAChC,OAAO,UAAU,IAAI,SAAS,CAAC;AACjC,CAAC;AAED,4EAA4E;AAC5E,uBACE,MAAqC;IAErC,MAAM,UAAU,GAAG,QAAQ,CAAC,MAAM,CAAC,UAAU,EAAE,YAAY,CAAC,CAAC;IAC7D,MAAM,QAAQ,GAAG,MAAM,CAAC,QAAQ,IAAI,MAAM,CAAC;IAE3C,IAAI,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,QAAQ,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC;QACrE,MAAM,IAAI,KAAK,CAAC,yBAAyB,QAAQ,EAAE,CAAC,CAAC;IACvD,CAAC;IAED,OAAO;QACL,uBAAuB,EAAE,QAAQ,CAC/B,MAAM,CAAC,uBAAuB,EAC9B,yBAAyB,CAC1B;QACD,SAAS,EAAE,QAAQ,CAAC,MAAM,CAAC,SAAS,EAAE,WAAW,CAAC;QAClD,UAAU;QACV,kBAAkB,EAAE,QAAQ,CAAC,MAAM,CAAC,kBAAkB,CAAC;QACvD,SAAS,EAAE,QAAQ,CAAC,MAAM,CAAC,SAAS,EAAE,WAAW,CAAC;QAClD,SAAS,EAAE,QAAQ,CAAC,MAAM,CAAC,SAAS,EAAE,WAAW,CAAC;QAClD,WAAW,EAAE,QAAQ,CAAC,MAAM,CAAC,WAAW,EAAE,aAAa,CAAC;QACxD,WAAW,EAAE,QAAQ,CAAC,MAAM,CAAC,WAAW,EAAE,aAAa,CAAC;QACxD,iBAAiB,EAAE,QAAQ,CAAC,MAAM,CAAC,iBAAiB,CAAC;QACrD,QAAQ,EAAE,QAAQ,CAAC,MAAM,CAAC,QAAQ,EAAE,UAAU,CAAC;QAC/C,WAAW,EACT,QAAQ,CAAC,MAAM,CAAC,WAAW,CAAC,IAAI,OAAO,UAAU,kBAAkB;QACrE,mBAAmB,EACjB,QAAQ,CAAC,MAAM,CAAC,mBAAmB,CAAC,IAAI,iBAAiB;QAC3D,QAAQ;KACT,CAAC;AACJ,CAAC"}
@@ -0,0 +1,22 @@
1
+ import type { BigQuery } from "@google-cloud/bigquery";
2
+ import type { PubSub } from "@google-cloud/pubsub";
3
+ import type { Firestore } from "firebase-admin/firestore";
4
+ import type { CloudEvent } from "firebase-functions/v2";
5
+ import type { MessagePublishedData } from "firebase-functions/v2/pubsub";
6
+ import { type DataTransferClient } from "./dts";
7
+ import type { ResolvedBigqueryFirestoreExportConfig } from "./export-config";
8
+ import type { TransferRunPayload } from "./types";
9
+ export type TransferRunEvent = CloudEvent<MessagePublishedData<TransferRunPayload>>;
10
+ /** External services used by both handlers, injected for testability. */
11
+ export interface HandlerContext {
12
+ db: Firestore;
13
+ bigquery: BigQuery;
14
+ dataTransfer: DataTransferClient;
15
+ pubsub: PubSub;
16
+ config: ResolvedBigqueryFirestoreExportConfig;
17
+ }
18
+ /** Handles a v2 Pub/Sub completion notification from BigQuery DTS. */
19
+ export declare function handleMessagePublished(event: TransferRunEvent, ctx: HandlerContext): Promise<void>;
20
+ /** Idempotently creates, links, or updates this deployment's DTS config. */
21
+ export declare function handleUpsertTransferConfig(ctx: HandlerContext): Promise<void>;
22
+ //# sourceMappingURL=handlers.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"handlers.d.ts","sourceRoot":"","sources":["../src/handlers.ts"],"names":[],"mappings":"AAgBA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,wBAAwB,CAAC;AACvD,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,sBAAsB,CAAC;AACnD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,0BAA0B,CAAC;AAC1D,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AACxD,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,8BAA8B,CAAC;AACzE,OAAO,EAEL,KAAK,kBAAkB,EAGxB,MAAM,OAAO,CAAC;AACf,OAAO,KAAK,EAAE,qCAAqC,EAAE,MAAM,iBAAiB,CAAC;AAG7E,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,SAAS,CAAC;AAElD,MAAM,MAAM,gBAAgB,GAAG,UAAU,CACvC,oBAAoB,CAAC,kBAAkB,CAAC,CACzC,CAAC;AAEF,yEAAyE;AACzE,MAAM,WAAW,cAAc;IAC7B,EAAE,EAAE,SAAS,CAAC;IACd,QAAQ,EAAE,QAAQ,CAAC;IACnB,YAAY,EAAE,kBAAkB,CAAC;IACjC,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,qCAAqC,CAAC;CAC/C;AAqCD,sEAAsE;AACtE,wBAAsB,sBAAsB,CAC1C,KAAK,EAAE,gBAAgB,EACvB,GAAG,EAAE,cAAc,GAClB,OAAO,CAAC,IAAI,CAAC,CASf;AAED,4EAA4E;AAC5E,wBAAsB,0BAA0B,CAC9C,GAAG,EAAE,cAAc,GAClB,OAAO,CAAC,IAAI,CAAC,CA0Cf"}
@@ -0,0 +1,125 @@
1
+ "use strict";
2
+ /*
3
+ * Copyright 2026 Google LLC
4
+ *
5
+ * Licensed under the Apache License, Version 2.0 (the "License");
6
+ * you may not use this file except in compliance with the License.
7
+ * You may obtain a copy of the License at
8
+ *
9
+ * https://www.apache.org/licenses/LICENSE-2.0
10
+ *
11
+ * Unless required by applicable law or agreed to in writing, software
12
+ * distributed under the License is distributed on an "AS IS" BASIS,
13
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14
+ * See the License for the specific language governing permissions and
15
+ * limitations under the License.
16
+ */
17
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
18
+ if (k2 === undefined) k2 = k;
19
+ var desc = Object.getOwnPropertyDescriptor(m, k);
20
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
21
+ desc = { enumerable: true, get: function() { return m[k]; } };
22
+ }
23
+ Object.defineProperty(o, k2, desc);
24
+ }) : (function(o, m, k, k2) {
25
+ if (k2 === undefined) k2 = k;
26
+ o[k2] = m[k];
27
+ }));
28
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
29
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
30
+ }) : function(o, v) {
31
+ o["default"] = v;
32
+ });
33
+ var __importStar = (this && this.__importStar) || (function () {
34
+ var ownKeys = function(o) {
35
+ ownKeys = Object.getOwnPropertyNames || function (o) {
36
+ var ar = [];
37
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
38
+ return ar;
39
+ };
40
+ return ownKeys(o);
41
+ };
42
+ return function (mod) {
43
+ if (mod && mod.__esModule) return mod;
44
+ var result = {};
45
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
46
+ __setModuleDefault(result, mod);
47
+ return result;
48
+ };
49
+ })();
50
+ Object.defineProperty(exports, "__esModule", { value: true });
51
+ exports.handleMessagePublished = handleMessagePublished;
52
+ exports.handleUpsertTransferConfig = handleUpsertTransferConfig;
53
+ const dts_1 = require("./dts");
54
+ const helper_1 = require("./helper");
55
+ const logs = __importStar(require("./logs"));
56
+ async function ensureNotificationTopic(ctx) {
57
+ const topic = ctx.pubsub.topic(ctx.config.pubSubTopic);
58
+ const [exists] = await topic.exists();
59
+ if (exists)
60
+ return;
61
+ try {
62
+ await ctx.pubsub.createTopic(ctx.config.pubSubTopic);
63
+ logs.topicCreated(ctx.config.pubSubTopic);
64
+ }
65
+ catch (err) {
66
+ // A concurrent init can create the same topic between exists() and create().
67
+ if (typeof err !== "object" ||
68
+ err === null ||
69
+ !("code" in err) ||
70
+ err.code !== 6) {
71
+ throw err;
72
+ }
73
+ }
74
+ }
75
+ async function storeTransferConfig(ctx, transferConfig) {
76
+ if (!transferConfig?.name) {
77
+ throw new Error("BigQuery transfer config is missing its resource name");
78
+ }
79
+ const { transferConfigId } = (0, helper_1.parseTransferConfigName)(transferConfig.name);
80
+ await ctx.db
81
+ .collection(ctx.config.firestoreCollection)
82
+ .doc(transferConfigId)
83
+ .set({ extInstanceId: ctx.config.instanceId, ...transferConfig });
84
+ }
85
+ /** Handles a v2 Pub/Sub completion notification from BigQuery DTS. */
86
+ async function handleMessagePublished(event, ctx) {
87
+ logs.start();
88
+ try {
89
+ await (0, helper_1.handleTransferRunMessage)(ctx, { json: event.data.message.json });
90
+ logs.complete();
91
+ }
92
+ catch (err) {
93
+ logs.error(err);
94
+ throw err;
95
+ }
96
+ }
97
+ /** Idempotently creates, links, or updates this deployment's DTS config. */
98
+ async function handleUpsertTransferConfig(ctx) {
99
+ await ensureNotificationTopic(ctx);
100
+ if (ctx.config.transferConfigName) {
101
+ const linked = await (0, dts_1.getTransferConfig)(ctx.dataTransfer, ctx.config.transferConfigName);
102
+ if (!linked) {
103
+ throw new Error(`Transfer config not found: ${ctx.config.transferConfigName}`);
104
+ }
105
+ await storeTransferConfig(ctx, linked);
106
+ return;
107
+ }
108
+ const existing = await ctx.db
109
+ .collection(ctx.config.firestoreCollection)
110
+ .where("extInstanceId", "==", ctx.config.instanceId)
111
+ .limit(1)
112
+ .get();
113
+ if (existing.empty) {
114
+ const created = await (0, dts_1.createTransferConfig)(ctx.dataTransfer, ctx.config);
115
+ await storeTransferConfig(ctx, created);
116
+ return;
117
+ }
118
+ const transferConfigName = existing.docs[0].data().name;
119
+ if (typeof transferConfigName !== "string" || !transferConfigName) {
120
+ throw new Error(`Existing transfer config document in ${ctx.config.firestoreCollection} is missing required 'name' field.`);
121
+ }
122
+ const updated = await (0, dts_1.updateTransferConfig)(ctx.dataTransfer, transferConfigName, ctx.config);
123
+ await storeTransferConfig(ctx, updated);
124
+ }
125
+ //# sourceMappingURL=handlers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"handlers.js","sourceRoot":"","sources":["../src/handlers.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,37 @@
1
+ import { type BigQuery } from "@google-cloud/bigquery";
2
+ import { type Firestore } from "firebase-admin/firestore";
3
+ import type { ResolvedBigqueryFirestoreExportConfig } from "./export-config";
4
+ import type { BigQueryRow, BigQueryRowValue, FirestoreRow, FirestoreRowValue, TransferRunMessage } from "./types";
5
+ export interface ParsedTransferRunName {
6
+ projectId: string;
7
+ location: string;
8
+ transferConfigId: string;
9
+ runId: string;
10
+ }
11
+ export interface ParsedTransferConfigName {
12
+ projectId: string;
13
+ location: string;
14
+ transferConfigId: string;
15
+ }
16
+ export interface ResultHandlerContext {
17
+ db: Firestore;
18
+ bigquery: BigQuery;
19
+ config: ResolvedBigqueryFirestoreExportConfig;
20
+ }
21
+ export declare function parseTransferRunName(name: string): ParsedTransferRunName;
22
+ export declare function parseTransferConfigName(name: string): ParsedTransferConfigName;
23
+ export declare function updateLatestRunDocument(db: Firestore, config: ResolvedBigqueryFirestoreExportConfig, transferConfigId: string, runId: string, message: TransferRunMessage, rowCounts: {
24
+ failedRowCount: number;
25
+ totalRowCount: number;
26
+ }): Promise<void>;
27
+ export declare function getBigqueryResults(bigquery: BigQuery, config: ResolvedBigqueryFirestoreExportConfig, transferConfigId: string, runId: string, datasetId: string, tableName: string): Promise<BigQueryRow[]>;
28
+ export declare function convertUnsupportedDataTypes(row: null): null;
29
+ export declare function convertUnsupportedDataTypes(row: string): string;
30
+ export declare function convertUnsupportedDataTypes(row: number): number;
31
+ export declare function convertUnsupportedDataTypes(row: boolean): boolean;
32
+ export declare function convertUnsupportedDataTypes(row: BigQueryRow): FirestoreRow;
33
+ export declare function convertUnsupportedDataTypes(row: BigQueryRowValue): FirestoreRowValue;
34
+ export declare function writeRunResultsToFirestore(ctx: ResultHandlerContext, message: TransferRunMessage): Promise<void>;
35
+ export declare function transferConfigAssociatedWithInstance(db: Firestore, config: ResolvedBigqueryFirestoreExportConfig, transferConfigId: string): Promise<boolean>;
36
+ export declare function handleTransferRunMessage(ctx: ResultHandlerContext, message: TransferRunMessage): Promise<void>;
37
+ //# sourceMappingURL=helper.d.ts.map
@@ -0,0 +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,CA+Df;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"}