CommunityCodierung & Entwicklunggithub.com

Extension zu Functions Codebase & npm-Paket-Migration

Wandelt eine installierte Firebase Extension (oder deren Quellcode) in eine eigenständige Cloud Functions for Firebase-Codebasis oder ein veröffentlichbares npm-Paket um – inklusive V1-zu-V2-Trigger-Upgrades, Lifecycle-Hooks und deklarativer Sicherheit.

Was ist Extension zu Functions Codebase & npm-Paket-Migration?

Diese Fähigkeit automatisiert die Migration einer Firebase Extension in eine lokale Cloud Functions-Codebasis (`functions/src/`) oder ein wiederverwendbares npm-Paket, das V2-Funktionen exportiert. Sie nutzt native Cloud Functions-Features wie deklaratives IAM (`requiresRole`), Parameterized Config (`defineString` usw.) und SDK-Lifecycle-Hooks (`onInit`, `afterFirstDeploy`). V1-Trigger werden mithilfe des Destructuring Compatibility Shims auf V2 aktualisiert (z. B. `onDocumentWritten` statt `onDocumentWritten` der ersten Generation). Die Fähigkeit behandelt auch die Konvertierung von Lifecycle-Events, die Konfiguration von `package.json` mit Peer-Dependencies und die Generierung einer README mit Export-Anweisungen. Sie ist für Entwickler gedacht, die Firebase Extensions entweder direkt in ihre App integrieren oder als Open-Source-Paket veröffentlichen möchten, wobei sie bewährte Verfahren wie die Einschränkung globaler Parameterzugriffe (`onInit`) und Concurrency-Kostenkontrolle (`cpu: 'gcf_gen1'`) einhält.

Funktioniert mit~Claude Code~Codex CLI~Cursor
npx skills add https://github.com/momabrouk18-eng/Website/tree/HEAD/.agents/skills/extension-to-functions-codebase

Installed? Explore more Codierung & Entwicklung skills: steipete/bluebubbles, steipete/eightctl, steipete/blucli · View all 6 →

In Ihrer bevorzugten KI fragen

Öffnet einen neuen Chat, in dem dieser Agent-Skill bereits geladen ist.

Dokumentation

Was macht Extension zu Functions Codebase & npm-Paket-Migration?

Überblick

Wandelt eine Firebase Extension um in entweder:

  1. Eine lokale Cloud Functions-Codebasis (functions/src/ für die App-Integration).
  2. Ein veröffentlichbares npm-Paket (wiederverwendbares Open-Source-Paket, das V2-Funktionen exportiert).

Nutzt native Cloud Functions-Features (deklaratives IAM, parametrisierte Konfiguration, SDK-Lifecycle-Hooks) und modernisiert Trigger der 1. Generation auf die 2. Generation mithilfe des Destructuring Compatibility Shims.


Ziel-Migrations-Workflows

  • Ziel A: Lokale Functions-Codebasis (Endbenutzer-App-Integration)

    • Ausgabe: Code unter functions/src/. Konfiguration in .env.
    • Bereitstellung: firebase deploy --only functions.
  • Ziel B: Veröffentlichbares npm-Paket / Teilbares Paket

    • Ausgabe: Wiederverwendbares npm-Paket, das V2-Funktionen exportiert.
    • Konfiguration: package.json mit exports-Map, engines: { "node": ">=22" } und peerDependencies: { "firebase-functions": ">=6.0.0" }.
    • Verwendung: Nutzer installieren das Paket und exportieren die Funktionen erneut in index.ts (export * from "<paket-name>").

Kernregeln & Einschränkungen

1. Deklaratives IAM & APIs (Null-lokaler-Overhead)

Native SDK-Deklarationen anstelle von manuellen gcloud-Skripten oder Konsolenanweisungen verwenden:

  • requiresRole("roles/...") für erforderliche GCP-IAM-Berechtigungen.
  • requiresAPI("service.googleapis.com", "Beschreibung") für Google-APIs.

2. Einschränkung des globalen Parameterzugriffs

  • .value() niemals auf Modulebene aufrufen.
  • Globale SDK-Instanzen innerhalb von onInit() oder Lazy-Gettern initialisieren:
    import { defineString } from "firebase-functions/params";
    import { onInit } from "firebase-functions/v2";
    
    const dataset = defineString("DATASET_ID");
    let client: BigQuery;
    
    onInit(() => {
      client = new BigQuery({ datasetId: dataset.value() });
    });
    

3. V2-Concurrency & Kostenparität

V2 aktiviert Concurrency (bis zu 80 Anfragen). Um die V1-Einzel-Concurrency-Preisstruktur beizubehalten, setze cpu: "gcf_gen1".


Schritt-für-Schritt-Migrationsausführung

Schritt 1: Extension-Ressourcen inventarisieren

  1. extension.yaml:
    • params → defineString, defineInt, defineBoolean, defineSecret.
    • apis → requiresAPI(...).
    • roles → requiresRole(...).
    • lifecycleEvents → afterFirstDeploy & afterRedeploy.
    • resources → Upgrade der Trigger der 1. Generation auf die 2. Generation (onDocumentWritten, onTaskDispatched, onRequest).
  2. Dateien & Skripte: devDependencies, Test-Framework (jest) und Testskripte beibehalten.

Schritt 2: package.json konfigurieren

  • Setze name: "<paket-name>", engines: { "node": ">=22" }.
  • Setze peerDependencies:
    "peerDependencies": {
      "firebase-admin": "^11.0.0 || ^12.0.0",
      "firebase-functions": ">=6.0.0"
    }
    
  • Konfiguriere die exports-Map für ESM/CommonJS und TypeScript-Deklarationen (lib/index.js, lib/index.d.ts).

Schritt 3: Trigger von V1 auf V2 upgraden

  • Firestore: onDocumentWritten aus firebase-functions/v2/firestore verwenden.
  • Tasks: onTaskDispatched aus firebase-functions/v2/tasks verwenden. EXT_INSTANCE_ID beim Einreihen von Tasks entfernen.
  • HTTP: onRequest aus firebase-functions/v2/https verwenden.
  • Destructuring Compatibility Shim anwenden ({ change, context }, { snapshot, context }), wo Legacy-Handler der 1. Generation (change, context) erwarten.

Schritt 4: Lifecycle-Events konvertieren

Mapping der Extension-Lifecycle-Events auf SDK-Lifecycle-Hooks in src/index.ts:

  • onInstall → afterFirstDeploy({ task: { function: "initTask" } })
  • onUpdate / onConfigure → afterRedeploy({ task: { function: "setupTask" } })

Schritt 5: Paket-README & Exportanweisungen

Erzeuge README.md mit:

  1. Installationsanleitung (npm install).
  2. Re-Export-Ausschnitt (export * from "<paket-name>").
  3. Referenztabelle für parametrisierte Konfiguration .env.
  4. Vergleichstabelle „Was sich geändert hat“ (Extension vs. Paket).

Hinweis: NIEMALS npm publish ausführen.

Individual skills in this repo

This repo contains 3 individual skills — each has its own dedicated page.

Verwandte Skills