• Stars
    star
    255
  • Rank 159,729 (Top 4 %)
  • Language
    TypeScript
  • License
    MIT License
  • Created about 6 years ago
  • Updated over 1 year ago

Reviews

There are no reviews yet. Be the first to send feedback to the community and the maintainers!

Repository Details

Cypress plugin and custom commands for testing Firebase projects

cypress-firebase

Cypress plugin and custom commands for testing Firebase projects

NPM version NPM downloads Build Status Coverage License Code Style semantic-release

What?

0 dependency plugin which adds custom cypress commands for interactions with Firebase:

If you are interested in what drove the need for this checkout the why section

Usage

Pre-Setup

  1. If you do not already have it installed, install Cypress and add it to your package file: npm i --save-dev cypress or yarn add -D cypress
  2. Make sure you have a cypress folder containing Cypress tests

Setup

  1. Make Google Cloud project name available to cypress-firebase to pass to firebase-admin on initialization by doing one of the following:
    • suggested Set GCLOUD_PROJECT environment variable to match the Google Project you would like to use. This needs to be on the process running cypress, so it should be before cypress open or cypress run in npm scripts. cross-env is a helpful way to do this to support multiple platforms and is how it is done in examples.
    • Pass projectId into cypressFirebasePlugin options when initializing (see comment in next step)
  2. Generate and download a service account as described in the firebase-admin setup documentation. Save this to a local file within the project which you confirm is within your .gitignore - often ./serviceAccount.json. Make sure YOU DO NOT COMMIT THIS FILE - it is sensitive and will give others admin access to your project.
  3. Set the following config in your cypress.config.js or cypress.config.ts

With Firebase Web SDK versions up to 8

import admin from 'firebase-admin';
import { defineConfig } from 'cypress';
import { plugin as cypressFirebasePlugin } from 'cypress-firebase';

export default defineConfig({
  e2e: {
    baseUrl: 'http://localhost:3000',
    // NOTE: Add "supportFile" setting if separate location is used
    setupNodeEvents(on, config) {
      // e2e testing node events setup code
      return cypressFirebasePlugin(on, config, admin,{
          // Here is where you can pass special options. 
          // If you have not set the GCLOUD_PROJECT environment variable, give the projectId here, like so:
          //    projectId: 'some-project',
          // if your databaseURL is not just your projectId plus ".firebaseio.com", then you _must_ give it here, like so:
          //    databaseURL: 'some-project-default-rtdb.europe-west1.firebasedatabase.app',
      });
    },
  },
});

or if you are not using TS, then within cypress.config.js:

const { defineConfig } = require('cypress');
const cypressFirebasePlugin = require('cypress-firebase').plugin;
const admin = require('firebase-admin');

module.exports = defineConfig({
  e2e: {
    baseUrl: 'http://localhost:3000',
    // NOTE: Make supportFile exists if separate location is provided
    setupNodeEvents(on, config) {
      // e2e testing node events setup code
      return cypressFirebasePlugin(on, config, admin,{
          // Here is where you can pass special options. 
          // If you have not set the GCLOUD_PROJECT environment variable, give the projectId here, like so:
          //    projectId: 'some-project',
          // if your databaseURL is not just your projectId plus ".firebaseio.com", then you _must_ give it here, like so:
          //    databaseURL: 'some-project-default-rtdb.europe-west1.firebasedatabase.app',
      });
    },
  },
});
  1. Add the following your custom commands file (cypress/support/e2e.js or cypress/support/e2e.ts):

    import firebase from 'firebase/app';
    import 'firebase/auth';
    import 'firebase/database';
    import 'firebase/firestore';
    import { attachCustomCommands } from 'cypress-firebase';
    
    const fbConfig = {
      // Your config from Firebase Console
    };
    
    firebase.initializeApp(fbConfig);
    
    attachCustomCommands({ Cypress, cy, firebase });

    With Firebase Web SDK version 9

    import firebase from 'firebase/compat/app';
    import 'firebase/compat/auth';
    import 'firebase/compat/database';
    import 'firebase/compat/firestore';
    import { attachCustomCommands } from 'cypress-firebase';
    
    const fbConfig = {
      // Your config from Firebase Console
    };
    
    firebase.initializeApp(fbConfig);
    
    attachCustomCommands({ Cypress, cy, firebase });
  2. To confirm things are working, create a new test file (cypress/integration/examples/test_hello_world.cy.js) adding a test that uses the cypress-firebase custom command (cy.callFirestore):

    describe('Some Test', () => {
      it('Adds document to test_hello_world collection of Firestore', () => {
        cy.callFirestore('add', 'test_hello_world', { some: 'value' });
      });
    });
  3. From the root of your project, start Cypress with the command $(npm bin)/cypress open. In the Cypress window, click your new test (test_hello_world.js) to run it.

  4. Look in your Firestore instance and see the test_hello_world collection to confirm that a document was added.

  5. Pat yourself on the back, you are all setup to access Firebase/Firestore from within your tests!

