@ontrails/trails 1.0.0-beta.13 → 1.0.0-beta.15

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 (165) hide show
  1. package/.turbo/turbo-lint.log +1 -1
  2. package/CHANGELOG.md +29 -0
  3. package/__tests__/examples.test.ts +39 -0
  4. package/dist/src/app.d.ts.map +1 -1
  5. package/dist/src/app.js +12 -1
  6. package/dist/src/app.js.map +1 -1
  7. package/dist/src/cli.js +4 -3
  8. package/dist/src/cli.js.map +1 -1
  9. package/dist/src/trails/add-surface.d.ts +3 -3
  10. package/dist/src/trails/add-surface.d.ts.map +1 -1
  11. package/dist/src/trails/add-surface.js +46 -24
  12. package/dist/src/trails/add-surface.js.map +1 -1
  13. package/dist/src/trails/add-trail.d.ts +3 -1
  14. package/dist/src/trails/add-trail.d.ts.map +1 -1
  15. package/dist/src/trails/add-trail.js +49 -22
  16. package/dist/src/trails/add-trail.js.map +1 -1
  17. package/dist/src/trails/add-trailhead.d.ts +13 -0
  18. package/dist/src/trails/add-trailhead.d.ts.map +1 -0
  19. package/dist/src/trails/add-trailhead.js +88 -0
  20. package/dist/src/trails/add-trailhead.js.map +1 -0
  21. package/dist/src/trails/add-verify.d.ts +1 -1
  22. package/dist/src/trails/add-verify.d.ts.map +1 -1
  23. package/dist/src/trails/add-verify.js +17 -16
  24. package/dist/src/trails/add-verify.js.map +1 -1
  25. package/dist/src/trails/create-scaffold.d.ts +1 -1
  26. package/dist/src/trails/create-scaffold.d.ts.map +1 -1
  27. package/dist/src/trails/create-scaffold.js +34 -27
  28. package/dist/src/trails/create-scaffold.js.map +1 -1
  29. package/dist/src/trails/create.d.ts +9 -13
  30. package/dist/src/trails/create.d.ts.map +1 -1
  31. package/dist/src/trails/create.js +40 -35
  32. package/dist/src/trails/create.js.map +1 -1
  33. package/dist/src/trails/dev-clean.d.ts +9 -0
  34. package/dist/src/trails/dev-clean.d.ts.map +1 -0
  35. package/dist/src/trails/dev-clean.js +66 -0
  36. package/dist/src/trails/dev-clean.js.map +1 -0
  37. package/dist/src/trails/dev-reset.d.ts +6 -0
  38. package/dist/src/trails/dev-reset.d.ts.map +1 -0
  39. package/dist/src/trails/dev-reset.js +39 -0
  40. package/dist/src/trails/dev-reset.js.map +1 -0
  41. package/dist/src/trails/dev-stats.d.ts +7 -0
  42. package/dist/src/trails/dev-stats.d.ts.map +1 -0
  43. package/dist/src/trails/dev-stats.js +61 -0
  44. package/dist/src/trails/dev-stats.js.map +1 -0
  45. package/dist/src/trails/dev-support.d.ts +64 -0
  46. package/dist/src/trails/dev-support.d.ts.map +1 -0
  47. package/dist/src/trails/dev-support.js +181 -0
  48. package/dist/src/trails/dev-support.js.map +1 -0
  49. package/dist/src/trails/draft-promote.d.ts +18 -0
  50. package/dist/src/trails/draft-promote.d.ts.map +1 -0
  51. package/dist/src/trails/draft-promote.js +400 -0
  52. package/dist/src/trails/draft-promote.js.map +1 -0
  53. package/dist/src/trails/guide.d.ts +14 -4
  54. package/dist/src/trails/guide.d.ts.map +1 -1
  55. package/dist/src/trails/guide.js +22 -41
  56. package/dist/src/trails/guide.js.map +1 -1
  57. package/dist/src/trails/load-app.d.ts +9 -1
  58. package/dist/src/trails/load-app.d.ts.map +1 -1
  59. package/dist/src/trails/load-app.js +404 -13
  60. package/dist/src/trails/load-app.js.map +1 -1
  61. package/dist/src/trails/project.d.ts.map +1 -1
  62. package/dist/src/trails/project.js +14 -3
  63. package/dist/src/trails/project.js.map +1 -1
  64. package/dist/src/trails/survey.d.ts +6 -60
  65. package/dist/src/trails/survey.d.ts.map +1 -1
  66. package/dist/src/trails/survey.js +83 -182
  67. package/dist/src/trails/survey.js.map +1 -1
  68. package/dist/src/trails/topo-constants.d.ts +3 -0
  69. package/dist/src/trails/topo-constants.d.ts.map +1 -0
  70. package/dist/src/trails/topo-constants.js +3 -0
  71. package/dist/src/trails/topo-constants.js.map +1 -0
  72. package/dist/src/trails/topo-export.d.ts +19 -0
  73. package/dist/src/trails/topo-export.d.ts.map +1 -0
  74. package/dist/src/trails/topo-export.js +31 -0
  75. package/dist/src/trails/topo-export.js.map +1 -0
  76. package/dist/src/trails/topo-history.d.ts +20 -0
  77. package/dist/src/trails/topo-history.d.ts.map +1 -0
  78. package/dist/src/trails/topo-history.js +32 -0
  79. package/dist/src/trails/topo-history.js.map +1 -0
  80. package/dist/src/trails/topo-pin.d.ts +17 -0
  81. package/dist/src/trails/topo-pin.d.ts.map +1 -0
  82. package/dist/src/trails/topo-pin.js +31 -0
  83. package/dist/src/trails/topo-pin.js.map +1 -0
  84. package/dist/src/trails/topo-read-support.d.ts +58 -0
  85. package/dist/src/trails/topo-read-support.d.ts.map +1 -0
  86. package/dist/src/trails/topo-read-support.js +167 -0
  87. package/dist/src/trails/topo-read-support.js.map +1 -0
  88. package/dist/src/trails/topo-reports.d.ts +54 -0
  89. package/dist/src/trails/topo-reports.d.ts.map +1 -0
  90. package/dist/src/trails/topo-reports.js +128 -0
  91. package/dist/src/trails/topo-reports.js.map +1 -0
  92. package/dist/src/trails/topo-show.d.ts +23 -0
  93. package/dist/src/trails/topo-show.d.ts.map +1 -0
  94. package/dist/src/trails/topo-show.js +49 -0
  95. package/dist/src/trails/topo-show.js.map +1 -0
  96. package/dist/src/trails/topo-store-support.d.ts +13 -0
  97. package/dist/src/trails/topo-store-support.d.ts.map +1 -0
  98. package/dist/src/trails/topo-store-support.js +55 -0
  99. package/dist/src/trails/topo-store-support.js.map +1 -0
  100. package/dist/src/trails/topo-support.d.ts +76 -0
  101. package/dist/src/trails/topo-support.d.ts.map +1 -0
  102. package/dist/src/trails/topo-support.js +132 -0
  103. package/dist/src/trails/topo-support.js.map +1 -0
  104. package/dist/src/trails/topo-unpin.d.ts +20 -0
  105. package/dist/src/trails/topo-unpin.d.ts.map +1 -0
  106. package/dist/src/trails/topo-unpin.js +44 -0
  107. package/dist/src/trails/topo-unpin.js.map +1 -0
  108. package/dist/src/trails/topo-verify.d.ts +5 -0
  109. package/dist/src/trails/topo-verify.d.ts.map +1 -0
  110. package/dist/src/trails/topo-verify.js +24 -0
  111. package/dist/src/trails/topo-verify.js.map +1 -0
  112. package/dist/src/trails/topo.d.ts +5 -0
  113. package/dist/src/trails/topo.d.ts.map +1 -0
  114. package/dist/src/trails/topo.js +63 -0
  115. package/dist/src/trails/topo.js.map +1 -0
  116. package/dist/src/trails/warden.d.ts +3 -2
  117. package/dist/src/trails/warden.d.ts.map +1 -1
  118. package/dist/src/trails/warden.js +37 -27
  119. package/dist/src/trails/warden.js.map +1 -1
  120. package/dist/src/versions.d.ts +12 -0
  121. package/dist/src/versions.d.ts.map +1 -0
  122. package/dist/src/versions.js +23 -0
  123. package/dist/src/versions.js.map +1 -0
  124. package/dist/tsconfig.tsbuildinfo +1 -1
  125. package/package.json +8 -7
  126. package/src/__tests__/add-trail.test.ts +97 -0
  127. package/src/__tests__/create.test.ts +91 -27
  128. package/src/__tests__/draft-promote.test.ts +144 -0
  129. package/src/__tests__/guide.test.ts +10 -5
  130. package/src/__tests__/load-app.test.ts +406 -2
  131. package/src/__tests__/survey.test.ts +221 -60
  132. package/src/__tests__/topo-dev.test.ts +426 -0
  133. package/src/app.ts +24 -2
  134. package/src/clack.ts +1 -1
  135. package/src/cli.ts +4 -3
  136. package/src/trails/add-surface.ts +150 -0
  137. package/src/trails/add-trail.ts +46 -10
  138. package/src/trails/add-verify.ts +11 -6
  139. package/src/trails/create-scaffold.ts +16 -3
  140. package/src/trails/create.ts +76 -71
  141. package/src/trails/dev-clean.ts +77 -0
  142. package/src/trails/dev-reset.ts +45 -0
  143. package/src/trails/dev-stats.ts +67 -0
  144. package/src/trails/dev-support.ts +328 -0
  145. package/src/trails/draft-promote.ts +739 -0
  146. package/src/trails/guide.ts +23 -41
  147. package/src/trails/load-app.ts +556 -14
  148. package/src/trails/project.ts +17 -3
  149. package/src/trails/survey.ts +110 -285
  150. package/src/trails/topo-constants.ts +2 -0
  151. package/src/trails/topo-export.ts +35 -0
  152. package/src/trails/topo-history.ts +38 -0
  153. package/src/trails/topo-pin.ts +38 -0
  154. package/src/trails/topo-read-support.ts +329 -0
  155. package/src/trails/topo-reports.ts +228 -0
  156. package/src/trails/topo-show.ts +54 -0
  157. package/src/trails/topo-store-support.ts +104 -0
  158. package/src/trails/topo-support.ts +230 -0
  159. package/src/trails/topo-unpin.ts +56 -0
  160. package/src/trails/topo-verify.ts +25 -0
  161. package/src/trails/topo.ts +69 -0
  162. package/src/trails/warden.ts +13 -3
  163. package/src/versions.ts +43 -0
  164. package/tsconfig.tests.json +10 -0
  165. package/src/trails/add-trailhead.ts +0 -121
