@seanhogg/builderforce-webcontainers-core 2026.10.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 (78) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +20 -0
  3. package/dist/attribution.d.ts +22 -0
  4. package/dist/attribution.d.ts.map +1 -0
  5. package/dist/attribution.js +50 -0
  6. package/dist/attribution.js.map +1 -0
  7. package/dist/compileScript.d.ts +31 -0
  8. package/dist/compileScript.d.ts.map +1 -0
  9. package/dist/compileScript.js +75 -0
  10. package/dist/compileScript.js.map +1 -0
  11. package/dist/detectProject.d.ts +16 -0
  12. package/dist/detectProject.d.ts.map +1 -0
  13. package/dist/detectProject.js +49 -0
  14. package/dist/detectProject.js.map +1 -0
  15. package/dist/devServer.d.ts +46 -0
  16. package/dist/devServer.d.ts.map +1 -0
  17. package/dist/devServer.js +136 -0
  18. package/dist/devServer.js.map +1 -0
  19. package/dist/html.d.ts +17 -0
  20. package/dist/html.d.ts.map +1 -0
  21. package/dist/html.js +46 -0
  22. package/dist/html.js.map +1 -0
  23. package/dist/index.d.ts +21 -0
  24. package/dist/index.d.ts.map +1 -0
  25. package/dist/index.js +14 -0
  26. package/dist/index.js.map +1 -0
  27. package/dist/mime.d.ts +3 -0
  28. package/dist/mime.d.ts.map +1 -0
  29. package/dist/mime.js +35 -0
  30. package/dist/mime.js.map +1 -0
  31. package/dist/packageCdn.d.ts +19 -0
  32. package/dist/packageCdn.d.ts.map +1 -0
  33. package/dist/packageCdn.js +29 -0
  34. package/dist/packageCdn.js.map +1 -0
  35. package/dist/paths.d.ts +12 -0
  36. package/dist/paths.d.ts.map +1 -0
  37. package/dist/paths.js +36 -0
  38. package/dist/paths.js.map +1 -0
  39. package/dist/projectConfig.d.ts +36 -0
  40. package/dist/projectConfig.d.ts.map +1 -0
  41. package/dist/projectConfig.js +155 -0
  42. package/dist/projectConfig.js.map +1 -0
  43. package/dist/resolve.d.ts +19 -0
  44. package/dist/resolve.d.ts.map +1 -0
  45. package/dist/resolve.js +62 -0
  46. package/dist/resolve.js.map +1 -0
  47. package/dist/rewriteImports.d.ts +11 -0
  48. package/dist/rewriteImports.d.ts.map +1 -0
  49. package/dist/rewriteImports.js +28 -0
  50. package/dist/rewriteImports.js.map +1 -0
  51. package/dist/styleModules.d.ts +12 -0
  52. package/dist/styleModules.d.ts.map +1 -0
  53. package/dist/styleModules.js +53 -0
  54. package/dist/styleModules.js.map +1 -0
  55. package/dist/transformer.d.ts +42 -0
  56. package/dist/transformer.d.ts.map +1 -0
  57. package/dist/transformer.js +39 -0
  58. package/dist/transformer.js.map +1 -0
  59. package/dist/vfs.d.ts +57 -0
  60. package/dist/vfs.d.ts.map +1 -0
  61. package/dist/vfs.js +114 -0
  62. package/dist/vfs.js.map +1 -0
  63. package/package.json +67 -0
  64. package/src/attribution.ts +57 -0
  65. package/src/compileScript.ts +87 -0
  66. package/src/detectProject.ts +66 -0
  67. package/src/devServer.ts +156 -0
  68. package/src/html.ts +58 -0
  69. package/src/index.ts +20 -0
  70. package/src/mime.ts +36 -0
  71. package/src/packageCdn.ts +48 -0
  72. package/src/paths.ts +37 -0
  73. package/src/projectConfig.ts +157 -0
  74. package/src/resolve.ts +60 -0
  75. package/src/rewriteImports.ts +26 -0
  76. package/src/styleModules.ts +57 -0
  77. package/src/transformer.ts +76 -0
  78. package/src/vfs.ts +135 -0
