From c75fb47e72b2752bbb5ed7b0c3a2df74e7053936 Mon Sep 17 00:00:00 2001 From: pqml Date: Mon, 5 Mar 2018 01:35:29 +0100 Subject: [PATCH] Rewrite Readme, add tests, add webpack 4 support --- .gitignore | 22 ++- .npmignore | 13 -- README.md | 76 ++++++---- entry.js | 2 - example.frag | 40 ----- glslify-loader.js | 60 ++++++++ index.html | 64 -------- index.js | 53 ------- package.json | 25 +++- test/fixtures/config-inline.js | 4 + test/fixtures/config-post.js | 23 +++ test/fixtures/config-simple.js | 16 ++ test/fixtures/config-transform.js | 21 +++ test/fixtures/entry-inline.js | 2 + test/fixtures/entry-post.js | 2 + test/fixtures/entry-simple.js | 2 + test/fixtures/entry-transform.js | 2 + test/fixtures/shader-export.glsl | 6 + test/fixtures/shader-fancy-import.glsl | 5 + test/fixtures/shader-hex.glsl | 3 + test/fixtures/shader-simple.glsl | 8 + test/index.js | 43 ++++++ test/utils/readWebpack.js | 32 ++++ webpack.config.js | 13 -- yarn.lock | 196 ------------------------- 25 files changed, 320 insertions(+), 413 deletions(-) delete mode 100644 .npmignore delete mode 100644 entry.js delete mode 100644 example.frag create mode 100644 glslify-loader.js delete mode 100644 index.html delete mode 100644 index.js create mode 100644 test/fixtures/config-inline.js create mode 100644 test/fixtures/config-post.js create mode 100644 test/fixtures/config-simple.js create mode 100644 test/fixtures/config-transform.js create mode 100644 test/fixtures/entry-inline.js create mode 100644 test/fixtures/entry-post.js create mode 100644 test/fixtures/entry-simple.js create mode 100644 test/fixtures/entry-transform.js create mode 100644 test/fixtures/shader-export.glsl create mode 100644 test/fixtures/shader-fancy-import.glsl create mode 100644 test/fixtures/shader-hex.glsl create mode 100644 test/fixtures/shader-simple.glsl create mode 100644 test/index.js create mode 100644 test/utils/readWebpack.js delete mode 100644 webpack.config.js delete mode 100644 yarn.lock diff --git a/.gitignore b/.gitignore index 84b40c2..6eb5612 100644 --- a/.gitignore +++ b/.gitignore @@ -1,4 +1,24 @@ +# Editors +.idea +.vscode + +# Node / Yarn / Npm node_modules +npm-debug.log* +yarn.lock +package-lock.json + +# Logs and Temporary files +.tmp +logs *.log + +# MacOS .DS_Store -bundle.js +.AppleDouble +.LSOverride +Icon +._* + +# Misc +coverage \ No newline at end of file diff --git a/.npmignore b/.npmignore deleted file mode 100644 index 9fc5132..0000000 --- a/.npmignore +++ /dev/null @@ -1,13 +0,0 @@ -node_modules -*.log -.DS_Store -bundle.js -test -test.js -demo -example -.npmignore -webpack.config.js -example.frag -index.html -entry.js diff --git a/README.md b/README.md index e902805..341f952 100644 --- a/README.md +++ b/README.md @@ -1,48 +1,74 @@ # glslify-loader -[![experimental](http://badges.github.io/stability-badges/dist/experimental.svg)](http://github.com/badges/stability-badges) - [glslify](http://github.com/stackgl/glslify) loader module for [webpack](http://webpack.github.io/). ## Installation +```sh +npm install glslify-loader +``` -Generally, you'll want to use this alongside webpack's -`raw-loader` module: - -``` bash -npm install --save glslify-loader raw-loader +Generally, you'll want to use this alongside webpack's [raw-loader](https://github.com/webpack-contrib/raw-loader) module: +```sh +npm install raw-loader ``` ## Usage -[![NPM](https://nodei.co/npm/glslify-loader.png)](https://nodei.co/npm/glslify-loader/) +[Documentation: Using Loaders in Webpack](https://webpack.js.org/concepts/loaders/#configuration) -[Documentation: Using Loaders](http://webpack.github.io/docs/using-loaders.html) +##### Configuration file -Once installed, you should be able to require your shaders -like so to have them bundled at build time: - -``` javascript -var source = require('glslify!raw!./my-shader.glsl') +```js +module.exports = { + rules: [ + { + test: /\.(glsl|vs|fs|vert|frag)$/, + exclude: /node_modules/, + use: [ + 'raw-loader', + 'glslify-loader' + ] + } + ] +} ``` -### Configuration +##### Inline + +```js +// Using require +const source = require('raw-loader!glslify-loader!./my-shader.glsl') -Alternatively, you may apply these loaders automatically -to all `.glsl`, `.frag` and `.vert` files by adding some -additional configuration: +// Using ES6 import statement +import source from 'raw-loader!glslify-loader!./my-shader.glsl' +``` -``` javascript +##### Speficy source transforms +See [Glslify Source Transforms](https://github.com/glslify/glslify#source-transforms) for details. + +```js module.exports = { - module: { - loaders: [ - { test: /\.(glsl|frag|vert)$/, loader: 'raw', exclude: /node_modules/ }, - { test: /\.(glsl|frag|vert)$/, loader: 'glslify', exclude: /node_modules/ } - ] - } + rules: [ + { + test: /\.(glsl|frag|vert)$/, + exclude: /node_modules/, + use: [ + 'raw-loader', + { + loader: 'glslify-loader' + options: { + transform: [ + ['glslify-hex', { 'option-1': true, 'option-2': 42 }] + ] + } + } + ] + } + ] } ``` + ## Contributing See [stackgl/contributing](https://github.com/stackgl/contributing) for details. diff --git a/entry.js b/entry.js deleted file mode 100644 index cf1e5b1..0000000 --- a/entry.js +++ /dev/null @@ -1,2 +0,0 @@ -document.querySelector('[name="orig"]').value = require('!!raw!./example.frag') -document.querySelector('[name="post"]').value = require('./example.frag') diff --git a/example.frag b/example.frag deleted file mode 100644 index 4c6f241..0000000 --- a/example.frag +++ /dev/null @@ -1,40 +0,0 @@ -precision mediump float; - -uniform float iGlobalTime; -uniform vec3 iResolution; - -vec2 doModel(vec3 p); - -#pragma glslify: camera = require('glsl-turntable-camera') -#pragma glslify: noise = require('glsl-noise/simplex/4d') -#pragma glslify: raytrace = require('glsl-raytrace', map = doModel, steps = 90) -#pragma glslify: normal = require('glsl-sdf-normal', map = doModel) - -vec2 doModel(vec3 p) { - float r = 1.0 + noise(vec4(p, iGlobalTime)) * 0.25; - float d = length(p) - r; - float id = 0.0; - - return vec2(d, id); -} - -void main() { - vec3 color = vec3(0.0); - vec3 ro, rd; - - float rotation = iGlobalTime; - float height = 0.0; - float dist = 4.0; - camera(rotation, height, dist, iResolution.xy, ro, rd); - - vec2 t = raytrace(ro, rd); - if (t.x > -0.5) { - vec3 pos = ro + rd * t.x; - vec3 nor = normal(pos); - - color = nor * 0.5 + 0.5; - } - - gl_FragColor.rgb = color; - gl_FragColor.a = 1.0; -} diff --git a/glslify-loader.js b/glslify-loader.js new file mode 100644 index 0000000..b4d7b65 --- /dev/null +++ b/glslify-loader.js @@ -0,0 +1,60 @@ +const path = require('path') +const loaderUtils = require('loader-utils') +const resolve = require('resolve') +const deps = require('glslify-deps') +const bundle = require('glslify-bundle') + +module.exports = function glslifyLoader (content) { + this.cacheable && this.cacheable() + + const depper = deps() + const callback = this.async() + + // Setup options + const options = Object.assign({ + basedir: path.dirname(this.resourcePath), + transform: [] + }, loaderUtils.getOptions(this)) + + // Handle transforms from options + const transforms = Array.isArray(options.transform) ? options.transform : [] + const postTransforms = [] + transforms.forEach(transform => { + if (!Array.isArray(transform)) transform = [String(transform)] + const name = transform[0] + const opts = transform[1] || {} + // Keep post-transforms for later + if (opts.post) postTransforms.push({ name, opts }) + else depper.transform(name, opts) + }) + + // Build the dependency graph + depper.inline(content, options.basedir, (err, tree) => { + if (err) return error(err) + // Make webpack watch each subdependencies + tree && tree.forEach(file => !file.entry && this.addDependency(file.file)) + // Bundle the glsl output + const output = String(bundle(tree)) + // Start applying post transforms + nextPostTransform(null, output) + }) + + // Iterate over each post transforms + function nextPostTransform (err, output) { + if (err) return error(err) + const transform = postTransforms.shift() + if (!transform) return done(output) + resolve(transform.name, { basedir: options.basedir }, (err, target) => { + if (err) return error(err) + require(target)(null, output, transform.opts, nextPostTransform) + }) + } + + function error (err) { + callback(err, null) + } + + function done (output) { + callback(null, output) + } +} diff --git a/index.html b/index.html deleted file mode 100644 index aa9026f..0000000 --- a/index.html +++ /dev/null @@ -1,64 +0,0 @@ - - - - glslify-loader - - - - -
- -
- - - - - diff --git a/index.js b/index.js deleted file mode 100644 index 9f63a1e..0000000 --- a/index.js +++ /dev/null @@ -1,53 +0,0 @@ -// Use 'use strict' to avoid let/const errors with old Node versions -'use strict' - -const path = require('path') -const loaderUtils = require('loader-utils') -const deps = require('glslify-deps') -const bundle = require('glslify-bundle') -const resolve = require('resolve') - -function glslifyLoader (content) { - this.cacheable && this.cacheable() - const callback = this.async() - - // Parse querystring from require path - let query = this.query || {} - if (typeof query === 'string') { - if (query[0] !== '?') query = '?' + query - query = loaderUtils.parseQuery(query) - } - - const depper = deps() - const basedir = path.dirname(this.resourcePath) - - // Add transforms to the shader and its dependencies - const transforms = Array.isArray(query.transform) ? query.transform : [] - const postTransforms = [] - transforms.forEach(transform => { - if (typeof transform !== 'string' && !Array.isArray(transform)) return - const name = Array.isArray(transform) ? transform[0] : transform - const opts = Array.isArray(transform) && transform.length > 1 - ? transform[1] : {} - // Keep post-transforms for later - if (opts && opts.post) return postTransforms.push({ name, opts }) - depper.transform(name, opts) - }) - - // Build the dependency graph - depper.inline(content, basedir, (err, files) => { - if (err) return callback(err, null) - files && files.forEach(file => !file.entry && this.addDependency(file.file)) - let output = bundle(files) - // Apply post-transforms (taken from glslify sourcecode) - postTransforms.forEach(tr => { - const target = resolve.sync(tr.name, { basedir }) - const transform = require(target) - const out = transform(null, output, tr.opts) - if (out) output = out - }) - return callback(err, output) - }) -} - -module.exports = glslifyLoader diff --git a/package.json b/package.json index b009f01..61370b4 100644 --- a/package.json +++ b/package.json @@ -1,24 +1,36 @@ { "name": "glslify-loader", - "version": "1.0.4", + "version": "1.1.0", "description": "glslify loader module for webpack", - "main": "index.js", + "main": "glslify-loader.js", "license": "MIT", "scripts": { - "start": "webpack-dev-server --colors", - "bundle": "webpack" + "test": "npm run tape --silent", + "tape": "tape test/index.js | tap-spec" }, "author": { "name": "Hugh Kennedy", "email": "hughskennedy@gmail.com", "url": "http://hughsk.io/" }, + "files": [], "dependencies": { "glslify-bundle": "^5.0.0", "glslify-deps": "^1.3.0", + "loader-utils": "^1.1.0", "resolve": "^1.3.3" }, - "devDependencies": {}, + "devDependencies": { + "glsl-noise": "^0.0.0", + "glslify-fancy-imports": "^1.0.1", + "glslify-hex": "^2.1.1", + "memory-fs": "^0.4.1", + "raw-loader": "^0.5.1", + "require-from-string": "^2.0.1", + "tap-spec": "^4.1.1", + "tape": "^4.9.0", + "webpack": "^4.1.0" + }, "repository": { "type": "git", "url": "git://github.com/stackgl/glslify-loader.git" @@ -29,5 +41,6 @@ "homepage": "https://github.com/stackgl/glslify-loader", "bugs": { "url": "https://github.com/stackgl/glslify-loader/issues" - } + }, + "engines" : { "node" : ">=6" } } diff --git a/test/fixtures/config-inline.js b/test/fixtures/config-inline.js new file mode 100644 index 0000000..8ce5160 --- /dev/null +++ b/test/fixtures/config-inline.js @@ -0,0 +1,4 @@ +module.exports = { + target: 'node', + mode: 'production' +} diff --git a/test/fixtures/config-post.js b/test/fixtures/config-post.js new file mode 100644 index 0000000..7f4215a --- /dev/null +++ b/test/fixtures/config-post.js @@ -0,0 +1,23 @@ +const path = require('path') + +module.exports = { + target: 'node', + mode: 'production', + module: { + rules: [{ + test: /\.glsl$/, + exclude: [/node_modules/], + use: [ + 'raw-loader', + { + loader: path.resolve(__dirname, '../../glslify-loader.js'), + options: { + transform: [ + ['glslify-hex', { post: true }] + ] + } + } + ] + }] + } +} diff --git a/test/fixtures/config-simple.js b/test/fixtures/config-simple.js new file mode 100644 index 0000000..98967df --- /dev/null +++ b/test/fixtures/config-simple.js @@ -0,0 +1,16 @@ +const path = require('path') + +module.exports = { + target: 'node', + mode: 'production', + module: { + rules: [{ + test: /\.glsl$/, + exclude: [/node_modules/], + use: [ + 'raw-loader', + path.resolve(__dirname, '../../glslify-loader.js') + ] + }] + } +} diff --git a/test/fixtures/config-transform.js b/test/fixtures/config-transform.js new file mode 100644 index 0000000..eca8472 --- /dev/null +++ b/test/fixtures/config-transform.js @@ -0,0 +1,21 @@ +const path = require('path') + +module.exports = { + target: 'node', + mode: 'production', + module: { + rules: [{ + test: /\.glsl$/, + exclude: [/node_modules/], + use: [ + 'raw-loader', + { + loader: path.resolve(__dirname, '../../glslify-loader.js'), + options: { + transform: ['glslify-fancy-imports'] + } + } + ] + }] + } +} diff --git a/test/fixtures/entry-inline.js b/test/fixtures/entry-inline.js new file mode 100644 index 0000000..d15899a --- /dev/null +++ b/test/fixtures/entry-inline.js @@ -0,0 +1,2 @@ +const shader = require('raw-loader!../../glslify-loader!./shader-simple.glsl') +module.exports = shader diff --git a/test/fixtures/entry-post.js b/test/fixtures/entry-post.js new file mode 100644 index 0000000..8bb731e --- /dev/null +++ b/test/fixtures/entry-post.js @@ -0,0 +1,2 @@ +const shader = require('./shader-hex.glsl') +module.exports = shader diff --git a/test/fixtures/entry-simple.js b/test/fixtures/entry-simple.js new file mode 100644 index 0000000..d46db59 --- /dev/null +++ b/test/fixtures/entry-simple.js @@ -0,0 +1,2 @@ +const shader = require('./shader-simple.glsl') +module.exports = shader diff --git a/test/fixtures/entry-transform.js b/test/fixtures/entry-transform.js new file mode 100644 index 0000000..9db6f41 --- /dev/null +++ b/test/fixtures/entry-transform.js @@ -0,0 +1,2 @@ +const shader = require('./shader-fancy-import.glsl') +module.exports = shader diff --git a/test/fixtures/shader-export.glsl b/test/fixtures/shader-export.glsl new file mode 100644 index 0000000..b6f19ed --- /dev/null +++ b/test/fixtures/shader-export.glsl @@ -0,0 +1,6 @@ +float myFunction(vec3 normal) { + vec3 hello = vec3(1, 0, 0) + return dot(hello, normal); +} + +#pragma glslify: export(myFunction) \ No newline at end of file diff --git a/test/fixtures/shader-fancy-import.glsl b/test/fixtures/shader-fancy-import.glsl new file mode 100644 index 0000000..4fefe0a --- /dev/null +++ b/test/fixtures/shader-fancy-import.glsl @@ -0,0 +1,5 @@ +import myFunction from './shader-export' + +void main () { + gl_FragColor = vec4(1, 0, 0, 1); +} diff --git a/test/fixtures/shader-hex.glsl b/test/fixtures/shader-hex.glsl new file mode 100644 index 0000000..821a8f6 --- /dev/null +++ b/test/fixtures/shader-hex.glsl @@ -0,0 +1,3 @@ +void main () { + gl_FragColor = #00FF00; +} diff --git a/test/fixtures/shader-simple.glsl b/test/fixtures/shader-simple.glsl new file mode 100644 index 0000000..fb49fff --- /dev/null +++ b/test/fixtures/shader-simple.glsl @@ -0,0 +1,8 @@ +precision mediump float; + +#pragma glslify: noise = require(glsl-noise/classic/2d) +#pragma glslify: myFunction = require(./shader-export) + +void main () { + gl_FragColor = vec4(1, 0, 0, 1); +} diff --git a/test/index.js b/test/index.js new file mode 100644 index 0000000..66fe066 --- /dev/null +++ b/test/index.js @@ -0,0 +1,43 @@ +const test = require('tape') +const webpack = require('./utils/readWebpack') + +test('simple glsl file with local & external dependencies', t => { + webpack('config-simple.js', 'entry-simple.js') + .then(data => { + t.ok(~data.indexOf('#define GLSLIFY 1'), '#define GLSLIFY 1 was added') + t.ok(~data.indexOf('GLSL textureless classic 2D noise "cnoise"'), 'node module glsl-noise was included') + t.ok(~data.indexOf('cnoise('), 'cnoise was not renamed') + t.ok(~data.indexOf('vec3 hello ='), 'local dependency shader-export.glsl was included') + t.end() + }) + .catch(err => t.fail(err)) +}) + +test('glslify-loader using a transform option (glslify-fancy-imports)', t => { + webpack('config-transform.js', 'entry-transform.js') + .then(data => { + t.ok(~data.indexOf('vec3 hello ='), 'local dependency shader-export.glsl was included') + t.end() + }) + .catch(err => t.fail(err)) +}) + +test('glslify-loader using post transforms (glslify-hex)', t => { + webpack('config-post.js', 'entry-post.js') + .then(data => { + t.ok(!~data.indexOf('#00FF00'), '#00FF00 transformed away with glslify-hex') + t.end() + }) + .catch(err => t.fail(err)) +}) + + +test('inline use', t => { + webpack('config-inline.js', 'entry-inline.js') + .then(data => { + t.ok(~data.indexOf('#define GLSLIFY 1'), '#define GLSLIFY 1 was added') + t.ok(~data.indexOf('GLSL textureless classic 2D noise "cnoise"'), 'node module glsl-noise was included') + t.end() + }) + .catch(err => t.fail(err)) +}) diff --git a/test/utils/readWebpack.js b/test/utils/readWebpack.js new file mode 100644 index 0000000..ba15f4c --- /dev/null +++ b/test/utils/readWebpack.js @@ -0,0 +1,32 @@ +const path = require('path') +const webpack = require('webpack') +const MemoryFileSystem = require('memory-fs') +const requireFromString = require('require-from-string') + +const FIXTURESROOT = path.join(__dirname, '..', 'fixtures') + +module.exports = function readWebpack (configpath, entrypath) { + return new Promise((resolve, reject) => { + const config = require(path.resolve(FIXTURESROOT, configpath)) + config.entry = path.resolve(FIXTURESROOT, entrypath) + if (!config.output) config.output = {} + Object.assign(config.output, { + path: '/', + filename: 'bundle.js', + libraryTarget: 'umd' + }) + + const compiler = webpack(config) + const memfs = new MemoryFileSystem() + compiler.outputFileSystem = memfs + compiler.run((err, stats) => { + if (err) return reject(err) + if (stats.compilation.errors && stats.compilation.errors.length > 0) { + return reject(stats.compilation.errors[0]) + } + const bundleContent = String(memfs.readFileSync('/bundle.js')) + const output = requireFromString(bundleContent).trim() + resolve(output) + }) + }) +} diff --git a/webpack.config.js b/webpack.config.js deleted file mode 100644 index f47aea3..0000000 --- a/webpack.config.js +++ /dev/null @@ -1,13 +0,0 @@ -module.exports = { - entry: './entry.js', - output: { - path: __dirname, - filename: 'bundle.js' - }, - module: { - loaders: [ - { test: /\.(glsl|frag|vert)$/, loader: 'raw', exclude: /node_modules/ }, - { test: /\.(glsl|frag|vert)$/, loader: './index', exclude: /node_modules/ } - ] - } -} diff --git a/yarn.lock b/yarn.lock deleted file mode 100644 index 75ea516..0000000 --- a/yarn.lock +++ /dev/null @@ -1,196 +0,0 @@ -# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. -# yarn lockfile v1 - - -colors@~0.6.0-1: - version "0.6.2" - resolved "https://registry.yarnpkg.com/colors/-/colors-0.6.2.tgz#2423fe6678ac0c5dae8852e5d0e5be08c997abcc" - -commander@~2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/commander/-/commander-2.1.0.tgz#d121bbae860d9992a3d517ba96f56588e47c6781" - -core-util-is@~1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" - -events@^1.0.2: - version "1.1.1" - resolved "https://registry.yarnpkg.com/events/-/events-1.1.1.tgz#9ebdb7635ad099c70dcc4c2a1f5004288e8bd924" - -findup@^0.1.5: - version "0.1.5" - resolved "https://registry.yarnpkg.com/findup/-/findup-0.1.5.tgz#8ad929a3393bac627957a7e5de4623b06b0e2ceb" - dependencies: - colors "~0.6.0-1" - commander "~2.1.0" - -glsl-inject-defines@^1.0.1: - version "1.0.3" - resolved "https://registry.yarnpkg.com/glsl-inject-defines/-/glsl-inject-defines-1.0.3.tgz#dd1aacc2c17fcb2bd3fc32411c6633d0d7b60fd4" - dependencies: - glsl-token-inject-block "^1.0.0" - glsl-token-string "^1.0.1" - glsl-tokenizer "^2.0.2" - -glsl-resolve@0.0.1: - version "0.0.1" - resolved "https://registry.yarnpkg.com/glsl-resolve/-/glsl-resolve-0.0.1.tgz#894bef73910d792c81b5143180035d0a78af76d3" - dependencies: - resolve "^0.6.1" - xtend "^2.1.2" - -glsl-token-assignments@^2.0.0: - version "2.0.2" - resolved "https://registry.yarnpkg.com/glsl-token-assignments/-/glsl-token-assignments-2.0.2.tgz#a5d82ab78499c2e8a6b83cb69495e6e665ce019f" - -glsl-token-defines@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/glsl-token-defines/-/glsl-token-defines-1.0.0.tgz#cb892aa959936231728470d4f74032489697fa9d" - dependencies: - glsl-tokenizer "^2.0.0" - -glsl-token-depth@^1.1.0, glsl-token-depth@^1.1.1: - version "1.1.2" - resolved "https://registry.yarnpkg.com/glsl-token-depth/-/glsl-token-depth-1.1.2.tgz#23c5e30ee2bd255884b4a28bc850b8f791e95d84" - -glsl-token-descope@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/glsl-token-descope/-/glsl-token-descope-1.0.2.tgz#0fc90ab326186b82f597b2e77dc9e21efcd32076" - dependencies: - glsl-token-assignments "^2.0.0" - glsl-token-depth "^1.1.0" - glsl-token-properties "^1.0.0" - glsl-token-scope "^1.1.0" - -glsl-token-inject-block@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/glsl-token-inject-block/-/glsl-token-inject-block-1.1.0.tgz#e1015f5980c1091824adaa2625f1dfde8bd00034" - -glsl-token-properties@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/glsl-token-properties/-/glsl-token-properties-1.0.1.tgz#483dc3d839f0d4b5c6171d1591f249be53c28a9e" - -glsl-token-scope@^1.1.0, glsl-token-scope@^1.1.1: - version "1.1.2" - resolved "https://registry.yarnpkg.com/glsl-token-scope/-/glsl-token-scope-1.1.2.tgz#a1728e78df24444f9cb93fd18ef0f75503a643b1" - -glsl-token-string@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/glsl-token-string/-/glsl-token-string-1.0.1.tgz#59441d2f857de7c3449c945666021ece358e48ec" - -glsl-token-whitespace-trim@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/glsl-token-whitespace-trim/-/glsl-token-whitespace-trim-1.0.0.tgz#46d1dfe98c75bd7d504c05d7d11b1b3e9cc93b10" - -glsl-tokenizer@^2.0.0, glsl-tokenizer@^2.0.2: - version "2.1.2" - resolved "https://registry.yarnpkg.com/glsl-tokenizer/-/glsl-tokenizer-2.1.2.tgz#720307522e03c57af35c00551950c4a70ef2dfb9" - dependencies: - through2 "^0.6.3" - -glslify-bundle@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/glslify-bundle/-/glslify-bundle-5.0.0.tgz#0252ada1ef9df30b660006e0bb21fd130b486e42" - dependencies: - glsl-inject-defines "^1.0.1" - glsl-token-defines "^1.0.0" - glsl-token-depth "^1.1.1" - glsl-token-descope "^1.0.2" - glsl-token-scope "^1.1.1" - glsl-token-string "^1.0.1" - glsl-token-whitespace-trim "^1.0.0" - glsl-tokenizer "^2.0.2" - murmurhash-js "^1.0.0" - shallow-copy "0.0.1" - -glslify-deps@^1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/glslify-deps/-/glslify-deps-1.3.0.tgz#0b2234c8ea9e3d3fd7f6b3cb7f03ae59e6b51a59" - dependencies: - events "^1.0.2" - findup "^0.1.5" - glsl-resolve "0.0.1" - glsl-tokenizer "^2.0.0" - graceful-fs "^4.1.2" - inherits "^2.0.1" - map-limit "0.0.1" - resolve "^1.0.0" - -graceful-fs@^4.1.2: - version "4.1.11" - resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.1.11.tgz#0e8bdfe4d1ddb8854d64e04ea7c00e2a026e5658" - -inherits@^2.0.1, inherits@~2.0.1: - version "2.0.3" - resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" - -isarray@0.0.1: - version "0.0.1" - resolved "https://registry.yarnpkg.com/isarray/-/isarray-0.0.1.tgz#8a18acfca9a8f4177e09abfc6038939b05d1eedf" - -map-limit@0.0.1: - version "0.0.1" - resolved "https://registry.yarnpkg.com/map-limit/-/map-limit-0.0.1.tgz#eb7961031c0f0e8d001bf2d56fab685d58822f38" - dependencies: - once "~1.3.0" - -murmurhash-js@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/murmurhash-js/-/murmurhash-js-1.0.0.tgz#b06278e21fc6c37fa5313732b0412bcb6ae15f51" - -once@~1.3.0: - version "1.3.3" - resolved "https://registry.yarnpkg.com/once/-/once-1.3.3.tgz#b2e261557ce4c314ec8304f3fa82663e4297ca20" - dependencies: - wrappy "1" - -path-parse@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.5.tgz#3c1adf871ea9cd6c9431b6ea2bd74a0ff055c4c1" - -"readable-stream@>=1.0.33-1 <1.1.0-0": - version "1.0.34" - resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-1.0.34.tgz#125820e34bc842d2f2aaafafe4c2916ee32c157c" - dependencies: - core-util-is "~1.0.0" - inherits "~2.0.1" - isarray "0.0.1" - string_decoder "~0.10.x" - -resolve@^0.6.1: - version "0.6.3" - resolved "https://registry.yarnpkg.com/resolve/-/resolve-0.6.3.tgz#dd957982e7e736debdf53b58a4dd91754575dd46" - -resolve@^1.0.0: - version "1.3.3" - resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.3.3.tgz#655907c3469a8680dc2de3a275a8fdd69691f0e5" - dependencies: - path-parse "^1.0.5" - -shallow-copy@0.0.1: - version "0.0.1" - resolved "https://registry.yarnpkg.com/shallow-copy/-/shallow-copy-0.0.1.tgz#415f42702d73d810330292cc5ee86eae1a11a170" - -string_decoder@~0.10.x: - version "0.10.31" - resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-0.10.31.tgz#62e203bc41766c6c28c9fc84301dab1c5310fa94" - -through2@^0.6.3: - version "0.6.5" - resolved "https://registry.yarnpkg.com/through2/-/through2-0.6.5.tgz#41ab9c67b29d57209071410e1d7a7a968cd3ad48" - dependencies: - readable-stream ">=1.0.33-1 <1.1.0-0" - xtend ">=4.0.0 <4.1.0-0" - -wrappy@1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" - -"xtend@>=4.0.0 <4.1.0-0": - version "4.0.1" - resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.1.tgz#a5c6d532be656e23db820efb943a1f04998d63af" - -xtend@^2.1.2: - version "2.2.0" - resolved "https://registry.yarnpkg.com/xtend/-/xtend-2.2.0.tgz#eef6b1f198c1c8deafad8b1765a04dad4a01c5a9"