Skip to content

Commit ead816b

Browse files
authored
Fixing issues with init dataconnect (#7295)
1 parent 13ffce6 commit ead816b

File tree

4 files changed

+43
-9
lines changed

4 files changed

+43
-9
lines changed

CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
- Fixes some cases where `firebase init dataconnect` did not write project files correctly.

scripts/publish-vsce.sh

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ echo "Making a $VERSION version of VSCode..."
2828
npm version $VERSION
2929
NEW_VSCODE_VERSION=$(jq -r ".version" package.json)
3030
NEXT_HEADER="## NEXT"
31-
NEW_HEADER="## NEXT \n\n## $NEW_VSCODE_VERSION\n\n- Updated internal firebase-tools dependency to $CLI_VERSION"
31+
NEW_HEADER="## NEXT\n\n## $NEW_VSCODE_VERSION\n\n- Updated internal firebase-tools dependency to $CLI_VERSION"
3232
sed -i -e "s/$NEXT_HEADER/$NEW_HEADER/g" CHANGELOG.md
3333
echo "Made a $VERSION version of VSCode."
3434

src/dataconnect/names.ts

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -60,3 +60,32 @@ export function parseConnectorName(connectorName: string): connectorName {
6060
toString,
6161
};
6262
}
63+
64+
interface cloudSQLInstanceName {
65+
projectId: string;
66+
location: string;
67+
instanceId: string;
68+
toString(): string;
69+
}
70+
71+
const cloudSQLInstanceNameRegex =
72+
/projects\/(?<projectId>[^\/]+)\/locations\/(?<location>[^\/]+)\/instances\/(?<instanceId>[^\/]+)/;
73+
74+
export function parseCloudSQLInstanceName(cloudSQLInstanceName: string): cloudSQLInstanceName {
75+
const res = cloudSQLInstanceNameRegex.exec(cloudSQLInstanceName);
76+
const projectId = res?.groups?.projectId;
77+
const location = res?.groups?.location;
78+
const instanceId = res?.groups?.instanceId;
79+
if (!projectId || !location || !instanceId) {
80+
throw new FirebaseError(`${cloudSQLInstanceName} is not a valid cloudSQL instance name`);
81+
}
82+
const toString = () => {
83+
return `projects/${projectId}/locations/${location}/services/${instanceId}`;
84+
};
85+
return {
86+
projectId,
87+
location,
88+
instanceId,
89+
toString,
90+
};
91+
}

src/init/features/dataconnect/index.ts

Lines changed: 12 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ import { ensureApis } from "../../../dataconnect/ensureApis";
1010
import { listLocations, listAllServices, getSchema } from "../../../dataconnect/client";
1111
import { Schema, Service } from "../../../dataconnect/types";
1212
import { DEFAULT_POSTGRES_CONNECTION } from "../emulators";
13-
import { parseServiceName } from "../../../dataconnect/names";
13+
import { parseCloudSQLInstanceName, parseServiceName } from "../../../dataconnect/names";
1414
import { logger } from "../../../logger";
1515

1616
const TEMPLATE_ROOT = resolve(__dirname, "../../../../templates/init/dataconnect/");
@@ -67,6 +67,10 @@ export async function doSetup(setup: Setup, config: Config): Promise<void> {
6767
const subbedDataconnectYaml = subValues(DATACONNECT_YAML_TEMPLATE, info);
6868
const subbedConnectorYaml = subValues(CONNECTOR_YAML_TEMPLATE, info);
6969

70+
if (!config.has("dataconnect")) {
71+
config.set("dataconnect.source", dir);
72+
config.set("dataconnect.location", info.locationId);
73+
}
7074
await config.askWriteProjectFile(join(dir, "dataconnect.yaml"), subbedDataconnectYaml);
7175
await config.askWriteProjectFile(join(dir, "schema", "schema.gql"), SCHEMA_TEMPLATE);
7276
await config.askWriteProjectFile(
@@ -78,6 +82,7 @@ export async function doSetup(setup: Setup, config: Config): Promise<void> {
7882
join(dir, info.connectorId, "mutations.gql"),
7983
MUTATIONS_TEMPLATE,
8084
);
85+
8186
if (
8287
setup.projectId &&
8388
(info.isNewInstance || info.isNewDatabase) &&
@@ -156,8 +161,12 @@ async function promptForService(setup: Setup, info: RequiredInfo): Promise<Requi
156161
info.serviceId = serviceName.serviceId;
157162
info.locationId = serviceName.location;
158163
if (choice.schema) {
159-
info.cloudSqlInstanceId =
160-
choice.schema.primaryDatasource.postgresql?.cloudSql.instance ?? "";
164+
if (choice.schema.primaryDatasource.postgresql?.cloudSql.instance) {
165+
const instanceName = parseCloudSQLInstanceName(
166+
choice.schema.primaryDatasource.postgresql?.cloudSql.instance,
167+
);
168+
info.cloudSqlInstanceId = instanceName.instanceId;
169+
}
161170
info.cloudSqlDatabase = choice.schema.primaryDatasource.postgresql?.database ?? "";
162171
}
163172
}
@@ -243,11 +252,6 @@ async function promptForDatabase(
243252
config: Config,
244253
info: RequiredInfo,
245254
): Promise<RequiredInfo> {
246-
const dir: string = config.get("dataconnect.source") || "dataconnect";
247-
if (!config.has("dataconnect")) {
248-
config.set("dataconnect.source", dir);
249-
config.set("dataconnect.location", info.locationId);
250-
}
251255
if (!info.isNewInstance && setup.projectId) {
252256
try {
253257
const dbs = await cloudsql.listDatabases(setup.projectId, info.cloudSqlInstanceId);

0 commit comments

Comments
 (0)