diff --git a/.eslintrc.js b/.eslintrc.cjs similarity index 100% rename from .eslintrc.js rename to .eslintrc.cjs diff --git a/babel.config.js b/babel.config.cjs similarity index 100% rename from babel.config.js rename to babel.config.cjs diff --git a/cypress.config.ts b/cypress.config.ts index 6f5440d8..028df27d 100644 --- a/cypress.config.ts +++ b/cypress.config.ts @@ -1,4 +1,5 @@ -import { defineConfig } from 'cypress' +import { defineConfig } from 'cypress'; +import setupPlugins from './tests/e2e/plugins/index.js'; export default defineConfig({ fixturesFolder: 'tests/e2e/fixtures', @@ -6,7 +7,7 @@ export default defineConfig({ videosFolder: 'tests/e2e/videos', e2e: { setupNodeEvents(on, config) { - return require('./tests/e2e/plugins/index.js')(on, config) + return setupPlugins(on, config); }, specPattern: 'tests/e2e/specs/**/*.cy.{js,jsx,ts,tsx}', supportFile: 'tests/e2e/support/index.js', diff --git a/inspected.js b/inspected.js new file mode 100644 index 00000000..114ff1e4 --- /dev/null +++ b/inspected.js @@ -0,0 +1,1374 @@ +{ + mode: 'development', + context: '/home/bob/user/dev/undergroundwires/privacy.sexy', + output: { + hashFunction: 'xxhash64', + path: '/home/bob/user/dev/undergroundwires/privacy.sexy/dist', + filename: 'js/[name].js', + publicPath: '/', + chunkFilename: 'js/[name].js' + }, + resolve: { + alias: { + '@': '/home/bob/user/dev/undergroundwires/privacy.sexy/src', + vue$: 'vue/dist/vue.runtime.esm.js', + '@tests': '/home/bob/user/dev/undergroundwires/privacy.sexy/tests' + }, + extensions: [ + '.tsx', + '.ts', + '.mjs', + '.js', + '.jsx', + '.vue', + '.json', + '.wasm' + ], + modules: [ + 'node_modules', + '/home/bob/user/dev/undergroundwires/privacy.sexy/node_modules', + '/home/bob/user/dev/undergroundwires/privacy.sexy/node_modules/@vue/cli-service/node_modules' + ], + fallback: { + os: false, + child_process: false, + fs: false, + path: false + } + }, + resolveLoader: { + modules: [ + '/home/bob/user/dev/undergroundwires/privacy.sexy/node_modules/@vue/cli-plugin-typescript/node_modules', + '/home/bob/user/dev/undergroundwires/privacy.sexy/node_modules/@vue/cli-plugin-babel/node_modules', + '/home/bob/user/dev/undergroundwires/privacy.sexy/node_modules/@vue/cli-service/lib/config/vue-loader-v15-resolve-compat', + 'node_modules', + '/home/bob/user/dev/undergroundwires/privacy.sexy/node_modules', + '/home/bob/user/dev/undergroundwires/privacy.sexy/node_modules/@vue/cli-service/node_modules' + ] + }, + module: { + noParse: /^(vue|vue-router|vuex|vuex-router-sync)$/, + rules: [ + /* config.module.rule('esm') */ + { + test: /\.m?jsx?$/, + resolve: { + fullySpecified: false + } + }, + /* config.module.rule('vue') */ + { + test: /\.vue$/, + use: [ + /* config.module.rule('vue').use('vue-loader') */ + { + loader: '/home/bob/user/dev/undergroundwires/privacy.sexy/node_modules/@vue/vue-loader-v15/lib/index.js', + options: { + compilerOptions: { + whitespace: 'condense' + } + } + } + ] + }, + /* config.module.rule('vue-style') */ + { + test: /\.vue$/, + resourceQuery: /type=style/, + sideEffects: true + }, + /* config.module.rule('pug') */ + { + test: /\.pug$/, + oneOf: [ + /* config.module.rule('pug').oneOf('pug-vue') */ + { + resourceQuery: /vue/, + use: [ + /* config.module.rule('pug').oneOf('pug-vue').use('pug-plain-loader') */ + { + loader: 'pug-plain-loader' + } + ] + }, + /* config.module.rule('pug').oneOf('pug-template') */ + { + use: [ + /* config.module.rule('pug').oneOf('pug-template').use('raw') */ + { + loader: 'raw-loader' + }, + /* config.module.rule('pug').oneOf('pug-template').use('pug-plain-loader') */ + { + loader: 'pug-plain-loader' + } + ] + } + ] + }, + /* config.module.rule('svg') */ + { + test: /\.(svg)(\?.*)?$/, + type: 'asset/resource', + generator: { + filename: 'img/[name].[hash:8][ext]' + } + }, + /* config.module.rule('images') */ + { + test: /\.(png|jpe?g|gif|webp|avif)(\?.*)?$/, + type: 'asset', + generator: { + filename: 'img/[name].[hash:8][ext]' + } + }, + /* config.module.rule('media') */ + { + test: /\.(mp4|webm|ogg|mp3|wav|flac|aac)(\?.*)?$/, + type: 'asset', + generator: { + filename: 'media/[name].[hash:8][ext]' + } + }, + /* config.module.rule('fonts') */ + { + test: /\.(woff2?|eot|ttf|otf)(\?.*)?$/i, + type: 'asset', + generator: { + filename: 'fonts/[name].[hash:8][ext]' + } + }, + /* config.module.rule('css') */ + { + test: /\.css$/, + oneOf: [ + /* config.module.rule('css').oneOf('vue-modules') */ + { + resourceQuery: /module/, + use: [ + /* config.module.rule('css').oneOf('vue-modules').use('vue-style-loader') */ + { + loader: '/home/bob/user/dev/undergroundwires/privacy.sexy/node_modules/vue-style-loader/index.js', + options: { + sourceMap: false, + shadowMode: false + } + }, + /* config.module.rule('css').oneOf('vue-modules').use('css-loader') */ + { + loader: '/home/bob/user/dev/undergroundwires/privacy.sexy/node_modules/css-loader/dist/cjs.js', + options: { + sourceMap: false, + importLoaders: 2, + modules: { + localIdentName: '[name]_[local]_[hash:base64:5]', + auto: () => true + } + } + }, + /* config.module.rule('css').oneOf('vue-modules').use('postcss-loader') */ + { + loader: '/home/bob/user/dev/undergroundwires/privacy.sexy/node_modules/postcss-loader/dist/cjs.js', + options: { + sourceMap: false, + postcssOptions: { + plugins: [ + function () { /* omitted long function */ } + ] + } + } + } + ] + }, + /* config.module.rule('css').oneOf('vue') */ + { + resourceQuery: /\?vue/, + use: [ + /* config.module.rule('css').oneOf('vue').use('vue-style-loader') */ + { + loader: '/home/bob/user/dev/undergroundwires/privacy.sexy/node_modules/vue-style-loader/index.js', + options: { + sourceMap: false, + shadowMode: false + } + }, + /* config.module.rule('css').oneOf('vue').use('css-loader') */ + { + loader: '/home/bob/user/dev/undergroundwires/privacy.sexy/node_modules/css-loader/dist/cjs.js', + options: { + sourceMap: false, + importLoaders: 2 + } + }, + /* config.module.rule('css').oneOf('vue').use('postcss-loader') */ + { + loader: '/home/bob/user/dev/undergroundwires/privacy.sexy/node_modules/postcss-loader/dist/cjs.js', + options: { + sourceMap: false, + postcssOptions: { + plugins: [ + function () { /* omitted long function */ } + ] + } + } + } + ] + }, + /* config.module.rule('css').oneOf('normal-modules') */ + { + test: /\.module\.\w+$/, + use: [ + /* config.module.rule('css').oneOf('normal-modules').use('vue-style-loader') */ + { + loader: '/home/bob/user/dev/undergroundwires/privacy.sexy/node_modules/vue-style-loader/index.js', + options: { + sourceMap: false, + shadowMode: false + } + }, + /* config.module.rule('css').oneOf('normal-modules').use('css-loader') */ + { + loader: '/home/bob/user/dev/undergroundwires/privacy.sexy/node_modules/css-loader/dist/cjs.js', + options: { + sourceMap: false, + importLoaders: 2 + } + }, + /* config.module.rule('css').oneOf('normal-modules').use('postcss-loader') */ + { + loader: '/home/bob/user/dev/undergroundwires/privacy.sexy/node_modules/postcss-loader/dist/cjs.js', + options: { + sourceMap: false, + postcssOptions: { + plugins: [ + function () { /* omitted long function */ } + ] + } + } + } + ] + }, + /* config.module.rule('css').oneOf('normal') */ + { + use: [ + /* config.module.rule('css').oneOf('normal').use('vue-style-loader') */ + { + loader: '/home/bob/user/dev/undergroundwires/privacy.sexy/node_modules/vue-style-loader/index.js', + options: { + sourceMap: false, + shadowMode: false + } + }, + /* config.module.rule('css').oneOf('normal').use('css-loader') */ + { + loader: '/home/bob/user/dev/undergroundwires/privacy.sexy/node_modules/css-loader/dist/cjs.js', + options: { + sourceMap: false, + importLoaders: 2 + } + }, + /* config.module.rule('css').oneOf('normal').use('postcss-loader') */ + { + loader: '/home/bob/user/dev/undergroundwires/privacy.sexy/node_modules/postcss-loader/dist/cjs.js', + options: { + sourceMap: false, + postcssOptions: { + plugins: [ + function () { /* omitted long function */ } + ] + } + } + } + ] + } + ] + }, + /* config.module.rule('postcss') */ + { + test: /\.p(ost)?css$/, + oneOf: [ + /* config.module.rule('postcss').oneOf('vue-modules') */ + { + resourceQuery: /module/, + use: [ + /* config.module.rule('postcss').oneOf('vue-modules').use('vue-style-loader') */ + { + loader: '/home/bob/user/dev/undergroundwires/privacy.sexy/node_modules/vue-style-loader/index.js', + options: { + sourceMap: false, + shadowMode: false + } + }, + /* config.module.rule('postcss').oneOf('vue-modules').use('css-loader') */ + { + loader: '/home/bob/user/dev/undergroundwires/privacy.sexy/node_modules/css-loader/dist/cjs.js', + options: { + sourceMap: false, + importLoaders: 2, + modules: { + localIdentName: '[name]_[local]_[hash:base64:5]', + auto: () => true + } + } + }, + /* config.module.rule('postcss').oneOf('vue-modules').use('postcss-loader') */ + { + loader: '/home/bob/user/dev/undergroundwires/privacy.sexy/node_modules/postcss-loader/dist/cjs.js', + options: { + sourceMap: false, + postcssOptions: { + plugins: [ + function () { /* omitted long function */ } + ] + } + } + } + ] + }, + /* config.module.rule('postcss').oneOf('vue') */ + { + resourceQuery: /\?vue/, + use: [ + /* config.module.rule('postcss').oneOf('vue').use('vue-style-loader') */ + { + loader: '/home/bob/user/dev/undergroundwires/privacy.sexy/node_modules/vue-style-loader/index.js', + options: { + sourceMap: false, + shadowMode: false + } + }, + /* config.module.rule('postcss').oneOf('vue').use('css-loader') */ + { + loader: '/home/bob/user/dev/undergroundwires/privacy.sexy/node_modules/css-loader/dist/cjs.js', + options: { + sourceMap: false, + importLoaders: 2 + } + }, + /* config.module.rule('postcss').oneOf('vue').use('postcss-loader') */ + { + loader: '/home/bob/user/dev/undergroundwires/privacy.sexy/node_modules/postcss-loader/dist/cjs.js', + options: { + sourceMap: false, + postcssOptions: { + plugins: [ + function () { /* omitted long function */ } + ] + } + } + } + ] + }, + /* config.module.rule('postcss').oneOf('normal-modules') */ + { + test: /\.module\.\w+$/, + use: [ + /* config.module.rule('postcss').oneOf('normal-modules').use('vue-style-loader') */ + { + loader: '/home/bob/user/dev/undergroundwires/privacy.sexy/node_modules/vue-style-loader/index.js', + options: { + sourceMap: false, + shadowMode: false + } + }, + /* config.module.rule('postcss').oneOf('normal-modules').use('css-loader') */ + { + loader: '/home/bob/user/dev/undergroundwires/privacy.sexy/node_modules/css-loader/dist/cjs.js', + options: { + sourceMap: false, + importLoaders: 2 + } + }, + /* config.module.rule('postcss').oneOf('normal-modules').use('postcss-loader') */ + { + loader: '/home/bob/user/dev/undergroundwires/privacy.sexy/node_modules/postcss-loader/dist/cjs.js', + options: { + sourceMap: false, + postcssOptions: { + plugins: [ + function () { /* omitted long function */ } + ] + } + } + } + ] + }, + /* config.module.rule('postcss').oneOf('normal') */ + { + use: [ + /* config.module.rule('postcss').oneOf('normal').use('vue-style-loader') */ + { + loader: '/home/bob/user/dev/undergroundwires/privacy.sexy/node_modules/vue-style-loader/index.js', + options: { + sourceMap: false, + shadowMode: false + } + }, + /* config.module.rule('postcss').oneOf('normal').use('css-loader') */ + { + loader: '/home/bob/user/dev/undergroundwires/privacy.sexy/node_modules/css-loader/dist/cjs.js', + options: { + sourceMap: false, + importLoaders: 2 + } + }, + /* config.module.rule('postcss').oneOf('normal').use('postcss-loader') */ + { + loader: '/home/bob/user/dev/undergroundwires/privacy.sexy/node_modules/postcss-loader/dist/cjs.js', + options: { + sourceMap: false, + postcssOptions: { + plugins: [ + function () { /* omitted long function */ } + ] + } + } + } + ] + } + ] + }, + /* config.module.rule('scss') */ + { + test: /\.scss$/, + oneOf: [ + /* config.module.rule('scss').oneOf('vue-modules') */ + { + resourceQuery: /module/, + use: [ + /* config.module.rule('scss').oneOf('vue-modules').use('vue-style-loader') */ + { + loader: '/home/bob/user/dev/undergroundwires/privacy.sexy/node_modules/vue-style-loader/index.js', + options: { + sourceMap: false, + shadowMode: false + } + }, + /* config.module.rule('scss').oneOf('vue-modules').use('css-loader') */ + { + loader: '/home/bob/user/dev/undergroundwires/privacy.sexy/node_modules/css-loader/dist/cjs.js', + options: { + sourceMap: false, + importLoaders: 2, + modules: { + localIdentName: '[name]_[local]_[hash:base64:5]', + auto: () => true + } + } + }, + /* config.module.rule('scss').oneOf('vue-modules').use('postcss-loader') */ + { + loader: '/home/bob/user/dev/undergroundwires/privacy.sexy/node_modules/postcss-loader/dist/cjs.js', + options: { + sourceMap: false, + postcssOptions: { + plugins: [ + function () { /* omitted long function */ } + ] + } + } + }, + /* config.module.rule('scss').oneOf('vue-modules').use('sass-loader') */ + { + loader: '/home/bob/user/dev/undergroundwires/privacy.sexy/node_modules/sass-loader/dist/cjs.js', + options: { + sourceMap: false + } + } + ] + }, + /* config.module.rule('scss').oneOf('vue') */ + { + resourceQuery: /\?vue/, + use: [ + /* config.module.rule('scss').oneOf('vue').use('vue-style-loader') */ + { + loader: '/home/bob/user/dev/undergroundwires/privacy.sexy/node_modules/vue-style-loader/index.js', + options: { + sourceMap: false, + shadowMode: false + } + }, + /* config.module.rule('scss').oneOf('vue').use('css-loader') */ + { + loader: '/home/bob/user/dev/undergroundwires/privacy.sexy/node_modules/css-loader/dist/cjs.js', + options: { + sourceMap: false, + importLoaders: 2 + } + }, + /* config.module.rule('scss').oneOf('vue').use('postcss-loader') */ + { + loader: '/home/bob/user/dev/undergroundwires/privacy.sexy/node_modules/postcss-loader/dist/cjs.js', + options: { + sourceMap: false, + postcssOptions: { + plugins: [ + function () { /* omitted long function */ } + ] + } + } + }, + /* config.module.rule('scss').oneOf('vue').use('sass-loader') */ + { + loader: '/home/bob/user/dev/undergroundwires/privacy.sexy/node_modules/sass-loader/dist/cjs.js', + options: { + sourceMap: false + } + } + ] + }, + /* config.module.rule('scss').oneOf('normal-modules') */ + { + test: /\.module\.\w+$/, + use: [ + /* config.module.rule('scss').oneOf('normal-modules').use('vue-style-loader') */ + { + loader: '/home/bob/user/dev/undergroundwires/privacy.sexy/node_modules/vue-style-loader/index.js', + options: { + sourceMap: false, + shadowMode: false + } + }, + /* config.module.rule('scss').oneOf('normal-modules').use('css-loader') */ + { + loader: '/home/bob/user/dev/undergroundwires/privacy.sexy/node_modules/css-loader/dist/cjs.js', + options: { + sourceMap: false, + importLoaders: 2 + } + }, + /* config.module.rule('scss').oneOf('normal-modules').use('postcss-loader') */ + { + loader: '/home/bob/user/dev/undergroundwires/privacy.sexy/node_modules/postcss-loader/dist/cjs.js', + options: { + sourceMap: false, + postcssOptions: { + plugins: [ + function () { /* omitted long function */ } + ] + } + } + }, + /* config.module.rule('scss').oneOf('normal-modules').use('sass-loader') */ + { + loader: '/home/bob/user/dev/undergroundwires/privacy.sexy/node_modules/sass-loader/dist/cjs.js', + options: { + sourceMap: false + } + } + ] + }, + /* config.module.rule('scss').oneOf('normal') */ + { + use: [ + /* config.module.rule('scss').oneOf('normal').use('vue-style-loader') */ + { + loader: '/home/bob/user/dev/undergroundwires/privacy.sexy/node_modules/vue-style-loader/index.js', + options: { + sourceMap: false, + shadowMode: false + } + }, + /* config.module.rule('scss').oneOf('normal').use('css-loader') */ + { + loader: '/home/bob/user/dev/undergroundwires/privacy.sexy/node_modules/css-loader/dist/cjs.js', + options: { + sourceMap: false, + importLoaders: 2 + } + }, + /* config.module.rule('scss').oneOf('normal').use('postcss-loader') */ + { + loader: '/home/bob/user/dev/undergroundwires/privacy.sexy/node_modules/postcss-loader/dist/cjs.js', + options: { + sourceMap: false, + postcssOptions: { + plugins: [ + function () { /* omitted long function */ } + ] + } + } + }, + /* config.module.rule('scss').oneOf('normal').use('sass-loader') */ + { + loader: '/home/bob/user/dev/undergroundwires/privacy.sexy/node_modules/sass-loader/dist/cjs.js', + options: { + sourceMap: false + } + } + ] + } + ] + }, + /* config.module.rule('sass') */ + { + test: /\.sass$/, + oneOf: [ + /* config.module.rule('sass').oneOf('vue-modules') */ + { + resourceQuery: /module/, + use: [ + /* config.module.rule('sass').oneOf('vue-modules').use('vue-style-loader') */ + { + loader: '/home/bob/user/dev/undergroundwires/privacy.sexy/node_modules/vue-style-loader/index.js', + options: { + sourceMap: false, + shadowMode: false + } + }, + /* config.module.rule('sass').oneOf('vue-modules').use('css-loader') */ + { + loader: '/home/bob/user/dev/undergroundwires/privacy.sexy/node_modules/css-loader/dist/cjs.js', + options: { + sourceMap: false, + importLoaders: 2, + modules: { + localIdentName: '[name]_[local]_[hash:base64:5]', + auto: () => true + } + } + }, + /* config.module.rule('sass').oneOf('vue-modules').use('postcss-loader') */ + { + loader: '/home/bob/user/dev/undergroundwires/privacy.sexy/node_modules/postcss-loader/dist/cjs.js', + options: { + sourceMap: false, + postcssOptions: { + plugins: [ + function () { /* omitted long function */ } + ] + } + } + }, + /* config.module.rule('sass').oneOf('vue-modules').use('sass-loader') */ + { + loader: '/home/bob/user/dev/undergroundwires/privacy.sexy/node_modules/sass-loader/dist/cjs.js', + options: { + sourceMap: false, + sassOptions: { + indentedSyntax: true + } + } + } + ] + }, + /* config.module.rule('sass').oneOf('vue') */ + { + resourceQuery: /\?vue/, + use: [ + /* config.module.rule('sass').oneOf('vue').use('vue-style-loader') */ + { + loader: '/home/bob/user/dev/undergroundwires/privacy.sexy/node_modules/vue-style-loader/index.js', + options: { + sourceMap: false, + shadowMode: false + } + }, + /* config.module.rule('sass').oneOf('vue').use('css-loader') */ + { + loader: '/home/bob/user/dev/undergroundwires/privacy.sexy/node_modules/css-loader/dist/cjs.js', + options: { + sourceMap: false, + importLoaders: 2 + } + }, + /* config.module.rule('sass').oneOf('vue').use('postcss-loader') */ + { + loader: '/home/bob/user/dev/undergroundwires/privacy.sexy/node_modules/postcss-loader/dist/cjs.js', + options: { + sourceMap: false, + postcssOptions: { + plugins: [ + function () { /* omitted long function */ } + ] + } + } + }, + /* config.module.rule('sass').oneOf('vue').use('sass-loader') */ + { + loader: '/home/bob/user/dev/undergroundwires/privacy.sexy/node_modules/sass-loader/dist/cjs.js', + options: { + sourceMap: false, + sassOptions: { + indentedSyntax: true + } + } + } + ] + }, + /* config.module.rule('sass').oneOf('normal-modules') */ + { + test: /\.module\.\w+$/, + use: [ + /* config.module.rule('sass').oneOf('normal-modules').use('vue-style-loader') */ + { + loader: '/home/bob/user/dev/undergroundwires/privacy.sexy/node_modules/vue-style-loader/index.js', + options: { + sourceMap: false, + shadowMode: false + } + }, + /* config.module.rule('sass').oneOf('normal-modules').use('css-loader') */ + { + loader: '/home/bob/user/dev/undergroundwires/privacy.sexy/node_modules/css-loader/dist/cjs.js', + options: { + sourceMap: false, + importLoaders: 2 + } + }, + /* config.module.rule('sass').oneOf('normal-modules').use('postcss-loader') */ + { + loader: '/home/bob/user/dev/undergroundwires/privacy.sexy/node_modules/postcss-loader/dist/cjs.js', + options: { + sourceMap: false, + postcssOptions: { + plugins: [ + function () { /* omitted long function */ } + ] + } + } + }, + /* config.module.rule('sass').oneOf('normal-modules').use('sass-loader') */ + { + loader: '/home/bob/user/dev/undergroundwires/privacy.sexy/node_modules/sass-loader/dist/cjs.js', + options: { + sourceMap: false, + sassOptions: { + indentedSyntax: true + } + } + } + ] + }, + /* config.module.rule('sass').oneOf('normal') */ + { + use: [ + /* config.module.rule('sass').oneOf('normal').use('vue-style-loader') */ + { + loader: '/home/bob/user/dev/undergroundwires/privacy.sexy/node_modules/vue-style-loader/index.js', + options: { + sourceMap: false, + shadowMode: false + } + }, + /* config.module.rule('sass').oneOf('normal').use('css-loader') */ + { + loader: '/home/bob/user/dev/undergroundwires/privacy.sexy/node_modules/css-loader/dist/cjs.js', + options: { + sourceMap: false, + importLoaders: 2 + } + }, + /* config.module.rule('sass').oneOf('normal').use('postcss-loader') */ + { + loader: '/home/bob/user/dev/undergroundwires/privacy.sexy/node_modules/postcss-loader/dist/cjs.js', + options: { + sourceMap: false, + postcssOptions: { + plugins: [ + function () { /* omitted long function */ } + ] + } + } + }, + /* config.module.rule('sass').oneOf('normal').use('sass-loader') */ + { + loader: '/home/bob/user/dev/undergroundwires/privacy.sexy/node_modules/sass-loader/dist/cjs.js', + options: { + sourceMap: false, + sassOptions: { + indentedSyntax: true + } + } + } + ] + } + ] + }, + /* config.module.rule('less') */ + { + test: /\.less$/, + oneOf: [ + /* config.module.rule('less').oneOf('vue-modules') */ + { + resourceQuery: /module/, + use: [ + /* config.module.rule('less').oneOf('vue-modules').use('vue-style-loader') */ + { + loader: '/home/bob/user/dev/undergroundwires/privacy.sexy/node_modules/vue-style-loader/index.js', + options: { + sourceMap: false, + shadowMode: false + } + }, + /* config.module.rule('less').oneOf('vue-modules').use('css-loader') */ + { + loader: '/home/bob/user/dev/undergroundwires/privacy.sexy/node_modules/css-loader/dist/cjs.js', + options: { + sourceMap: false, + importLoaders: 2, + modules: { + localIdentName: '[name]_[local]_[hash:base64:5]', + auto: () => true + } + } + }, + /* config.module.rule('less').oneOf('vue-modules').use('postcss-loader') */ + { + loader: '/home/bob/user/dev/undergroundwires/privacy.sexy/node_modules/postcss-loader/dist/cjs.js', + options: { + sourceMap: false, + postcssOptions: { + plugins: [ + function () { /* omitted long function */ } + ] + } + } + }, + /* config.module.rule('less').oneOf('vue-modules').use('less-loader') */ + { + loader: 'less-loader', + options: { + sourceMap: false + } + } + ] + }, + /* config.module.rule('less').oneOf('vue') */ + { + resourceQuery: /\?vue/, + use: [ + /* config.module.rule('less').oneOf('vue').use('vue-style-loader') */ + { + loader: '/home/bob/user/dev/undergroundwires/privacy.sexy/node_modules/vue-style-loader/index.js', + options: { + sourceMap: false, + shadowMode: false + } + }, + /* config.module.rule('less').oneOf('vue').use('css-loader') */ + { + loader: '/home/bob/user/dev/undergroundwires/privacy.sexy/node_modules/css-loader/dist/cjs.js', + options: { + sourceMap: false, + importLoaders: 2 + } + }, + /* config.module.rule('less').oneOf('vue').use('postcss-loader') */ + { + loader: '/home/bob/user/dev/undergroundwires/privacy.sexy/node_modules/postcss-loader/dist/cjs.js', + options: { + sourceMap: false, + postcssOptions: { + plugins: [ + function () { /* omitted long function */ } + ] + } + } + }, + /* config.module.rule('less').oneOf('vue').use('less-loader') */ + { + loader: 'less-loader', + options: { + sourceMap: false + } + } + ] + }, + /* config.module.rule('less').oneOf('normal-modules') */ + { + test: /\.module\.\w+$/, + use: [ + /* config.module.rule('less').oneOf('normal-modules').use('vue-style-loader') */ + { + loader: '/home/bob/user/dev/undergroundwires/privacy.sexy/node_modules/vue-style-loader/index.js', + options: { + sourceMap: false, + shadowMode: false + } + }, + /* config.module.rule('less').oneOf('normal-modules').use('css-loader') */ + { + loader: '/home/bob/user/dev/undergroundwires/privacy.sexy/node_modules/css-loader/dist/cjs.js', + options: { + sourceMap: false, + importLoaders: 2 + } + }, + /* config.module.rule('less').oneOf('normal-modules').use('postcss-loader') */ + { + loader: '/home/bob/user/dev/undergroundwires/privacy.sexy/node_modules/postcss-loader/dist/cjs.js', + options: { + sourceMap: false, + postcssOptions: { + plugins: [ + function () { /* omitted long function */ } + ] + } + } + }, + /* config.module.rule('less').oneOf('normal-modules').use('less-loader') */ + { + loader: 'less-loader', + options: { + sourceMap: false + } + } + ] + }, + /* config.module.rule('less').oneOf('normal') */ + { + use: [ + /* config.module.rule('less').oneOf('normal').use('vue-style-loader') */ + { + loader: '/home/bob/user/dev/undergroundwires/privacy.sexy/node_modules/vue-style-loader/index.js', + options: { + sourceMap: false, + shadowMode: false + } + }, + /* config.module.rule('less').oneOf('normal').use('css-loader') */ + { + loader: '/home/bob/user/dev/undergroundwires/privacy.sexy/node_modules/css-loader/dist/cjs.js', + options: { + sourceMap: false, + importLoaders: 2 + } + }, + /* config.module.rule('less').oneOf('normal').use('postcss-loader') */ + { + loader: '/home/bob/user/dev/undergroundwires/privacy.sexy/node_modules/postcss-loader/dist/cjs.js', + options: { + sourceMap: false, + postcssOptions: { + plugins: [ + function () { /* omitted long function */ } + ] + } + } + }, + /* config.module.rule('less').oneOf('normal').use('less-loader') */ + { + loader: 'less-loader', + options: { + sourceMap: false + } + } + ] + } + ] + }, + /* config.module.rule('stylus') */ + { + test: /\.styl(us)?$/, + oneOf: [ + /* config.module.rule('stylus').oneOf('vue-modules') */ + { + resourceQuery: /module/, + use: [ + /* config.module.rule('stylus').oneOf('vue-modules').use('vue-style-loader') */ + { + loader: '/home/bob/user/dev/undergroundwires/privacy.sexy/node_modules/vue-style-loader/index.js', + options: { + sourceMap: false, + shadowMode: false + } + }, + /* config.module.rule('stylus').oneOf('vue-modules').use('css-loader') */ + { + loader: '/home/bob/user/dev/undergroundwires/privacy.sexy/node_modules/css-loader/dist/cjs.js', + options: { + sourceMap: false, + importLoaders: 2, + modules: { + localIdentName: '[name]_[local]_[hash:base64:5]', + auto: () => true + } + } + }, + /* config.module.rule('stylus').oneOf('vue-modules').use('postcss-loader') */ + { + loader: '/home/bob/user/dev/undergroundwires/privacy.sexy/node_modules/postcss-loader/dist/cjs.js', + options: { + sourceMap: false, + postcssOptions: { + plugins: [ + function () { /* omitted long function */ } + ] + } + } + }, + /* config.module.rule('stylus').oneOf('vue-modules').use('stylus-loader') */ + { + loader: 'stylus-loader', + options: { + sourceMap: false + } + } + ] + }, + /* config.module.rule('stylus').oneOf('vue') */ + { + resourceQuery: /\?vue/, + use: [ + /* config.module.rule('stylus').oneOf('vue').use('vue-style-loader') */ + { + loader: '/home/bob/user/dev/undergroundwires/privacy.sexy/node_modules/vue-style-loader/index.js', + options: { + sourceMap: false, + shadowMode: false + } + }, + /* config.module.rule('stylus').oneOf('vue').use('css-loader') */ + { + loader: '/home/bob/user/dev/undergroundwires/privacy.sexy/node_modules/css-loader/dist/cjs.js', + options: { + sourceMap: false, + importLoaders: 2 + } + }, + /* config.module.rule('stylus').oneOf('vue').use('postcss-loader') */ + { + loader: '/home/bob/user/dev/undergroundwires/privacy.sexy/node_modules/postcss-loader/dist/cjs.js', + options: { + sourceMap: false, + postcssOptions: { + plugins: [ + function () { /* omitted long function */ } + ] + } + } + }, + /* config.module.rule('stylus').oneOf('vue').use('stylus-loader') */ + { + loader: 'stylus-loader', + options: { + sourceMap: false + } + } + ] + }, + /* config.module.rule('stylus').oneOf('normal-modules') */ + { + test: /\.module\.\w+$/, + use: [ + /* config.module.rule('stylus').oneOf('normal-modules').use('vue-style-loader') */ + { + loader: '/home/bob/user/dev/undergroundwires/privacy.sexy/node_modules/vue-style-loader/index.js', + options: { + sourceMap: false, + shadowMode: false + } + }, + /* config.module.rule('stylus').oneOf('normal-modules').use('css-loader') */ + { + loader: '/home/bob/user/dev/undergroundwires/privacy.sexy/node_modules/css-loader/dist/cjs.js', + options: { + sourceMap: false, + importLoaders: 2 + } + }, + /* config.module.rule('stylus').oneOf('normal-modules').use('postcss-loader') */ + { + loader: '/home/bob/user/dev/undergroundwires/privacy.sexy/node_modules/postcss-loader/dist/cjs.js', + options: { + sourceMap: false, + postcssOptions: { + plugins: [ + function () { /* omitted long function */ } + ] + } + } + }, + /* config.module.rule('stylus').oneOf('normal-modules').use('stylus-loader') */ + { + loader: 'stylus-loader', + options: { + sourceMap: false + } + } + ] + }, + /* config.module.rule('stylus').oneOf('normal') */ + { + use: [ + /* config.module.rule('stylus').oneOf('normal').use('vue-style-loader') */ + { + loader: '/home/bob/user/dev/undergroundwires/privacy.sexy/node_modules/vue-style-loader/index.js', + options: { + sourceMap: false, + shadowMode: false + } + }, + /* config.module.rule('stylus').oneOf('normal').use('css-loader') */ + { + loader: '/home/bob/user/dev/undergroundwires/privacy.sexy/node_modules/css-loader/dist/cjs.js', + options: { + sourceMap: false, + importLoaders: 2 + } + }, + /* config.module.rule('stylus').oneOf('normal').use('postcss-loader') */ + { + loader: '/home/bob/user/dev/undergroundwires/privacy.sexy/node_modules/postcss-loader/dist/cjs.js', + options: { + sourceMap: false, + postcssOptions: { + plugins: [ + function () { /* omitted long function */ } + ] + } + } + }, + /* config.module.rule('stylus').oneOf('normal').use('stylus-loader') */ + { + loader: 'stylus-loader', + options: { + sourceMap: false + } + } + ] + } + ] + }, + /* config.module.rule('js') */ + { + test: /\.m?jsx?$/, + exclude: [ + function () { /* omitted long function */ } + ], + use: [ + /* config.module.rule('js').use('babel-loader') */ + { + loader: '/home/bob/user/dev/undergroundwires/privacy.sexy/node_modules/babel-loader/lib/index.js', + options: { + cacheCompression: false, + cacheDirectory: '/home/bob/user/dev/undergroundwires/privacy.sexy/node_modules/.cache/babel-loader', + cacheIdentifier: '5e3f2d5e' + } + } + ] + }, + /* config.module.rule('ts') */ + { + test: /\.ts$/, + use: [ + /* config.module.rule('ts').use('babel-loader') */ + { + loader: '/home/bob/user/dev/undergroundwires/privacy.sexy/node_modules/babel-loader/lib/index.js' + }, + /* config.module.rule('ts').use('ts-loader') */ + { + loader: '/home/bob/user/dev/undergroundwires/privacy.sexy/node_modules/ts-loader/index.js', + options: { + transpileOnly: true, + appendTsSuffixTo: [ + '\\.vue$' + ], + happyPackMode: false + } + } + ] + }, + /* config.module.rule('tsx') */ + { + test: /\.tsx$/, + use: [ + /* config.module.rule('tsx').use('babel-loader') */ + { + loader: '/home/bob/user/dev/undergroundwires/privacy.sexy/node_modules/babel-loader/lib/index.js' + }, + /* config.module.rule('tsx').use('ts-loader') */ + { + loader: '/home/bob/user/dev/undergroundwires/privacy.sexy/node_modules/ts-loader/index.js', + options: { + transpileOnly: true, + happyPackMode: false, + appendTsxSuffixTo: [ + '\\.vue$' + ] + } + } + ] + }, + /* config.module.rule('yaml') */ + { + test: /\.ya?ml$/, + use: [ + /* config.module.rule('yaml').use('js-yaml-loader') */ + { + loader: 'js-yaml-loader' + } + ] + } + ] + }, + optimization: { + realContentHash: false, + splitChunks: { + cacheGroups: { + defaultVendors: { + name: 'chunk-vendors', + test: /[\\/]node_modules[\\/]/, + priority: -10, + chunks: 'initial' + }, + common: { + name: 'chunk-common', + minChunks: 2, + priority: -20, + chunks: 'initial', + reuseExistingChunk: true + } + } + }, + minimizer: [ + /* config.optimization.minimizer('terser') */ + new TerserPlugin( + { + terserOptions: { + compress: { + arrows: false, + collapse_vars: false, + comparisons: false, + computed_props: false, + hoist_funs: false, + hoist_props: false, + hoist_vars: false, + inline: false, + loops: false, + negate_iife: false, + properties: false, + reduce_funcs: false, + reduce_vars: false, + switches: false, + toplevel: false, + typeofs: false, + booleans: true, + if_return: true, + sequences: true, + unused: true, + conditionals: true, + dead_code: true, + evaluate: true + }, + mangle: { + safari10: true + } + }, + parallel: true, + extractComments: false + } + ) + ] + }, + plugins: [ + /* config.plugin('vue-loader') */ + new VueLoaderPlugin(), + /* config.plugin('define') */ + new DefinePlugin( + { + 'process.env': { + NODE_ENV: '"development"', + VUE_APP_VERSION: '"0.12.0"', + VUE_APP_NAME: '"privacy.sexy"', + VUE_APP_REPOSITORY_URL: '"https://github.com/undergroundwires/privacy.sexy.git"', + VUE_APP_HOMEPAGE_URL: '"https://privacy.sexy"', + VUE_APP_SLOGAN: '"Now you have the choice"', + BASE_URL: '"/"' + } + } + ), + /* config.plugin('case-sensitive-paths') */ + new CaseSensitivePathsPlugin(), + /* config.plugin('friendly-errors') */ + new FriendlyErrorsWebpackPlugin( + { + additionalTransformers: [ + function () { /* omitted long function */ } + ], + additionalFormatters: [ + function () { /* omitted long function */ } + ] + } + ), + /* config.plugin('html') */ + new HtmlWebpackPlugin( + { + title: 'privacy.sexy', + scriptLoading: 'defer', + templateParameters: function () { /* omitted long function */ }, + template: '/home/bob/user/dev/undergroundwires/privacy.sexy/public/index.html' + } + ), + /* config.plugin('copy') */ + new CopyPlugin( + { + patterns: [ + { + from: '/home/bob/user/dev/undergroundwires/privacy.sexy/public', + to: '/home/bob/user/dev/undergroundwires/privacy.sexy/dist', + toType: 'dir', + noErrorOnMissing: true, + globOptions: { + ignore: [ + '**/.DS_Store', + '/home/bob/user/dev/undergroundwires/privacy.sexy/public/index.html' + ] + }, + info: { + minimized: true + } + } + ] + } + ), + /* config.plugin('eslint') */ + new ESLintWebpackPlugin( + { + extensions: [ + '.js', + '.jsx', + '.vue', + '.ts', + '.tsx' + ], + cwd: '/home/bob/user/dev/undergroundwires/privacy.sexy', + cache: true, + cacheLocation: '/home/bob/user/dev/undergroundwires/privacy.sexy/node_modules/.cache/eslint/4a9d9fec.json', + context: '/home/bob/user/dev/undergroundwires/privacy.sexy', + failOnWarning: false, + failOnError: true, + eslintPath: '/home/bob/user/dev/undergroundwires/privacy.sexy/node_modules/eslint', + formatter: 'stylish' + } + ), + /* config.plugin('fork-ts-checker') */ + new ForkTsCheckerWebpackPlugin( + { + typescript: { + extensions: { + vue: { + enabled: true, + compiler: '/home/bob/user/dev/undergroundwires/privacy.sexy/node_modules/vue/compiler-sfc/index.js' + } + }, + diagnosticOptions: { + semantic: true, + syntactic: false + } + } + } + ) + ], + entry: { + app: [ + './src/presentation/main.ts' + ] + }, + externals: [ + 'fsevents' + ], + devtool: 'eval-source-map' +} diff --git a/package.json b/package.json index c86c2e04..f1f65819 100644 --- a/package.json +++ b/package.json @@ -5,6 +5,7 @@ "slogan": "Now you have the choice", "description": "Enforce privacy & security best-practices on Windows, macOS and Linux, because privacy is sexy 🍑🍆", "author": "undergroundwires", + "type": "module", "scripts": { "serve": "vue-cli-service serve", "build": "vue-cli-service build", diff --git a/postcss.config.js b/postcss.config.cjs similarity index 100% rename from postcss.config.js rename to postcss.config.cjs diff --git a/public/scripts/configure-vscode.sh b/public/scripts/configure-vscode.sh new file mode 100755 index 00000000..1e487699 --- /dev/null +++ b/public/scripts/configure-vscode.sh @@ -0,0 +1,74 @@ +#!/usr/bin/env bash + +# This script ensures that the '.vscode/settings.json' file exists and is configured correctly for ESLint validation on Vue and JavaScript files. +# See https://web.archive.org/web/20230801024405/https://eslint.vuejs.org/user-guide/#visual-studio-code + +declare -r SETTINGS_FILE='.vscode/settings.json' +declare -ra CONFIG_KEYS=('vue' 'javascript' 'typescript') +declare -r TEMP_FILE="tmp.$$.json" + +main() { + ensure_vscode_directory_exists + create_or_update_settings +} + +ensure_vscode_directory_exists() { + local dir_name + dir_name=$(dirname "${SETTINGS_FILE}") + if [[ ! -d ${dir_name} ]]; then + mkdir -p "${dir_name}" + echo "🎉 Created directory: ${dir_name}" + fi +} + +create_or_update_settings() { + if [[ ! -f ${SETTINGS_FILE} ]]; then + create_default_settings + else + add_or_update_eslint_validate + fi +} + +create_default_settings() { + local default_validate + default_validate=$(printf '%s' "${CONFIG_KEYS[*]}" | jq -R -s -c -M 'split(" ")') + echo "{ \"eslint.validate\": ${default_validate} }" | jq '.' > "${SETTINGS_FILE}" + echo "🎉 Created default ${SETTINGS_FILE}" +} + +add_or_update_eslint_validate() { + if ! jq -e '.["eslint.validate"]' "${SETTINGS_FILE}" >/dev/null; then + add_default_eslint_validate + else + update_eslint_validate + fi +} + +add_default_eslint_validate() { + jq --argjson keys "$(printf '%s' "${CONFIG_KEYS[*]}" \ + | jq -R -s -c 'split(" ")')" '. += {"eslint.validate": $keys}' "${SETTINGS_FILE}" > "${TEMP_FILE}" + replace_and_confirm + echo "🎉 Added default 'eslint.validate' to ${SETTINGS_FILE}" +} + +update_eslint_validate() { + local existing_keys + existing_keys=$(jq '.["eslint.validate"]' "${SETTINGS_FILE}") + for key in "${CONFIG_KEYS[@]}"; do + if ! echo "${existing_keys}" | jq 'index("'"${key}"'")' >/dev/null; then + jq '.["eslint.validate"] += ["'"${key}"'"]' "${SETTINGS_FILE}" > "${TEMP_FILE}" + mv "${TEMP_FILE}" "${SETTINGS_FILE}" + echo "🎉 Updated 'eslint.validate' in ${SETTINGS_FILE} for ${key}" + else + echo "⏊ī¸ No updated needed for ${key} ${SETTINGS_FILE}." + fi + done +} + +replace_and_confirm() { + if mv "${TEMP_FILE}" "${SETTINGS_FILE}"; then + echo "🎉 Updated ${SETTINGS_FILE}" + fi +} + +main diff --git a/public/scripts/fresh-npm-install.sh b/public/scripts/fresh-npm-install.sh new file mode 100755 index 00000000..194bea2a --- /dev/null +++ b/public/scripts/fresh-npm-install.sh @@ -0,0 +1,95 @@ +#!/usr/bin/env bash + +# Description: +# This script ensures npm is available, removes existing node modules, optionally +# removes package-lock.json (when -n flag is used), installs dependencies and runs unit tests. +# Usage: +# ./fresh-npm-install.sh # Regular execution +# ./fresh-npm-install.sh -n # Non-deterministic mode (removes package-lock.json) + +declare NON_DETERMINISTIC_FLAG=0 + + +main() { + parse_args "$@" + ensure_npm_is_available + ensure_npm_root + remove_existing_modules + if [[ $NON_DETERMINISTIC_FLAG -eq 1 ]]; then + remove_package_lock_json + fi + install_dependencies + run_unit_tests +} + +ensure_npm_is_available() { + if ! command -v npm &> /dev/null; then + log::fatal 'npm could not be found, please install it first.' + fi +} + +ensure_npm_root() { + if [ ! -f package.json ]; then + log::fatal 'Current directory is not a npm root. Please run the script in a npm root directory.' + fi +} + +remove_existing_modules() { + if [ -d ./node_modules ]; then + log::info 'Removing existing node modules...' + if ! rm -rf ./node_modules; then + log::fatal 'Could not remove existing node modules.' + fi + fi +} + +install_dependencies() { + log::info 'Installing dependencies...' + if ! npm install; then + log::fatal 'Failed to install dependencies.' + fi +} + +remove_package_lock_json() { + if [ -f ./package-lock.json ]; then + log::info 'Removing package-lock.json...' + if ! rm -rf ./package-lock.json; then + log::fatal 'Could not remove package-lock.json.' + fi + fi +} + +run_unit_tests() { + log::info 'Running unit tests...' + if ! npm run test:unit; then + pwd + log::fatal 'Failed to run unit tests.' + fi +} + +log::info() { + local -r message="$1" + echo "đŸ“Ŗ ${message}" +} + +log::fatal() { + local -r message="$1" + echo "❌ ${message}" >&2 + exit 1 +} + +parse_args() { + while getopts "n" opt; do + case ${opt} in + n) + NON_DETERMINISTIC_FLAG=1 + ;; + \?) + echo "Invalid option: $OPTARG" 1>&2 + exit 1 + ;; + esac + done +} + +main "$1" diff --git a/tests/e2e/.eslintrc.js b/tests/e2e/.eslintrc.cjs similarity index 100% rename from tests/e2e/.eslintrc.js rename to tests/e2e/.eslintrc.cjs diff --git a/tests/e2e/plugins/index.js b/tests/e2e/plugins/index.js index 2b816f15..bf36e735 100644 --- a/tests/e2e/plugins/index.js +++ b/tests/e2e/plugins/index.js @@ -9,7 +9,7 @@ // /* eslint-disable import/no-extraneous-dependencies, global-require */ // const webpack = require('@cypress/webpack-preprocessor') -module.exports = (on, config) => { +export default (on, config) => { // on('file:preprocessor', webpack({ // webpackOptions: require('@vue/cli-service/webpack.config'), // watchOptions: {} diff --git a/vue.config.js b/vue.config.cjs similarity index 87% rename from vue.config.js rename to vue.config.cjs index d3caecda..cb548727 100644 --- a/vue.config.js +++ b/vue.config.cjs @@ -4,6 +4,7 @@ const packageJson = require('./package.json'); const tsconfigJson = require('./tsconfig.json'); loadVueAppRuntimeVariables(); +fixMochaBuildWithModules(); module.exports = defineConfig({ transpileDependencies: true, @@ -95,3 +96,15 @@ function getAliasesFromTsConfig() { return aliases; }, {}); } + +function fixMochaBuildWithModules() { + /* + Workaround for Vue CLI issue during tests breaks projects that rely on ES6 modules and mocha. + Setting VUE_CLI_TEST to true prevents the Vue CLI from altering the module transpilation. + This fix ensures `npm run build -- --mode test` works successfully. + See: https://github.com/vuejs/vue-cli/issues/7417 + */ + if (process.env.NODE_ENV === 'test') { + process.env.VUE_CLI_TEST = true; + } +}