101 lines
3.5 KiB
JavaScript
Raw Normal View History

2025-09-05 14:59:21 +08:00
import { defineNitroPreset, writeFile } from "nitropack/kit";
import { version as nitroVersion } from "nitropack/meta";
import { basename, join, relative } from "pathe";
import { genSafeVariableName } from "knitwork";
import { stringifyYAML } from "confbox";
import { updatePackageJSON, writeFirebaseConfig } from "./utils.mjs";
const firebase = defineNitroPreset(
{
entry: `./runtime/firebase-gen-{{ firebase.gen }}`,
commands: {
deploy: "npx firebase-tools deploy"
},
firebase: {
// we need this defined here so it's picked up by the template in firebase's entry
gen: Number.parseInt(process.env.NITRO_FIREBASE_GEN || "") || "default"
},
hooks: {
async compiled(nitro) {
await writeFirebaseConfig(nitro);
await updatePackageJSON(nitro);
},
"rollup:before": (nitro, rollupConfig) => {
const _gen = nitro.options.firebase?.gen;
if (!_gen || _gen === "default") {
nitro.logger.warn(
"Neither `firebase.gen` or `NITRO_FIREBASE_GEN` is set. Nitro will default to Cloud Functions 1st generation. It is recommended to set this to the latest generation (currently `2`). Set the version to remove this warning. See https://nitro.build/deploy/providers/firebase for more information."
);
nitro.options.firebase = { gen: 1 };
}
nitro.options.appConfig.nitro = nitro.options.appConfig.nitro || {};
nitro.options.appConfig.nitro.firebase = nitro.options.firebase;
const { serverFunctionName } = nitro.options.firebase;
if (serverFunctionName && serverFunctionName !== genSafeVariableName(serverFunctionName)) {
throw new Error(
`\`firebase.serverFunctionName\` must be a valid JS variable name: \`${serverFunctionName}\``
);
}
rollupConfig.plugins.unshift({
name: "nitro:firebase",
transform: (code, id) => {
if (basename(id).startsWith("firebase-gen-")) {
return {
code: code.replace(
/__firebaseServerFunctionName__/g,
serverFunctionName || "server"
),
map: null
};
}
}
});
}
}
},
{
name: "firebase",
url: import.meta.url
}
);
const firebaseAppHosting = defineNitroPreset(
{
extends: "node-server",
serveStatic: true,
hooks: {
async compiled(nitro) {
const serverEntry = join(nitro.options.output.serverDir, "index.mjs");
await writeFile(
join(nitro.options.rootDir, ".apphosting/bundle.yaml"),
stringifyYAML({
version: "v1",
runConfig: {
runCommand: `node ${relative(nitro.options.rootDir, serverEntry)}`,
...nitro.options.firebase?.appHosting
},
metadata: {
framework: nitro.options.framework.name || "nitropack",
frameworkVersion: nitro.options.framework.version || "2.x",
adapterPackageName: "nitropack",
adapterVersion: nitroVersion
},
outputFiles: {
serverApp: {
include: [
relative(nitro.options.rootDir, nitro.options.output.dir)
]
}
}
}),
true
);
}
}
},
{
name: "firebase-app-hosting",
stdName: "firebase_app_hosting",
url: import.meta.url
}
);
export default [firebase, firebaseAppHosting];