@vaultctl/core 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/frontmatter.d.ts +8 -0
- package/dist/frontmatter.d.ts.map +1 -0
- package/dist/frontmatter.js +12 -0
- package/dist/frontmatter.js.map +1 -0
- package/dist/health.d.ts +8 -0
- package/dist/health.d.ts.map +1 -0
- package/dist/health.js +94 -0
- package/dist/health.js.map +1 -0
- package/dist/index.d.ts +10 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +9 -0
- package/dist/index.js.map +1 -0
- package/dist/note.d.ts +3 -0
- package/dist/note.d.ts.map +1 -0
- package/dist/note.js +20 -0
- package/dist/note.js.map +1 -0
- package/dist/search.d.ts +9 -0
- package/dist/search.d.ts.map +1 -0
- package/dist/search.js +23 -0
- package/dist/search.js.map +1 -0
- package/dist/tags.d.ts +12 -0
- package/dist/tags.d.ts.map +1 -0
- package/dist/tags.js +56 -0
- package/dist/tags.js.map +1 -0
- package/dist/templates.d.ts +8 -0
- package/dist/templates.d.ts.map +1 -0
- package/dist/templates.js +32 -0
- package/dist/templates.js.map +1 -0
- package/dist/types.d.ts +38 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- package/dist/vault.d.ts +4 -0
- package/dist/vault.d.ts.map +1 -0
- package/dist/vault.js +69 -0
- package/dist/vault.js.map +1 -0
- package/dist/wikilinks.d.ts +4 -0
- package/dist/wikilinks.d.ts.map +1 -0
- package/dist/wikilinks.js +35 -0
- package/dist/wikilinks.js.map +1 -0
- package/package.json +21 -0
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { Frontmatter } from './types.js';
|
|
2
|
+
export interface ParsedContent {
|
|
3
|
+
frontmatter: Frontmatter;
|
|
4
|
+
body: string;
|
|
5
|
+
}
|
|
6
|
+
export declare function parseFrontmatter(content: string): ParsedContent;
|
|
7
|
+
export declare function stringifyFrontmatter(frontmatter: Frontmatter, body: string): string;
|
|
8
|
+
//# sourceMappingURL=frontmatter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"frontmatter.d.ts","sourceRoot":"","sources":["../src/frontmatter.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAE9C,MAAM,WAAW,aAAa;IAC5B,WAAW,EAAE,WAAW,CAAC;IACzB,IAAI,EAAE,MAAM,CAAC;CACd;AAED,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,MAAM,GAAG,aAAa,CAM/D;AAED,wBAAgB,oBAAoB,CAAC,WAAW,EAAE,WAAW,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,CAEnF"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import matter from 'gray-matter';
|
|
2
|
+
export function parseFrontmatter(content) {
|
|
3
|
+
const { data, content: body } = matter(content);
|
|
4
|
+
return {
|
|
5
|
+
frontmatter: data,
|
|
6
|
+
body: body.trim(),
|
|
7
|
+
};
|
|
8
|
+
}
|
|
9
|
+
export function stringifyFrontmatter(frontmatter, body) {
|
|
10
|
+
return matter.stringify(body, frontmatter);
|
|
11
|
+
}
|
|
12
|
+
//# sourceMappingURL=frontmatter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"frontmatter.js","sourceRoot":"","sources":["../src/frontmatter.ts"],"names":[],"mappings":"AAAA,OAAO,MAAM,MAAM,aAAa,CAAC;AAQjC,MAAM,UAAU,gBAAgB,CAAC,OAAe;IAC9C,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,GAAG,MAAM,CAAC,OAAO,CAAC,CAAC;IAChD,OAAO;QACL,WAAW,EAAE,IAAmB;QAChC,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE;KAClB,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,oBAAoB,CAAC,WAAwB,EAAE,IAAY;IACzE,OAAO,MAAM,CAAC,SAAS,CAAC,IAAI,EAAE,WAAW,CAAC,CAAC;AAC7C,CAAC"}
|
package/dist/health.d.ts
ADDED
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { Note, HealthIssue } from './types.js';
|
|
2
|
+
type CheckName = 'broken-links' | 'orphans' | 'stale' | 'frontmatter';
|
|
3
|
+
interface HealthOptions {
|
|
4
|
+
staleDays?: number;
|
|
5
|
+
}
|
|
6
|
+
export declare function checkHealth(notes: Note[], checks?: CheckName[], options?: HealthOptions): HealthIssue[];
|
|
7
|
+
export {};
|
|
8
|
+
//# sourceMappingURL=health.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"health.d.ts","sourceRoot":"","sources":["../src/health.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAEpD,KAAK,SAAS,GAAG,cAAc,GAAG,SAAS,GAAG,OAAO,GAAG,aAAa,CAAC;AAEtE,UAAU,aAAa;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAID,wBAAgB,WAAW,CACzB,KAAK,EAAE,IAAI,EAAE,EACb,MAAM,CAAC,EAAE,SAAS,EAAE,EACpB,OAAO,CAAC,EAAE,aAAa,GACtB,WAAW,EAAE,CAkBf"}
|
package/dist/health.js
ADDED
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
const ALL_CHECKS = ['broken-links', 'orphans', 'stale', 'frontmatter'];
|
|
2
|
+
export function checkHealth(notes, checks, options) {
|
|
3
|
+
const activeChecks = checks ?? ALL_CHECKS;
|
|
4
|
+
const issues = [];
|
|
5
|
+
if (activeChecks.includes('broken-links')) {
|
|
6
|
+
issues.push(...checkBrokenLinks(notes));
|
|
7
|
+
}
|
|
8
|
+
if (activeChecks.includes('orphans')) {
|
|
9
|
+
issues.push(...checkOrphans(notes));
|
|
10
|
+
}
|
|
11
|
+
if (activeChecks.includes('stale')) {
|
|
12
|
+
issues.push(...checkStale(notes, options?.staleDays ?? 30));
|
|
13
|
+
}
|
|
14
|
+
if (activeChecks.includes('frontmatter')) {
|
|
15
|
+
issues.push(...checkFrontmatter(notes));
|
|
16
|
+
}
|
|
17
|
+
return issues;
|
|
18
|
+
}
|
|
19
|
+
function checkBrokenLinks(notes) {
|
|
20
|
+
const issues = [];
|
|
21
|
+
for (const note of notes) {
|
|
22
|
+
for (const link of note.wikilinks) {
|
|
23
|
+
if (link.resolved === null) {
|
|
24
|
+
issues.push({
|
|
25
|
+
check: 'broken-links',
|
|
26
|
+
path: note.path,
|
|
27
|
+
message: `Broken link to [[${link.target}]]`,
|
|
28
|
+
severity: 'error',
|
|
29
|
+
});
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
return issues;
|
|
34
|
+
}
|
|
35
|
+
function checkOrphans(notes) {
|
|
36
|
+
const linkedPaths = new Set();
|
|
37
|
+
for (const note of notes) {
|
|
38
|
+
for (const link of note.wikilinks) {
|
|
39
|
+
if (link.resolved) {
|
|
40
|
+
linkedPaths.add(link.resolved);
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
const issues = [];
|
|
45
|
+
for (const note of notes) {
|
|
46
|
+
if (!linkedPaths.has(note.path)) {
|
|
47
|
+
issues.push({
|
|
48
|
+
check: 'orphans',
|
|
49
|
+
path: note.path,
|
|
50
|
+
message: 'No inbound links from other notes',
|
|
51
|
+
severity: 'warning',
|
|
52
|
+
});
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
return issues;
|
|
56
|
+
}
|
|
57
|
+
function checkStale(notes, days) {
|
|
58
|
+
const issues = [];
|
|
59
|
+
const cutoff = new Date();
|
|
60
|
+
cutoff.setDate(cutoff.getDate() - days);
|
|
61
|
+
for (const note of notes) {
|
|
62
|
+
const updated = note.frontmatter.updated;
|
|
63
|
+
if (!updated)
|
|
64
|
+
continue;
|
|
65
|
+
const updatedDate = new Date(updated);
|
|
66
|
+
if (updatedDate < cutoff) {
|
|
67
|
+
issues.push({
|
|
68
|
+
check: 'stale',
|
|
69
|
+
path: note.path,
|
|
70
|
+
message: `Last updated ${updated} (${days}+ days ago)`,
|
|
71
|
+
severity: 'info',
|
|
72
|
+
});
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
return issues;
|
|
76
|
+
}
|
|
77
|
+
function checkFrontmatter(notes) {
|
|
78
|
+
const issues = [];
|
|
79
|
+
const requiredFields = ['type', 'created', 'tags'];
|
|
80
|
+
for (const note of notes) {
|
|
81
|
+
for (const field of requiredFields) {
|
|
82
|
+
if (note.frontmatter[field] === undefined) {
|
|
83
|
+
issues.push({
|
|
84
|
+
check: 'frontmatter',
|
|
85
|
+
path: note.path,
|
|
86
|
+
message: `Missing required field: ${field}`,
|
|
87
|
+
severity: 'warning',
|
|
88
|
+
});
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
return issues;
|
|
93
|
+
}
|
|
94
|
+
//# sourceMappingURL=health.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"health.js","sourceRoot":"","sources":["../src/health.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
export type { Note, WikiLink, Frontmatter, HealthIssue, VaultStats } from './types.js';
|
|
2
|
+
export { parseFrontmatter, stringifyFrontmatter } from './frontmatter.js';
|
|
3
|
+
export { parseWikilinks, parseInlineTags } from './wikilinks.js';
|
|
4
|
+
export { parseNote } from './note.js';
|
|
5
|
+
export { loadVault, resolveVaultPath } from './vault.js';
|
|
6
|
+
export { searchNotes, type SearchOptions } from './search.js';
|
|
7
|
+
export { listTags, findByTag, addTag, removeTag, renameTag, type RenameResult } from './tags.js';
|
|
8
|
+
export { checkHealth } from './health.js';
|
|
9
|
+
export { listTemplates, renderTemplate, type Template } from './templates.js';
|
|
10
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,YAAY,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AACvF,OAAO,EAAE,gBAAgB,EAAE,oBAAoB,EAAE,MAAM,kBAAkB,CAAC;AAC1E,OAAO,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AACjE,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AACtC,OAAO,EAAE,SAAS,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AACzD,OAAO,EAAE,WAAW,EAAE,KAAK,aAAa,EAAE,MAAM,aAAa,CAAC;AAC9D,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,SAAS,EAAE,KAAK,YAAY,EAAE,MAAM,WAAW,CAAC;AACjG,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAC1C,OAAO,EAAE,aAAa,EAAE,cAAc,EAAE,KAAK,QAAQ,EAAE,MAAM,gBAAgB,CAAC"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
export { parseFrontmatter, stringifyFrontmatter } from './frontmatter.js';
|
|
2
|
+
export { parseWikilinks, parseInlineTags } from './wikilinks.js';
|
|
3
|
+
export { parseNote } from './note.js';
|
|
4
|
+
export { loadVault, resolveVaultPath } from './vault.js';
|
|
5
|
+
export { searchNotes } from './search.js';
|
|
6
|
+
export { listTags, findByTag, addTag, removeTag, renameTag } from './tags.js';
|
|
7
|
+
export { checkHealth } from './health.js';
|
|
8
|
+
export { listTemplates, renderTemplate } from './templates.js';
|
|
9
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,gBAAgB,EAAE,oBAAoB,EAAE,MAAM,kBAAkB,CAAC;AAC1E,OAAO,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AACjE,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AACtC,OAAO,EAAE,SAAS,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AACzD,OAAO,EAAE,WAAW,EAAsB,MAAM,aAAa,CAAC;AAC9D,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,SAAS,EAAqB,MAAM,WAAW,CAAC;AACjG,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAC1C,OAAO,EAAE,aAAa,EAAE,cAAc,EAAiB,MAAM,gBAAgB,CAAC"}
|
package/dist/note.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"note.d.ts","sourceRoot":"","sources":["../src/note.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,YAAY,CAAC;AAEvC,wBAAgB,SAAS,CAAC,YAAY,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,IAAI,CAiBrE"}
|
package/dist/note.js
ADDED
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { parseFrontmatter } from './frontmatter.js';
|
|
2
|
+
import { parseWikilinks, parseInlineTags } from './wikilinks.js';
|
|
3
|
+
export function parseNote(relativePath, content) {
|
|
4
|
+
const { frontmatter, body } = parseFrontmatter(content);
|
|
5
|
+
const wikilinks = parseWikilinks(body);
|
|
6
|
+
const inlineTags = parseInlineTags(body);
|
|
7
|
+
const parts = relativePath.split('/');
|
|
8
|
+
const filename = parts[parts.length - 1];
|
|
9
|
+
const folder = parts.length > 1 ? parts.slice(0, -1).join('/') : '';
|
|
10
|
+
return {
|
|
11
|
+
path: relativePath,
|
|
12
|
+
filename,
|
|
13
|
+
folder,
|
|
14
|
+
frontmatter,
|
|
15
|
+
body,
|
|
16
|
+
wikilinks,
|
|
17
|
+
inlineTags,
|
|
18
|
+
};
|
|
19
|
+
}
|
|
20
|
+
//# sourceMappingURL=note.js.map
|
package/dist/note.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"note.js","sourceRoot":"","sources":["../src/note.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AACpD,OAAO,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AAGjE,MAAM,UAAU,SAAS,CAAC,YAAoB,EAAE,OAAe;IAC7D,MAAM,EAAE,WAAW,EAAE,IAAI,EAAE,GAAG,gBAAgB,CAAC,OAAO,CAAC,CAAC;IACxD,MAAM,SAAS,GAAG,cAAc,CAAC,IAAI,CAAC,CAAC;IACvC,MAAM,UAAU,GAAG,eAAe,CAAC,IAAI,CAAC,CAAC;IACzC,MAAM,KAAK,GAAG,YAAY,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IACtC,MAAM,QAAQ,GAAG,KAAK,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IACzC,MAAM,MAAM,GAAG,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IAEpE,OAAO;QACL,IAAI,EAAE,YAAY;QAClB,QAAQ;QACR,MAAM;QACN,WAAW;QACX,IAAI;QACJ,SAAS;QACT,UAAU;KACX,CAAC;AACJ,CAAC"}
|
package/dist/search.d.ts
ADDED
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { Note } from './types.js';
|
|
2
|
+
export interface SearchOptions {
|
|
3
|
+
query?: string;
|
|
4
|
+
type?: string;
|
|
5
|
+
status?: string;
|
|
6
|
+
tag?: string;
|
|
7
|
+
}
|
|
8
|
+
export declare function searchNotes(notes: Note[], options: SearchOptions): Note[];
|
|
9
|
+
//# sourceMappingURL=search.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"search.d.ts","sourceRoot":"","sources":["../src/search.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,YAAY,CAAC;AAEvC,MAAM,WAAW,aAAa;IAC5B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,GAAG,CAAC,EAAE,MAAM,CAAC;CACd;AAED,wBAAgB,WAAW,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE,OAAO,EAAE,aAAa,GAAG,IAAI,EAAE,CAuBzE"}
|
package/dist/search.js
ADDED
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
export function searchNotes(notes, options) {
|
|
2
|
+
return notes.filter(note => {
|
|
3
|
+
if (options.query) {
|
|
4
|
+
const q = options.query.toLowerCase();
|
|
5
|
+
const searchable = `${note.filename} ${note.body} ${JSON.stringify(note.frontmatter)}`.toLowerCase();
|
|
6
|
+
if (!searchable.includes(q))
|
|
7
|
+
return false;
|
|
8
|
+
}
|
|
9
|
+
if (options.type && note.frontmatter.type !== options.type) {
|
|
10
|
+
return false;
|
|
11
|
+
}
|
|
12
|
+
if (options.status && note.frontmatter.status !== options.status) {
|
|
13
|
+
return false;
|
|
14
|
+
}
|
|
15
|
+
if (options.tag) {
|
|
16
|
+
const allTags = [...(note.frontmatter.tags ?? []), ...note.inlineTags];
|
|
17
|
+
if (!allTags.includes(options.tag))
|
|
18
|
+
return false;
|
|
19
|
+
}
|
|
20
|
+
return true;
|
|
21
|
+
});
|
|
22
|
+
}
|
|
23
|
+
//# sourceMappingURL=search.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"search.js","sourceRoot":"","sources":["../src/search.ts"],"names":[],"mappings":"AASA,MAAM,UAAU,WAAW,CAAC,KAAa,EAAE,OAAsB;IAC/D,OAAO,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE;QACzB,IAAI,OAAO,CAAC,KAAK,EAAE,CAAC;YAClB,MAAM,CAAC,GAAG,OAAO,CAAC,KAAK,CAAC,WAAW,EAAE,CAAC;YACtC,MAAM,UAAU,GAAG,GAAG,IAAI,CAAC,QAAQ,IAAI,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,WAAW,CAAC,EAAE,CAAC,WAAW,EAAE,CAAC;YACrG,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,CAAC;gBAAE,OAAO,KAAK,CAAC;QAC5C,CAAC;QAED,IAAI,OAAO,CAAC,IAAI,IAAI,IAAI,CAAC,WAAW,CAAC,IAAI,KAAK,OAAO,CAAC,IAAI,EAAE,CAAC;YAC3D,OAAO,KAAK,CAAC;QACf,CAAC;QAED,IAAI,OAAO,CAAC,MAAM,IAAI,IAAI,CAAC,WAAW,CAAC,MAAM,KAAK,OAAO,CAAC,MAAM,EAAE,CAAC;YACjE,OAAO,KAAK,CAAC;QACf,CAAC;QAED,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC;YAChB,MAAM,OAAO,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,WAAW,CAAC,IAAI,IAAI,EAAE,CAAC,EAAE,GAAG,IAAI,CAAC,UAAU,CAAC,CAAC;YACvE,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC;gBAAE,OAAO,KAAK,CAAC;QACnD,CAAC;QAED,OAAO,IAAI,CAAC;IACd,CAAC,CAAC,CAAC;AACL,CAAC"}
|
package/dist/tags.d.ts
ADDED
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import type { Note } from './types.js';
|
|
2
|
+
export declare function listTags(notes: Note[]): Map<string, number>;
|
|
3
|
+
export declare function findByTag(notes: Note[], tag: string): Note[];
|
|
4
|
+
export declare function addTag(fileContent: string, tag: string): string;
|
|
5
|
+
export declare function removeTag(fileContent: string, tag: string): string;
|
|
6
|
+
export interface RenameResult {
|
|
7
|
+
path: string;
|
|
8
|
+
oldContent: string;
|
|
9
|
+
newContent: string;
|
|
10
|
+
}
|
|
11
|
+
export declare function renameTag(notes: Note[], oldTag: string, newTag: string): RenameResult[];
|
|
12
|
+
//# sourceMappingURL=tags.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tags.d.ts","sourceRoot":"","sources":["../src/tags.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,YAAY,CAAC;AAEvC,wBAAgB,QAAQ,CAAC,KAAK,EAAE,IAAI,EAAE,GAAG,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAW3D;AAED,wBAAgB,SAAS,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE,GAAG,EAAE,MAAM,GAAG,IAAI,EAAE,CAK5D;AAED,wBAAgB,MAAM,CAAC,WAAW,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,CAU/D;AAED,wBAAgB,SAAS,CAAC,WAAW,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,CAKlE;AAED,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,wBAAgB,SAAS,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,YAAY,EAAE,CA4BvF"}
|
package/dist/tags.js
ADDED
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
import { parseFrontmatter, stringifyFrontmatter } from './frontmatter.js';
|
|
2
|
+
export function listTags(notes) {
|
|
3
|
+
const counts = new Map();
|
|
4
|
+
for (const note of notes) {
|
|
5
|
+
const allTags = [...(note.frontmatter.tags ?? []), ...note.inlineTags];
|
|
6
|
+
for (const tag of allTags) {
|
|
7
|
+
counts.set(tag, (counts.get(tag) ?? 0) + 1);
|
|
8
|
+
}
|
|
9
|
+
}
|
|
10
|
+
return counts;
|
|
11
|
+
}
|
|
12
|
+
export function findByTag(notes, tag) {
|
|
13
|
+
return notes.filter(note => {
|
|
14
|
+
const allTags = [...(note.frontmatter.tags ?? []), ...note.inlineTags];
|
|
15
|
+
return allTags.includes(tag);
|
|
16
|
+
});
|
|
17
|
+
}
|
|
18
|
+
export function addTag(fileContent, tag) {
|
|
19
|
+
const { frontmatter, body } = parseFrontmatter(fileContent);
|
|
20
|
+
const tags = frontmatter.tags ?? [];
|
|
21
|
+
if (!tags.includes(tag)) {
|
|
22
|
+
tags.push(tag);
|
|
23
|
+
}
|
|
24
|
+
frontmatter.tags = tags;
|
|
25
|
+
return stringifyFrontmatter(frontmatter, body);
|
|
26
|
+
}
|
|
27
|
+
export function removeTag(fileContent, tag) {
|
|
28
|
+
const { frontmatter, body } = parseFrontmatter(fileContent);
|
|
29
|
+
const tags = frontmatter.tags ?? [];
|
|
30
|
+
frontmatter.tags = tags.filter(t => t !== tag);
|
|
31
|
+
return stringifyFrontmatter(frontmatter, body);
|
|
32
|
+
}
|
|
33
|
+
export function renameTag(notes, oldTag, newTag) {
|
|
34
|
+
const affected = [];
|
|
35
|
+
for (const note of notes) {
|
|
36
|
+
const allTags = [...(note.frontmatter.tags ?? []), ...note.inlineTags];
|
|
37
|
+
if (!allTags.includes(oldTag))
|
|
38
|
+
continue;
|
|
39
|
+
const oldContent = stringifyFrontmatter(note.frontmatter, note.body);
|
|
40
|
+
const newFrontmatter = { ...note.frontmatter };
|
|
41
|
+
if (newFrontmatter.tags) {
|
|
42
|
+
newFrontmatter.tags = newFrontmatter.tags.map(t => t === oldTag ? newTag : t);
|
|
43
|
+
}
|
|
44
|
+
let newBody = note.body;
|
|
45
|
+
newBody = newBody.replace(new RegExp(`(?<=^|\\s)#${escapeRegex(oldTag)}(?=\\s|$)`, 'g'), `#${newTag}`);
|
|
46
|
+
const newContent = stringifyFrontmatter(newFrontmatter, newBody);
|
|
47
|
+
if (oldContent !== newContent) {
|
|
48
|
+
affected.push({ path: note.path, oldContent, newContent });
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
return affected;
|
|
52
|
+
}
|
|
53
|
+
function escapeRegex(str) {
|
|
54
|
+
return str.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
|
|
55
|
+
}
|
|
56
|
+
//# sourceMappingURL=tags.js.map
|
package/dist/tags.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tags.js","sourceRoot":"","sources":["../src/tags.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
export interface Template {
|
|
2
|
+
name: string;
|
|
3
|
+
filename: string;
|
|
4
|
+
path: string;
|
|
5
|
+
}
|
|
6
|
+
export declare function listTemplates(vaultPath: string): Promise<Template[]>;
|
|
7
|
+
export declare function renderTemplate(vaultPath: string, templateName: string, title?: string): Promise<string>;
|
|
8
|
+
//# sourceMappingURL=templates.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"templates.d.ts","sourceRoot":"","sources":["../src/templates.ts"],"names":[],"mappings":"AAIA,MAAM,WAAW,QAAQ;IACvB,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;CACd;AAED,wBAAsB,aAAa,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,QAAQ,EAAE,CAAC,CAS1E;AAED,wBAAsB,cAAc,CAClC,SAAS,EAAE,MAAM,EACjB,YAAY,EAAE,MAAM,EACpB,KAAK,CAAC,EAAE,MAAM,GACb,OAAO,CAAC,MAAM,CAAC,CAwBjB"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import { readFile } from 'fs/promises';
|
|
2
|
+
import { join } from 'path';
|
|
3
|
+
import fg from 'fast-glob';
|
|
4
|
+
export async function listTemplates(vaultPath) {
|
|
5
|
+
const templatesDir = join(vaultPath, '_templates');
|
|
6
|
+
const files = await fg('tpl-*.md', { cwd: templatesDir, absolute: false });
|
|
7
|
+
return files.map(f => ({
|
|
8
|
+
name: f.replace(/^tpl-/, '').replace(/\.md$/, ''),
|
|
9
|
+
filename: f,
|
|
10
|
+
path: `_templates/${f}`,
|
|
11
|
+
}));
|
|
12
|
+
}
|
|
13
|
+
export async function renderTemplate(vaultPath, templateName, title) {
|
|
14
|
+
const templates = await listTemplates(vaultPath);
|
|
15
|
+
const template = templates.find(t => t.name === templateName);
|
|
16
|
+
if (!template) {
|
|
17
|
+
throw new Error(`Template not found: ${templateName}. Available: ${templates.map(t => t.name).join(', ')}`);
|
|
18
|
+
}
|
|
19
|
+
const filePath = join(vaultPath, template.path);
|
|
20
|
+
let content = await readFile(filePath, 'utf-8');
|
|
21
|
+
const today = new Date().toISOString().split('T')[0];
|
|
22
|
+
const resolvedTitle = title ?? today;
|
|
23
|
+
// Replace Templater-style variables with simple equivalents
|
|
24
|
+
content = content.replace(/<% tp\.date\.now\("YYYY-MM-DD"\) %>/g, today);
|
|
25
|
+
content = content.replace(/<% tp\.date\.now\("YYYY-MM-DD, dddd"\) %>/g, today);
|
|
26
|
+
content = content.replace(/<% tp\.file\.title %>/g, resolvedTitle);
|
|
27
|
+
// Replace our own simpler placeholders
|
|
28
|
+
content = content.replace(/\{\{date\}\}/g, today);
|
|
29
|
+
content = content.replace(/\{\{title\}\}/g, resolvedTitle);
|
|
30
|
+
return content;
|
|
31
|
+
}
|
|
32
|
+
//# sourceMappingURL=templates.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"templates.js","sourceRoot":"","sources":["../src/templates.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AACvC,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAC5B,OAAO,EAAE,MAAM,WAAW,CAAC;AAQ3B,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,SAAiB;IACnD,MAAM,YAAY,GAAG,IAAI,CAAC,SAAS,EAAE,YAAY,CAAC,CAAC;IACnD,MAAM,KAAK,GAAG,MAAM,EAAE,CAAC,UAAU,EAAE,EAAE,GAAG,EAAE,YAAY,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC,CAAC;IAE3E,OAAO,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;QACrB,IAAI,EAAE,CAAC,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC;QACjD,QAAQ,EAAE,CAAC;QACX,IAAI,EAAE,cAAc,CAAC,EAAE;KACxB,CAAC,CAAC,CAAC;AACN,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,cAAc,CAClC,SAAiB,EACjB,YAAoB,EACpB,KAAc;IAEd,MAAM,SAAS,GAAG,MAAM,aAAa,CAAC,SAAS,CAAC,CAAC;IACjD,MAAM,QAAQ,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,YAAY,CAAC,CAAC;IAE9D,IAAI,CAAC,QAAQ,EAAE,CAAC;QACd,MAAM,IAAI,KAAK,CAAC,uBAAuB,YAAY,gBAAgB,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAC9G,CAAC;IAED,MAAM,QAAQ,GAAG,IAAI,CAAC,SAAS,EAAE,QAAQ,CAAC,IAAI,CAAC,CAAC;IAChD,IAAI,OAAO,GAAG,MAAM,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;IAEhD,MAAM,KAAK,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;IACrD,MAAM,aAAa,GAAG,KAAK,IAAI,KAAK,CAAC;IAErC,4DAA4D;IAC5D,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,sCAAsC,EAAE,KAAK,CAAC,CAAC;IACzE,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,4CAA4C,EAAE,KAAK,CAAC,CAAC;IAC/E,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,wBAAwB,EAAE,aAAa,CAAC,CAAC;IAEnE,uCAAuC;IACvC,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,eAAe,EAAE,KAAK,CAAC,CAAC;IAClD,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,gBAAgB,EAAE,aAAa,CAAC,CAAC;IAE3D,OAAO,OAAO,CAAC;AACjB,CAAC"}
|
package/dist/types.d.ts
ADDED
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
export interface Frontmatter {
|
|
2
|
+
type?: string;
|
|
3
|
+
status?: string;
|
|
4
|
+
tags?: string[];
|
|
5
|
+
created?: string;
|
|
6
|
+
updated?: string;
|
|
7
|
+
[key: string]: unknown;
|
|
8
|
+
}
|
|
9
|
+
export interface WikiLink {
|
|
10
|
+
raw: string;
|
|
11
|
+
target: string;
|
|
12
|
+
alias?: string;
|
|
13
|
+
resolved?: string | null;
|
|
14
|
+
}
|
|
15
|
+
export interface Note {
|
|
16
|
+
path: string;
|
|
17
|
+
filename: string;
|
|
18
|
+
folder: string;
|
|
19
|
+
frontmatter: Frontmatter;
|
|
20
|
+
body: string;
|
|
21
|
+
wikilinks: WikiLink[];
|
|
22
|
+
inlineTags: string[];
|
|
23
|
+
}
|
|
24
|
+
export interface HealthIssue {
|
|
25
|
+
check: string;
|
|
26
|
+
path: string;
|
|
27
|
+
message: string;
|
|
28
|
+
severity: 'error' | 'warning' | 'info';
|
|
29
|
+
}
|
|
30
|
+
export interface VaultStats {
|
|
31
|
+
totalNotes: number;
|
|
32
|
+
notesByType: Record<string, number>;
|
|
33
|
+
notesByStatus: Record<string, number>;
|
|
34
|
+
totalTags: number;
|
|
35
|
+
brokenLinks: number;
|
|
36
|
+
orphanedNotes: number;
|
|
37
|
+
}
|
|
38
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,WAAW;IAC1B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB;AAED,MAAM,WAAW,QAAQ;IACvB,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CAC1B;AAED,MAAM,WAAW,IAAI;IACnB,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,EAAE,WAAW,CAAC;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,QAAQ,EAAE,CAAC;IACtB,UAAU,EAAE,MAAM,EAAE,CAAC;CACtB;AAED,MAAM,WAAW,WAAW;IAC1B,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,OAAO,GAAG,SAAS,GAAG,MAAM,CAAC;CACxC;AAED,MAAM,WAAW,UAAU;IACzB,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACpC,aAAa,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACtC,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,aAAa,EAAE,MAAM,CAAC;CACvB"}
|
package/dist/types.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":""}
|
package/dist/vault.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"vault.d.ts","sourceRoot":"","sources":["../src/vault.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,YAAY,CAAC;AAEvC,wBAAsB,SAAS,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,EAAE,CAAC,CA6BlE;AAED,wBAAgB,gBAAgB,CAAC,SAAS,CAAC,EAAE,MAAM,GAAG,MAAM,CA0C3D"}
|
package/dist/vault.js
ADDED
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
import { readFile } from 'fs/promises';
|
|
2
|
+
import { resolve, join, dirname } from 'path';
|
|
3
|
+
import { existsSync, readFileSync } from 'fs';
|
|
4
|
+
import fg from 'fast-glob';
|
|
5
|
+
import { parseNote } from './note.js';
|
|
6
|
+
export async function loadVault(vaultPath) {
|
|
7
|
+
const absPath = resolve(vaultPath);
|
|
8
|
+
const files = await fg('**/*.md', {
|
|
9
|
+
cwd: absPath,
|
|
10
|
+
ignore: ['_templates/**', '.obsidian/**', '.trash/**'],
|
|
11
|
+
absolute: false,
|
|
12
|
+
});
|
|
13
|
+
const notes = [];
|
|
14
|
+
for (const file of files) {
|
|
15
|
+
const content = await readFile(join(absPath, file), 'utf-8');
|
|
16
|
+
notes.push(parseNote(file, content));
|
|
17
|
+
}
|
|
18
|
+
// Resolve wikilinks
|
|
19
|
+
const filenameMap = new Map();
|
|
20
|
+
for (const note of notes) {
|
|
21
|
+
const name = note.filename.replace(/\.md$/, '');
|
|
22
|
+
filenameMap.set(name.toLowerCase(), note.path);
|
|
23
|
+
}
|
|
24
|
+
for (const note of notes) {
|
|
25
|
+
for (const link of note.wikilinks) {
|
|
26
|
+
const resolved = filenameMap.get(link.target.toLowerCase()) ?? null;
|
|
27
|
+
link.resolved = resolved;
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
return notes;
|
|
31
|
+
}
|
|
32
|
+
export function resolveVaultPath(startPath) {
|
|
33
|
+
// 1. Explicit path provided
|
|
34
|
+
if (startPath) {
|
|
35
|
+
const abs = resolve(startPath);
|
|
36
|
+
if (existsSync(join(abs, '.obsidian'))) {
|
|
37
|
+
return abs;
|
|
38
|
+
}
|
|
39
|
+
throw new Error(`No .obsidian directory found at: ${abs}`);
|
|
40
|
+
}
|
|
41
|
+
// 2. Environment variable
|
|
42
|
+
const envPath = process.env['VAULTCTL_PATH'];
|
|
43
|
+
if (envPath) {
|
|
44
|
+
const abs = resolve(envPath);
|
|
45
|
+
if (existsSync(join(abs, '.obsidian'))) {
|
|
46
|
+
return abs;
|
|
47
|
+
}
|
|
48
|
+
throw new Error(`VAULTCTL_PATH set to ${envPath} but no .obsidian directory found`);
|
|
49
|
+
}
|
|
50
|
+
// 3. Walk up from cwd
|
|
51
|
+
let dir = process.cwd();
|
|
52
|
+
while (dir !== dirname(dir)) {
|
|
53
|
+
if (existsSync(join(dir, '.obsidian'))) {
|
|
54
|
+
return dir;
|
|
55
|
+
}
|
|
56
|
+
dir = dirname(dir);
|
|
57
|
+
}
|
|
58
|
+
// 4. Config file
|
|
59
|
+
const configPath = join(process.env['HOME'] ?? '', '.vaultctlrc');
|
|
60
|
+
if (existsSync(configPath)) {
|
|
61
|
+
const configContent = readFileSync(configPath, 'utf-8').trim();
|
|
62
|
+
if (existsSync(join(configContent, '.obsidian'))) {
|
|
63
|
+
return resolve(configContent);
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
throw new Error('Could not find an Obsidian vault. Use --vault, set VAULTCTL_PATH, ' +
|
|
67
|
+
'run from inside a vault, or create ~/.vaultctlrc with the vault path.');
|
|
68
|
+
}
|
|
69
|
+
//# sourceMappingURL=vault.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"vault.js","sourceRoot":"","sources":["../src/vault.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"wikilinks.d.ts","sourceRoot":"","sources":["../src/wikilinks.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAK3C,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,QAAQ,EAAE,CAoBvD;AAED,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE,CAetD"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
const WIKILINK_RE = /\[\[([^\]]+)\]\]/g;
|
|
2
|
+
const INLINE_TAG_RE = /(?<=^|\s)#([a-zA-Z][\w/-]*)/g;
|
|
3
|
+
export function parseWikilinks(body) {
|
|
4
|
+
const links = [];
|
|
5
|
+
let match;
|
|
6
|
+
while ((match = WIKILINK_RE.exec(body)) !== null) {
|
|
7
|
+
const inner = match[1];
|
|
8
|
+
const withoutAnchor = inner.split('#')[0];
|
|
9
|
+
const parts = withoutAnchor.split('|');
|
|
10
|
+
const target = parts[0].trim();
|
|
11
|
+
const alias = parts.length > 1 ? inner.split('|')[1]?.trim() : undefined;
|
|
12
|
+
links.push({
|
|
13
|
+
raw: match[0],
|
|
14
|
+
target,
|
|
15
|
+
alias,
|
|
16
|
+
resolved: null,
|
|
17
|
+
});
|
|
18
|
+
}
|
|
19
|
+
return links;
|
|
20
|
+
}
|
|
21
|
+
export function parseInlineTags(body) {
|
|
22
|
+
const tags = [];
|
|
23
|
+
const lines = body.split('\n');
|
|
24
|
+
for (const line of lines) {
|
|
25
|
+
if (/^\s*#{1,6}\s/.test(line))
|
|
26
|
+
continue;
|
|
27
|
+
let match;
|
|
28
|
+
const re = new RegExp(INLINE_TAG_RE.source, 'g');
|
|
29
|
+
while ((match = re.exec(line)) !== null) {
|
|
30
|
+
tags.push(match[1]);
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
return tags;
|
|
34
|
+
}
|
|
35
|
+
//# sourceMappingURL=wikilinks.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"wikilinks.js","sourceRoot":"","sources":["../src/wikilinks.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,GAAG,mBAAmB,CAAC;AACxC,MAAM,aAAa,GAAG,8BAA8B,CAAC;AAErD,MAAM,UAAU,cAAc,CAAC,IAAY;IACzC,MAAM,KAAK,GAAe,EAAE,CAAC;IAC7B,IAAI,KAA6B,CAAC;IAElC,OAAO,CAAC,KAAK,GAAG,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC;QACjD,MAAM,KAAK,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;QACvB,MAAM,aAAa,GAAG,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;QAC1C,MAAM,KAAK,GAAG,aAAa,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QACvC,MAAM,MAAM,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;QAC/B,MAAM,KAAK,GAAG,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC;QAEzE,KAAK,CAAC,IAAI,CAAC;YACT,GAAG,EAAE,KAAK,CAAC,CAAC,CAAC;YACb,MAAM;YACN,KAAK;YACL,QAAQ,EAAE,IAAI;SACf,CAAC,CAAC;IACL,CAAC;IAED,OAAO,KAAK,CAAC;AACf,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,IAAY;IAC1C,MAAM,IAAI,GAAa,EAAE,CAAC;IAC1B,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAE/B,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,IAAI,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC;YAAE,SAAS;QAExC,IAAI,KAA6B,CAAC;QAClC,MAAM,EAAE,GAAG,IAAI,MAAM,CAAC,aAAa,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;QACjD,OAAO,CAAC,KAAK,GAAG,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC;YACxC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;QACtB,CAAC;IACH,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC"}
|
package/package.json
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@vaultctl/core",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"type": "module",
|
|
5
|
+
"files": ["dist"],
|
|
6
|
+
"main": "./dist/index.js",
|
|
7
|
+
"types": "./dist/index.d.ts",
|
|
8
|
+
"exports": {
|
|
9
|
+
".": {
|
|
10
|
+
"import": "./dist/index.js",
|
|
11
|
+
"types": "./dist/index.d.ts"
|
|
12
|
+
}
|
|
13
|
+
},
|
|
14
|
+
"scripts": {
|
|
15
|
+
"build": "tsc"
|
|
16
|
+
},
|
|
17
|
+
"dependencies": {
|
|
18
|
+
"fast-glob": "^3.3.0",
|
|
19
|
+
"gray-matter": "^4.0.3"
|
|
20
|
+
}
|
|
21
|
+
}
|