import { imba } from 'vite-plugin-imba'; import { resolve } from 'path' import { defineConfig } from 'vite'; import { name } from './package.json' let viewPaths = {} // view: [path] let pathViews = {} // path: [view] function duplicate(obj){ return JSON.parse(JSON.stringify(obj)) } function without(el, arr) { return arr.filter(function(e){ if(e != el) { return e } }) } function proRouterViews() { return { name: 'pro-router-views', transformIndexHtml(html) { return html.replace('', '') }, transform: { order: 'pre', handler(src, id) { if (/\.imba$/.test(id)) { let viewRegExp = /tag view-((\w|\S)+)( |\n)/g let result = null let views_str = "" let views = pathViews[id] ||= [] let missingDeclarations = duplicate(views) while(result = viewRegExp.exec(src)) { let view = result[1] if(view != 'not_found'){ let paths = viewPaths[view] ||= [] missingDeclarations = without(view, missingDeclarations) if(!views.includes(view)){ views.push(view) if(!paths.includes(id)){ paths.push(id) } } if(paths[0] == id){ views_str += "Views.push(\""+ view +"\");" } } } missingDeclarations.forEach(function(view){ let paths = viewPaths[view] ||= [] if((paths[0] == id) && (paths.length > 1)){ views_str += "Views.push(\""+ view +"\");" } else { paths = without(id, paths) views = without(view, views) } }) return { code: views_str+src, map: null } } } } } } export default defineConfig({ plugins: [proRouterViews(), imba()], build: { lib: { name: name, fileName: "index", entry: resolve(__dirname, 'src/main.imba'), }, }, });