Loving Tina? us on GitHub0.0k

文档

学习

v.Latest
Documentation
自定义Git提供者
目录

实现一个Git提供者很简单。它是一个实现了GitProvider接口的类或对象。

GitProvider接口

export interface GitProvider {
onPut: (key: string, value: string) => Promise<void>
onDelete: (key: string) => Promise<void>
}

onPut

用于将内容保存到Git。每当在CMS中保存一个值时都会调用它。

onDelete

用于从Git中删除内容。每当在CMS中删除一个值时都会调用它。

示例

以下是GitHub Git提供者的源代码。它是如何实现GitProvider接口的一个很好的例子。

import { Octokit } from '@octokit/rest'
import { Base64 } from 'js-base64'
import type { GitProvider } from '@tinacms/graphql'
type OctokitOptions = ConstructorParameters<typeof Octokit>[0]
export interface GitHubProviderOptions {
owner: string
repo: string
token: string
branch: string
commitMessage?: string
rootPath?: string
octokitOptions?: OctokitOptions
}
export class MyGitHubProvider implements GitProvider {
octokit: Octokit
owner: string
repo: string
branch: string
rootPath?: string
commitMessage?: string
constructor(args: GitHubProviderOptions) {
this.owner = args.owner
this.repo = args.repo
this.branch = args.branch
this.commitMessage = args.commitMessage
this.rootPath = args.rootPath
this.octokit = new Octokit({
auth: args.token,
...(args.octokitOptions || {}),
})
}
async onPut(key: string, value: string) {
let sha
const keyWithPath = this.rootPath ? `${this.rootPath}/${key}` : key
try {
const {
// @ts-ignore
data: { sha: existingSha },
} = await this.octokit.repos.getContent({
owner: this.owner,
repo: this.repo,
path: keyWithPath,
ref: this.branch,
})
sha = existingSha
} catch (e) {}
await this.octokit.repos.createOrUpdateFileContents({
owner: this.owner,
repo: this.repo,
path: keyWithPath,
message: this.commitMessage || 'Edited with TinaCMS',
content: Base64.encode(value),
branch: this.branch,
sha,
})
}
async onDelete(key: string) {
let sha
const keyWithPath = this.rootPath ? `${this.rootPath}/${key}` : key
try {
const {
// @ts-ignore
data: { sha: existingSha },
} = await this.octokit.repos.getContent({
owner: this.owner,
repo: this.repo,
path: keyWithPath,
ref: this.branch,
})
sha = existingSha
} catch (e) {}
if (sha) {
await this.octokit.repos.deleteFile({
owner: this.owner,
repo: this.repo,
path: keyWithPath,
message: this.commitMessage || 'Edited with TinaCMS',
branch: this.branch,
sha,
})
} else {
throw new Error(
`无法在仓库${this.owner}/${this.repo}中找到文件${keyWithPath}`
)
}
}
}

添加你的Git提供者

现在可以将其用作createDatabase函数的一个属性。

database.ts,js:

import { createDatabase, createLocalDatabase } from '@tinacms/datalayer'
import { MyGitHubProvider } from './my-git-provider'
//...
export default isLocal ? createLocalDatabase() ? createDatabase({
gitProvider: new MyGitHubProvider({
//... 选项
}),
// ...
})
上次编辑: November 7, 2024