diff --git a/package.json b/package.json new file mode 100644 index 000000000..939b6f073 --- /dev/null +++ b/package.json @@ -0,0 +1,57 @@ +{ + "name": "sapl-frontend", + "version": "0.1.0", + "private": true, + "scripts": { + "serve": "vue-cli-service serve", + "build": "vue-cli-service build", + "lint": "vue-cli-service lint" + }, + "dependencies": { + "@fortawesome/fontawesome-free": "^5.13.0", + "axios": "^0.19.2", + "axios-progress-bar": "^1.2.0", + "bootstrap": "^4.4.1", + "bootstrap-vue": "^2.12.0", + "diff": "^4.0.1", + "dotenv": "^6.2.0", + "exports-loader": "^0.7.0", + "imports-loader": "^0.8.0", + "jquery": "^3.5.1", + "jquery-mask-plugin": "^1.14.16", + "jquery-ui-themes": "^1.12.0", + "lodash": "^4.17.15", + "moment": "^2.24.0", + "moment-locales-webpack-plugin": "^1.1.2", + "popper.js": "^1.16.1", + "serialize-javascript": "^3.1.0", + "terser": "^4.6.11", + "tinymce": "^4.9.9", + "tinymce-light-skin": "^1.3.1", + "vue": "^2.6.11", + "webpack": "^4.43.0", + "webpack-jquery-ui": "^2.0.1", + "websocket-extensions": "^0.1.4" + }, + "devDependencies": { + "@vue/cli-plugin-babel": "^4.3.1", + "@vue/cli-plugin-eslint": "^4.3.1", + "@vue/cli-service": "^4.3.1", + "babel-eslint": "^10.1.0", + "compression-webpack-plugin": "^3.1.0", + "css-loader": "^3.5.2", + "eslint": "^6.8.0", + "eslint-config-standard": "^14.1.1", + "eslint-friendly-formatter": "^4.0.1", + "eslint-loader": "^4.0.0", + "eslint-plugin-import": "^2.20.2", + "eslint-plugin-node": "^11.1.0", + "eslint-plugin-promise": "^4.2.1", + "eslint-plugin-standard": "^4.0.1", + "eslint-plugin-vue": "^6.2.2", + "node-sass": "^4.13.1", + "sass-loader": "^8.0.2", + "vue-template-compiler": "^2.6.11", + "webpack-bundle-tracker": "^0.4.3" + } +} diff --git a/vue.config.js b/vue.config.js new file mode 100644 index 000000000..878b6f7b7 --- /dev/null +++ b/vue.config.js @@ -0,0 +1,141 @@ +const path = require('path') +const each = require('lodash/fp/each') + +const MomentLocalesPlugin = require('moment-locales-webpack-plugin') +const BundleTrackerPlugin = require('webpack-bundle-tracker') +const CompressionPlugin = require('compression-webpack-plugin') + +class RelativeBundleTrackerPlugin extends BundleTrackerPlugin { + convertPathChunks (chunks) { + each(each(chunk => { + chunk.path = path.relative(this.options.path, chunk.path) + }))(chunks) + } + + writeOutput (compiler, contents) { + if (contents.status === 'done') { + this.convertPathChunks(contents.chunks) + } + super.writeOutput(compiler, contents) + } +} +// module.exports = RelativeBundleTrackerPlugin + +const dotenv = require('dotenv') +dotenv.config({ + path: './sapl/.env' +}) + +var FRONTEND_CUSTOM = process.env.FRONTEND_CUSTOM === undefined ? false : process.env.FRONTEND_CUSTOM === 'True' + +var HOST_NAME = 'localhost' + +module.exports = { + runtimeCompiler: true, + publicPath: process.env.NODE_ENV === 'production' ? '/static/sapl/frontend' : `http://${HOST_NAME}:8080/`, + outputDir: FRONTEND_CUSTOM ? 'dist' : './sapl/static/sapl/frontend', + + chainWebpack: config => { + config.plugins.delete('html') + config.plugins.delete('preload') + config.plugins.delete('prefetch') + + config + .plugin('RelativeBundleTrackerPlugin') + .use(RelativeBundleTrackerPlugin, [{ + path: '.', + filename: FRONTEND_CUSTOM ? './webpack-stats.json' : './sapl/webpack-stats.json' + }]) + + config + .plugin('MomentLocalesPlugin') + .use(MomentLocalesPlugin, [{ + localesToKeep: ['pt-BR'] + }]) + + if (process.env.NODE_ENV === 'production') { + config.optimization.minimizer('terser').tap((args) => { + args[0].terserOptions.compress.drop_console = true + args[0].extractComments = true + args[0].cache = true + return args + }) + + config + .plugin('CompressionPlugin') + .use(CompressionPlugin, [{ + }]) + } else { + config + .devtool('source-map') + } + + config.resolve.alias + .set('__STATIC__', 'static') + + config.module + .rule('vue') + .use('vue-loader') + .loader('vue-loader') + .tap(options => { + options.transformAssetUrls = { + img: 'src', + image: 'xlink:href', + 'b-img': 'src', + 'b-img-lazy': ['src', 'blank-src'], + 'b-card': 'img-src', + 'b-card-img': 'img-src', + 'b-carousel-slide': 'img-src', + 'b-embed': 'src' + } + + return options + }) + + config.devServer + .public('') + .port(8080) + .hot(true) + .watchOptions({ + poll: true + }) + .watchContentBase(true) + .https(false) + .headers({ + 'Access-Control-Allow-Origin': '*' + }) + .contentBase([ + path.join(__dirname, 'public'), + path.join(__dirname, 'src', 'assets') + ]) + + config + .plugin('provide') + .use(require('webpack/lib/ProvidePlugin'), [{ + $: 'jquery', + jquery: 'jquery', + 'window.jQuery': 'jquery', + jQuery: 'jquery', + _: 'lodash' + }]) + + config.entryPoints.delete('app') + + config + .entry('global') + .add('./frontend/src/__global/main.js') + .end() + + config.entry('compilacao') + .add('./frontend/src/__apps/compilacao/main.js') + .end() + + config.entry('painel') + .add('./frontend/src/__apps/painel/main.js') + .end() + + config.entry('parlamentar') + .add('./frontend/src/__apps/parlamentar/main.js') + .end() + } +}