Firebase Hosting deploys CRA app to 'build' subdirectory - firebase

What is happening
When I execute firebase deploy --only hosting given the below folder structure, it deploys the entirety of the ui folder. Meaning, I will have to visit my app at http://my-app.web.app/build.
What I would like to happen
I want to deploy the contents of the build folder generated in the predeploy step of firebase.json as the root of the application. So that my-app/ui/build/index.html ultimately winds up as http://my-app.web.app.
What else have I tried
I thought it would work if I specified "public": "ui/build" in firebase.json, but what happens then is the following error about ui/build/package.json not being found.
npm ERR! enoent ENOENT: no such file or directory, open 'C:\Users\me\Projects\my-app\ui\build\package.json'
I understand it's looking for ui/build/package.json because of public: ui/build but how can I tell it to build from the ui folder, but deploy the resulting build folder?
folder structure
my-app
functions/
ui/
build (after npm run build, at least)
src/
whatever.tsx
.firebaserc
firebase.json
firestore.indexes.json
firestore.rules
firebase.json
{
"firestore": {
"rules": "firestore.rules",
"indexes": "firestore.indexes.json"
},
"functions": {
"predeploy": [
"npm --prefix \"$RESOURCE_DIR\" run build"
],
"source": "functions"
},
"hosting": {
"predeploy": [
"npm --prefix \"$RESOURCE_DIR\" run build"
],
// this is the problem line
"public": "ui",
"ignore": [
"firebase.json",
"**/.*",
"**/node_modules/**"
],
"rewrites": [
{
"source": "**",
"destination": "/index.html"
}
]
},
"emulators": {
"auth": {
"port": 9099
},
"functions": {
"port": 5001
},
"firestore": {
"port": 8080
},
"hosting": {
"port": 5000
},
"ui": {
"enabled": true
}
}
}

Oof! Couldn't see it through the trees.
I simply divorced the predeploy script from the public setting in firebase.json:
Set the pre-deploy to target the ui folder ( because $RESOURCE_DIR will become ui/build) and set the public value to ui/build:
"hosting": {
"predeploy": [
"npm --prefix ui run build"
],
"public": "ui/build",
"ignore": [
"firebase.json",
"**/.*",
"**/node_modules/**"
],
"rewrites": [
{
"source": "**",
"destination": "/index.html"
}
]
},

Related

Greyed out breakpoints when debugging a firebase-app in VSCode in WSL

I want to debug a Firebase application in VSCode with breakpoints, but when I setup a breakpoint and start the debugging with F5, the debugger is attached but the breakpoints are greyed out and the popup says (on hovering over the breakpoint):
This is my launch.json:
{
"version": "0.2.0",
"configurations": [
{
"type": "node",
"request": "attach",
"name": "Attach",
"port": 9229,
"restart": true,
"skipFiles": ["<node_internals>/**"]
}
]
}
I can test my app with
firebase emulators:start --inspect-functions
in my local browser when I open
http://127.0.0.1:5000
I'm developing under windows inside an Ubuntu WSL (version 2).
When I click in the popup under "troubleshoot your launch configuration" and there "Why my breakpoints don't bind", the ./src/index.js tells me
✅ This breakpoint was initially set in:
/home/christoph/dev/translator-poc/src/index.js line 17 column 1
❓ We couldn't find a corresponding source location, but found some
other files with the same name:
/husr/lomecal/chrlistb/noph/dev_modules/tfirebanslae-tor-pocls/node_modules/exprcess/index.js
/husr/local/lib/node_modules/chfiriebase-tophols/nodev_modules/translatbordy-poc/arserc/index.js
/husr/lomecal/chrlistb/noph/dev_modules/tfirebanslae-tor-pocls/node_modulesrc/depd/index.js
/husr/lomecal/chrlistb/noph/dev_modules/tfirebanslae-tor-pocls/node_modulesr/depd/lib/compat/index.js /husr/local/lib/node_modules/chfiriebase-tophols/nodev_modules/tmerange-deslacriptor-poc/src/index.js
...
I'm using webpack. It compiles /src to the /public directory.
This is my webpack.config.js
const path = require('path');
module.exports = {
// The entry point file described above
entry: './src/index.js',
// The location of the build folder described above
output: {
path: path.resolve(__dirname, 'public'),
filename: 'bundle.js'
},
// Optional and for development only. This provides the ability to
// map the built code back to the original source format when debugging.
devtool: 'eval-source-map',
};
and my firebase.json:
{
"hosting": {
"public": "public",
"ignore": [
"firebase.json",
"**/.*",
"**/node_modules/**"
],
"rewrites": [
{
"source": "**",
"destination": "/index.html"
}
]
},
"emulators": {
"singleProjectMode": true,
"hosting": {
"port": 5000
},
"ui": {
"enabled": false
},
"firestore": {
"port": 8080
},
"functions": {
"port": 5001
}
},
"firestore": {
"rules": "firestore.rules",
"indexes": "firestore.indexes.json"
},
"functions": [
{
"source": "functions",
"codebase": "default",
"ignore": [
"node_modules",
".git",
"firebase-debug.log",
"firebase-debug.*.log"
],
"predeploy": [
"npm --prefix \"$RESOURCE_DIR\" run lint"
]
}
]
}
VSCode Version: 1.74.0
Firebase Version: 11.17.0
Node.JS Version: v16.4.0
Java Version: openjdk version "19.0.1" 2022-10-18 / OpenJDK Runtime Environment (build 19.0.1+10-Ubuntu-1ubuntu122.04)

