Skip to content

Commit 18f13cf

Browse files
committed
first commit
1 parent b2fceee commit 18f13cf

14 files changed

+322
-2
lines changed

.gitignore

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
# compiled output
2+
/dist
3+
/node_modules
4+
5+
# Logs
6+
logs
7+
*.log
8+
npm-debug.log*
9+
yarn-debug.log*
10+
yarn-error.log*
11+
lerna-debug.log*
12+
13+
# OS
14+
.DS_Store
15+
16+
# Tests
17+
/coverage
18+
/.nyc_output
19+
20+
# IDEs and editors
21+
/.idea
22+
.project
23+
.classpath
24+
.c9/
25+
*.launch
26+
.settings/
27+
*.sublime-workspace
28+
29+
# IDE - VSCode
30+
.vscode/*
31+
!.vscode/settings.json
32+
!.vscode/tasks.json
33+
!.vscode/launch.json
34+
!.vscode/extensions.json
35+
36+
package-lock.json

CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
RELEASE 1.0.0

CONTRIBUTING.md

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
# Contributing
2+
3+
1. [Fork it](https://help.github.com/articles/fork-a-repo/)
4+
2. Install dependencies (`npm install`)
5+
3. Create your feature branch (`git checkout -b my-new-feature`)
6+
4. Commit your changes (`git commit -am 'Added some feature'`)
7+
5. Push to the branch (`git push origin my-new-feature`)
8+
6. [Create new Pull Request](https://help.github.com/articles/creating-a-pull-request/)
9+
10+
## Code Style
11+
12+
We use [Prettier](https://prettier.io/) and tslint to maintain code style and best practices.
13+
Please make sure your PR adheres to the guides by running:
14+
15+
```bash
16+
npm run format
17+
```
18+
19+
and
20+
21+
```bash
22+
npm run lint
23+
```

README.md

Lines changed: 60 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,60 @@
1-
# nestjs-firebase-admin
2-
NestJS Module for Firebase Admin SDK
1+
<h1 align="center"></h1>
2+
3+
<div align="center">
4+
<a href="http://nestjs.com/" target="_blank">
5+
<img src="https://nestjs.com/img/logo_text.svg" width="150" alt="Nest Logo" />
6+
</a>
7+
</div>
8+
9+
<h3 align="center">NestJS Module for Firebase Admin SDK</h3>
10+
11+
<div align="center">
12+
<a href="https://nestjs.com" target="_blank">
13+
<img src="https://img.shields.io/badge/built%20with-NestJs-red.svg" alt="Built with NestJS">
14+
</a>
15+
</div>
16+
17+
# Installation
18+
19+
```bash
20+
npm install @tfarras/nestjs-firebase-admin
21+
```
22+
23+
## Import module
24+
25+
```typescript
26+
import { Module } from '@nestjs/common';
27+
import { FirebaseAdminModule } from '@tfarras/nestjs-firebase-admin'
28+
import * as admin from 'firebase-admin'
29+
30+
@Module({
31+
imports: [
32+
FirebaseAdminModule.forRootAsync({
33+
useFactory: () => ({
34+
credential: admin.credential.applicationDefault()
35+
})
36+
}),
37+
],
38+
})
39+
export class AppModule {}
40+
```
41+
42+
# Example
43+
44+
## Inject FirebaseAdminSDK
45+
46+
```typescript
47+
import { Injectable, Inject } from '@nestjs/common';
48+
import { FIREBASE_ADMIN_INJECT, FirebaseAdminSDK } from '@tfarras/nestjs-firebase-admin';
49+
50+
@Injectable()
51+
export class AppService {
52+
constructor(
53+
@Inject(FIREBASE_ADMIN_INJECT) private firebaseAdmin: FirebaseAdminSDK,
54+
) {}
55+
56+
getUsers() {
57+
return this.firebaseAdmin.auth().listUsers();
58+
}
59+
}
60+
```

nest-cli.json

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
{
2+
"language": "ts",
3+
"collection": "@nestjs/schematics",
4+
"sourceRoot": "src"
5+
}

package.json

Lines changed: 82 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,82 @@
1+
{
2+
"name": "@tfarras/nestjs-firebase-admin",
3+
"version": "1.0.0",
4+
"description": "NestJS Module for Firebase Admin SDK",
5+
"author": "Taimoor Farras <farrastaimoor@gmail.com>",
6+
"readmeFilename": "README.md",
7+
"main": "dist/index.js",
8+
"license": "MIT",
9+
"files": [
10+
"dist/**/*",
11+
"*.md"
12+
],
13+
"scripts": {
14+
"start:dev": "tsc -w",
15+
"build": "tsc",
16+
"prepare": "npm run build",
17+
"format": "prettier --write \"src/**/*.ts\"",
18+
"lint": "tslint -p tsconfig.json -c tslint.json",
19+
"test": "jest",
20+
"test:watch": "jest --watch",
21+
"test:cov": "jest --coverage",
22+
"test:e2e": "jest --config ./test/jest-e2e.json"
23+
},
24+
"keywords": [
25+
"nestjs",
26+
"firebase",
27+
"firebase-admin",
28+
"sdk"
29+
],
30+
"publishConfig": {
31+
"access": "public"
32+
},
33+
"repository": {
34+
"type": "git",
35+
"url": "git+https://github.com/tfarras/nestjs-firebase-admin-sdk.git"
36+
},
37+
"bugs": {
38+
"url": "https://github.com/tfarras/nestjs-firebase-admin-sdk/issues"
39+
},
40+
"homepage": "https://github.com/tfarras/nestjs-firebase-admin-sdk#readme",
41+
"peerDependencies": {
42+
"@nestjs/common": "^6.0.0",
43+
"firebase-admin": "^8.10.0"
44+
},
45+
"dependencies": {
46+
"firebase-admin": "^8.10.0"
47+
},
48+
"devDependencies": {
49+
"@nestjs/common": "^6.0.0",
50+
"@nestjs/core": "^6.0.0",
51+
"@nestjs/platform-express": "^6.0.0",
52+
"@nestjs/testing": "6.1.1",
53+
"@types/express": "4.16.1",
54+
"@types/jest": "24.0.11",
55+
"@types/node": "11.13.4",
56+
"@types/supertest": "2.0.7",
57+
"rxjs": "^6.5.4",
58+
"jest": "24.7.1",
59+
"prettier": "1.17.0",
60+
"supertest": "4.0.2",
61+
"ts-jest": "24.0.2",
62+
"ts-node": "8.1.0",
63+
"tsc-watch": "2.2.1",
64+
"tsconfig-paths": "3.8.0",
65+
"tslint": "5.16.0",
66+
"typescript": "3.7.2"
67+
},
68+
"jest": {
69+
"moduleFileExtensions": [
70+
"js",
71+
"json",
72+
"ts"
73+
],
74+
"rootDir": "src",
75+
"testRegex": ".spec.ts$",
76+
"transform": {
77+
"^.+\\.(t|j)s$": "ts-jest"
78+
},
79+
"coverageDirectory": "../coverage",
80+
"testEnvironment": "node"
81+
}
82+
}

