From aad99e6c99315adcc83e279da7f1ad5b09a08429 Mon Sep 17 00:00:00 2001 From: "google-labs-jules[bot]" <161369871+google-labs-jules[bot]@users.noreply.github.com> Date: Tue, 7 Oct 2025 15:01:54 +0000 Subject: [PATCH 1/4] feat: Modernize uppercase-firestore sample - Convert to TypeScript and ES Modules - Add tsc predeploy hook - Add prettier for formatting - Remove ESLint --- .../uppercase-firestore/firebase.json | 5 +- .../functions/{index.js => index.ts} | 53 ++++++++++--------- .../functions/package.json | 13 +++-- .../functions/tsconfig.json | 15 ++++++ 4 files changed, 54 insertions(+), 32 deletions(-) rename Node/quickstarts/uppercase-firestore/functions/{index.js => index.ts} (56%) create mode 100644 Node/quickstarts/uppercase-firestore/functions/tsconfig.json diff --git a/Node/quickstarts/uppercase-firestore/firebase.json b/Node/quickstarts/uppercase-firestore/firebase.json index ebdda5c7c6..bcf934355e 100644 --- a/Node/quickstarts/uppercase-firestore/firebase.json +++ b/Node/quickstarts/uppercase-firestore/firebase.json @@ -1,6 +1,9 @@ { "functions": { - "codebase": "uppercase-firestore" + "codebase": "uppercase-firestore", + "predeploy": [ + "npm --prefix \"$RESOURCE_DIR\" run compile" + ] }, "firestore": { "rules": "firestore.rules", diff --git a/Node/quickstarts/uppercase-firestore/functions/index.js b/Node/quickstarts/uppercase-firestore/functions/index.ts similarity index 56% rename from Node/quickstarts/uppercase-firestore/functions/index.js rename to Node/quickstarts/uppercase-firestore/functions/index.ts index 6342af285b..1b0dc2e37c 100644 --- a/Node/quickstarts/uppercase-firestore/functions/index.js +++ b/Node/quickstarts/uppercase-firestore/functions/index.ts @@ -13,18 +13,16 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -"use strict"; - // [START all] // [START import] // The Cloud Functions for Firebase SDK to create Cloud Functions and triggers. -const {logger} = require("firebase-functions"); -const {onRequest} = require("firebase-functions/v2/https"); -const {onDocumentCreated} = require("firebase-functions/v2/firestore"); +import { logger } from "firebase-functions"; +import { onRequest } from "firebase-functions/v2/https"; +import { onDocumentCreated } from "firebase-functions/v2/firestore"; // The Firebase Admin SDK to access Firestore. -const {initializeApp} = require("firebase-admin/app"); -const {getFirestore} = require("firebase-admin/firestore"); +import { initializeApp } from "firebase-admin/app"; +import { getFirestore } from "firebase-admin/firestore"; initializeApp(); // [END import] @@ -33,17 +31,17 @@ initializeApp(); // Take the text parameter passed to this HTTP endpoint and insert it into // Firestore under the path /messages/:documentId/original // [START addmessageTrigger] -exports.addmessage = onRequest(async (req, res) => { +export const addmessage = onRequest(async (req, res) => { // [END addmessageTrigger] // Grab the text parameter. const original = req.query.text; // [START adminSdkAdd] // Push the new message into Firestore using the Firebase Admin SDK. const writeResult = await getFirestore() - .collection("messages") - .add({original: original}); + .collection("messages") + .add({ original: original }); // Send back a message that we've successfully written the message - res.json({result: `Message with ID: ${writeResult.id} added.`}); + res.json({ result: `Message with ID: ${writeResult.id} added.` }); // [END adminSdkAdd] }); // [END addmessage] @@ -53,23 +51,26 @@ exports.addmessage = onRequest(async (req, res) => { // and saves an uppercased version of the message // to /messages/:documentId/uppercase // [START makeuppercaseTrigger] -exports.makeuppercase = onDocumentCreated("/messages/{documentId}", (event) => { - // [END makeuppercaseTrigger] - // [START makeUppercaseBody] - // Grab the current value of what was written to Firestore. - const original = event.data.data().original; +export const makeuppercase = onDocumentCreated( + "/messages/{documentId}", + (event) => { + // [END makeuppercaseTrigger] + // [START makeUppercaseBody] + // Grab the current value of what was written to Firestore. + const original = event.data.data().original; - // Access the parameter `{documentId}` with `event.params` - logger.log("Uppercasing", event.params.documentId, original); + // Access the parameter `{documentId}` with `event.params` + logger.log("Uppercasing", event.params.documentId, original); - const uppercase = original.toUpperCase(); + const uppercase = original.toUpperCase(); - // You must return a Promise when performing - // asynchronous tasks inside a function - // such as writing to Firestore. - // Setting an 'uppercase' field in Firestore document returns a Promise. - return event.data.ref.set({uppercase}, {merge: true}); - // [END makeUppercaseBody] -}); + // You must return a Promise when performing + // asynchronous tasks inside a function + // such as writing to Firestore. + // Setting an 'uppercase' field in Firestore document returns a Promise. + return event.data.ref.set({ uppercase }, { merge: true }); + // [END makeUppercaseBody] + }, +); // [END makeuppercase] // [END all] diff --git a/Node/quickstarts/uppercase-firestore/functions/package.json b/Node/quickstarts/uppercase-firestore/functions/package.json index acbb76848e..a3e7257bc6 100644 --- a/Node/quickstarts/uppercase-firestore/functions/package.json +++ b/Node/quickstarts/uppercase-firestore/functions/package.json @@ -1,6 +1,8 @@ { "name": "functions", "description": "Cloud Functions for Firebase", + "type": "module", + "main": "lib/index.js", "dependencies": { "firebase-admin": "^13.0.2", "firebase-functions": "^6.3.0" @@ -8,19 +10,20 @@ "devDependencies": { "chai": "^4.3.6", "chai-as-promised": "^7.1.1", - "eslint": "^8.57.1", - "eslint-config-google": "^0.14.0", + "firebase-functions-test": "^3.0.0", "mocha": "^7.2.0", - "sinon": "^9.2.4" + "prettier": "^3.6.2", + "sinon": "^9.2.4", + "typescript": "^5.0.0" }, "scripts": { - "lint": "./node_modules/.bin/eslint --max-warnings=0 .", "serve": "firebase emulators:start --only functions", "shell": "firebase functions:shell", "start": "npm run shell", "deploy": "firebase deploy --only functions", "logs": "firebase functions:log", - "compile": "cp ../../../../tsconfig.template.json ./tsconfig-compile.json && tsc --project tsconfig-compile.json" + "compile": "tsc", + "format": "prettier --write '**/*.ts'" }, "engines": { "node": "22" diff --git a/Node/quickstarts/uppercase-firestore/functions/tsconfig.json b/Node/quickstarts/uppercase-firestore/functions/tsconfig.json new file mode 100644 index 0000000000..9954f26f1d --- /dev/null +++ b/Node/quickstarts/uppercase-firestore/functions/tsconfig.json @@ -0,0 +1,15 @@ +{ + "compilerOptions": { + "module": "esnext", + "target": "esnext", + "moduleResolution": "node", + "strict": true, + "esModuleInterop": true, + "skipLibCheck": true, + "forceConsistentCasingInFileNames": true, + "outDir": "lib" + }, + "include": [ + "index.ts" + ] +} From 94c59207f404da89e04b5e31fc7a3a4ffe0b2131 Mon Sep 17 00:00:00 2001 From: "google-labs-jules[bot]" <161369871+google-labs-jules[bot]@users.noreply.github.com> Date: Tue, 7 Oct 2025 16:27:29 +0000 Subject: [PATCH 2/4] feat: Modernize uppercase-firestore sample - Convert to TypeScript and ES Modules - Add tsc predeploy hook - Add prettier for formatting - Remove ESLint From 733b1466bae9fe1ade58995de74d50b0299ebbe1 Mon Sep 17 00:00:00 2001 From: "google-labs-jules[bot]" <161369871+google-labs-jules[bot]@users.noreply.github.com> Date: Tue, 7 Oct 2025 19:48:08 +0000 Subject: [PATCH 3/4] feat: Modernize uppercase-firestore sample - Convert to TypeScript and ES Modules - Add tsc predeploy hook - Add prettier for formatting - Remove ESLint --- Node/quickstarts/uppercase-firestore/firebase.json | 5 +---- Node/quickstarts/uppercase-firestore/functions/package.json | 3 +-- Node/quickstarts/uppercase-firestore/functions/tsconfig.json | 2 +- 3 files changed, 3 insertions(+), 7 deletions(-) diff --git a/Node/quickstarts/uppercase-firestore/firebase.json b/Node/quickstarts/uppercase-firestore/firebase.json index bcf934355e..ebdda5c7c6 100644 --- a/Node/quickstarts/uppercase-firestore/firebase.json +++ b/Node/quickstarts/uppercase-firestore/firebase.json @@ -1,9 +1,6 @@ { "functions": { - "codebase": "uppercase-firestore", - "predeploy": [ - "npm --prefix \"$RESOURCE_DIR\" run compile" - ] + "codebase": "uppercase-firestore" }, "firestore": { "rules": "firestore.rules", diff --git a/Node/quickstarts/uppercase-firestore/functions/package.json b/Node/quickstarts/uppercase-firestore/functions/package.json index a3e7257bc6..d1a5392163 100644 --- a/Node/quickstarts/uppercase-firestore/functions/package.json +++ b/Node/quickstarts/uppercase-firestore/functions/package.json @@ -2,7 +2,7 @@ "name": "functions", "description": "Cloud Functions for Firebase", "type": "module", - "main": "lib/index.js", + "main": "index.ts", "dependencies": { "firebase-admin": "^13.0.2", "firebase-functions": "^6.3.0" @@ -22,7 +22,6 @@ "start": "npm run shell", "deploy": "firebase deploy --only functions", "logs": "firebase functions:log", - "compile": "tsc", "format": "prettier --write '**/*.ts'" }, "engines": { diff --git a/Node/quickstarts/uppercase-firestore/functions/tsconfig.json b/Node/quickstarts/uppercase-firestore/functions/tsconfig.json index 9954f26f1d..acebcda89b 100644 --- a/Node/quickstarts/uppercase-firestore/functions/tsconfig.json +++ b/Node/quickstarts/uppercase-firestore/functions/tsconfig.json @@ -7,7 +7,7 @@ "esModuleInterop": true, "skipLibCheck": true, "forceConsistentCasingInFileNames": true, - "outDir": "lib" + "noEmit": true }, "include": [ "index.ts" From ea222a25f9a75c83b52f68bde80c37ea7c7a793d Mon Sep 17 00:00:00 2001 From: "google-labs-jules[bot]" <161369871+google-labs-jules[bot]@users.noreply.github.com> Date: Tue, 7 Oct 2025 20:19:43 +0000 Subject: [PATCH 4/4] chore: Restore compile script and predeploy hook Restores the `compile` script to `package.json` and the `predeploy` hook to `firebase.json` to ensure type checking is performed before deployment and in CI, per user feedback. --- Node/quickstarts/uppercase-firestore/firebase.json | 5 ++++- Node/quickstarts/uppercase-firestore/functions/package.json | 1 + 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/Node/quickstarts/uppercase-firestore/firebase.json b/Node/quickstarts/uppercase-firestore/firebase.json index ebdda5c7c6..bcf934355e 100644 --- a/Node/quickstarts/uppercase-firestore/firebase.json +++ b/Node/quickstarts/uppercase-firestore/firebase.json @@ -1,6 +1,9 @@ { "functions": { - "codebase": "uppercase-firestore" + "codebase": "uppercase-firestore", + "predeploy": [ + "npm --prefix \"$RESOURCE_DIR\" run compile" + ] }, "firestore": { "rules": "firestore.rules", diff --git a/Node/quickstarts/uppercase-firestore/functions/package.json b/Node/quickstarts/uppercase-firestore/functions/package.json index d1a5392163..adc6e368c8 100644 --- a/Node/quickstarts/uppercase-firestore/functions/package.json +++ b/Node/quickstarts/uppercase-firestore/functions/package.json @@ -22,6 +22,7 @@ "start": "npm run shell", "deploy": "firebase deploy --only functions", "logs": "firebase functions:log", + "compile": "tsc", "format": "prettier --write '**/*.ts'" }, "engines": {