pring-no-admin
v0.19.5
Published
Cloud Firestore model framework for TypeScript - Google
Downloads
244
Maintainers
Readme
pring.ts
Firebase Cloud Firestore model framework for TypeScript. It supports both Web Client and Admin.
Installation ⚙
npm install pring --save
Usage
TypeScript
required
"devDependencies": {
"@types/node": "^10.9.2",
"typescript": "^3.0.3"
},
tsconfig.json
For Firebase CloudFunctions
{
"compilerOptions": {
"lib": ["es2018", "dom"],
"module": "commonjs",
"noImplicitReturns": true,
"outDir": "lib",
"sourceMap": true,
"target": "es2018"
},
"compileOnSave": true,
"include": [
"src"
],
"exclude": [
"node_modules"
]
}
For WebClient
{
"compilerOptions": {
"target": "es6",
"module": "esnext",
"strict": true,
"jsx": "preserve",
"importHelpers": true,
"moduleResolution": "node",
"experimentalDecorators": true,
"esModuleInterop": true,
"allowSyntheticDefaultImports": true,
"sourceMap": true,
"baseUrl": ".",
"types": [
"node"
],
"paths": {
"@/*": [
"src/*"
]
},
"lib": [
"esnext",
"dom",
"dom.iterable",
"scripthost"
]
},
"include": [
"src/**/*.ts",
"src/**/*.tsx",
"src/**/*.vue",
"tests/**/*.ts",
"tests/**/*.tsx"
],
"exclude": [
"node_modules"
]
}
Initialize
When using Pring in Vue please include it in main.ts
.
For Web
import * as Pring from "pring"
import { config } from "./config"
import firebase from "firebase"
import "firebase/firestore";
firebase.initializeApp()
const app = firebase.app()
Pring.initialize(app.firestore(), firebase.firestore.FieldValue.serverTimestamp())
For Admin
import * as Pring from "pring"
import { config } from "./config"
import * as admin from "firebase-admin"
firebase.initializeApp()
const app = admin.app()
Pring.initialize(app.firestore(), admin.firestore.FieldValue.serverTimestamp())
Scheme
- Please add
@property
for property declaration. - SubCollection can not be optional. Please initialize here.
import * as Pring from "pring"
const property = Pring.property
class Group extends Pring.Base {
@property name: string
@property users: NestedCollection<User> = NestedCollection(this)
}
class User extends Pring.Base {
@property name: string
@property groups: ReferenceCollection<Group> = ReferenceCollection(this)
}
Manage data
Initialize
// auto generate ID
let user = new User()
// any ID
let user = new User("YOUR_ID")
// any ID, Handle already saved users
let user = new User("YOUR_ID", {})
memo
The developer is responsible for managing the Document being saved. In Pring it is prohibited to save the already saved Document again.
Please use explicitly by the initialization method.
new User("YOUR_ID", {})
let user = new User("YOUR_ID")
Save
let user = new User()
user.name = "hoge"
await user.save()
Get
let user: User = await User.get("USER_ID", User)
Update
let user: User = await User.get("USER_ID", User)
user.name = "UPDATE NAME"
await user.update()
let user: User = new User("USER_ID", {})
user.name = "UPDATE NAME"
await user.update()
Delete
let user: User = await User.get("USER_ID", User)
await user.delete()
SubCollection
You can use ReferenceCollection and NestedCollection. The inserted Object is saved simultaneously with the save of the parent.
let user = new User()
let group = new Group()
user.groups.insert(group)
await user.save()
If you insert the parent after it is saved, you need to use await
to guarantee the count of SubCollection.
let user = new User()
await user.save()
let group0 = new Group()
let group1 = new Group()
try {
await user.groups.insert(group0)
await user.groups.insert(group1)
} catch(error) {
console.log(error)
}
DataSource
DataSource is a class that controls Collection of Firestore.
export default class Home extends Vue {
public async addUser() {
const user: User = new User()
user.name = "@1amageek"
await user.save()
}
public created() {
const dataSource = User.query().dataSource(User)
dataSource.on((snapshot, changes) => {
switch (changes.type) {
case "initial": {
console.log(dataSource.documents)
break
}
case "update": {
console.log("insert", changes.insertions)
console.log("change", changes.modifications)
console.log("delete", changes.deletions)
break
}
case "error": {
break
}
}
}).listen()
}
}
Test
https://facebook.github.io/jest/
npm install -g jest
jest