Auth

  1. Go to Authentication page of the Firebase Console and select an existing user to use as the testing account or create a new user. This will be the account which you use to login while running tests.

  2. Get the UID of the account you have selected, we will call this UID TEST_UID

  3. Set the UID of the user you created earlier to the Cypress environment. You can do this using a number of methods:

    • Adding CYPRESS_TEST_UID to a .env file which is gitignored

    • Adding TEST_UID to cypress.env.json (make sure you place this within your .gitignore)

    • Adding as part of your npm script to run tests with a tool such as cross-env here:

      "test": "cross-env CYPRESS_TEST_UID=your-uid cypress open"
  4. Call cy.login() with the before or beforeEach sections of your tests

Running

  1. Start your local dev server (usually npm start) - for faster alternative checkout the test built version section
  2. Open cypress test running by running npm run test:open in another terminal window

Considerations For CI

  1. Add the following environment variables in your CI:

    • CYPRESS_TEST_UID - UID of your test user
    • SERVICE_ACCOUNT - service account object

Named app support

When using a custom app name or running more than one firebase instance in your app:

const namedApp = firebase.initializeApp(fbConfig, 'app_name');

attachCustomCommands({ Cypress, cy, firebase, app: namedApp });

Docs

Custom Cypress Commands

Table of Contents

cy.login

Login to Firebase using custom auth token.

To specify a tenant ID, either pass the ID as a parameter to cy.login, or set it as environment variable TEST_TENANT_ID. Read more about Firebase multi-tenancy.

Examples

Loading TEST_UID automatically from Cypress env:

cy.login();

Passing a UID

const uid = '123SomeUid';
cy.login(uid);

Passing a tenant ID

const uid = '123SomeUid';
const tenantId = '123SomeTenantId';
cy.login(uid, undefined, tenantId);

cy.logout

Log out of Firebase instance

Examples
cy.logout();

cy.callRtdb

Call Real Time Database path with some specified action such as set, update and remove

Parameters
  • action String The action type to call with (set, push, update, remove)
  • actionPath String Path within RTDB that action should be applied
  • options object Options
    • options.limitToFirst number|boolean Limit to the first <num> results. If true is passed than query is limited to last 1 item.
    • options.limitToLast number|boolean Limit to the last <num> results. If true is passed than query is limited to last 1 item.
    • options.orderByKey boolean Order by key name
    • options.orderByValue boolean Order by primitive value
    • options.orderByChild string Select a child key by which to order results
    • options.equalTo string Restrict results to <val> (based on specified ordering)
    • options.startAt string Start results at <val> (based on specified ordering)
    • options.endAt string End results at <val> (based on specified ordering)
Examples

Set data

const fakeProject = { some: 'data' };
cy.callRtdb('set', 'projects/ABC123', fakeProject);

Set Data With Meta

const fakeProject = { some: 'data' };
// Adds createdAt and createdBy (current user's uid) on data
cy.callRtdb('set', 'projects/ABC123', fakeProject, { withMeta: true });

Set Data With Timestamps

import firebase from 'firebase/app';
import 'firebase/database';

const fakeProject = {
  some: 'data',
  createdAt: firebase.database.ServerValue.TIMESTAMP,
};
cy.callRtdb('set', 'projects/ABC123', fakeProject);

With Firebase Web SDK version 9

import firebase from 'firebase/compat/app';
import 'firebase/compat/database';

const fakeProject = {
  some: 'data',
  createdAt: firebase.database.ServerValue.TIMESTAMP,
};
cy.callRtdb('set', 'projects/ABC123', fakeProject);

