froxy 0.1.2 → 0.2.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.gitignore +2 -1
- data/Gemfile.lock +1 -1
- data/README.md +29 -5
- data/bin/froxy +15 -15
- data/lib/froxy/esbuild/plugins/alias.js +4 -4
- data/lib/froxy/esbuild/plugins/css.js +52 -27
- data/lib/froxy/esbuild/plugins/ignore.js +14 -0
- data/lib/froxy/esbuild/plugins/images.js +7 -5
- data/lib/froxy/esbuild/plugins/root.js +5 -3
- data/lib/froxy/esbuild/utils.js +34 -33
- data/lib/froxy/proxy.rb +17 -4
- data/lib/froxy/version.rb +1 -1
- data/package.json +1 -3
- data/yarn.lock +0 -4
- metadata +3 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 926d7b56d53ab4dc548a73b3d8f06c231d0bff8a3ea6ade601b6b4625582c529
|
4
|
+
data.tar.gz: 50e66435e3858795c88af5f20609e286336fa627e15f2f430ea66a617faf719f
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 65623c88771f9a1654d2612fa31954adc8f35ee7152575e8c9b14aef146a77acb63715b2f4ae37ee807ec13faea7ad02a3a6c9941ea06b7cfb39268e5d7e3990
|
7
|
+
data.tar.gz: f2a78301922e4dd6fbf505dc3c0a83bf94a7a6878bfc2c8d7109b0111e813367bc6425fd661b3bd1ad9b927188aeaf5c1f5130010ddcb2631a0827aaac7cbfdb
|
data/.gitignore
CHANGED
data/Gemfile.lock
CHANGED
data/README.md
CHANGED
@@ -24,6 +24,7 @@ production mode will likely include pre-built cachable assets.
|
|
24
24
|
- Code Splitting.
|
25
25
|
- Source Maps.
|
26
26
|
- Minification.
|
27
|
+
- PostCSS support.
|
27
28
|
|
28
29
|
## Roadmap
|
29
30
|
|
@@ -32,7 +33,6 @@ In no particular order:
|
|
32
33
|
- Pre-bundling / cached assets.
|
33
34
|
- Typescript.
|
34
35
|
- CSS Modules.
|
35
|
-
- PostCSS support.
|
36
36
|
|
37
37
|
## Installation
|
38
38
|
|
@@ -82,6 +82,12 @@ imported from JS will result in the requested CSS injected into an HTML `link` t
|
|
82
82
|
import '/my/styles.css'
|
83
83
|
```
|
84
84
|
|
85
|
+
### PostCSS
|
86
|
+
|
87
|
+
[PostCSS](https://postcss.org/) is supported out of the box. If any
|
88
|
+
[PostCSS config](https://github.com/postcss/postcss-load-config) is found in your project, then any
|
89
|
+
local CSS (not from node modules) will be parsed with PostCSS.
|
90
|
+
|
85
91
|
### Images/Fonts, etc.
|
86
92
|
|
87
93
|
When called directly, images are served directly - avoiding a call to esbuild. But when an image is
|
@@ -153,10 +159,12 @@ There are a few options that you can customise, and they are all defined in your
|
|
153
159
|
example:
|
154
160
|
|
155
161
|
```json
|
156
|
-
|
157
|
-
"
|
158
|
-
|
159
|
-
"
|
162
|
+
{
|
163
|
+
"froxy": {
|
164
|
+
"target": [],
|
165
|
+
"aliases": {
|
166
|
+
"_": "lodash"
|
167
|
+
}
|
160
168
|
}
|
161
169
|
}
|
162
170
|
```
|
@@ -185,6 +193,22 @@ See esbuild's documentation on [minification](https://esbuild.github.io/api/#min
|
|
185
193
|
|
186
194
|
See esbuild's documentation on [sourcemap](https://esbuild.github.io/api/#sourcemap).
|
187
195
|
|
196
|
+
#### `ignore`
|
197
|
+
|
198
|
+
A regular expression matching paths that should be ignored and not built or bundled.
|
199
|
+
|
200
|
+
Example:
|
201
|
+
|
202
|
+
Ignore all paths starting with "/fonts/":
|
203
|
+
|
204
|
+
```json
|
205
|
+
{
|
206
|
+
"froxy": {
|
207
|
+
"ignore": "^\\/fonts\\/"
|
208
|
+
}
|
209
|
+
}
|
210
|
+
```
|
211
|
+
|
188
212
|
## Development
|
189
213
|
|
190
214
|
After checking out the repo, run `bin/setup` to install dependencies. Then, run `rake test` to run the tests. You can also run `bin/console` for an interactive prompt that will allow you to experiment.
|
data/bin/froxy
CHANGED
@@ -1,27 +1,25 @@
|
|
1
1
|
#!/usr/bin/env node
|
2
2
|
|
3
|
-
const
|
3
|
+
const [, , cwd, entryPoint] = process.argv
|
4
4
|
|
5
|
-
const
|
5
|
+
const esbuild = require(require.resolve('esbuild', { paths: [cwd] }))
|
6
6
|
|
7
7
|
const { resolve, config } = require('../lib/froxy/esbuild/utils')
|
8
8
|
const loadStylePlugin = require('../lib/froxy/esbuild/plugins/load_style')
|
9
|
-
const
|
10
|
-
const aliasPlugin = require('../lib/froxy/esbuild/plugins/alias')
|
11
|
-
const cssPlugin = require('../lib/froxy/esbuild/plugins/css')
|
12
|
-
const imagesPlugin = require('../lib/froxy/esbuild/plugins/images')
|
13
|
-
const rootPlugin = require('../lib/froxy/esbuild/plugins/root')
|
14
|
-
|
15
|
-
const conf = config(absWorkingDir)
|
9
|
+
const ignorePlugin = require('../lib/froxy/esbuild/plugins/ignore')
|
10
|
+
const aliasPlugin = require('../lib/froxy/esbuild/plugins/alias')
|
11
|
+
const cssPlugin = require('../lib/froxy/esbuild/plugins/css')
|
12
|
+
const imagesPlugin = require('../lib/froxy/esbuild/plugins/images')
|
13
|
+
const rootPlugin = require('../lib/froxy/esbuild/plugins/root')
|
16
14
|
|
17
15
|
const buildOptions = {
|
18
|
-
absWorkingDir,
|
16
|
+
absWorkingDir: cwd,
|
19
17
|
entryPoints: [entryPoint],
|
20
18
|
bundle: true,
|
21
|
-
target:
|
22
|
-
minify:
|
23
|
-
inject:
|
24
|
-
sourcemap:
|
19
|
+
target: config.target,
|
20
|
+
minify: config.minify,
|
21
|
+
inject: config.inject,
|
22
|
+
sourcemap: config.sourcemap,
|
25
23
|
format: 'esm',
|
26
24
|
splitting: true,
|
27
25
|
outdir: 'public/froxy/build',
|
@@ -32,9 +30,11 @@ const buildOptions = {
|
|
32
30
|
'process.env.NODE_ENV': `"${process.env.NODE_ENV || 'development'}"`,
|
33
31
|
'process.env.RAILS_ENV': `"${process.env.RAILS_ENV || 'development'}"`
|
34
32
|
},
|
35
|
-
plugins: [aliasPlugin,
|
33
|
+
plugins: [aliasPlugin, loadStylePlugin, cssPlugin, imagesPlugin, rootPlugin]
|
36
34
|
}
|
37
35
|
|
36
|
+
config.ignore && buildOptions.plugins.unshift(ignorePlugin)
|
37
|
+
|
38
38
|
esbuild.build(buildOptions).catch(() => {
|
39
39
|
process.exit(1)
|
40
40
|
})
|
@@ -17,14 +17,14 @@ const { resolve, config } = require('../utils')
|
|
17
17
|
// import { map } from '_'
|
18
18
|
// import axios from 'myaxios'
|
19
19
|
//
|
20
|
-
module.exports =
|
20
|
+
module.exports = {
|
21
21
|
name: 'froxy.alias',
|
22
22
|
setup(build) {
|
23
23
|
let map = []
|
24
24
|
let aliases = {}
|
25
25
|
|
26
26
|
try {
|
27
|
-
map = config
|
27
|
+
map = config.aliases
|
28
28
|
aliases = Object.keys(map)
|
29
29
|
} catch {
|
30
30
|
// Fail silently, as there is no package.json.
|
@@ -35,11 +35,11 @@ module.exports = absWorkingDir => ({
|
|
35
35
|
const re = new RegExp(`^${aliases.map(x => escapeRegExp(x)).join('|')}$`)
|
36
36
|
|
37
37
|
build.onResolve({ filter: re }, async ({ resolveDir, path }) => ({
|
38
|
-
path: await resolve(
|
38
|
+
path: await resolve(resolveDir, map[path], { fallbackToEsbuild: true })
|
39
39
|
}))
|
40
40
|
}
|
41
41
|
}
|
42
|
-
}
|
42
|
+
}
|
43
43
|
|
44
44
|
function escapeRegExp(string) {
|
45
45
|
// $& means the whole matched string
|
@@ -3,21 +3,24 @@ const fs = require('fs')
|
|
3
3
|
|
4
4
|
const { resolve } = require('../utils')
|
5
5
|
|
6
|
-
|
6
|
+
const [, , cwd] = process.argv
|
7
|
+
|
8
|
+
module.exports = {
|
7
9
|
name: 'froxy.css',
|
8
10
|
setup(build) {
|
9
|
-
|
10
|
-
|
11
|
-
let resolvedPath = resolve(absWorkingDir, args.resolveDir, args.path)
|
11
|
+
build.onResolve({ filter: /\.css$/ }, async args => {
|
12
|
+
let resolvedPath = resolve(args.resolveDir, args.path)
|
12
13
|
|
14
|
+
// Resolved path is not relative or absolute, so we assume it's a node module, and attempt to
|
15
|
+
// resolve it from node_modules.
|
13
16
|
if (resolvedPath === args.path) {
|
14
|
-
const nodeModulesDir = path.join(
|
17
|
+
const nodeModulesDir = path.join(cwd, 'node_modules')
|
15
18
|
|
16
19
|
try {
|
17
|
-
fs.
|
20
|
+
await fs.promises.access(nodeModulesDir, fs.constants.R_OK)
|
18
21
|
resolvedPath = path.join(nodeModulesDir, args.path)
|
19
22
|
} catch {
|
20
|
-
//
|
23
|
+
// Fail siently
|
21
24
|
}
|
22
25
|
}
|
23
26
|
|
@@ -27,24 +30,46 @@ module.exports = absWorkingDir => ({
|
|
27
30
|
}
|
28
31
|
})
|
29
32
|
|
30
|
-
//
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
33
|
+
// When CSS is requested directly - and not imported from JS.
|
34
|
+
build.onLoad({ filter: /\.css$/, namespace: 'file' }, async args => {
|
35
|
+
// Don't parse node modules with postcss.
|
36
|
+
if (args.path.includes('node_modules')) return
|
37
|
+
|
38
|
+
const postcssrc = require(require.resolve('postcss-load-config', { paths: [cwd] }))
|
39
|
+
|
40
|
+
let postcssConfig
|
41
|
+
try {
|
42
|
+
postcssConfig = await postcssrc({ cwd: cwd }, cwd)
|
43
|
+
} catch {
|
44
|
+
// Fail siently
|
45
|
+
}
|
46
|
+
|
47
|
+
if (postcssConfig) {
|
48
|
+
const postcss = require(require.resolve('postcss', { paths: [cwd] }))
|
49
|
+
const css = await fs.promises.readFile(args.path, 'utf8')
|
50
|
+
|
51
|
+
const result = await postcss(postcssConfig.plugins).process(css, {
|
52
|
+
...postcssConfig.options,
|
53
|
+
from: args.path
|
54
|
+
})
|
55
|
+
|
56
|
+
return {
|
57
|
+
contents: result.css,
|
58
|
+
loader: 'css'
|
59
|
+
}
|
60
|
+
}
|
61
|
+
})
|
62
|
+
|
63
|
+
// When CSS is imported from JS, the CSS is injected into the DOM as a <link> tag. The browser
|
64
|
+
// then loads the CSS file as it usually would.
|
65
|
+
build.onLoad({ filter: /\.css$/, namespace: 'cssFromJs' }, args => {
|
66
|
+
return {
|
67
|
+
contents: `
|
68
|
+
import loadStyle from 'loadStyle'
|
69
|
+
loadStyle("${args.path.slice(cwd.length)}")
|
70
|
+
`,
|
71
|
+
loader: 'js'
|
72
|
+
}
|
73
|
+
})
|
49
74
|
}
|
50
|
-
}
|
75
|
+
}
|
@@ -0,0 +1,14 @@
|
|
1
|
+
const path = require('path')
|
2
|
+
|
3
|
+
const { config } = require('../utils')
|
4
|
+
|
5
|
+
if (!config.ignore) return
|
6
|
+
|
7
|
+
module.exports = {
|
8
|
+
name: 'froxy.ignore',
|
9
|
+
setup(build) {
|
10
|
+
build.onResolve({ filter: new RegExp(config.ignore) }, args => ({
|
11
|
+
external: true
|
12
|
+
}))
|
13
|
+
}
|
14
|
+
}
|
@@ -1,6 +1,8 @@
|
|
1
1
|
const { resolve } = require('../utils')
|
2
2
|
|
3
|
-
|
3
|
+
const [, , cwd] = process.argv
|
4
|
+
|
5
|
+
module.exports = {
|
4
6
|
name: 'froxy.images',
|
5
7
|
setup(build) {
|
6
8
|
const IMAGE_TYPES = /\.(png|gif|jpe?g|svg|ico|webp|avif)$/
|
@@ -10,11 +12,11 @@ module.exports = absWorkingDir => ({
|
|
10
12
|
// exported using the default export. Including an image in CSS using `url()`, will simply
|
11
13
|
// return the relative URL of the image.
|
12
14
|
build.onResolve({ filter: IMAGE_TYPES }, args => {
|
13
|
-
const resolvedPath = resolve(
|
15
|
+
const resolvedPath = resolve(args.resolveDir, args.path)
|
14
16
|
|
15
17
|
if (args.importer.endsWith('.css')) {
|
16
18
|
return {
|
17
|
-
path: resolvedPath.slice(
|
19
|
+
path: resolvedPath.slice(cwd.length),
|
18
20
|
external: true
|
19
21
|
}
|
20
22
|
} else {
|
@@ -24,9 +26,9 @@ module.exports = absWorkingDir => ({
|
|
24
26
|
|
25
27
|
build.onLoad({ filter: IMAGE_TYPES }, args => {
|
26
28
|
return {
|
27
|
-
contents: `export default '${args.path.slice(
|
29
|
+
contents: `export default '${args.path.slice(cwd.length)}';`,
|
28
30
|
loader: 'js'
|
29
31
|
}
|
30
32
|
})
|
31
33
|
}
|
32
|
-
}
|
34
|
+
}
|
@@ -1,6 +1,8 @@
|
|
1
1
|
const path = require('path')
|
2
2
|
|
3
|
-
|
3
|
+
const [, , cwd] = process.argv
|
4
|
+
|
5
|
+
module.exports = {
|
4
6
|
name: 'froxy.root',
|
5
7
|
setup(build) {
|
6
8
|
// Resolves paths starting with a `/` to the Rails root.
|
@@ -8,7 +10,7 @@ module.exports = absWorkingDir => ({
|
|
8
10
|
// Example:
|
9
11
|
// import '/my/lib.js' //-> import '{Rails.root}/my/lib.js'
|
10
12
|
build.onResolve({ filter: /^\// }, args => ({
|
11
|
-
path: path.join(
|
13
|
+
path: path.join(cwd, args.path)
|
12
14
|
}))
|
13
15
|
}
|
14
|
-
}
|
16
|
+
}
|
data/lib/froxy/esbuild/utils.js
CHANGED
@@ -1,39 +1,42 @@
|
|
1
1
|
const path = require('path')
|
2
2
|
const fs = require('fs')
|
3
|
-
const esbuild = require(require.resolve('esbuild', { paths: [process.cwd()] }))
|
4
3
|
|
5
|
-
|
6
|
-
const resolve = (absWorkingDir, b, p, options = {}) => {
|
7
|
-
options = {
|
8
|
-
fallbackToEsbuild: false,
|
9
|
-
...options
|
10
|
-
}
|
4
|
+
const [, , cwd] = process.argv
|
11
5
|
|
12
|
-
|
13
|
-
|
6
|
+
module.exports = {
|
7
|
+
// Resolve the given path (`p`) to an absolute path.
|
8
|
+
resolve: (b, p, options = {}) => {
|
9
|
+
options = {
|
10
|
+
fallbackToEsbuild: false,
|
11
|
+
...options
|
12
|
+
}
|
14
13
|
|
15
|
-
|
16
|
-
|
17
|
-
}
|
14
|
+
if (p.startsWith('/')) return path.resolve(cwd, p.slice(1))
|
15
|
+
if (p.startsWith('.')) return path.resolve(b, p)
|
18
16
|
|
19
|
-
|
20
|
-
|
17
|
+
if (options.fallbackToEsbuild) {
|
18
|
+
return (async () => await esbuildResolve(p, b))()
|
19
|
+
}
|
21
20
|
|
22
|
-
|
23
|
-
|
24
|
-
const defaultConfig = {
|
25
|
-
minify: false,
|
26
|
-
sourcemap: true
|
27
|
-
}
|
21
|
+
return p
|
22
|
+
},
|
28
23
|
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
24
|
+
get config() {
|
25
|
+
let packageConfig = {}
|
26
|
+
const defaultConfig = {
|
27
|
+
minify: false,
|
28
|
+
sourcemap: true
|
29
|
+
}
|
30
|
+
|
31
|
+
try {
|
32
|
+
const pkg = fs.readFileSync(path.join(cwd, 'package.json'))
|
33
|
+
packageConfig = JSON.parse(pkg).froxy
|
34
|
+
} catch {
|
35
|
+
// Fail silently, as there is no package.json.
|
36
|
+
}
|
35
37
|
|
36
|
-
|
38
|
+
return { ...defaultConfig, ...packageConfig }
|
39
|
+
}
|
37
40
|
}
|
38
41
|
|
39
42
|
// Resolves a module using esbuild module resolution.
|
@@ -41,9 +44,12 @@ const config = absWorkingDir => {
|
|
41
44
|
// @param {string} id Module to resolve
|
42
45
|
// @param {string} [resolveDir] The directory to resolve from
|
43
46
|
// @returns {string} The resolved module
|
44
|
-
async function esbuildResolve(id, resolveDir
|
47
|
+
async function esbuildResolve(id, resolveDir) {
|
48
|
+
const esbuild = require(require.resolve('esbuild', { paths: [cwd] }))
|
49
|
+
|
45
50
|
let _resolve
|
46
51
|
const resolvedPromise = new Promise(resolve => (_resolve = resolve))
|
52
|
+
|
47
53
|
return Promise.race([
|
48
54
|
resolvedPromise,
|
49
55
|
esbuild
|
@@ -76,8 +82,3 @@ async function esbuildResolve(id, resolveDir = process.cwd()) {
|
|
76
82
|
.then(() => id)
|
77
83
|
])
|
78
84
|
}
|
79
|
-
|
80
|
-
module.exports = {
|
81
|
-
resolve,
|
82
|
-
config
|
83
|
-
}
|
data/lib/froxy/proxy.rb
CHANGED
@@ -2,13 +2,16 @@
|
|
2
2
|
|
3
3
|
require 'open3'
|
4
4
|
require 'rack/utils'
|
5
|
+
require 'active_support/benchmarkable'
|
5
6
|
|
6
7
|
# Proxies files to esbuild.
|
7
8
|
module Froxy
|
8
9
|
class Proxy
|
10
|
+
include ActiveSupport::Benchmarkable
|
11
|
+
|
9
12
|
BUILD_PATH = 'public/froxy/build'
|
10
13
|
CLI = File.expand_path('../../bin/froxy', __dir__)
|
11
|
-
|
14
|
+
FALLTHRU_TYPES = /\.(png|gif|jpeg|jpg|svg|ico|webp|avif)$/i.freeze
|
12
15
|
FILE_EXT_MAP = {
|
13
16
|
'.jsx' => '.js'
|
14
17
|
}.freeze
|
@@ -25,7 +28,7 @@ module Froxy
|
|
25
28
|
|
26
29
|
if req.get? || req.head?
|
27
30
|
# Let images through.
|
28
|
-
return @file_server.call(env) if
|
31
|
+
return @file_server.call(env) if FALLTHRU_TYPES.match?(path_info)
|
29
32
|
|
30
33
|
# Let JS sourcemaps through.
|
31
34
|
return @build_file_server.call(env) if /\.js\.map$/i.match?(path_info)
|
@@ -34,9 +37,12 @@ module Froxy
|
|
34
37
|
if /\.(js|jsx|css)$/i.match?(path_info)
|
35
38
|
return unless (path = clean_path(path_info))
|
36
39
|
return [404, {}, []] unless file_readable?(path)
|
40
|
+
|
37
41
|
return @file_server.call(env) unless Rails.application.config.froxy.use_esbuild
|
38
42
|
|
39
|
-
return
|
43
|
+
return benchmark logging_message(req) do
|
44
|
+
build env, req, path
|
45
|
+
end
|
40
46
|
end
|
41
47
|
end
|
42
48
|
|
@@ -45,6 +51,10 @@ module Froxy
|
|
45
51
|
|
46
52
|
private
|
47
53
|
|
54
|
+
def logging_message(request)
|
55
|
+
format '[froxy] "%s" for %s at %s', request.path_info, request.ip, Time.now.to_default_s
|
56
|
+
end
|
57
|
+
|
48
58
|
def path_to_file(env, request, path)
|
49
59
|
ext = Pathname.new(path).extname
|
50
60
|
request.path_info = path.sub(/#{ext}$/, FILE_EXT_MAP[ext]) if FILE_EXT_MAP.key?(ext)
|
@@ -57,7 +67,6 @@ module Froxy
|
|
57
67
|
stdout, stderr, status = Open3.capture3(CLI, Rails.root.to_s, path)
|
58
68
|
|
59
69
|
if status.success?
|
60
|
-
Rails.logger.info "[froxy] built #{path}"
|
61
70
|
raise "[froxy] build failed: #{stderr}" unless stderr.empty?
|
62
71
|
else
|
63
72
|
non_empty_streams = [stdout, stderr].delete_if(&:empty?)
|
@@ -79,5 +88,9 @@ module Froxy
|
|
79
88
|
path = Rack::Utils.unescape_path path_info.chomp('/').delete_prefix('/')
|
80
89
|
Rack::Utils.clean_path_info path if Rack::Utils.valid_path? path
|
81
90
|
end
|
91
|
+
|
92
|
+
def logger
|
93
|
+
Rails.logger
|
94
|
+
end
|
82
95
|
end
|
83
96
|
end
|
data/lib/froxy/version.rb
CHANGED
data/package.json
CHANGED
data/yarn.lock
CHANGED
@@ -2,7 +2,3 @@
|
|
2
2
|
# yarn lockfile v1
|
3
3
|
|
4
4
|
|
5
|
-
esbuild@0.8.50:
|
6
|
-
version "0.8.50"
|
7
|
-
resolved "https://registry.yarnpkg.com/esbuild/-/esbuild-0.8.50.tgz#ebf24fde0cdad1a369789dd6fd7a820b0a01e46c"
|
8
|
-
integrity sha512-oidFLXssA7IccYzkqLVZSqNJDwDq8Mh/vqvrW+3fPWM7iUiC5O2bCllhnO8+K9LlyL/2Z6n+WwRJAz9fqSIVRg==
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: froxy
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.2.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Joel Moss
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2021-02-
|
11
|
+
date: 2021-02-24 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: activesupport
|
@@ -55,6 +55,7 @@ files:
|
|
55
55
|
- lib/froxy/esbuild/plugins/css.js
|
56
56
|
- lib/froxy/esbuild/plugins/debug.js
|
57
57
|
- lib/froxy/esbuild/plugins/env.js
|
58
|
+
- lib/froxy/esbuild/plugins/ignore.js
|
58
59
|
- lib/froxy/esbuild/plugins/images.js
|
59
60
|
- lib/froxy/esbuild/plugins/load_style.js
|
60
61
|
- lib/froxy/esbuild/plugins/root.js
|