123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249 |
- const { VueLoaderPlugin } = require('vue-loader')
- const path = require('path')
- const BabelLoaderExcludeNodeModulesExcept = require('babel-loader-exclude-node-modules-except')
- const webpack = require('webpack')
- const NodePolyfillPlugin = require('node-polyfill-webpack-plugin')
- const WorkboxPlugin = require('workbox-webpack-plugin')
- const modules = require('./webpack.modules.js')
- const { readFileSync } = require('fs')
- const appVersion = readFileSync('./version.php').toString().match(/OC_Version.+\[([0-9]{2})/)?.[1] ?? 'unknown'
- const formatOutputFromModules = (modules) => {
-
-
-
- const moduleEntries = Object.keys(modules).map(moduleKey => {
- const module = modules[moduleKey]
- const entries = Object.keys(module).map(entryKey => {
- const entry = module[entryKey]
- return { [`${moduleKey}-${entryKey}`]: entry }
- })
- return Object.assign({}, ...Object.values(entries))
- })
- return Object.assign({}, ...Object.values(moduleEntries))
- }
- const modulesToBuild = () => {
- const MODULE = process?.env?.MODULE
- if (MODULE) {
- if (!modules[MODULE]) {
- throw new Error(`No module "${MODULE}" found`)
- }
- return formatOutputFromModules({
- [MODULE]: modules[MODULE],
- })
- }
- return formatOutputFromModules(modules)
- }
- module.exports = {
- entry: modulesToBuild(),
- output: {
-
- path: path.join(__dirname, 'dist'),
-
- publicPath: 'auto',
- filename: '[name].js?v=[contenthash]',
- chunkFilename: '[name]-[id].js?v=[contenthash]',
-
-
- devtoolNamespace: 'nextcloud',
- devtoolModuleFilenameTemplate(info) {
- const rootDir = process?.cwd()
- const rel = path.relative(rootDir, info.absoluteResourcePath)
- return `webpack:///nextcloud/${rel}`
- },
- clean: {
- keep: /icons\.css/,
- },
- },
- module: {
- rules: [
- {
- test: /davclient/,
- loader: 'exports-loader',
- options: {
- type: 'commonjs',
- exports: 'dav',
- },
- },
- {
- test: /\.css$/,
- use: ['style-loader', 'css-loader'],
- },
- {
- test: /\.scss$/,
- use: ['style-loader', 'css-loader', 'sass-loader'],
- },
- {
- test: /\.vue$/,
- loader: 'vue-loader',
- exclude: BabelLoaderExcludeNodeModulesExcept([
- 'vue-material-design-icons',
- 'emoji-mart-vue-fast',
- ]),
- },
- {
- test: /\.tsx?$/,
- use: [
- 'babel-loader',
- {
-
- loader: 'ts-loader',
- options: {
- transpileOnly: true,
- },
- },
- ],
- exclude: BabelLoaderExcludeNodeModulesExcept([]),
- },
- {
- test: /\.js$/,
- loader: 'babel-loader',
-
-
- exclude: BabelLoaderExcludeNodeModulesExcept([
- '@nextcloud/dialogs',
- '@nextcloud/event-bus',
- 'davclient.js',
- 'nextcloud-vue-collections',
- 'p-finally',
- 'p-limit',
- 'p-locate',
- 'p-queue',
- 'p-timeout',
- 'p-try',
- 'semver',
- 'striptags',
- 'toastify-js',
- 'v-tooltip',
- 'yocto-queue',
- ]),
- },
- {
- test: /\.(png|jpe?g|gif|svg|woff2?|eot|ttf)$/,
- type: 'asset/inline',
- },
- {
- test: /\.handlebars/,
- loader: 'handlebars-loader',
- },
- {
- resourceQuery: /raw/,
- type: 'asset/source',
- },
- ],
- },
- optimization: {
- splitChunks: {
- automaticNameDelimiter: '-',
- minChunks: 3,
- cacheGroups: {
- vendors: {
-
- test: /[\\/]node_modules[\\/]/,
-
-
- name: 'core-common',
- chunks: 'all',
- },
- },
- },
- },
- plugins: [
- new VueLoaderPlugin(),
- new NodePolyfillPlugin(),
- new webpack.ProvidePlugin({
-
-
-
- jQuery: path.resolve(path.join(__dirname, 'node_modules/jquery')),
-
-
-
-
- ICAL: 'ical.js',
- }),
- new WorkboxPlugin.GenerateSW({
- swDest: 'preview-service-worker.js',
- clientsClaim: true,
- skipWaiting: true,
- exclude: [/.*/],
- inlineWorkboxRuntime: true,
- sourcemap: false,
-
- disableDevLogs: true,
-
- runtimeCaching: [{
-
-
-
- urlPattern: /^.*\/(apps|core)(\/[a-z-_]+)?\/preview.*/i,
-
- handler: 'CacheFirst',
- options: {
-
- cacheName: 'previews',
-
- expiration: {
- maxAgeSeconds: 3600 * 24 * 7,
- maxEntries: 10000,
- },
- },
- }],
- }),
-
- new webpack.DefinePlugin({ appName: JSON.stringify('Nextcloud') }),
- new webpack.DefinePlugin({ appVersion: JSON.stringify(appVersion) }),
-
-
-
-
- new webpack.IgnorePlugin({
- resourceRegExp: /^\.\/locale$/,
- contextRegExp: /moment\/min$/,
- }),
- ],
- externals: {
- OC: 'OC',
- OCA: 'OCA',
- OCP: 'OCP',
- },
- resolve: {
- alias: {
-
- handlebars: 'handlebars/runtime',
- vue$: path.resolve('./node_modules/vue'),
- },
- extensions: ['*', '.ts', '.js', '.vue'],
- extensionAlias: {
-
- '.js': ['.js', '.ts'],
- },
- symlinks: true,
- fallback: {
- fs: false,
- },
- },
- }
|