firebase_js_interop 0.0.2
firebase_js_interop: ^0.0.2 copied to clipboard
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 | π₯ | |
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 | π₯ |
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 #
Run firebase init
in {app}_firebase
. Choose javascript as the language for Cloud Functions.
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"
]
}
]
}
functions/.gitignore
# Compiled JavaScript files
lib/**
# https://dart.cn/guides/libraries/private-files
# Created by `dart pub`
.dart_tool/
functions/package.json
{
"main": "lib/index.js"
}
functions/pubspec.yaml
dependencies:
{app}_core_js_interop:
path: ../../{app}_core_js_interop
firebase_js_interop: latest
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();
}
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,
);
}
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,
);
}
Deploying Cloud Functions #
dart run tool/build.dart
firebase deploy --only functions
The compiled JS will also work in the Firebase emulators
Contributing #
There are many unimplemented features. Please feel free to contribute if any necessary components are missing.
See CONTRIBUTING.md for details