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..adc6e368c8 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": "index.ts", "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..acebcda89b --- /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, + "noEmit": true + }, + "include": [ + "index.ts" + ] +}