@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.
Files changed (266) hide show
  1. package/LICENSE +21 -0
  2. package/dist/anchors/__tests__/markdown.test.d.ts +2 -0
  3. package/dist/anchors/__tests__/markdown.test.d.ts.map +1 -0
  4. package/dist/anchors/__tests__/markdown.test.js +130 -0
  5. package/dist/anchors/__tests__/markdown.test.js.map +1 -0
  6. package/dist/anchors/__tests__/openapi.test.d.ts +2 -0
  7. package/dist/anchors/__tests__/openapi.test.d.ts.map +1 -0
  8. package/dist/anchors/__tests__/openapi.test.js +115 -0
  9. package/dist/anchors/__tests__/openapi.test.js.map +1 -0
  10. package/dist/anchors/index.d.ts +35 -0
  11. package/dist/anchors/index.d.ts.map +1 -0
  12. package/dist/anchors/index.js +68 -0
  13. package/dist/anchors/index.js.map +1 -0
  14. package/dist/anchors/markdown.d.ts +15 -0
  15. package/dist/anchors/markdown.d.ts.map +1 -0
  16. package/dist/anchors/markdown.js +71 -0
  17. package/dist/anchors/markdown.js.map +1 -0
  18. package/dist/anchors/openapi.d.ts +24 -0
  19. package/dist/anchors/openapi.d.ts.map +1 -0
  20. package/dist/anchors/openapi.js +75 -0
  21. package/dist/anchors/openapi.js.map +1 -0
  22. package/dist/browser.d.ts +10 -0
  23. package/dist/browser.d.ts.map +1 -0
  24. package/dist/browser.js +8 -0
  25. package/dist/browser.js.map +1 -0
  26. package/dist/config.d.ts +47 -0
  27. package/dist/config.d.ts.map +1 -0
  28. package/dist/config.js +393 -0
  29. package/dist/config.js.map +1 -0
  30. package/dist/config.test.d.ts +2 -0
  31. package/dist/config.test.d.ts.map +1 -0
  32. package/dist/config.test.js +454 -0
  33. package/dist/config.test.js.map +1 -0
  34. package/dist/content.d.ts +37 -0
  35. package/dist/content.d.ts.map +1 -0
  36. package/dist/content.js +57 -0
  37. package/dist/content.js.map +1 -0
  38. package/dist/content.test.d.ts +2 -0
  39. package/dist/content.test.d.ts.map +1 -0
  40. package/dist/content.test.js +100 -0
  41. package/dist/content.test.js.map +1 -0
  42. package/dist/contributions.d.ts +64 -0
  43. package/dist/contributions.d.ts.map +1 -0
  44. package/dist/contributions.js +184 -0
  45. package/dist/contributions.js.map +1 -0
  46. package/dist/contributions.test.d.ts +2 -0
  47. package/dist/contributions.test.d.ts.map +1 -0
  48. package/dist/contributions.test.js +202 -0
  49. package/dist/contributions.test.js.map +1 -0
  50. package/dist/fetch/auth.d.ts +15 -0
  51. package/dist/fetch/auth.d.ts.map +1 -0
  52. package/dist/fetch/auth.js +38 -0
  53. package/dist/fetch/auth.js.map +1 -0
  54. package/dist/fetch/cache.d.ts +25 -0
  55. package/dist/fetch/cache.d.ts.map +1 -0
  56. package/dist/fetch/cache.js +68 -0
  57. package/dist/fetch/cache.js.map +1 -0
  58. package/dist/fetch/cache.test.d.ts +2 -0
  59. package/dist/fetch/cache.test.d.ts.map +1 -0
  60. package/dist/fetch/cache.test.js +73 -0
  61. package/dist/fetch/cache.test.js.map +1 -0
  62. package/dist/fetch/clone.d.ts +26 -0
  63. package/dist/fetch/clone.d.ts.map +1 -0
  64. package/dist/fetch/clone.js +105 -0
  65. package/dist/fetch/clone.js.map +1 -0
  66. package/dist/fetch/fetch.test.d.ts +2 -0
  67. package/dist/fetch/fetch.test.d.ts.map +1 -0
  68. package/dist/fetch/fetch.test.js +167 -0
  69. package/dist/fetch/fetch.test.js.map +1 -0
  70. package/dist/fetch/resolve.d.ts +34 -0
  71. package/dist/fetch/resolve.d.ts.map +1 -0
  72. package/dist/fetch/resolve.js +59 -0
  73. package/dist/fetch/resolve.js.map +1 -0
  74. package/dist/freshness.d.ts +29 -0
  75. package/dist/freshness.d.ts.map +1 -0
  76. package/dist/freshness.js +170 -0
  77. package/dist/freshness.js.map +1 -0
  78. package/dist/freshness.test.d.ts +2 -0
  79. package/dist/freshness.test.d.ts.map +1 -0
  80. package/dist/freshness.test.js +209 -0
  81. package/dist/freshness.test.js.map +1 -0
  82. package/dist/frontmatter.d.ts +15 -0
  83. package/dist/frontmatter.d.ts.map +1 -0
  84. package/dist/frontmatter.js +24 -0
  85. package/dist/frontmatter.js.map +1 -0
  86. package/dist/frontmatter.test.d.ts +2 -0
  87. package/dist/frontmatter.test.d.ts.map +1 -0
  88. package/dist/frontmatter.test.js +54 -0
  89. package/dist/frontmatter.test.js.map +1 -0
  90. package/dist/git.d.ts +55 -0
  91. package/dist/git.d.ts.map +1 -0
  92. package/dist/git.js +127 -0
  93. package/dist/git.js.map +1 -0
  94. package/dist/git.test.d.ts +2 -0
  95. package/dist/git.test.d.ts.map +1 -0
  96. package/dist/git.test.js +198 -0
  97. package/dist/git.test.js.map +1 -0
  98. package/dist/includes.d.ts +53 -0
  99. package/dist/includes.d.ts.map +1 -0
  100. package/dist/includes.js +73 -0
  101. package/dist/includes.js.map +1 -0
  102. package/dist/includes.test.d.ts +2 -0
  103. package/dist/includes.test.d.ts.map +1 -0
  104. package/dist/includes.test.js +106 -0
  105. package/dist/includes.test.js.map +1 -0
  106. package/dist/index.d.ts +33 -0
  107. package/dist/index.d.ts.map +1 -0
  108. package/dist/index.js +23 -0
  109. package/dist/index.js.map +1 -0
  110. package/dist/links/__tests__/markdown.test.d.ts +2 -0
  111. package/dist/links/__tests__/markdown.test.d.ts.map +1 -0
  112. package/dist/links/__tests__/markdown.test.js +173 -0
  113. package/dist/links/__tests__/markdown.test.js.map +1 -0
  114. package/dist/links/__tests__/sidecar.test.d.ts +2 -0
  115. package/dist/links/__tests__/sidecar.test.d.ts.map +1 -0
  116. package/dist/links/__tests__/sidecar.test.js +238 -0
  117. package/dist/links/__tests__/sidecar.test.js.map +1 -0
  118. package/dist/links/index.d.ts +3 -0
  119. package/dist/links/index.d.ts.map +1 -0
  120. package/dist/links/index.js +3 -0
  121. package/dist/links/index.js.map +1 -0
  122. package/dist/links/markdown.d.ts +13 -0
  123. package/dist/links/markdown.d.ts.map +1 -0
  124. package/dist/links/markdown.js +93 -0
  125. package/dist/links/markdown.js.map +1 -0
  126. package/dist/links/sidecar.d.ts +12 -0
  127. package/dist/links/sidecar.d.ts.map +1 -0
  128. package/dist/links/sidecar.js +88 -0
  129. package/dist/links/sidecar.js.map +1 -0
  130. package/dist/manifest.d.ts +45 -0
  131. package/dist/manifest.d.ts.map +1 -0
  132. package/dist/manifest.js +269 -0
  133. package/dist/manifest.js.map +1 -0
  134. package/dist/manifest.test.d.ts +2 -0
  135. package/dist/manifest.test.d.ts.map +1 -0
  136. package/dist/manifest.test.js +625 -0
  137. package/dist/manifest.test.js.map +1 -0
  138. package/dist/multi-repo.test.d.ts +2 -0
  139. package/dist/multi-repo.test.d.ts.map +1 -0
  140. package/dist/multi-repo.test.js +179 -0
  141. package/dist/multi-repo.test.js.map +1 -0
  142. package/dist/node-path.d.ts +13 -0
  143. package/dist/node-path.d.ts.map +1 -0
  144. package/dist/node-path.js +21 -0
  145. package/dist/node-path.js.map +1 -0
  146. package/dist/node-path.test.d.ts +2 -0
  147. package/dist/node-path.test.d.ts.map +1 -0
  148. package/dist/node-path.test.js +29 -0
  149. package/dist/node-path.test.js.map +1 -0
  150. package/dist/published-links.d.ts +16 -0
  151. package/dist/published-links.d.ts.map +1 -0
  152. package/dist/published-links.js +59 -0
  153. package/dist/published-links.js.map +1 -0
  154. package/dist/published-links.test.d.ts +2 -0
  155. package/dist/published-links.test.d.ts.map +1 -0
  156. package/dist/published-links.test.js +82 -0
  157. package/dist/published-links.test.js.map +1 -0
  158. package/dist/repos.d.ts +32 -0
  159. package/dist/repos.d.ts.map +1 -0
  160. package/dist/repos.js +46 -0
  161. package/dist/repos.js.map +1 -0
  162. package/dist/repos.test.d.ts +2 -0
  163. package/dist/repos.test.d.ts.map +1 -0
  164. package/dist/repos.test.js +61 -0
  165. package/dist/repos.test.js.map +1 -0
  166. package/dist/scalar-source.d.ts +15 -0
  167. package/dist/scalar-source.d.ts.map +1 -0
  168. package/dist/scalar-source.js +21 -0
  169. package/dist/scalar-source.js.map +1 -0
  170. package/dist/search.d.ts +14 -0
  171. package/dist/search.d.ts.map +1 -0
  172. package/dist/search.js +59 -0
  173. package/dist/search.js.map +1 -0
  174. package/dist/service-concurrency.test.d.ts +2 -0
  175. package/dist/service-concurrency.test.d.ts.map +1 -0
  176. package/dist/service-concurrency.test.js +89 -0
  177. package/dist/service-concurrency.test.js.map +1 -0
  178. package/dist/service-history.test.d.ts +2 -0
  179. package/dist/service-history.test.d.ts.map +1 -0
  180. package/dist/service-history.test.js +76 -0
  181. package/dist/service-history.test.js.map +1 -0
  182. package/dist/service.d.ts +118 -0
  183. package/dist/service.d.ts.map +1 -0
  184. package/dist/service.js +347 -0
  185. package/dist/service.js.map +1 -0
  186. package/dist/service.test.d.ts +2 -0
  187. package/dist/service.test.d.ts.map +1 -0
  188. package/dist/service.test.js +313 -0
  189. package/dist/service.test.js.map +1 -0
  190. package/dist/types.d.ts +403 -0
  191. package/dist/types.d.ts.map +1 -0
  192. package/dist/types.js +2 -0
  193. package/dist/types.js.map +1 -0
  194. package/dist/validate/__tests__/artifacts.test.d.ts +2 -0
  195. package/dist/validate/__tests__/artifacts.test.d.ts.map +1 -0
  196. package/dist/validate/__tests__/artifacts.test.js +167 -0
  197. package/dist/validate/__tests__/artifacts.test.js.map +1 -0
  198. package/dist/validate/__tests__/assertions.test.d.ts +2 -0
  199. package/dist/validate/__tests__/assertions.test.d.ts.map +1 -0
  200. package/dist/validate/__tests__/assertions.test.js +254 -0
  201. package/dist/validate/__tests__/assertions.test.js.map +1 -0
  202. package/dist/validate/__tests__/duplicates.test.d.ts +2 -0
  203. package/dist/validate/__tests__/duplicates.test.d.ts.map +1 -0
  204. package/dist/validate/__tests__/duplicates.test.js +130 -0
  205. package/dist/validate/__tests__/duplicates.test.js.map +1 -0
  206. package/dist/validate/__tests__/edge-resolution.test.d.ts +2 -0
  207. package/dist/validate/__tests__/edge-resolution.test.d.ts.map +1 -0
  208. package/dist/validate/__tests__/edge-resolution.test.js +279 -0
  209. package/dist/validate/__tests__/edge-resolution.test.js.map +1 -0
  210. package/dist/validate/__tests__/history.test.d.ts +2 -0
  211. package/dist/validate/__tests__/history.test.d.ts.map +1 -0
  212. package/dist/validate/__tests__/history.test.js +93 -0
  213. package/dist/validate/__tests__/history.test.js.map +1 -0
  214. package/dist/validate/__tests__/includes.test.d.ts +2 -0
  215. package/dist/validate/__tests__/includes.test.d.ts.map +1 -0
  216. package/dist/validate/__tests__/includes.test.js +93 -0
  217. package/dist/validate/__tests__/includes.test.js.map +1 -0
  218. package/dist/validate/__tests__/registry.test.d.ts +2 -0
  219. package/dist/validate/__tests__/registry.test.d.ts.map +1 -0
  220. package/dist/validate/__tests__/registry.test.js +78 -0
  221. package/dist/validate/__tests__/registry.test.js.map +1 -0
  222. package/dist/validate/__tests__/run.test.d.ts +2 -0
  223. package/dist/validate/__tests__/run.test.d.ts.map +1 -0
  224. package/dist/validate/__tests__/run.test.js +215 -0
  225. package/dist/validate/__tests__/run.test.js.map +1 -0
  226. package/dist/validate/history.d.ts +23 -0
  227. package/dist/validate/history.d.ts.map +1 -0
  228. package/dist/validate/history.js +45 -0
  229. package/dist/validate/history.js.map +1 -0
  230. package/dist/validate/index.d.ts +10 -0
  231. package/dist/validate/index.d.ts.map +1 -0
  232. package/dist/validate/index.js +9 -0
  233. package/dist/validate/index.js.map +1 -0
  234. package/dist/validate/registry.d.ts +27 -0
  235. package/dist/validate/registry.d.ts.map +1 -0
  236. package/dist/validate/registry.js +67 -0
  237. package/dist/validate/registry.js.map +1 -0
  238. package/dist/validate/rules/artifacts.d.ts +25 -0
  239. package/dist/validate/rules/artifacts.d.ts.map +1 -0
  240. package/dist/validate/rules/artifacts.js +87 -0
  241. package/dist/validate/rules/artifacts.js.map +1 -0
  242. package/dist/validate/rules/assertions.d.ts +19 -0
  243. package/dist/validate/rules/assertions.d.ts.map +1 -0
  244. package/dist/validate/rules/assertions.js +149 -0
  245. package/dist/validate/rules/assertions.js.map +1 -0
  246. package/dist/validate/rules/duplicates.d.ts +20 -0
  247. package/dist/validate/rules/duplicates.d.ts.map +1 -0
  248. package/dist/validate/rules/duplicates.js +0 -0
  249. package/dist/validate/rules/duplicates.js.map +1 -0
  250. package/dist/validate/rules/edge-resolution.d.ts +15 -0
  251. package/dist/validate/rules/edge-resolution.d.ts.map +1 -0
  252. package/dist/validate/rules/edge-resolution.js +185 -0
  253. package/dist/validate/rules/edge-resolution.js.map +1 -0
  254. package/dist/validate/rules/includes.d.ts +21 -0
  255. package/dist/validate/rules/includes.d.ts.map +1 -0
  256. package/dist/validate/rules/includes.js +112 -0
  257. package/dist/validate/rules/includes.js.map +1 -0
  258. package/dist/validate/run.d.ts +20 -0
  259. package/dist/validate/run.d.ts.map +1 -0
  260. package/dist/validate/run.js +90 -0
  261. package/dist/validate/run.js.map +1 -0
  262. package/dist/validate/types.d.ts +101 -0
  263. package/dist/validate/types.d.ts.map +1 -0
  264. package/dist/validate/types.js +2 -0
  265. package/dist/validate/types.js.map +1 -0
  266. package/package.json +54 -0