Delete Data

// Delete document
cy.callRtdb('delete', 'projects/ABC123');
// Delete filtered collection
cy.callRtdb('delete', 'projects', { where: ['name', '==', 'Test Project'] });
// Delete whole collection - BE CAREFUL!!
cy.callRtdb('delete', 'projectsToDelete');

Get/Verify Data

cy.callRtdb('get', 'projects/ABC123').then((project) => {
  // Confirm new data has users uid
  cy.wrap(project).its('createdBy').should('equal', Cypress.env('TEST_UID'));
});

Other Args

const opts = { args: ['-d'] };
const fakeProject = { some: 'data' };
cy.callRtdb('update', 'project/test-project', fakeProject, opts);

cy.callFirestore

Call Firestore instance with some specified action. Authentication is through serviceAccount.json since it is at the base level.

Parameters
  • action String The action type to call with (set, push, update, delete)
  • actionPath String Path within Firestore that action should be applied
  • dataOrOptions String|Object Data for write actions or options for get action
  • options Object Options
    • options.withMeta boolean Whether or not to include createdAt and createdBy
    • options.merge boolean Merge data during set
    • options.batchSize number Size of batch to use while deleting
    • options.where Array Filter documents by the specified field and the value should satisfy
    • the relation constraint provided
    • options.orderBy string|Array Order documents
    • options.limit number Limit to n number of documents
    • options.limitToLast number Limit to last n number of documents
    • options.statics admin.firestore Firestore statics (i.e. admin.firestore). This should only be needed during testing due to @firebase/testing not containing statics
Examples

Basic

cy.callFirestore('set', 'project/test-project', 'fakeProject.json');

Set Data With Server Timestamps

import firebase from 'firebase/app';
import 'firebase/firestore';

const fakeProject = {
  some: 'data',
  // Use new firebase.firestore.Timestamp.now in place of serverTimestamp()
  createdAt: firebase.firestore.Timestamp.now(),
  // Or use fromDate if you would like to specify a date
  // createdAt: firebase.firestore.Timestamp.fromDate(new Date())
};
cy.callFirestore('set', 'projects/ABC123', fakeProject);

With Firebase Web SDK version 9

import firebase from 'firebase/compat/app';
import 'firebase/compat/firestore';

const fakeProject = {
  some: 'data',
  // Use new firebase.firestore.Timestamp.now in place of serverTimestamp()
  createdAt: firebase.firestore.Timestamp.now(),
  // Or use fromDate if you would like to specify a date
  // createdAt: firebase.firestore.Timestamp.fromDate(new Date())
};
cy.callFirestore('set', 'projects/ABC123', fakeProject);

Full

describe('Test firestore', () => {
  const TEST_UID = Cypress.env('TEST_UID');
  const mockAge = 8;

  beforeEach(() => {
    cy.visit('/');
    cy.callFirestore('delete', 'testCollection');
  });

  it('read/write test', () => {
    cy.log('Starting test');

    cy.callFirestore('set', `testCollection/${TEST_UID}`, {
      name: 'axa',
      age: 8,
    });
    cy.callFirestore('get', `testCollection/${TEST_UID}`).then((r) => {
      cy.log('get returned: ', r);
      cy.wrap(r).its('data.age').should('equal', mockAge);
    });
    cy.log('Ended test');
  });
});

Plugin

Plugin attaches cypress tasks, which are called by custom commands, and initializes firebase-admin instance. By default cypress-firebase internally initializes firebase-admin using GCLOUD_PROJECT environment variable for project identification and application-default credentials (set by providing path to service account in GOOGLE_APPLICATION_CREDENTIALS environment variable) matching Google documentation. This default functionality can be overriden by passing a forth argument to the plugin - this argument is passed directly into the firebase-admin instance as AppOptions on init which means any other config such as databaseURL, credential, or databaseAuthVariableOverride can be included.

import admin from 'firebase-admin';
import { defineConfig } from 'cypress';
import { plugin as cypressFirebasePlugin } from 'cypress-firebase';

