@o2b/meta 1.0.0-dev.5 → 1.0.0-dev.6
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/dist/cli.js +100 -97
- package/dist/cli.js.map +1 -1
- package/dist/index.d.mts +33 -117
- package/dist/index.d.ts +33 -117
- package/dist/index.js +122 -86
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +120 -84
- package/dist/index.mjs.map +1 -1
- package/package.json +3 -2
package/dist/index.d.ts
CHANGED
|
@@ -1,15 +1,6 @@
|
|
|
1
1
|
import z from 'zod';
|
|
2
2
|
|
|
3
|
-
|
|
4
|
-
declare const absPath: z.ZodBranded<z.ZodString, "absPath">;
|
|
5
|
-
|
|
6
|
-
type Config = {
|
|
7
|
-
srcPath: AbsPath;
|
|
8
|
-
destPath: AbsPath;
|
|
9
|
-
ignore: boolean;
|
|
10
|
-
};
|
|
11
|
-
|
|
12
|
-
declare const fileTree: z.ZodUnion<[z.ZodObject<{
|
|
3
|
+
declare const normedFileNode: z.ZodObject<{
|
|
13
4
|
path: z.ZodBranded<z.ZodString, "relpath">;
|
|
14
5
|
name: z.ZodString;
|
|
15
6
|
} & {
|
|
@@ -27,6 +18,8 @@ declare const fileTree: z.ZodUnion<[z.ZodObject<{
|
|
|
27
18
|
description: string;
|
|
28
19
|
last_modified: string;
|
|
29
20
|
}>;
|
|
21
|
+
} & {
|
|
22
|
+
id: z.ZodNumber;
|
|
30
23
|
}, "strip", z.ZodTypeAny, {
|
|
31
24
|
path: string & z.BRAND<"relpath">;
|
|
32
25
|
type: "file";
|
|
@@ -36,6 +29,7 @@ declare const fileTree: z.ZodUnion<[z.ZodObject<{
|
|
|
36
29
|
description: string;
|
|
37
30
|
last_modified: string;
|
|
38
31
|
};
|
|
32
|
+
id: number;
|
|
39
33
|
}, {
|
|
40
34
|
path: string;
|
|
41
35
|
type: "file";
|
|
@@ -45,121 +39,43 @@ declare const fileTree: z.ZodUnion<[z.ZodObject<{
|
|
|
45
39
|
description: string;
|
|
46
40
|
last_modified: string;
|
|
47
41
|
};
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
type: "dir";
|
|
53
|
-
files: {
|
|
54
|
-
path: string & z.BRAND<"relpath">;
|
|
55
|
-
type: "file";
|
|
56
|
-
name: string;
|
|
57
|
-
frontmatter: {
|
|
58
|
-
title: string;
|
|
59
|
-
description: string;
|
|
60
|
-
last_modified: string;
|
|
61
|
-
};
|
|
62
|
-
}[];
|
|
63
|
-
dirs: ({
|
|
64
|
-
path: string & z.BRAND<"relpath">;
|
|
65
|
-
name: string;
|
|
66
|
-
} & /*elided*/ any)[];
|
|
67
|
-
}, z.ZodTypeDef, {
|
|
68
|
-
path: string;
|
|
69
|
-
name: string;
|
|
70
|
-
} & {
|
|
71
|
-
type: "dir";
|
|
72
|
-
files: {
|
|
73
|
-
path: string;
|
|
74
|
-
type: "file";
|
|
75
|
-
name: string;
|
|
76
|
-
frontmatter: {
|
|
77
|
-
title: string;
|
|
78
|
-
description: string;
|
|
79
|
-
last_modified: string;
|
|
80
|
-
};
|
|
81
|
-
}[];
|
|
82
|
-
dirs: ({
|
|
83
|
-
path: string;
|
|
84
|
-
name: string;
|
|
85
|
-
} & /*elided*/ any)[];
|
|
86
|
-
}>]>;
|
|
87
|
-
declare const jsonFileTree: z.ZodUnion<[z.ZodObject<{
|
|
88
|
-
path: z.ZodString;
|
|
42
|
+
id: number;
|
|
43
|
+
}>;
|
|
44
|
+
declare const normedDirNode: z.ZodObject<{
|
|
45
|
+
path: z.ZodBranded<z.ZodString, "relpath">;
|
|
89
46
|
name: z.ZodString;
|
|
90
47
|
} & {
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
last_modified: z.ZodString;
|
|
96
|
-
}, "strip", z.ZodTypeAny, {
|
|
97
|
-
title: string;
|
|
98
|
-
description: string;
|
|
99
|
-
last_modified: string;
|
|
100
|
-
}, {
|
|
101
|
-
title: string;
|
|
102
|
-
description: string;
|
|
103
|
-
last_modified: string;
|
|
104
|
-
}>;
|
|
48
|
+
id: z.ZodNumber;
|
|
49
|
+
type: z.ZodLiteral<"dir">;
|
|
50
|
+
files: z.ZodArray<z.ZodNumber, "many">;
|
|
51
|
+
dirs: z.ZodArray<z.ZodNumber, "many">;
|
|
105
52
|
}, "strip", z.ZodTypeAny, {
|
|
106
|
-
path: string
|
|
107
|
-
type: "
|
|
53
|
+
path: string & z.BRAND<"relpath">;
|
|
54
|
+
type: "dir";
|
|
108
55
|
name: string;
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
last_modified: string;
|
|
113
|
-
};
|
|
56
|
+
files: number[];
|
|
57
|
+
dirs: number[];
|
|
58
|
+
id: number;
|
|
114
59
|
}, {
|
|
115
60
|
path: string;
|
|
116
|
-
type: "file";
|
|
117
|
-
name: string;
|
|
118
|
-
frontmatter: {
|
|
119
|
-
title: string;
|
|
120
|
-
description: string;
|
|
121
|
-
last_modified: string;
|
|
122
|
-
};
|
|
123
|
-
}>, z.ZodType<{
|
|
124
|
-
path: string;
|
|
125
|
-
name: string;
|
|
126
|
-
} & {
|
|
127
61
|
type: "dir";
|
|
128
|
-
files: {
|
|
129
|
-
path: string;
|
|
130
|
-
type: "file";
|
|
131
|
-
name: string;
|
|
132
|
-
frontmatter: {
|
|
133
|
-
title: string;
|
|
134
|
-
description: string;
|
|
135
|
-
last_modified: string;
|
|
136
|
-
};
|
|
137
|
-
}[];
|
|
138
|
-
dirs: ({
|
|
139
|
-
path: string;
|
|
140
|
-
name: string;
|
|
141
|
-
} & /*elided*/ any)[];
|
|
142
|
-
}, z.ZodTypeDef, {
|
|
143
|
-
path: string;
|
|
144
62
|
name: string;
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
} & /*elided*/ any)[];
|
|
161
|
-
}>]>;
|
|
63
|
+
files: number[];
|
|
64
|
+
dirs: number[];
|
|
65
|
+
id: number;
|
|
66
|
+
}>;
|
|
67
|
+
type NormedFileNode = z.infer<typeof normedFileNode>;
|
|
68
|
+
type NormedDirNode = z.infer<typeof normedDirNode>;
|
|
69
|
+
|
|
70
|
+
type AbsPath = z.infer<typeof absPath>;
|
|
71
|
+
declare const absPath: z.ZodBranded<z.ZodString, "absPath">;
|
|
72
|
+
|
|
73
|
+
type Config = {
|
|
74
|
+
srcPath: AbsPath;
|
|
75
|
+
destPath: AbsPath;
|
|
76
|
+
ignore: boolean;
|
|
77
|
+
};
|
|
162
78
|
|
|
163
79
|
declare function runO2B(config: Config): void;
|
|
164
80
|
|
|
165
|
-
export { runO2B as default,
|
|
81
|
+
export { type NormedDirNode, type NormedFileNode, runO2B as default, normedDirNode, normedFileNode };
|
package/dist/index.js
CHANGED
|
@@ -31,8 +31,8 @@ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: tru
|
|
|
31
31
|
var index_exports = {};
|
|
32
32
|
__export(index_exports, {
|
|
33
33
|
default: () => runO2B,
|
|
34
|
-
|
|
35
|
-
|
|
34
|
+
normedDirNode: () => normedDirNode,
|
|
35
|
+
normedFileNode: () => normedFileNode
|
|
36
36
|
});
|
|
37
37
|
module.exports = __toCommonJS(index_exports);
|
|
38
38
|
|
|
@@ -50,27 +50,30 @@ var frontmatter = import_zod2.default.object({
|
|
|
50
50
|
description: import_zod2.default.string(),
|
|
51
51
|
last_modified: import_zod2.default.string()
|
|
52
52
|
});
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
var
|
|
72
|
-
|
|
73
|
-
|
|
53
|
+
var baseNode = import_zod2.default.object({
|
|
54
|
+
path: relPath,
|
|
55
|
+
name: import_zod2.default.string()
|
|
56
|
+
});
|
|
57
|
+
var fileNode = baseNode.extend({
|
|
58
|
+
type: import_zod2.default.literal("file"),
|
|
59
|
+
frontmatter
|
|
60
|
+
});
|
|
61
|
+
var dirNode = baseNode.extend({
|
|
62
|
+
type: import_zod2.default.literal("dir"),
|
|
63
|
+
files: import_zod2.default.array(fileNode),
|
|
64
|
+
dirs: import_zod2.default.lazy(() => dirNode.array())
|
|
65
|
+
});
|
|
66
|
+
var fileTree = import_zod2.default.union([dirNode, fileNode]);
|
|
67
|
+
var id = import_zod2.default.number().int();
|
|
68
|
+
var normedFileNode = fileNode.extend({
|
|
69
|
+
id
|
|
70
|
+
});
|
|
71
|
+
var normedDirNode = baseNode.extend({
|
|
72
|
+
id,
|
|
73
|
+
type: import_zod2.default.literal("dir"),
|
|
74
|
+
files: import_zod2.default.array(id),
|
|
75
|
+
dirs: import_zod2.default.array(id)
|
|
76
|
+
});
|
|
74
77
|
|
|
75
78
|
// src/core/sync/mirror.ts
|
|
76
79
|
var import_node_fs = require("fs");
|
|
@@ -93,22 +96,12 @@ function mirror(filetree, srcPath, destPath) {
|
|
|
93
96
|
}
|
|
94
97
|
}
|
|
95
98
|
aux(filetree);
|
|
96
|
-
generateFileTree(filetree, destPath);
|
|
97
|
-
}
|
|
98
|
-
function generateFileTree(filetree, destPath) {
|
|
99
|
-
const jsonFilePath = (0, import_node_path.join)(destPath, "o2bFileTree.json");
|
|
100
|
-
(0, import_node_fs.writeFileSync)(jsonFilePath, JSON.stringify(filetree, null, 2), "utf-8");
|
|
101
99
|
}
|
|
102
100
|
|
|
103
101
|
// src/core/sync/scan.ts
|
|
104
|
-
var import_node_fs4 = require("fs");
|
|
105
|
-
var import_node_path4 = require("path");
|
|
106
|
-
var import_gray_matter = __toESM(require("gray-matter"));
|
|
107
|
-
|
|
108
|
-
// src/utils/ignore.ts
|
|
109
102
|
var import_node_fs3 = require("fs");
|
|
110
103
|
var import_node_path3 = require("path");
|
|
111
|
-
var
|
|
104
|
+
var import_gray_matter = __toESM(require("gray-matter"));
|
|
112
105
|
|
|
113
106
|
// src/utils/path.ts
|
|
114
107
|
var import_node_fs2 = require("fs");
|
|
@@ -128,79 +121,117 @@ function isObsidianDirectory(path) {
|
|
|
128
121
|
return true;
|
|
129
122
|
}
|
|
130
123
|
|
|
131
|
-
// src/utils/ignore.ts
|
|
132
|
-
var VaultIgnorer = class {
|
|
133
|
-
ign;
|
|
134
|
-
rootPath;
|
|
135
|
-
constructor(rootPath) {
|
|
136
|
-
this.rootPath = rootPath;
|
|
137
|
-
this.ign = (0, import_ignore.default)();
|
|
138
|
-
this.ign.add([".*"]);
|
|
139
|
-
}
|
|
140
|
-
load() {
|
|
141
|
-
const ignorePath = (0, import_node_path3.join)(this.rootPath, ".o2bignore");
|
|
142
|
-
if ((0, import_node_fs3.existsSync)(ignorePath))
|
|
143
|
-
this.ign.add((0, import_node_fs3.readFileSync)(ignorePath).toString());
|
|
144
|
-
}
|
|
145
|
-
ignore(path) {
|
|
146
|
-
if (path === this.rootPath) return false;
|
|
147
|
-
if (!(0, import_node_fs3.existsSync)(path)) throw new Error("somethings wrong!");
|
|
148
|
-
const stat = (0, import_node_fs3.lstatSync)(path);
|
|
149
|
-
const relPath2 = toRelPath(this.rootPath, path) + (stat.isDirectory() ? "/" : "");
|
|
150
|
-
return this.ign.ignores(relPath2);
|
|
151
|
-
}
|
|
152
|
-
};
|
|
153
|
-
|
|
154
124
|
// src/core/sync/scan.ts
|
|
155
125
|
function scan(rootPath, ign) {
|
|
156
126
|
function aux(path) {
|
|
157
127
|
if (ign == null ? void 0 : ign.ignore(path)) return null;
|
|
158
|
-
const stat = (0,
|
|
159
|
-
const name = (0,
|
|
160
|
-
if (stat.
|
|
161
|
-
const { dirs, files } = (0, import_node_fs4.readdirSync)(path).reduce(
|
|
162
|
-
(acc, entry) => {
|
|
163
|
-
const node = aux(toAbsPath((0, import_node_path4.join)(path, entry)));
|
|
164
|
-
if ((node == null ? void 0 : node.type) === "dir") acc.dirs.push(node);
|
|
165
|
-
if ((node == null ? void 0 : node.type) === "file") acc.files.push(node);
|
|
166
|
-
return acc;
|
|
167
|
-
},
|
|
168
|
-
{
|
|
169
|
-
dirs: [],
|
|
170
|
-
files: []
|
|
171
|
-
}
|
|
172
|
-
);
|
|
128
|
+
const stat = (0, import_node_fs3.lstatSync)(path);
|
|
129
|
+
const name = (0, import_node_path3.basename)(path);
|
|
130
|
+
if (stat.isFile() && name.endsWith(".md")) {
|
|
173
131
|
return {
|
|
174
132
|
path: toRelPath(rootPath, path),
|
|
175
133
|
name,
|
|
176
|
-
type: "
|
|
177
|
-
|
|
178
|
-
files
|
|
134
|
+
type: "file",
|
|
135
|
+
frontmatter: fetchFrontmatter(path, stat.mtime)
|
|
179
136
|
};
|
|
180
137
|
}
|
|
181
|
-
if (stat.
|
|
138
|
+
if (stat.isDirectory()) {
|
|
139
|
+
const dirs = [];
|
|
140
|
+
const files = [];
|
|
141
|
+
const entries = (0, import_node_fs3.readdirSync)(path);
|
|
142
|
+
for (const entry of entries) {
|
|
143
|
+
const fullPath = toAbsPath((0, import_node_path3.join)(path, entry));
|
|
144
|
+
const node = aux(fullPath);
|
|
145
|
+
if ((node == null ? void 0 : node.type) === "dir") dirs.push(node);
|
|
146
|
+
if ((node == null ? void 0 : node.type) === "file") files.push(node);
|
|
147
|
+
}
|
|
182
148
|
return {
|
|
183
149
|
path: toRelPath(rootPath, path),
|
|
184
150
|
name,
|
|
185
|
-
type: "
|
|
186
|
-
|
|
151
|
+
type: "dir",
|
|
152
|
+
dirs,
|
|
153
|
+
files
|
|
187
154
|
};
|
|
188
155
|
}
|
|
189
156
|
return null;
|
|
190
157
|
}
|
|
191
158
|
return aux(rootPath);
|
|
192
159
|
}
|
|
193
|
-
function
|
|
194
|
-
const { data
|
|
160
|
+
function fetchFrontmatter(path, mtime) {
|
|
161
|
+
const { data } = (0, import_gray_matter.default)((0, import_node_fs3.readFileSync)(path, "utf-8"));
|
|
195
162
|
return {
|
|
196
|
-
title: (0,
|
|
163
|
+
title: (0, import_node_path3.basename)(path).replace(/\.md$/, ""),
|
|
197
164
|
description: "No description provided.",
|
|
198
|
-
last_modified:
|
|
199
|
-
|
|
200
|
-
...srcFrontmatter
|
|
165
|
+
last_modified: mtime.toISOString().split("T")[0],
|
|
166
|
+
...data
|
|
201
167
|
};
|
|
202
168
|
}
|
|
203
169
|
|
|
170
|
+
// src/utils/id.ts
|
|
171
|
+
var idCounter = (start = 0) => {
|
|
172
|
+
let count = start;
|
|
173
|
+
return () => count++;
|
|
174
|
+
};
|
|
175
|
+
|
|
176
|
+
// src/core/sync/normalize.ts
|
|
177
|
+
function normalize(fileTree2) {
|
|
178
|
+
const dirNodes = [];
|
|
179
|
+
const fileNodes = [];
|
|
180
|
+
const fileId = idCounter();
|
|
181
|
+
const dirId = idCounter();
|
|
182
|
+
function aux(dir) {
|
|
183
|
+
const id2 = dirId();
|
|
184
|
+
const files = dir.files.map((file) => {
|
|
185
|
+
const id3 = fileId();
|
|
186
|
+
fileNodes.push({ id: id3, ...file });
|
|
187
|
+
return id3;
|
|
188
|
+
});
|
|
189
|
+
const dirs = dir.dirs.map((dir2) => aux(dir2));
|
|
190
|
+
dirNodes.push({ ...dir, id: id2, files, dirs });
|
|
191
|
+
return id2;
|
|
192
|
+
}
|
|
193
|
+
aux(fileTree2);
|
|
194
|
+
return {
|
|
195
|
+
dirNodes,
|
|
196
|
+
fileNodes,
|
|
197
|
+
vault: dirNodes[dirNodes.length - 1]
|
|
198
|
+
};
|
|
199
|
+
}
|
|
200
|
+
|
|
201
|
+
// src/utils/file.ts
|
|
202
|
+
var import_node_fs4 = require("fs");
|
|
203
|
+
var import_node_path4 = require("path");
|
|
204
|
+
function generateJson(content, name, destPath) {
|
|
205
|
+
const jsonFilePath = (0, import_node_path4.join)(destPath, `${name}.json`);
|
|
206
|
+
(0, import_node_fs4.writeFileSync)(jsonFilePath, JSON.stringify(content, null, 2), "utf-8");
|
|
207
|
+
}
|
|
208
|
+
|
|
209
|
+
// src/utils/ignore.ts
|
|
210
|
+
var import_node_fs5 = require("fs");
|
|
211
|
+
var import_node_path5 = require("path");
|
|
212
|
+
var import_ignore = __toESM(require("ignore"));
|
|
213
|
+
var VaultIgnorer = class {
|
|
214
|
+
ign;
|
|
215
|
+
rootPath;
|
|
216
|
+
constructor(rootPath) {
|
|
217
|
+
this.rootPath = rootPath;
|
|
218
|
+
this.ign = (0, import_ignore.default)();
|
|
219
|
+
this.ign.add([".*"]);
|
|
220
|
+
}
|
|
221
|
+
load() {
|
|
222
|
+
const ignorePath = (0, import_node_path5.join)(this.rootPath, ".o2bignore");
|
|
223
|
+
if ((0, import_node_fs5.existsSync)(ignorePath))
|
|
224
|
+
this.ign.add((0, import_node_fs5.readFileSync)(ignorePath).toString());
|
|
225
|
+
}
|
|
226
|
+
ignore(path) {
|
|
227
|
+
if (path === this.rootPath) return false;
|
|
228
|
+
if (!(0, import_node_fs5.existsSync)(path)) throw new Error("somethings wrong!");
|
|
229
|
+
const stat = (0, import_node_fs5.lstatSync)(path);
|
|
230
|
+
const relPath2 = toRelPath(this.rootPath, path) + (stat.isDirectory() ? "/" : "");
|
|
231
|
+
return this.ign.ignores(relPath2);
|
|
232
|
+
}
|
|
233
|
+
};
|
|
234
|
+
|
|
204
235
|
// src/runO2B.ts
|
|
205
236
|
function runO2B(config) {
|
|
206
237
|
const { srcPath, destPath, ignore: ignore2 } = config;
|
|
@@ -209,11 +240,16 @@ function runO2B(config) {
|
|
|
209
240
|
if (ignore2) ign.load();
|
|
210
241
|
const fileTree2 = scan(srcPath, ign);
|
|
211
242
|
if (fileTree2 === null) throw new Error("No content in vault");
|
|
243
|
+
if (fileTree2.type !== "dir") throw new Error("No Vault?!");
|
|
212
244
|
mirror(fileTree2, srcPath, destPath);
|
|
245
|
+
const { vault, dirNodes, fileNodes } = normalize(fileTree2);
|
|
246
|
+
generateJson(vault, "vault", destPath);
|
|
247
|
+
generateJson(dirNodes, "dirNodes", destPath);
|
|
248
|
+
generateJson(fileNodes, "fileNodes", destPath);
|
|
213
249
|
}
|
|
214
250
|
// Annotate the CommonJS export names for ESM import in node:
|
|
215
251
|
0 && (module.exports = {
|
|
216
|
-
|
|
217
|
-
|
|
252
|
+
normedDirNode,
|
|
253
|
+
normedFileNode
|
|
218
254
|
});
|
|
219
255
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts","../src/types/filetree.ts","../src/types/path.ts","../src/core/sync/mirror.ts","../src/core/sync/scan.ts","../src/utils/ignore.ts","../src/utils/path.ts","../src/runO2B.ts"],"sourcesContent":["export { fileTree, jsonFileTree } from \"./types\";\nexport { default } from \"./runO2B\";\n","import z from \"zod\";\nimport { relPath, type RelPath } from \"./path\";\n\nconst frontmatter = z.object({\n title: z.string(),\n description: z.string(),\n last_modified: z.string(),\n});\n\nfunction createFileTreeSchema<P extends typeof relPath | z.ZodString>(path: P) {\n type BaseNode = z.infer<typeof baseNode>;\n const baseNode = z.object({\n path,\n name: z.string(),\n });\n\n type FileNodeOutput = z.infer<typeof fileNode>;\n type FileNodeInput = z.input<typeof fileNode>;\n const fileNode = baseNode.extend({\n type: z.literal(\"file\"),\n frontmatter: frontmatter,\n });\n\n // https://v3.zod.dev/?id=recursive-types\n type DirNodeOutput = BaseNode & {\n type: \"dir\";\n files: FileNodeOutput[];\n dirs: DirNodeOutput[];\n };\n type DirNodeInput = z.input<typeof baseNode> & {\n type: \"dir\";\n files: FileNodeInput[];\n dirs: DirNodeInput[];\n };\n\n const dirNode: z.ZodType<DirNodeOutput, z.ZodTypeDef, DirNodeInput> =\n baseNode.extend({\n type: z.literal(\"dir\"),\n files: z.array(fileNode),\n dirs: z.lazy(() => dirNode.array()),\n });\n\n const fileTree = z.union([fileNode, dirNode]);\n\n return { fileTree, dirNode, fileNode };\n}\n\nconst defaultSchema = createFileTreeSchema(relPath);\nconst jsonSchema = createFileTreeSchema(z.string());\n\nexport const fileTree = defaultSchema.fileTree;\nexport const jsonFileTree = jsonSchema.fileTree;\n\nexport type FileTree = z.infer<typeof defaultSchema.fileTree>;\nexport type FileNode = z.infer<typeof defaultSchema.fileNode>;\nexport type DirNode = z.infer<typeof defaultSchema.dirNode>;\nexport type Frontmatter = z.infer<typeof frontmatter>;\n","import z from \"zod\";\n\ntype AbsPath = z.infer<typeof absPath>;\nconst absPath = z.string().brand<\"absPath\">();\n\ntype RelPath = z.infer<typeof relPath>;\nconst relPath = z.string().brand<\"relpath\">();\n\nexport { type AbsPath, type RelPath, absPath, relPath };\n","import { copyFileSync, existsSync, mkdirSync, writeFileSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport type { AbsPath, FileTree } from \"../../types\";\n\nexport function mirror(\n\tfiletree: FileTree,\n\tsrcPath: AbsPath,\n\tdestPath: AbsPath,\n) {\n\tfunction aux(filetree: FileTree) {\n\t\tconst from = join(srcPath, filetree.path);\n\t\tconst to = join(destPath, filetree.path);\n\n\t\tif (filetree.type === \"dir\") {\n\t\t\tif (!existsSync(to)) mkdirSync(to, { recursive: true });\n\n\t\t\tfiletree.files.forEach((file) => {\n\t\t\t\taux(file);\n\t\t\t});\n\n\t\t\tfiletree.dirs.forEach((dir) => {\n\t\t\t\taux(dir);\n\t\t\t});\n\t\t}\n\n\t\tif (filetree.type === \"file\") {\n\t\t\tcopyFileSync(from, to);\n\t\t}\n\t}\n\n\taux(filetree);\n\tgenerateFileTree(filetree, destPath);\n}\n\nfunction generateFileTree(filetree: FileTree, destPath: AbsPath) {\n\tconst jsonFilePath = join(destPath, \"o2bFileTree.json\");\n\twriteFileSync(jsonFilePath, JSON.stringify(filetree, null, 2), \"utf-8\");\n}\n","import { lstatSync, readdirSync, readFileSync } from \"node:fs\";\nimport { basename, join } from \"node:path\";\nimport matter from \"gray-matter\";\nimport type {\n\tAbsPath,\n\tDirNode,\n\tFileNode,\n\tFileTree,\n\tFrontmatter,\n} from \"../../types\";\nimport { toAbsPath, toRelPath, type VaultIgnorer } from \"../../utils\";\n\nexport function scan(rootPath: AbsPath, ign: VaultIgnorer): FileTree | null {\n\tfunction aux(path: AbsPath): FileTree | null {\n\t\tif (ign?.ignore(path)) return null;\n\n\t\tconst stat = lstatSync(path);\n\t\tconst name = basename(path);\n\n\t\tif (stat.isDirectory()) {\n\t\t\tconst { dirs, files } = readdirSync(path).reduce(\n\t\t\t\t(acc, entry) => {\n\t\t\t\t\tconst node = aux(toAbsPath(join(path, entry)));\n\n\t\t\t\t\tif (node?.type === \"dir\") acc.dirs.push(node);\n\t\t\t\t\tif (node?.type === \"file\") acc.files.push(node);\n\n\t\t\t\t\treturn acc;\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tdirs: [] as DirNode[],\n\t\t\t\t\tfiles: [] as FileNode[],\n\t\t\t\t},\n\t\t\t);\n\n\t\t\treturn {\n\t\t\t\tpath: toRelPath(rootPath, path),\n\t\t\t\tname,\n\t\t\t\ttype: \"dir\",\n\t\t\t\tdirs,\n\t\t\t\tfiles,\n\t\t\t};\n\t\t}\n\n\t\tif (stat.isFile() && name.endsWith(\".md\")) {\n\t\t\treturn {\n\t\t\t\tpath: toRelPath(rootPath, path),\n\t\t\t\tname,\n\t\t\t\ttype: \"file\",\n\t\t\t\tfrontmatter: getFrontmatter(path),\n\t\t\t};\n\t\t}\n\n\t\treturn null;\n\t}\n\n\treturn aux(rootPath);\n}\n\nfunction getFrontmatter(path: AbsPath): Frontmatter {\n\tconst { data: srcFrontmatter } = matter(readFileSync(path, \"utf-8\"));\n\treturn {\n\t\ttitle: basename(path).replace(/\\.md$/, \"\"),\n\t\tdescription: \"No description provided.\",\n\t\tlast_modified: lstatSync(path).mtime.toLocaleDateString(\"sv-SE\"), // \"sv-SE\" (스웨덴어)는 YYYY-MM-DD 형식으로 출력되는 유명한 트릭입니다.\n\t\t...srcFrontmatter,\n\t};\n}\n","import { existsSync, lstatSync, readFileSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport ignore, { type Ignore } from \"ignore\";\nimport type { AbsPath } from \"../types\";\nimport { toRelPath } from \"./path\";\n\nexport class VaultIgnorer {\n\tprivate ign: Ignore;\n\tprivate rootPath: AbsPath;\n\n\tconstructor(rootPath: AbsPath) {\n\t\tthis.rootPath = rootPath;\n\t\tthis.ign = ignore();\n\n\t\tthis.ign.add([\".*\"]);\n\t}\n\n\tpublic load() {\n\t\tconst ignorePath = join(this.rootPath, \".o2bignore\");\n\t\tif (existsSync(ignorePath))\n\t\t\tthis.ign.add(readFileSync(ignorePath).toString());\n\t}\n\n\tpublic ignore(path: AbsPath): boolean {\n\t\tif (path === this.rootPath) return false;\n\n\t\tif (!existsSync(path)) throw new Error(\"somethings wrong!\");\n\n\t\tconst stat = lstatSync(path);\n\n\t\tconst relPath =\n\t\t\ttoRelPath(this.rootPath, path) + (stat.isDirectory() ? \"/\" : \"\");\n\n\t\treturn this.ign.ignores(relPath);\n\t}\n}\n","import { lstatSync, readdirSync } from \"node:fs\";\nimport { isAbsolute, relative, resolve } from \"node:path\";\nimport { absPath, relPath, type AbsPath, type RelPath } from \"../types\";\n\nfunction toAbsPath(path: string): AbsPath {\n if (!isAbsolute(path)) path = resolve(path);\n return absPath.parse(path);\n}\n\nfunction toRelPath(from: AbsPath, to: AbsPath): RelPath {\n return relPath.parse(relative(from, to));\n}\n\nfunction isObsidianDirectory(path: AbsPath) {\n const stat = lstatSync(path);\n\n if (!stat.isDirectory()) return false;\n\n const obsMetaDir = readdirSync(path, { withFileTypes: true })\n .filter((node) => node.isDirectory())\n .filter((node) => node.name === \".obsidian\");\n\n if (obsMetaDir.length !== 1) return false;\n\n return true;\n}\n\nexport { toAbsPath, toRelPath, isObsidianDirectory };\n","import { mirror, scan } from \"./core/sync\";\nimport type { Config } from \"./types\";\nimport { isObsidianDirectory, VaultIgnorer } from \"./utils\";\n\nexport default function runO2B(config: Config) {\n const { srcPath, destPath, ignore } = config;\n if (!isObsidianDirectory(srcPath)) throw new Error(\"Not a obsidian vault\");\n\n const ign = new VaultIgnorer(srcPath);\n if (ignore) ign.load();\n\n const fileTree = scan(srcPath, ign);\n if (fileTree === null) throw new Error(\"No content in vault\");\n\n mirror(fileTree, srcPath, destPath);\n}\n"],"mappings":"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","names":["import_zod","z","z","fileTree","filetree","import_node_fs","import_node_path","import_node_fs","import_node_path","import_node_fs","import_node_path","ignore","relPath","matter","ignore","fileTree"]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/types/filetree.ts","../src/types/path.ts","../src/core/sync/mirror.ts","../src/core/sync/scan.ts","../src/utils/path.ts","../src/utils/id.ts","../src/core/sync/normalize.ts","../src/utils/file.ts","../src/utils/ignore.ts","../src/runO2B.ts"],"sourcesContent":["export {\n NormedDirNode,\n NormedFileNode,\n normedDirNode,\n normedFileNode,\n} from \"@o2bTypes/filetree\";\nexport { default } from \"./runO2B\";\n","import z from \"zod\";\nimport { relPath, type RelPath } from \"@o2bTypes/path\";\n\n/* ********** Schemas ********** */\n\nconst frontmatter = z.object({\n title: z.string(),\n description: z.string(),\n last_modified: z.string(),\n});\n\nconst baseNode = z.object({\n path: relPath,\n name: z.string(),\n});\n\nconst fileNode = baseNode.extend({\n type: z.literal(\"file\"),\n frontmatter: frontmatter,\n});\n\nconst dirNode: z.ZodType<DirNodeOutput, z.ZodTypeDef, DirNodeInput> =\n baseNode.extend({\n type: z.literal(\"dir\"),\n files: z.array(fileNode),\n dirs: z.lazy(() => dirNode.array()),\n });\n\nconst fileTree = z.union([dirNode, fileNode]);\n\n/* ********** Types ********** */\n\ntype BaseNodeOutput = z.infer<typeof baseNode>;\ntype BaseNodeInput = z.input<typeof baseNode>;\n\ntype FileNodeOutput = z.infer<typeof fileNode>;\ntype FileNodeInput = z.input<typeof fileNode>;\n\n// https://v3.zod.dev/?id=recursive-types\ntype DirNodeOutput = BaseNodeOutput & {\n type: \"dir\";\n files: FileNodeOutput[];\n dirs: DirNodeOutput[];\n};\ntype DirNodeInput = BaseNodeInput & {\n type: \"dir\";\n files: FileNodeInput[];\n dirs: DirNodeInput[];\n};\n\nexport type FileTree = z.infer<typeof fileTree>;\nexport type DirNode = DirNodeOutput;\nexport type FileNode = FileNodeOutput;\nexport type Frontmatter = z.infer<typeof frontmatter>;\n\n/* ********** Normalized ********** */\n\nconst id = z.number().int();\n\nexport const normedFileNode = fileNode.extend({\n id,\n});\n\nexport const normedDirNode = baseNode.extend({\n id,\n type: z.literal(\"dir\"),\n files: z.array(id),\n dirs: z.array(id),\n});\n\nexport type Id = z.infer<typeof id>;\nexport type NormedFileNode = z.infer<typeof normedFileNode>;\nexport type NormedDirNode = z.infer<typeof normedDirNode>;\n","import z from \"zod\";\n\ntype AbsPath = z.infer<typeof absPath>;\nconst absPath = z.string().brand<\"absPath\">();\n\ntype RelPath = z.infer<typeof relPath>;\nconst relPath = z.string().brand<\"relpath\">();\n\nexport { type AbsPath, type RelPath, absPath, relPath };\n","import { copyFileSync, existsSync, mkdirSync, writeFileSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport type { AbsPath } from \"@o2bTypes/path\";\nimport type { FileTree } from \"@o2bTypes/filetree\";\n\nexport function mirror(\n filetree: FileTree,\n srcPath: AbsPath,\n destPath: AbsPath,\n) {\n function aux(filetree: FileTree) {\n const from = join(srcPath, filetree.path);\n const to = join(destPath, filetree.path);\n\n if (filetree.type === \"dir\") {\n if (!existsSync(to)) mkdirSync(to, { recursive: true });\n\n filetree.files.forEach((file) => {\n aux(file);\n });\n\n filetree.dirs.forEach((dir) => {\n aux(dir);\n });\n }\n\n if (filetree.type === \"file\") {\n copyFileSync(from, to);\n }\n }\n\n aux(filetree);\n}\n","import { lstatSync, readdirSync, readFileSync } from \"node:fs\";\nimport { basename, join } from \"node:path\";\nimport matter from \"gray-matter\";\nimport type {\n DirNode,\n FileNode,\n FileTree,\n Frontmatter,\n} from \"@o2bTypes/filetree\";\nimport { toAbsPath, toRelPath } from \"@utils/path\";\nimport { AbsPath } from \"@o2bTypes/path\";\nimport { VaultIgnorer } from \"@utils/ignore\";\n\nexport function scan(rootPath: AbsPath, ign: VaultIgnorer): FileTree | null {\n function aux(path: AbsPath): FileTree | null {\n if (ign?.ignore(path)) return null;\n\n const stat = lstatSync(path);\n const name = basename(path);\n\n if (stat.isFile() && name.endsWith(\".md\")) {\n return {\n path: toRelPath(rootPath, path),\n name,\n type: \"file\",\n frontmatter: fetchFrontmatter(path, stat.mtime),\n };\n }\n\n if (stat.isDirectory()) {\n const dirs: DirNode[] = [];\n const files: FileNode[] = [];\n const entries = readdirSync(path);\n\n for (const entry of entries) {\n const fullPath = toAbsPath(join(path, entry));\n const node = aux(fullPath);\n\n if (node?.type === \"dir\") dirs.push(node);\n if (node?.type === \"file\") files.push(node);\n }\n\n return {\n path: toRelPath(rootPath, path),\n name,\n type: \"dir\",\n dirs,\n files,\n };\n }\n\n return null;\n }\n\n return aux(rootPath);\n}\n\nfunction fetchFrontmatter(path: AbsPath, mtime: Date): Frontmatter {\n const { data } = matter(readFileSync(path, \"utf-8\"));\n return {\n title: basename(path).replace(/\\.md$/, \"\"),\n description: \"No description provided.\",\n last_modified: mtime.toISOString().split(\"T\")[0],\n ...data,\n };\n}\n","import { lstatSync, readdirSync } from \"node:fs\";\nimport { isAbsolute, relative, resolve } from \"node:path\";\nimport { absPath, relPath, type AbsPath, type RelPath } from \"@o2bTypes/path\";\n\nfunction toAbsPath(path: string): AbsPath {\n if (!isAbsolute(path)) path = resolve(path);\n return absPath.parse(path);\n}\n\nfunction toRelPath(from: AbsPath, to: AbsPath): RelPath {\n return relPath.parse(relative(from, to));\n}\n\nfunction isObsidianDirectory(path: AbsPath) {\n const stat = lstatSync(path);\n\n if (!stat.isDirectory()) return false;\n\n const obsMetaDir = readdirSync(path, { withFileTypes: true })\n .filter((node) => node.isDirectory())\n .filter((node) => node.name === \".obsidian\");\n\n if (obsMetaDir.length !== 1) return false;\n\n return true;\n}\n\nexport { toAbsPath, toRelPath, isObsidianDirectory };\n","import { Id } from \"@o2bTypes/filetree\";\n\nexport const idCounter: (start?: number) => () => Id = (start: number = 0) => {\n let count = start;\n return () => count++;\n};\n","import { DirNode, Id, NormedDirNode, NormedFileNode } from \"@o2bTypes/filetree\";\nimport { idCounter } from \"@utils/id\";\n\nexport function normalize(fileTree: DirNode): {\n vault: NormedDirNode;\n dirNodes: NormedDirNode[];\n fileNodes: NormedFileNode[];\n} {\n const dirNodes: NormedDirNode[] = [];\n const fileNodes: NormedFileNode[] = [];\n\n const fileId = idCounter();\n const dirId = idCounter();\n\n function aux(dir: DirNode): Id {\n const id = dirId();\n\n const files = dir.files.map((file) => {\n const id = fileId();\n fileNodes.push({ id, ...file });\n return id;\n });\n\n const dirs = dir.dirs.map((dir) => aux(dir));\n dirNodes.push({ ...dir, id, files, dirs });\n\n return id;\n }\n aux(fileTree);\n\n return {\n dirNodes,\n fileNodes,\n vault: dirNodes[dirNodes.length - 1],\n };\n}\n","import { writeFileSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport { AbsPath } from \"@o2bTypes/path\";\n\nexport function generateJson(\n content: unknown,\n name: string,\n destPath: AbsPath,\n) {\n const jsonFilePath = join(destPath, `${name}.json`);\n writeFileSync(jsonFilePath, JSON.stringify(content, null, 2), \"utf-8\");\n}\n","import { existsSync, lstatSync, readFileSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport ignore, { type Ignore } from \"ignore\";\n\nimport type { AbsPath } from \"@o2bTypes/path\";\nimport { toRelPath } from \"@utils/path\";\n\nexport class VaultIgnorer {\n private ign: Ignore;\n private rootPath: AbsPath;\n\n constructor(rootPath: AbsPath) {\n this.rootPath = rootPath;\n this.ign = ignore();\n\n this.ign.add([\".*\"]);\n }\n\n public load() {\n const ignorePath = join(this.rootPath, \".o2bignore\");\n if (existsSync(ignorePath))\n this.ign.add(readFileSync(ignorePath).toString());\n }\n\n public ignore(path: AbsPath): boolean {\n if (path === this.rootPath) return false;\n\n if (!existsSync(path)) throw new Error(\"somethings wrong!\");\n\n const stat = lstatSync(path);\n\n const relPath =\n toRelPath(this.rootPath, path) + (stat.isDirectory() ? \"/\" : \"\");\n\n return this.ign.ignores(relPath);\n }\n}\n","import { mirror, scan, normalize } from \"@core/sync\";\nimport type { Config } from \"@o2bTypes/config\";\nimport { generateJson } from \"@utils/file\";\nimport { isObsidianDirectory } from \"@utils/path\";\nimport { VaultIgnorer } from \"@utils/ignore\";\n\nexport default function runO2B(config: Config) {\n const { srcPath, destPath, ignore } = config;\n\n if (!isObsidianDirectory(srcPath)) throw new Error(\"Not a obsidian vault\");\n\n const ign = new VaultIgnorer(srcPath);\n if (ignore) ign.load();\n\n const fileTree = scan(srcPath, ign);\n if (fileTree === null) throw new Error(\"No content in vault\");\n if (fileTree.type !== \"dir\") throw new Error(\"No Vault?!\");\n\n mirror(fileTree, srcPath, destPath);\n const { vault, dirNodes, fileNodes } = normalize(fileTree);\n\n generateJson(vault, \"vault\", destPath);\n generateJson(dirNodes, \"dirNodes\", destPath);\n generateJson(fileNodes, \"fileNodes\", destPath);\n}\n"],"mappings":"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","names":["import_zod","z","z","filetree","import_node_fs","import_node_path","import_node_fs","import_node_path","matter","fileTree","id","dir","import_node_fs","import_node_path","import_node_fs","import_node_path","ignore","relPath","ignore","fileTree"]}
|