src/firebase-admin-sdk.type.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
import * as admin from 'firebase-admin';
2+
3+
export type FirebaseAdminSDK = admin.app.App;

src/firebase-admin.constant.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
export const FIREBASE_ADMIN_MODULE_OPTIONS = 'FIREBASE_ADMIN_MODULE_OPTIONS';
2+
export const FIREBASE_ADMIN_NAME = 'FIREBASE_ADMIN_NAME';
3+
export const FIREBASE_ADMIN_INJECT = 'FIREBASE_ADMIN_INJECT';

src/firebase-admin.interface.ts

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
import * as admin from 'firebase-admin';
2+
import { ModuleMetadata } from '@nestjs/common/interfaces';
3+
4+
export type FirebaseUser = admin.auth.DecodedIdToken;
5+
6+
export interface FirebaseAdminModuleAsyncOptions
7+
extends Pick<ModuleMetadata, 'imports'> {
8+
name?: string;
9+
useFactory?: (
10+
...args: any[]
11+
) => Promise<admin.AppOptions> | admin.AppOptions;
12+
inject?: any[];
13+
}

src/firebase-admin.module.ts

Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
import { Global, Module, DynamicModule } from '@nestjs/common';
2+
import { FirebaseAdminModuleAsyncOptions } from './firebase-admin.interface';
3+
import { FIREBASE_ADMIN_MODULE_OPTIONS, FIREBASE_ADMIN_INJECT } from './firebase-admin.constant';
4+
import * as admin from 'firebase-admin';
5+
6+
@Global()
7+
@Module({})
8+
export class FirebaseAdminCoreModule {
9+
static forRoot(options: admin.AppOptions): DynamicModule {
10+
const firebaseAdminModuleOptions = {
11+
provide: FIREBASE_ADMIN_MODULE_OPTIONS,
12+
useValue: options,
13+
};
14+
15+
const app = admin.apps.length === 0 ? admin.initializeApp(options) : admin.apps[0];
16+
17+
const firebaseAuthencationProvider = {
18+
provide: FIREBASE_ADMIN_INJECT,
19+
useValue: app,
20+
};
21+
22+
return {
23+
module: FirebaseAdminCoreModule,
24+
providers: [firebaseAdminModuleOptions, firebaseAuthencationProvider],
25+
exports: [firebaseAdminModuleOptions, firebaseAuthencationProvider],
26+
};
27+
}
28+
29+
static forRootAsync(options: FirebaseAdminModuleAsyncOptions): DynamicModule {
30+
const firebaseAdminModuleOptions = {
31+
provide: FIREBASE_ADMIN_MODULE_OPTIONS,
32+
useFactory: options.useFactory,
33+
inject: options.inject || [],
34+
};
35+
36+
const firebaseAuthencationProvider = {
37+
provide: FIREBASE_ADMIN_INJECT,
38+
useFactory: (opt: admin.AppOptions) => {
39+
const app = admin.apps.length === 0 ? admin.initializeApp(opt) : admin.apps[0];
40+
41+
return app;
42+
},
43+
inject: [FIREBASE_ADMIN_MODULE_OPTIONS],
44+
};
45+
46+
return {
47+
module: FirebaseAdminCoreModule,
48+
imports: options.imports,
49+
providers: [firebaseAdminModuleOptions, firebaseAuthencationProvider],
50+
exports: [firebaseAdminModuleOptions, firebaseAuthencationProvider],
51+
};
52+
}
53+
}

