@lepid-labs/weft-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/LICENSE +21 -0
- package/dist/anchors/__tests__/markdown.test.d.ts +2 -0
- package/dist/anchors/__tests__/markdown.test.d.ts.map +1 -0
- package/dist/anchors/__tests__/markdown.test.js +130 -0
- package/dist/anchors/__tests__/markdown.test.js.map +1 -0
- package/dist/anchors/__tests__/openapi.test.d.ts +2 -0
- package/dist/anchors/__tests__/openapi.test.d.ts.map +1 -0
- package/dist/anchors/__tests__/openapi.test.js +115 -0
- package/dist/anchors/__tests__/openapi.test.js.map +1 -0
- package/dist/anchors/index.d.ts +35 -0
- package/dist/anchors/index.d.ts.map +1 -0
- package/dist/anchors/index.js +68 -0
- package/dist/anchors/index.js.map +1 -0
- package/dist/anchors/markdown.d.ts +15 -0
- package/dist/anchors/markdown.d.ts.map +1 -0
- package/dist/anchors/markdown.js +71 -0
- package/dist/anchors/markdown.js.map +1 -0
- package/dist/anchors/openapi.d.ts +24 -0
- package/dist/anchors/openapi.d.ts.map +1 -0
- package/dist/anchors/openapi.js +75 -0
- package/dist/anchors/openapi.js.map +1 -0
- package/dist/browser.d.ts +10 -0
- package/dist/browser.d.ts.map +1 -0
- package/dist/browser.js +8 -0
- package/dist/browser.js.map +1 -0
- package/dist/config.d.ts +47 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +393 -0
- package/dist/config.js.map +1 -0
- package/dist/config.test.d.ts +2 -0
- package/dist/config.test.d.ts.map +1 -0
- package/dist/config.test.js +454 -0
- package/dist/config.test.js.map +1 -0
- package/dist/content.d.ts +37 -0
- package/dist/content.d.ts.map +1 -0
- package/dist/content.js +57 -0
- package/dist/content.js.map +1 -0
- package/dist/content.test.d.ts +2 -0
- package/dist/content.test.d.ts.map +1 -0
- package/dist/content.test.js +100 -0
- package/dist/content.test.js.map +1 -0
- package/dist/contributions.d.ts +64 -0
- package/dist/contributions.d.ts.map +1 -0
- package/dist/contributions.js +184 -0
- package/dist/contributions.js.map +1 -0
- package/dist/contributions.test.d.ts +2 -0
- package/dist/contributions.test.d.ts.map +1 -0
- package/dist/contributions.test.js +202 -0
- package/dist/contributions.test.js.map +1 -0
- package/dist/fetch/auth.d.ts +15 -0
- package/dist/fetch/auth.d.ts.map +1 -0
- package/dist/fetch/auth.js +38 -0
- package/dist/fetch/auth.js.map +1 -0
- package/dist/fetch/cache.d.ts +25 -0
- package/dist/fetch/cache.d.ts.map +1 -0
- package/dist/fetch/cache.js +68 -0
- package/dist/fetch/cache.js.map +1 -0
- package/dist/fetch/cache.test.d.ts +2 -0
- package/dist/fetch/cache.test.d.ts.map +1 -0
- package/dist/fetch/cache.test.js +73 -0
- package/dist/fetch/cache.test.js.map +1 -0
- package/dist/fetch/clone.d.ts +26 -0
- package/dist/fetch/clone.d.ts.map +1 -0
- package/dist/fetch/clone.js +105 -0
- package/dist/fetch/clone.js.map +1 -0
- package/dist/fetch/fetch.test.d.ts +2 -0
- package/dist/fetch/fetch.test.d.ts.map +1 -0
- package/dist/fetch/fetch.test.js +167 -0
- package/dist/fetch/fetch.test.js.map +1 -0
- package/dist/fetch/resolve.d.ts +34 -0
- package/dist/fetch/resolve.d.ts.map +1 -0
- package/dist/fetch/resolve.js +59 -0
- package/dist/fetch/resolve.js.map +1 -0
- package/dist/freshness.d.ts +29 -0
- package/dist/freshness.d.ts.map +1 -0
- package/dist/freshness.js +170 -0
- package/dist/freshness.js.map +1 -0
- package/dist/freshness.test.d.ts +2 -0
- package/dist/freshness.test.d.ts.map +1 -0
- package/dist/freshness.test.js +209 -0
- package/dist/freshness.test.js.map +1 -0
- package/dist/frontmatter.d.ts +15 -0
- package/dist/frontmatter.d.ts.map +1 -0
- package/dist/frontmatter.js +24 -0
- package/dist/frontmatter.js.map +1 -0
- package/dist/frontmatter.test.d.ts +2 -0
- package/dist/frontmatter.test.d.ts.map +1 -0
- package/dist/frontmatter.test.js +54 -0
- package/dist/frontmatter.test.js.map +1 -0
- package/dist/git.d.ts +55 -0
- package/dist/git.d.ts.map +1 -0
- package/dist/git.js +127 -0
- package/dist/git.js.map +1 -0
- package/dist/git.test.d.ts +2 -0
- package/dist/git.test.d.ts.map +1 -0
- package/dist/git.test.js +198 -0
- package/dist/git.test.js.map +1 -0
- package/dist/includes.d.ts +53 -0
- package/dist/includes.d.ts.map +1 -0
- package/dist/includes.js +73 -0
- package/dist/includes.js.map +1 -0
- package/dist/includes.test.d.ts +2 -0
- package/dist/includes.test.d.ts.map +1 -0
- package/dist/includes.test.js +106 -0
- package/dist/includes.test.js.map +1 -0
- package/dist/index.d.ts +33 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +23 -0
- package/dist/index.js.map +1 -0
- package/dist/links/__tests__/markdown.test.d.ts +2 -0
- package/dist/links/__tests__/markdown.test.d.ts.map +1 -0
- package/dist/links/__tests__/markdown.test.js +173 -0
- package/dist/links/__tests__/markdown.test.js.map +1 -0
- package/dist/links/__tests__/sidecar.test.d.ts +2 -0
- package/dist/links/__tests__/sidecar.test.d.ts.map +1 -0
- package/dist/links/__tests__/sidecar.test.js +238 -0
- package/dist/links/__tests__/sidecar.test.js.map +1 -0
- package/dist/links/index.d.ts +3 -0
- package/dist/links/index.d.ts.map +1 -0
- package/dist/links/index.js +3 -0
- package/dist/links/index.js.map +1 -0
- package/dist/links/markdown.d.ts +13 -0
- package/dist/links/markdown.d.ts.map +1 -0
- package/dist/links/markdown.js +93 -0
- package/dist/links/markdown.js.map +1 -0
- package/dist/links/sidecar.d.ts +12 -0
- package/dist/links/sidecar.d.ts.map +1 -0
- package/dist/links/sidecar.js +88 -0
- package/dist/links/sidecar.js.map +1 -0
- package/dist/manifest.d.ts +45 -0
- package/dist/manifest.d.ts.map +1 -0
- package/dist/manifest.js +269 -0
- package/dist/manifest.js.map +1 -0
- package/dist/manifest.test.d.ts +2 -0
- package/dist/manifest.test.d.ts.map +1 -0
- package/dist/manifest.test.js +625 -0
- package/dist/manifest.test.js.map +1 -0
- package/dist/multi-repo.test.d.ts +2 -0
- package/dist/multi-repo.test.d.ts.map +1 -0
- package/dist/multi-repo.test.js +179 -0
- package/dist/multi-repo.test.js.map +1 -0
- package/dist/node-path.d.ts +13 -0
- package/dist/node-path.d.ts.map +1 -0
- package/dist/node-path.js +21 -0
- package/dist/node-path.js.map +1 -0
- package/dist/node-path.test.d.ts +2 -0
- package/dist/node-path.test.d.ts.map +1 -0
- package/dist/node-path.test.js +29 -0
- package/dist/node-path.test.js.map +1 -0
- package/dist/published-links.d.ts +16 -0
- package/dist/published-links.d.ts.map +1 -0
- package/dist/published-links.js +59 -0
- package/dist/published-links.js.map +1 -0
- package/dist/published-links.test.d.ts +2 -0
- package/dist/published-links.test.d.ts.map +1 -0
- package/dist/published-links.test.js +82 -0
- package/dist/published-links.test.js.map +1 -0
- package/dist/repos.d.ts +32 -0
- package/dist/repos.d.ts.map +1 -0
- package/dist/repos.js +46 -0
- package/dist/repos.js.map +1 -0
- package/dist/repos.test.d.ts +2 -0
- package/dist/repos.test.d.ts.map +1 -0
- package/dist/repos.test.js +61 -0
- package/dist/repos.test.js.map +1 -0
- package/dist/scalar-source.d.ts +15 -0
- package/dist/scalar-source.d.ts.map +1 -0
- package/dist/scalar-source.js +21 -0
- package/dist/scalar-source.js.map +1 -0
- package/dist/search.d.ts +14 -0
- package/dist/search.d.ts.map +1 -0
- package/dist/search.js +59 -0
- package/dist/search.js.map +1 -0
- package/dist/service-concurrency.test.d.ts +2 -0
- package/dist/service-concurrency.test.d.ts.map +1 -0
- package/dist/service-concurrency.test.js +89 -0
- package/dist/service-concurrency.test.js.map +1 -0
- package/dist/service-history.test.d.ts +2 -0
- package/dist/service-history.test.d.ts.map +1 -0
- package/dist/service-history.test.js +76 -0
- package/dist/service-history.test.js.map +1 -0
- package/dist/service.d.ts +118 -0
- package/dist/service.d.ts.map +1 -0
- package/dist/service.js +347 -0
- package/dist/service.js.map +1 -0
- package/dist/service.test.d.ts +2 -0
- package/dist/service.test.d.ts.map +1 -0
- package/dist/service.test.js +313 -0
- package/dist/service.test.js.map +1 -0
- package/dist/types.d.ts +403 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- package/dist/validate/__tests__/artifacts.test.d.ts +2 -0
- package/dist/validate/__tests__/artifacts.test.d.ts.map +1 -0
- package/dist/validate/__tests__/artifacts.test.js +167 -0
- package/dist/validate/__tests__/artifacts.test.js.map +1 -0
- package/dist/validate/__tests__/assertions.test.d.ts +2 -0
- package/dist/validate/__tests__/assertions.test.d.ts.map +1 -0
- package/dist/validate/__tests__/assertions.test.js +254 -0
- package/dist/validate/__tests__/assertions.test.js.map +1 -0
- package/dist/validate/__tests__/duplicates.test.d.ts +2 -0
- package/dist/validate/__tests__/duplicates.test.d.ts.map +1 -0
- package/dist/validate/__tests__/duplicates.test.js +130 -0
- package/dist/validate/__tests__/duplicates.test.js.map +1 -0
- package/dist/validate/__tests__/edge-resolution.test.d.ts +2 -0
- package/dist/validate/__tests__/edge-resolution.test.d.ts.map +1 -0
- package/dist/validate/__tests__/edge-resolution.test.js +279 -0
- package/dist/validate/__tests__/edge-resolution.test.js.map +1 -0
- package/dist/validate/__tests__/history.test.d.ts +2 -0
- package/dist/validate/__tests__/history.test.d.ts.map +1 -0
- package/dist/validate/__tests__/history.test.js +93 -0
- package/dist/validate/__tests__/history.test.js.map +1 -0
- package/dist/validate/__tests__/includes.test.d.ts +2 -0
- package/dist/validate/__tests__/includes.test.d.ts.map +1 -0
- package/dist/validate/__tests__/includes.test.js +93 -0
- package/dist/validate/__tests__/includes.test.js.map +1 -0
- package/dist/validate/__tests__/registry.test.d.ts +2 -0
- package/dist/validate/__tests__/registry.test.d.ts.map +1 -0
- package/dist/validate/__tests__/registry.test.js +78 -0
- package/dist/validate/__tests__/registry.test.js.map +1 -0
- package/dist/validate/__tests__/run.test.d.ts +2 -0
- package/dist/validate/__tests__/run.test.d.ts.map +1 -0
- package/dist/validate/__tests__/run.test.js +215 -0
- package/dist/validate/__tests__/run.test.js.map +1 -0
- package/dist/validate/history.d.ts +23 -0
- package/dist/validate/history.d.ts.map +1 -0
- package/dist/validate/history.js +45 -0
- package/dist/validate/history.js.map +1 -0
- package/dist/validate/index.d.ts +10 -0
- package/dist/validate/index.d.ts.map +1 -0
- package/dist/validate/index.js +9 -0
- package/dist/validate/index.js.map +1 -0
- package/dist/validate/registry.d.ts +27 -0
- package/dist/validate/registry.d.ts.map +1 -0
- package/dist/validate/registry.js +67 -0
- package/dist/validate/registry.js.map +1 -0
- package/dist/validate/rules/artifacts.d.ts +25 -0
- package/dist/validate/rules/artifacts.d.ts.map +1 -0
- package/dist/validate/rules/artifacts.js +87 -0
- package/dist/validate/rules/artifacts.js.map +1 -0
- package/dist/validate/rules/assertions.d.ts +19 -0
- package/dist/validate/rules/assertions.d.ts.map +1 -0
- package/dist/validate/rules/assertions.js +149 -0
- package/dist/validate/rules/assertions.js.map +1 -0
- package/dist/validate/rules/duplicates.d.ts +20 -0
- package/dist/validate/rules/duplicates.d.ts.map +1 -0
- package/dist/validate/rules/duplicates.js +0 -0
- package/dist/validate/rules/duplicates.js.map +1 -0
- package/dist/validate/rules/edge-resolution.d.ts +15 -0
- package/dist/validate/rules/edge-resolution.d.ts.map +1 -0
- package/dist/validate/rules/edge-resolution.js +185 -0
- package/dist/validate/rules/edge-resolution.js.map +1 -0
- package/dist/validate/rules/includes.d.ts +21 -0
- package/dist/validate/rules/includes.d.ts.map +1 -0
- package/dist/validate/rules/includes.js +112 -0
- package/dist/validate/rules/includes.js.map +1 -0
- package/dist/validate/run.d.ts +20 -0
- package/dist/validate/run.d.ts.map +1 -0
- package/dist/validate/run.js +90 -0
- package/dist/validate/run.js.map +1 -0
- package/dist/validate/types.d.ts +101 -0
- package/dist/validate/types.d.ts.map +1 -0
- package/dist/validate/types.js +2 -0
- package/dist/validate/types.js.map +1 -0
- package/package.json +54 -0
package/dist/service.js
ADDED
|
@@ -0,0 +1,347 @@
|
|
|
1
|
+
import { mkdirSync, readFileSync, writeFileSync } from "node:fs";
|
|
2
|
+
import { dirname, isAbsolute, relative, resolve, sep } from "node:path";
|
|
3
|
+
import chokidar from "chokidar";
|
|
4
|
+
import { getDocType } from "./anchors/index.js";
|
|
5
|
+
import { isNamespaced, resolveDocsRoots, rootForNodeId } from "./config.js";
|
|
6
|
+
import { loadContributions } from "./contributions.js";
|
|
7
|
+
import { isCachePath } from "./fetch/cache.js";
|
|
8
|
+
import { checkFreshness, computeInputsHash } from "./freshness.js";
|
|
9
|
+
import { fileHistory } from "./git.js";
|
|
10
|
+
import { buildRootGraph, mergeGraphs, splitManifest } from "./manifest.js";
|
|
11
|
+
import { SearchIndex } from "./search.js";
|
|
12
|
+
import { defaultRegistry, graphHistoryFrom, registryWantsHistory, validateManifest, } from "./validate/index.js";
|
|
13
|
+
/**
|
|
14
|
+
* How long a `freshness()` answer is served from cache before the docs tree
|
|
15
|
+
* is re-read.
|
|
16
|
+
*
|
|
17
|
+
* A burst of tool calls inside one agent turn lands well within this window;
|
|
18
|
+
* a human edit is picked up on the next turn rather than the next minute.
|
|
19
|
+
* `rebuild` invalidates the cache immediately regardless, since the cached
|
|
20
|
+
* answer is then known wrong.
|
|
21
|
+
*/
|
|
22
|
+
const FRESHNESS_CACHE_MS = 2000;
|
|
23
|
+
export class WeftService {
|
|
24
|
+
config;
|
|
25
|
+
roots;
|
|
26
|
+
graphs = new Map();
|
|
27
|
+
/**
|
|
28
|
+
* The last history walk per root, tagged with how deep it went. A rebuild
|
|
29
|
+
* replaces its targets' entries, so an entry is always as fresh as the
|
|
30
|
+
* graph built beside it. `validate` upgrades a `"dates"` entry to `"full"`
|
|
31
|
+
* on demand; the reverse never happens implicitly — a full walk answers a
|
|
32
|
+
* dates question, not the other way round.
|
|
33
|
+
*/
|
|
34
|
+
histories = new Map();
|
|
35
|
+
manifest = null;
|
|
36
|
+
searchIndex;
|
|
37
|
+
freshnessCache = null;
|
|
38
|
+
/**
|
|
39
|
+
* Bumped by every rebuild. A `freshness()` check spans an `await` over a
|
|
40
|
+
* full tree re-read, so a rebuild can complete underneath it — clearing
|
|
41
|
+
* the cache is not enough, because the in-flight check would then resume
|
|
42
|
+
* and write its pre-rebuild answer back. The check records the generation
|
|
43
|
+
* it started under and only caches if no rebuild happened in between.
|
|
44
|
+
*/
|
|
45
|
+
freshnessGeneration = 0;
|
|
46
|
+
/** In-flight check, so concurrent cache misses share one tree re-read. */
|
|
47
|
+
freshnessInFlight = null;
|
|
48
|
+
constructor(config) {
|
|
49
|
+
this.config = config;
|
|
50
|
+
this.roots = resolveDocsRoots(config);
|
|
51
|
+
this.searchIndex = new SearchIndex();
|
|
52
|
+
}
|
|
53
|
+
get weftConfig() {
|
|
54
|
+
return this.config;
|
|
55
|
+
}
|
|
56
|
+
/** All configured docs roots — one per project, or a single implicit root. */
|
|
57
|
+
get docsRoots() {
|
|
58
|
+
return this.roots;
|
|
59
|
+
}
|
|
60
|
+
/** True when node ids are namespaced by project slug. */
|
|
61
|
+
get namespaced() {
|
|
62
|
+
return isNamespaced(this.roots);
|
|
63
|
+
}
|
|
64
|
+
/** Get the docs directory absolute path. In multi-project mode, the first project's. */
|
|
65
|
+
get docsDir() {
|
|
66
|
+
return this.roots[0].absDir;
|
|
67
|
+
}
|
|
68
|
+
/** Path of the merged manifest. Always under `rootDir` when the docs root is not. */
|
|
69
|
+
get manifestPath() {
|
|
70
|
+
return this.namespaced || this.roots[0].external
|
|
71
|
+
? resolve(this.config.rootDir, ".weft", "manifest.json")
|
|
72
|
+
: resolve(this.docsDir, ".weft", "manifest.json");
|
|
73
|
+
}
|
|
74
|
+
/**
|
|
75
|
+
* Path of a single project's manifest.
|
|
76
|
+
*
|
|
77
|
+
* A root living in another checkout gets its manifest under this project's
|
|
78
|
+
* own `.weft/` — writing into a repo we do not own would dirty its git
|
|
79
|
+
* status on every index. `manifestInRepo` opts a co-owned repo back in.
|
|
80
|
+
*/
|
|
81
|
+
projectManifestPath(slug) {
|
|
82
|
+
const root = this.roots.find((r) => r.slug === slug);
|
|
83
|
+
if (!root)
|
|
84
|
+
throw new Error(`Unknown project: ${slug}`);
|
|
85
|
+
if (root.external && !root.manifestInRepo) {
|
|
86
|
+
return resolve(this.config.rootDir, ".weft", "projects", slug, "manifest.json");
|
|
87
|
+
}
|
|
88
|
+
return resolve(root.absDir, ".weft", "manifest.json");
|
|
89
|
+
}
|
|
90
|
+
/** Path of the index listing every project manifest. */
|
|
91
|
+
get projectsIndexPath() {
|
|
92
|
+
return resolve(this.config.rootDir, ".weft", "projects.json");
|
|
93
|
+
}
|
|
94
|
+
/** Resolve a node id to an absolute file path, or undefined if it escapes its root. */
|
|
95
|
+
resolveNodePath(nodeId) {
|
|
96
|
+
const match = rootForNodeId(this.roots, nodeId);
|
|
97
|
+
if (!match)
|
|
98
|
+
return undefined;
|
|
99
|
+
const filePath = resolve(match.root.absDir, match.relPath);
|
|
100
|
+
const rel = relative(match.root.absDir, filePath);
|
|
101
|
+
if (rel.startsWith("..") || isAbsolute(rel))
|
|
102
|
+
return undefined;
|
|
103
|
+
return filePath;
|
|
104
|
+
}
|
|
105
|
+
/** Walk one root's git history at the given depth and remember the result. */
|
|
106
|
+
async walkHistory(root, depth) {
|
|
107
|
+
const history = await fileHistory(root.absDir, depth);
|
|
108
|
+
this.histories.set(root.slug, { depth, history });
|
|
109
|
+
return history;
|
|
110
|
+
}
|
|
111
|
+
/**
|
|
112
|
+
* Build or rebuild the manifest from the filesystem. Pass a project slug to
|
|
113
|
+
* rescan only that project — the rest of the graph is reused.
|
|
114
|
+
*
|
|
115
|
+
* The history walk each root pays here is shared with `validate`: at the
|
|
116
|
+
* default `"dates"` depth it skips rename detection, since indexing only
|
|
117
|
+
* wants commit dates. `validate` builds at `"full"` depth instead when a
|
|
118
|
+
* history-reading rule is enabled, so `weft check` walks git exactly once
|
|
119
|
+
* per root rather than once for indexing and again for validation.
|
|
120
|
+
*
|
|
121
|
+
* The inputs hash always spans every root, even for a single-project
|
|
122
|
+
* rescan: it is the baseline for the whole merged manifest, not just the
|
|
123
|
+
* project that changed, so a partial rebuild that skipped roots outside
|
|
124
|
+
* `slug` would leave the hash wrong specifically in multi-project mode.
|
|
125
|
+
*/
|
|
126
|
+
async rebuild(slug, historyDepth = "dates") {
|
|
127
|
+
const targets = slug === undefined ? this.roots : this.roots.filter((root) => root.slug === slug);
|
|
128
|
+
// Hashed before the scan, not after: a file edited mid-scan would
|
|
129
|
+
// otherwise land in the hash but not in the graph, and the manifest
|
|
130
|
+
// would be stale yet report itself fresh. Hashing first inverts that
|
|
131
|
+
// race to the safe side — a file edited between the hash and the scan
|
|
132
|
+
// makes the manifest report stale when it is actually current, which
|
|
133
|
+
// costs an extra rebuild rather than a wrong "fresh" answer. That's the
|
|
134
|
+
// whole point of freshness, so the window has to fail toward stale.
|
|
135
|
+
const build = {
|
|
136
|
+
builtAt: new Date().toISOString(),
|
|
137
|
+
inputsHash: await computeInputsHash(this.config),
|
|
138
|
+
};
|
|
139
|
+
for (const root of targets) {
|
|
140
|
+
const history = await this.walkHistory(root, historyDepth);
|
|
141
|
+
this.graphs.set(root.slug, await buildRootGraph(this.config, root, this.roots, history.dates));
|
|
142
|
+
}
|
|
143
|
+
// Reloaded every rebuild: a build running alongside `weft serve` rewrites
|
|
144
|
+
// its contribution file, and the graph should follow.
|
|
145
|
+
this.manifest = mergeGraphs(this.config, this.roots, this.graphs, await loadContributions(this.config), build);
|
|
146
|
+
this.freshnessCache = null;
|
|
147
|
+
this.freshnessGeneration++;
|
|
148
|
+
this.searchIndex.build(this.manifest, (nodeId) => this.resolveNodePath(nodeId));
|
|
149
|
+
return this.manifest;
|
|
150
|
+
}
|
|
151
|
+
/** Get the current manifest, building it if necessary. */
|
|
152
|
+
async getManifest() {
|
|
153
|
+
if (!this.manifest) {
|
|
154
|
+
this.manifest = await this.rebuild();
|
|
155
|
+
}
|
|
156
|
+
return this.manifest;
|
|
157
|
+
}
|
|
158
|
+
/**
|
|
159
|
+
* Whether the manifest still reflects its docs tree.
|
|
160
|
+
*
|
|
161
|
+
* Answering honestly costs a full re-read of the docs tree, so the result
|
|
162
|
+
* is cached for {@link FRESHNESS_CACHE_MS} — see that constant for why.
|
|
163
|
+
* `rebuild` clears the cache immediately.
|
|
164
|
+
*/
|
|
165
|
+
async freshness() {
|
|
166
|
+
const now = Date.now();
|
|
167
|
+
if (this.freshnessCache && now - this.freshnessCache.checkedAt < FRESHNESS_CACHE_MS) {
|
|
168
|
+
return this.freshnessCache.result;
|
|
169
|
+
}
|
|
170
|
+
// Concurrent misses share one re-read — but only within a generation.
|
|
171
|
+
// A caller arriving after a rebuild must not join a check that started
|
|
172
|
+
// against the pre-rebuild manifest.
|
|
173
|
+
const generation = this.freshnessGeneration;
|
|
174
|
+
if (this.freshnessInFlight?.generation === generation) {
|
|
175
|
+
return this.freshnessInFlight.promise;
|
|
176
|
+
}
|
|
177
|
+
const promise = (async () => {
|
|
178
|
+
try {
|
|
179
|
+
const result = await checkFreshness(await this.getManifest(), this.config);
|
|
180
|
+
// A rebuild that completed while this check was reading the tree
|
|
181
|
+
// makes the answer obsolete before it lands: return it to the
|
|
182
|
+
// caller who asked, but never cache it over the rebuild's state.
|
|
183
|
+
if (generation === this.freshnessGeneration) {
|
|
184
|
+
this.freshnessCache = { checkedAt: now, result };
|
|
185
|
+
}
|
|
186
|
+
return result;
|
|
187
|
+
}
|
|
188
|
+
finally {
|
|
189
|
+
// Only one check runs per generation (later callers join it), so
|
|
190
|
+
// matching the generation is matching this very check — while a
|
|
191
|
+
// successor started after a rebuild is left alone.
|
|
192
|
+
if (this.freshnessInFlight?.generation === generation) {
|
|
193
|
+
this.freshnessInFlight = null;
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
})();
|
|
197
|
+
this.freshnessInFlight = { generation, promise };
|
|
198
|
+
return promise;
|
|
199
|
+
}
|
|
200
|
+
/**
|
|
201
|
+
* Write the manifest to disk. In multi-project mode this writes one manifest
|
|
202
|
+
* per project, an index of them, and the merged manifest at the project root.
|
|
203
|
+
* Returns every path written.
|
|
204
|
+
*/
|
|
205
|
+
async writeManifest() {
|
|
206
|
+
const manifest = await this.getManifest();
|
|
207
|
+
const written = [];
|
|
208
|
+
const write = (path, data) => {
|
|
209
|
+
mkdirSync(dirname(path), { recursive: true });
|
|
210
|
+
writeFileSync(path, JSON.stringify(data, null, 2));
|
|
211
|
+
written.push(path);
|
|
212
|
+
};
|
|
213
|
+
if (this.namespaced) {
|
|
214
|
+
for (const projectManifest of splitManifest(manifest, this.roots)) {
|
|
215
|
+
write(this.projectManifestPath(projectManifest.project.slug), projectManifest);
|
|
216
|
+
}
|
|
217
|
+
const index = {
|
|
218
|
+
version: 1,
|
|
219
|
+
projects: this.roots.map((root) => ({
|
|
220
|
+
name: root.name ?? root.slug,
|
|
221
|
+
slug: root.slug,
|
|
222
|
+
docsDir: root.dir,
|
|
223
|
+
...(root.repo !== undefined ? { repo: root.repo } : {}),
|
|
224
|
+
manifest: relative(this.config.rootDir, this.projectManifestPath(root.slug))
|
|
225
|
+
.split(sep)
|
|
226
|
+
.join("/"),
|
|
227
|
+
})),
|
|
228
|
+
manifest: ".weft/manifest.json",
|
|
229
|
+
};
|
|
230
|
+
write(this.projectsIndexPath, index);
|
|
231
|
+
}
|
|
232
|
+
write(this.manifestPath, manifest);
|
|
233
|
+
return written;
|
|
234
|
+
}
|
|
235
|
+
/**
|
|
236
|
+
* Read a document's content.
|
|
237
|
+
*
|
|
238
|
+
* An artifact is refused rather than read. Reading a binary as UTF-8 does not
|
|
239
|
+
* throw — it returns a lossy decode — so without this the caller receives
|
|
240
|
+
* nonsense wearing every sign of success, a 200 and a body, instead of an
|
|
241
|
+
* error it can act on.
|
|
242
|
+
*/
|
|
243
|
+
read(nodeId) {
|
|
244
|
+
const node = this.manifest?.nodes.find((candidate) => candidate.id === nodeId);
|
|
245
|
+
// The extension stands in for the type when the manifest is not built yet,
|
|
246
|
+
// and catches a path that was never a document in the first place.
|
|
247
|
+
if (node?.type === "artifact" || !getDocType(nodeId)) {
|
|
248
|
+
throw new Error(`Not a readable document: ${nodeId}`);
|
|
249
|
+
}
|
|
250
|
+
const filePath = this.resolveNodePath(nodeId);
|
|
251
|
+
if (!filePath)
|
|
252
|
+
throw new Error(`Document not found: ${nodeId}`);
|
|
253
|
+
return readFileSync(filePath, "utf-8");
|
|
254
|
+
}
|
|
255
|
+
/**
|
|
256
|
+
* Run the validation stage over the current manifest, building it first if
|
|
257
|
+
* necessary. Pass a registry to run a different set of checks than the
|
|
258
|
+
* built-in ones.
|
|
259
|
+
*
|
|
260
|
+
* History is shared with the build rather than walked again: a graph built
|
|
261
|
+
* here is built at `"full"` depth when a history-reading rule is enabled,
|
|
262
|
+
* and a graph built earlier at `"dates"` depth has each root upgraded once
|
|
263
|
+
* and remembered until its next rebuild.
|
|
264
|
+
*/
|
|
265
|
+
async validate(registry = defaultRegistry()) {
|
|
266
|
+
const wantsHistory = registryWantsHistory(registry, this.config);
|
|
267
|
+
if (!this.manifest) {
|
|
268
|
+
await this.rebuild(undefined, wantsHistory ? "full" : "dates");
|
|
269
|
+
}
|
|
270
|
+
const manifest = await this.getManifest();
|
|
271
|
+
if (!wantsHistory) {
|
|
272
|
+
return validateManifest(manifest, this.config, registry);
|
|
273
|
+
}
|
|
274
|
+
const walks = [];
|
|
275
|
+
for (const root of this.roots) {
|
|
276
|
+
const cached = this.histories.get(root.slug);
|
|
277
|
+
walks.push([
|
|
278
|
+
root,
|
|
279
|
+
cached?.depth === "full" ? cached.history : await this.walkHistory(root, "full"),
|
|
280
|
+
]);
|
|
281
|
+
}
|
|
282
|
+
return validateManifest(manifest, this.config, registry, graphHistoryFrom(walks));
|
|
283
|
+
}
|
|
284
|
+
/** Search the index. */
|
|
285
|
+
async search(query) {
|
|
286
|
+
await this.getManifest(); // Ensure index is built
|
|
287
|
+
return this.searchIndex.search(query);
|
|
288
|
+
}
|
|
289
|
+
/** Traverse the graph: find edges connected to a node. */
|
|
290
|
+
async traverse(nodeId, direction = "both") {
|
|
291
|
+
const manifest = await this.getManifest();
|
|
292
|
+
return manifest.edges.filter((edge) => {
|
|
293
|
+
if (direction === "outgoing" || direction === "both") {
|
|
294
|
+
if (edge.from.node === nodeId)
|
|
295
|
+
return true;
|
|
296
|
+
}
|
|
297
|
+
if (direction === "incoming" || direction === "both") {
|
|
298
|
+
if (edge.to.node === nodeId)
|
|
299
|
+
return true;
|
|
300
|
+
}
|
|
301
|
+
return false;
|
|
302
|
+
});
|
|
303
|
+
}
|
|
304
|
+
/**
|
|
305
|
+
* Watch every docs root for changes, rebuilding the changed project on change.
|
|
306
|
+
*
|
|
307
|
+
* A root inside the fetch cache is a checkout pinned to a commit — nothing
|
|
308
|
+
* edits it, so it is not watched.
|
|
309
|
+
*/
|
|
310
|
+
watch(callback) {
|
|
311
|
+
const watchers = this.roots
|
|
312
|
+
.filter((root) => !isCachePath(root.absDir))
|
|
313
|
+
.map((root) => {
|
|
314
|
+
const watcher = chokidar.watch(root.absDir, {
|
|
315
|
+
ignored: [
|
|
316
|
+
/(^|[/\\])\../, // dotfiles
|
|
317
|
+
"**/.weft/**", // manifest output
|
|
318
|
+
...this.config.ignore,
|
|
319
|
+
],
|
|
320
|
+
persistent: true,
|
|
321
|
+
ignoreInitial: true,
|
|
322
|
+
});
|
|
323
|
+
let debounceTimer = null;
|
|
324
|
+
const onChangeDebounced = () => {
|
|
325
|
+
if (debounceTimer)
|
|
326
|
+
clearTimeout(debounceTimer);
|
|
327
|
+
debounceTimer = setTimeout(async () => {
|
|
328
|
+
const manifest = await this.rebuild(root.slug);
|
|
329
|
+
callback?.(manifest);
|
|
330
|
+
}, 200);
|
|
331
|
+
};
|
|
332
|
+
watcher.on("add", onChangeDebounced);
|
|
333
|
+
watcher.on("change", onChangeDebounced);
|
|
334
|
+
watcher.on("unlink", onChangeDebounced);
|
|
335
|
+
return () => {
|
|
336
|
+
watcher.close();
|
|
337
|
+
if (debounceTimer)
|
|
338
|
+
clearTimeout(debounceTimer);
|
|
339
|
+
};
|
|
340
|
+
});
|
|
341
|
+
return () => {
|
|
342
|
+
for (const stop of watchers)
|
|
343
|
+
stop();
|
|
344
|
+
};
|
|
345
|
+
}
|
|
346
|
+
}
|
|
347
|
+
//# sourceMappingURL=service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"service.js","sourceRoot":"","sources":["../src/service.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"service.test.d.ts","sourceRoot":"","sources":["../src/service.test.ts"],"names":[],"mappings":""}
|