package/dist/index.js ADDED
@@ -0,0 +1,14 @@
1
+ export { VirtualFileSystem } from './vfs.js';
2
+ export { normalizePath, dirname, basename, join, extname } from './paths.js';
3
+ export { DevServer } from './devServer.js';
4
+ export { detectProject } from './detectProject.js';
5
+ export { readProjectConfig, parseLooseJson, parseDotenv } from './projectConfig.js';
6
+ export { createEsmShCdn } from './packageCdn.js';
7
+ export { createEsbuildTransformer, loaderFor } from './transformer.js';
8
+ export { rewriteImports } from './rewriteImports.js';
9
+ export { resolveLocal, resolveAlias, isBareSpecifier, splitPackageSpecifier, RESOLVE_EXTENSIONS } from './resolve.js';
10
+ export { compileScript, mapSpecifier, moduleUrl, buildDefine } from './compileScript.js';
11
+ export { transformHtml, errorBridgeScript, ERROR_MESSAGE_TYPE } from './html.js';
12
+ export { mimeFor } from './mime.js';
13
+ export { attributionScript, injectAttribution, ATTRIBUTION_URL, ATTRIBUTION_LABEL } from './attribution.js';
14
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,UAAU,CAAC;AAE7C,OAAO,EAAE,aAAa,EAAE,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;AAC7E,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAE3C,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAEnD,OAAO,EAAE,iBAAiB,EAAE,cAAc,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAEpF,OAAO,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAEjD,OAAO,EAAE,wBAAwB,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAEvE,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AACrD,OAAO,EAAE,YAAY,EAAE,YAAY,EAAE,eAAe,EAAE,qBAAqB,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAC;AACtH,OAAO,EAAE,aAAa,EAAE,YAAY,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACzF,OAAO,EAAE,aAAa,EAAE,iBAAiB,EAAE,kBAAkB,EAAE,MAAM,WAAW,CAAC;AACjF,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,eAAe,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC"}
package/dist/mime.d.ts ADDED
@@ -0,0 +1,3 @@
1
+ export declare const JS_MIME = "text/javascript; charset=utf-8";
2
+ export declare function mimeFor(ext: string): string;
3
+ //# sourceMappingURL=mime.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mime.d.ts","sourceRoot":"","sources":["../src/mime.ts"],"names":[],"mappings":"AA+BA,eAAO,MAAM,OAAO,mCAAmC,CAAC;AAExD,wBAAgB,OAAO,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAE3C"}
package/dist/mime.js ADDED
@@ -0,0 +1,35 @@
1
+ const MIME = {
2
+ '.html': 'text/html; charset=utf-8',
3
+ '.htm': 'text/html; charset=utf-8',
4
+ '.css': 'text/css; charset=utf-8',
5
+ '.js': 'text/javascript; charset=utf-8',
6
+ '.mjs': 'text/javascript; charset=utf-8',
7
+ '.json': 'application/json; charset=utf-8',
8
+ '.map': 'application/json; charset=utf-8',
9
+ '.txt': 'text/plain; charset=utf-8',
10
+ '.md': 'text/markdown; charset=utf-8',
11
+ '.xml': 'application/xml; charset=utf-8',
12
+ '.svg': 'image/svg+xml',
13
+ '.png': 'image/png',
14
+ '.jpg': 'image/jpeg',
15
+ '.jpeg': 'image/jpeg',
16
+ '.gif': 'image/gif',
17
+ '.webp': 'image/webp',
18
+ '.avif': 'image/avif',
19
+ '.ico': 'image/x-icon',
20
+ '.woff': 'font/woff',
21
+ '.woff2': 'font/woff2',
22
+ '.ttf': 'font/ttf',
23
+ '.otf': 'font/otf',
24
+ '.mp3': 'audio/mpeg',
25
+ '.wav': 'audio/wav',
26
+ '.mp4': 'video/mp4',
27
+ '.webm': 'video/webm',
28
+ '.wasm': 'application/wasm',
29
+ '.pdf': 'application/pdf',
30
+ };
31
+ export const JS_MIME = 'text/javascript; charset=utf-8';
32
+ export function mimeFor(ext) {
33
+ return MIME[ext] ?? 'application/octet-stream';
34
+ }
35
+ //# sourceMappingURL=mime.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mime.js","sourceRoot":"","sources":["../src/mime.ts"],"names":[],"mappings":"AAAA,MAAM,IAAI,GAA2B;IACnC,OAAO,EAAE,0BAA0B;IACnC,MAAM,EAAE,0BAA0B;IAClC,MAAM,EAAE,yBAAyB;IACjC,KAAK,EAAE,gCAAgC;IACvC,MAAM,EAAE,gCAAgC;IACxC,OAAO,EAAE,iCAAiC;IAC1C,MAAM,EAAE,iCAAiC;IACzC,MAAM,EAAE,2BAA2B;IACnC,KAAK,EAAE,8BAA8B;IACrC,MAAM,EAAE,gCAAgC;IACxC,MAAM,EAAE,eAAe;IACvB,MAAM,EAAE,WAAW;IACnB,MAAM,EAAE,YAAY;IACpB,OAAO,EAAE,YAAY;IACrB,MAAM,EAAE,WAAW;IACnB,OAAO,EAAE,YAAY;IACrB,OAAO,EAAE,YAAY;IACrB,MAAM,EAAE,cAAc;IACtB,OAAO,EAAE,WAAW;IACpB,QAAQ,EAAE,YAAY;IACtB,MAAM,EAAE,UAAU;IAClB,MAAM,EAAE,UAAU;IAClB,MAAM,EAAE,YAAY;IACpB,MAAM,EAAE,WAAW;IACnB,MAAM,EAAE,WAAW;IACnB,OAAO,EAAE,YAAY;IACrB,OAAO,EAAE,kBAAkB;IAC3B,MAAM,EAAE,iBAAiB;CAC1B,CAAC;AAEF,MAAM,CAAC,MAAM,OAAO,GAAG,gCAAgC,CAAC;AAExD,MAAM,UAAU,OAAO,CAAC,GAAW;IACjC,OAAO,IAAI,CAAC,GAAG,CAAC,IAAI,0BAA0B,CAAC;AACjD,CAAC"}
@@ -0,0 +1,19 @@
1
+ /**
2
+ * Where a bare import (`react`, `react-dom/client`) is fetched from. A PORT, so a
3
+ * fork can point at a self-hosted mirror or an offline cache without touching the
4
+ * rest of the runtime. The default speaks esm.sh's URL scheme.
5
+ */
6
+ export interface PackageCdn {
7
+ /** The ES-module URL for `name` + `subpath` (`'' | '/client'`). */
8
+ urlFor(name: string, subpath: string): string;
9
+ }
10
+ export interface EsmShOptions {
11
+ /** Defaults to https://esm.sh. Any esm.sh-compatible server works. */
12
+ origin?: string;
13
+ /** The project's dependency ranges — pins versions and dedupes shared packages. */
14
+ dependencies?: Record<string, string>;
15
+ /** Serve development builds (readable React errors). Default true. */
16
+ dev?: boolean;
17
+ }
18
+ export declare function createEsmShCdn(options?: EsmShOptions): PackageCdn;
19
+ //# sourceMappingURL=packageCdn.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"packageCdn.d.ts","sourceRoot":"","sources":["../src/packageCdn.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,MAAM,WAAW,UAAU;IACzB,mEAAmE;IACnE,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,CAAC;CAC/C;AAED,MAAM,WAAW,YAAY;IAC3B,sEAAsE;IACtE,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,mFAAmF;IACnF,YAAY,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACtC,sEAAsE;IACtE,GAAG,CAAC,EAAE,OAAO,CAAC;CACf;AAOD,wBAAgB,cAAc,CAAC,OAAO,GAAE,YAAiB,GAAG,UAAU,CAuBrE"}
@@ -0,0 +1,29 @@
1
+ /** A range the CDN can't fetch (`workspace:*`, `file:../x`, `link:`, git URLs). */
2
+ function isRegistryRange(range) {
3
+ return !/^(workspace|file|link|portal|git\+|git:|github:|https?:)/.test(range) && !range.includes('/');
4
+ }
5
+ export function createEsmShCdn(options = {}) {
6
+ const origin = (options.origin ?? 'https://esm.sh').replace(/\/+$/, '');
7
+ const dependencies = options.dependencies ?? {};
8
+ const dev = options.dev ?? true;
9
+ // Pin every declared dependency into each package's own graph, so `react-dom`
10
+ // and the app share ONE `react` — two copies is the classic "invalid hook call".
11
+ const pinned = Object.entries(dependencies)
12
+ .filter(([, range]) => isRegistryRange(range))
13
+ .map(([name, range]) => `${name}@${range}`)
14
+ .sort();
15
+ return {
16
+ urlFor(name, subpath) {
17
+ const range = dependencies[name];
18
+ const versioned = range && isRegistryRange(range) ? `${name}@${range}` : name;
19
+ const params = [];
20
+ const deps = pinned.filter((entry) => !entry.startsWith(name + '@'));
21
+ if (deps.length)
22
+ params.push('deps=' + deps.map(encodeURIComponent).join(','));
23
+ if (dev)
24
+ params.push('dev');
25
+ return `${origin}/${versioned}${subpath}${params.length ? '?' + params.join('&') : ''}`;
26
+ },
27
+ };
28
+ }
29
+ //# sourceMappingURL=packageCdn.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"packageCdn.js","sourceRoot":"","sources":["../src/packageCdn.ts"],"names":[],"mappings":"AAmBA,mFAAmF;AACnF,SAAS,eAAe,CAAC,KAAa;IACpC,OAAO,CAAC,0DAA0D,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;AACzG,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,UAAwB,EAAE;IACvD,MAAM,MAAM,GAAG,CAAC,OAAO,CAAC,MAAM,IAAI,gBAAgB,CAAC,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;IACxE,MAAM,YAAY,GAAG,OAAO,CAAC,YAAY,IAAI,EAAE,CAAC;IAChD,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,IAAI,IAAI,CAAC;IAEhC,8EAA8E;IAC9E,iFAAiF;IACjF,MAAM,MAAM,GAAG,MAAM,CAAC,OAAO,CAAC,YAAY,CAAC;SACxC,MAAM,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,eAAe,CAAC,KAAK,CAAC,CAAC;SAC7C,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,GAAG,IAAI,IAAI,KAAK,EAAE,CAAC;SAC1C,IAAI,EAAE,CAAC;IAEV,OAAO;QACL,MAAM,CAAC,IAAI,EAAE,OAAO;YAClB,MAAM,KAAK,GAAG,YAAY,CAAC,IAAI,CAAC,CAAC;YACjC,MAAM,SAAS,GAAG,KAAK,IAAI,eAAe,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,IAAI,IAAI,KAAK,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;YAC9E,MAAM,MAAM,GAAa,EAAE,CAAC;YAC5B,MAAM,IAAI,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,UAAU,CAAC,IAAI,GAAG,GAAG,CAAC,CAAC,CAAC;YACrE,IAAI,IAAI,CAAC,MAAM;gBAAE,MAAM,CAAC,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,kBAAkB,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;YAC/E,IAAI,GAAG;gBAAE,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YAC5B,OAAO,GAAG,MAAM,IAAI,SAAS,GAAG,OAAO,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,GAAG,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC;QAC1F,CAAC;KACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,12 @@
1
+ /**
2
+ * POSIX path helpers for the virtual file system. Every path the runtime stores is
3
+ * absolute and normalised (`/src/App.tsx`), so comparisons are plain string equality.
4
+ */
5
+ /** Absolute, normalised: resolves `.`/`..`, collapses slashes, accepts backslashes. */
6
+ export declare function normalizePath(path: string): string;
7
+ export declare function dirname(path: string): string;
8
+ export declare function basename(path: string): string;
9
+ export declare function join(...segments: string[]): string;
10
+ /** Lower-cased extension including the dot (`.tsx`), or `''`. Dotfiles have none. */
11
+ export declare function extname(path: string): string;
12
+ //# sourceMappingURL=paths.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"paths.d.ts","sourceRoot":"","sources":["../src/paths.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,uFAAuF;AACvF,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAQlD;AAED,wBAAgB,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAI5C;AAED,wBAAgB,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAG7C;AAED,wBAAgB,IAAI,CAAC,GAAG,QAAQ,EAAE,MAAM,EAAE,GAAG,MAAM,CAElD;AAED,qFAAqF;AACrF,wBAAgB,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAI5C"}
package/dist/paths.js ADDED
@@ -0,0 +1,36 @@
1
+ /**
2
+ * POSIX path helpers for the virtual file system. Every path the runtime stores is
3
+ * absolute and normalised (`/src/App.tsx`), so comparisons are plain string equality.
4
+ */
5
+ /** Absolute, normalised: resolves `.`/`..`, collapses slashes, accepts backslashes. */
6
+ export function normalizePath(path) {
7
+ const parts = [];
8
+ for (const segment of path.replace(/\\/g, '/').split('/')) {
9
+ if (!segment || segment === '.')
10
+ continue;
11
+ if (segment === '..')
12
+ parts.pop();
13
+ else
14
+ parts.push(segment);
15
+ }
16
+ return '/' + parts.join('/');
17
+ }
18
+ export function dirname(path) {
19
+ const normalized = normalizePath(path);
20
+ const cut = normalized.lastIndexOf('/');
21
+ return cut <= 0 ? '/' : normalized.slice(0, cut);
22
+ }
23
+ export function basename(path) {
24
+ const normalized = normalizePath(path);
25
+ return normalized.slice(normalized.lastIndexOf('/') + 1);
26
+ }
27
+ export function join(...segments) {
28
+ return normalizePath(segments.join('/'));
29
+ }
30
+ /** Lower-cased extension including the dot (`.tsx`), or `''`. Dotfiles have none. */
31
+ export function extname(path) {
32
+ const base = basename(path);
33
+ const dot = base.lastIndexOf('.');
34
+ return dot <= 0 ? '' : base.slice(dot).toLowerCase();
35
+ }
36
+ //# sourceMappingURL=paths.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"paths.js","sourceRoot":"","sources":["../src/paths.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,uFAAuF;AACvF,MAAM,UAAU,aAAa,CAAC,IAAY;IACxC,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,KAAK,MAAM,OAAO,IAAI,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC;QAC1D,IAAI,CAAC,OAAO,IAAI,OAAO,KAAK,GAAG;YAAE,SAAS;QAC1C,IAAI,OAAO,KAAK,IAAI;YAAE,KAAK,CAAC,GAAG,EAAE,CAAC;;YAC7B,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IAC3B,CAAC;IACD,OAAO,GAAG,GAAG,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAC/B,CAAC;AAED,MAAM,UAAU,OAAO,CAAC,IAAY;IAClC,MAAM,UAAU,GAAG,aAAa,CAAC,IAAI,CAAC,CAAC;IACvC,MAAM,GAAG,GAAG,UAAU,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;IACxC,OAAO,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;AACnD,CAAC;AAED,MAAM,UAAU,QAAQ,CAAC,IAAY;IACnC,MAAM,UAAU,GAAG,aAAa,CAAC,IAAI,CAAC,CAAC;IACvC,OAAO,UAAU,CAAC,KAAK,CAAC,UAAU,CAAC,WAAW,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC;AAC3D,CAAC;AAED,MAAM,UAAU,IAAI,CAAC,GAAG,QAAkB;IACxC,OAAO,aAAa,CAAC,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;AAC3C,CAAC;AAED,qFAAqF;AACrF,MAAM,UAAU,OAAO,CAAC,IAAY;IAClC,MAAM,IAAI,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC;IAC5B,MAAM,GAAG,GAAG,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;IAClC,OAAO,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,WAAW,EAAE,CAAC;AACvD,CAAC"}
@@ -0,0 +1,36 @@
1
+ import type { VirtualFileSystem } from './vfs.js';
2
+ /**
3
+ * What the dev server needs to know about a project, read from its own files:
4
+ * dependency versions (for the package CDN), tsconfig path aliases and JSX mode,
5
+ * and `VITE_*` variables from `.env` files.
6
+ *
7
+ * Everything here is derived, so it is recomputed whenever one of
8
+ * {@link CONFIG_FILES} changes and is otherwise read from the cache.
9
+ */
10
+ export declare const CONFIG_FILES: readonly ["/package.json", "/tsconfig.json", "/jsconfig.json", "/.env", "/.env.local", "/.env.development", "/.env.development.local"];
11
+ export interface PathAlias {
12
+ /** The specifier prefix, without the trailing `*` (`@/`). Exact when `wildcard` is false. */
13
+ prefix: string;
14
+ wildcard: boolean;
15
+ /** Absolute VFS targets, without the trailing `*`, tried in order. */
16
+ targets: string[];
17
+ }
18
+ export interface ProjectConfig {
19
+ /** dependencies + devDependencies, name → version range. */
20
+ dependencies: Record<string, string>;
21
+ aliases: PathAlias[];
22
+ jsx: {
23
+ runtime: 'automatic' | 'classic';
24
+ importSource: string;
25
+ };
26
+ /** `VITE_*` and `NODE_ENV` style variables from the `.env` files, in load order. */
27
+ env: Record<string, string>;
28
+ }
29
+ /** JSON that tolerates the comments and trailing commas tsconfig files carry. */
30
+ export declare function parseLooseJson(text: string): unknown;
31
+ /** `KEY=value` lines; quotes stripped, `#` comments and blank lines ignored. */
32
+ export declare function parseDotenv(text: string): Record<string, string>;
33
+ export declare function readProjectConfig(fs: VirtualFileSystem): ProjectConfig;
34
+ /** True when a change to `path` invalidates the derived {@link ProjectConfig}. */
35
+ export declare function isConfigFile(path: string): boolean;
36
+ //# sourceMappingURL=projectConfig.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"projectConfig.d.ts","sourceRoot":"","sources":["../src/projectConfig.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,UAAU,CAAC;AAGlD;;;;;;;GAOG;AACH,eAAO,MAAM,YAAY,wIAQf,CAAC;AAEX,MAAM,WAAW,SAAS;IACxB,6FAA6F;IAC7F,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,OAAO,CAAC;IAClB,sEAAsE;IACtE,OAAO,EAAE,MAAM,EAAE,CAAC;CACnB;AAED,MAAM,WAAW,aAAa;IAC5B,4DAA4D;IAC5D,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACrC,OAAO,EAAE,SAAS,EAAE,CAAC;IACrB,GAAG,EAAE;QAAE,OAAO,EAAE,WAAW,GAAG,SAAS,CAAC;QAAC,YAAY,EAAE,MAAM,CAAA;KAAE,CAAC;IAChE,oFAAoF;IACpF,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAC7B;AAED,iFAAiF;AACjF,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAkBpD;AA0DD,gFAAgF;AAChF,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAehE;AAYD,wBAAgB,iBAAiB,CAAC,EAAE,EAAE,iBAAiB,GAAG,aAAa,CAQtE;AAED,kFAAkF;AAClF,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAElD"}
@@ -0,0 +1,155 @@
1
+ import { join, normalizePath } from './paths.js';
2
+ /**
3
+ * What the dev server needs to know about a project, read from its own files:
4
+ * dependency versions (for the package CDN), tsconfig path aliases and JSX mode,
5
+ * and `VITE_*` variables from `.env` files.
6
+ *
7
+ * Everything here is derived, so it is recomputed whenever one of
8
+ * {@link CONFIG_FILES} changes and is otherwise read from the cache.
9
+ */
10
+ export const CONFIG_FILES = [
11
+ '/package.json',
12
+ '/tsconfig.json',
13
+ '/jsconfig.json',
14
+ '/.env',
15
+ '/.env.local',
16
+ '/.env.development',
17
+ '/.env.development.local',
18
+ ];
19
+ /** JSON that tolerates the comments and trailing commas tsconfig files carry. */
20
+ export function parseLooseJson(text) {
21
+ let out = '';
22
+ let inString = false;
23
+ for (let i = 0; i < text.length; i++) {
24
+ const ch = text[i];
25
+ const next = text[i + 1];
26
+ if (inString) {
27
+ out += ch;
28
+ if (ch === '\\') {
29
+ out += next ?? '';
30
+ i++;
31
+ }
32
+ else if (ch === '"')
33
+ inString = false;
34
+ continue;
35
+ }
36
+ if (ch === '"') {
37
+ inString = true;
38
+ out += ch;
39
+ continue;
40
+ }
41
+ if (ch === '/' && next === '/') {
42
+ while (i < text.length && text[i] !== '\n')
43
+ i++;
44
+ out += '\n';
45
+ continue;
46
+ }
47
+ if (ch === '/' && next === '*') {
48
+ i += 2;
49
+ while (i < text.length && !(text[i] === '*' && text[i + 1] === '/'))
50
+ i++;
51
+ i++;
52
+ continue;
53
+ }
54
+ out += ch;
55
+ }
56
+ return JSON.parse(out.replace(/,(\s*[}\]])/g, '$1'));
57
+ }
58
+ function readJson(fs, path) {
59
+ const text = fs.readText(path);
60
+ if (text === undefined)
61
+ return undefined;
62
+ try {
63
+ const value = parseLooseJson(text);
64
+ return value && typeof value === 'object' ? value : undefined;
65
+ }
66
+ catch {
67
+ return undefined;
68
+ }
69
+ }
70
+ function asRecord(value) {
71
+ return value && typeof value === 'object' ? value : {};
72
+ }
73
+ function readDependencies(fs) {
74
+ const pkg = readJson(fs, '/package.json') ?? {};
75
+ const out = {};
76
+ for (const field of ['devDependencies', 'dependencies']) {
77
+ for (const [name, version] of Object.entries(asRecord(pkg[field]))) {
78
+ if (typeof version === 'string')
79
+ out[name] = version;
80
+ }
81
+ }
82
+ return out;
83
+ }
84
+ function readCompilerOptions(fs) {
85
+ const tsconfig = readJson(fs, '/tsconfig.json') ?? readJson(fs, '/jsconfig.json') ?? {};
86
+ return asRecord(tsconfig.compilerOptions);
87
+ }
88
+ function readAliases(options) {
89
+ const baseUrl = typeof options.baseUrl === 'string' ? options.baseUrl : '.';
90
+ const aliases = [];
91
+ for (const [pattern, rawTargets] of Object.entries(asRecord(options.paths))) {
92
+ if (!Array.isArray(rawTargets))
93
+ continue;
94
+ const wildcard = pattern.endsWith('*');
95
+ const targets = rawTargets
96
+ .filter((t) => typeof t === 'string')
97
+ .map((t) => {
98
+ const stripped = wildcard ? t.replace(/\*$/, '') : t;
99
+ const resolved = join('/', baseUrl, stripped);
100
+ return stripped.endsWith('/') && resolved !== '/' ? resolved + '/' : resolved;
101
+ });
102
+ aliases.push({ prefix: wildcard ? pattern.slice(0, -1) : pattern, wildcard, targets });
103
+ }
104
+ // Longest prefix first, so `@/components/*` wins over `@/*`.
105
+ return aliases.sort((a, b) => b.prefix.length - a.prefix.length);
106
+ }
107
+ function readJsx(options) {
108
+ const importSource = typeof options.jsxImportSource === 'string' ? options.jsxImportSource : 'react';
109
+ const runtime = options.jsx === 'react' ? 'classic' : 'automatic';
110
+ return { runtime, importSource };
111
+ }
112
+ /** `KEY=value` lines; quotes stripped, `#` comments and blank lines ignored. */
113
+ export function parseDotenv(text) {
114
+ const out = {};
115
+ for (const raw of text.split(/\r?\n/)) {
116
+ const line = raw.trim();
117
+ if (!line || line.startsWith('#'))
118
+ continue;
119
+ const eq = line.indexOf('=');
120
+ if (eq <= 0)
121
+ continue;
122
+ const key = line.slice(0, eq).replace(/^export\s+/, '').trim();
123
+ let value = line.slice(eq + 1).trim();
124
+ if ((value.startsWith('"') && value.endsWith('"')) || (value.startsWith("'") && value.endsWith("'"))) {
125
+ value = value.slice(1, -1);
126
+ }
127
+ out[key] = value;
128
+ }
129
+ return out;
130
+ }
131
+ function readEnv(fs) {
132
+ const env = {};
133
+ for (const file of CONFIG_FILES) {
134
+ if (!file.startsWith('/.env'))
135
+ continue;
136
+ const text = fs.readText(file);
137
+ if (text !== undefined)
138
+ Object.assign(env, parseDotenv(text));
139
+ }
140
+ return env;
141
+ }
142
+ export function readProjectConfig(fs) {
143
+ const options = readCompilerOptions(fs);
144
+ return {
145
+ dependencies: readDependencies(fs),
146
+ aliases: readAliases(options),
147
+ jsx: readJsx(options),
148
+ env: readEnv(fs),
149
+ };
150
+ }
151
+ /** True when a change to `path` invalidates the derived {@link ProjectConfig}. */
152
+ export function isConfigFile(path) {
153
+ return CONFIG_FILES.includes(normalizePath(path));
154
+ }
155
+ //# sourceMappingURL=projectConfig.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"projectConfig.js","sourceRoot":"","sources":["../src/projectConfig.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,19 @@
1
+ import type { VirtualFileSystem } from './vfs.js';
2
+ import type { PathAlias } from './projectConfig.js';
3
+ /** Extensions probed, in order, for an extension-less import — Vite's default order. */
4
+ export declare const RESOLVE_EXTENSIONS: readonly [".tsx", ".ts", ".jsx", ".js", ".mjs", ".cjs", ".json", ".css"];
5
+ /** `foo`, `@scope/foo`, `foo/sub` — not relative, not absolute, not a URL. */
6
+ export declare function isBareSpecifier(specifier: string): boolean;
7
+ /** Split a bare specifier into its package name and subpath (`/client`, or `''`). */
8
+ export declare function splitPackageSpecifier(specifier: string): {
9
+ name: string;
10
+ subpath: string;
11
+ };
12
+ /** Resolve a relative or absolute specifier against the importing file's directory. */
13
+ export declare function resolveLocal(fs: VirtualFileSystem, fromDir: string, specifier: string): string | undefined;
14
+ /**
15
+ * Resolve a specifier through tsconfig `paths` (`@/components/Button` →
16
+ * `/src/components/Button.tsx`). Undefined when no alias matches or no target exists.
17
+ */
18
+ export declare function resolveAlias(fs: VirtualFileSystem, aliases: readonly PathAlias[], specifier: string): string | undefined;
19
+ //# sourceMappingURL=resolve.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resolve.d.ts","sourceRoot":"","sources":["../src/resolve.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,UAAU,CAAC;AAClD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAGpD,wFAAwF;AACxF,eAAO,MAAM,kBAAkB,0EAA2E,CAAC;AAE3G,8EAA8E;AAC9E,wBAAgB,eAAe,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAG1D;AAED,qFAAqF;AACrF,wBAAgB,qBAAqB,CAAC,SAAS,EAAE,MAAM,GAAG;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAI1F;AAoBD,uFAAuF;AACvF,wBAAgB,YAAY,CAAC,EAAE,EAAE,iBAAiB,EAAE,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAG1G;AAED;;;GAGG;AACH,wBAAgB,YAAY,CAAC,EAAE,EAAE,iBAAiB,EAAE,OAAO,EAAE,SAAS,SAAS,EAAE,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAWxH"}
@@ -0,0 +1,62 @@
1
+ import { extname, join, normalizePath } from './paths.js';
2
+ /** Extensions probed, in order, for an extension-less import — Vite's default order. */
3
+ export const RESOLVE_EXTENSIONS = ['.tsx', '.ts', '.jsx', '.js', '.mjs', '.cjs', '.json', '.css'];
4
+ /** `foo`, `@scope/foo`, `foo/sub` — not relative, not absolute, not a URL. */
5
+ export function isBareSpecifier(specifier) {
6
+ if (specifier.startsWith('.') || specifier.startsWith('/'))
7
+ return false;
8
+ return !/^[a-z][a-z0-9+.-]*:/i.test(specifier);
9
+ }
10
+ /** Split a bare specifier into its package name and subpath (`/client`, or `''`). */
11
+ export function splitPackageSpecifier(specifier) {
12
+ const parts = specifier.split('/');
13
+ const take = specifier.startsWith('@') ? 2 : 1;
14
+ return { name: parts.slice(0, take).join('/'), subpath: parts.length > take ? '/' + parts.slice(take).join('/') : '' };
15
+ }
16
+ function probe(fs, base) {
17
+ if (fs.isFile(base))
18
+ return base;
19
+ for (const ext of RESOLVE_EXTENSIONS)
20
+ if (fs.isFile(base + ext))
21
+ return base + ext;
22
+ // TypeScript ESM convention: `./util.js` written in source names `util.ts`.
23
+ const ext = extname(base);
24
+ if (ext === '.js' || ext === '.jsx' || ext === '.mjs') {
25
+ const stem = base.slice(0, -ext.length);
26
+ for (const alt of ['.ts', '.tsx'])
27
+ if (fs.isFile(stem + alt))
28
+ return stem + alt;
29
+ }
30
+ if (fs.isDirectory(base)) {
31
+ for (const ext2 of RESOLVE_EXTENSIONS) {
32
+ const index = join(base, 'index' + ext2);
33
+ if (fs.isFile(index))
34
+ return index;
35
+ }
36
+ }
37
+ return undefined;
38
+ }
39
+ /** Resolve a relative or absolute specifier against the importing file's directory. */
40
+ export function resolveLocal(fs, fromDir, specifier) {
41
+ const base = specifier.startsWith('/') ? normalizePath(specifier) : join(fromDir, specifier);
42
+ return probe(fs, base);
43
+ }
44
+ /**
45
+ * Resolve a specifier through tsconfig `paths` (`@/components/Button` →
46
+ * `/src/components/Button.tsx`). Undefined when no alias matches or no target exists.
47
+ */
48
+ export function resolveAlias(fs, aliases, specifier) {
49
+ for (const alias of aliases) {
50
+ const matches = alias.wildcard ? specifier.startsWith(alias.prefix) : specifier === alias.prefix;
51
+ if (!matches)
52
+ continue;
53
+ const rest = alias.wildcard ? specifier.slice(alias.prefix.length) : '';
54
+ for (const target of alias.targets) {
55
+ const hit = probe(fs, normalizePath(target + rest));
56
+ if (hit)
57
+ return hit;
58
+ }
59
+ }
60
+ return undefined;
61
+ }
62
+ //# sourceMappingURL=resolve.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resolve.js","sourceRoot":"","sources":["../src/resolve.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ /**
2
+ * Rewrite every import specifier in an ES module — static `import`/`export … from`,
3
+ * side-effect `import 'x'`, and string-literal dynamic `import('x')` — through
4
+ * `map`. A `map` result of `undefined` leaves that specifier untouched, as are
5
+ * non-literal dynamic imports and `import.meta`.
6
+ *
7
+ * Positions come from es-module-lexer rather than a regex, so specifiers inside
8
+ * strings, comments and template literals are never touched.
9
+ */
10
+ export declare function rewriteImports(code: string, map: (specifier: string) => string | undefined): Promise<string>;
11
+ //# sourceMappingURL=rewriteImports.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rewriteImports.d.ts","sourceRoot":"","sources":["../src/rewriteImports.ts"],"names":[],"mappings":"AAEA;;;;;;;;GAQG;AACH,wBAAsB,cAAc,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,MAAM,GAAG,SAAS,GAAG,OAAO,CAAC,MAAM,CAAC,CAclH"}
@@ -0,0 +1,28 @@
1
+ import { init, parse } from 'es-module-lexer';
2
+ /**
3
+ * Rewrite every import specifier in an ES module — static `import`/`export … from`,
4
+ * side-effect `import 'x'`, and string-literal dynamic `import('x')` — through
5
+ * `map`. A `map` result of `undefined` leaves that specifier untouched, as are
6
+ * non-literal dynamic imports and `import.meta`.
7
+ *
8
+ * Positions come from es-module-lexer rather than a regex, so specifiers inside
9
+ * strings, comments and template literals are never touched.
10
+ */
11
+ export async function rewriteImports(code, map) {
12
+ await init;
13
+ const [imports] = parse(code);
14
+ let out = '';
15
+ let cursor = 0;
16
+ for (const entry of imports) {
17
+ if (entry.d === -2 || entry.n === undefined)
18
+ continue; // import.meta, or a non-literal dynamic import
19
+ const replacement = map(entry.n);
20
+ if (replacement === undefined || replacement === entry.n)
21
+ continue;
22
+ const dynamic = entry.d > -1;
23
+ out += code.slice(cursor, entry.s) + (dynamic ? JSON.stringify(replacement) : replacement);
24
+ cursor = entry.e;
25
+ }
26
+ return out + code.slice(cursor);
27
+ }
28
+ //# sourceMappingURL=rewriteImports.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rewriteImports.js","sourceRoot":"","sources":["../src/rewriteImports.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,iBAAiB,CAAC;AAE9C;;;;;;;;GAQG;AACH,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,IAAY,EAAE,GAA8C;IAC/F,MAAM,IAAI,CAAC;IACX,MAAM,CAAC,OAAO,CAAC,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC;IAC9B,IAAI,GAAG,GAAG,EAAE,CAAC;IACb,IAAI,MAAM,GAAG,CAAC,CAAC;IACf,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;QAC5B,IAAI,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,KAAK,SAAS;YAAE,SAAS,CAAC,+CAA+C;QACtG,MAAM,WAAW,GAAG,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;QACjC,IAAI,WAAW,KAAK,SAAS,IAAI,WAAW,KAAK,KAAK,CAAC,CAAC;YAAE,SAAS;QACnE,MAAM,OAAO,GAAG,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;QAC7B,GAAG,IAAI,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC;QAC3F,MAAM,GAAG,KAAK,CAAC,CAAC,CAAC;IACnB,CAAC;IACD,OAAO,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;AAClC,CAAC"}
@@ -0,0 +1,12 @@
1
+ import type { VirtualFileSystem } from './vfs.js';
2
+ export declare function rewriteCssUrls(fs: VirtualFileSystem, cssPath: string, css: string, base: string): string;
3
+ /**
4
+ * The JS module for an imported stylesheet. `.module.css` exports an identity map
5
+ * (class name → itself): real scoping needs the build API, so for now CSS Modules
6
+ * render correctly as long as class names don't collide.
7
+ */
8
+ export declare function cssToModule(path: string, css: string): string;
9
+ export declare function jsonToModule(text: string): string;
10
+ export declare function rawToModule(text: string): string;
11
+ export declare function urlToModule(url: string): string;
12
+ //# sourceMappingURL=styleModules.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"styleModules.d.ts","sourceRoot":"","sources":["../src/styleModules.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,UAAU,CAAC;AAclD,wBAAgB,cAAc,CAAC,EAAE,EAAE,iBAAiB,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,CASxG;AAED;;;;GAIG;AACH,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,CAY7D;AAED,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAIjD;AAED,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAEhD;AAED,wBAAgB,WAAW,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAE/C"}
@@ -0,0 +1,53 @@
1
+ import { dirname } from './paths.js';
2
+ import { resolveLocal } from './resolve.js';
3
+ /**
4
+ * CSS handling. A stylesheet imported from JS is served as a JS module that
5
+ * injects a <style> tag (keyed by path, so a re-import replaces rather than
6
+ * duplicates). Its relative `url(...)` references are rewritten to absolute
7
+ * preview URLs, because once the text lives in a <style> tag the browser resolves
8
+ * them against the DOCUMENT, not the stylesheet's own location.
9
+ */
10
+ const URL_REF = /url\(\s*(['"]?)([^'")]+)\1\s*\)/g;
11
+ export function rewriteCssUrls(fs, cssPath, css, base) {
12
+ return css.replace(URL_REF, (match, quote, ref) => {
13
+ if (/^(data:|https?:|\/\/|#)/i.test(ref))
14
+ return match;
15
+ const [pathPart] = ref.split(/[?#]/);
16
+ if (!pathPart)
17
+ return match;
18
+ const resolved = resolveLocal(fs, dirname(cssPath), pathPart);
19
+ if (!resolved)
20
+ return match;
21
+ return `url(${quote}${base}${resolved.slice(1)}${ref.slice(pathPart.length)}${quote})`;
22
+ });
23
+ }
24
+ /**
25
+ * The JS module for an imported stylesheet. `.module.css` exports an identity map
26
+ * (class name → itself): real scoping needs the build API, so for now CSS Modules
27
+ * render correctly as long as class names don't collide.
28
+ */
29
+ export function cssToModule(path, css) {
30
+ const id = JSON.stringify(path);
31
+ const exportsCssModule = /\.module\.css$/i.test(path);
32
+ return [
33
+ `const css = ${JSON.stringify(css)};`,
34
+ `let el = document.querySelector('style[data-bfwc=' + JSON.stringify(${id}) + ']');`,
35
+ `if (!el) { el = document.createElement('style'); el.setAttribute('data-bfwc', ${id}); document.head.appendChild(el); }`,
36
+ `el.textContent = css;`,
37
+ exportsCssModule
38
+ ? `export default new Proxy({}, { get: (_, key) => typeof key === 'string' ? key : undefined });`
39
+ : `export default css;`,
40
+ ].join('\n');
41
+ }
42
+ export function jsonToModule(text) {
43
+ // Round-trip so a malformed file fails here with a clear message, not as a
44
+ // syntax error inside generated code.
45
+ return `export default ${JSON.stringify(JSON.parse(text))};`;
46
+ }
47
+ export function rawToModule(text) {
48
+ return `export default ${JSON.stringify(text)};`;
49
+ }
50
+ export function urlToModule(url) {
51
+ return `export default ${JSON.stringify(url)};`;
52
+ }
53
+ //# sourceMappingURL=styleModules.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"styleModules.js","sourceRoot":"","sources":["../src/styleModules.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;AACrC,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAE5C;;;;;;GAMG;AAEH,MAAM,OAAO,GAAG,kCAAkC,CAAC;AAEnD,MAAM,UAAU,cAAc,CAAC,EAAqB,EAAE,OAAe,EAAE,GAAW,EAAE,IAAY;IAC9F,OAAO,GAAG,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC,KAAK,EAAE,KAAa,EAAE,GAAW,EAAE,EAAE;QAChE,IAAI,0BAA0B,CAAC,IAAI,CAAC,GAAG,CAAC;YAAE,OAAO,KAAK,CAAC;QACvD,MAAM,CAAC,QAAQ,CAAC,GAAG,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;QACrC,IAAI,CAAC,QAAQ;YAAE,OAAO,KAAK,CAAC;QAC5B,MAAM,QAAQ,GAAG,YAAY,CAAC,EAAE,EAAE,OAAO,CAAC,OAAO,CAAC,EAAE,QAAQ,CAAC,CAAC;QAC9D,IAAI,CAAC,QAAQ;YAAE,OAAO,KAAK,CAAC;QAC5B,OAAO,OAAO,KAAK,GAAG,IAAI,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC,GAAG,KAAK,GAAG,CAAC;IACzF,CAAC,CAAC,CAAC;AACL,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,WAAW,CAAC,IAAY,EAAE,GAAW;IACnD,MAAM,EAAE,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;IAChC,MAAM,gBAAgB,GAAG,iBAAiB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACtD,OAAO;QACL,eAAe,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,GAAG;QACrC,uEAAuE,EAAE,WAAW;QACpF,iFAAiF,EAAE,qCAAqC;QACxH,uBAAuB;QACvB,gBAAgB;YACd,CAAC,CAAC,+FAA+F;YACjG,CAAC,CAAC,qBAAqB;KAC1B,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACf,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,IAAY;IACvC,2EAA2E;IAC3E,sCAAsC;IACtC,OAAO,kBAAkB,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC;AAC/D,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,IAAY;IACtC,OAAO,kBAAkB,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,GAAG,CAAC;AACnD,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,GAAW;IACrC,OAAO,kBAAkB,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,GAAG,CAAC;AAClD,CAAC"}