Skip to content
Permalink

Comparing changes

Choose two branches to see what’s changed or to start a new pull request. If you need to, you can also or learn more about diff comparisons.

Open a pull request

Create a new pull request by comparing changes across two branches. If you need to, you can also . Learn more about diff comparisons here.
base repository: firebase/firebase-functions
Failed to load repositories. Confirm that selected base ref is valid, then try again.
Loading
base: v4.0.1
Choose a base ref
...
head repository: firebase/firebase-functions
Failed to load repositories. Confirm that selected head ref is valid, then try again.
Loading
compare: v4.0.2
Choose a head ref
  • 8 commits
  • 36 files changed
  • 8 contributors

Commits on Oct 18, 2022

  1. Copy the full SHA
    5c038e6 View commit details

Commits on Oct 27, 2022

  1. Copy the full SHA
    d6d05aa View commit details

Commits on Oct 28, 2022

  1. Copy the full SHA
    1b8d1e1 View commit details

Commits on Oct 31, 2022

  1. export https provider for V1 functions just like in V3 SDK (#1287)

    Co-authored-by: Daniel Lee <taeold@gmail.com>
    YannicEl and taeold authored Oct 31, 2022
    Copy the full SHA
    970ccf6 View commit details
  2. Fix wrong paths to package.json typesVersions (#1267)

    * Fix wrong paths to package.json typesVersions
    
    typedVersions should not contain slash at the start of the path.
    
    Fixes #1266
    
    * Add missing https export from v1
    
    v1 was missing the https export
    
    Co-authored-by: Thomas Bouldin <inlined@users.noreply.github.com>
    leon and inlined authored Oct 31, 2022
    Copy the full SHA
    d09f4cb View commit details

Commits on Nov 1, 2022

  1. Copy the full SHA
    f61934c View commit details
  2. Add missing changelog entries. (#1296)

    * Add missing changelog entries.
    
    * Make prettier happy.
    taeold authored Nov 1, 2022
    Copy the full SHA
    0646c4c View commit details
  3. 4.0.2

    google-oss-bot committed Nov 1, 2022
    Copy the full SHA
    9004c1e View commit details
5 changes: 4 additions & 1 deletion CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1 +1,4 @@
Correct the function BooleanExpression#then to BooleanExpression#thenElse (#1268)
- Fix bug where [secret parameters](https://firebase.google.com/docs/functions/config-env#secret_parameters), defined using `defineSecret()`, were missing a `.value()` method (#1281)
- Fix bug where v1/https was not exported (#1267)
- Fix incorrect typeVersion export paths (#1287)
- Revert removal of `\_\_trigger` (#1274)
4 changes: 2 additions & 2 deletions package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

32 changes: 18 additions & 14 deletions package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "firebase-functions",
"version": "4.0.1",
"version": "4.0.2",
"description": "Firebase SDK for Cloud Functions",
"keywords": [
"firebase",
@@ -36,6 +36,7 @@
"./v1/auth": "./lib/v1/providers/auth.js",
"./v1/database": "./lib/v1/providers/database.js",
"./v1/firestore": "./lib/v1/providers/firestore.js",
"./v1/https": "./lib/v1/providers/https.js",
"./v1/pubsub": "./lib/v1/providers/pubsub.js",
"./v1/remoteConfig": "./lib/v1/providers/remoteConfig.js",
"./v1/storage": "./lib/v1/providers/storage.js",
@@ -75,31 +76,34 @@
"lib/v1"
],
"v1/analytics": [
"./lib/v1/providers/analytics"
"lib/v1/providers/analytics"
],
"v1/auth": [
"./lib/v1/providers/auth"
"lib/v1/providers/auth"
],
"v1/database": [
"./lib/v1/privders/database"
"lib/v1/privders/database"
],
"v1/firestore": [
"./lib/v1/providers/firestore"
"lib/v1/providers/firestore"
],
"v1/https": [
"./lib/v1/providers/https"
],
"v1/pubsub": [
"./lib/v1/providers/pubsub"
"lib/v1/providers/pubsub"
],
"/v1/remoteConfig": [
"./lib/v1/providers/remoteConfig"
"v1/remoteConfig": [
"lib/v1/providers/remoteConfig"
],
"/v1/storage": [
"./lib/v1/providers/storage"
"v1/storage": [
"lib/v1/providers/storage"
],
"/v1/tasks": [
"./lib/v1/providers/tasks"
"v1/tasks": [
"lib/v1/providers/tasks"
],
"/v1/testLab": [
"./lib/v1/providers/testLab"
"v1/testLab": [
"lib/v1/providers/testLab"
],
"v2": [
"lib/v2"
5 changes: 5 additions & 0 deletions spec/params/params.spec.ts
Original file line number Diff line number Diff line change
@@ -27,6 +27,7 @@ describe("Params value extraction", () => {
process.env.PI = "3.14159";
process.env.TRUE = "true";
process.env.FALSE = "false";
process.env.A_SECRET_STRING = "123456supersecret";
});

afterEach(() => {
@@ -41,6 +42,7 @@ describe("Params value extraction", () => {
delete process.env.PI;
delete process.env.TRUE;
delete process.env.FALSE;
delete process.env.A_SECRET_STRING;
});

it("extracts identity params from the environment", () => {
@@ -58,6 +60,9 @@ describe("Params value extraction", () => {

const falseParam = params.defineBoolean("FALSE");
expect(falseParam.value()).to.be.false;

const secretParam = params.defineSecret("A_SECRET_STRING");
expect(secretParam.value()).to.equal("123456supersecret");
});

it("extracts the special case internal params from env.FIREBASE_CONFIG", () => {
20 changes: 18 additions & 2 deletions spec/v1/cloud-functions.spec.ts
Original file line number Diff line number Diff line change
@@ -41,7 +41,7 @@ describe("makeCloudFunction", () => {
legacyEventType: "providers/provider/eventTypes/event",
};

it("should put a __endpoint on the returned CloudFunction", () => {
it("should put a __trigger/__endpoint on the returned CloudFunction", () => {
const cf = makeCloudFunction({
provider: "mock.provider",
eventType: "mock.event",
@@ -50,6 +50,14 @@ describe("makeCloudFunction", () => {
handler: () => null,
});

expect(cf.__trigger).to.deep.equal({
eventTrigger: {
eventType: "mock.provider.mock.event",
resource: "resource",
service: "service",
},
});

expect(cf.__endpoint).to.deep.equal({
...MINIMAL_V1_ENDPOINT,
platform: "gcfv1",
@@ -64,9 +72,17 @@ describe("makeCloudFunction", () => {
});
});

it("should have legacy event type in __endpoint if provided", () => {
it("should have legacy event type in __trigger/__endpoint if provided", () => {
const cf = makeCloudFunction(cloudFunctionArgs);

expect(cf.__trigger).to.deep.equal({
eventTrigger: {
eventType: "providers/provider/eventTypes/event",
resource: "resource",
service: "service",
},
});

expect(cf.__endpoint).to.deep.equal({
...MINIMAL_V1_ENDPOINT,
platform: "gcfv1",
69 changes: 50 additions & 19 deletions spec/v1/function-builder.spec.ts
Original file line number Diff line number Diff line change
@@ -24,7 +24,6 @@ import { expect } from "chai";
import { clearParams, defineSecret } from "../../src/params";

import * as functions from "../../src/v1";
import { ResetValue } from "../../src/common/options";

describe("FunctionBuilder", () => {
before(() => {
@@ -41,6 +40,7 @@ describe("FunctionBuilder", () => {
.auth.user()
.onCreate((user) => user);

expect(fn.__trigger.regions).to.deep.equal(["us-east1"]);
expect(fn.__endpoint.region).to.deep.equal(["us-east1"]);
});

@@ -50,6 +50,7 @@ describe("FunctionBuilder", () => {
.auth.user()
.onCreate((user) => user);

expect(fn.__trigger.regions).to.deep.equal(["us-east1", "us-central1"]);
expect(fn.__endpoint.region).to.deep.equal(["us-east1", "us-central1"]);
});

@@ -68,6 +69,17 @@ describe("FunctionBuilder", () => {
.auth.user()
.onCreate((user) => user);

expect(fn.__trigger.regions).to.deep.equal([
"us-central1",
"us-east1",
"us-east4",
"europe-west1",
"europe-west2",
"europe-west3",
"asia-east2",
"asia-northeast1",
]);

expect(fn.__endpoint.region).to.deep.equal([
"us-central1",
"us-east1",
@@ -93,6 +105,8 @@ describe("FunctionBuilder", () => {
expect(fn.__endpoint.availableMemoryMb).to.deep.equal(256);
expect(fn.__endpoint.timeoutSeconds).to.deep.equal(90);
expect(fn.__endpoint.eventTrigger.retry).to.deep.equal(true);
expect(fn.__trigger.availableMemoryMb).to.deep.equal(256);
expect(fn.__trigger.timeout).to.deep.equal("90s");
});

it("should allow SecretParams in the secrets array and convert them", () => {
@@ -104,6 +118,11 @@ describe("FunctionBuilder", () => {
.auth.user()
.onCreate((user) => user);

expect(fn.__trigger.secrets).to.deep.equal([
{
name: "API_KEY",
},
]);
expect(fn.__endpoint.secretEnvironmentVariables).to.deep.equal([
{
key: "API_KEY",
@@ -136,6 +155,9 @@ describe("FunctionBuilder", () => {
.auth.user()
.onCreate((user) => user);

expect(fn.__trigger.regions).to.deep.equal(["europe-west2"]);
expect(fn.__trigger.availableMemoryMb).to.deep.equal(256);
expect(fn.__trigger.timeout).to.deep.equal("90s");
expect(fn.__endpoint.region).to.deep.equal(["europe-west2"]);
expect(fn.__endpoint.availableMemoryMb).to.deep.equal(256);
expect(fn.__endpoint.timeoutSeconds).to.deep.equal(90);
@@ -151,6 +173,9 @@ describe("FunctionBuilder", () => {
.auth.user()
.onCreate((user) => user);

expect(fn.__trigger.regions).to.deep.equal(["europe-west1"]);
expect(fn.__trigger.availableMemoryMb).to.deep.equal(256);
expect(fn.__trigger.timeout).to.deep.equal("90s");
expect(fn.__endpoint.region).to.deep.equal(["europe-west1"]);
expect(fn.__endpoint.availableMemoryMb).to.deep.equal(256);
expect(fn.__endpoint.timeoutSeconds).to.deep.equal(90);
@@ -223,6 +248,7 @@ describe("FunctionBuilder", () => {
.runWith({ ingressSettings: "ALLOW_INTERNAL_ONLY" })
.https.onRequest(() => undefined);

expect(fn.__trigger.ingressSettings).to.equal("ALLOW_INTERNAL_ONLY");
expect(fn.__endpoint.ingressSettings).to.equal("ALLOW_INTERNAL_ONLY");
});

@@ -245,11 +271,8 @@ describe("FunctionBuilder", () => {
.auth.user()
.onCreate((user) => user);

if (!(fn.__endpoint.vpc instanceof ResetValue)) {
expect(fn.__endpoint.vpc.connector).to.equal("test-connector");
} else {
expect.fail("__endpoint.vpc unexpectedly set to RESET_VALUE");
}
expect(fn.__trigger.vpcConnector).to.equal("test-connector");
expect(fn.__endpoint.vpc).to.deep.equal({ connector: "test-connector" });
});

it("should allow a vpcConnectorEgressSettings to be set", () => {
@@ -261,11 +284,11 @@ describe("FunctionBuilder", () => {
.auth.user()
.onCreate((user) => user);

if (!(fn.__endpoint.vpc instanceof ResetValue)) {
expect(fn.__endpoint.vpc.egressSettings).to.equal("PRIVATE_RANGES_ONLY");
} else {
expect.fail("__endpoint.vpc unexpectedly set to RESET_VALUE");
}
expect(fn.__trigger.vpcConnectorEgressSettings).to.equal("PRIVATE_RANGES_ONLY");
expect(fn.__endpoint.vpc).to.deep.equal({
connector: "test-connector",
egressSettings: "PRIVATE_RANGES_ONLY",
});
});

it("should throw an error if user chooses an invalid vpcConnectorEgressSettings", () => {
@@ -292,17 +315,22 @@ describe("FunctionBuilder", () => {
.onCreate((user) => user);

expect(fn.__endpoint.serviceAccountEmail).to.equal(serviceAccount);
expect(fn.__trigger.serviceAccountEmail).to.equal(serviceAccount);
});

it("should allow a serviceAccount to be set with generated service account email", () => {
const serviceAccount = "test-service-account@";
const projectId = process.env.GCLOUD_PROJECT;
const fn = functions
.runWith({
serviceAccount,
})
.auth.user()
.onCreate((user) => user);

expect(fn.__trigger.serviceAccountEmail).to.equal(
`test-service-account@${projectId}.iam.gserviceaccount.com`
);
expect(fn.__endpoint.serviceAccountEmail).to.equal(`test-service-account@`);
});

@@ -315,7 +343,8 @@ describe("FunctionBuilder", () => {
.auth.user()
.onCreate((user) => user);

expect(fn.__endpoint.serviceAccountEmail).to.equal("default");
expect(fn.__trigger.serviceAccountEmail).to.be.null;
expect(fn.__endpoint.serviceAccountEmail).to.equal(serviceAccount);
});

it("should throw an error if serviceAccount is set to an invalid value", () => {
@@ -337,6 +366,7 @@ describe("FunctionBuilder", () => {
.onCreate((user) => user);

expect(fn.__endpoint.availableMemoryMb).to.deep.equal(4096);
expect(fn.__trigger.availableMemoryMb).to.deep.equal(4096);
});

it("should allow labels to be set", () => {
@@ -349,6 +379,9 @@ describe("FunctionBuilder", () => {
.auth.user()
.onCreate((user) => user);

expect(fn.__trigger.labels).to.deep.equal({
"valid-key": "valid-value",
});
expect(fn.__endpoint.labels).to.deep.equal({
"valid-key": "valid-value",
});
@@ -504,22 +537,20 @@ describe("FunctionBuilder", () => {
.auth.user()
.onCreate((user) => user);

expect(fn.__endpoint.secretEnvironmentVariables).to.deep.equal([
{
key: "API_KEY",
},
]);
expect(fn.__trigger.secrets).to.deep.equal(secrets);
expect(fn.__endpoint.secretEnvironmentVariables).to.deep.equal([{ key: secrets[0] }]);
});

it("should throw error given secrets expressed with full resource name", () => {
const sp = defineSecret("projects/my-project/secrets/API_KEY");

expect(() =>
functions.runWith({
secrets: ["projects/my-project/secrets/API_KEY"],
})
).to.throw();
});

it("should throw error given invalid secret config", () => {
const sp = defineSecret("projects/my-project/secrets/API_KEY");
expect(() =>
functions.runWith({
secrets: [sp],
Loading