firebase_js_interop 0.0.9 copy "firebase_js_interop: ^0.0.9" to clipboard
firebase_js_interop: ^0.0.9 copied to clipboard

Platformweb

Wrappers and tools for composing Firebase Cloud Functions in the Dart language

Wrappers and tools for composing Firebase Cloud Functions in the Dart language

Features #

Legend #

🟥 No interop
🟧 Limited interop
🟨 Partial interop
🟩 Full interop

Admin #

Service Status Comment
App 🟩
App Check 🟥 App Check enforcement for callable functions is supported
Auth 🟥
Credential 🟥
Database 🟩
Eventarc 🟥
Extensions 🟥
Firestore 🟩
Functions 🟥
Installations 🟥
Messaging 🟧 Only message sending
Project Management 🟥
Remote Config 🟥
Security Rules 🟥
Storage 🟥

Functions #

Service Status
Alerts 🟥
Database 🟥
Eventarc 🟥
Firestore 🟩
HTTPS 🟩
Identity 🟩
PubSub 🟥
Remote Config 🟥
Scheduler 🟥
Storage 🟥
Tasks 🟥
Test Lab 🟥
Global Options 🟥
onInit 🟥
Logger 🟥

Future #

Interop with the following packages is planned, but not yet implemented:

Getting started #

Install the firebase tools

Usage #

Project structure #

Create the following dart/flutter packages:

Package Purpose
{app} Flutter app
{app}_core Base core package
{app}_core_flutter Core package for Flutter app
{app}_core_js_interop Core package for Cloud Functions
{app}_firebase/functions Firebase Cloud Functions

The purpose of the three core packages is as follows:

  • Flutter apps (besides the web platform) cannot import js_interop code
  • Transpiled dart2js code cannot transitively depend on Flutter

This means the base {app}_core package cannot depend on anything that depends on Flutter. Those dependencies should be used in {app}_core_flutter instead.

Create the Firebase project #

  1. Run firebase init in {app}_firebase
  2. Choose javascript as the language for Cloud Functions
  3. Say no to ESLint
  4. Say yes to installing dependencies with npm
  5. Delete the generated index.js file

Set up FCF for Dart #

Make the following modifications to files in {app}_firebase:

firebase.json

Add the following ignores

{
  "functions": [
    {
      "ignore": [
        "pubspec.*",
        "src",
        "tool",
        "analysis_options.yaml",
        ".dart_tool"
      ]
    }
  ]
}
copied to clipboard

functions/.gitignore

Add the following ignores

# Compiled JavaScript files
lib/**

# https://dart.dev/guides/libraries/private-files
# Created by `dart pub`
.dart_tool/
copied to clipboard

functions/package.json

{
  "scripts": {
    "lint": "dart analyze --fatal-infos",
    "build": "dart run tool/build.dart"
  },
  "main": "lib/index.js"
}
copied to clipboard

functions/pubspec.yaml

dependencies:
  {app}_core_js_interop:
    path: ../../{app}_core_js_interop
  firebase_js_interop: latest
copied to clipboard

functions/src/index.dart

This is where the Dart Cloud Functions code lives. See below for an example.

functions/tool/build.dart

This is what compiles index.dart into an index.js file that can run on Cloud Functions

import 'package:firebase_js_interop/build.dart';

void main() async {
  await buildCloudFunctions();
}

copied to clipboard

Writing models #

Create the base models in {app}_core, then augment them with json serialization in {app}_core_flutter and {app}_core_js_interop. See the example project for more details on how to use json serialization with both firebase_js_interop and cloud_firestore_odm.

Writing Cloud Functions #

Writing Cloud Functions in Dart is very similar to writing them in TypeScript:

import 'dart:js_interop';
import 'dart:js_interop_unsafe';

import 'package:firebase_js_interop/functions.dart';
import 'package:firebase_js_interop/node.dart';
import 'package:firebase_js_interop/express.dart' as express;

void main() {
  exports['helloWorld'] = FirebaseFunctions.https.onRequest(
    (Request request, express.Response response) {
      return response.send('Hello from Firebase!'.toJS);
    }.toJS,
  );
}

copied to clipboard

Make sure to return promises for async operations:

import 'dart:js_interop';
import 'dart:js_interop_unsafe';

import 'package:firebase_js_interop/functions.dart';
import 'package:firebase_js_interop/js.dart';
import 'package:firebase_js_interop/node.dart';
import 'package:firebase_js_interop/admin.dart';

void main() {
  exports['onMessageCreated'] = FirebaseFunctions.firestore.onDocumentCreated(
    '/chats/{chatId}/messages/{messageId}'.toJS,
    (FirestoreEvent<DocumentSnapshot> event) {
      return promise(() async {
        await Future.delayed(const Duration(seconds: 1));
      });
    }.toJS,
  );
}

copied to clipboard

Deploying Cloud Functions #

  1. dart run tool/build.dart
  2. firebase deploy --only functions

The compiled JS will also work in the Firebase emulators

Additional information #

See firebase_rules for writing Firebase security rules in Dart.

Contributing #

There are many unimplemented features. Please feel free to contribute if any necessary components are missing.

See CONTRIBUTING.md for details

10
likes
160
points
80
downloads

Publisher

verified publisheriodesignteam.com

Weekly Downloads

2024.09.29 - 2025.04.13

Wrappers and tools for composing Firebase Cloud Functions in the Dart language

Repository (GitHub)
Contributing

Documentation

API reference

License

BSD-3-Clause (license)

Dependencies

json_annotation, node_preamble, path

More

Packages that depend on firebase_js_interop