Skip to content

Commit da4d2d1

Browse files
authored
Added data connect to schematics (#3638)
1 parent 35e0a98 commit da4d2d1

File tree

6 files changed

+376
-101
lines changed

6 files changed

+376
-101
lines changed

package-lock.json

+18-5
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

+3-1
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
"test:chrome-headless": "npx --yes firebase-tools@latest emulators:exec --project=demo-123 \"ng test --watch=false --browsers=ChromeHeadless\"",
1313
"test:firefox-headless": "npx --yes firebase-tools@latest emulators:exec --project=demo-123 \"ng test --watch=false --browsers=FirefoxHeadless\"",
1414
"lint": "ng lint",
15+
"lint:fix": "ng lint --fix",
1516
"test:node": "node -r tsconfig-paths/register ./dist/out-tsc/jasmine/tools/jasmine.mjs --input-type=commonjs",
1617
"test:node-esm": "node -r tsconfig-paths/register ./dist/out-tsc/jasmine/tools/jasmine.mjs",
1718
"test:typings": "node ./tools/run-typings-test.js",
@@ -116,7 +117,8 @@
116117
"ts-patch": "^3.2.1",
117118
"ts-transformer-keys": "^0.4.4",
118119
"tslint": "~6.1.0",
119-
"typescript": ">=5.5 <5.7"
120+
"typescript": ">=5.5 <5.7",
121+
"yaml": "^2.7.0"
120122
},
121123
"typings": "index.d.ts"
122124
}

src/schematics/deploy/actions.jasmine.ts