src/index.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
export * from './firebase-admin-sdk.type';
2+
export * from './firebase-admin.constant';
3+
export * from './firebase-admin.interface';
4+
export * from './firebase-admin.module';

tsconfig.build.json

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
{
2+
"extends": "./tsconfig.json",
3+
"exclude": ["node_modules", "test", "dist", "**/*spec.ts"]
4+
}

tsconfig.json

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
{
2+
"compilerOptions": {
3+
"module": "commonjs",
4+
"declaration": true,
5+
"removeComments": true,
6+
"emitDecoratorMetadata": true,
7+
"experimentalDecorators": true,
8+
"target": "es6",
9+
"sourceMap": false,
10+
"outDir": "./dist",
11+
"rootDir": "./src",
12+
"baseUrl": "./",
13+
"noLib": false
14+
},
15+
"include": ["src/**/*.ts"],
16+
"exclude": ["node_modules"]
17+
}

tslint.json

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
{
2+
"defaultSeverity": "error",
3+
"extends": ["tslint:recommended"],
4+
"jsRules": {
5+
"no-unused-expression": true
6+
},
7+
"rules": {
8+
"quotemark": [true, "single"],
9+
"member-access": [false],
10+
"ordered-imports": [false],
11+
"max-line-length": [true, 150],
12+
"member-ordering": [false],
13+
"interface-name": [false],
14+
"arrow-parens": false,
15+
"object-literal-sort-keys": false
16+
},
17+
"rulesDirectory": []
18+
}

0 commit comments

Comments
 (0)