browser-git-ops 0.0.0 → 0.0.2
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.
- package/LICENSE +21 -21
- package/README.md +145 -146
- package/dist/git/githubAdapter.d.ts.map +1 -1
- package/dist/git/gitlabAdapter.d.ts.map +1 -1
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1167 -13
- package/dist/index.js.map +7 -0
- package/dist/index.mjs +1143 -0
- package/dist/index.mjs.map +7 -0
- package/dist/virtualfs/indexedDbStorage.d.ts +62 -0
- package/dist/virtualfs/indexedDbStorage.d.ts.map +1 -0
- package/dist/virtualfs/opfsStorage.d.ts +66 -0
- package/dist/virtualfs/opfsStorage.d.ts.map +1 -0
- package/dist/virtualfs/storageBackend.d.ts +44 -0
- package/dist/virtualfs/storageBackend.d.ts.map +1 -0
- package/dist/virtualfs/virtualfs.d.ts +8 -7
- package/dist/virtualfs/virtualfs.d.ts.map +1 -1
- package/package.json +60 -47
- package/dist/git/adapter.js +0 -2
- package/dist/git/githubAdapter.js +0 -179
- package/dist/git/gitlabAdapter.js +0 -182
- package/dist/test/e2e/github.spec.d.ts +0 -2
- package/dist/test/e2e/github.spec.d.ts.map +0 -1
- package/dist/test/e2e/github.spec.js +0 -47
- package/dist/test/e2e/gitlab.spec.d.ts +0 -2
- package/dist/test/e2e/gitlab.spec.d.ts.map +0 -1
- package/dist/test/e2e/gitlab.spec.js +0 -34
- package/dist/test/e2e/virtualfs.spec.d.ts +0 -2
- package/dist/test/e2e/virtualfs.spec.d.ts.map +0 -1
- package/dist/test/e2e/virtualfs.spec.js +0 -409
- package/dist/virtualfs/persistence.d.ts +0 -149
- package/dist/virtualfs/persistence.d.ts.map +0 -1
- package/dist/virtualfs/persistence.js +0 -294
- package/dist/virtualfs/types.js +0 -2
- package/dist/virtualfs/virtualfs.js +0 -496
|
@@ -1,294 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
-
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
-
};
|
|
5
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
-
exports.BrowserStorage = exports.NodeFsStorage = void 0;
|
|
7
|
-
const promises_1 = __importDefault(require("fs/promises"));
|
|
8
|
-
const path_1 = __importDefault(require("path"));
|
|
9
|
-
/**
|
|
10
|
-
* ファイルシステム上にデータを永続化する実装
|
|
11
|
-
*/
|
|
12
|
-
class NodeFsStorage {
|
|
13
|
-
dir;
|
|
14
|
-
indexPath;
|
|
15
|
-
/**
|
|
16
|
-
* NodeFsStorage を初期化します。
|
|
17
|
-
* @param {string} dir 永続化ディレクトリ
|
|
18
|
-
*/
|
|
19
|
-
constructor(dir) {
|
|
20
|
-
this.dir = dir;
|
|
21
|
-
this.indexPath = path_1.default.join(this.dir, 'index.json');
|
|
22
|
-
}
|
|
23
|
-
/**
|
|
24
|
-
* ストレージ用ディレクトリを作成します。
|
|
25
|
-
* @returns {Promise<void>}
|
|
26
|
-
*/
|
|
27
|
-
async init() {
|
|
28
|
-
await promises_1.default.mkdir(this.dir, { recursive: true });
|
|
29
|
-
}
|
|
30
|
-
/**
|
|
31
|
-
* index.json を読み込みます。存在しなければ null を返します。
|
|
32
|
-
* @returns {Promise<IndexFile|null>} 読み込んだ Index ファイル、または null
|
|
33
|
-
*/
|
|
34
|
-
async readIndex() {
|
|
35
|
-
try {
|
|
36
|
-
const raw = await promises_1.default.readFile(this.indexPath, 'utf8');
|
|
37
|
-
return JSON.parse(raw);
|
|
38
|
-
}
|
|
39
|
-
catch (err) {
|
|
40
|
-
return null;
|
|
41
|
-
}
|
|
42
|
-
}
|
|
43
|
-
/**
|
|
44
|
-
* index.json を書き込みます。
|
|
45
|
-
* @param {IndexFile} index 書き込む Index データ
|
|
46
|
-
* @returns {Promise<void>}
|
|
47
|
-
*/
|
|
48
|
-
async writeIndex(index) {
|
|
49
|
-
const data = JSON.stringify(index, null, 2);
|
|
50
|
-
await promises_1.default.writeFile(this.indexPath, data, 'utf8');
|
|
51
|
-
}
|
|
52
|
-
/**
|
|
53
|
-
* 指定パスへファイルを保存します。
|
|
54
|
-
* @param {string} filepath ファイルパス
|
|
55
|
-
* @param {string} content ファイル内容
|
|
56
|
-
* @returns {Promise<void>}
|
|
57
|
-
*/
|
|
58
|
-
async writeBlob(filepath, content) {
|
|
59
|
-
const full = path_1.default.join(this.dir, filepath);
|
|
60
|
-
await promises_1.default.mkdir(path_1.default.dirname(full), { recursive: true });
|
|
61
|
-
await promises_1.default.writeFile(full, content, 'utf8');
|
|
62
|
-
}
|
|
63
|
-
/**
|
|
64
|
-
* 指定パスのファイルを読み出します。存在しなければ null を返します。
|
|
65
|
-
* @param {string} filepath ファイルパス
|
|
66
|
-
* @returns {Promise<string|null>} ファイル内容または null
|
|
67
|
-
*/
|
|
68
|
-
async readBlob(filepath) {
|
|
69
|
-
try {
|
|
70
|
-
const full = path_1.default.join(this.dir, filepath);
|
|
71
|
-
return await promises_1.default.readFile(full, 'utf8');
|
|
72
|
-
}
|
|
73
|
-
catch (err) {
|
|
74
|
-
return null;
|
|
75
|
-
}
|
|
76
|
-
}
|
|
77
|
-
/**
|
|
78
|
-
* 指定パスのファイルを削除します。存在しない場合は無視されます。
|
|
79
|
-
* @param {string} filepath ファイルパス
|
|
80
|
-
* @returns {Promise<void>}
|
|
81
|
-
*/
|
|
82
|
-
async deleteBlob(filepath) {
|
|
83
|
-
try {
|
|
84
|
-
const full = path_1.default.join(this.dir, filepath);
|
|
85
|
-
await promises_1.default.unlink(full);
|
|
86
|
-
}
|
|
87
|
-
catch (err) {
|
|
88
|
-
// ignore
|
|
89
|
-
}
|
|
90
|
-
}
|
|
91
|
-
}
|
|
92
|
-
exports.NodeFsStorage = NodeFsStorage;
|
|
93
|
-
// BrowserStorage: use OPFS when available, otherwise IndexedDB
|
|
94
|
-
/**
|
|
95
|
-
* ブラウザ環境向けの永続化実装: OPFS を優先し、無ければ IndexedDB を使用する
|
|
96
|
-
*/
|
|
97
|
-
class BrowserStorage {
|
|
98
|
-
dbName = 'apigit_storage';
|
|
99
|
-
dbPromise;
|
|
100
|
-
/**
|
|
101
|
-
* BrowserStorage を初期化します。内部で IndexedDB 接続を開始します。
|
|
102
|
-
*/
|
|
103
|
-
constructor() {
|
|
104
|
-
this.dbPromise = this.openDb();
|
|
105
|
-
}
|
|
106
|
-
/**
|
|
107
|
-
* 初期化を待機します(IndexedDB の準備完了を待つ)。
|
|
108
|
-
* @returns {Promise<void>}
|
|
109
|
-
*/
|
|
110
|
-
async init() {
|
|
111
|
-
await this.dbPromise;
|
|
112
|
-
}
|
|
113
|
-
/**
|
|
114
|
-
* IndexedDB を開き、データベースインスタンスを返します。
|
|
115
|
-
* @returns {Promise<IDBDatabase>}
|
|
116
|
-
*/
|
|
117
|
-
openDb() {
|
|
118
|
-
return new Promise((resolve, reject) => {
|
|
119
|
-
const idb = globalThis.indexedDB;
|
|
120
|
-
if (!idb)
|
|
121
|
-
return reject(new Error('IndexedDB is not available'));
|
|
122
|
-
const req = idb.open(this.dbName, 1);
|
|
123
|
-
/**
|
|
124
|
-
* データベーススキーマの初期化
|
|
125
|
-
*/
|
|
126
|
-
req.onupgradeneeded = (ev) => {
|
|
127
|
-
const db = ev.target.result;
|
|
128
|
-
if (!db.objectStoreNames.contains('blobs'))
|
|
129
|
-
db.createObjectStore('blobs');
|
|
130
|
-
if (!db.objectStoreNames.contains('index'))
|
|
131
|
-
db.createObjectStore('index');
|
|
132
|
-
};
|
|
133
|
-
// 成功時ハンドラ
|
|
134
|
-
/**
|
|
135
|
-
* ハンドラ(成功時) - 戻り値なし
|
|
136
|
-
* @returns {void}
|
|
137
|
-
*/
|
|
138
|
-
req.onsuccess = () => resolve(req.result);
|
|
139
|
-
// エラー時ハンドラ
|
|
140
|
-
/**
|
|
141
|
-
* ハンドラ(エラー時) - 戻り値なし
|
|
142
|
-
* @returns {void}
|
|
143
|
-
*/
|
|
144
|
-
req.onerror = () => reject(req.error);
|
|
145
|
-
});
|
|
146
|
-
}
|
|
147
|
-
/**
|
|
148
|
-
* IndexedDB トランザクションをラップしてコールバックを実行します。
|
|
149
|
-
* @param {string} storeName ストア名
|
|
150
|
-
* @param {IDBTransactionMode} mode トランザクションモード
|
|
151
|
-
* @param {(store: IDBObjectStore)=>void|Promise<void>} cb 実行コールバック
|
|
152
|
-
* @returns {Promise<void>}
|
|
153
|
-
*/
|
|
154
|
-
async tx(storeName, mode, cb) {
|
|
155
|
-
const db = await this.dbPromise;
|
|
156
|
-
return new Promise((resolve, reject) => {
|
|
157
|
-
const tx = db.transaction(storeName, mode);
|
|
158
|
-
const storeObj = tx.objectStore(storeName);
|
|
159
|
-
Promise.resolve(cb(storeObj)).then(() => {
|
|
160
|
-
// トランザクション完了時ハンドラ
|
|
161
|
-
/**
|
|
162
|
-
* トランザクション完了時のコールバック(内部処理)
|
|
163
|
-
* @returns {void}
|
|
164
|
-
*/
|
|
165
|
-
tx.oncomplete = () => resolve();
|
|
166
|
-
// トランザクションエラー時ハンドラ
|
|
167
|
-
/**
|
|
168
|
-
* トランザクションエラー時のコールバック(内部処理)
|
|
169
|
-
* @returns {void}
|
|
170
|
-
*/
|
|
171
|
-
tx.onerror = () => reject(tx.error);
|
|
172
|
-
}).catch(reject);
|
|
173
|
-
});
|
|
174
|
-
}
|
|
175
|
-
/**
|
|
176
|
-
* index を IndexedDB から読み出します。
|
|
177
|
-
* @returns {Promise<IndexFile|null>} 読み込んだ Index ファイル、または null
|
|
178
|
-
*/
|
|
179
|
-
async readIndex() {
|
|
180
|
-
const db = await this.dbPromise;
|
|
181
|
-
return new Promise((resolve, reject) => {
|
|
182
|
-
const tx = db.transaction('index', 'readonly');
|
|
183
|
-
const store = tx.objectStore('index');
|
|
184
|
-
const req = store.get('index');
|
|
185
|
-
// onsuccess handler
|
|
186
|
-
/**
|
|
187
|
-
* onsuccess ハンドラ(内部処理) - 戻り値なし
|
|
188
|
-
* @returns {void}
|
|
189
|
-
*/
|
|
190
|
-
req.onsuccess = () => resolve(req.result ?? null);
|
|
191
|
-
// onerror handler
|
|
192
|
-
/**
|
|
193
|
-
* onerror ハンドラ(内部処理) - 戻り値なし
|
|
194
|
-
* @returns {void}
|
|
195
|
-
*/
|
|
196
|
-
req.onerror = () => reject(req.error);
|
|
197
|
-
});
|
|
198
|
-
}
|
|
199
|
-
/**
|
|
200
|
-
* index を IndexedDB に書き込みます。
|
|
201
|
-
* @param {IndexFile} index 書き込むデータ
|
|
202
|
-
* @returns {Promise<void>}
|
|
203
|
-
*/
|
|
204
|
-
async writeIndex(index) {
|
|
205
|
-
await this.tx('index', 'readwrite', (store) => { store.put(index, 'index'); });
|
|
206
|
-
}
|
|
207
|
-
/**
|
|
208
|
-
* blob を書き込みます。OPFS がある場合は OPFS を優先して使用します。
|
|
209
|
-
* @param {string} filepath ファイルパス
|
|
210
|
-
* @param {string} content ファイル内容
|
|
211
|
-
* @returns {Promise<void>}
|
|
212
|
-
*/
|
|
213
|
-
async writeBlob(filepath, content) {
|
|
214
|
-
// try OPFS if available
|
|
215
|
-
// @ts-ignore
|
|
216
|
-
const opfs = globalThis.originPrivateFileSystem;
|
|
217
|
-
if (opfs && opfs.getFileHandle) {
|
|
218
|
-
try {
|
|
219
|
-
// naive OPFS write
|
|
220
|
-
// @ts-ignore
|
|
221
|
-
const root = await opfs.getDirectory();
|
|
222
|
-
const parts = filepath.split('/');
|
|
223
|
-
let dir = root;
|
|
224
|
-
for (let i = 0; i < parts.length - 1; i++) {
|
|
225
|
-
dir = await dir.getDirectory(parts[i]);
|
|
226
|
-
}
|
|
227
|
-
const fh = await dir.getFileHandle(parts[parts.length - 1], { create: true });
|
|
228
|
-
const writable = await fh.createWritable();
|
|
229
|
-
await writable.write(content);
|
|
230
|
-
await writable.close();
|
|
231
|
-
return;
|
|
232
|
-
}
|
|
233
|
-
catch (e) {
|
|
234
|
-
// fallthrough to indexeddb
|
|
235
|
-
}
|
|
236
|
-
}
|
|
237
|
-
await this.tx('blobs', 'readwrite', (store) => { store.put(content, filepath); });
|
|
238
|
-
}
|
|
239
|
-
/**
|
|
240
|
-
* 指定パスの blob を読み出します。存在しなければ null を返します。
|
|
241
|
-
* @param {string} filepath ファイルパス
|
|
242
|
-
* @returns {Promise<string|null>} ファイル内容または null
|
|
243
|
-
*/
|
|
244
|
-
async readBlob(filepath) {
|
|
245
|
-
// try OPFS read
|
|
246
|
-
// @ts-ignore
|
|
247
|
-
const opfs = globalThis.originPrivateFileSystem;
|
|
248
|
-
if (opfs && opfs.getFileHandle) {
|
|
249
|
-
try {
|
|
250
|
-
// @ts-ignore
|
|
251
|
-
const root = await opfs.getDirectory();
|
|
252
|
-
const parts = filepath.split('/');
|
|
253
|
-
let dir = root;
|
|
254
|
-
for (let i = 0; i < parts.length - 1; i++) {
|
|
255
|
-
dir = await dir.getDirectory(parts[i]);
|
|
256
|
-
}
|
|
257
|
-
const fh = await dir.getFileHandle(parts[parts.length - 1]);
|
|
258
|
-
const file = await fh.getFile();
|
|
259
|
-
return await file.text();
|
|
260
|
-
}
|
|
261
|
-
catch (e) {
|
|
262
|
-
// fallback
|
|
263
|
-
}
|
|
264
|
-
}
|
|
265
|
-
const db = await this.dbPromise;
|
|
266
|
-
return new Promise((resolve, reject) => {
|
|
267
|
-
const tx = db.transaction('blobs', 'readonly');
|
|
268
|
-
const store = tx.objectStore('blobs');
|
|
269
|
-
const req = store.get(filepath);
|
|
270
|
-
// onsuccess handler
|
|
271
|
-
/**
|
|
272
|
-
* onsuccess ハンドラ(内部処理) - 戻り値なし
|
|
273
|
-
* @returns {void}
|
|
274
|
-
*/
|
|
275
|
-
req.onsuccess = () => resolve(req.result ?? null);
|
|
276
|
-
// onerror handler
|
|
277
|
-
/**
|
|
278
|
-
* onerror ハンドラ(内部処理) - 戻り値なし
|
|
279
|
-
* @returns {void}
|
|
280
|
-
*/
|
|
281
|
-
req.onerror = () => reject(req.error);
|
|
282
|
-
});
|
|
283
|
-
}
|
|
284
|
-
/**
|
|
285
|
-
* 指定パスの blob を削除します。
|
|
286
|
-
* @param {string} filepath ファイルパス
|
|
287
|
-
* @returns {Promise<void>}
|
|
288
|
-
*/
|
|
289
|
-
async deleteBlob(filepath) {
|
|
290
|
-
// delete from IndexedDB
|
|
291
|
-
await this.tx('blobs', 'readwrite', (store) => { store.delete(filepath); });
|
|
292
|
-
}
|
|
293
|
-
}
|
|
294
|
-
exports.BrowserStorage = BrowserStorage;
|
package/dist/virtualfs/types.js
DELETED