@frmwrkd/snag-anchor 0.4.0 → 0.5.1

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/README.md CHANGED
@@ -205,7 +205,7 @@ server.middlewares.use(createDevtoolsJsonMiddleware('/abs/project/root'));
205
205
 
206
206
  ## Next.js and Turbopack
207
207
 
208
- `create-next-app` on Next 15 defaults `next dev` to Turbopack, and
208
+ Next.js 16 defaults `next dev` and `next build` to Turbopack, and
209
209
  `turbopack.rules` maps file extensions to **webpack-shaped loaders**, not to
210
210
  unplugin plugins. So the transform also ships as a plain CommonJS loader:
211
211
 
@@ -214,20 +214,21 @@ unplugin plugins. So the transform also ships as a plain CommonJS loader:
214
214
  module.exports = {
215
215
  turbopack: {
216
216
  rules: {
217
- '*.{jsx,tsx}': { loaders: ['@frmwrkd/snag-anchor/loader'], as: '*.{jsx,tsx}' },
217
+ '*.jsx': { condition: { all: ['development', { not: 'foreign' }] }, loaders: ['@frmwrkd/snag-anchor/loader'] },
218
+ '*.tsx': { condition: { all: ['development', { not: 'foreign' }] }, loaders: ['@frmwrkd/snag-anchor/loader'] },
218
219
  },
219
220
  },
220
221
  };
221
222
  ```
222
223
 
223
- **This integration is unverified.** `docs/03-RESEARCH-APPENDIX.md` §2.7 marks it
224
- `[U]`, and no primary source confirms an unplugin-based transform can be
225
- registered through `turbopack.rules`. It has not been run against a real
226
- Turbopack dev server here. If Turbopack rejects the loader,
227
- `docs/02-BACKEND-SPEC.md` §2.6 criterion 6 explicitly permits `next dev
228
- --no-turbo` — which runs the webpack pipeline, where both
229
- `@frmwrkd/snag-anchor/webpack` and this loader work — with the gap recorded as a known
230
- limitation.
224
+ **Verified on Next.js 16.4.2 with Node 22 on Windows:** the development server
225
+ emitted exact file, line and column attributes, and `next build` emitted none.
226
+ The separate rules preserve JSX/TSX extensions for Next's compiler; an `as`
227
+ rename is unnecessary. See the official [Turbopack configuration](https://nextjs.org/docs/app/api-reference/config/next-config-js/turbopack)
228
+ and [Next.js 16 bundler defaults](https://nextjs.org/docs/app/guides/upgrading/version-16).
229
+ Next.js 15.5.26's webpack pipeline was also verified with the development-only
230
+ plugin hook. On Next.js 16, use `next dev --webpack` when deliberately choosing
231
+ webpack; init preserves the project's selected bundler and existing hooks.
231
232
 
232
233
  There is no native SWC plugin. A real one would have to be a Rust-compiled
233
234
  binary; the loader covers the same ground at the bundler level, for both the
package/dist/root.d.ts CHANGED
@@ -29,14 +29,18 @@ export declare function findManifestDir(startDir: string): string | undefined;
29
29
  * The project root every emitted path is relative to.
30
30
  *
31
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.
32
+ * inside the git root → git root → nearest `package.json` → the working
33
+ * directory. Always absolute and always POSIX-normalised.
34
34
  *
35
35
  * The Snag project comes before git because snagd reads every path from its
36
36
  * own root. An app in a subfolder of its repo (`roughcut/frontend` inside
37
37
  * `Video Editor/`) otherwise emitted `roughcut/frontend/src/…`, which snagd
38
38
  * looked for at `roughcut/frontend/roughcut/frontend/src/…` and dropped as
39
39
  * "does not exist on disk".
40
+ *
41
+ * Only inside the git root, though: snagd run once from `~` writes
42
+ * `~/.snag/config.json`, and every repo under `~` would otherwise be rooted
43
+ * at `~`.
40
44
  */
41
45
  export declare function resolveRoot(explicitRoot?: string, cwd?: string): string;
42
46
  /**
@@ -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;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"}
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;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,WAAW,CAAC,YAAY,CAAC,EAAE,MAAM,EAAE,GAAG,GAAE,MAAsB,GAAG,MAAM,CAUtF;AAED;;;;;;;GAOG;AACH,wBAAgB,cAAc,CAAC,YAAY,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,CAKzE"}
package/dist/root.js CHANGED
@@ -84,20 +84,28 @@ export function findManifestDir(startDir) {
84
84
  * The project root every emitted path is relative to.
85
85
  *
86
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.
87
+ * inside the git root → git root → nearest `package.json` → the working
88
+ * directory. Always absolute and always POSIX-normalised.
89
89
  *
90
90
  * The Snag project comes before git because snagd reads every path from its
91
91
  * own root. An app in a subfolder of its repo (`roughcut/frontend` inside
92
92
  * `Video Editor/`) otherwise emitted `roughcut/frontend/src/…`, which snagd
93
93
  * looked for at `roughcut/frontend/roughcut/frontend/src/…` and dropped as
94
94
  * "does not exist on disk".
95
+ *
96
+ * Only inside the git root, though: snagd run once from `~` writes
97
+ * `~/.snag/config.json`, and every repo under `~` would otherwise be rooted
98
+ * at `~`.
95
99
  */
96
100
  export function resolveRoot(explicitRoot, cwd = process.cwd()) {
97
101
  if (explicitRoot !== undefined && explicitRoot !== '') {
98
102
  return toPosix(path.resolve(explicitRoot));
99
103
  }
100
- const found = findSnagProject(cwd) ?? findGitRoot(cwd) ?? findManifestDir(cwd) ?? cwd;
104
+ const snag = findSnagProject(cwd);
105
+ const git = findGitRoot(cwd);
106
+ const relative = snag === undefined || git === undefined ? '' : path.relative(git, snag);
107
+ const inGit = snag !== undefined && (git === undefined || (relative !== '..' && !relative.startsWith(`..${path.sep}`) && !path.isAbsolute(relative)));
108
+ const found = (inGit ? snag : undefined) ?? git ?? findManifestDir(cwd) ?? cwd;
101
109
  return toPosix(path.resolve(found));
102
110
  }
103
111
  /**
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.4.0",
3
+ "version": "0.5.1",
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",