You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
72 lines
1.7 KiB
72 lines
1.7 KiB
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('<head>', '<head><script>window.Views=[];</script>')
|
|
},
|
|
|
|
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'),
|
|
},
|
|
},
|
|
});
|
|
|