@interactive-inc/docs-client 1.1.1 → 2.0.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.
- package/README.md +448 -0
- package/build/{doc-file-system-DEmPPJPE.d.ts → doc-file-system-z2sEMkq0.d.ts} +5 -5
- package/build/{doc-file-system.interface-C5vpYrOL.d.ts → doc-file-system.interface-CmQywbuP.d.ts} +3 -2
- package/build/file-system-json.d.ts +52 -10
- package/build/file-system-json.js +122 -68
- package/build/file-system-mock.d.ts +1 -1
- package/build/file-system-mock.js +8 -3
- package/build/file-system-node.d.ts +2 -2
- package/build/file-system-node.js +14 -12
- package/build/file-system-octokit.d.ts +7 -2
- package/build/file-system-octokit.js +42 -34
- package/build/file-system.d.ts +4 -4
- package/build/file-system.js +13 -12
- package/build/index.d.ts +101 -233
- package/build/index.js +552 -778
- package/build/models.d.ts +81 -1
- package/build/models.js +14 -15
- package/package.json +46 -17
- package/.env.local +0 -3
- package/tmp/docs-studio/files/a.md +0 -9
- package/tmp/docs-studio/pages/delete-document.md +0 -7
- package/tmp/docs-studio/pages/document-editor.md +0 -9
- package/tmp/docs-studio/pages/edit-document-content.md +0 -7
- package/tmp/docs-studio/pages/index.md +0 -14
|
@@ -3,8 +3,13 @@ import { z } from 'zod';
|
|
|
3
3
|
// lib/modules/file-system/doc-file-system-json.ts
|
|
4
4
|
|
|
5
5
|
// lib/modules/path-system/doc-path-system.ts
|
|
6
|
-
var DocPathSystem = class {
|
|
6
|
+
var DocPathSystem = class _DocPathSystem {
|
|
7
7
|
separator = "/";
|
|
8
|
+
constructor() {
|
|
9
|
+
if (new.target === _DocPathSystem) {
|
|
10
|
+
Object.freeze(this);
|
|
11
|
+
}
|
|
12
|
+
}
|
|
8
13
|
/**
|
|
9
14
|
* Join paths
|
|
10
15
|
*/
|
|
@@ -60,8 +65,8 @@ var DocPathSystem = class {
|
|
|
60
65
|
* Calculate relative path
|
|
61
66
|
*/
|
|
62
67
|
relative(from, to) {
|
|
63
|
-
const fromSegments = from.split(this.separator).filter(
|
|
64
|
-
const toSegments = to.split(this.separator).filter(
|
|
68
|
+
const fromSegments = from.split(this.separator).filter((s) => s !== "" && s !== ".");
|
|
69
|
+
const toSegments = to.split(this.separator).filter((s) => s !== "" && s !== ".");
|
|
65
70
|
let commonLength = 0;
|
|
66
71
|
for (let i = 0; i < Math.min(fromSegments.length, toSegments.length); i++) {
|
|
67
72
|
if (fromSegments[i] === toSegments[i]) {
|
|
@@ -264,24 +269,14 @@ var DocFileSystem = class {
|
|
|
264
269
|
return this.reader.getFileCreatedTime(relativePath);
|
|
265
270
|
}
|
|
266
271
|
};
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
try {
|
|
270
|
-
return zJsonDocumentData.parse(data);
|
|
271
|
-
} catch (error) {
|
|
272
|
-
return error instanceof Error ? error : new Error("Failed to parse JSON document data");
|
|
273
|
-
}
|
|
274
|
-
}
|
|
272
|
+
|
|
273
|
+
// lib/modules/file-system/doc-file-system-json-read.ts
|
|
275
274
|
var DocFileSystemJsonRead = class {
|
|
276
|
-
|
|
275
|
+
store;
|
|
277
276
|
basePath;
|
|
278
277
|
pathSystem;
|
|
279
278
|
constructor(props) {
|
|
280
|
-
|
|
281
|
-
if (parsed instanceof Error) {
|
|
282
|
-
throw parsed;
|
|
283
|
-
}
|
|
284
|
-
this.data = parsed;
|
|
279
|
+
this.store = props.store;
|
|
285
280
|
this.basePath = props.basePath ?? "docs";
|
|
286
281
|
this.pathSystem = props.pathSystem ?? new DocPathSystem();
|
|
287
282
|
Object.freeze(this);
|
|
@@ -292,7 +287,7 @@ var DocFileSystemJsonRead = class {
|
|
|
292
287
|
async readFile(relativePath) {
|
|
293
288
|
try {
|
|
294
289
|
const normalizedPath = this.normalizePath(relativePath);
|
|
295
|
-
const content = this.
|
|
290
|
+
const content = this.store.get(normalizedPath);
|
|
296
291
|
return content ?? null;
|
|
297
292
|
} catch (error) {
|
|
298
293
|
return error instanceof Error ? error : new Error(`Failed to read file at ${relativePath}`);
|
|
@@ -323,12 +318,9 @@ var DocFileSystemJsonRead = class {
|
|
|
323
318
|
try {
|
|
324
319
|
const normalizedDir = this.normalizePath(relativePath);
|
|
325
320
|
const fileNames = /* @__PURE__ */ new Set();
|
|
326
|
-
for (const filePath of
|
|
321
|
+
for (const filePath of this.store.keys()) {
|
|
327
322
|
if (this.isFileInDirectory(filePath, normalizedDir)) {
|
|
328
|
-
const relativePart = this.getRelativePartFromDirectory(
|
|
329
|
-
filePath,
|
|
330
|
-
normalizedDir
|
|
331
|
-
);
|
|
323
|
+
const relativePart = this.getRelativePartFromDirectory(filePath, normalizedDir);
|
|
332
324
|
const segments = relativePart.split("/").filter(Boolean);
|
|
333
325
|
if (segments.length > 0) {
|
|
334
326
|
fileNames.add(segments[0]);
|
|
@@ -349,9 +341,7 @@ var DocFileSystemJsonRead = class {
|
|
|
349
341
|
if (fileNames instanceof Error) {
|
|
350
342
|
return fileNames;
|
|
351
343
|
}
|
|
352
|
-
return fileNames.map(
|
|
353
|
-
(fileName) => this.pathSystem.join(relativePath, fileName)
|
|
354
|
-
);
|
|
344
|
+
return fileNames.map((fileName) => this.pathSystem.join(relativePath, fileName));
|
|
355
345
|
} catch (error) {
|
|
356
346
|
return error instanceof Error ? error : new Error(`Failed to read directory file paths at ${relativePath}`);
|
|
357
347
|
}
|
|
@@ -362,7 +352,7 @@ var DocFileSystemJsonRead = class {
|
|
|
362
352
|
async isDirectory(relativePath) {
|
|
363
353
|
try {
|
|
364
354
|
const normalizedPath = this.normalizePath(relativePath);
|
|
365
|
-
for (const filePath of
|
|
355
|
+
for (const filePath of this.store.keys()) {
|
|
366
356
|
if (filePath.startsWith(`${normalizedPath}/`)) {
|
|
367
357
|
return true;
|
|
368
358
|
}
|
|
@@ -378,7 +368,7 @@ var DocFileSystemJsonRead = class {
|
|
|
378
368
|
async isFile(relativePath) {
|
|
379
369
|
try {
|
|
380
370
|
const normalizedPath = this.normalizePath(relativePath);
|
|
381
|
-
return
|
|
371
|
+
return this.store.has(normalizedPath);
|
|
382
372
|
} catch {
|
|
383
373
|
return false;
|
|
384
374
|
}
|
|
@@ -449,13 +439,13 @@ var DocFileSystemJsonRead = class {
|
|
|
449
439
|
* Get all file paths in the JSON data
|
|
450
440
|
*/
|
|
451
441
|
getAllFilePaths() {
|
|
452
|
-
return
|
|
442
|
+
return this.store.keys();
|
|
453
443
|
}
|
|
454
444
|
/**
|
|
455
445
|
* Get the raw JSON data
|
|
456
446
|
*/
|
|
457
447
|
getRawData() {
|
|
458
|
-
return
|
|
448
|
+
return this.store.toData();
|
|
459
449
|
}
|
|
460
450
|
/**
|
|
461
451
|
* Normalize path by removing leading/trailing slashes
|
|
@@ -485,31 +475,99 @@ var DocFileSystemJsonRead = class {
|
|
|
485
475
|
return "";
|
|
486
476
|
}
|
|
487
477
|
};
|
|
488
|
-
var
|
|
489
|
-
function
|
|
478
|
+
var zJsonDocumentData = z.record(z.string(), z.string());
|
|
479
|
+
function parseJsonDocumentData(data) {
|
|
490
480
|
try {
|
|
491
|
-
return
|
|
481
|
+
return zJsonDocumentData.parse(data);
|
|
492
482
|
} catch (error) {
|
|
493
483
|
return error instanceof Error ? error : new Error("Failed to parse JSON document data");
|
|
494
484
|
}
|
|
495
485
|
}
|
|
496
|
-
var
|
|
497
|
-
|
|
498
|
-
basePath;
|
|
499
|
-
pathSystem;
|
|
500
|
-
reader;
|
|
501
|
-
onDataChange;
|
|
486
|
+
var DocFileSystemJsonStore = class {
|
|
487
|
+
documents;
|
|
502
488
|
constructor(props = {}) {
|
|
503
489
|
if (props.data !== void 0) {
|
|
504
|
-
const parsed =
|
|
490
|
+
const parsed = parseJsonDocumentData(props.data);
|
|
505
491
|
if (parsed instanceof Error) {
|
|
506
492
|
throw parsed;
|
|
507
493
|
}
|
|
508
|
-
this.
|
|
494
|
+
this.documents = parsed;
|
|
509
495
|
} else {
|
|
510
|
-
this.
|
|
496
|
+
this.documents = {};
|
|
511
497
|
}
|
|
512
|
-
|
|
498
|
+
}
|
|
499
|
+
/**
|
|
500
|
+
* 指定パスのドキュメント内容を取得する
|
|
501
|
+
*/
|
|
502
|
+
get(path) {
|
|
503
|
+
return this.documents[path];
|
|
504
|
+
}
|
|
505
|
+
/**
|
|
506
|
+
* 指定パスにドキュメント内容を書き込む
|
|
507
|
+
*/
|
|
508
|
+
set(path, content) {
|
|
509
|
+
this.documents[path] = content;
|
|
510
|
+
}
|
|
511
|
+
/**
|
|
512
|
+
* 指定パスを削除する。存在すれば true を返す
|
|
513
|
+
*/
|
|
514
|
+
delete(path) {
|
|
515
|
+
if (!(path in this.documents)) {
|
|
516
|
+
return false;
|
|
517
|
+
}
|
|
518
|
+
const nextDocuments = {};
|
|
519
|
+
for (const key of Object.keys(this.documents)) {
|
|
520
|
+
if (key !== path) {
|
|
521
|
+
nextDocuments[key] = this.documents[key];
|
|
522
|
+
}
|
|
523
|
+
}
|
|
524
|
+
this.documents = nextDocuments;
|
|
525
|
+
return true;
|
|
526
|
+
}
|
|
527
|
+
/**
|
|
528
|
+
* 指定パスが存在するかを返す
|
|
529
|
+
*/
|
|
530
|
+
has(path) {
|
|
531
|
+
return path in this.documents;
|
|
532
|
+
}
|
|
533
|
+
/**
|
|
534
|
+
* 全ドキュメントのパス一覧を返す
|
|
535
|
+
*/
|
|
536
|
+
keys() {
|
|
537
|
+
return Object.keys(this.documents);
|
|
538
|
+
}
|
|
539
|
+
/**
|
|
540
|
+
* データ全体を入れ替える
|
|
541
|
+
*/
|
|
542
|
+
replace(data) {
|
|
543
|
+
const parsed = parseJsonDocumentData(data);
|
|
544
|
+
if (parsed instanceof Error) {
|
|
545
|
+
return parsed;
|
|
546
|
+
}
|
|
547
|
+
this.documents = parsed;
|
|
548
|
+
return null;
|
|
549
|
+
}
|
|
550
|
+
/**
|
|
551
|
+
* 全データを削除する
|
|
552
|
+
*/
|
|
553
|
+
clear() {
|
|
554
|
+
this.documents = {};
|
|
555
|
+
}
|
|
556
|
+
/**
|
|
557
|
+
* 現在のデータの読み取り専用コピーを返す
|
|
558
|
+
*/
|
|
559
|
+
toData() {
|
|
560
|
+
return { ...this.documents };
|
|
561
|
+
}
|
|
562
|
+
};
|
|
563
|
+
z.record(z.string(), z.string());
|
|
564
|
+
var DocFileSystemJsonWrite = class {
|
|
565
|
+
store;
|
|
566
|
+
pathSystem;
|
|
567
|
+
reader;
|
|
568
|
+
onDataChange;
|
|
569
|
+
constructor(props) {
|
|
570
|
+
this.store = props.store;
|
|
513
571
|
this.pathSystem = props.pathSystem ?? new DocPathSystem();
|
|
514
572
|
this.reader = props.reader;
|
|
515
573
|
this.onDataChange = props.onDataChange;
|
|
@@ -520,7 +578,7 @@ var DocFileSystemJsonWrite = class {
|
|
|
520
578
|
async writeFile(relativePath, content) {
|
|
521
579
|
try {
|
|
522
580
|
const normalizedPath = this.normalizePath(relativePath);
|
|
523
|
-
this.
|
|
581
|
+
this.store.set(normalizedPath, content);
|
|
524
582
|
this.notifyDataChange();
|
|
525
583
|
return null;
|
|
526
584
|
} catch (error) {
|
|
@@ -533,10 +591,10 @@ var DocFileSystemJsonWrite = class {
|
|
|
533
591
|
async deleteFile(relativePath) {
|
|
534
592
|
try {
|
|
535
593
|
const normalizedPath = this.normalizePath(relativePath);
|
|
536
|
-
|
|
594
|
+
const deleted = this.store.delete(normalizedPath);
|
|
595
|
+
if (!deleted) {
|
|
537
596
|
return new Error(`File not found: ${relativePath}`);
|
|
538
597
|
}
|
|
539
|
-
delete this.data[normalizedPath];
|
|
540
598
|
this.notifyDataChange();
|
|
541
599
|
return null;
|
|
542
600
|
} catch (error) {
|
|
@@ -551,7 +609,7 @@ var DocFileSystemJsonWrite = class {
|
|
|
551
609
|
const normalizedPath = this.normalizePath(relativePath);
|
|
552
610
|
const gitkeepPath = this.pathSystem.join(normalizedPath, ".gitkeep");
|
|
553
611
|
const normalizedGitkeepPath = this.normalizePath(gitkeepPath);
|
|
554
|
-
this.
|
|
612
|
+
this.store.set(normalizedGitkeepPath, "");
|
|
555
613
|
this.notifyDataChange();
|
|
556
614
|
return null;
|
|
557
615
|
} catch (error) {
|
|
@@ -593,19 +651,18 @@ var DocFileSystemJsonWrite = class {
|
|
|
593
651
|
if (content === null) {
|
|
594
652
|
return new Error(`Source file not found: ${sourcePath}`);
|
|
595
653
|
}
|
|
596
|
-
this.
|
|
654
|
+
this.store.set(normalizedDestPath, content);
|
|
597
655
|
} else {
|
|
598
|
-
|
|
656
|
+
const sourceContent = this.store.get(normalizedSourcePath);
|
|
657
|
+
if (sourceContent === void 0) {
|
|
599
658
|
return new Error(`Source file not found: ${sourcePath}`);
|
|
600
659
|
}
|
|
601
|
-
this.
|
|
660
|
+
this.store.set(normalizedDestPath, sourceContent);
|
|
602
661
|
}
|
|
603
662
|
this.notifyDataChange();
|
|
604
663
|
return null;
|
|
605
664
|
} catch (error) {
|
|
606
|
-
return error instanceof Error ? error : new Error(
|
|
607
|
-
`Failed to copy file from ${sourcePath} to ${destinationPath}`
|
|
608
|
-
);
|
|
665
|
+
return error instanceof Error ? error : new Error(`Failed to copy file from ${sourcePath} to ${destinationPath}`);
|
|
609
666
|
}
|
|
610
667
|
}
|
|
611
668
|
/**
|
|
@@ -619,27 +676,24 @@ var DocFileSystemJsonWrite = class {
|
|
|
619
676
|
}
|
|
620
677
|
return await this.deleteFile(sourcePath);
|
|
621
678
|
} catch (error) {
|
|
622
|
-
return error instanceof Error ? error : new Error(
|
|
623
|
-
`Failed to move file from ${sourcePath} to ${destinationPath}`
|
|
624
|
-
);
|
|
679
|
+
return error instanceof Error ? error : new Error(`Failed to move file from ${sourcePath} to ${destinationPath}`);
|
|
625
680
|
}
|
|
626
681
|
}
|
|
627
682
|
/**
|
|
628
683
|
* Get the current JSON data
|
|
629
684
|
*/
|
|
630
685
|
getData() {
|
|
631
|
-
return
|
|
686
|
+
return this.store.toData();
|
|
632
687
|
}
|
|
633
688
|
/**
|
|
634
689
|
* Update the entire JSON data
|
|
635
690
|
*/
|
|
636
691
|
setData(data) {
|
|
637
692
|
try {
|
|
638
|
-
const
|
|
639
|
-
if (
|
|
640
|
-
return
|
|
693
|
+
const result = this.store.replace(data);
|
|
694
|
+
if (result instanceof Error) {
|
|
695
|
+
return result;
|
|
641
696
|
}
|
|
642
|
-
this.data = parsed;
|
|
643
697
|
this.notifyDataChange();
|
|
644
698
|
return null;
|
|
645
699
|
} catch (error) {
|
|
@@ -650,14 +704,14 @@ var DocFileSystemJsonWrite = class {
|
|
|
650
704
|
* Clear all data
|
|
651
705
|
*/
|
|
652
706
|
clear() {
|
|
653
|
-
this.
|
|
707
|
+
this.store.clear();
|
|
654
708
|
this.notifyDataChange();
|
|
655
709
|
}
|
|
656
710
|
/**
|
|
657
711
|
* Get all file paths in the JSON data
|
|
658
712
|
*/
|
|
659
713
|
getAllFilePaths() {
|
|
660
|
-
return
|
|
714
|
+
return this.store.keys();
|
|
661
715
|
}
|
|
662
716
|
/**
|
|
663
717
|
* Normalize path by removing leading/trailing slashes
|
|
@@ -670,7 +724,7 @@ var DocFileSystemJsonWrite = class {
|
|
|
670
724
|
*/
|
|
671
725
|
async directoryExistsInData(relativePath) {
|
|
672
726
|
const normalizedPath = this.normalizePath(relativePath);
|
|
673
|
-
for (const filePath of
|
|
727
|
+
for (const filePath of this.store.keys()) {
|
|
674
728
|
if (filePath.startsWith(`${normalizedPath}/`)) {
|
|
675
729
|
return true;
|
|
676
730
|
}
|
|
@@ -682,7 +736,7 @@ var DocFileSystemJsonWrite = class {
|
|
|
682
736
|
*/
|
|
683
737
|
notifyDataChange() {
|
|
684
738
|
if (this.onDataChange) {
|
|
685
|
-
this.onDataChange(
|
|
739
|
+
this.onDataChange(this.store.toData());
|
|
686
740
|
}
|
|
687
741
|
}
|
|
688
742
|
};
|
|
@@ -693,14 +747,14 @@ var DocFileSystemJson = class _DocFileSystemJson extends DocFileSystem {
|
|
|
693
747
|
jsonReader;
|
|
694
748
|
jsonWriter;
|
|
695
749
|
constructor(props = {}) {
|
|
750
|
+
const store = new DocFileSystemJsonStore({ data: props.data });
|
|
696
751
|
const reader = new DocFileSystemJsonRead({
|
|
697
|
-
|
|
752
|
+
store,
|
|
698
753
|
basePath: props.basePath,
|
|
699
754
|
pathSystem: props.pathSystem
|
|
700
755
|
});
|
|
701
756
|
const writer = new DocFileSystemJsonWrite({
|
|
702
|
-
|
|
703
|
-
basePath: props.basePath,
|
|
757
|
+
store,
|
|
704
758
|
pathSystem: props.pathSystem,
|
|
705
759
|
reader,
|
|
706
760
|
onDataChange: props.onDataChange
|
|
@@ -1,6 +1,11 @@
|
|
|
1
1
|
// lib/modules/path-system/doc-path-system.ts
|
|
2
|
-
var DocPathSystem = class {
|
|
2
|
+
var DocPathSystem = class _DocPathSystem {
|
|
3
3
|
separator = "/";
|
|
4
|
+
constructor() {
|
|
5
|
+
if (new.target === _DocPathSystem) {
|
|
6
|
+
Object.freeze(this);
|
|
7
|
+
}
|
|
8
|
+
}
|
|
4
9
|
/**
|
|
5
10
|
* Join paths
|
|
6
11
|
*/
|
|
@@ -56,8 +61,8 @@ var DocPathSystem = class {
|
|
|
56
61
|
* Calculate relative path
|
|
57
62
|
*/
|
|
58
63
|
relative(from, to) {
|
|
59
|
-
const fromSegments = from.split(this.separator).filter(
|
|
60
|
-
const toSegments = to.split(this.separator).filter(
|
|
64
|
+
const fromSegments = from.split(this.separator).filter((s) => s !== "" && s !== ".");
|
|
65
|
+
const toSegments = to.split(this.separator).filter((s) => s !== "" && s !== ".");
|
|
61
66
|
let commonLength = 0;
|
|
62
67
|
for (let i = 0; i < Math.min(fromSegments.length, toSegments.length); i++) {
|
|
63
68
|
if (fromSegments[i] === toSegments[i]) {
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { a as DocPathSystem } from './doc-file-system.interface-
|
|
2
|
-
import { D as DocFileSystem } from './doc-file-system-
|
|
1
|
+
import { a as DocPathSystem } from './doc-file-system.interface-CmQywbuP.js';
|
|
2
|
+
import { D as DocFileSystem } from './doc-file-system-z2sEMkq0.js';
|
|
3
3
|
export { DocFileSystemRead as DocFileSystemNodeRead, DocFileSystemWrite as DocFileSystemNodeWrite } from './file-system.js';
|
|
4
4
|
|
|
5
5
|
type Props = {
|
|
@@ -1,8 +1,13 @@
|
|
|
1
1
|
import * as fs from 'fs/promises';
|
|
2
2
|
|
|
3
3
|
// lib/modules/path-system/doc-path-system.ts
|
|
4
|
-
var DocPathSystem = class {
|
|
4
|
+
var DocPathSystem = class _DocPathSystem {
|
|
5
5
|
separator = "/";
|
|
6
|
+
constructor() {
|
|
7
|
+
if (new.target === _DocPathSystem) {
|
|
8
|
+
Object.freeze(this);
|
|
9
|
+
}
|
|
10
|
+
}
|
|
6
11
|
/**
|
|
7
12
|
* Join paths
|
|
8
13
|
*/
|
|
@@ -58,8 +63,8 @@ var DocPathSystem = class {
|
|
|
58
63
|
* Calculate relative path
|
|
59
64
|
*/
|
|
60
65
|
relative(from, to) {
|
|
61
|
-
const fromSegments = from.split(this.separator).filter(
|
|
62
|
-
const toSegments = to.split(this.separator).filter(
|
|
66
|
+
const fromSegments = from.split(this.separator).filter((s) => s !== "" && s !== ".");
|
|
67
|
+
const toSegments = to.split(this.separator).filter((s) => s !== "" && s !== ".");
|
|
63
68
|
let commonLength = 0;
|
|
64
69
|
for (let i = 0; i < Math.min(fromSegments.length, toSegments.length); i++) {
|
|
65
70
|
if (fromSegments[i] === toSegments[i]) {
|
|
@@ -268,6 +273,7 @@ var DocFileSystemNodeRead = class {
|
|
|
268
273
|
constructor(props) {
|
|
269
274
|
this.basePath = props.basePath;
|
|
270
275
|
this.pathSystem = props.pathSystem ?? new DocPathSystem();
|
|
276
|
+
Object.freeze(this);
|
|
271
277
|
}
|
|
272
278
|
/**
|
|
273
279
|
* Read file content at the specified path
|
|
@@ -317,9 +323,7 @@ var DocFileSystemNodeRead = class {
|
|
|
317
323
|
if (fileNames instanceof Error) {
|
|
318
324
|
return fileNames;
|
|
319
325
|
}
|
|
320
|
-
return fileNames.map(
|
|
321
|
-
(fileName) => this.pathSystem.join(relativePath, fileName)
|
|
322
|
-
);
|
|
326
|
+
return fileNames.map((fileName) => this.pathSystem.join(relativePath, fileName));
|
|
323
327
|
} catch (error) {
|
|
324
328
|
return error instanceof Error ? error : new Error(`Failed to read directory file paths at ${relativePath}`);
|
|
325
329
|
}
|
|
@@ -429,6 +433,7 @@ var DocFileSystemNodeWrite = class {
|
|
|
429
433
|
this.basePath = props.basePath;
|
|
430
434
|
this.pathSystem = props.pathSystem ?? new DocPathSystem();
|
|
431
435
|
this.reader = props.reader;
|
|
436
|
+
Object.freeze(this);
|
|
432
437
|
}
|
|
433
438
|
/**
|
|
434
439
|
* Write content to file at the specified path (creates directory if needed)
|
|
@@ -498,9 +503,7 @@ var DocFileSystemNodeWrite = class {
|
|
|
498
503
|
await fs.copyFile(sourceFullPath, destFullPath);
|
|
499
504
|
return null;
|
|
500
505
|
} catch (error) {
|
|
501
|
-
return error instanceof Error ? error : new Error(
|
|
502
|
-
`Failed to copy file from ${sourcePath} to ${destinationPath}`
|
|
503
|
-
);
|
|
506
|
+
return error instanceof Error ? error : new Error(`Failed to copy file from ${sourcePath} to ${destinationPath}`);
|
|
504
507
|
}
|
|
505
508
|
}
|
|
506
509
|
/**
|
|
@@ -513,9 +516,7 @@ var DocFileSystemNodeWrite = class {
|
|
|
513
516
|
await fs.rename(sourceFullPath, destFullPath);
|
|
514
517
|
return null;
|
|
515
518
|
} catch (error) {
|
|
516
|
-
return error instanceof Error ? error : new Error(
|
|
517
|
-
`Failed to move file from ${sourcePath} to ${destinationPath}`
|
|
518
|
-
);
|
|
519
|
+
return error instanceof Error ? error : new Error(`Failed to move file from ${sourcePath} to ${destinationPath}`);
|
|
519
520
|
}
|
|
520
521
|
}
|
|
521
522
|
};
|
|
@@ -538,6 +539,7 @@ var DocFileSystemNode = class extends DocFileSystem {
|
|
|
538
539
|
reader,
|
|
539
540
|
writer
|
|
540
541
|
});
|
|
542
|
+
Object.freeze(this);
|
|
541
543
|
}
|
|
542
544
|
};
|
|
543
545
|
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { a as DocPathSystem } from './doc-file-system.interface-
|
|
2
|
-
import { D as DocFileSystem, a as DocFileSystemReadInterface, b as DocFileSystemWriteInterface } from './doc-file-system-
|
|
1
|
+
import { a as DocPathSystem } from './doc-file-system.interface-CmQywbuP.js';
|
|
2
|
+
import { D as DocFileSystem, a as DocFileSystemReadInterface, b as DocFileSystemWriteInterface } from './doc-file-system-z2sEMkq0.js';
|
|
3
3
|
import { Octokit } from '@octokit/rest';
|
|
4
4
|
|
|
5
5
|
type GitHubProps = {
|
|
@@ -137,6 +137,11 @@ declare class DocFileSystemOctokitWrite implements DocFileSystemWriteInterface {
|
|
|
137
137
|
private readonly pathSystem;
|
|
138
138
|
private readonly reader?;
|
|
139
139
|
constructor(props: Props);
|
|
140
|
+
/**
|
|
141
|
+
* Check if reader exposes a SHA cache (OctokitRead instance)
|
|
142
|
+
*/
|
|
143
|
+
private hasShaCache;
|
|
144
|
+
private cachedSha;
|
|
140
145
|
/**
|
|
141
146
|
* Write content to file in GitHub repository
|
|
142
147
|
*/
|
|
@@ -1,8 +1,13 @@
|
|
|
1
1
|
import { Octokit } from '@octokit/rest';
|
|
2
2
|
|
|
3
3
|
// lib/modules/path-system/doc-path-system.ts
|
|
4
|
-
var DocPathSystem = class {
|
|
4
|
+
var DocPathSystem = class _DocPathSystem {
|
|
5
5
|
separator = "/";
|
|
6
|
+
constructor() {
|
|
7
|
+
if (new.target === _DocPathSystem) {
|
|
8
|
+
Object.freeze(this);
|
|
9
|
+
}
|
|
10
|
+
}
|
|
6
11
|
/**
|
|
7
12
|
* Join paths
|
|
8
13
|
*/
|
|
@@ -58,8 +63,8 @@ var DocPathSystem = class {
|
|
|
58
63
|
* Calculate relative path
|
|
59
64
|
*/
|
|
60
65
|
relative(from, to) {
|
|
61
|
-
const fromSegments = from.split(this.separator).filter(
|
|
62
|
-
const toSegments = to.split(this.separator).filter(
|
|
66
|
+
const fromSegments = from.split(this.separator).filter((s) => s !== "" && s !== ".");
|
|
67
|
+
const toSegments = to.split(this.separator).filter((s) => s !== "" && s !== ".");
|
|
63
68
|
let commonLength = 0;
|
|
64
69
|
for (let i = 0; i < Math.min(fromSegments.length, toSegments.length); i++) {
|
|
65
70
|
if (fromSegments[i] === toSegments[i]) {
|
|
@@ -292,9 +297,7 @@ var DocFileSystemOctokitRead = class {
|
|
|
292
297
|
ref: this.branch
|
|
293
298
|
});
|
|
294
299
|
if ("type" in response.data && response.data.type === "file") {
|
|
295
|
-
const content = Buffer.from(response.data.content, "base64").toString(
|
|
296
|
-
"utf-8"
|
|
297
|
-
);
|
|
300
|
+
const content = Buffer.from(response.data.content, "base64").toString("utf-8");
|
|
298
301
|
this.fileCache.set(fullPath, {
|
|
299
302
|
sha: response.data.sha,
|
|
300
303
|
content,
|
|
@@ -357,9 +360,7 @@ var DocFileSystemOctokitRead = class {
|
|
|
357
360
|
if (fileNames instanceof Error) {
|
|
358
361
|
return fileNames;
|
|
359
362
|
}
|
|
360
|
-
return fileNames.map(
|
|
361
|
-
(fileName) => this.pathSystem.join(relativePath, fileName)
|
|
362
|
-
);
|
|
363
|
+
return fileNames.map((fileName) => this.pathSystem.join(relativePath, fileName));
|
|
363
364
|
} catch (error) {
|
|
364
365
|
return error instanceof Error ? error : new Error(`Failed to read directory file paths at ${relativePath}`);
|
|
365
366
|
}
|
|
@@ -468,10 +469,11 @@ var DocFileSystemOctokitRead = class {
|
|
|
468
469
|
*/
|
|
469
470
|
async getFileUpdatedTime(relativePath) {
|
|
470
471
|
try {
|
|
472
|
+
const fullPath = this.pathSystem.join(this.basePath, relativePath);
|
|
471
473
|
const commits = await this.octokit.repos.listCommits({
|
|
472
474
|
owner: this.owner,
|
|
473
475
|
repo: this.repo,
|
|
474
|
-
path:
|
|
476
|
+
path: fullPath,
|
|
475
477
|
sha: this.branch,
|
|
476
478
|
per_page: 1
|
|
477
479
|
});
|
|
@@ -488,15 +490,23 @@ var DocFileSystemOctokitRead = class {
|
|
|
488
490
|
*/
|
|
489
491
|
async getFileCreatedTime(relativePath) {
|
|
490
492
|
try {
|
|
491
|
-
const
|
|
493
|
+
const fullPath = this.pathSystem.join(this.basePath, relativePath);
|
|
494
|
+
const iterator = this.octokit.paginate.iterator(this.octokit.repos.listCommits, {
|
|
492
495
|
owner: this.owner,
|
|
493
496
|
repo: this.repo,
|
|
494
|
-
path:
|
|
495
|
-
sha: this.branch
|
|
497
|
+
path: fullPath,
|
|
498
|
+
sha: this.branch,
|
|
499
|
+
per_page: 100
|
|
496
500
|
});
|
|
497
|
-
|
|
498
|
-
|
|
499
|
-
|
|
501
|
+
let oldestDate;
|
|
502
|
+
for await (const response of iterator) {
|
|
503
|
+
const lastInPage = response.data[response.data.length - 1];
|
|
504
|
+
if (lastInPage?.commit.author?.date) {
|
|
505
|
+
oldestDate = lastInPage.commit.author.date;
|
|
506
|
+
}
|
|
507
|
+
}
|
|
508
|
+
if (oldestDate) {
|
|
509
|
+
return new Date(oldestDate);
|
|
500
510
|
}
|
|
501
511
|
return new Error(`No commits found for ${relativePath}`);
|
|
502
512
|
} catch (error) {
|
|
@@ -529,6 +539,18 @@ var DocFileSystemOctokitWrite = class {
|
|
|
529
539
|
this.reader = props.reader;
|
|
530
540
|
Object.freeze(this);
|
|
531
541
|
}
|
|
542
|
+
/**
|
|
543
|
+
* Check if reader exposes a SHA cache (OctokitRead instance)
|
|
544
|
+
*/
|
|
545
|
+
hasShaCache(reader) {
|
|
546
|
+
return "getCachedSha" in reader;
|
|
547
|
+
}
|
|
548
|
+
cachedSha(relativePath) {
|
|
549
|
+
if (this.reader && this.hasShaCache(this.reader)) {
|
|
550
|
+
return this.reader.getCachedSha(relativePath);
|
|
551
|
+
}
|
|
552
|
+
return void 0;
|
|
553
|
+
}
|
|
532
554
|
/**
|
|
533
555
|
* Write content to file in GitHub repository
|
|
534
556
|
*/
|
|
@@ -536,12 +558,7 @@ var DocFileSystemOctokitWrite = class {
|
|
|
536
558
|
try {
|
|
537
559
|
const fullPath = this.pathSystem.join(this.basePath, relativePath);
|
|
538
560
|
const encodedContent = Buffer.from(content).toString("base64");
|
|
539
|
-
let sha;
|
|
540
|
-
if (this.reader && "getCachedSha" in this.reader) {
|
|
541
|
-
sha = this.reader.getCachedSha(
|
|
542
|
-
relativePath
|
|
543
|
-
);
|
|
544
|
-
}
|
|
561
|
+
let sha = this.cachedSha(relativePath);
|
|
545
562
|
if (!sha) {
|
|
546
563
|
try {
|
|
547
564
|
const existing = await this.octokit.repos.getContent({
|
|
@@ -576,12 +593,7 @@ var DocFileSystemOctokitWrite = class {
|
|
|
576
593
|
async deleteFile(relativePath) {
|
|
577
594
|
try {
|
|
578
595
|
const fullPath = this.pathSystem.join(this.basePath, relativePath);
|
|
579
|
-
let sha;
|
|
580
|
-
if (this.reader && "getCachedSha" in this.reader) {
|
|
581
|
-
sha = this.reader.getCachedSha(
|
|
582
|
-
relativePath
|
|
583
|
-
);
|
|
584
|
-
}
|
|
596
|
+
let sha = this.cachedSha(relativePath);
|
|
585
597
|
if (!sha) {
|
|
586
598
|
const existing = await this.octokit.repos.getContent({
|
|
587
599
|
owner: this.owner,
|
|
@@ -653,9 +665,7 @@ var DocFileSystemOctokitWrite = class {
|
|
|
653
665
|
}
|
|
654
666
|
return await this.writeFile(destinationPath, content);
|
|
655
667
|
} catch (error) {
|
|
656
|
-
return error instanceof Error ? error : new Error(
|
|
657
|
-
`Failed to copy file from ${sourcePath} to ${destinationPath}`
|
|
658
|
-
);
|
|
668
|
+
return error instanceof Error ? error : new Error(`Failed to copy file from ${sourcePath} to ${destinationPath}`);
|
|
659
669
|
}
|
|
660
670
|
}
|
|
661
671
|
/**
|
|
@@ -669,9 +679,7 @@ var DocFileSystemOctokitWrite = class {
|
|
|
669
679
|
}
|
|
670
680
|
return await this.deleteFile(sourcePath);
|
|
671
681
|
} catch (error) {
|
|
672
|
-
return error instanceof Error ? error : new Error(
|
|
673
|
-
`Failed to move file from ${sourcePath} to ${destinationPath}`
|
|
674
|
-
);
|
|
682
|
+
return error instanceof Error ? error : new Error(`Failed to move file from ${sourcePath} to ${destinationPath}`);
|
|
675
683
|
}
|
|
676
684
|
}
|
|
677
685
|
};
|
package/build/file-system.d.ts
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import { a as DocFileSystemReadInterface, b as DocFileSystemWriteInterface } from './doc-file-system-
|
|
2
|
-
export { D as DocFileSystem } from './doc-file-system-
|
|
3
|
-
import { a as DocPathSystem } from './doc-file-system.interface-
|
|
4
|
-
export { D as DocFileSystemInterface } from './doc-file-system.interface-
|
|
1
|
+
import { a as DocFileSystemReadInterface, b as DocFileSystemWriteInterface } from './doc-file-system-z2sEMkq0.js';
|
|
2
|
+
export { D as DocFileSystem } from './doc-file-system-z2sEMkq0.js';
|
|
3
|
+
import { a as DocPathSystem } from './doc-file-system.interface-CmQywbuP.js';
|
|
4
|
+
export { D as DocFileSystemInterface } from './doc-file-system.interface-CmQywbuP.js';
|
|
5
5
|
|
|
6
6
|
type Props$1 = {
|
|
7
7
|
basePath: string;
|