dist/<browser>.
How it works
Path resolution runs in two places:- Manifest compilation pipeline: resolves manifest-declared paths to emitted assets.
- Path-resolve plugin for JS/TS: rewrites static path literals passed to supported extension APIs (for example,
runtime.getURL,tabs.update,scripting.*,action.*,sidePanel.*).
Supported input styles
Extension.js normalizes common path inputs as follows:
Extension mapping for
pages/ and scripts/ includes:
.ts,.tsx,.js,.jsx→.js.njk,.nunjucks,.html→.html.scss,.sass,.less,.css→.css
Cases Extension.js does not rewrite
To avoid false positives, Extension.js intentionally skips these inputs:http://andhttps://URLsdata:URLschrome://URLsmoz-extension://URLs- Glob patterns (
*,?,{},[]) - Non-static/dynamic expressions that the build cannot safely resolve
Manifest output examples
Assuming target browserchrome:
Not every manifest field maps to a folder with the same source name. Extension.js bases output paths on the browser-facing extension contract, not on your original authoring path.
Extension.js emits all compiled outputs under
dist/<browser>.
Referencing output files
For browser APIs likechrome.runtime.getURL(), prefer stable, output-root paths:
chrome-extension:<extension-id>/icons/icon.png
Diagnostics and safety checks
The resolver warns you when it cannot resolve a referenced path to a packaged asset (for example, nestedsrc/pages/... or missing public/ files after rewrite).Extension.js de-duplicates warnings per file transform pass to reduce noise.
Important path rules
- Leading
/means extension output root, not filesystem root. public/...and/public/...normalize to output-root assets.pages/andscripts/are special folders with extension mapping rules.- Extension.js preserves absolute OS file paths instead of treating them as extension output paths.
- Extension.js skips dynamic expressions when it cannot safely determine the final packaged path.
Best practices
- Keep
pages/,scripts/, andpublic/at project root for predictable rewrites. - Use static literals for extension API paths when possible; Extension.js may skip dynamic expressions.
- Treat
/public/...as output-root assets and avoid source-relative assumptions at runtime. - Validate warnings during
devas they usually indicate path mismatches before packaging.
Next steps
- Learn more about Special folders.
- Learn more about web-accessible resources.

