shakapacker 6.0.0.rc.6
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 +7 -0
- data/.eslintignore +4 -0
- data/.eslintrc.js +14 -0
- data/.github/ISSUE_TEMPLATE/bug_report.md +20 -0
- data/.github/ISSUE_TEMPLATE/feature-request.md +18 -0
- data/.github/workflows/jest.yml +30 -0
- data/.github/workflows/js-lint.yml +31 -0
- data/.github/workflows/rubocop.yml +39 -0
- data/.github/workflows/ruby.yml +48 -0
- data/.gitignore +13 -0
- data/.node-version +1 -0
- data/.rubocop.yml +229 -0
- data/CHANGELOG.md +32 -0
- data/CONTRIBUTING.md +62 -0
- data/Gemfile +13 -0
- data/Gemfile.lock +183 -0
- data/MIT-LICENSE +20 -0
- data/README.md +666 -0
- data/Rakefile +11 -0
- data/config/README.md +3 -0
- data/config/webpacker.yml +1 -0
- data/docs/customizing_babel_config.md +59 -0
- data/docs/deployment.md +116 -0
- data/docs/developing_webpacker.md +29 -0
- data/docs/troubleshooting.md +212 -0
- data/docs/v6_upgrade.md +158 -0
- data/gemfiles/Gemfile-rails-edge +12 -0
- data/gemfiles/Gemfile-rails.5.2.x +9 -0
- data/gemfiles/Gemfile-rails.6.0.x +9 -0
- data/gemfiles/Gemfile-rails.6.1.x +12 -0
- data/lib/install/application.js +15 -0
- data/lib/install/bin/webpacker +15 -0
- data/lib/install/bin/webpacker-dev-server +18 -0
- data/lib/install/bin/yarn +18 -0
- data/lib/install/binstubs.rb +4 -0
- data/lib/install/config/webpack/webpack.config.js +5 -0
- data/lib/install/config/webpacker.yml +64 -0
- data/lib/install/package.json +15 -0
- data/lib/install/template.rb +100 -0
- data/lib/shakapacker/utils/git_utils.rb +23 -0
- data/lib/shakapacker/utils/version_syntax_converter.rb +24 -0
- data/lib/tasks/webpacker/binstubs.rake +15 -0
- data/lib/tasks/webpacker/check_binstubs.rake +12 -0
- data/lib/tasks/webpacker/check_node.rake +31 -0
- data/lib/tasks/webpacker/check_yarn.rake +33 -0
- data/lib/tasks/webpacker/clean.rake +25 -0
- data/lib/tasks/webpacker/clobber.rake +20 -0
- data/lib/tasks/webpacker/compile.rake +45 -0
- data/lib/tasks/webpacker/info.rake +21 -0
- data/lib/tasks/webpacker/install.rake +17 -0
- data/lib/tasks/webpacker/verify_config.rake +14 -0
- data/lib/tasks/webpacker/verify_install.rake +4 -0
- data/lib/tasks/webpacker/yarn_install.rake +18 -0
- data/lib/tasks/webpacker.rake +19 -0
- data/lib/tasks/yarn.rake +38 -0
- data/lib/webpacker/commands.rb +79 -0
- data/lib/webpacker/compiler.rb +130 -0
- data/lib/webpacker/configuration.rb +111 -0
- data/lib/webpacker/dev_server.rb +72 -0
- data/lib/webpacker/dev_server_proxy.rb +33 -0
- data/lib/webpacker/dev_server_runner.rb +96 -0
- data/lib/webpacker/env.rb +43 -0
- data/lib/webpacker/helper.rb +161 -0
- data/lib/webpacker/instance.rb +41 -0
- data/lib/webpacker/manifest.rb +120 -0
- data/lib/webpacker/railtie.rb +63 -0
- data/lib/webpacker/runner.rb +23 -0
- data/lib/webpacker/version.rb +4 -0
- data/lib/webpacker/webpack_runner.rb +58 -0
- data/lib/webpacker.rb +46 -0
- data/package/__tests__/config.js +34 -0
- data/package/__tests__/dev_server.js +45 -0
- data/package/__tests__/development.js +35 -0
- data/package/__tests__/env.js +58 -0
- data/package/__tests__/index.js +9 -0
- data/package/__tests__/production.js +29 -0
- data/package/__tests__/staging.js +30 -0
- data/package/__tests__/test.js +25 -0
- data/package/babel/preset.js +41 -0
- data/package/config.js +32 -0
- data/package/configPath.js +3 -0
- data/package/dev_server.js +20 -0
- data/package/env.js +27 -0
- data/package/environments/__tests__/base.js +69 -0
- data/package/environments/base.js +116 -0
- data/package/environments/development.js +55 -0
- data/package/environments/production.js +79 -0
- data/package/environments/test.js +3 -0
- data/package/index.js +33 -0
- data/package/inliningCss.js +7 -0
- data/package/rules/babel.js +30 -0
- data/package/rules/coffee.js +6 -0
- data/package/rules/css.js +3 -0
- data/package/rules/erb.js +15 -0
- data/package/rules/file.js +23 -0
- data/package/rules/index.js +18 -0
- data/package/rules/less.js +22 -0
- data/package/rules/raw.js +5 -0
- data/package/rules/sass.js +16 -0
- data/package/rules/stylus.js +26 -0
- data/package/utils/get_style_rule.js +37 -0
- data/package/utils/helpers.js +51 -0
- data/package.json +71 -0
- data/rakelib/release.rake +57 -0
- data/test/command_test.rb +109 -0
- data/test/compiler_test.rb +68 -0
- data/test/configuration_test.rb +78 -0
- data/test/dev_server_runner_test.rb +81 -0
- data/test/dev_server_test.rb +47 -0
- data/test/engine_rake_tasks_test.rb +39 -0
- data/test/env_test.rb +23 -0
- data/test/helper_test.rb +159 -0
- data/test/manifest_test.rb +89 -0
- data/test/mounted_app/Rakefile +4 -0
- data/test/mounted_app/test/dummy/Rakefile +3 -0
- data/test/mounted_app/test/dummy/bin/rails +3 -0
- data/test/mounted_app/test/dummy/bin/rake +3 -0
- data/test/mounted_app/test/dummy/config/application.rb +10 -0
- data/test/mounted_app/test/dummy/config/environment.rb +3 -0
- data/test/mounted_app/test/dummy/config/webpacker.yml +75 -0
- data/test/mounted_app/test/dummy/config.ru +5 -0
- data/test/mounted_app/test/dummy/package.json +7 -0
- data/test/rake_tasks_test.rb +71 -0
- data/test/test_app/Rakefile +3 -0
- data/test/test_app/app/packs/entrypoints/application.js +10 -0
- data/test/test_app/app/packs/entrypoints/multi_entry.css +4 -0
- data/test/test_app/app/packs/entrypoints/multi_entry.js +4 -0
- data/test/test_app/bin/webpacker +14 -0
- data/test/test_app/bin/webpacker-dev-server +14 -0
- data/test/test_app/config/application.rb +11 -0
- data/test/test_app/config/environment.rb +4 -0
- data/test/test_app/config/initializers/inspect_autoload_paths.rb +1 -0
- data/test/test_app/config/webpack/webpack.config.js +0 -0
- data/test/test_app/config/webpacker.yml +77 -0
- data/test/test_app/config/webpacker_other_location.yml +79 -0
- data/test/test_app/config/webpacker_public_root.yml +18 -0
- data/test/test_app/config.ru +5 -0
- data/test/test_app/package.json +13 -0
- data/test/test_app/public/packs/manifest.json +50 -0
- data/test/test_app/some.config.js +0 -0
- data/test/test_app/yarn.lock +11 -0
- data/test/test_helper.rb +33 -0
- data/test/webpack_runner_test.rb +57 -0
- data/test/webpacker_test.rb +34 -0
- data/webpacker.gemspec +31 -0
- data/yarn.lock +4029 -0
- metadata +331 -0
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
const { canProcess } = require('../utils/helpers')
|
|
2
|
+
|
|
3
|
+
const runner = /^win/.test(process.platform) ? 'ruby ' : ''
|
|
4
|
+
|
|
5
|
+
module.exports = canProcess('rails-erb-loader', (resolvedPath) => ({
|
|
6
|
+
test: /\.erb$/,
|
|
7
|
+
enforce: 'pre',
|
|
8
|
+
exclude: /node_modules/,
|
|
9
|
+
use: [
|
|
10
|
+
{
|
|
11
|
+
loader: resolvedPath,
|
|
12
|
+
options: { runner: `${runner}bin/rails runner` }
|
|
13
|
+
}
|
|
14
|
+
]
|
|
15
|
+
}))
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
module.exports = {
|
|
2
|
+
test: [
|
|
3
|
+
/\.bmp$/,
|
|
4
|
+
/\.gif$/,
|
|
5
|
+
/\.jpe?g$/,
|
|
6
|
+
/\.png$/,
|
|
7
|
+
/\.tiff$/,
|
|
8
|
+
/\.ico$/,
|
|
9
|
+
/\.avif$/,
|
|
10
|
+
/\.webp$/,
|
|
11
|
+
/\.eot$/,
|
|
12
|
+
/\.otf$/,
|
|
13
|
+
/\.ttf$/,
|
|
14
|
+
/\.woff$/,
|
|
15
|
+
/\.woff2$/,
|
|
16
|
+
/\.svg$/
|
|
17
|
+
],
|
|
18
|
+
exclude: [/\.(js|mjs|jsx|ts|tsx)$/],
|
|
19
|
+
type: 'asset/resource',
|
|
20
|
+
generator: {
|
|
21
|
+
filename: 'static/[name]-[hash][ext][query]'
|
|
22
|
+
}
|
|
23
|
+
}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
/* eslint global-require: 0 */
|
|
2
|
+
/* eslint import/no-dynamic-require: 0 */
|
|
3
|
+
|
|
4
|
+
const rules = {
|
|
5
|
+
raw: require('./raw'),
|
|
6
|
+
file: require('./file'),
|
|
7
|
+
css: require('./css'),
|
|
8
|
+
sass: require('./sass'),
|
|
9
|
+
babel: require('./babel'),
|
|
10
|
+
erb: require('./erb'),
|
|
11
|
+
coffee: require('./coffee'),
|
|
12
|
+
less: require('./less'),
|
|
13
|
+
stylus: require('./stylus')
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
module.exports = Object.keys(rules)
|
|
17
|
+
.filter((key) => !!rules[key])
|
|
18
|
+
.map((key) => rules[key])
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
const path = require('path')
|
|
2
|
+
const { canProcess } = require('../utils/helpers')
|
|
3
|
+
const getStyleRule = require('../utils/get_style_rule')
|
|
4
|
+
|
|
5
|
+
const {
|
|
6
|
+
additional_paths: paths,
|
|
7
|
+
source_path: sourcePath
|
|
8
|
+
} = require('../config')
|
|
9
|
+
|
|
10
|
+
module.exports = canProcess('less-loader', (resolvedPath) =>
|
|
11
|
+
getStyleRule(/\.(less)(\.erb)?$/i, [
|
|
12
|
+
{
|
|
13
|
+
loader: resolvedPath,
|
|
14
|
+
options: {
|
|
15
|
+
lessOptions: {
|
|
16
|
+
paths: [path.resolve(__dirname, 'node_modules'), sourcePath, ...paths]
|
|
17
|
+
},
|
|
18
|
+
sourceMap: true
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
])
|
|
22
|
+
)
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/* eslint global-require: 0 */
|
|
2
|
+
|
|
3
|
+
const getStyleRule = require('../utils/get_style_rule')
|
|
4
|
+
const { canProcess } = require('../utils/helpers')
|
|
5
|
+
const { additional_paths: includePaths } = require('../config')
|
|
6
|
+
|
|
7
|
+
module.exports = canProcess('sass-loader', (resolvedPath) =>
|
|
8
|
+
getStyleRule(/\.(scss|sass)(\.erb)?$/i, [
|
|
9
|
+
{
|
|
10
|
+
loader: resolvedPath,
|
|
11
|
+
options: {
|
|
12
|
+
sassOptions: { includePaths }
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
])
|
|
16
|
+
)
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
const path = require('path')
|
|
2
|
+
const { canProcess } = require('../utils/helpers')
|
|
3
|
+
const getStyleRule = require('../utils/get_style_rule')
|
|
4
|
+
|
|
5
|
+
const {
|
|
6
|
+
additional_paths: paths,
|
|
7
|
+
source_path: sourcePath
|
|
8
|
+
} = require('../config')
|
|
9
|
+
|
|
10
|
+
module.exports = canProcess('stylus-loader', (resolvedPath) =>
|
|
11
|
+
getStyleRule(/\.(styl(us)?)(\.erb)?$/i, [
|
|
12
|
+
{
|
|
13
|
+
loader: resolvedPath,
|
|
14
|
+
options: {
|
|
15
|
+
stylusOptions: {
|
|
16
|
+
include: [
|
|
17
|
+
path.resolve(__dirname, 'node_modules'),
|
|
18
|
+
sourcePath,
|
|
19
|
+
...paths
|
|
20
|
+
]
|
|
21
|
+
},
|
|
22
|
+
sourceMap: true
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
])
|
|
26
|
+
)
|
|
@@ -0,0 +1,37 @@
|
|
|
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
|
+
}
|
|
23
|
+
},
|
|
24
|
+
tryPostcss(),
|
|
25
|
+
...preprocessors
|
|
26
|
+
].filter(Boolean)
|
|
27
|
+
|
|
28
|
+
return {
|
|
29
|
+
test,
|
|
30
|
+
use
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
return null
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
module.exports = getStyleRule
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
const isArray = (value) => Array.isArray(value)
|
|
2
|
+
const isBoolean = (str) => /^true/.test(str) || /^false/.test(str)
|
|
3
|
+
const chdirTestApp = () => {
|
|
4
|
+
try {
|
|
5
|
+
return process.chdir('test/test_app')
|
|
6
|
+
} catch (e) {
|
|
7
|
+
return null
|
|
8
|
+
}
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
const chdirCwd = () => process.chdir(process.cwd())
|
|
12
|
+
|
|
13
|
+
const resetEnv = () => {
|
|
14
|
+
process.env = {}
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
const ensureTrailingSlash = (path) => (path.endsWith('/') ? path : `${path}/`)
|
|
18
|
+
|
|
19
|
+
const resolvedPath = (packageName) => {
|
|
20
|
+
try {
|
|
21
|
+
return require.resolve(packageName)
|
|
22
|
+
} catch (e) {
|
|
23
|
+
if (e.code !== 'MODULE_NOT_FOUND') {
|
|
24
|
+
throw e
|
|
25
|
+
}
|
|
26
|
+
return null
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
const moduleExists = (packageName) => (!!resolvedPath(packageName))
|
|
31
|
+
|
|
32
|
+
const canProcess = (rule, fn) => {
|
|
33
|
+
const modulePath = resolvedPath(rule)
|
|
34
|
+
|
|
35
|
+
if (modulePath) {
|
|
36
|
+
return fn(modulePath)
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
return null
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
module.exports = {
|
|
43
|
+
chdirTestApp,
|
|
44
|
+
chdirCwd,
|
|
45
|
+
isArray,
|
|
46
|
+
isBoolean,
|
|
47
|
+
ensureTrailingSlash,
|
|
48
|
+
canProcess,
|
|
49
|
+
moduleExists,
|
|
50
|
+
resetEnv
|
|
51
|
+
}
|
data/package.json
ADDED
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@shakacode/shakapacker",
|
|
3
|
+
"version": "6.0.0-rc.6",
|
|
4
|
+
"description": "Use webpack to manage app-like JavaScript modules in Rails",
|
|
5
|
+
"main": "package/index.js",
|
|
6
|
+
"files": [
|
|
7
|
+
"package",
|
|
8
|
+
"lib/install/config/webpacker.yml"
|
|
9
|
+
],
|
|
10
|
+
"engines": {
|
|
11
|
+
"node": "^12.13.0 || ^14 || >=16",
|
|
12
|
+
"yarn": ">=1 <4"
|
|
13
|
+
},
|
|
14
|
+
"peerDependencies": {
|
|
15
|
+
"@babel/core": "^7.15.5",
|
|
16
|
+
"@babel/plugin-transform-runtime": "^7.15.0",
|
|
17
|
+
"@babel/preset-env": "^7.15.6",
|
|
18
|
+
"@babel/runtime": "^7.15.4",
|
|
19
|
+
"babel-loader": "^8.2.2",
|
|
20
|
+
"compression-webpack-plugin": "^9.0.0",
|
|
21
|
+
"pnp-webpack-plugin": "^1.7.0",
|
|
22
|
+
"terser-webpack-plugin": "^5.2.4",
|
|
23
|
+
"webpack": "^5.53.0",
|
|
24
|
+
"webpack-assets-manifest": "^5.0.6",
|
|
25
|
+
"webpack-cli": "^4.8.0",
|
|
26
|
+
"webpack-merge": "^5.8.0"
|
|
27
|
+
},
|
|
28
|
+
"dependencies": {
|
|
29
|
+
"glob": "^7.2.0",
|
|
30
|
+
"js-yaml": "^4.1.0",
|
|
31
|
+
"path-complete-extname": "^1.0.0"
|
|
32
|
+
},
|
|
33
|
+
"devDependencies": {
|
|
34
|
+
"babel-loader": "^8.2.2",
|
|
35
|
+
"compression-webpack-plugin": "^9.0.0",
|
|
36
|
+
"eslint": "^7.32.0",
|
|
37
|
+
"eslint-config-airbnb": "^18.2.1",
|
|
38
|
+
"eslint-config-prettier": "^8.3.0",
|
|
39
|
+
"eslint-plugin-import": "^2.24.2",
|
|
40
|
+
"eslint-plugin-jsx-a11y": "^6.4.1",
|
|
41
|
+
"eslint-plugin-react": "^7.26.0",
|
|
42
|
+
"jest": "^27.2.1",
|
|
43
|
+
"pnp-webpack-plugin": "^1.7.0",
|
|
44
|
+
"webpack": "^5.53.0",
|
|
45
|
+
"webpack-assets-manifest": "^5.0.6",
|
|
46
|
+
"webpack-merge": "^5.8.0"
|
|
47
|
+
},
|
|
48
|
+
"jest": {
|
|
49
|
+
"testRegex": "(/__tests__/.*|(\\.|/))\\.jsx?$",
|
|
50
|
+
"roots": [
|
|
51
|
+
"<rootDir>/package"
|
|
52
|
+
]
|
|
53
|
+
},
|
|
54
|
+
"publishConfig": {
|
|
55
|
+
"access": "public"
|
|
56
|
+
},
|
|
57
|
+
"scripts": {
|
|
58
|
+
"test": "jest",
|
|
59
|
+
"lint": "eslint package/"
|
|
60
|
+
},
|
|
61
|
+
"repository": {
|
|
62
|
+
"type": "git",
|
|
63
|
+
"url": "git+https://github.com/shakacode/shakapacker.git"
|
|
64
|
+
},
|
|
65
|
+
"author": "David Heinemeier Hansson <david@basecamp.com>, Justin Gordon <justin@shakacode.com>",
|
|
66
|
+
"license": "MIT",
|
|
67
|
+
"bugs": {
|
|
68
|
+
"url": "https://github.com/shakacode/shakapacker/issues"
|
|
69
|
+
},
|
|
70
|
+
"homepage": "https://github.com/shakacode/shakapacker"
|
|
71
|
+
}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
require_relative File.join("..", "lib", "shakapacker", "utils", "version_syntax_converter")
|
|
2
|
+
require_relative File.join("..", "lib", "shakapacker", "utils", "git_utils")
|
|
3
|
+
|
|
4
|
+
class RaisingMessageHandler
|
|
5
|
+
def add_error(error)
|
|
6
|
+
raise error
|
|
7
|
+
end
|
|
8
|
+
end
|
|
9
|
+
|
|
10
|
+
desc("Releases both the gem and node package using the given version.
|
|
11
|
+
|
|
12
|
+
IMPORTANT: the gem version must be in valid rubygem format (no dashes).
|
|
13
|
+
It will be automatically converted to a valid yarn semver by the rake task
|
|
14
|
+
for the node package version. This only makes a difference for pre-release
|
|
15
|
+
versions such as `3.0.0.beta.1` (yarn version would be `3.0.0-beta.1`).
|
|
16
|
+
|
|
17
|
+
This task depends on the gem-release (ruby gem) and release-it (node package)
|
|
18
|
+
which are installed via `bundle install` and `yarn global add release-it`
|
|
19
|
+
|
|
20
|
+
1st argument: The new version in rubygem format (no dashes). Pass no argument to
|
|
21
|
+
automatically perform a patch version bump.
|
|
22
|
+
2nd argument: Perform a dry run by passing 'true' as a second argument.
|
|
23
|
+
|
|
24
|
+
Note, accept defaults for npmjs options. Script will pause to get 2FA tokens.
|
|
25
|
+
|
|
26
|
+
Example: `rake release[2.1.0,false]`")
|
|
27
|
+
task :release, %i[gem_version dry_run tools_install] do |_t, args|
|
|
28
|
+
# Check if there are uncommited changes
|
|
29
|
+
Shakapacker::GitUtils.uncommitted_changes?(RaisingMessageHandler.new)
|
|
30
|
+
args_hash = args.to_hash
|
|
31
|
+
|
|
32
|
+
is_dry_run = Shakapacker::Utils.object_to_boolean(args_hash[:dry_run])
|
|
33
|
+
|
|
34
|
+
gem_version = args_hash.fetch(:gem_version, "")
|
|
35
|
+
|
|
36
|
+
gem_root = File.expand_path("..", __dir__)
|
|
37
|
+
|
|
38
|
+
npm_version = if gem_version.strip.empty?
|
|
39
|
+
""
|
|
40
|
+
else
|
|
41
|
+
Shakapacker::VersionSyntaxConverter.new.rubygem_to_npm(gem_version)
|
|
42
|
+
end
|
|
43
|
+
|
|
44
|
+
# See https://github.com/svenfuchs/gem-release
|
|
45
|
+
sh_in_dir(gem_root, "git pull --rebase")
|
|
46
|
+
sh_in_dir(gem_root, "gem bump --no-commit #{gem_version.strip.empty? ? '' : %(--version #{gem_version})}")
|
|
47
|
+
|
|
48
|
+
# Will bump the yarn version, commit, tag the commit, push to repo, and release on yarn
|
|
49
|
+
release_it_command = +"release-it"
|
|
50
|
+
release_it_command << " #{npm_version}" unless npm_version.strip.empty?
|
|
51
|
+
release_it_command << " --npm.publish --no-git.requireCleanWorkingDir"
|
|
52
|
+
release_it_command << " --dry-run --verbose" if is_dry_run
|
|
53
|
+
sh_in_dir(gem_root, release_it_command)
|
|
54
|
+
|
|
55
|
+
# Release the new gem version
|
|
56
|
+
sh_in_dir(gem_root, "gem release") unless is_dry_run
|
|
57
|
+
end
|
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
require "test_helper"
|
|
2
|
+
|
|
3
|
+
class CommandTest < Minitest::Test
|
|
4
|
+
def test_compile_command_returns_success_status_when_stale
|
|
5
|
+
Webpacker.compiler.stub :stale?, true do
|
|
6
|
+
Webpacker.compiler.stub :run_webpack, true do
|
|
7
|
+
assert_equal true, Webpacker.commands.compile
|
|
8
|
+
end
|
|
9
|
+
end
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
def test_compile_command_returns_success_status_when_fresh
|
|
13
|
+
Webpacker.compiler.stub :stale?, false do
|
|
14
|
+
Webpacker.compiler.stub :run_webpack, true do
|
|
15
|
+
assert_equal true, Webpacker.commands.compile
|
|
16
|
+
end
|
|
17
|
+
end
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
def test_compile_command_returns_failure_status_when_stale
|
|
21
|
+
Webpacker.compiler.stub :stale?, true do
|
|
22
|
+
Webpacker.compiler.stub :run_webpack, false do
|
|
23
|
+
assert_equal false, Webpacker.commands.compile
|
|
24
|
+
end
|
|
25
|
+
end
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
def test_clean_command_works_with_nested_hashes_and_without_any_compiled_files
|
|
29
|
+
File.stub :delete, true do
|
|
30
|
+
assert Webpacker.commands.clean
|
|
31
|
+
end
|
|
32
|
+
end
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
class ClearCommandVersioningTest < Minitest::Test
|
|
36
|
+
def setup
|
|
37
|
+
@now = Time.parse("2021-01-01 12:34:56 UTC")
|
|
38
|
+
# Test assets to be kept and deleted, path and mtime
|
|
39
|
+
@prev_files = {
|
|
40
|
+
# recent versions to be kept with Webpacker.commands.clean(count = 2)
|
|
41
|
+
"js/application-deadbeef.js" => @now - 4000,
|
|
42
|
+
"js/common-deadbeee.js" => @now - 4002,
|
|
43
|
+
"css/common-deadbeed.css" => @now - 4004,
|
|
44
|
+
"media/images/logo-deadbeeb.css" => @now - 4006,
|
|
45
|
+
"js/application-1eadbeef.js" => @now - 8000,
|
|
46
|
+
"js/common-1eadbeee.js" => @now - 8002,
|
|
47
|
+
"css/common-1eadbeed.css" => @now - 8004,
|
|
48
|
+
"media/images/logo-1eadbeeb.css" => @now - 8006,
|
|
49
|
+
# new files to be kept with Webpacker.commands.clean(age = 3600)
|
|
50
|
+
"js/brandnew-0001.js" => @now,
|
|
51
|
+
"js/brandnew-0002.js" => @now - 10,
|
|
52
|
+
"js/brandnew-0003.js" => @now - 20,
|
|
53
|
+
"js/brandnew-0004.js" => @now - 40,
|
|
54
|
+
}.transform_keys { |path| "#{Webpacker.config.public_output_path}/#{path}" }
|
|
55
|
+
@expired_files = {
|
|
56
|
+
# old files that are outside count = 2 or age = 3600 and to be deleted
|
|
57
|
+
"js/application-0eadbeef.js" => @now - 9000,
|
|
58
|
+
"js/common-0eadbeee.js" => @now - 9002,
|
|
59
|
+
"css/common-0eadbeed.css" => @now - 9004,
|
|
60
|
+
"js/brandnew-0005.js" => @now - 3640,
|
|
61
|
+
}.transform_keys { |path| "#{Webpacker.config.public_output_path}/#{path}" }
|
|
62
|
+
@all_files = @prev_files.merge(@expired_files)
|
|
63
|
+
@dir_glob_stub = Proc.new { |arg|
|
|
64
|
+
case arg
|
|
65
|
+
when "#{Webpacker.config.public_output_path}/**/*"
|
|
66
|
+
@all_files.keys
|
|
67
|
+
else
|
|
68
|
+
[]
|
|
69
|
+
end
|
|
70
|
+
}
|
|
71
|
+
@file_mtime_stub = Proc.new { |longpath|
|
|
72
|
+
@all_files[longpath]
|
|
73
|
+
}
|
|
74
|
+
@file_delete_mock = Minitest::Mock.new
|
|
75
|
+
@expired_files.keys.each do |longpath|
|
|
76
|
+
@file_delete_mock.expect(:delete, 1, [longpath])
|
|
77
|
+
end
|
|
78
|
+
@file_delete_stub = Proc.new { |longpath|
|
|
79
|
+
if @prev_files.has_key?(longpath)
|
|
80
|
+
flunk "#{longpath} should not be deleted"
|
|
81
|
+
else
|
|
82
|
+
@file_delete_mock.delete(longpath)
|
|
83
|
+
end
|
|
84
|
+
}
|
|
85
|
+
end
|
|
86
|
+
|
|
87
|
+
def time_and_files_stub(&proc)
|
|
88
|
+
Time.stub :now, @now do
|
|
89
|
+
Dir.stub :glob, @dir_glob_stub do
|
|
90
|
+
File.stub :directory?, false do
|
|
91
|
+
File.stub :file?, true do
|
|
92
|
+
File.stub :mtime, @file_mtime_stub do
|
|
93
|
+
File.stub :delete, @file_delete_stub do
|
|
94
|
+
yield proc
|
|
95
|
+
end
|
|
96
|
+
end
|
|
97
|
+
end
|
|
98
|
+
end
|
|
99
|
+
end
|
|
100
|
+
end
|
|
101
|
+
@file_delete_mock.verify
|
|
102
|
+
end
|
|
103
|
+
|
|
104
|
+
def test_clean_command_with_versioned_files
|
|
105
|
+
time_and_files_stub do
|
|
106
|
+
assert Webpacker.commands.clean
|
|
107
|
+
end
|
|
108
|
+
end
|
|
109
|
+
end
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
require "test_helper"
|
|
2
|
+
|
|
3
|
+
class CompilerTest < Minitest::Test
|
|
4
|
+
def remove_compilation_digest_path
|
|
5
|
+
Webpacker.compiler.send(:compilation_digest_path).tap do |path|
|
|
6
|
+
path.delete if path.exist?
|
|
7
|
+
end
|
|
8
|
+
end
|
|
9
|
+
|
|
10
|
+
def setup
|
|
11
|
+
remove_compilation_digest_path
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
def teardown
|
|
15
|
+
remove_compilation_digest_path
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
def test_custom_environment_variables
|
|
19
|
+
assert_nil Webpacker.compiler.send(:webpack_env)["FOO"]
|
|
20
|
+
Webpacker.compiler.env["FOO"] = "BAR"
|
|
21
|
+
assert Webpacker.compiler.send(:webpack_env)["FOO"] == "BAR"
|
|
22
|
+
ensure
|
|
23
|
+
Webpacker.compiler.env = {}
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
def test_freshness
|
|
27
|
+
assert Webpacker.compiler.stale?
|
|
28
|
+
assert !Webpacker.compiler.fresh?
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
def test_compile
|
|
32
|
+
assert !Webpacker.compiler.compile
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
def test_freshness_on_compile_success
|
|
36
|
+
status = OpenStruct.new(success?: true)
|
|
37
|
+
|
|
38
|
+
assert Webpacker.compiler.stale?
|
|
39
|
+
Open3.stub :capture3, [:sterr, :stdout, status] do
|
|
40
|
+
Webpacker.compiler.compile
|
|
41
|
+
assert Webpacker.compiler.fresh?
|
|
42
|
+
end
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
def test_freshness_on_compile_fail
|
|
46
|
+
status = OpenStruct.new(success?: false)
|
|
47
|
+
|
|
48
|
+
assert Webpacker.compiler.stale?
|
|
49
|
+
Open3.stub :capture3, [:sterr, :stdout, status] do
|
|
50
|
+
Webpacker.compiler.compile
|
|
51
|
+
assert Webpacker.compiler.fresh?
|
|
52
|
+
end
|
|
53
|
+
end
|
|
54
|
+
|
|
55
|
+
def test_compilation_digest_path
|
|
56
|
+
assert_equal Webpacker.compiler.send(:compilation_digest_path).basename.to_s, "last-compilation-digest-#{Webpacker.env}"
|
|
57
|
+
end
|
|
58
|
+
|
|
59
|
+
def test_external_env_variables
|
|
60
|
+
assert_nil Webpacker.compiler.send(:webpack_env)["WEBPACKER_ASSET_HOST"]
|
|
61
|
+
assert_nil Webpacker.compiler.send(:webpack_env)["WEBPACKER_RELATIVE_URL_ROOT"]
|
|
62
|
+
|
|
63
|
+
ENV["WEBPACKER_ASSET_HOST"] = "foo.bar"
|
|
64
|
+
ENV["WEBPACKER_RELATIVE_URL_ROOT"] = "/baz"
|
|
65
|
+
assert_equal Webpacker.compiler.send(:webpack_env)["WEBPACKER_ASSET_HOST"], "foo.bar"
|
|
66
|
+
assert_equal Webpacker.compiler.send(:webpack_env)["WEBPACKER_RELATIVE_URL_ROOT"], "/baz"
|
|
67
|
+
end
|
|
68
|
+
end
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
require "test_helper"
|
|
2
|
+
|
|
3
|
+
class ConfigurationTest < Webpacker::Test
|
|
4
|
+
def setup
|
|
5
|
+
@config = Webpacker::Configuration.new(
|
|
6
|
+
root_path: Pathname.new(File.expand_path("test_app", __dir__)),
|
|
7
|
+
config_path: Pathname.new(File.expand_path("./test_app/config/webpacker.yml", __dir__)),
|
|
8
|
+
env: "production"
|
|
9
|
+
)
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
def test_source_path
|
|
13
|
+
source_path = File.expand_path File.join(File.dirname(__FILE__), "test_app/app/packs").to_s
|
|
14
|
+
assert_equal source_path, @config.source_path.to_s
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
def test_source_entry_path
|
|
18
|
+
source_entry_path = File.expand_path File.join(File.dirname(__FILE__), "test_app/app/packs", "entrypoints").to_s
|
|
19
|
+
assert_equal @config.source_entry_path.to_s, source_entry_path
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
def test_public_root_path
|
|
23
|
+
public_root_path = File.expand_path File.join(File.dirname(__FILE__), "test_app/public").to_s
|
|
24
|
+
assert_equal @config.public_path.to_s, public_root_path
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
def test_public_output_path
|
|
28
|
+
public_output_path = File.expand_path File.join(File.dirname(__FILE__), "test_app/public/packs").to_s
|
|
29
|
+
assert_equal @config.public_output_path.to_s, public_output_path
|
|
30
|
+
|
|
31
|
+
@config = Webpacker::Configuration.new(
|
|
32
|
+
root_path: @config.root_path,
|
|
33
|
+
config_path: Pathname.new(File.expand_path("./test_app/config/webpacker_public_root.yml", __dir__)),
|
|
34
|
+
env: "production"
|
|
35
|
+
)
|
|
36
|
+
|
|
37
|
+
public_output_path = File.expand_path File.join(File.dirname(__FILE__), "public/packs").to_s
|
|
38
|
+
assert_equal @config.public_output_path.to_s, public_output_path
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
def test_public_manifest_path
|
|
42
|
+
public_manifest_path = File.expand_path File.join(File.dirname(__FILE__), "test_app/public/packs", "manifest.json").to_s
|
|
43
|
+
assert_equal @config.public_manifest_path.to_s, public_manifest_path
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
def test_cache_path
|
|
47
|
+
cache_path = File.expand_path File.join(File.dirname(__FILE__), "test_app/tmp/webpacker").to_s
|
|
48
|
+
assert_equal @config.cache_path.to_s, cache_path
|
|
49
|
+
end
|
|
50
|
+
|
|
51
|
+
def test_additional_paths
|
|
52
|
+
assert_equal @config.additional_paths, ["app/assets", "/etc/yarn", "some.config.js", "app/elm"]
|
|
53
|
+
end
|
|
54
|
+
|
|
55
|
+
def test_cache_manifest?
|
|
56
|
+
assert @config.cache_manifest?
|
|
57
|
+
|
|
58
|
+
with_rails_env("development") do
|
|
59
|
+
refute Webpacker.config.cache_manifest?
|
|
60
|
+
end
|
|
61
|
+
|
|
62
|
+
with_rails_env("test") do
|
|
63
|
+
refute Webpacker.config.cache_manifest?
|
|
64
|
+
end
|
|
65
|
+
end
|
|
66
|
+
|
|
67
|
+
def test_compile?
|
|
68
|
+
refute @config.compile?
|
|
69
|
+
|
|
70
|
+
with_rails_env("development") do
|
|
71
|
+
assert Webpacker.config.compile?
|
|
72
|
+
end
|
|
73
|
+
|
|
74
|
+
with_rails_env("test") do
|
|
75
|
+
assert Webpacker.config.compile?
|
|
76
|
+
end
|
|
77
|
+
end
|
|
78
|
+
end
|