@shardev/vite-plugin-modular 1.2.1 → 1.2.2
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/index.cjs +11 -7
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +11 -7
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/dist/index.cjs
CHANGED
|
@@ -64,9 +64,10 @@ function laravelModule(options) {
|
|
|
64
64
|
normalizedInput[key] = import_path.default.resolve(moduleRoot, srcDir, file);
|
|
65
65
|
});
|
|
66
66
|
}
|
|
67
|
-
const
|
|
68
|
-
const
|
|
69
|
-
const
|
|
67
|
+
const absoluteSrcDir = import_path.default.resolve(moduleRoot, srcDir);
|
|
68
|
+
const absolutePublishedDir = import_path.default.resolve(root, publishedDir);
|
|
69
|
+
const isPublished = import_fs.default.existsSync(absolutePublishedDir);
|
|
70
|
+
const aliasPath = isPublished ? absolutePublishedDir : absoluteSrcDir;
|
|
70
71
|
const meta = {
|
|
71
72
|
name,
|
|
72
73
|
input: normalizedInput,
|
|
@@ -74,7 +75,9 @@ function laravelModule(options) {
|
|
|
74
75
|
alias: {
|
|
75
76
|
[`@${vendor}/${name}`]: aliasPath
|
|
76
77
|
},
|
|
77
|
-
usePublished: isPublished
|
|
78
|
+
usePublished: isPublished,
|
|
79
|
+
srcDir: absoluteSrcDir,
|
|
80
|
+
publishedDir: absolutePublishedDir
|
|
78
81
|
};
|
|
79
82
|
return {
|
|
80
83
|
name: `vite-plugin-laravel-module:${name}`,
|
|
@@ -184,9 +187,10 @@ function laravelModules(options = {}) {
|
|
|
184
187
|
return inputs;
|
|
185
188
|
};
|
|
186
189
|
const resolveWatchPath = (meta) => {
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
+
if (meta.usePublished && meta.publishedDir) {
|
|
191
|
+
return meta.publishedDir;
|
|
192
|
+
}
|
|
193
|
+
return meta.srcDir ?? null;
|
|
190
194
|
};
|
|
191
195
|
const handleHMR = (server, file) => {
|
|
192
196
|
const module2 = server.moduleGraph.getModuleById(file);
|
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts","../src/laravelModule.ts","../src/laravelModules.ts"],"sourcesContent":["export { laravelModule } from './laravelModule'\r\nexport { laravelModules } from './laravelModules'","import fs from 'fs'\nimport path from 'path'\nimport type { PluginOption } from 'vite'\n\nexport interface ModuleOptions {\n name: string\n vendor?: string\n srcDir?: string\n\n // ✅ Nuevo formato recomendado\n input?: Record<string, string>\n\n // ⚠ Backward compatibility\n inputs?: string[]\n\n buildDir?: string\n publishedDir?: string\n}\n\nexport interface ShardevModuleMeta {\n name: string\n input: Record<string, string>\n buildDir: string\n alias: Record<string, string>\n usePublished: boolean\n}\n\nexport function laravelModule(options: ModuleOptions): PluginOption {\n\n const {\n name,\n vendor = 'shardevcom',\n srcDir = 'resources/react/src',\n input,\n inputs,\n buildDir = `build/${vendor}/${name}`,\n publishedDir = `resources/react/${vendor}/${name}`\n } = options\n\n const root = process.cwd()\n const moduleRoot = path.resolve(root, 'packages', vendor, name)\n\n const relative = path.relative(moduleRoot, root)\n const isModuleRoot =\n !relative || relative === '.' || !relative.startsWith('..')\n\n // ---------------------------------------------------\n // 🔥 Normalización inteligente de inputs\n // ---------------------------------------------------\n\n let normalizedInput: Record<string, string> = {}\n\n if (input && Object.keys(input).length > 0) {\n // Nuevo formato recomendado\n for (const [key, file] of Object.entries(input)) {\n normalizedInput[key] = path.resolve(moduleRoot, file)\n }\n } else {\n // Backward compatibility con inputs: []\n const legacyInputs = inputs ?? ['main.tsx']\n\n legacyInputs.forEach(file => {\n const key = path.parse(file).name\n normalizedInput[key] = path.resolve(moduleRoot, srcDir, file)\n })\n }\n\n // ---------------------------------------------------\n // Published detection\n // ---------------------------------------------------\n\n const publishedPath = path.resolve(root, publishedDir)\n const isPublished = fs.existsSync(publishedPath)\n\n const aliasPath = isPublished\n ? publishedPath\n : path.resolve(moduleRoot, srcDir)\n\n const meta: ShardevModuleMeta = {\n name,\n input: normalizedInput,\n buildDir,\n alias: {\n [`@${vendor}/${name}`]: aliasPath\n },\n usePublished: isPublished\n }\n\n return {\n name: `vite-plugin-laravel-module:${name}`,\n\n // 🔥 Metadata consumida por laravelModules()\n shardevMeta: meta,\n\n config() {\n\n // 🔹 Standalone build\n if (isModuleRoot) {\n return {\n build: {\n outDir: buildDir,\n emptyOutDir: true,\n rollupOptions: {\n input: normalizedInput\n }\n },\n resolve: {\n alias: meta.alias\n }\n }\n }\n\n // 🔹 Integrated mode\n return {\n resolve: {\n alias: meta.alias\n }\n }\n }\n\n } as PluginOption\n}","import type { Plugin, UserConfig, ConfigEnv, ViteDevServer, ModuleNode } from 'vite'\nimport { mergeConfig, createServer } from 'vite'\nimport path from 'path'\nimport fs from 'fs'\n\ninterface LaravelModulesOptions {\n modulesDir?: string\n statusesFile?: string\n debug?: boolean\n useMetaCache?: boolean\n}\n\ninterface ShardevModuleMeta {\n name: string\n input: Record<string, string>\n buildDir: string\n alias: Record<string, string>\n usePublished: boolean\n srcDir: string\n publishedDir?: string\n}\n\nexport function laravelModules(\n options: LaravelModulesOptions = {}\n): Plugin {\n\n const {\n modulesDir = 'packages',\n statusesFile = 'modules.json',\n debug = false,\n useMetaCache = true\n } = options\n\n const root = process.cwd()\n const modulesPath = path.resolve(root, modulesDir)\n const statusesPath = path.resolve(root, statusesFile)\n\n let cachedMetas: ShardevModuleMeta[] = []\n let metaCacheLoaded = false\n\n const log = (...args: any[]) => {\n if (debug) console.log('[laravel-modules]', ...args)\n }\n\n const loadStatuses = (): Record<string, boolean> => {\n if (!fs.existsSync(statusesPath)) return {}\n try {\n return JSON.parse(fs.readFileSync(statusesPath, 'utf-8'))\n } catch {\n return {}\n }\n }\n\n const validateMeta = (meta: ShardevModuleMeta) => {\n if (!meta.name) throw new Error('Module meta missing name')\n if (!meta.srcDir) throw new Error(`Module ${meta.name} missing srcDir`)\n if (!meta.input) throw new Error(`Module ${meta.name} missing input`)\n }\n\n const discoverModules = async (): Promise<ShardevModuleMeta[]> => {\n\n if (useMetaCache && metaCacheLoaded) {\n log('Using cached module metas')\n return cachedMetas\n }\n\n if (!fs.existsSync(modulesPath)) return []\n\n const statuses = loadStatuses()\n const metas: ShardevModuleMeta[] = []\n\n const vendors = fs.readdirSync(modulesPath, { withFileTypes: true })\n .filter(d => d.isDirectory())\n\n for (const vendor of vendors) {\n const vendorPath = path.join(modulesPath, vendor.name)\n\n const packages = fs.readdirSync(vendorPath, { withFileTypes: true })\n .filter(d => d.isDirectory() && statuses[d.name] !== false)\n\n for (const pkg of packages) {\n\n const pkgPath = path.join(vendorPath, pkg.name)\n const viteConfigPath = path.join(pkgPath, 'vite.config.ts')\n\n if (!fs.existsSync(viteConfigPath)) continue\n\n const server = await createServer({\n configFile: viteConfigPath,\n logLevel: 'silent'\n })\n\n const plugins = (server.config.plugins || []) as Plugin[]\n\n for (const plugin of plugins) {\n if (plugin?.name?.startsWith('vite-plugin-laravel-module:')) {\n const meta = (plugin as any).shardevMeta as ShardevModuleMeta\n if (meta) {\n validateMeta(meta)\n metas.push(meta)\n }\n }\n }\n\n await server.close()\n }\n }\n\n cachedMetas = metas\n metaCacheLoaded = true\n\n log('Discovered modules:', metas.map(m => m.name))\n\n return metas\n }\n\n const generateInputs = (metas: ShardevModuleMeta[]) => {\n const inputs: Record<string, string> = {}\n metas.forEach(meta => {\n Object.entries(meta.input).forEach(([key, value]) => {\n inputs[`${meta.name}-${key}`] = value\n })\n })\n return inputs\n }\n\n const resolveWatchPath = (meta: ShardevModuleMeta): string | null => {\n const base = meta.usePublished && meta.publishedDir\n ? meta.publishedDir\n : meta.srcDir\n\n if (!base) return null\n\n return path.isAbsolute(base)\n ? base\n : path.resolve(root, base)\n }\n\n const handleHMR = (\n server: ViteDevServer,\n file: string\n ) => {\n\n const module = server.moduleGraph.getModuleById(file)\n\n if (!module) return\n\n log('HMR update:', file)\n\n const updates = [{\n type: 'js-update',\n path: module.url,\n acceptedPath: module.url,\n timestamp: Date.now()\n }]\n\n server.moduleGraph.invalidateModule(module)\n\n server.ws.send({\n type: 'update',\n updates\n })\n }\n\n return {\n name: 'laravel-modules',\n\n async config(config: UserConfig, env: ConfigEnv) {\n\n const metas = await discoverModules()\n\n const aliases: Record<string, string> = {}\n metas.forEach(meta => Object.assign(aliases, meta.alias))\n\n const rollupInputs = generateInputs(metas)\n\n return mergeConfig(config, {\n resolve: { alias: aliases },\n build: {\n rollupOptions: { input: rollupInputs }\n }\n })\n },\n\n async configureServer(server: ViteDevServer) {\n\n const metas = await discoverModules()\n\n for (const meta of metas) {\n const watchPath = resolveWatchPath(meta)\n if (watchPath && fs.existsSync(watchPath)) {\n server.watcher.add(watchPath)\n log('Watching:', watchPath)\n }\n }\n\n server.watcher.on('change', (file) => {\n\n const matched = metas.some(meta => {\n const watchPath = resolveWatchPath(meta)\n return watchPath && file.startsWith(watchPath)\n })\n\n if (!matched) return\n\n handleHMR(server, file)\n })\n }\n }\n}"],"mappings":"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","names":["path","fs","import_path","import_fs","path","fs","module"]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/laravelModule.ts","../src/laravelModules.ts"],"sourcesContent":["export { laravelModule } from './laravelModule'\r\nexport { laravelModules } from './laravelModules'","import fs from 'fs'\nimport path from 'path'\nimport type { PluginOption } from 'vite'\n\nexport interface ModuleOptions {\n name: string\n vendor?: string\n srcDir?: string\n\n // ✅ Nuevo formato recomendado\n input?: Record<string, string>\n\n // ⚠ Backward compatibility\n inputs?: string[]\n\n buildDir?: string\n publishedDir?: string\n}\n\ninterface ShardevModuleMeta {\n name: string\n input: Record<string, string>\n buildDir: string\n alias: Record<string, string>\n usePublished: boolean\n srcDir: string\n publishedDir?: string\n}\n\nexport function laravelModule(options: ModuleOptions): PluginOption {\n\n const {\n name,\n vendor = 'shardevcom',\n srcDir = 'resources/react/src',\n input,\n inputs,\n buildDir = `build/${vendor}/${name}`,\n publishedDir = `resources/react/${vendor}/${name}`\n } = options\n\n const root = process.cwd()\n const moduleRoot = path.resolve(root, 'packages', vendor, name)\n\n const relative = path.relative(moduleRoot, root)\n const isModuleRoot =\n !relative || relative === '.' || !relative.startsWith('..')\n\n // ---------------------------------------------------\n // 🔥 Normalización inteligente de inputs\n // ---------------------------------------------------\n\n let normalizedInput: Record<string, string> = {}\n\n if (input && Object.keys(input).length > 0) {\n // Nuevo formato recomendado\n for (const [key, file] of Object.entries(input)) {\n normalizedInput[key] = path.resolve(moduleRoot, file)\n }\n } else {\n // Backward compatibility con inputs: []\n const legacyInputs = inputs ?? ['main.tsx']\n\n legacyInputs.forEach(file => {\n const key = path.parse(file).name\n normalizedInput[key] = path.resolve(moduleRoot, srcDir, file)\n })\n }\n\n // ---------------------------------------------------\n // Published detection\n // ---------------------------------------------------\n const absoluteSrcDir = path.resolve(moduleRoot, srcDir)\n const absolutePublishedDir = path.resolve(root, publishedDir)\n\n const isPublished = fs.existsSync(absolutePublishedDir)\n\n const aliasPath = isPublished\n ? absolutePublishedDir\n : absoluteSrcDir\n\n const meta: ShardevModuleMeta = {\n name,\n input: normalizedInput,\n buildDir,\n alias: {\n [`@${vendor}/${name}`]: aliasPath\n },\n usePublished: isPublished,\n srcDir: absoluteSrcDir,\n publishedDir: absolutePublishedDir\n }\n\n return {\n name: `vite-plugin-laravel-module:${name}`,\n\n // 🔥 Metadata consumida por laravelModules()\n shardevMeta: meta,\n\n config() {\n\n // 🔹 Standalone build\n if (isModuleRoot) {\n return {\n build: {\n outDir: buildDir,\n emptyOutDir: true,\n rollupOptions: {\n input: normalizedInput\n }\n },\n resolve: {\n alias: meta.alias\n }\n }\n }\n\n // 🔹 Integrated mode\n return {\n resolve: {\n alias: meta.alias\n }\n }\n }\n\n } as PluginOption\n}","import type { Plugin, UserConfig, ConfigEnv, ViteDevServer, ModuleNode } from 'vite'\nimport { mergeConfig, createServer } from 'vite'\nimport path from 'path'\nimport fs from 'fs'\n\ninterface LaravelModulesOptions {\n modulesDir?: string\n statusesFile?: string\n debug?: boolean\n useMetaCache?: boolean\n}\n\ninterface ShardevModuleMeta {\n name: string\n input: Record<string, string>\n buildDir: string\n alias: Record<string, string>\n usePublished: boolean\n srcDir: string\n publishedDir?: string\n}\n\nexport function laravelModules(\n options: LaravelModulesOptions = {}\n): Plugin {\n\n const {\n modulesDir = 'packages',\n statusesFile = 'modules.json',\n debug = false,\n useMetaCache = true\n } = options\n\n const root = process.cwd()\n const modulesPath = path.resolve(root, modulesDir)\n const statusesPath = path.resolve(root, statusesFile)\n\n let cachedMetas: ShardevModuleMeta[] = []\n let metaCacheLoaded = false\n\n const log = (...args: any[]) => {\n if (debug) console.log('[laravel-modules]', ...args)\n }\n\n const loadStatuses = (): Record<string, boolean> => {\n if (!fs.existsSync(statusesPath)) return {}\n try {\n return JSON.parse(fs.readFileSync(statusesPath, 'utf-8'))\n } catch {\n return {}\n }\n }\n\n const validateMeta = (meta: ShardevModuleMeta) => {\n if (!meta.name) throw new Error('Module meta missing name')\n if (!meta.srcDir) throw new Error(`Module ${meta.name} missing srcDir`)\n if (!meta.input) throw new Error(`Module ${meta.name} missing input`)\n }\n\n const discoverModules = async (): Promise<ShardevModuleMeta[]> => {\n\n if (useMetaCache && metaCacheLoaded) {\n log('Using cached module metas')\n return cachedMetas\n }\n\n if (!fs.existsSync(modulesPath)) return []\n\n const statuses = loadStatuses()\n const metas: ShardevModuleMeta[] = []\n\n const vendors = fs.readdirSync(modulesPath, { withFileTypes: true })\n .filter(d => d.isDirectory())\n\n for (const vendor of vendors) {\n const vendorPath = path.join(modulesPath, vendor.name)\n\n const packages = fs.readdirSync(vendorPath, { withFileTypes: true })\n .filter(d => d.isDirectory() && statuses[d.name] !== false)\n\n for (const pkg of packages) {\n\n const pkgPath = path.join(vendorPath, pkg.name)\n const viteConfigPath = path.join(pkgPath, 'vite.config.ts')\n\n if (!fs.existsSync(viteConfigPath)) continue\n\n const server = await createServer({\n configFile: viteConfigPath,\n logLevel: 'silent'\n })\n\n const plugins = (server.config.plugins || []) as Plugin[]\n\n for (const plugin of plugins) {\n if (plugin?.name?.startsWith('vite-plugin-laravel-module:')) {\n const meta = (plugin as any).shardevMeta as ShardevModuleMeta\n if (meta) {\n validateMeta(meta)\n metas.push(meta)\n }\n }\n }\n\n await server.close()\n }\n }\n\n cachedMetas = metas\n metaCacheLoaded = true\n\n log('Discovered modules:', metas.map(m => m.name))\n\n return metas\n }\n\n const generateInputs = (metas: ShardevModuleMeta[]) => {\n const inputs: Record<string, string> = {}\n metas.forEach(meta => {\n Object.entries(meta.input).forEach(([key, value]) => {\n inputs[`${meta.name}-${key}`] = value\n })\n })\n return inputs\n }\n\n const resolveWatchPath = (meta: ShardevModuleMeta): string | null => {\n if (meta.usePublished && meta.publishedDir) {\n return meta.publishedDir\n }\n\n return meta.srcDir ?? null\n }\n\n const handleHMR = (\n server: ViteDevServer,\n file: string\n ) => {\n\n const module = server.moduleGraph.getModuleById(file)\n\n if (!module) return\n\n log('HMR update:', file)\n\n const updates = [{\n type: 'js-update',\n path: module.url,\n acceptedPath: module.url,\n timestamp: Date.now()\n }]\n\n server.moduleGraph.invalidateModule(module)\n\n server.ws.send({\n type: 'update',\n updates\n })\n }\n\n return {\n name: 'laravel-modules',\n\n async config(config: UserConfig, env: ConfigEnv) {\n\n const metas = await discoverModules()\n\n const aliases: Record<string, string> = {}\n metas.forEach(meta => Object.assign(aliases, meta.alias))\n\n const rollupInputs = generateInputs(metas)\n\n return mergeConfig(config, {\n resolve: { alias: aliases },\n build: {\n rollupOptions: { input: rollupInputs }\n }\n })\n },\n\n async configureServer(server: ViteDevServer) {\n\n const metas = await discoverModules()\n\n for (const meta of metas) {\n const watchPath = resolveWatchPath(meta)\n if (watchPath && fs.existsSync(watchPath)) {\n server.watcher.add(watchPath)\n log('Watching:', watchPath)\n }\n }\n\n server.watcher.on('change', (file) => {\n\n const matched = metas.some(meta => {\n const watchPath = resolveWatchPath(meta)\n return watchPath && file.startsWith(watchPath)\n })\n\n if (!matched) return\n\n handleHMR(server, file)\n })\n }\n }\n}"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACAA,gBAAe;AACf,kBAAiB;AA4BV,SAAS,cAAc,SAAsC;AAEhE,QAAM;AAAA,IACF;AAAA,IACA,SAAS;AAAA,IACT,SAAS;AAAA,IACT;AAAA,IACA;AAAA,IACA,WAAW,SAAS,MAAM,IAAI,IAAI;AAAA,IAClC,eAAe,mBAAmB,MAAM,IAAI,IAAI;AAAA,EACpD,IAAI;AAEJ,QAAM,OAAO,QAAQ,IAAI;AACzB,QAAM,aAAa,YAAAA,QAAK,QAAQ,MAAM,YAAY,QAAQ,IAAI;AAE9D,QAAM,WAAW,YAAAA,QAAK,SAAS,YAAY,IAAI;AAC/C,QAAM,eACF,CAAC,YAAY,aAAa,OAAO,CAAC,SAAS,WAAW,IAAI;AAM9D,MAAI,kBAA0C,CAAC;AAE/C,MAAI,SAAS,OAAO,KAAK,KAAK,EAAE,SAAS,GAAG;AAExC,eAAW,CAAC,KAAK,IAAI,KAAK,OAAO,QAAQ,KAAK,GAAG;AAC7C,sBAAgB,GAAG,IAAI,YAAAA,QAAK,QAAQ,YAAY,IAAI;AAAA,IACxD;AAAA,EACJ,OAAO;AAEH,UAAM,eAAe,UAAU,CAAC,UAAU;AAE1C,iBAAa,QAAQ,UAAQ;AACzB,YAAM,MAAM,YAAAA,QAAK,MAAM,IAAI,EAAE;AAC7B,sBAAgB,GAAG,IAAI,YAAAA,QAAK,QAAQ,YAAY,QAAQ,IAAI;AAAA,IAChE,CAAC;AAAA,EACL;AAKA,QAAM,iBAAiB,YAAAA,QAAK,QAAQ,YAAY,MAAM;AACtD,QAAM,uBAAuB,YAAAA,QAAK,QAAQ,MAAM,YAAY;AAE5D,QAAM,cAAc,UAAAC,QAAG,WAAW,oBAAoB;AAEtD,QAAM,YAAY,cACZ,uBACA;AAEN,QAAM,OAA0B;AAAA,IAC5B;AAAA,IACA,OAAO;AAAA,IACP;AAAA,IACA,OAAO;AAAA,MACH,CAAC,IAAI,MAAM,IAAI,IAAI,EAAE,GAAG;AAAA,IAC5B;AAAA,IACA,cAAc;AAAA,IACd,QAAQ;AAAA,IACR,cAAc;AAAA,EAClB;AAEA,SAAO;AAAA,IACH,MAAM,8BAA8B,IAAI;AAAA;AAAA,IAGxC,aAAa;AAAA,IAEb,SAAS;AAGL,UAAI,cAAc;AACd,eAAO;AAAA,UACH,OAAO;AAAA,YACH,QAAQ;AAAA,YACR,aAAa;AAAA,YACb,eAAe;AAAA,cACX,OAAO;AAAA,YACX;AAAA,UACJ;AAAA,UACA,SAAS;AAAA,YACL,OAAO,KAAK;AAAA,UAChB;AAAA,QACJ;AAAA,MACJ;AAGA,aAAO;AAAA,QACH,SAAS;AAAA,UACL,OAAO,KAAK;AAAA,QAChB;AAAA,MACJ;AAAA,IACJ;AAAA,EAEJ;AACJ;;;AC7HA,kBAA0C;AAC1C,IAAAC,eAAiB;AACjB,IAAAC,aAAe;AAmBR,SAAS,eACZ,UAAiC,CAAC,GAC5B;AAEN,QAAM;AAAA,IACF,aAAa;AAAA,IACb,eAAe;AAAA,IACf,QAAQ;AAAA,IACR,eAAe;AAAA,EACnB,IAAI;AAEJ,QAAM,OAAO,QAAQ,IAAI;AACzB,QAAM,cAAc,aAAAC,QAAK,QAAQ,MAAM,UAAU;AACjD,QAAM,eAAe,aAAAA,QAAK,QAAQ,MAAM,YAAY;AAEpD,MAAI,cAAmC,CAAC;AACxC,MAAI,kBAAkB;AAEtB,QAAM,MAAM,IAAI,SAAgB;AAC5B,QAAI,MAAO,SAAQ,IAAI,qBAAqB,GAAG,IAAI;AAAA,EACvD;AAEA,QAAM,eAAe,MAA+B;AAChD,QAAI,CAAC,WAAAC,QAAG,WAAW,YAAY,EAAG,QAAO,CAAC;AAC1C,QAAI;AACA,aAAO,KAAK,MAAM,WAAAA,QAAG,aAAa,cAAc,OAAO,CAAC;AAAA,IAC5D,QAAQ;AACJ,aAAO,CAAC;AAAA,IACZ;AAAA,EACJ;AAEA,QAAM,eAAe,CAAC,SAA4B;AAC9C,QAAI,CAAC,KAAK,KAAM,OAAM,IAAI,MAAM,0BAA0B;AAC1D,QAAI,CAAC,KAAK,OAAQ,OAAM,IAAI,MAAM,UAAU,KAAK,IAAI,iBAAiB;AACtE,QAAI,CAAC,KAAK,MAAO,OAAM,IAAI,MAAM,UAAU,KAAK,IAAI,gBAAgB;AAAA,EACxE;AAEA,QAAM,kBAAkB,YAA0C;AAE9D,QAAI,gBAAgB,iBAAiB;AACjC,UAAI,2BAA2B;AAC/B,aAAO;AAAA,IACX;AAEA,QAAI,CAAC,WAAAA,QAAG,WAAW,WAAW,EAAG,QAAO,CAAC;AAEzC,UAAM,WAAW,aAAa;AAC9B,UAAM,QAA6B,CAAC;AAEpC,UAAM,UAAU,WAAAA,QAAG,YAAY,aAAa,EAAE,eAAe,KAAK,CAAC,EAC9D,OAAO,OAAK,EAAE,YAAY,CAAC;AAEhC,eAAW,UAAU,SAAS;AAC1B,YAAM,aAAa,aAAAD,QAAK,KAAK,aAAa,OAAO,IAAI;AAErD,YAAM,WAAW,WAAAC,QAAG,YAAY,YAAY,EAAE,eAAe,KAAK,CAAC,EAC9D,OAAO,OAAK,EAAE,YAAY,KAAK,SAAS,EAAE,IAAI,MAAM,KAAK;AAE9D,iBAAW,OAAO,UAAU;AAExB,cAAM,UAAU,aAAAD,QAAK,KAAK,YAAY,IAAI,IAAI;AAC9C,cAAM,iBAAiB,aAAAA,QAAK,KAAK,SAAS,gBAAgB;AAE1D,YAAI,CAAC,WAAAC,QAAG,WAAW,cAAc,EAAG;AAEpC,cAAM,SAAS,UAAM,0BAAa;AAAA,UAC9B,YAAY;AAAA,UACZ,UAAU;AAAA,QACd,CAAC;AAED,cAAM,UAAW,OAAO,OAAO,WAAW,CAAC;AAE3C,mBAAW,UAAU,SAAS;AAC1B,cAAI,QAAQ,MAAM,WAAW,6BAA6B,GAAG;AACzD,kBAAM,OAAQ,OAAe;AAC7B,gBAAI,MAAM;AACN,2BAAa,IAAI;AACjB,oBAAM,KAAK,IAAI;AAAA,YACnB;AAAA,UACJ;AAAA,QACJ;AAEA,cAAM,OAAO,MAAM;AAAA,MACvB;AAAA,IACJ;AAEA,kBAAc;AACd,sBAAkB;AAElB,QAAI,uBAAuB,MAAM,IAAI,OAAK,EAAE,IAAI,CAAC;AAEjD,WAAO;AAAA,EACX;AAEA,QAAM,iBAAiB,CAAC,UAA+B;AACnD,UAAM,SAAiC,CAAC;AACxC,UAAM,QAAQ,UAAQ;AAClB,aAAO,QAAQ,KAAK,KAAK,EAAE,QAAQ,CAAC,CAAC,KAAK,KAAK,MAAM;AACjD,eAAO,GAAG,KAAK,IAAI,IAAI,GAAG,EAAE,IAAI;AAAA,MACpC,CAAC;AAAA,IACL,CAAC;AACD,WAAO;AAAA,EACX;AAEA,QAAM,mBAAmB,CAAC,SAA2C;AACjE,QAAI,KAAK,gBAAgB,KAAK,cAAc;AACxC,aAAO,KAAK;AAAA,IAChB;AAEA,WAAO,KAAK,UAAU;AAAA,EAC1B;AAEA,QAAM,YAAY,CACd,QACA,SACC;AAED,UAAMC,UAAS,OAAO,YAAY,cAAc,IAAI;AAEpD,QAAI,CAACA,QAAQ;AAEb,QAAI,eAAe,IAAI;AAEvB,UAAM,UAAU,CAAC;AAAA,MACb,MAAM;AAAA,MACN,MAAMA,QAAO;AAAA,MACb,cAAcA,QAAO;AAAA,MACrB,WAAW,KAAK,IAAI;AAAA,IACxB,CAAC;AAED,WAAO,YAAY,iBAAiBA,OAAM;AAE1C,WAAO,GAAG,KAAK;AAAA,MACX,MAAM;AAAA,MACN;AAAA,IACJ,CAAC;AAAA,EACL;AAEA,SAAO;AAAA,IACH,MAAM;AAAA,IAEN,MAAM,OAAO,QAAoB,KAAgB;AAE7C,YAAM,QAAQ,MAAM,gBAAgB;AAEpC,YAAM,UAAkC,CAAC;AACzC,YAAM,QAAQ,UAAQ,OAAO,OAAO,SAAS,KAAK,KAAK,CAAC;AAExD,YAAM,eAAe,eAAe,KAAK;AAEzC,iBAAO,yBAAY,QAAQ;AAAA,QACvB,SAAS,EAAE,OAAO,QAAQ;AAAA,QAC1B,OAAO;AAAA,UACH,eAAe,EAAE,OAAO,aAAa;AAAA,QACzC;AAAA,MACJ,CAAC;AAAA,IACL;AAAA,IAEA,MAAM,gBAAgB,QAAuB;AAEzC,YAAM,QAAQ,MAAM,gBAAgB;AAEpC,iBAAW,QAAQ,OAAO;AACtB,cAAM,YAAY,iBAAiB,IAAI;AACvC,YAAI,aAAa,WAAAD,QAAG,WAAW,SAAS,GAAG;AACvC,iBAAO,QAAQ,IAAI,SAAS;AAC5B,cAAI,aAAa,SAAS;AAAA,QAC9B;AAAA,MACJ;AAEA,aAAO,QAAQ,GAAG,UAAU,CAAC,SAAS;AAElC,cAAM,UAAU,MAAM,KAAK,UAAQ;AAC/B,gBAAM,YAAY,iBAAiB,IAAI;AACvC,iBAAO,aAAa,KAAK,WAAW,SAAS;AAAA,QACjD,CAAC;AAED,YAAI,CAAC,QAAS;AAEd,kBAAU,QAAQ,IAAI;AAAA,MAC1B,CAAC;AAAA,IACL;AAAA,EACJ;AACJ;","names":["path","fs","import_path","import_fs","path","fs","module"]}
|
package/dist/index.js
CHANGED
|
@@ -27,9 +27,10 @@ function laravelModule(options) {
|
|
|
27
27
|
normalizedInput[key] = path.resolve(moduleRoot, srcDir, file);
|
|
28
28
|
});
|
|
29
29
|
}
|
|
30
|
-
const
|
|
31
|
-
const
|
|
32
|
-
const
|
|
30
|
+
const absoluteSrcDir = path.resolve(moduleRoot, srcDir);
|
|
31
|
+
const absolutePublishedDir = path.resolve(root, publishedDir);
|
|
32
|
+
const isPublished = fs.existsSync(absolutePublishedDir);
|
|
33
|
+
const aliasPath = isPublished ? absolutePublishedDir : absoluteSrcDir;
|
|
33
34
|
const meta = {
|
|
34
35
|
name,
|
|
35
36
|
input: normalizedInput,
|
|
@@ -37,7 +38,9 @@ function laravelModule(options) {
|
|
|
37
38
|
alias: {
|
|
38
39
|
[`@${vendor}/${name}`]: aliasPath
|
|
39
40
|
},
|
|
40
|
-
usePublished: isPublished
|
|
41
|
+
usePublished: isPublished,
|
|
42
|
+
srcDir: absoluteSrcDir,
|
|
43
|
+
publishedDir: absolutePublishedDir
|
|
41
44
|
};
|
|
42
45
|
return {
|
|
43
46
|
name: `vite-plugin-laravel-module:${name}`,
|
|
@@ -147,9 +150,10 @@ function laravelModules(options = {}) {
|
|
|
147
150
|
return inputs;
|
|
148
151
|
};
|
|
149
152
|
const resolveWatchPath = (meta) => {
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
+
if (meta.usePublished && meta.publishedDir) {
|
|
154
|
+
return meta.publishedDir;
|
|
155
|
+
}
|
|
156
|
+
return meta.srcDir ?? null;
|
|
153
157
|
};
|
|
154
158
|
const handleHMR = (server, file) => {
|
|
155
159
|
const module = server.moduleGraph.getModuleById(file);
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/laravelModule.ts","../src/laravelModules.ts"],"sourcesContent":["import fs from 'fs'\nimport path from 'path'\nimport type { PluginOption } from 'vite'\n\nexport interface ModuleOptions {\n name: string\n vendor?: string\n srcDir?: string\n\n // ✅ Nuevo formato recomendado\n input?: Record<string, string>\n\n // ⚠ Backward compatibility\n inputs?: string[]\n\n buildDir?: string\n publishedDir?: string\n}\n\nexport interface ShardevModuleMeta {\n name: string\n input: Record<string, string>\n buildDir: string\n alias: Record<string, string>\n usePublished: boolean\n}\n\nexport function laravelModule(options: ModuleOptions): PluginOption {\n\n const {\n name,\n vendor = 'shardevcom',\n srcDir = 'resources/react/src',\n input,\n inputs,\n buildDir = `build/${vendor}/${name}`,\n publishedDir = `resources/react/${vendor}/${name}`\n } = options\n\n const root = process.cwd()\n const moduleRoot = path.resolve(root, 'packages', vendor, name)\n\n const relative = path.relative(moduleRoot, root)\n const isModuleRoot =\n !relative || relative === '.' || !relative.startsWith('..')\n\n // ---------------------------------------------------\n // 🔥 Normalización inteligente de inputs\n // ---------------------------------------------------\n\n let normalizedInput: Record<string, string> = {}\n\n if (input && Object.keys(input).length > 0) {\n // Nuevo formato recomendado\n for (const [key, file] of Object.entries(input)) {\n normalizedInput[key] = path.resolve(moduleRoot, file)\n }\n } else {\n // Backward compatibility con inputs: []\n const legacyInputs = inputs ?? ['main.tsx']\n\n legacyInputs.forEach(file => {\n const key = path.parse(file).name\n normalizedInput[key] = path.resolve(moduleRoot, srcDir, file)\n })\n }\n\n // ---------------------------------------------------\n // Published detection\n // ---------------------------------------------------\n\n const publishedPath = path.resolve(root, publishedDir)\n const isPublished = fs.existsSync(publishedPath)\n\n const aliasPath = isPublished\n ? publishedPath\n : path.resolve(moduleRoot, srcDir)\n\n const meta: ShardevModuleMeta = {\n name,\n input: normalizedInput,\n buildDir,\n alias: {\n [`@${vendor}/${name}`]: aliasPath\n },\n usePublished: isPublished\n }\n\n return {\n name: `vite-plugin-laravel-module:${name}`,\n\n // 🔥 Metadata consumida por laravelModules()\n shardevMeta: meta,\n\n config() {\n\n // 🔹 Standalone build\n if (isModuleRoot) {\n return {\n build: {\n outDir: buildDir,\n emptyOutDir: true,\n rollupOptions: {\n input: normalizedInput\n }\n },\n resolve: {\n alias: meta.alias\n }\n }\n }\n\n // 🔹 Integrated mode\n return {\n resolve: {\n alias: meta.alias\n }\n }\n }\n\n } as PluginOption\n}","import type { Plugin, UserConfig, ConfigEnv, ViteDevServer, ModuleNode } from 'vite'\nimport { mergeConfig, createServer } from 'vite'\nimport path from 'path'\nimport fs from 'fs'\n\ninterface LaravelModulesOptions {\n modulesDir?: string\n statusesFile?: string\n debug?: boolean\n useMetaCache?: boolean\n}\n\ninterface ShardevModuleMeta {\n name: string\n input: Record<string, string>\n buildDir: string\n alias: Record<string, string>\n usePublished: boolean\n srcDir: string\n publishedDir?: string\n}\n\nexport function laravelModules(\n options: LaravelModulesOptions = {}\n): Plugin {\n\n const {\n modulesDir = 'packages',\n statusesFile = 'modules.json',\n debug = false,\n useMetaCache = true\n } = options\n\n const root = process.cwd()\n const modulesPath = path.resolve(root, modulesDir)\n const statusesPath = path.resolve(root, statusesFile)\n\n let cachedMetas: ShardevModuleMeta[] = []\n let metaCacheLoaded = false\n\n const log = (...args: any[]) => {\n if (debug) console.log('[laravel-modules]', ...args)\n }\n\n const loadStatuses = (): Record<string, boolean> => {\n if (!fs.existsSync(statusesPath)) return {}\n try {\n return JSON.parse(fs.readFileSync(statusesPath, 'utf-8'))\n } catch {\n return {}\n }\n }\n\n const validateMeta = (meta: ShardevModuleMeta) => {\n if (!meta.name) throw new Error('Module meta missing name')\n if (!meta.srcDir) throw new Error(`Module ${meta.name} missing srcDir`)\n if (!meta.input) throw new Error(`Module ${meta.name} missing input`)\n }\n\n const discoverModules = async (): Promise<ShardevModuleMeta[]> => {\n\n if (useMetaCache && metaCacheLoaded) {\n log('Using cached module metas')\n return cachedMetas\n }\n\n if (!fs.existsSync(modulesPath)) return []\n\n const statuses = loadStatuses()\n const metas: ShardevModuleMeta[] = []\n\n const vendors = fs.readdirSync(modulesPath, { withFileTypes: true })\n .filter(d => d.isDirectory())\n\n for (const vendor of vendors) {\n const vendorPath = path.join(modulesPath, vendor.name)\n\n const packages = fs.readdirSync(vendorPath, { withFileTypes: true })\n .filter(d => d.isDirectory() && statuses[d.name] !== false)\n\n for (const pkg of packages) {\n\n const pkgPath = path.join(vendorPath, pkg.name)\n const viteConfigPath = path.join(pkgPath, 'vite.config.ts')\n\n if (!fs.existsSync(viteConfigPath)) continue\n\n const server = await createServer({\n configFile: viteConfigPath,\n logLevel: 'silent'\n })\n\n const plugins = (server.config.plugins || []) as Plugin[]\n\n for (const plugin of plugins) {\n if (plugin?.name?.startsWith('vite-plugin-laravel-module:')) {\n const meta = (plugin as any).shardevMeta as ShardevModuleMeta\n if (meta) {\n validateMeta(meta)\n metas.push(meta)\n }\n }\n }\n\n await server.close()\n }\n }\n\n cachedMetas = metas\n metaCacheLoaded = true\n\n log('Discovered modules:', metas.map(m => m.name))\n\n return metas\n }\n\n const generateInputs = (metas: ShardevModuleMeta[]) => {\n const inputs: Record<string, string> = {}\n metas.forEach(meta => {\n Object.entries(meta.input).forEach(([key, value]) => {\n inputs[`${meta.name}-${key}`] = value\n })\n })\n return inputs\n }\n\n const resolveWatchPath = (meta: ShardevModuleMeta): string | null => {\n const base = meta.usePublished && meta.publishedDir\n ? meta.publishedDir\n : meta.srcDir\n\n if (!base) return null\n\n return path.isAbsolute(base)\n ? base\n : path.resolve(root, base)\n }\n\n const handleHMR = (\n server: ViteDevServer,\n file: string\n ) => {\n\n const module = server.moduleGraph.getModuleById(file)\n\n if (!module) return\n\n log('HMR update:', file)\n\n const updates = [{\n type: 'js-update',\n path: module.url,\n acceptedPath: module.url,\n timestamp: Date.now()\n }]\n\n server.moduleGraph.invalidateModule(module)\n\n server.ws.send({\n type: 'update',\n updates\n })\n }\n\n return {\n name: 'laravel-modules',\n\n async config(config: UserConfig, env: ConfigEnv) {\n\n const metas = await discoverModules()\n\n const aliases: Record<string, string> = {}\n metas.forEach(meta => Object.assign(aliases, meta.alias))\n\n const rollupInputs = generateInputs(metas)\n\n return mergeConfig(config, {\n resolve: { alias: aliases },\n build: {\n rollupOptions: { input: rollupInputs }\n }\n })\n },\n\n async configureServer(server: ViteDevServer) {\n\n const metas = await discoverModules()\n\n for (const meta of metas) {\n const watchPath = resolveWatchPath(meta)\n if (watchPath && fs.existsSync(watchPath)) {\n server.watcher.add(watchPath)\n log('Watching:', watchPath)\n }\n }\n\n server.watcher.on('change', (file) => {\n\n const matched = metas.some(meta => {\n const watchPath = resolveWatchPath(meta)\n return watchPath && file.startsWith(watchPath)\n })\n\n if (!matched) return\n\n handleHMR(server, file)\n })\n }\n }\n}"],"mappings":"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","names":["path","fs"]}
|
|
1
|
+
{"version":3,"sources":["../src/laravelModule.ts","../src/laravelModules.ts"],"sourcesContent":["import fs from 'fs'\nimport path from 'path'\nimport type { PluginOption } from 'vite'\n\nexport interface ModuleOptions {\n name: string\n vendor?: string\n srcDir?: string\n\n // ✅ Nuevo formato recomendado\n input?: Record<string, string>\n\n // ⚠ Backward compatibility\n inputs?: string[]\n\n buildDir?: string\n publishedDir?: string\n}\n\ninterface ShardevModuleMeta {\n name: string\n input: Record<string, string>\n buildDir: string\n alias: Record<string, string>\n usePublished: boolean\n srcDir: string\n publishedDir?: string\n}\n\nexport function laravelModule(options: ModuleOptions): PluginOption {\n\n const {\n name,\n vendor = 'shardevcom',\n srcDir = 'resources/react/src',\n input,\n inputs,\n buildDir = `build/${vendor}/${name}`,\n publishedDir = `resources/react/${vendor}/${name}`\n } = options\n\n const root = process.cwd()\n const moduleRoot = path.resolve(root, 'packages', vendor, name)\n\n const relative = path.relative(moduleRoot, root)\n const isModuleRoot =\n !relative || relative === '.' || !relative.startsWith('..')\n\n // ---------------------------------------------------\n // 🔥 Normalización inteligente de inputs\n // ---------------------------------------------------\n\n let normalizedInput: Record<string, string> = {}\n\n if (input && Object.keys(input).length > 0) {\n // Nuevo formato recomendado\n for (const [key, file] of Object.entries(input)) {\n normalizedInput[key] = path.resolve(moduleRoot, file)\n }\n } else {\n // Backward compatibility con inputs: []\n const legacyInputs = inputs ?? ['main.tsx']\n\n legacyInputs.forEach(file => {\n const key = path.parse(file).name\n normalizedInput[key] = path.resolve(moduleRoot, srcDir, file)\n })\n }\n\n // ---------------------------------------------------\n // Published detection\n // ---------------------------------------------------\n const absoluteSrcDir = path.resolve(moduleRoot, srcDir)\n const absolutePublishedDir = path.resolve(root, publishedDir)\n\n const isPublished = fs.existsSync(absolutePublishedDir)\n\n const aliasPath = isPublished\n ? absolutePublishedDir\n : absoluteSrcDir\n\n const meta: ShardevModuleMeta = {\n name,\n input: normalizedInput,\n buildDir,\n alias: {\n [`@${vendor}/${name}`]: aliasPath\n },\n usePublished: isPublished,\n srcDir: absoluteSrcDir,\n publishedDir: absolutePublishedDir\n }\n\n return {\n name: `vite-plugin-laravel-module:${name}`,\n\n // 🔥 Metadata consumida por laravelModules()\n shardevMeta: meta,\n\n config() {\n\n // 🔹 Standalone build\n if (isModuleRoot) {\n return {\n build: {\n outDir: buildDir,\n emptyOutDir: true,\n rollupOptions: {\n input: normalizedInput\n }\n },\n resolve: {\n alias: meta.alias\n }\n }\n }\n\n // 🔹 Integrated mode\n return {\n resolve: {\n alias: meta.alias\n }\n }\n }\n\n } as PluginOption\n}","import type { Plugin, UserConfig, ConfigEnv, ViteDevServer, ModuleNode } from 'vite'\nimport { mergeConfig, createServer } from 'vite'\nimport path from 'path'\nimport fs from 'fs'\n\ninterface LaravelModulesOptions {\n modulesDir?: string\n statusesFile?: string\n debug?: boolean\n useMetaCache?: boolean\n}\n\ninterface ShardevModuleMeta {\n name: string\n input: Record<string, string>\n buildDir: string\n alias: Record<string, string>\n usePublished: boolean\n srcDir: string\n publishedDir?: string\n}\n\nexport function laravelModules(\n options: LaravelModulesOptions = {}\n): Plugin {\n\n const {\n modulesDir = 'packages',\n statusesFile = 'modules.json',\n debug = false,\n useMetaCache = true\n } = options\n\n const root = process.cwd()\n const modulesPath = path.resolve(root, modulesDir)\n const statusesPath = path.resolve(root, statusesFile)\n\n let cachedMetas: ShardevModuleMeta[] = []\n let metaCacheLoaded = false\n\n const log = (...args: any[]) => {\n if (debug) console.log('[laravel-modules]', ...args)\n }\n\n const loadStatuses = (): Record<string, boolean> => {\n if (!fs.existsSync(statusesPath)) return {}\n try {\n return JSON.parse(fs.readFileSync(statusesPath, 'utf-8'))\n } catch {\n return {}\n }\n }\n\n const validateMeta = (meta: ShardevModuleMeta) => {\n if (!meta.name) throw new Error('Module meta missing name')\n if (!meta.srcDir) throw new Error(`Module ${meta.name} missing srcDir`)\n if (!meta.input) throw new Error(`Module ${meta.name} missing input`)\n }\n\n const discoverModules = async (): Promise<ShardevModuleMeta[]> => {\n\n if (useMetaCache && metaCacheLoaded) {\n log('Using cached module metas')\n return cachedMetas\n }\n\n if (!fs.existsSync(modulesPath)) return []\n\n const statuses = loadStatuses()\n const metas: ShardevModuleMeta[] = []\n\n const vendors = fs.readdirSync(modulesPath, { withFileTypes: true })\n .filter(d => d.isDirectory())\n\n for (const vendor of vendors) {\n const vendorPath = path.join(modulesPath, vendor.name)\n\n const packages = fs.readdirSync(vendorPath, { withFileTypes: true })\n .filter(d => d.isDirectory() && statuses[d.name] !== false)\n\n for (const pkg of packages) {\n\n const pkgPath = path.join(vendorPath, pkg.name)\n const viteConfigPath = path.join(pkgPath, 'vite.config.ts')\n\n if (!fs.existsSync(viteConfigPath)) continue\n\n const server = await createServer({\n configFile: viteConfigPath,\n logLevel: 'silent'\n })\n\n const plugins = (server.config.plugins || []) as Plugin[]\n\n for (const plugin of plugins) {\n if (plugin?.name?.startsWith('vite-plugin-laravel-module:')) {\n const meta = (plugin as any).shardevMeta as ShardevModuleMeta\n if (meta) {\n validateMeta(meta)\n metas.push(meta)\n }\n }\n }\n\n await server.close()\n }\n }\n\n cachedMetas = metas\n metaCacheLoaded = true\n\n log('Discovered modules:', metas.map(m => m.name))\n\n return metas\n }\n\n const generateInputs = (metas: ShardevModuleMeta[]) => {\n const inputs: Record<string, string> = {}\n metas.forEach(meta => {\n Object.entries(meta.input).forEach(([key, value]) => {\n inputs[`${meta.name}-${key}`] = value\n })\n })\n return inputs\n }\n\n const resolveWatchPath = (meta: ShardevModuleMeta): string | null => {\n if (meta.usePublished && meta.publishedDir) {\n return meta.publishedDir\n }\n\n return meta.srcDir ?? null\n }\n\n const handleHMR = (\n server: ViteDevServer,\n file: string\n ) => {\n\n const module = server.moduleGraph.getModuleById(file)\n\n if (!module) return\n\n log('HMR update:', file)\n\n const updates = [{\n type: 'js-update',\n path: module.url,\n acceptedPath: module.url,\n timestamp: Date.now()\n }]\n\n server.moduleGraph.invalidateModule(module)\n\n server.ws.send({\n type: 'update',\n updates\n })\n }\n\n return {\n name: 'laravel-modules',\n\n async config(config: UserConfig, env: ConfigEnv) {\n\n const metas = await discoverModules()\n\n const aliases: Record<string, string> = {}\n metas.forEach(meta => Object.assign(aliases, meta.alias))\n\n const rollupInputs = generateInputs(metas)\n\n return mergeConfig(config, {\n resolve: { alias: aliases },\n build: {\n rollupOptions: { input: rollupInputs }\n }\n })\n },\n\n async configureServer(server: ViteDevServer) {\n\n const metas = await discoverModules()\n\n for (const meta of metas) {\n const watchPath = resolveWatchPath(meta)\n if (watchPath && fs.existsSync(watchPath)) {\n server.watcher.add(watchPath)\n log('Watching:', watchPath)\n }\n }\n\n server.watcher.on('change', (file) => {\n\n const matched = metas.some(meta => {\n const watchPath = resolveWatchPath(meta)\n return watchPath && file.startsWith(watchPath)\n })\n\n if (!matched) return\n\n handleHMR(server, file)\n })\n }\n }\n}"],"mappings":"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","names":["path","fs"]}
|