const cypressConfig = defineConfig({
  e2e: {
    baseUrl: 'http://localhost:3000',
    // NOTE: Make supportFile exists if separate location is provided
    setupNodeEvents(on, config) {
      // e2e testing node events setup code
      return cypressFirebasePlugin(on, config, admin);
      // NOTE: If not setting GCLOUD_PROJECT env variable, project can be set like so:
      // return cypressFirebasePlugin(on, config, admin, { projectId: 'some-project' });
    },
  },
});

export default cypressConfig;

Recipes

Using Emulators

  1. Install cross-env for cross system environment variable support: npm i --save-dev cross-env

  2. Add the following to the scripts section of your package.json:

    "emulators": "firebase emulators:start --only database,firestore",
    "test": "cypress run",
    "test:open": "cypress open",
    "test:emulate": "cross-env FIREBASE_AUTH_EMULATOR_HOST=\"localhost:$(cat firebase.json | jq .emulators.auth.port)\" FIREBASE_DATABASE_EMULATOR_HOST=\"localhost:$(cat firebase.json | jq .emulators.database.port)\" FIRESTORE_EMULATOR_HOST=\"localhost:$(cat firebase.json | jq .emulators.firestore.port)\" yarn test:open"
  3. If not already set by firebase init, add emulator ports to firebase.json:

    "emulators": {
      "database": {
        "port": 9000
      },
      "firestore": {
        "port": 8080
      },
      "auth": {
       "port": 9099
      }
    }
  4. Modify your application code to connect to the emulators (where your code calls firebase.initializeApp(...)), updating the localhost ports as appropriate from the emulators values in the previous step:

    const shouldUseEmulator = window.location.hostname === 'localhost'; // or other logic to determine when to use
    // Emulate RTDB
    if (shouldUseEmulator) {
      fbConfig.databaseURL = `http://localhost:9000?ns=${fbConfig.projectId}`;
      console.debug(`Using RTDB emulator: ${fbConfig.databaseURL}`);
    }
    
    // Initialize Firebase instance
    firebase.initializeApp(fbConfig);
    
    const firestoreSettings = {};
    // Pass long polling setting to Firestore when running in Cypress
    if (window.Cypress) {
      // Needed for Firestore support in Cypress (see https://github.com/cypress-io/cypress/issues/6350)
      firestoreSettings.experimentalForceLongPolling = true;
    }
    
    // Emulate Firestore
    if (shouldUseEmulator) {
      firestoreSettings.host = 'localhost:8080';
      firestoreSettings.ssl = false;
      console.debug(`Using Firestore emulator: ${firestoreSettings.host}`);
    
      firebase.firestore().settings(firestoreSettings);
    }
    
    // Emulate Auth
    if (shouldUseEmulator) {
      firebase.auth().useEmulator(`http://localhost:9099/`);
      console.debug(`Using Auth emulator: http://localhost:9099/`);
    }
  5. Make sure you also have init logic in cypress/support/commands.js or cypress/support/index.js:

With Firebase Web SDK versions up to 8

import firebase from 'firebase/app';
import 'firebase/auth';
import 'firebase/database';
import 'firebase/firestore';
import { attachCustomCommands } from 'cypress-firebase';

const fbConfig = {
  // Your Firebase Config
};

// Emulate RTDB if Env variable is passed
const rtdbEmulatorHost = Cypress.env('FIREBASE_DATABASE_EMULATOR_HOST');
if (rtdbEmulatorHost) {
  fbConfig.databaseURL = `http://${rtdbEmulatorHost}?ns=${fbConfig.projectId}`;
}

firebase.initializeApp(fbConfig);

// Emulate Firestore if Env variable is passed
const firestoreEmulatorHost = Cypress.env('FIRESTORE_EMULATOR_HOST');
if (firestoreEmulatorHost) {
  firebase.firestore().settings({
    host: firestoreEmulatorHost,
    ssl: false,
  });
}

const authEmulatorHost = Cypress.env('FIREBASE_AUTH_EMULATOR_HOST');
if (authEmulatorHost) {
  firebase.auth().useEmulator(`http://${authEmulatorHost}/`);
  console.debug(`Using Auth emulator: http://${authEmulatorHost}/`);
}

attachCustomCommands({ Cypress, cy, firebase });

With Firebase Web SDK version 9 in compat mode (same API as v8 with different import)

