* Clean code: remove Vite/Vue noise, rewrite to vendor
(code: string)
| 891 | * Clean code: remove Vite/Vue noise, rewrite to vendor |
| 892 | */ |
| 893 | function cleanCode(code: string): string { |
| 894 | let result = code; |
| 895 | |
| 896 | // Remove Vite client and hot module noise |
| 897 | result = result.replace(PAT.VITE_CLIENT_IMPORT, ''); |
| 898 | result = result.replace(PAT.IMPORT_META_HOT_ASSIGNMENT, ''); |
| 899 | // Keep import.meta.hot call sites; runtime now provides a stable import.meta.hot. |
| 900 | |
| 901 | result = ACTIVE_STRATEGY.preClean(result); |
| 902 | result = ACTIVE_STRATEGY.rewriteFrameworkImports(result); |
| 903 | |
| 904 | // Vendor manifest-driven import rewrites |
| 905 | try { |
| 906 | const manifest = getVendorManifest(); |
| 907 | if (manifest) { |
| 908 | // Pattern: capture full import statement (static) with optional bindings |
| 909 | // import X from 'pkg'; | import {a,b as c} from "pkg"; | import * as ns from 'pkg'; |
| 910 | const staticImportRE = /(import\s+([^;]*?)\s+from\s*["'])([^"']+)(["'];?)/g; |
| 911 | result = result.replace(staticImportRE, (full, pre, bindings, spec, post) => { |
| 912 | // Do not vendor-rewrite @nativescript/core — handled by the unified HTTP bridge later |
| 913 | if (isNativeScriptCoreModule(spec)) return full; |
| 914 | const resolved = resolveVendorSpecifier(spec); |
| 915 | if (!resolved || /^@nativescript\/core(\b|\/)/i.test(resolved)) return full; // not vendor or is core |
| 916 | // Determine binding style |
| 917 | const trimmed = (bindings || '').trim(); |
| 918 | let injected = ''; |
| 919 | if (!trimmed || trimmed === '') { |
| 920 | // Side-effect import: import 'pkg'; -> we drop it (vendor already evaluated) |
| 921 | return `/* vendor side-effect dropped: ${spec} */`; |
| 922 | } |
| 923 | // Default + named or default only |
| 924 | // Examples of trimmed: |
| 925 | // defaultExport |
| 926 | // { a, b as c } |
| 927 | // * as ns |
| 928 | // defaultExport, { a, b } |
| 929 | const globalAccessor = `globalThis.__nsVendor && globalThis.__nsVendor(${JSON.stringify(resolved)})`; |
| 930 | const ensureHelper = `globalThis.__nsVendor=require? (globalThis.__nsVendor|| (globalThis.__nsVendor=(id)=>{const m=(globalThis.__NS_VENDOR_MANIFEST__?globalThis.__NS_VENDOR_MANIFEST__.modules[id]:null);return (globalThis.__nsModules && globalThis.__nsModules.get? (globalThis.__nsModules.get(id)||globalThis.__nsModules.get(m?.id||id)):undefined);})):globalThis.__nsVendor`; |
| 931 | if (trimmed.startsWith('{')) { |
| 932 | // Named only |
| 933 | injected = `${ensureHelper}; const ${trimmed} = ${globalAccessor} || {};`; |
| 934 | } else if (trimmed.startsWith('*')) { |
| 935 | // Namespace import: * as ns |
| 936 | const m = /\*\s+as\s+(\w+)/.exec(trimmed); |
| 937 | if (m) { |
| 938 | injected = `${ensureHelper}; const ${m[1]} = ${globalAccessor} || {};`; |
| 939 | } |
| 940 | } else if (trimmed.includes(',')) { |
| 941 | // default plus named |
| 942 | const parts = trimmed.split(','); |
| 943 | const def = parts[0].trim(); |
| 944 | const named = parts.slice(1).join(',').trim(); |
| 945 | injected = `${ensureHelper}; const __vmod = ${globalAccessor} || {}; const ${def} = __vmod.default || __vmod; const ${named} = __vmod;`; |
| 946 | } else { |
| 947 | // default only |
| 948 | injected = `${ensureHelper}; const ${trimmed} = (${globalAccessor}||{}).default || ${globalAccessor};`; |
| 949 | } |
| 950 | return injected; |
no test coverage detected