@@ -1,24 +1,415 @@
1
- import { isAbsolute, resolve } from 'node:path';
2
- import { pathToFileURL } from 'node:url';
1
+ import { existsSync, mkdirSync, readdirSync, rmSync, statSync } from 'node:fs';
2
+ import { dirname, extname, isAbsolute, join, parse as parsePath, relative, resolve, } from 'node:path';
3
+ import { fileURLToPath, pathToFileURL } from 'node:url';
4
+ import { findAppModule } from '@ontrails/cli';
3
5
  const URL_SCHEME = /^[a-zA-Z][a-zA-Z\d+.-]*:/;
4
- /** Resolve a module path from cwd so CLI defaults behave like shell paths. */
5
- const resolveModuleSpecifier = (modulePath, cwd) => {
6
- if (URL_SCHEME.test(modulePath)) {
7
- return modulePath;
6
+ /** Extension Bun.Transpiler loader, so JSX-bearing files parse correctly. */
7
+ const LOADER_BY_EXTENSION = {
8
+ '.cjs': 'js',
9
+ '.cts': 'ts',
10
+ '.js': 'js',
11
+ '.jsx': 'jsx',
12
+ '.mjs': 'js',
13
+ '.mts': 'ts',
14
+ '.ts': 'ts',
15
+ '.tsx': 'tsx',
16
+ };
17
+ const SCANNABLE_EXTENSIONS = new Set(Object.keys(LOADER_BY_EXTENSION));
18
+ const TRANSPILER_CACHE = new Map();
19
+ const getImportScanner = (loader) => {
20
+ const cached = TRANSPILER_CACHE.get(loader);
21
+ if (cached !== undefined) {
22
+ return cached;
23
+ }
24
+ const scanner = new Bun.Transpiler({ loader });
25
+ TRANSPILER_CACHE.set(loader, scanner);
26
+ return scanner;
27
+ };
28
+ /**
29
+ * Mirror roots kept alive for the lifetime of the process.
30
+ *
31
+ * @remarks
32
+ * A fresh-loaded module may expose functions whose deferred relative imports
33
+ * are resolved only when those functions run (for example inside a trail's
34
+ * `blaze`). If we deleted the mirror tree immediately after the initial
35
+ * `import()` resolved, those later resolutions would hit an ENOENT. We keep
36
+ * the mirrors on disk and clean them up once, on process exit.
37
+ */
38
+ const ACTIVE_MIRROR_ROOTS = new Set();
39
+ const RETAINED_MIRROR_ROOTS = new Set();
40
+ const cleanupAllMirrorRoots = () => {
41
+ for (const root of [...ACTIVE_MIRROR_ROOTS, ...RETAINED_MIRROR_ROOTS]) {
42
+ rmSync(root, { force: true, recursive: true });
8
43
  }
44
+ ACTIVE_MIRROR_ROOTS.clear();
45
+ RETAINED_MIRROR_ROOTS.clear();
46
+ };
47
+ const mirrorCleanup = (() => {
48
+ let registered = false;
49
+ return {
50
+ ensureRegistered() {
51
+ if (registered) {
52
+ return;
53
+ }
54
+ registered = true;
55
+ process.once('exit', cleanupAllMirrorRoots);
56
+ },
57
+ };
58
+ })();
59
+ const ensureMirrorCleanupHook = () => {
60
+ mirrorCleanup.ensureRegistered();
61
+ };
62
+ /**
63
+ * Retain a fresh-import mirror for the lifetime of the process. A previously
64
+ * returned `loadApp` result may hold deferred relative `import()` calls whose
65
+ * resolution requires the mirror directory to still exist, so we cannot prune
66
+ * these by age without risking ENOENT in long-lived sessions (dev server,
67
+ * survey polling, concurrent fresh loads). Cleanup happens once on process
68
+ * exit via `cleanupAllMirrorRoots`.
69
+ */
70
+ const retainMirrorRoot = (mirrorRoot) => {
71
+ if (RETAINED_MIRROR_ROOTS.has(mirrorRoot)) {
72
+ return;
73
+ }
74
+ RETAINED_MIRROR_ROOTS.add(mirrorRoot);
75
+ ensureMirrorCleanupHook();
76
+ };
77
+ const acquireMirrorLease = (mirrorRoot) => {
78
+ ACTIVE_MIRROR_ROOTS.add(mirrorRoot);
79
+ ensureMirrorCleanupHook();
80
+ let released = false;
81
+ return () => {
82
+ if (released) {
83
+ return;
84
+ }
85
+ released = true;
86
+ ACTIVE_MIRROR_ROOTS.delete(mirrorRoot);
87
+ rmSync(mirrorRoot, { force: true, recursive: true });
88
+ };
89
+ };
90
+ const resolveUrlModulePath = (modulePath) => {
91
+ const url = new URL(modulePath);
92
+ return url.protocol === 'file:' ? fileURLToPath(url) : modulePath;
93
+ };
94
+ const resolveFilesystemModulePath = (modulePath, cwd) => {
9
95
  const absolutePath = isAbsolute(modulePath)
10
96
  ? modulePath
11
97
  : resolve(cwd, modulePath);
12
- return pathToFileURL(absolutePath).href;
98
+ if (!absolutePath.endsWith('.js') || existsSync(absolutePath)) {
99
+ return absolutePath;
100
+ }
101
+ const tsPath = absolutePath.replace(/\.js$/, '.ts');
102
+ return existsSync(tsPath) ? tsPath : absolutePath;
13
103
  };
14
- /** Load a Topo export from a module path relative to cwd. */
15
- export const loadApp = async (modulePath, cwd) => {
16
- const mod = (await import(resolveModuleSpecifier(modulePath, cwd)));
17
- const app = (mod['default'] ?? mod['app']);
104
+ /** Resolve a module path from cwd so CLI defaults behave like shell paths. */
105
+ const resolveAbsoluteModulePath = (modulePath, cwd) => URL_SCHEME.test(modulePath)
106
+ ? resolveUrlModulePath(modulePath)
107
+ : resolveFilesystemModulePath(modulePath, cwd);
108
+ const MIRROR_PARENT_DIRNAME = '.trails-tmp';
109
+ const MIRROR_ENTRY_PREFIX = 'load-app-fresh-';
110
+ /**
111
+ * Convert an absolute path to a drive-safe relative form before appending it
112
+ * to the mirror root. `path.parse(...).root` returns `'/'` on POSIX and
113
+ * `'C:\\'` (or similar) on Windows, so `relative` strips the platform root
114
+ * in both cases.
115
+ */
116
+ const freshMirrorPath = (absolutePath, mirrorRoot) => join(mirrorRoot, relative(parsePath(absolutePath).root, absolutePath));
117
+ const isLocalFilesystemImport = (importPath) => importPath.startsWith('.') ||
118
+ importPath.startsWith('/') ||
119
+ importPath.startsWith('file:');
120
+ const isScannableModule = (modulePath) => SCANNABLE_EXTENSIONS.has(extname(modulePath));
121
+ const resolveImportedModulePath = (importerPath, importPath) => {
122
+ const resolved = import.meta.resolve(importPath, pathToFileURL(importerPath).href);
123
+ return resolveFilesystemModulePath(fileURLToPath(resolved), dirname(importerPath));
124
+ };
125
+ const collectImportedModulePaths = (modulePath, source) => {
126
+ const extension = extname(modulePath);
127
+ const loader = LOADER_BY_EXTENSION[extension];
128
+ if (loader === undefined) {
129
+ return [];
130
+ }
131
+ return getImportScanner(loader)
132
+ .scanImports(source)
133
+ .map((entry) => entry.path)
134
+ .filter(isLocalFilesystemImport)
135
+ .map((importPath) => resolveImportedModulePath(modulePath, importPath));
136
+ };
137
+ /**
138
+ * Copy a single file into the mirror by raw bytes.
139
+ *
140
+ * @remarks
141
+ * Reading via `.bytes()` rather than `.text()` preserves binary payloads
142
+ * (`.wasm`, `.node`, compiled assets) that may sit alongside source files in
143
+ * the app's graph. Text decoding would corrupt them on the way through the
144
+ * mirror.
145
+ */
146
+ const copyFileToMirror = async (sourcePath, mirrorRoot, copied) => {
147
+ if (copied.has(sourcePath)) {
148
+ return;
149
+ }
150
+ copied.add(sourcePath);
151
+ const mirrorPath = freshMirrorPath(sourcePath, mirrorRoot);
152
+ mkdirSync(dirname(mirrorPath), { recursive: true });
153
+ const bytes = await Bun.file(sourcePath).bytes();
154
+ await Bun.write(mirrorPath, bytes);
155
+ };
156
+ /**
157
+ * Directory basenames that are never worth mirroring.
158
+ *
159
+ * @remarks
160
+ * These directories are excluded because they can be large and are never
161
+ * sources of resolvable imports — they hold VCS metadata, package installs,
162
+ * prior mirror artifacts, or build/tooling output that module resolution
163
+ * should not touch.
164
+ */
165
+ const MIRROR_SKIP_DIRECTORIES = new Set([
166
+ '.cache',
167
+ '.git',
168
+ '.next',
169
+ '.nuxt',
170
+ '.output',
171
+ '.svelte-kit',
172
+ '.trails-tmp',
173
+ '.turbo',
174
+ 'build',
175
+ 'coverage',
176
+ 'dist',
177
+ 'node_modules',
178
+ ]);
179
+ /**
180
+ * Recursively copy every regular file inside `directoryPath` into the
181
+ * mirror, skipping well-known heavy directories.
182
+ *
183
+ * @remarks
184
+ * `Bun.Transpiler#scanImports` only surfaces statically analyzable import
185
+ * specifiers. Computed dynamic imports such as `import(\`./${name}.ts\`)`
186
+ * never appear, so their targets would otherwise be missing from the
187
+ * mirror. Shadowing each directory touched by the static walk with its
188
+ * full subtree keeps those sibling modules resolvable under the mirror
189
+ * root at runtime without pulling in package installs or nested mirror
190
+ * artifacts.
191
+ */
192
+ const readDirectoryEntries = (directoryPath) => {
193
+ try {
194
+ return readdirSync(directoryPath);
195
+ }
196
+ catch {
197
+ return [];
198
+ }
199
+ };
200
+ const safeStat = (entryPath) => {
201
+ try {
202
+ return statSync(entryPath);
203
+ }
204
+ catch {
205
+ return undefined;
206
+ }
207
+ };
208
+ /**
209
+ * Age threshold (ms) above which a mirror entry in `.trails-tmp/` is
210
+ * considered stale and safe to remove opportunistically.
211
+ *
212
+ * @remarks
213
+ * Fresh loads complete in seconds. Anything older than 10 minutes is almost
214
+ * certainly left over from a crashed or signal-killed process. We intentionally
215
+ * avoid registering SIGTERM/SIGINT handlers here because that would risk
216
+ * clobbering host-app signal handlers (and still wouldn't rescue SIGKILL).
217
+ * Opportunistic cleanup is self-healing across crashes from any cause.
218
+ */
219
+ const STALE_MIRROR_THRESHOLD_MS = 10 * 60 * 1000;
220
+ const isStaleMirrorEntry = (entryPath, now) => {
221
+ if (ACTIVE_MIRROR_ROOTS.has(entryPath) ||
222
+ RETAINED_MIRROR_ROOTS.has(entryPath)) {
223
+ return false;
224
+ }
225
+ const entryStat = safeStat(entryPath);
226
+ if (entryStat === undefined) {
227
+ return false;
228
+ }
229
+ const mtimeMs = Number(entryStat.mtimeMs);
230
+ return now - mtimeMs >= STALE_MIRROR_THRESHOLD_MS;
231
+ };
232
+ const removeStaleMirrorEntry = (entryPath) => {
233
+ try {
234
+ rmSync(entryPath, { force: true, recursive: true });
235
+ }
236
+ catch {
237
+ /*
238
+ * Another concurrent load may own it. Safe to ignore — the next sweep
239
+ * will retry.
240
+ */
241
+ }
242
+ };
243
+ /**
244
+ * Best-effort removal of stale mirror directories left by previous (crashed or
245
+ * signal-killed) processes. Called before creating a new mirror root.
246
+ */
247
+ const cleanupStaleMirrorRoots = (mirrorParent) => {
248
+ const entries = readDirectoryEntries(mirrorParent);
249
+ if (entries.length === 0) {
250
+ return;
251
+ }
252
+ const now = Date.now();
253
+ for (const entry of entries) {
254
+ if (!entry.startsWith(MIRROR_ENTRY_PREFIX)) {
255
+ continue;
256
+ }
257
+ const entryPath = join(mirrorParent, entry);
258
+ if (isStaleMirrorEntry(entryPath, now)) {
259
+ removeStaleMirrorEntry(entryPath);
260
+ }
261
+ }
262
+ };
263
+ const freshMirrorRootPath = (cwd) => {
264
+ const mirrorParent = join(cwd, MIRROR_PARENT_DIRNAME);
265
+ cleanupStaleMirrorRoots(mirrorParent);
266
+ return join(mirrorParent, `${MIRROR_ENTRY_PREFIX}${Date.now()}-${Math.random().toString(36).slice(2)}`);
267
+ };
268
+ const classifyDirectoryEntry = (entry, entryPath) => {
269
+ const entryStat = safeStat(entryPath);
270
+ if (entryStat === undefined) {
271
+ return 'skip';
272
+ }
273
+ if (entryStat.isDirectory()) {
274
+ return MIRROR_SKIP_DIRECTORIES.has(entry) ? 'skip' : 'directory';
275
+ }
276
+ return entryStat.isFile() ? 'file' : 'skip';
277
+ };
278
+ const copyDirectoryTreeToMirror = async (directoryPath, context) => {
279
+ if (context.visitedDirectories.has(directoryPath)) {
280
+ return;
281
+ }
282
+ context.visitedDirectories.add(directoryPath);
283
+ for (const entry of readDirectoryEntries(directoryPath)) {
284
+ const entryPath = join(directoryPath, entry);
285
+ const kind = classifyDirectoryEntry(entry, entryPath);
286
+ if (kind === 'directory') {
287
+ await copyDirectoryTreeToMirror(entryPath, context);
288
+ }
289
+ else if (kind === 'file') {
290
+ await copyFileToMirror(entryPath, context.mirrorRoot, context.copied);
291
+ }
292
+ }
293
+ };
294
+ const mirrorImportedModule = async (modulePath, context) => {
295
+ const moduleDirectory = dirname(modulePath);
296
+ if (context.visitedDirectories.has(moduleDirectory)) {
297
+ await copyFileToMirror(modulePath, context.mirrorRoot, context.copied);
298
+ return;
299
+ }
300
+ await copyDirectoryTreeToMirror(moduleDirectory, context);
301
+ };
302
+ const scanAndVisitLocalImports = async (modulePath, visit) => {
303
+ if (!isScannableModule(modulePath)) {
304
+ return;
305
+ }
306
+ const source = await Bun.file(modulePath).text();
307
+ for (const importedPath of collectImportedModulePaths(modulePath, source)) {
308
+ await visit(importedPath);
309
+ }
310
+ };
311
+ const mirrorFreshImportGraph = async (entryPath, mirrorRoot) => {
312
+ const scanned = new Set();
313
+ const context = {
314
+ copied: new Set(),
315
+ mirrorRoot,
316
+ visitedDirectories: new Set(),
317
+ };
318
+ const visit = async (modulePath) => {
319
+ if (scanned.has(modulePath)) {
320
+ return;
321
+ }
322
+ scanned.add(modulePath);
323
+ await scanAndVisitLocalImports(modulePath, visit);
324
+ await mirrorImportedModule(modulePath, context);
325
+ };
326
+ await visit(entryPath);
327
+ return freshMirrorPath(entryPath, mirrorRoot);
328
+ };
329
+ /**
330
+ * Import a module bypassing the ESM cache for the local filesystem import graph.
331
+ *
332
+ * @remarks
333
+ * External packages and built-in modules still resolve normally. Only local
334
+ * filesystem imports are mirrored into the fresh temp root. The mirror tree
335
+ * is retained for the lifetime of the process so that deferred relative
336
+ * `import()`/`require()` calls originating from the loaded module (e.g.
337
+ * inside a trail's `blaze`) can still resolve. If the graph walk itself
338
+ * fails, the partially-written mirror is removed immediately so failed
339
+ * loads do not leak disk space.
340
+ */
341
+ const importWithCacheBust = async (absolutePath) => {
342
+ const url = new URL(absolutePath);
343
+ url.searchParams.set('t', Date.now().toString());
344
+ return (await import(url.href));
345
+ };
346
+ const prepareMirror = async (absolutePath, cwd) => {
347
+ const mirrorRoot = freshMirrorRootPath(cwd);
348
+ try {
349
+ const freshPath = await mirrorFreshImportGraph(absolutePath, mirrorRoot);
350
+ return { freshPath, mirrorRoot };
351
+ }
352
+ catch (error) {
353
+ rmSync(mirrorRoot, { force: true, recursive: true });
354
+ throw error;
355
+ }
356
+ };
357
+ const importFreshModule = async (modulePath, cwd) => {
358
+ const absolutePath = resolveAbsoluteModulePath(modulePath, cwd);
359
+ if (URL_SCHEME.test(absolutePath) && !absolutePath.startsWith('/')) {
360
+ return await importWithCacheBust(absolutePath);
361
+ }
362
+ const { mirrorRoot, freshPath } = await prepareMirror(absolutePath, cwd);
363
+ retainMirrorRoot(mirrorRoot);
364
+ return (await import(pathToFileURL(freshPath).href));
365
+ };
366
+ const resolveLoadedTopo = (effectivePath, mod) => {
367
+ const app = (mod['default'] ?? mod['graph'] ?? mod['app']);
18
368
  if (!app?.trails) {
19
- throw new Error(`Could not find a Topo export in "${modulePath}". ` +
20
- "Expected a default or named 'app' export created with topo().");
369
+ throw new Error(`Could not find a Topo export in "${effectivePath}". ` +
370
+ "Expected a default, 'graph', or 'app' named export created with topo().");
21
371
  }
22
372
  return app;
23
373
  };
374
+ const noopRelease = () => undefined;
375
+ const createUrlSchemeLease = async (absolutePath, effectivePath) => ({
376
+ app: resolveLoadedTopo(effectivePath, await importWithCacheBust(absolutePath)),
377
+ mirrorRoot: absolutePath,
378
+ release: noopRelease,
379
+ });
380
+ const createFilesystemLease = async (absolutePath, cwd, effectivePath) => {
381
+ const { mirrorRoot, freshPath } = await prepareMirror(absolutePath, cwd);
382
+ const release = acquireMirrorLease(mirrorRoot);
383
+ try {
384
+ const mod = (await import(pathToFileURL(freshPath).href));
385
+ return {
386
+ app: resolveLoadedTopo(effectivePath, mod),
387
+ mirrorRoot,
388
+ release,
389
+ };
390
+ }
391
+ catch (error) {
392
+ release();
393
+ throw error;
394
+ }
395
+ };
396
+ export const loadFreshAppLease = async (modulePath, cwd) => {
397
+ const effectivePath = modulePath === undefined ? findAppModule(cwd) : modulePath;
398
+ const absolutePath = resolveAbsoluteModulePath(effectivePath, cwd);
399
+ return URL_SCHEME.test(absolutePath) && !absolutePath.startsWith('/')
400
+ ? await createUrlSchemeLease(absolutePath, effectivePath)
401
+ : await createFilesystemLease(absolutePath, cwd, effectivePath);
402
+ };
403
+ /** Load a Topo export from a module path relative to cwd. */
404
+ export const loadApp = async (modulePath, cwd, options = {}) => {
405
+ const effectivePath = modulePath === undefined ? findAppModule(cwd) : modulePath;
406
+ const resolvedModulePath = resolveAbsoluteModulePath(effectivePath, cwd);
407
+ const mod = options.fresh === true
408
+ ? await importFreshModule(resolvedModulePath, cwd)
409
+ : (await import(URL_SCHEME.test(resolvedModulePath) &&
410
+ !resolvedModulePath.startsWith('/')
411
+ ? new URL(resolvedModulePath).href
412
+ : pathToFileURL(resolvedModulePath).href));
413
+ return resolveLoadedTopo(effectivePath, mod);
414
+ };
24
415
  //# sourceMappingURL=load-app.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"load-app.js","sourceRoot":"","sources":["../../../src/trails/load-app.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAChD,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAIzC,MAAM,UAAU,GAAG,0BAA0B,CAAC;AAE9C,8EAA8E;AAC9E,MAAM,sBAAsB,GAAG,CAAC,UAAkB,EAAE,GAAW,EAAU,EAAE;IACzE,IAAI,UAAU,CAAC,IAAI,CAAC,UAAU,CAAC,EAAE,CAAC;QAChC,OAAO,UAAU,CAAC;IACpB,CAAC;IAED,MAAM,YAAY,GAAG,UAAU,CAAC,UAAU,CAAC;QACzC,CAAC,CAAC,UAAU;QACZ,CAAC,CAAC,OAAO,CAAC,GAAG,EAAE,UAAU,CAAC,CAAC;IAC7B,OAAO,aAAa,CAAC,YAAY,CAAC,CAAC,IAAI,CAAC;AAC1C,CAAC,CAAC;AAEF,6DAA6D;AAC7D,MAAM,CAAC,MAAM,OAAO,GAAG,KAAK,EAC1B,UAAkB,EAClB,GAAW,EACI,EAAE;IACjB,MAAM,GAAG,GAAG,CAAC,MAAM,MAAM,CAAC,sBAAsB,CAAC,UAAU,EAAE,GAAG,CAAC,CAAC,CAGjE,CAAC;IACF,MAAM,GAAG,GAAG,CAAC,GAAG,CAAC,SAAS,CAAC,IAAI,GAAG,CAAC,KAAK,CAAC,CAAqB,CAAC;IAC/D,IAAI,CAAC,GAAG,EAAE,MAAM,EAAE,CAAC;QACjB,MAAM,IAAI,KAAK,CACb,oCAAoC,UAAU,KAAK;YACjD,+DAA+D,CAClE,CAAC;IACJ,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC,CAAC"}
1
+ {"version":3,"file":"load-app.js","sourceRoot":"","sources":["../../../src/trails/load-app.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"project.d.ts","sourceRoot":"","sources":["../../../src/trails/project.ts"],"names":[],"mappings":"AAAA;;GAEG;AAqBH,6DAA6D;AAC7D,eAAO,MAAM,YAAY,GAAU,KAAK,MAAM,KAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAkBrE,CAAC;AAEF,wEAAwE;AACxE,eAAO,MAAM,eAAe,GAAU,KAAK,MAAM,KAAG,OAAO,CAAC,OAAO,CAKlE,CAAC"}
1
+ {"version":3,"file":"project.d.ts","sourceRoot":"","sources":["../../../src/trails/project.ts"],"names":[],"mappings":"AAAA;;GAEG;AAmCH,6DAA6D;AAC7D,eAAO,MAAM,YAAY,GAAU,KAAK,MAAM,KAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAkBrE,CAAC;AAEF,wEAAwE;AACxE,eAAO,MAAM,eAAe,GAAU,KAAK,MAAM,KAAG,OAAO,CAAC,OAAO,CAKlE,CAAC"}
@@ -3,10 +3,21 @@
3
3
  */
4
4
  import { existsSync } from 'node:fs';
5
5
  import { join } from 'node:path';
6
+ import { isDraftMarkedFile } from '@ontrails/warden';
6
7
  /** Return all TypeScript entries in a project's src directory. */
7
- const scanSourceEntries = (srcDir) => [
8
- ...new Bun.Glob('*.ts').scanSync({ cwd: srcDir }),
9
- ];
8
+ const sourceEntryPriority = (entry) => {
9
+ if (entry === 'app.ts') {
10
+ return 0;
11
+ }
12
+ return isDraftMarkedFile(entry) ? 2 : 1;
13
+ };
14
+ const scanSourceEntries = (srcDir) => [...new Bun.Glob('*.ts').scanSync({ cwd: srcDir })].toSorted((a, b) => {
15
+ const priority = sourceEntryPriority(a) - sourceEntryPriority(b);
16
+ if (priority === 0) {
17
+ return a.localeCompare(b);
18
+ }
19
+ return priority;
20
+ });
10
21
  /** Resolve an entry to an app import if it contains topo(). */
11
22
  const toTopoImport = async (srcDir, entry) => {
12
23
  const content = await Bun.file(join(srcDir, entry)).text();
@@ -1 +1 @@
1
- {"version":3,"file":"project.js","sourceRoot":"","sources":["../../../src/trails/project.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAEjC,kEAAkE;AAClE,MAAM,iBAAiB,GAAG,CAAC,MAAc,EAAY,EAAE,CAAC;IACtD,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,QAAQ,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,CAAC;CAClD,CAAC;AAEF,+DAA+D;AAC/D,MAAM,YAAY,GAAG,KAAK,EACxB,MAAc,EACd,KAAa,EACW,EAAE;IAC1B,MAAM,OAAO,GAAG,MAAM,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;IAC3D,OAAO,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC;QAC9B,CAAC,CAAC,KAAK,KAAK,CAAC,OAAO,CAAC,OAAO,EAAE,KAAK,CAAC,EAAE;QACtC,CAAC,CAAC,IAAI,CAAC;AACX,CAAC,CAAC;AAEF,6DAA6D;AAC7D,MAAM,CAAC,MAAM,YAAY,GAAG,KAAK,EAAE,GAAW,EAA0B,EAAE;IACxE,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;IAChC,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC;QACxB,OAAO,IAAI,CAAC;IACd,CAAC;IAED,IAAI,CAAC;QACH,KAAK,MAAM,KAAK,IAAI,iBAAiB,CAAC,MAAM,CAAC,EAAE,CAAC;YAC9C,MAAM,SAAS,GAAG,MAAM,YAAY,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;YACpD,IAAI,SAAS,EAAE,CAAC;gBACd,OAAO,SAAS,CAAC;YACnB,CAAC;QACH,CAAC;IACH,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC,CAAC;AAEF,wEAAwE;AACxE,MAAM,CAAC,MAAM,eAAe,GAAG,KAAK,EAAE,GAAW,EAAoB,EAAE;IACrE,IAAI,UAAU,CAAC,IAAI,CAAC,GAAG,EAAE,SAAS,CAAC,CAAC,EAAE,CAAC;QACrC,OAAO,IAAI,CAAC;IACd,CAAC;IACD,OAAO,CAAC,MAAM,YAAY,CAAC,GAAG,CAAC,CAAC,KAAK,IAAI,CAAC;AAC5C,CAAC,CAAC"}
1
+ {"version":3,"file":"project.js","sourceRoot":"","sources":["../../../src/trails/project.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAEjC,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AAErD,kEAAkE;AAClE,MAAM,mBAAmB,GAAG,CAAC,KAAa,EAAU,EAAE;IACpD,IAAI,KAAK,KAAK,QAAQ,EAAE,CAAC;QACvB,OAAO,CAAC,CAAC;IACX,CAAC;IACD,OAAO,iBAAiB,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AAC1C,CAAC,CAAC;AAEF,MAAM,iBAAiB,GAAG,CAAC,MAAc,EAAY,EAAE,CACrD,CAAC,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,QAAQ,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;IACpE,MAAM,QAAQ,GAAG,mBAAmB,CAAC,CAAC,CAAC,GAAG,mBAAmB,CAAC,CAAC,CAAC,CAAC;IACjE,IAAI,QAAQ,KAAK,CAAC,EAAE,CAAC;QACnB,OAAO,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC;IAC5B,CAAC;IACD,OAAO,QAAQ,CAAC;AAClB,CAAC,CAAC,CAAC;AAEL,+DAA+D;AAC/D,MAAM,YAAY,GAAG,KAAK,EACxB,MAAc,EACd,KAAa,EACW,EAAE;IAC1B,MAAM,OAAO,GAAG,MAAM,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;IAC3D,OAAO,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC;QAC9B,CAAC,CAAC,KAAK,KAAK,CAAC,OAAO,CAAC,OAAO,EAAE,KAAK,CAAC,EAAE;QACtC,CAAC,CAAC,IAAI,CAAC;AACX,CAAC,CAAC;AAEF,6DAA6D;AAC7D,MAAM,CAAC,MAAM,YAAY,GAAG,KAAK,EAAE,GAAW,EAA0B,EAAE;IACxE,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;IAChC,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC;QACxB,OAAO,IAAI,CAAC;IACd,CAAC;IAED,IAAI,CAAC;QACH,KAAK,MAAM,KAAK,IAAI,iBAAiB,CAAC,MAAM,CAAC,EAAE,CAAC;YAC9C,MAAM,SAAS,GAAG,MAAM,YAAY,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;YACpD,IAAI,SAAS,EAAE,CAAC;gBACd,OAAO,SAAS,CAAC;YACnB,CAAC;QACH,CAAC;IACH,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC,CAAC;AAEF,wEAAwE;AACxE,MAAM,CAAC,MAAM,eAAe,GAAG,KAAK,EAAE,GAAW,EAAoB,EAAE;IACrE,IAAI,UAAU,CAAC,IAAI,CAAC,GAAG,EAAE,SAAS,CAAC,CAAC,EAAE,CAAC;QACrC,OAAO,IAAI,CAAC;IACd,CAAC;IACD,OAAO,CAAC,MAAM,YAAY,CAAC,GAAG,CAAC,CAAC,KAAK,IAAI,CAAC;AAC5C,CAAC,CAAC"}
@@ -4,69 +4,15 @@
4
4
  * Lists trails, shows detail for individual trails, generates surface maps,
5
5
  * and diffs against previous versions.
6
6
  */
7
- import type { Topo, Trail } from '@ontrails/core';
8
- export interface BriefReport {
9
- readonly name: string;
10
- readonly version: string;
11
- readonly contractVersion: string;
12
- readonly features: {
13
- readonly services: boolean;
14
- readonly outputSchemas: boolean;
15
- readonly examples: boolean;
16
- readonly detours: boolean;
17
- readonly events: boolean;
18
- };
19
- readonly trails: number;
20
- readonly events: number;
21
- readonly services: number;
22
- }
23
- export interface SurveyListReport {
24
- readonly count: number;
25
- readonly entries: readonly {
26
- readonly examples: number;
27
- readonly id: string;
28
- readonly kind: string;
29
- readonly safety: string;
30
- }[];
31
- readonly serviceCount: number;
32
- readonly services: readonly {
33
- readonly description: string | null;
34
- readonly health: 'available' | 'none';
35
- readonly id: string;
36
- readonly kind: 'service';
37
- readonly lifetime: 'singleton';
38
- readonly usedBy: readonly string[];
39
- }[];
40
- }
41
- export interface TrailDetailReport {
42
- readonly description: string | null;
43
- readonly detours: Trail<unknown, unknown>['detours'] | null;
44
- readonly examples: readonly unknown[];
45
- readonly follow: readonly string[];
46
- readonly id: string;
47
- readonly intent: 'read' | 'write' | 'destroy';
48
- readonly kind: string;
49
- readonly safety: string;
50
- readonly services: readonly string[];
51
- }
52
- /** Generate a compact capability report for the given topo. */
53
- export declare const generateBriefReport: (app: Topo) => BriefReport;
54
- export declare const generateSurveyList: (app: Topo) => SurveyListReport;
55
- /**
56
- * Build a human-readable detail view for a single trail.
57
- *
58
- * Overlaps with `trailToEntry` in `@ontrails/schema` which builds the
59
- * surface-map entry. The two serve different audiences (human display vs
60
- * machine-diffable surface map) so they are kept separate.
61
- */
62
- export declare const generateTrailDetail: (item: Trail<unknown, unknown>) => TrailDetailReport;
63
- export declare const surveyTrail: Trail<{
7
+ export { deriveBriefReport, deriveResourceDetail, deriveSurveyList, deriveTrailDetail, } from './topo-reports.js';
8
+ export type { BriefReport, SurveyListReport, TrailDetailReport, } from './topo-reports.js';
9
+ export declare const surveyTrail: import("@ontrails/core").Trail<{
64
10
  breakingOnly: boolean;
65
11
  brief: boolean;
12
+ diffSaved: boolean;
66
13
  generate: boolean;
67
- module: string;
68
14
  openapi: boolean;
69
- diff?: string | undefined;
15
+ module?: string | undefined;
70
16
  trailId?: string | undefined;
71
- }, object>;
17
+ }, object, never>;
72
18
  //# sourceMappingURL=survey.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"survey.d.ts","sourceRoot":"","sources":["../../../src/trails/survey.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,gBAAgB,CAAC;AAoBlD,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,eAAe,EAAE,MAAM,CAAC;IACjC,QAAQ,CAAC,QAAQ,EAAE;QACjB,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC;QAC3B,QAAQ,CAAC,aAAa,EAAE,OAAO,CAAC;QAChC,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC;QAC3B,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;QAC1B,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC;KAC1B,CAAC;IACF,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;CAC3B;AAED,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,OAAO,EAAE,SAAS;QACzB,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;QAC1B,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;QACpB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;QACtB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;KACzB,EAAE,CAAC;IACJ,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,QAAQ,EAAE,SAAS;QAC1B,QAAQ,CAAC,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;QACpC,QAAQ,CAAC,MAAM,EAAE,WAAW,GAAG,MAAM,CAAC;QACtC,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;QACpB,QAAQ,CAAC,IAAI,EAAE,SAAS,CAAC;QACzB,QAAQ,CAAC,QAAQ,EAAE,WAAW,CAAC;QAC/B,QAAQ,CAAC,MAAM,EAAE,SAAS,MAAM,EAAE,CAAC;KACpC,EAAE,CAAC;CACL;AAED,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IACpC,QAAQ,CAAC,OAAO,EAAE,KAAK,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC,SAAS,CAAC,GAAG,IAAI,CAAC;IAC5D,QAAQ,CAAC,QAAQ,EAAE,SAAS,OAAO,EAAE,CAAC;IACtC,QAAQ,CAAC,MAAM,EAAE,SAAS,MAAM,EAAE,CAAC;IACnC,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,GAAG,SAAS,CAAC;IAC9C,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,QAAQ,EAAE,SAAS,MAAM,EAAE,CAAC;CACtC;AAiCD,+DAA+D;AAC/D,eAAO,MAAM,mBAAmB,GAAI,KAAK,IAAI,KAAG,WAmB/C,CAAC;AAwDF,eAAO,MAAM,kBAAkB,GAAI,KAAK,IAAI,KAAG,gBA4B9C,CAAC;AAEF;;;;;;GAMG;AACH,eAAO,MAAM,mBAAmB,GAC9B,MAAM,KAAK,CAAC,OAAO,EAAE,OAAO,CAAC,KAC5B,iBAgBF,CAAC;AA+HF,eAAO,MAAM,WAAW;;;;;;;;UAmItB,CAAC"}
1
+ {"version":3,"file":"survey.d.ts","sourceRoot":"","sources":["../../../src/trails/survey.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAuBH,OAAO,EACL,iBAAiB,EACjB,oBAAoB,EACpB,gBAAgB,EAChB,iBAAiB,GAClB,MAAM,mBAAmB,CAAC;AAC3B,YAAY,EACV,WAAW,EACX,gBAAgB,EAChB,iBAAiB,GAClB,MAAM,mBAAmB,CAAC;AAiI3B,eAAO,MAAM,WAAW;;;;;;;;iBAyJtB,CAAC"}