import firebase from 'firebase/compat/app';
import 'firebase/compat/auth';
import 'firebase/compat/database';
import 'firebase/compat/firestore';
import { attachCustomCommands } from 'cypress-firebase';

const fbConfig = {
  // Your Firebase Config
};

// Emulate RTDB if Env variable is passed
const rtdbEmulatorHost = Cypress.env('FIREBASE_DATABASE_EMULATOR_HOST');
if (rtdbEmulatorHost) {
  fbConfig.databaseURL = `http://${rtdbEmulatorHost}?ns=${fbConfig.projectId}`;
}

firebase.initializeApp(fbConfig);

// Emulate Firestore if Env variable is passed
const firestoreEmulatorHost = Cypress.env('FIRESTORE_EMULATOR_HOST');
if (firestoreEmulatorHost) {
  firebase.firestore().settings({
    host: firestoreEmulatorHost,
    ssl: false,
  });
}

const authEmulatorHost = Cypress.env('FIREBASE_AUTH_EMULATOR_HOST');
if (authEmulatorHost) {
  firebase.auth().useEmulator(`http://${authEmulatorHost}/`);
  console.debug(`Using Auth emulator: http://${authEmulatorHost}/`);
}

attachCustomCommands({ Cypress, cy, firebase });
  1. Start emulators: npm run emulators
  2. In another terminal window, start the application: npm start
  3. In another terminal window, open test runner with emulator settings: npm run test:emulate

NOTE: If you are using react-scripts (from create-react-app) or other environment management, you can use environment variables to pass settings into your app:

const {
  REACT_APP_FIREBASE_DATABASE_EMULATOR_HOST,
  REACT_APP_FIRESTORE_EMULATOR_HOST,
} = process.env;

// Emulate RTDB if REACT_APP_FIREBASE_DATABASE_EMULATOR_HOST exists in environment
if (REACT_APP_FIREBASE_DATABASE_EMULATOR_HOST) {
  console.debug(`Using RTDB emulator: ${fbConfig.databaseURL}`);
  fbConfig.databaseURL = `http://${REACT_APP_FIREBASE_DATABASE_EMULATOR_HOST}?ns=${fbConfig.projectId}`;
}

// Initialize Firebase instance
firebase.initializeApp(fbConfig);

const firestoreSettings = {};

if (window.Cypress) {
  // Needed for Firestore support in Cypress (see https://github.com/cypress-io/cypress/issues/6350)
  firestoreSettings.experimentalForceLongPolling = true;
}

// Emulate RTDB if REACT_APP_FIRESTORE_EMULATOR_HOST exists in environment
if (REACT_APP_FIRESTORE_EMULATOR_HOST) {
  firestoreSettings.host = REACT_APP_FIRESTORE_EMULATOR_HOST;
  firestoreSettings.ssl = false;

  console.debug(`Using Firestore emulator: ${firestoreSettings.host}`);

  firebase.firestore().settings(firestoreSettings);
}

Use Different RTDB Instance

Firebase instance config can be overriden by passing another argument to the cypress-firebase plugin. We can use this to override the databaseURL:

  1. Setup the config within plugin (cypress/plugins/index.js):

    const admin = require('firebase-admin');
    const cypressFirebasePlugin = require('cypress-firebase').plugin;
    
    module.exports = (on, config) => {
      const overrideFirebaseConfig = {
        databaseURL: 'http://localhost:9000?ns=my-other-namespace',
      };
      const extendedConfig = cypressFirebasePlugin(
        on,
        config,
        admin,
        overrideFirebaseConfig,
      );
    
      // Add other plugins/tasks such as code coverage here
    
      return extendedConfig;
    };
  2. Make sure you use the same databaseURL when initializing the firebase instance within cypress (cypress/support/index.js)

  3. Make sure you use the same databaseURL when initializing the firebase instance within your app code

Test Built Version

It is often required to run tests against the built version of your app instead of your dev version (with hot module reloading and other dev tools). You can do that by running a build script before spinning up the:

  1. Adding the following npm script:
    "start:dist": "npm run build && firebase emulators:start --only hosting",
  2. Add the emulator port to firebase.json:
    "emulators": {
      "hosting": {
        "port": 3000
      }
    }
  3. Run npm run start:dist to build your app and serve it with firebase
  4. In another terminal window, run a test command such as npm run test:open