@@ -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":"AAAA,OAAO,EAAE,SAAS,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AACjE,OAAO,EAAE,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,OAAO,EAAE,GAAG,EAAE,MAAM,WAAW,CAAC;AACxE,OAAO,QAAQ,MAAM,UAAU,CAAC;AAChC,OAAO,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAChD,OAAO,EAAiB,YAAY,EAAE,gBAAgB,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC3F,OAAO,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AACvD,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAC/C,OAAO,EAAE,cAAc,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AACnE,OAAO,EAAuC,WAAW,EAAE,MAAM,UAAU,CAAC;AAC5E,OAAO,EAAkB,cAAc,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAC3F,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAU1C,OAAO,EAGN,eAAe,EACf,gBAAgB,EAChB,oBAAoB,EACpB,gBAAgB,GAChB,MAAM,qBAAqB,CAAC;AAE7B;;;;;;;;GAQG;AACH,MAAM,kBAAkB,GAAG,IAAI,CAAC;AAEhC,MAAM,OAAO,WAAW;IACf,MAAM,CAAa;IACnB,KAAK,CAAa;IAClB,MAAM,GAAG,IAAI,GAAG,EAAqB,CAAC;IAC9C;;;;;;OAMG;IACK,SAAS,GAAG,IAAI,GAAG,EAAyD,CAAC;IAC7E,QAAQ,GAAoB,IAAI,CAAC;IACjC,WAAW,CAAc;IACzB,cAAc,GAAoD,IAAI,CAAC;IAC/E;;;;;;OAMG;IACK,mBAAmB,GAAG,CAAC,CAAC;IAChC,0EAA0E;IAClE,iBAAiB,GAA+D,IAAI,CAAC;IAE7F,YAAY,MAAkB;QAC7B,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QACrB,IAAI,CAAC,KAAK,GAAG,gBAAgB,CAAC,MAAM,CAAC,CAAC;QACtC,IAAI,CAAC,WAAW,GAAG,IAAI,WAAW,EAAE,CAAC;IACtC,CAAC;IAED,IAAI,UAAU;QACb,OAAO,IAAI,CAAC,MAAM,CAAC;IACpB,CAAC;IAED,8EAA8E;IAC9E,IAAI,SAAS;QACZ,OAAO,IAAI,CAAC,KAAK,CAAC;IACnB,CAAC;IAED,yDAAyD;IACzD,IAAI,UAAU;QACb,OAAO,YAAY,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACjC,CAAC;IAED,wFAAwF;IACxF,IAAI,OAAO;QACV,OAAO,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC;IAC7B,CAAC;IAED,qFAAqF;IACrF,IAAI,YAAY;QACf,OAAO,IAAI,CAAC,UAAU,IAAI,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,QAAQ;YAC/C,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,OAAO,EAAE,eAAe,CAAC;YACxD,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,EAAE,OAAO,EAAE,eAAe,CAAC,CAAC;IACpD,CAAC;IAED;;;;;;OAMG;IACH,mBAAmB,CAAC,IAAY;QAC/B,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,CAAC;QACrD,IAAI,CAAC,IAAI;YAAE,MAAM,IAAI,KAAK,CAAC,oBAAoB,IAAI,EAAE,CAAC,CAAC;QACvD,IAAI,IAAI,CAAC,QAAQ,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE,CAAC;YAC3C,OAAO,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,OAAO,EAAE,UAAU,EAAE,IAAI,EAAE,eAAe,CAAC,CAAC;QACjF,CAAC;QACD,OAAO,OAAO,CAAC,IAAI,CAAC,MAAM,EAAE,OAAO,EAAE,eAAe,CAAC,CAAC;IACvD,CAAC;IAED,wDAAwD;IACxD,IAAI,iBAAiB;QACpB,OAAO,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,OAAO,EAAE,eAAe,CAAC,CAAC;IAC/D,CAAC;IAED,uFAAuF;IACvF,eAAe,CAAC,MAAc;QAC7B,MAAM,KAAK,GAAG,aAAa,CAAC,IAAI,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;QAChD,IAAI,CAAC,KAAK;YAAE,OAAO,SAAS,CAAC;QAE7B,MAAM,QAAQ,GAAG,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC;QAC3D,MAAM,GAAG,GAAG,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;QAClD,IAAI,GAAG,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,UAAU,CAAC,GAAG,CAAC;YAAE,OAAO,SAAS,CAAC;QAC9D,OAAO,QAAQ,CAAC;IACjB,CAAC;IAED,8EAA8E;IACtE,KAAK,CAAC,WAAW,CAAC,IAAc,EAAE,KAAmB;QAC5D,MAAM,OAAO,GAAG,MAAM,WAAW,CAAC,IAAI,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;QACtD,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC,CAAC;QAClD,OAAO,OAAO,CAAC;IAChB,CAAC;IAED;;;;;;;;;;;;;;OAcG;IACH,KAAK,CAAC,OAAO,CAAC,IAAa,EAAE,eAA6B,OAAO;QAChE,MAAM,OAAO,GACZ,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,KAAK,IAAI,CAAC,CAAC;QAEnF,kEAAkE;QAClE,oEAAoE;QACpE,qEAAqE;QACrE,sEAAsE;QACtE,qEAAqE;QACrE,wEAAwE;QACxE,oEAAoE;QACpE,MAAM,KAAK,GAAkB;YAC5B,OAAO,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;YACjC,UAAU,EAAE,MAAM,iBAAiB,CAAC,IAAI,CAAC,MAAM,CAAC;SAChD,CAAC;QAEF,KAAK,MAAM,IAAI,IAAI,OAAO,EAAE,CAAC;YAC5B,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,WAAW,CAAC,IAAI,EAAE,YAAY,CAAC,CAAC;YAC3D,IAAI,CAAC,MAAM,CAAC,GAAG,CACd,IAAI,CAAC,IAAI,EACT,MAAM,cAAc,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,EAAE,IAAI,CAAC,KAAK,EAAE,OAAO,CAAC,KAAK,CAAC,CAClE,CAAC;QACH,CAAC;QAED,0EAA0E;QAC1E,sDAAsD;QACtD,IAAI,CAAC,QAAQ,GAAG,WAAW,CAC1B,IAAI,CAAC,MAAM,EACX,IAAI,CAAC,KAAK,EACV,IAAI,CAAC,MAAM,EACX,MAAM,iBAAiB,CAAC,IAAI,CAAC,MAAM,CAAC,EACpC,KAAK,CACL,CAAC;QACF,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC;QAC3B,IAAI,CAAC,mBAAmB,EAAE,CAAC;QAC3B,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC,MAAM,EAAE,EAAE,CAAC,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,CAAC,CAAC;QAChF,OAAO,IAAI,CAAC,QAAQ,CAAC;IACtB,CAAC;IAED,0DAA0D;IAC1D,KAAK,CAAC,WAAW;QAChB,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC;YACpB,IAAI,CAAC,QAAQ,GAAG,MAAM,IAAI,CAAC,OAAO,EAAE,CAAC;QACtC,CAAC;QACD,OAAO,IAAI,CAAC,QAAQ,CAAC;IACtB,CAAC;IAED;;;;;;OAMG;IACH,KAAK,CAAC,SAAS;QACd,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QACvB,IAAI,IAAI,CAAC,cAAc,IAAI,GAAG,GAAG,IAAI,CAAC,cAAc,CAAC,SAAS,GAAG,kBAAkB,EAAE,CAAC;YACrF,OAAO,IAAI,CAAC,cAAc,CAAC,MAAM,CAAC;QACnC,CAAC;QAED,sEAAsE;QACtE,uEAAuE;QACvE,oCAAoC;QACpC,MAAM,UAAU,GAAG,IAAI,CAAC,mBAAmB,CAAC;QAC5C,IAAI,IAAI,CAAC,iBAAiB,EAAE,UAAU,KAAK,UAAU,EAAE,CAAC;YACvD,OAAO,IAAI,CAAC,iBAAiB,CAAC,OAAO,CAAC;QACvC,CAAC;QAED,MAAM,OAAO,GAAG,CAAC,KAAK,IAAI,EAAE;YAC3B,IAAI,CAAC;gBACJ,MAAM,MAAM,GAAG,MAAM,cAAc,CAAC,MAAM,IAAI,CAAC,WAAW,EAAE,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;gBAC3E,iEAAiE;gBACjE,8DAA8D;gBAC9D,iEAAiE;gBACjE,IAAI,UAAU,KAAK,IAAI,CAAC,mBAAmB,EAAE,CAAC;oBAC7C,IAAI,CAAC,cAAc,GAAG,EAAE,SAAS,EAAE,GAAG,EAAE,MAAM,EAAE,CAAC;gBAClD,CAAC;gBACD,OAAO,MAAM,CAAC;YACf,CAAC;oBAAS,CAAC;gBACV,iEAAiE;gBACjE,gEAAgE;gBAChE,mDAAmD;gBACnD,IAAI,IAAI,CAAC,iBAAiB,EAAE,UAAU,KAAK,UAAU,EAAE,CAAC;oBACvD,IAAI,CAAC,iBAAiB,GAAG,IAAI,CAAC;gBAC/B,CAAC;YACF,CAAC;QACF,CAAC,CAAC,EAAE,CAAC;QACL,IAAI,CAAC,iBAAiB,GAAG,EAAE,UAAU,EAAE,OAAO,EAAE,CAAC;QACjD,OAAO,OAAO,CAAC;IAChB,CAAC;IAED;;;;OAIG;IACH,KAAK,CAAC,aAAa;QAClB,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,WAAW,EAAE,CAAC;QAC1C,MAAM,OAAO,GAAa,EAAE,CAAC;QAE7B,MAAM,KAAK,GAAG,CAAC,IAAY,EAAE,IAAa,EAAE,EAAE;YAC7C,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;YAC9C,aAAa,CAAC,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;YACnD,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACpB,CAAC,CAAC;QAEF,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC;YACrB,KAAK,MAAM,eAAe,IAAI,aAAa,CAAC,QAAQ,EAAE,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;gBACnE,KAAK,CAAC,IAAI,CAAC,mBAAmB,CAAC,eAAe,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,eAAe,CAAC,CAAC;YAChF,CAAC;YAED,MAAM,KAAK,GAAkB;gBAC5B,OAAO,EAAE,CAAC;gBACV,QAAQ,EAAE,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;oBACnC,IAAI,EAAE,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,IAAI;oBAC5B,IAAI,EAAE,IAAI,CAAC,IAAI;oBACf,OAAO,EAAE,IAAI,CAAC,GAAG;oBACjB,GAAG,CAAC,IAAI,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;oBACvD,QAAQ,EAAE,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,IAAI,CAAC,mBAAmB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;yBAC1E,KAAK,CAAC,GAAG,CAAC;yBACV,IAAI,CAAC,GAAG,CAAC;iBACX,CAAC,CAAC;gBACH,QAAQ,EAAE,qBAAqB;aAC/B,CAAC;YACF,KAAK,CAAC,IAAI,CAAC,iBAAiB,EAAE,KAAK,CAAC,CAAC;QACtC,CAAC;QAED,KAAK,CAAC,IAAI,CAAC,YAAY,EAAE,QAAQ,CAAC,CAAC;QACnC,OAAO,OAAO,CAAC;IAChB,CAAC;IAED;;;;;;;OAOG;IACH,IAAI,CAAC,MAAc;QAClB,MAAM,IAAI,GAAG,IAAI,CAAC,QAAQ,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,SAAS,CAAC,EAAE,KAAK,MAAM,CAAC,CAAC;QAC/E,2EAA2E;QAC3E,mEAAmE;QACnE,IAAI,IAAI,EAAE,IAAI,KAAK,UAAU,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC;YACtD,MAAM,IAAI,KAAK,CAAC,4BAA4B,MAAM,EAAE,CAAC,CAAC;QACvD,CAAC;QAED,MAAM,QAAQ,GAAG,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,CAAC;QAC9C,IAAI,CAAC,QAAQ;YAAE,MAAM,IAAI,KAAK,CAAC,uBAAuB,MAAM,EAAE,CAAC,CAAC;QAChE,OAAO,YAAY,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;IACxC,CAAC;IAED;;;;;;;;;OASG;IACH,KAAK,CAAC,QAAQ,CAAC,WAA8B,eAAe,EAAE;QAC7D,MAAM,YAAY,GAAG,oBAAoB,CAAC,QAAQ,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;QACjE,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC;YACpB,MAAM,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,YAAY,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC;QAChE,CAAC;QACD,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,WAAW,EAAE,CAAC;QAC1C,IAAI,CAAC,YAAY,EAAE,CAAC;YACnB,OAAO,gBAAgB,CAAC,QAAQ,EAAE,IAAI,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;QAC1D,CAAC;QAED,MAAM,KAAK,GAA8B,EAAE,CAAC;QAC5C,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;YAC/B,MAAM,MAAM,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAC7C,KAAK,CAAC,IAAI,CAAC;gBACV,IAAI;gBACJ,MAAM,EAAE,KAAK,KAAK,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,IAAI,CAAC,WAAW,CAAC,IAAI,EAAE,MAAM,CAAC;aAChF,CAAC,CAAC;QACJ,CAAC;QACD,OAAO,gBAAgB,CAAC,QAAQ,EAAE,IAAI,CAAC,MAAM,EAAE,QAAQ,EAAE,gBAAgB,CAAC,KAAK,CAAC,CAAC,CAAC;IACnF,CAAC;IAED,wBAAwB;IACxB,KAAK,CAAC,MAAM,CAAC,KAAa;QACzB,MAAM,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC,wBAAwB;QAClD,OAAO,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IACvC,CAAC;IAED,0DAA0D;IAC1D,KAAK,CAAC,QAAQ,CACb,MAAc,EACd,YAA8C,MAAM;QAEpD,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,WAAW,EAAE,CAAC;QAC1C,OAAO,QAAQ,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE;YACrC,IAAI,SAAS,KAAK,UAAU,IAAI,SAAS,KAAK,MAAM,EAAE,CAAC;gBACtD,IAAI,IAAI,CAAC,IAAI,CAAC,IAAI,KAAK,MAAM;oBAAE,OAAO,IAAI,CAAC;YAC5C,CAAC;YACD,IAAI,SAAS,KAAK,UAAU,IAAI,SAAS,KAAK,MAAM,EAAE,CAAC;gBACtD,IAAI,IAAI,CAAC,EAAE,CAAC,IAAI,KAAK,MAAM;oBAAE,OAAO,IAAI,CAAC;YAC1C,CAAC;YACD,OAAO,KAAK,CAAC;QACd,CAAC,CAAC,CAAC;IACJ,CAAC;IAED;;;;;OAKG;IACH,KAAK,CAAC,QAAuC;QAC5C,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK;aACzB,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,WAAW,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;aAC3C,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE;YACb,MAAM,OAAO,GAAG,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE;gBAC3C,OAAO,EAAE;oBACR,cAAc,EAAE,WAAW;oBAC3B,aAAa,EAAE,kBAAkB;oBACjC,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM;iBACrB;gBACD,UAAU,EAAE,IAAI;gBAChB,aAAa,EAAE,IAAI;aACnB,CAAC,CAAC;YAEH,IAAI,aAAa,GAAyC,IAAI,CAAC;YAE/D,MAAM,iBAAiB,GAAG,GAAG,EAAE;gBAC9B,IAAI,aAAa;oBAAE,YAAY,CAAC,aAAa,CAAC,CAAC;gBAC/C,aAAa,GAAG,UAAU,CAAC,KAAK,IAAI,EAAE;oBACrC,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;oBAC/C,QAAQ,EAAE,CAAC,QAAQ,CAAC,CAAC;gBACtB,CAAC,EAAE,GAAG,CAAC,CAAC;YACT,CAAC,CAAC;YAEF,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,iBAAiB,CAAC,CAAC;YACrC,OAAO,CAAC,EAAE,CAAC,QAAQ,EAAE,iBAAiB,CAAC,CAAC;YACxC,OAAO,CAAC,EAAE,CAAC,QAAQ,EAAE,iBAAiB,CAAC,CAAC;YAExC,OAAO,GAAG,EAAE;gBACX,OAAO,CAAC,KAAK,EAAE,CAAC;gBAChB,IAAI,aAAa;oBAAE,YAAY,CAAC,aAAa,CAAC,CAAC;YAChD,CAAC,CAAC;QACH,CAAC,CAAC,CAAC;QAEJ,OAAO,GAAG,EAAE;YACX,KAAK,MAAM,IAAI,IAAI,QAAQ;gBAAE,IAAI,EAAE,CAAC;QACrC,CAAC,CAAC;IACH,CAAC;CACD"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=service.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"service.test.d.ts","sourceRoot":"","sources":["../src/service.test.ts"],"names":[],"mappings":""}