@novis10813/secondbrain-cli 0.1.0 → 0.1.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +71 -81
- package/dist/commands/backlinks.d.ts.map +1 -1
- package/dist/commands/backlinks.js +16 -33
- package/dist/commands/backlinks.js.map +1 -1
- package/dist/commands/capture.d.ts.map +1 -1
- package/dist/commands/capture.js +71 -57
- package/dist/commands/capture.js.map +1 -1
- package/dist/commands/config.d.ts.map +1 -1
- package/dist/commands/config.js +5 -20
- package/dist/commands/config.js.map +1 -1
- package/dist/commands/get.js +27 -26
- package/dist/commands/get.js.map +1 -1
- package/dist/commands/init.d.ts.map +1 -1
- package/dist/commands/init.js +21 -4
- package/dist/commands/init.js.map +1 -1
- package/dist/commands/migrate.d.ts +3 -0
- package/dist/commands/migrate.d.ts.map +1 -0
- package/dist/commands/migrate.js +22 -0
- package/dist/commands/migrate.js.map +1 -0
- package/dist/commands/open.d.ts +3 -0
- package/dist/commands/open.d.ts.map +1 -0
- package/dist/commands/open.js +28 -0
- package/dist/commands/open.js.map +1 -0
- package/dist/commands/orphans.d.ts.map +1 -1
- package/dist/commands/orphans.js +9 -27
- package/dist/commands/orphans.js.map +1 -1
- package/dist/commands/outlinks.d.ts +3 -0
- package/dist/commands/outlinks.d.ts.map +1 -0
- package/dist/commands/outlinks.js +48 -0
- package/dist/commands/outlinks.js.map +1 -0
- package/dist/commands/search.d.ts +2 -0
- package/dist/commands/search.d.ts.map +1 -1
- package/dist/commands/search.js +57 -39
- package/dist/commands/search.js.map +1 -1
- package/dist/commands/stats.d.ts.map +1 -1
- package/dist/commands/stats.js +4 -18
- package/dist/commands/stats.js.map +1 -1
- package/dist/commands/sync.d.ts.map +1 -1
- package/dist/commands/sync.js +3 -17
- package/dist/commands/sync.js.map +1 -1
- package/dist/commands/template.d.ts +3 -0
- package/dist/commands/template.d.ts.map +1 -0
- package/dist/commands/template.js +63 -0
- package/dist/commands/template.js.map +1 -0
- package/dist/commands/vault.d.ts +3 -0
- package/dist/commands/vault.d.ts.map +1 -0
- package/dist/commands/vault.js +233 -0
- package/dist/commands/vault.js.map +1 -0
- package/dist/index.js +13 -1
- package/dist/index.js.map +1 -1
- package/dist/types/index.d.ts +134 -10
- package/dist/types/index.d.ts.map +1 -1
- package/dist/utils/config.d.ts +3 -1
- package/dist/utils/config.d.ts.map +1 -1
- package/dist/utils/config.js +12 -0
- package/dist/utils/config.js.map +1 -1
- package/dist/utils/database.d.ts +58 -14
- package/dist/utils/database.d.ts.map +1 -1
- package/dist/utils/database.js +627 -207
- package/dist/utils/database.js.map +1 -1
- package/dist/utils/global-config.d.ts +53 -0
- package/dist/utils/global-config.d.ts.map +1 -0
- package/dist/utils/global-config.js +144 -0
- package/dist/utils/global-config.js.map +1 -0
- package/dist/utils/parser.d.ts +95 -2
- package/dist/utils/parser.d.ts.map +1 -1
- package/dist/utils/parser.js +466 -39
- package/dist/utils/parser.js.map +1 -1
- package/dist/utils/placeholder.d.ts +37 -0
- package/dist/utils/placeholder.d.ts.map +1 -0
- package/dist/utils/placeholder.js +113 -0
- package/dist/utils/placeholder.js.map +1 -0
- package/dist/utils/position.d.ts +10 -0
- package/dist/utils/position.d.ts.map +1 -0
- package/dist/utils/position.js +24 -0
- package/dist/utils/position.js.map +1 -0
- package/dist/utils/sqlite-adapter.d.ts +8 -0
- package/dist/utils/sqlite-adapter.d.ts.map +1 -0
- package/dist/utils/sqlite-adapter.js +14 -0
- package/dist/utils/sqlite-adapter.js.map +1 -0
- package/dist/utils/template.d.ts +2 -2
- package/dist/utils/template.d.ts.map +1 -1
- package/dist/utils/template.js +8 -3
- package/dist/utils/template.js.map +1 -1
- package/dist/utils/vault-resolve.d.ts +23 -0
- package/dist/utils/vault-resolve.d.ts.map +1 -0
- package/dist/utils/vault-resolve.js +86 -0
- package/dist/utils/vault-resolve.js.map +1 -0
- package/dist/utils/vault.d.ts +77 -10
- package/dist/utils/vault.d.ts.map +1 -1
- package/dist/utils/vault.js +262 -98
- package/dist/utils/vault.js.map +1 -1
- package/package.json +9 -3
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"placeholder.d.ts","sourceRoot":"","sources":["../../src/utils/placeholder.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AAE5D;;;;;;;;GAQG;AACH,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,GAAG,MAAM,CA0B1E;AAED;;;;;;GAMG;AACH,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,GAAG,MAAM,CAK1E;AAkBD;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,mBAAmB,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,kBAAkB,GAAG,MAAM,CA8BzF"}
|
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.parseDatePlaceholder = parseDatePlaceholder;
|
|
7
|
+
exports.parseTimePlaceholder = parseTimePlaceholder;
|
|
8
|
+
exports.processPlaceholders = processPlaceholders;
|
|
9
|
+
const moment_1 = __importDefault(require("moment"));
|
|
10
|
+
/**
|
|
11
|
+
* Parse a DATE placeholder token and return the formatted date string.
|
|
12
|
+
*
|
|
13
|
+
* Supported formats:
|
|
14
|
+
* DATE → default 'YYYY-MM-DD'
|
|
15
|
+
* DATE:format → custom moment format
|
|
16
|
+
* DATE+N / DATE-N → offset by N days, default format
|
|
17
|
+
* DATE:format+N → custom format + day offset
|
|
18
|
+
*/
|
|
19
|
+
function parseDatePlaceholder(token, baseDate) {
|
|
20
|
+
// Strip leading 'DATE'
|
|
21
|
+
const rest = token.slice(4); // e.g. '', ':YYYY/MM/DD', '+3', ':YYYY/MM/DD+3'
|
|
22
|
+
let fmt = 'YYYY-MM-DD';
|
|
23
|
+
let offset = 0;
|
|
24
|
+
if (rest === '') {
|
|
25
|
+
// plain {{DATE}}
|
|
26
|
+
}
|
|
27
|
+
else if (rest.startsWith(':')) {
|
|
28
|
+
// has custom format; offset may follow after the format as +N or -N
|
|
29
|
+
// We need to find if there's an offset at the end: match trailing [+-]\d+
|
|
30
|
+
const offsetMatch = rest.match(/([+-]\d+)$/);
|
|
31
|
+
if (offsetMatch) {
|
|
32
|
+
offset = parseInt(offsetMatch[1], 10);
|
|
33
|
+
fmt = rest.slice(1, rest.length - offsetMatch[1].length);
|
|
34
|
+
}
|
|
35
|
+
else {
|
|
36
|
+
fmt = rest.slice(1);
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
else {
|
|
40
|
+
// no custom format, just offset: +N or -N
|
|
41
|
+
offset = parseInt(rest, 10);
|
|
42
|
+
}
|
|
43
|
+
const m = (0, moment_1.default)(baseDate).add(offset, 'days');
|
|
44
|
+
return m.format(fmt);
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* Parse a TIME placeholder token and return the formatted time string.
|
|
48
|
+
*
|
|
49
|
+
* Supported formats:
|
|
50
|
+
* TIME → default 'HH:mm'
|
|
51
|
+
* TIME:format → custom moment format
|
|
52
|
+
*/
|
|
53
|
+
function parseTimePlaceholder(token, baseDate) {
|
|
54
|
+
const rest = token.slice(4); // strip 'TIME'
|
|
55
|
+
const fmt = rest.startsWith(':') ? rest.slice(1) : 'HH:mm';
|
|
56
|
+
return (0, moment_1.default)(baseDate).format(fmt);
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* Generate a UUID v4 string.
|
|
60
|
+
* Uses crypto.randomUUID if available (Node 15+ / Bun), otherwise falls back to manual generation.
|
|
61
|
+
*/
|
|
62
|
+
function generateUUID() {
|
|
63
|
+
if (typeof crypto !== 'undefined' && typeof crypto.randomUUID === 'function') {
|
|
64
|
+
return crypto.randomUUID();
|
|
65
|
+
}
|
|
66
|
+
// Fallback: manual RFC4122 v4 UUID
|
|
67
|
+
return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, (c) => {
|
|
68
|
+
const r = (Math.random() * 16) | 0;
|
|
69
|
+
const v = c === 'x' ? r : (r & 0x3) | 0x8;
|
|
70
|
+
return v.toString(16);
|
|
71
|
+
});
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* Process all built-in placeholders in a template string.
|
|
75
|
+
*
|
|
76
|
+
* Built-in placeholders (uppercase keywords):
|
|
77
|
+
* {{DATE}} → today's date (YYYY-MM-DD)
|
|
78
|
+
* {{DATE:format}} → custom moment format
|
|
79
|
+
* {{DATE+N}} → N days from today
|
|
80
|
+
* {{DATE:format+N}} → custom format + offset
|
|
81
|
+
* {{TIME}} → current time (HH:mm)
|
|
82
|
+
* {{TIME:format}} → custom moment format
|
|
83
|
+
* {{TITLE}} → context.title (left as-is if not provided)
|
|
84
|
+
* {{VAULT}} → context.vault (left as-is if not provided)
|
|
85
|
+
* {{UUID}} → random UUID v4 (unique per occurrence)
|
|
86
|
+
*
|
|
87
|
+
* User-defined lowercase {{variable}} placeholders are NOT touched.
|
|
88
|
+
*/
|
|
89
|
+
function processPlaceholders(template, context) {
|
|
90
|
+
const baseDate = context.date ?? new Date();
|
|
91
|
+
// Match every {{...}} in the template; decide per-match whether it's built-in
|
|
92
|
+
return template.replace(/\{\{([^}]+)\}\}/g, (match, inner) => {
|
|
93
|
+
const token = inner.trim();
|
|
94
|
+
if (token === 'DATE' || token.startsWith('DATE:') || /^DATE[+-]\d+/.test(token)) {
|
|
95
|
+
return parseDatePlaceholder(token, baseDate);
|
|
96
|
+
}
|
|
97
|
+
if (token === 'TIME' || token.startsWith('TIME:')) {
|
|
98
|
+
return parseTimePlaceholder(token, baseDate);
|
|
99
|
+
}
|
|
100
|
+
if (token === 'TITLE') {
|
|
101
|
+
return context.title !== undefined ? context.title : match;
|
|
102
|
+
}
|
|
103
|
+
if (token === 'VAULT') {
|
|
104
|
+
return context.vault !== undefined ? context.vault : match;
|
|
105
|
+
}
|
|
106
|
+
if (token === 'UUID') {
|
|
107
|
+
return generateUUID();
|
|
108
|
+
}
|
|
109
|
+
// Not a built-in placeholder — preserve as-is for user variable handling
|
|
110
|
+
return match;
|
|
111
|
+
});
|
|
112
|
+
}
|
|
113
|
+
//# sourceMappingURL=placeholder.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"placeholder.js","sourceRoot":"","sources":["../../src/utils/placeholder.ts"],"names":[],"mappings":";;;;;AAYA,oDA0BC;AASD,oDAKC;AAkCD,kDA8BC;AApHD,oDAA4B;AAG5B;;;;;;;;GAQG;AACH,SAAgB,oBAAoB,CAAC,KAAa,EAAE,QAAc;IAC9D,uBAAuB;IACvB,MAAM,IAAI,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,gDAAgD;IAE7E,IAAI,GAAG,GAAG,YAAY,CAAC;IACvB,IAAI,MAAM,GAAG,CAAC,CAAC;IAEf,IAAI,IAAI,KAAK,EAAE,EAAE,CAAC;QACd,iBAAiB;IACrB,CAAC;SAAM,IAAI,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;QAC9B,oEAAoE;QACpE,0EAA0E;QAC1E,MAAM,WAAW,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC;QAC7C,IAAI,WAAW,EAAE,CAAC;YACd,MAAM,GAAG,QAAQ,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;YACtC,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC,MAAM,GAAG,WAAW,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;QAC7D,CAAC;aAAM,CAAC;YACJ,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;QACxB,CAAC;IACL,CAAC;SAAM,CAAC;QACJ,0CAA0C;QAC1C,MAAM,GAAG,QAAQ,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;IAChC,CAAC;IAED,MAAM,CAAC,GAAG,IAAA,gBAAM,EAAC,QAAQ,CAAC,CAAC,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC/C,OAAO,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;AACzB,CAAC;AAED;;;;;;GAMG;AACH,SAAgB,oBAAoB,CAAC,KAAa,EAAE,QAAc;IAC9D,MAAM,IAAI,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,eAAe;IAE5C,MAAM,GAAG,GAAG,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC;IAC3D,OAAO,IAAA,gBAAM,EAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;AACxC,CAAC;AAED;;;GAGG;AACH,SAAS,YAAY;IACjB,IAAI,OAAO,MAAM,KAAK,WAAW,IAAI,OAAO,MAAM,CAAC,UAAU,KAAK,UAAU,EAAE,CAAC;QAC3E,OAAO,MAAM,CAAC,UAAU,EAAE,CAAC;IAC/B,CAAC;IACD,mCAAmC;IACnC,OAAO,sCAAsC,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC,EAAE,EAAE;QACjE,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC;QACnC,MAAM,CAAC,GAAG,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,GAAG,GAAG,CAAC;QAC1C,OAAO,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;IAC1B,CAAC,CAAC,CAAC;AACP,CAAC;AAED;;;;;;;;;;;;;;;GAeG;AACH,SAAgB,mBAAmB,CAAC,QAAgB,EAAE,OAA2B;IAC7E,MAAM,QAAQ,GAAG,OAAO,CAAC,IAAI,IAAI,IAAI,IAAI,EAAE,CAAC;IAE5C,8EAA8E;IAC9E,OAAO,QAAQ,CAAC,OAAO,CAAC,kBAAkB,EAAE,CAAC,KAAK,EAAE,KAAa,EAAE,EAAE;QACjE,MAAM,KAAK,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC;QAE3B,IAAI,KAAK,KAAK,MAAM,IAAI,KAAK,CAAC,UAAU,CAAC,OAAO,CAAC,IAAI,cAAc,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;YAC9E,OAAO,oBAAoB,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC;QACjD,CAAC;QAED,IAAI,KAAK,KAAK,MAAM,IAAI,KAAK,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;YAChD,OAAO,oBAAoB,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC;QACjD,CAAC;QAED,IAAI,KAAK,KAAK,OAAO,EAAE,CAAC;YACpB,OAAO,OAAO,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC;QAC/D,CAAC;QAED,IAAI,KAAK,KAAK,OAAO,EAAE,CAAC;YACpB,OAAO,OAAO,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC;QAC/D,CAAC;QAED,IAAI,KAAK,KAAK,MAAM,EAAE,CAAC;YACnB,OAAO,YAAY,EAAE,CAAC;QAC1B,CAAC;QAED,yEAAyE;QACzE,OAAO,KAAK,CAAC;IACjB,CAAC,CAAC,CAAC;AACP,CAAC"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { Loc, Pos } from '../types';
|
|
2
|
+
/**
|
|
3
|
+
* Convert a character offset in content to Obsidian-aligned Loc (0-based line/col).
|
|
4
|
+
*/
|
|
5
|
+
export declare function indexToLoc(content: string, index: number): Loc;
|
|
6
|
+
/**
|
|
7
|
+
* Convert a start/end character range to Obsidian-aligned Pos (start and end Loc).
|
|
8
|
+
*/
|
|
9
|
+
export declare function rangeToPos(content: string, startIndex: number, endIndex: number): Pos;
|
|
10
|
+
//# sourceMappingURL=position.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"position.d.ts","sourceRoot":"","sources":["../../src/utils/position.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,GAAG,EAAE,GAAG,EAAE,MAAM,UAAU,CAAC;AAEzC;;GAEG;AACH,wBAAgB,UAAU,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,GAAG,CAM9D;AAED;;GAEG;AACH,wBAAgB,UAAU,CAAC,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,GAAG,CAKrF"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.indexToLoc = indexToLoc;
|
|
4
|
+
exports.rangeToPos = rangeToPos;
|
|
5
|
+
/**
|
|
6
|
+
* Convert a character offset in content to Obsidian-aligned Loc (0-based line/col).
|
|
7
|
+
*/
|
|
8
|
+
function indexToLoc(content, index) {
|
|
9
|
+
const before = content.slice(0, index);
|
|
10
|
+
const lastNewline = before.lastIndexOf('\n');
|
|
11
|
+
const line = (before.match(/\n/g)?.length ?? 0);
|
|
12
|
+
const col = lastNewline === -1 ? index : index - lastNewline - 1;
|
|
13
|
+
return { line, col, offset: index };
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Convert a start/end character range to Obsidian-aligned Pos (start and end Loc).
|
|
17
|
+
*/
|
|
18
|
+
function rangeToPos(content, startIndex, endIndex) {
|
|
19
|
+
return {
|
|
20
|
+
start: indexToLoc(content, startIndex),
|
|
21
|
+
end: indexToLoc(content, endIndex)
|
|
22
|
+
};
|
|
23
|
+
}
|
|
24
|
+
//# sourceMappingURL=position.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"position.js","sourceRoot":"","sources":["../../src/utils/position.ts"],"names":[],"mappings":";;AAKA,gCAMC;AAKD,gCAKC;AAnBD;;GAEG;AACH,SAAgB,UAAU,CAAC,OAAe,EAAE,KAAa;IACxD,MAAM,MAAM,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC;IACvC,MAAM,WAAW,GAAG,MAAM,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;IAC7C,MAAM,IAAI,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE,MAAM,IAAI,CAAC,CAAC,CAAC;IAChD,MAAM,GAAG,GAAG,WAAW,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,GAAG,WAAW,GAAG,CAAC,CAAC;IACjE,OAAO,EAAE,IAAI,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC;AACrC,CAAC;AAED;;GAEG;AACH,SAAgB,UAAU,CAAC,OAAe,EAAE,UAAkB,EAAE,QAAgB;IAC/E,OAAO;QACN,KAAK,EAAE,UAAU,CAAC,OAAO,EAAE,UAAU,CAAC;QACtC,GAAG,EAAE,UAAU,CAAC,OAAO,EAAE,QAAQ,CAAC;KAClC,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SQLite driver adapter: uses bun:sqlite under Bun and better-sqlite3 under Node
|
|
3
|
+
* so that npm install users can run the CLI with Node.js.
|
|
4
|
+
*/
|
|
5
|
+
import type Database from 'better-sqlite3';
|
|
6
|
+
export type SqliteDatabase = InstanceType<typeof Database>;
|
|
7
|
+
export declare function createDatabase(path: string): SqliteDatabase;
|
|
8
|
+
//# sourceMappingURL=sqlite-adapter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sqlite-adapter.d.ts","sourceRoot":"","sources":["../../src/utils/sqlite-adapter.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,KAAK,QAAQ,MAAM,gBAAgB,CAAC;AAE3C,MAAM,MAAM,cAAc,GAAG,YAAY,CAAC,OAAO,QAAQ,CAAC,CAAC;AAE3D,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,cAAc,CAS3D"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.createDatabase = createDatabase;
|
|
4
|
+
function createDatabase(path) {
|
|
5
|
+
if (typeof globalThis.Bun !== 'undefined') {
|
|
6
|
+
// eslint-disable-next-line @typescript-eslint/no-require-imports
|
|
7
|
+
const { Database } = require('bun:sqlite');
|
|
8
|
+
return new Database(path);
|
|
9
|
+
}
|
|
10
|
+
// eslint-disable-next-line @typescript-eslint/no-require-imports
|
|
11
|
+
const DatabaseConstructor = require('better-sqlite3');
|
|
12
|
+
return new DatabaseConstructor(path);
|
|
13
|
+
}
|
|
14
|
+
//# sourceMappingURL=sqlite-adapter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sqlite-adapter.js","sourceRoot":"","sources":["../../src/utils/sqlite-adapter.ts"],"names":[],"mappings":";;AAQA,wCASC;AATD,SAAgB,cAAc,CAAC,IAAY;IAC1C,IAAI,OAAQ,UAAoD,CAAC,GAAG,KAAK,WAAW,EAAE,CAAC;QACtF,iEAAiE;QACjE,MAAM,EAAE,QAAQ,EAAE,GAAG,OAAO,CAAC,YAAY,CAAC,CAAC;QAC3C,OAAO,IAAI,QAAQ,CAAC,IAAI,CAA8B,CAAC;IACxD,CAAC;IACD,iEAAiE;IACjE,MAAM,mBAAmB,GAAG,OAAO,CAAC,gBAAgB,CAAoB,CAAC;IACzE,OAAO,IAAI,mBAAmB,CAAC,IAAI,CAAC,CAAC;AACtC,CAAC"}
|
package/dist/utils/template.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { Config } from '../types/index.js';
|
|
1
|
+
import type { Config, PlaceholderContext } from '../types/index.js';
|
|
2
2
|
export declare class TemplateManager {
|
|
3
3
|
private config;
|
|
4
4
|
constructor(config: Config);
|
|
@@ -8,7 +8,7 @@ export declare class TemplateManager {
|
|
|
8
8
|
getTemplate(name: string): string | null;
|
|
9
9
|
listTemplates(): string[];
|
|
10
10
|
deleteTemplate(name: string): void;
|
|
11
|
-
renderTemplate(name: string, variables: Record<string, string
|
|
11
|
+
renderTemplate(name: string, variables: Record<string, string>, context?: PlaceholderContext): string;
|
|
12
12
|
validateTemplate(name: string): string[];
|
|
13
13
|
insertTemplate(name: string, targetPath: string, variables: Record<string, string>): void;
|
|
14
14
|
getRequiredFields(name: string): string[];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"template.d.ts","sourceRoot":"","sources":["../../src/utils/template.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;
|
|
1
|
+
{"version":3,"file":"template.d.ts","sourceRoot":"","sources":["../../src/utils/template.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,MAAM,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AAGpE,qBAAa,eAAe;IAC1B,OAAO,CAAC,MAAM,CAAS;gBAEX,MAAM,EAAE,MAAM;IAI1B,OAAO,CAAC,eAAe;IAIvB,OAAO,CAAC,kBAAkB;IAO1B,cAAc,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,IAAI;IAMnD,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI;IAQxC,aAAa,IAAI,MAAM,EAAE;IAYzB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAQlC,cAAc,CAAC,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,OAAO,CAAC,EAAE,kBAAkB,GAAG,MAAM;IAsBrG,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE;IAiBxC,cAAc,CAAC,IAAI,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,IAAI;IAazF,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE;IAIzC,sBAAsB,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,MAAM,EAAE;CAYjF"}
|
package/dist/utils/template.js
CHANGED
|
@@ -3,6 +3,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
3
3
|
exports.TemplateManager = void 0;
|
|
4
4
|
const fs_1 = require("fs");
|
|
5
5
|
const path_1 = require("path");
|
|
6
|
+
const placeholder_js_1 = require("./placeholder.js");
|
|
6
7
|
class TemplateManager {
|
|
7
8
|
config;
|
|
8
9
|
constructor(config) {
|
|
@@ -46,17 +47,21 @@ class TemplateManager {
|
|
|
46
47
|
}
|
|
47
48
|
(0, fs_1.unlinkSync)(templatePath);
|
|
48
49
|
}
|
|
49
|
-
renderTemplate(name, variables) {
|
|
50
|
+
renderTemplate(name, variables, context) {
|
|
50
51
|
const template = this.getTemplate(name);
|
|
51
52
|
if (!template) {
|
|
52
53
|
throw new Error(`Template '${name}' not found`);
|
|
53
54
|
}
|
|
54
|
-
//
|
|
55
|
-
let result = template;
|
|
55
|
+
// Step 1: Expand built-in placeholders (DATE, TIME, TITLE, VAULT, UUID)
|
|
56
|
+
let result = (0, placeholder_js_1.processPlaceholders)(template, context ?? {});
|
|
57
|
+
// Step 2: Replace user-defined {{variable}} with provided values
|
|
56
58
|
for (const [key, value] of Object.entries(variables)) {
|
|
57
59
|
const regex = new RegExp(`\\{\\{\\s*${key}\\s*\\}\\}`, 'g');
|
|
58
60
|
result = result.replace(regex, value);
|
|
59
61
|
}
|
|
62
|
+
// Step 3: Replace any remaining unresolved placeholders with empty string
|
|
63
|
+
const remainingRegex = /\{\{\s*[a-zA-Z_][a-zA-Z0-9_:+\-]*\s*\}\}/g;
|
|
64
|
+
result = result.replace(remainingRegex, '');
|
|
60
65
|
return result;
|
|
61
66
|
}
|
|
62
67
|
validateTemplate(name) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"template.js","sourceRoot":"","sources":["../../src/utils/template.ts"],"names":[],"mappings":";;;AAAA,2BAAiG;AACjG,+BAAqC;
|
|
1
|
+
{"version":3,"file":"template.js","sourceRoot":"","sources":["../../src/utils/template.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import type { Config } from '../types/index.js';
|
|
2
|
+
import { VaultManager } from './vault.js';
|
|
3
|
+
export interface ResolveOptions {
|
|
4
|
+
globalConfigDir?: string;
|
|
5
|
+
cwd?: string;
|
|
6
|
+
}
|
|
7
|
+
/**
|
|
8
|
+
* 解析 vault 路徑,依照優先順序:
|
|
9
|
+
* 1. 環境變數 SECONDBRAIN_VAULT(名稱或路徑)
|
|
10
|
+
* 2. 當前目錄(往上找 .secondbrain/config.json)
|
|
11
|
+
* 3. 預設 vault
|
|
12
|
+
*/
|
|
13
|
+
export declare function resolveVaultPath(options?: ResolveOptions): string | null;
|
|
14
|
+
/**
|
|
15
|
+
* Resolve vault path and run fn with a VaultManager. Ensures vault.close() in finally.
|
|
16
|
+
* Exits with 1 if not inside a SecondBrain vault.
|
|
17
|
+
*/
|
|
18
|
+
export declare function withVault(fn: (vault: VaultManager) => void | Promise<void>, options?: ResolveOptions): Promise<void>;
|
|
19
|
+
/**
|
|
20
|
+
* Get config for current vault or exit. Use when only config is needed (e.g. config command).
|
|
21
|
+
*/
|
|
22
|
+
export declare function getConfigOrExit(options?: ResolveOptions): Config;
|
|
23
|
+
//# sourceMappingURL=vault-resolve.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"vault-resolve.d.ts","sourceRoot":"","sources":["../../src/utils/vault-resolve.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAGhD,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAU1C,MAAM,WAAW,cAAc;IAC7B,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,GAAG,CAAC,EAAE,MAAM,CAAC;CACd;AAED;;;;;GAKG;AACH,wBAAgB,gBAAgB,CAAC,OAAO,GAAE,cAAmB,GAAG,MAAM,GAAG,IAAI,CA+B5E;AAED;;;GAGG;AACH,wBAAsB,SAAS,CAC7B,EAAE,EAAE,CAAC,KAAK,EAAE,YAAY,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,EACjD,OAAO,GAAE,cAAmB,GAC3B,OAAO,CAAC,IAAI,CAAC,CAiBf;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,OAAO,GAAE,cAAmB,GAAG,MAAM,CAQpE"}
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.resolveVaultPath = resolveVaultPath;
|
|
4
|
+
exports.withVault = withVault;
|
|
5
|
+
exports.getConfigOrExit = getConfigOrExit;
|
|
6
|
+
const config_js_1 = require("./config.js");
|
|
7
|
+
const global_config_js_1 = require("./global-config.js");
|
|
8
|
+
const vault_js_1 = require("./vault.js");
|
|
9
|
+
const fs_1 = require("fs");
|
|
10
|
+
const path_1 = require("path");
|
|
11
|
+
const NOT_IN_VAULT_MSG = `❌ 找不到可用的 vault
|
|
12
|
+
• 設定環境變數:export SECONDBRAIN_VAULT=<name|path>
|
|
13
|
+
• 或進入 vault 目錄
|
|
14
|
+
• 或設定預設 vault:sb vault default set <name>
|
|
15
|
+
• 或初始化新 vault:sb vault init`;
|
|
16
|
+
/**
|
|
17
|
+
* 解析 vault 路徑,依照優先順序:
|
|
18
|
+
* 1. 環境變數 SECONDBRAIN_VAULT(名稱或路徑)
|
|
19
|
+
* 2. 當前目錄(往上找 .secondbrain/config.json)
|
|
20
|
+
* 3. 預設 vault
|
|
21
|
+
*/
|
|
22
|
+
function resolveVaultPath(options = {}) {
|
|
23
|
+
const globalConfig = new global_config_js_1.GlobalConfigManager(options.globalConfigDir);
|
|
24
|
+
const cwd = options.cwd ?? process.cwd();
|
|
25
|
+
// 1. 環境變數
|
|
26
|
+
const envVault = process.env.SECONDBRAIN_VAULT;
|
|
27
|
+
if (envVault) {
|
|
28
|
+
// 先嘗試作為路徑
|
|
29
|
+
if ((0, fs_1.existsSync)((0, path_1.join)(envVault, '.secondbrain', 'config.json'))) {
|
|
30
|
+
return envVault;
|
|
31
|
+
}
|
|
32
|
+
// 再嘗試作為名稱
|
|
33
|
+
const entry = globalConfig.findVault(envVault);
|
|
34
|
+
if (entry && (0, fs_1.existsSync)((0, path_1.join)(entry.path, '.secondbrain', 'config.json'))) {
|
|
35
|
+
return entry.path;
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
// 2. 當前目錄(向上查找)
|
|
39
|
+
const localVault = config_js_1.ConfigManager.findVaultPath(cwd);
|
|
40
|
+
if (localVault) {
|
|
41
|
+
return localVault;
|
|
42
|
+
}
|
|
43
|
+
// 3. 預設 vault
|
|
44
|
+
const defaultVault = globalConfig.getDefault();
|
|
45
|
+
if (defaultVault && (0, fs_1.existsSync)((0, path_1.join)(defaultVault.path, '.secondbrain', 'config.json'))) {
|
|
46
|
+
return defaultVault.path;
|
|
47
|
+
}
|
|
48
|
+
return null;
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* Resolve vault path and run fn with a VaultManager. Ensures vault.close() in finally.
|
|
52
|
+
* Exits with 1 if not inside a SecondBrain vault.
|
|
53
|
+
*/
|
|
54
|
+
async function withVault(fn, options = {}) {
|
|
55
|
+
const vaultPath = resolveVaultPath(options);
|
|
56
|
+
if (!vaultPath) {
|
|
57
|
+
console.error(NOT_IN_VAULT_MSG);
|
|
58
|
+
process.exit(1);
|
|
59
|
+
}
|
|
60
|
+
const configManager = new config_js_1.ConfigManager(vaultPath);
|
|
61
|
+
const config = configManager.getConfig();
|
|
62
|
+
const vault = new vault_js_1.VaultManager(config);
|
|
63
|
+
try {
|
|
64
|
+
await fn(vault);
|
|
65
|
+
}
|
|
66
|
+
catch (error) {
|
|
67
|
+
console.error('❌', error instanceof Error ? error.message : String(error));
|
|
68
|
+
process.exit(1);
|
|
69
|
+
}
|
|
70
|
+
finally {
|
|
71
|
+
vault.close();
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
/**
|
|
75
|
+
* Get config for current vault or exit. Use when only config is needed (e.g. config command).
|
|
76
|
+
*/
|
|
77
|
+
function getConfigOrExit(options = {}) {
|
|
78
|
+
const vaultPath = resolveVaultPath(options);
|
|
79
|
+
if (!vaultPath) {
|
|
80
|
+
console.error(NOT_IN_VAULT_MSG);
|
|
81
|
+
process.exit(1);
|
|
82
|
+
}
|
|
83
|
+
const configManager = new config_js_1.ConfigManager(vaultPath);
|
|
84
|
+
return configManager.getConfig();
|
|
85
|
+
}
|
|
86
|
+
//# sourceMappingURL=vault-resolve.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"vault-resolve.js","sourceRoot":"","sources":["../../src/utils/vault-resolve.ts"],"names":[],"mappings":"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"}
|
package/dist/utils/vault.d.ts
CHANGED
|
@@ -1,32 +1,99 @@
|
|
|
1
|
-
import type {
|
|
1
|
+
import type { Config, FileInfo, ContentMetadata } from '../types/index.js';
|
|
2
2
|
export declare class VaultManager {
|
|
3
|
-
private
|
|
3
|
+
private _config;
|
|
4
4
|
private db;
|
|
5
5
|
constructor(config: Config);
|
|
6
|
+
get config(): Config;
|
|
6
7
|
close(): void;
|
|
7
8
|
sync(): Promise<{
|
|
8
9
|
added: number;
|
|
9
10
|
updated: number;
|
|
10
11
|
removed: number;
|
|
11
12
|
}>;
|
|
13
|
+
/**
|
|
14
|
+
* Rapidly index a single file without a full vault scan.
|
|
15
|
+
* Useful for capture or real-time updates.
|
|
16
|
+
*/
|
|
17
|
+
indexSingleFile(relativePath: string): void;
|
|
12
18
|
private findMarkdownFiles;
|
|
13
|
-
|
|
14
|
-
|
|
19
|
+
/**
|
|
20
|
+
* Create FileInfo from file path and stats.
|
|
21
|
+
* Separates file system information from content parsing.
|
|
22
|
+
*/
|
|
23
|
+
private createFileInfo;
|
|
15
24
|
writeNote(path: string, content: string): void;
|
|
16
25
|
readNote(path: string): string | null;
|
|
17
26
|
getDailyNotePath(date?: Date): string;
|
|
18
27
|
getTemplatePath(templateName: string): string;
|
|
19
|
-
getNoteById(id: string): Note | null;
|
|
20
|
-
getNoteByPath(path: string): Note | null;
|
|
21
|
-
searchNotes(query: string, tags?: string[], limit?: number): Note[];
|
|
22
|
-
getBacklinks(noteId: string): Note[];
|
|
23
|
-
getOrphans(): Note[];
|
|
24
28
|
getStats(): {
|
|
25
29
|
totalNotes: number;
|
|
26
30
|
totalLinks: number;
|
|
27
31
|
orphans: number;
|
|
28
32
|
};
|
|
33
|
+
getBacklinksByPath(filePath: string): FileInfo[];
|
|
34
|
+
getOutlinksByPath(filePath: string): FileInfo[];
|
|
35
|
+
getOrphanFiles(): FileInfo[];
|
|
36
|
+
searchFiles(query: string, tags?: string[], limit?: number, pathPrefix?: string, linksToPath?: string, headingQuery?: string, modifiedAfter?: number, modifiedBefore?: number): Array<{
|
|
37
|
+
file: FileInfo;
|
|
38
|
+
tags: string[];
|
|
39
|
+
}>;
|
|
29
40
|
getGraphData(): import("../types/index.js").GraphData;
|
|
30
|
-
|
|
41
|
+
/**
|
|
42
|
+
* Get all markdown files in the vault (Obsidian-style API).
|
|
43
|
+
* Equivalent to Obsidian's Vault.getMarkdownFiles().
|
|
44
|
+
* @returns Array of FileInfo for every .md file in the vault
|
|
45
|
+
*/
|
|
46
|
+
getMarkdownFiles(): FileInfo[];
|
|
47
|
+
/**
|
|
48
|
+
* Get FileInfo by path (Obsidian-style API).
|
|
49
|
+
* @param path Relative path from vault root
|
|
50
|
+
* @returns FileInfo or null if not found
|
|
51
|
+
*/
|
|
52
|
+
getFileByPath(path: string): FileInfo | null;
|
|
53
|
+
/**
|
|
54
|
+
* Resolve path or basename to FileInfo using new structure only.
|
|
55
|
+
* Tries exact path, path + .md, then match by basename.
|
|
56
|
+
*/
|
|
57
|
+
resolvePathOrBasename(pathOrBasename: string): FileInfo | null;
|
|
58
|
+
/**
|
|
59
|
+
* Read file content by FileInfo (Obsidian-style API).
|
|
60
|
+
* Equivalent to Obsidian's Vault.read(file).
|
|
61
|
+
* @param file FileInfo object
|
|
62
|
+
* @returns File content or null if not found
|
|
63
|
+
*/
|
|
64
|
+
readFile(file: FileInfo): string | null;
|
|
65
|
+
/**
|
|
66
|
+
* Get backlinks for a file by FileInfo (Obsidian-style API).
|
|
67
|
+
* Equivalent to Obsidian's MetadataCache.getBacklinksForFile(file).
|
|
68
|
+
* @param file FileInfo object
|
|
69
|
+
* @returns Array of FileInfo that link to this file
|
|
70
|
+
*/
|
|
71
|
+
getBacklinksForFile(file: FileInfo): FileInfo[];
|
|
72
|
+
/**
|
|
73
|
+
* Get ContentMetadata for a FileInfo (Obsidian-style API).
|
|
74
|
+
* Equivalent to Obsidian's MetadataCache.getFileCache(file).
|
|
75
|
+
* @param file FileInfo object
|
|
76
|
+
* @returns ContentMetadata or null if not found
|
|
77
|
+
*/
|
|
78
|
+
getFileCache(file: FileInfo): ContentMetadata | null;
|
|
79
|
+
/**
|
|
80
|
+
* Resolve a linkpath to a FileInfo (Obsidian-style API).
|
|
81
|
+
* Equivalent to Obsidian's MetadataCache.getFirstLinkpathDest(linkpath, sourcePath).
|
|
82
|
+
* Resolves linkpaths like "note-name", "folder/note-name", "note-name#heading", etc.
|
|
83
|
+
* @param linkpath Link path (may include heading/block reference after #)
|
|
84
|
+
* @param sourcePath Path of the source file (for relative path resolution)
|
|
85
|
+
* @returns FileInfo or null if not found
|
|
86
|
+
*/
|
|
87
|
+
getFirstLinkpathDest(linkpath: string, sourcePath: string): FileInfo | null;
|
|
88
|
+
/**
|
|
89
|
+
* Resolve a linkpath to a file and position (line, col) for editor navigation.
|
|
90
|
+
* Supports note, note#heading, note#^block-id, and note#heading#^block-id.
|
|
91
|
+
* @returns { path, line, col } (1-based) or null if file not found
|
|
92
|
+
*/
|
|
93
|
+
resolveLinkToPosition(linkpath: string, sourcePath: string): {
|
|
94
|
+
path: string;
|
|
95
|
+
line: number;
|
|
96
|
+
col: number;
|
|
97
|
+
} | null;
|
|
31
98
|
}
|
|
32
99
|
//# sourceMappingURL=vault.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"vault.d.ts","sourceRoot":"","sources":["../../src/utils/vault.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,
|
|
1
|
+
{"version":3,"file":"vault.d.ts","sourceRoot":"","sources":["../../src/utils/vault.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAI3E,qBAAa,YAAY;IACvB,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,EAAE,CAAkB;gBAEhB,MAAM,EAAE,MAAM;IAK1B,IAAI,MAAM,IAAI,MAAM,CAEnB;IAED,KAAK,IAAI,IAAI;IAKP,IAAI,IAAI,OAAO,CAAC;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC;IA+E1E;;;OAGG;IACH,eAAe,CAAC,YAAY,EAAE,MAAM,GAAG,IAAI;IA0B3C,OAAO,CAAC,iBAAiB;IAyBzB;;;OAGG;IACH,OAAO,CAAC,cAAc;IAwBtB,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,IAAI;IAY9C,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI;IASrC,gBAAgB,CAAC,IAAI,GAAE,IAAiB,GAAG,MAAM;IASjD,eAAe,CAAC,YAAY,EAAE,MAAM,GAAG,MAAM;IAI7C,QAAQ;;;;;IAKR,kBAAkB,CAAC,QAAQ,EAAE,MAAM,GAAG,QAAQ,EAAE;IAIhD,iBAAiB,CAAC,QAAQ,EAAE,MAAM,GAAG,QAAQ,EAAE;IAI/C,cAAc,IAAI,QAAQ,EAAE;IAI5B,WAAW,CACT,KAAK,EAAE,MAAM,EACb,IAAI,CAAC,EAAE,MAAM,EAAE,EACf,KAAK,GAAE,MAAW,EAClB,UAAU,CAAC,EAAE,MAAM,EACnB,WAAW,CAAC,EAAE,MAAM,EACpB,YAAY,CAAC,EAAE,MAAM,EACrB,aAAa,CAAC,EAAE,MAAM,EACtB,cAAc,CAAC,EAAE,MAAM,GACtB,KAAK,CAAC;QAAE,IAAI,EAAE,QAAQ,CAAC;QAAC,IAAI,EAAE,MAAM,EAAE,CAAA;KAAE,CAAC;IAM5C,YAAY;IAOZ;;;;OAIG;IACH,gBAAgB,IAAI,QAAQ,EAAE;IAI9B;;;;OAIG;IACH,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,QAAQ,GAAG,IAAI;IAI5C;;;OAGG;IACH,qBAAqB,CAAC,cAAc,EAAE,MAAM,GAAG,QAAQ,GAAG,IAAI;IAW9D;;;;;OAKG;IACH,QAAQ,CAAC,IAAI,EAAE,QAAQ,GAAG,MAAM,GAAG,IAAI;IAIvC;;;;;OAKG;IACH,mBAAmB,CAAC,IAAI,EAAE,QAAQ,GAAG,QAAQ,EAAE;IAI/C;;;;;OAKG;IACH,YAAY,CAAC,IAAI,EAAE,QAAQ,GAAG,eAAe,GAAG,IAAI;IAIpD;;;;;;;OAOG;IACH,oBAAoB,CAAC,QAAQ,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,QAAQ,GAAG,IAAI;IA8C3E;;;;OAIG;IACH,qBAAqB,CACnB,QAAQ,EAAE,MAAM,EAChB,UAAU,EAAE,MAAM,GACjB;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI;CA8BtD"}
|