const pjson = require('./package.json'); const glob = require('glob'); const path = require('path'); const version = pjson.version; const fs = require("fs"); // Helper to get all files of a given extension in a given directory and its subfolders. function getFilesRecursive(dir, type) { // The list of files that we will return. let files = [] // Loop everything in given location. fs.readdirSync(dir).forEach(file => { let fileName = `${dir}/${file}` // Add if its a file and it is of the correct file type. if(fs.statSync(fileName).isFile() && fileName.endsWith(type)) { files.push(fileName) } // Process subfolder. if(!fs.statSync(fileName).isFile()) { // Recusively loop this function for the subfolder. files = files.concat(getFilesRecursive(fileName, type)) } }) return files } let mix = require('laravel-mix'); require('laravel-mix-eslint'); require('mix-tailwindcss'); require('dotenv').config({ path: 'config/.env' }); mix .setPublicPath('public/dist') .setResourceRoot(`../`); /* //Draft for file based js controller loading getFilesRecursive('app/Domain', '.js').forEach(file => { subfolder = file.match(/(.*)[\/\\]/)[1]||''; // 'src/js/libraries' subfolder = subfolder.replace('app/Domain', ''); // '/libraries' mix.js(file, 'js' + subfolder); }); */ // this is the URL to place assets referenced in the CSS/JS mix // this is what to prefix the URL with .combine('./public/assets/js/libs/prism/prism.js', `public/dist/js/compiled-footer.${version}.min.js`) .js('./public/assets/js/app/htmx.js', `public/dist/js/compiled-htmx.${version}.min.js`) .js('./public/assets/js/app/htmx-extensions.js', `public/dist/js/compiled-htmx-extensions.${version}.min.js`) // Client-side export libs (html2canvas + jsPDF). Copied unversioned so // consumers (e.g. StrategyPro's Logic Model PNG/PDF export) can fetch // them on demand via a stable URL without needing the Mix manifest. // They're lazy-loaded by JS only when an export is triggered, so they // never hit the wire for users who don't use the feature. .copy('./node_modules/html2canvas/dist/html2canvas.min.js', 'public/dist/js/html2canvas.min.js') .copy('./node_modules/jspdf/dist/jspdf.umd.min.js', 'public/dist/js/jspdf.umd.min.js') .js("./node_modules/@lottiefiles/lottie-player/dist/lottie-player.js", `public/dist/js/compiled-lottieplayer.${version}.min.js`) .combine([ "./public/assets/js/app/app.js", "./public/assets/js/app/core/snippets.js", "./public/assets/js/app/core/modals.js", "./public/assets/js/app/core/tableHandling.js", "./public/assets/js/app/core/datePickers.js", "./public/assets/js/app/core/dateHelper.js", "./public/assets/js/app/core/accessibility.js", ...glob.sync("./app/Domain/**/*.js").map(f => `./${f}`) ], `public/dist/js/compiled-app.${version}.min.js`) .combine([ "./node_modules/jquery/dist/jquery.js", "./public/assets/js/libs/bootstrap.min.js", ], `public/dist/js/compiled-frameworks.${version}.min.js`) .combine([ "./node_modules/jquery-ui-dist/jquery-ui.js", "./node_modules/jquery-ui-touch-punch/jquery.ui.touch-punch.js", "./node_modules/chosen-js/chosen.jquery.js", "./public/assets/js/libs/jquery.growl.js", "./public/assets/js/libs/jquery.form.js", "./public/assets/js/libs/jquery.tagsinput.min.js", "./public/assets/js/libs/bootstrap-fileupload.min.js", "./node_modules/jquery-is-in-viewport/dist/isInViewport.jquery.js", "./public/assets/js/app/core/nestedSortable.js", ], `public/dist/js/compiled-framework-plugins.${version}.min.js`) .combine([ "./node_modules/luxon/build/global/luxon.js", "./node_modules/moment/moment.js", "./public/assets/js/libs/jquery.form.js", "./node_modules/@popperjs/core/dist/umd/popper.js", "./node_modules/tippy.js/dist/tippy-bundle.umd.js", "./public/assets/js/libs/slimselect.min.js", "./node_modules/canvas-confetti/dist/confetti.browser.js", "./public/assets/js/libs/jquery.nyroModal/js/jquery.nyroModal.custom.js", "./public/assets/js/libs/uppy/uppy.js", "./node_modules/croppie/croppie.js", "./node_modules/packery/dist/packery.pkgd.js", "./node_modules/imagesloaded/imagesloaded.pkgd.js", "./node_modules/shepherd.js/dist/js/shepherd.js", "./node_modules/isotope-layout/dist/isotope.pkgd.js", "./node_modules/gridstack/dist/gridstack-all.js", "./node_modules/jstree/dist/jstree.js", "./node_modules/@assuradeurengilde/fontawesome-iconpicker/dist/js/fontawesome-iconpicker.js", "./node_modules/leader-line/leader-line.min.js", "./public/assets/js/libs/simple-color-picker-master/jquery.simple-color-picker.js", "./public/assets/js/libs/emojipicker/vanillaEmojiPicker.js", "./node_modules/mermaid/dist/mermaid.min.js", "./node_modules/marked/marked.min.js", ], `public/dist/js/compiled-global-component.${version}.min.js`) .combine([ "./node_modules/ical.js/build/ical.min.js", "./node_modules/fullcalendar/index.global.min.js", "./node_modules/@fullcalendar/icalendar/index.global.min.js", "./node_modules/@fullcalendar/google-calendar/index.global.min.js", "./node_modules/@fullcalendar/luxon3/index.global.min.js", ], `public/dist/js/compiled-calendar-component.${version}.min.js`) .combine([ "./node_modules/datatables.net/js/jquery.dataTables.js", "./node_modules/datatables.net-rowgroup/js/dataTables.rowGroup.js", "./node_modules/datatables.net-rowreorder/js/dataTables.rowReorder.js", "./node_modules/datatables.net-buttons/js/dataTables.buttons.js", "./node_modules/datatables.net-buttons/js/buttons.html5.js", "./node_modules/datatables.net-buttons/js/buttons.print.js", "./node_modules/datatables.net-buttons/js/buttons.colVis.js", ], `public/dist/js/compiled-table-component.${version}.min.js`) .js('./public/assets/js/app/core/tiptap/index.js', `public/dist/js/compiled-tiptap-editor.${version}.min.js`) .combine([ './public/assets/js/app/core/tiptap/extensions/toolbar.js' ], `public/dist/js/compiled-tiptap-toolbar.${version}.min.js`) .combine([ './public/assets/js/app/core/tiptap/test-utils.js' ], `public/dist/js/compiled-tiptap-tests.${version}.min.js`) .combine([ "./public/assets/js/libs/simpleGantt/snap.svg-min.js", "./public/assets/js/libs/simpleGantt/frappe-gantt.js", ], `public/dist/js/compiled-gantt-component.${version}.min.js`) .combine([ "./node_modules/chart.js/dist/chart.js", "./node_modules/chartjs-adapter-luxon/dist/chartjs-adapter-luxon.umd.js", ], `public/dist/js/compiled-chart-component.${version}.min.js`) .js('./public/assets/js/app/onebot-sheet.js', `public/dist/js/compiled-univer-component.${version}.min.js`) .less('./public/assets/less/main.less', `public/dist/css/main.${version}.min.css`, { sourceMap: true, }) .less('./public/assets/less/app.less', `public/dist/css/app.${version}.min.css`, { sourceMap: true, }) .copy('./public/assets/css/components/tiptap-editor.css', `public/dist/css/tiptap-editor.${version}.min.css`) .tailwind() .copy('./public/assets/images', 'public/dist/images') .copy('./public/assets/fonts', 'public/dist/fonts') .copy('./public/assets/lottie', 'public/dist/lottie') .copy('./node_modules/katex/dist/fonts', 'public/dist/fonts/katex') .copy('./node_modules/katex/dist/katex.min.css', 'public/dist/css/katex.min.css') .copy('./node_modules/katex/dist/fonts', 'public/dist/css/fonts') .eslint({ fix: true, extensions: ['js'], exclude: [ 'node_modules', 'public/assets/js/libs', ], overrideConfig: { parser: '@babel/eslint-parser', } }) .webpackConfig({ devtool: 'inline-source-map', resolve: { extensions: ['.cjs', '.js', '.mjs', '.jsx', '.json'], alias: { 'images': path.resolve(__dirname, 'public/assets/images'), 'js': path.resolve(__dirname, 'public/assets/js'), 'css': path.resolve(__dirname, 'public/assets/css'), 'fonts': path.resolve(__dirname, 'public/assets/fonts'), // @univerjs/icons 的 cjs 构建是坏的(require .js 但文件是 .cjs), // 但 esm 构建是好的(import .js 且文件就是 .js)——alias 强制走 esm 入口 '@univerjs/icons': path.resolve(__dirname, 'node_modules/@univerjs/icons/dist/esm/index.js') } } });