@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/cli.js
CHANGED
|
@@ -29,7 +29,7 @@ var import_cac = __toESM(require("cac"));
|
|
|
29
29
|
// package.json
|
|
30
30
|
var package_default = {
|
|
31
31
|
name: "@o2b/meta",
|
|
32
|
-
version: "1.0.0-dev.
|
|
32
|
+
version: "1.0.0-dev.5",
|
|
33
33
|
description: "filetree generator for o2b",
|
|
34
34
|
main: "./dist/index.js",
|
|
35
35
|
module: "./dist/index.mjs",
|
|
@@ -42,7 +42,7 @@ var package_default = {
|
|
|
42
42
|
}
|
|
43
43
|
},
|
|
44
44
|
bin: {
|
|
45
|
-
"o2b-meta": "
|
|
45
|
+
"o2b-meta": "dist/cli.js"
|
|
46
46
|
},
|
|
47
47
|
scripts: {
|
|
48
48
|
build: "tsup",
|
|
@@ -62,6 +62,7 @@ var package_default = {
|
|
|
62
62
|
"@vitest/ui": "^4.0.16",
|
|
63
63
|
tsup: "^8.5.1",
|
|
64
64
|
typescript: "^5.9.3",
|
|
65
|
+
"vite-tsconfig-paths": "^6.0.5",
|
|
65
66
|
vitest: "^4.0.16",
|
|
66
67
|
zod: "^3.25.76"
|
|
67
68
|
},
|
|
@@ -97,63 +98,22 @@ function mirror(filetree, srcPath, destPath) {
|
|
|
97
98
|
}
|
|
98
99
|
}
|
|
99
100
|
aux(filetree);
|
|
100
|
-
generateFileTree(filetree, destPath);
|
|
101
|
-
}
|
|
102
|
-
function generateFileTree(filetree, destPath) {
|
|
103
|
-
const jsonFilePath = (0, import_node_path.join)(destPath, "o2bFileTree.json");
|
|
104
|
-
(0, import_node_fs.writeFileSync)(jsonFilePath, JSON.stringify(filetree, null, 2), "utf-8");
|
|
105
101
|
}
|
|
106
102
|
|
|
107
103
|
// src/core/sync/scan.ts
|
|
108
|
-
var import_node_fs4 = require("fs");
|
|
109
|
-
var import_node_path4 = require("path");
|
|
110
|
-
var import_gray_matter = __toESM(require("gray-matter"));
|
|
111
|
-
|
|
112
|
-
// src/utils/ignore.ts
|
|
113
104
|
var import_node_fs3 = require("fs");
|
|
114
105
|
var import_node_path3 = require("path");
|
|
115
|
-
var
|
|
106
|
+
var import_gray_matter = __toESM(require("gray-matter"));
|
|
116
107
|
|
|
117
108
|
// src/utils/path.ts
|
|
118
109
|
var import_node_fs2 = require("fs");
|
|
119
110
|
var import_node_path2 = require("path");
|
|
120
111
|
|
|
121
|
-
// src/types/filetree.ts
|
|
122
|
-
var import_zod2 = __toESM(require("zod"));
|
|
123
|
-
|
|
124
112
|
// src/types/path.ts
|
|
125
113
|
var import_zod = __toESM(require("zod"));
|
|
126
114
|
var absPath = import_zod.default.string().brand();
|
|
127
115
|
var relPath = import_zod.default.string().brand();
|
|
128
116
|
|
|
129
|
-
// src/types/filetree.ts
|
|
130
|
-
var frontmatter = import_zod2.default.object({
|
|
131
|
-
title: import_zod2.default.string(),
|
|
132
|
-
description: import_zod2.default.string(),
|
|
133
|
-
last_modified: import_zod2.default.string()
|
|
134
|
-
});
|
|
135
|
-
function createFileTreeSchema(path) {
|
|
136
|
-
const baseNode = import_zod2.default.object({
|
|
137
|
-
path,
|
|
138
|
-
name: import_zod2.default.string()
|
|
139
|
-
});
|
|
140
|
-
const fileNode = baseNode.extend({
|
|
141
|
-
type: import_zod2.default.literal("file"),
|
|
142
|
-
frontmatter
|
|
143
|
-
});
|
|
144
|
-
const dirNode = baseNode.extend({
|
|
145
|
-
type: import_zod2.default.literal("dir"),
|
|
146
|
-
files: import_zod2.default.array(fileNode),
|
|
147
|
-
dirs: import_zod2.default.lazy(() => dirNode.array())
|
|
148
|
-
});
|
|
149
|
-
const fileTree2 = import_zod2.default.union([fileNode, dirNode]);
|
|
150
|
-
return { fileTree: fileTree2, dirNode, fileNode };
|
|
151
|
-
}
|
|
152
|
-
var defaultSchema = createFileTreeSchema(relPath);
|
|
153
|
-
var jsonSchema = createFileTreeSchema(import_zod2.default.string());
|
|
154
|
-
var fileTree = defaultSchema.fileTree;
|
|
155
|
-
var jsonFileTree = jsonSchema.fileTree;
|
|
156
|
-
|
|
157
117
|
// src/utils/path.ts
|
|
158
118
|
function toAbsPath(path) {
|
|
159
119
|
if (!(0, import_node_path2.isAbsolute)(path)) path = (0, import_node_path2.resolve)(path);
|
|
@@ -170,88 +130,131 @@ function isObsidianDirectory(path) {
|
|
|
170
130
|
return true;
|
|
171
131
|
}
|
|
172
132
|
|
|
173
|
-
// src/utils/ignore.ts
|
|
174
|
-
var VaultIgnorer = class {
|
|
175
|
-
ign;
|
|
176
|
-
rootPath;
|
|
177
|
-
constructor(rootPath) {
|
|
178
|
-
this.rootPath = rootPath;
|
|
179
|
-
this.ign = (0, import_ignore.default)();
|
|
180
|
-
this.ign.add([".*"]);
|
|
181
|
-
}
|
|
182
|
-
load() {
|
|
183
|
-
const ignorePath = (0, import_node_path3.join)(this.rootPath, ".o2bignore");
|
|
184
|
-
if ((0, import_node_fs3.existsSync)(ignorePath))
|
|
185
|
-
this.ign.add((0, import_node_fs3.readFileSync)(ignorePath).toString());
|
|
186
|
-
}
|
|
187
|
-
ignore(path) {
|
|
188
|
-
if (path === this.rootPath) return false;
|
|
189
|
-
if (!(0, import_node_fs3.existsSync)(path)) throw new Error("somethings wrong!");
|
|
190
|
-
const stat = (0, import_node_fs3.lstatSync)(path);
|
|
191
|
-
const relPath2 = toRelPath(this.rootPath, path) + (stat.isDirectory() ? "/" : "");
|
|
192
|
-
return this.ign.ignores(relPath2);
|
|
193
|
-
}
|
|
194
|
-
};
|
|
195
|
-
|
|
196
133
|
// src/core/sync/scan.ts
|
|
197
134
|
function scan(rootPath, ign) {
|
|
198
135
|
function aux(path) {
|
|
199
136
|
if (ign == null ? void 0 : ign.ignore(path)) return null;
|
|
200
|
-
const stat = (0,
|
|
201
|
-
const name = (0,
|
|
202
|
-
if (stat.
|
|
203
|
-
const { dirs, files } = (0, import_node_fs4.readdirSync)(path).reduce(
|
|
204
|
-
(acc, entry) => {
|
|
205
|
-
const node = aux(toAbsPath((0, import_node_path4.join)(path, entry)));
|
|
206
|
-
if ((node == null ? void 0 : node.type) === "dir") acc.dirs.push(node);
|
|
207
|
-
if ((node == null ? void 0 : node.type) === "file") acc.files.push(node);
|
|
208
|
-
return acc;
|
|
209
|
-
},
|
|
210
|
-
{
|
|
211
|
-
dirs: [],
|
|
212
|
-
files: []
|
|
213
|
-
}
|
|
214
|
-
);
|
|
137
|
+
const stat = (0, import_node_fs3.lstatSync)(path);
|
|
138
|
+
const name = (0, import_node_path3.basename)(path);
|
|
139
|
+
if (stat.isFile() && name.endsWith(".md")) {
|
|
215
140
|
return {
|
|
216
141
|
path: toRelPath(rootPath, path),
|
|
217
142
|
name,
|
|
218
|
-
type: "
|
|
219
|
-
|
|
220
|
-
files
|
|
143
|
+
type: "file",
|
|
144
|
+
frontmatter: fetchFrontmatter(path, stat.mtime)
|
|
221
145
|
};
|
|
222
146
|
}
|
|
223
|
-
if (stat.
|
|
147
|
+
if (stat.isDirectory()) {
|
|
148
|
+
const dirs = [];
|
|
149
|
+
const files = [];
|
|
150
|
+
const entries = (0, import_node_fs3.readdirSync)(path);
|
|
151
|
+
for (const entry of entries) {
|
|
152
|
+
const fullPath = toAbsPath((0, import_node_path3.join)(path, entry));
|
|
153
|
+
const node = aux(fullPath);
|
|
154
|
+
if ((node == null ? void 0 : node.type) === "dir") dirs.push(node);
|
|
155
|
+
if ((node == null ? void 0 : node.type) === "file") files.push(node);
|
|
156
|
+
}
|
|
224
157
|
return {
|
|
225
158
|
path: toRelPath(rootPath, path),
|
|
226
159
|
name,
|
|
227
|
-
type: "
|
|
228
|
-
|
|
160
|
+
type: "dir",
|
|
161
|
+
dirs,
|
|
162
|
+
files
|
|
229
163
|
};
|
|
230
164
|
}
|
|
231
165
|
return null;
|
|
232
166
|
}
|
|
233
167
|
return aux(rootPath);
|
|
234
168
|
}
|
|
235
|
-
function
|
|
236
|
-
const { data
|
|
169
|
+
function fetchFrontmatter(path, mtime) {
|
|
170
|
+
const { data } = (0, import_gray_matter.default)((0, import_node_fs3.readFileSync)(path, "utf-8"));
|
|
237
171
|
return {
|
|
238
|
-
title: (0,
|
|
172
|
+
title: (0, import_node_path3.basename)(path).replace(/\.md$/, ""),
|
|
239
173
|
description: "No description provided.",
|
|
240
|
-
last_modified:
|
|
241
|
-
|
|
242
|
-
...srcFrontmatter
|
|
174
|
+
last_modified: mtime.toISOString().split("T")[0],
|
|
175
|
+
...data
|
|
243
176
|
};
|
|
244
177
|
}
|
|
245
178
|
|
|
179
|
+
// src/utils/id.ts
|
|
180
|
+
var idCounter = (start = 0) => {
|
|
181
|
+
let count = start;
|
|
182
|
+
return () => count++;
|
|
183
|
+
};
|
|
184
|
+
|
|
185
|
+
// src/core/sync/normalize.ts
|
|
186
|
+
function normalize(fileTree) {
|
|
187
|
+
const dirNodes = [];
|
|
188
|
+
const fileNodes = [];
|
|
189
|
+
const fileId = idCounter();
|
|
190
|
+
const dirId = idCounter();
|
|
191
|
+
function aux(dir) {
|
|
192
|
+
const id = dirId();
|
|
193
|
+
const files = dir.files.map((file) => {
|
|
194
|
+
const id2 = fileId();
|
|
195
|
+
fileNodes.push({ id: id2, ...file });
|
|
196
|
+
return id2;
|
|
197
|
+
});
|
|
198
|
+
const dirs = dir.dirs.map((dir2) => aux(dir2));
|
|
199
|
+
dirNodes.push({ ...dir, id, files, dirs });
|
|
200
|
+
return id;
|
|
201
|
+
}
|
|
202
|
+
aux(fileTree);
|
|
203
|
+
return {
|
|
204
|
+
dirNodes,
|
|
205
|
+
fileNodes,
|
|
206
|
+
vault: dirNodes[dirNodes.length - 1]
|
|
207
|
+
};
|
|
208
|
+
}
|
|
209
|
+
|
|
210
|
+
// src/utils/file.ts
|
|
211
|
+
var import_node_fs4 = require("fs");
|
|
212
|
+
var import_node_path4 = require("path");
|
|
213
|
+
function generateJson(content, name, destPath) {
|
|
214
|
+
const jsonFilePath = (0, import_node_path4.join)(destPath, `${name}.json`);
|
|
215
|
+
(0, import_node_fs4.writeFileSync)(jsonFilePath, JSON.stringify(content, null, 2), "utf-8");
|
|
216
|
+
}
|
|
217
|
+
|
|
218
|
+
// src/utils/ignore.ts
|
|
219
|
+
var import_node_fs5 = require("fs");
|
|
220
|
+
var import_node_path5 = require("path");
|
|
221
|
+
var import_ignore = __toESM(require("ignore"));
|
|
222
|
+
var VaultIgnorer = class {
|
|
223
|
+
ign;
|
|
224
|
+
rootPath;
|
|
225
|
+
constructor(rootPath) {
|
|
226
|
+
this.rootPath = rootPath;
|
|
227
|
+
this.ign = (0, import_ignore.default)();
|
|
228
|
+
this.ign.add([".*"]);
|
|
229
|
+
}
|
|
230
|
+
load() {
|
|
231
|
+
const ignorePath = (0, import_node_path5.join)(this.rootPath, ".o2bignore");
|
|
232
|
+
if ((0, import_node_fs5.existsSync)(ignorePath))
|
|
233
|
+
this.ign.add((0, import_node_fs5.readFileSync)(ignorePath).toString());
|
|
234
|
+
}
|
|
235
|
+
ignore(path) {
|
|
236
|
+
if (path === this.rootPath) return false;
|
|
237
|
+
if (!(0, import_node_fs5.existsSync)(path)) throw new Error("somethings wrong!");
|
|
238
|
+
const stat = (0, import_node_fs5.lstatSync)(path);
|
|
239
|
+
const relPath2 = toRelPath(this.rootPath, path) + (stat.isDirectory() ? "/" : "");
|
|
240
|
+
return this.ign.ignores(relPath2);
|
|
241
|
+
}
|
|
242
|
+
};
|
|
243
|
+
|
|
246
244
|
// src/runO2B.ts
|
|
247
245
|
function runO2B(config) {
|
|
248
246
|
const { srcPath, destPath, ignore: ignore2 } = config;
|
|
249
247
|
if (!isObsidianDirectory(srcPath)) throw new Error("Not a obsidian vault");
|
|
250
248
|
const ign = new VaultIgnorer(srcPath);
|
|
251
249
|
if (ignore2) ign.load();
|
|
252
|
-
const
|
|
253
|
-
if (
|
|
254
|
-
|
|
250
|
+
const fileTree = scan(srcPath, ign);
|
|
251
|
+
if (fileTree === null) throw new Error("No content in vault");
|
|
252
|
+
if (fileTree.type !== "dir") throw new Error("No Vault?!");
|
|
253
|
+
mirror(fileTree, srcPath, destPath);
|
|
254
|
+
const { vault, dirNodes, fileNodes } = normalize(fileTree);
|
|
255
|
+
generateJson(vault, "vault", destPath);
|
|
256
|
+
generateJson(dirNodes, "dirNodes", destPath);
|
|
257
|
+
generateJson(fileNodes, "fileNodes", destPath);
|
|
255
258
|
}
|
|
256
259
|
|
|
257
260
|
// src/cli.ts
|
package/dist/cli.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/cli.ts","../package.json","../src/core/sync/mirror.ts","../src/core/sync/scan.ts","../src/utils/ignore.ts","../src/utils/path.ts","../src/types/filetree.ts","../src/types/path.ts","../src/runO2B.ts"],"sourcesContent":["import cac from \"cac\";\nimport pkg from \"../package.json\";\nimport runO2B from \"./runO2B\";\nimport { toAbsPath } from \"./utils\";\n\nconst cli = cac(\"o2b-meta\");\n\ncli\n .command(\"<srcPath>\", \"target vault file\")\n .option(\"--destPath [destPath]\", \"dist\", {\n default: \"./o2b\",\n })\n .option(\"--ignore\", \"read the .o2bIgnore if exists\", {\n default: true,\n })\n .option(\"--sync\", \"synchro\", {\n default: true,\n })\n .action((srcPath, option) => {\n const { destPath, ignore, sync } = option;\n\n const startTime = performance.now();\n\n if (sync) {\n runO2B({\n srcPath: toAbsPath(srcPath),\n destPath: toAbsPath(destPath),\n ignore,\n });\n }\n\n const endTime = performance.now();\n const duration = (endTime - startTime).toFixed(2); // 소수점 2자리까지\n\n console.log(`\\n✅ Build Success!`);\n console.log(` Time: ${duration}ms`);\n // console.log(` Dest: ${config.destPath}\\n`);\n });\n\ncli.help();\ncli.version(pkg.version);\n\n// production에 대한 에러처리\ncli.parse();\n","{\n \"name\": \"@o2b/meta\",\n \"version\": \"1.0.0-dev.4\",\n \"description\": \"filetree generator for o2b\",\n \"main\": \"./dist/index.js\",\n \"module\": \"./dist/index.mjs\",\n \"types\": \"./dist/index.d.ts\",\n \"exports\": {\n \".\": {\n \"types\": \"./dist/index.d.ts\",\n \"import\": \"./dist/index.mjs\",\n \"require\": \"./dist/index.js\"\n }\n },\n \"bin\": {\n \"o2b-meta\": \"./dist/cli.js\"\n },\n \"scripts\": {\n \"build\": \"tsup\",\n \"test\": \"vitest\",\n \"test:run\": \"vitest run\"\n },\n \"keywords\": [],\n \"author\": \"goonco\",\n \"license\": \"ISC\",\n \"type\": \"commonjs\",\n \"files\": [\n \"dist\"\n ],\n \"devDependencies\": {\n \"@biomejs/biome\": \"2.3.10\",\n \"@types/node\": \"^25.0.3\",\n \"@vitest/ui\": \"^4.0.16\",\n \"tsup\": \"^8.5.1\",\n \"typescript\": \"^5.9.3\",\n \"vitest\": \"^4.0.16\",\n \"zod\": \"^3.25.76\"\n },\n \"dependencies\": {\n \"cac\": \"^6.7.14\",\n \"gray-matter\": \"^4.0.3\",\n \"ignore\": \"^7.0.5\",\n \"lilconfig\": \"^3.1.3\"\n },\n \"peerDependencies\": {\n \"zod\": \"^3.23.8\"\n }\n}\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 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 { 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":["filetree","import_node_fs","import_node_path","import_node_fs","import_node_path","import_node_fs","import_node_path","import_zod","z","z","fileTree","ignore","relPath","matter","ignore","fileTree","cac","ignore"]}
|
|
1
|
+
{"version":3,"sources":["../src/cli.ts","../package.json","../src/core/sync/mirror.ts","../src/core/sync/scan.ts","../src/utils/path.ts","../src/types/path.ts","../src/utils/id.ts","../src/core/sync/normalize.ts","../src/utils/file.ts","../src/utils/ignore.ts","../src/runO2B.ts"],"sourcesContent":["import cac from \"cac\";\nimport pkg from \"../package.json\";\nimport runO2B from \"./runO2B\";\nimport { toAbsPath } from \"@utils/path\";\n\nconst cli = cac(\"o2b-meta\");\n\ncli\n .command(\"<srcPath>\", \"target vault file\")\n .option(\"--destPath [destPath]\", \"dist\", {\n default: \"./o2b\",\n })\n .option(\"--ignore\", \"read the .o2bIgnore if exists\", {\n default: true,\n })\n .option(\"--sync\", \"synchro\", {\n default: true,\n })\n .action((srcPath, option) => {\n const { destPath, ignore, sync } = option;\n\n const startTime = performance.now();\n\n if (sync) {\n runO2B({\n srcPath: toAbsPath(srcPath),\n destPath: toAbsPath(destPath),\n ignore,\n });\n }\n\n const endTime = performance.now();\n const duration = (endTime - startTime).toFixed(2); // 소수점 2자리까지\n\n console.log(`\\n✅ Build Success!`);\n console.log(` Time: ${duration}ms`);\n // console.log(` Dest: ${config.destPath}\\n`);\n });\n\ncli.help();\ncli.version(pkg.version);\n\n// production에 대한 에러처리\ncli.parse();\n","{\n \"name\": \"@o2b/meta\",\n \"version\": \"1.0.0-dev.5\",\n \"description\": \"filetree generator for o2b\",\n \"main\": \"./dist/index.js\",\n \"module\": \"./dist/index.mjs\",\n \"types\": \"./dist/index.d.ts\",\n \"exports\": {\n \".\": {\n \"types\": \"./dist/index.d.ts\",\n \"import\": \"./dist/index.mjs\",\n \"require\": \"./dist/index.js\"\n }\n },\n \"bin\": {\n \"o2b-meta\": \"dist/cli.js\"\n },\n \"scripts\": {\n \"build\": \"tsup\",\n \"test\": \"vitest\",\n \"test:run\": \"vitest run\"\n },\n \"keywords\": [],\n \"author\": \"goonco\",\n \"license\": \"ISC\",\n \"type\": \"commonjs\",\n \"files\": [\n \"dist\"\n ],\n \"devDependencies\": {\n \"@biomejs/biome\": \"2.3.10\",\n \"@types/node\": \"^25.0.3\",\n \"@vitest/ui\": \"^4.0.16\",\n \"tsup\": \"^8.5.1\",\n \"typescript\": \"^5.9.3\",\n \"vite-tsconfig-paths\": \"^6.0.5\",\n \"vitest\": \"^4.0.16\",\n \"zod\": \"^3.25.76\"\n },\n \"dependencies\": {\n \"cac\": \"^6.7.14\",\n \"gray-matter\": \"^4.0.3\",\n \"ignore\": \"^7.0.5\",\n \"lilconfig\": \"^3.1.3\"\n },\n \"peerDependencies\": {\n \"zod\": \"^3.23.8\"\n }\n}\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 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 { 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":["filetree","import_node_fs","import_node_path","import_node_fs","import_node_path","z","matter","id","dir","import_node_fs","import_node_path","import_node_fs","import_node_path","ignore","relPath","ignore","cac","ignore"]}
|
package/dist/index.d.mts
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 };
|