diff --git a/package.json b/package.json index cd128f57d8..0341cf8edb 100644 --- a/package.json +++ b/package.json @@ -1,13 +1,8 @@ { "private": true, "scripts": { - "dev": "npm run development", - "development": "mix", - "watch": "mix watch", - "watch-poll": "mix watch -- --watch-options-poll=1000", - "hot": "mix watch --hot", - "prod": "npm run production", - "production": "mix --production" + "dev": "vite", + "build": "vite build" }, "resolutions": { "terser": "3.14.1" @@ -18,13 +13,14 @@ "git-revision-webpack-plugin": "^5.0.0", "jquery": "^3.6.0", "laravel-localization-loader": "^1.0.5", - "laravel-mix": "^6.0.49", "lodash": "^4.17.21", "resolve-url-loader": "^5.0.0", "sass": "^1.52.3", "sass-loader": "^13.0.0", "vue-template-compiler": "^2.6.14", - "webpack-shell-plugin-next": "^2.2.2" + "webpack-shell-plugin-next": "^2.2.2", + "vite": "^3.0.2", + "laravel-vite-plugin": "^0.6.0" }, "dependencies": { "@fortawesome/fontawesome-free": "^5.15.4", diff --git a/resources/assets/js/app.js b/resources/assets/js/app.js index f8e591cce3..a8fe131580 100644 --- a/resources/assets/js/app.js +++ b/resources/assets/js/app.js @@ -4,7 +4,7 @@ * building robust, powerful web applications using Vue and Laravel. */ -require('./bootstrap'); +import './bootstrap'; /** * Next, we will create a fresh Vue application instance and attach it to diff --git a/resources/assets/js/bootstrap.js b/resources/assets/js/bootstrap.js index 67634b1628..035f193f03 100644 --- a/resources/assets/js/bootstrap.js +++ b/resources/assets/js/bootstrap.js @@ -1,4 +1,5 @@ -window._ = require('lodash'); +import _ from 'lodash'; +window._ = _; /** * We'll load jQuery and the Bootstrap jQuery plugin which provides support @@ -9,7 +10,7 @@ window._ = require('lodash'); window.$ = window.jQuery = require('jquery'); window.Popper = require('popper.js').default; -require('bootstrap'); +import 'bootstrap'; /** * Vue is a modern JavaScript library for building interactive web interfaces @@ -28,7 +29,8 @@ import Echo from 'laravel-echo' */ import messages from './messages'; -window.io = require('socket.io-client'); +import io from 'socket.io-client'; +window.io = io; window.startEcho = function () { window.Echo = new Echo({ @@ -43,46 +45,76 @@ window.startEcho = function () { * CSRF token as a header based on the value of the "XSRF" token cookie. */ -window.axios = require('axios'); +import axios from 'axios'; +window.axios = axios; -window.datatables = require('datatables'); -window.leaflet = require('leaflet'); -window.leafletdraw = require('leaflet-draw'); +import datatables from 'datatables'; +window.datatables = datatables; +import leaflet from 'leaflet'; +window.leaflet = leaflet; +import leafletdraw from 'leaflet-draw'; +window.leafletdraw = leafletdraw; // window.leafleteditable = require('leaflet-editable'); -window.leafletcontextmenu = require('leaflet-contextmenu'); -window.GestureHandling = require('leaflet-gesture-handling'); +import leafletcontextmenu from 'leaflet-contextmenu'; +window.leafletcontextmenu = leafletcontextmenu; +import GestureHandling from 'leaflet-gesture-handling'; +window.GestureHandling = GestureHandling; // window.interpolate = require('color-interpolate'); -window.gju = require('geojson-utils'); -window.bootstrapselect = require('bootstrap-select'); -window.Handlebars = require('handlebars'); -window.barrating = require('jquery-bar-rating'); -window.polylinedecorator = require('leaflet-polylinedecorator'); -window.lightCarousel = require('lightslider'); -window.introjs = require('intro.js'); -window.pwstrengthmeter = require('password-strength-meter'); -window.jqueryMousewheel = require('jquery-mousewheel'); -window.Cookies = require('js-cookie'); +import gju from 'geojson-utils'; +window.gju = gju; +import bootstrapselect from 'bootstrap-select'; +window.bootstrapselect = bootstrapselect; +import Handlebars from 'handlebars'; +window.Handlebars = Handlebars; +import barrating from 'jquery-bar-rating'; +window.barrating = barrating; +import polylinedecorator from 'leaflet-polylinedecorator'; +window.polylinedecorator = polylinedecorator; +import lightCarousel from 'lightslider'; +window.lightCarousel = lightCarousel; +import introjs from 'intro.js'; +window.introjs = introjs; +import pwstrengthmeter from 'password-strength-meter'; +window.pwstrengthmeter = pwstrengthmeter; +import jqueryMousewheel from 'jquery-mousewheel'; +window.jqueryMousewheel = jqueryMousewheel; +import Cookies from 'js-cookie'; +window.Cookies = Cookies; window.hull = require('hull.js'); // Find the 'hull' of a random set of points window.Offset = require('polygon-offset'); // Offsetting polygons to get a smooth padding around them window.Lang = require('lang.js'); // Javascript translations window.d3 = require('d3'); // v3.5.14 since Pather uses an out-of-date version -window.Pather = require('leaflet-pather'); +import Pather from 'leaflet-pather'; +window.Pather = Pather; // window.circleMenu = require('zikes-circlemenu'); -window.Noty = require('noty'); -window.Pickr = require('@simonwep/pickr'); -window.AntPath = require('leaflet-ant-path'); -window.Grapick = require('grapick'); -window.jqueryVisible = require('jquery-visible'); -window.simplebar = require('simplebar'); -window.Draggable = require('@shopify/draggable'); -window.autocomplete = require('bootstrap-4-autocomplete'); -window.toggle = require('bootstrap4-toggle'); -window.jarallax = require('jarallax/dist/jarallax.min'); -window.swipe = require('jquery-touchswipe'); -window.lazysizes = require('lazysizes'); -window.ionRangeSlider = require('ion-rangeslider'); - -require('@fortawesome/fontawesome-free'); +import Noty from 'noty'; +window.Noty = Noty; +import Pickr from '@simonwep/pickr'; +window.Pickr = Pickr; +import AntPath from 'leaflet-ant-path'; +window.AntPath = AntPath; +import Grapick from 'grapick'; +window.Grapick = Grapick; +import jqueryVisible from 'jquery-visible'; +window.jqueryVisible = jqueryVisible; +import simplebar from 'simplebar'; +window.simplebar = simplebar; +import Draggable from '@shopify/draggable'; +window.Draggable = Draggable; +import autocomplete from 'bootstrap-4-autocomplete'; +window.autocomplete = autocomplete; +import toggle from 'bootstrap4-toggle'; +window.toggle = toggle; +import jarallax from 'jarallax/dist/jarallax.min'; +window.jarallax = jarallax; +import swipe from 'jquery-touchswipe'; +window.swipe = swipe; +import lazysizes from 'lazysizes'; +window.lazysizes = lazysizes; +import ionRangeSlider from 'ion-rangeslider'; +window.ionRangeSlider = ionRangeSlider; + +import '@fortawesome/fontawesome-free'; window.axios.defaults.headers.common = { 'X-Requested-With': 'XMLHttpRequest' diff --git a/resources/assets/js/custom/dungeonmap.js b/resources/assets/js/custom/dungeonmap.jsx similarity index 100% rename from resources/assets/js/custom/dungeonmap.js rename to resources/assets/js/custom/dungeonmap.jsx diff --git a/resources/assets/js/custom/inline/common/maps/map.js b/resources/assets/js/custom/inline/common/maps/map.jsx similarity index 100% rename from resources/assets/js/custom/inline/common/maps/map.js rename to resources/assets/js/custom/inline/common/maps/map.jsx diff --git a/resources/assets/js/custom/inline/dungeonroute/table.js b/resources/assets/js/custom/inline/dungeonroute/table.jsx similarity index 100% rename from resources/assets/js/custom/inline/dungeonroute/table.js rename to resources/assets/js/custom/inline/dungeonroute/table.jsx diff --git a/resources/assets/js/custom/inline/inlinemanager.js b/resources/assets/js/custom/inline/inlinemanager.jsx similarity index 100% rename from resources/assets/js/custom/inline/inlinemanager.js rename to resources/assets/js/custom/inline/inlinemanager.jsx diff --git a/resources/assets/lib/wowhead/tooltips.js b/resources/assets/lib/wowhead/tooltips.jsx similarity index 100% rename from resources/assets/lib/wowhead/tooltips.js rename to resources/assets/lib/wowhead/tooltips.jsx diff --git a/resources/assets/vendor/l5-swagger/swagger-ui-bundle.js b/resources/assets/vendor/l5-swagger/swagger-ui-bundle.jsx similarity index 100% rename from resources/assets/vendor/l5-swagger/swagger-ui-bundle.js rename to resources/assets/vendor/l5-swagger/swagger-ui-bundle.jsx diff --git a/resources/assets/vendor/l5-swagger/swagger-ui-standalone-preset.js b/resources/assets/vendor/l5-swagger/swagger-ui-standalone-preset.jsx similarity index 100% rename from resources/assets/vendor/l5-swagger/swagger-ui-standalone-preset.js rename to resources/assets/vendor/l5-swagger/swagger-ui-standalone-preset.jsx diff --git a/vite.config.js b/vite.config.js new file mode 100644 index 0000000000..d7ebf7db08 --- /dev/null +++ b/vite.config.js @@ -0,0 +1,17 @@ +import { defineConfig } from 'vite'; +import laravel from 'laravel-vite-plugin'; + +export default defineConfig({ + plugins: [ + laravel({ + input: [ + 'resources/assets/sass/app.scss', + 'resources/assets/sass/custom/custom.scss', + 'resources/assets/sass/home.scss', + 'resources/assets/sass/theme/theme.scss', + 'resources/assets/js/app.js', + ], + refresh: true, + }), + ], +}); diff --git a/webpack.mix.js b/webpack.mix.js deleted file mode 100644 index e819726cc2..0000000000 --- a/webpack.mix.js +++ /dev/null @@ -1,334 +0,0 @@ -const mix = require('laravel-mix'); -const {GitRevisionPlugin} = require('git-revision-webpack-plugin'); -const WebpackShellPluginNext = require('webpack-shell-plugin-next'); - -// npm run dev --env.version -let version; -let gitRevisionPluginList = []; -if (typeof process.env.npm_config_output_version !== 'undefined' && - process.env.hasOwnProperty('npm_config_output_version') && - typeof process.env.npm_config_output_version !== 'undefined') { - version = process.env.npm_config_output_version; -} else { - let gitRevisionPlugin = new GitRevisionPlugin({ - versionCommand: 'rev-list HEAD -1' - }); - gitRevisionPluginList.push(gitRevisionPlugin); - version = gitRevisionPlugin.version(); - - // Write the version that's going to be used to file - const fs = require('node:fs'); - fs.writeFile('version', version, err => { - if (err) { - console.error(err); - } else { - // file written successfully - } - }); -} - -mix.options({ - // This dramatically speeds up the build process - adding new .scss for the redesign greatly increased build times without this - processCssUrls: false -}).webpackConfig({ - output: { - publicPath: '/', - }, - watchOptions: { - ignored: ['node_modules', 'vendor', 'storage'], - poll: 2000 // Check for changes every two seconds - }, - // Handlebars has a bug which requires this: https://github.com/wycats/handlebars.js/issues/1174 - resolve: { - alias: { - handlebars: 'handlebars/dist/handlebars.min.js' - } - }, - // Translations - module: { - rules: [{ - // Matches all PHP or JSON files in `resources/lang` directory. - test: /lang.+\.(php|json)$/, - loader: 'laravel-localization-loader', - }] - }, - plugins: [ - // Compile handlebars - new WebpackShellPluginNext({ - onBuildStart: { - scripts: [ - // Compile handlebars - 'handlebars ' + (mix.inProduction() ? '-m ' : '') + - 'resources/assets/js/handlebars/ -f resources/assets/js/handlebars.js' - ], - blocking: true, - parallel: false - }, - onBuildEnd: [] - }) - // Use git version to output our files - ].concat(gitRevisionPluginList) -}); - -/* - |-------------------------------------------------------------------------- - | Mix Asset Management - |-------------------------------------------------------------------------- - | - | Mix provides a clean, fluent API for defining some Webpack build steps - | for your Laravel application. By default, we are compiling the Sass - | file for the application as well as bundling up all the JS files. - | - */ - -// npm run dev --env.full true -// false if not defined, true if defined -let full = false; -if (typeof process.env.npm_config_full !== 'undefined' && - process.env.hasOwnProperty('npm_config_full') && - typeof process.env.npm_config_full !== 'undefined') { - full = process.env.npm_config_full; -} -// npm run dev --env.images false -let images = false; -if (typeof process.env.npm_config_images !== 'undefined' && - process.env.hasOwnProperty('npm_config_images') && - typeof process.env.npm_config_images !== 'undefined') { - images = process.env.npm_config_images; -} - -mix.copy('node_modules/@fortawesome/fontawesome-free/webfonts', 'public/webfonts'); -mix.copy('resources/assets/webfonts', 'public/webfonts'); -mix.copy('resources/assets/vendor/', 'public/vendor'); - -let precompile = [ - // Translations - 'resources/assets/js/messages.js' -]; - -mix.js(precompile, 'resources/assets/js/precompile.js'); - -let scripts = [ - // Include the precompiled scripts - 'public/resources/assets/js/precompile.js', - - // Pre-compiled handlebars - 'resources/assets/js/handlebars.js', - - // Home page only - 'resources/assets/js/custom/home.js', - // Doesn't depend on anything - 'resources/assets/js/custom/colorutil.js', - 'resources/assets/js/custom/util.js', - 'resources/assets/js/custom/constants.js', - - // Include in proper order - 'resources/assets/js/custom/signalable.js', - - // Map object groups - 'resources/assets/js/custom/mapobjectgroups/mapobjectgroup.js', - 'resources/assets/js/custom/mapobjectgroups/polygonmapobjectgroup.js', - 'resources/assets/js/custom/mapobjectgroups/polylinemapobjectgroup.js', - 'resources/assets/js/custom/mapobjectgroups/brushlinemapobjectgroup.js', - 'resources/assets/js/custom/mapobjectgroups/dungeonfloorswitchmarkermapobjectgroup.js', - 'resources/assets/js/custom/mapobjectgroups/enemymapobjectgroup.js', - 'resources/assets/js/custom/mapobjectgroups/enemypackmapobjectgroup.js', - 'resources/assets/js/custom/mapobjectgroups/enemypatrolmapobjectgroup.js', - 'resources/assets/js/custom/mapobjectgroups/killzonemapobjectgroup.js', - 'resources/assets/js/custom/mapobjectgroups/killzonepathmapobjectgroup.js', - 'resources/assets/js/custom/mapobjectgroups/pathmapobjectgroup.js', - 'resources/assets/js/custom/mapobjectgroups/mapiconmapobjectgroup.js', - 'resources/assets/js/custom/mapobjectgroups/usermousepositionmapobjectgroup.js', - 'resources/assets/js/custom/mapobjectgroups/mountableareamapobjectgroup.js', - 'resources/assets/js/custom/mapobjectgroups/floorunionmapobjectgroup.js', - 'resources/assets/js/custom/mapobjectgroups/floorunionareamapobjectgroup.js', - - // Depends on the above - 'resources/assets/js/custom/mapobjectgroups/mapobjectgroupmanager.js', - 'resources/assets/js/custom/enemyvisuals/enemyvisualmanager.js', - 'resources/assets/js/custom/enemyforces/enemyforcesmanager.js', - - // Map Context - 'resources/assets/js/custom/mapcontext/mapcontext.js', - 'resources/assets/js/custom/mapcontext/mapcontextdungeonroute.js', - 'resources/assets/js/custom/mapcontext/mapcontextlivesession.js', - 'resources/assets/js/custom/mapcontext/mapcontextmappingversion.js', - 'resources/assets/js/custom/mapcontext/mapcontextmappingversionedit.js', - 'resources/assets/js/custom/mapcontext/mapcontextdungeonexplore.js', - - // Depends on map object groups + Map Context - 'resources/assets/js/custom/statemanager.js', - - // Echo objects - 'resources/assets/js/custom/echo/echouser.js', - 'resources/assets/js/custom/echo/echo.js', - - // Echo messages - 'resources/assets/js/custom/echo/message/message.js', - 'resources/assets/js/custom/echo/message/listen/livesession/invite.js', - 'resources/assets/js/custom/echo/message/listen/livesession/stop.js', - 'resources/assets/js/custom/echo/message/listen/npc/changed.js', - 'resources/assets/js/custom/echo/message/listen/overpulledenemy/changed.js', - 'resources/assets/js/custom/echo/message/listen/overpulledenemy/deleted.js', - 'resources/assets/js/custom/echo/message/whisper/viewport.js', - 'resources/assets/js/custom/echo/message/whisper/mouseposition.js', - 'resources/assets/js/custom/echo/message/messagefactory.js', - - // Echo message handlers - 'resources/assets/js/custom/echo/messagehandler/messagehandler.js', - 'resources/assets/js/custom/echo/messagehandler/listen/colorchanged.js', - 'resources/assets/js/custom/echo/messagehandler/listen/livesession/invite.js', - 'resources/assets/js/custom/echo/messagehandler/listen/livesession/stop.js', - 'resources/assets/js/custom/echo/messagehandler/listen/overpulledenemy/changed.js', - 'resources/assets/js/custom/echo/messagehandler/listen/overpulledenemy/deleted.js', - 'resources/assets/js/custom/echo/messagehandler/listen/npc/changed.js', - 'resources/assets/js/custom/echo/messagehandler/listen/npc/deleted.js', - 'resources/assets/js/custom/echo/messagehandler/whisper/whispermessagehandler.js', - 'resources/assets/js/custom/echo/messagehandler/whisper/viewport.js', - 'resources/assets/js/custom/echo/messagehandler/whisper/mouseposition.js', - - // Depends on Echo - 'resources/assets/js/custom/dungeonmap.js', - 'resources/assets/js/custom/hotkeys.js', - - // Models - 'resources/assets/js/custom/models/static/mapicontype.js', - 'resources/assets/js/custom/models/static/spell.js', - 'resources/assets/js/custom/models/attribute.js', - 'resources/assets/js/custom/models/mapobject.js', - 'resources/assets/js/custom/models/versionablemapobject.js', - 'resources/assets/js/custom/models/polyline.js', - 'resources/assets/js/custom/models/enemy.js', - 'resources/assets/js/custom/models/pridefulenemy.js', - 'resources/assets/js/custom/models/enemypatrol.js', - 'resources/assets/js/custom/models/enemypack.js', - 'resources/assets/js/custom/models/path.js', - 'resources/assets/js/custom/models/killzone.js', - 'resources/assets/js/custom/models/killzonepath.js', - 'resources/assets/js/custom/models/icon.js', - 'resources/assets/js/custom/models/mapicon.js', - 'resources/assets/js/custom/models/mapiconawakenedobelisk.js', - 'resources/assets/js/custom/models/dungeonfloorswitchmarker.js', - 'resources/assets/js/custom/models/brushline.js', - 'resources/assets/js/custom/models/usermouseposition.js', - - 'resources/assets/js/custom/input/usermousepositionplayer.js', - - 'resources/assets/js/custom/mapstate/mapstate.js', - 'resources/assets/js/custom/mapstate/editmapstate.js', - 'resources/assets/js/custom/mapstate/deletemapstate.js', - 'resources/assets/js/custom/mapstate/pathermapstate.js', - 'resources/assets/js/custom/mapstate/mapobjectmapstate.js', - 'resources/assets/js/custom/mapstate/addkillzonemapstate.js', - 'resources/assets/js/custom/mapstate/addawakenedobeliskgatewaymapstate.js', - 'resources/assets/js/custom/mapstate/raidmarkerselectmapstate.js', - 'resources/assets/js/custom/mapstate/enemyselection/enemyselection.js', - 'resources/assets/js/custom/mapstate/enemyselection/editkillzoneenemyselection.js', - 'resources/assets/js/custom/mapstate/enemyselection/enemypatrolenemyselection.js', - 'resources/assets/js/custom/mapstate/enemyselection/mdtenemyselection.js', - 'resources/assets/js/custom/mapstate/enemyselection/selectkillzoneenemyselectionoverpull.js', - 'resources/assets/js/custom/mapstate/enemyselection/viewkillzoneenemyselection.js', - - 'resources/assets/js/custom/enemyvisuals/enemyvisual.js', - 'resources/assets/js/custom/enemyvisuals/enemyvisualicon.js', - 'resources/assets/js/custom/enemyvisuals/enemyvisualmain.js', - 'resources/assets/js/custom/enemyvisuals/enemyvisualmainenemyclass.js', - 'resources/assets/js/custom/enemyvisuals/enemyvisualmainenemyforces.js', - 'resources/assets/js/custom/enemyvisuals/enemyvisualmainenemyportrait.js', - 'resources/assets/js/custom/enemyvisuals/enemyvisualmainmdt.js', - 'resources/assets/js/custom/enemyvisuals/enemyvisualmainnpctype.js', - - 'resources/assets/js/custom/enemyvisuals/modifiers/modifier.js', - 'resources/assets/js/custom/enemyvisuals/modifiers/modifieractiveaura.js', - 'resources/assets/js/custom/enemyvisuals/modifiers/modifierclassification.js', - 'resources/assets/js/custom/enemyvisuals/modifiers/modifierraidmarker.js', - 'resources/assets/js/custom/enemyvisuals/modifiers/modifierteeming.js', - 'resources/assets/js/custom/enemyvisuals/modifiers/modifiertruesight.js', - - 'resources/assets/js/custom/mapcontrols/mapcontrol.js', - 'resources/assets/js/custom/mapcontrols/addisplaycontrols.js', - 'resources/assets/js/custom/mapcontrols/drawcontrols.js', - 'resources/assets/js/custom/mapcontrols/dungeonspeedrunrequirednpcscontrols.js', - 'resources/assets/js/custom/mapcontrols/echocontrols.js', - 'resources/assets/js/custom/mapcontrols/enemyforcescontrols.js', - 'resources/assets/js/custom/mapcontrols/enemyvisualcontrols.js', - 'resources/assets/js/custom/mapcontrols/factiondisplaycontrols.js', - - 'resources/assets/js/custom/admin/enemyattaching.js', - 'resources/assets/js/custom/admin/admindungeonmap.js', - 'resources/assets/js/custom/admin/adminenemy.js', - 'resources/assets/js/custom/admin/adminenemypack.js', - 'resources/assets/js/custom/admin/adminenemypatrol.js', - 'resources/assets/js/custom/admin/adminfloorunion.js', - 'resources/assets/js/custom/admin/adminfloorunionarea.js', - 'resources/assets/js/custom/admin/admindrawcontrols.js', - 'resources/assets/js/custom/admin/adminpanelcontrols.js', - 'resources/assets/js/custom/admin/admindungeonfloorswitchmarker.js', - 'resources/assets/js/custom/admin/adminmapicon.js', - 'resources/assets/js/custom/admin/adminmountablearea.js', - - // Inline code - 'resources/assets/js/custom/inline/inlinemanager.js', - 'resources/assets/js/custom/inline/inlinecode.js', - - // All inline code last - 'resources/assets/js/custom/inline/*/**/*.js', -]; - -// Output of files - -// Custom processing only -mix.styles(['resources/assets/css/**/*.css'], `public/css/custom-${version}.css`); - -// Do not translate in development -if (mix.inProduction()) { - mix.babel(scripts, `public/js/custom-${version}.js`); -} else { - mix.scripts(scripts, `public/js/custom-${version}.js`); -} - -mix.js('resources/assets/js/app.js', `public/js/app-${version}.js`) - .sass('resources/assets/sass/app.scss', `public/css/app-${version}.css`) - .sass('resources/assets/sass/theme/theme.scss', `public/css/theme-${version}.css`) - .sass('resources/assets/sass/home.scss', `public/css/home-${version}.css`) - .sass('resources/assets/sass/custom/custom.scss', `public/css/custom-compiled-${version}.css`) - // Lib processing - // .styles(['resources/assets/lib/**/*.css'], `public/css/lib-${version}.css`) - .babel('resources/assets/lib/**/*.js', `public/js/lib-${version}.js`); - -mix.sourceMaps(); - -if (images) { - // if (mix.inProduction()) { - // Copies all tiles as well which takes a while - // mix.copy('resources/assets/images', 'public/images'); - // } else { - // Allow import of pure JS - // mix.copy('resources/assets/js/custom', 'public/js/custom'); - - mix.copy('resources/assets/images/affixes', 'public/images/affixes'); - mix.copy('resources/assets/images/classes', 'public/images/classes'); - mix.copy('resources/assets/images/dungeons', 'public/images/dungeons'); - mix.copy('resources/assets/images/echo', 'public/images/echo'); - mix.copy('resources/assets/images/enemyclasses', 'public/images/enemyclasses'); - mix.copy('resources/assets/images/enemyclassifications', 'public/images/enemyclassifications'); - mix.copy('resources/assets/images/enemymodifiers', 'public/images/enemymodifiers'); - mix.copy('resources/assets/images/enemyportraits', 'public/images/enemyportraits'); - mix.copy('resources/assets/images/enemytypes', 'public/images/enemytypes'); - mix.copy('resources/assets/images/expansions', 'public/images/expansions'); - mix.copy('resources/assets/images/external', 'public/images/external'); - mix.copy('resources/assets/images/factions', 'public/images/factions'); - mix.copy('resources/assets/images/flags', 'public/images/flags'); - mix.copy('resources/assets/images/gameversions', 'public/images/gameversions'); - mix.copy('resources/assets/images/home', 'public/images/home'); - mix.copy('resources/assets/images/icon', 'public/images/icon'); - mix.copy('resources/assets/images/lib', 'public/images/lib'); - mix.copy('resources/assets/images/logo', 'public/images/logo'); - mix.copy('resources/assets/images/mapicon', 'public/images/mapicon'); - mix.copy('resources/assets/images/oauth', 'public/images/oauth'); - mix.copy('resources/assets/images/raidmarkers', 'public/images/raidmarkers'); - mix.copy('resources/assets/images/routeattributes', 'public/images/routeattributes'); - mix.copy('resources/assets/images/specializations', 'public/images/specializations'); - mix.copy('resources/assets/images/spells', 'public/images/spells'); - // } -}