mirror of
https://gerrit.wikimedia.org/r/mediawiki/extensions/CodeMirror
synced 2024-11-27 15:40:00 +00:00
c670344851
This is more or less a exact port of the old stream parser, with the big notable change being that all configuration-related code lives in a separate class, CodeMirrorModeMediaWikiConfig. A smaller change is that closing HTML tags that are marked as errors now have the ending '>' character highlighted red, when it didn't before. Integration with other extensions and modes is saved for a future patch (T348684). This means <nowiki>, <ref> and other extension-supplied markup is not yet highlighted. The entry point for WikiEditor integration is now at ext.CodeMirror.v6.WikiEditor.init.js, which needs to first require the virtual file set via the DataScript (PHP) class. This can't be integrated into the CM6 code because it needs to be precompiled before ResourceLoader can use it (T281781). Known issues, to be addressed separately: * No support for TagModes / PluginModes (T348684) * Identical adjacent tokens produce excess markup (T352917) * Section headings do not have line-level styling (T351686) Bug: T348019 Change-Id: I8f8a81f362bed60dea14ecde9487a2b0c89225e8
99 lines
3.3 KiB
JavaScript
99 lines
3.3 KiB
JavaScript
'use strict';
|
|
|
|
/* eslint-env node */
|
|
const { CleanWebpackPlugin } = require( 'clean-webpack-plugin' ),
|
|
path = require( 'path' ),
|
|
distDir = path.resolve( __dirname, 'resources/dist' ),
|
|
srcMapExt = '.map.json',
|
|
PUBLIC_PATH = '/w/extensions/CodeMirror';
|
|
|
|
module.exports = ( env, argv ) => ( {
|
|
// Apply the rule of silence: https://wikipedia.org/wiki/Unix_philosophy.
|
|
stats: {
|
|
all: false,
|
|
// Output a timestamp when a build completes. Useful when watching files.
|
|
builtAt: true,
|
|
errors: true,
|
|
warnings: true
|
|
},
|
|
|
|
// Fail on the first build error instead of tolerating it for prod builds. This seems to
|
|
// correspond to optimization.emitOnErrors.
|
|
bail: argv.mode === 'production',
|
|
|
|
// Specify that all paths are relative the Webpack configuration directory not the current
|
|
// working directory.
|
|
context: __dirname,
|
|
|
|
entry: './src/codemirror.wikieditor.mediawiki.js',
|
|
|
|
module: {
|
|
rules: [ {
|
|
test: /\.js$/,
|
|
exclude: /node_modules/,
|
|
use: {
|
|
loader: 'babel-loader',
|
|
options: {
|
|
// Beware of https://github.com/babel/babel-loader/issues/690. Changes to browsers require
|
|
// manual invalidation.
|
|
cacheDirectory: true
|
|
}
|
|
}
|
|
} ]
|
|
},
|
|
|
|
optimization: {
|
|
// Don't produce production output when a build error occurs.
|
|
emitOnErrors: argv.mode !== 'production',
|
|
|
|
// Use filenames instead of unstable numerical identifiers for file references. This
|
|
// increases the gzipped bundle size some but makes the build products easier to debug and
|
|
// appear deterministic. I.e., code changes will only alter the bundle they're packed in
|
|
// instead of shifting the identifiers in other bundles.
|
|
// https://webpack.js.org/guides/caching/#deterministic-hashes (namedModules replaces NamedModulesPlugin.)
|
|
moduleIds: 'named'
|
|
},
|
|
|
|
output: {
|
|
// Specify the destination of all build products.
|
|
path: distDir,
|
|
|
|
// Store outputs per module in files named after the modules. For the JavaScript entry
|
|
// itself, append .js to each ResourceLoader module entry name. This value is tightly
|
|
// coupled to sourceMapFilename.
|
|
filename: '[name].js',
|
|
|
|
// Rename source map extensions. Per T173491 files with a .map extension cannot be served
|
|
// from prod.
|
|
sourceMapFilename: `[file]${ srcMapExt }`,
|
|
|
|
devtoolModuleFilenameTemplate: `${ PUBLIC_PATH }/[resource-path]`
|
|
},
|
|
|
|
// Accurate source maps at the expense of build time. The source map is intentionally exposed
|
|
// to users via sourceMapFilename for prod debugging. This goes against convention as source
|
|
// code is publicly distributed.
|
|
devtool: 'source-map',
|
|
|
|
plugins: [
|
|
// Delete the output directory on each build.
|
|
new CleanWebpackPlugin( {
|
|
cleanOnceBeforeBuildPatterns: [ '**/*', '!.eslintrc.json' ]
|
|
} )
|
|
],
|
|
|
|
performance: {
|
|
// Size violations for prod builds fail; development builds are unchecked.
|
|
hints: argv.mode === 'production' ? 'error' : false,
|
|
|
|
// Minified uncompressed size limits for chunks / assets and entrypoints. Keep these numbers
|
|
// up-to-date and rounded to the nearest 10th of a kibibyte so that code sizing costs are
|
|
// well understood. Related to bundlesize minified, gzipped compressed file size tests.
|
|
maxAssetSize: 350.0 * 1024,
|
|
maxEntrypointSize: 350.0 * 1024,
|
|
|
|
// The default filter excludes map files, but we rename ours.
|
|
assetFilter: ( filename ) => !filename.endsWith( srcMapExt )
|
|
}
|
|
} );
|