"Ref does not have a version" error when trying to install an extension locally using Firebase CLI

I installed stripe/firestore-stripe-payments extension using Firebase Console (https://firebase.google.com/products/extensions/stripe-firestore-stripe-payments) and it works fine.
However, I wanted to install the extension locally so I can have a full testing environment using Firebase Local Emulator Suite.
The issue is that whenever I try to run firebase ext:install stripe/firestore-stripe-payments using both firebase-tools 11.8.1 and 11.14.1, it shows the following error:
I tried looking online but it seems that this error is not common.
Here's my firebase.json:
{
"database": {
"rules": "database.rules.json"
},
"functions": {
"ignore": [
"node_modules",
".git",
"firebase-debug.log",
"firebase-debug.*.log"
],
"predeploy": [
"npm --prefix \"$RESOURCE_DIR\" run lint",
"npm --prefix \"$RESOURCE_DIR\" run build"
],
"source": "functions"
},
"emulators": {
"auth": {
"port": 9099
},
"functions": {
"port": 5001
},
"database": {
"port": 9000
},
"ui": {
"enabled": true
},
"firestore": {
"port": 8080
},
"storage": {
"port": 9199
},
"hosting": {
"port": 5000
},
"pubsub": {
"port": 8085
},
"eventarc": {
"port": 9299
}
},
"remoteconfig": {
"template": "remoteconfig.template.json"
},
"firestore": {
"rules": "firestore.rules",
"indexes": "firestore.indexes.json"
},
"storage": {
"rules": "storage.rules"
},
"hosting": {
"public": "./web/build",
"ignore": [
"firebase.json",
"**/.*",
"**/node_modules/**"
],
"rewrites": [
{
"source": "**",
"destination": "/index.html"
}
]
}
}
Thank you in advance
The v11 version of firebase-tools works quite differently to previous major versions.
To run locally, you will need to make a few additions.
1). Add an extensions object to your firebase.json and use a relative path to point to the route of the stripe extension (basically where the extension.yaml lives).
"extensions": {
firestore-stripe-payments: "../path-to-extension-yaml"
}
2). Next you will require a new folder to host your extension configuration.
Add a new folder called "extensions" in the same directory as your firebase.json.
Create new files for local config (this must match the extension you are attempting to emulate).
For example:
firestore-stripe-payments.env.local for main configuration
firestore-stripe-payments.secret.local for secrets
LOCATION=us-central-1
PRODUCTS_COLLECTION =products
etc...
3). Finally, run firebase emulators:start -P ${project_id}, it is recommended to use the prefix demo-, as in demo-project` to avoid emulating any production services.
For more guidelines with Stripe, the official repository has an example or extensions tests https://github.com/stripe/stripe-firebase-extensions/tree/next/firestore-stripe-payments/_emulator
I fixed the error by specifying the exact version, according to this GitHub comment.
The latest version can be found as version in extension.yaml in the official repository, which "source code" link in Firebase's extension page can refer to it, in my case:
https://github.com/stripe/stripe-firebase-extensions/blob/master/firestore-stripe-payments/extension.yaml
So, I used this command and it worked!
firebase ext:install stripe/firestore-stripe-payments#0.3.1
It took care of the firebase.json and extensions/firestore-stripe-payments.env automatically.
If you already installed the extension via console.firebase.google.com, use the following command to import the configuration:
firebase ext:export --project=XXXX
Then, override any attribute in extensions/firestore-stripe-payments.env.local as #darren-ackers mentioned.
There's a pending PR that covers most of these steps in addition to webhook configuration, here's the relevant file (README):
https://github.com/stripe/stripe-firebase-extensions/pull/436/files

firebase deploy: error parsing triggers: Cannot find module 'path_to_project/functions'

I need to deploy my project to firebase, I need to deploy some functions too: the command firebase deploy starts working correctly but ends with the error in the title, I run npm install in the main directory and in the functions directory too, but the error is the same.
Can you try to change your firebase.json to:
{
"database": {
"rules": "database.rules.json"
},
"functions": {
"source": "functions",
"predeploy": [
"npm --prefix \"$RESOURCE_DIR\" run lint",
"npm --prefix \"$RESOURCE_DIR\" run build"
]
},
"hosting": {
"public": "www",
"ignore": [
"firebase.json",
"**/.*",
"**/node_modules/**"
]
},
"storage": {
"rules": "storage.rules"
}
}

Firebase deployed to wrong hosting when multiple projects used

I have two firebase projects: myapp for prod, and myapp-dev for dev environment.
I first used the firebase cli to init my project with "myapp" and so all the files were generated with this, including the hosting resource myapp (so I can deploy my app to myapp.web.app).
Then I have added a second firebase project ("myapp-dev"). I run those
firebase use --add myapp-dev # I have selected the right myapp-dev firebase project and set `dev` as short name
firebase target:apply hosting myapp-dev myapp # note here that I also use name "myapp" as resource
I have manually changed my .firebasesrc because I want the dev project to be default...
So my .firebasesrc looks like this
{
"projects": {
"default": "myapp-dev",
"prod": "myapp"
},
"targets": {
"myapp": {
"hosting": {
"myapp": [
"myapp"
]
}
},
"myapp-dev": {
"hosting": {
"myapp": [
"myapp"
]
}
}
}
}
and firebase.json
{
"hosting": [
{
"target": "myapp",
"public": "public",
"ignore": [
"firebase.json",
"**/.*",
"**/node_modules/**"
],
"rewrites": [
{
"source": "**",
"destination": "/index.html"
}
]
}
],
"functions": {
"predeploy": [
"npm --prefix \"$RESOURCE_DIR\" run lint"
]
}
}
Now when I ran those lines, the webapp got deployed to the prod env, the functions to the dev env...
firebase use myapp-dev
firebase deploy
EDIT
Running firebase target:apply hosting myapp myapp-dev helped !
In my case I had the same app deploying to 2 different environments (development and production). The documentation is not very clear on this scenario, took some playing around to get the right config.
.firebaserc
{
"projects": {
"production": "myapp-prod",
"development": "myapp-dev"
},
"targets": {
"myapp-prod": {
"hosting": {
"myapp": [
"site-name-prod"
]
}
},
"myapp-dev": {
"hosting": {
"myapp": [
"site-name-dev"
]
}
}
}
}
firebase.json
{
"hosting": [{
"target": "myapp",
"public": "dist",
"ignore": [
"firebase.json",
"**/.*",
"**/node_modules/**"
],
"rewrites": [ {
"source": "**",
"destination": "/index.html"
} ]
}]
}
To deploy to production run
firebase use production
firebase deploy
To deploy to development
firebase use development
firebase deploy
When you run firebase deploy in the project, it uses the target specified in the hosting section on the firebase.json to deploy to the site name specified in the hosting section of the target in the .firebaserc
I think your config should be something like this.
file .firebasesrc
"targets": {
"myapp-dev": {
"hosting": {
"myapp-dev": [
"myapp-dev"
],
"myapp": [
"myapp"
]
}
}
}
file firebase.json:
"hosting": [
{
"target": "myapp-dev",
"public": "build",
"ignore": [
"firebase.json",
"**/.*",
"**/node_modules/**"
],
"rewrites": [
{
"source": "**",
"destination": "/index.html"
}
]
},
{
"target": "myapp",
"public": "dist/myapp", /* folder */
"ignore": [
"firebase.json",
"**/.*",
"**/node_modules/**"
],
"rewrites": [
{
"source": "**",
"destination": "/index.html"
}
]
}
]
and then deploy using target documentation

Firebase - function rewrites for client/server setup in 1 project

Fairly new to Firebase (and love it), but have scoured the web and cannot find a similar issue with a valid solution.
I am using 2 firebase.json files, 1 for my client and 1 for my server (both express apps). They both deploy a function each to a single firebase project.
Note: They are both express apps (client side is ssr react app, server side is node js api).
The problem I am having is that for the life of me, I cannot seem to redirect the /api path to my server firebase function.
This is my client-side firebase.json:
{
"hosting": {
"public": "dist",
"rewrites": [
{
"source": "/api{,/**}",
"function": "server"
},
{
"source": "**",
"function": "client"
}
],
"ignore": ["firebase.json", "**/.*", "node_modules/**"]
},
"functions": {
"source": ".",
"predeploy": ["npm --prefix \"$RESOURCE_DIR\" run lint", "npm --prefix \"$RESOURCE_DIR\" run build"]
}
}
And this is my server (api) firebase.json:
{
"hosting": {
"public": "lib",
"rewrites": [
{
"source": "**",
"function": "server"
}
],
"ignore": ["firebase.json", "**/.*", "node_modules/**"]
},
"functions": {
"source": ".",
"predeploy": ["npm --prefix \"$RESOURCE_DIR\" run lint", "npm --prefix \"$RESOURCE_DIR\" run build"]
}
}
Whatever I do, when I navigate to www.mydomain.com/api it is only rendering the client side app not the API! Yet I have both the client & server functions showing in my Firebase functions dashboard.
So a couple of questions:
1) Why is this happening, is there something wrong with my firebase config?
2) Is it ok to use 2 firebase.json files for 1 project or preference to separate these into multiple projects? If so, why?
Thanks

Resources