Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
26 commits
Select commit Hold shift + click to select a range
004652b
Include clientCache field during init
itsrakhil Mar 12, 2026
c8af9bd
Update sdk.spec.ts
itsrakhil Mar 12, 2026
d5e7b43
Update sdk.spec.ts
itsrakhil Mar 12, 2026
17837ac
Update sdk.spec.ts
itsrakhil Mar 12, 2026
ca7ad4b
Update sdk.spec.ts
itsrakhil Mar 12, 2026
302ef71
Merge branch 'main' into caching
itsrakhil Mar 12, 2026
d5f08b1
Merge branch 'main' into caching
itsrakhil Mar 12, 2026
68e90f2
Update sdk.spec.ts
itsrakhil Mar 12, 2026
f0971ef
Merge branch 'main' into caching
itsrakhil Mar 13, 2026
2f9eaf7
Merge branch 'main' into caching
itsrakhil Mar 17, 2026
c456fdf
Merge branch 'firebase:main' into caching
itsrakhil Mar 20, 2026
9c9cf0a
Merge branch 'main' into caching
itsrakhil Mar 20, 2026
7d22b75
Update sdk.spec.ts
itsrakhil Mar 20, 2026
b62fd03
Update sdk.ts
itsrakhil Mar 20, 2026
8bccae6
Update experiments.ts
itsrakhil Mar 21, 2026
bab80ca
Update sdk.spec.ts
itsrakhil Mar 21, 2026
8f30655
Update sdk.spec.ts
itsrakhil Mar 22, 2026
f204d45
Merge branch 'main' into caching
itsrakhil Mar 24, 2026
c5c754d
Include empty clientCache configs on init
itsrakhil Mar 24, 2026
bc44b42
Update sdk.spec.ts
itsrakhil Mar 24, 2026
9a6a205
Update experiments.ts
itsrakhil Mar 24, 2026
3d96c43
Merge branch 'firebase:caching' into caching
itsrakhil Mar 24, 2026
d48b9cd
Merge branch 'main' into caching
itsrakhil Mar 24, 2026
2edc93c
Merge branch 'main' into caching
itsrakhil Mar 25, 2026
ab7e3a1
Merge branch 'firebase:caching' into caching
itsrakhil Mar 25, 2026
637cd23
Merge branch 'main' into caching
itsrakhil Mar 25, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 5 additions & 0 deletions src/experiments.ts
Original file line number Diff line number Diff line change
Expand Up @@ -193,6 +193,11 @@ export const ALL_EXPERIMENTS = experiments({
default: true,
public: false,
},
fdcrealtime: {
shortDescription: "Enable Firebase Data Connect realtime feature.",
default: false,
public: false,
},
});

export type ExperimentName = keyof typeof ALL_EXPERIMENTS;
Expand Down
34 changes: 34 additions & 0 deletions src/init/features/dataconnect/sdk.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@ import * as fsutils from "../../../fsutils";
import * as auth from "../../../auth";
import * as utils from "../../../utils";
import * as prompt from "../../../prompt";
import * as experiments from "../../../experiments";

const expect = chai.expect;

Expand All @@ -49,6 +50,10 @@ describe("addSdkGenerateToConnectorYaml", () => {
};
});

afterEach(() => {
sinon.restore();
});

it("should add javascriptSdk for web platform", () => {
addSdkGenerateToConnectorYaml(connectorInfo, connectorYaml, app);
expect(connectorYaml.generate?.javascriptSdk).to.deep.equal([
Expand Down Expand Up @@ -120,6 +125,35 @@ describe("addSdkGenerateToConnectorYaml", () => {
},
]);
});

it("should conditionally inject clientCache if fdcrealtime is enabled", () => {
sinon.stub(experiments, "isEnabled").withArgs("fdcrealtime").returns(true);
addSdkGenerateToConnectorYaml(connectorInfo, connectorYaml, app);
expect((connectorYaml.generate?.javascriptSdk as any)[0].clientCache).to.deep.equal({});
});

it("should NOT overwrite existing clientCache configuration", () => {
sinon.stub(experiments, "isEnabled").withArgs("fdcrealtime").returns(true);
connectorYaml.generate = {
javascriptSdk: [
{
outputDir: "../app/src/dataconnect-generated",
package: "@dataconnect/generated",
packageJsonDir: "../app",
react: false,
angular: false,
clientCache: {
type: "memory",
} as any,
},
],
};
addSdkGenerateToConnectorYaml(connectorInfo, connectorYaml, app);
expect(connectorYaml.generate?.javascriptSdk).to.have.lengthOf(1);
expect((connectorYaml.generate?.javascriptSdk as any)[0].clientCache).to.deep.equal({
type: "memory",
});
});
});