NOTE: You can also use firebase serve:

"start:dist": "npm run build && firebase serve --only hosting -p 3000",

Changing Custom Command Names

Pass commandNames in the options object to attachCustomCommands:

const options = {
  // Key is current command name, value is new command name
  commandNames: {
    login: 'newNameForLogin',
    logout: 'newNameForLogout',
    callRtdb: 'newNameForCallRtdb',
    callFirestore: 'newNameForCallFirestore',
    getAuthUser: 'newNameForGetAuthUser',
  },
};
attachCustomCommands({ Cypress, cy, firebase }, options);

For more information about this feature, please see the original feature request.

Webpack File Preprocessing

If you are using a file preprocessor which is building for the browser environment, such as Webpack, you will need to make sure usage of fs is handled since it is used within the cypress-firebase plugin. To do this with webpack, add the following to your config:

node: {
  fs: 'empty';
}

See #120 for more info

Examples

Github Actions

Separate Install

name: Test Build

on: [pull_request]

jobs:
  ui-tests:
    name: UI Tests
    runs-on: ubuntu-latest
    steps:
      - name: Checkout Repo
        uses: actions/checkout@v2

      # Cypress action manages installing/caching npm dependencies and Cypress binary.
      - name: Cypress Run
        uses: cypress-io/github-action@v2
        with:
          group: 'E2E Tests'
        env:
          # pass the Dashboard record key as an environment variable
          CYPRESS_RECORD_KEY: ${{ secrets.CYPRESS_KEY }}
          # UID of User to login as during tests
          CYPRESS_TEST_UID: ${{ secrets.TEST_UID }}
          # Service Account (used for creating custom auth tokens)
          SERVICE_ACCOUNT: ${{ secrets.SERVICE_ACCOUNT }}
          # Branch settings
          GITHUB_HEAD_REF: ${{ github.head_ref }}
          GITHUB_REF: ${{ github.ref }}

Using Start For Local

name: Test

on: [pull_request]

jobs:
  ui-tests:
    name: UI Tests
    runs-on: ubuntu-latest
    steps:
      - name: Checkout Repo
        uses: actions/checkout@v2

      # Cypress action manages installing/caching npm dependencies and Cypress binary
      - name: Cypress Run
        uses: cypress-io/github-action@v2
        with:
          group: 'E2E Tests'
          start: npm start
          wait-on: http://localhost:3000
        env:
          # pass the Dashboard record key as an environment variable
          CYPRESS_RECORD_KEY: ${{ secrets.CYPRESS_KEY }}
          # UID of User to login as during tests
          CYPRESS_TEST_UID: ${{ secrets.TEST_UID }}
          # Service Account (used for creating custom auth tokens)
          SERVICE_ACCOUNT: ${{ secrets.SERVICE_ACCOUNT }}
          # Branch settings
          GITHUB_HEAD_REF: ${{ github.head_ref }}
          GITHUB_REF: ${{ github.ref }}

Why?

When testing, tests should have admin read/write access to the database for seeding/verifying data. It isn't currently possible to use Firebase's firebase-admin SDK directly within Cypress tests due to dependencies not being able to be loaded into the Browser environment. Since the admin SDK is necessary to generate custom tokens and interact with Real Time Database and Firestore with admin privileges, this library provides convenience methods (cy.callRtdb, cy.callFirestore, cy.login, etc...) which call custom tasks which have access to the node environment.

Projects Using It

Troubleshooting

  1. An error is coming from cypress mentioning "Error converting circular structure to JSON"

The issue is most likely due to a circular object, such as a timestamp, being included in data you are attempting to write to Firestore. Instead of using firebase.firestore.FieldValue.serverTimestamp() you should instead use firebase.firestore.Timestamp.now() or you would like to specify a certain date firebase.firestore.Timestamp.fromDate(new Date('01/01/18')).

This comes from the fact that cypress stringifies values as it is passing them from the browser environment to the node environment through cy.task.

  1. An error is causing tests to fail mentioning "firebaseinstallations.googleapis.com blocked by CORS policy"

This has to do with the Firebase JS SDK having problems calling a Google API - this issue has mostly been seen with older versions of Firebase SDK (pre v8) when being tested on Firebase Hosting (as opposed to a local server).

