firebase-rest-firestore 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,59 @@
1
+ /**
2
+ * Firestoreの認証トークンを取得する関数
3
+ */
4
+ export declare function getFirestoreToken(): Promise<string>;
5
+ /**
6
+ * Firestoreクライアントクラス
7
+ */
8
+ export declare class FirestoreClient {
9
+ private token;
10
+ private tokenExpiry;
11
+ /**
12
+ * 認証トークンを取得(キャッシュあり)
13
+ */
14
+ private getToken;
15
+ /**
16
+ * Firestoreにドキュメントを作成
17
+ */
18
+ create(collectionName: string, data: Record<string, any>): Promise<Record<string, any> & {
19
+ id: string;
20
+ }>;
21
+ /**
22
+ * ドキュメントを取得
23
+ */
24
+ get(collectionName: string, documentId: string): Promise<(Record<string, any> & {
25
+ id: string;
26
+ }) | null>;
27
+ /**
28
+ * ドキュメントを更新
29
+ */
30
+ update(collectionName: string, documentId: string, data: Record<string, any>): Promise<Record<string, any> & {
31
+ id: string;
32
+ }>;
33
+ /**
34
+ * ドキュメントを削除
35
+ */
36
+ delete(collectionName: string, documentId: string): Promise<boolean>;
37
+ /**
38
+ * コレクションのドキュメントを検索
39
+ */
40
+ query(collectionName: string, options?: {
41
+ where?: Array<{
42
+ field: string;
43
+ op: string;
44
+ value: any;
45
+ }>;
46
+ orderBy?: string;
47
+ limit?: number;
48
+ offset?: number;
49
+ }): Promise<(Record<string, any> & {
50
+ id: string;
51
+ })[]>;
52
+ }
53
+ export declare const firestore: FirestoreClient;
54
+ export declare function saveToFirestore(collectionName: string, data: Record<string, any>): Promise<{
55
+ documentId: string;
56
+ result: Record<string, any> & {
57
+ id: string;
58
+ };
59
+ }>;
@@ -0,0 +1,349 @@
1
+ import * as jose from "jose";
2
+ // Firestore関連の定数
3
+ const FIREBASE_PROJECT_ID = process.env.FIREBASE_PROJECT_ID;
4
+ const FIREBASE_PRIVATE_KEY_ID = process.env.FIREBASE_PRIVATE_KEY_ID;
5
+ const FIREBASE_PRIVATE_KEY = process.env.FIREBASE_PRIVATE_KEY?.replace(/\\n/g, "\n");
6
+ const FIREBASE_CLIENT_EMAIL = process.env.FIREBASE_CLIENT_EMAIL;
7
+ const FIREBASE_CLIENT_ID = process.env.FIREBASE_CLIENT_ID;
8
+ const FIREBASE_CLIENT_CERT_URL = process.env.FIREBASE_CLIENT_CERT_URL;
9
+ // サービスアカウント情報
10
+ const serviceAccount = {
11
+ type: "service_account",
12
+ project_id: FIREBASE_PROJECT_ID,
13
+ private_key_id: FIREBASE_PRIVATE_KEY_ID,
14
+ private_key: FIREBASE_PRIVATE_KEY,
15
+ client_email: FIREBASE_CLIENT_EMAIL,
16
+ client_id: FIREBASE_CLIENT_ID,
17
+ auth_uri: "https://accounts.google.com/o/oauth2/auth",
18
+ token_uri: "https://oauth2.googleapis.com/token",
19
+ auth_provider_x509_cert_url: "https://www.googleapis.com/oauth2/v1/certs",
20
+ client_x509_cert_url: FIREBASE_CLIENT_CERT_URL,
21
+ };
22
+ // Firestoreのベースパス
23
+ const getFirestoreBasePath = (collectionName) => {
24
+ const basePath = `https://firestore.googleapis.com/v1/projects/${FIREBASE_PROJECT_ID}/databases/(default)/documents`;
25
+ return collectionName ? `${basePath}/${collectionName}` : basePath;
26
+ };
27
+ /**
28
+ * JSの値をFirestore形式に変換する
29
+ */
30
+ function convertToFirestoreValue(value) {
31
+ if (value instanceof Date) {
32
+ return { timestampValue: value.toISOString() };
33
+ }
34
+ else if (typeof value === "string") {
35
+ return { stringValue: value };
36
+ }
37
+ else if (typeof value === "number") {
38
+ return Number.isInteger(value)
39
+ ? { integerValue: value }
40
+ : { doubleValue: value };
41
+ }
42
+ else if (typeof value === "boolean") {
43
+ return { booleanValue: value };
44
+ }
45
+ else if (value === null || value === undefined) {
46
+ return { nullValue: null };
47
+ }
48
+ else if (Array.isArray(value)) {
49
+ return {
50
+ arrayValue: {
51
+ values: value.map(item => convertToFirestoreValue(item)),
52
+ },
53
+ };
54
+ }
55
+ else if (typeof value === "object") {
56
+ const fields = Object.entries(value).reduce((acc, [key, val]) => ({
57
+ ...acc,
58
+ [key]: convertToFirestoreValue(val),
59
+ }), {});
60
+ return { mapValue: { fields } };
61
+ }
62
+ // デフォルトは文字列化
63
+ return { stringValue: String(value) };
64
+ }
65
+ /**
66
+ * Firestore形式からJSの値に変換する
67
+ */
68
+ function convertFromFirestoreValue(firestoreValue) {
69
+ if ("stringValue" in firestoreValue) {
70
+ return firestoreValue.stringValue;
71
+ }
72
+ else if ("integerValue" in firestoreValue) {
73
+ return Number(firestoreValue.integerValue);
74
+ }
75
+ else if ("doubleValue" in firestoreValue) {
76
+ return firestoreValue.doubleValue;
77
+ }
78
+ else if ("booleanValue" in firestoreValue) {
79
+ return firestoreValue.booleanValue;
80
+ }
81
+ else if ("nullValue" in firestoreValue) {
82
+ return null;
83
+ }
84
+ else if ("timestampValue" in firestoreValue) {
85
+ return new Date(firestoreValue.timestampValue);
86
+ }
87
+ else if ("mapValue" in firestoreValue && firestoreValue.mapValue.fields) {
88
+ return Object.entries(firestoreValue.mapValue.fields).reduce((acc, [key, val]) => ({
89
+ ...acc,
90
+ [key]: convertFromFirestoreValue(val),
91
+ }), {});
92
+ }
93
+ else if ("arrayValue" in firestoreValue &&
94
+ firestoreValue.arrayValue.values) {
95
+ return firestoreValue.arrayValue.values.map(convertFromFirestoreValue);
96
+ }
97
+ return null;
98
+ }
99
+ /**
100
+ * オブジェクトをFirestoreドキュメント形式に変換
101
+ */
102
+ function convertToFirestoreDocument(data) {
103
+ return {
104
+ fields: Object.entries(data).reduce((acc, [key, value]) => ({
105
+ ...acc,
106
+ [key]: convertToFirestoreValue(value),
107
+ }), {}),
108
+ };
109
+ }
110
+ /**
111
+ * Firestoreドキュメントをオブジェクトに変換
112
+ */
113
+ function convertFromFirestoreDocument(doc) {
114
+ if (!doc.fields)
115
+ return { id: getDocumentId(doc.name) };
116
+ const result = Object.entries(doc.fields).reduce((acc, [key, value]) => ({
117
+ ...acc,
118
+ [key]: convertFromFirestoreValue(value),
119
+ }), {});
120
+ return {
121
+ ...result,
122
+ id: getDocumentId(doc.name),
123
+ };
124
+ }
125
+ /**
126
+ * ドキュメントパスからIDを抽出
127
+ */
128
+ function getDocumentId(path) {
129
+ if (!path)
130
+ return "";
131
+ const pathParts = path.split("/");
132
+ return pathParts[pathParts.length - 1];
133
+ }
134
+ // JWT(JSON Web Token)を作成する関数
135
+ async function createJWT(serviceAccount) {
136
+ const now = Math.floor(Date.now() / 1000);
137
+ const payload = {
138
+ iss: serviceAccount.client_email,
139
+ sub: serviceAccount.client_email,
140
+ aud: "https://oauth2.googleapis.com/token",
141
+ iat: now,
142
+ exp: now + 3600, // 1時間後に期限切れ
143
+ scope: "https://www.googleapis.com/auth/datastore",
144
+ };
145
+ try {
146
+ // 秘密鍵をインポート
147
+ const privateKey = await jose.importPKCS8(serviceAccount.private_key, "RS256");
148
+ // JWTを作成
149
+ const token = await new jose.SignJWT(payload)
150
+ .setProtectedHeader({
151
+ alg: "RS256",
152
+ kid: serviceAccount.private_key_id,
153
+ typ: "JWT",
154
+ })
155
+ .sign(privateKey);
156
+ return token;
157
+ }
158
+ catch (error) {
159
+ console.error("JWT作成エラー:", error);
160
+ throw error;
161
+ }
162
+ }
163
+ /**
164
+ * Firestoreの認証トークンを取得する関数
165
+ */
166
+ export async function getFirestoreToken() {
167
+ // トークンを取得するためのリクエスト
168
+ const response = await fetch("https://oauth2.googleapis.com/token", {
169
+ method: "POST",
170
+ headers: {
171
+ "Content-Type": "application/json",
172
+ },
173
+ body: JSON.stringify({
174
+ grant_type: "urn:ietf:params:oauth:grant-type:jwt-bearer",
175
+ assertion: await createJWT(serviceAccount),
176
+ }),
177
+ });
178
+ const data = (await response.json());
179
+ return data.access_token;
180
+ }
181
+ /**
182
+ * Firestoreクライアントクラス
183
+ */
184
+ export class FirestoreClient {
185
+ constructor() {
186
+ this.token = null;
187
+ this.tokenExpiry = 0;
188
+ }
189
+ /**
190
+ * 認証トークンを取得(キャッシュあり)
191
+ */
192
+ async getToken() {
193
+ const now = Date.now();
194
+ // トークンが期限切れか未取得の場合は新しく取得
195
+ if (!this.token || now >= this.tokenExpiry) {
196
+ this.token = await getFirestoreToken();
197
+ // 50分後に期限切れとする(実際は1時間)
198
+ this.tokenExpiry = now + 50 * 60 * 1000;
199
+ }
200
+ return this.token;
201
+ }
202
+ /**
203
+ * Firestoreにドキュメントを作成
204
+ */
205
+ async create(collectionName, data) {
206
+ const url = getFirestoreBasePath(collectionName);
207
+ const firestoreData = convertToFirestoreDocument(data);
208
+ const token = await this.getToken();
209
+ const response = await fetch(url, {
210
+ method: "POST",
211
+ headers: {
212
+ "Content-Type": "application/json",
213
+ Authorization: `Bearer ${token}`,
214
+ },
215
+ body: JSON.stringify(firestoreData),
216
+ });
217
+ if (!response.ok) {
218
+ throw new Error(`Firestore API error: ${response.statusText}`);
219
+ }
220
+ const result = (await response.json());
221
+ return convertFromFirestoreDocument(result);
222
+ }
223
+ /**
224
+ * ドキュメントを取得
225
+ */
226
+ async get(collectionName, documentId) {
227
+ const url = `${getFirestoreBasePath(collectionName)}/${documentId}`;
228
+ const token = await this.getToken();
229
+ const response = await fetch(url, {
230
+ method: "GET",
231
+ headers: {
232
+ Authorization: `Bearer ${token}`,
233
+ },
234
+ });
235
+ if (response.status === 404) {
236
+ return null;
237
+ }
238
+ if (!response.ok) {
239
+ throw new Error(`Firestore API error: ${response.statusText}`);
240
+ }
241
+ const result = (await response.json());
242
+ return convertFromFirestoreDocument(result);
243
+ }
244
+ /**
245
+ * ドキュメントを更新
246
+ */
247
+ async update(collectionName, documentId, data) {
248
+ const url = `${getFirestoreBasePath(collectionName)}/${documentId}`;
249
+ const firestoreData = convertToFirestoreDocument(data);
250
+ const token = await this.getToken();
251
+ const response = await fetch(url, {
252
+ method: "PATCH",
253
+ headers: {
254
+ "Content-Type": "application/json",
255
+ Authorization: `Bearer ${token}`,
256
+ },
257
+ body: JSON.stringify(firestoreData),
258
+ });
259
+ if (!response.ok) {
260
+ throw new Error(`Firestore API error: ${response.statusText}`);
261
+ }
262
+ const result = (await response.json());
263
+ return convertFromFirestoreDocument(result);
264
+ }
265
+ /**
266
+ * ドキュメントを削除
267
+ */
268
+ async delete(collectionName, documentId) {
269
+ const url = `${getFirestoreBasePath(collectionName)}/${documentId}`;
270
+ const token = await this.getToken();
271
+ const response = await fetch(url, {
272
+ method: "DELETE",
273
+ headers: {
274
+ Authorization: `Bearer ${token}`,
275
+ },
276
+ });
277
+ if (!response.ok) {
278
+ throw new Error(`Firestore API error: ${response.statusText}`);
279
+ }
280
+ return true;
281
+ }
282
+ /**
283
+ * コレクションのドキュメントを検索
284
+ */
285
+ async query(collectionName, options = {}) {
286
+ const url = `${getFirestoreBasePath(collectionName)}:runQuery`;
287
+ // クエリ構築
288
+ const structuredQuery = {
289
+ from: [{ collectionId: collectionName }],
290
+ };
291
+ // フィルター条件
292
+ if (options.where && options.where.length > 0) {
293
+ structuredQuery.where = {
294
+ compositeFilter: {
295
+ op: "AND",
296
+ filters: options.where.map(condition => ({
297
+ fieldFilter: {
298
+ field: { fieldPath: condition.field },
299
+ op: condition.op,
300
+ value: convertToFirestoreValue(condition.value),
301
+ },
302
+ })),
303
+ },
304
+ };
305
+ }
306
+ // 並べ替え
307
+ if (options.orderBy) {
308
+ structuredQuery.orderBy = [
309
+ {
310
+ field: { fieldPath: options.orderBy },
311
+ direction: "ASCENDING",
312
+ },
313
+ ];
314
+ }
315
+ // 制限
316
+ if (options.limit) {
317
+ structuredQuery.limit = options.limit;
318
+ }
319
+ // オフセット
320
+ if (options.offset) {
321
+ structuredQuery.offset = options.offset;
322
+ }
323
+ const token = await this.getToken();
324
+ const response = await fetch(url, {
325
+ method: "POST",
326
+ headers: {
327
+ "Content-Type": "application/json",
328
+ Authorization: `Bearer ${token}`,
329
+ },
330
+ body: JSON.stringify({
331
+ structuredQuery,
332
+ }),
333
+ });
334
+ if (!response.ok) {
335
+ throw new Error(`Firestore API error: ${response.statusText}`);
336
+ }
337
+ const results = (await response.json());
338
+ return results
339
+ .filter(item => item.document)
340
+ .map(item => convertFromFirestoreDocument(item.document));
341
+ }
342
+ }
343
+ // デフォルトのFirestoreクライアントインスタンス
344
+ export const firestore = new FirestoreClient();
345
+ // 後方互換性のための関数
346
+ export async function saveToFirestore(collectionName, data) {
347
+ const result = await firestore.create(collectionName, data);
348
+ return { documentId: result.id, result };
349
+ }
@@ -0,0 +1,6 @@
1
+ export * from "./types";
2
+ import { FirestoreClient, createFirestoreClient } from "./client";
3
+ export { getFirestoreToken } from "./utils/auth";
4
+ export { convertToFirestoreValue, convertFromFirestoreValue, convertToFirestoreDocument, convertFromFirestoreDocument, } from "./utils/converter";
5
+ export { getFirestoreBasePath, getDocumentId } from "./utils/path";
6
+ export { FirestoreClient, createFirestoreClient };
package/dist/index.js ADDED
@@ -0,0 +1,34 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
+ };
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ exports.createFirestoreClient = exports.FirestoreClient = exports.getDocumentId = exports.getFirestoreBasePath = exports.convertFromFirestoreDocument = exports.convertToFirestoreDocument = exports.convertFromFirestoreValue = exports.convertToFirestoreValue = exports.getFirestoreToken = void 0;
18
+ // 型定義のエクスポート
19
+ __exportStar(require("./types"), exports);
20
+ // クライアントのエクスポート
21
+ const client_1 = require("./client");
22
+ Object.defineProperty(exports, "FirestoreClient", { enumerable: true, get: function () { return client_1.FirestoreClient; } });
23
+ Object.defineProperty(exports, "createFirestoreClient", { enumerable: true, get: function () { return client_1.createFirestoreClient; } });
24
+ // ユーティリティ関数のエクスポート
25
+ var auth_1 = require("./utils/auth");
26
+ Object.defineProperty(exports, "getFirestoreToken", { enumerable: true, get: function () { return auth_1.getFirestoreToken; } });
27
+ var converter_1 = require("./utils/converter");
28
+ Object.defineProperty(exports, "convertToFirestoreValue", { enumerable: true, get: function () { return converter_1.convertToFirestoreValue; } });
29
+ Object.defineProperty(exports, "convertFromFirestoreValue", { enumerable: true, get: function () { return converter_1.convertFromFirestoreValue; } });
30
+ Object.defineProperty(exports, "convertToFirestoreDocument", { enumerable: true, get: function () { return converter_1.convertToFirestoreDocument; } });
31
+ Object.defineProperty(exports, "convertFromFirestoreDocument", { enumerable: true, get: function () { return converter_1.convertFromFirestoreDocument; } });
32
+ var path_1 = require("./utils/path");
33
+ Object.defineProperty(exports, "getFirestoreBasePath", { enumerable: true, get: function () { return path_1.getFirestoreBasePath; } });
34
+ Object.defineProperty(exports, "getDocumentId", { enumerable: true, get: function () { return path_1.getDocumentId; } });
@@ -0,0 +1,63 @@
1
+ /**
2
+ * Firestoreクライアントの設定インターフェース
3
+ */
4
+ export interface FirestoreConfig {
5
+ projectId: string;
6
+ privateKey: string;
7
+ clientEmail: string;
8
+ }
9
+ /**
10
+ * Firestoreの値型定義
11
+ */
12
+ export type FirestoreFieldValue = {
13
+ stringValue: string;
14
+ } | {
15
+ integerValue: number;
16
+ } | {
17
+ doubleValue: number;
18
+ } | {
19
+ booleanValue: boolean;
20
+ } | {
21
+ nullValue: null;
22
+ } | {
23
+ timestampValue: string;
24
+ } | {
25
+ mapValue: {
26
+ fields: Record<string, FirestoreFieldValue>;
27
+ };
28
+ } | {
29
+ arrayValue: {
30
+ values: FirestoreFieldValue[];
31
+ };
32
+ };
33
+ /**
34
+ * Firestoreドキュメント型
35
+ */
36
+ export interface FirestoreDocument {
37
+ name?: string;
38
+ fields: Record<string, FirestoreFieldValue>;
39
+ createTime?: string;
40
+ updateTime?: string;
41
+ }
42
+ /**
43
+ * Firestoreレスポンス型
44
+ */
45
+ export interface FirestoreResponse {
46
+ name: string;
47
+ fields?: Record<string, FirestoreFieldValue>;
48
+ createTime?: string;
49
+ updateTime?: string;
50
+ }
51
+ /**
52
+ * クエリオプション型
53
+ */
54
+ export interface QueryOptions {
55
+ where?: Array<{
56
+ field: string;
57
+ op: string;
58
+ value: any;
59
+ }>;
60
+ orderBy?: string;
61
+ limit?: number;
62
+ offset?: number;
63
+ }
package/dist/types.js ADDED
@@ -0,0 +1,2 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
@@ -0,0 +1,13 @@
1
+ import { FirestoreConfig } from "../types";
2
+ /**
3
+ * JWT(JSON Web Token)を作成する関数
4
+ * @param config Firestore設定
5
+ * @returns JWT文字列
6
+ */
7
+ export declare function createJWT(config: FirestoreConfig): Promise<string>;
8
+ /**
9
+ * Firestoreの認証トークンを取得する関数
10
+ * @param config Firestore設定
11
+ * @returns アクセストークン
12
+ */
13
+ export declare function getFirestoreToken(config: FirestoreConfig): Promise<string>;
@@ -0,0 +1,90 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.createJWT = createJWT;
37
+ exports.getFirestoreToken = getFirestoreToken;
38
+ const jose = __importStar(require("jose"));
39
+ /**
40
+ * JWT(JSON Web Token)を作成する関数
41
+ * @param config Firestore設定
42
+ * @returns JWT文字列
43
+ */
44
+ async function createJWT(config) {
45
+ const now = Math.floor(Date.now() / 1000);
46
+ const payload = {
47
+ iss: config.clientEmail,
48
+ sub: config.clientEmail,
49
+ aud: "https://oauth2.googleapis.com/token",
50
+ iat: now,
51
+ exp: now + 3600, // 1時間後に期限切れ
52
+ scope: "https://www.googleapis.com/auth/datastore",
53
+ };
54
+ try {
55
+ // 秘密鍵をインポート
56
+ const privateKey = await jose.importPKCS8(config.privateKey, "RS256");
57
+ // JWTを作成
58
+ const token = await new jose.SignJWT(payload)
59
+ .setProtectedHeader({
60
+ alg: "RS256",
61
+ typ: "JWT",
62
+ })
63
+ .sign(privateKey);
64
+ return token;
65
+ }
66
+ catch (error) {
67
+ console.error("Error creating JWT:", error);
68
+ throw error;
69
+ }
70
+ }
71
+ /**
72
+ * Firestoreの認証トークンを取得する関数
73
+ * @param config Firestore設定
74
+ * @returns アクセストークン
75
+ */
76
+ async function getFirestoreToken(config) {
77
+ // トークンを取得するためのリクエスト
78
+ const response = await fetch("https://oauth2.googleapis.com/token", {
79
+ method: "POST",
80
+ headers: {
81
+ "Content-Type": "application/json",
82
+ },
83
+ body: JSON.stringify({
84
+ grant_type: "urn:ietf:params:oauth:grant-type:jwt-bearer",
85
+ assertion: await createJWT(config),
86
+ }),
87
+ });
88
+ const data = (await response.json());
89
+ return data.access_token;
90
+ }
@@ -0,0 +1,27 @@
1
+ import { FirestoreDocument, FirestoreFieldValue, FirestoreResponse } from "../types";
2
+ /**
3
+ * JSの値をFirestore形式に変換する
4
+ * @param value 変換する値
5
+ * @returns Firestore形式の値
6
+ */
7
+ export declare function convertToFirestoreValue(value: any): FirestoreFieldValue;
8
+ /**
9
+ * Firestore形式からJSの値に変換する
10
+ * @param firestoreValue Firestore形式の値
11
+ * @returns JS形式の値
12
+ */
13
+ export declare function convertFromFirestoreValue(firestoreValue: FirestoreFieldValue): any;
14
+ /**
15
+ * オブジェクトをFirestoreドキュメント形式に変換
16
+ * @param data 変換するオブジェクト
17
+ * @returns Firestoreドキュメント
18
+ */
19
+ export declare function convertToFirestoreDocument(data: Record<string, any>): FirestoreDocument;
20
+ /**
21
+ * Firestoreドキュメントをオブジェクトに変換
22
+ * @param doc Firestoreレスポンス
23
+ * @returns 変換されたオブジェクト(idプロパティ付き)
24
+ */
25
+ export declare function convertFromFirestoreDocument(doc: FirestoreResponse): Record<string, any> & {
26
+ id: string;
27
+ };