@frmwrkd/snag-anchor 0.2.0 → 0.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/root.d.ts CHANGED
@@ -17,13 +17,26 @@ export declare function clearRootCaches(): void;
17
17
  * every emitted path would gain a bogus prefix.
18
18
  */
19
19
  export declare function findGitRoot(startDir: string): string | undefined;
20
+ /**
21
+ * Nearest ancestor that is a Snag project: it holds `.snag/config.json`, which
22
+ * `snagd init` writes. `~/.snag` (the token and the models) has no
23
+ * `config.json`, so a project without Snag never resolves to the home folder.
24
+ */
25
+ export declare function findSnagProject(startDir: string): string | undefined;
20
26
  /** Nearest ancestor directory containing `package.json`. Fallback when there is no git repo. */
21
27
  export declare function findManifestDir(startDir: string): string | undefined;
22
28
  /**
23
29
  * The project root every emitted path is relative to.
24
30
  *
25
- * Precedence: explicit `root` option → git root → nearest `package.json` →
26
- * the working directory. Always absolute and always POSIX-normalised.
31
+ * Precedence: explicit `root` option → the Snag project (`.snag/config.json`)
32
+ * → git root → nearest `package.json` → the working directory. Always absolute
33
+ * and always POSIX-normalised.
34
+ *
35
+ * The Snag project comes before git because snagd reads every path from its
36
+ * own root. An app in a subfolder of its repo (`roughcut/frontend` inside
37
+ * `Video Editor/`) otherwise emitted `roughcut/frontend/src/…`, which snagd
38
+ * looked for at `roughcut/frontend/roughcut/frontend/src/…` and dropped as
39
+ * "does not exist on disk".
27
40
  */
28
41
  export declare function resolveRoot(explicitRoot?: string, cwd?: string): string;
29
42
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"root.d.ts","sourceRoot":"","sources":["../src/root.ts"],"names":[],"mappings":"AAsBA;;;;;;GAMG;AACH,wBAAgB,OAAO,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM,CAEzC;AAMD,wFAAwF;AACxF,wBAAgB,eAAe,IAAI,IAAI,CAGtC;AAoBD;;;;;;;GAOG;AACH,wBAAgB,WAAW,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAEhE;AAED,gGAAgG;AAChG,wBAAgB,eAAe,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAEpE;AAED;;;;;GAKG;AACH,wBAAgB,WAAW,CAAC,YAAY,CAAC,EAAE,MAAM,EAAE,GAAG,GAAE,MAAsB,GAAG,MAAM,CAMtF;AAED;;;;;;;GAOG;AACH,wBAAgB,cAAc,CAAC,YAAY,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,CAKzE"}
1
+ {"version":3,"file":"root.d.ts","sourceRoot":"","sources":["../src/root.ts"],"names":[],"mappings":"AAsBA;;;;;;GAMG;AACH,wBAAgB,OAAO,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM,CAEzC;AAOD,wFAAwF;AACxF,wBAAgB,eAAe,IAAI,IAAI,CAItC;AAoBD;;;;;;;GAOG;AACH,wBAAgB,WAAW,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAEhE;AAED;;;;GAIG;AACH,wBAAgB,eAAe,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAEpE;AAED,gGAAgG;AAChG,wBAAgB,eAAe,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAEpE;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,WAAW,CAAC,YAAY,CAAC,EAAE,MAAM,EAAE,GAAG,GAAE,MAAsB,GAAG,MAAM,CAMtF;AAED;;;;;;;GAOG;AACH,wBAAgB,cAAc,CAAC,YAAY,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,CAKzE"}
package/dist/root.js CHANGED
@@ -32,10 +32,12 @@ export function toPosix(p) {
32
32
  /** Cache keyed by the resolved start directory. Transform runs per file. */
33
33
  const gitRootCache = new Map();
34
34
  const manifestDirCache = new Map();
35
+ const snagProjectCache = new Map();
35
36
  /** Test seam — the caches are process-global and would otherwise leak between tests. */
36
37
  export function clearRootCaches() {
37
38
  gitRootCache.clear();
38
39
  manifestDirCache.clear();
40
+ snagProjectCache.clear();
39
41
  }
40
42
  function findUp(startDir, entry, cache) {
41
43
  const start = path.resolve(startDir);
@@ -66,6 +68,14 @@ function findUp(startDir, entry, cache) {
66
68
  export function findGitRoot(startDir) {
67
69
  return findUp(startDir, '.git', gitRootCache);
68
70
  }
71
+ /**
72
+ * Nearest ancestor that is a Snag project: it holds `.snag/config.json`, which
73
+ * `snagd init` writes. `~/.snag` (the token and the models) has no
74
+ * `config.json`, so a project without Snag never resolves to the home folder.
75
+ */
76
+ export function findSnagProject(startDir) {
77
+ return findUp(startDir, path.join('.snag', 'config.json'), snagProjectCache);
78
+ }
69
79
  /** Nearest ancestor directory containing `package.json`. Fallback when there is no git repo. */
70
80
  export function findManifestDir(startDir) {
71
81
  return findUp(startDir, 'package.json', manifestDirCache);
@@ -73,14 +83,21 @@ export function findManifestDir(startDir) {
73
83
  /**
74
84
  * The project root every emitted path is relative to.
75
85
  *
76
- * Precedence: explicit `root` option → git root → nearest `package.json` →
77
- * the working directory. Always absolute and always POSIX-normalised.
86
+ * Precedence: explicit `root` option → the Snag project (`.snag/config.json`)
87
+ * → git root → nearest `package.json` → the working directory. Always absolute
88
+ * and always POSIX-normalised.
89
+ *
90
+ * The Snag project comes before git because snagd reads every path from its
91
+ * own root. An app in a subfolder of its repo (`roughcut/frontend` inside
92
+ * `Video Editor/`) otherwise emitted `roughcut/frontend/src/…`, which snagd
93
+ * looked for at `roughcut/frontend/roughcut/frontend/src/…` and dropped as
94
+ * "does not exist on disk".
78
95
  */
79
96
  export function resolveRoot(explicitRoot, cwd = process.cwd()) {
80
97
  if (explicitRoot !== undefined && explicitRoot !== '') {
81
98
  return toPosix(path.resolve(explicitRoot));
82
99
  }
83
- const found = findGitRoot(cwd) ?? findManifestDir(cwd) ?? cwd;
100
+ const found = findSnagProject(cwd) ?? findGitRoot(cwd) ?? findManifestDir(cwd) ?? cwd;
84
101
  return toPosix(path.resolve(found));
85
102
  }
86
103
  /**
package/dist/root.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"root.js","sourceRoot":"","sources":["../src/root.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"root.js","sourceRoot":"","sources":["../src/root.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@frmwrkd/snag-anchor",
3
- "version": "0.2.0",
3
+ "version": "0.4.0",
4
4
  "description": "Build-time plugin that stamps data-snag=\"file:line:col\" onto every element (Vite, webpack, Rspack, Rollup, esbuild).",
5
5
  "repository": {
6
6
  "type": "git",