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.
Files changed (36) hide show
  1. package/LICENSE +21 -21
  2. package/README.md +145 -146
  3. package/dist/git/githubAdapter.d.ts.map +1 -1
  4. package/dist/git/gitlabAdapter.d.ts.map +1 -1
  5. package/dist/index.d.ts +2 -0
  6. package/dist/index.d.ts.map +1 -1
  7. package/dist/index.js +1167 -13
  8. package/dist/index.js.map +7 -0
  9. package/dist/index.mjs +1143 -0
  10. package/dist/index.mjs.map +7 -0
  11. package/dist/virtualfs/indexedDbStorage.d.ts +62 -0
  12. package/dist/virtualfs/indexedDbStorage.d.ts.map +1 -0
  13. package/dist/virtualfs/opfsStorage.d.ts +66 -0
  14. package/dist/virtualfs/opfsStorage.d.ts.map +1 -0
  15. package/dist/virtualfs/storageBackend.d.ts +44 -0
  16. package/dist/virtualfs/storageBackend.d.ts.map +1 -0
  17. package/dist/virtualfs/virtualfs.d.ts +8 -7
  18. package/dist/virtualfs/virtualfs.d.ts.map +1 -1
  19. package/package.json +60 -47
  20. package/dist/git/adapter.js +0 -2
  21. package/dist/git/githubAdapter.js +0 -179
  22. package/dist/git/gitlabAdapter.js +0 -182
  23. package/dist/test/e2e/github.spec.d.ts +0 -2
  24. package/dist/test/e2e/github.spec.d.ts.map +0 -1
  25. package/dist/test/e2e/github.spec.js +0 -47
  26. package/dist/test/e2e/gitlab.spec.d.ts +0 -2
  27. package/dist/test/e2e/gitlab.spec.d.ts.map +0 -1
  28. package/dist/test/e2e/gitlab.spec.js +0 -34
  29. package/dist/test/e2e/virtualfs.spec.d.ts +0 -2
  30. package/dist/test/e2e/virtualfs.spec.d.ts.map +0 -1
  31. package/dist/test/e2e/virtualfs.spec.js +0 -409
  32. package/dist/virtualfs/persistence.d.ts +0 -149
  33. package/dist/virtualfs/persistence.d.ts.map +0 -1
  34. package/dist/virtualfs/persistence.js +0 -294
  35. package/dist/virtualfs/types.js +0 -2
  36. 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;
@@ -1,2 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });