shakapacker 8.4.0 → 9.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/.eslintignore +1 -0
- data/.eslintrc.fast.js +40 -0
- data/.eslintrc.js +48 -0
- data/.github/STATUS.md +1 -0
- data/.github/workflows/claude-code-review.yml +54 -0
- data/.github/workflows/claude.yml +50 -0
- data/.github/workflows/dummy.yml +8 -4
- data/.github/workflows/generator.yml +17 -14
- data/.github/workflows/node.yml +23 -1
- data/.github/workflows/ruby.yml +11 -0
- data/.github/workflows/test-bundlers.yml +170 -0
- data/.gitignore +17 -0
- data/.husky/pre-commit +2 -0
- data/.npmignore +56 -0
- data/.prettierignore +3 -0
- data/.rubocop.yml +1 -0
- data/.yalcignore +26 -0
- data/CHANGELOG.md +156 -18
- data/CLAUDE.md +29 -0
- data/CONTRIBUTING.md +138 -20
- data/Gemfile.lock +3 -3
- data/README.md +130 -5
- data/Rakefile +39 -4
- data/TODO.md +50 -0
- data/TODO_v9.md +87 -0
- data/conductor-setup.sh +70 -0
- data/conductor.json +7 -0
- data/docs/cdn_setup.md +379 -0
- data/docs/css-modules-export-mode.md +512 -0
- data/docs/deployment.md +10 -1
- data/docs/optional-peer-dependencies.md +198 -0
- data/docs/peer-dependencies.md +60 -0
- data/docs/rspack.md +190 -0
- data/docs/rspack_migration_guide.md +202 -0
- data/docs/transpiler-migration.md +188 -0
- data/docs/transpiler-performance.md +179 -0
- data/docs/troubleshooting.md +5 -0
- data/docs/typescript-migration.md +378 -0
- data/docs/typescript.md +99 -0
- data/docs/using_esbuild_loader.md +3 -3
- data/docs/using_swc_loader.md +5 -3
- data/docs/v6_upgrade.md +10 -0
- data/docs/v9_upgrade.md +413 -0
- data/lib/install/bin/shakapacker +3 -5
- data/lib/install/config/rspack/rspack.config.js +6 -0
- data/lib/install/config/rspack/rspack.config.ts +7 -0
- data/lib/install/config/shakapacker.yml +12 -2
- data/lib/install/config/webpack/webpack.config.ts +7 -0
- data/lib/install/package.json +38 -0
- data/lib/install/template.rb +194 -44
- data/lib/shakapacker/configuration.rb +141 -0
- data/lib/shakapacker/dev_server_runner.rb +25 -5
- data/lib/shakapacker/doctor.rb +844 -0
- data/lib/shakapacker/manifest.rb +4 -2
- data/lib/shakapacker/rspack_runner.rb +19 -0
- data/lib/shakapacker/runner.rb +144 -4
- data/lib/shakapacker/swc_migrator.rb +376 -0
- data/lib/shakapacker/utils/manager.rb +2 -0
- data/lib/shakapacker/version.rb +1 -1
- data/lib/shakapacker/version_checker.rb +1 -1
- data/lib/shakapacker/webpack_runner.rb +4 -42
- data/lib/shakapacker.rb +2 -1
- data/lib/tasks/shakapacker/doctor.rake +8 -0
- data/lib/tasks/shakapacker/install.rake +12 -2
- data/lib/tasks/shakapacker/migrate_to_swc.rake +13 -0
- data/lib/tasks/shakapacker.rake +1 -0
- data/package/.npmignore +4 -0
- data/package/babel/preset.ts +56 -0
- data/package/config.ts +175 -0
- data/package/{dev_server.js → dev_server.ts} +8 -5
- data/package/env.ts +92 -0
- data/package/environments/base.ts +138 -0
- data/package/environments/development.ts +90 -0
- data/package/environments/production.ts +80 -0
- data/package/environments/test.ts +53 -0
- data/package/environments/types.ts +90 -0
- data/package/esbuild/index.ts +42 -0
- data/package/index.d.ts +3 -97
- data/package/index.ts +52 -0
- data/package/loaders.d.ts +28 -0
- data/package/optimization/rspack.ts +36 -0
- data/package/optimization/webpack.ts +57 -0
- data/package/plugins/rspack.ts +103 -0
- data/package/plugins/webpack.ts +62 -0
- data/package/rspack/index.ts +64 -0
- data/package/rules/{babel.js → babel.ts} +2 -2
- data/package/rules/{coffee.js → coffee.ts} +1 -1
- data/package/rules/css.ts +3 -0
- data/package/rules/{erb.js → erb.ts} +1 -1
- data/package/rules/esbuild.ts +10 -0
- data/package/rules/file.ts +40 -0
- data/package/rules/{jscommon.js → jscommon.ts} +4 -4
- data/package/rules/{less.js → less.ts} +4 -4
- data/package/rules/raw.ts +25 -0
- data/package/rules/rspack.ts +176 -0
- data/package/rules/{sass.js → sass.ts} +7 -3
- data/package/rules/{stylus.js → stylus.ts} +4 -8
- data/package/rules/swc.ts +10 -0
- data/package/rules/{index.js → webpack.ts} +1 -1
- data/package/swc/index.ts +54 -0
- data/package/types/README.md +87 -0
- data/package/types/index.ts +60 -0
- data/package/types.ts +108 -0
- data/package/utils/configPath.ts +6 -0
- data/package/utils/debug.ts +49 -0
- data/package/utils/defaultConfigPath.ts +4 -0
- data/package/utils/errorCodes.ts +219 -0
- data/package/utils/errorHelpers.ts +143 -0
- data/package/utils/getStyleRule.ts +64 -0
- data/package/utils/helpers.ts +85 -0
- data/package/utils/{inliningCss.js → inliningCss.ts} +3 -3
- data/package/utils/pathValidation.ts +139 -0
- data/package/utils/requireOrError.ts +15 -0
- data/package/utils/snakeToCamelCase.ts +5 -0
- data/package/utils/typeGuards.ts +342 -0
- data/package/utils/validateDependencies.ts +61 -0
- data/package/webpack-types.d.ts +33 -0
- data/package/webpackDevServerConfig.ts +117 -0
- data/package.json +134 -9
- data/scripts/remove-use-strict.js +45 -0
- data/scripts/type-check-no-emit.js +27 -0
- data/test/package/config.test.js +3 -0
- data/test/package/env.test.js +42 -7
- data/test/package/environments/base.test.js +5 -1
- data/test/package/rules/babel.test.js +16 -0
- data/test/package/rules/esbuild.test.js +1 -1
- data/test/package/rules/raw.test.js +40 -7
- data/test/package/rules/swc.test.js +1 -1
- data/test/package/rules/webpack.test.js +35 -0
- data/test/package/staging.test.js +4 -3
- data/test/package/transpiler-defaults.test.js +127 -0
- data/test/peer-dependencies.sh +85 -0
- data/test/scripts/remove-use-strict.test.js +125 -0
- data/test/typescript/build.test.js +118 -0
- data/test/typescript/environments.test.js +107 -0
- data/test/typescript/pathValidation.test.js +142 -0
- data/test/typescript/securityValidation.test.js +182 -0
- data/tools/README.md +124 -0
- data/tools/css-modules-v9-codemod.js +179 -0
- data/tsconfig.eslint.json +16 -0
- data/tsconfig.json +38 -0
- data/yarn.lock +2704 -767
- metadata +111 -41
- data/package/babel/preset.js +0 -48
- data/package/config.js +0 -56
- data/package/env.js +0 -48
- data/package/environments/base.js +0 -171
- data/package/environments/development.js +0 -13
- data/package/environments/production.js +0 -88
- data/package/environments/test.js +0 -3
- data/package/esbuild/index.js +0 -40
- data/package/index.js +0 -40
- data/package/rules/css.js +0 -3
- data/package/rules/esbuild.js +0 -10
- data/package/rules/file.js +0 -29
- data/package/rules/raw.js +0 -5
- data/package/rules/swc.js +0 -10
- data/package/swc/index.js +0 -50
- data/package/utils/configPath.js +0 -4
- data/package/utils/defaultConfigPath.js +0 -2
- data/package/utils/getStyleRule.js +0 -40
- data/package/utils/helpers.js +0 -62
- data/package/utils/snakeToCamelCase.js +0 -5
- data/package/webpackDevServerConfig.js +0 -71
- data/test/package/rules/index.test.js +0 -16
|
@@ -1,88 +0,0 @@
|
|
|
1
|
-
/* eslint global-require: 0 */
|
|
2
|
-
/* eslint import/no-dynamic-require: 0 */
|
|
3
|
-
|
|
4
|
-
const { merge } = require("webpack-merge")
|
|
5
|
-
const CompressionPlugin = require("compression-webpack-plugin")
|
|
6
|
-
const TerserPlugin = require("terser-webpack-plugin")
|
|
7
|
-
const baseConfig = require("./base")
|
|
8
|
-
const { moduleExists } = require("../utils/helpers")
|
|
9
|
-
const config = require("../config")
|
|
10
|
-
|
|
11
|
-
const getPlugins = () => {
|
|
12
|
-
const plugins = []
|
|
13
|
-
|
|
14
|
-
plugins.push(
|
|
15
|
-
new CompressionPlugin({
|
|
16
|
-
filename: "[path][base].gz[query]",
|
|
17
|
-
algorithm: "gzip",
|
|
18
|
-
test: /\.(js|css|html|json|ico|svg|eot|otf|ttf|map)$/
|
|
19
|
-
})
|
|
20
|
-
)
|
|
21
|
-
|
|
22
|
-
if ("brotli" in process.versions) {
|
|
23
|
-
plugins.push(
|
|
24
|
-
new CompressionPlugin({
|
|
25
|
-
filename: "[path][base].br[query]",
|
|
26
|
-
algorithm: "brotliCompress",
|
|
27
|
-
test: /\.(js|css|html|json|ico|svg|eot|otf|ttf|map)$/
|
|
28
|
-
})
|
|
29
|
-
)
|
|
30
|
-
}
|
|
31
|
-
|
|
32
|
-
return plugins
|
|
33
|
-
}
|
|
34
|
-
|
|
35
|
-
const tryCssMinimizer = () => {
|
|
36
|
-
if (
|
|
37
|
-
moduleExists("css-loader") &&
|
|
38
|
-
moduleExists("css-minimizer-webpack-plugin")
|
|
39
|
-
) {
|
|
40
|
-
const CssMinimizerPlugin = require("css-minimizer-webpack-plugin")
|
|
41
|
-
return new CssMinimizerPlugin()
|
|
42
|
-
}
|
|
43
|
-
|
|
44
|
-
return null
|
|
45
|
-
}
|
|
46
|
-
|
|
47
|
-
const productionConfig = {
|
|
48
|
-
devtool: "source-map",
|
|
49
|
-
stats: "normal",
|
|
50
|
-
bail: true,
|
|
51
|
-
plugins: getPlugins(),
|
|
52
|
-
optimization: {
|
|
53
|
-
minimizer: [
|
|
54
|
-
tryCssMinimizer(),
|
|
55
|
-
new TerserPlugin({
|
|
56
|
-
parallel: Number.parseInt(process.env.SHAKAPACKER_PARALLEL, 10) || true,
|
|
57
|
-
terserOptions: {
|
|
58
|
-
parse: {
|
|
59
|
-
// Let terser parse ecma 8 code but always output
|
|
60
|
-
// ES5 compliant code for older browsers
|
|
61
|
-
ecma: 8
|
|
62
|
-
},
|
|
63
|
-
compress: {
|
|
64
|
-
ecma: 5,
|
|
65
|
-
warnings: false,
|
|
66
|
-
comparisons: false
|
|
67
|
-
},
|
|
68
|
-
mangle: { safari10: true },
|
|
69
|
-
output: {
|
|
70
|
-
ecma: 5,
|
|
71
|
-
comments: false,
|
|
72
|
-
ascii_only: true
|
|
73
|
-
}
|
|
74
|
-
}
|
|
75
|
-
})
|
|
76
|
-
].filter(Boolean)
|
|
77
|
-
}
|
|
78
|
-
}
|
|
79
|
-
|
|
80
|
-
if (config.useContentHash === false) {
|
|
81
|
-
// eslint-disable-next-line no-console
|
|
82
|
-
console.warn(`⚠️ WARNING
|
|
83
|
-
Setting 'useContentHash' to 'false' in the production environment (specified by NODE_ENV environment variable) is not allowed!
|
|
84
|
-
Content hashes get added to the filenames regardless of setting useContentHash in 'shakapacker.yml' to false.
|
|
85
|
-
`)
|
|
86
|
-
}
|
|
87
|
-
|
|
88
|
-
module.exports = merge(baseConfig, productionConfig)
|
data/package/esbuild/index.js
DELETED
|
@@ -1,40 +0,0 @@
|
|
|
1
|
-
/* eslint global-require: 0 */
|
|
2
|
-
/* eslint import/no-dynamic-require: 0 */
|
|
3
|
-
|
|
4
|
-
const { resolve } = require("path")
|
|
5
|
-
const { existsSync } = require("fs")
|
|
6
|
-
const { merge } = require("webpack-merge")
|
|
7
|
-
|
|
8
|
-
const getLoaderExtension = (filename) => {
|
|
9
|
-
const matchData = filename.match(/\.([jt]sx?)?(\.erb)?$/)
|
|
10
|
-
|
|
11
|
-
if (!matchData) {
|
|
12
|
-
return "js"
|
|
13
|
-
}
|
|
14
|
-
|
|
15
|
-
return matchData[1]
|
|
16
|
-
}
|
|
17
|
-
|
|
18
|
-
const getCustomConfig = () => {
|
|
19
|
-
const path = resolve("config", "esbuild.config.js")
|
|
20
|
-
if (existsSync(path)) {
|
|
21
|
-
return require(path)
|
|
22
|
-
}
|
|
23
|
-
return {}
|
|
24
|
-
}
|
|
25
|
-
|
|
26
|
-
const getEsbuildLoaderConfig = (filenameToProcess) => {
|
|
27
|
-
const customConfig = getCustomConfig()
|
|
28
|
-
const defaultConfig = {
|
|
29
|
-
loader: require.resolve("esbuild-loader"),
|
|
30
|
-
options: {
|
|
31
|
-
loader: getLoaderExtension(filenameToProcess)
|
|
32
|
-
}
|
|
33
|
-
}
|
|
34
|
-
|
|
35
|
-
return merge(defaultConfig, customConfig)
|
|
36
|
-
}
|
|
37
|
-
|
|
38
|
-
module.exports = {
|
|
39
|
-
getEsbuildLoaderConfig
|
|
40
|
-
}
|
data/package/index.js
DELETED
|
@@ -1,40 +0,0 @@
|
|
|
1
|
-
/* eslint global-require: 0 */
|
|
2
|
-
/* eslint import/no-dynamic-require: 0 */
|
|
3
|
-
|
|
4
|
-
const webpackMerge = require("webpack-merge")
|
|
5
|
-
const { resolve } = require("path")
|
|
6
|
-
const { existsSync } = require("fs")
|
|
7
|
-
const baseConfig = require("./environments/base")
|
|
8
|
-
const rules = require("./rules")
|
|
9
|
-
const config = require("./config")
|
|
10
|
-
const devServer = require("./dev_server")
|
|
11
|
-
const env = require("./env")
|
|
12
|
-
const { moduleExists, canProcess } = require("./utils/helpers")
|
|
13
|
-
const inliningCss = require("./utils/inliningCss")
|
|
14
|
-
|
|
15
|
-
const generateWebpackConfig = (extraConfig = {}, ...extraArgs) => {
|
|
16
|
-
if (extraArgs.length > 0) {
|
|
17
|
-
throw new Error(
|
|
18
|
-
"Only one extra config may be passed here - use webpack-merge to merge configs before passing them to Shakapacker"
|
|
19
|
-
)
|
|
20
|
-
}
|
|
21
|
-
|
|
22
|
-
const { nodeEnv } = env
|
|
23
|
-
const path = resolve(__dirname, "environments", `${nodeEnv}.js`)
|
|
24
|
-
const environmentConfig = existsSync(path) ? require(path) : baseConfig
|
|
25
|
-
|
|
26
|
-
return webpackMerge.merge({}, environmentConfig, extraConfig)
|
|
27
|
-
}
|
|
28
|
-
|
|
29
|
-
module.exports = {
|
|
30
|
-
config, // shakapacker.yml
|
|
31
|
-
devServer,
|
|
32
|
-
generateWebpackConfig,
|
|
33
|
-
baseConfig,
|
|
34
|
-
env,
|
|
35
|
-
rules,
|
|
36
|
-
moduleExists,
|
|
37
|
-
canProcess,
|
|
38
|
-
inliningCss,
|
|
39
|
-
...webpackMerge
|
|
40
|
-
}
|
data/package/rules/css.js
DELETED
data/package/rules/esbuild.js
DELETED
|
@@ -1,10 +0,0 @@
|
|
|
1
|
-
const { loaderMatches } = require("../utils/helpers")
|
|
2
|
-
const { getEsbuildLoaderConfig } = require("../esbuild")
|
|
3
|
-
const { webpack_loader: webpackLoader } = require("../config")
|
|
4
|
-
const jscommon = require("./jscommon")
|
|
5
|
-
|
|
6
|
-
module.exports = loaderMatches(webpackLoader, "esbuild", () => ({
|
|
7
|
-
test: /\.(ts|tsx|js|jsx|mjs|coffee)?(\.erb)?$/,
|
|
8
|
-
...jscommon,
|
|
9
|
-
use: ({ resource }) => getEsbuildLoaderConfig(resource)
|
|
10
|
-
}))
|
data/package/rules/file.js
DELETED
|
@@ -1,29 +0,0 @@
|
|
|
1
|
-
const { dirname } = require("path")
|
|
2
|
-
const {
|
|
3
|
-
additional_paths: additionalPaths,
|
|
4
|
-
source_path: sourcePath
|
|
5
|
-
} = require("../config")
|
|
6
|
-
|
|
7
|
-
module.exports = {
|
|
8
|
-
test: /\.(bmp|gif|jpe?g|png|tiff|ico|avif|webp|eot|otf|ttf|woff|woff2|svg)$/,
|
|
9
|
-
exclude: /\.(js|mjs|jsx|ts|tsx)$/,
|
|
10
|
-
type: "asset/resource",
|
|
11
|
-
generator: {
|
|
12
|
-
filename: (pathData) => {
|
|
13
|
-
const path = dirname(pathData.filename)
|
|
14
|
-
const stripPaths = [...additionalPaths, sourcePath]
|
|
15
|
-
|
|
16
|
-
const selectedStripPath = stripPaths.find((includePath) =>
|
|
17
|
-
path.startsWith(includePath)
|
|
18
|
-
)
|
|
19
|
-
|
|
20
|
-
const folders = path
|
|
21
|
-
.replace(`${selectedStripPath}`, "")
|
|
22
|
-
.split("/")
|
|
23
|
-
.filter(Boolean)
|
|
24
|
-
|
|
25
|
-
const foldersWithStatic = ["static", ...folders].join("/")
|
|
26
|
-
return `${foldersWithStatic}/[name]-[hash][ext][query]`
|
|
27
|
-
}
|
|
28
|
-
}
|
|
29
|
-
}
|
data/package/rules/raw.js
DELETED
data/package/rules/swc.js
DELETED
|
@@ -1,10 +0,0 @@
|
|
|
1
|
-
const { loaderMatches } = require("../utils/helpers")
|
|
2
|
-
const { getSwcLoaderConfig } = require("../swc")
|
|
3
|
-
const { webpack_loader: webpackLoader } = require("../config")
|
|
4
|
-
const jscommon = require("./jscommon")
|
|
5
|
-
|
|
6
|
-
module.exports = loaderMatches(webpackLoader, "swc", () => ({
|
|
7
|
-
test: /\.(ts|tsx|js|jsx|mjs|coffee)?(\.erb)?$/,
|
|
8
|
-
...jscommon,
|
|
9
|
-
use: ({ resource }) => getSwcLoaderConfig(resource)
|
|
10
|
-
}))
|
data/package/swc/index.js
DELETED
|
@@ -1,50 +0,0 @@
|
|
|
1
|
-
/* eslint global-require: 0 */
|
|
2
|
-
/* eslint import/no-dynamic-require: 0 */
|
|
3
|
-
|
|
4
|
-
const { resolve } = require("path")
|
|
5
|
-
const { existsSync } = require("fs")
|
|
6
|
-
const { merge } = require("webpack-merge")
|
|
7
|
-
|
|
8
|
-
const isJsxFile = (filename) => !!filename.match(/\.(jsx|tsx)?(\.erb)?$/)
|
|
9
|
-
|
|
10
|
-
const isTypescriptFile = (filename) => !!filename.match(/\.(ts|tsx)?(\.erb)?$/)
|
|
11
|
-
|
|
12
|
-
const getCustomConfig = () => {
|
|
13
|
-
const path = resolve("config", "swc.config.js")
|
|
14
|
-
if (existsSync(path)) {
|
|
15
|
-
return require(path)
|
|
16
|
-
}
|
|
17
|
-
return {}
|
|
18
|
-
}
|
|
19
|
-
|
|
20
|
-
const getSwcLoaderConfig = (filenameToProcess) => {
|
|
21
|
-
const customConfig = getCustomConfig()
|
|
22
|
-
const defaultConfig = {
|
|
23
|
-
loader: require.resolve("swc-loader"),
|
|
24
|
-
options: {
|
|
25
|
-
jsc: {
|
|
26
|
-
parser: {
|
|
27
|
-
dynamicImport: true,
|
|
28
|
-
syntax: isTypescriptFile(filenameToProcess)
|
|
29
|
-
? "typescript"
|
|
30
|
-
: "ecmascript",
|
|
31
|
-
[isTypescriptFile(filenameToProcess) ? "tsx" : "jsx"]:
|
|
32
|
-
isJsxFile(filenameToProcess)
|
|
33
|
-
},
|
|
34
|
-
loose: true
|
|
35
|
-
},
|
|
36
|
-
sourceMaps: true,
|
|
37
|
-
env: {
|
|
38
|
-
coreJs: 3,
|
|
39
|
-
exclude: ["transform-typeof-symbol"],
|
|
40
|
-
mode: "entry"
|
|
41
|
-
}
|
|
42
|
-
}
|
|
43
|
-
}
|
|
44
|
-
|
|
45
|
-
return merge(defaultConfig, customConfig)
|
|
46
|
-
}
|
|
47
|
-
|
|
48
|
-
module.exports = {
|
|
49
|
-
getSwcLoaderConfig
|
|
50
|
-
}
|
data/package/utils/configPath.js
DELETED
|
@@ -1,40 +0,0 @@
|
|
|
1
|
-
/* eslint global-require: 0 */
|
|
2
|
-
const { canProcess, moduleExists } = require("./helpers")
|
|
3
|
-
const inliningCss = require("./inliningCss")
|
|
4
|
-
|
|
5
|
-
const getStyleRule = (test, preprocessors = []) => {
|
|
6
|
-
if (moduleExists("css-loader")) {
|
|
7
|
-
const tryPostcss = () =>
|
|
8
|
-
canProcess("postcss-loader", (loaderPath) => ({
|
|
9
|
-
loader: loaderPath,
|
|
10
|
-
options: { sourceMap: true }
|
|
11
|
-
}))
|
|
12
|
-
|
|
13
|
-
// style-loader is required when using css modules with HMR on the webpack-dev-server
|
|
14
|
-
|
|
15
|
-
const use = [
|
|
16
|
-
inliningCss ? "style-loader" : require("mini-css-extract-plugin").loader,
|
|
17
|
-
{
|
|
18
|
-
loader: require.resolve("css-loader"),
|
|
19
|
-
options: {
|
|
20
|
-
sourceMap: true,
|
|
21
|
-
importLoaders: 2,
|
|
22
|
-
modules: {
|
|
23
|
-
auto: true
|
|
24
|
-
}
|
|
25
|
-
}
|
|
26
|
-
},
|
|
27
|
-
tryPostcss(),
|
|
28
|
-
...preprocessors
|
|
29
|
-
].filter(Boolean)
|
|
30
|
-
|
|
31
|
-
return {
|
|
32
|
-
test,
|
|
33
|
-
use
|
|
34
|
-
}
|
|
35
|
-
}
|
|
36
|
-
|
|
37
|
-
return null
|
|
38
|
-
}
|
|
39
|
-
|
|
40
|
-
module.exports = getStyleRule
|
data/package/utils/helpers.js
DELETED
|
@@ -1,62 +0,0 @@
|
|
|
1
|
-
const isBoolean = (str) => /^true/.test(str) || /^false/.test(str)
|
|
2
|
-
|
|
3
|
-
const ensureTrailingSlash = (path) => (path.endsWith("/") ? path : `${path}/`)
|
|
4
|
-
|
|
5
|
-
const resolvedPath = (packageName) => {
|
|
6
|
-
try {
|
|
7
|
-
return require.resolve(packageName)
|
|
8
|
-
} catch (e) {
|
|
9
|
-
if (e.code !== "MODULE_NOT_FOUND") {
|
|
10
|
-
throw e
|
|
11
|
-
}
|
|
12
|
-
return null
|
|
13
|
-
}
|
|
14
|
-
}
|
|
15
|
-
|
|
16
|
-
const moduleExists = (packageName) => !!resolvedPath(packageName)
|
|
17
|
-
|
|
18
|
-
const canProcess = (rule, fn) => {
|
|
19
|
-
const modulePath = resolvedPath(rule)
|
|
20
|
-
|
|
21
|
-
if (modulePath) {
|
|
22
|
-
return fn(modulePath)
|
|
23
|
-
}
|
|
24
|
-
|
|
25
|
-
return null
|
|
26
|
-
}
|
|
27
|
-
|
|
28
|
-
const loaderMatches = (configLoader, loaderToCheck, fn) => {
|
|
29
|
-
if (configLoader !== loaderToCheck) {
|
|
30
|
-
return null
|
|
31
|
-
}
|
|
32
|
-
|
|
33
|
-
const loaderName = `${configLoader}-loader`
|
|
34
|
-
|
|
35
|
-
if (!moduleExists(loaderName)) {
|
|
36
|
-
throw new Error(
|
|
37
|
-
`Your Shakapacker config specified using ${configLoader}, but ${loaderName} package is not installed. Please install ${loaderName} first.`
|
|
38
|
-
)
|
|
39
|
-
}
|
|
40
|
-
|
|
41
|
-
return fn()
|
|
42
|
-
}
|
|
43
|
-
|
|
44
|
-
const packageFullVersion = (packageName) => {
|
|
45
|
-
// eslint-disable-next-line import/no-dynamic-require
|
|
46
|
-
const packageJsonPath = require.resolve(`${packageName}/package.json`)
|
|
47
|
-
// eslint-disable-next-line import/no-dynamic-require, global-require
|
|
48
|
-
return require(packageJsonPath).version
|
|
49
|
-
}
|
|
50
|
-
|
|
51
|
-
const packageMajorVersion = (packageName) =>
|
|
52
|
-
packageFullVersion(packageName).match(/^\d+/)[0]
|
|
53
|
-
|
|
54
|
-
module.exports = {
|
|
55
|
-
isBoolean,
|
|
56
|
-
ensureTrailingSlash,
|
|
57
|
-
canProcess,
|
|
58
|
-
moduleExists,
|
|
59
|
-
loaderMatches,
|
|
60
|
-
packageFullVersion,
|
|
61
|
-
packageMajorVersion
|
|
62
|
-
}
|
|
@@ -1,71 +0,0 @@
|
|
|
1
|
-
const shakapackerDevServerYamlConfig = require("./dev_server")
|
|
2
|
-
const snakeToCamelCase = require("./utils/snakeToCamelCase")
|
|
3
|
-
const { outputPath: contentBase, publicPath } = require("./config")
|
|
4
|
-
|
|
5
|
-
const webpackDevServerMappedKeys = new Set([
|
|
6
|
-
// client, server, liveReload, devMiddleware are handled separately
|
|
7
|
-
"allowedHosts",
|
|
8
|
-
"bonjour",
|
|
9
|
-
"compress",
|
|
10
|
-
"headers",
|
|
11
|
-
"historyApiFallback",
|
|
12
|
-
"host",
|
|
13
|
-
"hot",
|
|
14
|
-
"http2",
|
|
15
|
-
"https",
|
|
16
|
-
"ipc",
|
|
17
|
-
"magicHtml",
|
|
18
|
-
"onAfterSetupMiddleware",
|
|
19
|
-
"onBeforeSetupMiddleware",
|
|
20
|
-
"open",
|
|
21
|
-
"port",
|
|
22
|
-
"proxy",
|
|
23
|
-
"server",
|
|
24
|
-
"setupExitSignals",
|
|
25
|
-
"setupMiddlewares",
|
|
26
|
-
"watchFiles",
|
|
27
|
-
"webSocketServer"
|
|
28
|
-
])
|
|
29
|
-
|
|
30
|
-
function createDevServerConfig() {
|
|
31
|
-
const devServerYamlConfig = { ...shakapackerDevServerYamlConfig }
|
|
32
|
-
const liveReload =
|
|
33
|
-
devServerYamlConfig.live_reload !== undefined
|
|
34
|
-
? devServerYamlConfig.live_reload
|
|
35
|
-
: !devServerYamlConfig.hmr
|
|
36
|
-
delete devServerYamlConfig.live_reload
|
|
37
|
-
|
|
38
|
-
const config = {
|
|
39
|
-
devMiddleware: {
|
|
40
|
-
publicPath
|
|
41
|
-
},
|
|
42
|
-
liveReload,
|
|
43
|
-
historyApiFallback: {
|
|
44
|
-
disableDotRule: true
|
|
45
|
-
},
|
|
46
|
-
static: {
|
|
47
|
-
publicPath: contentBase
|
|
48
|
-
}
|
|
49
|
-
}
|
|
50
|
-
|
|
51
|
-
if (devServerYamlConfig.static) {
|
|
52
|
-
config.static = { ...config.static, ...devServerYamlConfig.static }
|
|
53
|
-
delete devServerYamlConfig.static
|
|
54
|
-
}
|
|
55
|
-
|
|
56
|
-
if (devServerYamlConfig.client) {
|
|
57
|
-
config.client = devServerYamlConfig.client
|
|
58
|
-
delete devServerYamlConfig.client
|
|
59
|
-
}
|
|
60
|
-
|
|
61
|
-
Object.keys(devServerYamlConfig).forEach((yamlKey) => {
|
|
62
|
-
const camelYamlKey = snakeToCamelCase(yamlKey)
|
|
63
|
-
if (webpackDevServerMappedKeys.has(camelYamlKey)) {
|
|
64
|
-
config[camelYamlKey] = devServerYamlConfig[yamlKey]
|
|
65
|
-
}
|
|
66
|
-
})
|
|
67
|
-
|
|
68
|
-
return config
|
|
69
|
-
}
|
|
70
|
-
|
|
71
|
-
module.exports = createDevServerConfig
|
|
@@ -1,16 +0,0 @@
|
|
|
1
|
-
const rules = require("../../../package/rules/index")
|
|
2
|
-
|
|
3
|
-
jest.mock("../../../package/utils/helpers", () => {
|
|
4
|
-
const original = jest.requireActual("../../../package/utils/helpers")
|
|
5
|
-
const moduleExists = () => false
|
|
6
|
-
return {
|
|
7
|
-
...original,
|
|
8
|
-
moduleExists
|
|
9
|
-
}
|
|
10
|
-
})
|
|
11
|
-
|
|
12
|
-
describe("index", () => {
|
|
13
|
-
test("rule tests are regexes", () => {
|
|
14
|
-
rules.forEach((rule) => expect(rule.test instanceof RegExp).toBe(true))
|
|
15
|
-
})
|
|
16
|
-
})
|