The following should help prevent the issue from failing tests:

Cypress.on('uncaught:exception', (err) => {
  // Prevent test failure from errors from firebase installations API
  return err.message.includes('firebaseinstallations.googleapis.com');
});

If you experience this with an SDK version newer than v7 please create a new issue.

Future Plans

  • firebase-admin v10 module support
  • Drop support for service account file in favor of application default credentails env variable (path to file set in GOOGLE_APPLICATION_CREDENTIALS)
  • Support for Auth emulators (this will become the suggested method instead of needing a service account)

More Repositories

1

react-redux-firebase

Redux bindings for Firebase. Includes React Hooks and Higher Order Components.
JavaScript
2,545
star
2

redux-firestore

Redux bindings for Firestore
JavaScript
574
star
3

generator-react-firebase

React Firebase (Redux optional) yeoman generator
JavaScript
296
star
4

fireadmin

Application for Managing Firebase Applications. Includes support for multiple environments and data migrations
JavaScript
240
star
5

react-google-button

Simple google button for React that follows Google's style guidelines (https://developers.google.com/identity/sign-in/web/build-button)
JavaScript
74
star
6

firebase-ci

Simplified Firebase interaction for continuous integration
JavaScript
72
star
7

redux-firebasev3

Actions/Reducer with HOC for using redux with Firebase v3
JavaScript
36
star
8

gitbook-plugin-versions-select

A gitbook plugin that provides a version dropdown. Works with multiple versions on one domain.
JavaScript
12
star
9

redux-firebase

Redux bindings for Firebase
JavaScript
7
star
10

tsheets-sdk

Javascript SDK for TSheets API
JavaScript
6
star
11

ng-reveal

Angular Directive wrapper for RevealJS presentation library.
JavaScript
6
star
12

cra-template-rrf

JavaScript
4
star
13

authrocket

Javascript library to interact with Auth Rocket service
JavaScript
3
star
14

generator-firebase-functions

Yeoman generator for creating Cloud Functions For Firebase within a Firebase project
JavaScript
3
star
15

renovate-config

My personal renovate config presets
3
star
16

functions-queue

Task Queuing for use with Cloud Functions for Firebase. Similar to firebase-queue but handles Functions events.
JavaScript
3
star
17

fireadmin-site

App for managing Firebase instances (including data migrations and analytics)
JavaScript
2
star
18

parsePush

DEPRECATED. Parse no longer exists
Go
2
star
19

devshare

JS library on which devshare.io is built and extended
JavaScript
2
star
20

redux-devshare

Redux connector for devshare library
JavaScript
2
star
21

generator-next-firebase

NextJS and Firebase project generator
JavaScript
2
star
22

tessellate

Application building/sharing API
JavaScript
2
star
23

machinepack-spotify

A machinepack to interact with the Spotify API
JavaScript
2
star
24

spanner-graphql-example

Example of React App which interacts with a Cloud Spanner instance using GraphQL (hosted on Cloud Functions)
TypeScript
2
star
25

firebase-tools-extra

Extra methods for firebase-tools which support using a service account.
TypeScript
1
star
26

AngularFireAdmin

Angular integration for FireAdmin library.
CSS
1
star
27

firething

JavaScript
1
star
28

deploy-changed-functions

TypeScript
1
star
29

portfolio

Personal website
JavaScript
1
star
30

PiOpenLighting

Open Lighting Library modified to be used on a pi that is placed in the amplifier rack that I build for my fraternity. Originally from open-lighting-24ba77cc10d1.
C++
1
star
31

Dyml

CSS
1
star
32

revealPortfolio

Portfolio sample built with RevealJS and AngularJS.
JavaScript
1
star
33

s3Upload

Go package to simplify file uploads to s3
Go
1
star
34

machinepack-jwtauth

Handle JSON Web Tokens from request headers.
JavaScript
1
star
35

devshare-cli

Command line interface for devshare
JavaScript
1
star
36

blues-mui-stack

Remix blues stack with material-ui
TypeScript
1
star
37

fireuser

User/Session management for Firebase
JavaScript
1
star
38

react-es6-basic

Basic React hello world app with ES6 and Babel.
HTML
1
star
39

new-project-tutorial

HTML
1
star
40

hypercube-server

CSS
1
star