describe("chooseApp", () => {
Expand Down
44 changes: 31 additions & 13 deletions src/init/features/dataconnect/sdk.ts
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,9 @@ import {
DartSDK,
JavascriptSDK,
KotlinSDK,
SwiftSDK,
} from "../../../dataconnect/types";
import * as experiments from "../../../experiments";
import { FirebaseError } from "../../../error";
import { isArray } from "lodash";
import {
Expand Down Expand Up @@ -381,19 +383,23 @@ export function addSdkGenerateToConnectorYaml(

case Platform.WEB: {
const javascriptSdk: JavascriptSDK = {
outputDir: path.relative(connectorDir, path.join(appDir, `src/dataconnect-generated`)),
package: `@dataconnect/generated`,
packageJsonDir: path.relative(connectorDir, appDir),
react: false,
angular: false,
outputDir: path.relative(
connectorDir,
path.join(app.directory, "src/dataconnect-generated"),
),
package: "@dataconnect/generated",
packageJsonDir: path.relative(connectorDir, app.directory),
react: app.frameworks?.includes(Framework.REACT) ?? false,
angular: app.frameworks?.includes(Framework.ANGULAR) ?? false,
};
for (const f of app.frameworks || []) {
javascriptSdk[f] = true;
if (experiments.isEnabled("fdcrealtime")) {
javascriptSdk.clientCache = {};
}
if (!isArray(generate?.javascriptSdk)) {
generate.javascriptSdk = generate.javascriptSdk ? [generate.javascriptSdk] : [];
}
if (!generate.javascriptSdk.some((s) => s.outputDir === javascriptSdk.outputDir)) {
const existing = generate.javascriptSdk.find((s) => s.outputDir === javascriptSdk.outputDir);
if (!existing) {
generate.javascriptSdk.push(javascriptSdk);
}
break;
Expand All @@ -403,39 +409,51 @@ export function addSdkGenerateToConnectorYaml(
outputDir: path.relative(connectorDir, path.join(appDir, `lib/dataconnect_generated`)),
package: "dataconnect_generated/generated.dart",
};
if (experiments.isEnabled("fdcrealtime")) {
dartSdk.clientCache = {};
}
if (!isArray(generate?.dartSdk)) {
generate.dartSdk = generate.dartSdk ? [generate.dartSdk] : [];
}
if (!generate.dartSdk.some((s) => s.outputDir === dartSdk.outputDir)) {
const existing = generate.dartSdk.find((s) => s.outputDir === dartSdk.outputDir);
if (!existing) {
generate.dartSdk.push(dartSdk);
}
break;
}
case Platform.ANDROID: {
const kotlinSdk: KotlinSDK = {
outputDir: path.relative(connectorDir, path.join(appDir, `src/main/kotlin`)),
outputDir: path.relative(connectorDir, path.join(app.directory, "src/main/kotlin")),
package: `com.google.firebase.dataconnect.generated`,
};
if (experiments.isEnabled("fdcrealtime")) {
kotlinSdk.clientCache = {};
}
if (!isArray(generate?.kotlinSdk)) {
generate.kotlinSdk = generate.kotlinSdk ? [generate.kotlinSdk] : [];
}
if (!generate.kotlinSdk.some((s) => s.outputDir === kotlinSdk.outputDir)) {
const existing = generate.kotlinSdk.find((s) => s.outputDir === kotlinSdk.outputDir);
if (!existing) {
generate.kotlinSdk.push(kotlinSdk);
}
break;
}
case Platform.IOS: {
const swiftSdk = {
const swiftSdk: SwiftSDK = {
outputDir: path.relative(
connectorDir,
path.join(app.directory, `../FirebaseDataConnectGenerated`),
),
package: "DataConnectGenerated",
};
if (experiments.isEnabled("fdcrealtime")) {
swiftSdk.clientCache = {};
}
if (!isArray(generate?.swiftSdk)) {
generate.swiftSdk = generate.swiftSdk ? [generate.swiftSdk] : [];
}
if (!generate.swiftSdk.some((s) => s.outputDir === swiftSdk.outputDir)) {
const existing = generate.swiftSdk.find((s) => s.outputDir === swiftSdk.outputDir);
if (!existing) {
generate.swiftSdk.push(swiftSdk);
}
break;
Expand Down
Loading