+3
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,9 @@ const initMocks = () => {
6363
create: () => Promise.reject(),
6464
}
6565
},
66+
init() {
67+
return Promise.resolve()
68+
},
6669
deploy: (_: FirebaseDeployConfig) => Promise.resolve(),
6770
use: () => Promise.resolve(),
6871
logger: {

src/schematics/interfaces.ts

+41-1
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ export const featureOptions = [
2121
{ name: 'App Check', value: FEATURES.AppCheck },
2222
{ name: 'Firestore', value: FEATURES.Firestore },
2323
{ name: 'Realtime Database', value: FEATURES.Database },
24-
// { name: 'Data Connect', value: FEATURES.DataConnect },
24+
{ name: 'Data Connect', value: FEATURES.DataConnect },
2525
{ name: 'Cloud Functions (callable)', value: FEATURES.Functions },
2626
{ name: 'Cloud Messaging', value: FEATURES.Messaging },
2727
{ name: 'Performance Monitoring', value: FEATURES.Performance },
@@ -132,6 +132,8 @@ export interface FirebaseTools {
132132
serve(options: any): Promise<any>;
133133

134134
use(options: any, lol: any): Promise<any>;
135+
136+
init(feature: string, options: any): Promise<any>;
135137
}
136138

137139
export interface FirebaseHostingRewrite {
@@ -149,9 +151,14 @@ export interface FirebaseHostingConfig {
149151

150152
export type FirebaseFunctionsConfig = Record<string, any>;
151153

154+
export interface DataConnectConfig {
155+
source?: string;
156+
}
157+
152158
export interface FirebaseJSON {
153159
hosting?: FirebaseHostingConfig[] | FirebaseHostingConfig;
154160
functions?: FirebaseFunctionsConfig;
161+
dataconnect?: DataConnectConfig;
155162
}
156163

157164
export interface FirebaseRcTarget {
@@ -225,3 +232,36 @@ export interface Workspace {
225232
defaultProject?: string;
226233
projects: Record<string, WorkspaceProject>;
227234
}
235+
236+
export interface ConnectorConfig {
237+
location: string;
238+
connector: string;
239+
service: string;
240+
}
241+
export interface ConnectorYaml {
242+
connectorId: string;
243+
generate?: {
244+
javascriptSdk?: {
245+
package: string;
246+
outputDir: string;
247+
packageJsonDir?: string;
248+
angular?: boolean;
249+
}
250+
}
251+
}
252+
export interface DataConnectYaml {
253+
location: string;
254+
serviceId: string;
255+
connectorDirs: string[];
256+
}
257+
export interface DataConnectConnectorConfig {
258+
connectorYaml: ConnectorYaml;
259+
connectorConfig?: ConnectorConfig;
260+
angular?: boolean;
261+
package?: string;
262+
}
263+
264+
export interface PackageJson {
265+
dependencies: Record<string, string>;
266+
devDependencies: Record<string, string>;
267+
}

src/schematics/setup/index.ts

+56-8
Original file line numberDiff line numberDiff line change
@@ -1,24 +1,30 @@
1-
import { writeFileSync } from 'fs';
1+
import { readFileSync, writeFileSync } from 'fs';
22
import { join } from 'path';
33
import { asWindowsPath, normalize } from '@angular-devkit/core';
44
import { SchematicContext, Tree, chain } from '@angular-devkit/schematics';
55
import { addRootProvider } from '@schematics/angular/utility';
66
import { getFirebaseTools } from '../firebaseTools';
77
import {
8-
DeployOptions, FEATURES, FirebaseApp, FirebaseProject,
8+
DataConnectConnectorConfig,
9+
DeployOptions, FEATURES, FirebaseApp, FirebaseJSON, FirebaseProject,
910
} from '../interfaces';
1011
import {
1112
addIgnoreFiles,
1213
featureToRules,
1314
getFirebaseProjectNameFromHost,
1415
getProject,
16+
parseDataConnectConfig,
17+
setupTanstackDependencies,
1518
} from '../utils';
1619
import { appPrompt, featuresPrompt, projectPrompt, userPrompt } from './prompts';
1720

1821
export interface SetupConfig extends DeployOptions {
1922
firebaseProject: FirebaseProject,
2023
firebaseApp?: FirebaseApp,
2124
sdkConfig?: Record<string, string>,
25+
firebaseJsonConfig?: FirebaseJSON;
26+
dataConnectConfig?: DataConnectConnectorConfig | null;
27+
firebaseJsonPath: string;
2228
}
2329

2430
export const setupProject =
@@ -35,7 +41,7 @@ export const setupProject =
3541
config.sdkConfig ? `{ ${Object.entries(config.sdkConfig).map(([k, v]) => `${k}: ${JSON.stringify(v)}`).join(", ")} }` : ""
3642
}))`;
3743
}),
38-
...featureToRules(features, projectName),
44+
...featureToRules(features, projectName, config.dataConnectConfig),
3945
]);
4046
}
4147
};
@@ -56,6 +62,10 @@ export const ngAddSetupProject = (
5662

5763
// Add the firebase files if they don't exist already so login.use works
5864
if (!host.exists('/firebase.json')) { writeFileSync(join(projectRoot, 'firebase.json'), '{}'); }
65+
66+
let firebaseJson: FirebaseJSON = JSON.parse(
67+
readFileSync(join(projectRoot, "firebase.json")).toString()
68+
);
5969

6070
const user = await userPrompt({ projectRoot });
6171
const defaultUser = await firebaseTools.login(options);
@@ -72,19 +82,57 @@ export const ngAddSetupProject = (
7282
let firebaseApp: FirebaseApp|undefined;
7383
let sdkConfig: Record<string, string>|undefined;
7484

85+
const setupConfig: SetupConfig = {
86+
...options, firebaseProject, firebaseApp, sdkConfig,
87+
firebaseJsonConfig: firebaseJson,
88+
firebaseJsonPath: projectRoot
89+
};
7590
if (features.length) {
7691

7792
firebaseApp = await appPrompt(firebaseProject, undefined, { projectRoot });
7893

7994
const result = await firebaseTools.apps.sdkconfig('web', firebaseApp.appId, { nonInteractive: true, projectRoot });
8095
sdkConfig = result.sdkConfig;
8196
delete sdkConfig.locationId;
82-
97+
setupConfig.sdkConfig = sdkConfig;
98+
setupConfig.firebaseApp = firebaseApp;
99+
// set up data connect locally if data connect hasn't already been initialized.
100+
if(features.includes(FEATURES.DataConnect)) {
101+
if (!firebaseJson.dataconnect) {
102+
try {
103+
await firebaseTools.init("dataconnect", {
104+
projectRoot,
105+
project: firebaseProject.projectId,
106+
});
107+
// Update firebaseJson values to include newly added dataconnect field in firebase.json.
108+
firebaseJson = JSON.parse(
109+
readFileSync(join(projectRoot, "firebase.json")).toString()
110+
);
111+
setupConfig.firebaseJsonConfig = firebaseJson;
112+
} catch (e) {
113+
console.error(e);
114+
}
115+
}
116+
let dataConnectConfig = parseDataConnectConfig(setupConfig);
117+
if(!dataConnectConfig?.connectorYaml.generate?.javascriptSdk) {
118+
await firebaseTools.init("dataconnect:sdk", {
119+
projectRoot,
120+
project: firebaseProject.projectId,
121+
});
122+
}
123+
// Parse through sdk again
124+
dataConnectConfig = parseDataConnectConfig(setupConfig);
125+
if(dataConnectConfig?.angular) {
126+
context.logger.info('Generated Angular SDK Enabled.');
127+
} else {
128+
context.logger.info('Generated Angular SDK Disabled. Please add `angular: true` to your connector.yaml');
129+
}
130+
setupTanstackDependencies(host, context);
131+
setupConfig.dataConnectConfig = dataConnectConfig;
132+
}
133+
83134
}
84135

85-
return setupProject(host, context, features, {
86-
...options, firebaseProject, firebaseApp, sdkConfig,
87-
});
88-
136+
return setupProject(host, context, features, setupConfig);
89137
}
90138
};

0 commit comments

Comments
 (0)