diff --git a/.gitignore b/.gitignore index 91b984ce..c80efe47 100644 --- a/.gitignore +++ b/.gitignore @@ -34,3 +34,7 @@ yarn.lock # OSX .DS_Store .DS_Store + +# build result +dist +test/all.html diff --git a/.prettierignore b/.prettierignore new file mode 100644 index 00000000..7ad4cfaa --- /dev/null +++ b/.prettierignore @@ -0,0 +1,51 @@ +dist +node_modules +test/all.html + +*.md + +# lock files +yarn.lock +pnpm-lock.yaml +package-lock.json + +# Logs +logs +*.log +npm-debug.log* + +# Runtime data +pids +*.pid +*.seed + +# Directory for instrumented libs generated by jscoverage/JSCover +lib-cov + +# Coverage directory used by tools like istanbul +coverage + +# node-waf configuration +.lock-wscript + +# Dependency directory +node_modules + +# Optional npm cache directory +.npm + +# Optional REPL history +.node_repl_history + +# intellij +.idea + +#yarn +yarn.lock + +# OSX .DS_Store +.DS_Store + +# build result +dist +test/all.html diff --git a/.prettierrc b/.prettierrc new file mode 100644 index 00000000..a55ab933 --- /dev/null +++ b/.prettierrc @@ -0,0 +1,18 @@ +{ + "arrowParens": "avoid", + "bracketSpacing": true, + "endOfLine": "lf", + "htmlWhitespaceSensitivity": "css", + "insertPragma": false, + "jsxSingleQuote": false, + "printWidth": 79, + "proseWrap": "preserve", + "quoteProps": "as-needed", + "requirePragma": false, + "semi": true, + "singleQuote": true, + "tabWidth": 2, + "trailingComma": "es5", + "useTabs": false, + "vueIndentScriptAndStyle": false +} diff --git a/dist/gpu-browser-core.js b/dist/gpu-browser-core.js deleted file mode 100644 index 6f1e2e50..00000000 --- a/dist/gpu-browser-core.js +++ /dev/null @@ -1,15067 +0,0 @@ -/** - * gpu.js - * http://gpu.rocks/ - * - * GPU Accelerated JavaScript - * - * @version 2.16.0 - * @date Wed Nov 16 2022 15:48:37 GMT-0500 (Eastern Standard Time) - * - * @license MIT - * The MIT License - * - * Copyright (c) 2022 gpu.js Team - */(function(f){if(typeof exports==="object"&&typeof module!=="undefined"){module.exports=f()}else if(typeof define==="function"&&define.amd){define([],f)}else{var g;if(typeof window!=="undefined"){g=window}else if(typeof global!=="undefined"){g=global}else if(typeof self!=="undefined"){g=self}else{g=this}g.GPU = f()}})(function(){var define,module,exports;return (function(){function r(e,n,t){function o(i,f){if(!n[i]){if(!e[i]){var c="function"==typeof require&&require;if(!f&&c)return c(i,!0);if(u)return u(i,!0);var a=new Error("Cannot find module '"+i+"'");throw a.code="MODULE_NOT_FOUND",a}var p=n[i]={exports:{}};e[i][0].call(p.exports,function(r){var n=e[i][1][r];return o(n||r)},p,p.exports,r,e,n,t)}return n[i].exports}for(var u="function"==typeof require&&require,i=0;i 0) { - recording.pop(); - } - } - function insertVariable(name, value) { - variables[name] = value; - } - function getEntity(value) { - const name = entityNames[value]; - if (name) { - return contextName + '.' + name; - } - return value; - } - function setIndent(spaces) { - indent = ' '.repeat(spaces); - } - function addVariable(value, source) { - const variableName = `${contextName}Variable${contextVariables.length}`; - recording.push(`${indent}const ${variableName} = ${source};`); - contextVariables.push(value); - return variableName; - } - function writePPM(width, height) { - const sourceVariable = `${contextName}Variable${contextVariables.length}`; - const imageVariable = `imageDatum${imageCount}`; - recording.push(`${indent}let ${imageVariable} = ["P3\\n# ${readPixelsFile}.ppm\\n", ${width}, ' ', ${height}, "\\n255\\n"].join("");`); - recording.push(`${indent}for (let i = 0; i < ${imageVariable}.length; i += 4) {`); - recording.push(`${indent} ${imageVariable} += ${sourceVariable}[i] + ' ' + ${sourceVariable}[i + 1] + ' ' + ${sourceVariable}[i + 2] + ' ';`); - recording.push(`${indent}}`); - recording.push(`${indent}if (typeof require !== "undefined") {`); - recording.push(`${indent} require('fs').writeFileSync('./${readPixelsFile}.ppm', ${imageVariable});`); - recording.push(`${indent}}`); - imageCount++; - } - function addComment(value) { - recording.push(`${indent}// ${value}`); - } - function checkThrowError() { - recording.push(`${indent}(() => { -${indent}const error = ${contextName}.getError(); -${indent}if (error !== ${contextName}.NONE) { -${indent} const names = Object.getOwnPropertyNames(gl); -${indent} for (let i = 0; i < names.length; i++) { -${indent} const name = names[i]; -${indent} if (${contextName}[name] === error) { -${indent} throw new Error('${contextName} threw ' + name); -${indent} } -${indent} } -${indent}} -${indent}})();`); - } - function methodCallToString(method, args) { - return `${contextName}.${method}(${argumentsToString(args, { contextName, contextVariables, getEntity, addVariable, variables, onUnrecognizedArgumentLookup })})`; - } - - function getVariableName(value) { - if (variables) { - for (const name in variables) { - if (variables[name] === value) { - return name; - } - } - } - return null; - } - - function getContextVariableName(value) { - const i = contextVariables.indexOf(value); - if (i !== -1) { - return `${contextName}Variable${i}`; - } - return null; - } -} - -function glExtensionWiretap(extension, options) { - const proxy = new Proxy(extension, { get: listen }); - const extensionEntityNames = {}; - const { - contextName, - contextVariables, - getEntity, - useTrackablePrimitives, - recording, - variables, - indent, - onUnrecognizedArgumentLookup, - } = options; - return proxy; - function listen(obj, property) { - if (typeof obj[property] === 'function') { - return function() { - switch (property) { - case 'drawBuffersWEBGL': - recording.push(`${indent}${contextName}.drawBuffersWEBGL([${argumentsToString(arguments[0], { contextName, contextVariables, getEntity: getExtensionEntity, addVariable, variables, onUnrecognizedArgumentLookup })}]);`); - return extension.drawBuffersWEBGL(arguments[0]); - } - let result = extension[property].apply(extension, arguments); - switch (typeof result) { - case 'undefined': - recording.push(`${indent}${methodCallToString(property, arguments)};`); - return; - case 'number': - case 'boolean': - if (useTrackablePrimitives && contextVariables.indexOf(trackablePrimitive(result)) === -1) { - recording.push(`${indent}const ${contextName}Variable${contextVariables.length} = ${methodCallToString(property, arguments)};`); - contextVariables.push(result = trackablePrimitive(result)); - } else { - recording.push(`${indent}const ${contextName}Variable${contextVariables.length} = ${methodCallToString(property, arguments)};`); - contextVariables.push(result); - } - break; - default: - if (result === null) { - recording.push(`${methodCallToString(property, arguments)};`); - } else { - recording.push(`${indent}const ${contextName}Variable${contextVariables.length} = ${methodCallToString(property, arguments)};`); - } - contextVariables.push(result); - } - return result; - }; - } - extensionEntityNames[extension[property]] = property; - return extension[property]; - } - - function getExtensionEntity(value) { - if (extensionEntityNames.hasOwnProperty(value)) { - return `${contextName}.${extensionEntityNames[value]}`; - } - return getEntity(value); - } - - function methodCallToString(method, args) { - return `${contextName}.${method}(${argumentsToString(args, { contextName, contextVariables, getEntity: getExtensionEntity, addVariable, variables, onUnrecognizedArgumentLookup })})`; - } - - function addVariable(value, source) { - const variableName = `${contextName}Variable${contextVariables.length}`; - contextVariables.push(value); - recording.push(`${indent}const ${variableName} = ${source};`); - return variableName; - } -} - -function argumentsToString(args, options) { - const { variables, onUnrecognizedArgumentLookup } = options; - return (Array.from(args).map((arg) => { - const variableName = getVariableName(arg); - if (variableName) { - return variableName; - } - return argumentToString(arg, options); - }).join(', ')); - - function getVariableName(value) { - if (variables) { - for (const name in variables) { - if (!variables.hasOwnProperty(name)) continue; - if (variables[name] === value) { - return name; - } - } - } - if (onUnrecognizedArgumentLookup) { - return onUnrecognizedArgumentLookup(value); - } - return null; - } -} - -function argumentToString(arg, options) { - const { contextName, contextVariables, getEntity, addVariable, onUnrecognizedArgumentLookup } = options; - if (typeof arg === 'undefined') { - return 'undefined'; - } - if (arg === null) { - return 'null'; - } - const i = contextVariables.indexOf(arg); - if (i > -1) { - return `${contextName}Variable${i}`; - } - switch (arg.constructor.name) { - case 'String': - const hasLines = /\n/.test(arg); - const hasSingleQuotes = /'/.test(arg); - const hasDoubleQuotes = /"/.test(arg); - if (hasLines) { - return '`' + arg + '`'; - } else if (hasSingleQuotes && !hasDoubleQuotes) { - return '"' + arg + '"'; - } else if (!hasSingleQuotes && hasDoubleQuotes) { - return "'" + arg + "'"; - } else { - return '\'' + arg + '\''; - } - case 'Number': return getEntity(arg); - case 'Boolean': return getEntity(arg); - case 'Array': - return addVariable(arg, `new ${arg.constructor.name}([${Array.from(arg).join(',')}])`); - case 'Float32Array': - case 'Uint8Array': - case 'Uint16Array': - case 'Int32Array': - return addVariable(arg, `new ${arg.constructor.name}(${JSON.stringify(Array.from(arg))})`); - default: - if (onUnrecognizedArgumentLookup) { - const instantiationString = onUnrecognizedArgumentLookup(arg); - if (instantiationString) { - return instantiationString; - } - } - throw new Error(`unrecognized argument type ${arg.constructor.name}`); - } -} - -function trackablePrimitive(value) { - return new value.constructor(value); -} - -if (typeof module !== 'undefined') { - module.exports = { glWiretap, glExtensionWiretap }; -} - -if (typeof window !== 'undefined') { - glWiretap.glExtensionWiretap = glExtensionWiretap; - window.glWiretap = glWiretap; -} - -},{}],3:[function(require,module,exports){ -function setupArguments(args) { - const newArguments = new Array(args.length); - for (let i = 0; i < args.length; i++) { - const arg = args[i]; - if (arg.toArray) { - newArguments[i] = arg.toArray(); - } else { - newArguments[i] = arg; - } - } - return newArguments; -} - -function mock1D() { - const args = setupArguments(arguments); - const row = new Float32Array(this.output.x); - for (let x = 0; x < this.output.x; x++) { - this.thread.x = x; - this.thread.y = 0; - this.thread.z = 0; - row[x] = this._fn.apply(this, args); - } - return row; -} - -function mock2D() { - const args = setupArguments(arguments); - const matrix = new Array(this.output.y); - for (let y = 0; y < this.output.y; y++) { - const row = new Float32Array(this.output.x); - for (let x = 0; x < this.output.x; x++) { - this.thread.x = x; - this.thread.y = y; - this.thread.z = 0; - row[x] = this._fn.apply(this, args); - } - matrix[y] = row; - } - return matrix; -} - -function mock2DGraphical() { - const args = setupArguments(arguments); - for (let y = 0; y < this.output.y; y++) { - for (let x = 0; x < this.output.x; x++) { - this.thread.x = x; - this.thread.y = y; - this.thread.z = 0; - this._fn.apply(this, args); - } - } -} - -function mock3D() { - const args = setupArguments(arguments); - const cube = new Array(this.output.z); - for (let z = 0; z < this.output.z; z++) { - const matrix = new Array(this.output.y); - for (let y = 0; y < this.output.y; y++) { - const row = new Float32Array(this.output.x); - for (let x = 0; x < this.output.x; x++) { - this.thread.x = x; - this.thread.y = y; - this.thread.z = z; - row[x] = this._fn.apply(this, args); - } - matrix[y] = row; - } - cube[z] = matrix; - } - return cube; -} - -function apiDecorate(kernel) { - kernel.setOutput = (output) => { - kernel.output = setupOutput(output); - if (kernel.graphical) { - setupGraphical(kernel); - } - }; - kernel.toJSON = () => { - throw new Error('Not usable with gpuMock'); - }; - kernel.setConstants = (flag) => { - kernel.constants = flag; - return kernel; - }; - kernel.setGraphical = (flag) => { - kernel.graphical = flag; - return kernel; - }; - kernel.setCanvas = (flag) => { - kernel.canvas = flag; - return kernel; - }; - kernel.setContext = (flag) => { - kernel.context = flag; - return kernel; - }; - kernel.destroy = () => {}; - kernel.validateSettings = () => {}; - if (kernel.graphical && kernel.output) { - setupGraphical(kernel); - } - kernel.exec = function() { - return new Promise((resolve, reject) => { - try { - resolve(kernel.apply(kernel, arguments)); - } catch(e) { - reject(e); - } - }); - }; - kernel.getPixels = (flip) => { - const {x, y} = kernel.output; - return flip ? flipPixels(kernel._imageData.data, x, y) : kernel._imageData.data.slice(0); - }; - kernel.color = function(r, g, b, a) { - if (typeof a === 'undefined') { - a = 1; - } - - r = Math.floor(r * 255); - g = Math.floor(g * 255); - b = Math.floor(b * 255); - a = Math.floor(a * 255); - - const width = kernel.output.x; - const height = kernel.output.y; - - const x = kernel.thread.x; - const y = height - kernel.thread.y - 1; - - const index = x + y * width; - - kernel._colorData[index * 4 + 0] = r; - kernel._colorData[index * 4 + 1] = g; - kernel._colorData[index * 4 + 2] = b; - kernel._colorData[index * 4 + 3] = a; - }; - - const mockMethod = () => kernel; - const methods = [ - 'setWarnVarUsage', - 'setArgumentTypes', - 'setTactic', - 'setOptimizeFloatMemory', - 'setDebug', - 'setLoopMaxIterations', - 'setConstantTypes', - 'setFunctions', - 'setNativeFunctions', - 'setInjectedNative', - 'setPipeline', - 'setPrecision', - 'setOutputToTexture', - 'setImmutable', - 'setStrictIntegers', - 'setDynamicOutput', - 'setHardcodeConstants', - 'setDynamicArguments', - 'setUseLegacyEncoder', - 'setWarnVarUsage', - 'addSubKernel', - ]; - for (let i = 0; i < methods.length; i++) { - kernel[methods[i]] = mockMethod; - } - return kernel; -} - -function setupGraphical(kernel) { - const {x, y} = kernel.output; - if (kernel.context && kernel.context.createImageData) { - const data = new Uint8ClampedArray(x * y * 4); - kernel._imageData = kernel.context.createImageData(x, y); - kernel._colorData = data; - } else { - const data = new Uint8ClampedArray(x * y * 4); - kernel._imageData = { data }; - kernel._colorData = data; - } -} - -function setupOutput(output) { - let result = null; - if (output.length) { - if (output.length === 3) { - const [x,y,z] = output; - result = { x, y, z }; - } else if (output.length === 2) { - const [x,y] = output; - result = { x, y }; - } else { - const [x] = output; - result = { x }; - } - } else { - result = output; - } - return result; -} - -function gpuMock(fn, settings = {}) { - const output = settings.output ? setupOutput(settings.output) : null; - function kernel() { - if (kernel.output.z) { - return mock3D.apply(kernel, arguments); - } else if (kernel.output.y) { - if (kernel.graphical) { - return mock2DGraphical.apply(kernel, arguments); - } - return mock2D.apply(kernel, arguments); - } else { - return mock1D.apply(kernel, arguments); - } - } - kernel._fn = fn; - kernel.constants = settings.constants || null; - kernel.context = settings.context || null; - kernel.canvas = settings.canvas || null; - kernel.graphical = settings.graphical || false; - kernel._imageData = null; - kernel._colorData = null; - kernel.output = output; - kernel.thread = { - x: 0, - y: 0, - z: 0 - }; - return apiDecorate(kernel); -} - -function flipPixels(pixels, width, height) { - const halfHeight = height / 2 | 0; - const bytesPerRow = width * 4; - const temp = new Uint8ClampedArray(width * 4); - const result = pixels.slice(0); - for (let y = 0; y < halfHeight; ++y) { - const topOffset = y * bytesPerRow; - const bottomOffset = (height - y - 1) * bytesPerRow; - - temp.set(result.subarray(topOffset, topOffset + bytesPerRow)); - - result.copyWithin(topOffset, bottomOffset, bottomOffset + bytesPerRow); - - result.set(temp, bottomOffset); - } - return result; -} - -module.exports = { - gpuMock -}; - -},{}],4:[function(require,module,exports){ -const { utils } = require('./utils'); - -function alias(name, source) { - const fnString = source.toString(); - return new Function(`return function ${ name } (${ utils.getArgumentNamesFromString(fnString).join(', ') }) { - ${ utils.getFunctionBodyFromString(fnString) } -}`)(); -} - -module.exports = { - alias -}; -},{"./utils":113}],5:[function(require,module,exports){ -const { FunctionNode } = require('../function-node'); - -class CPUFunctionNode extends FunctionNode { - astFunction(ast, retArr) { - - if (!this.isRootKernel) { - retArr.push('function'); - retArr.push(' '); - retArr.push(this.name); - retArr.push('('); - - for (let i = 0; i < this.argumentNames.length; ++i) { - const argumentName = this.argumentNames[i]; - - if (i > 0) { - retArr.push(', '); - } - retArr.push('user_'); - retArr.push(argumentName); - } - - retArr.push(') {\n'); - } - - for (let i = 0; i < ast.body.body.length; ++i) { - this.astGeneric(ast.body.body[i], retArr); - retArr.push('\n'); - } - - if (!this.isRootKernel) { - retArr.push('}\n'); - } - return retArr; - } - - astReturnStatement(ast, retArr) { - const type = this.returnType || this.getType(ast.argument); - - if (!this.returnType) { - this.returnType = type; - } - - if (this.isRootKernel) { - retArr.push(this.leadingReturnStatement); - this.astGeneric(ast.argument, retArr); - retArr.push(';\n'); - retArr.push(this.followingReturnStatement); - retArr.push('continue;\n'); - } else if (this.isSubKernel) { - retArr.push(`subKernelResult_${ this.name } = `); - this.astGeneric(ast.argument, retArr); - retArr.push(';'); - retArr.push(`return subKernelResult_${ this.name };`); - } else { - retArr.push('return '); - this.astGeneric(ast.argument, retArr); - retArr.push(';'); - } - return retArr; - } - - astLiteral(ast, retArr) { - - if (isNaN(ast.value)) { - throw this.astErrorOutput( - 'Non-numeric literal not supported : ' + ast.value, - ast - ); - } - - retArr.push(ast.value); - - return retArr; - } - - astBinaryExpression(ast, retArr) { - retArr.push('('); - this.astGeneric(ast.left, retArr); - retArr.push(ast.operator); - this.astGeneric(ast.right, retArr); - retArr.push(')'); - return retArr; - } - - astIdentifierExpression(idtNode, retArr) { - if (idtNode.type !== 'Identifier') { - throw this.astErrorOutput( - 'IdentifierExpression - not an Identifier', - idtNode - ); - } - - switch (idtNode.name) { - case 'Infinity': - retArr.push('Infinity'); - break; - default: - if (this.constants && this.constants.hasOwnProperty(idtNode.name)) { - retArr.push('constants_' + idtNode.name); - } else { - retArr.push('user_' + idtNode.name); - } - } - - return retArr; - } - - astForStatement(forNode, retArr) { - if (forNode.type !== 'ForStatement') { - throw this.astErrorOutput('Invalid for statement', forNode); - } - - const initArr = []; - const testArr = []; - const updateArr = []; - const bodyArr = []; - let isSafe = null; - - if (forNode.init) { - this.pushState('in-for-loop-init'); - this.astGeneric(forNode.init, initArr); - for (let i = 0; i < initArr.length; i++) { - if (initArr[i].includes && initArr[i].includes(',')) { - isSafe = false; - } - } - this.popState('in-for-loop-init'); - } else { - isSafe = false; - } - - if (forNode.test) { - this.astGeneric(forNode.test, testArr); - } else { - isSafe = false; - } - - if (forNode.update) { - this.astGeneric(forNode.update, updateArr); - } else { - isSafe = false; - } - - if (forNode.body) { - this.pushState('loop-body'); - this.astGeneric(forNode.body, bodyArr); - this.popState('loop-body'); - } - - if (isSafe === null) { - isSafe = this.isSafe(forNode.init) && this.isSafe(forNode.test); - } - - if (isSafe) { - retArr.push(`for (${initArr.join('')};${testArr.join('')};${updateArr.join('')}){\n`); - retArr.push(bodyArr.join('')); - retArr.push('}\n'); - } else { - const iVariableName = this.getInternalVariableName('safeI'); - if (initArr.length > 0) { - retArr.push(initArr.join(''), ';\n'); - } - retArr.push(`for (let ${iVariableName}=0;${iVariableName} 0) { - retArr.push(`if (!${testArr.join('')}) break;\n`); - } - retArr.push(bodyArr.join('')); - retArr.push(`\n${updateArr.join('')};`); - retArr.push('}\n'); - } - return retArr; - } - - astWhileStatement(whileNode, retArr) { - if (whileNode.type !== 'WhileStatement') { - throw this.astErrorOutput( - 'Invalid while statement', - whileNode - ); - } - - retArr.push('for (let i = 0; i < LOOP_MAX; i++) {'); - retArr.push('if ('); - this.astGeneric(whileNode.test, retArr); - retArr.push(') {\n'); - this.astGeneric(whileNode.body, retArr); - retArr.push('} else {\n'); - retArr.push('break;\n'); - retArr.push('}\n'); - retArr.push('}\n'); - - return retArr; - } - - astDoWhileStatement(doWhileNode, retArr) { - if (doWhileNode.type !== 'DoWhileStatement') { - throw this.astErrorOutput( - 'Invalid while statement', - doWhileNode - ); - } - - retArr.push('for (let i = 0; i < LOOP_MAX; i++) {'); - this.astGeneric(doWhileNode.body, retArr); - retArr.push('if (!'); - this.astGeneric(doWhileNode.test, retArr); - retArr.push(') {\n'); - retArr.push('break;\n'); - retArr.push('}\n'); - retArr.push('}\n'); - - return retArr; - - } - - astAssignmentExpression(assNode, retArr) { - const declaration = this.getDeclaration(assNode.left); - if (declaration && !declaration.assignable) { - throw this.astErrorOutput(`Variable ${assNode.left.name} is not assignable here`, assNode); - } - this.astGeneric(assNode.left, retArr); - retArr.push(assNode.operator); - this.astGeneric(assNode.right, retArr); - return retArr; - } - - astBlockStatement(bNode, retArr) { - if (this.isState('loop-body')) { - this.pushState('block-body'); - for (let i = 0; i < bNode.body.length; i++) { - this.astGeneric(bNode.body[i], retArr); - } - this.popState('block-body'); - } else { - retArr.push('{\n'); - for (let i = 0; i < bNode.body.length; i++) { - this.astGeneric(bNode.body[i], retArr); - } - retArr.push('}\n'); - } - return retArr; - } - - astVariableDeclaration(varDecNode, retArr) { - retArr.push(`${varDecNode.kind} `); - const { declarations } = varDecNode; - for (let i = 0; i < declarations.length; i++) { - if (i > 0) { - retArr.push(','); - } - const declaration = declarations[i]; - const info = this.getDeclaration(declaration.id); - if (!info.valueType) { - info.valueType = this.getType(declaration.init); - } - this.astGeneric(declaration, retArr); - } - if (!this.isState('in-for-loop-init')) { - retArr.push(';'); - } - return retArr; - } - - astIfStatement(ifNode, retArr) { - retArr.push('if ('); - this.astGeneric(ifNode.test, retArr); - retArr.push(')'); - if (ifNode.consequent.type === 'BlockStatement') { - this.astGeneric(ifNode.consequent, retArr); - } else { - retArr.push(' {\n'); - this.astGeneric(ifNode.consequent, retArr); - retArr.push('\n}\n'); - } - - if (ifNode.alternate) { - retArr.push('else '); - if (ifNode.alternate.type === 'BlockStatement' || ifNode.alternate.type === 'IfStatement') { - this.astGeneric(ifNode.alternate, retArr); - } else { - retArr.push(' {\n'); - this.astGeneric(ifNode.alternate, retArr); - retArr.push('\n}\n'); - } - } - return retArr; - - } - - astSwitchStatement(ast, retArr) { - const { discriminant, cases } = ast; - retArr.push('switch ('); - this.astGeneric(discriminant, retArr); - retArr.push(') {\n'); - for (let i = 0; i < cases.length; i++) { - if (cases[i].test === null) { - retArr.push('default:\n'); - this.astGeneric(cases[i].consequent, retArr); - if (cases[i].consequent && cases[i].consequent.length > 0) { - retArr.push('break;\n'); - } - continue; - } - retArr.push('case '); - this.astGeneric(cases[i].test, retArr); - retArr.push(':\n'); - if (cases[i].consequent && cases[i].consequent.length > 0) { - this.astGeneric(cases[i].consequent, retArr); - retArr.push('break;\n'); - } - } - retArr.push('\n}'); - } - - astThisExpression(tNode, retArr) { - retArr.push('_this'); - return retArr; - } - - astMemberExpression(mNode, retArr) { - const { - signature, - type, - property, - xProperty, - yProperty, - zProperty, - name, - origin - } = this.getMemberExpressionDetails(mNode); - switch (signature) { - case 'this.thread.value': - retArr.push(`_this.thread.${ name }`); - return retArr; - case 'this.output.value': - switch (name) { - case 'x': - retArr.push('outputX'); - break; - case 'y': - retArr.push('outputY'); - break; - case 'z': - retArr.push('outputZ'); - break; - default: - throw this.astErrorOutput('Unexpected expression', mNode); - } - return retArr; - case 'value': - throw this.astErrorOutput('Unexpected expression', mNode); - case 'value[]': - case 'value[][]': - case 'value[][][]': - case 'value.value': - if (origin === 'Math') { - retArr.push(Math[name]); - return retArr; - } - switch (property) { - case 'r': - retArr.push(`user_${ name }[0]`); - return retArr; - case 'g': - retArr.push(`user_${ name }[1]`); - return retArr; - case 'b': - retArr.push(`user_${ name }[2]`); - return retArr; - case 'a': - retArr.push(`user_${ name }[3]`); - return retArr; - } - break; - case 'this.constants.value': - case 'this.constants.value[]': - case 'this.constants.value[][]': - case 'this.constants.value[][][]': - break; - case 'fn()[]': - this.astGeneric(mNode.object, retArr); - retArr.push('['); - this.astGeneric(mNode.property, retArr); - retArr.push(']'); - return retArr; - case 'fn()[][]': - this.astGeneric(mNode.object.object, retArr); - retArr.push('['); - this.astGeneric(mNode.object.property, retArr); - retArr.push(']'); - retArr.push('['); - this.astGeneric(mNode.property, retArr); - retArr.push(']'); - return retArr; - default: - throw this.astErrorOutput('Unexpected expression', mNode); - } - - if (!mNode.computed) { - switch (type) { - case 'Number': - case 'Integer': - case 'Float': - case 'Boolean': - retArr.push(`${origin}_${name}`); - return retArr; - } - } - - const markupName = `${origin}_${name}`; - - switch (type) { - case 'Array(2)': - case 'Array(3)': - case 'Array(4)': - case 'Matrix(2)': - case 'Matrix(3)': - case 'Matrix(4)': - case 'HTMLImageArray': - case 'ArrayTexture(1)': - case 'ArrayTexture(2)': - case 'ArrayTexture(3)': - case 'ArrayTexture(4)': - case 'HTMLImage': - default: - let size; - let isInput; - if (origin === 'constants') { - const constant = this.constants[name]; - isInput = this.constantTypes[name] === 'Input'; - size = isInput ? constant.size : null; - } else { - isInput = this.isInput(name); - size = isInput ? this.argumentSizes[this.argumentNames.indexOf(name)] : null; - } - retArr.push(`${ markupName }`); - if (zProperty && yProperty) { - if (isInput) { - retArr.push('[('); - this.astGeneric(zProperty, retArr); - retArr.push(`*${ this.dynamicArguments ? '(outputY * outputX)' : size[1] * size[0] })+(`); - this.astGeneric(yProperty, retArr); - retArr.push(`*${ this.dynamicArguments ? 'outputX' : size[0] })+`); - this.astGeneric(xProperty, retArr); - retArr.push(']'); - } else { - retArr.push('['); - this.astGeneric(zProperty, retArr); - retArr.push(']'); - retArr.push('['); - this.astGeneric(yProperty, retArr); - retArr.push(']'); - retArr.push('['); - this.astGeneric(xProperty, retArr); - retArr.push(']'); - } - } else if (yProperty) { - if (isInput) { - retArr.push('[('); - this.astGeneric(yProperty, retArr); - retArr.push(`*${ this.dynamicArguments ? 'outputX' : size[0] })+`); - this.astGeneric(xProperty, retArr); - retArr.push(']'); - } else { - retArr.push('['); - this.astGeneric(yProperty, retArr); - retArr.push(']'); - retArr.push('['); - this.astGeneric(xProperty, retArr); - retArr.push(']'); - } - } else if (typeof xProperty !== 'undefined') { - retArr.push('['); - this.astGeneric(xProperty, retArr); - retArr.push(']'); - } - } - return retArr; - } - - astCallExpression(ast, retArr) { - if (ast.type !== 'CallExpression') { - throw this.astErrorOutput('Unknown CallExpression', ast); - } - let functionName = this.astMemberExpressionUnroll(ast.callee); - - if (this.calledFunctions.indexOf(functionName) < 0) { - this.calledFunctions.push(functionName); - } - - const isMathFunction = this.isAstMathFunction(ast); - - if (this.onFunctionCall) { - this.onFunctionCall(this.name, functionName, ast.arguments); - } - - retArr.push(functionName); - - retArr.push('('); - const targetTypes = this.lookupFunctionArgumentTypes(functionName) || []; - for (let i = 0; i < ast.arguments.length; ++i) { - const argument = ast.arguments[i]; - - let argumentType = this.getType(argument); - if (!targetTypes[i]) { - this.triggerImplyArgumentType(functionName, i, argumentType, this); - } - - if (i > 0) { - retArr.push(', '); - } - this.astGeneric(argument, retArr); - } - retArr.push(')'); - - return retArr; - } - - astArrayExpression(arrNode, retArr) { - const returnType = this.getType(arrNode); - const arrLen = arrNode.elements.length; - const elements = []; - for (let i = 0; i < arrLen; ++i) { - const element = []; - this.astGeneric(arrNode.elements[i], element); - elements.push(element.join('')); - } - switch (returnType) { - case 'Matrix(2)': - case 'Matrix(3)': - case 'Matrix(4)': - retArr.push(`[${elements.join(', ')}]`); - break; - default: - retArr.push(`new Float32Array([${elements.join(', ')}])`); - } - return retArr; - } - - astDebuggerStatement(arrNode, retArr) { - retArr.push('debugger;'); - return retArr; - } -} - -module.exports = { - CPUFunctionNode -}; -},{"../function-node":9}],6:[function(require,module,exports){ -const { utils } = require('../../utils'); - -function constantsToString(constants, types) { - const results = []; - for (const name in types) { - if (!types.hasOwnProperty(name)) continue; - const type = types[name]; - const constant = constants[name]; - switch (type) { - case 'Number': - case 'Integer': - case 'Float': - case 'Boolean': - results.push(`${name}:${constant}`); - break; - case 'Array(2)': - case 'Array(3)': - case 'Array(4)': - case 'Matrix(2)': - case 'Matrix(3)': - case 'Matrix(4)': - results.push(`${name}:new ${constant.constructor.name}(${JSON.stringify(Array.from(constant))})`); - break; - } - } - return `{ ${ results.join() } }`; -} - -function cpuKernelString(cpuKernel, name) { - const header = []; - const thisProperties = []; - const beforeReturn = []; - - const useFunctionKeyword = !/^function/.test(cpuKernel.color.toString()); - - header.push( - ' const { context, canvas, constants: incomingConstants } = settings;', - ` const output = new Int32Array(${JSON.stringify(Array.from(cpuKernel.output))});`, - ` const _constantTypes = ${JSON.stringify(cpuKernel.constantTypes)};`, - ` const _constants = ${constantsToString(cpuKernel.constants, cpuKernel.constantTypes)};` - ); - - thisProperties.push( - ' constants: _constants,', - ' context,', - ' output,', - ' thread: {x: 0, y: 0, z: 0},' - ); - - if (cpuKernel.graphical) { - header.push(` const _imageData = context.createImageData(${cpuKernel.output[0]}, ${cpuKernel.output[1]});`); - header.push(` const _colorData = new Uint8ClampedArray(${cpuKernel.output[0]} * ${cpuKernel.output[1]} * 4);`); - - const colorFn = utils.flattenFunctionToString((useFunctionKeyword ? 'function ' : '') + cpuKernel.color.toString(), { - thisLookup: (propertyName) => { - switch (propertyName) { - case '_colorData': - return '_colorData'; - case '_imageData': - return '_imageData'; - case 'output': - return 'output'; - case 'thread': - return 'this.thread'; - } - return JSON.stringify(cpuKernel[propertyName]); - }, - findDependency: (object, name) => { - return null; - } - }); - - const getPixelsFn = utils.flattenFunctionToString((useFunctionKeyword ? 'function ' : '') + cpuKernel.getPixels.toString(), { - thisLookup: (propertyName) => { - switch (propertyName) { - case '_colorData': - return '_colorData'; - case '_imageData': - return '_imageData'; - case 'output': - return 'output'; - case 'thread': - return 'this.thread'; - } - return JSON.stringify(cpuKernel[propertyName]); - }, - findDependency: () => { - return null; - } - }); - - thisProperties.push( - ' _imageData,', - ' _colorData,', - ` color: ${colorFn},` - ); - - beforeReturn.push( - ` kernel.getPixels = ${getPixelsFn};` - ); - } - - const constantTypes = []; - const constantKeys = Object.keys(cpuKernel.constantTypes); - for (let i = 0; i < constantKeys.length; i++) { - constantTypes.push(cpuKernel.constantTypes[constantKeys]); - } - if (cpuKernel.argumentTypes.indexOf('HTMLImageArray') !== -1 || constantTypes.indexOf('HTMLImageArray') !== -1) { - const flattenedImageTo3DArray = utils.flattenFunctionToString((useFunctionKeyword ? 'function ' : '') + cpuKernel._imageTo3DArray.toString(), { - doNotDefine: ['canvas'], - findDependency: (object, name) => { - if (object === 'this') { - return (useFunctionKeyword ? 'function ' : '') + cpuKernel[name].toString(); - } - return null; - }, - thisLookup: (propertyName) => { - switch (propertyName) { - case 'canvas': - return; - case 'context': - return 'context'; - } - } - }); - beforeReturn.push(flattenedImageTo3DArray); - thisProperties.push(` _mediaTo2DArray,`); - thisProperties.push(` _imageTo3DArray,`); - } else if (cpuKernel.argumentTypes.indexOf('HTMLImage') !== -1 || constantTypes.indexOf('HTMLImage') !== -1) { - const flattenedImageTo2DArray = utils.flattenFunctionToString((useFunctionKeyword ? 'function ' : '') + cpuKernel._mediaTo2DArray.toString(), { - findDependency: (object, name) => { - return null; - }, - thisLookup: (propertyName) => { - switch (propertyName) { - case 'canvas': - return 'settings.canvas'; - case 'context': - return 'settings.context'; - } - throw new Error('unhandled thisLookup'); - } - }); - beforeReturn.push(flattenedImageTo2DArray); - thisProperties.push(` _mediaTo2DArray,`); - } - - return `function(settings) { -${ header.join('\n') } - for (const p in _constantTypes) { - if (!_constantTypes.hasOwnProperty(p)) continue; - const type = _constantTypes[p]; - switch (type) { - case 'Number': - case 'Integer': - case 'Float': - case 'Boolean': - case 'Array(2)': - case 'Array(3)': - case 'Array(4)': - case 'Matrix(2)': - case 'Matrix(3)': - case 'Matrix(4)': - if (incomingConstants.hasOwnProperty(p)) { - console.warn('constant ' + p + ' of type ' + type + ' cannot be resigned'); - } - continue; - } - if (!incomingConstants.hasOwnProperty(p)) { - throw new Error('constant ' + p + ' not found'); - } - _constants[p] = incomingConstants[p]; - } - const kernel = (function() { -${cpuKernel._kernelString} - }) - .apply({ ${thisProperties.join('\n')} }); - ${ beforeReturn.join('\n') } - return kernel; -}`; -} - -module.exports = { - cpuKernelString -}; -},{"../../utils":113}],7:[function(require,module,exports){ -const { Kernel } = require('../kernel'); -const { FunctionBuilder } = require('../function-builder'); -const { CPUFunctionNode } = require('./function-node'); -const { utils } = require('../../utils'); -const { cpuKernelString } = require('./kernel-string'); - -class CPUKernel extends Kernel { - static getFeatures() { - return this.features; - } - static get features() { - return Object.freeze({ - kernelMap: true, - isIntegerDivisionAccurate: true - }); - } - static get isSupported() { - return true; - } - static isContextMatch(context) { - return false; - } - static get mode() { - return 'cpu'; - } - - static nativeFunctionArguments() { - return null; - } - - static nativeFunctionReturnType() { - throw new Error(`Looking up native function return type not supported on ${this.name}`); - } - - static combineKernels(combinedKernel) { - return combinedKernel; - } - - static getSignature(kernel, argumentTypes) { - return 'cpu' + (argumentTypes.length > 0 ? ':' + argumentTypes.join(',') : ''); - } - - constructor(source, settings) { - super(source, settings); - this.mergeSettings(source.settings || settings); - - this._imageData = null; - this._colorData = null; - this._kernelString = null; - this._prependedString = []; - this.thread = { - x: 0, - y: 0, - z: 0 - }; - this.translatedSources = null; - } - - initCanvas() { - if (typeof document !== 'undefined') { - return document.createElement('canvas'); - } else if (typeof OffscreenCanvas !== 'undefined') { - return new OffscreenCanvas(0, 0); - } - } - - initContext() { - if (!this.canvas) return null; - return this.canvas.getContext('2d'); - } - - initPlugins(settings) { - return []; - } - - validateSettings(args) { - if (!this.output || this.output.length === 0) { - if (args.length !== 1) { - throw new Error('Auto output only supported for kernels with only one input'); - } - - const argType = utils.getVariableType(args[0], this.strictIntegers); - if (argType === 'Array') { - this.output = utils.getDimensions(argType); - } else if (argType === 'NumberTexture' || argType === 'ArrayTexture(4)') { - this.output = args[0].output; - } else { - throw new Error('Auto output not supported for input type: ' + argType); - } - } - - if (this.graphical) { - if (this.output.length !== 2) { - throw new Error('Output must have 2 dimensions on graphical mode'); - } - } - - this.checkOutput(); - } - - translateSource() { - this.leadingReturnStatement = this.output.length > 1 ? 'resultX[x] = ' : 'result[x] = '; - if (this.subKernels) { - const followingReturnStatement = []; - for (let i = 0; i < this.subKernels.length; i++) { - const { - name - } = this.subKernels[i]; - followingReturnStatement.push(this.output.length > 1 ? `resultX_${ name }[x] = subKernelResult_${ name };\n` : `result_${ name }[x] = subKernelResult_${ name };\n`); - } - this.followingReturnStatement = followingReturnStatement.join(''); - } - const functionBuilder = FunctionBuilder.fromKernel(this, CPUFunctionNode); - this.translatedSources = functionBuilder.getPrototypes('kernel'); - if (!this.graphical && !this.returnType) { - this.returnType = functionBuilder.getKernelResultType(); - } - } - - build() { - if (this.built) return; - this.setupConstants(); - this.setupArguments(arguments); - this.validateSettings(arguments); - this.translateSource(); - - if (this.graphical) { - const { - canvas, - output - } = this; - if (!canvas) { - throw new Error('no canvas available for using graphical output'); - } - const width = output[0]; - const height = output[1] || 1; - canvas.width = width; - canvas.height = height; - this._imageData = this.context.createImageData(width, height); - this._colorData = new Uint8ClampedArray(width * height * 4); - } - - const kernelString = this.getKernelString(); - this.kernelString = kernelString; - - if (this.debug) { - console.log('Function output:'); - console.log(kernelString); - } - - try { - this.run = new Function([], kernelString).bind(this)(); - } catch (e) { - console.error('An error occurred compiling the javascript: ', e); - } - this.buildSignature(arguments); - this.built = true; - } - - color(r, g, b, a) { - if (typeof a === 'undefined') { - a = 1; - } - - r = Math.floor(r * 255); - g = Math.floor(g * 255); - b = Math.floor(b * 255); - a = Math.floor(a * 255); - - const width = this.output[0]; - const height = this.output[1]; - - const x = this.thread.x; - const y = height - this.thread.y - 1; - - const index = x + y * width; - - this._colorData[index * 4 + 0] = r; - this._colorData[index * 4 + 1] = g; - this._colorData[index * 4 + 2] = b; - this._colorData[index * 4 + 3] = a; - } - - getKernelString() { - if (this._kernelString !== null) return this._kernelString; - - let kernelThreadString = null; - let { - translatedSources - } = this; - if (translatedSources.length > 1) { - translatedSources = translatedSources.filter(fn => { - if (/^function/.test(fn)) return fn; - kernelThreadString = fn; - return false; - }); - } else { - kernelThreadString = translatedSources.shift(); - } - return this._kernelString = ` const LOOP_MAX = ${ this._getLoopMaxString() }; - ${ this.injectedNative || '' } - const _this = this; - ${ this._resultKernelHeader() } - ${ this._processConstants() } - return (${ this.argumentNames.map(argumentName => 'user_' + argumentName).join(', ') }) => { - ${ this._prependedString.join('') } - ${ this._earlyThrows() } - ${ this._processArguments() } - ${ this.graphical ? this._graphicalKernelBody(kernelThreadString) : this._resultKernelBody(kernelThreadString) } - ${ translatedSources.length > 0 ? translatedSources.join('\n') : '' } - };`; - } - - toString() { - return cpuKernelString(this); - } - - _getLoopMaxString() { - return ( - this.loopMaxIterations ? - ` ${ parseInt(this.loopMaxIterations) };` : - ' 1000;' - ); - } - - _processConstants() { - if (!this.constants) return ''; - - const result = []; - for (let p in this.constants) { - const type = this.constantTypes[p]; - switch (type) { - case 'HTMLCanvas': - case 'OffscreenCanvas': - case 'HTMLImage': - case 'ImageBitmap': - case 'ImageData': - case 'HTMLVideo': - result.push(` const constants_${p} = this._mediaTo2DArray(this.constants.${p});\n`); - break; - case 'HTMLImageArray': - result.push(` const constants_${p} = this._imageTo3DArray(this.constants.${p});\n`); - break; - case 'Input': - result.push(` const constants_${p} = this.constants.${p}.value;\n`); - break; - default: - result.push(` const constants_${p} = this.constants.${p};\n`); - } - } - return result.join(''); - } - - _earlyThrows() { - if (this.graphical) return ''; - if (this.immutable) return ''; - if (!this.pipeline) return ''; - const arrayArguments = []; - for (let i = 0; i < this.argumentTypes.length; i++) { - if (this.argumentTypes[i] === 'Array') { - arrayArguments.push(this.argumentNames[i]); - } - } - if (arrayArguments.length === 0) return ''; - const checks = []; - for (let i = 0; i < arrayArguments.length; i++) { - const argumentName = arrayArguments[i]; - const checkSubKernels = this._mapSubKernels(subKernel => `user_${argumentName} === result_${subKernel.name}`).join(' || '); - checks.push(`user_${argumentName} === result${checkSubKernels ? ` || ${checkSubKernels}` : ''}`); - } - return `if (${checks.join(' || ')}) throw new Error('Source and destination arrays are the same. Use immutable = true');`; - } - - _processArguments() { - const result = []; - for (let i = 0; i < this.argumentTypes.length; i++) { - const variableName = `user_${this.argumentNames[i]}`; - switch (this.argumentTypes[i]) { - case 'HTMLCanvas': - case 'OffscreenCanvas': - case 'HTMLImage': - case 'ImageBitmap': - case 'ImageData': - case 'HTMLVideo': - result.push(` ${variableName} = this._mediaTo2DArray(${variableName});\n`); - break; - case 'HTMLImageArray': - result.push(` ${variableName} = this._imageTo3DArray(${variableName});\n`); - break; - case 'Input': - result.push(` ${variableName} = ${variableName}.value;\n`); - break; - case 'ArrayTexture(1)': - case 'ArrayTexture(2)': - case 'ArrayTexture(3)': - case 'ArrayTexture(4)': - case 'NumberTexture': - case 'MemoryOptimizedNumberTexture': - result.push(` - if (${variableName}.toArray) { - if (!_this.textureCache) { - _this.textureCache = []; - _this.arrayCache = []; - } - const textureIndex = _this.textureCache.indexOf(${variableName}); - if (textureIndex !== -1) { - ${variableName} = _this.arrayCache[textureIndex]; - } else { - _this.textureCache.push(${variableName}); - ${variableName} = ${variableName}.toArray(); - _this.arrayCache.push(${variableName}); - } - }`); - break; - } - } - return result.join(''); - } - - _mediaTo2DArray(media) { - const canvas = this.canvas; - const width = media.width > 0 ? media.width : media.videoWidth; - const height = media.height > 0 ? media.height : media.videoHeight; - if (canvas.width < width) { - canvas.width = width; - } - if (canvas.height < height) { - canvas.height = height; - } - const ctx = this.context; - let pixelsData; - if (media.constructor === ImageData) { - pixelsData = media.data; - } else { - ctx.drawImage(media, 0, 0, width, height); - pixelsData = ctx.getImageData(0, 0, width, height).data; - } - const imageArray = new Array(height); - let index = 0; - for (let y = height - 1; y >= 0; y--) { - const row = imageArray[y] = new Array(width); - for (let x = 0; x < width; x++) { - const pixel = new Float32Array(4); - pixel[0] = pixelsData[index++] / 255; - pixel[1] = pixelsData[index++] / 255; - pixel[2] = pixelsData[index++] / 255; - pixel[3] = pixelsData[index++] / 255; - row[x] = pixel; - } - } - return imageArray; - } - - getPixels(flip) { - const [width, height] = this.output; - return flip ? utils.flipPixels(this._imageData.data, width, height) : this._imageData.data.slice(0); - } - - _imageTo3DArray(images) { - const imagesArray = new Array(images.length); - for (let i = 0; i < images.length; i++) { - imagesArray[i] = this._mediaTo2DArray(images[i]); - } - return imagesArray; - } - - _resultKernelHeader() { - if (this.graphical) return ''; - if (this.immutable) return ''; - if (!this.pipeline) return ''; - switch (this.output.length) { - case 1: - return this._mutableKernel1DResults(); - case 2: - return this._mutableKernel2DResults(); - case 3: - return this._mutableKernel3DResults(); - } - } - - _resultKernelBody(kernelString) { - switch (this.output.length) { - case 1: - return (!this.immutable && this.pipeline ? this._resultMutableKernel1DLoop(kernelString) : this._resultImmutableKernel1DLoop(kernelString)) + this._kernelOutput(); - case 2: - return (!this.immutable && this.pipeline ? this._resultMutableKernel2DLoop(kernelString) : this._resultImmutableKernel2DLoop(kernelString)) + this._kernelOutput(); - case 3: - return (!this.immutable && this.pipeline ? this._resultMutableKernel3DLoop(kernelString) : this._resultImmutableKernel3DLoop(kernelString)) + this._kernelOutput(); - default: - throw new Error('unsupported size kernel'); - } - } - - _graphicalKernelBody(kernelThreadString) { - switch (this.output.length) { - case 2: - return this._graphicalKernel2DLoop(kernelThreadString) + this._graphicalOutput(); - default: - throw new Error('unsupported size kernel'); - } - } - - _graphicalOutput() { - return ` - this._imageData.data.set(this._colorData); - this.context.putImageData(this._imageData, 0, 0); - return;` - } - - _getKernelResultTypeConstructorString() { - switch (this.returnType) { - case 'LiteralInteger': - case 'Number': - case 'Integer': - case 'Float': - return 'Float32Array'; - case 'Array(2)': - case 'Array(3)': - case 'Array(4)': - return 'Array'; - default: - if (this.graphical) { - return 'Float32Array'; - } - throw new Error(`unhandled returnType ${ this.returnType }`); - } - } - - _resultImmutableKernel1DLoop(kernelString) { - const constructorString = this._getKernelResultTypeConstructorString(); - return ` const outputX = _this.output[0]; - const result = new ${constructorString}(outputX); - ${ this._mapSubKernels(subKernel => `const result_${ subKernel.name } = new ${constructorString}(outputX);\n`).join(' ') } - ${ this._mapSubKernels(subKernel => `let subKernelResult_${ subKernel.name };\n`).join(' ') } - for (let x = 0; x < outputX; x++) { - this.thread.x = x; - this.thread.y = 0; - this.thread.z = 0; - ${ kernelString } - }`; - } - - _mutableKernel1DResults() { - const constructorString = this._getKernelResultTypeConstructorString(); - return ` const outputX = _this.output[0]; - const result = new ${constructorString}(outputX); - ${ this._mapSubKernels(subKernel => `const result_${ subKernel.name } = new ${constructorString}(outputX);\n`).join(' ') } - ${ this._mapSubKernels(subKernel => `let subKernelResult_${ subKernel.name };\n`).join(' ') }`; - } - - _resultMutableKernel1DLoop(kernelString) { - return ` const outputX = _this.output[0]; - for (let x = 0; x < outputX; x++) { - this.thread.x = x; - this.thread.y = 0; - this.thread.z = 0; - ${ kernelString } - }`; - } - - _resultImmutableKernel2DLoop(kernelString) { - const constructorString = this._getKernelResultTypeConstructorString(); - return ` const outputX = _this.output[0]; - const outputY = _this.output[1]; - const result = new Array(outputY); - ${ this._mapSubKernels(subKernel => `const result_${ subKernel.name } = new Array(outputY);\n`).join(' ') } - ${ this._mapSubKernels(subKernel => `let subKernelResult_${ subKernel.name };\n`).join(' ') } - for (let y = 0; y < outputY; y++) { - this.thread.z = 0; - this.thread.y = y; - const resultX = result[y] = new ${constructorString}(outputX); - ${ this._mapSubKernels(subKernel => `const resultX_${ subKernel.name } = result_${subKernel.name}[y] = new ${constructorString}(outputX);\n`).join('') } - for (let x = 0; x < outputX; x++) { - this.thread.x = x; - ${ kernelString } - } - }`; - } - - _mutableKernel2DResults() { - const constructorString = this._getKernelResultTypeConstructorString(); - return ` const outputX = _this.output[0]; - const outputY = _this.output[1]; - const result = new Array(outputY); - ${ this._mapSubKernels(subKernel => `const result_${ subKernel.name } = new Array(outputY);\n`).join(' ') } - ${ this._mapSubKernels(subKernel => `let subKernelResult_${ subKernel.name };\n`).join(' ') } - for (let y = 0; y < outputY; y++) { - const resultX = result[y] = new ${constructorString}(outputX); - ${ this._mapSubKernels(subKernel => `const resultX_${ subKernel.name } = result_${subKernel.name}[y] = new ${constructorString}(outputX);\n`).join('') } - }`; - } - - _resultMutableKernel2DLoop(kernelString) { - const constructorString = this._getKernelResultTypeConstructorString(); - return ` const outputX = _this.output[0]; - const outputY = _this.output[1]; - for (let y = 0; y < outputY; y++) { - this.thread.z = 0; - this.thread.y = y; - const resultX = result[y]; - ${ this._mapSubKernels(subKernel => `const resultX_${ subKernel.name } = result_${subKernel.name}[y] = new ${constructorString}(outputX);\n`).join('') } - for (let x = 0; x < outputX; x++) { - this.thread.x = x; - ${ kernelString } - } - }`; - } - - _graphicalKernel2DLoop(kernelString) { - return ` const outputX = _this.output[0]; - const outputY = _this.output[1]; - for (let y = 0; y < outputY; y++) { - this.thread.z = 0; - this.thread.y = y; - for (let x = 0; x < outputX; x++) { - this.thread.x = x; - ${ kernelString } - } - }`; - } - - _resultImmutableKernel3DLoop(kernelString) { - const constructorString = this._getKernelResultTypeConstructorString(); - return ` const outputX = _this.output[0]; - const outputY = _this.output[1]; - const outputZ = _this.output[2]; - const result = new Array(outputZ); - ${ this._mapSubKernels(subKernel => `const result_${ subKernel.name } = new Array(outputZ);\n`).join(' ') } - ${ this._mapSubKernels(subKernel => `let subKernelResult_${ subKernel.name };\n`).join(' ') } - for (let z = 0; z < outputZ; z++) { - this.thread.z = z; - const resultY = result[z] = new Array(outputY); - ${ this._mapSubKernels(subKernel => `const resultY_${ subKernel.name } = result_${subKernel.name}[z] = new Array(outputY);\n`).join(' ') } - for (let y = 0; y < outputY; y++) { - this.thread.y = y; - const resultX = resultY[y] = new ${constructorString}(outputX); - ${ this._mapSubKernels(subKernel => `const resultX_${ subKernel.name } = resultY_${subKernel.name}[y] = new ${constructorString}(outputX);\n`).join(' ') } - for (let x = 0; x < outputX; x++) { - this.thread.x = x; - ${ kernelString } - } - } - }`; - } - - _mutableKernel3DResults() { - const constructorString = this._getKernelResultTypeConstructorString(); - return ` const outputX = _this.output[0]; - const outputY = _this.output[1]; - const outputZ = _this.output[2]; - const result = new Array(outputZ); - ${ this._mapSubKernels(subKernel => `const result_${ subKernel.name } = new Array(outputZ);\n`).join(' ') } - ${ this._mapSubKernels(subKernel => `let subKernelResult_${ subKernel.name };\n`).join(' ') } - for (let z = 0; z < outputZ; z++) { - const resultY = result[z] = new Array(outputY); - ${ this._mapSubKernels(subKernel => `const resultY_${ subKernel.name } = result_${subKernel.name}[z] = new Array(outputY);\n`).join(' ') } - for (let y = 0; y < outputY; y++) { - const resultX = resultY[y] = new ${constructorString}(outputX); - ${ this._mapSubKernels(subKernel => `const resultX_${ subKernel.name } = resultY_${subKernel.name}[y] = new ${constructorString}(outputX);\n`).join(' ') } - } - }`; - } - - _resultMutableKernel3DLoop(kernelString) { - return ` const outputX = _this.output[0]; - const outputY = _this.output[1]; - const outputZ = _this.output[2]; - for (let z = 0; z < outputZ; z++) { - this.thread.z = z; - const resultY = result[z]; - for (let y = 0; y < outputY; y++) { - this.thread.y = y; - const resultX = resultY[y]; - for (let x = 0; x < outputX; x++) { - this.thread.x = x; - ${ kernelString } - } - } - }`; - } - - _kernelOutput() { - if (!this.subKernels) { - return '\n return result;'; - } - return `\n return { - result: result, - ${ this.subKernels.map(subKernel => `${ subKernel.property }: result_${ subKernel.name }`).join(',\n ') } - };`; - } - - _mapSubKernels(fn) { - return this.subKernels === null ? [''] : - this.subKernels.map(fn); - } - - destroy(removeCanvasReference) { - if (removeCanvasReference) { - delete this.canvas; - } - } - - static destroyContext(context) {} - - toJSON() { - const json = super.toJSON(); - json.functionNodes = FunctionBuilder.fromKernel(this, CPUFunctionNode).toJSON(); - return json; - } - - setOutput(output) { - super.setOutput(output); - const [width, height] = this.output; - if (this.graphical) { - this._imageData = this.context.createImageData(width, height); - this._colorData = new Uint8ClampedArray(width * height * 4); - } - } - - prependString(value) { - if (this._kernelString) throw new Error('Kernel already built'); - this._prependedString.push(value); - } - - hasPrependString(value) { - return this._prependedString.indexOf(value) > -1; - } -} - -module.exports = { - CPUKernel -}; -},{"../../utils":113,"../function-builder":8,"../kernel":35,"./function-node":5,"./kernel-string":6}],8:[function(require,module,exports){ -class FunctionBuilder { - static fromKernel(kernel, FunctionNode, extraNodeOptions) { - const { - kernelArguments, - kernelConstants, - argumentNames, - argumentSizes, - argumentBitRatios, - constants, - constantBitRatios, - debug, - loopMaxIterations, - nativeFunctions, - output, - optimizeFloatMemory, - precision, - plugins, - source, - subKernels, - functions, - leadingReturnStatement, - followingReturnStatement, - dynamicArguments, - dynamicOutput, - } = kernel; - - const argumentTypes = new Array(kernelArguments.length); - const constantTypes = {}; - - for (let i = 0; i < kernelArguments.length; i++) { - argumentTypes[i] = kernelArguments[i].type; - } - - for (let i = 0; i < kernelConstants.length; i++) { - const kernelConstant = kernelConstants[i]; - constantTypes[kernelConstant.name] = kernelConstant.type; - } - - const needsArgumentType = (functionName, index) => { - return functionBuilder.needsArgumentType(functionName, index); - }; - - const assignArgumentType = (functionName, index, type) => { - functionBuilder.assignArgumentType(functionName, index, type); - }; - - const lookupReturnType = (functionName, ast, requestingNode) => { - return functionBuilder.lookupReturnType(functionName, ast, requestingNode); - }; - - const lookupFunctionArgumentTypes = (functionName) => { - return functionBuilder.lookupFunctionArgumentTypes(functionName); - }; - - const lookupFunctionArgumentName = (functionName, argumentIndex) => { - return functionBuilder.lookupFunctionArgumentName(functionName, argumentIndex); - }; - - const lookupFunctionArgumentBitRatio = (functionName, argumentName) => { - return functionBuilder.lookupFunctionArgumentBitRatio(functionName, argumentName); - }; - - const triggerImplyArgumentType = (functionName, i, argumentType, requestingNode) => { - functionBuilder.assignArgumentType(functionName, i, argumentType, requestingNode); - }; - - const triggerImplyArgumentBitRatio = (functionName, argumentName, calleeFunctionName, argumentIndex) => { - functionBuilder.assignArgumentBitRatio(functionName, argumentName, calleeFunctionName, argumentIndex); - }; - - const onFunctionCall = (functionName, calleeFunctionName, args) => { - functionBuilder.trackFunctionCall(functionName, calleeFunctionName, args); - }; - - const onNestedFunction = (ast, source) => { - const argumentNames = []; - for (let i = 0; i < ast.params.length; i++) { - argumentNames.push(ast.params[i].name); - } - const nestedFunction = new FunctionNode(source, Object.assign({}, nodeOptions, { - returnType: null, - ast, - name: ast.id.name, - argumentNames, - lookupReturnType, - lookupFunctionArgumentTypes, - lookupFunctionArgumentName, - lookupFunctionArgumentBitRatio, - needsArgumentType, - assignArgumentType, - triggerImplyArgumentType, - triggerImplyArgumentBitRatio, - onFunctionCall, - })); - nestedFunction.traceFunctionAST(ast); - functionBuilder.addFunctionNode(nestedFunction); - }; - - const nodeOptions = Object.assign({ - isRootKernel: false, - onNestedFunction, - lookupReturnType, - lookupFunctionArgumentTypes, - lookupFunctionArgumentName, - lookupFunctionArgumentBitRatio, - needsArgumentType, - assignArgumentType, - triggerImplyArgumentType, - triggerImplyArgumentBitRatio, - onFunctionCall, - optimizeFloatMemory, - precision, - constants, - constantTypes, - constantBitRatios, - debug, - loopMaxIterations, - output, - plugins, - dynamicArguments, - dynamicOutput, - }, extraNodeOptions || {}); - - const rootNodeOptions = Object.assign({}, nodeOptions, { - isRootKernel: true, - name: 'kernel', - argumentNames, - argumentTypes, - argumentSizes, - argumentBitRatios, - leadingReturnStatement, - followingReturnStatement, - }); - - if (typeof source === 'object' && source.functionNodes) { - return new FunctionBuilder().fromJSON(source.functionNodes, FunctionNode); - } - - const rootNode = new FunctionNode(source, rootNodeOptions); - - let functionNodes = null; - if (functions) { - functionNodes = functions.map((fn) => new FunctionNode(fn.source, { - returnType: fn.returnType, - argumentTypes: fn.argumentTypes, - output, - plugins, - constants, - constantTypes, - constantBitRatios, - optimizeFloatMemory, - precision, - lookupReturnType, - lookupFunctionArgumentTypes, - lookupFunctionArgumentName, - lookupFunctionArgumentBitRatio, - needsArgumentType, - assignArgumentType, - triggerImplyArgumentType, - triggerImplyArgumentBitRatio, - onFunctionCall, - onNestedFunction, - })); - } - - let subKernelNodes = null; - if (subKernels) { - subKernelNodes = subKernels.map((subKernel) => { - const { name, source } = subKernel; - return new FunctionNode(source, Object.assign({}, nodeOptions, { - name, - isSubKernel: true, - isRootKernel: false, - })); - }); - } - - const functionBuilder = new FunctionBuilder({ - kernel, - rootNode, - functionNodes, - nativeFunctions, - subKernelNodes - }); - - return functionBuilder; - } - - constructor(settings) { - settings = settings || {}; - this.kernel = settings.kernel; - this.rootNode = settings.rootNode; - this.functionNodes = settings.functionNodes || []; - this.subKernelNodes = settings.subKernelNodes || []; - this.nativeFunctions = settings.nativeFunctions || []; - this.functionMap = {}; - this.nativeFunctionNames = []; - this.lookupChain = []; - this.functionNodeDependencies = {}; - this.functionCalls = {}; - - if (this.rootNode) { - this.functionMap['kernel'] = this.rootNode; - } - - if (this.functionNodes) { - for (let i = 0; i < this.functionNodes.length; i++) { - this.functionMap[this.functionNodes[i].name] = this.functionNodes[i]; - } - } - - if (this.subKernelNodes) { - for (let i = 0; i < this.subKernelNodes.length; i++) { - this.functionMap[this.subKernelNodes[i].name] = this.subKernelNodes[i]; - } - } - - if (this.nativeFunctions) { - for (let i = 0; i < this.nativeFunctions.length; i++) { - const nativeFunction = this.nativeFunctions[i]; - this.nativeFunctionNames.push(nativeFunction.name); - } - } - } - - addFunctionNode(functionNode) { - if (!functionNode.name) throw new Error('functionNode.name needs set'); - this.functionMap[functionNode.name] = functionNode; - if (functionNode.isRootKernel) { - this.rootNode = functionNode; - } - } - - traceFunctionCalls(functionName, retList) { - functionName = functionName || 'kernel'; - retList = retList || []; - - if (this.nativeFunctionNames.indexOf(functionName) > -1) { - const nativeFunctionIndex = retList.indexOf(functionName); - if (nativeFunctionIndex === -1) { - retList.push(functionName); - } else { - const dependantNativeFunctionName = retList.splice(nativeFunctionIndex, 1)[0]; - retList.push(dependantNativeFunctionName); - } - return retList; - } - - const functionNode = this.functionMap[functionName]; - if (functionNode) { - const functionIndex = retList.indexOf(functionName); - if (functionIndex === -1) { - retList.push(functionName); - functionNode.toString(); - for (let i = 0; i < functionNode.calledFunctions.length; ++i) { - this.traceFunctionCalls(functionNode.calledFunctions[i], retList); - } - } else { - const dependantFunctionName = retList.splice(functionIndex, 1)[0]; - retList.push(dependantFunctionName); - } - } - - return retList; - } - - getPrototypeString(functionName) { - return this.getPrototypes(functionName).join('\n'); - } - - getPrototypes(functionName) { - if (this.rootNode) { - this.rootNode.toString(); - } - if (functionName) { - return this.getPrototypesFromFunctionNames(this.traceFunctionCalls(functionName, []).reverse()); - } - return this.getPrototypesFromFunctionNames(Object.keys(this.functionMap)); - } - - getStringFromFunctionNames(functionList) { - const ret = []; - for (let i = 0; i < functionList.length; ++i) { - const node = this.functionMap[functionList[i]]; - if (node) { - ret.push(this.functionMap[functionList[i]].toString()); - } - } - return ret.join('\n'); - } - - getPrototypesFromFunctionNames(functionList) { - const ret = []; - for (let i = 0; i < functionList.length; ++i) { - const functionName = functionList[i]; - const functionIndex = this.nativeFunctionNames.indexOf(functionName); - if (functionIndex > -1) { - ret.push(this.nativeFunctions[functionIndex].source); - continue; - } - const node = this.functionMap[functionName]; - if (node) { - ret.push(node.toString()); - } - } - return ret; - } - - toJSON() { - return this.traceFunctionCalls(this.rootNode.name).reverse().map(name => { - const nativeIndex = this.nativeFunctions.indexOf(name); - if (nativeIndex > -1) { - return { - name, - source: this.nativeFunctions[nativeIndex].source - }; - } else if (this.functionMap[name]) { - return this.functionMap[name].toJSON(); - } else { - throw new Error(`function ${ name } not found`); - } - }); - } - - fromJSON(jsonFunctionNodes, FunctionNode) { - this.functionMap = {}; - for (let i = 0; i < jsonFunctionNodes.length; i++) { - const jsonFunctionNode = jsonFunctionNodes[i]; - this.functionMap[jsonFunctionNode.settings.name] = new FunctionNode(jsonFunctionNode.ast, jsonFunctionNode.settings); - } - return this; - } - - getString(functionName) { - if (functionName) { - return this.getStringFromFunctionNames(this.traceFunctionCalls(functionName).reverse()); - } - return this.getStringFromFunctionNames(Object.keys(this.functionMap)); - } - - lookupReturnType(functionName, ast, requestingNode) { - if (ast.type !== 'CallExpression') { - throw new Error(`expected ast type of "CallExpression", but is ${ ast.type }`); - } - if (this._isNativeFunction(functionName)) { - return this._lookupNativeFunctionReturnType(functionName); - } else if (this._isFunction(functionName)) { - const node = this._getFunction(functionName); - if (node.returnType) { - return node.returnType; - } else { - for (let i = 0; i < this.lookupChain.length; i++) { - if (this.lookupChain[i].ast === ast) { - if (node.argumentTypes.length === 0 && ast.arguments.length > 0) { - const args = ast.arguments; - for (let j = 0; j < args.length; j++) { - this.lookupChain.push({ - name: requestingNode.name, - ast: args[i], - requestingNode - }); - node.argumentTypes[j] = requestingNode.getType(args[j]); - this.lookupChain.pop(); - } - return node.returnType = node.getType(node.getJsAST()); - } - - throw new Error('circlical logic detected!'); - } - } - this.lookupChain.push({ - name: requestingNode.name, - ast, - requestingNode - }); - const type = node.getType(node.getJsAST()); - this.lookupChain.pop(); - return node.returnType = type; - } - } - - return null; - } - - _getFunction(functionName) { - if (!this._isFunction(functionName)) { - new Error(`Function ${functionName} not found`); - } - return this.functionMap[functionName]; - } - - _isFunction(functionName) { - return Boolean(this.functionMap[functionName]); - } - - _getNativeFunction(functionName) { - for (let i = 0; i < this.nativeFunctions.length; i++) { - if (this.nativeFunctions[i].name === functionName) return this.nativeFunctions[i]; - } - return null; - } - - _isNativeFunction(functionName) { - return Boolean(this._getNativeFunction(functionName)); - } - - _lookupNativeFunctionReturnType(functionName) { - let nativeFunction = this._getNativeFunction(functionName); - if (nativeFunction) { - return nativeFunction.returnType; - } - throw new Error(`Native function ${ functionName } not found`); - } - - lookupFunctionArgumentTypes(functionName) { - if (this._isNativeFunction(functionName)) { - return this._getNativeFunction(functionName).argumentTypes; - } else if (this._isFunction(functionName)) { - return this._getFunction(functionName).argumentTypes; - } - return null; - } - - lookupFunctionArgumentName(functionName, argumentIndex) { - return this._getFunction(functionName).argumentNames[argumentIndex]; - } - - lookupFunctionArgumentBitRatio(functionName, argumentName) { - if (!this._isFunction(functionName)) { - throw new Error('function not found'); - } - if (this.rootNode.name === functionName) { - const i = this.rootNode.argumentNames.indexOf(argumentName); - if (i !== -1) { - return this.rootNode.argumentBitRatios[i]; - } - } - const node = this._getFunction(functionName); - const i = node.argumentNames.indexOf(argumentName); - if (i === -1) { - throw new Error('argument not found'); - } - const bitRatio = node.argumentBitRatios[i]; - if (typeof bitRatio !== 'number') { - throw new Error('argument bit ratio not found'); - } - return bitRatio; - } - - needsArgumentType(functionName, i) { - if (!this._isFunction(functionName)) return false; - const fnNode = this._getFunction(functionName); - return !fnNode.argumentTypes[i]; - } - - assignArgumentType(functionName, i, argumentType, requestingNode) { - if (!this._isFunction(functionName)) return; - const fnNode = this._getFunction(functionName); - if (!fnNode.argumentTypes[i]) { - fnNode.argumentTypes[i] = argumentType; - } - } - - assignArgumentBitRatio(functionName, argumentName, calleeFunctionName, argumentIndex) { - const node = this._getFunction(functionName); - if (this._isNativeFunction(calleeFunctionName)) return null; - const calleeNode = this._getFunction(calleeFunctionName); - const i = node.argumentNames.indexOf(argumentName); - if (i === -1) { - throw new Error(`Argument ${argumentName} not found in arguments from function ${functionName}`); - } - const bitRatio = node.argumentBitRatios[i]; - if (typeof bitRatio !== 'number') { - throw new Error(`Bit ratio for argument ${argumentName} not found in function ${functionName}`); - } - if (!calleeNode.argumentBitRatios) { - calleeNode.argumentBitRatios = new Array(calleeNode.argumentNames.length); - } - const calleeBitRatio = calleeNode.argumentBitRatios[i]; - if (typeof calleeBitRatio === 'number') { - if (calleeBitRatio !== bitRatio) { - throw new Error(`Incompatible bit ratio found at function ${functionName} at argument ${argumentName}`); - } - return calleeBitRatio; - } - calleeNode.argumentBitRatios[i] = bitRatio; - return bitRatio; - } - - trackFunctionCall(functionName, calleeFunctionName, args) { - if (!this.functionNodeDependencies[functionName]) { - this.functionNodeDependencies[functionName] = new Set(); - this.functionCalls[functionName] = []; - } - this.functionNodeDependencies[functionName].add(calleeFunctionName); - this.functionCalls[functionName].push(args); - } - - getKernelResultType() { - return this.rootNode.returnType || this.rootNode.getType(this.rootNode.ast); - } - - getSubKernelResultType(index) { - const subKernelNode = this.subKernelNodes[index]; - let called = false; - for (let functionCallIndex = 0; functionCallIndex < this.rootNode.functionCalls.length; functionCallIndex++) { - const functionCall = this.rootNode.functionCalls[functionCallIndex]; - if (functionCall.ast.callee.name === subKernelNode.name) { - called = true; - } - } - if (!called) { - throw new Error(`SubKernel ${ subKernelNode.name } never called by kernel`); - } - return subKernelNode.returnType || subKernelNode.getType(subKernelNode.getJsAST()); - } - - getReturnTypes() { - const result = { - [this.rootNode.name]: this.rootNode.getType(this.rootNode.ast), - }; - const list = this.traceFunctionCalls(this.rootNode.name); - for (let i = 0; i < list.length; i++) { - const functionName = list[i]; - const functionNode = this.functionMap[functionName]; - result[functionName] = functionNode.getType(functionNode.ast); - } - return result; - } -} - -module.exports = { - FunctionBuilder -}; -},{}],9:[function(require,module,exports){ -const acorn = require('acorn'); -const { utils } = require('../utils'); -const { FunctionTracer } = require('./function-tracer'); - -class FunctionNode { - constructor(source, settings) { - if (!source && !settings.ast) { - throw new Error('source parameter is missing'); - } - settings = settings || {}; - this.source = source; - this.ast = null; - this.name = typeof source === 'string' ? settings.isRootKernel ? - 'kernel' : - (settings.name || utils.getFunctionNameFromString(source)) : null; - this.calledFunctions = []; - this.constants = {}; - this.constantTypes = {}; - this.constantBitRatios = {}; - this.isRootKernel = false; - this.isSubKernel = false; - this.debug = null; - this.functions = null; - this.identifiers = null; - this.contexts = null; - this.functionCalls = null; - this.states = []; - this.needsArgumentType = null; - this.assignArgumentType = null; - this.lookupReturnType = null; - this.lookupFunctionArgumentTypes = null; - this.lookupFunctionArgumentBitRatio = null; - this.triggerImplyArgumentType = null; - this.triggerImplyArgumentBitRatio = null; - this.onNestedFunction = null; - this.onFunctionCall = null; - this.optimizeFloatMemory = null; - this.precision = null; - this.loopMaxIterations = null; - this.argumentNames = (typeof this.source === 'string' ? utils.getArgumentNamesFromString(this.source) : null); - this.argumentTypes = []; - this.argumentSizes = []; - this.argumentBitRatios = null; - this.returnType = null; - this.output = []; - this.plugins = null; - this.leadingReturnStatement = null; - this.followingReturnStatement = null; - this.dynamicOutput = null; - this.dynamicArguments = null; - this.strictTypingChecking = false; - this.fixIntegerDivisionAccuracy = null; - - if (settings) { - for (const p in settings) { - if (!settings.hasOwnProperty(p)) continue; - if (!this.hasOwnProperty(p)) continue; - this[p] = settings[p]; - } - } - - this.literalTypes = {}; - - this.validate(); - this._string = null; - this._internalVariableNames = {}; - } - - validate() { - if (typeof this.source !== 'string' && !this.ast) { - throw new Error('this.source not a string'); - } - - if (!this.ast && !utils.isFunctionString(this.source)) { - throw new Error('this.source not a function string'); - } - - if (!this.name) { - throw new Error('this.name could not be set'); - } - - if (this.argumentTypes.length > 0 && this.argumentTypes.length !== this.argumentNames.length) { - throw new Error(`argumentTypes count of ${ this.argumentTypes.length } exceeds ${ this.argumentNames.length }`); - } - - if (this.output.length < 1) { - throw new Error('this.output is not big enough'); - } - } - - isIdentifierConstant(name) { - if (!this.constants) return false; - return this.constants.hasOwnProperty(name); - } - - isInput(argumentName) { - return this.argumentTypes[this.argumentNames.indexOf(argumentName)] === 'Input'; - } - - pushState(state) { - this.states.push(state); - } - - popState(state) { - if (this.state !== state) { - throw new Error(`Cannot popState ${ state } when in ${ this.state }`); - } - this.states.pop(); - } - - isState(state) { - return this.state === state; - } - - get state() { - return this.states[this.states.length - 1]; - } - - astMemberExpressionUnroll(ast) { - if (ast.type === 'Identifier') { - return ast.name; - } else if (ast.type === 'ThisExpression') { - return 'this'; - } - - if (ast.type === 'MemberExpression') { - if (ast.object && ast.property) { - if (ast.object.hasOwnProperty('name') && ast.object.name !== 'Math') { - return this.astMemberExpressionUnroll(ast.property); - } - - return ( - this.astMemberExpressionUnroll(ast.object) + - '.' + - this.astMemberExpressionUnroll(ast.property) - ); - } - } - - if (ast.hasOwnProperty('expressions')) { - const firstExpression = ast.expressions[0]; - if (firstExpression.type === 'Literal' && firstExpression.value === 0 && ast.expressions.length === 2) { - return this.astMemberExpressionUnroll(ast.expressions[1]); - } - } - - throw this.astErrorOutput('Unknown astMemberExpressionUnroll', ast); - } - - getJsAST(inParser) { - if (this.ast) { - return this.ast; - } - if (typeof this.source === 'object') { - this.traceFunctionAST(this.source); - return this.ast = this.source; - } - - inParser = inParser || acorn; - if (inParser === null) { - throw new Error('Missing JS to AST parser'); - } - - const ast = Object.freeze(inParser.parse(`const parser_${ this.name } = ${ this.source };`, { - locations: true - })); - const functionAST = ast.body[0].declarations[0].init; - this.traceFunctionAST(functionAST); - - if (!ast) { - throw new Error('Failed to parse JS code'); - } - - return this.ast = functionAST; - } - - traceFunctionAST(ast) { - const { contexts, declarations, functions, identifiers, functionCalls } = new FunctionTracer(ast); - this.contexts = contexts; - this.identifiers = identifiers; - this.functionCalls = functionCalls; - this.functions = functions; - for (let i = 0; i < declarations.length; i++) { - const declaration = declarations[i]; - const { ast, inForLoopInit, inForLoopTest } = declaration; - const { init } = ast; - const dependencies = this.getDependencies(init); - let valueType = null; - - if (inForLoopInit && inForLoopTest) { - valueType = 'Integer'; - } else { - if (init) { - const realType = this.getType(init); - switch (realType) { - case 'Integer': - case 'Float': - case 'Number': - if (init.type === 'MemberExpression') { - valueType = realType; - } else { - valueType = 'Number'; - } - break; - case 'LiteralInteger': - valueType = 'Number'; - break; - default: - valueType = realType; - } - } - } - declaration.valueType = valueType; - declaration.dependencies = dependencies; - declaration.isSafe = this.isSafeDependencies(dependencies); - } - - for (let i = 0; i < functions.length; i++) { - this.onNestedFunction(functions[i], this.source); - } - } - - getDeclaration(ast) { - for (let i = 0; i < this.identifiers.length; i++) { - const identifier = this.identifiers[i]; - if (ast === identifier.ast) { - return identifier.declaration; - } - } - return null; - } - - getVariableType(ast) { - if (ast.type !== 'Identifier') { - throw new Error(`ast of ${ast.type} not "Identifier"`); - } - let type = null; - const argumentIndex = this.argumentNames.indexOf(ast.name); - if (argumentIndex === -1) { - const declaration = this.getDeclaration(ast); - if (declaration) { - return declaration.valueType; - } - } else { - const argumentType = this.argumentTypes[argumentIndex]; - if (argumentType) { - type = argumentType; - } - } - if (!type && this.strictTypingChecking) { - throw new Error(`Declaration of ${name} not found`); - } - return type; - } - - getLookupType(type) { - if (!typeLookupMap.hasOwnProperty(type)) { - throw new Error(`unknown typeLookupMap ${ type }`); - } - return typeLookupMap[type]; - } - - getConstantType(constantName) { - if (this.constantTypes[constantName]) { - const type = this.constantTypes[constantName]; - if (type === 'Float') { - return 'Number'; - } else { - return type; - } - } - throw new Error(`Type for constant "${ constantName }" not declared`); - } - - toString() { - if (this._string) return this._string; - return this._string = this.astGeneric(this.getJsAST(), []).join('').trim(); - } - - toJSON() { - const settings = { - source: this.source, - name: this.name, - constants: this.constants, - constantTypes: this.constantTypes, - isRootKernel: this.isRootKernel, - isSubKernel: this.isSubKernel, - debug: this.debug, - output: this.output, - loopMaxIterations: this.loopMaxIterations, - argumentNames: this.argumentNames, - argumentTypes: this.argumentTypes, - argumentSizes: this.argumentSizes, - returnType: this.returnType, - leadingReturnStatement: this.leadingReturnStatement, - followingReturnStatement: this.followingReturnStatement, - }; - - return { - ast: this.ast, - settings - }; - } - - getType(ast) { - if (Array.isArray(ast)) { - return this.getType(ast[ast.length - 1]); - } - switch (ast.type) { - case 'BlockStatement': - return this.getType(ast.body); - case 'ArrayExpression': - const childType = this.getType(ast.elements[0]); - switch (childType) { - case 'Array(2)': - case 'Array(3)': - case 'Array(4)': - return `Matrix(${ast.elements.length})`; - } - return `Array(${ ast.elements.length })`; - case 'Literal': - const literalKey = this.astKey(ast); - if (this.literalTypes[literalKey]) { - return this.literalTypes[literalKey]; - } - if (Number.isInteger(ast.value)) { - return 'LiteralInteger'; - } else if (ast.value === true || ast.value === false) { - return 'Boolean'; - } else { - return 'Number'; - } - case 'AssignmentExpression': - return this.getType(ast.left); - case 'CallExpression': - if (this.isAstMathFunction(ast)) { - return 'Number'; - } - if (!ast.callee || !ast.callee.name) { - if (ast.callee.type === 'SequenceExpression' && ast.callee.expressions[ast.callee.expressions.length - 1].property.name) { - const functionName = ast.callee.expressions[ast.callee.expressions.length - 1].property.name; - this.inferArgumentTypesIfNeeded(functionName, ast.arguments); - return this.lookupReturnType(functionName, ast, this); - } - if (this.getVariableSignature(ast.callee, true) === 'this.color') { - return null; - } - if (ast.callee.type === 'MemberExpression' && ast.callee.object && ast.callee.property && ast.callee.property.name && ast.arguments) { - const functionName = ast.callee.property.name; - this.inferArgumentTypesIfNeeded(functionName, ast.arguments); - return this.lookupReturnType(functionName, ast, this); - } - throw this.astErrorOutput('Unknown call expression', ast); - } - if (ast.callee && ast.callee.name) { - const functionName = ast.callee.name; - this.inferArgumentTypesIfNeeded(functionName, ast.arguments); - return this.lookupReturnType(functionName, ast, this); - } - throw this.astErrorOutput(`Unhandled getType Type "${ ast.type }"`, ast); - case 'LogicalExpression': - return 'Boolean'; - case 'BinaryExpression': - switch (ast.operator) { - case '%': - case '/': - if (this.fixIntegerDivisionAccuracy) { - return 'Number'; - } else { - break; - } - case '>': - case '<': - return 'Boolean'; - case '&': - case '|': - case '^': - case '<<': - case '>>': - case '>>>': - return 'Integer'; - } - const type = this.getType(ast.left); - if (this.isState('skip-literal-correction')) return type; - if (type === 'LiteralInteger') { - const rightType = this.getType(ast.right); - if (rightType === 'LiteralInteger') { - if (ast.left.value % 1 === 0) { - return 'Integer'; - } else { - return 'Float'; - } - } - return rightType; - } - return typeLookupMap[type] || type; - case 'UpdateExpression': - return this.getType(ast.argument); - case 'UnaryExpression': - if (ast.operator === '~') { - return 'Integer'; - } - return this.getType(ast.argument); - case 'VariableDeclaration': { - const declarations = ast.declarations; - let lastType; - for (let i = 0; i < declarations.length; i++) { - const declaration = declarations[i]; - lastType = this.getType(declaration); - } - if (!lastType) { - throw this.astErrorOutput(`Unable to find type for declaration`, ast); - } - return lastType; - } - case 'VariableDeclarator': - const declaration = this.getDeclaration(ast.id); - if (!declaration) { - throw this.astErrorOutput(`Unable to find declarator`, ast); - } - - if (!declaration.valueType) { - throw this.astErrorOutput(`Unable to find declarator valueType`, ast); - } - - return declaration.valueType; - case 'Identifier': - if (ast.name === 'Infinity') { - return 'Number'; - } - if (this.isAstVariable(ast)) { - const signature = this.getVariableSignature(ast); - if (signature === 'value') { - return this.getCheckVariableType(ast); - } - } - const origin = this.findIdentifierOrigin(ast); - if (origin && origin.init) { - return this.getType(origin.init); - } - return null; - case 'ReturnStatement': - return this.getType(ast.argument); - case 'MemberExpression': - if (this.isAstMathFunction(ast)) { - switch (ast.property.name) { - case 'ceil': - return 'Integer'; - case 'floor': - return 'Integer'; - case 'round': - return 'Integer'; - } - return 'Number'; - } - if (this.isAstVariable(ast)) { - const variableSignature = this.getVariableSignature(ast); - switch (variableSignature) { - case 'value[]': - return this.getLookupType(this.getCheckVariableType(ast.object)); - case 'value[][]': - return this.getLookupType(this.getCheckVariableType(ast.object.object)); - case 'value[][][]': - return this.getLookupType(this.getCheckVariableType(ast.object.object.object)); - case 'value[][][][]': - return this.getLookupType(this.getCheckVariableType(ast.object.object.object.object)); - case 'value.thread.value': - case 'this.thread.value': - return 'Integer'; - case 'this.output.value': - return this.dynamicOutput ? 'Integer' : 'LiteralInteger'; - case 'this.constants.value': - return this.getConstantType(ast.property.name); - case 'this.constants.value[]': - return this.getLookupType(this.getConstantType(ast.object.property.name)); - case 'this.constants.value[][]': - return this.getLookupType(this.getConstantType(ast.object.object.property.name)); - case 'this.constants.value[][][]': - return this.getLookupType(this.getConstantType(ast.object.object.object.property.name)); - case 'this.constants.value[][][][]': - return this.getLookupType(this.getConstantType(ast.object.object.object.object.property.name)); - case 'fn()[]': - case 'fn()[][]': - case 'fn()[][][]': - return this.getLookupType(this.getType(ast.object)); - case 'value.value': - if (this.isAstMathVariable(ast)) { - return 'Number'; - } - switch (ast.property.name) { - case 'r': - case 'g': - case 'b': - case 'a': - return this.getLookupType(this.getCheckVariableType(ast.object)); - } - case '[][]': - return 'Number'; - } - throw this.astErrorOutput('Unhandled getType MemberExpression', ast); - } - throw this.astErrorOutput('Unhandled getType MemberExpression', ast); - case 'ConditionalExpression': - return this.getType(ast.consequent); - case 'FunctionDeclaration': - case 'FunctionExpression': - const lastReturn = this.findLastReturn(ast.body); - if (lastReturn) { - return this.getType(lastReturn); - } - return null; - case 'IfStatement': - return this.getType(ast.consequent); - case 'SequenceExpression': - return this.getType(ast.expressions[ast.expressions.length - 1]); - default: - throw this.astErrorOutput(`Unhandled getType Type "${ ast.type }"`, ast); - } - } - - getCheckVariableType(ast) { - const type = this.getVariableType(ast); - if (!type) { - throw this.astErrorOutput(`${ast.type} is not defined`, ast); - } - return type; - } - - inferArgumentTypesIfNeeded(functionName, args) { - for (let i = 0; i < args.length; i++) { - if (!this.needsArgumentType(functionName, i)) continue; - const type = this.getType(args[i]); - if (!type) { - throw this.astErrorOutput(`Unable to infer argument ${i}`, args[i]); - } - this.assignArgumentType(functionName, i, type); - } - } - - isAstMathVariable(ast) { - const mathProperties = [ - 'E', - 'PI', - 'SQRT2', - 'SQRT1_2', - 'LN2', - 'LN10', - 'LOG2E', - 'LOG10E', - ]; - return ast.type === 'MemberExpression' && - ast.object && ast.object.type === 'Identifier' && - ast.object.name === 'Math' && - ast.property && - ast.property.type === 'Identifier' && - mathProperties.indexOf(ast.property.name) > -1; - } - - isAstMathFunction(ast) { - const mathFunctions = [ - 'abs', - 'acos', - 'acosh', - 'asin', - 'asinh', - 'atan', - 'atan2', - 'atanh', - 'cbrt', - 'ceil', - 'clz32', - 'cos', - 'cosh', - 'expm1', - 'exp', - 'floor', - 'fround', - 'imul', - 'log', - 'log2', - 'log10', - 'log1p', - 'max', - 'min', - 'pow', - 'random', - 'round', - 'sign', - 'sin', - 'sinh', - 'sqrt', - 'tan', - 'tanh', - 'trunc', - ]; - return ast.type === 'CallExpression' && - ast.callee && - ast.callee.type === 'MemberExpression' && - ast.callee.object && - ast.callee.object.type === 'Identifier' && - ast.callee.object.name === 'Math' && - ast.callee.property && - ast.callee.property.type === 'Identifier' && - mathFunctions.indexOf(ast.callee.property.name) > -1; - } - - isAstVariable(ast) { - return ast.type === 'Identifier' || ast.type === 'MemberExpression'; - } - - isSafe(ast) { - return this.isSafeDependencies(this.getDependencies(ast)); - } - - isSafeDependencies(dependencies) { - return dependencies && dependencies.every ? dependencies.every(dependency => dependency.isSafe) : true; - } - - getDependencies(ast, dependencies, isNotSafe) { - if (!dependencies) { - dependencies = []; - } - if (!ast) return null; - if (Array.isArray(ast)) { - for (let i = 0; i < ast.length; i++) { - this.getDependencies(ast[i], dependencies, isNotSafe); - } - return dependencies; - } - switch (ast.type) { - case 'AssignmentExpression': - this.getDependencies(ast.left, dependencies, isNotSafe); - this.getDependencies(ast.right, dependencies, isNotSafe); - return dependencies; - case 'ConditionalExpression': - this.getDependencies(ast.test, dependencies, isNotSafe); - this.getDependencies(ast.alternate, dependencies, isNotSafe); - this.getDependencies(ast.consequent, dependencies, isNotSafe); - return dependencies; - case 'Literal': - dependencies.push({ - origin: 'literal', - value: ast.value, - isSafe: isNotSafe === true ? false : ast.value > -Infinity && ast.value < Infinity && !isNaN(ast.value) - }); - break; - case 'VariableDeclarator': - return this.getDependencies(ast.init, dependencies, isNotSafe); - case 'Identifier': - const declaration = this.getDeclaration(ast); - if (declaration) { - dependencies.push({ - name: ast.name, - origin: 'declaration', - isSafe: isNotSafe ? false : this.isSafeDependencies(declaration.dependencies), - }); - } else if (this.argumentNames.indexOf(ast.name) > -1) { - dependencies.push({ - name: ast.name, - origin: 'argument', - isSafe: false, - }); - } else if (this.strictTypingChecking) { - throw new Error(`Cannot find identifier origin "${ast.name}"`); - } - break; - case 'FunctionDeclaration': - return this.getDependencies(ast.body.body[ast.body.body.length - 1], dependencies, isNotSafe); - case 'ReturnStatement': - return this.getDependencies(ast.argument, dependencies); - case 'BinaryExpression': - case 'LogicalExpression': - isNotSafe = (ast.operator === '/' || ast.operator === '*'); - this.getDependencies(ast.left, dependencies, isNotSafe); - this.getDependencies(ast.right, dependencies, isNotSafe); - return dependencies; - case 'UnaryExpression': - case 'UpdateExpression': - return this.getDependencies(ast.argument, dependencies, isNotSafe); - case 'VariableDeclaration': - return this.getDependencies(ast.declarations, dependencies, isNotSafe); - case 'ArrayExpression': - dependencies.push({ - origin: 'declaration', - isSafe: true, - }); - return dependencies; - case 'CallExpression': - dependencies.push({ - origin: 'function', - isSafe: true, - }); - return dependencies; - case 'MemberExpression': - const details = this.getMemberExpressionDetails(ast); - switch (details.signature) { - case 'value[]': - this.getDependencies(ast.object, dependencies, isNotSafe); - break; - case 'value[][]': - this.getDependencies(ast.object.object, dependencies, isNotSafe); - break; - case 'value[][][]': - this.getDependencies(ast.object.object.object, dependencies, isNotSafe); - break; - case 'this.output.value': - if (this.dynamicOutput) { - dependencies.push({ - name: details.name, - origin: 'output', - isSafe: false, - }); - } - break; - } - if (details) { - if (details.property) { - this.getDependencies(details.property, dependencies, isNotSafe); - } - if (details.xProperty) { - this.getDependencies(details.xProperty, dependencies, isNotSafe); - } - if (details.yProperty) { - this.getDependencies(details.yProperty, dependencies, isNotSafe); - } - if (details.zProperty) { - this.getDependencies(details.zProperty, dependencies, isNotSafe); - } - return dependencies; - } - case 'SequenceExpression': - return this.getDependencies(ast.expressions, dependencies, isNotSafe); - default: - throw this.astErrorOutput(`Unhandled type ${ ast.type } in getDependencies`, ast); - } - return dependencies; - } - - getVariableSignature(ast, returnRawValue) { - if (!this.isAstVariable(ast)) { - throw new Error(`ast of type "${ ast.type }" is not a variable signature`); - } - if (ast.type === 'Identifier') { - return 'value'; - } - const signature = []; - while (true) { - if (!ast) break; - if (ast.computed) { - signature.push('[]'); - } else if (ast.type === 'ThisExpression') { - signature.unshift('this'); - } else if (ast.property && ast.property.name) { - if ( - ast.property.name === 'x' || - ast.property.name === 'y' || - ast.property.name === 'z' - ) { - signature.unshift(returnRawValue ? '.' + ast.property.name : '.value'); - } else if ( - ast.property.name === 'constants' || - ast.property.name === 'thread' || - ast.property.name === 'output' - ) { - signature.unshift('.' + ast.property.name); - } else { - signature.unshift(returnRawValue ? '.' + ast.property.name : '.value'); - } - } else if (ast.name) { - signature.unshift(returnRawValue ? ast.name : 'value'); - } else if (ast.callee && ast.callee.name) { - signature.unshift(returnRawValue ? ast.callee.name + '()' : 'fn()'); - } else if (ast.elements) { - signature.unshift('[]'); - } else { - signature.unshift('unknown'); - } - ast = ast.object; - } - - const signatureString = signature.join(''); - if (returnRawValue) { - return signatureString; - } - - const allowedExpressions = [ - 'value', - 'value[]', - 'value[][]', - 'value[][][]', - 'value[][][][]', - 'value.value', - 'value.thread.value', - 'this.thread.value', - 'this.output.value', - 'this.constants.value', - 'this.constants.value[]', - 'this.constants.value[][]', - 'this.constants.value[][][]', - 'this.constants.value[][][][]', - 'fn()[]', - 'fn()[][]', - 'fn()[][][]', - '[][]', - ]; - if (allowedExpressions.indexOf(signatureString) > -1) { - return signatureString; - } - return null; - } - - build() { - return this.toString().length > 0; - } - - astGeneric(ast, retArr) { - if (ast === null) { - throw this.astErrorOutput('NULL ast', ast); - } else { - if (Array.isArray(ast)) { - for (let i = 0; i < ast.length; i++) { - this.astGeneric(ast[i], retArr); - } - return retArr; - } - - switch (ast.type) { - case 'FunctionDeclaration': - return this.astFunctionDeclaration(ast, retArr); - case 'FunctionExpression': - return this.astFunctionExpression(ast, retArr); - case 'ReturnStatement': - return this.astReturnStatement(ast, retArr); - case 'Literal': - return this.astLiteral(ast, retArr); - case 'BinaryExpression': - return this.astBinaryExpression(ast, retArr); - case 'Identifier': - return this.astIdentifierExpression(ast, retArr); - case 'AssignmentExpression': - return this.astAssignmentExpression(ast, retArr); - case 'ExpressionStatement': - return this.astExpressionStatement(ast, retArr); - case 'EmptyStatement': - return this.astEmptyStatement(ast, retArr); - case 'BlockStatement': - return this.astBlockStatement(ast, retArr); - case 'IfStatement': - return this.astIfStatement(ast, retArr); - case 'SwitchStatement': - return this.astSwitchStatement(ast, retArr); - case 'BreakStatement': - return this.astBreakStatement(ast, retArr); - case 'ContinueStatement': - return this.astContinueStatement(ast, retArr); - case 'ForStatement': - return this.astForStatement(ast, retArr); - case 'WhileStatement': - return this.astWhileStatement(ast, retArr); - case 'DoWhileStatement': - return this.astDoWhileStatement(ast, retArr); - case 'VariableDeclaration': - return this.astVariableDeclaration(ast, retArr); - case 'VariableDeclarator': - return this.astVariableDeclarator(ast, retArr); - case 'ThisExpression': - return this.astThisExpression(ast, retArr); - case 'SequenceExpression': - return this.astSequenceExpression(ast, retArr); - case 'UnaryExpression': - return this.astUnaryExpression(ast, retArr); - case 'UpdateExpression': - return this.astUpdateExpression(ast, retArr); - case 'LogicalExpression': - return this.astLogicalExpression(ast, retArr); - case 'MemberExpression': - return this.astMemberExpression(ast, retArr); - case 'CallExpression': - return this.astCallExpression(ast, retArr); - case 'ArrayExpression': - return this.astArrayExpression(ast, retArr); - case 'DebuggerStatement': - return this.astDebuggerStatement(ast, retArr); - case 'ConditionalExpression': - return this.astConditionalExpression(ast, retArr); - } - - throw this.astErrorOutput('Unknown ast type : ' + ast.type, ast); - } - } - astErrorOutput(error, ast) { - if (typeof this.source !== 'string') { - return new Error(error); - } - - const debugString = utils.getAstString(this.source, ast); - const leadingSource = this.source.substr(ast.start); - const splitLines = leadingSource.split(/\n/); - const lineBefore = splitLines.length > 0 ? splitLines[splitLines.length - 1] : 0; - return new Error(`${error} on line ${ splitLines.length }, position ${ lineBefore.length }:\n ${ debugString }`); - } - - astDebuggerStatement(arrNode, retArr) { - return retArr; - } - - astConditionalExpression(ast, retArr) { - if (ast.type !== 'ConditionalExpression') { - throw this.astErrorOutput('Not a conditional expression', ast); - } - retArr.push('('); - this.astGeneric(ast.test, retArr); - retArr.push('?'); - this.astGeneric(ast.consequent, retArr); - retArr.push(':'); - this.astGeneric(ast.alternate, retArr); - retArr.push(')'); - return retArr; - } - - astFunction(ast, retArr) { - throw new Error(`"astFunction" not defined on ${ this.constructor.name }`); - } - - astFunctionDeclaration(ast, retArr) { - if (this.isChildFunction(ast)) { - return retArr; - } - return this.astFunction(ast, retArr); - } - astFunctionExpression(ast, retArr) { - if (this.isChildFunction(ast)) { - return retArr; - } - return this.astFunction(ast, retArr); - } - isChildFunction(ast) { - for (let i = 0; i < this.functions.length; i++) { - if (this.functions[i] === ast) { - return true; - } - } - return false; - } - astReturnStatement(ast, retArr) { - return retArr; - } - astLiteral(ast, retArr) { - this.literalTypes[this.astKey(ast)] = 'Number'; - return retArr; - } - astBinaryExpression(ast, retArr) { - return retArr; - } - astIdentifierExpression(ast, retArr) { - return retArr; - } - astAssignmentExpression(ast, retArr) { - return retArr; - } - astExpressionStatement(esNode, retArr) { - this.astGeneric(esNode.expression, retArr); - retArr.push(';'); - return retArr; - } - astEmptyStatement(eNode, retArr) { - return retArr; - } - astBlockStatement(ast, retArr) { - return retArr; - } - astIfStatement(ast, retArr) { - return retArr; - } - astSwitchStatement(ast, retArr) { - return retArr; - } - astBreakStatement(brNode, retArr) { - retArr.push('break;'); - return retArr; - } - astContinueStatement(crNode, retArr) { - retArr.push('continue;\n'); - return retArr; - } - astForStatement(ast, retArr) { - return retArr; - } - astWhileStatement(ast, retArr) { - return retArr; - } - astDoWhileStatement(ast, retArr) { - return retArr; - } - astVariableDeclarator(iVarDecNode, retArr) { - this.astGeneric(iVarDecNode.id, retArr); - if (iVarDecNode.init !== null) { - retArr.push('='); - this.astGeneric(iVarDecNode.init, retArr); - } - return retArr; - } - astThisExpression(ast, retArr) { - return retArr; - } - astSequenceExpression(sNode, retArr) { - const { expressions } = sNode; - const sequenceResult = []; - for (let i = 0; i < expressions.length; i++) { - const expression = expressions[i]; - const expressionResult = []; - this.astGeneric(expression, expressionResult); - sequenceResult.push(expressionResult.join('')); - } - if (sequenceResult.length > 1) { - retArr.push('(', sequenceResult.join(','), ')'); - } else { - retArr.push(sequenceResult[0]); - } - return retArr; - } - astUnaryExpression(uNode, retArr) { - const unaryResult = this.checkAndUpconvertBitwiseUnary(uNode, retArr); - if (unaryResult) { - return retArr; - } - - if (uNode.prefix) { - retArr.push(uNode.operator); - this.astGeneric(uNode.argument, retArr); - } else { - this.astGeneric(uNode.argument, retArr); - retArr.push(uNode.operator); - } - - return retArr; - } - - checkAndUpconvertBitwiseUnary(uNode, retArr) {} - - astUpdateExpression(uNode, retArr) { - if (uNode.prefix) { - retArr.push(uNode.operator); - this.astGeneric(uNode.argument, retArr); - } else { - this.astGeneric(uNode.argument, retArr); - retArr.push(uNode.operator); - } - - return retArr; - } - astLogicalExpression(logNode, retArr) { - retArr.push('('); - this.astGeneric(logNode.left, retArr); - retArr.push(logNode.operator); - this.astGeneric(logNode.right, retArr); - retArr.push(')'); - return retArr; - } - astMemberExpression(ast, retArr) { - return retArr; - } - astCallExpression(ast, retArr) { - return retArr; - } - astArrayExpression(ast, retArr) { - return retArr; - } - - getMemberExpressionDetails(ast) { - if (ast.type !== 'MemberExpression') { - throw this.astErrorOutput(`Expression ${ ast.type } not a MemberExpression`, ast); - } - let name = null; - let type = null; - const variableSignature = this.getVariableSignature(ast); - switch (variableSignature) { - case 'value': - return null; - case 'value.thread.value': - case 'this.thread.value': - case 'this.output.value': - return { - signature: variableSignature, - type: 'Integer', - name: ast.property.name - }; - case 'value[]': - if (typeof ast.object.name !== 'string') { - throw this.astErrorOutput('Unexpected expression', ast); - } - name = ast.object.name; - return { - name, - origin: 'user', - signature: variableSignature, - type: this.getVariableType(ast.object), - xProperty: ast.property - }; - case 'value[][]': - if (typeof ast.object.object.name !== 'string') { - throw this.astErrorOutput('Unexpected expression', ast); - } - name = ast.object.object.name; - return { - name, - origin: 'user', - signature: variableSignature, - type: this.getVariableType(ast.object.object), - yProperty: ast.object.property, - xProperty: ast.property, - }; - case 'value[][][]': - if (typeof ast.object.object.object.name !== 'string') { - throw this.astErrorOutput('Unexpected expression', ast); - } - name = ast.object.object.object.name; - return { - name, - origin: 'user', - signature: variableSignature, - type: this.getVariableType(ast.object.object.object), - zProperty: ast.object.object.property, - yProperty: ast.object.property, - xProperty: ast.property, - }; - case 'value[][][][]': - if (typeof ast.object.object.object.object.name !== 'string') { - throw this.astErrorOutput('Unexpected expression', ast); - } - name = ast.object.object.object.object.name; - return { - name, - origin: 'user', - signature: variableSignature, - type: this.getVariableType(ast.object.object.object.object), - zProperty: ast.object.object.property, - yProperty: ast.object.property, - xProperty: ast.property, - }; - case 'value.value': - if (typeof ast.property.name !== 'string') { - throw this.astErrorOutput('Unexpected expression', ast); - } - if (this.isAstMathVariable(ast)) { - name = ast.property.name; - return { - name, - origin: 'Math', - type: 'Number', - signature: variableSignature, - }; - } - switch (ast.property.name) { - case 'r': - case 'g': - case 'b': - case 'a': - name = ast.object.name; - return { - name, - property: ast.property.name, - origin: 'user', - signature: variableSignature, - type: 'Number' - }; - default: - throw this.astErrorOutput('Unexpected expression', ast); - } - case 'this.constants.value': - if (typeof ast.property.name !== 'string') { - throw this.astErrorOutput('Unexpected expression', ast); - } - name = ast.property.name; - type = this.getConstantType(name); - if (!type) { - throw this.astErrorOutput('Constant has no type', ast); - } - return { - name, - type, - origin: 'constants', - signature: variableSignature, - }; - case 'this.constants.value[]': - if (typeof ast.object.property.name !== 'string') { - throw this.astErrorOutput('Unexpected expression', ast); - } - name = ast.object.property.name; - type = this.getConstantType(name); - if (!type) { - throw this.astErrorOutput('Constant has no type', ast); - } - return { - name, - type, - origin: 'constants', - signature: variableSignature, - xProperty: ast.property, - }; - case 'this.constants.value[][]': { - if (typeof ast.object.object.property.name !== 'string') { - throw this.astErrorOutput('Unexpected expression', ast); - } - name = ast.object.object.property.name; - type = this.getConstantType(name); - if (!type) { - throw this.astErrorOutput('Constant has no type', ast); - } - return { - name, - type, - origin: 'constants', - signature: variableSignature, - yProperty: ast.object.property, - xProperty: ast.property, - }; - } - case 'this.constants.value[][][]': { - if (typeof ast.object.object.object.property.name !== 'string') { - throw this.astErrorOutput('Unexpected expression', ast); - } - name = ast.object.object.object.property.name; - type = this.getConstantType(name); - if (!type) { - throw this.astErrorOutput('Constant has no type', ast); - } - return { - name, - type, - origin: 'constants', - signature: variableSignature, - zProperty: ast.object.object.property, - yProperty: ast.object.property, - xProperty: ast.property, - }; - } - case 'fn()[]': - case 'fn()[][]': - case '[][]': - return { - signature: variableSignature, - property: ast.property, - }; - default: - throw this.astErrorOutput('Unexpected expression', ast); - } - } - - findIdentifierOrigin(astToFind) { - const stack = [this.ast]; - - while (stack.length > 0) { - const atNode = stack[0]; - if (atNode.type === 'VariableDeclarator' && atNode.id && atNode.id.name && atNode.id.name === astToFind.name) { - return atNode; - } - stack.shift(); - if (atNode.argument) { - stack.push(atNode.argument); - } else if (atNode.body) { - stack.push(atNode.body); - } else if (atNode.declarations) { - stack.push(atNode.declarations); - } else if (Array.isArray(atNode)) { - for (let i = 0; i < atNode.length; i++) { - stack.push(atNode[i]); - } - } - } - return null; - } - - findLastReturn(ast) { - const stack = [ast || this.ast]; - - while (stack.length > 0) { - const atNode = stack.pop(); - if (atNode.type === 'ReturnStatement') { - return atNode; - } - if (atNode.type === 'FunctionDeclaration') { - continue; - } - if (atNode.argument) { - stack.push(atNode.argument); - } else if (atNode.body) { - stack.push(atNode.body); - } else if (atNode.declarations) { - stack.push(atNode.declarations); - } else if (Array.isArray(atNode)) { - for (let i = 0; i < atNode.length; i++) { - stack.push(atNode[i]); - } - } else if (atNode.consequent) { - stack.push(atNode.consequent); - } else if (atNode.cases) { - stack.push(atNode.cases); - } - } - return null; - } - - getInternalVariableName(name) { - if (!this._internalVariableNames.hasOwnProperty(name)) { - this._internalVariableNames[name] = 0; - } - this._internalVariableNames[name]++; - if (this._internalVariableNames[name] === 1) { - return name; - } - return name + this._internalVariableNames[name]; - } - - astKey(ast, separator = ',') { - if (!ast.start || !ast.end) throw new Error('AST start and end needed'); - return `${ast.start}${separator}${ast.end}`; - } -} - -const typeLookupMap = { - 'Number': 'Number', - 'Float': 'Float', - 'Integer': 'Integer', - 'Array': 'Number', - 'Array(2)': 'Number', - 'Array(3)': 'Number', - 'Array(4)': 'Number', - 'Matrix(2)': 'Number', - 'Matrix(3)': 'Number', - 'Matrix(4)': 'Number', - 'Array2D': 'Number', - 'Array3D': 'Number', - 'Input': 'Number', - 'HTMLCanvas': 'Array(4)', - 'OffscreenCanvas': 'Array(4)', - 'HTMLImage': 'Array(4)', - 'ImageBitmap': 'Array(4)', - 'ImageData': 'Array(4)', - 'HTMLVideo': 'Array(4)', - 'HTMLImageArray': 'Array(4)', - 'NumberTexture': 'Number', - 'MemoryOptimizedNumberTexture': 'Number', - 'Array1D(2)': 'Array(2)', - 'Array1D(3)': 'Array(3)', - 'Array1D(4)': 'Array(4)', - 'Array2D(2)': 'Array(2)', - 'Array2D(3)': 'Array(3)', - 'Array2D(4)': 'Array(4)', - 'Array3D(2)': 'Array(2)', - 'Array3D(3)': 'Array(3)', - 'Array3D(4)': 'Array(4)', - 'ArrayTexture(1)': 'Number', - 'ArrayTexture(2)': 'Array(2)', - 'ArrayTexture(3)': 'Array(3)', - 'ArrayTexture(4)': 'Array(4)', -}; - -module.exports = { - FunctionNode -}; -},{"../utils":113,"./function-tracer":10,"acorn":1}],10:[function(require,module,exports){ -const { utils } = require('../utils'); - -function last(array) { - return array.length > 0 ? array[array.length - 1] : null; -} - -const states = { - trackIdentifiers: 'trackIdentifiers', - memberExpression: 'memberExpression', - inForLoopInit: 'inForLoopInit' -}; - -class FunctionTracer { - constructor(ast) { - this.runningContexts = []; - this.functionContexts = []; - this.contexts = []; - this.functionCalls = []; - this.declarations = []; - this.identifiers = []; - this.functions = []; - this.returnStatements = []; - this.trackedIdentifiers = null; - this.states = []; - this.newFunctionContext(); - this.scan(ast); - } - - isState(state) { - return this.states[this.states.length - 1] === state; - } - - hasState(state) { - return this.states.indexOf(state) > -1; - } - - pushState(state) { - this.states.push(state); - } - - popState(state) { - if (this.isState(state)) { - this.states.pop(); - } else { - throw new Error(`Cannot pop the non-active state "${state}"`); - } - } - - get currentFunctionContext() { - return last(this.functionContexts); - } - - get currentContext() { - return last(this.runningContexts); - } - - newFunctionContext() { - const newContext = { '@contextType': 'function' }; - this.contexts.push(newContext); - this.functionContexts.push(newContext); - } - - newContext(run) { - const newContext = Object.assign({ '@contextType': 'const/let' }, this.currentContext); - this.contexts.push(newContext); - this.runningContexts.push(newContext); - run(); - const { currentFunctionContext } = this; - for (const p in currentFunctionContext) { - if (!currentFunctionContext.hasOwnProperty(p) || newContext.hasOwnProperty(p)) continue; - newContext[p] = currentFunctionContext[p]; - } - this.runningContexts.pop(); - return newContext; - } - - useFunctionContext(run) { - const functionContext = last(this.functionContexts); - this.runningContexts.push(functionContext); - run(); - this.runningContexts.pop(); - } - - getIdentifiers(run) { - const trackedIdentifiers = this.trackedIdentifiers = []; - this.pushState(states.trackIdentifiers); - run(); - this.trackedIdentifiers = null; - this.popState(states.trackIdentifiers); - return trackedIdentifiers; - } - - getDeclaration(name) { - const { currentContext, currentFunctionContext, runningContexts } = this; - const declaration = currentContext[name] || currentFunctionContext[name] || null; - - if ( - !declaration && - currentContext === currentFunctionContext && - runningContexts.length > 0 - ) { - const previousRunningContext = runningContexts[runningContexts.length - 2]; - if (previousRunningContext[name]) { - return previousRunningContext[name]; - } - } - - return declaration; - } - - scan(ast) { - if (!ast) return; - if (Array.isArray(ast)) { - for (let i = 0; i < ast.length; i++) { - this.scan(ast[i]); - } - return; - } - switch (ast.type) { - case 'Program': - this.useFunctionContext(() => { - this.scan(ast.body); - }); - break; - case 'BlockStatement': - this.newContext(() => { - this.scan(ast.body); - }); - break; - case 'AssignmentExpression': - case 'LogicalExpression': - this.scan(ast.left); - this.scan(ast.right); - break; - case 'BinaryExpression': - this.scan(ast.left); - this.scan(ast.right); - break; - case 'UpdateExpression': - if (ast.operator === '++') { - const declaration = this.getDeclaration(ast.argument.name); - if (declaration) { - declaration.suggestedType = 'Integer'; - } - } - this.scan(ast.argument); - break; - case 'UnaryExpression': - this.scan(ast.argument); - break; - case 'VariableDeclaration': - if (ast.kind === 'var') { - this.useFunctionContext(() => { - ast.declarations = utils.normalizeDeclarations(ast); - this.scan(ast.declarations); - }); - } else { - ast.declarations = utils.normalizeDeclarations(ast); - this.scan(ast.declarations); - } - break; - case 'VariableDeclarator': { - const { currentContext } = this; - const inForLoopInit = this.hasState(states.inForLoopInit); - const declaration = { - ast: ast, - context: currentContext, - name: ast.id.name, - origin: 'declaration', - inForLoopInit, - inForLoopTest: null, - assignable: currentContext === this.currentFunctionContext || (!inForLoopInit && !currentContext.hasOwnProperty(ast.id.name)), - suggestedType: null, - valueType: null, - dependencies: null, - isSafe: null, - }; - if (!currentContext[ast.id.name]) { - currentContext[ast.id.name] = declaration; - } - this.declarations.push(declaration); - this.scan(ast.id); - this.scan(ast.init); - break; - } - case 'FunctionExpression': - case 'FunctionDeclaration': - if (this.runningContexts.length === 0) { - this.scan(ast.body); - } else { - this.functions.push(ast); - } - break; - case 'IfStatement': - this.scan(ast.test); - this.scan(ast.consequent); - if (ast.alternate) this.scan(ast.alternate); - break; - case 'ForStatement': { - let testIdentifiers; - const context = this.newContext(() => { - this.pushState(states.inForLoopInit); - this.scan(ast.init); - this.popState(states.inForLoopInit); - - testIdentifiers = this.getIdentifiers(() => { - this.scan(ast.test); - }); - - this.scan(ast.update); - this.newContext(() => { - this.scan(ast.body); - }); - }); - - if (testIdentifiers) { - for (const p in context) { - if (p === '@contextType') continue; - if (testIdentifiers.indexOf(p) > -1) { - context[p].inForLoopTest = true; - } - } - } - break; - } - case 'DoWhileStatement': - case 'WhileStatement': - this.newContext(() => { - this.scan(ast.body); - this.scan(ast.test); - }); - break; - case 'Identifier': { - if (this.isState(states.trackIdentifiers)) { - this.trackedIdentifiers.push(ast.name); - } - this.identifiers.push({ - context: this.currentContext, - declaration: this.getDeclaration(ast.name), - ast, - }); - break; - } - case 'ReturnStatement': - this.returnStatements.push(ast); - this.scan(ast.argument); - break; - case 'MemberExpression': - this.pushState(states.memberExpression); - this.scan(ast.object); - this.scan(ast.property); - this.popState(states.memberExpression); - break; - case 'ExpressionStatement': - this.scan(ast.expression); - break; - case 'SequenceExpression': - this.scan(ast.expressions); - break; - case 'CallExpression': - this.functionCalls.push({ - context: this.currentContext, - ast, - }); - this.scan(ast.arguments); - break; - case 'ArrayExpression': - this.scan(ast.elements); - break; - case 'ConditionalExpression': - this.scan(ast.test); - this.scan(ast.alternate); - this.scan(ast.consequent); - break; - case 'SwitchStatement': - this.scan(ast.discriminant); - this.scan(ast.cases); - break; - case 'SwitchCase': - this.scan(ast.test); - this.scan(ast.consequent); - break; - - case 'ThisExpression': - case 'Literal': - case 'DebuggerStatement': - case 'EmptyStatement': - case 'BreakStatement': - case 'ContinueStatement': - break; - default: - throw new Error(`unhandled type "${ast.type}"`); - } - } -} - -module.exports = { - FunctionTracer, -}; -},{"../utils":113}],11:[function(require,module,exports){ -const { glWiretap } = require('gl-wiretap'); -const { utils } = require('../../utils'); - -function toStringWithoutUtils(fn) { - return fn.toString() - .replace('=>', '') - .replace(/^function /, '') - .replace(/utils[.]/g, '/*utils.*/'); -} - -function glKernelString(Kernel, args, originKernel, setupContextString, destroyContextString) { - if (!originKernel.built) { - originKernel.build.apply(originKernel, args); - } - args = args ? Array.from(args).map(arg => { - switch (typeof arg) { - case 'boolean': - return new Boolean(arg); - case 'number': - return new Number(arg); - default: - return arg; - } - }) : null; - const uploadedValues = []; - const postResult = []; - const context = glWiretap(originKernel.context, { - useTrackablePrimitives: true, - onReadPixels: (targetName) => { - if (kernel.subKernels) { - if (!subKernelsResultVariableSetup) { - postResult.push(` const result = { result: ${getRenderString(targetName, kernel)} };`); - subKernelsResultVariableSetup = true; - } else { - const property = kernel.subKernels[subKernelsResultIndex++].property; - postResult.push(` result${isNaN(property) ? '.' + property : `[${property}]`} = ${getRenderString(targetName, kernel)};`); - } - if (subKernelsResultIndex === kernel.subKernels.length) { - postResult.push(' return result;'); - } - return; - } - if (targetName) { - postResult.push(` return ${getRenderString(targetName, kernel)};`); - } else { - postResult.push(` return null;`); - } - }, - onUnrecognizedArgumentLookup: (argument) => { - const argumentName = findKernelValue(argument, kernel.kernelArguments, [], context, uploadedValues); - if (argumentName) { - return argumentName; - } - const constantName = findKernelValue(argument, kernel.kernelConstants, constants ? Object.keys(constants).map(key => constants[key]) : [], context, uploadedValues); - if (constantName) { - return constantName; - } - return null; - } - }); - let subKernelsResultVariableSetup = false; - let subKernelsResultIndex = 0; - const { - source, - canvas, - output, - pipeline, - graphical, - loopMaxIterations, - constants, - optimizeFloatMemory, - precision, - fixIntegerDivisionAccuracy, - functions, - nativeFunctions, - subKernels, - immutable, - argumentTypes, - constantTypes, - kernelArguments, - kernelConstants, - tactic, - } = originKernel; - const kernel = new Kernel(source, { - canvas, - context, - checkContext: false, - output, - pipeline, - graphical, - loopMaxIterations, - constants, - optimizeFloatMemory, - precision, - fixIntegerDivisionAccuracy, - functions, - nativeFunctions, - subKernels, - immutable, - argumentTypes, - constantTypes, - tactic, - }); - let result = []; - context.setIndent(2); - kernel.build.apply(kernel, args); - result.push(context.toString()); - context.reset(); - - kernel.kernelArguments.forEach((kernelArgument, i) => { - switch (kernelArgument.type) { - case 'Integer': - case 'Boolean': - case 'Number': - case 'Float': - case 'Array': - case 'Array(2)': - case 'Array(3)': - case 'Array(4)': - case 'HTMLCanvas': - case 'HTMLImage': - case 'HTMLVideo': - context.insertVariable(`uploadValue_${kernelArgument.name}`, kernelArgument.uploadValue); - break; - case 'HTMLImageArray': - for (let imageIndex = 0; imageIndex < args[i].length; imageIndex++) { - const arg = args[i]; - context.insertVariable(`uploadValue_${kernelArgument.name}[${imageIndex}]`, arg[imageIndex]); - } - break; - case 'Input': - context.insertVariable(`uploadValue_${kernelArgument.name}`, kernelArgument.uploadValue); - break; - case 'MemoryOptimizedNumberTexture': - case 'NumberTexture': - case 'Array1D(2)': - case 'Array1D(3)': - case 'Array1D(4)': - case 'Array2D(2)': - case 'Array2D(3)': - case 'Array2D(4)': - case 'Array3D(2)': - case 'Array3D(3)': - case 'Array3D(4)': - case 'ArrayTexture(1)': - case 'ArrayTexture(2)': - case 'ArrayTexture(3)': - case 'ArrayTexture(4)': - context.insertVariable(`uploadValue_${kernelArgument.name}`, args[i].texture); - break; - default: - throw new Error(`unhandled kernelArgumentType insertion for glWiretap of type ${kernelArgument.type}`); - } - }); - result.push('/** start of injected functions **/'); - result.push(`function ${toStringWithoutUtils(utils.flattenTo)}`); - result.push(`function ${toStringWithoutUtils(utils.flatten2dArrayTo)}`); - result.push(`function ${toStringWithoutUtils(utils.flatten3dArrayTo)}`); - result.push(`function ${toStringWithoutUtils(utils.flatten4dArrayTo)}`); - result.push(`function ${toStringWithoutUtils(utils.isArray)}`); - if (kernel.renderOutput !== kernel.renderTexture && kernel.formatValues) { - result.push( - ` const renderOutput = function ${toStringWithoutUtils(kernel.formatValues)};` - ); - } - result.push('/** end of injected functions **/'); - result.push(` const innerKernel = function (${kernel.kernelArguments.map(kernelArgument => kernelArgument.varName).join(', ')}) {`); - context.setIndent(4); - kernel.run.apply(kernel, args); - if (kernel.renderKernels) { - kernel.renderKernels(); - } else if (kernel.renderOutput) { - kernel.renderOutput(); - } - result.push(' /** start setup uploads for kernel values **/'); - kernel.kernelArguments.forEach(kernelArgument => { - result.push(' ' + kernelArgument.getStringValueHandler().split('\n').join('\n ')); - }); - result.push(' /** end setup uploads for kernel values **/'); - result.push(context.toString()); - if (kernel.renderOutput === kernel.renderTexture) { - context.reset(); - const framebufferName = context.getContextVariableName(kernel.framebuffer); - if (kernel.renderKernels) { - const results = kernel.renderKernels(); - const textureName = context.getContextVariableName(kernel.texture.texture); - result.push(` return { - result: { - texture: ${ textureName }, - type: '${ results.result.type }', - toArray: ${ getToArrayString(results.result, textureName, framebufferName) } - },`); - const { subKernels, mappedTextures } = kernel; - for (let i = 0; i < subKernels.length; i++) { - const texture = mappedTextures[i]; - const subKernel = subKernels[i]; - const subKernelResult = results[subKernel.property]; - const subKernelTextureName = context.getContextVariableName(texture.texture); - result.push(` - ${subKernel.property}: { - texture: ${ subKernelTextureName }, - type: '${ subKernelResult.type }', - toArray: ${ getToArrayString(subKernelResult, subKernelTextureName, framebufferName) } - },`); - } - result.push(` };`); - } else { - const rendered = kernel.renderOutput(); - const textureName = context.getContextVariableName(kernel.texture.texture); - result.push(` return { - texture: ${ textureName }, - type: '${ rendered.type }', - toArray: ${ getToArrayString(rendered, textureName, framebufferName) } - };`); - } - } - result.push(` ${destroyContextString ? '\n' + destroyContextString + ' ': ''}`); - result.push(postResult.join('\n')); - result.push(' };'); - if (kernel.graphical) { - result.push(getGetPixelsString(kernel)); - result.push(` innerKernel.getPixels = getPixels;`); - } - result.push(' return innerKernel;'); - - let constantsUpload = []; - kernelConstants.forEach((kernelConstant) => { - constantsUpload.push(`${kernelConstant.getStringValueHandler()}`); - }); - return `function kernel(settings) { - const { context, constants } = settings; - ${constantsUpload.join('')} - ${setupContextString ? setupContextString : ''} -${result.join('\n')} -}`; -} - -function getRenderString(targetName, kernel) { - const readBackValue = kernel.precision === 'single' ? targetName : `new Float32Array(${targetName}.buffer)`; - if (kernel.output[2]) { - return `renderOutput(${readBackValue}, ${kernel.output[0]}, ${kernel.output[1]}, ${kernel.output[2]})`; - } - if (kernel.output[1]) { - return `renderOutput(${readBackValue}, ${kernel.output[0]}, ${kernel.output[1]})`; - } - - return `renderOutput(${readBackValue}, ${kernel.output[0]})`; -} - -function getGetPixelsString(kernel) { - const getPixels = kernel.getPixels.toString(); - const useFunctionKeyword = !/^function/.test(getPixels); - return utils.flattenFunctionToString(`${useFunctionKeyword ? 'function ' : ''}${ getPixels }`, { - findDependency: (object, name) => { - if (object === 'utils') { - return `const ${name} = ${utils[name].toString()};`; - } - return null; - }, - thisLookup: (property) => { - if (property === 'context') { - return null; - } - if (kernel.hasOwnProperty(property)) { - return JSON.stringify(kernel[property]); - } - throw new Error(`unhandled thisLookup ${ property }`); - } - }); -} - -function getToArrayString(kernelResult, textureName, framebufferName) { - const toArray = kernelResult.toArray.toString(); - const useFunctionKeyword = !/^function/.test(toArray); - const flattenedFunctions = utils.flattenFunctionToString(`${useFunctionKeyword ? 'function ' : ''}${ toArray }`, { - findDependency: (object, name) => { - if (object === 'utils') { - return `const ${name} = ${utils[name].toString()};`; - } else if (object === 'this') { - if (name === 'framebuffer') { - return ''; - } - return `${useFunctionKeyword ? 'function ' : ''}${kernelResult[name].toString()}`; - } else { - throw new Error('unhandled fromObject'); - } - }, - thisLookup: (property, isDeclaration) => { - if (property === 'texture') { - return textureName; - } - if (property === 'context') { - if (isDeclaration) return null; - return 'gl'; - } - if (kernelResult.hasOwnProperty(property)) { - return JSON.stringify(kernelResult[property]); - } - throw new Error(`unhandled thisLookup ${ property }`); - } - }); - return `() => { - function framebuffer() { return ${framebufferName}; }; - ${flattenedFunctions} - return toArray(); - }`; -} - -function findKernelValue(argument, kernelValues, values, context, uploadedValues) { - if (argument === null) return null; - if (kernelValues === null) return null; - switch (typeof argument) { - case 'boolean': - case 'number': - return null; - } - if ( - typeof HTMLImageElement !== 'undefined' && - argument instanceof HTMLImageElement - ) { - for (let i = 0; i < kernelValues.length; i++) { - const kernelValue = kernelValues[i]; - if (kernelValue.type !== 'HTMLImageArray' && kernelValue) continue; - if (kernelValue.uploadValue !== argument) continue; - const variableIndex = values[i].indexOf(argument); - if (variableIndex === -1) continue; - const variableName = `uploadValue_${kernelValue.name}[${variableIndex}]`; - context.insertVariable(variableName, argument); - return variableName; - } - } - - for (let i = 0; i < kernelValues.length; i++) { - const kernelValue = kernelValues[i]; - if (argument !== kernelValue.uploadValue) continue; - const variable = `uploadValue_${kernelValue.name}`; - context.insertVariable(variable, kernelValue); - return variable; - } - return null; -} - -module.exports = { - glKernelString -}; -},{"../../utils":113,"gl-wiretap":2}],12:[function(require,module,exports){ -const { Kernel } = require('../kernel'); -const { utils } = require('../../utils'); -const { GLTextureArray2Float } = require('./texture/array-2-float'); -const { GLTextureArray2Float2D } = require('./texture/array-2-float-2d'); -const { GLTextureArray2Float3D } = require('./texture/array-2-float-3d'); -const { GLTextureArray3Float } = require('./texture/array-3-float'); -const { GLTextureArray3Float2D } = require('./texture/array-3-float-2d'); -const { GLTextureArray3Float3D } = require('./texture/array-3-float-3d'); -const { GLTextureArray4Float } = require('./texture/array-4-float'); -const { GLTextureArray4Float2D } = require('./texture/array-4-float-2d'); -const { GLTextureArray4Float3D } = require('./texture/array-4-float-3d'); -const { GLTextureFloat } = require('./texture/float'); -const { GLTextureFloat2D } = require('./texture/float-2d'); -const { GLTextureFloat3D } = require('./texture/float-3d'); -const { GLTextureMemoryOptimized } = require('./texture/memory-optimized'); -const { GLTextureMemoryOptimized2D } = require('./texture/memory-optimized-2d'); -const { GLTextureMemoryOptimized3D } = require('./texture/memory-optimized-3d'); -const { GLTextureUnsigned } = require('./texture/unsigned'); -const { GLTextureUnsigned2D } = require('./texture/unsigned-2d'); -const { GLTextureUnsigned3D } = require('./texture/unsigned-3d'); -const { GLTextureGraphical } = require('./texture/graphical'); - -class GLKernel extends Kernel { - static get mode() { - return 'gpu'; - } - - static getIsFloatRead() { - const kernelString = `function kernelFunction() { - return 1; - }`; - const kernel = new this(kernelString, { - context: this.testContext, - canvas: this.testCanvas, - validate: false, - output: [1], - precision: 'single', - returnType: 'Number', - tactic: 'speed', - }); - kernel.build(); - kernel.run(); - const result = kernel.renderOutput(); - kernel.destroy(true); - return result[0] === 1; - } - - static getIsIntegerDivisionAccurate() { - function kernelFunction(v1, v2) { - return v1[this.thread.x] / v2[this.thread.x]; - } - const kernel = new this(kernelFunction.toString(), { - context: this.testContext, - canvas: this.testCanvas, - validate: false, - output: [2], - returnType: 'Number', - precision: 'unsigned', - tactic: 'speed', - }); - const args = [ - [6, 6030401], - [3, 3991] - ]; - kernel.build.apply(kernel, args); - kernel.run.apply(kernel, args); - const result = kernel.renderOutput(); - kernel.destroy(true); - return result[0] === 2 && result[1] === 1511; - } - - static getIsSpeedTacticSupported() { - function kernelFunction(value) { - return value[this.thread.x]; - } - const kernel = new this(kernelFunction.toString(), { - context: this.testContext, - canvas: this.testCanvas, - validate: false, - output: [4], - returnType: 'Number', - precision: 'unsigned', - tactic: 'speed', - }); - const args = [ - [0, 1, 2, 3] - ]; - kernel.build.apply(kernel, args); - kernel.run.apply(kernel, args); - const result = kernel.renderOutput(); - kernel.destroy(true); - return Math.round(result[0]) === 0 && Math.round(result[1]) === 1 && Math.round(result[2]) === 2 && Math.round(result[3]) === 3; - } - - static get testCanvas() { - throw new Error(`"testCanvas" not defined on ${ this.name }`); - } - - static get testContext() { - throw new Error(`"testContext" not defined on ${ this.name }`); - } - - static getFeatures() { - const gl = this.testContext; - const isDrawBuffers = this.getIsDrawBuffers(); - return Object.freeze({ - isFloatRead: this.getIsFloatRead(), - isIntegerDivisionAccurate: this.getIsIntegerDivisionAccurate(), - isSpeedTacticSupported: this.getIsSpeedTacticSupported(), - isTextureFloat: this.getIsTextureFloat(), - isDrawBuffers, - kernelMap: isDrawBuffers, - channelCount: this.getChannelCount(), - maxTextureSize: this.getMaxTextureSize(), - lowIntPrecision: gl.getShaderPrecisionFormat(gl.FRAGMENT_SHADER, gl.LOW_INT), - lowFloatPrecision: gl.getShaderPrecisionFormat(gl.FRAGMENT_SHADER, gl.LOW_FLOAT), - mediumIntPrecision: gl.getShaderPrecisionFormat(gl.FRAGMENT_SHADER, gl.MEDIUM_INT), - mediumFloatPrecision: gl.getShaderPrecisionFormat(gl.FRAGMENT_SHADER, gl.MEDIUM_FLOAT), - highIntPrecision: gl.getShaderPrecisionFormat(gl.FRAGMENT_SHADER, gl.HIGH_INT), - highFloatPrecision: gl.getShaderPrecisionFormat(gl.FRAGMENT_SHADER, gl.HIGH_FLOAT), - }); - } - - static setupFeatureChecks() { - throw new Error(`"setupFeatureChecks" not defined on ${ this.name }`); - } - - static getSignature(kernel, argumentTypes) { - return kernel.getVariablePrecisionString() + (argumentTypes.length > 0 ? ':' + argumentTypes.join(',') : ''); - } - - setFixIntegerDivisionAccuracy(fix) { - this.fixIntegerDivisionAccuracy = fix; - return this; - } - - setPrecision(flag) { - this.precision = flag; - return this; - } - - setFloatTextures(flag) { - utils.warnDeprecated('method', 'setFloatTextures', 'setOptimizeFloatMemory'); - this.floatTextures = flag; - return this; - } - - static nativeFunctionArguments(source) { - const argumentTypes = []; - const argumentNames = []; - const states = []; - const isStartingVariableName = /^[a-zA-Z_]/; - const isVariableChar = /[a-zA-Z_0-9]/; - let i = 0; - let argumentName = null; - let argumentType = null; - while (i < source.length) { - const char = source[i]; - const nextChar = source[i + 1]; - const state = states.length > 0 ? states[states.length - 1] : null; - - if (state === 'FUNCTION_ARGUMENTS' && char === '/' && nextChar === '*') { - states.push('MULTI_LINE_COMMENT'); - i += 2; - continue; - } else if (state === 'MULTI_LINE_COMMENT' && char === '*' && nextChar === '/') { - states.pop(); - i += 2; - continue; - } - - else if (state === 'FUNCTION_ARGUMENTS' && char === '/' && nextChar === '/') { - states.push('COMMENT'); - i += 2; - continue; - } else if (state === 'COMMENT' && char === '\n') { - states.pop(); - i++; - continue; - } - - else if (state === null && char === '(') { - states.push('FUNCTION_ARGUMENTS'); - i++; - continue; - } else if (state === 'FUNCTION_ARGUMENTS') { - if (char === ')') { - states.pop(); - break; - } - if (char === 'f' && nextChar === 'l' && source[i + 2] === 'o' && source[i + 3] === 'a' && source[i + 4] === 't' && source[i + 5] === ' ') { - states.push('DECLARE_VARIABLE'); - argumentType = 'float'; - argumentName = ''; - i += 6; - continue; - } else if (char === 'i' && nextChar === 'n' && source[i + 2] === 't' && source[i + 3] === ' ') { - states.push('DECLARE_VARIABLE'); - argumentType = 'int'; - argumentName = ''; - i += 4; - continue; - } else if (char === 'v' && nextChar === 'e' && source[i + 2] === 'c' && source[i + 3] === '2' && source[i + 4] === ' ') { - states.push('DECLARE_VARIABLE'); - argumentType = 'vec2'; - argumentName = ''; - i += 5; - continue; - } else if (char === 'v' && nextChar === 'e' && source[i + 2] === 'c' && source[i + 3] === '3' && source[i + 4] === ' ') { - states.push('DECLARE_VARIABLE'); - argumentType = 'vec3'; - argumentName = ''; - i += 5; - continue; - } else if (char === 'v' && nextChar === 'e' && source[i + 2] === 'c' && source[i + 3] === '4' && source[i + 4] === ' ') { - states.push('DECLARE_VARIABLE'); - argumentType = 'vec4'; - argumentName = ''; - i += 5; - continue; - } - } - - else if (state === 'DECLARE_VARIABLE') { - if (argumentName === '') { - if (char === ' ') { - i++; - continue; - } - if (!isStartingVariableName.test(char)) { - throw new Error('variable name is not expected string'); - } - } - argumentName += char; - if (!isVariableChar.test(nextChar)) { - states.pop(); - argumentNames.push(argumentName); - argumentTypes.push(typeMap[argumentType]); - } - } - - i++; - } - if (states.length > 0) { - throw new Error('GLSL function was not parsable'); - } - return { - argumentNames, - argumentTypes, - }; - } - - static nativeFunctionReturnType(source) { - return typeMap[source.match(/int|float|vec[2-4]/)[0]]; - } - - static combineKernels(combinedKernel, lastKernel) { - combinedKernel.apply(null, arguments); - const { - texSize, - context, - threadDim - } = lastKernel.texSize; - let result; - if (lastKernel.precision === 'single') { - const w = texSize[0]; - const h = Math.ceil(texSize[1] / 4); - result = new Float32Array(w * h * 4 * 4); - context.readPixels(0, 0, w, h * 4, context.RGBA, context.FLOAT, result); - } else { - const bytes = new Uint8Array(texSize[0] * texSize[1] * 4); - context.readPixels(0, 0, texSize[0], texSize[1], context.RGBA, context.UNSIGNED_BYTE, bytes); - result = new Float32Array(bytes.buffer); - } - - result = result.subarray(0, threadDim[0] * threadDim[1] * threadDim[2]); - - if (lastKernel.output.length === 1) { - return result; - } else if (lastKernel.output.length === 2) { - return utils.splitArray(result, lastKernel.output[0]); - } else if (lastKernel.output.length === 3) { - const cube = utils.splitArray(result, lastKernel.output[0] * lastKernel.output[1]); - return cube.map(function(x) { - return utils.splitArray(x, lastKernel.output[0]); - }); - } - } - - constructor(source, settings) { - super(source, settings); - this.transferValues = null; - this.formatValues = null; - this.TextureConstructor = null; - this.renderOutput = null; - this.renderRawOutput = null; - this.texSize = null; - this.translatedSource = null; - this.compiledFragmentShader = null; - this.compiledVertexShader = null; - this.switchingKernels = null; - this._textureSwitched = null; - this._mappedTextureSwitched = null; - } - - checkTextureSize() { - const { features } = this.constructor; - if (this.texSize[0] > features.maxTextureSize || this.texSize[1] > features.maxTextureSize) { - throw new Error(`Texture size [${this.texSize[0]},${this.texSize[1]}] generated by kernel is larger than supported size [${features.maxTextureSize},${features.maxTextureSize}]`); - } - } - - translateSource() { - throw new Error(`"translateSource" not defined on ${this.constructor.name}`); - } - - pickRenderStrategy(args) { - if (this.graphical) { - this.renderRawOutput = this.readPackedPixelsToUint8Array; - this.transferValues = (pixels) => pixels; - this.TextureConstructor = GLTextureGraphical; - return null; - } - if (this.precision === 'unsigned') { - this.renderRawOutput = this.readPackedPixelsToUint8Array; - this.transferValues = this.readPackedPixelsToFloat32Array; - if (this.pipeline) { - this.renderOutput = this.renderTexture; - if (this.subKernels !== null) { - this.renderKernels = this.renderKernelsToTextures; - } - switch (this.returnType) { - case 'LiteralInteger': - case 'Float': - case 'Number': - case 'Integer': - if (this.output[2] > 0) { - this.TextureConstructor = GLTextureUnsigned3D; - return null; - } else if (this.output[1] > 0) { - this.TextureConstructor = GLTextureUnsigned2D; - return null; - } else { - this.TextureConstructor = GLTextureUnsigned; - return null; - } - case 'Array(2)': - case 'Array(3)': - case 'Array(4)': - return this.requestFallback(args); - } - } else { - if (this.subKernels !== null) { - this.renderKernels = this.renderKernelsToArrays; - } - switch (this.returnType) { - case 'LiteralInteger': - case 'Float': - case 'Number': - case 'Integer': - this.renderOutput = this.renderValues; - if (this.output[2] > 0) { - this.TextureConstructor = GLTextureUnsigned3D; - this.formatValues = utils.erect3DPackedFloat; - return null; - } else if (this.output[1] > 0) { - this.TextureConstructor = GLTextureUnsigned2D; - this.formatValues = utils.erect2DPackedFloat; - return null; - } else { - this.TextureConstructor = GLTextureUnsigned; - this.formatValues = utils.erectPackedFloat; - return null; - } - case 'Array(2)': - case 'Array(3)': - case 'Array(4)': - return this.requestFallback(args); - } - } - } else if (this.precision === 'single') { - this.renderRawOutput = this.readFloatPixelsToFloat32Array; - this.transferValues = this.readFloatPixelsToFloat32Array; - if (this.pipeline) { - this.renderOutput = this.renderTexture; - if (this.subKernels !== null) { - this.renderKernels = this.renderKernelsToTextures; - } - switch (this.returnType) { - case 'LiteralInteger': - case 'Float': - case 'Number': - case 'Integer': { - if (this.optimizeFloatMemory) { - if (this.output[2] > 0) { - this.TextureConstructor = GLTextureMemoryOptimized3D; - return null; - } else if (this.output[1] > 0) { - this.TextureConstructor = GLTextureMemoryOptimized2D; - return null; - } else { - this.TextureConstructor = GLTextureMemoryOptimized; - return null; - } - } else { - if (this.output[2] > 0) { - this.TextureConstructor = GLTextureFloat3D; - return null; - } else if (this.output[1] > 0) { - this.TextureConstructor = GLTextureFloat2D; - return null; - } else { - this.TextureConstructor = GLTextureFloat; - return null; - } - } - } - case 'Array(2)': { - if (this.output[2] > 0) { - this.TextureConstructor = GLTextureArray2Float3D; - return null; - } else if (this.output[1] > 0) { - this.TextureConstructor = GLTextureArray2Float2D; - return null; - } else { - this.TextureConstructor = GLTextureArray2Float; - return null; - } - } - case 'Array(3)': { - if (this.output[2] > 0) { - this.TextureConstructor = GLTextureArray3Float3D; - return null; - } else if (this.output[1] > 0) { - this.TextureConstructor = GLTextureArray3Float2D; - return null; - } else { - this.TextureConstructor = GLTextureArray3Float; - return null; - } - } - case 'Array(4)': { - if (this.output[2] > 0) { - this.TextureConstructor = GLTextureArray4Float3D; - return null; - } else if (this.output[1] > 0) { - this.TextureConstructor = GLTextureArray4Float2D; - return null; - } else { - this.TextureConstructor = GLTextureArray4Float; - return null; - } - } - } - } - this.renderOutput = this.renderValues; - if (this.subKernels !== null) { - this.renderKernels = this.renderKernelsToArrays; - } - if (this.optimizeFloatMemory) { - switch (this.returnType) { - case 'LiteralInteger': - case 'Float': - case 'Number': - case 'Integer': { - if (this.output[2] > 0) { - this.TextureConstructor = GLTextureMemoryOptimized3D; - this.formatValues = utils.erectMemoryOptimized3DFloat; - return null; - } else if (this.output[1] > 0) { - this.TextureConstructor = GLTextureMemoryOptimized2D; - this.formatValues = utils.erectMemoryOptimized2DFloat; - return null; - } else { - this.TextureConstructor = GLTextureMemoryOptimized; - this.formatValues = utils.erectMemoryOptimizedFloat; - return null; - } - } - case 'Array(2)': { - if (this.output[2] > 0) { - this.TextureConstructor = GLTextureArray2Float3D; - this.formatValues = utils.erect3DArray2; - return null; - } else if (this.output[1] > 0) { - this.TextureConstructor = GLTextureArray2Float2D; - this.formatValues = utils.erect2DArray2; - return null; - } else { - this.TextureConstructor = GLTextureArray2Float; - this.formatValues = utils.erectArray2; - return null; - } - } - case 'Array(3)': { - if (this.output[2] > 0) { - this.TextureConstructor = GLTextureArray3Float3D; - this.formatValues = utils.erect3DArray3; - return null; - } else if (this.output[1] > 0) { - this.TextureConstructor = GLTextureArray3Float2D; - this.formatValues = utils.erect2DArray3; - return null; - } else { - this.TextureConstructor = GLTextureArray3Float; - this.formatValues = utils.erectArray3; - return null; - } - } - case 'Array(4)': { - if (this.output[2] > 0) { - this.TextureConstructor = GLTextureArray4Float3D; - this.formatValues = utils.erect3DArray4; - return null; - } else if (this.output[1] > 0) { - this.TextureConstructor = GLTextureArray4Float2D; - this.formatValues = utils.erect2DArray4; - return null; - } else { - this.TextureConstructor = GLTextureArray4Float; - this.formatValues = utils.erectArray4; - return null; - } - } - } - } else { - switch (this.returnType) { - case 'LiteralInteger': - case 'Float': - case 'Number': - case 'Integer': { - if (this.output[2] > 0) { - this.TextureConstructor = GLTextureFloat3D; - this.formatValues = utils.erect3DFloat; - return null; - } else if (this.output[1] > 0) { - this.TextureConstructor = GLTextureFloat2D; - this.formatValues = utils.erect2DFloat; - return null; - } else { - this.TextureConstructor = GLTextureFloat; - this.formatValues = utils.erectFloat; - return null; - } - } - case 'Array(2)': { - if (this.output[2] > 0) { - this.TextureConstructor = GLTextureArray2Float3D; - this.formatValues = utils.erect3DArray2; - return null; - } else if (this.output[1] > 0) { - this.TextureConstructor = GLTextureArray2Float2D; - this.formatValues = utils.erect2DArray2; - return null; - } else { - this.TextureConstructor = GLTextureArray2Float; - this.formatValues = utils.erectArray2; - return null; - } - } - case 'Array(3)': { - if (this.output[2] > 0) { - this.TextureConstructor = GLTextureArray3Float3D; - this.formatValues = utils.erect3DArray3; - return null; - } else if (this.output[1] > 0) { - this.TextureConstructor = GLTextureArray3Float2D; - this.formatValues = utils.erect2DArray3; - return null; - } else { - this.TextureConstructor = GLTextureArray3Float; - this.formatValues = utils.erectArray3; - return null; - } - } - case 'Array(4)': { - if (this.output[2] > 0) { - this.TextureConstructor = GLTextureArray4Float3D; - this.formatValues = utils.erect3DArray4; - return null; - } else if (this.output[1] > 0) { - this.TextureConstructor = GLTextureArray4Float2D; - this.formatValues = utils.erect2DArray4; - return null; - } else { - this.TextureConstructor = GLTextureArray4Float; - this.formatValues = utils.erectArray4; - return null; - } - } - } - } - } else { - throw new Error(`unhandled precision of "${this.precision}"`); - } - - throw new Error(`unhandled return type "${this.returnType}"`); - } - - getKernelString() { - throw new Error(`abstract method call`); - } - - getMainResultTexture() { - switch (this.returnType) { - case 'LiteralInteger': - case 'Float': - case 'Integer': - case 'Number': - return this.getMainResultNumberTexture(); - case 'Array(2)': - return this.getMainResultArray2Texture(); - case 'Array(3)': - return this.getMainResultArray3Texture(); - case 'Array(4)': - return this.getMainResultArray4Texture(); - default: - throw new Error(`unhandled returnType type ${ this.returnType }`); - } - } - - getMainResultKernelNumberTexture() { - throw new Error(`abstract method call`); - } - getMainResultSubKernelNumberTexture() { - throw new Error(`abstract method call`); - } - getMainResultKernelArray2Texture() { - throw new Error(`abstract method call`); - } - getMainResultSubKernelArray2Texture() { - throw new Error(`abstract method call`); - } - getMainResultKernelArray3Texture() { - throw new Error(`abstract method call`); - } - getMainResultSubKernelArray3Texture() { - throw new Error(`abstract method call`); - } - getMainResultKernelArray4Texture() { - throw new Error(`abstract method call`); - } - getMainResultSubKernelArray4Texture() { - throw new Error(`abstract method call`); - } - getMainResultGraphical() { - throw new Error(`abstract method call`); - } - getMainResultMemoryOptimizedFloats() { - throw new Error(`abstract method call`); - } - getMainResultPackedPixels() { - throw new Error(`abstract method call`); - } - - getMainResultString() { - if (this.graphical) { - return this.getMainResultGraphical(); - } else if (this.precision === 'single') { - if (this.optimizeFloatMemory) { - return this.getMainResultMemoryOptimizedFloats(); - } - return this.getMainResultTexture(); - } else { - return this.getMainResultPackedPixels(); - } - } - - getMainResultNumberTexture() { - return utils.linesToString(this.getMainResultKernelNumberTexture()) + - utils.linesToString(this.getMainResultSubKernelNumberTexture()); - } - - getMainResultArray2Texture() { - return utils.linesToString(this.getMainResultKernelArray2Texture()) + - utils.linesToString(this.getMainResultSubKernelArray2Texture()); - } - - getMainResultArray3Texture() { - return utils.linesToString(this.getMainResultKernelArray3Texture()) + - utils.linesToString(this.getMainResultSubKernelArray3Texture()); - } - - getMainResultArray4Texture() { - return utils.linesToString(this.getMainResultKernelArray4Texture()) + - utils.linesToString(this.getMainResultSubKernelArray4Texture()); - } - - getFloatTacticDeclaration() { - const variablePrecision = this.getVariablePrecisionString(this.texSize, this.tactic); - return `precision ${variablePrecision} float;\n`; - } - - getIntTacticDeclaration() { - return `precision ${this.getVariablePrecisionString(this.texSize, this.tactic, true)} int;\n`; - } - - getSampler2DTacticDeclaration() { - return `precision ${this.getVariablePrecisionString(this.texSize, this.tactic)} sampler2D;\n`; - } - - getSampler2DArrayTacticDeclaration() { - return `precision ${this.getVariablePrecisionString(this.texSize, this.tactic)} sampler2DArray;\n`; - } - - renderTexture() { - return this.immutable ? this.texture.clone() : this.texture; - } - readPackedPixelsToUint8Array() { - if (this.precision !== 'unsigned') throw new Error('Requires this.precision to be "unsigned"'); - const { - texSize, - context: gl - } = this; - const result = new Uint8Array(texSize[0] * texSize[1] * 4); - gl.readPixels(0, 0, texSize[0], texSize[1], gl.RGBA, gl.UNSIGNED_BYTE, result); - return result; - } - - readPackedPixelsToFloat32Array() { - return new Float32Array(this.readPackedPixelsToUint8Array().buffer); - } - - readFloatPixelsToFloat32Array() { - if (this.precision !== 'single') throw new Error('Requires this.precision to be "single"'); - const { - texSize, - context: gl - } = this; - const w = texSize[0]; - const h = texSize[1]; - const result = new Float32Array(w * h * 4); - gl.readPixels(0, 0, w, h, gl.RGBA, gl.FLOAT, result); - return result; - } - - getPixels(flip) { - const { - context: gl, - output - } = this; - const [width, height] = output; - const pixels = new Uint8Array(width * height * 4); - gl.readPixels(0, 0, width, height, gl.RGBA, gl.UNSIGNED_BYTE, pixels); - return new Uint8ClampedArray((flip ? pixels : utils.flipPixels(pixels, width, height)).buffer); - } - - renderKernelsToArrays() { - const result = { - result: this.renderOutput(), - }; - for (let i = 0; i < this.subKernels.length; i++) { - result[this.subKernels[i].property] = this.mappedTextures[i].toArray(); - } - return result; - } - - renderKernelsToTextures() { - const result = { - result: this.renderOutput(), - }; - if (this.immutable) { - for (let i = 0; i < this.subKernels.length; i++) { - result[this.subKernels[i].property] = this.mappedTextures[i].clone(); - } - } else { - for (let i = 0; i < this.subKernels.length; i++) { - result[this.subKernels[i].property] = this.mappedTextures[i]; - } - } - return result; - } - - resetSwitchingKernels() { - const existingValue = this.switchingKernels; - this.switchingKernels = null; - return existingValue; - } - - setOutput(output) { - const newOutput = this.toKernelOutput(output); - if (this.program) { - if (!this.dynamicOutput) { - throw new Error('Resizing a kernel with dynamicOutput: false is not possible'); - } - const newThreadDim = [newOutput[0], newOutput[1] || 1, newOutput[2] || 1]; - const newTexSize = utils.getKernelTextureSize({ - optimizeFloatMemory: this.optimizeFloatMemory, - precision: this.precision, - }, newThreadDim); - const oldTexSize = this.texSize; - if (oldTexSize) { - const oldPrecision = this.getVariablePrecisionString(oldTexSize, this.tactic); - const newPrecision = this.getVariablePrecisionString(newTexSize, this.tactic); - if (oldPrecision !== newPrecision) { - if (this.debug) { - console.warn('Precision requirement changed, asking GPU instance to recompile'); - } - this.switchKernels({ - type: 'outputPrecisionMismatch', - precision: newPrecision, - needed: output - }); - return; - } - } - this.output = newOutput; - this.threadDim = newThreadDim; - this.texSize = newTexSize; - const { context: gl } = this; - gl.bindFramebuffer(gl.FRAMEBUFFER, this.framebuffer); - this.updateMaxTexSize(); - this.framebuffer.width = this.texSize[0]; - this.framebuffer.height = this.texSize[1]; - gl.viewport(0, 0, this.maxTexSize[0], this.maxTexSize[1]); - this.canvas.width = this.maxTexSize[0]; - this.canvas.height = this.maxTexSize[1]; - if (this.texture) { - this.texture.delete(); - } - this.texture = null; - this._setupOutputTexture(); - if (this.mappedTextures && this.mappedTextures.length > 0) { - for (let i = 0; i < this.mappedTextures.length; i++) { - this.mappedTextures[i].delete(); - } - this.mappedTextures = null; - this._setupSubOutputTextures(); - } - } else { - this.output = newOutput; - } - return this; - } - renderValues() { - return this.formatValues( - this.transferValues(), - this.output[0], - this.output[1], - this.output[2] - ); - } - switchKernels(reason) { - if (this.switchingKernels) { - this.switchingKernels.push(reason); - } else { - this.switchingKernels = [reason]; - } - } - getVariablePrecisionString(textureSize = this.texSize, tactic = this.tactic, isInt = false) { - if (!tactic) { - if (!this.constructor.features.isSpeedTacticSupported) return 'highp'; - const low = this.constructor.features[isInt ? 'lowIntPrecision' : 'lowFloatPrecision']; - const medium = this.constructor.features[isInt ? 'mediumIntPrecision' : 'mediumFloatPrecision']; - const high = this.constructor.features[isInt ? 'highIntPrecision' : 'highFloatPrecision']; - const requiredSize = Math.log2(textureSize[0] * textureSize[1]); - if (requiredSize <= low.rangeMax) { - return 'lowp'; - } else if (requiredSize <= medium.rangeMax) { - return 'mediump'; - } else if (requiredSize <= high.rangeMax) { - return 'highp'; - } else { - throw new Error(`The required size exceeds that of the ability of your system`); - } - } - switch (tactic) { - case 'speed': - return 'lowp'; - case 'balanced': - return 'mediump'; - case 'precision': - return 'highp'; - default: - throw new Error(`Unknown tactic "${tactic}" use "speed", "balanced", "precision", or empty for auto`); - } - } - - updateTextureArgumentRefs(kernelValue, arg) { - if (!this.immutable) return; - if (this.texture.texture === arg.texture) { - const { prevArg } = kernelValue; - if (prevArg) { - if (prevArg.texture._refs === 1) { - this.texture.delete(); - this.texture = prevArg.clone(); - this._textureSwitched = true; - } - prevArg.delete(); - } - kernelValue.prevArg = arg.clone(); - } else if (this.mappedTextures && this.mappedTextures.length > 0) { - const { mappedTextures } = this; - for (let i = 0; i < mappedTextures.length; i++) { - const mappedTexture = mappedTextures[i]; - if (mappedTexture.texture === arg.texture) { - const { prevArg } = kernelValue; - if (prevArg) { - if (prevArg.texture._refs === 1) { - mappedTexture.delete(); - mappedTextures[i] = prevArg.clone(); - this._mappedTextureSwitched[i] = true; - } - prevArg.delete(); - } - kernelValue.prevArg = arg.clone(); - return; - } - } - } - } - - onActivate(previousKernel) { - this._textureSwitched = true; - this.texture = previousKernel.texture; - if (this.mappedTextures) { - for (let i = 0; i < this.mappedTextures.length; i++) { - this._mappedTextureSwitched[i] = true; - } - this.mappedTextures = previousKernel.mappedTextures; - } - } - - initCanvas() {} -} - -const typeMap = { - int: 'Integer', - float: 'Number', - vec2: 'Array(2)', - vec3: 'Array(3)', - vec4: 'Array(4)', -}; - -module.exports = { - GLKernel -}; -},{"../../utils":113,"../kernel":35,"./texture/array-2-float":15,"./texture/array-2-float-2d":13,"./texture/array-2-float-3d":14,"./texture/array-3-float":18,"./texture/array-3-float-2d":16,"./texture/array-3-float-3d":17,"./texture/array-4-float":21,"./texture/array-4-float-2d":19,"./texture/array-4-float-3d":20,"./texture/float":24,"./texture/float-2d":22,"./texture/float-3d":23,"./texture/graphical":25,"./texture/memory-optimized":29,"./texture/memory-optimized-2d":27,"./texture/memory-optimized-3d":28,"./texture/unsigned":32,"./texture/unsigned-2d":30,"./texture/unsigned-3d":31}],13:[function(require,module,exports){ -const { utils } = require('../../../utils'); -const { GLTextureFloat } = require('./float'); - -class GLTextureArray2Float2D extends GLTextureFloat { - constructor(settings) { - super(settings); - this.type = 'ArrayTexture(2)'; - } - toArray() { - return utils.erect2DArray2(this.renderValues(), this.output[0], this.output[1]); - } -} - -module.exports = { - GLTextureArray2Float2D -}; -},{"../../../utils":113,"./float":24}],14:[function(require,module,exports){ -const { utils } = require('../../../utils'); -const { GLTextureFloat } = require('./float'); - -class GLTextureArray2Float3D extends GLTextureFloat { - constructor(settings) { - super(settings); - this.type = 'ArrayTexture(2)'; - } - toArray() { - return utils.erect3DArray2(this.renderValues(), this.output[0], this.output[1], this.output[2]); - } -} - -module.exports = { - GLTextureArray2Float3D -}; -},{"../../../utils":113,"./float":24}],15:[function(require,module,exports){ -const { utils } = require('../../../utils'); -const { GLTextureFloat } = require('./float'); - -class GLTextureArray2Float extends GLTextureFloat { - constructor(settings) { - super(settings); - this.type = 'ArrayTexture(2)'; - } - toArray() { - return utils.erectArray2(this.renderValues(), this.output[0], this.output[1]); - } -} - -module.exports = { - GLTextureArray2Float -}; -},{"../../../utils":113,"./float":24}],16:[function(require,module,exports){ -const { utils } = require('../../../utils'); -const { GLTextureFloat } = require('./float'); - -class GLTextureArray3Float2D extends GLTextureFloat { - constructor(settings) { - super(settings); - this.type = 'ArrayTexture(3)'; - } - toArray() { - return utils.erect2DArray3(this.renderValues(), this.output[0], this.output[1]); - } -} - -module.exports = { - GLTextureArray3Float2D -}; -},{"../../../utils":113,"./float":24}],17:[function(require,module,exports){ -const { utils } = require('../../../utils'); -const { GLTextureFloat } = require('./float'); - -class GLTextureArray3Float3D extends GLTextureFloat { - constructor(settings) { - super(settings); - this.type = 'ArrayTexture(3)'; - } - toArray() { - return utils.erect3DArray3(this.renderValues(), this.output[0], this.output[1], this.output[2]); - } -} - -module.exports = { - GLTextureArray3Float3D -}; -},{"../../../utils":113,"./float":24}],18:[function(require,module,exports){ -const { utils } = require('../../../utils'); -const { GLTextureFloat } = require('./float'); - -class GLTextureArray3Float extends GLTextureFloat { - constructor(settings) { - super(settings); - this.type = 'ArrayTexture(3)'; - } - toArray() { - return utils.erectArray3(this.renderValues(), this.output[0]); - } -} - -module.exports = { - GLTextureArray3Float -}; -},{"../../../utils":113,"./float":24}],19:[function(require,module,exports){ -const { utils } = require('../../../utils'); -const { GLTextureFloat } = require('./float'); - -class GLTextureArray4Float2D extends GLTextureFloat { - constructor(settings) { - super(settings); - this.type = 'ArrayTexture(4)'; - } - toArray() { - return utils.erect2DArray4(this.renderValues(), this.output[0], this.output[1]); - } -} - -module.exports = { - GLTextureArray4Float2D -}; -},{"../../../utils":113,"./float":24}],20:[function(require,module,exports){ -const { utils } = require('../../../utils'); -const { GLTextureFloat } = require('./float'); - -class GLTextureArray4Float3D extends GLTextureFloat { - constructor(settings) { - super(settings); - this.type = 'ArrayTexture(4)'; - } - toArray() { - return utils.erect3DArray4(this.renderValues(), this.output[0], this.output[1], this.output[2]); - } -} - -module.exports = { - GLTextureArray4Float3D -}; -},{"../../../utils":113,"./float":24}],21:[function(require,module,exports){ -const { utils } = require('../../../utils'); -const { GLTextureFloat } = require('./float'); - -class GLTextureArray4Float extends GLTextureFloat { - constructor(settings) { - super(settings); - this.type = 'ArrayTexture(4)'; - } - toArray() { - return utils.erectArray4(this.renderValues(), this.output[0]); - } -} - -module.exports = { - GLTextureArray4Float -}; -},{"../../../utils":113,"./float":24}],22:[function(require,module,exports){ -const { utils } = require('../../../utils'); -const { GLTextureFloat } = require('./float'); - -class GLTextureFloat2D extends GLTextureFloat { - constructor(settings) { - super(settings); - this.type = 'ArrayTexture(1)'; - } - toArray() { - return utils.erect2DFloat(this.renderValues(), this.output[0], this.output[1]); - } -} - -module.exports = { - GLTextureFloat2D -}; -},{"../../../utils":113,"./float":24}],23:[function(require,module,exports){ -const { utils } = require('../../../utils'); -const { GLTextureFloat } = require('./float'); - -class GLTextureFloat3D extends GLTextureFloat { - constructor(settings) { - super(settings); - this.type = 'ArrayTexture(1)'; - } - toArray() { - return utils.erect3DFloat(this.renderValues(), this.output[0], this.output[1], this.output[2]); - } -} - -module.exports = { - GLTextureFloat3D -}; -},{"../../../utils":113,"./float":24}],24:[function(require,module,exports){ -const { utils } = require('../../../utils'); -const { GLTexture } = require('./index'); - -class GLTextureFloat extends GLTexture { - get textureType() { - return this.context.FLOAT; - } - constructor(settings) { - super(settings); - this.type = 'ArrayTexture(1)'; - } - renderRawOutput() { - const gl = this.context; - const size = this.size; - gl.bindFramebuffer(gl.FRAMEBUFFER, this.framebuffer()); - gl.framebufferTexture2D( - gl.FRAMEBUFFER, - gl.COLOR_ATTACHMENT0, - gl.TEXTURE_2D, - this.texture, - 0 - ); - const result = new Float32Array(size[0] * size[1] * 4); - gl.readPixels(0, 0, size[0], size[1], gl.RGBA, gl.FLOAT, result); - return result; - } - renderValues() { - if (this._deleted) return null; - return this.renderRawOutput(); - } - toArray() { - return utils.erectFloat(this.renderValues(), this.output[0]); - } -} - -module.exports = { - GLTextureFloat -}; -},{"../../../utils":113,"./index":26}],25:[function(require,module,exports){ -const { GLTextureUnsigned } = require('./unsigned'); - -class GLTextureGraphical extends GLTextureUnsigned { - constructor(settings) { - super(settings); - this.type = 'ArrayTexture(4)'; - } - toArray() { - return this.renderValues(); - } -} - -module.exports = { - GLTextureGraphical -}; -},{"./unsigned":32}],26:[function(require,module,exports){ -const { Texture } = require('../../../texture'); - -class GLTexture extends Texture { - get textureType() { - throw new Error(`"textureType" not implemented on ${ this.name }`); - } - - clone() { - return new this.constructor(this); - } - - beforeMutate() { - if (this.texture._refs > 1) { - this.newTexture(); - return true; - } - return false; - } - - cloneTexture() { - this.texture._refs--; - const { context: gl, size, texture, kernel } = this; - if (kernel.debug) { - console.warn('cloning internal texture'); - } - gl.bindFramebuffer(gl.FRAMEBUFFER, this.framebuffer()); - selectTexture(gl, texture); - gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, texture, 0); - const target = gl.createTexture(); - selectTexture(gl, target); - gl.texImage2D(gl.TEXTURE_2D, 0, this.internalFormat, size[0], size[1], 0, this.textureFormat, this.textureType, null); - gl.copyTexSubImage2D(gl.TEXTURE_2D, 0, 0, 0, 0, 0, size[0], size[1]); - target._refs = 1; - this.texture = target; - } - - newTexture() { - this.texture._refs--; - const gl = this.context; - const size = this.size; - const kernel = this.kernel; - if (kernel.debug) { - console.warn('new internal texture'); - } - const target = gl.createTexture(); - selectTexture(gl, target); - gl.texImage2D(gl.TEXTURE_2D, 0, this.internalFormat, size[0], size[1], 0, this.textureFormat, this.textureType, null); - target._refs = 1; - this.texture = target; - } - - clear() { - if (this.texture._refs) { - this.texture._refs--; - const gl = this.context; - const target = this.texture = gl.createTexture(); - selectTexture(gl, target); - const size = this.size; - target._refs = 1; - gl.texImage2D(gl.TEXTURE_2D, 0, this.internalFormat, size[0], size[1], 0, this.textureFormat, this.textureType, null); - } - const { context: gl, texture } = this; - gl.bindFramebuffer(gl.FRAMEBUFFER, this.framebuffer()); - gl.bindTexture(gl.TEXTURE_2D, texture); - selectTexture(gl, texture); - gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, texture, 0); - gl.clearColor(0, 0, 0, 0); - gl.clear(gl.COLOR_BUFFER_BIT | gl.DEPTH_BUFFER_BIT); - } - - delete() { - if (this._deleted) return; - this._deleted = true; - if (this.texture._refs) { - this.texture._refs--; - if (this.texture._refs) return; - } - this.context.deleteTexture(this.texture); - } - - framebuffer() { - if (!this._framebuffer) { - this._framebuffer = this.kernel.getRawValueFramebuffer(this.size[0], this.size[1]); - } - return this._framebuffer; - } -} - -function selectTexture(gl, texture) { - gl.activeTexture(gl.TEXTURE15); - gl.bindTexture(gl.TEXTURE_2D, texture); - gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE); - gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE); - gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.NEAREST); - gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.NEAREST); -} - -module.exports = { GLTexture }; -},{"../../../texture":112}],27:[function(require,module,exports){ -const { utils } = require('../../../utils'); -const { GLTextureFloat } = require('./float'); - -class GLTextureMemoryOptimized2D extends GLTextureFloat { - constructor(settings) { - super(settings); - this.type = 'MemoryOptimizedNumberTexture'; - } - toArray() { - return utils.erectMemoryOptimized2DFloat(this.renderValues(), this.output[0], this.output[1]); - } -} - -module.exports = { - GLTextureMemoryOptimized2D -}; -},{"../../../utils":113,"./float":24}],28:[function(require,module,exports){ -const { utils } = require('../../../utils'); -const { GLTextureFloat } = require('./float'); - -class GLTextureMemoryOptimized3D extends GLTextureFloat { - constructor(settings) { - super(settings); - this.type = 'MemoryOptimizedNumberTexture'; - } - toArray() { - return utils.erectMemoryOptimized3DFloat(this.renderValues(), this.output[0], this.output[1], this.output[2]); - } -} - -module.exports = { - GLTextureMemoryOptimized3D -}; -},{"../../../utils":113,"./float":24}],29:[function(require,module,exports){ -const { utils } = require('../../../utils'); -const { GLTextureFloat } = require('./float'); - -class GLTextureMemoryOptimized extends GLTextureFloat { - constructor(settings) { - super(settings); - this.type = 'MemoryOptimizedNumberTexture'; - } - toArray() { - return utils.erectMemoryOptimizedFloat(this.renderValues(), this.output[0]); - } -} - -module.exports = { - GLTextureMemoryOptimized -}; -},{"../../../utils":113,"./float":24}],30:[function(require,module,exports){ -const { utils } = require('../../../utils'); -const { GLTextureUnsigned } = require('./unsigned'); - -class GLTextureUnsigned2D extends GLTextureUnsigned { - constructor(settings) { - super(settings); - this.type = 'NumberTexture'; - } - toArray() { - return utils.erect2DPackedFloat(this.renderValues(), this.output[0], this.output[1]); - } -} - -module.exports = { - GLTextureUnsigned2D -}; -},{"../../../utils":113,"./unsigned":32}],31:[function(require,module,exports){ -const { utils } = require('../../../utils'); -const { GLTextureUnsigned } = require('./unsigned'); - -class GLTextureUnsigned3D extends GLTextureUnsigned { - constructor(settings) { - super(settings); - this.type = 'NumberTexture'; - } - toArray() { - return utils.erect3DPackedFloat(this.renderValues(), this.output[0], this.output[1], this.output[2]); - } -} - -module.exports = { - GLTextureUnsigned3D -}; -},{"../../../utils":113,"./unsigned":32}],32:[function(require,module,exports){ -const { utils } = require('../../../utils'); -const { GLTexture } = require('./index'); - -class GLTextureUnsigned extends GLTexture { - get textureType() { - return this.context.UNSIGNED_BYTE; - } - constructor(settings) { - super(settings); - this.type = 'NumberTexture'; - } - renderRawOutput() { - const { context: gl } = this; - gl.bindFramebuffer(gl.FRAMEBUFFER, this.framebuffer()); - gl.framebufferTexture2D( - gl.FRAMEBUFFER, - gl.COLOR_ATTACHMENT0, - gl.TEXTURE_2D, - this.texture, - 0 - ); - const result = new Uint8Array(this.size[0] * this.size[1] * 4); - gl.readPixels(0, 0, this.size[0], this.size[1], gl.RGBA, gl.UNSIGNED_BYTE, result); - return result; - } - renderValues() { - if (this._deleted) return null; - return new Float32Array(this.renderRawOutput().buffer); - } - toArray() { - return utils.erectPackedFloat(this.renderValues(), this.output[0]); - } -} - -module.exports = { - GLTextureUnsigned -}; -},{"../../../utils":113,"./index":26}],33:[function(require,module,exports){ -const getContext = require('gl'); -const { WebGLKernel } = require('../web-gl/kernel'); -const { glKernelString } = require('../gl/kernel-string'); - -let isSupported = null; -let testCanvas = null; -let testContext = null; -let testExtensions = null; -let features = null; - -class HeadlessGLKernel extends WebGLKernel { - static get isSupported() { - if (isSupported !== null) return isSupported; - this.setupFeatureChecks(); - isSupported = testContext !== null; - return isSupported; - } - - static setupFeatureChecks() { - testCanvas = null; - testExtensions = null; - if (typeof getContext !== 'function') return; - try { - testContext = getContext(2, 2, { - preserveDrawingBuffer: true - }); - if (!testContext || !testContext.getExtension) return; - testExtensions = { - STACKGL_resize_drawingbuffer: testContext.getExtension('STACKGL_resize_drawingbuffer'), - STACKGL_destroy_context: testContext.getExtension('STACKGL_destroy_context'), - OES_texture_float: testContext.getExtension('OES_texture_float'), - OES_texture_float_linear: testContext.getExtension('OES_texture_float_linear'), - OES_element_index_uint: testContext.getExtension('OES_element_index_uint'), - WEBGL_draw_buffers: testContext.getExtension('WEBGL_draw_buffers'), - WEBGL_color_buffer_float: testContext.getExtension('WEBGL_color_buffer_float'), - }; - features = this.getFeatures(); - } catch (e) { - console.warn(e); - } - } - - static isContextMatch(context) { - try { - return context.getParameter(context.RENDERER) === 'ANGLE'; - } catch (e) { - return false; - } - } - - static getIsTextureFloat() { - return Boolean(testExtensions.OES_texture_float); - } - - static getIsDrawBuffers() { - return Boolean(testExtensions.WEBGL_draw_buffers); - } - - static getChannelCount() { - return testExtensions.WEBGL_draw_buffers ? - testContext.getParameter(testExtensions.WEBGL_draw_buffers.MAX_DRAW_BUFFERS_WEBGL) : - 1; - } - - static getMaxTextureSize() { - return testContext.getParameter(testContext.MAX_TEXTURE_SIZE); - } - - static get testCanvas() { - return testCanvas; - } - - static get testContext() { - return testContext; - } - - static get features() { - return features; - } - - initCanvas() { - return {}; - } - - initContext() { - return getContext(2, 2, { - preserveDrawingBuffer: true - }); - } - - initExtensions() { - this.extensions = { - STACKGL_resize_drawingbuffer: this.context.getExtension('STACKGL_resize_drawingbuffer'), - STACKGL_destroy_context: this.context.getExtension('STACKGL_destroy_context'), - OES_texture_float: this.context.getExtension('OES_texture_float'), - OES_texture_float_linear: this.context.getExtension('OES_texture_float_linear'), - OES_element_index_uint: this.context.getExtension('OES_element_index_uint'), - WEBGL_draw_buffers: this.context.getExtension('WEBGL_draw_buffers'), - }; - } - - build() { - super.build.apply(this, arguments); - if (!this.fallbackRequested) { - this.extensions.STACKGL_resize_drawingbuffer.resize(this.maxTexSize[0], this.maxTexSize[1]); - } - } - - destroyExtensions() { - this.extensions.STACKGL_resize_drawingbuffer = null; - this.extensions.STACKGL_destroy_context = null; - this.extensions.OES_texture_float = null; - this.extensions.OES_texture_float_linear = null; - this.extensions.OES_element_index_uint = null; - this.extensions.WEBGL_draw_buffers = null; - } - - static destroyContext(context) { - const extension = context.getExtension('STACKGL_destroy_context'); - if (extension && extension.destroy) { - extension.destroy(); - } - } - - toString() { - const setupContextString = `const gl = context || require('gl')(1, 1);\n`; - const destroyContextString = ` if (!context) { gl.getExtension('STACKGL_destroy_context').destroy(); }\n`; - return glKernelString(this.constructor, arguments, this, setupContextString, destroyContextString); - } - - setOutput(output) { - super.setOutput(output); - if (this.graphical && this.extensions.STACKGL_resize_drawingbuffer) { - this.extensions.STACKGL_resize_drawingbuffer.resize(this.maxTexSize[0], this.maxTexSize[1]); - } - return this; - } -} - -module.exports = { - HeadlessGLKernel -}; -},{"../gl/kernel-string":11,"../web-gl/kernel":69,"gl":1}],34:[function(require,module,exports){ -class KernelValue { - constructor(value, settings) { - const { - name, - kernel, - context, - checkContext, - onRequestContextHandle, - onUpdateValueMismatch, - origin, - strictIntegers, - type, - tactic, - } = settings; - if (!name) { - throw new Error('name not set'); - } - if (!type) { - throw new Error('type not set'); - } - if (!origin) { - throw new Error('origin not set'); - } - if (origin !== 'user' && origin !== 'constants') { - throw new Error(`origin must be "user" or "constants" value is "${ origin }"`); - } - if (!onRequestContextHandle) { - throw new Error('onRequestContextHandle is not set'); - } - this.name = name; - this.origin = origin; - this.tactic = tactic; - this.varName = origin === 'constants' ? `constants.${name}` : name; - this.kernel = kernel; - this.strictIntegers = strictIntegers; - this.type = value.type || type; - this.size = value.size || null; - this.index = null; - this.context = context; - this.checkContext = checkContext !== null && checkContext !== undefined ? checkContext : true; - this.contextHandle = null; - this.onRequestContextHandle = onRequestContextHandle; - this.onUpdateValueMismatch = onUpdateValueMismatch; - this.forceUploadEachRun = null; - } - - get id() { - return `${this.origin}_${name}`; - } - - getSource() { - throw new Error(`"getSource" not defined on ${ this.constructor.name }`); - } - - updateValue(value) { - throw new Error(`"updateValue" not defined on ${ this.constructor.name }`); - } -} - -module.exports = { - KernelValue -}; -},{}],35:[function(require,module,exports){ -const { utils } = require('../utils'); -const { Input } = require('../input'); - -class Kernel { - static get isSupported() { - throw new Error(`"isSupported" not implemented on ${ this.name }`); - } - - static isContextMatch(context) { - throw new Error(`"isContextMatch" not implemented on ${ this.name }`); - } - - static getFeatures() { - throw new Error(`"getFeatures" not implemented on ${ this.name }`); - } - - static destroyContext(context) { - throw new Error(`"destroyContext" called on ${ this.name }`); - } - - static nativeFunctionArguments() { - throw new Error(`"nativeFunctionArguments" called on ${ this.name }`); - } - - static nativeFunctionReturnType() { - throw new Error(`"nativeFunctionReturnType" called on ${ this.name }`); - } - - static combineKernels() { - throw new Error(`"combineKernels" called on ${ this.name }`); - } - - constructor(source, settings) { - if (typeof source !== 'object') { - if (typeof source !== 'string') { - throw new Error('source not a string'); - } - if (!utils.isFunctionString(source)) { - throw new Error('source not a function string'); - } - } - this.useLegacyEncoder = false; - this.fallbackRequested = false; - this.onRequestFallback = null; - - this.argumentNames = typeof source === 'string' ? utils.getArgumentNamesFromString(source) : null; - this.argumentTypes = null; - this.argumentSizes = null; - this.argumentBitRatios = null; - this.kernelArguments = null; - this.kernelConstants = null; - this.forceUploadKernelConstants = null; - - - this.source = source; - - this.output = null; - - this.debug = false; - - this.graphical = false; - - this.loopMaxIterations = 0; - - this.constants = null; - - this.constantTypes = null; - - this.constantBitRatios = null; - - this.dynamicArguments = false; - - this.dynamicOutput = false; - - this.canvas = null; - - this.context = null; - - this.checkContext = null; - - this.gpu = null; - - this.functions = null; - - this.nativeFunctions = null; - - this.injectedNative = null; - - this.subKernels = null; - - this.validate = true; - - this.immutable = false; - - this.pipeline = false; - - this.precision = null; - - this.tactic = null; - - this.plugins = null; - - this.returnType = null; - this.leadingReturnStatement = null; - this.followingReturnStatement = null; - this.optimizeFloatMemory = null; - this.strictIntegers = false; - this.fixIntegerDivisionAccuracy = null; - this.built = false; - this.signature = null; - } - - mergeSettings(settings) { - for (let p in settings) { - if (!settings.hasOwnProperty(p) || !this.hasOwnProperty(p)) continue; - switch (p) { - case 'output': - if (!Array.isArray(settings.output)) { - this.setOutput(settings.output); - continue; - } - break; - case 'functions': - this.functions = []; - for (let i = 0; i < settings.functions.length; i++) { - this.addFunction(settings.functions[i]); - } - continue; - case 'graphical': - if (settings[p] && !settings.hasOwnProperty('precision')) { - this.precision = 'unsigned'; - } - this[p] = settings[p]; - continue; - case 'nativeFunctions': - if (!settings.nativeFunctions) continue; - this.nativeFunctions = []; - for (let i = 0; i < settings.nativeFunctions.length; i++) { - const s = settings.nativeFunctions[i]; - const { name, source } = s; - this.addNativeFunction(name, source, s); - } - continue; - } - this[p] = settings[p]; - } - - if (!this.canvas) this.canvas = this.initCanvas(); - if (!this.context) this.context = this.initContext(); - if (!this.plugins) this.plugins = this.initPlugins(settings); - } - build() { - throw new Error(`"build" not defined on ${ this.constructor.name }`); - } - - run() { - throw new Error(`"run" not defined on ${ this.constructor.name }`) - } - - initCanvas() { - throw new Error(`"initCanvas" not defined on ${ this.constructor.name }`); - } - - initContext() { - throw new Error(`"initContext" not defined on ${ this.constructor.name }`); - } - - initPlugins(settings) { - throw new Error(`"initPlugins" not defined on ${ this.constructor.name }`); - } - - addFunction(source, settings = {}) { - if (source.name && source.source && source.argumentTypes && 'returnType' in source) { - this.functions.push(source); - } else if ('settings' in source && 'source' in source) { - this.functions.push(this.functionToIGPUFunction(source.source, source.settings)); - } else if (typeof source === 'string' || typeof source === 'function') { - this.functions.push(this.functionToIGPUFunction(source, settings)); - } else { - throw new Error(`function not properly defined`); - } - return this; - } - - addNativeFunction(name, source, settings = {}) { - const { argumentTypes, argumentNames } = settings.argumentTypes ? - splitArgumentTypes(settings.argumentTypes) : - this.constructor.nativeFunctionArguments(source) || {}; - this.nativeFunctions.push({ - name, - source, - settings, - argumentTypes, - argumentNames, - returnType: settings.returnType || this.constructor.nativeFunctionReturnType(source) - }); - return this; - } - - setupArguments(args) { - this.kernelArguments = []; - if (!this.argumentTypes) { - if (!this.argumentTypes) { - this.argumentTypes = []; - for (let i = 0; i < args.length; i++) { - const argType = utils.getVariableType(args[i], this.strictIntegers); - const type = argType === 'Integer' ? 'Number' : argType; - this.argumentTypes.push(type); - this.kernelArguments.push({ - type - }); - } - } - } else { - for (let i = 0; i < this.argumentTypes.length; i++) { - this.kernelArguments.push({ - type: this.argumentTypes[i] - }); - } - } - - this.argumentSizes = new Array(args.length); - this.argumentBitRatios = new Int32Array(args.length); - - for (let i = 0; i < args.length; i++) { - const arg = args[i]; - this.argumentSizes[i] = arg.constructor === Input ? arg.size : null; - this.argumentBitRatios[i] = this.getBitRatio(arg); - } - - if (this.argumentNames.length !== args.length) { - throw new Error(`arguments are miss-aligned`); - } - } - - setupConstants() { - this.kernelConstants = []; - let needsConstantTypes = this.constantTypes === null; - if (needsConstantTypes) { - this.constantTypes = {}; - } - this.constantBitRatios = {}; - if (this.constants) { - for (let name in this.constants) { - if (needsConstantTypes) { - const type = utils.getVariableType(this.constants[name], this.strictIntegers); - this.constantTypes[name] = type; - this.kernelConstants.push({ - name, - type - }); - } else { - this.kernelConstants.push({ - name, - type: this.constantTypes[name] - }); - } - this.constantBitRatios[name] = this.getBitRatio(this.constants[name]); - } - } - } - - setOptimizeFloatMemory(flag) { - this.optimizeFloatMemory = flag; - return this; - } - - toKernelOutput(output) { - if (output.hasOwnProperty('x')) { - if (output.hasOwnProperty('y')) { - if (output.hasOwnProperty('z')) { - return [output.x, output.y, output.z]; - } else { - return [output.x, output.y]; - } - } else { - return [output.x]; - } - } else { - return output; - } - } - - setOutput(output) { - this.output = this.toKernelOutput(output); - return this; - } - - setDebug(flag) { - this.debug = flag; - return this; - } - - setGraphical(flag) { - this.graphical = flag; - this.precision = 'unsigned'; - return this; - } - - setLoopMaxIterations(max) { - this.loopMaxIterations = max; - return this; - } - - setConstants(constants) { - this.constants = constants; - return this; - } - - setConstantTypes(constantTypes) { - this.constantTypes = constantTypes; - return this; - } - - setFunctions(functions) { - for (let i = 0; i < functions.length; i++) { - this.addFunction(functions[i]); - } - return this; - } - - setNativeFunctions(nativeFunctions) { - for (let i = 0; i < nativeFunctions.length; i++) { - const settings = nativeFunctions[i]; - const { name, source } = settings; - this.addNativeFunction(name, source, settings); - } - return this; - } - - setInjectedNative(injectedNative) { - this.injectedNative = injectedNative; - return this; - } - - setPipeline(flag) { - this.pipeline = flag; - return this; - } - - setPrecision(flag) { - this.precision = flag; - return this; - } - - setDimensions(flag) { - utils.warnDeprecated('method', 'setDimensions', 'setOutput'); - this.output = flag; - return this; - } - - setOutputToTexture(flag) { - utils.warnDeprecated('method', 'setOutputToTexture', 'setPipeline'); - this.pipeline = flag; - return this; - } - - setImmutable(flag) { - this.immutable = flag; - return this; - } - - setCanvas(canvas) { - this.canvas = canvas; - return this; - } - - setStrictIntegers(flag) { - this.strictIntegers = flag; - return this; - } - - setDynamicOutput(flag) { - this.dynamicOutput = flag; - return this; - } - - setHardcodeConstants(flag) { - utils.warnDeprecated('method', 'setHardcodeConstants'); - this.setDynamicOutput(flag); - this.setDynamicArguments(flag); - return this; - } - - setDynamicArguments(flag) { - this.dynamicArguments = flag; - return this; - } - - setUseLegacyEncoder(flag) { - this.useLegacyEncoder = flag; - return this; - } - - setWarnVarUsage(flag) { - utils.warnDeprecated('method', 'setWarnVarUsage'); - return this; - } - - getCanvas() { - utils.warnDeprecated('method', 'getCanvas'); - return this.canvas; - } - - getWebGl() { - utils.warnDeprecated('method', 'getWebGl'); - return this.context; - } - - setContext(context) { - this.context = context; - return this; - } - - setArgumentTypes(argumentTypes) { - if (Array.isArray(argumentTypes)) { - this.argumentTypes = argumentTypes; - } else { - this.argumentTypes = []; - for (const p in argumentTypes) { - if (!argumentTypes.hasOwnProperty(p)) continue; - const argumentIndex = this.argumentNames.indexOf(p); - if (argumentIndex === -1) throw new Error(`unable to find argument ${ p }`); - this.argumentTypes[argumentIndex] = argumentTypes[p]; - } - } - return this; - } - - setTactic(tactic) { - this.tactic = tactic; - return this; - } - - requestFallback(args) { - if (!this.onRequestFallback) { - throw new Error(`"onRequestFallback" not defined on ${ this.constructor.name }`); - } - this.fallbackRequested = true; - return this.onRequestFallback(args); - } - - validateSettings() { - throw new Error(`"validateSettings" not defined on ${ this.constructor.name }`); - } - - addSubKernel(subKernel) { - if (this.subKernels === null) { - this.subKernels = []; - } - if (!subKernel.source) throw new Error('subKernel missing "source" property'); - if (!subKernel.property && isNaN(subKernel.property)) throw new Error('subKernel missing "property" property'); - if (!subKernel.name) throw new Error('subKernel missing "name" property'); - this.subKernels.push(subKernel); - return this; - } - - destroy(removeCanvasReferences) { - throw new Error(`"destroy" called on ${ this.constructor.name }`); - } - - getBitRatio(value) { - if (this.precision === 'single') { - return 4; - } else if (Array.isArray(value[0])) { - return this.getBitRatio(value[0]); - } else if (value.constructor === Input) { - return this.getBitRatio(value.value); - } - switch (value.constructor) { - case Uint8ClampedArray: - case Uint8Array: - case Int8Array: - return 1; - case Uint16Array: - case Int16Array: - return 2; - case Float32Array: - case Int32Array: - default: - return 4; - } - } - - getPixels(flip) { - throw new Error(`"getPixels" called on ${ this.constructor.name }`); - } - - checkOutput() { - if (!this.output || !utils.isArray(this.output)) throw new Error('kernel.output not an array'); - if (this.output.length < 1) throw new Error('kernel.output is empty, needs at least 1 value'); - for (let i = 0; i < this.output.length; i++) { - if (isNaN(this.output[i]) || this.output[i] < 1) { - throw new Error(`${ this.constructor.name }.output[${ i }] incorrectly defined as \`${ this.output[i] }\`, needs to be numeric, and greater than 0`); - } - } - } - - prependString(value) { - throw new Error(`"prependString" called on ${ this.constructor.name }`); - } - - hasPrependString(value) { - throw new Error(`"hasPrependString" called on ${ this.constructor.name }`); - } - - toJSON() { - return { - settings: { - output: this.output, - pipeline: this.pipeline, - argumentNames: this.argumentNames, - argumentsTypes: this.argumentTypes, - constants: this.constants, - pluginNames: this.plugins ? this.plugins.map(plugin => plugin.name) : null, - returnType: this.returnType, - } - }; - } - - buildSignature(args) { - const Constructor = this.constructor; - this.signature = Constructor.getSignature(this, Constructor.getArgumentTypes(this, args)); - } - - static getArgumentTypes(kernel, args) { - const argumentTypes = new Array(args.length); - for (let i = 0; i < args.length; i++) { - const arg = args[i]; - const type = kernel.argumentTypes[i]; - if (arg.type) { - argumentTypes[i] = arg.type; - } else { - switch (type) { - case 'Number': - case 'Integer': - case 'Float': - case 'ArrayTexture(1)': - argumentTypes[i] = utils.getVariableType(arg); - break; - default: - argumentTypes[i] = type; - } - } - } - return argumentTypes; - } - - static getSignature(kernel, argumentTypes) { - throw new Error(`"getSignature" not implemented on ${ this.name }`); - } - - functionToIGPUFunction(source, settings = {}) { - if (typeof source !== 'string' && typeof source !== 'function') throw new Error('source not a string or function'); - const sourceString = typeof source === 'string' ? source : source.toString(); - let argumentTypes = []; - - if (Array.isArray(settings.argumentTypes)) { - argumentTypes = settings.argumentTypes; - } else if (typeof settings.argumentTypes === 'object') { - argumentTypes = utils.getArgumentNamesFromString(sourceString) - .map(name => settings.argumentTypes[name]) || []; - } else { - argumentTypes = settings.argumentTypes || []; - } - - return { - name: utils.getFunctionNameFromString(sourceString) || null, - source: sourceString, - argumentTypes, - returnType: settings.returnType || null, - }; - } - - onActivate(previousKernel) {} -} - -function splitArgumentTypes(argumentTypesObject) { - const argumentNames = Object.keys(argumentTypesObject); - const argumentTypes = []; - for (let i = 0; i < argumentNames.length; i++) { - const argumentName = argumentNames[i]; - argumentTypes.push(argumentTypesObject[argumentName]); - } - return { argumentTypes, argumentNames }; -} - -module.exports = { - Kernel -}; -},{"../input":109,"../utils":113}],36:[function(require,module,exports){ -const fragmentShader = `__HEADER__; -__FLOAT_TACTIC_DECLARATION__; -__INT_TACTIC_DECLARATION__; -__SAMPLER_2D_TACTIC_DECLARATION__; - -const int LOOP_MAX = __LOOP_MAX__; - -__PLUGINS__; -__CONSTANTS__; - -varying vec2 vTexCoord; - -float acosh(float x) { - return log(x + sqrt(x * x - 1.0)); -} - -float sinh(float x) { - return (pow(${Math.E}, x) - pow(${Math.E}, -x)) / 2.0; -} - -float asinh(float x) { - return log(x + sqrt(x * x + 1.0)); -} - -float atan2(float v1, float v2) { - if (v1 == 0.0 || v2 == 0.0) return 0.0; - return atan(v1 / v2); -} - -float atanh(float x) { - x = (x + 1.0) / (x - 1.0); - if (x < 0.0) { - return 0.5 * log(-x); - } - return 0.5 * log(x); -} - -float cbrt(float x) { - if (x >= 0.0) { - return pow(x, 1.0 / 3.0); - } else { - return -pow(x, 1.0 / 3.0); - } -} - -float cosh(float x) { - return (pow(${Math.E}, x) + pow(${Math.E}, -x)) / 2.0; -} - -float expm1(float x) { - return pow(${Math.E}, x) - 1.0; -} - -float fround(highp float x) { - return x; -} - -float imul(float v1, float v2) { - return float(int(v1) * int(v2)); -} - -float log10(float x) { - return log2(x) * (1.0 / log2(10.0)); -} - -float log1p(float x) { - return log(1.0 + x); -} - -float _pow(float v1, float v2) { - if (v2 == 0.0) return 1.0; - return pow(v1, v2); -} - -float tanh(float x) { - float e = exp(2.0 * x); - return (e - 1.0) / (e + 1.0); -} - -float trunc(float x) { - if (x >= 0.0) { - return floor(x); - } else { - return ceil(x); - } -} - -vec4 _round(vec4 x) { - return floor(x + 0.5); -} - -float _round(float x) { - return floor(x + 0.5); -} - -const int BIT_COUNT = 32; -int modi(int x, int y) { - return x - y * (x / y); -} - -int bitwiseOr(int a, int b) { - int result = 0; - int n = 1; - - for (int i = 0; i < BIT_COUNT; i++) { - if ((modi(a, 2) == 1) || (modi(b, 2) == 1)) { - result += n; - } - a = a / 2; - b = b / 2; - n = n * 2; - if(!(a > 0 || b > 0)) { - break; - } - } - return result; -} -int bitwiseXOR(int a, int b) { - int result = 0; - int n = 1; - - for (int i = 0; i < BIT_COUNT; i++) { - if ((modi(a, 2) == 1) != (modi(b, 2) == 1)) { - result += n; - } - a = a / 2; - b = b / 2; - n = n * 2; - if(!(a > 0 || b > 0)) { - break; - } - } - return result; -} -int bitwiseAnd(int a, int b) { - int result = 0; - int n = 1; - for (int i = 0; i < BIT_COUNT; i++) { - if ((modi(a, 2) == 1) && (modi(b, 2) == 1)) { - result += n; - } - a = a / 2; - b = b / 2; - n = n * 2; - if(!(a > 0 && b > 0)) { - break; - } - } - return result; -} -int bitwiseNot(int a) { - int result = 0; - int n = 1; - - for (int i = 0; i < BIT_COUNT; i++) { - if (modi(a, 2) == 0) { - result += n; - } - a = a / 2; - n = n * 2; - } - return result; -} -int bitwiseZeroFillLeftShift(int n, int shift) { - int maxBytes = BIT_COUNT; - for (int i = 0; i < BIT_COUNT; i++) { - if (maxBytes >= n) { - break; - } - maxBytes *= 2; - } - for (int i = 0; i < BIT_COUNT; i++) { - if (i >= shift) { - break; - } - n *= 2; - } - - int result = 0; - int byteVal = 1; - for (int i = 0; i < BIT_COUNT; i++) { - if (i >= maxBytes) break; - if (modi(n, 2) > 0) { result += byteVal; } - n = int(n / 2); - byteVal *= 2; - } - return result; -} - -int bitwiseSignedRightShift(int num, int shifts) { - return int(floor(float(num) / pow(2.0, float(shifts)))); -} - -int bitwiseZeroFillRightShift(int n, int shift) { - int maxBytes = BIT_COUNT; - for (int i = 0; i < BIT_COUNT; i++) { - if (maxBytes >= n) { - break; - } - maxBytes *= 2; - } - for (int i = 0; i < BIT_COUNT; i++) { - if (i >= shift) { - break; - } - n /= 2; - } - int result = 0; - int byteVal = 1; - for (int i = 0; i < BIT_COUNT; i++) { - if (i >= maxBytes) break; - if (modi(n, 2) > 0) { result += byteVal; } - n = int(n / 2); - byteVal *= 2; - } - return result; -} - -vec2 integerMod(vec2 x, float y) { - vec2 res = floor(mod(x, y)); - return res * step(1.0 - floor(y), -res); -} - -vec3 integerMod(vec3 x, float y) { - vec3 res = floor(mod(x, y)); - return res * step(1.0 - floor(y), -res); -} - -vec4 integerMod(vec4 x, vec4 y) { - vec4 res = floor(mod(x, y)); - return res * step(1.0 - floor(y), -res); -} - -float integerMod(float x, float y) { - float res = floor(mod(x, y)); - return res * (res > floor(y) - 1.0 ? 0.0 : 1.0); -} - -int integerMod(int x, int y) { - return x - (y * int(x / y)); -} - -__DIVIDE_WITH_INTEGER_CHECK__; - -// Here be dragons! -// DO NOT OPTIMIZE THIS CODE -// YOU WILL BREAK SOMETHING ON SOMEBODY\'S MACHINE -// LEAVE IT AS IT IS, LEST YOU WASTE YOUR OWN TIME -const vec2 MAGIC_VEC = vec2(1.0, -256.0); -const vec4 SCALE_FACTOR = vec4(1.0, 256.0, 65536.0, 0.0); -const vec4 SCALE_FACTOR_INV = vec4(1.0, 0.00390625, 0.0000152587890625, 0.0); // 1, 1/256, 1/65536 -float decode32(vec4 texel) { - __DECODE32_ENDIANNESS__; - texel *= 255.0; - vec2 gte128; - gte128.x = texel.b >= 128.0 ? 1.0 : 0.0; - gte128.y = texel.a >= 128.0 ? 1.0 : 0.0; - float exponent = 2.0 * texel.a - 127.0 + dot(gte128, MAGIC_VEC); - float res = exp2(_round(exponent)); - texel.b = texel.b - 128.0 * gte128.x; - res = dot(texel, SCALE_FACTOR) * exp2(_round(exponent-23.0)) + res; - res *= gte128.y * -2.0 + 1.0; - return res; -} - -float decode16(vec4 texel, int index) { - int channel = integerMod(index, 2); - if (channel == 0) return texel.r * 255.0 + texel.g * 65280.0; - if (channel == 1) return texel.b * 255.0 + texel.a * 65280.0; - return 0.0; -} - -float decode8(vec4 texel, int index) { - int channel = integerMod(index, 4); - if (channel == 0) return texel.r * 255.0; - if (channel == 1) return texel.g * 255.0; - if (channel == 2) return texel.b * 255.0; - if (channel == 3) return texel.a * 255.0; - return 0.0; -} - -vec4 legacyEncode32(float f) { - float F = abs(f); - float sign = f < 0.0 ? 1.0 : 0.0; - float exponent = floor(log2(F)); - float mantissa = (exp2(-exponent) * F); - // exponent += floor(log2(mantissa)); - vec4 texel = vec4(F * exp2(23.0-exponent)) * SCALE_FACTOR_INV; - texel.rg = integerMod(texel.rg, 256.0); - texel.b = integerMod(texel.b, 128.0); - texel.a = exponent*0.5 + 63.5; - texel.ba += vec2(integerMod(exponent+127.0, 2.0), sign) * 128.0; - texel = floor(texel); - texel *= 0.003921569; // 1/255 - __ENCODE32_ENDIANNESS__; - return texel; -} - -// https://github.com/gpujs/gpu.js/wiki/Encoder-details -vec4 encode32(float value) { - if (value == 0.0) return vec4(0, 0, 0, 0); - - float exponent; - float mantissa; - vec4 result; - float sgn; - - sgn = step(0.0, -value); - value = abs(value); - - exponent = floor(log2(value)); - - mantissa = value*pow(2.0, -exponent)-1.0; - exponent = exponent+127.0; - result = vec4(0,0,0,0); - - result.a = floor(exponent/2.0); - exponent = exponent - result.a*2.0; - result.a = result.a + 128.0*sgn; - - result.b = floor(mantissa * 128.0); - mantissa = mantissa - result.b / 128.0; - result.b = result.b + exponent*128.0; - - result.g = floor(mantissa*32768.0); - mantissa = mantissa - result.g/32768.0; - - result.r = floor(mantissa*8388608.0); - return result/255.0; -} -// Dragons end here - -int index; -ivec3 threadId; - -ivec3 indexTo3D(int idx, ivec3 texDim) { - int z = int(idx / (texDim.x * texDim.y)); - idx -= z * int(texDim.x * texDim.y); - int y = int(idx / texDim.x); - int x = int(integerMod(idx, texDim.x)); - return ivec3(x, y, z); -} - -float get32(sampler2D tex, ivec2 texSize, ivec3 texDim, int z, int y, int x) { - int index = x + texDim.x * (y + texDim.y * z); - int w = texSize.x; - vec2 st = vec2(float(integerMod(index, w)), float(index / w)) + 0.5; - vec4 texel = texture2D(tex, st / vec2(texSize)); - return decode32(texel); -} - -float get16(sampler2D tex, ivec2 texSize, ivec3 texDim, int z, int y, int x) { - int index = x + texDim.x * (y + texDim.y * z); - int w = texSize.x * 2; - vec2 st = vec2(float(integerMod(index, w)), float(index / w)) + 0.5; - vec4 texel = texture2D(tex, st / vec2(texSize.x * 2, texSize.y)); - return decode16(texel, index); -} - -float get8(sampler2D tex, ivec2 texSize, ivec3 texDim, int z, int y, int x) { - int index = x + texDim.x * (y + texDim.y * z); - int w = texSize.x * 4; - vec2 st = vec2(float(integerMod(index, w)), float(index / w)) + 0.5; - vec4 texel = texture2D(tex, st / vec2(texSize.x * 4, texSize.y)); - return decode8(texel, index); -} - -float getMemoryOptimized32(sampler2D tex, ivec2 texSize, ivec3 texDim, int z, int y, int x) { - int index = x + texDim.x * (y + texDim.y * z); - int channel = integerMod(index, 4); - index = index / 4; - int w = texSize.x; - vec2 st = vec2(float(integerMod(index, w)), float(index / w)) + 0.5; - vec4 texel = texture2D(tex, st / vec2(texSize)); - if (channel == 0) return texel.r; - if (channel == 1) return texel.g; - if (channel == 2) return texel.b; - if (channel == 3) return texel.a; - return 0.0; -} - -vec4 getImage2D(sampler2D tex, ivec2 texSize, ivec3 texDim, int z, int y, int x) { - int index = x + texDim.x * (y + texDim.y * z); - int w = texSize.x; - vec2 st = vec2(float(integerMod(index, w)), float(index / w)) + 0.5; - return texture2D(tex, st / vec2(texSize)); -} - -float getFloatFromSampler2D(sampler2D tex, ivec2 texSize, ivec3 texDim, int z, int y, int x) { - vec4 result = getImage2D(tex, texSize, texDim, z, y, x); - return result[0]; -} - -vec2 getVec2FromSampler2D(sampler2D tex, ivec2 texSize, ivec3 texDim, int z, int y, int x) { - vec4 result = getImage2D(tex, texSize, texDim, z, y, x); - return vec2(result[0], result[1]); -} - -vec2 getMemoryOptimizedVec2(sampler2D tex, ivec2 texSize, ivec3 texDim, int z, int y, int x) { - int index = x + (texDim.x * (y + (texDim.y * z))); - int channel = integerMod(index, 2); - index = index / 2; - int w = texSize.x; - vec2 st = vec2(float(integerMod(index, w)), float(index / w)) + 0.5; - vec4 texel = texture2D(tex, st / vec2(texSize)); - if (channel == 0) return vec2(texel.r, texel.g); - if (channel == 1) return vec2(texel.b, texel.a); - return vec2(0.0, 0.0); -} - -vec3 getVec3FromSampler2D(sampler2D tex, ivec2 texSize, ivec3 texDim, int z, int y, int x) { - vec4 result = getImage2D(tex, texSize, texDim, z, y, x); - return vec3(result[0], result[1], result[2]); -} - -vec3 getMemoryOptimizedVec3(sampler2D tex, ivec2 texSize, ivec3 texDim, int z, int y, int x) { - int fieldIndex = 3 * (x + texDim.x * (y + texDim.y * z)); - int vectorIndex = fieldIndex / 4; - int vectorOffset = fieldIndex - vectorIndex * 4; - int readY = vectorIndex / texSize.x; - int readX = vectorIndex - readY * texSize.x; - vec4 tex1 = texture2D(tex, (vec2(readX, readY) + 0.5) / vec2(texSize)); - - if (vectorOffset == 0) { - return tex1.xyz; - } else if (vectorOffset == 1) { - return tex1.yzw; - } else { - readX++; - if (readX >= texSize.x) { - readX = 0; - readY++; - } - vec4 tex2 = texture2D(tex, vec2(readX, readY) / vec2(texSize)); - if (vectorOffset == 2) { - return vec3(tex1.z, tex1.w, tex2.x); - } else { - return vec3(tex1.w, tex2.x, tex2.y); - } - } -} - -vec4 getVec4FromSampler2D(sampler2D tex, ivec2 texSize, ivec3 texDim, int z, int y, int x) { - return getImage2D(tex, texSize, texDim, z, y, x); -} - -vec4 getMemoryOptimizedVec4(sampler2D tex, ivec2 texSize, ivec3 texDim, int z, int y, int x) { - int index = x + texDim.x * (y + texDim.y * z); - int channel = integerMod(index, 2); - int w = texSize.x; - vec2 st = vec2(float(integerMod(index, w)), float(index / w)) + 0.5; - vec4 texel = texture2D(tex, st / vec2(texSize)); - return vec4(texel.r, texel.g, texel.b, texel.a); -} - -vec4 actualColor; -void color(float r, float g, float b, float a) { - actualColor = vec4(r,g,b,a); -} - -void color(float r, float g, float b) { - color(r,g,b,1.0); -} - -void color(sampler2D image) { - actualColor = texture2D(image, vTexCoord); -} - -float modulo(float number, float divisor) { - if (number < 0.0) { - number = abs(number); - if (divisor < 0.0) { - divisor = abs(divisor); - } - return -mod(number, divisor); - } - if (divisor < 0.0) { - divisor = abs(divisor); - } - return mod(number, divisor); -} - -__INJECTED_NATIVE__; -__MAIN_CONSTANTS__; -__MAIN_ARGUMENTS__; -__KERNEL__; - -void main(void) { - index = int(vTexCoord.s * float(uTexSize.x)) + int(vTexCoord.t * float(uTexSize.y)) * uTexSize.x; - __MAIN_RESULT__; -}`; - -module.exports = { - fragmentShader -}; -},{}],37:[function(require,module,exports){ -const { utils } = require('../../utils'); -const { FunctionNode } = require('../function-node'); - -class WebGLFunctionNode extends FunctionNode { - constructor(source, settings) { - super(source, settings); - if (settings && settings.hasOwnProperty('fixIntegerDivisionAccuracy')) { - this.fixIntegerDivisionAccuracy = settings.fixIntegerDivisionAccuracy; - } - } - - astConditionalExpression(ast, retArr) { - if (ast.type !== 'ConditionalExpression') { - throw this.astErrorOutput('Not a conditional expression', ast); - } - const consequentType = this.getType(ast.consequent); - const alternateType = this.getType(ast.alternate); - if (consequentType === null && alternateType === null) { - retArr.push('if ('); - this.astGeneric(ast.test, retArr); - retArr.push(') {'); - this.astGeneric(ast.consequent, retArr); - retArr.push(';'); - retArr.push('} else {'); - this.astGeneric(ast.alternate, retArr); - retArr.push(';'); - retArr.push('}'); - return retArr; - } - retArr.push('('); - this.astGeneric(ast.test, retArr); - retArr.push('?'); - this.astGeneric(ast.consequent, retArr); - retArr.push(':'); - this.astGeneric(ast.alternate, retArr); - retArr.push(')'); - return retArr; - } - - astFunction(ast, retArr) { - if (this.isRootKernel) { - retArr.push('void'); - } else { - if (!this.returnType) { - const lastReturn = this.findLastReturn(); - if (lastReturn) { - this.returnType = this.getType(ast.body); - if (this.returnType === 'LiteralInteger') { - this.returnType = 'Number'; - } - } - } - - const { returnType } = this; - if (!returnType) { - retArr.push('void'); - } else { - const type = typeMap[returnType]; - if (!type) { - throw new Error(`unknown type ${returnType}`); - } - retArr.push(type); - } - } - retArr.push(' '); - retArr.push(this.name); - retArr.push('('); - - if (!this.isRootKernel) { - for (let i = 0; i < this.argumentNames.length; ++i) { - const argumentName = this.argumentNames[i]; - - if (i > 0) { - retArr.push(', '); - } - let argumentType = this.argumentTypes[this.argumentNames.indexOf(argumentName)]; - if (!argumentType) { - throw this.astErrorOutput(`Unknown argument ${argumentName} type`, ast); - } - if (argumentType === 'LiteralInteger') { - this.argumentTypes[i] = argumentType = 'Number'; - } - const type = typeMap[argumentType]; - if (!type) { - throw this.astErrorOutput('Unexpected expression', ast); - } - const name = utils.sanitizeName(argumentName); - if (type === 'sampler2D' || type === 'sampler2DArray') { - retArr.push(`${type} user_${name},ivec2 user_${name}Size,ivec3 user_${name}Dim`); - } else { - retArr.push(`${type} user_${name}`); - } - } - } - - retArr.push(') {\n'); - - for (let i = 0; i < ast.body.body.length; ++i) { - this.astGeneric(ast.body.body[i], retArr); - retArr.push('\n'); - } - - retArr.push('}\n'); - return retArr; - } - - astReturnStatement(ast, retArr) { - if (!ast.argument) throw this.astErrorOutput('Unexpected return statement', ast); - this.pushState('skip-literal-correction'); - const type = this.getType(ast.argument); - this.popState('skip-literal-correction'); - - const result = []; - - if (!this.returnType) { - if (type === 'LiteralInteger' || type === 'Integer') { - this.returnType = 'Number'; - } else { - this.returnType = type; - } - } - - switch (this.returnType) { - case 'LiteralInteger': - case 'Number': - case 'Float': - switch (type) { - case 'Integer': - result.push('float('); - this.astGeneric(ast.argument, result); - result.push(')'); - break; - case 'LiteralInteger': - this.castLiteralToFloat(ast.argument, result); - - if (this.getType(ast) === 'Integer') { - result.unshift('float('); - result.push(')'); - } - break; - default: - this.astGeneric(ast.argument, result); - } - break; - case 'Integer': - switch (type) { - case 'Float': - case 'Number': - this.castValueToInteger(ast.argument, result); - break; - case 'LiteralInteger': - this.castLiteralToInteger(ast.argument, result); - break; - default: - this.astGeneric(ast.argument, result); - } - break; - case 'Array(4)': - case 'Array(3)': - case 'Array(2)': - case 'Matrix(2)': - case 'Matrix(3)': - case 'Matrix(4)': - case 'Input': - this.astGeneric(ast.argument, result); - break; - default: - throw this.astErrorOutput(`unhandled return type ${this.returnType}`, ast); - } - - if (this.isRootKernel) { - retArr.push(`kernelResult = ${ result.join('') };`); - retArr.push('return;'); - } else if (this.isSubKernel) { - retArr.push(`subKernelResult_${ this.name } = ${ result.join('') };`); - retArr.push(`return subKernelResult_${ this.name };`); - } else { - retArr.push(`return ${ result.join('') };`); - } - return retArr; - } - - astLiteral(ast, retArr) { - if (isNaN(ast.value)) { - throw this.astErrorOutput( - 'Non-numeric literal not supported : ' + ast.value, - ast - ); - } - - const key = this.astKey(ast); - if (Number.isInteger(ast.value)) { - if (this.isState('casting-to-integer') || this.isState('building-integer')) { - this.literalTypes[key] = 'Integer'; - retArr.push(`${ast.value}`); - } else if (this.isState('casting-to-float') || this.isState('building-float')) { - this.literalTypes[key] = 'Number'; - retArr.push(`${ast.value}.0`); - } else { - this.literalTypes[key] = 'Number'; - retArr.push(`${ast.value}.0`); - } - } else if (this.isState('casting-to-integer') || this.isState('building-integer')) { - this.literalTypes[key] = 'Integer'; - retArr.push(Math.round(ast.value)); - } else { - this.literalTypes[key] = 'Number'; - retArr.push(`${ast.value}`); - } - return retArr; - } - - astBinaryExpression(ast, retArr) { - if (this.checkAndUpconvertOperator(ast, retArr)) { - return retArr; - } - - if (this.fixIntegerDivisionAccuracy && ast.operator === '/') { - retArr.push('divWithIntCheck('); - this.pushState('building-float'); - switch (this.getType(ast.left)) { - case 'Integer': - this.castValueToFloat(ast.left, retArr); - break; - case 'LiteralInteger': - this.castLiteralToFloat(ast.left, retArr); - break; - default: - this.astGeneric(ast.left, retArr); - } - retArr.push(', '); - switch (this.getType(ast.right)) { - case 'Integer': - this.castValueToFloat(ast.right, retArr); - break; - case 'LiteralInteger': - this.castLiteralToFloat(ast.right, retArr); - break; - default: - this.astGeneric(ast.right, retArr); - } - this.popState('building-float'); - retArr.push(')'); - return retArr; - } - - retArr.push('('); - const leftType = this.getType(ast.left) || 'Number'; - const rightType = this.getType(ast.right) || 'Number'; - if (!leftType || !rightType) { - throw this.astErrorOutput(`Unhandled binary expression`, ast); - } - const key = leftType + ' & ' + rightType; - switch (key) { - case 'Integer & Integer': - this.pushState('building-integer'); - this.astGeneric(ast.left, retArr); - retArr.push(operatorMap[ast.operator] || ast.operator); - this.astGeneric(ast.right, retArr); - this.popState('building-integer'); - break; - case 'Number & Float': - case 'Float & Number': - case 'Float & Float': - case 'Number & Number': - this.pushState('building-float'); - this.astGeneric(ast.left, retArr); - retArr.push(operatorMap[ast.operator] || ast.operator); - this.astGeneric(ast.right, retArr); - this.popState('building-float'); - break; - case 'LiteralInteger & LiteralInteger': - if (this.isState('casting-to-integer') || this.isState('building-integer')) { - this.pushState('building-integer'); - this.astGeneric(ast.left, retArr); - retArr.push(operatorMap[ast.operator] || ast.operator); - this.astGeneric(ast.right, retArr); - this.popState('building-integer'); - } else { - this.pushState('building-float'); - this.castLiteralToFloat(ast.left, retArr); - retArr.push(operatorMap[ast.operator] || ast.operator); - this.castLiteralToFloat(ast.right, retArr); - this.popState('building-float'); - } - break; - - case 'Integer & Float': - case 'Integer & Number': - if (ast.operator === '>' || ast.operator === '<' && ast.right.type === 'Literal') { - if (!Number.isInteger(ast.right.value)) { - this.pushState('building-float'); - this.castValueToFloat(ast.left, retArr); - retArr.push(operatorMap[ast.operator] || ast.operator); - this.astGeneric(ast.right, retArr); - this.popState('building-float'); - break; - } - } - this.pushState('building-integer'); - this.astGeneric(ast.left, retArr); - retArr.push(operatorMap[ast.operator] || ast.operator); - this.pushState('casting-to-integer'); - if (ast.right.type === 'Literal') { - const literalResult = []; - this.astGeneric(ast.right, literalResult); - const literalType = this.getType(ast.right); - if (literalType === 'Integer') { - retArr.push(literalResult.join('')); - } else { - throw this.astErrorOutput(`Unhandled binary expression with literal`, ast); - } - } else { - retArr.push('int('); - this.astGeneric(ast.right, retArr); - retArr.push(')'); - } - this.popState('casting-to-integer'); - this.popState('building-integer'); - break; - case 'Integer & LiteralInteger': - this.pushState('building-integer'); - this.astGeneric(ast.left, retArr); - retArr.push(operatorMap[ast.operator] || ast.operator); - this.castLiteralToInteger(ast.right, retArr); - this.popState('building-integer'); - break; - - case 'Number & Integer': - this.pushState('building-float'); - this.astGeneric(ast.left, retArr); - retArr.push(operatorMap[ast.operator] || ast.operator); - this.castValueToFloat(ast.right, retArr); - this.popState('building-float'); - break; - case 'Float & LiteralInteger': - case 'Number & LiteralInteger': - this.pushState('building-float'); - this.astGeneric(ast.left, retArr); - retArr.push(operatorMap[ast.operator] || ast.operator); - this.castLiteralToFloat(ast.right, retArr); - this.popState('building-float'); - break; - case 'LiteralInteger & Float': - case 'LiteralInteger & Number': - if (this.isState('casting-to-integer')) { - this.pushState('building-integer'); - this.castLiteralToInteger(ast.left, retArr); - retArr.push(operatorMap[ast.operator] || ast.operator); - this.castValueToInteger(ast.right, retArr); - this.popState('building-integer'); - } else { - this.pushState('building-float'); - this.astGeneric(ast.left, retArr); - retArr.push(operatorMap[ast.operator] || ast.operator); - this.pushState('casting-to-float'); - this.astGeneric(ast.right, retArr); - this.popState('casting-to-float'); - this.popState('building-float'); - } - break; - case 'LiteralInteger & Integer': - this.pushState('building-integer'); - this.castLiteralToInteger(ast.left, retArr); - retArr.push(operatorMap[ast.operator] || ast.operator); - this.astGeneric(ast.right, retArr); - this.popState('building-integer'); - break; - - case 'Boolean & Boolean': - this.pushState('building-boolean'); - this.astGeneric(ast.left, retArr); - retArr.push(operatorMap[ast.operator] || ast.operator); - this.astGeneric(ast.right, retArr); - this.popState('building-boolean'); - break; - - case 'Float & Integer': - this.pushState('building-float'); - this.astGeneric(ast.left, retArr); - retArr.push(operatorMap[ast.operator] || ast.operator); - this.castValueToFloat(ast.right, retArr); - this.popState('building-float'); - break; - - default: - throw this.astErrorOutput(`Unhandled binary expression between ${key}`, ast); - } - retArr.push(')'); - - return retArr; - } - - checkAndUpconvertOperator(ast, retArr) { - const bitwiseResult = this.checkAndUpconvertBitwiseOperators(ast, retArr); - if (bitwiseResult) { - return bitwiseResult; - } - const upconvertableOperators = { - '%': this.fixIntegerDivisionAccuracy ? 'integerCorrectionModulo' : 'modulo', - '**': 'pow', - }; - const foundOperator = upconvertableOperators[ast.operator]; - if (!foundOperator) return null; - retArr.push(foundOperator); - retArr.push('('); - switch (this.getType(ast.left)) { - case 'Integer': - this.castValueToFloat(ast.left, retArr); - break; - case 'LiteralInteger': - this.castLiteralToFloat(ast.left, retArr); - break; - default: - this.astGeneric(ast.left, retArr); - } - retArr.push(','); - switch (this.getType(ast.right)) { - case 'Integer': - this.castValueToFloat(ast.right, retArr); - break; - case 'LiteralInteger': - this.castLiteralToFloat(ast.right, retArr); - break; - default: - this.astGeneric(ast.right, retArr); - } - retArr.push(')'); - return retArr; - } - - checkAndUpconvertBitwiseOperators(ast, retArr) { - const upconvertableOperators = { - '&': 'bitwiseAnd', - '|': 'bitwiseOr', - '^': 'bitwiseXOR', - '<<': 'bitwiseZeroFillLeftShift', - '>>': 'bitwiseSignedRightShift', - '>>>': 'bitwiseZeroFillRightShift', - }; - const foundOperator = upconvertableOperators[ast.operator]; - if (!foundOperator) return null; - retArr.push(foundOperator); - retArr.push('('); - const leftType = this.getType(ast.left); - switch (leftType) { - case 'Number': - case 'Float': - this.castValueToInteger(ast.left, retArr); - break; - case 'LiteralInteger': - this.castLiteralToInteger(ast.left, retArr); - break; - default: - this.astGeneric(ast.left, retArr); - } - retArr.push(','); - const rightType = this.getType(ast.right); - switch (rightType) { - case 'Number': - case 'Float': - this.castValueToInteger(ast.right, retArr); - break; - case 'LiteralInteger': - this.castLiteralToInteger(ast.right, retArr); - break; - default: - this.astGeneric(ast.right, retArr); - } - retArr.push(')'); - return retArr; - } - - checkAndUpconvertBitwiseUnary(ast, retArr) { - const upconvertableOperators = { - '~': 'bitwiseNot', - }; - const foundOperator = upconvertableOperators[ast.operator]; - if (!foundOperator) return null; - retArr.push(foundOperator); - retArr.push('('); - switch (this.getType(ast.argument)) { - case 'Number': - case 'Float': - this.castValueToInteger(ast.argument, retArr); - break; - case 'LiteralInteger': - this.castLiteralToInteger(ast.argument, retArr); - break; - default: - this.astGeneric(ast.argument, retArr); - } - retArr.push(')'); - return retArr; - } - - castLiteralToInteger(ast, retArr) { - this.pushState('casting-to-integer'); - this.astGeneric(ast, retArr); - this.popState('casting-to-integer'); - return retArr; - } - - castLiteralToFloat(ast, retArr) { - this.pushState('casting-to-float'); - this.astGeneric(ast, retArr); - this.popState('casting-to-float'); - return retArr; - } - - castValueToInteger(ast, retArr) { - this.pushState('casting-to-integer'); - retArr.push('int('); - this.astGeneric(ast, retArr); - retArr.push(')'); - this.popState('casting-to-integer'); - return retArr; - } - - castValueToFloat(ast, retArr) { - this.pushState('casting-to-float'); - retArr.push('float('); - this.astGeneric(ast, retArr); - retArr.push(')'); - this.popState('casting-to-float'); - return retArr; - } - - astIdentifierExpression(idtNode, retArr) { - if (idtNode.type !== 'Identifier') { - throw this.astErrorOutput('IdentifierExpression - not an Identifier', idtNode); - } - - const type = this.getType(idtNode); - - const name = utils.sanitizeName(idtNode.name); - if (idtNode.name === 'Infinity') { - retArr.push('3.402823466e+38'); - } else if (type === 'Boolean') { - if (this.argumentNames.indexOf(name) > -1) { - retArr.push(`bool(user_${name})`); - } else { - retArr.push(`user_${name}`); - } - } else { - retArr.push(`user_${name}`); - } - - return retArr; - } - - astForStatement(forNode, retArr) { - if (forNode.type !== 'ForStatement') { - throw this.astErrorOutput('Invalid for statement', forNode); - } - - const initArr = []; - const testArr = []; - const updateArr = []; - const bodyArr = []; - let isSafe = null; - - if (forNode.init) { - const { declarations } = forNode.init; - if (declarations.length > 1) { - isSafe = false; - } - this.astGeneric(forNode.init, initArr); - for (let i = 0; i < declarations.length; i++) { - if (declarations[i].init && declarations[i].init.type !== 'Literal') { - isSafe = false; - } - } - } else { - isSafe = false; - } - - if (forNode.test) { - this.astGeneric(forNode.test, testArr); - } else { - isSafe = false; - } - - if (forNode.update) { - this.astGeneric(forNode.update, updateArr); - } else { - isSafe = false; - } - - if (forNode.body) { - this.pushState('loop-body'); - this.astGeneric(forNode.body, bodyArr); - this.popState('loop-body'); - } - - if (isSafe === null) { - isSafe = this.isSafe(forNode.init) && this.isSafe(forNode.test); - } - - if (isSafe) { - const initString = initArr.join(''); - const initNeedsSemiColon = initString[initString.length - 1] !== ';'; - retArr.push(`for (${initString}${initNeedsSemiColon ? ';' : ''}${testArr.join('')};${updateArr.join('')}){\n`); - retArr.push(bodyArr.join('')); - retArr.push('}\n'); - } else { - const iVariableName = this.getInternalVariableName('safeI'); - if (initArr.length > 0) { - retArr.push(initArr.join(''), '\n'); - } - retArr.push(`for (int ${iVariableName}=0;${iVariableName} 0) { - retArr.push(`if (!${testArr.join('')}) break;\n`); - } - retArr.push(bodyArr.join('')); - retArr.push(`\n${updateArr.join('')};`); - retArr.push('}\n'); - } - return retArr; - } - - astWhileStatement(whileNode, retArr) { - if (whileNode.type !== 'WhileStatement') { - throw this.astErrorOutput('Invalid while statement', whileNode); - } - - const iVariableName = this.getInternalVariableName('safeI'); - retArr.push(`for (int ${iVariableName}=0;${iVariableName} 0) { - declarationSets.push(declarationSet.join(',')); - } - - result.push(declarationSets.join(';')); - - retArr.push(result.join('')); - retArr.push(';'); - return retArr; - } - - astIfStatement(ifNode, retArr) { - retArr.push('if ('); - this.astGeneric(ifNode.test, retArr); - retArr.push(')'); - if (ifNode.consequent.type === 'BlockStatement') { - this.astGeneric(ifNode.consequent, retArr); - } else { - retArr.push(' {\n'); - this.astGeneric(ifNode.consequent, retArr); - retArr.push('\n}\n'); - } - - if (ifNode.alternate) { - retArr.push('else '); - if (ifNode.alternate.type === 'BlockStatement' || ifNode.alternate.type === 'IfStatement') { - this.astGeneric(ifNode.alternate, retArr); - } else { - retArr.push(' {\n'); - this.astGeneric(ifNode.alternate, retArr); - retArr.push('\n}\n'); - } - } - return retArr; - } - - astSwitchStatement(ast, retArr) { - if (ast.type !== 'SwitchStatement') { - throw this.astErrorOutput('Invalid switch statement', ast); - } - const { discriminant, cases } = ast; - const type = this.getType(discriminant); - const varName = `switchDiscriminant${this.astKey(ast, '_')}`; - switch (type) { - case 'Float': - case 'Number': - retArr.push(`float ${varName} = `); - this.astGeneric(discriminant, retArr); - retArr.push(';\n'); - break; - case 'Integer': - retArr.push(`int ${varName} = `); - this.astGeneric(discriminant, retArr); - retArr.push(';\n'); - break; - } - if (cases.length === 1 && !cases[0].test) { - this.astGeneric(cases[0].consequent, retArr); - return retArr; - } - - let fallingThrough = false; - let defaultResult = []; - let movingDefaultToEnd = false; - let pastFirstIf = false; - for (let i = 0; i < cases.length; i++) { - if (!cases[i].test) { - if (cases.length > i + 1) { - movingDefaultToEnd = true; - this.astGeneric(cases[i].consequent, defaultResult); - continue; - } else { - retArr.push(' else {\n'); - } - } else { - if (i === 0 || !pastFirstIf) { - pastFirstIf = true; - retArr.push(`if (${varName} == `); - } else { - if (fallingThrough) { - retArr.push(`${varName} == `); - fallingThrough = false; - } else { - retArr.push(` else if (${varName} == `); - } - } - if (type === 'Integer') { - const testType = this.getType(cases[i].test); - switch (testType) { - case 'Number': - case 'Float': - this.castValueToInteger(cases[i].test, retArr); - break; - case 'LiteralInteger': - this.castLiteralToInteger(cases[i].test, retArr); - break; - } - } else if (type === 'Float') { - const testType = this.getType(cases[i].test); - switch (testType) { - case 'LiteralInteger': - this.castLiteralToFloat(cases[i].test, retArr); - break; - case 'Integer': - this.castValueToFloat(cases[i].test, retArr); - break; - } - } else { - throw new Error('unhanlded'); - } - if (!cases[i].consequent || cases[i].consequent.length === 0) { - fallingThrough = true; - retArr.push(' || '); - continue; - } - retArr.push(`) {\n`); - } - this.astGeneric(cases[i].consequent, retArr); - retArr.push('\n}'); - } - if (movingDefaultToEnd) { - retArr.push(' else {'); - retArr.push(defaultResult.join('')); - retArr.push('}'); - } - return retArr; - } - - astThisExpression(tNode, retArr) { - retArr.push('this'); - return retArr; - } - - astMemberExpression(mNode, retArr) { - const { - property, - name, - signature, - origin, - type, - xProperty, - yProperty, - zProperty - } = this.getMemberExpressionDetails(mNode); - switch (signature) { - case 'value.thread.value': - case 'this.thread.value': - if (name !== 'x' && name !== 'y' && name !== 'z') { - throw this.astErrorOutput('Unexpected expression, expected `this.thread.x`, `this.thread.y`, or `this.thread.z`', mNode); - } - retArr.push(`threadId.${name}`); - return retArr; - case 'this.output.value': - if (this.dynamicOutput) { - switch (name) { - case 'x': - if (this.isState('casting-to-float')) { - retArr.push('float(uOutputDim.x)'); - } else { - retArr.push('uOutputDim.x'); - } - break; - case 'y': - if (this.isState('casting-to-float')) { - retArr.push('float(uOutputDim.y)'); - } else { - retArr.push('uOutputDim.y'); - } - break; - case 'z': - if (this.isState('casting-to-float')) { - retArr.push('float(uOutputDim.z)'); - } else { - retArr.push('uOutputDim.z'); - } - break; - default: - throw this.astErrorOutput('Unexpected expression', mNode); - } - } else { - switch (name) { - case 'x': - if (this.isState('casting-to-integer')) { - retArr.push(this.output[0]); - } else { - retArr.push(this.output[0], '.0'); - } - break; - case 'y': - if (this.isState('casting-to-integer')) { - retArr.push(this.output[1]); - } else { - retArr.push(this.output[1], '.0'); - } - break; - case 'z': - if (this.isState('casting-to-integer')) { - retArr.push(this.output[2]); - } else { - retArr.push(this.output[2], '.0'); - } - break; - default: - throw this.astErrorOutput('Unexpected expression', mNode); - } - } - return retArr; - case 'value': - throw this.astErrorOutput('Unexpected expression', mNode); - case 'value[]': - case 'value[][]': - case 'value[][][]': - case 'value[][][][]': - case 'value.value': - if (origin === 'Math') { - retArr.push(Math[name]); - return retArr; - } - const cleanName = utils.sanitizeName(name); - switch (property) { - case 'r': - retArr.push(`user_${ cleanName }.r`); - return retArr; - case 'g': - retArr.push(`user_${ cleanName }.g`); - return retArr; - case 'b': - retArr.push(`user_${ cleanName }.b`); - return retArr; - case 'a': - retArr.push(`user_${ cleanName }.a`); - return retArr; - } - break; - case 'this.constants.value': - if (typeof xProperty === 'undefined') { - switch (type) { - case 'Array(2)': - case 'Array(3)': - case 'Array(4)': - retArr.push(`constants_${ utils.sanitizeName(name) }`); - return retArr; - } - } - case 'this.constants.value[]': - case 'this.constants.value[][]': - case 'this.constants.value[][][]': - case 'this.constants.value[][][][]': - break; - case 'fn()[]': - this.astCallExpression(mNode.object, retArr); - retArr.push('['); - retArr.push(this.memberExpressionPropertyMarkup(property)); - retArr.push(']'); - return retArr; - case 'fn()[][]': - this.astCallExpression(mNode.object.object, retArr); - retArr.push('['); - retArr.push(this.memberExpressionPropertyMarkup(mNode.object.property)); - retArr.push(']'); - retArr.push('['); - retArr.push(this.memberExpressionPropertyMarkup(mNode.property)); - retArr.push(']'); - return retArr; - case '[][]': - this.astArrayExpression(mNode.object, retArr); - retArr.push('['); - retArr.push(this.memberExpressionPropertyMarkup(property)); - retArr.push(']'); - return retArr; - default: - throw this.astErrorOutput('Unexpected expression', mNode); - } - - if (mNode.computed === false) { - switch (type) { - case 'Number': - case 'Integer': - case 'Float': - case 'Boolean': - retArr.push(`${origin}_${utils.sanitizeName(name)}`); - return retArr; - } - } - - const markupName = `${origin}_${utils.sanitizeName(name)}`; - - switch (type) { - case 'Array(2)': - case 'Array(3)': - case 'Array(4)': - this.astGeneric(mNode.object, retArr); - retArr.push('['); - retArr.push(this.memberExpressionPropertyMarkup(xProperty)); - retArr.push(']'); - break; - case 'HTMLImageArray': - retArr.push(`getImage3D(${ markupName }, ${ markupName }Size, ${ markupName }Dim, `); - this.memberExpressionXYZ(xProperty, yProperty, zProperty, retArr); - retArr.push(')'); - break; - case 'ArrayTexture(1)': - retArr.push(`getFloatFromSampler2D(${ markupName }, ${ markupName }Size, ${ markupName }Dim, `); - this.memberExpressionXYZ(xProperty, yProperty, zProperty, retArr); - retArr.push(')'); - break; - case 'Array1D(2)': - case 'Array2D(2)': - case 'Array3D(2)': - retArr.push(`getMemoryOptimizedVec2(${ markupName }, ${ markupName }Size, ${ markupName }Dim, `); - this.memberExpressionXYZ(xProperty, yProperty, zProperty, retArr); - retArr.push(')'); - break; - case 'ArrayTexture(2)': - retArr.push(`getVec2FromSampler2D(${ markupName }, ${ markupName }Size, ${ markupName }Dim, `); - this.memberExpressionXYZ(xProperty, yProperty, zProperty, retArr); - retArr.push(')'); - break; - case 'Array1D(3)': - case 'Array2D(3)': - case 'Array3D(3)': - retArr.push(`getMemoryOptimizedVec3(${ markupName }, ${ markupName }Size, ${ markupName }Dim, `); - this.memberExpressionXYZ(xProperty, yProperty, zProperty, retArr); - retArr.push(')'); - break; - case 'ArrayTexture(3)': - retArr.push(`getVec3FromSampler2D(${ markupName }, ${ markupName }Size, ${ markupName }Dim, `); - this.memberExpressionXYZ(xProperty, yProperty, zProperty, retArr); - retArr.push(')'); - break; - case 'Array1D(4)': - case 'Array2D(4)': - case 'Array3D(4)': - retArr.push(`getMemoryOptimizedVec4(${ markupName }, ${ markupName }Size, ${ markupName }Dim, `); - this.memberExpressionXYZ(xProperty, yProperty, zProperty, retArr); - retArr.push(')'); - break; - case 'ArrayTexture(4)': - case 'HTMLCanvas': - case 'OffscreenCanvas': - case 'HTMLImage': - case 'ImageBitmap': - case 'ImageData': - case 'HTMLVideo': - retArr.push(`getVec4FromSampler2D(${ markupName }, ${ markupName }Size, ${ markupName }Dim, `); - this.memberExpressionXYZ(xProperty, yProperty, zProperty, retArr); - retArr.push(')'); - break; - case 'NumberTexture': - case 'Array': - case 'Array2D': - case 'Array3D': - case 'Array4D': - case 'Input': - case 'Number': - case 'Float': - case 'Integer': - if (this.precision === 'single') { - retArr.push(`getMemoryOptimized32(${markupName}, ${markupName}Size, ${markupName}Dim, `); - this.memberExpressionXYZ(xProperty, yProperty, zProperty, retArr); - retArr.push(')'); - } else { - const bitRatio = (origin === 'user' ? - this.lookupFunctionArgumentBitRatio(this.name, name) : - this.constantBitRatios[name] - ); - switch (bitRatio) { - case 1: - retArr.push(`get8(${markupName}, ${markupName}Size, ${markupName}Dim, `); - break; - case 2: - retArr.push(`get16(${markupName}, ${markupName}Size, ${markupName}Dim, `); - break; - case 4: - case 0: - retArr.push(`get32(${markupName}, ${markupName}Size, ${markupName}Dim, `); - break; - default: - throw new Error(`unhandled bit ratio of ${bitRatio}`); - } - this.memberExpressionXYZ(xProperty, yProperty, zProperty, retArr); - retArr.push(')'); - } - break; - case 'MemoryOptimizedNumberTexture': - retArr.push(`getMemoryOptimized32(${ markupName }, ${ markupName }Size, ${ markupName }Dim, `); - this.memberExpressionXYZ(xProperty, yProperty, zProperty, retArr); - retArr.push(')'); - break; - case 'Matrix(2)': - case 'Matrix(3)': - case 'Matrix(4)': - retArr.push(`${markupName}[${this.memberExpressionPropertyMarkup(yProperty)}]`); - if (yProperty) { - retArr.push(`[${this.memberExpressionPropertyMarkup(xProperty)}]`); - } - break; - default: - throw new Error(`unhandled member expression "${ type }"`); - } - return retArr; - } - - astCallExpression(ast, retArr) { - if (!ast.callee) { - throw this.astErrorOutput('Unknown CallExpression', ast); - } - - let functionName = null; - const isMathFunction = this.isAstMathFunction(ast); - - if (isMathFunction || (ast.callee.object && ast.callee.object.type === 'ThisExpression')) { - functionName = ast.callee.property.name; - } - else if (ast.callee.type === 'SequenceExpression' && ast.callee.expressions[0].type === 'Literal' && !isNaN(ast.callee.expressions[0].raw)) { - functionName = ast.callee.expressions[1].property.name; - } else { - functionName = ast.callee.name; - } - - if (!functionName) { - throw this.astErrorOutput(`Unhandled function, couldn't find name`, ast); - } - - switch (functionName) { - case 'pow': - functionName = '_pow'; - break; - case 'round': - functionName = '_round'; - break; - } - - if (this.calledFunctions.indexOf(functionName) < 0) { - this.calledFunctions.push(functionName); - } - - if (functionName === 'random' && this.plugins && this.plugins.length > 0) { - for (let i = 0; i < this.plugins.length; i++) { - const plugin = this.plugins[i]; - if (plugin.functionMatch === 'Math.random()' && plugin.functionReplace) { - retArr.push(plugin.functionReplace); - return retArr; - } - } - } - - if (this.onFunctionCall) { - this.onFunctionCall(this.name, functionName, ast.arguments); - } - - retArr.push(functionName); - - retArr.push('('); - - if (isMathFunction) { - for (let i = 0; i < ast.arguments.length; ++i) { - const argument = ast.arguments[i]; - const argumentType = this.getType(argument); - if (i > 0) { - retArr.push(', '); - } - - switch (argumentType) { - case 'Integer': - this.castValueToFloat(argument, retArr); - break; - default: - this.astGeneric(argument, retArr); - break; - } - } - } else { - const targetTypes = this.lookupFunctionArgumentTypes(functionName) || []; - for (let i = 0; i < ast.arguments.length; ++i) { - const argument = ast.arguments[i]; - let targetType = targetTypes[i]; - if (i > 0) { - retArr.push(', '); - } - const argumentType = this.getType(argument); - if (!targetType) { - this.triggerImplyArgumentType(functionName, i, argumentType, this); - targetType = argumentType; - } - switch (argumentType) { - case 'Boolean': - this.astGeneric(argument, retArr); - continue; - case 'Number': - case 'Float': - if (targetType === 'Integer') { - retArr.push('int('); - this.astGeneric(argument, retArr); - retArr.push(')'); - continue; - } else if (targetType === 'Number' || targetType === 'Float') { - this.astGeneric(argument, retArr); - continue; - } else if (targetType === 'LiteralInteger') { - this.castLiteralToFloat(argument, retArr); - continue; - } - break; - case 'Integer': - if (targetType === 'Number' || targetType === 'Float') { - retArr.push('float('); - this.astGeneric(argument, retArr); - retArr.push(')'); - continue; - } else if (targetType === 'Integer') { - this.astGeneric(argument, retArr); - continue; - } - break; - case 'LiteralInteger': - if (targetType === 'Integer') { - this.castLiteralToInteger(argument, retArr); - continue; - } else if (targetType === 'Number' || targetType === 'Float') { - this.castLiteralToFloat(argument, retArr); - continue; - } else if (targetType === 'LiteralInteger') { - this.astGeneric(argument, retArr); - continue; - } - break; - case 'Array(2)': - case 'Array(3)': - case 'Array(4)': - if (targetType === argumentType) { - if (argument.type === 'Identifier') { - retArr.push(`user_${utils.sanitizeName(argument.name)}`); - } else if (argument.type === 'ArrayExpression' || argument.type === 'MemberExpression' || argument.type === 'CallExpression') { - this.astGeneric(argument, retArr); - } else { - throw this.astErrorOutput(`Unhandled argument type ${ argument.type }`, ast); - } - continue; - } - break; - case 'HTMLCanvas': - case 'OffscreenCanvas': - case 'HTMLImage': - case 'ImageBitmap': - case 'ImageData': - case 'HTMLImageArray': - case 'HTMLVideo': - case 'ArrayTexture(1)': - case 'ArrayTexture(2)': - case 'ArrayTexture(3)': - case 'ArrayTexture(4)': - case 'Array': - case 'Input': - if (targetType === argumentType) { - if (argument.type !== 'Identifier') throw this.astErrorOutput(`Unhandled argument type ${ argument.type }`, ast); - this.triggerImplyArgumentBitRatio(this.name, argument.name, functionName, i); - const name = utils.sanitizeName(argument.name); - retArr.push(`user_${name},user_${name}Size,user_${name}Dim`); - continue; - } - break; - } - throw this.astErrorOutput(`Unhandled argument combination of ${ argumentType } and ${ targetType } for argument named "${ argument.name }"`, ast); - } - } - retArr.push(')'); - - return retArr; - } - - astArrayExpression(arrNode, retArr) { - const returnType = this.getType(arrNode); - - const arrLen = arrNode.elements.length; - - switch (returnType) { - case 'Matrix(2)': - case 'Matrix(3)': - case 'Matrix(4)': - retArr.push(`mat${arrLen}(`); - break; - default: - retArr.push(`vec${arrLen}(`); - } - for (let i = 0; i < arrLen; ++i) { - if (i > 0) { - retArr.push(', '); - } - const subNode = arrNode.elements[i]; - this.astGeneric(subNode, retArr) - } - retArr.push(')'); - - return retArr; - } - - memberExpressionXYZ(x, y, z, retArr) { - if (z) { - retArr.push(this.memberExpressionPropertyMarkup(z), ', '); - } else { - retArr.push('0, '); - } - if (y) { - retArr.push(this.memberExpressionPropertyMarkup(y), ', '); - } else { - retArr.push('0, '); - } - retArr.push(this.memberExpressionPropertyMarkup(x)); - return retArr; - } - - memberExpressionPropertyMarkup(property) { - if (!property) { - throw new Error('Property not set'); - } - const type = this.getType(property); - const result = []; - switch (type) { - case 'Number': - case 'Float': - this.castValueToInteger(property, result); - break; - case 'LiteralInteger': - this.castLiteralToInteger(property, result); - break; - default: - this.astGeneric(property, result); - } - return result.join(''); - } -} - -const typeMap = { - 'Array': 'sampler2D', - 'Array(2)': 'vec2', - 'Array(3)': 'vec3', - 'Array(4)': 'vec4', - 'Matrix(2)': 'mat2', - 'Matrix(3)': 'mat3', - 'Matrix(4)': 'mat4', - 'Array2D': 'sampler2D', - 'Array3D': 'sampler2D', - 'Boolean': 'bool', - 'Float': 'float', - 'Input': 'sampler2D', - 'Integer': 'int', - 'Number': 'float', - 'LiteralInteger': 'float', - 'NumberTexture': 'sampler2D', - 'MemoryOptimizedNumberTexture': 'sampler2D', - 'ArrayTexture(1)': 'sampler2D', - 'ArrayTexture(2)': 'sampler2D', - 'ArrayTexture(3)': 'sampler2D', - 'ArrayTexture(4)': 'sampler2D', - 'HTMLVideo': 'sampler2D', - 'HTMLCanvas': 'sampler2D', - 'OffscreenCanvas': 'sampler2D', - 'HTMLImage': 'sampler2D', - 'ImageBitmap': 'sampler2D', - 'ImageData': 'sampler2D', - 'HTMLImageArray': 'sampler2DArray', -}; - -const operatorMap = { - '===': '==', - '!==': '!=' -}; - -module.exports = { - WebGLFunctionNode -}; -},{"../../utils":113,"../function-node":9}],38:[function(require,module,exports){ -const { WebGLKernelValueBoolean } = require('./kernel-value/boolean'); -const { WebGLKernelValueFloat } = require('./kernel-value/float'); -const { WebGLKernelValueInteger } = require('./kernel-value/integer'); - -const { WebGLKernelValueHTMLImage } = require('./kernel-value/html-image'); -const { WebGLKernelValueDynamicHTMLImage } = require('./kernel-value/dynamic-html-image'); - -const { WebGLKernelValueHTMLVideo } = require('./kernel-value/html-video'); -const { WebGLKernelValueDynamicHTMLVideo } = require('./kernel-value/dynamic-html-video'); - -const { WebGLKernelValueSingleInput } = require('./kernel-value/single-input'); -const { WebGLKernelValueDynamicSingleInput } = require('./kernel-value/dynamic-single-input'); - -const { WebGLKernelValueUnsignedInput } = require('./kernel-value/unsigned-input'); -const { WebGLKernelValueDynamicUnsignedInput } = require('./kernel-value/dynamic-unsigned-input'); - -const { WebGLKernelValueMemoryOptimizedNumberTexture } = require('./kernel-value/memory-optimized-number-texture'); -const { WebGLKernelValueDynamicMemoryOptimizedNumberTexture } = require('./kernel-value/dynamic-memory-optimized-number-texture'); - -const { WebGLKernelValueNumberTexture } = require('./kernel-value/number-texture'); -const { WebGLKernelValueDynamicNumberTexture } = require('./kernel-value/dynamic-number-texture'); - -const { WebGLKernelValueSingleArray } = require('./kernel-value/single-array'); -const { WebGLKernelValueDynamicSingleArray } = require('./kernel-value/dynamic-single-array'); - -const { WebGLKernelValueSingleArray1DI } = require('./kernel-value/single-array1d-i'); -const { WebGLKernelValueDynamicSingleArray1DI } = require('./kernel-value/dynamic-single-array1d-i'); - -const { WebGLKernelValueSingleArray2DI } = require('./kernel-value/single-array2d-i'); -const { WebGLKernelValueDynamicSingleArray2DI } = require('./kernel-value/dynamic-single-array2d-i'); - -const { WebGLKernelValueSingleArray3DI } = require('./kernel-value/single-array3d-i'); -const { WebGLKernelValueDynamicSingleArray3DI } = require('./kernel-value/dynamic-single-array3d-i'); - -const { WebGLKernelValueArray2 } = require('./kernel-value/array2'); -const { WebGLKernelValueArray3 } = require('./kernel-value/array3'); -const { WebGLKernelValueArray4 } = require('./kernel-value/array4'); - -const { WebGLKernelValueUnsignedArray } = require('./kernel-value/unsigned-array'); -const { WebGLKernelValueDynamicUnsignedArray } = require('./kernel-value/dynamic-unsigned-array'); - -const kernelValueMaps = { - unsigned: { - dynamic: { - 'Boolean': WebGLKernelValueBoolean, - 'Integer': WebGLKernelValueInteger, - 'Float': WebGLKernelValueFloat, - 'Array': WebGLKernelValueDynamicUnsignedArray, - 'Array(2)': WebGLKernelValueArray2, - 'Array(3)': WebGLKernelValueArray3, - 'Array(4)': WebGLKernelValueArray4, - 'Array1D(2)': false, - 'Array1D(3)': false, - 'Array1D(4)': false, - 'Array2D(2)': false, - 'Array2D(3)': false, - 'Array2D(4)': false, - 'Array3D(2)': false, - 'Array3D(3)': false, - 'Array3D(4)': false, - 'Input': WebGLKernelValueDynamicUnsignedInput, - 'NumberTexture': WebGLKernelValueDynamicNumberTexture, - 'ArrayTexture(1)': WebGLKernelValueDynamicNumberTexture, - 'ArrayTexture(2)': WebGLKernelValueDynamicNumberTexture, - 'ArrayTexture(3)': WebGLKernelValueDynamicNumberTexture, - 'ArrayTexture(4)': WebGLKernelValueDynamicNumberTexture, - 'MemoryOptimizedNumberTexture': WebGLKernelValueDynamicMemoryOptimizedNumberTexture, - 'HTMLCanvas': WebGLKernelValueDynamicHTMLImage, - 'OffscreenCanvas': WebGLKernelValueDynamicHTMLImage, - 'HTMLImage': WebGLKernelValueDynamicHTMLImage, - 'ImageBitmap': WebGLKernelValueDynamicHTMLImage, - 'ImageData': WebGLKernelValueDynamicHTMLImage, - 'HTMLImageArray': false, - 'HTMLVideo': WebGLKernelValueDynamicHTMLVideo, - }, - static: { - 'Boolean': WebGLKernelValueBoolean, - 'Float': WebGLKernelValueFloat, - 'Integer': WebGLKernelValueInteger, - 'Array': WebGLKernelValueUnsignedArray, - 'Array(2)': WebGLKernelValueArray2, - 'Array(3)': WebGLKernelValueArray3, - 'Array(4)': WebGLKernelValueArray4, - 'Array1D(2)': false, - 'Array1D(3)': false, - 'Array1D(4)': false, - 'Array2D(2)': false, - 'Array2D(3)': false, - 'Array2D(4)': false, - 'Array3D(2)': false, - 'Array3D(3)': false, - 'Array3D(4)': false, - 'Input': WebGLKernelValueUnsignedInput, - 'NumberTexture': WebGLKernelValueNumberTexture, - 'ArrayTexture(1)': WebGLKernelValueNumberTexture, - 'ArrayTexture(2)': WebGLKernelValueNumberTexture, - 'ArrayTexture(3)': WebGLKernelValueNumberTexture, - 'ArrayTexture(4)': WebGLKernelValueNumberTexture, - 'MemoryOptimizedNumberTexture': WebGLKernelValueMemoryOptimizedNumberTexture, - 'HTMLCanvas': WebGLKernelValueHTMLImage, - 'OffscreenCanvas': WebGLKernelValueHTMLImage, - 'HTMLImage': WebGLKernelValueHTMLImage, - 'ImageBitmap': WebGLKernelValueHTMLImage, - 'ImageData': WebGLKernelValueHTMLImage, - 'HTMLImageArray': false, - 'HTMLVideo': WebGLKernelValueHTMLVideo, - } - }, - single: { - dynamic: { - 'Boolean': WebGLKernelValueBoolean, - 'Integer': WebGLKernelValueInteger, - 'Float': WebGLKernelValueFloat, - 'Array': WebGLKernelValueDynamicSingleArray, - 'Array(2)': WebGLKernelValueArray2, - 'Array(3)': WebGLKernelValueArray3, - 'Array(4)': WebGLKernelValueArray4, - 'Array1D(2)': WebGLKernelValueDynamicSingleArray1DI, - 'Array1D(3)': WebGLKernelValueDynamicSingleArray1DI, - 'Array1D(4)': WebGLKernelValueDynamicSingleArray1DI, - 'Array2D(2)': WebGLKernelValueDynamicSingleArray2DI, - 'Array2D(3)': WebGLKernelValueDynamicSingleArray2DI, - 'Array2D(4)': WebGLKernelValueDynamicSingleArray2DI, - 'Array3D(2)': WebGLKernelValueDynamicSingleArray3DI, - 'Array3D(3)': WebGLKernelValueDynamicSingleArray3DI, - 'Array3D(4)': WebGLKernelValueDynamicSingleArray3DI, - 'Input': WebGLKernelValueDynamicSingleInput, - 'NumberTexture': WebGLKernelValueDynamicNumberTexture, - 'ArrayTexture(1)': WebGLKernelValueDynamicNumberTexture, - 'ArrayTexture(2)': WebGLKernelValueDynamicNumberTexture, - 'ArrayTexture(3)': WebGLKernelValueDynamicNumberTexture, - 'ArrayTexture(4)': WebGLKernelValueDynamicNumberTexture, - 'MemoryOptimizedNumberTexture': WebGLKernelValueDynamicMemoryOptimizedNumberTexture, - 'HTMLCanvas': WebGLKernelValueDynamicHTMLImage, - 'OffscreenCanvas': WebGLKernelValueDynamicHTMLImage, - 'HTMLImage': WebGLKernelValueDynamicHTMLImage, - 'ImageBitmap': WebGLKernelValueDynamicHTMLImage, - 'ImageData': WebGLKernelValueDynamicHTMLImage, - 'HTMLImageArray': false, - 'HTMLVideo': WebGLKernelValueDynamicHTMLVideo, - }, - static: { - 'Boolean': WebGLKernelValueBoolean, - 'Float': WebGLKernelValueFloat, - 'Integer': WebGLKernelValueInteger, - 'Array': WebGLKernelValueSingleArray, - 'Array(2)': WebGLKernelValueArray2, - 'Array(3)': WebGLKernelValueArray3, - 'Array(4)': WebGLKernelValueArray4, - 'Array1D(2)': WebGLKernelValueSingleArray1DI, - 'Array1D(3)': WebGLKernelValueSingleArray1DI, - 'Array1D(4)': WebGLKernelValueSingleArray1DI, - 'Array2D(2)': WebGLKernelValueSingleArray2DI, - 'Array2D(3)': WebGLKernelValueSingleArray2DI, - 'Array2D(4)': WebGLKernelValueSingleArray2DI, - 'Array3D(2)': WebGLKernelValueSingleArray3DI, - 'Array3D(3)': WebGLKernelValueSingleArray3DI, - 'Array3D(4)': WebGLKernelValueSingleArray3DI, - 'Input': WebGLKernelValueSingleInput, - 'NumberTexture': WebGLKernelValueNumberTexture, - 'ArrayTexture(1)': WebGLKernelValueNumberTexture, - 'ArrayTexture(2)': WebGLKernelValueNumberTexture, - 'ArrayTexture(3)': WebGLKernelValueNumberTexture, - 'ArrayTexture(4)': WebGLKernelValueNumberTexture, - 'MemoryOptimizedNumberTexture': WebGLKernelValueMemoryOptimizedNumberTexture, - 'HTMLCanvas': WebGLKernelValueHTMLImage, - 'OffscreenCanvas': WebGLKernelValueHTMLImage, - 'HTMLImage': WebGLKernelValueHTMLImage, - 'ImageBitmap': WebGLKernelValueHTMLImage, - 'ImageData': WebGLKernelValueHTMLImage, - 'HTMLImageArray': false, - 'HTMLVideo': WebGLKernelValueHTMLVideo, - } - }, -}; - -function lookupKernelValueType(type, dynamic, precision, value) { - if (!type) { - throw new Error('type missing'); - } - if (!dynamic) { - throw new Error('dynamic missing'); - } - if (!precision) { - throw new Error('precision missing'); - } - if (value.type) { - type = value.type; - } - const types = kernelValueMaps[precision][dynamic]; - if (types[type] === false) { - return null; - } else if (types[type] === undefined) { - throw new Error(`Could not find a KernelValue for ${ type }`); - } - return types[type]; -} - -module.exports = { - lookupKernelValueType, - kernelValueMaps, -}; -},{"./kernel-value/array2":40,"./kernel-value/array3":41,"./kernel-value/array4":42,"./kernel-value/boolean":43,"./kernel-value/dynamic-html-image":44,"./kernel-value/dynamic-html-video":45,"./kernel-value/dynamic-memory-optimized-number-texture":46,"./kernel-value/dynamic-number-texture":47,"./kernel-value/dynamic-single-array":48,"./kernel-value/dynamic-single-array1d-i":49,"./kernel-value/dynamic-single-array2d-i":50,"./kernel-value/dynamic-single-array3d-i":51,"./kernel-value/dynamic-single-input":52,"./kernel-value/dynamic-unsigned-array":53,"./kernel-value/dynamic-unsigned-input":54,"./kernel-value/float":55,"./kernel-value/html-image":56,"./kernel-value/html-video":57,"./kernel-value/integer":59,"./kernel-value/memory-optimized-number-texture":60,"./kernel-value/number-texture":61,"./kernel-value/single-array":62,"./kernel-value/single-array1d-i":63,"./kernel-value/single-array2d-i":64,"./kernel-value/single-array3d-i":65,"./kernel-value/single-input":66,"./kernel-value/unsigned-array":67,"./kernel-value/unsigned-input":68}],39:[function(require,module,exports){ -const { WebGLKernelValue } = require('./index'); -const { Input } = require('../../../input'); - -class WebGLKernelArray extends WebGLKernelValue { - checkSize(width, height) { - if (!this.kernel.validate) return; - const { maxTextureSize } = this.kernel.constructor.features; - if (width > maxTextureSize || height > maxTextureSize) { - if (width > height) { - throw new Error(`Argument texture width of ${width} larger than maximum size of ${maxTextureSize} for your GPU`); - } else if (width < height) { - throw new Error(`Argument texture height of ${height} larger than maximum size of ${maxTextureSize} for your GPU`); - } else { - throw new Error(`Argument texture height and width of ${height} larger than maximum size of ${maxTextureSize} for your GPU`); - } - } - } - - setup() { - this.requestTexture(); - this.setupTexture(); - this.defineTexture(); - } - - requestTexture() { - this.texture = this.onRequestTexture(); - } - - defineTexture() { - const { context: gl } = this; - gl.activeTexture(this.contextHandle); - gl.bindTexture(gl.TEXTURE_2D, this.texture); - gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE); - gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE); - gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.NEAREST); - gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.NEAREST); - } - - setupTexture() { - this.contextHandle = this.onRequestContextHandle(); - this.index = this.onRequestIndex(); - this.dimensionsId = this.id + 'Dim'; - this.sizeId = this.id + 'Size'; - } - - getBitRatio(value) { - if (Array.isArray(value[0])) { - return this.getBitRatio(value[0]); - } else if (value.constructor === Input) { - return this.getBitRatio(value.value); - } - switch (value.constructor) { - case Uint8ClampedArray: - case Uint8Array: - case Int8Array: - return 1; - case Uint16Array: - case Int16Array: - return 2; - case Float32Array: - case Int32Array: - default: - return 4; - } - } - - destroy() { - if (this.prevArg) { - this.prevArg.delete(); - } - this.context.deleteTexture(this.texture); - } -} - -module.exports = { - WebGLKernelArray -}; -},{"../../../input":109,"./index":58}],40:[function(require,module,exports){ -const { WebGLKernelValue } = require('./index'); - -class WebGLKernelValueArray2 extends WebGLKernelValue { - constructor(value, settings) { - super(value, settings); - this.uploadValue = value; - } - getSource(value) { - if (this.origin === 'constants') { - return `const vec2 ${this.id} = vec2(${value[0]},${value[1]});\n`; - } - return `uniform vec2 ${this.id};\n`; - } - - getStringValueHandler() { - if (this.origin === 'constants') return ''; - return `const uploadValue_${this.name} = ${this.varName};\n`; - } - - updateValue(value) { - if (this.origin === 'constants') return; - this.kernel.setUniform2fv(this.id, this.uploadValue = value); - } -} - -module.exports = { - WebGLKernelValueArray2 -}; -},{"./index":58}],41:[function(require,module,exports){ -const { WebGLKernelValue } = require('./index'); - -class WebGLKernelValueArray3 extends WebGLKernelValue { - constructor(value, settings) { - super(value, settings); - this.uploadValue = value; - } - getSource(value) { - if (this.origin === 'constants') { - return `const vec3 ${this.id} = vec3(${value[0]},${value[1]},${value[2]});\n`; - } - return `uniform vec3 ${this.id};\n`; - } - - getStringValueHandler() { - if (this.origin === 'constants') return ''; - return `const uploadValue_${this.name} = ${this.varName};\n`; - } - - updateValue(value) { - if (this.origin === 'constants') return; - this.kernel.setUniform3fv(this.id, this.uploadValue = value); - } -} - -module.exports = { - WebGLKernelValueArray3 -}; -},{"./index":58}],42:[function(require,module,exports){ -const { WebGLKernelValue } = require('./index'); - -class WebGLKernelValueArray4 extends WebGLKernelValue { - constructor(value, settings) { - super(value, settings); - this.uploadValue = value; - } - getSource(value) { - if (this.origin === 'constants') { - return `const vec4 ${this.id} = vec4(${value[0]},${value[1]},${value[2]},${value[3]});\n`; - } - return `uniform vec4 ${this.id};\n`; - } - - getStringValueHandler() { - if (this.origin === 'constants') return ''; - return `const uploadValue_${this.name} = ${this.varName};\n`; - } - - updateValue(value) { - if (this.origin === 'constants') return; - this.kernel.setUniform4fv(this.id, this.uploadValue = value); - } -} - -module.exports = { - WebGLKernelValueArray4 -}; -},{"./index":58}],43:[function(require,module,exports){ -const { utils } = require('../../../utils'); -const { WebGLKernelValue } = require('./index'); - -class WebGLKernelValueBoolean extends WebGLKernelValue { - constructor(value, settings) { - super(value, settings); - this.uploadValue = value; - } - getSource(value) { - if (this.origin === 'constants') { - return `const bool ${this.id} = ${value};\n`; - } - return `uniform bool ${this.id};\n`; - } - - getStringValueHandler() { - return `const uploadValue_${this.name} = ${this.varName};\n`; - } - - updateValue(value) { - if (this.origin === 'constants') return; - this.kernel.setUniform1i(this.id, this.uploadValue = value); - } -} - -module.exports = { - WebGLKernelValueBoolean -}; -},{"../../../utils":113,"./index":58}],44:[function(require,module,exports){ -const { utils } = require('../../../utils'); -const { WebGLKernelValueHTMLImage } = require('./html-image'); - -class WebGLKernelValueDynamicHTMLImage extends WebGLKernelValueHTMLImage { - getSource() { - return utils.linesToString([ - `uniform sampler2D ${this.id}`, - `uniform ivec2 ${this.sizeId}`, - `uniform ivec3 ${this.dimensionsId}`, - ]); - } - - updateValue(value) { - const { width, height } = value; - this.checkSize(width, height); - this.dimensions = [width, height, 1]; - this.textureSize = [width, height]; - this.kernel.setUniform3iv(this.dimensionsId, this.dimensions); - this.kernel.setUniform2iv(this.sizeId, this.textureSize); - super.updateValue(value); - } -} - -module.exports = { - WebGLKernelValueDynamicHTMLImage -}; -},{"../../../utils":113,"./html-image":56}],45:[function(require,module,exports){ -const { WebGLKernelValueDynamicHTMLImage } = require('./dynamic-html-image'); - -class WebGLKernelValueDynamicHTMLVideo extends WebGLKernelValueDynamicHTMLImage {} - -module.exports = { - WebGLKernelValueDynamicHTMLVideo -}; -},{"./dynamic-html-image":44}],46:[function(require,module,exports){ -const { utils } = require('../../../utils'); -const { WebGLKernelValueMemoryOptimizedNumberTexture } = require('./memory-optimized-number-texture'); - -class WebGLKernelValueDynamicMemoryOptimizedNumberTexture extends WebGLKernelValueMemoryOptimizedNumberTexture { - getSource() { - return utils.linesToString([ - `uniform sampler2D ${this.id}`, - `uniform ivec2 ${this.sizeId}`, - `uniform ivec3 ${this.dimensionsId}`, - ]); - } - - updateValue(inputTexture) { - this.dimensions = inputTexture.dimensions; - this.checkSize(inputTexture.size[0], inputTexture.size[1]); - this.textureSize = inputTexture.size; - this.kernel.setUniform3iv(this.dimensionsId, this.dimensions); - this.kernel.setUniform2iv(this.sizeId, this.textureSize); - super.updateValue(inputTexture); - } -} - -module.exports = { - WebGLKernelValueDynamicMemoryOptimizedNumberTexture -}; -},{"../../../utils":113,"./memory-optimized-number-texture":60}],47:[function(require,module,exports){ -const { utils } = require('../../../utils'); -const { WebGLKernelValueNumberTexture } = require('./number-texture'); - -class WebGLKernelValueDynamicNumberTexture extends WebGLKernelValueNumberTexture { - getSource() { - return utils.linesToString([ - `uniform sampler2D ${this.id}`, - `uniform ivec2 ${this.sizeId}`, - `uniform ivec3 ${this.dimensionsId}`, - ]); - } - - updateValue(value) { - this.dimensions = value.dimensions; - this.checkSize(value.size[0], value.size[1]); - this.textureSize = value.size; - this.kernel.setUniform3iv(this.dimensionsId, this.dimensions); - this.kernel.setUniform2iv(this.sizeId, this.textureSize); - super.updateValue(value); - } -} - -module.exports = { - WebGLKernelValueDynamicNumberTexture -}; -},{"../../../utils":113,"./number-texture":61}],48:[function(require,module,exports){ -const { utils } = require('../../../utils'); -const { WebGLKernelValueSingleArray } = require('./single-array'); - -class WebGLKernelValueDynamicSingleArray extends WebGLKernelValueSingleArray { - getSource() { - return utils.linesToString([ - `uniform sampler2D ${this.id}`, - `uniform ivec2 ${this.sizeId}`, - `uniform ivec3 ${this.dimensionsId}`, - ]); - } - - updateValue(value) { - this.dimensions = utils.getDimensions(value, true); - this.textureSize = utils.getMemoryOptimizedFloatTextureSize(this.dimensions, this.bitRatio); - this.uploadArrayLength = this.textureSize[0] * this.textureSize[1] * this.bitRatio; - this.checkSize(this.textureSize[0], this.textureSize[1]); - this.uploadValue = new Float32Array(this.uploadArrayLength); - this.kernel.setUniform3iv(this.dimensionsId, this.dimensions); - this.kernel.setUniform2iv(this.sizeId, this.textureSize); - super.updateValue(value); - } -} - -module.exports = { - WebGLKernelValueDynamicSingleArray -}; -},{"../../../utils":113,"./single-array":62}],49:[function(require,module,exports){ -const { utils } = require('../../../utils'); -const { WebGLKernelValueSingleArray1DI } = require('./single-array1d-i'); - -class WebGLKernelValueDynamicSingleArray1DI extends WebGLKernelValueSingleArray1DI { - getSource() { - return utils.linesToString([ - `uniform sampler2D ${this.id}`, - `uniform ivec2 ${this.sizeId}`, - `uniform ivec3 ${this.dimensionsId}`, - ]); - } - - updateValue(value) { - this.setShape(value); - this.kernel.setUniform3iv(this.dimensionsId, this.dimensions); - this.kernel.setUniform2iv(this.sizeId, this.textureSize); - super.updateValue(value); - } -} - -module.exports = { - WebGLKernelValueDynamicSingleArray1DI -}; -},{"../../../utils":113,"./single-array1d-i":63}],50:[function(require,module,exports){ -const { utils } = require('../../../utils'); -const { WebGLKernelValueSingleArray2DI } = require('./single-array2d-i'); - -class WebGLKernelValueDynamicSingleArray2DI extends WebGLKernelValueSingleArray2DI { - getSource() { - return utils.linesToString([ - `uniform sampler2D ${this.id}`, - `uniform ivec2 ${this.sizeId}`, - `uniform ivec3 ${this.dimensionsId}`, - ]); - } - - updateValue(value) { - this.setShape(value); - this.kernel.setUniform3iv(this.dimensionsId, this.dimensions); - this.kernel.setUniform2iv(this.sizeId, this.textureSize); - super.updateValue(value); - } -} - -module.exports = { - WebGLKernelValueDynamicSingleArray2DI -}; -},{"../../../utils":113,"./single-array2d-i":64}],51:[function(require,module,exports){ -const { utils } = require('../../../utils'); -const { WebGLKernelValueSingleArray3DI } = require('./single-array3d-i'); - -class WebGLKernelValueDynamicSingleArray3DI extends WebGLKernelValueSingleArray3DI { - getSource() { - return utils.linesToString([ - `uniform sampler2D ${this.id}`, - `uniform ivec2 ${this.sizeId}`, - `uniform ivec3 ${this.dimensionsId}`, - ]); - } - - updateValue(value) { - this.setShape(value); - this.kernel.setUniform3iv(this.dimensionsId, this.dimensions); - this.kernel.setUniform2iv(this.sizeId, this.textureSize); - super.updateValue(value); - } -} - -module.exports = { - WebGLKernelValueDynamicSingleArray3DI -}; -},{"../../../utils":113,"./single-array3d-i":65}],52:[function(require,module,exports){ -const { utils } = require('../../../utils'); -const { WebGLKernelValueSingleInput } = require('./single-input'); - -class WebGLKernelValueDynamicSingleInput extends WebGLKernelValueSingleInput { - getSource() { - return utils.linesToString([ - `uniform sampler2D ${this.id}`, - `uniform ivec2 ${this.sizeId}`, - `uniform ivec3 ${this.dimensionsId}`, - ]); - } - - updateValue(value) { - let [w, h, d] = value.size; - this.dimensions = new Int32Array([w || 1, h || 1, d || 1]); - this.textureSize = utils.getMemoryOptimizedFloatTextureSize(this.dimensions, this.bitRatio); - this.uploadArrayLength = this.textureSize[0] * this.textureSize[1] * this.bitRatio; - this.checkSize(this.textureSize[0], this.textureSize[1]); - this.uploadValue = new Float32Array(this.uploadArrayLength); - this.kernel.setUniform3iv(this.dimensionsId, this.dimensions); - this.kernel.setUniform2iv(this.sizeId, this.textureSize); - super.updateValue(value); - } -} - -module.exports = { - WebGLKernelValueDynamicSingleInput -}; -},{"../../../utils":113,"./single-input":66}],53:[function(require,module,exports){ -const { utils } = require('../../../utils'); -const { WebGLKernelValueUnsignedArray } = require('./unsigned-array'); - -class WebGLKernelValueDynamicUnsignedArray extends WebGLKernelValueUnsignedArray { - getSource() { - return utils.linesToString([ - `uniform sampler2D ${this.id}`, - `uniform ivec2 ${this.sizeId}`, - `uniform ivec3 ${this.dimensionsId}`, - ]); - } - - updateValue(value) { - this.dimensions = utils.getDimensions(value, true); - this.textureSize = utils.getMemoryOptimizedPackedTextureSize(this.dimensions, this.bitRatio); - this.uploadArrayLength = this.textureSize[0] * this.textureSize[1] * (4 / this.bitRatio); - this.checkSize(this.textureSize[0], this.textureSize[1]); - const Type = this.getTransferArrayType(value); - this.preUploadValue = new Type(this.uploadArrayLength); - this.uploadValue = new Uint8Array(this.preUploadValue.buffer); - this.kernel.setUniform3iv(this.dimensionsId, this.dimensions); - this.kernel.setUniform2iv(this.sizeId, this.textureSize); - super.updateValue(value); - } -} - -module.exports = { - WebGLKernelValueDynamicUnsignedArray -}; -},{"../../../utils":113,"./unsigned-array":67}],54:[function(require,module,exports){ -const { utils } = require('../../../utils'); -const { WebGLKernelValueUnsignedInput } = require('./unsigned-input'); - -class WebGLKernelValueDynamicUnsignedInput extends WebGLKernelValueUnsignedInput { - getSource() { - return utils.linesToString([ - `uniform sampler2D ${this.id}`, - `uniform ivec2 ${this.sizeId}`, - `uniform ivec3 ${this.dimensionsId}`, - ]); - } - - updateValue(value) { - let [w, h, d] = value.size; - this.dimensions = new Int32Array([w || 1, h || 1, d || 1]); - this.textureSize = utils.getMemoryOptimizedPackedTextureSize(this.dimensions, this.bitRatio); - this.uploadArrayLength = this.textureSize[0] * this.textureSize[1] * (4 / this.bitRatio); - this.checkSize(this.textureSize[0], this.textureSize[1]); - const Type = this.getTransferArrayType(value.value); - this.preUploadValue = new Type(this.uploadArrayLength); - this.uploadValue = new Uint8Array(this.preUploadValue.buffer); - this.kernel.setUniform3iv(this.dimensionsId, this.dimensions); - this.kernel.setUniform2iv(this.sizeId, this.textureSize); - super.updateValue(value); - } -} - -module.exports = { - WebGLKernelValueDynamicUnsignedInput -}; -},{"../../../utils":113,"./unsigned-input":68}],55:[function(require,module,exports){ -const { utils } = require('../../../utils'); -const { WebGLKernelValue } = require('./index'); - -class WebGLKernelValueFloat extends WebGLKernelValue { - constructor(value, settings) { - super(value, settings); - this.uploadValue = value; - } - getStringValueHandler() { - return `const uploadValue_${this.name} = ${this.varName};\n`; - } - getSource(value) { - if (this.origin === 'constants') { - if (Number.isInteger(value)) { - return `const float ${this.id} = ${value}.0;\n`; - } - return `const float ${this.id} = ${value};\n`; - } - return `uniform float ${this.id};\n`; - } - - updateValue(value) { - if (this.origin === 'constants') return; - this.kernel.setUniform1f(this.id, this.uploadValue = value); - } -} - -module.exports = { - WebGLKernelValueFloat -}; -},{"../../../utils":113,"./index":58}],56:[function(require,module,exports){ -const { utils } = require('../../../utils'); -const { WebGLKernelArray } = require('./array'); - -class WebGLKernelValueHTMLImage extends WebGLKernelArray { - constructor(value, settings) { - super(value, settings); - const { width, height } = value; - this.checkSize(width, height); - this.dimensions = [width, height, 1]; - this.textureSize = [width, height]; - this.uploadValue = value; - } - - getStringValueHandler() { - return `const uploadValue_${this.name} = ${this.varName};\n`; - } - - getSource() { - return utils.linesToString([ - `uniform sampler2D ${this.id}`, - `ivec2 ${this.sizeId} = ivec2(${this.textureSize[0]}, ${this.textureSize[1]})`, - `ivec3 ${this.dimensionsId} = ivec3(${this.dimensions[0]}, ${this.dimensions[1]}, ${this.dimensions[2]})`, - ]); - } - - updateValue(inputImage) { - if (inputImage.constructor !== this.initialValueConstructor) { - this.onUpdateValueMismatch(inputImage.constructor); - return; - } - const { context: gl } = this; - gl.activeTexture(this.contextHandle); - gl.bindTexture(gl.TEXTURE_2D, this.texture); - gl.pixelStorei(gl.UNPACK_FLIP_Y_WEBGL, true); - gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, this.uploadValue = inputImage); - this.kernel.setUniform1i(this.id, this.index); - } -} - -module.exports = { - WebGLKernelValueHTMLImage -}; -},{"../../../utils":113,"./array":39}],57:[function(require,module,exports){ -const { WebGLKernelValueHTMLImage } = require('./html-image'); - -class WebGLKernelValueHTMLVideo extends WebGLKernelValueHTMLImage {} - -module.exports = { - WebGLKernelValueHTMLVideo -}; -},{"./html-image":56}],58:[function(require,module,exports){ -const { utils } = require('../../../utils'); -const { KernelValue } = require('../../kernel-value'); - -class WebGLKernelValue extends KernelValue { - constructor(value, settings) { - super(value, settings); - this.dimensionsId = null; - this.sizeId = null; - this.initialValueConstructor = value.constructor; - this.onRequestTexture = settings.onRequestTexture; - this.onRequestIndex = settings.onRequestIndex; - this.uploadValue = null; - this.textureSize = null; - this.bitRatio = null; - this.prevArg = null; - } - - get id() { - return `${this.origin}_${utils.sanitizeName(this.name)}`; - } - - setup() {} - - getTransferArrayType(value) { - if (Array.isArray(value[0])) { - return this.getTransferArrayType(value[0]); - } - switch (value.constructor) { - case Array: - case Int32Array: - case Int16Array: - case Int8Array: - return Float32Array; - case Uint8ClampedArray: - case Uint8Array: - case Uint16Array: - case Uint32Array: - case Float32Array: - case Float64Array: - return value.constructor; - } - console.warn('Unfamiliar constructor type. Will go ahead and use, but likley this may result in a transfer of zeros'); - return value.constructor; - } - - getStringValueHandler() { - throw new Error(`"getStringValueHandler" not implemented on ${this.constructor.name}`); - } - - getVariablePrecisionString() { - return this.kernel.getVariablePrecisionString(this.textureSize || undefined, this.tactic || undefined); - } - - destroy() {} -} - -module.exports = { - WebGLKernelValue -}; -},{"../../../utils":113,"../../kernel-value":34}],59:[function(require,module,exports){ -const { utils } = require('../../../utils'); -const { WebGLKernelValue } = require('./index'); - -class WebGLKernelValueInteger extends WebGLKernelValue { - constructor(value, settings) { - super(value, settings); - this.uploadValue = value; - } - getStringValueHandler() { - return `const uploadValue_${this.name} = ${this.varName};\n`; - } - getSource(value) { - if (this.origin === 'constants') { - return `const int ${this.id} = ${ parseInt(value) };\n`; - } - return `uniform int ${this.id};\n`; - } - - updateValue(value) { - if (this.origin === 'constants') return; - this.kernel.setUniform1i(this.id, this.uploadValue = value); - } -} - -module.exports = { - WebGLKernelValueInteger -}; -},{"../../../utils":113,"./index":58}],60:[function(require,module,exports){ -const { utils } = require('../../../utils'); -const { WebGLKernelArray } = require('./array'); - -const sameError = `Source and destination textures are the same. Use immutable = true and manually cleanup kernel output texture memory with texture.delete()`; - -class WebGLKernelValueMemoryOptimizedNumberTexture extends WebGLKernelArray { - constructor(value, settings) { - super(value, settings); - const [width, height] = value.size; - this.checkSize(width, height); - this.dimensions = value.dimensions; - this.textureSize = value.size; - this.uploadValue = value.texture; - this.forceUploadEachRun = true; - } - - setup() { - this.setupTexture(); - } - - getStringValueHandler() { - return `const uploadValue_${this.name} = ${this.varName}.texture;\n`; - } - - getSource() { - return utils.linesToString([ - `uniform sampler2D ${this.id}`, - `ivec2 ${this.sizeId} = ivec2(${this.textureSize[0]}, ${this.textureSize[1]})`, - `ivec3 ${this.dimensionsId} = ivec3(${this.dimensions[0]}, ${this.dimensions[1]}, ${this.dimensions[2]})`, - ]); - } - - updateValue(inputTexture) { - if (inputTexture.constructor !== this.initialValueConstructor) { - this.onUpdateValueMismatch(inputTexture.constructor); - return; - } - if (this.checkContext && inputTexture.context !== this.context) { - throw new Error(`Value ${this.name} (${this.type}) must be from same context`); - } - - const { kernel, context: gl } = this; - if (kernel.pipeline) { - if (kernel.immutable) { - kernel.updateTextureArgumentRefs(this, inputTexture); - } else { - if (kernel.texture && kernel.texture.texture === inputTexture.texture) { - throw new Error(sameError); - } else if (kernel.mappedTextures) { - const { mappedTextures } = kernel; - for (let i = 0; i < mappedTextures.length; i++) { - if (mappedTextures[i].texture === inputTexture.texture) { - throw new Error(sameError); - } - } - } - } - } - - gl.activeTexture(this.contextHandle); - gl.bindTexture(gl.TEXTURE_2D, this.uploadValue = inputTexture.texture); - this.kernel.setUniform1i(this.id, this.index); - } -} - -module.exports = { - WebGLKernelValueMemoryOptimizedNumberTexture, - sameError -}; -},{"../../../utils":113,"./array":39}],61:[function(require,module,exports){ -const { utils } = require('../../../utils'); -const { WebGLKernelArray } = require('./array'); -const { sameError } = require('./memory-optimized-number-texture'); - -class WebGLKernelValueNumberTexture extends WebGLKernelArray { - constructor(value, settings) { - super(value, settings); - const [width, height] = value.size; - this.checkSize(width, height); - const { size: textureSize, dimensions } = value; - this.bitRatio = this.getBitRatio(value); - this.dimensions = dimensions; - this.textureSize = textureSize; - this.uploadValue = value.texture; - this.forceUploadEachRun = true; - } - - setup() { - this.setupTexture(); - } - - getStringValueHandler() { - return `const uploadValue_${this.name} = ${this.varName}.texture;\n`; - } - - getSource() { - return utils.linesToString([ - `uniform sampler2D ${this.id}`, - `ivec2 ${this.sizeId} = ivec2(${this.textureSize[0]}, ${this.textureSize[1]})`, - `ivec3 ${this.dimensionsId} = ivec3(${this.dimensions[0]}, ${this.dimensions[1]}, ${this.dimensions[2]})`, - ]); - } - - updateValue(inputTexture) { - if (inputTexture.constructor !== this.initialValueConstructor) { - this.onUpdateValueMismatch(inputTexture.constructor); - return; - } - if (this.checkContext && inputTexture.context !== this.context) { - throw new Error(`Value ${this.name} (${this.type}) must be from same context`); - } - - const { kernel, context: gl } = this; - if (kernel.pipeline) { - if (kernel.immutable) { - kernel.updateTextureArgumentRefs(this, inputTexture); - } else { - if (kernel.texture && kernel.texture.texture === inputTexture.texture) { - throw new Error(sameError); - } else if (kernel.mappedTextures) { - const { mappedTextures } = kernel; - for (let i = 0; i < mappedTextures.length; i++) { - if (mappedTextures[i].texture === inputTexture.texture) { - throw new Error(sameError); - } - } - } - } - } - - gl.activeTexture(this.contextHandle); - gl.bindTexture(gl.TEXTURE_2D, this.uploadValue = inputTexture.texture); - this.kernel.setUniform1i(this.id, this.index); - } -} - -module.exports = { - WebGLKernelValueNumberTexture -}; -},{"../../../utils":113,"./array":39,"./memory-optimized-number-texture":60}],62:[function(require,module,exports){ -const { utils } = require('../../../utils'); -const { WebGLKernelArray } = require('./array'); - -class WebGLKernelValueSingleArray extends WebGLKernelArray { - constructor(value, settings) { - super(value, settings); - this.bitRatio = 4; - this.dimensions = utils.getDimensions(value, true); - this.textureSize = utils.getMemoryOptimizedFloatTextureSize(this.dimensions, this.bitRatio); - this.uploadArrayLength = this.textureSize[0] * this.textureSize[1] * this.bitRatio; - this.checkSize(this.textureSize[0], this.textureSize[1]); - this.uploadValue = new Float32Array(this.uploadArrayLength); - } - - getStringValueHandler() { - return utils.linesToString([ - `const uploadValue_${this.name} = new Float32Array(${this.uploadArrayLength})`, - `flattenTo(${this.varName}, uploadValue_${this.name})`, - ]); - } - - getSource() { - return utils.linesToString([ - `uniform sampler2D ${this.id}`, - `ivec2 ${this.sizeId} = ivec2(${this.textureSize[0]}, ${this.textureSize[1]})`, - `ivec3 ${this.dimensionsId} = ivec3(${this.dimensions[0]}, ${this.dimensions[1]}, ${this.dimensions[2]})`, - ]); - } - - updateValue(value) { - if (value.constructor !== this.initialValueConstructor) { - this.onUpdateValueMismatch(value.constructor); - return; - } - const { context: gl } = this; - utils.flattenTo(value, this.uploadValue); - gl.activeTexture(this.contextHandle); - gl.bindTexture(gl.TEXTURE_2D, this.texture); - gl.pixelStorei(gl.UNPACK_FLIP_Y_WEBGL, false); - gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, this.textureSize[0], this.textureSize[1], 0, gl.RGBA, gl.FLOAT, this.uploadValue); - this.kernel.setUniform1i(this.id, this.index); - } -} - -module.exports = { - WebGLKernelValueSingleArray -}; -},{"../../../utils":113,"./array":39}],63:[function(require,module,exports){ -const { utils } = require('../../../utils'); -const { WebGLKernelArray } = require('./array'); - -class WebGLKernelValueSingleArray1DI extends WebGLKernelArray { - constructor(value, settings) { - super(value, settings); - this.bitRatio = 4; - this.setShape(value); - } - - setShape(value) { - const valueDimensions = utils.getDimensions(value, true); - this.textureSize = utils.getMemoryOptimizedFloatTextureSize(valueDimensions, this.bitRatio); - this.dimensions = new Int32Array([valueDimensions[1], 1, 1]); - this.uploadArrayLength = this.textureSize[0] * this.textureSize[1] * this.bitRatio; - this.checkSize(this.textureSize[0], this.textureSize[1]); - this.uploadValue = new Float32Array(this.uploadArrayLength); - } - - getStringValueHandler() { - return utils.linesToString([ - `const uploadValue_${this.name} = new Float32Array(${this.uploadArrayLength})`, - `flattenTo(${this.varName}, uploadValue_${this.name})`, - ]); - } - - getSource() { - return utils.linesToString([ - `uniform sampler2D ${this.id}`, - `ivec2 ${this.sizeId} = ivec2(${this.textureSize[0]}, ${this.textureSize[1]})`, - `ivec3 ${this.dimensionsId} = ivec3(${this.dimensions[0]}, ${this.dimensions[1]}, ${this.dimensions[2]})`, - ]); - } - - updateValue(value) { - if (value.constructor !== this.initialValueConstructor) { - this.onUpdateValueMismatch(value.constructor); - return; - } - const { context: gl } = this; - utils.flatten2dArrayTo(value, this.uploadValue); - gl.activeTexture(this.contextHandle); - gl.bindTexture(gl.TEXTURE_2D, this.texture); - gl.pixelStorei(gl.UNPACK_FLIP_Y_WEBGL, false); - gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, this.textureSize[0], this.textureSize[1], 0, gl.RGBA, gl.FLOAT, this.uploadValue); - this.kernel.setUniform1i(this.id, this.index); - } -} - -module.exports = { - WebGLKernelValueSingleArray1DI -}; -},{"../../../utils":113,"./array":39}],64:[function(require,module,exports){ -const { utils } = require('../../../utils'); -const { WebGLKernelArray } = require('./array'); - -class WebGLKernelValueSingleArray2DI extends WebGLKernelArray { - constructor(value, settings) { - super(value, settings); - this.bitRatio = 4; - this.setShape(value); - } - - setShape(value) { - const valueDimensions = utils.getDimensions(value, true); - this.textureSize = utils.getMemoryOptimizedFloatTextureSize(valueDimensions, this.bitRatio); - this.dimensions = new Int32Array([valueDimensions[1], valueDimensions[2], 1]); - this.uploadArrayLength = this.textureSize[0] * this.textureSize[1] * this.bitRatio; - this.checkSize(this.textureSize[0], this.textureSize[1]); - this.uploadValue = new Float32Array(this.uploadArrayLength); - } - - getStringValueHandler() { - return utils.linesToString([ - `const uploadValue_${this.name} = new Float32Array(${this.uploadArrayLength})`, - `flattenTo(${this.varName}, uploadValue_${this.name})`, - ]); - } - - getSource() { - return utils.linesToString([ - `uniform sampler2D ${this.id}`, - `ivec2 ${this.sizeId} = ivec2(${this.textureSize[0]}, ${this.textureSize[1]})`, - `ivec3 ${this.dimensionsId} = ivec3(${this.dimensions[0]}, ${this.dimensions[1]}, ${this.dimensions[2]})`, - ]); - } - - updateValue(value) { - if (value.constructor !== this.initialValueConstructor) { - this.onUpdateValueMismatch(value.constructor); - return; - } - const { context: gl } = this; - utils.flatten3dArrayTo(value, this.uploadValue); - gl.activeTexture(this.contextHandle); - gl.bindTexture(gl.TEXTURE_2D, this.texture); - gl.pixelStorei(gl.UNPACK_FLIP_Y_WEBGL, false); - gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, this.textureSize[0], this.textureSize[1], 0, gl.RGBA, gl.FLOAT, this.uploadValue); - this.kernel.setUniform1i(this.id, this.index); - } -} - -module.exports = { - WebGLKernelValueSingleArray2DI -}; -},{"../../../utils":113,"./array":39}],65:[function(require,module,exports){ -const { utils } = require('../../../utils'); -const { WebGLKernelArray } = require('./array'); - -class WebGLKernelValueSingleArray3DI extends WebGLKernelArray { - constructor(value, settings) { - super(value, settings); - this.bitRatio = 4; - this.setShape(value); - } - - setShape(value) { - const valueDimensions = utils.getDimensions(value, true); - this.textureSize = utils.getMemoryOptimizedFloatTextureSize(valueDimensions, this.bitRatio); - this.dimensions = new Int32Array([valueDimensions[1], valueDimensions[2], valueDimensions[3]]); - this.uploadArrayLength = this.textureSize[0] * this.textureSize[1] * this.bitRatio; - this.checkSize(this.textureSize[0], this.textureSize[1]); - this.uploadValue = new Float32Array(this.uploadArrayLength); - } - - getStringValueHandler() { - return utils.linesToString([ - `const uploadValue_${this.name} = new Float32Array(${this.uploadArrayLength})`, - `flattenTo(${this.varName}, uploadValue_${this.name})`, - ]); - } - - getSource() { - return utils.linesToString([ - `uniform sampler2D ${this.id}`, - `ivec2 ${this.sizeId} = ivec2(${this.textureSize[0]}, ${this.textureSize[1]})`, - `ivec3 ${this.dimensionsId} = ivec3(${this.dimensions[0]}, ${this.dimensions[1]}, ${this.dimensions[2]})`, - ]); - } - - updateValue(value) { - if (value.constructor !== this.initialValueConstructor) { - this.onUpdateValueMismatch(value.constructor); - return; - } - const { context: gl } = this; - utils.flatten4dArrayTo(value, this.uploadValue); - gl.activeTexture(this.contextHandle); - gl.bindTexture(gl.TEXTURE_2D, this.texture); - gl.pixelStorei(gl.UNPACK_FLIP_Y_WEBGL, false); - gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, this.textureSize[0], this.textureSize[1], 0, gl.RGBA, gl.FLOAT, this.uploadValue); - this.kernel.setUniform1i(this.id, this.index); - } -} - -module.exports = { - WebGLKernelValueSingleArray3DI -}; -},{"../../../utils":113,"./array":39}],66:[function(require,module,exports){ -const { utils } = require('../../../utils'); -const { WebGLKernelArray } = require('./array'); - -class WebGLKernelValueSingleInput extends WebGLKernelArray { - constructor(value, settings) { - super(value, settings); - this.bitRatio = 4; - let [w, h, d] = value.size; - this.dimensions = new Int32Array([w || 1, h || 1, d || 1]); - this.textureSize = utils.getMemoryOptimizedFloatTextureSize(this.dimensions, this.bitRatio); - this.uploadArrayLength = this.textureSize[0] * this.textureSize[1] * this.bitRatio; - this.checkSize(this.textureSize[0], this.textureSize[1]); - this.uploadValue = new Float32Array(this.uploadArrayLength); - } - - getStringValueHandler() { - return utils.linesToString([ - `const uploadValue_${this.name} = new Float32Array(${this.uploadArrayLength})`, - `flattenTo(${this.varName}.value, uploadValue_${this.name})`, - ]); - } - - getSource() { - return utils.linesToString([ - `uniform sampler2D ${this.id}`, - `ivec2 ${this.sizeId} = ivec2(${this.textureSize[0]}, ${this.textureSize[1]})`, - `ivec3 ${this.dimensionsId} = ivec3(${this.dimensions[0]}, ${this.dimensions[1]}, ${this.dimensions[2]})`, - ]); - } - - updateValue(input) { - if (input.constructor !== this.initialValueConstructor) { - this.onUpdateValueMismatch(input.constructor); - return; - } - const { context: gl } = this; - utils.flattenTo(input.value, this.uploadValue); - gl.activeTexture(this.contextHandle); - gl.bindTexture(gl.TEXTURE_2D, this.texture); - gl.pixelStorei(gl.UNPACK_FLIP_Y_WEBGL, false); - gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, this.textureSize[0], this.textureSize[1], 0, gl.RGBA, gl.FLOAT, this.uploadValue); - this.kernel.setUniform1i(this.id, this.index); - } -} - -module.exports = { - WebGLKernelValueSingleInput -}; -},{"../../../utils":113,"./array":39}],67:[function(require,module,exports){ -const { utils } = require('../../../utils'); -const { WebGLKernelArray } = require('./array'); - -class WebGLKernelValueUnsignedArray extends WebGLKernelArray { - constructor(value, settings) { - super(value, settings); - this.bitRatio = this.getBitRatio(value); - this.dimensions = utils.getDimensions(value, true); - this.textureSize = utils.getMemoryOptimizedPackedTextureSize(this.dimensions, this.bitRatio); - this.uploadArrayLength = this.textureSize[0] * this.textureSize[1] * (4 / this.bitRatio); - this.checkSize(this.textureSize[0], this.textureSize[1]); - this.TranserArrayType = this.getTransferArrayType(value); - this.preUploadValue = new this.TranserArrayType(this.uploadArrayLength); - this.uploadValue = new Uint8Array(this.preUploadValue.buffer); - } - - getStringValueHandler() { - return utils.linesToString([ - `const preUploadValue_${this.name} = new ${this.TranserArrayType.name}(${this.uploadArrayLength})`, - `const uploadValue_${this.name} = new Uint8Array(preUploadValue_${this.name}.buffer)`, - `flattenTo(${this.varName}, preUploadValue_${this.name})`, - ]); - } - - getSource() { - return utils.linesToString([ - `uniform sampler2D ${this.id}`, - `ivec2 ${this.sizeId} = ivec2(${this.textureSize[0]}, ${this.textureSize[1]})`, - `ivec3 ${this.dimensionsId} = ivec3(${this.dimensions[0]}, ${this.dimensions[1]}, ${this.dimensions[2]})`, - ]); - } - - updateValue(value) { - if (value.constructor !== this.initialValueConstructor) { - this.onUpdateValueMismatch(value.constructor); - return; - } - const { context: gl } = this; - utils.flattenTo(value, this.preUploadValue); - gl.activeTexture(this.contextHandle); - gl.bindTexture(gl.TEXTURE_2D, this.texture); - gl.pixelStorei(gl.UNPACK_FLIP_Y_WEBGL, false); - gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, this.textureSize[0], this.textureSize[1], 0, gl.RGBA, gl.UNSIGNED_BYTE, this.uploadValue); - this.kernel.setUniform1i(this.id, this.index); - } -} - -module.exports = { - WebGLKernelValueUnsignedArray -}; -},{"../../../utils":113,"./array":39}],68:[function(require,module,exports){ -const { utils } = require('../../../utils'); -const { WebGLKernelArray } = require('./array'); - -class WebGLKernelValueUnsignedInput extends WebGLKernelArray { - constructor(value, settings) { - super(value, settings); - this.bitRatio = this.getBitRatio(value); - const [w, h, d] = value.size; - this.dimensions = new Int32Array([w || 1, h || 1, d || 1]); - this.textureSize = utils.getMemoryOptimizedPackedTextureSize(this.dimensions, this.bitRatio); - this.uploadArrayLength = this.textureSize[0] * this.textureSize[1] * (4 / this.bitRatio); - this.checkSize(this.textureSize[0], this.textureSize[1]); - this.TranserArrayType = this.getTransferArrayType(value.value); - this.preUploadValue = new this.TranserArrayType(this.uploadArrayLength); - this.uploadValue = new Uint8Array(this.preUploadValue.buffer); - } - - getStringValueHandler() { - return utils.linesToString([ - `const preUploadValue_${this.name} = new ${this.TranserArrayType.name}(${this.uploadArrayLength})`, - `const uploadValue_${this.name} = new Uint8Array(preUploadValue_${this.name}.buffer)`, - `flattenTo(${this.varName}.value, preUploadValue_${this.name})`, - ]); - } - - getSource() { - return utils.linesToString([ - `uniform sampler2D ${this.id}`, - `ivec2 ${this.sizeId} = ivec2(${this.textureSize[0]}, ${this.textureSize[1]})`, - `ivec3 ${this.dimensionsId} = ivec3(${this.dimensions[0]}, ${this.dimensions[1]}, ${this.dimensions[2]})`, - ]); - } - - updateValue(input) { - if (input.constructor !== this.initialValueConstructor) { - this.onUpdateValueMismatch(value.constructor); - return; - } - const { context: gl } = this; - utils.flattenTo(input.value, this.preUploadValue); - gl.activeTexture(this.contextHandle); - gl.bindTexture(gl.TEXTURE_2D, this.texture); - gl.pixelStorei(gl.UNPACK_FLIP_Y_WEBGL, false); - gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, this.textureSize[0], this.textureSize[1], 0, gl.RGBA, gl.UNSIGNED_BYTE, this.uploadValue); - this.kernel.setUniform1i(this.id, this.index); - } -} - -module.exports = { - WebGLKernelValueUnsignedInput -}; -},{"../../../utils":113,"./array":39}],69:[function(require,module,exports){ -const { GLKernel } = require('../gl/kernel'); -const { FunctionBuilder } = require('../function-builder'); -const { WebGLFunctionNode } = require('./function-node'); -const { utils } = require('../../utils'); -const mrud = require('../../plugins/math-random-uniformly-distributed'); -const { fragmentShader } = require('./fragment-shader'); -const { vertexShader } = require('./vertex-shader'); -const { glKernelString } = require('../gl/kernel-string'); -const { lookupKernelValueType } = require('./kernel-value-maps'); - -let isSupported = null; -let testCanvas = null; -let testContext = null; -let testExtensions = null; -let features = null; - -const plugins = [mrud]; -const canvases = []; -const maxTexSizes = {}; - - -class WebGLKernel extends GLKernel { - static get isSupported() { - if (isSupported !== null) { - return isSupported; - } - this.setupFeatureChecks(); - isSupported = this.isContextMatch(testContext); - return isSupported; - } - - static setupFeatureChecks() { - if (typeof document !== 'undefined') { - testCanvas = document.createElement('canvas'); - } else if (typeof OffscreenCanvas !== 'undefined') { - testCanvas = new OffscreenCanvas(0, 0); - } - if (!testCanvas) return; - testContext = testCanvas.getContext('webgl') || testCanvas.getContext('experimental-webgl'); - if (!testContext || !testContext.getExtension) return; - testExtensions = { - OES_texture_float: testContext.getExtension('OES_texture_float'), - OES_texture_float_linear: testContext.getExtension('OES_texture_float_linear'), - OES_element_index_uint: testContext.getExtension('OES_element_index_uint'), - WEBGL_draw_buffers: testContext.getExtension('WEBGL_draw_buffers'), - }; - features = this.getFeatures(); - } - - static isContextMatch(context) { - if (typeof WebGLRenderingContext !== 'undefined') { - return context instanceof WebGLRenderingContext; - } - return false; - } - - static getIsTextureFloat() { - return Boolean(testExtensions.OES_texture_float); - } - - static getIsDrawBuffers() { - return Boolean(testExtensions.WEBGL_draw_buffers); - } - - static getChannelCount() { - return testExtensions.WEBGL_draw_buffers ? - testContext.getParameter(testExtensions.WEBGL_draw_buffers.MAX_DRAW_BUFFERS_WEBGL) : - 1; - } - - static getMaxTextureSize() { - return testContext.getParameter(testContext.MAX_TEXTURE_SIZE); - } - - static lookupKernelValueType(type, dynamic, precision, value) { - return lookupKernelValueType(type, dynamic, precision, value); - } - - static get testCanvas() { - return testCanvas; - } - - static get testContext() { - return testContext; - } - - static get features() { - return features; - } - - static get fragmentShader() { - return fragmentShader; - } - - static get vertexShader() { - return vertexShader; - } - - constructor(source, settings) { - super(source, settings); - this.program = null; - this.pipeline = settings.pipeline; - this.endianness = utils.systemEndianness(); - this.extensions = {}; - this.argumentTextureCount = 0; - this.constantTextureCount = 0; - this.fragShader = null; - this.vertShader = null; - this.drawBuffersMap = null; - - this.maxTexSize = null; - this.onRequestSwitchKernel = null; - - this.texture = null; - this.mappedTextures = null; - this.mergeSettings(source.settings || settings); - - this.threadDim = null; - this.framebuffer = null; - this.buffer = null; - - this.textureCache = []; - this.programUniformLocationCache = {}; - this.uniform1fCache = {}; - this.uniform1iCache = {}; - this.uniform2fCache = {}; - this.uniform2fvCache = {}; - this.uniform2ivCache = {}; - this.uniform3fvCache = {}; - this.uniform3ivCache = {}; - this.uniform4fvCache = {}; - this.uniform4ivCache = {}; - } - - initCanvas() { - if (typeof document !== 'undefined') { - const canvas = document.createElement('canvas'); - canvas.width = 2; - canvas.height = 2; - return canvas; - } else if (typeof OffscreenCanvas !== 'undefined') { - return new OffscreenCanvas(0, 0); - } - } - - initContext() { - const settings = { - alpha: false, - depth: false, - antialias: false - }; - return this.canvas.getContext('webgl', settings) || this.canvas.getContext('experimental-webgl', settings); - } - - initPlugins(settings) { - const pluginsToUse = []; - const { source } = this; - if (typeof source === 'string') { - for (let i = 0; i < plugins.length; i++) { - const plugin = plugins[i]; - if (source.match(plugin.functionMatch)) { - pluginsToUse.push(plugin); - } - } - } else if (typeof source === 'object') { - if (settings.pluginNames) { - for (let i = 0; i < plugins.length; i++) { - const plugin = plugins[i]; - const usePlugin = settings.pluginNames.some(pluginName => pluginName === plugin.name); - if (usePlugin) { - pluginsToUse.push(plugin); - } - } - } - } - return pluginsToUse; - } - - initExtensions() { - this.extensions = { - OES_texture_float: this.context.getExtension('OES_texture_float'), - OES_texture_float_linear: this.context.getExtension('OES_texture_float_linear'), - OES_element_index_uint: this.context.getExtension('OES_element_index_uint'), - WEBGL_draw_buffers: this.context.getExtension('WEBGL_draw_buffers'), - WEBGL_color_buffer_float: this.context.getExtension('WEBGL_color_buffer_float'), - }; - } - - validateSettings(args) { - if (!this.validate) { - this.texSize = utils.getKernelTextureSize({ - optimizeFloatMemory: this.optimizeFloatMemory, - precision: this.precision, - }, this.output); - return; - } - - const { features } = this.constructor; - - if (this.optimizeFloatMemory === true && !features.isTextureFloat) { - throw new Error('Float textures are not supported'); - } else if (this.precision === 'single' && !features.isFloatRead) { - throw new Error('Single precision not supported'); - } else if (!this.graphical && this.precision === null && features.isTextureFloat) { - this.precision = features.isFloatRead ? 'single' : 'unsigned'; - } - - if (this.subKernels && this.subKernels.length > 0 && !this.extensions.WEBGL_draw_buffers) { - throw new Error('could not instantiate draw buffers extension'); - } - - if (this.fixIntegerDivisionAccuracy === null) { - this.fixIntegerDivisionAccuracy = !features.isIntegerDivisionAccurate; - } else if (this.fixIntegerDivisionAccuracy && features.isIntegerDivisionAccurate) { - this.fixIntegerDivisionAccuracy = false; - } - - this.checkOutput(); - - if (!this.output || this.output.length === 0) { - if (args.length !== 1) { - throw new Error('Auto output only supported for kernels with only one input'); - } - - const argType = utils.getVariableType(args[0], this.strictIntegers); - switch (argType) { - case 'Array': - this.output = utils.getDimensions(argType); - break; - case 'NumberTexture': - case 'MemoryOptimizedNumberTexture': - case 'ArrayTexture(1)': - case 'ArrayTexture(2)': - case 'ArrayTexture(3)': - case 'ArrayTexture(4)': - this.output = args[0].output; - break; - default: - throw new Error('Auto output not supported for input type: ' + argType); - } - } - - if (this.graphical) { - if (this.output.length !== 2) { - throw new Error('Output must have 2 dimensions on graphical mode'); - } - - if (this.precision === 'precision') { - this.precision = 'unsigned'; - console.warn('Cannot use graphical mode and single precision at the same time'); - } - - this.texSize = utils.clone(this.output); - return; - } else if (this.precision === null && features.isTextureFloat) { - this.precision = 'single'; - } - - this.texSize = utils.getKernelTextureSize({ - optimizeFloatMemory: this.optimizeFloatMemory, - precision: this.precision, - }, this.output); - - this.checkTextureSize(); - } - - updateMaxTexSize() { - const { texSize, canvas } = this; - if (this.maxTexSize === null) { - let canvasIndex = canvases.indexOf(canvas); - if (canvasIndex === -1) { - canvasIndex = canvases.length; - canvases.push(canvas); - maxTexSizes[canvasIndex] = [texSize[0], texSize[1]]; - } - this.maxTexSize = maxTexSizes[canvasIndex]; - } - if (this.maxTexSize[0] < texSize[0]) { - this.maxTexSize[0] = texSize[0]; - } - if (this.maxTexSize[1] < texSize[1]) { - this.maxTexSize[1] = texSize[1]; - } - } - - setupArguments(args) { - this.kernelArguments = []; - this.argumentTextureCount = 0; - const needsArgumentTypes = this.argumentTypes === null; - if (needsArgumentTypes) { - this.argumentTypes = []; - } - this.argumentSizes = []; - this.argumentBitRatios = []; - - if (args.length < this.argumentNames.length) { - throw new Error('not enough arguments for kernel'); - } else if (args.length > this.argumentNames.length) { - throw new Error('too many arguments for kernel'); - } - - const { context: gl } = this; - let textureIndexes = 0; - - const onRequestTexture = () => { - return this.createTexture(); - }; - const onRequestIndex = () => { - return this.constantTextureCount + textureIndexes++; - }; - const onUpdateValueMismatch = (constructor) => { - this.switchKernels({ - type: 'argumentMismatch', - needed: constructor - }); - }; - const onRequestContextHandle = () => { - return gl.TEXTURE0 + this.constantTextureCount + this.argumentTextureCount++; - }; - - for (let index = 0; index < args.length; index++) { - const value = args[index]; - const name = this.argumentNames[index]; - let type; - if (needsArgumentTypes) { - type = utils.getVariableType(value, this.strictIntegers); - this.argumentTypes.push(type); - } else { - type = this.argumentTypes[index]; - } - const KernelValue = this.constructor.lookupKernelValueType(type, this.dynamicArguments ? 'dynamic' : 'static', this.precision, args[index]); - if (KernelValue === null) { - return this.requestFallback(args); - } - const kernelArgument = new KernelValue(value, { - name, - type, - tactic: this.tactic, - origin: 'user', - context: gl, - checkContext: this.checkContext, - kernel: this, - strictIntegers: this.strictIntegers, - onRequestTexture, - onRequestIndex, - onUpdateValueMismatch, - onRequestContextHandle, - }); - this.kernelArguments.push(kernelArgument); - kernelArgument.setup(); - this.argumentSizes.push(kernelArgument.textureSize); - this.argumentBitRatios[index] = kernelArgument.bitRatio; - } - } - - createTexture() { - const texture = this.context.createTexture(); - this.textureCache.push(texture); - return texture; - } - - setupConstants(args) { - const { context: gl } = this; - this.kernelConstants = []; - this.forceUploadKernelConstants = []; - let needsConstantTypes = this.constantTypes === null; - if (needsConstantTypes) { - this.constantTypes = {}; - } - this.constantBitRatios = {}; - let textureIndexes = 0; - for (const name in this.constants) { - const value = this.constants[name]; - let type; - if (needsConstantTypes) { - type = utils.getVariableType(value, this.strictIntegers); - this.constantTypes[name] = type; - } else { - type = this.constantTypes[name]; - } - const KernelValue = this.constructor.lookupKernelValueType(type, 'static', this.precision, value); - if (KernelValue === null) { - return this.requestFallback(args); - } - const kernelValue = new KernelValue(value, { - name, - type, - tactic: this.tactic, - origin: 'constants', - context: this.context, - checkContext: this.checkContext, - kernel: this, - strictIntegers: this.strictIntegers, - onRequestTexture: () => { - return this.createTexture(); - }, - onRequestIndex: () => { - return textureIndexes++; - }, - onRequestContextHandle: () => { - return gl.TEXTURE0 + this.constantTextureCount++; - } - }); - this.constantBitRatios[name] = kernelValue.bitRatio; - this.kernelConstants.push(kernelValue); - kernelValue.setup(); - if (kernelValue.forceUploadEachRun) { - this.forceUploadKernelConstants.push(kernelValue); - } - } - } - - build() { - if (this.built) return; - this.initExtensions(); - this.validateSettings(arguments); - this.setupConstants(arguments); - if (this.fallbackRequested) return; - this.setupArguments(arguments); - if (this.fallbackRequested) return; - this.updateMaxTexSize(); - this.translateSource(); - const failureResult = this.pickRenderStrategy(arguments); - if (failureResult) { - return failureResult; - } - const { texSize, context: gl, canvas } = this; - gl.enable(gl.SCISSOR_TEST); - if (this.pipeline && this.precision === 'single') { - gl.viewport(0, 0, this.maxTexSize[0], this.maxTexSize[1]); - canvas.width = this.maxTexSize[0]; - canvas.height = this.maxTexSize[1]; - } else { - gl.viewport(0, 0, this.maxTexSize[0], this.maxTexSize[1]); - canvas.width = this.maxTexSize[0]; - canvas.height = this.maxTexSize[1]; - } - const threadDim = this.threadDim = Array.from(this.output); - while (threadDim.length < 3) { - threadDim.push(1); - } - - const compiledVertexShader = this.getVertexShader(arguments); - const vertShader = gl.createShader(gl.VERTEX_SHADER); - gl.shaderSource(vertShader, compiledVertexShader); - gl.compileShader(vertShader); - this.vertShader = vertShader; - - const compiledFragmentShader = this.getFragmentShader(arguments); - const fragShader = gl.createShader(gl.FRAGMENT_SHADER); - gl.shaderSource(fragShader, compiledFragmentShader); - gl.compileShader(fragShader); - this.fragShader = fragShader; - - if (this.debug) { - console.log('GLSL Shader Output:'); - console.log(compiledFragmentShader); - } - - if (!gl.getShaderParameter(vertShader, gl.COMPILE_STATUS)) { - throw new Error('Error compiling vertex shader: ' + gl.getShaderInfoLog(vertShader)); - } - if (!gl.getShaderParameter(fragShader, gl.COMPILE_STATUS)) { - throw new Error('Error compiling fragment shader: ' + gl.getShaderInfoLog(fragShader)); - } - - const program = this.program = gl.createProgram(); - gl.attachShader(program, vertShader); - gl.attachShader(program, fragShader); - gl.linkProgram(program); - this.framebuffer = gl.createFramebuffer(); - this.framebuffer.width = texSize[0]; - this.framebuffer.height = texSize[1]; - this.rawValueFramebuffers = {}; - - const vertices = new Float32Array([-1, -1, - 1, -1, -1, 1, - 1, 1 - ]); - const texCoords = new Float32Array([ - 0, 0, - 1, 0, - 0, 1, - 1, 1 - ]); - - const texCoordOffset = vertices.byteLength; - - let buffer = this.buffer; - if (!buffer) { - buffer = this.buffer = gl.createBuffer(); - gl.bindBuffer(gl.ARRAY_BUFFER, buffer); - gl.bufferData(gl.ARRAY_BUFFER, vertices.byteLength + texCoords.byteLength, gl.STATIC_DRAW); - } else { - gl.bindBuffer(gl.ARRAY_BUFFER, buffer); - } - - gl.bufferSubData(gl.ARRAY_BUFFER, 0, vertices); - gl.bufferSubData(gl.ARRAY_BUFFER, texCoordOffset, texCoords); - - const aPosLoc = gl.getAttribLocation(this.program, 'aPos'); - gl.enableVertexAttribArray(aPosLoc); - gl.vertexAttribPointer(aPosLoc, 2, gl.FLOAT, false, 0, 0); - const aTexCoordLoc = gl.getAttribLocation(this.program, 'aTexCoord'); - gl.enableVertexAttribArray(aTexCoordLoc); - gl.vertexAttribPointer(aTexCoordLoc, 2, gl.FLOAT, false, 0, texCoordOffset); - gl.bindFramebuffer(gl.FRAMEBUFFER, this.framebuffer); - - let i = 0; - gl.useProgram(this.program); - for (let p in this.constants) { - this.kernelConstants[i++].updateValue(this.constants[p]); - } - - this._setupOutputTexture(); - if ( - this.subKernels !== null && - this.subKernels.length > 0 - ) { - this._mappedTextureSwitched = {}; - this._setupSubOutputTextures(); - } - this.buildSignature(arguments); - this.built = true; - } - - translateSource() { - const functionBuilder = FunctionBuilder.fromKernel(this, WebGLFunctionNode, { - fixIntegerDivisionAccuracy: this.fixIntegerDivisionAccuracy - }); - this.translatedSource = functionBuilder.getPrototypeString('kernel'); - this.setupReturnTypes(functionBuilder); - } - - setupReturnTypes(functionBuilder) { - if (!this.graphical && !this.returnType) { - this.returnType = functionBuilder.getKernelResultType(); - } - - if (this.subKernels && this.subKernels.length > 0) { - for (let i = 0; i < this.subKernels.length; i++) { - const subKernel = this.subKernels[i]; - if (!subKernel.returnType) { - subKernel.returnType = functionBuilder.getSubKernelResultType(i); - } - } - } - } - - run() { - const { kernelArguments, texSize, forceUploadKernelConstants, context: gl } = this; - - gl.useProgram(this.program); - gl.scissor(0, 0, texSize[0], texSize[1]); - if (this.dynamicOutput) { - this.setUniform3iv('uOutputDim', new Int32Array(this.threadDim)); - this.setUniform2iv('uTexSize', texSize); - } - - this.setUniform2f('ratio', texSize[0] / this.maxTexSize[0], texSize[1] / this.maxTexSize[1]); - - for (let i = 0; i < forceUploadKernelConstants.length; i++) { - const constant = forceUploadKernelConstants[i]; - constant.updateValue(this.constants[constant.name]); - if (this.switchingKernels) return; - } - for (let i = 0; i < kernelArguments.length; i++) { - kernelArguments[i].updateValue(arguments[i]); - if (this.switchingKernels) return; - } - - if (this.plugins) { - for (let i = 0; i < this.plugins.length; i++) { - const plugin = this.plugins[i]; - if (plugin.onBeforeRun) { - plugin.onBeforeRun(this); - } - } - } - - if (this.graphical) { - if (this.pipeline) { - gl.bindRenderbuffer(gl.RENDERBUFFER, null); - gl.bindFramebuffer(gl.FRAMEBUFFER, this.framebuffer); - if (this.immutable) { - this._replaceOutputTexture(); - } - gl.drawArrays(gl.TRIANGLE_STRIP, 0, 4); - return this.immutable ? this.texture.clone() : this.texture; - } - gl.bindRenderbuffer(gl.RENDERBUFFER, null); - gl.bindFramebuffer(gl.FRAMEBUFFER, null); - gl.drawArrays(gl.TRIANGLE_STRIP, 0, 4); - return; - } - - gl.bindFramebuffer(gl.FRAMEBUFFER, this.framebuffer); - if (this.immutable) { - this._replaceOutputTexture(); - } - - if (this.subKernels !== null) { - if (this.immutable) { - this._replaceSubOutputTextures(); - } - this.drawBuffers(); - } - - gl.drawArrays(gl.TRIANGLE_STRIP, 0, 4); - } - - drawBuffers() { - this.extensions.WEBGL_draw_buffers.drawBuffersWEBGL(this.drawBuffersMap); - } - - getInternalFormat() { - return this.context.RGBA; - } - getTextureFormat() { - const { context: gl } = this; - switch (this.getInternalFormat()) { - case gl.RGBA: - return gl.RGBA; - default: - throw new Error('Unknown internal format'); - } - } - - _replaceOutputTexture() { - if (this.texture.beforeMutate() || this._textureSwitched) { - const gl = this.context; - gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.texture.texture, 0); - this._textureSwitched = false; - } - } - - _setupOutputTexture() { - const gl = this.context; - const texSize = this.texSize; - if (this.texture) { - gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.texture.texture, 0); - return; - } - const texture = this.createTexture(); - gl.activeTexture(gl.TEXTURE0 + this.constantTextureCount + this.argumentTextureCount); - gl.bindTexture(gl.TEXTURE_2D, texture); - gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE); - gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE); - gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.NEAREST); - gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.NEAREST); - const format = this.getInternalFormat(); - if (this.precision === 'single') { - gl.texImage2D(gl.TEXTURE_2D, 0, format, texSize[0], texSize[1], 0, gl.RGBA, gl.FLOAT, null); - } else { - gl.texImage2D(gl.TEXTURE_2D, 0, format, texSize[0], texSize[1], 0, format, gl.UNSIGNED_BYTE, null); - } - gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, texture, 0); - this.texture = new this.TextureConstructor({ - texture, - size: texSize, - dimensions: this.threadDim, - output: this.output, - context: this.context, - internalFormat: this.getInternalFormat(), - textureFormat: this.getTextureFormat(), - kernel: this, - }); - } - - _replaceSubOutputTextures() { - const gl = this.context; - for (let i = 0; i < this.mappedTextures.length; i++) { - const mappedTexture = this.mappedTextures[i]; - if (mappedTexture.beforeMutate() || this._mappedTextureSwitched[i]) { - gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0 + i + 1, gl.TEXTURE_2D, mappedTexture.texture, 0); - this._mappedTextureSwitched[i] = false; - } - } - } - - _setupSubOutputTextures() { - const gl = this.context; - if (this.mappedTextures) { - for (let i = 0; i < this.subKernels.length; i++) { - gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0 + i + 1, gl.TEXTURE_2D, this.mappedTextures[i].texture, 0); - } - return; - } - const texSize = this.texSize; - this.drawBuffersMap = [gl.COLOR_ATTACHMENT0]; - this.mappedTextures = []; - for (let i = 0; i < this.subKernels.length; i++) { - const texture = this.createTexture(); - this.drawBuffersMap.push(gl.COLOR_ATTACHMENT0 + i + 1); - gl.activeTexture(gl.TEXTURE0 + this.constantTextureCount + this.argumentTextureCount + i); - gl.bindTexture(gl.TEXTURE_2D, texture); - gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE); - gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE); - gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.NEAREST); - gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.NEAREST); - if (this.precision === 'single') { - gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, texSize[0], texSize[1], 0, gl.RGBA, gl.FLOAT, null); - } else { - gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, texSize[0], texSize[1], 0, gl.RGBA, gl.UNSIGNED_BYTE, null); - } - gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0 + i + 1, gl.TEXTURE_2D, texture, 0); - - this.mappedTextures.push(new this.TextureConstructor({ - texture, - size: texSize, - dimensions: this.threadDim, - output: this.output, - context: this.context, - internalFormat: this.getInternalFormat(), - textureFormat: this.getTextureFormat(), - kernel: this, - })); - } - } - - setUniform1f(name, value) { - if (this.uniform1fCache.hasOwnProperty(name)) { - const cache = this.uniform1fCache[name]; - if (value === cache) { - return; - } - } - this.uniform1fCache[name] = value; - const loc = this.getUniformLocation(name); - this.context.uniform1f(loc, value); - } - - setUniform1i(name, value) { - if (this.uniform1iCache.hasOwnProperty(name)) { - const cache = this.uniform1iCache[name]; - if (value === cache) { - return; - } - } - this.uniform1iCache[name] = value; - const loc = this.getUniformLocation(name); - this.context.uniform1i(loc, value); - } - - setUniform2f(name, value1, value2) { - if (this.uniform2fCache.hasOwnProperty(name)) { - const cache = this.uniform2fCache[name]; - if ( - value1 === cache[0] && - value2 === cache[1] - ) { - return; - } - } - this.uniform2fCache[name] = [value1, value2]; - const loc = this.getUniformLocation(name); - this.context.uniform2f(loc, value1, value2); - } - - setUniform2fv(name, value) { - if (this.uniform2fvCache.hasOwnProperty(name)) { - const cache = this.uniform2fvCache[name]; - if ( - value[0] === cache[0] && - value[1] === cache[1] - ) { - return; - } - } - this.uniform2fvCache[name] = value; - const loc = this.getUniformLocation(name); - this.context.uniform2fv(loc, value); - } - - setUniform2iv(name, value) { - if (this.uniform2ivCache.hasOwnProperty(name)) { - const cache = this.uniform2ivCache[name]; - if ( - value[0] === cache[0] && - value[1] === cache[1] - ) { - return; - } - } - this.uniform2ivCache[name] = value; - const loc = this.getUniformLocation(name); - this.context.uniform2iv(loc, value); - } - - setUniform3fv(name, value) { - if (this.uniform3fvCache.hasOwnProperty(name)) { - const cache = this.uniform3fvCache[name]; - if ( - value[0] === cache[0] && - value[1] === cache[1] && - value[2] === cache[2] - ) { - return; - } - } - this.uniform3fvCache[name] = value; - const loc = this.getUniformLocation(name); - this.context.uniform3fv(loc, value); - } - - setUniform3iv(name, value) { - if (this.uniform3ivCache.hasOwnProperty(name)) { - const cache = this.uniform3ivCache[name]; - if ( - value[0] === cache[0] && - value[1] === cache[1] && - value[2] === cache[2] - ) { - return; - } - } - this.uniform3ivCache[name] = value; - const loc = this.getUniformLocation(name); - this.context.uniform3iv(loc, value); - } - - setUniform4fv(name, value) { - if (this.uniform4fvCache.hasOwnProperty(name)) { - const cache = this.uniform4fvCache[name]; - if ( - value[0] === cache[0] && - value[1] === cache[1] && - value[2] === cache[2] && - value[3] === cache[3] - ) { - return; - } - } - this.uniform4fvCache[name] = value; - const loc = this.getUniformLocation(name); - this.context.uniform4fv(loc, value); - } - - setUniform4iv(name, value) { - if (this.uniform4ivCache.hasOwnProperty(name)) { - const cache = this.uniform4ivCache[name]; - if ( - value[0] === cache[0] && - value[1] === cache[1] && - value[2] === cache[2] && - value[3] === cache[3] - ) { - return; - } - } - this.uniform4ivCache[name] = value; - const loc = this.getUniformLocation(name); - this.context.uniform4iv(loc, value); - } - - getUniformLocation(name) { - if (this.programUniformLocationCache.hasOwnProperty(name)) { - return this.programUniformLocationCache[name]; - } - return this.programUniformLocationCache[name] = this.context.getUniformLocation(this.program, name); - } - - _getFragShaderArtifactMap(args) { - return { - HEADER: this._getHeaderString(), - LOOP_MAX: this._getLoopMaxString(), - PLUGINS: this._getPluginsString(), - CONSTANTS: this._getConstantsString(), - DECODE32_ENDIANNESS: this._getDecode32EndiannessString(), - ENCODE32_ENDIANNESS: this._getEncode32EndiannessString(), - DIVIDE_WITH_INTEGER_CHECK: this._getDivideWithIntegerCheckString(), - INJECTED_NATIVE: this._getInjectedNative(), - MAIN_CONSTANTS: this._getMainConstantsString(), - MAIN_ARGUMENTS: this._getMainArgumentsString(args), - KERNEL: this.getKernelString(), - MAIN_RESULT: this.getMainResultString(), - FLOAT_TACTIC_DECLARATION: this.getFloatTacticDeclaration(), - INT_TACTIC_DECLARATION: this.getIntTacticDeclaration(), - SAMPLER_2D_TACTIC_DECLARATION: this.getSampler2DTacticDeclaration(), - SAMPLER_2D_ARRAY_TACTIC_DECLARATION: this.getSampler2DArrayTacticDeclaration(), - }; - } - - _getVertShaderArtifactMap(args) { - return { - FLOAT_TACTIC_DECLARATION: this.getFloatTacticDeclaration(), - INT_TACTIC_DECLARATION: this.getIntTacticDeclaration(), - SAMPLER_2D_TACTIC_DECLARATION: this.getSampler2DTacticDeclaration(), - SAMPLER_2D_ARRAY_TACTIC_DECLARATION: this.getSampler2DArrayTacticDeclaration(), - }; - } - - _getHeaderString() { - return ( - this.subKernels !== null ? - '#extension GL_EXT_draw_buffers : require\n' : - '' - ); - } - - _getLoopMaxString() { - return ( - this.loopMaxIterations ? - ` ${parseInt(this.loopMaxIterations)};\n` : - ' 1000;\n' - ); - } - - _getPluginsString() { - if (!this.plugins) return '\n'; - return this.plugins.map(plugin => plugin.source && this.source.match(plugin.functionMatch) ? plugin.source : '').join('\n'); - } - - _getConstantsString() { - const result = []; - const { threadDim, texSize } = this; - if (this.dynamicOutput) { - result.push( - 'uniform ivec3 uOutputDim', - 'uniform ivec2 uTexSize' - ); - } else { - result.push( - `ivec3 uOutputDim = ivec3(${threadDim[0]}, ${threadDim[1]}, ${threadDim[2]})`, - `ivec2 uTexSize = ivec2(${texSize[0]}, ${texSize[1]})` - ); - } - return utils.linesToString(result); - } - - _getTextureCoordinate() { - const subKernels = this.subKernels; - if (subKernels === null || subKernels.length < 1) { - return 'varying vec2 vTexCoord;\n'; - } else { - return 'out vec2 vTexCoord;\n'; - } - } - - _getDecode32EndiannessString() { - return ( - this.endianness === 'LE' ? - '' : - ' texel.rgba = texel.abgr;\n' - ); - } - - _getEncode32EndiannessString() { - return ( - this.endianness === 'LE' ? - '' : - ' texel.rgba = texel.abgr;\n' - ); - } - - _getDivideWithIntegerCheckString() { - return this.fixIntegerDivisionAccuracy ? - `float divWithIntCheck(float x, float y) { - if (floor(x) == x && floor(y) == y && integerMod(x, y) == 0.0) { - return float(int(x) / int(y)); - } - return x / y; -} - -float integerCorrectionModulo(float number, float divisor) { - if (number < 0.0) { - number = abs(number); - if (divisor < 0.0) { - divisor = abs(divisor); - } - return -(number - (divisor * floor(divWithIntCheck(number, divisor)))); - } - if (divisor < 0.0) { - divisor = abs(divisor); - } - return number - (divisor * floor(divWithIntCheck(number, divisor))); -}` : - ''; - } - - _getMainArgumentsString(args) { - const results = []; - const { argumentNames } = this; - for (let i = 0; i < argumentNames.length; i++) { - results.push(this.kernelArguments[i].getSource(args[i])); - } - return results.join(''); - } - - _getInjectedNative() { - return this.injectedNative || ''; - } - - _getMainConstantsString() { - const result = []; - const { constants } = this; - if (constants) { - let i = 0; - for (const name in constants) { - if (!this.constants.hasOwnProperty(name)) continue; - result.push(this.kernelConstants[i++].getSource(this.constants[name])); - } - } - return result.join(''); - } - - getRawValueFramebuffer(width, height) { - if (!this.rawValueFramebuffers[width]) { - this.rawValueFramebuffers[width] = {}; - } - if (!this.rawValueFramebuffers[width][height]) { - const framebuffer = this.context.createFramebuffer(); - framebuffer.width = width; - framebuffer.height = height; - this.rawValueFramebuffers[width][height] = framebuffer; - } - return this.rawValueFramebuffers[width][height]; - } - - getKernelResultDeclaration() { - switch (this.returnType) { - case 'Array(2)': - return 'vec2 kernelResult'; - case 'Array(3)': - return 'vec3 kernelResult'; - case 'Array(4)': - return 'vec4 kernelResult'; - case 'LiteralInteger': - case 'Float': - case 'Number': - case 'Integer': - return 'float kernelResult'; - default: - if (this.graphical) { - return 'float kernelResult'; - } else { - throw new Error(`unrecognized output type "${ this.returnType }"`); - } - } - } - getKernelString() { - const result = [this.getKernelResultDeclaration()]; - const { subKernels } = this; - if (subKernels !== null) { - switch (this.returnType) { - case 'Number': - case 'Float': - case 'Integer': - for (let i = 0; i < subKernels.length; i++) { - const subKernel = subKernels[i]; - result.push( - subKernel.returnType === 'Integer' ? - `int subKernelResult_${ subKernel.name } = 0` : - `float subKernelResult_${ subKernel.name } = 0.0` - ); - } - break; - case 'Array(2)': - for (let i = 0; i < subKernels.length; i++) { - result.push( - `vec2 subKernelResult_${ subKernels[i].name }` - ); - } - break; - case 'Array(3)': - for (let i = 0; i < subKernels.length; i++) { - result.push( - `vec3 subKernelResult_${ subKernels[i].name }` - ); - } - break; - case 'Array(4)': - for (let i = 0; i < subKernels.length; i++) { - result.push( - `vec4 subKernelResult_${ subKernels[i].name }` - ); - } - break; - } - } - - return utils.linesToString(result) + this.translatedSource; - } - - getMainResultGraphical() { - return utils.linesToString([ - ' threadId = indexTo3D(index, uOutputDim)', - ' kernel()', - ' gl_FragColor = actualColor', - ]); - } - - getMainResultPackedPixels() { - switch (this.returnType) { - case 'LiteralInteger': - case 'Number': - case 'Integer': - case 'Float': - return this.getMainResultKernelPackedPixels() + - this.getMainResultSubKernelPackedPixels(); - default: - throw new Error(`packed output only usable with Numbers, "${this.returnType}" specified`); - } - } - - getMainResultKernelPackedPixels() { - return utils.linesToString([ - ' threadId = indexTo3D(index, uOutputDim)', - ' kernel()', - ` gl_FragData[0] = ${this.useLegacyEncoder ? 'legacyEncode32' : 'encode32'}(kernelResult)` - ]); - } - - getMainResultSubKernelPackedPixels() { - const result = []; - if (!this.subKernels) return ''; - for (let i = 0; i < this.subKernels.length; i++) { - const subKernel = this.subKernels[i]; - if (subKernel.returnType === 'Integer') { - result.push( - ` gl_FragData[${i + 1}] = ${this.useLegacyEncoder ? 'legacyEncode32' : 'encode32'}(float(subKernelResult_${this.subKernels[i].name}))` - ); - } else { - result.push( - ` gl_FragData[${i + 1}] = ${this.useLegacyEncoder ? 'legacyEncode32' : 'encode32'}(subKernelResult_${this.subKernels[i].name})` - ); - } - } - return utils.linesToString(result); - } - - getMainResultMemoryOptimizedFloats() { - const result = [ - ' index *= 4', - ]; - - switch (this.returnType) { - case 'Number': - case 'Integer': - case 'Float': - const channels = ['r', 'g', 'b', 'a']; - for (let i = 0; i < channels.length; i++) { - const channel = channels[i]; - this.getMainResultKernelMemoryOptimizedFloats(result, channel); - this.getMainResultSubKernelMemoryOptimizedFloats(result, channel); - if (i + 1 < channels.length) { - result.push(' index += 1'); - } - } - break; - default: - throw new Error(`optimized output only usable with Numbers, ${this.returnType} specified`); - } - - return utils.linesToString(result); - } - - getMainResultKernelMemoryOptimizedFloats(result, channel) { - result.push( - ' threadId = indexTo3D(index, uOutputDim)', - ' kernel()', - ` gl_FragData[0].${channel} = kernelResult` - ); - } - - getMainResultSubKernelMemoryOptimizedFloats(result, channel) { - if (!this.subKernels) return result; - for (let i = 0; i < this.subKernels.length; i++) { - const subKernel = this.subKernels[i]; - if (subKernel.returnType === 'Integer') { - result.push( - ` gl_FragData[${i + 1}].${channel} = float(subKernelResult_${this.subKernels[i].name})` - ); - } else { - result.push( - ` gl_FragData[${i + 1}].${channel} = subKernelResult_${this.subKernels[i].name}` - ); - } - } - } - - getMainResultKernelNumberTexture() { - return [ - ' threadId = indexTo3D(index, uOutputDim)', - ' kernel()', - ' gl_FragData[0][0] = kernelResult', - ]; - } - - getMainResultSubKernelNumberTexture() { - const result = []; - if (!this.subKernels) return result; - for (let i = 0; i < this.subKernels.length; ++i) { - const subKernel = this.subKernels[i]; - if (subKernel.returnType === 'Integer') { - result.push( - ` gl_FragData[${i + 1}][0] = float(subKernelResult_${subKernel.name})` - ); - } else { - result.push( - ` gl_FragData[${i + 1}][0] = subKernelResult_${subKernel.name}` - ); - } - } - return result; - } - - getMainResultKernelArray2Texture() { - return [ - ' threadId = indexTo3D(index, uOutputDim)', - ' kernel()', - ' gl_FragData[0][0] = kernelResult[0]', - ' gl_FragData[0][1] = kernelResult[1]', - ]; - } - - getMainResultSubKernelArray2Texture() { - const result = []; - if (!this.subKernels) return result; - for (let i = 0; i < this.subKernels.length; ++i) { - result.push( - ` gl_FragData[${i + 1}][0] = subKernelResult_${this.subKernels[i].name}[0]`, - ` gl_FragData[${i + 1}][1] = subKernelResult_${this.subKernels[i].name}[1]` - ); - } - return result; - } - - getMainResultKernelArray3Texture() { - return [ - ' threadId = indexTo3D(index, uOutputDim)', - ' kernel()', - ' gl_FragData[0][0] = kernelResult[0]', - ' gl_FragData[0][1] = kernelResult[1]', - ' gl_FragData[0][2] = kernelResult[2]', - ]; - } - - getMainResultSubKernelArray3Texture() { - const result = []; - if (!this.subKernels) return result; - for (let i = 0; i < this.subKernels.length; ++i) { - result.push( - ` gl_FragData[${i + 1}][0] = subKernelResult_${this.subKernels[i].name}[0]`, - ` gl_FragData[${i + 1}][1] = subKernelResult_${this.subKernels[i].name}[1]`, - ` gl_FragData[${i + 1}][2] = subKernelResult_${this.subKernels[i].name}[2]` - ); - } - return result; - } - - getMainResultKernelArray4Texture() { - return [ - ' threadId = indexTo3D(index, uOutputDim)', - ' kernel()', - ' gl_FragData[0] = kernelResult', - ]; - } - - getMainResultSubKernelArray4Texture() { - const result = []; - if (!this.subKernels) return result; - switch (this.returnType) { - case 'Number': - case 'Float': - case 'Integer': - for (let i = 0; i < this.subKernels.length; ++i) { - const subKernel = this.subKernels[i]; - if (subKernel.returnType === 'Integer') { - result.push( - ` gl_FragData[${i + 1}] = float(subKernelResult_${this.subKernels[i].name})` - ); - } else { - result.push( - ` gl_FragData[${i + 1}] = subKernelResult_${this.subKernels[i].name}` - ); - } - } - break; - case 'Array(2)': - for (let i = 0; i < this.subKernels.length; ++i) { - result.push( - ` gl_FragData[${i + 1}][0] = subKernelResult_${this.subKernels[i].name}[0]`, - ` gl_FragData[${i + 1}][1] = subKernelResult_${this.subKernels[i].name}[1]` - ); - } - break; - case 'Array(3)': - for (let i = 0; i < this.subKernels.length; ++i) { - result.push( - ` gl_FragData[${i + 1}][0] = subKernelResult_${this.subKernels[i].name}[0]`, - ` gl_FragData[${i + 1}][1] = subKernelResult_${this.subKernels[i].name}[1]`, - ` gl_FragData[${i + 1}][2] = subKernelResult_${this.subKernels[i].name}[2]` - ); - } - break; - case 'Array(4)': - for (let i = 0; i < this.subKernels.length; ++i) { - result.push( - ` gl_FragData[${i + 1}][0] = subKernelResult_${this.subKernels[i].name}[0]`, - ` gl_FragData[${i + 1}][1] = subKernelResult_${this.subKernels[i].name}[1]`, - ` gl_FragData[${i + 1}][2] = subKernelResult_${this.subKernels[i].name}[2]`, - ` gl_FragData[${i + 1}][3] = subKernelResult_${this.subKernels[i].name}[3]` - ); - } - break; - } - - return result; - } - - replaceArtifacts(src, map) { - return src.replace(/[ ]*__([A-Z]+[0-9]*([_]?[A-Z]*[0-9]?)*)__;\n/g, (match, artifact) => { - if (map.hasOwnProperty(artifact)) { - return map[artifact]; - } - throw `unhandled artifact ${artifact}`; - }); - } - - getFragmentShader(args) { - if (this.compiledFragmentShader !== null) { - return this.compiledFragmentShader; - } - return this.compiledFragmentShader = this.replaceArtifacts(this.constructor.fragmentShader, this._getFragShaderArtifactMap(args)); - } - - getVertexShader(args) { - if (this.compiledVertexShader !== null) { - return this.compiledVertexShader; - } - return this.compiledVertexShader = this.replaceArtifacts(this.constructor.vertexShader, this._getVertShaderArtifactMap(args)); - } - - toString() { - const setupContextString = utils.linesToString([ - `const gl = context`, - ]); - return glKernelString(this.constructor, arguments, this, setupContextString); - } - - destroy(removeCanvasReferences) { - if (!this.context) return; - if (this.buffer) { - this.context.deleteBuffer(this.buffer); - } - if (this.framebuffer) { - this.context.deleteFramebuffer(this.framebuffer); - } - for (const width in this.rawValueFramebuffers) { - for (const height in this.rawValueFramebuffers[width]) { - this.context.deleteFramebuffer(this.rawValueFramebuffers[width][height]); - delete this.rawValueFramebuffers[width][height]; - } - delete this.rawValueFramebuffers[width]; - } - if (this.vertShader) { - this.context.deleteShader(this.vertShader); - } - if (this.fragShader) { - this.context.deleteShader(this.fragShader); - } - if (this.program) { - this.context.deleteProgram(this.program); - } - if (this.texture) { - this.texture.delete(); - const textureCacheIndex = this.textureCache.indexOf(this.texture.texture); - if (textureCacheIndex > -1) { - this.textureCache.splice(textureCacheIndex, 1); - } - this.texture = null; - } - if (this.mappedTextures && this.mappedTextures.length) { - for (let i = 0; i < this.mappedTextures.length; i++) { - const mappedTexture = this.mappedTextures[i]; - mappedTexture.delete(); - const textureCacheIndex = this.textureCache.indexOf(mappedTexture.texture); - if (textureCacheIndex > -1) { - this.textureCache.splice(textureCacheIndex, 1); - } - } - this.mappedTextures = null; - } - if (this.kernelArguments) { - for (let i = 0; i < this.kernelArguments.length; i++) { - this.kernelArguments[i].destroy(); - } - } - if (this.kernelConstants) { - for (let i = 0; i < this.kernelConstants.length; i++) { - this.kernelConstants[i].destroy(); - } - } - while (this.textureCache.length > 0) { - const texture = this.textureCache.pop(); - this.context.deleteTexture(texture); - } - if (removeCanvasReferences) { - const idx = canvases.indexOf(this.canvas); - if (idx >= 0) { - canvases[idx] = null; - maxTexSizes[idx] = null; - } - } - this.destroyExtensions(); - delete this.context; - delete this.canvas; - if (!this.gpu) return; - const i = this.gpu.kernels.indexOf(this); - if (i === -1) return; - this.gpu.kernels.splice(i, 1); - } - - destroyExtensions() { - this.extensions.OES_texture_float = null; - this.extensions.OES_texture_float_linear = null; - this.extensions.OES_element_index_uint = null; - this.extensions.WEBGL_draw_buffers = null; - } - - static destroyContext(context) { - const extension = context.getExtension('WEBGL_lose_context'); - if (extension) { - extension.loseContext(); - } - } - - toJSON() { - const json = super.toJSON(); - json.functionNodes = FunctionBuilder.fromKernel(this, WebGLFunctionNode).toJSON(); - json.settings.threadDim = this.threadDim; - return json; - } -} - -module.exports = { - WebGLKernel -}; -},{"../../plugins/math-random-uniformly-distributed":111,"../../utils":113,"../function-builder":8,"../gl/kernel":12,"../gl/kernel-string":11,"./fragment-shader":36,"./function-node":37,"./kernel-value-maps":38,"./vertex-shader":70}],70:[function(require,module,exports){ -const vertexShader = `__FLOAT_TACTIC_DECLARATION__; -__INT_TACTIC_DECLARATION__; -__SAMPLER_2D_TACTIC_DECLARATION__; - -attribute vec2 aPos; -attribute vec2 aTexCoord; - -varying vec2 vTexCoord; -uniform vec2 ratio; - -void main(void) { - gl_Position = vec4((aPos + vec2(1)) * ratio + vec2(-1), 0, 1); - vTexCoord = aTexCoord; -}`; - -module.exports = { - vertexShader -}; -},{}],71:[function(require,module,exports){ -const fragmentShader = `#version 300 es -__HEADER__; -__FLOAT_TACTIC_DECLARATION__; -__INT_TACTIC_DECLARATION__; -__SAMPLER_2D_TACTIC_DECLARATION__; -__SAMPLER_2D_ARRAY_TACTIC_DECLARATION__; - -const int LOOP_MAX = __LOOP_MAX__; - -__PLUGINS__; -__CONSTANTS__; - -in vec2 vTexCoord; - -float atan2(float v1, float v2) { - if (v1 == 0.0 || v2 == 0.0) return 0.0; - return atan(v1 / v2); -} - -float cbrt(float x) { - if (x >= 0.0) { - return pow(x, 1.0 / 3.0); - } else { - return -pow(x, 1.0 / 3.0); - } -} - -float expm1(float x) { - return pow(${Math.E}, x) - 1.0; -} - -float fround(highp float x) { - return x; -} - -float imul(float v1, float v2) { - return float(int(v1) * int(v2)); -} - -float log10(float x) { - return log2(x) * (1.0 / log2(10.0)); -} - -float log1p(float x) { - return log(1.0 + x); -} - -float _pow(float v1, float v2) { - if (v2 == 0.0) return 1.0; - return pow(v1, v2); -} - -float _round(float x) { - return floor(x + 0.5); -} - - -const int BIT_COUNT = 32; -int modi(int x, int y) { - return x - y * (x / y); -} - -int bitwiseOr(int a, int b) { - int result = 0; - int n = 1; - - for (int i = 0; i < BIT_COUNT; i++) { - if ((modi(a, 2) == 1) || (modi(b, 2) == 1)) { - result += n; - } - a = a / 2; - b = b / 2; - n = n * 2; - if(!(a > 0 || b > 0)) { - break; - } - } - return result; -} -int bitwiseXOR(int a, int b) { - int result = 0; - int n = 1; - - for (int i = 0; i < BIT_COUNT; i++) { - if ((modi(a, 2) == 1) != (modi(b, 2) == 1)) { - result += n; - } - a = a / 2; - b = b / 2; - n = n * 2; - if(!(a > 0 || b > 0)) { - break; - } - } - return result; -} -int bitwiseAnd(int a, int b) { - int result = 0; - int n = 1; - for (int i = 0; i < BIT_COUNT; i++) { - if ((modi(a, 2) == 1) && (modi(b, 2) == 1)) { - result += n; - } - a = a / 2; - b = b / 2; - n = n * 2; - if(!(a > 0 && b > 0)) { - break; - } - } - return result; -} -int bitwiseNot(int a) { - int result = 0; - int n = 1; - - for (int i = 0; i < BIT_COUNT; i++) { - if (modi(a, 2) == 0) { - result += n; - } - a = a / 2; - n = n * 2; - } - return result; -} -int bitwiseZeroFillLeftShift(int n, int shift) { - int maxBytes = BIT_COUNT; - for (int i = 0; i < BIT_COUNT; i++) { - if (maxBytes >= n) { - break; - } - maxBytes *= 2; - } - for (int i = 0; i < BIT_COUNT; i++) { - if (i >= shift) { - break; - } - n *= 2; - } - - int result = 0; - int byteVal = 1; - for (int i = 0; i < BIT_COUNT; i++) { - if (i >= maxBytes) break; - if (modi(n, 2) > 0) { result += byteVal; } - n = int(n / 2); - byteVal *= 2; - } - return result; -} - -int bitwiseSignedRightShift(int num, int shifts) { - return int(floor(float(num) / pow(2.0, float(shifts)))); -} - -int bitwiseZeroFillRightShift(int n, int shift) { - int maxBytes = BIT_COUNT; - for (int i = 0; i < BIT_COUNT; i++) { - if (maxBytes >= n) { - break; - } - maxBytes *= 2; - } - for (int i = 0; i < BIT_COUNT; i++) { - if (i >= shift) { - break; - } - n /= 2; - } - int result = 0; - int byteVal = 1; - for (int i = 0; i < BIT_COUNT; i++) { - if (i >= maxBytes) break; - if (modi(n, 2) > 0) { result += byteVal; } - n = int(n / 2); - byteVal *= 2; - } - return result; -} - -vec2 integerMod(vec2 x, float y) { - vec2 res = floor(mod(x, y)); - return res * step(1.0 - floor(y), -res); -} - -vec3 integerMod(vec3 x, float y) { - vec3 res = floor(mod(x, y)); - return res * step(1.0 - floor(y), -res); -} - -vec4 integerMod(vec4 x, vec4 y) { - vec4 res = floor(mod(x, y)); - return res * step(1.0 - floor(y), -res); -} - -float integerMod(float x, float y) { - float res = floor(mod(x, y)); - return res * (res > floor(y) - 1.0 ? 0.0 : 1.0); -} - -int integerMod(int x, int y) { - return x - (y * int(x/y)); -} - -__DIVIDE_WITH_INTEGER_CHECK__; - -// Here be dragons! -// DO NOT OPTIMIZE THIS CODE -// YOU WILL BREAK SOMETHING ON SOMEBODY\'S MACHINE -// LEAVE IT AS IT IS, LEST YOU WASTE YOUR OWN TIME -const vec2 MAGIC_VEC = vec2(1.0, -256.0); -const vec4 SCALE_FACTOR = vec4(1.0, 256.0, 65536.0, 0.0); -const vec4 SCALE_FACTOR_INV = vec4(1.0, 0.00390625, 0.0000152587890625, 0.0); // 1, 1/256, 1/65536 -float decode32(vec4 texel) { - __DECODE32_ENDIANNESS__; - texel *= 255.0; - vec2 gte128; - gte128.x = texel.b >= 128.0 ? 1.0 : 0.0; - gte128.y = texel.a >= 128.0 ? 1.0 : 0.0; - float exponent = 2.0 * texel.a - 127.0 + dot(gte128, MAGIC_VEC); - float res = exp2(round(exponent)); - texel.b = texel.b - 128.0 * gte128.x; - res = dot(texel, SCALE_FACTOR) * exp2(round(exponent-23.0)) + res; - res *= gte128.y * -2.0 + 1.0; - return res; -} - -float decode16(vec4 texel, int index) { - int channel = integerMod(index, 2); - return texel[channel*2] * 255.0 + texel[channel*2 + 1] * 65280.0; -} - -float decode8(vec4 texel, int index) { - int channel = integerMod(index, 4); - return texel[channel] * 255.0; -} - -vec4 legacyEncode32(float f) { - float F = abs(f); - float sign = f < 0.0 ? 1.0 : 0.0; - float exponent = floor(log2(F)); - float mantissa = (exp2(-exponent) * F); - // exponent += floor(log2(mantissa)); - vec4 texel = vec4(F * exp2(23.0-exponent)) * SCALE_FACTOR_INV; - texel.rg = integerMod(texel.rg, 256.0); - texel.b = integerMod(texel.b, 128.0); - texel.a = exponent*0.5 + 63.5; - texel.ba += vec2(integerMod(exponent+127.0, 2.0), sign) * 128.0; - texel = floor(texel); - texel *= 0.003921569; // 1/255 - __ENCODE32_ENDIANNESS__; - return texel; -} - -// https://github.com/gpujs/gpu.js/wiki/Encoder-details -vec4 encode32(float value) { - if (value == 0.0) return vec4(0, 0, 0, 0); - - float exponent; - float mantissa; - vec4 result; - float sgn; - - sgn = step(0.0, -value); - value = abs(value); - - exponent = floor(log2(value)); - - mantissa = value*pow(2.0, -exponent)-1.0; - exponent = exponent+127.0; - result = vec4(0,0,0,0); - - result.a = floor(exponent/2.0); - exponent = exponent - result.a*2.0; - result.a = result.a + 128.0*sgn; - - result.b = floor(mantissa * 128.0); - mantissa = mantissa - result.b / 128.0; - result.b = result.b + exponent*128.0; - - result.g = floor(mantissa*32768.0); - mantissa = mantissa - result.g/32768.0; - - result.r = floor(mantissa*8388608.0); - return result/255.0; -} -// Dragons end here - -int index; -ivec3 threadId; - -ivec3 indexTo3D(int idx, ivec3 texDim) { - int z = int(idx / (texDim.x * texDim.y)); - idx -= z * int(texDim.x * texDim.y); - int y = int(idx / texDim.x); - int x = int(integerMod(idx, texDim.x)); - return ivec3(x, y, z); -} - -float get32(sampler2D tex, ivec2 texSize, ivec3 texDim, int z, int y, int x) { - int index = x + texDim.x * (y + texDim.y * z); - int w = texSize.x; - vec2 st = vec2(float(integerMod(index, w)), float(index / w)) + 0.5; - vec4 texel = texture(tex, st / vec2(texSize)); - return decode32(texel); -} - -float get16(sampler2D tex, ivec2 texSize, ivec3 texDim, int z, int y, int x) { - int index = x + (texDim.x * (y + (texDim.y * z))); - int w = texSize.x * 2; - vec2 st = vec2(float(integerMod(index, w)), float(index / w)) + 0.5; - vec4 texel = texture(tex, st / vec2(texSize.x * 2, texSize.y)); - return decode16(texel, index); -} - -float get8(sampler2D tex, ivec2 texSize, ivec3 texDim, int z, int y, int x) { - int index = x + (texDim.x * (y + (texDim.y * z))); - int w = texSize.x * 4; - vec2 st = vec2(float(integerMod(index, w)), float(index / w)) + 0.5; - vec4 texel = texture(tex, st / vec2(texSize.x * 4, texSize.y)); - return decode8(texel, index); -} - -float getMemoryOptimized32(sampler2D tex, ivec2 texSize, ivec3 texDim, int z, int y, int x) { - int index = x + (texDim.x * (y + (texDim.y * z))); - int channel = integerMod(index, 4); - index = index / 4; - int w = texSize.x; - vec2 st = vec2(float(integerMod(index, w)), float(index / w)) + 0.5; - index = index / 4; - vec4 texel = texture(tex, st / vec2(texSize)); - return texel[channel]; -} - -vec4 getImage2D(sampler2D tex, ivec2 texSize, ivec3 texDim, int z, int y, int x) { - int index = x + texDim.x * (y + texDim.y * z); - int w = texSize.x; - vec2 st = vec2(float(integerMod(index, w)), float(index / w)) + 0.5; - return texture(tex, st / vec2(texSize)); -} - -vec4 getImage3D(sampler2DArray tex, ivec2 texSize, ivec3 texDim, int z, int y, int x) { - int index = x + texDim.x * (y + texDim.y * z); - int w = texSize.x; - vec2 st = vec2(float(integerMod(index, w)), float(index / w)) + 0.5; - return texture(tex, vec3(st / vec2(texSize), z)); -} - -float getFloatFromSampler2D(sampler2D tex, ivec2 texSize, ivec3 texDim, int z, int y, int x) { - vec4 result = getImage2D(tex, texSize, texDim, z, y, x); - return result[0]; -} - -vec2 getVec2FromSampler2D(sampler2D tex, ivec2 texSize, ivec3 texDim, int z, int y, int x) { - vec4 result = getImage2D(tex, texSize, texDim, z, y, x); - return vec2(result[0], result[1]); -} - -vec2 getMemoryOptimizedVec2(sampler2D tex, ivec2 texSize, ivec3 texDim, int z, int y, int x) { - int index = x + texDim.x * (y + texDim.y * z); - int channel = integerMod(index, 2); - index = index / 2; - int w = texSize.x; - vec2 st = vec2(float(integerMod(index, w)), float(index / w)) + 0.5; - vec4 texel = texture(tex, st / vec2(texSize)); - if (channel == 0) return vec2(texel.r, texel.g); - if (channel == 1) return vec2(texel.b, texel.a); - return vec2(0.0, 0.0); -} - -vec3 getVec3FromSampler2D(sampler2D tex, ivec2 texSize, ivec3 texDim, int z, int y, int x) { - vec4 result = getImage2D(tex, texSize, texDim, z, y, x); - return vec3(result[0], result[1], result[2]); -} - -vec3 getMemoryOptimizedVec3(sampler2D tex, ivec2 texSize, ivec3 texDim, int z, int y, int x) { - int fieldIndex = 3 * (x + texDim.x * (y + texDim.y * z)); - int vectorIndex = fieldIndex / 4; - int vectorOffset = fieldIndex - vectorIndex * 4; - int readY = vectorIndex / texSize.x; - int readX = vectorIndex - readY * texSize.x; - vec4 tex1 = texture(tex, (vec2(readX, readY) + 0.5) / vec2(texSize)); - - if (vectorOffset == 0) { - return tex1.xyz; - } else if (vectorOffset == 1) { - return tex1.yzw; - } else { - readX++; - if (readX >= texSize.x) { - readX = 0; - readY++; - } - vec4 tex2 = texture(tex, vec2(readX, readY) / vec2(texSize)); - if (vectorOffset == 2) { - return vec3(tex1.z, tex1.w, tex2.x); - } else { - return vec3(tex1.w, tex2.x, tex2.y); - } - } -} - -vec4 getVec4FromSampler2D(sampler2D tex, ivec2 texSize, ivec3 texDim, int z, int y, int x) { - return getImage2D(tex, texSize, texDim, z, y, x); -} - -vec4 getMemoryOptimizedVec4(sampler2D tex, ivec2 texSize, ivec3 texDim, int z, int y, int x) { - int index = x + texDim.x * (y + texDim.y * z); - int channel = integerMod(index, 2); - int w = texSize.x; - vec2 st = vec2(float(integerMod(index, w)), float(index / w)) + 0.5; - vec4 texel = texture(tex, st / vec2(texSize)); - return vec4(texel.r, texel.g, texel.b, texel.a); -} - -vec4 actualColor; -void color(float r, float g, float b, float a) { - actualColor = vec4(r,g,b,a); -} - -void color(float r, float g, float b) { - color(r,g,b,1.0); -} - -float modulo(float number, float divisor) { - if (number < 0.0) { - number = abs(number); - if (divisor < 0.0) { - divisor = abs(divisor); - } - return -mod(number, divisor); - } - if (divisor < 0.0) { - divisor = abs(divisor); - } - return mod(number, divisor); -} - -__INJECTED_NATIVE__; -__MAIN_CONSTANTS__; -__MAIN_ARGUMENTS__; -__KERNEL__; - -void main(void) { - index = int(vTexCoord.s * float(uTexSize.x)) + int(vTexCoord.t * float(uTexSize.y)) * uTexSize.x; - __MAIN_RESULT__; -}`; - -module.exports = { - fragmentShader -}; -},{}],72:[function(require,module,exports){ -const { utils } = require('../../utils'); -const { WebGLFunctionNode } = require('../web-gl/function-node'); - -class WebGL2FunctionNode extends WebGLFunctionNode { - - astIdentifierExpression(idtNode, retArr) { - if (idtNode.type !== 'Identifier') { - throw this.astErrorOutput( - 'IdentifierExpression - not an Identifier', - idtNode - ); - } - - const type = this.getType(idtNode); - - const name = utils.sanitizeName(idtNode.name); - if (idtNode.name === 'Infinity') { - retArr.push('intBitsToFloat(2139095039)'); - } else if (type === 'Boolean') { - if (this.argumentNames.indexOf(name) > -1) { - retArr.push(`bool(user_${name})`); - } else { - retArr.push(`user_${name}`); - } - } else { - retArr.push(`user_${name}`); - } - - return retArr; - } -} - -module.exports = { - WebGL2FunctionNode -}; -},{"../../utils":113,"../web-gl/function-node":37}],73:[function(require,module,exports){ -const { WebGL2KernelValueBoolean } = require('./kernel-value/boolean'); -const { WebGL2KernelValueFloat } = require('./kernel-value/float'); -const { WebGL2KernelValueInteger } = require('./kernel-value/integer'); - -const { WebGL2KernelValueHTMLImage } = require('./kernel-value/html-image'); -const { WebGL2KernelValueDynamicHTMLImage } = require('./kernel-value/dynamic-html-image'); - -const { WebGL2KernelValueHTMLImageArray } = require('./kernel-value/html-image-array'); -const { WebGL2KernelValueDynamicHTMLImageArray } = require('./kernel-value/dynamic-html-image-array'); - -const { WebGL2KernelValueHTMLVideo } = require('./kernel-value/html-video'); -const { WebGL2KernelValueDynamicHTMLVideo } = require('./kernel-value/dynamic-html-video'); - -const { WebGL2KernelValueSingleInput } = require('./kernel-value/single-input'); -const { WebGL2KernelValueDynamicSingleInput } = require('./kernel-value/dynamic-single-input'); - -const { WebGL2KernelValueUnsignedInput } = require('./kernel-value/unsigned-input'); -const { WebGL2KernelValueDynamicUnsignedInput } = require('./kernel-value/dynamic-unsigned-input'); - -const { WebGL2KernelValueMemoryOptimizedNumberTexture } = require('./kernel-value/memory-optimized-number-texture'); -const { WebGL2KernelValueDynamicMemoryOptimizedNumberTexture } = require('./kernel-value/dynamic-memory-optimized-number-texture'); - -const { WebGL2KernelValueNumberTexture } = require('./kernel-value/number-texture'); -const { WebGL2KernelValueDynamicNumberTexture } = require('./kernel-value/dynamic-number-texture'); - -const { WebGL2KernelValueSingleArray } = require('./kernel-value/single-array'); -const { WebGL2KernelValueDynamicSingleArray } = require('./kernel-value/dynamic-single-array'); - -const { WebGL2KernelValueSingleArray1DI } = require('./kernel-value/single-array1d-i'); -const { WebGL2KernelValueDynamicSingleArray1DI } = require('./kernel-value/dynamic-single-array1d-i'); - -const { WebGL2KernelValueSingleArray2DI } = require('./kernel-value/single-array2d-i'); -const { WebGL2KernelValueDynamicSingleArray2DI } = require('./kernel-value/dynamic-single-array2d-i'); - -const { WebGL2KernelValueSingleArray3DI } = require('./kernel-value/single-array3d-i'); -const { WebGL2KernelValueDynamicSingleArray3DI } = require('./kernel-value/dynamic-single-array3d-i'); - -const { WebGL2KernelValueArray2 } = require('./kernel-value/array2'); -const { WebGL2KernelValueArray3 } = require('./kernel-value/array3'); -const { WebGL2KernelValueArray4 } = require('./kernel-value/array4'); - -const { WebGL2KernelValueUnsignedArray } = require('./kernel-value/unsigned-array'); -const { WebGL2KernelValueDynamicUnsignedArray } = require('./kernel-value/dynamic-unsigned-array'); - -const kernelValueMaps = { - unsigned: { - dynamic: { - 'Boolean': WebGL2KernelValueBoolean, - 'Integer': WebGL2KernelValueInteger, - 'Float': WebGL2KernelValueFloat, - 'Array': WebGL2KernelValueDynamicUnsignedArray, - 'Array(2)': WebGL2KernelValueArray2, - 'Array(3)': WebGL2KernelValueArray3, - 'Array(4)': WebGL2KernelValueArray4, - 'Array1D(2)': false, - 'Array1D(3)': false, - 'Array1D(4)': false, - 'Array2D(2)': false, - 'Array2D(3)': false, - 'Array2D(4)': false, - 'Array3D(2)': false, - 'Array3D(3)': false, - 'Array3D(4)': false, - 'Input': WebGL2KernelValueDynamicUnsignedInput, - 'NumberTexture': WebGL2KernelValueDynamicNumberTexture, - 'ArrayTexture(1)': WebGL2KernelValueDynamicNumberTexture, - 'ArrayTexture(2)': WebGL2KernelValueDynamicNumberTexture, - 'ArrayTexture(3)': WebGL2KernelValueDynamicNumberTexture, - 'ArrayTexture(4)': WebGL2KernelValueDynamicNumberTexture, - 'MemoryOptimizedNumberTexture': WebGL2KernelValueDynamicMemoryOptimizedNumberTexture, - 'HTMLCanvas': WebGL2KernelValueDynamicHTMLImage, - 'OffscreenCanvas': WebGL2KernelValueDynamicHTMLImage, - 'HTMLImage': WebGL2KernelValueDynamicHTMLImage, - 'ImageBitmap': WebGL2KernelValueDynamicHTMLImage, - 'ImageData': WebGL2KernelValueDynamicHTMLImage, - 'HTMLImageArray': WebGL2KernelValueDynamicHTMLImageArray, - 'HTMLVideo': WebGL2KernelValueDynamicHTMLVideo, - }, - static: { - 'Boolean': WebGL2KernelValueBoolean, - 'Float': WebGL2KernelValueFloat, - 'Integer': WebGL2KernelValueInteger, - 'Array': WebGL2KernelValueUnsignedArray, - 'Array(2)': WebGL2KernelValueArray2, - 'Array(3)': WebGL2KernelValueArray3, - 'Array(4)': WebGL2KernelValueArray4, - 'Array1D(2)': false, - 'Array1D(3)': false, - 'Array1D(4)': false, - 'Array2D(2)': false, - 'Array2D(3)': false, - 'Array2D(4)': false, - 'Array3D(2)': false, - 'Array3D(3)': false, - 'Array3D(4)': false, - 'Input': WebGL2KernelValueUnsignedInput, - 'NumberTexture': WebGL2KernelValueNumberTexture, - 'ArrayTexture(1)': WebGL2KernelValueNumberTexture, - 'ArrayTexture(2)': WebGL2KernelValueNumberTexture, - 'ArrayTexture(3)': WebGL2KernelValueNumberTexture, - 'ArrayTexture(4)': WebGL2KernelValueNumberTexture, - 'MemoryOptimizedNumberTexture': WebGL2KernelValueDynamicMemoryOptimizedNumberTexture, - 'HTMLCanvas': WebGL2KernelValueHTMLImage, - 'OffscreenCanvas': WebGL2KernelValueHTMLImage, - 'HTMLImage': WebGL2KernelValueHTMLImage, - 'ImageBitmap': WebGL2KernelValueHTMLImage, - 'ImageData': WebGL2KernelValueHTMLImage, - 'HTMLImageArray': WebGL2KernelValueHTMLImageArray, - 'HTMLVideo': WebGL2KernelValueHTMLVideo, - } - }, - single: { - dynamic: { - 'Boolean': WebGL2KernelValueBoolean, - 'Integer': WebGL2KernelValueInteger, - 'Float': WebGL2KernelValueFloat, - 'Array': WebGL2KernelValueDynamicSingleArray, - 'Array(2)': WebGL2KernelValueArray2, - 'Array(3)': WebGL2KernelValueArray3, - 'Array(4)': WebGL2KernelValueArray4, - 'Array1D(2)': WebGL2KernelValueDynamicSingleArray1DI, - 'Array1D(3)': WebGL2KernelValueDynamicSingleArray1DI, - 'Array1D(4)': WebGL2KernelValueDynamicSingleArray1DI, - 'Array2D(2)': WebGL2KernelValueDynamicSingleArray2DI, - 'Array2D(3)': WebGL2KernelValueDynamicSingleArray2DI, - 'Array2D(4)': WebGL2KernelValueDynamicSingleArray2DI, - 'Array3D(2)': WebGL2KernelValueDynamicSingleArray3DI, - 'Array3D(3)': WebGL2KernelValueDynamicSingleArray3DI, - 'Array3D(4)': WebGL2KernelValueDynamicSingleArray3DI, - 'Input': WebGL2KernelValueDynamicSingleInput, - 'NumberTexture': WebGL2KernelValueDynamicNumberTexture, - 'ArrayTexture(1)': WebGL2KernelValueDynamicNumberTexture, - 'ArrayTexture(2)': WebGL2KernelValueDynamicNumberTexture, - 'ArrayTexture(3)': WebGL2KernelValueDynamicNumberTexture, - 'ArrayTexture(4)': WebGL2KernelValueDynamicNumberTexture, - 'MemoryOptimizedNumberTexture': WebGL2KernelValueDynamicMemoryOptimizedNumberTexture, - 'HTMLCanvas': WebGL2KernelValueDynamicHTMLImage, - 'OffscreenCanvas': WebGL2KernelValueDynamicHTMLImage, - 'HTMLImage': WebGL2KernelValueDynamicHTMLImage, - 'ImageBitmap': WebGL2KernelValueDynamicHTMLImage, - 'ImageData': WebGL2KernelValueDynamicHTMLImage, - 'HTMLImageArray': WebGL2KernelValueDynamicHTMLImageArray, - 'HTMLVideo': WebGL2KernelValueDynamicHTMLVideo, - }, - static: { - 'Boolean': WebGL2KernelValueBoolean, - 'Float': WebGL2KernelValueFloat, - 'Integer': WebGL2KernelValueInteger, - 'Array': WebGL2KernelValueSingleArray, - 'Array(2)': WebGL2KernelValueArray2, - 'Array(3)': WebGL2KernelValueArray3, - 'Array(4)': WebGL2KernelValueArray4, - 'Array1D(2)': WebGL2KernelValueSingleArray1DI, - 'Array1D(3)': WebGL2KernelValueSingleArray1DI, - 'Array1D(4)': WebGL2KernelValueSingleArray1DI, - 'Array2D(2)': WebGL2KernelValueSingleArray2DI, - 'Array2D(3)': WebGL2KernelValueSingleArray2DI, - 'Array2D(4)': WebGL2KernelValueSingleArray2DI, - 'Array3D(2)': WebGL2KernelValueSingleArray3DI, - 'Array3D(3)': WebGL2KernelValueSingleArray3DI, - 'Array3D(4)': WebGL2KernelValueSingleArray3DI, - 'Input': WebGL2KernelValueSingleInput, - 'NumberTexture': WebGL2KernelValueNumberTexture, - 'ArrayTexture(1)': WebGL2KernelValueNumberTexture, - 'ArrayTexture(2)': WebGL2KernelValueNumberTexture, - 'ArrayTexture(3)': WebGL2KernelValueNumberTexture, - 'ArrayTexture(4)': WebGL2KernelValueNumberTexture, - 'MemoryOptimizedNumberTexture': WebGL2KernelValueMemoryOptimizedNumberTexture, - 'HTMLCanvas': WebGL2KernelValueHTMLImage, - 'OffscreenCanvas': WebGL2KernelValueHTMLImage, - 'HTMLImage': WebGL2KernelValueHTMLImage, - 'ImageBitmap': WebGL2KernelValueHTMLImage, - 'ImageData': WebGL2KernelValueHTMLImage, - 'HTMLImageArray': WebGL2KernelValueHTMLImageArray, - 'HTMLVideo': WebGL2KernelValueHTMLVideo, - } - }, -}; - -function lookupKernelValueType(type, dynamic, precision, value) { - if (!type) { - throw new Error('type missing'); - } - if (!dynamic) { - throw new Error('dynamic missing'); - } - if (!precision) { - throw new Error('precision missing'); - } - if (value.type) { - type = value.type; - } - const types = kernelValueMaps[precision][dynamic]; - if (types[type] === false) { - return null; - } else if (types[type] === undefined) { - throw new Error(`Could not find a KernelValue for ${ type }`); - } - return types[type]; -} - -module.exports = { - kernelValueMaps, - lookupKernelValueType -}; -},{"./kernel-value/array2":74,"./kernel-value/array3":75,"./kernel-value/array4":76,"./kernel-value/boolean":77,"./kernel-value/dynamic-html-image":79,"./kernel-value/dynamic-html-image-array":78,"./kernel-value/dynamic-html-video":80,"./kernel-value/dynamic-memory-optimized-number-texture":81,"./kernel-value/dynamic-number-texture":82,"./kernel-value/dynamic-single-array":83,"./kernel-value/dynamic-single-array1d-i":84,"./kernel-value/dynamic-single-array2d-i":85,"./kernel-value/dynamic-single-array3d-i":86,"./kernel-value/dynamic-single-input":87,"./kernel-value/dynamic-unsigned-array":88,"./kernel-value/dynamic-unsigned-input":89,"./kernel-value/float":90,"./kernel-value/html-image":92,"./kernel-value/html-image-array":91,"./kernel-value/html-video":93,"./kernel-value/integer":94,"./kernel-value/memory-optimized-number-texture":95,"./kernel-value/number-texture":96,"./kernel-value/single-array":97,"./kernel-value/single-array1d-i":98,"./kernel-value/single-array2d-i":99,"./kernel-value/single-array3d-i":100,"./kernel-value/single-input":101,"./kernel-value/unsigned-array":102,"./kernel-value/unsigned-input":103}],74:[function(require,module,exports){ -const { WebGLKernelValueArray2 } = require('../../web-gl/kernel-value/array2'); - -class WebGL2KernelValueArray2 extends WebGLKernelValueArray2 {} - -module.exports = { - WebGL2KernelValueArray2 -}; -},{"../../web-gl/kernel-value/array2":40}],75:[function(require,module,exports){ -const { WebGLKernelValueArray3 } = require('../../web-gl/kernel-value/array3'); - -class WebGL2KernelValueArray3 extends WebGLKernelValueArray3 {} - -module.exports = { - WebGL2KernelValueArray3 -}; -},{"../../web-gl/kernel-value/array3":41}],76:[function(require,module,exports){ -const { WebGLKernelValueArray4 } = require('../../web-gl/kernel-value/array4'); - -class WebGL2KernelValueArray4 extends WebGLKernelValueArray4 {} - -module.exports = { - WebGL2KernelValueArray4 -}; -},{"../../web-gl/kernel-value/array4":42}],77:[function(require,module,exports){ -const { WebGLKernelValueBoolean } = require('../../web-gl/kernel-value/boolean'); - -class WebGL2KernelValueBoolean extends WebGLKernelValueBoolean {} - -module.exports = { - WebGL2KernelValueBoolean -}; -},{"../../web-gl/kernel-value/boolean":43}],78:[function(require,module,exports){ -const { utils } = require('../../../utils'); -const { WebGL2KernelValueHTMLImageArray } = require('./html-image-array'); - -class WebGL2KernelValueDynamicHTMLImageArray extends WebGL2KernelValueHTMLImageArray { - getSource() { - const variablePrecision = this.getVariablePrecisionString(); - return utils.linesToString([ - `uniform ${ variablePrecision } sampler2DArray ${this.id}`, - `uniform ${ variablePrecision } ivec2 ${this.sizeId}`, - `uniform ${ variablePrecision } ivec3 ${this.dimensionsId}`, - ]); - } - - updateValue(images) { - const { width, height } = images[0]; - this.checkSize(width, height); - this.dimensions = [width, height, images.length]; - this.textureSize = [width, height]; - this.kernel.setUniform3iv(this.dimensionsId, this.dimensions); - this.kernel.setUniform2iv(this.sizeId, this.textureSize); - super.updateValue(images); - } -} - -module.exports = { - WebGL2KernelValueDynamicHTMLImageArray -}; -},{"../../../utils":113,"./html-image-array":91}],79:[function(require,module,exports){ -const { utils } = require('../../../utils'); -const { WebGLKernelValueDynamicHTMLImage } = require('../../web-gl/kernel-value/dynamic-html-image'); - -class WebGL2KernelValueDynamicHTMLImage extends WebGLKernelValueDynamicHTMLImage { - getSource() { - const variablePrecision = this.getVariablePrecisionString(); - return utils.linesToString([ - `uniform ${ variablePrecision } sampler2D ${this.id}`, - `uniform ${ variablePrecision } ivec2 ${this.sizeId}`, - `uniform ${ variablePrecision } ivec3 ${this.dimensionsId}`, - ]); - } -} - -module.exports = { - WebGL2KernelValueDynamicHTMLImage -}; -},{"../../../utils":113,"../../web-gl/kernel-value/dynamic-html-image":44}],80:[function(require,module,exports){ -const { utils } = require('../../../utils'); -const { WebGL2KernelValueDynamicHTMLImage } = require('./dynamic-html-image'); - -class WebGL2KernelValueDynamicHTMLVideo extends WebGL2KernelValueDynamicHTMLImage {} - -module.exports = { - WebGL2KernelValueDynamicHTMLVideo -}; -},{"../../../utils":113,"./dynamic-html-image":79}],81:[function(require,module,exports){ -const { utils } = require('../../../utils'); -const { WebGLKernelValueDynamicMemoryOptimizedNumberTexture } = require('../../web-gl/kernel-value/dynamic-memory-optimized-number-texture'); - -class WebGL2KernelValueDynamicMemoryOptimizedNumberTexture extends WebGLKernelValueDynamicMemoryOptimizedNumberTexture { - getSource() { - return utils.linesToString([ - `uniform sampler2D ${this.id}`, - `uniform ivec2 ${this.sizeId}`, - `uniform ivec3 ${this.dimensionsId}`, - ]); - } -} - -module.exports = { - WebGL2KernelValueDynamicMemoryOptimizedNumberTexture -}; -},{"../../../utils":113,"../../web-gl/kernel-value/dynamic-memory-optimized-number-texture":46}],82:[function(require,module,exports){ -const { utils } = require('../../../utils'); -const { WebGLKernelValueDynamicNumberTexture } = require('../../web-gl/kernel-value/dynamic-number-texture'); - -class WebGL2KernelValueDynamicNumberTexture extends WebGLKernelValueDynamicNumberTexture { - getSource() { - const variablePrecision = this.getVariablePrecisionString(); - return utils.linesToString([ - `uniform ${ variablePrecision } sampler2D ${this.id}`, - `uniform ${ variablePrecision } ivec2 ${this.sizeId}`, - `uniform ${ variablePrecision } ivec3 ${this.dimensionsId}`, - ]); - } -} - -module.exports = { - WebGL2KernelValueDynamicNumberTexture -}; -},{"../../../utils":113,"../../web-gl/kernel-value/dynamic-number-texture":47}],83:[function(require,module,exports){ -const { utils } = require('../../../utils'); -const { WebGL2KernelValueSingleArray } = require('../../web-gl2/kernel-value/single-array'); - -class WebGL2KernelValueDynamicSingleArray extends WebGL2KernelValueSingleArray { - getSource() { - const variablePrecision = this.getVariablePrecisionString(); - return utils.linesToString([ - `uniform ${ variablePrecision } sampler2D ${this.id}`, - `uniform ${ variablePrecision } ivec2 ${this.sizeId}`, - `uniform ${ variablePrecision } ivec3 ${this.dimensionsId}`, - ]); - } - - updateValue(value) { - this.dimensions = utils.getDimensions(value, true); - this.textureSize = utils.getMemoryOptimizedFloatTextureSize(this.dimensions, this.bitRatio); - this.uploadArrayLength = this.textureSize[0] * this.textureSize[1] * this.bitRatio; - this.checkSize(this.textureSize[0], this.textureSize[1]); - this.uploadValue = new Float32Array(this.uploadArrayLength); - this.kernel.setUniform3iv(this.dimensionsId, this.dimensions); - this.kernel.setUniform2iv(this.sizeId, this.textureSize); - super.updateValue(value); - } -} - -module.exports = { - WebGL2KernelValueDynamicSingleArray -}; -},{"../../../utils":113,"../../web-gl2/kernel-value/single-array":97}],84:[function(require,module,exports){ -const { utils } = require('../../../utils'); -const { WebGL2KernelValueSingleArray1DI } = require('../../web-gl2/kernel-value/single-array1d-i'); - -class WebGL2KernelValueDynamicSingleArray1DI extends WebGL2KernelValueSingleArray1DI { - getSource() { - const variablePrecision = this.getVariablePrecisionString(); - return utils.linesToString([ - `uniform ${ variablePrecision } sampler2D ${this.id}`, - `uniform ${ variablePrecision } ivec2 ${this.sizeId}`, - `uniform ${ variablePrecision } ivec3 ${this.dimensionsId}`, - ]); - } - - updateValue(value) { - this.setShape(value); - this.kernel.setUniform3iv(this.dimensionsId, this.dimensions); - this.kernel.setUniform2iv(this.sizeId, this.textureSize); - super.updateValue(value); - } -} - -module.exports = { - WebGL2KernelValueDynamicSingleArray1DI -}; -},{"../../../utils":113,"../../web-gl2/kernel-value/single-array1d-i":98}],85:[function(require,module,exports){ -const { utils } = require('../../../utils'); -const { WebGL2KernelValueSingleArray2DI } = require('../../web-gl2/kernel-value/single-array2d-i'); - -class WebGL2KernelValueDynamicSingleArray2DI extends WebGL2KernelValueSingleArray2DI { - getSource() { - const variablePrecision = this.getVariablePrecisionString(); - return utils.linesToString([ - `uniform ${ variablePrecision } sampler2D ${this.id}`, - `uniform ${ variablePrecision } ivec2 ${this.sizeId}`, - `uniform ${ variablePrecision } ivec3 ${this.dimensionsId}`, - ]); - } - - updateValue(value) { - this.setShape(value); - this.kernel.setUniform3iv(this.dimensionsId, this.dimensions); - this.kernel.setUniform2iv(this.sizeId, this.textureSize); - super.updateValue(value); - } -} - -module.exports = { - WebGL2KernelValueDynamicSingleArray2DI -}; -},{"../../../utils":113,"../../web-gl2/kernel-value/single-array2d-i":99}],86:[function(require,module,exports){ -const { utils } = require('../../../utils'); -const { WebGL2KernelValueSingleArray3DI } = require('../../web-gl2/kernel-value/single-array3d-i'); - -class WebGL2KernelValueDynamicSingleArray3DI extends WebGL2KernelValueSingleArray3DI { - getSource() { - const variablePrecision = this.getVariablePrecisionString(); - return utils.linesToString([ - `uniform ${ variablePrecision } sampler2D ${this.id}`, - `uniform ${ variablePrecision } ivec2 ${this.sizeId}`, - `uniform ${ variablePrecision } ivec3 ${this.dimensionsId}`, - ]); - } - - updateValue(value) { - this.setShape(value); - this.kernel.setUniform3iv(this.dimensionsId, this.dimensions); - this.kernel.setUniform2iv(this.sizeId, this.textureSize); - super.updateValue(value); - } -} - -module.exports = { - WebGL2KernelValueDynamicSingleArray3DI -}; -},{"../../../utils":113,"../../web-gl2/kernel-value/single-array3d-i":100}],87:[function(require,module,exports){ -const { utils } = require('../../../utils'); -const { WebGL2KernelValueSingleInput } = require('../../web-gl2/kernel-value/single-input'); - -class WebGL2KernelValueDynamicSingleInput extends WebGL2KernelValueSingleInput { - getSource() { - const variablePrecision = this.getVariablePrecisionString(); - return utils.linesToString([ - `uniform ${ variablePrecision } sampler2D ${this.id}`, - `uniform ${ variablePrecision } ivec2 ${this.sizeId}`, - `uniform ${ variablePrecision } ivec3 ${this.dimensionsId}`, - ]); - } - - updateValue(value) { - let [w, h, d] = value.size; - this.dimensions = new Int32Array([w || 1, h || 1, d || 1]); - this.textureSize = utils.getMemoryOptimizedFloatTextureSize(this.dimensions, this.bitRatio); - this.uploadArrayLength = this.textureSize[0] * this.textureSize[1] * this.bitRatio; - this.checkSize(this.textureSize[0], this.textureSize[1]); - this.uploadValue = new Float32Array(this.uploadArrayLength); - this.kernel.setUniform3iv(this.dimensionsId, this.dimensions); - this.kernel.setUniform2iv(this.sizeId, this.textureSize); - super.updateValue(value); - } -} - -module.exports = { - WebGL2KernelValueDynamicSingleInput -}; -},{"../../../utils":113,"../../web-gl2/kernel-value/single-input":101}],88:[function(require,module,exports){ -const { utils } = require('../../../utils'); -const { WebGLKernelValueDynamicUnsignedArray } = require('../../web-gl/kernel-value/dynamic-unsigned-array'); - -class WebGL2KernelValueDynamicUnsignedArray extends WebGLKernelValueDynamicUnsignedArray { - getSource() { - const variablePrecision = this.getVariablePrecisionString(); - return utils.linesToString([ - `uniform ${ variablePrecision } sampler2D ${this.id}`, - `uniform ${ variablePrecision } ivec2 ${this.sizeId}`, - `uniform ${ variablePrecision } ivec3 ${this.dimensionsId}`, - ]); - } -} - -module.exports = { - WebGL2KernelValueDynamicUnsignedArray -}; -},{"../../../utils":113,"../../web-gl/kernel-value/dynamic-unsigned-array":53}],89:[function(require,module,exports){ -const { utils } = require('../../../utils'); -const { WebGLKernelValueDynamicUnsignedInput } = require('../../web-gl/kernel-value/dynamic-unsigned-input'); - -class WebGL2KernelValueDynamicUnsignedInput extends WebGLKernelValueDynamicUnsignedInput { - getSource() { - const variablePrecision = this.getVariablePrecisionString(); - return utils.linesToString([ - `uniform ${ variablePrecision } sampler2D ${this.id}`, - `uniform ${ variablePrecision } ivec2 ${this.sizeId}`, - `uniform ${ variablePrecision } ivec3 ${this.dimensionsId}`, - ]); - } -} - -module.exports = { - WebGL2KernelValueDynamicUnsignedInput -}; -},{"../../../utils":113,"../../web-gl/kernel-value/dynamic-unsigned-input":54}],90:[function(require,module,exports){ -const { utils } = require('../../../utils'); -const { WebGLKernelValueFloat } = require('../../web-gl/kernel-value/float'); - -class WebGL2KernelValueFloat extends WebGLKernelValueFloat {} - -module.exports = { - WebGL2KernelValueFloat -}; -},{"../../../utils":113,"../../web-gl/kernel-value/float":55}],91:[function(require,module,exports){ -const { utils } = require('../../../utils'); -const { WebGLKernelArray } = require('../../web-gl/kernel-value/array'); - -class WebGL2KernelValueHTMLImageArray extends WebGLKernelArray { - constructor(value, settings) { - super(value, settings); - this.checkSize(value[0].width, value[0].height); - this.dimensions = [value[0].width, value[0].height, value.length]; - this.textureSize = [value[0].width, value[0].height]; - } - defineTexture() { - const { context: gl } = this; - gl.activeTexture(this.contextHandle); - gl.bindTexture(gl.TEXTURE_2D_ARRAY, this.texture); - gl.texParameteri(gl.TEXTURE_2D_ARRAY, gl.TEXTURE_MAG_FILTER, gl.NEAREST); - gl.texParameteri(gl.TEXTURE_2D_ARRAY, gl.TEXTURE_MIN_FILTER, gl.NEAREST); - } - - getStringValueHandler() { - return `const uploadValue_${this.name} = ${this.varName};\n`; - } - getSource() { - const variablePrecision = this.getVariablePrecisionString(); - return utils.linesToString([ - `uniform ${ variablePrecision } sampler2DArray ${this.id}`, - `${ variablePrecision } ivec2 ${this.sizeId} = ivec2(${this.textureSize[0]}, ${this.textureSize[1]})`, - `${ variablePrecision } ivec3 ${this.dimensionsId} = ivec3(${this.dimensions[0]}, ${this.dimensions[1]}, ${this.dimensions[2]})`, - ]); - } - - updateValue(images) { - const { context: gl } = this; - gl.activeTexture(this.contextHandle); - gl.bindTexture(gl.TEXTURE_2D_ARRAY, this.texture); - gl.pixelStorei(gl.UNPACK_FLIP_Y_WEBGL, true); - gl.texImage3D( - gl.TEXTURE_2D_ARRAY, - 0, - gl.RGBA, - images[0].width, - images[0].height, - images.length, - 0, - gl.RGBA, - gl.UNSIGNED_BYTE, - null - ); - for (let i = 0; i < images.length; i++) { - const xOffset = 0; - const yOffset = 0; - const imageDepth = 1; - gl.texSubImage3D( - gl.TEXTURE_2D_ARRAY, - 0, - xOffset, - yOffset, - i, - images[i].width, - images[i].height, - imageDepth, - gl.RGBA, - gl.UNSIGNED_BYTE, - this.uploadValue = images[i] - ); - } - this.kernel.setUniform1i(this.id, this.index); - } -} - -module.exports = { - WebGL2KernelValueHTMLImageArray -}; -},{"../../../utils":113,"../../web-gl/kernel-value/array":39}],92:[function(require,module,exports){ -const { utils } = require('../../../utils'); -const { WebGLKernelValueHTMLImage } = require('../../web-gl/kernel-value/html-image'); - -class WebGL2KernelValueHTMLImage extends WebGLKernelValueHTMLImage { - getSource() { - const variablePrecision = this.getVariablePrecisionString(); - return utils.linesToString([ - `uniform ${ variablePrecision } sampler2D ${this.id}`, - `${ variablePrecision } ivec2 ${this.sizeId} = ivec2(${this.textureSize[0]}, ${this.textureSize[1]})`, - `${ variablePrecision } ivec3 ${this.dimensionsId} = ivec3(${this.dimensions[0]}, ${this.dimensions[1]}, ${this.dimensions[2]})`, - ]); - } -} - -module.exports = { - WebGL2KernelValueHTMLImage -}; -},{"../../../utils":113,"../../web-gl/kernel-value/html-image":56}],93:[function(require,module,exports){ -const { utils } = require('../../../utils'); -const { WebGL2KernelValueHTMLImage } = require('./html-image'); - -class WebGL2KernelValueHTMLVideo extends WebGL2KernelValueHTMLImage {} - -module.exports = { - WebGL2KernelValueHTMLVideo -}; -},{"../../../utils":113,"./html-image":92}],94:[function(require,module,exports){ -const { WebGLKernelValueInteger } = require('../../web-gl/kernel-value/integer'); - -class WebGL2KernelValueInteger extends WebGLKernelValueInteger { - getSource(value) { - const variablePrecision = this.getVariablePrecisionString(); - if (this.origin === 'constants') { - return `const ${ variablePrecision } int ${this.id} = ${ parseInt(value) };\n`; - } - return `uniform ${ variablePrecision } int ${this.id};\n`; - } - - updateValue(value) { - if (this.origin === 'constants') return; - this.kernel.setUniform1i(this.id, this.uploadValue = value); - } -} - -module.exports = { - WebGL2KernelValueInteger -}; -},{"../../web-gl/kernel-value/integer":59}],95:[function(require,module,exports){ -const { utils } = require('../../../utils'); -const { WebGLKernelValueMemoryOptimizedNumberTexture } = require('../../web-gl/kernel-value/memory-optimized-number-texture'); - -class WebGL2KernelValueMemoryOptimizedNumberTexture extends WebGLKernelValueMemoryOptimizedNumberTexture { - getSource() { - const { id, sizeId, textureSize, dimensionsId, dimensions } = this; - const variablePrecision = this.getVariablePrecisionString(); - return utils.linesToString([ - `uniform sampler2D ${id}`, - `${ variablePrecision } ivec2 ${sizeId} = ivec2(${textureSize[0]}, ${textureSize[1]})`, - `${ variablePrecision } ivec3 ${dimensionsId} = ivec3(${dimensions[0]}, ${dimensions[1]}, ${dimensions[2]})`, - ]); - } -} - -module.exports = { - WebGL2KernelValueMemoryOptimizedNumberTexture -}; -},{"../../../utils":113,"../../web-gl/kernel-value/memory-optimized-number-texture":60}],96:[function(require,module,exports){ -const { utils } = require('../../../utils'); -const { WebGLKernelValueNumberTexture } = require('../../web-gl/kernel-value/number-texture'); - -class WebGL2KernelValueNumberTexture extends WebGLKernelValueNumberTexture { - getSource() { - const { id, sizeId, textureSize, dimensionsId, dimensions } = this; - const variablePrecision = this.getVariablePrecisionString(); - return utils.linesToString([ - `uniform ${ variablePrecision } sampler2D ${id}`, - `${ variablePrecision } ivec2 ${sizeId} = ivec2(${textureSize[0]}, ${textureSize[1]})`, - `${ variablePrecision } ivec3 ${dimensionsId} = ivec3(${dimensions[0]}, ${dimensions[1]}, ${dimensions[2]})`, - ]); - } -} - -module.exports = { - WebGL2KernelValueNumberTexture -}; -},{"../../../utils":113,"../../web-gl/kernel-value/number-texture":61}],97:[function(require,module,exports){ -const { utils } = require('../../../utils'); -const { WebGLKernelValueSingleArray } = require('../../web-gl/kernel-value/single-array'); - -class WebGL2KernelValueSingleArray extends WebGLKernelValueSingleArray { - getSource() { - const variablePrecision = this.getVariablePrecisionString(); - return utils.linesToString([ - `uniform ${ variablePrecision } sampler2D ${this.id}`, - `${ variablePrecision } ivec2 ${this.sizeId} = ivec2(${this.textureSize[0]}, ${this.textureSize[1]})`, - `${ variablePrecision } ivec3 ${this.dimensionsId} = ivec3(${this.dimensions[0]}, ${this.dimensions[1]}, ${this.dimensions[2]})`, - ]); - } - - updateValue(value) { - if (value.constructor !== this.initialValueConstructor) { - this.onUpdateValueMismatch(value.constructor); - return; - } - const { context: gl } = this; - utils.flattenTo(value, this.uploadValue); - gl.activeTexture(this.contextHandle); - gl.bindTexture(gl.TEXTURE_2D, this.texture); - gl.pixelStorei(gl.UNPACK_FLIP_Y_WEBGL, false); - gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA32F, this.textureSize[0], this.textureSize[1], 0, gl.RGBA, gl.FLOAT, this.uploadValue); - this.kernel.setUniform1i(this.id, this.index); - } -} - -module.exports = { - WebGL2KernelValueSingleArray -}; -},{"../../../utils":113,"../../web-gl/kernel-value/single-array":62}],98:[function(require,module,exports){ -const { utils } = require('../../../utils'); -const { WebGLKernelValueSingleArray1DI } = require('../../web-gl/kernel-value/single-array1d-i'); - -class WebGL2KernelValueSingleArray1DI extends WebGLKernelValueSingleArray1DI { - updateValue(value) { - if (value.constructor !== this.initialValueConstructor) { - this.onUpdateValueMismatch(value.constructor); - return; - } - const { context: gl } = this; - utils.flattenTo(value, this.uploadValue); - gl.activeTexture(this.contextHandle); - gl.bindTexture(gl.TEXTURE_2D, this.texture); - gl.pixelStorei(gl.UNPACK_FLIP_Y_WEBGL, false); - gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA32F, this.textureSize[0], this.textureSize[1], 0, gl.RGBA, gl.FLOAT, this.uploadValue); - this.kernel.setUniform1i(this.id, this.index); - } -} - -module.exports = { - WebGL2KernelValueSingleArray1DI -}; -},{"../../../utils":113,"../../web-gl/kernel-value/single-array1d-i":63}],99:[function(require,module,exports){ -const { utils } = require('../../../utils'); -const { WebGLKernelValueSingleArray2DI } = require('../../web-gl/kernel-value/single-array2d-i'); - -class WebGL2KernelValueSingleArray2DI extends WebGLKernelValueSingleArray2DI { - updateValue(value) { - if (value.constructor !== this.initialValueConstructor) { - this.onUpdateValueMismatch(value.constructor); - return; - } - const { context: gl } = this; - utils.flattenTo(value, this.uploadValue); - gl.activeTexture(this.contextHandle); - gl.bindTexture(gl.TEXTURE_2D, this.texture); - gl.pixelStorei(gl.UNPACK_FLIP_Y_WEBGL, false); - gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA32F, this.textureSize[0], this.textureSize[1], 0, gl.RGBA, gl.FLOAT, this.uploadValue); - this.kernel.setUniform1i(this.id, this.index); - } -} - -module.exports = { - WebGL2KernelValueSingleArray2DI -}; -},{"../../../utils":113,"../../web-gl/kernel-value/single-array2d-i":64}],100:[function(require,module,exports){ -const { utils } = require('../../../utils'); -const { WebGLKernelValueSingleArray3DI } = require('../../web-gl/kernel-value/single-array3d-i'); - -class WebGL2KernelValueSingleArray3DI extends WebGLKernelValueSingleArray3DI { - updateValue(value) { - if (value.constructor !== this.initialValueConstructor) { - this.onUpdateValueMismatch(value.constructor); - return; - } - const { context: gl } = this; - utils.flattenTo(value, this.uploadValue); - gl.activeTexture(this.contextHandle); - gl.bindTexture(gl.TEXTURE_2D, this.texture); - gl.pixelStorei(gl.UNPACK_FLIP_Y_WEBGL, false); - gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA32F, this.textureSize[0], this.textureSize[1], 0, gl.RGBA, gl.FLOAT, this.uploadValue); - this.kernel.setUniform1i(this.id, this.index); - } -} - -module.exports = { - WebGL2KernelValueSingleArray3DI -}; -},{"../../../utils":113,"../../web-gl/kernel-value/single-array3d-i":65}],101:[function(require,module,exports){ -const { utils } = require('../../../utils'); -const { WebGLKernelValueSingleInput } = require('../../web-gl/kernel-value/single-input'); - -class WebGL2KernelValueSingleInput extends WebGLKernelValueSingleInput { - getSource() { - const variablePrecision = this.getVariablePrecisionString(); - return utils.linesToString([ - `uniform ${ variablePrecision } sampler2D ${this.id}`, - `${ variablePrecision } ivec2 ${this.sizeId} = ivec2(${this.textureSize[0]}, ${this.textureSize[1]})`, - `${ variablePrecision } ivec3 ${this.dimensionsId} = ivec3(${this.dimensions[0]}, ${this.dimensions[1]}, ${this.dimensions[2]})`, - ]); - } - - updateValue(input) { - const { context: gl } = this; - utils.flattenTo(input.value, this.uploadValue); - gl.activeTexture(this.contextHandle); - gl.bindTexture(gl.TEXTURE_2D, this.texture); - gl.pixelStorei(gl.UNPACK_FLIP_Y_WEBGL, false); - gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA32F, this.textureSize[0], this.textureSize[1], 0, gl.RGBA, gl.FLOAT, this.uploadValue); - this.kernel.setUniform1i(this.id, this.index); - } -} - -module.exports = { - WebGL2KernelValueSingleInput -}; -},{"../../../utils":113,"../../web-gl/kernel-value/single-input":66}],102:[function(require,module,exports){ -const { utils } = require('../../../utils'); -const { WebGLKernelValueUnsignedArray } = require('../../web-gl/kernel-value/unsigned-array'); - -class WebGL2KernelValueUnsignedArray extends WebGLKernelValueUnsignedArray { - getSource() { - const variablePrecision = this.getVariablePrecisionString(); - return utils.linesToString([ - `uniform ${ variablePrecision } sampler2D ${this.id}`, - `${ variablePrecision } ivec2 ${this.sizeId} = ivec2(${this.textureSize[0]}, ${this.textureSize[1]})`, - `${ variablePrecision } ivec3 ${this.dimensionsId} = ivec3(${this.dimensions[0]}, ${this.dimensions[1]}, ${this.dimensions[2]})`, - ]); - } -} - -module.exports = { - WebGL2KernelValueUnsignedArray -}; -},{"../../../utils":113,"../../web-gl/kernel-value/unsigned-array":67}],103:[function(require,module,exports){ -const { utils } = require('../../../utils'); -const { WebGLKernelValueUnsignedInput } = require('../../web-gl/kernel-value/unsigned-input'); - -class WebGL2KernelValueUnsignedInput extends WebGLKernelValueUnsignedInput { - getSource() { - const variablePrecision = this.getVariablePrecisionString(); - return utils.linesToString([ - `uniform ${ variablePrecision } sampler2D ${this.id}`, - `${ variablePrecision } ivec2 ${this.sizeId} = ivec2(${this.textureSize[0]}, ${this.textureSize[1]})`, - `${ variablePrecision } ivec3 ${this.dimensionsId} = ivec3(${this.dimensions[0]}, ${this.dimensions[1]}, ${this.dimensions[2]})`, - ]); - } -} - -module.exports = { - WebGL2KernelValueUnsignedInput -}; -},{"../../../utils":113,"../../web-gl/kernel-value/unsigned-input":68}],104:[function(require,module,exports){ -const { WebGLKernel } = require('../web-gl/kernel'); -const { WebGL2FunctionNode } = require('./function-node'); -const { FunctionBuilder } = require('../function-builder'); -const { utils } = require('../../utils'); -const { fragmentShader } = require('./fragment-shader'); -const { vertexShader } = require('./vertex-shader'); -const { lookupKernelValueType } = require('./kernel-value-maps'); - -let isSupported = null; -let testCanvas = null; -let testContext = null; -let testExtensions = null; - -let features = null; - -class WebGL2Kernel extends WebGLKernel { - static get isSupported() { - if (isSupported !== null) { - return isSupported; - } - this.setupFeatureChecks(); - isSupported = this.isContextMatch(testContext); - return isSupported; - } - - static setupFeatureChecks() { - if (typeof document !== 'undefined') { - testCanvas = document.createElement('canvas'); - } else if (typeof OffscreenCanvas !== 'undefined') { - testCanvas = new OffscreenCanvas(0, 0); - } - if (!testCanvas) return; - testContext = testCanvas.getContext('webgl2'); - if (!testContext || !testContext.getExtension) return; - testExtensions = { - EXT_color_buffer_float: testContext.getExtension('EXT_color_buffer_float'), - OES_texture_float_linear: testContext.getExtension('OES_texture_float_linear'), - }; - features = this.getFeatures(); - } - - static isContextMatch(context) { - if (typeof WebGL2RenderingContext !== 'undefined') { - return context instanceof WebGL2RenderingContext; - } - return false; - } - - static getFeatures() { - const gl = this.testContext; - return Object.freeze({ - isFloatRead: this.getIsFloatRead(), - isIntegerDivisionAccurate: this.getIsIntegerDivisionAccurate(), - isSpeedTacticSupported: this.getIsSpeedTacticSupported(), - kernelMap: true, - isTextureFloat: true, - isDrawBuffers: true, - channelCount: this.getChannelCount(), - maxTextureSize: this.getMaxTextureSize(), - lowIntPrecision: gl.getShaderPrecisionFormat(gl.FRAGMENT_SHADER, gl.LOW_INT), - lowFloatPrecision: gl.getShaderPrecisionFormat(gl.FRAGMENT_SHADER, gl.LOW_FLOAT), - mediumIntPrecision: gl.getShaderPrecisionFormat(gl.FRAGMENT_SHADER, gl.MEDIUM_INT), - mediumFloatPrecision: gl.getShaderPrecisionFormat(gl.FRAGMENT_SHADER, gl.MEDIUM_FLOAT), - highIntPrecision: gl.getShaderPrecisionFormat(gl.FRAGMENT_SHADER, gl.HIGH_INT), - highFloatPrecision: gl.getShaderPrecisionFormat(gl.FRAGMENT_SHADER, gl.HIGH_FLOAT), - }); - } - - static getIsTextureFloat() { - return true; - } - - static getChannelCount() { - return testContext.getParameter(testContext.MAX_DRAW_BUFFERS); - } - - static getMaxTextureSize() { - return testContext.getParameter(testContext.MAX_TEXTURE_SIZE); - } - - static lookupKernelValueType(type, dynamic, precision, value) { - return lookupKernelValueType(type, dynamic, precision, value); - } - - static get testCanvas() { - return testCanvas; - } - - static get testContext() { - return testContext; - } - - static get features() { - return features; - } - - static get fragmentShader() { - return fragmentShader; - } - static get vertexShader() { - return vertexShader; - } - - initContext() { - const settings = { - alpha: false, - depth: false, - antialias: false - }; - return this.canvas.getContext('webgl2', settings); - } - - initExtensions() { - this.extensions = { - EXT_color_buffer_float: this.context.getExtension('EXT_color_buffer_float'), - OES_texture_float_linear: this.context.getExtension('OES_texture_float_linear'), - }; - } - - validateSettings(args) { - if (!this.validate) { - this.texSize = utils.getKernelTextureSize({ - optimizeFloatMemory: this.optimizeFloatMemory, - precision: this.precision, - }, this.output); - return; - } - - const { features } = this.constructor; - if (this.precision === 'single' && !features.isFloatRead) { - throw new Error('Float texture outputs are not supported'); - } else if (!this.graphical && this.precision === null) { - this.precision = features.isFloatRead ? 'single' : 'unsigned'; - } - - if (this.fixIntegerDivisionAccuracy === null) { - this.fixIntegerDivisionAccuracy = !features.isIntegerDivisionAccurate; - } else if (this.fixIntegerDivisionAccuracy && features.isIntegerDivisionAccurate) { - this.fixIntegerDivisionAccuracy = false; - } - - this.checkOutput(); - - if (!this.output || this.output.length === 0) { - if (args.length !== 1) { - throw new Error('Auto output only supported for kernels with only one input'); - } - - const argType = utils.getVariableType(args[0], this.strictIntegers); - switch (argType) { - case 'Array': - this.output = utils.getDimensions(argType); - break; - case 'NumberTexture': - case 'MemoryOptimizedNumberTexture': - case 'ArrayTexture(1)': - case 'ArrayTexture(2)': - case 'ArrayTexture(3)': - case 'ArrayTexture(4)': - this.output = args[0].output; - break; - default: - throw new Error('Auto output not supported for input type: ' + argType); - } - } - - if (this.graphical) { - if (this.output.length !== 2) { - throw new Error('Output must have 2 dimensions on graphical mode'); - } - - if (this.precision === 'single') { - console.warn('Cannot use graphical mode and single precision at the same time'); - this.precision = 'unsigned'; - } - - this.texSize = utils.clone(this.output); - return; - } else if (!this.graphical && this.precision === null && features.isTextureFloat) { - this.precision = 'single'; - } - - this.texSize = utils.getKernelTextureSize({ - optimizeFloatMemory: this.optimizeFloatMemory, - precision: this.precision, - }, this.output); - - this.checkTextureSize(); - } - - translateSource() { - const functionBuilder = FunctionBuilder.fromKernel(this, WebGL2FunctionNode, { - fixIntegerDivisionAccuracy: this.fixIntegerDivisionAccuracy - }); - this.translatedSource = functionBuilder.getPrototypeString('kernel'); - this.setupReturnTypes(functionBuilder); - } - - drawBuffers() { - this.context.drawBuffers(this.drawBuffersMap); - } - - getTextureFormat() { - const { context: gl } = this; - switch (this.getInternalFormat()) { - case gl.R32F: - return gl.RED; - case gl.RG32F: - return gl.RG; - case gl.RGBA32F: - return gl.RGBA; - case gl.RGBA: - return gl.RGBA; - default: - throw new Error('Unknown internal format'); - } - } - getInternalFormat() { - const { context: gl } = this; - - if (this.precision === 'single') { - if (this.pipeline) { - switch (this.returnType) { - case 'Number': - case 'Float': - case 'Integer': - if (this.optimizeFloatMemory) { - return gl.RGBA32F; - } else { - return gl.R32F; - } - case 'Array(2)': - return gl.RG32F; - case 'Array(3)': - case 'Array(4)': - return gl.RGBA32F; - default: - throw new Error('Unhandled return type'); - } - } - return gl.RGBA32F; - } - return gl.RGBA; - } - - _setupOutputTexture() { - const gl = this.context; - if (this.texture) { - gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.texture.texture, 0); - return; - } - gl.bindFramebuffer(gl.FRAMEBUFFER, this.framebuffer); - const texture = gl.createTexture(); - const texSize = this.texSize; - gl.activeTexture(gl.TEXTURE0 + this.constantTextureCount + this.argumentTextureCount); - gl.bindTexture(gl.TEXTURE_2D, texture); - gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.REPEAT); - gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.REPEAT); - gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.NEAREST); - gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.NEAREST); - const format = this.getInternalFormat(); - if (this.precision === 'single') { - gl.texStorage2D(gl.TEXTURE_2D, 1, format, texSize[0], texSize[1]); - } else { - gl.texImage2D(gl.TEXTURE_2D, 0, format, texSize[0], texSize[1], 0, format, gl.UNSIGNED_BYTE, null); - } - gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, texture, 0); - this.texture = new this.TextureConstructor({ - texture, - size: texSize, - dimensions: this.threadDim, - output: this.output, - context: this.context, - internalFormat: this.getInternalFormat(), - textureFormat: this.getTextureFormat(), - kernel: this, - }); - } - - _setupSubOutputTextures() { - const gl = this.context; - if (this.mappedTextures) { - for (let i = 0; i < this.subKernels.length; i++) { - gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0 + i + 1, gl.TEXTURE_2D, this.mappedTextures[i].texture, 0); - } - return; - } - const texSize = this.texSize; - this.drawBuffersMap = [gl.COLOR_ATTACHMENT0]; - this.mappedTextures = []; - for (let i = 0; i < this.subKernels.length; i++) { - const texture = this.createTexture(); - this.drawBuffersMap.push(gl.COLOR_ATTACHMENT0 + i + 1); - gl.activeTexture(gl.TEXTURE0 + this.constantTextureCount + this.argumentTextureCount + i); - gl.bindTexture(gl.TEXTURE_2D, texture); - gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE); - gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE); - gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.NEAREST); - gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.NEAREST); - const format = this.getInternalFormat(); - if (this.precision === 'single') { - gl.texStorage2D(gl.TEXTURE_2D, 1, format, texSize[0], texSize[1]); - } else { - gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, texSize[0], texSize[1], 0, gl.RGBA, gl.UNSIGNED_BYTE, null); - } - gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0 + i + 1, gl.TEXTURE_2D, texture, 0); - - this.mappedTextures.push(new this.TextureConstructor({ - texture, - size: texSize, - dimensions: this.threadDim, - output: this.output, - context: this.context, - internalFormat: this.getInternalFormat(), - textureFormat: this.getTextureFormat(), - kernel: this, - })); - } - } - - _getHeaderString() { - return ''; - } - - _getTextureCoordinate() { - const subKernels = this.subKernels; - const variablePrecision = this.getVariablePrecisionString(this.texSize, this.tactic); - if (subKernels === null || subKernels.length < 1) { - return `in ${ variablePrecision } vec2 vTexCoord;\n`; - } else { - return `out ${ variablePrecision } vec2 vTexCoord;\n`; - } - } - - _getMainArgumentsString(args) { - const result = []; - const argumentNames = this.argumentNames; - for (let i = 0; i < argumentNames.length; i++) { - result.push(this.kernelArguments[i].getSource(args[i])); - } - return result.join(''); - } - - getKernelString() { - const result = [this.getKernelResultDeclaration()]; - const subKernels = this.subKernels; - if (subKernels !== null) { - result.push( - 'layout(location = 0) out vec4 data0' - ); - switch (this.returnType) { - case 'Number': - case 'Float': - case 'Integer': - for (let i = 0; i < subKernels.length; i++) { - const subKernel = subKernels[i]; - result.push( - subKernel.returnType === 'Integer' ? - `int subKernelResult_${ subKernel.name } = 0` : - `float subKernelResult_${ subKernel.name } = 0.0`, - `layout(location = ${ i + 1 }) out vec4 data${ i + 1 }` - ); - } - break; - case 'Array(2)': - for (let i = 0; i < subKernels.length; i++) { - result.push( - `vec2 subKernelResult_${ subKernels[i].name }`, - `layout(location = ${ i + 1 }) out vec4 data${ i + 1 }` - ); - } - break; - case 'Array(3)': - for (let i = 0; i < subKernels.length; i++) { - result.push( - `vec3 subKernelResult_${ subKernels[i].name }`, - `layout(location = ${ i + 1 }) out vec4 data${ i + 1 }` - ); - } - break; - case 'Array(4)': - for (let i = 0; i < subKernels.length; i++) { - result.push( - `vec4 subKernelResult_${ subKernels[i].name }`, - `layout(location = ${ i + 1 }) out vec4 data${ i + 1 }` - ); - } - break; - } - } else { - result.push( - 'out vec4 data0' - ); - } - - return utils.linesToString(result) + this.translatedSource; - } - - getMainResultGraphical() { - return utils.linesToString([ - ' threadId = indexTo3D(index, uOutputDim)', - ' kernel()', - ' data0 = actualColor', - ]); - } - - getMainResultPackedPixels() { - switch (this.returnType) { - case 'LiteralInteger': - case 'Number': - case 'Integer': - case 'Float': - return this.getMainResultKernelPackedPixels() + - this.getMainResultSubKernelPackedPixels(); - default: - throw new Error(`packed output only usable with Numbers, "${this.returnType}" specified`); - } - } - - getMainResultKernelPackedPixels() { - return utils.linesToString([ - ' threadId = indexTo3D(index, uOutputDim)', - ' kernel()', - ` data0 = ${this.useLegacyEncoder ? 'legacyEncode32' : 'encode32'}(kernelResult)` - ]); - } - - getMainResultSubKernelPackedPixels() { - const result = []; - if (!this.subKernels) return ''; - for (let i = 0; i < this.subKernels.length; i++) { - const subKernel = this.subKernels[i]; - if (subKernel.returnType === 'Integer') { - result.push( - ` data${i + 1} = ${this.useLegacyEncoder ? 'legacyEncode32' : 'encode32'}(float(subKernelResult_${this.subKernels[i].name}))` - ); - } else { - result.push( - ` data${i + 1} = ${this.useLegacyEncoder ? 'legacyEncode32' : 'encode32'}(subKernelResult_${this.subKernels[i].name})` - ); - } - } - return utils.linesToString(result); - } - - getMainResultKernelMemoryOptimizedFloats(result, channel) { - result.push( - ' threadId = indexTo3D(index, uOutputDim)', - ' kernel()', - ` data0.${channel} = kernelResult` - ); - } - - getMainResultSubKernelMemoryOptimizedFloats(result, channel) { - if (!this.subKernels) return result; - for (let i = 0; i < this.subKernels.length; i++) { - const subKernel = this.subKernels[i]; - if (subKernel.returnType === 'Integer') { - result.push( - ` data${i + 1}.${channel} = float(subKernelResult_${subKernel.name})` - ); - } else { - result.push( - ` data${i + 1}.${channel} = subKernelResult_${subKernel.name}` - ); - } - } - } - - getMainResultKernelNumberTexture() { - return [ - ' threadId = indexTo3D(index, uOutputDim)', - ' kernel()', - ' data0[0] = kernelResult', - ]; - } - - getMainResultSubKernelNumberTexture() { - const result = []; - if (!this.subKernels) return result; - for (let i = 0; i < this.subKernels.length; ++i) { - const subKernel = this.subKernels[i]; - if (subKernel.returnType === 'Integer') { - result.push( - ` data${i + 1}[0] = float(subKernelResult_${subKernel.name})` - ); - } else { - result.push( - ` data${i + 1}[0] = subKernelResult_${subKernel.name}` - ); - } - } - return result; - } - - getMainResultKernelArray2Texture() { - return [ - ' threadId = indexTo3D(index, uOutputDim)', - ' kernel()', - ' data0[0] = kernelResult[0]', - ' data0[1] = kernelResult[1]', - ]; - } - - getMainResultSubKernelArray2Texture() { - const result = []; - if (!this.subKernels) return result; - for (let i = 0; i < this.subKernels.length; ++i) { - const subKernel = this.subKernels[i]; - result.push( - ` data${i + 1}[0] = subKernelResult_${subKernel.name}[0]`, - ` data${i + 1}[1] = subKernelResult_${subKernel.name}[1]` - ); - } - return result; - } - - getMainResultKernelArray3Texture() { - return [ - ' threadId = indexTo3D(index, uOutputDim)', - ' kernel()', - ' data0[0] = kernelResult[0]', - ' data0[1] = kernelResult[1]', - ' data0[2] = kernelResult[2]', - ]; - } - - getMainResultSubKernelArray3Texture() { - const result = []; - if (!this.subKernels) return result; - for (let i = 0; i < this.subKernels.length; ++i) { - const subKernel = this.subKernels[i]; - result.push( - ` data${i + 1}[0] = subKernelResult_${subKernel.name}[0]`, - ` data${i + 1}[1] = subKernelResult_${subKernel.name}[1]`, - ` data${i + 1}[2] = subKernelResult_${subKernel.name}[2]` - ); - } - return result; - } - - getMainResultKernelArray4Texture() { - return [ - ' threadId = indexTo3D(index, uOutputDim)', - ' kernel()', - ' data0 = kernelResult', - ]; - } - - getMainResultSubKernelArray4Texture() { - const result = []; - if (!this.subKernels) return result; - for (let i = 0; i < this.subKernels.length; ++i) { - result.push( - ` data${i + 1} = subKernelResult_${this.subKernels[i].name}` - ); - } - return result; - } - - destroyExtensions() { - this.extensions.EXT_color_buffer_float = null; - this.extensions.OES_texture_float_linear = null; - } - - toJSON() { - const json = super.toJSON(); - json.functionNodes = FunctionBuilder.fromKernel(this, WebGL2FunctionNode).toJSON(); - json.settings.threadDim = this.threadDim; - return json; - } -} - -module.exports = { - WebGL2Kernel -}; -},{"../../utils":113,"../function-builder":8,"../web-gl/kernel":69,"./fragment-shader":71,"./function-node":72,"./kernel-value-maps":73,"./vertex-shader":105}],105:[function(require,module,exports){ -const vertexShader = `#version 300 es -__FLOAT_TACTIC_DECLARATION__; -__INT_TACTIC_DECLARATION__; -__SAMPLER_2D_TACTIC_DECLARATION__; - -in vec2 aPos; -in vec2 aTexCoord; - -out vec2 vTexCoord; -uniform vec2 ratio; - -void main(void) { - gl_Position = vec4((aPos + vec2(1)) * ratio + vec2(-1), 0, 1); - vTexCoord = aTexCoord; -}`; - -module.exports = { - vertexShader -}; -},{}],106:[function(require,module,exports){ -const lib = require('./index'); -const GPU = lib.GPU; -for (const p in lib) { - if (!lib.hasOwnProperty(p)) continue; - if (p === 'GPU') continue; - GPU[p] = lib[p]; -} - -if (typeof window !== 'undefined') { - bindTo(window); -} -if (typeof self !== 'undefined') { - bindTo(self); -} - -function bindTo(target) { - if (target.GPU) return; - Object.defineProperty(target, 'GPU', { - get() { - return GPU; - } - }); -} - -module.exports = lib; -},{"./index":108}],107:[function(require,module,exports){ -const { gpuMock } = require('gpu-mock.js'); -const { utils } = require('./utils'); -const { Kernel } = require('./backend/kernel'); -const { CPUKernel } = require('./backend/cpu/kernel'); -const { HeadlessGLKernel } = require('./backend/headless-gl/kernel'); -const { WebGL2Kernel } = require('./backend/web-gl2/kernel'); -const { WebGLKernel } = require('./backend/web-gl/kernel'); -const { kernelRunShortcut } = require('./kernel-run-shortcut'); - - -const kernelOrder = [HeadlessGLKernel, WebGL2Kernel, WebGLKernel]; - -const kernelTypes = ['gpu', 'cpu']; - -const internalKernels = { - 'headlessgl': HeadlessGLKernel, - 'webgl2': WebGL2Kernel, - 'webgl': WebGLKernel, -}; - -let validate = true; - -class GPU { - static disableValidation() { - validate = false; - } - - static enableValidation() { - validate = true; - } - - static get isGPUSupported() { - return kernelOrder.some(Kernel => Kernel.isSupported); - } - - static get isKernelMapSupported() { - return kernelOrder.some(Kernel => Kernel.isSupported && Kernel.features.kernelMap); - } - - static get isOffscreenCanvasSupported() { - return (typeof Worker !== 'undefined' && typeof OffscreenCanvas !== 'undefined') || typeof importScripts !== 'undefined'; - } - - static get isWebGLSupported() { - return WebGLKernel.isSupported; - } - - static get isWebGL2Supported() { - return WebGL2Kernel.isSupported; - } - - static get isHeadlessGLSupported() { - return HeadlessGLKernel.isSupported; - } - - static get isCanvasSupported() { - return typeof HTMLCanvasElement !== 'undefined'; - } - - static get isGPUHTMLImageArraySupported() { - return WebGL2Kernel.isSupported; - } - - static get isSinglePrecisionSupported() { - return kernelOrder.some(Kernel => Kernel.isSupported && Kernel.features.isFloatRead && Kernel.features.isTextureFloat); - } - - constructor(settings) { - settings = settings || {}; - this.canvas = settings.canvas || null; - this.context = settings.context || null; - this.mode = settings.mode; - this.Kernel = null; - this.kernels = []; - this.functions = []; - this.nativeFunctions = []; - this.injectedNative = null; - if (this.mode === 'dev') return; - this.chooseKernel(); - if (settings.functions) { - for (let i = 0; i < settings.functions.length; i++) { - this.addFunction(settings.functions[i]); - } - } - - if (settings.nativeFunctions) { - for (const p in settings.nativeFunctions) { - if (!settings.nativeFunctions.hasOwnProperty(p)) continue; - const s = settings.nativeFunctions[p]; - const { name, source } = s; - this.addNativeFunction(name, source, s); - } - } - } - - chooseKernel() { - if (this.Kernel) return; - - let Kernel = null; - - if (this.context) { - for (let i = 0; i < kernelOrder.length; i++) { - const ExternalKernel = kernelOrder[i]; - if (ExternalKernel.isContextMatch(this.context)) { - if (!ExternalKernel.isSupported) { - throw new Error(`Kernel type ${ExternalKernel.name} not supported`); - } - Kernel = ExternalKernel; - break; - } - } - if (Kernel === null) { - throw new Error('unknown Context'); - } - } else if (this.mode) { - if (this.mode in internalKernels) { - if (!validate || internalKernels[this.mode].isSupported) { - Kernel = internalKernels[this.mode]; - } - } else if (this.mode === 'gpu') { - for (let i = 0; i < kernelOrder.length; i++) { - if (kernelOrder[i].isSupported) { - Kernel = kernelOrder[i]; - break; - } - } - } else if (this.mode === 'cpu') { - Kernel = CPUKernel; - } - if (!Kernel) { - throw new Error(`A requested mode of "${this.mode}" and is not supported`); - } - } else { - for (let i = 0; i < kernelOrder.length; i++) { - if (kernelOrder[i].isSupported) { - Kernel = kernelOrder[i]; - break; - } - } - if (!Kernel) { - Kernel = CPUKernel; - } - } - - if (!this.mode) { - this.mode = Kernel.mode; - } - this.Kernel = Kernel; - } - - createKernel(source, settings) { - if (typeof source === 'undefined') { - throw new Error('Missing source parameter'); - } - if (typeof source !== 'object' && !utils.isFunction(source) && typeof source !== 'string') { - throw new Error('source parameter not a function'); - } - - const kernels = this.kernels; - if (this.mode === 'dev') { - const devKernel = gpuMock(source, upgradeDeprecatedCreateKernelSettings(settings)); - kernels.push(devKernel); - return devKernel; - } - - source = typeof source === 'function' ? source.toString() : source; - const switchableKernels = {}; - const settingsCopy = upgradeDeprecatedCreateKernelSettings(settings) || {}; - if (settings && typeof settings.argumentTypes === 'object') { - settingsCopy.argumentTypes = Object.keys(settings.argumentTypes).map(argumentName => settings.argumentTypes[argumentName]); - } - - function onRequestFallback(args) { - console.warn('Falling back to CPU'); - const fallbackKernel = new CPUKernel(source, { - argumentTypes: kernelRun.argumentTypes, - constantTypes: kernelRun.constantTypes, - graphical: kernelRun.graphical, - loopMaxIterations: kernelRun.loopMaxIterations, - constants: kernelRun.constants, - dynamicOutput: kernelRun.dynamicOutput, - dynamicArgument: kernelRun.dynamicArguments, - output: kernelRun.output, - precision: kernelRun.precision, - pipeline: kernelRun.pipeline, - immutable: kernelRun.immutable, - optimizeFloatMemory: kernelRun.optimizeFloatMemory, - fixIntegerDivisionAccuracy: kernelRun.fixIntegerDivisionAccuracy, - functions: kernelRun.functions, - nativeFunctions: kernelRun.nativeFunctions, - injectedNative: kernelRun.injectedNative, - subKernels: kernelRun.subKernels, - strictIntegers: kernelRun.strictIntegers, - debug: kernelRun.debug, - }); - fallbackKernel.build.apply(fallbackKernel, args); - const result = fallbackKernel.run.apply(fallbackKernel, args); - kernelRun.replaceKernel(fallbackKernel); - return result; - } - - function onRequestSwitchKernel(reasons, args, _kernel) { - if (_kernel.debug) { - console.warn('Switching kernels'); - } - let newOutput = null; - if (_kernel.signature && !switchableKernels[_kernel.signature]) { - switchableKernels[_kernel.signature] = _kernel; - } - if (_kernel.dynamicOutput) { - for (let i = reasons.length - 1; i >= 0; i--) { - const reason = reasons[i]; - if (reason.type === 'outputPrecisionMismatch') { - newOutput = reason.needed; - } - } - } - - const Constructor = _kernel.constructor; - const argumentTypes = Constructor.getArgumentTypes(_kernel, args); - const signature = Constructor.getSignature(_kernel, argumentTypes); - const existingKernel = switchableKernels[signature]; - if (existingKernel) { - existingKernel.onActivate(_kernel); - return existingKernel; - } - - const newKernel = switchableKernels[signature] = new Constructor(source, { - argumentTypes, - constantTypes: _kernel.constantTypes, - graphical: _kernel.graphical, - loopMaxIterations: _kernel.loopMaxIterations, - constants: _kernel.constants, - dynamicOutput: _kernel.dynamicOutput, - dynamicArgument: _kernel.dynamicArguments, - context: _kernel.context, - canvas: _kernel.canvas, - output: newOutput || _kernel.output, - precision: _kernel.precision, - pipeline: _kernel.pipeline, - immutable: _kernel.immutable, - optimizeFloatMemory: _kernel.optimizeFloatMemory, - fixIntegerDivisionAccuracy: _kernel.fixIntegerDivisionAccuracy, - functions: _kernel.functions, - nativeFunctions: _kernel.nativeFunctions, - injectedNative: _kernel.injectedNative, - subKernels: _kernel.subKernels, - strictIntegers: _kernel.strictIntegers, - debug: _kernel.debug, - gpu: _kernel.gpu, - validate, - returnType: _kernel.returnType, - tactic: _kernel.tactic, - onRequestFallback, - onRequestSwitchKernel, - texture: _kernel.texture, - mappedTextures: _kernel.mappedTextures, - drawBuffersMap: _kernel.drawBuffersMap, - }); - newKernel.build.apply(newKernel, args); - kernelRun.replaceKernel(newKernel); - kernels.push(newKernel); - return newKernel; - } - const mergedSettings = Object.assign({ - context: this.context, - canvas: this.canvas, - functions: this.functions, - nativeFunctions: this.nativeFunctions, - injectedNative: this.injectedNative, - gpu: this, - validate, - onRequestFallback, - onRequestSwitchKernel - }, settingsCopy); - - const kernel = new this.Kernel(source, mergedSettings); - const kernelRun = kernelRunShortcut(kernel); - - if (!this.canvas) { - this.canvas = kernel.canvas; - } - - if (!this.context) { - this.context = kernel.context; - } - - kernels.push(kernel); - - return kernelRun; - } - - createKernelMap() { - let fn; - let settings; - const argument2Type = typeof arguments[arguments.length - 2]; - if (argument2Type === 'function' || argument2Type === 'string') { - fn = arguments[arguments.length - 2]; - settings = arguments[arguments.length - 1]; - } else { - fn = arguments[arguments.length - 1]; - } - - if (this.mode !== 'dev') { - if (!this.Kernel.isSupported || !this.Kernel.features.kernelMap) { - if (this.mode && kernelTypes.indexOf(this.mode) < 0) { - throw new Error(`kernelMap not supported on ${this.Kernel.name}`); - } - } - } - - const settingsCopy = upgradeDeprecatedCreateKernelSettings(settings); - if (settings && typeof settings.argumentTypes === 'object') { - settingsCopy.argumentTypes = Object.keys(settings.argumentTypes).map(argumentName => settings.argumentTypes[argumentName]); - } - - if (Array.isArray(arguments[0])) { - settingsCopy.subKernels = []; - const functions = arguments[0]; - for (let i = 0; i < functions.length; i++) { - const source = functions[i].toString(); - const name = utils.getFunctionNameFromString(source); - settingsCopy.subKernels.push({ - name, - source, - property: i, - }); - } - } else { - settingsCopy.subKernels = []; - const functions = arguments[0]; - for (let p in functions) { - if (!functions.hasOwnProperty(p)) continue; - const source = functions[p].toString(); - const name = utils.getFunctionNameFromString(source); - settingsCopy.subKernels.push({ - name: name || p, - source, - property: p, - }); - } - } - return this.createKernel(fn, settingsCopy); - } - - combineKernels() { - const firstKernel = arguments[0]; - const combinedKernel = arguments[arguments.length - 1]; - if (firstKernel.kernel.constructor.mode === 'cpu') return combinedKernel; - const canvas = arguments[0].canvas; - const context = arguments[0].context; - const max = arguments.length - 1; - for (let i = 0; i < max; i++) { - arguments[i] - .setCanvas(canvas) - .setContext(context) - .setPipeline(true); - } - - return function() { - const texture = combinedKernel.apply(this, arguments); - if (texture.toArray) { - return texture.toArray(); - } - return texture; - }; - } - - setFunctions(functions) { - this.functions = functions; - return this; - } - - setNativeFunctions(nativeFunctions) { - this.nativeFunctions = nativeFunctions; - return this; - } - - addFunction(source, settings) { - this.functions.push({ source, settings }); - return this; - } - - addNativeFunction(name, source, settings) { - if (this.kernels.length > 0) { - throw new Error('Cannot call "addNativeFunction" after "createKernels" has been called.'); - } - this.nativeFunctions.push(Object.assign({ name, source }, settings)); - return this; - } - - injectNative(source) { - this.injectedNative = source; - return this; - } - - destroy() { - return new Promise((resolve, reject) => { - if (!this.kernels) { - resolve(); - } - setTimeout(() => { - try { - for (let i = 0; i < this.kernels.length; i++) { - this.kernels[i].destroy(true); - } - let firstKernel = this.kernels[0]; - if (firstKernel) { - if (firstKernel.kernel) { - firstKernel = firstKernel.kernel; - } - if (firstKernel.constructor.destroyContext) { - firstKernel.constructor.destroyContext(this.context); - } - } - } catch (e) { - reject(e); - } - resolve(); - }, 0); - }); - } -} - - -function upgradeDeprecatedCreateKernelSettings(settings) { - if (!settings) { - return {}; - } - const upgradedSettings = Object.assign({}, settings); - - if (settings.hasOwnProperty('floatOutput')) { - utils.warnDeprecated('setting', 'floatOutput', 'precision'); - upgradedSettings.precision = settings.floatOutput ? 'single' : 'unsigned'; - } - if (settings.hasOwnProperty('outputToTexture')) { - utils.warnDeprecated('setting', 'outputToTexture', 'pipeline'); - upgradedSettings.pipeline = Boolean(settings.outputToTexture); - } - if (settings.hasOwnProperty('outputImmutable')) { - utils.warnDeprecated('setting', 'outputImmutable', 'immutable'); - upgradedSettings.immutable = Boolean(settings.outputImmutable); - } - if (settings.hasOwnProperty('floatTextures')) { - utils.warnDeprecated('setting', 'floatTextures', 'optimizeFloatMemory'); - upgradedSettings.optimizeFloatMemory = Boolean(settings.floatTextures); - } - return upgradedSettings; -} - -module.exports = { - GPU, - kernelOrder, - kernelTypes -}; -},{"./backend/cpu/kernel":7,"./backend/headless-gl/kernel":33,"./backend/kernel":35,"./backend/web-gl/kernel":69,"./backend/web-gl2/kernel":104,"./kernel-run-shortcut":110,"./utils":113,"gpu-mock.js":3}],108:[function(require,module,exports){ -const { GPU } = require('./gpu'); -const { alias } = require('./alias'); -const { utils } = require('./utils'); -const { Input, input } = require('./input'); -const { Texture } = require('./texture'); -const { FunctionBuilder } = require('./backend/function-builder'); -const { FunctionNode } = require('./backend/function-node'); -const { CPUFunctionNode } = require('./backend/cpu/function-node'); -const { CPUKernel } = require('./backend/cpu/kernel'); - -const { HeadlessGLKernel } = require('./backend/headless-gl/kernel'); - -const { WebGLFunctionNode } = require('./backend/web-gl/function-node'); -const { WebGLKernel } = require('./backend/web-gl/kernel'); -const { kernelValueMaps: webGLKernelValueMaps } = require('./backend/web-gl/kernel-value-maps'); - -const { WebGL2FunctionNode } = require('./backend/web-gl2/function-node'); -const { WebGL2Kernel } = require('./backend/web-gl2/kernel'); -const { kernelValueMaps: webGL2KernelValueMaps } = require('./backend/web-gl2/kernel-value-maps'); - -const { GLKernel } = require('./backend/gl/kernel'); - -const { Kernel } = require('./backend/kernel'); - -const { FunctionTracer } = require('./backend/function-tracer'); - -const mathRandom = require('./plugins/math-random-uniformly-distributed'); - -module.exports = { - alias, - CPUFunctionNode, - CPUKernel, - GPU, - FunctionBuilder, - FunctionNode, - HeadlessGLKernel, - Input, - input, - Texture, - utils, - - WebGL2FunctionNode, - WebGL2Kernel, - webGL2KernelValueMaps, - - WebGLFunctionNode, - WebGLKernel, - webGLKernelValueMaps, - - GLKernel, - Kernel, - FunctionTracer, - - plugins: { - mathRandom - } -}; -},{"./alias":4,"./backend/cpu/function-node":5,"./backend/cpu/kernel":7,"./backend/function-builder":8,"./backend/function-node":9,"./backend/function-tracer":10,"./backend/gl/kernel":12,"./backend/headless-gl/kernel":33,"./backend/kernel":35,"./backend/web-gl/function-node":37,"./backend/web-gl/kernel":69,"./backend/web-gl/kernel-value-maps":38,"./backend/web-gl2/function-node":72,"./backend/web-gl2/kernel":104,"./backend/web-gl2/kernel-value-maps":73,"./gpu":107,"./input":109,"./plugins/math-random-uniformly-distributed":111,"./texture":112,"./utils":113}],109:[function(require,module,exports){ -class Input { - constructor(value, size) { - this.value = value; - if (Array.isArray(size)) { - this.size = size; - } else { - this.size = new Int32Array(3); - if (size.z) { - this.size = new Int32Array([size.x, size.y, size.z]); - } else if (size.y) { - this.size = new Int32Array([size.x, size.y]); - } else { - this.size = new Int32Array([size.x]); - } - } - - const [w, h, d] = this.size; - if (d) { - if (this.value.length !== (w * h * d)) { - throw new Error(`Input size ${this.value.length} does not match ${w} * ${h} * ${d} = ${(h * w * d)}`); - } - } else if (h) { - if (this.value.length !== (w * h)) { - throw new Error(`Input size ${this.value.length} does not match ${w} * ${h} = ${(h * w)}`); - } - } else { - if (this.value.length !== w) { - throw new Error(`Input size ${this.value.length} does not match ${w}`); - } - } - - } - - toArray() { - const { utils } = require('./utils'); - const [w, h, d] = this.size; - if (d) { - return utils.erectMemoryOptimized3DFloat(this.value.subarray ? this.value : new Float32Array(this.value), w, h, d); - } else if (h) { - return utils.erectMemoryOptimized2DFloat(this.value.subarray ? this.value : new Float32Array(this.value), w, h); - } else { - return this.value; - } - } -} - -function input(value, size) { - return new Input(value, size); -} - -module.exports = { - Input, - input -}; -},{"./utils":113}],110:[function(require,module,exports){ -const { utils } = require('./utils'); - -function kernelRunShortcut(kernel) { - let run = function() { - kernel.build.apply(kernel, arguments); - run = function() { - let result = kernel.run.apply(kernel, arguments); - if (kernel.switchingKernels) { - const reasons = kernel.resetSwitchingKernels(); - const newKernel = kernel.onRequestSwitchKernel(reasons, arguments, kernel); - shortcut.kernel = kernel = newKernel; - result = newKernel.run.apply(newKernel, arguments); - } - if (kernel.renderKernels) { - return kernel.renderKernels(); - } else if (kernel.renderOutput) { - return kernel.renderOutput(); - } else { - return result; - } - }; - return run.apply(kernel, arguments); - }; - const shortcut = function() { - return run.apply(kernel, arguments); - }; - shortcut.exec = function() { - return new Promise((accept, reject) => { - try { - accept(run.apply(this, arguments)); - } catch (e) { - reject(e); - } - }); - }; - shortcut.replaceKernel = function(replacementKernel) { - kernel = replacementKernel; - bindKernelToShortcut(kernel, shortcut); - }; - - bindKernelToShortcut(kernel, shortcut); - return shortcut; -} - -function bindKernelToShortcut(kernel, shortcut) { - if (shortcut.kernel) { - shortcut.kernel = kernel; - return; - } - const properties = utils.allPropertiesOf(kernel); - for (let i = 0; i < properties.length; i++) { - const property = properties[i]; - if (property[0] === '_' && property[1] === '_') continue; - if (typeof kernel[property] === 'function') { - if (property.substring(0, 3) === 'add' || property.substring(0, 3) === 'set') { - shortcut[property] = function() { - shortcut.kernel[property].apply(shortcut.kernel, arguments); - return shortcut; - }; - } else { - shortcut[property] = function() { - return shortcut.kernel[property].apply(shortcut.kernel, arguments); - }; - } - } else { - shortcut.__defineGetter__(property, () => shortcut.kernel[property]); - shortcut.__defineSetter__(property, (value) => { - shortcut.kernel[property] = value; - }); - } - } - shortcut.kernel = kernel; -} -module.exports = { - kernelRunShortcut -}; -},{"./utils":113}],111:[function(require,module,exports){ -const source = `// https://www.shadertoy.com/view/4t2SDh -//note: uniformly distributed, normalized rand, [0,1] -highp float randomSeedShift = 1.0; -highp float slide = 1.0; -uniform highp float randomSeed1; -uniform highp float randomSeed2; - -highp float nrand(highp vec2 n) { - highp float result = fract(sin(dot((n.xy + 1.0) * vec2(randomSeed1 * slide, randomSeed2 * randomSeedShift), vec2(12.9898, 78.233))) * 43758.5453); - randomSeedShift = result; - if (randomSeedShift > 0.5) { - slide += 0.00009; - } else { - slide += 0.0009; - } - return result; -}`; - -const name = 'math-random-uniformly-distributed'; - -const functionMatch = `Math.random()`; - -const functionReplace = `nrand(vTexCoord)`; - -const functionReturnType = 'Number'; -const onBeforeRun = (kernel) => { - kernel.setUniform1f('randomSeed1', Math.random()); - kernel.setUniform1f('randomSeed2', Math.random()); -}; - -const plugin = { - name, - onBeforeRun, - functionMatch, - functionReplace, - functionReturnType, - source -}; - -module.exports = plugin; -},{}],112:[function(require,module,exports){ -class Texture { - constructor(settings) { - const { - texture, - size, - dimensions, - output, - context, - type = 'NumberTexture', - kernel, - internalFormat, - textureFormat - } = settings; - if (!output) throw new Error('settings property "output" required.'); - if (!context) throw new Error('settings property "context" required.'); - if (!texture) throw new Error('settings property "texture" required.'); - if (!kernel) throw new Error('settings property "kernel" required.'); - this.texture = texture; - if (texture._refs) { - texture._refs++; - } else { - texture._refs = 1; - } - this.size = size; - this.dimensions = dimensions; - this.output = output; - this.context = context; - this.kernel = kernel; - this.type = type; - this._deleted = false; - this.internalFormat = internalFormat; - this.textureFormat = textureFormat; - } - - toArray() { - throw new Error(`Not implemented on ${this.constructor.name}`); - } - - clone() { - throw new Error(`Not implemented on ${this.constructor.name}`); - } - - delete() { - throw new Error(`Not implemented on ${this.constructor.name}`); - } - - clear() { - throw new Error(`Not implemented on ${this.constructor.name}`); - } -} - -module.exports = { - Texture -}; -},{}],113:[function(require,module,exports){ -const acorn = require('acorn'); -const { Input } = require('./input'); -const { Texture } = require('./texture'); - -const FUNCTION_NAME = /function ([^(]*)/; -const STRIP_COMMENTS = /((\/\/.*$)|(\/\*[\s\S]*?\*\/))/mg; -const ARGUMENT_NAMES = /([^\s,]+)/g; - -const utils = { - systemEndianness() { - return _systemEndianness; - }, - getSystemEndianness() { - const b = new ArrayBuffer(4); - const a = new Uint32Array(b); - const c = new Uint8Array(b); - a[0] = 0xdeadbeef; - if (c[0] === 0xef) return 'LE'; - if (c[0] === 0xde) return 'BE'; - throw new Error('unknown endianness'); - }, - - isFunction(funcObj) { - return typeof(funcObj) === 'function'; - }, - - isFunctionString(fn) { - if (typeof fn === 'string') { - return (fn - .slice(0, 'function'.length) - .toLowerCase() === 'function'); - } - return false; - }, - - getFunctionNameFromString(funcStr) { - const result = FUNCTION_NAME.exec(funcStr); - if (!result || result.length === 0) return null; - return result[1].trim(); - }, - - getFunctionBodyFromString(funcStr) { - return funcStr.substring(funcStr.indexOf('{') + 1, funcStr.lastIndexOf('}')); - }, - - getArgumentNamesFromString(fn) { - const fnStr = fn.replace(STRIP_COMMENTS, ''); - let result = fnStr.slice(fnStr.indexOf('(') + 1, fnStr.indexOf(')')).match(ARGUMENT_NAMES); - if (result === null) { - result = []; - } - return result; - }, - - clone(obj) { - if (obj === null || typeof obj !== 'object' || obj.hasOwnProperty('isActiveClone')) return obj; - - const temp = obj.constructor(); - - for (let key in obj) { - if (Object.prototype.hasOwnProperty.call(obj, key)) { - obj.isActiveClone = null; - temp[key] = utils.clone(obj[key]); - delete obj.isActiveClone; - } - } - - return temp; - }, - - isArray(array) { - return !isNaN(array.length); - }, - - getVariableType(value, strictIntegers) { - if (utils.isArray(value)) { - if (value.length > 0 && value[0].nodeName === 'IMG') { - return 'HTMLImageArray'; - } - return 'Array'; - } - - switch (value.constructor) { - case Boolean: - return 'Boolean'; - case Number: - if (strictIntegers && Number.isInteger(value)) { - return 'Integer'; - } - return 'Float'; - case Texture: - return value.type; - case Input: - return 'Input'; - } - if ('nodeName' in value) { - switch (value.nodeName) { - case 'IMG': - return 'HTMLImage'; - case 'CANVAS': - return 'HTMLImage'; - case 'VIDEO': - return 'HTMLVideo'; - } - } else if (value.hasOwnProperty('type')) { - return value.type; - } else if (typeof OffscreenCanvas !== 'undefined' && value instanceof OffscreenCanvas) { - return 'OffscreenCanvas'; - } else if (typeof ImageBitmap !== 'undefined' && value instanceof ImageBitmap) { - return 'ImageBitmap'; - } else if (typeof ImageData !== 'undefined' && value instanceof ImageData) { - return 'ImageData'; - } - return 'Unknown'; - }, - - getKernelTextureSize(settings, dimensions) { - let [w, h, d] = dimensions; - let texelCount = (w || 1) * (h || 1) * (d || 1); - - if (settings.optimizeFloatMemory && settings.precision === 'single') { - w = texelCount = Math.ceil(texelCount / 4); - } - if (h > 1 && w * h === texelCount) { - return new Int32Array([w, h]); - } - return utils.closestSquareDimensions(texelCount); - }, - - closestSquareDimensions(length) { - const sqrt = Math.sqrt(length); - let high = Math.ceil(sqrt); - let low = Math.floor(sqrt); - while (high * low < length) { - high--; - low = Math.ceil(length / high); - } - return new Int32Array([low, Math.ceil(length / low)]); - }, - - getMemoryOptimizedFloatTextureSize(dimensions, bitRatio) { - const totalArea = utils.roundTo((dimensions[0] || 1) * (dimensions[1] || 1) * (dimensions[2] || 1) * (dimensions[3] || 1), 4); - const texelCount = totalArea / bitRatio; - return utils.closestSquareDimensions(texelCount); - }, - - getMemoryOptimizedPackedTextureSize(dimensions, bitRatio) { - const [w, h, d] = dimensions; - const totalArea = utils.roundTo((w || 1) * (h || 1) * (d || 1), 4); - const texelCount = totalArea / (4 / bitRatio); - return utils.closestSquareDimensions(texelCount); - }, - - roundTo(n, d) { - return Math.floor((n + d - 1) / d) * d; - }, - getDimensions(x, pad) { - let ret; - if (utils.isArray(x)) { - const dim = []; - let temp = x; - while (utils.isArray(temp)) { - dim.push(temp.length); - temp = temp[0]; - } - ret = dim.reverse(); - } else if (x instanceof Texture) { - ret = x.output; - } else if (x instanceof Input) { - ret = x.size; - } else { - throw new Error(`Unknown dimensions of ${x}`); - } - - if (pad) { - ret = Array.from(ret); - while (ret.length < 3) { - ret.push(1); - } - } - - return new Int32Array(ret); - }, - - flatten2dArrayTo(array, target) { - let offset = 0; - for (let y = 0; y < array.length; y++) { - target.set(array[y], offset); - offset += array[y].length; - } - }, - - flatten3dArrayTo(array, target) { - let offset = 0; - for (let z = 0; z < array.length; z++) { - for (let y = 0; y < array[z].length; y++) { - target.set(array[z][y], offset); - offset += array[z][y].length; - } - } - }, - - flatten4dArrayTo(array, target) { - let offset = 0; - for (let l = 0; l < array.length; l++) { - for (let z = 0; z < array[l].length; z++) { - for (let y = 0; y < array[l][z].length; y++) { - target.set(array[l][z][y], offset); - offset += array[l][z][y].length; - } - } - } - }, - - flattenTo(array, target) { - if (utils.isArray(array[0])) { - if (utils.isArray(array[0][0])) { - if (utils.isArray(array[0][0][0])) { - utils.flatten4dArrayTo(array, target); - } else { - utils.flatten3dArrayTo(array, target); - } - } else { - utils.flatten2dArrayTo(array, target); - } - } else { - target.set(array); - } - }, - - splitArray(array, part) { - const result = []; - for (let i = 0; i < array.length; i += part) { - result.push(new array.constructor(array.buffer, i * 4 + array.byteOffset, part)); - } - return result; - }, - - getAstString(source, ast) { - const lines = Array.isArray(source) ? source : source.split(/\r?\n/g); - const start = ast.loc.start; - const end = ast.loc.end; - const result = []; - if (start.line === end.line) { - result.push(lines[start.line - 1].substring(start.column, end.column)); - } else { - result.push(lines[start.line - 1].slice(start.column)); - for (let i = start.line; i < end.line; i++) { - result.push(lines[i]); - } - result.push(lines[end.line - 1].slice(0, end.column)); - } - return result.join('\n'); - }, - - allPropertiesOf(obj) { - const props = []; - - do { - props.push.apply(props, Object.getOwnPropertyNames(obj)); - } while (obj = Object.getPrototypeOf(obj)); - - return props; - }, - - linesToString(lines) { - if (lines.length > 0) { - return lines.join(';\n') + ';\n'; - } else { - return '\n'; - } - }, - warnDeprecated(type, oldName, newName) { - if (newName) { - console.warn(`You are using a deprecated ${ type } "${ oldName }". It has been replaced with "${ newName }". Fixing, but please upgrade as it will soon be removed.`); - } else { - console.warn(`You are using a deprecated ${ type } "${ oldName }". It has been removed. Fixing, but please upgrade as it will soon be removed.`); - } - }, - flipPixels: (pixels, width, height) => { - const halfHeight = height / 2 | 0; - const bytesPerRow = width * 4; - const temp = new Uint8ClampedArray(width * 4); - const result = pixels.slice(0); - for (let y = 0; y < halfHeight; ++y) { - const topOffset = y * bytesPerRow; - const bottomOffset = (height - y - 1) * bytesPerRow; - - temp.set(result.subarray(topOffset, topOffset + bytesPerRow)); - - result.copyWithin(topOffset, bottomOffset, bottomOffset + bytesPerRow); - - result.set(temp, bottomOffset); - } - return result; - }, - erectPackedFloat: (array, width) => { - return array.subarray(0, width); - }, - erect2DPackedFloat: (array, width, height) => { - const yResults = new Array(height); - for (let y = 0; y < height; y++) { - const xStart = y * width; - const xEnd = xStart + width; - yResults[y] = array.subarray(xStart, xEnd); - } - return yResults; - }, - erect3DPackedFloat: (array, width, height, depth) => { - const zResults = new Array(depth); - for (let z = 0; z < depth; z++) { - const yResults = new Array(height); - for (let y = 0; y < height; y++) { - const xStart = (z * height * width) + y * width; - const xEnd = xStart + width; - yResults[y] = array.subarray(xStart, xEnd); - } - zResults[z] = yResults; - } - return zResults; - }, - erectMemoryOptimizedFloat: (array, width) => { - return array.subarray(0, width); - }, - erectMemoryOptimized2DFloat: (array, width, height) => { - const yResults = new Array(height); - for (let y = 0; y < height; y++) { - const offset = y * width; - yResults[y] = array.subarray(offset, offset + width); - } - return yResults; - }, - erectMemoryOptimized3DFloat: (array, width, height, depth) => { - const zResults = new Array(depth); - for (let z = 0; z < depth; z++) { - const yResults = new Array(height); - for (let y = 0; y < height; y++) { - const offset = (z * height * width) + (y * width); - yResults[y] = array.subarray(offset, offset + width); - } - zResults[z] = yResults; - } - return zResults; - }, - erectFloat: (array, width) => { - const xResults = new Float32Array(width); - let i = 0; - for (let x = 0; x < width; x++) { - xResults[x] = array[i]; - i += 4; - } - return xResults; - }, - erect2DFloat: (array, width, height) => { - const yResults = new Array(height); - let i = 0; - for (let y = 0; y < height; y++) { - const xResults = new Float32Array(width); - for (let x = 0; x < width; x++) { - xResults[x] = array[i]; - i += 4; - } - yResults[y] = xResults; - } - return yResults; - }, - erect3DFloat: (array, width, height, depth) => { - const zResults = new Array(depth); - let i = 0; - for (let z = 0; z < depth; z++) { - const yResults = new Array(height); - for (let y = 0; y < height; y++) { - const xResults = new Float32Array(width); - for (let x = 0; x < width; x++) { - xResults[x] = array[i]; - i += 4; - } - yResults[y] = xResults; - } - zResults[z] = yResults; - } - return zResults; - }, - erectArray2: (array, width) => { - const xResults = new Array(width); - const xResultsMax = width * 4; - let i = 0; - for (let x = 0; x < xResultsMax; x += 4) { - xResults[i++] = array.subarray(x, x + 2); - } - return xResults; - }, - erect2DArray2: (array, width, height) => { - const yResults = new Array(height); - const XResultsMax = width * 4; - for (let y = 0; y < height; y++) { - const xResults = new Array(width); - const offset = y * XResultsMax; - let i = 0; - for (let x = 0; x < XResultsMax; x += 4) { - xResults[i++] = array.subarray(x + offset, x + offset + 2); - } - yResults[y] = xResults; - } - return yResults; - }, - erect3DArray2: (array, width, height, depth) => { - const xResultsMax = width * 4; - const zResults = new Array(depth); - for (let z = 0; z < depth; z++) { - const yResults = new Array(height); - for (let y = 0; y < height; y++) { - const xResults = new Array(width); - const offset = (z * xResultsMax * height) + (y * xResultsMax); - let i = 0; - for (let x = 0; x < xResultsMax; x += 4) { - xResults[i++] = array.subarray(x + offset, x + offset + 2); - } - yResults[y] = xResults; - } - zResults[z] = yResults; - } - return zResults; - }, - erectArray3: (array, width) => { - const xResults = new Array(width); - const xResultsMax = width * 4; - let i = 0; - for (let x = 0; x < xResultsMax; x += 4) { - xResults[i++] = array.subarray(x, x + 3); - } - return xResults; - }, - erect2DArray3: (array, width, height) => { - const xResultsMax = width * 4; - const yResults = new Array(height); - for (let y = 0; y < height; y++) { - const xResults = new Array(width); - const offset = y * xResultsMax; - let i = 0; - for (let x = 0; x < xResultsMax; x += 4) { - xResults[i++] = array.subarray(x + offset, x + offset + 3); - } - yResults[y] = xResults; - } - return yResults; - }, - erect3DArray3: (array, width, height, depth) => { - const xResultsMax = width * 4; - const zResults = new Array(depth); - for (let z = 0; z < depth; z++) { - const yResults = new Array(height); - for (let y = 0; y < height; y++) { - const xResults = new Array(width); - const offset = (z * xResultsMax * height) + (y * xResultsMax); - let i = 0; - for (let x = 0; x < xResultsMax; x += 4) { - xResults[i++] = array.subarray(x + offset, x + offset + 3); - } - yResults[y] = xResults; - } - zResults[z] = yResults; - } - return zResults; - }, - erectArray4: (array, width) => { - const xResults = new Array(array); - const xResultsMax = width * 4; - let i = 0; - for (let x = 0; x < xResultsMax; x += 4) { - xResults[i++] = array.subarray(x, x + 4); - } - return xResults; - }, - erect2DArray4: (array, width, height) => { - const xResultsMax = width * 4; - const yResults = new Array(height); - for (let y = 0; y < height; y++) { - const xResults = new Array(width); - const offset = y * xResultsMax; - let i = 0; - for (let x = 0; x < xResultsMax; x += 4) { - xResults[i++] = array.subarray(x + offset, x + offset + 4); - } - yResults[y] = xResults; - } - return yResults; - }, - erect3DArray4: (array, width, height, depth) => { - const xResultsMax = width * 4; - const zResults = new Array(depth); - for (let z = 0; z < depth; z++) { - const yResults = new Array(height); - for (let y = 0; y < height; y++) { - const xResults = new Array(width); - const offset = (z * xResultsMax * height) + (y * xResultsMax); - let i = 0; - for (let x = 0; x < xResultsMax; x += 4) { - xResults[i++] = array.subarray(x + offset, x + offset + 4); - } - yResults[y] = xResults; - } - zResults[z] = yResults; - } - return zResults; - }, - - flattenFunctionToString: (source, settings) => { - const { findDependency, thisLookup, doNotDefine } = settings; - let flattened = settings.flattened; - if (!flattened) { - flattened = settings.flattened = {}; - } - const ast = acorn.parse(source); - const functionDependencies = []; - let indent = 0; - - function flatten(ast) { - if (Array.isArray(ast)) { - const results = []; - for (let i = 0; i < ast.length; i++) { - results.push(flatten(ast[i])); - } - return results.join(''); - } - switch (ast.type) { - case 'Program': - return flatten(ast.body) + (ast.body[0].type === 'VariableDeclaration' ? ';' : ''); - case 'FunctionDeclaration': - return `function ${ast.id.name}(${ast.params.map(flatten).join(', ')}) ${ flatten(ast.body) }`; - case 'BlockStatement': { - const result = []; - indent += 2; - for (let i = 0; i < ast.body.length; i++) { - const flat = flatten(ast.body[i]); - if (flat) { - result.push(' '.repeat(indent) + flat, ';\n'); - } - } - indent -= 2; - return `{\n${result.join('')}}`; - } - case 'VariableDeclaration': - const declarations = utils.normalizeDeclarations(ast) - .map(flatten) - .filter(r => r !== null); - if (declarations.length < 1) { - return ''; - } else { - return `${ast.kind} ${declarations.join(',')}`; - } - case 'VariableDeclarator': - if (ast.init.object && ast.init.object.type === 'ThisExpression') { - const lookup = thisLookup(ast.init.property.name, true); - if (lookup) { - return `${ast.id.name} = ${flatten(ast.init)}`; - } else { - return null; - } - } else { - return `${ast.id.name} = ${flatten(ast.init)}`; - } - case 'CallExpression': { - if (ast.callee.property.name === 'subarray') { - return `${flatten(ast.callee.object)}.${flatten(ast.callee.property)}(${ast.arguments.map(value => flatten(value)).join(', ')})`; - } - if (ast.callee.object.name === 'gl' || ast.callee.object.name === 'context') { - return `${flatten(ast.callee.object)}.${flatten(ast.callee.property)}(${ast.arguments.map(value => flatten(value)).join(', ')})`; - } - if (ast.callee.object.type === 'ThisExpression') { - functionDependencies.push(findDependency('this', ast.callee.property.name)); - return `${ast.callee.property.name}(${ast.arguments.map(value => flatten(value)).join(', ')})`; - } else if (ast.callee.object.name) { - const foundSource = findDependency(ast.callee.object.name, ast.callee.property.name); - if (foundSource === null) { - return `${ast.callee.object.name}.${ast.callee.property.name}(${ast.arguments.map(value => flatten(value)).join(', ')})`; - } else { - functionDependencies.push(foundSource); - return `${ast.callee.property.name}(${ast.arguments.map(value => flatten(value)).join(', ')})`; - } - } else if (ast.callee.object.type === 'MemberExpression') { - return `${flatten(ast.callee.object)}.${ast.callee.property.name}(${ast.arguments.map(value => flatten(value)).join(', ')})`; - } else { - throw new Error('unknown ast.callee'); - } - } - case 'ReturnStatement': - return `return ${flatten(ast.argument)}`; - case 'BinaryExpression': - return `(${flatten(ast.left)}${ast.operator}${flatten(ast.right)})`; - case 'UnaryExpression': - if (ast.prefix) { - return `${ast.operator} ${flatten(ast.argument)}`; - } else { - return `${flatten(ast.argument)} ${ast.operator}`; - } - case 'ExpressionStatement': - return `${flatten(ast.expression)}`; - case 'SequenceExpression': - return `(${flatten(ast.expressions)})`; - case 'ArrowFunctionExpression': - return `(${ast.params.map(flatten).join(', ')}) => ${flatten(ast.body)}`; - case 'Literal': - return ast.raw; - case 'Identifier': - return ast.name; - case 'MemberExpression': - if (ast.object.type === 'ThisExpression') { - return thisLookup(ast.property.name); - } - if (ast.computed) { - return `${flatten(ast.object)}[${flatten(ast.property)}]`; - } - return flatten(ast.object) + '.' + flatten(ast.property); - case 'ThisExpression': - return 'this'; - case 'NewExpression': - return `new ${flatten(ast.callee)}(${ast.arguments.map(value => flatten(value)).join(', ')})`; - case 'ForStatement': - return `for (${flatten(ast.init)};${flatten(ast.test)};${flatten(ast.update)}) ${flatten(ast.body)}`; - case 'AssignmentExpression': - return `${flatten(ast.left)}${ast.operator}${flatten(ast.right)}`; - case 'UpdateExpression': - return `${flatten(ast.argument)}${ast.operator}`; - case 'IfStatement': - return `if (${flatten(ast.test)}) ${flatten(ast.consequent)}`; - case 'ThrowStatement': - return `throw ${flatten(ast.argument)}`; - case 'ObjectPattern': - return ast.properties.map(flatten).join(', '); - case 'ArrayPattern': - return ast.elements.map(flatten).join(', '); - case 'DebuggerStatement': - return 'debugger;'; - case 'ConditionalExpression': - return `${flatten(ast.test)}?${flatten(ast.consequent)}:${flatten(ast.alternate)}`; - case 'Property': - if (ast.kind === 'init') { - return flatten(ast.key); - } - } - throw new Error(`unhandled ast.type of ${ ast.type }`); - } - const result = flatten(ast); - if (functionDependencies.length > 0) { - const flattenedFunctionDependencies = []; - for (let i = 0; i < functionDependencies.length; i++) { - const functionDependency = functionDependencies[i]; - if (!flattened[functionDependency]) { - flattened[functionDependency] = true; - } - functionDependency ? flattenedFunctionDependencies.push(utils.flattenFunctionToString(functionDependency, settings) + '\n') : ''; - } - return flattenedFunctionDependencies.join('') + result; - } - return result; - }, - - normalizeDeclarations: (ast) => { - if (ast.type !== 'VariableDeclaration') throw new Error('Ast is not of type "VariableDeclaration"'); - const normalizedDeclarations = []; - for (let declarationIndex = 0; declarationIndex < ast.declarations.length; declarationIndex++) { - const declaration = ast.declarations[declarationIndex]; - if (declaration.id && declaration.id.type === 'ObjectPattern' && declaration.id.properties) { - const { properties } = declaration.id; - for (let propertyIndex = 0; propertyIndex < properties.length; propertyIndex++) { - const property = properties[propertyIndex]; - if (property.value.type === 'ObjectPattern' && property.value.properties) { - for (let subPropertyIndex = 0; subPropertyIndex < property.value.properties.length; subPropertyIndex++) { - const subProperty = property.value.properties[subPropertyIndex]; - if (subProperty.type === 'Property') { - normalizedDeclarations.push({ - type: 'VariableDeclarator', - id: { - type: 'Identifier', - name: subProperty.key.name - }, - init: { - type: 'MemberExpression', - object: { - type: 'MemberExpression', - object: declaration.init, - property: { - type: 'Identifier', - name: property.key.name - }, - computed: false - }, - property: { - type: 'Identifier', - name: subProperty.key.name - }, - computed: false - } - }); - } else { - throw new Error('unexpected state'); - } - } - } else if (property.value.type === 'Identifier') { - normalizedDeclarations.push({ - type: 'VariableDeclarator', - id: { - type: 'Identifier', - name: property.value && property.value.name ? property.value.name : property.key.name - }, - init: { - type: 'MemberExpression', - object: declaration.init, - property: { - type: 'Identifier', - name: property.key.name - }, - computed: false - } - }); - } else { - throw new Error('unexpected state'); - } - } - } else if (declaration.id && declaration.id.type === 'ArrayPattern' && declaration.id.elements) { - const { elements } = declaration.id; - for (let elementIndex = 0; elementIndex < elements.length; elementIndex++) { - const element = elements[elementIndex]; - if (element.type === 'Identifier') { - normalizedDeclarations.push({ - type: 'VariableDeclarator', - id: { - type: 'Identifier', - name: element.name - }, - init: { - type: 'MemberExpression', - object: declaration.init, - property: { - type: 'Literal', - value: elementIndex, - raw: elementIndex.toString(), - start: element.start, - end: element.end - }, - computed: true - } - }); - } else { - throw new Error('unexpected state'); - } - } - } else { - normalizedDeclarations.push(declaration); - } - } - return normalizedDeclarations; - }, - - splitHTMLImageToRGB: (gpu, image) => { - const rKernel = gpu.createKernel(function(a) { - const pixel = a[this.thread.y][this.thread.x]; - return pixel.r * 255; - }, { - output: [image.width, image.height], - precision: 'unsigned', - argumentTypes: { a: 'HTMLImage' }, - }); - const gKernel = gpu.createKernel(function(a) { - const pixel = a[this.thread.y][this.thread.x]; - return pixel.g * 255; - }, { - output: [image.width, image.height], - precision: 'unsigned', - argumentTypes: { a: 'HTMLImage' }, - }); - const bKernel = gpu.createKernel(function(a) { - const pixel = a[this.thread.y][this.thread.x]; - return pixel.b * 255; - }, { - output: [image.width, image.height], - precision: 'unsigned', - argumentTypes: { a: 'HTMLImage' }, - }); - const aKernel = gpu.createKernel(function(a) { - const pixel = a[this.thread.y][this.thread.x]; - return pixel.a * 255; - }, { - output: [image.width, image.height], - precision: 'unsigned', - argumentTypes: { a: 'HTMLImage' }, - }); - const result = [ - rKernel(image), - gKernel(image), - bKernel(image), - aKernel(image), - ]; - result.rKernel = rKernel; - result.gKernel = gKernel; - result.bKernel = bKernel; - result.aKernel = aKernel; - result.gpu = gpu; - return result; - }, - - splitRGBAToCanvases: (gpu, rgba, width, height) => { - const visualKernelR = gpu.createKernel(function(v) { - const pixel = v[this.thread.y][this.thread.x]; - this.color(pixel.r / 255, 0, 0, 255); - }, { - output: [width, height], - graphical: true, - argumentTypes: { v: 'Array2D(4)' } - }); - visualKernelR(rgba); - - const visualKernelG = gpu.createKernel(function(v) { - const pixel = v[this.thread.y][this.thread.x]; - this.color(0, pixel.g / 255, 0, 255); - }, { - output: [width, height], - graphical: true, - argumentTypes: { v: 'Array2D(4)' } - }); - visualKernelG(rgba); - - const visualKernelB = gpu.createKernel(function(v) { - const pixel = v[this.thread.y][this.thread.x]; - this.color(0, 0, pixel.b / 255, 255); - }, { - output: [width, height], - graphical: true, - argumentTypes: { v: 'Array2D(4)' } - }); - visualKernelB(rgba); - - const visualKernelA = gpu.createKernel(function(v) { - const pixel = v[this.thread.y][this.thread.x]; - this.color(255, 255, 255, pixel.a / 255); - }, { - output: [width, height], - graphical: true, - argumentTypes: { v: 'Array2D(4)' } - }); - visualKernelA(rgba); - return [ - visualKernelR.canvas, - visualKernelG.canvas, - visualKernelB.canvas, - visualKernelA.canvas, - ]; - }, - - getMinifySafeName: (fn) => { - try { - const ast = acorn.parse(`const value = ${fn.toString()}`); - const { init } = ast.body[0].declarations[0]; - return init.body.name || init.body.body[0].argument.name; - } catch (e) { - throw new Error('Unrecognized function type. Please use `() => yourFunctionVariableHere` or function() { return yourFunctionVariableHere; }'); - } - }, - sanitizeName: function(name) { - if (dollarSign.test(name)) { - name = name.replace(dollarSign, 'S_S'); - } - if (doubleUnderscore.test(name)) { - name = name.replace(doubleUnderscore, 'U_U'); - } else if (singleUnderscore.test(name)) { - name = name.replace(singleUnderscore, 'u_u'); - } - return name; - } -}; - -const dollarSign = /\$/; -const doubleUnderscore = /__/; -const singleUnderscore = /_/; - -const _systemEndianness = utils.getSystemEndianness(); - -module.exports = { - utils -}; -},{"./input":109,"./texture":112,"acorn":1}]},{},[106])(106) -}); diff --git a/dist/gpu-browser-core.min.js b/dist/gpu-browser-core.min.js deleted file mode 100644 index d86caf27..00000000 --- a/dist/gpu-browser-core.min.js +++ /dev/null @@ -1,28 +0,0 @@ -/** - * gpu.js - * http://gpu.rocks/ - * - * GPU Accelerated JavaScript - * - * @version 2.16.0 - * @date Wed Nov 16 2022 15:48:39 GMT-0500 (Eastern Standard Time) - * - * @license MIT - * The MIT License - * - * Copyright (c) 2022 gpu.js Team - *//** - * gpu.js - * http://gpu.rocks/ - * - * GPU Accelerated JavaScript - * - * @version 2.16.0 - * @date Wed Nov 16 2022 15:48:37 GMT-0500 (Eastern Standard Time) - * - * @license MIT - * The MIT License - * - * Copyright (c) 2022 gpu.js Team - */ -!function(e){if("object"==typeof exports&&"undefined"!=typeof module)module.exports=e();else if("function"==typeof define&&define.amd)define([],e);else{("undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self?self:this).GPU=e()}}((function(){return function e(t,n,r){function i(a,o){if(!n[a]){if(!t[a]){var u="function"==typeof require&&require;if(!o&&u)return u(a,!0);if(s)return s(a,!0);var l=new Error("Cannot find module '"+a+"'");throw l.code="MODULE_NOT_FOUND",l}var c=n[a]={exports:{}};t[a][0].call(c.exports,(function(e){return i(t[a][1][e]||e)}),c,c.exports,e,t,n,r)}return n[a].exports}for(var s="function"==typeof require&&require,a=0;a0;)l.pop()}function A(e,t){c[e]=t}function S(e){const t=g[e];return t?n+"."+t:e}function v(e){y=" ".repeat(e)}function _(e,t){const r=`${n}Variable${m.length}`;return l.push(`${y}const ${r} = ${t};`),m.push(e),r}function E(e,t){const r=`${n}Variable${m.length}`,i=`imageDatum${x}`;l.push(`${y}let ${i} = ["P3\\n# ${u}.ppm\\n", ${e}, ' ', ${t}, "\\n255\\n"].join("");`),l.push(`${y}for (let i = 0; i < ${i}.length; i += 4) {`),l.push(`${y} ${i} += ${r}[i] + ' ' + ${r}[i + 1] + ' ' + ${r}[i + 2] + ' ';`),l.push(`${y}}`),l.push(`${y}if (typeof require !== "undefined") {`),l.push(`${y} require('fs').writeFileSync('./${u}.ppm', ${i});`),l.push(`${y}}`),x++}function w(e){l.push(`${y}// ${e}`)}function D(){l.push(`${y}(() => {\n${y}const error = ${n}.getError();\n${y}if (error !== ${n}.NONE) {\n${y} const names = Object.getOwnPropertyNames(gl);\n${y} for (let i = 0; i < names.length; i++) {\n${y} const name = names[i];\n${y} if (${n}[name] === error) {\n${y} throw new Error('${n} threw ' + name);\n${y} }\n${y} }\n${y}}\n${y}})();`)}function $(e,t){return`${n}.${e}(${s(t,{contextName:n,contextVariables:m,getEntity:S,addVariable:_,variables:c,onUnrecognizedArgumentLookup:p})})`}function I(e){if(c)for(const t in c)if(c[t]===e)return t;return null}function F(e){const t=m.indexOf(e);return-1!==t?`${n}Variable${t}`:null}}function i(e,t){const n=new Proxy(e,{get:function(t,n){if("function"==typeof t[n])return function(){if("drawBuffersWEBGL"===n)return c.push(`${p}${i}.drawBuffersWEBGL([${s(arguments[0],{contextName:i,contextVariables:o,getEntity:m,addVariable:f,variables:h,onUnrecognizedArgumentLookup:d})}]);`),e.drawBuffersWEBGL(arguments[0]);let t=e[n].apply(e,arguments);switch(typeof t){case"undefined":return void c.push(`${p}${g(n,arguments)};`);case"number":case"boolean":l&&-1===o.indexOf(a(t))?(c.push(`${p}const ${i}Variable${o.length} = ${g(n,arguments)};`),o.push(t=a(t))):(c.push(`${p}const ${i}Variable${o.length} = ${g(n,arguments)};`),o.push(t));break;default:null===t?c.push(`${g(n,arguments)};`):c.push(`${p}const ${i}Variable${o.length} = ${g(n,arguments)};`),o.push(t)}return t};return r[e[n]]=n,e[n]}}),r={},{contextName:i,contextVariables:o,getEntity:u,useTrackablePrimitives:l,recording:c,variables:h,indent:p,onUnrecognizedArgumentLookup:d}=t;return n;function m(e){return r.hasOwnProperty(e)?`${i}.${r[e]}`:u(e)}function g(e,t){return`${i}.${e}(${s(t,{contextName:i,contextVariables:o,getEntity:m,addVariable:f,variables:h,onUnrecognizedArgumentLookup:d})})`}function f(e,t){const n=`${i}Variable${o.length}`;return o.push(e),c.push(`${p}const ${n} = ${t};`),n}}function s(e,t){const{variables:n,onUnrecognizedArgumentLookup:r}=t;return Array.from(e).map((e=>{const i=function(e){if(n)for(const t in n)if(n.hasOwnProperty(t)&&n[t]===e)return t;if(r)return r(e);return null}(e);return i||function(e,t){const{contextName:n,contextVariables:r,getEntity:i,addVariable:s,onUnrecognizedArgumentLookup:a}=t;if(void 0===e)return"undefined";if(null===e)return"null";const o=r.indexOf(e);if(o>-1)return`${n}Variable${o}`;switch(e.constructor.name){case"String":const t=/\n/.test(e),n=/'/.test(e),r=/"/.test(e);return t?"`"+e+"`":n&&!r?'"'+e+'"':"'"+e+"'";case"Number":case"Boolean":return i(e);case"Array":return s(e,`new ${e.constructor.name}([${Array.from(e).join(",")}])`);case"Float32Array":case"Uint8Array":case"Uint16Array":case"Int32Array":return s(e,`new ${e.constructor.name}(${JSON.stringify(Array.from(e))})`);default:if(a){const t=a(e);if(t)return t}throw new Error(`unrecognized argument type ${e.constructor.name}`)}}(e,t)})).join(", ")}function a(e){return new e.constructor(e)}void 0!==t&&(t.exports={glWiretap:r,glExtensionWiretap:i}),"undefined"!=typeof window&&(r.glExtensionWiretap=i,window.glWiretap=r)},{}],3:[function(e,t,n){function r(e){const t=new Array(e.length);for(let n=0;n{e.output=c(t),e.graphical&&l(e)},e.toJSON=()=>{throw new Error("Not usable with gpuMock")},e.setConstants=t=>(e.constants=t,e),e.setGraphical=t=>(e.graphical=t,e),e.setCanvas=t=>(e.canvas=t,e),e.setContext=t=>(e.context=t,e),e.destroy=()=>{},e.validateSettings=()=>{},e.graphical&&e.output&&l(e),e.exec=function(){return new Promise(((t,n)=>{try{t(e.apply(e,arguments))}catch(e){n(e)}}))},e.getPixels=t=>{const{x:n,y:r}=e.output;return t?function(e,t,n){const r=n/2|0,i=4*t,s=new Uint8ClampedArray(4*t),a=e.slice(0);for(let e=0;ee,n=["setWarnVarUsage","setArgumentTypes","setTactic","setOptimizeFloatMemory","setDebug","setLoopMaxIterations","setConstantTypes","setFunctions","setNativeFunctions","setInjectedNative","setPipeline","setPrecision","setOutputToTexture","setImmutable","setStrictIntegers","setDynamicOutput","setHardcodeConstants","setDynamicArguments","setUseLegacyEncoder","setWarnVarUsage","addSubKernel"];for(let r=0;r0&&t.push(", "),t.push("user_"),t.push(n)}t.push(") {\n")}for(let n=0;n0&&t.push(n.join(""),";\n"),t.push(`for (let ${e}=0;${e}0&&t.push(`if (!${r.join("")}) break;\n`),t.push(s.join("")),t.push(`\n${i.join("")};`),t.push("}\n")}return t}astWhileStatement(e,t){if("WhileStatement"!==e.type)throw this.astErrorOutput("Invalid while statement",e);return t.push("for (let i = 0; i < LOOP_MAX; i++) {"),t.push("if ("),this.astGeneric(e.test,t),t.push(") {\n"),this.astGeneric(e.body,t),t.push("} else {\n"),t.push("break;\n"),t.push("}\n"),t.push("}\n"),t}astDoWhileStatement(e,t){if("DoWhileStatement"!==e.type)throw this.astErrorOutput("Invalid while statement",e);return t.push("for (let i = 0; i < LOOP_MAX; i++) {"),this.astGeneric(e.body,t),t.push("if (!"),this.astGeneric(e.test,t),t.push(") {\n"),t.push("break;\n"),t.push("}\n"),t.push("}\n"),t}astAssignmentExpression(e,t){const n=this.getDeclaration(e.left);if(n&&!n.assignable)throw this.astErrorOutput(`Variable ${e.left.name} is not assignable here`,e);return this.astGeneric(e.left,t),t.push(e.operator),this.astGeneric(e.right,t),t}astBlockStatement(e,t){if(this.isState("loop-body")){this.pushState("block-body");for(let n=0;n0&&t.push(",");const r=n[e],i=this.getDeclaration(r.id);i.valueType||(i.valueType=this.getType(r.init)),this.astGeneric(r,t)}return this.isState("in-for-loop-init")||t.push(";"),t}astIfStatement(e,t){return t.push("if ("),this.astGeneric(e.test,t),t.push(")"),"BlockStatement"===e.consequent.type?this.astGeneric(e.consequent,t):(t.push(" {\n"),this.astGeneric(e.consequent,t),t.push("\n}\n")),e.alternate&&(t.push("else "),"BlockStatement"===e.alternate.type||"IfStatement"===e.alternate.type?this.astGeneric(e.alternate,t):(t.push(" {\n"),this.astGeneric(e.alternate,t),t.push("\n}\n"))),t}astSwitchStatement(e,t){const{discriminant:n,cases:r}=e;t.push("switch ("),this.astGeneric(n,t),t.push(") {\n");for(let e=0;e0&&(this.astGeneric(r[e].consequent,t),t.push("break;\n"))):(t.push("default:\n"),this.astGeneric(r[e].consequent,t),r[e].consequent&&r[e].consequent.length>0&&t.push("break;\n"));t.push("\n}")}astThisExpression(e,t){return t.push("_this"),t}astMemberExpression(e,t){const{signature:n,type:r,property:i,xProperty:s,yProperty:a,zProperty:o,name:u,origin:l}=this.getMemberExpressionDetails(e);switch(n){case"this.thread.value":return t.push(`_this.thread.${u}`),t;case"this.output.value":switch(u){case"x":t.push("outputX");break;case"y":t.push("outputY");break;case"z":t.push("outputZ");break;default:throw this.astErrorOutput("Unexpected expression",e)}return t;case"value":default:throw this.astErrorOutput("Unexpected expression",e);case"value[]":case"value[][]":case"value[][][]":case"value.value":if("Math"===l)return t.push(Math[u]),t;switch(i){case"r":return t.push(`user_${u}[0]`),t;case"g":return t.push(`user_${u}[1]`),t;case"b":return t.push(`user_${u}[2]`),t;case"a":return t.push(`user_${u}[3]`),t}break;case"this.constants.value":case"this.constants.value[]":case"this.constants.value[][]":case"this.constants.value[][][]":break;case"fn()[]":return this.astGeneric(e.object,t),t.push("["),this.astGeneric(e.property,t),t.push("]"),t;case"fn()[][]":return this.astGeneric(e.object.object,t),t.push("["),this.astGeneric(e.object.property,t),t.push("]"),t.push("["),this.astGeneric(e.property,t),t.push("]"),t}if(!e.computed)switch(r){case"Number":case"Integer":case"Float":case"Boolean":return t.push(`${l}_${u}`),t}const c=`${l}_${u}`;{let e,n;if("constants"===l){const t=this.constants[u];n="Input"===this.constantTypes[u],e=n?t.size:null}else n=this.isInput(u),e=n?this.argumentSizes[this.argumentNames.indexOf(u)]:null;t.push(`${c}`),o&&a?n?(t.push("[("),this.astGeneric(o,t),t.push(`*${this.dynamicArguments?"(outputY * outputX)":e[1]*e[0]})+(`),this.astGeneric(a,t),t.push(`*${this.dynamicArguments?"outputX":e[0]})+`),this.astGeneric(s,t),t.push("]")):(t.push("["),this.astGeneric(o,t),t.push("]"),t.push("["),this.astGeneric(a,t),t.push("]"),t.push("["),this.astGeneric(s,t),t.push("]")):a?n?(t.push("[("),this.astGeneric(a,t),t.push(`*${this.dynamicArguments?"outputX":e[0]})+`),this.astGeneric(s,t),t.push("]")):(t.push("["),this.astGeneric(a,t),t.push("]"),t.push("["),this.astGeneric(s,t),t.push("]")):void 0!==s&&(t.push("["),this.astGeneric(s,t),t.push("]"))}return t}astCallExpression(e,t){if("CallExpression"!==e.type)throw this.astErrorOutput("Unknown CallExpression",e);let n=this.astMemberExpressionUnroll(e.callee);this.calledFunctions.indexOf(n)<0&&this.calledFunctions.push(n);this.isAstMathFunction(e);this.onFunctionCall&&this.onFunctionCall(this.name,n,e.arguments),t.push(n),t.push("(");const r=this.lookupFunctionArgumentTypes(n)||[];for(let i=0;i0&&t.push(", "),this.astGeneric(s,t)}return t.push(")"),t}astArrayExpression(e,t){const n=this.getType(e),r=e.elements.length,i=[];for(let t=0;t{switch(t){case"_colorData":return"_colorData";case"_imageData":return"_imageData";case"output":return"output";case"thread":return"this.thread"}return JSON.stringify(e[t])},findDependency:(e,t)=>null}),o=r.flattenFunctionToString((a?"function ":"")+e.getPixels.toString(),{thisLookup:t=>{switch(t){case"_colorData":return"_colorData";case"_imageData":return"_imageData";case"output":return"output";case"thread":return"this.thread"}return JSON.stringify(e[t])},findDependency:()=>null});i.push(" _imageData,"," _colorData,",` color: ${t},`),s.push(` kernel.getPixels = ${o};`)}const o=[],u=Object.keys(e.constantTypes);for(let t=0;t"this"===t?(a?"function ":"")+e[n].toString():null,thisLookup:e=>{switch(e){case"canvas":return;case"context":return"context"}}});s.push(t),i.push(" _mediaTo2DArray,"),i.push(" _imageTo3DArray,")}else if(-1!==e.argumentTypes.indexOf("HTMLImage")||-1!==o.indexOf("HTMLImage")){const t=r.flattenFunctionToString((a?"function ":"")+e._mediaTo2DArray.toString(),{findDependency:(e,t)=>null,thisLookup:e=>{switch(e){case"canvas":return"settings.canvas";case"context":return"settings.context"}throw new Error("unhandled thisLookup")}});s.push(t),i.push(" _mediaTo2DArray,")}return`function(settings) {\n${n.join("\n")}\n for (const p in _constantTypes) {\n if (!_constantTypes.hasOwnProperty(p)) continue;\n const type = _constantTypes[p];\n switch (type) {\n case 'Number':\n case 'Integer':\n case 'Float':\n case 'Boolean':\n case 'Array(2)':\n case 'Array(3)':\n case 'Array(4)':\n case 'Matrix(2)':\n case 'Matrix(3)':\n case 'Matrix(4)':\n if (incomingConstants.hasOwnProperty(p)) {\n console.warn('constant ' + p + ' of type ' + type + ' cannot be resigned');\n }\n continue;\n }\n if (!incomingConstants.hasOwnProperty(p)) {\n throw new Error('constant ' + p + ' not found');\n }\n _constants[p] = incomingConstants[p];\n }\n const kernel = (function() {\n${e._kernelString}\n })\n .apply({ ${i.join("\n")} });\n ${s.join("\n")}\n return kernel;\n}`}}},{"../../utils":113}],7:[function(e,t,n){const{Kernel:r}=e("../kernel"),{FunctionBuilder:i}=e("../function-builder"),{CPUFunctionNode:s}=e("./function-node"),{utils:a}=e("../../utils"),{cpuKernelString:o}=e("./kernel-string");t.exports={CPUKernel:class extends r{static getFeatures(){return this.features}static get features(){return Object.freeze({kernelMap:!0,isIntegerDivisionAccurate:!0})}static get isSupported(){return!0}static isContextMatch(e){return!1}static get mode(){return"cpu"}static nativeFunctionArguments(){return null}static nativeFunctionReturnType(){throw new Error(`Looking up native function return type not supported on ${this.name}`)}static combineKernels(e){return e}static getSignature(e,t){return"cpu"+(t.length>0?":"+t.join(","):"")}constructor(e,t){super(e,t),this.mergeSettings(e.settings||t),this._imageData=null,this._colorData=null,this._kernelString=null,this._prependedString=[],this.thread={x:0,y:0,z:0},this.translatedSources=null}initCanvas(){return"undefined"!=typeof document?document.createElement("canvas"):"undefined"!=typeof OffscreenCanvas?new OffscreenCanvas(0,0):void 0}initContext(){return this.canvas?this.canvas.getContext("2d"):null}initPlugins(e){return[]}validateSettings(e){if(!this.output||0===this.output.length){if(1!==e.length)throw new Error("Auto output only supported for kernels with only one input");const t=a.getVariableType(e[0],this.strictIntegers);if("Array"===t)this.output=a.getDimensions(t);else{if("NumberTexture"!==t&&"ArrayTexture(4)"!==t)throw new Error("Auto output not supported for input type: "+t);this.output=e[0].output}}if(this.graphical&&2!==this.output.length)throw new Error("Output must have 2 dimensions on graphical mode");this.checkOutput()}translateSource(){if(this.leadingReturnStatement=this.output.length>1?"resultX[x] = ":"result[x] = ",this.subKernels){const e=[];for(let t=0;t1?`resultX_${n}[x] = subKernelResult_${n};\n`:`result_${n}[x] = subKernelResult_${n};\n`)}this.followingReturnStatement=e.join("")}const e=i.fromKernel(this,s);this.translatedSources=e.getPrototypes("kernel"),this.graphical||this.returnType||(this.returnType=e.getKernelResultType())}build(){if(this.built)return;if(this.setupConstants(),this.setupArguments(arguments),this.validateSettings(arguments),this.translateSource(),this.graphical){const{canvas:e,output:t}=this;if(!e)throw new Error("no canvas available for using graphical output");const n=t[0],r=t[1]||1;e.width=n,e.height=r,this._imageData=this.context.createImageData(n,r),this._colorData=new Uint8ClampedArray(n*r*4)}const e=this.getKernelString();this.kernelString=e,this.debug&&(console.log("Function output:"),console.log(e));try{this.run=new Function([],e).bind(this)()}catch(e){console.error("An error occurred compiling the javascript: ",e)}this.buildSignature(arguments),this.built=!0}color(e,t,n,r){void 0===r&&(r=1),e=Math.floor(255*e),t=Math.floor(255*t),n=Math.floor(255*n),r=Math.floor(255*r);const i=this.output[0],s=this.output[1],a=this.thread.x+(s-this.thread.y-1)*i;this._colorData[4*a+0]=e,this._colorData[4*a+1]=t,this._colorData[4*a+2]=n,this._colorData[4*a+3]=r}getKernelString(){if(null!==this._kernelString)return this._kernelString;let e=null,{translatedSources:t}=this;return t.length>1?t=t.filter((t=>/^function/.test(t)?t:(e=t,!1))):e=t.shift(),this._kernelString=` const LOOP_MAX = ${this._getLoopMaxString()};\n ${this.injectedNative||""}\n const _this = this;\n ${this._resultKernelHeader()}\n ${this._processConstants()}\n return (${this.argumentNames.map((e=>"user_"+e)).join(", ")}) => {\n ${this._prependedString.join("")}\n ${this._earlyThrows()}\n ${this._processArguments()}\n ${this.graphical?this._graphicalKernelBody(e):this._resultKernelBody(e)}\n ${t.length>0?t.join("\n"):""}\n };`}toString(){return o(this)}_getLoopMaxString(){return this.loopMaxIterations?` ${parseInt(this.loopMaxIterations)};`:" 1000;"}_processConstants(){if(!this.constants)return"";const e=[];for(let t in this.constants){switch(this.constantTypes[t]){case"HTMLCanvas":case"OffscreenCanvas":case"HTMLImage":case"ImageBitmap":case"ImageData":case"HTMLVideo":e.push(` const constants_${t} = this._mediaTo2DArray(this.constants.${t});\n`);break;case"HTMLImageArray":e.push(` const constants_${t} = this._imageTo3DArray(this.constants.${t});\n`);break;case"Input":e.push(` const constants_${t} = this.constants.${t}.value;\n`);break;default:e.push(` const constants_${t} = this.constants.${t};\n`)}}return e.join("")}_earlyThrows(){if(this.graphical)return"";if(this.immutable)return"";if(!this.pipeline)return"";const e=[];for(let t=0;t`user_${r} === result_${e.name}`)).join(" || ");t.push(`user_${r} === result${i?` || ${i}`:""}`)}return`if (${t.join(" || ")}) throw new Error('Source and destination arrays are the same. Use immutable = true');`}_processArguments(){const e=[];for(let t=0;t0?e.width:e.videoWidth,r=e.height>0?e.height:e.videoHeight;t.width=0;e--){const t=a[e]=new Array(n);for(let e=0;e`const result_${e.name} = new ${t}(outputX);\n`)).join(" ")}\n ${this._mapSubKernels((e=>`let subKernelResult_${e.name};\n`)).join(" ")}\n for (let x = 0; x < outputX; x++) {\n this.thread.x = x;\n this.thread.y = 0;\n this.thread.z = 0;\n ${e}\n }`}_mutableKernel1DResults(){const e=this._getKernelResultTypeConstructorString();return` const outputX = _this.output[0];\n const result = new ${e}(outputX);\n ${this._mapSubKernels((t=>`const result_${t.name} = new ${e}(outputX);\n`)).join(" ")}\n ${this._mapSubKernels((e=>`let subKernelResult_${e.name};\n`)).join(" ")}`}_resultMutableKernel1DLoop(e){return` const outputX = _this.output[0];\n for (let x = 0; x < outputX; x++) {\n this.thread.x = x;\n this.thread.y = 0;\n this.thread.z = 0;\n ${e}\n }`}_resultImmutableKernel2DLoop(e){const t=this._getKernelResultTypeConstructorString();return` const outputX = _this.output[0];\n const outputY = _this.output[1];\n const result = new Array(outputY);\n ${this._mapSubKernels((e=>`const result_${e.name} = new Array(outputY);\n`)).join(" ")}\n ${this._mapSubKernels((e=>`let subKernelResult_${e.name};\n`)).join(" ")}\n for (let y = 0; y < outputY; y++) {\n this.thread.z = 0;\n this.thread.y = y;\n const resultX = result[y] = new ${t}(outputX);\n ${this._mapSubKernels((e=>`const resultX_${e.name} = result_${e.name}[y] = new ${t}(outputX);\n`)).join("")}\n for (let x = 0; x < outputX; x++) {\n this.thread.x = x;\n ${e}\n }\n }`}_mutableKernel2DResults(){const e=this._getKernelResultTypeConstructorString();return` const outputX = _this.output[0];\n const outputY = _this.output[1];\n const result = new Array(outputY);\n ${this._mapSubKernels((e=>`const result_${e.name} = new Array(outputY);\n`)).join(" ")}\n ${this._mapSubKernels((e=>`let subKernelResult_${e.name};\n`)).join(" ")}\n for (let y = 0; y < outputY; y++) {\n const resultX = result[y] = new ${e}(outputX);\n ${this._mapSubKernels((t=>`const resultX_${t.name} = result_${t.name}[y] = new ${e}(outputX);\n`)).join("")}\n }`}_resultMutableKernel2DLoop(e){const t=this._getKernelResultTypeConstructorString();return` const outputX = _this.output[0];\n const outputY = _this.output[1];\n for (let y = 0; y < outputY; y++) {\n this.thread.z = 0;\n this.thread.y = y;\n const resultX = result[y];\n ${this._mapSubKernels((e=>`const resultX_${e.name} = result_${e.name}[y] = new ${t}(outputX);\n`)).join("")}\n for (let x = 0; x < outputX; x++) {\n this.thread.x = x;\n ${e}\n }\n }`}_graphicalKernel2DLoop(e){return` const outputX = _this.output[0];\n const outputY = _this.output[1];\n for (let y = 0; y < outputY; y++) {\n this.thread.z = 0;\n this.thread.y = y;\n for (let x = 0; x < outputX; x++) {\n this.thread.x = x;\n ${e}\n }\n }`}_resultImmutableKernel3DLoop(e){const t=this._getKernelResultTypeConstructorString();return` const outputX = _this.output[0];\n const outputY = _this.output[1];\n const outputZ = _this.output[2];\n const result = new Array(outputZ);\n ${this._mapSubKernels((e=>`const result_${e.name} = new Array(outputZ);\n`)).join(" ")}\n ${this._mapSubKernels((e=>`let subKernelResult_${e.name};\n`)).join(" ")}\n for (let z = 0; z < outputZ; z++) {\n this.thread.z = z;\n const resultY = result[z] = new Array(outputY);\n ${this._mapSubKernels((e=>`const resultY_${e.name} = result_${e.name}[z] = new Array(outputY);\n`)).join(" ")}\n for (let y = 0; y < outputY; y++) {\n this.thread.y = y;\n const resultX = resultY[y] = new ${t}(outputX);\n ${this._mapSubKernels((e=>`const resultX_${e.name} = resultY_${e.name}[y] = new ${t}(outputX);\n`)).join(" ")}\n for (let x = 0; x < outputX; x++) {\n this.thread.x = x;\n ${e}\n }\n }\n }`}_mutableKernel3DResults(){const e=this._getKernelResultTypeConstructorString();return` const outputX = _this.output[0];\n const outputY = _this.output[1];\n const outputZ = _this.output[2];\n const result = new Array(outputZ);\n ${this._mapSubKernels((e=>`const result_${e.name} = new Array(outputZ);\n`)).join(" ")}\n ${this._mapSubKernels((e=>`let subKernelResult_${e.name};\n`)).join(" ")}\n for (let z = 0; z < outputZ; z++) {\n const resultY = result[z] = new Array(outputY);\n ${this._mapSubKernels((e=>`const resultY_${e.name} = result_${e.name}[z] = new Array(outputY);\n`)).join(" ")}\n for (let y = 0; y < outputY; y++) {\n const resultX = resultY[y] = new ${e}(outputX);\n ${this._mapSubKernels((t=>`const resultX_${t.name} = resultY_${t.name}[y] = new ${e}(outputX);\n`)).join(" ")}\n }\n }`}_resultMutableKernel3DLoop(e){return` const outputX = _this.output[0];\n const outputY = _this.output[1];\n const outputZ = _this.output[2];\n for (let z = 0; z < outputZ; z++) {\n this.thread.z = z;\n const resultY = result[z];\n for (let y = 0; y < outputY; y++) {\n this.thread.y = y;\n const resultX = resultY[y];\n for (let x = 0; x < outputX; x++) {\n this.thread.x = x;\n ${e}\n }\n }\n }`}_kernelOutput(){return this.subKernels?`\n return {\n result: result,\n ${this.subKernels.map((e=>`${e.property}: result_${e.name}`)).join(",\n ")}\n };`:"\n return result;"}_mapSubKernels(e){return null===this.subKernels?[""]:this.subKernels.map(e)}destroy(e){e&&delete this.canvas}static destroyContext(e){}toJSON(){const e=super.toJSON();return e.functionNodes=i.fromKernel(this,s).toJSON(),e}setOutput(e){super.setOutput(e);const[t,n]=this.output;this.graphical&&(this._imageData=this.context.createImageData(t,n),this._colorData=new Uint8ClampedArray(t*n*4))}prependString(e){if(this._kernelString)throw new Error("Kernel already built");this._prependedString.push(e)}hasPrependString(e){return this._prependedString.indexOf(e)>-1}}}},{"../../utils":113,"../function-builder":8,"../kernel":35,"./function-node":5,"./kernel-string":6}],8:[function(e,t,n){class r{static fromKernel(e,t,n){const{kernelArguments:i,kernelConstants:s,argumentNames:a,argumentSizes:o,argumentBitRatios:u,constants:l,constantBitRatios:c,debug:h,loopMaxIterations:p,nativeFunctions:d,output:m,optimizeFloatMemory:g,precision:f,plugins:x,source:y,subKernels:T,functions:b,leadingReturnStatement:A,followingReturnStatement:S,dynamicArguments:v,dynamicOutput:_}=e,E=new Array(i.length),w={};for(let e=0;eU.needsArgumentType(e,t),$=(e,t,n)=>{U.assignArgumentType(e,t,n)},I=(e,t,n)=>U.lookupReturnType(e,t,n),F=e=>U.lookupFunctionArgumentTypes(e),k=(e,t)=>U.lookupFunctionArgumentName(e,t),R=(e,t)=>U.lookupFunctionArgumentBitRatio(e,t),L=(e,t,n,r)=>{U.assignArgumentType(e,t,n,r)},z=(e,t,n,r)=>{U.assignArgumentBitRatio(e,t,n,r)},C=(e,t,n)=>{U.trackFunctionCall(e,t,n)},M=(e,n)=>{const r=[];for(let t=0;tnew t(e.source,{returnType:e.returnType,argumentTypes:e.argumentTypes,output:m,plugins:x,constants:l,constantTypes:w,constantBitRatios:c,optimizeFloatMemory:g,precision:f,lookupReturnType:I,lookupFunctionArgumentTypes:F,lookupFunctionArgumentName:k,lookupFunctionArgumentBitRatio:R,needsArgumentType:D,assignArgumentType:$,triggerImplyArgumentType:L,triggerImplyArgumentBitRatio:z,onFunctionCall:C,onNestedFunction:M}))));let G=null;T&&(G=T.map((e=>{const{name:n,source:r}=e;return new t(r,Object.assign({},N,{name:n,isSubKernel:!0,isRootKernel:!1}))})));const U=new r({kernel:e,rootNode:V,functionNodes:K,nativeFunctions:d,subKernelNodes:G});return U}constructor(e){if(e=e||{},this.kernel=e.kernel,this.rootNode=e.rootNode,this.functionNodes=e.functionNodes||[],this.subKernelNodes=e.subKernelNodes||[],this.nativeFunctions=e.nativeFunctions||[],this.functionMap={},this.nativeFunctionNames=[],this.lookupChain=[],this.functionNodeDependencies={},this.functionCalls={},this.rootNode&&(this.functionMap.kernel=this.rootNode),this.functionNodes)for(let e=0;e-1){const n=t.indexOf(e);if(-1===n)t.push(e);else{const e=t.splice(n,1)[0];t.push(e)}return t}const n=this.functionMap[e];if(n){const r=t.indexOf(e);if(-1===r){t.push(e),n.toString();for(let e=0;e-1){t.push(this.nativeFunctions[i].source);continue}const s=this.functionMap[r];s&&t.push(s.toString())}return t}toJSON(){return this.traceFunctionCalls(this.rootNode.name).reverse().map((e=>{const t=this.nativeFunctions.indexOf(e);if(t>-1)return{name:e,source:this.nativeFunctions[t].source};if(this.functionMap[e])return this.functionMap[e].toJSON();throw new Error(`function ${e} not found`)}))}fromJSON(e,t){this.functionMap={};for(let n=0;n0){const i=t.arguments;for(let t=0;t0&&this.argumentTypes.length!==this.argumentNames.length)throw new Error(`argumentTypes count of ${this.argumentTypes.length} exceeds ${this.argumentNames.length}`);if(this.output.length<1)throw new Error("this.output is not big enough")}isIdentifierConstant(e){return!!this.constants&&this.constants.hasOwnProperty(e)}isInput(e){return"Input"===this.argumentTypes[this.argumentNames.indexOf(e)]}pushState(e){this.states.push(e)}popState(e){if(this.state!==e)throw new Error(`Cannot popState ${e} when in ${this.state}`);this.states.pop()}isState(e){return this.state===e}get state(){return this.states[this.states.length-1]}astMemberExpressionUnroll(e){if("Identifier"===e.type)return e.name;if("ThisExpression"===e.type)return"this";if("MemberExpression"===e.type&&e.object&&e.property)return e.object.hasOwnProperty("name")&&"Math"!==e.object.name?this.astMemberExpressionUnroll(e.property):this.astMemberExpressionUnroll(e.object)+"."+this.astMemberExpressionUnroll(e.property);if(e.hasOwnProperty("expressions")){const t=e.expressions[0];if("Literal"===t.type&&0===t.value&&2===e.expressions.length)return this.astMemberExpressionUnroll(e.expressions[1])}throw this.astErrorOutput("Unknown astMemberExpressionUnroll",e)}getJsAST(e){if(this.ast)return this.ast;if("object"==typeof this.source)return this.traceFunctionAST(this.source),this.ast=this.source;if(null===(e=e||r))throw new Error("Missing JS to AST parser");const t=Object.freeze(e.parse(`const parser_${this.name} = ${this.source};`,{locations:!0})),n=t.body[0].declarations[0].init;if(this.traceFunctionAST(n),!t)throw new Error("Failed to parse JS code");return this.ast=n}traceFunctionAST(e){const{contexts:t,declarations:n,functions:r,identifiers:i,functionCalls:a}=new s(e);this.contexts=t,this.identifiers=i,this.functionCalls=a,this.functions=r;for(let e=0;e":case"<":return"Boolean";case"&":case"|":case"^":case"<<":case">>":case">>>":return"Integer"}const n=this.getType(e.left);if(this.isState("skip-literal-correction"))return n;if("LiteralInteger"===n){const t=this.getType(e.right);return"LiteralInteger"===t?e.left.value%1==0?"Integer":"Float":t}return a[n]||n;case"UpdateExpression":case"ReturnStatement":return this.getType(e.argument);case"UnaryExpression":return"~"===e.operator?"Integer":this.getType(e.argument);case"VariableDeclaration":{const t=e.declarations;let n;for(let e=0;e-1}isAstMathFunction(e){return"CallExpression"===e.type&&e.callee&&"MemberExpression"===e.callee.type&&e.callee.object&&"Identifier"===e.callee.object.type&&"Math"===e.callee.object.name&&e.callee.property&&"Identifier"===e.callee.property.type&&["abs","acos","acosh","asin","asinh","atan","atan2","atanh","cbrt","ceil","clz32","cos","cosh","expm1","exp","floor","fround","imul","log","log2","log10","log1p","max","min","pow","random","round","sign","sin","sinh","sqrt","tan","tanh","trunc"].indexOf(e.callee.property.name)>-1}isAstVariable(e){return"Identifier"===e.type||"MemberExpression"===e.type}isSafe(e){return this.isSafeDependencies(this.getDependencies(e))}isSafeDependencies(e){return!e||!e.every||e.every((e=>e.isSafe))}getDependencies(e,t,n){if(t||(t=[]),!e)return null;if(Array.isArray(e)){for(let r=0;r-1/0&&e.value<1/0&&!isNaN(e.value))});break;case"VariableDeclarator":return this.getDependencies(e.init,t,n);case"Identifier":const r=this.getDeclaration(e);if(r)t.push({name:e.name,origin:"declaration",isSafe:!n&&this.isSafeDependencies(r.dependencies)});else if(this.argumentNames.indexOf(e.name)>-1)t.push({name:e.name,origin:"argument",isSafe:!1});else if(this.strictTypingChecking)throw new Error(`Cannot find identifier origin "${e.name}"`);break;case"FunctionDeclaration":return this.getDependencies(e.body.body[e.body.body.length-1],t,n);case"ReturnStatement":return this.getDependencies(e.argument,t);case"BinaryExpression":case"LogicalExpression":return n="/"===e.operator||"*"===e.operator,this.getDependencies(e.left,t,n),this.getDependencies(e.right,t,n),t;case"UnaryExpression":case"UpdateExpression":return this.getDependencies(e.argument,t,n);case"VariableDeclaration":return this.getDependencies(e.declarations,t,n);case"ArrayExpression":return t.push({origin:"declaration",isSafe:!0}),t;case"CallExpression":return t.push({origin:"function",isSafe:!0}),t;case"MemberExpression":const i=this.getMemberExpressionDetails(e);switch(i.signature){case"value[]":this.getDependencies(e.object,t,n);break;case"value[][]":this.getDependencies(e.object.object,t,n);break;case"value[][][]":this.getDependencies(e.object.object.object,t,n);break;case"this.output.value":this.dynamicOutput&&t.push({name:i.name,origin:"output",isSafe:!1})}if(i)return i.property&&this.getDependencies(i.property,t,n),i.xProperty&&this.getDependencies(i.xProperty,t,n),i.yProperty&&this.getDependencies(i.yProperty,t,n),i.zProperty&&this.getDependencies(i.zProperty,t,n),t;case"SequenceExpression":return this.getDependencies(e.expressions,t,n);default:throw this.astErrorOutput(`Unhandled type ${e.type} in getDependencies`,e)}return t}getVariableSignature(e,t){if(!this.isAstVariable(e))throw new Error(`ast of type "${e.type}" is not a variable signature`);if("Identifier"===e.type)return"value";const n=[];for(;e;)e.computed?n.push("[]"):"ThisExpression"===e.type?n.unshift("this"):e.property&&e.property.name?"x"===e.property.name||"y"===e.property.name||"z"===e.property.name?n.unshift(t?"."+e.property.name:".value"):"constants"===e.property.name||"thread"===e.property.name||"output"===e.property.name?n.unshift("."+e.property.name):n.unshift(t?"."+e.property.name:".value"):e.name?n.unshift(t?e.name:"value"):e.callee&&e.callee.name?n.unshift(t?e.callee.name+"()":"fn()"):e.elements?n.unshift("[]"):n.unshift("unknown"),e=e.object;const r=n.join("");if(t)return r;return["value","value[]","value[][]","value[][][]","value[][][][]","value.value","value.thread.value","this.thread.value","this.output.value","this.constants.value","this.constants.value[]","this.constants.value[][]","this.constants.value[][][]","this.constants.value[][][][]","fn()[]","fn()[][]","fn()[][][]","[][]"].indexOf(r)>-1?r:null}build(){return this.toString().length>0}astGeneric(e,t){if(null===e)throw this.astErrorOutput("NULL ast",e);if(Array.isArray(e)){for(let n=0;n0?r[r.length-1]:0;return new Error(`${e} on line ${r.length}, position ${s.length}:\n ${n}`)}astDebuggerStatement(e,t){return t}astConditionalExpression(e,t){if("ConditionalExpression"!==e.type)throw this.astErrorOutput("Not a conditional expression",e);return t.push("("),this.astGeneric(e.test,t),t.push("?"),this.astGeneric(e.consequent,t),t.push(":"),this.astGeneric(e.alternate,t),t.push(")"),t}astFunction(e,t){throw new Error(`"astFunction" not defined on ${this.constructor.name}`)}astFunctionDeclaration(e,t){return this.isChildFunction(e)?t:this.astFunction(e,t)}astFunctionExpression(e,t){return this.isChildFunction(e)?t:this.astFunction(e,t)}isChildFunction(e){for(let t=0;t1?t.push("(",r.join(","),")"):t.push(r[0]),t}astUnaryExpression(e,t){return this.checkAndUpconvertBitwiseUnary(e,t)||(e.prefix?(t.push(e.operator),this.astGeneric(e.argument,t)):(this.astGeneric(e.argument,t),t.push(e.operator))),t}checkAndUpconvertBitwiseUnary(e,t){}astUpdateExpression(e,t){return e.prefix?(t.push(e.operator),this.astGeneric(e.argument,t)):(this.astGeneric(e.argument,t),t.push(e.operator)),t}astLogicalExpression(e,t){return t.push("("),this.astGeneric(e.left,t),t.push(e.operator),this.astGeneric(e.right,t),t.push(")"),t}astMemberExpression(e,t){return t}astCallExpression(e,t){return t}astArrayExpression(e,t){return t}getMemberExpressionDetails(e){if("MemberExpression"!==e.type)throw this.astErrorOutput(`Expression ${e.type} not a MemberExpression`,e);let t=null,n=null;const r=this.getVariableSignature(e);switch(r){case"value":return null;case"value.thread.value":case"this.thread.value":case"this.output.value":return{signature:r,type:"Integer",name:e.property.name};case"value[]":if("string"!=typeof e.object.name)throw this.astErrorOutput("Unexpected expression",e);return t=e.object.name,{name:t,origin:"user",signature:r,type:this.getVariableType(e.object),xProperty:e.property};case"value[][]":if("string"!=typeof e.object.object.name)throw this.astErrorOutput("Unexpected expression",e);return t=e.object.object.name,{name:t,origin:"user",signature:r,type:this.getVariableType(e.object.object),yProperty:e.object.property,xProperty:e.property};case"value[][][]":if("string"!=typeof e.object.object.object.name)throw this.astErrorOutput("Unexpected expression",e);return t=e.object.object.object.name,{name:t,origin:"user",signature:r,type:this.getVariableType(e.object.object.object),zProperty:e.object.object.property,yProperty:e.object.property,xProperty:e.property};case"value[][][][]":if("string"!=typeof e.object.object.object.object.name)throw this.astErrorOutput("Unexpected expression",e);return t=e.object.object.object.object.name,{name:t,origin:"user",signature:r,type:this.getVariableType(e.object.object.object.object),zProperty:e.object.object.property,yProperty:e.object.property,xProperty:e.property};case"value.value":if("string"!=typeof e.property.name)throw this.astErrorOutput("Unexpected expression",e);if(this.isAstMathVariable(e))return t=e.property.name,{name:t,origin:"Math",type:"Number",signature:r};switch(e.property.name){case"r":case"g":case"b":case"a":return t=e.object.name,{name:t,property:e.property.name,origin:"user",signature:r,type:"Number"};default:throw this.astErrorOutput("Unexpected expression",e)}case"this.constants.value":if("string"!=typeof e.property.name)throw this.astErrorOutput("Unexpected expression",e);if(t=e.property.name,n=this.getConstantType(t),!n)throw this.astErrorOutput("Constant has no type",e);return{name:t,type:n,origin:"constants",signature:r};case"this.constants.value[]":if("string"!=typeof e.object.property.name)throw this.astErrorOutput("Unexpected expression",e);if(t=e.object.property.name,n=this.getConstantType(t),!n)throw this.astErrorOutput("Constant has no type",e);return{name:t,type:n,origin:"constants",signature:r,xProperty:e.property};case"this.constants.value[][]":if("string"!=typeof e.object.object.property.name)throw this.astErrorOutput("Unexpected expression",e);if(t=e.object.object.property.name,n=this.getConstantType(t),!n)throw this.astErrorOutput("Constant has no type",e);return{name:t,type:n,origin:"constants",signature:r,yProperty:e.object.property,xProperty:e.property};case"this.constants.value[][][]":if("string"!=typeof e.object.object.object.property.name)throw this.astErrorOutput("Unexpected expression",e);if(t=e.object.object.object.property.name,n=this.getConstantType(t),!n)throw this.astErrorOutput("Constant has no type",e);return{name:t,type:n,origin:"constants",signature:r,zProperty:e.object.object.property,yProperty:e.object.property,xProperty:e.property};case"fn()[]":case"fn()[][]":case"[][]":return{signature:r,property:e.property};default:throw this.astErrorOutput("Unexpected expression",e)}}findIdentifierOrigin(e){const t=[this.ast];for(;t.length>0;){const n=t[0];if("VariableDeclarator"===n.type&&n.id&&n.id.name&&n.id.name===e.name)return n;if(t.shift(),n.argument)t.push(n.argument);else if(n.body)t.push(n.body);else if(n.declarations)t.push(n.declarations);else if(Array.isArray(n))for(let e=0;e0;){const e=t.pop();if("ReturnStatement"===e.type)return e;if("FunctionDeclaration"!==e.type)if(e.argument)t.push(e.argument);else if(e.body)t.push(e.body);else if(e.declarations)t.push(e.declarations);else if(Array.isArray(e))for(let n=0;n0?e[e.length-1]:null}const s="trackIdentifiers",a="memberExpression",o="inForLoopInit";t.exports={FunctionTracer:class{constructor(e){this.runningContexts=[],this.functionContexts=[],this.contexts=[],this.functionCalls=[],this.declarations=[],this.identifiers=[],this.functions=[],this.returnStatements=[],this.trackedIdentifiers=null,this.states=[],this.newFunctionContext(),this.scan(e)}isState(e){return this.states[this.states.length-1]===e}hasState(e){return this.states.indexOf(e)>-1}pushState(e){this.states.push(e)}popState(e){if(!this.isState(e))throw new Error(`Cannot pop the non-active state "${e}"`);this.states.pop()}get currentFunctionContext(){return i(this.functionContexts)}get currentContext(){return i(this.runningContexts)}newFunctionContext(){const e={"@contextType":"function"};this.contexts.push(e),this.functionContexts.push(e)}newContext(e){const t=Object.assign({"@contextType":"const/let"},this.currentContext);this.contexts.push(t),this.runningContexts.push(t),e();const{currentFunctionContext:n}=this;for(const e in n)n.hasOwnProperty(e)&&!t.hasOwnProperty(e)&&(t[e]=n[e]);return this.runningContexts.pop(),t}useFunctionContext(e){const t=i(this.functionContexts);this.runningContexts.push(t),e(),this.runningContexts.pop()}getIdentifiers(e){const t=this.trackedIdentifiers=[];return this.pushState(s),e(),this.trackedIdentifiers=null,this.popState(s),t}getDeclaration(e){const{currentContext:t,currentFunctionContext:n,runningContexts:r}=this,i=t[e]||n[e]||null;if(!i&&t===n&&r.length>0){const t=r[r.length-2];if(t[e])return t[e]}return i}scan(e){if(e)if(Array.isArray(e))for(let t=0;t{this.scan(e.body)}));break;case"BlockStatement":this.newContext((()=>{this.scan(e.body)}));break;case"AssignmentExpression":case"LogicalExpression":case"BinaryExpression":this.scan(e.left),this.scan(e.right);break;case"UpdateExpression":if("++"===e.operator){const t=this.getDeclaration(e.argument.name);t&&(t.suggestedType="Integer")}this.scan(e.argument);break;case"UnaryExpression":this.scan(e.argument);break;case"VariableDeclaration":"var"===e.kind?this.useFunctionContext((()=>{e.declarations=r.normalizeDeclarations(e),this.scan(e.declarations)})):(e.declarations=r.normalizeDeclarations(e),this.scan(e.declarations));break;case"VariableDeclarator":{const{currentContext:t}=this,n=this.hasState(o),r={ast:e,context:t,name:e.id.name,origin:"declaration",inForLoopInit:n,inForLoopTest:null,assignable:t===this.currentFunctionContext||!n&&!t.hasOwnProperty(e.id.name),suggestedType:null,valueType:null,dependencies:null,isSafe:null};t[e.id.name]||(t[e.id.name]=r),this.declarations.push(r),this.scan(e.id),this.scan(e.init);break}case"FunctionExpression":case"FunctionDeclaration":0===this.runningContexts.length?this.scan(e.body):this.functions.push(e);break;case"IfStatement":this.scan(e.test),this.scan(e.consequent),e.alternate&&this.scan(e.alternate);break;case"ForStatement":{let t;const n=this.newContext((()=>{this.pushState(o),this.scan(e.init),this.popState(o),t=this.getIdentifiers((()=>{this.scan(e.test)})),this.scan(e.update),this.newContext((()=>{this.scan(e.body)}))}));if(t)for(const e in n)"@contextType"!==e&&t.indexOf(e)>-1&&(n[e].inForLoopTest=!0);break}case"DoWhileStatement":case"WhileStatement":this.newContext((()=>{this.scan(e.body),this.scan(e.test)}));break;case"Identifier":this.isState(s)&&this.trackedIdentifiers.push(e.name),this.identifiers.push({context:this.currentContext,declaration:this.getDeclaration(e.name),ast:e});break;case"ReturnStatement":this.returnStatements.push(e),this.scan(e.argument);break;case"MemberExpression":this.pushState(a),this.scan(e.object),this.scan(e.property),this.popState(a);break;case"ExpressionStatement":this.scan(e.expression);break;case"SequenceExpression":this.scan(e.expressions);break;case"CallExpression":this.functionCalls.push({context:this.currentContext,ast:e}),this.scan(e.arguments);break;case"ArrayExpression":this.scan(e.elements);break;case"ConditionalExpression":this.scan(e.test),this.scan(e.alternate),this.scan(e.consequent);break;case"SwitchStatement":this.scan(e.discriminant),this.scan(e.cases);break;case"SwitchCase":this.scan(e.test),this.scan(e.consequent);break;case"ThisExpression":case"Literal":case"DebuggerStatement":case"EmptyStatement":case"BreakStatement":case"ContinueStatement":break;default:throw new Error(`unhandled type "${e.type}"`)}}}}},{"../utils":113}],11:[function(e,t,n){const{glWiretap:r}=e("gl-wiretap"),{utils:i}=e("../../utils");function s(e){return e.toString().replace("=>","").replace(/^function /,"").replace(/utils[.]/g,"/*utils.*/")}function a(e,t){const n="single"===t.precision?e:`new Float32Array(${e}.buffer)`;return t.output[2]?`renderOutput(${n}, ${t.output[0]}, ${t.output[1]}, ${t.output[2]})`:t.output[1]?`renderOutput(${n}, ${t.output[0]}, ${t.output[1]})`:`renderOutput(${n}, ${t.output[0]})`}function o(e,t,n){const r=e.toArray.toString(),s=!/^function/.test(r);return`() => {\n function framebuffer() { return ${n}; };\n ${i.flattenFunctionToString(`${s?"function ":""}${r}`,{findDependency:(t,n)=>{if("utils"===t)return`const ${n} = ${i[n].toString()};`;if("this"===t)return"framebuffer"===n?"":`${s?"function ":""}${e[n].toString()}`;throw new Error("unhandled fromObject")},thisLookup:(n,r)=>{if("texture"===n)return t;if("context"===n)return r?null:"gl";if(e.hasOwnProperty(n))return JSON.stringify(e[n]);throw new Error(`unhandled thisLookup ${n}`)}})}\n return toArray();\n }`}function u(e,t,n,r,i){if(null===e)return null;if(null===t)return null;switch(typeof e){case"boolean":case"number":return null}if("undefined"!=typeof HTMLImageElement&&e instanceof HTMLImageElement)for(let i=0;i{switch(typeof e){case"boolean":return new Boolean(e);case"number":return new Number(e);default:return e}})):null;const h=[],p=[],d=r(n.context,{useTrackablePrimitives:!0,onReadPixels:e=>{if(C.subKernels){if(m){const t=C.subKernels[g++].property;p.push(` result${isNaN(t)?"."+t:`[${t}]`} = ${a(e,C)};`)}else p.push(` const result = { result: ${a(e,C)} };`),m=!0;g===C.subKernels.length&&p.push(" return result;")}else e?p.push(` return ${a(e,C)};`):p.push(" return null;")},onUnrecognizedArgumentLookup:e=>{const t=u(e,C.kernelArguments,[],d,h);if(t)return t;const n=u(e,C.kernelConstants,S?Object.keys(S).map((e=>S[e])):[],d,h);return n||null}});let m=!1,g=0;const{source:f,canvas:x,output:y,pipeline:T,graphical:b,loopMaxIterations:A,constants:S,optimizeFloatMemory:v,precision:_,fixIntegerDivisionAccuracy:E,functions:w,nativeFunctions:D,subKernels:$,immutable:I,argumentTypes:F,constantTypes:k,kernelArguments:R,kernelConstants:L,tactic:z}=n,C=new e(f,{canvas:x,context:d,checkContext:!1,output:y,pipeline:T,graphical:b,loopMaxIterations:A,constants:S,optimizeFloatMemory:v,precision:_,fixIntegerDivisionAccuracy:E,functions:w,nativeFunctions:D,subKernels:$,immutable:I,argumentTypes:F,constantTypes:k,tactic:z});let M=[];if(d.setIndent(2),C.build.apply(C,t),M.push(d.toString()),d.reset(),C.kernelArguments.forEach(((e,n)=>{switch(e.type){case"Integer":case"Boolean":case"Number":case"Float":case"Array":case"Array(2)":case"Array(3)":case"Array(4)":case"HTMLCanvas":case"HTMLImage":case"HTMLVideo":case"Input":d.insertVariable(`uploadValue_${e.name}`,e.uploadValue);break;case"HTMLImageArray":for(let r=0;re.varName)).join(", ")}) {`),d.setIndent(4),C.run.apply(C,t),C.renderKernels?C.renderKernels():C.renderOutput&&C.renderOutput(),M.push(" /** start setup uploads for kernel values **/"),C.kernelArguments.forEach((e=>{M.push(" "+e.getStringValueHandler().split("\n").join("\n "))})),M.push(" /** end setup uploads for kernel values **/"),M.push(d.toString()),C.renderOutput===C.renderTexture){d.reset();const e=d.getContextVariableName(C.framebuffer);if(C.renderKernels){const t=C.renderKernels(),n=d.getContextVariableName(C.texture.texture);M.push(` return {\n result: {\n texture: ${n},\n type: '${t.result.type}',\n toArray: ${o(t.result,n,e)}\n },`);const{subKernels:r,mappedTextures:i}=C;for(let n=0;n"utils"===e?`const ${t} = ${i[t].toString()};`:null,thisLookup:t=>{if("context"===t)return null;if(e.hasOwnProperty(t))return JSON.stringify(e[t]);throw new Error(`unhandled thisLookup ${t}`)}})}(C)),M.push(" innerKernel.getPixels = getPixels;")),M.push(" return innerKernel;");let N=[];return L.forEach((e=>{N.push(`${e.getStringValueHandler()}`)})),`function kernel(settings) {\n const { context, constants } = settings;\n ${N.join("")}\n ${l||""}\n${M.join("\n")}\n}`}}},{"../../utils":113,"gl-wiretap":2}],12:[function(e,t,n){const{Kernel:r}=e("../kernel"),{utils:i}=e("../../utils"),{GLTextureArray2Float:s}=e("./texture/array-2-float"),{GLTextureArray2Float2D:a}=e("./texture/array-2-float-2d"),{GLTextureArray2Float3D:o}=e("./texture/array-2-float-3d"),{GLTextureArray3Float:u}=e("./texture/array-3-float"),{GLTextureArray3Float2D:l}=e("./texture/array-3-float-2d"),{GLTextureArray3Float3D:c}=e("./texture/array-3-float-3d"),{GLTextureArray4Float:h}=e("./texture/array-4-float"),{GLTextureArray4Float2D:p}=e("./texture/array-4-float-2d"),{GLTextureArray4Float3D:d}=e("./texture/array-4-float-3d"),{GLTextureFloat:m}=e("./texture/float"),{GLTextureFloat2D:g}=e("./texture/float-2d"),{GLTextureFloat3D:f}=e("./texture/float-3d"),{GLTextureMemoryOptimized:x}=e("./texture/memory-optimized"),{GLTextureMemoryOptimized2D:y}=e("./texture/memory-optimized-2d"),{GLTextureMemoryOptimized3D:T}=e("./texture/memory-optimized-3d"),{GLTextureUnsigned:b}=e("./texture/unsigned"),{GLTextureUnsigned2D:A}=e("./texture/unsigned-2d"),{GLTextureUnsigned3D:S}=e("./texture/unsigned-3d"),{GLTextureGraphical:v}=e("./texture/graphical");const _={int:"Integer",float:"Number",vec2:"Array(2)",vec3:"Array(3)",vec4:"Array(4)"};t.exports={GLKernel:class extends r{static get mode(){return"gpu"}static getIsFloatRead(){const e=new this("function kernelFunction() {\n return 1;\n }",{context:this.testContext,canvas:this.testCanvas,validate:!1,output:[1],precision:"single",returnType:"Number",tactic:"speed"});e.build(),e.run();const t=e.renderOutput();return e.destroy(!0),1===t[0]}static getIsIntegerDivisionAccurate(){const e=new this(function(e,t){return e[this.thread.x]/t[this.thread.x]}.toString(),{context:this.testContext,canvas:this.testCanvas,validate:!1,output:[2],returnType:"Number",precision:"unsigned",tactic:"speed"}),t=[[6,6030401],[3,3991]];e.build.apply(e,t),e.run.apply(e,t);const n=e.renderOutput();return e.destroy(!0),2===n[0]&&1511===n[1]}static getIsSpeedTacticSupported(){const e=new this(function(e){return e[this.thread.x]}.toString(),{context:this.testContext,canvas:this.testCanvas,validate:!1,output:[4],returnType:"Number",precision:"unsigned",tactic:"speed"}),t=[[0,1,2,3]];e.build.apply(e,t),e.run.apply(e,t);const n=e.renderOutput();return e.destroy(!0),0===Math.round(n[0])&&1===Math.round(n[1])&&2===Math.round(n[2])&&3===Math.round(n[3])}static get testCanvas(){throw new Error(`"testCanvas" not defined on ${this.name}`)}static get testContext(){throw new Error(`"testContext" not defined on ${this.name}`)}static getFeatures(){const e=this.testContext,t=this.getIsDrawBuffers();return Object.freeze({isFloatRead:this.getIsFloatRead(),isIntegerDivisionAccurate:this.getIsIntegerDivisionAccurate(),isSpeedTacticSupported:this.getIsSpeedTacticSupported(),isTextureFloat:this.getIsTextureFloat(),isDrawBuffers:t,kernelMap:t,channelCount:this.getChannelCount(),maxTextureSize:this.getMaxTextureSize(),lowIntPrecision:e.getShaderPrecisionFormat(e.FRAGMENT_SHADER,e.LOW_INT),lowFloatPrecision:e.getShaderPrecisionFormat(e.FRAGMENT_SHADER,e.LOW_FLOAT),mediumIntPrecision:e.getShaderPrecisionFormat(e.FRAGMENT_SHADER,e.MEDIUM_INT),mediumFloatPrecision:e.getShaderPrecisionFormat(e.FRAGMENT_SHADER,e.MEDIUM_FLOAT),highIntPrecision:e.getShaderPrecisionFormat(e.FRAGMENT_SHADER,e.HIGH_INT),highFloatPrecision:e.getShaderPrecisionFormat(e.FRAGMENT_SHADER,e.HIGH_FLOAT)})}static setupFeatureChecks(){throw new Error(`"setupFeatureChecks" not defined on ${this.name}`)}static getSignature(e,t){return e.getVariablePrecisionString()+(t.length>0?":"+t.join(","):"")}setFixIntegerDivisionAccuracy(e){return this.fixIntegerDivisionAccuracy=e,this}setPrecision(e){return this.precision=e,this}setFloatTextures(e){return i.warnDeprecated("method","setFloatTextures","setOptimizeFloatMemory"),this.floatTextures=e,this}static nativeFunctionArguments(e){const t=[],n=[],r=[],i=/^[a-zA-Z_]/,s=/[a-zA-Z_0-9]/;let a=0,o=null,u=null;for(;a0?r[r.length-1]:null;if("FUNCTION_ARGUMENTS"!==h||"/"!==l||"*"!==c)if("MULTI_LINE_COMMENT"!==h||"*"!==l||"/"!==c)if("FUNCTION_ARGUMENTS"!==h||"/"!==l||"/"!==c)if("COMMENT"!==h||"\n"!==l)if(null!==h||"("!==l){if("FUNCTION_ARGUMENTS"===h){if(")"===l){r.pop();break}if("f"===l&&"l"===c&&"o"===e[a+2]&&"a"===e[a+3]&&"t"===e[a+4]&&" "===e[a+5]){r.push("DECLARE_VARIABLE"),u="float",o="",a+=6;continue}if("i"===l&&"n"===c&&"t"===e[a+2]&&" "===e[a+3]){r.push("DECLARE_VARIABLE"),u="int",o="",a+=4;continue}if("v"===l&&"e"===c&&"c"===e[a+2]&&"2"===e[a+3]&&" "===e[a+4]){r.push("DECLARE_VARIABLE"),u="vec2",o="",a+=5;continue}if("v"===l&&"e"===c&&"c"===e[a+2]&&"3"===e[a+3]&&" "===e[a+4]){r.push("DECLARE_VARIABLE"),u="vec3",o="",a+=5;continue}if("v"===l&&"e"===c&&"c"===e[a+2]&&"4"===e[a+3]&&" "===e[a+4]){r.push("DECLARE_VARIABLE"),u="vec4",o="",a+=5;continue}}else if("DECLARE_VARIABLE"===h){if(""===o){if(" "===l){a++;continue}if(!i.test(l))throw new Error("variable name is not expected string")}o+=l,s.test(c)||(r.pop(),n.push(o),t.push(_[u]))}a++}else r.push("FUNCTION_ARGUMENTS"),a++;else r.pop(),a++;else r.push("COMMENT"),a+=2;else r.pop(),a+=2;else r.push("MULTI_LINE_COMMENT"),a+=2}if(r.length>0)throw new Error("GLSL function was not parsable");return{argumentNames:n,argumentTypes:t}}static nativeFunctionReturnType(e){return _[e.match(/int|float|vec[2-4]/)[0]]}static combineKernels(e,t){e.apply(null,arguments);const{texSize:n,context:r,threadDim:s}=t.texSize;let a;if("single"===t.precision){const e=n[0],t=Math.ceil(n[1]/4);a=new Float32Array(e*t*4*4),r.readPixels(0,0,e,4*t,r.RGBA,r.FLOAT,a)}else{const e=new Uint8Array(n[0]*n[1]*4);r.readPixels(0,0,n[0],n[1],r.RGBA,r.UNSIGNED_BYTE,e),a=new Float32Array(e.buffer)}if(a=a.subarray(0,s[0]*s[1]*s[2]),1===t.output.length)return a;if(2===t.output.length)return i.splitArray(a,t.output[0]);if(3===t.output.length){return i.splitArray(a,t.output[0]*t.output[1]).map((function(e){return i.splitArray(e,t.output[0])}))}}constructor(e,t){super(e,t),this.transferValues=null,this.formatValues=null,this.TextureConstructor=null,this.renderOutput=null,this.renderRawOutput=null,this.texSize=null,this.translatedSource=null,this.compiledFragmentShader=null,this.compiledVertexShader=null,this.switchingKernels=null,this._textureSwitched=null,this._mappedTextureSwitched=null}checkTextureSize(){const{features:e}=this.constructor;if(this.texSize[0]>e.maxTextureSize||this.texSize[1]>e.maxTextureSize)throw new Error(`Texture size [${this.texSize[0]},${this.texSize[1]}] generated by kernel is larger than supported size [${e.maxTextureSize},${e.maxTextureSize}]`)}translateSource(){throw new Error(`"translateSource" not defined on ${this.constructor.name}`)}pickRenderStrategy(e){if(this.graphical)return this.renderRawOutput=this.readPackedPixelsToUint8Array,this.transferValues=e=>e,this.TextureConstructor=v,null;if("unsigned"===this.precision)if(this.renderRawOutput=this.readPackedPixelsToUint8Array,this.transferValues=this.readPackedPixelsToFloat32Array,this.pipeline)switch(this.renderOutput=this.renderTexture,null!==this.subKernels&&(this.renderKernels=this.renderKernelsToTextures),this.returnType){case"LiteralInteger":case"Float":case"Number":case"Integer":return this.output[2]>0?(this.TextureConstructor=S,null):this.output[1]>0?(this.TextureConstructor=A,null):(this.TextureConstructor=b,null);case"Array(2)":case"Array(3)":case"Array(4)":return this.requestFallback(e)}else switch(null!==this.subKernels&&(this.renderKernels=this.renderKernelsToArrays),this.returnType){case"LiteralInteger":case"Float":case"Number":case"Integer":return this.renderOutput=this.renderValues,this.output[2]>0?(this.TextureConstructor=S,this.formatValues=i.erect3DPackedFloat,null):this.output[1]>0?(this.TextureConstructor=A,this.formatValues=i.erect2DPackedFloat,null):(this.TextureConstructor=b,this.formatValues=i.erectPackedFloat,null);case"Array(2)":case"Array(3)":case"Array(4)":return this.requestFallback(e)}else{if("single"!==this.precision)throw new Error(`unhandled precision of "${this.precision}"`);if(this.renderRawOutput=this.readFloatPixelsToFloat32Array,this.transferValues=this.readFloatPixelsToFloat32Array,this.pipeline)switch(this.renderOutput=this.renderTexture,null!==this.subKernels&&(this.renderKernels=this.renderKernelsToTextures),this.returnType){case"LiteralInteger":case"Float":case"Number":case"Integer":return this.optimizeFloatMemory?this.output[2]>0?(this.TextureConstructor=T,null):this.output[1]>0?(this.TextureConstructor=y,null):(this.TextureConstructor=x,null):this.output[2]>0?(this.TextureConstructor=f,null):this.output[1]>0?(this.TextureConstructor=g,null):(this.TextureConstructor=m,null);case"Array(2)":return this.output[2]>0?(this.TextureConstructor=o,null):this.output[1]>0?(this.TextureConstructor=a,null):(this.TextureConstructor=s,null);case"Array(3)":return this.output[2]>0?(this.TextureConstructor=c,null):this.output[1]>0?(this.TextureConstructor=l,null):(this.TextureConstructor=u,null);case"Array(4)":return this.output[2]>0?(this.TextureConstructor=d,null):this.output[1]>0?(this.TextureConstructor=p,null):(this.TextureConstructor=h,null)}if(this.renderOutput=this.renderValues,null!==this.subKernels&&(this.renderKernels=this.renderKernelsToArrays),this.optimizeFloatMemory)switch(this.returnType){case"LiteralInteger":case"Float":case"Number":case"Integer":return this.output[2]>0?(this.TextureConstructor=T,this.formatValues=i.erectMemoryOptimized3DFloat,null):this.output[1]>0?(this.TextureConstructor=y,this.formatValues=i.erectMemoryOptimized2DFloat,null):(this.TextureConstructor=x,this.formatValues=i.erectMemoryOptimizedFloat,null);case"Array(2)":return this.output[2]>0?(this.TextureConstructor=o,this.formatValues=i.erect3DArray2,null):this.output[1]>0?(this.TextureConstructor=a,this.formatValues=i.erect2DArray2,null):(this.TextureConstructor=s,this.formatValues=i.erectArray2,null);case"Array(3)":return this.output[2]>0?(this.TextureConstructor=c,this.formatValues=i.erect3DArray3,null):this.output[1]>0?(this.TextureConstructor=l,this.formatValues=i.erect2DArray3,null):(this.TextureConstructor=u,this.formatValues=i.erectArray3,null);case"Array(4)":return this.output[2]>0?(this.TextureConstructor=d,this.formatValues=i.erect3DArray4,null):this.output[1]>0?(this.TextureConstructor=p,this.formatValues=i.erect2DArray4,null):(this.TextureConstructor=h,this.formatValues=i.erectArray4,null)}else switch(this.returnType){case"LiteralInteger":case"Float":case"Number":case"Integer":return this.output[2]>0?(this.TextureConstructor=f,this.formatValues=i.erect3DFloat,null):this.output[1]>0?(this.TextureConstructor=g,this.formatValues=i.erect2DFloat,null):(this.TextureConstructor=m,this.formatValues=i.erectFloat,null);case"Array(2)":return this.output[2]>0?(this.TextureConstructor=o,this.formatValues=i.erect3DArray2,null):this.output[1]>0?(this.TextureConstructor=a,this.formatValues=i.erect2DArray2,null):(this.TextureConstructor=s,this.formatValues=i.erectArray2,null);case"Array(3)":return this.output[2]>0?(this.TextureConstructor=c,this.formatValues=i.erect3DArray3,null):this.output[1]>0?(this.TextureConstructor=l,this.formatValues=i.erect2DArray3,null):(this.TextureConstructor=u,this.formatValues=i.erectArray3,null);case"Array(4)":return this.output[2]>0?(this.TextureConstructor=d,this.formatValues=i.erect3DArray4,null):this.output[1]>0?(this.TextureConstructor=p,this.formatValues=i.erect2DArray4,null):(this.TextureConstructor=h,this.formatValues=i.erectArray4,null)}}throw new Error(`unhandled return type "${this.returnType}"`)}getKernelString(){throw new Error("abstract method call")}getMainResultTexture(){switch(this.returnType){case"LiteralInteger":case"Float":case"Integer":case"Number":return this.getMainResultNumberTexture();case"Array(2)":return this.getMainResultArray2Texture();case"Array(3)":return this.getMainResultArray3Texture();case"Array(4)":return this.getMainResultArray4Texture();default:throw new Error(`unhandled returnType type ${this.returnType}`)}}getMainResultKernelNumberTexture(){throw new Error("abstract method call")}getMainResultSubKernelNumberTexture(){throw new Error("abstract method call")}getMainResultKernelArray2Texture(){throw new Error("abstract method call")}getMainResultSubKernelArray2Texture(){throw new Error("abstract method call")}getMainResultKernelArray3Texture(){throw new Error("abstract method call")}getMainResultSubKernelArray3Texture(){throw new Error("abstract method call")}getMainResultKernelArray4Texture(){throw new Error("abstract method call")}getMainResultSubKernelArray4Texture(){throw new Error("abstract method call")}getMainResultGraphical(){throw new Error("abstract method call")}getMainResultMemoryOptimizedFloats(){throw new Error("abstract method call")}getMainResultPackedPixels(){throw new Error("abstract method call")}getMainResultString(){return this.graphical?this.getMainResultGraphical():"single"===this.precision?this.optimizeFloatMemory?this.getMainResultMemoryOptimizedFloats():this.getMainResultTexture():this.getMainResultPackedPixels()}getMainResultNumberTexture(){return i.linesToString(this.getMainResultKernelNumberTexture())+i.linesToString(this.getMainResultSubKernelNumberTexture())}getMainResultArray2Texture(){return i.linesToString(this.getMainResultKernelArray2Texture())+i.linesToString(this.getMainResultSubKernelArray2Texture())}getMainResultArray3Texture(){return i.linesToString(this.getMainResultKernelArray3Texture())+i.linesToString(this.getMainResultSubKernelArray3Texture())}getMainResultArray4Texture(){return i.linesToString(this.getMainResultKernelArray4Texture())+i.linesToString(this.getMainResultSubKernelArray4Texture())}getFloatTacticDeclaration(){return`precision ${this.getVariablePrecisionString(this.texSize,this.tactic)} float;\n`}getIntTacticDeclaration(){return`precision ${this.getVariablePrecisionString(this.texSize,this.tactic,!0)} int;\n`}getSampler2DTacticDeclaration(){return`precision ${this.getVariablePrecisionString(this.texSize,this.tactic)} sampler2D;\n`}getSampler2DArrayTacticDeclaration(){return`precision ${this.getVariablePrecisionString(this.texSize,this.tactic)} sampler2DArray;\n`}renderTexture(){return this.immutable?this.texture.clone():this.texture}readPackedPixelsToUint8Array(){if("unsigned"!==this.precision)throw new Error('Requires this.precision to be "unsigned"');const{texSize:e,context:t}=this,n=new Uint8Array(e[0]*e[1]*4);return t.readPixels(0,0,e[0],e[1],t.RGBA,t.UNSIGNED_BYTE,n),n}readPackedPixelsToFloat32Array(){return new Float32Array(this.readPackedPixelsToUint8Array().buffer)}readFloatPixelsToFloat32Array(){if("single"!==this.precision)throw new Error('Requires this.precision to be "single"');const{texSize:e,context:t}=this,n=e[0],r=e[1],i=new Float32Array(n*r*4);return t.readPixels(0,0,n,r,t.RGBA,t.FLOAT,i),i}getPixels(e){const{context:t,output:n}=this,[r,s]=n,a=new Uint8Array(r*s*4);return t.readPixels(0,0,r,s,t.RGBA,t.UNSIGNED_BYTE,a),new Uint8ClampedArray((e?a:i.flipPixels(a,r,s)).buffer)}renderKernelsToArrays(){const e={result:this.renderOutput()};for(let t=0;t0){for(let e=0;e0){const{mappedTextures:n}=this;for(let r=0;r1&&(this.newTexture(),!0)}cloneTexture(){this.texture._refs--;const{context:e,size:t,texture:n,kernel:r}=this;r.debug&&console.warn("cloning internal texture"),e.bindFramebuffer(e.FRAMEBUFFER,this.framebuffer()),i(e,n),e.framebufferTexture2D(e.FRAMEBUFFER,e.COLOR_ATTACHMENT0,e.TEXTURE_2D,n,0);const s=e.createTexture();i(e,s),e.texImage2D(e.TEXTURE_2D,0,this.internalFormat,t[0],t[1],0,this.textureFormat,this.textureType,null),e.copyTexSubImage2D(e.TEXTURE_2D,0,0,0,0,0,t[0],t[1]),s._refs=1,this.texture=s}newTexture(){this.texture._refs--;const e=this.context,t=this.size;this.kernel.debug&&console.warn("new internal texture");const n=e.createTexture();i(e,n),e.texImage2D(e.TEXTURE_2D,0,this.internalFormat,t[0],t[1],0,this.textureFormat,this.textureType,null),n._refs=1,this.texture=n}clear(){if(this.texture._refs){this.texture._refs--;const e=this.context,t=this.texture=e.createTexture();i(e,t);const n=this.size;t._refs=1,e.texImage2D(e.TEXTURE_2D,0,this.internalFormat,n[0],n[1],0,this.textureFormat,this.textureType,null)}const{context:e,texture:t}=this;e.bindFramebuffer(e.FRAMEBUFFER,this.framebuffer()),e.bindTexture(e.TEXTURE_2D,t),i(e,t),e.framebufferTexture2D(e.FRAMEBUFFER,e.COLOR_ATTACHMENT0,e.TEXTURE_2D,t,0),e.clearColor(0,0,0,0),e.clear(e.COLOR_BUFFER_BIT|e.DEPTH_BUFFER_BIT)}delete(){this._deleted||(this._deleted=!0,this.texture._refs&&(this.texture._refs--,this.texture._refs)||this.context.deleteTexture(this.texture))}framebuffer(){return this._framebuffer||(this._framebuffer=this.kernel.getRawValueFramebuffer(this.size[0],this.size[1])),this._framebuffer}}}},{"../../../texture":112}],27:[function(e,t,n){const{utils:r}=e("../../../utils"),{GLTextureFloat:i}=e("./float");t.exports={GLTextureMemoryOptimized2D:class extends i{constructor(e){super(e),this.type="MemoryOptimizedNumberTexture"}toArray(){return r.erectMemoryOptimized2DFloat(this.renderValues(),this.output[0],this.output[1])}}}},{"../../../utils":113,"./float":24}],28:[function(e,t,n){const{utils:r}=e("../../../utils"),{GLTextureFloat:i}=e("./float");t.exports={GLTextureMemoryOptimized3D:class extends i{constructor(e){super(e),this.type="MemoryOptimizedNumberTexture"}toArray(){return r.erectMemoryOptimized3DFloat(this.renderValues(),this.output[0],this.output[1],this.output[2])}}}},{"../../../utils":113,"./float":24}],29:[function(e,t,n){const{utils:r}=e("../../../utils"),{GLTextureFloat:i}=e("./float");t.exports={GLTextureMemoryOptimized:class extends i{constructor(e){super(e),this.type="MemoryOptimizedNumberTexture"}toArray(){return r.erectMemoryOptimizedFloat(this.renderValues(),this.output[0])}}}},{"../../../utils":113,"./float":24}],30:[function(e,t,n){const{utils:r}=e("../../../utils"),{GLTextureUnsigned:i}=e("./unsigned");t.exports={GLTextureUnsigned2D:class extends i{constructor(e){super(e),this.type="NumberTexture"}toArray(){return r.erect2DPackedFloat(this.renderValues(),this.output[0],this.output[1])}}}},{"../../../utils":113,"./unsigned":32}],31:[function(e,t,n){const{utils:r}=e("../../../utils"),{GLTextureUnsigned:i}=e("./unsigned");t.exports={GLTextureUnsigned3D:class extends i{constructor(e){super(e),this.type="NumberTexture"}toArray(){return r.erect3DPackedFloat(this.renderValues(),this.output[0],this.output[1],this.output[2])}}}},{"../../../utils":113,"./unsigned":32}],32:[function(e,t,n){const{utils:r}=e("../../../utils"),{GLTexture:i}=e("./index");t.exports={GLTextureUnsigned:class extends i{get textureType(){return this.context.UNSIGNED_BYTE}constructor(e){super(e),this.type="NumberTexture"}renderRawOutput(){const{context:e}=this;e.bindFramebuffer(e.FRAMEBUFFER,this.framebuffer()),e.framebufferTexture2D(e.FRAMEBUFFER,e.COLOR_ATTACHMENT0,e.TEXTURE_2D,this.texture,0);const t=new Uint8Array(this.size[0]*this.size[1]*4);return e.readPixels(0,0,this.size[0],this.size[1],e.RGBA,e.UNSIGNED_BYTE,t),t}renderValues(){return this._deleted?null:new Float32Array(this.renderRawOutput().buffer)}toArray(){return r.erectPackedFloat(this.renderValues(),this.output[0])}}}},{"../../../utils":113,"./index":26}],33:[function(e,t,n){const r=e("gl"),{WebGLKernel:i}=e("../web-gl/kernel"),{glKernelString:s}=e("../gl/kernel-string");let a=null,o=null,u=null,l=null,c=null;t.exports={HeadlessGLKernel:class extends i{static get isSupported(){return null!==a||(this.setupFeatureChecks(),a=null!==u),a}static setupFeatureChecks(){if(o=null,l=null,"function"==typeof r)try{if(u=r(2,2,{preserveDrawingBuffer:!0}),!u||!u.getExtension)return;l={STACKGL_resize_drawingbuffer:u.getExtension("STACKGL_resize_drawingbuffer"),STACKGL_destroy_context:u.getExtension("STACKGL_destroy_context"),OES_texture_float:u.getExtension("OES_texture_float"),OES_texture_float_linear:u.getExtension("OES_texture_float_linear"),OES_element_index_uint:u.getExtension("OES_element_index_uint"),WEBGL_draw_buffers:u.getExtension("WEBGL_draw_buffers"),WEBGL_color_buffer_float:u.getExtension("WEBGL_color_buffer_float")},c=this.getFeatures()}catch(e){console.warn(e)}}static isContextMatch(e){try{return"ANGLE"===e.getParameter(e.RENDERER)}catch(e){return!1}}static getIsTextureFloat(){return Boolean(l.OES_texture_float)}static getIsDrawBuffers(){return Boolean(l.WEBGL_draw_buffers)}static getChannelCount(){return l.WEBGL_draw_buffers?u.getParameter(l.WEBGL_draw_buffers.MAX_DRAW_BUFFERS_WEBGL):1}static getMaxTextureSize(){return u.getParameter(u.MAX_TEXTURE_SIZE)}static get testCanvas(){return o}static get testContext(){return u}static get features(){return c}initCanvas(){return{}}initContext(){return r(2,2,{preserveDrawingBuffer:!0})}initExtensions(){this.extensions={STACKGL_resize_drawingbuffer:this.context.getExtension("STACKGL_resize_drawingbuffer"),STACKGL_destroy_context:this.context.getExtension("STACKGL_destroy_context"),OES_texture_float:this.context.getExtension("OES_texture_float"),OES_texture_float_linear:this.context.getExtension("OES_texture_float_linear"),OES_element_index_uint:this.context.getExtension("OES_element_index_uint"),WEBGL_draw_buffers:this.context.getExtension("WEBGL_draw_buffers")}}build(){super.build.apply(this,arguments),this.fallbackRequested||this.extensions.STACKGL_resize_drawingbuffer.resize(this.maxTexSize[0],this.maxTexSize[1])}destroyExtensions(){this.extensions.STACKGL_resize_drawingbuffer=null,this.extensions.STACKGL_destroy_context=null,this.extensions.OES_texture_float=null,this.extensions.OES_texture_float_linear=null,this.extensions.OES_element_index_uint=null,this.extensions.WEBGL_draw_buffers=null}static destroyContext(e){const t=e.getExtension("STACKGL_destroy_context");t&&t.destroy&&t.destroy()}toString(){return s(this.constructor,arguments,this,"const gl = context || require('gl')(1, 1);\n"," if (!context) { gl.getExtension('STACKGL_destroy_context').destroy(); }\n")}setOutput(e){return super.setOutput(e),this.graphical&&this.extensions.STACKGL_resize_drawingbuffer&&this.extensions.STACKGL_resize_drawingbuffer.resize(this.maxTexSize[0],this.maxTexSize[1]),this}}}},{"../gl/kernel-string":11,"../web-gl/kernel":69,gl:1}],34:[function(e,t,n){t.exports={KernelValue:class{constructor(e,t){const{name:n,kernel:r,context:i,checkContext:s,onRequestContextHandle:a,onUpdateValueMismatch:o,origin:u,strictIntegers:l,type:c,tactic:h}=t;if(!n)throw new Error("name not set");if(!c)throw new Error("type not set");if(!u)throw new Error("origin not set");if("user"!==u&&"constants"!==u)throw new Error(`origin must be "user" or "constants" value is "${u}"`);if(!a)throw new Error("onRequestContextHandle is not set");this.name=n,this.origin=u,this.tactic=h,this.varName="constants"===u?`constants.${n}`:n,this.kernel=r,this.strictIntegers=l,this.type=e.type||c,this.size=e.size||null,this.index=null,this.context=i,this.checkContext=null==s||s,this.contextHandle=null,this.onRequestContextHandle=a,this.onUpdateValueMismatch=o,this.forceUploadEachRun=null}get id(){return`${this.origin}_${name}`}getSource(){throw new Error(`"getSource" not defined on ${this.constructor.name}`)}updateValue(e){throw new Error(`"updateValue" not defined on ${this.constructor.name}`)}}}},{}],35:[function(e,t,n){const{utils:r}=e("../utils"),{Input:i}=e("../input");t.exports={Kernel:class{static get isSupported(){throw new Error(`"isSupported" not implemented on ${this.name}`)}static isContextMatch(e){throw new Error(`"isContextMatch" not implemented on ${this.name}`)}static getFeatures(){throw new Error(`"getFeatures" not implemented on ${this.name}`)}static destroyContext(e){throw new Error(`"destroyContext" called on ${this.name}`)}static nativeFunctionArguments(){throw new Error(`"nativeFunctionArguments" called on ${this.name}`)}static nativeFunctionReturnType(){throw new Error(`"nativeFunctionReturnType" called on ${this.name}`)}static combineKernels(){throw new Error(`"combineKernels" called on ${this.name}`)}constructor(e,t){if("object"!=typeof e){if("string"!=typeof e)throw new Error("source not a string");if(!r.isFunctionString(e))throw new Error("source not a function string")}this.useLegacyEncoder=!1,this.fallbackRequested=!1,this.onRequestFallback=null,this.argumentNames="string"==typeof e?r.getArgumentNamesFromString(e):null,this.argumentTypes=null,this.argumentSizes=null,this.argumentBitRatios=null,this.kernelArguments=null,this.kernelConstants=null,this.forceUploadKernelConstants=null,this.source=e,this.output=null,this.debug=!1,this.graphical=!1,this.loopMaxIterations=0,this.constants=null,this.constantTypes=null,this.constantBitRatios=null,this.dynamicArguments=!1,this.dynamicOutput=!1,this.canvas=null,this.context=null,this.checkContext=null,this.gpu=null,this.functions=null,this.nativeFunctions=null,this.injectedNative=null,this.subKernels=null,this.validate=!0,this.immutable=!1,this.pipeline=!1,this.precision=null,this.tactic=null,this.plugins=null,this.returnType=null,this.leadingReturnStatement=null,this.followingReturnStatement=null,this.optimizeFloatMemory=null,this.strictIntegers=!1,this.fixIntegerDivisionAccuracy=null,this.built=!1,this.signature=null}mergeSettings(e){for(let t in e)if(e.hasOwnProperty(t)&&this.hasOwnProperty(t)){switch(t){case"output":if(!Array.isArray(e.output)){this.setOutput(e.output);continue}break;case"functions":this.functions=[];for(let t=0;te.name)):null,returnType:this.returnType}}}buildSignature(e){const t=this.constructor;this.signature=t.getSignature(this,t.getArgumentTypes(this,e))}static getArgumentTypes(e,t){const n=new Array(t.length);for(let i=0;it.argumentTypes[e]))||[]:t.argumentTypes||[],{name:r.getFunctionNameFromString(n)||null,source:n,argumentTypes:i,returnType:t.returnType||null}}onActivate(e){}}}},{"../input":109,"../utils":113}],36:[function(e,t,n){const r=`__HEADER__;\n__FLOAT_TACTIC_DECLARATION__;\n__INT_TACTIC_DECLARATION__;\n__SAMPLER_2D_TACTIC_DECLARATION__;\n\nconst int LOOP_MAX = __LOOP_MAX__;\n\n__PLUGINS__;\n__CONSTANTS__;\n\nvarying vec2 vTexCoord;\n\nfloat acosh(float x) {\n return log(x + sqrt(x * x - 1.0));\n}\n\nfloat sinh(float x) {\n return (pow(${Math.E}, x) - pow(${Math.E}, -x)) / 2.0;\n}\n\nfloat asinh(float x) {\n return log(x + sqrt(x * x + 1.0));\n}\n\nfloat atan2(float v1, float v2) {\n if (v1 == 0.0 || v2 == 0.0) return 0.0;\n return atan(v1 / v2);\n}\n\nfloat atanh(float x) {\n x = (x + 1.0) / (x - 1.0);\n if (x < 0.0) {\n return 0.5 * log(-x);\n }\n return 0.5 * log(x);\n}\n\nfloat cbrt(float x) {\n if (x >= 0.0) {\n return pow(x, 1.0 / 3.0);\n } else {\n return -pow(x, 1.0 / 3.0);\n }\n}\n\nfloat cosh(float x) {\n return (pow(${Math.E}, x) + pow(${Math.E}, -x)) / 2.0; \n}\n\nfloat expm1(float x) {\n return pow(${Math.E}, x) - 1.0; \n}\n\nfloat fround(highp float x) {\n return x;\n}\n\nfloat imul(float v1, float v2) {\n return float(int(v1) * int(v2));\n}\n\nfloat log10(float x) {\n return log2(x) * (1.0 / log2(10.0));\n}\n\nfloat log1p(float x) {\n return log(1.0 + x);\n}\n\nfloat _pow(float v1, float v2) {\n if (v2 == 0.0) return 1.0;\n return pow(v1, v2);\n}\n\nfloat tanh(float x) {\n float e = exp(2.0 * x);\n return (e - 1.0) / (e + 1.0);\n}\n\nfloat trunc(float x) {\n if (x >= 0.0) {\n return floor(x); \n } else {\n return ceil(x);\n }\n}\n\nvec4 _round(vec4 x) {\n return floor(x + 0.5);\n}\n\nfloat _round(float x) {\n return floor(x + 0.5);\n}\n\nconst int BIT_COUNT = 32;\nint modi(int x, int y) {\n return x - y * (x / y);\n}\n\nint bitwiseOr(int a, int b) {\n int result = 0;\n int n = 1;\n \n for (int i = 0; i < BIT_COUNT; i++) {\n if ((modi(a, 2) == 1) || (modi(b, 2) == 1)) {\n result += n;\n }\n a = a / 2;\n b = b / 2;\n n = n * 2;\n if(!(a > 0 || b > 0)) {\n break;\n }\n }\n return result;\n}\nint bitwiseXOR(int a, int b) {\n int result = 0;\n int n = 1;\n \n for (int i = 0; i < BIT_COUNT; i++) {\n if ((modi(a, 2) == 1) != (modi(b, 2) == 1)) {\n result += n;\n }\n a = a / 2;\n b = b / 2;\n n = n * 2;\n if(!(a > 0 || b > 0)) {\n break;\n }\n }\n return result;\n}\nint bitwiseAnd(int a, int b) {\n int result = 0;\n int n = 1;\n for (int i = 0; i < BIT_COUNT; i++) {\n if ((modi(a, 2) == 1) && (modi(b, 2) == 1)) {\n result += n;\n }\n a = a / 2;\n b = b / 2;\n n = n * 2;\n if(!(a > 0 && b > 0)) {\n break;\n }\n }\n return result;\n}\nint bitwiseNot(int a) {\n int result = 0;\n int n = 1;\n \n for (int i = 0; i < BIT_COUNT; i++) {\n if (modi(a, 2) == 0) {\n result += n; \n }\n a = a / 2;\n n = n * 2;\n }\n return result;\n}\nint bitwiseZeroFillLeftShift(int n, int shift) {\n int maxBytes = BIT_COUNT;\n for (int i = 0; i < BIT_COUNT; i++) {\n if (maxBytes >= n) {\n break;\n }\n maxBytes *= 2;\n }\n for (int i = 0; i < BIT_COUNT; i++) {\n if (i >= shift) {\n break;\n }\n n *= 2;\n }\n\n int result = 0;\n int byteVal = 1;\n for (int i = 0; i < BIT_COUNT; i++) {\n if (i >= maxBytes) break;\n if (modi(n, 2) > 0) { result += byteVal; }\n n = int(n / 2);\n byteVal *= 2;\n }\n return result;\n}\n\nint bitwiseSignedRightShift(int num, int shifts) {\n return int(floor(float(num) / pow(2.0, float(shifts))));\n}\n\nint bitwiseZeroFillRightShift(int n, int shift) {\n int maxBytes = BIT_COUNT;\n for (int i = 0; i < BIT_COUNT; i++) {\n if (maxBytes >= n) {\n break;\n }\n maxBytes *= 2;\n }\n for (int i = 0; i < BIT_COUNT; i++) {\n if (i >= shift) {\n break;\n }\n n /= 2;\n }\n int result = 0;\n int byteVal = 1;\n for (int i = 0; i < BIT_COUNT; i++) {\n if (i >= maxBytes) break;\n if (modi(n, 2) > 0) { result += byteVal; }\n n = int(n / 2);\n byteVal *= 2;\n }\n return result;\n}\n\nvec2 integerMod(vec2 x, float y) {\n vec2 res = floor(mod(x, y));\n return res * step(1.0 - floor(y), -res);\n}\n\nvec3 integerMod(vec3 x, float y) {\n vec3 res = floor(mod(x, y));\n return res * step(1.0 - floor(y), -res);\n}\n\nvec4 integerMod(vec4 x, vec4 y) {\n vec4 res = floor(mod(x, y));\n return res * step(1.0 - floor(y), -res);\n}\n\nfloat integerMod(float x, float y) {\n float res = floor(mod(x, y));\n return res * (res > floor(y) - 1.0 ? 0.0 : 1.0);\n}\n\nint integerMod(int x, int y) {\n return x - (y * int(x / y));\n}\n\n__DIVIDE_WITH_INTEGER_CHECK__;\n\n// Here be dragons!\n// DO NOT OPTIMIZE THIS CODE\n// YOU WILL BREAK SOMETHING ON SOMEBODY'S MACHINE\n// LEAVE IT AS IT IS, LEST YOU WASTE YOUR OWN TIME\nconst vec2 MAGIC_VEC = vec2(1.0, -256.0);\nconst vec4 SCALE_FACTOR = vec4(1.0, 256.0, 65536.0, 0.0);\nconst vec4 SCALE_FACTOR_INV = vec4(1.0, 0.00390625, 0.0000152587890625, 0.0); // 1, 1/256, 1/65536\nfloat decode32(vec4 texel) {\n __DECODE32_ENDIANNESS__;\n texel *= 255.0;\n vec2 gte128;\n gte128.x = texel.b >= 128.0 ? 1.0 : 0.0;\n gte128.y = texel.a >= 128.0 ? 1.0 : 0.0;\n float exponent = 2.0 * texel.a - 127.0 + dot(gte128, MAGIC_VEC);\n float res = exp2(_round(exponent));\n texel.b = texel.b - 128.0 * gte128.x;\n res = dot(texel, SCALE_FACTOR) * exp2(_round(exponent-23.0)) + res;\n res *= gte128.y * -2.0 + 1.0;\n return res;\n}\n\nfloat decode16(vec4 texel, int index) {\n int channel = integerMod(index, 2);\n if (channel == 0) return texel.r * 255.0 + texel.g * 65280.0;\n if (channel == 1) return texel.b * 255.0 + texel.a * 65280.0;\n return 0.0;\n}\n\nfloat decode8(vec4 texel, int index) {\n int channel = integerMod(index, 4);\n if (channel == 0) return texel.r * 255.0;\n if (channel == 1) return texel.g * 255.0;\n if (channel == 2) return texel.b * 255.0;\n if (channel == 3) return texel.a * 255.0;\n return 0.0;\n}\n\nvec4 legacyEncode32(float f) {\n float F = abs(f);\n float sign = f < 0.0 ? 1.0 : 0.0;\n float exponent = floor(log2(F));\n float mantissa = (exp2(-exponent) * F);\n // exponent += floor(log2(mantissa));\n vec4 texel = vec4(F * exp2(23.0-exponent)) * SCALE_FACTOR_INV;\n texel.rg = integerMod(texel.rg, 256.0);\n texel.b = integerMod(texel.b, 128.0);\n texel.a = exponent*0.5 + 63.5;\n texel.ba += vec2(integerMod(exponent+127.0, 2.0), sign) * 128.0;\n texel = floor(texel);\n texel *= 0.003921569; // 1/255\n __ENCODE32_ENDIANNESS__;\n return texel;\n}\n\n// https://github.com/gpujs/gpu.js/wiki/Encoder-details\nvec4 encode32(float value) {\n if (value == 0.0) return vec4(0, 0, 0, 0);\n\n float exponent;\n float mantissa;\n vec4 result;\n float sgn;\n\n sgn = step(0.0, -value);\n value = abs(value);\n\n exponent = floor(log2(value));\n\n mantissa = value*pow(2.0, -exponent)-1.0;\n exponent = exponent+127.0;\n result = vec4(0,0,0,0);\n\n result.a = floor(exponent/2.0);\n exponent = exponent - result.a*2.0;\n result.a = result.a + 128.0*sgn;\n\n result.b = floor(mantissa * 128.0);\n mantissa = mantissa - result.b / 128.0;\n result.b = result.b + exponent*128.0;\n\n result.g = floor(mantissa*32768.0);\n mantissa = mantissa - result.g/32768.0;\n\n result.r = floor(mantissa*8388608.0);\n return result/255.0;\n}\n// Dragons end here\n\nint index;\nivec3 threadId;\n\nivec3 indexTo3D(int idx, ivec3 texDim) {\n int z = int(idx / (texDim.x * texDim.y));\n idx -= z * int(texDim.x * texDim.y);\n int y = int(idx / texDim.x);\n int x = int(integerMod(idx, texDim.x));\n return ivec3(x, y, z);\n}\n\nfloat get32(sampler2D tex, ivec2 texSize, ivec3 texDim, int z, int y, int x) {\n int index = x + texDim.x * (y + texDim.y * z);\n int w = texSize.x;\n vec2 st = vec2(float(integerMod(index, w)), float(index / w)) + 0.5;\n vec4 texel = texture2D(tex, st / vec2(texSize));\n return decode32(texel);\n}\n\nfloat get16(sampler2D tex, ivec2 texSize, ivec3 texDim, int z, int y, int x) {\n int index = x + texDim.x * (y + texDim.y * z);\n int w = texSize.x * 2;\n vec2 st = vec2(float(integerMod(index, w)), float(index / w)) + 0.5;\n vec4 texel = texture2D(tex, st / vec2(texSize.x * 2, texSize.y));\n return decode16(texel, index);\n}\n\nfloat get8(sampler2D tex, ivec2 texSize, ivec3 texDim, int z, int y, int x) {\n int index = x + texDim.x * (y + texDim.y * z);\n int w = texSize.x * 4;\n vec2 st = vec2(float(integerMod(index, w)), float(index / w)) + 0.5;\n vec4 texel = texture2D(tex, st / vec2(texSize.x * 4, texSize.y));\n return decode8(texel, index);\n}\n\nfloat getMemoryOptimized32(sampler2D tex, ivec2 texSize, ivec3 texDim, int z, int y, int x) {\n int index = x + texDim.x * (y + texDim.y * z);\n int channel = integerMod(index, 4);\n index = index / 4;\n int w = texSize.x;\n vec2 st = vec2(float(integerMod(index, w)), float(index / w)) + 0.5;\n vec4 texel = texture2D(tex, st / vec2(texSize));\n if (channel == 0) return texel.r;\n if (channel == 1) return texel.g;\n if (channel == 2) return texel.b;\n if (channel == 3) return texel.a;\n return 0.0;\n}\n\nvec4 getImage2D(sampler2D tex, ivec2 texSize, ivec3 texDim, int z, int y, int x) {\n int index = x + texDim.x * (y + texDim.y * z);\n int w = texSize.x;\n vec2 st = vec2(float(integerMod(index, w)), float(index / w)) + 0.5;\n return texture2D(tex, st / vec2(texSize));\n}\n\nfloat getFloatFromSampler2D(sampler2D tex, ivec2 texSize, ivec3 texDim, int z, int y, int x) {\n vec4 result = getImage2D(tex, texSize, texDim, z, y, x);\n return result[0];\n}\n\nvec2 getVec2FromSampler2D(sampler2D tex, ivec2 texSize, ivec3 texDim, int z, int y, int x) {\n vec4 result = getImage2D(tex, texSize, texDim, z, y, x);\n return vec2(result[0], result[1]);\n}\n\nvec2 getMemoryOptimizedVec2(sampler2D tex, ivec2 texSize, ivec3 texDim, int z, int y, int x) {\n int index = x + (texDim.x * (y + (texDim.y * z)));\n int channel = integerMod(index, 2);\n index = index / 2;\n int w = texSize.x;\n vec2 st = vec2(float(integerMod(index, w)), float(index / w)) + 0.5;\n vec4 texel = texture2D(tex, st / vec2(texSize));\n if (channel == 0) return vec2(texel.r, texel.g);\n if (channel == 1) return vec2(texel.b, texel.a);\n return vec2(0.0, 0.0);\n}\n\nvec3 getVec3FromSampler2D(sampler2D tex, ivec2 texSize, ivec3 texDim, int z, int y, int x) {\n vec4 result = getImage2D(tex, texSize, texDim, z, y, x);\n return vec3(result[0], result[1], result[2]);\n}\n\nvec3 getMemoryOptimizedVec3(sampler2D tex, ivec2 texSize, ivec3 texDim, int z, int y, int x) {\n int fieldIndex = 3 * (x + texDim.x * (y + texDim.y * z));\n int vectorIndex = fieldIndex / 4;\n int vectorOffset = fieldIndex - vectorIndex * 4;\n int readY = vectorIndex / texSize.x;\n int readX = vectorIndex - readY * texSize.x;\n vec4 tex1 = texture2D(tex, (vec2(readX, readY) + 0.5) / vec2(texSize));\n \n if (vectorOffset == 0) {\n return tex1.xyz;\n } else if (vectorOffset == 1) {\n return tex1.yzw;\n } else {\n readX++;\n if (readX >= texSize.x) {\n readX = 0;\n readY++;\n }\n vec4 tex2 = texture2D(tex, vec2(readX, readY) / vec2(texSize));\n if (vectorOffset == 2) {\n return vec3(tex1.z, tex1.w, tex2.x);\n } else {\n return vec3(tex1.w, tex2.x, tex2.y);\n }\n }\n}\n\nvec4 getVec4FromSampler2D(sampler2D tex, ivec2 texSize, ivec3 texDim, int z, int y, int x) {\n return getImage2D(tex, texSize, texDim, z, y, x);\n}\n\nvec4 getMemoryOptimizedVec4(sampler2D tex, ivec2 texSize, ivec3 texDim, int z, int y, int x) {\n int index = x + texDim.x * (y + texDim.y * z);\n int channel = integerMod(index, 2);\n int w = texSize.x;\n vec2 st = vec2(float(integerMod(index, w)), float(index / w)) + 0.5;\n vec4 texel = texture2D(tex, st / vec2(texSize));\n return vec4(texel.r, texel.g, texel.b, texel.a);\n}\n\nvec4 actualColor;\nvoid color(float r, float g, float b, float a) {\n actualColor = vec4(r,g,b,a);\n}\n\nvoid color(float r, float g, float b) {\n color(r,g,b,1.0);\n}\n\nvoid color(sampler2D image) {\n actualColor = texture2D(image, vTexCoord);\n}\n\nfloat modulo(float number, float divisor) {\n if (number < 0.0) {\n number = abs(number);\n if (divisor < 0.0) {\n divisor = abs(divisor);\n }\n return -mod(number, divisor);\n }\n if (divisor < 0.0) {\n divisor = abs(divisor);\n }\n return mod(number, divisor);\n}\n\n__INJECTED_NATIVE__;\n__MAIN_CONSTANTS__;\n__MAIN_ARGUMENTS__;\n__KERNEL__;\n\nvoid main(void) {\n index = int(vTexCoord.s * float(uTexSize.x)) + int(vTexCoord.t * float(uTexSize.y)) * uTexSize.x;\n __MAIN_RESULT__;\n}`;t.exports={fragmentShader:r}},{}],37:[function(e,t,n){const{utils:r}=e("../../utils"),{FunctionNode:i}=e("../function-node");const s={Array:"sampler2D","Array(2)":"vec2","Array(3)":"vec3","Array(4)":"vec4","Matrix(2)":"mat2","Matrix(3)":"mat3","Matrix(4)":"mat4",Array2D:"sampler2D",Array3D:"sampler2D",Boolean:"bool",Float:"float",Input:"sampler2D",Integer:"int",Number:"float",LiteralInteger:"float",NumberTexture:"sampler2D",MemoryOptimizedNumberTexture:"sampler2D","ArrayTexture(1)":"sampler2D","ArrayTexture(2)":"sampler2D","ArrayTexture(3)":"sampler2D","ArrayTexture(4)":"sampler2D",HTMLVideo:"sampler2D",HTMLCanvas:"sampler2D",OffscreenCanvas:"sampler2D",HTMLImage:"sampler2D",ImageBitmap:"sampler2D",ImageData:"sampler2D",HTMLImageArray:"sampler2DArray"},a={"===":"==","!==":"!="};t.exports={WebGLFunctionNode:class extends i{constructor(e,t){super(e,t),t&&t.hasOwnProperty("fixIntegerDivisionAccuracy")&&(this.fixIntegerDivisionAccuracy=t.fixIntegerDivisionAccuracy)}astConditionalExpression(e,t){if("ConditionalExpression"!==e.type)throw this.astErrorOutput("Not a conditional expression",e);const n=this.getType(e.consequent),r=this.getType(e.alternate);return null===n&&null===r?(t.push("if ("),this.astGeneric(e.test,t),t.push(") {"),this.astGeneric(e.consequent,t),t.push(";"),t.push("} else {"),this.astGeneric(e.alternate,t),t.push(";"),t.push("}"),t):(t.push("("),this.astGeneric(e.test,t),t.push("?"),this.astGeneric(e.consequent,t),t.push(":"),this.astGeneric(e.alternate,t),t.push(")"),t)}astFunction(e,t){if(this.isRootKernel)t.push("void");else{if(!this.returnType){this.findLastReturn()&&(this.returnType=this.getType(e.body),"LiteralInteger"===this.returnType&&(this.returnType="Number"))}const{returnType:n}=this;if(n){const e=s[n];if(!e)throw new Error(`unknown type ${n}`);t.push(e)}else t.push("void")}if(t.push(" "),t.push(this.name),t.push("("),!this.isRootKernel)for(let n=0;n0&&t.push(", ");let a=this.argumentTypes[this.argumentNames.indexOf(i)];if(!a)throw this.astErrorOutput(`Unknown argument ${i} type`,e);"LiteralInteger"===a&&(this.argumentTypes[n]=a="Number");const o=s[a];if(!o)throw this.astErrorOutput("Unexpected expression",e);const u=r.sanitizeName(i);"sampler2D"===o||"sampler2DArray"===o?t.push(`${o} user_${u},ivec2 user_${u}Size,ivec3 user_${u}Dim`):t.push(`${o} user_${u}`)}t.push(") {\n");for(let n=0;n"===e.operator||"<"===e.operator&&"Literal"===e.right.type)&&!Number.isInteger(e.right.value)){this.pushState("building-float"),this.castValueToFloat(e.left,t),t.push(a[e.operator]||e.operator),this.astGeneric(e.right,t),this.popState("building-float");break}if(this.pushState("building-integer"),this.astGeneric(e.left,t),t.push(a[e.operator]||e.operator),this.pushState("casting-to-integer"),"Literal"===e.right.type){const n=[];this.astGeneric(e.right,n);if("Integer"!==this.getType(e.right))throw this.astErrorOutput("Unhandled binary expression with literal",e);t.push(n.join(""))}else t.push("int("),this.astGeneric(e.right,t),t.push(")");this.popState("casting-to-integer"),this.popState("building-integer");break;case"Integer & LiteralInteger":this.pushState("building-integer"),this.astGeneric(e.left,t),t.push(a[e.operator]||e.operator),this.castLiteralToInteger(e.right,t),this.popState("building-integer");break;case"Number & Integer":case"Float & Integer":this.pushState("building-float"),this.astGeneric(e.left,t),t.push(a[e.operator]||e.operator),this.castValueToFloat(e.right,t),this.popState("building-float");break;case"Float & LiteralInteger":case"Number & LiteralInteger":this.pushState("building-float"),this.astGeneric(e.left,t),t.push(a[e.operator]||e.operator),this.castLiteralToFloat(e.right,t),this.popState("building-float");break;case"LiteralInteger & Float":case"LiteralInteger & Number":this.isState("casting-to-integer")?(this.pushState("building-integer"),this.castLiteralToInteger(e.left,t),t.push(a[e.operator]||e.operator),this.castValueToInteger(e.right,t),this.popState("building-integer")):(this.pushState("building-float"),this.astGeneric(e.left,t),t.push(a[e.operator]||e.operator),this.pushState("casting-to-float"),this.astGeneric(e.right,t),this.popState("casting-to-float"),this.popState("building-float"));break;case"LiteralInteger & Integer":this.pushState("building-integer"),this.castLiteralToInteger(e.left,t),t.push(a[e.operator]||e.operator),this.astGeneric(e.right,t),this.popState("building-integer");break;case"Boolean & Boolean":this.pushState("building-boolean"),this.astGeneric(e.left,t),t.push(a[e.operator]||e.operator),this.astGeneric(e.right,t),this.popState("building-boolean");break;default:throw this.astErrorOutput(`Unhandled binary expression between ${i}`,e)}return t.push(")"),t}checkAndUpconvertOperator(e,t){const n=this.checkAndUpconvertBitwiseOperators(e,t);if(n)return n;const r={"%":this.fixIntegerDivisionAccuracy?"integerCorrectionModulo":"modulo","**":"pow"}[e.operator];if(!r)return null;switch(t.push(r),t.push("("),this.getType(e.left)){case"Integer":this.castValueToFloat(e.left,t);break;case"LiteralInteger":this.castLiteralToFloat(e.left,t);break;default:this.astGeneric(e.left,t)}switch(t.push(","),this.getType(e.right)){case"Integer":this.castValueToFloat(e.right,t);break;case"LiteralInteger":this.castLiteralToFloat(e.right,t);break;default:this.astGeneric(e.right,t)}return t.push(")"),t}checkAndUpconvertBitwiseOperators(e,t){const n={"&":"bitwiseAnd","|":"bitwiseOr","^":"bitwiseXOR","<<":"bitwiseZeroFillLeftShift",">>":"bitwiseSignedRightShift",">>>":"bitwiseZeroFillRightShift"}[e.operator];if(!n)return null;t.push(n),t.push("(");switch(this.getType(e.left)){case"Number":case"Float":this.castValueToInteger(e.left,t);break;case"LiteralInteger":this.castLiteralToInteger(e.left,t);break;default:this.astGeneric(e.left,t)}t.push(",");switch(this.getType(e.right)){case"Number":case"Float":this.castValueToInteger(e.right,t);break;case"LiteralInteger":this.castLiteralToInteger(e.right,t);break;default:this.astGeneric(e.right,t)}return t.push(")"),t}checkAndUpconvertBitwiseUnary(e,t){const n={"~":"bitwiseNot"}[e.operator];if(!n)return null;switch(t.push(n),t.push("("),this.getType(e.argument)){case"Number":case"Float":this.castValueToInteger(e.argument,t);break;case"LiteralInteger":this.castLiteralToInteger(e.argument,t);break;default:this.astGeneric(e.argument,t)}return t.push(")"),t}castLiteralToInteger(e,t){return this.pushState("casting-to-integer"),this.astGeneric(e,t),this.popState("casting-to-integer"),t}castLiteralToFloat(e,t){return this.pushState("casting-to-float"),this.astGeneric(e,t),this.popState("casting-to-float"),t}castValueToInteger(e,t){return this.pushState("casting-to-integer"),t.push("int("),this.astGeneric(e,t),t.push(")"),this.popState("casting-to-integer"),t}castValueToFloat(e,t){return this.pushState("casting-to-float"),t.push("float("),this.astGeneric(e,t),t.push(")"),this.popState("casting-to-float"),t}astIdentifierExpression(e,t){if("Identifier"!==e.type)throw this.astErrorOutput("IdentifierExpression - not an Identifier",e);const n=this.getType(e),i=r.sanitizeName(e.name);return"Infinity"===e.name?t.push("3.402823466e+38"):"Boolean"===n&&this.argumentNames.indexOf(i)>-1?t.push(`bool(user_${i})`):t.push(`user_${i}`),t}astForStatement(e,t){if("ForStatement"!==e.type)throw this.astErrorOutput("Invalid for statement",e);const n=[],r=[],i=[],s=[];let a=null;if(e.init){const{declarations:t}=e.init;t.length>1&&(a=!1),this.astGeneric(e.init,n);for(let e=0;e0&&t.push(n.join(""),"\n"),t.push(`for (int ${e}=0;${e}0&&t.push(`if (!${r.join("")}) break;\n`),t.push(s.join("")),t.push(`\n${i.join("")};`),t.push("}\n")}return t}astWhileStatement(e,t){if("WhileStatement"!==e.type)throw this.astErrorOutput("Invalid while statement",e);const n=this.getInternalVariableName("safeI");return t.push(`for (int ${n}=0;${n}0&&o.push(u.join(",")),i.push(o.join(";")),t.push(i.join("")),t.push(";"),t}astIfStatement(e,t){return t.push("if ("),this.astGeneric(e.test,t),t.push(")"),"BlockStatement"===e.consequent.type?this.astGeneric(e.consequent,t):(t.push(" {\n"),this.astGeneric(e.consequent,t),t.push("\n}\n")),e.alternate&&(t.push("else "),"BlockStatement"===e.alternate.type||"IfStatement"===e.alternate.type?this.astGeneric(e.alternate,t):(t.push(" {\n"),this.astGeneric(e.alternate,t),t.push("\n}\n"))),t}astSwitchStatement(e,t){if("SwitchStatement"!==e.type)throw this.astErrorOutput("Invalid switch statement",e);const{discriminant:n,cases:r}=e,i=this.getType(n),s=`switchDiscriminant${this.astKey(e,"_")}`;switch(i){case"Float":case"Number":t.push(`float ${s} = `),this.astGeneric(n,t),t.push(";\n");break;case"Integer":t.push(`int ${s} = `),this.astGeneric(n,t),t.push(";\n")}if(1===r.length&&!r[0].test)return this.astGeneric(r[0].consequent,t),t;let a=!1,o=[],u=!1,l=!1;for(let e=0;ee+1){u=!0,this.astGeneric(r[e].consequent,o);continue}t.push(" else {\n")}this.astGeneric(r[e].consequent,t),t.push("\n}")}return u&&(t.push(" else {"),t.push(o.join("")),t.push("}")),t}astThisExpression(e,t){return t.push("this"),t}astMemberExpression(e,t){const{property:n,name:i,signature:s,origin:a,type:o,xProperty:u,yProperty:l,zProperty:c}=this.getMemberExpressionDetails(e);switch(s){case"value.thread.value":case"this.thread.value":if("x"!==i&&"y"!==i&&"z"!==i)throw this.astErrorOutput("Unexpected expression, expected `this.thread.x`, `this.thread.y`, or `this.thread.z`",e);return t.push(`threadId.${i}`),t;case"this.output.value":if(this.dynamicOutput)switch(i){case"x":this.isState("casting-to-float")?t.push("float(uOutputDim.x)"):t.push("uOutputDim.x");break;case"y":this.isState("casting-to-float")?t.push("float(uOutputDim.y)"):t.push("uOutputDim.y");break;case"z":this.isState("casting-to-float")?t.push("float(uOutputDim.z)"):t.push("uOutputDim.z");break;default:throw this.astErrorOutput("Unexpected expression",e)}else switch(i){case"x":this.isState("casting-to-integer")?t.push(this.output[0]):t.push(this.output[0],".0");break;case"y":this.isState("casting-to-integer")?t.push(this.output[1]):t.push(this.output[1],".0");break;case"z":this.isState("casting-to-integer")?t.push(this.output[2]):t.push(this.output[2],".0");break;default:throw this.astErrorOutput("Unexpected expression",e)}return t;case"value":throw this.astErrorOutput("Unexpected expression",e);case"value[]":case"value[][]":case"value[][][]":case"value[][][][]":case"value.value":if("Math"===a)return t.push(Math[i]),t;const s=r.sanitizeName(i);switch(n){case"r":return t.push(`user_${s}.r`),t;case"g":return t.push(`user_${s}.g`),t;case"b":return t.push(`user_${s}.b`),t;case"a":return t.push(`user_${s}.a`),t}break;case"this.constants.value":if(void 0===u)switch(o){case"Array(2)":case"Array(3)":case"Array(4)":return t.push(`constants_${r.sanitizeName(i)}`),t}case"this.constants.value[]":case"this.constants.value[][]":case"this.constants.value[][][]":case"this.constants.value[][][][]":break;case"fn()[]":return this.astCallExpression(e.object,t),t.push("["),t.push(this.memberExpressionPropertyMarkup(n)),t.push("]"),t;case"fn()[][]":return this.astCallExpression(e.object.object,t),t.push("["),t.push(this.memberExpressionPropertyMarkup(e.object.property)),t.push("]"),t.push("["),t.push(this.memberExpressionPropertyMarkup(e.property)),t.push("]"),t;case"[][]":return this.astArrayExpression(e.object,t),t.push("["),t.push(this.memberExpressionPropertyMarkup(n)),t.push("]"),t;default:throw this.astErrorOutput("Unexpected expression",e)}if(!1===e.computed)switch(o){case"Number":case"Integer":case"Float":case"Boolean":return t.push(`${a}_${r.sanitizeName(i)}`),t}const h=`${a}_${r.sanitizeName(i)}`;switch(o){case"Array(2)":case"Array(3)":case"Array(4)":this.astGeneric(e.object,t),t.push("["),t.push(this.memberExpressionPropertyMarkup(u)),t.push("]");break;case"HTMLImageArray":t.push(`getImage3D(${h}, ${h}Size, ${h}Dim, `),this.memberExpressionXYZ(u,l,c,t),t.push(")");break;case"ArrayTexture(1)":t.push(`getFloatFromSampler2D(${h}, ${h}Size, ${h}Dim, `),this.memberExpressionXYZ(u,l,c,t),t.push(")");break;case"Array1D(2)":case"Array2D(2)":case"Array3D(2)":t.push(`getMemoryOptimizedVec2(${h}, ${h}Size, ${h}Dim, `),this.memberExpressionXYZ(u,l,c,t),t.push(")");break;case"ArrayTexture(2)":t.push(`getVec2FromSampler2D(${h}, ${h}Size, ${h}Dim, `),this.memberExpressionXYZ(u,l,c,t),t.push(")");break;case"Array1D(3)":case"Array2D(3)":case"Array3D(3)":t.push(`getMemoryOptimizedVec3(${h}, ${h}Size, ${h}Dim, `),this.memberExpressionXYZ(u,l,c,t),t.push(")");break;case"ArrayTexture(3)":t.push(`getVec3FromSampler2D(${h}, ${h}Size, ${h}Dim, `),this.memberExpressionXYZ(u,l,c,t),t.push(")");break;case"Array1D(4)":case"Array2D(4)":case"Array3D(4)":t.push(`getMemoryOptimizedVec4(${h}, ${h}Size, ${h}Dim, `),this.memberExpressionXYZ(u,l,c,t),t.push(")");break;case"ArrayTexture(4)":case"HTMLCanvas":case"OffscreenCanvas":case"HTMLImage":case"ImageBitmap":case"ImageData":case"HTMLVideo":t.push(`getVec4FromSampler2D(${h}, ${h}Size, ${h}Dim, `),this.memberExpressionXYZ(u,l,c,t),t.push(")");break;case"NumberTexture":case"Array":case"Array2D":case"Array3D":case"Array4D":case"Input":case"Number":case"Float":case"Integer":if("single"===this.precision)t.push(`getMemoryOptimized32(${h}, ${h}Size, ${h}Dim, `),this.memberExpressionXYZ(u,l,c,t),t.push(")");else{const e="user"===a?this.lookupFunctionArgumentBitRatio(this.name,i):this.constantBitRatios[i];switch(e){case 1:t.push(`get8(${h}, ${h}Size, ${h}Dim, `);break;case 2:t.push(`get16(${h}, ${h}Size, ${h}Dim, `);break;case 4:case 0:t.push(`get32(${h}, ${h}Size, ${h}Dim, `);break;default:throw new Error(`unhandled bit ratio of ${e}`)}this.memberExpressionXYZ(u,l,c,t),t.push(")")}break;case"MemoryOptimizedNumberTexture":t.push(`getMemoryOptimized32(${h}, ${h}Size, ${h}Dim, `),this.memberExpressionXYZ(u,l,c,t),t.push(")");break;case"Matrix(2)":case"Matrix(3)":case"Matrix(4)":t.push(`${h}[${this.memberExpressionPropertyMarkup(l)}]`),l&&t.push(`[${this.memberExpressionPropertyMarkup(u)}]`);break;default:throw new Error(`unhandled member expression "${o}"`)}return t}astCallExpression(e,t){if(!e.callee)throw this.astErrorOutput("Unknown CallExpression",e);let n=null;const i=this.isAstMathFunction(e);if(n=i||e.callee.object&&"ThisExpression"===e.callee.object.type?e.callee.property.name:"SequenceExpression"!==e.callee.type||"Literal"!==e.callee.expressions[0].type||isNaN(e.callee.expressions[0].raw)?e.callee.name:e.callee.expressions[1].property.name,!n)throw this.astErrorOutput("Unhandled function, couldn't find name",e);switch(n){case"pow":n="_pow";break;case"round":n="_round"}if(this.calledFunctions.indexOf(n)<0&&this.calledFunctions.push(n),"random"===n&&this.plugins&&this.plugins.length>0)for(let e=0;e0&&t.push(", "),"Integer"===i)this.castValueToFloat(r,t);else this.astGeneric(r,t)}else{const i=this.lookupFunctionArgumentTypes(n)||[];for(let s=0;s0&&t.push(", ");const u=this.getType(a);switch(o||(this.triggerImplyArgumentType(n,s,u,this),o=u),u){case"Boolean":this.astGeneric(a,t);continue;case"Number":case"Float":if("Integer"===o){t.push("int("),this.astGeneric(a,t),t.push(")");continue}if("Number"===o||"Float"===o){this.astGeneric(a,t);continue}if("LiteralInteger"===o){this.castLiteralToFloat(a,t);continue}break;case"Integer":if("Number"===o||"Float"===o){t.push("float("),this.astGeneric(a,t),t.push(")");continue}if("Integer"===o){this.astGeneric(a,t);continue}break;case"LiteralInteger":if("Integer"===o){this.castLiteralToInteger(a,t);continue}if("Number"===o||"Float"===o){this.castLiteralToFloat(a,t);continue}if("LiteralInteger"===o){this.astGeneric(a,t);continue}break;case"Array(2)":case"Array(3)":case"Array(4)":if(o===u){if("Identifier"===a.type)t.push(`user_${r.sanitizeName(a.name)}`);else{if("ArrayExpression"!==a.type&&"MemberExpression"!==a.type&&"CallExpression"!==a.type)throw this.astErrorOutput(`Unhandled argument type ${a.type}`,e);this.astGeneric(a,t)}continue}break;case"HTMLCanvas":case"OffscreenCanvas":case"HTMLImage":case"ImageBitmap":case"ImageData":case"HTMLImageArray":case"HTMLVideo":case"ArrayTexture(1)":case"ArrayTexture(2)":case"ArrayTexture(3)":case"ArrayTexture(4)":case"Array":case"Input":if(o===u){if("Identifier"!==a.type)throw this.astErrorOutput(`Unhandled argument type ${a.type}`,e);this.triggerImplyArgumentBitRatio(this.name,a.name,n,s);const i=r.sanitizeName(a.name);t.push(`user_${i},user_${i}Size,user_${i}Dim`);continue}}throw this.astErrorOutput(`Unhandled argument combination of ${u} and ${o} for argument named "${a.name}"`,e)}}return t.push(")"),t}astArrayExpression(e,t){const n=this.getType(e),r=e.elements.length;switch(n){case"Matrix(2)":case"Matrix(3)":case"Matrix(4)":t.push(`mat${r}(`);break;default:t.push(`vec${r}(`)}for(let n=0;n0&&t.push(", ");const r=e.elements[n];this.astGeneric(r,t)}return t.push(")"),t}memberExpressionXYZ(e,t,n,r){return n?r.push(this.memberExpressionPropertyMarkup(n),", "):r.push("0, "),t?r.push(this.memberExpressionPropertyMarkup(t),", "):r.push("0, "),r.push(this.memberExpressionPropertyMarkup(e)),r}memberExpressionPropertyMarkup(e){if(!e)throw new Error("Property not set");const t=[];switch(this.getType(e)){case"Number":case"Float":this.castValueToInteger(e,t);break;case"LiteralInteger":this.castLiteralToInteger(e,t);break;default:this.astGeneric(e,t)}return t.join("")}}}},{"../../utils":113,"../function-node":9}],38:[function(e,t,n){const{WebGLKernelValueBoolean:r}=e("./kernel-value/boolean"),{WebGLKernelValueFloat:i}=e("./kernel-value/float"),{WebGLKernelValueInteger:s}=e("./kernel-value/integer"),{WebGLKernelValueHTMLImage:a}=e("./kernel-value/html-image"),{WebGLKernelValueDynamicHTMLImage:o}=e("./kernel-value/dynamic-html-image"),{WebGLKernelValueHTMLVideo:u}=e("./kernel-value/html-video"),{WebGLKernelValueDynamicHTMLVideo:l}=e("./kernel-value/dynamic-html-video"),{WebGLKernelValueSingleInput:c}=e("./kernel-value/single-input"),{WebGLKernelValueDynamicSingleInput:h}=e("./kernel-value/dynamic-single-input"),{WebGLKernelValueUnsignedInput:p}=e("./kernel-value/unsigned-input"),{WebGLKernelValueDynamicUnsignedInput:d}=e("./kernel-value/dynamic-unsigned-input"),{WebGLKernelValueMemoryOptimizedNumberTexture:m}=e("./kernel-value/memory-optimized-number-texture"),{WebGLKernelValueDynamicMemoryOptimizedNumberTexture:g}=e("./kernel-value/dynamic-memory-optimized-number-texture"),{WebGLKernelValueNumberTexture:f}=e("./kernel-value/number-texture"),{WebGLKernelValueDynamicNumberTexture:x}=e("./kernel-value/dynamic-number-texture"),{WebGLKernelValueSingleArray:y}=e("./kernel-value/single-array"),{WebGLKernelValueDynamicSingleArray:T}=e("./kernel-value/dynamic-single-array"),{WebGLKernelValueSingleArray1DI:b}=e("./kernel-value/single-array1d-i"),{WebGLKernelValueDynamicSingleArray1DI:A}=e("./kernel-value/dynamic-single-array1d-i"),{WebGLKernelValueSingleArray2DI:S}=e("./kernel-value/single-array2d-i"),{WebGLKernelValueDynamicSingleArray2DI:v}=e("./kernel-value/dynamic-single-array2d-i"),{WebGLKernelValueSingleArray3DI:_}=e("./kernel-value/single-array3d-i"),{WebGLKernelValueDynamicSingleArray3DI:E}=e("./kernel-value/dynamic-single-array3d-i"),{WebGLKernelValueArray2:w}=e("./kernel-value/array2"),{WebGLKernelValueArray3:D}=e("./kernel-value/array3"),{WebGLKernelValueArray4:$}=e("./kernel-value/array4"),{WebGLKernelValueUnsignedArray:I}=e("./kernel-value/unsigned-array"),{WebGLKernelValueDynamicUnsignedArray:F}=e("./kernel-value/dynamic-unsigned-array"),k={unsigned:{dynamic:{Boolean:r,Integer:s,Float:i,Array:F,"Array(2)":w,"Array(3)":D,"Array(4)":$,"Array1D(2)":!1,"Array1D(3)":!1,"Array1D(4)":!1,"Array2D(2)":!1,"Array2D(3)":!1,"Array2D(4)":!1,"Array3D(2)":!1,"Array3D(3)":!1,"Array3D(4)":!1,Input:d,NumberTexture:x,"ArrayTexture(1)":x,"ArrayTexture(2)":x,"ArrayTexture(3)":x,"ArrayTexture(4)":x,MemoryOptimizedNumberTexture:g,HTMLCanvas:o,OffscreenCanvas:o,HTMLImage:o,ImageBitmap:o,ImageData:o,HTMLImageArray:!1,HTMLVideo:l},static:{Boolean:r,Float:i,Integer:s,Array:I,"Array(2)":w,"Array(3)":D,"Array(4)":$,"Array1D(2)":!1,"Array1D(3)":!1,"Array1D(4)":!1,"Array2D(2)":!1,"Array2D(3)":!1,"Array2D(4)":!1,"Array3D(2)":!1,"Array3D(3)":!1,"Array3D(4)":!1,Input:p,NumberTexture:f,"ArrayTexture(1)":f,"ArrayTexture(2)":f,"ArrayTexture(3)":f,"ArrayTexture(4)":f,MemoryOptimizedNumberTexture:m,HTMLCanvas:a,OffscreenCanvas:a,HTMLImage:a,ImageBitmap:a,ImageData:a,HTMLImageArray:!1,HTMLVideo:u}},single:{dynamic:{Boolean:r,Integer:s,Float:i,Array:T,"Array(2)":w,"Array(3)":D,"Array(4)":$,"Array1D(2)":A,"Array1D(3)":A,"Array1D(4)":A,"Array2D(2)":v,"Array2D(3)":v,"Array2D(4)":v,"Array3D(2)":E,"Array3D(3)":E,"Array3D(4)":E,Input:h,NumberTexture:x,"ArrayTexture(1)":x,"ArrayTexture(2)":x,"ArrayTexture(3)":x,"ArrayTexture(4)":x,MemoryOptimizedNumberTexture:g,HTMLCanvas:o,OffscreenCanvas:o,HTMLImage:o,ImageBitmap:o,ImageData:o,HTMLImageArray:!1,HTMLVideo:l},static:{Boolean:r,Float:i,Integer:s,Array:y,"Array(2)":w,"Array(3)":D,"Array(4)":$,"Array1D(2)":b,"Array1D(3)":b,"Array1D(4)":b,"Array2D(2)":S,"Array2D(3)":S,"Array2D(4)":S,"Array3D(2)":_,"Array3D(3)":_,"Array3D(4)":_,Input:c,NumberTexture:f,"ArrayTexture(1)":f,"ArrayTexture(2)":f,"ArrayTexture(3)":f,"ArrayTexture(4)":f,MemoryOptimizedNumberTexture:m,HTMLCanvas:a,OffscreenCanvas:a,HTMLImage:a,ImageBitmap:a,ImageData:a,HTMLImageArray:!1,HTMLVideo:u}}};t.exports={lookupKernelValueType:function(e,t,n,r){if(!e)throw new Error("type missing");if(!t)throw new Error("dynamic missing");if(!n)throw new Error("precision missing");r.type&&(e=r.type);const i=k[n][t];if(!1===i[e])return null;if(void 0===i[e])throw new Error(`Could not find a KernelValue for ${e}`);return i[e]},kernelValueMaps:k}},{"./kernel-value/array2":40,"./kernel-value/array3":41,"./kernel-value/array4":42,"./kernel-value/boolean":43,"./kernel-value/dynamic-html-image":44,"./kernel-value/dynamic-html-video":45,"./kernel-value/dynamic-memory-optimized-number-texture":46,"./kernel-value/dynamic-number-texture":47,"./kernel-value/dynamic-single-array":48,"./kernel-value/dynamic-single-array1d-i":49,"./kernel-value/dynamic-single-array2d-i":50,"./kernel-value/dynamic-single-array3d-i":51,"./kernel-value/dynamic-single-input":52,"./kernel-value/dynamic-unsigned-array":53,"./kernel-value/dynamic-unsigned-input":54,"./kernel-value/float":55,"./kernel-value/html-image":56,"./kernel-value/html-video":57,"./kernel-value/integer":59,"./kernel-value/memory-optimized-number-texture":60,"./kernel-value/number-texture":61,"./kernel-value/single-array":62,"./kernel-value/single-array1d-i":63,"./kernel-value/single-array2d-i":64,"./kernel-value/single-array3d-i":65,"./kernel-value/single-input":66,"./kernel-value/unsigned-array":67,"./kernel-value/unsigned-input":68}],39:[function(e,t,n){const{WebGLKernelValue:r}=e("./index"),{Input:i}=e("../../../input");t.exports={WebGLKernelArray:class extends r{checkSize(e,t){if(!this.kernel.validate)return;const{maxTextureSize:n}=this.kernel.constructor.features;if(e>n||t>n)throw e>t?new Error(`Argument texture width of ${e} larger than maximum size of ${n} for your GPU`):ee===r.name))&&t.push(r)}return t}initExtensions(){this.extensions={OES_texture_float:this.context.getExtension("OES_texture_float"),OES_texture_float_linear:this.context.getExtension("OES_texture_float_linear"),OES_element_index_uint:this.context.getExtension("OES_element_index_uint"),WEBGL_draw_buffers:this.context.getExtension("WEBGL_draw_buffers"),WEBGL_color_buffer_float:this.context.getExtension("WEBGL_color_buffer_float")}}validateSettings(e){if(!this.validate)return void(this.texSize=a.getKernelTextureSize({optimizeFloatMemory:this.optimizeFloatMemory,precision:this.precision},this.output));const{features:t}=this.constructor;if(!0===this.optimizeFloatMemory&&!t.isTextureFloat)throw new Error("Float textures are not supported");if("single"===this.precision&&!t.isFloatRead)throw new Error("Single precision not supported");if(!this.graphical&&null===this.precision&&t.isTextureFloat&&(this.precision=t.isFloatRead?"single":"unsigned"),this.subKernels&&this.subKernels.length>0&&!this.extensions.WEBGL_draw_buffers)throw new Error("could not instantiate draw buffers extension");if(null===this.fixIntegerDivisionAccuracy?this.fixIntegerDivisionAccuracy=!t.isIntegerDivisionAccurate:this.fixIntegerDivisionAccuracy&&t.isIntegerDivisionAccurate&&(this.fixIntegerDivisionAccuracy=!1),this.checkOutput(),!this.output||0===this.output.length){if(1!==e.length)throw new Error("Auto output only supported for kernels with only one input");const t=a.getVariableType(e[0],this.strictIntegers);switch(t){case"Array":this.output=a.getDimensions(t);break;case"NumberTexture":case"MemoryOptimizedNumberTexture":case"ArrayTexture(1)":case"ArrayTexture(2)":case"ArrayTexture(3)":case"ArrayTexture(4)":this.output=e[0].output;break;default:throw new Error("Auto output not supported for input type: "+t)}}if(this.graphical){if(2!==this.output.length)throw new Error("Output must have 2 dimensions on graphical mode");return"precision"===this.precision&&(this.precision="unsigned",console.warn("Cannot use graphical mode and single precision at the same time")),void(this.texSize=a.clone(this.output))}null===this.precision&&t.isTextureFloat&&(this.precision="single"),this.texSize=a.getKernelTextureSize({optimizeFloatMemory:this.optimizeFloatMemory,precision:this.precision},this.output),this.checkTextureSize()}updateMaxTexSize(){const{texSize:e,canvas:t}=this;if(null===this.maxTexSize){let n=y.indexOf(t);-1===n&&(n=y.length,y.push(t),T[n]=[e[0],e[1]]),this.maxTexSize=T[n]}this.maxTexSize[0]this.argumentNames.length)throw new Error("too many arguments for kernel");const{context:n}=this;let r=0;const i=()=>this.createTexture(),s=()=>this.constantTextureCount+r++,o=e=>{this.switchKernels({type:"argumentMismatch",needed:e})},u=()=>n.TEXTURE0+this.constantTextureCount+this.argumentTextureCount++;for(let r=0;rthis.createTexture(),onRequestIndex:()=>r++,onRequestContextHandle:()=>t.TEXTURE0+this.constantTextureCount++});this.constantBitRatios[i]=l.bitRatio,this.kernelConstants.push(l),l.setup(),l.forceUploadEachRun&&this.forceUploadKernelConstants.push(l)}}build(){if(this.built)return;if(this.initExtensions(),this.validateSettings(arguments),this.setupConstants(arguments),this.fallbackRequested)return;if(this.setupArguments(arguments),this.fallbackRequested)return;this.updateMaxTexSize(),this.translateSource();const e=this.pickRenderStrategy(arguments);if(e)return e;const{texSize:t,context:n,canvas:r}=this;n.enable(n.SCISSOR_TEST),this.pipeline&&this.precision,n.viewport(0,0,this.maxTexSize[0],this.maxTexSize[1]),r.width=this.maxTexSize[0],r.height=this.maxTexSize[1];const i=this.threadDim=Array.from(this.output);for(;i.length<3;)i.push(1);const s=this.getVertexShader(arguments),a=n.createShader(n.VERTEX_SHADER);n.shaderSource(a,s),n.compileShader(a),this.vertShader=a;const o=this.getFragmentShader(arguments),u=n.createShader(n.FRAGMENT_SHADER);if(n.shaderSource(u,o),n.compileShader(u),this.fragShader=u,this.debug&&(console.log("GLSL Shader Output:"),console.log(o)),!n.getShaderParameter(a,n.COMPILE_STATUS))throw new Error("Error compiling vertex shader: "+n.getShaderInfoLog(a));if(!n.getShaderParameter(u,n.COMPILE_STATUS))throw new Error("Error compiling fragment shader: "+n.getShaderInfoLog(u));const l=this.program=n.createProgram();n.attachShader(l,a),n.attachShader(l,u),n.linkProgram(l),this.framebuffer=n.createFramebuffer(),this.framebuffer.width=t[0],this.framebuffer.height=t[1],this.rawValueFramebuffers={};const c=new Float32Array([-1,-1,1,-1,-1,1,1,1]),h=new Float32Array([0,0,1,0,0,1,1,1]),p=c.byteLength;let d=this.buffer;d?n.bindBuffer(n.ARRAY_BUFFER,d):(d=this.buffer=n.createBuffer(),n.bindBuffer(n.ARRAY_BUFFER,d),n.bufferData(n.ARRAY_BUFFER,c.byteLength+h.byteLength,n.STATIC_DRAW)),n.bufferSubData(n.ARRAY_BUFFER,0,c),n.bufferSubData(n.ARRAY_BUFFER,p,h);const m=n.getAttribLocation(this.program,"aPos");n.enableVertexAttribArray(m),n.vertexAttribPointer(m,2,n.FLOAT,!1,0,0);const g=n.getAttribLocation(this.program,"aTexCoord");n.enableVertexAttribArray(g),n.vertexAttribPointer(g,2,n.FLOAT,!1,0,p),n.bindFramebuffer(n.FRAMEBUFFER,this.framebuffer);let f=0;n.useProgram(this.program);for(let e in this.constants)this.kernelConstants[f++].updateValue(this.constants[e]);this._setupOutputTexture(),null!==this.subKernels&&this.subKernels.length>0&&(this._mappedTextureSwitched={},this._setupSubOutputTextures()),this.buildSignature(arguments),this.built=!0}translateSource(){const e=i.fromKernel(this,s,{fixIntegerDivisionAccuracy:this.fixIntegerDivisionAccuracy});this.translatedSource=e.getPrototypeString("kernel"),this.setupReturnTypes(e)}setupReturnTypes(e){if(this.graphical||this.returnType||(this.returnType=e.getKernelResultType()),this.subKernels&&this.subKernels.length>0)for(let t=0;te.source&&this.source.match(e.functionMatch)?e.source:"")).join("\n"):"\n"}_getConstantsString(){const e=[],{threadDim:t,texSize:n}=this;return this.dynamicOutput?e.push("uniform ivec3 uOutputDim","uniform ivec2 uTexSize"):e.push(`ivec3 uOutputDim = ivec3(${t[0]}, ${t[1]}, ${t[2]})`,`ivec2 uTexSize = ivec2(${n[0]}, ${n[1]})`),a.linesToString(e)}_getTextureCoordinate(){const e=this.subKernels;return null===e||e.length<1?"varying vec2 vTexCoord;\n":"out vec2 vTexCoord;\n"}_getDecode32EndiannessString(){return"LE"===this.endianness?"":" texel.rgba = texel.abgr;\n"}_getEncode32EndiannessString(){return"LE"===this.endianness?"":" texel.rgba = texel.abgr;\n"}_getDivideWithIntegerCheckString(){return this.fixIntegerDivisionAccuracy?"float divWithIntCheck(float x, float y) {\n if (floor(x) == x && floor(y) == y && integerMod(x, y) == 0.0) {\n return float(int(x) / int(y));\n }\n return x / y;\n}\n\nfloat integerCorrectionModulo(float number, float divisor) {\n if (number < 0.0) {\n number = abs(number);\n if (divisor < 0.0) {\n divisor = abs(divisor);\n }\n return -(number - (divisor * floor(divWithIntCheck(number, divisor))));\n }\n if (divisor < 0.0) {\n divisor = abs(divisor);\n }\n return number - (divisor * floor(divWithIntCheck(number, divisor)));\n}":""}_getMainArgumentsString(e){const t=[],{argumentNames:n}=this;for(let r=0;r{if(t.hasOwnProperty(n))return t[n];throw`unhandled artifact ${n}`}))}getFragmentShader(e){return null!==this.compiledFragmentShader?this.compiledFragmentShader:this.compiledFragmentShader=this.replaceArtifacts(this.constructor.fragmentShader,this._getFragShaderArtifactMap(e))}getVertexShader(e){return null!==this.compiledVertexShader?this.compiledVertexShader:this.compiledVertexShader=this.replaceArtifacts(this.constructor.vertexShader,this._getVertShaderArtifactMap(e))}toString(){const e=a.linesToString(["const gl = context"]);return c(this.constructor,arguments,this,e)}destroy(e){if(!this.context)return;this.buffer&&this.context.deleteBuffer(this.buffer),this.framebuffer&&this.context.deleteFramebuffer(this.framebuffer);for(const e in this.rawValueFramebuffers){for(const t in this.rawValueFramebuffers[e])this.context.deleteFramebuffer(this.rawValueFramebuffers[e][t]),delete this.rawValueFramebuffers[e][t];delete this.rawValueFramebuffers[e]}if(this.vertShader&&this.context.deleteShader(this.vertShader),this.fragShader&&this.context.deleteShader(this.fragShader),this.program&&this.context.deleteProgram(this.program),this.texture){this.texture.delete();const e=this.textureCache.indexOf(this.texture.texture);e>-1&&this.textureCache.splice(e,1),this.texture=null}if(this.mappedTextures&&this.mappedTextures.length){for(let e=0;e-1&&this.textureCache.splice(n,1)}this.mappedTextures=null}if(this.kernelArguments)for(let e=0;e0;){const e=this.textureCache.pop();this.context.deleteTexture(e)}if(e){const e=y.indexOf(this.canvas);e>=0&&(y[e]=null,T[e]=null)}if(this.destroyExtensions(),delete this.context,delete this.canvas,!this.gpu)return;const t=this.gpu.kernels.indexOf(this);-1!==t&&this.gpu.kernels.splice(t,1)}destroyExtensions(){this.extensions.OES_texture_float=null,this.extensions.OES_texture_float_linear=null,this.extensions.OES_element_index_uint=null,this.extensions.WEBGL_draw_buffers=null}static destroyContext(e){const t=e.getExtension("WEBGL_lose_context");t&&t.loseContext()}toJSON(){const e=super.toJSON();return e.functionNodes=i.fromKernel(this,s).toJSON(),e.settings.threadDim=this.threadDim,e}}}},{"../../plugins/math-random-uniformly-distributed":111,"../../utils":113,"../function-builder":8,"../gl/kernel":12,"../gl/kernel-string":11,"./fragment-shader":36,"./function-node":37,"./kernel-value-maps":38,"./vertex-shader":70}],70:[function(e,t,n){t.exports={vertexShader:"__FLOAT_TACTIC_DECLARATION__;\n__INT_TACTIC_DECLARATION__;\n__SAMPLER_2D_TACTIC_DECLARATION__;\n\nattribute vec2 aPos;\nattribute vec2 aTexCoord;\n\nvarying vec2 vTexCoord;\nuniform vec2 ratio;\n\nvoid main(void) {\n gl_Position = vec4((aPos + vec2(1)) * ratio + vec2(-1), 0, 1);\n vTexCoord = aTexCoord;\n}"}},{}],71:[function(e,t,n){const r=`#version 300 es\n__HEADER__;\n__FLOAT_TACTIC_DECLARATION__;\n__INT_TACTIC_DECLARATION__;\n__SAMPLER_2D_TACTIC_DECLARATION__;\n__SAMPLER_2D_ARRAY_TACTIC_DECLARATION__;\n\nconst int LOOP_MAX = __LOOP_MAX__;\n\n__PLUGINS__;\n__CONSTANTS__;\n\nin vec2 vTexCoord;\n\nfloat atan2(float v1, float v2) {\n if (v1 == 0.0 || v2 == 0.0) return 0.0;\n return atan(v1 / v2);\n}\n\nfloat cbrt(float x) {\n if (x >= 0.0) {\n return pow(x, 1.0 / 3.0);\n } else {\n return -pow(x, 1.0 / 3.0);\n }\n}\n\nfloat expm1(float x) {\n return pow(${Math.E}, x) - 1.0; \n}\n\nfloat fround(highp float x) {\n return x;\n}\n\nfloat imul(float v1, float v2) {\n return float(int(v1) * int(v2));\n}\n\nfloat log10(float x) {\n return log2(x) * (1.0 / log2(10.0));\n}\n\nfloat log1p(float x) {\n return log(1.0 + x);\n}\n\nfloat _pow(float v1, float v2) {\n if (v2 == 0.0) return 1.0;\n return pow(v1, v2);\n}\n\nfloat _round(float x) {\n return floor(x + 0.5);\n}\n\n\nconst int BIT_COUNT = 32;\nint modi(int x, int y) {\n return x - y * (x / y);\n}\n\nint bitwiseOr(int a, int b) {\n int result = 0;\n int n = 1;\n \n for (int i = 0; i < BIT_COUNT; i++) {\n if ((modi(a, 2) == 1) || (modi(b, 2) == 1)) {\n result += n;\n }\n a = a / 2;\n b = b / 2;\n n = n * 2;\n if(!(a > 0 || b > 0)) {\n break;\n }\n }\n return result;\n}\nint bitwiseXOR(int a, int b) {\n int result = 0;\n int n = 1;\n \n for (int i = 0; i < BIT_COUNT; i++) {\n if ((modi(a, 2) == 1) != (modi(b, 2) == 1)) {\n result += n;\n }\n a = a / 2;\n b = b / 2;\n n = n * 2;\n if(!(a > 0 || b > 0)) {\n break;\n }\n }\n return result;\n}\nint bitwiseAnd(int a, int b) {\n int result = 0;\n int n = 1;\n for (int i = 0; i < BIT_COUNT; i++) {\n if ((modi(a, 2) == 1) && (modi(b, 2) == 1)) {\n result += n;\n }\n a = a / 2;\n b = b / 2;\n n = n * 2;\n if(!(a > 0 && b > 0)) {\n break;\n }\n }\n return result;\n}\nint bitwiseNot(int a) {\n int result = 0;\n int n = 1;\n \n for (int i = 0; i < BIT_COUNT; i++) {\n if (modi(a, 2) == 0) {\n result += n; \n }\n a = a / 2;\n n = n * 2;\n }\n return result;\n}\nint bitwiseZeroFillLeftShift(int n, int shift) {\n int maxBytes = BIT_COUNT;\n for (int i = 0; i < BIT_COUNT; i++) {\n if (maxBytes >= n) {\n break;\n }\n maxBytes *= 2;\n }\n for (int i = 0; i < BIT_COUNT; i++) {\n if (i >= shift) {\n break;\n }\n n *= 2;\n }\n\n int result = 0;\n int byteVal = 1;\n for (int i = 0; i < BIT_COUNT; i++) {\n if (i >= maxBytes) break;\n if (modi(n, 2) > 0) { result += byteVal; }\n n = int(n / 2);\n byteVal *= 2;\n }\n return result;\n}\n\nint bitwiseSignedRightShift(int num, int shifts) {\n return int(floor(float(num) / pow(2.0, float(shifts))));\n}\n\nint bitwiseZeroFillRightShift(int n, int shift) {\n int maxBytes = BIT_COUNT;\n for (int i = 0; i < BIT_COUNT; i++) {\n if (maxBytes >= n) {\n break;\n }\n maxBytes *= 2;\n }\n for (int i = 0; i < BIT_COUNT; i++) {\n if (i >= shift) {\n break;\n }\n n /= 2;\n }\n int result = 0;\n int byteVal = 1;\n for (int i = 0; i < BIT_COUNT; i++) {\n if (i >= maxBytes) break;\n if (modi(n, 2) > 0) { result += byteVal; }\n n = int(n / 2);\n byteVal *= 2;\n }\n return result;\n}\n\nvec2 integerMod(vec2 x, float y) {\n vec2 res = floor(mod(x, y));\n return res * step(1.0 - floor(y), -res);\n}\n\nvec3 integerMod(vec3 x, float y) {\n vec3 res = floor(mod(x, y));\n return res * step(1.0 - floor(y), -res);\n}\n\nvec4 integerMod(vec4 x, vec4 y) {\n vec4 res = floor(mod(x, y));\n return res * step(1.0 - floor(y), -res);\n}\n\nfloat integerMod(float x, float y) {\n float res = floor(mod(x, y));\n return res * (res > floor(y) - 1.0 ? 0.0 : 1.0);\n}\n\nint integerMod(int x, int y) {\n return x - (y * int(x/y));\n}\n\n__DIVIDE_WITH_INTEGER_CHECK__;\n\n// Here be dragons!\n// DO NOT OPTIMIZE THIS CODE\n// YOU WILL BREAK SOMETHING ON SOMEBODY'S MACHINE\n// LEAVE IT AS IT IS, LEST YOU WASTE YOUR OWN TIME\nconst vec2 MAGIC_VEC = vec2(1.0, -256.0);\nconst vec4 SCALE_FACTOR = vec4(1.0, 256.0, 65536.0, 0.0);\nconst vec4 SCALE_FACTOR_INV = vec4(1.0, 0.00390625, 0.0000152587890625, 0.0); // 1, 1/256, 1/65536\nfloat decode32(vec4 texel) {\n __DECODE32_ENDIANNESS__;\n texel *= 255.0;\n vec2 gte128;\n gte128.x = texel.b >= 128.0 ? 1.0 : 0.0;\n gte128.y = texel.a >= 128.0 ? 1.0 : 0.0;\n float exponent = 2.0 * texel.a - 127.0 + dot(gte128, MAGIC_VEC);\n float res = exp2(round(exponent));\n texel.b = texel.b - 128.0 * gte128.x;\n res = dot(texel, SCALE_FACTOR) * exp2(round(exponent-23.0)) + res;\n res *= gte128.y * -2.0 + 1.0;\n return res;\n}\n\nfloat decode16(vec4 texel, int index) {\n int channel = integerMod(index, 2);\n return texel[channel*2] * 255.0 + texel[channel*2 + 1] * 65280.0;\n}\n\nfloat decode8(vec4 texel, int index) {\n int channel = integerMod(index, 4);\n return texel[channel] * 255.0;\n}\n\nvec4 legacyEncode32(float f) {\n float F = abs(f);\n float sign = f < 0.0 ? 1.0 : 0.0;\n float exponent = floor(log2(F));\n float mantissa = (exp2(-exponent) * F);\n // exponent += floor(log2(mantissa));\n vec4 texel = vec4(F * exp2(23.0-exponent)) * SCALE_FACTOR_INV;\n texel.rg = integerMod(texel.rg, 256.0);\n texel.b = integerMod(texel.b, 128.0);\n texel.a = exponent*0.5 + 63.5;\n texel.ba += vec2(integerMod(exponent+127.0, 2.0), sign) * 128.0;\n texel = floor(texel);\n texel *= 0.003921569; // 1/255\n __ENCODE32_ENDIANNESS__;\n return texel;\n}\n\n// https://github.com/gpujs/gpu.js/wiki/Encoder-details\nvec4 encode32(float value) {\n if (value == 0.0) return vec4(0, 0, 0, 0);\n\n float exponent;\n float mantissa;\n vec4 result;\n float sgn;\n\n sgn = step(0.0, -value);\n value = abs(value);\n\n exponent = floor(log2(value));\n\n mantissa = value*pow(2.0, -exponent)-1.0;\n exponent = exponent+127.0;\n result = vec4(0,0,0,0);\n\n result.a = floor(exponent/2.0);\n exponent = exponent - result.a*2.0;\n result.a = result.a + 128.0*sgn;\n\n result.b = floor(mantissa * 128.0);\n mantissa = mantissa - result.b / 128.0;\n result.b = result.b + exponent*128.0;\n\n result.g = floor(mantissa*32768.0);\n mantissa = mantissa - result.g/32768.0;\n\n result.r = floor(mantissa*8388608.0);\n return result/255.0;\n}\n// Dragons end here\n\nint index;\nivec3 threadId;\n\nivec3 indexTo3D(int idx, ivec3 texDim) {\n int z = int(idx / (texDim.x * texDim.y));\n idx -= z * int(texDim.x * texDim.y);\n int y = int(idx / texDim.x);\n int x = int(integerMod(idx, texDim.x));\n return ivec3(x, y, z);\n}\n\nfloat get32(sampler2D tex, ivec2 texSize, ivec3 texDim, int z, int y, int x) {\n int index = x + texDim.x * (y + texDim.y * z);\n int w = texSize.x;\n vec2 st = vec2(float(integerMod(index, w)), float(index / w)) + 0.5;\n vec4 texel = texture(tex, st / vec2(texSize));\n return decode32(texel);\n}\n\nfloat get16(sampler2D tex, ivec2 texSize, ivec3 texDim, int z, int y, int x) {\n int index = x + (texDim.x * (y + (texDim.y * z)));\n int w = texSize.x * 2;\n vec2 st = vec2(float(integerMod(index, w)), float(index / w)) + 0.5;\n vec4 texel = texture(tex, st / vec2(texSize.x * 2, texSize.y));\n return decode16(texel, index);\n}\n\nfloat get8(sampler2D tex, ivec2 texSize, ivec3 texDim, int z, int y, int x) {\n int index = x + (texDim.x * (y + (texDim.y * z)));\n int w = texSize.x * 4;\n vec2 st = vec2(float(integerMod(index, w)), float(index / w)) + 0.5;\n vec4 texel = texture(tex, st / vec2(texSize.x * 4, texSize.y));\n return decode8(texel, index);\n}\n\nfloat getMemoryOptimized32(sampler2D tex, ivec2 texSize, ivec3 texDim, int z, int y, int x) {\n int index = x + (texDim.x * (y + (texDim.y * z)));\n int channel = integerMod(index, 4);\n index = index / 4;\n int w = texSize.x;\n vec2 st = vec2(float(integerMod(index, w)), float(index / w)) + 0.5;\n index = index / 4;\n vec4 texel = texture(tex, st / vec2(texSize));\n return texel[channel];\n}\n\nvec4 getImage2D(sampler2D tex, ivec2 texSize, ivec3 texDim, int z, int y, int x) {\n int index = x + texDim.x * (y + texDim.y * z);\n int w = texSize.x;\n vec2 st = vec2(float(integerMod(index, w)), float(index / w)) + 0.5;\n return texture(tex, st / vec2(texSize));\n}\n\nvec4 getImage3D(sampler2DArray tex, ivec2 texSize, ivec3 texDim, int z, int y, int x) {\n int index = x + texDim.x * (y + texDim.y * z);\n int w = texSize.x;\n vec2 st = vec2(float(integerMod(index, w)), float(index / w)) + 0.5;\n return texture(tex, vec3(st / vec2(texSize), z));\n}\n\nfloat getFloatFromSampler2D(sampler2D tex, ivec2 texSize, ivec3 texDim, int z, int y, int x) {\n vec4 result = getImage2D(tex, texSize, texDim, z, y, x);\n return result[0];\n}\n\nvec2 getVec2FromSampler2D(sampler2D tex, ivec2 texSize, ivec3 texDim, int z, int y, int x) {\n vec4 result = getImage2D(tex, texSize, texDim, z, y, x);\n return vec2(result[0], result[1]);\n}\n\nvec2 getMemoryOptimizedVec2(sampler2D tex, ivec2 texSize, ivec3 texDim, int z, int y, int x) {\n int index = x + texDim.x * (y + texDim.y * z);\n int channel = integerMod(index, 2);\n index = index / 2;\n int w = texSize.x;\n vec2 st = vec2(float(integerMod(index, w)), float(index / w)) + 0.5;\n vec4 texel = texture(tex, st / vec2(texSize));\n if (channel == 0) return vec2(texel.r, texel.g);\n if (channel == 1) return vec2(texel.b, texel.a);\n return vec2(0.0, 0.0);\n}\n\nvec3 getVec3FromSampler2D(sampler2D tex, ivec2 texSize, ivec3 texDim, int z, int y, int x) {\n vec4 result = getImage2D(tex, texSize, texDim, z, y, x);\n return vec3(result[0], result[1], result[2]);\n}\n\nvec3 getMemoryOptimizedVec3(sampler2D tex, ivec2 texSize, ivec3 texDim, int z, int y, int x) {\n int fieldIndex = 3 * (x + texDim.x * (y + texDim.y * z));\n int vectorIndex = fieldIndex / 4;\n int vectorOffset = fieldIndex - vectorIndex * 4;\n int readY = vectorIndex / texSize.x;\n int readX = vectorIndex - readY * texSize.x;\n vec4 tex1 = texture(tex, (vec2(readX, readY) + 0.5) / vec2(texSize));\n\n if (vectorOffset == 0) {\n return tex1.xyz;\n } else if (vectorOffset == 1) {\n return tex1.yzw;\n } else {\n readX++;\n if (readX >= texSize.x) {\n readX = 0;\n readY++;\n }\n vec4 tex2 = texture(tex, vec2(readX, readY) / vec2(texSize));\n if (vectorOffset == 2) {\n return vec3(tex1.z, tex1.w, tex2.x);\n } else {\n return vec3(tex1.w, tex2.x, tex2.y);\n }\n }\n}\n\nvec4 getVec4FromSampler2D(sampler2D tex, ivec2 texSize, ivec3 texDim, int z, int y, int x) {\n return getImage2D(tex, texSize, texDim, z, y, x);\n}\n\nvec4 getMemoryOptimizedVec4(sampler2D tex, ivec2 texSize, ivec3 texDim, int z, int y, int x) {\n int index = x + texDim.x * (y + texDim.y * z);\n int channel = integerMod(index, 2);\n int w = texSize.x;\n vec2 st = vec2(float(integerMod(index, w)), float(index / w)) + 0.5;\n vec4 texel = texture(tex, st / vec2(texSize));\n return vec4(texel.r, texel.g, texel.b, texel.a);\n}\n\nvec4 actualColor;\nvoid color(float r, float g, float b, float a) {\n actualColor = vec4(r,g,b,a);\n}\n\nvoid color(float r, float g, float b) {\n color(r,g,b,1.0);\n}\n\nfloat modulo(float number, float divisor) {\n if (number < 0.0) {\n number = abs(number);\n if (divisor < 0.0) {\n divisor = abs(divisor);\n }\n return -mod(number, divisor);\n }\n if (divisor < 0.0) {\n divisor = abs(divisor);\n }\n return mod(number, divisor);\n}\n\n__INJECTED_NATIVE__;\n__MAIN_CONSTANTS__;\n__MAIN_ARGUMENTS__;\n__KERNEL__;\n\nvoid main(void) {\n index = int(vTexCoord.s * float(uTexSize.x)) + int(vTexCoord.t * float(uTexSize.y)) * uTexSize.x;\n __MAIN_RESULT__;\n}`;t.exports={fragmentShader:r}},{}],72:[function(e,t,n){const{utils:r}=e("../../utils"),{WebGLFunctionNode:i}=e("../web-gl/function-node");t.exports={WebGL2FunctionNode:class extends i{astIdentifierExpression(e,t){if("Identifier"!==e.type)throw this.astErrorOutput("IdentifierExpression - not an Identifier",e);const n=this.getType(e),i=r.sanitizeName(e.name);return"Infinity"===e.name?t.push("intBitsToFloat(2139095039)"):"Boolean"===n&&this.argumentNames.indexOf(i)>-1?t.push(`bool(user_${i})`):t.push(`user_${i}`),t}}}},{"../../utils":113,"../web-gl/function-node":37}],73:[function(e,t,n){const{WebGL2KernelValueBoolean:r}=e("./kernel-value/boolean"),{WebGL2KernelValueFloat:i}=e("./kernel-value/float"),{WebGL2KernelValueInteger:s}=e("./kernel-value/integer"),{WebGL2KernelValueHTMLImage:a}=e("./kernel-value/html-image"),{WebGL2KernelValueDynamicHTMLImage:o}=e("./kernel-value/dynamic-html-image"),{WebGL2KernelValueHTMLImageArray:u}=e("./kernel-value/html-image-array"),{WebGL2KernelValueDynamicHTMLImageArray:l}=e("./kernel-value/dynamic-html-image-array"),{WebGL2KernelValueHTMLVideo:c}=e("./kernel-value/html-video"),{WebGL2KernelValueDynamicHTMLVideo:h}=e("./kernel-value/dynamic-html-video"),{WebGL2KernelValueSingleInput:p}=e("./kernel-value/single-input"),{WebGL2KernelValueDynamicSingleInput:d}=e("./kernel-value/dynamic-single-input"),{WebGL2KernelValueUnsignedInput:m}=e("./kernel-value/unsigned-input"),{WebGL2KernelValueDynamicUnsignedInput:g}=e("./kernel-value/dynamic-unsigned-input"),{WebGL2KernelValueMemoryOptimizedNumberTexture:f}=e("./kernel-value/memory-optimized-number-texture"),{WebGL2KernelValueDynamicMemoryOptimizedNumberTexture:x}=e("./kernel-value/dynamic-memory-optimized-number-texture"),{WebGL2KernelValueNumberTexture:y}=e("./kernel-value/number-texture"),{WebGL2KernelValueDynamicNumberTexture:T}=e("./kernel-value/dynamic-number-texture"),{WebGL2KernelValueSingleArray:b}=e("./kernel-value/single-array"),{WebGL2KernelValueDynamicSingleArray:A}=e("./kernel-value/dynamic-single-array"),{WebGL2KernelValueSingleArray1DI:S}=e("./kernel-value/single-array1d-i"),{WebGL2KernelValueDynamicSingleArray1DI:v}=e("./kernel-value/dynamic-single-array1d-i"),{WebGL2KernelValueSingleArray2DI:_}=e("./kernel-value/single-array2d-i"),{WebGL2KernelValueDynamicSingleArray2DI:E}=e("./kernel-value/dynamic-single-array2d-i"),{WebGL2KernelValueSingleArray3DI:w}=e("./kernel-value/single-array3d-i"),{WebGL2KernelValueDynamicSingleArray3DI:D}=e("./kernel-value/dynamic-single-array3d-i"),{WebGL2KernelValueArray2:$}=e("./kernel-value/array2"),{WebGL2KernelValueArray3:I}=e("./kernel-value/array3"),{WebGL2KernelValueArray4:F}=e("./kernel-value/array4"),{WebGL2KernelValueUnsignedArray:k}=e("./kernel-value/unsigned-array"),{WebGL2KernelValueDynamicUnsignedArray:R}=e("./kernel-value/dynamic-unsigned-array"),L={unsigned:{dynamic:{Boolean:r,Integer:s,Float:i,Array:R,"Array(2)":$,"Array(3)":I,"Array(4)":F,"Array1D(2)":!1,"Array1D(3)":!1,"Array1D(4)":!1,"Array2D(2)":!1,"Array2D(3)":!1,"Array2D(4)":!1,"Array3D(2)":!1,"Array3D(3)":!1,"Array3D(4)":!1,Input:g,NumberTexture:T,"ArrayTexture(1)":T,"ArrayTexture(2)":T,"ArrayTexture(3)":T,"ArrayTexture(4)":T,MemoryOptimizedNumberTexture:x,HTMLCanvas:o,OffscreenCanvas:o,HTMLImage:o,ImageBitmap:o,ImageData:o,HTMLImageArray:l,HTMLVideo:h},static:{Boolean:r,Float:i,Integer:s,Array:k,"Array(2)":$,"Array(3)":I,"Array(4)":F,"Array1D(2)":!1,"Array1D(3)":!1,"Array1D(4)":!1,"Array2D(2)":!1,"Array2D(3)":!1,"Array2D(4)":!1,"Array3D(2)":!1,"Array3D(3)":!1,"Array3D(4)":!1,Input:m,NumberTexture:y,"ArrayTexture(1)":y,"ArrayTexture(2)":y,"ArrayTexture(3)":y,"ArrayTexture(4)":y,MemoryOptimizedNumberTexture:x,HTMLCanvas:a,OffscreenCanvas:a,HTMLImage:a,ImageBitmap:a,ImageData:a,HTMLImageArray:u,HTMLVideo:c}},single:{dynamic:{Boolean:r,Integer:s,Float:i,Array:A,"Array(2)":$,"Array(3)":I,"Array(4)":F,"Array1D(2)":v,"Array1D(3)":v,"Array1D(4)":v,"Array2D(2)":E,"Array2D(3)":E,"Array2D(4)":E,"Array3D(2)":D,"Array3D(3)":D,"Array3D(4)":D,Input:d,NumberTexture:T,"ArrayTexture(1)":T,"ArrayTexture(2)":T,"ArrayTexture(3)":T,"ArrayTexture(4)":T,MemoryOptimizedNumberTexture:x,HTMLCanvas:o,OffscreenCanvas:o,HTMLImage:o,ImageBitmap:o,ImageData:o,HTMLImageArray:l,HTMLVideo:h},static:{Boolean:r,Float:i,Integer:s,Array:b,"Array(2)":$,"Array(3)":I,"Array(4)":F,"Array1D(2)":S,"Array1D(3)":S,"Array1D(4)":S,"Array2D(2)":_,"Array2D(3)":_,"Array2D(4)":_,"Array3D(2)":w,"Array3D(3)":w,"Array3D(4)":w,Input:p,NumberTexture:y,"ArrayTexture(1)":y,"ArrayTexture(2)":y,"ArrayTexture(3)":y,"ArrayTexture(4)":y,MemoryOptimizedNumberTexture:f,HTMLCanvas:a,OffscreenCanvas:a,HTMLImage:a,ImageBitmap:a,ImageData:a,HTMLImageArray:u,HTMLVideo:c}}};t.exports={kernelValueMaps:L,lookupKernelValueType:function(e,t,n,r){if(!e)throw new Error("type missing");if(!t)throw new Error("dynamic missing");if(!n)throw new Error("precision missing");r.type&&(e=r.type);const i=L[n][t];if(!1===i[e])return null;if(void 0===i[e])throw new Error(`Could not find a KernelValue for ${e}`);return i[e]}}},{"./kernel-value/array2":74,"./kernel-value/array3":75,"./kernel-value/array4":76,"./kernel-value/boolean":77,"./kernel-value/dynamic-html-image":79,"./kernel-value/dynamic-html-image-array":78,"./kernel-value/dynamic-html-video":80,"./kernel-value/dynamic-memory-optimized-number-texture":81,"./kernel-value/dynamic-number-texture":82,"./kernel-value/dynamic-single-array":83,"./kernel-value/dynamic-single-array1d-i":84,"./kernel-value/dynamic-single-array2d-i":85,"./kernel-value/dynamic-single-array3d-i":86,"./kernel-value/dynamic-single-input":87,"./kernel-value/dynamic-unsigned-array":88,"./kernel-value/dynamic-unsigned-input":89,"./kernel-value/float":90,"./kernel-value/html-image":92,"./kernel-value/html-image-array":91,"./kernel-value/html-video":93,"./kernel-value/integer":94,"./kernel-value/memory-optimized-number-texture":95,"./kernel-value/number-texture":96,"./kernel-value/single-array":97,"./kernel-value/single-array1d-i":98,"./kernel-value/single-array2d-i":99,"./kernel-value/single-array3d-i":100,"./kernel-value/single-input":101,"./kernel-value/unsigned-array":102,"./kernel-value/unsigned-input":103}],74:[function(e,t,n){const{WebGLKernelValueArray2:r}=e("../../web-gl/kernel-value/array2");t.exports={WebGL2KernelValueArray2:class extends r{}}},{"../../web-gl/kernel-value/array2":40}],75:[function(e,t,n){const{WebGLKernelValueArray3:r}=e("../../web-gl/kernel-value/array3");t.exports={WebGL2KernelValueArray3:class extends r{}}},{"../../web-gl/kernel-value/array3":41}],76:[function(e,t,n){const{WebGLKernelValueArray4:r}=e("../../web-gl/kernel-value/array4");t.exports={WebGL2KernelValueArray4:class extends r{}}},{"../../web-gl/kernel-value/array4":42}],77:[function(e,t,n){const{WebGLKernelValueBoolean:r}=e("../../web-gl/kernel-value/boolean");t.exports={WebGL2KernelValueBoolean:class extends r{}}},{"../../web-gl/kernel-value/boolean":43}],78:[function(e,t,n){const{utils:r}=e("../../../utils"),{WebGL2KernelValueHTMLImageArray:i}=e("./html-image-array");t.exports={WebGL2KernelValueDynamicHTMLImageArray:class extends i{getSource(){const e=this.getVariablePrecisionString();return r.linesToString([`uniform ${e} sampler2DArray ${this.id}`,`uniform ${e} ivec2 ${this.sizeId}`,`uniform ${e} ivec3 ${this.dimensionsId}`])}updateValue(e){const{width:t,height:n}=e[0];this.checkSize(t,n),this.dimensions=[t,n,e.length],this.textureSize=[t,n],this.kernel.setUniform3iv(this.dimensionsId,this.dimensions),this.kernel.setUniform2iv(this.sizeId,this.textureSize),super.updateValue(e)}}}},{"../../../utils":113,"./html-image-array":91}],79:[function(e,t,n){const{utils:r}=e("../../../utils"),{WebGLKernelValueDynamicHTMLImage:i}=e("../../web-gl/kernel-value/dynamic-html-image");t.exports={WebGL2KernelValueDynamicHTMLImage:class extends i{getSource(){const e=this.getVariablePrecisionString();return r.linesToString([`uniform ${e} sampler2D ${this.id}`,`uniform ${e} ivec2 ${this.sizeId}`,`uniform ${e} ivec3 ${this.dimensionsId}`])}}}},{"../../../utils":113,"../../web-gl/kernel-value/dynamic-html-image":44}],80:[function(e,t,n){const{utils:r}=e("../../../utils"),{WebGL2KernelValueDynamicHTMLImage:i}=e("./dynamic-html-image");t.exports={WebGL2KernelValueDynamicHTMLVideo:class extends i{}}},{"../../../utils":113,"./dynamic-html-image":79}],81:[function(e,t,n){const{utils:r}=e("../../../utils"),{WebGLKernelValueDynamicMemoryOptimizedNumberTexture:i}=e("../../web-gl/kernel-value/dynamic-memory-optimized-number-texture");t.exports={WebGL2KernelValueDynamicMemoryOptimizedNumberTexture:class extends i{getSource(){return r.linesToString([`uniform sampler2D ${this.id}`,`uniform ivec2 ${this.sizeId}`,`uniform ivec3 ${this.dimensionsId}`])}}}},{"../../../utils":113,"../../web-gl/kernel-value/dynamic-memory-optimized-number-texture":46}],82:[function(e,t,n){const{utils:r}=e("../../../utils"),{WebGLKernelValueDynamicNumberTexture:i}=e("../../web-gl/kernel-value/dynamic-number-texture");t.exports={WebGL2KernelValueDynamicNumberTexture:class extends i{getSource(){const e=this.getVariablePrecisionString();return r.linesToString([`uniform ${e} sampler2D ${this.id}`,`uniform ${e} ivec2 ${this.sizeId}`,`uniform ${e} ivec3 ${this.dimensionsId}`])}}}},{"../../../utils":113,"../../web-gl/kernel-value/dynamic-number-texture":47}],83:[function(e,t,n){const{utils:r}=e("../../../utils"),{WebGL2KernelValueSingleArray:i}=e("../../web-gl2/kernel-value/single-array");t.exports={WebGL2KernelValueDynamicSingleArray:class extends i{getSource(){const e=this.getVariablePrecisionString();return r.linesToString([`uniform ${e} sampler2D ${this.id}`,`uniform ${e} ivec2 ${this.sizeId}`,`uniform ${e} ivec3 ${this.dimensionsId}`])}updateValue(e){this.dimensions=r.getDimensions(e,!0),this.textureSize=r.getMemoryOptimizedFloatTextureSize(this.dimensions,this.bitRatio),this.uploadArrayLength=this.textureSize[0]*this.textureSize[1]*this.bitRatio,this.checkSize(this.textureSize[0],this.textureSize[1]),this.uploadValue=new Float32Array(this.uploadArrayLength),this.kernel.setUniform3iv(this.dimensionsId,this.dimensions),this.kernel.setUniform2iv(this.sizeId,this.textureSize),super.updateValue(e)}}}},{"../../../utils":113,"../../web-gl2/kernel-value/single-array":97}],84:[function(e,t,n){const{utils:r}=e("../../../utils"),{WebGL2KernelValueSingleArray1DI:i}=e("../../web-gl2/kernel-value/single-array1d-i");t.exports={WebGL2KernelValueDynamicSingleArray1DI:class extends i{getSource(){const e=this.getVariablePrecisionString();return r.linesToString([`uniform ${e} sampler2D ${this.id}`,`uniform ${e} ivec2 ${this.sizeId}`,`uniform ${e} ivec3 ${this.dimensionsId}`])}updateValue(e){this.setShape(e),this.kernel.setUniform3iv(this.dimensionsId,this.dimensions),this.kernel.setUniform2iv(this.sizeId,this.textureSize),super.updateValue(e)}}}},{"../../../utils":113,"../../web-gl2/kernel-value/single-array1d-i":98}],85:[function(e,t,n){const{utils:r}=e("../../../utils"),{WebGL2KernelValueSingleArray2DI:i}=e("../../web-gl2/kernel-value/single-array2d-i");t.exports={WebGL2KernelValueDynamicSingleArray2DI:class extends i{getSource(){const e=this.getVariablePrecisionString();return r.linesToString([`uniform ${e} sampler2D ${this.id}`,`uniform ${e} ivec2 ${this.sizeId}`,`uniform ${e} ivec3 ${this.dimensionsId}`])}updateValue(e){this.setShape(e),this.kernel.setUniform3iv(this.dimensionsId,this.dimensions),this.kernel.setUniform2iv(this.sizeId,this.textureSize),super.updateValue(e)}}}},{"../../../utils":113,"../../web-gl2/kernel-value/single-array2d-i":99}],86:[function(e,t,n){const{utils:r}=e("../../../utils"),{WebGL2KernelValueSingleArray3DI:i}=e("../../web-gl2/kernel-value/single-array3d-i");t.exports={WebGL2KernelValueDynamicSingleArray3DI:class extends i{getSource(){const e=this.getVariablePrecisionString();return r.linesToString([`uniform ${e} sampler2D ${this.id}`,`uniform ${e} ivec2 ${this.sizeId}`,`uniform ${e} ivec3 ${this.dimensionsId}`])}updateValue(e){this.setShape(e),this.kernel.setUniform3iv(this.dimensionsId,this.dimensions),this.kernel.setUniform2iv(this.sizeId,this.textureSize),super.updateValue(e)}}}},{"../../../utils":113,"../../web-gl2/kernel-value/single-array3d-i":100}],87:[function(e,t,n){const{utils:r}=e("../../../utils"),{WebGL2KernelValueSingleInput:i}=e("../../web-gl2/kernel-value/single-input");t.exports={WebGL2KernelValueDynamicSingleInput:class extends i{getSource(){const e=this.getVariablePrecisionString();return r.linesToString([`uniform ${e} sampler2D ${this.id}`,`uniform ${e} ivec2 ${this.sizeId}`,`uniform ${e} ivec3 ${this.dimensionsId}`])}updateValue(e){let[t,n,i]=e.size;this.dimensions=new Int32Array([t||1,n||1,i||1]),this.textureSize=r.getMemoryOptimizedFloatTextureSize(this.dimensions,this.bitRatio),this.uploadArrayLength=this.textureSize[0]*this.textureSize[1]*this.bitRatio,this.checkSize(this.textureSize[0],this.textureSize[1]),this.uploadValue=new Float32Array(this.uploadArrayLength),this.kernel.setUniform3iv(this.dimensionsId,this.dimensions),this.kernel.setUniform2iv(this.sizeId,this.textureSize),super.updateValue(e)}}}},{"../../../utils":113,"../../web-gl2/kernel-value/single-input":101}],88:[function(e,t,n){const{utils:r}=e("../../../utils"),{WebGLKernelValueDynamicUnsignedArray:i}=e("../../web-gl/kernel-value/dynamic-unsigned-array");t.exports={WebGL2KernelValueDynamicUnsignedArray:class extends i{getSource(){const e=this.getVariablePrecisionString();return r.linesToString([`uniform ${e} sampler2D ${this.id}`,`uniform ${e} ivec2 ${this.sizeId}`,`uniform ${e} ivec3 ${this.dimensionsId}`])}}}},{"../../../utils":113,"../../web-gl/kernel-value/dynamic-unsigned-array":53}],89:[function(e,t,n){const{utils:r}=e("../../../utils"),{WebGLKernelValueDynamicUnsignedInput:i}=e("../../web-gl/kernel-value/dynamic-unsigned-input");t.exports={WebGL2KernelValueDynamicUnsignedInput:class extends i{getSource(){const e=this.getVariablePrecisionString();return r.linesToString([`uniform ${e} sampler2D ${this.id}`,`uniform ${e} ivec2 ${this.sizeId}`,`uniform ${e} ivec3 ${this.dimensionsId}`])}}}},{"../../../utils":113,"../../web-gl/kernel-value/dynamic-unsigned-input":54}],90:[function(e,t,n){const{utils:r}=e("../../../utils"),{WebGLKernelValueFloat:i}=e("../../web-gl/kernel-value/float");t.exports={WebGL2KernelValueFloat:class extends i{}}},{"../../../utils":113,"../../web-gl/kernel-value/float":55}],91:[function(e,t,n){const{utils:r}=e("../../../utils"),{WebGLKernelArray:i}=e("../../web-gl/kernel-value/array");t.exports={WebGL2KernelValueHTMLImageArray:class extends i{constructor(e,t){super(e,t),this.checkSize(e[0].width,e[0].height),this.dimensions=[e[0].width,e[0].height,e.length],this.textureSize=[e[0].width,e[0].height]}defineTexture(){const{context:e}=this;e.activeTexture(this.contextHandle),e.bindTexture(e.TEXTURE_2D_ARRAY,this.texture),e.texParameteri(e.TEXTURE_2D_ARRAY,e.TEXTURE_MAG_FILTER,e.NEAREST),e.texParameteri(e.TEXTURE_2D_ARRAY,e.TEXTURE_MIN_FILTER,e.NEAREST)}getStringValueHandler(){return`const uploadValue_${this.name} = ${this.varName};\n`}getSource(){const e=this.getVariablePrecisionString();return r.linesToString([`uniform ${e} sampler2DArray ${this.id}`,`${e} ivec2 ${this.sizeId} = ivec2(${this.textureSize[0]}, ${this.textureSize[1]})`,`${e} ivec3 ${this.dimensionsId} = ivec3(${this.dimensions[0]}, ${this.dimensions[1]}, ${this.dimensions[2]})`])}updateValue(e){const{context:t}=this;t.activeTexture(this.contextHandle),t.bindTexture(t.TEXTURE_2D_ARRAY,this.texture),t.pixelStorei(t.UNPACK_FLIP_Y_WEBGL,!0),t.texImage3D(t.TEXTURE_2D_ARRAY,0,t.RGBA,e[0].width,e[0].height,e.length,0,t.RGBA,t.UNSIGNED_BYTE,null);for(let n=0;ni})}"undefined"!=typeof window&&s(window),"undefined"!=typeof self&&s(self),t.exports=r},{"./index":108}],107:[function(e,t,n){const{gpuMock:r}=e("gpu-mock.js"),{utils:i}=e("./utils"),{Kernel:s}=e("./backend/kernel"),{CPUKernel:a}=e("./backend/cpu/kernel"),{HeadlessGLKernel:o}=e("./backend/headless-gl/kernel"),{WebGL2Kernel:u}=e("./backend/web-gl2/kernel"),{WebGLKernel:l}=e("./backend/web-gl/kernel"),{kernelRunShortcut:c}=e("./kernel-run-shortcut"),h=[o,u,l],p=["gpu","cpu"],d={headlessgl:o,webgl2:u,webgl:l};let m=!0;function g(e){if(!e)return{};const t=Object.assign({},e);return e.hasOwnProperty("floatOutput")&&(i.warnDeprecated("setting","floatOutput","precision"),t.precision=e.floatOutput?"single":"unsigned"),e.hasOwnProperty("outputToTexture")&&(i.warnDeprecated("setting","outputToTexture","pipeline"),t.pipeline=Boolean(e.outputToTexture)),e.hasOwnProperty("outputImmutable")&&(i.warnDeprecated("setting","outputImmutable","immutable"),t.immutable=Boolean(e.outputImmutable)),e.hasOwnProperty("floatTextures")&&(i.warnDeprecated("setting","floatTextures","optimizeFloatMemory"),t.optimizeFloatMemory=Boolean(e.floatTextures)),t}t.exports={GPU:class{static disableValidation(){m=!1}static enableValidation(){m=!0}static get isGPUSupported(){return h.some((e=>e.isSupported))}static get isKernelMapSupported(){return h.some((e=>e.isSupported&&e.features.kernelMap))}static get isOffscreenCanvasSupported(){return"undefined"!=typeof Worker&&"undefined"!=typeof OffscreenCanvas||"undefined"!=typeof importScripts}static get isWebGLSupported(){return l.isSupported}static get isWebGL2Supported(){return u.isSupported}static get isHeadlessGLSupported(){return o.isSupported}static get isCanvasSupported(){return"undefined"!=typeof HTMLCanvasElement}static get isGPUHTMLImageArraySupported(){return u.isSupported}static get isSinglePrecisionSupported(){return h.some((e=>e.isSupported&&e.features.isFloatRead&&e.features.isTextureFloat))}constructor(e){if(e=e||{},this.canvas=e.canvas||null,this.context=e.context||null,this.mode=e.mode,this.Kernel=null,this.kernels=[],this.functions=[],this.nativeFunctions=[],this.injectedNative=null,"dev"!==this.mode){if(this.chooseKernel(),e.functions)for(let t=0;tt.argumentTypes[e])));const l=Object.assign({context:this.context,canvas:this.canvas,functions:this.functions,nativeFunctions:this.nativeFunctions,injectedNative:this.injectedNative,gpu:this,validate:m,onRequestFallback:u,onRequestSwitchKernel:function t(r,i,a){a.debug&&console.warn("Switching kernels");let o=null;if(a.signature&&!s[a.signature]&&(s[a.signature]=a),a.dynamicOutput)for(let e=r.length-1;e>=0;e--){const t=r[e];"outputPrecisionMismatch"===t.type&&(o=t.needed)}const l=a.constructor,c=l.getArgumentTypes(a,i),h=l.getSignature(a,c),d=s[h];if(d)return d.onActivate(a),d;const g=s[h]=new l(e,{argumentTypes:c,constantTypes:a.constantTypes,graphical:a.graphical,loopMaxIterations:a.loopMaxIterations,constants:a.constants,dynamicOutput:a.dynamicOutput,dynamicArgument:a.dynamicArguments,context:a.context,canvas:a.canvas,output:o||a.output,precision:a.precision,pipeline:a.pipeline,immutable:a.immutable,optimizeFloatMemory:a.optimizeFloatMemory,fixIntegerDivisionAccuracy:a.fixIntegerDivisionAccuracy,functions:a.functions,nativeFunctions:a.nativeFunctions,injectedNative:a.injectedNative,subKernels:a.subKernels,strictIntegers:a.strictIntegers,debug:a.debug,gpu:a.gpu,validate:m,returnType:a.returnType,tactic:a.tactic,onRequestFallback:u,onRequestSwitchKernel:t,texture:a.texture,mappedTextures:a.mappedTextures,drawBuffersMap:a.drawBuffersMap});return g.build.apply(g,i),p.replaceKernel(g),n.push(g),g}},o),h=new this.Kernel(e,l),p=c(h);return this.canvas||(this.canvas=h.canvas),this.context||(this.context=h.context),n.push(h),p}createKernelMap(){let e,t;const n=typeof arguments[arguments.length-2];if("function"===n||"string"===n?(e=arguments[arguments.length-2],t=arguments[arguments.length-1]):e=arguments[arguments.length-1],"dev"!==this.mode&&(!this.Kernel.isSupported||!this.Kernel.features.kernelMap)&&this.mode&&p.indexOf(this.mode)<0)throw new Error(`kernelMap not supported on ${this.Kernel.name}`);const r=g(t);if(t&&"object"==typeof t.argumentTypes&&(r.argumentTypes=Object.keys(t.argumentTypes).map((e=>t.argumentTypes[e]))),Array.isArray(arguments[0])){r.subKernels=[];const e=arguments[0];for(let t=0;t0)throw new Error('Cannot call "addNativeFunction" after "createKernels" has been called.');return this.nativeFunctions.push(Object.assign({name:e,source:t},n)),this}injectNative(e){return this.injectedNative=e,this}destroy(){return new Promise(((e,t)=>{this.kernels||e(),setTimeout((()=>{try{for(let e=0;et.kernel[i])),t.__defineSetter__(i,(e=>{t.kernel[i]=e}))))}t.kernel=e}t.exports={kernelRunShortcut:function(e){let t=function(){return e.build.apply(e,arguments),t=function(){let t=e.run.apply(e,arguments);if(e.switchingKernels){const r=e.resetSwitchingKernels(),i=e.onRequestSwitchKernel(r,arguments,e);n.kernel=e=i,t=i.run.apply(i,arguments)}return e.renderKernels?e.renderKernels():e.renderOutput?e.renderOutput():t},t.apply(e,arguments)};const n=function(){return t.apply(e,arguments)};return n.exec=function(){return new Promise(((e,n)=>{try{e(t.apply(this,arguments))}catch(e){n(e)}}))},n.replaceKernel=function(t){i(e=t,n)},i(e,n),n}}},{"./utils":113}],111:[function(e,t,n){const r={name:"math-random-uniformly-distributed",onBeforeRun:e=>{e.setUniform1f("randomSeed1",Math.random()),e.setUniform1f("randomSeed2",Math.random())},functionMatch:"Math.random()",functionReplace:"nrand(vTexCoord)",functionReturnType:"Number",source:"// https://www.shadertoy.com/view/4t2SDh\n//note: uniformly distributed, normalized rand, [0,1]\nhighp float randomSeedShift = 1.0;\nhighp float slide = 1.0;\nuniform highp float randomSeed1;\nuniform highp float randomSeed2;\n\nhighp float nrand(highp vec2 n) {\n highp float result = fract(sin(dot((n.xy + 1.0) * vec2(randomSeed1 * slide, randomSeed2 * randomSeedShift), vec2(12.9898, 78.233))) * 43758.5453);\n randomSeedShift = result;\n if (randomSeedShift > 0.5) {\n slide += 0.00009; \n } else {\n slide += 0.0009;\n }\n return result;\n}"};t.exports=r},{}],112:[function(e,t,n){t.exports={Texture:class{constructor(e){const{texture:t,size:n,dimensions:r,output:i,context:s,type:a="NumberTexture",kernel:o,internalFormat:u,textureFormat:l}=e;if(!i)throw new Error('settings property "output" required.');if(!s)throw new Error('settings property "context" required.');if(!t)throw new Error('settings property "texture" required.');if(!o)throw new Error('settings property "kernel" required.');this.texture=t,t._refs?t._refs++:t._refs=1,this.size=n,this.dimensions=r,this.output=i,this.context=s,this.kernel=o,this.type=a,this._deleted=!1,this.internalFormat=u,this.textureFormat=l}toArray(){throw new Error(`Not implemented on ${this.constructor.name}`)}clone(){throw new Error(`Not implemented on ${this.constructor.name}`)}delete(){throw new Error(`Not implemented on ${this.constructor.name}`)}clear(){throw new Error(`Not implemented on ${this.constructor.name}`)}}}},{}],113:[function(e,t,n){const r=e("acorn"),{Input:i}=e("./input"),{Texture:s}=e("./texture"),a=/function ([^(]*)/,o=/((\/\/.*$)|(\/\*[\s\S]*?\*\/))/gm,u=/([^\s,]+)/g,l={systemEndianness:()=>d,getSystemEndianness(){const e=new ArrayBuffer(4),t=new Uint32Array(e),n=new Uint8Array(e);if(t[0]=3735928559,239===n[0])return"LE";if(222===n[0])return"BE";throw new Error("unknown endianness")},isFunction:e=>"function"==typeof e,isFunctionString:e=>"string"==typeof e&&"function"===e.slice(0,"function".length).toLowerCase(),getFunctionNameFromString(e){const t=a.exec(e);return t&&0!==t.length?t[1].trim():null},getFunctionBodyFromString:e=>e.substring(e.indexOf("{")+1,e.lastIndexOf("}")),getArgumentNamesFromString(e){const t=e.replace(o,"");let n=t.slice(t.indexOf("(")+1,t.indexOf(")")).match(u);return null===n&&(n=[]),n},clone(e){if(null===e||"object"!=typeof e||e.hasOwnProperty("isActiveClone"))return e;const t=e.constructor();for(let n in e)Object.prototype.hasOwnProperty.call(e,n)&&(e.isActiveClone=null,t[n]=l.clone(e[n]),delete e.isActiveClone);return t},isArray:e=>!isNaN(e.length),getVariableType(e,t){if(l.isArray(e))return e.length>0&&"IMG"===e[0].nodeName?"HTMLImageArray":"Array";switch(e.constructor){case Boolean:return"Boolean";case Number:return t&&Number.isInteger(e)?"Integer":"Float";case s:return e.type;case i:return"Input"}if("nodeName"in e)switch(e.nodeName){case"IMG":case"CANVAS":return"HTMLImage";case"VIDEO":return"HTMLVideo"}else{if(e.hasOwnProperty("type"))return e.type;if("undefined"!=typeof OffscreenCanvas&&e instanceof OffscreenCanvas)return"OffscreenCanvas";if("undefined"!=typeof ImageBitmap&&e instanceof ImageBitmap)return"ImageBitmap";if("undefined"!=typeof ImageData&&e instanceof ImageData)return"ImageData"}return"Unknown"},getKernelTextureSize(e,t){let[n,r,i]=t,s=(n||1)*(r||1)*(i||1);return e.optimizeFloatMemory&&"single"===e.precision&&(n=s=Math.ceil(s/4)),r>1&&n*r===s?new Int32Array([n,r]):l.closestSquareDimensions(s)},closestSquareDimensions(e){const t=Math.sqrt(e);let n=Math.ceil(t),r=Math.floor(t);for(;n*rMath.floor((e+t-1)/t)*t,getDimensions(e,t){let n;if(l.isArray(e)){const t=[];let r=e;for(;l.isArray(r);)t.push(r.length),r=r[0];n=t.reverse()}else if(e instanceof s)n=e.output;else{if(!(e instanceof i))throw new Error(`Unknown dimensions of ${e}`);n=e.size}if(t)for(n=Array.from(n);n.length<3;)n.push(1);return new Int32Array(n)},flatten2dArrayTo(e,t){let n=0;for(let r=0;re.length>0?e.join(";\n")+";\n":"\n",warnDeprecated(e,t,n){n?console.warn(`You are using a deprecated ${e} "${t}". It has been replaced with "${n}". Fixing, but please upgrade as it will soon be removed.`):console.warn(`You are using a deprecated ${e} "${t}". It has been removed. Fixing, but please upgrade as it will soon be removed.`)},flipPixels:(e,t,n)=>{const r=n/2|0,i=4*t,s=new Uint8ClampedArray(4*t),a=e.slice(0);for(let e=0;ee.subarray(0,t),erect2DPackedFloat:(e,t,n)=>{const r=new Array(n);for(let i=0;i{const i=new Array(r);for(let s=0;se.subarray(0,t),erectMemoryOptimized2DFloat:(e,t,n)=>{const r=new Array(n);for(let i=0;i{const i=new Array(r);for(let s=0;s{const n=new Float32Array(t);let r=0;for(let i=0;i{const r=new Array(n);let i=0;for(let s=0;s{const i=new Array(r);let s=0;for(let a=0;a{const n=new Array(t),r=4*t;let i=0;for(let t=0;t{const r=new Array(n),i=4*t;for(let s=0;s{const i=4*t,s=new Array(r);for(let a=0;a{const n=new Array(t),r=4*t;let i=0;for(let t=0;t{const r=4*t,i=new Array(n);for(let s=0;s{const i=4*t,s=new Array(r);for(let a=0;a{const n=new Array(e),r=4*t;let i=0;for(let t=0;t{const r=4*t,i=new Array(n);for(let s=0;s{const i=4*t,s=new Array(r);for(let a=0;a{const{findDependency:n,thisLookup:i,doNotDefine:s}=t;let a=t.flattened;a||(a=t.flattened={});const o=r.parse(e),u=[];let c=0;const h=function e(t){if(Array.isArray(t)){const n=[];for(let r=0;rnull!==e));return r.length<1?"":`${t.kind} ${r.join(",")}`;case"VariableDeclarator":if(t.init.object&&"ThisExpression"===t.init.object.type){return i(t.init.property.name,!0)?`${t.id.name} = ${e(t.init)}`:null}return`${t.id.name} = ${e(t.init)}`;case"CallExpression":if("subarray"===t.callee.property.name)return`${e(t.callee.object)}.${e(t.callee.property)}(${t.arguments.map((t=>e(t))).join(", ")})`;if("gl"===t.callee.object.name||"context"===t.callee.object.name)return`${e(t.callee.object)}.${e(t.callee.property)}(${t.arguments.map((t=>e(t))).join(", ")})`;if("ThisExpression"===t.callee.object.type)return u.push(n("this",t.callee.property.name)),`${t.callee.property.name}(${t.arguments.map((t=>e(t))).join(", ")})`;if(t.callee.object.name){const r=n(t.callee.object.name,t.callee.property.name);return null===r?`${t.callee.object.name}.${t.callee.property.name}(${t.arguments.map((t=>e(t))).join(", ")})`:(u.push(r),`${t.callee.property.name}(${t.arguments.map((t=>e(t))).join(", ")})`)}if("MemberExpression"===t.callee.object.type)return`${e(t.callee.object)}.${t.callee.property.name}(${t.arguments.map((t=>e(t))).join(", ")})`;throw new Error("unknown ast.callee");case"ReturnStatement":return`return ${e(t.argument)}`;case"BinaryExpression":return`(${e(t.left)}${t.operator}${e(t.right)})`;case"UnaryExpression":return t.prefix?`${t.operator} ${e(t.argument)}`:`${e(t.argument)} ${t.operator}`;case"ExpressionStatement":return`${e(t.expression)}`;case"SequenceExpression":return`(${e(t.expressions)})`;case"ArrowFunctionExpression":return`(${t.params.map(e).join(", ")}) => ${e(t.body)}`;case"Literal":return t.raw;case"Identifier":return t.name;case"MemberExpression":return"ThisExpression"===t.object.type?i(t.property.name):t.computed?`${e(t.object)}[${e(t.property)}]`:e(t.object)+"."+e(t.property);case"ThisExpression":return"this";case"NewExpression":return`new ${e(t.callee)}(${t.arguments.map((t=>e(t))).join(", ")})`;case"ForStatement":return`for (${e(t.init)};${e(t.test)};${e(t.update)}) ${e(t.body)}`;case"AssignmentExpression":return`${e(t.left)}${t.operator}${e(t.right)}`;case"UpdateExpression":return`${e(t.argument)}${t.operator}`;case"IfStatement":return`if (${e(t.test)}) ${e(t.consequent)}`;case"ThrowStatement":return`throw ${e(t.argument)}`;case"ObjectPattern":return t.properties.map(e).join(", ");case"ArrayPattern":return t.elements.map(e).join(", ");case"DebuggerStatement":return"debugger;";case"ConditionalExpression":return`${e(t.test)}?${e(t.consequent)}:${e(t.alternate)}`;case"Property":if("init"===t.kind)return e(t.key)}throw new Error(`unhandled ast.type of ${t.type}`)}(o);if(u.length>0){const e=[];for(let n=0;n{if("VariableDeclaration"!==e.type)throw new Error('Ast is not of type "VariableDeclaration"');const t=[];for(let n=0;n{const n=e.createKernel((function(e){return 255*e[this.thread.y][this.thread.x].r}),{output:[t.width,t.height],precision:"unsigned",argumentTypes:{a:"HTMLImage"}}),r=e.createKernel((function(e){return 255*e[this.thread.y][this.thread.x].g}),{output:[t.width,t.height],precision:"unsigned",argumentTypes:{a:"HTMLImage"}}),i=e.createKernel((function(e){return 255*e[this.thread.y][this.thread.x].b}),{output:[t.width,t.height],precision:"unsigned",argumentTypes:{a:"HTMLImage"}}),s=e.createKernel((function(e){return 255*e[this.thread.y][this.thread.x].a}),{output:[t.width,t.height],precision:"unsigned",argumentTypes:{a:"HTMLImage"}}),a=[n(t),r(t),i(t),s(t)];return a.rKernel=n,a.gKernel=r,a.bKernel=i,a.aKernel=s,a.gpu=e,a},splitRGBAToCanvases:(e,t,n,r)=>{const i=e.createKernel((function(e){const t=e[this.thread.y][this.thread.x];this.color(t.r/255,0,0,255)}),{output:[n,r],graphical:!0,argumentTypes:{v:"Array2D(4)"}});i(t);const s=e.createKernel((function(e){const t=e[this.thread.y][this.thread.x];this.color(0,t.g/255,0,255)}),{output:[n,r],graphical:!0,argumentTypes:{v:"Array2D(4)"}});s(t);const a=e.createKernel((function(e){const t=e[this.thread.y][this.thread.x];this.color(0,0,t.b/255,255)}),{output:[n,r],graphical:!0,argumentTypes:{v:"Array2D(4)"}});a(t);const o=e.createKernel((function(e){const t=e[this.thread.y][this.thread.x];this.color(255,255,255,t.a/255)}),{output:[n,r],graphical:!0,argumentTypes:{v:"Array2D(4)"}});return o(t),[i.canvas,s.canvas,a.canvas,o.canvas]},getMinifySafeName:e=>{try{const t=r.parse(`const value = ${e.toString()}`),{init:n}=t.body[0].declarations[0];return n.body.name||n.body.body[0].argument.name}catch(e){throw new Error("Unrecognized function type. Please use `() => yourFunctionVariableHere` or function() { return yourFunctionVariableHere; }")}},sanitizeName:function(e){return c.test(e)&&(e=e.replace(c,"S_S")),h.test(e)?e=e.replace(h,"U_U"):p.test(e)&&(e=e.replace(p,"u_u")),e}},c=/\$/,h=/__/,p=/_/,d=l.getSystemEndianness();t.exports={utils:l}},{"./input":109,"./texture":112,acorn:1}]},{},[106])(106)})); \ No newline at end of file diff --git a/dist/gpu-browser.js b/dist/gpu-browser.js deleted file mode 100644 index 2589801e..00000000 --- a/dist/gpu-browser.js +++ /dev/null @@ -1,19520 +0,0 @@ -/** - * gpu.js - * http://gpu.rocks/ - * - * GPU Accelerated JavaScript - * - * @version 2.16.0 - * @date Wed Nov 16 2022 15:48:37 GMT-0500 (Eastern Standard Time) - * - * @license MIT - * The MIT License - * - * Copyright (c) 2022 gpu.js Team - */(function(f){if(typeof exports==="object"&&typeof module!=="undefined"){module.exports=f()}else if(typeof define==="function"&&define.amd){define([],f)}else{var g;if(typeof window!=="undefined"){g=window}else if(typeof global!=="undefined"){g=global}else if(typeof self!=="undefined"){g=self}else{g=this}g.GPU = f()}})(function(){var define,module,exports;return (function(){function r(e,n,t){function o(i,f){if(!n[i]){if(!e[i]){var c="function"==typeof require&&require;if(!f&&c)return c(i,!0);if(u)return u(i,!0);var a=new Error("Cannot find module '"+i+"'");throw a.code="MODULE_NOT_FOUND",a}var p=n[i]={exports:{}};e[i][0].call(p.exports,function(r){var n=e[i][1][r];return o(n||r)},p,p.exports,r,e,n,t)}return n[i].exports}for(var u="function"==typeof require&&require,i=0;i code) { return false } - pos += set[i + 1]; - if (pos >= code) { return true } - } - } - - - function isIdentifierStart(code, astral) { - if (code < 65) { return code === 36 } - if (code < 91) { return true } - if (code < 97) { return code === 95 } - if (code < 123) { return true } - if (code <= 0xffff) { return code >= 0xaa && nonASCIIidentifierStart.test(String.fromCharCode(code)) } - if (astral === false) { return false } - return isInAstralSet(code, astralIdentifierStartCodes) - } - - - function isIdentifierChar(code, astral) { - if (code < 48) { return code === 36 } - if (code < 58) { return true } - if (code < 65) { return false } - if (code < 91) { return true } - if (code < 97) { return code === 95 } - if (code < 123) { return true } - if (code <= 0xffff) { return code >= 0xaa && nonASCIIidentifier.test(String.fromCharCode(code)) } - if (astral === false) { return false } - return isInAstralSet(code, astralIdentifierStartCodes) || isInAstralSet(code, astralIdentifierCodes) - } - - - - - - var TokenType = function TokenType(label, conf) { - if ( conf === void 0 ) conf = {}; - - this.label = label; - this.keyword = conf.keyword; - this.beforeExpr = !!conf.beforeExpr; - this.startsExpr = !!conf.startsExpr; - this.isLoop = !!conf.isLoop; - this.isAssign = !!conf.isAssign; - this.prefix = !!conf.prefix; - this.postfix = !!conf.postfix; - this.binop = conf.binop || null; - this.updateContext = null; - }; - - function binop(name, prec) { - return new TokenType(name, {beforeExpr: true, binop: prec}) - } - var beforeExpr = {beforeExpr: true}, startsExpr = {startsExpr: true}; - - - var keywords$1 = {}; - - function kw(name, options) { - if ( options === void 0 ) options = {}; - - options.keyword = name; - return keywords$1[name] = new TokenType(name, options) - } - - var types = { - num: new TokenType("num", startsExpr), - regexp: new TokenType("regexp", startsExpr), - string: new TokenType("string", startsExpr), - name: new TokenType("name", startsExpr), - eof: new TokenType("eof"), - - bracketL: new TokenType("[", {beforeExpr: true, startsExpr: true}), - bracketR: new TokenType("]"), - braceL: new TokenType("{", {beforeExpr: true, startsExpr: true}), - braceR: new TokenType("}"), - parenL: new TokenType("(", {beforeExpr: true, startsExpr: true}), - parenR: new TokenType(")"), - comma: new TokenType(",", beforeExpr), - semi: new TokenType(";", beforeExpr), - colon: new TokenType(":", beforeExpr), - dot: new TokenType("."), - question: new TokenType("?", beforeExpr), - arrow: new TokenType("=>", beforeExpr), - template: new TokenType("template"), - invalidTemplate: new TokenType("invalidTemplate"), - ellipsis: new TokenType("...", beforeExpr), - backQuote: new TokenType("`", startsExpr), - dollarBraceL: new TokenType("${", {beforeExpr: true, startsExpr: true}), - - - eq: new TokenType("=", {beforeExpr: true, isAssign: true}), - assign: new TokenType("_=", {beforeExpr: true, isAssign: true}), - incDec: new TokenType("++/--", {prefix: true, postfix: true, startsExpr: true}), - prefix: new TokenType("!/~", {beforeExpr: true, prefix: true, startsExpr: true}), - logicalOR: binop("||", 1), - logicalAND: binop("&&", 2), - bitwiseOR: binop("|", 3), - bitwiseXOR: binop("^", 4), - bitwiseAND: binop("&", 5), - equality: binop("==/!=/===/!==", 6), - relational: binop("/<=/>=", 7), - bitShift: binop("<>/>>>", 8), - plusMin: new TokenType("+/-", {beforeExpr: true, binop: 9, prefix: true, startsExpr: true}), - modulo: binop("%", 10), - star: binop("*", 10), - slash: binop("/", 10), - starstar: new TokenType("**", {beforeExpr: true}), - - _break: kw("break"), - _case: kw("case", beforeExpr), - _catch: kw("catch"), - _continue: kw("continue"), - _debugger: kw("debugger"), - _default: kw("default", beforeExpr), - _do: kw("do", {isLoop: true, beforeExpr: true}), - _else: kw("else", beforeExpr), - _finally: kw("finally"), - _for: kw("for", {isLoop: true}), - _function: kw("function", startsExpr), - _if: kw("if"), - _return: kw("return", beforeExpr), - _switch: kw("switch"), - _throw: kw("throw", beforeExpr), - _try: kw("try"), - _var: kw("var"), - _const: kw("const"), - _while: kw("while", {isLoop: true}), - _with: kw("with"), - _new: kw("new", {beforeExpr: true, startsExpr: true}), - _this: kw("this", startsExpr), - _super: kw("super", startsExpr), - _class: kw("class", startsExpr), - _extends: kw("extends", beforeExpr), - _export: kw("export"), - _import: kw("import", startsExpr), - _null: kw("null", startsExpr), - _true: kw("true", startsExpr), - _false: kw("false", startsExpr), - _in: kw("in", {beforeExpr: true, binop: 7}), - _instanceof: kw("instanceof", {beforeExpr: true, binop: 7}), - _typeof: kw("typeof", {beforeExpr: true, prefix: true, startsExpr: true}), - _void: kw("void", {beforeExpr: true, prefix: true, startsExpr: true}), - _delete: kw("delete", {beforeExpr: true, prefix: true, startsExpr: true}) - }; - - - var lineBreak = /\r\n?|\n|\u2028|\u2029/; - var lineBreakG = new RegExp(lineBreak.source, "g"); - - function isNewLine(code, ecma2019String) { - return code === 10 || code === 13 || (!ecma2019String && (code === 0x2028 || code === 0x2029)) - } - - var nonASCIIwhitespace = /[\u1680\u2000-\u200a\u202f\u205f\u3000\ufeff]/; - - var skipWhiteSpace = /(?:\s|\/\/.*|\/\*[^]*?\*\/)*/g; - - var ref = Object.prototype; - var hasOwnProperty = ref.hasOwnProperty; - var toString = ref.toString; - - - function has(obj, propName) { - return hasOwnProperty.call(obj, propName) - } - - var isArray = Array.isArray || (function (obj) { return ( - toString.call(obj) === "[object Array]" - ); }); - - function wordsRegexp(words) { - return new RegExp("^(?:" + words.replace(/ /g, "|") + ")$") - } - - - var Position = function Position(line, col) { - this.line = line; - this.column = col; - }; - - Position.prototype.offset = function offset (n) { - return new Position(this.line, this.column + n) - }; - - var SourceLocation = function SourceLocation(p, start, end) { - this.start = start; - this.end = end; - if (p.sourceFile !== null) { this.source = p.sourceFile; } - }; - - - function getLineInfo(input, offset) { - for (var line = 1, cur = 0;;) { - lineBreakG.lastIndex = cur; - var match = lineBreakG.exec(input); - if (match && match.index < offset) { - ++line; - cur = match.index + match[0].length; - } else { - return new Position(line, offset - cur) - } - } - } - - - var defaultOptions = { - ecmaVersion: 10, - sourceType: "script", - onInsertedSemicolon: null, - onTrailingComma: null, - allowReserved: null, - allowReturnOutsideFunction: false, - allowImportExportEverywhere: false, - allowAwaitOutsideFunction: false, - allowHashBang: false, - locations: false, - onToken: null, - onComment: null, - ranges: false, - program: null, - sourceFile: null, - directSourceFile: null, - preserveParens: false - }; - - - function getOptions(opts) { - var options = {}; - - for (var opt in defaultOptions) - { options[opt] = opts && has(opts, opt) ? opts[opt] : defaultOptions[opt]; } - - if (options.ecmaVersion >= 2015) - { options.ecmaVersion -= 2009; } - - if (options.allowReserved == null) - { options.allowReserved = options.ecmaVersion < 5; } - - if (isArray(options.onToken)) { - var tokens = options.onToken; - options.onToken = function (token) { return tokens.push(token); }; - } - if (isArray(options.onComment)) - { options.onComment = pushComment(options, options.onComment); } - - return options - } - - function pushComment(options, array) { - return function(block, text, start, end, startLoc, endLoc) { - var comment = { - type: block ? "Block" : "Line", - value: text, - start: start, - end: end - }; - if (options.locations) - { comment.loc = new SourceLocation(this, startLoc, endLoc); } - if (options.ranges) - { comment.range = [start, end]; } - array.push(comment); - } - } - - var - SCOPE_TOP = 1, - SCOPE_FUNCTION = 2, - SCOPE_VAR = SCOPE_TOP | SCOPE_FUNCTION, - SCOPE_ASYNC = 4, - SCOPE_GENERATOR = 8, - SCOPE_ARROW = 16, - SCOPE_SIMPLE_CATCH = 32, - SCOPE_SUPER = 64, - SCOPE_DIRECT_SUPER = 128; - - function functionFlags(async, generator) { - return SCOPE_FUNCTION | (async ? SCOPE_ASYNC : 0) | (generator ? SCOPE_GENERATOR : 0) - } - - var - BIND_NONE = 0, - BIND_VAR = 1, - BIND_LEXICAL = 2, - BIND_FUNCTION = 3, - BIND_SIMPLE_CATCH = 4, - BIND_OUTSIDE = 5; - - var Parser = function Parser(options, input, startPos) { - this.options = options = getOptions(options); - this.sourceFile = options.sourceFile; - this.keywords = wordsRegexp(keywords[options.ecmaVersion >= 6 ? 6 : options.sourceType === "module" ? "5module" : 5]); - var reserved = ""; - if (options.allowReserved !== true) { - for (var v = options.ecmaVersion;; v--) - { if (reserved = reservedWords[v]) { break } } - if (options.sourceType === "module") { reserved += " await"; } - } - this.reservedWords = wordsRegexp(reserved); - var reservedStrict = (reserved ? reserved + " " : "") + reservedWords.strict; - this.reservedWordsStrict = wordsRegexp(reservedStrict); - this.reservedWordsStrictBind = wordsRegexp(reservedStrict + " " + reservedWords.strictBind); - this.input = String(input); - - this.containsEsc = false; - - - if (startPos) { - this.pos = startPos; - this.lineStart = this.input.lastIndexOf("\n", startPos - 1) + 1; - this.curLine = this.input.slice(0, this.lineStart).split(lineBreak).length; - } else { - this.pos = this.lineStart = 0; - this.curLine = 1; - } - - this.type = types.eof; - this.value = null; - this.start = this.end = this.pos; - this.startLoc = this.endLoc = this.curPosition(); - - this.lastTokEndLoc = this.lastTokStartLoc = null; - this.lastTokStart = this.lastTokEnd = this.pos; - - this.context = this.initialContext(); - this.exprAllowed = true; - - this.inModule = options.sourceType === "module"; - this.strict = this.inModule || this.strictDirective(this.pos); - - this.potentialArrowAt = -1; - - this.yieldPos = this.awaitPos = this.awaitIdentPos = 0; - this.labels = []; - this.undefinedExports = {}; - - if (this.pos === 0 && options.allowHashBang && this.input.slice(0, 2) === "#!") - { this.skipLineComment(2); } - - this.scopeStack = []; - this.enterScope(SCOPE_TOP); - - this.regexpState = null; - }; - - var prototypeAccessors = { inFunction: { configurable: true },inGenerator: { configurable: true },inAsync: { configurable: true },allowSuper: { configurable: true },allowDirectSuper: { configurable: true },treatFunctionsAsVar: { configurable: true } }; - - Parser.prototype.parse = function parse () { - var node = this.options.program || this.startNode(); - this.nextToken(); - return this.parseTopLevel(node) - }; - - prototypeAccessors.inFunction.get = function () { return (this.currentVarScope().flags & SCOPE_FUNCTION) > 0 }; - prototypeAccessors.inGenerator.get = function () { return (this.currentVarScope().flags & SCOPE_GENERATOR) > 0 }; - prototypeAccessors.inAsync.get = function () { return (this.currentVarScope().flags & SCOPE_ASYNC) > 0 }; - prototypeAccessors.allowSuper.get = function () { return (this.currentThisScope().flags & SCOPE_SUPER) > 0 }; - prototypeAccessors.allowDirectSuper.get = function () { return (this.currentThisScope().flags & SCOPE_DIRECT_SUPER) > 0 }; - prototypeAccessors.treatFunctionsAsVar.get = function () { return this.treatFunctionsAsVarInScope(this.currentScope()) }; - - Parser.prototype.inNonArrowFunction = function inNonArrowFunction () { return (this.currentThisScope().flags & SCOPE_FUNCTION) > 0 }; - - Parser.extend = function extend () { - var plugins = [], len = arguments.length; - while ( len-- ) plugins[ len ] = arguments[ len ]; - - var cls = this; - for (var i = 0; i < plugins.length; i++) { cls = plugins[i](cls); } - return cls - }; - - Parser.parse = function parse (input, options) { - return new this(options, input).parse() - }; - - Parser.parseExpressionAt = function parseExpressionAt (input, pos, options) { - var parser = new this(options, input, pos); - parser.nextToken(); - return parser.parseExpression() - }; - - Parser.tokenizer = function tokenizer (input, options) { - return new this(options, input) - }; - - Object.defineProperties( Parser.prototype, prototypeAccessors ); - - var pp = Parser.prototype; - - - var literal = /^(?:'((?:\\.|[^'])*?)'|"((?:\\.|[^"])*?)")/; - pp.strictDirective = function(start) { - for (;;) { - skipWhiteSpace.lastIndex = start; - start += skipWhiteSpace.exec(this.input)[0].length; - var match = literal.exec(this.input.slice(start)); - if (!match) { return false } - if ((match[1] || match[2]) === "use strict") { return true } - start += match[0].length; - - skipWhiteSpace.lastIndex = start; - start += skipWhiteSpace.exec(this.input)[0].length; - if (this.input[start] === ";") - { start++; } - } - }; - - - pp.eat = function(type) { - if (this.type === type) { - this.next(); - return true - } else { - return false - } - }; - - - pp.isContextual = function(name) { - return this.type === types.name && this.value === name && !this.containsEsc - }; - - - pp.eatContextual = function(name) { - if (!this.isContextual(name)) { return false } - this.next(); - return true - }; - - - pp.expectContextual = function(name) { - if (!this.eatContextual(name)) { this.unexpected(); } - }; - - - pp.canInsertSemicolon = function() { - return this.type === types.eof || - this.type === types.braceR || - lineBreak.test(this.input.slice(this.lastTokEnd, this.start)) - }; - - pp.insertSemicolon = function() { - if (this.canInsertSemicolon()) { - if (this.options.onInsertedSemicolon) - { this.options.onInsertedSemicolon(this.lastTokEnd, this.lastTokEndLoc); } - return true - } - }; - - - pp.semicolon = function() { - if (!this.eat(types.semi) && !this.insertSemicolon()) { this.unexpected(); } - }; - - pp.afterTrailingComma = function(tokType, notNext) { - if (this.type === tokType) { - if (this.options.onTrailingComma) - { this.options.onTrailingComma(this.lastTokStart, this.lastTokStartLoc); } - if (!notNext) - { this.next(); } - return true - } - }; - - - pp.expect = function(type) { - this.eat(type) || this.unexpected(); - }; - - - pp.unexpected = function(pos) { - this.raise(pos != null ? pos : this.start, "Unexpected token"); - }; - - function DestructuringErrors() { - this.shorthandAssign = - this.trailingComma = - this.parenthesizedAssign = - this.parenthesizedBind = - this.doubleProto = - -1; - } - - pp.checkPatternErrors = function(refDestructuringErrors, isAssign) { - if (!refDestructuringErrors) { return } - if (refDestructuringErrors.trailingComma > -1) - { this.raiseRecoverable(refDestructuringErrors.trailingComma, "Comma is not permitted after the rest element"); } - var parens = isAssign ? refDestructuringErrors.parenthesizedAssign : refDestructuringErrors.parenthesizedBind; - if (parens > -1) { this.raiseRecoverable(parens, "Parenthesized pattern"); } - }; - - pp.checkExpressionErrors = function(refDestructuringErrors, andThrow) { - if (!refDestructuringErrors) { return false } - var shorthandAssign = refDestructuringErrors.shorthandAssign; - var doubleProto = refDestructuringErrors.doubleProto; - if (!andThrow) { return shorthandAssign >= 0 || doubleProto >= 0 } - if (shorthandAssign >= 0) - { this.raise(shorthandAssign, "Shorthand property assignments are valid only in destructuring patterns"); } - if (doubleProto >= 0) - { this.raiseRecoverable(doubleProto, "Redefinition of __proto__ property"); } - }; - - pp.checkYieldAwaitInDefaultParams = function() { - if (this.yieldPos && (!this.awaitPos || this.yieldPos < this.awaitPos)) - { this.raise(this.yieldPos, "Yield expression cannot be a default value"); } - if (this.awaitPos) - { this.raise(this.awaitPos, "Await expression cannot be a default value"); } - }; - - pp.isSimpleAssignTarget = function(expr) { - if (expr.type === "ParenthesizedExpression") - { return this.isSimpleAssignTarget(expr.expression) } - return expr.type === "Identifier" || expr.type === "MemberExpression" - }; - - var pp$1 = Parser.prototype; - - - - pp$1.parseTopLevel = function(node) { - var exports = {}; - if (!node.body) { node.body = []; } - while (this.type !== types.eof) { - var stmt = this.parseStatement(null, true, exports); - node.body.push(stmt); - } - if (this.inModule) - { for (var i = 0, list = Object.keys(this.undefinedExports); i < list.length; i += 1) - { - var name = list[i]; - - this.raiseRecoverable(this.undefinedExports[name].start, ("Export '" + name + "' is not defined")); - } } - this.adaptDirectivePrologue(node.body); - this.next(); - node.sourceType = this.options.sourceType; - return this.finishNode(node, "Program") - }; - - var loopLabel = {kind: "loop"}, switchLabel = {kind: "switch"}; - - pp$1.isLet = function(context) { - if (this.options.ecmaVersion < 6 || !this.isContextual("let")) { return false } - skipWhiteSpace.lastIndex = this.pos; - var skip = skipWhiteSpace.exec(this.input); - var next = this.pos + skip[0].length, nextCh = this.input.charCodeAt(next); - if (nextCh === 91) { return true } - if (context) { return false } - - if (nextCh === 123) { return true } - if (isIdentifierStart(nextCh, true)) { - var pos = next + 1; - while (isIdentifierChar(this.input.charCodeAt(pos), true)) { ++pos; } - var ident = this.input.slice(next, pos); - if (!keywordRelationalOperator.test(ident)) { return true } - } - return false - }; - - pp$1.isAsyncFunction = function() { - if (this.options.ecmaVersion < 8 || !this.isContextual("async")) - { return false } - - skipWhiteSpace.lastIndex = this.pos; - var skip = skipWhiteSpace.exec(this.input); - var next = this.pos + skip[0].length; - return !lineBreak.test(this.input.slice(this.pos, next)) && - this.input.slice(next, next + 8) === "function" && - (next + 8 === this.input.length || !isIdentifierChar(this.input.charAt(next + 8))) - }; - - - pp$1.parseStatement = function(context, topLevel, exports) { - var starttype = this.type, node = this.startNode(), kind; - - if (this.isLet(context)) { - starttype = types._var; - kind = "let"; - } - - - switch (starttype) { - case types._break: case types._continue: return this.parseBreakContinueStatement(node, starttype.keyword) - case types._debugger: return this.parseDebuggerStatement(node) - case types._do: return this.parseDoStatement(node) - case types._for: return this.parseForStatement(node) - case types._function: - if ((context && (this.strict || context !== "if" && context !== "label")) && this.options.ecmaVersion >= 6) { this.unexpected(); } - return this.parseFunctionStatement(node, false, !context) - case types._class: - if (context) { this.unexpected(); } - return this.parseClass(node, true) - case types._if: return this.parseIfStatement(node) - case types._return: return this.parseReturnStatement(node) - case types._switch: return this.parseSwitchStatement(node) - case types._throw: return this.parseThrowStatement(node) - case types._try: return this.parseTryStatement(node) - case types._const: case types._var: - kind = kind || this.value; - if (context && kind !== "var") { this.unexpected(); } - return this.parseVarStatement(node, kind) - case types._while: return this.parseWhileStatement(node) - case types._with: return this.parseWithStatement(node) - case types.braceL: return this.parseBlock(true, node) - case types.semi: return this.parseEmptyStatement(node) - case types._export: - case types._import: - if (this.options.ecmaVersion > 10 && starttype === types._import) { - skipWhiteSpace.lastIndex = this.pos; - var skip = skipWhiteSpace.exec(this.input); - var next = this.pos + skip[0].length, nextCh = this.input.charCodeAt(next); - if (nextCh === 40) - { return this.parseExpressionStatement(node, this.parseExpression()) } - } - - if (!this.options.allowImportExportEverywhere) { - if (!topLevel) - { this.raise(this.start, "'import' and 'export' may only appear at the top level"); } - if (!this.inModule) - { this.raise(this.start, "'import' and 'export' may appear only with 'sourceType: module'"); } - } - return starttype === types._import ? this.parseImport(node) : this.parseExport(node, exports) - - default: - if (this.isAsyncFunction()) { - if (context) { this.unexpected(); } - this.next(); - return this.parseFunctionStatement(node, true, !context) - } - - var maybeName = this.value, expr = this.parseExpression(); - if (starttype === types.name && expr.type === "Identifier" && this.eat(types.colon)) - { return this.parseLabeledStatement(node, maybeName, expr, context) } - else { return this.parseExpressionStatement(node, expr) } - } - }; - - pp$1.parseBreakContinueStatement = function(node, keyword) { - var isBreak = keyword === "break"; - this.next(); - if (this.eat(types.semi) || this.insertSemicolon()) { node.label = null; } - else if (this.type !== types.name) { this.unexpected(); } - else { - node.label = this.parseIdent(); - this.semicolon(); - } - - var i = 0; - for (; i < this.labels.length; ++i) { - var lab = this.labels[i]; - if (node.label == null || lab.name === node.label.name) { - if (lab.kind != null && (isBreak || lab.kind === "loop")) { break } - if (node.label && isBreak) { break } - } - } - if (i === this.labels.length) { this.raise(node.start, "Unsyntactic " + keyword); } - return this.finishNode(node, isBreak ? "BreakStatement" : "ContinueStatement") - }; - - pp$1.parseDebuggerStatement = function(node) { - this.next(); - this.semicolon(); - return this.finishNode(node, "DebuggerStatement") - }; - - pp$1.parseDoStatement = function(node) { - this.next(); - this.labels.push(loopLabel); - node.body = this.parseStatement("do"); - this.labels.pop(); - this.expect(types._while); - node.test = this.parseParenExpression(); - if (this.options.ecmaVersion >= 6) - { this.eat(types.semi); } - else - { this.semicolon(); } - return this.finishNode(node, "DoWhileStatement") - }; - - - pp$1.parseForStatement = function(node) { - this.next(); - var awaitAt = (this.options.ecmaVersion >= 9 && (this.inAsync || (!this.inFunction && this.options.allowAwaitOutsideFunction)) && this.eatContextual("await")) ? this.lastTokStart : -1; - this.labels.push(loopLabel); - this.enterScope(0); - this.expect(types.parenL); - if (this.type === types.semi) { - if (awaitAt > -1) { this.unexpected(awaitAt); } - return this.parseFor(node, null) - } - var isLet = this.isLet(); - if (this.type === types._var || this.type === types._const || isLet) { - var init$1 = this.startNode(), kind = isLet ? "let" : this.value; - this.next(); - this.parseVar(init$1, true, kind); - this.finishNode(init$1, "VariableDeclaration"); - if ((this.type === types._in || (this.options.ecmaVersion >= 6 && this.isContextual("of"))) && init$1.declarations.length === 1) { - if (this.options.ecmaVersion >= 9) { - if (this.type === types._in) { - if (awaitAt > -1) { this.unexpected(awaitAt); } - } else { node.await = awaitAt > -1; } - } - return this.parseForIn(node, init$1) - } - if (awaitAt > -1) { this.unexpected(awaitAt); } - return this.parseFor(node, init$1) - } - var refDestructuringErrors = new DestructuringErrors; - var init = this.parseExpression(true, refDestructuringErrors); - if (this.type === types._in || (this.options.ecmaVersion >= 6 && this.isContextual("of"))) { - if (this.options.ecmaVersion >= 9) { - if (this.type === types._in) { - if (awaitAt > -1) { this.unexpected(awaitAt); } - } else { node.await = awaitAt > -1; } - } - this.toAssignable(init, false, refDestructuringErrors); - this.checkLVal(init); - return this.parseForIn(node, init) - } else { - this.checkExpressionErrors(refDestructuringErrors, true); - } - if (awaitAt > -1) { this.unexpected(awaitAt); } - return this.parseFor(node, init) - }; - - pp$1.parseFunctionStatement = function(node, isAsync, declarationPosition) { - this.next(); - return this.parseFunction(node, FUNC_STATEMENT | (declarationPosition ? 0 : FUNC_HANGING_STATEMENT), false, isAsync) - }; - - pp$1.parseIfStatement = function(node) { - this.next(); - node.test = this.parseParenExpression(); - node.consequent = this.parseStatement("if"); - node.alternate = this.eat(types._else) ? this.parseStatement("if") : null; - return this.finishNode(node, "IfStatement") - }; - - pp$1.parseReturnStatement = function(node) { - if (!this.inFunction && !this.options.allowReturnOutsideFunction) - { this.raise(this.start, "'return' outside of function"); } - this.next(); - - - if (this.eat(types.semi) || this.insertSemicolon()) { node.argument = null; } - else { node.argument = this.parseExpression(); this.semicolon(); } - return this.finishNode(node, "ReturnStatement") - }; - - pp$1.parseSwitchStatement = function(node) { - this.next(); - node.discriminant = this.parseParenExpression(); - node.cases = []; - this.expect(types.braceL); - this.labels.push(switchLabel); - this.enterScope(0); - - - var cur; - for (var sawDefault = false; this.type !== types.braceR;) { - if (this.type === types._case || this.type === types._default) { - var isCase = this.type === types._case; - if (cur) { this.finishNode(cur, "SwitchCase"); } - node.cases.push(cur = this.startNode()); - cur.consequent = []; - this.next(); - if (isCase) { - cur.test = this.parseExpression(); - } else { - if (sawDefault) { this.raiseRecoverable(this.lastTokStart, "Multiple default clauses"); } - sawDefault = true; - cur.test = null; - } - this.expect(types.colon); - } else { - if (!cur) { this.unexpected(); } - cur.consequent.push(this.parseStatement(null)); - } - } - this.exitScope(); - if (cur) { this.finishNode(cur, "SwitchCase"); } - this.next(); - this.labels.pop(); - return this.finishNode(node, "SwitchStatement") - }; - - pp$1.parseThrowStatement = function(node) { - this.next(); - if (lineBreak.test(this.input.slice(this.lastTokEnd, this.start))) - { this.raise(this.lastTokEnd, "Illegal newline after throw"); } - node.argument = this.parseExpression(); - this.semicolon(); - return this.finishNode(node, "ThrowStatement") - }; - - - var empty = []; - - pp$1.parseTryStatement = function(node) { - this.next(); - node.block = this.parseBlock(); - node.handler = null; - if (this.type === types._catch) { - var clause = this.startNode(); - this.next(); - if (this.eat(types.parenL)) { - clause.param = this.parseBindingAtom(); - var simple = clause.param.type === "Identifier"; - this.enterScope(simple ? SCOPE_SIMPLE_CATCH : 0); - this.checkLVal(clause.param, simple ? BIND_SIMPLE_CATCH : BIND_LEXICAL); - this.expect(types.parenR); - } else { - if (this.options.ecmaVersion < 10) { this.unexpected(); } - clause.param = null; - this.enterScope(0); - } - clause.body = this.parseBlock(false); - this.exitScope(); - node.handler = this.finishNode(clause, "CatchClause"); - } - node.finalizer = this.eat(types._finally) ? this.parseBlock() : null; - if (!node.handler && !node.finalizer) - { this.raise(node.start, "Missing catch or finally clause"); } - return this.finishNode(node, "TryStatement") - }; - - pp$1.parseVarStatement = function(node, kind) { - this.next(); - this.parseVar(node, false, kind); - this.semicolon(); - return this.finishNode(node, "VariableDeclaration") - }; - - pp$1.parseWhileStatement = function(node) { - this.next(); - node.test = this.parseParenExpression(); - this.labels.push(loopLabel); - node.body = this.parseStatement("while"); - this.labels.pop(); - return this.finishNode(node, "WhileStatement") - }; - - pp$1.parseWithStatement = function(node) { - if (this.strict) { this.raise(this.start, "'with' in strict mode"); } - this.next(); - node.object = this.parseParenExpression(); - node.body = this.parseStatement("with"); - return this.finishNode(node, "WithStatement") - }; - - pp$1.parseEmptyStatement = function(node) { - this.next(); - return this.finishNode(node, "EmptyStatement") - }; - - pp$1.parseLabeledStatement = function(node, maybeName, expr, context) { - for (var i$1 = 0, list = this.labels; i$1 < list.length; i$1 += 1) - { - var label = list[i$1]; - - if (label.name === maybeName) - { this.raise(expr.start, "Label '" + maybeName + "' is already declared"); - } } - var kind = this.type.isLoop ? "loop" : this.type === types._switch ? "switch" : null; - for (var i = this.labels.length - 1; i >= 0; i--) { - var label$1 = this.labels[i]; - if (label$1.statementStart === node.start) { - label$1.statementStart = this.start; - label$1.kind = kind; - } else { break } - } - this.labels.push({name: maybeName, kind: kind, statementStart: this.start}); - node.body = this.parseStatement(context ? context.indexOf("label") === -1 ? context + "label" : context : "label"); - this.labels.pop(); - node.label = expr; - return this.finishNode(node, "LabeledStatement") - }; - - pp$1.parseExpressionStatement = function(node, expr) { - node.expression = expr; - this.semicolon(); - return this.finishNode(node, "ExpressionStatement") - }; - - - pp$1.parseBlock = function(createNewLexicalScope, node) { - if ( createNewLexicalScope === void 0 ) createNewLexicalScope = true; - if ( node === void 0 ) node = this.startNode(); - - node.body = []; - this.expect(types.braceL); - if (createNewLexicalScope) { this.enterScope(0); } - while (!this.eat(types.braceR)) { - var stmt = this.parseStatement(null); - node.body.push(stmt); - } - if (createNewLexicalScope) { this.exitScope(); } - return this.finishNode(node, "BlockStatement") - }; - - - pp$1.parseFor = function(node, init) { - node.init = init; - this.expect(types.semi); - node.test = this.type === types.semi ? null : this.parseExpression(); - this.expect(types.semi); - node.update = this.type === types.parenR ? null : this.parseExpression(); - this.expect(types.parenR); - node.body = this.parseStatement("for"); - this.exitScope(); - this.labels.pop(); - return this.finishNode(node, "ForStatement") - }; - - - pp$1.parseForIn = function(node, init) { - var isForIn = this.type === types._in; - this.next(); - - if ( - init.type === "VariableDeclaration" && - init.declarations[0].init != null && - ( - !isForIn || - this.options.ecmaVersion < 8 || - this.strict || - init.kind !== "var" || - init.declarations[0].id.type !== "Identifier" - ) - ) { - this.raise( - init.start, - ((isForIn ? "for-in" : "for-of") + " loop variable declaration may not have an initializer") - ); - } else if (init.type === "AssignmentPattern") { - this.raise(init.start, "Invalid left-hand side in for-loop"); - } - node.left = init; - node.right = isForIn ? this.parseExpression() : this.parseMaybeAssign(); - this.expect(types.parenR); - node.body = this.parseStatement("for"); - this.exitScope(); - this.labels.pop(); - return this.finishNode(node, isForIn ? "ForInStatement" : "ForOfStatement") - }; - - - pp$1.parseVar = function(node, isFor, kind) { - node.declarations = []; - node.kind = kind; - for (;;) { - var decl = this.startNode(); - this.parseVarId(decl, kind); - if (this.eat(types.eq)) { - decl.init = this.parseMaybeAssign(isFor); - } else if (kind === "const" && !(this.type === types._in || (this.options.ecmaVersion >= 6 && this.isContextual("of")))) { - this.unexpected(); - } else if (decl.id.type !== "Identifier" && !(isFor && (this.type === types._in || this.isContextual("of")))) { - this.raise(this.lastTokEnd, "Complex binding patterns require an initialization value"); - } else { - decl.init = null; - } - node.declarations.push(this.finishNode(decl, "VariableDeclarator")); - if (!this.eat(types.comma)) { break } - } - return node - }; - - pp$1.parseVarId = function(decl, kind) { - decl.id = this.parseBindingAtom(); - this.checkLVal(decl.id, kind === "var" ? BIND_VAR : BIND_LEXICAL, false); - }; - - var FUNC_STATEMENT = 1, FUNC_HANGING_STATEMENT = 2, FUNC_NULLABLE_ID = 4; - - - pp$1.parseFunction = function(node, statement, allowExpressionBody, isAsync) { - this.initFunction(node); - if (this.options.ecmaVersion >= 9 || this.options.ecmaVersion >= 6 && !isAsync) { - if (this.type === types.star && (statement & FUNC_HANGING_STATEMENT)) - { this.unexpected(); } - node.generator = this.eat(types.star); - } - if (this.options.ecmaVersion >= 8) - { node.async = !!isAsync; } - - if (statement & FUNC_STATEMENT) { - node.id = (statement & FUNC_NULLABLE_ID) && this.type !== types.name ? null : this.parseIdent(); - if (node.id && !(statement & FUNC_HANGING_STATEMENT)) - { this.checkLVal(node.id, (this.strict || node.generator || node.async) ? this.treatFunctionsAsVar ? BIND_VAR : BIND_LEXICAL : BIND_FUNCTION); } - } - - var oldYieldPos = this.yieldPos, oldAwaitPos = this.awaitPos, oldAwaitIdentPos = this.awaitIdentPos; - this.yieldPos = 0; - this.awaitPos = 0; - this.awaitIdentPos = 0; - this.enterScope(functionFlags(node.async, node.generator)); - - if (!(statement & FUNC_STATEMENT)) - { node.id = this.type === types.name ? this.parseIdent() : null; } - - this.parseFunctionParams(node); - this.parseFunctionBody(node, allowExpressionBody, false); - - this.yieldPos = oldYieldPos; - this.awaitPos = oldAwaitPos; - this.awaitIdentPos = oldAwaitIdentPos; - return this.finishNode(node, (statement & FUNC_STATEMENT) ? "FunctionDeclaration" : "FunctionExpression") - }; - - pp$1.parseFunctionParams = function(node) { - this.expect(types.parenL); - node.params = this.parseBindingList(types.parenR, false, this.options.ecmaVersion >= 8); - this.checkYieldAwaitInDefaultParams(); - }; - - - pp$1.parseClass = function(node, isStatement) { - this.next(); - - var oldStrict = this.strict; - this.strict = true; - - this.parseClassId(node, isStatement); - this.parseClassSuper(node); - var classBody = this.startNode(); - var hadConstructor = false; - classBody.body = []; - this.expect(types.braceL); - while (!this.eat(types.braceR)) { - var element = this.parseClassElement(node.superClass !== null); - if (element) { - classBody.body.push(element); - if (element.type === "MethodDefinition" && element.kind === "constructor") { - if (hadConstructor) { this.raise(element.start, "Duplicate constructor in the same class"); } - hadConstructor = true; - } - } - } - node.body = this.finishNode(classBody, "ClassBody"); - this.strict = oldStrict; - return this.finishNode(node, isStatement ? "ClassDeclaration" : "ClassExpression") - }; - - pp$1.parseClassElement = function(constructorAllowsSuper) { - var this$1 = this; - - if (this.eat(types.semi)) { return null } - - var method = this.startNode(); - var tryContextual = function (k, noLineBreak) { - if ( noLineBreak === void 0 ) noLineBreak = false; - - var start = this$1.start, startLoc = this$1.startLoc; - if (!this$1.eatContextual(k)) { return false } - if (this$1.type !== types.parenL && (!noLineBreak || !this$1.canInsertSemicolon())) { return true } - if (method.key) { this$1.unexpected(); } - method.computed = false; - method.key = this$1.startNodeAt(start, startLoc); - method.key.name = k; - this$1.finishNode(method.key, "Identifier"); - return false - }; - - method.kind = "method"; - method.static = tryContextual("static"); - var isGenerator = this.eat(types.star); - var isAsync = false; - if (!isGenerator) { - if (this.options.ecmaVersion >= 8 && tryContextual("async", true)) { - isAsync = true; - isGenerator = this.options.ecmaVersion >= 9 && this.eat(types.star); - } else if (tryContextual("get")) { - method.kind = "get"; - } else if (tryContextual("set")) { - method.kind = "set"; - } - } - if (!method.key) { this.parsePropertyName(method); } - var key = method.key; - var allowsDirectSuper = false; - if (!method.computed && !method.static && (key.type === "Identifier" && key.name === "constructor" || - key.type === "Literal" && key.value === "constructor")) { - if (method.kind !== "method") { this.raise(key.start, "Constructor can't have get/set modifier"); } - if (isGenerator) { this.raise(key.start, "Constructor can't be a generator"); } - if (isAsync) { this.raise(key.start, "Constructor can't be an async method"); } - method.kind = "constructor"; - allowsDirectSuper = constructorAllowsSuper; - } else if (method.static && key.type === "Identifier" && key.name === "prototype") { - this.raise(key.start, "Classes may not have a static property named prototype"); - } - this.parseClassMethod(method, isGenerator, isAsync, allowsDirectSuper); - if (method.kind === "get" && method.value.params.length !== 0) - { this.raiseRecoverable(method.value.start, "getter should have no params"); } - if (method.kind === "set" && method.value.params.length !== 1) - { this.raiseRecoverable(method.value.start, "setter should have exactly one param"); } - if (method.kind === "set" && method.value.params[0].type === "RestElement") - { this.raiseRecoverable(method.value.params[0].start, "Setter cannot use rest params"); } - return method - }; - - pp$1.parseClassMethod = function(method, isGenerator, isAsync, allowsDirectSuper) { - method.value = this.parseMethod(isGenerator, isAsync, allowsDirectSuper); - return this.finishNode(method, "MethodDefinition") - }; - - pp$1.parseClassId = function(node, isStatement) { - if (this.type === types.name) { - node.id = this.parseIdent(); - if (isStatement) - { this.checkLVal(node.id, BIND_LEXICAL, false); } - } else { - if (isStatement === true) - { this.unexpected(); } - node.id = null; - } - }; - - pp$1.parseClassSuper = function(node) { - node.superClass = this.eat(types._extends) ? this.parseExprSubscripts() : null; - }; - - - pp$1.parseExport = function(node, exports) { - this.next(); - if (this.eat(types.star)) { - this.expectContextual("from"); - if (this.type !== types.string) { this.unexpected(); } - node.source = this.parseExprAtom(); - this.semicolon(); - return this.finishNode(node, "ExportAllDeclaration") - } - if (this.eat(types._default)) { - this.checkExport(exports, "default", this.lastTokStart); - var isAsync; - if (this.type === types._function || (isAsync = this.isAsyncFunction())) { - var fNode = this.startNode(); - this.next(); - if (isAsync) { this.next(); } - node.declaration = this.parseFunction(fNode, FUNC_STATEMENT | FUNC_NULLABLE_ID, false, isAsync); - } else if (this.type === types._class) { - var cNode = this.startNode(); - node.declaration = this.parseClass(cNode, "nullableID"); - } else { - node.declaration = this.parseMaybeAssign(); - this.semicolon(); - } - return this.finishNode(node, "ExportDefaultDeclaration") - } - if (this.shouldParseExportStatement()) { - node.declaration = this.parseStatement(null); - if (node.declaration.type === "VariableDeclaration") - { this.checkVariableExport(exports, node.declaration.declarations); } - else - { this.checkExport(exports, node.declaration.id.name, node.declaration.id.start); } - node.specifiers = []; - node.source = null; - } else { - node.declaration = null; - node.specifiers = this.parseExportSpecifiers(exports); - if (this.eatContextual("from")) { - if (this.type !== types.string) { this.unexpected(); } - node.source = this.parseExprAtom(); - } else { - for (var i = 0, list = node.specifiers; i < list.length; i += 1) { - var spec = list[i]; - - this.checkUnreserved(spec.local); - this.checkLocalExport(spec.local); - } - - node.source = null; - } - this.semicolon(); - } - return this.finishNode(node, "ExportNamedDeclaration") - }; - - pp$1.checkExport = function(exports, name, pos) { - if (!exports) { return } - if (has(exports, name)) - { this.raiseRecoverable(pos, "Duplicate export '" + name + "'"); } - exports[name] = true; - }; - - pp$1.checkPatternExport = function(exports, pat) { - var type = pat.type; - if (type === "Identifier") - { this.checkExport(exports, pat.name, pat.start); } - else if (type === "ObjectPattern") - { for (var i = 0, list = pat.properties; i < list.length; i += 1) - { - var prop = list[i]; - - this.checkPatternExport(exports, prop); - } } - else if (type === "ArrayPattern") - { for (var i$1 = 0, list$1 = pat.elements; i$1 < list$1.length; i$1 += 1) { - var elt = list$1[i$1]; - - if (elt) { this.checkPatternExport(exports, elt); } - } } - else if (type === "Property") - { this.checkPatternExport(exports, pat.value); } - else if (type === "AssignmentPattern") - { this.checkPatternExport(exports, pat.left); } - else if (type === "RestElement") - { this.checkPatternExport(exports, pat.argument); } - else if (type === "ParenthesizedExpression") - { this.checkPatternExport(exports, pat.expression); } - }; - - pp$1.checkVariableExport = function(exports, decls) { - if (!exports) { return } - for (var i = 0, list = decls; i < list.length; i += 1) - { - var decl = list[i]; - - this.checkPatternExport(exports, decl.id); - } - }; - - pp$1.shouldParseExportStatement = function() { - return this.type.keyword === "var" || - this.type.keyword === "const" || - this.type.keyword === "class" || - this.type.keyword === "function" || - this.isLet() || - this.isAsyncFunction() - }; - - - pp$1.parseExportSpecifiers = function(exports) { - var nodes = [], first = true; - this.expect(types.braceL); - while (!this.eat(types.braceR)) { - if (!first) { - this.expect(types.comma); - if (this.afterTrailingComma(types.braceR)) { break } - } else { first = false; } - - var node = this.startNode(); - node.local = this.parseIdent(true); - node.exported = this.eatContextual("as") ? this.parseIdent(true) : node.local; - this.checkExport(exports, node.exported.name, node.exported.start); - nodes.push(this.finishNode(node, "ExportSpecifier")); - } - return nodes - }; - - - pp$1.parseImport = function(node) { - this.next(); - if (this.type === types.string) { - node.specifiers = empty; - node.source = this.parseExprAtom(); - } else { - node.specifiers = this.parseImportSpecifiers(); - this.expectContextual("from"); - node.source = this.type === types.string ? this.parseExprAtom() : this.unexpected(); - } - this.semicolon(); - return this.finishNode(node, "ImportDeclaration") - }; - - - pp$1.parseImportSpecifiers = function() { - var nodes = [], first = true; - if (this.type === types.name) { - var node = this.startNode(); - node.local = this.parseIdent(); - this.checkLVal(node.local, BIND_LEXICAL); - nodes.push(this.finishNode(node, "ImportDefaultSpecifier")); - if (!this.eat(types.comma)) { return nodes } - } - if (this.type === types.star) { - var node$1 = this.startNode(); - this.next(); - this.expectContextual("as"); - node$1.local = this.parseIdent(); - this.checkLVal(node$1.local, BIND_LEXICAL); - nodes.push(this.finishNode(node$1, "ImportNamespaceSpecifier")); - return nodes - } - this.expect(types.braceL); - while (!this.eat(types.braceR)) { - if (!first) { - this.expect(types.comma); - if (this.afterTrailingComma(types.braceR)) { break } - } else { first = false; } - - var node$2 = this.startNode(); - node$2.imported = this.parseIdent(true); - if (this.eatContextual("as")) { - node$2.local = this.parseIdent(); - } else { - this.checkUnreserved(node$2.imported); - node$2.local = node$2.imported; - } - this.checkLVal(node$2.local, BIND_LEXICAL); - nodes.push(this.finishNode(node$2, "ImportSpecifier")); - } - return nodes - }; - - pp$1.adaptDirectivePrologue = function(statements) { - for (var i = 0; i < statements.length && this.isDirectiveCandidate(statements[i]); ++i) { - statements[i].directive = statements[i].expression.raw.slice(1, -1); - } - }; - pp$1.isDirectiveCandidate = function(statement) { - return ( - statement.type === "ExpressionStatement" && - statement.expression.type === "Literal" && - typeof statement.expression.value === "string" && - (this.input[statement.start] === "\"" || this.input[statement.start] === "'") - ) - }; - - var pp$2 = Parser.prototype; - - - pp$2.toAssignable = function(node, isBinding, refDestructuringErrors) { - if (this.options.ecmaVersion >= 6 && node) { - switch (node.type) { - case "Identifier": - if (this.inAsync && node.name === "await") - { this.raise(node.start, "Cannot use 'await' as identifier inside an async function"); } - break - - case "ObjectPattern": - case "ArrayPattern": - case "RestElement": - break - - case "ObjectExpression": - node.type = "ObjectPattern"; - if (refDestructuringErrors) { this.checkPatternErrors(refDestructuringErrors, true); } - for (var i = 0, list = node.properties; i < list.length; i += 1) { - var prop = list[i]; - - this.toAssignable(prop, isBinding); - if ( - prop.type === "RestElement" && - (prop.argument.type === "ArrayPattern" || prop.argument.type === "ObjectPattern") - ) { - this.raise(prop.argument.start, "Unexpected token"); - } - } - break - - case "Property": - if (node.kind !== "init") { this.raise(node.key.start, "Object pattern can't contain getter or setter"); } - this.toAssignable(node.value, isBinding); - break - - case "ArrayExpression": - node.type = "ArrayPattern"; - if (refDestructuringErrors) { this.checkPatternErrors(refDestructuringErrors, true); } - this.toAssignableList(node.elements, isBinding); - break - - case "SpreadElement": - node.type = "RestElement"; - this.toAssignable(node.argument, isBinding); - if (node.argument.type === "AssignmentPattern") - { this.raise(node.argument.start, "Rest elements cannot have a default value"); } - break - - case "AssignmentExpression": - if (node.operator !== "=") { this.raise(node.left.end, "Only '=' operator can be used for specifying default value."); } - node.type = "AssignmentPattern"; - delete node.operator; - this.toAssignable(node.left, isBinding); - - case "AssignmentPattern": - break - - case "ParenthesizedExpression": - this.toAssignable(node.expression, isBinding, refDestructuringErrors); - break - - case "MemberExpression": - if (!isBinding) { break } - - default: - this.raise(node.start, "Assigning to rvalue"); - } - } else if (refDestructuringErrors) { this.checkPatternErrors(refDestructuringErrors, true); } - return node - }; - - - pp$2.toAssignableList = function(exprList, isBinding) { - var end = exprList.length; - for (var i = 0; i < end; i++) { - var elt = exprList[i]; - if (elt) { this.toAssignable(elt, isBinding); } - } - if (end) { - var last = exprList[end - 1]; - if (this.options.ecmaVersion === 6 && isBinding && last && last.type === "RestElement" && last.argument.type !== "Identifier") - { this.unexpected(last.argument.start); } - } - return exprList - }; - - - pp$2.parseSpread = function(refDestructuringErrors) { - var node = this.startNode(); - this.next(); - node.argument = this.parseMaybeAssign(false, refDestructuringErrors); - return this.finishNode(node, "SpreadElement") - }; - - pp$2.parseRestBinding = function() { - var node = this.startNode(); - this.next(); - - if (this.options.ecmaVersion === 6 && this.type !== types.name) - { this.unexpected(); } - - node.argument = this.parseBindingAtom(); - - return this.finishNode(node, "RestElement") - }; - - - pp$2.parseBindingAtom = function() { - if (this.options.ecmaVersion >= 6) { - switch (this.type) { - case types.bracketL: - var node = this.startNode(); - this.next(); - node.elements = this.parseBindingList(types.bracketR, true, true); - return this.finishNode(node, "ArrayPattern") - - case types.braceL: - return this.parseObj(true) - } - } - return this.parseIdent() - }; - - pp$2.parseBindingList = function(close, allowEmpty, allowTrailingComma) { - var elts = [], first = true; - while (!this.eat(close)) { - if (first) { first = false; } - else { this.expect(types.comma); } - if (allowEmpty && this.type === types.comma) { - elts.push(null); - } else if (allowTrailingComma && this.afterTrailingComma(close)) { - break - } else if (this.type === types.ellipsis) { - var rest = this.parseRestBinding(); - this.parseBindingListItem(rest); - elts.push(rest); - if (this.type === types.comma) { this.raise(this.start, "Comma is not permitted after the rest element"); } - this.expect(close); - break - } else { - var elem = this.parseMaybeDefault(this.start, this.startLoc); - this.parseBindingListItem(elem); - elts.push(elem); - } - } - return elts - }; - - pp$2.parseBindingListItem = function(param) { - return param - }; - - - pp$2.parseMaybeDefault = function(startPos, startLoc, left) { - left = left || this.parseBindingAtom(); - if (this.options.ecmaVersion < 6 || !this.eat(types.eq)) { return left } - var node = this.startNodeAt(startPos, startLoc); - node.left = left; - node.right = this.parseMaybeAssign(); - return this.finishNode(node, "AssignmentPattern") - }; - - - pp$2.checkLVal = function(expr, bindingType, checkClashes) { - if ( bindingType === void 0 ) bindingType = BIND_NONE; - - switch (expr.type) { - case "Identifier": - if (bindingType === BIND_LEXICAL && expr.name === "let") - { this.raiseRecoverable(expr.start, "let is disallowed as a lexically bound name"); } - if (this.strict && this.reservedWordsStrictBind.test(expr.name)) - { this.raiseRecoverable(expr.start, (bindingType ? "Binding " : "Assigning to ") + expr.name + " in strict mode"); } - if (checkClashes) { - if (has(checkClashes, expr.name)) - { this.raiseRecoverable(expr.start, "Argument name clash"); } - checkClashes[expr.name] = true; - } - if (bindingType !== BIND_NONE && bindingType !== BIND_OUTSIDE) { this.declareName(expr.name, bindingType, expr.start); } - break - - case "MemberExpression": - if (bindingType) { this.raiseRecoverable(expr.start, "Binding member expression"); } - break - - case "ObjectPattern": - for (var i = 0, list = expr.properties; i < list.length; i += 1) - { - var prop = list[i]; - - this.checkLVal(prop, bindingType, checkClashes); - } - break - - case "Property": - this.checkLVal(expr.value, bindingType, checkClashes); - break - - case "ArrayPattern": - for (var i$1 = 0, list$1 = expr.elements; i$1 < list$1.length; i$1 += 1) { - var elem = list$1[i$1]; - - if (elem) { this.checkLVal(elem, bindingType, checkClashes); } - } - break - - case "AssignmentPattern": - this.checkLVal(expr.left, bindingType, checkClashes); - break - - case "RestElement": - this.checkLVal(expr.argument, bindingType, checkClashes); - break - - case "ParenthesizedExpression": - this.checkLVal(expr.expression, bindingType, checkClashes); - break - - default: - this.raise(expr.start, (bindingType ? "Binding" : "Assigning to") + " rvalue"); - } - }; - - - var pp$3 = Parser.prototype; - - - pp$3.checkPropClash = function(prop, propHash, refDestructuringErrors) { - if (this.options.ecmaVersion >= 9 && prop.type === "SpreadElement") - { return } - if (this.options.ecmaVersion >= 6 && (prop.computed || prop.method || prop.shorthand)) - { return } - var key = prop.key; - var name; - switch (key.type) { - case "Identifier": name = key.name; break - case "Literal": name = String(key.value); break - default: return - } - var kind = prop.kind; - if (this.options.ecmaVersion >= 6) { - if (name === "__proto__" && kind === "init") { - if (propHash.proto) { - if (refDestructuringErrors) { - if (refDestructuringErrors.doubleProto < 0) - { refDestructuringErrors.doubleProto = key.start; } - } else { this.raiseRecoverable(key.start, "Redefinition of __proto__ property"); } - } - propHash.proto = true; - } - return - } - name = "$" + name; - var other = propHash[name]; - if (other) { - var redefinition; - if (kind === "init") { - redefinition = this.strict && other.init || other.get || other.set; - } else { - redefinition = other.init || other[kind]; - } - if (redefinition) - { this.raiseRecoverable(key.start, "Redefinition of property"); } - } else { - other = propHash[name] = { - init: false, - get: false, - set: false - }; - } - other[kind] = true; - }; - - - - - pp$3.parseExpression = function(noIn, refDestructuringErrors) { - var startPos = this.start, startLoc = this.startLoc; - var expr = this.parseMaybeAssign(noIn, refDestructuringErrors); - if (this.type === types.comma) { - var node = this.startNodeAt(startPos, startLoc); - node.expressions = [expr]; - while (this.eat(types.comma)) { node.expressions.push(this.parseMaybeAssign(noIn, refDestructuringErrors)); } - return this.finishNode(node, "SequenceExpression") - } - return expr - }; - - - pp$3.parseMaybeAssign = function(noIn, refDestructuringErrors, afterLeftParse) { - if (this.isContextual("yield")) { - if (this.inGenerator) { return this.parseYield(noIn) } - else { this.exprAllowed = false; } - } - - var ownDestructuringErrors = false, oldParenAssign = -1, oldTrailingComma = -1; - if (refDestructuringErrors) { - oldParenAssign = refDestructuringErrors.parenthesizedAssign; - oldTrailingComma = refDestructuringErrors.trailingComma; - refDestructuringErrors.parenthesizedAssign = refDestructuringErrors.trailingComma = -1; - } else { - refDestructuringErrors = new DestructuringErrors; - ownDestructuringErrors = true; - } - - var startPos = this.start, startLoc = this.startLoc; - if (this.type === types.parenL || this.type === types.name) - { this.potentialArrowAt = this.start; } - var left = this.parseMaybeConditional(noIn, refDestructuringErrors); - if (afterLeftParse) { left = afterLeftParse.call(this, left, startPos, startLoc); } - if (this.type.isAssign) { - var node = this.startNodeAt(startPos, startLoc); - node.operator = this.value; - node.left = this.type === types.eq ? this.toAssignable(left, false, refDestructuringErrors) : left; - if (!ownDestructuringErrors) { - refDestructuringErrors.parenthesizedAssign = refDestructuringErrors.trailingComma = refDestructuringErrors.doubleProto = -1; - } - if (refDestructuringErrors.shorthandAssign >= node.left.start) - { refDestructuringErrors.shorthandAssign = -1; } - this.checkLVal(left); - this.next(); - node.right = this.parseMaybeAssign(noIn); - return this.finishNode(node, "AssignmentExpression") - } else { - if (ownDestructuringErrors) { this.checkExpressionErrors(refDestructuringErrors, true); } - } - if (oldParenAssign > -1) { refDestructuringErrors.parenthesizedAssign = oldParenAssign; } - if (oldTrailingComma > -1) { refDestructuringErrors.trailingComma = oldTrailingComma; } - return left - }; - - - pp$3.parseMaybeConditional = function(noIn, refDestructuringErrors) { - var startPos = this.start, startLoc = this.startLoc; - var expr = this.parseExprOps(noIn, refDestructuringErrors); - if (this.checkExpressionErrors(refDestructuringErrors)) { return expr } - if (this.eat(types.question)) { - var node = this.startNodeAt(startPos, startLoc); - node.test = expr; - node.consequent = this.parseMaybeAssign(); - this.expect(types.colon); - node.alternate = this.parseMaybeAssign(noIn); - return this.finishNode(node, "ConditionalExpression") - } - return expr - }; - - - pp$3.parseExprOps = function(noIn, refDestructuringErrors) { - var startPos = this.start, startLoc = this.startLoc; - var expr = this.parseMaybeUnary(refDestructuringErrors, false); - if (this.checkExpressionErrors(refDestructuringErrors)) { return expr } - return expr.start === startPos && expr.type === "ArrowFunctionExpression" ? expr : this.parseExprOp(expr, startPos, startLoc, -1, noIn) - }; - - - pp$3.parseExprOp = function(left, leftStartPos, leftStartLoc, minPrec, noIn) { - var prec = this.type.binop; - if (prec != null && (!noIn || this.type !== types._in)) { - if (prec > minPrec) { - var logical = this.type === types.logicalOR || this.type === types.logicalAND; - var op = this.value; - this.next(); - var startPos = this.start, startLoc = this.startLoc; - var right = this.parseExprOp(this.parseMaybeUnary(null, false), startPos, startLoc, prec, noIn); - var node = this.buildBinary(leftStartPos, leftStartLoc, left, right, op, logical); - return this.parseExprOp(node, leftStartPos, leftStartLoc, minPrec, noIn) - } - } - return left - }; - - pp$3.buildBinary = function(startPos, startLoc, left, right, op, logical) { - var node = this.startNodeAt(startPos, startLoc); - node.left = left; - node.operator = op; - node.right = right; - return this.finishNode(node, logical ? "LogicalExpression" : "BinaryExpression") - }; - - - pp$3.parseMaybeUnary = function(refDestructuringErrors, sawUnary) { - var startPos = this.start, startLoc = this.startLoc, expr; - if (this.isContextual("await") && (this.inAsync || (!this.inFunction && this.options.allowAwaitOutsideFunction))) { - expr = this.parseAwait(); - sawUnary = true; - } else if (this.type.prefix) { - var node = this.startNode(), update = this.type === types.incDec; - node.operator = this.value; - node.prefix = true; - this.next(); - node.argument = this.parseMaybeUnary(null, true); - this.checkExpressionErrors(refDestructuringErrors, true); - if (update) { this.checkLVal(node.argument); } - else if (this.strict && node.operator === "delete" && - node.argument.type === "Identifier") - { this.raiseRecoverable(node.start, "Deleting local variable in strict mode"); } - else { sawUnary = true; } - expr = this.finishNode(node, update ? "UpdateExpression" : "UnaryExpression"); - } else { - expr = this.parseExprSubscripts(refDestructuringErrors); - if (this.checkExpressionErrors(refDestructuringErrors)) { return expr } - while (this.type.postfix && !this.canInsertSemicolon()) { - var node$1 = this.startNodeAt(startPos, startLoc); - node$1.operator = this.value; - node$1.prefix = false; - node$1.argument = expr; - this.checkLVal(expr); - this.next(); - expr = this.finishNode(node$1, "UpdateExpression"); - } - } - - if (!sawUnary && this.eat(types.starstar)) - { return this.buildBinary(startPos, startLoc, expr, this.parseMaybeUnary(null, false), "**", false) } - else - { return expr } - }; - - - pp$3.parseExprSubscripts = function(refDestructuringErrors) { - var startPos = this.start, startLoc = this.startLoc; - var expr = this.parseExprAtom(refDestructuringErrors); - if (expr.type === "ArrowFunctionExpression" && this.input.slice(this.lastTokStart, this.lastTokEnd) !== ")") - { return expr } - var result = this.parseSubscripts(expr, startPos, startLoc); - if (refDestructuringErrors && result.type === "MemberExpression") { - if (refDestructuringErrors.parenthesizedAssign >= result.start) { refDestructuringErrors.parenthesizedAssign = -1; } - if (refDestructuringErrors.parenthesizedBind >= result.start) { refDestructuringErrors.parenthesizedBind = -1; } - } - return result - }; - - pp$3.parseSubscripts = function(base, startPos, startLoc, noCalls) { - var maybeAsyncArrow = this.options.ecmaVersion >= 8 && base.type === "Identifier" && base.name === "async" && - this.lastTokEnd === base.end && !this.canInsertSemicolon() && this.input.slice(base.start, base.end) === "async"; - while (true) { - var element = this.parseSubscript(base, startPos, startLoc, noCalls, maybeAsyncArrow); - if (element === base || element.type === "ArrowFunctionExpression") { return element } - base = element; - } - }; - - pp$3.parseSubscript = function(base, startPos, startLoc, noCalls, maybeAsyncArrow) { - var computed = this.eat(types.bracketL); - if (computed || this.eat(types.dot)) { - var node = this.startNodeAt(startPos, startLoc); - node.object = base; - node.property = computed ? this.parseExpression() : this.parseIdent(this.options.allowReserved !== "never"); - node.computed = !!computed; - if (computed) { this.expect(types.bracketR); } - base = this.finishNode(node, "MemberExpression"); - } else if (!noCalls && this.eat(types.parenL)) { - var refDestructuringErrors = new DestructuringErrors, oldYieldPos = this.yieldPos, oldAwaitPos = this.awaitPos, oldAwaitIdentPos = this.awaitIdentPos; - this.yieldPos = 0; - this.awaitPos = 0; - this.awaitIdentPos = 0; - var exprList = this.parseExprList(types.parenR, this.options.ecmaVersion >= 8, false, refDestructuringErrors); - if (maybeAsyncArrow && !this.canInsertSemicolon() && this.eat(types.arrow)) { - this.checkPatternErrors(refDestructuringErrors, false); - this.checkYieldAwaitInDefaultParams(); - if (this.awaitIdentPos > 0) - { this.raise(this.awaitIdentPos, "Cannot use 'await' as identifier inside an async function"); } - this.yieldPos = oldYieldPos; - this.awaitPos = oldAwaitPos; - this.awaitIdentPos = oldAwaitIdentPos; - return this.parseArrowExpression(this.startNodeAt(startPos, startLoc), exprList, true) - } - this.checkExpressionErrors(refDestructuringErrors, true); - this.yieldPos = oldYieldPos || this.yieldPos; - this.awaitPos = oldAwaitPos || this.awaitPos; - this.awaitIdentPos = oldAwaitIdentPos || this.awaitIdentPos; - var node$1 = this.startNodeAt(startPos, startLoc); - node$1.callee = base; - node$1.arguments = exprList; - base = this.finishNode(node$1, "CallExpression"); - } else if (this.type === types.backQuote) { - var node$2 = this.startNodeAt(startPos, startLoc); - node$2.tag = base; - node$2.quasi = this.parseTemplate({isTagged: true}); - base = this.finishNode(node$2, "TaggedTemplateExpression"); - } - return base - }; - - - pp$3.parseExprAtom = function(refDestructuringErrors) { - if (this.type === types.slash) { this.readRegexp(); } - - var node, canBeArrow = this.potentialArrowAt === this.start; - switch (this.type) { - case types._super: - if (!this.allowSuper) - { this.raise(this.start, "'super' keyword outside a method"); } - node = this.startNode(); - this.next(); - if (this.type === types.parenL && !this.allowDirectSuper) - { this.raise(node.start, "super() call outside constructor of a subclass"); } - if (this.type !== types.dot && this.type !== types.bracketL && this.type !== types.parenL) - { this.unexpected(); } - return this.finishNode(node, "Super") - - case types._this: - node = this.startNode(); - this.next(); - return this.finishNode(node, "ThisExpression") - - case types.name: - var startPos = this.start, startLoc = this.startLoc, containsEsc = this.containsEsc; - var id = this.parseIdent(false); - if (this.options.ecmaVersion >= 8 && !containsEsc && id.name === "async" && !this.canInsertSemicolon() && this.eat(types._function)) - { return this.parseFunction(this.startNodeAt(startPos, startLoc), 0, false, true) } - if (canBeArrow && !this.canInsertSemicolon()) { - if (this.eat(types.arrow)) - { return this.parseArrowExpression(this.startNodeAt(startPos, startLoc), [id], false) } - if (this.options.ecmaVersion >= 8 && id.name === "async" && this.type === types.name && !containsEsc) { - id = this.parseIdent(false); - if (this.canInsertSemicolon() || !this.eat(types.arrow)) - { this.unexpected(); } - return this.parseArrowExpression(this.startNodeAt(startPos, startLoc), [id], true) - } - } - return id - - case types.regexp: - var value = this.value; - node = this.parseLiteral(value.value); - node.regex = {pattern: value.pattern, flags: value.flags}; - return node - - case types.num: case types.string: - return this.parseLiteral(this.value) - - case types._null: case types._true: case types._false: - node = this.startNode(); - node.value = this.type === types._null ? null : this.type === types._true; - node.raw = this.type.keyword; - this.next(); - return this.finishNode(node, "Literal") - - case types.parenL: - var start = this.start, expr = this.parseParenAndDistinguishExpression(canBeArrow); - if (refDestructuringErrors) { - if (refDestructuringErrors.parenthesizedAssign < 0 && !this.isSimpleAssignTarget(expr)) - { refDestructuringErrors.parenthesizedAssign = start; } - if (refDestructuringErrors.parenthesizedBind < 0) - { refDestructuringErrors.parenthesizedBind = start; } - } - return expr - - case types.bracketL: - node = this.startNode(); - this.next(); - node.elements = this.parseExprList(types.bracketR, true, true, refDestructuringErrors); - return this.finishNode(node, "ArrayExpression") - - case types.braceL: - return this.parseObj(false, refDestructuringErrors) - - case types._function: - node = this.startNode(); - this.next(); - return this.parseFunction(node, 0) - - case types._class: - return this.parseClass(this.startNode(), false) - - case types._new: - return this.parseNew() - - case types.backQuote: - return this.parseTemplate() - - case types._import: - if (this.options.ecmaVersion >= 11) { - return this.parseExprImport() - } else { - return this.unexpected() - } - - default: - this.unexpected(); - } - }; - - pp$3.parseExprImport = function() { - var node = this.startNode(); - this.next(); - switch (this.type) { - case types.parenL: - return this.parseDynamicImport(node) - default: - this.unexpected(); - } - }; - - pp$3.parseDynamicImport = function(node) { - this.next(); - - node.source = this.parseMaybeAssign(); - - if (!this.eat(types.parenR)) { - var errorPos = this.start; - if (this.eat(types.comma) && this.eat(types.parenR)) { - this.raiseRecoverable(errorPos, "Trailing comma is not allowed in import()"); - } else { - this.unexpected(errorPos); - } - } - - return this.finishNode(node, "ImportExpression") - }; - - pp$3.parseLiteral = function(value) { - var node = this.startNode(); - node.value = value; - node.raw = this.input.slice(this.start, this.end); - if (node.raw.charCodeAt(node.raw.length - 1) === 110) { node.bigint = node.raw.slice(0, -1); } - this.next(); - return this.finishNode(node, "Literal") - }; - - pp$3.parseParenExpression = function() { - this.expect(types.parenL); - var val = this.parseExpression(); - this.expect(types.parenR); - return val - }; - - pp$3.parseParenAndDistinguishExpression = function(canBeArrow) { - var startPos = this.start, startLoc = this.startLoc, val, allowTrailingComma = this.options.ecmaVersion >= 8; - if (this.options.ecmaVersion >= 6) { - this.next(); - - var innerStartPos = this.start, innerStartLoc = this.startLoc; - var exprList = [], first = true, lastIsComma = false; - var refDestructuringErrors = new DestructuringErrors, oldYieldPos = this.yieldPos, oldAwaitPos = this.awaitPos, spreadStart; - this.yieldPos = 0; - this.awaitPos = 0; - while (this.type !== types.parenR) { - first ? first = false : this.expect(types.comma); - if (allowTrailingComma && this.afterTrailingComma(types.parenR, true)) { - lastIsComma = true; - break - } else if (this.type === types.ellipsis) { - spreadStart = this.start; - exprList.push(this.parseParenItem(this.parseRestBinding())); - if (this.type === types.comma) { this.raise(this.start, "Comma is not permitted after the rest element"); } - break - } else { - exprList.push(this.parseMaybeAssign(false, refDestructuringErrors, this.parseParenItem)); - } - } - var innerEndPos = this.start, innerEndLoc = this.startLoc; - this.expect(types.parenR); - - if (canBeArrow && !this.canInsertSemicolon() && this.eat(types.arrow)) { - this.checkPatternErrors(refDestructuringErrors, false); - this.checkYieldAwaitInDefaultParams(); - this.yieldPos = oldYieldPos; - this.awaitPos = oldAwaitPos; - return this.parseParenArrowList(startPos, startLoc, exprList) - } - - if (!exprList.length || lastIsComma) { this.unexpected(this.lastTokStart); } - if (spreadStart) { this.unexpected(spreadStart); } - this.checkExpressionErrors(refDestructuringErrors, true); - this.yieldPos = oldYieldPos || this.yieldPos; - this.awaitPos = oldAwaitPos || this.awaitPos; - - if (exprList.length > 1) { - val = this.startNodeAt(innerStartPos, innerStartLoc); - val.expressions = exprList; - this.finishNodeAt(val, "SequenceExpression", innerEndPos, innerEndLoc); - } else { - val = exprList[0]; - } - } else { - val = this.parseParenExpression(); - } - - if (this.options.preserveParens) { - var par = this.startNodeAt(startPos, startLoc); - par.expression = val; - return this.finishNode(par, "ParenthesizedExpression") - } else { - return val - } - }; - - pp$3.parseParenItem = function(item) { - return item - }; - - pp$3.parseParenArrowList = function(startPos, startLoc, exprList) { - return this.parseArrowExpression(this.startNodeAt(startPos, startLoc), exprList) - }; - - - var empty$1 = []; - - pp$3.parseNew = function() { - if (this.containsEsc) { this.raiseRecoverable(this.start, "Escape sequence in keyword new"); } - var node = this.startNode(); - var meta = this.parseIdent(true); - if (this.options.ecmaVersion >= 6 && this.eat(types.dot)) { - node.meta = meta; - var containsEsc = this.containsEsc; - node.property = this.parseIdent(true); - if (node.property.name !== "target" || containsEsc) - { this.raiseRecoverable(node.property.start, "The only valid meta property for new is new.target"); } - if (!this.inNonArrowFunction()) - { this.raiseRecoverable(node.start, "new.target can only be used in functions"); } - return this.finishNode(node, "MetaProperty") - } - var startPos = this.start, startLoc = this.startLoc, isImport = this.type === types._import; - node.callee = this.parseSubscripts(this.parseExprAtom(), startPos, startLoc, true); - if (isImport && node.callee.type === "ImportExpression") { - this.raise(startPos, "Cannot use new with import()"); - } - if (this.eat(types.parenL)) { node.arguments = this.parseExprList(types.parenR, this.options.ecmaVersion >= 8, false); } - else { node.arguments = empty$1; } - return this.finishNode(node, "NewExpression") - }; - - - pp$3.parseTemplateElement = function(ref) { - var isTagged = ref.isTagged; - - var elem = this.startNode(); - if (this.type === types.invalidTemplate) { - if (!isTagged) { - this.raiseRecoverable(this.start, "Bad escape sequence in untagged template literal"); - } - elem.value = { - raw: this.value, - cooked: null - }; - } else { - elem.value = { - raw: this.input.slice(this.start, this.end).replace(/\r\n?/g, "\n"), - cooked: this.value - }; - } - this.next(); - elem.tail = this.type === types.backQuote; - return this.finishNode(elem, "TemplateElement") - }; - - pp$3.parseTemplate = function(ref) { - if ( ref === void 0 ) ref = {}; - var isTagged = ref.isTagged; if ( isTagged === void 0 ) isTagged = false; - - var node = this.startNode(); - this.next(); - node.expressions = []; - var curElt = this.parseTemplateElement({isTagged: isTagged}); - node.quasis = [curElt]; - while (!curElt.tail) { - if (this.type === types.eof) { this.raise(this.pos, "Unterminated template literal"); } - this.expect(types.dollarBraceL); - node.expressions.push(this.parseExpression()); - this.expect(types.braceR); - node.quasis.push(curElt = this.parseTemplateElement({isTagged: isTagged})); - } - this.next(); - return this.finishNode(node, "TemplateLiteral") - }; - - pp$3.isAsyncProp = function(prop) { - return !prop.computed && prop.key.type === "Identifier" && prop.key.name === "async" && - (this.type === types.name || this.type === types.num || this.type === types.string || this.type === types.bracketL || this.type.keyword || (this.options.ecmaVersion >= 9 && this.type === types.star)) && - !lineBreak.test(this.input.slice(this.lastTokEnd, this.start)) - }; - - - pp$3.parseObj = function(isPattern, refDestructuringErrors) { - var node = this.startNode(), first = true, propHash = {}; - node.properties = []; - this.next(); - while (!this.eat(types.braceR)) { - if (!first) { - this.expect(types.comma); - if (this.options.ecmaVersion >= 5 && this.afterTrailingComma(types.braceR)) { break } - } else { first = false; } - - var prop = this.parseProperty(isPattern, refDestructuringErrors); - if (!isPattern) { this.checkPropClash(prop, propHash, refDestructuringErrors); } - node.properties.push(prop); - } - return this.finishNode(node, isPattern ? "ObjectPattern" : "ObjectExpression") - }; - - pp$3.parseProperty = function(isPattern, refDestructuringErrors) { - var prop = this.startNode(), isGenerator, isAsync, startPos, startLoc; - if (this.options.ecmaVersion >= 9 && this.eat(types.ellipsis)) { - if (isPattern) { - prop.argument = this.parseIdent(false); - if (this.type === types.comma) { - this.raise(this.start, "Comma is not permitted after the rest element"); - } - return this.finishNode(prop, "RestElement") - } - if (this.type === types.parenL && refDestructuringErrors) { - if (refDestructuringErrors.parenthesizedAssign < 0) { - refDestructuringErrors.parenthesizedAssign = this.start; - } - if (refDestructuringErrors.parenthesizedBind < 0) { - refDestructuringErrors.parenthesizedBind = this.start; - } - } - prop.argument = this.parseMaybeAssign(false, refDestructuringErrors); - if (this.type === types.comma && refDestructuringErrors && refDestructuringErrors.trailingComma < 0) { - refDestructuringErrors.trailingComma = this.start; - } - return this.finishNode(prop, "SpreadElement") - } - if (this.options.ecmaVersion >= 6) { - prop.method = false; - prop.shorthand = false; - if (isPattern || refDestructuringErrors) { - startPos = this.start; - startLoc = this.startLoc; - } - if (!isPattern) - { isGenerator = this.eat(types.star); } - } - var containsEsc = this.containsEsc; - this.parsePropertyName(prop); - if (!isPattern && !containsEsc && this.options.ecmaVersion >= 8 && !isGenerator && this.isAsyncProp(prop)) { - isAsync = true; - isGenerator = this.options.ecmaVersion >= 9 && this.eat(types.star); - this.parsePropertyName(prop, refDestructuringErrors); - } else { - isAsync = false; - } - this.parsePropertyValue(prop, isPattern, isGenerator, isAsync, startPos, startLoc, refDestructuringErrors, containsEsc); - return this.finishNode(prop, "Property") - }; - - pp$3.parsePropertyValue = function(prop, isPattern, isGenerator, isAsync, startPos, startLoc, refDestructuringErrors, containsEsc) { - if ((isGenerator || isAsync) && this.type === types.colon) - { this.unexpected(); } - - if (this.eat(types.colon)) { - prop.value = isPattern ? this.parseMaybeDefault(this.start, this.startLoc) : this.parseMaybeAssign(false, refDestructuringErrors); - prop.kind = "init"; - } else if (this.options.ecmaVersion >= 6 && this.type === types.parenL) { - if (isPattern) { this.unexpected(); } - prop.kind = "init"; - prop.method = true; - prop.value = this.parseMethod(isGenerator, isAsync); - } else if (!isPattern && !containsEsc && - this.options.ecmaVersion >= 5 && !prop.computed && prop.key.type === "Identifier" && - (prop.key.name === "get" || prop.key.name === "set") && - (this.type !== types.comma && this.type !== types.braceR)) { - if (isGenerator || isAsync) { this.unexpected(); } - prop.kind = prop.key.name; - this.parsePropertyName(prop); - prop.value = this.parseMethod(false); - var paramCount = prop.kind === "get" ? 0 : 1; - if (prop.value.params.length !== paramCount) { - var start = prop.value.start; - if (prop.kind === "get") - { this.raiseRecoverable(start, "getter should have no params"); } - else - { this.raiseRecoverable(start, "setter should have exactly one param"); } - } else { - if (prop.kind === "set" && prop.value.params[0].type === "RestElement") - { this.raiseRecoverable(prop.value.params[0].start, "Setter cannot use rest params"); } - } - } else if (this.options.ecmaVersion >= 6 && !prop.computed && prop.key.type === "Identifier") { - if (isGenerator || isAsync) { this.unexpected(); } - this.checkUnreserved(prop.key); - if (prop.key.name === "await" && !this.awaitIdentPos) - { this.awaitIdentPos = startPos; } - prop.kind = "init"; - if (isPattern) { - prop.value = this.parseMaybeDefault(startPos, startLoc, prop.key); - } else if (this.type === types.eq && refDestructuringErrors) { - if (refDestructuringErrors.shorthandAssign < 0) - { refDestructuringErrors.shorthandAssign = this.start; } - prop.value = this.parseMaybeDefault(startPos, startLoc, prop.key); - } else { - prop.value = prop.key; - } - prop.shorthand = true; - } else { this.unexpected(); } - }; - - pp$3.parsePropertyName = function(prop) { - if (this.options.ecmaVersion >= 6) { - if (this.eat(types.bracketL)) { - prop.computed = true; - prop.key = this.parseMaybeAssign(); - this.expect(types.bracketR); - return prop.key - } else { - prop.computed = false; - } - } - return prop.key = this.type === types.num || this.type === types.string ? this.parseExprAtom() : this.parseIdent(this.options.allowReserved !== "never") - }; - - - pp$3.initFunction = function(node) { - node.id = null; - if (this.options.ecmaVersion >= 6) { node.generator = node.expression = false; } - if (this.options.ecmaVersion >= 8) { node.async = false; } - }; - - - pp$3.parseMethod = function(isGenerator, isAsync, allowDirectSuper) { - var node = this.startNode(), oldYieldPos = this.yieldPos, oldAwaitPos = this.awaitPos, oldAwaitIdentPos = this.awaitIdentPos; - - this.initFunction(node); - if (this.options.ecmaVersion >= 6) - { node.generator = isGenerator; } - if (this.options.ecmaVersion >= 8) - { node.async = !!isAsync; } - - this.yieldPos = 0; - this.awaitPos = 0; - this.awaitIdentPos = 0; - this.enterScope(functionFlags(isAsync, node.generator) | SCOPE_SUPER | (allowDirectSuper ? SCOPE_DIRECT_SUPER : 0)); - - this.expect(types.parenL); - node.params = this.parseBindingList(types.parenR, false, this.options.ecmaVersion >= 8); - this.checkYieldAwaitInDefaultParams(); - this.parseFunctionBody(node, false, true); - - this.yieldPos = oldYieldPos; - this.awaitPos = oldAwaitPos; - this.awaitIdentPos = oldAwaitIdentPos; - return this.finishNode(node, "FunctionExpression") - }; - - - pp$3.parseArrowExpression = function(node, params, isAsync) { - var oldYieldPos = this.yieldPos, oldAwaitPos = this.awaitPos, oldAwaitIdentPos = this.awaitIdentPos; - - this.enterScope(functionFlags(isAsync, false) | SCOPE_ARROW); - this.initFunction(node); - if (this.options.ecmaVersion >= 8) { node.async = !!isAsync; } - - this.yieldPos = 0; - this.awaitPos = 0; - this.awaitIdentPos = 0; - - node.params = this.toAssignableList(params, true); - this.parseFunctionBody(node, true, false); - - this.yieldPos = oldYieldPos; - this.awaitPos = oldAwaitPos; - this.awaitIdentPos = oldAwaitIdentPos; - return this.finishNode(node, "ArrowFunctionExpression") - }; - - - pp$3.parseFunctionBody = function(node, isArrowFunction, isMethod) { - var isExpression = isArrowFunction && this.type !== types.braceL; - var oldStrict = this.strict, useStrict = false; - - if (isExpression) { - node.body = this.parseMaybeAssign(); - node.expression = true; - this.checkParams(node, false); - } else { - var nonSimple = this.options.ecmaVersion >= 7 && !this.isSimpleParamList(node.params); - if (!oldStrict || nonSimple) { - useStrict = this.strictDirective(this.end); - if (useStrict && nonSimple) - { this.raiseRecoverable(node.start, "Illegal 'use strict' directive in function with non-simple parameter list"); } - } - var oldLabels = this.labels; - this.labels = []; - if (useStrict) { this.strict = true; } - - this.checkParams(node, !oldStrict && !useStrict && !isArrowFunction && !isMethod && this.isSimpleParamList(node.params)); - node.body = this.parseBlock(false); - node.expression = false; - this.adaptDirectivePrologue(node.body.body); - this.labels = oldLabels; - } - this.exitScope(); - - if (this.strict && node.id) { this.checkLVal(node.id, BIND_OUTSIDE); } - this.strict = oldStrict; - }; - - pp$3.isSimpleParamList = function(params) { - for (var i = 0, list = params; i < list.length; i += 1) - { - var param = list[i]; - - if (param.type !== "Identifier") { return false - } } - return true - }; - - - pp$3.checkParams = function(node, allowDuplicates) { - var nameHash = {}; - for (var i = 0, list = node.params; i < list.length; i += 1) - { - var param = list[i]; - - this.checkLVal(param, BIND_VAR, allowDuplicates ? null : nameHash); - } - }; - - - pp$3.parseExprList = function(close, allowTrailingComma, allowEmpty, refDestructuringErrors) { - var elts = [], first = true; - while (!this.eat(close)) { - if (!first) { - this.expect(types.comma); - if (allowTrailingComma && this.afterTrailingComma(close)) { break } - } else { first = false; } - - var elt = (void 0); - if (allowEmpty && this.type === types.comma) - { elt = null; } - else if (this.type === types.ellipsis) { - elt = this.parseSpread(refDestructuringErrors); - if (refDestructuringErrors && this.type === types.comma && refDestructuringErrors.trailingComma < 0) - { refDestructuringErrors.trailingComma = this.start; } - } else { - elt = this.parseMaybeAssign(false, refDestructuringErrors); - } - elts.push(elt); - } - return elts - }; - - pp$3.checkUnreserved = function(ref) { - var start = ref.start; - var end = ref.end; - var name = ref.name; - - if (this.inGenerator && name === "yield") - { this.raiseRecoverable(start, "Cannot use 'yield' as identifier inside a generator"); } - if (this.inAsync && name === "await") - { this.raiseRecoverable(start, "Cannot use 'await' as identifier inside an async function"); } - if (this.keywords.test(name)) - { this.raise(start, ("Unexpected keyword '" + name + "'")); } - if (this.options.ecmaVersion < 6 && - this.input.slice(start, end).indexOf("\\") !== -1) { return } - var re = this.strict ? this.reservedWordsStrict : this.reservedWords; - if (re.test(name)) { - if (!this.inAsync && name === "await") - { this.raiseRecoverable(start, "Cannot use keyword 'await' outside an async function"); } - this.raiseRecoverable(start, ("The keyword '" + name + "' is reserved")); - } - }; - - - pp$3.parseIdent = function(liberal, isBinding) { - var node = this.startNode(); - if (this.type === types.name) { - node.name = this.value; - } else if (this.type.keyword) { - node.name = this.type.keyword; - - if ((node.name === "class" || node.name === "function") && - (this.lastTokEnd !== this.lastTokStart + 1 || this.input.charCodeAt(this.lastTokStart) !== 46)) { - this.context.pop(); - } - } else { - this.unexpected(); - } - this.next(!!liberal); - this.finishNode(node, "Identifier"); - if (!liberal) { - this.checkUnreserved(node); - if (node.name === "await" && !this.awaitIdentPos) - { this.awaitIdentPos = node.start; } - } - return node - }; - - - pp$3.parseYield = function(noIn) { - if (!this.yieldPos) { this.yieldPos = this.start; } - - var node = this.startNode(); - this.next(); - if (this.type === types.semi || this.canInsertSemicolon() || (this.type !== types.star && !this.type.startsExpr)) { - node.delegate = false; - node.argument = null; - } else { - node.delegate = this.eat(types.star); - node.argument = this.parseMaybeAssign(noIn); - } - return this.finishNode(node, "YieldExpression") - }; - - pp$3.parseAwait = function() { - if (!this.awaitPos) { this.awaitPos = this.start; } - - var node = this.startNode(); - this.next(); - node.argument = this.parseMaybeUnary(null, false); - return this.finishNode(node, "AwaitExpression") - }; - - var pp$4 = Parser.prototype; - - - pp$4.raise = function(pos, message) { - var loc = getLineInfo(this.input, pos); - message += " (" + loc.line + ":" + loc.column + ")"; - var err = new SyntaxError(message); - err.pos = pos; err.loc = loc; err.raisedAt = this.pos; - throw err - }; - - pp$4.raiseRecoverable = pp$4.raise; - - pp$4.curPosition = function() { - if (this.options.locations) { - return new Position(this.curLine, this.pos - this.lineStart) - } - }; - - var pp$5 = Parser.prototype; - - var Scope = function Scope(flags) { - this.flags = flags; - this.var = []; - this.lexical = []; - this.functions = []; - }; - - - pp$5.enterScope = function(flags) { - this.scopeStack.push(new Scope(flags)); - }; - - pp$5.exitScope = function() { - this.scopeStack.pop(); - }; - - pp$5.treatFunctionsAsVarInScope = function(scope) { - return (scope.flags & SCOPE_FUNCTION) || !this.inModule && (scope.flags & SCOPE_TOP) - }; - - pp$5.declareName = function(name, bindingType, pos) { - var redeclared = false; - if (bindingType === BIND_LEXICAL) { - var scope = this.currentScope(); - redeclared = scope.lexical.indexOf(name) > -1 || scope.functions.indexOf(name) > -1 || scope.var.indexOf(name) > -1; - scope.lexical.push(name); - if (this.inModule && (scope.flags & SCOPE_TOP)) - { delete this.undefinedExports[name]; } - } else if (bindingType === BIND_SIMPLE_CATCH) { - var scope$1 = this.currentScope(); - scope$1.lexical.push(name); - } else if (bindingType === BIND_FUNCTION) { - var scope$2 = this.currentScope(); - if (this.treatFunctionsAsVar) - { redeclared = scope$2.lexical.indexOf(name) > -1; } - else - { redeclared = scope$2.lexical.indexOf(name) > -1 || scope$2.var.indexOf(name) > -1; } - scope$2.functions.push(name); - } else { - for (var i = this.scopeStack.length - 1; i >= 0; --i) { - var scope$3 = this.scopeStack[i]; - if (scope$3.lexical.indexOf(name) > -1 && !((scope$3.flags & SCOPE_SIMPLE_CATCH) && scope$3.lexical[0] === name) || - !this.treatFunctionsAsVarInScope(scope$3) && scope$3.functions.indexOf(name) > -1) { - redeclared = true; - break - } - scope$3.var.push(name); - if (this.inModule && (scope$3.flags & SCOPE_TOP)) - { delete this.undefinedExports[name]; } - if (scope$3.flags & SCOPE_VAR) { break } - } - } - if (redeclared) { this.raiseRecoverable(pos, ("Identifier '" + name + "' has already been declared")); } - }; - - pp$5.checkLocalExport = function(id) { - if (this.scopeStack[0].lexical.indexOf(id.name) === -1 && - this.scopeStack[0].var.indexOf(id.name) === -1) { - this.undefinedExports[id.name] = id; - } - }; - - pp$5.currentScope = function() { - return this.scopeStack[this.scopeStack.length - 1] - }; - - pp$5.currentVarScope = function() { - for (var i = this.scopeStack.length - 1;; i--) { - var scope = this.scopeStack[i]; - if (scope.flags & SCOPE_VAR) { return scope } - } - }; - - pp$5.currentThisScope = function() { - for (var i = this.scopeStack.length - 1;; i--) { - var scope = this.scopeStack[i]; - if (scope.flags & SCOPE_VAR && !(scope.flags & SCOPE_ARROW)) { return scope } - } - }; - - var Node = function Node(parser, pos, loc) { - this.type = ""; - this.start = pos; - this.end = 0; - if (parser.options.locations) - { this.loc = new SourceLocation(parser, loc); } - if (parser.options.directSourceFile) - { this.sourceFile = parser.options.directSourceFile; } - if (parser.options.ranges) - { this.range = [pos, 0]; } - }; - - - var pp$6 = Parser.prototype; - - pp$6.startNode = function() { - return new Node(this, this.start, this.startLoc) - }; - - pp$6.startNodeAt = function(pos, loc) { - return new Node(this, pos, loc) - }; - - - function finishNodeAt(node, type, pos, loc) { - node.type = type; - node.end = pos; - if (this.options.locations) - { node.loc.end = loc; } - if (this.options.ranges) - { node.range[1] = pos; } - return node - } - - pp$6.finishNode = function(node, type) { - return finishNodeAt.call(this, node, type, this.lastTokEnd, this.lastTokEndLoc) - }; - - - pp$6.finishNodeAt = function(node, type, pos, loc) { - return finishNodeAt.call(this, node, type, pos, loc) - }; - - - var TokContext = function TokContext(token, isExpr, preserveSpace, override, generator) { - this.token = token; - this.isExpr = !!isExpr; - this.preserveSpace = !!preserveSpace; - this.override = override; - this.generator = !!generator; - }; - - var types$1 = { - b_stat: new TokContext("{", false), - b_expr: new TokContext("{", true), - b_tmpl: new TokContext("${", false), - p_stat: new TokContext("(", false), - p_expr: new TokContext("(", true), - q_tmpl: new TokContext("`", true, true, function (p) { return p.tryReadTemplateToken(); }), - f_stat: new TokContext("function", false), - f_expr: new TokContext("function", true), - f_expr_gen: new TokContext("function", true, false, null, true), - f_gen: new TokContext("function", false, false, null, true) - }; - - var pp$7 = Parser.prototype; - - pp$7.initialContext = function() { - return [types$1.b_stat] - }; - - pp$7.braceIsBlock = function(prevType) { - var parent = this.curContext(); - if (parent === types$1.f_expr || parent === types$1.f_stat) - { return true } - if (prevType === types.colon && (parent === types$1.b_stat || parent === types$1.b_expr)) - { return !parent.isExpr } - - if (prevType === types._return || prevType === types.name && this.exprAllowed) - { return lineBreak.test(this.input.slice(this.lastTokEnd, this.start)) } - if (prevType === types._else || prevType === types.semi || prevType === types.eof || prevType === types.parenR || prevType === types.arrow) - { return true } - if (prevType === types.braceL) - { return parent === types$1.b_stat } - if (prevType === types._var || prevType === types._const || prevType === types.name) - { return false } - return !this.exprAllowed - }; - - pp$7.inGeneratorContext = function() { - for (var i = this.context.length - 1; i >= 1; i--) { - var context = this.context[i]; - if (context.token === "function") - { return context.generator } - } - return false - }; - - pp$7.updateContext = function(prevType) { - var update, type = this.type; - if (type.keyword && prevType === types.dot) - { this.exprAllowed = false; } - else if (update = type.updateContext) - { update.call(this, prevType); } - else - { this.exprAllowed = type.beforeExpr; } - }; - - - types.parenR.updateContext = types.braceR.updateContext = function() { - if (this.context.length === 1) { - this.exprAllowed = true; - return - } - var out = this.context.pop(); - if (out === types$1.b_stat && this.curContext().token === "function") { - out = this.context.pop(); - } - this.exprAllowed = !out.isExpr; - }; - - types.braceL.updateContext = function(prevType) { - this.context.push(this.braceIsBlock(prevType) ? types$1.b_stat : types$1.b_expr); - this.exprAllowed = true; - }; - - types.dollarBraceL.updateContext = function() { - this.context.push(types$1.b_tmpl); - this.exprAllowed = true; - }; - - types.parenL.updateContext = function(prevType) { - var statementParens = prevType === types._if || prevType === types._for || prevType === types._with || prevType === types._while; - this.context.push(statementParens ? types$1.p_stat : types$1.p_expr); - this.exprAllowed = true; - }; - - types.incDec.updateContext = function() { - }; - - types._function.updateContext = types._class.updateContext = function(prevType) { - if (prevType.beforeExpr && prevType !== types.semi && prevType !== types._else && - !(prevType === types._return && lineBreak.test(this.input.slice(this.lastTokEnd, this.start))) && - !((prevType === types.colon || prevType === types.braceL) && this.curContext() === types$1.b_stat)) - { this.context.push(types$1.f_expr); } - else - { this.context.push(types$1.f_stat); } - this.exprAllowed = false; - }; - - types.backQuote.updateContext = function() { - if (this.curContext() === types$1.q_tmpl) - { this.context.pop(); } - else - { this.context.push(types$1.q_tmpl); } - this.exprAllowed = false; - }; - - types.star.updateContext = function(prevType) { - if (prevType === types._function) { - var index = this.context.length - 1; - if (this.context[index] === types$1.f_expr) - { this.context[index] = types$1.f_expr_gen; } - else - { this.context[index] = types$1.f_gen; } - } - this.exprAllowed = true; - }; - - types.name.updateContext = function(prevType) { - var allowed = false; - if (this.options.ecmaVersion >= 6 && prevType !== types.dot) { - if (this.value === "of" && !this.exprAllowed || - this.value === "yield" && this.inGeneratorContext()) - { allowed = true; } - } - this.exprAllowed = allowed; - }; - - - var ecma9BinaryProperties = "ASCII ASCII_Hex_Digit AHex Alphabetic Alpha Any Assigned Bidi_Control Bidi_C Bidi_Mirrored Bidi_M Case_Ignorable CI Cased Changes_When_Casefolded CWCF Changes_When_Casemapped CWCM Changes_When_Lowercased CWL Changes_When_NFKC_Casefolded CWKCF Changes_When_Titlecased CWT Changes_When_Uppercased CWU Dash Default_Ignorable_Code_Point DI Deprecated Dep Diacritic Dia Emoji Emoji_Component Emoji_Modifier Emoji_Modifier_Base Emoji_Presentation Extender Ext Grapheme_Base Gr_Base Grapheme_Extend Gr_Ext Hex_Digit Hex IDS_Binary_Operator IDSB IDS_Trinary_Operator IDST ID_Continue IDC ID_Start IDS Ideographic Ideo Join_Control Join_C Logical_Order_Exception LOE Lowercase Lower Math Noncharacter_Code_Point NChar Pattern_Syntax Pat_Syn Pattern_White_Space Pat_WS Quotation_Mark QMark Radical Regional_Indicator RI Sentence_Terminal STerm Soft_Dotted SD Terminal_Punctuation Term Unified_Ideograph UIdeo Uppercase Upper Variation_Selector VS White_Space space XID_Continue XIDC XID_Start XIDS"; - var ecma10BinaryProperties = ecma9BinaryProperties + " Extended_Pictographic"; - var ecma11BinaryProperties = ecma10BinaryProperties; - var unicodeBinaryProperties = { - 9: ecma9BinaryProperties, - 10: ecma10BinaryProperties, - 11: ecma11BinaryProperties - }; - - var unicodeGeneralCategoryValues = "Cased_Letter LC Close_Punctuation Pe Connector_Punctuation Pc Control Cc cntrl Currency_Symbol Sc Dash_Punctuation Pd Decimal_Number Nd digit Enclosing_Mark Me Final_Punctuation Pf Format Cf Initial_Punctuation Pi Letter L Letter_Number Nl Line_Separator Zl Lowercase_Letter Ll Mark M Combining_Mark Math_Symbol Sm Modifier_Letter Lm Modifier_Symbol Sk Nonspacing_Mark Mn Number N Open_Punctuation Ps Other C Other_Letter Lo Other_Number No Other_Punctuation Po Other_Symbol So Paragraph_Separator Zp Private_Use Co Punctuation P punct Separator Z Space_Separator Zs Spacing_Mark Mc Surrogate Cs Symbol S Titlecase_Letter Lt Unassigned Cn Uppercase_Letter Lu"; - - var ecma9ScriptValues = "Adlam Adlm Ahom Ahom Anatolian_Hieroglyphs Hluw Arabic Arab Armenian Armn Avestan Avst Balinese Bali Bamum Bamu Bassa_Vah Bass Batak Batk Bengali Beng Bhaiksuki Bhks Bopomofo Bopo Brahmi Brah Braille Brai Buginese Bugi Buhid Buhd Canadian_Aboriginal Cans Carian Cari Caucasian_Albanian Aghb Chakma Cakm Cham Cham Cherokee Cher Common Zyyy Coptic Copt Qaac Cuneiform Xsux Cypriot Cprt Cyrillic Cyrl Deseret Dsrt Devanagari Deva Duployan Dupl Egyptian_Hieroglyphs Egyp Elbasan Elba Ethiopic Ethi Georgian Geor Glagolitic Glag Gothic Goth Grantha Gran Greek Grek Gujarati Gujr Gurmukhi Guru Han Hani Hangul Hang Hanunoo Hano Hatran Hatr Hebrew Hebr Hiragana Hira Imperial_Aramaic Armi Inherited Zinh Qaai Inscriptional_Pahlavi Phli Inscriptional_Parthian Prti Javanese Java Kaithi Kthi Kannada Knda Katakana Kana Kayah_Li Kali Kharoshthi Khar Khmer Khmr Khojki Khoj Khudawadi Sind Lao Laoo Latin Latn Lepcha Lepc Limbu Limb Linear_A Lina Linear_B Linb Lisu Lisu Lycian Lyci Lydian Lydi Mahajani Mahj Malayalam Mlym Mandaic Mand Manichaean Mani Marchen Marc Masaram_Gondi Gonm Meetei_Mayek Mtei Mende_Kikakui Mend Meroitic_Cursive Merc Meroitic_Hieroglyphs Mero Miao Plrd Modi Modi Mongolian Mong Mro Mroo Multani Mult Myanmar Mymr Nabataean Nbat New_Tai_Lue Talu Newa Newa Nko Nkoo Nushu Nshu Ogham Ogam Ol_Chiki Olck Old_Hungarian Hung Old_Italic Ital Old_North_Arabian Narb Old_Permic Perm Old_Persian Xpeo Old_South_Arabian Sarb Old_Turkic Orkh Oriya Orya Osage Osge Osmanya Osma Pahawh_Hmong Hmng Palmyrene Palm Pau_Cin_Hau Pauc Phags_Pa Phag Phoenician Phnx Psalter_Pahlavi Phlp Rejang Rjng Runic Runr Samaritan Samr Saurashtra Saur Sharada Shrd Shavian Shaw Siddham Sidd SignWriting Sgnw Sinhala Sinh Sora_Sompeng Sora Soyombo Soyo Sundanese Sund Syloti_Nagri Sylo Syriac Syrc Tagalog Tglg Tagbanwa Tagb Tai_Le Tale Tai_Tham Lana Tai_Viet Tavt Takri Takr Tamil Taml Tangut Tang Telugu Telu Thaana Thaa Thai Thai Tibetan Tibt Tifinagh Tfng Tirhuta Tirh Ugaritic Ugar Vai Vaii Warang_Citi Wara Yi Yiii Zanabazar_Square Zanb"; - var ecma10ScriptValues = ecma9ScriptValues + " Dogra Dogr Gunjala_Gondi Gong Hanifi_Rohingya Rohg Makasar Maka Medefaidrin Medf Old_Sogdian Sogo Sogdian Sogd"; - var ecma11ScriptValues = ecma10ScriptValues + " Elymaic Elym Nandinagari Nand Nyiakeng_Puachue_Hmong Hmnp Wancho Wcho"; - var unicodeScriptValues = { - 9: ecma9ScriptValues, - 10: ecma10ScriptValues, - 11: ecma11ScriptValues - }; - - var data = {}; - function buildUnicodeData(ecmaVersion) { - var d = data[ecmaVersion] = { - binary: wordsRegexp(unicodeBinaryProperties[ecmaVersion] + " " + unicodeGeneralCategoryValues), - nonBinary: { - General_Category: wordsRegexp(unicodeGeneralCategoryValues), - Script: wordsRegexp(unicodeScriptValues[ecmaVersion]) - } - }; - d.nonBinary.Script_Extensions = d.nonBinary.Script; - - d.nonBinary.gc = d.nonBinary.General_Category; - d.nonBinary.sc = d.nonBinary.Script; - d.nonBinary.scx = d.nonBinary.Script_Extensions; - } - buildUnicodeData(9); - buildUnicodeData(10); - buildUnicodeData(11); - - var pp$8 = Parser.prototype; - - var RegExpValidationState = function RegExpValidationState(parser) { - this.parser = parser; - this.validFlags = "gim" + (parser.options.ecmaVersion >= 6 ? "uy" : "") + (parser.options.ecmaVersion >= 9 ? "s" : ""); - this.unicodeProperties = data[parser.options.ecmaVersion >= 11 ? 11 : parser.options.ecmaVersion]; - this.source = ""; - this.flags = ""; - this.start = 0; - this.switchU = false; - this.switchN = false; - this.pos = 0; - this.lastIntValue = 0; - this.lastStringValue = ""; - this.lastAssertionIsQuantifiable = false; - this.numCapturingParens = 0; - this.maxBackReference = 0; - this.groupNames = []; - this.backReferenceNames = []; - }; - - RegExpValidationState.prototype.reset = function reset (start, pattern, flags) { - var unicode = flags.indexOf("u") !== -1; - this.start = start | 0; - this.source = pattern + ""; - this.flags = flags; - this.switchU = unicode && this.parser.options.ecmaVersion >= 6; - this.switchN = unicode && this.parser.options.ecmaVersion >= 9; - }; - - RegExpValidationState.prototype.raise = function raise (message) { - this.parser.raiseRecoverable(this.start, ("Invalid regular expression: /" + (this.source) + "/: " + message)); - }; - - RegExpValidationState.prototype.at = function at (i) { - var s = this.source; - var l = s.length; - if (i >= l) { - return -1 - } - var c = s.charCodeAt(i); - if (!this.switchU || c <= 0xD7FF || c >= 0xE000 || i + 1 >= l) { - return c - } - var next = s.charCodeAt(i + 1); - return next >= 0xDC00 && next <= 0xDFFF ? (c << 10) + next - 0x35FDC00 : c - }; - - RegExpValidationState.prototype.nextIndex = function nextIndex (i) { - var s = this.source; - var l = s.length; - if (i >= l) { - return l - } - var c = s.charCodeAt(i), next; - if (!this.switchU || c <= 0xD7FF || c >= 0xE000 || i + 1 >= l || - (next = s.charCodeAt(i + 1)) < 0xDC00 || next > 0xDFFF) { - return i + 1 - } - return i + 2 - }; - - RegExpValidationState.prototype.current = function current () { - return this.at(this.pos) - }; - - RegExpValidationState.prototype.lookahead = function lookahead () { - return this.at(this.nextIndex(this.pos)) - }; - - RegExpValidationState.prototype.advance = function advance () { - this.pos = this.nextIndex(this.pos); - }; - - RegExpValidationState.prototype.eat = function eat (ch) { - if (this.current() === ch) { - this.advance(); - return true - } - return false - }; - - function codePointToString(ch) { - if (ch <= 0xFFFF) { return String.fromCharCode(ch) } - ch -= 0x10000; - return String.fromCharCode((ch >> 10) + 0xD800, (ch & 0x03FF) + 0xDC00) - } - - pp$8.validateRegExpFlags = function(state) { - var validFlags = state.validFlags; - var flags = state.flags; - - for (var i = 0; i < flags.length; i++) { - var flag = flags.charAt(i); - if (validFlags.indexOf(flag) === -1) { - this.raise(state.start, "Invalid regular expression flag"); - } - if (flags.indexOf(flag, i + 1) > -1) { - this.raise(state.start, "Duplicate regular expression flag"); - } - } - }; - - pp$8.validateRegExpPattern = function(state) { - this.regexp_pattern(state); - - if (!state.switchN && this.options.ecmaVersion >= 9 && state.groupNames.length > 0) { - state.switchN = true; - this.regexp_pattern(state); - } - }; - - pp$8.regexp_pattern = function(state) { - state.pos = 0; - state.lastIntValue = 0; - state.lastStringValue = ""; - state.lastAssertionIsQuantifiable = false; - state.numCapturingParens = 0; - state.maxBackReference = 0; - state.groupNames.length = 0; - state.backReferenceNames.length = 0; - - this.regexp_disjunction(state); - - if (state.pos !== state.source.length) { - if (state.eat(0x29 )) { - state.raise("Unmatched ')'"); - } - if (state.eat(0x5D ) || state.eat(0x7D )) { - state.raise("Lone quantifier brackets"); - } - } - if (state.maxBackReference > state.numCapturingParens) { - state.raise("Invalid escape"); - } - for (var i = 0, list = state.backReferenceNames; i < list.length; i += 1) { - var name = list[i]; - - if (state.groupNames.indexOf(name) === -1) { - state.raise("Invalid named capture referenced"); - } - } - }; - - pp$8.regexp_disjunction = function(state) { - this.regexp_alternative(state); - while (state.eat(0x7C )) { - this.regexp_alternative(state); - } - - if (this.regexp_eatQuantifier(state, true)) { - state.raise("Nothing to repeat"); - } - if (state.eat(0x7B )) { - state.raise("Lone quantifier brackets"); - } - }; - - pp$8.regexp_alternative = function(state) { - while (state.pos < state.source.length && this.regexp_eatTerm(state)) - { } - }; - - pp$8.regexp_eatTerm = function(state) { - if (this.regexp_eatAssertion(state)) { - if (state.lastAssertionIsQuantifiable && this.regexp_eatQuantifier(state)) { - if (state.switchU) { - state.raise("Invalid quantifier"); - } - } - return true - } - - if (state.switchU ? this.regexp_eatAtom(state) : this.regexp_eatExtendedAtom(state)) { - this.regexp_eatQuantifier(state); - return true - } - - return false - }; - - pp$8.regexp_eatAssertion = function(state) { - var start = state.pos; - state.lastAssertionIsQuantifiable = false; - - if (state.eat(0x5E ) || state.eat(0x24 )) { - return true - } - - if (state.eat(0x5C )) { - if (state.eat(0x42 ) || state.eat(0x62 )) { - return true - } - state.pos = start; - } - - if (state.eat(0x28 ) && state.eat(0x3F )) { - var lookbehind = false; - if (this.options.ecmaVersion >= 9) { - lookbehind = state.eat(0x3C ); - } - if (state.eat(0x3D ) || state.eat(0x21 )) { - this.regexp_disjunction(state); - if (!state.eat(0x29 )) { - state.raise("Unterminated group"); - } - state.lastAssertionIsQuantifiable = !lookbehind; - return true - } - } - - state.pos = start; - return false - }; - - pp$8.regexp_eatQuantifier = function(state, noError) { - if ( noError === void 0 ) noError = false; - - if (this.regexp_eatQuantifierPrefix(state, noError)) { - state.eat(0x3F ); - return true - } - return false - }; - - pp$8.regexp_eatQuantifierPrefix = function(state, noError) { - return ( - state.eat(0x2A ) || - state.eat(0x2B ) || - state.eat(0x3F ) || - this.regexp_eatBracedQuantifier(state, noError) - ) - }; - pp$8.regexp_eatBracedQuantifier = function(state, noError) { - var start = state.pos; - if (state.eat(0x7B )) { - var min = 0, max = -1; - if (this.regexp_eatDecimalDigits(state)) { - min = state.lastIntValue; - if (state.eat(0x2C ) && this.regexp_eatDecimalDigits(state)) { - max = state.lastIntValue; - } - if (state.eat(0x7D )) { - if (max !== -1 && max < min && !noError) { - state.raise("numbers out of order in {} quantifier"); - } - return true - } - } - if (state.switchU && !noError) { - state.raise("Incomplete quantifier"); - } - state.pos = start; - } - return false - }; - - pp$8.regexp_eatAtom = function(state) { - return ( - this.regexp_eatPatternCharacters(state) || - state.eat(0x2E ) || - this.regexp_eatReverseSolidusAtomEscape(state) || - this.regexp_eatCharacterClass(state) || - this.regexp_eatUncapturingGroup(state) || - this.regexp_eatCapturingGroup(state) - ) - }; - pp$8.regexp_eatReverseSolidusAtomEscape = function(state) { - var start = state.pos; - if (state.eat(0x5C )) { - if (this.regexp_eatAtomEscape(state)) { - return true - } - state.pos = start; - } - return false - }; - pp$8.regexp_eatUncapturingGroup = function(state) { - var start = state.pos; - if (state.eat(0x28 )) { - if (state.eat(0x3F ) && state.eat(0x3A )) { - this.regexp_disjunction(state); - if (state.eat(0x29 )) { - return true - } - state.raise("Unterminated group"); - } - state.pos = start; - } - return false - }; - pp$8.regexp_eatCapturingGroup = function(state) { - if (state.eat(0x28 )) { - if (this.options.ecmaVersion >= 9) { - this.regexp_groupSpecifier(state); - } else if (state.current() === 0x3F ) { - state.raise("Invalid group"); - } - this.regexp_disjunction(state); - if (state.eat(0x29 )) { - state.numCapturingParens += 1; - return true - } - state.raise("Unterminated group"); - } - return false - }; - - pp$8.regexp_eatExtendedAtom = function(state) { - return ( - state.eat(0x2E ) || - this.regexp_eatReverseSolidusAtomEscape(state) || - this.regexp_eatCharacterClass(state) || - this.regexp_eatUncapturingGroup(state) || - this.regexp_eatCapturingGroup(state) || - this.regexp_eatInvalidBracedQuantifier(state) || - this.regexp_eatExtendedPatternCharacter(state) - ) - }; - - pp$8.regexp_eatInvalidBracedQuantifier = function(state) { - if (this.regexp_eatBracedQuantifier(state, true)) { - state.raise("Nothing to repeat"); - } - return false - }; - - pp$8.regexp_eatSyntaxCharacter = function(state) { - var ch = state.current(); - if (isSyntaxCharacter(ch)) { - state.lastIntValue = ch; - state.advance(); - return true - } - return false - }; - function isSyntaxCharacter(ch) { - return ( - ch === 0x24 || - ch >= 0x28 && ch <= 0x2B || - ch === 0x2E || - ch === 0x3F || - ch >= 0x5B && ch <= 0x5E || - ch >= 0x7B && ch <= 0x7D - ) - } - - pp$8.regexp_eatPatternCharacters = function(state) { - var start = state.pos; - var ch = 0; - while ((ch = state.current()) !== -1 && !isSyntaxCharacter(ch)) { - state.advance(); - } - return state.pos !== start - }; - - pp$8.regexp_eatExtendedPatternCharacter = function(state) { - var ch = state.current(); - if ( - ch !== -1 && - ch !== 0x24 && - !(ch >= 0x28 && ch <= 0x2B ) && - ch !== 0x2E && - ch !== 0x3F && - ch !== 0x5B && - ch !== 0x5E && - ch !== 0x7C - ) { - state.advance(); - return true - } - return false - }; - - pp$8.regexp_groupSpecifier = function(state) { - if (state.eat(0x3F )) { - if (this.regexp_eatGroupName(state)) { - if (state.groupNames.indexOf(state.lastStringValue) !== -1) { - state.raise("Duplicate capture group name"); - } - state.groupNames.push(state.lastStringValue); - return - } - state.raise("Invalid group"); - } - }; - - pp$8.regexp_eatGroupName = function(state) { - state.lastStringValue = ""; - if (state.eat(0x3C )) { - if (this.regexp_eatRegExpIdentifierName(state) && state.eat(0x3E )) { - return true - } - state.raise("Invalid capture group name"); - } - return false - }; - - pp$8.regexp_eatRegExpIdentifierName = function(state) { - state.lastStringValue = ""; - if (this.regexp_eatRegExpIdentifierStart(state)) { - state.lastStringValue += codePointToString(state.lastIntValue); - while (this.regexp_eatRegExpIdentifierPart(state)) { - state.lastStringValue += codePointToString(state.lastIntValue); - } - return true - } - return false - }; - - pp$8.regexp_eatRegExpIdentifierStart = function(state) { - var start = state.pos; - var ch = state.current(); - state.advance(); - - if (ch === 0x5C && this.regexp_eatRegExpUnicodeEscapeSequence(state)) { - ch = state.lastIntValue; - } - if (isRegExpIdentifierStart(ch)) { - state.lastIntValue = ch; - return true - } - - state.pos = start; - return false - }; - function isRegExpIdentifierStart(ch) { - return isIdentifierStart(ch, true) || ch === 0x24 || ch === 0x5F - } - - pp$8.regexp_eatRegExpIdentifierPart = function(state) { - var start = state.pos; - var ch = state.current(); - state.advance(); - - if (ch === 0x5C && this.regexp_eatRegExpUnicodeEscapeSequence(state)) { - ch = state.lastIntValue; - } - if (isRegExpIdentifierPart(ch)) { - state.lastIntValue = ch; - return true - } - - state.pos = start; - return false - }; - function isRegExpIdentifierPart(ch) { - return isIdentifierChar(ch, true) || ch === 0x24 || ch === 0x5F || ch === 0x200C || ch === 0x200D - } - - pp$8.regexp_eatAtomEscape = function(state) { - if ( - this.regexp_eatBackReference(state) || - this.regexp_eatCharacterClassEscape(state) || - this.regexp_eatCharacterEscape(state) || - (state.switchN && this.regexp_eatKGroupName(state)) - ) { - return true - } - if (state.switchU) { - if (state.current() === 0x63 ) { - state.raise("Invalid unicode escape"); - } - state.raise("Invalid escape"); - } - return false - }; - pp$8.regexp_eatBackReference = function(state) { - var start = state.pos; - if (this.regexp_eatDecimalEscape(state)) { - var n = state.lastIntValue; - if (state.switchU) { - if (n > state.maxBackReference) { - state.maxBackReference = n; - } - return true - } - if (n <= state.numCapturingParens) { - return true - } - state.pos = start; - } - return false - }; - pp$8.regexp_eatKGroupName = function(state) { - if (state.eat(0x6B )) { - if (this.regexp_eatGroupName(state)) { - state.backReferenceNames.push(state.lastStringValue); - return true - } - state.raise("Invalid named reference"); - } - return false - }; - - pp$8.regexp_eatCharacterEscape = function(state) { - return ( - this.regexp_eatControlEscape(state) || - this.regexp_eatCControlLetter(state) || - this.regexp_eatZero(state) || - this.regexp_eatHexEscapeSequence(state) || - this.regexp_eatRegExpUnicodeEscapeSequence(state) || - (!state.switchU && this.regexp_eatLegacyOctalEscapeSequence(state)) || - this.regexp_eatIdentityEscape(state) - ) - }; - pp$8.regexp_eatCControlLetter = function(state) { - var start = state.pos; - if (state.eat(0x63 )) { - if (this.regexp_eatControlLetter(state)) { - return true - } - state.pos = start; - } - return false - }; - pp$8.regexp_eatZero = function(state) { - if (state.current() === 0x30 && !isDecimalDigit(state.lookahead())) { - state.lastIntValue = 0; - state.advance(); - return true - } - return false - }; - - pp$8.regexp_eatControlEscape = function(state) { - var ch = state.current(); - if (ch === 0x74 ) { - state.lastIntValue = 0x09; - state.advance(); - return true - } - if (ch === 0x6E ) { - state.lastIntValue = 0x0A; - state.advance(); - return true - } - if (ch === 0x76 ) { - state.lastIntValue = 0x0B; - state.advance(); - return true - } - if (ch === 0x66 ) { - state.lastIntValue = 0x0C; - state.advance(); - return true - } - if (ch === 0x72 ) { - state.lastIntValue = 0x0D; - state.advance(); - return true - } - return false - }; - - pp$8.regexp_eatControlLetter = function(state) { - var ch = state.current(); - if (isControlLetter(ch)) { - state.lastIntValue = ch % 0x20; - state.advance(); - return true - } - return false - }; - function isControlLetter(ch) { - return ( - (ch >= 0x41 && ch <= 0x5A ) || - (ch >= 0x61 && ch <= 0x7A ) - ) - } - - pp$8.regexp_eatRegExpUnicodeEscapeSequence = function(state) { - var start = state.pos; - - if (state.eat(0x75 )) { - if (this.regexp_eatFixedHexDigits(state, 4)) { - var lead = state.lastIntValue; - if (state.switchU && lead >= 0xD800 && lead <= 0xDBFF) { - var leadSurrogateEnd = state.pos; - if (state.eat(0x5C ) && state.eat(0x75 ) && this.regexp_eatFixedHexDigits(state, 4)) { - var trail = state.lastIntValue; - if (trail >= 0xDC00 && trail <= 0xDFFF) { - state.lastIntValue = (lead - 0xD800) * 0x400 + (trail - 0xDC00) + 0x10000; - return true - } - } - state.pos = leadSurrogateEnd; - state.lastIntValue = lead; - } - return true - } - if ( - state.switchU && - state.eat(0x7B ) && - this.regexp_eatHexDigits(state) && - state.eat(0x7D ) && - isValidUnicode(state.lastIntValue) - ) { - return true - } - if (state.switchU) { - state.raise("Invalid unicode escape"); - } - state.pos = start; - } - - return false - }; - function isValidUnicode(ch) { - return ch >= 0 && ch <= 0x10FFFF - } - - pp$8.regexp_eatIdentityEscape = function(state) { - if (state.switchU) { - if (this.regexp_eatSyntaxCharacter(state)) { - return true - } - if (state.eat(0x2F )) { - state.lastIntValue = 0x2F; - return true - } - return false - } - - var ch = state.current(); - if (ch !== 0x63 && (!state.switchN || ch !== 0x6B )) { - state.lastIntValue = ch; - state.advance(); - return true - } - - return false - }; - - pp$8.regexp_eatDecimalEscape = function(state) { - state.lastIntValue = 0; - var ch = state.current(); - if (ch >= 0x31 && ch <= 0x39 ) { - do { - state.lastIntValue = 10 * state.lastIntValue + (ch - 0x30 ); - state.advance(); - } while ((ch = state.current()) >= 0x30 && ch <= 0x39 ) - return true - } - return false - }; - - pp$8.regexp_eatCharacterClassEscape = function(state) { - var ch = state.current(); - - if (isCharacterClassEscape(ch)) { - state.lastIntValue = -1; - state.advance(); - return true - } - - if ( - state.switchU && - this.options.ecmaVersion >= 9 && - (ch === 0x50 || ch === 0x70 ) - ) { - state.lastIntValue = -1; - state.advance(); - if ( - state.eat(0x7B ) && - this.regexp_eatUnicodePropertyValueExpression(state) && - state.eat(0x7D ) - ) { - return true - } - state.raise("Invalid property name"); - } - - return false - }; - function isCharacterClassEscape(ch) { - return ( - ch === 0x64 || - ch === 0x44 || - ch === 0x73 || - ch === 0x53 || - ch === 0x77 || - ch === 0x57 - ) - } - - pp$8.regexp_eatUnicodePropertyValueExpression = function(state) { - var start = state.pos; - - if (this.regexp_eatUnicodePropertyName(state) && state.eat(0x3D )) { - var name = state.lastStringValue; - if (this.regexp_eatUnicodePropertyValue(state)) { - var value = state.lastStringValue; - this.regexp_validateUnicodePropertyNameAndValue(state, name, value); - return true - } - } - state.pos = start; - - if (this.regexp_eatLoneUnicodePropertyNameOrValue(state)) { - var nameOrValue = state.lastStringValue; - this.regexp_validateUnicodePropertyNameOrValue(state, nameOrValue); - return true - } - return false - }; - pp$8.regexp_validateUnicodePropertyNameAndValue = function(state, name, value) { - if (!has(state.unicodeProperties.nonBinary, name)) - { state.raise("Invalid property name"); } - if (!state.unicodeProperties.nonBinary[name].test(value)) - { state.raise("Invalid property value"); } - }; - pp$8.regexp_validateUnicodePropertyNameOrValue = function(state, nameOrValue) { - if (!state.unicodeProperties.binary.test(nameOrValue)) - { state.raise("Invalid property name"); } - }; - - pp$8.regexp_eatUnicodePropertyName = function(state) { - var ch = 0; - state.lastStringValue = ""; - while (isUnicodePropertyNameCharacter(ch = state.current())) { - state.lastStringValue += codePointToString(ch); - state.advance(); - } - return state.lastStringValue !== "" - }; - function isUnicodePropertyNameCharacter(ch) { - return isControlLetter(ch) || ch === 0x5F - } - - pp$8.regexp_eatUnicodePropertyValue = function(state) { - var ch = 0; - state.lastStringValue = ""; - while (isUnicodePropertyValueCharacter(ch = state.current())) { - state.lastStringValue += codePointToString(ch); - state.advance(); - } - return state.lastStringValue !== "" - }; - function isUnicodePropertyValueCharacter(ch) { - return isUnicodePropertyNameCharacter(ch) || isDecimalDigit(ch) - } - - pp$8.regexp_eatLoneUnicodePropertyNameOrValue = function(state) { - return this.regexp_eatUnicodePropertyValue(state) - }; - - pp$8.regexp_eatCharacterClass = function(state) { - if (state.eat(0x5B )) { - state.eat(0x5E ); - this.regexp_classRanges(state); - if (state.eat(0x5D )) { - return true - } - state.raise("Unterminated character class"); - } - return false - }; - - pp$8.regexp_classRanges = function(state) { - while (this.regexp_eatClassAtom(state)) { - var left = state.lastIntValue; - if (state.eat(0x2D ) && this.regexp_eatClassAtom(state)) { - var right = state.lastIntValue; - if (state.switchU && (left === -1 || right === -1)) { - state.raise("Invalid character class"); - } - if (left !== -1 && right !== -1 && left > right) { - state.raise("Range out of order in character class"); - } - } - } - }; - - pp$8.regexp_eatClassAtom = function(state) { - var start = state.pos; - - if (state.eat(0x5C )) { - if (this.regexp_eatClassEscape(state)) { - return true - } - if (state.switchU) { - var ch$1 = state.current(); - if (ch$1 === 0x63 || isOctalDigit(ch$1)) { - state.raise("Invalid class escape"); - } - state.raise("Invalid escape"); - } - state.pos = start; - } - - var ch = state.current(); - if (ch !== 0x5D ) { - state.lastIntValue = ch; - state.advance(); - return true - } - - return false - }; - - pp$8.regexp_eatClassEscape = function(state) { - var start = state.pos; - - if (state.eat(0x62 )) { - state.lastIntValue = 0x08; - return true - } - - if (state.switchU && state.eat(0x2D )) { - state.lastIntValue = 0x2D; - return true - } - - if (!state.switchU && state.eat(0x63 )) { - if (this.regexp_eatClassControlLetter(state)) { - return true - } - state.pos = start; - } - - return ( - this.regexp_eatCharacterClassEscape(state) || - this.regexp_eatCharacterEscape(state) - ) - }; - - pp$8.regexp_eatClassControlLetter = function(state) { - var ch = state.current(); - if (isDecimalDigit(ch) || ch === 0x5F ) { - state.lastIntValue = ch % 0x20; - state.advance(); - return true - } - return false - }; - - pp$8.regexp_eatHexEscapeSequence = function(state) { - var start = state.pos; - if (state.eat(0x78 )) { - if (this.regexp_eatFixedHexDigits(state, 2)) { - return true - } - if (state.switchU) { - state.raise("Invalid escape"); - } - state.pos = start; - } - return false - }; - - pp$8.regexp_eatDecimalDigits = function(state) { - var start = state.pos; - var ch = 0; - state.lastIntValue = 0; - while (isDecimalDigit(ch = state.current())) { - state.lastIntValue = 10 * state.lastIntValue + (ch - 0x30 ); - state.advance(); - } - return state.pos !== start - }; - function isDecimalDigit(ch) { - return ch >= 0x30 && ch <= 0x39 - } - - pp$8.regexp_eatHexDigits = function(state) { - var start = state.pos; - var ch = 0; - state.lastIntValue = 0; - while (isHexDigit(ch = state.current())) { - state.lastIntValue = 16 * state.lastIntValue + hexToInt(ch); - state.advance(); - } - return state.pos !== start - }; - function isHexDigit(ch) { - return ( - (ch >= 0x30 && ch <= 0x39 ) || - (ch >= 0x41 && ch <= 0x46 ) || - (ch >= 0x61 && ch <= 0x66 ) - ) - } - function hexToInt(ch) { - if (ch >= 0x41 && ch <= 0x46 ) { - return 10 + (ch - 0x41 ) - } - if (ch >= 0x61 && ch <= 0x66 ) { - return 10 + (ch - 0x61 ) - } - return ch - 0x30 - } - - pp$8.regexp_eatLegacyOctalEscapeSequence = function(state) { - if (this.regexp_eatOctalDigit(state)) { - var n1 = state.lastIntValue; - if (this.regexp_eatOctalDigit(state)) { - var n2 = state.lastIntValue; - if (n1 <= 3 && this.regexp_eatOctalDigit(state)) { - state.lastIntValue = n1 * 64 + n2 * 8 + state.lastIntValue; - } else { - state.lastIntValue = n1 * 8 + n2; - } - } else { - state.lastIntValue = n1; - } - return true - } - return false - }; - - pp$8.regexp_eatOctalDigit = function(state) { - var ch = state.current(); - if (isOctalDigit(ch)) { - state.lastIntValue = ch - 0x30; - state.advance(); - return true - } - state.lastIntValue = 0; - return false - }; - function isOctalDigit(ch) { - return ch >= 0x30 && ch <= 0x37 - } - - pp$8.regexp_eatFixedHexDigits = function(state, length) { - var start = state.pos; - state.lastIntValue = 0; - for (var i = 0; i < length; ++i) { - var ch = state.current(); - if (!isHexDigit(ch)) { - state.pos = start; - return false - } - state.lastIntValue = 16 * state.lastIntValue + hexToInt(ch); - state.advance(); - } - return true - }; - - - var Token = function Token(p) { - this.type = p.type; - this.value = p.value; - this.start = p.start; - this.end = p.end; - if (p.options.locations) - { this.loc = new SourceLocation(p, p.startLoc, p.endLoc); } - if (p.options.ranges) - { this.range = [p.start, p.end]; } - }; - - - var pp$9 = Parser.prototype; - - - pp$9.next = function(ignoreEscapeSequenceInKeyword) { - if (!ignoreEscapeSequenceInKeyword && this.type.keyword && this.containsEsc) - { this.raiseRecoverable(this.start, "Escape sequence in keyword " + this.type.keyword); } - if (this.options.onToken) - { this.options.onToken(new Token(this)); } - - this.lastTokEnd = this.end; - this.lastTokStart = this.start; - this.lastTokEndLoc = this.endLoc; - this.lastTokStartLoc = this.startLoc; - this.nextToken(); - }; - - pp$9.getToken = function() { - this.next(); - return new Token(this) - }; - - if (typeof Symbol !== "undefined") - { pp$9[Symbol.iterator] = function() { - var this$1 = this; - - return { - next: function () { - var token = this$1.getToken(); - return { - done: token.type === types.eof, - value: token - } - } - } - }; } - - - pp$9.curContext = function() { - return this.context[this.context.length - 1] - }; - - - pp$9.nextToken = function() { - var curContext = this.curContext(); - if (!curContext || !curContext.preserveSpace) { this.skipSpace(); } - - this.start = this.pos; - if (this.options.locations) { this.startLoc = this.curPosition(); } - if (this.pos >= this.input.length) { return this.finishToken(types.eof) } - - if (curContext.override) { return curContext.override(this) } - else { this.readToken(this.fullCharCodeAtPos()); } - }; - - pp$9.readToken = function(code) { - if (isIdentifierStart(code, this.options.ecmaVersion >= 6) || code === 92 ) - { return this.readWord() } - - return this.getTokenFromCode(code) - }; - - pp$9.fullCharCodeAtPos = function() { - var code = this.input.charCodeAt(this.pos); - if (code <= 0xd7ff || code >= 0xe000) { return code } - var next = this.input.charCodeAt(this.pos + 1); - return (code << 10) + next - 0x35fdc00 - }; - - pp$9.skipBlockComment = function() { - var startLoc = this.options.onComment && this.curPosition(); - var start = this.pos, end = this.input.indexOf("*/", this.pos += 2); - if (end === -1) { this.raise(this.pos - 2, "Unterminated comment"); } - this.pos = end + 2; - if (this.options.locations) { - lineBreakG.lastIndex = start; - var match; - while ((match = lineBreakG.exec(this.input)) && match.index < this.pos) { - ++this.curLine; - this.lineStart = match.index + match[0].length; - } - } - if (this.options.onComment) - { this.options.onComment(true, this.input.slice(start + 2, end), start, this.pos, - startLoc, this.curPosition()); } - }; - - pp$9.skipLineComment = function(startSkip) { - var start = this.pos; - var startLoc = this.options.onComment && this.curPosition(); - var ch = this.input.charCodeAt(this.pos += startSkip); - while (this.pos < this.input.length && !isNewLine(ch)) { - ch = this.input.charCodeAt(++this.pos); - } - if (this.options.onComment) - { this.options.onComment(false, this.input.slice(start + startSkip, this.pos), start, this.pos, - startLoc, this.curPosition()); } - }; - - - pp$9.skipSpace = function() { - loop: while (this.pos < this.input.length) { - var ch = this.input.charCodeAt(this.pos); - switch (ch) { - case 32: case 160: - ++this.pos; - break - case 13: - if (this.input.charCodeAt(this.pos + 1) === 10) { - ++this.pos; - } - case 10: case 8232: case 8233: - ++this.pos; - if (this.options.locations) { - ++this.curLine; - this.lineStart = this.pos; - } - break - case 47: - switch (this.input.charCodeAt(this.pos + 1)) { - case 42: - this.skipBlockComment(); - break - case 47: - this.skipLineComment(2); - break - default: - break loop - } - break - default: - if (ch > 8 && ch < 14 || ch >= 5760 && nonASCIIwhitespace.test(String.fromCharCode(ch))) { - ++this.pos; - } else { - break loop - } - } - } - }; - - - pp$9.finishToken = function(type, val) { - this.end = this.pos; - if (this.options.locations) { this.endLoc = this.curPosition(); } - var prevType = this.type; - this.type = type; - this.value = val; - - this.updateContext(prevType); - }; - - - pp$9.readToken_dot = function() { - var next = this.input.charCodeAt(this.pos + 1); - if (next >= 48 && next <= 57) { return this.readNumber(true) } - var next2 = this.input.charCodeAt(this.pos + 2); - if (this.options.ecmaVersion >= 6 && next === 46 && next2 === 46) { - this.pos += 3; - return this.finishToken(types.ellipsis) - } else { - ++this.pos; - return this.finishToken(types.dot) - } - }; - - pp$9.readToken_slash = function() { - var next = this.input.charCodeAt(this.pos + 1); - if (this.exprAllowed) { ++this.pos; return this.readRegexp() } - if (next === 61) { return this.finishOp(types.assign, 2) } - return this.finishOp(types.slash, 1) - }; - - pp$9.readToken_mult_modulo_exp = function(code) { - var next = this.input.charCodeAt(this.pos + 1); - var size = 1; - var tokentype = code === 42 ? types.star : types.modulo; - - if (this.options.ecmaVersion >= 7 && code === 42 && next === 42) { - ++size; - tokentype = types.starstar; - next = this.input.charCodeAt(this.pos + 2); - } - - if (next === 61) { return this.finishOp(types.assign, size + 1) } - return this.finishOp(tokentype, size) - }; - - pp$9.readToken_pipe_amp = function(code) { - var next = this.input.charCodeAt(this.pos + 1); - if (next === code) { return this.finishOp(code === 124 ? types.logicalOR : types.logicalAND, 2) } - if (next === 61) { return this.finishOp(types.assign, 2) } - return this.finishOp(code === 124 ? types.bitwiseOR : types.bitwiseAND, 1) - }; - - pp$9.readToken_caret = function() { - var next = this.input.charCodeAt(this.pos + 1); - if (next === 61) { return this.finishOp(types.assign, 2) } - return this.finishOp(types.bitwiseXOR, 1) - }; - - pp$9.readToken_plus_min = function(code) { - var next = this.input.charCodeAt(this.pos + 1); - if (next === code) { - if (next === 45 && !this.inModule && this.input.charCodeAt(this.pos + 2) === 62 && - (this.lastTokEnd === 0 || lineBreak.test(this.input.slice(this.lastTokEnd, this.pos)))) { - this.skipLineComment(3); - this.skipSpace(); - return this.nextToken() - } - return this.finishOp(types.incDec, 2) - } - if (next === 61) { return this.finishOp(types.assign, 2) } - return this.finishOp(types.plusMin, 1) - }; - - pp$9.readToken_lt_gt = function(code) { - var next = this.input.charCodeAt(this.pos + 1); - var size = 1; - if (next === code) { - size = code === 62 && this.input.charCodeAt(this.pos + 2) === 62 ? 3 : 2; - if (this.input.charCodeAt(this.pos + size) === 61) { return this.finishOp(types.assign, size + 1) } - return this.finishOp(types.bitShift, size) - } - if (next === 33 && code === 60 && !this.inModule && this.input.charCodeAt(this.pos + 2) === 45 && - this.input.charCodeAt(this.pos + 3) === 45) { - this.skipLineComment(4); - this.skipSpace(); - return this.nextToken() - } - if (next === 61) { size = 2; } - return this.finishOp(types.relational, size) - }; - - pp$9.readToken_eq_excl = function(code) { - var next = this.input.charCodeAt(this.pos + 1); - if (next === 61) { return this.finishOp(types.equality, this.input.charCodeAt(this.pos + 2) === 61 ? 3 : 2) } - if (code === 61 && next === 62 && this.options.ecmaVersion >= 6) { - this.pos += 2; - return this.finishToken(types.arrow) - } - return this.finishOp(code === 61 ? types.eq : types.prefix, 1) - }; - - pp$9.getTokenFromCode = function(code) { - switch (code) { - case 46: - return this.readToken_dot() - - case 40: ++this.pos; return this.finishToken(types.parenL) - case 41: ++this.pos; return this.finishToken(types.parenR) - case 59: ++this.pos; return this.finishToken(types.semi) - case 44: ++this.pos; return this.finishToken(types.comma) - case 91: ++this.pos; return this.finishToken(types.bracketL) - case 93: ++this.pos; return this.finishToken(types.bracketR) - case 123: ++this.pos; return this.finishToken(types.braceL) - case 125: ++this.pos; return this.finishToken(types.braceR) - case 58: ++this.pos; return this.finishToken(types.colon) - case 63: ++this.pos; return this.finishToken(types.question) - - case 96: - if (this.options.ecmaVersion < 6) { break } - ++this.pos; - return this.finishToken(types.backQuote) - - case 48: - var next = this.input.charCodeAt(this.pos + 1); - if (next === 120 || next === 88) { return this.readRadixNumber(16) } - if (this.options.ecmaVersion >= 6) { - if (next === 111 || next === 79) { return this.readRadixNumber(8) } - if (next === 98 || next === 66) { return this.readRadixNumber(2) } - } - - case 49: case 50: case 51: case 52: case 53: case 54: case 55: case 56: case 57: - return this.readNumber(false) - - case 34: case 39: - return this.readString(code) - - - case 47: - return this.readToken_slash() - - case 37: case 42: - return this.readToken_mult_modulo_exp(code) - - case 124: case 38: - return this.readToken_pipe_amp(code) - - case 94: - return this.readToken_caret() - - case 43: case 45: - return this.readToken_plus_min(code) - - case 60: case 62: - return this.readToken_lt_gt(code) - - case 61: case 33: - return this.readToken_eq_excl(code) - - case 126: - return this.finishOp(types.prefix, 1) - } - - this.raise(this.pos, "Unexpected character '" + codePointToString$1(code) + "'"); - }; - - pp$9.finishOp = function(type, size) { - var str = this.input.slice(this.pos, this.pos + size); - this.pos += size; - return this.finishToken(type, str) - }; - - pp$9.readRegexp = function() { - var escaped, inClass, start = this.pos; - for (;;) { - if (this.pos >= this.input.length) { this.raise(start, "Unterminated regular expression"); } - var ch = this.input.charAt(this.pos); - if (lineBreak.test(ch)) { this.raise(start, "Unterminated regular expression"); } - if (!escaped) { - if (ch === "[") { inClass = true; } - else if (ch === "]" && inClass) { inClass = false; } - else if (ch === "/" && !inClass) { break } - escaped = ch === "\\"; - } else { escaped = false; } - ++this.pos; - } - var pattern = this.input.slice(start, this.pos); - ++this.pos; - var flagsStart = this.pos; - var flags = this.readWord1(); - if (this.containsEsc) { this.unexpected(flagsStart); } - - var state = this.regexpState || (this.regexpState = new RegExpValidationState(this)); - state.reset(start, pattern, flags); - this.validateRegExpFlags(state); - this.validateRegExpPattern(state); - - var value = null; - try { - value = new RegExp(pattern, flags); - } catch (e) { - } - - return this.finishToken(types.regexp, {pattern: pattern, flags: flags, value: value}) - }; - - - pp$9.readInt = function(radix, len) { - var start = this.pos, total = 0; - for (var i = 0, e = len == null ? Infinity : len; i < e; ++i) { - var code = this.input.charCodeAt(this.pos), val = (void 0); - if (code >= 97) { val = code - 97 + 10; } - else if (code >= 65) { val = code - 65 + 10; } - else if (code >= 48 && code <= 57) { val = code - 48; } - else { val = Infinity; } - if (val >= radix) { break } - ++this.pos; - total = total * radix + val; - } - if (this.pos === start || len != null && this.pos - start !== len) { return null } - - return total - }; - - pp$9.readRadixNumber = function(radix) { - var start = this.pos; - this.pos += 2; - var val = this.readInt(radix); - if (val == null) { this.raise(this.start + 2, "Expected number in radix " + radix); } - if (this.options.ecmaVersion >= 11 && this.input.charCodeAt(this.pos) === 110) { - val = typeof BigInt !== "undefined" ? BigInt(this.input.slice(start, this.pos)) : null; - ++this.pos; - } else if (isIdentifierStart(this.fullCharCodeAtPos())) { this.raise(this.pos, "Identifier directly after number"); } - return this.finishToken(types.num, val) - }; - - - pp$9.readNumber = function(startsWithDot) { - var start = this.pos; - if (!startsWithDot && this.readInt(10) === null) { this.raise(start, "Invalid number"); } - var octal = this.pos - start >= 2 && this.input.charCodeAt(start) === 48; - if (octal && this.strict) { this.raise(start, "Invalid number"); } - var next = this.input.charCodeAt(this.pos); - if (!octal && !startsWithDot && this.options.ecmaVersion >= 11 && next === 110) { - var str$1 = this.input.slice(start, this.pos); - var val$1 = typeof BigInt !== "undefined" ? BigInt(str$1) : null; - ++this.pos; - if (isIdentifierStart(this.fullCharCodeAtPos())) { this.raise(this.pos, "Identifier directly after number"); } - return this.finishToken(types.num, val$1) - } - if (octal && /[89]/.test(this.input.slice(start, this.pos))) { octal = false; } - if (next === 46 && !octal) { - ++this.pos; - this.readInt(10); - next = this.input.charCodeAt(this.pos); - } - if ((next === 69 || next === 101) && !octal) { - next = this.input.charCodeAt(++this.pos); - if (next === 43 || next === 45) { ++this.pos; } - if (this.readInt(10) === null) { this.raise(start, "Invalid number"); } - } - if (isIdentifierStart(this.fullCharCodeAtPos())) { this.raise(this.pos, "Identifier directly after number"); } - - var str = this.input.slice(start, this.pos); - var val = octal ? parseInt(str, 8) : parseFloat(str); - return this.finishToken(types.num, val) - }; - - - pp$9.readCodePoint = function() { - var ch = this.input.charCodeAt(this.pos), code; - - if (ch === 123) { - if (this.options.ecmaVersion < 6) { this.unexpected(); } - var codePos = ++this.pos; - code = this.readHexChar(this.input.indexOf("}", this.pos) - this.pos); - ++this.pos; - if (code > 0x10FFFF) { this.invalidStringToken(codePos, "Code point out of bounds"); } - } else { - code = this.readHexChar(4); - } - return code - }; - - function codePointToString$1(code) { - if (code <= 0xFFFF) { return String.fromCharCode(code) } - code -= 0x10000; - return String.fromCharCode((code >> 10) + 0xD800, (code & 1023) + 0xDC00) - } - - pp$9.readString = function(quote) { - var out = "", chunkStart = ++this.pos; - for (;;) { - if (this.pos >= this.input.length) { this.raise(this.start, "Unterminated string constant"); } - var ch = this.input.charCodeAt(this.pos); - if (ch === quote) { break } - if (ch === 92) { - out += this.input.slice(chunkStart, this.pos); - out += this.readEscapedChar(false); - chunkStart = this.pos; - } else { - if (isNewLine(ch, this.options.ecmaVersion >= 10)) { this.raise(this.start, "Unterminated string constant"); } - ++this.pos; - } - } - out += this.input.slice(chunkStart, this.pos++); - return this.finishToken(types.string, out) - }; - - - var INVALID_TEMPLATE_ESCAPE_ERROR = {}; - - pp$9.tryReadTemplateToken = function() { - this.inTemplateElement = true; - try { - this.readTmplToken(); - } catch (err) { - if (err === INVALID_TEMPLATE_ESCAPE_ERROR) { - this.readInvalidTemplateToken(); - } else { - throw err - } - } - - this.inTemplateElement = false; - }; - - pp$9.invalidStringToken = function(position, message) { - if (this.inTemplateElement && this.options.ecmaVersion >= 9) { - throw INVALID_TEMPLATE_ESCAPE_ERROR - } else { - this.raise(position, message); - } - }; - - pp$9.readTmplToken = function() { - var out = "", chunkStart = this.pos; - for (;;) { - if (this.pos >= this.input.length) { this.raise(this.start, "Unterminated template"); } - var ch = this.input.charCodeAt(this.pos); - if (ch === 96 || ch === 36 && this.input.charCodeAt(this.pos + 1) === 123) { - if (this.pos === this.start && (this.type === types.template || this.type === types.invalidTemplate)) { - if (ch === 36) { - this.pos += 2; - return this.finishToken(types.dollarBraceL) - } else { - ++this.pos; - return this.finishToken(types.backQuote) - } - } - out += this.input.slice(chunkStart, this.pos); - return this.finishToken(types.template, out) - } - if (ch === 92) { - out += this.input.slice(chunkStart, this.pos); - out += this.readEscapedChar(true); - chunkStart = this.pos; - } else if (isNewLine(ch)) { - out += this.input.slice(chunkStart, this.pos); - ++this.pos; - switch (ch) { - case 13: - if (this.input.charCodeAt(this.pos) === 10) { ++this.pos; } - case 10: - out += "\n"; - break - default: - out += String.fromCharCode(ch); - break - } - if (this.options.locations) { - ++this.curLine; - this.lineStart = this.pos; - } - chunkStart = this.pos; - } else { - ++this.pos; - } - } - }; - - pp$9.readInvalidTemplateToken = function() { - for (; this.pos < this.input.length; this.pos++) { - switch (this.input[this.pos]) { - case "\\": - ++this.pos; - break - - case "$": - if (this.input[this.pos + 1] !== "{") { - break - } - - case "`": - return this.finishToken(types.invalidTemplate, this.input.slice(this.start, this.pos)) - - } - } - this.raise(this.start, "Unterminated template"); - }; - - - pp$9.readEscapedChar = function(inTemplate) { - var ch = this.input.charCodeAt(++this.pos); - ++this.pos; - switch (ch) { - case 110: return "\n" - case 114: return "\r" - case 120: return String.fromCharCode(this.readHexChar(2)) - case 117: return codePointToString$1(this.readCodePoint()) - case 116: return "\t" - case 98: return "\b" - case 118: return "\u000b" - case 102: return "\f" - case 13: if (this.input.charCodeAt(this.pos) === 10) { ++this.pos; } - case 10: - if (this.options.locations) { this.lineStart = this.pos; ++this.curLine; } - return "" - case 56: - case 57: - if (inTemplate) { - var codePos = this.pos - 1; - - this.invalidStringToken( - codePos, - "Invalid escape sequence in template string" - ); - - return null - } - default: - if (ch >= 48 && ch <= 55) { - var octalStr = this.input.substr(this.pos - 1, 3).match(/^[0-7]+/)[0]; - var octal = parseInt(octalStr, 8); - if (octal > 255) { - octalStr = octalStr.slice(0, -1); - octal = parseInt(octalStr, 8); - } - this.pos += octalStr.length - 1; - ch = this.input.charCodeAt(this.pos); - if ((octalStr !== "0" || ch === 56 || ch === 57) && (this.strict || inTemplate)) { - this.invalidStringToken( - this.pos - 1 - octalStr.length, - inTemplate - ? "Octal literal in template string" - : "Octal literal in strict mode" - ); - } - return String.fromCharCode(octal) - } - if (isNewLine(ch)) { - return "" - } - return String.fromCharCode(ch) - } - }; - - - pp$9.readHexChar = function(len) { - var codePos = this.pos; - var n = this.readInt(16, len); - if (n === null) { this.invalidStringToken(codePos, "Bad character escape sequence"); } - return n - }; - - - pp$9.readWord1 = function() { - this.containsEsc = false; - var word = "", first = true, chunkStart = this.pos; - var astral = this.options.ecmaVersion >= 6; - while (this.pos < this.input.length) { - var ch = this.fullCharCodeAtPos(); - if (isIdentifierChar(ch, astral)) { - this.pos += ch <= 0xffff ? 1 : 2; - } else if (ch === 92) { - this.containsEsc = true; - word += this.input.slice(chunkStart, this.pos); - var escStart = this.pos; - if (this.input.charCodeAt(++this.pos) !== 117) - { this.invalidStringToken(this.pos, "Expecting Unicode escape sequence \\uXXXX"); } - ++this.pos; - var esc = this.readCodePoint(); - if (!(first ? isIdentifierStart : isIdentifierChar)(esc, astral)) - { this.invalidStringToken(escStart, "Invalid Unicode escape"); } - word += codePointToString$1(esc); - chunkStart = this.pos; - } else { - break - } - first = false; - } - return word + this.input.slice(chunkStart, this.pos) - }; - - - pp$9.readWord = function() { - var word = this.readWord1(); - var type = types.name; - if (this.keywords.test(word)) { - type = keywords$1[word]; - } - return this.finishToken(type, word) - }; - - - var version = "7.1.0"; - - Parser.acorn = { - Parser: Parser, - version: version, - defaultOptions: defaultOptions, - Position: Position, - SourceLocation: SourceLocation, - getLineInfo: getLineInfo, - Node: Node, - TokenType: TokenType, - tokTypes: types, - keywordTypes: keywords$1, - TokContext: TokContext, - tokContexts: types$1, - isIdentifierChar: isIdentifierChar, - isIdentifierStart: isIdentifierStart, - Token: Token, - isNewLine: isNewLine, - lineBreak: lineBreak, - lineBreakG: lineBreakG, - nonASCIIwhitespace: nonASCIIwhitespace - }; - - - function parse(input, options) { - return Parser.parse(input, options) - } - - - function parseExpressionAt(input, pos, options) { - return Parser.parseExpressionAt(input, pos, options) - } - - - function tokenizer(input, options) { - return Parser.tokenizer(input, options) - } - - exports.Node = Node; - exports.Parser = Parser; - exports.Position = Position; - exports.SourceLocation = SourceLocation; - exports.TokContext = TokContext; - exports.Token = Token; - exports.TokenType = TokenType; - exports.defaultOptions = defaultOptions; - exports.getLineInfo = getLineInfo; - exports.isIdentifierChar = isIdentifierChar; - exports.isIdentifierStart = isIdentifierStart; - exports.isNewLine = isNewLine; - exports.keywordTypes = keywords$1; - exports.lineBreak = lineBreak; - exports.lineBreakG = lineBreakG; - exports.nonASCIIwhitespace = nonASCIIwhitespace; - exports.parse = parse; - exports.parseExpressionAt = parseExpressionAt; - exports.tokContexts = types$1; - exports.tokTypes = types; - exports.tokenizer = tokenizer; - exports.version = version; - - Object.defineProperty(exports, '__esModule', { value: true }); - -})); - -},{}],2:[function(require,module,exports){ - -},{}],3:[function(require,module,exports){ -function glWiretap(gl, options = {}) { - const { - contextName = 'gl', - throwGetError, - useTrackablePrimitives, - readPixelsFile, - recording = [], - variables = {}, - onReadPixels, - onUnrecognizedArgumentLookup, - } = options; - const proxy = new Proxy(gl, { get: listen }); - const contextVariables = []; - const entityNames = {}; - let imageCount = 0; - let indent = ''; - let readPixelsVariableName; - return proxy; - function listen(obj, property) { - switch (property) { - case 'addComment': return addComment; - case 'checkThrowError': return checkThrowError; - case 'getReadPixelsVariableName': return readPixelsVariableName; - case 'insertVariable': return insertVariable; - case 'reset': return reset; - case 'setIndent': return setIndent; - case 'toString': return toString; - case 'getContextVariableName': return getContextVariableName; - } - if (typeof gl[property] === 'function') { - return function() { - switch (property) { - case 'getError': - if (throwGetError) { - recording.push(`${indent}if (${contextName}.getError() !== ${contextName}.NONE) throw new Error('error');`); - } else { - recording.push(`${indent}${contextName}.getError();`); - } - return gl.getError(); - case 'getExtension': { - const variableName = `${contextName}Variables${contextVariables.length}`; - recording.push(`${indent}const ${variableName} = ${contextName}.getExtension('${arguments[0]}');`); - const extension = gl.getExtension(arguments[0]); - if (extension && typeof extension === 'object') { - const tappedExtension = glExtensionWiretap(extension, { - getEntity, - useTrackablePrimitives, - recording, - contextName: variableName, - contextVariables, - variables, - indent, - onUnrecognizedArgumentLookup, - }); - contextVariables.push(tappedExtension); - return tappedExtension; - } else { - contextVariables.push(null); - } - return extension; - } - case 'readPixels': - const i = contextVariables.indexOf(arguments[6]); - let targetVariableName; - if (i === -1) { - const variableName = getVariableName(arguments[6]); - if (variableName) { - targetVariableName = variableName; - recording.push(`${indent}${variableName}`); - } else { - targetVariableName = `${contextName}Variable${contextVariables.length}`; - contextVariables.push(arguments[6]); - recording.push(`${indent}const ${targetVariableName} = new ${arguments[6].constructor.name}(${arguments[6].length});`); - } - } else { - targetVariableName = `${contextName}Variable${i}`; - } - readPixelsVariableName = targetVariableName; - const argumentAsStrings = [ - arguments[0], - arguments[1], - arguments[2], - arguments[3], - getEntity(arguments[4]), - getEntity(arguments[5]), - targetVariableName - ]; - recording.push(`${indent}${contextName}.readPixels(${argumentAsStrings.join(', ')});`); - if (readPixelsFile) { - writePPM(arguments[2], arguments[3]); - } - if (onReadPixels) { - onReadPixels(targetVariableName, argumentAsStrings); - } - return gl.readPixels.apply(gl, arguments); - case 'drawBuffers': - recording.push(`${indent}${contextName}.drawBuffers([${argumentsToString(arguments[0], { contextName, contextVariables, getEntity, addVariable, variables, onUnrecognizedArgumentLookup } )}]);`); - return gl.drawBuffers(arguments[0]); - } - let result = gl[property].apply(gl, arguments); - switch (typeof result) { - case 'undefined': - recording.push(`${indent}${methodCallToString(property, arguments)};`); - return; - case 'number': - case 'boolean': - if (useTrackablePrimitives && contextVariables.indexOf(trackablePrimitive(result)) === -1) { - recording.push(`${indent}const ${contextName}Variable${contextVariables.length} = ${methodCallToString(property, arguments)};`); - contextVariables.push(result = trackablePrimitive(result)); - break; - } - default: - if (result === null) { - recording.push(`${methodCallToString(property, arguments)};`); - } else { - recording.push(`${indent}const ${contextName}Variable${contextVariables.length} = ${methodCallToString(property, arguments)};`); - } - - contextVariables.push(result); - } - return result; - } - } - entityNames[gl[property]] = property; - return gl[property]; - } - function toString() { - return recording.join('\n'); - } - function reset() { - while (recording.length > 0) { - recording.pop(); - } - } - function insertVariable(name, value) { - variables[name] = value; - } - function getEntity(value) { - const name = entityNames[value]; - if (name) { - return contextName + '.' + name; - } - return value; - } - function setIndent(spaces) { - indent = ' '.repeat(spaces); - } - function addVariable(value, source) { - const variableName = `${contextName}Variable${contextVariables.length}`; - recording.push(`${indent}const ${variableName} = ${source};`); - contextVariables.push(value); - return variableName; - } - function writePPM(width, height) { - const sourceVariable = `${contextName}Variable${contextVariables.length}`; - const imageVariable = `imageDatum${imageCount}`; - recording.push(`${indent}let ${imageVariable} = ["P3\\n# ${readPixelsFile}.ppm\\n", ${width}, ' ', ${height}, "\\n255\\n"].join("");`); - recording.push(`${indent}for (let i = 0; i < ${imageVariable}.length; i += 4) {`); - recording.push(`${indent} ${imageVariable} += ${sourceVariable}[i] + ' ' + ${sourceVariable}[i + 1] + ' ' + ${sourceVariable}[i + 2] + ' ';`); - recording.push(`${indent}}`); - recording.push(`${indent}if (typeof require !== "undefined") {`); - recording.push(`${indent} require('fs').writeFileSync('./${readPixelsFile}.ppm', ${imageVariable});`); - recording.push(`${indent}}`); - imageCount++; - } - function addComment(value) { - recording.push(`${indent}// ${value}`); - } - function checkThrowError() { - recording.push(`${indent}(() => { -${indent}const error = ${contextName}.getError(); -${indent}if (error !== ${contextName}.NONE) { -${indent} const names = Object.getOwnPropertyNames(gl); -${indent} for (let i = 0; i < names.length; i++) { -${indent} const name = names[i]; -${indent} if (${contextName}[name] === error) { -${indent} throw new Error('${contextName} threw ' + name); -${indent} } -${indent} } -${indent}} -${indent}})();`); - } - function methodCallToString(method, args) { - return `${contextName}.${method}(${argumentsToString(args, { contextName, contextVariables, getEntity, addVariable, variables, onUnrecognizedArgumentLookup })})`; - } - - function getVariableName(value) { - if (variables) { - for (const name in variables) { - if (variables[name] === value) { - return name; - } - } - } - return null; - } - - function getContextVariableName(value) { - const i = contextVariables.indexOf(value); - if (i !== -1) { - return `${contextName}Variable${i}`; - } - return null; - } -} - -function glExtensionWiretap(extension, options) { - const proxy = new Proxy(extension, { get: listen }); - const extensionEntityNames = {}; - const { - contextName, - contextVariables, - getEntity, - useTrackablePrimitives, - recording, - variables, - indent, - onUnrecognizedArgumentLookup, - } = options; - return proxy; - function listen(obj, property) { - if (typeof obj[property] === 'function') { - return function() { - switch (property) { - case 'drawBuffersWEBGL': - recording.push(`${indent}${contextName}.drawBuffersWEBGL([${argumentsToString(arguments[0], { contextName, contextVariables, getEntity: getExtensionEntity, addVariable, variables, onUnrecognizedArgumentLookup })}]);`); - return extension.drawBuffersWEBGL(arguments[0]); - } - let result = extension[property].apply(extension, arguments); - switch (typeof result) { - case 'undefined': - recording.push(`${indent}${methodCallToString(property, arguments)};`); - return; - case 'number': - case 'boolean': - if (useTrackablePrimitives && contextVariables.indexOf(trackablePrimitive(result)) === -1) { - recording.push(`${indent}const ${contextName}Variable${contextVariables.length} = ${methodCallToString(property, arguments)};`); - contextVariables.push(result = trackablePrimitive(result)); - } else { - recording.push(`${indent}const ${contextName}Variable${contextVariables.length} = ${methodCallToString(property, arguments)};`); - contextVariables.push(result); - } - break; - default: - if (result === null) { - recording.push(`${methodCallToString(property, arguments)};`); - } else { - recording.push(`${indent}const ${contextName}Variable${contextVariables.length} = ${methodCallToString(property, arguments)};`); - } - contextVariables.push(result); - } - return result; - }; - } - extensionEntityNames[extension[property]] = property; - return extension[property]; - } - - function getExtensionEntity(value) { - if (extensionEntityNames.hasOwnProperty(value)) { - return `${contextName}.${extensionEntityNames[value]}`; - } - return getEntity(value); - } - - function methodCallToString(method, args) { - return `${contextName}.${method}(${argumentsToString(args, { contextName, contextVariables, getEntity: getExtensionEntity, addVariable, variables, onUnrecognizedArgumentLookup })})`; - } - - function addVariable(value, source) { - const variableName = `${contextName}Variable${contextVariables.length}`; - contextVariables.push(value); - recording.push(`${indent}const ${variableName} = ${source};`); - return variableName; - } -} - -function argumentsToString(args, options) { - const { variables, onUnrecognizedArgumentLookup } = options; - return (Array.from(args).map((arg) => { - const variableName = getVariableName(arg); - if (variableName) { - return variableName; - } - return argumentToString(arg, options); - }).join(', ')); - - function getVariableName(value) { - if (variables) { - for (const name in variables) { - if (!variables.hasOwnProperty(name)) continue; - if (variables[name] === value) { - return name; - } - } - } - if (onUnrecognizedArgumentLookup) { - return onUnrecognizedArgumentLookup(value); - } - return null; - } -} - -function argumentToString(arg, options) { - const { contextName, contextVariables, getEntity, addVariable, onUnrecognizedArgumentLookup } = options; - if (typeof arg === 'undefined') { - return 'undefined'; - } - if (arg === null) { - return 'null'; - } - const i = contextVariables.indexOf(arg); - if (i > -1) { - return `${contextName}Variable${i}`; - } - switch (arg.constructor.name) { - case 'String': - const hasLines = /\n/.test(arg); - const hasSingleQuotes = /'/.test(arg); - const hasDoubleQuotes = /"/.test(arg); - if (hasLines) { - return '`' + arg + '`'; - } else if (hasSingleQuotes && !hasDoubleQuotes) { - return '"' + arg + '"'; - } else if (!hasSingleQuotes && hasDoubleQuotes) { - return "'" + arg + "'"; - } else { - return '\'' + arg + '\''; - } - case 'Number': return getEntity(arg); - case 'Boolean': return getEntity(arg); - case 'Array': - return addVariable(arg, `new ${arg.constructor.name}([${Array.from(arg).join(',')}])`); - case 'Float32Array': - case 'Uint8Array': - case 'Uint16Array': - case 'Int32Array': - return addVariable(arg, `new ${arg.constructor.name}(${JSON.stringify(Array.from(arg))})`); - default: - if (onUnrecognizedArgumentLookup) { - const instantiationString = onUnrecognizedArgumentLookup(arg); - if (instantiationString) { - return instantiationString; - } - } - throw new Error(`unrecognized argument type ${arg.constructor.name}`); - } -} - -function trackablePrimitive(value) { - return new value.constructor(value); -} - -if (typeof module !== 'undefined') { - module.exports = { glWiretap, glExtensionWiretap }; -} - -if (typeof window !== 'undefined') { - glWiretap.glExtensionWiretap = glExtensionWiretap; - window.glWiretap = glWiretap; -} - -},{}],4:[function(require,module,exports){ -function setupArguments(args) { - const newArguments = new Array(args.length); - for (let i = 0; i < args.length; i++) { - const arg = args[i]; - if (arg.toArray) { - newArguments[i] = arg.toArray(); - } else { - newArguments[i] = arg; - } - } - return newArguments; -} - -function mock1D() { - const args = setupArguments(arguments); - const row = new Float32Array(this.output.x); - for (let x = 0; x < this.output.x; x++) { - this.thread.x = x; - this.thread.y = 0; - this.thread.z = 0; - row[x] = this._fn.apply(this, args); - } - return row; -} - -function mock2D() { - const args = setupArguments(arguments); - const matrix = new Array(this.output.y); - for (let y = 0; y < this.output.y; y++) { - const row = new Float32Array(this.output.x); - for (let x = 0; x < this.output.x; x++) { - this.thread.x = x; - this.thread.y = y; - this.thread.z = 0; - row[x] = this._fn.apply(this, args); - } - matrix[y] = row; - } - return matrix; -} - -function mock2DGraphical() { - const args = setupArguments(arguments); - for (let y = 0; y < this.output.y; y++) { - for (let x = 0; x < this.output.x; x++) { - this.thread.x = x; - this.thread.y = y; - this.thread.z = 0; - this._fn.apply(this, args); - } - } -} - -function mock3D() { - const args = setupArguments(arguments); - const cube = new Array(this.output.z); - for (let z = 0; z < this.output.z; z++) { - const matrix = new Array(this.output.y); - for (let y = 0; y < this.output.y; y++) { - const row = new Float32Array(this.output.x); - for (let x = 0; x < this.output.x; x++) { - this.thread.x = x; - this.thread.y = y; - this.thread.z = z; - row[x] = this._fn.apply(this, args); - } - matrix[y] = row; - } - cube[z] = matrix; - } - return cube; -} - -function apiDecorate(kernel) { - kernel.setOutput = (output) => { - kernel.output = setupOutput(output); - if (kernel.graphical) { - setupGraphical(kernel); - } - }; - kernel.toJSON = () => { - throw new Error('Not usable with gpuMock'); - }; - kernel.setConstants = (flag) => { - kernel.constants = flag; - return kernel; - }; - kernel.setGraphical = (flag) => { - kernel.graphical = flag; - return kernel; - }; - kernel.setCanvas = (flag) => { - kernel.canvas = flag; - return kernel; - }; - kernel.setContext = (flag) => { - kernel.context = flag; - return kernel; - }; - kernel.destroy = () => {}; - kernel.validateSettings = () => {}; - if (kernel.graphical && kernel.output) { - setupGraphical(kernel); - } - kernel.exec = function() { - return new Promise((resolve, reject) => { - try { - resolve(kernel.apply(kernel, arguments)); - } catch(e) { - reject(e); - } - }); - }; - kernel.getPixels = (flip) => { - const {x, y} = kernel.output; - return flip ? flipPixels(kernel._imageData.data, x, y) : kernel._imageData.data.slice(0); - }; - kernel.color = function(r, g, b, a) { - if (typeof a === 'undefined') { - a = 1; - } - - r = Math.floor(r * 255); - g = Math.floor(g * 255); - b = Math.floor(b * 255); - a = Math.floor(a * 255); - - const width = kernel.output.x; - const height = kernel.output.y; - - const x = kernel.thread.x; - const y = height - kernel.thread.y - 1; - - const index = x + y * width; - - kernel._colorData[index * 4 + 0] = r; - kernel._colorData[index * 4 + 1] = g; - kernel._colorData[index * 4 + 2] = b; - kernel._colorData[index * 4 + 3] = a; - }; - - const mockMethod = () => kernel; - const methods = [ - 'setWarnVarUsage', - 'setArgumentTypes', - 'setTactic', - 'setOptimizeFloatMemory', - 'setDebug', - 'setLoopMaxIterations', - 'setConstantTypes', - 'setFunctions', - 'setNativeFunctions', - 'setInjectedNative', - 'setPipeline', - 'setPrecision', - 'setOutputToTexture', - 'setImmutable', - 'setStrictIntegers', - 'setDynamicOutput', - 'setHardcodeConstants', - 'setDynamicArguments', - 'setUseLegacyEncoder', - 'setWarnVarUsage', - 'addSubKernel', - ]; - for (let i = 0; i < methods.length; i++) { - kernel[methods[i]] = mockMethod; - } - return kernel; -} - -function setupGraphical(kernel) { - const {x, y} = kernel.output; - if (kernel.context && kernel.context.createImageData) { - const data = new Uint8ClampedArray(x * y * 4); - kernel._imageData = kernel.context.createImageData(x, y); - kernel._colorData = data; - } else { - const data = new Uint8ClampedArray(x * y * 4); - kernel._imageData = { data }; - kernel._colorData = data; - } -} - -function setupOutput(output) { - let result = null; - if (output.length) { - if (output.length === 3) { - const [x,y,z] = output; - result = { x, y, z }; - } else if (output.length === 2) { - const [x,y] = output; - result = { x, y }; - } else { - const [x] = output; - result = { x }; - } - } else { - result = output; - } - return result; -} - -function gpuMock(fn, settings = {}) { - const output = settings.output ? setupOutput(settings.output) : null; - function kernel() { - if (kernel.output.z) { - return mock3D.apply(kernel, arguments); - } else if (kernel.output.y) { - if (kernel.graphical) { - return mock2DGraphical.apply(kernel, arguments); - } - return mock2D.apply(kernel, arguments); - } else { - return mock1D.apply(kernel, arguments); - } - } - kernel._fn = fn; - kernel.constants = settings.constants || null; - kernel.context = settings.context || null; - kernel.canvas = settings.canvas || null; - kernel.graphical = settings.graphical || false; - kernel._imageData = null; - kernel._colorData = null; - kernel.output = output; - kernel.thread = { - x: 0, - y: 0, - z: 0 - }; - return apiDecorate(kernel); -} - -function flipPixels(pixels, width, height) { - const halfHeight = height / 2 | 0; - const bytesPerRow = width * 4; - const temp = new Uint8ClampedArray(width * 4); - const result = pixels.slice(0); - for (let y = 0; y < halfHeight; ++y) { - const topOffset = y * bytesPerRow; - const bottomOffset = (height - y - 1) * bytesPerRow; - - temp.set(result.subarray(topOffset, topOffset + bytesPerRow)); - - result.copyWithin(topOffset, bottomOffset, bottomOffset + bytesPerRow); - - result.set(temp, bottomOffset); - } - return result; -} - -module.exports = { - gpuMock -}; - -},{}],5:[function(require,module,exports){ -const { utils } = require('./utils'); - -function alias(name, source) { - const fnString = source.toString(); - return new Function(`return function ${ name } (${ utils.getArgumentNamesFromString(fnString).join(', ') }) { - ${ utils.getFunctionBodyFromString(fnString) } -}`)(); -} - -module.exports = { - alias -}; -},{"./utils":114}],6:[function(require,module,exports){ -const { FunctionNode } = require('../function-node'); - -class CPUFunctionNode extends FunctionNode { - astFunction(ast, retArr) { - - if (!this.isRootKernel) { - retArr.push('function'); - retArr.push(' '); - retArr.push(this.name); - retArr.push('('); - - for (let i = 0; i < this.argumentNames.length; ++i) { - const argumentName = this.argumentNames[i]; - - if (i > 0) { - retArr.push(', '); - } - retArr.push('user_'); - retArr.push(argumentName); - } - - retArr.push(') {\n'); - } - - for (let i = 0; i < ast.body.body.length; ++i) { - this.astGeneric(ast.body.body[i], retArr); - retArr.push('\n'); - } - - if (!this.isRootKernel) { - retArr.push('}\n'); - } - return retArr; - } - - astReturnStatement(ast, retArr) { - const type = this.returnType || this.getType(ast.argument); - - if (!this.returnType) { - this.returnType = type; - } - - if (this.isRootKernel) { - retArr.push(this.leadingReturnStatement); - this.astGeneric(ast.argument, retArr); - retArr.push(';\n'); - retArr.push(this.followingReturnStatement); - retArr.push('continue;\n'); - } else if (this.isSubKernel) { - retArr.push(`subKernelResult_${ this.name } = `); - this.astGeneric(ast.argument, retArr); - retArr.push(';'); - retArr.push(`return subKernelResult_${ this.name };`); - } else { - retArr.push('return '); - this.astGeneric(ast.argument, retArr); - retArr.push(';'); - } - return retArr; - } - - astLiteral(ast, retArr) { - - if (isNaN(ast.value)) { - throw this.astErrorOutput( - 'Non-numeric literal not supported : ' + ast.value, - ast - ); - } - - retArr.push(ast.value); - - return retArr; - } - - astBinaryExpression(ast, retArr) { - retArr.push('('); - this.astGeneric(ast.left, retArr); - retArr.push(ast.operator); - this.astGeneric(ast.right, retArr); - retArr.push(')'); - return retArr; - } - - astIdentifierExpression(idtNode, retArr) { - if (idtNode.type !== 'Identifier') { - throw this.astErrorOutput( - 'IdentifierExpression - not an Identifier', - idtNode - ); - } - - switch (idtNode.name) { - case 'Infinity': - retArr.push('Infinity'); - break; - default: - if (this.constants && this.constants.hasOwnProperty(idtNode.name)) { - retArr.push('constants_' + idtNode.name); - } else { - retArr.push('user_' + idtNode.name); - } - } - - return retArr; - } - - astForStatement(forNode, retArr) { - if (forNode.type !== 'ForStatement') { - throw this.astErrorOutput('Invalid for statement', forNode); - } - - const initArr = []; - const testArr = []; - const updateArr = []; - const bodyArr = []; - let isSafe = null; - - if (forNode.init) { - this.pushState('in-for-loop-init'); - this.astGeneric(forNode.init, initArr); - for (let i = 0; i < initArr.length; i++) { - if (initArr[i].includes && initArr[i].includes(',')) { - isSafe = false; - } - } - this.popState('in-for-loop-init'); - } else { - isSafe = false; - } - - if (forNode.test) { - this.astGeneric(forNode.test, testArr); - } else { - isSafe = false; - } - - if (forNode.update) { - this.astGeneric(forNode.update, updateArr); - } else { - isSafe = false; - } - - if (forNode.body) { - this.pushState('loop-body'); - this.astGeneric(forNode.body, bodyArr); - this.popState('loop-body'); - } - - if (isSafe === null) { - isSafe = this.isSafe(forNode.init) && this.isSafe(forNode.test); - } - - if (isSafe) { - retArr.push(`for (${initArr.join('')};${testArr.join('')};${updateArr.join('')}){\n`); - retArr.push(bodyArr.join('')); - retArr.push('}\n'); - } else { - const iVariableName = this.getInternalVariableName('safeI'); - if (initArr.length > 0) { - retArr.push(initArr.join(''), ';\n'); - } - retArr.push(`for (let ${iVariableName}=0;${iVariableName} 0) { - retArr.push(`if (!${testArr.join('')}) break;\n`); - } - retArr.push(bodyArr.join('')); - retArr.push(`\n${updateArr.join('')};`); - retArr.push('}\n'); - } - return retArr; - } - - astWhileStatement(whileNode, retArr) { - if (whileNode.type !== 'WhileStatement') { - throw this.astErrorOutput( - 'Invalid while statement', - whileNode - ); - } - - retArr.push('for (let i = 0; i < LOOP_MAX; i++) {'); - retArr.push('if ('); - this.astGeneric(whileNode.test, retArr); - retArr.push(') {\n'); - this.astGeneric(whileNode.body, retArr); - retArr.push('} else {\n'); - retArr.push('break;\n'); - retArr.push('}\n'); - retArr.push('}\n'); - - return retArr; - } - - astDoWhileStatement(doWhileNode, retArr) { - if (doWhileNode.type !== 'DoWhileStatement') { - throw this.astErrorOutput( - 'Invalid while statement', - doWhileNode - ); - } - - retArr.push('for (let i = 0; i < LOOP_MAX; i++) {'); - this.astGeneric(doWhileNode.body, retArr); - retArr.push('if (!'); - this.astGeneric(doWhileNode.test, retArr); - retArr.push(') {\n'); - retArr.push('break;\n'); - retArr.push('}\n'); - retArr.push('}\n'); - - return retArr; - - } - - astAssignmentExpression(assNode, retArr) { - const declaration = this.getDeclaration(assNode.left); - if (declaration && !declaration.assignable) { - throw this.astErrorOutput(`Variable ${assNode.left.name} is not assignable here`, assNode); - } - this.astGeneric(assNode.left, retArr); - retArr.push(assNode.operator); - this.astGeneric(assNode.right, retArr); - return retArr; - } - - astBlockStatement(bNode, retArr) { - if (this.isState('loop-body')) { - this.pushState('block-body'); - for (let i = 0; i < bNode.body.length; i++) { - this.astGeneric(bNode.body[i], retArr); - } - this.popState('block-body'); - } else { - retArr.push('{\n'); - for (let i = 0; i < bNode.body.length; i++) { - this.astGeneric(bNode.body[i], retArr); - } - retArr.push('}\n'); - } - return retArr; - } - - astVariableDeclaration(varDecNode, retArr) { - retArr.push(`${varDecNode.kind} `); - const { declarations } = varDecNode; - for (let i = 0; i < declarations.length; i++) { - if (i > 0) { - retArr.push(','); - } - const declaration = declarations[i]; - const info = this.getDeclaration(declaration.id); - if (!info.valueType) { - info.valueType = this.getType(declaration.init); - } - this.astGeneric(declaration, retArr); - } - if (!this.isState('in-for-loop-init')) { - retArr.push(';'); - } - return retArr; - } - - astIfStatement(ifNode, retArr) { - retArr.push('if ('); - this.astGeneric(ifNode.test, retArr); - retArr.push(')'); - if (ifNode.consequent.type === 'BlockStatement') { - this.astGeneric(ifNode.consequent, retArr); - } else { - retArr.push(' {\n'); - this.astGeneric(ifNode.consequent, retArr); - retArr.push('\n}\n'); - } - - if (ifNode.alternate) { - retArr.push('else '); - if (ifNode.alternate.type === 'BlockStatement' || ifNode.alternate.type === 'IfStatement') { - this.astGeneric(ifNode.alternate, retArr); - } else { - retArr.push(' {\n'); - this.astGeneric(ifNode.alternate, retArr); - retArr.push('\n}\n'); - } - } - return retArr; - - } - - astSwitchStatement(ast, retArr) { - const { discriminant, cases } = ast; - retArr.push('switch ('); - this.astGeneric(discriminant, retArr); - retArr.push(') {\n'); - for (let i = 0; i < cases.length; i++) { - if (cases[i].test === null) { - retArr.push('default:\n'); - this.astGeneric(cases[i].consequent, retArr); - if (cases[i].consequent && cases[i].consequent.length > 0) { - retArr.push('break;\n'); - } - continue; - } - retArr.push('case '); - this.astGeneric(cases[i].test, retArr); - retArr.push(':\n'); - if (cases[i].consequent && cases[i].consequent.length > 0) { - this.astGeneric(cases[i].consequent, retArr); - retArr.push('break;\n'); - } - } - retArr.push('\n}'); - } - - astThisExpression(tNode, retArr) { - retArr.push('_this'); - return retArr; - } - - astMemberExpression(mNode, retArr) { - const { - signature, - type, - property, - xProperty, - yProperty, - zProperty, - name, - origin - } = this.getMemberExpressionDetails(mNode); - switch (signature) { - case 'this.thread.value': - retArr.push(`_this.thread.${ name }`); - return retArr; - case 'this.output.value': - switch (name) { - case 'x': - retArr.push('outputX'); - break; - case 'y': - retArr.push('outputY'); - break; - case 'z': - retArr.push('outputZ'); - break; - default: - throw this.astErrorOutput('Unexpected expression', mNode); - } - return retArr; - case 'value': - throw this.astErrorOutput('Unexpected expression', mNode); - case 'value[]': - case 'value[][]': - case 'value[][][]': - case 'value.value': - if (origin === 'Math') { - retArr.push(Math[name]); - return retArr; - } - switch (property) { - case 'r': - retArr.push(`user_${ name }[0]`); - return retArr; - case 'g': - retArr.push(`user_${ name }[1]`); - return retArr; - case 'b': - retArr.push(`user_${ name }[2]`); - return retArr; - case 'a': - retArr.push(`user_${ name }[3]`); - return retArr; - } - break; - case 'this.constants.value': - case 'this.constants.value[]': - case 'this.constants.value[][]': - case 'this.constants.value[][][]': - break; - case 'fn()[]': - this.astGeneric(mNode.object, retArr); - retArr.push('['); - this.astGeneric(mNode.property, retArr); - retArr.push(']'); - return retArr; - case 'fn()[][]': - this.astGeneric(mNode.object.object, retArr); - retArr.push('['); - this.astGeneric(mNode.object.property, retArr); - retArr.push(']'); - retArr.push('['); - this.astGeneric(mNode.property, retArr); - retArr.push(']'); - return retArr; - default: - throw this.astErrorOutput('Unexpected expression', mNode); - } - - if (!mNode.computed) { - switch (type) { - case 'Number': - case 'Integer': - case 'Float': - case 'Boolean': - retArr.push(`${origin}_${name}`); - return retArr; - } - } - - const markupName = `${origin}_${name}`; - - switch (type) { - case 'Array(2)': - case 'Array(3)': - case 'Array(4)': - case 'Matrix(2)': - case 'Matrix(3)': - case 'Matrix(4)': - case 'HTMLImageArray': - case 'ArrayTexture(1)': - case 'ArrayTexture(2)': - case 'ArrayTexture(3)': - case 'ArrayTexture(4)': - case 'HTMLImage': - default: - let size; - let isInput; - if (origin === 'constants') { - const constant = this.constants[name]; - isInput = this.constantTypes[name] === 'Input'; - size = isInput ? constant.size : null; - } else { - isInput = this.isInput(name); - size = isInput ? this.argumentSizes[this.argumentNames.indexOf(name)] : null; - } - retArr.push(`${ markupName }`); - if (zProperty && yProperty) { - if (isInput) { - retArr.push('[('); - this.astGeneric(zProperty, retArr); - retArr.push(`*${ this.dynamicArguments ? '(outputY * outputX)' : size[1] * size[0] })+(`); - this.astGeneric(yProperty, retArr); - retArr.push(`*${ this.dynamicArguments ? 'outputX' : size[0] })+`); - this.astGeneric(xProperty, retArr); - retArr.push(']'); - } else { - retArr.push('['); - this.astGeneric(zProperty, retArr); - retArr.push(']'); - retArr.push('['); - this.astGeneric(yProperty, retArr); - retArr.push(']'); - retArr.push('['); - this.astGeneric(xProperty, retArr); - retArr.push(']'); - } - } else if (yProperty) { - if (isInput) { - retArr.push('[('); - this.astGeneric(yProperty, retArr); - retArr.push(`*${ this.dynamicArguments ? 'outputX' : size[0] })+`); - this.astGeneric(xProperty, retArr); - retArr.push(']'); - } else { - retArr.push('['); - this.astGeneric(yProperty, retArr); - retArr.push(']'); - retArr.push('['); - this.astGeneric(xProperty, retArr); - retArr.push(']'); - } - } else if (typeof xProperty !== 'undefined') { - retArr.push('['); - this.astGeneric(xProperty, retArr); - retArr.push(']'); - } - } - return retArr; - } - - astCallExpression(ast, retArr) { - if (ast.type !== 'CallExpression') { - throw this.astErrorOutput('Unknown CallExpression', ast); - } - let functionName = this.astMemberExpressionUnroll(ast.callee); - - if (this.calledFunctions.indexOf(functionName) < 0) { - this.calledFunctions.push(functionName); - } - - const isMathFunction = this.isAstMathFunction(ast); - - if (this.onFunctionCall) { - this.onFunctionCall(this.name, functionName, ast.arguments); - } - - retArr.push(functionName); - - retArr.push('('); - const targetTypes = this.lookupFunctionArgumentTypes(functionName) || []; - for (let i = 0; i < ast.arguments.length; ++i) { - const argument = ast.arguments[i]; - - let argumentType = this.getType(argument); - if (!targetTypes[i]) { - this.triggerImplyArgumentType(functionName, i, argumentType, this); - } - - if (i > 0) { - retArr.push(', '); - } - this.astGeneric(argument, retArr); - } - retArr.push(')'); - - return retArr; - } - - astArrayExpression(arrNode, retArr) { - const returnType = this.getType(arrNode); - const arrLen = arrNode.elements.length; - const elements = []; - for (let i = 0; i < arrLen; ++i) { - const element = []; - this.astGeneric(arrNode.elements[i], element); - elements.push(element.join('')); - } - switch (returnType) { - case 'Matrix(2)': - case 'Matrix(3)': - case 'Matrix(4)': - retArr.push(`[${elements.join(', ')}]`); - break; - default: - retArr.push(`new Float32Array([${elements.join(', ')}])`); - } - return retArr; - } - - astDebuggerStatement(arrNode, retArr) { - retArr.push('debugger;'); - return retArr; - } -} - -module.exports = { - CPUFunctionNode -}; -},{"../function-node":10}],7:[function(require,module,exports){ -const { utils } = require('../../utils'); - -function constantsToString(constants, types) { - const results = []; - for (const name in types) { - if (!types.hasOwnProperty(name)) continue; - const type = types[name]; - const constant = constants[name]; - switch (type) { - case 'Number': - case 'Integer': - case 'Float': - case 'Boolean': - results.push(`${name}:${constant}`); - break; - case 'Array(2)': - case 'Array(3)': - case 'Array(4)': - case 'Matrix(2)': - case 'Matrix(3)': - case 'Matrix(4)': - results.push(`${name}:new ${constant.constructor.name}(${JSON.stringify(Array.from(constant))})`); - break; - } - } - return `{ ${ results.join() } }`; -} - -function cpuKernelString(cpuKernel, name) { - const header = []; - const thisProperties = []; - const beforeReturn = []; - - const useFunctionKeyword = !/^function/.test(cpuKernel.color.toString()); - - header.push( - ' const { context, canvas, constants: incomingConstants } = settings;', - ` const output = new Int32Array(${JSON.stringify(Array.from(cpuKernel.output))});`, - ` const _constantTypes = ${JSON.stringify(cpuKernel.constantTypes)};`, - ` const _constants = ${constantsToString(cpuKernel.constants, cpuKernel.constantTypes)};` - ); - - thisProperties.push( - ' constants: _constants,', - ' context,', - ' output,', - ' thread: {x: 0, y: 0, z: 0},' - ); - - if (cpuKernel.graphical) { - header.push(` const _imageData = context.createImageData(${cpuKernel.output[0]}, ${cpuKernel.output[1]});`); - header.push(` const _colorData = new Uint8ClampedArray(${cpuKernel.output[0]} * ${cpuKernel.output[1]} * 4);`); - - const colorFn = utils.flattenFunctionToString((useFunctionKeyword ? 'function ' : '') + cpuKernel.color.toString(), { - thisLookup: (propertyName) => { - switch (propertyName) { - case '_colorData': - return '_colorData'; - case '_imageData': - return '_imageData'; - case 'output': - return 'output'; - case 'thread': - return 'this.thread'; - } - return JSON.stringify(cpuKernel[propertyName]); - }, - findDependency: (object, name) => { - return null; - } - }); - - const getPixelsFn = utils.flattenFunctionToString((useFunctionKeyword ? 'function ' : '') + cpuKernel.getPixels.toString(), { - thisLookup: (propertyName) => { - switch (propertyName) { - case '_colorData': - return '_colorData'; - case '_imageData': - return '_imageData'; - case 'output': - return 'output'; - case 'thread': - return 'this.thread'; - } - return JSON.stringify(cpuKernel[propertyName]); - }, - findDependency: () => { - return null; - } - }); - - thisProperties.push( - ' _imageData,', - ' _colorData,', - ` color: ${colorFn},` - ); - - beforeReturn.push( - ` kernel.getPixels = ${getPixelsFn};` - ); - } - - const constantTypes = []; - const constantKeys = Object.keys(cpuKernel.constantTypes); - for (let i = 0; i < constantKeys.length; i++) { - constantTypes.push(cpuKernel.constantTypes[constantKeys]); - } - if (cpuKernel.argumentTypes.indexOf('HTMLImageArray') !== -1 || constantTypes.indexOf('HTMLImageArray') !== -1) { - const flattenedImageTo3DArray = utils.flattenFunctionToString((useFunctionKeyword ? 'function ' : '') + cpuKernel._imageTo3DArray.toString(), { - doNotDefine: ['canvas'], - findDependency: (object, name) => { - if (object === 'this') { - return (useFunctionKeyword ? 'function ' : '') + cpuKernel[name].toString(); - } - return null; - }, - thisLookup: (propertyName) => { - switch (propertyName) { - case 'canvas': - return; - case 'context': - return 'context'; - } - } - }); - beforeReturn.push(flattenedImageTo3DArray); - thisProperties.push(` _mediaTo2DArray,`); - thisProperties.push(` _imageTo3DArray,`); - } else if (cpuKernel.argumentTypes.indexOf('HTMLImage') !== -1 || constantTypes.indexOf('HTMLImage') !== -1) { - const flattenedImageTo2DArray = utils.flattenFunctionToString((useFunctionKeyword ? 'function ' : '') + cpuKernel._mediaTo2DArray.toString(), { - findDependency: (object, name) => { - return null; - }, - thisLookup: (propertyName) => { - switch (propertyName) { - case 'canvas': - return 'settings.canvas'; - case 'context': - return 'settings.context'; - } - throw new Error('unhandled thisLookup'); - } - }); - beforeReturn.push(flattenedImageTo2DArray); - thisProperties.push(` _mediaTo2DArray,`); - } - - return `function(settings) { -${ header.join('\n') } - for (const p in _constantTypes) { - if (!_constantTypes.hasOwnProperty(p)) continue; - const type = _constantTypes[p]; - switch (type) { - case 'Number': - case 'Integer': - case 'Float': - case 'Boolean': - case 'Array(2)': - case 'Array(3)': - case 'Array(4)': - case 'Matrix(2)': - case 'Matrix(3)': - case 'Matrix(4)': - if (incomingConstants.hasOwnProperty(p)) { - console.warn('constant ' + p + ' of type ' + type + ' cannot be resigned'); - } - continue; - } - if (!incomingConstants.hasOwnProperty(p)) { - throw new Error('constant ' + p + ' not found'); - } - _constants[p] = incomingConstants[p]; - } - const kernel = (function() { -${cpuKernel._kernelString} - }) - .apply({ ${thisProperties.join('\n')} }); - ${ beforeReturn.join('\n') } - return kernel; -}`; -} - -module.exports = { - cpuKernelString -}; -},{"../../utils":114}],8:[function(require,module,exports){ -const { Kernel } = require('../kernel'); -const { FunctionBuilder } = require('../function-builder'); -const { CPUFunctionNode } = require('./function-node'); -const { utils } = require('../../utils'); -const { cpuKernelString } = require('./kernel-string'); - -class CPUKernel extends Kernel { - static getFeatures() { - return this.features; - } - static get features() { - return Object.freeze({ - kernelMap: true, - isIntegerDivisionAccurate: true - }); - } - static get isSupported() { - return true; - } - static isContextMatch(context) { - return false; - } - static get mode() { - return 'cpu'; - } - - static nativeFunctionArguments() { - return null; - } - - static nativeFunctionReturnType() { - throw new Error(`Looking up native function return type not supported on ${this.name}`); - } - - static combineKernels(combinedKernel) { - return combinedKernel; - } - - static getSignature(kernel, argumentTypes) { - return 'cpu' + (argumentTypes.length > 0 ? ':' + argumentTypes.join(',') : ''); - } - - constructor(source, settings) { - super(source, settings); - this.mergeSettings(source.settings || settings); - - this._imageData = null; - this._colorData = null; - this._kernelString = null; - this._prependedString = []; - this.thread = { - x: 0, - y: 0, - z: 0 - }; - this.translatedSources = null; - } - - initCanvas() { - if (typeof document !== 'undefined') { - return document.createElement('canvas'); - } else if (typeof OffscreenCanvas !== 'undefined') { - return new OffscreenCanvas(0, 0); - } - } - - initContext() { - if (!this.canvas) return null; - return this.canvas.getContext('2d'); - } - - initPlugins(settings) { - return []; - } - - validateSettings(args) { - if (!this.output || this.output.length === 0) { - if (args.length !== 1) { - throw new Error('Auto output only supported for kernels with only one input'); - } - - const argType = utils.getVariableType(args[0], this.strictIntegers); - if (argType === 'Array') { - this.output = utils.getDimensions(argType); - } else if (argType === 'NumberTexture' || argType === 'ArrayTexture(4)') { - this.output = args[0].output; - } else { - throw new Error('Auto output not supported for input type: ' + argType); - } - } - - if (this.graphical) { - if (this.output.length !== 2) { - throw new Error('Output must have 2 dimensions on graphical mode'); - } - } - - this.checkOutput(); - } - - translateSource() { - this.leadingReturnStatement = this.output.length > 1 ? 'resultX[x] = ' : 'result[x] = '; - if (this.subKernels) { - const followingReturnStatement = []; - for (let i = 0; i < this.subKernels.length; i++) { - const { - name - } = this.subKernels[i]; - followingReturnStatement.push(this.output.length > 1 ? `resultX_${ name }[x] = subKernelResult_${ name };\n` : `result_${ name }[x] = subKernelResult_${ name };\n`); - } - this.followingReturnStatement = followingReturnStatement.join(''); - } - const functionBuilder = FunctionBuilder.fromKernel(this, CPUFunctionNode); - this.translatedSources = functionBuilder.getPrototypes('kernel'); - if (!this.graphical && !this.returnType) { - this.returnType = functionBuilder.getKernelResultType(); - } - } - - build() { - if (this.built) return; - this.setupConstants(); - this.setupArguments(arguments); - this.validateSettings(arguments); - this.translateSource(); - - if (this.graphical) { - const { - canvas, - output - } = this; - if (!canvas) { - throw new Error('no canvas available for using graphical output'); - } - const width = output[0]; - const height = output[1] || 1; - canvas.width = width; - canvas.height = height; - this._imageData = this.context.createImageData(width, height); - this._colorData = new Uint8ClampedArray(width * height * 4); - } - - const kernelString = this.getKernelString(); - this.kernelString = kernelString; - - if (this.debug) { - console.log('Function output:'); - console.log(kernelString); - } - - try { - this.run = new Function([], kernelString).bind(this)(); - } catch (e) { - console.error('An error occurred compiling the javascript: ', e); - } - this.buildSignature(arguments); - this.built = true; - } - - color(r, g, b, a) { - if (typeof a === 'undefined') { - a = 1; - } - - r = Math.floor(r * 255); - g = Math.floor(g * 255); - b = Math.floor(b * 255); - a = Math.floor(a * 255); - - const width = this.output[0]; - const height = this.output[1]; - - const x = this.thread.x; - const y = height - this.thread.y - 1; - - const index = x + y * width; - - this._colorData[index * 4 + 0] = r; - this._colorData[index * 4 + 1] = g; - this._colorData[index * 4 + 2] = b; - this._colorData[index * 4 + 3] = a; - } - - getKernelString() { - if (this._kernelString !== null) return this._kernelString; - - let kernelThreadString = null; - let { - translatedSources - } = this; - if (translatedSources.length > 1) { - translatedSources = translatedSources.filter(fn => { - if (/^function/.test(fn)) return fn; - kernelThreadString = fn; - return false; - }); - } else { - kernelThreadString = translatedSources.shift(); - } - return this._kernelString = ` const LOOP_MAX = ${ this._getLoopMaxString() }; - ${ this.injectedNative || '' } - const _this = this; - ${ this._resultKernelHeader() } - ${ this._processConstants() } - return (${ this.argumentNames.map(argumentName => 'user_' + argumentName).join(', ') }) => { - ${ this._prependedString.join('') } - ${ this._earlyThrows() } - ${ this._processArguments() } - ${ this.graphical ? this._graphicalKernelBody(kernelThreadString) : this._resultKernelBody(kernelThreadString) } - ${ translatedSources.length > 0 ? translatedSources.join('\n') : '' } - };`; - } - - toString() { - return cpuKernelString(this); - } - - _getLoopMaxString() { - return ( - this.loopMaxIterations ? - ` ${ parseInt(this.loopMaxIterations) };` : - ' 1000;' - ); - } - - _processConstants() { - if (!this.constants) return ''; - - const result = []; - for (let p in this.constants) { - const type = this.constantTypes[p]; - switch (type) { - case 'HTMLCanvas': - case 'OffscreenCanvas': - case 'HTMLImage': - case 'ImageBitmap': - case 'ImageData': - case 'HTMLVideo': - result.push(` const constants_${p} = this._mediaTo2DArray(this.constants.${p});\n`); - break; - case 'HTMLImageArray': - result.push(` const constants_${p} = this._imageTo3DArray(this.constants.${p});\n`); - break; - case 'Input': - result.push(` const constants_${p} = this.constants.${p}.value;\n`); - break; - default: - result.push(` const constants_${p} = this.constants.${p};\n`); - } - } - return result.join(''); - } - - _earlyThrows() { - if (this.graphical) return ''; - if (this.immutable) return ''; - if (!this.pipeline) return ''; - const arrayArguments = []; - for (let i = 0; i < this.argumentTypes.length; i++) { - if (this.argumentTypes[i] === 'Array') { - arrayArguments.push(this.argumentNames[i]); - } - } - if (arrayArguments.length === 0) return ''; - const checks = []; - for (let i = 0; i < arrayArguments.length; i++) { - const argumentName = arrayArguments[i]; - const checkSubKernels = this._mapSubKernels(subKernel => `user_${argumentName} === result_${subKernel.name}`).join(' || '); - checks.push(`user_${argumentName} === result${checkSubKernels ? ` || ${checkSubKernels}` : ''}`); - } - return `if (${checks.join(' || ')}) throw new Error('Source and destination arrays are the same. Use immutable = true');`; - } - - _processArguments() { - const result = []; - for (let i = 0; i < this.argumentTypes.length; i++) { - const variableName = `user_${this.argumentNames[i]}`; - switch (this.argumentTypes[i]) { - case 'HTMLCanvas': - case 'OffscreenCanvas': - case 'HTMLImage': - case 'ImageBitmap': - case 'ImageData': - case 'HTMLVideo': - result.push(` ${variableName} = this._mediaTo2DArray(${variableName});\n`); - break; - case 'HTMLImageArray': - result.push(` ${variableName} = this._imageTo3DArray(${variableName});\n`); - break; - case 'Input': - result.push(` ${variableName} = ${variableName}.value;\n`); - break; - case 'ArrayTexture(1)': - case 'ArrayTexture(2)': - case 'ArrayTexture(3)': - case 'ArrayTexture(4)': - case 'NumberTexture': - case 'MemoryOptimizedNumberTexture': - result.push(` - if (${variableName}.toArray) { - if (!_this.textureCache) { - _this.textureCache = []; - _this.arrayCache = []; - } - const textureIndex = _this.textureCache.indexOf(${variableName}); - if (textureIndex !== -1) { - ${variableName} = _this.arrayCache[textureIndex]; - } else { - _this.textureCache.push(${variableName}); - ${variableName} = ${variableName}.toArray(); - _this.arrayCache.push(${variableName}); - } - }`); - break; - } - } - return result.join(''); - } - - _mediaTo2DArray(media) { - const canvas = this.canvas; - const width = media.width > 0 ? media.width : media.videoWidth; - const height = media.height > 0 ? media.height : media.videoHeight; - if (canvas.width < width) { - canvas.width = width; - } - if (canvas.height < height) { - canvas.height = height; - } - const ctx = this.context; - let pixelsData; - if (media.constructor === ImageData) { - pixelsData = media.data; - } else { - ctx.drawImage(media, 0, 0, width, height); - pixelsData = ctx.getImageData(0, 0, width, height).data; - } - const imageArray = new Array(height); - let index = 0; - for (let y = height - 1; y >= 0; y--) { - const row = imageArray[y] = new Array(width); - for (let x = 0; x < width; x++) { - const pixel = new Float32Array(4); - pixel[0] = pixelsData[index++] / 255; - pixel[1] = pixelsData[index++] / 255; - pixel[2] = pixelsData[index++] / 255; - pixel[3] = pixelsData[index++] / 255; - row[x] = pixel; - } - } - return imageArray; - } - - getPixels(flip) { - const [width, height] = this.output; - return flip ? utils.flipPixels(this._imageData.data, width, height) : this._imageData.data.slice(0); - } - - _imageTo3DArray(images) { - const imagesArray = new Array(images.length); - for (let i = 0; i < images.length; i++) { - imagesArray[i] = this._mediaTo2DArray(images[i]); - } - return imagesArray; - } - - _resultKernelHeader() { - if (this.graphical) return ''; - if (this.immutable) return ''; - if (!this.pipeline) return ''; - switch (this.output.length) { - case 1: - return this._mutableKernel1DResults(); - case 2: - return this._mutableKernel2DResults(); - case 3: - return this._mutableKernel3DResults(); - } - } - - _resultKernelBody(kernelString) { - switch (this.output.length) { - case 1: - return (!this.immutable && this.pipeline ? this._resultMutableKernel1DLoop(kernelString) : this._resultImmutableKernel1DLoop(kernelString)) + this._kernelOutput(); - case 2: - return (!this.immutable && this.pipeline ? this._resultMutableKernel2DLoop(kernelString) : this._resultImmutableKernel2DLoop(kernelString)) + this._kernelOutput(); - case 3: - return (!this.immutable && this.pipeline ? this._resultMutableKernel3DLoop(kernelString) : this._resultImmutableKernel3DLoop(kernelString)) + this._kernelOutput(); - default: - throw new Error('unsupported size kernel'); - } - } - - _graphicalKernelBody(kernelThreadString) { - switch (this.output.length) { - case 2: - return this._graphicalKernel2DLoop(kernelThreadString) + this._graphicalOutput(); - default: - throw new Error('unsupported size kernel'); - } - } - - _graphicalOutput() { - return ` - this._imageData.data.set(this._colorData); - this.context.putImageData(this._imageData, 0, 0); - return;` - } - - _getKernelResultTypeConstructorString() { - switch (this.returnType) { - case 'LiteralInteger': - case 'Number': - case 'Integer': - case 'Float': - return 'Float32Array'; - case 'Array(2)': - case 'Array(3)': - case 'Array(4)': - return 'Array'; - default: - if (this.graphical) { - return 'Float32Array'; - } - throw new Error(`unhandled returnType ${ this.returnType }`); - } - } - - _resultImmutableKernel1DLoop(kernelString) { - const constructorString = this._getKernelResultTypeConstructorString(); - return ` const outputX = _this.output[0]; - const result = new ${constructorString}(outputX); - ${ this._mapSubKernels(subKernel => `const result_${ subKernel.name } = new ${constructorString}(outputX);\n`).join(' ') } - ${ this._mapSubKernels(subKernel => `let subKernelResult_${ subKernel.name };\n`).join(' ') } - for (let x = 0; x < outputX; x++) { - this.thread.x = x; - this.thread.y = 0; - this.thread.z = 0; - ${ kernelString } - }`; - } - - _mutableKernel1DResults() { - const constructorString = this._getKernelResultTypeConstructorString(); - return ` const outputX = _this.output[0]; - const result = new ${constructorString}(outputX); - ${ this._mapSubKernels(subKernel => `const result_${ subKernel.name } = new ${constructorString}(outputX);\n`).join(' ') } - ${ this._mapSubKernels(subKernel => `let subKernelResult_${ subKernel.name };\n`).join(' ') }`; - } - - _resultMutableKernel1DLoop(kernelString) { - return ` const outputX = _this.output[0]; - for (let x = 0; x < outputX; x++) { - this.thread.x = x; - this.thread.y = 0; - this.thread.z = 0; - ${ kernelString } - }`; - } - - _resultImmutableKernel2DLoop(kernelString) { - const constructorString = this._getKernelResultTypeConstructorString(); - return ` const outputX = _this.output[0]; - const outputY = _this.output[1]; - const result = new Array(outputY); - ${ this._mapSubKernels(subKernel => `const result_${ subKernel.name } = new Array(outputY);\n`).join(' ') } - ${ this._mapSubKernels(subKernel => `let subKernelResult_${ subKernel.name };\n`).join(' ') } - for (let y = 0; y < outputY; y++) { - this.thread.z = 0; - this.thread.y = y; - const resultX = result[y] = new ${constructorString}(outputX); - ${ this._mapSubKernels(subKernel => `const resultX_${ subKernel.name } = result_${subKernel.name}[y] = new ${constructorString}(outputX);\n`).join('') } - for (let x = 0; x < outputX; x++) { - this.thread.x = x; - ${ kernelString } - } - }`; - } - - _mutableKernel2DResults() { - const constructorString = this._getKernelResultTypeConstructorString(); - return ` const outputX = _this.output[0]; - const outputY = _this.output[1]; - const result = new Array(outputY); - ${ this._mapSubKernels(subKernel => `const result_${ subKernel.name } = new Array(outputY);\n`).join(' ') } - ${ this._mapSubKernels(subKernel => `let subKernelResult_${ subKernel.name };\n`).join(' ') } - for (let y = 0; y < outputY; y++) { - const resultX = result[y] = new ${constructorString}(outputX); - ${ this._mapSubKernels(subKernel => `const resultX_${ subKernel.name } = result_${subKernel.name}[y] = new ${constructorString}(outputX);\n`).join('') } - }`; - } - - _resultMutableKernel2DLoop(kernelString) { - const constructorString = this._getKernelResultTypeConstructorString(); - return ` const outputX = _this.output[0]; - const outputY = _this.output[1]; - for (let y = 0; y < outputY; y++) { - this.thread.z = 0; - this.thread.y = y; - const resultX = result[y]; - ${ this._mapSubKernels(subKernel => `const resultX_${ subKernel.name } = result_${subKernel.name}[y] = new ${constructorString}(outputX);\n`).join('') } - for (let x = 0; x < outputX; x++) { - this.thread.x = x; - ${ kernelString } - } - }`; - } - - _graphicalKernel2DLoop(kernelString) { - return ` const outputX = _this.output[0]; - const outputY = _this.output[1]; - for (let y = 0; y < outputY; y++) { - this.thread.z = 0; - this.thread.y = y; - for (let x = 0; x < outputX; x++) { - this.thread.x = x; - ${ kernelString } - } - }`; - } - - _resultImmutableKernel3DLoop(kernelString) { - const constructorString = this._getKernelResultTypeConstructorString(); - return ` const outputX = _this.output[0]; - const outputY = _this.output[1]; - const outputZ = _this.output[2]; - const result = new Array(outputZ); - ${ this._mapSubKernels(subKernel => `const result_${ subKernel.name } = new Array(outputZ);\n`).join(' ') } - ${ this._mapSubKernels(subKernel => `let subKernelResult_${ subKernel.name };\n`).join(' ') } - for (let z = 0; z < outputZ; z++) { - this.thread.z = z; - const resultY = result[z] = new Array(outputY); - ${ this._mapSubKernels(subKernel => `const resultY_${ subKernel.name } = result_${subKernel.name}[z] = new Array(outputY);\n`).join(' ') } - for (let y = 0; y < outputY; y++) { - this.thread.y = y; - const resultX = resultY[y] = new ${constructorString}(outputX); - ${ this._mapSubKernels(subKernel => `const resultX_${ subKernel.name } = resultY_${subKernel.name}[y] = new ${constructorString}(outputX);\n`).join(' ') } - for (let x = 0; x < outputX; x++) { - this.thread.x = x; - ${ kernelString } - } - } - }`; - } - - _mutableKernel3DResults() { - const constructorString = this._getKernelResultTypeConstructorString(); - return ` const outputX = _this.output[0]; - const outputY = _this.output[1]; - const outputZ = _this.output[2]; - const result = new Array(outputZ); - ${ this._mapSubKernels(subKernel => `const result_${ subKernel.name } = new Array(outputZ);\n`).join(' ') } - ${ this._mapSubKernels(subKernel => `let subKernelResult_${ subKernel.name };\n`).join(' ') } - for (let z = 0; z < outputZ; z++) { - const resultY = result[z] = new Array(outputY); - ${ this._mapSubKernels(subKernel => `const resultY_${ subKernel.name } = result_${subKernel.name}[z] = new Array(outputY);\n`).join(' ') } - for (let y = 0; y < outputY; y++) { - const resultX = resultY[y] = new ${constructorString}(outputX); - ${ this._mapSubKernels(subKernel => `const resultX_${ subKernel.name } = resultY_${subKernel.name}[y] = new ${constructorString}(outputX);\n`).join(' ') } - } - }`; - } - - _resultMutableKernel3DLoop(kernelString) { - return ` const outputX = _this.output[0]; - const outputY = _this.output[1]; - const outputZ = _this.output[2]; - for (let z = 0; z < outputZ; z++) { - this.thread.z = z; - const resultY = result[z]; - for (let y = 0; y < outputY; y++) { - this.thread.y = y; - const resultX = resultY[y]; - for (let x = 0; x < outputX; x++) { - this.thread.x = x; - ${ kernelString } - } - } - }`; - } - - _kernelOutput() { - if (!this.subKernels) { - return '\n return result;'; - } - return `\n return { - result: result, - ${ this.subKernels.map(subKernel => `${ subKernel.property }: result_${ subKernel.name }`).join(',\n ') } - };`; - } - - _mapSubKernels(fn) { - return this.subKernels === null ? [''] : - this.subKernels.map(fn); - } - - destroy(removeCanvasReference) { - if (removeCanvasReference) { - delete this.canvas; - } - } - - static destroyContext(context) {} - - toJSON() { - const json = super.toJSON(); - json.functionNodes = FunctionBuilder.fromKernel(this, CPUFunctionNode).toJSON(); - return json; - } - - setOutput(output) { - super.setOutput(output); - const [width, height] = this.output; - if (this.graphical) { - this._imageData = this.context.createImageData(width, height); - this._colorData = new Uint8ClampedArray(width * height * 4); - } - } - - prependString(value) { - if (this._kernelString) throw new Error('Kernel already built'); - this._prependedString.push(value); - } - - hasPrependString(value) { - return this._prependedString.indexOf(value) > -1; - } -} - -module.exports = { - CPUKernel -}; -},{"../../utils":114,"../function-builder":9,"../kernel":36,"./function-node":6,"./kernel-string":7}],9:[function(require,module,exports){ -class FunctionBuilder { - static fromKernel(kernel, FunctionNode, extraNodeOptions) { - const { - kernelArguments, - kernelConstants, - argumentNames, - argumentSizes, - argumentBitRatios, - constants, - constantBitRatios, - debug, - loopMaxIterations, - nativeFunctions, - output, - optimizeFloatMemory, - precision, - plugins, - source, - subKernels, - functions, - leadingReturnStatement, - followingReturnStatement, - dynamicArguments, - dynamicOutput, - } = kernel; - - const argumentTypes = new Array(kernelArguments.length); - const constantTypes = {}; - - for (let i = 0; i < kernelArguments.length; i++) { - argumentTypes[i] = kernelArguments[i].type; - } - - for (let i = 0; i < kernelConstants.length; i++) { - const kernelConstant = kernelConstants[i]; - constantTypes[kernelConstant.name] = kernelConstant.type; - } - - const needsArgumentType = (functionName, index) => { - return functionBuilder.needsArgumentType(functionName, index); - }; - - const assignArgumentType = (functionName, index, type) => { - functionBuilder.assignArgumentType(functionName, index, type); - }; - - const lookupReturnType = (functionName, ast, requestingNode) => { - return functionBuilder.lookupReturnType(functionName, ast, requestingNode); - }; - - const lookupFunctionArgumentTypes = (functionName) => { - return functionBuilder.lookupFunctionArgumentTypes(functionName); - }; - - const lookupFunctionArgumentName = (functionName, argumentIndex) => { - return functionBuilder.lookupFunctionArgumentName(functionName, argumentIndex); - }; - - const lookupFunctionArgumentBitRatio = (functionName, argumentName) => { - return functionBuilder.lookupFunctionArgumentBitRatio(functionName, argumentName); - }; - - const triggerImplyArgumentType = (functionName, i, argumentType, requestingNode) => { - functionBuilder.assignArgumentType(functionName, i, argumentType, requestingNode); - }; - - const triggerImplyArgumentBitRatio = (functionName, argumentName, calleeFunctionName, argumentIndex) => { - functionBuilder.assignArgumentBitRatio(functionName, argumentName, calleeFunctionName, argumentIndex); - }; - - const onFunctionCall = (functionName, calleeFunctionName, args) => { - functionBuilder.trackFunctionCall(functionName, calleeFunctionName, args); - }; - - const onNestedFunction = (ast, source) => { - const argumentNames = []; - for (let i = 0; i < ast.params.length; i++) { - argumentNames.push(ast.params[i].name); - } - const nestedFunction = new FunctionNode(source, Object.assign({}, nodeOptions, { - returnType: null, - ast, - name: ast.id.name, - argumentNames, - lookupReturnType, - lookupFunctionArgumentTypes, - lookupFunctionArgumentName, - lookupFunctionArgumentBitRatio, - needsArgumentType, - assignArgumentType, - triggerImplyArgumentType, - triggerImplyArgumentBitRatio, - onFunctionCall, - })); - nestedFunction.traceFunctionAST(ast); - functionBuilder.addFunctionNode(nestedFunction); - }; - - const nodeOptions = Object.assign({ - isRootKernel: false, - onNestedFunction, - lookupReturnType, - lookupFunctionArgumentTypes, - lookupFunctionArgumentName, - lookupFunctionArgumentBitRatio, - needsArgumentType, - assignArgumentType, - triggerImplyArgumentType, - triggerImplyArgumentBitRatio, - onFunctionCall, - optimizeFloatMemory, - precision, - constants, - constantTypes, - constantBitRatios, - debug, - loopMaxIterations, - output, - plugins, - dynamicArguments, - dynamicOutput, - }, extraNodeOptions || {}); - - const rootNodeOptions = Object.assign({}, nodeOptions, { - isRootKernel: true, - name: 'kernel', - argumentNames, - argumentTypes, - argumentSizes, - argumentBitRatios, - leadingReturnStatement, - followingReturnStatement, - }); - - if (typeof source === 'object' && source.functionNodes) { - return new FunctionBuilder().fromJSON(source.functionNodes, FunctionNode); - } - - const rootNode = new FunctionNode(source, rootNodeOptions); - - let functionNodes = null; - if (functions) { - functionNodes = functions.map((fn) => new FunctionNode(fn.source, { - returnType: fn.returnType, - argumentTypes: fn.argumentTypes, - output, - plugins, - constants, - constantTypes, - constantBitRatios, - optimizeFloatMemory, - precision, - lookupReturnType, - lookupFunctionArgumentTypes, - lookupFunctionArgumentName, - lookupFunctionArgumentBitRatio, - needsArgumentType, - assignArgumentType, - triggerImplyArgumentType, - triggerImplyArgumentBitRatio, - onFunctionCall, - onNestedFunction, - })); - } - - let subKernelNodes = null; - if (subKernels) { - subKernelNodes = subKernels.map((subKernel) => { - const { name, source } = subKernel; - return new FunctionNode(source, Object.assign({}, nodeOptions, { - name, - isSubKernel: true, - isRootKernel: false, - })); - }); - } - - const functionBuilder = new FunctionBuilder({ - kernel, - rootNode, - functionNodes, - nativeFunctions, - subKernelNodes - }); - - return functionBuilder; - } - - constructor(settings) { - settings = settings || {}; - this.kernel = settings.kernel; - this.rootNode = settings.rootNode; - this.functionNodes = settings.functionNodes || []; - this.subKernelNodes = settings.subKernelNodes || []; - this.nativeFunctions = settings.nativeFunctions || []; - this.functionMap = {}; - this.nativeFunctionNames = []; - this.lookupChain = []; - this.functionNodeDependencies = {}; - this.functionCalls = {}; - - if (this.rootNode) { - this.functionMap['kernel'] = this.rootNode; - } - - if (this.functionNodes) { - for (let i = 0; i < this.functionNodes.length; i++) { - this.functionMap[this.functionNodes[i].name] = this.functionNodes[i]; - } - } - - if (this.subKernelNodes) { - for (let i = 0; i < this.subKernelNodes.length; i++) { - this.functionMap[this.subKernelNodes[i].name] = this.subKernelNodes[i]; - } - } - - if (this.nativeFunctions) { - for (let i = 0; i < this.nativeFunctions.length; i++) { - const nativeFunction = this.nativeFunctions[i]; - this.nativeFunctionNames.push(nativeFunction.name); - } - } - } - - addFunctionNode(functionNode) { - if (!functionNode.name) throw new Error('functionNode.name needs set'); - this.functionMap[functionNode.name] = functionNode; - if (functionNode.isRootKernel) { - this.rootNode = functionNode; - } - } - - traceFunctionCalls(functionName, retList) { - functionName = functionName || 'kernel'; - retList = retList || []; - - if (this.nativeFunctionNames.indexOf(functionName) > -1) { - const nativeFunctionIndex = retList.indexOf(functionName); - if (nativeFunctionIndex === -1) { - retList.push(functionName); - } else { - const dependantNativeFunctionName = retList.splice(nativeFunctionIndex, 1)[0]; - retList.push(dependantNativeFunctionName); - } - return retList; - } - - const functionNode = this.functionMap[functionName]; - if (functionNode) { - const functionIndex = retList.indexOf(functionName); - if (functionIndex === -1) { - retList.push(functionName); - functionNode.toString(); - for (let i = 0; i < functionNode.calledFunctions.length; ++i) { - this.traceFunctionCalls(functionNode.calledFunctions[i], retList); - } - } else { - const dependantFunctionName = retList.splice(functionIndex, 1)[0]; - retList.push(dependantFunctionName); - } - } - - return retList; - } - - getPrototypeString(functionName) { - return this.getPrototypes(functionName).join('\n'); - } - - getPrototypes(functionName) { - if (this.rootNode) { - this.rootNode.toString(); - } - if (functionName) { - return this.getPrototypesFromFunctionNames(this.traceFunctionCalls(functionName, []).reverse()); - } - return this.getPrototypesFromFunctionNames(Object.keys(this.functionMap)); - } - - getStringFromFunctionNames(functionList) { - const ret = []; - for (let i = 0; i < functionList.length; ++i) { - const node = this.functionMap[functionList[i]]; - if (node) { - ret.push(this.functionMap[functionList[i]].toString()); - } - } - return ret.join('\n'); - } - - getPrototypesFromFunctionNames(functionList) { - const ret = []; - for (let i = 0; i < functionList.length; ++i) { - const functionName = functionList[i]; - const functionIndex = this.nativeFunctionNames.indexOf(functionName); - if (functionIndex > -1) { - ret.push(this.nativeFunctions[functionIndex].source); - continue; - } - const node = this.functionMap[functionName]; - if (node) { - ret.push(node.toString()); - } - } - return ret; - } - - toJSON() { - return this.traceFunctionCalls(this.rootNode.name).reverse().map(name => { - const nativeIndex = this.nativeFunctions.indexOf(name); - if (nativeIndex > -1) { - return { - name, - source: this.nativeFunctions[nativeIndex].source - }; - } else if (this.functionMap[name]) { - return this.functionMap[name].toJSON(); - } else { - throw new Error(`function ${ name } not found`); - } - }); - } - - fromJSON(jsonFunctionNodes, FunctionNode) { - this.functionMap = {}; - for (let i = 0; i < jsonFunctionNodes.length; i++) { - const jsonFunctionNode = jsonFunctionNodes[i]; - this.functionMap[jsonFunctionNode.settings.name] = new FunctionNode(jsonFunctionNode.ast, jsonFunctionNode.settings); - } - return this; - } - - getString(functionName) { - if (functionName) { - return this.getStringFromFunctionNames(this.traceFunctionCalls(functionName).reverse()); - } - return this.getStringFromFunctionNames(Object.keys(this.functionMap)); - } - - lookupReturnType(functionName, ast, requestingNode) { - if (ast.type !== 'CallExpression') { - throw new Error(`expected ast type of "CallExpression", but is ${ ast.type }`); - } - if (this._isNativeFunction(functionName)) { - return this._lookupNativeFunctionReturnType(functionName); - } else if (this._isFunction(functionName)) { - const node = this._getFunction(functionName); - if (node.returnType) { - return node.returnType; - } else { - for (let i = 0; i < this.lookupChain.length; i++) { - if (this.lookupChain[i].ast === ast) { - if (node.argumentTypes.length === 0 && ast.arguments.length > 0) { - const args = ast.arguments; - for (let j = 0; j < args.length; j++) { - this.lookupChain.push({ - name: requestingNode.name, - ast: args[i], - requestingNode - }); - node.argumentTypes[j] = requestingNode.getType(args[j]); - this.lookupChain.pop(); - } - return node.returnType = node.getType(node.getJsAST()); - } - - throw new Error('circlical logic detected!'); - } - } - this.lookupChain.push({ - name: requestingNode.name, - ast, - requestingNode - }); - const type = node.getType(node.getJsAST()); - this.lookupChain.pop(); - return node.returnType = type; - } - } - - return null; - } - - _getFunction(functionName) { - if (!this._isFunction(functionName)) { - new Error(`Function ${functionName} not found`); - } - return this.functionMap[functionName]; - } - - _isFunction(functionName) { - return Boolean(this.functionMap[functionName]); - } - - _getNativeFunction(functionName) { - for (let i = 0; i < this.nativeFunctions.length; i++) { - if (this.nativeFunctions[i].name === functionName) return this.nativeFunctions[i]; - } - return null; - } - - _isNativeFunction(functionName) { - return Boolean(this._getNativeFunction(functionName)); - } - - _lookupNativeFunctionReturnType(functionName) { - let nativeFunction = this._getNativeFunction(functionName); - if (nativeFunction) { - return nativeFunction.returnType; - } - throw new Error(`Native function ${ functionName } not found`); - } - - lookupFunctionArgumentTypes(functionName) { - if (this._isNativeFunction(functionName)) { - return this._getNativeFunction(functionName).argumentTypes; - } else if (this._isFunction(functionName)) { - return this._getFunction(functionName).argumentTypes; - } - return null; - } - - lookupFunctionArgumentName(functionName, argumentIndex) { - return this._getFunction(functionName).argumentNames[argumentIndex]; - } - - lookupFunctionArgumentBitRatio(functionName, argumentName) { - if (!this._isFunction(functionName)) { - throw new Error('function not found'); - } - if (this.rootNode.name === functionName) { - const i = this.rootNode.argumentNames.indexOf(argumentName); - if (i !== -1) { - return this.rootNode.argumentBitRatios[i]; - } - } - const node = this._getFunction(functionName); - const i = node.argumentNames.indexOf(argumentName); - if (i === -1) { - throw new Error('argument not found'); - } - const bitRatio = node.argumentBitRatios[i]; - if (typeof bitRatio !== 'number') { - throw new Error('argument bit ratio not found'); - } - return bitRatio; - } - - needsArgumentType(functionName, i) { - if (!this._isFunction(functionName)) return false; - const fnNode = this._getFunction(functionName); - return !fnNode.argumentTypes[i]; - } - - assignArgumentType(functionName, i, argumentType, requestingNode) { - if (!this._isFunction(functionName)) return; - const fnNode = this._getFunction(functionName); - if (!fnNode.argumentTypes[i]) { - fnNode.argumentTypes[i] = argumentType; - } - } - - assignArgumentBitRatio(functionName, argumentName, calleeFunctionName, argumentIndex) { - const node = this._getFunction(functionName); - if (this._isNativeFunction(calleeFunctionName)) return null; - const calleeNode = this._getFunction(calleeFunctionName); - const i = node.argumentNames.indexOf(argumentName); - if (i === -1) { - throw new Error(`Argument ${argumentName} not found in arguments from function ${functionName}`); - } - const bitRatio = node.argumentBitRatios[i]; - if (typeof bitRatio !== 'number') { - throw new Error(`Bit ratio for argument ${argumentName} not found in function ${functionName}`); - } - if (!calleeNode.argumentBitRatios) { - calleeNode.argumentBitRatios = new Array(calleeNode.argumentNames.length); - } - const calleeBitRatio = calleeNode.argumentBitRatios[i]; - if (typeof calleeBitRatio === 'number') { - if (calleeBitRatio !== bitRatio) { - throw new Error(`Incompatible bit ratio found at function ${functionName} at argument ${argumentName}`); - } - return calleeBitRatio; - } - calleeNode.argumentBitRatios[i] = bitRatio; - return bitRatio; - } - - trackFunctionCall(functionName, calleeFunctionName, args) { - if (!this.functionNodeDependencies[functionName]) { - this.functionNodeDependencies[functionName] = new Set(); - this.functionCalls[functionName] = []; - } - this.functionNodeDependencies[functionName].add(calleeFunctionName); - this.functionCalls[functionName].push(args); - } - - getKernelResultType() { - return this.rootNode.returnType || this.rootNode.getType(this.rootNode.ast); - } - - getSubKernelResultType(index) { - const subKernelNode = this.subKernelNodes[index]; - let called = false; - for (let functionCallIndex = 0; functionCallIndex < this.rootNode.functionCalls.length; functionCallIndex++) { - const functionCall = this.rootNode.functionCalls[functionCallIndex]; - if (functionCall.ast.callee.name === subKernelNode.name) { - called = true; - } - } - if (!called) { - throw new Error(`SubKernel ${ subKernelNode.name } never called by kernel`); - } - return subKernelNode.returnType || subKernelNode.getType(subKernelNode.getJsAST()); - } - - getReturnTypes() { - const result = { - [this.rootNode.name]: this.rootNode.getType(this.rootNode.ast), - }; - const list = this.traceFunctionCalls(this.rootNode.name); - for (let i = 0; i < list.length; i++) { - const functionName = list[i]; - const functionNode = this.functionMap[functionName]; - result[functionName] = functionNode.getType(functionNode.ast); - } - return result; - } -} - -module.exports = { - FunctionBuilder -}; -},{}],10:[function(require,module,exports){ -const acorn = require('acorn'); -const { utils } = require('../utils'); -const { FunctionTracer } = require('./function-tracer'); - -class FunctionNode { - constructor(source, settings) { - if (!source && !settings.ast) { - throw new Error('source parameter is missing'); - } - settings = settings || {}; - this.source = source; - this.ast = null; - this.name = typeof source === 'string' ? settings.isRootKernel ? - 'kernel' : - (settings.name || utils.getFunctionNameFromString(source)) : null; - this.calledFunctions = []; - this.constants = {}; - this.constantTypes = {}; - this.constantBitRatios = {}; - this.isRootKernel = false; - this.isSubKernel = false; - this.debug = null; - this.functions = null; - this.identifiers = null; - this.contexts = null; - this.functionCalls = null; - this.states = []; - this.needsArgumentType = null; - this.assignArgumentType = null; - this.lookupReturnType = null; - this.lookupFunctionArgumentTypes = null; - this.lookupFunctionArgumentBitRatio = null; - this.triggerImplyArgumentType = null; - this.triggerImplyArgumentBitRatio = null; - this.onNestedFunction = null; - this.onFunctionCall = null; - this.optimizeFloatMemory = null; - this.precision = null; - this.loopMaxIterations = null; - this.argumentNames = (typeof this.source === 'string' ? utils.getArgumentNamesFromString(this.source) : null); - this.argumentTypes = []; - this.argumentSizes = []; - this.argumentBitRatios = null; - this.returnType = null; - this.output = []; - this.plugins = null; - this.leadingReturnStatement = null; - this.followingReturnStatement = null; - this.dynamicOutput = null; - this.dynamicArguments = null; - this.strictTypingChecking = false; - this.fixIntegerDivisionAccuracy = null; - - if (settings) { - for (const p in settings) { - if (!settings.hasOwnProperty(p)) continue; - if (!this.hasOwnProperty(p)) continue; - this[p] = settings[p]; - } - } - - this.literalTypes = {}; - - this.validate(); - this._string = null; - this._internalVariableNames = {}; - } - - validate() { - if (typeof this.source !== 'string' && !this.ast) { - throw new Error('this.source not a string'); - } - - if (!this.ast && !utils.isFunctionString(this.source)) { - throw new Error('this.source not a function string'); - } - - if (!this.name) { - throw new Error('this.name could not be set'); - } - - if (this.argumentTypes.length > 0 && this.argumentTypes.length !== this.argumentNames.length) { - throw new Error(`argumentTypes count of ${ this.argumentTypes.length } exceeds ${ this.argumentNames.length }`); - } - - if (this.output.length < 1) { - throw new Error('this.output is not big enough'); - } - } - - isIdentifierConstant(name) { - if (!this.constants) return false; - return this.constants.hasOwnProperty(name); - } - - isInput(argumentName) { - return this.argumentTypes[this.argumentNames.indexOf(argumentName)] === 'Input'; - } - - pushState(state) { - this.states.push(state); - } - - popState(state) { - if (this.state !== state) { - throw new Error(`Cannot popState ${ state } when in ${ this.state }`); - } - this.states.pop(); - } - - isState(state) { - return this.state === state; - } - - get state() { - return this.states[this.states.length - 1]; - } - - astMemberExpressionUnroll(ast) { - if (ast.type === 'Identifier') { - return ast.name; - } else if (ast.type === 'ThisExpression') { - return 'this'; - } - - if (ast.type === 'MemberExpression') { - if (ast.object && ast.property) { - if (ast.object.hasOwnProperty('name') && ast.object.name !== 'Math') { - return this.astMemberExpressionUnroll(ast.property); - } - - return ( - this.astMemberExpressionUnroll(ast.object) + - '.' + - this.astMemberExpressionUnroll(ast.property) - ); - } - } - - if (ast.hasOwnProperty('expressions')) { - const firstExpression = ast.expressions[0]; - if (firstExpression.type === 'Literal' && firstExpression.value === 0 && ast.expressions.length === 2) { - return this.astMemberExpressionUnroll(ast.expressions[1]); - } - } - - throw this.astErrorOutput('Unknown astMemberExpressionUnroll', ast); - } - - getJsAST(inParser) { - if (this.ast) { - return this.ast; - } - if (typeof this.source === 'object') { - this.traceFunctionAST(this.source); - return this.ast = this.source; - } - - inParser = inParser || acorn; - if (inParser === null) { - throw new Error('Missing JS to AST parser'); - } - - const ast = Object.freeze(inParser.parse(`const parser_${ this.name } = ${ this.source };`, { - locations: true - })); - const functionAST = ast.body[0].declarations[0].init; - this.traceFunctionAST(functionAST); - - if (!ast) { - throw new Error('Failed to parse JS code'); - } - - return this.ast = functionAST; - } - - traceFunctionAST(ast) { - const { contexts, declarations, functions, identifiers, functionCalls } = new FunctionTracer(ast); - this.contexts = contexts; - this.identifiers = identifiers; - this.functionCalls = functionCalls; - this.functions = functions; - for (let i = 0; i < declarations.length; i++) { - const declaration = declarations[i]; - const { ast, inForLoopInit, inForLoopTest } = declaration; - const { init } = ast; - const dependencies = this.getDependencies(init); - let valueType = null; - - if (inForLoopInit && inForLoopTest) { - valueType = 'Integer'; - } else { - if (init) { - const realType = this.getType(init); - switch (realType) { - case 'Integer': - case 'Float': - case 'Number': - if (init.type === 'MemberExpression') { - valueType = realType; - } else { - valueType = 'Number'; - } - break; - case 'LiteralInteger': - valueType = 'Number'; - break; - default: - valueType = realType; - } - } - } - declaration.valueType = valueType; - declaration.dependencies = dependencies; - declaration.isSafe = this.isSafeDependencies(dependencies); - } - - for (let i = 0; i < functions.length; i++) { - this.onNestedFunction(functions[i], this.source); - } - } - - getDeclaration(ast) { - for (let i = 0; i < this.identifiers.length; i++) { - const identifier = this.identifiers[i]; - if (ast === identifier.ast) { - return identifier.declaration; - } - } - return null; - } - - getVariableType(ast) { - if (ast.type !== 'Identifier') { - throw new Error(`ast of ${ast.type} not "Identifier"`); - } - let type = null; - const argumentIndex = this.argumentNames.indexOf(ast.name); - if (argumentIndex === -1) { - const declaration = this.getDeclaration(ast); - if (declaration) { - return declaration.valueType; - } - } else { - const argumentType = this.argumentTypes[argumentIndex]; - if (argumentType) { - type = argumentType; - } - } - if (!type && this.strictTypingChecking) { - throw new Error(`Declaration of ${name} not found`); - } - return type; - } - - getLookupType(type) { - if (!typeLookupMap.hasOwnProperty(type)) { - throw new Error(`unknown typeLookupMap ${ type }`); - } - return typeLookupMap[type]; - } - - getConstantType(constantName) { - if (this.constantTypes[constantName]) { - const type = this.constantTypes[constantName]; - if (type === 'Float') { - return 'Number'; - } else { - return type; - } - } - throw new Error(`Type for constant "${ constantName }" not declared`); - } - - toString() { - if (this._string) return this._string; - return this._string = this.astGeneric(this.getJsAST(), []).join('').trim(); - } - - toJSON() { - const settings = { - source: this.source, - name: this.name, - constants: this.constants, - constantTypes: this.constantTypes, - isRootKernel: this.isRootKernel, - isSubKernel: this.isSubKernel, - debug: this.debug, - output: this.output, - loopMaxIterations: this.loopMaxIterations, - argumentNames: this.argumentNames, - argumentTypes: this.argumentTypes, - argumentSizes: this.argumentSizes, - returnType: this.returnType, - leadingReturnStatement: this.leadingReturnStatement, - followingReturnStatement: this.followingReturnStatement, - }; - - return { - ast: this.ast, - settings - }; - } - - getType(ast) { - if (Array.isArray(ast)) { - return this.getType(ast[ast.length - 1]); - } - switch (ast.type) { - case 'BlockStatement': - return this.getType(ast.body); - case 'ArrayExpression': - const childType = this.getType(ast.elements[0]); - switch (childType) { - case 'Array(2)': - case 'Array(3)': - case 'Array(4)': - return `Matrix(${ast.elements.length})`; - } - return `Array(${ ast.elements.length })`; - case 'Literal': - const literalKey = this.astKey(ast); - if (this.literalTypes[literalKey]) { - return this.literalTypes[literalKey]; - } - if (Number.isInteger(ast.value)) { - return 'LiteralInteger'; - } else if (ast.value === true || ast.value === false) { - return 'Boolean'; - } else { - return 'Number'; - } - case 'AssignmentExpression': - return this.getType(ast.left); - case 'CallExpression': - if (this.isAstMathFunction(ast)) { - return 'Number'; - } - if (!ast.callee || !ast.callee.name) { - if (ast.callee.type === 'SequenceExpression' && ast.callee.expressions[ast.callee.expressions.length - 1].property.name) { - const functionName = ast.callee.expressions[ast.callee.expressions.length - 1].property.name; - this.inferArgumentTypesIfNeeded(functionName, ast.arguments); - return this.lookupReturnType(functionName, ast, this); - } - if (this.getVariableSignature(ast.callee, true) === 'this.color') { - return null; - } - if (ast.callee.type === 'MemberExpression' && ast.callee.object && ast.callee.property && ast.callee.property.name && ast.arguments) { - const functionName = ast.callee.property.name; - this.inferArgumentTypesIfNeeded(functionName, ast.arguments); - return this.lookupReturnType(functionName, ast, this); - } - throw this.astErrorOutput('Unknown call expression', ast); - } - if (ast.callee && ast.callee.name) { - const functionName = ast.callee.name; - this.inferArgumentTypesIfNeeded(functionName, ast.arguments); - return this.lookupReturnType(functionName, ast, this); - } - throw this.astErrorOutput(`Unhandled getType Type "${ ast.type }"`, ast); - case 'LogicalExpression': - return 'Boolean'; - case 'BinaryExpression': - switch (ast.operator) { - case '%': - case '/': - if (this.fixIntegerDivisionAccuracy) { - return 'Number'; - } else { - break; - } - case '>': - case '<': - return 'Boolean'; - case '&': - case '|': - case '^': - case '<<': - case '>>': - case '>>>': - return 'Integer'; - } - const type = this.getType(ast.left); - if (this.isState('skip-literal-correction')) return type; - if (type === 'LiteralInteger') { - const rightType = this.getType(ast.right); - if (rightType === 'LiteralInteger') { - if (ast.left.value % 1 === 0) { - return 'Integer'; - } else { - return 'Float'; - } - } - return rightType; - } - return typeLookupMap[type] || type; - case 'UpdateExpression': - return this.getType(ast.argument); - case 'UnaryExpression': - if (ast.operator === '~') { - return 'Integer'; - } - return this.getType(ast.argument); - case 'VariableDeclaration': { - const declarations = ast.declarations; - let lastType; - for (let i = 0; i < declarations.length; i++) { - const declaration = declarations[i]; - lastType = this.getType(declaration); - } - if (!lastType) { - throw this.astErrorOutput(`Unable to find type for declaration`, ast); - } - return lastType; - } - case 'VariableDeclarator': - const declaration = this.getDeclaration(ast.id); - if (!declaration) { - throw this.astErrorOutput(`Unable to find declarator`, ast); - } - - if (!declaration.valueType) { - throw this.astErrorOutput(`Unable to find declarator valueType`, ast); - } - - return declaration.valueType; - case 'Identifier': - if (ast.name === 'Infinity') { - return 'Number'; - } - if (this.isAstVariable(ast)) { - const signature = this.getVariableSignature(ast); - if (signature === 'value') { - return this.getCheckVariableType(ast); - } - } - const origin = this.findIdentifierOrigin(ast); - if (origin && origin.init) { - return this.getType(origin.init); - } - return null; - case 'ReturnStatement': - return this.getType(ast.argument); - case 'MemberExpression': - if (this.isAstMathFunction(ast)) { - switch (ast.property.name) { - case 'ceil': - return 'Integer'; - case 'floor': - return 'Integer'; - case 'round': - return 'Integer'; - } - return 'Number'; - } - if (this.isAstVariable(ast)) { - const variableSignature = this.getVariableSignature(ast); - switch (variableSignature) { - case 'value[]': - return this.getLookupType(this.getCheckVariableType(ast.object)); - case 'value[][]': - return this.getLookupType(this.getCheckVariableType(ast.object.object)); - case 'value[][][]': - return this.getLookupType(this.getCheckVariableType(ast.object.object.object)); - case 'value[][][][]': - return this.getLookupType(this.getCheckVariableType(ast.object.object.object.object)); - case 'value.thread.value': - case 'this.thread.value': - return 'Integer'; - case 'this.output.value': - return this.dynamicOutput ? 'Integer' : 'LiteralInteger'; - case 'this.constants.value': - return this.getConstantType(ast.property.name); - case 'this.constants.value[]': - return this.getLookupType(this.getConstantType(ast.object.property.name)); - case 'this.constants.value[][]': - return this.getLookupType(this.getConstantType(ast.object.object.property.name)); - case 'this.constants.value[][][]': - return this.getLookupType(this.getConstantType(ast.object.object.object.property.name)); - case 'this.constants.value[][][][]': - return this.getLookupType(this.getConstantType(ast.object.object.object.object.property.name)); - case 'fn()[]': - case 'fn()[][]': - case 'fn()[][][]': - return this.getLookupType(this.getType(ast.object)); - case 'value.value': - if (this.isAstMathVariable(ast)) { - return 'Number'; - } - switch (ast.property.name) { - case 'r': - case 'g': - case 'b': - case 'a': - return this.getLookupType(this.getCheckVariableType(ast.object)); - } - case '[][]': - return 'Number'; - } - throw this.astErrorOutput('Unhandled getType MemberExpression', ast); - } - throw this.astErrorOutput('Unhandled getType MemberExpression', ast); - case 'ConditionalExpression': - return this.getType(ast.consequent); - case 'FunctionDeclaration': - case 'FunctionExpression': - const lastReturn = this.findLastReturn(ast.body); - if (lastReturn) { - return this.getType(lastReturn); - } - return null; - case 'IfStatement': - return this.getType(ast.consequent); - case 'SequenceExpression': - return this.getType(ast.expressions[ast.expressions.length - 1]); - default: - throw this.astErrorOutput(`Unhandled getType Type "${ ast.type }"`, ast); - } - } - - getCheckVariableType(ast) { - const type = this.getVariableType(ast); - if (!type) { - throw this.astErrorOutput(`${ast.type} is not defined`, ast); - } - return type; - } - - inferArgumentTypesIfNeeded(functionName, args) { - for (let i = 0; i < args.length; i++) { - if (!this.needsArgumentType(functionName, i)) continue; - const type = this.getType(args[i]); - if (!type) { - throw this.astErrorOutput(`Unable to infer argument ${i}`, args[i]); - } - this.assignArgumentType(functionName, i, type); - } - } - - isAstMathVariable(ast) { - const mathProperties = [ - 'E', - 'PI', - 'SQRT2', - 'SQRT1_2', - 'LN2', - 'LN10', - 'LOG2E', - 'LOG10E', - ]; - return ast.type === 'MemberExpression' && - ast.object && ast.object.type === 'Identifier' && - ast.object.name === 'Math' && - ast.property && - ast.property.type === 'Identifier' && - mathProperties.indexOf(ast.property.name) > -1; - } - - isAstMathFunction(ast) { - const mathFunctions = [ - 'abs', - 'acos', - 'acosh', - 'asin', - 'asinh', - 'atan', - 'atan2', - 'atanh', - 'cbrt', - 'ceil', - 'clz32', - 'cos', - 'cosh', - 'expm1', - 'exp', - 'floor', - 'fround', - 'imul', - 'log', - 'log2', - 'log10', - 'log1p', - 'max', - 'min', - 'pow', - 'random', - 'round', - 'sign', - 'sin', - 'sinh', - 'sqrt', - 'tan', - 'tanh', - 'trunc', - ]; - return ast.type === 'CallExpression' && - ast.callee && - ast.callee.type === 'MemberExpression' && - ast.callee.object && - ast.callee.object.type === 'Identifier' && - ast.callee.object.name === 'Math' && - ast.callee.property && - ast.callee.property.type === 'Identifier' && - mathFunctions.indexOf(ast.callee.property.name) > -1; - } - - isAstVariable(ast) { - return ast.type === 'Identifier' || ast.type === 'MemberExpression'; - } - - isSafe(ast) { - return this.isSafeDependencies(this.getDependencies(ast)); - } - - isSafeDependencies(dependencies) { - return dependencies && dependencies.every ? dependencies.every(dependency => dependency.isSafe) : true; - } - - getDependencies(ast, dependencies, isNotSafe) { - if (!dependencies) { - dependencies = []; - } - if (!ast) return null; - if (Array.isArray(ast)) { - for (let i = 0; i < ast.length; i++) { - this.getDependencies(ast[i], dependencies, isNotSafe); - } - return dependencies; - } - switch (ast.type) { - case 'AssignmentExpression': - this.getDependencies(ast.left, dependencies, isNotSafe); - this.getDependencies(ast.right, dependencies, isNotSafe); - return dependencies; - case 'ConditionalExpression': - this.getDependencies(ast.test, dependencies, isNotSafe); - this.getDependencies(ast.alternate, dependencies, isNotSafe); - this.getDependencies(ast.consequent, dependencies, isNotSafe); - return dependencies; - case 'Literal': - dependencies.push({ - origin: 'literal', - value: ast.value, - isSafe: isNotSafe === true ? false : ast.value > -Infinity && ast.value < Infinity && !isNaN(ast.value) - }); - break; - case 'VariableDeclarator': - return this.getDependencies(ast.init, dependencies, isNotSafe); - case 'Identifier': - const declaration = this.getDeclaration(ast); - if (declaration) { - dependencies.push({ - name: ast.name, - origin: 'declaration', - isSafe: isNotSafe ? false : this.isSafeDependencies(declaration.dependencies), - }); - } else if (this.argumentNames.indexOf(ast.name) > -1) { - dependencies.push({ - name: ast.name, - origin: 'argument', - isSafe: false, - }); - } else if (this.strictTypingChecking) { - throw new Error(`Cannot find identifier origin "${ast.name}"`); - } - break; - case 'FunctionDeclaration': - return this.getDependencies(ast.body.body[ast.body.body.length - 1], dependencies, isNotSafe); - case 'ReturnStatement': - return this.getDependencies(ast.argument, dependencies); - case 'BinaryExpression': - case 'LogicalExpression': - isNotSafe = (ast.operator === '/' || ast.operator === '*'); - this.getDependencies(ast.left, dependencies, isNotSafe); - this.getDependencies(ast.right, dependencies, isNotSafe); - return dependencies; - case 'UnaryExpression': - case 'UpdateExpression': - return this.getDependencies(ast.argument, dependencies, isNotSafe); - case 'VariableDeclaration': - return this.getDependencies(ast.declarations, dependencies, isNotSafe); - case 'ArrayExpression': - dependencies.push({ - origin: 'declaration', - isSafe: true, - }); - return dependencies; - case 'CallExpression': - dependencies.push({ - origin: 'function', - isSafe: true, - }); - return dependencies; - case 'MemberExpression': - const details = this.getMemberExpressionDetails(ast); - switch (details.signature) { - case 'value[]': - this.getDependencies(ast.object, dependencies, isNotSafe); - break; - case 'value[][]': - this.getDependencies(ast.object.object, dependencies, isNotSafe); - break; - case 'value[][][]': - this.getDependencies(ast.object.object.object, dependencies, isNotSafe); - break; - case 'this.output.value': - if (this.dynamicOutput) { - dependencies.push({ - name: details.name, - origin: 'output', - isSafe: false, - }); - } - break; - } - if (details) { - if (details.property) { - this.getDependencies(details.property, dependencies, isNotSafe); - } - if (details.xProperty) { - this.getDependencies(details.xProperty, dependencies, isNotSafe); - } - if (details.yProperty) { - this.getDependencies(details.yProperty, dependencies, isNotSafe); - } - if (details.zProperty) { - this.getDependencies(details.zProperty, dependencies, isNotSafe); - } - return dependencies; - } - case 'SequenceExpression': - return this.getDependencies(ast.expressions, dependencies, isNotSafe); - default: - throw this.astErrorOutput(`Unhandled type ${ ast.type } in getDependencies`, ast); - } - return dependencies; - } - - getVariableSignature(ast, returnRawValue) { - if (!this.isAstVariable(ast)) { - throw new Error(`ast of type "${ ast.type }" is not a variable signature`); - } - if (ast.type === 'Identifier') { - return 'value'; - } - const signature = []; - while (true) { - if (!ast) break; - if (ast.computed) { - signature.push('[]'); - } else if (ast.type === 'ThisExpression') { - signature.unshift('this'); - } else if (ast.property && ast.property.name) { - if ( - ast.property.name === 'x' || - ast.property.name === 'y' || - ast.property.name === 'z' - ) { - signature.unshift(returnRawValue ? '.' + ast.property.name : '.value'); - } else if ( - ast.property.name === 'constants' || - ast.property.name === 'thread' || - ast.property.name === 'output' - ) { - signature.unshift('.' + ast.property.name); - } else { - signature.unshift(returnRawValue ? '.' + ast.property.name : '.value'); - } - } else if (ast.name) { - signature.unshift(returnRawValue ? ast.name : 'value'); - } else if (ast.callee && ast.callee.name) { - signature.unshift(returnRawValue ? ast.callee.name + '()' : 'fn()'); - } else if (ast.elements) { - signature.unshift('[]'); - } else { - signature.unshift('unknown'); - } - ast = ast.object; - } - - const signatureString = signature.join(''); - if (returnRawValue) { - return signatureString; - } - - const allowedExpressions = [ - 'value', - 'value[]', - 'value[][]', - 'value[][][]', - 'value[][][][]', - 'value.value', - 'value.thread.value', - 'this.thread.value', - 'this.output.value', - 'this.constants.value', - 'this.constants.value[]', - 'this.constants.value[][]', - 'this.constants.value[][][]', - 'this.constants.value[][][][]', - 'fn()[]', - 'fn()[][]', - 'fn()[][][]', - '[][]', - ]; - if (allowedExpressions.indexOf(signatureString) > -1) { - return signatureString; - } - return null; - } - - build() { - return this.toString().length > 0; - } - - astGeneric(ast, retArr) { - if (ast === null) { - throw this.astErrorOutput('NULL ast', ast); - } else { - if (Array.isArray(ast)) { - for (let i = 0; i < ast.length; i++) { - this.astGeneric(ast[i], retArr); - } - return retArr; - } - - switch (ast.type) { - case 'FunctionDeclaration': - return this.astFunctionDeclaration(ast, retArr); - case 'FunctionExpression': - return this.astFunctionExpression(ast, retArr); - case 'ReturnStatement': - return this.astReturnStatement(ast, retArr); - case 'Literal': - return this.astLiteral(ast, retArr); - case 'BinaryExpression': - return this.astBinaryExpression(ast, retArr); - case 'Identifier': - return this.astIdentifierExpression(ast, retArr); - case 'AssignmentExpression': - return this.astAssignmentExpression(ast, retArr); - case 'ExpressionStatement': - return this.astExpressionStatement(ast, retArr); - case 'EmptyStatement': - return this.astEmptyStatement(ast, retArr); - case 'BlockStatement': - return this.astBlockStatement(ast, retArr); - case 'IfStatement': - return this.astIfStatement(ast, retArr); - case 'SwitchStatement': - return this.astSwitchStatement(ast, retArr); - case 'BreakStatement': - return this.astBreakStatement(ast, retArr); - case 'ContinueStatement': - return this.astContinueStatement(ast, retArr); - case 'ForStatement': - return this.astForStatement(ast, retArr); - case 'WhileStatement': - return this.astWhileStatement(ast, retArr); - case 'DoWhileStatement': - return this.astDoWhileStatement(ast, retArr); - case 'VariableDeclaration': - return this.astVariableDeclaration(ast, retArr); - case 'VariableDeclarator': - return this.astVariableDeclarator(ast, retArr); - case 'ThisExpression': - return this.astThisExpression(ast, retArr); - case 'SequenceExpression': - return this.astSequenceExpression(ast, retArr); - case 'UnaryExpression': - return this.astUnaryExpression(ast, retArr); - case 'UpdateExpression': - return this.astUpdateExpression(ast, retArr); - case 'LogicalExpression': - return this.astLogicalExpression(ast, retArr); - case 'MemberExpression': - return this.astMemberExpression(ast, retArr); - case 'CallExpression': - return this.astCallExpression(ast, retArr); - case 'ArrayExpression': - return this.astArrayExpression(ast, retArr); - case 'DebuggerStatement': - return this.astDebuggerStatement(ast, retArr); - case 'ConditionalExpression': - return this.astConditionalExpression(ast, retArr); - } - - throw this.astErrorOutput('Unknown ast type : ' + ast.type, ast); - } - } - astErrorOutput(error, ast) { - if (typeof this.source !== 'string') { - return new Error(error); - } - - const debugString = utils.getAstString(this.source, ast); - const leadingSource = this.source.substr(ast.start); - const splitLines = leadingSource.split(/\n/); - const lineBefore = splitLines.length > 0 ? splitLines[splitLines.length - 1] : 0; - return new Error(`${error} on line ${ splitLines.length }, position ${ lineBefore.length }:\n ${ debugString }`); - } - - astDebuggerStatement(arrNode, retArr) { - return retArr; - } - - astConditionalExpression(ast, retArr) { - if (ast.type !== 'ConditionalExpression') { - throw this.astErrorOutput('Not a conditional expression', ast); - } - retArr.push('('); - this.astGeneric(ast.test, retArr); - retArr.push('?'); - this.astGeneric(ast.consequent, retArr); - retArr.push(':'); - this.astGeneric(ast.alternate, retArr); - retArr.push(')'); - return retArr; - } - - astFunction(ast, retArr) { - throw new Error(`"astFunction" not defined on ${ this.constructor.name }`); - } - - astFunctionDeclaration(ast, retArr) { - if (this.isChildFunction(ast)) { - return retArr; - } - return this.astFunction(ast, retArr); - } - astFunctionExpression(ast, retArr) { - if (this.isChildFunction(ast)) { - return retArr; - } - return this.astFunction(ast, retArr); - } - isChildFunction(ast) { - for (let i = 0; i < this.functions.length; i++) { - if (this.functions[i] === ast) { - return true; - } - } - return false; - } - astReturnStatement(ast, retArr) { - return retArr; - } - astLiteral(ast, retArr) { - this.literalTypes[this.astKey(ast)] = 'Number'; - return retArr; - } - astBinaryExpression(ast, retArr) { - return retArr; - } - astIdentifierExpression(ast, retArr) { - return retArr; - } - astAssignmentExpression(ast, retArr) { - return retArr; - } - astExpressionStatement(esNode, retArr) { - this.astGeneric(esNode.expression, retArr); - retArr.push(';'); - return retArr; - } - astEmptyStatement(eNode, retArr) { - return retArr; - } - astBlockStatement(ast, retArr) { - return retArr; - } - astIfStatement(ast, retArr) { - return retArr; - } - astSwitchStatement(ast, retArr) { - return retArr; - } - astBreakStatement(brNode, retArr) { - retArr.push('break;'); - return retArr; - } - astContinueStatement(crNode, retArr) { - retArr.push('continue;\n'); - return retArr; - } - astForStatement(ast, retArr) { - return retArr; - } - astWhileStatement(ast, retArr) { - return retArr; - } - astDoWhileStatement(ast, retArr) { - return retArr; - } - astVariableDeclarator(iVarDecNode, retArr) { - this.astGeneric(iVarDecNode.id, retArr); - if (iVarDecNode.init !== null) { - retArr.push('='); - this.astGeneric(iVarDecNode.init, retArr); - } - return retArr; - } - astThisExpression(ast, retArr) { - return retArr; - } - astSequenceExpression(sNode, retArr) { - const { expressions } = sNode; - const sequenceResult = []; - for (let i = 0; i < expressions.length; i++) { - const expression = expressions[i]; - const expressionResult = []; - this.astGeneric(expression, expressionResult); - sequenceResult.push(expressionResult.join('')); - } - if (sequenceResult.length > 1) { - retArr.push('(', sequenceResult.join(','), ')'); - } else { - retArr.push(sequenceResult[0]); - } - return retArr; - } - astUnaryExpression(uNode, retArr) { - const unaryResult = this.checkAndUpconvertBitwiseUnary(uNode, retArr); - if (unaryResult) { - return retArr; - } - - if (uNode.prefix) { - retArr.push(uNode.operator); - this.astGeneric(uNode.argument, retArr); - } else { - this.astGeneric(uNode.argument, retArr); - retArr.push(uNode.operator); - } - - return retArr; - } - - checkAndUpconvertBitwiseUnary(uNode, retArr) {} - - astUpdateExpression(uNode, retArr) { - if (uNode.prefix) { - retArr.push(uNode.operator); - this.astGeneric(uNode.argument, retArr); - } else { - this.astGeneric(uNode.argument, retArr); - retArr.push(uNode.operator); - } - - return retArr; - } - astLogicalExpression(logNode, retArr) { - retArr.push('('); - this.astGeneric(logNode.left, retArr); - retArr.push(logNode.operator); - this.astGeneric(logNode.right, retArr); - retArr.push(')'); - return retArr; - } - astMemberExpression(ast, retArr) { - return retArr; - } - astCallExpression(ast, retArr) { - return retArr; - } - astArrayExpression(ast, retArr) { - return retArr; - } - - getMemberExpressionDetails(ast) { - if (ast.type !== 'MemberExpression') { - throw this.astErrorOutput(`Expression ${ ast.type } not a MemberExpression`, ast); - } - let name = null; - let type = null; - const variableSignature = this.getVariableSignature(ast); - switch (variableSignature) { - case 'value': - return null; - case 'value.thread.value': - case 'this.thread.value': - case 'this.output.value': - return { - signature: variableSignature, - type: 'Integer', - name: ast.property.name - }; - case 'value[]': - if (typeof ast.object.name !== 'string') { - throw this.astErrorOutput('Unexpected expression', ast); - } - name = ast.object.name; - return { - name, - origin: 'user', - signature: variableSignature, - type: this.getVariableType(ast.object), - xProperty: ast.property - }; - case 'value[][]': - if (typeof ast.object.object.name !== 'string') { - throw this.astErrorOutput('Unexpected expression', ast); - } - name = ast.object.object.name; - return { - name, - origin: 'user', - signature: variableSignature, - type: this.getVariableType(ast.object.object), - yProperty: ast.object.property, - xProperty: ast.property, - }; - case 'value[][][]': - if (typeof ast.object.object.object.name !== 'string') { - throw this.astErrorOutput('Unexpected expression', ast); - } - name = ast.object.object.object.name; - return { - name, - origin: 'user', - signature: variableSignature, - type: this.getVariableType(ast.object.object.object), - zProperty: ast.object.object.property, - yProperty: ast.object.property, - xProperty: ast.property, - }; - case 'value[][][][]': - if (typeof ast.object.object.object.object.name !== 'string') { - throw this.astErrorOutput('Unexpected expression', ast); - } - name = ast.object.object.object.object.name; - return { - name, - origin: 'user', - signature: variableSignature, - type: this.getVariableType(ast.object.object.object.object), - zProperty: ast.object.object.property, - yProperty: ast.object.property, - xProperty: ast.property, - }; - case 'value.value': - if (typeof ast.property.name !== 'string') { - throw this.astErrorOutput('Unexpected expression', ast); - } - if (this.isAstMathVariable(ast)) { - name = ast.property.name; - return { - name, - origin: 'Math', - type: 'Number', - signature: variableSignature, - }; - } - switch (ast.property.name) { - case 'r': - case 'g': - case 'b': - case 'a': - name = ast.object.name; - return { - name, - property: ast.property.name, - origin: 'user', - signature: variableSignature, - type: 'Number' - }; - default: - throw this.astErrorOutput('Unexpected expression', ast); - } - case 'this.constants.value': - if (typeof ast.property.name !== 'string') { - throw this.astErrorOutput('Unexpected expression', ast); - } - name = ast.property.name; - type = this.getConstantType(name); - if (!type) { - throw this.astErrorOutput('Constant has no type', ast); - } - return { - name, - type, - origin: 'constants', - signature: variableSignature, - }; - case 'this.constants.value[]': - if (typeof ast.object.property.name !== 'string') { - throw this.astErrorOutput('Unexpected expression', ast); - } - name = ast.object.property.name; - type = this.getConstantType(name); - if (!type) { - throw this.astErrorOutput('Constant has no type', ast); - } - return { - name, - type, - origin: 'constants', - signature: variableSignature, - xProperty: ast.property, - }; - case 'this.constants.value[][]': { - if (typeof ast.object.object.property.name !== 'string') { - throw this.astErrorOutput('Unexpected expression', ast); - } - name = ast.object.object.property.name; - type = this.getConstantType(name); - if (!type) { - throw this.astErrorOutput('Constant has no type', ast); - } - return { - name, - type, - origin: 'constants', - signature: variableSignature, - yProperty: ast.object.property, - xProperty: ast.property, - }; - } - case 'this.constants.value[][][]': { - if (typeof ast.object.object.object.property.name !== 'string') { - throw this.astErrorOutput('Unexpected expression', ast); - } - name = ast.object.object.object.property.name; - type = this.getConstantType(name); - if (!type) { - throw this.astErrorOutput('Constant has no type', ast); - } - return { - name, - type, - origin: 'constants', - signature: variableSignature, - zProperty: ast.object.object.property, - yProperty: ast.object.property, - xProperty: ast.property, - }; - } - case 'fn()[]': - case 'fn()[][]': - case '[][]': - return { - signature: variableSignature, - property: ast.property, - }; - default: - throw this.astErrorOutput('Unexpected expression', ast); - } - } - - findIdentifierOrigin(astToFind) { - const stack = [this.ast]; - - while (stack.length > 0) { - const atNode = stack[0]; - if (atNode.type === 'VariableDeclarator' && atNode.id && atNode.id.name && atNode.id.name === astToFind.name) { - return atNode; - } - stack.shift(); - if (atNode.argument) { - stack.push(atNode.argument); - } else if (atNode.body) { - stack.push(atNode.body); - } else if (atNode.declarations) { - stack.push(atNode.declarations); - } else if (Array.isArray(atNode)) { - for (let i = 0; i < atNode.length; i++) { - stack.push(atNode[i]); - } - } - } - return null; - } - - findLastReturn(ast) { - const stack = [ast || this.ast]; - - while (stack.length > 0) { - const atNode = stack.pop(); - if (atNode.type === 'ReturnStatement') { - return atNode; - } - if (atNode.type === 'FunctionDeclaration') { - continue; - } - if (atNode.argument) { - stack.push(atNode.argument); - } else if (atNode.body) { - stack.push(atNode.body); - } else if (atNode.declarations) { - stack.push(atNode.declarations); - } else if (Array.isArray(atNode)) { - for (let i = 0; i < atNode.length; i++) { - stack.push(atNode[i]); - } - } else if (atNode.consequent) { - stack.push(atNode.consequent); - } else if (atNode.cases) { - stack.push(atNode.cases); - } - } - return null; - } - - getInternalVariableName(name) { - if (!this._internalVariableNames.hasOwnProperty(name)) { - this._internalVariableNames[name] = 0; - } - this._internalVariableNames[name]++; - if (this._internalVariableNames[name] === 1) { - return name; - } - return name + this._internalVariableNames[name]; - } - - astKey(ast, separator = ',') { - if (!ast.start || !ast.end) throw new Error('AST start and end needed'); - return `${ast.start}${separator}${ast.end}`; - } -} - -const typeLookupMap = { - 'Number': 'Number', - 'Float': 'Float', - 'Integer': 'Integer', - 'Array': 'Number', - 'Array(2)': 'Number', - 'Array(3)': 'Number', - 'Array(4)': 'Number', - 'Matrix(2)': 'Number', - 'Matrix(3)': 'Number', - 'Matrix(4)': 'Number', - 'Array2D': 'Number', - 'Array3D': 'Number', - 'Input': 'Number', - 'HTMLCanvas': 'Array(4)', - 'OffscreenCanvas': 'Array(4)', - 'HTMLImage': 'Array(4)', - 'ImageBitmap': 'Array(4)', - 'ImageData': 'Array(4)', - 'HTMLVideo': 'Array(4)', - 'HTMLImageArray': 'Array(4)', - 'NumberTexture': 'Number', - 'MemoryOptimizedNumberTexture': 'Number', - 'Array1D(2)': 'Array(2)', - 'Array1D(3)': 'Array(3)', - 'Array1D(4)': 'Array(4)', - 'Array2D(2)': 'Array(2)', - 'Array2D(3)': 'Array(3)', - 'Array2D(4)': 'Array(4)', - 'Array3D(2)': 'Array(2)', - 'Array3D(3)': 'Array(3)', - 'Array3D(4)': 'Array(4)', - 'ArrayTexture(1)': 'Number', - 'ArrayTexture(2)': 'Array(2)', - 'ArrayTexture(3)': 'Array(3)', - 'ArrayTexture(4)': 'Array(4)', -}; - -module.exports = { - FunctionNode -}; -},{"../utils":114,"./function-tracer":11,"acorn":1}],11:[function(require,module,exports){ -const { utils } = require('../utils'); - -function last(array) { - return array.length > 0 ? array[array.length - 1] : null; -} - -const states = { - trackIdentifiers: 'trackIdentifiers', - memberExpression: 'memberExpression', - inForLoopInit: 'inForLoopInit' -}; - -class FunctionTracer { - constructor(ast) { - this.runningContexts = []; - this.functionContexts = []; - this.contexts = []; - this.functionCalls = []; - this.declarations = []; - this.identifiers = []; - this.functions = []; - this.returnStatements = []; - this.trackedIdentifiers = null; - this.states = []; - this.newFunctionContext(); - this.scan(ast); - } - - isState(state) { - return this.states[this.states.length - 1] === state; - } - - hasState(state) { - return this.states.indexOf(state) > -1; - } - - pushState(state) { - this.states.push(state); - } - - popState(state) { - if (this.isState(state)) { - this.states.pop(); - } else { - throw new Error(`Cannot pop the non-active state "${state}"`); - } - } - - get currentFunctionContext() { - return last(this.functionContexts); - } - - get currentContext() { - return last(this.runningContexts); - } - - newFunctionContext() { - const newContext = { '@contextType': 'function' }; - this.contexts.push(newContext); - this.functionContexts.push(newContext); - } - - newContext(run) { - const newContext = Object.assign({ '@contextType': 'const/let' }, this.currentContext); - this.contexts.push(newContext); - this.runningContexts.push(newContext); - run(); - const { currentFunctionContext } = this; - for (const p in currentFunctionContext) { - if (!currentFunctionContext.hasOwnProperty(p) || newContext.hasOwnProperty(p)) continue; - newContext[p] = currentFunctionContext[p]; - } - this.runningContexts.pop(); - return newContext; - } - - useFunctionContext(run) { - const functionContext = last(this.functionContexts); - this.runningContexts.push(functionContext); - run(); - this.runningContexts.pop(); - } - - getIdentifiers(run) { - const trackedIdentifiers = this.trackedIdentifiers = []; - this.pushState(states.trackIdentifiers); - run(); - this.trackedIdentifiers = null; - this.popState(states.trackIdentifiers); - return trackedIdentifiers; - } - - getDeclaration(name) { - const { currentContext, currentFunctionContext, runningContexts } = this; - const declaration = currentContext[name] || currentFunctionContext[name] || null; - - if ( - !declaration && - currentContext === currentFunctionContext && - runningContexts.length > 0 - ) { - const previousRunningContext = runningContexts[runningContexts.length - 2]; - if (previousRunningContext[name]) { - return previousRunningContext[name]; - } - } - - return declaration; - } - - scan(ast) { - if (!ast) return; - if (Array.isArray(ast)) { - for (let i = 0; i < ast.length; i++) { - this.scan(ast[i]); - } - return; - } - switch (ast.type) { - case 'Program': - this.useFunctionContext(() => { - this.scan(ast.body); - }); - break; - case 'BlockStatement': - this.newContext(() => { - this.scan(ast.body); - }); - break; - case 'AssignmentExpression': - case 'LogicalExpression': - this.scan(ast.left); - this.scan(ast.right); - break; - case 'BinaryExpression': - this.scan(ast.left); - this.scan(ast.right); - break; - case 'UpdateExpression': - if (ast.operator === '++') { - const declaration = this.getDeclaration(ast.argument.name); - if (declaration) { - declaration.suggestedType = 'Integer'; - } - } - this.scan(ast.argument); - break; - case 'UnaryExpression': - this.scan(ast.argument); - break; - case 'VariableDeclaration': - if (ast.kind === 'var') { - this.useFunctionContext(() => { - ast.declarations = utils.normalizeDeclarations(ast); - this.scan(ast.declarations); - }); - } else { - ast.declarations = utils.normalizeDeclarations(ast); - this.scan(ast.declarations); - } - break; - case 'VariableDeclarator': { - const { currentContext } = this; - const inForLoopInit = this.hasState(states.inForLoopInit); - const declaration = { - ast: ast, - context: currentContext, - name: ast.id.name, - origin: 'declaration', - inForLoopInit, - inForLoopTest: null, - assignable: currentContext === this.currentFunctionContext || (!inForLoopInit && !currentContext.hasOwnProperty(ast.id.name)), - suggestedType: null, - valueType: null, - dependencies: null, - isSafe: null, - }; - if (!currentContext[ast.id.name]) { - currentContext[ast.id.name] = declaration; - } - this.declarations.push(declaration); - this.scan(ast.id); - this.scan(ast.init); - break; - } - case 'FunctionExpression': - case 'FunctionDeclaration': - if (this.runningContexts.length === 0) { - this.scan(ast.body); - } else { - this.functions.push(ast); - } - break; - case 'IfStatement': - this.scan(ast.test); - this.scan(ast.consequent); - if (ast.alternate) this.scan(ast.alternate); - break; - case 'ForStatement': { - let testIdentifiers; - const context = this.newContext(() => { - this.pushState(states.inForLoopInit); - this.scan(ast.init); - this.popState(states.inForLoopInit); - - testIdentifiers = this.getIdentifiers(() => { - this.scan(ast.test); - }); - - this.scan(ast.update); - this.newContext(() => { - this.scan(ast.body); - }); - }); - - if (testIdentifiers) { - for (const p in context) { - if (p === '@contextType') continue; - if (testIdentifiers.indexOf(p) > -1) { - context[p].inForLoopTest = true; - } - } - } - break; - } - case 'DoWhileStatement': - case 'WhileStatement': - this.newContext(() => { - this.scan(ast.body); - this.scan(ast.test); - }); - break; - case 'Identifier': { - if (this.isState(states.trackIdentifiers)) { - this.trackedIdentifiers.push(ast.name); - } - this.identifiers.push({ - context: this.currentContext, - declaration: this.getDeclaration(ast.name), - ast, - }); - break; - } - case 'ReturnStatement': - this.returnStatements.push(ast); - this.scan(ast.argument); - break; - case 'MemberExpression': - this.pushState(states.memberExpression); - this.scan(ast.object); - this.scan(ast.property); - this.popState(states.memberExpression); - break; - case 'ExpressionStatement': - this.scan(ast.expression); - break; - case 'SequenceExpression': - this.scan(ast.expressions); - break; - case 'CallExpression': - this.functionCalls.push({ - context: this.currentContext, - ast, - }); - this.scan(ast.arguments); - break; - case 'ArrayExpression': - this.scan(ast.elements); - break; - case 'ConditionalExpression': - this.scan(ast.test); - this.scan(ast.alternate); - this.scan(ast.consequent); - break; - case 'SwitchStatement': - this.scan(ast.discriminant); - this.scan(ast.cases); - break; - case 'SwitchCase': - this.scan(ast.test); - this.scan(ast.consequent); - break; - - case 'ThisExpression': - case 'Literal': - case 'DebuggerStatement': - case 'EmptyStatement': - case 'BreakStatement': - case 'ContinueStatement': - break; - default: - throw new Error(`unhandled type "${ast.type}"`); - } - } -} - -module.exports = { - FunctionTracer, -}; -},{"../utils":114}],12:[function(require,module,exports){ -const { glWiretap } = require('gl-wiretap'); -const { utils } = require('../../utils'); - -function toStringWithoutUtils(fn) { - return fn.toString() - .replace('=>', '') - .replace(/^function /, '') - .replace(/utils[.]/g, '/*utils.*/'); -} - -function glKernelString(Kernel, args, originKernel, setupContextString, destroyContextString) { - if (!originKernel.built) { - originKernel.build.apply(originKernel, args); - } - args = args ? Array.from(args).map(arg => { - switch (typeof arg) { - case 'boolean': - return new Boolean(arg); - case 'number': - return new Number(arg); - default: - return arg; - } - }) : null; - const uploadedValues = []; - const postResult = []; - const context = glWiretap(originKernel.context, { - useTrackablePrimitives: true, - onReadPixels: (targetName) => { - if (kernel.subKernels) { - if (!subKernelsResultVariableSetup) { - postResult.push(` const result = { result: ${getRenderString(targetName, kernel)} };`); - subKernelsResultVariableSetup = true; - } else { - const property = kernel.subKernels[subKernelsResultIndex++].property; - postResult.push(` result${isNaN(property) ? '.' + property : `[${property}]`} = ${getRenderString(targetName, kernel)};`); - } - if (subKernelsResultIndex === kernel.subKernels.length) { - postResult.push(' return result;'); - } - return; - } - if (targetName) { - postResult.push(` return ${getRenderString(targetName, kernel)};`); - } else { - postResult.push(` return null;`); - } - }, - onUnrecognizedArgumentLookup: (argument) => { - const argumentName = findKernelValue(argument, kernel.kernelArguments, [], context, uploadedValues); - if (argumentName) { - return argumentName; - } - const constantName = findKernelValue(argument, kernel.kernelConstants, constants ? Object.keys(constants).map(key => constants[key]) : [], context, uploadedValues); - if (constantName) { - return constantName; - } - return null; - } - }); - let subKernelsResultVariableSetup = false; - let subKernelsResultIndex = 0; - const { - source, - canvas, - output, - pipeline, - graphical, - loopMaxIterations, - constants, - optimizeFloatMemory, - precision, - fixIntegerDivisionAccuracy, - functions, - nativeFunctions, - subKernels, - immutable, - argumentTypes, - constantTypes, - kernelArguments, - kernelConstants, - tactic, - } = originKernel; - const kernel = new Kernel(source, { - canvas, - context, - checkContext: false, - output, - pipeline, - graphical, - loopMaxIterations, - constants, - optimizeFloatMemory, - precision, - fixIntegerDivisionAccuracy, - functions, - nativeFunctions, - subKernels, - immutable, - argumentTypes, - constantTypes, - tactic, - }); - let result = []; - context.setIndent(2); - kernel.build.apply(kernel, args); - result.push(context.toString()); - context.reset(); - - kernel.kernelArguments.forEach((kernelArgument, i) => { - switch (kernelArgument.type) { - case 'Integer': - case 'Boolean': - case 'Number': - case 'Float': - case 'Array': - case 'Array(2)': - case 'Array(3)': - case 'Array(4)': - case 'HTMLCanvas': - case 'HTMLImage': - case 'HTMLVideo': - context.insertVariable(`uploadValue_${kernelArgument.name}`, kernelArgument.uploadValue); - break; - case 'HTMLImageArray': - for (let imageIndex = 0; imageIndex < args[i].length; imageIndex++) { - const arg = args[i]; - context.insertVariable(`uploadValue_${kernelArgument.name}[${imageIndex}]`, arg[imageIndex]); - } - break; - case 'Input': - context.insertVariable(`uploadValue_${kernelArgument.name}`, kernelArgument.uploadValue); - break; - case 'MemoryOptimizedNumberTexture': - case 'NumberTexture': - case 'Array1D(2)': - case 'Array1D(3)': - case 'Array1D(4)': - case 'Array2D(2)': - case 'Array2D(3)': - case 'Array2D(4)': - case 'Array3D(2)': - case 'Array3D(3)': - case 'Array3D(4)': - case 'ArrayTexture(1)': - case 'ArrayTexture(2)': - case 'ArrayTexture(3)': - case 'ArrayTexture(4)': - context.insertVariable(`uploadValue_${kernelArgument.name}`, args[i].texture); - break; - default: - throw new Error(`unhandled kernelArgumentType insertion for glWiretap of type ${kernelArgument.type}`); - } - }); - result.push('/** start of injected functions **/'); - result.push(`function ${toStringWithoutUtils(utils.flattenTo)}`); - result.push(`function ${toStringWithoutUtils(utils.flatten2dArrayTo)}`); - result.push(`function ${toStringWithoutUtils(utils.flatten3dArrayTo)}`); - result.push(`function ${toStringWithoutUtils(utils.flatten4dArrayTo)}`); - result.push(`function ${toStringWithoutUtils(utils.isArray)}`); - if (kernel.renderOutput !== kernel.renderTexture && kernel.formatValues) { - result.push( - ` const renderOutput = function ${toStringWithoutUtils(kernel.formatValues)};` - ); - } - result.push('/** end of injected functions **/'); - result.push(` const innerKernel = function (${kernel.kernelArguments.map(kernelArgument => kernelArgument.varName).join(', ')}) {`); - context.setIndent(4); - kernel.run.apply(kernel, args); - if (kernel.renderKernels) { - kernel.renderKernels(); - } else if (kernel.renderOutput) { - kernel.renderOutput(); - } - result.push(' /** start setup uploads for kernel values **/'); - kernel.kernelArguments.forEach(kernelArgument => { - result.push(' ' + kernelArgument.getStringValueHandler().split('\n').join('\n ')); - }); - result.push(' /** end setup uploads for kernel values **/'); - result.push(context.toString()); - if (kernel.renderOutput === kernel.renderTexture) { - context.reset(); - const framebufferName = context.getContextVariableName(kernel.framebuffer); - if (kernel.renderKernels) { - const results = kernel.renderKernels(); - const textureName = context.getContextVariableName(kernel.texture.texture); - result.push(` return { - result: { - texture: ${ textureName }, - type: '${ results.result.type }', - toArray: ${ getToArrayString(results.result, textureName, framebufferName) } - },`); - const { subKernels, mappedTextures } = kernel; - for (let i = 0; i < subKernels.length; i++) { - const texture = mappedTextures[i]; - const subKernel = subKernels[i]; - const subKernelResult = results[subKernel.property]; - const subKernelTextureName = context.getContextVariableName(texture.texture); - result.push(` - ${subKernel.property}: { - texture: ${ subKernelTextureName }, - type: '${ subKernelResult.type }', - toArray: ${ getToArrayString(subKernelResult, subKernelTextureName, framebufferName) } - },`); - } - result.push(` };`); - } else { - const rendered = kernel.renderOutput(); - const textureName = context.getContextVariableName(kernel.texture.texture); - result.push(` return { - texture: ${ textureName }, - type: '${ rendered.type }', - toArray: ${ getToArrayString(rendered, textureName, framebufferName) } - };`); - } - } - result.push(` ${destroyContextString ? '\n' + destroyContextString + ' ': ''}`); - result.push(postResult.join('\n')); - result.push(' };'); - if (kernel.graphical) { - result.push(getGetPixelsString(kernel)); - result.push(` innerKernel.getPixels = getPixels;`); - } - result.push(' return innerKernel;'); - - let constantsUpload = []; - kernelConstants.forEach((kernelConstant) => { - constantsUpload.push(`${kernelConstant.getStringValueHandler()}`); - }); - return `function kernel(settings) { - const { context, constants } = settings; - ${constantsUpload.join('')} - ${setupContextString ? setupContextString : ''} -${result.join('\n')} -}`; -} - -function getRenderString(targetName, kernel) { - const readBackValue = kernel.precision === 'single' ? targetName : `new Float32Array(${targetName}.buffer)`; - if (kernel.output[2]) { - return `renderOutput(${readBackValue}, ${kernel.output[0]}, ${kernel.output[1]}, ${kernel.output[2]})`; - } - if (kernel.output[1]) { - return `renderOutput(${readBackValue}, ${kernel.output[0]}, ${kernel.output[1]})`; - } - - return `renderOutput(${readBackValue}, ${kernel.output[0]})`; -} - -function getGetPixelsString(kernel) { - const getPixels = kernel.getPixels.toString(); - const useFunctionKeyword = !/^function/.test(getPixels); - return utils.flattenFunctionToString(`${useFunctionKeyword ? 'function ' : ''}${ getPixels }`, { - findDependency: (object, name) => { - if (object === 'utils') { - return `const ${name} = ${utils[name].toString()};`; - } - return null; - }, - thisLookup: (property) => { - if (property === 'context') { - return null; - } - if (kernel.hasOwnProperty(property)) { - return JSON.stringify(kernel[property]); - } - throw new Error(`unhandled thisLookup ${ property }`); - } - }); -} - -function getToArrayString(kernelResult, textureName, framebufferName) { - const toArray = kernelResult.toArray.toString(); - const useFunctionKeyword = !/^function/.test(toArray); - const flattenedFunctions = utils.flattenFunctionToString(`${useFunctionKeyword ? 'function ' : ''}${ toArray }`, { - findDependency: (object, name) => { - if (object === 'utils') { - return `const ${name} = ${utils[name].toString()};`; - } else if (object === 'this') { - if (name === 'framebuffer') { - return ''; - } - return `${useFunctionKeyword ? 'function ' : ''}${kernelResult[name].toString()}`; - } else { - throw new Error('unhandled fromObject'); - } - }, - thisLookup: (property, isDeclaration) => { - if (property === 'texture') { - return textureName; - } - if (property === 'context') { - if (isDeclaration) return null; - return 'gl'; - } - if (kernelResult.hasOwnProperty(property)) { - return JSON.stringify(kernelResult[property]); - } - throw new Error(`unhandled thisLookup ${ property }`); - } - }); - return `() => { - function framebuffer() { return ${framebufferName}; }; - ${flattenedFunctions} - return toArray(); - }`; -} - -function findKernelValue(argument, kernelValues, values, context, uploadedValues) { - if (argument === null) return null; - if (kernelValues === null) return null; - switch (typeof argument) { - case 'boolean': - case 'number': - return null; - } - if ( - typeof HTMLImageElement !== 'undefined' && - argument instanceof HTMLImageElement - ) { - for (let i = 0; i < kernelValues.length; i++) { - const kernelValue = kernelValues[i]; - if (kernelValue.type !== 'HTMLImageArray' && kernelValue) continue; - if (kernelValue.uploadValue !== argument) continue; - const variableIndex = values[i].indexOf(argument); - if (variableIndex === -1) continue; - const variableName = `uploadValue_${kernelValue.name}[${variableIndex}]`; - context.insertVariable(variableName, argument); - return variableName; - } - } - - for (let i = 0; i < kernelValues.length; i++) { - const kernelValue = kernelValues[i]; - if (argument !== kernelValue.uploadValue) continue; - const variable = `uploadValue_${kernelValue.name}`; - context.insertVariable(variable, kernelValue); - return variable; - } - return null; -} - -module.exports = { - glKernelString -}; -},{"../../utils":114,"gl-wiretap":3}],13:[function(require,module,exports){ -const { Kernel } = require('../kernel'); -const { utils } = require('../../utils'); -const { GLTextureArray2Float } = require('./texture/array-2-float'); -const { GLTextureArray2Float2D } = require('./texture/array-2-float-2d'); -const { GLTextureArray2Float3D } = require('./texture/array-2-float-3d'); -const { GLTextureArray3Float } = require('./texture/array-3-float'); -const { GLTextureArray3Float2D } = require('./texture/array-3-float-2d'); -const { GLTextureArray3Float3D } = require('./texture/array-3-float-3d'); -const { GLTextureArray4Float } = require('./texture/array-4-float'); -const { GLTextureArray4Float2D } = require('./texture/array-4-float-2d'); -const { GLTextureArray4Float3D } = require('./texture/array-4-float-3d'); -const { GLTextureFloat } = require('./texture/float'); -const { GLTextureFloat2D } = require('./texture/float-2d'); -const { GLTextureFloat3D } = require('./texture/float-3d'); -const { GLTextureMemoryOptimized } = require('./texture/memory-optimized'); -const { GLTextureMemoryOptimized2D } = require('./texture/memory-optimized-2d'); -const { GLTextureMemoryOptimized3D } = require('./texture/memory-optimized-3d'); -const { GLTextureUnsigned } = require('./texture/unsigned'); -const { GLTextureUnsigned2D } = require('./texture/unsigned-2d'); -const { GLTextureUnsigned3D } = require('./texture/unsigned-3d'); -const { GLTextureGraphical } = require('./texture/graphical'); - -class GLKernel extends Kernel { - static get mode() { - return 'gpu'; - } - - static getIsFloatRead() { - const kernelString = `function kernelFunction() { - return 1; - }`; - const kernel = new this(kernelString, { - context: this.testContext, - canvas: this.testCanvas, - validate: false, - output: [1], - precision: 'single', - returnType: 'Number', - tactic: 'speed', - }); - kernel.build(); - kernel.run(); - const result = kernel.renderOutput(); - kernel.destroy(true); - return result[0] === 1; - } - - static getIsIntegerDivisionAccurate() { - function kernelFunction(v1, v2) { - return v1[this.thread.x] / v2[this.thread.x]; - } - const kernel = new this(kernelFunction.toString(), { - context: this.testContext, - canvas: this.testCanvas, - validate: false, - output: [2], - returnType: 'Number', - precision: 'unsigned', - tactic: 'speed', - }); - const args = [ - [6, 6030401], - [3, 3991] - ]; - kernel.build.apply(kernel, args); - kernel.run.apply(kernel, args); - const result = kernel.renderOutput(); - kernel.destroy(true); - return result[0] === 2 && result[1] === 1511; - } - - static getIsSpeedTacticSupported() { - function kernelFunction(value) { - return value[this.thread.x]; - } - const kernel = new this(kernelFunction.toString(), { - context: this.testContext, - canvas: this.testCanvas, - validate: false, - output: [4], - returnType: 'Number', - precision: 'unsigned', - tactic: 'speed', - }); - const args = [ - [0, 1, 2, 3] - ]; - kernel.build.apply(kernel, args); - kernel.run.apply(kernel, args); - const result = kernel.renderOutput(); - kernel.destroy(true); - return Math.round(result[0]) === 0 && Math.round(result[1]) === 1 && Math.round(result[2]) === 2 && Math.round(result[3]) === 3; - } - - static get testCanvas() { - throw new Error(`"testCanvas" not defined on ${ this.name }`); - } - - static get testContext() { - throw new Error(`"testContext" not defined on ${ this.name }`); - } - - static getFeatures() { - const gl = this.testContext; - const isDrawBuffers = this.getIsDrawBuffers(); - return Object.freeze({ - isFloatRead: this.getIsFloatRead(), - isIntegerDivisionAccurate: this.getIsIntegerDivisionAccurate(), - isSpeedTacticSupported: this.getIsSpeedTacticSupported(), - isTextureFloat: this.getIsTextureFloat(), - isDrawBuffers, - kernelMap: isDrawBuffers, - channelCount: this.getChannelCount(), - maxTextureSize: this.getMaxTextureSize(), - lowIntPrecision: gl.getShaderPrecisionFormat(gl.FRAGMENT_SHADER, gl.LOW_INT), - lowFloatPrecision: gl.getShaderPrecisionFormat(gl.FRAGMENT_SHADER, gl.LOW_FLOAT), - mediumIntPrecision: gl.getShaderPrecisionFormat(gl.FRAGMENT_SHADER, gl.MEDIUM_INT), - mediumFloatPrecision: gl.getShaderPrecisionFormat(gl.FRAGMENT_SHADER, gl.MEDIUM_FLOAT), - highIntPrecision: gl.getShaderPrecisionFormat(gl.FRAGMENT_SHADER, gl.HIGH_INT), - highFloatPrecision: gl.getShaderPrecisionFormat(gl.FRAGMENT_SHADER, gl.HIGH_FLOAT), - }); - } - - static setupFeatureChecks() { - throw new Error(`"setupFeatureChecks" not defined on ${ this.name }`); - } - - static getSignature(kernel, argumentTypes) { - return kernel.getVariablePrecisionString() + (argumentTypes.length > 0 ? ':' + argumentTypes.join(',') : ''); - } - - setFixIntegerDivisionAccuracy(fix) { - this.fixIntegerDivisionAccuracy = fix; - return this; - } - - setPrecision(flag) { - this.precision = flag; - return this; - } - - setFloatTextures(flag) { - utils.warnDeprecated('method', 'setFloatTextures', 'setOptimizeFloatMemory'); - this.floatTextures = flag; - return this; - } - - static nativeFunctionArguments(source) { - const argumentTypes = []; - const argumentNames = []; - const states = []; - const isStartingVariableName = /^[a-zA-Z_]/; - const isVariableChar = /[a-zA-Z_0-9]/; - let i = 0; - let argumentName = null; - let argumentType = null; - while (i < source.length) { - const char = source[i]; - const nextChar = source[i + 1]; - const state = states.length > 0 ? states[states.length - 1] : null; - - if (state === 'FUNCTION_ARGUMENTS' && char === '/' && nextChar === '*') { - states.push('MULTI_LINE_COMMENT'); - i += 2; - continue; - } else if (state === 'MULTI_LINE_COMMENT' && char === '*' && nextChar === '/') { - states.pop(); - i += 2; - continue; - } - - else if (state === 'FUNCTION_ARGUMENTS' && char === '/' && nextChar === '/') { - states.push('COMMENT'); - i += 2; - continue; - } else if (state === 'COMMENT' && char === '\n') { - states.pop(); - i++; - continue; - } - - else if (state === null && char === '(') { - states.push('FUNCTION_ARGUMENTS'); - i++; - continue; - } else if (state === 'FUNCTION_ARGUMENTS') { - if (char === ')') { - states.pop(); - break; - } - if (char === 'f' && nextChar === 'l' && source[i + 2] === 'o' && source[i + 3] === 'a' && source[i + 4] === 't' && source[i + 5] === ' ') { - states.push('DECLARE_VARIABLE'); - argumentType = 'float'; - argumentName = ''; - i += 6; - continue; - } else if (char === 'i' && nextChar === 'n' && source[i + 2] === 't' && source[i + 3] === ' ') { - states.push('DECLARE_VARIABLE'); - argumentType = 'int'; - argumentName = ''; - i += 4; - continue; - } else if (char === 'v' && nextChar === 'e' && source[i + 2] === 'c' && source[i + 3] === '2' && source[i + 4] === ' ') { - states.push('DECLARE_VARIABLE'); - argumentType = 'vec2'; - argumentName = ''; - i += 5; - continue; - } else if (char === 'v' && nextChar === 'e' && source[i + 2] === 'c' && source[i + 3] === '3' && source[i + 4] === ' ') { - states.push('DECLARE_VARIABLE'); - argumentType = 'vec3'; - argumentName = ''; - i += 5; - continue; - } else if (char === 'v' && nextChar === 'e' && source[i + 2] === 'c' && source[i + 3] === '4' && source[i + 4] === ' ') { - states.push('DECLARE_VARIABLE'); - argumentType = 'vec4'; - argumentName = ''; - i += 5; - continue; - } - } - - else if (state === 'DECLARE_VARIABLE') { - if (argumentName === '') { - if (char === ' ') { - i++; - continue; - } - if (!isStartingVariableName.test(char)) { - throw new Error('variable name is not expected string'); - } - } - argumentName += char; - if (!isVariableChar.test(nextChar)) { - states.pop(); - argumentNames.push(argumentName); - argumentTypes.push(typeMap[argumentType]); - } - } - - i++; - } - if (states.length > 0) { - throw new Error('GLSL function was not parsable'); - } - return { - argumentNames, - argumentTypes, - }; - } - - static nativeFunctionReturnType(source) { - return typeMap[source.match(/int|float|vec[2-4]/)[0]]; - } - - static combineKernels(combinedKernel, lastKernel) { - combinedKernel.apply(null, arguments); - const { - texSize, - context, - threadDim - } = lastKernel.texSize; - let result; - if (lastKernel.precision === 'single') { - const w = texSize[0]; - const h = Math.ceil(texSize[1] / 4); - result = new Float32Array(w * h * 4 * 4); - context.readPixels(0, 0, w, h * 4, context.RGBA, context.FLOAT, result); - } else { - const bytes = new Uint8Array(texSize[0] * texSize[1] * 4); - context.readPixels(0, 0, texSize[0], texSize[1], context.RGBA, context.UNSIGNED_BYTE, bytes); - result = new Float32Array(bytes.buffer); - } - - result = result.subarray(0, threadDim[0] * threadDim[1] * threadDim[2]); - - if (lastKernel.output.length === 1) { - return result; - } else if (lastKernel.output.length === 2) { - return utils.splitArray(result, lastKernel.output[0]); - } else if (lastKernel.output.length === 3) { - const cube = utils.splitArray(result, lastKernel.output[0] * lastKernel.output[1]); - return cube.map(function(x) { - return utils.splitArray(x, lastKernel.output[0]); - }); - } - } - - constructor(source, settings) { - super(source, settings); - this.transferValues = null; - this.formatValues = null; - this.TextureConstructor = null; - this.renderOutput = null; - this.renderRawOutput = null; - this.texSize = null; - this.translatedSource = null; - this.compiledFragmentShader = null; - this.compiledVertexShader = null; - this.switchingKernels = null; - this._textureSwitched = null; - this._mappedTextureSwitched = null; - } - - checkTextureSize() { - const { features } = this.constructor; - if (this.texSize[0] > features.maxTextureSize || this.texSize[1] > features.maxTextureSize) { - throw new Error(`Texture size [${this.texSize[0]},${this.texSize[1]}] generated by kernel is larger than supported size [${features.maxTextureSize},${features.maxTextureSize}]`); - } - } - - translateSource() { - throw new Error(`"translateSource" not defined on ${this.constructor.name}`); - } - - pickRenderStrategy(args) { - if (this.graphical) { - this.renderRawOutput = this.readPackedPixelsToUint8Array; - this.transferValues = (pixels) => pixels; - this.TextureConstructor = GLTextureGraphical; - return null; - } - if (this.precision === 'unsigned') { - this.renderRawOutput = this.readPackedPixelsToUint8Array; - this.transferValues = this.readPackedPixelsToFloat32Array; - if (this.pipeline) { - this.renderOutput = this.renderTexture; - if (this.subKernels !== null) { - this.renderKernels = this.renderKernelsToTextures; - } - switch (this.returnType) { - case 'LiteralInteger': - case 'Float': - case 'Number': - case 'Integer': - if (this.output[2] > 0) { - this.TextureConstructor = GLTextureUnsigned3D; - return null; - } else if (this.output[1] > 0) { - this.TextureConstructor = GLTextureUnsigned2D; - return null; - } else { - this.TextureConstructor = GLTextureUnsigned; - return null; - } - case 'Array(2)': - case 'Array(3)': - case 'Array(4)': - return this.requestFallback(args); - } - } else { - if (this.subKernels !== null) { - this.renderKernels = this.renderKernelsToArrays; - } - switch (this.returnType) { - case 'LiteralInteger': - case 'Float': - case 'Number': - case 'Integer': - this.renderOutput = this.renderValues; - if (this.output[2] > 0) { - this.TextureConstructor = GLTextureUnsigned3D; - this.formatValues = utils.erect3DPackedFloat; - return null; - } else if (this.output[1] > 0) { - this.TextureConstructor = GLTextureUnsigned2D; - this.formatValues = utils.erect2DPackedFloat; - return null; - } else { - this.TextureConstructor = GLTextureUnsigned; - this.formatValues = utils.erectPackedFloat; - return null; - } - case 'Array(2)': - case 'Array(3)': - case 'Array(4)': - return this.requestFallback(args); - } - } - } else if (this.precision === 'single') { - this.renderRawOutput = this.readFloatPixelsToFloat32Array; - this.transferValues = this.readFloatPixelsToFloat32Array; - if (this.pipeline) { - this.renderOutput = this.renderTexture; - if (this.subKernels !== null) { - this.renderKernels = this.renderKernelsToTextures; - } - switch (this.returnType) { - case 'LiteralInteger': - case 'Float': - case 'Number': - case 'Integer': { - if (this.optimizeFloatMemory) { - if (this.output[2] > 0) { - this.TextureConstructor = GLTextureMemoryOptimized3D; - return null; - } else if (this.output[1] > 0) { - this.TextureConstructor = GLTextureMemoryOptimized2D; - return null; - } else { - this.TextureConstructor = GLTextureMemoryOptimized; - return null; - } - } else { - if (this.output[2] > 0) { - this.TextureConstructor = GLTextureFloat3D; - return null; - } else if (this.output[1] > 0) { - this.TextureConstructor = GLTextureFloat2D; - return null; - } else { - this.TextureConstructor = GLTextureFloat; - return null; - } - } - } - case 'Array(2)': { - if (this.output[2] > 0) { - this.TextureConstructor = GLTextureArray2Float3D; - return null; - } else if (this.output[1] > 0) { - this.TextureConstructor = GLTextureArray2Float2D; - return null; - } else { - this.TextureConstructor = GLTextureArray2Float; - return null; - } - } - case 'Array(3)': { - if (this.output[2] > 0) { - this.TextureConstructor = GLTextureArray3Float3D; - return null; - } else if (this.output[1] > 0) { - this.TextureConstructor = GLTextureArray3Float2D; - return null; - } else { - this.TextureConstructor = GLTextureArray3Float; - return null; - } - } - case 'Array(4)': { - if (this.output[2] > 0) { - this.TextureConstructor = GLTextureArray4Float3D; - return null; - } else if (this.output[1] > 0) { - this.TextureConstructor = GLTextureArray4Float2D; - return null; - } else { - this.TextureConstructor = GLTextureArray4Float; - return null; - } - } - } - } - this.renderOutput = this.renderValues; - if (this.subKernels !== null) { - this.renderKernels = this.renderKernelsToArrays; - } - if (this.optimizeFloatMemory) { - switch (this.returnType) { - case 'LiteralInteger': - case 'Float': - case 'Number': - case 'Integer': { - if (this.output[2] > 0) { - this.TextureConstructor = GLTextureMemoryOptimized3D; - this.formatValues = utils.erectMemoryOptimized3DFloat; - return null; - } else if (this.output[1] > 0) { - this.TextureConstructor = GLTextureMemoryOptimized2D; - this.formatValues = utils.erectMemoryOptimized2DFloat; - return null; - } else { - this.TextureConstructor = GLTextureMemoryOptimized; - this.formatValues = utils.erectMemoryOptimizedFloat; - return null; - } - } - case 'Array(2)': { - if (this.output[2] > 0) { - this.TextureConstructor = GLTextureArray2Float3D; - this.formatValues = utils.erect3DArray2; - return null; - } else if (this.output[1] > 0) { - this.TextureConstructor = GLTextureArray2Float2D; - this.formatValues = utils.erect2DArray2; - return null; - } else { - this.TextureConstructor = GLTextureArray2Float; - this.formatValues = utils.erectArray2; - return null; - } - } - case 'Array(3)': { - if (this.output[2] > 0) { - this.TextureConstructor = GLTextureArray3Float3D; - this.formatValues = utils.erect3DArray3; - return null; - } else if (this.output[1] > 0) { - this.TextureConstructor = GLTextureArray3Float2D; - this.formatValues = utils.erect2DArray3; - return null; - } else { - this.TextureConstructor = GLTextureArray3Float; - this.formatValues = utils.erectArray3; - return null; - } - } - case 'Array(4)': { - if (this.output[2] > 0) { - this.TextureConstructor = GLTextureArray4Float3D; - this.formatValues = utils.erect3DArray4; - return null; - } else if (this.output[1] > 0) { - this.TextureConstructor = GLTextureArray4Float2D; - this.formatValues = utils.erect2DArray4; - return null; - } else { - this.TextureConstructor = GLTextureArray4Float; - this.formatValues = utils.erectArray4; - return null; - } - } - } - } else { - switch (this.returnType) { - case 'LiteralInteger': - case 'Float': - case 'Number': - case 'Integer': { - if (this.output[2] > 0) { - this.TextureConstructor = GLTextureFloat3D; - this.formatValues = utils.erect3DFloat; - return null; - } else if (this.output[1] > 0) { - this.TextureConstructor = GLTextureFloat2D; - this.formatValues = utils.erect2DFloat; - return null; - } else { - this.TextureConstructor = GLTextureFloat; - this.formatValues = utils.erectFloat; - return null; - } - } - case 'Array(2)': { - if (this.output[2] > 0) { - this.TextureConstructor = GLTextureArray2Float3D; - this.formatValues = utils.erect3DArray2; - return null; - } else if (this.output[1] > 0) { - this.TextureConstructor = GLTextureArray2Float2D; - this.formatValues = utils.erect2DArray2; - return null; - } else { - this.TextureConstructor = GLTextureArray2Float; - this.formatValues = utils.erectArray2; - return null; - } - } - case 'Array(3)': { - if (this.output[2] > 0) { - this.TextureConstructor = GLTextureArray3Float3D; - this.formatValues = utils.erect3DArray3; - return null; - } else if (this.output[1] > 0) { - this.TextureConstructor = GLTextureArray3Float2D; - this.formatValues = utils.erect2DArray3; - return null; - } else { - this.TextureConstructor = GLTextureArray3Float; - this.formatValues = utils.erectArray3; - return null; - } - } - case 'Array(4)': { - if (this.output[2] > 0) { - this.TextureConstructor = GLTextureArray4Float3D; - this.formatValues = utils.erect3DArray4; - return null; - } else if (this.output[1] > 0) { - this.TextureConstructor = GLTextureArray4Float2D; - this.formatValues = utils.erect2DArray4; - return null; - } else { - this.TextureConstructor = GLTextureArray4Float; - this.formatValues = utils.erectArray4; - return null; - } - } - } - } - } else { - throw new Error(`unhandled precision of "${this.precision}"`); - } - - throw new Error(`unhandled return type "${this.returnType}"`); - } - - getKernelString() { - throw new Error(`abstract method call`); - } - - getMainResultTexture() { - switch (this.returnType) { - case 'LiteralInteger': - case 'Float': - case 'Integer': - case 'Number': - return this.getMainResultNumberTexture(); - case 'Array(2)': - return this.getMainResultArray2Texture(); - case 'Array(3)': - return this.getMainResultArray3Texture(); - case 'Array(4)': - return this.getMainResultArray4Texture(); - default: - throw new Error(`unhandled returnType type ${ this.returnType }`); - } - } - - getMainResultKernelNumberTexture() { - throw new Error(`abstract method call`); - } - getMainResultSubKernelNumberTexture() { - throw new Error(`abstract method call`); - } - getMainResultKernelArray2Texture() { - throw new Error(`abstract method call`); - } - getMainResultSubKernelArray2Texture() { - throw new Error(`abstract method call`); - } - getMainResultKernelArray3Texture() { - throw new Error(`abstract method call`); - } - getMainResultSubKernelArray3Texture() { - throw new Error(`abstract method call`); - } - getMainResultKernelArray4Texture() { - throw new Error(`abstract method call`); - } - getMainResultSubKernelArray4Texture() { - throw new Error(`abstract method call`); - } - getMainResultGraphical() { - throw new Error(`abstract method call`); - } - getMainResultMemoryOptimizedFloats() { - throw new Error(`abstract method call`); - } - getMainResultPackedPixels() { - throw new Error(`abstract method call`); - } - - getMainResultString() { - if (this.graphical) { - return this.getMainResultGraphical(); - } else if (this.precision === 'single') { - if (this.optimizeFloatMemory) { - return this.getMainResultMemoryOptimizedFloats(); - } - return this.getMainResultTexture(); - } else { - return this.getMainResultPackedPixels(); - } - } - - getMainResultNumberTexture() { - return utils.linesToString(this.getMainResultKernelNumberTexture()) + - utils.linesToString(this.getMainResultSubKernelNumberTexture()); - } - - getMainResultArray2Texture() { - return utils.linesToString(this.getMainResultKernelArray2Texture()) + - utils.linesToString(this.getMainResultSubKernelArray2Texture()); - } - - getMainResultArray3Texture() { - return utils.linesToString(this.getMainResultKernelArray3Texture()) + - utils.linesToString(this.getMainResultSubKernelArray3Texture()); - } - - getMainResultArray4Texture() { - return utils.linesToString(this.getMainResultKernelArray4Texture()) + - utils.linesToString(this.getMainResultSubKernelArray4Texture()); - } - - getFloatTacticDeclaration() { - const variablePrecision = this.getVariablePrecisionString(this.texSize, this.tactic); - return `precision ${variablePrecision} float;\n`; - } - - getIntTacticDeclaration() { - return `precision ${this.getVariablePrecisionString(this.texSize, this.tactic, true)} int;\n`; - } - - getSampler2DTacticDeclaration() { - return `precision ${this.getVariablePrecisionString(this.texSize, this.tactic)} sampler2D;\n`; - } - - getSampler2DArrayTacticDeclaration() { - return `precision ${this.getVariablePrecisionString(this.texSize, this.tactic)} sampler2DArray;\n`; - } - - renderTexture() { - return this.immutable ? this.texture.clone() : this.texture; - } - readPackedPixelsToUint8Array() { - if (this.precision !== 'unsigned') throw new Error('Requires this.precision to be "unsigned"'); - const { - texSize, - context: gl - } = this; - const result = new Uint8Array(texSize[0] * texSize[1] * 4); - gl.readPixels(0, 0, texSize[0], texSize[1], gl.RGBA, gl.UNSIGNED_BYTE, result); - return result; - } - - readPackedPixelsToFloat32Array() { - return new Float32Array(this.readPackedPixelsToUint8Array().buffer); - } - - readFloatPixelsToFloat32Array() { - if (this.precision !== 'single') throw new Error('Requires this.precision to be "single"'); - const { - texSize, - context: gl - } = this; - const w = texSize[0]; - const h = texSize[1]; - const result = new Float32Array(w * h * 4); - gl.readPixels(0, 0, w, h, gl.RGBA, gl.FLOAT, result); - return result; - } - - getPixels(flip) { - const { - context: gl, - output - } = this; - const [width, height] = output; - const pixels = new Uint8Array(width * height * 4); - gl.readPixels(0, 0, width, height, gl.RGBA, gl.UNSIGNED_BYTE, pixels); - return new Uint8ClampedArray((flip ? pixels : utils.flipPixels(pixels, width, height)).buffer); - } - - renderKernelsToArrays() { - const result = { - result: this.renderOutput(), - }; - for (let i = 0; i < this.subKernels.length; i++) { - result[this.subKernels[i].property] = this.mappedTextures[i].toArray(); - } - return result; - } - - renderKernelsToTextures() { - const result = { - result: this.renderOutput(), - }; - if (this.immutable) { - for (let i = 0; i < this.subKernels.length; i++) { - result[this.subKernels[i].property] = this.mappedTextures[i].clone(); - } - } else { - for (let i = 0; i < this.subKernels.length; i++) { - result[this.subKernels[i].property] = this.mappedTextures[i]; - } - } - return result; - } - - resetSwitchingKernels() { - const existingValue = this.switchingKernels; - this.switchingKernels = null; - return existingValue; - } - - setOutput(output) { - const newOutput = this.toKernelOutput(output); - if (this.program) { - if (!this.dynamicOutput) { - throw new Error('Resizing a kernel with dynamicOutput: false is not possible'); - } - const newThreadDim = [newOutput[0], newOutput[1] || 1, newOutput[2] || 1]; - const newTexSize = utils.getKernelTextureSize({ - optimizeFloatMemory: this.optimizeFloatMemory, - precision: this.precision, - }, newThreadDim); - const oldTexSize = this.texSize; - if (oldTexSize) { - const oldPrecision = this.getVariablePrecisionString(oldTexSize, this.tactic); - const newPrecision = this.getVariablePrecisionString(newTexSize, this.tactic); - if (oldPrecision !== newPrecision) { - if (this.debug) { - console.warn('Precision requirement changed, asking GPU instance to recompile'); - } - this.switchKernels({ - type: 'outputPrecisionMismatch', - precision: newPrecision, - needed: output - }); - return; - } - } - this.output = newOutput; - this.threadDim = newThreadDim; - this.texSize = newTexSize; - const { context: gl } = this; - gl.bindFramebuffer(gl.FRAMEBUFFER, this.framebuffer); - this.updateMaxTexSize(); - this.framebuffer.width = this.texSize[0]; - this.framebuffer.height = this.texSize[1]; - gl.viewport(0, 0, this.maxTexSize[0], this.maxTexSize[1]); - this.canvas.width = this.maxTexSize[0]; - this.canvas.height = this.maxTexSize[1]; - if (this.texture) { - this.texture.delete(); - } - this.texture = null; - this._setupOutputTexture(); - if (this.mappedTextures && this.mappedTextures.length > 0) { - for (let i = 0; i < this.mappedTextures.length; i++) { - this.mappedTextures[i].delete(); - } - this.mappedTextures = null; - this._setupSubOutputTextures(); - } - } else { - this.output = newOutput; - } - return this; - } - renderValues() { - return this.formatValues( - this.transferValues(), - this.output[0], - this.output[1], - this.output[2] - ); - } - switchKernels(reason) { - if (this.switchingKernels) { - this.switchingKernels.push(reason); - } else { - this.switchingKernels = [reason]; - } - } - getVariablePrecisionString(textureSize = this.texSize, tactic = this.tactic, isInt = false) { - if (!tactic) { - if (!this.constructor.features.isSpeedTacticSupported) return 'highp'; - const low = this.constructor.features[isInt ? 'lowIntPrecision' : 'lowFloatPrecision']; - const medium = this.constructor.features[isInt ? 'mediumIntPrecision' : 'mediumFloatPrecision']; - const high = this.constructor.features[isInt ? 'highIntPrecision' : 'highFloatPrecision']; - const requiredSize = Math.log2(textureSize[0] * textureSize[1]); - if (requiredSize <= low.rangeMax) { - return 'lowp'; - } else if (requiredSize <= medium.rangeMax) { - return 'mediump'; - } else if (requiredSize <= high.rangeMax) { - return 'highp'; - } else { - throw new Error(`The required size exceeds that of the ability of your system`); - } - } - switch (tactic) { - case 'speed': - return 'lowp'; - case 'balanced': - return 'mediump'; - case 'precision': - return 'highp'; - default: - throw new Error(`Unknown tactic "${tactic}" use "speed", "balanced", "precision", or empty for auto`); - } - } - - updateTextureArgumentRefs(kernelValue, arg) { - if (!this.immutable) return; - if (this.texture.texture === arg.texture) { - const { prevArg } = kernelValue; - if (prevArg) { - if (prevArg.texture._refs === 1) { - this.texture.delete(); - this.texture = prevArg.clone(); - this._textureSwitched = true; - } - prevArg.delete(); - } - kernelValue.prevArg = arg.clone(); - } else if (this.mappedTextures && this.mappedTextures.length > 0) { - const { mappedTextures } = this; - for (let i = 0; i < mappedTextures.length; i++) { - const mappedTexture = mappedTextures[i]; - if (mappedTexture.texture === arg.texture) { - const { prevArg } = kernelValue; - if (prevArg) { - if (prevArg.texture._refs === 1) { - mappedTexture.delete(); - mappedTextures[i] = prevArg.clone(); - this._mappedTextureSwitched[i] = true; - } - prevArg.delete(); - } - kernelValue.prevArg = arg.clone(); - return; - } - } - } - } - - onActivate(previousKernel) { - this._textureSwitched = true; - this.texture = previousKernel.texture; - if (this.mappedTextures) { - for (let i = 0; i < this.mappedTextures.length; i++) { - this._mappedTextureSwitched[i] = true; - } - this.mappedTextures = previousKernel.mappedTextures; - } - } - - initCanvas() {} -} - -const typeMap = { - int: 'Integer', - float: 'Number', - vec2: 'Array(2)', - vec3: 'Array(3)', - vec4: 'Array(4)', -}; - -module.exports = { - GLKernel -}; -},{"../../utils":114,"../kernel":36,"./texture/array-2-float":16,"./texture/array-2-float-2d":14,"./texture/array-2-float-3d":15,"./texture/array-3-float":19,"./texture/array-3-float-2d":17,"./texture/array-3-float-3d":18,"./texture/array-4-float":22,"./texture/array-4-float-2d":20,"./texture/array-4-float-3d":21,"./texture/float":25,"./texture/float-2d":23,"./texture/float-3d":24,"./texture/graphical":26,"./texture/memory-optimized":30,"./texture/memory-optimized-2d":28,"./texture/memory-optimized-3d":29,"./texture/unsigned":33,"./texture/unsigned-2d":31,"./texture/unsigned-3d":32}],14:[function(require,module,exports){ -const { utils } = require('../../../utils'); -const { GLTextureFloat } = require('./float'); - -class GLTextureArray2Float2D extends GLTextureFloat { - constructor(settings) { - super(settings); - this.type = 'ArrayTexture(2)'; - } - toArray() { - return utils.erect2DArray2(this.renderValues(), this.output[0], this.output[1]); - } -} - -module.exports = { - GLTextureArray2Float2D -}; -},{"../../../utils":114,"./float":25}],15:[function(require,module,exports){ -const { utils } = require('../../../utils'); -const { GLTextureFloat } = require('./float'); - -class GLTextureArray2Float3D extends GLTextureFloat { - constructor(settings) { - super(settings); - this.type = 'ArrayTexture(2)'; - } - toArray() { - return utils.erect3DArray2(this.renderValues(), this.output[0], this.output[1], this.output[2]); - } -} - -module.exports = { - GLTextureArray2Float3D -}; -},{"../../../utils":114,"./float":25}],16:[function(require,module,exports){ -const { utils } = require('../../../utils'); -const { GLTextureFloat } = require('./float'); - -class GLTextureArray2Float extends GLTextureFloat { - constructor(settings) { - super(settings); - this.type = 'ArrayTexture(2)'; - } - toArray() { - return utils.erectArray2(this.renderValues(), this.output[0], this.output[1]); - } -} - -module.exports = { - GLTextureArray2Float -}; -},{"../../../utils":114,"./float":25}],17:[function(require,module,exports){ -const { utils } = require('../../../utils'); -const { GLTextureFloat } = require('./float'); - -class GLTextureArray3Float2D extends GLTextureFloat { - constructor(settings) { - super(settings); - this.type = 'ArrayTexture(3)'; - } - toArray() { - return utils.erect2DArray3(this.renderValues(), this.output[0], this.output[1]); - } -} - -module.exports = { - GLTextureArray3Float2D -}; -},{"../../../utils":114,"./float":25}],18:[function(require,module,exports){ -const { utils } = require('../../../utils'); -const { GLTextureFloat } = require('./float'); - -class GLTextureArray3Float3D extends GLTextureFloat { - constructor(settings) { - super(settings); - this.type = 'ArrayTexture(3)'; - } - toArray() { - return utils.erect3DArray3(this.renderValues(), this.output[0], this.output[1], this.output[2]); - } -} - -module.exports = { - GLTextureArray3Float3D -}; -},{"../../../utils":114,"./float":25}],19:[function(require,module,exports){ -const { utils } = require('../../../utils'); -const { GLTextureFloat } = require('./float'); - -class GLTextureArray3Float extends GLTextureFloat { - constructor(settings) { - super(settings); - this.type = 'ArrayTexture(3)'; - } - toArray() { - return utils.erectArray3(this.renderValues(), this.output[0]); - } -} - -module.exports = { - GLTextureArray3Float -}; -},{"../../../utils":114,"./float":25}],20:[function(require,module,exports){ -const { utils } = require('../../../utils'); -const { GLTextureFloat } = require('./float'); - -class GLTextureArray4Float2D extends GLTextureFloat { - constructor(settings) { - super(settings); - this.type = 'ArrayTexture(4)'; - } - toArray() { - return utils.erect2DArray4(this.renderValues(), this.output[0], this.output[1]); - } -} - -module.exports = { - GLTextureArray4Float2D -}; -},{"../../../utils":114,"./float":25}],21:[function(require,module,exports){ -const { utils } = require('../../../utils'); -const { GLTextureFloat } = require('./float'); - -class GLTextureArray4Float3D extends GLTextureFloat { - constructor(settings) { - super(settings); - this.type = 'ArrayTexture(4)'; - } - toArray() { - return utils.erect3DArray4(this.renderValues(), this.output[0], this.output[1], this.output[2]); - } -} - -module.exports = { - GLTextureArray4Float3D -}; -},{"../../../utils":114,"./float":25}],22:[function(require,module,exports){ -const { utils } = require('../../../utils'); -const { GLTextureFloat } = require('./float'); - -class GLTextureArray4Float extends GLTextureFloat { - constructor(settings) { - super(settings); - this.type = 'ArrayTexture(4)'; - } - toArray() { - return utils.erectArray4(this.renderValues(), this.output[0]); - } -} - -module.exports = { - GLTextureArray4Float -}; -},{"../../../utils":114,"./float":25}],23:[function(require,module,exports){ -const { utils } = require('../../../utils'); -const { GLTextureFloat } = require('./float'); - -class GLTextureFloat2D extends GLTextureFloat { - constructor(settings) { - super(settings); - this.type = 'ArrayTexture(1)'; - } - toArray() { - return utils.erect2DFloat(this.renderValues(), this.output[0], this.output[1]); - } -} - -module.exports = { - GLTextureFloat2D -}; -},{"../../../utils":114,"./float":25}],24:[function(require,module,exports){ -const { utils } = require('../../../utils'); -const { GLTextureFloat } = require('./float'); - -class GLTextureFloat3D extends GLTextureFloat { - constructor(settings) { - super(settings); - this.type = 'ArrayTexture(1)'; - } - toArray() { - return utils.erect3DFloat(this.renderValues(), this.output[0], this.output[1], this.output[2]); - } -} - -module.exports = { - GLTextureFloat3D -}; -},{"../../../utils":114,"./float":25}],25:[function(require,module,exports){ -const { utils } = require('../../../utils'); -const { GLTexture } = require('./index'); - -class GLTextureFloat extends GLTexture { - get textureType() { - return this.context.FLOAT; - } - constructor(settings) { - super(settings); - this.type = 'ArrayTexture(1)'; - } - renderRawOutput() { - const gl = this.context; - const size = this.size; - gl.bindFramebuffer(gl.FRAMEBUFFER, this.framebuffer()); - gl.framebufferTexture2D( - gl.FRAMEBUFFER, - gl.COLOR_ATTACHMENT0, - gl.TEXTURE_2D, - this.texture, - 0 - ); - const result = new Float32Array(size[0] * size[1] * 4); - gl.readPixels(0, 0, size[0], size[1], gl.RGBA, gl.FLOAT, result); - return result; - } - renderValues() { - if (this._deleted) return null; - return this.renderRawOutput(); - } - toArray() { - return utils.erectFloat(this.renderValues(), this.output[0]); - } -} - -module.exports = { - GLTextureFloat -}; -},{"../../../utils":114,"./index":27}],26:[function(require,module,exports){ -const { GLTextureUnsigned } = require('./unsigned'); - -class GLTextureGraphical extends GLTextureUnsigned { - constructor(settings) { - super(settings); - this.type = 'ArrayTexture(4)'; - } - toArray() { - return this.renderValues(); - } -} - -module.exports = { - GLTextureGraphical -}; -},{"./unsigned":33}],27:[function(require,module,exports){ -const { Texture } = require('../../../texture'); - -class GLTexture extends Texture { - get textureType() { - throw new Error(`"textureType" not implemented on ${ this.name }`); - } - - clone() { - return new this.constructor(this); - } - - beforeMutate() { - if (this.texture._refs > 1) { - this.newTexture(); - return true; - } - return false; - } - - cloneTexture() { - this.texture._refs--; - const { context: gl, size, texture, kernel } = this; - if (kernel.debug) { - console.warn('cloning internal texture'); - } - gl.bindFramebuffer(gl.FRAMEBUFFER, this.framebuffer()); - selectTexture(gl, texture); - gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, texture, 0); - const target = gl.createTexture(); - selectTexture(gl, target); - gl.texImage2D(gl.TEXTURE_2D, 0, this.internalFormat, size[0], size[1], 0, this.textureFormat, this.textureType, null); - gl.copyTexSubImage2D(gl.TEXTURE_2D, 0, 0, 0, 0, 0, size[0], size[1]); - target._refs = 1; - this.texture = target; - } - - newTexture() { - this.texture._refs--; - const gl = this.context; - const size = this.size; - const kernel = this.kernel; - if (kernel.debug) { - console.warn('new internal texture'); - } - const target = gl.createTexture(); - selectTexture(gl, target); - gl.texImage2D(gl.TEXTURE_2D, 0, this.internalFormat, size[0], size[1], 0, this.textureFormat, this.textureType, null); - target._refs = 1; - this.texture = target; - } - - clear() { - if (this.texture._refs) { - this.texture._refs--; - const gl = this.context; - const target = this.texture = gl.createTexture(); - selectTexture(gl, target); - const size = this.size; - target._refs = 1; - gl.texImage2D(gl.TEXTURE_2D, 0, this.internalFormat, size[0], size[1], 0, this.textureFormat, this.textureType, null); - } - const { context: gl, texture } = this; - gl.bindFramebuffer(gl.FRAMEBUFFER, this.framebuffer()); - gl.bindTexture(gl.TEXTURE_2D, texture); - selectTexture(gl, texture); - gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, texture, 0); - gl.clearColor(0, 0, 0, 0); - gl.clear(gl.COLOR_BUFFER_BIT | gl.DEPTH_BUFFER_BIT); - } - - delete() { - if (this._deleted) return; - this._deleted = true; - if (this.texture._refs) { - this.texture._refs--; - if (this.texture._refs) return; - } - this.context.deleteTexture(this.texture); - } - - framebuffer() { - if (!this._framebuffer) { - this._framebuffer = this.kernel.getRawValueFramebuffer(this.size[0], this.size[1]); - } - return this._framebuffer; - } -} - -function selectTexture(gl, texture) { - gl.activeTexture(gl.TEXTURE15); - gl.bindTexture(gl.TEXTURE_2D, texture); - gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE); - gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE); - gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.NEAREST); - gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.NEAREST); -} - -module.exports = { GLTexture }; -},{"../../../texture":113}],28:[function(require,module,exports){ -const { utils } = require('../../../utils'); -const { GLTextureFloat } = require('./float'); - -class GLTextureMemoryOptimized2D extends GLTextureFloat { - constructor(settings) { - super(settings); - this.type = 'MemoryOptimizedNumberTexture'; - } - toArray() { - return utils.erectMemoryOptimized2DFloat(this.renderValues(), this.output[0], this.output[1]); - } -} - -module.exports = { - GLTextureMemoryOptimized2D -}; -},{"../../../utils":114,"./float":25}],29:[function(require,module,exports){ -const { utils } = require('../../../utils'); -const { GLTextureFloat } = require('./float'); - -class GLTextureMemoryOptimized3D extends GLTextureFloat { - constructor(settings) { - super(settings); - this.type = 'MemoryOptimizedNumberTexture'; - } - toArray() { - return utils.erectMemoryOptimized3DFloat(this.renderValues(), this.output[0], this.output[1], this.output[2]); - } -} - -module.exports = { - GLTextureMemoryOptimized3D -}; -},{"../../../utils":114,"./float":25}],30:[function(require,module,exports){ -const { utils } = require('../../../utils'); -const { GLTextureFloat } = require('./float'); - -class GLTextureMemoryOptimized extends GLTextureFloat { - constructor(settings) { - super(settings); - this.type = 'MemoryOptimizedNumberTexture'; - } - toArray() { - return utils.erectMemoryOptimizedFloat(this.renderValues(), this.output[0]); - } -} - -module.exports = { - GLTextureMemoryOptimized -}; -},{"../../../utils":114,"./float":25}],31:[function(require,module,exports){ -const { utils } = require('../../../utils'); -const { GLTextureUnsigned } = require('./unsigned'); - -class GLTextureUnsigned2D extends GLTextureUnsigned { - constructor(settings) { - super(settings); - this.type = 'NumberTexture'; - } - toArray() { - return utils.erect2DPackedFloat(this.renderValues(), this.output[0], this.output[1]); - } -} - -module.exports = { - GLTextureUnsigned2D -}; -},{"../../../utils":114,"./unsigned":33}],32:[function(require,module,exports){ -const { utils } = require('../../../utils'); -const { GLTextureUnsigned } = require('./unsigned'); - -class GLTextureUnsigned3D extends GLTextureUnsigned { - constructor(settings) { - super(settings); - this.type = 'NumberTexture'; - } - toArray() { - return utils.erect3DPackedFloat(this.renderValues(), this.output[0], this.output[1], this.output[2]); - } -} - -module.exports = { - GLTextureUnsigned3D -}; -},{"../../../utils":114,"./unsigned":33}],33:[function(require,module,exports){ -const { utils } = require('../../../utils'); -const { GLTexture } = require('./index'); - -class GLTextureUnsigned extends GLTexture { - get textureType() { - return this.context.UNSIGNED_BYTE; - } - constructor(settings) { - super(settings); - this.type = 'NumberTexture'; - } - renderRawOutput() { - const { context: gl } = this; - gl.bindFramebuffer(gl.FRAMEBUFFER, this.framebuffer()); - gl.framebufferTexture2D( - gl.FRAMEBUFFER, - gl.COLOR_ATTACHMENT0, - gl.TEXTURE_2D, - this.texture, - 0 - ); - const result = new Uint8Array(this.size[0] * this.size[1] * 4); - gl.readPixels(0, 0, this.size[0], this.size[1], gl.RGBA, gl.UNSIGNED_BYTE, result); - return result; - } - renderValues() { - if (this._deleted) return null; - return new Float32Array(this.renderRawOutput().buffer); - } - toArray() { - return utils.erectPackedFloat(this.renderValues(), this.output[0]); - } -} - -module.exports = { - GLTextureUnsigned -}; -},{"../../../utils":114,"./index":27}],34:[function(require,module,exports){ -const getContext = require('gl'); -const { WebGLKernel } = require('../web-gl/kernel'); -const { glKernelString } = require('../gl/kernel-string'); - -let isSupported = null; -let testCanvas = null; -let testContext = null; -let testExtensions = null; -let features = null; - -class HeadlessGLKernel extends WebGLKernel { - static get isSupported() { - if (isSupported !== null) return isSupported; - this.setupFeatureChecks(); - isSupported = testContext !== null; - return isSupported; - } - - static setupFeatureChecks() { - testCanvas = null; - testExtensions = null; - if (typeof getContext !== 'function') return; - try { - testContext = getContext(2, 2, { - preserveDrawingBuffer: true - }); - if (!testContext || !testContext.getExtension) return; - testExtensions = { - STACKGL_resize_drawingbuffer: testContext.getExtension('STACKGL_resize_drawingbuffer'), - STACKGL_destroy_context: testContext.getExtension('STACKGL_destroy_context'), - OES_texture_float: testContext.getExtension('OES_texture_float'), - OES_texture_float_linear: testContext.getExtension('OES_texture_float_linear'), - OES_element_index_uint: testContext.getExtension('OES_element_index_uint'), - WEBGL_draw_buffers: testContext.getExtension('WEBGL_draw_buffers'), - WEBGL_color_buffer_float: testContext.getExtension('WEBGL_color_buffer_float'), - }; - features = this.getFeatures(); - } catch (e) { - console.warn(e); - } - } - - static isContextMatch(context) { - try { - return context.getParameter(context.RENDERER) === 'ANGLE'; - } catch (e) { - return false; - } - } - - static getIsTextureFloat() { - return Boolean(testExtensions.OES_texture_float); - } - - static getIsDrawBuffers() { - return Boolean(testExtensions.WEBGL_draw_buffers); - } - - static getChannelCount() { - return testExtensions.WEBGL_draw_buffers ? - testContext.getParameter(testExtensions.WEBGL_draw_buffers.MAX_DRAW_BUFFERS_WEBGL) : - 1; - } - - static getMaxTextureSize() { - return testContext.getParameter(testContext.MAX_TEXTURE_SIZE); - } - - static get testCanvas() { - return testCanvas; - } - - static get testContext() { - return testContext; - } - - static get features() { - return features; - } - - initCanvas() { - return {}; - } - - initContext() { - return getContext(2, 2, { - preserveDrawingBuffer: true - }); - } - - initExtensions() { - this.extensions = { - STACKGL_resize_drawingbuffer: this.context.getExtension('STACKGL_resize_drawingbuffer'), - STACKGL_destroy_context: this.context.getExtension('STACKGL_destroy_context'), - OES_texture_float: this.context.getExtension('OES_texture_float'), - OES_texture_float_linear: this.context.getExtension('OES_texture_float_linear'), - OES_element_index_uint: this.context.getExtension('OES_element_index_uint'), - WEBGL_draw_buffers: this.context.getExtension('WEBGL_draw_buffers'), - }; - } - - build() { - super.build.apply(this, arguments); - if (!this.fallbackRequested) { - this.extensions.STACKGL_resize_drawingbuffer.resize(this.maxTexSize[0], this.maxTexSize[1]); - } - } - - destroyExtensions() { - this.extensions.STACKGL_resize_drawingbuffer = null; - this.extensions.STACKGL_destroy_context = null; - this.extensions.OES_texture_float = null; - this.extensions.OES_texture_float_linear = null; - this.extensions.OES_element_index_uint = null; - this.extensions.WEBGL_draw_buffers = null; - } - - static destroyContext(context) { - const extension = context.getExtension('STACKGL_destroy_context'); - if (extension && extension.destroy) { - extension.destroy(); - } - } - - toString() { - const setupContextString = `const gl = context || require('gl')(1, 1);\n`; - const destroyContextString = ` if (!context) { gl.getExtension('STACKGL_destroy_context').destroy(); }\n`; - return glKernelString(this.constructor, arguments, this, setupContextString, destroyContextString); - } - - setOutput(output) { - super.setOutput(output); - if (this.graphical && this.extensions.STACKGL_resize_drawingbuffer) { - this.extensions.STACKGL_resize_drawingbuffer.resize(this.maxTexSize[0], this.maxTexSize[1]); - } - return this; - } -} - -module.exports = { - HeadlessGLKernel -}; -},{"../gl/kernel-string":12,"../web-gl/kernel":70,"gl":2}],35:[function(require,module,exports){ -class KernelValue { - constructor(value, settings) { - const { - name, - kernel, - context, - checkContext, - onRequestContextHandle, - onUpdateValueMismatch, - origin, - strictIntegers, - type, - tactic, - } = settings; - if (!name) { - throw new Error('name not set'); - } - if (!type) { - throw new Error('type not set'); - } - if (!origin) { - throw new Error('origin not set'); - } - if (origin !== 'user' && origin !== 'constants') { - throw new Error(`origin must be "user" or "constants" value is "${ origin }"`); - } - if (!onRequestContextHandle) { - throw new Error('onRequestContextHandle is not set'); - } - this.name = name; - this.origin = origin; - this.tactic = tactic; - this.varName = origin === 'constants' ? `constants.${name}` : name; - this.kernel = kernel; - this.strictIntegers = strictIntegers; - this.type = value.type || type; - this.size = value.size || null; - this.index = null; - this.context = context; - this.checkContext = checkContext !== null && checkContext !== undefined ? checkContext : true; - this.contextHandle = null; - this.onRequestContextHandle = onRequestContextHandle; - this.onUpdateValueMismatch = onUpdateValueMismatch; - this.forceUploadEachRun = null; - } - - get id() { - return `${this.origin}_${name}`; - } - - getSource() { - throw new Error(`"getSource" not defined on ${ this.constructor.name }`); - } - - updateValue(value) { - throw new Error(`"updateValue" not defined on ${ this.constructor.name }`); - } -} - -module.exports = { - KernelValue -}; -},{}],36:[function(require,module,exports){ -const { utils } = require('../utils'); -const { Input } = require('../input'); - -class Kernel { - static get isSupported() { - throw new Error(`"isSupported" not implemented on ${ this.name }`); - } - - static isContextMatch(context) { - throw new Error(`"isContextMatch" not implemented on ${ this.name }`); - } - - static getFeatures() { - throw new Error(`"getFeatures" not implemented on ${ this.name }`); - } - - static destroyContext(context) { - throw new Error(`"destroyContext" called on ${ this.name }`); - } - - static nativeFunctionArguments() { - throw new Error(`"nativeFunctionArguments" called on ${ this.name }`); - } - - static nativeFunctionReturnType() { - throw new Error(`"nativeFunctionReturnType" called on ${ this.name }`); - } - - static combineKernels() { - throw new Error(`"combineKernels" called on ${ this.name }`); - } - - constructor(source, settings) { - if (typeof source !== 'object') { - if (typeof source !== 'string') { - throw new Error('source not a string'); - } - if (!utils.isFunctionString(source)) { - throw new Error('source not a function string'); - } - } - this.useLegacyEncoder = false; - this.fallbackRequested = false; - this.onRequestFallback = null; - - this.argumentNames = typeof source === 'string' ? utils.getArgumentNamesFromString(source) : null; - this.argumentTypes = null; - this.argumentSizes = null; - this.argumentBitRatios = null; - this.kernelArguments = null; - this.kernelConstants = null; - this.forceUploadKernelConstants = null; - - - this.source = source; - - this.output = null; - - this.debug = false; - - this.graphical = false; - - this.loopMaxIterations = 0; - - this.constants = null; - - this.constantTypes = null; - - this.constantBitRatios = null; - - this.dynamicArguments = false; - - this.dynamicOutput = false; - - this.canvas = null; - - this.context = null; - - this.checkContext = null; - - this.gpu = null; - - this.functions = null; - - this.nativeFunctions = null; - - this.injectedNative = null; - - this.subKernels = null; - - this.validate = true; - - this.immutable = false; - - this.pipeline = false; - - this.precision = null; - - this.tactic = null; - - this.plugins = null; - - this.returnType = null; - this.leadingReturnStatement = null; - this.followingReturnStatement = null; - this.optimizeFloatMemory = null; - this.strictIntegers = false; - this.fixIntegerDivisionAccuracy = null; - this.built = false; - this.signature = null; - } - - mergeSettings(settings) { - for (let p in settings) { - if (!settings.hasOwnProperty(p) || !this.hasOwnProperty(p)) continue; - switch (p) { - case 'output': - if (!Array.isArray(settings.output)) { - this.setOutput(settings.output); - continue; - } - break; - case 'functions': - this.functions = []; - for (let i = 0; i < settings.functions.length; i++) { - this.addFunction(settings.functions[i]); - } - continue; - case 'graphical': - if (settings[p] && !settings.hasOwnProperty('precision')) { - this.precision = 'unsigned'; - } - this[p] = settings[p]; - continue; - case 'nativeFunctions': - if (!settings.nativeFunctions) continue; - this.nativeFunctions = []; - for (let i = 0; i < settings.nativeFunctions.length; i++) { - const s = settings.nativeFunctions[i]; - const { name, source } = s; - this.addNativeFunction(name, source, s); - } - continue; - } - this[p] = settings[p]; - } - - if (!this.canvas) this.canvas = this.initCanvas(); - if (!this.context) this.context = this.initContext(); - if (!this.plugins) this.plugins = this.initPlugins(settings); - } - build() { - throw new Error(`"build" not defined on ${ this.constructor.name }`); - } - - run() { - throw new Error(`"run" not defined on ${ this.constructor.name }`) - } - - initCanvas() { - throw new Error(`"initCanvas" not defined on ${ this.constructor.name }`); - } - - initContext() { - throw new Error(`"initContext" not defined on ${ this.constructor.name }`); - } - - initPlugins(settings) { - throw new Error(`"initPlugins" not defined on ${ this.constructor.name }`); - } - - addFunction(source, settings = {}) { - if (source.name && source.source && source.argumentTypes && 'returnType' in source) { - this.functions.push(source); - } else if ('settings' in source && 'source' in source) { - this.functions.push(this.functionToIGPUFunction(source.source, source.settings)); - } else if (typeof source === 'string' || typeof source === 'function') { - this.functions.push(this.functionToIGPUFunction(source, settings)); - } else { - throw new Error(`function not properly defined`); - } - return this; - } - - addNativeFunction(name, source, settings = {}) { - const { argumentTypes, argumentNames } = settings.argumentTypes ? - splitArgumentTypes(settings.argumentTypes) : - this.constructor.nativeFunctionArguments(source) || {}; - this.nativeFunctions.push({ - name, - source, - settings, - argumentTypes, - argumentNames, - returnType: settings.returnType || this.constructor.nativeFunctionReturnType(source) - }); - return this; - } - - setupArguments(args) { - this.kernelArguments = []; - if (!this.argumentTypes) { - if (!this.argumentTypes) { - this.argumentTypes = []; - for (let i = 0; i < args.length; i++) { - const argType = utils.getVariableType(args[i], this.strictIntegers); - const type = argType === 'Integer' ? 'Number' : argType; - this.argumentTypes.push(type); - this.kernelArguments.push({ - type - }); - } - } - } else { - for (let i = 0; i < this.argumentTypes.length; i++) { - this.kernelArguments.push({ - type: this.argumentTypes[i] - }); - } - } - - this.argumentSizes = new Array(args.length); - this.argumentBitRatios = new Int32Array(args.length); - - for (let i = 0; i < args.length; i++) { - const arg = args[i]; - this.argumentSizes[i] = arg.constructor === Input ? arg.size : null; - this.argumentBitRatios[i] = this.getBitRatio(arg); - } - - if (this.argumentNames.length !== args.length) { - throw new Error(`arguments are miss-aligned`); - } - } - - setupConstants() { - this.kernelConstants = []; - let needsConstantTypes = this.constantTypes === null; - if (needsConstantTypes) { - this.constantTypes = {}; - } - this.constantBitRatios = {}; - if (this.constants) { - for (let name in this.constants) { - if (needsConstantTypes) { - const type = utils.getVariableType(this.constants[name], this.strictIntegers); - this.constantTypes[name] = type; - this.kernelConstants.push({ - name, - type - }); - } else { - this.kernelConstants.push({ - name, - type: this.constantTypes[name] - }); - } - this.constantBitRatios[name] = this.getBitRatio(this.constants[name]); - } - } - } - - setOptimizeFloatMemory(flag) { - this.optimizeFloatMemory = flag; - return this; - } - - toKernelOutput(output) { - if (output.hasOwnProperty('x')) { - if (output.hasOwnProperty('y')) { - if (output.hasOwnProperty('z')) { - return [output.x, output.y, output.z]; - } else { - return [output.x, output.y]; - } - } else { - return [output.x]; - } - } else { - return output; - } - } - - setOutput(output) { - this.output = this.toKernelOutput(output); - return this; - } - - setDebug(flag) { - this.debug = flag; - return this; - } - - setGraphical(flag) { - this.graphical = flag; - this.precision = 'unsigned'; - return this; - } - - setLoopMaxIterations(max) { - this.loopMaxIterations = max; - return this; - } - - setConstants(constants) { - this.constants = constants; - return this; - } - - setConstantTypes(constantTypes) { - this.constantTypes = constantTypes; - return this; - } - - setFunctions(functions) { - for (let i = 0; i < functions.length; i++) { - this.addFunction(functions[i]); - } - return this; - } - - setNativeFunctions(nativeFunctions) { - for (let i = 0; i < nativeFunctions.length; i++) { - const settings = nativeFunctions[i]; - const { name, source } = settings; - this.addNativeFunction(name, source, settings); - } - return this; - } - - setInjectedNative(injectedNative) { - this.injectedNative = injectedNative; - return this; - } - - setPipeline(flag) { - this.pipeline = flag; - return this; - } - - setPrecision(flag) { - this.precision = flag; - return this; - } - - setDimensions(flag) { - utils.warnDeprecated('method', 'setDimensions', 'setOutput'); - this.output = flag; - return this; - } - - setOutputToTexture(flag) { - utils.warnDeprecated('method', 'setOutputToTexture', 'setPipeline'); - this.pipeline = flag; - return this; - } - - setImmutable(flag) { - this.immutable = flag; - return this; - } - - setCanvas(canvas) { - this.canvas = canvas; - return this; - } - - setStrictIntegers(flag) { - this.strictIntegers = flag; - return this; - } - - setDynamicOutput(flag) { - this.dynamicOutput = flag; - return this; - } - - setHardcodeConstants(flag) { - utils.warnDeprecated('method', 'setHardcodeConstants'); - this.setDynamicOutput(flag); - this.setDynamicArguments(flag); - return this; - } - - setDynamicArguments(flag) { - this.dynamicArguments = flag; - return this; - } - - setUseLegacyEncoder(flag) { - this.useLegacyEncoder = flag; - return this; - } - - setWarnVarUsage(flag) { - utils.warnDeprecated('method', 'setWarnVarUsage'); - return this; - } - - getCanvas() { - utils.warnDeprecated('method', 'getCanvas'); - return this.canvas; - } - - getWebGl() { - utils.warnDeprecated('method', 'getWebGl'); - return this.context; - } - - setContext(context) { - this.context = context; - return this; - } - - setArgumentTypes(argumentTypes) { - if (Array.isArray(argumentTypes)) { - this.argumentTypes = argumentTypes; - } else { - this.argumentTypes = []; - for (const p in argumentTypes) { - if (!argumentTypes.hasOwnProperty(p)) continue; - const argumentIndex = this.argumentNames.indexOf(p); - if (argumentIndex === -1) throw new Error(`unable to find argument ${ p }`); - this.argumentTypes[argumentIndex] = argumentTypes[p]; - } - } - return this; - } - - setTactic(tactic) { - this.tactic = tactic; - return this; - } - - requestFallback(args) { - if (!this.onRequestFallback) { - throw new Error(`"onRequestFallback" not defined on ${ this.constructor.name }`); - } - this.fallbackRequested = true; - return this.onRequestFallback(args); - } - - validateSettings() { - throw new Error(`"validateSettings" not defined on ${ this.constructor.name }`); - } - - addSubKernel(subKernel) { - if (this.subKernels === null) { - this.subKernels = []; - } - if (!subKernel.source) throw new Error('subKernel missing "source" property'); - if (!subKernel.property && isNaN(subKernel.property)) throw new Error('subKernel missing "property" property'); - if (!subKernel.name) throw new Error('subKernel missing "name" property'); - this.subKernels.push(subKernel); - return this; - } - - destroy(removeCanvasReferences) { - throw new Error(`"destroy" called on ${ this.constructor.name }`); - } - - getBitRatio(value) { - if (this.precision === 'single') { - return 4; - } else if (Array.isArray(value[0])) { - return this.getBitRatio(value[0]); - } else if (value.constructor === Input) { - return this.getBitRatio(value.value); - } - switch (value.constructor) { - case Uint8ClampedArray: - case Uint8Array: - case Int8Array: - return 1; - case Uint16Array: - case Int16Array: - return 2; - case Float32Array: - case Int32Array: - default: - return 4; - } - } - - getPixels(flip) { - throw new Error(`"getPixels" called on ${ this.constructor.name }`); - } - - checkOutput() { - if (!this.output || !utils.isArray(this.output)) throw new Error('kernel.output not an array'); - if (this.output.length < 1) throw new Error('kernel.output is empty, needs at least 1 value'); - for (let i = 0; i < this.output.length; i++) { - if (isNaN(this.output[i]) || this.output[i] < 1) { - throw new Error(`${ this.constructor.name }.output[${ i }] incorrectly defined as \`${ this.output[i] }\`, needs to be numeric, and greater than 0`); - } - } - } - - prependString(value) { - throw new Error(`"prependString" called on ${ this.constructor.name }`); - } - - hasPrependString(value) { - throw new Error(`"hasPrependString" called on ${ this.constructor.name }`); - } - - toJSON() { - return { - settings: { - output: this.output, - pipeline: this.pipeline, - argumentNames: this.argumentNames, - argumentsTypes: this.argumentTypes, - constants: this.constants, - pluginNames: this.plugins ? this.plugins.map(plugin => plugin.name) : null, - returnType: this.returnType, - } - }; - } - - buildSignature(args) { - const Constructor = this.constructor; - this.signature = Constructor.getSignature(this, Constructor.getArgumentTypes(this, args)); - } - - static getArgumentTypes(kernel, args) { - const argumentTypes = new Array(args.length); - for (let i = 0; i < args.length; i++) { - const arg = args[i]; - const type = kernel.argumentTypes[i]; - if (arg.type) { - argumentTypes[i] = arg.type; - } else { - switch (type) { - case 'Number': - case 'Integer': - case 'Float': - case 'ArrayTexture(1)': - argumentTypes[i] = utils.getVariableType(arg); - break; - default: - argumentTypes[i] = type; - } - } - } - return argumentTypes; - } - - static getSignature(kernel, argumentTypes) { - throw new Error(`"getSignature" not implemented on ${ this.name }`); - } - - functionToIGPUFunction(source, settings = {}) { - if (typeof source !== 'string' && typeof source !== 'function') throw new Error('source not a string or function'); - const sourceString = typeof source === 'string' ? source : source.toString(); - let argumentTypes = []; - - if (Array.isArray(settings.argumentTypes)) { - argumentTypes = settings.argumentTypes; - } else if (typeof settings.argumentTypes === 'object') { - argumentTypes = utils.getArgumentNamesFromString(sourceString) - .map(name => settings.argumentTypes[name]) || []; - } else { - argumentTypes = settings.argumentTypes || []; - } - - return { - name: utils.getFunctionNameFromString(sourceString) || null, - source: sourceString, - argumentTypes, - returnType: settings.returnType || null, - }; - } - - onActivate(previousKernel) {} -} - -function splitArgumentTypes(argumentTypesObject) { - const argumentNames = Object.keys(argumentTypesObject); - const argumentTypes = []; - for (let i = 0; i < argumentNames.length; i++) { - const argumentName = argumentNames[i]; - argumentTypes.push(argumentTypesObject[argumentName]); - } - return { argumentTypes, argumentNames }; -} - -module.exports = { - Kernel -}; -},{"../input":110,"../utils":114}],37:[function(require,module,exports){ -const fragmentShader = `__HEADER__; -__FLOAT_TACTIC_DECLARATION__; -__INT_TACTIC_DECLARATION__; -__SAMPLER_2D_TACTIC_DECLARATION__; - -const int LOOP_MAX = __LOOP_MAX__; - -__PLUGINS__; -__CONSTANTS__; - -varying vec2 vTexCoord; - -float acosh(float x) { - return log(x + sqrt(x * x - 1.0)); -} - -float sinh(float x) { - return (pow(${Math.E}, x) - pow(${Math.E}, -x)) / 2.0; -} - -float asinh(float x) { - return log(x + sqrt(x * x + 1.0)); -} - -float atan2(float v1, float v2) { - if (v1 == 0.0 || v2 == 0.0) return 0.0; - return atan(v1 / v2); -} - -float atanh(float x) { - x = (x + 1.0) / (x - 1.0); - if (x < 0.0) { - return 0.5 * log(-x); - } - return 0.5 * log(x); -} - -float cbrt(float x) { - if (x >= 0.0) { - return pow(x, 1.0 / 3.0); - } else { - return -pow(x, 1.0 / 3.0); - } -} - -float cosh(float x) { - return (pow(${Math.E}, x) + pow(${Math.E}, -x)) / 2.0; -} - -float expm1(float x) { - return pow(${Math.E}, x) - 1.0; -} - -float fround(highp float x) { - return x; -} - -float imul(float v1, float v2) { - return float(int(v1) * int(v2)); -} - -float log10(float x) { - return log2(x) * (1.0 / log2(10.0)); -} - -float log1p(float x) { - return log(1.0 + x); -} - -float _pow(float v1, float v2) { - if (v2 == 0.0) return 1.0; - return pow(v1, v2); -} - -float tanh(float x) { - float e = exp(2.0 * x); - return (e - 1.0) / (e + 1.0); -} - -float trunc(float x) { - if (x >= 0.0) { - return floor(x); - } else { - return ceil(x); - } -} - -vec4 _round(vec4 x) { - return floor(x + 0.5); -} - -float _round(float x) { - return floor(x + 0.5); -} - -const int BIT_COUNT = 32; -int modi(int x, int y) { - return x - y * (x / y); -} - -int bitwiseOr(int a, int b) { - int result = 0; - int n = 1; - - for (int i = 0; i < BIT_COUNT; i++) { - if ((modi(a, 2) == 1) || (modi(b, 2) == 1)) { - result += n; - } - a = a / 2; - b = b / 2; - n = n * 2; - if(!(a > 0 || b > 0)) { - break; - } - } - return result; -} -int bitwiseXOR(int a, int b) { - int result = 0; - int n = 1; - - for (int i = 0; i < BIT_COUNT; i++) { - if ((modi(a, 2) == 1) != (modi(b, 2) == 1)) { - result += n; - } - a = a / 2; - b = b / 2; - n = n * 2; - if(!(a > 0 || b > 0)) { - break; - } - } - return result; -} -int bitwiseAnd(int a, int b) { - int result = 0; - int n = 1; - for (int i = 0; i < BIT_COUNT; i++) { - if ((modi(a, 2) == 1) && (modi(b, 2) == 1)) { - result += n; - } - a = a / 2; - b = b / 2; - n = n * 2; - if(!(a > 0 && b > 0)) { - break; - } - } - return result; -} -int bitwiseNot(int a) { - int result = 0; - int n = 1; - - for (int i = 0; i < BIT_COUNT; i++) { - if (modi(a, 2) == 0) { - result += n; - } - a = a / 2; - n = n * 2; - } - return result; -} -int bitwiseZeroFillLeftShift(int n, int shift) { - int maxBytes = BIT_COUNT; - for (int i = 0; i < BIT_COUNT; i++) { - if (maxBytes >= n) { - break; - } - maxBytes *= 2; - } - for (int i = 0; i < BIT_COUNT; i++) { - if (i >= shift) { - break; - } - n *= 2; - } - - int result = 0; - int byteVal = 1; - for (int i = 0; i < BIT_COUNT; i++) { - if (i >= maxBytes) break; - if (modi(n, 2) > 0) { result += byteVal; } - n = int(n / 2); - byteVal *= 2; - } - return result; -} - -int bitwiseSignedRightShift(int num, int shifts) { - return int(floor(float(num) / pow(2.0, float(shifts)))); -} - -int bitwiseZeroFillRightShift(int n, int shift) { - int maxBytes = BIT_COUNT; - for (int i = 0; i < BIT_COUNT; i++) { - if (maxBytes >= n) { - break; - } - maxBytes *= 2; - } - for (int i = 0; i < BIT_COUNT; i++) { - if (i >= shift) { - break; - } - n /= 2; - } - int result = 0; - int byteVal = 1; - for (int i = 0; i < BIT_COUNT; i++) { - if (i >= maxBytes) break; - if (modi(n, 2) > 0) { result += byteVal; } - n = int(n / 2); - byteVal *= 2; - } - return result; -} - -vec2 integerMod(vec2 x, float y) { - vec2 res = floor(mod(x, y)); - return res * step(1.0 - floor(y), -res); -} - -vec3 integerMod(vec3 x, float y) { - vec3 res = floor(mod(x, y)); - return res * step(1.0 - floor(y), -res); -} - -vec4 integerMod(vec4 x, vec4 y) { - vec4 res = floor(mod(x, y)); - return res * step(1.0 - floor(y), -res); -} - -float integerMod(float x, float y) { - float res = floor(mod(x, y)); - return res * (res > floor(y) - 1.0 ? 0.0 : 1.0); -} - -int integerMod(int x, int y) { - return x - (y * int(x / y)); -} - -__DIVIDE_WITH_INTEGER_CHECK__; - -// Here be dragons! -// DO NOT OPTIMIZE THIS CODE -// YOU WILL BREAK SOMETHING ON SOMEBODY\'S MACHINE -// LEAVE IT AS IT IS, LEST YOU WASTE YOUR OWN TIME -const vec2 MAGIC_VEC = vec2(1.0, -256.0); -const vec4 SCALE_FACTOR = vec4(1.0, 256.0, 65536.0, 0.0); -const vec4 SCALE_FACTOR_INV = vec4(1.0, 0.00390625, 0.0000152587890625, 0.0); // 1, 1/256, 1/65536 -float decode32(vec4 texel) { - __DECODE32_ENDIANNESS__; - texel *= 255.0; - vec2 gte128; - gte128.x = texel.b >= 128.0 ? 1.0 : 0.0; - gte128.y = texel.a >= 128.0 ? 1.0 : 0.0; - float exponent = 2.0 * texel.a - 127.0 + dot(gte128, MAGIC_VEC); - float res = exp2(_round(exponent)); - texel.b = texel.b - 128.0 * gte128.x; - res = dot(texel, SCALE_FACTOR) * exp2(_round(exponent-23.0)) + res; - res *= gte128.y * -2.0 + 1.0; - return res; -} - -float decode16(vec4 texel, int index) { - int channel = integerMod(index, 2); - if (channel == 0) return texel.r * 255.0 + texel.g * 65280.0; - if (channel == 1) return texel.b * 255.0 + texel.a * 65280.0; - return 0.0; -} - -float decode8(vec4 texel, int index) { - int channel = integerMod(index, 4); - if (channel == 0) return texel.r * 255.0; - if (channel == 1) return texel.g * 255.0; - if (channel == 2) return texel.b * 255.0; - if (channel == 3) return texel.a * 255.0; - return 0.0; -} - -vec4 legacyEncode32(float f) { - float F = abs(f); - float sign = f < 0.0 ? 1.0 : 0.0; - float exponent = floor(log2(F)); - float mantissa = (exp2(-exponent) * F); - // exponent += floor(log2(mantissa)); - vec4 texel = vec4(F * exp2(23.0-exponent)) * SCALE_FACTOR_INV; - texel.rg = integerMod(texel.rg, 256.0); - texel.b = integerMod(texel.b, 128.0); - texel.a = exponent*0.5 + 63.5; - texel.ba += vec2(integerMod(exponent+127.0, 2.0), sign) * 128.0; - texel = floor(texel); - texel *= 0.003921569; // 1/255 - __ENCODE32_ENDIANNESS__; - return texel; -} - -// https://github.com/gpujs/gpu.js/wiki/Encoder-details -vec4 encode32(float value) { - if (value == 0.0) return vec4(0, 0, 0, 0); - - float exponent; - float mantissa; - vec4 result; - float sgn; - - sgn = step(0.0, -value); - value = abs(value); - - exponent = floor(log2(value)); - - mantissa = value*pow(2.0, -exponent)-1.0; - exponent = exponent+127.0; - result = vec4(0,0,0,0); - - result.a = floor(exponent/2.0); - exponent = exponent - result.a*2.0; - result.a = result.a + 128.0*sgn; - - result.b = floor(mantissa * 128.0); - mantissa = mantissa - result.b / 128.0; - result.b = result.b + exponent*128.0; - - result.g = floor(mantissa*32768.0); - mantissa = mantissa - result.g/32768.0; - - result.r = floor(mantissa*8388608.0); - return result/255.0; -} -// Dragons end here - -int index; -ivec3 threadId; - -ivec3 indexTo3D(int idx, ivec3 texDim) { - int z = int(idx / (texDim.x * texDim.y)); - idx -= z * int(texDim.x * texDim.y); - int y = int(idx / texDim.x); - int x = int(integerMod(idx, texDim.x)); - return ivec3(x, y, z); -} - -float get32(sampler2D tex, ivec2 texSize, ivec3 texDim, int z, int y, int x) { - int index = x + texDim.x * (y + texDim.y * z); - int w = texSize.x; - vec2 st = vec2(float(integerMod(index, w)), float(index / w)) + 0.5; - vec4 texel = texture2D(tex, st / vec2(texSize)); - return decode32(texel); -} - -float get16(sampler2D tex, ivec2 texSize, ivec3 texDim, int z, int y, int x) { - int index = x + texDim.x * (y + texDim.y * z); - int w = texSize.x * 2; - vec2 st = vec2(float(integerMod(index, w)), float(index / w)) + 0.5; - vec4 texel = texture2D(tex, st / vec2(texSize.x * 2, texSize.y)); - return decode16(texel, index); -} - -float get8(sampler2D tex, ivec2 texSize, ivec3 texDim, int z, int y, int x) { - int index = x + texDim.x * (y + texDim.y * z); - int w = texSize.x * 4; - vec2 st = vec2(float(integerMod(index, w)), float(index / w)) + 0.5; - vec4 texel = texture2D(tex, st / vec2(texSize.x * 4, texSize.y)); - return decode8(texel, index); -} - -float getMemoryOptimized32(sampler2D tex, ivec2 texSize, ivec3 texDim, int z, int y, int x) { - int index = x + texDim.x * (y + texDim.y * z); - int channel = integerMod(index, 4); - index = index / 4; - int w = texSize.x; - vec2 st = vec2(float(integerMod(index, w)), float(index / w)) + 0.5; - vec4 texel = texture2D(tex, st / vec2(texSize)); - if (channel == 0) return texel.r; - if (channel == 1) return texel.g; - if (channel == 2) return texel.b; - if (channel == 3) return texel.a; - return 0.0; -} - -vec4 getImage2D(sampler2D tex, ivec2 texSize, ivec3 texDim, int z, int y, int x) { - int index = x + texDim.x * (y + texDim.y * z); - int w = texSize.x; - vec2 st = vec2(float(integerMod(index, w)), float(index / w)) + 0.5; - return texture2D(tex, st / vec2(texSize)); -} - -float getFloatFromSampler2D(sampler2D tex, ivec2 texSize, ivec3 texDim, int z, int y, int x) { - vec4 result = getImage2D(tex, texSize, texDim, z, y, x); - return result[0]; -} - -vec2 getVec2FromSampler2D(sampler2D tex, ivec2 texSize, ivec3 texDim, int z, int y, int x) { - vec4 result = getImage2D(tex, texSize, texDim, z, y, x); - return vec2(result[0], result[1]); -} - -vec2 getMemoryOptimizedVec2(sampler2D tex, ivec2 texSize, ivec3 texDim, int z, int y, int x) { - int index = x + (texDim.x * (y + (texDim.y * z))); - int channel = integerMod(index, 2); - index = index / 2; - int w = texSize.x; - vec2 st = vec2(float(integerMod(index, w)), float(index / w)) + 0.5; - vec4 texel = texture2D(tex, st / vec2(texSize)); - if (channel == 0) return vec2(texel.r, texel.g); - if (channel == 1) return vec2(texel.b, texel.a); - return vec2(0.0, 0.0); -} - -vec3 getVec3FromSampler2D(sampler2D tex, ivec2 texSize, ivec3 texDim, int z, int y, int x) { - vec4 result = getImage2D(tex, texSize, texDim, z, y, x); - return vec3(result[0], result[1], result[2]); -} - -vec3 getMemoryOptimizedVec3(sampler2D tex, ivec2 texSize, ivec3 texDim, int z, int y, int x) { - int fieldIndex = 3 * (x + texDim.x * (y + texDim.y * z)); - int vectorIndex = fieldIndex / 4; - int vectorOffset = fieldIndex - vectorIndex * 4; - int readY = vectorIndex / texSize.x; - int readX = vectorIndex - readY * texSize.x; - vec4 tex1 = texture2D(tex, (vec2(readX, readY) + 0.5) / vec2(texSize)); - - if (vectorOffset == 0) { - return tex1.xyz; - } else if (vectorOffset == 1) { - return tex1.yzw; - } else { - readX++; - if (readX >= texSize.x) { - readX = 0; - readY++; - } - vec4 tex2 = texture2D(tex, vec2(readX, readY) / vec2(texSize)); - if (vectorOffset == 2) { - return vec3(tex1.z, tex1.w, tex2.x); - } else { - return vec3(tex1.w, tex2.x, tex2.y); - } - } -} - -vec4 getVec4FromSampler2D(sampler2D tex, ivec2 texSize, ivec3 texDim, int z, int y, int x) { - return getImage2D(tex, texSize, texDim, z, y, x); -} - -vec4 getMemoryOptimizedVec4(sampler2D tex, ivec2 texSize, ivec3 texDim, int z, int y, int x) { - int index = x + texDim.x * (y + texDim.y * z); - int channel = integerMod(index, 2); - int w = texSize.x; - vec2 st = vec2(float(integerMod(index, w)), float(index / w)) + 0.5; - vec4 texel = texture2D(tex, st / vec2(texSize)); - return vec4(texel.r, texel.g, texel.b, texel.a); -} - -vec4 actualColor; -void color(float r, float g, float b, float a) { - actualColor = vec4(r,g,b,a); -} - -void color(float r, float g, float b) { - color(r,g,b,1.0); -} - -void color(sampler2D image) { - actualColor = texture2D(image, vTexCoord); -} - -float modulo(float number, float divisor) { - if (number < 0.0) { - number = abs(number); - if (divisor < 0.0) { - divisor = abs(divisor); - } - return -mod(number, divisor); - } - if (divisor < 0.0) { - divisor = abs(divisor); - } - return mod(number, divisor); -} - -__INJECTED_NATIVE__; -__MAIN_CONSTANTS__; -__MAIN_ARGUMENTS__; -__KERNEL__; - -void main(void) { - index = int(vTexCoord.s * float(uTexSize.x)) + int(vTexCoord.t * float(uTexSize.y)) * uTexSize.x; - __MAIN_RESULT__; -}`; - -module.exports = { - fragmentShader -}; -},{}],38:[function(require,module,exports){ -const { utils } = require('../../utils'); -const { FunctionNode } = require('../function-node'); - -class WebGLFunctionNode extends FunctionNode { - constructor(source, settings) { - super(source, settings); - if (settings && settings.hasOwnProperty('fixIntegerDivisionAccuracy')) { - this.fixIntegerDivisionAccuracy = settings.fixIntegerDivisionAccuracy; - } - } - - astConditionalExpression(ast, retArr) { - if (ast.type !== 'ConditionalExpression') { - throw this.astErrorOutput('Not a conditional expression', ast); - } - const consequentType = this.getType(ast.consequent); - const alternateType = this.getType(ast.alternate); - if (consequentType === null && alternateType === null) { - retArr.push('if ('); - this.astGeneric(ast.test, retArr); - retArr.push(') {'); - this.astGeneric(ast.consequent, retArr); - retArr.push(';'); - retArr.push('} else {'); - this.astGeneric(ast.alternate, retArr); - retArr.push(';'); - retArr.push('}'); - return retArr; - } - retArr.push('('); - this.astGeneric(ast.test, retArr); - retArr.push('?'); - this.astGeneric(ast.consequent, retArr); - retArr.push(':'); - this.astGeneric(ast.alternate, retArr); - retArr.push(')'); - return retArr; - } - - astFunction(ast, retArr) { - if (this.isRootKernel) { - retArr.push('void'); - } else { - if (!this.returnType) { - const lastReturn = this.findLastReturn(); - if (lastReturn) { - this.returnType = this.getType(ast.body); - if (this.returnType === 'LiteralInteger') { - this.returnType = 'Number'; - } - } - } - - const { returnType } = this; - if (!returnType) { - retArr.push('void'); - } else { - const type = typeMap[returnType]; - if (!type) { - throw new Error(`unknown type ${returnType}`); - } - retArr.push(type); - } - } - retArr.push(' '); - retArr.push(this.name); - retArr.push('('); - - if (!this.isRootKernel) { - for (let i = 0; i < this.argumentNames.length; ++i) { - const argumentName = this.argumentNames[i]; - - if (i > 0) { - retArr.push(', '); - } - let argumentType = this.argumentTypes[this.argumentNames.indexOf(argumentName)]; - if (!argumentType) { - throw this.astErrorOutput(`Unknown argument ${argumentName} type`, ast); - } - if (argumentType === 'LiteralInteger') { - this.argumentTypes[i] = argumentType = 'Number'; - } - const type = typeMap[argumentType]; - if (!type) { - throw this.astErrorOutput('Unexpected expression', ast); - } - const name = utils.sanitizeName(argumentName); - if (type === 'sampler2D' || type === 'sampler2DArray') { - retArr.push(`${type} user_${name},ivec2 user_${name}Size,ivec3 user_${name}Dim`); - } else { - retArr.push(`${type} user_${name}`); - } - } - } - - retArr.push(') {\n'); - - for (let i = 0; i < ast.body.body.length; ++i) { - this.astGeneric(ast.body.body[i], retArr); - retArr.push('\n'); - } - - retArr.push('}\n'); - return retArr; - } - - astReturnStatement(ast, retArr) { - if (!ast.argument) throw this.astErrorOutput('Unexpected return statement', ast); - this.pushState('skip-literal-correction'); - const type = this.getType(ast.argument); - this.popState('skip-literal-correction'); - - const result = []; - - if (!this.returnType) { - if (type === 'LiteralInteger' || type === 'Integer') { - this.returnType = 'Number'; - } else { - this.returnType = type; - } - } - - switch (this.returnType) { - case 'LiteralInteger': - case 'Number': - case 'Float': - switch (type) { - case 'Integer': - result.push('float('); - this.astGeneric(ast.argument, result); - result.push(')'); - break; - case 'LiteralInteger': - this.castLiteralToFloat(ast.argument, result); - - if (this.getType(ast) === 'Integer') { - result.unshift('float('); - result.push(')'); - } - break; - default: - this.astGeneric(ast.argument, result); - } - break; - case 'Integer': - switch (type) { - case 'Float': - case 'Number': - this.castValueToInteger(ast.argument, result); - break; - case 'LiteralInteger': - this.castLiteralToInteger(ast.argument, result); - break; - default: - this.astGeneric(ast.argument, result); - } - break; - case 'Array(4)': - case 'Array(3)': - case 'Array(2)': - case 'Matrix(2)': - case 'Matrix(3)': - case 'Matrix(4)': - case 'Input': - this.astGeneric(ast.argument, result); - break; - default: - throw this.astErrorOutput(`unhandled return type ${this.returnType}`, ast); - } - - if (this.isRootKernel) { - retArr.push(`kernelResult = ${ result.join('') };`); - retArr.push('return;'); - } else if (this.isSubKernel) { - retArr.push(`subKernelResult_${ this.name } = ${ result.join('') };`); - retArr.push(`return subKernelResult_${ this.name };`); - } else { - retArr.push(`return ${ result.join('') };`); - } - return retArr; - } - - astLiteral(ast, retArr) { - if (isNaN(ast.value)) { - throw this.astErrorOutput( - 'Non-numeric literal not supported : ' + ast.value, - ast - ); - } - - const key = this.astKey(ast); - if (Number.isInteger(ast.value)) { - if (this.isState('casting-to-integer') || this.isState('building-integer')) { - this.literalTypes[key] = 'Integer'; - retArr.push(`${ast.value}`); - } else if (this.isState('casting-to-float') || this.isState('building-float')) { - this.literalTypes[key] = 'Number'; - retArr.push(`${ast.value}.0`); - } else { - this.literalTypes[key] = 'Number'; - retArr.push(`${ast.value}.0`); - } - } else if (this.isState('casting-to-integer') || this.isState('building-integer')) { - this.literalTypes[key] = 'Integer'; - retArr.push(Math.round(ast.value)); - } else { - this.literalTypes[key] = 'Number'; - retArr.push(`${ast.value}`); - } - return retArr; - } - - astBinaryExpression(ast, retArr) { - if (this.checkAndUpconvertOperator(ast, retArr)) { - return retArr; - } - - if (this.fixIntegerDivisionAccuracy && ast.operator === '/') { - retArr.push('divWithIntCheck('); - this.pushState('building-float'); - switch (this.getType(ast.left)) { - case 'Integer': - this.castValueToFloat(ast.left, retArr); - break; - case 'LiteralInteger': - this.castLiteralToFloat(ast.left, retArr); - break; - default: - this.astGeneric(ast.left, retArr); - } - retArr.push(', '); - switch (this.getType(ast.right)) { - case 'Integer': - this.castValueToFloat(ast.right, retArr); - break; - case 'LiteralInteger': - this.castLiteralToFloat(ast.right, retArr); - break; - default: - this.astGeneric(ast.right, retArr); - } - this.popState('building-float'); - retArr.push(')'); - return retArr; - } - - retArr.push('('); - const leftType = this.getType(ast.left) || 'Number'; - const rightType = this.getType(ast.right) || 'Number'; - if (!leftType || !rightType) { - throw this.astErrorOutput(`Unhandled binary expression`, ast); - } - const key = leftType + ' & ' + rightType; - switch (key) { - case 'Integer & Integer': - this.pushState('building-integer'); - this.astGeneric(ast.left, retArr); - retArr.push(operatorMap[ast.operator] || ast.operator); - this.astGeneric(ast.right, retArr); - this.popState('building-integer'); - break; - case 'Number & Float': - case 'Float & Number': - case 'Float & Float': - case 'Number & Number': - this.pushState('building-float'); - this.astGeneric(ast.left, retArr); - retArr.push(operatorMap[ast.operator] || ast.operator); - this.astGeneric(ast.right, retArr); - this.popState('building-float'); - break; - case 'LiteralInteger & LiteralInteger': - if (this.isState('casting-to-integer') || this.isState('building-integer')) { - this.pushState('building-integer'); - this.astGeneric(ast.left, retArr); - retArr.push(operatorMap[ast.operator] || ast.operator); - this.astGeneric(ast.right, retArr); - this.popState('building-integer'); - } else { - this.pushState('building-float'); - this.castLiteralToFloat(ast.left, retArr); - retArr.push(operatorMap[ast.operator] || ast.operator); - this.castLiteralToFloat(ast.right, retArr); - this.popState('building-float'); - } - break; - - case 'Integer & Float': - case 'Integer & Number': - if (ast.operator === '>' || ast.operator === '<' && ast.right.type === 'Literal') { - if (!Number.isInteger(ast.right.value)) { - this.pushState('building-float'); - this.castValueToFloat(ast.left, retArr); - retArr.push(operatorMap[ast.operator] || ast.operator); - this.astGeneric(ast.right, retArr); - this.popState('building-float'); - break; - } - } - this.pushState('building-integer'); - this.astGeneric(ast.left, retArr); - retArr.push(operatorMap[ast.operator] || ast.operator); - this.pushState('casting-to-integer'); - if (ast.right.type === 'Literal') { - const literalResult = []; - this.astGeneric(ast.right, literalResult); - const literalType = this.getType(ast.right); - if (literalType === 'Integer') { - retArr.push(literalResult.join('')); - } else { - throw this.astErrorOutput(`Unhandled binary expression with literal`, ast); - } - } else { - retArr.push('int('); - this.astGeneric(ast.right, retArr); - retArr.push(')'); - } - this.popState('casting-to-integer'); - this.popState('building-integer'); - break; - case 'Integer & LiteralInteger': - this.pushState('building-integer'); - this.astGeneric(ast.left, retArr); - retArr.push(operatorMap[ast.operator] || ast.operator); - this.castLiteralToInteger(ast.right, retArr); - this.popState('building-integer'); - break; - - case 'Number & Integer': - this.pushState('building-float'); - this.astGeneric(ast.left, retArr); - retArr.push(operatorMap[ast.operator] || ast.operator); - this.castValueToFloat(ast.right, retArr); - this.popState('building-float'); - break; - case 'Float & LiteralInteger': - case 'Number & LiteralInteger': - this.pushState('building-float'); - this.astGeneric(ast.left, retArr); - retArr.push(operatorMap[ast.operator] || ast.operator); - this.castLiteralToFloat(ast.right, retArr); - this.popState('building-float'); - break; - case 'LiteralInteger & Float': - case 'LiteralInteger & Number': - if (this.isState('casting-to-integer')) { - this.pushState('building-integer'); - this.castLiteralToInteger(ast.left, retArr); - retArr.push(operatorMap[ast.operator] || ast.operator); - this.castValueToInteger(ast.right, retArr); - this.popState('building-integer'); - } else { - this.pushState('building-float'); - this.astGeneric(ast.left, retArr); - retArr.push(operatorMap[ast.operator] || ast.operator); - this.pushState('casting-to-float'); - this.astGeneric(ast.right, retArr); - this.popState('casting-to-float'); - this.popState('building-float'); - } - break; - case 'LiteralInteger & Integer': - this.pushState('building-integer'); - this.castLiteralToInteger(ast.left, retArr); - retArr.push(operatorMap[ast.operator] || ast.operator); - this.astGeneric(ast.right, retArr); - this.popState('building-integer'); - break; - - case 'Boolean & Boolean': - this.pushState('building-boolean'); - this.astGeneric(ast.left, retArr); - retArr.push(operatorMap[ast.operator] || ast.operator); - this.astGeneric(ast.right, retArr); - this.popState('building-boolean'); - break; - - case 'Float & Integer': - this.pushState('building-float'); - this.astGeneric(ast.left, retArr); - retArr.push(operatorMap[ast.operator] || ast.operator); - this.castValueToFloat(ast.right, retArr); - this.popState('building-float'); - break; - - default: - throw this.astErrorOutput(`Unhandled binary expression between ${key}`, ast); - } - retArr.push(')'); - - return retArr; - } - - checkAndUpconvertOperator(ast, retArr) { - const bitwiseResult = this.checkAndUpconvertBitwiseOperators(ast, retArr); - if (bitwiseResult) { - return bitwiseResult; - } - const upconvertableOperators = { - '%': this.fixIntegerDivisionAccuracy ? 'integerCorrectionModulo' : 'modulo', - '**': 'pow', - }; - const foundOperator = upconvertableOperators[ast.operator]; - if (!foundOperator) return null; - retArr.push(foundOperator); - retArr.push('('); - switch (this.getType(ast.left)) { - case 'Integer': - this.castValueToFloat(ast.left, retArr); - break; - case 'LiteralInteger': - this.castLiteralToFloat(ast.left, retArr); - break; - default: - this.astGeneric(ast.left, retArr); - } - retArr.push(','); - switch (this.getType(ast.right)) { - case 'Integer': - this.castValueToFloat(ast.right, retArr); - break; - case 'LiteralInteger': - this.castLiteralToFloat(ast.right, retArr); - break; - default: - this.astGeneric(ast.right, retArr); - } - retArr.push(')'); - return retArr; - } - - checkAndUpconvertBitwiseOperators(ast, retArr) { - const upconvertableOperators = { - '&': 'bitwiseAnd', - '|': 'bitwiseOr', - '^': 'bitwiseXOR', - '<<': 'bitwiseZeroFillLeftShift', - '>>': 'bitwiseSignedRightShift', - '>>>': 'bitwiseZeroFillRightShift', - }; - const foundOperator = upconvertableOperators[ast.operator]; - if (!foundOperator) return null; - retArr.push(foundOperator); - retArr.push('('); - const leftType = this.getType(ast.left); - switch (leftType) { - case 'Number': - case 'Float': - this.castValueToInteger(ast.left, retArr); - break; - case 'LiteralInteger': - this.castLiteralToInteger(ast.left, retArr); - break; - default: - this.astGeneric(ast.left, retArr); - } - retArr.push(','); - const rightType = this.getType(ast.right); - switch (rightType) { - case 'Number': - case 'Float': - this.castValueToInteger(ast.right, retArr); - break; - case 'LiteralInteger': - this.castLiteralToInteger(ast.right, retArr); - break; - default: - this.astGeneric(ast.right, retArr); - } - retArr.push(')'); - return retArr; - } - - checkAndUpconvertBitwiseUnary(ast, retArr) { - const upconvertableOperators = { - '~': 'bitwiseNot', - }; - const foundOperator = upconvertableOperators[ast.operator]; - if (!foundOperator) return null; - retArr.push(foundOperator); - retArr.push('('); - switch (this.getType(ast.argument)) { - case 'Number': - case 'Float': - this.castValueToInteger(ast.argument, retArr); - break; - case 'LiteralInteger': - this.castLiteralToInteger(ast.argument, retArr); - break; - default: - this.astGeneric(ast.argument, retArr); - } - retArr.push(')'); - return retArr; - } - - castLiteralToInteger(ast, retArr) { - this.pushState('casting-to-integer'); - this.astGeneric(ast, retArr); - this.popState('casting-to-integer'); - return retArr; - } - - castLiteralToFloat(ast, retArr) { - this.pushState('casting-to-float'); - this.astGeneric(ast, retArr); - this.popState('casting-to-float'); - return retArr; - } - - castValueToInteger(ast, retArr) { - this.pushState('casting-to-integer'); - retArr.push('int('); - this.astGeneric(ast, retArr); - retArr.push(')'); - this.popState('casting-to-integer'); - return retArr; - } - - castValueToFloat(ast, retArr) { - this.pushState('casting-to-float'); - retArr.push('float('); - this.astGeneric(ast, retArr); - retArr.push(')'); - this.popState('casting-to-float'); - return retArr; - } - - astIdentifierExpression(idtNode, retArr) { - if (idtNode.type !== 'Identifier') { - throw this.astErrorOutput('IdentifierExpression - not an Identifier', idtNode); - } - - const type = this.getType(idtNode); - - const name = utils.sanitizeName(idtNode.name); - if (idtNode.name === 'Infinity') { - retArr.push('3.402823466e+38'); - } else if (type === 'Boolean') { - if (this.argumentNames.indexOf(name) > -1) { - retArr.push(`bool(user_${name})`); - } else { - retArr.push(`user_${name}`); - } - } else { - retArr.push(`user_${name}`); - } - - return retArr; - } - - astForStatement(forNode, retArr) { - if (forNode.type !== 'ForStatement') { - throw this.astErrorOutput('Invalid for statement', forNode); - } - - const initArr = []; - const testArr = []; - const updateArr = []; - const bodyArr = []; - let isSafe = null; - - if (forNode.init) { - const { declarations } = forNode.init; - if (declarations.length > 1) { - isSafe = false; - } - this.astGeneric(forNode.init, initArr); - for (let i = 0; i < declarations.length; i++) { - if (declarations[i].init && declarations[i].init.type !== 'Literal') { - isSafe = false; - } - } - } else { - isSafe = false; - } - - if (forNode.test) { - this.astGeneric(forNode.test, testArr); - } else { - isSafe = false; - } - - if (forNode.update) { - this.astGeneric(forNode.update, updateArr); - } else { - isSafe = false; - } - - if (forNode.body) { - this.pushState('loop-body'); - this.astGeneric(forNode.body, bodyArr); - this.popState('loop-body'); - } - - if (isSafe === null) { - isSafe = this.isSafe(forNode.init) && this.isSafe(forNode.test); - } - - if (isSafe) { - const initString = initArr.join(''); - const initNeedsSemiColon = initString[initString.length - 1] !== ';'; - retArr.push(`for (${initString}${initNeedsSemiColon ? ';' : ''}${testArr.join('')};${updateArr.join('')}){\n`); - retArr.push(bodyArr.join('')); - retArr.push('}\n'); - } else { - const iVariableName = this.getInternalVariableName('safeI'); - if (initArr.length > 0) { - retArr.push(initArr.join(''), '\n'); - } - retArr.push(`for (int ${iVariableName}=0;${iVariableName} 0) { - retArr.push(`if (!${testArr.join('')}) break;\n`); - } - retArr.push(bodyArr.join('')); - retArr.push(`\n${updateArr.join('')};`); - retArr.push('}\n'); - } - return retArr; - } - - astWhileStatement(whileNode, retArr) { - if (whileNode.type !== 'WhileStatement') { - throw this.astErrorOutput('Invalid while statement', whileNode); - } - - const iVariableName = this.getInternalVariableName('safeI'); - retArr.push(`for (int ${iVariableName}=0;${iVariableName} 0) { - declarationSets.push(declarationSet.join(',')); - } - - result.push(declarationSets.join(';')); - - retArr.push(result.join('')); - retArr.push(';'); - return retArr; - } - - astIfStatement(ifNode, retArr) { - retArr.push('if ('); - this.astGeneric(ifNode.test, retArr); - retArr.push(')'); - if (ifNode.consequent.type === 'BlockStatement') { - this.astGeneric(ifNode.consequent, retArr); - } else { - retArr.push(' {\n'); - this.astGeneric(ifNode.consequent, retArr); - retArr.push('\n}\n'); - } - - if (ifNode.alternate) { - retArr.push('else '); - if (ifNode.alternate.type === 'BlockStatement' || ifNode.alternate.type === 'IfStatement') { - this.astGeneric(ifNode.alternate, retArr); - } else { - retArr.push(' {\n'); - this.astGeneric(ifNode.alternate, retArr); - retArr.push('\n}\n'); - } - } - return retArr; - } - - astSwitchStatement(ast, retArr) { - if (ast.type !== 'SwitchStatement') { - throw this.astErrorOutput('Invalid switch statement', ast); - } - const { discriminant, cases } = ast; - const type = this.getType(discriminant); - const varName = `switchDiscriminant${this.astKey(ast, '_')}`; - switch (type) { - case 'Float': - case 'Number': - retArr.push(`float ${varName} = `); - this.astGeneric(discriminant, retArr); - retArr.push(';\n'); - break; - case 'Integer': - retArr.push(`int ${varName} = `); - this.astGeneric(discriminant, retArr); - retArr.push(';\n'); - break; - } - if (cases.length === 1 && !cases[0].test) { - this.astGeneric(cases[0].consequent, retArr); - return retArr; - } - - let fallingThrough = false; - let defaultResult = []; - let movingDefaultToEnd = false; - let pastFirstIf = false; - for (let i = 0; i < cases.length; i++) { - if (!cases[i].test) { - if (cases.length > i + 1) { - movingDefaultToEnd = true; - this.astGeneric(cases[i].consequent, defaultResult); - continue; - } else { - retArr.push(' else {\n'); - } - } else { - if (i === 0 || !pastFirstIf) { - pastFirstIf = true; - retArr.push(`if (${varName} == `); - } else { - if (fallingThrough) { - retArr.push(`${varName} == `); - fallingThrough = false; - } else { - retArr.push(` else if (${varName} == `); - } - } - if (type === 'Integer') { - const testType = this.getType(cases[i].test); - switch (testType) { - case 'Number': - case 'Float': - this.castValueToInteger(cases[i].test, retArr); - break; - case 'LiteralInteger': - this.castLiteralToInteger(cases[i].test, retArr); - break; - } - } else if (type === 'Float') { - const testType = this.getType(cases[i].test); - switch (testType) { - case 'LiteralInteger': - this.castLiteralToFloat(cases[i].test, retArr); - break; - case 'Integer': - this.castValueToFloat(cases[i].test, retArr); - break; - } - } else { - throw new Error('unhanlded'); - } - if (!cases[i].consequent || cases[i].consequent.length === 0) { - fallingThrough = true; - retArr.push(' || '); - continue; - } - retArr.push(`) {\n`); - } - this.astGeneric(cases[i].consequent, retArr); - retArr.push('\n}'); - } - if (movingDefaultToEnd) { - retArr.push(' else {'); - retArr.push(defaultResult.join('')); - retArr.push('}'); - } - return retArr; - } - - astThisExpression(tNode, retArr) { - retArr.push('this'); - return retArr; - } - - astMemberExpression(mNode, retArr) { - const { - property, - name, - signature, - origin, - type, - xProperty, - yProperty, - zProperty - } = this.getMemberExpressionDetails(mNode); - switch (signature) { - case 'value.thread.value': - case 'this.thread.value': - if (name !== 'x' && name !== 'y' && name !== 'z') { - throw this.astErrorOutput('Unexpected expression, expected `this.thread.x`, `this.thread.y`, or `this.thread.z`', mNode); - } - retArr.push(`threadId.${name}`); - return retArr; - case 'this.output.value': - if (this.dynamicOutput) { - switch (name) { - case 'x': - if (this.isState('casting-to-float')) { - retArr.push('float(uOutputDim.x)'); - } else { - retArr.push('uOutputDim.x'); - } - break; - case 'y': - if (this.isState('casting-to-float')) { - retArr.push('float(uOutputDim.y)'); - } else { - retArr.push('uOutputDim.y'); - } - break; - case 'z': - if (this.isState('casting-to-float')) { - retArr.push('float(uOutputDim.z)'); - } else { - retArr.push('uOutputDim.z'); - } - break; - default: - throw this.astErrorOutput('Unexpected expression', mNode); - } - } else { - switch (name) { - case 'x': - if (this.isState('casting-to-integer')) { - retArr.push(this.output[0]); - } else { - retArr.push(this.output[0], '.0'); - } - break; - case 'y': - if (this.isState('casting-to-integer')) { - retArr.push(this.output[1]); - } else { - retArr.push(this.output[1], '.0'); - } - break; - case 'z': - if (this.isState('casting-to-integer')) { - retArr.push(this.output[2]); - } else { - retArr.push(this.output[2], '.0'); - } - break; - default: - throw this.astErrorOutput('Unexpected expression', mNode); - } - } - return retArr; - case 'value': - throw this.astErrorOutput('Unexpected expression', mNode); - case 'value[]': - case 'value[][]': - case 'value[][][]': - case 'value[][][][]': - case 'value.value': - if (origin === 'Math') { - retArr.push(Math[name]); - return retArr; - } - const cleanName = utils.sanitizeName(name); - switch (property) { - case 'r': - retArr.push(`user_${ cleanName }.r`); - return retArr; - case 'g': - retArr.push(`user_${ cleanName }.g`); - return retArr; - case 'b': - retArr.push(`user_${ cleanName }.b`); - return retArr; - case 'a': - retArr.push(`user_${ cleanName }.a`); - return retArr; - } - break; - case 'this.constants.value': - if (typeof xProperty === 'undefined') { - switch (type) { - case 'Array(2)': - case 'Array(3)': - case 'Array(4)': - retArr.push(`constants_${ utils.sanitizeName(name) }`); - return retArr; - } - } - case 'this.constants.value[]': - case 'this.constants.value[][]': - case 'this.constants.value[][][]': - case 'this.constants.value[][][][]': - break; - case 'fn()[]': - this.astCallExpression(mNode.object, retArr); - retArr.push('['); - retArr.push(this.memberExpressionPropertyMarkup(property)); - retArr.push(']'); - return retArr; - case 'fn()[][]': - this.astCallExpression(mNode.object.object, retArr); - retArr.push('['); - retArr.push(this.memberExpressionPropertyMarkup(mNode.object.property)); - retArr.push(']'); - retArr.push('['); - retArr.push(this.memberExpressionPropertyMarkup(mNode.property)); - retArr.push(']'); - return retArr; - case '[][]': - this.astArrayExpression(mNode.object, retArr); - retArr.push('['); - retArr.push(this.memberExpressionPropertyMarkup(property)); - retArr.push(']'); - return retArr; - default: - throw this.astErrorOutput('Unexpected expression', mNode); - } - - if (mNode.computed === false) { - switch (type) { - case 'Number': - case 'Integer': - case 'Float': - case 'Boolean': - retArr.push(`${origin}_${utils.sanitizeName(name)}`); - return retArr; - } - } - - const markupName = `${origin}_${utils.sanitizeName(name)}`; - - switch (type) { - case 'Array(2)': - case 'Array(3)': - case 'Array(4)': - this.astGeneric(mNode.object, retArr); - retArr.push('['); - retArr.push(this.memberExpressionPropertyMarkup(xProperty)); - retArr.push(']'); - break; - case 'HTMLImageArray': - retArr.push(`getImage3D(${ markupName }, ${ markupName }Size, ${ markupName }Dim, `); - this.memberExpressionXYZ(xProperty, yProperty, zProperty, retArr); - retArr.push(')'); - break; - case 'ArrayTexture(1)': - retArr.push(`getFloatFromSampler2D(${ markupName }, ${ markupName }Size, ${ markupName }Dim, `); - this.memberExpressionXYZ(xProperty, yProperty, zProperty, retArr); - retArr.push(')'); - break; - case 'Array1D(2)': - case 'Array2D(2)': - case 'Array3D(2)': - retArr.push(`getMemoryOptimizedVec2(${ markupName }, ${ markupName }Size, ${ markupName }Dim, `); - this.memberExpressionXYZ(xProperty, yProperty, zProperty, retArr); - retArr.push(')'); - break; - case 'ArrayTexture(2)': - retArr.push(`getVec2FromSampler2D(${ markupName }, ${ markupName }Size, ${ markupName }Dim, `); - this.memberExpressionXYZ(xProperty, yProperty, zProperty, retArr); - retArr.push(')'); - break; - case 'Array1D(3)': - case 'Array2D(3)': - case 'Array3D(3)': - retArr.push(`getMemoryOptimizedVec3(${ markupName }, ${ markupName }Size, ${ markupName }Dim, `); - this.memberExpressionXYZ(xProperty, yProperty, zProperty, retArr); - retArr.push(')'); - break; - case 'ArrayTexture(3)': - retArr.push(`getVec3FromSampler2D(${ markupName }, ${ markupName }Size, ${ markupName }Dim, `); - this.memberExpressionXYZ(xProperty, yProperty, zProperty, retArr); - retArr.push(')'); - break; - case 'Array1D(4)': - case 'Array2D(4)': - case 'Array3D(4)': - retArr.push(`getMemoryOptimizedVec4(${ markupName }, ${ markupName }Size, ${ markupName }Dim, `); - this.memberExpressionXYZ(xProperty, yProperty, zProperty, retArr); - retArr.push(')'); - break; - case 'ArrayTexture(4)': - case 'HTMLCanvas': - case 'OffscreenCanvas': - case 'HTMLImage': - case 'ImageBitmap': - case 'ImageData': - case 'HTMLVideo': - retArr.push(`getVec4FromSampler2D(${ markupName }, ${ markupName }Size, ${ markupName }Dim, `); - this.memberExpressionXYZ(xProperty, yProperty, zProperty, retArr); - retArr.push(')'); - break; - case 'NumberTexture': - case 'Array': - case 'Array2D': - case 'Array3D': - case 'Array4D': - case 'Input': - case 'Number': - case 'Float': - case 'Integer': - if (this.precision === 'single') { - retArr.push(`getMemoryOptimized32(${markupName}, ${markupName}Size, ${markupName}Dim, `); - this.memberExpressionXYZ(xProperty, yProperty, zProperty, retArr); - retArr.push(')'); - } else { - const bitRatio = (origin === 'user' ? - this.lookupFunctionArgumentBitRatio(this.name, name) : - this.constantBitRatios[name] - ); - switch (bitRatio) { - case 1: - retArr.push(`get8(${markupName}, ${markupName}Size, ${markupName}Dim, `); - break; - case 2: - retArr.push(`get16(${markupName}, ${markupName}Size, ${markupName}Dim, `); - break; - case 4: - case 0: - retArr.push(`get32(${markupName}, ${markupName}Size, ${markupName}Dim, `); - break; - default: - throw new Error(`unhandled bit ratio of ${bitRatio}`); - } - this.memberExpressionXYZ(xProperty, yProperty, zProperty, retArr); - retArr.push(')'); - } - break; - case 'MemoryOptimizedNumberTexture': - retArr.push(`getMemoryOptimized32(${ markupName }, ${ markupName }Size, ${ markupName }Dim, `); - this.memberExpressionXYZ(xProperty, yProperty, zProperty, retArr); - retArr.push(')'); - break; - case 'Matrix(2)': - case 'Matrix(3)': - case 'Matrix(4)': - retArr.push(`${markupName}[${this.memberExpressionPropertyMarkup(yProperty)}]`); - if (yProperty) { - retArr.push(`[${this.memberExpressionPropertyMarkup(xProperty)}]`); - } - break; - default: - throw new Error(`unhandled member expression "${ type }"`); - } - return retArr; - } - - astCallExpression(ast, retArr) { - if (!ast.callee) { - throw this.astErrorOutput('Unknown CallExpression', ast); - } - - let functionName = null; - const isMathFunction = this.isAstMathFunction(ast); - - if (isMathFunction || (ast.callee.object && ast.callee.object.type === 'ThisExpression')) { - functionName = ast.callee.property.name; - } - else if (ast.callee.type === 'SequenceExpression' && ast.callee.expressions[0].type === 'Literal' && !isNaN(ast.callee.expressions[0].raw)) { - functionName = ast.callee.expressions[1].property.name; - } else { - functionName = ast.callee.name; - } - - if (!functionName) { - throw this.astErrorOutput(`Unhandled function, couldn't find name`, ast); - } - - switch (functionName) { - case 'pow': - functionName = '_pow'; - break; - case 'round': - functionName = '_round'; - break; - } - - if (this.calledFunctions.indexOf(functionName) < 0) { - this.calledFunctions.push(functionName); - } - - if (functionName === 'random' && this.plugins && this.plugins.length > 0) { - for (let i = 0; i < this.plugins.length; i++) { - const plugin = this.plugins[i]; - if (plugin.functionMatch === 'Math.random()' && plugin.functionReplace) { - retArr.push(plugin.functionReplace); - return retArr; - } - } - } - - if (this.onFunctionCall) { - this.onFunctionCall(this.name, functionName, ast.arguments); - } - - retArr.push(functionName); - - retArr.push('('); - - if (isMathFunction) { - for (let i = 0; i < ast.arguments.length; ++i) { - const argument = ast.arguments[i]; - const argumentType = this.getType(argument); - if (i > 0) { - retArr.push(', '); - } - - switch (argumentType) { - case 'Integer': - this.castValueToFloat(argument, retArr); - break; - default: - this.astGeneric(argument, retArr); - break; - } - } - } else { - const targetTypes = this.lookupFunctionArgumentTypes(functionName) || []; - for (let i = 0; i < ast.arguments.length; ++i) { - const argument = ast.arguments[i]; - let targetType = targetTypes[i]; - if (i > 0) { - retArr.push(', '); - } - const argumentType = this.getType(argument); - if (!targetType) { - this.triggerImplyArgumentType(functionName, i, argumentType, this); - targetType = argumentType; - } - switch (argumentType) { - case 'Boolean': - this.astGeneric(argument, retArr); - continue; - case 'Number': - case 'Float': - if (targetType === 'Integer') { - retArr.push('int('); - this.astGeneric(argument, retArr); - retArr.push(')'); - continue; - } else if (targetType === 'Number' || targetType === 'Float') { - this.astGeneric(argument, retArr); - continue; - } else if (targetType === 'LiteralInteger') { - this.castLiteralToFloat(argument, retArr); - continue; - } - break; - case 'Integer': - if (targetType === 'Number' || targetType === 'Float') { - retArr.push('float('); - this.astGeneric(argument, retArr); - retArr.push(')'); - continue; - } else if (targetType === 'Integer') { - this.astGeneric(argument, retArr); - continue; - } - break; - case 'LiteralInteger': - if (targetType === 'Integer') { - this.castLiteralToInteger(argument, retArr); - continue; - } else if (targetType === 'Number' || targetType === 'Float') { - this.castLiteralToFloat(argument, retArr); - continue; - } else if (targetType === 'LiteralInteger') { - this.astGeneric(argument, retArr); - continue; - } - break; - case 'Array(2)': - case 'Array(3)': - case 'Array(4)': - if (targetType === argumentType) { - if (argument.type === 'Identifier') { - retArr.push(`user_${utils.sanitizeName(argument.name)}`); - } else if (argument.type === 'ArrayExpression' || argument.type === 'MemberExpression' || argument.type === 'CallExpression') { - this.astGeneric(argument, retArr); - } else { - throw this.astErrorOutput(`Unhandled argument type ${ argument.type }`, ast); - } - continue; - } - break; - case 'HTMLCanvas': - case 'OffscreenCanvas': - case 'HTMLImage': - case 'ImageBitmap': - case 'ImageData': - case 'HTMLImageArray': - case 'HTMLVideo': - case 'ArrayTexture(1)': - case 'ArrayTexture(2)': - case 'ArrayTexture(3)': - case 'ArrayTexture(4)': - case 'Array': - case 'Input': - if (targetType === argumentType) { - if (argument.type !== 'Identifier') throw this.astErrorOutput(`Unhandled argument type ${ argument.type }`, ast); - this.triggerImplyArgumentBitRatio(this.name, argument.name, functionName, i); - const name = utils.sanitizeName(argument.name); - retArr.push(`user_${name},user_${name}Size,user_${name}Dim`); - continue; - } - break; - } - throw this.astErrorOutput(`Unhandled argument combination of ${ argumentType } and ${ targetType } for argument named "${ argument.name }"`, ast); - } - } - retArr.push(')'); - - return retArr; - } - - astArrayExpression(arrNode, retArr) { - const returnType = this.getType(arrNode); - - const arrLen = arrNode.elements.length; - - switch (returnType) { - case 'Matrix(2)': - case 'Matrix(3)': - case 'Matrix(4)': - retArr.push(`mat${arrLen}(`); - break; - default: - retArr.push(`vec${arrLen}(`); - } - for (let i = 0; i < arrLen; ++i) { - if (i > 0) { - retArr.push(', '); - } - const subNode = arrNode.elements[i]; - this.astGeneric(subNode, retArr) - } - retArr.push(')'); - - return retArr; - } - - memberExpressionXYZ(x, y, z, retArr) { - if (z) { - retArr.push(this.memberExpressionPropertyMarkup(z), ', '); - } else { - retArr.push('0, '); - } - if (y) { - retArr.push(this.memberExpressionPropertyMarkup(y), ', '); - } else { - retArr.push('0, '); - } - retArr.push(this.memberExpressionPropertyMarkup(x)); - return retArr; - } - - memberExpressionPropertyMarkup(property) { - if (!property) { - throw new Error('Property not set'); - } - const type = this.getType(property); - const result = []; - switch (type) { - case 'Number': - case 'Float': - this.castValueToInteger(property, result); - break; - case 'LiteralInteger': - this.castLiteralToInteger(property, result); - break; - default: - this.astGeneric(property, result); - } - return result.join(''); - } -} - -const typeMap = { - 'Array': 'sampler2D', - 'Array(2)': 'vec2', - 'Array(3)': 'vec3', - 'Array(4)': 'vec4', - 'Matrix(2)': 'mat2', - 'Matrix(3)': 'mat3', - 'Matrix(4)': 'mat4', - 'Array2D': 'sampler2D', - 'Array3D': 'sampler2D', - 'Boolean': 'bool', - 'Float': 'float', - 'Input': 'sampler2D', - 'Integer': 'int', - 'Number': 'float', - 'LiteralInteger': 'float', - 'NumberTexture': 'sampler2D', - 'MemoryOptimizedNumberTexture': 'sampler2D', - 'ArrayTexture(1)': 'sampler2D', - 'ArrayTexture(2)': 'sampler2D', - 'ArrayTexture(3)': 'sampler2D', - 'ArrayTexture(4)': 'sampler2D', - 'HTMLVideo': 'sampler2D', - 'HTMLCanvas': 'sampler2D', - 'OffscreenCanvas': 'sampler2D', - 'HTMLImage': 'sampler2D', - 'ImageBitmap': 'sampler2D', - 'ImageData': 'sampler2D', - 'HTMLImageArray': 'sampler2DArray', -}; - -const operatorMap = { - '===': '==', - '!==': '!=' -}; - -module.exports = { - WebGLFunctionNode -}; -},{"../../utils":114,"../function-node":10}],39:[function(require,module,exports){ -const { WebGLKernelValueBoolean } = require('./kernel-value/boolean'); -const { WebGLKernelValueFloat } = require('./kernel-value/float'); -const { WebGLKernelValueInteger } = require('./kernel-value/integer'); - -const { WebGLKernelValueHTMLImage } = require('./kernel-value/html-image'); -const { WebGLKernelValueDynamicHTMLImage } = require('./kernel-value/dynamic-html-image'); - -const { WebGLKernelValueHTMLVideo } = require('./kernel-value/html-video'); -const { WebGLKernelValueDynamicHTMLVideo } = require('./kernel-value/dynamic-html-video'); - -const { WebGLKernelValueSingleInput } = require('./kernel-value/single-input'); -const { WebGLKernelValueDynamicSingleInput } = require('./kernel-value/dynamic-single-input'); - -const { WebGLKernelValueUnsignedInput } = require('./kernel-value/unsigned-input'); -const { WebGLKernelValueDynamicUnsignedInput } = require('./kernel-value/dynamic-unsigned-input'); - -const { WebGLKernelValueMemoryOptimizedNumberTexture } = require('./kernel-value/memory-optimized-number-texture'); -const { WebGLKernelValueDynamicMemoryOptimizedNumberTexture } = require('./kernel-value/dynamic-memory-optimized-number-texture'); - -const { WebGLKernelValueNumberTexture } = require('./kernel-value/number-texture'); -const { WebGLKernelValueDynamicNumberTexture } = require('./kernel-value/dynamic-number-texture'); - -const { WebGLKernelValueSingleArray } = require('./kernel-value/single-array'); -const { WebGLKernelValueDynamicSingleArray } = require('./kernel-value/dynamic-single-array'); - -const { WebGLKernelValueSingleArray1DI } = require('./kernel-value/single-array1d-i'); -const { WebGLKernelValueDynamicSingleArray1DI } = require('./kernel-value/dynamic-single-array1d-i'); - -const { WebGLKernelValueSingleArray2DI } = require('./kernel-value/single-array2d-i'); -const { WebGLKernelValueDynamicSingleArray2DI } = require('./kernel-value/dynamic-single-array2d-i'); - -const { WebGLKernelValueSingleArray3DI } = require('./kernel-value/single-array3d-i'); -const { WebGLKernelValueDynamicSingleArray3DI } = require('./kernel-value/dynamic-single-array3d-i'); - -const { WebGLKernelValueArray2 } = require('./kernel-value/array2'); -const { WebGLKernelValueArray3 } = require('./kernel-value/array3'); -const { WebGLKernelValueArray4 } = require('./kernel-value/array4'); - -const { WebGLKernelValueUnsignedArray } = require('./kernel-value/unsigned-array'); -const { WebGLKernelValueDynamicUnsignedArray } = require('./kernel-value/dynamic-unsigned-array'); - -const kernelValueMaps = { - unsigned: { - dynamic: { - 'Boolean': WebGLKernelValueBoolean, - 'Integer': WebGLKernelValueInteger, - 'Float': WebGLKernelValueFloat, - 'Array': WebGLKernelValueDynamicUnsignedArray, - 'Array(2)': WebGLKernelValueArray2, - 'Array(3)': WebGLKernelValueArray3, - 'Array(4)': WebGLKernelValueArray4, - 'Array1D(2)': false, - 'Array1D(3)': false, - 'Array1D(4)': false, - 'Array2D(2)': false, - 'Array2D(3)': false, - 'Array2D(4)': false, - 'Array3D(2)': false, - 'Array3D(3)': false, - 'Array3D(4)': false, - 'Input': WebGLKernelValueDynamicUnsignedInput, - 'NumberTexture': WebGLKernelValueDynamicNumberTexture, - 'ArrayTexture(1)': WebGLKernelValueDynamicNumberTexture, - 'ArrayTexture(2)': WebGLKernelValueDynamicNumberTexture, - 'ArrayTexture(3)': WebGLKernelValueDynamicNumberTexture, - 'ArrayTexture(4)': WebGLKernelValueDynamicNumberTexture, - 'MemoryOptimizedNumberTexture': WebGLKernelValueDynamicMemoryOptimizedNumberTexture, - 'HTMLCanvas': WebGLKernelValueDynamicHTMLImage, - 'OffscreenCanvas': WebGLKernelValueDynamicHTMLImage, - 'HTMLImage': WebGLKernelValueDynamicHTMLImage, - 'ImageBitmap': WebGLKernelValueDynamicHTMLImage, - 'ImageData': WebGLKernelValueDynamicHTMLImage, - 'HTMLImageArray': false, - 'HTMLVideo': WebGLKernelValueDynamicHTMLVideo, - }, - static: { - 'Boolean': WebGLKernelValueBoolean, - 'Float': WebGLKernelValueFloat, - 'Integer': WebGLKernelValueInteger, - 'Array': WebGLKernelValueUnsignedArray, - 'Array(2)': WebGLKernelValueArray2, - 'Array(3)': WebGLKernelValueArray3, - 'Array(4)': WebGLKernelValueArray4, - 'Array1D(2)': false, - 'Array1D(3)': false, - 'Array1D(4)': false, - 'Array2D(2)': false, - 'Array2D(3)': false, - 'Array2D(4)': false, - 'Array3D(2)': false, - 'Array3D(3)': false, - 'Array3D(4)': false, - 'Input': WebGLKernelValueUnsignedInput, - 'NumberTexture': WebGLKernelValueNumberTexture, - 'ArrayTexture(1)': WebGLKernelValueNumberTexture, - 'ArrayTexture(2)': WebGLKernelValueNumberTexture, - 'ArrayTexture(3)': WebGLKernelValueNumberTexture, - 'ArrayTexture(4)': WebGLKernelValueNumberTexture, - 'MemoryOptimizedNumberTexture': WebGLKernelValueMemoryOptimizedNumberTexture, - 'HTMLCanvas': WebGLKernelValueHTMLImage, - 'OffscreenCanvas': WebGLKernelValueHTMLImage, - 'HTMLImage': WebGLKernelValueHTMLImage, - 'ImageBitmap': WebGLKernelValueHTMLImage, - 'ImageData': WebGLKernelValueHTMLImage, - 'HTMLImageArray': false, - 'HTMLVideo': WebGLKernelValueHTMLVideo, - } - }, - single: { - dynamic: { - 'Boolean': WebGLKernelValueBoolean, - 'Integer': WebGLKernelValueInteger, - 'Float': WebGLKernelValueFloat, - 'Array': WebGLKernelValueDynamicSingleArray, - 'Array(2)': WebGLKernelValueArray2, - 'Array(3)': WebGLKernelValueArray3, - 'Array(4)': WebGLKernelValueArray4, - 'Array1D(2)': WebGLKernelValueDynamicSingleArray1DI, - 'Array1D(3)': WebGLKernelValueDynamicSingleArray1DI, - 'Array1D(4)': WebGLKernelValueDynamicSingleArray1DI, - 'Array2D(2)': WebGLKernelValueDynamicSingleArray2DI, - 'Array2D(3)': WebGLKernelValueDynamicSingleArray2DI, - 'Array2D(4)': WebGLKernelValueDynamicSingleArray2DI, - 'Array3D(2)': WebGLKernelValueDynamicSingleArray3DI, - 'Array3D(3)': WebGLKernelValueDynamicSingleArray3DI, - 'Array3D(4)': WebGLKernelValueDynamicSingleArray3DI, - 'Input': WebGLKernelValueDynamicSingleInput, - 'NumberTexture': WebGLKernelValueDynamicNumberTexture, - 'ArrayTexture(1)': WebGLKernelValueDynamicNumberTexture, - 'ArrayTexture(2)': WebGLKernelValueDynamicNumberTexture, - 'ArrayTexture(3)': WebGLKernelValueDynamicNumberTexture, - 'ArrayTexture(4)': WebGLKernelValueDynamicNumberTexture, - 'MemoryOptimizedNumberTexture': WebGLKernelValueDynamicMemoryOptimizedNumberTexture, - 'HTMLCanvas': WebGLKernelValueDynamicHTMLImage, - 'OffscreenCanvas': WebGLKernelValueDynamicHTMLImage, - 'HTMLImage': WebGLKernelValueDynamicHTMLImage, - 'ImageBitmap': WebGLKernelValueDynamicHTMLImage, - 'ImageData': WebGLKernelValueDynamicHTMLImage, - 'HTMLImageArray': false, - 'HTMLVideo': WebGLKernelValueDynamicHTMLVideo, - }, - static: { - 'Boolean': WebGLKernelValueBoolean, - 'Float': WebGLKernelValueFloat, - 'Integer': WebGLKernelValueInteger, - 'Array': WebGLKernelValueSingleArray, - 'Array(2)': WebGLKernelValueArray2, - 'Array(3)': WebGLKernelValueArray3, - 'Array(4)': WebGLKernelValueArray4, - 'Array1D(2)': WebGLKernelValueSingleArray1DI, - 'Array1D(3)': WebGLKernelValueSingleArray1DI, - 'Array1D(4)': WebGLKernelValueSingleArray1DI, - 'Array2D(2)': WebGLKernelValueSingleArray2DI, - 'Array2D(3)': WebGLKernelValueSingleArray2DI, - 'Array2D(4)': WebGLKernelValueSingleArray2DI, - 'Array3D(2)': WebGLKernelValueSingleArray3DI, - 'Array3D(3)': WebGLKernelValueSingleArray3DI, - 'Array3D(4)': WebGLKernelValueSingleArray3DI, - 'Input': WebGLKernelValueSingleInput, - 'NumberTexture': WebGLKernelValueNumberTexture, - 'ArrayTexture(1)': WebGLKernelValueNumberTexture, - 'ArrayTexture(2)': WebGLKernelValueNumberTexture, - 'ArrayTexture(3)': WebGLKernelValueNumberTexture, - 'ArrayTexture(4)': WebGLKernelValueNumberTexture, - 'MemoryOptimizedNumberTexture': WebGLKernelValueMemoryOptimizedNumberTexture, - 'HTMLCanvas': WebGLKernelValueHTMLImage, - 'OffscreenCanvas': WebGLKernelValueHTMLImage, - 'HTMLImage': WebGLKernelValueHTMLImage, - 'ImageBitmap': WebGLKernelValueHTMLImage, - 'ImageData': WebGLKernelValueHTMLImage, - 'HTMLImageArray': false, - 'HTMLVideo': WebGLKernelValueHTMLVideo, - } - }, -}; - -function lookupKernelValueType(type, dynamic, precision, value) { - if (!type) { - throw new Error('type missing'); - } - if (!dynamic) { - throw new Error('dynamic missing'); - } - if (!precision) { - throw new Error('precision missing'); - } - if (value.type) { - type = value.type; - } - const types = kernelValueMaps[precision][dynamic]; - if (types[type] === false) { - return null; - } else if (types[type] === undefined) { - throw new Error(`Could not find a KernelValue for ${ type }`); - } - return types[type]; -} - -module.exports = { - lookupKernelValueType, - kernelValueMaps, -}; -},{"./kernel-value/array2":41,"./kernel-value/array3":42,"./kernel-value/array4":43,"./kernel-value/boolean":44,"./kernel-value/dynamic-html-image":45,"./kernel-value/dynamic-html-video":46,"./kernel-value/dynamic-memory-optimized-number-texture":47,"./kernel-value/dynamic-number-texture":48,"./kernel-value/dynamic-single-array":49,"./kernel-value/dynamic-single-array1d-i":50,"./kernel-value/dynamic-single-array2d-i":51,"./kernel-value/dynamic-single-array3d-i":52,"./kernel-value/dynamic-single-input":53,"./kernel-value/dynamic-unsigned-array":54,"./kernel-value/dynamic-unsigned-input":55,"./kernel-value/float":56,"./kernel-value/html-image":57,"./kernel-value/html-video":58,"./kernel-value/integer":60,"./kernel-value/memory-optimized-number-texture":61,"./kernel-value/number-texture":62,"./kernel-value/single-array":63,"./kernel-value/single-array1d-i":64,"./kernel-value/single-array2d-i":65,"./kernel-value/single-array3d-i":66,"./kernel-value/single-input":67,"./kernel-value/unsigned-array":68,"./kernel-value/unsigned-input":69}],40:[function(require,module,exports){ -const { WebGLKernelValue } = require('./index'); -const { Input } = require('../../../input'); - -class WebGLKernelArray extends WebGLKernelValue { - checkSize(width, height) { - if (!this.kernel.validate) return; - const { maxTextureSize } = this.kernel.constructor.features; - if (width > maxTextureSize || height > maxTextureSize) { - if (width > height) { - throw new Error(`Argument texture width of ${width} larger than maximum size of ${maxTextureSize} for your GPU`); - } else if (width < height) { - throw new Error(`Argument texture height of ${height} larger than maximum size of ${maxTextureSize} for your GPU`); - } else { - throw new Error(`Argument texture height and width of ${height} larger than maximum size of ${maxTextureSize} for your GPU`); - } - } - } - - setup() { - this.requestTexture(); - this.setupTexture(); - this.defineTexture(); - } - - requestTexture() { - this.texture = this.onRequestTexture(); - } - - defineTexture() { - const { context: gl } = this; - gl.activeTexture(this.contextHandle); - gl.bindTexture(gl.TEXTURE_2D, this.texture); - gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE); - gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE); - gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.NEAREST); - gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.NEAREST); - } - - setupTexture() { - this.contextHandle = this.onRequestContextHandle(); - this.index = this.onRequestIndex(); - this.dimensionsId = this.id + 'Dim'; - this.sizeId = this.id + 'Size'; - } - - getBitRatio(value) { - if (Array.isArray(value[0])) { - return this.getBitRatio(value[0]); - } else if (value.constructor === Input) { - return this.getBitRatio(value.value); - } - switch (value.constructor) { - case Uint8ClampedArray: - case Uint8Array: - case Int8Array: - return 1; - case Uint16Array: - case Int16Array: - return 2; - case Float32Array: - case Int32Array: - default: - return 4; - } - } - - destroy() { - if (this.prevArg) { - this.prevArg.delete(); - } - this.context.deleteTexture(this.texture); - } -} - -module.exports = { - WebGLKernelArray -}; -},{"../../../input":110,"./index":59}],41:[function(require,module,exports){ -const { WebGLKernelValue } = require('./index'); - -class WebGLKernelValueArray2 extends WebGLKernelValue { - constructor(value, settings) { - super(value, settings); - this.uploadValue = value; - } - getSource(value) { - if (this.origin === 'constants') { - return `const vec2 ${this.id} = vec2(${value[0]},${value[1]});\n`; - } - return `uniform vec2 ${this.id};\n`; - } - - getStringValueHandler() { - if (this.origin === 'constants') return ''; - return `const uploadValue_${this.name} = ${this.varName};\n`; - } - - updateValue(value) { - if (this.origin === 'constants') return; - this.kernel.setUniform2fv(this.id, this.uploadValue = value); - } -} - -module.exports = { - WebGLKernelValueArray2 -}; -},{"./index":59}],42:[function(require,module,exports){ -const { WebGLKernelValue } = require('./index'); - -class WebGLKernelValueArray3 extends WebGLKernelValue { - constructor(value, settings) { - super(value, settings); - this.uploadValue = value; - } - getSource(value) { - if (this.origin === 'constants') { - return `const vec3 ${this.id} = vec3(${value[0]},${value[1]},${value[2]});\n`; - } - return `uniform vec3 ${this.id};\n`; - } - - getStringValueHandler() { - if (this.origin === 'constants') return ''; - return `const uploadValue_${this.name} = ${this.varName};\n`; - } - - updateValue(value) { - if (this.origin === 'constants') return; - this.kernel.setUniform3fv(this.id, this.uploadValue = value); - } -} - -module.exports = { - WebGLKernelValueArray3 -}; -},{"./index":59}],43:[function(require,module,exports){ -const { WebGLKernelValue } = require('./index'); - -class WebGLKernelValueArray4 extends WebGLKernelValue { - constructor(value, settings) { - super(value, settings); - this.uploadValue = value; - } - getSource(value) { - if (this.origin === 'constants') { - return `const vec4 ${this.id} = vec4(${value[0]},${value[1]},${value[2]},${value[3]});\n`; - } - return `uniform vec4 ${this.id};\n`; - } - - getStringValueHandler() { - if (this.origin === 'constants') return ''; - return `const uploadValue_${this.name} = ${this.varName};\n`; - } - - updateValue(value) { - if (this.origin === 'constants') return; - this.kernel.setUniform4fv(this.id, this.uploadValue = value); - } -} - -module.exports = { - WebGLKernelValueArray4 -}; -},{"./index":59}],44:[function(require,module,exports){ -const { utils } = require('../../../utils'); -const { WebGLKernelValue } = require('./index'); - -class WebGLKernelValueBoolean extends WebGLKernelValue { - constructor(value, settings) { - super(value, settings); - this.uploadValue = value; - } - getSource(value) { - if (this.origin === 'constants') { - return `const bool ${this.id} = ${value};\n`; - } - return `uniform bool ${this.id};\n`; - } - - getStringValueHandler() { - return `const uploadValue_${this.name} = ${this.varName};\n`; - } - - updateValue(value) { - if (this.origin === 'constants') return; - this.kernel.setUniform1i(this.id, this.uploadValue = value); - } -} - -module.exports = { - WebGLKernelValueBoolean -}; -},{"../../../utils":114,"./index":59}],45:[function(require,module,exports){ -const { utils } = require('../../../utils'); -const { WebGLKernelValueHTMLImage } = require('./html-image'); - -class WebGLKernelValueDynamicHTMLImage extends WebGLKernelValueHTMLImage { - getSource() { - return utils.linesToString([ - `uniform sampler2D ${this.id}`, - `uniform ivec2 ${this.sizeId}`, - `uniform ivec3 ${this.dimensionsId}`, - ]); - } - - updateValue(value) { - const { width, height } = value; - this.checkSize(width, height); - this.dimensions = [width, height, 1]; - this.textureSize = [width, height]; - this.kernel.setUniform3iv(this.dimensionsId, this.dimensions); - this.kernel.setUniform2iv(this.sizeId, this.textureSize); - super.updateValue(value); - } -} - -module.exports = { - WebGLKernelValueDynamicHTMLImage -}; -},{"../../../utils":114,"./html-image":57}],46:[function(require,module,exports){ -const { WebGLKernelValueDynamicHTMLImage } = require('./dynamic-html-image'); - -class WebGLKernelValueDynamicHTMLVideo extends WebGLKernelValueDynamicHTMLImage {} - -module.exports = { - WebGLKernelValueDynamicHTMLVideo -}; -},{"./dynamic-html-image":45}],47:[function(require,module,exports){ -const { utils } = require('../../../utils'); -const { WebGLKernelValueMemoryOptimizedNumberTexture } = require('./memory-optimized-number-texture'); - -class WebGLKernelValueDynamicMemoryOptimizedNumberTexture extends WebGLKernelValueMemoryOptimizedNumberTexture { - getSource() { - return utils.linesToString([ - `uniform sampler2D ${this.id}`, - `uniform ivec2 ${this.sizeId}`, - `uniform ivec3 ${this.dimensionsId}`, - ]); - } - - updateValue(inputTexture) { - this.dimensions = inputTexture.dimensions; - this.checkSize(inputTexture.size[0], inputTexture.size[1]); - this.textureSize = inputTexture.size; - this.kernel.setUniform3iv(this.dimensionsId, this.dimensions); - this.kernel.setUniform2iv(this.sizeId, this.textureSize); - super.updateValue(inputTexture); - } -} - -module.exports = { - WebGLKernelValueDynamicMemoryOptimizedNumberTexture -}; -},{"../../../utils":114,"./memory-optimized-number-texture":61}],48:[function(require,module,exports){ -const { utils } = require('../../../utils'); -const { WebGLKernelValueNumberTexture } = require('./number-texture'); - -class WebGLKernelValueDynamicNumberTexture extends WebGLKernelValueNumberTexture { - getSource() { - return utils.linesToString([ - `uniform sampler2D ${this.id}`, - `uniform ivec2 ${this.sizeId}`, - `uniform ivec3 ${this.dimensionsId}`, - ]); - } - - updateValue(value) { - this.dimensions = value.dimensions; - this.checkSize(value.size[0], value.size[1]); - this.textureSize = value.size; - this.kernel.setUniform3iv(this.dimensionsId, this.dimensions); - this.kernel.setUniform2iv(this.sizeId, this.textureSize); - super.updateValue(value); - } -} - -module.exports = { - WebGLKernelValueDynamicNumberTexture -}; -},{"../../../utils":114,"./number-texture":62}],49:[function(require,module,exports){ -const { utils } = require('../../../utils'); -const { WebGLKernelValueSingleArray } = require('./single-array'); - -class WebGLKernelValueDynamicSingleArray extends WebGLKernelValueSingleArray { - getSource() { - return utils.linesToString([ - `uniform sampler2D ${this.id}`, - `uniform ivec2 ${this.sizeId}`, - `uniform ivec3 ${this.dimensionsId}`, - ]); - } - - updateValue(value) { - this.dimensions = utils.getDimensions(value, true); - this.textureSize = utils.getMemoryOptimizedFloatTextureSize(this.dimensions, this.bitRatio); - this.uploadArrayLength = this.textureSize[0] * this.textureSize[1] * this.bitRatio; - this.checkSize(this.textureSize[0], this.textureSize[1]); - this.uploadValue = new Float32Array(this.uploadArrayLength); - this.kernel.setUniform3iv(this.dimensionsId, this.dimensions); - this.kernel.setUniform2iv(this.sizeId, this.textureSize); - super.updateValue(value); - } -} - -module.exports = { - WebGLKernelValueDynamicSingleArray -}; -},{"../../../utils":114,"./single-array":63}],50:[function(require,module,exports){ -const { utils } = require('../../../utils'); -const { WebGLKernelValueSingleArray1DI } = require('./single-array1d-i'); - -class WebGLKernelValueDynamicSingleArray1DI extends WebGLKernelValueSingleArray1DI { - getSource() { - return utils.linesToString([ - `uniform sampler2D ${this.id}`, - `uniform ivec2 ${this.sizeId}`, - `uniform ivec3 ${this.dimensionsId}`, - ]); - } - - updateValue(value) { - this.setShape(value); - this.kernel.setUniform3iv(this.dimensionsId, this.dimensions); - this.kernel.setUniform2iv(this.sizeId, this.textureSize); - super.updateValue(value); - } -} - -module.exports = { - WebGLKernelValueDynamicSingleArray1DI -}; -},{"../../../utils":114,"./single-array1d-i":64}],51:[function(require,module,exports){ -const { utils } = require('../../../utils'); -const { WebGLKernelValueSingleArray2DI } = require('./single-array2d-i'); - -class WebGLKernelValueDynamicSingleArray2DI extends WebGLKernelValueSingleArray2DI { - getSource() { - return utils.linesToString([ - `uniform sampler2D ${this.id}`, - `uniform ivec2 ${this.sizeId}`, - `uniform ivec3 ${this.dimensionsId}`, - ]); - } - - updateValue(value) { - this.setShape(value); - this.kernel.setUniform3iv(this.dimensionsId, this.dimensions); - this.kernel.setUniform2iv(this.sizeId, this.textureSize); - super.updateValue(value); - } -} - -module.exports = { - WebGLKernelValueDynamicSingleArray2DI -}; -},{"../../../utils":114,"./single-array2d-i":65}],52:[function(require,module,exports){ -const { utils } = require('../../../utils'); -const { WebGLKernelValueSingleArray3DI } = require('./single-array3d-i'); - -class WebGLKernelValueDynamicSingleArray3DI extends WebGLKernelValueSingleArray3DI { - getSource() { - return utils.linesToString([ - `uniform sampler2D ${this.id}`, - `uniform ivec2 ${this.sizeId}`, - `uniform ivec3 ${this.dimensionsId}`, - ]); - } - - updateValue(value) { - this.setShape(value); - this.kernel.setUniform3iv(this.dimensionsId, this.dimensions); - this.kernel.setUniform2iv(this.sizeId, this.textureSize); - super.updateValue(value); - } -} - -module.exports = { - WebGLKernelValueDynamicSingleArray3DI -}; -},{"../../../utils":114,"./single-array3d-i":66}],53:[function(require,module,exports){ -const { utils } = require('../../../utils'); -const { WebGLKernelValueSingleInput } = require('./single-input'); - -class WebGLKernelValueDynamicSingleInput extends WebGLKernelValueSingleInput { - getSource() { - return utils.linesToString([ - `uniform sampler2D ${this.id}`, - `uniform ivec2 ${this.sizeId}`, - `uniform ivec3 ${this.dimensionsId}`, - ]); - } - - updateValue(value) { - let [w, h, d] = value.size; - this.dimensions = new Int32Array([w || 1, h || 1, d || 1]); - this.textureSize = utils.getMemoryOptimizedFloatTextureSize(this.dimensions, this.bitRatio); - this.uploadArrayLength = this.textureSize[0] * this.textureSize[1] * this.bitRatio; - this.checkSize(this.textureSize[0], this.textureSize[1]); - this.uploadValue = new Float32Array(this.uploadArrayLength); - this.kernel.setUniform3iv(this.dimensionsId, this.dimensions); - this.kernel.setUniform2iv(this.sizeId, this.textureSize); - super.updateValue(value); - } -} - -module.exports = { - WebGLKernelValueDynamicSingleInput -}; -},{"../../../utils":114,"./single-input":67}],54:[function(require,module,exports){ -const { utils } = require('../../../utils'); -const { WebGLKernelValueUnsignedArray } = require('./unsigned-array'); - -class WebGLKernelValueDynamicUnsignedArray extends WebGLKernelValueUnsignedArray { - getSource() { - return utils.linesToString([ - `uniform sampler2D ${this.id}`, - `uniform ivec2 ${this.sizeId}`, - `uniform ivec3 ${this.dimensionsId}`, - ]); - } - - updateValue(value) { - this.dimensions = utils.getDimensions(value, true); - this.textureSize = utils.getMemoryOptimizedPackedTextureSize(this.dimensions, this.bitRatio); - this.uploadArrayLength = this.textureSize[0] * this.textureSize[1] * (4 / this.bitRatio); - this.checkSize(this.textureSize[0], this.textureSize[1]); - const Type = this.getTransferArrayType(value); - this.preUploadValue = new Type(this.uploadArrayLength); - this.uploadValue = new Uint8Array(this.preUploadValue.buffer); - this.kernel.setUniform3iv(this.dimensionsId, this.dimensions); - this.kernel.setUniform2iv(this.sizeId, this.textureSize); - super.updateValue(value); - } -} - -module.exports = { - WebGLKernelValueDynamicUnsignedArray -}; -},{"../../../utils":114,"./unsigned-array":68}],55:[function(require,module,exports){ -const { utils } = require('../../../utils'); -const { WebGLKernelValueUnsignedInput } = require('./unsigned-input'); - -class WebGLKernelValueDynamicUnsignedInput extends WebGLKernelValueUnsignedInput { - getSource() { - return utils.linesToString([ - `uniform sampler2D ${this.id}`, - `uniform ivec2 ${this.sizeId}`, - `uniform ivec3 ${this.dimensionsId}`, - ]); - } - - updateValue(value) { - let [w, h, d] = value.size; - this.dimensions = new Int32Array([w || 1, h || 1, d || 1]); - this.textureSize = utils.getMemoryOptimizedPackedTextureSize(this.dimensions, this.bitRatio); - this.uploadArrayLength = this.textureSize[0] * this.textureSize[1] * (4 / this.bitRatio); - this.checkSize(this.textureSize[0], this.textureSize[1]); - const Type = this.getTransferArrayType(value.value); - this.preUploadValue = new Type(this.uploadArrayLength); - this.uploadValue = new Uint8Array(this.preUploadValue.buffer); - this.kernel.setUniform3iv(this.dimensionsId, this.dimensions); - this.kernel.setUniform2iv(this.sizeId, this.textureSize); - super.updateValue(value); - } -} - -module.exports = { - WebGLKernelValueDynamicUnsignedInput -}; -},{"../../../utils":114,"./unsigned-input":69}],56:[function(require,module,exports){ -const { utils } = require('../../../utils'); -const { WebGLKernelValue } = require('./index'); - -class WebGLKernelValueFloat extends WebGLKernelValue { - constructor(value, settings) { - super(value, settings); - this.uploadValue = value; - } - getStringValueHandler() { - return `const uploadValue_${this.name} = ${this.varName};\n`; - } - getSource(value) { - if (this.origin === 'constants') { - if (Number.isInteger(value)) { - return `const float ${this.id} = ${value}.0;\n`; - } - return `const float ${this.id} = ${value};\n`; - } - return `uniform float ${this.id};\n`; - } - - updateValue(value) { - if (this.origin === 'constants') return; - this.kernel.setUniform1f(this.id, this.uploadValue = value); - } -} - -module.exports = { - WebGLKernelValueFloat -}; -},{"../../../utils":114,"./index":59}],57:[function(require,module,exports){ -const { utils } = require('../../../utils'); -const { WebGLKernelArray } = require('./array'); - -class WebGLKernelValueHTMLImage extends WebGLKernelArray { - constructor(value, settings) { - super(value, settings); - const { width, height } = value; - this.checkSize(width, height); - this.dimensions = [width, height, 1]; - this.textureSize = [width, height]; - this.uploadValue = value; - } - - getStringValueHandler() { - return `const uploadValue_${this.name} = ${this.varName};\n`; - } - - getSource() { - return utils.linesToString([ - `uniform sampler2D ${this.id}`, - `ivec2 ${this.sizeId} = ivec2(${this.textureSize[0]}, ${this.textureSize[1]})`, - `ivec3 ${this.dimensionsId} = ivec3(${this.dimensions[0]}, ${this.dimensions[1]}, ${this.dimensions[2]})`, - ]); - } - - updateValue(inputImage) { - if (inputImage.constructor !== this.initialValueConstructor) { - this.onUpdateValueMismatch(inputImage.constructor); - return; - } - const { context: gl } = this; - gl.activeTexture(this.contextHandle); - gl.bindTexture(gl.TEXTURE_2D, this.texture); - gl.pixelStorei(gl.UNPACK_FLIP_Y_WEBGL, true); - gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, this.uploadValue = inputImage); - this.kernel.setUniform1i(this.id, this.index); - } -} - -module.exports = { - WebGLKernelValueHTMLImage -}; -},{"../../../utils":114,"./array":40}],58:[function(require,module,exports){ -const { WebGLKernelValueHTMLImage } = require('./html-image'); - -class WebGLKernelValueHTMLVideo extends WebGLKernelValueHTMLImage {} - -module.exports = { - WebGLKernelValueHTMLVideo -}; -},{"./html-image":57}],59:[function(require,module,exports){ -const { utils } = require('../../../utils'); -const { KernelValue } = require('../../kernel-value'); - -class WebGLKernelValue extends KernelValue { - constructor(value, settings) { - super(value, settings); - this.dimensionsId = null; - this.sizeId = null; - this.initialValueConstructor = value.constructor; - this.onRequestTexture = settings.onRequestTexture; - this.onRequestIndex = settings.onRequestIndex; - this.uploadValue = null; - this.textureSize = null; - this.bitRatio = null; - this.prevArg = null; - } - - get id() { - return `${this.origin}_${utils.sanitizeName(this.name)}`; - } - - setup() {} - - getTransferArrayType(value) { - if (Array.isArray(value[0])) { - return this.getTransferArrayType(value[0]); - } - switch (value.constructor) { - case Array: - case Int32Array: - case Int16Array: - case Int8Array: - return Float32Array; - case Uint8ClampedArray: - case Uint8Array: - case Uint16Array: - case Uint32Array: - case Float32Array: - case Float64Array: - return value.constructor; - } - console.warn('Unfamiliar constructor type. Will go ahead and use, but likley this may result in a transfer of zeros'); - return value.constructor; - } - - getStringValueHandler() { - throw new Error(`"getStringValueHandler" not implemented on ${this.constructor.name}`); - } - - getVariablePrecisionString() { - return this.kernel.getVariablePrecisionString(this.textureSize || undefined, this.tactic || undefined); - } - - destroy() {} -} - -module.exports = { - WebGLKernelValue -}; -},{"../../../utils":114,"../../kernel-value":35}],60:[function(require,module,exports){ -const { utils } = require('../../../utils'); -const { WebGLKernelValue } = require('./index'); - -class WebGLKernelValueInteger extends WebGLKernelValue { - constructor(value, settings) { - super(value, settings); - this.uploadValue = value; - } - getStringValueHandler() { - return `const uploadValue_${this.name} = ${this.varName};\n`; - } - getSource(value) { - if (this.origin === 'constants') { - return `const int ${this.id} = ${ parseInt(value) };\n`; - } - return `uniform int ${this.id};\n`; - } - - updateValue(value) { - if (this.origin === 'constants') return; - this.kernel.setUniform1i(this.id, this.uploadValue = value); - } -} - -module.exports = { - WebGLKernelValueInteger -}; -},{"../../../utils":114,"./index":59}],61:[function(require,module,exports){ -const { utils } = require('../../../utils'); -const { WebGLKernelArray } = require('./array'); - -const sameError = `Source and destination textures are the same. Use immutable = true and manually cleanup kernel output texture memory with texture.delete()`; - -class WebGLKernelValueMemoryOptimizedNumberTexture extends WebGLKernelArray { - constructor(value, settings) { - super(value, settings); - const [width, height] = value.size; - this.checkSize(width, height); - this.dimensions = value.dimensions; - this.textureSize = value.size; - this.uploadValue = value.texture; - this.forceUploadEachRun = true; - } - - setup() { - this.setupTexture(); - } - - getStringValueHandler() { - return `const uploadValue_${this.name} = ${this.varName}.texture;\n`; - } - - getSource() { - return utils.linesToString([ - `uniform sampler2D ${this.id}`, - `ivec2 ${this.sizeId} = ivec2(${this.textureSize[0]}, ${this.textureSize[1]})`, - `ivec3 ${this.dimensionsId} = ivec3(${this.dimensions[0]}, ${this.dimensions[1]}, ${this.dimensions[2]})`, - ]); - } - - updateValue(inputTexture) { - if (inputTexture.constructor !== this.initialValueConstructor) { - this.onUpdateValueMismatch(inputTexture.constructor); - return; - } - if (this.checkContext && inputTexture.context !== this.context) { - throw new Error(`Value ${this.name} (${this.type}) must be from same context`); - } - - const { kernel, context: gl } = this; - if (kernel.pipeline) { - if (kernel.immutable) { - kernel.updateTextureArgumentRefs(this, inputTexture); - } else { - if (kernel.texture && kernel.texture.texture === inputTexture.texture) { - throw new Error(sameError); - } else if (kernel.mappedTextures) { - const { mappedTextures } = kernel; - for (let i = 0; i < mappedTextures.length; i++) { - if (mappedTextures[i].texture === inputTexture.texture) { - throw new Error(sameError); - } - } - } - } - } - - gl.activeTexture(this.contextHandle); - gl.bindTexture(gl.TEXTURE_2D, this.uploadValue = inputTexture.texture); - this.kernel.setUniform1i(this.id, this.index); - } -} - -module.exports = { - WebGLKernelValueMemoryOptimizedNumberTexture, - sameError -}; -},{"../../../utils":114,"./array":40}],62:[function(require,module,exports){ -const { utils } = require('../../../utils'); -const { WebGLKernelArray } = require('./array'); -const { sameError } = require('./memory-optimized-number-texture'); - -class WebGLKernelValueNumberTexture extends WebGLKernelArray { - constructor(value, settings) { - super(value, settings); - const [width, height] = value.size; - this.checkSize(width, height); - const { size: textureSize, dimensions } = value; - this.bitRatio = this.getBitRatio(value); - this.dimensions = dimensions; - this.textureSize = textureSize; - this.uploadValue = value.texture; - this.forceUploadEachRun = true; - } - - setup() { - this.setupTexture(); - } - - getStringValueHandler() { - return `const uploadValue_${this.name} = ${this.varName}.texture;\n`; - } - - getSource() { - return utils.linesToString([ - `uniform sampler2D ${this.id}`, - `ivec2 ${this.sizeId} = ivec2(${this.textureSize[0]}, ${this.textureSize[1]})`, - `ivec3 ${this.dimensionsId} = ivec3(${this.dimensions[0]}, ${this.dimensions[1]}, ${this.dimensions[2]})`, - ]); - } - - updateValue(inputTexture) { - if (inputTexture.constructor !== this.initialValueConstructor) { - this.onUpdateValueMismatch(inputTexture.constructor); - return; - } - if (this.checkContext && inputTexture.context !== this.context) { - throw new Error(`Value ${this.name} (${this.type}) must be from same context`); - } - - const { kernel, context: gl } = this; - if (kernel.pipeline) { - if (kernel.immutable) { - kernel.updateTextureArgumentRefs(this, inputTexture); - } else { - if (kernel.texture && kernel.texture.texture === inputTexture.texture) { - throw new Error(sameError); - } else if (kernel.mappedTextures) { - const { mappedTextures } = kernel; - for (let i = 0; i < mappedTextures.length; i++) { - if (mappedTextures[i].texture === inputTexture.texture) { - throw new Error(sameError); - } - } - } - } - } - - gl.activeTexture(this.contextHandle); - gl.bindTexture(gl.TEXTURE_2D, this.uploadValue = inputTexture.texture); - this.kernel.setUniform1i(this.id, this.index); - } -} - -module.exports = { - WebGLKernelValueNumberTexture -}; -},{"../../../utils":114,"./array":40,"./memory-optimized-number-texture":61}],63:[function(require,module,exports){ -const { utils } = require('../../../utils'); -const { WebGLKernelArray } = require('./array'); - -class WebGLKernelValueSingleArray extends WebGLKernelArray { - constructor(value, settings) { - super(value, settings); - this.bitRatio = 4; - this.dimensions = utils.getDimensions(value, true); - this.textureSize = utils.getMemoryOptimizedFloatTextureSize(this.dimensions, this.bitRatio); - this.uploadArrayLength = this.textureSize[0] * this.textureSize[1] * this.bitRatio; - this.checkSize(this.textureSize[0], this.textureSize[1]); - this.uploadValue = new Float32Array(this.uploadArrayLength); - } - - getStringValueHandler() { - return utils.linesToString([ - `const uploadValue_${this.name} = new Float32Array(${this.uploadArrayLength})`, - `flattenTo(${this.varName}, uploadValue_${this.name})`, - ]); - } - - getSource() { - return utils.linesToString([ - `uniform sampler2D ${this.id}`, - `ivec2 ${this.sizeId} = ivec2(${this.textureSize[0]}, ${this.textureSize[1]})`, - `ivec3 ${this.dimensionsId} = ivec3(${this.dimensions[0]}, ${this.dimensions[1]}, ${this.dimensions[2]})`, - ]); - } - - updateValue(value) { - if (value.constructor !== this.initialValueConstructor) { - this.onUpdateValueMismatch(value.constructor); - return; - } - const { context: gl } = this; - utils.flattenTo(value, this.uploadValue); - gl.activeTexture(this.contextHandle); - gl.bindTexture(gl.TEXTURE_2D, this.texture); - gl.pixelStorei(gl.UNPACK_FLIP_Y_WEBGL, false); - gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, this.textureSize[0], this.textureSize[1], 0, gl.RGBA, gl.FLOAT, this.uploadValue); - this.kernel.setUniform1i(this.id, this.index); - } -} - -module.exports = { - WebGLKernelValueSingleArray -}; -},{"../../../utils":114,"./array":40}],64:[function(require,module,exports){ -const { utils } = require('../../../utils'); -const { WebGLKernelArray } = require('./array'); - -class WebGLKernelValueSingleArray1DI extends WebGLKernelArray { - constructor(value, settings) { - super(value, settings); - this.bitRatio = 4; - this.setShape(value); - } - - setShape(value) { - const valueDimensions = utils.getDimensions(value, true); - this.textureSize = utils.getMemoryOptimizedFloatTextureSize(valueDimensions, this.bitRatio); - this.dimensions = new Int32Array([valueDimensions[1], 1, 1]); - this.uploadArrayLength = this.textureSize[0] * this.textureSize[1] * this.bitRatio; - this.checkSize(this.textureSize[0], this.textureSize[1]); - this.uploadValue = new Float32Array(this.uploadArrayLength); - } - - getStringValueHandler() { - return utils.linesToString([ - `const uploadValue_${this.name} = new Float32Array(${this.uploadArrayLength})`, - `flattenTo(${this.varName}, uploadValue_${this.name})`, - ]); - } - - getSource() { - return utils.linesToString([ - `uniform sampler2D ${this.id}`, - `ivec2 ${this.sizeId} = ivec2(${this.textureSize[0]}, ${this.textureSize[1]})`, - `ivec3 ${this.dimensionsId} = ivec3(${this.dimensions[0]}, ${this.dimensions[1]}, ${this.dimensions[2]})`, - ]); - } - - updateValue(value) { - if (value.constructor !== this.initialValueConstructor) { - this.onUpdateValueMismatch(value.constructor); - return; - } - const { context: gl } = this; - utils.flatten2dArrayTo(value, this.uploadValue); - gl.activeTexture(this.contextHandle); - gl.bindTexture(gl.TEXTURE_2D, this.texture); - gl.pixelStorei(gl.UNPACK_FLIP_Y_WEBGL, false); - gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, this.textureSize[0], this.textureSize[1], 0, gl.RGBA, gl.FLOAT, this.uploadValue); - this.kernel.setUniform1i(this.id, this.index); - } -} - -module.exports = { - WebGLKernelValueSingleArray1DI -}; -},{"../../../utils":114,"./array":40}],65:[function(require,module,exports){ -const { utils } = require('../../../utils'); -const { WebGLKernelArray } = require('./array'); - -class WebGLKernelValueSingleArray2DI extends WebGLKernelArray { - constructor(value, settings) { - super(value, settings); - this.bitRatio = 4; - this.setShape(value); - } - - setShape(value) { - const valueDimensions = utils.getDimensions(value, true); - this.textureSize = utils.getMemoryOptimizedFloatTextureSize(valueDimensions, this.bitRatio); - this.dimensions = new Int32Array([valueDimensions[1], valueDimensions[2], 1]); - this.uploadArrayLength = this.textureSize[0] * this.textureSize[1] * this.bitRatio; - this.checkSize(this.textureSize[0], this.textureSize[1]); - this.uploadValue = new Float32Array(this.uploadArrayLength); - } - - getStringValueHandler() { - return utils.linesToString([ - `const uploadValue_${this.name} = new Float32Array(${this.uploadArrayLength})`, - `flattenTo(${this.varName}, uploadValue_${this.name})`, - ]); - } - - getSource() { - return utils.linesToString([ - `uniform sampler2D ${this.id}`, - `ivec2 ${this.sizeId} = ivec2(${this.textureSize[0]}, ${this.textureSize[1]})`, - `ivec3 ${this.dimensionsId} = ivec3(${this.dimensions[0]}, ${this.dimensions[1]}, ${this.dimensions[2]})`, - ]); - } - - updateValue(value) { - if (value.constructor !== this.initialValueConstructor) { - this.onUpdateValueMismatch(value.constructor); - return; - } - const { context: gl } = this; - utils.flatten3dArrayTo(value, this.uploadValue); - gl.activeTexture(this.contextHandle); - gl.bindTexture(gl.TEXTURE_2D, this.texture); - gl.pixelStorei(gl.UNPACK_FLIP_Y_WEBGL, false); - gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, this.textureSize[0], this.textureSize[1], 0, gl.RGBA, gl.FLOAT, this.uploadValue); - this.kernel.setUniform1i(this.id, this.index); - } -} - -module.exports = { - WebGLKernelValueSingleArray2DI -}; -},{"../../../utils":114,"./array":40}],66:[function(require,module,exports){ -const { utils } = require('../../../utils'); -const { WebGLKernelArray } = require('./array'); - -class WebGLKernelValueSingleArray3DI extends WebGLKernelArray { - constructor(value, settings) { - super(value, settings); - this.bitRatio = 4; - this.setShape(value); - } - - setShape(value) { - const valueDimensions = utils.getDimensions(value, true); - this.textureSize = utils.getMemoryOptimizedFloatTextureSize(valueDimensions, this.bitRatio); - this.dimensions = new Int32Array([valueDimensions[1], valueDimensions[2], valueDimensions[3]]); - this.uploadArrayLength = this.textureSize[0] * this.textureSize[1] * this.bitRatio; - this.checkSize(this.textureSize[0], this.textureSize[1]); - this.uploadValue = new Float32Array(this.uploadArrayLength); - } - - getStringValueHandler() { - return utils.linesToString([ - `const uploadValue_${this.name} = new Float32Array(${this.uploadArrayLength})`, - `flattenTo(${this.varName}, uploadValue_${this.name})`, - ]); - } - - getSource() { - return utils.linesToString([ - `uniform sampler2D ${this.id}`, - `ivec2 ${this.sizeId} = ivec2(${this.textureSize[0]}, ${this.textureSize[1]})`, - `ivec3 ${this.dimensionsId} = ivec3(${this.dimensions[0]}, ${this.dimensions[1]}, ${this.dimensions[2]})`, - ]); - } - - updateValue(value) { - if (value.constructor !== this.initialValueConstructor) { - this.onUpdateValueMismatch(value.constructor); - return; - } - const { context: gl } = this; - utils.flatten4dArrayTo(value, this.uploadValue); - gl.activeTexture(this.contextHandle); - gl.bindTexture(gl.TEXTURE_2D, this.texture); - gl.pixelStorei(gl.UNPACK_FLIP_Y_WEBGL, false); - gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, this.textureSize[0], this.textureSize[1], 0, gl.RGBA, gl.FLOAT, this.uploadValue); - this.kernel.setUniform1i(this.id, this.index); - } -} - -module.exports = { - WebGLKernelValueSingleArray3DI -}; -},{"../../../utils":114,"./array":40}],67:[function(require,module,exports){ -const { utils } = require('../../../utils'); -const { WebGLKernelArray } = require('./array'); - -class WebGLKernelValueSingleInput extends WebGLKernelArray { - constructor(value, settings) { - super(value, settings); - this.bitRatio = 4; - let [w, h, d] = value.size; - this.dimensions = new Int32Array([w || 1, h || 1, d || 1]); - this.textureSize = utils.getMemoryOptimizedFloatTextureSize(this.dimensions, this.bitRatio); - this.uploadArrayLength = this.textureSize[0] * this.textureSize[1] * this.bitRatio; - this.checkSize(this.textureSize[0], this.textureSize[1]); - this.uploadValue = new Float32Array(this.uploadArrayLength); - } - - getStringValueHandler() { - return utils.linesToString([ - `const uploadValue_${this.name} = new Float32Array(${this.uploadArrayLength})`, - `flattenTo(${this.varName}.value, uploadValue_${this.name})`, - ]); - } - - getSource() { - return utils.linesToString([ - `uniform sampler2D ${this.id}`, - `ivec2 ${this.sizeId} = ivec2(${this.textureSize[0]}, ${this.textureSize[1]})`, - `ivec3 ${this.dimensionsId} = ivec3(${this.dimensions[0]}, ${this.dimensions[1]}, ${this.dimensions[2]})`, - ]); - } - - updateValue(input) { - if (input.constructor !== this.initialValueConstructor) { - this.onUpdateValueMismatch(input.constructor); - return; - } - const { context: gl } = this; - utils.flattenTo(input.value, this.uploadValue); - gl.activeTexture(this.contextHandle); - gl.bindTexture(gl.TEXTURE_2D, this.texture); - gl.pixelStorei(gl.UNPACK_FLIP_Y_WEBGL, false); - gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, this.textureSize[0], this.textureSize[1], 0, gl.RGBA, gl.FLOAT, this.uploadValue); - this.kernel.setUniform1i(this.id, this.index); - } -} - -module.exports = { - WebGLKernelValueSingleInput -}; -},{"../../../utils":114,"./array":40}],68:[function(require,module,exports){ -const { utils } = require('../../../utils'); -const { WebGLKernelArray } = require('./array'); - -class WebGLKernelValueUnsignedArray extends WebGLKernelArray { - constructor(value, settings) { - super(value, settings); - this.bitRatio = this.getBitRatio(value); - this.dimensions = utils.getDimensions(value, true); - this.textureSize = utils.getMemoryOptimizedPackedTextureSize(this.dimensions, this.bitRatio); - this.uploadArrayLength = this.textureSize[0] * this.textureSize[1] * (4 / this.bitRatio); - this.checkSize(this.textureSize[0], this.textureSize[1]); - this.TranserArrayType = this.getTransferArrayType(value); - this.preUploadValue = new this.TranserArrayType(this.uploadArrayLength); - this.uploadValue = new Uint8Array(this.preUploadValue.buffer); - } - - getStringValueHandler() { - return utils.linesToString([ - `const preUploadValue_${this.name} = new ${this.TranserArrayType.name}(${this.uploadArrayLength})`, - `const uploadValue_${this.name} = new Uint8Array(preUploadValue_${this.name}.buffer)`, - `flattenTo(${this.varName}, preUploadValue_${this.name})`, - ]); - } - - getSource() { - return utils.linesToString([ - `uniform sampler2D ${this.id}`, - `ivec2 ${this.sizeId} = ivec2(${this.textureSize[0]}, ${this.textureSize[1]})`, - `ivec3 ${this.dimensionsId} = ivec3(${this.dimensions[0]}, ${this.dimensions[1]}, ${this.dimensions[2]})`, - ]); - } - - updateValue(value) { - if (value.constructor !== this.initialValueConstructor) { - this.onUpdateValueMismatch(value.constructor); - return; - } - const { context: gl } = this; - utils.flattenTo(value, this.preUploadValue); - gl.activeTexture(this.contextHandle); - gl.bindTexture(gl.TEXTURE_2D, this.texture); - gl.pixelStorei(gl.UNPACK_FLIP_Y_WEBGL, false); - gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, this.textureSize[0], this.textureSize[1], 0, gl.RGBA, gl.UNSIGNED_BYTE, this.uploadValue); - this.kernel.setUniform1i(this.id, this.index); - } -} - -module.exports = { - WebGLKernelValueUnsignedArray -}; -},{"../../../utils":114,"./array":40}],69:[function(require,module,exports){ -const { utils } = require('../../../utils'); -const { WebGLKernelArray } = require('./array'); - -class WebGLKernelValueUnsignedInput extends WebGLKernelArray { - constructor(value, settings) { - super(value, settings); - this.bitRatio = this.getBitRatio(value); - const [w, h, d] = value.size; - this.dimensions = new Int32Array([w || 1, h || 1, d || 1]); - this.textureSize = utils.getMemoryOptimizedPackedTextureSize(this.dimensions, this.bitRatio); - this.uploadArrayLength = this.textureSize[0] * this.textureSize[1] * (4 / this.bitRatio); - this.checkSize(this.textureSize[0], this.textureSize[1]); - this.TranserArrayType = this.getTransferArrayType(value.value); - this.preUploadValue = new this.TranserArrayType(this.uploadArrayLength); - this.uploadValue = new Uint8Array(this.preUploadValue.buffer); - } - - getStringValueHandler() { - return utils.linesToString([ - `const preUploadValue_${this.name} = new ${this.TranserArrayType.name}(${this.uploadArrayLength})`, - `const uploadValue_${this.name} = new Uint8Array(preUploadValue_${this.name}.buffer)`, - `flattenTo(${this.varName}.value, preUploadValue_${this.name})`, - ]); - } - - getSource() { - return utils.linesToString([ - `uniform sampler2D ${this.id}`, - `ivec2 ${this.sizeId} = ivec2(${this.textureSize[0]}, ${this.textureSize[1]})`, - `ivec3 ${this.dimensionsId} = ivec3(${this.dimensions[0]}, ${this.dimensions[1]}, ${this.dimensions[2]})`, - ]); - } - - updateValue(input) { - if (input.constructor !== this.initialValueConstructor) { - this.onUpdateValueMismatch(value.constructor); - return; - } - const { context: gl } = this; - utils.flattenTo(input.value, this.preUploadValue); - gl.activeTexture(this.contextHandle); - gl.bindTexture(gl.TEXTURE_2D, this.texture); - gl.pixelStorei(gl.UNPACK_FLIP_Y_WEBGL, false); - gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, this.textureSize[0], this.textureSize[1], 0, gl.RGBA, gl.UNSIGNED_BYTE, this.uploadValue); - this.kernel.setUniform1i(this.id, this.index); - } -} - -module.exports = { - WebGLKernelValueUnsignedInput -}; -},{"../../../utils":114,"./array":40}],70:[function(require,module,exports){ -const { GLKernel } = require('../gl/kernel'); -const { FunctionBuilder } = require('../function-builder'); -const { WebGLFunctionNode } = require('./function-node'); -const { utils } = require('../../utils'); -const mrud = require('../../plugins/math-random-uniformly-distributed'); -const { fragmentShader } = require('./fragment-shader'); -const { vertexShader } = require('./vertex-shader'); -const { glKernelString } = require('../gl/kernel-string'); -const { lookupKernelValueType } = require('./kernel-value-maps'); - -let isSupported = null; -let testCanvas = null; -let testContext = null; -let testExtensions = null; -let features = null; - -const plugins = [mrud]; -const canvases = []; -const maxTexSizes = {}; - - -class WebGLKernel extends GLKernel { - static get isSupported() { - if (isSupported !== null) { - return isSupported; - } - this.setupFeatureChecks(); - isSupported = this.isContextMatch(testContext); - return isSupported; - } - - static setupFeatureChecks() { - if (typeof document !== 'undefined') { - testCanvas = document.createElement('canvas'); - } else if (typeof OffscreenCanvas !== 'undefined') { - testCanvas = new OffscreenCanvas(0, 0); - } - if (!testCanvas) return; - testContext = testCanvas.getContext('webgl') || testCanvas.getContext('experimental-webgl'); - if (!testContext || !testContext.getExtension) return; - testExtensions = { - OES_texture_float: testContext.getExtension('OES_texture_float'), - OES_texture_float_linear: testContext.getExtension('OES_texture_float_linear'), - OES_element_index_uint: testContext.getExtension('OES_element_index_uint'), - WEBGL_draw_buffers: testContext.getExtension('WEBGL_draw_buffers'), - }; - features = this.getFeatures(); - } - - static isContextMatch(context) { - if (typeof WebGLRenderingContext !== 'undefined') { - return context instanceof WebGLRenderingContext; - } - return false; - } - - static getIsTextureFloat() { - return Boolean(testExtensions.OES_texture_float); - } - - static getIsDrawBuffers() { - return Boolean(testExtensions.WEBGL_draw_buffers); - } - - static getChannelCount() { - return testExtensions.WEBGL_draw_buffers ? - testContext.getParameter(testExtensions.WEBGL_draw_buffers.MAX_DRAW_BUFFERS_WEBGL) : - 1; - } - - static getMaxTextureSize() { - return testContext.getParameter(testContext.MAX_TEXTURE_SIZE); - } - - static lookupKernelValueType(type, dynamic, precision, value) { - return lookupKernelValueType(type, dynamic, precision, value); - } - - static get testCanvas() { - return testCanvas; - } - - static get testContext() { - return testContext; - } - - static get features() { - return features; - } - - static get fragmentShader() { - return fragmentShader; - } - - static get vertexShader() { - return vertexShader; - } - - constructor(source, settings) { - super(source, settings); - this.program = null; - this.pipeline = settings.pipeline; - this.endianness = utils.systemEndianness(); - this.extensions = {}; - this.argumentTextureCount = 0; - this.constantTextureCount = 0; - this.fragShader = null; - this.vertShader = null; - this.drawBuffersMap = null; - - this.maxTexSize = null; - this.onRequestSwitchKernel = null; - - this.texture = null; - this.mappedTextures = null; - this.mergeSettings(source.settings || settings); - - this.threadDim = null; - this.framebuffer = null; - this.buffer = null; - - this.textureCache = []; - this.programUniformLocationCache = {}; - this.uniform1fCache = {}; - this.uniform1iCache = {}; - this.uniform2fCache = {}; - this.uniform2fvCache = {}; - this.uniform2ivCache = {}; - this.uniform3fvCache = {}; - this.uniform3ivCache = {}; - this.uniform4fvCache = {}; - this.uniform4ivCache = {}; - } - - initCanvas() { - if (typeof document !== 'undefined') { - const canvas = document.createElement('canvas'); - canvas.width = 2; - canvas.height = 2; - return canvas; - } else if (typeof OffscreenCanvas !== 'undefined') { - return new OffscreenCanvas(0, 0); - } - } - - initContext() { - const settings = { - alpha: false, - depth: false, - antialias: false - }; - return this.canvas.getContext('webgl', settings) || this.canvas.getContext('experimental-webgl', settings); - } - - initPlugins(settings) { - const pluginsToUse = []; - const { source } = this; - if (typeof source === 'string') { - for (let i = 0; i < plugins.length; i++) { - const plugin = plugins[i]; - if (source.match(plugin.functionMatch)) { - pluginsToUse.push(plugin); - } - } - } else if (typeof source === 'object') { - if (settings.pluginNames) { - for (let i = 0; i < plugins.length; i++) { - const plugin = plugins[i]; - const usePlugin = settings.pluginNames.some(pluginName => pluginName === plugin.name); - if (usePlugin) { - pluginsToUse.push(plugin); - } - } - } - } - return pluginsToUse; - } - - initExtensions() { - this.extensions = { - OES_texture_float: this.context.getExtension('OES_texture_float'), - OES_texture_float_linear: this.context.getExtension('OES_texture_float_linear'), - OES_element_index_uint: this.context.getExtension('OES_element_index_uint'), - WEBGL_draw_buffers: this.context.getExtension('WEBGL_draw_buffers'), - WEBGL_color_buffer_float: this.context.getExtension('WEBGL_color_buffer_float'), - }; - } - - validateSettings(args) { - if (!this.validate) { - this.texSize = utils.getKernelTextureSize({ - optimizeFloatMemory: this.optimizeFloatMemory, - precision: this.precision, - }, this.output); - return; - } - - const { features } = this.constructor; - - if (this.optimizeFloatMemory === true && !features.isTextureFloat) { - throw new Error('Float textures are not supported'); - } else if (this.precision === 'single' && !features.isFloatRead) { - throw new Error('Single precision not supported'); - } else if (!this.graphical && this.precision === null && features.isTextureFloat) { - this.precision = features.isFloatRead ? 'single' : 'unsigned'; - } - - if (this.subKernels && this.subKernels.length > 0 && !this.extensions.WEBGL_draw_buffers) { - throw new Error('could not instantiate draw buffers extension'); - } - - if (this.fixIntegerDivisionAccuracy === null) { - this.fixIntegerDivisionAccuracy = !features.isIntegerDivisionAccurate; - } else if (this.fixIntegerDivisionAccuracy && features.isIntegerDivisionAccurate) { - this.fixIntegerDivisionAccuracy = false; - } - - this.checkOutput(); - - if (!this.output || this.output.length === 0) { - if (args.length !== 1) { - throw new Error('Auto output only supported for kernels with only one input'); - } - - const argType = utils.getVariableType(args[0], this.strictIntegers); - switch (argType) { - case 'Array': - this.output = utils.getDimensions(argType); - break; - case 'NumberTexture': - case 'MemoryOptimizedNumberTexture': - case 'ArrayTexture(1)': - case 'ArrayTexture(2)': - case 'ArrayTexture(3)': - case 'ArrayTexture(4)': - this.output = args[0].output; - break; - default: - throw new Error('Auto output not supported for input type: ' + argType); - } - } - - if (this.graphical) { - if (this.output.length !== 2) { - throw new Error('Output must have 2 dimensions on graphical mode'); - } - - if (this.precision === 'precision') { - this.precision = 'unsigned'; - console.warn('Cannot use graphical mode and single precision at the same time'); - } - - this.texSize = utils.clone(this.output); - return; - } else if (this.precision === null && features.isTextureFloat) { - this.precision = 'single'; - } - - this.texSize = utils.getKernelTextureSize({ - optimizeFloatMemory: this.optimizeFloatMemory, - precision: this.precision, - }, this.output); - - this.checkTextureSize(); - } - - updateMaxTexSize() { - const { texSize, canvas } = this; - if (this.maxTexSize === null) { - let canvasIndex = canvases.indexOf(canvas); - if (canvasIndex === -1) { - canvasIndex = canvases.length; - canvases.push(canvas); - maxTexSizes[canvasIndex] = [texSize[0], texSize[1]]; - } - this.maxTexSize = maxTexSizes[canvasIndex]; - } - if (this.maxTexSize[0] < texSize[0]) { - this.maxTexSize[0] = texSize[0]; - } - if (this.maxTexSize[1] < texSize[1]) { - this.maxTexSize[1] = texSize[1]; - } - } - - setupArguments(args) { - this.kernelArguments = []; - this.argumentTextureCount = 0; - const needsArgumentTypes = this.argumentTypes === null; - if (needsArgumentTypes) { - this.argumentTypes = []; - } - this.argumentSizes = []; - this.argumentBitRatios = []; - - if (args.length < this.argumentNames.length) { - throw new Error('not enough arguments for kernel'); - } else if (args.length > this.argumentNames.length) { - throw new Error('too many arguments for kernel'); - } - - const { context: gl } = this; - let textureIndexes = 0; - - const onRequestTexture = () => { - return this.createTexture(); - }; - const onRequestIndex = () => { - return this.constantTextureCount + textureIndexes++; - }; - const onUpdateValueMismatch = (constructor) => { - this.switchKernels({ - type: 'argumentMismatch', - needed: constructor - }); - }; - const onRequestContextHandle = () => { - return gl.TEXTURE0 + this.constantTextureCount + this.argumentTextureCount++; - }; - - for (let index = 0; index < args.length; index++) { - const value = args[index]; - const name = this.argumentNames[index]; - let type; - if (needsArgumentTypes) { - type = utils.getVariableType(value, this.strictIntegers); - this.argumentTypes.push(type); - } else { - type = this.argumentTypes[index]; - } - const KernelValue = this.constructor.lookupKernelValueType(type, this.dynamicArguments ? 'dynamic' : 'static', this.precision, args[index]); - if (KernelValue === null) { - return this.requestFallback(args); - } - const kernelArgument = new KernelValue(value, { - name, - type, - tactic: this.tactic, - origin: 'user', - context: gl, - checkContext: this.checkContext, - kernel: this, - strictIntegers: this.strictIntegers, - onRequestTexture, - onRequestIndex, - onUpdateValueMismatch, - onRequestContextHandle, - }); - this.kernelArguments.push(kernelArgument); - kernelArgument.setup(); - this.argumentSizes.push(kernelArgument.textureSize); - this.argumentBitRatios[index] = kernelArgument.bitRatio; - } - } - - createTexture() { - const texture = this.context.createTexture(); - this.textureCache.push(texture); - return texture; - } - - setupConstants(args) { - const { context: gl } = this; - this.kernelConstants = []; - this.forceUploadKernelConstants = []; - let needsConstantTypes = this.constantTypes === null; - if (needsConstantTypes) { - this.constantTypes = {}; - } - this.constantBitRatios = {}; - let textureIndexes = 0; - for (const name in this.constants) { - const value = this.constants[name]; - let type; - if (needsConstantTypes) { - type = utils.getVariableType(value, this.strictIntegers); - this.constantTypes[name] = type; - } else { - type = this.constantTypes[name]; - } - const KernelValue = this.constructor.lookupKernelValueType(type, 'static', this.precision, value); - if (KernelValue === null) { - return this.requestFallback(args); - } - const kernelValue = new KernelValue(value, { - name, - type, - tactic: this.tactic, - origin: 'constants', - context: this.context, - checkContext: this.checkContext, - kernel: this, - strictIntegers: this.strictIntegers, - onRequestTexture: () => { - return this.createTexture(); - }, - onRequestIndex: () => { - return textureIndexes++; - }, - onRequestContextHandle: () => { - return gl.TEXTURE0 + this.constantTextureCount++; - } - }); - this.constantBitRatios[name] = kernelValue.bitRatio; - this.kernelConstants.push(kernelValue); - kernelValue.setup(); - if (kernelValue.forceUploadEachRun) { - this.forceUploadKernelConstants.push(kernelValue); - } - } - } - - build() { - if (this.built) return; - this.initExtensions(); - this.validateSettings(arguments); - this.setupConstants(arguments); - if (this.fallbackRequested) return; - this.setupArguments(arguments); - if (this.fallbackRequested) return; - this.updateMaxTexSize(); - this.translateSource(); - const failureResult = this.pickRenderStrategy(arguments); - if (failureResult) { - return failureResult; - } - const { texSize, context: gl, canvas } = this; - gl.enable(gl.SCISSOR_TEST); - if (this.pipeline && this.precision === 'single') { - gl.viewport(0, 0, this.maxTexSize[0], this.maxTexSize[1]); - canvas.width = this.maxTexSize[0]; - canvas.height = this.maxTexSize[1]; - } else { - gl.viewport(0, 0, this.maxTexSize[0], this.maxTexSize[1]); - canvas.width = this.maxTexSize[0]; - canvas.height = this.maxTexSize[1]; - } - const threadDim = this.threadDim = Array.from(this.output); - while (threadDim.length < 3) { - threadDim.push(1); - } - - const compiledVertexShader = this.getVertexShader(arguments); - const vertShader = gl.createShader(gl.VERTEX_SHADER); - gl.shaderSource(vertShader, compiledVertexShader); - gl.compileShader(vertShader); - this.vertShader = vertShader; - - const compiledFragmentShader = this.getFragmentShader(arguments); - const fragShader = gl.createShader(gl.FRAGMENT_SHADER); - gl.shaderSource(fragShader, compiledFragmentShader); - gl.compileShader(fragShader); - this.fragShader = fragShader; - - if (this.debug) { - console.log('GLSL Shader Output:'); - console.log(compiledFragmentShader); - } - - if (!gl.getShaderParameter(vertShader, gl.COMPILE_STATUS)) { - throw new Error('Error compiling vertex shader: ' + gl.getShaderInfoLog(vertShader)); - } - if (!gl.getShaderParameter(fragShader, gl.COMPILE_STATUS)) { - throw new Error('Error compiling fragment shader: ' + gl.getShaderInfoLog(fragShader)); - } - - const program = this.program = gl.createProgram(); - gl.attachShader(program, vertShader); - gl.attachShader(program, fragShader); - gl.linkProgram(program); - this.framebuffer = gl.createFramebuffer(); - this.framebuffer.width = texSize[0]; - this.framebuffer.height = texSize[1]; - this.rawValueFramebuffers = {}; - - const vertices = new Float32Array([-1, -1, - 1, -1, -1, 1, - 1, 1 - ]); - const texCoords = new Float32Array([ - 0, 0, - 1, 0, - 0, 1, - 1, 1 - ]); - - const texCoordOffset = vertices.byteLength; - - let buffer = this.buffer; - if (!buffer) { - buffer = this.buffer = gl.createBuffer(); - gl.bindBuffer(gl.ARRAY_BUFFER, buffer); - gl.bufferData(gl.ARRAY_BUFFER, vertices.byteLength + texCoords.byteLength, gl.STATIC_DRAW); - } else { - gl.bindBuffer(gl.ARRAY_BUFFER, buffer); - } - - gl.bufferSubData(gl.ARRAY_BUFFER, 0, vertices); - gl.bufferSubData(gl.ARRAY_BUFFER, texCoordOffset, texCoords); - - const aPosLoc = gl.getAttribLocation(this.program, 'aPos'); - gl.enableVertexAttribArray(aPosLoc); - gl.vertexAttribPointer(aPosLoc, 2, gl.FLOAT, false, 0, 0); - const aTexCoordLoc = gl.getAttribLocation(this.program, 'aTexCoord'); - gl.enableVertexAttribArray(aTexCoordLoc); - gl.vertexAttribPointer(aTexCoordLoc, 2, gl.FLOAT, false, 0, texCoordOffset); - gl.bindFramebuffer(gl.FRAMEBUFFER, this.framebuffer); - - let i = 0; - gl.useProgram(this.program); - for (let p in this.constants) { - this.kernelConstants[i++].updateValue(this.constants[p]); - } - - this._setupOutputTexture(); - if ( - this.subKernels !== null && - this.subKernels.length > 0 - ) { - this._mappedTextureSwitched = {}; - this._setupSubOutputTextures(); - } - this.buildSignature(arguments); - this.built = true; - } - - translateSource() { - const functionBuilder = FunctionBuilder.fromKernel(this, WebGLFunctionNode, { - fixIntegerDivisionAccuracy: this.fixIntegerDivisionAccuracy - }); - this.translatedSource = functionBuilder.getPrototypeString('kernel'); - this.setupReturnTypes(functionBuilder); - } - - setupReturnTypes(functionBuilder) { - if (!this.graphical && !this.returnType) { - this.returnType = functionBuilder.getKernelResultType(); - } - - if (this.subKernels && this.subKernels.length > 0) { - for (let i = 0; i < this.subKernels.length; i++) { - const subKernel = this.subKernels[i]; - if (!subKernel.returnType) { - subKernel.returnType = functionBuilder.getSubKernelResultType(i); - } - } - } - } - - run() { - const { kernelArguments, texSize, forceUploadKernelConstants, context: gl } = this; - - gl.useProgram(this.program); - gl.scissor(0, 0, texSize[0], texSize[1]); - if (this.dynamicOutput) { - this.setUniform3iv('uOutputDim', new Int32Array(this.threadDim)); - this.setUniform2iv('uTexSize', texSize); - } - - this.setUniform2f('ratio', texSize[0] / this.maxTexSize[0], texSize[1] / this.maxTexSize[1]); - - for (let i = 0; i < forceUploadKernelConstants.length; i++) { - const constant = forceUploadKernelConstants[i]; - constant.updateValue(this.constants[constant.name]); - if (this.switchingKernels) return; - } - for (let i = 0; i < kernelArguments.length; i++) { - kernelArguments[i].updateValue(arguments[i]); - if (this.switchingKernels) return; - } - - if (this.plugins) { - for (let i = 0; i < this.plugins.length; i++) { - const plugin = this.plugins[i]; - if (plugin.onBeforeRun) { - plugin.onBeforeRun(this); - } - } - } - - if (this.graphical) { - if (this.pipeline) { - gl.bindRenderbuffer(gl.RENDERBUFFER, null); - gl.bindFramebuffer(gl.FRAMEBUFFER, this.framebuffer); - if (this.immutable) { - this._replaceOutputTexture(); - } - gl.drawArrays(gl.TRIANGLE_STRIP, 0, 4); - return this.immutable ? this.texture.clone() : this.texture; - } - gl.bindRenderbuffer(gl.RENDERBUFFER, null); - gl.bindFramebuffer(gl.FRAMEBUFFER, null); - gl.drawArrays(gl.TRIANGLE_STRIP, 0, 4); - return; - } - - gl.bindFramebuffer(gl.FRAMEBUFFER, this.framebuffer); - if (this.immutable) { - this._replaceOutputTexture(); - } - - if (this.subKernels !== null) { - if (this.immutable) { - this._replaceSubOutputTextures(); - } - this.drawBuffers(); - } - - gl.drawArrays(gl.TRIANGLE_STRIP, 0, 4); - } - - drawBuffers() { - this.extensions.WEBGL_draw_buffers.drawBuffersWEBGL(this.drawBuffersMap); - } - - getInternalFormat() { - return this.context.RGBA; - } - getTextureFormat() { - const { context: gl } = this; - switch (this.getInternalFormat()) { - case gl.RGBA: - return gl.RGBA; - default: - throw new Error('Unknown internal format'); - } - } - - _replaceOutputTexture() { - if (this.texture.beforeMutate() || this._textureSwitched) { - const gl = this.context; - gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.texture.texture, 0); - this._textureSwitched = false; - } - } - - _setupOutputTexture() { - const gl = this.context; - const texSize = this.texSize; - if (this.texture) { - gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.texture.texture, 0); - return; - } - const texture = this.createTexture(); - gl.activeTexture(gl.TEXTURE0 + this.constantTextureCount + this.argumentTextureCount); - gl.bindTexture(gl.TEXTURE_2D, texture); - gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE); - gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE); - gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.NEAREST); - gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.NEAREST); - const format = this.getInternalFormat(); - if (this.precision === 'single') { - gl.texImage2D(gl.TEXTURE_2D, 0, format, texSize[0], texSize[1], 0, gl.RGBA, gl.FLOAT, null); - } else { - gl.texImage2D(gl.TEXTURE_2D, 0, format, texSize[0], texSize[1], 0, format, gl.UNSIGNED_BYTE, null); - } - gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, texture, 0); - this.texture = new this.TextureConstructor({ - texture, - size: texSize, - dimensions: this.threadDim, - output: this.output, - context: this.context, - internalFormat: this.getInternalFormat(), - textureFormat: this.getTextureFormat(), - kernel: this, - }); - } - - _replaceSubOutputTextures() { - const gl = this.context; - for (let i = 0; i < this.mappedTextures.length; i++) { - const mappedTexture = this.mappedTextures[i]; - if (mappedTexture.beforeMutate() || this._mappedTextureSwitched[i]) { - gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0 + i + 1, gl.TEXTURE_2D, mappedTexture.texture, 0); - this._mappedTextureSwitched[i] = false; - } - } - } - - _setupSubOutputTextures() { - const gl = this.context; - if (this.mappedTextures) { - for (let i = 0; i < this.subKernels.length; i++) { - gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0 + i + 1, gl.TEXTURE_2D, this.mappedTextures[i].texture, 0); - } - return; - } - const texSize = this.texSize; - this.drawBuffersMap = [gl.COLOR_ATTACHMENT0]; - this.mappedTextures = []; - for (let i = 0; i < this.subKernels.length; i++) { - const texture = this.createTexture(); - this.drawBuffersMap.push(gl.COLOR_ATTACHMENT0 + i + 1); - gl.activeTexture(gl.TEXTURE0 + this.constantTextureCount + this.argumentTextureCount + i); - gl.bindTexture(gl.TEXTURE_2D, texture); - gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE); - gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE); - gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.NEAREST); - gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.NEAREST); - if (this.precision === 'single') { - gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, texSize[0], texSize[1], 0, gl.RGBA, gl.FLOAT, null); - } else { - gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, texSize[0], texSize[1], 0, gl.RGBA, gl.UNSIGNED_BYTE, null); - } - gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0 + i + 1, gl.TEXTURE_2D, texture, 0); - - this.mappedTextures.push(new this.TextureConstructor({ - texture, - size: texSize, - dimensions: this.threadDim, - output: this.output, - context: this.context, - internalFormat: this.getInternalFormat(), - textureFormat: this.getTextureFormat(), - kernel: this, - })); - } - } - - setUniform1f(name, value) { - if (this.uniform1fCache.hasOwnProperty(name)) { - const cache = this.uniform1fCache[name]; - if (value === cache) { - return; - } - } - this.uniform1fCache[name] = value; - const loc = this.getUniformLocation(name); - this.context.uniform1f(loc, value); - } - - setUniform1i(name, value) { - if (this.uniform1iCache.hasOwnProperty(name)) { - const cache = this.uniform1iCache[name]; - if (value === cache) { - return; - } - } - this.uniform1iCache[name] = value; - const loc = this.getUniformLocation(name); - this.context.uniform1i(loc, value); - } - - setUniform2f(name, value1, value2) { - if (this.uniform2fCache.hasOwnProperty(name)) { - const cache = this.uniform2fCache[name]; - if ( - value1 === cache[0] && - value2 === cache[1] - ) { - return; - } - } - this.uniform2fCache[name] = [value1, value2]; - const loc = this.getUniformLocation(name); - this.context.uniform2f(loc, value1, value2); - } - - setUniform2fv(name, value) { - if (this.uniform2fvCache.hasOwnProperty(name)) { - const cache = this.uniform2fvCache[name]; - if ( - value[0] === cache[0] && - value[1] === cache[1] - ) { - return; - } - } - this.uniform2fvCache[name] = value; - const loc = this.getUniformLocation(name); - this.context.uniform2fv(loc, value); - } - - setUniform2iv(name, value) { - if (this.uniform2ivCache.hasOwnProperty(name)) { - const cache = this.uniform2ivCache[name]; - if ( - value[0] === cache[0] && - value[1] === cache[1] - ) { - return; - } - } - this.uniform2ivCache[name] = value; - const loc = this.getUniformLocation(name); - this.context.uniform2iv(loc, value); - } - - setUniform3fv(name, value) { - if (this.uniform3fvCache.hasOwnProperty(name)) { - const cache = this.uniform3fvCache[name]; - if ( - value[0] === cache[0] && - value[1] === cache[1] && - value[2] === cache[2] - ) { - return; - } - } - this.uniform3fvCache[name] = value; - const loc = this.getUniformLocation(name); - this.context.uniform3fv(loc, value); - } - - setUniform3iv(name, value) { - if (this.uniform3ivCache.hasOwnProperty(name)) { - const cache = this.uniform3ivCache[name]; - if ( - value[0] === cache[0] && - value[1] === cache[1] && - value[2] === cache[2] - ) { - return; - } - } - this.uniform3ivCache[name] = value; - const loc = this.getUniformLocation(name); - this.context.uniform3iv(loc, value); - } - - setUniform4fv(name, value) { - if (this.uniform4fvCache.hasOwnProperty(name)) { - const cache = this.uniform4fvCache[name]; - if ( - value[0] === cache[0] && - value[1] === cache[1] && - value[2] === cache[2] && - value[3] === cache[3] - ) { - return; - } - } - this.uniform4fvCache[name] = value; - const loc = this.getUniformLocation(name); - this.context.uniform4fv(loc, value); - } - - setUniform4iv(name, value) { - if (this.uniform4ivCache.hasOwnProperty(name)) { - const cache = this.uniform4ivCache[name]; - if ( - value[0] === cache[0] && - value[1] === cache[1] && - value[2] === cache[2] && - value[3] === cache[3] - ) { - return; - } - } - this.uniform4ivCache[name] = value; - const loc = this.getUniformLocation(name); - this.context.uniform4iv(loc, value); - } - - getUniformLocation(name) { - if (this.programUniformLocationCache.hasOwnProperty(name)) { - return this.programUniformLocationCache[name]; - } - return this.programUniformLocationCache[name] = this.context.getUniformLocation(this.program, name); - } - - _getFragShaderArtifactMap(args) { - return { - HEADER: this._getHeaderString(), - LOOP_MAX: this._getLoopMaxString(), - PLUGINS: this._getPluginsString(), - CONSTANTS: this._getConstantsString(), - DECODE32_ENDIANNESS: this._getDecode32EndiannessString(), - ENCODE32_ENDIANNESS: this._getEncode32EndiannessString(), - DIVIDE_WITH_INTEGER_CHECK: this._getDivideWithIntegerCheckString(), - INJECTED_NATIVE: this._getInjectedNative(), - MAIN_CONSTANTS: this._getMainConstantsString(), - MAIN_ARGUMENTS: this._getMainArgumentsString(args), - KERNEL: this.getKernelString(), - MAIN_RESULT: this.getMainResultString(), - FLOAT_TACTIC_DECLARATION: this.getFloatTacticDeclaration(), - INT_TACTIC_DECLARATION: this.getIntTacticDeclaration(), - SAMPLER_2D_TACTIC_DECLARATION: this.getSampler2DTacticDeclaration(), - SAMPLER_2D_ARRAY_TACTIC_DECLARATION: this.getSampler2DArrayTacticDeclaration(), - }; - } - - _getVertShaderArtifactMap(args) { - return { - FLOAT_TACTIC_DECLARATION: this.getFloatTacticDeclaration(), - INT_TACTIC_DECLARATION: this.getIntTacticDeclaration(), - SAMPLER_2D_TACTIC_DECLARATION: this.getSampler2DTacticDeclaration(), - SAMPLER_2D_ARRAY_TACTIC_DECLARATION: this.getSampler2DArrayTacticDeclaration(), - }; - } - - _getHeaderString() { - return ( - this.subKernels !== null ? - '#extension GL_EXT_draw_buffers : require\n' : - '' - ); - } - - _getLoopMaxString() { - return ( - this.loopMaxIterations ? - ` ${parseInt(this.loopMaxIterations)};\n` : - ' 1000;\n' - ); - } - - _getPluginsString() { - if (!this.plugins) return '\n'; - return this.plugins.map(plugin => plugin.source && this.source.match(plugin.functionMatch) ? plugin.source : '').join('\n'); - } - - _getConstantsString() { - const result = []; - const { threadDim, texSize } = this; - if (this.dynamicOutput) { - result.push( - 'uniform ivec3 uOutputDim', - 'uniform ivec2 uTexSize' - ); - } else { - result.push( - `ivec3 uOutputDim = ivec3(${threadDim[0]}, ${threadDim[1]}, ${threadDim[2]})`, - `ivec2 uTexSize = ivec2(${texSize[0]}, ${texSize[1]})` - ); - } - return utils.linesToString(result); - } - - _getTextureCoordinate() { - const subKernels = this.subKernels; - if (subKernels === null || subKernels.length < 1) { - return 'varying vec2 vTexCoord;\n'; - } else { - return 'out vec2 vTexCoord;\n'; - } - } - - _getDecode32EndiannessString() { - return ( - this.endianness === 'LE' ? - '' : - ' texel.rgba = texel.abgr;\n' - ); - } - - _getEncode32EndiannessString() { - return ( - this.endianness === 'LE' ? - '' : - ' texel.rgba = texel.abgr;\n' - ); - } - - _getDivideWithIntegerCheckString() { - return this.fixIntegerDivisionAccuracy ? - `float divWithIntCheck(float x, float y) { - if (floor(x) == x && floor(y) == y && integerMod(x, y) == 0.0) { - return float(int(x) / int(y)); - } - return x / y; -} - -float integerCorrectionModulo(float number, float divisor) { - if (number < 0.0) { - number = abs(number); - if (divisor < 0.0) { - divisor = abs(divisor); - } - return -(number - (divisor * floor(divWithIntCheck(number, divisor)))); - } - if (divisor < 0.0) { - divisor = abs(divisor); - } - return number - (divisor * floor(divWithIntCheck(number, divisor))); -}` : - ''; - } - - _getMainArgumentsString(args) { - const results = []; - const { argumentNames } = this; - for (let i = 0; i < argumentNames.length; i++) { - results.push(this.kernelArguments[i].getSource(args[i])); - } - return results.join(''); - } - - _getInjectedNative() { - return this.injectedNative || ''; - } - - _getMainConstantsString() { - const result = []; - const { constants } = this; - if (constants) { - let i = 0; - for (const name in constants) { - if (!this.constants.hasOwnProperty(name)) continue; - result.push(this.kernelConstants[i++].getSource(this.constants[name])); - } - } - return result.join(''); - } - - getRawValueFramebuffer(width, height) { - if (!this.rawValueFramebuffers[width]) { - this.rawValueFramebuffers[width] = {}; - } - if (!this.rawValueFramebuffers[width][height]) { - const framebuffer = this.context.createFramebuffer(); - framebuffer.width = width; - framebuffer.height = height; - this.rawValueFramebuffers[width][height] = framebuffer; - } - return this.rawValueFramebuffers[width][height]; - } - - getKernelResultDeclaration() { - switch (this.returnType) { - case 'Array(2)': - return 'vec2 kernelResult'; - case 'Array(3)': - return 'vec3 kernelResult'; - case 'Array(4)': - return 'vec4 kernelResult'; - case 'LiteralInteger': - case 'Float': - case 'Number': - case 'Integer': - return 'float kernelResult'; - default: - if (this.graphical) { - return 'float kernelResult'; - } else { - throw new Error(`unrecognized output type "${ this.returnType }"`); - } - } - } - getKernelString() { - const result = [this.getKernelResultDeclaration()]; - const { subKernels } = this; - if (subKernels !== null) { - switch (this.returnType) { - case 'Number': - case 'Float': - case 'Integer': - for (let i = 0; i < subKernels.length; i++) { - const subKernel = subKernels[i]; - result.push( - subKernel.returnType === 'Integer' ? - `int subKernelResult_${ subKernel.name } = 0` : - `float subKernelResult_${ subKernel.name } = 0.0` - ); - } - break; - case 'Array(2)': - for (let i = 0; i < subKernels.length; i++) { - result.push( - `vec2 subKernelResult_${ subKernels[i].name }` - ); - } - break; - case 'Array(3)': - for (let i = 0; i < subKernels.length; i++) { - result.push( - `vec3 subKernelResult_${ subKernels[i].name }` - ); - } - break; - case 'Array(4)': - for (let i = 0; i < subKernels.length; i++) { - result.push( - `vec4 subKernelResult_${ subKernels[i].name }` - ); - } - break; - } - } - - return utils.linesToString(result) + this.translatedSource; - } - - getMainResultGraphical() { - return utils.linesToString([ - ' threadId = indexTo3D(index, uOutputDim)', - ' kernel()', - ' gl_FragColor = actualColor', - ]); - } - - getMainResultPackedPixels() { - switch (this.returnType) { - case 'LiteralInteger': - case 'Number': - case 'Integer': - case 'Float': - return this.getMainResultKernelPackedPixels() + - this.getMainResultSubKernelPackedPixels(); - default: - throw new Error(`packed output only usable with Numbers, "${this.returnType}" specified`); - } - } - - getMainResultKernelPackedPixels() { - return utils.linesToString([ - ' threadId = indexTo3D(index, uOutputDim)', - ' kernel()', - ` gl_FragData[0] = ${this.useLegacyEncoder ? 'legacyEncode32' : 'encode32'}(kernelResult)` - ]); - } - - getMainResultSubKernelPackedPixels() { - const result = []; - if (!this.subKernels) return ''; - for (let i = 0; i < this.subKernels.length; i++) { - const subKernel = this.subKernels[i]; - if (subKernel.returnType === 'Integer') { - result.push( - ` gl_FragData[${i + 1}] = ${this.useLegacyEncoder ? 'legacyEncode32' : 'encode32'}(float(subKernelResult_${this.subKernels[i].name}))` - ); - } else { - result.push( - ` gl_FragData[${i + 1}] = ${this.useLegacyEncoder ? 'legacyEncode32' : 'encode32'}(subKernelResult_${this.subKernels[i].name})` - ); - } - } - return utils.linesToString(result); - } - - getMainResultMemoryOptimizedFloats() { - const result = [ - ' index *= 4', - ]; - - switch (this.returnType) { - case 'Number': - case 'Integer': - case 'Float': - const channels = ['r', 'g', 'b', 'a']; - for (let i = 0; i < channels.length; i++) { - const channel = channels[i]; - this.getMainResultKernelMemoryOptimizedFloats(result, channel); - this.getMainResultSubKernelMemoryOptimizedFloats(result, channel); - if (i + 1 < channels.length) { - result.push(' index += 1'); - } - } - break; - default: - throw new Error(`optimized output only usable with Numbers, ${this.returnType} specified`); - } - - return utils.linesToString(result); - } - - getMainResultKernelMemoryOptimizedFloats(result, channel) { - result.push( - ' threadId = indexTo3D(index, uOutputDim)', - ' kernel()', - ` gl_FragData[0].${channel} = kernelResult` - ); - } - - getMainResultSubKernelMemoryOptimizedFloats(result, channel) { - if (!this.subKernels) return result; - for (let i = 0; i < this.subKernels.length; i++) { - const subKernel = this.subKernels[i]; - if (subKernel.returnType === 'Integer') { - result.push( - ` gl_FragData[${i + 1}].${channel} = float(subKernelResult_${this.subKernels[i].name})` - ); - } else { - result.push( - ` gl_FragData[${i + 1}].${channel} = subKernelResult_${this.subKernels[i].name}` - ); - } - } - } - - getMainResultKernelNumberTexture() { - return [ - ' threadId = indexTo3D(index, uOutputDim)', - ' kernel()', - ' gl_FragData[0][0] = kernelResult', - ]; - } - - getMainResultSubKernelNumberTexture() { - const result = []; - if (!this.subKernels) return result; - for (let i = 0; i < this.subKernels.length; ++i) { - const subKernel = this.subKernels[i]; - if (subKernel.returnType === 'Integer') { - result.push( - ` gl_FragData[${i + 1}][0] = float(subKernelResult_${subKernel.name})` - ); - } else { - result.push( - ` gl_FragData[${i + 1}][0] = subKernelResult_${subKernel.name}` - ); - } - } - return result; - } - - getMainResultKernelArray2Texture() { - return [ - ' threadId = indexTo3D(index, uOutputDim)', - ' kernel()', - ' gl_FragData[0][0] = kernelResult[0]', - ' gl_FragData[0][1] = kernelResult[1]', - ]; - } - - getMainResultSubKernelArray2Texture() { - const result = []; - if (!this.subKernels) return result; - for (let i = 0; i < this.subKernels.length; ++i) { - result.push( - ` gl_FragData[${i + 1}][0] = subKernelResult_${this.subKernels[i].name}[0]`, - ` gl_FragData[${i + 1}][1] = subKernelResult_${this.subKernels[i].name}[1]` - ); - } - return result; - } - - getMainResultKernelArray3Texture() { - return [ - ' threadId = indexTo3D(index, uOutputDim)', - ' kernel()', - ' gl_FragData[0][0] = kernelResult[0]', - ' gl_FragData[0][1] = kernelResult[1]', - ' gl_FragData[0][2] = kernelResult[2]', - ]; - } - - getMainResultSubKernelArray3Texture() { - const result = []; - if (!this.subKernels) return result; - for (let i = 0; i < this.subKernels.length; ++i) { - result.push( - ` gl_FragData[${i + 1}][0] = subKernelResult_${this.subKernels[i].name}[0]`, - ` gl_FragData[${i + 1}][1] = subKernelResult_${this.subKernels[i].name}[1]`, - ` gl_FragData[${i + 1}][2] = subKernelResult_${this.subKernels[i].name}[2]` - ); - } - return result; - } - - getMainResultKernelArray4Texture() { - return [ - ' threadId = indexTo3D(index, uOutputDim)', - ' kernel()', - ' gl_FragData[0] = kernelResult', - ]; - } - - getMainResultSubKernelArray4Texture() { - const result = []; - if (!this.subKernels) return result; - switch (this.returnType) { - case 'Number': - case 'Float': - case 'Integer': - for (let i = 0; i < this.subKernels.length; ++i) { - const subKernel = this.subKernels[i]; - if (subKernel.returnType === 'Integer') { - result.push( - ` gl_FragData[${i + 1}] = float(subKernelResult_${this.subKernels[i].name})` - ); - } else { - result.push( - ` gl_FragData[${i + 1}] = subKernelResult_${this.subKernels[i].name}` - ); - } - } - break; - case 'Array(2)': - for (let i = 0; i < this.subKernels.length; ++i) { - result.push( - ` gl_FragData[${i + 1}][0] = subKernelResult_${this.subKernels[i].name}[0]`, - ` gl_FragData[${i + 1}][1] = subKernelResult_${this.subKernels[i].name}[1]` - ); - } - break; - case 'Array(3)': - for (let i = 0; i < this.subKernels.length; ++i) { - result.push( - ` gl_FragData[${i + 1}][0] = subKernelResult_${this.subKernels[i].name}[0]`, - ` gl_FragData[${i + 1}][1] = subKernelResult_${this.subKernels[i].name}[1]`, - ` gl_FragData[${i + 1}][2] = subKernelResult_${this.subKernels[i].name}[2]` - ); - } - break; - case 'Array(4)': - for (let i = 0; i < this.subKernels.length; ++i) { - result.push( - ` gl_FragData[${i + 1}][0] = subKernelResult_${this.subKernels[i].name}[0]`, - ` gl_FragData[${i + 1}][1] = subKernelResult_${this.subKernels[i].name}[1]`, - ` gl_FragData[${i + 1}][2] = subKernelResult_${this.subKernels[i].name}[2]`, - ` gl_FragData[${i + 1}][3] = subKernelResult_${this.subKernels[i].name}[3]` - ); - } - break; - } - - return result; - } - - replaceArtifacts(src, map) { - return src.replace(/[ ]*__([A-Z]+[0-9]*([_]?[A-Z]*[0-9]?)*)__;\n/g, (match, artifact) => { - if (map.hasOwnProperty(artifact)) { - return map[artifact]; - } - throw `unhandled artifact ${artifact}`; - }); - } - - getFragmentShader(args) { - if (this.compiledFragmentShader !== null) { - return this.compiledFragmentShader; - } - return this.compiledFragmentShader = this.replaceArtifacts(this.constructor.fragmentShader, this._getFragShaderArtifactMap(args)); - } - - getVertexShader(args) { - if (this.compiledVertexShader !== null) { - return this.compiledVertexShader; - } - return this.compiledVertexShader = this.replaceArtifacts(this.constructor.vertexShader, this._getVertShaderArtifactMap(args)); - } - - toString() { - const setupContextString = utils.linesToString([ - `const gl = context`, - ]); - return glKernelString(this.constructor, arguments, this, setupContextString); - } - - destroy(removeCanvasReferences) { - if (!this.context) return; - if (this.buffer) { - this.context.deleteBuffer(this.buffer); - } - if (this.framebuffer) { - this.context.deleteFramebuffer(this.framebuffer); - } - for (const width in this.rawValueFramebuffers) { - for (const height in this.rawValueFramebuffers[width]) { - this.context.deleteFramebuffer(this.rawValueFramebuffers[width][height]); - delete this.rawValueFramebuffers[width][height]; - } - delete this.rawValueFramebuffers[width]; - } - if (this.vertShader) { - this.context.deleteShader(this.vertShader); - } - if (this.fragShader) { - this.context.deleteShader(this.fragShader); - } - if (this.program) { - this.context.deleteProgram(this.program); - } - if (this.texture) { - this.texture.delete(); - const textureCacheIndex = this.textureCache.indexOf(this.texture.texture); - if (textureCacheIndex > -1) { - this.textureCache.splice(textureCacheIndex, 1); - } - this.texture = null; - } - if (this.mappedTextures && this.mappedTextures.length) { - for (let i = 0; i < this.mappedTextures.length; i++) { - const mappedTexture = this.mappedTextures[i]; - mappedTexture.delete(); - const textureCacheIndex = this.textureCache.indexOf(mappedTexture.texture); - if (textureCacheIndex > -1) { - this.textureCache.splice(textureCacheIndex, 1); - } - } - this.mappedTextures = null; - } - if (this.kernelArguments) { - for (let i = 0; i < this.kernelArguments.length; i++) { - this.kernelArguments[i].destroy(); - } - } - if (this.kernelConstants) { - for (let i = 0; i < this.kernelConstants.length; i++) { - this.kernelConstants[i].destroy(); - } - } - while (this.textureCache.length > 0) { - const texture = this.textureCache.pop(); - this.context.deleteTexture(texture); - } - if (removeCanvasReferences) { - const idx = canvases.indexOf(this.canvas); - if (idx >= 0) { - canvases[idx] = null; - maxTexSizes[idx] = null; - } - } - this.destroyExtensions(); - delete this.context; - delete this.canvas; - if (!this.gpu) return; - const i = this.gpu.kernels.indexOf(this); - if (i === -1) return; - this.gpu.kernels.splice(i, 1); - } - - destroyExtensions() { - this.extensions.OES_texture_float = null; - this.extensions.OES_texture_float_linear = null; - this.extensions.OES_element_index_uint = null; - this.extensions.WEBGL_draw_buffers = null; - } - - static destroyContext(context) { - const extension = context.getExtension('WEBGL_lose_context'); - if (extension) { - extension.loseContext(); - } - } - - toJSON() { - const json = super.toJSON(); - json.functionNodes = FunctionBuilder.fromKernel(this, WebGLFunctionNode).toJSON(); - json.settings.threadDim = this.threadDim; - return json; - } -} - -module.exports = { - WebGLKernel -}; -},{"../../plugins/math-random-uniformly-distributed":112,"../../utils":114,"../function-builder":9,"../gl/kernel":13,"../gl/kernel-string":12,"./fragment-shader":37,"./function-node":38,"./kernel-value-maps":39,"./vertex-shader":71}],71:[function(require,module,exports){ -const vertexShader = `__FLOAT_TACTIC_DECLARATION__; -__INT_TACTIC_DECLARATION__; -__SAMPLER_2D_TACTIC_DECLARATION__; - -attribute vec2 aPos; -attribute vec2 aTexCoord; - -varying vec2 vTexCoord; -uniform vec2 ratio; - -void main(void) { - gl_Position = vec4((aPos + vec2(1)) * ratio + vec2(-1), 0, 1); - vTexCoord = aTexCoord; -}`; - -module.exports = { - vertexShader -}; -},{}],72:[function(require,module,exports){ -const fragmentShader = `#version 300 es -__HEADER__; -__FLOAT_TACTIC_DECLARATION__; -__INT_TACTIC_DECLARATION__; -__SAMPLER_2D_TACTIC_DECLARATION__; -__SAMPLER_2D_ARRAY_TACTIC_DECLARATION__; - -const int LOOP_MAX = __LOOP_MAX__; - -__PLUGINS__; -__CONSTANTS__; - -in vec2 vTexCoord; - -float atan2(float v1, float v2) { - if (v1 == 0.0 || v2 == 0.0) return 0.0; - return atan(v1 / v2); -} - -float cbrt(float x) { - if (x >= 0.0) { - return pow(x, 1.0 / 3.0); - } else { - return -pow(x, 1.0 / 3.0); - } -} - -float expm1(float x) { - return pow(${Math.E}, x) - 1.0; -} - -float fround(highp float x) { - return x; -} - -float imul(float v1, float v2) { - return float(int(v1) * int(v2)); -} - -float log10(float x) { - return log2(x) * (1.0 / log2(10.0)); -} - -float log1p(float x) { - return log(1.0 + x); -} - -float _pow(float v1, float v2) { - if (v2 == 0.0) return 1.0; - return pow(v1, v2); -} - -float _round(float x) { - return floor(x + 0.5); -} - - -const int BIT_COUNT = 32; -int modi(int x, int y) { - return x - y * (x / y); -} - -int bitwiseOr(int a, int b) { - int result = 0; - int n = 1; - - for (int i = 0; i < BIT_COUNT; i++) { - if ((modi(a, 2) == 1) || (modi(b, 2) == 1)) { - result += n; - } - a = a / 2; - b = b / 2; - n = n * 2; - if(!(a > 0 || b > 0)) { - break; - } - } - return result; -} -int bitwiseXOR(int a, int b) { - int result = 0; - int n = 1; - - for (int i = 0; i < BIT_COUNT; i++) { - if ((modi(a, 2) == 1) != (modi(b, 2) == 1)) { - result += n; - } - a = a / 2; - b = b / 2; - n = n * 2; - if(!(a > 0 || b > 0)) { - break; - } - } - return result; -} -int bitwiseAnd(int a, int b) { - int result = 0; - int n = 1; - for (int i = 0; i < BIT_COUNT; i++) { - if ((modi(a, 2) == 1) && (modi(b, 2) == 1)) { - result += n; - } - a = a / 2; - b = b / 2; - n = n * 2; - if(!(a > 0 && b > 0)) { - break; - } - } - return result; -} -int bitwiseNot(int a) { - int result = 0; - int n = 1; - - for (int i = 0; i < BIT_COUNT; i++) { - if (modi(a, 2) == 0) { - result += n; - } - a = a / 2; - n = n * 2; - } - return result; -} -int bitwiseZeroFillLeftShift(int n, int shift) { - int maxBytes = BIT_COUNT; - for (int i = 0; i < BIT_COUNT; i++) { - if (maxBytes >= n) { - break; - } - maxBytes *= 2; - } - for (int i = 0; i < BIT_COUNT; i++) { - if (i >= shift) { - break; - } - n *= 2; - } - - int result = 0; - int byteVal = 1; - for (int i = 0; i < BIT_COUNT; i++) { - if (i >= maxBytes) break; - if (modi(n, 2) > 0) { result += byteVal; } - n = int(n / 2); - byteVal *= 2; - } - return result; -} - -int bitwiseSignedRightShift(int num, int shifts) { - return int(floor(float(num) / pow(2.0, float(shifts)))); -} - -int bitwiseZeroFillRightShift(int n, int shift) { - int maxBytes = BIT_COUNT; - for (int i = 0; i < BIT_COUNT; i++) { - if (maxBytes >= n) { - break; - } - maxBytes *= 2; - } - for (int i = 0; i < BIT_COUNT; i++) { - if (i >= shift) { - break; - } - n /= 2; - } - int result = 0; - int byteVal = 1; - for (int i = 0; i < BIT_COUNT; i++) { - if (i >= maxBytes) break; - if (modi(n, 2) > 0) { result += byteVal; } - n = int(n / 2); - byteVal *= 2; - } - return result; -} - -vec2 integerMod(vec2 x, float y) { - vec2 res = floor(mod(x, y)); - return res * step(1.0 - floor(y), -res); -} - -vec3 integerMod(vec3 x, float y) { - vec3 res = floor(mod(x, y)); - return res * step(1.0 - floor(y), -res); -} - -vec4 integerMod(vec4 x, vec4 y) { - vec4 res = floor(mod(x, y)); - return res * step(1.0 - floor(y), -res); -} - -float integerMod(float x, float y) { - float res = floor(mod(x, y)); - return res * (res > floor(y) - 1.0 ? 0.0 : 1.0); -} - -int integerMod(int x, int y) { - return x - (y * int(x/y)); -} - -__DIVIDE_WITH_INTEGER_CHECK__; - -// Here be dragons! -// DO NOT OPTIMIZE THIS CODE -// YOU WILL BREAK SOMETHING ON SOMEBODY\'S MACHINE -// LEAVE IT AS IT IS, LEST YOU WASTE YOUR OWN TIME -const vec2 MAGIC_VEC = vec2(1.0, -256.0); -const vec4 SCALE_FACTOR = vec4(1.0, 256.0, 65536.0, 0.0); -const vec4 SCALE_FACTOR_INV = vec4(1.0, 0.00390625, 0.0000152587890625, 0.0); // 1, 1/256, 1/65536 -float decode32(vec4 texel) { - __DECODE32_ENDIANNESS__; - texel *= 255.0; - vec2 gte128; - gte128.x = texel.b >= 128.0 ? 1.0 : 0.0; - gte128.y = texel.a >= 128.0 ? 1.0 : 0.0; - float exponent = 2.0 * texel.a - 127.0 + dot(gte128, MAGIC_VEC); - float res = exp2(round(exponent)); - texel.b = texel.b - 128.0 * gte128.x; - res = dot(texel, SCALE_FACTOR) * exp2(round(exponent-23.0)) + res; - res *= gte128.y * -2.0 + 1.0; - return res; -} - -float decode16(vec4 texel, int index) { - int channel = integerMod(index, 2); - return texel[channel*2] * 255.0 + texel[channel*2 + 1] * 65280.0; -} - -float decode8(vec4 texel, int index) { - int channel = integerMod(index, 4); - return texel[channel] * 255.0; -} - -vec4 legacyEncode32(float f) { - float F = abs(f); - float sign = f < 0.0 ? 1.0 : 0.0; - float exponent = floor(log2(F)); - float mantissa = (exp2(-exponent) * F); - // exponent += floor(log2(mantissa)); - vec4 texel = vec4(F * exp2(23.0-exponent)) * SCALE_FACTOR_INV; - texel.rg = integerMod(texel.rg, 256.0); - texel.b = integerMod(texel.b, 128.0); - texel.a = exponent*0.5 + 63.5; - texel.ba += vec2(integerMod(exponent+127.0, 2.0), sign) * 128.0; - texel = floor(texel); - texel *= 0.003921569; // 1/255 - __ENCODE32_ENDIANNESS__; - return texel; -} - -// https://github.com/gpujs/gpu.js/wiki/Encoder-details -vec4 encode32(float value) { - if (value == 0.0) return vec4(0, 0, 0, 0); - - float exponent; - float mantissa; - vec4 result; - float sgn; - - sgn = step(0.0, -value); - value = abs(value); - - exponent = floor(log2(value)); - - mantissa = value*pow(2.0, -exponent)-1.0; - exponent = exponent+127.0; - result = vec4(0,0,0,0); - - result.a = floor(exponent/2.0); - exponent = exponent - result.a*2.0; - result.a = result.a + 128.0*sgn; - - result.b = floor(mantissa * 128.0); - mantissa = mantissa - result.b / 128.0; - result.b = result.b + exponent*128.0; - - result.g = floor(mantissa*32768.0); - mantissa = mantissa - result.g/32768.0; - - result.r = floor(mantissa*8388608.0); - return result/255.0; -} -// Dragons end here - -int index; -ivec3 threadId; - -ivec3 indexTo3D(int idx, ivec3 texDim) { - int z = int(idx / (texDim.x * texDim.y)); - idx -= z * int(texDim.x * texDim.y); - int y = int(idx / texDim.x); - int x = int(integerMod(idx, texDim.x)); - return ivec3(x, y, z); -} - -float get32(sampler2D tex, ivec2 texSize, ivec3 texDim, int z, int y, int x) { - int index = x + texDim.x * (y + texDim.y * z); - int w = texSize.x; - vec2 st = vec2(float(integerMod(index, w)), float(index / w)) + 0.5; - vec4 texel = texture(tex, st / vec2(texSize)); - return decode32(texel); -} - -float get16(sampler2D tex, ivec2 texSize, ivec3 texDim, int z, int y, int x) { - int index = x + (texDim.x * (y + (texDim.y * z))); - int w = texSize.x * 2; - vec2 st = vec2(float(integerMod(index, w)), float(index / w)) + 0.5; - vec4 texel = texture(tex, st / vec2(texSize.x * 2, texSize.y)); - return decode16(texel, index); -} - -float get8(sampler2D tex, ivec2 texSize, ivec3 texDim, int z, int y, int x) { - int index = x + (texDim.x * (y + (texDim.y * z))); - int w = texSize.x * 4; - vec2 st = vec2(float(integerMod(index, w)), float(index / w)) + 0.5; - vec4 texel = texture(tex, st / vec2(texSize.x * 4, texSize.y)); - return decode8(texel, index); -} - -float getMemoryOptimized32(sampler2D tex, ivec2 texSize, ivec3 texDim, int z, int y, int x) { - int index = x + (texDim.x * (y + (texDim.y * z))); - int channel = integerMod(index, 4); - index = index / 4; - int w = texSize.x; - vec2 st = vec2(float(integerMod(index, w)), float(index / w)) + 0.5; - index = index / 4; - vec4 texel = texture(tex, st / vec2(texSize)); - return texel[channel]; -} - -vec4 getImage2D(sampler2D tex, ivec2 texSize, ivec3 texDim, int z, int y, int x) { - int index = x + texDim.x * (y + texDim.y * z); - int w = texSize.x; - vec2 st = vec2(float(integerMod(index, w)), float(index / w)) + 0.5; - return texture(tex, st / vec2(texSize)); -} - -vec4 getImage3D(sampler2DArray tex, ivec2 texSize, ivec3 texDim, int z, int y, int x) { - int index = x + texDim.x * (y + texDim.y * z); - int w = texSize.x; - vec2 st = vec2(float(integerMod(index, w)), float(index / w)) + 0.5; - return texture(tex, vec3(st / vec2(texSize), z)); -} - -float getFloatFromSampler2D(sampler2D tex, ivec2 texSize, ivec3 texDim, int z, int y, int x) { - vec4 result = getImage2D(tex, texSize, texDim, z, y, x); - return result[0]; -} - -vec2 getVec2FromSampler2D(sampler2D tex, ivec2 texSize, ivec3 texDim, int z, int y, int x) { - vec4 result = getImage2D(tex, texSize, texDim, z, y, x); - return vec2(result[0], result[1]); -} - -vec2 getMemoryOptimizedVec2(sampler2D tex, ivec2 texSize, ivec3 texDim, int z, int y, int x) { - int index = x + texDim.x * (y + texDim.y * z); - int channel = integerMod(index, 2); - index = index / 2; - int w = texSize.x; - vec2 st = vec2(float(integerMod(index, w)), float(index / w)) + 0.5; - vec4 texel = texture(tex, st / vec2(texSize)); - if (channel == 0) return vec2(texel.r, texel.g); - if (channel == 1) return vec2(texel.b, texel.a); - return vec2(0.0, 0.0); -} - -vec3 getVec3FromSampler2D(sampler2D tex, ivec2 texSize, ivec3 texDim, int z, int y, int x) { - vec4 result = getImage2D(tex, texSize, texDim, z, y, x); - return vec3(result[0], result[1], result[2]); -} - -vec3 getMemoryOptimizedVec3(sampler2D tex, ivec2 texSize, ivec3 texDim, int z, int y, int x) { - int fieldIndex = 3 * (x + texDim.x * (y + texDim.y * z)); - int vectorIndex = fieldIndex / 4; - int vectorOffset = fieldIndex - vectorIndex * 4; - int readY = vectorIndex / texSize.x; - int readX = vectorIndex - readY * texSize.x; - vec4 tex1 = texture(tex, (vec2(readX, readY) + 0.5) / vec2(texSize)); - - if (vectorOffset == 0) { - return tex1.xyz; - } else if (vectorOffset == 1) { - return tex1.yzw; - } else { - readX++; - if (readX >= texSize.x) { - readX = 0; - readY++; - } - vec4 tex2 = texture(tex, vec2(readX, readY) / vec2(texSize)); - if (vectorOffset == 2) { - return vec3(tex1.z, tex1.w, tex2.x); - } else { - return vec3(tex1.w, tex2.x, tex2.y); - } - } -} - -vec4 getVec4FromSampler2D(sampler2D tex, ivec2 texSize, ivec3 texDim, int z, int y, int x) { - return getImage2D(tex, texSize, texDim, z, y, x); -} - -vec4 getMemoryOptimizedVec4(sampler2D tex, ivec2 texSize, ivec3 texDim, int z, int y, int x) { - int index = x + texDim.x * (y + texDim.y * z); - int channel = integerMod(index, 2); - int w = texSize.x; - vec2 st = vec2(float(integerMod(index, w)), float(index / w)) + 0.5; - vec4 texel = texture(tex, st / vec2(texSize)); - return vec4(texel.r, texel.g, texel.b, texel.a); -} - -vec4 actualColor; -void color(float r, float g, float b, float a) { - actualColor = vec4(r,g,b,a); -} - -void color(float r, float g, float b) { - color(r,g,b,1.0); -} - -float modulo(float number, float divisor) { - if (number < 0.0) { - number = abs(number); - if (divisor < 0.0) { - divisor = abs(divisor); - } - return -mod(number, divisor); - } - if (divisor < 0.0) { - divisor = abs(divisor); - } - return mod(number, divisor); -} - -__INJECTED_NATIVE__; -__MAIN_CONSTANTS__; -__MAIN_ARGUMENTS__; -__KERNEL__; - -void main(void) { - index = int(vTexCoord.s * float(uTexSize.x)) + int(vTexCoord.t * float(uTexSize.y)) * uTexSize.x; - __MAIN_RESULT__; -}`; - -module.exports = { - fragmentShader -}; -},{}],73:[function(require,module,exports){ -const { utils } = require('../../utils'); -const { WebGLFunctionNode } = require('../web-gl/function-node'); - -class WebGL2FunctionNode extends WebGLFunctionNode { - - astIdentifierExpression(idtNode, retArr) { - if (idtNode.type !== 'Identifier') { - throw this.astErrorOutput( - 'IdentifierExpression - not an Identifier', - idtNode - ); - } - - const type = this.getType(idtNode); - - const name = utils.sanitizeName(idtNode.name); - if (idtNode.name === 'Infinity') { - retArr.push('intBitsToFloat(2139095039)'); - } else if (type === 'Boolean') { - if (this.argumentNames.indexOf(name) > -1) { - retArr.push(`bool(user_${name})`); - } else { - retArr.push(`user_${name}`); - } - } else { - retArr.push(`user_${name}`); - } - - return retArr; - } -} - -module.exports = { - WebGL2FunctionNode -}; -},{"../../utils":114,"../web-gl/function-node":38}],74:[function(require,module,exports){ -const { WebGL2KernelValueBoolean } = require('./kernel-value/boolean'); -const { WebGL2KernelValueFloat } = require('./kernel-value/float'); -const { WebGL2KernelValueInteger } = require('./kernel-value/integer'); - -const { WebGL2KernelValueHTMLImage } = require('./kernel-value/html-image'); -const { WebGL2KernelValueDynamicHTMLImage } = require('./kernel-value/dynamic-html-image'); - -const { WebGL2KernelValueHTMLImageArray } = require('./kernel-value/html-image-array'); -const { WebGL2KernelValueDynamicHTMLImageArray } = require('./kernel-value/dynamic-html-image-array'); - -const { WebGL2KernelValueHTMLVideo } = require('./kernel-value/html-video'); -const { WebGL2KernelValueDynamicHTMLVideo } = require('./kernel-value/dynamic-html-video'); - -const { WebGL2KernelValueSingleInput } = require('./kernel-value/single-input'); -const { WebGL2KernelValueDynamicSingleInput } = require('./kernel-value/dynamic-single-input'); - -const { WebGL2KernelValueUnsignedInput } = require('./kernel-value/unsigned-input'); -const { WebGL2KernelValueDynamicUnsignedInput } = require('./kernel-value/dynamic-unsigned-input'); - -const { WebGL2KernelValueMemoryOptimizedNumberTexture } = require('./kernel-value/memory-optimized-number-texture'); -const { WebGL2KernelValueDynamicMemoryOptimizedNumberTexture } = require('./kernel-value/dynamic-memory-optimized-number-texture'); - -const { WebGL2KernelValueNumberTexture } = require('./kernel-value/number-texture'); -const { WebGL2KernelValueDynamicNumberTexture } = require('./kernel-value/dynamic-number-texture'); - -const { WebGL2KernelValueSingleArray } = require('./kernel-value/single-array'); -const { WebGL2KernelValueDynamicSingleArray } = require('./kernel-value/dynamic-single-array'); - -const { WebGL2KernelValueSingleArray1DI } = require('./kernel-value/single-array1d-i'); -const { WebGL2KernelValueDynamicSingleArray1DI } = require('./kernel-value/dynamic-single-array1d-i'); - -const { WebGL2KernelValueSingleArray2DI } = require('./kernel-value/single-array2d-i'); -const { WebGL2KernelValueDynamicSingleArray2DI } = require('./kernel-value/dynamic-single-array2d-i'); - -const { WebGL2KernelValueSingleArray3DI } = require('./kernel-value/single-array3d-i'); -const { WebGL2KernelValueDynamicSingleArray3DI } = require('./kernel-value/dynamic-single-array3d-i'); - -const { WebGL2KernelValueArray2 } = require('./kernel-value/array2'); -const { WebGL2KernelValueArray3 } = require('./kernel-value/array3'); -const { WebGL2KernelValueArray4 } = require('./kernel-value/array4'); - -const { WebGL2KernelValueUnsignedArray } = require('./kernel-value/unsigned-array'); -const { WebGL2KernelValueDynamicUnsignedArray } = require('./kernel-value/dynamic-unsigned-array'); - -const kernelValueMaps = { - unsigned: { - dynamic: { - 'Boolean': WebGL2KernelValueBoolean, - 'Integer': WebGL2KernelValueInteger, - 'Float': WebGL2KernelValueFloat, - 'Array': WebGL2KernelValueDynamicUnsignedArray, - 'Array(2)': WebGL2KernelValueArray2, - 'Array(3)': WebGL2KernelValueArray3, - 'Array(4)': WebGL2KernelValueArray4, - 'Array1D(2)': false, - 'Array1D(3)': false, - 'Array1D(4)': false, - 'Array2D(2)': false, - 'Array2D(3)': false, - 'Array2D(4)': false, - 'Array3D(2)': false, - 'Array3D(3)': false, - 'Array3D(4)': false, - 'Input': WebGL2KernelValueDynamicUnsignedInput, - 'NumberTexture': WebGL2KernelValueDynamicNumberTexture, - 'ArrayTexture(1)': WebGL2KernelValueDynamicNumberTexture, - 'ArrayTexture(2)': WebGL2KernelValueDynamicNumberTexture, - 'ArrayTexture(3)': WebGL2KernelValueDynamicNumberTexture, - 'ArrayTexture(4)': WebGL2KernelValueDynamicNumberTexture, - 'MemoryOptimizedNumberTexture': WebGL2KernelValueDynamicMemoryOptimizedNumberTexture, - 'HTMLCanvas': WebGL2KernelValueDynamicHTMLImage, - 'OffscreenCanvas': WebGL2KernelValueDynamicHTMLImage, - 'HTMLImage': WebGL2KernelValueDynamicHTMLImage, - 'ImageBitmap': WebGL2KernelValueDynamicHTMLImage, - 'ImageData': WebGL2KernelValueDynamicHTMLImage, - 'HTMLImageArray': WebGL2KernelValueDynamicHTMLImageArray, - 'HTMLVideo': WebGL2KernelValueDynamicHTMLVideo, - }, - static: { - 'Boolean': WebGL2KernelValueBoolean, - 'Float': WebGL2KernelValueFloat, - 'Integer': WebGL2KernelValueInteger, - 'Array': WebGL2KernelValueUnsignedArray, - 'Array(2)': WebGL2KernelValueArray2, - 'Array(3)': WebGL2KernelValueArray3, - 'Array(4)': WebGL2KernelValueArray4, - 'Array1D(2)': false, - 'Array1D(3)': false, - 'Array1D(4)': false, - 'Array2D(2)': false, - 'Array2D(3)': false, - 'Array2D(4)': false, - 'Array3D(2)': false, - 'Array3D(3)': false, - 'Array3D(4)': false, - 'Input': WebGL2KernelValueUnsignedInput, - 'NumberTexture': WebGL2KernelValueNumberTexture, - 'ArrayTexture(1)': WebGL2KernelValueNumberTexture, - 'ArrayTexture(2)': WebGL2KernelValueNumberTexture, - 'ArrayTexture(3)': WebGL2KernelValueNumberTexture, - 'ArrayTexture(4)': WebGL2KernelValueNumberTexture, - 'MemoryOptimizedNumberTexture': WebGL2KernelValueDynamicMemoryOptimizedNumberTexture, - 'HTMLCanvas': WebGL2KernelValueHTMLImage, - 'OffscreenCanvas': WebGL2KernelValueHTMLImage, - 'HTMLImage': WebGL2KernelValueHTMLImage, - 'ImageBitmap': WebGL2KernelValueHTMLImage, - 'ImageData': WebGL2KernelValueHTMLImage, - 'HTMLImageArray': WebGL2KernelValueHTMLImageArray, - 'HTMLVideo': WebGL2KernelValueHTMLVideo, - } - }, - single: { - dynamic: { - 'Boolean': WebGL2KernelValueBoolean, - 'Integer': WebGL2KernelValueInteger, - 'Float': WebGL2KernelValueFloat, - 'Array': WebGL2KernelValueDynamicSingleArray, - 'Array(2)': WebGL2KernelValueArray2, - 'Array(3)': WebGL2KernelValueArray3, - 'Array(4)': WebGL2KernelValueArray4, - 'Array1D(2)': WebGL2KernelValueDynamicSingleArray1DI, - 'Array1D(3)': WebGL2KernelValueDynamicSingleArray1DI, - 'Array1D(4)': WebGL2KernelValueDynamicSingleArray1DI, - 'Array2D(2)': WebGL2KernelValueDynamicSingleArray2DI, - 'Array2D(3)': WebGL2KernelValueDynamicSingleArray2DI, - 'Array2D(4)': WebGL2KernelValueDynamicSingleArray2DI, - 'Array3D(2)': WebGL2KernelValueDynamicSingleArray3DI, - 'Array3D(3)': WebGL2KernelValueDynamicSingleArray3DI, - 'Array3D(4)': WebGL2KernelValueDynamicSingleArray3DI, - 'Input': WebGL2KernelValueDynamicSingleInput, - 'NumberTexture': WebGL2KernelValueDynamicNumberTexture, - 'ArrayTexture(1)': WebGL2KernelValueDynamicNumberTexture, - 'ArrayTexture(2)': WebGL2KernelValueDynamicNumberTexture, - 'ArrayTexture(3)': WebGL2KernelValueDynamicNumberTexture, - 'ArrayTexture(4)': WebGL2KernelValueDynamicNumberTexture, - 'MemoryOptimizedNumberTexture': WebGL2KernelValueDynamicMemoryOptimizedNumberTexture, - 'HTMLCanvas': WebGL2KernelValueDynamicHTMLImage, - 'OffscreenCanvas': WebGL2KernelValueDynamicHTMLImage, - 'HTMLImage': WebGL2KernelValueDynamicHTMLImage, - 'ImageBitmap': WebGL2KernelValueDynamicHTMLImage, - 'ImageData': WebGL2KernelValueDynamicHTMLImage, - 'HTMLImageArray': WebGL2KernelValueDynamicHTMLImageArray, - 'HTMLVideo': WebGL2KernelValueDynamicHTMLVideo, - }, - static: { - 'Boolean': WebGL2KernelValueBoolean, - 'Float': WebGL2KernelValueFloat, - 'Integer': WebGL2KernelValueInteger, - 'Array': WebGL2KernelValueSingleArray, - 'Array(2)': WebGL2KernelValueArray2, - 'Array(3)': WebGL2KernelValueArray3, - 'Array(4)': WebGL2KernelValueArray4, - 'Array1D(2)': WebGL2KernelValueSingleArray1DI, - 'Array1D(3)': WebGL2KernelValueSingleArray1DI, - 'Array1D(4)': WebGL2KernelValueSingleArray1DI, - 'Array2D(2)': WebGL2KernelValueSingleArray2DI, - 'Array2D(3)': WebGL2KernelValueSingleArray2DI, - 'Array2D(4)': WebGL2KernelValueSingleArray2DI, - 'Array3D(2)': WebGL2KernelValueSingleArray3DI, - 'Array3D(3)': WebGL2KernelValueSingleArray3DI, - 'Array3D(4)': WebGL2KernelValueSingleArray3DI, - 'Input': WebGL2KernelValueSingleInput, - 'NumberTexture': WebGL2KernelValueNumberTexture, - 'ArrayTexture(1)': WebGL2KernelValueNumberTexture, - 'ArrayTexture(2)': WebGL2KernelValueNumberTexture, - 'ArrayTexture(3)': WebGL2KernelValueNumberTexture, - 'ArrayTexture(4)': WebGL2KernelValueNumberTexture, - 'MemoryOptimizedNumberTexture': WebGL2KernelValueMemoryOptimizedNumberTexture, - 'HTMLCanvas': WebGL2KernelValueHTMLImage, - 'OffscreenCanvas': WebGL2KernelValueHTMLImage, - 'HTMLImage': WebGL2KernelValueHTMLImage, - 'ImageBitmap': WebGL2KernelValueHTMLImage, - 'ImageData': WebGL2KernelValueHTMLImage, - 'HTMLImageArray': WebGL2KernelValueHTMLImageArray, - 'HTMLVideo': WebGL2KernelValueHTMLVideo, - } - }, -}; - -function lookupKernelValueType(type, dynamic, precision, value) { - if (!type) { - throw new Error('type missing'); - } - if (!dynamic) { - throw new Error('dynamic missing'); - } - if (!precision) { - throw new Error('precision missing'); - } - if (value.type) { - type = value.type; - } - const types = kernelValueMaps[precision][dynamic]; - if (types[type] === false) { - return null; - } else if (types[type] === undefined) { - throw new Error(`Could not find a KernelValue for ${ type }`); - } - return types[type]; -} - -module.exports = { - kernelValueMaps, - lookupKernelValueType -}; -},{"./kernel-value/array2":75,"./kernel-value/array3":76,"./kernel-value/array4":77,"./kernel-value/boolean":78,"./kernel-value/dynamic-html-image":80,"./kernel-value/dynamic-html-image-array":79,"./kernel-value/dynamic-html-video":81,"./kernel-value/dynamic-memory-optimized-number-texture":82,"./kernel-value/dynamic-number-texture":83,"./kernel-value/dynamic-single-array":84,"./kernel-value/dynamic-single-array1d-i":85,"./kernel-value/dynamic-single-array2d-i":86,"./kernel-value/dynamic-single-array3d-i":87,"./kernel-value/dynamic-single-input":88,"./kernel-value/dynamic-unsigned-array":89,"./kernel-value/dynamic-unsigned-input":90,"./kernel-value/float":91,"./kernel-value/html-image":93,"./kernel-value/html-image-array":92,"./kernel-value/html-video":94,"./kernel-value/integer":95,"./kernel-value/memory-optimized-number-texture":96,"./kernel-value/number-texture":97,"./kernel-value/single-array":98,"./kernel-value/single-array1d-i":99,"./kernel-value/single-array2d-i":100,"./kernel-value/single-array3d-i":101,"./kernel-value/single-input":102,"./kernel-value/unsigned-array":103,"./kernel-value/unsigned-input":104}],75:[function(require,module,exports){ -const { WebGLKernelValueArray2 } = require('../../web-gl/kernel-value/array2'); - -class WebGL2KernelValueArray2 extends WebGLKernelValueArray2 {} - -module.exports = { - WebGL2KernelValueArray2 -}; -},{"../../web-gl/kernel-value/array2":41}],76:[function(require,module,exports){ -const { WebGLKernelValueArray3 } = require('../../web-gl/kernel-value/array3'); - -class WebGL2KernelValueArray3 extends WebGLKernelValueArray3 {} - -module.exports = { - WebGL2KernelValueArray3 -}; -},{"../../web-gl/kernel-value/array3":42}],77:[function(require,module,exports){ -const { WebGLKernelValueArray4 } = require('../../web-gl/kernel-value/array4'); - -class WebGL2KernelValueArray4 extends WebGLKernelValueArray4 {} - -module.exports = { - WebGL2KernelValueArray4 -}; -},{"../../web-gl/kernel-value/array4":43}],78:[function(require,module,exports){ -const { WebGLKernelValueBoolean } = require('../../web-gl/kernel-value/boolean'); - -class WebGL2KernelValueBoolean extends WebGLKernelValueBoolean {} - -module.exports = { - WebGL2KernelValueBoolean -}; -},{"../../web-gl/kernel-value/boolean":44}],79:[function(require,module,exports){ -const { utils } = require('../../../utils'); -const { WebGL2KernelValueHTMLImageArray } = require('./html-image-array'); - -class WebGL2KernelValueDynamicHTMLImageArray extends WebGL2KernelValueHTMLImageArray { - getSource() { - const variablePrecision = this.getVariablePrecisionString(); - return utils.linesToString([ - `uniform ${ variablePrecision } sampler2DArray ${this.id}`, - `uniform ${ variablePrecision } ivec2 ${this.sizeId}`, - `uniform ${ variablePrecision } ivec3 ${this.dimensionsId}`, - ]); - } - - updateValue(images) { - const { width, height } = images[0]; - this.checkSize(width, height); - this.dimensions = [width, height, images.length]; - this.textureSize = [width, height]; - this.kernel.setUniform3iv(this.dimensionsId, this.dimensions); - this.kernel.setUniform2iv(this.sizeId, this.textureSize); - super.updateValue(images); - } -} - -module.exports = { - WebGL2KernelValueDynamicHTMLImageArray -}; -},{"../../../utils":114,"./html-image-array":92}],80:[function(require,module,exports){ -const { utils } = require('../../../utils'); -const { WebGLKernelValueDynamicHTMLImage } = require('../../web-gl/kernel-value/dynamic-html-image'); - -class WebGL2KernelValueDynamicHTMLImage extends WebGLKernelValueDynamicHTMLImage { - getSource() { - const variablePrecision = this.getVariablePrecisionString(); - return utils.linesToString([ - `uniform ${ variablePrecision } sampler2D ${this.id}`, - `uniform ${ variablePrecision } ivec2 ${this.sizeId}`, - `uniform ${ variablePrecision } ivec3 ${this.dimensionsId}`, - ]); - } -} - -module.exports = { - WebGL2KernelValueDynamicHTMLImage -}; -},{"../../../utils":114,"../../web-gl/kernel-value/dynamic-html-image":45}],81:[function(require,module,exports){ -const { utils } = require('../../../utils'); -const { WebGL2KernelValueDynamicHTMLImage } = require('./dynamic-html-image'); - -class WebGL2KernelValueDynamicHTMLVideo extends WebGL2KernelValueDynamicHTMLImage {} - -module.exports = { - WebGL2KernelValueDynamicHTMLVideo -}; -},{"../../../utils":114,"./dynamic-html-image":80}],82:[function(require,module,exports){ -const { utils } = require('../../../utils'); -const { WebGLKernelValueDynamicMemoryOptimizedNumberTexture } = require('../../web-gl/kernel-value/dynamic-memory-optimized-number-texture'); - -class WebGL2KernelValueDynamicMemoryOptimizedNumberTexture extends WebGLKernelValueDynamicMemoryOptimizedNumberTexture { - getSource() { - return utils.linesToString([ - `uniform sampler2D ${this.id}`, - `uniform ivec2 ${this.sizeId}`, - `uniform ivec3 ${this.dimensionsId}`, - ]); - } -} - -module.exports = { - WebGL2KernelValueDynamicMemoryOptimizedNumberTexture -}; -},{"../../../utils":114,"../../web-gl/kernel-value/dynamic-memory-optimized-number-texture":47}],83:[function(require,module,exports){ -const { utils } = require('../../../utils'); -const { WebGLKernelValueDynamicNumberTexture } = require('../../web-gl/kernel-value/dynamic-number-texture'); - -class WebGL2KernelValueDynamicNumberTexture extends WebGLKernelValueDynamicNumberTexture { - getSource() { - const variablePrecision = this.getVariablePrecisionString(); - return utils.linesToString([ - `uniform ${ variablePrecision } sampler2D ${this.id}`, - `uniform ${ variablePrecision } ivec2 ${this.sizeId}`, - `uniform ${ variablePrecision } ivec3 ${this.dimensionsId}`, - ]); - } -} - -module.exports = { - WebGL2KernelValueDynamicNumberTexture -}; -},{"../../../utils":114,"../../web-gl/kernel-value/dynamic-number-texture":48}],84:[function(require,module,exports){ -const { utils } = require('../../../utils'); -const { WebGL2KernelValueSingleArray } = require('../../web-gl2/kernel-value/single-array'); - -class WebGL2KernelValueDynamicSingleArray extends WebGL2KernelValueSingleArray { - getSource() { - const variablePrecision = this.getVariablePrecisionString(); - return utils.linesToString([ - `uniform ${ variablePrecision } sampler2D ${this.id}`, - `uniform ${ variablePrecision } ivec2 ${this.sizeId}`, - `uniform ${ variablePrecision } ivec3 ${this.dimensionsId}`, - ]); - } - - updateValue(value) { - this.dimensions = utils.getDimensions(value, true); - this.textureSize = utils.getMemoryOptimizedFloatTextureSize(this.dimensions, this.bitRatio); - this.uploadArrayLength = this.textureSize[0] * this.textureSize[1] * this.bitRatio; - this.checkSize(this.textureSize[0], this.textureSize[1]); - this.uploadValue = new Float32Array(this.uploadArrayLength); - this.kernel.setUniform3iv(this.dimensionsId, this.dimensions); - this.kernel.setUniform2iv(this.sizeId, this.textureSize); - super.updateValue(value); - } -} - -module.exports = { - WebGL2KernelValueDynamicSingleArray -}; -},{"../../../utils":114,"../../web-gl2/kernel-value/single-array":98}],85:[function(require,module,exports){ -const { utils } = require('../../../utils'); -const { WebGL2KernelValueSingleArray1DI } = require('../../web-gl2/kernel-value/single-array1d-i'); - -class WebGL2KernelValueDynamicSingleArray1DI extends WebGL2KernelValueSingleArray1DI { - getSource() { - const variablePrecision = this.getVariablePrecisionString(); - return utils.linesToString([ - `uniform ${ variablePrecision } sampler2D ${this.id}`, - `uniform ${ variablePrecision } ivec2 ${this.sizeId}`, - `uniform ${ variablePrecision } ivec3 ${this.dimensionsId}`, - ]); - } - - updateValue(value) { - this.setShape(value); - this.kernel.setUniform3iv(this.dimensionsId, this.dimensions); - this.kernel.setUniform2iv(this.sizeId, this.textureSize); - super.updateValue(value); - } -} - -module.exports = { - WebGL2KernelValueDynamicSingleArray1DI -}; -},{"../../../utils":114,"../../web-gl2/kernel-value/single-array1d-i":99}],86:[function(require,module,exports){ -const { utils } = require('../../../utils'); -const { WebGL2KernelValueSingleArray2DI } = require('../../web-gl2/kernel-value/single-array2d-i'); - -class WebGL2KernelValueDynamicSingleArray2DI extends WebGL2KernelValueSingleArray2DI { - getSource() { - const variablePrecision = this.getVariablePrecisionString(); - return utils.linesToString([ - `uniform ${ variablePrecision } sampler2D ${this.id}`, - `uniform ${ variablePrecision } ivec2 ${this.sizeId}`, - `uniform ${ variablePrecision } ivec3 ${this.dimensionsId}`, - ]); - } - - updateValue(value) { - this.setShape(value); - this.kernel.setUniform3iv(this.dimensionsId, this.dimensions); - this.kernel.setUniform2iv(this.sizeId, this.textureSize); - super.updateValue(value); - } -} - -module.exports = { - WebGL2KernelValueDynamicSingleArray2DI -}; -},{"../../../utils":114,"../../web-gl2/kernel-value/single-array2d-i":100}],87:[function(require,module,exports){ -const { utils } = require('../../../utils'); -const { WebGL2KernelValueSingleArray3DI } = require('../../web-gl2/kernel-value/single-array3d-i'); - -class WebGL2KernelValueDynamicSingleArray3DI extends WebGL2KernelValueSingleArray3DI { - getSource() { - const variablePrecision = this.getVariablePrecisionString(); - return utils.linesToString([ - `uniform ${ variablePrecision } sampler2D ${this.id}`, - `uniform ${ variablePrecision } ivec2 ${this.sizeId}`, - `uniform ${ variablePrecision } ivec3 ${this.dimensionsId}`, - ]); - } - - updateValue(value) { - this.setShape(value); - this.kernel.setUniform3iv(this.dimensionsId, this.dimensions); - this.kernel.setUniform2iv(this.sizeId, this.textureSize); - super.updateValue(value); - } -} - -module.exports = { - WebGL2KernelValueDynamicSingleArray3DI -}; -},{"../../../utils":114,"../../web-gl2/kernel-value/single-array3d-i":101}],88:[function(require,module,exports){ -const { utils } = require('../../../utils'); -const { WebGL2KernelValueSingleInput } = require('../../web-gl2/kernel-value/single-input'); - -class WebGL2KernelValueDynamicSingleInput extends WebGL2KernelValueSingleInput { - getSource() { - const variablePrecision = this.getVariablePrecisionString(); - return utils.linesToString([ - `uniform ${ variablePrecision } sampler2D ${this.id}`, - `uniform ${ variablePrecision } ivec2 ${this.sizeId}`, - `uniform ${ variablePrecision } ivec3 ${this.dimensionsId}`, - ]); - } - - updateValue(value) { - let [w, h, d] = value.size; - this.dimensions = new Int32Array([w || 1, h || 1, d || 1]); - this.textureSize = utils.getMemoryOptimizedFloatTextureSize(this.dimensions, this.bitRatio); - this.uploadArrayLength = this.textureSize[0] * this.textureSize[1] * this.bitRatio; - this.checkSize(this.textureSize[0], this.textureSize[1]); - this.uploadValue = new Float32Array(this.uploadArrayLength); - this.kernel.setUniform3iv(this.dimensionsId, this.dimensions); - this.kernel.setUniform2iv(this.sizeId, this.textureSize); - super.updateValue(value); - } -} - -module.exports = { - WebGL2KernelValueDynamicSingleInput -}; -},{"../../../utils":114,"../../web-gl2/kernel-value/single-input":102}],89:[function(require,module,exports){ -const { utils } = require('../../../utils'); -const { WebGLKernelValueDynamicUnsignedArray } = require('../../web-gl/kernel-value/dynamic-unsigned-array'); - -class WebGL2KernelValueDynamicUnsignedArray extends WebGLKernelValueDynamicUnsignedArray { - getSource() { - const variablePrecision = this.getVariablePrecisionString(); - return utils.linesToString([ - `uniform ${ variablePrecision } sampler2D ${this.id}`, - `uniform ${ variablePrecision } ivec2 ${this.sizeId}`, - `uniform ${ variablePrecision } ivec3 ${this.dimensionsId}`, - ]); - } -} - -module.exports = { - WebGL2KernelValueDynamicUnsignedArray -}; -},{"../../../utils":114,"../../web-gl/kernel-value/dynamic-unsigned-array":54}],90:[function(require,module,exports){ -const { utils } = require('../../../utils'); -const { WebGLKernelValueDynamicUnsignedInput } = require('../../web-gl/kernel-value/dynamic-unsigned-input'); - -class WebGL2KernelValueDynamicUnsignedInput extends WebGLKernelValueDynamicUnsignedInput { - getSource() { - const variablePrecision = this.getVariablePrecisionString(); - return utils.linesToString([ - `uniform ${ variablePrecision } sampler2D ${this.id}`, - `uniform ${ variablePrecision } ivec2 ${this.sizeId}`, - `uniform ${ variablePrecision } ivec3 ${this.dimensionsId}`, - ]); - } -} - -module.exports = { - WebGL2KernelValueDynamicUnsignedInput -}; -},{"../../../utils":114,"../../web-gl/kernel-value/dynamic-unsigned-input":55}],91:[function(require,module,exports){ -const { utils } = require('../../../utils'); -const { WebGLKernelValueFloat } = require('../../web-gl/kernel-value/float'); - -class WebGL2KernelValueFloat extends WebGLKernelValueFloat {} - -module.exports = { - WebGL2KernelValueFloat -}; -},{"../../../utils":114,"../../web-gl/kernel-value/float":56}],92:[function(require,module,exports){ -const { utils } = require('../../../utils'); -const { WebGLKernelArray } = require('../../web-gl/kernel-value/array'); - -class WebGL2KernelValueHTMLImageArray extends WebGLKernelArray { - constructor(value, settings) { - super(value, settings); - this.checkSize(value[0].width, value[0].height); - this.dimensions = [value[0].width, value[0].height, value.length]; - this.textureSize = [value[0].width, value[0].height]; - } - defineTexture() { - const { context: gl } = this; - gl.activeTexture(this.contextHandle); - gl.bindTexture(gl.TEXTURE_2D_ARRAY, this.texture); - gl.texParameteri(gl.TEXTURE_2D_ARRAY, gl.TEXTURE_MAG_FILTER, gl.NEAREST); - gl.texParameteri(gl.TEXTURE_2D_ARRAY, gl.TEXTURE_MIN_FILTER, gl.NEAREST); - } - - getStringValueHandler() { - return `const uploadValue_${this.name} = ${this.varName};\n`; - } - getSource() { - const variablePrecision = this.getVariablePrecisionString(); - return utils.linesToString([ - `uniform ${ variablePrecision } sampler2DArray ${this.id}`, - `${ variablePrecision } ivec2 ${this.sizeId} = ivec2(${this.textureSize[0]}, ${this.textureSize[1]})`, - `${ variablePrecision } ivec3 ${this.dimensionsId} = ivec3(${this.dimensions[0]}, ${this.dimensions[1]}, ${this.dimensions[2]})`, - ]); - } - - updateValue(images) { - const { context: gl } = this; - gl.activeTexture(this.contextHandle); - gl.bindTexture(gl.TEXTURE_2D_ARRAY, this.texture); - gl.pixelStorei(gl.UNPACK_FLIP_Y_WEBGL, true); - gl.texImage3D( - gl.TEXTURE_2D_ARRAY, - 0, - gl.RGBA, - images[0].width, - images[0].height, - images.length, - 0, - gl.RGBA, - gl.UNSIGNED_BYTE, - null - ); - for (let i = 0; i < images.length; i++) { - const xOffset = 0; - const yOffset = 0; - const imageDepth = 1; - gl.texSubImage3D( - gl.TEXTURE_2D_ARRAY, - 0, - xOffset, - yOffset, - i, - images[i].width, - images[i].height, - imageDepth, - gl.RGBA, - gl.UNSIGNED_BYTE, - this.uploadValue = images[i] - ); - } - this.kernel.setUniform1i(this.id, this.index); - } -} - -module.exports = { - WebGL2KernelValueHTMLImageArray -}; -},{"../../../utils":114,"../../web-gl/kernel-value/array":40}],93:[function(require,module,exports){ -const { utils } = require('../../../utils'); -const { WebGLKernelValueHTMLImage } = require('../../web-gl/kernel-value/html-image'); - -class WebGL2KernelValueHTMLImage extends WebGLKernelValueHTMLImage { - getSource() { - const variablePrecision = this.getVariablePrecisionString(); - return utils.linesToString([ - `uniform ${ variablePrecision } sampler2D ${this.id}`, - `${ variablePrecision } ivec2 ${this.sizeId} = ivec2(${this.textureSize[0]}, ${this.textureSize[1]})`, - `${ variablePrecision } ivec3 ${this.dimensionsId} = ivec3(${this.dimensions[0]}, ${this.dimensions[1]}, ${this.dimensions[2]})`, - ]); - } -} - -module.exports = { - WebGL2KernelValueHTMLImage -}; -},{"../../../utils":114,"../../web-gl/kernel-value/html-image":57}],94:[function(require,module,exports){ -const { utils } = require('../../../utils'); -const { WebGL2KernelValueHTMLImage } = require('./html-image'); - -class WebGL2KernelValueHTMLVideo extends WebGL2KernelValueHTMLImage {} - -module.exports = { - WebGL2KernelValueHTMLVideo -}; -},{"../../../utils":114,"./html-image":93}],95:[function(require,module,exports){ -const { WebGLKernelValueInteger } = require('../../web-gl/kernel-value/integer'); - -class WebGL2KernelValueInteger extends WebGLKernelValueInteger { - getSource(value) { - const variablePrecision = this.getVariablePrecisionString(); - if (this.origin === 'constants') { - return `const ${ variablePrecision } int ${this.id} = ${ parseInt(value) };\n`; - } - return `uniform ${ variablePrecision } int ${this.id};\n`; - } - - updateValue(value) { - if (this.origin === 'constants') return; - this.kernel.setUniform1i(this.id, this.uploadValue = value); - } -} - -module.exports = { - WebGL2KernelValueInteger -}; -},{"../../web-gl/kernel-value/integer":60}],96:[function(require,module,exports){ -const { utils } = require('../../../utils'); -const { WebGLKernelValueMemoryOptimizedNumberTexture } = require('../../web-gl/kernel-value/memory-optimized-number-texture'); - -class WebGL2KernelValueMemoryOptimizedNumberTexture extends WebGLKernelValueMemoryOptimizedNumberTexture { - getSource() { - const { id, sizeId, textureSize, dimensionsId, dimensions } = this; - const variablePrecision = this.getVariablePrecisionString(); - return utils.linesToString([ - `uniform sampler2D ${id}`, - `${ variablePrecision } ivec2 ${sizeId} = ivec2(${textureSize[0]}, ${textureSize[1]})`, - `${ variablePrecision } ivec3 ${dimensionsId} = ivec3(${dimensions[0]}, ${dimensions[1]}, ${dimensions[2]})`, - ]); - } -} - -module.exports = { - WebGL2KernelValueMemoryOptimizedNumberTexture -}; -},{"../../../utils":114,"../../web-gl/kernel-value/memory-optimized-number-texture":61}],97:[function(require,module,exports){ -const { utils } = require('../../../utils'); -const { WebGLKernelValueNumberTexture } = require('../../web-gl/kernel-value/number-texture'); - -class WebGL2KernelValueNumberTexture extends WebGLKernelValueNumberTexture { - getSource() { - const { id, sizeId, textureSize, dimensionsId, dimensions } = this; - const variablePrecision = this.getVariablePrecisionString(); - return utils.linesToString([ - `uniform ${ variablePrecision } sampler2D ${id}`, - `${ variablePrecision } ivec2 ${sizeId} = ivec2(${textureSize[0]}, ${textureSize[1]})`, - `${ variablePrecision } ivec3 ${dimensionsId} = ivec3(${dimensions[0]}, ${dimensions[1]}, ${dimensions[2]})`, - ]); - } -} - -module.exports = { - WebGL2KernelValueNumberTexture -}; -},{"../../../utils":114,"../../web-gl/kernel-value/number-texture":62}],98:[function(require,module,exports){ -const { utils } = require('../../../utils'); -const { WebGLKernelValueSingleArray } = require('../../web-gl/kernel-value/single-array'); - -class WebGL2KernelValueSingleArray extends WebGLKernelValueSingleArray { - getSource() { - const variablePrecision = this.getVariablePrecisionString(); - return utils.linesToString([ - `uniform ${ variablePrecision } sampler2D ${this.id}`, - `${ variablePrecision } ivec2 ${this.sizeId} = ivec2(${this.textureSize[0]}, ${this.textureSize[1]})`, - `${ variablePrecision } ivec3 ${this.dimensionsId} = ivec3(${this.dimensions[0]}, ${this.dimensions[1]}, ${this.dimensions[2]})`, - ]); - } - - updateValue(value) { - if (value.constructor !== this.initialValueConstructor) { - this.onUpdateValueMismatch(value.constructor); - return; - } - const { context: gl } = this; - utils.flattenTo(value, this.uploadValue); - gl.activeTexture(this.contextHandle); - gl.bindTexture(gl.TEXTURE_2D, this.texture); - gl.pixelStorei(gl.UNPACK_FLIP_Y_WEBGL, false); - gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA32F, this.textureSize[0], this.textureSize[1], 0, gl.RGBA, gl.FLOAT, this.uploadValue); - this.kernel.setUniform1i(this.id, this.index); - } -} - -module.exports = { - WebGL2KernelValueSingleArray -}; -},{"../../../utils":114,"../../web-gl/kernel-value/single-array":63}],99:[function(require,module,exports){ -const { utils } = require('../../../utils'); -const { WebGLKernelValueSingleArray1DI } = require('../../web-gl/kernel-value/single-array1d-i'); - -class WebGL2KernelValueSingleArray1DI extends WebGLKernelValueSingleArray1DI { - updateValue(value) { - if (value.constructor !== this.initialValueConstructor) { - this.onUpdateValueMismatch(value.constructor); - return; - } - const { context: gl } = this; - utils.flattenTo(value, this.uploadValue); - gl.activeTexture(this.contextHandle); - gl.bindTexture(gl.TEXTURE_2D, this.texture); - gl.pixelStorei(gl.UNPACK_FLIP_Y_WEBGL, false); - gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA32F, this.textureSize[0], this.textureSize[1], 0, gl.RGBA, gl.FLOAT, this.uploadValue); - this.kernel.setUniform1i(this.id, this.index); - } -} - -module.exports = { - WebGL2KernelValueSingleArray1DI -}; -},{"../../../utils":114,"../../web-gl/kernel-value/single-array1d-i":64}],100:[function(require,module,exports){ -const { utils } = require('../../../utils'); -const { WebGLKernelValueSingleArray2DI } = require('../../web-gl/kernel-value/single-array2d-i'); - -class WebGL2KernelValueSingleArray2DI extends WebGLKernelValueSingleArray2DI { - updateValue(value) { - if (value.constructor !== this.initialValueConstructor) { - this.onUpdateValueMismatch(value.constructor); - return; - } - const { context: gl } = this; - utils.flattenTo(value, this.uploadValue); - gl.activeTexture(this.contextHandle); - gl.bindTexture(gl.TEXTURE_2D, this.texture); - gl.pixelStorei(gl.UNPACK_FLIP_Y_WEBGL, false); - gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA32F, this.textureSize[0], this.textureSize[1], 0, gl.RGBA, gl.FLOAT, this.uploadValue); - this.kernel.setUniform1i(this.id, this.index); - } -} - -module.exports = { - WebGL2KernelValueSingleArray2DI -}; -},{"../../../utils":114,"../../web-gl/kernel-value/single-array2d-i":65}],101:[function(require,module,exports){ -const { utils } = require('../../../utils'); -const { WebGLKernelValueSingleArray3DI } = require('../../web-gl/kernel-value/single-array3d-i'); - -class WebGL2KernelValueSingleArray3DI extends WebGLKernelValueSingleArray3DI { - updateValue(value) { - if (value.constructor !== this.initialValueConstructor) { - this.onUpdateValueMismatch(value.constructor); - return; - } - const { context: gl } = this; - utils.flattenTo(value, this.uploadValue); - gl.activeTexture(this.contextHandle); - gl.bindTexture(gl.TEXTURE_2D, this.texture); - gl.pixelStorei(gl.UNPACK_FLIP_Y_WEBGL, false); - gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA32F, this.textureSize[0], this.textureSize[1], 0, gl.RGBA, gl.FLOAT, this.uploadValue); - this.kernel.setUniform1i(this.id, this.index); - } -} - -module.exports = { - WebGL2KernelValueSingleArray3DI -}; -},{"../../../utils":114,"../../web-gl/kernel-value/single-array3d-i":66}],102:[function(require,module,exports){ -const { utils } = require('../../../utils'); -const { WebGLKernelValueSingleInput } = require('../../web-gl/kernel-value/single-input'); - -class WebGL2KernelValueSingleInput extends WebGLKernelValueSingleInput { - getSource() { - const variablePrecision = this.getVariablePrecisionString(); - return utils.linesToString([ - `uniform ${ variablePrecision } sampler2D ${this.id}`, - `${ variablePrecision } ivec2 ${this.sizeId} = ivec2(${this.textureSize[0]}, ${this.textureSize[1]})`, - `${ variablePrecision } ivec3 ${this.dimensionsId} = ivec3(${this.dimensions[0]}, ${this.dimensions[1]}, ${this.dimensions[2]})`, - ]); - } - - updateValue(input) { - const { context: gl } = this; - utils.flattenTo(input.value, this.uploadValue); - gl.activeTexture(this.contextHandle); - gl.bindTexture(gl.TEXTURE_2D, this.texture); - gl.pixelStorei(gl.UNPACK_FLIP_Y_WEBGL, false); - gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA32F, this.textureSize[0], this.textureSize[1], 0, gl.RGBA, gl.FLOAT, this.uploadValue); - this.kernel.setUniform1i(this.id, this.index); - } -} - -module.exports = { - WebGL2KernelValueSingleInput -}; -},{"../../../utils":114,"../../web-gl/kernel-value/single-input":67}],103:[function(require,module,exports){ -const { utils } = require('../../../utils'); -const { WebGLKernelValueUnsignedArray } = require('../../web-gl/kernel-value/unsigned-array'); - -class WebGL2KernelValueUnsignedArray extends WebGLKernelValueUnsignedArray { - getSource() { - const variablePrecision = this.getVariablePrecisionString(); - return utils.linesToString([ - `uniform ${ variablePrecision } sampler2D ${this.id}`, - `${ variablePrecision } ivec2 ${this.sizeId} = ivec2(${this.textureSize[0]}, ${this.textureSize[1]})`, - `${ variablePrecision } ivec3 ${this.dimensionsId} = ivec3(${this.dimensions[0]}, ${this.dimensions[1]}, ${this.dimensions[2]})`, - ]); - } -} - -module.exports = { - WebGL2KernelValueUnsignedArray -}; -},{"../../../utils":114,"../../web-gl/kernel-value/unsigned-array":68}],104:[function(require,module,exports){ -const { utils } = require('../../../utils'); -const { WebGLKernelValueUnsignedInput } = require('../../web-gl/kernel-value/unsigned-input'); - -class WebGL2KernelValueUnsignedInput extends WebGLKernelValueUnsignedInput { - getSource() { - const variablePrecision = this.getVariablePrecisionString(); - return utils.linesToString([ - `uniform ${ variablePrecision } sampler2D ${this.id}`, - `${ variablePrecision } ivec2 ${this.sizeId} = ivec2(${this.textureSize[0]}, ${this.textureSize[1]})`, - `${ variablePrecision } ivec3 ${this.dimensionsId} = ivec3(${this.dimensions[0]}, ${this.dimensions[1]}, ${this.dimensions[2]})`, - ]); - } -} - -module.exports = { - WebGL2KernelValueUnsignedInput -}; -},{"../../../utils":114,"../../web-gl/kernel-value/unsigned-input":69}],105:[function(require,module,exports){ -const { WebGLKernel } = require('../web-gl/kernel'); -const { WebGL2FunctionNode } = require('./function-node'); -const { FunctionBuilder } = require('../function-builder'); -const { utils } = require('../../utils'); -const { fragmentShader } = require('./fragment-shader'); -const { vertexShader } = require('./vertex-shader'); -const { lookupKernelValueType } = require('./kernel-value-maps'); - -let isSupported = null; -let testCanvas = null; -let testContext = null; -let testExtensions = null; - -let features = null; - -class WebGL2Kernel extends WebGLKernel { - static get isSupported() { - if (isSupported !== null) { - return isSupported; - } - this.setupFeatureChecks(); - isSupported = this.isContextMatch(testContext); - return isSupported; - } - - static setupFeatureChecks() { - if (typeof document !== 'undefined') { - testCanvas = document.createElement('canvas'); - } else if (typeof OffscreenCanvas !== 'undefined') { - testCanvas = new OffscreenCanvas(0, 0); - } - if (!testCanvas) return; - testContext = testCanvas.getContext('webgl2'); - if (!testContext || !testContext.getExtension) return; - testExtensions = { - EXT_color_buffer_float: testContext.getExtension('EXT_color_buffer_float'), - OES_texture_float_linear: testContext.getExtension('OES_texture_float_linear'), - }; - features = this.getFeatures(); - } - - static isContextMatch(context) { - if (typeof WebGL2RenderingContext !== 'undefined') { - return context instanceof WebGL2RenderingContext; - } - return false; - } - - static getFeatures() { - const gl = this.testContext; - return Object.freeze({ - isFloatRead: this.getIsFloatRead(), - isIntegerDivisionAccurate: this.getIsIntegerDivisionAccurate(), - isSpeedTacticSupported: this.getIsSpeedTacticSupported(), - kernelMap: true, - isTextureFloat: true, - isDrawBuffers: true, - channelCount: this.getChannelCount(), - maxTextureSize: this.getMaxTextureSize(), - lowIntPrecision: gl.getShaderPrecisionFormat(gl.FRAGMENT_SHADER, gl.LOW_INT), - lowFloatPrecision: gl.getShaderPrecisionFormat(gl.FRAGMENT_SHADER, gl.LOW_FLOAT), - mediumIntPrecision: gl.getShaderPrecisionFormat(gl.FRAGMENT_SHADER, gl.MEDIUM_INT), - mediumFloatPrecision: gl.getShaderPrecisionFormat(gl.FRAGMENT_SHADER, gl.MEDIUM_FLOAT), - highIntPrecision: gl.getShaderPrecisionFormat(gl.FRAGMENT_SHADER, gl.HIGH_INT), - highFloatPrecision: gl.getShaderPrecisionFormat(gl.FRAGMENT_SHADER, gl.HIGH_FLOAT), - }); - } - - static getIsTextureFloat() { - return true; - } - - static getChannelCount() { - return testContext.getParameter(testContext.MAX_DRAW_BUFFERS); - } - - static getMaxTextureSize() { - return testContext.getParameter(testContext.MAX_TEXTURE_SIZE); - } - - static lookupKernelValueType(type, dynamic, precision, value) { - return lookupKernelValueType(type, dynamic, precision, value); - } - - static get testCanvas() { - return testCanvas; - } - - static get testContext() { - return testContext; - } - - static get features() { - return features; - } - - static get fragmentShader() { - return fragmentShader; - } - static get vertexShader() { - return vertexShader; - } - - initContext() { - const settings = { - alpha: false, - depth: false, - antialias: false - }; - return this.canvas.getContext('webgl2', settings); - } - - initExtensions() { - this.extensions = { - EXT_color_buffer_float: this.context.getExtension('EXT_color_buffer_float'), - OES_texture_float_linear: this.context.getExtension('OES_texture_float_linear'), - }; - } - - validateSettings(args) { - if (!this.validate) { - this.texSize = utils.getKernelTextureSize({ - optimizeFloatMemory: this.optimizeFloatMemory, - precision: this.precision, - }, this.output); - return; - } - - const { features } = this.constructor; - if (this.precision === 'single' && !features.isFloatRead) { - throw new Error('Float texture outputs are not supported'); - } else if (!this.graphical && this.precision === null) { - this.precision = features.isFloatRead ? 'single' : 'unsigned'; - } - - if (this.fixIntegerDivisionAccuracy === null) { - this.fixIntegerDivisionAccuracy = !features.isIntegerDivisionAccurate; - } else if (this.fixIntegerDivisionAccuracy && features.isIntegerDivisionAccurate) { - this.fixIntegerDivisionAccuracy = false; - } - - this.checkOutput(); - - if (!this.output || this.output.length === 0) { - if (args.length !== 1) { - throw new Error('Auto output only supported for kernels with only one input'); - } - - const argType = utils.getVariableType(args[0], this.strictIntegers); - switch (argType) { - case 'Array': - this.output = utils.getDimensions(argType); - break; - case 'NumberTexture': - case 'MemoryOptimizedNumberTexture': - case 'ArrayTexture(1)': - case 'ArrayTexture(2)': - case 'ArrayTexture(3)': - case 'ArrayTexture(4)': - this.output = args[0].output; - break; - default: - throw new Error('Auto output not supported for input type: ' + argType); - } - } - - if (this.graphical) { - if (this.output.length !== 2) { - throw new Error('Output must have 2 dimensions on graphical mode'); - } - - if (this.precision === 'single') { - console.warn('Cannot use graphical mode and single precision at the same time'); - this.precision = 'unsigned'; - } - - this.texSize = utils.clone(this.output); - return; - } else if (!this.graphical && this.precision === null && features.isTextureFloat) { - this.precision = 'single'; - } - - this.texSize = utils.getKernelTextureSize({ - optimizeFloatMemory: this.optimizeFloatMemory, - precision: this.precision, - }, this.output); - - this.checkTextureSize(); - } - - translateSource() { - const functionBuilder = FunctionBuilder.fromKernel(this, WebGL2FunctionNode, { - fixIntegerDivisionAccuracy: this.fixIntegerDivisionAccuracy - }); - this.translatedSource = functionBuilder.getPrototypeString('kernel'); - this.setupReturnTypes(functionBuilder); - } - - drawBuffers() { - this.context.drawBuffers(this.drawBuffersMap); - } - - getTextureFormat() { - const { context: gl } = this; - switch (this.getInternalFormat()) { - case gl.R32F: - return gl.RED; - case gl.RG32F: - return gl.RG; - case gl.RGBA32F: - return gl.RGBA; - case gl.RGBA: - return gl.RGBA; - default: - throw new Error('Unknown internal format'); - } - } - getInternalFormat() { - const { context: gl } = this; - - if (this.precision === 'single') { - if (this.pipeline) { - switch (this.returnType) { - case 'Number': - case 'Float': - case 'Integer': - if (this.optimizeFloatMemory) { - return gl.RGBA32F; - } else { - return gl.R32F; - } - case 'Array(2)': - return gl.RG32F; - case 'Array(3)': - case 'Array(4)': - return gl.RGBA32F; - default: - throw new Error('Unhandled return type'); - } - } - return gl.RGBA32F; - } - return gl.RGBA; - } - - _setupOutputTexture() { - const gl = this.context; - if (this.texture) { - gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.texture.texture, 0); - return; - } - gl.bindFramebuffer(gl.FRAMEBUFFER, this.framebuffer); - const texture = gl.createTexture(); - const texSize = this.texSize; - gl.activeTexture(gl.TEXTURE0 + this.constantTextureCount + this.argumentTextureCount); - gl.bindTexture(gl.TEXTURE_2D, texture); - gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.REPEAT); - gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.REPEAT); - gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.NEAREST); - gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.NEAREST); - const format = this.getInternalFormat(); - if (this.precision === 'single') { - gl.texStorage2D(gl.TEXTURE_2D, 1, format, texSize[0], texSize[1]); - } else { - gl.texImage2D(gl.TEXTURE_2D, 0, format, texSize[0], texSize[1], 0, format, gl.UNSIGNED_BYTE, null); - } - gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, texture, 0); - this.texture = new this.TextureConstructor({ - texture, - size: texSize, - dimensions: this.threadDim, - output: this.output, - context: this.context, - internalFormat: this.getInternalFormat(), - textureFormat: this.getTextureFormat(), - kernel: this, - }); - } - - _setupSubOutputTextures() { - const gl = this.context; - if (this.mappedTextures) { - for (let i = 0; i < this.subKernels.length; i++) { - gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0 + i + 1, gl.TEXTURE_2D, this.mappedTextures[i].texture, 0); - } - return; - } - const texSize = this.texSize; - this.drawBuffersMap = [gl.COLOR_ATTACHMENT0]; - this.mappedTextures = []; - for (let i = 0; i < this.subKernels.length; i++) { - const texture = this.createTexture(); - this.drawBuffersMap.push(gl.COLOR_ATTACHMENT0 + i + 1); - gl.activeTexture(gl.TEXTURE0 + this.constantTextureCount + this.argumentTextureCount + i); - gl.bindTexture(gl.TEXTURE_2D, texture); - gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE); - gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE); - gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.NEAREST); - gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.NEAREST); - const format = this.getInternalFormat(); - if (this.precision === 'single') { - gl.texStorage2D(gl.TEXTURE_2D, 1, format, texSize[0], texSize[1]); - } else { - gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, texSize[0], texSize[1], 0, gl.RGBA, gl.UNSIGNED_BYTE, null); - } - gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0 + i + 1, gl.TEXTURE_2D, texture, 0); - - this.mappedTextures.push(new this.TextureConstructor({ - texture, - size: texSize, - dimensions: this.threadDim, - output: this.output, - context: this.context, - internalFormat: this.getInternalFormat(), - textureFormat: this.getTextureFormat(), - kernel: this, - })); - } - } - - _getHeaderString() { - return ''; - } - - _getTextureCoordinate() { - const subKernels = this.subKernels; - const variablePrecision = this.getVariablePrecisionString(this.texSize, this.tactic); - if (subKernels === null || subKernels.length < 1) { - return `in ${ variablePrecision } vec2 vTexCoord;\n`; - } else { - return `out ${ variablePrecision } vec2 vTexCoord;\n`; - } - } - - _getMainArgumentsString(args) { - const result = []; - const argumentNames = this.argumentNames; - for (let i = 0; i < argumentNames.length; i++) { - result.push(this.kernelArguments[i].getSource(args[i])); - } - return result.join(''); - } - - getKernelString() { - const result = [this.getKernelResultDeclaration()]; - const subKernels = this.subKernels; - if (subKernels !== null) { - result.push( - 'layout(location = 0) out vec4 data0' - ); - switch (this.returnType) { - case 'Number': - case 'Float': - case 'Integer': - for (let i = 0; i < subKernels.length; i++) { - const subKernel = subKernels[i]; - result.push( - subKernel.returnType === 'Integer' ? - `int subKernelResult_${ subKernel.name } = 0` : - `float subKernelResult_${ subKernel.name } = 0.0`, - `layout(location = ${ i + 1 }) out vec4 data${ i + 1 }` - ); - } - break; - case 'Array(2)': - for (let i = 0; i < subKernels.length; i++) { - result.push( - `vec2 subKernelResult_${ subKernels[i].name }`, - `layout(location = ${ i + 1 }) out vec4 data${ i + 1 }` - ); - } - break; - case 'Array(3)': - for (let i = 0; i < subKernels.length; i++) { - result.push( - `vec3 subKernelResult_${ subKernels[i].name }`, - `layout(location = ${ i + 1 }) out vec4 data${ i + 1 }` - ); - } - break; - case 'Array(4)': - for (let i = 0; i < subKernels.length; i++) { - result.push( - `vec4 subKernelResult_${ subKernels[i].name }`, - `layout(location = ${ i + 1 }) out vec4 data${ i + 1 }` - ); - } - break; - } - } else { - result.push( - 'out vec4 data0' - ); - } - - return utils.linesToString(result) + this.translatedSource; - } - - getMainResultGraphical() { - return utils.linesToString([ - ' threadId = indexTo3D(index, uOutputDim)', - ' kernel()', - ' data0 = actualColor', - ]); - } - - getMainResultPackedPixels() { - switch (this.returnType) { - case 'LiteralInteger': - case 'Number': - case 'Integer': - case 'Float': - return this.getMainResultKernelPackedPixels() + - this.getMainResultSubKernelPackedPixels(); - default: - throw new Error(`packed output only usable with Numbers, "${this.returnType}" specified`); - } - } - - getMainResultKernelPackedPixels() { - return utils.linesToString([ - ' threadId = indexTo3D(index, uOutputDim)', - ' kernel()', - ` data0 = ${this.useLegacyEncoder ? 'legacyEncode32' : 'encode32'}(kernelResult)` - ]); - } - - getMainResultSubKernelPackedPixels() { - const result = []; - if (!this.subKernels) return ''; - for (let i = 0; i < this.subKernels.length; i++) { - const subKernel = this.subKernels[i]; - if (subKernel.returnType === 'Integer') { - result.push( - ` data${i + 1} = ${this.useLegacyEncoder ? 'legacyEncode32' : 'encode32'}(float(subKernelResult_${this.subKernels[i].name}))` - ); - } else { - result.push( - ` data${i + 1} = ${this.useLegacyEncoder ? 'legacyEncode32' : 'encode32'}(subKernelResult_${this.subKernels[i].name})` - ); - } - } - return utils.linesToString(result); - } - - getMainResultKernelMemoryOptimizedFloats(result, channel) { - result.push( - ' threadId = indexTo3D(index, uOutputDim)', - ' kernel()', - ` data0.${channel} = kernelResult` - ); - } - - getMainResultSubKernelMemoryOptimizedFloats(result, channel) { - if (!this.subKernels) return result; - for (let i = 0; i < this.subKernels.length; i++) { - const subKernel = this.subKernels[i]; - if (subKernel.returnType === 'Integer') { - result.push( - ` data${i + 1}.${channel} = float(subKernelResult_${subKernel.name})` - ); - } else { - result.push( - ` data${i + 1}.${channel} = subKernelResult_${subKernel.name}` - ); - } - } - } - - getMainResultKernelNumberTexture() { - return [ - ' threadId = indexTo3D(index, uOutputDim)', - ' kernel()', - ' data0[0] = kernelResult', - ]; - } - - getMainResultSubKernelNumberTexture() { - const result = []; - if (!this.subKernels) return result; - for (let i = 0; i < this.subKernels.length; ++i) { - const subKernel = this.subKernels[i]; - if (subKernel.returnType === 'Integer') { - result.push( - ` data${i + 1}[0] = float(subKernelResult_${subKernel.name})` - ); - } else { - result.push( - ` data${i + 1}[0] = subKernelResult_${subKernel.name}` - ); - } - } - return result; - } - - getMainResultKernelArray2Texture() { - return [ - ' threadId = indexTo3D(index, uOutputDim)', - ' kernel()', - ' data0[0] = kernelResult[0]', - ' data0[1] = kernelResult[1]', - ]; - } - - getMainResultSubKernelArray2Texture() { - const result = []; - if (!this.subKernels) return result; - for (let i = 0; i < this.subKernels.length; ++i) { - const subKernel = this.subKernels[i]; - result.push( - ` data${i + 1}[0] = subKernelResult_${subKernel.name}[0]`, - ` data${i + 1}[1] = subKernelResult_${subKernel.name}[1]` - ); - } - return result; - } - - getMainResultKernelArray3Texture() { - return [ - ' threadId = indexTo3D(index, uOutputDim)', - ' kernel()', - ' data0[0] = kernelResult[0]', - ' data0[1] = kernelResult[1]', - ' data0[2] = kernelResult[2]', - ]; - } - - getMainResultSubKernelArray3Texture() { - const result = []; - if (!this.subKernels) return result; - for (let i = 0; i < this.subKernels.length; ++i) { - const subKernel = this.subKernels[i]; - result.push( - ` data${i + 1}[0] = subKernelResult_${subKernel.name}[0]`, - ` data${i + 1}[1] = subKernelResult_${subKernel.name}[1]`, - ` data${i + 1}[2] = subKernelResult_${subKernel.name}[2]` - ); - } - return result; - } - - getMainResultKernelArray4Texture() { - return [ - ' threadId = indexTo3D(index, uOutputDim)', - ' kernel()', - ' data0 = kernelResult', - ]; - } - - getMainResultSubKernelArray4Texture() { - const result = []; - if (!this.subKernels) return result; - for (let i = 0; i < this.subKernels.length; ++i) { - result.push( - ` data${i + 1} = subKernelResult_${this.subKernels[i].name}` - ); - } - return result; - } - - destroyExtensions() { - this.extensions.EXT_color_buffer_float = null; - this.extensions.OES_texture_float_linear = null; - } - - toJSON() { - const json = super.toJSON(); - json.functionNodes = FunctionBuilder.fromKernel(this, WebGL2FunctionNode).toJSON(); - json.settings.threadDim = this.threadDim; - return json; - } -} - -module.exports = { - WebGL2Kernel -}; -},{"../../utils":114,"../function-builder":9,"../web-gl/kernel":70,"./fragment-shader":72,"./function-node":73,"./kernel-value-maps":74,"./vertex-shader":106}],106:[function(require,module,exports){ -const vertexShader = `#version 300 es -__FLOAT_TACTIC_DECLARATION__; -__INT_TACTIC_DECLARATION__; -__SAMPLER_2D_TACTIC_DECLARATION__; - -in vec2 aPos; -in vec2 aTexCoord; - -out vec2 vTexCoord; -uniform vec2 ratio; - -void main(void) { - gl_Position = vec4((aPos + vec2(1)) * ratio + vec2(-1), 0, 1); - vTexCoord = aTexCoord; -}`; - -module.exports = { - vertexShader -}; -},{}],107:[function(require,module,exports){ -const lib = require('./index'); -const GPU = lib.GPU; -for (const p in lib) { - if (!lib.hasOwnProperty(p)) continue; - if (p === 'GPU') continue; - GPU[p] = lib[p]; -} - -if (typeof window !== 'undefined') { - bindTo(window); -} -if (typeof self !== 'undefined') { - bindTo(self); -} - -function bindTo(target) { - if (target.GPU) return; - Object.defineProperty(target, 'GPU', { - get() { - return GPU; - } - }); -} - -module.exports = lib; -},{"./index":109}],108:[function(require,module,exports){ -const { gpuMock } = require('gpu-mock.js'); -const { utils } = require('./utils'); -const { Kernel } = require('./backend/kernel'); -const { CPUKernel } = require('./backend/cpu/kernel'); -const { HeadlessGLKernel } = require('./backend/headless-gl/kernel'); -const { WebGL2Kernel } = require('./backend/web-gl2/kernel'); -const { WebGLKernel } = require('./backend/web-gl/kernel'); -const { kernelRunShortcut } = require('./kernel-run-shortcut'); - - -const kernelOrder = [HeadlessGLKernel, WebGL2Kernel, WebGLKernel]; - -const kernelTypes = ['gpu', 'cpu']; - -const internalKernels = { - 'headlessgl': HeadlessGLKernel, - 'webgl2': WebGL2Kernel, - 'webgl': WebGLKernel, -}; - -let validate = true; - -class GPU { - static disableValidation() { - validate = false; - } - - static enableValidation() { - validate = true; - } - - static get isGPUSupported() { - return kernelOrder.some(Kernel => Kernel.isSupported); - } - - static get isKernelMapSupported() { - return kernelOrder.some(Kernel => Kernel.isSupported && Kernel.features.kernelMap); - } - - static get isOffscreenCanvasSupported() { - return (typeof Worker !== 'undefined' && typeof OffscreenCanvas !== 'undefined') || typeof importScripts !== 'undefined'; - } - - static get isWebGLSupported() { - return WebGLKernel.isSupported; - } - - static get isWebGL2Supported() { - return WebGL2Kernel.isSupported; - } - - static get isHeadlessGLSupported() { - return HeadlessGLKernel.isSupported; - } - - static get isCanvasSupported() { - return typeof HTMLCanvasElement !== 'undefined'; - } - - static get isGPUHTMLImageArraySupported() { - return WebGL2Kernel.isSupported; - } - - static get isSinglePrecisionSupported() { - return kernelOrder.some(Kernel => Kernel.isSupported && Kernel.features.isFloatRead && Kernel.features.isTextureFloat); - } - - constructor(settings) { - settings = settings || {}; - this.canvas = settings.canvas || null; - this.context = settings.context || null; - this.mode = settings.mode; - this.Kernel = null; - this.kernels = []; - this.functions = []; - this.nativeFunctions = []; - this.injectedNative = null; - if (this.mode === 'dev') return; - this.chooseKernel(); - if (settings.functions) { - for (let i = 0; i < settings.functions.length; i++) { - this.addFunction(settings.functions[i]); - } - } - - if (settings.nativeFunctions) { - for (const p in settings.nativeFunctions) { - if (!settings.nativeFunctions.hasOwnProperty(p)) continue; - const s = settings.nativeFunctions[p]; - const { name, source } = s; - this.addNativeFunction(name, source, s); - } - } - } - - chooseKernel() { - if (this.Kernel) return; - - let Kernel = null; - - if (this.context) { - for (let i = 0; i < kernelOrder.length; i++) { - const ExternalKernel = kernelOrder[i]; - if (ExternalKernel.isContextMatch(this.context)) { - if (!ExternalKernel.isSupported) { - throw new Error(`Kernel type ${ExternalKernel.name} not supported`); - } - Kernel = ExternalKernel; - break; - } - } - if (Kernel === null) { - throw new Error('unknown Context'); - } - } else if (this.mode) { - if (this.mode in internalKernels) { - if (!validate || internalKernels[this.mode].isSupported) { - Kernel = internalKernels[this.mode]; - } - } else if (this.mode === 'gpu') { - for (let i = 0; i < kernelOrder.length; i++) { - if (kernelOrder[i].isSupported) { - Kernel = kernelOrder[i]; - break; - } - } - } else if (this.mode === 'cpu') { - Kernel = CPUKernel; - } - if (!Kernel) { - throw new Error(`A requested mode of "${this.mode}" and is not supported`); - } - } else { - for (let i = 0; i < kernelOrder.length; i++) { - if (kernelOrder[i].isSupported) { - Kernel = kernelOrder[i]; - break; - } - } - if (!Kernel) { - Kernel = CPUKernel; - } - } - - if (!this.mode) { - this.mode = Kernel.mode; - } - this.Kernel = Kernel; - } - - createKernel(source, settings) { - if (typeof source === 'undefined') { - throw new Error('Missing source parameter'); - } - if (typeof source !== 'object' && !utils.isFunction(source) && typeof source !== 'string') { - throw new Error('source parameter not a function'); - } - - const kernels = this.kernels; - if (this.mode === 'dev') { - const devKernel = gpuMock(source, upgradeDeprecatedCreateKernelSettings(settings)); - kernels.push(devKernel); - return devKernel; - } - - source = typeof source === 'function' ? source.toString() : source; - const switchableKernels = {}; - const settingsCopy = upgradeDeprecatedCreateKernelSettings(settings) || {}; - if (settings && typeof settings.argumentTypes === 'object') { - settingsCopy.argumentTypes = Object.keys(settings.argumentTypes).map(argumentName => settings.argumentTypes[argumentName]); - } - - function onRequestFallback(args) { - console.warn('Falling back to CPU'); - const fallbackKernel = new CPUKernel(source, { - argumentTypes: kernelRun.argumentTypes, - constantTypes: kernelRun.constantTypes, - graphical: kernelRun.graphical, - loopMaxIterations: kernelRun.loopMaxIterations, - constants: kernelRun.constants, - dynamicOutput: kernelRun.dynamicOutput, - dynamicArgument: kernelRun.dynamicArguments, - output: kernelRun.output, - precision: kernelRun.precision, - pipeline: kernelRun.pipeline, - immutable: kernelRun.immutable, - optimizeFloatMemory: kernelRun.optimizeFloatMemory, - fixIntegerDivisionAccuracy: kernelRun.fixIntegerDivisionAccuracy, - functions: kernelRun.functions, - nativeFunctions: kernelRun.nativeFunctions, - injectedNative: kernelRun.injectedNative, - subKernels: kernelRun.subKernels, - strictIntegers: kernelRun.strictIntegers, - debug: kernelRun.debug, - }); - fallbackKernel.build.apply(fallbackKernel, args); - const result = fallbackKernel.run.apply(fallbackKernel, args); - kernelRun.replaceKernel(fallbackKernel); - return result; - } - - function onRequestSwitchKernel(reasons, args, _kernel) { - if (_kernel.debug) { - console.warn('Switching kernels'); - } - let newOutput = null; - if (_kernel.signature && !switchableKernels[_kernel.signature]) { - switchableKernels[_kernel.signature] = _kernel; - } - if (_kernel.dynamicOutput) { - for (let i = reasons.length - 1; i >= 0; i--) { - const reason = reasons[i]; - if (reason.type === 'outputPrecisionMismatch') { - newOutput = reason.needed; - } - } - } - - const Constructor = _kernel.constructor; - const argumentTypes = Constructor.getArgumentTypes(_kernel, args); - const signature = Constructor.getSignature(_kernel, argumentTypes); - const existingKernel = switchableKernels[signature]; - if (existingKernel) { - existingKernel.onActivate(_kernel); - return existingKernel; - } - - const newKernel = switchableKernels[signature] = new Constructor(source, { - argumentTypes, - constantTypes: _kernel.constantTypes, - graphical: _kernel.graphical, - loopMaxIterations: _kernel.loopMaxIterations, - constants: _kernel.constants, - dynamicOutput: _kernel.dynamicOutput, - dynamicArgument: _kernel.dynamicArguments, - context: _kernel.context, - canvas: _kernel.canvas, - output: newOutput || _kernel.output, - precision: _kernel.precision, - pipeline: _kernel.pipeline, - immutable: _kernel.immutable, - optimizeFloatMemory: _kernel.optimizeFloatMemory, - fixIntegerDivisionAccuracy: _kernel.fixIntegerDivisionAccuracy, - functions: _kernel.functions, - nativeFunctions: _kernel.nativeFunctions, - injectedNative: _kernel.injectedNative, - subKernels: _kernel.subKernels, - strictIntegers: _kernel.strictIntegers, - debug: _kernel.debug, - gpu: _kernel.gpu, - validate, - returnType: _kernel.returnType, - tactic: _kernel.tactic, - onRequestFallback, - onRequestSwitchKernel, - texture: _kernel.texture, - mappedTextures: _kernel.mappedTextures, - drawBuffersMap: _kernel.drawBuffersMap, - }); - newKernel.build.apply(newKernel, args); - kernelRun.replaceKernel(newKernel); - kernels.push(newKernel); - return newKernel; - } - const mergedSettings = Object.assign({ - context: this.context, - canvas: this.canvas, - functions: this.functions, - nativeFunctions: this.nativeFunctions, - injectedNative: this.injectedNative, - gpu: this, - validate, - onRequestFallback, - onRequestSwitchKernel - }, settingsCopy); - - const kernel = new this.Kernel(source, mergedSettings); - const kernelRun = kernelRunShortcut(kernel); - - if (!this.canvas) { - this.canvas = kernel.canvas; - } - - if (!this.context) { - this.context = kernel.context; - } - - kernels.push(kernel); - - return kernelRun; - } - - createKernelMap() { - let fn; - let settings; - const argument2Type = typeof arguments[arguments.length - 2]; - if (argument2Type === 'function' || argument2Type === 'string') { - fn = arguments[arguments.length - 2]; - settings = arguments[arguments.length - 1]; - } else { - fn = arguments[arguments.length - 1]; - } - - if (this.mode !== 'dev') { - if (!this.Kernel.isSupported || !this.Kernel.features.kernelMap) { - if (this.mode && kernelTypes.indexOf(this.mode) < 0) { - throw new Error(`kernelMap not supported on ${this.Kernel.name}`); - } - } - } - - const settingsCopy = upgradeDeprecatedCreateKernelSettings(settings); - if (settings && typeof settings.argumentTypes === 'object') { - settingsCopy.argumentTypes = Object.keys(settings.argumentTypes).map(argumentName => settings.argumentTypes[argumentName]); - } - - if (Array.isArray(arguments[0])) { - settingsCopy.subKernels = []; - const functions = arguments[0]; - for (let i = 0; i < functions.length; i++) { - const source = functions[i].toString(); - const name = utils.getFunctionNameFromString(source); - settingsCopy.subKernels.push({ - name, - source, - property: i, - }); - } - } else { - settingsCopy.subKernels = []; - const functions = arguments[0]; - for (let p in functions) { - if (!functions.hasOwnProperty(p)) continue; - const source = functions[p].toString(); - const name = utils.getFunctionNameFromString(source); - settingsCopy.subKernels.push({ - name: name || p, - source, - property: p, - }); - } - } - return this.createKernel(fn, settingsCopy); - } - - combineKernels() { - const firstKernel = arguments[0]; - const combinedKernel = arguments[arguments.length - 1]; - if (firstKernel.kernel.constructor.mode === 'cpu') return combinedKernel; - const canvas = arguments[0].canvas; - const context = arguments[0].context; - const max = arguments.length - 1; - for (let i = 0; i < max; i++) { - arguments[i] - .setCanvas(canvas) - .setContext(context) - .setPipeline(true); - } - - return function() { - const texture = combinedKernel.apply(this, arguments); - if (texture.toArray) { - return texture.toArray(); - } - return texture; - }; - } - - setFunctions(functions) { - this.functions = functions; - return this; - } - - setNativeFunctions(nativeFunctions) { - this.nativeFunctions = nativeFunctions; - return this; - } - - addFunction(source, settings) { - this.functions.push({ source, settings }); - return this; - } - - addNativeFunction(name, source, settings) { - if (this.kernels.length > 0) { - throw new Error('Cannot call "addNativeFunction" after "createKernels" has been called.'); - } - this.nativeFunctions.push(Object.assign({ name, source }, settings)); - return this; - } - - injectNative(source) { - this.injectedNative = source; - return this; - } - - destroy() { - return new Promise((resolve, reject) => { - if (!this.kernels) { - resolve(); - } - setTimeout(() => { - try { - for (let i = 0; i < this.kernels.length; i++) { - this.kernels[i].destroy(true); - } - let firstKernel = this.kernels[0]; - if (firstKernel) { - if (firstKernel.kernel) { - firstKernel = firstKernel.kernel; - } - if (firstKernel.constructor.destroyContext) { - firstKernel.constructor.destroyContext(this.context); - } - } - } catch (e) { - reject(e); - } - resolve(); - }, 0); - }); - } -} - - -function upgradeDeprecatedCreateKernelSettings(settings) { - if (!settings) { - return {}; - } - const upgradedSettings = Object.assign({}, settings); - - if (settings.hasOwnProperty('floatOutput')) { - utils.warnDeprecated('setting', 'floatOutput', 'precision'); - upgradedSettings.precision = settings.floatOutput ? 'single' : 'unsigned'; - } - if (settings.hasOwnProperty('outputToTexture')) { - utils.warnDeprecated('setting', 'outputToTexture', 'pipeline'); - upgradedSettings.pipeline = Boolean(settings.outputToTexture); - } - if (settings.hasOwnProperty('outputImmutable')) { - utils.warnDeprecated('setting', 'outputImmutable', 'immutable'); - upgradedSettings.immutable = Boolean(settings.outputImmutable); - } - if (settings.hasOwnProperty('floatTextures')) { - utils.warnDeprecated('setting', 'floatTextures', 'optimizeFloatMemory'); - upgradedSettings.optimizeFloatMemory = Boolean(settings.floatTextures); - } - return upgradedSettings; -} - -module.exports = { - GPU, - kernelOrder, - kernelTypes -}; -},{"./backend/cpu/kernel":8,"./backend/headless-gl/kernel":34,"./backend/kernel":36,"./backend/web-gl/kernel":70,"./backend/web-gl2/kernel":105,"./kernel-run-shortcut":111,"./utils":114,"gpu-mock.js":4}],109:[function(require,module,exports){ -const { GPU } = require('./gpu'); -const { alias } = require('./alias'); -const { utils } = require('./utils'); -const { Input, input } = require('./input'); -const { Texture } = require('./texture'); -const { FunctionBuilder } = require('./backend/function-builder'); -const { FunctionNode } = require('./backend/function-node'); -const { CPUFunctionNode } = require('./backend/cpu/function-node'); -const { CPUKernel } = require('./backend/cpu/kernel'); - -const { HeadlessGLKernel } = require('./backend/headless-gl/kernel'); - -const { WebGLFunctionNode } = require('./backend/web-gl/function-node'); -const { WebGLKernel } = require('./backend/web-gl/kernel'); -const { kernelValueMaps: webGLKernelValueMaps } = require('./backend/web-gl/kernel-value-maps'); - -const { WebGL2FunctionNode } = require('./backend/web-gl2/function-node'); -const { WebGL2Kernel } = require('./backend/web-gl2/kernel'); -const { kernelValueMaps: webGL2KernelValueMaps } = require('./backend/web-gl2/kernel-value-maps'); - -const { GLKernel } = require('./backend/gl/kernel'); - -const { Kernel } = require('./backend/kernel'); - -const { FunctionTracer } = require('./backend/function-tracer'); - -const mathRandom = require('./plugins/math-random-uniformly-distributed'); - -module.exports = { - alias, - CPUFunctionNode, - CPUKernel, - GPU, - FunctionBuilder, - FunctionNode, - HeadlessGLKernel, - Input, - input, - Texture, - utils, - - WebGL2FunctionNode, - WebGL2Kernel, - webGL2KernelValueMaps, - - WebGLFunctionNode, - WebGLKernel, - webGLKernelValueMaps, - - GLKernel, - Kernel, - FunctionTracer, - - plugins: { - mathRandom - } -}; -},{"./alias":5,"./backend/cpu/function-node":6,"./backend/cpu/kernel":8,"./backend/function-builder":9,"./backend/function-node":10,"./backend/function-tracer":11,"./backend/gl/kernel":13,"./backend/headless-gl/kernel":34,"./backend/kernel":36,"./backend/web-gl/function-node":38,"./backend/web-gl/kernel":70,"./backend/web-gl/kernel-value-maps":39,"./backend/web-gl2/function-node":73,"./backend/web-gl2/kernel":105,"./backend/web-gl2/kernel-value-maps":74,"./gpu":108,"./input":110,"./plugins/math-random-uniformly-distributed":112,"./texture":113,"./utils":114}],110:[function(require,module,exports){ -class Input { - constructor(value, size) { - this.value = value; - if (Array.isArray(size)) { - this.size = size; - } else { - this.size = new Int32Array(3); - if (size.z) { - this.size = new Int32Array([size.x, size.y, size.z]); - } else if (size.y) { - this.size = new Int32Array([size.x, size.y]); - } else { - this.size = new Int32Array([size.x]); - } - } - - const [w, h, d] = this.size; - if (d) { - if (this.value.length !== (w * h * d)) { - throw new Error(`Input size ${this.value.length} does not match ${w} * ${h} * ${d} = ${(h * w * d)}`); - } - } else if (h) { - if (this.value.length !== (w * h)) { - throw new Error(`Input size ${this.value.length} does not match ${w} * ${h} = ${(h * w)}`); - } - } else { - if (this.value.length !== w) { - throw new Error(`Input size ${this.value.length} does not match ${w}`); - } - } - - } - - toArray() { - const { utils } = require('./utils'); - const [w, h, d] = this.size; - if (d) { - return utils.erectMemoryOptimized3DFloat(this.value.subarray ? this.value : new Float32Array(this.value), w, h, d); - } else if (h) { - return utils.erectMemoryOptimized2DFloat(this.value.subarray ? this.value : new Float32Array(this.value), w, h); - } else { - return this.value; - } - } -} - -function input(value, size) { - return new Input(value, size); -} - -module.exports = { - Input, - input -}; -},{"./utils":114}],111:[function(require,module,exports){ -const { utils } = require('./utils'); - -function kernelRunShortcut(kernel) { - let run = function() { - kernel.build.apply(kernel, arguments); - run = function() { - let result = kernel.run.apply(kernel, arguments); - if (kernel.switchingKernels) { - const reasons = kernel.resetSwitchingKernels(); - const newKernel = kernel.onRequestSwitchKernel(reasons, arguments, kernel); - shortcut.kernel = kernel = newKernel; - result = newKernel.run.apply(newKernel, arguments); - } - if (kernel.renderKernels) { - return kernel.renderKernels(); - } else if (kernel.renderOutput) { - return kernel.renderOutput(); - } else { - return result; - } - }; - return run.apply(kernel, arguments); - }; - const shortcut = function() { - return run.apply(kernel, arguments); - }; - shortcut.exec = function() { - return new Promise((accept, reject) => { - try { - accept(run.apply(this, arguments)); - } catch (e) { - reject(e); - } - }); - }; - shortcut.replaceKernel = function(replacementKernel) { - kernel = replacementKernel; - bindKernelToShortcut(kernel, shortcut); - }; - - bindKernelToShortcut(kernel, shortcut); - return shortcut; -} - -function bindKernelToShortcut(kernel, shortcut) { - if (shortcut.kernel) { - shortcut.kernel = kernel; - return; - } - const properties = utils.allPropertiesOf(kernel); - for (let i = 0; i < properties.length; i++) { - const property = properties[i]; - if (property[0] === '_' && property[1] === '_') continue; - if (typeof kernel[property] === 'function') { - if (property.substring(0, 3) === 'add' || property.substring(0, 3) === 'set') { - shortcut[property] = function() { - shortcut.kernel[property].apply(shortcut.kernel, arguments); - return shortcut; - }; - } else { - shortcut[property] = function() { - return shortcut.kernel[property].apply(shortcut.kernel, arguments); - }; - } - } else { - shortcut.__defineGetter__(property, () => shortcut.kernel[property]); - shortcut.__defineSetter__(property, (value) => { - shortcut.kernel[property] = value; - }); - } - } - shortcut.kernel = kernel; -} -module.exports = { - kernelRunShortcut -}; -},{"./utils":114}],112:[function(require,module,exports){ -const source = `// https://www.shadertoy.com/view/4t2SDh -//note: uniformly distributed, normalized rand, [0,1] -highp float randomSeedShift = 1.0; -highp float slide = 1.0; -uniform highp float randomSeed1; -uniform highp float randomSeed2; - -highp float nrand(highp vec2 n) { - highp float result = fract(sin(dot((n.xy + 1.0) * vec2(randomSeed1 * slide, randomSeed2 * randomSeedShift), vec2(12.9898, 78.233))) * 43758.5453); - randomSeedShift = result; - if (randomSeedShift > 0.5) { - slide += 0.00009; - } else { - slide += 0.0009; - } - return result; -}`; - -const name = 'math-random-uniformly-distributed'; - -const functionMatch = `Math.random()`; - -const functionReplace = `nrand(vTexCoord)`; - -const functionReturnType = 'Number'; -const onBeforeRun = (kernel) => { - kernel.setUniform1f('randomSeed1', Math.random()); - kernel.setUniform1f('randomSeed2', Math.random()); -}; - -const plugin = { - name, - onBeforeRun, - functionMatch, - functionReplace, - functionReturnType, - source -}; - -module.exports = plugin; -},{}],113:[function(require,module,exports){ -class Texture { - constructor(settings) { - const { - texture, - size, - dimensions, - output, - context, - type = 'NumberTexture', - kernel, - internalFormat, - textureFormat - } = settings; - if (!output) throw new Error('settings property "output" required.'); - if (!context) throw new Error('settings property "context" required.'); - if (!texture) throw new Error('settings property "texture" required.'); - if (!kernel) throw new Error('settings property "kernel" required.'); - this.texture = texture; - if (texture._refs) { - texture._refs++; - } else { - texture._refs = 1; - } - this.size = size; - this.dimensions = dimensions; - this.output = output; - this.context = context; - this.kernel = kernel; - this.type = type; - this._deleted = false; - this.internalFormat = internalFormat; - this.textureFormat = textureFormat; - } - - toArray() { - throw new Error(`Not implemented on ${this.constructor.name}`); - } - - clone() { - throw new Error(`Not implemented on ${this.constructor.name}`); - } - - delete() { - throw new Error(`Not implemented on ${this.constructor.name}`); - } - - clear() { - throw new Error(`Not implemented on ${this.constructor.name}`); - } -} - -module.exports = { - Texture -}; -},{}],114:[function(require,module,exports){ -const acorn = require('acorn'); -const { Input } = require('./input'); -const { Texture } = require('./texture'); - -const FUNCTION_NAME = /function ([^(]*)/; -const STRIP_COMMENTS = /((\/\/.*$)|(\/\*[\s\S]*?\*\/))/mg; -const ARGUMENT_NAMES = /([^\s,]+)/g; - -const utils = { - systemEndianness() { - return _systemEndianness; - }, - getSystemEndianness() { - const b = new ArrayBuffer(4); - const a = new Uint32Array(b); - const c = new Uint8Array(b); - a[0] = 0xdeadbeef; - if (c[0] === 0xef) return 'LE'; - if (c[0] === 0xde) return 'BE'; - throw new Error('unknown endianness'); - }, - - isFunction(funcObj) { - return typeof(funcObj) === 'function'; - }, - - isFunctionString(fn) { - if (typeof fn === 'string') { - return (fn - .slice(0, 'function'.length) - .toLowerCase() === 'function'); - } - return false; - }, - - getFunctionNameFromString(funcStr) { - const result = FUNCTION_NAME.exec(funcStr); - if (!result || result.length === 0) return null; - return result[1].trim(); - }, - - getFunctionBodyFromString(funcStr) { - return funcStr.substring(funcStr.indexOf('{') + 1, funcStr.lastIndexOf('}')); - }, - - getArgumentNamesFromString(fn) { - const fnStr = fn.replace(STRIP_COMMENTS, ''); - let result = fnStr.slice(fnStr.indexOf('(') + 1, fnStr.indexOf(')')).match(ARGUMENT_NAMES); - if (result === null) { - result = []; - } - return result; - }, - - clone(obj) { - if (obj === null || typeof obj !== 'object' || obj.hasOwnProperty('isActiveClone')) return obj; - - const temp = obj.constructor(); - - for (let key in obj) { - if (Object.prototype.hasOwnProperty.call(obj, key)) { - obj.isActiveClone = null; - temp[key] = utils.clone(obj[key]); - delete obj.isActiveClone; - } - } - - return temp; - }, - - isArray(array) { - return !isNaN(array.length); - }, - - getVariableType(value, strictIntegers) { - if (utils.isArray(value)) { - if (value.length > 0 && value[0].nodeName === 'IMG') { - return 'HTMLImageArray'; - } - return 'Array'; - } - - switch (value.constructor) { - case Boolean: - return 'Boolean'; - case Number: - if (strictIntegers && Number.isInteger(value)) { - return 'Integer'; - } - return 'Float'; - case Texture: - return value.type; - case Input: - return 'Input'; - } - if ('nodeName' in value) { - switch (value.nodeName) { - case 'IMG': - return 'HTMLImage'; - case 'CANVAS': - return 'HTMLImage'; - case 'VIDEO': - return 'HTMLVideo'; - } - } else if (value.hasOwnProperty('type')) { - return value.type; - } else if (typeof OffscreenCanvas !== 'undefined' && value instanceof OffscreenCanvas) { - return 'OffscreenCanvas'; - } else if (typeof ImageBitmap !== 'undefined' && value instanceof ImageBitmap) { - return 'ImageBitmap'; - } else if (typeof ImageData !== 'undefined' && value instanceof ImageData) { - return 'ImageData'; - } - return 'Unknown'; - }, - - getKernelTextureSize(settings, dimensions) { - let [w, h, d] = dimensions; - let texelCount = (w || 1) * (h || 1) * (d || 1); - - if (settings.optimizeFloatMemory && settings.precision === 'single') { - w = texelCount = Math.ceil(texelCount / 4); - } - if (h > 1 && w * h === texelCount) { - return new Int32Array([w, h]); - } - return utils.closestSquareDimensions(texelCount); - }, - - closestSquareDimensions(length) { - const sqrt = Math.sqrt(length); - let high = Math.ceil(sqrt); - let low = Math.floor(sqrt); - while (high * low < length) { - high--; - low = Math.ceil(length / high); - } - return new Int32Array([low, Math.ceil(length / low)]); - }, - - getMemoryOptimizedFloatTextureSize(dimensions, bitRatio) { - const totalArea = utils.roundTo((dimensions[0] || 1) * (dimensions[1] || 1) * (dimensions[2] || 1) * (dimensions[3] || 1), 4); - const texelCount = totalArea / bitRatio; - return utils.closestSquareDimensions(texelCount); - }, - - getMemoryOptimizedPackedTextureSize(dimensions, bitRatio) { - const [w, h, d] = dimensions; - const totalArea = utils.roundTo((w || 1) * (h || 1) * (d || 1), 4); - const texelCount = totalArea / (4 / bitRatio); - return utils.closestSquareDimensions(texelCount); - }, - - roundTo(n, d) { - return Math.floor((n + d - 1) / d) * d; - }, - getDimensions(x, pad) { - let ret; - if (utils.isArray(x)) { - const dim = []; - let temp = x; - while (utils.isArray(temp)) { - dim.push(temp.length); - temp = temp[0]; - } - ret = dim.reverse(); - } else if (x instanceof Texture) { - ret = x.output; - } else if (x instanceof Input) { - ret = x.size; - } else { - throw new Error(`Unknown dimensions of ${x}`); - } - - if (pad) { - ret = Array.from(ret); - while (ret.length < 3) { - ret.push(1); - } - } - - return new Int32Array(ret); - }, - - flatten2dArrayTo(array, target) { - let offset = 0; - for (let y = 0; y < array.length; y++) { - target.set(array[y], offset); - offset += array[y].length; - } - }, - - flatten3dArrayTo(array, target) { - let offset = 0; - for (let z = 0; z < array.length; z++) { - for (let y = 0; y < array[z].length; y++) { - target.set(array[z][y], offset); - offset += array[z][y].length; - } - } - }, - - flatten4dArrayTo(array, target) { - let offset = 0; - for (let l = 0; l < array.length; l++) { - for (let z = 0; z < array[l].length; z++) { - for (let y = 0; y < array[l][z].length; y++) { - target.set(array[l][z][y], offset); - offset += array[l][z][y].length; - } - } - } - }, - - flattenTo(array, target) { - if (utils.isArray(array[0])) { - if (utils.isArray(array[0][0])) { - if (utils.isArray(array[0][0][0])) { - utils.flatten4dArrayTo(array, target); - } else { - utils.flatten3dArrayTo(array, target); - } - } else { - utils.flatten2dArrayTo(array, target); - } - } else { - target.set(array); - } - }, - - splitArray(array, part) { - const result = []; - for (let i = 0; i < array.length; i += part) { - result.push(new array.constructor(array.buffer, i * 4 + array.byteOffset, part)); - } - return result; - }, - - getAstString(source, ast) { - const lines = Array.isArray(source) ? source : source.split(/\r?\n/g); - const start = ast.loc.start; - const end = ast.loc.end; - const result = []; - if (start.line === end.line) { - result.push(lines[start.line - 1].substring(start.column, end.column)); - } else { - result.push(lines[start.line - 1].slice(start.column)); - for (let i = start.line; i < end.line; i++) { - result.push(lines[i]); - } - result.push(lines[end.line - 1].slice(0, end.column)); - } - return result.join('\n'); - }, - - allPropertiesOf(obj) { - const props = []; - - do { - props.push.apply(props, Object.getOwnPropertyNames(obj)); - } while (obj = Object.getPrototypeOf(obj)); - - return props; - }, - - linesToString(lines) { - if (lines.length > 0) { - return lines.join(';\n') + ';\n'; - } else { - return '\n'; - } - }, - warnDeprecated(type, oldName, newName) { - if (newName) { - console.warn(`You are using a deprecated ${ type } "${ oldName }". It has been replaced with "${ newName }". Fixing, but please upgrade as it will soon be removed.`); - } else { - console.warn(`You are using a deprecated ${ type } "${ oldName }". It has been removed. Fixing, but please upgrade as it will soon be removed.`); - } - }, - flipPixels: (pixels, width, height) => { - const halfHeight = height / 2 | 0; - const bytesPerRow = width * 4; - const temp = new Uint8ClampedArray(width * 4); - const result = pixels.slice(0); - for (let y = 0; y < halfHeight; ++y) { - const topOffset = y * bytesPerRow; - const bottomOffset = (height - y - 1) * bytesPerRow; - - temp.set(result.subarray(topOffset, topOffset + bytesPerRow)); - - result.copyWithin(topOffset, bottomOffset, bottomOffset + bytesPerRow); - - result.set(temp, bottomOffset); - } - return result; - }, - erectPackedFloat: (array, width) => { - return array.subarray(0, width); - }, - erect2DPackedFloat: (array, width, height) => { - const yResults = new Array(height); - for (let y = 0; y < height; y++) { - const xStart = y * width; - const xEnd = xStart + width; - yResults[y] = array.subarray(xStart, xEnd); - } - return yResults; - }, - erect3DPackedFloat: (array, width, height, depth) => { - const zResults = new Array(depth); - for (let z = 0; z < depth; z++) { - const yResults = new Array(height); - for (let y = 0; y < height; y++) { - const xStart = (z * height * width) + y * width; - const xEnd = xStart + width; - yResults[y] = array.subarray(xStart, xEnd); - } - zResults[z] = yResults; - } - return zResults; - }, - erectMemoryOptimizedFloat: (array, width) => { - return array.subarray(0, width); - }, - erectMemoryOptimized2DFloat: (array, width, height) => { - const yResults = new Array(height); - for (let y = 0; y < height; y++) { - const offset = y * width; - yResults[y] = array.subarray(offset, offset + width); - } - return yResults; - }, - erectMemoryOptimized3DFloat: (array, width, height, depth) => { - const zResults = new Array(depth); - for (let z = 0; z < depth; z++) { - const yResults = new Array(height); - for (let y = 0; y < height; y++) { - const offset = (z * height * width) + (y * width); - yResults[y] = array.subarray(offset, offset + width); - } - zResults[z] = yResults; - } - return zResults; - }, - erectFloat: (array, width) => { - const xResults = new Float32Array(width); - let i = 0; - for (let x = 0; x < width; x++) { - xResults[x] = array[i]; - i += 4; - } - return xResults; - }, - erect2DFloat: (array, width, height) => { - const yResults = new Array(height); - let i = 0; - for (let y = 0; y < height; y++) { - const xResults = new Float32Array(width); - for (let x = 0; x < width; x++) { - xResults[x] = array[i]; - i += 4; - } - yResults[y] = xResults; - } - return yResults; - }, - erect3DFloat: (array, width, height, depth) => { - const zResults = new Array(depth); - let i = 0; - for (let z = 0; z < depth; z++) { - const yResults = new Array(height); - for (let y = 0; y < height; y++) { - const xResults = new Float32Array(width); - for (let x = 0; x < width; x++) { - xResults[x] = array[i]; - i += 4; - } - yResults[y] = xResults; - } - zResults[z] = yResults; - } - return zResults; - }, - erectArray2: (array, width) => { - const xResults = new Array(width); - const xResultsMax = width * 4; - let i = 0; - for (let x = 0; x < xResultsMax; x += 4) { - xResults[i++] = array.subarray(x, x + 2); - } - return xResults; - }, - erect2DArray2: (array, width, height) => { - const yResults = new Array(height); - const XResultsMax = width * 4; - for (let y = 0; y < height; y++) { - const xResults = new Array(width); - const offset = y * XResultsMax; - let i = 0; - for (let x = 0; x < XResultsMax; x += 4) { - xResults[i++] = array.subarray(x + offset, x + offset + 2); - } - yResults[y] = xResults; - } - return yResults; - }, - erect3DArray2: (array, width, height, depth) => { - const xResultsMax = width * 4; - const zResults = new Array(depth); - for (let z = 0; z < depth; z++) { - const yResults = new Array(height); - for (let y = 0; y < height; y++) { - const xResults = new Array(width); - const offset = (z * xResultsMax * height) + (y * xResultsMax); - let i = 0; - for (let x = 0; x < xResultsMax; x += 4) { - xResults[i++] = array.subarray(x + offset, x + offset + 2); - } - yResults[y] = xResults; - } - zResults[z] = yResults; - } - return zResults; - }, - erectArray3: (array, width) => { - const xResults = new Array(width); - const xResultsMax = width * 4; - let i = 0; - for (let x = 0; x < xResultsMax; x += 4) { - xResults[i++] = array.subarray(x, x + 3); - } - return xResults; - }, - erect2DArray3: (array, width, height) => { - const xResultsMax = width * 4; - const yResults = new Array(height); - for (let y = 0; y < height; y++) { - const xResults = new Array(width); - const offset = y * xResultsMax; - let i = 0; - for (let x = 0; x < xResultsMax; x += 4) { - xResults[i++] = array.subarray(x + offset, x + offset + 3); - } - yResults[y] = xResults; - } - return yResults; - }, - erect3DArray3: (array, width, height, depth) => { - const xResultsMax = width * 4; - const zResults = new Array(depth); - for (let z = 0; z < depth; z++) { - const yResults = new Array(height); - for (let y = 0; y < height; y++) { - const xResults = new Array(width); - const offset = (z * xResultsMax * height) + (y * xResultsMax); - let i = 0; - for (let x = 0; x < xResultsMax; x += 4) { - xResults[i++] = array.subarray(x + offset, x + offset + 3); - } - yResults[y] = xResults; - } - zResults[z] = yResults; - } - return zResults; - }, - erectArray4: (array, width) => { - const xResults = new Array(array); - const xResultsMax = width * 4; - let i = 0; - for (let x = 0; x < xResultsMax; x += 4) { - xResults[i++] = array.subarray(x, x + 4); - } - return xResults; - }, - erect2DArray4: (array, width, height) => { - const xResultsMax = width * 4; - const yResults = new Array(height); - for (let y = 0; y < height; y++) { - const xResults = new Array(width); - const offset = y * xResultsMax; - let i = 0; - for (let x = 0; x < xResultsMax; x += 4) { - xResults[i++] = array.subarray(x + offset, x + offset + 4); - } - yResults[y] = xResults; - } - return yResults; - }, - erect3DArray4: (array, width, height, depth) => { - const xResultsMax = width * 4; - const zResults = new Array(depth); - for (let z = 0; z < depth; z++) { - const yResults = new Array(height); - for (let y = 0; y < height; y++) { - const xResults = new Array(width); - const offset = (z * xResultsMax * height) + (y * xResultsMax); - let i = 0; - for (let x = 0; x < xResultsMax; x += 4) { - xResults[i++] = array.subarray(x + offset, x + offset + 4); - } - yResults[y] = xResults; - } - zResults[z] = yResults; - } - return zResults; - }, - - flattenFunctionToString: (source, settings) => { - const { findDependency, thisLookup, doNotDefine } = settings; - let flattened = settings.flattened; - if (!flattened) { - flattened = settings.flattened = {}; - } - const ast = acorn.parse(source); - const functionDependencies = []; - let indent = 0; - - function flatten(ast) { - if (Array.isArray(ast)) { - const results = []; - for (let i = 0; i < ast.length; i++) { - results.push(flatten(ast[i])); - } - return results.join(''); - } - switch (ast.type) { - case 'Program': - return flatten(ast.body) + (ast.body[0].type === 'VariableDeclaration' ? ';' : ''); - case 'FunctionDeclaration': - return `function ${ast.id.name}(${ast.params.map(flatten).join(', ')}) ${ flatten(ast.body) }`; - case 'BlockStatement': { - const result = []; - indent += 2; - for (let i = 0; i < ast.body.length; i++) { - const flat = flatten(ast.body[i]); - if (flat) { - result.push(' '.repeat(indent) + flat, ';\n'); - } - } - indent -= 2; - return `{\n${result.join('')}}`; - } - case 'VariableDeclaration': - const declarations = utils.normalizeDeclarations(ast) - .map(flatten) - .filter(r => r !== null); - if (declarations.length < 1) { - return ''; - } else { - return `${ast.kind} ${declarations.join(',')}`; - } - case 'VariableDeclarator': - if (ast.init.object && ast.init.object.type === 'ThisExpression') { - const lookup = thisLookup(ast.init.property.name, true); - if (lookup) { - return `${ast.id.name} = ${flatten(ast.init)}`; - } else { - return null; - } - } else { - return `${ast.id.name} = ${flatten(ast.init)}`; - } - case 'CallExpression': { - if (ast.callee.property.name === 'subarray') { - return `${flatten(ast.callee.object)}.${flatten(ast.callee.property)}(${ast.arguments.map(value => flatten(value)).join(', ')})`; - } - if (ast.callee.object.name === 'gl' || ast.callee.object.name === 'context') { - return `${flatten(ast.callee.object)}.${flatten(ast.callee.property)}(${ast.arguments.map(value => flatten(value)).join(', ')})`; - } - if (ast.callee.object.type === 'ThisExpression') { - functionDependencies.push(findDependency('this', ast.callee.property.name)); - return `${ast.callee.property.name}(${ast.arguments.map(value => flatten(value)).join(', ')})`; - } else if (ast.callee.object.name) { - const foundSource = findDependency(ast.callee.object.name, ast.callee.property.name); - if (foundSource === null) { - return `${ast.callee.object.name}.${ast.callee.property.name}(${ast.arguments.map(value => flatten(value)).join(', ')})`; - } else { - functionDependencies.push(foundSource); - return `${ast.callee.property.name}(${ast.arguments.map(value => flatten(value)).join(', ')})`; - } - } else if (ast.callee.object.type === 'MemberExpression') { - return `${flatten(ast.callee.object)}.${ast.callee.property.name}(${ast.arguments.map(value => flatten(value)).join(', ')})`; - } else { - throw new Error('unknown ast.callee'); - } - } - case 'ReturnStatement': - return `return ${flatten(ast.argument)}`; - case 'BinaryExpression': - return `(${flatten(ast.left)}${ast.operator}${flatten(ast.right)})`; - case 'UnaryExpression': - if (ast.prefix) { - return `${ast.operator} ${flatten(ast.argument)}`; - } else { - return `${flatten(ast.argument)} ${ast.operator}`; - } - case 'ExpressionStatement': - return `${flatten(ast.expression)}`; - case 'SequenceExpression': - return `(${flatten(ast.expressions)})`; - case 'ArrowFunctionExpression': - return `(${ast.params.map(flatten).join(', ')}) => ${flatten(ast.body)}`; - case 'Literal': - return ast.raw; - case 'Identifier': - return ast.name; - case 'MemberExpression': - if (ast.object.type === 'ThisExpression') { - return thisLookup(ast.property.name); - } - if (ast.computed) { - return `${flatten(ast.object)}[${flatten(ast.property)}]`; - } - return flatten(ast.object) + '.' + flatten(ast.property); - case 'ThisExpression': - return 'this'; - case 'NewExpression': - return `new ${flatten(ast.callee)}(${ast.arguments.map(value => flatten(value)).join(', ')})`; - case 'ForStatement': - return `for (${flatten(ast.init)};${flatten(ast.test)};${flatten(ast.update)}) ${flatten(ast.body)}`; - case 'AssignmentExpression': - return `${flatten(ast.left)}${ast.operator}${flatten(ast.right)}`; - case 'UpdateExpression': - return `${flatten(ast.argument)}${ast.operator}`; - case 'IfStatement': - return `if (${flatten(ast.test)}) ${flatten(ast.consequent)}`; - case 'ThrowStatement': - return `throw ${flatten(ast.argument)}`; - case 'ObjectPattern': - return ast.properties.map(flatten).join(', '); - case 'ArrayPattern': - return ast.elements.map(flatten).join(', '); - case 'DebuggerStatement': - return 'debugger;'; - case 'ConditionalExpression': - return `${flatten(ast.test)}?${flatten(ast.consequent)}:${flatten(ast.alternate)}`; - case 'Property': - if (ast.kind === 'init') { - return flatten(ast.key); - } - } - throw new Error(`unhandled ast.type of ${ ast.type }`); - } - const result = flatten(ast); - if (functionDependencies.length > 0) { - const flattenedFunctionDependencies = []; - for (let i = 0; i < functionDependencies.length; i++) { - const functionDependency = functionDependencies[i]; - if (!flattened[functionDependency]) { - flattened[functionDependency] = true; - } - functionDependency ? flattenedFunctionDependencies.push(utils.flattenFunctionToString(functionDependency, settings) + '\n') : ''; - } - return flattenedFunctionDependencies.join('') + result; - } - return result; - }, - - normalizeDeclarations: (ast) => { - if (ast.type !== 'VariableDeclaration') throw new Error('Ast is not of type "VariableDeclaration"'); - const normalizedDeclarations = []; - for (let declarationIndex = 0; declarationIndex < ast.declarations.length; declarationIndex++) { - const declaration = ast.declarations[declarationIndex]; - if (declaration.id && declaration.id.type === 'ObjectPattern' && declaration.id.properties) { - const { properties } = declaration.id; - for (let propertyIndex = 0; propertyIndex < properties.length; propertyIndex++) { - const property = properties[propertyIndex]; - if (property.value.type === 'ObjectPattern' && property.value.properties) { - for (let subPropertyIndex = 0; subPropertyIndex < property.value.properties.length; subPropertyIndex++) { - const subProperty = property.value.properties[subPropertyIndex]; - if (subProperty.type === 'Property') { - normalizedDeclarations.push({ - type: 'VariableDeclarator', - id: { - type: 'Identifier', - name: subProperty.key.name - }, - init: { - type: 'MemberExpression', - object: { - type: 'MemberExpression', - object: declaration.init, - property: { - type: 'Identifier', - name: property.key.name - }, - computed: false - }, - property: { - type: 'Identifier', - name: subProperty.key.name - }, - computed: false - } - }); - } else { - throw new Error('unexpected state'); - } - } - } else if (property.value.type === 'Identifier') { - normalizedDeclarations.push({ - type: 'VariableDeclarator', - id: { - type: 'Identifier', - name: property.value && property.value.name ? property.value.name : property.key.name - }, - init: { - type: 'MemberExpression', - object: declaration.init, - property: { - type: 'Identifier', - name: property.key.name - }, - computed: false - } - }); - } else { - throw new Error('unexpected state'); - } - } - } else if (declaration.id && declaration.id.type === 'ArrayPattern' && declaration.id.elements) { - const { elements } = declaration.id; - for (let elementIndex = 0; elementIndex < elements.length; elementIndex++) { - const element = elements[elementIndex]; - if (element.type === 'Identifier') { - normalizedDeclarations.push({ - type: 'VariableDeclarator', - id: { - type: 'Identifier', - name: element.name - }, - init: { - type: 'MemberExpression', - object: declaration.init, - property: { - type: 'Literal', - value: elementIndex, - raw: elementIndex.toString(), - start: element.start, - end: element.end - }, - computed: true - } - }); - } else { - throw new Error('unexpected state'); - } - } - } else { - normalizedDeclarations.push(declaration); - } - } - return normalizedDeclarations; - }, - - splitHTMLImageToRGB: (gpu, image) => { - const rKernel = gpu.createKernel(function(a) { - const pixel = a[this.thread.y][this.thread.x]; - return pixel.r * 255; - }, { - output: [image.width, image.height], - precision: 'unsigned', - argumentTypes: { a: 'HTMLImage' }, - }); - const gKernel = gpu.createKernel(function(a) { - const pixel = a[this.thread.y][this.thread.x]; - return pixel.g * 255; - }, { - output: [image.width, image.height], - precision: 'unsigned', - argumentTypes: { a: 'HTMLImage' }, - }); - const bKernel = gpu.createKernel(function(a) { - const pixel = a[this.thread.y][this.thread.x]; - return pixel.b * 255; - }, { - output: [image.width, image.height], - precision: 'unsigned', - argumentTypes: { a: 'HTMLImage' }, - }); - const aKernel = gpu.createKernel(function(a) { - const pixel = a[this.thread.y][this.thread.x]; - return pixel.a * 255; - }, { - output: [image.width, image.height], - precision: 'unsigned', - argumentTypes: { a: 'HTMLImage' }, - }); - const result = [ - rKernel(image), - gKernel(image), - bKernel(image), - aKernel(image), - ]; - result.rKernel = rKernel; - result.gKernel = gKernel; - result.bKernel = bKernel; - result.aKernel = aKernel; - result.gpu = gpu; - return result; - }, - - splitRGBAToCanvases: (gpu, rgba, width, height) => { - const visualKernelR = gpu.createKernel(function(v) { - const pixel = v[this.thread.y][this.thread.x]; - this.color(pixel.r / 255, 0, 0, 255); - }, { - output: [width, height], - graphical: true, - argumentTypes: { v: 'Array2D(4)' } - }); - visualKernelR(rgba); - - const visualKernelG = gpu.createKernel(function(v) { - const pixel = v[this.thread.y][this.thread.x]; - this.color(0, pixel.g / 255, 0, 255); - }, { - output: [width, height], - graphical: true, - argumentTypes: { v: 'Array2D(4)' } - }); - visualKernelG(rgba); - - const visualKernelB = gpu.createKernel(function(v) { - const pixel = v[this.thread.y][this.thread.x]; - this.color(0, 0, pixel.b / 255, 255); - }, { - output: [width, height], - graphical: true, - argumentTypes: { v: 'Array2D(4)' } - }); - visualKernelB(rgba); - - const visualKernelA = gpu.createKernel(function(v) { - const pixel = v[this.thread.y][this.thread.x]; - this.color(255, 255, 255, pixel.a / 255); - }, { - output: [width, height], - graphical: true, - argumentTypes: { v: 'Array2D(4)' } - }); - visualKernelA(rgba); - return [ - visualKernelR.canvas, - visualKernelG.canvas, - visualKernelB.canvas, - visualKernelA.canvas, - ]; - }, - - getMinifySafeName: (fn) => { - try { - const ast = acorn.parse(`const value = ${fn.toString()}`); - const { init } = ast.body[0].declarations[0]; - return init.body.name || init.body.body[0].argument.name; - } catch (e) { - throw new Error('Unrecognized function type. Please use `() => yourFunctionVariableHere` or function() { return yourFunctionVariableHere; }'); - } - }, - sanitizeName: function(name) { - if (dollarSign.test(name)) { - name = name.replace(dollarSign, 'S_S'); - } - if (doubleUnderscore.test(name)) { - name = name.replace(doubleUnderscore, 'U_U'); - } else if (singleUnderscore.test(name)) { - name = name.replace(singleUnderscore, 'u_u'); - } - return name; - } -}; - -const dollarSign = /\$/; -const doubleUnderscore = /__/; -const singleUnderscore = /_/; - -const _systemEndianness = utils.getSystemEndianness(); - -module.exports = { - utils -}; -},{"./input":110,"./texture":113,"acorn":1}]},{},[107])(107) -}); diff --git a/dist/gpu-browser.min.js b/dist/gpu-browser.min.js deleted file mode 100644 index a488a459..00000000 --- a/dist/gpu-browser.min.js +++ /dev/null @@ -1,28 +0,0 @@ -/** - * gpu.js - * http://gpu.rocks/ - * - * GPU Accelerated JavaScript - * - * @version 2.16.0 - * @date Wed Nov 16 2022 15:48:40 GMT-0500 (Eastern Standard Time) - * - * @license MIT - * The MIT License - * - * Copyright (c) 2022 gpu.js Team - *//** - * gpu.js - * http://gpu.rocks/ - * - * GPU Accelerated JavaScript - * - * @version 2.16.0 - * @date Wed Nov 16 2022 15:48:37 GMT-0500 (Eastern Standard Time) - * - * @license MIT - * The MIT License - * - * Copyright (c) 2022 gpu.js Team - */ -!function(e){if("object"==typeof exports&&"undefined"!=typeof module)module.exports=e();else if("function"==typeof define&&define.amd)define([],e);else{("undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self?self:this).GPU=e()}}((function(){return function e(t,n,r){function i(a,o){if(!n[a]){if(!t[a]){var u="function"==typeof require&&require;if(!o&&u)return u(a,!0);if(s)return s(a,!0);var l=new Error("Cannot find module '"+a+"'");throw l.code="MODULE_NOT_FOUND",l}var h=n[a]={exports:{}};t[a][0].call(h.exports,(function(e){return i(t[a][1][e]||e)}),h,h.exports,e,t,n,r)}return n[a].exports}for(var s="function"==typeof require&&require,a=0;ae)return!1;if((n+=t[r+1])>=e)return!0}}function p(e,t){return e<65?36===e:e<91||(e<97?95===e:e<123||(e<=65535?e>=170&&o.test(String.fromCharCode(e)):!1!==t&&c(e,l)))}function d(e,t){return e<48?36===e:e<58||!(e<65)&&(e<91||(e<97?95===e:e<123||(e<=65535?e>=170&&u.test(String.fromCharCode(e)):!1!==t&&(c(e,l)||c(e,h)))))}var m=function(e,t){void 0===t&&(t={}),this.label=e,this.keyword=t.keyword,this.beforeExpr=!!t.beforeExpr,this.startsExpr=!!t.startsExpr,this.isLoop=!!t.isLoop,this.isAssign=!!t.isAssign,this.prefix=!!t.prefix,this.postfix=!!t.postfix,this.binop=t.binop||null,this.updateContext=null};function f(e,t){return new m(e,{beforeExpr:!0,binop:t})}var g={beforeExpr:!0},x={startsExpr:!0},y={};function b(e,t){return void 0===t&&(t={}),t.keyword=e,y[e]=new m(e,t)}var T={num:new m("num",x),regexp:new m("regexp",x),string:new m("string",x),name:new m("name",x),eof:new m("eof"),bracketL:new m("[",{beforeExpr:!0,startsExpr:!0}),bracketR:new m("]"),braceL:new m("{",{beforeExpr:!0,startsExpr:!0}),braceR:new m("}"),parenL:new m("(",{beforeExpr:!0,startsExpr:!0}),parenR:new m(")"),comma:new m(",",g),semi:new m(";",g),colon:new m(":",g),dot:new m("."),question:new m("?",g),arrow:new m("=>",g),template:new m("template"),invalidTemplate:new m("invalidTemplate"),ellipsis:new m("...",g),backQuote:new m("`",x),dollarBraceL:new m("${",{beforeExpr:!0,startsExpr:!0}),eq:new m("=",{beforeExpr:!0,isAssign:!0}),assign:new m("_=",{beforeExpr:!0,isAssign:!0}),incDec:new m("++/--",{prefix:!0,postfix:!0,startsExpr:!0}),prefix:new m("!/~",{beforeExpr:!0,prefix:!0,startsExpr:!0}),logicalOR:f("||",1),logicalAND:f("&&",2),bitwiseOR:f("|",3),bitwiseXOR:f("^",4),bitwiseAND:f("&",5),equality:f("==/!=/===/!==",6),relational:f("/<=/>=",7),bitShift:f("<>/>>>",8),plusMin:new m("+/-",{beforeExpr:!0,binop:9,prefix:!0,startsExpr:!0}),modulo:f("%",10),star:f("*",10),slash:f("/",10),starstar:new m("**",{beforeExpr:!0}),_break:b("break"),_case:b("case",g),_catch:b("catch"),_continue:b("continue"),_debugger:b("debugger"),_default:b("default",g),_do:b("do",{isLoop:!0,beforeExpr:!0}),_else:b("else",g),_finally:b("finally"),_for:b("for",{isLoop:!0}),_function:b("function",x),_if:b("if"),_return:b("return",g),_switch:b("switch"),_throw:b("throw",g),_try:b("try"),_var:b("var"),_const:b("const"),_while:b("while",{isLoop:!0}),_with:b("with"),_new:b("new",{beforeExpr:!0,startsExpr:!0}),_this:b("this",x),_super:b("super",x),_class:b("class",x),_extends:b("extends",g),_export:b("export"),_import:b("import",x),_null:b("null",x),_true:b("true",x),_false:b("false",x),_in:b("in",{beforeExpr:!0,binop:7}),_instanceof:b("instanceof",{beforeExpr:!0,binop:7}),_typeof:b("typeof",{beforeExpr:!0,prefix:!0,startsExpr:!0}),_void:b("void",{beforeExpr:!0,prefix:!0,startsExpr:!0}),_delete:b("delete",{beforeExpr:!0,prefix:!0,startsExpr:!0})},v=/\r\n?|\n|\u2028|\u2029/,S=new RegExp(v.source,"g");function A(e,t){return 10===e||13===e||!t&&(8232===e||8233===e)}var _=/[\u1680\u2000-\u200a\u202f\u205f\u3000\ufeff]/,E=/(?:\s|\/\/.*|\/\*[^]*?\*\/)*/g,w=Object.prototype,k=w.hasOwnProperty,I=w.toString;function D(e,t){return k.call(e,t)}var C=Array.isArray||function(e){return"[object Array]"===I.call(e)};function $(e){return new RegExp("^(?:"+e.replace(/ /g,"|")+")$")}var L=function(e,t){this.line=e,this.column=t};L.prototype.offset=function(e){return new L(this.line,this.column+e)};var R=function(e,t,n){this.start=t,this.end=n,null!==e.sourceFile&&(this.source=e.sourceFile)};function F(e,t){for(var n=1,r=0;;){S.lastIndex=r;var i=S.exec(e);if(!(i&&i.index=2015&&(t.ecmaVersion-=2009),null==t.allowReserved&&(t.allowReserved=t.ecmaVersion<5),C(t.onToken)){var r=t.onToken;t.onToken=function(e){return r.push(e)}}return C(t.onComment)&&(t.onComment=function(e,t){return function(n,r,i,s,a,o){var u={type:n?"Block":"Line",value:r,start:i,end:s};e.locations&&(u.loc=new R(this,a,o)),e.ranges&&(u.range=[i,s]),t.push(u)}}(t,t.onComment)),t}function M(e,t){return 2|(e?4:0)|(t?8:0)}var O=function(e,n,i){this.options=e=V(e),this.sourceFile=e.sourceFile,this.keywords=$(r[e.ecmaVersion>=6?6:"module"===e.sourceType?"5module":5]);var s="";if(!0!==e.allowReserved){for(var a=e.ecmaVersion;!(s=t[a]);a--);"module"===e.sourceType&&(s+=" await")}this.reservedWords=$(s);var o=(s?s+" ":"")+t.strict;this.reservedWordsStrict=$(o),this.reservedWordsStrictBind=$(o+" "+t.strictBind),this.input=String(n),this.containsEsc=!1,i?(this.pos=i,this.lineStart=this.input.lastIndexOf("\n",i-1)+1,this.curLine=this.input.slice(0,this.lineStart).split(v).length):(this.pos=this.lineStart=0,this.curLine=1),this.type=T.eof,this.value=null,this.start=this.end=this.pos,this.startLoc=this.endLoc=this.curPosition(),this.lastTokEndLoc=this.lastTokStartLoc=null,this.lastTokStart=this.lastTokEnd=this.pos,this.context=this.initialContext(),this.exprAllowed=!0,this.inModule="module"===e.sourceType,this.strict=this.inModule||this.strictDirective(this.pos),this.potentialArrowAt=-1,this.yieldPos=this.awaitPos=this.awaitIdentPos=0,this.labels=[],this.undefinedExports={},0===this.pos&&e.allowHashBang&&"#!"===this.input.slice(0,2)&&this.skipLineComment(2),this.scopeStack=[],this.enterScope(1),this.regexpState=null},z={inFunction:{configurable:!0},inGenerator:{configurable:!0},inAsync:{configurable:!0},allowSuper:{configurable:!0},allowDirectSuper:{configurable:!0},treatFunctionsAsVar:{configurable:!0}};O.prototype.parse=function(){var e=this.options.program||this.startNode();return this.nextToken(),this.parseTopLevel(e)},z.inFunction.get=function(){return(2&this.currentVarScope().flags)>0},z.inGenerator.get=function(){return(8&this.currentVarScope().flags)>0},z.inAsync.get=function(){return(4&this.currentVarScope().flags)>0},z.allowSuper.get=function(){return(64&this.currentThisScope().flags)>0},z.allowDirectSuper.get=function(){return(128&this.currentThisScope().flags)>0},z.treatFunctionsAsVar.get=function(){return this.treatFunctionsAsVarInScope(this.currentScope())},O.prototype.inNonArrowFunction=function(){return(2&this.currentThisScope().flags)>0},O.extend=function(){for(var e=[],t=arguments.length;t--;)e[t]=arguments[t];for(var n=this,r=0;r-1&&this.raiseRecoverable(e.trailingComma,"Comma is not permitted after the rest element");var n=t?e.parenthesizedAssign:e.parenthesizedBind;n>-1&&this.raiseRecoverable(n,"Parenthesized pattern")}},P.checkExpressionErrors=function(e,t){if(!e)return!1;var n=e.shorthandAssign,r=e.doubleProto;if(!t)return n>=0||r>=0;n>=0&&this.raise(n,"Shorthand property assignments are valid only in destructuring patterns"),r>=0&&this.raiseRecoverable(r,"Redefinition of __proto__ property")},P.checkYieldAwaitInDefaultParams=function(){this.yieldPos&&(!this.awaitPos||this.yieldPos=6&&this.unexpected(),this.parseFunctionStatement(s,!1,!e);case T._class:return e&&this.unexpected(),this.parseClass(s,!0);case T._if:return this.parseIfStatement(s);case T._return:return this.parseReturnStatement(s);case T._switch:return this.parseSwitchStatement(s);case T._throw:return this.parseThrowStatement(s);case T._try:return this.parseTryStatement(s);case T._const:case T._var:return r=r||this.value,e&&"var"!==r&&this.unexpected(),this.parseVarStatement(s,r);case T._while:return this.parseWhileStatement(s);case T._with:return this.parseWithStatement(s);case T.braceL:return this.parseBlock(!0,s);case T.semi:return this.parseEmptyStatement(s);case T._export:case T._import:if(this.options.ecmaVersion>10&&i===T._import){E.lastIndex=this.pos;var a=E.exec(this.input),o=this.pos+a[0].length;if(40===this.input.charCodeAt(o))return this.parseExpressionStatement(s,this.parseExpression())}return this.options.allowImportExportEverywhere||(t||this.raise(this.start,"'import' and 'export' may only appear at the top level"),this.inModule||this.raise(this.start,"'import' and 'export' may appear only with 'sourceType: module'")),i===T._import?this.parseImport(s):this.parseExport(s,n);default:if(this.isAsyncFunction())return e&&this.unexpected(),this.next(),this.parseFunctionStatement(s,!0,!e);var u=this.value,l=this.parseExpression();return i===T.name&&"Identifier"===l.type&&this.eat(T.colon)?this.parseLabeledStatement(s,u,l,e):this.parseExpressionStatement(s,l)}},U.parseBreakContinueStatement=function(e,t){var n="break"===t;this.next(),this.eat(T.semi)||this.insertSemicolon()?e.label=null:this.type!==T.name?this.unexpected():(e.label=this.parseIdent(),this.semicolon());for(var r=0;r=6?this.eat(T.semi):this.semicolon(),this.finishNode(e,"DoWhileStatement")},U.parseForStatement=function(e){this.next();var t=this.options.ecmaVersion>=9&&(this.inAsync||!this.inFunction&&this.options.allowAwaitOutsideFunction)&&this.eatContextual("await")?this.lastTokStart:-1;if(this.labels.push(B),this.enterScope(0),this.expect(T.parenL),this.type===T.semi)return t>-1&&this.unexpected(t),this.parseFor(e,null);var n=this.isLet();if(this.type===T._var||this.type===T._const||n){var r=this.startNode(),i=n?"let":this.value;return this.next(),this.parseVar(r,!0,i),this.finishNode(r,"VariableDeclaration"),(this.type===T._in||this.options.ecmaVersion>=6&&this.isContextual("of"))&&1===r.declarations.length?(this.options.ecmaVersion>=9&&(this.type===T._in?t>-1&&this.unexpected(t):e.await=t>-1),this.parseForIn(e,r)):(t>-1&&this.unexpected(t),this.parseFor(e,r))}var s=new G,a=this.parseExpression(!0,s);return this.type===T._in||this.options.ecmaVersion>=6&&this.isContextual("of")?(this.options.ecmaVersion>=9&&(this.type===T._in?t>-1&&this.unexpected(t):e.await=t>-1),this.toAssignable(a,!1,s),this.checkLVal(a),this.parseForIn(e,a)):(this.checkExpressionErrors(s,!0),t>-1&&this.unexpected(t),this.parseFor(e,a))},U.parseFunctionStatement=function(e,t,n){return this.next(),this.parseFunction(e,H|(n?0:X),!1,t)},U.parseIfStatement=function(e){return this.next(),e.test=this.parseParenExpression(),e.consequent=this.parseStatement("if"),e.alternate=this.eat(T._else)?this.parseStatement("if"):null,this.finishNode(e,"IfStatement")},U.parseReturnStatement=function(e){return this.inFunction||this.options.allowReturnOutsideFunction||this.raise(this.start,"'return' outside of function"),this.next(),this.eat(T.semi)||this.insertSemicolon()?e.argument=null:(e.argument=this.parseExpression(),this.semicolon()),this.finishNode(e,"ReturnStatement")},U.parseSwitchStatement=function(e){var t;this.next(),e.discriminant=this.parseParenExpression(),e.cases=[],this.expect(T.braceL),this.labels.push(W),this.enterScope(0);for(var n=!1;this.type!==T.braceR;)if(this.type===T._case||this.type===T._default){var r=this.type===T._case;t&&this.finishNode(t,"SwitchCase"),e.cases.push(t=this.startNode()),t.consequent=[],this.next(),r?t.test=this.parseExpression():(n&&this.raiseRecoverable(this.lastTokStart,"Multiple default clauses"),n=!0,t.test=null),this.expect(T.colon)}else t||this.unexpected(),t.consequent.push(this.parseStatement(null));return this.exitScope(),t&&this.finishNode(t,"SwitchCase"),this.next(),this.labels.pop(),this.finishNode(e,"SwitchStatement")},U.parseThrowStatement=function(e){return this.next(),v.test(this.input.slice(this.lastTokEnd,this.start))&&this.raise(this.lastTokEnd,"Illegal newline after throw"),e.argument=this.parseExpression(),this.semicolon(),this.finishNode(e,"ThrowStatement")};var j=[];U.parseTryStatement=function(e){if(this.next(),e.block=this.parseBlock(),e.handler=null,this.type===T._catch){var t=this.startNode();if(this.next(),this.eat(T.parenL)){t.param=this.parseBindingAtom();var n="Identifier"===t.param.type;this.enterScope(n?32:0),this.checkLVal(t.param,n?4:2),this.expect(T.parenR)}else this.options.ecmaVersion<10&&this.unexpected(),t.param=null,this.enterScope(0);t.body=this.parseBlock(!1),this.exitScope(),e.handler=this.finishNode(t,"CatchClause")}return e.finalizer=this.eat(T._finally)?this.parseBlock():null,e.handler||e.finalizer||this.raise(e.start,"Missing catch or finally clause"),this.finishNode(e,"TryStatement")},U.parseVarStatement=function(e,t){return this.next(),this.parseVar(e,!1,t),this.semicolon(),this.finishNode(e,"VariableDeclaration")},U.parseWhileStatement=function(e){return this.next(),e.test=this.parseParenExpression(),this.labels.push(B),e.body=this.parseStatement("while"),this.labels.pop(),this.finishNode(e,"WhileStatement")},U.parseWithStatement=function(e){return this.strict&&this.raise(this.start,"'with' in strict mode"),this.next(),e.object=this.parseParenExpression(),e.body=this.parseStatement("with"),this.finishNode(e,"WithStatement")},U.parseEmptyStatement=function(e){return this.next(),this.finishNode(e,"EmptyStatement")},U.parseLabeledStatement=function(e,t,n,r){for(var i=0,s=this.labels;i=0;o--){var u=this.labels[o];if(u.statementStart!==e.start)break;u.statementStart=this.start,u.kind=a}return this.labels.push({name:t,kind:a,statementStart:this.start}),e.body=this.parseStatement(r?-1===r.indexOf("label")?r+"label":r:"label"),this.labels.pop(),e.label=n,this.finishNode(e,"LabeledStatement")},U.parseExpressionStatement=function(e,t){return e.expression=t,this.semicolon(),this.finishNode(e,"ExpressionStatement")},U.parseBlock=function(e,t){for(void 0===e&&(e=!0),void 0===t&&(t=this.startNode()),t.body=[],this.expect(T.braceL),e&&this.enterScope(0);!this.eat(T.braceR);){var n=this.parseStatement(null);t.body.push(n)}return e&&this.exitScope(),this.finishNode(t,"BlockStatement")},U.parseFor=function(e,t){return e.init=t,this.expect(T.semi),e.test=this.type===T.semi?null:this.parseExpression(),this.expect(T.semi),e.update=this.type===T.parenR?null:this.parseExpression(),this.expect(T.parenR),e.body=this.parseStatement("for"),this.exitScope(),this.labels.pop(),this.finishNode(e,"ForStatement")},U.parseForIn=function(e,t){var n=this.type===T._in;return this.next(),"VariableDeclaration"===t.type&&null!=t.declarations[0].init&&(!n||this.options.ecmaVersion<8||this.strict||"var"!==t.kind||"Identifier"!==t.declarations[0].id.type)?this.raise(t.start,(n?"for-in":"for-of")+" loop variable declaration may not have an initializer"):"AssignmentPattern"===t.type&&this.raise(t.start,"Invalid left-hand side in for-loop"),e.left=t,e.right=n?this.parseExpression():this.parseMaybeAssign(),this.expect(T.parenR),e.body=this.parseStatement("for"),this.exitScope(),this.labels.pop(),this.finishNode(e,n?"ForInStatement":"ForOfStatement")},U.parseVar=function(e,t,n){for(e.declarations=[],e.kind=n;;){var r=this.startNode();if(this.parseVarId(r,n),this.eat(T.eq)?r.init=this.parseMaybeAssign(t):"const"!==n||this.type===T._in||this.options.ecmaVersion>=6&&this.isContextual("of")?"Identifier"===r.id.type||t&&(this.type===T._in||this.isContextual("of"))?r.init=null:this.raise(this.lastTokEnd,"Complex binding patterns require an initialization value"):this.unexpected(),e.declarations.push(this.finishNode(r,"VariableDeclarator")),!this.eat(T.comma))break}return e},U.parseVarId=function(e,t){e.id=this.parseBindingAtom(),this.checkLVal(e.id,"var"===t?1:2,!1)};var H=1,X=2;U.parseFunction=function(e,t,n,r){this.initFunction(e),(this.options.ecmaVersion>=9||this.options.ecmaVersion>=6&&!r)&&(this.type===T.star&&t&X&&this.unexpected(),e.generator=this.eat(T.star)),this.options.ecmaVersion>=8&&(e.async=!!r),t&H&&(e.id=4&t&&this.type!==T.name?null:this.parseIdent(),!e.id||t&X||this.checkLVal(e.id,this.strict||e.generator||e.async?this.treatFunctionsAsVar?1:2:3));var i=this.yieldPos,s=this.awaitPos,a=this.awaitIdentPos;return this.yieldPos=0,this.awaitPos=0,this.awaitIdentPos=0,this.enterScope(M(e.async,e.generator)),t&H||(e.id=this.type===T.name?this.parseIdent():null),this.parseFunctionParams(e),this.parseFunctionBody(e,n,!1),this.yieldPos=i,this.awaitPos=s,this.awaitIdentPos=a,this.finishNode(e,t&H?"FunctionDeclaration":"FunctionExpression")},U.parseFunctionParams=function(e){this.expect(T.parenL),e.params=this.parseBindingList(T.parenR,!1,this.options.ecmaVersion>=8),this.checkYieldAwaitInDefaultParams()},U.parseClass=function(e,t){this.next();var n=this.strict;this.strict=!0,this.parseClassId(e,t),this.parseClassSuper(e);var r=this.startNode(),i=!1;for(r.body=[],this.expect(T.braceL);!this.eat(T.braceR);){var s=this.parseClassElement(null!==e.superClass);s&&(r.body.push(s),"MethodDefinition"===s.type&&"constructor"===s.kind&&(i&&this.raise(s.start,"Duplicate constructor in the same class"),i=!0))}return e.body=this.finishNode(r,"ClassBody"),this.strict=n,this.finishNode(e,t?"ClassDeclaration":"ClassExpression")},U.parseClassElement=function(e){var t=this;if(this.eat(T.semi))return null;var n=this.startNode(),r=function(e,r){void 0===r&&(r=!1);var i=t.start,s=t.startLoc;return!!t.eatContextual(e)&&(!(t.type===T.parenL||r&&t.canInsertSemicolon())||(n.key&&t.unexpected(),n.computed=!1,n.key=t.startNodeAt(i,s),n.key.name=e,t.finishNode(n.key,"Identifier"),!1))};n.kind="method",n.static=r("static");var i=this.eat(T.star),s=!1;i||(this.options.ecmaVersion>=8&&r("async",!0)?(s=!0,i=this.options.ecmaVersion>=9&&this.eat(T.star)):r("get")?n.kind="get":r("set")&&(n.kind="set")),n.key||this.parsePropertyName(n);var a=n.key,o=!1;return n.computed||n.static||!("Identifier"===a.type&&"constructor"===a.name||"Literal"===a.type&&"constructor"===a.value)?n.static&&"Identifier"===a.type&&"prototype"===a.name&&this.raise(a.start,"Classes may not have a static property named prototype"):("method"!==n.kind&&this.raise(a.start,"Constructor can't have get/set modifier"),i&&this.raise(a.start,"Constructor can't be a generator"),s&&this.raise(a.start,"Constructor can't be an async method"),n.kind="constructor",o=e),this.parseClassMethod(n,i,s,o),"get"===n.kind&&0!==n.value.params.length&&this.raiseRecoverable(n.value.start,"getter should have no params"),"set"===n.kind&&1!==n.value.params.length&&this.raiseRecoverable(n.value.start,"setter should have exactly one param"),"set"===n.kind&&"RestElement"===n.value.params[0].type&&this.raiseRecoverable(n.value.params[0].start,"Setter cannot use rest params"),n},U.parseClassMethod=function(e,t,n,r){return e.value=this.parseMethod(t,n,r),this.finishNode(e,"MethodDefinition")},U.parseClassId=function(e,t){this.type===T.name?(e.id=this.parseIdent(),t&&this.checkLVal(e.id,2,!1)):(!0===t&&this.unexpected(),e.id=null)},U.parseClassSuper=function(e){e.superClass=this.eat(T._extends)?this.parseExprSubscripts():null},U.parseExport=function(e,t){if(this.next(),this.eat(T.star))return this.expectContextual("from"),this.type!==T.string&&this.unexpected(),e.source=this.parseExprAtom(),this.semicolon(),this.finishNode(e,"ExportAllDeclaration");if(this.eat(T._default)){var n;if(this.checkExport(t,"default",this.lastTokStart),this.type===T._function||(n=this.isAsyncFunction())){var r=this.startNode();this.next(),n&&this.next(),e.declaration=this.parseFunction(r,4|H,!1,n)}else if(this.type===T._class){var i=this.startNode();e.declaration=this.parseClass(i,"nullableID")}else e.declaration=this.parseMaybeAssign(),this.semicolon();return this.finishNode(e,"ExportDefaultDeclaration")}if(this.shouldParseExportStatement())e.declaration=this.parseStatement(null),"VariableDeclaration"===e.declaration.type?this.checkVariableExport(t,e.declaration.declarations):this.checkExport(t,e.declaration.id.name,e.declaration.id.start),e.specifiers=[],e.source=null;else{if(e.declaration=null,e.specifiers=this.parseExportSpecifiers(t),this.eatContextual("from"))this.type!==T.string&&this.unexpected(),e.source=this.parseExprAtom();else{for(var s=0,a=e.specifiers;s=6&&e)switch(e.type){case"Identifier":this.inAsync&&"await"===e.name&&this.raise(e.start,"Cannot use 'await' as identifier inside an async function");break;case"ObjectPattern":case"ArrayPattern":case"RestElement":break;case"ObjectExpression":e.type="ObjectPattern",n&&this.checkPatternErrors(n,!0);for(var r=0,i=e.properties;r=8&&!s&&"async"===a.name&&!this.canInsertSemicolon()&&this.eat(T._function))return this.parseFunction(this.startNodeAt(r,i),0,!1,!0);if(n&&!this.canInsertSemicolon()){if(this.eat(T.arrow))return this.parseArrowExpression(this.startNodeAt(r,i),[a],!1);if(this.options.ecmaVersion>=8&&"async"===a.name&&this.type===T.name&&!s)return a=this.parseIdent(!1),!this.canInsertSemicolon()&&this.eat(T.arrow)||this.unexpected(),this.parseArrowExpression(this.startNodeAt(r,i),[a],!0)}return a;case T.regexp:var o=this.value;return(t=this.parseLiteral(o.value)).regex={pattern:o.pattern,flags:o.flags},t;case T.num:case T.string:return this.parseLiteral(this.value);case T._null:case T._true:case T._false:return(t=this.startNode()).value=this.type===T._null?null:this.type===T._true,t.raw=this.type.keyword,this.next(),this.finishNode(t,"Literal");case T.parenL:var u=this.start,l=this.parseParenAndDistinguishExpression(n);return e&&(e.parenthesizedAssign<0&&!this.isSimpleAssignTarget(l)&&(e.parenthesizedAssign=u),e.parenthesizedBind<0&&(e.parenthesizedBind=u)),l;case T.bracketL:return t=this.startNode(),this.next(),t.elements=this.parseExprList(T.bracketR,!0,!0,e),this.finishNode(t,"ArrayExpression");case T.braceL:return this.parseObj(!1,e);case T._function:return t=this.startNode(),this.next(),this.parseFunction(t,0);case T._class:return this.parseClass(this.startNode(),!1);case T._new:return this.parseNew();case T.backQuote:return this.parseTemplate();case T._import:return this.options.ecmaVersion>=11?this.parseExprImport():this.unexpected();default:this.unexpected()}},Y.parseExprImport=function(){var e=this.startNode();if(this.next(),this.type===T.parenL)return this.parseDynamicImport(e);this.unexpected()},Y.parseDynamicImport=function(e){if(this.next(),e.source=this.parseMaybeAssign(),!this.eat(T.parenR)){var t=this.start;this.eat(T.comma)&&this.eat(T.parenR)?this.raiseRecoverable(t,"Trailing comma is not allowed in import()"):this.unexpected(t)}return this.finishNode(e,"ImportExpression")},Y.parseLiteral=function(e){var t=this.startNode();return t.value=e,t.raw=this.input.slice(this.start,this.end),110===t.raw.charCodeAt(t.raw.length-1)&&(t.bigint=t.raw.slice(0,-1)),this.next(),this.finishNode(t,"Literal")},Y.parseParenExpression=function(){this.expect(T.parenL);var e=this.parseExpression();return this.expect(T.parenR),e},Y.parseParenAndDistinguishExpression=function(e){var t,n=this.start,r=this.startLoc,i=this.options.ecmaVersion>=8;if(this.options.ecmaVersion>=6){this.next();var s,a=this.start,o=this.startLoc,u=[],l=!0,h=!1,c=new G,p=this.yieldPos,d=this.awaitPos;for(this.yieldPos=0,this.awaitPos=0;this.type!==T.parenR;){if(l?l=!1:this.expect(T.comma),i&&this.afterTrailingComma(T.parenR,!0)){h=!0;break}if(this.type===T.ellipsis){s=this.start,u.push(this.parseParenItem(this.parseRestBinding())),this.type===T.comma&&this.raise(this.start,"Comma is not permitted after the rest element");break}u.push(this.parseMaybeAssign(!1,c,this.parseParenItem))}var m=this.start,f=this.startLoc;if(this.expect(T.parenR),e&&!this.canInsertSemicolon()&&this.eat(T.arrow))return this.checkPatternErrors(c,!1),this.checkYieldAwaitInDefaultParams(),this.yieldPos=p,this.awaitPos=d,this.parseParenArrowList(n,r,u);u.length&&!h||this.unexpected(this.lastTokStart),s&&this.unexpected(s),this.checkExpressionErrors(c,!0),this.yieldPos=p||this.yieldPos,this.awaitPos=d||this.awaitPos,u.length>1?((t=this.startNodeAt(a,o)).expressions=u,this.finishNodeAt(t,"SequenceExpression",m,f)):t=u[0]}else t=this.parseParenExpression();if(this.options.preserveParens){var g=this.startNodeAt(n,r);return g.expression=t,this.finishNode(g,"ParenthesizedExpression")}return t},Y.parseParenItem=function(e){return e},Y.parseParenArrowList=function(e,t,n){return this.parseArrowExpression(this.startNodeAt(e,t),n)};var Z=[];Y.parseNew=function(){this.containsEsc&&this.raiseRecoverable(this.start,"Escape sequence in keyword new");var e=this.startNode(),t=this.parseIdent(!0);if(this.options.ecmaVersion>=6&&this.eat(T.dot)){e.meta=t;var n=this.containsEsc;return e.property=this.parseIdent(!0),("target"!==e.property.name||n)&&this.raiseRecoverable(e.property.start,"The only valid meta property for new is new.target"),this.inNonArrowFunction()||this.raiseRecoverable(e.start,"new.target can only be used in functions"),this.finishNode(e,"MetaProperty")}var r=this.start,i=this.startLoc,s=this.type===T._import;return e.callee=this.parseSubscripts(this.parseExprAtom(),r,i,!0),s&&"ImportExpression"===e.callee.type&&this.raise(r,"Cannot use new with import()"),this.eat(T.parenL)?e.arguments=this.parseExprList(T.parenR,this.options.ecmaVersion>=8,!1):e.arguments=Z,this.finishNode(e,"NewExpression")},Y.parseTemplateElement=function(e){var t=e.isTagged,n=this.startNode();return this.type===T.invalidTemplate?(t||this.raiseRecoverable(this.start,"Bad escape sequence in untagged template literal"),n.value={raw:this.value,cooked:null}):n.value={raw:this.input.slice(this.start,this.end).replace(/\r\n?/g,"\n"),cooked:this.value},this.next(),n.tail=this.type===T.backQuote,this.finishNode(n,"TemplateElement")},Y.parseTemplate=function(e){void 0===e&&(e={});var t=e.isTagged;void 0===t&&(t=!1);var n=this.startNode();this.next(),n.expressions=[];var r=this.parseTemplateElement({isTagged:t});for(n.quasis=[r];!r.tail;)this.type===T.eof&&this.raise(this.pos,"Unterminated template literal"),this.expect(T.dollarBraceL),n.expressions.push(this.parseExpression()),this.expect(T.braceR),n.quasis.push(r=this.parseTemplateElement({isTagged:t}));return this.next(),this.finishNode(n,"TemplateLiteral")},Y.isAsyncProp=function(e){return!e.computed&&"Identifier"===e.key.type&&"async"===e.key.name&&(this.type===T.name||this.type===T.num||this.type===T.string||this.type===T.bracketL||this.type.keyword||this.options.ecmaVersion>=9&&this.type===T.star)&&!v.test(this.input.slice(this.lastTokEnd,this.start))},Y.parseObj=function(e,t){var n=this.startNode(),r=!0,i={};for(n.properties=[],this.next();!this.eat(T.braceR);){if(r)r=!1;else if(this.expect(T.comma),this.options.ecmaVersion>=5&&this.afterTrailingComma(T.braceR))break;var s=this.parseProperty(e,t);e||this.checkPropClash(s,i,t),n.properties.push(s)}return this.finishNode(n,e?"ObjectPattern":"ObjectExpression")},Y.parseProperty=function(e,t){var n,r,i,s,a=this.startNode();if(this.options.ecmaVersion>=9&&this.eat(T.ellipsis))return e?(a.argument=this.parseIdent(!1),this.type===T.comma&&this.raise(this.start,"Comma is not permitted after the rest element"),this.finishNode(a,"RestElement")):(this.type===T.parenL&&t&&(t.parenthesizedAssign<0&&(t.parenthesizedAssign=this.start),t.parenthesizedBind<0&&(t.parenthesizedBind=this.start)),a.argument=this.parseMaybeAssign(!1,t),this.type===T.comma&&t&&t.trailingComma<0&&(t.trailingComma=this.start),this.finishNode(a,"SpreadElement"));this.options.ecmaVersion>=6&&(a.method=!1,a.shorthand=!1,(e||t)&&(i=this.start,s=this.startLoc),e||(n=this.eat(T.star)));var o=this.containsEsc;return this.parsePropertyName(a),!e&&!o&&this.options.ecmaVersion>=8&&!n&&this.isAsyncProp(a)?(r=!0,n=this.options.ecmaVersion>=9&&this.eat(T.star),this.parsePropertyName(a,t)):r=!1,this.parsePropertyValue(a,e,n,r,i,s,t,o),this.finishNode(a,"Property")},Y.parsePropertyValue=function(e,t,n,r,i,s,a,o){if((n||r)&&this.type===T.colon&&this.unexpected(),this.eat(T.colon))e.value=t?this.parseMaybeDefault(this.start,this.startLoc):this.parseMaybeAssign(!1,a),e.kind="init";else if(this.options.ecmaVersion>=6&&this.type===T.parenL)t&&this.unexpected(),e.kind="init",e.method=!0,e.value=this.parseMethod(n,r);else if(t||o||!(this.options.ecmaVersion>=5)||e.computed||"Identifier"!==e.key.type||"get"!==e.key.name&&"set"!==e.key.name||this.type===T.comma||this.type===T.braceR)this.options.ecmaVersion>=6&&!e.computed&&"Identifier"===e.key.type?((n||r)&&this.unexpected(),this.checkUnreserved(e.key),"await"!==e.key.name||this.awaitIdentPos||(this.awaitIdentPos=i),e.kind="init",t?e.value=this.parseMaybeDefault(i,s,e.key):this.type===T.eq&&a?(a.shorthandAssign<0&&(a.shorthandAssign=this.start),e.value=this.parseMaybeDefault(i,s,e.key)):e.value=e.key,e.shorthand=!0):this.unexpected();else{(n||r)&&this.unexpected(),e.kind=e.key.name,this.parsePropertyName(e),e.value=this.parseMethod(!1);var u="get"===e.kind?0:1;if(e.value.params.length!==u){var l=e.value.start;"get"===e.kind?this.raiseRecoverable(l,"getter should have no params"):this.raiseRecoverable(l,"setter should have exactly one param")}else"set"===e.kind&&"RestElement"===e.value.params[0].type&&this.raiseRecoverable(e.value.params[0].start,"Setter cannot use rest params")}},Y.parsePropertyName=function(e){if(this.options.ecmaVersion>=6){if(this.eat(T.bracketL))return e.computed=!0,e.key=this.parseMaybeAssign(),this.expect(T.bracketR),e.key;e.computed=!1}return e.key=this.type===T.num||this.type===T.string?this.parseExprAtom():this.parseIdent("never"!==this.options.allowReserved)},Y.initFunction=function(e){e.id=null,this.options.ecmaVersion>=6&&(e.generator=e.expression=!1),this.options.ecmaVersion>=8&&(e.async=!1)},Y.parseMethod=function(e,t,n){var r=this.startNode(),i=this.yieldPos,s=this.awaitPos,a=this.awaitIdentPos;return this.initFunction(r),this.options.ecmaVersion>=6&&(r.generator=e),this.options.ecmaVersion>=8&&(r.async=!!t),this.yieldPos=0,this.awaitPos=0,this.awaitIdentPos=0,this.enterScope(64|M(t,r.generator)|(n?128:0)),this.expect(T.parenL),r.params=this.parseBindingList(T.parenR,!1,this.options.ecmaVersion>=8),this.checkYieldAwaitInDefaultParams(),this.parseFunctionBody(r,!1,!0),this.yieldPos=i,this.awaitPos=s,this.awaitIdentPos=a,this.finishNode(r,"FunctionExpression")},Y.parseArrowExpression=function(e,t,n){var r=this.yieldPos,i=this.awaitPos,s=this.awaitIdentPos;return this.enterScope(16|M(n,!1)),this.initFunction(e),this.options.ecmaVersion>=8&&(e.async=!!n),this.yieldPos=0,this.awaitPos=0,this.awaitIdentPos=0,e.params=this.toAssignableList(t,!0),this.parseFunctionBody(e,!0,!1),this.yieldPos=r,this.awaitPos=i,this.awaitIdentPos=s,this.finishNode(e,"ArrowFunctionExpression")},Y.parseFunctionBody=function(e,t,n){var r=t&&this.type!==T.braceL,i=this.strict,s=!1;if(r)e.body=this.parseMaybeAssign(),e.expression=!0,this.checkParams(e,!1);else{var a=this.options.ecmaVersion>=7&&!this.isSimpleParamList(e.params);i&&!a||(s=this.strictDirective(this.end))&&a&&this.raiseRecoverable(e.start,"Illegal 'use strict' directive in function with non-simple parameter list");var o=this.labels;this.labels=[],s&&(this.strict=!0),this.checkParams(e,!i&&!s&&!t&&!n&&this.isSimpleParamList(e.params)),e.body=this.parseBlock(!1),e.expression=!1,this.adaptDirectivePrologue(e.body.body),this.labels=o}this.exitScope(),this.strict&&e.id&&this.checkLVal(e.id,5),this.strict=i},Y.isSimpleParamList=function(e){for(var t=0,n=e;t-1||i.functions.indexOf(e)>-1||i.var.indexOf(e)>-1,i.lexical.push(e),this.inModule&&1&i.flags&&delete this.undefinedExports[e]}else if(4===t){this.currentScope().lexical.push(e)}else if(3===t){var s=this.currentScope();r=this.treatFunctionsAsVar?s.lexical.indexOf(e)>-1:s.lexical.indexOf(e)>-1||s.var.indexOf(e)>-1,s.functions.push(e)}else for(var a=this.scopeStack.length-1;a>=0;--a){var o=this.scopeStack[a];if(o.lexical.indexOf(e)>-1&&!(32&o.flags&&o.lexical[0]===e)||!this.treatFunctionsAsVarInScope(o)&&o.functions.indexOf(e)>-1){r=!0;break}if(o.var.push(e),this.inModule&&1&o.flags&&delete this.undefinedExports[e],3&o.flags)break}r&&this.raiseRecoverable(n,"Identifier '"+e+"' has already been declared")},Q.checkLocalExport=function(e){-1===this.scopeStack[0].lexical.indexOf(e.name)&&-1===this.scopeStack[0].var.indexOf(e.name)&&(this.undefinedExports[e.name]=e)},Q.currentScope=function(){return this.scopeStack[this.scopeStack.length-1]},Q.currentVarScope=function(){for(var e=this.scopeStack.length-1;;e--){var t=this.scopeStack[e];if(3&t.flags)return t}},Q.currentThisScope=function(){for(var e=this.scopeStack.length-1;;e--){var t=this.scopeStack[e];if(3&t.flags&&!(16&t.flags))return t}};var te=function(e,t,n){this.type="",this.start=t,this.end=0,e.options.locations&&(this.loc=new R(e,n)),e.options.directSourceFile&&(this.sourceFile=e.options.directSourceFile),e.options.ranges&&(this.range=[t,0])},ne=O.prototype;function re(e,t,n,r){return e.type=t,e.end=n,this.options.locations&&(e.loc.end=r),this.options.ranges&&(e.range[1]=n),e}ne.startNode=function(){return new te(this,this.start,this.startLoc)},ne.startNodeAt=function(e,t){return new te(this,e,t)},ne.finishNode=function(e,t){return re.call(this,e,t,this.lastTokEnd,this.lastTokEndLoc)},ne.finishNodeAt=function(e,t,n,r){return re.call(this,e,t,n,r)};var ie=function(e,t,n,r,i){this.token=e,this.isExpr=!!t,this.preserveSpace=!!n,this.override=r,this.generator=!!i},se={b_stat:new ie("{",!1),b_expr:new ie("{",!0),b_tmpl:new ie("${",!1),p_stat:new ie("(",!1),p_expr:new ie("(",!0),q_tmpl:new ie("`",!0,!0,(function(e){return e.tryReadTemplateToken()})),f_stat:new ie("function",!1),f_expr:new ie("function",!0),f_expr_gen:new ie("function",!0,!1,null,!0),f_gen:new ie("function",!1,!1,null,!0)},ae=O.prototype;ae.initialContext=function(){return[se.b_stat]},ae.braceIsBlock=function(e){var t=this.curContext();return t===se.f_expr||t===se.f_stat||(e!==T.colon||t!==se.b_stat&&t!==se.b_expr?e===T._return||e===T.name&&this.exprAllowed?v.test(this.input.slice(this.lastTokEnd,this.start)):e===T._else||e===T.semi||e===T.eof||e===T.parenR||e===T.arrow||(e===T.braceL?t===se.b_stat:e!==T._var&&e!==T._const&&e!==T.name&&!this.exprAllowed):!t.isExpr)},ae.inGeneratorContext=function(){for(var e=this.context.length-1;e>=1;e--){var t=this.context[e];if("function"===t.token)return t.generator}return!1},ae.updateContext=function(e){var t,n=this.type;n.keyword&&e===T.dot?this.exprAllowed=!1:(t=n.updateContext)?t.call(this,e):this.exprAllowed=n.beforeExpr},T.parenR.updateContext=T.braceR.updateContext=function(){if(1!==this.context.length){var e=this.context.pop();e===se.b_stat&&"function"===this.curContext().token&&(e=this.context.pop()),this.exprAllowed=!e.isExpr}else this.exprAllowed=!0},T.braceL.updateContext=function(e){this.context.push(this.braceIsBlock(e)?se.b_stat:se.b_expr),this.exprAllowed=!0},T.dollarBraceL.updateContext=function(){this.context.push(se.b_tmpl),this.exprAllowed=!0},T.parenL.updateContext=function(e){var t=e===T._if||e===T._for||e===T._with||e===T._while;this.context.push(t?se.p_stat:se.p_expr),this.exprAllowed=!0},T.incDec.updateContext=function(){},T._function.updateContext=T._class.updateContext=function(e){!e.beforeExpr||e===T.semi||e===T._else||e===T._return&&v.test(this.input.slice(this.lastTokEnd,this.start))||(e===T.colon||e===T.braceL)&&this.curContext()===se.b_stat?this.context.push(se.f_stat):this.context.push(se.f_expr),this.exprAllowed=!1},T.backQuote.updateContext=function(){this.curContext()===se.q_tmpl?this.context.pop():this.context.push(se.q_tmpl),this.exprAllowed=!1},T.star.updateContext=function(e){if(e===T._function){var t=this.context.length-1;this.context[t]===se.f_expr?this.context[t]=se.f_expr_gen:this.context[t]=se.f_gen}this.exprAllowed=!0},T.name.updateContext=function(e){var t=!1;this.options.ecmaVersion>=6&&e!==T.dot&&("of"===this.value&&!this.exprAllowed||"yield"===this.value&&this.inGeneratorContext())&&(t=!0),this.exprAllowed=t};var oe="ASCII ASCII_Hex_Digit AHex Alphabetic Alpha Any Assigned Bidi_Control Bidi_C Bidi_Mirrored Bidi_M Case_Ignorable CI Cased Changes_When_Casefolded CWCF Changes_When_Casemapped CWCM Changes_When_Lowercased CWL Changes_When_NFKC_Casefolded CWKCF Changes_When_Titlecased CWT Changes_When_Uppercased CWU Dash Default_Ignorable_Code_Point DI Deprecated Dep Diacritic Dia Emoji Emoji_Component Emoji_Modifier Emoji_Modifier_Base Emoji_Presentation Extender Ext Grapheme_Base Gr_Base Grapheme_Extend Gr_Ext Hex_Digit Hex IDS_Binary_Operator IDSB IDS_Trinary_Operator IDST ID_Continue IDC ID_Start IDS Ideographic Ideo Join_Control Join_C Logical_Order_Exception LOE Lowercase Lower Math Noncharacter_Code_Point NChar Pattern_Syntax Pat_Syn Pattern_White_Space Pat_WS Quotation_Mark QMark Radical Regional_Indicator RI Sentence_Terminal STerm Soft_Dotted SD Terminal_Punctuation Term Unified_Ideograph UIdeo Uppercase Upper Variation_Selector VS White_Space space XID_Continue XIDC XID_Start XIDS",ue=oe+" Extended_Pictographic",le={9:oe,10:ue,11:"ASCII ASCII_Hex_Digit AHex Alphabetic Alpha Any Assigned Bidi_Control Bidi_C Bidi_Mirrored Bidi_M Case_Ignorable CI Cased Changes_When_Casefolded CWCF Changes_When_Casemapped CWCM Changes_When_Lowercased CWL Changes_When_NFKC_Casefolded CWKCF Changes_When_Titlecased CWT Changes_When_Uppercased CWU Dash Default_Ignorable_Code_Point DI Deprecated Dep Diacritic Dia Emoji Emoji_Component Emoji_Modifier Emoji_Modifier_Base Emoji_Presentation Extender Ext Grapheme_Base Gr_Base Grapheme_Extend Gr_Ext Hex_Digit Hex IDS_Binary_Operator IDSB IDS_Trinary_Operator IDST ID_Continue IDC ID_Start IDS Ideographic Ideo Join_Control Join_C Logical_Order_Exception LOE Lowercase Lower Math Noncharacter_Code_Point NChar Pattern_Syntax Pat_Syn Pattern_White_Space Pat_WS Quotation_Mark QMark Radical Regional_Indicator RI Sentence_Terminal STerm Soft_Dotted SD Terminal_Punctuation Term Unified_Ideograph UIdeo Uppercase Upper Variation_Selector VS White_Space space XID_Continue XIDC XID_Start XIDS Extended_Pictographic"},he="Cased_Letter LC Close_Punctuation Pe Connector_Punctuation Pc Control Cc cntrl Currency_Symbol Sc Dash_Punctuation Pd Decimal_Number Nd digit Enclosing_Mark Me Final_Punctuation Pf Format Cf Initial_Punctuation Pi Letter L Letter_Number Nl Line_Separator Zl Lowercase_Letter Ll Mark M Combining_Mark Math_Symbol Sm Modifier_Letter Lm Modifier_Symbol Sk Nonspacing_Mark Mn Number N Open_Punctuation Ps Other C Other_Letter Lo Other_Number No Other_Punctuation Po Other_Symbol So Paragraph_Separator Zp Private_Use Co Punctuation P punct Separator Z Space_Separator Zs Spacing_Mark Mc Surrogate Cs Symbol S Titlecase_Letter Lt Unassigned Cn Uppercase_Letter Lu",ce="Adlam Adlm Ahom Ahom Anatolian_Hieroglyphs Hluw Arabic Arab Armenian Armn Avestan Avst Balinese Bali Bamum Bamu Bassa_Vah Bass Batak Batk Bengali Beng Bhaiksuki Bhks Bopomofo Bopo Brahmi Brah Braille Brai Buginese Bugi Buhid Buhd Canadian_Aboriginal Cans Carian Cari Caucasian_Albanian Aghb Chakma Cakm Cham Cham Cherokee Cher Common Zyyy Coptic Copt Qaac Cuneiform Xsux Cypriot Cprt Cyrillic Cyrl Deseret Dsrt Devanagari Deva Duployan Dupl Egyptian_Hieroglyphs Egyp Elbasan Elba Ethiopic Ethi Georgian Geor Glagolitic Glag Gothic Goth Grantha Gran Greek Grek Gujarati Gujr Gurmukhi Guru Han Hani Hangul Hang Hanunoo Hano Hatran Hatr Hebrew Hebr Hiragana Hira Imperial_Aramaic Armi Inherited Zinh Qaai Inscriptional_Pahlavi Phli Inscriptional_Parthian Prti Javanese Java Kaithi Kthi Kannada Knda Katakana Kana Kayah_Li Kali Kharoshthi Khar Khmer Khmr Khojki Khoj Khudawadi Sind Lao Laoo Latin Latn Lepcha Lepc Limbu Limb Linear_A Lina Linear_B Linb Lisu Lisu Lycian Lyci Lydian Lydi Mahajani Mahj Malayalam Mlym Mandaic Mand Manichaean Mani Marchen Marc Masaram_Gondi Gonm Meetei_Mayek Mtei Mende_Kikakui Mend Meroitic_Cursive Merc Meroitic_Hieroglyphs Mero Miao Plrd Modi Modi Mongolian Mong Mro Mroo Multani Mult Myanmar Mymr Nabataean Nbat New_Tai_Lue Talu Newa Newa Nko Nkoo Nushu Nshu Ogham Ogam Ol_Chiki Olck Old_Hungarian Hung Old_Italic Ital Old_North_Arabian Narb Old_Permic Perm Old_Persian Xpeo Old_South_Arabian Sarb Old_Turkic Orkh Oriya Orya Osage Osge Osmanya Osma Pahawh_Hmong Hmng Palmyrene Palm Pau_Cin_Hau Pauc Phags_Pa Phag Phoenician Phnx Psalter_Pahlavi Phlp Rejang Rjng Runic Runr Samaritan Samr Saurashtra Saur Sharada Shrd Shavian Shaw Siddham Sidd SignWriting Sgnw Sinhala Sinh Sora_Sompeng Sora Soyombo Soyo Sundanese Sund Syloti_Nagri Sylo Syriac Syrc Tagalog Tglg Tagbanwa Tagb Tai_Le Tale Tai_Tham Lana Tai_Viet Tavt Takri Takr Tamil Taml Tangut Tang Telugu Telu Thaana Thaa Thai Thai Tibetan Tibt Tifinagh Tfng Tirhuta Tirh Ugaritic Ugar Vai Vaii Warang_Citi Wara Yi Yiii Zanabazar_Square Zanb",pe=ce+" Dogra Dogr Gunjala_Gondi Gong Hanifi_Rohingya Rohg Makasar Maka Medefaidrin Medf Old_Sogdian Sogo Sogdian Sogd",de={9:ce,10:pe,11:"Adlam Adlm Ahom Ahom Anatolian_Hieroglyphs Hluw Arabic Arab Armenian Armn Avestan Avst Balinese Bali Bamum Bamu Bassa_Vah Bass Batak Batk Bengali Beng Bhaiksuki Bhks Bopomofo Bopo Brahmi Brah Braille Brai Buginese Bugi Buhid Buhd Canadian_Aboriginal Cans Carian Cari Caucasian_Albanian Aghb Chakma Cakm Cham Cham Cherokee Cher Common Zyyy Coptic Copt Qaac Cuneiform Xsux Cypriot Cprt Cyrillic Cyrl Deseret Dsrt Devanagari Deva Duployan Dupl Egyptian_Hieroglyphs Egyp Elbasan Elba Ethiopic Ethi Georgian Geor Glagolitic Glag Gothic Goth Grantha Gran Greek Grek Gujarati Gujr Gurmukhi Guru Han Hani Hangul Hang Hanunoo Hano Hatran Hatr Hebrew Hebr Hiragana Hira Imperial_Aramaic Armi Inherited Zinh Qaai Inscriptional_Pahlavi Phli Inscriptional_Parthian Prti Javanese Java Kaithi Kthi Kannada Knda Katakana Kana Kayah_Li Kali Kharoshthi Khar Khmer Khmr Khojki Khoj Khudawadi Sind Lao Laoo Latin Latn Lepcha Lepc Limbu Limb Linear_A Lina Linear_B Linb Lisu Lisu Lycian Lyci Lydian Lydi Mahajani Mahj Malayalam Mlym Mandaic Mand Manichaean Mani Marchen Marc Masaram_Gondi Gonm Meetei_Mayek Mtei Mende_Kikakui Mend Meroitic_Cursive Merc Meroitic_Hieroglyphs Mero Miao Plrd Modi Modi Mongolian Mong Mro Mroo Multani Mult Myanmar Mymr Nabataean Nbat New_Tai_Lue Talu Newa Newa Nko Nkoo Nushu Nshu Ogham Ogam Ol_Chiki Olck Old_Hungarian Hung Old_Italic Ital Old_North_Arabian Narb Old_Permic Perm Old_Persian Xpeo Old_South_Arabian Sarb Old_Turkic Orkh Oriya Orya Osage Osge Osmanya Osma Pahawh_Hmong Hmng Palmyrene Palm Pau_Cin_Hau Pauc Phags_Pa Phag Phoenician Phnx Psalter_Pahlavi Phlp Rejang Rjng Runic Runr Samaritan Samr Saurashtra Saur Sharada Shrd Shavian Shaw Siddham Sidd SignWriting Sgnw Sinhala Sinh Sora_Sompeng Sora Soyombo Soyo Sundanese Sund Syloti_Nagri Sylo Syriac Syrc Tagalog Tglg Tagbanwa Tagb Tai_Le Tale Tai_Tham Lana Tai_Viet Tavt Takri Takr Tamil Taml Tangut Tang Telugu Telu Thaana Thaa Thai Thai Tibetan Tibt Tifinagh Tfng Tirhuta Tirh Ugaritic Ugar Vai Vaii Warang_Citi Wara Yi Yiii Zanabazar_Square Zanb Dogra Dogr Gunjala_Gondi Gong Hanifi_Rohingya Rohg Makasar Maka Medefaidrin Medf Old_Sogdian Sogo Sogdian Sogd Elymaic Elym Nandinagari Nand Nyiakeng_Puachue_Hmong Hmnp Wancho Wcho"},me={};function fe(e){var t=me[e]={binary:$(le[e]+" "+he),nonBinary:{General_Category:$(he),Script:$(de[e])}};t.nonBinary.Script_Extensions=t.nonBinary.Script,t.nonBinary.gc=t.nonBinary.General_Category,t.nonBinary.sc=t.nonBinary.Script,t.nonBinary.scx=t.nonBinary.Script_Extensions}fe(9),fe(10),fe(11);var ge=O.prototype,xe=function(e){this.parser=e,this.validFlags="gim"+(e.options.ecmaVersion>=6?"uy":"")+(e.options.ecmaVersion>=9?"s":""),this.unicodeProperties=me[e.options.ecmaVersion>=11?11:e.options.ecmaVersion],this.source="",this.flags="",this.start=0,this.switchU=!1,this.switchN=!1,this.pos=0,this.lastIntValue=0,this.lastStringValue="",this.lastAssertionIsQuantifiable=!1,this.numCapturingParens=0,this.maxBackReference=0,this.groupNames=[],this.backReferenceNames=[]};function ye(e){return e<=65535?String.fromCharCode(e):(e-=65536,String.fromCharCode(55296+(e>>10),56320+(1023&e)))}function be(e){return 36===e||e>=40&&e<=43||46===e||63===e||e>=91&&e<=94||e>=123&&e<=125}function Te(e){return e>=65&&e<=90||e>=97&&e<=122}function ve(e){return Te(e)||95===e}function Se(e){return ve(e)||Ae(e)}function Ae(e){return e>=48&&e<=57}function _e(e){return e>=48&&e<=57||e>=65&&e<=70||e>=97&&e<=102}function Ee(e){return e>=65&&e<=70?e-65+10:e>=97&&e<=102?e-97+10:e-48}function we(e){return e>=48&&e<=55}xe.prototype.reset=function(e,t,n){var r=-1!==n.indexOf("u");this.start=0|e,this.source=t+"",this.flags=n,this.switchU=r&&this.parser.options.ecmaVersion>=6,this.switchN=r&&this.parser.options.ecmaVersion>=9},xe.prototype.raise=function(e){this.parser.raiseRecoverable(this.start,"Invalid regular expression: /"+this.source+"/: "+e)},xe.prototype.at=function(e){var t=this.source,n=t.length;if(e>=n)return-1;var r=t.charCodeAt(e);if(!this.switchU||r<=55295||r>=57344||e+1>=n)return r;var i=t.charCodeAt(e+1);return i>=56320&&i<=57343?(r<<10)+i-56613888:r},xe.prototype.nextIndex=function(e){var t=this.source,n=t.length;if(e>=n)return n;var r,i=t.charCodeAt(e);return!this.switchU||i<=55295||i>=57344||e+1>=n||(r=t.charCodeAt(e+1))<56320||r>57343?e+1:e+2},xe.prototype.current=function(){return this.at(this.pos)},xe.prototype.lookahead=function(){return this.at(this.nextIndex(this.pos))},xe.prototype.advance=function(){this.pos=this.nextIndex(this.pos)},xe.prototype.eat=function(e){return this.current()===e&&(this.advance(),!0)},ge.validateRegExpFlags=function(e){for(var t=e.validFlags,n=e.flags,r=0;r-1&&this.raise(e.start,"Duplicate regular expression flag")}},ge.validateRegExpPattern=function(e){this.regexp_pattern(e),!e.switchN&&this.options.ecmaVersion>=9&&e.groupNames.length>0&&(e.switchN=!0,this.regexp_pattern(e))},ge.regexp_pattern=function(e){e.pos=0,e.lastIntValue=0,e.lastStringValue="",e.lastAssertionIsQuantifiable=!1,e.numCapturingParens=0,e.maxBackReference=0,e.groupNames.length=0,e.backReferenceNames.length=0,this.regexp_disjunction(e),e.pos!==e.source.length&&(e.eat(41)&&e.raise("Unmatched ')'"),(e.eat(93)||e.eat(125))&&e.raise("Lone quantifier brackets")),e.maxBackReference>e.numCapturingParens&&e.raise("Invalid escape");for(var t=0,n=e.backReferenceNames;t=9&&(n=e.eat(60)),e.eat(61)||e.eat(33))return this.regexp_disjunction(e),e.eat(41)||e.raise("Unterminated group"),e.lastAssertionIsQuantifiable=!n,!0}return e.pos=t,!1},ge.regexp_eatQuantifier=function(e,t){return void 0===t&&(t=!1),!!this.regexp_eatQuantifierPrefix(e,t)&&(e.eat(63),!0)},ge.regexp_eatQuantifierPrefix=function(e,t){return e.eat(42)||e.eat(43)||e.eat(63)||this.regexp_eatBracedQuantifier(e,t)},ge.regexp_eatBracedQuantifier=function(e,t){var n=e.pos;if(e.eat(123)){var r=0,i=-1;if(this.regexp_eatDecimalDigits(e)&&(r=e.lastIntValue,e.eat(44)&&this.regexp_eatDecimalDigits(e)&&(i=e.lastIntValue),e.eat(125)))return-1!==i&&i=9?this.regexp_groupSpecifier(e):63===e.current()&&e.raise("Invalid group"),this.regexp_disjunction(e),e.eat(41))return e.numCapturingParens+=1,!0;e.raise("Unterminated group")}return!1},ge.regexp_eatExtendedAtom=function(e){return e.eat(46)||this.regexp_eatReverseSolidusAtomEscape(e)||this.regexp_eatCharacterClass(e)||this.regexp_eatUncapturingGroup(e)||this.regexp_eatCapturingGroup(e)||this.regexp_eatInvalidBracedQuantifier(e)||this.regexp_eatExtendedPatternCharacter(e)},ge.regexp_eatInvalidBracedQuantifier=function(e){return this.regexp_eatBracedQuantifier(e,!0)&&e.raise("Nothing to repeat"),!1},ge.regexp_eatSyntaxCharacter=function(e){var t=e.current();return!!be(t)&&(e.lastIntValue=t,e.advance(),!0)},ge.regexp_eatPatternCharacters=function(e){for(var t=e.pos,n=0;-1!==(n=e.current())&&!be(n);)e.advance();return e.pos!==t},ge.regexp_eatExtendedPatternCharacter=function(e){var t=e.current();return!(-1===t||36===t||t>=40&&t<=43||46===t||63===t||91===t||94===t||124===t)&&(e.advance(),!0)},ge.regexp_groupSpecifier=function(e){if(e.eat(63)){if(this.regexp_eatGroupName(e))return-1!==e.groupNames.indexOf(e.lastStringValue)&&e.raise("Duplicate capture group name"),void e.groupNames.push(e.lastStringValue);e.raise("Invalid group")}},ge.regexp_eatGroupName=function(e){if(e.lastStringValue="",e.eat(60)){if(this.regexp_eatRegExpIdentifierName(e)&&e.eat(62))return!0;e.raise("Invalid capture group name")}return!1},ge.regexp_eatRegExpIdentifierName=function(e){if(e.lastStringValue="",this.regexp_eatRegExpIdentifierStart(e)){for(e.lastStringValue+=ye(e.lastIntValue);this.regexp_eatRegExpIdentifierPart(e);)e.lastStringValue+=ye(e.lastIntValue);return!0}return!1},ge.regexp_eatRegExpIdentifierStart=function(e){var t=e.pos,n=e.current();return e.advance(),92===n&&this.regexp_eatRegExpUnicodeEscapeSequence(e)&&(n=e.lastIntValue),function(e){return p(e,!0)||36===e||95===e}(n)?(e.lastIntValue=n,!0):(e.pos=t,!1)},ge.regexp_eatRegExpIdentifierPart=function(e){var t=e.pos,n=e.current();return e.advance(),92===n&&this.regexp_eatRegExpUnicodeEscapeSequence(e)&&(n=e.lastIntValue),function(e){return d(e,!0)||36===e||95===e||8204===e||8205===e}(n)?(e.lastIntValue=n,!0):(e.pos=t,!1)},ge.regexp_eatAtomEscape=function(e){return!!(this.regexp_eatBackReference(e)||this.regexp_eatCharacterClassEscape(e)||this.regexp_eatCharacterEscape(e)||e.switchN&&this.regexp_eatKGroupName(e))||(e.switchU&&(99===e.current()&&e.raise("Invalid unicode escape"),e.raise("Invalid escape")),!1)},ge.regexp_eatBackReference=function(e){var t=e.pos;if(this.regexp_eatDecimalEscape(e)){var n=e.lastIntValue;if(e.switchU)return n>e.maxBackReference&&(e.maxBackReference=n),!0;if(n<=e.numCapturingParens)return!0;e.pos=t}return!1},ge.regexp_eatKGroupName=function(e){if(e.eat(107)){if(this.regexp_eatGroupName(e))return e.backReferenceNames.push(e.lastStringValue),!0;e.raise("Invalid named reference")}return!1},ge.regexp_eatCharacterEscape=function(e){return this.regexp_eatControlEscape(e)||this.regexp_eatCControlLetter(e)||this.regexp_eatZero(e)||this.regexp_eatHexEscapeSequence(e)||this.regexp_eatRegExpUnicodeEscapeSequence(e)||!e.switchU&&this.regexp_eatLegacyOctalEscapeSequence(e)||this.regexp_eatIdentityEscape(e)},ge.regexp_eatCControlLetter=function(e){var t=e.pos;if(e.eat(99)){if(this.regexp_eatControlLetter(e))return!0;e.pos=t}return!1},ge.regexp_eatZero=function(e){return 48===e.current()&&!Ae(e.lookahead())&&(e.lastIntValue=0,e.advance(),!0)},ge.regexp_eatControlEscape=function(e){var t=e.current();return 116===t?(e.lastIntValue=9,e.advance(),!0):110===t?(e.lastIntValue=10,e.advance(),!0):118===t?(e.lastIntValue=11,e.advance(),!0):102===t?(e.lastIntValue=12,e.advance(),!0):114===t&&(e.lastIntValue=13,e.advance(),!0)},ge.regexp_eatControlLetter=function(e){var t=e.current();return!!Te(t)&&(e.lastIntValue=t%32,e.advance(),!0)},ge.regexp_eatRegExpUnicodeEscapeSequence=function(e){var t,n=e.pos;if(e.eat(117)){if(this.regexp_eatFixedHexDigits(e,4)){var r=e.lastIntValue;if(e.switchU&&r>=55296&&r<=56319){var i=e.pos;if(e.eat(92)&&e.eat(117)&&this.regexp_eatFixedHexDigits(e,4)){var s=e.lastIntValue;if(s>=56320&&s<=57343)return e.lastIntValue=1024*(r-55296)+(s-56320)+65536,!0}e.pos=i,e.lastIntValue=r}return!0}if(e.switchU&&e.eat(123)&&this.regexp_eatHexDigits(e)&&e.eat(125)&&((t=e.lastIntValue)>=0&&t<=1114111))return!0;e.switchU&&e.raise("Invalid unicode escape"),e.pos=n}return!1},ge.regexp_eatIdentityEscape=function(e){if(e.switchU)return!!this.regexp_eatSyntaxCharacter(e)||!!e.eat(47)&&(e.lastIntValue=47,!0);var t=e.current();return!(99===t||e.switchN&&107===t)&&(e.lastIntValue=t,e.advance(),!0)},ge.regexp_eatDecimalEscape=function(e){e.lastIntValue=0;var t=e.current();if(t>=49&&t<=57){do{e.lastIntValue=10*e.lastIntValue+(t-48),e.advance()}while((t=e.current())>=48&&t<=57);return!0}return!1},ge.regexp_eatCharacterClassEscape=function(e){var t=e.current();if(function(e){return 100===e||68===e||115===e||83===e||119===e||87===e}(t))return e.lastIntValue=-1,e.advance(),!0;if(e.switchU&&this.options.ecmaVersion>=9&&(80===t||112===t)){if(e.lastIntValue=-1,e.advance(),e.eat(123)&&this.regexp_eatUnicodePropertyValueExpression(e)&&e.eat(125))return!0;e.raise("Invalid property name")}return!1},ge.regexp_eatUnicodePropertyValueExpression=function(e){var t=e.pos;if(this.regexp_eatUnicodePropertyName(e)&&e.eat(61)){var n=e.lastStringValue;if(this.regexp_eatUnicodePropertyValue(e)){var r=e.lastStringValue;return this.regexp_validateUnicodePropertyNameAndValue(e,n,r),!0}}if(e.pos=t,this.regexp_eatLoneUnicodePropertyNameOrValue(e)){var i=e.lastStringValue;return this.regexp_validateUnicodePropertyNameOrValue(e,i),!0}return!1},ge.regexp_validateUnicodePropertyNameAndValue=function(e,t,n){D(e.unicodeProperties.nonBinary,t)||e.raise("Invalid property name"),e.unicodeProperties.nonBinary[t].test(n)||e.raise("Invalid property value")},ge.regexp_validateUnicodePropertyNameOrValue=function(e,t){e.unicodeProperties.binary.test(t)||e.raise("Invalid property name")},ge.regexp_eatUnicodePropertyName=function(e){var t=0;for(e.lastStringValue="";ve(t=e.current());)e.lastStringValue+=ye(t),e.advance();return""!==e.lastStringValue},ge.regexp_eatUnicodePropertyValue=function(e){var t=0;for(e.lastStringValue="";Se(t=e.current());)e.lastStringValue+=ye(t),e.advance();return""!==e.lastStringValue},ge.regexp_eatLoneUnicodePropertyNameOrValue=function(e){return this.regexp_eatUnicodePropertyValue(e)},ge.regexp_eatCharacterClass=function(e){if(e.eat(91)){if(e.eat(94),this.regexp_classRanges(e),e.eat(93))return!0;e.raise("Unterminated character class")}return!1},ge.regexp_classRanges=function(e){for(;this.regexp_eatClassAtom(e);){var t=e.lastIntValue;if(e.eat(45)&&this.regexp_eatClassAtom(e)){var n=e.lastIntValue;!e.switchU||-1!==t&&-1!==n||e.raise("Invalid character class"),-1!==t&&-1!==n&&t>n&&e.raise("Range out of order in character class")}}},ge.regexp_eatClassAtom=function(e){var t=e.pos;if(e.eat(92)){if(this.regexp_eatClassEscape(e))return!0;if(e.switchU){var n=e.current();(99===n||we(n))&&e.raise("Invalid class escape"),e.raise("Invalid escape")}e.pos=t}var r=e.current();return 93!==r&&(e.lastIntValue=r,e.advance(),!0)},ge.regexp_eatClassEscape=function(e){var t=e.pos;if(e.eat(98))return e.lastIntValue=8,!0;if(e.switchU&&e.eat(45))return e.lastIntValue=45,!0;if(!e.switchU&&e.eat(99)){if(this.regexp_eatClassControlLetter(e))return!0;e.pos=t}return this.regexp_eatCharacterClassEscape(e)||this.regexp_eatCharacterEscape(e)},ge.regexp_eatClassControlLetter=function(e){var t=e.current();return!(!Ae(t)&&95!==t)&&(e.lastIntValue=t%32,e.advance(),!0)},ge.regexp_eatHexEscapeSequence=function(e){var t=e.pos;if(e.eat(120)){if(this.regexp_eatFixedHexDigits(e,2))return!0;e.switchU&&e.raise("Invalid escape"),e.pos=t}return!1},ge.regexp_eatDecimalDigits=function(e){var t=e.pos,n=0;for(e.lastIntValue=0;Ae(n=e.current());)e.lastIntValue=10*e.lastIntValue+(n-48),e.advance();return e.pos!==t},ge.regexp_eatHexDigits=function(e){var t=e.pos,n=0;for(e.lastIntValue=0;_e(n=e.current());)e.lastIntValue=16*e.lastIntValue+Ee(n),e.advance();return e.pos!==t},ge.regexp_eatLegacyOctalEscapeSequence=function(e){if(this.regexp_eatOctalDigit(e)){var t=e.lastIntValue;if(this.regexp_eatOctalDigit(e)){var n=e.lastIntValue;t<=3&&this.regexp_eatOctalDigit(e)?e.lastIntValue=64*t+8*n+e.lastIntValue:e.lastIntValue=8*t+n}else e.lastIntValue=t;return!0}return!1},ge.regexp_eatOctalDigit=function(e){var t=e.current();return we(t)?(e.lastIntValue=t-48,e.advance(),!0):(e.lastIntValue=0,!1)},ge.regexp_eatFixedHexDigits=function(e,t){var n=e.pos;e.lastIntValue=0;for(var r=0;r>10),56320+(1023&e)))}Ie.next=function(e){!e&&this.type.keyword&&this.containsEsc&&this.raiseRecoverable(this.start,"Escape sequence in keyword "+this.type.keyword),this.options.onToken&&this.options.onToken(new ke(this)),this.lastTokEnd=this.end,this.lastTokStart=this.start,this.lastTokEndLoc=this.endLoc,this.lastTokStartLoc=this.startLoc,this.nextToken()},Ie.getToken=function(){return this.next(),new ke(this)},"undefined"!=typeof Symbol&&(Ie[Symbol.iterator]=function(){var e=this;return{next:function(){var t=e.getToken();return{done:t.type===T.eof,value:t}}}}),Ie.curContext=function(){return this.context[this.context.length-1]},Ie.nextToken=function(){var e=this.curContext();return e&&e.preserveSpace||this.skipSpace(),this.start=this.pos,this.options.locations&&(this.startLoc=this.curPosition()),this.pos>=this.input.length?this.finishToken(T.eof):e.override?e.override(this):void this.readToken(this.fullCharCodeAtPos())},Ie.readToken=function(e){return p(e,this.options.ecmaVersion>=6)||92===e?this.readWord():this.getTokenFromCode(e)},Ie.fullCharCodeAtPos=function(){var e=this.input.charCodeAt(this.pos);return e<=55295||e>=57344?e:(e<<10)+this.input.charCodeAt(this.pos+1)-56613888},Ie.skipBlockComment=function(){var e,t=this.options.onComment&&this.curPosition(),n=this.pos,r=this.input.indexOf("*/",this.pos+=2);if(-1===r&&this.raise(this.pos-2,"Unterminated comment"),this.pos=r+2,this.options.locations)for(S.lastIndex=n;(e=S.exec(this.input))&&e.index8&&e<14||e>=5760&&_.test(String.fromCharCode(e))))break e;++this.pos}}},Ie.finishToken=function(e,t){this.end=this.pos,this.options.locations&&(this.endLoc=this.curPosition());var n=this.type;this.type=e,this.value=t,this.updateContext(n)},Ie.readToken_dot=function(){var e=this.input.charCodeAt(this.pos+1);if(e>=48&&e<=57)return this.readNumber(!0);var t=this.input.charCodeAt(this.pos+2);return this.options.ecmaVersion>=6&&46===e&&46===t?(this.pos+=3,this.finishToken(T.ellipsis)):(++this.pos,this.finishToken(T.dot))},Ie.readToken_slash=function(){var e=this.input.charCodeAt(this.pos+1);return this.exprAllowed?(++this.pos,this.readRegexp()):61===e?this.finishOp(T.assign,2):this.finishOp(T.slash,1)},Ie.readToken_mult_modulo_exp=function(e){var t=this.input.charCodeAt(this.pos+1),n=1,r=42===e?T.star:T.modulo;return this.options.ecmaVersion>=7&&42===e&&42===t&&(++n,r=T.starstar,t=this.input.charCodeAt(this.pos+2)),61===t?this.finishOp(T.assign,n+1):this.finishOp(r,n)},Ie.readToken_pipe_amp=function(e){var t=this.input.charCodeAt(this.pos+1);return t===e?this.finishOp(124===e?T.logicalOR:T.logicalAND,2):61===t?this.finishOp(T.assign,2):this.finishOp(124===e?T.bitwiseOR:T.bitwiseAND,1)},Ie.readToken_caret=function(){return 61===this.input.charCodeAt(this.pos+1)?this.finishOp(T.assign,2):this.finishOp(T.bitwiseXOR,1)},Ie.readToken_plus_min=function(e){var t=this.input.charCodeAt(this.pos+1);return t===e?45!==t||this.inModule||62!==this.input.charCodeAt(this.pos+2)||0!==this.lastTokEnd&&!v.test(this.input.slice(this.lastTokEnd,this.pos))?this.finishOp(T.incDec,2):(this.skipLineComment(3),this.skipSpace(),this.nextToken()):61===t?this.finishOp(T.assign,2):this.finishOp(T.plusMin,1)},Ie.readToken_lt_gt=function(e){var t=this.input.charCodeAt(this.pos+1),n=1;return t===e?(n=62===e&&62===this.input.charCodeAt(this.pos+2)?3:2,61===this.input.charCodeAt(this.pos+n)?this.finishOp(T.assign,n+1):this.finishOp(T.bitShift,n)):33!==t||60!==e||this.inModule||45!==this.input.charCodeAt(this.pos+2)||45!==this.input.charCodeAt(this.pos+3)?(61===t&&(n=2),this.finishOp(T.relational,n)):(this.skipLineComment(4),this.skipSpace(),this.nextToken())},Ie.readToken_eq_excl=function(e){var t=this.input.charCodeAt(this.pos+1);return 61===t?this.finishOp(T.equality,61===this.input.charCodeAt(this.pos+2)?3:2):61===e&&62===t&&this.options.ecmaVersion>=6?(this.pos+=2,this.finishToken(T.arrow)):this.finishOp(61===e?T.eq:T.prefix,1)},Ie.getTokenFromCode=function(e){switch(e){case 46:return this.readToken_dot();case 40:return++this.pos,this.finishToken(T.parenL);case 41:return++this.pos,this.finishToken(T.parenR);case 59:return++this.pos,this.finishToken(T.semi);case 44:return++this.pos,this.finishToken(T.comma);case 91:return++this.pos,this.finishToken(T.bracketL);case 93:return++this.pos,this.finishToken(T.bracketR);case 123:return++this.pos,this.finishToken(T.braceL);case 125:return++this.pos,this.finishToken(T.braceR);case 58:return++this.pos,this.finishToken(T.colon);case 63:return++this.pos,this.finishToken(T.question);case 96:if(this.options.ecmaVersion<6)break;return++this.pos,this.finishToken(T.backQuote);case 48:var t=this.input.charCodeAt(this.pos+1);if(120===t||88===t)return this.readRadixNumber(16);if(this.options.ecmaVersion>=6){if(111===t||79===t)return this.readRadixNumber(8);if(98===t||66===t)return this.readRadixNumber(2)}case 49:case 50:case 51:case 52:case 53:case 54:case 55:case 56:case 57:return this.readNumber(!1);case 34:case 39:return this.readString(e);case 47:return this.readToken_slash();case 37:case 42:return this.readToken_mult_modulo_exp(e);case 124:case 38:return this.readToken_pipe_amp(e);case 94:return this.readToken_caret();case 43:case 45:return this.readToken_plus_min(e);case 60:case 62:return this.readToken_lt_gt(e);case 61:case 33:return this.readToken_eq_excl(e);case 126:return this.finishOp(T.prefix,1)}this.raise(this.pos,"Unexpected character '"+De(e)+"'")},Ie.finishOp=function(e,t){var n=this.input.slice(this.pos,this.pos+t);return this.pos+=t,this.finishToken(e,n)},Ie.readRegexp=function(){for(var e,t,n=this.pos;;){this.pos>=this.input.length&&this.raise(n,"Unterminated regular expression");var r=this.input.charAt(this.pos);if(v.test(r)&&this.raise(n,"Unterminated regular expression"),e)e=!1;else{if("["===r)t=!0;else if("]"===r&&t)t=!1;else if("/"===r&&!t)break;e="\\"===r}++this.pos}var i=this.input.slice(n,this.pos);++this.pos;var s=this.pos,a=this.readWord1();this.containsEsc&&this.unexpected(s);var o=this.regexpState||(this.regexpState=new xe(this));o.reset(n,i,a),this.validateRegExpFlags(o),this.validateRegExpPattern(o);var u=null;try{u=new RegExp(i,a)}catch(e){}return this.finishToken(T.regexp,{pattern:i,flags:a,value:u})},Ie.readInt=function(e,t){for(var n=this.pos,r=0,i=0,s=null==t?1/0:t;i=97?a-97+10:a>=65?a-65+10:a>=48&&a<=57?a-48:1/0)>=e)break;++this.pos,r=r*e+o}return this.pos===n||null!=t&&this.pos-n!==t?null:r},Ie.readRadixNumber=function(e){var t=this.pos;this.pos+=2;var n=this.readInt(e);return null==n&&this.raise(this.start+2,"Expected number in radix "+e),this.options.ecmaVersion>=11&&110===this.input.charCodeAt(this.pos)?(n="undefined"!=typeof BigInt?BigInt(this.input.slice(t,this.pos)):null,++this.pos):p(this.fullCharCodeAtPos())&&this.raise(this.pos,"Identifier directly after number"),this.finishToken(T.num,n)},Ie.readNumber=function(e){var t=this.pos;e||null!==this.readInt(10)||this.raise(t,"Invalid number");var n=this.pos-t>=2&&48===this.input.charCodeAt(t);n&&this.strict&&this.raise(t,"Invalid number");var r=this.input.charCodeAt(this.pos);if(!n&&!e&&this.options.ecmaVersion>=11&&110===r){var i=this.input.slice(t,this.pos),s="undefined"!=typeof BigInt?BigInt(i):null;return++this.pos,p(this.fullCharCodeAtPos())&&this.raise(this.pos,"Identifier directly after number"),this.finishToken(T.num,s)}n&&/[89]/.test(this.input.slice(t,this.pos))&&(n=!1),46!==r||n||(++this.pos,this.readInt(10),r=this.input.charCodeAt(this.pos)),69!==r&&101!==r||n||(43!==(r=this.input.charCodeAt(++this.pos))&&45!==r||++this.pos,null===this.readInt(10)&&this.raise(t,"Invalid number")),p(this.fullCharCodeAtPos())&&this.raise(this.pos,"Identifier directly after number");var a=this.input.slice(t,this.pos),o=n?parseInt(a,8):parseFloat(a);return this.finishToken(T.num,o)},Ie.readCodePoint=function(){var e;if(123===this.input.charCodeAt(this.pos)){this.options.ecmaVersion<6&&this.unexpected();var t=++this.pos;e=this.readHexChar(this.input.indexOf("}",this.pos)-this.pos),++this.pos,e>1114111&&this.invalidStringToken(t,"Code point out of bounds")}else e=this.readHexChar(4);return e},Ie.readString=function(e){for(var t="",n=++this.pos;;){this.pos>=this.input.length&&this.raise(this.start,"Unterminated string constant");var r=this.input.charCodeAt(this.pos);if(r===e)break;92===r?(t+=this.input.slice(n,this.pos),t+=this.readEscapedChar(!1),n=this.pos):(A(r,this.options.ecmaVersion>=10)&&this.raise(this.start,"Unterminated string constant"),++this.pos)}return t+=this.input.slice(n,this.pos++),this.finishToken(T.string,t)};var Ce={};Ie.tryReadTemplateToken=function(){this.inTemplateElement=!0;try{this.readTmplToken()}catch(e){if(e!==Ce)throw e;this.readInvalidTemplateToken()}this.inTemplateElement=!1},Ie.invalidStringToken=function(e,t){if(this.inTemplateElement&&this.options.ecmaVersion>=9)throw Ce;this.raise(e,t)},Ie.readTmplToken=function(){for(var e="",t=this.pos;;){this.pos>=this.input.length&&this.raise(this.start,"Unterminated template");var n=this.input.charCodeAt(this.pos);if(96===n||36===n&&123===this.input.charCodeAt(this.pos+1))return this.pos!==this.start||this.type!==T.template&&this.type!==T.invalidTemplate?(e+=this.input.slice(t,this.pos),this.finishToken(T.template,e)):36===n?(this.pos+=2,this.finishToken(T.dollarBraceL)):(++this.pos,this.finishToken(T.backQuote));if(92===n)e+=this.input.slice(t,this.pos),e+=this.readEscapedChar(!0),t=this.pos;else if(A(n)){switch(e+=this.input.slice(t,this.pos),++this.pos,n){case 13:10===this.input.charCodeAt(this.pos)&&++this.pos;case 10:e+="\n";break;default:e+=String.fromCharCode(n)}this.options.locations&&(++this.curLine,this.lineStart=this.pos),t=this.pos}else++this.pos}},Ie.readInvalidTemplateToken=function(){for(;this.pos=48&&t<=55){var r=this.input.substr(this.pos-1,3).match(/^[0-7]+/)[0],i=parseInt(r,8);return i>255&&(r=r.slice(0,-1),i=parseInt(r,8)),this.pos+=r.length-1,t=this.input.charCodeAt(this.pos),"0"===r&&56!==t&&57!==t||!this.strict&&!e||this.invalidStringToken(this.pos-1-r.length,e?"Octal literal in template string":"Octal literal in strict mode"),String.fromCharCode(i)}return A(t)?"":String.fromCharCode(t)}},Ie.readHexChar=function(e){var t=this.pos,n=this.readInt(16,e);return null===n&&this.invalidStringToken(t,"Bad character escape sequence"),n},Ie.readWord1=function(){this.containsEsc=!1;for(var e="",t=!0,n=this.pos,r=this.options.ecmaVersion>=6;this.pos0;)l.pop()}function v(e,t){h[e]=t}function S(e){const t=f[e];return t?n+"."+t:e}function A(e){y=" ".repeat(e)}function _(e,t){const r=`${n}Variable${m.length}`;return l.push(`${y}const ${r} = ${t};`),m.push(e),r}function E(e,t){const r=`${n}Variable${m.length}`,i=`imageDatum${x}`;l.push(`${y}let ${i} = ["P3\\n# ${u}.ppm\\n", ${e}, ' ', ${t}, "\\n255\\n"].join("");`),l.push(`${y}for (let i = 0; i < ${i}.length; i += 4) {`),l.push(`${y} ${i} += ${r}[i] + ' ' + ${r}[i + 1] + ' ' + ${r}[i + 2] + ' ';`),l.push(`${y}}`),l.push(`${y}if (typeof require !== "undefined") {`),l.push(`${y} require('fs').writeFileSync('./${u}.ppm', ${i});`),l.push(`${y}}`),x++}function w(e){l.push(`${y}// ${e}`)}function k(){l.push(`${y}(() => {\n${y}const error = ${n}.getError();\n${y}if (error !== ${n}.NONE) {\n${y} const names = Object.getOwnPropertyNames(gl);\n${y} for (let i = 0; i < names.length; i++) {\n${y} const name = names[i];\n${y} if (${n}[name] === error) {\n${y} throw new Error('${n} threw ' + name);\n${y} }\n${y} }\n${y}}\n${y}})();`)}function I(e,t){return`${n}.${e}(${s(t,{contextName:n,contextVariables:m,getEntity:S,addVariable:_,variables:h,onUnrecognizedArgumentLookup:p})})`}function D(e){if(h)for(const t in h)if(h[t]===e)return t;return null}function C(e){const t=m.indexOf(e);return-1!==t?`${n}Variable${t}`:null}}function i(e,t){const n=new Proxy(e,{get:function(t,n){if("function"==typeof t[n])return function(){if("drawBuffersWEBGL"===n)return h.push(`${p}${i}.drawBuffersWEBGL([${s(arguments[0],{contextName:i,contextVariables:o,getEntity:m,addVariable:g,variables:c,onUnrecognizedArgumentLookup:d})}]);`),e.drawBuffersWEBGL(arguments[0]);let t=e[n].apply(e,arguments);switch(typeof t){case"undefined":return void h.push(`${p}${f(n,arguments)};`);case"number":case"boolean":l&&-1===o.indexOf(a(t))?(h.push(`${p}const ${i}Variable${o.length} = ${f(n,arguments)};`),o.push(t=a(t))):(h.push(`${p}const ${i}Variable${o.length} = ${f(n,arguments)};`),o.push(t));break;default:null===t?h.push(`${f(n,arguments)};`):h.push(`${p}const ${i}Variable${o.length} = ${f(n,arguments)};`),o.push(t)}return t};return r[e[n]]=n,e[n]}}),r={},{contextName:i,contextVariables:o,getEntity:u,useTrackablePrimitives:l,recording:h,variables:c,indent:p,onUnrecognizedArgumentLookup:d}=t;return n;function m(e){return r.hasOwnProperty(e)?`${i}.${r[e]}`:u(e)}function f(e,t){return`${i}.${e}(${s(t,{contextName:i,contextVariables:o,getEntity:m,addVariable:g,variables:c,onUnrecognizedArgumentLookup:d})})`}function g(e,t){const n=`${i}Variable${o.length}`;return o.push(e),h.push(`${p}const ${n} = ${t};`),n}}function s(e,t){const{variables:n,onUnrecognizedArgumentLookup:r}=t;return Array.from(e).map((e=>{const i=function(e){if(n)for(const t in n)if(n.hasOwnProperty(t)&&n[t]===e)return t;if(r)return r(e);return null}(e);return i||function(e,t){const{contextName:n,contextVariables:r,getEntity:i,addVariable:s,onUnrecognizedArgumentLookup:a}=t;if(void 0===e)return"undefined";if(null===e)return"null";const o=r.indexOf(e);if(o>-1)return`${n}Variable${o}`;switch(e.constructor.name){case"String":const t=/\n/.test(e),n=/'/.test(e),r=/"/.test(e);return t?"`"+e+"`":n&&!r?'"'+e+'"':"'"+e+"'";case"Number":case"Boolean":return i(e);case"Array":return s(e,`new ${e.constructor.name}([${Array.from(e).join(",")}])`);case"Float32Array":case"Uint8Array":case"Uint16Array":case"Int32Array":return s(e,`new ${e.constructor.name}(${JSON.stringify(Array.from(e))})`);default:if(a){const t=a(e);if(t)return t}throw new Error(`unrecognized argument type ${e.constructor.name}`)}}(e,t)})).join(", ")}function a(e){return new e.constructor(e)}void 0!==t&&(t.exports={glWiretap:r,glExtensionWiretap:i}),"undefined"!=typeof window&&(r.glExtensionWiretap=i,window.glWiretap=r)},{}],4:[function(e,t,n){function r(e){const t=new Array(e.length);for(let n=0;n{e.output=h(t),e.graphical&&l(e)},e.toJSON=()=>{throw new Error("Not usable with gpuMock")},e.setConstants=t=>(e.constants=t,e),e.setGraphical=t=>(e.graphical=t,e),e.setCanvas=t=>(e.canvas=t,e),e.setContext=t=>(e.context=t,e),e.destroy=()=>{},e.validateSettings=()=>{},e.graphical&&e.output&&l(e),e.exec=function(){return new Promise(((t,n)=>{try{t(e.apply(e,arguments))}catch(e){n(e)}}))},e.getPixels=t=>{const{x:n,y:r}=e.output;return t?function(e,t,n){const r=n/2|0,i=4*t,s=new Uint8ClampedArray(4*t),a=e.slice(0);for(let e=0;ee,n=["setWarnVarUsage","setArgumentTypes","setTactic","setOptimizeFloatMemory","setDebug","setLoopMaxIterations","setConstantTypes","setFunctions","setNativeFunctions","setInjectedNative","setPipeline","setPrecision","setOutputToTexture","setImmutable","setStrictIntegers","setDynamicOutput","setHardcodeConstants","setDynamicArguments","setUseLegacyEncoder","setWarnVarUsage","addSubKernel"];for(let r=0;r0&&t.push(", "),t.push("user_"),t.push(n)}t.push(") {\n")}for(let n=0;n0&&t.push(n.join(""),";\n"),t.push(`for (let ${e}=0;${e}0&&t.push(`if (!${r.join("")}) break;\n`),t.push(s.join("")),t.push(`\n${i.join("")};`),t.push("}\n")}return t}astWhileStatement(e,t){if("WhileStatement"!==e.type)throw this.astErrorOutput("Invalid while statement",e);return t.push("for (let i = 0; i < LOOP_MAX; i++) {"),t.push("if ("),this.astGeneric(e.test,t),t.push(") {\n"),this.astGeneric(e.body,t),t.push("} else {\n"),t.push("break;\n"),t.push("}\n"),t.push("}\n"),t}astDoWhileStatement(e,t){if("DoWhileStatement"!==e.type)throw this.astErrorOutput("Invalid while statement",e);return t.push("for (let i = 0; i < LOOP_MAX; i++) {"),this.astGeneric(e.body,t),t.push("if (!"),this.astGeneric(e.test,t),t.push(") {\n"),t.push("break;\n"),t.push("}\n"),t.push("}\n"),t}astAssignmentExpression(e,t){const n=this.getDeclaration(e.left);if(n&&!n.assignable)throw this.astErrorOutput(`Variable ${e.left.name} is not assignable here`,e);return this.astGeneric(e.left,t),t.push(e.operator),this.astGeneric(e.right,t),t}astBlockStatement(e,t){if(this.isState("loop-body")){this.pushState("block-body");for(let n=0;n0&&t.push(",");const r=n[e],i=this.getDeclaration(r.id);i.valueType||(i.valueType=this.getType(r.init)),this.astGeneric(r,t)}return this.isState("in-for-loop-init")||t.push(";"),t}astIfStatement(e,t){return t.push("if ("),this.astGeneric(e.test,t),t.push(")"),"BlockStatement"===e.consequent.type?this.astGeneric(e.consequent,t):(t.push(" {\n"),this.astGeneric(e.consequent,t),t.push("\n}\n")),e.alternate&&(t.push("else "),"BlockStatement"===e.alternate.type||"IfStatement"===e.alternate.type?this.astGeneric(e.alternate,t):(t.push(" {\n"),this.astGeneric(e.alternate,t),t.push("\n}\n"))),t}astSwitchStatement(e,t){const{discriminant:n,cases:r}=e;t.push("switch ("),this.astGeneric(n,t),t.push(") {\n");for(let e=0;e0&&(this.astGeneric(r[e].consequent,t),t.push("break;\n"))):(t.push("default:\n"),this.astGeneric(r[e].consequent,t),r[e].consequent&&r[e].consequent.length>0&&t.push("break;\n"));t.push("\n}")}astThisExpression(e,t){return t.push("_this"),t}astMemberExpression(e,t){const{signature:n,type:r,property:i,xProperty:s,yProperty:a,zProperty:o,name:u,origin:l}=this.getMemberExpressionDetails(e);switch(n){case"this.thread.value":return t.push(`_this.thread.${u}`),t;case"this.output.value":switch(u){case"x":t.push("outputX");break;case"y":t.push("outputY");break;case"z":t.push("outputZ");break;default:throw this.astErrorOutput("Unexpected expression",e)}return t;case"value":default:throw this.astErrorOutput("Unexpected expression",e);case"value[]":case"value[][]":case"value[][][]":case"value.value":if("Math"===l)return t.push(Math[u]),t;switch(i){case"r":return t.push(`user_${u}[0]`),t;case"g":return t.push(`user_${u}[1]`),t;case"b":return t.push(`user_${u}[2]`),t;case"a":return t.push(`user_${u}[3]`),t}break;case"this.constants.value":case"this.constants.value[]":case"this.constants.value[][]":case"this.constants.value[][][]":break;case"fn()[]":return this.astGeneric(e.object,t),t.push("["),this.astGeneric(e.property,t),t.push("]"),t;case"fn()[][]":return this.astGeneric(e.object.object,t),t.push("["),this.astGeneric(e.object.property,t),t.push("]"),t.push("["),this.astGeneric(e.property,t),t.push("]"),t}if(!e.computed)switch(r){case"Number":case"Integer":case"Float":case"Boolean":return t.push(`${l}_${u}`),t}const h=`${l}_${u}`;{let e,n;if("constants"===l){const t=this.constants[u];n="Input"===this.constantTypes[u],e=n?t.size:null}else n=this.isInput(u),e=n?this.argumentSizes[this.argumentNames.indexOf(u)]:null;t.push(`${h}`),o&&a?n?(t.push("[("),this.astGeneric(o,t),t.push(`*${this.dynamicArguments?"(outputY * outputX)":e[1]*e[0]})+(`),this.astGeneric(a,t),t.push(`*${this.dynamicArguments?"outputX":e[0]})+`),this.astGeneric(s,t),t.push("]")):(t.push("["),this.astGeneric(o,t),t.push("]"),t.push("["),this.astGeneric(a,t),t.push("]"),t.push("["),this.astGeneric(s,t),t.push("]")):a?n?(t.push("[("),this.astGeneric(a,t),t.push(`*${this.dynamicArguments?"outputX":e[0]})+`),this.astGeneric(s,t),t.push("]")):(t.push("["),this.astGeneric(a,t),t.push("]"),t.push("["),this.astGeneric(s,t),t.push("]")):void 0!==s&&(t.push("["),this.astGeneric(s,t),t.push("]"))}return t}astCallExpression(e,t){if("CallExpression"!==e.type)throw this.astErrorOutput("Unknown CallExpression",e);let n=this.astMemberExpressionUnroll(e.callee);this.calledFunctions.indexOf(n)<0&&this.calledFunctions.push(n);this.isAstMathFunction(e);this.onFunctionCall&&this.onFunctionCall(this.name,n,e.arguments),t.push(n),t.push("(");const r=this.lookupFunctionArgumentTypes(n)||[];for(let i=0;i0&&t.push(", "),this.astGeneric(s,t)}return t.push(")"),t}astArrayExpression(e,t){const n=this.getType(e),r=e.elements.length,i=[];for(let t=0;t{switch(t){case"_colorData":return"_colorData";case"_imageData":return"_imageData";case"output":return"output";case"thread":return"this.thread"}return JSON.stringify(e[t])},findDependency:(e,t)=>null}),o=r.flattenFunctionToString((a?"function ":"")+e.getPixels.toString(),{thisLookup:t=>{switch(t){case"_colorData":return"_colorData";case"_imageData":return"_imageData";case"output":return"output";case"thread":return"this.thread"}return JSON.stringify(e[t])},findDependency:()=>null});i.push(" _imageData,"," _colorData,",` color: ${t},`),s.push(` kernel.getPixels = ${o};`)}const o=[],u=Object.keys(e.constantTypes);for(let t=0;t"this"===t?(a?"function ":"")+e[n].toString():null,thisLookup:e=>{switch(e){case"canvas":return;case"context":return"context"}}});s.push(t),i.push(" _mediaTo2DArray,"),i.push(" _imageTo3DArray,")}else if(-1!==e.argumentTypes.indexOf("HTMLImage")||-1!==o.indexOf("HTMLImage")){const t=r.flattenFunctionToString((a?"function ":"")+e._mediaTo2DArray.toString(),{findDependency:(e,t)=>null,thisLookup:e=>{switch(e){case"canvas":return"settings.canvas";case"context":return"settings.context"}throw new Error("unhandled thisLookup")}});s.push(t),i.push(" _mediaTo2DArray,")}return`function(settings) {\n${n.join("\n")}\n for (const p in _constantTypes) {\n if (!_constantTypes.hasOwnProperty(p)) continue;\n const type = _constantTypes[p];\n switch (type) {\n case 'Number':\n case 'Integer':\n case 'Float':\n case 'Boolean':\n case 'Array(2)':\n case 'Array(3)':\n case 'Array(4)':\n case 'Matrix(2)':\n case 'Matrix(3)':\n case 'Matrix(4)':\n if (incomingConstants.hasOwnProperty(p)) {\n console.warn('constant ' + p + ' of type ' + type + ' cannot be resigned');\n }\n continue;\n }\n if (!incomingConstants.hasOwnProperty(p)) {\n throw new Error('constant ' + p + ' not found');\n }\n _constants[p] = incomingConstants[p];\n }\n const kernel = (function() {\n${e._kernelString}\n })\n .apply({ ${i.join("\n")} });\n ${s.join("\n")}\n return kernel;\n}`}}},{"../../utils":114}],8:[function(e,t,n){const{Kernel:r}=e("../kernel"),{FunctionBuilder:i}=e("../function-builder"),{CPUFunctionNode:s}=e("./function-node"),{utils:a}=e("../../utils"),{cpuKernelString:o}=e("./kernel-string");t.exports={CPUKernel:class extends r{static getFeatures(){return this.features}static get features(){return Object.freeze({kernelMap:!0,isIntegerDivisionAccurate:!0})}static get isSupported(){return!0}static isContextMatch(e){return!1}static get mode(){return"cpu"}static nativeFunctionArguments(){return null}static nativeFunctionReturnType(){throw new Error(`Looking up native function return type not supported on ${this.name}`)}static combineKernels(e){return e}static getSignature(e,t){return"cpu"+(t.length>0?":"+t.join(","):"")}constructor(e,t){super(e,t),this.mergeSettings(e.settings||t),this._imageData=null,this._colorData=null,this._kernelString=null,this._prependedString=[],this.thread={x:0,y:0,z:0},this.translatedSources=null}initCanvas(){return"undefined"!=typeof document?document.createElement("canvas"):"undefined"!=typeof OffscreenCanvas?new OffscreenCanvas(0,0):void 0}initContext(){return this.canvas?this.canvas.getContext("2d"):null}initPlugins(e){return[]}validateSettings(e){if(!this.output||0===this.output.length){if(1!==e.length)throw new Error("Auto output only supported for kernels with only one input");const t=a.getVariableType(e[0],this.strictIntegers);if("Array"===t)this.output=a.getDimensions(t);else{if("NumberTexture"!==t&&"ArrayTexture(4)"!==t)throw new Error("Auto output not supported for input type: "+t);this.output=e[0].output}}if(this.graphical&&2!==this.output.length)throw new Error("Output must have 2 dimensions on graphical mode");this.checkOutput()}translateSource(){if(this.leadingReturnStatement=this.output.length>1?"resultX[x] = ":"result[x] = ",this.subKernels){const e=[];for(let t=0;t1?`resultX_${n}[x] = subKernelResult_${n};\n`:`result_${n}[x] = subKernelResult_${n};\n`)}this.followingReturnStatement=e.join("")}const e=i.fromKernel(this,s);this.translatedSources=e.getPrototypes("kernel"),this.graphical||this.returnType||(this.returnType=e.getKernelResultType())}build(){if(this.built)return;if(this.setupConstants(),this.setupArguments(arguments),this.validateSettings(arguments),this.translateSource(),this.graphical){const{canvas:e,output:t}=this;if(!e)throw new Error("no canvas available for using graphical output");const n=t[0],r=t[1]||1;e.width=n,e.height=r,this._imageData=this.context.createImageData(n,r),this._colorData=new Uint8ClampedArray(n*r*4)}const e=this.getKernelString();this.kernelString=e,this.debug&&(console.log("Function output:"),console.log(e));try{this.run=new Function([],e).bind(this)()}catch(e){console.error("An error occurred compiling the javascript: ",e)}this.buildSignature(arguments),this.built=!0}color(e,t,n,r){void 0===r&&(r=1),e=Math.floor(255*e),t=Math.floor(255*t),n=Math.floor(255*n),r=Math.floor(255*r);const i=this.output[0],s=this.output[1],a=this.thread.x+(s-this.thread.y-1)*i;this._colorData[4*a+0]=e,this._colorData[4*a+1]=t,this._colorData[4*a+2]=n,this._colorData[4*a+3]=r}getKernelString(){if(null!==this._kernelString)return this._kernelString;let e=null,{translatedSources:t}=this;return t.length>1?t=t.filter((t=>/^function/.test(t)?t:(e=t,!1))):e=t.shift(),this._kernelString=` const LOOP_MAX = ${this._getLoopMaxString()};\n ${this.injectedNative||""}\n const _this = this;\n ${this._resultKernelHeader()}\n ${this._processConstants()}\n return (${this.argumentNames.map((e=>"user_"+e)).join(", ")}) => {\n ${this._prependedString.join("")}\n ${this._earlyThrows()}\n ${this._processArguments()}\n ${this.graphical?this._graphicalKernelBody(e):this._resultKernelBody(e)}\n ${t.length>0?t.join("\n"):""}\n };`}toString(){return o(this)}_getLoopMaxString(){return this.loopMaxIterations?` ${parseInt(this.loopMaxIterations)};`:" 1000;"}_processConstants(){if(!this.constants)return"";const e=[];for(let t in this.constants){switch(this.constantTypes[t]){case"HTMLCanvas":case"OffscreenCanvas":case"HTMLImage":case"ImageBitmap":case"ImageData":case"HTMLVideo":e.push(` const constants_${t} = this._mediaTo2DArray(this.constants.${t});\n`);break;case"HTMLImageArray":e.push(` const constants_${t} = this._imageTo3DArray(this.constants.${t});\n`);break;case"Input":e.push(` const constants_${t} = this.constants.${t}.value;\n`);break;default:e.push(` const constants_${t} = this.constants.${t};\n`)}}return e.join("")}_earlyThrows(){if(this.graphical)return"";if(this.immutable)return"";if(!this.pipeline)return"";const e=[];for(let t=0;t`user_${r} === result_${e.name}`)).join(" || ");t.push(`user_${r} === result${i?` || ${i}`:""}`)}return`if (${t.join(" || ")}) throw new Error('Source and destination arrays are the same. Use immutable = true');`}_processArguments(){const e=[];for(let t=0;t0?e.width:e.videoWidth,r=e.height>0?e.height:e.videoHeight;t.width=0;e--){const t=a[e]=new Array(n);for(let e=0;e`const result_${e.name} = new ${t}(outputX);\n`)).join(" ")}\n ${this._mapSubKernels((e=>`let subKernelResult_${e.name};\n`)).join(" ")}\n for (let x = 0; x < outputX; x++) {\n this.thread.x = x;\n this.thread.y = 0;\n this.thread.z = 0;\n ${e}\n }`}_mutableKernel1DResults(){const e=this._getKernelResultTypeConstructorString();return` const outputX = _this.output[0];\n const result = new ${e}(outputX);\n ${this._mapSubKernels((t=>`const result_${t.name} = new ${e}(outputX);\n`)).join(" ")}\n ${this._mapSubKernels((e=>`let subKernelResult_${e.name};\n`)).join(" ")}`}_resultMutableKernel1DLoop(e){return` const outputX = _this.output[0];\n for (let x = 0; x < outputX; x++) {\n this.thread.x = x;\n this.thread.y = 0;\n this.thread.z = 0;\n ${e}\n }`}_resultImmutableKernel2DLoop(e){const t=this._getKernelResultTypeConstructorString();return` const outputX = _this.output[0];\n const outputY = _this.output[1];\n const result = new Array(outputY);\n ${this._mapSubKernels((e=>`const result_${e.name} = new Array(outputY);\n`)).join(" ")}\n ${this._mapSubKernels((e=>`let subKernelResult_${e.name};\n`)).join(" ")}\n for (let y = 0; y < outputY; y++) {\n this.thread.z = 0;\n this.thread.y = y;\n const resultX = result[y] = new ${t}(outputX);\n ${this._mapSubKernels((e=>`const resultX_${e.name} = result_${e.name}[y] = new ${t}(outputX);\n`)).join("")}\n for (let x = 0; x < outputX; x++) {\n this.thread.x = x;\n ${e}\n }\n }`}_mutableKernel2DResults(){const e=this._getKernelResultTypeConstructorString();return` const outputX = _this.output[0];\n const outputY = _this.output[1];\n const result = new Array(outputY);\n ${this._mapSubKernels((e=>`const result_${e.name} = new Array(outputY);\n`)).join(" ")}\n ${this._mapSubKernels((e=>`let subKernelResult_${e.name};\n`)).join(" ")}\n for (let y = 0; y < outputY; y++) {\n const resultX = result[y] = new ${e}(outputX);\n ${this._mapSubKernels((t=>`const resultX_${t.name} = result_${t.name}[y] = new ${e}(outputX);\n`)).join("")}\n }`}_resultMutableKernel2DLoop(e){const t=this._getKernelResultTypeConstructorString();return` const outputX = _this.output[0];\n const outputY = _this.output[1];\n for (let y = 0; y < outputY; y++) {\n this.thread.z = 0;\n this.thread.y = y;\n const resultX = result[y];\n ${this._mapSubKernels((e=>`const resultX_${e.name} = result_${e.name}[y] = new ${t}(outputX);\n`)).join("")}\n for (let x = 0; x < outputX; x++) {\n this.thread.x = x;\n ${e}\n }\n }`}_graphicalKernel2DLoop(e){return` const outputX = _this.output[0];\n const outputY = _this.output[1];\n for (let y = 0; y < outputY; y++) {\n this.thread.z = 0;\n this.thread.y = y;\n for (let x = 0; x < outputX; x++) {\n this.thread.x = x;\n ${e}\n }\n }`}_resultImmutableKernel3DLoop(e){const t=this._getKernelResultTypeConstructorString();return` const outputX = _this.output[0];\n const outputY = _this.output[1];\n const outputZ = _this.output[2];\n const result = new Array(outputZ);\n ${this._mapSubKernels((e=>`const result_${e.name} = new Array(outputZ);\n`)).join(" ")}\n ${this._mapSubKernels((e=>`let subKernelResult_${e.name};\n`)).join(" ")}\n for (let z = 0; z < outputZ; z++) {\n this.thread.z = z;\n const resultY = result[z] = new Array(outputY);\n ${this._mapSubKernels((e=>`const resultY_${e.name} = result_${e.name}[z] = new Array(outputY);\n`)).join(" ")}\n for (let y = 0; y < outputY; y++) {\n this.thread.y = y;\n const resultX = resultY[y] = new ${t}(outputX);\n ${this._mapSubKernels((e=>`const resultX_${e.name} = resultY_${e.name}[y] = new ${t}(outputX);\n`)).join(" ")}\n for (let x = 0; x < outputX; x++) {\n this.thread.x = x;\n ${e}\n }\n }\n }`}_mutableKernel3DResults(){const e=this._getKernelResultTypeConstructorString();return` const outputX = _this.output[0];\n const outputY = _this.output[1];\n const outputZ = _this.output[2];\n const result = new Array(outputZ);\n ${this._mapSubKernels((e=>`const result_${e.name} = new Array(outputZ);\n`)).join(" ")}\n ${this._mapSubKernels((e=>`let subKernelResult_${e.name};\n`)).join(" ")}\n for (let z = 0; z < outputZ; z++) {\n const resultY = result[z] = new Array(outputY);\n ${this._mapSubKernels((e=>`const resultY_${e.name} = result_${e.name}[z] = new Array(outputY);\n`)).join(" ")}\n for (let y = 0; y < outputY; y++) {\n const resultX = resultY[y] = new ${e}(outputX);\n ${this._mapSubKernels((t=>`const resultX_${t.name} = resultY_${t.name}[y] = new ${e}(outputX);\n`)).join(" ")}\n }\n }`}_resultMutableKernel3DLoop(e){return` const outputX = _this.output[0];\n const outputY = _this.output[1];\n const outputZ = _this.output[2];\n for (let z = 0; z < outputZ; z++) {\n this.thread.z = z;\n const resultY = result[z];\n for (let y = 0; y < outputY; y++) {\n this.thread.y = y;\n const resultX = resultY[y];\n for (let x = 0; x < outputX; x++) {\n this.thread.x = x;\n ${e}\n }\n }\n }`}_kernelOutput(){return this.subKernels?`\n return {\n result: result,\n ${this.subKernels.map((e=>`${e.property}: result_${e.name}`)).join(",\n ")}\n };`:"\n return result;"}_mapSubKernels(e){return null===this.subKernels?[""]:this.subKernels.map(e)}destroy(e){e&&delete this.canvas}static destroyContext(e){}toJSON(){const e=super.toJSON();return e.functionNodes=i.fromKernel(this,s).toJSON(),e}setOutput(e){super.setOutput(e);const[t,n]=this.output;this.graphical&&(this._imageData=this.context.createImageData(t,n),this._colorData=new Uint8ClampedArray(t*n*4))}prependString(e){if(this._kernelString)throw new Error("Kernel already built");this._prependedString.push(e)}hasPrependString(e){return this._prependedString.indexOf(e)>-1}}}},{"../../utils":114,"../function-builder":9,"../kernel":36,"./function-node":6,"./kernel-string":7}],9:[function(e,t,n){class r{static fromKernel(e,t,n){const{kernelArguments:i,kernelConstants:s,argumentNames:a,argumentSizes:o,argumentBitRatios:u,constants:l,constantBitRatios:h,debug:c,loopMaxIterations:p,nativeFunctions:d,output:m,optimizeFloatMemory:f,precision:g,plugins:x,source:y,subKernels:b,functions:T,leadingReturnStatement:v,followingReturnStatement:S,dynamicArguments:A,dynamicOutput:_}=e,E=new Array(i.length),w={};for(let e=0;eG.needsArgumentType(e,t),I=(e,t,n)=>{G.assignArgumentType(e,t,n)},D=(e,t,n)=>G.lookupReturnType(e,t,n),C=e=>G.lookupFunctionArgumentTypes(e),$=(e,t)=>G.lookupFunctionArgumentName(e,t),L=(e,t)=>G.lookupFunctionArgumentBitRatio(e,t),R=(e,t,n,r)=>{G.assignArgumentType(e,t,n,r)},F=(e,t,n,r)=>{G.assignArgumentBitRatio(e,t,n,r)},N=(e,t,n)=>{G.trackFunctionCall(e,t,n)},V=(e,n)=>{const r=[];for(let t=0;tnew t(e.source,{returnType:e.returnType,argumentTypes:e.argumentTypes,output:m,plugins:x,constants:l,constantTypes:w,constantBitRatios:h,optimizeFloatMemory:f,precision:g,lookupReturnType:D,lookupFunctionArgumentTypes:C,lookupFunctionArgumentName:$,lookupFunctionArgumentBitRatio:L,needsArgumentType:k,assignArgumentType:I,triggerImplyArgumentType:R,triggerImplyArgumentBitRatio:F,onFunctionCall:N,onNestedFunction:V}))));let K=null;b&&(K=b.map((e=>{const{name:n,source:r}=e;return new t(r,Object.assign({},M,{name:n,isSubKernel:!0,isRootKernel:!1}))})));const G=new r({kernel:e,rootNode:z,functionNodes:P,nativeFunctions:d,subKernelNodes:K});return G}constructor(e){if(e=e||{},this.kernel=e.kernel,this.rootNode=e.rootNode,this.functionNodes=e.functionNodes||[],this.subKernelNodes=e.subKernelNodes||[],this.nativeFunctions=e.nativeFunctions||[],this.functionMap={},this.nativeFunctionNames=[],this.lookupChain=[],this.functionNodeDependencies={},this.functionCalls={},this.rootNode&&(this.functionMap.kernel=this.rootNode),this.functionNodes)for(let e=0;e-1){const n=t.indexOf(e);if(-1===n)t.push(e);else{const e=t.splice(n,1)[0];t.push(e)}return t}const n=this.functionMap[e];if(n){const r=t.indexOf(e);if(-1===r){t.push(e),n.toString();for(let e=0;e-1){t.push(this.nativeFunctions[i].source);continue}const s=this.functionMap[r];s&&t.push(s.toString())}return t}toJSON(){return this.traceFunctionCalls(this.rootNode.name).reverse().map((e=>{const t=this.nativeFunctions.indexOf(e);if(t>-1)return{name:e,source:this.nativeFunctions[t].source};if(this.functionMap[e])return this.functionMap[e].toJSON();throw new Error(`function ${e} not found`)}))}fromJSON(e,t){this.functionMap={};for(let n=0;n0){const i=t.arguments;for(let t=0;t0&&this.argumentTypes.length!==this.argumentNames.length)throw new Error(`argumentTypes count of ${this.argumentTypes.length} exceeds ${this.argumentNames.length}`);if(this.output.length<1)throw new Error("this.output is not big enough")}isIdentifierConstant(e){return!!this.constants&&this.constants.hasOwnProperty(e)}isInput(e){return"Input"===this.argumentTypes[this.argumentNames.indexOf(e)]}pushState(e){this.states.push(e)}popState(e){if(this.state!==e)throw new Error(`Cannot popState ${e} when in ${this.state}`);this.states.pop()}isState(e){return this.state===e}get state(){return this.states[this.states.length-1]}astMemberExpressionUnroll(e){if("Identifier"===e.type)return e.name;if("ThisExpression"===e.type)return"this";if("MemberExpression"===e.type&&e.object&&e.property)return e.object.hasOwnProperty("name")&&"Math"!==e.object.name?this.astMemberExpressionUnroll(e.property):this.astMemberExpressionUnroll(e.object)+"."+this.astMemberExpressionUnroll(e.property);if(e.hasOwnProperty("expressions")){const t=e.expressions[0];if("Literal"===t.type&&0===t.value&&2===e.expressions.length)return this.astMemberExpressionUnroll(e.expressions[1])}throw this.astErrorOutput("Unknown astMemberExpressionUnroll",e)}getJsAST(e){if(this.ast)return this.ast;if("object"==typeof this.source)return this.traceFunctionAST(this.source),this.ast=this.source;if(null===(e=e||r))throw new Error("Missing JS to AST parser");const t=Object.freeze(e.parse(`const parser_${this.name} = ${this.source};`,{locations:!0})),n=t.body[0].declarations[0].init;if(this.traceFunctionAST(n),!t)throw new Error("Failed to parse JS code");return this.ast=n}traceFunctionAST(e){const{contexts:t,declarations:n,functions:r,identifiers:i,functionCalls:a}=new s(e);this.contexts=t,this.identifiers=i,this.functionCalls=a,this.functions=r;for(let e=0;e":case"<":return"Boolean";case"&":case"|":case"^":case"<<":case">>":case">>>":return"Integer"}const n=this.getType(e.left);if(this.isState("skip-literal-correction"))return n;if("LiteralInteger"===n){const t=this.getType(e.right);return"LiteralInteger"===t?e.left.value%1==0?"Integer":"Float":t}return a[n]||n;case"UpdateExpression":case"ReturnStatement":return this.getType(e.argument);case"UnaryExpression":return"~"===e.operator?"Integer":this.getType(e.argument);case"VariableDeclaration":{const t=e.declarations;let n;for(let e=0;e-1}isAstMathFunction(e){return"CallExpression"===e.type&&e.callee&&"MemberExpression"===e.callee.type&&e.callee.object&&"Identifier"===e.callee.object.type&&"Math"===e.callee.object.name&&e.callee.property&&"Identifier"===e.callee.property.type&&["abs","acos","acosh","asin","asinh","atan","atan2","atanh","cbrt","ceil","clz32","cos","cosh","expm1","exp","floor","fround","imul","log","log2","log10","log1p","max","min","pow","random","round","sign","sin","sinh","sqrt","tan","tanh","trunc"].indexOf(e.callee.property.name)>-1}isAstVariable(e){return"Identifier"===e.type||"MemberExpression"===e.type}isSafe(e){return this.isSafeDependencies(this.getDependencies(e))}isSafeDependencies(e){return!e||!e.every||e.every((e=>e.isSafe))}getDependencies(e,t,n){if(t||(t=[]),!e)return null;if(Array.isArray(e)){for(let r=0;r-1/0&&e.value<1/0&&!isNaN(e.value))});break;case"VariableDeclarator":return this.getDependencies(e.init,t,n);case"Identifier":const r=this.getDeclaration(e);if(r)t.push({name:e.name,origin:"declaration",isSafe:!n&&this.isSafeDependencies(r.dependencies)});else if(this.argumentNames.indexOf(e.name)>-1)t.push({name:e.name,origin:"argument",isSafe:!1});else if(this.strictTypingChecking)throw new Error(`Cannot find identifier origin "${e.name}"`);break;case"FunctionDeclaration":return this.getDependencies(e.body.body[e.body.body.length-1],t,n);case"ReturnStatement":return this.getDependencies(e.argument,t);case"BinaryExpression":case"LogicalExpression":return n="/"===e.operator||"*"===e.operator,this.getDependencies(e.left,t,n),this.getDependencies(e.right,t,n),t;case"UnaryExpression":case"UpdateExpression":return this.getDependencies(e.argument,t,n);case"VariableDeclaration":return this.getDependencies(e.declarations,t,n);case"ArrayExpression":return t.push({origin:"declaration",isSafe:!0}),t;case"CallExpression":return t.push({origin:"function",isSafe:!0}),t;case"MemberExpression":const i=this.getMemberExpressionDetails(e);switch(i.signature){case"value[]":this.getDependencies(e.object,t,n);break;case"value[][]":this.getDependencies(e.object.object,t,n);break;case"value[][][]":this.getDependencies(e.object.object.object,t,n);break;case"this.output.value":this.dynamicOutput&&t.push({name:i.name,origin:"output",isSafe:!1})}if(i)return i.property&&this.getDependencies(i.property,t,n),i.xProperty&&this.getDependencies(i.xProperty,t,n),i.yProperty&&this.getDependencies(i.yProperty,t,n),i.zProperty&&this.getDependencies(i.zProperty,t,n),t;case"SequenceExpression":return this.getDependencies(e.expressions,t,n);default:throw this.astErrorOutput(`Unhandled type ${e.type} in getDependencies`,e)}return t}getVariableSignature(e,t){if(!this.isAstVariable(e))throw new Error(`ast of type "${e.type}" is not a variable signature`);if("Identifier"===e.type)return"value";const n=[];for(;e;)e.computed?n.push("[]"):"ThisExpression"===e.type?n.unshift("this"):e.property&&e.property.name?"x"===e.property.name||"y"===e.property.name||"z"===e.property.name?n.unshift(t?"."+e.property.name:".value"):"constants"===e.property.name||"thread"===e.property.name||"output"===e.property.name?n.unshift("."+e.property.name):n.unshift(t?"."+e.property.name:".value"):e.name?n.unshift(t?e.name:"value"):e.callee&&e.callee.name?n.unshift(t?e.callee.name+"()":"fn()"):e.elements?n.unshift("[]"):n.unshift("unknown"),e=e.object;const r=n.join("");if(t)return r;return["value","value[]","value[][]","value[][][]","value[][][][]","value.value","value.thread.value","this.thread.value","this.output.value","this.constants.value","this.constants.value[]","this.constants.value[][]","this.constants.value[][][]","this.constants.value[][][][]","fn()[]","fn()[][]","fn()[][][]","[][]"].indexOf(r)>-1?r:null}build(){return this.toString().length>0}astGeneric(e,t){if(null===e)throw this.astErrorOutput("NULL ast",e);if(Array.isArray(e)){for(let n=0;n0?r[r.length-1]:0;return new Error(`${e} on line ${r.length}, position ${s.length}:\n ${n}`)}astDebuggerStatement(e,t){return t}astConditionalExpression(e,t){if("ConditionalExpression"!==e.type)throw this.astErrorOutput("Not a conditional expression",e);return t.push("("),this.astGeneric(e.test,t),t.push("?"),this.astGeneric(e.consequent,t),t.push(":"),this.astGeneric(e.alternate,t),t.push(")"),t}astFunction(e,t){throw new Error(`"astFunction" not defined on ${this.constructor.name}`)}astFunctionDeclaration(e,t){return this.isChildFunction(e)?t:this.astFunction(e,t)}astFunctionExpression(e,t){return this.isChildFunction(e)?t:this.astFunction(e,t)}isChildFunction(e){for(let t=0;t1?t.push("(",r.join(","),")"):t.push(r[0]),t}astUnaryExpression(e,t){return this.checkAndUpconvertBitwiseUnary(e,t)||(e.prefix?(t.push(e.operator),this.astGeneric(e.argument,t)):(this.astGeneric(e.argument,t),t.push(e.operator))),t}checkAndUpconvertBitwiseUnary(e,t){}astUpdateExpression(e,t){return e.prefix?(t.push(e.operator),this.astGeneric(e.argument,t)):(this.astGeneric(e.argument,t),t.push(e.operator)),t}astLogicalExpression(e,t){return t.push("("),this.astGeneric(e.left,t),t.push(e.operator),this.astGeneric(e.right,t),t.push(")"),t}astMemberExpression(e,t){return t}astCallExpression(e,t){return t}astArrayExpression(e,t){return t}getMemberExpressionDetails(e){if("MemberExpression"!==e.type)throw this.astErrorOutput(`Expression ${e.type} not a MemberExpression`,e);let t=null,n=null;const r=this.getVariableSignature(e);switch(r){case"value":return null;case"value.thread.value":case"this.thread.value":case"this.output.value":return{signature:r,type:"Integer",name:e.property.name};case"value[]":if("string"!=typeof e.object.name)throw this.astErrorOutput("Unexpected expression",e);return t=e.object.name,{name:t,origin:"user",signature:r,type:this.getVariableType(e.object),xProperty:e.property};case"value[][]":if("string"!=typeof e.object.object.name)throw this.astErrorOutput("Unexpected expression",e);return t=e.object.object.name,{name:t,origin:"user",signature:r,type:this.getVariableType(e.object.object),yProperty:e.object.property,xProperty:e.property};case"value[][][]":if("string"!=typeof e.object.object.object.name)throw this.astErrorOutput("Unexpected expression",e);return t=e.object.object.object.name,{name:t,origin:"user",signature:r,type:this.getVariableType(e.object.object.object),zProperty:e.object.object.property,yProperty:e.object.property,xProperty:e.property};case"value[][][][]":if("string"!=typeof e.object.object.object.object.name)throw this.astErrorOutput("Unexpected expression",e);return t=e.object.object.object.object.name,{name:t,origin:"user",signature:r,type:this.getVariableType(e.object.object.object.object),zProperty:e.object.object.property,yProperty:e.object.property,xProperty:e.property};case"value.value":if("string"!=typeof e.property.name)throw this.astErrorOutput("Unexpected expression",e);if(this.isAstMathVariable(e))return t=e.property.name,{name:t,origin:"Math",type:"Number",signature:r};switch(e.property.name){case"r":case"g":case"b":case"a":return t=e.object.name,{name:t,property:e.property.name,origin:"user",signature:r,type:"Number"};default:throw this.astErrorOutput("Unexpected expression",e)}case"this.constants.value":if("string"!=typeof e.property.name)throw this.astErrorOutput("Unexpected expression",e);if(t=e.property.name,n=this.getConstantType(t),!n)throw this.astErrorOutput("Constant has no type",e);return{name:t,type:n,origin:"constants",signature:r};case"this.constants.value[]":if("string"!=typeof e.object.property.name)throw this.astErrorOutput("Unexpected expression",e);if(t=e.object.property.name,n=this.getConstantType(t),!n)throw this.astErrorOutput("Constant has no type",e);return{name:t,type:n,origin:"constants",signature:r,xProperty:e.property};case"this.constants.value[][]":if("string"!=typeof e.object.object.property.name)throw this.astErrorOutput("Unexpected expression",e);if(t=e.object.object.property.name,n=this.getConstantType(t),!n)throw this.astErrorOutput("Constant has no type",e);return{name:t,type:n,origin:"constants",signature:r,yProperty:e.object.property,xProperty:e.property};case"this.constants.value[][][]":if("string"!=typeof e.object.object.object.property.name)throw this.astErrorOutput("Unexpected expression",e);if(t=e.object.object.object.property.name,n=this.getConstantType(t),!n)throw this.astErrorOutput("Constant has no type",e);return{name:t,type:n,origin:"constants",signature:r,zProperty:e.object.object.property,yProperty:e.object.property,xProperty:e.property};case"fn()[]":case"fn()[][]":case"[][]":return{signature:r,property:e.property};default:throw this.astErrorOutput("Unexpected expression",e)}}findIdentifierOrigin(e){const t=[this.ast];for(;t.length>0;){const n=t[0];if("VariableDeclarator"===n.type&&n.id&&n.id.name&&n.id.name===e.name)return n;if(t.shift(),n.argument)t.push(n.argument);else if(n.body)t.push(n.body);else if(n.declarations)t.push(n.declarations);else if(Array.isArray(n))for(let e=0;e0;){const e=t.pop();if("ReturnStatement"===e.type)return e;if("FunctionDeclaration"!==e.type)if(e.argument)t.push(e.argument);else if(e.body)t.push(e.body);else if(e.declarations)t.push(e.declarations);else if(Array.isArray(e))for(let n=0;n0?e[e.length-1]:null}const s="trackIdentifiers",a="memberExpression",o="inForLoopInit";t.exports={FunctionTracer:class{constructor(e){this.runningContexts=[],this.functionContexts=[],this.contexts=[],this.functionCalls=[],this.declarations=[],this.identifiers=[],this.functions=[],this.returnStatements=[],this.trackedIdentifiers=null,this.states=[],this.newFunctionContext(),this.scan(e)}isState(e){return this.states[this.states.length-1]===e}hasState(e){return this.states.indexOf(e)>-1}pushState(e){this.states.push(e)}popState(e){if(!this.isState(e))throw new Error(`Cannot pop the non-active state "${e}"`);this.states.pop()}get currentFunctionContext(){return i(this.functionContexts)}get currentContext(){return i(this.runningContexts)}newFunctionContext(){const e={"@contextType":"function"};this.contexts.push(e),this.functionContexts.push(e)}newContext(e){const t=Object.assign({"@contextType":"const/let"},this.currentContext);this.contexts.push(t),this.runningContexts.push(t),e();const{currentFunctionContext:n}=this;for(const e in n)n.hasOwnProperty(e)&&!t.hasOwnProperty(e)&&(t[e]=n[e]);return this.runningContexts.pop(),t}useFunctionContext(e){const t=i(this.functionContexts);this.runningContexts.push(t),e(),this.runningContexts.pop()}getIdentifiers(e){const t=this.trackedIdentifiers=[];return this.pushState(s),e(),this.trackedIdentifiers=null,this.popState(s),t}getDeclaration(e){const{currentContext:t,currentFunctionContext:n,runningContexts:r}=this,i=t[e]||n[e]||null;if(!i&&t===n&&r.length>0){const t=r[r.length-2];if(t[e])return t[e]}return i}scan(e){if(e)if(Array.isArray(e))for(let t=0;t{this.scan(e.body)}));break;case"BlockStatement":this.newContext((()=>{this.scan(e.body)}));break;case"AssignmentExpression":case"LogicalExpression":case"BinaryExpression":this.scan(e.left),this.scan(e.right);break;case"UpdateExpression":if("++"===e.operator){const t=this.getDeclaration(e.argument.name);t&&(t.suggestedType="Integer")}this.scan(e.argument);break;case"UnaryExpression":this.scan(e.argument);break;case"VariableDeclaration":"var"===e.kind?this.useFunctionContext((()=>{e.declarations=r.normalizeDeclarations(e),this.scan(e.declarations)})):(e.declarations=r.normalizeDeclarations(e),this.scan(e.declarations));break;case"VariableDeclarator":{const{currentContext:t}=this,n=this.hasState(o),r={ast:e,context:t,name:e.id.name,origin:"declaration",inForLoopInit:n,inForLoopTest:null,assignable:t===this.currentFunctionContext||!n&&!t.hasOwnProperty(e.id.name),suggestedType:null,valueType:null,dependencies:null,isSafe:null};t[e.id.name]||(t[e.id.name]=r),this.declarations.push(r),this.scan(e.id),this.scan(e.init);break}case"FunctionExpression":case"FunctionDeclaration":0===this.runningContexts.length?this.scan(e.body):this.functions.push(e);break;case"IfStatement":this.scan(e.test),this.scan(e.consequent),e.alternate&&this.scan(e.alternate);break;case"ForStatement":{let t;const n=this.newContext((()=>{this.pushState(o),this.scan(e.init),this.popState(o),t=this.getIdentifiers((()=>{this.scan(e.test)})),this.scan(e.update),this.newContext((()=>{this.scan(e.body)}))}));if(t)for(const e in n)"@contextType"!==e&&t.indexOf(e)>-1&&(n[e].inForLoopTest=!0);break}case"DoWhileStatement":case"WhileStatement":this.newContext((()=>{this.scan(e.body),this.scan(e.test)}));break;case"Identifier":this.isState(s)&&this.trackedIdentifiers.push(e.name),this.identifiers.push({context:this.currentContext,declaration:this.getDeclaration(e.name),ast:e});break;case"ReturnStatement":this.returnStatements.push(e),this.scan(e.argument);break;case"MemberExpression":this.pushState(a),this.scan(e.object),this.scan(e.property),this.popState(a);break;case"ExpressionStatement":this.scan(e.expression);break;case"SequenceExpression":this.scan(e.expressions);break;case"CallExpression":this.functionCalls.push({context:this.currentContext,ast:e}),this.scan(e.arguments);break;case"ArrayExpression":this.scan(e.elements);break;case"ConditionalExpression":this.scan(e.test),this.scan(e.alternate),this.scan(e.consequent);break;case"SwitchStatement":this.scan(e.discriminant),this.scan(e.cases);break;case"SwitchCase":this.scan(e.test),this.scan(e.consequent);break;case"ThisExpression":case"Literal":case"DebuggerStatement":case"EmptyStatement":case"BreakStatement":case"ContinueStatement":break;default:throw new Error(`unhandled type "${e.type}"`)}}}}},{"../utils":114}],12:[function(e,t,n){const{glWiretap:r}=e("gl-wiretap"),{utils:i}=e("../../utils");function s(e){return e.toString().replace("=>","").replace(/^function /,"").replace(/utils[.]/g,"/*utils.*/")}function a(e,t){const n="single"===t.precision?e:`new Float32Array(${e}.buffer)`;return t.output[2]?`renderOutput(${n}, ${t.output[0]}, ${t.output[1]}, ${t.output[2]})`:t.output[1]?`renderOutput(${n}, ${t.output[0]}, ${t.output[1]})`:`renderOutput(${n}, ${t.output[0]})`}function o(e,t,n){const r=e.toArray.toString(),s=!/^function/.test(r);return`() => {\n function framebuffer() { return ${n}; };\n ${i.flattenFunctionToString(`${s?"function ":""}${r}`,{findDependency:(t,n)=>{if("utils"===t)return`const ${n} = ${i[n].toString()};`;if("this"===t)return"framebuffer"===n?"":`${s?"function ":""}${e[n].toString()}`;throw new Error("unhandled fromObject")},thisLookup:(n,r)=>{if("texture"===n)return t;if("context"===n)return r?null:"gl";if(e.hasOwnProperty(n))return JSON.stringify(e[n]);throw new Error(`unhandled thisLookup ${n}`)}})}\n return toArray();\n }`}function u(e,t,n,r,i){if(null===e)return null;if(null===t)return null;switch(typeof e){case"boolean":case"number":return null}if("undefined"!=typeof HTMLImageElement&&e instanceof HTMLImageElement)for(let i=0;i{switch(typeof e){case"boolean":return new Boolean(e);case"number":return new Number(e);default:return e}})):null;const c=[],p=[],d=r(n.context,{useTrackablePrimitives:!0,onReadPixels:e=>{if(N.subKernels){if(m){const t=N.subKernels[f++].property;p.push(` result${isNaN(t)?"."+t:`[${t}]`} = ${a(e,N)};`)}else p.push(` const result = { result: ${a(e,N)} };`),m=!0;f===N.subKernels.length&&p.push(" return result;")}else e?p.push(` return ${a(e,N)};`):p.push(" return null;")},onUnrecognizedArgumentLookup:e=>{const t=u(e,N.kernelArguments,[],d,c);if(t)return t;const n=u(e,N.kernelConstants,S?Object.keys(S).map((e=>S[e])):[],d,c);return n||null}});let m=!1,f=0;const{source:g,canvas:x,output:y,pipeline:b,graphical:T,loopMaxIterations:v,constants:S,optimizeFloatMemory:A,precision:_,fixIntegerDivisionAccuracy:E,functions:w,nativeFunctions:k,subKernels:I,immutable:D,argumentTypes:C,constantTypes:$,kernelArguments:L,kernelConstants:R,tactic:F}=n,N=new e(g,{canvas:x,context:d,checkContext:!1,output:y,pipeline:b,graphical:T,loopMaxIterations:v,constants:S,optimizeFloatMemory:A,precision:_,fixIntegerDivisionAccuracy:E,functions:w,nativeFunctions:k,subKernels:I,immutable:D,argumentTypes:C,constantTypes:$,tactic:F});let V=[];if(d.setIndent(2),N.build.apply(N,t),V.push(d.toString()),d.reset(),N.kernelArguments.forEach(((e,n)=>{switch(e.type){case"Integer":case"Boolean":case"Number":case"Float":case"Array":case"Array(2)":case"Array(3)":case"Array(4)":case"HTMLCanvas":case"HTMLImage":case"HTMLVideo":case"Input":d.insertVariable(`uploadValue_${e.name}`,e.uploadValue);break;case"HTMLImageArray":for(let r=0;re.varName)).join(", ")}) {`),d.setIndent(4),N.run.apply(N,t),N.renderKernels?N.renderKernels():N.renderOutput&&N.renderOutput(),V.push(" /** start setup uploads for kernel values **/"),N.kernelArguments.forEach((e=>{V.push(" "+e.getStringValueHandler().split("\n").join("\n "))})),V.push(" /** end setup uploads for kernel values **/"),V.push(d.toString()),N.renderOutput===N.renderTexture){d.reset();const e=d.getContextVariableName(N.framebuffer);if(N.renderKernels){const t=N.renderKernels(),n=d.getContextVariableName(N.texture.texture);V.push(` return {\n result: {\n texture: ${n},\n type: '${t.result.type}',\n toArray: ${o(t.result,n,e)}\n },`);const{subKernels:r,mappedTextures:i}=N;for(let n=0;n"utils"===e?`const ${t} = ${i[t].toString()};`:null,thisLookup:t=>{if("context"===t)return null;if(e.hasOwnProperty(t))return JSON.stringify(e[t]);throw new Error(`unhandled thisLookup ${t}`)}})}(N)),V.push(" innerKernel.getPixels = getPixels;")),V.push(" return innerKernel;");let M=[];return R.forEach((e=>{M.push(`${e.getStringValueHandler()}`)})),`function kernel(settings) {\n const { context, constants } = settings;\n ${M.join("")}\n ${l||""}\n${V.join("\n")}\n}`}}},{"../../utils":114,"gl-wiretap":3}],13:[function(e,t,n){const{Kernel:r}=e("../kernel"),{utils:i}=e("../../utils"),{GLTextureArray2Float:s}=e("./texture/array-2-float"),{GLTextureArray2Float2D:a}=e("./texture/array-2-float-2d"),{GLTextureArray2Float3D:o}=e("./texture/array-2-float-3d"),{GLTextureArray3Float:u}=e("./texture/array-3-float"),{GLTextureArray3Float2D:l}=e("./texture/array-3-float-2d"),{GLTextureArray3Float3D:h}=e("./texture/array-3-float-3d"),{GLTextureArray4Float:c}=e("./texture/array-4-float"),{GLTextureArray4Float2D:p}=e("./texture/array-4-float-2d"),{GLTextureArray4Float3D:d}=e("./texture/array-4-float-3d"),{GLTextureFloat:m}=e("./texture/float"),{GLTextureFloat2D:f}=e("./texture/float-2d"),{GLTextureFloat3D:g}=e("./texture/float-3d"),{GLTextureMemoryOptimized:x}=e("./texture/memory-optimized"),{GLTextureMemoryOptimized2D:y}=e("./texture/memory-optimized-2d"),{GLTextureMemoryOptimized3D:b}=e("./texture/memory-optimized-3d"),{GLTextureUnsigned:T}=e("./texture/unsigned"),{GLTextureUnsigned2D:v}=e("./texture/unsigned-2d"),{GLTextureUnsigned3D:S}=e("./texture/unsigned-3d"),{GLTextureGraphical:A}=e("./texture/graphical");const _={int:"Integer",float:"Number",vec2:"Array(2)",vec3:"Array(3)",vec4:"Array(4)"};t.exports={GLKernel:class extends r{static get mode(){return"gpu"}static getIsFloatRead(){const e=new this("function kernelFunction() {\n return 1;\n }",{context:this.testContext,canvas:this.testCanvas,validate:!1,output:[1],precision:"single",returnType:"Number",tactic:"speed"});e.build(),e.run();const t=e.renderOutput();return e.destroy(!0),1===t[0]}static getIsIntegerDivisionAccurate(){const e=new this(function(e,t){return e[this.thread.x]/t[this.thread.x]}.toString(),{context:this.testContext,canvas:this.testCanvas,validate:!1,output:[2],returnType:"Number",precision:"unsigned",tactic:"speed"}),t=[[6,6030401],[3,3991]];e.build.apply(e,t),e.run.apply(e,t);const n=e.renderOutput();return e.destroy(!0),2===n[0]&&1511===n[1]}static getIsSpeedTacticSupported(){const e=new this(function(e){return e[this.thread.x]}.toString(),{context:this.testContext,canvas:this.testCanvas,validate:!1,output:[4],returnType:"Number",precision:"unsigned",tactic:"speed"}),t=[[0,1,2,3]];e.build.apply(e,t),e.run.apply(e,t);const n=e.renderOutput();return e.destroy(!0),0===Math.round(n[0])&&1===Math.round(n[1])&&2===Math.round(n[2])&&3===Math.round(n[3])}static get testCanvas(){throw new Error(`"testCanvas" not defined on ${this.name}`)}static get testContext(){throw new Error(`"testContext" not defined on ${this.name}`)}static getFeatures(){const e=this.testContext,t=this.getIsDrawBuffers();return Object.freeze({isFloatRead:this.getIsFloatRead(),isIntegerDivisionAccurate:this.getIsIntegerDivisionAccurate(),isSpeedTacticSupported:this.getIsSpeedTacticSupported(),isTextureFloat:this.getIsTextureFloat(),isDrawBuffers:t,kernelMap:t,channelCount:this.getChannelCount(),maxTextureSize:this.getMaxTextureSize(),lowIntPrecision:e.getShaderPrecisionFormat(e.FRAGMENT_SHADER,e.LOW_INT),lowFloatPrecision:e.getShaderPrecisionFormat(e.FRAGMENT_SHADER,e.LOW_FLOAT),mediumIntPrecision:e.getShaderPrecisionFormat(e.FRAGMENT_SHADER,e.MEDIUM_INT),mediumFloatPrecision:e.getShaderPrecisionFormat(e.FRAGMENT_SHADER,e.MEDIUM_FLOAT),highIntPrecision:e.getShaderPrecisionFormat(e.FRAGMENT_SHADER,e.HIGH_INT),highFloatPrecision:e.getShaderPrecisionFormat(e.FRAGMENT_SHADER,e.HIGH_FLOAT)})}static setupFeatureChecks(){throw new Error(`"setupFeatureChecks" not defined on ${this.name}`)}static getSignature(e,t){return e.getVariablePrecisionString()+(t.length>0?":"+t.join(","):"")}setFixIntegerDivisionAccuracy(e){return this.fixIntegerDivisionAccuracy=e,this}setPrecision(e){return this.precision=e,this}setFloatTextures(e){return i.warnDeprecated("method","setFloatTextures","setOptimizeFloatMemory"),this.floatTextures=e,this}static nativeFunctionArguments(e){const t=[],n=[],r=[],i=/^[a-zA-Z_]/,s=/[a-zA-Z_0-9]/;let a=0,o=null,u=null;for(;a0?r[r.length-1]:null;if("FUNCTION_ARGUMENTS"!==c||"/"!==l||"*"!==h)if("MULTI_LINE_COMMENT"!==c||"*"!==l||"/"!==h)if("FUNCTION_ARGUMENTS"!==c||"/"!==l||"/"!==h)if("COMMENT"!==c||"\n"!==l)if(null!==c||"("!==l){if("FUNCTION_ARGUMENTS"===c){if(")"===l){r.pop();break}if("f"===l&&"l"===h&&"o"===e[a+2]&&"a"===e[a+3]&&"t"===e[a+4]&&" "===e[a+5]){r.push("DECLARE_VARIABLE"),u="float",o="",a+=6;continue}if("i"===l&&"n"===h&&"t"===e[a+2]&&" "===e[a+3]){r.push("DECLARE_VARIABLE"),u="int",o="",a+=4;continue}if("v"===l&&"e"===h&&"c"===e[a+2]&&"2"===e[a+3]&&" "===e[a+4]){r.push("DECLARE_VARIABLE"),u="vec2",o="",a+=5;continue}if("v"===l&&"e"===h&&"c"===e[a+2]&&"3"===e[a+3]&&" "===e[a+4]){r.push("DECLARE_VARIABLE"),u="vec3",o="",a+=5;continue}if("v"===l&&"e"===h&&"c"===e[a+2]&&"4"===e[a+3]&&" "===e[a+4]){r.push("DECLARE_VARIABLE"),u="vec4",o="",a+=5;continue}}else if("DECLARE_VARIABLE"===c){if(""===o){if(" "===l){a++;continue}if(!i.test(l))throw new Error("variable name is not expected string")}o+=l,s.test(h)||(r.pop(),n.push(o),t.push(_[u]))}a++}else r.push("FUNCTION_ARGUMENTS"),a++;else r.pop(),a++;else r.push("COMMENT"),a+=2;else r.pop(),a+=2;else r.push("MULTI_LINE_COMMENT"),a+=2}if(r.length>0)throw new Error("GLSL function was not parsable");return{argumentNames:n,argumentTypes:t}}static nativeFunctionReturnType(e){return _[e.match(/int|float|vec[2-4]/)[0]]}static combineKernels(e,t){e.apply(null,arguments);const{texSize:n,context:r,threadDim:s}=t.texSize;let a;if("single"===t.precision){const e=n[0],t=Math.ceil(n[1]/4);a=new Float32Array(e*t*4*4),r.readPixels(0,0,e,4*t,r.RGBA,r.FLOAT,a)}else{const e=new Uint8Array(n[0]*n[1]*4);r.readPixels(0,0,n[0],n[1],r.RGBA,r.UNSIGNED_BYTE,e),a=new Float32Array(e.buffer)}if(a=a.subarray(0,s[0]*s[1]*s[2]),1===t.output.length)return a;if(2===t.output.length)return i.splitArray(a,t.output[0]);if(3===t.output.length){return i.splitArray(a,t.output[0]*t.output[1]).map((function(e){return i.splitArray(e,t.output[0])}))}}constructor(e,t){super(e,t),this.transferValues=null,this.formatValues=null,this.TextureConstructor=null,this.renderOutput=null,this.renderRawOutput=null,this.texSize=null,this.translatedSource=null,this.compiledFragmentShader=null,this.compiledVertexShader=null,this.switchingKernels=null,this._textureSwitched=null,this._mappedTextureSwitched=null}checkTextureSize(){const{features:e}=this.constructor;if(this.texSize[0]>e.maxTextureSize||this.texSize[1]>e.maxTextureSize)throw new Error(`Texture size [${this.texSize[0]},${this.texSize[1]}] generated by kernel is larger than supported size [${e.maxTextureSize},${e.maxTextureSize}]`)}translateSource(){throw new Error(`"translateSource" not defined on ${this.constructor.name}`)}pickRenderStrategy(e){if(this.graphical)return this.renderRawOutput=this.readPackedPixelsToUint8Array,this.transferValues=e=>e,this.TextureConstructor=A,null;if("unsigned"===this.precision)if(this.renderRawOutput=this.readPackedPixelsToUint8Array,this.transferValues=this.readPackedPixelsToFloat32Array,this.pipeline)switch(this.renderOutput=this.renderTexture,null!==this.subKernels&&(this.renderKernels=this.renderKernelsToTextures),this.returnType){case"LiteralInteger":case"Float":case"Number":case"Integer":return this.output[2]>0?(this.TextureConstructor=S,null):this.output[1]>0?(this.TextureConstructor=v,null):(this.TextureConstructor=T,null);case"Array(2)":case"Array(3)":case"Array(4)":return this.requestFallback(e)}else switch(null!==this.subKernels&&(this.renderKernels=this.renderKernelsToArrays),this.returnType){case"LiteralInteger":case"Float":case"Number":case"Integer":return this.renderOutput=this.renderValues,this.output[2]>0?(this.TextureConstructor=S,this.formatValues=i.erect3DPackedFloat,null):this.output[1]>0?(this.TextureConstructor=v,this.formatValues=i.erect2DPackedFloat,null):(this.TextureConstructor=T,this.formatValues=i.erectPackedFloat,null);case"Array(2)":case"Array(3)":case"Array(4)":return this.requestFallback(e)}else{if("single"!==this.precision)throw new Error(`unhandled precision of "${this.precision}"`);if(this.renderRawOutput=this.readFloatPixelsToFloat32Array,this.transferValues=this.readFloatPixelsToFloat32Array,this.pipeline)switch(this.renderOutput=this.renderTexture,null!==this.subKernels&&(this.renderKernels=this.renderKernelsToTextures),this.returnType){case"LiteralInteger":case"Float":case"Number":case"Integer":return this.optimizeFloatMemory?this.output[2]>0?(this.TextureConstructor=b,null):this.output[1]>0?(this.TextureConstructor=y,null):(this.TextureConstructor=x,null):this.output[2]>0?(this.TextureConstructor=g,null):this.output[1]>0?(this.TextureConstructor=f,null):(this.TextureConstructor=m,null);case"Array(2)":return this.output[2]>0?(this.TextureConstructor=o,null):this.output[1]>0?(this.TextureConstructor=a,null):(this.TextureConstructor=s,null);case"Array(3)":return this.output[2]>0?(this.TextureConstructor=h,null):this.output[1]>0?(this.TextureConstructor=l,null):(this.TextureConstructor=u,null);case"Array(4)":return this.output[2]>0?(this.TextureConstructor=d,null):this.output[1]>0?(this.TextureConstructor=p,null):(this.TextureConstructor=c,null)}if(this.renderOutput=this.renderValues,null!==this.subKernels&&(this.renderKernels=this.renderKernelsToArrays),this.optimizeFloatMemory)switch(this.returnType){case"LiteralInteger":case"Float":case"Number":case"Integer":return this.output[2]>0?(this.TextureConstructor=b,this.formatValues=i.erectMemoryOptimized3DFloat,null):this.output[1]>0?(this.TextureConstructor=y,this.formatValues=i.erectMemoryOptimized2DFloat,null):(this.TextureConstructor=x,this.formatValues=i.erectMemoryOptimizedFloat,null);case"Array(2)":return this.output[2]>0?(this.TextureConstructor=o,this.formatValues=i.erect3DArray2,null):this.output[1]>0?(this.TextureConstructor=a,this.formatValues=i.erect2DArray2,null):(this.TextureConstructor=s,this.formatValues=i.erectArray2,null);case"Array(3)":return this.output[2]>0?(this.TextureConstructor=h,this.formatValues=i.erect3DArray3,null):this.output[1]>0?(this.TextureConstructor=l,this.formatValues=i.erect2DArray3,null):(this.TextureConstructor=u,this.formatValues=i.erectArray3,null);case"Array(4)":return this.output[2]>0?(this.TextureConstructor=d,this.formatValues=i.erect3DArray4,null):this.output[1]>0?(this.TextureConstructor=p,this.formatValues=i.erect2DArray4,null):(this.TextureConstructor=c,this.formatValues=i.erectArray4,null)}else switch(this.returnType){case"LiteralInteger":case"Float":case"Number":case"Integer":return this.output[2]>0?(this.TextureConstructor=g,this.formatValues=i.erect3DFloat,null):this.output[1]>0?(this.TextureConstructor=f,this.formatValues=i.erect2DFloat,null):(this.TextureConstructor=m,this.formatValues=i.erectFloat,null);case"Array(2)":return this.output[2]>0?(this.TextureConstructor=o,this.formatValues=i.erect3DArray2,null):this.output[1]>0?(this.TextureConstructor=a,this.formatValues=i.erect2DArray2,null):(this.TextureConstructor=s,this.formatValues=i.erectArray2,null);case"Array(3)":return this.output[2]>0?(this.TextureConstructor=h,this.formatValues=i.erect3DArray3,null):this.output[1]>0?(this.TextureConstructor=l,this.formatValues=i.erect2DArray3,null):(this.TextureConstructor=u,this.formatValues=i.erectArray3,null);case"Array(4)":return this.output[2]>0?(this.TextureConstructor=d,this.formatValues=i.erect3DArray4,null):this.output[1]>0?(this.TextureConstructor=p,this.formatValues=i.erect2DArray4,null):(this.TextureConstructor=c,this.formatValues=i.erectArray4,null)}}throw new Error(`unhandled return type "${this.returnType}"`)}getKernelString(){throw new Error("abstract method call")}getMainResultTexture(){switch(this.returnType){case"LiteralInteger":case"Float":case"Integer":case"Number":return this.getMainResultNumberTexture();case"Array(2)":return this.getMainResultArray2Texture();case"Array(3)":return this.getMainResultArray3Texture();case"Array(4)":return this.getMainResultArray4Texture();default:throw new Error(`unhandled returnType type ${this.returnType}`)}}getMainResultKernelNumberTexture(){throw new Error("abstract method call")}getMainResultSubKernelNumberTexture(){throw new Error("abstract method call")}getMainResultKernelArray2Texture(){throw new Error("abstract method call")}getMainResultSubKernelArray2Texture(){throw new Error("abstract method call")}getMainResultKernelArray3Texture(){throw new Error("abstract method call")}getMainResultSubKernelArray3Texture(){throw new Error("abstract method call")}getMainResultKernelArray4Texture(){throw new Error("abstract method call")}getMainResultSubKernelArray4Texture(){throw new Error("abstract method call")}getMainResultGraphical(){throw new Error("abstract method call")}getMainResultMemoryOptimizedFloats(){throw new Error("abstract method call")}getMainResultPackedPixels(){throw new Error("abstract method call")}getMainResultString(){return this.graphical?this.getMainResultGraphical():"single"===this.precision?this.optimizeFloatMemory?this.getMainResultMemoryOptimizedFloats():this.getMainResultTexture():this.getMainResultPackedPixels()}getMainResultNumberTexture(){return i.linesToString(this.getMainResultKernelNumberTexture())+i.linesToString(this.getMainResultSubKernelNumberTexture())}getMainResultArray2Texture(){return i.linesToString(this.getMainResultKernelArray2Texture())+i.linesToString(this.getMainResultSubKernelArray2Texture())}getMainResultArray3Texture(){return i.linesToString(this.getMainResultKernelArray3Texture())+i.linesToString(this.getMainResultSubKernelArray3Texture())}getMainResultArray4Texture(){return i.linesToString(this.getMainResultKernelArray4Texture())+i.linesToString(this.getMainResultSubKernelArray4Texture())}getFloatTacticDeclaration(){return`precision ${this.getVariablePrecisionString(this.texSize,this.tactic)} float;\n`}getIntTacticDeclaration(){return`precision ${this.getVariablePrecisionString(this.texSize,this.tactic,!0)} int;\n`}getSampler2DTacticDeclaration(){return`precision ${this.getVariablePrecisionString(this.texSize,this.tactic)} sampler2D;\n`}getSampler2DArrayTacticDeclaration(){return`precision ${this.getVariablePrecisionString(this.texSize,this.tactic)} sampler2DArray;\n`}renderTexture(){return this.immutable?this.texture.clone():this.texture}readPackedPixelsToUint8Array(){if("unsigned"!==this.precision)throw new Error('Requires this.precision to be "unsigned"');const{texSize:e,context:t}=this,n=new Uint8Array(e[0]*e[1]*4);return t.readPixels(0,0,e[0],e[1],t.RGBA,t.UNSIGNED_BYTE,n),n}readPackedPixelsToFloat32Array(){return new Float32Array(this.readPackedPixelsToUint8Array().buffer)}readFloatPixelsToFloat32Array(){if("single"!==this.precision)throw new Error('Requires this.precision to be "single"');const{texSize:e,context:t}=this,n=e[0],r=e[1],i=new Float32Array(n*r*4);return t.readPixels(0,0,n,r,t.RGBA,t.FLOAT,i),i}getPixels(e){const{context:t,output:n}=this,[r,s]=n,a=new Uint8Array(r*s*4);return t.readPixels(0,0,r,s,t.RGBA,t.UNSIGNED_BYTE,a),new Uint8ClampedArray((e?a:i.flipPixels(a,r,s)).buffer)}renderKernelsToArrays(){const e={result:this.renderOutput()};for(let t=0;t0){for(let e=0;e0){const{mappedTextures:n}=this;for(let r=0;r1&&(this.newTexture(),!0)}cloneTexture(){this.texture._refs--;const{context:e,size:t,texture:n,kernel:r}=this;r.debug&&console.warn("cloning internal texture"),e.bindFramebuffer(e.FRAMEBUFFER,this.framebuffer()),i(e,n),e.framebufferTexture2D(e.FRAMEBUFFER,e.COLOR_ATTACHMENT0,e.TEXTURE_2D,n,0);const s=e.createTexture();i(e,s),e.texImage2D(e.TEXTURE_2D,0,this.internalFormat,t[0],t[1],0,this.textureFormat,this.textureType,null),e.copyTexSubImage2D(e.TEXTURE_2D,0,0,0,0,0,t[0],t[1]),s._refs=1,this.texture=s}newTexture(){this.texture._refs--;const e=this.context,t=this.size;this.kernel.debug&&console.warn("new internal texture");const n=e.createTexture();i(e,n),e.texImage2D(e.TEXTURE_2D,0,this.internalFormat,t[0],t[1],0,this.textureFormat,this.textureType,null),n._refs=1,this.texture=n}clear(){if(this.texture._refs){this.texture._refs--;const e=this.context,t=this.texture=e.createTexture();i(e,t);const n=this.size;t._refs=1,e.texImage2D(e.TEXTURE_2D,0,this.internalFormat,n[0],n[1],0,this.textureFormat,this.textureType,null)}const{context:e,texture:t}=this;e.bindFramebuffer(e.FRAMEBUFFER,this.framebuffer()),e.bindTexture(e.TEXTURE_2D,t),i(e,t),e.framebufferTexture2D(e.FRAMEBUFFER,e.COLOR_ATTACHMENT0,e.TEXTURE_2D,t,0),e.clearColor(0,0,0,0),e.clear(e.COLOR_BUFFER_BIT|e.DEPTH_BUFFER_BIT)}delete(){this._deleted||(this._deleted=!0,this.texture._refs&&(this.texture._refs--,this.texture._refs)||this.context.deleteTexture(this.texture))}framebuffer(){return this._framebuffer||(this._framebuffer=this.kernel.getRawValueFramebuffer(this.size[0],this.size[1])),this._framebuffer}}}},{"../../../texture":113}],28:[function(e,t,n){const{utils:r}=e("../../../utils"),{GLTextureFloat:i}=e("./float");t.exports={GLTextureMemoryOptimized2D:class extends i{constructor(e){super(e),this.type="MemoryOptimizedNumberTexture"}toArray(){return r.erectMemoryOptimized2DFloat(this.renderValues(),this.output[0],this.output[1])}}}},{"../../../utils":114,"./float":25}],29:[function(e,t,n){const{utils:r}=e("../../../utils"),{GLTextureFloat:i}=e("./float");t.exports={GLTextureMemoryOptimized3D:class extends i{constructor(e){super(e),this.type="MemoryOptimizedNumberTexture"}toArray(){return r.erectMemoryOptimized3DFloat(this.renderValues(),this.output[0],this.output[1],this.output[2])}}}},{"../../../utils":114,"./float":25}],30:[function(e,t,n){const{utils:r}=e("../../../utils"),{GLTextureFloat:i}=e("./float");t.exports={GLTextureMemoryOptimized:class extends i{constructor(e){super(e),this.type="MemoryOptimizedNumberTexture"}toArray(){return r.erectMemoryOptimizedFloat(this.renderValues(),this.output[0])}}}},{"../../../utils":114,"./float":25}],31:[function(e,t,n){const{utils:r}=e("../../../utils"),{GLTextureUnsigned:i}=e("./unsigned");t.exports={GLTextureUnsigned2D:class extends i{constructor(e){super(e),this.type="NumberTexture"}toArray(){return r.erect2DPackedFloat(this.renderValues(),this.output[0],this.output[1])}}}},{"../../../utils":114,"./unsigned":33}],32:[function(e,t,n){const{utils:r}=e("../../../utils"),{GLTextureUnsigned:i}=e("./unsigned");t.exports={GLTextureUnsigned3D:class extends i{constructor(e){super(e),this.type="NumberTexture"}toArray(){return r.erect3DPackedFloat(this.renderValues(),this.output[0],this.output[1],this.output[2])}}}},{"../../../utils":114,"./unsigned":33}],33:[function(e,t,n){const{utils:r}=e("../../../utils"),{GLTexture:i}=e("./index");t.exports={GLTextureUnsigned:class extends i{get textureType(){return this.context.UNSIGNED_BYTE}constructor(e){super(e),this.type="NumberTexture"}renderRawOutput(){const{context:e}=this;e.bindFramebuffer(e.FRAMEBUFFER,this.framebuffer()),e.framebufferTexture2D(e.FRAMEBUFFER,e.COLOR_ATTACHMENT0,e.TEXTURE_2D,this.texture,0);const t=new Uint8Array(this.size[0]*this.size[1]*4);return e.readPixels(0,0,this.size[0],this.size[1],e.RGBA,e.UNSIGNED_BYTE,t),t}renderValues(){return this._deleted?null:new Float32Array(this.renderRawOutput().buffer)}toArray(){return r.erectPackedFloat(this.renderValues(),this.output[0])}}}},{"../../../utils":114,"./index":27}],34:[function(e,t,n){const r=e("gl"),{WebGLKernel:i}=e("../web-gl/kernel"),{glKernelString:s}=e("../gl/kernel-string");let a=null,o=null,u=null,l=null,h=null;t.exports={HeadlessGLKernel:class extends i{static get isSupported(){return null!==a||(this.setupFeatureChecks(),a=null!==u),a}static setupFeatureChecks(){if(o=null,l=null,"function"==typeof r)try{if(u=r(2,2,{preserveDrawingBuffer:!0}),!u||!u.getExtension)return;l={STACKGL_resize_drawingbuffer:u.getExtension("STACKGL_resize_drawingbuffer"),STACKGL_destroy_context:u.getExtension("STACKGL_destroy_context"),OES_texture_float:u.getExtension("OES_texture_float"),OES_texture_float_linear:u.getExtension("OES_texture_float_linear"),OES_element_index_uint:u.getExtension("OES_element_index_uint"),WEBGL_draw_buffers:u.getExtension("WEBGL_draw_buffers"),WEBGL_color_buffer_float:u.getExtension("WEBGL_color_buffer_float")},h=this.getFeatures()}catch(e){console.warn(e)}}static isContextMatch(e){try{return"ANGLE"===e.getParameter(e.RENDERER)}catch(e){return!1}}static getIsTextureFloat(){return Boolean(l.OES_texture_float)}static getIsDrawBuffers(){return Boolean(l.WEBGL_draw_buffers)}static getChannelCount(){return l.WEBGL_draw_buffers?u.getParameter(l.WEBGL_draw_buffers.MAX_DRAW_BUFFERS_WEBGL):1}static getMaxTextureSize(){return u.getParameter(u.MAX_TEXTURE_SIZE)}static get testCanvas(){return o}static get testContext(){return u}static get features(){return h}initCanvas(){return{}}initContext(){return r(2,2,{preserveDrawingBuffer:!0})}initExtensions(){this.extensions={STACKGL_resize_drawingbuffer:this.context.getExtension("STACKGL_resize_drawingbuffer"),STACKGL_destroy_context:this.context.getExtension("STACKGL_destroy_context"),OES_texture_float:this.context.getExtension("OES_texture_float"),OES_texture_float_linear:this.context.getExtension("OES_texture_float_linear"),OES_element_index_uint:this.context.getExtension("OES_element_index_uint"),WEBGL_draw_buffers:this.context.getExtension("WEBGL_draw_buffers")}}build(){super.build.apply(this,arguments),this.fallbackRequested||this.extensions.STACKGL_resize_drawingbuffer.resize(this.maxTexSize[0],this.maxTexSize[1])}destroyExtensions(){this.extensions.STACKGL_resize_drawingbuffer=null,this.extensions.STACKGL_destroy_context=null,this.extensions.OES_texture_float=null,this.extensions.OES_texture_float_linear=null,this.extensions.OES_element_index_uint=null,this.extensions.WEBGL_draw_buffers=null}static destroyContext(e){const t=e.getExtension("STACKGL_destroy_context");t&&t.destroy&&t.destroy()}toString(){return s(this.constructor,arguments,this,"const gl = context || require('gl')(1, 1);\n"," if (!context) { gl.getExtension('STACKGL_destroy_context').destroy(); }\n")}setOutput(e){return super.setOutput(e),this.graphical&&this.extensions.STACKGL_resize_drawingbuffer&&this.extensions.STACKGL_resize_drawingbuffer.resize(this.maxTexSize[0],this.maxTexSize[1]),this}}}},{"../gl/kernel-string":12,"../web-gl/kernel":70,gl:2}],35:[function(e,t,n){t.exports={KernelValue:class{constructor(e,t){const{name:n,kernel:r,context:i,checkContext:s,onRequestContextHandle:a,onUpdateValueMismatch:o,origin:u,strictIntegers:l,type:h,tactic:c}=t;if(!n)throw new Error("name not set");if(!h)throw new Error("type not set");if(!u)throw new Error("origin not set");if("user"!==u&&"constants"!==u)throw new Error(`origin must be "user" or "constants" value is "${u}"`);if(!a)throw new Error("onRequestContextHandle is not set");this.name=n,this.origin=u,this.tactic=c,this.varName="constants"===u?`constants.${n}`:n,this.kernel=r,this.strictIntegers=l,this.type=e.type||h,this.size=e.size||null,this.index=null,this.context=i,this.checkContext=null==s||s,this.contextHandle=null,this.onRequestContextHandle=a,this.onUpdateValueMismatch=o,this.forceUploadEachRun=null}get id(){return`${this.origin}_${name}`}getSource(){throw new Error(`"getSource" not defined on ${this.constructor.name}`)}updateValue(e){throw new Error(`"updateValue" not defined on ${this.constructor.name}`)}}}},{}],36:[function(e,t,n){const{utils:r}=e("../utils"),{Input:i}=e("../input");t.exports={Kernel:class{static get isSupported(){throw new Error(`"isSupported" not implemented on ${this.name}`)}static isContextMatch(e){throw new Error(`"isContextMatch" not implemented on ${this.name}`)}static getFeatures(){throw new Error(`"getFeatures" not implemented on ${this.name}`)}static destroyContext(e){throw new Error(`"destroyContext" called on ${this.name}`)}static nativeFunctionArguments(){throw new Error(`"nativeFunctionArguments" called on ${this.name}`)}static nativeFunctionReturnType(){throw new Error(`"nativeFunctionReturnType" called on ${this.name}`)}static combineKernels(){throw new Error(`"combineKernels" called on ${this.name}`)}constructor(e,t){if("object"!=typeof e){if("string"!=typeof e)throw new Error("source not a string");if(!r.isFunctionString(e))throw new Error("source not a function string")}this.useLegacyEncoder=!1,this.fallbackRequested=!1,this.onRequestFallback=null,this.argumentNames="string"==typeof e?r.getArgumentNamesFromString(e):null,this.argumentTypes=null,this.argumentSizes=null,this.argumentBitRatios=null,this.kernelArguments=null,this.kernelConstants=null,this.forceUploadKernelConstants=null,this.source=e,this.output=null,this.debug=!1,this.graphical=!1,this.loopMaxIterations=0,this.constants=null,this.constantTypes=null,this.constantBitRatios=null,this.dynamicArguments=!1,this.dynamicOutput=!1,this.canvas=null,this.context=null,this.checkContext=null,this.gpu=null,this.functions=null,this.nativeFunctions=null,this.injectedNative=null,this.subKernels=null,this.validate=!0,this.immutable=!1,this.pipeline=!1,this.precision=null,this.tactic=null,this.plugins=null,this.returnType=null,this.leadingReturnStatement=null,this.followingReturnStatement=null,this.optimizeFloatMemory=null,this.strictIntegers=!1,this.fixIntegerDivisionAccuracy=null,this.built=!1,this.signature=null}mergeSettings(e){for(let t in e)if(e.hasOwnProperty(t)&&this.hasOwnProperty(t)){switch(t){case"output":if(!Array.isArray(e.output)){this.setOutput(e.output);continue}break;case"functions":this.functions=[];for(let t=0;te.name)):null,returnType:this.returnType}}}buildSignature(e){const t=this.constructor;this.signature=t.getSignature(this,t.getArgumentTypes(this,e))}static getArgumentTypes(e,t){const n=new Array(t.length);for(let i=0;it.argumentTypes[e]))||[]:t.argumentTypes||[],{name:r.getFunctionNameFromString(n)||null,source:n,argumentTypes:i,returnType:t.returnType||null}}onActivate(e){}}}},{"../input":110,"../utils":114}],37:[function(e,t,n){const r=`__HEADER__;\n__FLOAT_TACTIC_DECLARATION__;\n__INT_TACTIC_DECLARATION__;\n__SAMPLER_2D_TACTIC_DECLARATION__;\n\nconst int LOOP_MAX = __LOOP_MAX__;\n\n__PLUGINS__;\n__CONSTANTS__;\n\nvarying vec2 vTexCoord;\n\nfloat acosh(float x) {\n return log(x + sqrt(x * x - 1.0));\n}\n\nfloat sinh(float x) {\n return (pow(${Math.E}, x) - pow(${Math.E}, -x)) / 2.0;\n}\n\nfloat asinh(float x) {\n return log(x + sqrt(x * x + 1.0));\n}\n\nfloat atan2(float v1, float v2) {\n if (v1 == 0.0 || v2 == 0.0) return 0.0;\n return atan(v1 / v2);\n}\n\nfloat atanh(float x) {\n x = (x + 1.0) / (x - 1.0);\n if (x < 0.0) {\n return 0.5 * log(-x);\n }\n return 0.5 * log(x);\n}\n\nfloat cbrt(float x) {\n if (x >= 0.0) {\n return pow(x, 1.0 / 3.0);\n } else {\n return -pow(x, 1.0 / 3.0);\n }\n}\n\nfloat cosh(float x) {\n return (pow(${Math.E}, x) + pow(${Math.E}, -x)) / 2.0; \n}\n\nfloat expm1(float x) {\n return pow(${Math.E}, x) - 1.0; \n}\n\nfloat fround(highp float x) {\n return x;\n}\n\nfloat imul(float v1, float v2) {\n return float(int(v1) * int(v2));\n}\n\nfloat log10(float x) {\n return log2(x) * (1.0 / log2(10.0));\n}\n\nfloat log1p(float x) {\n return log(1.0 + x);\n}\n\nfloat _pow(float v1, float v2) {\n if (v2 == 0.0) return 1.0;\n return pow(v1, v2);\n}\n\nfloat tanh(float x) {\n float e = exp(2.0 * x);\n return (e - 1.0) / (e + 1.0);\n}\n\nfloat trunc(float x) {\n if (x >= 0.0) {\n return floor(x); \n } else {\n return ceil(x);\n }\n}\n\nvec4 _round(vec4 x) {\n return floor(x + 0.5);\n}\n\nfloat _round(float x) {\n return floor(x + 0.5);\n}\n\nconst int BIT_COUNT = 32;\nint modi(int x, int y) {\n return x - y * (x / y);\n}\n\nint bitwiseOr(int a, int b) {\n int result = 0;\n int n = 1;\n \n for (int i = 0; i < BIT_COUNT; i++) {\n if ((modi(a, 2) == 1) || (modi(b, 2) == 1)) {\n result += n;\n }\n a = a / 2;\n b = b / 2;\n n = n * 2;\n if(!(a > 0 || b > 0)) {\n break;\n }\n }\n return result;\n}\nint bitwiseXOR(int a, int b) {\n int result = 0;\n int n = 1;\n \n for (int i = 0; i < BIT_COUNT; i++) {\n if ((modi(a, 2) == 1) != (modi(b, 2) == 1)) {\n result += n;\n }\n a = a / 2;\n b = b / 2;\n n = n * 2;\n if(!(a > 0 || b > 0)) {\n break;\n }\n }\n return result;\n}\nint bitwiseAnd(int a, int b) {\n int result = 0;\n int n = 1;\n for (int i = 0; i < BIT_COUNT; i++) {\n if ((modi(a, 2) == 1) && (modi(b, 2) == 1)) {\n result += n;\n }\n a = a / 2;\n b = b / 2;\n n = n * 2;\n if(!(a > 0 && b > 0)) {\n break;\n }\n }\n return result;\n}\nint bitwiseNot(int a) {\n int result = 0;\n int n = 1;\n \n for (int i = 0; i < BIT_COUNT; i++) {\n if (modi(a, 2) == 0) {\n result += n; \n }\n a = a / 2;\n n = n * 2;\n }\n return result;\n}\nint bitwiseZeroFillLeftShift(int n, int shift) {\n int maxBytes = BIT_COUNT;\n for (int i = 0; i < BIT_COUNT; i++) {\n if (maxBytes >= n) {\n break;\n }\n maxBytes *= 2;\n }\n for (int i = 0; i < BIT_COUNT; i++) {\n if (i >= shift) {\n break;\n }\n n *= 2;\n }\n\n int result = 0;\n int byteVal = 1;\n for (int i = 0; i < BIT_COUNT; i++) {\n if (i >= maxBytes) break;\n if (modi(n, 2) > 0) { result += byteVal; }\n n = int(n / 2);\n byteVal *= 2;\n }\n return result;\n}\n\nint bitwiseSignedRightShift(int num, int shifts) {\n return int(floor(float(num) / pow(2.0, float(shifts))));\n}\n\nint bitwiseZeroFillRightShift(int n, int shift) {\n int maxBytes = BIT_COUNT;\n for (int i = 0; i < BIT_COUNT; i++) {\n if (maxBytes >= n) {\n break;\n }\n maxBytes *= 2;\n }\n for (int i = 0; i < BIT_COUNT; i++) {\n if (i >= shift) {\n break;\n }\n n /= 2;\n }\n int result = 0;\n int byteVal = 1;\n for (int i = 0; i < BIT_COUNT; i++) {\n if (i >= maxBytes) break;\n if (modi(n, 2) > 0) { result += byteVal; }\n n = int(n / 2);\n byteVal *= 2;\n }\n return result;\n}\n\nvec2 integerMod(vec2 x, float y) {\n vec2 res = floor(mod(x, y));\n return res * step(1.0 - floor(y), -res);\n}\n\nvec3 integerMod(vec3 x, float y) {\n vec3 res = floor(mod(x, y));\n return res * step(1.0 - floor(y), -res);\n}\n\nvec4 integerMod(vec4 x, vec4 y) {\n vec4 res = floor(mod(x, y));\n return res * step(1.0 - floor(y), -res);\n}\n\nfloat integerMod(float x, float y) {\n float res = floor(mod(x, y));\n return res * (res > floor(y) - 1.0 ? 0.0 : 1.0);\n}\n\nint integerMod(int x, int y) {\n return x - (y * int(x / y));\n}\n\n__DIVIDE_WITH_INTEGER_CHECK__;\n\n// Here be dragons!\n// DO NOT OPTIMIZE THIS CODE\n// YOU WILL BREAK SOMETHING ON SOMEBODY'S MACHINE\n// LEAVE IT AS IT IS, LEST YOU WASTE YOUR OWN TIME\nconst vec2 MAGIC_VEC = vec2(1.0, -256.0);\nconst vec4 SCALE_FACTOR = vec4(1.0, 256.0, 65536.0, 0.0);\nconst vec4 SCALE_FACTOR_INV = vec4(1.0, 0.00390625, 0.0000152587890625, 0.0); // 1, 1/256, 1/65536\nfloat decode32(vec4 texel) {\n __DECODE32_ENDIANNESS__;\n texel *= 255.0;\n vec2 gte128;\n gte128.x = texel.b >= 128.0 ? 1.0 : 0.0;\n gte128.y = texel.a >= 128.0 ? 1.0 : 0.0;\n float exponent = 2.0 * texel.a - 127.0 + dot(gte128, MAGIC_VEC);\n float res = exp2(_round(exponent));\n texel.b = texel.b - 128.0 * gte128.x;\n res = dot(texel, SCALE_FACTOR) * exp2(_round(exponent-23.0)) + res;\n res *= gte128.y * -2.0 + 1.0;\n return res;\n}\n\nfloat decode16(vec4 texel, int index) {\n int channel = integerMod(index, 2);\n if (channel == 0) return texel.r * 255.0 + texel.g * 65280.0;\n if (channel == 1) return texel.b * 255.0 + texel.a * 65280.0;\n return 0.0;\n}\n\nfloat decode8(vec4 texel, int index) {\n int channel = integerMod(index, 4);\n if (channel == 0) return texel.r * 255.0;\n if (channel == 1) return texel.g * 255.0;\n if (channel == 2) return texel.b * 255.0;\n if (channel == 3) return texel.a * 255.0;\n return 0.0;\n}\n\nvec4 legacyEncode32(float f) {\n float F = abs(f);\n float sign = f < 0.0 ? 1.0 : 0.0;\n float exponent = floor(log2(F));\n float mantissa = (exp2(-exponent) * F);\n // exponent += floor(log2(mantissa));\n vec4 texel = vec4(F * exp2(23.0-exponent)) * SCALE_FACTOR_INV;\n texel.rg = integerMod(texel.rg, 256.0);\n texel.b = integerMod(texel.b, 128.0);\n texel.a = exponent*0.5 + 63.5;\n texel.ba += vec2(integerMod(exponent+127.0, 2.0), sign) * 128.0;\n texel = floor(texel);\n texel *= 0.003921569; // 1/255\n __ENCODE32_ENDIANNESS__;\n return texel;\n}\n\n// https://github.com/gpujs/gpu.js/wiki/Encoder-details\nvec4 encode32(float value) {\n if (value == 0.0) return vec4(0, 0, 0, 0);\n\n float exponent;\n float mantissa;\n vec4 result;\n float sgn;\n\n sgn = step(0.0, -value);\n value = abs(value);\n\n exponent = floor(log2(value));\n\n mantissa = value*pow(2.0, -exponent)-1.0;\n exponent = exponent+127.0;\n result = vec4(0,0,0,0);\n\n result.a = floor(exponent/2.0);\n exponent = exponent - result.a*2.0;\n result.a = result.a + 128.0*sgn;\n\n result.b = floor(mantissa * 128.0);\n mantissa = mantissa - result.b / 128.0;\n result.b = result.b + exponent*128.0;\n\n result.g = floor(mantissa*32768.0);\n mantissa = mantissa - result.g/32768.0;\n\n result.r = floor(mantissa*8388608.0);\n return result/255.0;\n}\n// Dragons end here\n\nint index;\nivec3 threadId;\n\nivec3 indexTo3D(int idx, ivec3 texDim) {\n int z = int(idx / (texDim.x * texDim.y));\n idx -= z * int(texDim.x * texDim.y);\n int y = int(idx / texDim.x);\n int x = int(integerMod(idx, texDim.x));\n return ivec3(x, y, z);\n}\n\nfloat get32(sampler2D tex, ivec2 texSize, ivec3 texDim, int z, int y, int x) {\n int index = x + texDim.x * (y + texDim.y * z);\n int w = texSize.x;\n vec2 st = vec2(float(integerMod(index, w)), float(index / w)) + 0.5;\n vec4 texel = texture2D(tex, st / vec2(texSize));\n return decode32(texel);\n}\n\nfloat get16(sampler2D tex, ivec2 texSize, ivec3 texDim, int z, int y, int x) {\n int index = x + texDim.x * (y + texDim.y * z);\n int w = texSize.x * 2;\n vec2 st = vec2(float(integerMod(index, w)), float(index / w)) + 0.5;\n vec4 texel = texture2D(tex, st / vec2(texSize.x * 2, texSize.y));\n return decode16(texel, index);\n}\n\nfloat get8(sampler2D tex, ivec2 texSize, ivec3 texDim, int z, int y, int x) {\n int index = x + texDim.x * (y + texDim.y * z);\n int w = texSize.x * 4;\n vec2 st = vec2(float(integerMod(index, w)), float(index / w)) + 0.5;\n vec4 texel = texture2D(tex, st / vec2(texSize.x * 4, texSize.y));\n return decode8(texel, index);\n}\n\nfloat getMemoryOptimized32(sampler2D tex, ivec2 texSize, ivec3 texDim, int z, int y, int x) {\n int index = x + texDim.x * (y + texDim.y * z);\n int channel = integerMod(index, 4);\n index = index / 4;\n int w = texSize.x;\n vec2 st = vec2(float(integerMod(index, w)), float(index / w)) + 0.5;\n vec4 texel = texture2D(tex, st / vec2(texSize));\n if (channel == 0) return texel.r;\n if (channel == 1) return texel.g;\n if (channel == 2) return texel.b;\n if (channel == 3) return texel.a;\n return 0.0;\n}\n\nvec4 getImage2D(sampler2D tex, ivec2 texSize, ivec3 texDim, int z, int y, int x) {\n int index = x + texDim.x * (y + texDim.y * z);\n int w = texSize.x;\n vec2 st = vec2(float(integerMod(index, w)), float(index / w)) + 0.5;\n return texture2D(tex, st / vec2(texSize));\n}\n\nfloat getFloatFromSampler2D(sampler2D tex, ivec2 texSize, ivec3 texDim, int z, int y, int x) {\n vec4 result = getImage2D(tex, texSize, texDim, z, y, x);\n return result[0];\n}\n\nvec2 getVec2FromSampler2D(sampler2D tex, ivec2 texSize, ivec3 texDim, int z, int y, int x) {\n vec4 result = getImage2D(tex, texSize, texDim, z, y, x);\n return vec2(result[0], result[1]);\n}\n\nvec2 getMemoryOptimizedVec2(sampler2D tex, ivec2 texSize, ivec3 texDim, int z, int y, int x) {\n int index = x + (texDim.x * (y + (texDim.y * z)));\n int channel = integerMod(index, 2);\n index = index / 2;\n int w = texSize.x;\n vec2 st = vec2(float(integerMod(index, w)), float(index / w)) + 0.5;\n vec4 texel = texture2D(tex, st / vec2(texSize));\n if (channel == 0) return vec2(texel.r, texel.g);\n if (channel == 1) return vec2(texel.b, texel.a);\n return vec2(0.0, 0.0);\n}\n\nvec3 getVec3FromSampler2D(sampler2D tex, ivec2 texSize, ivec3 texDim, int z, int y, int x) {\n vec4 result = getImage2D(tex, texSize, texDim, z, y, x);\n return vec3(result[0], result[1], result[2]);\n}\n\nvec3 getMemoryOptimizedVec3(sampler2D tex, ivec2 texSize, ivec3 texDim, int z, int y, int x) {\n int fieldIndex = 3 * (x + texDim.x * (y + texDim.y * z));\n int vectorIndex = fieldIndex / 4;\n int vectorOffset = fieldIndex - vectorIndex * 4;\n int readY = vectorIndex / texSize.x;\n int readX = vectorIndex - readY * texSize.x;\n vec4 tex1 = texture2D(tex, (vec2(readX, readY) + 0.5) / vec2(texSize));\n \n if (vectorOffset == 0) {\n return tex1.xyz;\n } else if (vectorOffset == 1) {\n return tex1.yzw;\n } else {\n readX++;\n if (readX >= texSize.x) {\n readX = 0;\n readY++;\n }\n vec4 tex2 = texture2D(tex, vec2(readX, readY) / vec2(texSize));\n if (vectorOffset == 2) {\n return vec3(tex1.z, tex1.w, tex2.x);\n } else {\n return vec3(tex1.w, tex2.x, tex2.y);\n }\n }\n}\n\nvec4 getVec4FromSampler2D(sampler2D tex, ivec2 texSize, ivec3 texDim, int z, int y, int x) {\n return getImage2D(tex, texSize, texDim, z, y, x);\n}\n\nvec4 getMemoryOptimizedVec4(sampler2D tex, ivec2 texSize, ivec3 texDim, int z, int y, int x) {\n int index = x + texDim.x * (y + texDim.y * z);\n int channel = integerMod(index, 2);\n int w = texSize.x;\n vec2 st = vec2(float(integerMod(index, w)), float(index / w)) + 0.5;\n vec4 texel = texture2D(tex, st / vec2(texSize));\n return vec4(texel.r, texel.g, texel.b, texel.a);\n}\n\nvec4 actualColor;\nvoid color(float r, float g, float b, float a) {\n actualColor = vec4(r,g,b,a);\n}\n\nvoid color(float r, float g, float b) {\n color(r,g,b,1.0);\n}\n\nvoid color(sampler2D image) {\n actualColor = texture2D(image, vTexCoord);\n}\n\nfloat modulo(float number, float divisor) {\n if (number < 0.0) {\n number = abs(number);\n if (divisor < 0.0) {\n divisor = abs(divisor);\n }\n return -mod(number, divisor);\n }\n if (divisor < 0.0) {\n divisor = abs(divisor);\n }\n return mod(number, divisor);\n}\n\n__INJECTED_NATIVE__;\n__MAIN_CONSTANTS__;\n__MAIN_ARGUMENTS__;\n__KERNEL__;\n\nvoid main(void) {\n index = int(vTexCoord.s * float(uTexSize.x)) + int(vTexCoord.t * float(uTexSize.y)) * uTexSize.x;\n __MAIN_RESULT__;\n}`;t.exports={fragmentShader:r}},{}],38:[function(e,t,n){const{utils:r}=e("../../utils"),{FunctionNode:i}=e("../function-node");const s={Array:"sampler2D","Array(2)":"vec2","Array(3)":"vec3","Array(4)":"vec4","Matrix(2)":"mat2","Matrix(3)":"mat3","Matrix(4)":"mat4",Array2D:"sampler2D",Array3D:"sampler2D",Boolean:"bool",Float:"float",Input:"sampler2D",Integer:"int",Number:"float",LiteralInteger:"float",NumberTexture:"sampler2D",MemoryOptimizedNumberTexture:"sampler2D","ArrayTexture(1)":"sampler2D","ArrayTexture(2)":"sampler2D","ArrayTexture(3)":"sampler2D","ArrayTexture(4)":"sampler2D",HTMLVideo:"sampler2D",HTMLCanvas:"sampler2D",OffscreenCanvas:"sampler2D",HTMLImage:"sampler2D",ImageBitmap:"sampler2D",ImageData:"sampler2D",HTMLImageArray:"sampler2DArray"},a={"===":"==","!==":"!="};t.exports={WebGLFunctionNode:class extends i{constructor(e,t){super(e,t),t&&t.hasOwnProperty("fixIntegerDivisionAccuracy")&&(this.fixIntegerDivisionAccuracy=t.fixIntegerDivisionAccuracy)}astConditionalExpression(e,t){if("ConditionalExpression"!==e.type)throw this.astErrorOutput("Not a conditional expression",e);const n=this.getType(e.consequent),r=this.getType(e.alternate);return null===n&&null===r?(t.push("if ("),this.astGeneric(e.test,t),t.push(") {"),this.astGeneric(e.consequent,t),t.push(";"),t.push("} else {"),this.astGeneric(e.alternate,t),t.push(";"),t.push("}"),t):(t.push("("),this.astGeneric(e.test,t),t.push("?"),this.astGeneric(e.consequent,t),t.push(":"),this.astGeneric(e.alternate,t),t.push(")"),t)}astFunction(e,t){if(this.isRootKernel)t.push("void");else{if(!this.returnType){this.findLastReturn()&&(this.returnType=this.getType(e.body),"LiteralInteger"===this.returnType&&(this.returnType="Number"))}const{returnType:n}=this;if(n){const e=s[n];if(!e)throw new Error(`unknown type ${n}`);t.push(e)}else t.push("void")}if(t.push(" "),t.push(this.name),t.push("("),!this.isRootKernel)for(let n=0;n0&&t.push(", ");let a=this.argumentTypes[this.argumentNames.indexOf(i)];if(!a)throw this.astErrorOutput(`Unknown argument ${i} type`,e);"LiteralInteger"===a&&(this.argumentTypes[n]=a="Number");const o=s[a];if(!o)throw this.astErrorOutput("Unexpected expression",e);const u=r.sanitizeName(i);"sampler2D"===o||"sampler2DArray"===o?t.push(`${o} user_${u},ivec2 user_${u}Size,ivec3 user_${u}Dim`):t.push(`${o} user_${u}`)}t.push(") {\n");for(let n=0;n"===e.operator||"<"===e.operator&&"Literal"===e.right.type)&&!Number.isInteger(e.right.value)){this.pushState("building-float"),this.castValueToFloat(e.left,t),t.push(a[e.operator]||e.operator),this.astGeneric(e.right,t),this.popState("building-float");break}if(this.pushState("building-integer"),this.astGeneric(e.left,t),t.push(a[e.operator]||e.operator),this.pushState("casting-to-integer"),"Literal"===e.right.type){const n=[];this.astGeneric(e.right,n);if("Integer"!==this.getType(e.right))throw this.astErrorOutput("Unhandled binary expression with literal",e);t.push(n.join(""))}else t.push("int("),this.astGeneric(e.right,t),t.push(")");this.popState("casting-to-integer"),this.popState("building-integer");break;case"Integer & LiteralInteger":this.pushState("building-integer"),this.astGeneric(e.left,t),t.push(a[e.operator]||e.operator),this.castLiteralToInteger(e.right,t),this.popState("building-integer");break;case"Number & Integer":case"Float & Integer":this.pushState("building-float"),this.astGeneric(e.left,t),t.push(a[e.operator]||e.operator),this.castValueToFloat(e.right,t),this.popState("building-float");break;case"Float & LiteralInteger":case"Number & LiteralInteger":this.pushState("building-float"),this.astGeneric(e.left,t),t.push(a[e.operator]||e.operator),this.castLiteralToFloat(e.right,t),this.popState("building-float");break;case"LiteralInteger & Float":case"LiteralInteger & Number":this.isState("casting-to-integer")?(this.pushState("building-integer"),this.castLiteralToInteger(e.left,t),t.push(a[e.operator]||e.operator),this.castValueToInteger(e.right,t),this.popState("building-integer")):(this.pushState("building-float"),this.astGeneric(e.left,t),t.push(a[e.operator]||e.operator),this.pushState("casting-to-float"),this.astGeneric(e.right,t),this.popState("casting-to-float"),this.popState("building-float"));break;case"LiteralInteger & Integer":this.pushState("building-integer"),this.castLiteralToInteger(e.left,t),t.push(a[e.operator]||e.operator),this.astGeneric(e.right,t),this.popState("building-integer");break;case"Boolean & Boolean":this.pushState("building-boolean"),this.astGeneric(e.left,t),t.push(a[e.operator]||e.operator),this.astGeneric(e.right,t),this.popState("building-boolean");break;default:throw this.astErrorOutput(`Unhandled binary expression between ${i}`,e)}return t.push(")"),t}checkAndUpconvertOperator(e,t){const n=this.checkAndUpconvertBitwiseOperators(e,t);if(n)return n;const r={"%":this.fixIntegerDivisionAccuracy?"integerCorrectionModulo":"modulo","**":"pow"}[e.operator];if(!r)return null;switch(t.push(r),t.push("("),this.getType(e.left)){case"Integer":this.castValueToFloat(e.left,t);break;case"LiteralInteger":this.castLiteralToFloat(e.left,t);break;default:this.astGeneric(e.left,t)}switch(t.push(","),this.getType(e.right)){case"Integer":this.castValueToFloat(e.right,t);break;case"LiteralInteger":this.castLiteralToFloat(e.right,t);break;default:this.astGeneric(e.right,t)}return t.push(")"),t}checkAndUpconvertBitwiseOperators(e,t){const n={"&":"bitwiseAnd","|":"bitwiseOr","^":"bitwiseXOR","<<":"bitwiseZeroFillLeftShift",">>":"bitwiseSignedRightShift",">>>":"bitwiseZeroFillRightShift"}[e.operator];if(!n)return null;t.push(n),t.push("(");switch(this.getType(e.left)){case"Number":case"Float":this.castValueToInteger(e.left,t);break;case"LiteralInteger":this.castLiteralToInteger(e.left,t);break;default:this.astGeneric(e.left,t)}t.push(",");switch(this.getType(e.right)){case"Number":case"Float":this.castValueToInteger(e.right,t);break;case"LiteralInteger":this.castLiteralToInteger(e.right,t);break;default:this.astGeneric(e.right,t)}return t.push(")"),t}checkAndUpconvertBitwiseUnary(e,t){const n={"~":"bitwiseNot"}[e.operator];if(!n)return null;switch(t.push(n),t.push("("),this.getType(e.argument)){case"Number":case"Float":this.castValueToInteger(e.argument,t);break;case"LiteralInteger":this.castLiteralToInteger(e.argument,t);break;default:this.astGeneric(e.argument,t)}return t.push(")"),t}castLiteralToInteger(e,t){return this.pushState("casting-to-integer"),this.astGeneric(e,t),this.popState("casting-to-integer"),t}castLiteralToFloat(e,t){return this.pushState("casting-to-float"),this.astGeneric(e,t),this.popState("casting-to-float"),t}castValueToInteger(e,t){return this.pushState("casting-to-integer"),t.push("int("),this.astGeneric(e,t),t.push(")"),this.popState("casting-to-integer"),t}castValueToFloat(e,t){return this.pushState("casting-to-float"),t.push("float("),this.astGeneric(e,t),t.push(")"),this.popState("casting-to-float"),t}astIdentifierExpression(e,t){if("Identifier"!==e.type)throw this.astErrorOutput("IdentifierExpression - not an Identifier",e);const n=this.getType(e),i=r.sanitizeName(e.name);return"Infinity"===e.name?t.push("3.402823466e+38"):"Boolean"===n&&this.argumentNames.indexOf(i)>-1?t.push(`bool(user_${i})`):t.push(`user_${i}`),t}astForStatement(e,t){if("ForStatement"!==e.type)throw this.astErrorOutput("Invalid for statement",e);const n=[],r=[],i=[],s=[];let a=null;if(e.init){const{declarations:t}=e.init;t.length>1&&(a=!1),this.astGeneric(e.init,n);for(let e=0;e0&&t.push(n.join(""),"\n"),t.push(`for (int ${e}=0;${e}0&&t.push(`if (!${r.join("")}) break;\n`),t.push(s.join("")),t.push(`\n${i.join("")};`),t.push("}\n")}return t}astWhileStatement(e,t){if("WhileStatement"!==e.type)throw this.astErrorOutput("Invalid while statement",e);const n=this.getInternalVariableName("safeI");return t.push(`for (int ${n}=0;${n}0&&o.push(u.join(",")),i.push(o.join(";")),t.push(i.join("")),t.push(";"),t}astIfStatement(e,t){return t.push("if ("),this.astGeneric(e.test,t),t.push(")"),"BlockStatement"===e.consequent.type?this.astGeneric(e.consequent,t):(t.push(" {\n"),this.astGeneric(e.consequent,t),t.push("\n}\n")),e.alternate&&(t.push("else "),"BlockStatement"===e.alternate.type||"IfStatement"===e.alternate.type?this.astGeneric(e.alternate,t):(t.push(" {\n"),this.astGeneric(e.alternate,t),t.push("\n}\n"))),t}astSwitchStatement(e,t){if("SwitchStatement"!==e.type)throw this.astErrorOutput("Invalid switch statement",e);const{discriminant:n,cases:r}=e,i=this.getType(n),s=`switchDiscriminant${this.astKey(e,"_")}`;switch(i){case"Float":case"Number":t.push(`float ${s} = `),this.astGeneric(n,t),t.push(";\n");break;case"Integer":t.push(`int ${s} = `),this.astGeneric(n,t),t.push(";\n")}if(1===r.length&&!r[0].test)return this.astGeneric(r[0].consequent,t),t;let a=!1,o=[],u=!1,l=!1;for(let e=0;ee+1){u=!0,this.astGeneric(r[e].consequent,o);continue}t.push(" else {\n")}this.astGeneric(r[e].consequent,t),t.push("\n}")}return u&&(t.push(" else {"),t.push(o.join("")),t.push("}")),t}astThisExpression(e,t){return t.push("this"),t}astMemberExpression(e,t){const{property:n,name:i,signature:s,origin:a,type:o,xProperty:u,yProperty:l,zProperty:h}=this.getMemberExpressionDetails(e);switch(s){case"value.thread.value":case"this.thread.value":if("x"!==i&&"y"!==i&&"z"!==i)throw this.astErrorOutput("Unexpected expression, expected `this.thread.x`, `this.thread.y`, or `this.thread.z`",e);return t.push(`threadId.${i}`),t;case"this.output.value":if(this.dynamicOutput)switch(i){case"x":this.isState("casting-to-float")?t.push("float(uOutputDim.x)"):t.push("uOutputDim.x");break;case"y":this.isState("casting-to-float")?t.push("float(uOutputDim.y)"):t.push("uOutputDim.y");break;case"z":this.isState("casting-to-float")?t.push("float(uOutputDim.z)"):t.push("uOutputDim.z");break;default:throw this.astErrorOutput("Unexpected expression",e)}else switch(i){case"x":this.isState("casting-to-integer")?t.push(this.output[0]):t.push(this.output[0],".0");break;case"y":this.isState("casting-to-integer")?t.push(this.output[1]):t.push(this.output[1],".0");break;case"z":this.isState("casting-to-integer")?t.push(this.output[2]):t.push(this.output[2],".0");break;default:throw this.astErrorOutput("Unexpected expression",e)}return t;case"value":throw this.astErrorOutput("Unexpected expression",e);case"value[]":case"value[][]":case"value[][][]":case"value[][][][]":case"value.value":if("Math"===a)return t.push(Math[i]),t;const s=r.sanitizeName(i);switch(n){case"r":return t.push(`user_${s}.r`),t;case"g":return t.push(`user_${s}.g`),t;case"b":return t.push(`user_${s}.b`),t;case"a":return t.push(`user_${s}.a`),t}break;case"this.constants.value":if(void 0===u)switch(o){case"Array(2)":case"Array(3)":case"Array(4)":return t.push(`constants_${r.sanitizeName(i)}`),t}case"this.constants.value[]":case"this.constants.value[][]":case"this.constants.value[][][]":case"this.constants.value[][][][]":break;case"fn()[]":return this.astCallExpression(e.object,t),t.push("["),t.push(this.memberExpressionPropertyMarkup(n)),t.push("]"),t;case"fn()[][]":return this.astCallExpression(e.object.object,t),t.push("["),t.push(this.memberExpressionPropertyMarkup(e.object.property)),t.push("]"),t.push("["),t.push(this.memberExpressionPropertyMarkup(e.property)),t.push("]"),t;case"[][]":return this.astArrayExpression(e.object,t),t.push("["),t.push(this.memberExpressionPropertyMarkup(n)),t.push("]"),t;default:throw this.astErrorOutput("Unexpected expression",e)}if(!1===e.computed)switch(o){case"Number":case"Integer":case"Float":case"Boolean":return t.push(`${a}_${r.sanitizeName(i)}`),t}const c=`${a}_${r.sanitizeName(i)}`;switch(o){case"Array(2)":case"Array(3)":case"Array(4)":this.astGeneric(e.object,t),t.push("["),t.push(this.memberExpressionPropertyMarkup(u)),t.push("]");break;case"HTMLImageArray":t.push(`getImage3D(${c}, ${c}Size, ${c}Dim, `),this.memberExpressionXYZ(u,l,h,t),t.push(")");break;case"ArrayTexture(1)":t.push(`getFloatFromSampler2D(${c}, ${c}Size, ${c}Dim, `),this.memberExpressionXYZ(u,l,h,t),t.push(")");break;case"Array1D(2)":case"Array2D(2)":case"Array3D(2)":t.push(`getMemoryOptimizedVec2(${c}, ${c}Size, ${c}Dim, `),this.memberExpressionXYZ(u,l,h,t),t.push(")");break;case"ArrayTexture(2)":t.push(`getVec2FromSampler2D(${c}, ${c}Size, ${c}Dim, `),this.memberExpressionXYZ(u,l,h,t),t.push(")");break;case"Array1D(3)":case"Array2D(3)":case"Array3D(3)":t.push(`getMemoryOptimizedVec3(${c}, ${c}Size, ${c}Dim, `),this.memberExpressionXYZ(u,l,h,t),t.push(")");break;case"ArrayTexture(3)":t.push(`getVec3FromSampler2D(${c}, ${c}Size, ${c}Dim, `),this.memberExpressionXYZ(u,l,h,t),t.push(")");break;case"Array1D(4)":case"Array2D(4)":case"Array3D(4)":t.push(`getMemoryOptimizedVec4(${c}, ${c}Size, ${c}Dim, `),this.memberExpressionXYZ(u,l,h,t),t.push(")");break;case"ArrayTexture(4)":case"HTMLCanvas":case"OffscreenCanvas":case"HTMLImage":case"ImageBitmap":case"ImageData":case"HTMLVideo":t.push(`getVec4FromSampler2D(${c}, ${c}Size, ${c}Dim, `),this.memberExpressionXYZ(u,l,h,t),t.push(")");break;case"NumberTexture":case"Array":case"Array2D":case"Array3D":case"Array4D":case"Input":case"Number":case"Float":case"Integer":if("single"===this.precision)t.push(`getMemoryOptimized32(${c}, ${c}Size, ${c}Dim, `),this.memberExpressionXYZ(u,l,h,t),t.push(")");else{const e="user"===a?this.lookupFunctionArgumentBitRatio(this.name,i):this.constantBitRatios[i];switch(e){case 1:t.push(`get8(${c}, ${c}Size, ${c}Dim, `);break;case 2:t.push(`get16(${c}, ${c}Size, ${c}Dim, `);break;case 4:case 0:t.push(`get32(${c}, ${c}Size, ${c}Dim, `);break;default:throw new Error(`unhandled bit ratio of ${e}`)}this.memberExpressionXYZ(u,l,h,t),t.push(")")}break;case"MemoryOptimizedNumberTexture":t.push(`getMemoryOptimized32(${c}, ${c}Size, ${c}Dim, `),this.memberExpressionXYZ(u,l,h,t),t.push(")");break;case"Matrix(2)":case"Matrix(3)":case"Matrix(4)":t.push(`${c}[${this.memberExpressionPropertyMarkup(l)}]`),l&&t.push(`[${this.memberExpressionPropertyMarkup(u)}]`);break;default:throw new Error(`unhandled member expression "${o}"`)}return t}astCallExpression(e,t){if(!e.callee)throw this.astErrorOutput("Unknown CallExpression",e);let n=null;const i=this.isAstMathFunction(e);if(n=i||e.callee.object&&"ThisExpression"===e.callee.object.type?e.callee.property.name:"SequenceExpression"!==e.callee.type||"Literal"!==e.callee.expressions[0].type||isNaN(e.callee.expressions[0].raw)?e.callee.name:e.callee.expressions[1].property.name,!n)throw this.astErrorOutput("Unhandled function, couldn't find name",e);switch(n){case"pow":n="_pow";break;case"round":n="_round"}if(this.calledFunctions.indexOf(n)<0&&this.calledFunctions.push(n),"random"===n&&this.plugins&&this.plugins.length>0)for(let e=0;e0&&t.push(", "),"Integer"===i)this.castValueToFloat(r,t);else this.astGeneric(r,t)}else{const i=this.lookupFunctionArgumentTypes(n)||[];for(let s=0;s0&&t.push(", ");const u=this.getType(a);switch(o||(this.triggerImplyArgumentType(n,s,u,this),o=u),u){case"Boolean":this.astGeneric(a,t);continue;case"Number":case"Float":if("Integer"===o){t.push("int("),this.astGeneric(a,t),t.push(")");continue}if("Number"===o||"Float"===o){this.astGeneric(a,t);continue}if("LiteralInteger"===o){this.castLiteralToFloat(a,t);continue}break;case"Integer":if("Number"===o||"Float"===o){t.push("float("),this.astGeneric(a,t),t.push(")");continue}if("Integer"===o){this.astGeneric(a,t);continue}break;case"LiteralInteger":if("Integer"===o){this.castLiteralToInteger(a,t);continue}if("Number"===o||"Float"===o){this.castLiteralToFloat(a,t);continue}if("LiteralInteger"===o){this.astGeneric(a,t);continue}break;case"Array(2)":case"Array(3)":case"Array(4)":if(o===u){if("Identifier"===a.type)t.push(`user_${r.sanitizeName(a.name)}`);else{if("ArrayExpression"!==a.type&&"MemberExpression"!==a.type&&"CallExpression"!==a.type)throw this.astErrorOutput(`Unhandled argument type ${a.type}`,e);this.astGeneric(a,t)}continue}break;case"HTMLCanvas":case"OffscreenCanvas":case"HTMLImage":case"ImageBitmap":case"ImageData":case"HTMLImageArray":case"HTMLVideo":case"ArrayTexture(1)":case"ArrayTexture(2)":case"ArrayTexture(3)":case"ArrayTexture(4)":case"Array":case"Input":if(o===u){if("Identifier"!==a.type)throw this.astErrorOutput(`Unhandled argument type ${a.type}`,e);this.triggerImplyArgumentBitRatio(this.name,a.name,n,s);const i=r.sanitizeName(a.name);t.push(`user_${i},user_${i}Size,user_${i}Dim`);continue}}throw this.astErrorOutput(`Unhandled argument combination of ${u} and ${o} for argument named "${a.name}"`,e)}}return t.push(")"),t}astArrayExpression(e,t){const n=this.getType(e),r=e.elements.length;switch(n){case"Matrix(2)":case"Matrix(3)":case"Matrix(4)":t.push(`mat${r}(`);break;default:t.push(`vec${r}(`)}for(let n=0;n0&&t.push(", ");const r=e.elements[n];this.astGeneric(r,t)}return t.push(")"),t}memberExpressionXYZ(e,t,n,r){return n?r.push(this.memberExpressionPropertyMarkup(n),", "):r.push("0, "),t?r.push(this.memberExpressionPropertyMarkup(t),", "):r.push("0, "),r.push(this.memberExpressionPropertyMarkup(e)),r}memberExpressionPropertyMarkup(e){if(!e)throw new Error("Property not set");const t=[];switch(this.getType(e)){case"Number":case"Float":this.castValueToInteger(e,t);break;case"LiteralInteger":this.castLiteralToInteger(e,t);break;default:this.astGeneric(e,t)}return t.join("")}}}},{"../../utils":114,"../function-node":10}],39:[function(e,t,n){const{WebGLKernelValueBoolean:r}=e("./kernel-value/boolean"),{WebGLKernelValueFloat:i}=e("./kernel-value/float"),{WebGLKernelValueInteger:s}=e("./kernel-value/integer"),{WebGLKernelValueHTMLImage:a}=e("./kernel-value/html-image"),{WebGLKernelValueDynamicHTMLImage:o}=e("./kernel-value/dynamic-html-image"),{WebGLKernelValueHTMLVideo:u}=e("./kernel-value/html-video"),{WebGLKernelValueDynamicHTMLVideo:l}=e("./kernel-value/dynamic-html-video"),{WebGLKernelValueSingleInput:h}=e("./kernel-value/single-input"),{WebGLKernelValueDynamicSingleInput:c}=e("./kernel-value/dynamic-single-input"),{WebGLKernelValueUnsignedInput:p}=e("./kernel-value/unsigned-input"),{WebGLKernelValueDynamicUnsignedInput:d}=e("./kernel-value/dynamic-unsigned-input"),{WebGLKernelValueMemoryOptimizedNumberTexture:m}=e("./kernel-value/memory-optimized-number-texture"),{WebGLKernelValueDynamicMemoryOptimizedNumberTexture:f}=e("./kernel-value/dynamic-memory-optimized-number-texture"),{WebGLKernelValueNumberTexture:g}=e("./kernel-value/number-texture"),{WebGLKernelValueDynamicNumberTexture:x}=e("./kernel-value/dynamic-number-texture"),{WebGLKernelValueSingleArray:y}=e("./kernel-value/single-array"),{WebGLKernelValueDynamicSingleArray:b}=e("./kernel-value/dynamic-single-array"),{WebGLKernelValueSingleArray1DI:T}=e("./kernel-value/single-array1d-i"),{WebGLKernelValueDynamicSingleArray1DI:v}=e("./kernel-value/dynamic-single-array1d-i"),{WebGLKernelValueSingleArray2DI:S}=e("./kernel-value/single-array2d-i"),{WebGLKernelValueDynamicSingleArray2DI:A}=e("./kernel-value/dynamic-single-array2d-i"),{WebGLKernelValueSingleArray3DI:_}=e("./kernel-value/single-array3d-i"),{WebGLKernelValueDynamicSingleArray3DI:E}=e("./kernel-value/dynamic-single-array3d-i"),{WebGLKernelValueArray2:w}=e("./kernel-value/array2"),{WebGLKernelValueArray3:k}=e("./kernel-value/array3"),{WebGLKernelValueArray4:I}=e("./kernel-value/array4"),{WebGLKernelValueUnsignedArray:D}=e("./kernel-value/unsigned-array"),{WebGLKernelValueDynamicUnsignedArray:C}=e("./kernel-value/dynamic-unsigned-array"),$={unsigned:{dynamic:{Boolean:r,Integer:s,Float:i,Array:C,"Array(2)":w,"Array(3)":k,"Array(4)":I,"Array1D(2)":!1,"Array1D(3)":!1,"Array1D(4)":!1,"Array2D(2)":!1,"Array2D(3)":!1,"Array2D(4)":!1,"Array3D(2)":!1,"Array3D(3)":!1,"Array3D(4)":!1,Input:d,NumberTexture:x,"ArrayTexture(1)":x,"ArrayTexture(2)":x,"ArrayTexture(3)":x,"ArrayTexture(4)":x,MemoryOptimizedNumberTexture:f,HTMLCanvas:o,OffscreenCanvas:o,HTMLImage:o,ImageBitmap:o,ImageData:o,HTMLImageArray:!1,HTMLVideo:l},static:{Boolean:r,Float:i,Integer:s,Array:D,"Array(2)":w,"Array(3)":k,"Array(4)":I,"Array1D(2)":!1,"Array1D(3)":!1,"Array1D(4)":!1,"Array2D(2)":!1,"Array2D(3)":!1,"Array2D(4)":!1,"Array3D(2)":!1,"Array3D(3)":!1,"Array3D(4)":!1,Input:p,NumberTexture:g,"ArrayTexture(1)":g,"ArrayTexture(2)":g,"ArrayTexture(3)":g,"ArrayTexture(4)":g,MemoryOptimizedNumberTexture:m,HTMLCanvas:a,OffscreenCanvas:a,HTMLImage:a,ImageBitmap:a,ImageData:a,HTMLImageArray:!1,HTMLVideo:u}},single:{dynamic:{Boolean:r,Integer:s,Float:i,Array:b,"Array(2)":w,"Array(3)":k,"Array(4)":I,"Array1D(2)":v,"Array1D(3)":v,"Array1D(4)":v,"Array2D(2)":A,"Array2D(3)":A,"Array2D(4)":A,"Array3D(2)":E,"Array3D(3)":E,"Array3D(4)":E,Input:c,NumberTexture:x,"ArrayTexture(1)":x,"ArrayTexture(2)":x,"ArrayTexture(3)":x,"ArrayTexture(4)":x,MemoryOptimizedNumberTexture:f,HTMLCanvas:o,OffscreenCanvas:o,HTMLImage:o,ImageBitmap:o,ImageData:o,HTMLImageArray:!1,HTMLVideo:l},static:{Boolean:r,Float:i,Integer:s,Array:y,"Array(2)":w,"Array(3)":k,"Array(4)":I,"Array1D(2)":T,"Array1D(3)":T,"Array1D(4)":T,"Array2D(2)":S,"Array2D(3)":S,"Array2D(4)":S,"Array3D(2)":_,"Array3D(3)":_,"Array3D(4)":_,Input:h,NumberTexture:g,"ArrayTexture(1)":g,"ArrayTexture(2)":g,"ArrayTexture(3)":g,"ArrayTexture(4)":g,MemoryOptimizedNumberTexture:m,HTMLCanvas:a,OffscreenCanvas:a,HTMLImage:a,ImageBitmap:a,ImageData:a,HTMLImageArray:!1,HTMLVideo:u}}};t.exports={lookupKernelValueType:function(e,t,n,r){if(!e)throw new Error("type missing");if(!t)throw new Error("dynamic missing");if(!n)throw new Error("precision missing");r.type&&(e=r.type);const i=$[n][t];if(!1===i[e])return null;if(void 0===i[e])throw new Error(`Could not find a KernelValue for ${e}`);return i[e]},kernelValueMaps:$}},{"./kernel-value/array2":41,"./kernel-value/array3":42,"./kernel-value/array4":43,"./kernel-value/boolean":44,"./kernel-value/dynamic-html-image":45,"./kernel-value/dynamic-html-video":46,"./kernel-value/dynamic-memory-optimized-number-texture":47,"./kernel-value/dynamic-number-texture":48,"./kernel-value/dynamic-single-array":49,"./kernel-value/dynamic-single-array1d-i":50,"./kernel-value/dynamic-single-array2d-i":51,"./kernel-value/dynamic-single-array3d-i":52,"./kernel-value/dynamic-single-input":53,"./kernel-value/dynamic-unsigned-array":54,"./kernel-value/dynamic-unsigned-input":55,"./kernel-value/float":56,"./kernel-value/html-image":57,"./kernel-value/html-video":58,"./kernel-value/integer":60,"./kernel-value/memory-optimized-number-texture":61,"./kernel-value/number-texture":62,"./kernel-value/single-array":63,"./kernel-value/single-array1d-i":64,"./kernel-value/single-array2d-i":65,"./kernel-value/single-array3d-i":66,"./kernel-value/single-input":67,"./kernel-value/unsigned-array":68,"./kernel-value/unsigned-input":69}],40:[function(e,t,n){const{WebGLKernelValue:r}=e("./index"),{Input:i}=e("../../../input");t.exports={WebGLKernelArray:class extends r{checkSize(e,t){if(!this.kernel.validate)return;const{maxTextureSize:n}=this.kernel.constructor.features;if(e>n||t>n)throw e>t?new Error(`Argument texture width of ${e} larger than maximum size of ${n} for your GPU`):ee===r.name))&&t.push(r)}return t}initExtensions(){this.extensions={OES_texture_float:this.context.getExtension("OES_texture_float"),OES_texture_float_linear:this.context.getExtension("OES_texture_float_linear"),OES_element_index_uint:this.context.getExtension("OES_element_index_uint"),WEBGL_draw_buffers:this.context.getExtension("WEBGL_draw_buffers"),WEBGL_color_buffer_float:this.context.getExtension("WEBGL_color_buffer_float")}}validateSettings(e){if(!this.validate)return void(this.texSize=a.getKernelTextureSize({optimizeFloatMemory:this.optimizeFloatMemory,precision:this.precision},this.output));const{features:t}=this.constructor;if(!0===this.optimizeFloatMemory&&!t.isTextureFloat)throw new Error("Float textures are not supported");if("single"===this.precision&&!t.isFloatRead)throw new Error("Single precision not supported");if(!this.graphical&&null===this.precision&&t.isTextureFloat&&(this.precision=t.isFloatRead?"single":"unsigned"),this.subKernels&&this.subKernels.length>0&&!this.extensions.WEBGL_draw_buffers)throw new Error("could not instantiate draw buffers extension");if(null===this.fixIntegerDivisionAccuracy?this.fixIntegerDivisionAccuracy=!t.isIntegerDivisionAccurate:this.fixIntegerDivisionAccuracy&&t.isIntegerDivisionAccurate&&(this.fixIntegerDivisionAccuracy=!1),this.checkOutput(),!this.output||0===this.output.length){if(1!==e.length)throw new Error("Auto output only supported for kernels with only one input");const t=a.getVariableType(e[0],this.strictIntegers);switch(t){case"Array":this.output=a.getDimensions(t);break;case"NumberTexture":case"MemoryOptimizedNumberTexture":case"ArrayTexture(1)":case"ArrayTexture(2)":case"ArrayTexture(3)":case"ArrayTexture(4)":this.output=e[0].output;break;default:throw new Error("Auto output not supported for input type: "+t)}}if(this.graphical){if(2!==this.output.length)throw new Error("Output must have 2 dimensions on graphical mode");return"precision"===this.precision&&(this.precision="unsigned",console.warn("Cannot use graphical mode and single precision at the same time")),void(this.texSize=a.clone(this.output))}null===this.precision&&t.isTextureFloat&&(this.precision="single"),this.texSize=a.getKernelTextureSize({optimizeFloatMemory:this.optimizeFloatMemory,precision:this.precision},this.output),this.checkTextureSize()}updateMaxTexSize(){const{texSize:e,canvas:t}=this;if(null===this.maxTexSize){let n=y.indexOf(t);-1===n&&(n=y.length,y.push(t),b[n]=[e[0],e[1]]),this.maxTexSize=b[n]}this.maxTexSize[0]this.argumentNames.length)throw new Error("too many arguments for kernel");const{context:n}=this;let r=0;const i=()=>this.createTexture(),s=()=>this.constantTextureCount+r++,o=e=>{this.switchKernels({type:"argumentMismatch",needed:e})},u=()=>n.TEXTURE0+this.constantTextureCount+this.argumentTextureCount++;for(let r=0;rthis.createTexture(),onRequestIndex:()=>r++,onRequestContextHandle:()=>t.TEXTURE0+this.constantTextureCount++});this.constantBitRatios[i]=l.bitRatio,this.kernelConstants.push(l),l.setup(),l.forceUploadEachRun&&this.forceUploadKernelConstants.push(l)}}build(){if(this.built)return;if(this.initExtensions(),this.validateSettings(arguments),this.setupConstants(arguments),this.fallbackRequested)return;if(this.setupArguments(arguments),this.fallbackRequested)return;this.updateMaxTexSize(),this.translateSource();const e=this.pickRenderStrategy(arguments);if(e)return e;const{texSize:t,context:n,canvas:r}=this;n.enable(n.SCISSOR_TEST),this.pipeline&&this.precision,n.viewport(0,0,this.maxTexSize[0],this.maxTexSize[1]),r.width=this.maxTexSize[0],r.height=this.maxTexSize[1];const i=this.threadDim=Array.from(this.output);for(;i.length<3;)i.push(1);const s=this.getVertexShader(arguments),a=n.createShader(n.VERTEX_SHADER);n.shaderSource(a,s),n.compileShader(a),this.vertShader=a;const o=this.getFragmentShader(arguments),u=n.createShader(n.FRAGMENT_SHADER);if(n.shaderSource(u,o),n.compileShader(u),this.fragShader=u,this.debug&&(console.log("GLSL Shader Output:"),console.log(o)),!n.getShaderParameter(a,n.COMPILE_STATUS))throw new Error("Error compiling vertex shader: "+n.getShaderInfoLog(a));if(!n.getShaderParameter(u,n.COMPILE_STATUS))throw new Error("Error compiling fragment shader: "+n.getShaderInfoLog(u));const l=this.program=n.createProgram();n.attachShader(l,a),n.attachShader(l,u),n.linkProgram(l),this.framebuffer=n.createFramebuffer(),this.framebuffer.width=t[0],this.framebuffer.height=t[1],this.rawValueFramebuffers={};const h=new Float32Array([-1,-1,1,-1,-1,1,1,1]),c=new Float32Array([0,0,1,0,0,1,1,1]),p=h.byteLength;let d=this.buffer;d?n.bindBuffer(n.ARRAY_BUFFER,d):(d=this.buffer=n.createBuffer(),n.bindBuffer(n.ARRAY_BUFFER,d),n.bufferData(n.ARRAY_BUFFER,h.byteLength+c.byteLength,n.STATIC_DRAW)),n.bufferSubData(n.ARRAY_BUFFER,0,h),n.bufferSubData(n.ARRAY_BUFFER,p,c);const m=n.getAttribLocation(this.program,"aPos");n.enableVertexAttribArray(m),n.vertexAttribPointer(m,2,n.FLOAT,!1,0,0);const f=n.getAttribLocation(this.program,"aTexCoord");n.enableVertexAttribArray(f),n.vertexAttribPointer(f,2,n.FLOAT,!1,0,p),n.bindFramebuffer(n.FRAMEBUFFER,this.framebuffer);let g=0;n.useProgram(this.program);for(let e in this.constants)this.kernelConstants[g++].updateValue(this.constants[e]);this._setupOutputTexture(),null!==this.subKernels&&this.subKernels.length>0&&(this._mappedTextureSwitched={},this._setupSubOutputTextures()),this.buildSignature(arguments),this.built=!0}translateSource(){const e=i.fromKernel(this,s,{fixIntegerDivisionAccuracy:this.fixIntegerDivisionAccuracy});this.translatedSource=e.getPrototypeString("kernel"),this.setupReturnTypes(e)}setupReturnTypes(e){if(this.graphical||this.returnType||(this.returnType=e.getKernelResultType()),this.subKernels&&this.subKernels.length>0)for(let t=0;te.source&&this.source.match(e.functionMatch)?e.source:"")).join("\n"):"\n"}_getConstantsString(){const e=[],{threadDim:t,texSize:n}=this;return this.dynamicOutput?e.push("uniform ivec3 uOutputDim","uniform ivec2 uTexSize"):e.push(`ivec3 uOutputDim = ivec3(${t[0]}, ${t[1]}, ${t[2]})`,`ivec2 uTexSize = ivec2(${n[0]}, ${n[1]})`),a.linesToString(e)}_getTextureCoordinate(){const e=this.subKernels;return null===e||e.length<1?"varying vec2 vTexCoord;\n":"out vec2 vTexCoord;\n"}_getDecode32EndiannessString(){return"LE"===this.endianness?"":" texel.rgba = texel.abgr;\n"}_getEncode32EndiannessString(){return"LE"===this.endianness?"":" texel.rgba = texel.abgr;\n"}_getDivideWithIntegerCheckString(){return this.fixIntegerDivisionAccuracy?"float divWithIntCheck(float x, float y) {\n if (floor(x) == x && floor(y) == y && integerMod(x, y) == 0.0) {\n return float(int(x) / int(y));\n }\n return x / y;\n}\n\nfloat integerCorrectionModulo(float number, float divisor) {\n if (number < 0.0) {\n number = abs(number);\n if (divisor < 0.0) {\n divisor = abs(divisor);\n }\n return -(number - (divisor * floor(divWithIntCheck(number, divisor))));\n }\n if (divisor < 0.0) {\n divisor = abs(divisor);\n }\n return number - (divisor * floor(divWithIntCheck(number, divisor)));\n}":""}_getMainArgumentsString(e){const t=[],{argumentNames:n}=this;for(let r=0;r{if(t.hasOwnProperty(n))return t[n];throw`unhandled artifact ${n}`}))}getFragmentShader(e){return null!==this.compiledFragmentShader?this.compiledFragmentShader:this.compiledFragmentShader=this.replaceArtifacts(this.constructor.fragmentShader,this._getFragShaderArtifactMap(e))}getVertexShader(e){return null!==this.compiledVertexShader?this.compiledVertexShader:this.compiledVertexShader=this.replaceArtifacts(this.constructor.vertexShader,this._getVertShaderArtifactMap(e))}toString(){const e=a.linesToString(["const gl = context"]);return h(this.constructor,arguments,this,e)}destroy(e){if(!this.context)return;this.buffer&&this.context.deleteBuffer(this.buffer),this.framebuffer&&this.context.deleteFramebuffer(this.framebuffer);for(const e in this.rawValueFramebuffers){for(const t in this.rawValueFramebuffers[e])this.context.deleteFramebuffer(this.rawValueFramebuffers[e][t]),delete this.rawValueFramebuffers[e][t];delete this.rawValueFramebuffers[e]}if(this.vertShader&&this.context.deleteShader(this.vertShader),this.fragShader&&this.context.deleteShader(this.fragShader),this.program&&this.context.deleteProgram(this.program),this.texture){this.texture.delete();const e=this.textureCache.indexOf(this.texture.texture);e>-1&&this.textureCache.splice(e,1),this.texture=null}if(this.mappedTextures&&this.mappedTextures.length){for(let e=0;e-1&&this.textureCache.splice(n,1)}this.mappedTextures=null}if(this.kernelArguments)for(let e=0;e0;){const e=this.textureCache.pop();this.context.deleteTexture(e)}if(e){const e=y.indexOf(this.canvas);e>=0&&(y[e]=null,b[e]=null)}if(this.destroyExtensions(),delete this.context,delete this.canvas,!this.gpu)return;const t=this.gpu.kernels.indexOf(this);-1!==t&&this.gpu.kernels.splice(t,1)}destroyExtensions(){this.extensions.OES_texture_float=null,this.extensions.OES_texture_float_linear=null,this.extensions.OES_element_index_uint=null,this.extensions.WEBGL_draw_buffers=null}static destroyContext(e){const t=e.getExtension("WEBGL_lose_context");t&&t.loseContext()}toJSON(){const e=super.toJSON();return e.functionNodes=i.fromKernel(this,s).toJSON(),e.settings.threadDim=this.threadDim,e}}}},{"../../plugins/math-random-uniformly-distributed":112,"../../utils":114,"../function-builder":9,"../gl/kernel":13,"../gl/kernel-string":12,"./fragment-shader":37,"./function-node":38,"./kernel-value-maps":39,"./vertex-shader":71}],71:[function(e,t,n){t.exports={vertexShader:"__FLOAT_TACTIC_DECLARATION__;\n__INT_TACTIC_DECLARATION__;\n__SAMPLER_2D_TACTIC_DECLARATION__;\n\nattribute vec2 aPos;\nattribute vec2 aTexCoord;\n\nvarying vec2 vTexCoord;\nuniform vec2 ratio;\n\nvoid main(void) {\n gl_Position = vec4((aPos + vec2(1)) * ratio + vec2(-1), 0, 1);\n vTexCoord = aTexCoord;\n}"}},{}],72:[function(e,t,n){const r=`#version 300 es\n__HEADER__;\n__FLOAT_TACTIC_DECLARATION__;\n__INT_TACTIC_DECLARATION__;\n__SAMPLER_2D_TACTIC_DECLARATION__;\n__SAMPLER_2D_ARRAY_TACTIC_DECLARATION__;\n\nconst int LOOP_MAX = __LOOP_MAX__;\n\n__PLUGINS__;\n__CONSTANTS__;\n\nin vec2 vTexCoord;\n\nfloat atan2(float v1, float v2) {\n if (v1 == 0.0 || v2 == 0.0) return 0.0;\n return atan(v1 / v2);\n}\n\nfloat cbrt(float x) {\n if (x >= 0.0) {\n return pow(x, 1.0 / 3.0);\n } else {\n return -pow(x, 1.0 / 3.0);\n }\n}\n\nfloat expm1(float x) {\n return pow(${Math.E}, x) - 1.0; \n}\n\nfloat fround(highp float x) {\n return x;\n}\n\nfloat imul(float v1, float v2) {\n return float(int(v1) * int(v2));\n}\n\nfloat log10(float x) {\n return log2(x) * (1.0 / log2(10.0));\n}\n\nfloat log1p(float x) {\n return log(1.0 + x);\n}\n\nfloat _pow(float v1, float v2) {\n if (v2 == 0.0) return 1.0;\n return pow(v1, v2);\n}\n\nfloat _round(float x) {\n return floor(x + 0.5);\n}\n\n\nconst int BIT_COUNT = 32;\nint modi(int x, int y) {\n return x - y * (x / y);\n}\n\nint bitwiseOr(int a, int b) {\n int result = 0;\n int n = 1;\n \n for (int i = 0; i < BIT_COUNT; i++) {\n if ((modi(a, 2) == 1) || (modi(b, 2) == 1)) {\n result += n;\n }\n a = a / 2;\n b = b / 2;\n n = n * 2;\n if(!(a > 0 || b > 0)) {\n break;\n }\n }\n return result;\n}\nint bitwiseXOR(int a, int b) {\n int result = 0;\n int n = 1;\n \n for (int i = 0; i < BIT_COUNT; i++) {\n if ((modi(a, 2) == 1) != (modi(b, 2) == 1)) {\n result += n;\n }\n a = a / 2;\n b = b / 2;\n n = n * 2;\n if(!(a > 0 || b > 0)) {\n break;\n }\n }\n return result;\n}\nint bitwiseAnd(int a, int b) {\n int result = 0;\n int n = 1;\n for (int i = 0; i < BIT_COUNT; i++) {\n if ((modi(a, 2) == 1) && (modi(b, 2) == 1)) {\n result += n;\n }\n a = a / 2;\n b = b / 2;\n n = n * 2;\n if(!(a > 0 && b > 0)) {\n break;\n }\n }\n return result;\n}\nint bitwiseNot(int a) {\n int result = 0;\n int n = 1;\n \n for (int i = 0; i < BIT_COUNT; i++) {\n if (modi(a, 2) == 0) {\n result += n; \n }\n a = a / 2;\n n = n * 2;\n }\n return result;\n}\nint bitwiseZeroFillLeftShift(int n, int shift) {\n int maxBytes = BIT_COUNT;\n for (int i = 0; i < BIT_COUNT; i++) {\n if (maxBytes >= n) {\n break;\n }\n maxBytes *= 2;\n }\n for (int i = 0; i < BIT_COUNT; i++) {\n if (i >= shift) {\n break;\n }\n n *= 2;\n }\n\n int result = 0;\n int byteVal = 1;\n for (int i = 0; i < BIT_COUNT; i++) {\n if (i >= maxBytes) break;\n if (modi(n, 2) > 0) { result += byteVal; }\n n = int(n / 2);\n byteVal *= 2;\n }\n return result;\n}\n\nint bitwiseSignedRightShift(int num, int shifts) {\n return int(floor(float(num) / pow(2.0, float(shifts))));\n}\n\nint bitwiseZeroFillRightShift(int n, int shift) {\n int maxBytes = BIT_COUNT;\n for (int i = 0; i < BIT_COUNT; i++) {\n if (maxBytes >= n) {\n break;\n }\n maxBytes *= 2;\n }\n for (int i = 0; i < BIT_COUNT; i++) {\n if (i >= shift) {\n break;\n }\n n /= 2;\n }\n int result = 0;\n int byteVal = 1;\n for (int i = 0; i < BIT_COUNT; i++) {\n if (i >= maxBytes) break;\n if (modi(n, 2) > 0) { result += byteVal; }\n n = int(n / 2);\n byteVal *= 2;\n }\n return result;\n}\n\nvec2 integerMod(vec2 x, float y) {\n vec2 res = floor(mod(x, y));\n return res * step(1.0 - floor(y), -res);\n}\n\nvec3 integerMod(vec3 x, float y) {\n vec3 res = floor(mod(x, y));\n return res * step(1.0 - floor(y), -res);\n}\n\nvec4 integerMod(vec4 x, vec4 y) {\n vec4 res = floor(mod(x, y));\n return res * step(1.0 - floor(y), -res);\n}\n\nfloat integerMod(float x, float y) {\n float res = floor(mod(x, y));\n return res * (res > floor(y) - 1.0 ? 0.0 : 1.0);\n}\n\nint integerMod(int x, int y) {\n return x - (y * int(x/y));\n}\n\n__DIVIDE_WITH_INTEGER_CHECK__;\n\n// Here be dragons!\n// DO NOT OPTIMIZE THIS CODE\n// YOU WILL BREAK SOMETHING ON SOMEBODY'S MACHINE\n// LEAVE IT AS IT IS, LEST YOU WASTE YOUR OWN TIME\nconst vec2 MAGIC_VEC = vec2(1.0, -256.0);\nconst vec4 SCALE_FACTOR = vec4(1.0, 256.0, 65536.0, 0.0);\nconst vec4 SCALE_FACTOR_INV = vec4(1.0, 0.00390625, 0.0000152587890625, 0.0); // 1, 1/256, 1/65536\nfloat decode32(vec4 texel) {\n __DECODE32_ENDIANNESS__;\n texel *= 255.0;\n vec2 gte128;\n gte128.x = texel.b >= 128.0 ? 1.0 : 0.0;\n gte128.y = texel.a >= 128.0 ? 1.0 : 0.0;\n float exponent = 2.0 * texel.a - 127.0 + dot(gte128, MAGIC_VEC);\n float res = exp2(round(exponent));\n texel.b = texel.b - 128.0 * gte128.x;\n res = dot(texel, SCALE_FACTOR) * exp2(round(exponent-23.0)) + res;\n res *= gte128.y * -2.0 + 1.0;\n return res;\n}\n\nfloat decode16(vec4 texel, int index) {\n int channel = integerMod(index, 2);\n return texel[channel*2] * 255.0 + texel[channel*2 + 1] * 65280.0;\n}\n\nfloat decode8(vec4 texel, int index) {\n int channel = integerMod(index, 4);\n return texel[channel] * 255.0;\n}\n\nvec4 legacyEncode32(float f) {\n float F = abs(f);\n float sign = f < 0.0 ? 1.0 : 0.0;\n float exponent = floor(log2(F));\n float mantissa = (exp2(-exponent) * F);\n // exponent += floor(log2(mantissa));\n vec4 texel = vec4(F * exp2(23.0-exponent)) * SCALE_FACTOR_INV;\n texel.rg = integerMod(texel.rg, 256.0);\n texel.b = integerMod(texel.b, 128.0);\n texel.a = exponent*0.5 + 63.5;\n texel.ba += vec2(integerMod(exponent+127.0, 2.0), sign) * 128.0;\n texel = floor(texel);\n texel *= 0.003921569; // 1/255\n __ENCODE32_ENDIANNESS__;\n return texel;\n}\n\n// https://github.com/gpujs/gpu.js/wiki/Encoder-details\nvec4 encode32(float value) {\n if (value == 0.0) return vec4(0, 0, 0, 0);\n\n float exponent;\n float mantissa;\n vec4 result;\n float sgn;\n\n sgn = step(0.0, -value);\n value = abs(value);\n\n exponent = floor(log2(value));\n\n mantissa = value*pow(2.0, -exponent)-1.0;\n exponent = exponent+127.0;\n result = vec4(0,0,0,0);\n\n result.a = floor(exponent/2.0);\n exponent = exponent - result.a*2.0;\n result.a = result.a + 128.0*sgn;\n\n result.b = floor(mantissa * 128.0);\n mantissa = mantissa - result.b / 128.0;\n result.b = result.b + exponent*128.0;\n\n result.g = floor(mantissa*32768.0);\n mantissa = mantissa - result.g/32768.0;\n\n result.r = floor(mantissa*8388608.0);\n return result/255.0;\n}\n// Dragons end here\n\nint index;\nivec3 threadId;\n\nivec3 indexTo3D(int idx, ivec3 texDim) {\n int z = int(idx / (texDim.x * texDim.y));\n idx -= z * int(texDim.x * texDim.y);\n int y = int(idx / texDim.x);\n int x = int(integerMod(idx, texDim.x));\n return ivec3(x, y, z);\n}\n\nfloat get32(sampler2D tex, ivec2 texSize, ivec3 texDim, int z, int y, int x) {\n int index = x + texDim.x * (y + texDim.y * z);\n int w = texSize.x;\n vec2 st = vec2(float(integerMod(index, w)), float(index / w)) + 0.5;\n vec4 texel = texture(tex, st / vec2(texSize));\n return decode32(texel);\n}\n\nfloat get16(sampler2D tex, ivec2 texSize, ivec3 texDim, int z, int y, int x) {\n int index = x + (texDim.x * (y + (texDim.y * z)));\n int w = texSize.x * 2;\n vec2 st = vec2(float(integerMod(index, w)), float(index / w)) + 0.5;\n vec4 texel = texture(tex, st / vec2(texSize.x * 2, texSize.y));\n return decode16(texel, index);\n}\n\nfloat get8(sampler2D tex, ivec2 texSize, ivec3 texDim, int z, int y, int x) {\n int index = x + (texDim.x * (y + (texDim.y * z)));\n int w = texSize.x * 4;\n vec2 st = vec2(float(integerMod(index, w)), float(index / w)) + 0.5;\n vec4 texel = texture(tex, st / vec2(texSize.x * 4, texSize.y));\n return decode8(texel, index);\n}\n\nfloat getMemoryOptimized32(sampler2D tex, ivec2 texSize, ivec3 texDim, int z, int y, int x) {\n int index = x + (texDim.x * (y + (texDim.y * z)));\n int channel = integerMod(index, 4);\n index = index / 4;\n int w = texSize.x;\n vec2 st = vec2(float(integerMod(index, w)), float(index / w)) + 0.5;\n index = index / 4;\n vec4 texel = texture(tex, st / vec2(texSize));\n return texel[channel];\n}\n\nvec4 getImage2D(sampler2D tex, ivec2 texSize, ivec3 texDim, int z, int y, int x) {\n int index = x + texDim.x * (y + texDim.y * z);\n int w = texSize.x;\n vec2 st = vec2(float(integerMod(index, w)), float(index / w)) + 0.5;\n return texture(tex, st / vec2(texSize));\n}\n\nvec4 getImage3D(sampler2DArray tex, ivec2 texSize, ivec3 texDim, int z, int y, int x) {\n int index = x + texDim.x * (y + texDim.y * z);\n int w = texSize.x;\n vec2 st = vec2(float(integerMod(index, w)), float(index / w)) + 0.5;\n return texture(tex, vec3(st / vec2(texSize), z));\n}\n\nfloat getFloatFromSampler2D(sampler2D tex, ivec2 texSize, ivec3 texDim, int z, int y, int x) {\n vec4 result = getImage2D(tex, texSize, texDim, z, y, x);\n return result[0];\n}\n\nvec2 getVec2FromSampler2D(sampler2D tex, ivec2 texSize, ivec3 texDim, int z, int y, int x) {\n vec4 result = getImage2D(tex, texSize, texDim, z, y, x);\n return vec2(result[0], result[1]);\n}\n\nvec2 getMemoryOptimizedVec2(sampler2D tex, ivec2 texSize, ivec3 texDim, int z, int y, int x) {\n int index = x + texDim.x * (y + texDim.y * z);\n int channel = integerMod(index, 2);\n index = index / 2;\n int w = texSize.x;\n vec2 st = vec2(float(integerMod(index, w)), float(index / w)) + 0.5;\n vec4 texel = texture(tex, st / vec2(texSize));\n if (channel == 0) return vec2(texel.r, texel.g);\n if (channel == 1) return vec2(texel.b, texel.a);\n return vec2(0.0, 0.0);\n}\n\nvec3 getVec3FromSampler2D(sampler2D tex, ivec2 texSize, ivec3 texDim, int z, int y, int x) {\n vec4 result = getImage2D(tex, texSize, texDim, z, y, x);\n return vec3(result[0], result[1], result[2]);\n}\n\nvec3 getMemoryOptimizedVec3(sampler2D tex, ivec2 texSize, ivec3 texDim, int z, int y, int x) {\n int fieldIndex = 3 * (x + texDim.x * (y + texDim.y * z));\n int vectorIndex = fieldIndex / 4;\n int vectorOffset = fieldIndex - vectorIndex * 4;\n int readY = vectorIndex / texSize.x;\n int readX = vectorIndex - readY * texSize.x;\n vec4 tex1 = texture(tex, (vec2(readX, readY) + 0.5) / vec2(texSize));\n\n if (vectorOffset == 0) {\n return tex1.xyz;\n } else if (vectorOffset == 1) {\n return tex1.yzw;\n } else {\n readX++;\n if (readX >= texSize.x) {\n readX = 0;\n readY++;\n }\n vec4 tex2 = texture(tex, vec2(readX, readY) / vec2(texSize));\n if (vectorOffset == 2) {\n return vec3(tex1.z, tex1.w, tex2.x);\n } else {\n return vec3(tex1.w, tex2.x, tex2.y);\n }\n }\n}\n\nvec4 getVec4FromSampler2D(sampler2D tex, ivec2 texSize, ivec3 texDim, int z, int y, int x) {\n return getImage2D(tex, texSize, texDim, z, y, x);\n}\n\nvec4 getMemoryOptimizedVec4(sampler2D tex, ivec2 texSize, ivec3 texDim, int z, int y, int x) {\n int index = x + texDim.x * (y + texDim.y * z);\n int channel = integerMod(index, 2);\n int w = texSize.x;\n vec2 st = vec2(float(integerMod(index, w)), float(index / w)) + 0.5;\n vec4 texel = texture(tex, st / vec2(texSize));\n return vec4(texel.r, texel.g, texel.b, texel.a);\n}\n\nvec4 actualColor;\nvoid color(float r, float g, float b, float a) {\n actualColor = vec4(r,g,b,a);\n}\n\nvoid color(float r, float g, float b) {\n color(r,g,b,1.0);\n}\n\nfloat modulo(float number, float divisor) {\n if (number < 0.0) {\n number = abs(number);\n if (divisor < 0.0) {\n divisor = abs(divisor);\n }\n return -mod(number, divisor);\n }\n if (divisor < 0.0) {\n divisor = abs(divisor);\n }\n return mod(number, divisor);\n}\n\n__INJECTED_NATIVE__;\n__MAIN_CONSTANTS__;\n__MAIN_ARGUMENTS__;\n__KERNEL__;\n\nvoid main(void) {\n index = int(vTexCoord.s * float(uTexSize.x)) + int(vTexCoord.t * float(uTexSize.y)) * uTexSize.x;\n __MAIN_RESULT__;\n}`;t.exports={fragmentShader:r}},{}],73:[function(e,t,n){const{utils:r}=e("../../utils"),{WebGLFunctionNode:i}=e("../web-gl/function-node");t.exports={WebGL2FunctionNode:class extends i{astIdentifierExpression(e,t){if("Identifier"!==e.type)throw this.astErrorOutput("IdentifierExpression - not an Identifier",e);const n=this.getType(e),i=r.sanitizeName(e.name);return"Infinity"===e.name?t.push("intBitsToFloat(2139095039)"):"Boolean"===n&&this.argumentNames.indexOf(i)>-1?t.push(`bool(user_${i})`):t.push(`user_${i}`),t}}}},{"../../utils":114,"../web-gl/function-node":38}],74:[function(e,t,n){const{WebGL2KernelValueBoolean:r}=e("./kernel-value/boolean"),{WebGL2KernelValueFloat:i}=e("./kernel-value/float"),{WebGL2KernelValueInteger:s}=e("./kernel-value/integer"),{WebGL2KernelValueHTMLImage:a}=e("./kernel-value/html-image"),{WebGL2KernelValueDynamicHTMLImage:o}=e("./kernel-value/dynamic-html-image"),{WebGL2KernelValueHTMLImageArray:u}=e("./kernel-value/html-image-array"),{WebGL2KernelValueDynamicHTMLImageArray:l}=e("./kernel-value/dynamic-html-image-array"),{WebGL2KernelValueHTMLVideo:h}=e("./kernel-value/html-video"),{WebGL2KernelValueDynamicHTMLVideo:c}=e("./kernel-value/dynamic-html-video"),{WebGL2KernelValueSingleInput:p}=e("./kernel-value/single-input"),{WebGL2KernelValueDynamicSingleInput:d}=e("./kernel-value/dynamic-single-input"),{WebGL2KernelValueUnsignedInput:m}=e("./kernel-value/unsigned-input"),{WebGL2KernelValueDynamicUnsignedInput:f}=e("./kernel-value/dynamic-unsigned-input"),{WebGL2KernelValueMemoryOptimizedNumberTexture:g}=e("./kernel-value/memory-optimized-number-texture"),{WebGL2KernelValueDynamicMemoryOptimizedNumberTexture:x}=e("./kernel-value/dynamic-memory-optimized-number-texture"),{WebGL2KernelValueNumberTexture:y}=e("./kernel-value/number-texture"),{WebGL2KernelValueDynamicNumberTexture:b}=e("./kernel-value/dynamic-number-texture"),{WebGL2KernelValueSingleArray:T}=e("./kernel-value/single-array"),{WebGL2KernelValueDynamicSingleArray:v}=e("./kernel-value/dynamic-single-array"),{WebGL2KernelValueSingleArray1DI:S}=e("./kernel-value/single-array1d-i"),{WebGL2KernelValueDynamicSingleArray1DI:A}=e("./kernel-value/dynamic-single-array1d-i"),{WebGL2KernelValueSingleArray2DI:_}=e("./kernel-value/single-array2d-i"),{WebGL2KernelValueDynamicSingleArray2DI:E}=e("./kernel-value/dynamic-single-array2d-i"),{WebGL2KernelValueSingleArray3DI:w}=e("./kernel-value/single-array3d-i"),{WebGL2KernelValueDynamicSingleArray3DI:k}=e("./kernel-value/dynamic-single-array3d-i"),{WebGL2KernelValueArray2:I}=e("./kernel-value/array2"),{WebGL2KernelValueArray3:D}=e("./kernel-value/array3"),{WebGL2KernelValueArray4:C}=e("./kernel-value/array4"),{WebGL2KernelValueUnsignedArray:$}=e("./kernel-value/unsigned-array"),{WebGL2KernelValueDynamicUnsignedArray:L}=e("./kernel-value/dynamic-unsigned-array"),R={unsigned:{dynamic:{Boolean:r,Integer:s,Float:i,Array:L,"Array(2)":I,"Array(3)":D,"Array(4)":C,"Array1D(2)":!1,"Array1D(3)":!1,"Array1D(4)":!1,"Array2D(2)":!1,"Array2D(3)":!1,"Array2D(4)":!1,"Array3D(2)":!1,"Array3D(3)":!1,"Array3D(4)":!1,Input:f,NumberTexture:b,"ArrayTexture(1)":b,"ArrayTexture(2)":b,"ArrayTexture(3)":b,"ArrayTexture(4)":b,MemoryOptimizedNumberTexture:x,HTMLCanvas:o,OffscreenCanvas:o,HTMLImage:o,ImageBitmap:o,ImageData:o,HTMLImageArray:l,HTMLVideo:c},static:{Boolean:r,Float:i,Integer:s,Array:$,"Array(2)":I,"Array(3)":D,"Array(4)":C,"Array1D(2)":!1,"Array1D(3)":!1,"Array1D(4)":!1,"Array2D(2)":!1,"Array2D(3)":!1,"Array2D(4)":!1,"Array3D(2)":!1,"Array3D(3)":!1,"Array3D(4)":!1,Input:m,NumberTexture:y,"ArrayTexture(1)":y,"ArrayTexture(2)":y,"ArrayTexture(3)":y,"ArrayTexture(4)":y,MemoryOptimizedNumberTexture:x,HTMLCanvas:a,OffscreenCanvas:a,HTMLImage:a,ImageBitmap:a,ImageData:a,HTMLImageArray:u,HTMLVideo:h}},single:{dynamic:{Boolean:r,Integer:s,Float:i,Array:v,"Array(2)":I,"Array(3)":D,"Array(4)":C,"Array1D(2)":A,"Array1D(3)":A,"Array1D(4)":A,"Array2D(2)":E,"Array2D(3)":E,"Array2D(4)":E,"Array3D(2)":k,"Array3D(3)":k,"Array3D(4)":k,Input:d,NumberTexture:b,"ArrayTexture(1)":b,"ArrayTexture(2)":b,"ArrayTexture(3)":b,"ArrayTexture(4)":b,MemoryOptimizedNumberTexture:x,HTMLCanvas:o,OffscreenCanvas:o,HTMLImage:o,ImageBitmap:o,ImageData:o,HTMLImageArray:l,HTMLVideo:c},static:{Boolean:r,Float:i,Integer:s,Array:T,"Array(2)":I,"Array(3)":D,"Array(4)":C,"Array1D(2)":S,"Array1D(3)":S,"Array1D(4)":S,"Array2D(2)":_,"Array2D(3)":_,"Array2D(4)":_,"Array3D(2)":w,"Array3D(3)":w,"Array3D(4)":w,Input:p,NumberTexture:y,"ArrayTexture(1)":y,"ArrayTexture(2)":y,"ArrayTexture(3)":y,"ArrayTexture(4)":y,MemoryOptimizedNumberTexture:g,HTMLCanvas:a,OffscreenCanvas:a,HTMLImage:a,ImageBitmap:a,ImageData:a,HTMLImageArray:u,HTMLVideo:h}}};t.exports={kernelValueMaps:R,lookupKernelValueType:function(e,t,n,r){if(!e)throw new Error("type missing");if(!t)throw new Error("dynamic missing");if(!n)throw new Error("precision missing");r.type&&(e=r.type);const i=R[n][t];if(!1===i[e])return null;if(void 0===i[e])throw new Error(`Could not find a KernelValue for ${e}`);return i[e]}}},{"./kernel-value/array2":75,"./kernel-value/array3":76,"./kernel-value/array4":77,"./kernel-value/boolean":78,"./kernel-value/dynamic-html-image":80,"./kernel-value/dynamic-html-image-array":79,"./kernel-value/dynamic-html-video":81,"./kernel-value/dynamic-memory-optimized-number-texture":82,"./kernel-value/dynamic-number-texture":83,"./kernel-value/dynamic-single-array":84,"./kernel-value/dynamic-single-array1d-i":85,"./kernel-value/dynamic-single-array2d-i":86,"./kernel-value/dynamic-single-array3d-i":87,"./kernel-value/dynamic-single-input":88,"./kernel-value/dynamic-unsigned-array":89,"./kernel-value/dynamic-unsigned-input":90,"./kernel-value/float":91,"./kernel-value/html-image":93,"./kernel-value/html-image-array":92,"./kernel-value/html-video":94,"./kernel-value/integer":95,"./kernel-value/memory-optimized-number-texture":96,"./kernel-value/number-texture":97,"./kernel-value/single-array":98,"./kernel-value/single-array1d-i":99,"./kernel-value/single-array2d-i":100,"./kernel-value/single-array3d-i":101,"./kernel-value/single-input":102,"./kernel-value/unsigned-array":103,"./kernel-value/unsigned-input":104}],75:[function(e,t,n){const{WebGLKernelValueArray2:r}=e("../../web-gl/kernel-value/array2");t.exports={WebGL2KernelValueArray2:class extends r{}}},{"../../web-gl/kernel-value/array2":41}],76:[function(e,t,n){const{WebGLKernelValueArray3:r}=e("../../web-gl/kernel-value/array3");t.exports={WebGL2KernelValueArray3:class extends r{}}},{"../../web-gl/kernel-value/array3":42}],77:[function(e,t,n){const{WebGLKernelValueArray4:r}=e("../../web-gl/kernel-value/array4");t.exports={WebGL2KernelValueArray4:class extends r{}}},{"../../web-gl/kernel-value/array4":43}],78:[function(e,t,n){const{WebGLKernelValueBoolean:r}=e("../../web-gl/kernel-value/boolean");t.exports={WebGL2KernelValueBoolean:class extends r{}}},{"../../web-gl/kernel-value/boolean":44}],79:[function(e,t,n){const{utils:r}=e("../../../utils"),{WebGL2KernelValueHTMLImageArray:i}=e("./html-image-array");t.exports={WebGL2KernelValueDynamicHTMLImageArray:class extends i{getSource(){const e=this.getVariablePrecisionString();return r.linesToString([`uniform ${e} sampler2DArray ${this.id}`,`uniform ${e} ivec2 ${this.sizeId}`,`uniform ${e} ivec3 ${this.dimensionsId}`])}updateValue(e){const{width:t,height:n}=e[0];this.checkSize(t,n),this.dimensions=[t,n,e.length],this.textureSize=[t,n],this.kernel.setUniform3iv(this.dimensionsId,this.dimensions),this.kernel.setUniform2iv(this.sizeId,this.textureSize),super.updateValue(e)}}}},{"../../../utils":114,"./html-image-array":92}],80:[function(e,t,n){const{utils:r}=e("../../../utils"),{WebGLKernelValueDynamicHTMLImage:i}=e("../../web-gl/kernel-value/dynamic-html-image");t.exports={WebGL2KernelValueDynamicHTMLImage:class extends i{getSource(){const e=this.getVariablePrecisionString();return r.linesToString([`uniform ${e} sampler2D ${this.id}`,`uniform ${e} ivec2 ${this.sizeId}`,`uniform ${e} ivec3 ${this.dimensionsId}`])}}}},{"../../../utils":114,"../../web-gl/kernel-value/dynamic-html-image":45}],81:[function(e,t,n){const{utils:r}=e("../../../utils"),{WebGL2KernelValueDynamicHTMLImage:i}=e("./dynamic-html-image");t.exports={WebGL2KernelValueDynamicHTMLVideo:class extends i{}}},{"../../../utils":114,"./dynamic-html-image":80}],82:[function(e,t,n){const{utils:r}=e("../../../utils"),{WebGLKernelValueDynamicMemoryOptimizedNumberTexture:i}=e("../../web-gl/kernel-value/dynamic-memory-optimized-number-texture");t.exports={WebGL2KernelValueDynamicMemoryOptimizedNumberTexture:class extends i{getSource(){return r.linesToString([`uniform sampler2D ${this.id}`,`uniform ivec2 ${this.sizeId}`,`uniform ivec3 ${this.dimensionsId}`])}}}},{"../../../utils":114,"../../web-gl/kernel-value/dynamic-memory-optimized-number-texture":47}],83:[function(e,t,n){const{utils:r}=e("../../../utils"),{WebGLKernelValueDynamicNumberTexture:i}=e("../../web-gl/kernel-value/dynamic-number-texture");t.exports={WebGL2KernelValueDynamicNumberTexture:class extends i{getSource(){const e=this.getVariablePrecisionString();return r.linesToString([`uniform ${e} sampler2D ${this.id}`,`uniform ${e} ivec2 ${this.sizeId}`,`uniform ${e} ivec3 ${this.dimensionsId}`])}}}},{"../../../utils":114,"../../web-gl/kernel-value/dynamic-number-texture":48}],84:[function(e,t,n){const{utils:r}=e("../../../utils"),{WebGL2KernelValueSingleArray:i}=e("../../web-gl2/kernel-value/single-array");t.exports={WebGL2KernelValueDynamicSingleArray:class extends i{getSource(){const e=this.getVariablePrecisionString();return r.linesToString([`uniform ${e} sampler2D ${this.id}`,`uniform ${e} ivec2 ${this.sizeId}`,`uniform ${e} ivec3 ${this.dimensionsId}`])}updateValue(e){this.dimensions=r.getDimensions(e,!0),this.textureSize=r.getMemoryOptimizedFloatTextureSize(this.dimensions,this.bitRatio),this.uploadArrayLength=this.textureSize[0]*this.textureSize[1]*this.bitRatio,this.checkSize(this.textureSize[0],this.textureSize[1]),this.uploadValue=new Float32Array(this.uploadArrayLength),this.kernel.setUniform3iv(this.dimensionsId,this.dimensions),this.kernel.setUniform2iv(this.sizeId,this.textureSize),super.updateValue(e)}}}},{"../../../utils":114,"../../web-gl2/kernel-value/single-array":98}],85:[function(e,t,n){const{utils:r}=e("../../../utils"),{WebGL2KernelValueSingleArray1DI:i}=e("../../web-gl2/kernel-value/single-array1d-i");t.exports={WebGL2KernelValueDynamicSingleArray1DI:class extends i{getSource(){const e=this.getVariablePrecisionString();return r.linesToString([`uniform ${e} sampler2D ${this.id}`,`uniform ${e} ivec2 ${this.sizeId}`,`uniform ${e} ivec3 ${this.dimensionsId}`])}updateValue(e){this.setShape(e),this.kernel.setUniform3iv(this.dimensionsId,this.dimensions),this.kernel.setUniform2iv(this.sizeId,this.textureSize),super.updateValue(e)}}}},{"../../../utils":114,"../../web-gl2/kernel-value/single-array1d-i":99}],86:[function(e,t,n){const{utils:r}=e("../../../utils"),{WebGL2KernelValueSingleArray2DI:i}=e("../../web-gl2/kernel-value/single-array2d-i");t.exports={WebGL2KernelValueDynamicSingleArray2DI:class extends i{getSource(){const e=this.getVariablePrecisionString();return r.linesToString([`uniform ${e} sampler2D ${this.id}`,`uniform ${e} ivec2 ${this.sizeId}`,`uniform ${e} ivec3 ${this.dimensionsId}`])}updateValue(e){this.setShape(e),this.kernel.setUniform3iv(this.dimensionsId,this.dimensions),this.kernel.setUniform2iv(this.sizeId,this.textureSize),super.updateValue(e)}}}},{"../../../utils":114,"../../web-gl2/kernel-value/single-array2d-i":100}],87:[function(e,t,n){const{utils:r}=e("../../../utils"),{WebGL2KernelValueSingleArray3DI:i}=e("../../web-gl2/kernel-value/single-array3d-i");t.exports={WebGL2KernelValueDynamicSingleArray3DI:class extends i{getSource(){const e=this.getVariablePrecisionString();return r.linesToString([`uniform ${e} sampler2D ${this.id}`,`uniform ${e} ivec2 ${this.sizeId}`,`uniform ${e} ivec3 ${this.dimensionsId}`])}updateValue(e){this.setShape(e),this.kernel.setUniform3iv(this.dimensionsId,this.dimensions),this.kernel.setUniform2iv(this.sizeId,this.textureSize),super.updateValue(e)}}}},{"../../../utils":114,"../../web-gl2/kernel-value/single-array3d-i":101}],88:[function(e,t,n){const{utils:r}=e("../../../utils"),{WebGL2KernelValueSingleInput:i}=e("../../web-gl2/kernel-value/single-input");t.exports={WebGL2KernelValueDynamicSingleInput:class extends i{getSource(){const e=this.getVariablePrecisionString();return r.linesToString([`uniform ${e} sampler2D ${this.id}`,`uniform ${e} ivec2 ${this.sizeId}`,`uniform ${e} ivec3 ${this.dimensionsId}`])}updateValue(e){let[t,n,i]=e.size;this.dimensions=new Int32Array([t||1,n||1,i||1]),this.textureSize=r.getMemoryOptimizedFloatTextureSize(this.dimensions,this.bitRatio),this.uploadArrayLength=this.textureSize[0]*this.textureSize[1]*this.bitRatio,this.checkSize(this.textureSize[0],this.textureSize[1]),this.uploadValue=new Float32Array(this.uploadArrayLength),this.kernel.setUniform3iv(this.dimensionsId,this.dimensions),this.kernel.setUniform2iv(this.sizeId,this.textureSize),super.updateValue(e)}}}},{"../../../utils":114,"../../web-gl2/kernel-value/single-input":102}],89:[function(e,t,n){const{utils:r}=e("../../../utils"),{WebGLKernelValueDynamicUnsignedArray:i}=e("../../web-gl/kernel-value/dynamic-unsigned-array");t.exports={WebGL2KernelValueDynamicUnsignedArray:class extends i{getSource(){const e=this.getVariablePrecisionString();return r.linesToString([`uniform ${e} sampler2D ${this.id}`,`uniform ${e} ivec2 ${this.sizeId}`,`uniform ${e} ivec3 ${this.dimensionsId}`])}}}},{"../../../utils":114,"../../web-gl/kernel-value/dynamic-unsigned-array":54}],90:[function(e,t,n){const{utils:r}=e("../../../utils"),{WebGLKernelValueDynamicUnsignedInput:i}=e("../../web-gl/kernel-value/dynamic-unsigned-input");t.exports={WebGL2KernelValueDynamicUnsignedInput:class extends i{getSource(){const e=this.getVariablePrecisionString();return r.linesToString([`uniform ${e} sampler2D ${this.id}`,`uniform ${e} ivec2 ${this.sizeId}`,`uniform ${e} ivec3 ${this.dimensionsId}`])}}}},{"../../../utils":114,"../../web-gl/kernel-value/dynamic-unsigned-input":55}],91:[function(e,t,n){const{utils:r}=e("../../../utils"),{WebGLKernelValueFloat:i}=e("../../web-gl/kernel-value/float");t.exports={WebGL2KernelValueFloat:class extends i{}}},{"../../../utils":114,"../../web-gl/kernel-value/float":56}],92:[function(e,t,n){const{utils:r}=e("../../../utils"),{WebGLKernelArray:i}=e("../../web-gl/kernel-value/array");t.exports={WebGL2KernelValueHTMLImageArray:class extends i{constructor(e,t){super(e,t),this.checkSize(e[0].width,e[0].height),this.dimensions=[e[0].width,e[0].height,e.length],this.textureSize=[e[0].width,e[0].height]}defineTexture(){const{context:e}=this;e.activeTexture(this.contextHandle),e.bindTexture(e.TEXTURE_2D_ARRAY,this.texture),e.texParameteri(e.TEXTURE_2D_ARRAY,e.TEXTURE_MAG_FILTER,e.NEAREST),e.texParameteri(e.TEXTURE_2D_ARRAY,e.TEXTURE_MIN_FILTER,e.NEAREST)}getStringValueHandler(){return`const uploadValue_${this.name} = ${this.varName};\n`}getSource(){const e=this.getVariablePrecisionString();return r.linesToString([`uniform ${e} sampler2DArray ${this.id}`,`${e} ivec2 ${this.sizeId} = ivec2(${this.textureSize[0]}, ${this.textureSize[1]})`,`${e} ivec3 ${this.dimensionsId} = ivec3(${this.dimensions[0]}, ${this.dimensions[1]}, ${this.dimensions[2]})`])}updateValue(e){const{context:t}=this;t.activeTexture(this.contextHandle),t.bindTexture(t.TEXTURE_2D_ARRAY,this.texture),t.pixelStorei(t.UNPACK_FLIP_Y_WEBGL,!0),t.texImage3D(t.TEXTURE_2D_ARRAY,0,t.RGBA,e[0].width,e[0].height,e.length,0,t.RGBA,t.UNSIGNED_BYTE,null);for(let n=0;ni})}"undefined"!=typeof window&&s(window),"undefined"!=typeof self&&s(self),t.exports=r},{"./index":109}],108:[function(e,t,n){const{gpuMock:r}=e("gpu-mock.js"),{utils:i}=e("./utils"),{Kernel:s}=e("./backend/kernel"),{CPUKernel:a}=e("./backend/cpu/kernel"),{HeadlessGLKernel:o}=e("./backend/headless-gl/kernel"),{WebGL2Kernel:u}=e("./backend/web-gl2/kernel"),{WebGLKernel:l}=e("./backend/web-gl/kernel"),{kernelRunShortcut:h}=e("./kernel-run-shortcut"),c=[o,u,l],p=["gpu","cpu"],d={headlessgl:o,webgl2:u,webgl:l};let m=!0;function f(e){if(!e)return{};const t=Object.assign({},e);return e.hasOwnProperty("floatOutput")&&(i.warnDeprecated("setting","floatOutput","precision"),t.precision=e.floatOutput?"single":"unsigned"),e.hasOwnProperty("outputToTexture")&&(i.warnDeprecated("setting","outputToTexture","pipeline"),t.pipeline=Boolean(e.outputToTexture)),e.hasOwnProperty("outputImmutable")&&(i.warnDeprecated("setting","outputImmutable","immutable"),t.immutable=Boolean(e.outputImmutable)),e.hasOwnProperty("floatTextures")&&(i.warnDeprecated("setting","floatTextures","optimizeFloatMemory"),t.optimizeFloatMemory=Boolean(e.floatTextures)),t}t.exports={GPU:class{static disableValidation(){m=!1}static enableValidation(){m=!0}static get isGPUSupported(){return c.some((e=>e.isSupported))}static get isKernelMapSupported(){return c.some((e=>e.isSupported&&e.features.kernelMap))}static get isOffscreenCanvasSupported(){return"undefined"!=typeof Worker&&"undefined"!=typeof OffscreenCanvas||"undefined"!=typeof importScripts}static get isWebGLSupported(){return l.isSupported}static get isWebGL2Supported(){return u.isSupported}static get isHeadlessGLSupported(){return o.isSupported}static get isCanvasSupported(){return"undefined"!=typeof HTMLCanvasElement}static get isGPUHTMLImageArraySupported(){return u.isSupported}static get isSinglePrecisionSupported(){return c.some((e=>e.isSupported&&e.features.isFloatRead&&e.features.isTextureFloat))}constructor(e){if(e=e||{},this.canvas=e.canvas||null,this.context=e.context||null,this.mode=e.mode,this.Kernel=null,this.kernels=[],this.functions=[],this.nativeFunctions=[],this.injectedNative=null,"dev"!==this.mode){if(this.chooseKernel(),e.functions)for(let t=0;tt.argumentTypes[e])));const l=Object.assign({context:this.context,canvas:this.canvas,functions:this.functions,nativeFunctions:this.nativeFunctions,injectedNative:this.injectedNative,gpu:this,validate:m,onRequestFallback:u,onRequestSwitchKernel:function t(r,i,a){a.debug&&console.warn("Switching kernels");let o=null;if(a.signature&&!s[a.signature]&&(s[a.signature]=a),a.dynamicOutput)for(let e=r.length-1;e>=0;e--){const t=r[e];"outputPrecisionMismatch"===t.type&&(o=t.needed)}const l=a.constructor,h=l.getArgumentTypes(a,i),c=l.getSignature(a,h),d=s[c];if(d)return d.onActivate(a),d;const f=s[c]=new l(e,{argumentTypes:h,constantTypes:a.constantTypes,graphical:a.graphical,loopMaxIterations:a.loopMaxIterations,constants:a.constants,dynamicOutput:a.dynamicOutput,dynamicArgument:a.dynamicArguments,context:a.context,canvas:a.canvas,output:o||a.output,precision:a.precision,pipeline:a.pipeline,immutable:a.immutable,optimizeFloatMemory:a.optimizeFloatMemory,fixIntegerDivisionAccuracy:a.fixIntegerDivisionAccuracy,functions:a.functions,nativeFunctions:a.nativeFunctions,injectedNative:a.injectedNative,subKernels:a.subKernels,strictIntegers:a.strictIntegers,debug:a.debug,gpu:a.gpu,validate:m,returnType:a.returnType,tactic:a.tactic,onRequestFallback:u,onRequestSwitchKernel:t,texture:a.texture,mappedTextures:a.mappedTextures,drawBuffersMap:a.drawBuffersMap});return f.build.apply(f,i),p.replaceKernel(f),n.push(f),f}},o),c=new this.Kernel(e,l),p=h(c);return this.canvas||(this.canvas=c.canvas),this.context||(this.context=c.context),n.push(c),p}createKernelMap(){let e,t;const n=typeof arguments[arguments.length-2];if("function"===n||"string"===n?(e=arguments[arguments.length-2],t=arguments[arguments.length-1]):e=arguments[arguments.length-1],"dev"!==this.mode&&(!this.Kernel.isSupported||!this.Kernel.features.kernelMap)&&this.mode&&p.indexOf(this.mode)<0)throw new Error(`kernelMap not supported on ${this.Kernel.name}`);const r=f(t);if(t&&"object"==typeof t.argumentTypes&&(r.argumentTypes=Object.keys(t.argumentTypes).map((e=>t.argumentTypes[e]))),Array.isArray(arguments[0])){r.subKernels=[];const e=arguments[0];for(let t=0;t0)throw new Error('Cannot call "addNativeFunction" after "createKernels" has been called.');return this.nativeFunctions.push(Object.assign({name:e,source:t},n)),this}injectNative(e){return this.injectedNative=e,this}destroy(){return new Promise(((e,t)=>{this.kernels||e(),setTimeout((()=>{try{for(let e=0;et.kernel[i])),t.__defineSetter__(i,(e=>{t.kernel[i]=e}))))}t.kernel=e}t.exports={kernelRunShortcut:function(e){let t=function(){return e.build.apply(e,arguments),t=function(){let t=e.run.apply(e,arguments);if(e.switchingKernels){const r=e.resetSwitchingKernels(),i=e.onRequestSwitchKernel(r,arguments,e);n.kernel=e=i,t=i.run.apply(i,arguments)}return e.renderKernels?e.renderKernels():e.renderOutput?e.renderOutput():t},t.apply(e,arguments)};const n=function(){return t.apply(e,arguments)};return n.exec=function(){return new Promise(((e,n)=>{try{e(t.apply(this,arguments))}catch(e){n(e)}}))},n.replaceKernel=function(t){i(e=t,n)},i(e,n),n}}},{"./utils":114}],112:[function(e,t,n){const r={name:"math-random-uniformly-distributed",onBeforeRun:e=>{e.setUniform1f("randomSeed1",Math.random()),e.setUniform1f("randomSeed2",Math.random())},functionMatch:"Math.random()",functionReplace:"nrand(vTexCoord)",functionReturnType:"Number",source:"// https://www.shadertoy.com/view/4t2SDh\n//note: uniformly distributed, normalized rand, [0,1]\nhighp float randomSeedShift = 1.0;\nhighp float slide = 1.0;\nuniform highp float randomSeed1;\nuniform highp float randomSeed2;\n\nhighp float nrand(highp vec2 n) {\n highp float result = fract(sin(dot((n.xy + 1.0) * vec2(randomSeed1 * slide, randomSeed2 * randomSeedShift), vec2(12.9898, 78.233))) * 43758.5453);\n randomSeedShift = result;\n if (randomSeedShift > 0.5) {\n slide += 0.00009; \n } else {\n slide += 0.0009;\n }\n return result;\n}"};t.exports=r},{}],113:[function(e,t,n){t.exports={Texture:class{constructor(e){const{texture:t,size:n,dimensions:r,output:i,context:s,type:a="NumberTexture",kernel:o,internalFormat:u,textureFormat:l}=e;if(!i)throw new Error('settings property "output" required.');if(!s)throw new Error('settings property "context" required.');if(!t)throw new Error('settings property "texture" required.');if(!o)throw new Error('settings property "kernel" required.');this.texture=t,t._refs?t._refs++:t._refs=1,this.size=n,this.dimensions=r,this.output=i,this.context=s,this.kernel=o,this.type=a,this._deleted=!1,this.internalFormat=u,this.textureFormat=l}toArray(){throw new Error(`Not implemented on ${this.constructor.name}`)}clone(){throw new Error(`Not implemented on ${this.constructor.name}`)}delete(){throw new Error(`Not implemented on ${this.constructor.name}`)}clear(){throw new Error(`Not implemented on ${this.constructor.name}`)}}}},{}],114:[function(e,t,n){const r=e("acorn"),{Input:i}=e("./input"),{Texture:s}=e("./texture"),a=/function ([^(]*)/,o=/((\/\/.*$)|(\/\*[\s\S]*?\*\/))/gm,u=/([^\s,]+)/g,l={systemEndianness:()=>d,getSystemEndianness(){const e=new ArrayBuffer(4),t=new Uint32Array(e),n=new Uint8Array(e);if(t[0]=3735928559,239===n[0])return"LE";if(222===n[0])return"BE";throw new Error("unknown endianness")},isFunction:e=>"function"==typeof e,isFunctionString:e=>"string"==typeof e&&"function"===e.slice(0,"function".length).toLowerCase(),getFunctionNameFromString(e){const t=a.exec(e);return t&&0!==t.length?t[1].trim():null},getFunctionBodyFromString:e=>e.substring(e.indexOf("{")+1,e.lastIndexOf("}")),getArgumentNamesFromString(e){const t=e.replace(o,"");let n=t.slice(t.indexOf("(")+1,t.indexOf(")")).match(u);return null===n&&(n=[]),n},clone(e){if(null===e||"object"!=typeof e||e.hasOwnProperty("isActiveClone"))return e;const t=e.constructor();for(let n in e)Object.prototype.hasOwnProperty.call(e,n)&&(e.isActiveClone=null,t[n]=l.clone(e[n]),delete e.isActiveClone);return t},isArray:e=>!isNaN(e.length),getVariableType(e,t){if(l.isArray(e))return e.length>0&&"IMG"===e[0].nodeName?"HTMLImageArray":"Array";switch(e.constructor){case Boolean:return"Boolean";case Number:return t&&Number.isInteger(e)?"Integer":"Float";case s:return e.type;case i:return"Input"}if("nodeName"in e)switch(e.nodeName){case"IMG":case"CANVAS":return"HTMLImage";case"VIDEO":return"HTMLVideo"}else{if(e.hasOwnProperty("type"))return e.type;if("undefined"!=typeof OffscreenCanvas&&e instanceof OffscreenCanvas)return"OffscreenCanvas";if("undefined"!=typeof ImageBitmap&&e instanceof ImageBitmap)return"ImageBitmap";if("undefined"!=typeof ImageData&&e instanceof ImageData)return"ImageData"}return"Unknown"},getKernelTextureSize(e,t){let[n,r,i]=t,s=(n||1)*(r||1)*(i||1);return e.optimizeFloatMemory&&"single"===e.precision&&(n=s=Math.ceil(s/4)),r>1&&n*r===s?new Int32Array([n,r]):l.closestSquareDimensions(s)},closestSquareDimensions(e){const t=Math.sqrt(e);let n=Math.ceil(t),r=Math.floor(t);for(;n*rMath.floor((e+t-1)/t)*t,getDimensions(e,t){let n;if(l.isArray(e)){const t=[];let r=e;for(;l.isArray(r);)t.push(r.length),r=r[0];n=t.reverse()}else if(e instanceof s)n=e.output;else{if(!(e instanceof i))throw new Error(`Unknown dimensions of ${e}`);n=e.size}if(t)for(n=Array.from(n);n.length<3;)n.push(1);return new Int32Array(n)},flatten2dArrayTo(e,t){let n=0;for(let r=0;re.length>0?e.join(";\n")+";\n":"\n",warnDeprecated(e,t,n){n?console.warn(`You are using a deprecated ${e} "${t}". It has been replaced with "${n}". Fixing, but please upgrade as it will soon be removed.`):console.warn(`You are using a deprecated ${e} "${t}". It has been removed. Fixing, but please upgrade as it will soon be removed.`)},flipPixels:(e,t,n)=>{const r=n/2|0,i=4*t,s=new Uint8ClampedArray(4*t),a=e.slice(0);for(let e=0;ee.subarray(0,t),erect2DPackedFloat:(e,t,n)=>{const r=new Array(n);for(let i=0;i{const i=new Array(r);for(let s=0;se.subarray(0,t),erectMemoryOptimized2DFloat:(e,t,n)=>{const r=new Array(n);for(let i=0;i{const i=new Array(r);for(let s=0;s{const n=new Float32Array(t);let r=0;for(let i=0;i{const r=new Array(n);let i=0;for(let s=0;s{const i=new Array(r);let s=0;for(let a=0;a{const n=new Array(t),r=4*t;let i=0;for(let t=0;t{const r=new Array(n),i=4*t;for(let s=0;s{const i=4*t,s=new Array(r);for(let a=0;a{const n=new Array(t),r=4*t;let i=0;for(let t=0;t{const r=4*t,i=new Array(n);for(let s=0;s{const i=4*t,s=new Array(r);for(let a=0;a{const n=new Array(e),r=4*t;let i=0;for(let t=0;t{const r=4*t,i=new Array(n);for(let s=0;s{const i=4*t,s=new Array(r);for(let a=0;a{const{findDependency:n,thisLookup:i,doNotDefine:s}=t;let a=t.flattened;a||(a=t.flattened={});const o=r.parse(e),u=[];let h=0;const c=function e(t){if(Array.isArray(t)){const n=[];for(let r=0;rnull!==e));return r.length<1?"":`${t.kind} ${r.join(",")}`;case"VariableDeclarator":if(t.init.object&&"ThisExpression"===t.init.object.type){return i(t.init.property.name,!0)?`${t.id.name} = ${e(t.init)}`:null}return`${t.id.name} = ${e(t.init)}`;case"CallExpression":if("subarray"===t.callee.property.name)return`${e(t.callee.object)}.${e(t.callee.property)}(${t.arguments.map((t=>e(t))).join(", ")})`;if("gl"===t.callee.object.name||"context"===t.callee.object.name)return`${e(t.callee.object)}.${e(t.callee.property)}(${t.arguments.map((t=>e(t))).join(", ")})`;if("ThisExpression"===t.callee.object.type)return u.push(n("this",t.callee.property.name)),`${t.callee.property.name}(${t.arguments.map((t=>e(t))).join(", ")})`;if(t.callee.object.name){const r=n(t.callee.object.name,t.callee.property.name);return null===r?`${t.callee.object.name}.${t.callee.property.name}(${t.arguments.map((t=>e(t))).join(", ")})`:(u.push(r),`${t.callee.property.name}(${t.arguments.map((t=>e(t))).join(", ")})`)}if("MemberExpression"===t.callee.object.type)return`${e(t.callee.object)}.${t.callee.property.name}(${t.arguments.map((t=>e(t))).join(", ")})`;throw new Error("unknown ast.callee");case"ReturnStatement":return`return ${e(t.argument)}`;case"BinaryExpression":return`(${e(t.left)}${t.operator}${e(t.right)})`;case"UnaryExpression":return t.prefix?`${t.operator} ${e(t.argument)}`:`${e(t.argument)} ${t.operator}`;case"ExpressionStatement":return`${e(t.expression)}`;case"SequenceExpression":return`(${e(t.expressions)})`;case"ArrowFunctionExpression":return`(${t.params.map(e).join(", ")}) => ${e(t.body)}`;case"Literal":return t.raw;case"Identifier":return t.name;case"MemberExpression":return"ThisExpression"===t.object.type?i(t.property.name):t.computed?`${e(t.object)}[${e(t.property)}]`:e(t.object)+"."+e(t.property);case"ThisExpression":return"this";case"NewExpression":return`new ${e(t.callee)}(${t.arguments.map((t=>e(t))).join(", ")})`;case"ForStatement":return`for (${e(t.init)};${e(t.test)};${e(t.update)}) ${e(t.body)}`;case"AssignmentExpression":return`${e(t.left)}${t.operator}${e(t.right)}`;case"UpdateExpression":return`${e(t.argument)}${t.operator}`;case"IfStatement":return`if (${e(t.test)}) ${e(t.consequent)}`;case"ThrowStatement":return`throw ${e(t.argument)}`;case"ObjectPattern":return t.properties.map(e).join(", ");case"ArrayPattern":return t.elements.map(e).join(", ");case"DebuggerStatement":return"debugger;";case"ConditionalExpression":return`${e(t.test)}?${e(t.consequent)}:${e(t.alternate)}`;case"Property":if("init"===t.kind)return e(t.key)}throw new Error(`unhandled ast.type of ${t.type}`)}(o);if(u.length>0){const e=[];for(let n=0;n{if("VariableDeclaration"!==e.type)throw new Error('Ast is not of type "VariableDeclaration"');const t=[];for(let n=0;n{const n=e.createKernel((function(e){return 255*e[this.thread.y][this.thread.x].r}),{output:[t.width,t.height],precision:"unsigned",argumentTypes:{a:"HTMLImage"}}),r=e.createKernel((function(e){return 255*e[this.thread.y][this.thread.x].g}),{output:[t.width,t.height],precision:"unsigned",argumentTypes:{a:"HTMLImage"}}),i=e.createKernel((function(e){return 255*e[this.thread.y][this.thread.x].b}),{output:[t.width,t.height],precision:"unsigned",argumentTypes:{a:"HTMLImage"}}),s=e.createKernel((function(e){return 255*e[this.thread.y][this.thread.x].a}),{output:[t.width,t.height],precision:"unsigned",argumentTypes:{a:"HTMLImage"}}),a=[n(t),r(t),i(t),s(t)];return a.rKernel=n,a.gKernel=r,a.bKernel=i,a.aKernel=s,a.gpu=e,a},splitRGBAToCanvases:(e,t,n,r)=>{const i=e.createKernel((function(e){const t=e[this.thread.y][this.thread.x];this.color(t.r/255,0,0,255)}),{output:[n,r],graphical:!0,argumentTypes:{v:"Array2D(4)"}});i(t);const s=e.createKernel((function(e){const t=e[this.thread.y][this.thread.x];this.color(0,t.g/255,0,255)}),{output:[n,r],graphical:!0,argumentTypes:{v:"Array2D(4)"}});s(t);const a=e.createKernel((function(e){const t=e[this.thread.y][this.thread.x];this.color(0,0,t.b/255,255)}),{output:[n,r],graphical:!0,argumentTypes:{v:"Array2D(4)"}});a(t);const o=e.createKernel((function(e){const t=e[this.thread.y][this.thread.x];this.color(255,255,255,t.a/255)}),{output:[n,r],graphical:!0,argumentTypes:{v:"Array2D(4)"}});return o(t),[i.canvas,s.canvas,a.canvas,o.canvas]},getMinifySafeName:e=>{try{const t=r.parse(`const value = ${e.toString()}`),{init:n}=t.body[0].declarations[0];return n.body.name||n.body.body[0].argument.name}catch(e){throw new Error("Unrecognized function type. Please use `() => yourFunctionVariableHere` or function() { return yourFunctionVariableHere; }")}},sanitizeName:function(e){return h.test(e)&&(e=e.replace(h,"S_S")),c.test(e)?e=e.replace(c,"U_U"):p.test(e)&&(e=e.replace(p,"u_u")),e}},h=/\$/,c=/__/,p=/_/,d=l.getSystemEndianness();t.exports={utils:l}},{"./input":110,"./texture":113,acorn:1}]},{},[107])(107)})); \ No newline at end of file diff --git a/examples/advanced-typescript.ts b/examples/advanced-typescript.ts index fa837224..c7e824b1 100644 --- a/examples/advanced-typescript.ts +++ b/examples/advanced-typescript.ts @@ -16,20 +16,24 @@ import { IKernelFunctionThis, IConstantsThis, KernelOutput, - ISubKernelsResults -} from '../src'; + ISubKernelsResults, +} from '..'; const gpu = new GPU(); interface IConstants extends IConstantsThis { - rotation: number, + rotation: number; } interface IThis extends IKernelFunctionThis { - constants: IConstants, + constants: IConstants; } -function kernelFunction(this: IThis, degrees: number, divisors: [number, number]): [number, number] { +function kernelFunction( + this: IThis, + degrees: number, + divisors: [number, number] +): [number, number] { const bounds = subKernel(this.constants.rotation * degrees); return [bounds[0] / divisors[0], bounds[1] / divisors[1]]; } @@ -42,9 +46,13 @@ interface IKernelMapResult extends ISubKernelsResults { test: KernelOutput; } -const kernelMap = gpu.createKernelMap>({ - test: subKernel, -}, kernelFunction) +const kernelMap = gpu + .createKernelMap>( + { + test: subKernel, + }, + kernelFunction + ) .setConstants({ rotation: 45, }) diff --git a/examples/cat-image/index.html b/examples/cat-image/index.html index 0c6842ce..b77bca90 100644 --- a/examples/cat-image/index.html +++ b/examples/cat-image/index.html @@ -1,69 +1,77 @@ - - - Cat image with GPU.js - - - -

Image to GPU.js from https://observablehq.com/@fil/image-to-gpu

-
- - + + +

+ Image to GPU.js from + https://observablehq.com/@fil/image-to-gpu +

+
+ + + const logFps = document.querySelector('#log-fps'); + const image = new Image(); + image.src = './cat.jpg'; + image.onload = () => { + const array = imageToArray(image); + const render = new GPU({ mode: 'gpu' }) + .createKernel(kernel) + .setConstants({ w: image.width, h: image.height }) + .setOutput([image.width, image.height]) + .setGraphical(true); + const canvas = render.canvas; + document.body.appendChild(canvas); + let lastCalledTime; + let fps; + function callRender() { + const wobble = 14 * Math.sin(Date.now() / 400); + render(array, wobble); + const delta = (Date.now() - lastCalledTime) / 1000; + lastCalledTime = Date.now(); + fps = 1 / delta; + logFps.innerHTML = fps.toFixed(0) + ' FPS'; + window.requestAnimationFrame(() => { + callRender(); + }); + } + callRender(); + }; + diff --git a/examples/fluid.html b/examples/fluid.html index 2b3fd1ba..6f1eb5ad 100644 --- a/examples/fluid.html +++ b/examples/fluid.html @@ -1,43 +1,44 @@ - - - SSPS - Chadams Studios (slightly upgraded) - - + + - + + + - - - diff --git a/examples/internal-variable-precision.html b/examples/internal-variable-precision.html index 0cf6ee42..fc2b5e9e 100644 --- a/examples/internal-variable-precision.html +++ b/examples/internal-variable-precision.html @@ -1,52 +1,52 @@ - - - GPU.js Internal Variable Precision - - -

GPU.js Internal variable precision:

- - - + + requestAnimationFrame(render); + diff --git a/examples/json-saving.js b/examples/json-saving.js index d9286ab5..3dbc4fc5 100644 --- a/examples/json-saving.js +++ b/examples/json-saving.js @@ -1,9 +1,12 @@ -const { GPU } = require('../src'); +const { GPU } = require('..'); const gpu1 = new GPU(); -const kernel1 = gpu1.createKernel(function(value) { - return value * 100; -}, { output: [1] }); +const kernel1 = gpu1.createKernel( + function (value) { + return value * 100; + }, + { output: [1] } +); const resultFromRegularKernel = kernel1(42); const json = kernel1.toJSON(); @@ -14,4 +17,3 @@ const gpu2 = new GPU(); const kernel2 = gpu2.createKernel(json); const resultFromJsonKernel = kernel2(42); console.log(resultFromJsonKernel); - diff --git a/examples/mandelbrot-set.html b/examples/mandelbrot-set.html index ca484e1a..9d60edf8 100644 --- a/examples/mandelbrot-set.html +++ b/examples/mandelbrot-set.html @@ -1,123 +1,133 @@ - - - -
Left click to zoom in, right click to zoom out.
- - + + +
Left click to zoom in, right click to zoom out.
+ + + window.requestAnimationFrame(render); + diff --git a/examples/mandelbulb.html b/examples/mandelbulb.html index 5b93c642..bb5c5658 100644 --- a/examples/mandelbulb.html +++ b/examples/mandelbulb.html @@ -1,587 +1,719 @@ - - - - - Frakal - - - -
- -
-

Mandelbulb - Real-time 3d fractal
in Javascript

- Kamil Kiełczewski Airavana -
-
Instruction
-
Click on picture and move mouse around
- A S D W E C keys for change view poin position
- Push ESC to stop move and unlock mouse + + + + + Frakal + + + +
+ +
+

+ Mandelbulb - Real-time 3d fractal
+ in Javascript +

+ Kamil Kiełczewski Airavana +
+
Instruction
+
+ Click on picture and + move mouse around
+ A S D W E C keys for change view poin + position
+ Push ESC to stop move and unlock mouse +
+
+
+
Calculate Light
+
+ +
+
+
+
+ Level of Details (and camera speed)
+ Mouse whell or + +/- keys +
+
+ +
+
+
-
-
Calculate Light
-
-
-
-
- Level of Details (and camera speed)
- Mouse whell or +/- keys + + - - + // ---------------------------------------------------- + // + // Main + // + // ---------------------------------------------------- + let raytracerParams = new RaytracerParams(); + let tmpMouseWhellY = -3000; + let locked = false; + let start; + refreshScreenSize(); + //let raytracer = initFractalGPU(raytracerParams); + initGui(raytracerParams); + + window.requestAnimationFrame(refreshWindow); + + diff --git a/examples/parallel-raytracer.html b/examples/parallel-raytracer.html index 59c0fbce..d4e06917 100644 --- a/examples/parallel-raytracer.html +++ b/examples/parallel-raytracer.html @@ -1,1210 +1,1718 @@ - - - - GPU.js Raytracer - - - - -
-
-

A parallel raytracer built with TypeScript and GPU.js (WebGL/GLSL).

-

GitHub: http://github.com/jin/raytracer

+ span.canvas { + padding-left: 2px; + padding-right: 2px; + } + + + +
+
+

+ A parallel raytracer built with TypeScript and + GPU.js (WebGL/GLSL). +

+

+ GitHub: + http://github.com/jin/raytracer +

-

Press W, A, S, D to move the camera around.

+

Press W, A, S, D to move the camera around.

-

-

Current mode

- GPU - -

-

-

FPS

Loading.. - -

-

-

Number of spheres

- 4 -

+

+ Current mode + GPU + +

+

+ FPSLoading.. + +

+

+ Number of spheres + 4 + +

-

-

Grid dimension

- 2 -

-

- - -

- The canvas is 640px by 640px. Each canvas object is controlled by a single GPU.js kernel and a single thread is spawned for each pixel to compute the color of the pixel. -

+

+ Grid dimension + 2 + +

+
+ + +

+ The canvas is 640px by 640px. Each canvas object is controlled by a + single GPU.js kernel and a single thread is spawned for each pixel + to compute the color of the pixel. +

-

- Increase the dimensions of the grid to break the canvas up into tiles, so that there are multiple kernels controlling multiple tiles. With this approach, the kernels will run sequentially, computing one canvas after another.
-

-

+

+ Increase the dimensions of the grid to break the canvas up into + tiles, so that there are multiple kernels controlling multiple + tiles. With this approach, the kernels will run sequentially, + computing one canvas after another.
+

+
-

-

Benchmark

-
- +
+ Benchmark +
+ +
+ Benchmark the performance of the parallelized GPU and sequential CPU + kernels. This will render 30 frames each and compute min, max, median + frame rendering durations, and speedups.
+
+
+
+
+
- Benchmark the performance of the parallelized GPU and sequential CPU kernels. - This will render 30 frames each and compute min, max, median frame rendering durations, and speedups.
-

-
-
-
-
-
- - - - + - + return [gpuKernels, cpuKernels]; + }; + var addFunctions = function (gpu, functions) { + return functions.forEach(function (f) { + return gpu.addFunction(f); + }); + }; + var scene = Scene.generateScene(); + var _a = generateKernels(kernelDimension, scene), + gpuKernels = _a[0], + cpuKernels = _a[1]; + var renderLoop = renderer(gpuKernels, cpuKernels, scene); + window.onload = renderLoop; + + diff --git a/examples/random.html b/examples/random.html index 0ef1b50c..4489b870 100644 --- a/examples/random.html +++ b/examples/random.html @@ -1,66 +1,69 @@ - - - GPU.js Random Examples - - -

CPU Random

- -

WebGL1 Random

- -

WebGL2 Random

- - - - + + requestAnimationFrame(draw); + diff --git a/examples/raster-globe/index.html b/examples/raster-globe/index.html index def70c16..8f10131b 100644 --- a/examples/raster-globe/index.html +++ b/examples/raster-globe/index.html @@ -1,135 +1,143 @@ - - - Raster projection with GPU.js - - - -

Raster projection with GPU.js from https://observablehq.com/d/b70d084526a1a764

-
- - + + +

+ Raster projection with GPU.js from + https://observablehq.com/d/b70d084526a1a764 +

+
+ + + // apply rotation + const rotation = applyRotation(rotate0, rotate1, rotate2, lambda, phi); + const lambdan = rotation[0]; + const phin = rotation[1]; + //var n = n0(lambda, phi, this.constants.srcw, this.constants.srch); + //this.color(pixels[n]/256, pixels[n+1]/256,pixels[n+2]/256,1); + const pixel = + pixels[pixely(phin, this.constants.srch)][ + pixelx(lambdan, this.constants.srcw) + ]; + this.color(pixel[0], pixel[1], pixel[2], 1); + } + }; + const gpu = new GPU(); + const logFps = document.querySelector('#log-fps'); + const image = new Image(); + image.src = './earth-map.jpg'; + image.onload = () => { + const w = 975; + const h = 975; + const render = gpu + .createKernel(kernel, { functions: [applyRotation, frac] }) + .setConstants({ w, h, srcw: image.width, srch: image.height }) + .setOutput([w, h]) + .setTactic('precision') + .setGraphical(true); + const canvas = render.canvas; + document.body.appendChild(canvas); + let lastCalledTime; + let fps; + function callRender() { + let r0 = (-Date.now() / 30) % 360, + r1 = 35 * Math.sin((-Date.now() / 1030) % 360), + r2 = 0, + scale = 0.49; + render(image, r0, r1, r2, scale); + delta = (Date.now() - lastCalledTime) / 1000; + lastCalledTime = Date.now(); + fps = 1 / delta; + logFps.innerHTML = fps.toFixed(0) + ' FPS'; + window.requestAnimationFrame(() => { + callRender(); + }); + } + callRender(); + }; + diff --git a/examples/raytracer.html b/examples/raytracer.html index 274d598a..e570f8ec 100644 --- a/examples/raytracer.html +++ b/examples/raytracer.html @@ -1,520 +1,678 @@ - - - - - GPU.js Raytracer - - - - - - -
-
-

- From https://staceytay.com/raytracer/. A simple ray tracer with Lambertian and specular reflection, - built with GPU.js. Read more - about ray tracing and GPU.js in - my blog - post. Code available - on GitHub. -

-
-
- - -
-
-
- -
-
- -
-
- fps -
-
-
- - + - + function showGPUCanvas() { + cpuCanvas.style.display = 'none'; + gpuCanvas.style.display = ''; + canvas = gpuCanvas; + } + + diff --git a/examples/simple-javascript.js b/examples/simple-javascript.js index 24123d25..2b5cf7d9 100644 --- a/examples/simple-javascript.js +++ b/examples/simple-javascript.js @@ -1,17 +1,21 @@ -const { GPU } = require('../src'); +const { GPU } = require('..'); const gpu = new GPU({ mode: 'gpu' }); // Look ma! I can javascript on my GPU! function kernelFunction(anInt, anArray, aNestedArray) { - const x = .25 + anInt + anArray[this.thread.x] + aNestedArray[this.thread.x][this.thread.y]; + const x = + 0.25 + + anInt + + anArray[this.thread.x] + + aNestedArray[this.thread.x][this.thread.y]; return x; } const kernel = gpu.createKernel(kernelFunction, { - output: [1] + output: [1], }); -const result = kernel(1, [.25], [[1.5]]); +const result = kernel(1, [0.25], [[1.5]]); console.log(result[0]); // 3 diff --git a/examples/simple-typescript.ts b/examples/simple-typescript.ts index a8ca3110..5f892513 100644 --- a/examples/simple-typescript.ts +++ b/examples/simple-typescript.ts @@ -1,16 +1,25 @@ -import { GPU, KernelFunction, IKernelRunShortcut } from '../src'; +import { GPU, KernelFunction, IKernelRunShortcut } from '..'; const gpu = new GPU({ mode: 'gpu' }); // Look ma! I can typescript on my GPU! -const kernelFunction: KernelFunction = function(anInt: number, anArray: number[], aNestedArray: number[][]) { - const x = .25 + anInt + anArray[this.thread.x] + aNestedArray[this.thread.x][this.thread.y]; +const kernelFunction: KernelFunction = function ( + anInt: number, + anArray: number[], + aNestedArray: number[][] +) { + const x = + 0.25 + + anInt + + anArray[this.thread.x] + + aNestedArray[this.thread.x][this.thread.y]; return x; }; -const kernel: IKernelRunShortcut = gpu.createKernel(kernelFunction) +const kernel: IKernelRunShortcut = gpu + .createKernel(kernelFunction) .setOutput([1]); -const result = kernel(1, [.25], [[1.5]]); +const result = kernel(1, [0.25], [[1.5]]); console.log(result[0]); // 3 diff --git a/examples/slow-fade.html b/examples/slow-fade.html index 4c2ea171..31328fe8 100644 --- a/examples/slow-fade.html +++ b/examples/slow-fade.html @@ -1,46 +1,46 @@ - - - Slow Fade - - -

Slow Fade

-
- -
- - - + + window.requestAnimationFrame(doDraw); + diff --git a/examples/video/index.html b/examples/video/index.html index 07b441d3..dcd7526a 100644 --- a/examples/video/index.html +++ b/examples/video/index.html @@ -1,101 +1,118 @@ - - - Video input with GPU.js - - - -

Video input (and output) with GPU.js

- -
-
-
-
-
-
- -
-
-

Video

- -
-
-

GPU.js Graphical Output 0 fps

-
-
- - + + +

Video input (and output) with GPU.js

+ +
+
+
+
+
+
+ +
+
+

Video

+ +
+
+

+ GPU.js Graphical Output 0 fps +

+
+
+ + - + render(); + return () => { + canvasParent.removeChild(kernel.canvas); + gpu.destroy(); + disposed = true; + }; + } + + function calcFPS() { + delta = (Date.now() - lastCalledTime) / 1000; + lastCalledTime = Date.now(); + fps = 1 / delta; + fpsNumber.innerHTML = fps.toFixed(0); + } + + diff --git a/gulpfile.js b/gulpfile.js deleted file mode 100644 index 587cd54c..00000000 --- a/gulpfile.js +++ /dev/null @@ -1,121 +0,0 @@ -const fs = require('fs'); -const gulp = require('gulp'); -const rename = require('gulp-rename'); -const header = require('gulp-header'); -const browserSync = require('browser-sync'); -const browserify = require('browserify'); -const replace = require('gulp-replace'); -const source = require('vinyl-source-stream'); -const buffer = require('vinyl-buffer'); -const path = require('path'); -const uglify = require('gulp-uglify-es').default; -const pkg = require('./package.json'); -const jsprettify = require('gulp-jsbeautifier'); -const stripComments = require('gulp-strip-comments'); -const merge = require('merge-stream'); -const { readDirDeepSync } = require('read-dir-deep'); - -gulp.task('build', () => { - const gpu = browserify('./src/browser.js', { standalone: 'GPU', browserField: false }) - .ignore('gl') - .bundle() - .pipe(source('gpu-browser.js')) - .pipe(buffer()) - .pipe(stripComments()) - .pipe(header(fs.readFileSync('./src/browser-header.txt', 'utf8'), { pkg : pkg })) - .pipe(gulp.dest('./dist')) - .on('error', console.error); - - const gpuCore = browserify('./src/browser.js', { standalone: 'GPU', browserField: false }) - .ignore('gl') - .ignore('acorn') - .bundle() - .pipe(source('gpu-browser-core.js')) - .pipe(buffer()) - .pipe(stripComments()) - .pipe(header(fs.readFileSync('./src/browser-header.txt', 'utf8'), { pkg : pkg })) - .pipe(gulp.dest('./dist')) - .on('error', console.error); - - return merge(gpu, gpuCore); -}); - -/// Minify the build script, after building it -gulp.task('minify', () => { - const gpu = gulp.src('dist/gpu-browser.js') - .pipe(uglify()) - .pipe(rename('gpu-browser.min.js')) - .pipe(header(fs.readFileSync('./src/browser-header.txt', 'utf8'), { pkg : pkg })) - .pipe(gulp.dest('./dist')) - .on('error', console.error); - - const gpuCore = gulp.src('dist/gpu-browser-core.js') - .pipe(uglify()) - .pipe(rename('gpu-browser-core.min.js')) - .pipe(header(fs.readFileSync('./src/browser-header.txt', 'utf8'), { pkg : pkg })) - .pipe(gulp.dest('./dist')) - .on('error', console.error); - - return merge(gpu, gpuCore); -}); - -/// The browser sync prototyping -gulp.task('bsync', () => { - // Syncs browser - browserSync.init({ - server: { - baseDir: './' - }, - open: true, - startPath: "./test/html/test-all.html", - // Makes it easier to test on external mobile devices - host: "0.0.0.0", - tunnel: true - }); - - // Detect change -> rebuild TS - gulp.watch(['src/**.js'], gulp.series('minify')); -}); - -/// Auto rebuild and host -gulp.task('default', gulp.series('minify','bsync')); - -/// Beautify source code -/// Use before merge request -gulp.task('beautify', () => { - return gulp.src(['src/**/*.js']) - .pipe(jsprettify({ - indent_size: 2, - indent_char: ' ', - indent_with_tabs: false, - eol: '\n', - brace_style: 'preserve-inline' - })) - .pipe(gulp.dest('src')); -}); - -gulp.task('build-tests', () => { - const folder = 'test'; - const testFile = 'all.html'; - try { - fs.unlinkSync(`${folder}/${testFile}`); - } catch (e) {} - const rootPath = path.resolve(process.cwd(), folder); - const warning = '\n'; - const files = readDirDeepSync(rootPath, { - patterns: [ - '**/*.js' - ], - ignore: [ - '*.js' - ] - }) - .map(file => file.replace(/^test\//, '')); - return gulp.src(`${folder}/all-template.html`) - .pipe(replace('{{test-files}}', warning + files.map(file => ``).join('\n'))) - .pipe(rename(testFile)) - .pipe(gulp.dest(folder)); -}); - -gulp.task('make', gulp.series('build', 'beautify', 'minify', 'build-tests')); - diff --git a/package-lock.json b/package-lock.json deleted file mode 100644 index 18b7784d..00000000 --- a/package-lock.json +++ /dev/null @@ -1,22020 +0,0 @@ -{ - "name": "gpu.js", - "version": "2.16.0", - "lockfileVersion": 2, - "requires": true, - "packages": { - "": { - "name": "gpu.js", - "version": "2.16.0", - "license": "MIT", - "dependencies": { - "acorn": "^7.1.1", - "gl": "^5.0.3", - "gl-wiretap": "^0.6.2", - "gpu-mock.js": "^1.3.0", - "webgpu": "^0.1.16" - }, - "devDependencies": { - "benchmark": "^2.1.4", - "browser-sync": "^2.26.7", - "browserify": "^17.0.0", - "c8": "^7.12.0", - "gulp": "^4.0.0", - "gulp-concat": "^2.6.0", - "gulp-header": "^1.7.1", - "gulp-jsbeautifier": "^2.1.0", - "gulp-rename": "^1.2.2", - "gulp-replace": "^1.0.0", - "gulp-strip-comments": "^2.4.5", - "gulp-uglify-es": "^3.0.0", - "merge-stream": "^1.0.1", - "qunit": "^2.9.1", - "read-dir-deep": "^7.0.1", - "sinon": "^7.3.2", - "vinyl-buffer": "^1.0.0", - "vinyl-source-stream": "^2.0.0" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/@bcoe/v8-coverage": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz", - "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==", - "dev": true - }, - "node_modules/@gar/promisify": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/@gar/promisify/-/promisify-1.1.3.tgz", - "integrity": "sha512-k2Ty1JcVojjJFwrg/ThKi2ujJ7XNLYaFGNB/bWT9wGR+oSMJHMa5w+CUq6p/pVrKeNNgA7pCqEcjSnHVoqJQFw==" - }, - "node_modules/@istanbuljs/schema": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", - "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/@jridgewell/gen-mapping": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz", - "integrity": "sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A==", - "dev": true, - "dependencies": { - "@jridgewell/set-array": "^1.0.1", - "@jridgewell/sourcemap-codec": "^1.4.10", - "@jridgewell/trace-mapping": "^0.3.9" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/resolve-uri": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz", - "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==", - "dev": true, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/set-array": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", - "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", - "dev": true, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/source-map": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.2.tgz", - "integrity": "sha512-m7O9o2uR8k2ObDysZYzdfhb08VuEml5oWGiosa1VdaPZ/A6QyPkAJuwN0Q1lhULOf6B7MtQmHENS743hWtCrgw==", - "dev": true, - "dependencies": { - "@jridgewell/gen-mapping": "^0.3.0", - "@jridgewell/trace-mapping": "^0.3.9" - } - }, - "node_modules/@jridgewell/sourcemap-codec": { - "version": "1.4.14", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz", - "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==", - "dev": true - }, - "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.17", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.17.tgz", - "integrity": "sha512-MCNzAp77qzKca9+W/+I0+sEpaUnZoeasnghNeVc41VZCEKaCH73Vq3BZZ/SzWIgrqE4H4ceI+p+b6C0mHf9T4g==", - "dev": true, - "dependencies": { - "@jridgewell/resolve-uri": "3.1.0", - "@jridgewell/sourcemap-codec": "1.4.14" - } - }, - "node_modules/@nodelib/fs.scandir": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.1.tgz", - "integrity": "sha512-NT/skIZjgotDSiXs0WqYhgcuBKhUMgfekCmCGtkUAiLqZdOnrdjmZr9wRl3ll64J9NF79uZ4fk16Dx0yMc/Xbg==", - "dev": true, - "dependencies": { - "@nodelib/fs.stat": "2.0.1", - "run-parallel": "^1.1.9" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@nodelib/fs.stat": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.1.tgz", - "integrity": "sha512-+RqhBlLn6YRBGOIoVYthsG0J9dfpO79eJyN7BYBkZJtfqrBwf2KK+rD/M/yjZR6WBmIhAgOV7S60eCgaSWtbFw==", - "dev": true, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@nodelib/fs.walk": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.2.tgz", - "integrity": "sha512-J/DR3+W12uCzAJkw7niXDcqcKBg6+5G5Q/ZpThpGNzAUz70eOR6RV4XnnSN01qHZiVl0eavoxJsBypQoKsV2QQ==", - "dev": true, - "dependencies": { - "@nodelib/fs.scandir": "2.1.1", - "fastq": "^1.6.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@npmcli/fs": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@npmcli/fs/-/fs-2.1.0.tgz", - "integrity": "sha512-DmfBvNXGaetMxj9LTp8NAN9vEidXURrf5ZTslQzEAi/6GbW+4yjaLFQc6Tue5cpZ9Frlk4OBo/Snf1Bh/S7qTQ==", - "dependencies": { - "@gar/promisify": "^1.1.3", - "semver": "^7.3.5" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/@npmcli/fs/node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@npmcli/fs/node_modules/semver": { - "version": "7.3.7", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz", - "integrity": "sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==", - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@npmcli/move-file": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@npmcli/move-file/-/move-file-2.0.0.tgz", - "integrity": "sha512-UR6D5f4KEGWJV6BGPH3Qb2EtgH+t+1XQ1Tt85c7qicN6cezzuHPdZwwAxqZr4JLtnQu0LZsTza/5gmNmSl8XLg==", - "deprecated": "This functionality has been moved to @npmcli/fs", - "dependencies": { - "mkdirp": "^1.0.4", - "rimraf": "^3.0.2" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/@npmcli/move-file/node_modules/mkdirp": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", - "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", - "bin": { - "mkdirp": "bin/cmd.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@sinonjs/commons": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.4.0.tgz", - "integrity": "sha512-9jHK3YF/8HtJ9wCAbG+j8cD0i0+ATS9A7gXFqS36TblLPNy6rEEc+SB0imo91eCboGaBYGV/MT1/br/J+EE7Tw==", - "dev": true, - "dependencies": { - "type-detect": "4.0.8" - } - }, - "node_modules/@sinonjs/formatio": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/@sinonjs/formatio/-/formatio-3.2.1.tgz", - "integrity": "sha512-tsHvOB24rvyvV2+zKMmPkZ7dXX6LSLKZ7aOtXY6Edklp0uRcgGpOsQTTGTcWViFyx4uhWc6GV8QdnALbIbIdeQ==", - "dev": true, - "dependencies": { - "@sinonjs/commons": "^1", - "@sinonjs/samsam": "^3.1.0" - } - }, - "node_modules/@sinonjs/samsam": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/@sinonjs/samsam/-/samsam-3.3.2.tgz", - "integrity": "sha512-ILO/rR8LfAb60Y1Yfp9vxfYAASK43NFC2mLzpvLUbCQY/Qu8YwReboseu8aheCEkyElZF2L2T9mHcR2bgdvZyA==", - "dev": true, - "dependencies": { - "@sinonjs/commons": "^1.0.2", - "array-from": "^2.1.1", - "lodash": "^4.17.11" - } - }, - "node_modules/@sinonjs/text-encoding": { - "version": "0.7.1", - "resolved": "https://registry.npmjs.org/@sinonjs/text-encoding/-/text-encoding-0.7.1.tgz", - "integrity": "sha512-+iTbntw2IZPb/anVDbypzfQa+ay64MW0Zo8aJ8gZPWMMK6/OubMVb6lUPMagqjOPnmtauXnFCACVl3O7ogjeqQ==", - "dev": true - }, - "node_modules/@socket.io/component-emitter": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@socket.io/component-emitter/-/component-emitter-3.1.0.tgz", - "integrity": "sha512-+9jVqKhRSpsc591z5vX+X5Yyw+he/HCB4iQ/RYxw35CEPaY1gnsNE43nf9n9AaYjAQrTiI/mOwKUKdUs9vf7Xg==", - "dev": true - }, - "node_modules/@tootallnate/once": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-2.0.0.tgz", - "integrity": "sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==", - "engines": { - "node": ">= 10" - } - }, - "node_modules/@types/cookie": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/@types/cookie/-/cookie-0.4.1.tgz", - "integrity": "sha512-XW/Aa8APYr6jSVVA1y/DEIZX0/GMKLEVekNG727R8cs56ahETkRAy/3DR7+fJyh7oUgGwNQaRfXCun0+KbWY7Q==", - "dev": true - }, - "node_modules/@types/cors": { - "version": "2.8.12", - "resolved": "https://registry.npmjs.org/@types/cors/-/cors-2.8.12.tgz", - "integrity": "sha512-vt+kDhq/M2ayberEtJcIN/hxXy1Pk+59g2FV/ZQceeaTyCtCucjL2Q7FXlFjtWn4n15KCr1NE2lNNFhp0lEThw==", - "dev": true - }, - "node_modules/@types/events": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@types/events/-/events-3.0.0.tgz", - "integrity": "sha512-EaObqwIvayI5a8dCzhFrjKzVwKLxjoG9T6Ppd5CEo07LRKfQ8Yokw54r5+Wq7FaBQ+yXRvQAYPrHwya1/UFt9g==", - "dev": true - }, - "node_modules/@types/glob": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/@types/glob/-/glob-7.1.1.tgz", - "integrity": "sha512-1Bh06cbWJUHMC97acuD6UMG29nMt0Aqz1vF3guLfG+kHHJhy3AyohZFFxYk2f7Q1SQIrNwvncxAE0N/9s70F2w==", - "dev": true, - "dependencies": { - "@types/events": "*", - "@types/minimatch": "*", - "@types/node": "*" - } - }, - "node_modules/@types/istanbul-lib-coverage": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.4.tgz", - "integrity": "sha512-z/QT1XN4K4KYuslS23k62yDIDLwLFkzxOuMplDtObz0+y7VqJCaO2o+SPwHCvLFZh7xazvvoor2tA/hPz9ee7g==", - "dev": true - }, - "node_modules/@types/minimatch": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.3.tgz", - "integrity": "sha512-tHq6qdbT9U1IRSGf14CL0pUlULksvY9OZ+5eEgl1N7t+OA3tGvNpxJCzuKQlsNgCVwbAs670L1vcVQi8j9HjnA==", - "dev": true - }, - "node_modules/@types/node": { - "version": "12.6.8", - "resolved": "https://registry.npmjs.org/@types/node/-/node-12.6.8.tgz", - "integrity": "sha512-aX+gFgA5GHcDi89KG5keey2zf0WfZk/HAQotEamsK2kbey+8yGKcson0hbK8E+v0NArlCJQCqMP161YhV6ZXLg==", - "dev": true - }, - "node_modules/abbrev": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", - "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==" - }, - "node_modules/accepts": { - "version": "1.3.7", - "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.7.tgz", - "integrity": "sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA==", - "dev": true, - "dependencies": { - "mime-types": "~2.1.24", - "negotiator": "0.6.2" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/acorn": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.1.1.tgz", - "integrity": "sha512-add7dgA5ppRPxCFJoAGfMDi7PIBXq1RtGo7BhbLaxwrXPOmw8gq48Y9ozT01hUKy9byMjlR20EJhu5zlkErEkg==", - "bin": { - "acorn": "bin/acorn" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/acorn-node": { - "version": "1.8.2", - "resolved": "https://registry.npmjs.org/acorn-node/-/acorn-node-1.8.2.tgz", - "integrity": "sha512-8mt+fslDufLYntIoPAaIMUe/lrbrehIiwmR3t2k9LljIzoigEPF27eLk2hy8zSGzmR/ogr7zbRKINMo1u0yh5A==", - "dev": true, - "dependencies": { - "acorn": "^7.0.0", - "acorn-walk": "^7.0.0", - "xtend": "^4.0.2" - } - }, - "node_modules/acorn-node/node_modules/acorn-walk": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-7.1.1.tgz", - "integrity": "sha512-wdlPY2tm/9XBr7QkKlq0WQVgiuGTX6YWPyRyBviSoScBuLfTVQhvwg6wJ369GJ/1nPfTLMfnrFIfjqVg6d+jQQ==", - "dev": true, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/agent-base": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", - "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", - "dependencies": { - "debug": "4" - }, - "engines": { - "node": ">= 6.0.0" - } - }, - "node_modules/agent-base/node_modules/debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "dependencies": { - "ms": "2.1.2" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/agent-base/node_modules/ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" - }, - "node_modules/agentkeepalive": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/agentkeepalive/-/agentkeepalive-4.2.1.tgz", - "integrity": "sha512-Zn4cw2NEqd+9fiSVWMscnjyQ1a8Yfoc5oBajLeo5w+YBHgDUcEBY2hS4YpTz6iN5f/2zQiktcuM6tS8x1p9dpA==", - "dependencies": { - "debug": "^4.1.0", - "depd": "^1.1.2", - "humanize-ms": "^1.2.1" - }, - "engines": { - "node": ">= 8.0.0" - } - }, - "node_modules/agentkeepalive/node_modules/debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "dependencies": { - "ms": "2.1.2" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/agentkeepalive/node_modules/ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" - }, - "node_modules/aggregate-error": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", - "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", - "dependencies": { - "clean-stack": "^2.0.0", - "indent-string": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "peer": true, - "dependencies": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/ansi-colors": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-1.1.0.tgz", - "integrity": "sha512-SFKX67auSNoVR38N3L+nvsPjOE0bybKTYbkf5tRvushrAPQ9V75huw0ZxBkKVeRU9kqH3d6HA4xTckbwZ4ixmA==", - "dev": true, - "dependencies": { - "ansi-wrap": "^0.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/ansi-cyan": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/ansi-cyan/-/ansi-cyan-0.1.1.tgz", - "integrity": "sha1-U4rlKK+JgvKK4w2G8vF0VtJgmHM=", - "dev": true, - "dependencies": { - "ansi-wrap": "0.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/ansi-gray": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/ansi-gray/-/ansi-gray-0.1.1.tgz", - "integrity": "sha1-KWLPVOyXksSFEKPetSRDaGHvclE=", - "dev": true, - "dependencies": { - "ansi-wrap": "0.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/ansi-red": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/ansi-red/-/ansi-red-0.1.1.tgz", - "integrity": "sha1-jGOPnRCAgAo1PJwoyKgcpHBdlGw=", - "dev": true, - "dependencies": { - "ansi-wrap": "0.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/ansi-styles": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", - "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/ansi-wrap": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/ansi-wrap/-/ansi-wrap-0.1.0.tgz", - "integrity": "sha1-qCJQ3bABXponyoLoLqYDu/pF768=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/anymatch": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", - "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", - "dev": true, - "dependencies": { - "micromatch": "^3.1.4", - "normalize-path": "^2.1.1" - } - }, - "node_modules/anymatch/node_modules/normalize-path": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", - "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", - "dev": true, - "dependencies": { - "remove-trailing-separator": "^1.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/append-buffer": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/append-buffer/-/append-buffer-1.0.2.tgz", - "integrity": "sha1-2CIM9GYIFSXv6lBhTz3mUU36WPE=", - "dev": true, - "dependencies": { - "buffer-equal": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/aproba": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/aproba/-/aproba-2.0.0.tgz", - "integrity": "sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ==" - }, - "node_modules/archy": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/archy/-/archy-1.0.0.tgz", - "integrity": "sha1-+cjBN1fMHde8N5rHeyxipcKGjEA=", - "dev": true - }, - "node_modules/are-we-there-yet": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-3.0.0.tgz", - "integrity": "sha512-0GWpv50YSOcLXaN6/FAKY3vfRbllXWV2xvfA/oKJF8pzFhWXPV+yjhJXDBbjscDYowv7Yw1A3uigpzn5iEGTyw==", - "dependencies": { - "delegates": "^1.0.0", - "readable-stream": "^3.6.0" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16" - } - }, - "node_modules/are-we-there-yet/node_modules/readable-stream": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", - "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", - "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/are-we-there-yet/node_modules/safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, - "node_modules/are-we-there-yet/node_modules/string_decoder": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", - "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", - "dependencies": { - "safe-buffer": "~5.2.0" - } - }, - "node_modules/arr-diff": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", - "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/arr-filter": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/arr-filter/-/arr-filter-1.1.2.tgz", - "integrity": "sha1-Q/3d0JHo7xGqTEXZzcGOLf8XEe4=", - "dev": true, - "dependencies": { - "make-iterator": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/arr-flatten": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz", - "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/arr-map": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/arr-map/-/arr-map-2.0.2.tgz", - "integrity": "sha1-Onc0X/wc814qkYJWAfnljy4kysQ=", - "dev": true, - "dependencies": { - "make-iterator": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/arr-union": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz", - "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/array-each": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/array-each/-/array-each-1.0.1.tgz", - "integrity": "sha1-p5SvDAWrF1KEbudTofIRoFugxE8=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/array-from": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/array-from/-/array-from-2.1.1.tgz", - "integrity": "sha1-z+nYwmYoudxa7MYqn12PHzUsEZU=", - "dev": true - }, - "node_modules/array-initial": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/array-initial/-/array-initial-1.1.0.tgz", - "integrity": "sha1-L6dLJnOTccOUe9enrcc74zSz15U=", - "dev": true, - "dependencies": { - "array-slice": "^1.0.0", - "is-number": "^4.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/array-initial/node_modules/is-number": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-4.0.0.tgz", - "integrity": "sha512-rSklcAIlf1OmFdyAqbnWTLVelsQ58uvZ66S/ZyawjWqIviTWCjg2PzVGw8WUA+nNuPTqb4wgA+NszrJ+08LlgQ==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/array-last": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/array-last/-/array-last-1.3.0.tgz", - "integrity": "sha512-eOCut5rXlI6aCOS7Z7kCplKRKyiFQ6dHFBem4PwlwKeNFk2/XxTrhRh5T9PyaEWGy/NHTZWbY+nsZlNFJu9rYg==", - "dev": true, - "dependencies": { - "is-number": "^4.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/array-last/node_modules/is-number": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-4.0.0.tgz", - "integrity": "sha512-rSklcAIlf1OmFdyAqbnWTLVelsQ58uvZ66S/ZyawjWqIviTWCjg2PzVGw8WUA+nNuPTqb4wgA+NszrJ+08LlgQ==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/array-slice": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/array-slice/-/array-slice-1.1.0.tgz", - "integrity": "sha512-B1qMD3RBP7O8o0H2KbrXDyB0IccejMF15+87Lvlor12ONPRHP6gTjXMNkt/d3ZuOGbAe66hFmaCfECI24Ufp6w==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/array-sort": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/array-sort/-/array-sort-1.0.0.tgz", - "integrity": "sha512-ihLeJkonmdiAsD7vpgN3CRcx2J2S0TiYW+IS/5zHBI7mKUq3ySvBdzzBfD236ubDBQFiiyG3SWCPc+msQ9KoYg==", - "dev": true, - "dependencies": { - "default-compare": "^1.0.0", - "get-value": "^2.0.6", - "kind-of": "^5.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/array-sort/node_modules/kind-of": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", - "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/array-union": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", - "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/array-unique": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", - "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/asn1": { - "version": "0.2.6", - "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.6.tgz", - "integrity": "sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ==", - "peer": true, - "dependencies": { - "safer-buffer": "~2.1.0" - } - }, - "node_modules/asn1.js": { - "version": "4.10.1", - "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-4.10.1.tgz", - "integrity": "sha512-p32cOF5q0Zqs9uBiONKYLm6BClCoBCM5O9JfeUSlnQLBTxYdTK+pW+nXflm8UkKd2UYlEbYz5qEi0JuZR9ckSw==", - "dev": true, - "dependencies": { - "bn.js": "^4.0.0", - "inherits": "^2.0.1", - "minimalistic-assert": "^1.0.0" - } - }, - "node_modules/assert": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/assert/-/assert-1.5.0.tgz", - "integrity": "sha512-EDsgawzwoun2CZkCgtxJbv392v4nbk9XDD06zI+kQYoBM/3RBWLlEyJARDOmhAAosBjWACEkKL6S+lIZtcAubA==", - "dev": true, - "dependencies": { - "object-assign": "^4.1.1", - "util": "0.10.3" - } - }, - "node_modules/assert-plus": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw==", - "peer": true, - "engines": { - "node": ">=0.8" - } - }, - "node_modules/assert/node_modules/inherits": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", - "integrity": "sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE=", - "dev": true - }, - "node_modules/assert/node_modules/util": { - "version": "0.10.3", - "resolved": "https://registry.npmjs.org/util/-/util-0.10.3.tgz", - "integrity": "sha1-evsa/lCAUkZInj23/g7TeTNqwPk=", - "dev": true, - "dependencies": { - "inherits": "2.0.1" - } - }, - "node_modules/assign-symbols": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz", - "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/async": { - "version": "2.6.4", - "resolved": "https://registry.npmjs.org/async/-/async-2.6.4.tgz", - "integrity": "sha512-mzo5dfJYwAn29PeiJ0zvwTo04zj8HDJj0Mn8TD7sno7q12prdbnasKJHhkm2c1LgrhlJ0teaea8860oxi51mGA==", - "dev": true, - "dependencies": { - "lodash": "^4.17.14" - } - }, - "node_modules/async-done": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/async-done/-/async-done-1.3.2.tgz", - "integrity": "sha512-uYkTP8dw2og1tu1nmza1n1CMW0qb8gWWlwqMmLb7MhBVs4BXrFziT6HXUd+/RlRA/i4H9AkofYloUbs1fwMqlw==", - "dev": true, - "dependencies": { - "end-of-stream": "^1.1.0", - "once": "^1.3.2", - "process-nextick-args": "^2.0.0", - "stream-exhaust": "^1.0.1" - }, - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/async-each": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/async-each/-/async-each-1.0.3.tgz", - "integrity": "sha512-z/WhQ5FPySLdvREByI2vZiTWwCnF0moMJ1hK9YQwDTHKh6I7/uSckMetoRGb5UBZPC1z0jlw+n/XCgjeH7y1AQ==", - "dev": true - }, - "node_modules/async-each-series": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/async-each-series/-/async-each-series-0.1.1.tgz", - "integrity": "sha512-p4jj6Fws4Iy2m0iCmI2am2ZNZCgbdgE+P8F/8csmn2vx7ixXrO2zGcuNsD46X5uZSVecmkEy/M06X2vG8KD6dQ==", - "dev": true, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/async-settle": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/async-settle/-/async-settle-1.0.0.tgz", - "integrity": "sha1-HQqRS7Aldb7IqPOnTlCA9yssDGs=", - "dev": true, - "dependencies": { - "async-done": "^1.2.2" - }, - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/asynckit": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", - "peer": true - }, - "node_modules/atob": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz", - "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==", - "dev": true, - "bin": { - "atob": "bin/atob.js" - }, - "engines": { - "node": ">= 4.5.0" - } - }, - "node_modules/available-typed-arrays": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz", - "integrity": "sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==", - "dev": true, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/aws-sign2": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", - "integrity": "sha512-08kcGqnYf/YmjoRhfxyu+CLxBjUtHLXLXX/vUfx9l2LYzG3c1m61nrpyFUZI6zeS+Li/wWMMidD9KgrqtGq3mA==", - "peer": true, - "engines": { - "node": "*" - } - }, - "node_modules/aws4": { - "version": "1.11.0", - "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.11.0.tgz", - "integrity": "sha512-xh1Rl34h6Fi1DC2WWKfxUTVqRsNnr6LsKz2+hfwDxQJWmrx8+c7ylaqBMcHfl1U1r2dsifOvKX3LQuLNZ+XSvA==", - "peer": true - }, - "node_modules/axios": { - "version": "0.21.4", - "resolved": "https://registry.npmjs.org/axios/-/axios-0.21.4.tgz", - "integrity": "sha512-ut5vewkiu8jjGBdqpM44XxjuCjq9LAKeHVmoVfHVzy8eHgxxq8SbAVQNovDA8mVi05kP0Ea/n/UzcSHcTJQfNg==", - "dev": true, - "dependencies": { - "follow-redirects": "^1.14.0" - } - }, - "node_modules/bach": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/bach/-/bach-1.2.0.tgz", - "integrity": "sha1-Szzpa/JxNPeaG0FKUcFONMO9mIA=", - "dev": true, - "dependencies": { - "arr-filter": "^1.1.1", - "arr-flatten": "^1.0.1", - "arr-map": "^2.0.0", - "array-each": "^1.0.0", - "array-initial": "^1.0.0", - "array-last": "^1.1.1", - "async-done": "^1.2.2", - "async-settle": "^1.0.0", - "now-and-later": "^2.0.0" - }, - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/balanced-match": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", - "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=" - }, - "node_modules/base": { - "version": "0.11.2", - "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz", - "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==", - "dev": true, - "dependencies": { - "cache-base": "^1.0.1", - "class-utils": "^0.3.5", - "component-emitter": "^1.2.1", - "define-property": "^1.0.0", - "isobject": "^3.0.1", - "mixin-deep": "^1.2.0", - "pascalcase": "^0.1.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/base/node_modules/define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", - "dev": true, - "dependencies": { - "is-descriptor": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/base/node_modules/is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "dev": true, - "dependencies": { - "kind-of": "^6.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/base/node_modules/is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "dev": true, - "dependencies": { - "kind-of": "^6.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/base/node_modules/is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "dev": true, - "dependencies": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/base64-js": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.3.0.tgz", - "integrity": "sha512-ccav/yGvoa80BQDljCxsmmQ3Xvx60/UpBIij5QN21W3wBi/hhIC9OoO+KLpu9IJTS9j4DRVJ3aDDF9cMSoa2lw==", - "dev": true - }, - "node_modules/base64id": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/base64id/-/base64id-2.0.0.tgz", - "integrity": "sha512-lGe34o6EHj9y3Kts9R4ZYs/Gr+6N7MCaMlIFA3F1R2O5/m7K06AxfSeO5530PEERE6/WyEg3lsuyw4GHlPZHog==", - "dev": true, - "engines": { - "node": "^4.5.0 || >= 5.9" - } - }, - "node_modules/batch": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz", - "integrity": "sha1-3DQxT05nkxgJP8dgJyUl+UvyXBY=", - "dev": true - }, - "node_modules/bcrypt-pbkdf": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", - "integrity": "sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w==", - "peer": true, - "dependencies": { - "tweetnacl": "^0.14.3" - } - }, - "node_modules/benchmark": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/benchmark/-/benchmark-2.1.4.tgz", - "integrity": "sha1-CfPeMckWQl1JjMLuVloOvzwqVik=", - "dev": true, - "dependencies": { - "lodash": "^4.17.4", - "platform": "^1.3.3" - } - }, - "node_modules/binary-extensions": { - "version": "1.13.1", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.13.1.tgz", - "integrity": "sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/binaryextensions": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/binaryextensions/-/binaryextensions-2.1.2.tgz", - "integrity": "sha512-xVNN69YGDghOqCCtA6FI7avYrr02mTJjOgB0/f1VPD3pJC8QEvjTKWc4epDx8AqxxA75NI0QpVM2gPJXUbE4Tg==", - "dev": true, - "engines": { - "node": ">=0.8" - } - }, - "node_modules/bindings": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.5.0.tgz", - "integrity": "sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==", - "dependencies": { - "file-uri-to-path": "1.0.0" - } - }, - "node_modules/bit-twiddle": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/bit-twiddle/-/bit-twiddle-1.0.2.tgz", - "integrity": "sha512-B9UhK0DKFZhoTFcfvAzhqsjStvGJp9vYWf3+6SNTtdSQnvIgfkHbgHrg/e4+TH71N2GDu8tpmCVoyfrL1d7ntA==" - }, - "node_modules/bl": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/bl/-/bl-1.2.3.tgz", - "integrity": "sha512-pvcNpa0UU69UT341rO6AYy4FVAIkUHuZXRIWbq+zHnsVcRzDDjIAhGuuYoi0d//cwIwtt4pkpKycWEfjdV+vww==", - "dev": true, - "dependencies": { - "readable-stream": "^2.3.5", - "safe-buffer": "^5.1.1" - } - }, - "node_modules/bl/node_modules/isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", - "dev": true - }, - "node_modules/bl/node_modules/readable-stream": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", - "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", - "dev": true, - "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "node_modules/bl/node_modules/string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, - "dependencies": { - "safe-buffer": "~5.1.0" - } - }, - "node_modules/bn.js": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", - "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", - "dev": true - }, - "node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/braces": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", - "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", - "dev": true, - "dependencies": { - "arr-flatten": "^1.1.0", - "array-unique": "^0.3.2", - "extend-shallow": "^2.0.1", - "fill-range": "^4.0.0", - "isobject": "^3.0.1", - "repeat-element": "^1.1.2", - "snapdragon": "^0.8.1", - "snapdragon-node": "^2.0.1", - "split-string": "^3.0.2", - "to-regex": "^3.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/braces/node_modules/extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "dependencies": { - "is-extendable": "^0.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/brorand": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz", - "integrity": "sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8=", - "dev": true - }, - "node_modules/browser-pack": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/browser-pack/-/browser-pack-6.1.0.tgz", - "integrity": "sha512-erYug8XoqzU3IfcU8fUgyHqyOXqIE4tUTTQ+7mqUjQlvnXkOO6OlT9c/ZoJVHYoAaqGxr09CN53G7XIsO4KtWA==", - "dev": true, - "dependencies": { - "combine-source-map": "~0.8.0", - "defined": "^1.0.0", - "JSONStream": "^1.0.3", - "safe-buffer": "^5.1.1", - "through2": "^2.0.0", - "umd": "^3.0.0" - }, - "bin": { - "browser-pack": "bin/cmd.js" - } - }, - "node_modules/browser-pack/node_modules/isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", - "dev": true - }, - "node_modules/browser-pack/node_modules/readable-stream": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", - "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", - "dev": true, - "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "node_modules/browser-pack/node_modules/string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, - "dependencies": { - "safe-buffer": "~5.1.0" - } - }, - "node_modules/browser-pack/node_modules/through2": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", - "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", - "dev": true, - "dependencies": { - "readable-stream": "~2.3.6", - "xtend": "~4.0.1" - } - }, - "node_modules/browser-resolve": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/browser-resolve/-/browser-resolve-2.0.0.tgz", - "integrity": "sha512-7sWsQlYL2rGLy2IWm8WL8DCTJvYLc/qlOnsakDac87SOoCd16WLsaAMdCiAqsTNHIe+SXfaqyxyo6THoWqs8WQ==", - "dev": true, - "dependencies": { - "resolve": "^1.17.0" - } - }, - "node_modules/browser-sync": { - "version": "2.27.10", - "resolved": "https://registry.npmjs.org/browser-sync/-/browser-sync-2.27.10.tgz", - "integrity": "sha512-xKm+6KJmJu6RuMWWbFkKwOCSqQOxYe3nOrFkKI5Tr/ZzjPxyU3pFShKK3tWnazBo/3lYQzN7fzjixG8fwJh1Xw==", - "dev": true, - "dependencies": { - "browser-sync-client": "^2.27.10", - "browser-sync-ui": "^2.27.10", - "bs-recipes": "1.3.4", - "bs-snippet-injector": "^2.0.1", - "chokidar": "^3.5.1", - "connect": "3.6.6", - "connect-history-api-fallback": "^1", - "dev-ip": "^1.0.1", - "easy-extender": "^2.3.4", - "eazy-logger": "3.1.0", - "etag": "^1.8.1", - "fresh": "^0.5.2", - "fs-extra": "3.0.1", - "http-proxy": "^1.18.1", - "immutable": "^3", - "localtunnel": "^2.0.1", - "micromatch": "^4.0.2", - "opn": "5.3.0", - "portscanner": "2.2.0", - "qs": "6.2.3", - "raw-body": "^2.3.2", - "resp-modifier": "6.0.2", - "rx": "4.1.0", - "send": "0.16.2", - "serve-index": "1.9.1", - "serve-static": "1.13.2", - "server-destroy": "1.0.1", - "socket.io": "^4.4.1", - "ua-parser-js": "1.0.2", - "yargs": "^17.3.1" - }, - "bin": { - "browser-sync": "dist/bin.js" - }, - "engines": { - "node": ">= 8.0.0" - } - }, - "node_modules/browser-sync-client": { - "version": "2.27.10", - "resolved": "https://registry.npmjs.org/browser-sync-client/-/browser-sync-client-2.27.10.tgz", - "integrity": "sha512-KCFKA1YDj6cNul0VsA28apohtBsdk5Wv8T82ClOZPZMZWxPj4Ny5AUbrj9UlAb/k6pdxE5HABrWDhP9+cjt4HQ==", - "dev": true, - "dependencies": { - "etag": "1.8.1", - "fresh": "0.5.2", - "mitt": "^1.1.3", - "rxjs": "^5.5.6", - "typescript": "^4.6.2" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/browser-sync-ui": { - "version": "2.27.10", - "resolved": "https://registry.npmjs.org/browser-sync-ui/-/browser-sync-ui-2.27.10.tgz", - "integrity": "sha512-elbJILq4Uo6OQv6gsvS3Y9vRAJlWu+h8j0JDkF0X/ua+3S6SVbbiWnZc8sNOFlG7yvVGIwBED3eaYQ0iBo1Dtw==", - "dev": true, - "dependencies": { - "async-each-series": "0.1.1", - "connect-history-api-fallback": "^1", - "immutable": "^3", - "server-destroy": "1.0.1", - "socket.io-client": "^4.4.1", - "stream-throttle": "^0.1.3" - } - }, - "node_modules/browser-sync/node_modules/anymatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz", - "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==", - "dev": true, - "dependencies": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/browser-sync/node_modules/binary-extensions": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", - "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/browser-sync/node_modules/braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "dev": true, - "dependencies": { - "fill-range": "^7.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/browser-sync/node_modules/chokidar": { - "version": "3.5.3", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", - "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", - "dev": true, - "funding": [ - { - "type": "individual", - "url": "https://paulmillr.com/funding/" - } - ], - "dependencies": { - "anymatch": "~3.1.2", - "braces": "~3.0.2", - "glob-parent": "~5.1.2", - "is-binary-path": "~2.1.0", - "is-glob": "~4.0.1", - "normalize-path": "~3.0.0", - "readdirp": "~3.6.0" - }, - "engines": { - "node": ">= 8.10.0" - }, - "optionalDependencies": { - "fsevents": "~2.3.2" - } - }, - "node_modules/browser-sync/node_modules/fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", - "dev": true, - "dependencies": { - "to-regex-range": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/browser-sync/node_modules/fsevents": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", - "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", - "dev": true, - "hasInstallScript": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" - } - }, - "node_modules/browser-sync/node_modules/glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, - "dependencies": { - "is-glob": "^4.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/browser-sync/node_modules/is-binary-path": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", - "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", - "dev": true, - "dependencies": { - "binary-extensions": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/browser-sync/node_modules/is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "dev": true, - "engines": { - "node": ">=0.12.0" - } - }, - "node_modules/browser-sync/node_modules/micromatch": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", - "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", - "dev": true, - "dependencies": { - "braces": "^3.0.2", - "picomatch": "^2.3.1" - }, - "engines": { - "node": ">=8.6" - } - }, - "node_modules/browser-sync/node_modules/qs": { - "version": "6.2.3", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.2.3.tgz", - "integrity": "sha1-HPyyXBCpsrSDBT/zn138kjOQjP4=", - "dev": true, - "engines": { - "node": ">=0.6" - } - }, - "node_modules/browser-sync/node_modules/readdirp": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", - "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", - "dev": true, - "dependencies": { - "picomatch": "^2.2.1" - }, - "engines": { - "node": ">=8.10.0" - } - }, - "node_modules/browser-sync/node_modules/to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "dev": true, - "dependencies": { - "is-number": "^7.0.0" - }, - "engines": { - "node": ">=8.0" - } - }, - "node_modules/browserify": { - "version": "17.0.0", - "resolved": "https://registry.npmjs.org/browserify/-/browserify-17.0.0.tgz", - "integrity": "sha512-SaHqzhku9v/j6XsQMRxPyBrSP3gnwmE27gLJYZgMT2GeK3J0+0toN+MnuNYDfHwVGQfLiMZ7KSNSIXHemy905w==", - "dev": true, - "dependencies": { - "assert": "^1.4.0", - "browser-pack": "^6.0.1", - "browser-resolve": "^2.0.0", - "browserify-zlib": "~0.2.0", - "buffer": "~5.2.1", - "cached-path-relative": "^1.0.0", - "concat-stream": "^1.6.0", - "console-browserify": "^1.1.0", - "constants-browserify": "~1.0.0", - "crypto-browserify": "^3.0.0", - "defined": "^1.0.0", - "deps-sort": "^2.0.1", - "domain-browser": "^1.2.0", - "duplexer2": "~0.1.2", - "events": "^3.0.0", - "glob": "^7.1.0", - "has": "^1.0.0", - "htmlescape": "^1.1.0", - "https-browserify": "^1.0.0", - "inherits": "~2.0.1", - "insert-module-globals": "^7.2.1", - "JSONStream": "^1.0.3", - "labeled-stream-splicer": "^2.0.0", - "mkdirp-classic": "^0.5.2", - "module-deps": "^6.2.3", - "os-browserify": "~0.3.0", - "parents": "^1.0.1", - "path-browserify": "^1.0.0", - "process": "~0.11.0", - "punycode": "^1.3.2", - "querystring-es3": "~0.2.0", - "read-only-stream": "^2.0.0", - "readable-stream": "^2.0.2", - "resolve": "^1.1.4", - "shasum-object": "^1.0.0", - "shell-quote": "^1.6.1", - "stream-browserify": "^3.0.0", - "stream-http": "^3.0.0", - "string_decoder": "^1.1.1", - "subarg": "^1.0.0", - "syntax-error": "^1.1.1", - "through2": "^2.0.0", - "timers-browserify": "^1.0.1", - "tty-browserify": "0.0.1", - "url": "~0.11.0", - "util": "~0.12.0", - "vm-browserify": "^1.0.0", - "xtend": "^4.0.0" - }, - "bin": { - "browserify": "bin/cmd.js" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/browserify-aes": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz", - "integrity": "sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==", - "dev": true, - "dependencies": { - "buffer-xor": "^1.0.3", - "cipher-base": "^1.0.0", - "create-hash": "^1.1.0", - "evp_bytestokey": "^1.0.3", - "inherits": "^2.0.1", - "safe-buffer": "^5.0.1" - } - }, - "node_modules/browserify-cipher": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/browserify-cipher/-/browserify-cipher-1.0.1.tgz", - "integrity": "sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w==", - "dev": true, - "dependencies": { - "browserify-aes": "^1.0.4", - "browserify-des": "^1.0.0", - "evp_bytestokey": "^1.0.0" - } - }, - "node_modules/browserify-des": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/browserify-des/-/browserify-des-1.0.2.tgz", - "integrity": "sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A==", - "dev": true, - "dependencies": { - "cipher-base": "^1.0.1", - "des.js": "^1.0.0", - "inherits": "^2.0.1", - "safe-buffer": "^5.1.2" - } - }, - "node_modules/browserify-rsa": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.0.1.tgz", - "integrity": "sha1-IeCr+vbyApzy+vsTNWenAdQTVSQ=", - "dev": true, - "dependencies": { - "bn.js": "^4.1.0", - "randombytes": "^2.0.1" - } - }, - "node_modules/browserify-sign": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.0.4.tgz", - "integrity": "sha1-qk62jl17ZYuqa/alfmMMvXqT0pg=", - "dev": true, - "dependencies": { - "bn.js": "^4.1.1", - "browserify-rsa": "^4.0.0", - "create-hash": "^1.1.0", - "create-hmac": "^1.1.2", - "elliptic": "^6.0.0", - "inherits": "^2.0.1", - "parse-asn1": "^5.0.0" - } - }, - "node_modules/browserify-zlib": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/browserify-zlib/-/browserify-zlib-0.2.0.tgz", - "integrity": "sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA==", - "dev": true, - "dependencies": { - "pako": "~1.0.5" - } - }, - "node_modules/browserify/node_modules/isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", - "dev": true - }, - "node_modules/browserify/node_modules/punycode": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", - "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=", - "dev": true - }, - "node_modules/browserify/node_modules/readable-stream": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", - "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", - "dev": true, - "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "node_modules/browserify/node_modules/readable-stream/node_modules/string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, - "dependencies": { - "safe-buffer": "~5.1.0" - } - }, - "node_modules/browserify/node_modules/string_decoder": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.2.0.tgz", - "integrity": "sha512-6YqyX6ZWEYguAxgZzHGL7SsCeGx3V2TtOTqZz1xSTSWnqsbWwbptafNyvf/ACquZUXV3DANr5BDIwNYe1mN42w==", - "dev": true, - "dependencies": { - "safe-buffer": "~5.1.0" - } - }, - "node_modules/browserify/node_modules/through2": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", - "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", - "dev": true, - "dependencies": { - "readable-stream": "~2.3.6", - "xtend": "~4.0.1" - } - }, - "node_modules/bs-recipes": { - "version": "1.3.4", - "resolved": "https://registry.npmjs.org/bs-recipes/-/bs-recipes-1.3.4.tgz", - "integrity": "sha1-DS1NSKcYyMBEdp/cT4lZLci2lYU=", - "dev": true - }, - "node_modules/bs-snippet-injector": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/bs-snippet-injector/-/bs-snippet-injector-2.0.1.tgz", - "integrity": "sha1-YbU5PxH1JVntEgaTEANDtu2wTdU=", - "dev": true - }, - "node_modules/buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.2.1.tgz", - "integrity": "sha512-c+Ko0loDaFfuPWiL02ls9Xd3GO3cPVmUobQ6t3rXNUk304u6hGq+8N/kFi+QEIKhzK3uwolVhLzszmfLmMLnqg==", - "dev": true, - "dependencies": { - "base64-js": "^1.0.2", - "ieee754": "^1.1.4" - } - }, - "node_modules/buffer-equal": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/buffer-equal/-/buffer-equal-1.0.0.tgz", - "integrity": "sha1-WWFrSYME1Var1GaWayLu2j7KX74=", - "dev": true, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/buffer-from": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", - "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==", - "dev": true - }, - "node_modules/buffer-xor": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz", - "integrity": "sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk=", - "dev": true - }, - "node_modules/builtin-status-codes": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz", - "integrity": "sha512-HpGFw18DgFWlncDfjTa2rcQ4W88O1mC8e8yZ2AvQY5KDaktSTwo+KRf6nHK6FRI5FyRyb/5T6+TSxfP7QyGsmQ==", - "dev": true - }, - "node_modules/bytes": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz", - "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==", - "dev": true, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/c8": { - "version": "7.12.0", - "resolved": "https://registry.npmjs.org/c8/-/c8-7.12.0.tgz", - "integrity": "sha512-CtgQrHOkyxr5koX1wEUmN/5cfDa2ckbHRA4Gy5LAL0zaCFtVWJS5++n+w4/sr2GWGerBxgTjpKeDclk/Qk6W/A==", - "dev": true, - "dependencies": { - "@bcoe/v8-coverage": "^0.2.3", - "@istanbuljs/schema": "^0.1.3", - "find-up": "^5.0.0", - "foreground-child": "^2.0.0", - "istanbul-lib-coverage": "^3.2.0", - "istanbul-lib-report": "^3.0.0", - "istanbul-reports": "^3.1.4", - "rimraf": "^3.0.2", - "test-exclude": "^6.0.0", - "v8-to-istanbul": "^9.0.0", - "yargs": "^16.2.0", - "yargs-parser": "^20.2.9" - }, - "bin": { - "c8": "bin/c8.js" - }, - "engines": { - "node": ">=10.12.0" - } - }, - "node_modules/c8/node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/c8/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/c8/node_modules/cliui": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", - "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", - "dev": true, - "dependencies": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", - "wrap-ansi": "^7.0.0" - } - }, - "node_modules/c8/node_modules/find-up": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", - "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", - "dev": true, - "dependencies": { - "locate-path": "^6.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/c8/node_modules/get-caller-file": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", - "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", - "dev": true, - "engines": { - "node": "6.* || 8.* || >= 10.*" - } - }, - "node_modules/c8/node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/c8/node_modules/path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/c8/node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/c8/node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/c8/node_modules/wrap-ansi": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, - "node_modules/c8/node_modules/y18n": { - "version": "5.0.8", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", - "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", - "dev": true, - "engines": { - "node": ">=10" - } - }, - "node_modules/c8/node_modules/yargs": { - "version": "16.2.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", - "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", - "dev": true, - "dependencies": { - "cliui": "^7.0.2", - "escalade": "^3.1.1", - "get-caller-file": "^2.0.5", - "require-directory": "^2.1.1", - "string-width": "^4.2.0", - "y18n": "^5.0.5", - "yargs-parser": "^20.2.2" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/cacache": { - "version": "16.1.1", - "resolved": "https://registry.npmjs.org/cacache/-/cacache-16.1.1.tgz", - "integrity": "sha512-VDKN+LHyCQXaaYZ7rA/qtkURU+/yYhviUdvqEv2LT6QPZU8jpyzEkEVAcKlKLt5dJ5BRp11ym8lo3NKLluEPLg==", - "dependencies": { - "@npmcli/fs": "^2.1.0", - "@npmcli/move-file": "^2.0.0", - "chownr": "^2.0.0", - "fs-minipass": "^2.1.0", - "glob": "^8.0.1", - "infer-owner": "^1.0.4", - "lru-cache": "^7.7.1", - "minipass": "^3.1.6", - "minipass-collect": "^1.0.2", - "minipass-flush": "^1.0.5", - "minipass-pipeline": "^1.2.4", - "mkdirp": "^1.0.4", - "p-map": "^4.0.0", - "promise-inflight": "^1.0.1", - "rimraf": "^3.0.2", - "ssri": "^9.0.0", - "tar": "^6.1.11", - "unique-filename": "^1.1.1" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/cacache/node_modules/brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/cacache/node_modules/glob": { - "version": "8.0.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-8.0.3.tgz", - "integrity": "sha512-ull455NHSHI/Y1FqGaaYFaLGkNMMJbavMrEGFXG/PGrg6y7sutWHUHrz6gy6WEBH6akM1M414dWKCNs+IhKdiQ==", - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^5.0.1", - "once": "^1.3.0" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/cacache/node_modules/lru-cache": { - "version": "7.12.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.12.0.tgz", - "integrity": "sha512-OIP3DwzRZDfLg9B9VP/huWBlpvbkmbfiBy8xmsXp4RPmE4A3MhwNozc5ZJ3fWnSg8fDcdlE/neRTPG2ycEKliw==", - "engines": { - "node": ">=12" - } - }, - "node_modules/cacache/node_modules/minimatch": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.0.tgz", - "integrity": "sha512-9TPBGGak4nHfGZsPBohm9AWg6NoT7QTCehS3BIJABslyZbzxfV78QM2Y6+i741OPZIafFAaiiEMh5OyIrJPgtg==", - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/cacache/node_modules/mkdirp": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", - "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", - "bin": { - "mkdirp": "bin/cmd.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/cache-base": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz", - "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==", - "dev": true, - "dependencies": { - "collection-visit": "^1.0.0", - "component-emitter": "^1.2.1", - "get-value": "^2.0.6", - "has-value": "^1.0.0", - "isobject": "^3.0.1", - "set-value": "^2.0.0", - "to-object-path": "^0.3.0", - "union-value": "^1.0.0", - "unset-value": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/cached-path-relative": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/cached-path-relative/-/cached-path-relative-1.1.0.tgz", - "integrity": "sha512-WF0LihfemtesFcJgO7xfOoOcnWzY/QHR4qeDqV44jPU3HTI54+LnfXK3SA27AVVGCdZFgjjFFaqUA9Jx7dMJZA==", - "dev": true - }, - "node_modules/call-bind": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", - "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", - "dev": true, - "dependencies": { - "function-bind": "^1.1.1", - "get-intrinsic": "^1.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/camelcase": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-3.0.0.tgz", - "integrity": "sha1-MvxLn82vhF/N9+c7uXysImHwqwo=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/caseless": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", - "integrity": "sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==", - "peer": true - }, - "node_modules/chalk": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", - "dev": true, - "dependencies": { - "ansi-styles": "^2.2.1", - "escape-string-regexp": "^1.0.2", - "has-ansi": "^2.0.0", - "strip-ansi": "^3.0.0", - "supports-color": "^2.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/chokidar": { - "version": "2.1.8", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.1.8.tgz", - "integrity": "sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg==", - "deprecated": "Chokidar 2 does not receive security updates since 2019. Upgrade to chokidar 3 with 15x fewer dependencies", - "dev": true, - "dependencies": { - "anymatch": "^2.0.0", - "async-each": "^1.0.1", - "braces": "^2.3.2", - "glob-parent": "^3.1.0", - "inherits": "^2.0.3", - "is-binary-path": "^1.0.0", - "is-glob": "^4.0.0", - "normalize-path": "^3.0.0", - "path-is-absolute": "^1.0.0", - "readdirp": "^2.2.1", - "upath": "^1.1.1" - }, - "optionalDependencies": { - "fsevents": "^1.2.7" - } - }, - "node_modules/chownr": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", - "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==", - "engines": { - "node": ">=10" - } - }, - "node_modules/cipher-base": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz", - "integrity": "sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==", - "dev": true, - "dependencies": { - "inherits": "^2.0.1", - "safe-buffer": "^5.0.1" - } - }, - "node_modules/class-utils": { - "version": "0.3.6", - "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz", - "integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==", - "dev": true, - "dependencies": { - "arr-union": "^3.1.0", - "define-property": "^0.2.5", - "isobject": "^3.0.0", - "static-extend": "^0.1.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/class-utils/node_modules/define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, - "dependencies": { - "is-descriptor": "^0.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/clean-stack": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", - "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", - "engines": { - "node": ">=6" - } - }, - "node_modules/cliui": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz", - "integrity": "sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0=", - "dev": true, - "dependencies": { - "string-width": "^1.0.1", - "strip-ansi": "^3.0.1", - "wrap-ansi": "^2.0.0" - } - }, - "node_modules/clone": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz", - "integrity": "sha1-G39Ln1kfHo+DZwQBYANFoCiHQ18=", - "dev": true, - "engines": { - "node": ">=0.8" - } - }, - "node_modules/clone-buffer": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/clone-buffer/-/clone-buffer-1.0.0.tgz", - "integrity": "sha1-4+JbIHrE5wGvch4staFnksrD3Fg=", - "dev": true, - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/clone-stats": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/clone-stats/-/clone-stats-1.0.0.tgz", - "integrity": "sha1-s3gt/4u1R04Yuba/D9/ngvh3doA=", - "dev": true - }, - "node_modules/cloneable-readable": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/cloneable-readable/-/cloneable-readable-1.1.3.tgz", - "integrity": "sha512-2EF8zTQOxYq70Y4XKtorQupqF0m49MBz2/yf5Bj+MHjvpG3Hy7sImifnqD6UA+TKYxeSV+u6qqQPawN5UvnpKQ==", - "dev": true, - "dependencies": { - "inherits": "^2.0.1", - "process-nextick-args": "^2.0.0", - "readable-stream": "^2.3.5" - } - }, - "node_modules/cloneable-readable/node_modules/isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", - "dev": true - }, - "node_modules/cloneable-readable/node_modules/readable-stream": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", - "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", - "dev": true, - "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "node_modules/cloneable-readable/node_modules/string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, - "dependencies": { - "safe-buffer": "~5.1.0" - } - }, - "node_modules/code-point-at": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", - "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/collection-map": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/collection-map/-/collection-map-1.0.0.tgz", - "integrity": "sha1-rqDwb40mx4DCt1SUOFVEsiVa8Yw=", - "dev": true, - "dependencies": { - "arr-map": "^2.0.2", - "for-own": "^1.0.0", - "make-iterator": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/collection-visit": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz", - "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=", - "dev": true, - "dependencies": { - "map-visit": "^1.0.0", - "object-visit": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "node_modules/color-support": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz", - "integrity": "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==", - "bin": { - "color-support": "bin.js" - } - }, - "node_modules/combine-source-map": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/combine-source-map/-/combine-source-map-0.8.0.tgz", - "integrity": "sha1-pY0N8ELBhvz4IqjoAV9UUNLXmos=", - "dev": true, - "dependencies": { - "convert-source-map": "~1.1.0", - "inline-source-map": "~0.6.0", - "lodash.memoize": "~3.0.3", - "source-map": "~0.5.3" - } - }, - "node_modules/combined-stream": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", - "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", - "peer": true, - "dependencies": { - "delayed-stream": "~1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/commander": { - "version": "2.20.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.0.tgz", - "integrity": "sha512-7j2y+40w61zy6YC2iRNpUe/NwhNyoXrYpHMrSunaMG64nRnaf96zO/KMQR4OyN/UnE5KLyEBnKHd4aG3rskjpQ==", - "dev": true - }, - "node_modules/component-emitter": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.2.1.tgz", - "integrity": "sha1-E3kY1teCg/ffemt8WmPhQOaUJeY=", - "dev": true - }, - "node_modules/concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" - }, - "node_modules/concat-stream": { - "version": "1.6.2", - "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", - "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", - "dev": true, - "engines": [ - "node >= 0.8" - ], - "dependencies": { - "buffer-from": "^1.0.0", - "inherits": "^2.0.3", - "readable-stream": "^2.2.2", - "typedarray": "^0.0.6" - } - }, - "node_modules/concat-stream/node_modules/isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", - "dev": true - }, - "node_modules/concat-stream/node_modules/readable-stream": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", - "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", - "dev": true, - "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "node_modules/concat-stream/node_modules/string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, - "dependencies": { - "safe-buffer": "~5.1.0" - } - }, - "node_modules/concat-with-sourcemaps": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/concat-with-sourcemaps/-/concat-with-sourcemaps-1.1.0.tgz", - "integrity": "sha512-4gEjHJFT9e+2W/77h/DS5SGUgwDaOwprX8L/gl5+3ixnzkVJJsZWDSelmN3Oilw3LNDZjZV0yqH1hLG3k6nghg==", - "dev": true, - "dependencies": { - "source-map": "^0.6.1" - } - }, - "node_modules/concat-with-sourcemaps/node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/config-chain": { - "version": "1.1.12", - "resolved": "https://registry.npmjs.org/config-chain/-/config-chain-1.1.12.tgz", - "integrity": "sha512-a1eOIcu8+7lUInge4Rpf/n4Krkf3Dd9lqhljRzII1/Zno/kRtUWnznPO3jOKBmTEktkt3fkxisUcivoj0ebzoA==", - "dev": true, - "dependencies": { - "ini": "^1.3.4", - "proto-list": "~1.2.1" - } - }, - "node_modules/connect": { - "version": "3.6.6", - "resolved": "https://registry.npmjs.org/connect/-/connect-3.6.6.tgz", - "integrity": "sha1-Ce/2xVr3I24TcTWnJXSFi2eG9SQ=", - "dev": true, - "dependencies": { - "debug": "2.6.9", - "finalhandler": "1.1.0", - "parseurl": "~1.3.2", - "utils-merge": "1.0.1" - }, - "engines": { - "node": ">= 0.10.0" - } - }, - "node_modules/connect-history-api-fallback": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-1.6.0.tgz", - "integrity": "sha512-e54B99q/OUoH64zYYRf3HBP5z24G38h5D3qXu23JGRoigpX5Ss4r9ZnDk3g0Z8uQC2x2lPaJ+UlWBc1ZWBWdLg==", - "dev": true, - "engines": { - "node": ">=0.8" - } - }, - "node_modules/connect/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/console-browserify": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.1.0.tgz", - "integrity": "sha1-8CQcRXMKn8YyOyBtvzjtx0HQuxA=", - "dev": true, - "dependencies": { - "date-now": "^0.1.4" - } - }, - "node_modules/console-control-strings": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", - "integrity": "sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==" - }, - "node_modules/constants-browserify": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/constants-browserify/-/constants-browserify-1.0.0.tgz", - "integrity": "sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U=", - "dev": true - }, - "node_modules/convert-source-map": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.1.3.tgz", - "integrity": "sha1-SCnId+n+SbMWHzvzZziI4gRpmGA=", - "dev": true - }, - "node_modules/cookie": { - "version": "0.4.2", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.2.tgz", - "integrity": "sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA==", - "dev": true, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/copy-descriptor": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz", - "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/copy-props": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/copy-props/-/copy-props-2.0.5.tgz", - "integrity": "sha512-XBlx8HSqrT0ObQwmSzM7WE5k8FxTV75h1DX1Z3n6NhQ/UYYAvInWYmG06vFt7hQZArE2fuO62aihiWIVQwh1sw==", - "dev": true, - "dependencies": { - "each-props": "^1.3.2", - "is-plain-object": "^5.0.0" - } - }, - "node_modules/copy-props/node_modules/is-plain-object": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-5.0.0.tgz", - "integrity": "sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/core-util-is": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" - }, - "node_modules/cors": { - "version": "2.8.5", - "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz", - "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==", - "dev": true, - "dependencies": { - "object-assign": "^4", - "vary": "^1" - }, - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/create-ecdh": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.3.tgz", - "integrity": "sha512-GbEHQPMOswGpKXM9kCWVrremUcBmjteUaQ01T9rkKCPDXfUHX0IoP9LpHYo2NPFampa4e+/pFDc3jQdxrxQLaw==", - "dev": true, - "dependencies": { - "bn.js": "^4.1.0", - "elliptic": "^6.0.0" - } - }, - "node_modules/create-hash": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz", - "integrity": "sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==", - "dev": true, - "dependencies": { - "cipher-base": "^1.0.1", - "inherits": "^2.0.1", - "md5.js": "^1.3.4", - "ripemd160": "^2.0.1", - "sha.js": "^2.4.0" - } - }, - "node_modules/create-hmac": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz", - "integrity": "sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==", - "dev": true, - "dependencies": { - "cipher-base": "^1.0.3", - "create-hash": "^1.1.0", - "inherits": "^2.0.1", - "ripemd160": "^2.0.0", - "safe-buffer": "^5.0.1", - "sha.js": "^2.4.8" - } - }, - "node_modules/cross-spawn": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.1.tgz", - "integrity": "sha512-u7v4o84SwFpD32Z8IIcPZ6z1/ie24O6RU3RbtL5Y316l3KuHVPx9ItBgWQ6VlfAFnRnTtMUrsQ9MUUTuEZjogg==", - "dev": true, - "dependencies": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/cross-spawn/node_modules/which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "dev": true, - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "node-which": "bin/node-which" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/crypto-browserify": { - "version": "3.12.0", - "resolved": "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.12.0.tgz", - "integrity": "sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg==", - "dev": true, - "dependencies": { - "browserify-cipher": "^1.0.0", - "browserify-sign": "^4.0.0", - "create-ecdh": "^4.0.0", - "create-hash": "^1.1.0", - "create-hmac": "^1.1.0", - "diffie-hellman": "^5.0.0", - "inherits": "^2.0.1", - "pbkdf2": "^3.0.3", - "public-encrypt": "^4.0.0", - "randombytes": "^2.0.0", - "randomfill": "^1.0.3" - }, - "engines": { - "node": "*" - } - }, - "node_modules/d": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/d/-/d-1.0.1.tgz", - "integrity": "sha512-m62ShEObQ39CfralilEQRjH6oAMtNCV1xJyEx5LpRYUVN+EviphDgUc/F3hnYbADmkiNs67Y+3ylmlG7Lnu+FA==", - "dev": true, - "dependencies": { - "es5-ext": "^0.10.50", - "type": "^1.0.1" - } - }, - "node_modules/dash-ast": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/dash-ast/-/dash-ast-1.0.0.tgz", - "integrity": "sha512-Vy4dx7gquTeMcQR/hDkYLGUnwVil6vk4FOOct+djUnHOUWt+zJPJAaRIXaAFkPXtJjvlY7o3rfRu0/3hpnwoUA==", - "dev": true - }, - "node_modules/dashdash": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", - "integrity": "sha512-jRFi8UDGo6j+odZiEpjazZaWqEal3w/basFjQHQEwVtZJGDpxbH1MeYluwCS8Xq5wmLJooDlMgvVarmWfGM44g==", - "peer": true, - "dependencies": { - "assert-plus": "^1.0.0" - }, - "engines": { - "node": ">=0.10" - } - }, - "node_modules/date-now": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/date-now/-/date-now-0.1.4.tgz", - "integrity": "sha1-6vQ5/U1ISK105cx9vvIAZyueNFs=", - "dev": true - }, - "node_modules/debug": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz", - "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==", - "dev": true, - "dependencies": { - "ms": "2.1.2" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/debug/node_modules/ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - }, - "node_modules/decamelize": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", - "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/decode-uri-component": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz", - "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=", - "dev": true, - "engines": { - "node": ">=0.10" - } - }, - "node_modules/decomment": { - "version": "0.9.2", - "resolved": "https://registry.npmjs.org/decomment/-/decomment-0.9.2.tgz", - "integrity": "sha512-sblyUmOJZxiL7oJ2ogJS6jtl/67+CTOW87SrYE/96u3PhDYikYoLCdLzcnceToiQejOLlqNnLCkaxx/+nE/ehg==", - "dev": true, - "dependencies": { - "esprima": "4.0.1" - }, - "engines": { - "node": ">=6.4", - "npm": ">=2.15" - } - }, - "node_modules/decompress-response": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz", - "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==", - "dependencies": { - "mimic-response": "^3.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/deep-extend": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", - "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", - "engines": { - "node": ">=4.0.0" - } - }, - "node_modules/default-compare": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/default-compare/-/default-compare-1.0.0.tgz", - "integrity": "sha512-QWfXlM0EkAbqOCbD/6HjdwT19j7WCkMyiRhWilc4H9/5h/RzTF9gv5LYh1+CmDV5d1rki6KAWLtQale0xt20eQ==", - "dev": true, - "dependencies": { - "kind-of": "^5.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/default-compare/node_modules/kind-of": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", - "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/default-resolution": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/default-resolution/-/default-resolution-2.0.0.tgz", - "integrity": "sha1-vLgrqnKtebQmp2cy8aga1t8m1oQ=", - "dev": true, - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/define-properties": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", - "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", - "dev": true, - "dependencies": { - "object-keys": "^1.0.12" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/define-property": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", - "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", - "dev": true, - "dependencies": { - "is-descriptor": "^1.0.2", - "isobject": "^3.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/define-property/node_modules/is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "dev": true, - "dependencies": { - "kind-of": "^6.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/define-property/node_modules/is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "dev": true, - "dependencies": { - "kind-of": "^6.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/define-property/node_modules/is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "dev": true, - "dependencies": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/defined": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/defined/-/defined-1.0.0.tgz", - "integrity": "sha1-yY2bzvdWdBiOEQlpFRGZ45sfppM=", - "dev": true - }, - "node_modules/delayed-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", - "peer": true, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/delegates": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", - "integrity": "sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==" - }, - "node_modules/depd": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", - "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/deps-sort": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/deps-sort/-/deps-sort-2.0.1.tgz", - "integrity": "sha512-1orqXQr5po+3KI6kQb9A4jnXT1PBwggGl2d7Sq2xsnOeI9GPcE/tGcF9UiSZtZBM7MukY4cAh7MemS6tZYipfw==", - "dev": true, - "dependencies": { - "JSONStream": "^1.0.3", - "shasum-object": "^1.0.0", - "subarg": "^1.0.0", - "through2": "^2.0.0" - }, - "bin": { - "deps-sort": "bin/cmd.js" - } - }, - "node_modules/deps-sort/node_modules/isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", - "dev": true - }, - "node_modules/deps-sort/node_modules/readable-stream": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", - "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", - "dev": true, - "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "node_modules/deps-sort/node_modules/string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, - "dependencies": { - "safe-buffer": "~5.1.0" - } - }, - "node_modules/deps-sort/node_modules/through2": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", - "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", - "dev": true, - "dependencies": { - "readable-stream": "~2.3.6", - "xtend": "~4.0.1" - } - }, - "node_modules/des.js": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/des.js/-/des.js-1.0.0.tgz", - "integrity": "sha1-wHTS4qpqipoH29YfmhXCzYPsjsw=", - "dev": true, - "dependencies": { - "inherits": "^2.0.1", - "minimalistic-assert": "^1.0.0" - } - }, - "node_modules/destroy": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", - "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=", - "dev": true - }, - "node_modules/detect-file": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/detect-file/-/detect-file-1.0.0.tgz", - "integrity": "sha1-8NZtA2cqglyxtzvbP+YjEMjlUrc=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/detect-libc": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.1.tgz", - "integrity": "sha512-463v3ZeIrcWtdgIg6vI6XUncguvr2TnGl4SzDXinkt9mSLpBJKXT3mW6xT3VQdDN11+WVs29pgvivTc4Lp8v+w==", - "engines": { - "node": ">=8" - } - }, - "node_modules/detective": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/detective/-/detective-5.2.1.tgz", - "integrity": "sha512-v9XE1zRnz1wRtgurGu0Bs8uHKFSTdteYZNbIPFVhUZ39L/S79ppMpdmVOZAnoz1jfEFodc48n6MX483Xo3t1yw==", - "dev": true, - "dependencies": { - "acorn-node": "^1.8.2", - "defined": "^1.0.0", - "minimist": "^1.2.6" - }, - "bin": { - "detective": "bin/detective.js" - }, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/dev-ip": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/dev-ip/-/dev-ip-1.0.1.tgz", - "integrity": "sha1-p2o+0YVb56ASu4rBbLgPPADcKPA=", - "dev": true, - "bin": { - "dev-ip": "lib/dev-ip.js" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/diff": { - "version": "3.5.0", - "resolved": "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz", - "integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==", - "dev": true, - "engines": { - "node": ">=0.3.1" - } - }, - "node_modules/diffie-hellman": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz", - "integrity": "sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==", - "dev": true, - "dependencies": { - "bn.js": "^4.1.0", - "miller-rabin": "^4.0.0", - "randombytes": "^2.0.0" - } - }, - "node_modules/dir-glob": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", - "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", - "dev": true, - "dependencies": { - "path-type": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/dir-glob/node_modules/path-type": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", - "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/dlv": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/dlv/-/dlv-1.1.3.tgz", - "integrity": "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==", - "dev": true - }, - "node_modules/domain-browser": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/domain-browser/-/domain-browser-1.2.0.tgz", - "integrity": "sha512-jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA==", - "dev": true, - "engines": { - "node": ">=0.4", - "npm": ">=1.2" - } - }, - "node_modules/duplexer2": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/duplexer2/-/duplexer2-0.1.4.tgz", - "integrity": "sha512-asLFVfWWtJ90ZyOUHMqk7/S2w2guQKxUI2itj3d92ADHhxUSbCMGi1f1cBcJ7xM1To+pE/Khbwo1yuNbMEPKeA==", - "dev": true, - "dependencies": { - "readable-stream": "^2.0.2" - } - }, - "node_modules/duplexer2/node_modules/isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", - "dev": true - }, - "node_modules/duplexer2/node_modules/readable-stream": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", - "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", - "dev": true, - "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "node_modules/duplexer2/node_modules/string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, - "dependencies": { - "safe-buffer": "~5.1.0" - } - }, - "node_modules/duplexify": { - "version": "3.7.1", - "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.7.1.tgz", - "integrity": "sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g==", - "dev": true, - "dependencies": { - "end-of-stream": "^1.0.0", - "inherits": "^2.0.1", - "readable-stream": "^2.0.0", - "stream-shift": "^1.0.0" - } - }, - "node_modules/duplexify/node_modules/isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", - "dev": true - }, - "node_modules/duplexify/node_modules/readable-stream": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", - "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", - "dev": true, - "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "node_modules/duplexify/node_modules/string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, - "dependencies": { - "safe-buffer": "~5.1.0" - } - }, - "node_modules/each-props": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/each-props/-/each-props-1.3.2.tgz", - "integrity": "sha512-vV0Hem3zAGkJAyU7JSjixeU66rwdynTAa1vofCrSA5fEln+m67Az9CcnkVD776/fsN/UjIWmBDoNRS6t6G9RfA==", - "dev": true, - "dependencies": { - "is-plain-object": "^2.0.1", - "object.defaults": "^1.1.0" - } - }, - "node_modules/easy-extender": { - "version": "2.3.4", - "resolved": "https://registry.npmjs.org/easy-extender/-/easy-extender-2.3.4.tgz", - "integrity": "sha512-8cAwm6md1YTiPpOvDULYJL4ZS6WfM5/cTeVVh4JsvyYZAoqlRVUpHL9Gr5Fy7HA6xcSZicUia3DeAgO3Us8E+Q==", - "dev": true, - "dependencies": { - "lodash": "^4.17.10" - }, - "engines": { - "node": ">= 4.0.0" - } - }, - "node_modules/eazy-logger": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/eazy-logger/-/eazy-logger-3.1.0.tgz", - "integrity": "sha512-/snsn2JqBtUSSstEl4R0RKjkisGHAhvYj89i7r3ytNUKW12y178KDZwXLXIgwDqLW6E/VRMT9qfld7wvFae8bQ==", - "dev": true, - "dependencies": { - "tfunk": "^4.0.0" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/ecc-jsbn": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", - "integrity": "sha512-eh9O+hwRHNbG4BLTjEl3nw044CkGm5X6LoaCf7LPp7UU8Qrt47JYNi6nPX8xjW97TKGKm1ouctg0QSpZe9qrnw==", - "peer": true, - "dependencies": { - "jsbn": "~0.1.0", - "safer-buffer": "^2.1.0" - } - }, - "node_modules/editions": { - "version": "1.3.4", - "resolved": "https://registry.npmjs.org/editions/-/editions-1.3.4.tgz", - "integrity": "sha512-gzao+mxnYDzIysXKMQi/+M1mjy/rjestjg6OPoYTtI+3Izp23oiGZitsl9lPDPiTGXbcSIk1iJWhliSaglxnUg==", - "dev": true, - "engines": { - "node": ">=0.8" - } - }, - "node_modules/editorconfig": { - "version": "0.15.3", - "resolved": "https://registry.npmjs.org/editorconfig/-/editorconfig-0.15.3.tgz", - "integrity": "sha512-M9wIMFx96vq0R4F+gRpY3o2exzb8hEj/n9S8unZtHSvYjibBp/iMufSzvmOcV/laG0ZtuTVGtiJggPOSW2r93g==", - "dev": true, - "dependencies": { - "commander": "^2.19.0", - "lru-cache": "^4.1.5", - "semver": "^5.6.0", - "sigmund": "^1.0.1" - }, - "bin": { - "editorconfig": "bin/editorconfig" - } - }, - "node_modules/editorconfig/node_modules/semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true, - "bin": { - "semver": "bin/semver" - } - }, - "node_modules/ee-first": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", - "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=", - "dev": true - }, - "node_modules/elliptic": { - "version": "6.5.4", - "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.4.tgz", - "integrity": "sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ==", - "dev": true, - "dependencies": { - "bn.js": "^4.11.9", - "brorand": "^1.1.0", - "hash.js": "^1.0.0", - "hmac-drbg": "^1.0.1", - "inherits": "^2.0.4", - "minimalistic-assert": "^1.0.1", - "minimalistic-crypto-utils": "^1.0.1" - } - }, - "node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" - }, - "node_modules/encodeurl": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", - "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=", - "dev": true, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/encoding": { - "version": "0.1.13", - "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.13.tgz", - "integrity": "sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==", - "optional": true, - "dependencies": { - "iconv-lite": "^0.6.2" - } - }, - "node_modules/encoding/node_modules/iconv-lite": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", - "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", - "optional": true, - "dependencies": { - "safer-buffer": ">= 2.1.2 < 3.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/end-of-stream": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.1.tgz", - "integrity": "sha512-1MkrZNvWTKCaigbn+W15elq2BB/L22nqrSY5DKlo3X6+vclJm8Bb5djXJBmEX6fS3+zCh/F4VBK5Z2KxJt4s2Q==", - "dependencies": { - "once": "^1.4.0" - } - }, - "node_modules/engine.io": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-6.2.0.tgz", - "integrity": "sha512-4KzwW3F3bk+KlzSOY57fj/Jx6LyRQ1nbcyIadehl+AnXjKT7gDO0ORdRi/84ixvMKTym6ZKuxvbzN62HDDU1Lg==", - "dev": true, - "dependencies": { - "@types/cookie": "^0.4.1", - "@types/cors": "^2.8.12", - "@types/node": ">=10.0.0", - "accepts": "~1.3.4", - "base64id": "2.0.0", - "cookie": "~0.4.1", - "cors": "~2.8.5", - "debug": "~4.3.1", - "engine.io-parser": "~5.0.3", - "ws": "~8.2.3" - }, - "engines": { - "node": ">=10.0.0" - } - }, - "node_modules/engine.io-client": { - "version": "6.2.3", - "resolved": "https://registry.npmjs.org/engine.io-client/-/engine.io-client-6.2.3.tgz", - "integrity": "sha512-aXPtgF1JS3RuuKcpSrBtimSjYvrbhKW9froICH4s0F3XQWLxsKNxqzG39nnvQZQnva4CMvUK63T7shevxRyYHw==", - "dev": true, - "dependencies": { - "@socket.io/component-emitter": "~3.1.0", - "debug": "~4.3.1", - "engine.io-parser": "~5.0.3", - "ws": "~8.2.3", - "xmlhttprequest-ssl": "~2.0.0" - } - }, - "node_modules/engine.io-parser": { - "version": "5.0.4", - "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-5.0.4.tgz", - "integrity": "sha512-+nVFp+5z1E3HcToEnO7ZIj3g+3k9389DvWtvJZz0T6/eOCPIyyxehFcedoYrZQrp0LgQbD9pPXhpMBKMd5QURg==", - "dev": true, - "engines": { - "node": ">=10.0.0" - } - }, - "node_modules/env-paths": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz", - "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==", - "engines": { - "node": ">=6" - } - }, - "node_modules/err-code": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/err-code/-/err-code-2.0.3.tgz", - "integrity": "sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA==" - }, - "node_modules/error-ex": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", - "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", - "dev": true, - "dependencies": { - "is-arrayish": "^0.2.1" - } - }, - "node_modules/es5-ext": { - "version": "0.10.50", - "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.50.tgz", - "integrity": "sha512-KMzZTPBkeQV/JcSQhI5/z6d9VWJ3EnQ194USTUwIYZ2ZbpN8+SGXQKt1h68EX44+qt+Fzr8DO17vnxrw7c3agw==", - "dev": true, - "dependencies": { - "es6-iterator": "~2.0.3", - "es6-symbol": "~3.1.1", - "next-tick": "^1.0.0" - } - }, - "node_modules/es6-iterator": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.3.tgz", - "integrity": "sha1-p96IkUGgWpSwhUQDstCg+/qY87c=", - "dev": true, - "dependencies": { - "d": "1", - "es5-ext": "^0.10.35", - "es6-symbol": "^3.1.1" - } - }, - "node_modules/es6-symbol": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.1.tgz", - "integrity": "sha1-vwDvT9q2uhtG7Le2KbTH7VcVzHc=", - "dev": true, - "dependencies": { - "d": "1", - "es5-ext": "~0.10.14" - } - }, - "node_modules/es6-weak-map": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/es6-weak-map/-/es6-weak-map-2.0.3.tgz", - "integrity": "sha512-p5um32HOTO1kP+w7PRnB+5lQ43Z6muuMuIMffvDN8ZB4GcnjLBV6zGStpbASIMk4DCAvEaamhe2zhyCb/QXXsA==", - "dev": true, - "dependencies": { - "d": "1", - "es5-ext": "^0.10.46", - "es6-iterator": "^2.0.3", - "es6-symbol": "^3.1.1" - } - }, - "node_modules/escalade": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", - "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/escape-html": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", - "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=", - "dev": true - }, - "node_modules/escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", - "dev": true, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/esprima": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", - "dev": true, - "bin": { - "esparse": "bin/esparse.js", - "esvalidate": "bin/esvalidate.js" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/etag": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", - "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=", - "dev": true, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/eventemitter3": { - "version": "4.0.7", - "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", - "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==", - "dev": true - }, - "node_modules/events": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", - "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", - "dev": true, - "engines": { - "node": ">=0.8.x" - } - }, - "node_modules/evp_bytestokey": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz", - "integrity": "sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==", - "dev": true, - "dependencies": { - "md5.js": "^1.3.4", - "safe-buffer": "^5.1.1" - } - }, - "node_modules/expand-brackets": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", - "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", - "dev": true, - "dependencies": { - "debug": "^2.3.3", - "define-property": "^0.2.5", - "extend-shallow": "^2.0.1", - "posix-character-classes": "^0.1.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/expand-brackets/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/expand-brackets/node_modules/define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, - "dependencies": { - "is-descriptor": "^0.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/expand-brackets/node_modules/extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "dependencies": { - "is-extendable": "^0.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/expand-template": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/expand-template/-/expand-template-2.0.3.tgz", - "integrity": "sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==", - "engines": { - "node": ">=6" - } - }, - "node_modules/expand-tilde": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/expand-tilde/-/expand-tilde-2.0.2.tgz", - "integrity": "sha1-l+gBqgUt8CRU3kawK/YhZCzchQI=", - "dev": true, - "dependencies": { - "homedir-polyfill": "^1.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/extend": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", - "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==" - }, - "node_modules/extend-shallow": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", - "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", - "dev": true, - "dependencies": { - "assign-symbols": "^1.0.0", - "is-extendable": "^1.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/extend-shallow/node_modules/is-extendable": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", - "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", - "dev": true, - "dependencies": { - "is-plain-object": "^2.0.4" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/extglob": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", - "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", - "dev": true, - "dependencies": { - "array-unique": "^0.3.2", - "define-property": "^1.0.0", - "expand-brackets": "^2.1.4", - "extend-shallow": "^2.0.1", - "fragment-cache": "^0.2.1", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/extglob/node_modules/define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", - "dev": true, - "dependencies": { - "is-descriptor": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/extglob/node_modules/extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "dependencies": { - "is-extendable": "^0.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/extglob/node_modules/is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "dev": true, - "dependencies": { - "kind-of": "^6.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/extglob/node_modules/is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "dev": true, - "dependencies": { - "kind-of": "^6.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/extglob/node_modules/is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "dev": true, - "dependencies": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/extsprintf": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", - "integrity": "sha512-11Ndz7Nv+mvAC1j0ktTa7fAb0vLyGGX+rMHNBYQviQDGU0Hw7lhctJANqbPhu9nV9/izT/IntTgZ7Im/9LJs9g==", - "engines": [ - "node >=0.6.0" - ], - "peer": true - }, - "node_modules/fancy-log": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/fancy-log/-/fancy-log-1.3.3.tgz", - "integrity": "sha512-k9oEhlyc0FrVh25qYuSELjr8oxsCoc4/LEZfg2iJJrfEk/tZL9bCoJE47gqAvI2m/AUjluCS4+3I0eTx8n3AEw==", - "dev": true, - "dependencies": { - "ansi-gray": "^0.1.1", - "color-support": "^1.1.3", - "parse-node-version": "^1.0.0", - "time-stamp": "^1.0.0" - }, - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/fast-deep-equal": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", - "peer": true - }, - "node_modules/fast-glob": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.0.4.tgz", - "integrity": "sha512-wkIbV6qg37xTJwqSsdnIphL1e+LaGz4AIQqr00mIubMaEhv1/HEmJ0uuCGZRNRUkZZmOB5mJKO0ZUTVq+SxMQg==", - "dev": true, - "dependencies": { - "@nodelib/fs.stat": "^2.0.1", - "@nodelib/fs.walk": "^1.2.1", - "glob-parent": "^5.0.0", - "is-glob": "^4.0.1", - "merge2": "^1.2.3", - "micromatch": "^4.0.2" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/fast-glob/node_modules/braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "dev": true, - "dependencies": { - "fill-range": "^7.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/fast-glob/node_modules/fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", - "dev": true, - "dependencies": { - "to-regex-range": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/fast-glob/node_modules/glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, - "dependencies": { - "is-glob": "^4.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/fast-glob/node_modules/is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "dev": true, - "engines": { - "node": ">=0.12.0" - } - }, - "node_modules/fast-glob/node_modules/micromatch": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.2.tgz", - "integrity": "sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q==", - "dev": true, - "dependencies": { - "braces": "^3.0.1", - "picomatch": "^2.0.5" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/fast-glob/node_modules/to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "dev": true, - "dependencies": { - "is-number": "^7.0.0" - }, - "engines": { - "node": ">=8.0" - } - }, - "node_modules/fast-json-stable-stringify": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", - "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", - "peer": true - }, - "node_modules/fast-safe-stringify": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/fast-safe-stringify/-/fast-safe-stringify-2.1.1.tgz", - "integrity": "sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA==", - "dev": true - }, - "node_modules/fastq": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.6.0.tgz", - "integrity": "sha512-jmxqQ3Z/nXoeyDmWAzF9kH1aGZSis6e/SbfPmJpUnyZ0ogr6iscHQaml4wsEepEWSdtmpy+eVXmCRIMpxaXqOA==", - "dev": true, - "dependencies": { - "reusify": "^1.0.0" - } - }, - "node_modules/file-uri-to-path": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz", - "integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==" - }, - "node_modules/fill-range": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", - "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", - "dev": true, - "dependencies": { - "extend-shallow": "^2.0.1", - "is-number": "^3.0.0", - "repeat-string": "^1.6.1", - "to-regex-range": "^2.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/fill-range/node_modules/extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "dependencies": { - "is-extendable": "^0.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/finalhandler": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.0.tgz", - "integrity": "sha1-zgtoVbRYU+eRsvzGgARtiCU91/U=", - "dev": true, - "dependencies": { - "debug": "2.6.9", - "encodeurl": "~1.0.1", - "escape-html": "~1.0.3", - "on-finished": "~2.3.0", - "parseurl": "~1.3.2", - "statuses": "~1.3.1", - "unpipe": "~1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/finalhandler/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/find-up": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", - "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=", - "dev": true, - "dependencies": { - "path-exists": "^2.0.0", - "pinkie-promise": "^2.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/findup-sync": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-3.0.0.tgz", - "integrity": "sha512-YbffarhcicEhOrm4CtrwdKBdCuz576RLdhJDsIfvNtxUuhdRet1qZcsMjqbePtAseKdAnDyM/IyXbu7PRPRLYg==", - "dev": true, - "dependencies": { - "detect-file": "^1.0.0", - "is-glob": "^4.0.0", - "micromatch": "^3.0.4", - "resolve-dir": "^1.0.1" - }, - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/fined": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/fined/-/fined-1.2.0.tgz", - "integrity": "sha512-ZYDqPLGxDkDhDZBjZBb+oD1+j0rA4E0pXY50eplAAOPg2N/gUBSSk5IM1/QhPfyVo19lJ+CvXpqfvk+b2p/8Ng==", - "dev": true, - "dependencies": { - "expand-tilde": "^2.0.2", - "is-plain-object": "^2.0.3", - "object.defaults": "^1.1.0", - "object.pick": "^1.2.0", - "parse-filepath": "^1.0.1" - }, - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/flagged-respawn": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/flagged-respawn/-/flagged-respawn-1.0.1.tgz", - "integrity": "sha512-lNaHNVymajmk0OJMBn8fVUAU1BtDeKIqKoVhk4xAALB57aALg6b4W0MfJ/cUE0g9YBXy5XhSlPIpYIJ7HaY/3Q==", - "dev": true, - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/flush-write-stream": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/flush-write-stream/-/flush-write-stream-1.1.1.tgz", - "integrity": "sha512-3Z4XhFZ3992uIq0XOqb9AreonueSYphE6oYbpt5+3u06JWklbsPkNv3ZKkP9Bz/r+1MWCaMoSQ28P85+1Yc77w==", - "dev": true, - "dependencies": { - "inherits": "^2.0.3", - "readable-stream": "^2.3.6" - } - }, - "node_modules/flush-write-stream/node_modules/isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", - "dev": true - }, - "node_modules/flush-write-stream/node_modules/readable-stream": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", - "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", - "dev": true, - "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "node_modules/flush-write-stream/node_modules/string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, - "dependencies": { - "safe-buffer": "~5.1.0" - } - }, - "node_modules/follow-redirects": { - "version": "1.15.2", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.2.tgz", - "integrity": "sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==", - "dev": true, - "funding": [ - { - "type": "individual", - "url": "https://github.com/sponsors/RubenVerborgh" - } - ], - "engines": { - "node": ">=4.0" - }, - "peerDependenciesMeta": { - "debug": { - "optional": true - } - } - }, - "node_modules/for-each": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", - "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==", - "dev": true, - "dependencies": { - "is-callable": "^1.1.3" - } - }, - "node_modules/for-in": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", - "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/for-own": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/for-own/-/for-own-1.0.0.tgz", - "integrity": "sha1-xjMy9BXO3EsE2/5wz4NklMU8tEs=", - "dev": true, - "dependencies": { - "for-in": "^1.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/foreground-child": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-2.0.0.tgz", - "integrity": "sha512-dCIq9FpEcyQyXKCkyzmlPTFNgrCzPudOe+mhvJU5zAtlBnGVy2yKxtfsxK2tQBThwq225jcvBjpw1Gr40uzZCA==", - "dev": true, - "dependencies": { - "cross-spawn": "^7.0.0", - "signal-exit": "^3.0.2" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/forever-agent": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", - "integrity": "sha512-j0KLYPhm6zeac4lz3oJ3o65qvgQCcPubiyotZrXqEaG4hNagNYO8qdlUrX5vwqv9ohqeT/Z3j6+yW067yWWdUw==", - "peer": true, - "engines": { - "node": "*" - } - }, - "node_modules/form-data": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", - "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", - "peer": true, - "dependencies": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.6", - "mime-types": "^2.1.12" - }, - "engines": { - "node": ">= 0.12" - } - }, - "node_modules/fragment-cache": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz", - "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=", - "dev": true, - "dependencies": { - "map-cache": "^0.2.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/fresh": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", - "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=", - "dev": true, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/fs-constants": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", - "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==" - }, - "node_modules/fs-extra": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-3.0.1.tgz", - "integrity": "sha1-N5TzeMWLNC6n27sjCVEJxLO2IpE=", - "dev": true, - "dependencies": { - "graceful-fs": "^4.1.2", - "jsonfile": "^3.0.0", - "universalify": "^0.1.0" - } - }, - "node_modules/fs-minipass": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", - "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", - "dependencies": { - "minipass": "^3.0.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/fs-mkdirp-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs-mkdirp-stream/-/fs-mkdirp-stream-1.0.0.tgz", - "integrity": "sha1-C3gV/DIBxqaeFNuYzgmMFpNSWes=", - "dev": true, - "dependencies": { - "graceful-fs": "^4.1.11", - "through2": "^2.0.3" - }, - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/fs-mkdirp-stream/node_modules/isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", - "dev": true - }, - "node_modules/fs-mkdirp-stream/node_modules/readable-stream": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", - "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", - "dev": true, - "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "node_modules/fs-mkdirp-stream/node_modules/string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, - "dependencies": { - "safe-buffer": "~5.1.0" - } - }, - "node_modules/fs-mkdirp-stream/node_modules/through2": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", - "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", - "dev": true, - "dependencies": { - "readable-stream": "~2.3.6", - "xtend": "~4.0.1" - } - }, - "node_modules/fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" - }, - "node_modules/fsevents": { - "version": "1.2.12", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.12.tgz", - "integrity": "sha512-Ggd/Ktt7E7I8pxZRbGIs7vwqAPscSESMrCSkx2FtWeqmheJgCo2R74fTsZFCifr0VTPwqRpPv17+6b8Zp7th0Q==", - "bundleDependencies": [ - "node-pre-gyp" - ], - "deprecated": "fsevents 1 will break on node v14+ and could be using insecure binaries. Upgrade to fsevents 2.", - "dev": true, - "hasInstallScript": true, - "optional": true, - "os": [ - "darwin" - ], - "dependencies": { - "bindings": "^1.5.0", - "nan": "^2.12.1", - "node-pre-gyp": "*" - }, - "engines": { - "node": ">= 4.0" - } - }, - "node_modules/fsevents/node_modules/abbrev": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", - "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", - "dev": true, - "inBundle": true, - "license": "ISC", - "optional": true - }, - "node_modules/fsevents/node_modules/ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", - "dev": true, - "inBundle": true, - "license": "MIT", - "optional": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/fsevents/node_modules/aproba": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", - "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==", - "dev": true, - "inBundle": true, - "license": "ISC", - "optional": true - }, - "node_modules/fsevents/node_modules/are-we-there-yet": { - "version": "1.1.5", - "dev": true, - "inBundle": true, - "license": "ISC", - "optional": true, - "dependencies": { - "delegates": "^1.0.0", - "readable-stream": "^2.0.6" - } - }, - "node_modules/fsevents/node_modules/balanced-match": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", - "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", - "dev": true, - "inBundle": true, - "license": "MIT", - "optional": true - }, - "node_modules/fsevents/node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, - "inBundle": true, - "license": "MIT", - "optional": true, - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/fsevents/node_modules/chownr": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", - "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==", - "dev": true, - "inBundle": true, - "license": "ISC", - "optional": true - }, - "node_modules/fsevents/node_modules/code-point-at": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", - "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=", - "dev": true, - "inBundle": true, - "license": "MIT", - "optional": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/fsevents/node_modules/concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", - "dev": true, - "inBundle": true, - "license": "MIT", - "optional": true - }, - "node_modules/fsevents/node_modules/console-control-strings": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", - "integrity": "sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==", - "dev": true, - "inBundle": true, - "license": "ISC", - "optional": true - }, - "node_modules/fsevents/node_modules/core-util-is": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", - "dev": true, - "inBundle": true, - "license": "MIT", - "optional": true - }, - "node_modules/fsevents/node_modules/debug": { - "version": "3.2.6", - "dev": true, - "inBundle": true, - "license": "MIT", - "optional": true, - "dependencies": { - "ms": "^2.1.1" - } - }, - "node_modules/fsevents/node_modules/deep-extend": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", - "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", - "dev": true, - "inBundle": true, - "license": "MIT", - "optional": true, - "engines": { - "node": ">=4.0.0" - } - }, - "node_modules/fsevents/node_modules/delegates": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", - "integrity": "sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==", - "dev": true, - "inBundle": true, - "license": "MIT", - "optional": true - }, - "node_modules/fsevents/node_modules/detect-libc": { - "version": "1.0.3", - "dev": true, - "inBundle": true, - "license": "Apache-2.0", - "optional": true, - "bin": { - "detect-libc": "bin/detect-libc.js" - }, - "engines": { - "node": ">=0.10" - } - }, - "node_modules/fsevents/node_modules/fs-minipass": { - "version": "1.2.7", - "dev": true, - "inBundle": true, - "license": "ISC", - "optional": true, - "dependencies": { - "minipass": "^2.6.0" - } - }, - "node_modules/fsevents/node_modules/fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", - "dev": true, - "inBundle": true, - "license": "ISC", - "optional": true - }, - "node_modules/fsevents/node_modules/gauge": { - "version": "2.7.4", - "resolved": "https://registry.npmjs.org/gauge/-/gauge-2.7.4.tgz", - "integrity": "sha512-14x4kjc6lkD3ltw589k0NrPD6cCNTD6CWoVUNpB85+DrtONoZn+Rug6xZU5RvSC4+TZPxA5AnBibQYAvZn41Hg==", - "dev": true, - "inBundle": true, - "license": "ISC", - "optional": true, - "dependencies": { - "aproba": "^1.0.3", - "console-control-strings": "^1.0.0", - "has-unicode": "^2.0.0", - "object-assign": "^4.1.0", - "signal-exit": "^3.0.0", - "string-width": "^1.0.1", - "strip-ansi": "^3.0.1", - "wide-align": "^1.1.0" - } - }, - "node_modules/fsevents/node_modules/glob": { - "version": "7.1.6", - "dev": true, - "inBundle": true, - "license": "ISC", - "optional": true, - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/fsevents/node_modules/has-unicode": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", - "integrity": "sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==", - "dev": true, - "inBundle": true, - "license": "ISC", - "optional": true - }, - "node_modules/fsevents/node_modules/iconv-lite": { - "version": "0.4.24", - "dev": true, - "inBundle": true, - "license": "MIT", - "optional": true, - "dependencies": { - "safer-buffer": ">= 2.1.2 < 3" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/fsevents/node_modules/ignore-walk": { - "version": "3.0.3", - "dev": true, - "inBundle": true, - "license": "ISC", - "optional": true, - "dependencies": { - "minimatch": "^3.0.4" - } - }, - "node_modules/fsevents/node_modules/inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", - "dev": true, - "inBundle": true, - "license": "ISC", - "optional": true, - "dependencies": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "node_modules/fsevents/node_modules/inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "dev": true, - "inBundle": true, - "license": "ISC", - "optional": true - }, - "node_modules/fsevents/node_modules/ini": { - "version": "1.3.5", - "dev": true, - "inBundle": true, - "license": "ISC", - "optional": true, - "engines": { - "node": "*" - } - }, - "node_modules/fsevents/node_modules/is-fullwidth-code-point": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", - "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", - "dev": true, - "inBundle": true, - "license": "MIT", - "optional": true, - "dependencies": { - "number-is-nan": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/fsevents/node_modules/isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", - "dev": true, - "inBundle": true, - "license": "MIT", - "optional": true - }, - "node_modules/fsevents/node_modules/minimatch": { - "version": "3.0.4", - "dev": true, - "inBundle": true, - "license": "ISC", - "optional": true, - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/fsevents/node_modules/minimist": { - "version": "1.2.5", - "dev": true, - "inBundle": true, - "license": "MIT", - "optional": true - }, - "node_modules/fsevents/node_modules/minipass": { - "version": "2.9.0", - "dev": true, - "inBundle": true, - "license": "ISC", - "optional": true, - "dependencies": { - "safe-buffer": "^5.1.2", - "yallist": "^3.0.0" - } - }, - "node_modules/fsevents/node_modules/minizlib": { - "version": "1.3.3", - "dev": true, - "inBundle": true, - "license": "MIT", - "optional": true, - "dependencies": { - "minipass": "^2.9.0" - } - }, - "node_modules/fsevents/node_modules/mkdirp": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.3.tgz", - "integrity": "sha512-P+2gwrFqx8lhew375MQHHeTlY8AuOJSrGf0R5ddkEndUkmwpgUob/vQuBD1V22/Cw1/lJr4x+EjllSezBThzBg==", - "deprecated": "Legacy versions of mkdirp are no longer supported. Please update to mkdirp 1.x. (Note that the API surface has changed to use Promises in 1.x.)", - "dev": true, - "inBundle": true, - "license": "MIT", - "optional": true, - "dependencies": { - "minimist": "^1.2.5" - }, - "bin": { - "mkdirp": "bin/cmd.js" - } - }, - "node_modules/fsevents/node_modules/ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true, - "inBundle": true, - "license": "MIT", - "optional": true - }, - "node_modules/fsevents/node_modules/needle": { - "version": "2.3.3", - "dev": true, - "inBundle": true, - "license": "MIT", - "optional": true, - "dependencies": { - "debug": "^3.2.6", - "iconv-lite": "^0.4.4", - "sax": "^1.2.4" - }, - "bin": { - "needle": "bin/needle" - }, - "engines": { - "node": ">= 4.4.x" - } - }, - "node_modules/fsevents/node_modules/node-pre-gyp": { - "version": "0.14.0", - "dev": true, - "inBundle": true, - "license": "BSD-3-Clause", - "optional": true, - "dependencies": { - "detect-libc": "^1.0.2", - "mkdirp": "^0.5.1", - "needle": "^2.2.1", - "nopt": "^4.0.1", - "npm-packlist": "^1.1.6", - "npmlog": "^4.0.2", - "rc": "^1.2.7", - "rimraf": "^2.6.1", - "semver": "^5.3.0", - "tar": "^4.4.2" - }, - "bin": { - "node-pre-gyp": "bin/node-pre-gyp" - } - }, - "node_modules/fsevents/node_modules/nopt": { - "version": "4.0.3", - "dev": true, - "inBundle": true, - "license": "ISC", - "optional": true, - "dependencies": { - "abbrev": "1", - "osenv": "^0.1.4" - }, - "bin": { - "nopt": "bin/nopt.js" - } - }, - "node_modules/fsevents/node_modules/npm-bundled": { - "version": "1.1.1", - "dev": true, - "inBundle": true, - "license": "ISC", - "optional": true, - "dependencies": { - "npm-normalize-package-bin": "^1.0.1" - } - }, - "node_modules/fsevents/node_modules/npm-normalize-package-bin": { - "version": "1.0.1", - "dev": true, - "inBundle": true, - "license": "ISC", - "optional": true - }, - "node_modules/fsevents/node_modules/npm-packlist": { - "version": "1.4.8", - "dev": true, - "inBundle": true, - "license": "ISC", - "optional": true, - "dependencies": { - "ignore-walk": "^3.0.1", - "npm-bundled": "^1.0.1", - "npm-normalize-package-bin": "^1.0.1" - } - }, - "node_modules/fsevents/node_modules/npmlog": { - "version": "4.1.2", - "dev": true, - "inBundle": true, - "license": "ISC", - "optional": true, - "dependencies": { - "are-we-there-yet": "~1.1.2", - "console-control-strings": "~1.1.0", - "gauge": "~2.7.3", - "set-blocking": "~2.0.0" - } - }, - "node_modules/fsevents/node_modules/number-is-nan": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", - "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=", - "dev": true, - "inBundle": true, - "license": "MIT", - "optional": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/fsevents/node_modules/object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", - "dev": true, - "inBundle": true, - "license": "MIT", - "optional": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/fsevents/node_modules/once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", - "dev": true, - "inBundle": true, - "license": "ISC", - "optional": true, - "dependencies": { - "wrappy": "1" - } - }, - "node_modules/fsevents/node_modules/os-homedir": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", - "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=", - "dev": true, - "inBundle": true, - "license": "MIT", - "optional": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/fsevents/node_modules/os-tmpdir": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", - "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", - "dev": true, - "inBundle": true, - "license": "MIT", - "optional": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/fsevents/node_modules/osenv": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/osenv/-/osenv-0.1.5.tgz", - "integrity": "sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g==", - "dev": true, - "inBundle": true, - "license": "ISC", - "optional": true, - "dependencies": { - "os-homedir": "^1.0.0", - "os-tmpdir": "^1.0.0" - } - }, - "node_modules/fsevents/node_modules/path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", - "dev": true, - "inBundle": true, - "license": "MIT", - "optional": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/fsevents/node_modules/process-nextick-args": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", - "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", - "dev": true, - "inBundle": true, - "license": "MIT", - "optional": true - }, - "node_modules/fsevents/node_modules/rc": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", - "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", - "dev": true, - "inBundle": true, - "license": "(BSD-2-Clause OR MIT OR Apache-2.0)", - "optional": true, - "dependencies": { - "deep-extend": "^0.6.0", - "ini": "~1.3.0", - "minimist": "^1.2.0", - "strip-json-comments": "~2.0.1" - }, - "bin": { - "rc": "cli.js" - } - }, - "node_modules/fsevents/node_modules/readable-stream": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", - "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", - "dev": true, - "inBundle": true, - "license": "MIT", - "optional": true, - "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "node_modules/fsevents/node_modules/rimraf": { - "version": "2.7.1", - "dev": true, - "inBundle": true, - "license": "ISC", - "optional": true, - "dependencies": { - "glob": "^7.1.3" - }, - "bin": { - "rimraf": "bin.js" - } - }, - "node_modules/fsevents/node_modules/safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true, - "inBundle": true, - "license": "MIT", - "optional": true - }, - "node_modules/fsevents/node_modules/safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", - "dev": true, - "inBundle": true, - "license": "MIT", - "optional": true - }, - "node_modules/fsevents/node_modules/sax": { - "version": "1.2.4", - "dev": true, - "inBundle": true, - "license": "ISC", - "optional": true - }, - "node_modules/fsevents/node_modules/semver": { - "version": "5.7.1", - "dev": true, - "inBundle": true, - "license": "ISC", - "optional": true, - "bin": { - "semver": "bin/semver" - } - }, - "node_modules/fsevents/node_modules/set-blocking": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", - "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", - "dev": true, - "inBundle": true, - "license": "ISC", - "optional": true - }, - "node_modules/fsevents/node_modules/signal-exit": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", - "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=", - "dev": true, - "inBundle": true, - "license": "ISC", - "optional": true - }, - "node_modules/fsevents/node_modules/string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, - "inBundle": true, - "license": "MIT", - "optional": true, - "dependencies": { - "safe-buffer": "~5.1.0" - } - }, - "node_modules/fsevents/node_modules/string-width": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", - "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", - "dev": true, - "inBundle": true, - "license": "MIT", - "optional": true, - "dependencies": { - "code-point-at": "^1.0.0", - "is-fullwidth-code-point": "^1.0.0", - "strip-ansi": "^3.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/fsevents/node_modules/strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", - "dev": true, - "inBundle": true, - "license": "MIT", - "optional": true, - "dependencies": { - "ansi-regex": "^2.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/fsevents/node_modules/strip-json-comments": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", - "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=", - "dev": true, - "inBundle": true, - "license": "MIT", - "optional": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/fsevents/node_modules/tar": { - "version": "4.4.13", - "dev": true, - "inBundle": true, - "license": "ISC", - "optional": true, - "dependencies": { - "chownr": "^1.1.1", - "fs-minipass": "^1.2.5", - "minipass": "^2.8.6", - "minizlib": "^1.2.1", - "mkdirp": "^0.5.0", - "safe-buffer": "^5.1.2", - "yallist": "^3.0.3" - }, - "engines": { - "node": ">=4.5" - } - }, - "node_modules/fsevents/node_modules/util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", - "dev": true, - "inBundle": true, - "license": "MIT", - "optional": true - }, - "node_modules/fsevents/node_modules/wide-align": { - "version": "1.1.3", - "dev": true, - "inBundle": true, - "license": "ISC", - "optional": true, - "dependencies": { - "string-width": "^1.0.2 || 2" - } - }, - "node_modules/fsevents/node_modules/wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", - "dev": true, - "inBundle": true, - "license": "ISC", - "optional": true - }, - "node_modules/fsevents/node_modules/yallist": { - "version": "3.1.1", - "dev": true, - "inBundle": true, - "license": "ISC", - "optional": true - }, - "node_modules/function-bind": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", - "dev": true - }, - "node_modules/gauge": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/gauge/-/gauge-4.0.4.tgz", - "integrity": "sha512-f9m+BEN5jkg6a0fZjleidjN51VE1X+mPFQ2DJ0uv1V39oCLCbsGe6yjbBnp7eK7z/+GAon99a3nHuqbuuthyPg==", - "dependencies": { - "aproba": "^1.0.3 || ^2.0.0", - "color-support": "^1.1.3", - "console-control-strings": "^1.1.0", - "has-unicode": "^2.0.1", - "signal-exit": "^3.0.7", - "string-width": "^4.2.3", - "strip-ansi": "^6.0.1", - "wide-align": "^1.1.5" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/gauge/node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "engines": { - "node": ">=8" - } - }, - "node_modules/gauge/node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "engines": { - "node": ">=8" - } - }, - "node_modules/gauge/node_modules/signal-exit": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", - "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==" - }, - "node_modules/gauge/node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/gauge/node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/get-assigned-identifiers": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/get-assigned-identifiers/-/get-assigned-identifiers-1.2.0.tgz", - "integrity": "sha512-mBBwmeGTrxEMO4pMaaf/uUEFHnYtwr8FTe8Y/mer4rcV/bye0qGm6pw1bGZFGStxC5O76c5ZAVBGnqHmOaJpdQ==", - "dev": true - }, - "node_modules/get-caller-file": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.3.tgz", - "integrity": "sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w==", - "dev": true - }, - "node_modules/get-intrinsic": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.3.tgz", - "integrity": "sha512-QJVz1Tj7MS099PevUG5jvnt9tSkXN8K14dxQlikJuPt4uD9hHAHjLyLBiLR5zELelBdD9QNRAXZzsJx0WaDL9A==", - "dev": true, - "dependencies": { - "function-bind": "^1.1.1", - "has": "^1.0.3", - "has-symbols": "^1.0.3" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/get-value": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", - "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/getpass": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", - "integrity": "sha512-0fzj9JxOLfJ+XGLhR8ze3unN0KZCgZwiSSDz168VERjK8Wl8kVSdcu2kspd4s4wtAa1y/qrVRiAA0WclVsu0ng==", - "peer": true, - "dependencies": { - "assert-plus": "^1.0.0" - } - }, - "node_modules/github-from-package": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/github-from-package/-/github-from-package-0.0.0.tgz", - "integrity": "sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw==" - }, - "node_modules/gl": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/gl/-/gl-5.0.3.tgz", - "integrity": "sha512-toWmb3Rgli5Wl9ygjZeglFBVLDYMOomy+rXlVZVDCoIRV+6mQE5nY4NgQgokYIc5oQzc1pvWY9lQJ0hGn61ZUg==", - "hasInstallScript": true, - "dependencies": { - "bindings": "^1.5.0", - "bit-twiddle": "^1.0.2", - "glsl-tokenizer": "^2.1.5", - "nan": "^2.16.0", - "node-abi": "^3.22.0", - "node-gyp": "^9.0.0", - "prebuild-install": "^7.1.1" - }, - "engines": { - "node": ">=12.0.0" - } - }, - "node_modules/gl-wiretap": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/gl-wiretap/-/gl-wiretap-0.6.2.tgz", - "integrity": "sha512-fxy1XGiPkfzK+T3XKDbY7yaqMBmozCGvAFyTwaZA3imeZH83w7Hr3r3bYlMRWIyzMI/lDUvUMM/92LE2OwqFyQ==" - }, - "node_modules/glob": { - "version": "7.1.4", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.4.tgz", - "integrity": "sha512-hkLPepehmnKk41pUGm3sYxoFs/umurYfYJCerbXEyFIWcAzvpipAgVkBqqT9RBKMGjnq6kMuyYwha6csxbiM1A==", - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - } - }, - "node_modules/glob-parent": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", - "integrity": "sha512-E8Ak/2+dZY6fnzlR7+ueWvhsH1SjHr4jjss4YS/h4py44jY9MhK/VFdaZJAWDz6BbL21KeteKxFSFpq8OS5gVA==", - "dev": true, - "dependencies": { - "is-glob": "^3.1.0", - "path-dirname": "^1.0.0" - } - }, - "node_modules/glob-parent/node_modules/is-glob": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", - "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", - "dev": true, - "dependencies": { - "is-extglob": "^2.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/glob-stream": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/glob-stream/-/glob-stream-6.1.0.tgz", - "integrity": "sha512-uMbLGAP3S2aDOHUDfdoYcdIePUCfysbAd0IAoWVZbeGU/oNQ8asHVSshLDJUPWxfzj8zsCG7/XeHPHTtow0nsw==", - "dev": true, - "dependencies": { - "extend": "^3.0.0", - "glob": "^7.1.1", - "glob-parent": "^3.1.0", - "is-negated-glob": "^1.0.0", - "ordered-read-streams": "^1.0.0", - "pumpify": "^1.3.5", - "readable-stream": "^2.1.5", - "remove-trailing-separator": "^1.0.1", - "to-absolute-glob": "^2.0.0", - "unique-stream": "^2.0.2" - }, - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/glob-stream/node_modules/isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", - "dev": true - }, - "node_modules/glob-stream/node_modules/readable-stream": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", - "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", - "dev": true, - "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "node_modules/glob-stream/node_modules/string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, - "dependencies": { - "safe-buffer": "~5.1.0" - } - }, - "node_modules/glob-watcher": { - "version": "5.0.5", - "resolved": "https://registry.npmjs.org/glob-watcher/-/glob-watcher-5.0.5.tgz", - "integrity": "sha512-zOZgGGEHPklZNjZQaZ9f41i7F2YwE+tS5ZHrDhbBCk3stwahn5vQxnFmBJZHoYdusR6R1bLSXeGUy/BhctwKzw==", - "dev": true, - "dependencies": { - "anymatch": "^2.0.0", - "async-done": "^1.2.0", - "chokidar": "^2.0.0", - "is-negated-glob": "^1.0.0", - "just-debounce": "^1.0.0", - "normalize-path": "^3.0.0", - "object.defaults": "^1.1.0" - }, - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/global-modules": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-1.0.0.tgz", - "integrity": "sha512-sKzpEkf11GpOFuw0Zzjzmt4B4UZwjOcG757PPvrfhxcLFbq0wpsgpOqxpxtxFiCG4DtG93M6XRVbF2oGdev7bg==", - "dev": true, - "dependencies": { - "global-prefix": "^1.0.1", - "is-windows": "^1.0.1", - "resolve-dir": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/global-prefix": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-1.0.2.tgz", - "integrity": "sha1-2/dDxsFJklk8ZVVoy2btMsASLr4=", - "dev": true, - "dependencies": { - "expand-tilde": "^2.0.2", - "homedir-polyfill": "^1.0.1", - "ini": "^1.3.4", - "is-windows": "^1.0.1", - "which": "^1.2.14" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/globalyzer": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/globalyzer/-/globalyzer-0.1.0.tgz", - "integrity": "sha512-40oNTM9UfG6aBmuKxk/giHn5nQ8RVz/SS4Ir6zgzOv9/qC3kKZ9v4etGTcJbEl/NyVQH7FGU7d+X1egr57Md2Q==", - "dev": true - }, - "node_modules/globby": { - "version": "10.0.1", - "resolved": "https://registry.npmjs.org/globby/-/globby-10.0.1.tgz", - "integrity": "sha512-sSs4inE1FB2YQiymcmTv6NWENryABjUNPeWhOvmn4SjtKybglsyPZxFB3U1/+L1bYi0rNZDqCLlHyLYDl1Pq5A==", - "dev": true, - "dependencies": { - "@types/glob": "^7.1.1", - "array-union": "^2.1.0", - "dir-glob": "^3.0.1", - "fast-glob": "^3.0.3", - "glob": "^7.1.3", - "ignore": "^5.1.1", - "merge2": "^1.2.3", - "slash": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/globrex": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/globrex/-/globrex-0.1.2.tgz", - "integrity": "sha512-uHJgbwAMwNFf5mLst7IWLNg14x1CkeqglJb/K3doi4dw6q2IvAAmM/Y81kevy83wP+Sst+nutFTYOGg3d1lsxg==", - "dev": true - }, - "node_modules/glogg": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/glogg/-/glogg-1.0.2.tgz", - "integrity": "sha512-5mwUoSuBk44Y4EshyiqcH95ZntbDdTQqA3QYSrxmzj28Ai0vXBGMH1ApSANH14j2sIRtqCEyg6PfsuP7ElOEDA==", - "dev": true, - "dependencies": { - "sparkles": "^1.0.0" - }, - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/glsl-tokenizer": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/glsl-tokenizer/-/glsl-tokenizer-2.1.5.tgz", - "integrity": "sha512-XSZEJ/i4dmz3Pmbnpsy3cKh7cotvFlBiZnDOwnj/05EwNp2XrhQ4XKJxT7/pDt4kp4YcpRSKz8eTV7S+mwV6MA==", - "dependencies": { - "through2": "^0.6.3" - } - }, - "node_modules/gopd": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", - "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", - "dev": true, - "dependencies": { - "get-intrinsic": "^1.1.3" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/gpu-mock.js": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/gpu-mock.js/-/gpu-mock.js-1.3.1.tgz", - "integrity": "sha512-+lbp8rQ0p1nTa6Gk6HoLiw4yM6JTpql82U+nCF3sZbX4FJWP9PzzF1018dW8K+pbmqRmhLHbn6Bjc6i6tgUpbA==", - "peerDependencies": { - "gpu.js": "^2.10.3" - } - }, - "node_modules/gpu.js": { - "version": "2.15.2", - "resolved": "https://registry.npmjs.org/gpu.js/-/gpu.js-2.15.2.tgz", - "integrity": "sha512-tgTRoWEE0X2PE3OgTNub9OwadXND2K7qwOW/VwhIiedY/mbiT93jJIrgWAKBgdhQR0JmyN4ObkSu0/vjSpbuiQ==", - "peer": true, - "dependencies": { - "acorn": "^7.1.1", - "gl": "^4.5.2", - "gl-wiretap": "^0.6.2", - "gpu-mock.js": "^1.3.0", - "webgpu": "^0.1.16" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/gpu.js/node_modules/aproba": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", - "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==", - "peer": true - }, - "node_modules/gpu.js/node_modules/are-we-there-yet": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.1.7.tgz", - "integrity": "sha512-nxwy40TuMiUGqMyRHgCSWZ9FM4VAoRP4xUYSTv5ImRog+h9yISPbVH7H8fASCIzYn9wlEv4zvFL7uKDMCFQm3g==", - "peer": true, - "dependencies": { - "delegates": "^1.0.0", - "readable-stream": "^2.0.6" - } - }, - "node_modules/gpu.js/node_modules/decompress-response": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-4.2.1.tgz", - "integrity": "sha512-jOSne2qbyE+/r8G1VU+G/82LBs2Fs4LAsTiLSHOCOMZQl2OKZ6i8i4IyHemTe+/yIXOtTcRQMzPcgyhoFlqPkw==", - "peer": true, - "dependencies": { - "mimic-response": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/gpu.js/node_modules/detect-libc": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz", - "integrity": "sha512-pGjwhsmsp4kL2RTz08wcOlGN83otlqHeD/Z5T8GXZB+/YcpQ/dgo+lbU8ZsGxV0HIvqqxo9l7mqYwyYMD9bKDg==", - "peer": true, - "bin": { - "detect-libc": "bin/detect-libc.js" - }, - "engines": { - "node": ">=0.10" - } - }, - "node_modules/gpu.js/node_modules/gauge": { - "version": "2.7.4", - "resolved": "https://registry.npmjs.org/gauge/-/gauge-2.7.4.tgz", - "integrity": "sha512-14x4kjc6lkD3ltw589k0NrPD6cCNTD6CWoVUNpB85+DrtONoZn+Rug6xZU5RvSC4+TZPxA5AnBibQYAvZn41Hg==", - "peer": true, - "dependencies": { - "aproba": "^1.0.3", - "console-control-strings": "^1.0.0", - "has-unicode": "^2.0.0", - "object-assign": "^4.1.0", - "signal-exit": "^3.0.0", - "string-width": "^1.0.1", - "strip-ansi": "^3.0.1", - "wide-align": "^1.1.0" - } - }, - "node_modules/gpu.js/node_modules/gl": { - "version": "4.9.2", - "resolved": "https://registry.npmjs.org/gl/-/gl-4.9.2.tgz", - "integrity": "sha512-lLYaicQxsRPxOnKWX9pIGmtKRuw0epvI089yl9uBvemYxR9xE01eRuXJgje1U0/06Df7bdOmmcW87IPOsu52Ow==", - "hasInstallScript": true, - "peer": true, - "dependencies": { - "bindings": "^1.5.0", - "bit-twiddle": "^1.0.2", - "glsl-tokenizer": "^2.0.2", - "nan": "^2.15.0", - "node-abi": "^2.30.1", - "node-gyp": "^7.1.2", - "prebuild-install": "^5.3.6" - }, - "engines": { - "node": ">=12.0.0" - } - }, - "node_modules/gpu.js/node_modules/isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", - "peer": true - }, - "node_modules/gpu.js/node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "peer": true, - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/gpu.js/node_modules/mimic-response": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-2.1.0.tgz", - "integrity": "sha512-wXqjST+SLt7R009ySCglWBCFpjUygmCIfD790/kVbiGmUgfYGuB14PiTd5DwVxSV4NcYHjzMkoj5LjQZwTQLEA==", - "peer": true, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/gpu.js/node_modules/node-abi": { - "version": "2.30.1", - "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-2.30.1.tgz", - "integrity": "sha512-/2D0wOQPgaUWzVSVgRMx+trKJRC2UG4SUc4oCJoXx9Uxjtp0Vy3/kt7zcbxHF8+Z/pK3UloLWzBISg72brfy1w==", - "peer": true, - "dependencies": { - "semver": "^5.4.1" - } - }, - "node_modules/gpu.js/node_modules/node-gyp": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-7.1.2.tgz", - "integrity": "sha512-CbpcIo7C3eMu3dL1c3d0xw449fHIGALIJsRP4DDPHpyiW8vcriNY7ubh9TE4zEKfSxscY7PjeFnshE7h75ynjQ==", - "peer": true, - "dependencies": { - "env-paths": "^2.2.0", - "glob": "^7.1.4", - "graceful-fs": "^4.2.3", - "nopt": "^5.0.0", - "npmlog": "^4.1.2", - "request": "^2.88.2", - "rimraf": "^3.0.2", - "semver": "^7.3.2", - "tar": "^6.0.2", - "which": "^2.0.2" - }, - "bin": { - "node-gyp": "bin/node-gyp.js" - }, - "engines": { - "node": ">= 10.12.0" - } - }, - "node_modules/gpu.js/node_modules/node-gyp/node_modules/semver": { - "version": "7.3.8", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz", - "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==", - "peer": true, - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/gpu.js/node_modules/npmlog": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-4.1.2.tgz", - "integrity": "sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg==", - "peer": true, - "dependencies": { - "are-we-there-yet": "~1.1.2", - "console-control-strings": "~1.1.0", - "gauge": "~2.7.3", - "set-blocking": "~2.0.0" - } - }, - "node_modules/gpu.js/node_modules/prebuild-install": { - "version": "5.3.6", - "resolved": "https://registry.npmjs.org/prebuild-install/-/prebuild-install-5.3.6.tgz", - "integrity": "sha512-s8Aai8++QQGi4sSbs/M1Qku62PFK49Jm1CbgXklGz4nmHveDq0wzJkg7Na5QbnO1uNH8K7iqx2EQ/mV0MZEmOg==", - "peer": true, - "dependencies": { - "detect-libc": "^1.0.3", - "expand-template": "^2.0.3", - "github-from-package": "0.0.0", - "minimist": "^1.2.3", - "mkdirp-classic": "^0.5.3", - "napi-build-utils": "^1.0.1", - "node-abi": "^2.7.0", - "noop-logger": "^0.1.1", - "npmlog": "^4.0.1", - "pump": "^3.0.0", - "rc": "^1.2.7", - "simple-get": "^3.0.3", - "tar-fs": "^2.0.0", - "tunnel-agent": "^0.6.0", - "which-pm-runs": "^1.0.0" - }, - "bin": { - "prebuild-install": "bin.js" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/gpu.js/node_modules/pump": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", - "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", - "peer": true, - "dependencies": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" - } - }, - "node_modules/gpu.js/node_modules/readable-stream": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", - "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", - "peer": true, - "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "node_modules/gpu.js/node_modules/semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "peer": true, - "bin": { - "semver": "bin/semver" - } - }, - "node_modules/gpu.js/node_modules/simple-get": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/simple-get/-/simple-get-3.1.1.tgz", - "integrity": "sha512-CQ5LTKGfCpvE1K0n2us+kuMPbk/q0EKl82s4aheV9oXjFEz6W/Y7oQFVJuU6QG77hRT4Ghb5RURteF5vnWjupA==", - "peer": true, - "dependencies": { - "decompress-response": "^4.2.0", - "once": "^1.3.1", - "simple-concat": "^1.0.0" - } - }, - "node_modules/gpu.js/node_modules/string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "peer": true, - "dependencies": { - "safe-buffer": "~5.1.0" - } - }, - "node_modules/gpu.js/node_modules/which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "peer": true, - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "node-which": "bin/node-which" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/graceful-fs": { - "version": "4.2.10", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", - "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==" - }, - "node_modules/gulp": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/gulp/-/gulp-4.0.2.tgz", - "integrity": "sha512-dvEs27SCZt2ibF29xYgmnwwCYZxdxhQ/+LFWlbAW8y7jt68L/65402Lz3+CKy0Ov4rOs+NERmDq7YlZaDqUIfA==", - "dev": true, - "dependencies": { - "glob-watcher": "^5.0.3", - "gulp-cli": "^2.2.0", - "undertaker": "^1.2.1", - "vinyl-fs": "^3.0.0" - }, - "bin": { - "gulp": "bin/gulp.js" - }, - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/gulp-concat": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/gulp-concat/-/gulp-concat-2.6.1.tgz", - "integrity": "sha1-Yz0WyV2IUEYorQJmVmPO5aR5M1M=", - "dev": true, - "dependencies": { - "concat-with-sourcemaps": "^1.0.0", - "through2": "^2.0.0", - "vinyl": "^2.0.0" - }, - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/gulp-concat/node_modules/isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", - "dev": true - }, - "node_modules/gulp-concat/node_modules/readable-stream": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", - "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", - "dev": true, - "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "node_modules/gulp-concat/node_modules/string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, - "dependencies": { - "safe-buffer": "~5.1.0" - } - }, - "node_modules/gulp-concat/node_modules/through2": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", - "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", - "dev": true, - "dependencies": { - "readable-stream": "~2.3.6", - "xtend": "~4.0.1" - } - }, - "node_modules/gulp-header": { - "version": "1.8.12", - "resolved": "https://registry.npmjs.org/gulp-header/-/gulp-header-1.8.12.tgz", - "integrity": "sha512-lh9HLdb53sC7XIZOYzTXM4lFuXElv3EVkSDhsd7DoJBj7hm+Ni7D3qYbb+Rr8DuM8nRanBvkVO9d7askreXGnQ==", - "deprecated": "Removed event-stream from gulp-header", - "dev": true, - "dependencies": { - "concat-with-sourcemaps": "*", - "lodash.template": "^4.4.0", - "through2": "^2.0.0" - } - }, - "node_modules/gulp-header/node_modules/isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", - "dev": true - }, - "node_modules/gulp-header/node_modules/readable-stream": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", - "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", - "dev": true, - "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "node_modules/gulp-header/node_modules/string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, - "dependencies": { - "safe-buffer": "~5.1.0" - } - }, - "node_modules/gulp-header/node_modules/through2": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", - "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", - "dev": true, - "dependencies": { - "readable-stream": "~2.3.6", - "xtend": "~4.0.1" - } - }, - "node_modules/gulp-jsbeautifier": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/gulp-jsbeautifier/-/gulp-jsbeautifier-2.1.2.tgz", - "integrity": "sha512-tZUk4c11zF8xzCCTOEmktxGitv/H2vpAcflZNVU8nxL+G5XxQyLJUJVUKylz7/dax+FXb3YwQYByaJ+yxmo8iw==", - "dev": true, - "dependencies": { - "chalk": "^1.1.3", - "fancy-log": "^1.3.2", - "js-beautify": "^1.7.5", - "lodash": "^4.17.4", - "plugin-error": "^0.1.2", - "rc": "^1.2.2", - "through2": "^2.0.3" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/gulp-jsbeautifier/node_modules/isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", - "dev": true - }, - "node_modules/gulp-jsbeautifier/node_modules/readable-stream": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", - "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", - "dev": true, - "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "node_modules/gulp-jsbeautifier/node_modules/string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, - "dependencies": { - "safe-buffer": "~5.1.0" - } - }, - "node_modules/gulp-jsbeautifier/node_modules/through2": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", - "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", - "dev": true, - "dependencies": { - "readable-stream": "~2.3.6", - "xtend": "~4.0.1" - } - }, - "node_modules/gulp-rename": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/gulp-rename/-/gulp-rename-1.4.0.tgz", - "integrity": "sha512-swzbIGb/arEoFK89tPY58vg3Ok1bw+d35PfUNwWqdo7KM4jkmuGA78JiDNqR+JeZFaeeHnRg9N7aihX3YPmsyg==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/gulp-replace": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/gulp-replace/-/gulp-replace-1.0.0.tgz", - "integrity": "sha512-lgdmrFSI1SdhNMXZQbrC75MOl1UjYWlOWNbNRnz+F/KHmgxt3l6XstBoAYIdadwETFyG/6i+vWUSCawdC3pqOw==", - "dev": true, - "dependencies": { - "istextorbinary": "2.2.1", - "readable-stream": "^2.0.1", - "replacestream": "^4.0.0" - }, - "engines": { - "node": ">=0.10" - } - }, - "node_modules/gulp-replace/node_modules/isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", - "dev": true - }, - "node_modules/gulp-replace/node_modules/readable-stream": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", - "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", - "dev": true, - "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "node_modules/gulp-replace/node_modules/string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, - "dependencies": { - "safe-buffer": "~5.1.0" - } - }, - "node_modules/gulp-strip-comments": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/gulp-strip-comments/-/gulp-strip-comments-2.5.2.tgz", - "integrity": "sha512-lb1bW7rsPWDD8f4ZPSguDvmCdjKmjr5HR4yZb9ros3sLl5AfW7oUj8KzY9/VRisT7dG8dL7hVHzNpQEVxfwZGQ==", - "dev": true, - "dependencies": { - "decomment": "^0.9.0", - "plugin-error": "^0.1.2", - "through2": "^2.0.3" - } - }, - "node_modules/gulp-strip-comments/node_modules/isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", - "dev": true - }, - "node_modules/gulp-strip-comments/node_modules/readable-stream": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", - "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", - "dev": true, - "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "node_modules/gulp-strip-comments/node_modules/string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, - "dependencies": { - "safe-buffer": "~5.1.0" - } - }, - "node_modules/gulp-strip-comments/node_modules/through2": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", - "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", - "dev": true, - "dependencies": { - "readable-stream": "~2.3.6", - "xtend": "~4.0.1" - } - }, - "node_modules/gulp-uglify-es": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/gulp-uglify-es/-/gulp-uglify-es-3.0.0.tgz", - "integrity": "sha512-dQ3czMFFojNgCajcrYl0oa98+YayaQ8kXRdaacpZRZ3iw2sdVURfdt8y8Ki1ogZGQqw8BUawnB7V6NkanxqnDg==", - "dev": true, - "dependencies": { - "o-stream": "^0.3.0", - "plugin-error": "^1.0.1", - "terser": "^5.7.1", - "vinyl": "^2.2.1", - "vinyl-sourcemaps-apply": "^0.2.1" - } - }, - "node_modules/gulp-uglify-es/node_modules/plugin-error": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/plugin-error/-/plugin-error-1.0.1.tgz", - "integrity": "sha512-L1zP0dk7vGweZME2i+EeakvUNqSrdiI3F91TwEoYiGrAfUXmVv6fJIq4g82PAXxNsWOp0J7ZqQy/3Szz0ajTxA==", - "dev": true, - "dependencies": { - "ansi-colors": "^1.0.1", - "arr-diff": "^4.0.0", - "arr-union": "^3.1.0", - "extend-shallow": "^3.0.2" - }, - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/gulp/node_modules/gulp-cli": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/gulp-cli/-/gulp-cli-2.2.0.tgz", - "integrity": "sha512-rGs3bVYHdyJpLqR0TUBnlcZ1O5O++Zs4bA0ajm+zr3WFCfiSLjGwoCBqFs18wzN+ZxahT9DkOK5nDf26iDsWjA==", - "dev": true, - "dependencies": { - "ansi-colors": "^1.0.1", - "archy": "^1.0.0", - "array-sort": "^1.0.0", - "color-support": "^1.1.3", - "concat-stream": "^1.6.0", - "copy-props": "^2.0.1", - "fancy-log": "^1.3.2", - "gulplog": "^1.0.0", - "interpret": "^1.1.0", - "isobject": "^3.0.1", - "liftoff": "^3.1.0", - "matchdep": "^2.0.0", - "mute-stdout": "^1.0.0", - "pretty-hrtime": "^1.0.0", - "replace-homedir": "^1.0.0", - "semver-greatest-satisfied-range": "^1.1.0", - "v8flags": "^3.0.1", - "yargs": "^7.1.0" - }, - "bin": { - "gulp": "bin/gulp.js" - }, - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/gulp/node_modules/yargs": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-7.1.0.tgz", - "integrity": "sha1-a6MY6xaWFyf10oT46gA+jWFU0Mg=", - "dev": true, - "dependencies": { - "camelcase": "^3.0.0", - "cliui": "^3.2.0", - "decamelize": "^1.1.1", - "get-caller-file": "^1.0.1", - "os-locale": "^1.4.0", - "read-pkg-up": "^1.0.1", - "require-directory": "^2.1.1", - "require-main-filename": "^1.0.1", - "set-blocking": "^2.0.0", - "string-width": "^1.0.2", - "which-module": "^1.0.0", - "y18n": "^3.2.1", - "yargs-parser": "^5.0.0" - } - }, - "node_modules/gulp/node_modules/yargs-parser": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-5.0.1.tgz", - "integrity": "sha512-wpav5XYiddjXxirPoCTUPbqM0PXvJ9hiBMvuJgInvo4/lAOTZzUprArw17q2O1P2+GHhbBr18/iQwjL5Z9BqfA==", - "dev": true, - "dependencies": { - "camelcase": "^3.0.0", - "object.assign": "^4.1.0" - } - }, - "node_modules/gulplog": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/gulplog/-/gulplog-1.0.0.tgz", - "integrity": "sha1-4oxNRdBey77YGDY86PnFkmIp/+U=", - "dev": true, - "dependencies": { - "glogg": "^1.0.0" - }, - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/har-schema": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", - "integrity": "sha512-Oqluz6zhGX8cyRaTQlFMPw80bSJVG2x/cFb8ZPhUILGgHka9SsokCCOQgpveePerqidZOrT14ipqfJb7ILcW5Q==", - "peer": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/har-validator": { - "version": "5.1.5", - "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.5.tgz", - "integrity": "sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==", - "deprecated": "this library is no longer supported", - "peer": true, - "dependencies": { - "ajv": "^6.12.3", - "har-schema": "^2.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/has": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", - "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", - "dev": true, - "dependencies": { - "function-bind": "^1.1.1" - }, - "engines": { - "node": ">= 0.4.0" - } - }, - "node_modules/has-ansi": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", - "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", - "dev": true, - "dependencies": { - "ansi-regex": "^2.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/has-symbols": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", - "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", - "dev": true, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-tostringtag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz", - "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==", - "dev": true, - "dependencies": { - "has-symbols": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-unicode": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", - "integrity": "sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==" - }, - "node_modules/has-value": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz", - "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=", - "dev": true, - "dependencies": { - "get-value": "^2.0.6", - "has-values": "^1.0.0", - "isobject": "^3.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/has-values": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz", - "integrity": "sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=", - "dev": true, - "dependencies": { - "is-number": "^3.0.0", - "kind-of": "^4.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/has-values/node_modules/kind-of": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", - "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", - "dev": true, - "dependencies": { - "is-buffer": "^1.1.5" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/hash-base": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.0.4.tgz", - "integrity": "sha1-X8hoaEfs1zSZQDMZprCj8/auSRg=", - "dev": true, - "dependencies": { - "inherits": "^2.0.1", - "safe-buffer": "^5.0.1" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/hash.js": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz", - "integrity": "sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==", - "dev": true, - "dependencies": { - "inherits": "^2.0.3", - "minimalistic-assert": "^1.0.1" - } - }, - "node_modules/hmac-drbg": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", - "integrity": "sha1-0nRXAQJabHdabFRXk+1QL8DGSaE=", - "dev": true, - "dependencies": { - "hash.js": "^1.0.3", - "minimalistic-assert": "^1.0.0", - "minimalistic-crypto-utils": "^1.0.1" - } - }, - "node_modules/homedir-polyfill": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/homedir-polyfill/-/homedir-polyfill-1.0.3.tgz", - "integrity": "sha512-eSmmWE5bZTK2Nou4g0AI3zZ9rswp7GRKoKXS1BLUkvPviOqs4YTN1djQIqrXy9k5gEtdLPy86JjRwsNM9tnDcA==", - "dev": true, - "dependencies": { - "parse-passwd": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/hosted-git-info": { - "version": "2.8.9", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", - "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==", - "dev": true - }, - "node_modules/html-escaper": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", - "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", - "dev": true - }, - "node_modules/htmlescape": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/htmlescape/-/htmlescape-1.1.1.tgz", - "integrity": "sha1-OgPtwiFLyjtmQko+eVk0lQnLA1E=", - "dev": true, - "engines": { - "node": ">=0.10" - } - }, - "node_modules/http-cache-semantics": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.0.tgz", - "integrity": "sha512-carPklcUh7ROWRK7Cv27RPtdhYhUsela/ue5/jKzjegVvXDqM2ILE9Q2BGn9JZJh1g87cp56su/FgQSzcWS8cQ==" - }, - "node_modules/http-errors": { - "version": "1.7.3", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.3.tgz", - "integrity": "sha512-ZTTX0MWrsQ2ZAhA1cejAwDLycFsd7I7nVtnkT3Ol0aqodaKW+0CTZDQ1uBv5whptCnc8e8HeRRJxRs0kmm/Qfw==", - "dev": true, - "dependencies": { - "depd": "~1.1.2", - "inherits": "2.0.4", - "setprototypeof": "1.1.1", - "statuses": ">= 1.5.0 < 2", - "toidentifier": "1.0.0" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/http-errors/node_modules/statuses": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", - "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=", - "dev": true, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/http-proxy": { - "version": "1.18.1", - "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.1.tgz", - "integrity": "sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==", - "dev": true, - "dependencies": { - "eventemitter3": "^4.0.0", - "follow-redirects": "^1.0.0", - "requires-port": "^1.0.0" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/http-proxy-agent": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-5.0.0.tgz", - "integrity": "sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==", - "dependencies": { - "@tootallnate/once": "2", - "agent-base": "6", - "debug": "4" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/http-proxy-agent/node_modules/debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "dependencies": { - "ms": "2.1.2" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/http-proxy-agent/node_modules/ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" - }, - "node_modules/http-signature": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", - "integrity": "sha512-CAbnr6Rz4CYQkLYUtSNXxQPUH2gK8f3iWexVlsnMeD+GjlsQ0Xsy1cOX+mN3dtxYomRy21CiOzU8Uhw6OwncEQ==", - "peer": true, - "dependencies": { - "assert-plus": "^1.0.0", - "jsprim": "^1.2.2", - "sshpk": "^1.7.0" - }, - "engines": { - "node": ">=0.8", - "npm": ">=1.3.7" - } - }, - "node_modules/https-browserify": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/https-browserify/-/https-browserify-1.0.0.tgz", - "integrity": "sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM=", - "dev": true - }, - "node_modules/https-proxy-agent": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", - "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", - "dependencies": { - "agent-base": "6", - "debug": "4" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/https-proxy-agent/node_modules/debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "dependencies": { - "ms": "2.1.2" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/https-proxy-agent/node_modules/ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" - }, - "node_modules/humanize-ms": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/humanize-ms/-/humanize-ms-1.2.1.tgz", - "integrity": "sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ==", - "dependencies": { - "ms": "^2.0.0" - } - }, - "node_modules/iconv-lite": { - "version": "0.4.24", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", - "dev": true, - "dependencies": { - "safer-buffer": ">= 2.1.2 < 3" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/ieee754": { - "version": "1.1.13", - "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.13.tgz", - "integrity": "sha512-4vf7I2LYV/HaWerSo3XmlMkp5eZ83i+/CDluXi/IGTs/O1sejBNhTtnxzmRZfvOUqj7lZjqHkeTvpgSFDlWZTg==" - }, - "node_modules/ignore": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.1.2.tgz", - "integrity": "sha512-vdqWBp7MyzdmHkkRWV5nY+PfGRbYbahfuvsBCh277tq+w9zyNi7h5CYJCK0kmzti9kU+O/cB7sE8HvKv6aXAKQ==", - "dev": true, - "engines": { - "node": ">= 4" - } - }, - "node_modules/immutable": { - "version": "3.8.2", - "resolved": "https://registry.npmjs.org/immutable/-/immutable-3.8.2.tgz", - "integrity": "sha512-15gZoQ38eYjEjxkorfbcgBKBL6R7T459OuK+CpcWt7O3KF4uPCx2tD0uFETlUDIyo+1789crbMhTvQBSR5yBMg==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/imurmurhash": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", - "engines": { - "node": ">=0.8.19" - } - }, - "node_modules/indent-string": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", - "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", - "engines": { - "node": ">=8" - } - }, - "node_modules/infer-owner": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/infer-owner/-/infer-owner-1.0.4.tgz", - "integrity": "sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A==" - }, - "node_modules/inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", - "dependencies": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "node_modules/inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" - }, - "node_modules/ini": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", - "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==" - }, - "node_modules/inline-source-map": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/inline-source-map/-/inline-source-map-0.6.2.tgz", - "integrity": "sha1-+Tk0ccGKedFyT4Y/o4tYY3Ct4qU=", - "dev": true, - "dependencies": { - "source-map": "~0.5.3" - } - }, - "node_modules/insert-module-globals": { - "version": "7.2.1", - "resolved": "https://registry.npmjs.org/insert-module-globals/-/insert-module-globals-7.2.1.tgz", - "integrity": "sha512-ufS5Qq9RZN+Bu899eA9QCAYThY+gGW7oRkmb0vC93Vlyu/CFGcH0OYPEjVkDXA5FEbTt1+VWzdoOD3Ny9N+8tg==", - "dev": true, - "dependencies": { - "acorn-node": "^1.5.2", - "combine-source-map": "^0.8.0", - "concat-stream": "^1.6.1", - "is-buffer": "^1.1.0", - "JSONStream": "^1.0.3", - "path-is-absolute": "^1.0.1", - "process": "~0.11.0", - "through2": "^2.0.0", - "undeclared-identifiers": "^1.1.2", - "xtend": "^4.0.0" - }, - "bin": { - "insert-module-globals": "bin/cmd.js" - } - }, - "node_modules/insert-module-globals/node_modules/isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", - "dev": true - }, - "node_modules/insert-module-globals/node_modules/readable-stream": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", - "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", - "dev": true, - "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "node_modules/insert-module-globals/node_modules/string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, - "dependencies": { - "safe-buffer": "~5.1.0" - } - }, - "node_modules/insert-module-globals/node_modules/through2": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", - "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", - "dev": true, - "dependencies": { - "readable-stream": "~2.3.6", - "xtend": "~4.0.1" - } - }, - "node_modules/interpret": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.2.0.tgz", - "integrity": "sha512-mT34yGKMNceBQUoVn7iCDKDntA7SC6gycMAWzGx1z/CMCTV7b2AAtXlo3nRyHZ1FelRkQbQjprHSYGwzLtkVbw==", - "dev": true, - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/invert-kv": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-1.0.0.tgz", - "integrity": "sha1-EEqOSqym09jNFXqO+L+rLXo//bY=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/ip": { - "version": "1.1.8", - "resolved": "https://registry.npmjs.org/ip/-/ip-1.1.8.tgz", - "integrity": "sha512-PuExPYUiu6qMBQb4l06ecm6T6ujzhmh+MeJcW9wa89PoAz5pvd4zPgN5WJV104mb6S2T1AwNIAaB70JNrLQWhg==" - }, - "node_modules/is-absolute": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-absolute/-/is-absolute-1.0.0.tgz", - "integrity": "sha512-dOWoqflvcydARa360Gvv18DZ/gRuHKi2NU/wU5X1ZFzdYfH29nkiNZsF3mp4OJ3H4yo9Mx8A/uAGNzpzPN3yBA==", - "dev": true, - "dependencies": { - "is-relative": "^1.0.0", - "is-windows": "^1.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-accessor-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", - "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", - "dev": true, - "dependencies": { - "kind-of": "^3.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-accessor-descriptor/node_modules/kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "dependencies": { - "is-buffer": "^1.1.5" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-arguments": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.1.tgz", - "integrity": "sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-arrayish": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", - "dev": true - }, - "node_modules/is-binary-path": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz", - "integrity": "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=", - "dev": true, - "dependencies": { - "binary-extensions": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-buffer": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", - "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", - "dev": true - }, - "node_modules/is-callable": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", - "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", - "dev": true, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-core-module": { - "version": "2.11.0", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.11.0.tgz", - "integrity": "sha512-RRjxlvLDkD1YJwDbroBHMb+cukurkDWNyHx7D3oNB5x9rb5ogcksMC5wHCadcXoo67gVr/+3GFySh3134zi6rw==", - "dev": true, - "dependencies": { - "has": "^1.0.3" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-data-descriptor": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", - "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", - "dev": true, - "dependencies": { - "kind-of": "^3.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-data-descriptor/node_modules/kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "dependencies": { - "is-buffer": "^1.1.5" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", - "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", - "dev": true, - "dependencies": { - "is-accessor-descriptor": "^0.1.6", - "is-data-descriptor": "^0.1.4", - "kind-of": "^5.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-descriptor/node_modules/kind-of": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", - "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-extendable": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", - "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-fullwidth-code-point": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", - "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", - "dependencies": { - "number-is-nan": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-generator-function": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.0.10.tgz", - "integrity": "sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==", - "dev": true, - "dependencies": { - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-glob": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", - "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", - "dev": true, - "dependencies": { - "is-extglob": "^2.1.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-lambda": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-lambda/-/is-lambda-1.0.1.tgz", - "integrity": "sha512-z7CMFGNrENq5iFB9Bqo64Xk6Y9sg+epq1myIcdHaGnbMTYOxvzsEtdYqQUylB7LxfkvgrrjP32T6Ywciio9UIQ==" - }, - "node_modules/is-negated-glob": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-negated-glob/-/is-negated-glob-1.0.0.tgz", - "integrity": "sha1-aRC8pdqMleeEtXUbl2z1oQ/uNtI=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-number": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", - "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", - "dev": true, - "dependencies": { - "kind-of": "^3.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-number-like": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/is-number-like/-/is-number-like-1.0.8.tgz", - "integrity": "sha512-6rZi3ezCyFcn5L71ywzz2bS5b2Igl1En3eTlZlvKjpz1n3IZLAYMbKYAIQgFmEu0GENg92ziU/faEOA/aixjbA==", - "dev": true, - "dependencies": { - "lodash.isfinite": "^3.3.2" - } - }, - "node_modules/is-number/node_modules/kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "dependencies": { - "is-buffer": "^1.1.5" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-path-cwd": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-2.2.0.tgz", - "integrity": "sha512-w942bTcih8fdJPJmQHFzkS76NEP8Kzzvmw92cXsazb8intwLqPibPPdXf4ANdKV3rYMuuQYGIWtvz9JilB3NFQ==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/is-path-in-cwd": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-path-in-cwd/-/is-path-in-cwd-3.0.0.tgz", - "integrity": "sha512-QGuLYLNfpHI/xLQ8ctyeD9mMCf2eBqrtxYWKQxlExrD0l3wBSDcplKYfV55lnTDB4MDvh9SRDt/VnDwVn0dYOw==", - "dev": true, - "dependencies": { - "is-path-inside": "^3.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/is-path-inside": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.1.tgz", - "integrity": "sha512-CKstxrctq1kUesU6WhtZDbYKzzYBuRH0UYInAVrkc/EYdB9ltbfE0gOoayG9nhohG6447sOOVGhHqsdmBvkbNg==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/is-plain-object": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", - "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", - "dev": true, - "dependencies": { - "isobject": "^3.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-relative": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-relative/-/is-relative-1.0.0.tgz", - "integrity": "sha512-Kw/ReK0iqwKeu0MITLFuj0jbPAmEiOsIwyIXvvbfa6QfmN9pkD1M+8pdk7Rl/dTKbH34/XBFMbgD4iMJhLQbGA==", - "dev": true, - "dependencies": { - "is-unc-path": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-typed-array": { - "version": "1.1.10", - "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.10.tgz", - "integrity": "sha512-PJqgEHiWZvMpaFZ3uTc8kHPM4+4ADTlDniuQL7cU/UDA0Ql7F70yGfHph3cLNe+c9toaigv+DFzTJKhc2CtO6A==", - "dev": true, - "dependencies": { - "available-typed-arrays": "^1.0.5", - "call-bind": "^1.0.2", - "for-each": "^0.3.3", - "gopd": "^1.0.1", - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-typedarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", - "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==", - "peer": true - }, - "node_modules/is-unc-path": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-unc-path/-/is-unc-path-1.0.0.tgz", - "integrity": "sha512-mrGpVd0fs7WWLfVsStvgF6iEJnbjDFZh9/emhRDcGWTduTfNHd9CHeUwH3gYIjdbwo4On6hunkztwOaAw0yllQ==", - "dev": true, - "dependencies": { - "unc-path-regex": "^0.1.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-utf8": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz", - "integrity": "sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=", - "dev": true - }, - "node_modules/is-valid-glob": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-valid-glob/-/is-valid-glob-1.0.0.tgz", - "integrity": "sha1-Kb8+/3Ab4tTTFdusw5vDn+j2Aao=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-windows": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", - "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-wsl": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-1.1.0.tgz", - "integrity": "sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0=", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/isarray": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=" - }, - "node_modules/isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=" - }, - "node_modules/isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/isstream": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", - "integrity": "sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g==", - "peer": true - }, - "node_modules/istanbul-lib-coverage": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.0.tgz", - "integrity": "sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/istanbul-lib-report": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", - "integrity": "sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw==", - "dev": true, - "dependencies": { - "istanbul-lib-coverage": "^3.0.0", - "make-dir": "^3.0.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/istanbul-lib-report/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/istanbul-lib-report/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/istanbul-reports": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.5.tgz", - "integrity": "sha512-nUsEMa9pBt/NOHqbcbeJEgqIlY/K7rVWUX6Lql2orY5e9roQOthbR3vtY4zzf2orPELg80fnxxk9zUyPlgwD1w==", - "dev": true, - "dependencies": { - "html-escaper": "^2.0.0", - "istanbul-lib-report": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/istextorbinary": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/istextorbinary/-/istextorbinary-2.2.1.tgz", - "integrity": "sha512-TS+hoFl8Z5FAFMK38nhBkdLt44CclNRgDHWeMgsV8ko3nDlr/9UI2Sf839sW7enijf8oKsZYXRvM8g0it9Zmcw==", - "dev": true, - "dependencies": { - "binaryextensions": "2", - "editions": "^1.3.3", - "textextensions": "2" - }, - "engines": { - "node": ">=0.12" - } - }, - "node_modules/js-beautify": { - "version": "1.10.3", - "resolved": "https://registry.npmjs.org/js-beautify/-/js-beautify-1.10.3.tgz", - "integrity": "sha512-wfk/IAWobz1TfApSdivH5PJ0miIHgDoYb1ugSqHcODPmaYu46rYe5FVuIEkhjg8IQiv6rDNPyhsqbsohI/C2vQ==", - "dev": true, - "dependencies": { - "config-chain": "^1.1.12", - "editorconfig": "^0.15.3", - "glob": "^7.1.3", - "mkdirp": "~0.5.1", - "nopt": "~4.0.1" - }, - "bin": { - "css-beautify": "js/bin/css-beautify.js", - "html-beautify": "js/bin/html-beautify.js", - "js-beautify": "js/bin/js-beautify.js" - } - }, - "node_modules/js-beautify/node_modules/nopt": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/nopt/-/nopt-4.0.3.tgz", - "integrity": "sha512-CvaGwVMztSMJLOeXPrez7fyfObdZqNUK1cPAEzLHrTybIua9pMdmmPR5YwtfNftIOMv3DPUhFaxsZMNTQO20Kg==", - "dev": true, - "dependencies": { - "abbrev": "1", - "osenv": "^0.1.4" - }, - "bin": { - "nopt": "bin/nopt.js" - } - }, - "node_modules/jsbn": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", - "integrity": "sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg==", - "peer": true - }, - "node_modules/json-schema": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz", - "integrity": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==", - "peer": true - }, - "node_modules/json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "peer": true - }, - "node_modules/json-stable-stringify-without-jsonify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", - "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=", - "dev": true - }, - "node_modules/json-stringify-safe": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", - "integrity": "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==", - "peer": true - }, - "node_modules/jsonfile": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-3.0.1.tgz", - "integrity": "sha1-pezG9l9T9mLEQVx2daAzHQmS7GY=", - "dev": true, - "optionalDependencies": { - "graceful-fs": "^4.1.6" - } - }, - "node_modules/jsonparse": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/jsonparse/-/jsonparse-1.3.1.tgz", - "integrity": "sha1-P02uSpH6wxX3EGL4UhzCOfE2YoA=", - "dev": true, - "engines": [ - "node >= 0.2.0" - ] - }, - "node_modules/JSONStream": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/JSONStream/-/JSONStream-1.3.5.tgz", - "integrity": "sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ==", - "dev": true, - "dependencies": { - "jsonparse": "^1.2.0", - "through": ">=2.2.7 <3" - }, - "bin": { - "JSONStream": "bin.js" - }, - "engines": { - "node": "*" - } - }, - "node_modules/jsprim": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.2.tgz", - "integrity": "sha512-P2bSOMAc/ciLz6DzgjVlGJP9+BrJWu5UDGK70C2iweC5QBIeFf0ZXRvGjEj2uYgrY2MkAAhsSWHDWlFtEroZWw==", - "peer": true, - "dependencies": { - "assert-plus": "1.0.0", - "extsprintf": "1.3.0", - "json-schema": "0.4.0", - "verror": "1.10.0" - }, - "engines": { - "node": ">=0.6.0" - } - }, - "node_modules/just-debounce": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/just-debounce/-/just-debounce-1.0.0.tgz", - "integrity": "sha1-h/zPrv/AtozRnVX2cilD+SnqNeo=", - "dev": true - }, - "node_modules/just-extend": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/just-extend/-/just-extend-4.0.2.tgz", - "integrity": "sha512-FrLwOgm+iXrPV+5zDU6Jqu4gCRXbWEQg2O3SKONsWE4w7AXFRkryS53bpWdaL9cNol+AmR3AEYz6kn+o0fCPnw==", - "dev": true - }, - "node_modules/kind-of": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", - "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/labeled-stream-splicer": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/labeled-stream-splicer/-/labeled-stream-splicer-2.0.2.tgz", - "integrity": "sha512-Ca4LSXFFZUjPScRaqOcFxneA0VpKZr4MMYCljyQr4LIewTLb3Y0IUTIsnBBsVubIeEfxeSZpSjSsRM8APEQaAw==", - "dev": true, - "dependencies": { - "inherits": "^2.0.1", - "stream-splicer": "^2.0.0" - } - }, - "node_modules/last-run": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/last-run/-/last-run-1.1.1.tgz", - "integrity": "sha1-RblpQsF7HHnHchmCWbqUO+v4yls=", - "dev": true, - "dependencies": { - "default-resolution": "^2.0.0", - "es6-weak-map": "^2.0.1" - }, - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/lazystream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/lazystream/-/lazystream-1.0.0.tgz", - "integrity": "sha1-9plf4PggOS9hOWvolGJAe7dxaOQ=", - "dev": true, - "dependencies": { - "readable-stream": "^2.0.5" - }, - "engines": { - "node": ">= 0.6.3" - } - }, - "node_modules/lazystream/node_modules/isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", - "dev": true - }, - "node_modules/lazystream/node_modules/readable-stream": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", - "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", - "dev": true, - "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "node_modules/lazystream/node_modules/string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, - "dependencies": { - "safe-buffer": "~5.1.0" - } - }, - "node_modules/lcid": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/lcid/-/lcid-1.0.0.tgz", - "integrity": "sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU=", - "dev": true, - "dependencies": { - "invert-kv": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/lead": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/lead/-/lead-1.0.0.tgz", - "integrity": "sha1-bxT5mje+Op3XhPVJVpDlkDRm7kI=", - "dev": true, - "dependencies": { - "flush-write-stream": "^1.0.2" - }, - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/liftoff": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/liftoff/-/liftoff-3.1.0.tgz", - "integrity": "sha512-DlIPlJUkCV0Ips2zf2pJP0unEoT1kwYhiiPUGF3s/jtxTCjziNLoiVVh+jqWOWeFi6mmwQ5fNxvAUyPad4Dfog==", - "dev": true, - "dependencies": { - "extend": "^3.0.0", - "findup-sync": "^3.0.0", - "fined": "^1.0.1", - "flagged-respawn": "^1.0.0", - "is-plain-object": "^2.0.4", - "object.map": "^1.0.0", - "rechoir": "^0.6.2", - "resolve": "^1.1.7" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/limiter": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/limiter/-/limiter-1.1.5.tgz", - "integrity": "sha512-FWWMIEOxz3GwUI4Ts/IvgVy6LPvoMPgjMdQ185nN6psJyBJ4yOpzqm695/h5umdLJg2vW3GR5iG11MAkR2AzJA==", - "dev": true - }, - "node_modules/load-json-file": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz", - "integrity": "sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA=", - "dev": true, - "dependencies": { - "graceful-fs": "^4.1.2", - "parse-json": "^2.2.0", - "pify": "^2.0.0", - "pinkie-promise": "^2.0.0", - "strip-bom": "^2.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/localtunnel": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/localtunnel/-/localtunnel-2.0.2.tgz", - "integrity": "sha512-n418Cn5ynvJd7m/N1d9WVJISLJF/ellZnfsLnx8WBWGzxv/ntNcFkJ1o6se5quUhCplfLGBNL5tYHiq5WF3Nug==", - "dev": true, - "dependencies": { - "axios": "0.21.4", - "debug": "4.3.2", - "openurl": "1.1.1", - "yargs": "17.1.1" - }, - "bin": { - "lt": "bin/lt.js" - }, - "engines": { - "node": ">=8.3.0" - } - }, - "node_modules/localtunnel/node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/localtunnel/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/localtunnel/node_modules/cliui": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", - "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", - "dev": true, - "dependencies": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", - "wrap-ansi": "^7.0.0" - } - }, - "node_modules/localtunnel/node_modules/get-caller-file": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", - "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", - "dev": true, - "engines": { - "node": "6.* || 8.* || >= 10.*" - } - }, - "node_modules/localtunnel/node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/localtunnel/node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/localtunnel/node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/localtunnel/node_modules/wrap-ansi": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, - "node_modules/localtunnel/node_modules/y18n": { - "version": "5.0.8", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", - "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", - "dev": true, - "engines": { - "node": ">=10" - } - }, - "node_modules/localtunnel/node_modules/yargs": { - "version": "17.1.1", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.1.1.tgz", - "integrity": "sha512-c2k48R0PwKIqKhPMWjeiF6y2xY/gPMUlro0sgxqXpbOIohWiLNXWslsootttv7E1e73QPAMQSg5FeySbVcpsPQ==", - "dev": true, - "dependencies": { - "cliui": "^7.0.2", - "escalade": "^3.1.1", - "get-caller-file": "^2.0.5", - "require-directory": "^2.1.1", - "string-width": "^4.2.0", - "y18n": "^5.0.5", - "yargs-parser": "^20.2.2" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/locate-path": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", - "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", - "dev": true, - "dependencies": { - "p-locate": "^5.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/lodash": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", - "dev": true - }, - "node_modules/lodash._reinterpolate": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/lodash._reinterpolate/-/lodash._reinterpolate-3.0.0.tgz", - "integrity": "sha1-DM8tiRZq8Ds2Y8eWU4t1rG4RTZ0=", - "dev": true - }, - "node_modules/lodash.isfinite": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/lodash.isfinite/-/lodash.isfinite-3.3.2.tgz", - "integrity": "sha512-7FGG40uhC8Mm633uKW1r58aElFlBlxCrg9JfSi3P6aYiWmfiWF0PgMd86ZUsxE5GwWPdHoS2+48bwTh2VPkIQA==", - "dev": true - }, - "node_modules/lodash.memoize": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-3.0.4.tgz", - "integrity": "sha1-LcvSwofLwKVcxCMovQxzYVDVPj8=", - "dev": true - }, - "node_modules/lodash.template": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/lodash.template/-/lodash.template-4.5.0.tgz", - "integrity": "sha512-84vYFxIkmidUiFxidA/KjjH9pAycqW+h980j7Fuz5qxRtO9pgB7MDFTdys1N7A5mcucRiDyEq4fusljItR1T/A==", - "dev": true, - "dependencies": { - "lodash._reinterpolate": "^3.0.0", - "lodash.templatesettings": "^4.0.0" - } - }, - "node_modules/lodash.templatesettings": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/lodash.templatesettings/-/lodash.templatesettings-4.2.0.tgz", - "integrity": "sha512-stgLz+i3Aa9mZgnjr/O+v9ruKZsPsndy7qPZOchbqk2cnTU1ZaldKK+v7m54WoKIyxiuMZTKT2H81F8BeAc3ZQ==", - "dev": true, - "dependencies": { - "lodash._reinterpolate": "^3.0.0" - } - }, - "node_modules/lolex": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/lolex/-/lolex-4.1.0.tgz", - "integrity": "sha512-BYxIEXiVq5lGIXeVHnsFzqa1TxN5acnKnPCdlZSpzm8viNEOhiigupA4vTQ9HEFQ6nLTQ9wQOgBknJgzUYQ9Aw==", - "dev": true - }, - "node_modules/lru-cache": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz", - "integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==", - "dev": true, - "dependencies": { - "pseudomap": "^1.0.2", - "yallist": "^2.1.2" - } - }, - "node_modules/lru-cache/node_modules/yallist": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", - "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=", - "dev": true - }, - "node_modules/make-dir": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", - "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", - "dev": true, - "dependencies": { - "semver": "^6.0.0" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/make-dir/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true, - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/make-fetch-happen": { - "version": "10.1.8", - "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-10.1.8.tgz", - "integrity": "sha512-0ASJbG12Au6+N5I84W+8FhGS6iM8MyzvZady+zaQAu+6IOaESFzCLLD0AR1sAFF3Jufi8bxm586ABN6hWd3k7g==", - "dependencies": { - "agentkeepalive": "^4.2.1", - "cacache": "^16.1.0", - "http-cache-semantics": "^4.1.0", - "http-proxy-agent": "^5.0.0", - "https-proxy-agent": "^5.0.0", - "is-lambda": "^1.0.1", - "lru-cache": "^7.7.1", - "minipass": "^3.1.6", - "minipass-collect": "^1.0.2", - "minipass-fetch": "^2.0.3", - "minipass-flush": "^1.0.5", - "minipass-pipeline": "^1.2.4", - "negotiator": "^0.6.3", - "promise-retry": "^2.0.1", - "socks-proxy-agent": "^7.0.0", - "ssri": "^9.0.0" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/make-fetch-happen/node_modules/lru-cache": { - "version": "7.12.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.12.0.tgz", - "integrity": "sha512-OIP3DwzRZDfLg9B9VP/huWBlpvbkmbfiBy8xmsXp4RPmE4A3MhwNozc5ZJ3fWnSg8fDcdlE/neRTPG2ycEKliw==", - "engines": { - "node": ">=12" - } - }, - "node_modules/make-fetch-happen/node_modules/negotiator": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", - "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/make-iterator": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/make-iterator/-/make-iterator-1.0.1.tgz", - "integrity": "sha512-pxiuXh0iVEq7VM7KMIhs5gxsfxCux2URptUQaXo4iZZJxBAzTPOLE2BumO5dbfVYq/hBJFBR/a1mFDmOx5AGmw==", - "dev": true, - "dependencies": { - "kind-of": "^6.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/map-cache": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", - "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/map-visit": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz", - "integrity": "sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=", - "dev": true, - "dependencies": { - "object-visit": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/matchdep": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/matchdep/-/matchdep-2.0.0.tgz", - "integrity": "sha1-xvNINKDY28OzfCfui7yyfHd1WC4=", - "dev": true, - "dependencies": { - "findup-sync": "^2.0.0", - "micromatch": "^3.0.4", - "resolve": "^1.4.0", - "stack-trace": "0.0.10" - }, - "engines": { - "node": ">= 0.10.0" - } - }, - "node_modules/matchdep/node_modules/findup-sync": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-2.0.0.tgz", - "integrity": "sha1-kyaxSIwi0aYIhlCoaQGy2akKLLw=", - "dev": true, - "dependencies": { - "detect-file": "^1.0.0", - "is-glob": "^3.1.0", - "micromatch": "^3.0.4", - "resolve-dir": "^1.0.1" - }, - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/matchdep/node_modules/is-glob": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", - "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", - "dev": true, - "dependencies": { - "is-extglob": "^2.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/md5.js": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.5.tgz", - "integrity": "sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==", - "dev": true, - "dependencies": { - "hash-base": "^3.0.0", - "inherits": "^2.0.1", - "safe-buffer": "^5.1.2" - } - }, - "node_modules/merge-stream": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-1.0.1.tgz", - "integrity": "sha1-QEEgLVCKNCugAXQAjfDCUbjBNeE=", - "dev": true, - "dependencies": { - "readable-stream": "^2.0.1" - } - }, - "node_modules/merge-stream/node_modules/isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", - "dev": true - }, - "node_modules/merge-stream/node_modules/readable-stream": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", - "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", - "dev": true, - "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "node_modules/merge-stream/node_modules/string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, - "dependencies": { - "safe-buffer": "~5.1.0" - } - }, - "node_modules/merge2": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.2.3.tgz", - "integrity": "sha512-gdUU1Fwj5ep4kplwcmftruWofEFt6lfpkkr3h860CXbAB9c3hGb55EOL2ali0Td5oebvW0E1+3Sr+Ur7XfKpRA==", - "dev": true, - "engines": { - "node": ">= 4.5.0" - } - }, - "node_modules/micromatch": { - "version": "3.1.10", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", - "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", - "dev": true, - "dependencies": { - "arr-diff": "^4.0.0", - "array-unique": "^0.3.2", - "braces": "^2.3.1", - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "extglob": "^2.0.4", - "fragment-cache": "^0.2.1", - "kind-of": "^6.0.2", - "nanomatch": "^1.2.9", - "object.pick": "^1.3.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/miller-rabin": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/miller-rabin/-/miller-rabin-4.0.1.tgz", - "integrity": "sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==", - "dev": true, - "dependencies": { - "bn.js": "^4.0.0", - "brorand": "^1.0.1" - }, - "bin": { - "miller-rabin": "bin/miller-rabin" - } - }, - "node_modules/mime": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/mime/-/mime-1.4.1.tgz", - "integrity": "sha512-KI1+qOZu5DcW6wayYHSzR/tXKCDC5Om4s1z2QJjDULzLcmf3DvzS7oluY4HCTrc+9FiKmWUgeNLg7W3uIQvxtQ==", - "dev": true, - "bin": { - "mime": "cli.js" - } - }, - "node_modules/mime-db": { - "version": "1.40.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.40.0.tgz", - "integrity": "sha512-jYdeOMPy9vnxEqFRRo6ZvTZ8d9oPb+k18PKoYNYUe2stVEBPPwsln/qWzdbmaIvnhZ9v2P+CuecK+fpUfsV2mA==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/mime-types": { - "version": "2.1.24", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.24.tgz", - "integrity": "sha512-WaFHS3MCl5fapm3oLxU4eYDw77IQM2ACcxQ9RIxfaC3ooc6PFuBMGZZsYpvoXS5D5QTWPieo1jjLdAm3TBP3cQ==", - "dependencies": { - "mime-db": "1.40.0" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/mimic-response": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz", - "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/minimalistic-assert": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", - "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==", - "dev": true - }, - "node_modules/minimalistic-crypto-utils": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz", - "integrity": "sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo=", - "dev": true - }, - "node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/minimist": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.7.tgz", - "integrity": "sha512-bzfL1YUZsP41gmu/qjrEk0Q6i2ix/cVeAhbCbqH9u3zYutS1cLg00qhrD0M2MVdCcx4Sc0UpP2eBWo9rotpq6g==", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/minipass": { - "version": "3.3.4", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.4.tgz", - "integrity": "sha512-I9WPbWHCGu8W+6k1ZiGpPu0GkoKBeorkfKNuAFBNS1HNFJvke82sxvI5bzcCNpWPorkOO5QQ+zomzzwRxejXiw==", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/minipass-collect": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/minipass-collect/-/minipass-collect-1.0.2.tgz", - "integrity": "sha512-6T6lH0H8OG9kITm/Jm6tdooIbogG9e0tLgpY6mphXSm/A9u8Nq1ryBG+Qspiub9LjWlBPsPS3tWQ/Botq4FdxA==", - "dependencies": { - "minipass": "^3.0.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/minipass-fetch": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-2.1.0.tgz", - "integrity": "sha512-H9U4UVBGXEyyWJnqYDCLp1PwD8XIkJ4akNHp1aGVI+2Ym7wQMlxDKi4IB4JbmyU+pl9pEs/cVrK6cOuvmbK4Sg==", - "dependencies": { - "minipass": "^3.1.6", - "minipass-sized": "^1.0.3", - "minizlib": "^2.1.2" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - }, - "optionalDependencies": { - "encoding": "^0.1.13" - } - }, - "node_modules/minipass-flush": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/minipass-flush/-/minipass-flush-1.0.5.tgz", - "integrity": "sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw==", - "dependencies": { - "minipass": "^3.0.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/minipass-pipeline": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/minipass-pipeline/-/minipass-pipeline-1.2.4.tgz", - "integrity": "sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A==", - "dependencies": { - "minipass": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/minipass-sized": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/minipass-sized/-/minipass-sized-1.0.3.tgz", - "integrity": "sha512-MbkQQ2CTiBMlA2Dm/5cY+9SWFEN8pzzOXi6rlM5Xxq0Yqbda5ZQy9sU75a673FE9ZK0Zsbr6Y5iP6u9nktfg2g==", - "dependencies": { - "minipass": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/minizlib": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz", - "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==", - "dependencies": { - "minipass": "^3.0.0", - "yallist": "^4.0.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/mitt": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/mitt/-/mitt-1.2.0.tgz", - "integrity": "sha512-r6lj77KlwqLhIUku9UWYes7KJtsczvolZkzp8hbaDPPaE24OmWl5s539Mytlj22siEQKosZ26qCBgda2PKwoJw==", - "dev": true - }, - "node_modules/mixin-deep": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.2.tgz", - "integrity": "sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==", - "dev": true, - "dependencies": { - "for-in": "^1.0.2", - "is-extendable": "^1.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/mixin-deep/node_modules/is-extendable": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", - "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", - "dev": true, - "dependencies": { - "is-plain-object": "^2.0.4" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/mkdirp": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.3.tgz", - "integrity": "sha512-P+2gwrFqx8lhew375MQHHeTlY8AuOJSrGf0R5ddkEndUkmwpgUob/vQuBD1V22/Cw1/lJr4x+EjllSezBThzBg==", - "deprecated": "Legacy versions of mkdirp are no longer supported. Please update to mkdirp 1.x. (Note that the API surface has changed to use Promises in 1.x.)", - "dev": true, - "dependencies": { - "minimist": "^1.2.5" - }, - "bin": { - "mkdirp": "bin/cmd.js" - } - }, - "node_modules/mkdirp-classic": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz", - "integrity": "sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==" - }, - "node_modules/module-deps": { - "version": "6.2.3", - "resolved": "https://registry.npmjs.org/module-deps/-/module-deps-6.2.3.tgz", - "integrity": "sha512-fg7OZaQBcL4/L+AK5f4iVqf9OMbCclXfy/znXRxTVhJSeW5AIlS9AwheYwDaXM3lVW7OBeaeUEY3gbaC6cLlSA==", - "dev": true, - "dependencies": { - "browser-resolve": "^2.0.0", - "cached-path-relative": "^1.0.2", - "concat-stream": "~1.6.0", - "defined": "^1.0.0", - "detective": "^5.2.0", - "duplexer2": "^0.1.2", - "inherits": "^2.0.1", - "JSONStream": "^1.0.3", - "parents": "^1.0.0", - "readable-stream": "^2.0.2", - "resolve": "^1.4.0", - "stream-combiner2": "^1.1.1", - "subarg": "^1.0.0", - "through2": "^2.0.0", - "xtend": "^4.0.0" - }, - "bin": { - "module-deps": "bin/cmd.js" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/module-deps/node_modules/isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", - "dev": true - }, - "node_modules/module-deps/node_modules/readable-stream": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", - "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", - "dev": true, - "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "node_modules/module-deps/node_modules/string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, - "dependencies": { - "safe-buffer": "~5.1.0" - } - }, - "node_modules/module-deps/node_modules/through2": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", - "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", - "dev": true, - "dependencies": { - "readable-stream": "~2.3.6", - "xtend": "~4.0.1" - } - }, - "node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" - }, - "node_modules/mute-stdout": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/mute-stdout/-/mute-stdout-1.0.1.tgz", - "integrity": "sha512-kDcwXR4PS7caBpuRYYBUz9iVixUk3anO3f5OYFiIPwK/20vCzKCHyKoulbiDY1S53zD2bxUpxN/IJ+TnXjfvxg==", - "dev": true, - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/nan": { - "version": "2.17.0", - "resolved": "https://registry.npmjs.org/nan/-/nan-2.17.0.tgz", - "integrity": "sha512-2ZTgtl0nJsO0KQCjEpxcIr5D+Yv90plTitZt9JBfQvVJDS5seMl3FOvsh3+9CoYWXf/1l5OaZzzF6nDm4cagaQ==" - }, - "node_modules/nanomatch": { - "version": "1.2.13", - "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz", - "integrity": "sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==", - "dev": true, - "dependencies": { - "arr-diff": "^4.0.0", - "array-unique": "^0.3.2", - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "fragment-cache": "^0.2.1", - "is-windows": "^1.0.2", - "kind-of": "^6.0.2", - "object.pick": "^1.3.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/napi-build-utils": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/napi-build-utils/-/napi-build-utils-1.0.2.tgz", - "integrity": "sha512-ONmRUqK7zj7DWX0D9ADe03wbwOBZxNAfF20PlGfCWQcD3+/MakShIHrMqx9YwPTfxDdF1zLeL+RGZiR9kGMLdg==" - }, - "node_modules/negotiator": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz", - "integrity": "sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw==", - "dev": true, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/next-tick": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/next-tick/-/next-tick-1.0.0.tgz", - "integrity": "sha1-yobR/ogoFpsBICCOPchCS524NCw=", - "dev": true - }, - "node_modules/nise": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/nise/-/nise-1.5.0.tgz", - "integrity": "sha512-Z3sfYEkLFzFmL8KY6xnSJLRxwQwYBjOXi/24lb62ZnZiGA0JUzGGTI6TBIgfCSMIDl9Jlu8SRmHNACLTemDHww==", - "dev": true, - "dependencies": { - "@sinonjs/formatio": "^3.1.0", - "@sinonjs/text-encoding": "^0.7.1", - "just-extend": "^4.0.2", - "lolex": "^4.1.0", - "path-to-regexp": "^1.7.0" - } - }, - "node_modules/node-abi": { - "version": "3.22.0", - "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-3.22.0.tgz", - "integrity": "sha512-u4uAs/4Zzmp/jjsD9cyFYDXeISfUWaAVWshPmDZOFOv4Xl4SbzTXm53I04C2uRueYJ+0t5PEtLH/owbn2Npf/w==", - "dependencies": { - "semver": "^7.3.5" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/node-abi/node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/node-abi/node_modules/semver": { - "version": "7.3.7", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz", - "integrity": "sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==", - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/node-gyp": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-9.0.0.tgz", - "integrity": "sha512-Ma6p4s+XCTPxCuAMrOA/IJRmVy16R8Sdhtwl4PrCr7IBlj4cPawF0vg/l7nOT1jPbuNS7lIRJpBSvVsXwEZuzw==", - "dependencies": { - "env-paths": "^2.2.0", - "glob": "^7.1.4", - "graceful-fs": "^4.2.6", - "make-fetch-happen": "^10.0.3", - "nopt": "^5.0.0", - "npmlog": "^6.0.0", - "rimraf": "^3.0.2", - "semver": "^7.3.5", - "tar": "^6.1.2", - "which": "^2.0.2" - }, - "bin": { - "node-gyp": "bin/node-gyp.js" - }, - "engines": { - "node": "^12.22 || ^14.13 || >=16" - } - }, - "node_modules/node-gyp/node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/node-gyp/node_modules/semver": { - "version": "7.3.7", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz", - "integrity": "sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==", - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/node-gyp/node_modules/which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "node-which": "bin/node-which" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/node-watch": { - "version": "0.7.3", - "resolved": "https://registry.npmjs.org/node-watch/-/node-watch-0.7.3.tgz", - "integrity": "sha512-3l4E8uMPY1HdMMryPRUAl+oIHtXtyiTlIiESNSVSNxcPfzAFzeTbXFQkZfAwBbo0B1qMSG8nUABx+Gd+YrbKrQ==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/noop-logger": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/noop-logger/-/noop-logger-0.1.1.tgz", - "integrity": "sha512-6kM8CLXvuW5crTxsAtva2YLrRrDaiTIkIePWs9moLHqbFWT94WpNFjwS/5dfLfECg5i/lkmw3aoqVidxt23TEQ==", - "peer": true - }, - "node_modules/nopt": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/nopt/-/nopt-5.0.0.tgz", - "integrity": "sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ==", - "dependencies": { - "abbrev": "1" - }, - "bin": { - "nopt": "bin/nopt.js" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/normalize-package-data": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", - "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", - "dev": true, - "dependencies": { - "hosted-git-info": "^2.1.4", - "resolve": "^1.10.0", - "semver": "2 || 3 || 4 || 5", - "validate-npm-package-license": "^3.0.1" - } - }, - "node_modules/normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/now-and-later": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/now-and-later/-/now-and-later-2.0.1.tgz", - "integrity": "sha512-KGvQ0cB70AQfg107Xvs/Fbu+dGmZoTRJp2TaPwcwQm3/7PteUyN2BCgk8KBMPGBUXZdVwyWS8fDCGFygBm19UQ==", - "dev": true, - "dependencies": { - "once": "^1.3.2" - }, - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/npmlog": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-6.0.2.tgz", - "integrity": "sha512-/vBvz5Jfr9dT/aFWd0FIRf+T/Q2WBsLENygUaFUqstqsycmZAP/t5BvFJTK0viFmSUxiUKTUplWy5vt+rvKIxg==", - "dependencies": { - "are-we-there-yet": "^3.0.0", - "console-control-strings": "^1.1.0", - "gauge": "^4.0.3", - "set-blocking": "^2.0.0" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/number-is-nan": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", - "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/o-stream": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/o-stream/-/o-stream-0.3.0.tgz", - "integrity": "sha512-gbzl6qCJZ609x/M2t25HqCYQagFzWYCtQ84jcuObGr+V8D1Am4EVubkF4J+XFs6ukfiv96vNeiBb8FrbbMZYiQ==", - "dev": true - }, - "node_modules/oauth-sign": { - "version": "0.9.0", - "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", - "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==", - "peer": true, - "engines": { - "node": "*" - } - }, - "node_modules/object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/object-copy": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz", - "integrity": "sha1-fn2Fi3gb18mRpBupde04EnVOmYw=", - "dev": true, - "dependencies": { - "copy-descriptor": "^0.1.0", - "define-property": "^0.2.5", - "kind-of": "^3.0.3" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/object-copy/node_modules/define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, - "dependencies": { - "is-descriptor": "^0.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/object-copy/node_modules/kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "dependencies": { - "is-buffer": "^1.1.5" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/object-keys": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", - "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", - "dev": true, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/object-visit": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz", - "integrity": "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=", - "dev": true, - "dependencies": { - "isobject": "^3.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/object.assign": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.0.tgz", - "integrity": "sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w==", - "dev": true, - "dependencies": { - "define-properties": "^1.1.2", - "function-bind": "^1.1.1", - "has-symbols": "^1.0.0", - "object-keys": "^1.0.11" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/object.defaults": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/object.defaults/-/object.defaults-1.1.0.tgz", - "integrity": "sha1-On+GgzS0B96gbaFtiNXNKeQ1/s8=", - "dev": true, - "dependencies": { - "array-each": "^1.0.1", - "array-slice": "^1.0.0", - "for-own": "^1.0.0", - "isobject": "^3.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/object.map": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/object.map/-/object.map-1.0.1.tgz", - "integrity": "sha1-z4Plncj8wK1fQlDh94s7gb2AHTc=", - "dev": true, - "dependencies": { - "for-own": "^1.0.0", - "make-iterator": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/object.pick": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", - "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=", - "dev": true, - "dependencies": { - "isobject": "^3.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/object.reduce": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/object.reduce/-/object.reduce-1.0.1.tgz", - "integrity": "sha1-b+NI8qx/oPlcpiEiZZkJaCW7A60=", - "dev": true, - "dependencies": { - "for-own": "^1.0.0", - "make-iterator": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/on-finished": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", - "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", - "dev": true, - "dependencies": { - "ee-first": "1.1.1" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", - "dependencies": { - "wrappy": "1" - } - }, - "node_modules/openurl": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/openurl/-/openurl-1.1.1.tgz", - "integrity": "sha512-d/gTkTb1i1GKz5k3XE3XFV/PxQ1k45zDqGP2OA7YhgsaLoqm6qRvARAZOFer1fcXritWlGBRCu/UgeS4HAnXAA==", - "dev": true - }, - "node_modules/opn": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/opn/-/opn-5.3.0.tgz", - "integrity": "sha512-bYJHo/LOmoTd+pfiYhfZDnf9zekVJrY+cnS2a5F2x+w5ppvTqObojTP7WiFG+kVZs9Inw+qQ/lw7TroWwhdd2g==", - "dev": true, - "dependencies": { - "is-wsl": "^1.1.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/ordered-read-streams": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/ordered-read-streams/-/ordered-read-streams-1.0.1.tgz", - "integrity": "sha1-d8DLN8QVJdZBZtmQ/61+xqDhNj4=", - "dev": true, - "dependencies": { - "readable-stream": "^2.0.1" - } - }, - "node_modules/ordered-read-streams/node_modules/isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", - "dev": true - }, - "node_modules/ordered-read-streams/node_modules/readable-stream": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", - "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", - "dev": true, - "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "node_modules/ordered-read-streams/node_modules/string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, - "dependencies": { - "safe-buffer": "~5.1.0" - } - }, - "node_modules/os-browserify": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/os-browserify/-/os-browserify-0.3.0.tgz", - "integrity": "sha1-hUNzx/XCMVkU/Jv8a9gjj92h7Cc=", - "dev": true - }, - "node_modules/os-homedir": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", - "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/os-locale": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-1.4.0.tgz", - "integrity": "sha1-IPnxeuKe00XoveWDsT0gCYA8FNk=", - "dev": true, - "dependencies": { - "lcid": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/os-tmpdir": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", - "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/osenv": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/osenv/-/osenv-0.1.5.tgz", - "integrity": "sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g==", - "dev": true, - "dependencies": { - "os-homedir": "^1.0.0", - "os-tmpdir": "^1.0.0" - } - }, - "node_modules/p-limit": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", - "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", - "dev": true, - "dependencies": { - "yocto-queue": "^0.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/p-locate": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", - "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", - "dev": true, - "dependencies": { - "p-limit": "^3.0.2" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/p-map": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz", - "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==", - "dependencies": { - "aggregate-error": "^3.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/pako": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.10.tgz", - "integrity": "sha512-0DTvPVU3ed8+HNXOu5Bs+o//Mbdj9VNQMUOe9oKCwh8l0GNwpTDMKCWbRjgtD291AWnkAgkqA/LOnQS8AmS1tw==", - "dev": true - }, - "node_modules/parents": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/parents/-/parents-1.0.1.tgz", - "integrity": "sha512-mXKF3xkoUt5td2DoxpLmtOmZvko9VfFpwRwkKDHSNvgmpLAeBo18YDhcPbBzJq+QLCHMbGOfzia2cX4U+0v9Mg==", - "dev": true, - "dependencies": { - "path-platform": "~0.11.15" - } - }, - "node_modules/parse-asn1": { - "version": "5.1.4", - "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.4.tgz", - "integrity": "sha512-Qs5duJcuvNExRfFZ99HDD3z4mAi3r9Wl/FOjEOijlxwCZs7E7mW2vjTpgQ4J8LpTF8x5v+1Vn5UQFejmWT11aw==", - "dev": true, - "dependencies": { - "asn1.js": "^4.0.0", - "browserify-aes": "^1.0.0", - "create-hash": "^1.1.0", - "evp_bytestokey": "^1.0.0", - "pbkdf2": "^3.0.3", - "safe-buffer": "^5.1.1" - } - }, - "node_modules/parse-filepath": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/parse-filepath/-/parse-filepath-1.0.2.tgz", - "integrity": "sha1-pjISf1Oq89FYdvWHLz/6x2PWyJE=", - "dev": true, - "dependencies": { - "is-absolute": "^1.0.0", - "map-cache": "^0.2.0", - "path-root": "^0.1.1" - }, - "engines": { - "node": ">=0.8" - } - }, - "node_modules/parse-json": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", - "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=", - "dev": true, - "dependencies": { - "error-ex": "^1.2.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/parse-node-version": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/parse-node-version/-/parse-node-version-1.0.1.tgz", - "integrity": "sha512-3YHlOa/JgH6Mnpr05jP9eDG254US9ek25LyIxZlDItp2iJtwyaXQb57lBYLdT3MowkUFYEV2XXNAYIPlESvJlA==", - "dev": true, - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/parse-passwd": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/parse-passwd/-/parse-passwd-1.0.0.tgz", - "integrity": "sha1-bVuTSkVpk7I9N/QKOC1vFmao5cY=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/parseurl": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", - "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", - "dev": true, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/pascalcase": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz", - "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/path-browserify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-1.0.1.tgz", - "integrity": "sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==", - "dev": true - }, - "node_modules/path-dirname": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/path-dirname/-/path-dirname-1.0.2.tgz", - "integrity": "sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA=", - "dev": true - }, - "node_modules/path-exists": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", - "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=", - "dev": true, - "dependencies": { - "pinkie-promise": "^2.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/path-key": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/path-parse": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", - "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", - "dev": true - }, - "node_modules/path-platform": { - "version": "0.11.15", - "resolved": "https://registry.npmjs.org/path-platform/-/path-platform-0.11.15.tgz", - "integrity": "sha512-Y30dB6rab1A/nfEKsZxmr01nUotHX0c/ZiIAsCTatEe1CmS5Pm5He7fZ195bPT7RdquoaL8lLxFCMQi/bS7IJg==", - "dev": true, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/path-root": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/path-root/-/path-root-0.1.1.tgz", - "integrity": "sha1-mkpoFMrBwM1zNgqV8yCDyOpHRbc=", - "dev": true, - "dependencies": { - "path-root-regex": "^0.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/path-root-regex": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/path-root-regex/-/path-root-regex-0.1.2.tgz", - "integrity": "sha1-v8zcjfWxLcUsi0PsONGNcsBLqW0=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/path-sort2": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/path-sort2/-/path-sort2-1.0.0.tgz", - "integrity": "sha512-OwUzmr3+avyEANhpUkUv+nlwAM/sCX5y9Ylok8fj3OK3SmLclq7jyEoqSL5qi+5bJAOskWGZPtdtjnoRGy5lxA==", - "dev": true - }, - "node_modules/path-to-regexp": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-1.7.0.tgz", - "integrity": "sha1-Wf3g9DW62suhA6hOnTvGTpa5k30=", - "dev": true, - "dependencies": { - "isarray": "0.0.1" - } - }, - "node_modules/path-type": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz", - "integrity": "sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE=", - "dev": true, - "dependencies": { - "graceful-fs": "^4.1.2", - "pify": "^2.0.0", - "pinkie-promise": "^2.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/pbkdf2": { - "version": "3.0.17", - "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.0.17.tgz", - "integrity": "sha512-U/il5MsrZp7mGg3mSQfn742na2T+1/vHDCG5/iTI3X9MKUuYUZVLQhyRsg06mCgDBTd57TxzgZt7P+fYfjRLtA==", - "dev": true, - "dependencies": { - "create-hash": "^1.1.2", - "create-hmac": "^1.1.4", - "ripemd160": "^2.0.1", - "safe-buffer": "^5.0.1", - "sha.js": "^2.4.8" - }, - "engines": { - "node": ">=0.12" - } - }, - "node_modules/performance-now": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", - "integrity": "sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==", - "peer": true - }, - "node_modules/picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "dev": true, - "engines": { - "node": ">=8.6" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/pinkie": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", - "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/pinkie-promise": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", - "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", - "dev": true, - "dependencies": { - "pinkie": "^2.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/platform": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/platform/-/platform-1.3.5.tgz", - "integrity": "sha512-TuvHS8AOIZNAlE77WUDiR4rySV/VMptyMfcfeoMgs4P8apaZM3JrnbzBiixKUv+XR6i+BXrQh8WAnjaSPFO65Q==", - "dev": true - }, - "node_modules/plugin-error": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/plugin-error/-/plugin-error-0.1.2.tgz", - "integrity": "sha1-O5uzM1zPAPQl4HQ34ZJ2ln2kes4=", - "dev": true, - "dependencies": { - "ansi-cyan": "^0.1.1", - "ansi-red": "^0.1.1", - "arr-diff": "^1.0.1", - "arr-union": "^2.0.1", - "extend-shallow": "^1.1.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/plugin-error/node_modules/arr-diff": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-1.1.0.tgz", - "integrity": "sha1-aHwydYFjWI/vfeezb6vklesaOZo=", - "dev": true, - "dependencies": { - "arr-flatten": "^1.0.1", - "array-slice": "^0.2.3" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/plugin-error/node_modules/arr-union": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-2.1.0.tgz", - "integrity": "sha1-IPnqtexw9cfSFbEHexw5Fh0pLH0=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/plugin-error/node_modules/array-slice": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/array-slice/-/array-slice-0.2.3.tgz", - "integrity": "sha1-3Tz7gO15c6dRF82sabC5nshhhvU=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/plugin-error/node_modules/extend-shallow": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-1.1.4.tgz", - "integrity": "sha1-Gda/lN/AnXa6cR85uHLSH/TdkHE=", - "dev": true, - "dependencies": { - "kind-of": "^1.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/plugin-error/node_modules/kind-of": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-1.1.0.tgz", - "integrity": "sha1-FAo9LUGjbS78+pN3tiwk+ElaXEQ=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/portscanner": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/portscanner/-/portscanner-2.2.0.tgz", - "integrity": "sha512-IFroCz/59Lqa2uBvzK3bKDbDDIEaAY8XJ1jFxcLWTqosrsc32//P4VuSB2vZXoHiHqOmx8B5L5hnKOxL/7FlPw==", - "dev": true, - "dependencies": { - "async": "^2.6.0", - "is-number-like": "^1.0.3" - }, - "engines": { - "node": ">=0.4", - "npm": ">=1.0.0" - } - }, - "node_modules/posix-character-classes": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz", - "integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/prebuild-install": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/prebuild-install/-/prebuild-install-7.1.1.tgz", - "integrity": "sha512-jAXscXWMcCK8GgCoHOfIr0ODh5ai8mj63L2nWrjuAgXE6tDyYGnx4/8o/rCgU+B4JSyZBKbeZqzhtwtC3ovxjw==", - "dependencies": { - "detect-libc": "^2.0.0", - "expand-template": "^2.0.3", - "github-from-package": "0.0.0", - "minimist": "^1.2.3", - "mkdirp-classic": "^0.5.3", - "napi-build-utils": "^1.0.1", - "node-abi": "^3.3.0", - "pump": "^3.0.0", - "rc": "^1.2.7", - "simple-get": "^4.0.0", - "tar-fs": "^2.0.0", - "tunnel-agent": "^0.6.0" - }, - "bin": { - "prebuild-install": "bin.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/prebuild-install/node_modules/pump": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", - "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", - "dependencies": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" - } - }, - "node_modules/pretty-hrtime": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/pretty-hrtime/-/pretty-hrtime-1.0.3.tgz", - "integrity": "sha1-t+PqQkNaTJsnWdmeDyAesZWALuE=", - "dev": true, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/process": { - "version": "0.11.10", - "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", - "integrity": "sha1-czIwDoQBYb2j5podHZGn1LwW8YI=", - "dev": true, - "engines": { - "node": ">= 0.6.0" - } - }, - "node_modules/process-nextick-args": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", - "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" - }, - "node_modules/promise-inflight": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/promise-inflight/-/promise-inflight-1.0.1.tgz", - "integrity": "sha512-6zWPyEOFaQBJYcGMHBKTKJ3u6TBsnMFOIZSa6ce1e/ZrrsOlnHRHbabMjLiBYKp+n44X9eUI6VUPaukCXHuG4g==" - }, - "node_modules/promise-retry": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/promise-retry/-/promise-retry-2.0.1.tgz", - "integrity": "sha512-y+WKFlBR8BGXnsNlIHFGPZmyDf3DFMoLhaflAnyZgV6rG6xu+JwesTo2Q9R6XwYmtmwAFCkAk3e35jEdoeh/3g==", - "dependencies": { - "err-code": "^2.0.2", - "retry": "^0.12.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/proto-list": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/proto-list/-/proto-list-1.2.4.tgz", - "integrity": "sha1-IS1b/hMYMGpCD2QCuOJv85ZHqEk=", - "dev": true - }, - "node_modules/pseudomap": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", - "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=", - "dev": true - }, - "node_modules/psl": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/psl/-/psl-1.9.0.tgz", - "integrity": "sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==", - "peer": true - }, - "node_modules/public-encrypt": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.3.tgz", - "integrity": "sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q==", - "dev": true, - "dependencies": { - "bn.js": "^4.1.0", - "browserify-rsa": "^4.0.0", - "create-hash": "^1.1.0", - "parse-asn1": "^5.0.0", - "randombytes": "^2.0.1", - "safe-buffer": "^5.1.2" - } - }, - "node_modules/pump": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/pump/-/pump-2.0.1.tgz", - "integrity": "sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA==", - "dev": true, - "dependencies": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" - } - }, - "node_modules/pumpify": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/pumpify/-/pumpify-1.5.1.tgz", - "integrity": "sha512-oClZI37HvuUJJxSKKrC17bZ9Cu0ZYhEAGPsPUy9KlMUmv9dKX2o77RUmq7f3XjIxbwyGwYzbzQ1L2Ks8sIradQ==", - "dev": true, - "dependencies": { - "duplexify": "^3.6.0", - "inherits": "^2.0.3", - "pump": "^2.0.0" - } - }, - "node_modules/punycode": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", - "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", - "peer": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/qs": { - "version": "6.5.3", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.3.tgz", - "integrity": "sha512-qxXIEh4pCGfHICj1mAJQ2/2XVZkjCDTcEgfoSQxc/fYivUZxTkk7L3bDBJSoNrEzXI17oUO5Dp07ktqE5KzczA==", - "peer": true, - "engines": { - "node": ">=0.6" - } - }, - "node_modules/querystring": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz", - "integrity": "sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA=", - "deprecated": "The querystring API is considered Legacy. new code should use the URLSearchParams API instead.", - "dev": true, - "engines": { - "node": ">=0.4.x" - } - }, - "node_modules/querystring-es3": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/querystring-es3/-/querystring-es3-0.2.1.tgz", - "integrity": "sha1-nsYfeQSYdXB9aUFFlv2Qek1xHnM=", - "dev": true, - "engines": { - "node": ">=0.4.x" - } - }, - "node_modules/qunit": { - "version": "2.19.3", - "resolved": "https://registry.npmjs.org/qunit/-/qunit-2.19.3.tgz", - "integrity": "sha512-vEnspSZ37u2oR01OA/IZ1Td5V7BvQYFECdKPv86JaBplDNa5IHg0v7jFSPoP5L5o78Dbi8sl7/ATtpRDAKlSdw==", - "dev": true, - "dependencies": { - "commander": "7.2.0", - "node-watch": "0.7.3", - "tiny-glob": "0.2.9" - }, - "bin": { - "qunit": "bin/qunit.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/qunit/node_modules/commander": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", - "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", - "dev": true, - "engines": { - "node": ">= 10" - } - }, - "node_modules/randombytes": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", - "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", - "dev": true, - "dependencies": { - "safe-buffer": "^5.1.0" - } - }, - "node_modules/randomfill": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/randomfill/-/randomfill-1.0.4.tgz", - "integrity": "sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw==", - "dev": true, - "dependencies": { - "randombytes": "^2.0.5", - "safe-buffer": "^5.1.0" - } - }, - "node_modules/range-parser": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", - "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", - "dev": true, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/raw-body": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.1.tgz", - "integrity": "sha512-9WmIKF6mkvA0SLmA2Knm9+qj89e+j1zqgyn8aXGd7+nAduPoqgI9lO57SAZNn/Byzo5P7JhXTyg9PzaJbH73bA==", - "dev": true, - "dependencies": { - "bytes": "3.1.0", - "http-errors": "1.7.3", - "iconv-lite": "0.4.24", - "unpipe": "1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/rc": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", - "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", - "dependencies": { - "deep-extend": "^0.6.0", - "ini": "~1.3.0", - "minimist": "^1.2.0", - "strip-json-comments": "~2.0.1" - }, - "bin": { - "rc": "cli.js" - } - }, - "node_modules/read-dir-deep": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/read-dir-deep/-/read-dir-deep-7.0.1.tgz", - "integrity": "sha512-w99fvgqJm3cJ5Vb7b3oGKRDnm/m11q7w5LQ9uBCXe+repIEf1rFtkXLlPAxNrSwlp4skyPyvKd4DNNiIuc0geg==", - "dev": true, - "dependencies": { - "globby": "^10.0.1", - "is-path-cwd": "^2.2.0", - "is-path-in-cwd": "^3.0.0", - "path-sort2": "^1.0.0", - "slash": "^3.0.0" - }, - "engines": { - "node": ">=8.9.0" - } - }, - "node_modules/read-only-stream": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/read-only-stream/-/read-only-stream-2.0.0.tgz", - "integrity": "sha1-JyT9aoET1zdkrCiNQ4YnDB2/F/A=", - "dev": true, - "dependencies": { - "readable-stream": "^2.0.2" - } - }, - "node_modules/read-only-stream/node_modules/isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", - "dev": true - }, - "node_modules/read-only-stream/node_modules/readable-stream": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", - "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", - "dev": true, - "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "node_modules/read-only-stream/node_modules/string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, - "dependencies": { - "safe-buffer": "~5.1.0" - } - }, - "node_modules/read-pkg": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz", - "integrity": "sha1-9f+qXs0pyzHAR0vKfXVra7KePyg=", - "dev": true, - "dependencies": { - "load-json-file": "^1.0.0", - "normalize-package-data": "^2.3.2", - "path-type": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/read-pkg-up": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz", - "integrity": "sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI=", - "dev": true, - "dependencies": { - "find-up": "^1.0.0", - "read-pkg": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/readable-stream": { - "version": "1.0.34", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", - "integrity": "sha512-ok1qVCJuRkNmvebYikljxJA/UEsKwLl2nI1OmaqAu4/UE+h0wKCHok4XkL/gvi39OacXvw59RJUOFUkDib2rHg==", - "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.1", - "isarray": "0.0.1", - "string_decoder": "~0.10.x" - } - }, - "node_modules/readdirp": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.2.1.tgz", - "integrity": "sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ==", - "dev": true, - "dependencies": { - "graceful-fs": "^4.1.11", - "micromatch": "^3.1.10", - "readable-stream": "^2.0.2" - }, - "engines": { - "node": ">=0.10" - } - }, - "node_modules/readdirp/node_modules/isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", - "dev": true - }, - "node_modules/readdirp/node_modules/readable-stream": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", - "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", - "dev": true, - "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "node_modules/readdirp/node_modules/string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, - "dependencies": { - "safe-buffer": "~5.1.0" - } - }, - "node_modules/rechoir": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz", - "integrity": "sha1-hSBLVNuoLVdC4oyWdW70OvUOM4Q=", - "dev": true, - "dependencies": { - "resolve": "^1.1.6" - }, - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/regex-not": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz", - "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==", - "dev": true, - "dependencies": { - "extend-shallow": "^3.0.2", - "safe-regex": "^1.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/remove-bom-buffer": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/remove-bom-buffer/-/remove-bom-buffer-3.0.0.tgz", - "integrity": "sha512-8v2rWhaakv18qcvNeli2mZ/TMTL2nEyAKRvzo1WtnZBl15SHyEhrCu2/xKlJyUFKHiHgfXIyuY6g2dObJJycXQ==", - "dev": true, - "dependencies": { - "is-buffer": "^1.1.5", - "is-utf8": "^0.2.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/remove-bom-stream": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/remove-bom-stream/-/remove-bom-stream-1.2.0.tgz", - "integrity": "sha1-BfGlk/FuQuH7kOv1nejlaVJflSM=", - "dev": true, - "dependencies": { - "remove-bom-buffer": "^3.0.0", - "safe-buffer": "^5.1.0", - "through2": "^2.0.3" - }, - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/remove-bom-stream/node_modules/isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", - "dev": true - }, - "node_modules/remove-bom-stream/node_modules/readable-stream": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", - "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", - "dev": true, - "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "node_modules/remove-bom-stream/node_modules/string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, - "dependencies": { - "safe-buffer": "~5.1.0" - } - }, - "node_modules/remove-bom-stream/node_modules/through2": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", - "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", - "dev": true, - "dependencies": { - "readable-stream": "~2.3.6", - "xtend": "~4.0.1" - } - }, - "node_modules/remove-trailing-separator": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", - "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8=", - "dev": true - }, - "node_modules/repeat-element": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.3.tgz", - "integrity": "sha512-ahGq0ZnV5m5XtZLMb+vP76kcAM5nkLqk0lpqAuojSKGgQtn4eRi4ZZGm2olo2zKFH+sMsWaqOCW1dqAnOru72g==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/repeat-string": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", - "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=", - "dev": true, - "engines": { - "node": ">=0.10" - } - }, - "node_modules/replace-ext": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/replace-ext/-/replace-ext-1.0.0.tgz", - "integrity": "sha1-3mMSg3P8v3w8z6TeWkgMRaZ5WOs=", - "dev": true, - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/replace-homedir": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/replace-homedir/-/replace-homedir-1.0.0.tgz", - "integrity": "sha1-6H9tUTuSjd6AgmDBK+f+xv9ueYw=", - "dev": true, - "dependencies": { - "homedir-polyfill": "^1.0.1", - "is-absolute": "^1.0.0", - "remove-trailing-separator": "^1.1.0" - }, - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/replacestream": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/replacestream/-/replacestream-4.0.3.tgz", - "integrity": "sha512-AC0FiLS352pBBiZhd4VXB1Ab/lh0lEgpP+GGvZqbQh8a5cmXVoTe5EX/YeTFArnp4SRGTHh1qCHu9lGs1qG8sA==", - "dev": true, - "dependencies": { - "escape-string-regexp": "^1.0.3", - "object-assign": "^4.0.1", - "readable-stream": "^2.0.2" - } - }, - "node_modules/replacestream/node_modules/isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", - "dev": true - }, - "node_modules/replacestream/node_modules/readable-stream": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", - "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", - "dev": true, - "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "node_modules/replacestream/node_modules/string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, - "dependencies": { - "safe-buffer": "~5.1.0" - } - }, - "node_modules/request": { - "version": "2.88.2", - "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz", - "integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==", - "deprecated": "request has been deprecated, see https://github.com/request/request/issues/3142", - "peer": true, - "dependencies": { - "aws-sign2": "~0.7.0", - "aws4": "^1.8.0", - "caseless": "~0.12.0", - "combined-stream": "~1.0.6", - "extend": "~3.0.2", - "forever-agent": "~0.6.1", - "form-data": "~2.3.2", - "har-validator": "~5.1.3", - "http-signature": "~1.2.0", - "is-typedarray": "~1.0.0", - "isstream": "~0.1.2", - "json-stringify-safe": "~5.0.1", - "mime-types": "~2.1.19", - "oauth-sign": "~0.9.0", - "performance-now": "^2.1.0", - "qs": "~6.5.2", - "safe-buffer": "^5.1.2", - "tough-cookie": "~2.5.0", - "tunnel-agent": "^0.6.0", - "uuid": "^3.3.2" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/require-directory": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/require-main-filename": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz", - "integrity": "sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE=", - "dev": true - }, - "node_modules/requires-port": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", - "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==", - "dev": true - }, - "node_modules/resolve": { - "version": "1.22.1", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz", - "integrity": "sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==", - "dev": true, - "dependencies": { - "is-core-module": "^2.9.0", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" - }, - "bin": { - "resolve": "bin/resolve" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/resolve-dir": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/resolve-dir/-/resolve-dir-1.0.1.tgz", - "integrity": "sha1-eaQGRMNivoLybv/nOcm7U4IEb0M=", - "dev": true, - "dependencies": { - "expand-tilde": "^2.0.0", - "global-modules": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/resolve-options": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/resolve-options/-/resolve-options-1.1.0.tgz", - "integrity": "sha1-MrueOcBtZzONyTeMDW1gdFZq0TE=", - "dev": true, - "dependencies": { - "value-or-function": "^3.0.0" - }, - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/resolve-url": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz", - "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=", - "deprecated": "https://github.com/lydell/resolve-url#deprecated", - "dev": true - }, - "node_modules/resp-modifier": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/resp-modifier/-/resp-modifier-6.0.2.tgz", - "integrity": "sha1-sSTeXE+6/LpUH0j/pzlw9KpFa08=", - "dev": true, - "dependencies": { - "debug": "^2.2.0", - "minimatch": "^3.0.2" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/resp-modifier/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/ret": { - "version": "0.1.15", - "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz", - "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==", - "dev": true, - "engines": { - "node": ">=0.12" - } - }, - "node_modules/retry": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz", - "integrity": "sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==", - "engines": { - "node": ">= 4" - } - }, - "node_modules/reusify": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", - "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", - "dev": true, - "engines": { - "iojs": ">=1.0.0", - "node": ">=0.10.0" - } - }, - "node_modules/rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "dependencies": { - "glob": "^7.1.3" - }, - "bin": { - "rimraf": "bin.js" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/ripemd160": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.2.tgz", - "integrity": "sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==", - "dev": true, - "dependencies": { - "hash-base": "^3.0.0", - "inherits": "^2.0.1" - } - }, - "node_modules/run-parallel": { - "version": "1.1.9", - "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.1.9.tgz", - "integrity": "sha512-DEqnSRTDw/Tc3FXf49zedI638Z9onwUotBMiUFKmrO2sdFKIbXamXGQ3Axd4qgphxKB4kw/qP1w5kTxnfU1B9Q==", - "dev": true - }, - "node_modules/rx": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/rx/-/rx-4.1.0.tgz", - "integrity": "sha1-pfE/957zt0D+MKqAP7CfmIBdR4I=", - "dev": true - }, - "node_modules/rxjs": { - "version": "5.5.12", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-5.5.12.tgz", - "integrity": "sha512-xx2itnL5sBbqeeiVgNPVuQQ1nC8Jp2WfNJhXWHmElW9YmrpS9UVnNzhP3EH3HFqexO5Tlp8GhYY+WEcqcVMvGw==", - "dev": true, - "dependencies": { - "symbol-observable": "1.0.1" - }, - "engines": { - "npm": ">=2.0.0" - } - }, - "node_modules/safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" - }, - "node_modules/safe-regex": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz", - "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=", - "dev": true, - "dependencies": { - "ret": "~0.1.10" - } - }, - "node_modules/safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" - }, - "node_modules/semver": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.3.0.tgz", - "integrity": "sha1-myzl094C0XxgEq0yaqa00M9U+U8=", - "dev": true, - "bin": { - "semver": "bin/semver" - } - }, - "node_modules/semver-greatest-satisfied-range": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/semver-greatest-satisfied-range/-/semver-greatest-satisfied-range-1.1.0.tgz", - "integrity": "sha1-E+jCZYq5aRywzXEJMkAoDTb3els=", - "dev": true, - "dependencies": { - "sver-compat": "^1.5.0" - }, - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/send": { - "version": "0.16.2", - "resolved": "https://registry.npmjs.org/send/-/send-0.16.2.tgz", - "integrity": "sha512-E64YFPUssFHEFBvpbbjr44NCLtI1AohxQ8ZSiJjQLskAdKuriYEP6VyGEsRDH8ScozGpkaX1BGvhanqCwkcEZw==", - "dev": true, - "dependencies": { - "debug": "2.6.9", - "depd": "~1.1.2", - "destroy": "~1.0.4", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "fresh": "0.5.2", - "http-errors": "~1.6.2", - "mime": "1.4.1", - "ms": "2.0.0", - "on-finished": "~2.3.0", - "range-parser": "~1.2.0", - "statuses": "~1.4.0" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/send/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/send/node_modules/http-errors": { - "version": "1.6.3", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", - "integrity": "sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0=", - "dev": true, - "dependencies": { - "depd": "~1.1.2", - "inherits": "2.0.3", - "setprototypeof": "1.1.0", - "statuses": ">= 1.4.0 < 2" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/send/node_modules/inherits": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", - "dev": true - }, - "node_modules/send/node_modules/setprototypeof": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", - "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==", - "dev": true - }, - "node_modules/send/node_modules/statuses": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.4.0.tgz", - "integrity": "sha512-zhSCtt8v2NDrRlPQpCNtw/heZLtfUDqxBM1udqikb/Hbk52LK4nQSwr10u77iopCW5LsyHpuXS0GnEc48mLeew==", - "dev": true, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/serve-index": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/serve-index/-/serve-index-1.9.1.tgz", - "integrity": "sha1-03aNabHn2C5c4FD/9bRTvqEqkjk=", - "dev": true, - "dependencies": { - "accepts": "~1.3.4", - "batch": "0.6.1", - "debug": "2.6.9", - "escape-html": "~1.0.3", - "http-errors": "~1.6.2", - "mime-types": "~2.1.17", - "parseurl": "~1.3.2" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/serve-index/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/serve-index/node_modules/http-errors": { - "version": "1.6.3", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", - "integrity": "sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0=", - "dev": true, - "dependencies": { - "depd": "~1.1.2", - "inherits": "2.0.3", - "setprototypeof": "1.1.0", - "statuses": ">= 1.4.0 < 2" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/serve-index/node_modules/inherits": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", - "dev": true - }, - "node_modules/serve-index/node_modules/setprototypeof": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", - "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==", - "dev": true - }, - "node_modules/serve-index/node_modules/statuses": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", - "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=", - "dev": true, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/serve-static": { - "version": "1.13.2", - "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.13.2.tgz", - "integrity": "sha512-p/tdJrO4U387R9oMjb1oj7qSMaMfmOyd4j9hOFoxZe2baQszgHcSWjuya/CiT5kgZZKRudHNOA0pYXOl8rQ5nw==", - "dev": true, - "dependencies": { - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "parseurl": "~1.3.2", - "send": "0.16.2" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/server-destroy": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/server-destroy/-/server-destroy-1.0.1.tgz", - "integrity": "sha512-rb+9B5YBIEzYcD6x2VKidaa+cqYBJQKnU4oe4E3ANwRRN56yk/ua1YCJT1n21NTS8w6CcOclAKNP3PhdCXKYtQ==", - "dev": true - }, - "node_modules/set-blocking": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", - "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=" - }, - "node_modules/set-value": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.1.tgz", - "integrity": "sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw==", - "dev": true, - "dependencies": { - "extend-shallow": "^2.0.1", - "is-extendable": "^0.1.1", - "is-plain-object": "^2.0.3", - "split-string": "^3.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/set-value/node_modules/extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "dependencies": { - "is-extendable": "^0.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/setprototypeof": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz", - "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==", - "dev": true - }, - "node_modules/sha.js": { - "version": "2.4.11", - "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz", - "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==", - "dev": true, - "dependencies": { - "inherits": "^2.0.1", - "safe-buffer": "^5.0.1" - }, - "bin": { - "sha.js": "bin.js" - } - }, - "node_modules/shasum-object": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/shasum-object/-/shasum-object-1.0.0.tgz", - "integrity": "sha512-Iqo5rp/3xVi6M4YheapzZhhGPVs0yZwHj7wvwQ1B9z8H6zk+FEnI7y3Teq7qwnekfEhu8WmG2z0z4iWZaxLWVg==", - "dev": true, - "dependencies": { - "fast-safe-stringify": "^2.0.7" - } - }, - "node_modules/shebang-command": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", - "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", - "dev": true, - "dependencies": { - "shebang-regex": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/shebang-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/shell-quote": { - "version": "1.7.3", - "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.7.3.tgz", - "integrity": "sha512-Vpfqwm4EnqGdlsBFNmHhxhElJYrdfcxPThu+ryKS5J8L/fhAwLazFZtq+S+TWZ9ANj2piSQLGj6NQg+lKPmxrw==", - "dev": true - }, - "node_modules/sigmund": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/sigmund/-/sigmund-1.0.1.tgz", - "integrity": "sha1-P/IfGYytIXX587eBhT/ZTQ0ZtZA=", - "dev": true - }, - "node_modules/signal-exit": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", - "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=" - }, - "node_modules/simple-concat": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/simple-concat/-/simple-concat-1.0.0.tgz", - "integrity": "sha1-c0TLuLbib7J9ZrL8hvn21Zl1IcY=" - }, - "node_modules/simple-get": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/simple-get/-/simple-get-4.0.1.tgz", - "integrity": "sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "dependencies": { - "decompress-response": "^6.0.0", - "once": "^1.3.1", - "simple-concat": "^1.0.0" - } - }, - "node_modules/sinon": { - "version": "7.3.2", - "resolved": "https://registry.npmjs.org/sinon/-/sinon-7.3.2.tgz", - "integrity": "sha512-thErC1z64BeyGiPvF8aoSg0LEnptSaWE7YhdWWbWXgelOyThent7uKOnnEh9zBxDbKixtr5dEko+ws1sZMuFMA==", - "dev": true, - "dependencies": { - "@sinonjs/commons": "^1.4.0", - "@sinonjs/formatio": "^3.2.1", - "@sinonjs/samsam": "^3.3.1", - "diff": "^3.5.0", - "lolex": "^4.0.1", - "nise": "^1.4.10", - "supports-color": "^5.5.0" - } - }, - "node_modules/sinon/node_modules/supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/smart-buffer": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz", - "integrity": "sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==", - "engines": { - "node": ">= 6.0.0", - "npm": ">= 3.0.0" - } - }, - "node_modules/snapdragon": { - "version": "0.8.2", - "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz", - "integrity": "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==", - "dev": true, - "dependencies": { - "base": "^0.11.1", - "debug": "^2.2.0", - "define-property": "^0.2.5", - "extend-shallow": "^2.0.1", - "map-cache": "^0.2.2", - "source-map": "^0.5.6", - "source-map-resolve": "^0.5.0", - "use": "^3.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/snapdragon-node": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz", - "integrity": "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==", - "dev": true, - "dependencies": { - "define-property": "^1.0.0", - "isobject": "^3.0.0", - "snapdragon-util": "^3.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/snapdragon-node/node_modules/define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", - "dev": true, - "dependencies": { - "is-descriptor": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/snapdragon-node/node_modules/is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "dev": true, - "dependencies": { - "kind-of": "^6.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/snapdragon-node/node_modules/is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "dev": true, - "dependencies": { - "kind-of": "^6.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/snapdragon-node/node_modules/is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "dev": true, - "dependencies": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/snapdragon-util": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz", - "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==", - "dev": true, - "dependencies": { - "kind-of": "^3.2.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/snapdragon-util/node_modules/kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "dependencies": { - "is-buffer": "^1.1.5" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/snapdragon/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/snapdragon/node_modules/define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, - "dependencies": { - "is-descriptor": "^0.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/snapdragon/node_modules/extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "dependencies": { - "is-extendable": "^0.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/socket.io": { - "version": "4.5.3", - "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-4.5.3.tgz", - "integrity": "sha512-zdpnnKU+H6mOp7nYRXH4GNv1ux6HL6+lHL8g7Ds7Lj8CkdK1jJK/dlwsKDculbyOHifcJ0Pr/yeXnZQ5GeFrcg==", - "dev": true, - "dependencies": { - "accepts": "~1.3.4", - "base64id": "~2.0.0", - "debug": "~4.3.2", - "engine.io": "~6.2.0", - "socket.io-adapter": "~2.4.0", - "socket.io-parser": "~4.2.0" - }, - "engines": { - "node": ">=10.0.0" - } - }, - "node_modules/socket.io-adapter": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/socket.io-adapter/-/socket.io-adapter-2.4.0.tgz", - "integrity": "sha512-W4N+o69rkMEGVuk2D/cvca3uYsvGlMwsySWV447y99gUPghxq42BxqLNMndb+a1mm/5/7NeXVQS7RLa2XyXvYg==", - "dev": true - }, - "node_modules/socket.io-client": { - "version": "4.5.3", - "resolved": "https://registry.npmjs.org/socket.io-client/-/socket.io-client-4.5.3.tgz", - "integrity": "sha512-I/hqDYpQ6JKwtJOf5ikM+Qz+YujZPMEl6qBLhxiP0nX+TfXKhW4KZZG8lamrD6Y5ngjmYHreESVasVCgi5Kl3A==", - "dev": true, - "dependencies": { - "@socket.io/component-emitter": "~3.1.0", - "debug": "~4.3.2", - "engine.io-client": "~6.2.3", - "socket.io-parser": "~4.2.0" - }, - "engines": { - "node": ">=10.0.0" - } - }, - "node_modules/socket.io-parser": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-4.2.1.tgz", - "integrity": "sha512-V4GrkLy+HeF1F/en3SpUaM+7XxYXpuMUWLGde1kSSh5nQMN4hLrbPIkD+otwh6q9R6NOQBN4AMaOZ2zVjui82g==", - "dev": true, - "dependencies": { - "@socket.io/component-emitter": "~3.1.0", - "debug": "~4.3.1" - }, - "engines": { - "node": ">=10.0.0" - } - }, - "node_modules/socks": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/socks/-/socks-2.6.2.tgz", - "integrity": "sha512-zDZhHhZRY9PxRruRMR7kMhnf3I8hDs4S3f9RecfnGxvcBHQcKcIH/oUcEWffsfl1XxdYlA7nnlGbbTvPz9D8gA==", - "dependencies": { - "ip": "^1.1.5", - "smart-buffer": "^4.2.0" - }, - "engines": { - "node": ">= 10.13.0", - "npm": ">= 3.0.0" - } - }, - "node_modules/socks-proxy-agent": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-7.0.0.tgz", - "integrity": "sha512-Fgl0YPZ902wEsAyiQ+idGd1A7rSFx/ayC1CQVMw5P+EQx2V0SgpGtf6OKFhVjPflPUl9YMmEOnmfjCdMUsygww==", - "dependencies": { - "agent-base": "^6.0.2", - "debug": "^4.3.3", - "socks": "^2.6.2" - }, - "engines": { - "node": ">= 10" - } - }, - "node_modules/socks-proxy-agent/node_modules/debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "dependencies": { - "ms": "2.1.2" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/socks-proxy-agent/node_modules/ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" - }, - "node_modules/source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/source-map-resolve": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.2.tgz", - "integrity": "sha512-MjqsvNwyz1s0k81Goz/9vRBe9SZdB09Bdw+/zYyO+3CuPk6fouTaxscHkgtE8jKvf01kVfl8riHzERQ/kefaSA==", - "deprecated": "See https://github.com/lydell/source-map-resolve#deprecated", - "dev": true, - "dependencies": { - "atob": "^2.1.1", - "decode-uri-component": "^0.2.0", - "resolve-url": "^0.2.1", - "source-map-url": "^0.4.0", - "urix": "^0.1.0" - } - }, - "node_modules/source-map-support": { - "version": "0.5.21", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", - "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", - "dev": true, - "dependencies": { - "buffer-from": "^1.0.0", - "source-map": "^0.6.0" - } - }, - "node_modules/source-map-support/node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/source-map-url": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.0.tgz", - "integrity": "sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM=", - "deprecated": "See https://github.com/lydell/source-map-url#deprecated", - "dev": true - }, - "node_modules/sparkles": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/sparkles/-/sparkles-1.0.1.tgz", - "integrity": "sha512-dSO0DDYUahUt/0/pD/Is3VIm5TGJjludZ0HVymmhYF6eNA53PVLhnUk0znSYbH8IYBuJdCE+1luR22jNLMaQdw==", - "dev": true, - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/spdx-correct": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.0.tgz", - "integrity": "sha512-lr2EZCctC2BNR7j7WzJ2FpDznxky1sjfxvvYEyzxNyb6lZXHODmEoJeFu4JupYlkfha1KZpJyoqiJ7pgA1qq8Q==", - "dev": true, - "dependencies": { - "spdx-expression-parse": "^3.0.0", - "spdx-license-ids": "^3.0.0" - } - }, - "node_modules/spdx-exceptions": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.2.0.tgz", - "integrity": "sha512-2XQACfElKi9SlVb1CYadKDXvoajPgBVPn/gOQLrTvHdElaVhr7ZEbqJaRnJLVNeaI4cMEAgVCeBMKF6MWRDCRA==", - "dev": true - }, - "node_modules/spdx-expression-parse": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.0.tgz", - "integrity": "sha512-Yg6D3XpRD4kkOmTpdgbUiEJFKghJH03fiC1OPll5h/0sO6neh2jqRDVHOQ4o/LMea0tgCkbMgea5ip/e+MkWyg==", - "dev": true, - "dependencies": { - "spdx-exceptions": "^2.1.0", - "spdx-license-ids": "^3.0.0" - } - }, - "node_modules/spdx-license-ids": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.5.tgz", - "integrity": "sha512-J+FWzZoynJEXGphVIS+XEh3kFSjZX/1i9gFBaWQcB+/tmpe2qUsSBABpcxqxnAxFdiUFEgAX1bjYGQvIZmoz9Q==", - "dev": true - }, - "node_modules/split-string": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz", - "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==", - "dev": true, - "dependencies": { - "extend-shallow": "^3.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/sshpk": { - "version": "1.17.0", - "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.17.0.tgz", - "integrity": "sha512-/9HIEs1ZXGhSPE8X6Ccm7Nam1z8KcoCqPdI7ecm1N33EzAetWahvQWVqLZtaZQ+IDKX4IyA2o0gBzqIMkAagHQ==", - "peer": true, - "dependencies": { - "asn1": "~0.2.3", - "assert-plus": "^1.0.0", - "bcrypt-pbkdf": "^1.0.0", - "dashdash": "^1.12.0", - "ecc-jsbn": "~0.1.1", - "getpass": "^0.1.1", - "jsbn": "~0.1.0", - "safer-buffer": "^2.0.2", - "tweetnacl": "~0.14.0" - }, - "bin": { - "sshpk-conv": "bin/sshpk-conv", - "sshpk-sign": "bin/sshpk-sign", - "sshpk-verify": "bin/sshpk-verify" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/ssri": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/ssri/-/ssri-9.0.1.tgz", - "integrity": "sha512-o57Wcn66jMQvfHG1FlYbWeZWW/dHZhJXjpIcTfXldXEk5nz5lStPo3mK0OJQfGR3RbZUlbISexbljkJzuEj/8Q==", - "dependencies": { - "minipass": "^3.1.1" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/stack-trace": { - "version": "0.0.10", - "resolved": "https://registry.npmjs.org/stack-trace/-/stack-trace-0.0.10.tgz", - "integrity": "sha1-VHxws0fo0ytOEI6hoqFZ5f3eGcA=", - "dev": true, - "engines": { - "node": "*" - } - }, - "node_modules/static-extend": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz", - "integrity": "sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=", - "dev": true, - "dependencies": { - "define-property": "^0.2.5", - "object-copy": "^0.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/static-extend/node_modules/define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, - "dependencies": { - "is-descriptor": "^0.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/statuses": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.3.1.tgz", - "integrity": "sha1-+vUbnrdKrvOzrPStX2Gr8ky3uT4=", - "dev": true, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/stream-browserify": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-3.0.0.tgz", - "integrity": "sha512-H73RAHsVBapbim0tU2JwwOiXUj+fikfiaoYAKHF3VJfA0pe2BCzkhAHBlLG6REzE+2WNZcxOXjK7lkso+9euLA==", - "dev": true, - "dependencies": { - "inherits": "~2.0.4", - "readable-stream": "^3.5.0" - } - }, - "node_modules/stream-browserify/node_modules/readable-stream": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", - "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", - "dev": true, - "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/stream-browserify/node_modules/safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, - "node_modules/stream-browserify/node_modules/string_decoder": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", - "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", - "dev": true, - "dependencies": { - "safe-buffer": "~5.2.0" - } - }, - "node_modules/stream-combiner2": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/stream-combiner2/-/stream-combiner2-1.1.1.tgz", - "integrity": "sha512-3PnJbYgS56AeWgtKF5jtJRT6uFJe56Z0Hc5Ngg/6sI6rIt8iiMBTa9cvdyFfpMQjaVHr8dusbNeFGIIonxOvKw==", - "dev": true, - "dependencies": { - "duplexer2": "~0.1.0", - "readable-stream": "^2.0.2" - } - }, - "node_modules/stream-combiner2/node_modules/isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", - "dev": true - }, - "node_modules/stream-combiner2/node_modules/readable-stream": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", - "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", - "dev": true, - "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "node_modules/stream-combiner2/node_modules/string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, - "dependencies": { - "safe-buffer": "~5.1.0" - } - }, - "node_modules/stream-exhaust": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/stream-exhaust/-/stream-exhaust-1.0.2.tgz", - "integrity": "sha512-b/qaq/GlBK5xaq1yrK9/zFcyRSTNxmcZwFLGSTG0mXgZl/4Z6GgiyYOXOvY7N3eEvFRAG1bkDRz5EPGSvPYQlw==", - "dev": true - }, - "node_modules/stream-http": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/stream-http/-/stream-http-3.2.0.tgz", - "integrity": "sha512-Oq1bLqisTyK3TSCXpPbT4sdeYNdmyZJv1LxpEm2vu1ZhK89kSE5YXwZc3cWk0MagGaKriBh9mCFbVGtO+vY29A==", - "dev": true, - "dependencies": { - "builtin-status-codes": "^3.0.0", - "inherits": "^2.0.4", - "readable-stream": "^3.6.0", - "xtend": "^4.0.2" - } - }, - "node_modules/stream-http/node_modules/readable-stream": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", - "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", - "dev": true, - "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/stream-http/node_modules/safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, - "node_modules/stream-http/node_modules/string_decoder": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", - "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", - "dev": true, - "dependencies": { - "safe-buffer": "~5.2.0" - } - }, - "node_modules/stream-shift": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.0.tgz", - "integrity": "sha1-1cdSgl5TZ+eG944Y5EXqIjoVWVI=", - "dev": true - }, - "node_modules/stream-splicer": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/stream-splicer/-/stream-splicer-2.0.1.tgz", - "integrity": "sha512-Xizh4/NPuYSyAXyT7g8IvdJ9HJpxIGL9PjyhtywCZvvP0OPIdqyrr4dMikeuvY8xahpdKEBlBTySe583totajg==", - "dev": true, - "dependencies": { - "inherits": "^2.0.1", - "readable-stream": "^2.0.2" - } - }, - "node_modules/stream-splicer/node_modules/isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", - "dev": true - }, - "node_modules/stream-splicer/node_modules/readable-stream": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", - "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", - "dev": true, - "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "node_modules/stream-splicer/node_modules/string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, - "dependencies": { - "safe-buffer": "~5.1.0" - } - }, - "node_modules/stream-throttle": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/stream-throttle/-/stream-throttle-0.1.3.tgz", - "integrity": "sha512-889+B9vN9dq7/vLbGyuHeZ6/ctf5sNuGWsDy89uNxkFTAgzy0eK7+w5fL3KLNRTkLle7EgZGvHUphZW0Q26MnQ==", - "dev": true, - "dependencies": { - "commander": "^2.2.0", - "limiter": "^1.0.5" - }, - "bin": { - "throttleproxy": "bin/throttleproxy.js" - }, - "engines": { - "node": ">= 0.10.0" - } - }, - "node_modules/string_decoder": { - "version": "0.10.31", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", - "integrity": "sha512-ev2QzSzWPYmy9GuqfIVildA4OdcGLeFZQrq5ys6RtiuF+RQQiZWr8TZNyAcuVXyQRYfEO+MsoB/1BuQVhOJuoQ==" - }, - "node_modules/string-width": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", - "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", - "dependencies": { - "code-point-at": "^1.0.0", - "is-fullwidth-code-point": "^1.0.0", - "strip-ansi": "^3.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", - "dependencies": { - "ansi-regex": "^2.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/strip-bom": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", - "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=", - "dev": true, - "dependencies": { - "is-utf8": "^0.2.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/strip-json-comments": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", - "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/subarg": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/subarg/-/subarg-1.0.0.tgz", - "integrity": "sha512-RIrIdRY0X1xojthNcVtgT9sjpOGagEUKpZdgBUi054OEPFo282yg+zE+t1Rj3+RqKq2xStL7uUHhY+AjbC4BXg==", - "dev": true, - "dependencies": { - "minimist": "^1.1.0" - } - }, - "node_modules/supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", - "dev": true, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/supports-preserve-symlinks-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", - "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", - "dev": true, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/sver-compat": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/sver-compat/-/sver-compat-1.5.0.tgz", - "integrity": "sha1-PPh9/rTQe0o/FIJ7wYaz/QxkXNg=", - "dev": true, - "dependencies": { - "es6-iterator": "^2.0.1", - "es6-symbol": "^3.1.1" - } - }, - "node_modules/symbol-observable": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/symbol-observable/-/symbol-observable-1.0.1.tgz", - "integrity": "sha512-Kb3PrPYz4HanVF1LVGuAdW6LoVgIwjUYJGzFe7NDrBLCN4lsV/5J0MFurV+ygS4bRVwrCEt2c7MQ1R2a72oJDw==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/syntax-error": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/syntax-error/-/syntax-error-1.4.0.tgz", - "integrity": "sha512-YPPlu67mdnHGTup2A8ff7BC2Pjq0e0Yp/IyTFN03zWO0RcK07uLcbi7C2KpGR2FvWbaB0+bfE27a+sBKebSo7w==", - "dev": true, - "dependencies": { - "acorn-node": "^1.2.0" - } - }, - "node_modules/tar": { - "version": "6.1.12", - "resolved": "https://registry.npmjs.org/tar/-/tar-6.1.12.tgz", - "integrity": "sha512-jU4TdemS31uABHd+Lt5WEYJuzn+TJTCBLljvIAHZOz6M9Os5pJ4dD+vRFLxPa/n3T0iEFzpi+0x1UfuDZYbRMw==", - "dependencies": { - "chownr": "^2.0.0", - "fs-minipass": "^2.0.0", - "minipass": "^3.0.0", - "minizlib": "^2.1.1", - "mkdirp": "^1.0.3", - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/tar-fs": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-2.1.1.tgz", - "integrity": "sha512-V0r2Y9scmbDRLCNex/+hYzvp/zyYjvFbHPNgVTKfQvVrb6guiE/fxP+XblDNR011utopbkex2nM4dHNV6GDsng==", - "dependencies": { - "chownr": "^1.1.1", - "mkdirp-classic": "^0.5.2", - "pump": "^3.0.0", - "tar-stream": "^2.1.4" - } - }, - "node_modules/tar-fs/node_modules/chownr": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", - "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==" - }, - "node_modules/tar-fs/node_modules/pump": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", - "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", - "dependencies": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" - } - }, - "node_modules/tar-stream": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz", - "integrity": "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==", - "dependencies": { - "bl": "^4.0.3", - "end-of-stream": "^1.4.1", - "fs-constants": "^1.0.0", - "inherits": "^2.0.3", - "readable-stream": "^3.1.1" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/tar-stream/node_modules/base64-js": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", - "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, - "node_modules/tar-stream/node_modules/bl": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", - "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", - "dependencies": { - "buffer": "^5.5.0", - "inherits": "^2.0.4", - "readable-stream": "^3.4.0" - } - }, - "node_modules/tar-stream/node_modules/buffer": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", - "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "dependencies": { - "base64-js": "^1.3.1", - "ieee754": "^1.1.13" - } - }, - "node_modules/tar-stream/node_modules/readable-stream": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", - "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", - "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/tar-stream/node_modules/safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, - "node_modules/tar-stream/node_modules/string_decoder": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", - "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", - "dependencies": { - "safe-buffer": "~5.2.0" - } - }, - "node_modules/tar/node_modules/mkdirp": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", - "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", - "bin": { - "mkdirp": "bin/cmd.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/terser": { - "version": "5.15.1", - "resolved": "https://registry.npmjs.org/terser/-/terser-5.15.1.tgz", - "integrity": "sha512-K1faMUvpm/FBxjBXud0LWVAGxmvoPbZbfTCYbSgaaYQaIXI3/TdI7a7ZGA73Zrou6Q8Zmz3oeUTsp/dj+ag2Xw==", - "dev": true, - "dependencies": { - "@jridgewell/source-map": "^0.3.2", - "acorn": "^8.5.0", - "commander": "^2.20.0", - "source-map-support": "~0.5.20" - }, - "bin": { - "terser": "bin/terser" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/terser/node_modules/acorn": { - "version": "8.8.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.1.tgz", - "integrity": "sha512-7zFpHzhnqYKrkYdUjF1HI1bzd0VygEGX8lFk4k5zVMqHEoES+P+7TKI+EvLO9WVMJ8eekdO0aDEK044xTXwPPA==", - "dev": true, - "bin": { - "acorn": "bin/acorn" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/test-exclude": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", - "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", - "dev": true, - "dependencies": { - "@istanbuljs/schema": "^0.1.2", - "glob": "^7.1.4", - "minimatch": "^3.0.4" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/textextensions": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/textextensions/-/textextensions-2.4.0.tgz", - "integrity": "sha512-qftQXnX1DzpSV8EddtHIT0eDDEiBF8ywhFYR2lI9xrGtxqKN+CvLXhACeCIGbCpQfxxERbrkZEFb8cZcDKbVZA==", - "dev": true, - "engines": { - "node": ">=0.8" - } - }, - "node_modules/tfunk": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/tfunk/-/tfunk-4.0.0.tgz", - "integrity": "sha512-eJQ0dGfDIzWNiFNYFVjJ+Ezl/GmwHaFTBTjrtqNPW0S7cuVDBrZrmzUz6VkMeCR4DZFqhd4YtLwsw3i2wYHswQ==", - "dev": true, - "dependencies": { - "chalk": "^1.1.3", - "dlv": "^1.1.3" - } - }, - "node_modules/through": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", - "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=", - "dev": true - }, - "node_modules/through2": { - "version": "0.6.5", - "resolved": "https://registry.npmjs.org/through2/-/through2-0.6.5.tgz", - "integrity": "sha512-RkK/CCESdTKQZHdmKICijdKKsCRVHs5KsLZ6pACAmF/1GPUQhonHSXWNERctxEp7RmvjdNbZTL5z9V7nSCXKcg==", - "dependencies": { - "readable-stream": ">=1.0.33-1 <1.1.0-0", - "xtend": ">=4.0.0 <4.1.0-0" - } - }, - "node_modules/through2-filter": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/through2-filter/-/through2-filter-3.0.0.tgz", - "integrity": "sha512-jaRjI2WxN3W1V8/FMZ9HKIBXixtiqs3SQSX4/YGIiP3gL6djW48VoZq9tDqeCWs3MT8YY5wb/zli8VW8snY1CA==", - "dev": true, - "dependencies": { - "through2": "~2.0.0", - "xtend": "~4.0.0" - } - }, - "node_modules/through2-filter/node_modules/isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", - "dev": true - }, - "node_modules/through2-filter/node_modules/readable-stream": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", - "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", - "dev": true, - "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "node_modules/through2-filter/node_modules/string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, - "dependencies": { - "safe-buffer": "~5.1.0" - } - }, - "node_modules/through2-filter/node_modules/through2": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", - "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", - "dev": true, - "dependencies": { - "readable-stream": "~2.3.6", - "xtend": "~4.0.1" - } - }, - "node_modules/time-stamp": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/time-stamp/-/time-stamp-1.1.0.tgz", - "integrity": "sha1-dkpaEa9QVhkhsTPztE5hhofg9cM=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/timers-browserify": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/timers-browserify/-/timers-browserify-1.4.2.tgz", - "integrity": "sha1-ycWLV1voQHN1y14kYtrO50NZ9B0=", - "dev": true, - "dependencies": { - "process": "~0.11.0" - }, - "engines": { - "node": ">=0.6.0" - } - }, - "node_modules/tiny-glob": { - "version": "0.2.9", - "resolved": "https://registry.npmjs.org/tiny-glob/-/tiny-glob-0.2.9.tgz", - "integrity": "sha512-g/55ssRPUjShh+xkfx9UPDXqhckHEsHr4Vd9zX55oSdGZc/MD0m3sferOkwWtp98bv+kcVfEHtRJgBVJzelrzg==", - "dev": true, - "dependencies": { - "globalyzer": "0.1.0", - "globrex": "^0.1.2" - } - }, - "node_modules/to-absolute-glob": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/to-absolute-glob/-/to-absolute-glob-2.0.2.tgz", - "integrity": "sha1-GGX0PZ50sIItufFFt4z/fQ98hJs=", - "dev": true, - "dependencies": { - "is-absolute": "^1.0.0", - "is-negated-glob": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/to-object-path": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz", - "integrity": "sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=", - "dev": true, - "dependencies": { - "kind-of": "^3.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/to-object-path/node_modules/kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "dependencies": { - "is-buffer": "^1.1.5" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/to-regex": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz", - "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==", - "dev": true, - "dependencies": { - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "regex-not": "^1.0.2", - "safe-regex": "^1.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/to-regex-range": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", - "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", - "dev": true, - "dependencies": { - "is-number": "^3.0.0", - "repeat-string": "^1.6.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/to-through": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/to-through/-/to-through-2.0.0.tgz", - "integrity": "sha1-/JKtq6ByZHvAtn1rA2ZKoZUJOvY=", - "dev": true, - "dependencies": { - "through2": "^2.0.3" - }, - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/to-through/node_modules/isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", - "dev": true - }, - "node_modules/to-through/node_modules/readable-stream": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", - "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", - "dev": true, - "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "node_modules/to-through/node_modules/string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, - "dependencies": { - "safe-buffer": "~5.1.0" - } - }, - "node_modules/to-through/node_modules/through2": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", - "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", - "dev": true, - "dependencies": { - "readable-stream": "~2.3.6", - "xtend": "~4.0.1" - } - }, - "node_modules/toidentifier": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.0.tgz", - "integrity": "sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw==", - "dev": true, - "engines": { - "node": ">=0.6" - } - }, - "node_modules/tough-cookie": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", - "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==", - "peer": true, - "dependencies": { - "psl": "^1.1.28", - "punycode": "^2.1.1" - }, - "engines": { - "node": ">=0.8" - } - }, - "node_modules/tty-browserify": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.1.tgz", - "integrity": "sha512-C3TaO7K81YvjCgQH9Q1S3R3P3BtN3RIM8n+OvX4il1K1zgE8ZhI0op7kClgkxtutIE8hQrcrHBXvIheqKUUCxw==", - "dev": true - }, - "node_modules/tunnel-agent": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", - "integrity": "sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==", - "dependencies": { - "safe-buffer": "^5.0.1" - }, - "engines": { - "node": "*" - } - }, - "node_modules/tweetnacl": { - "version": "0.14.5", - "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", - "integrity": "sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA==", - "peer": true - }, - "node_modules/type": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/type/-/type-1.0.1.tgz", - "integrity": "sha512-MAM5dBMJCJNKs9E7JXo4CXRAansRfG0nlJxW7Wf6GZzSOvH31zClSaHdIMWLehe/EGMBkqeC55rrkaOr5Oo7Nw==", - "dev": true - }, - "node_modules/type-detect": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", - "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/typedarray": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", - "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=", - "dev": true - }, - "node_modules/typescript": { - "version": "4.9.3", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.9.3.tgz", - "integrity": "sha512-CIfGzTelbKNEnLpLdGFgdyKhG23CKdKgQPOBc+OUNrkJ2vr+KSzsSV5kq5iWhEQbok+quxgGzrAtGWCyU7tHnA==", - "dev": true, - "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" - }, - "engines": { - "node": ">=4.2.0" - } - }, - "node_modules/ua-parser-js": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-1.0.2.tgz", - "integrity": "sha512-00y/AXhx0/SsnI51fTc0rLRmafiGOM4/O+ny10Ps7f+j/b8p/ZY11ytMgznXkOVo4GQ+KwQG5UQLkLGirsACRg==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/ua-parser-js" - }, - { - "type": "paypal", - "url": "https://paypal.me/faisalman" - } - ], - "engines": { - "node": "*" - } - }, - "node_modules/umd": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/umd/-/umd-3.0.3.tgz", - "integrity": "sha512-4IcGSufhFshvLNcMCV80UnQVlZ5pMOC8mvNPForqwA4+lzYQuetTESLDQkeLmihq8bRcnpbQa48Wb8Lh16/xow==", - "dev": true, - "bin": { - "umd": "bin/cli.js" - } - }, - "node_modules/unc-path-regex": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/unc-path-regex/-/unc-path-regex-0.1.2.tgz", - "integrity": "sha1-5z3T17DXxe2G+6xrCufYxqadUPo=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/undeclared-identifiers": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/undeclared-identifiers/-/undeclared-identifiers-1.1.3.tgz", - "integrity": "sha512-pJOW4nxjlmfwKApE4zvxLScM/njmwj/DiUBv7EabwE4O8kRUy+HIwxQtZLBPll/jx1LJyBcqNfB3/cpv9EZwOw==", - "dev": true, - "dependencies": { - "acorn-node": "^1.3.0", - "dash-ast": "^1.0.0", - "get-assigned-identifiers": "^1.2.0", - "simple-concat": "^1.0.0", - "xtend": "^4.0.1" - }, - "bin": { - "undeclared-identifiers": "bin.js" - } - }, - "node_modules/undertaker": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/undertaker/-/undertaker-1.2.1.tgz", - "integrity": "sha512-71WxIzDkgYk9ZS+spIB8iZXchFhAdEo2YU8xYqBYJ39DIUIqziK78ftm26eecoIY49X0J2MLhG4hr18Yp6/CMA==", - "dev": true, - "dependencies": { - "arr-flatten": "^1.0.1", - "arr-map": "^2.0.0", - "bach": "^1.0.0", - "collection-map": "^1.0.0", - "es6-weak-map": "^2.0.1", - "last-run": "^1.1.0", - "object.defaults": "^1.0.0", - "object.reduce": "^1.0.0", - "undertaker-registry": "^1.0.0" - }, - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/undertaker-registry": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/undertaker-registry/-/undertaker-registry-1.0.1.tgz", - "integrity": "sha1-XkvaMI5KiirlhPm5pDWaSZglzFA=", - "dev": true, - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/union-value": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.1.tgz", - "integrity": "sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg==", - "dev": true, - "dependencies": { - "arr-union": "^3.1.0", - "get-value": "^2.0.6", - "is-extendable": "^0.1.1", - "set-value": "^2.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/unique-filename": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-1.1.1.tgz", - "integrity": "sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ==", - "dependencies": { - "unique-slug": "^2.0.0" - } - }, - "node_modules/unique-slug": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-2.0.2.tgz", - "integrity": "sha512-zoWr9ObaxALD3DOPfjPSqxt4fnZiWblxHIgeWqW8x7UqDzEtHEQLzji2cuJYQFCU6KmoJikOYAZlrTHHebjx2w==", - "dependencies": { - "imurmurhash": "^0.1.4" - } - }, - "node_modules/unique-stream": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/unique-stream/-/unique-stream-2.3.1.tgz", - "integrity": "sha512-2nY4TnBE70yoxHkDli7DMazpWiP7xMdCYqU2nBRO0UB+ZpEkGsSija7MvmvnZFUeC+mrgiUfcHSr3LmRFIg4+A==", - "dev": true, - "dependencies": { - "json-stable-stringify-without-jsonify": "^1.0.1", - "through2-filter": "^3.0.0" - } - }, - "node_modules/universalify": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", - "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", - "dev": true, - "engines": { - "node": ">= 4.0.0" - } - }, - "node_modules/unpipe": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", - "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=", - "dev": true, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/unset-value": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz", - "integrity": "sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=", - "dev": true, - "dependencies": { - "has-value": "^0.3.1", - "isobject": "^3.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/unset-value/node_modules/has-value": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz", - "integrity": "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=", - "dev": true, - "dependencies": { - "get-value": "^2.0.3", - "has-values": "^0.1.4", - "isobject": "^2.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/unset-value/node_modules/has-value/node_modules/isobject": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", - "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", - "dev": true, - "dependencies": { - "isarray": "1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/unset-value/node_modules/has-values": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz", - "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/unset-value/node_modules/isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", - "dev": true - }, - "node_modules/upath": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/upath/-/upath-1.2.0.tgz", - "integrity": "sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg==", - "dev": true, - "engines": { - "node": ">=4", - "yarn": "*" - } - }, - "node_modules/uri-js": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", - "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", - "peer": true, - "dependencies": { - "punycode": "^2.1.0" - } - }, - "node_modules/urix": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz", - "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=", - "deprecated": "Please see https://github.com/lydell/urix#deprecated", - "dev": true - }, - "node_modules/url": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/url/-/url-0.11.0.tgz", - "integrity": "sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE=", - "dev": true, - "dependencies": { - "punycode": "1.3.2", - "querystring": "0.2.0" - } - }, - "node_modules/url/node_modules/punycode": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz", - "integrity": "sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0=", - "dev": true - }, - "node_modules/use": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz", - "integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/util": { - "version": "0.12.5", - "resolved": "https://registry.npmjs.org/util/-/util-0.12.5.tgz", - "integrity": "sha512-kZf/K6hEIrWHI6XqOFUiiMa+79wE/D8Q+NCNAWclkyg3b4d2k7s0QGepNjiABc+aR3N1PAyHL7p6UcLY6LmrnA==", - "dev": true, - "dependencies": { - "inherits": "^2.0.3", - "is-arguments": "^1.0.4", - "is-generator-function": "^1.0.7", - "is-typed-array": "^1.1.3", - "which-typed-array": "^1.1.2" - } - }, - "node_modules/util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" - }, - "node_modules/utils-merge": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", - "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=", - "dev": true, - "engines": { - "node": ">= 0.4.0" - } - }, - "node_modules/uuid": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", - "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", - "deprecated": "Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details.", - "peer": true, - "bin": { - "uuid": "bin/uuid" - } - }, - "node_modules/v8-to-istanbul": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-9.0.1.tgz", - "integrity": "sha512-74Y4LqY74kLE6IFyIjPtkSTWzUZmj8tdHT9Ii/26dvQ6K9Dl2NbEfj0XgU2sHCtKgt5VupqhlO/5aWuqS+IY1w==", - "dev": true, - "dependencies": { - "@jridgewell/trace-mapping": "^0.3.12", - "@types/istanbul-lib-coverage": "^2.0.1", - "convert-source-map": "^1.6.0" - }, - "engines": { - "node": ">=10.12.0" - } - }, - "node_modules/v8-to-istanbul/node_modules/convert-source-map": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", - "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==", - "dev": true - }, - "node_modules/v8flags": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/v8flags/-/v8flags-3.1.3.tgz", - "integrity": "sha512-amh9CCg3ZxkzQ48Mhcb8iX7xpAfYJgePHxWMQCBWECpOSqJUXgY26ncA61UTV0BkPqfhcy6mzwCIoP4ygxpW8w==", - "dev": true, - "dependencies": { - "homedir-polyfill": "^1.0.1" - }, - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/validate-npm-package-license": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", - "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", - "dev": true, - "dependencies": { - "spdx-correct": "^3.0.0", - "spdx-expression-parse": "^3.0.0" - } - }, - "node_modules/value-or-function": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/value-or-function/-/value-or-function-3.0.0.tgz", - "integrity": "sha1-HCQ6ULWVwb5Up1S/7OhWO5/42BM=", - "dev": true, - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/vary": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", - "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", - "dev": true, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/verror": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", - "integrity": "sha512-ZZKSmDAEFOijERBLkmYfJ+vmk3w+7hOLYDNkRCuRuMJGEmqYNCNLyBBFwWKVMhfwaEF3WOd0Zlw86U/WC/+nYw==", - "engines": [ - "node >=0.6.0" - ], - "peer": true, - "dependencies": { - "assert-plus": "^1.0.0", - "core-util-is": "1.0.2", - "extsprintf": "^1.2.0" - } - }, - "node_modules/vinyl": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-2.2.1.tgz", - "integrity": "sha512-LII3bXRFBZLlezoG5FfZVcXflZgWP/4dCwKtxd5ky9+LOtM4CS3bIRQsmR1KMnMW07jpE8fqR2lcxPZ+8sJIcw==", - "dev": true, - "dependencies": { - "clone": "^2.1.1", - "clone-buffer": "^1.0.0", - "clone-stats": "^1.0.0", - "cloneable-readable": "^1.0.0", - "remove-trailing-separator": "^1.0.1", - "replace-ext": "^1.0.0" - }, - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/vinyl-buffer": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/vinyl-buffer/-/vinyl-buffer-1.0.1.tgz", - "integrity": "sha1-lsGjR5uMU5JULGEgKQE7Wyf4i78=", - "dev": true, - "dependencies": { - "bl": "^1.2.1", - "through2": "^2.0.3" - } - }, - "node_modules/vinyl-buffer/node_modules/isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", - "dev": true - }, - "node_modules/vinyl-buffer/node_modules/readable-stream": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", - "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", - "dev": true, - "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "node_modules/vinyl-buffer/node_modules/string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, - "dependencies": { - "safe-buffer": "~5.1.0" - } - }, - "node_modules/vinyl-buffer/node_modules/through2": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", - "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", - "dev": true, - "dependencies": { - "readable-stream": "~2.3.6", - "xtend": "~4.0.1" - } - }, - "node_modules/vinyl-fs": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/vinyl-fs/-/vinyl-fs-3.0.3.tgz", - "integrity": "sha512-vIu34EkyNyJxmP0jscNzWBSygh7VWhqun6RmqVfXePrOwi9lhvRs//dOaGOTRUQr4tx7/zd26Tk5WeSVZitgng==", - "dev": true, - "dependencies": { - "fs-mkdirp-stream": "^1.0.0", - "glob-stream": "^6.1.0", - "graceful-fs": "^4.0.0", - "is-valid-glob": "^1.0.0", - "lazystream": "^1.0.0", - "lead": "^1.0.0", - "object.assign": "^4.0.4", - "pumpify": "^1.3.5", - "readable-stream": "^2.3.3", - "remove-bom-buffer": "^3.0.0", - "remove-bom-stream": "^1.2.0", - "resolve-options": "^1.1.0", - "through2": "^2.0.0", - "to-through": "^2.0.0", - "value-or-function": "^3.0.0", - "vinyl": "^2.0.0", - "vinyl-sourcemap": "^1.1.0" - }, - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/vinyl-fs/node_modules/isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", - "dev": true - }, - "node_modules/vinyl-fs/node_modules/readable-stream": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", - "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", - "dev": true, - "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "node_modules/vinyl-fs/node_modules/string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, - "dependencies": { - "safe-buffer": "~5.1.0" - } - }, - "node_modules/vinyl-fs/node_modules/through2": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", - "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", - "dev": true, - "dependencies": { - "readable-stream": "~2.3.6", - "xtend": "~4.0.1" - } - }, - "node_modules/vinyl-source-stream": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/vinyl-source-stream/-/vinyl-source-stream-2.0.0.tgz", - "integrity": "sha1-84pa+53R6Ttl1VBGmsYYKsT1S44=", - "dev": true, - "dependencies": { - "through2": "^2.0.3", - "vinyl": "^2.1.0" - } - }, - "node_modules/vinyl-source-stream/node_modules/isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", - "dev": true - }, - "node_modules/vinyl-source-stream/node_modules/readable-stream": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", - "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", - "dev": true, - "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "node_modules/vinyl-source-stream/node_modules/string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, - "dependencies": { - "safe-buffer": "~5.1.0" - } - }, - "node_modules/vinyl-source-stream/node_modules/through2": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", - "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", - "dev": true, - "dependencies": { - "readable-stream": "~2.3.6", - "xtend": "~4.0.1" - } - }, - "node_modules/vinyl-sourcemap": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/vinyl-sourcemap/-/vinyl-sourcemap-1.1.0.tgz", - "integrity": "sha1-kqgAWTo4cDqM2xHYswCtS+Y7PhY=", - "dev": true, - "dependencies": { - "append-buffer": "^1.0.2", - "convert-source-map": "^1.5.0", - "graceful-fs": "^4.1.6", - "normalize-path": "^2.1.1", - "now-and-later": "^2.0.0", - "remove-bom-buffer": "^3.0.0", - "vinyl": "^2.0.0" - }, - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/vinyl-sourcemap/node_modules/convert-source-map": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.6.0.tgz", - "integrity": "sha512-eFu7XigvxdZ1ETfbgPBohgyQ/Z++C0eEhTor0qRwBw9unw+L0/6V8wkSuGgzdThkiS5lSpdptOQPD8Ak40a+7A==", - "dev": true, - "dependencies": { - "safe-buffer": "~5.1.1" - } - }, - "node_modules/vinyl-sourcemap/node_modules/normalize-path": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", - "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", - "dev": true, - "dependencies": { - "remove-trailing-separator": "^1.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/vinyl-sourcemaps-apply": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/vinyl-sourcemaps-apply/-/vinyl-sourcemaps-apply-0.2.1.tgz", - "integrity": "sha1-q2VJ1h0XLCsbh75cUI0jnI74dwU=", - "dev": true, - "dependencies": { - "source-map": "^0.5.1" - } - }, - "node_modules/vm-browserify": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-1.1.0.tgz", - "integrity": "sha512-iq+S7vZJE60yejDYM0ek6zg308+UZsdtPExWP9VZoCFCz1zkJoXFnAX7aZfd/ZwrkidzdUZL0C/ryW+JwAiIGw==", - "dev": true - }, - "node_modules/webgpu": { - "version": "0.1.16", - "resolved": "https://registry.npmjs.org/webgpu/-/webgpu-0.1.16.tgz", - "integrity": "sha512-KAXn/f8lnL8o4B718zzdfi1l0nEWQpuoWlC1L5WM/svAbeHjShCEI0l5ZcZBEEUm9FF3ZTgRjWk8iwbJfnGKTA==", - "engines": { - "node": ">= 13.0.0" - } - }, - "node_modules/which": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", - "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", - "dev": true, - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "which": "bin/which" - } - }, - "node_modules/which-module": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/which-module/-/which-module-1.0.0.tgz", - "integrity": "sha1-u6Y8qGGUiZT/MHc2CJ47lgJsKk8=", - "dev": true - }, - "node_modules/which-pm-runs": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/which-pm-runs/-/which-pm-runs-1.1.0.tgz", - "integrity": "sha512-n1brCuqClxfFfq/Rb0ICg9giSZqCS+pLtccdag6C2HyufBrh3fBOiy9nb6ggRMvWOVH5GrdJskj5iGTZNxd7SA==", - "peer": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/which-typed-array": { - "version": "1.1.9", - "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.9.tgz", - "integrity": "sha512-w9c4xkx6mPidwp7180ckYWfMmvxpjlZuIudNtDf4N/tTAUB8VJbX25qZoAsrtGuYNnGw3pa0AXgbGKRB8/EceA==", - "dev": true, - "dependencies": { - "available-typed-arrays": "^1.0.5", - "call-bind": "^1.0.2", - "for-each": "^0.3.3", - "gopd": "^1.0.1", - "has-tostringtag": "^1.0.0", - "is-typed-array": "^1.1.10" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/wide-align": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.5.tgz", - "integrity": "sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==", - "dependencies": { - "string-width": "^1.0.2 || 2 || 3 || 4" - } - }, - "node_modules/wrap-ansi": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", - "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=", - "dev": true, - "dependencies": { - "string-width": "^1.0.1", - "strip-ansi": "^3.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" - }, - "node_modules/ws": { - "version": "8.2.3", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.2.3.tgz", - "integrity": "sha512-wBuoj1BDpC6ZQ1B7DWQBYVLphPWkm8i9Y0/3YdHjHKHiohOJ1ws+3OccDWtH+PoC9DZD5WOTrJvNbWvjS6JWaA==", - "dev": true, - "engines": { - "node": ">=10.0.0" - }, - "peerDependencies": { - "bufferutil": "^4.0.1", - "utf-8-validate": "^5.0.2" - }, - "peerDependenciesMeta": { - "bufferutil": { - "optional": true - }, - "utf-8-validate": { - "optional": true - } - } - }, - "node_modules/xmlhttprequest-ssl": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/xmlhttprequest-ssl/-/xmlhttprequest-ssl-2.0.0.tgz", - "integrity": "sha512-QKxVRxiRACQcVuQEYFsI1hhkrMlrXHPegbbd1yn9UHOmRxY+si12nQYzri3vbzt8VdTTRviqcKxcyllFas5z2A==", - "dev": true, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/xtend": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", - "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", - "engines": { - "node": ">=0.4" - } - }, - "node_modules/y18n": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.2.tgz", - "integrity": "sha512-uGZHXkHnhF0XeeAPgnKfPv1bgKAYyVvmNL1xlKsPYZPaIHxGti2hHqvOCQv71XMsLxu1QjergkqogUnms5D3YQ==", - "dev": true - }, - "node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" - }, - "node_modules/yargs": { - "version": "17.6.2", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.6.2.tgz", - "integrity": "sha512-1/9UrdHjDZc0eOU0HxOHoS78C69UD3JRMvzlJ7S79S2nTaWRA/whGCTV8o9e/N/1Va9YIV7Q4sOxD8VV4pCWOw==", - "dev": true, - "dependencies": { - "cliui": "^8.0.1", - "escalade": "^3.1.1", - "get-caller-file": "^2.0.5", - "require-directory": "^2.1.1", - "string-width": "^4.2.3", - "y18n": "^5.0.5", - "yargs-parser": "^21.1.1" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/yargs-parser": { - "version": "20.2.9", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", - "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", - "dev": true, - "engines": { - "node": ">=10" - } - }, - "node_modules/yargs/node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/yargs/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/yargs/node_modules/cliui": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", - "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", - "dev": true, - "dependencies": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.1", - "wrap-ansi": "^7.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/yargs/node_modules/get-caller-file": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", - "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", - "dev": true, - "engines": { - "node": "6.* || 8.* || >= 10.*" - } - }, - "node_modules/yargs/node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/yargs/node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/yargs/node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/yargs/node_modules/wrap-ansi": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, - "node_modules/yargs/node_modules/y18n": { - "version": "5.0.8", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", - "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", - "dev": true, - "engines": { - "node": ">=10" - } - }, - "node_modules/yargs/node_modules/yargs-parser": { - "version": "21.1.1", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", - "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", - "dev": true, - "engines": { - "node": ">=12" - } - }, - "node_modules/yocto-queue": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", - "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - } - }, - "dependencies": { - "@bcoe/v8-coverage": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz", - "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==", - "dev": true - }, - "@gar/promisify": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/@gar/promisify/-/promisify-1.1.3.tgz", - "integrity": "sha512-k2Ty1JcVojjJFwrg/ThKi2ujJ7XNLYaFGNB/bWT9wGR+oSMJHMa5w+CUq6p/pVrKeNNgA7pCqEcjSnHVoqJQFw==" - }, - "@istanbuljs/schema": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", - "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", - "dev": true - }, - "@jridgewell/gen-mapping": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz", - "integrity": "sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A==", - "dev": true, - "requires": { - "@jridgewell/set-array": "^1.0.1", - "@jridgewell/sourcemap-codec": "^1.4.10", - "@jridgewell/trace-mapping": "^0.3.9" - } - }, - "@jridgewell/resolve-uri": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz", - "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==", - "dev": true - }, - "@jridgewell/set-array": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", - "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", - "dev": true - }, - "@jridgewell/source-map": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.2.tgz", - "integrity": "sha512-m7O9o2uR8k2ObDysZYzdfhb08VuEml5oWGiosa1VdaPZ/A6QyPkAJuwN0Q1lhULOf6B7MtQmHENS743hWtCrgw==", - "dev": true, - "requires": { - "@jridgewell/gen-mapping": "^0.3.0", - "@jridgewell/trace-mapping": "^0.3.9" - } - }, - "@jridgewell/sourcemap-codec": { - "version": "1.4.14", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz", - "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==", - "dev": true - }, - "@jridgewell/trace-mapping": { - "version": "0.3.17", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.17.tgz", - "integrity": "sha512-MCNzAp77qzKca9+W/+I0+sEpaUnZoeasnghNeVc41VZCEKaCH73Vq3BZZ/SzWIgrqE4H4ceI+p+b6C0mHf9T4g==", - "dev": true, - "requires": { - "@jridgewell/resolve-uri": "3.1.0", - "@jridgewell/sourcemap-codec": "1.4.14" - } - }, - "@nodelib/fs.scandir": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.1.tgz", - "integrity": "sha512-NT/skIZjgotDSiXs0WqYhgcuBKhUMgfekCmCGtkUAiLqZdOnrdjmZr9wRl3ll64J9NF79uZ4fk16Dx0yMc/Xbg==", - "dev": true, - "requires": { - "@nodelib/fs.stat": "2.0.1", - "run-parallel": "^1.1.9" - } - }, - "@nodelib/fs.stat": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.1.tgz", - "integrity": "sha512-+RqhBlLn6YRBGOIoVYthsG0J9dfpO79eJyN7BYBkZJtfqrBwf2KK+rD/M/yjZR6WBmIhAgOV7S60eCgaSWtbFw==", - "dev": true - }, - "@nodelib/fs.walk": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.2.tgz", - "integrity": "sha512-J/DR3+W12uCzAJkw7niXDcqcKBg6+5G5Q/ZpThpGNzAUz70eOR6RV4XnnSN01qHZiVl0eavoxJsBypQoKsV2QQ==", - "dev": true, - "requires": { - "@nodelib/fs.scandir": "2.1.1", - "fastq": "^1.6.0" - } - }, - "@npmcli/fs": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@npmcli/fs/-/fs-2.1.0.tgz", - "integrity": "sha512-DmfBvNXGaetMxj9LTp8NAN9vEidXURrf5ZTslQzEAi/6GbW+4yjaLFQc6Tue5cpZ9Frlk4OBo/Snf1Bh/S7qTQ==", - "requires": { - "@gar/promisify": "^1.1.3", - "semver": "^7.3.5" - }, - "dependencies": { - "lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "requires": { - "yallist": "^4.0.0" - } - }, - "semver": { - "version": "7.3.7", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz", - "integrity": "sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==", - "requires": { - "lru-cache": "^6.0.0" - } - } - } - }, - "@npmcli/move-file": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@npmcli/move-file/-/move-file-2.0.0.tgz", - "integrity": "sha512-UR6D5f4KEGWJV6BGPH3Qb2EtgH+t+1XQ1Tt85c7qicN6cezzuHPdZwwAxqZr4JLtnQu0LZsTza/5gmNmSl8XLg==", - "requires": { - "mkdirp": "^1.0.4", - "rimraf": "^3.0.2" - }, - "dependencies": { - "mkdirp": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", - "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==" - } - } - }, - "@sinonjs/commons": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.4.0.tgz", - "integrity": "sha512-9jHK3YF/8HtJ9wCAbG+j8cD0i0+ATS9A7gXFqS36TblLPNy6rEEc+SB0imo91eCboGaBYGV/MT1/br/J+EE7Tw==", - "dev": true, - "requires": { - "type-detect": "4.0.8" - } - }, - "@sinonjs/formatio": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/@sinonjs/formatio/-/formatio-3.2.1.tgz", - "integrity": "sha512-tsHvOB24rvyvV2+zKMmPkZ7dXX6LSLKZ7aOtXY6Edklp0uRcgGpOsQTTGTcWViFyx4uhWc6GV8QdnALbIbIdeQ==", - "dev": true, - "requires": { - "@sinonjs/commons": "^1", - "@sinonjs/samsam": "^3.1.0" - } - }, - "@sinonjs/samsam": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/@sinonjs/samsam/-/samsam-3.3.2.tgz", - "integrity": "sha512-ILO/rR8LfAb60Y1Yfp9vxfYAASK43NFC2mLzpvLUbCQY/Qu8YwReboseu8aheCEkyElZF2L2T9mHcR2bgdvZyA==", - "dev": true, - "requires": { - "@sinonjs/commons": "^1.0.2", - "array-from": "^2.1.1", - "lodash": "^4.17.11" - } - }, - "@sinonjs/text-encoding": { - "version": "0.7.1", - "resolved": "https://registry.npmjs.org/@sinonjs/text-encoding/-/text-encoding-0.7.1.tgz", - "integrity": "sha512-+iTbntw2IZPb/anVDbypzfQa+ay64MW0Zo8aJ8gZPWMMK6/OubMVb6lUPMagqjOPnmtauXnFCACVl3O7ogjeqQ==", - "dev": true - }, - "@socket.io/component-emitter": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@socket.io/component-emitter/-/component-emitter-3.1.0.tgz", - "integrity": "sha512-+9jVqKhRSpsc591z5vX+X5Yyw+he/HCB4iQ/RYxw35CEPaY1gnsNE43nf9n9AaYjAQrTiI/mOwKUKdUs9vf7Xg==", - "dev": true - }, - "@tootallnate/once": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-2.0.0.tgz", - "integrity": "sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==" - }, - "@types/cookie": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/@types/cookie/-/cookie-0.4.1.tgz", - "integrity": "sha512-XW/Aa8APYr6jSVVA1y/DEIZX0/GMKLEVekNG727R8cs56ahETkRAy/3DR7+fJyh7oUgGwNQaRfXCun0+KbWY7Q==", - "dev": true - }, - "@types/cors": { - "version": "2.8.12", - "resolved": "https://registry.npmjs.org/@types/cors/-/cors-2.8.12.tgz", - "integrity": "sha512-vt+kDhq/M2ayberEtJcIN/hxXy1Pk+59g2FV/ZQceeaTyCtCucjL2Q7FXlFjtWn4n15KCr1NE2lNNFhp0lEThw==", - "dev": true - }, - "@types/events": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@types/events/-/events-3.0.0.tgz", - "integrity": "sha512-EaObqwIvayI5a8dCzhFrjKzVwKLxjoG9T6Ppd5CEo07LRKfQ8Yokw54r5+Wq7FaBQ+yXRvQAYPrHwya1/UFt9g==", - "dev": true - }, - "@types/glob": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/@types/glob/-/glob-7.1.1.tgz", - "integrity": "sha512-1Bh06cbWJUHMC97acuD6UMG29nMt0Aqz1vF3guLfG+kHHJhy3AyohZFFxYk2f7Q1SQIrNwvncxAE0N/9s70F2w==", - "dev": true, - "requires": { - "@types/events": "*", - "@types/minimatch": "*", - "@types/node": "*" - } - }, - "@types/istanbul-lib-coverage": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.4.tgz", - "integrity": "sha512-z/QT1XN4K4KYuslS23k62yDIDLwLFkzxOuMplDtObz0+y7VqJCaO2o+SPwHCvLFZh7xazvvoor2tA/hPz9ee7g==", - "dev": true - }, - "@types/minimatch": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.3.tgz", - "integrity": "sha512-tHq6qdbT9U1IRSGf14CL0pUlULksvY9OZ+5eEgl1N7t+OA3tGvNpxJCzuKQlsNgCVwbAs670L1vcVQi8j9HjnA==", - "dev": true - }, - "@types/node": { - "version": "12.6.8", - "resolved": "https://registry.npmjs.org/@types/node/-/node-12.6.8.tgz", - "integrity": "sha512-aX+gFgA5GHcDi89KG5keey2zf0WfZk/HAQotEamsK2kbey+8yGKcson0hbK8E+v0NArlCJQCqMP161YhV6ZXLg==", - "dev": true - }, - "abbrev": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", - "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==" - }, - "accepts": { - "version": "1.3.7", - "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.7.tgz", - "integrity": "sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA==", - "dev": true, - "requires": { - "mime-types": "~2.1.24", - "negotiator": "0.6.2" - } - }, - "acorn": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.1.1.tgz", - "integrity": "sha512-add7dgA5ppRPxCFJoAGfMDi7PIBXq1RtGo7BhbLaxwrXPOmw8gq48Y9ozT01hUKy9byMjlR20EJhu5zlkErEkg==" - }, - "acorn-node": { - "version": "1.8.2", - "resolved": "https://registry.npmjs.org/acorn-node/-/acorn-node-1.8.2.tgz", - "integrity": "sha512-8mt+fslDufLYntIoPAaIMUe/lrbrehIiwmR3t2k9LljIzoigEPF27eLk2hy8zSGzmR/ogr7zbRKINMo1u0yh5A==", - "dev": true, - "requires": { - "acorn": "^7.0.0", - "acorn-walk": "^7.0.0", - "xtend": "^4.0.2" - }, - "dependencies": { - "acorn-walk": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-7.1.1.tgz", - "integrity": "sha512-wdlPY2tm/9XBr7QkKlq0WQVgiuGTX6YWPyRyBviSoScBuLfTVQhvwg6wJ369GJ/1nPfTLMfnrFIfjqVg6d+jQQ==", - "dev": true - } - } - }, - "agent-base": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", - "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", - "requires": { - "debug": "4" - }, - "dependencies": { - "debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "requires": { - "ms": "2.1.2" - } - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" - } - } - }, - "agentkeepalive": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/agentkeepalive/-/agentkeepalive-4.2.1.tgz", - "integrity": "sha512-Zn4cw2NEqd+9fiSVWMscnjyQ1a8Yfoc5oBajLeo5w+YBHgDUcEBY2hS4YpTz6iN5f/2zQiktcuM6tS8x1p9dpA==", - "requires": { - "debug": "^4.1.0", - "depd": "^1.1.2", - "humanize-ms": "^1.2.1" - }, - "dependencies": { - "debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "requires": { - "ms": "2.1.2" - } - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" - } - } - }, - "aggregate-error": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", - "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", - "requires": { - "clean-stack": "^2.0.0", - "indent-string": "^4.0.0" - } - }, - "ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "peer": true, - "requires": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - } - }, - "ansi-colors": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-1.1.0.tgz", - "integrity": "sha512-SFKX67auSNoVR38N3L+nvsPjOE0bybKTYbkf5tRvushrAPQ9V75huw0ZxBkKVeRU9kqH3d6HA4xTckbwZ4ixmA==", - "dev": true, - "requires": { - "ansi-wrap": "^0.1.0" - } - }, - "ansi-cyan": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/ansi-cyan/-/ansi-cyan-0.1.1.tgz", - "integrity": "sha1-U4rlKK+JgvKK4w2G8vF0VtJgmHM=", - "dev": true, - "requires": { - "ansi-wrap": "0.1.0" - } - }, - "ansi-gray": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/ansi-gray/-/ansi-gray-0.1.1.tgz", - "integrity": "sha1-KWLPVOyXksSFEKPetSRDaGHvclE=", - "dev": true, - "requires": { - "ansi-wrap": "0.1.0" - } - }, - "ansi-red": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/ansi-red/-/ansi-red-0.1.1.tgz", - "integrity": "sha1-jGOPnRCAgAo1PJwoyKgcpHBdlGw=", - "dev": true, - "requires": { - "ansi-wrap": "0.1.0" - } - }, - "ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=" - }, - "ansi-styles": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", - "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", - "dev": true - }, - "ansi-wrap": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/ansi-wrap/-/ansi-wrap-0.1.0.tgz", - "integrity": "sha1-qCJQ3bABXponyoLoLqYDu/pF768=", - "dev": true - }, - "anymatch": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", - "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", - "dev": true, - "requires": { - "micromatch": "^3.1.4", - "normalize-path": "^2.1.1" - }, - "dependencies": { - "normalize-path": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", - "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", - "dev": true, - "requires": { - "remove-trailing-separator": "^1.0.1" - } - } - } - }, - "append-buffer": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/append-buffer/-/append-buffer-1.0.2.tgz", - "integrity": "sha1-2CIM9GYIFSXv6lBhTz3mUU36WPE=", - "dev": true, - "requires": { - "buffer-equal": "^1.0.0" - } - }, - "aproba": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/aproba/-/aproba-2.0.0.tgz", - "integrity": "sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ==" - }, - "archy": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/archy/-/archy-1.0.0.tgz", - "integrity": "sha1-+cjBN1fMHde8N5rHeyxipcKGjEA=", - "dev": true - }, - "are-we-there-yet": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-3.0.0.tgz", - "integrity": "sha512-0GWpv50YSOcLXaN6/FAKY3vfRbllXWV2xvfA/oKJF8pzFhWXPV+yjhJXDBbjscDYowv7Yw1A3uigpzn5iEGTyw==", - "requires": { - "delegates": "^1.0.0", - "readable-stream": "^3.6.0" - }, - "dependencies": { - "readable-stream": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", - "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", - "requires": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - } - }, - "safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==" - }, - "string_decoder": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", - "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", - "requires": { - "safe-buffer": "~5.2.0" - } - } - } - }, - "arr-diff": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", - "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=", - "dev": true - }, - "arr-filter": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/arr-filter/-/arr-filter-1.1.2.tgz", - "integrity": "sha1-Q/3d0JHo7xGqTEXZzcGOLf8XEe4=", - "dev": true, - "requires": { - "make-iterator": "^1.0.0" - } - }, - "arr-flatten": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz", - "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==", - "dev": true - }, - "arr-map": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/arr-map/-/arr-map-2.0.2.tgz", - "integrity": "sha1-Onc0X/wc814qkYJWAfnljy4kysQ=", - "dev": true, - "requires": { - "make-iterator": "^1.0.0" - } - }, - "arr-union": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz", - "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=", - "dev": true - }, - "array-each": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/array-each/-/array-each-1.0.1.tgz", - "integrity": "sha1-p5SvDAWrF1KEbudTofIRoFugxE8=", - "dev": true - }, - "array-from": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/array-from/-/array-from-2.1.1.tgz", - "integrity": "sha1-z+nYwmYoudxa7MYqn12PHzUsEZU=", - "dev": true - }, - "array-initial": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/array-initial/-/array-initial-1.1.0.tgz", - "integrity": "sha1-L6dLJnOTccOUe9enrcc74zSz15U=", - "dev": true, - "requires": { - "array-slice": "^1.0.0", - "is-number": "^4.0.0" - }, - "dependencies": { - "is-number": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-4.0.0.tgz", - "integrity": "sha512-rSklcAIlf1OmFdyAqbnWTLVelsQ58uvZ66S/ZyawjWqIviTWCjg2PzVGw8WUA+nNuPTqb4wgA+NszrJ+08LlgQ==", - "dev": true - } - } - }, - "array-last": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/array-last/-/array-last-1.3.0.tgz", - "integrity": "sha512-eOCut5rXlI6aCOS7Z7kCplKRKyiFQ6dHFBem4PwlwKeNFk2/XxTrhRh5T9PyaEWGy/NHTZWbY+nsZlNFJu9rYg==", - "dev": true, - "requires": { - "is-number": "^4.0.0" - }, - "dependencies": { - "is-number": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-4.0.0.tgz", - "integrity": "sha512-rSklcAIlf1OmFdyAqbnWTLVelsQ58uvZ66S/ZyawjWqIviTWCjg2PzVGw8WUA+nNuPTqb4wgA+NszrJ+08LlgQ==", - "dev": true - } - } - }, - "array-slice": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/array-slice/-/array-slice-1.1.0.tgz", - "integrity": "sha512-B1qMD3RBP7O8o0H2KbrXDyB0IccejMF15+87Lvlor12ONPRHP6gTjXMNkt/d3ZuOGbAe66hFmaCfECI24Ufp6w==", - "dev": true - }, - "array-sort": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/array-sort/-/array-sort-1.0.0.tgz", - "integrity": "sha512-ihLeJkonmdiAsD7vpgN3CRcx2J2S0TiYW+IS/5zHBI7mKUq3ySvBdzzBfD236ubDBQFiiyG3SWCPc+msQ9KoYg==", - "dev": true, - "requires": { - "default-compare": "^1.0.0", - "get-value": "^2.0.6", - "kind-of": "^5.0.2" - }, - "dependencies": { - "kind-of": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", - "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", - "dev": true - } - } - }, - "array-union": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", - "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", - "dev": true - }, - "array-unique": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", - "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", - "dev": true - }, - "asn1": { - "version": "0.2.6", - "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.6.tgz", - "integrity": "sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ==", - "peer": true, - "requires": { - "safer-buffer": "~2.1.0" - } - }, - "asn1.js": { - "version": "4.10.1", - "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-4.10.1.tgz", - "integrity": "sha512-p32cOF5q0Zqs9uBiONKYLm6BClCoBCM5O9JfeUSlnQLBTxYdTK+pW+nXflm8UkKd2UYlEbYz5qEi0JuZR9ckSw==", - "dev": true, - "requires": { - "bn.js": "^4.0.0", - "inherits": "^2.0.1", - "minimalistic-assert": "^1.0.0" - } - }, - "assert": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/assert/-/assert-1.5.0.tgz", - "integrity": "sha512-EDsgawzwoun2CZkCgtxJbv392v4nbk9XDD06zI+kQYoBM/3RBWLlEyJARDOmhAAosBjWACEkKL6S+lIZtcAubA==", - "dev": true, - "requires": { - "object-assign": "^4.1.1", - "util": "0.10.3" - }, - "dependencies": { - "inherits": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", - "integrity": "sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE=", - "dev": true - }, - "util": { - "version": "0.10.3", - "resolved": "https://registry.npmjs.org/util/-/util-0.10.3.tgz", - "integrity": "sha1-evsa/lCAUkZInj23/g7TeTNqwPk=", - "dev": true, - "requires": { - "inherits": "2.0.1" - } - } - } - }, - "assert-plus": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw==", - "peer": true - }, - "assign-symbols": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz", - "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=", - "dev": true - }, - "async": { - "version": "2.6.4", - "resolved": "https://registry.npmjs.org/async/-/async-2.6.4.tgz", - "integrity": "sha512-mzo5dfJYwAn29PeiJ0zvwTo04zj8HDJj0Mn8TD7sno7q12prdbnasKJHhkm2c1LgrhlJ0teaea8860oxi51mGA==", - "dev": true, - "requires": { - "lodash": "^4.17.14" - } - }, - "async-done": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/async-done/-/async-done-1.3.2.tgz", - "integrity": "sha512-uYkTP8dw2og1tu1nmza1n1CMW0qb8gWWlwqMmLb7MhBVs4BXrFziT6HXUd+/RlRA/i4H9AkofYloUbs1fwMqlw==", - "dev": true, - "requires": { - "end-of-stream": "^1.1.0", - "once": "^1.3.2", - "process-nextick-args": "^2.0.0", - "stream-exhaust": "^1.0.1" - } - }, - "async-each": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/async-each/-/async-each-1.0.3.tgz", - "integrity": "sha512-z/WhQ5FPySLdvREByI2vZiTWwCnF0moMJ1hK9YQwDTHKh6I7/uSckMetoRGb5UBZPC1z0jlw+n/XCgjeH7y1AQ==", - "dev": true - }, - "async-each-series": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/async-each-series/-/async-each-series-0.1.1.tgz", - "integrity": "sha512-p4jj6Fws4Iy2m0iCmI2am2ZNZCgbdgE+P8F/8csmn2vx7ixXrO2zGcuNsD46X5uZSVecmkEy/M06X2vG8KD6dQ==", - "dev": true - }, - "async-settle": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/async-settle/-/async-settle-1.0.0.tgz", - "integrity": "sha1-HQqRS7Aldb7IqPOnTlCA9yssDGs=", - "dev": true, - "requires": { - "async-done": "^1.2.2" - } - }, - "asynckit": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", - "peer": true - }, - "atob": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz", - "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==", - "dev": true - }, - "available-typed-arrays": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz", - "integrity": "sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==", - "dev": true - }, - "aws-sign2": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", - "integrity": "sha512-08kcGqnYf/YmjoRhfxyu+CLxBjUtHLXLXX/vUfx9l2LYzG3c1m61nrpyFUZI6zeS+Li/wWMMidD9KgrqtGq3mA==", - "peer": true - }, - "aws4": { - "version": "1.11.0", - "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.11.0.tgz", - "integrity": "sha512-xh1Rl34h6Fi1DC2WWKfxUTVqRsNnr6LsKz2+hfwDxQJWmrx8+c7ylaqBMcHfl1U1r2dsifOvKX3LQuLNZ+XSvA==", - "peer": true - }, - "axios": { - "version": "0.21.4", - "resolved": "https://registry.npmjs.org/axios/-/axios-0.21.4.tgz", - "integrity": "sha512-ut5vewkiu8jjGBdqpM44XxjuCjq9LAKeHVmoVfHVzy8eHgxxq8SbAVQNovDA8mVi05kP0Ea/n/UzcSHcTJQfNg==", - "dev": true, - "requires": { - "follow-redirects": "^1.14.0" - } - }, - "bach": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/bach/-/bach-1.2.0.tgz", - "integrity": "sha1-Szzpa/JxNPeaG0FKUcFONMO9mIA=", - "dev": true, - "requires": { - "arr-filter": "^1.1.1", - "arr-flatten": "^1.0.1", - "arr-map": "^2.0.0", - "array-each": "^1.0.0", - "array-initial": "^1.0.0", - "array-last": "^1.1.1", - "async-done": "^1.2.2", - "async-settle": "^1.0.0", - "now-and-later": "^2.0.0" - } - }, - "balanced-match": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", - "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=" - }, - "base": { - "version": "0.11.2", - "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz", - "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==", - "dev": true, - "requires": { - "cache-base": "^1.0.1", - "class-utils": "^0.3.5", - "component-emitter": "^1.2.1", - "define-property": "^1.0.0", - "isobject": "^3.0.1", - "mixin-deep": "^1.2.0", - "pascalcase": "^0.1.1" - }, - "dependencies": { - "define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", - "dev": true, - "requires": { - "is-descriptor": "^1.0.0" - } - }, - "is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "dev": true, - "requires": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" - } - } - } - }, - "base64-js": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.3.0.tgz", - "integrity": "sha512-ccav/yGvoa80BQDljCxsmmQ3Xvx60/UpBIij5QN21W3wBi/hhIC9OoO+KLpu9IJTS9j4DRVJ3aDDF9cMSoa2lw==", - "dev": true - }, - "base64id": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/base64id/-/base64id-2.0.0.tgz", - "integrity": "sha512-lGe34o6EHj9y3Kts9R4ZYs/Gr+6N7MCaMlIFA3F1R2O5/m7K06AxfSeO5530PEERE6/WyEg3lsuyw4GHlPZHog==", - "dev": true - }, - "batch": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz", - "integrity": "sha1-3DQxT05nkxgJP8dgJyUl+UvyXBY=", - "dev": true - }, - "bcrypt-pbkdf": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", - "integrity": "sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w==", - "peer": true, - "requires": { - "tweetnacl": "^0.14.3" - } - }, - "benchmark": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/benchmark/-/benchmark-2.1.4.tgz", - "integrity": "sha1-CfPeMckWQl1JjMLuVloOvzwqVik=", - "dev": true, - "requires": { - "lodash": "^4.17.4", - "platform": "^1.3.3" - } - }, - "binary-extensions": { - "version": "1.13.1", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.13.1.tgz", - "integrity": "sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw==", - "dev": true - }, - "binaryextensions": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/binaryextensions/-/binaryextensions-2.1.2.tgz", - "integrity": "sha512-xVNN69YGDghOqCCtA6FI7avYrr02mTJjOgB0/f1VPD3pJC8QEvjTKWc4epDx8AqxxA75NI0QpVM2gPJXUbE4Tg==", - "dev": true - }, - "bindings": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.5.0.tgz", - "integrity": "sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==", - "requires": { - "file-uri-to-path": "1.0.0" - } - }, - "bit-twiddle": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/bit-twiddle/-/bit-twiddle-1.0.2.tgz", - "integrity": "sha512-B9UhK0DKFZhoTFcfvAzhqsjStvGJp9vYWf3+6SNTtdSQnvIgfkHbgHrg/e4+TH71N2GDu8tpmCVoyfrL1d7ntA==" - }, - "bl": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/bl/-/bl-1.2.3.tgz", - "integrity": "sha512-pvcNpa0UU69UT341rO6AYy4FVAIkUHuZXRIWbq+zHnsVcRzDDjIAhGuuYoi0d//cwIwtt4pkpKycWEfjdV+vww==", - "dev": true, - "requires": { - "readable-stream": "^2.3.5", - "safe-buffer": "^5.1.1" - }, - "dependencies": { - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", - "dev": true - }, - "readable-stream": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", - "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", - "dev": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, - "requires": { - "safe-buffer": "~5.1.0" - } - } - } - }, - "bn.js": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", - "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", - "dev": true - }, - "brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "requires": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "braces": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", - "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", - "dev": true, - "requires": { - "arr-flatten": "^1.1.0", - "array-unique": "^0.3.2", - "extend-shallow": "^2.0.1", - "fill-range": "^4.0.0", - "isobject": "^3.0.1", - "repeat-element": "^1.1.2", - "snapdragon": "^0.8.1", - "snapdragon-node": "^2.0.1", - "split-string": "^3.0.2", - "to-regex": "^3.0.1" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - } - } - }, - "brorand": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz", - "integrity": "sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8=", - "dev": true - }, - "browser-pack": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/browser-pack/-/browser-pack-6.1.0.tgz", - "integrity": "sha512-erYug8XoqzU3IfcU8fUgyHqyOXqIE4tUTTQ+7mqUjQlvnXkOO6OlT9c/ZoJVHYoAaqGxr09CN53G7XIsO4KtWA==", - "dev": true, - "requires": { - "combine-source-map": "~0.8.0", - "defined": "^1.0.0", - "JSONStream": "^1.0.3", - "safe-buffer": "^5.1.1", - "through2": "^2.0.0", - "umd": "^3.0.0" - }, - "dependencies": { - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", - "dev": true - }, - "readable-stream": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", - "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", - "dev": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, - "requires": { - "safe-buffer": "~5.1.0" - } - }, - "through2": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", - "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", - "dev": true, - "requires": { - "readable-stream": "~2.3.6", - "xtend": "~4.0.1" - } - } - } - }, - "browser-resolve": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/browser-resolve/-/browser-resolve-2.0.0.tgz", - "integrity": "sha512-7sWsQlYL2rGLy2IWm8WL8DCTJvYLc/qlOnsakDac87SOoCd16WLsaAMdCiAqsTNHIe+SXfaqyxyo6THoWqs8WQ==", - "dev": true, - "requires": { - "resolve": "^1.17.0" - } - }, - "browser-sync": { - "version": "2.27.10", - "resolved": "https://registry.npmjs.org/browser-sync/-/browser-sync-2.27.10.tgz", - "integrity": "sha512-xKm+6KJmJu6RuMWWbFkKwOCSqQOxYe3nOrFkKI5Tr/ZzjPxyU3pFShKK3tWnazBo/3lYQzN7fzjixG8fwJh1Xw==", - "dev": true, - "requires": { - "browser-sync-client": "^2.27.10", - "browser-sync-ui": "^2.27.10", - "bs-recipes": "1.3.4", - "bs-snippet-injector": "^2.0.1", - "chokidar": "^3.5.1", - "connect": "3.6.6", - "connect-history-api-fallback": "^1", - "dev-ip": "^1.0.1", - "easy-extender": "^2.3.4", - "eazy-logger": "3.1.0", - "etag": "^1.8.1", - "fresh": "^0.5.2", - "fs-extra": "3.0.1", - "http-proxy": "^1.18.1", - "immutable": "^3", - "localtunnel": "^2.0.1", - "micromatch": "^4.0.2", - "opn": "5.3.0", - "portscanner": "2.2.0", - "qs": "6.2.3", - "raw-body": "^2.3.2", - "resp-modifier": "6.0.2", - "rx": "4.1.0", - "send": "0.16.2", - "serve-index": "1.9.1", - "serve-static": "1.13.2", - "server-destroy": "1.0.1", - "socket.io": "^4.4.1", - "ua-parser-js": "1.0.2", - "yargs": "^17.3.1" - }, - "dependencies": { - "anymatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz", - "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==", - "dev": true, - "requires": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" - } - }, - "binary-extensions": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", - "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", - "dev": true - }, - "braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "dev": true, - "requires": { - "fill-range": "^7.0.1" - } - }, - "chokidar": { - "version": "3.5.3", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", - "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", - "dev": true, - "requires": { - "anymatch": "~3.1.2", - "braces": "~3.0.2", - "fsevents": "~2.3.2", - "glob-parent": "~5.1.2", - "is-binary-path": "~2.1.0", - "is-glob": "~4.0.1", - "normalize-path": "~3.0.0", - "readdirp": "~3.6.0" - } - }, - "fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", - "dev": true, - "requires": { - "to-regex-range": "^5.0.1" - } - }, - "fsevents": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", - "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", - "dev": true, - "optional": true - }, - "glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, - "requires": { - "is-glob": "^4.0.1" - } - }, - "is-binary-path": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", - "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", - "dev": true, - "requires": { - "binary-extensions": "^2.0.0" - } - }, - "is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "dev": true - }, - "micromatch": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", - "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", - "dev": true, - "requires": { - "braces": "^3.0.2", - "picomatch": "^2.3.1" - } - }, - "qs": { - "version": "6.2.3", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.2.3.tgz", - "integrity": "sha1-HPyyXBCpsrSDBT/zn138kjOQjP4=", - "dev": true - }, - "readdirp": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", - "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", - "dev": true, - "requires": { - "picomatch": "^2.2.1" - } - }, - "to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "dev": true, - "requires": { - "is-number": "^7.0.0" - } - } - } - }, - "browser-sync-client": { - "version": "2.27.10", - "resolved": "https://registry.npmjs.org/browser-sync-client/-/browser-sync-client-2.27.10.tgz", - "integrity": "sha512-KCFKA1YDj6cNul0VsA28apohtBsdk5Wv8T82ClOZPZMZWxPj4Ny5AUbrj9UlAb/k6pdxE5HABrWDhP9+cjt4HQ==", - "dev": true, - "requires": { - "etag": "1.8.1", - "fresh": "0.5.2", - "mitt": "^1.1.3", - "rxjs": "^5.5.6", - "typescript": "^4.6.2" - } - }, - "browser-sync-ui": { - "version": "2.27.10", - "resolved": "https://registry.npmjs.org/browser-sync-ui/-/browser-sync-ui-2.27.10.tgz", - "integrity": "sha512-elbJILq4Uo6OQv6gsvS3Y9vRAJlWu+h8j0JDkF0X/ua+3S6SVbbiWnZc8sNOFlG7yvVGIwBED3eaYQ0iBo1Dtw==", - "dev": true, - "requires": { - "async-each-series": "0.1.1", - "connect-history-api-fallback": "^1", - "immutable": "^3", - "server-destroy": "1.0.1", - "socket.io-client": "^4.4.1", - "stream-throttle": "^0.1.3" - } - }, - "browserify": { - "version": "17.0.0", - "resolved": "https://registry.npmjs.org/browserify/-/browserify-17.0.0.tgz", - "integrity": "sha512-SaHqzhku9v/j6XsQMRxPyBrSP3gnwmE27gLJYZgMT2GeK3J0+0toN+MnuNYDfHwVGQfLiMZ7KSNSIXHemy905w==", - "dev": true, - "requires": { - "assert": "^1.4.0", - "browser-pack": "^6.0.1", - "browser-resolve": "^2.0.0", - "browserify-zlib": "~0.2.0", - "buffer": "~5.2.1", - "cached-path-relative": "^1.0.0", - "concat-stream": "^1.6.0", - "console-browserify": "^1.1.0", - "constants-browserify": "~1.0.0", - "crypto-browserify": "^3.0.0", - "defined": "^1.0.0", - "deps-sort": "^2.0.1", - "domain-browser": "^1.2.0", - "duplexer2": "~0.1.2", - "events": "^3.0.0", - "glob": "^7.1.0", - "has": "^1.0.0", - "htmlescape": "^1.1.0", - "https-browserify": "^1.0.0", - "inherits": "~2.0.1", - "insert-module-globals": "^7.2.1", - "JSONStream": "^1.0.3", - "labeled-stream-splicer": "^2.0.0", - "mkdirp-classic": "^0.5.2", - "module-deps": "^6.2.3", - "os-browserify": "~0.3.0", - "parents": "^1.0.1", - "path-browserify": "^1.0.0", - "process": "~0.11.0", - "punycode": "^1.3.2", - "querystring-es3": "~0.2.0", - "read-only-stream": "^2.0.0", - "readable-stream": "^2.0.2", - "resolve": "^1.1.4", - "shasum-object": "^1.0.0", - "shell-quote": "^1.6.1", - "stream-browserify": "^3.0.0", - "stream-http": "^3.0.0", - "string_decoder": "^1.1.1", - "subarg": "^1.0.0", - "syntax-error": "^1.1.1", - "through2": "^2.0.0", - "timers-browserify": "^1.0.1", - "tty-browserify": "0.0.1", - "url": "~0.11.0", - "util": "~0.12.0", - "vm-browserify": "^1.0.0", - "xtend": "^4.0.0" - }, - "dependencies": { - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", - "dev": true - }, - "punycode": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", - "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=", - "dev": true - }, - "readable-stream": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", - "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", - "dev": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - }, - "dependencies": { - "string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, - "requires": { - "safe-buffer": "~5.1.0" - } - } - } - }, - "string_decoder": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.2.0.tgz", - "integrity": "sha512-6YqyX6ZWEYguAxgZzHGL7SsCeGx3V2TtOTqZz1xSTSWnqsbWwbptafNyvf/ACquZUXV3DANr5BDIwNYe1mN42w==", - "dev": true, - "requires": { - "safe-buffer": "~5.1.0" - } - }, - "through2": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", - "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", - "dev": true, - "requires": { - "readable-stream": "~2.3.6", - "xtend": "~4.0.1" - } - } - } - }, - "browserify-aes": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz", - "integrity": "sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==", - "dev": true, - "requires": { - "buffer-xor": "^1.0.3", - "cipher-base": "^1.0.0", - "create-hash": "^1.1.0", - "evp_bytestokey": "^1.0.3", - "inherits": "^2.0.1", - "safe-buffer": "^5.0.1" - } - }, - "browserify-cipher": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/browserify-cipher/-/browserify-cipher-1.0.1.tgz", - "integrity": "sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w==", - "dev": true, - "requires": { - "browserify-aes": "^1.0.4", - "browserify-des": "^1.0.0", - "evp_bytestokey": "^1.0.0" - } - }, - "browserify-des": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/browserify-des/-/browserify-des-1.0.2.tgz", - "integrity": "sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A==", - "dev": true, - "requires": { - "cipher-base": "^1.0.1", - "des.js": "^1.0.0", - "inherits": "^2.0.1", - "safe-buffer": "^5.1.2" - } - }, - "browserify-rsa": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.0.1.tgz", - "integrity": "sha1-IeCr+vbyApzy+vsTNWenAdQTVSQ=", - "dev": true, - "requires": { - "bn.js": "^4.1.0", - "randombytes": "^2.0.1" - } - }, - "browserify-sign": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.0.4.tgz", - "integrity": "sha1-qk62jl17ZYuqa/alfmMMvXqT0pg=", - "dev": true, - "requires": { - "bn.js": "^4.1.1", - "browserify-rsa": "^4.0.0", - "create-hash": "^1.1.0", - "create-hmac": "^1.1.2", - "elliptic": "^6.0.0", - "inherits": "^2.0.1", - "parse-asn1": "^5.0.0" - } - }, - "browserify-zlib": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/browserify-zlib/-/browserify-zlib-0.2.0.tgz", - "integrity": "sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA==", - "dev": true, - "requires": { - "pako": "~1.0.5" - } - }, - "bs-recipes": { - "version": "1.3.4", - "resolved": "https://registry.npmjs.org/bs-recipes/-/bs-recipes-1.3.4.tgz", - "integrity": "sha1-DS1NSKcYyMBEdp/cT4lZLci2lYU=", - "dev": true - }, - "bs-snippet-injector": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/bs-snippet-injector/-/bs-snippet-injector-2.0.1.tgz", - "integrity": "sha1-YbU5PxH1JVntEgaTEANDtu2wTdU=", - "dev": true - }, - "buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.2.1.tgz", - "integrity": "sha512-c+Ko0loDaFfuPWiL02ls9Xd3GO3cPVmUobQ6t3rXNUk304u6hGq+8N/kFi+QEIKhzK3uwolVhLzszmfLmMLnqg==", - "dev": true, - "requires": { - "base64-js": "^1.0.2", - "ieee754": "^1.1.4" - } - }, - "buffer-equal": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/buffer-equal/-/buffer-equal-1.0.0.tgz", - "integrity": "sha1-WWFrSYME1Var1GaWayLu2j7KX74=", - "dev": true - }, - "buffer-from": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", - "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==", - "dev": true - }, - "buffer-xor": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz", - "integrity": "sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk=", - "dev": true - }, - "builtin-status-codes": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz", - "integrity": "sha512-HpGFw18DgFWlncDfjTa2rcQ4W88O1mC8e8yZ2AvQY5KDaktSTwo+KRf6nHK6FRI5FyRyb/5T6+TSxfP7QyGsmQ==", - "dev": true - }, - "bytes": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz", - "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==", - "dev": true - }, - "c8": { - "version": "7.12.0", - "resolved": "https://registry.npmjs.org/c8/-/c8-7.12.0.tgz", - "integrity": "sha512-CtgQrHOkyxr5koX1wEUmN/5cfDa2ckbHRA4Gy5LAL0zaCFtVWJS5++n+w4/sr2GWGerBxgTjpKeDclk/Qk6W/A==", - "dev": true, - "requires": { - "@bcoe/v8-coverage": "^0.2.3", - "@istanbuljs/schema": "^0.1.3", - "find-up": "^5.0.0", - "foreground-child": "^2.0.0", - "istanbul-lib-coverage": "^3.2.0", - "istanbul-lib-report": "^3.0.0", - "istanbul-reports": "^3.1.4", - "rimraf": "^3.0.2", - "test-exclude": "^6.0.0", - "v8-to-istanbul": "^9.0.0", - "yargs": "^16.2.0", - "yargs-parser": "^20.2.9" - }, - "dependencies": { - "ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true - }, - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "cliui": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", - "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", - "dev": true, - "requires": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", - "wrap-ansi": "^7.0.0" - } - }, - "find-up": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", - "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", - "dev": true, - "requires": { - "locate-path": "^6.0.0", - "path-exists": "^4.0.0" - } - }, - "get-caller-file": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", - "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", - "dev": true - }, - "is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true - }, - "path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "dev": true - }, - "string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, - "requires": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - } - }, - "strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, - "requires": { - "ansi-regex": "^5.0.1" - } - }, - "wrap-ansi": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "dev": true, - "requires": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - } - }, - "y18n": { - "version": "5.0.8", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", - "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", - "dev": true - }, - "yargs": { - "version": "16.2.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", - "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", - "dev": true, - "requires": { - "cliui": "^7.0.2", - "escalade": "^3.1.1", - "get-caller-file": "^2.0.5", - "require-directory": "^2.1.1", - "string-width": "^4.2.0", - "y18n": "^5.0.5", - "yargs-parser": "^20.2.2" - } - } - } - }, - "cacache": { - "version": "16.1.1", - "resolved": "https://registry.npmjs.org/cacache/-/cacache-16.1.1.tgz", - "integrity": "sha512-VDKN+LHyCQXaaYZ7rA/qtkURU+/yYhviUdvqEv2LT6QPZU8jpyzEkEVAcKlKLt5dJ5BRp11ym8lo3NKLluEPLg==", - "requires": { - "@npmcli/fs": "^2.1.0", - "@npmcli/move-file": "^2.0.0", - "chownr": "^2.0.0", - "fs-minipass": "^2.1.0", - "glob": "^8.0.1", - "infer-owner": "^1.0.4", - "lru-cache": "^7.7.1", - "minipass": "^3.1.6", - "minipass-collect": "^1.0.2", - "minipass-flush": "^1.0.5", - "minipass-pipeline": "^1.2.4", - "mkdirp": "^1.0.4", - "p-map": "^4.0.0", - "promise-inflight": "^1.0.1", - "rimraf": "^3.0.2", - "ssri": "^9.0.0", - "tar": "^6.1.11", - "unique-filename": "^1.1.1" - }, - "dependencies": { - "brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "requires": { - "balanced-match": "^1.0.0" - } - }, - "glob": { - "version": "8.0.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-8.0.3.tgz", - "integrity": "sha512-ull455NHSHI/Y1FqGaaYFaLGkNMMJbavMrEGFXG/PGrg6y7sutWHUHrz6gy6WEBH6akM1M414dWKCNs+IhKdiQ==", - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^5.0.1", - "once": "^1.3.0" - } - }, - "lru-cache": { - "version": "7.12.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.12.0.tgz", - "integrity": "sha512-OIP3DwzRZDfLg9B9VP/huWBlpvbkmbfiBy8xmsXp4RPmE4A3MhwNozc5ZJ3fWnSg8fDcdlE/neRTPG2ycEKliw==" - }, - "minimatch": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.0.tgz", - "integrity": "sha512-9TPBGGak4nHfGZsPBohm9AWg6NoT7QTCehS3BIJABslyZbzxfV78QM2Y6+i741OPZIafFAaiiEMh5OyIrJPgtg==", - "requires": { - "brace-expansion": "^2.0.1" - } - }, - "mkdirp": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", - "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==" - } - } - }, - "cache-base": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz", - "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==", - "dev": true, - "requires": { - "collection-visit": "^1.0.0", - "component-emitter": "^1.2.1", - "get-value": "^2.0.6", - "has-value": "^1.0.0", - "isobject": "^3.0.1", - "set-value": "^2.0.0", - "to-object-path": "^0.3.0", - "union-value": "^1.0.0", - "unset-value": "^1.0.0" - } - }, - "cached-path-relative": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/cached-path-relative/-/cached-path-relative-1.1.0.tgz", - "integrity": "sha512-WF0LihfemtesFcJgO7xfOoOcnWzY/QHR4qeDqV44jPU3HTI54+LnfXK3SA27AVVGCdZFgjjFFaqUA9Jx7dMJZA==", - "dev": true - }, - "call-bind": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", - "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", - "dev": true, - "requires": { - "function-bind": "^1.1.1", - "get-intrinsic": "^1.0.2" - } - }, - "camelcase": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-3.0.0.tgz", - "integrity": "sha1-MvxLn82vhF/N9+c7uXysImHwqwo=", - "dev": true - }, - "caseless": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", - "integrity": "sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==", - "peer": true - }, - "chalk": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", - "dev": true, - "requires": { - "ansi-styles": "^2.2.1", - "escape-string-regexp": "^1.0.2", - "has-ansi": "^2.0.0", - "strip-ansi": "^3.0.0", - "supports-color": "^2.0.0" - } - }, - "chokidar": { - "version": "2.1.8", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.1.8.tgz", - "integrity": "sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg==", - "dev": true, - "requires": { - "anymatch": "^2.0.0", - "async-each": "^1.0.1", - "braces": "^2.3.2", - "fsevents": "^1.2.7", - "glob-parent": "^3.1.0", - "inherits": "^2.0.3", - "is-binary-path": "^1.0.0", - "is-glob": "^4.0.0", - "normalize-path": "^3.0.0", - "path-is-absolute": "^1.0.0", - "readdirp": "^2.2.1", - "upath": "^1.1.1" - } - }, - "chownr": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", - "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==" - }, - "cipher-base": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz", - "integrity": "sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==", - "dev": true, - "requires": { - "inherits": "^2.0.1", - "safe-buffer": "^5.0.1" - } - }, - "class-utils": { - "version": "0.3.6", - "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz", - "integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==", - "dev": true, - "requires": { - "arr-union": "^3.1.0", - "define-property": "^0.2.5", - "isobject": "^3.0.0", - "static-extend": "^0.1.1" - }, - "dependencies": { - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, - "requires": { - "is-descriptor": "^0.1.0" - } - } - } - }, - "clean-stack": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", - "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==" - }, - "cliui": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz", - "integrity": "sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0=", - "dev": true, - "requires": { - "string-width": "^1.0.1", - "strip-ansi": "^3.0.1", - "wrap-ansi": "^2.0.0" - } - }, - "clone": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz", - "integrity": "sha1-G39Ln1kfHo+DZwQBYANFoCiHQ18=", - "dev": true - }, - "clone-buffer": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/clone-buffer/-/clone-buffer-1.0.0.tgz", - "integrity": "sha1-4+JbIHrE5wGvch4staFnksrD3Fg=", - "dev": true - }, - "clone-stats": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/clone-stats/-/clone-stats-1.0.0.tgz", - "integrity": "sha1-s3gt/4u1R04Yuba/D9/ngvh3doA=", - "dev": true - }, - "cloneable-readable": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/cloneable-readable/-/cloneable-readable-1.1.3.tgz", - "integrity": "sha512-2EF8zTQOxYq70Y4XKtorQupqF0m49MBz2/yf5Bj+MHjvpG3Hy7sImifnqD6UA+TKYxeSV+u6qqQPawN5UvnpKQ==", - "dev": true, - "requires": { - "inherits": "^2.0.1", - "process-nextick-args": "^2.0.0", - "readable-stream": "^2.3.5" - }, - "dependencies": { - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", - "dev": true - }, - "readable-stream": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", - "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", - "dev": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, - "requires": { - "safe-buffer": "~5.1.0" - } - } - } - }, - "code-point-at": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", - "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=" - }, - "collection-map": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/collection-map/-/collection-map-1.0.0.tgz", - "integrity": "sha1-rqDwb40mx4DCt1SUOFVEsiVa8Yw=", - "dev": true, - "requires": { - "arr-map": "^2.0.2", - "for-own": "^1.0.0", - "make-iterator": "^1.0.0" - } - }, - "collection-visit": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz", - "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=", - "dev": true, - "requires": { - "map-visit": "^1.0.0", - "object-visit": "^1.0.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "color-support": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz", - "integrity": "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==" - }, - "combine-source-map": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/combine-source-map/-/combine-source-map-0.8.0.tgz", - "integrity": "sha1-pY0N8ELBhvz4IqjoAV9UUNLXmos=", - "dev": true, - "requires": { - "convert-source-map": "~1.1.0", - "inline-source-map": "~0.6.0", - "lodash.memoize": "~3.0.3", - "source-map": "~0.5.3" - } - }, - "combined-stream": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", - "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", - "peer": true, - "requires": { - "delayed-stream": "~1.0.0" - } - }, - "commander": { - "version": "2.20.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.0.tgz", - "integrity": "sha512-7j2y+40w61zy6YC2iRNpUe/NwhNyoXrYpHMrSunaMG64nRnaf96zO/KMQR4OyN/UnE5KLyEBnKHd4aG3rskjpQ==", - "dev": true - }, - "component-emitter": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.2.1.tgz", - "integrity": "sha1-E3kY1teCg/ffemt8WmPhQOaUJeY=", - "dev": true - }, - "concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" - }, - "concat-stream": { - "version": "1.6.2", - "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", - "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", - "dev": true, - "requires": { - "buffer-from": "^1.0.0", - "inherits": "^2.0.3", - "readable-stream": "^2.2.2", - "typedarray": "^0.0.6" - }, - "dependencies": { - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", - "dev": true - }, - "readable-stream": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", - "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", - "dev": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, - "requires": { - "safe-buffer": "~5.1.0" - } - } - } - }, - "concat-with-sourcemaps": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/concat-with-sourcemaps/-/concat-with-sourcemaps-1.1.0.tgz", - "integrity": "sha512-4gEjHJFT9e+2W/77h/DS5SGUgwDaOwprX8L/gl5+3ixnzkVJJsZWDSelmN3Oilw3LNDZjZV0yqH1hLG3k6nghg==", - "dev": true, - "requires": { - "source-map": "^0.6.1" - }, - "dependencies": { - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - } - } - }, - "config-chain": { - "version": "1.1.12", - "resolved": "https://registry.npmjs.org/config-chain/-/config-chain-1.1.12.tgz", - "integrity": "sha512-a1eOIcu8+7lUInge4Rpf/n4Krkf3Dd9lqhljRzII1/Zno/kRtUWnznPO3jOKBmTEktkt3fkxisUcivoj0ebzoA==", - "dev": true, - "requires": { - "ini": "^1.3.4", - "proto-list": "~1.2.1" - } - }, - "connect": { - "version": "3.6.6", - "resolved": "https://registry.npmjs.org/connect/-/connect-3.6.6.tgz", - "integrity": "sha1-Ce/2xVr3I24TcTWnJXSFi2eG9SQ=", - "dev": true, - "requires": { - "debug": "2.6.9", - "finalhandler": "1.1.0", - "parseurl": "~1.3.2", - "utils-merge": "1.0.1" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - } - } - }, - "connect-history-api-fallback": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-1.6.0.tgz", - "integrity": "sha512-e54B99q/OUoH64zYYRf3HBP5z24G38h5D3qXu23JGRoigpX5Ss4r9ZnDk3g0Z8uQC2x2lPaJ+UlWBc1ZWBWdLg==", - "dev": true - }, - "console-browserify": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.1.0.tgz", - "integrity": "sha1-8CQcRXMKn8YyOyBtvzjtx0HQuxA=", - "dev": true, - "requires": { - "date-now": "^0.1.4" - } - }, - "console-control-strings": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", - "integrity": "sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==" - }, - "constants-browserify": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/constants-browserify/-/constants-browserify-1.0.0.tgz", - "integrity": "sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U=", - "dev": true - }, - "convert-source-map": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.1.3.tgz", - "integrity": "sha1-SCnId+n+SbMWHzvzZziI4gRpmGA=", - "dev": true - }, - "cookie": { - "version": "0.4.2", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.2.tgz", - "integrity": "sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA==", - "dev": true - }, - "copy-descriptor": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz", - "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=", - "dev": true - }, - "copy-props": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/copy-props/-/copy-props-2.0.5.tgz", - "integrity": "sha512-XBlx8HSqrT0ObQwmSzM7WE5k8FxTV75h1DX1Z3n6NhQ/UYYAvInWYmG06vFt7hQZArE2fuO62aihiWIVQwh1sw==", - "dev": true, - "requires": { - "each-props": "^1.3.2", - "is-plain-object": "^5.0.0" - }, - "dependencies": { - "is-plain-object": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-5.0.0.tgz", - "integrity": "sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==", - "dev": true - } - } - }, - "core-util-is": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" - }, - "cors": { - "version": "2.8.5", - "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz", - "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==", - "dev": true, - "requires": { - "object-assign": "^4", - "vary": "^1" - } - }, - "create-ecdh": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.3.tgz", - "integrity": "sha512-GbEHQPMOswGpKXM9kCWVrremUcBmjteUaQ01T9rkKCPDXfUHX0IoP9LpHYo2NPFampa4e+/pFDc3jQdxrxQLaw==", - "dev": true, - "requires": { - "bn.js": "^4.1.0", - "elliptic": "^6.0.0" - } - }, - "create-hash": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz", - "integrity": "sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==", - "dev": true, - "requires": { - "cipher-base": "^1.0.1", - "inherits": "^2.0.1", - "md5.js": "^1.3.4", - "ripemd160": "^2.0.1", - "sha.js": "^2.4.0" - } - }, - "create-hmac": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz", - "integrity": "sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==", - "dev": true, - "requires": { - "cipher-base": "^1.0.3", - "create-hash": "^1.1.0", - "inherits": "^2.0.1", - "ripemd160": "^2.0.0", - "safe-buffer": "^5.0.1", - "sha.js": "^2.4.8" - } - }, - "cross-spawn": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.1.tgz", - "integrity": "sha512-u7v4o84SwFpD32Z8IIcPZ6z1/ie24O6RU3RbtL5Y316l3KuHVPx9ItBgWQ6VlfAFnRnTtMUrsQ9MUUTuEZjogg==", - "dev": true, - "requires": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - }, - "dependencies": { - "which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "dev": true, - "requires": { - "isexe": "^2.0.0" - } - } - } - }, - "crypto-browserify": { - "version": "3.12.0", - "resolved": "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.12.0.tgz", - "integrity": "sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg==", - "dev": true, - "requires": { - "browserify-cipher": "^1.0.0", - "browserify-sign": "^4.0.0", - "create-ecdh": "^4.0.0", - "create-hash": "^1.1.0", - "create-hmac": "^1.1.0", - "diffie-hellman": "^5.0.0", - "inherits": "^2.0.1", - "pbkdf2": "^3.0.3", - "public-encrypt": "^4.0.0", - "randombytes": "^2.0.0", - "randomfill": "^1.0.3" - } - }, - "d": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/d/-/d-1.0.1.tgz", - "integrity": "sha512-m62ShEObQ39CfralilEQRjH6oAMtNCV1xJyEx5LpRYUVN+EviphDgUc/F3hnYbADmkiNs67Y+3ylmlG7Lnu+FA==", - "dev": true, - "requires": { - "es5-ext": "^0.10.50", - "type": "^1.0.1" - } - }, - "dash-ast": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/dash-ast/-/dash-ast-1.0.0.tgz", - "integrity": "sha512-Vy4dx7gquTeMcQR/hDkYLGUnwVil6vk4FOOct+djUnHOUWt+zJPJAaRIXaAFkPXtJjvlY7o3rfRu0/3hpnwoUA==", - "dev": true - }, - "dashdash": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", - "integrity": "sha512-jRFi8UDGo6j+odZiEpjazZaWqEal3w/basFjQHQEwVtZJGDpxbH1MeYluwCS8Xq5wmLJooDlMgvVarmWfGM44g==", - "peer": true, - "requires": { - "assert-plus": "^1.0.0" - } - }, - "date-now": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/date-now/-/date-now-0.1.4.tgz", - "integrity": "sha1-6vQ5/U1ISK105cx9vvIAZyueNFs=", - "dev": true - }, - "debug": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz", - "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==", - "dev": true, - "requires": { - "ms": "2.1.2" - }, - "dependencies": { - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - } - } - }, - "decamelize": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", - "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", - "dev": true - }, - "decode-uri-component": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz", - "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=", - "dev": true - }, - "decomment": { - "version": "0.9.2", - "resolved": "https://registry.npmjs.org/decomment/-/decomment-0.9.2.tgz", - "integrity": "sha512-sblyUmOJZxiL7oJ2ogJS6jtl/67+CTOW87SrYE/96u3PhDYikYoLCdLzcnceToiQejOLlqNnLCkaxx/+nE/ehg==", - "dev": true, - "requires": { - "esprima": "4.0.1" - } - }, - "decompress-response": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz", - "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==", - "requires": { - "mimic-response": "^3.1.0" - } - }, - "deep-extend": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", - "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==" - }, - "default-compare": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/default-compare/-/default-compare-1.0.0.tgz", - "integrity": "sha512-QWfXlM0EkAbqOCbD/6HjdwT19j7WCkMyiRhWilc4H9/5h/RzTF9gv5LYh1+CmDV5d1rki6KAWLtQale0xt20eQ==", - "dev": true, - "requires": { - "kind-of": "^5.0.2" - }, - "dependencies": { - "kind-of": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", - "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", - "dev": true - } - } - }, - "default-resolution": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/default-resolution/-/default-resolution-2.0.0.tgz", - "integrity": "sha1-vLgrqnKtebQmp2cy8aga1t8m1oQ=", - "dev": true - }, - "define-properties": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", - "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", - "dev": true, - "requires": { - "object-keys": "^1.0.12" - } - }, - "define-property": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", - "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", - "dev": true, - "requires": { - "is-descriptor": "^1.0.2", - "isobject": "^3.0.1" - }, - "dependencies": { - "is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "dev": true, - "requires": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" - } - } - } - }, - "defined": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/defined/-/defined-1.0.0.tgz", - "integrity": "sha1-yY2bzvdWdBiOEQlpFRGZ45sfppM=", - "dev": true - }, - "delayed-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", - "peer": true - }, - "delegates": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", - "integrity": "sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==" - }, - "depd": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", - "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=" - }, - "deps-sort": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/deps-sort/-/deps-sort-2.0.1.tgz", - "integrity": "sha512-1orqXQr5po+3KI6kQb9A4jnXT1PBwggGl2d7Sq2xsnOeI9GPcE/tGcF9UiSZtZBM7MukY4cAh7MemS6tZYipfw==", - "dev": true, - "requires": { - "JSONStream": "^1.0.3", - "shasum-object": "^1.0.0", - "subarg": "^1.0.0", - "through2": "^2.0.0" - }, - "dependencies": { - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", - "dev": true - }, - "readable-stream": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", - "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", - "dev": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, - "requires": { - "safe-buffer": "~5.1.0" - } - }, - "through2": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", - "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", - "dev": true, - "requires": { - "readable-stream": "~2.3.6", - "xtend": "~4.0.1" - } - } - } - }, - "des.js": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/des.js/-/des.js-1.0.0.tgz", - "integrity": "sha1-wHTS4qpqipoH29YfmhXCzYPsjsw=", - "dev": true, - "requires": { - "inherits": "^2.0.1", - "minimalistic-assert": "^1.0.0" - } - }, - "destroy": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", - "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=", - "dev": true - }, - "detect-file": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/detect-file/-/detect-file-1.0.0.tgz", - "integrity": "sha1-8NZtA2cqglyxtzvbP+YjEMjlUrc=", - "dev": true - }, - "detect-libc": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.1.tgz", - "integrity": "sha512-463v3ZeIrcWtdgIg6vI6XUncguvr2TnGl4SzDXinkt9mSLpBJKXT3mW6xT3VQdDN11+WVs29pgvivTc4Lp8v+w==" - }, - "detective": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/detective/-/detective-5.2.1.tgz", - "integrity": "sha512-v9XE1zRnz1wRtgurGu0Bs8uHKFSTdteYZNbIPFVhUZ39L/S79ppMpdmVOZAnoz1jfEFodc48n6MX483Xo3t1yw==", - "dev": true, - "requires": { - "acorn-node": "^1.8.2", - "defined": "^1.0.0", - "minimist": "^1.2.6" - } - }, - "dev-ip": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/dev-ip/-/dev-ip-1.0.1.tgz", - "integrity": "sha1-p2o+0YVb56ASu4rBbLgPPADcKPA=", - "dev": true - }, - "diff": { - "version": "3.5.0", - "resolved": "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz", - "integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==", - "dev": true - }, - "diffie-hellman": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz", - "integrity": "sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==", - "dev": true, - "requires": { - "bn.js": "^4.1.0", - "miller-rabin": "^4.0.0", - "randombytes": "^2.0.0" - } - }, - "dir-glob": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", - "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", - "dev": true, - "requires": { - "path-type": "^4.0.0" - }, - "dependencies": { - "path-type": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", - "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", - "dev": true - } - } - }, - "dlv": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/dlv/-/dlv-1.1.3.tgz", - "integrity": "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==", - "dev": true - }, - "domain-browser": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/domain-browser/-/domain-browser-1.2.0.tgz", - "integrity": "sha512-jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA==", - "dev": true - }, - "duplexer2": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/duplexer2/-/duplexer2-0.1.4.tgz", - "integrity": "sha512-asLFVfWWtJ90ZyOUHMqk7/S2w2guQKxUI2itj3d92ADHhxUSbCMGi1f1cBcJ7xM1To+pE/Khbwo1yuNbMEPKeA==", - "dev": true, - "requires": { - "readable-stream": "^2.0.2" - }, - "dependencies": { - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", - "dev": true - }, - "readable-stream": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", - "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", - "dev": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, - "requires": { - "safe-buffer": "~5.1.0" - } - } - } - }, - "duplexify": { - "version": "3.7.1", - "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.7.1.tgz", - "integrity": "sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g==", - "dev": true, - "requires": { - "end-of-stream": "^1.0.0", - "inherits": "^2.0.1", - "readable-stream": "^2.0.0", - "stream-shift": "^1.0.0" - }, - "dependencies": { - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", - "dev": true - }, - "readable-stream": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", - "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", - "dev": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, - "requires": { - "safe-buffer": "~5.1.0" - } - } - } - }, - "each-props": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/each-props/-/each-props-1.3.2.tgz", - "integrity": "sha512-vV0Hem3zAGkJAyU7JSjixeU66rwdynTAa1vofCrSA5fEln+m67Az9CcnkVD776/fsN/UjIWmBDoNRS6t6G9RfA==", - "dev": true, - "requires": { - "is-plain-object": "^2.0.1", - "object.defaults": "^1.1.0" - } - }, - "easy-extender": { - "version": "2.3.4", - "resolved": "https://registry.npmjs.org/easy-extender/-/easy-extender-2.3.4.tgz", - "integrity": "sha512-8cAwm6md1YTiPpOvDULYJL4ZS6WfM5/cTeVVh4JsvyYZAoqlRVUpHL9Gr5Fy7HA6xcSZicUia3DeAgO3Us8E+Q==", - "dev": true, - "requires": { - "lodash": "^4.17.10" - } - }, - "eazy-logger": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/eazy-logger/-/eazy-logger-3.1.0.tgz", - "integrity": "sha512-/snsn2JqBtUSSstEl4R0RKjkisGHAhvYj89i7r3ytNUKW12y178KDZwXLXIgwDqLW6E/VRMT9qfld7wvFae8bQ==", - "dev": true, - "requires": { - "tfunk": "^4.0.0" - } - }, - "ecc-jsbn": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", - "integrity": "sha512-eh9O+hwRHNbG4BLTjEl3nw044CkGm5X6LoaCf7LPp7UU8Qrt47JYNi6nPX8xjW97TKGKm1ouctg0QSpZe9qrnw==", - "peer": true, - "requires": { - "jsbn": "~0.1.0", - "safer-buffer": "^2.1.0" - } - }, - "editions": { - "version": "1.3.4", - "resolved": "https://registry.npmjs.org/editions/-/editions-1.3.4.tgz", - "integrity": "sha512-gzao+mxnYDzIysXKMQi/+M1mjy/rjestjg6OPoYTtI+3Izp23oiGZitsl9lPDPiTGXbcSIk1iJWhliSaglxnUg==", - "dev": true - }, - "editorconfig": { - "version": "0.15.3", - "resolved": "https://registry.npmjs.org/editorconfig/-/editorconfig-0.15.3.tgz", - "integrity": "sha512-M9wIMFx96vq0R4F+gRpY3o2exzb8hEj/n9S8unZtHSvYjibBp/iMufSzvmOcV/laG0ZtuTVGtiJggPOSW2r93g==", - "dev": true, - "requires": { - "commander": "^2.19.0", - "lru-cache": "^4.1.5", - "semver": "^5.6.0", - "sigmund": "^1.0.1" - }, - "dependencies": { - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true - } - } - }, - "ee-first": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", - "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=", - "dev": true - }, - "elliptic": { - "version": "6.5.4", - "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.4.tgz", - "integrity": "sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ==", - "dev": true, - "requires": { - "bn.js": "^4.11.9", - "brorand": "^1.1.0", - "hash.js": "^1.0.0", - "hmac-drbg": "^1.0.1", - "inherits": "^2.0.4", - "minimalistic-assert": "^1.0.1", - "minimalistic-crypto-utils": "^1.0.1" - } - }, - "emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" - }, - "encodeurl": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", - "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=", - "dev": true - }, - "encoding": { - "version": "0.1.13", - "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.13.tgz", - "integrity": "sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==", - "optional": true, - "requires": { - "iconv-lite": "^0.6.2" - }, - "dependencies": { - "iconv-lite": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", - "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", - "optional": true, - "requires": { - "safer-buffer": ">= 2.1.2 < 3.0.0" - } - } - } - }, - "end-of-stream": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.1.tgz", - "integrity": "sha512-1MkrZNvWTKCaigbn+W15elq2BB/L22nqrSY5DKlo3X6+vclJm8Bb5djXJBmEX6fS3+zCh/F4VBK5Z2KxJt4s2Q==", - "requires": { - "once": "^1.4.0" - } - }, - "engine.io": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-6.2.0.tgz", - "integrity": "sha512-4KzwW3F3bk+KlzSOY57fj/Jx6LyRQ1nbcyIadehl+AnXjKT7gDO0ORdRi/84ixvMKTym6ZKuxvbzN62HDDU1Lg==", - "dev": true, - "requires": { - "@types/cookie": "^0.4.1", - "@types/cors": "^2.8.12", - "@types/node": ">=10.0.0", - "accepts": "~1.3.4", - "base64id": "2.0.0", - "cookie": "~0.4.1", - "cors": "~2.8.5", - "debug": "~4.3.1", - "engine.io-parser": "~5.0.3", - "ws": "~8.2.3" - } - }, - "engine.io-client": { - "version": "6.2.3", - "resolved": "https://registry.npmjs.org/engine.io-client/-/engine.io-client-6.2.3.tgz", - "integrity": "sha512-aXPtgF1JS3RuuKcpSrBtimSjYvrbhKW9froICH4s0F3XQWLxsKNxqzG39nnvQZQnva4CMvUK63T7shevxRyYHw==", - "dev": true, - "requires": { - "@socket.io/component-emitter": "~3.1.0", - "debug": "~4.3.1", - "engine.io-parser": "~5.0.3", - "ws": "~8.2.3", - "xmlhttprequest-ssl": "~2.0.0" - } - }, - "engine.io-parser": { - "version": "5.0.4", - "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-5.0.4.tgz", - "integrity": "sha512-+nVFp+5z1E3HcToEnO7ZIj3g+3k9389DvWtvJZz0T6/eOCPIyyxehFcedoYrZQrp0LgQbD9pPXhpMBKMd5QURg==", - "dev": true - }, - "env-paths": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz", - "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==" - }, - "err-code": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/err-code/-/err-code-2.0.3.tgz", - "integrity": "sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA==" - }, - "error-ex": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", - "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", - "dev": true, - "requires": { - "is-arrayish": "^0.2.1" - } - }, - "es5-ext": { - "version": "0.10.50", - "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.50.tgz", - "integrity": "sha512-KMzZTPBkeQV/JcSQhI5/z6d9VWJ3EnQ194USTUwIYZ2ZbpN8+SGXQKt1h68EX44+qt+Fzr8DO17vnxrw7c3agw==", - "dev": true, - "requires": { - "es6-iterator": "~2.0.3", - "es6-symbol": "~3.1.1", - "next-tick": "^1.0.0" - } - }, - "es6-iterator": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.3.tgz", - "integrity": "sha1-p96IkUGgWpSwhUQDstCg+/qY87c=", - "dev": true, - "requires": { - "d": "1", - "es5-ext": "^0.10.35", - "es6-symbol": "^3.1.1" - } - }, - "es6-symbol": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.1.tgz", - "integrity": "sha1-vwDvT9q2uhtG7Le2KbTH7VcVzHc=", - "dev": true, - "requires": { - "d": "1", - "es5-ext": "~0.10.14" - } - }, - "es6-weak-map": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/es6-weak-map/-/es6-weak-map-2.0.3.tgz", - "integrity": "sha512-p5um32HOTO1kP+w7PRnB+5lQ43Z6muuMuIMffvDN8ZB4GcnjLBV6zGStpbASIMk4DCAvEaamhe2zhyCb/QXXsA==", - "dev": true, - "requires": { - "d": "1", - "es5-ext": "^0.10.46", - "es6-iterator": "^2.0.3", - "es6-symbol": "^3.1.1" - } - }, - "escalade": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", - "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", - "dev": true - }, - "escape-html": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", - "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=", - "dev": true - }, - "escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", - "dev": true - }, - "esprima": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", - "dev": true - }, - "etag": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", - "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=", - "dev": true - }, - "eventemitter3": { - "version": "4.0.7", - "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", - "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==", - "dev": true - }, - "events": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", - "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", - "dev": true - }, - "evp_bytestokey": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz", - "integrity": "sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==", - "dev": true, - "requires": { - "md5.js": "^1.3.4", - "safe-buffer": "^5.1.1" - } - }, - "expand-brackets": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", - "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", - "dev": true, - "requires": { - "debug": "^2.3.3", - "define-property": "^0.2.5", - "extend-shallow": "^2.0.1", - "posix-character-classes": "^0.1.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, - "requires": { - "is-descriptor": "^0.1.0" - } - }, - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - } - } - }, - "expand-template": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/expand-template/-/expand-template-2.0.3.tgz", - "integrity": "sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==" - }, - "expand-tilde": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/expand-tilde/-/expand-tilde-2.0.2.tgz", - "integrity": "sha1-l+gBqgUt8CRU3kawK/YhZCzchQI=", - "dev": true, - "requires": { - "homedir-polyfill": "^1.0.1" - } - }, - "extend": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", - "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==" - }, - "extend-shallow": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", - "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", - "dev": true, - "requires": { - "assign-symbols": "^1.0.0", - "is-extendable": "^1.0.1" - }, - "dependencies": { - "is-extendable": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", - "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", - "dev": true, - "requires": { - "is-plain-object": "^2.0.4" - } - } - } - }, - "extglob": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", - "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", - "dev": true, - "requires": { - "array-unique": "^0.3.2", - "define-property": "^1.0.0", - "expand-brackets": "^2.1.4", - "extend-shallow": "^2.0.1", - "fragment-cache": "^0.2.1", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" - }, - "dependencies": { - "define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", - "dev": true, - "requires": { - "is-descriptor": "^1.0.0" - } - }, - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - }, - "is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "dev": true, - "requires": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" - } - } - } - }, - "extsprintf": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", - "integrity": "sha512-11Ndz7Nv+mvAC1j0ktTa7fAb0vLyGGX+rMHNBYQviQDGU0Hw7lhctJANqbPhu9nV9/izT/IntTgZ7Im/9LJs9g==", - "peer": true - }, - "fancy-log": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/fancy-log/-/fancy-log-1.3.3.tgz", - "integrity": "sha512-k9oEhlyc0FrVh25qYuSELjr8oxsCoc4/LEZfg2iJJrfEk/tZL9bCoJE47gqAvI2m/AUjluCS4+3I0eTx8n3AEw==", - "dev": true, - "requires": { - "ansi-gray": "^0.1.1", - "color-support": "^1.1.3", - "parse-node-version": "^1.0.0", - "time-stamp": "^1.0.0" - } - }, - "fast-deep-equal": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", - "peer": true - }, - "fast-glob": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.0.4.tgz", - "integrity": "sha512-wkIbV6qg37xTJwqSsdnIphL1e+LaGz4AIQqr00mIubMaEhv1/HEmJ0uuCGZRNRUkZZmOB5mJKO0ZUTVq+SxMQg==", - "dev": true, - "requires": { - "@nodelib/fs.stat": "^2.0.1", - "@nodelib/fs.walk": "^1.2.1", - "glob-parent": "^5.0.0", - "is-glob": "^4.0.1", - "merge2": "^1.2.3", - "micromatch": "^4.0.2" - }, - "dependencies": { - "braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "dev": true, - "requires": { - "fill-range": "^7.0.1" - } - }, - "fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", - "dev": true, - "requires": { - "to-regex-range": "^5.0.1" - } - }, - "glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, - "requires": { - "is-glob": "^4.0.1" - } - }, - "is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "dev": true - }, - "micromatch": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.2.tgz", - "integrity": "sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q==", - "dev": true, - "requires": { - "braces": "^3.0.1", - "picomatch": "^2.0.5" - } - }, - "to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "dev": true, - "requires": { - "is-number": "^7.0.0" - } - } - } - }, - "fast-json-stable-stringify": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", - "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", - "peer": true - }, - "fast-safe-stringify": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/fast-safe-stringify/-/fast-safe-stringify-2.1.1.tgz", - "integrity": "sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA==", - "dev": true - }, - "fastq": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.6.0.tgz", - "integrity": "sha512-jmxqQ3Z/nXoeyDmWAzF9kH1aGZSis6e/SbfPmJpUnyZ0ogr6iscHQaml4wsEepEWSdtmpy+eVXmCRIMpxaXqOA==", - "dev": true, - "requires": { - "reusify": "^1.0.0" - } - }, - "file-uri-to-path": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz", - "integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==" - }, - "fill-range": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", - "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", - "dev": true, - "requires": { - "extend-shallow": "^2.0.1", - "is-number": "^3.0.0", - "repeat-string": "^1.6.1", - "to-regex-range": "^2.1.0" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - } - } - }, - "finalhandler": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.0.tgz", - "integrity": "sha1-zgtoVbRYU+eRsvzGgARtiCU91/U=", - "dev": true, - "requires": { - "debug": "2.6.9", - "encodeurl": "~1.0.1", - "escape-html": "~1.0.3", - "on-finished": "~2.3.0", - "parseurl": "~1.3.2", - "statuses": "~1.3.1", - "unpipe": "~1.0.0" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - } - } - }, - "find-up": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", - "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=", - "dev": true, - "requires": { - "path-exists": "^2.0.0", - "pinkie-promise": "^2.0.0" - } - }, - "findup-sync": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-3.0.0.tgz", - "integrity": "sha512-YbffarhcicEhOrm4CtrwdKBdCuz576RLdhJDsIfvNtxUuhdRet1qZcsMjqbePtAseKdAnDyM/IyXbu7PRPRLYg==", - "dev": true, - "requires": { - "detect-file": "^1.0.0", - "is-glob": "^4.0.0", - "micromatch": "^3.0.4", - "resolve-dir": "^1.0.1" - } - }, - "fined": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/fined/-/fined-1.2.0.tgz", - "integrity": "sha512-ZYDqPLGxDkDhDZBjZBb+oD1+j0rA4E0pXY50eplAAOPg2N/gUBSSk5IM1/QhPfyVo19lJ+CvXpqfvk+b2p/8Ng==", - "dev": true, - "requires": { - "expand-tilde": "^2.0.2", - "is-plain-object": "^2.0.3", - "object.defaults": "^1.1.0", - "object.pick": "^1.2.0", - "parse-filepath": "^1.0.1" - } - }, - "flagged-respawn": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/flagged-respawn/-/flagged-respawn-1.0.1.tgz", - "integrity": "sha512-lNaHNVymajmk0OJMBn8fVUAU1BtDeKIqKoVhk4xAALB57aALg6b4W0MfJ/cUE0g9YBXy5XhSlPIpYIJ7HaY/3Q==", - "dev": true - }, - "flush-write-stream": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/flush-write-stream/-/flush-write-stream-1.1.1.tgz", - "integrity": "sha512-3Z4XhFZ3992uIq0XOqb9AreonueSYphE6oYbpt5+3u06JWklbsPkNv3ZKkP9Bz/r+1MWCaMoSQ28P85+1Yc77w==", - "dev": true, - "requires": { - "inherits": "^2.0.3", - "readable-stream": "^2.3.6" - }, - "dependencies": { - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", - "dev": true - }, - "readable-stream": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", - "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", - "dev": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, - "requires": { - "safe-buffer": "~5.1.0" - } - } - } - }, - "follow-redirects": { - "version": "1.15.2", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.2.tgz", - "integrity": "sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==", - "dev": true - }, - "for-each": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", - "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==", - "dev": true, - "requires": { - "is-callable": "^1.1.3" - } - }, - "for-in": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", - "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=", - "dev": true - }, - "for-own": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/for-own/-/for-own-1.0.0.tgz", - "integrity": "sha1-xjMy9BXO3EsE2/5wz4NklMU8tEs=", - "dev": true, - "requires": { - "for-in": "^1.0.1" - } - }, - "foreground-child": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-2.0.0.tgz", - "integrity": "sha512-dCIq9FpEcyQyXKCkyzmlPTFNgrCzPudOe+mhvJU5zAtlBnGVy2yKxtfsxK2tQBThwq225jcvBjpw1Gr40uzZCA==", - "dev": true, - "requires": { - "cross-spawn": "^7.0.0", - "signal-exit": "^3.0.2" - } - }, - "forever-agent": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", - "integrity": "sha512-j0KLYPhm6zeac4lz3oJ3o65qvgQCcPubiyotZrXqEaG4hNagNYO8qdlUrX5vwqv9ohqeT/Z3j6+yW067yWWdUw==", - "peer": true - }, - "form-data": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", - "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", - "peer": true, - "requires": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.6", - "mime-types": "^2.1.12" - } - }, - "fragment-cache": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz", - "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=", - "dev": true, - "requires": { - "map-cache": "^0.2.2" - } - }, - "fresh": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", - "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=", - "dev": true - }, - "fs-constants": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", - "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==" - }, - "fs-extra": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-3.0.1.tgz", - "integrity": "sha1-N5TzeMWLNC6n27sjCVEJxLO2IpE=", - "dev": true, - "requires": { - "graceful-fs": "^4.1.2", - "jsonfile": "^3.0.0", - "universalify": "^0.1.0" - } - }, - "fs-minipass": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", - "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", - "requires": { - "minipass": "^3.0.0" - } - }, - "fs-mkdirp-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs-mkdirp-stream/-/fs-mkdirp-stream-1.0.0.tgz", - "integrity": "sha1-C3gV/DIBxqaeFNuYzgmMFpNSWes=", - "dev": true, - "requires": { - "graceful-fs": "^4.1.11", - "through2": "^2.0.3" - }, - "dependencies": { - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", - "dev": true - }, - "readable-stream": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", - "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", - "dev": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, - "requires": { - "safe-buffer": "~5.1.0" - } - }, - "through2": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", - "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", - "dev": true, - "requires": { - "readable-stream": "~2.3.6", - "xtend": "~4.0.1" - } - } - } - }, - "fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" - }, - "fsevents": { - "version": "1.2.12", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.12.tgz", - "integrity": "sha512-Ggd/Ktt7E7I8pxZRbGIs7vwqAPscSESMrCSkx2FtWeqmheJgCo2R74fTsZFCifr0VTPwqRpPv17+6b8Zp7th0Q==", - "dev": true, - "optional": true, - "requires": { - "bindings": "^1.5.0", - "nan": "^2.12.1", - "node-pre-gyp": "*" - }, - "dependencies": { - "abbrev": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", - "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", - "bundled": true, - "dev": true, - "optional": true - }, - "ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", - "bundled": true, - "dev": true, - "optional": true - }, - "aproba": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", - "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==", - "bundled": true, - "dev": true, - "optional": true - }, - "are-we-there-yet": { - "version": "1.1.5", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "delegates": "^1.0.0", - "readable-stream": "^2.0.6" - } - }, - "balanced-match": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", - "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", - "bundled": true, - "dev": true, - "optional": true - }, - "brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "chownr": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", - "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==", - "bundled": true, - "dev": true, - "optional": true - }, - "code-point-at": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", - "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=", - "bundled": true, - "dev": true, - "optional": true - }, - "concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", - "bundled": true, - "dev": true, - "optional": true - }, - "console-control-strings": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", - "integrity": "sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==", - "bundled": true, - "dev": true, - "optional": true - }, - "core-util-is": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", - "bundled": true, - "dev": true, - "optional": true - }, - "debug": { - "version": "3.2.6", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "ms": "^2.1.1" - } - }, - "deep-extend": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", - "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", - "bundled": true, - "dev": true, - "optional": true - }, - "delegates": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", - "integrity": "sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==", - "bundled": true, - "dev": true, - "optional": true - }, - "detect-libc": { - "version": "1.0.3", - "bundled": true, - "dev": true, - "optional": true - }, - "fs-minipass": { - "version": "1.2.7", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "minipass": "^2.6.0" - } - }, - "fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", - "bundled": true, - "dev": true, - "optional": true - }, - "gauge": { - "version": "2.7.4", - "resolved": "https://registry.npmjs.org/gauge/-/gauge-2.7.4.tgz", - "integrity": "sha512-14x4kjc6lkD3ltw589k0NrPD6cCNTD6CWoVUNpB85+DrtONoZn+Rug6xZU5RvSC4+TZPxA5AnBibQYAvZn41Hg==", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "aproba": "^1.0.3", - "console-control-strings": "^1.0.0", - "has-unicode": "^2.0.0", - "object-assign": "^4.1.0", - "signal-exit": "^3.0.0", - "string-width": "^1.0.1", - "strip-ansi": "^3.0.1", - "wide-align": "^1.1.0" - } - }, - "glob": { - "version": "7.1.6", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - }, - "has-unicode": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", - "integrity": "sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==", - "bundled": true, - "dev": true, - "optional": true - }, - "iconv-lite": { - "version": "0.4.24", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "safer-buffer": ">= 2.1.2 < 3" - } - }, - "ignore-walk": { - "version": "3.0.3", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "minimatch": "^3.0.4" - } - }, - "inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "bundled": true, - "dev": true, - "optional": true - }, - "ini": { - "version": "1.3.5", - "bundled": true, - "dev": true, - "optional": true - }, - "is-fullwidth-code-point": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", - "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "number-is-nan": "^1.0.0" - } - }, - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", - "bundled": true, - "dev": true, - "optional": true - }, - "minimatch": { - "version": "3.0.4", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "brace-expansion": "^1.1.7" - } - }, - "minimist": { - "version": "1.2.5", - "bundled": true, - "dev": true, - "optional": true - }, - "minipass": { - "version": "2.9.0", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "safe-buffer": "^5.1.2", - "yallist": "^3.0.0" - } - }, - "minizlib": { - "version": "1.3.3", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "minipass": "^2.9.0" - } - }, - "mkdirp": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.3.tgz", - "integrity": "sha512-P+2gwrFqx8lhew375MQHHeTlY8AuOJSrGf0R5ddkEndUkmwpgUob/vQuBD1V22/Cw1/lJr4x+EjllSezBThzBg==", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "minimist": "^1.2.5" - } - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "bundled": true, - "dev": true, - "optional": true - }, - "needle": { - "version": "2.3.3", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "debug": "^3.2.6", - "iconv-lite": "^0.4.4", - "sax": "^1.2.4" - } - }, - "node-pre-gyp": { - "version": "0.14.0", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "detect-libc": "^1.0.2", - "mkdirp": "^0.5.1", - "needle": "^2.2.1", - "nopt": "^4.0.1", - "npm-packlist": "^1.1.6", - "npmlog": "^4.0.2", - "rc": "^1.2.7", - "rimraf": "^2.6.1", - "semver": "^5.3.0", - "tar": "^4.4.2" - } - }, - "nopt": { - "version": "4.0.3", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "abbrev": "1", - "osenv": "^0.1.4" - } - }, - "npm-bundled": { - "version": "1.1.1", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "npm-normalize-package-bin": "^1.0.1" - } - }, - "npm-normalize-package-bin": { - "version": "1.0.1", - "bundled": true, - "dev": true, - "optional": true - }, - "npm-packlist": { - "version": "1.4.8", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "ignore-walk": "^3.0.1", - "npm-bundled": "^1.0.1", - "npm-normalize-package-bin": "^1.0.1" - } - }, - "npmlog": { - "version": "4.1.2", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "are-we-there-yet": "~1.1.2", - "console-control-strings": "~1.1.0", - "gauge": "~2.7.3", - "set-blocking": "~2.0.0" - } - }, - "number-is-nan": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", - "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=", - "bundled": true, - "dev": true, - "optional": true - }, - "object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", - "bundled": true, - "dev": true, - "optional": true - }, - "once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "wrappy": "1" - } - }, - "os-homedir": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", - "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=", - "bundled": true, - "dev": true, - "optional": true - }, - "os-tmpdir": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", - "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", - "bundled": true, - "dev": true, - "optional": true - }, - "osenv": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/osenv/-/osenv-0.1.5.tgz", - "integrity": "sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g==", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "os-homedir": "^1.0.0", - "os-tmpdir": "^1.0.0" - } - }, - "path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", - "bundled": true, - "dev": true, - "optional": true - }, - "process-nextick-args": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", - "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", - "bundled": true, - "dev": true, - "optional": true - }, - "rc": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", - "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "deep-extend": "^0.6.0", - "ini": "~1.3.0", - "minimist": "^1.2.0", - "strip-json-comments": "~2.0.1" - } - }, - "readable-stream": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", - "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "rimraf": { - "version": "2.7.1", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "glob": "^7.1.3" - } - }, - "safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "bundled": true, - "dev": true, - "optional": true - }, - "safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", - "bundled": true, - "dev": true, - "optional": true - }, - "sax": { - "version": "1.2.4", - "bundled": true, - "dev": true, - "optional": true - }, - "semver": { - "version": "5.7.1", - "bundled": true, - "dev": true, - "optional": true - }, - "set-blocking": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", - "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", - "bundled": true, - "dev": true, - "optional": true - }, - "signal-exit": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", - "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=", - "bundled": true, - "dev": true, - "optional": true - }, - "string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "safe-buffer": "~5.1.0" - } - }, - "string-width": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", - "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "code-point-at": "^1.0.0", - "is-fullwidth-code-point": "^1.0.0", - "strip-ansi": "^3.0.0" - } - }, - "strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "ansi-regex": "^2.0.0" - } - }, - "strip-json-comments": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", - "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=", - "bundled": true, - "dev": true, - "optional": true - }, - "tar": { - "version": "4.4.13", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "chownr": "^1.1.1", - "fs-minipass": "^1.2.5", - "minipass": "^2.8.6", - "minizlib": "^1.2.1", - "mkdirp": "^0.5.0", - "safe-buffer": "^5.1.2", - "yallist": "^3.0.3" - } - }, - "util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", - "bundled": true, - "dev": true, - "optional": true - }, - "wide-align": { - "version": "1.1.3", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "string-width": "^1.0.2 || 2" - } - }, - "wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", - "bundled": true, - "dev": true, - "optional": true - }, - "yallist": { - "version": "3.1.1", - "bundled": true, - "dev": true, - "optional": true - } - } - }, - "function-bind": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", - "dev": true - }, - "gauge": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/gauge/-/gauge-4.0.4.tgz", - "integrity": "sha512-f9m+BEN5jkg6a0fZjleidjN51VE1X+mPFQ2DJ0uv1V39oCLCbsGe6yjbBnp7eK7z/+GAon99a3nHuqbuuthyPg==", - "requires": { - "aproba": "^1.0.3 || ^2.0.0", - "color-support": "^1.1.3", - "console-control-strings": "^1.1.0", - "has-unicode": "^2.0.1", - "signal-exit": "^3.0.7", - "string-width": "^4.2.3", - "strip-ansi": "^6.0.1", - "wide-align": "^1.1.5" - }, - "dependencies": { - "ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==" - }, - "is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==" - }, - "signal-exit": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", - "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==" - }, - "string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "requires": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - } - }, - "strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "requires": { - "ansi-regex": "^5.0.1" - } - } - } - }, - "get-assigned-identifiers": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/get-assigned-identifiers/-/get-assigned-identifiers-1.2.0.tgz", - "integrity": "sha512-mBBwmeGTrxEMO4pMaaf/uUEFHnYtwr8FTe8Y/mer4rcV/bye0qGm6pw1bGZFGStxC5O76c5ZAVBGnqHmOaJpdQ==", - "dev": true - }, - "get-caller-file": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.3.tgz", - "integrity": "sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w==", - "dev": true - }, - "get-intrinsic": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.3.tgz", - "integrity": "sha512-QJVz1Tj7MS099PevUG5jvnt9tSkXN8K14dxQlikJuPt4uD9hHAHjLyLBiLR5zELelBdD9QNRAXZzsJx0WaDL9A==", - "dev": true, - "requires": { - "function-bind": "^1.1.1", - "has": "^1.0.3", - "has-symbols": "^1.0.3" - } - }, - "get-value": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", - "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=", - "dev": true - }, - "getpass": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", - "integrity": "sha512-0fzj9JxOLfJ+XGLhR8ze3unN0KZCgZwiSSDz168VERjK8Wl8kVSdcu2kspd4s4wtAa1y/qrVRiAA0WclVsu0ng==", - "peer": true, - "requires": { - "assert-plus": "^1.0.0" - } - }, - "github-from-package": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/github-from-package/-/github-from-package-0.0.0.tgz", - "integrity": "sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw==" - }, - "gl": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/gl/-/gl-5.0.3.tgz", - "integrity": "sha512-toWmb3Rgli5Wl9ygjZeglFBVLDYMOomy+rXlVZVDCoIRV+6mQE5nY4NgQgokYIc5oQzc1pvWY9lQJ0hGn61ZUg==", - "requires": { - "bindings": "^1.5.0", - "bit-twiddle": "^1.0.2", - "glsl-tokenizer": "^2.1.5", - "nan": "^2.16.0", - "node-abi": "^3.22.0", - "node-gyp": "^9.0.0", - "prebuild-install": "^7.1.1" - } - }, - "gl-wiretap": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/gl-wiretap/-/gl-wiretap-0.6.2.tgz", - "integrity": "sha512-fxy1XGiPkfzK+T3XKDbY7yaqMBmozCGvAFyTwaZA3imeZH83w7Hr3r3bYlMRWIyzMI/lDUvUMM/92LE2OwqFyQ==" - }, - "glob": { - "version": "7.1.4", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.4.tgz", - "integrity": "sha512-hkLPepehmnKk41pUGm3sYxoFs/umurYfYJCerbXEyFIWcAzvpipAgVkBqqT9RBKMGjnq6kMuyYwha6csxbiM1A==", - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - }, - "glob-parent": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", - "integrity": "sha512-E8Ak/2+dZY6fnzlR7+ueWvhsH1SjHr4jjss4YS/h4py44jY9MhK/VFdaZJAWDz6BbL21KeteKxFSFpq8OS5gVA==", - "dev": true, - "requires": { - "is-glob": "^3.1.0", - "path-dirname": "^1.0.0" - }, - "dependencies": { - "is-glob": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", - "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", - "dev": true, - "requires": { - "is-extglob": "^2.1.0" - } - } - } - }, - "glob-stream": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/glob-stream/-/glob-stream-6.1.0.tgz", - "integrity": "sha512-uMbLGAP3S2aDOHUDfdoYcdIePUCfysbAd0IAoWVZbeGU/oNQ8asHVSshLDJUPWxfzj8zsCG7/XeHPHTtow0nsw==", - "dev": true, - "requires": { - "extend": "^3.0.0", - "glob": "^7.1.1", - "glob-parent": "^3.1.0", - "is-negated-glob": "^1.0.0", - "ordered-read-streams": "^1.0.0", - "pumpify": "^1.3.5", - "readable-stream": "^2.1.5", - "remove-trailing-separator": "^1.0.1", - "to-absolute-glob": "^2.0.0", - "unique-stream": "^2.0.2" - }, - "dependencies": { - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", - "dev": true - }, - "readable-stream": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", - "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", - "dev": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, - "requires": { - "safe-buffer": "~5.1.0" - } - } - } - }, - "glob-watcher": { - "version": "5.0.5", - "resolved": "https://registry.npmjs.org/glob-watcher/-/glob-watcher-5.0.5.tgz", - "integrity": "sha512-zOZgGGEHPklZNjZQaZ9f41i7F2YwE+tS5ZHrDhbBCk3stwahn5vQxnFmBJZHoYdusR6R1bLSXeGUy/BhctwKzw==", - "dev": true, - "requires": { - "anymatch": "^2.0.0", - "async-done": "^1.2.0", - "chokidar": "^2.0.0", - "is-negated-glob": "^1.0.0", - "just-debounce": "^1.0.0", - "normalize-path": "^3.0.0", - "object.defaults": "^1.1.0" - } - }, - "global-modules": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-1.0.0.tgz", - "integrity": "sha512-sKzpEkf11GpOFuw0Zzjzmt4B4UZwjOcG757PPvrfhxcLFbq0wpsgpOqxpxtxFiCG4DtG93M6XRVbF2oGdev7bg==", - "dev": true, - "requires": { - "global-prefix": "^1.0.1", - "is-windows": "^1.0.1", - "resolve-dir": "^1.0.0" - } - }, - "global-prefix": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-1.0.2.tgz", - "integrity": "sha1-2/dDxsFJklk8ZVVoy2btMsASLr4=", - "dev": true, - "requires": { - "expand-tilde": "^2.0.2", - "homedir-polyfill": "^1.0.1", - "ini": "^1.3.4", - "is-windows": "^1.0.1", - "which": "^1.2.14" - } - }, - "globalyzer": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/globalyzer/-/globalyzer-0.1.0.tgz", - "integrity": "sha512-40oNTM9UfG6aBmuKxk/giHn5nQ8RVz/SS4Ir6zgzOv9/qC3kKZ9v4etGTcJbEl/NyVQH7FGU7d+X1egr57Md2Q==", - "dev": true - }, - "globby": { - "version": "10.0.1", - "resolved": "https://registry.npmjs.org/globby/-/globby-10.0.1.tgz", - "integrity": "sha512-sSs4inE1FB2YQiymcmTv6NWENryABjUNPeWhOvmn4SjtKybglsyPZxFB3U1/+L1bYi0rNZDqCLlHyLYDl1Pq5A==", - "dev": true, - "requires": { - "@types/glob": "^7.1.1", - "array-union": "^2.1.0", - "dir-glob": "^3.0.1", - "fast-glob": "^3.0.3", - "glob": "^7.1.3", - "ignore": "^5.1.1", - "merge2": "^1.2.3", - "slash": "^3.0.0" - } - }, - "globrex": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/globrex/-/globrex-0.1.2.tgz", - "integrity": "sha512-uHJgbwAMwNFf5mLst7IWLNg14x1CkeqglJb/K3doi4dw6q2IvAAmM/Y81kevy83wP+Sst+nutFTYOGg3d1lsxg==", - "dev": true - }, - "glogg": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/glogg/-/glogg-1.0.2.tgz", - "integrity": "sha512-5mwUoSuBk44Y4EshyiqcH95ZntbDdTQqA3QYSrxmzj28Ai0vXBGMH1ApSANH14j2sIRtqCEyg6PfsuP7ElOEDA==", - "dev": true, - "requires": { - "sparkles": "^1.0.0" - } - }, - "glsl-tokenizer": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/glsl-tokenizer/-/glsl-tokenizer-2.1.5.tgz", - "integrity": "sha512-XSZEJ/i4dmz3Pmbnpsy3cKh7cotvFlBiZnDOwnj/05EwNp2XrhQ4XKJxT7/pDt4kp4YcpRSKz8eTV7S+mwV6MA==", - "requires": { - "through2": "^0.6.3" - } - }, - "gopd": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", - "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", - "dev": true, - "requires": { - "get-intrinsic": "^1.1.3" - } - }, - "gpu-mock.js": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/gpu-mock.js/-/gpu-mock.js-1.3.1.tgz", - "integrity": "sha512-+lbp8rQ0p1nTa6Gk6HoLiw4yM6JTpql82U+nCF3sZbX4FJWP9PzzF1018dW8K+pbmqRmhLHbn6Bjc6i6tgUpbA==", - "requires": {} - }, - "gpu.js": { - "version": "2.15.2", - "resolved": "https://registry.npmjs.org/gpu.js/-/gpu.js-2.15.2.tgz", - "integrity": "sha512-tgTRoWEE0X2PE3OgTNub9OwadXND2K7qwOW/VwhIiedY/mbiT93jJIrgWAKBgdhQR0JmyN4ObkSu0/vjSpbuiQ==", - "peer": true, - "requires": { - "acorn": "^7.1.1", - "gl": "^4.5.2", - "gl-wiretap": "^0.6.2", - "gpu-mock.js": "^1.3.0", - "webgpu": "^0.1.16" - }, - "dependencies": { - "aproba": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", - "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==", - "peer": true - }, - "are-we-there-yet": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.1.7.tgz", - "integrity": "sha512-nxwy40TuMiUGqMyRHgCSWZ9FM4VAoRP4xUYSTv5ImRog+h9yISPbVH7H8fASCIzYn9wlEv4zvFL7uKDMCFQm3g==", - "peer": true, - "requires": { - "delegates": "^1.0.0", - "readable-stream": "^2.0.6" - } - }, - "decompress-response": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-4.2.1.tgz", - "integrity": "sha512-jOSne2qbyE+/r8G1VU+G/82LBs2Fs4LAsTiLSHOCOMZQl2OKZ6i8i4IyHemTe+/yIXOtTcRQMzPcgyhoFlqPkw==", - "peer": true, - "requires": { - "mimic-response": "^2.0.0" - } - }, - "detect-libc": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz", - "integrity": "sha512-pGjwhsmsp4kL2RTz08wcOlGN83otlqHeD/Z5T8GXZB+/YcpQ/dgo+lbU8ZsGxV0HIvqqxo9l7mqYwyYMD9bKDg==", - "peer": true - }, - "gauge": { - "version": "2.7.4", - "resolved": "https://registry.npmjs.org/gauge/-/gauge-2.7.4.tgz", - "integrity": "sha512-14x4kjc6lkD3ltw589k0NrPD6cCNTD6CWoVUNpB85+DrtONoZn+Rug6xZU5RvSC4+TZPxA5AnBibQYAvZn41Hg==", - "peer": true, - "requires": { - "aproba": "^1.0.3", - "console-control-strings": "^1.0.0", - "has-unicode": "^2.0.0", - "object-assign": "^4.1.0", - "signal-exit": "^3.0.0", - "string-width": "^1.0.1", - "strip-ansi": "^3.0.1", - "wide-align": "^1.1.0" - } - }, - "gl": { - "version": "4.9.2", - "resolved": "https://registry.npmjs.org/gl/-/gl-4.9.2.tgz", - "integrity": "sha512-lLYaicQxsRPxOnKWX9pIGmtKRuw0epvI089yl9uBvemYxR9xE01eRuXJgje1U0/06Df7bdOmmcW87IPOsu52Ow==", - "peer": true, - "requires": { - "bindings": "^1.5.0", - "bit-twiddle": "^1.0.2", - "glsl-tokenizer": "^2.0.2", - "nan": "^2.15.0", - "node-abi": "^2.30.1", - "node-gyp": "^7.1.2", - "prebuild-install": "^5.3.6" - } - }, - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", - "peer": true - }, - "lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "peer": true, - "requires": { - "yallist": "^4.0.0" - } - }, - "mimic-response": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-2.1.0.tgz", - "integrity": "sha512-wXqjST+SLt7R009ySCglWBCFpjUygmCIfD790/kVbiGmUgfYGuB14PiTd5DwVxSV4NcYHjzMkoj5LjQZwTQLEA==", - "peer": true - }, - "node-abi": { - "version": "2.30.1", - "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-2.30.1.tgz", - "integrity": "sha512-/2D0wOQPgaUWzVSVgRMx+trKJRC2UG4SUc4oCJoXx9Uxjtp0Vy3/kt7zcbxHF8+Z/pK3UloLWzBISg72brfy1w==", - "peer": true, - "requires": { - "semver": "^5.4.1" - } - }, - "node-gyp": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-7.1.2.tgz", - "integrity": "sha512-CbpcIo7C3eMu3dL1c3d0xw449fHIGALIJsRP4DDPHpyiW8vcriNY7ubh9TE4zEKfSxscY7PjeFnshE7h75ynjQ==", - "peer": true, - "requires": { - "env-paths": "^2.2.0", - "glob": "^7.1.4", - "graceful-fs": "^4.2.3", - "nopt": "^5.0.0", - "npmlog": "^4.1.2", - "request": "^2.88.2", - "rimraf": "^3.0.2", - "semver": "^7.3.2", - "tar": "^6.0.2", - "which": "^2.0.2" - }, - "dependencies": { - "semver": { - "version": "7.3.8", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz", - "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==", - "peer": true, - "requires": { - "lru-cache": "^6.0.0" - } - } - } - }, - "npmlog": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-4.1.2.tgz", - "integrity": "sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg==", - "peer": true, - "requires": { - "are-we-there-yet": "~1.1.2", - "console-control-strings": "~1.1.0", - "gauge": "~2.7.3", - "set-blocking": "~2.0.0" - } - }, - "prebuild-install": { - "version": "5.3.6", - "resolved": "https://registry.npmjs.org/prebuild-install/-/prebuild-install-5.3.6.tgz", - "integrity": "sha512-s8Aai8++QQGi4sSbs/M1Qku62PFK49Jm1CbgXklGz4nmHveDq0wzJkg7Na5QbnO1uNH8K7iqx2EQ/mV0MZEmOg==", - "peer": true, - "requires": { - "detect-libc": "^1.0.3", - "expand-template": "^2.0.3", - "github-from-package": "0.0.0", - "minimist": "^1.2.3", - "mkdirp-classic": "^0.5.3", - "napi-build-utils": "^1.0.1", - "node-abi": "^2.7.0", - "noop-logger": "^0.1.1", - "npmlog": "^4.0.1", - "pump": "^3.0.0", - "rc": "^1.2.7", - "simple-get": "^3.0.3", - "tar-fs": "^2.0.0", - "tunnel-agent": "^0.6.0", - "which-pm-runs": "^1.0.0" - } - }, - "pump": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", - "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", - "peer": true, - "requires": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" - } - }, - "readable-stream": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", - "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", - "peer": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "peer": true - }, - "simple-get": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/simple-get/-/simple-get-3.1.1.tgz", - "integrity": "sha512-CQ5LTKGfCpvE1K0n2us+kuMPbk/q0EKl82s4aheV9oXjFEz6W/Y7oQFVJuU6QG77hRT4Ghb5RURteF5vnWjupA==", - "peer": true, - "requires": { - "decompress-response": "^4.2.0", - "once": "^1.3.1", - "simple-concat": "^1.0.0" - } - }, - "string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "peer": true, - "requires": { - "safe-buffer": "~5.1.0" - } - }, - "which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "peer": true, - "requires": { - "isexe": "^2.0.0" - } - } - } - }, - "graceful-fs": { - "version": "4.2.10", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", - "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==" - }, - "gulp": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/gulp/-/gulp-4.0.2.tgz", - "integrity": "sha512-dvEs27SCZt2ibF29xYgmnwwCYZxdxhQ/+LFWlbAW8y7jt68L/65402Lz3+CKy0Ov4rOs+NERmDq7YlZaDqUIfA==", - "dev": true, - "requires": { - "glob-watcher": "^5.0.3", - "gulp-cli": "^2.2.0", - "undertaker": "^1.2.1", - "vinyl-fs": "^3.0.0" - }, - "dependencies": { - "gulp-cli": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/gulp-cli/-/gulp-cli-2.2.0.tgz", - "integrity": "sha512-rGs3bVYHdyJpLqR0TUBnlcZ1O5O++Zs4bA0ajm+zr3WFCfiSLjGwoCBqFs18wzN+ZxahT9DkOK5nDf26iDsWjA==", - "dev": true, - "requires": { - "ansi-colors": "^1.0.1", - "archy": "^1.0.0", - "array-sort": "^1.0.0", - "color-support": "^1.1.3", - "concat-stream": "^1.6.0", - "copy-props": "^2.0.1", - "fancy-log": "^1.3.2", - "gulplog": "^1.0.0", - "interpret": "^1.1.0", - "isobject": "^3.0.1", - "liftoff": "^3.1.0", - "matchdep": "^2.0.0", - "mute-stdout": "^1.0.0", - "pretty-hrtime": "^1.0.0", - "replace-homedir": "^1.0.0", - "semver-greatest-satisfied-range": "^1.1.0", - "v8flags": "^3.0.1", - "yargs": "^7.1.0" - } - }, - "yargs": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-7.1.0.tgz", - "integrity": "sha1-a6MY6xaWFyf10oT46gA+jWFU0Mg=", - "dev": true, - "requires": { - "camelcase": "^3.0.0", - "cliui": "^3.2.0", - "decamelize": "^1.1.1", - "get-caller-file": "^1.0.1", - "os-locale": "^1.4.0", - "read-pkg-up": "^1.0.1", - "require-directory": "^2.1.1", - "require-main-filename": "^1.0.1", - "set-blocking": "^2.0.0", - "string-width": "^1.0.2", - "which-module": "^1.0.0", - "y18n": "^3.2.1", - "yargs-parser": "^5.0.0" - } - }, - "yargs-parser": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-5.0.1.tgz", - "integrity": "sha512-wpav5XYiddjXxirPoCTUPbqM0PXvJ9hiBMvuJgInvo4/lAOTZzUprArw17q2O1P2+GHhbBr18/iQwjL5Z9BqfA==", - "dev": true, - "requires": { - "camelcase": "^3.0.0", - "object.assign": "^4.1.0" - } - } - } - }, - "gulp-concat": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/gulp-concat/-/gulp-concat-2.6.1.tgz", - "integrity": "sha1-Yz0WyV2IUEYorQJmVmPO5aR5M1M=", - "dev": true, - "requires": { - "concat-with-sourcemaps": "^1.0.0", - "through2": "^2.0.0", - "vinyl": "^2.0.0" - }, - "dependencies": { - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", - "dev": true - }, - "readable-stream": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", - "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", - "dev": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, - "requires": { - "safe-buffer": "~5.1.0" - } - }, - "through2": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", - "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", - "dev": true, - "requires": { - "readable-stream": "~2.3.6", - "xtend": "~4.0.1" - } - } - } - }, - "gulp-header": { - "version": "1.8.12", - "resolved": "https://registry.npmjs.org/gulp-header/-/gulp-header-1.8.12.tgz", - "integrity": "sha512-lh9HLdb53sC7XIZOYzTXM4lFuXElv3EVkSDhsd7DoJBj7hm+Ni7D3qYbb+Rr8DuM8nRanBvkVO9d7askreXGnQ==", - "dev": true, - "requires": { - "concat-with-sourcemaps": "*", - "lodash.template": "^4.4.0", - "through2": "^2.0.0" - }, - "dependencies": { - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", - "dev": true - }, - "readable-stream": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", - "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", - "dev": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, - "requires": { - "safe-buffer": "~5.1.0" - } - }, - "through2": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", - "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", - "dev": true, - "requires": { - "readable-stream": "~2.3.6", - "xtend": "~4.0.1" - } - } - } - }, - "gulp-jsbeautifier": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/gulp-jsbeautifier/-/gulp-jsbeautifier-2.1.2.tgz", - "integrity": "sha512-tZUk4c11zF8xzCCTOEmktxGitv/H2vpAcflZNVU8nxL+G5XxQyLJUJVUKylz7/dax+FXb3YwQYByaJ+yxmo8iw==", - "dev": true, - "requires": { - "chalk": "^1.1.3", - "fancy-log": "^1.3.2", - "js-beautify": "^1.7.5", - "lodash": "^4.17.4", - "plugin-error": "^0.1.2", - "rc": "^1.2.2", - "through2": "^2.0.3" - }, - "dependencies": { - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", - "dev": true - }, - "readable-stream": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", - "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", - "dev": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, - "requires": { - "safe-buffer": "~5.1.0" - } - }, - "through2": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", - "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", - "dev": true, - "requires": { - "readable-stream": "~2.3.6", - "xtend": "~4.0.1" - } - } - } - }, - "gulp-rename": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/gulp-rename/-/gulp-rename-1.4.0.tgz", - "integrity": "sha512-swzbIGb/arEoFK89tPY58vg3Ok1bw+d35PfUNwWqdo7KM4jkmuGA78JiDNqR+JeZFaeeHnRg9N7aihX3YPmsyg==", - "dev": true - }, - "gulp-replace": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/gulp-replace/-/gulp-replace-1.0.0.tgz", - "integrity": "sha512-lgdmrFSI1SdhNMXZQbrC75MOl1UjYWlOWNbNRnz+F/KHmgxt3l6XstBoAYIdadwETFyG/6i+vWUSCawdC3pqOw==", - "dev": true, - "requires": { - "istextorbinary": "2.2.1", - "readable-stream": "^2.0.1", - "replacestream": "^4.0.0" - }, - "dependencies": { - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", - "dev": true - }, - "readable-stream": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", - "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", - "dev": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, - "requires": { - "safe-buffer": "~5.1.0" - } - } - } - }, - "gulp-strip-comments": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/gulp-strip-comments/-/gulp-strip-comments-2.5.2.tgz", - "integrity": "sha512-lb1bW7rsPWDD8f4ZPSguDvmCdjKmjr5HR4yZb9ros3sLl5AfW7oUj8KzY9/VRisT7dG8dL7hVHzNpQEVxfwZGQ==", - "dev": true, - "requires": { - "decomment": "^0.9.0", - "plugin-error": "^0.1.2", - "through2": "^2.0.3" - }, - "dependencies": { - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", - "dev": true - }, - "readable-stream": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", - "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", - "dev": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, - "requires": { - "safe-buffer": "~5.1.0" - } - }, - "through2": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", - "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", - "dev": true, - "requires": { - "readable-stream": "~2.3.6", - "xtend": "~4.0.1" - } - } - } - }, - "gulp-uglify-es": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/gulp-uglify-es/-/gulp-uglify-es-3.0.0.tgz", - "integrity": "sha512-dQ3czMFFojNgCajcrYl0oa98+YayaQ8kXRdaacpZRZ3iw2sdVURfdt8y8Ki1ogZGQqw8BUawnB7V6NkanxqnDg==", - "dev": true, - "requires": { - "o-stream": "^0.3.0", - "plugin-error": "^1.0.1", - "terser": "^5.7.1", - "vinyl": "^2.2.1", - "vinyl-sourcemaps-apply": "^0.2.1" - }, - "dependencies": { - "plugin-error": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/plugin-error/-/plugin-error-1.0.1.tgz", - "integrity": "sha512-L1zP0dk7vGweZME2i+EeakvUNqSrdiI3F91TwEoYiGrAfUXmVv6fJIq4g82PAXxNsWOp0J7ZqQy/3Szz0ajTxA==", - "dev": true, - "requires": { - "ansi-colors": "^1.0.1", - "arr-diff": "^4.0.0", - "arr-union": "^3.1.0", - "extend-shallow": "^3.0.2" - } - } - } - }, - "gulplog": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/gulplog/-/gulplog-1.0.0.tgz", - "integrity": "sha1-4oxNRdBey77YGDY86PnFkmIp/+U=", - "dev": true, - "requires": { - "glogg": "^1.0.0" - } - }, - "har-schema": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", - "integrity": "sha512-Oqluz6zhGX8cyRaTQlFMPw80bSJVG2x/cFb8ZPhUILGgHka9SsokCCOQgpveePerqidZOrT14ipqfJb7ILcW5Q==", - "peer": true - }, - "har-validator": { - "version": "5.1.5", - "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.5.tgz", - "integrity": "sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==", - "peer": true, - "requires": { - "ajv": "^6.12.3", - "har-schema": "^2.0.0" - } - }, - "has": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", - "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", - "dev": true, - "requires": { - "function-bind": "^1.1.1" - } - }, - "has-ansi": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", - "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", - "dev": true, - "requires": { - "ansi-regex": "^2.0.0" - } - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", - "dev": true - }, - "has-symbols": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", - "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", - "dev": true - }, - "has-tostringtag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz", - "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==", - "dev": true, - "requires": { - "has-symbols": "^1.0.2" - } - }, - "has-unicode": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", - "integrity": "sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==" - }, - "has-value": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz", - "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=", - "dev": true, - "requires": { - "get-value": "^2.0.6", - "has-values": "^1.0.0", - "isobject": "^3.0.0" - } - }, - "has-values": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz", - "integrity": "sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=", - "dev": true, - "requires": { - "is-number": "^3.0.0", - "kind-of": "^4.0.0" - }, - "dependencies": { - "kind-of": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", - "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "hash-base": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.0.4.tgz", - "integrity": "sha1-X8hoaEfs1zSZQDMZprCj8/auSRg=", - "dev": true, - "requires": { - "inherits": "^2.0.1", - "safe-buffer": "^5.0.1" - } - }, - "hash.js": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz", - "integrity": "sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==", - "dev": true, - "requires": { - "inherits": "^2.0.3", - "minimalistic-assert": "^1.0.1" - } - }, - "hmac-drbg": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", - "integrity": "sha1-0nRXAQJabHdabFRXk+1QL8DGSaE=", - "dev": true, - "requires": { - "hash.js": "^1.0.3", - "minimalistic-assert": "^1.0.0", - "minimalistic-crypto-utils": "^1.0.1" - } - }, - "homedir-polyfill": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/homedir-polyfill/-/homedir-polyfill-1.0.3.tgz", - "integrity": "sha512-eSmmWE5bZTK2Nou4g0AI3zZ9rswp7GRKoKXS1BLUkvPviOqs4YTN1djQIqrXy9k5gEtdLPy86JjRwsNM9tnDcA==", - "dev": true, - "requires": { - "parse-passwd": "^1.0.0" - } - }, - "hosted-git-info": { - "version": "2.8.9", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", - "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==", - "dev": true - }, - "html-escaper": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", - "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", - "dev": true - }, - "htmlescape": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/htmlescape/-/htmlescape-1.1.1.tgz", - "integrity": "sha1-OgPtwiFLyjtmQko+eVk0lQnLA1E=", - "dev": true - }, - "http-cache-semantics": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.0.tgz", - "integrity": "sha512-carPklcUh7ROWRK7Cv27RPtdhYhUsela/ue5/jKzjegVvXDqM2ILE9Q2BGn9JZJh1g87cp56su/FgQSzcWS8cQ==" - }, - "http-errors": { - "version": "1.7.3", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.3.tgz", - "integrity": "sha512-ZTTX0MWrsQ2ZAhA1cejAwDLycFsd7I7nVtnkT3Ol0aqodaKW+0CTZDQ1uBv5whptCnc8e8HeRRJxRs0kmm/Qfw==", - "dev": true, - "requires": { - "depd": "~1.1.2", - "inherits": "2.0.4", - "setprototypeof": "1.1.1", - "statuses": ">= 1.5.0 < 2", - "toidentifier": "1.0.0" - }, - "dependencies": { - "statuses": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", - "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=", - "dev": true - } - } - }, - "http-proxy": { - "version": "1.18.1", - "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.1.tgz", - "integrity": "sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==", - "dev": true, - "requires": { - "eventemitter3": "^4.0.0", - "follow-redirects": "^1.0.0", - "requires-port": "^1.0.0" - } - }, - "http-proxy-agent": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-5.0.0.tgz", - "integrity": "sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==", - "requires": { - "@tootallnate/once": "2", - "agent-base": "6", - "debug": "4" - }, - "dependencies": { - "debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "requires": { - "ms": "2.1.2" - } - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" - } - } - }, - "http-signature": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", - "integrity": "sha512-CAbnr6Rz4CYQkLYUtSNXxQPUH2gK8f3iWexVlsnMeD+GjlsQ0Xsy1cOX+mN3dtxYomRy21CiOzU8Uhw6OwncEQ==", - "peer": true, - "requires": { - "assert-plus": "^1.0.0", - "jsprim": "^1.2.2", - "sshpk": "^1.7.0" - } - }, - "https-browserify": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/https-browserify/-/https-browserify-1.0.0.tgz", - "integrity": "sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM=", - "dev": true - }, - "https-proxy-agent": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", - "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", - "requires": { - "agent-base": "6", - "debug": "4" - }, - "dependencies": { - "debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "requires": { - "ms": "2.1.2" - } - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" - } - } - }, - "humanize-ms": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/humanize-ms/-/humanize-ms-1.2.1.tgz", - "integrity": "sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ==", - "requires": { - "ms": "^2.0.0" - } - }, - "iconv-lite": { - "version": "0.4.24", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", - "dev": true, - "requires": { - "safer-buffer": ">= 2.1.2 < 3" - } - }, - "ieee754": { - "version": "1.1.13", - "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.13.tgz", - "integrity": "sha512-4vf7I2LYV/HaWerSo3XmlMkp5eZ83i+/CDluXi/IGTs/O1sejBNhTtnxzmRZfvOUqj7lZjqHkeTvpgSFDlWZTg==" - }, - "ignore": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.1.2.tgz", - "integrity": "sha512-vdqWBp7MyzdmHkkRWV5nY+PfGRbYbahfuvsBCh277tq+w9zyNi7h5CYJCK0kmzti9kU+O/cB7sE8HvKv6aXAKQ==", - "dev": true - }, - "immutable": { - "version": "3.8.2", - "resolved": "https://registry.npmjs.org/immutable/-/immutable-3.8.2.tgz", - "integrity": "sha512-15gZoQ38eYjEjxkorfbcgBKBL6R7T459OuK+CpcWt7O3KF4uPCx2tD0uFETlUDIyo+1789crbMhTvQBSR5yBMg==", - "dev": true - }, - "imurmurhash": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==" - }, - "indent-string": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", - "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==" - }, - "infer-owner": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/infer-owner/-/infer-owner-1.0.4.tgz", - "integrity": "sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A==" - }, - "inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", - "requires": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" - }, - "ini": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", - "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==" - }, - "inline-source-map": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/inline-source-map/-/inline-source-map-0.6.2.tgz", - "integrity": "sha1-+Tk0ccGKedFyT4Y/o4tYY3Ct4qU=", - "dev": true, - "requires": { - "source-map": "~0.5.3" - } - }, - "insert-module-globals": { - "version": "7.2.1", - "resolved": "https://registry.npmjs.org/insert-module-globals/-/insert-module-globals-7.2.1.tgz", - "integrity": "sha512-ufS5Qq9RZN+Bu899eA9QCAYThY+gGW7oRkmb0vC93Vlyu/CFGcH0OYPEjVkDXA5FEbTt1+VWzdoOD3Ny9N+8tg==", - "dev": true, - "requires": { - "acorn-node": "^1.5.2", - "combine-source-map": "^0.8.0", - "concat-stream": "^1.6.1", - "is-buffer": "^1.1.0", - "JSONStream": "^1.0.3", - "path-is-absolute": "^1.0.1", - "process": "~0.11.0", - "through2": "^2.0.0", - "undeclared-identifiers": "^1.1.2", - "xtend": "^4.0.0" - }, - "dependencies": { - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", - "dev": true - }, - "readable-stream": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", - "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", - "dev": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, - "requires": { - "safe-buffer": "~5.1.0" - } - }, - "through2": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", - "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", - "dev": true, - "requires": { - "readable-stream": "~2.3.6", - "xtend": "~4.0.1" - } - } - } - }, - "interpret": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.2.0.tgz", - "integrity": "sha512-mT34yGKMNceBQUoVn7iCDKDntA7SC6gycMAWzGx1z/CMCTV7b2AAtXlo3nRyHZ1FelRkQbQjprHSYGwzLtkVbw==", - "dev": true - }, - "invert-kv": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-1.0.0.tgz", - "integrity": "sha1-EEqOSqym09jNFXqO+L+rLXo//bY=", - "dev": true - }, - "ip": { - "version": "1.1.8", - "resolved": "https://registry.npmjs.org/ip/-/ip-1.1.8.tgz", - "integrity": "sha512-PuExPYUiu6qMBQb4l06ecm6T6ujzhmh+MeJcW9wa89PoAz5pvd4zPgN5WJV104mb6S2T1AwNIAaB70JNrLQWhg==" - }, - "is-absolute": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-absolute/-/is-absolute-1.0.0.tgz", - "integrity": "sha512-dOWoqflvcydARa360Gvv18DZ/gRuHKi2NU/wU5X1ZFzdYfH29nkiNZsF3mp4OJ3H4yo9Mx8A/uAGNzpzPN3yBA==", - "dev": true, - "requires": { - "is-relative": "^1.0.0", - "is-windows": "^1.0.1" - } - }, - "is-accessor-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", - "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "is-arguments": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.1.tgz", - "integrity": "sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "has-tostringtag": "^1.0.0" - } - }, - "is-arrayish": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", - "dev": true - }, - "is-binary-path": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz", - "integrity": "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=", - "dev": true, - "requires": { - "binary-extensions": "^1.0.0" - } - }, - "is-buffer": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", - "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", - "dev": true - }, - "is-callable": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", - "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", - "dev": true - }, - "is-core-module": { - "version": "2.11.0", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.11.0.tgz", - "integrity": "sha512-RRjxlvLDkD1YJwDbroBHMb+cukurkDWNyHx7D3oNB5x9rb5ogcksMC5wHCadcXoo67gVr/+3GFySh3134zi6rw==", - "dev": true, - "requires": { - "has": "^1.0.3" - } - }, - "is-data-descriptor": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", - "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "is-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", - "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", - "dev": true, - "requires": { - "is-accessor-descriptor": "^0.1.6", - "is-data-descriptor": "^0.1.4", - "kind-of": "^5.0.0" - }, - "dependencies": { - "kind-of": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", - "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", - "dev": true - } - } - }, - "is-extendable": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", - "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", - "dev": true - }, - "is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", - "dev": true - }, - "is-fullwidth-code-point": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", - "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", - "requires": { - "number-is-nan": "^1.0.0" - } - }, - "is-generator-function": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.0.10.tgz", - "integrity": "sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==", - "dev": true, - "requires": { - "has-tostringtag": "^1.0.0" - } - }, - "is-glob": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", - "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", - "dev": true, - "requires": { - "is-extglob": "^2.1.1" - } - }, - "is-lambda": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-lambda/-/is-lambda-1.0.1.tgz", - "integrity": "sha512-z7CMFGNrENq5iFB9Bqo64Xk6Y9sg+epq1myIcdHaGnbMTYOxvzsEtdYqQUylB7LxfkvgrrjP32T6Ywciio9UIQ==" - }, - "is-negated-glob": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-negated-glob/-/is-negated-glob-1.0.0.tgz", - "integrity": "sha1-aRC8pdqMleeEtXUbl2z1oQ/uNtI=", - "dev": true - }, - "is-number": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", - "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "is-number-like": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/is-number-like/-/is-number-like-1.0.8.tgz", - "integrity": "sha512-6rZi3ezCyFcn5L71ywzz2bS5b2Igl1En3eTlZlvKjpz1n3IZLAYMbKYAIQgFmEu0GENg92ziU/faEOA/aixjbA==", - "dev": true, - "requires": { - "lodash.isfinite": "^3.3.2" - } - }, - "is-path-cwd": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-2.2.0.tgz", - "integrity": "sha512-w942bTcih8fdJPJmQHFzkS76NEP8Kzzvmw92cXsazb8intwLqPibPPdXf4ANdKV3rYMuuQYGIWtvz9JilB3NFQ==", - "dev": true - }, - "is-path-in-cwd": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-path-in-cwd/-/is-path-in-cwd-3.0.0.tgz", - "integrity": "sha512-QGuLYLNfpHI/xLQ8ctyeD9mMCf2eBqrtxYWKQxlExrD0l3wBSDcplKYfV55lnTDB4MDvh9SRDt/VnDwVn0dYOw==", - "dev": true, - "requires": { - "is-path-inside": "^3.0.1" - } - }, - "is-path-inside": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.1.tgz", - "integrity": "sha512-CKstxrctq1kUesU6WhtZDbYKzzYBuRH0UYInAVrkc/EYdB9ltbfE0gOoayG9nhohG6447sOOVGhHqsdmBvkbNg==", - "dev": true - }, - "is-plain-object": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", - "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", - "dev": true, - "requires": { - "isobject": "^3.0.1" - } - }, - "is-relative": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-relative/-/is-relative-1.0.0.tgz", - "integrity": "sha512-Kw/ReK0iqwKeu0MITLFuj0jbPAmEiOsIwyIXvvbfa6QfmN9pkD1M+8pdk7Rl/dTKbH34/XBFMbgD4iMJhLQbGA==", - "dev": true, - "requires": { - "is-unc-path": "^1.0.0" - } - }, - "is-typed-array": { - "version": "1.1.10", - "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.10.tgz", - "integrity": "sha512-PJqgEHiWZvMpaFZ3uTc8kHPM4+4ADTlDniuQL7cU/UDA0Ql7F70yGfHph3cLNe+c9toaigv+DFzTJKhc2CtO6A==", - "dev": true, - "requires": { - "available-typed-arrays": "^1.0.5", - "call-bind": "^1.0.2", - "for-each": "^0.3.3", - "gopd": "^1.0.1", - "has-tostringtag": "^1.0.0" - } - }, - "is-typedarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", - "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==", - "peer": true - }, - "is-unc-path": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-unc-path/-/is-unc-path-1.0.0.tgz", - "integrity": "sha512-mrGpVd0fs7WWLfVsStvgF6iEJnbjDFZh9/emhRDcGWTduTfNHd9CHeUwH3gYIjdbwo4On6hunkztwOaAw0yllQ==", - "dev": true, - "requires": { - "unc-path-regex": "^0.1.2" - } - }, - "is-utf8": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz", - "integrity": "sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=", - "dev": true - }, - "is-valid-glob": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-valid-glob/-/is-valid-glob-1.0.0.tgz", - "integrity": "sha1-Kb8+/3Ab4tTTFdusw5vDn+j2Aao=", - "dev": true - }, - "is-windows": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", - "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", - "dev": true - }, - "is-wsl": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-1.1.0.tgz", - "integrity": "sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0=", - "dev": true - }, - "isarray": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=" - }, - "isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=" - }, - "isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", - "dev": true - }, - "isstream": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", - "integrity": "sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g==", - "peer": true - }, - "istanbul-lib-coverage": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.0.tgz", - "integrity": "sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw==", - "dev": true - }, - "istanbul-lib-report": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", - "integrity": "sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw==", - "dev": true, - "requires": { - "istanbul-lib-coverage": "^3.0.0", - "make-dir": "^3.0.0", - "supports-color": "^7.1.0" - }, - "dependencies": { - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "istanbul-reports": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.5.tgz", - "integrity": "sha512-nUsEMa9pBt/NOHqbcbeJEgqIlY/K7rVWUX6Lql2orY5e9roQOthbR3vtY4zzf2orPELg80fnxxk9zUyPlgwD1w==", - "dev": true, - "requires": { - "html-escaper": "^2.0.0", - "istanbul-lib-report": "^3.0.0" - } - }, - "istextorbinary": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/istextorbinary/-/istextorbinary-2.2.1.tgz", - "integrity": "sha512-TS+hoFl8Z5FAFMK38nhBkdLt44CclNRgDHWeMgsV8ko3nDlr/9UI2Sf839sW7enijf8oKsZYXRvM8g0it9Zmcw==", - "dev": true, - "requires": { - "binaryextensions": "2", - "editions": "^1.3.3", - "textextensions": "2" - } - }, - "js-beautify": { - "version": "1.10.3", - "resolved": "https://registry.npmjs.org/js-beautify/-/js-beautify-1.10.3.tgz", - "integrity": "sha512-wfk/IAWobz1TfApSdivH5PJ0miIHgDoYb1ugSqHcODPmaYu46rYe5FVuIEkhjg8IQiv6rDNPyhsqbsohI/C2vQ==", - "dev": true, - "requires": { - "config-chain": "^1.1.12", - "editorconfig": "^0.15.3", - "glob": "^7.1.3", - "mkdirp": "~0.5.1", - "nopt": "~4.0.1" - }, - "dependencies": { - "nopt": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/nopt/-/nopt-4.0.3.tgz", - "integrity": "sha512-CvaGwVMztSMJLOeXPrez7fyfObdZqNUK1cPAEzLHrTybIua9pMdmmPR5YwtfNftIOMv3DPUhFaxsZMNTQO20Kg==", - "dev": true, - "requires": { - "abbrev": "1", - "osenv": "^0.1.4" - } - } - } - }, - "jsbn": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", - "integrity": "sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg==", - "peer": true - }, - "json-schema": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz", - "integrity": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==", - "peer": true - }, - "json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "peer": true - }, - "json-stable-stringify-without-jsonify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", - "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=", - "dev": true - }, - "json-stringify-safe": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", - "integrity": "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==", - "peer": true - }, - "jsonfile": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-3.0.1.tgz", - "integrity": "sha1-pezG9l9T9mLEQVx2daAzHQmS7GY=", - "dev": true, - "requires": { - "graceful-fs": "^4.1.6" - } - }, - "jsonparse": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/jsonparse/-/jsonparse-1.3.1.tgz", - "integrity": "sha1-P02uSpH6wxX3EGL4UhzCOfE2YoA=", - "dev": true - }, - "JSONStream": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/JSONStream/-/JSONStream-1.3.5.tgz", - "integrity": "sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ==", - "dev": true, - "requires": { - "jsonparse": "^1.2.0", - "through": ">=2.2.7 <3" - } - }, - "jsprim": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.2.tgz", - "integrity": "sha512-P2bSOMAc/ciLz6DzgjVlGJP9+BrJWu5UDGK70C2iweC5QBIeFf0ZXRvGjEj2uYgrY2MkAAhsSWHDWlFtEroZWw==", - "peer": true, - "requires": { - "assert-plus": "1.0.0", - "extsprintf": "1.3.0", - "json-schema": "0.4.0", - "verror": "1.10.0" - } - }, - "just-debounce": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/just-debounce/-/just-debounce-1.0.0.tgz", - "integrity": "sha1-h/zPrv/AtozRnVX2cilD+SnqNeo=", - "dev": true - }, - "just-extend": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/just-extend/-/just-extend-4.0.2.tgz", - "integrity": "sha512-FrLwOgm+iXrPV+5zDU6Jqu4gCRXbWEQg2O3SKONsWE4w7AXFRkryS53bpWdaL9cNol+AmR3AEYz6kn+o0fCPnw==", - "dev": true - }, - "kind-of": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", - "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", - "dev": true - }, - "labeled-stream-splicer": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/labeled-stream-splicer/-/labeled-stream-splicer-2.0.2.tgz", - "integrity": "sha512-Ca4LSXFFZUjPScRaqOcFxneA0VpKZr4MMYCljyQr4LIewTLb3Y0IUTIsnBBsVubIeEfxeSZpSjSsRM8APEQaAw==", - "dev": true, - "requires": { - "inherits": "^2.0.1", - "stream-splicer": "^2.0.0" - } - }, - "last-run": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/last-run/-/last-run-1.1.1.tgz", - "integrity": "sha1-RblpQsF7HHnHchmCWbqUO+v4yls=", - "dev": true, - "requires": { - "default-resolution": "^2.0.0", - "es6-weak-map": "^2.0.1" - } - }, - "lazystream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/lazystream/-/lazystream-1.0.0.tgz", - "integrity": "sha1-9plf4PggOS9hOWvolGJAe7dxaOQ=", - "dev": true, - "requires": { - "readable-stream": "^2.0.5" - }, - "dependencies": { - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", - "dev": true - }, - "readable-stream": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", - "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", - "dev": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, - "requires": { - "safe-buffer": "~5.1.0" - } - } - } - }, - "lcid": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/lcid/-/lcid-1.0.0.tgz", - "integrity": "sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU=", - "dev": true, - "requires": { - "invert-kv": "^1.0.0" - } - }, - "lead": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/lead/-/lead-1.0.0.tgz", - "integrity": "sha1-bxT5mje+Op3XhPVJVpDlkDRm7kI=", - "dev": true, - "requires": { - "flush-write-stream": "^1.0.2" - } - }, - "liftoff": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/liftoff/-/liftoff-3.1.0.tgz", - "integrity": "sha512-DlIPlJUkCV0Ips2zf2pJP0unEoT1kwYhiiPUGF3s/jtxTCjziNLoiVVh+jqWOWeFi6mmwQ5fNxvAUyPad4Dfog==", - "dev": true, - "requires": { - "extend": "^3.0.0", - "findup-sync": "^3.0.0", - "fined": "^1.0.1", - "flagged-respawn": "^1.0.0", - "is-plain-object": "^2.0.4", - "object.map": "^1.0.0", - "rechoir": "^0.6.2", - "resolve": "^1.1.7" - } - }, - "limiter": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/limiter/-/limiter-1.1.5.tgz", - "integrity": "sha512-FWWMIEOxz3GwUI4Ts/IvgVy6LPvoMPgjMdQ185nN6psJyBJ4yOpzqm695/h5umdLJg2vW3GR5iG11MAkR2AzJA==", - "dev": true - }, - "load-json-file": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz", - "integrity": "sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA=", - "dev": true, - "requires": { - "graceful-fs": "^4.1.2", - "parse-json": "^2.2.0", - "pify": "^2.0.0", - "pinkie-promise": "^2.0.0", - "strip-bom": "^2.0.0" - } - }, - "localtunnel": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/localtunnel/-/localtunnel-2.0.2.tgz", - "integrity": "sha512-n418Cn5ynvJd7m/N1d9WVJISLJF/ellZnfsLnx8WBWGzxv/ntNcFkJ1o6se5quUhCplfLGBNL5tYHiq5WF3Nug==", - "dev": true, - "requires": { - "axios": "0.21.4", - "debug": "4.3.2", - "openurl": "1.1.1", - "yargs": "17.1.1" - }, - "dependencies": { - "ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true - }, - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "cliui": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", - "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", - "dev": true, - "requires": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", - "wrap-ansi": "^7.0.0" - } - }, - "get-caller-file": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", - "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", - "dev": true - }, - "is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true - }, - "string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, - "requires": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - } - }, - "strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, - "requires": { - "ansi-regex": "^5.0.1" - } - }, - "wrap-ansi": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "dev": true, - "requires": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - } - }, - "y18n": { - "version": "5.0.8", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", - "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", - "dev": true - }, - "yargs": { - "version": "17.1.1", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.1.1.tgz", - "integrity": "sha512-c2k48R0PwKIqKhPMWjeiF6y2xY/gPMUlro0sgxqXpbOIohWiLNXWslsootttv7E1e73QPAMQSg5FeySbVcpsPQ==", - "dev": true, - "requires": { - "cliui": "^7.0.2", - "escalade": "^3.1.1", - "get-caller-file": "^2.0.5", - "require-directory": "^2.1.1", - "string-width": "^4.2.0", - "y18n": "^5.0.5", - "yargs-parser": "^20.2.2" - } - } - } - }, - "locate-path": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", - "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", - "dev": true, - "requires": { - "p-locate": "^5.0.0" - } - }, - "lodash": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", - "dev": true - }, - "lodash._reinterpolate": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/lodash._reinterpolate/-/lodash._reinterpolate-3.0.0.tgz", - "integrity": "sha1-DM8tiRZq8Ds2Y8eWU4t1rG4RTZ0=", - "dev": true - }, - "lodash.isfinite": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/lodash.isfinite/-/lodash.isfinite-3.3.2.tgz", - "integrity": "sha512-7FGG40uhC8Mm633uKW1r58aElFlBlxCrg9JfSi3P6aYiWmfiWF0PgMd86ZUsxE5GwWPdHoS2+48bwTh2VPkIQA==", - "dev": true - }, - "lodash.memoize": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-3.0.4.tgz", - "integrity": "sha1-LcvSwofLwKVcxCMovQxzYVDVPj8=", - "dev": true - }, - "lodash.template": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/lodash.template/-/lodash.template-4.5.0.tgz", - "integrity": "sha512-84vYFxIkmidUiFxidA/KjjH9pAycqW+h980j7Fuz5qxRtO9pgB7MDFTdys1N7A5mcucRiDyEq4fusljItR1T/A==", - "dev": true, - "requires": { - "lodash._reinterpolate": "^3.0.0", - "lodash.templatesettings": "^4.0.0" - } - }, - "lodash.templatesettings": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/lodash.templatesettings/-/lodash.templatesettings-4.2.0.tgz", - "integrity": "sha512-stgLz+i3Aa9mZgnjr/O+v9ruKZsPsndy7qPZOchbqk2cnTU1ZaldKK+v7m54WoKIyxiuMZTKT2H81F8BeAc3ZQ==", - "dev": true, - "requires": { - "lodash._reinterpolate": "^3.0.0" - } - }, - "lolex": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/lolex/-/lolex-4.1.0.tgz", - "integrity": "sha512-BYxIEXiVq5lGIXeVHnsFzqa1TxN5acnKnPCdlZSpzm8viNEOhiigupA4vTQ9HEFQ6nLTQ9wQOgBknJgzUYQ9Aw==", - "dev": true - }, - "lru-cache": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz", - "integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==", - "dev": true, - "requires": { - "pseudomap": "^1.0.2", - "yallist": "^2.1.2" - }, - "dependencies": { - "yallist": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", - "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=", - "dev": true - } - } - }, - "make-dir": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", - "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", - "dev": true, - "requires": { - "semver": "^6.0.0" - }, - "dependencies": { - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true - } - } - }, - "make-fetch-happen": { - "version": "10.1.8", - "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-10.1.8.tgz", - "integrity": "sha512-0ASJbG12Au6+N5I84W+8FhGS6iM8MyzvZady+zaQAu+6IOaESFzCLLD0AR1sAFF3Jufi8bxm586ABN6hWd3k7g==", - "requires": { - "agentkeepalive": "^4.2.1", - "cacache": "^16.1.0", - "http-cache-semantics": "^4.1.0", - "http-proxy-agent": "^5.0.0", - "https-proxy-agent": "^5.0.0", - "is-lambda": "^1.0.1", - "lru-cache": "^7.7.1", - "minipass": "^3.1.6", - "minipass-collect": "^1.0.2", - "minipass-fetch": "^2.0.3", - "minipass-flush": "^1.0.5", - "minipass-pipeline": "^1.2.4", - "negotiator": "^0.6.3", - "promise-retry": "^2.0.1", - "socks-proxy-agent": "^7.0.0", - "ssri": "^9.0.0" - }, - "dependencies": { - "lru-cache": { - "version": "7.12.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.12.0.tgz", - "integrity": "sha512-OIP3DwzRZDfLg9B9VP/huWBlpvbkmbfiBy8xmsXp4RPmE4A3MhwNozc5ZJ3fWnSg8fDcdlE/neRTPG2ycEKliw==" - }, - "negotiator": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", - "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==" - } - } - }, - "make-iterator": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/make-iterator/-/make-iterator-1.0.1.tgz", - "integrity": "sha512-pxiuXh0iVEq7VM7KMIhs5gxsfxCux2URptUQaXo4iZZJxBAzTPOLE2BumO5dbfVYq/hBJFBR/a1mFDmOx5AGmw==", - "dev": true, - "requires": { - "kind-of": "^6.0.2" - } - }, - "map-cache": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", - "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=", - "dev": true - }, - "map-visit": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz", - "integrity": "sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=", - "dev": true, - "requires": { - "object-visit": "^1.0.0" - } - }, - "matchdep": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/matchdep/-/matchdep-2.0.0.tgz", - "integrity": "sha1-xvNINKDY28OzfCfui7yyfHd1WC4=", - "dev": true, - "requires": { - "findup-sync": "^2.0.0", - "micromatch": "^3.0.4", - "resolve": "^1.4.0", - "stack-trace": "0.0.10" - }, - "dependencies": { - "findup-sync": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-2.0.0.tgz", - "integrity": "sha1-kyaxSIwi0aYIhlCoaQGy2akKLLw=", - "dev": true, - "requires": { - "detect-file": "^1.0.0", - "is-glob": "^3.1.0", - "micromatch": "^3.0.4", - "resolve-dir": "^1.0.1" - } - }, - "is-glob": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", - "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", - "dev": true, - "requires": { - "is-extglob": "^2.1.0" - } - } - } - }, - "md5.js": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.5.tgz", - "integrity": "sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==", - "dev": true, - "requires": { - "hash-base": "^3.0.0", - "inherits": "^2.0.1", - "safe-buffer": "^5.1.2" - } - }, - "merge-stream": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-1.0.1.tgz", - "integrity": "sha1-QEEgLVCKNCugAXQAjfDCUbjBNeE=", - "dev": true, - "requires": { - "readable-stream": "^2.0.1" - }, - "dependencies": { - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", - "dev": true - }, - "readable-stream": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", - "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", - "dev": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, - "requires": { - "safe-buffer": "~5.1.0" - } - } - } - }, - "merge2": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.2.3.tgz", - "integrity": "sha512-gdUU1Fwj5ep4kplwcmftruWofEFt6lfpkkr3h860CXbAB9c3hGb55EOL2ali0Td5oebvW0E1+3Sr+Ur7XfKpRA==", - "dev": true - }, - "micromatch": { - "version": "3.1.10", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", - "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", - "dev": true, - "requires": { - "arr-diff": "^4.0.0", - "array-unique": "^0.3.2", - "braces": "^2.3.1", - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "extglob": "^2.0.4", - "fragment-cache": "^0.2.1", - "kind-of": "^6.0.2", - "nanomatch": "^1.2.9", - "object.pick": "^1.3.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.2" - } - }, - "miller-rabin": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/miller-rabin/-/miller-rabin-4.0.1.tgz", - "integrity": "sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==", - "dev": true, - "requires": { - "bn.js": "^4.0.0", - "brorand": "^1.0.1" - } - }, - "mime": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/mime/-/mime-1.4.1.tgz", - "integrity": "sha512-KI1+qOZu5DcW6wayYHSzR/tXKCDC5Om4s1z2QJjDULzLcmf3DvzS7oluY4HCTrc+9FiKmWUgeNLg7W3uIQvxtQ==", - "dev": true - }, - "mime-db": { - "version": "1.40.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.40.0.tgz", - "integrity": "sha512-jYdeOMPy9vnxEqFRRo6ZvTZ8d9oPb+k18PKoYNYUe2stVEBPPwsln/qWzdbmaIvnhZ9v2P+CuecK+fpUfsV2mA==" - }, - "mime-types": { - "version": "2.1.24", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.24.tgz", - "integrity": "sha512-WaFHS3MCl5fapm3oLxU4eYDw77IQM2ACcxQ9RIxfaC3ooc6PFuBMGZZsYpvoXS5D5QTWPieo1jjLdAm3TBP3cQ==", - "requires": { - "mime-db": "1.40.0" - } - }, - "mimic-response": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz", - "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==" - }, - "minimalistic-assert": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", - "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==", - "dev": true - }, - "minimalistic-crypto-utils": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz", - "integrity": "sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo=", - "dev": true - }, - "minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "requires": { - "brace-expansion": "^1.1.7" - } - }, - "minimist": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.7.tgz", - "integrity": "sha512-bzfL1YUZsP41gmu/qjrEk0Q6i2ix/cVeAhbCbqH9u3zYutS1cLg00qhrD0M2MVdCcx4Sc0UpP2eBWo9rotpq6g==" - }, - "minipass": { - "version": "3.3.4", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.4.tgz", - "integrity": "sha512-I9WPbWHCGu8W+6k1ZiGpPu0GkoKBeorkfKNuAFBNS1HNFJvke82sxvI5bzcCNpWPorkOO5QQ+zomzzwRxejXiw==", - "requires": { - "yallist": "^4.0.0" - } - }, - "minipass-collect": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/minipass-collect/-/minipass-collect-1.0.2.tgz", - "integrity": "sha512-6T6lH0H8OG9kITm/Jm6tdooIbogG9e0tLgpY6mphXSm/A9u8Nq1ryBG+Qspiub9LjWlBPsPS3tWQ/Botq4FdxA==", - "requires": { - "minipass": "^3.0.0" - } - }, - "minipass-fetch": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-2.1.0.tgz", - "integrity": "sha512-H9U4UVBGXEyyWJnqYDCLp1PwD8XIkJ4akNHp1aGVI+2Ym7wQMlxDKi4IB4JbmyU+pl9pEs/cVrK6cOuvmbK4Sg==", - "requires": { - "encoding": "^0.1.13", - "minipass": "^3.1.6", - "minipass-sized": "^1.0.3", - "minizlib": "^2.1.2" - } - }, - "minipass-flush": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/minipass-flush/-/minipass-flush-1.0.5.tgz", - "integrity": "sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw==", - "requires": { - "minipass": "^3.0.0" - } - }, - "minipass-pipeline": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/minipass-pipeline/-/minipass-pipeline-1.2.4.tgz", - "integrity": "sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A==", - "requires": { - "minipass": "^3.0.0" - } - }, - "minipass-sized": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/minipass-sized/-/minipass-sized-1.0.3.tgz", - "integrity": "sha512-MbkQQ2CTiBMlA2Dm/5cY+9SWFEN8pzzOXi6rlM5Xxq0Yqbda5ZQy9sU75a673FE9ZK0Zsbr6Y5iP6u9nktfg2g==", - "requires": { - "minipass": "^3.0.0" - } - }, - "minizlib": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz", - "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==", - "requires": { - "minipass": "^3.0.0", - "yallist": "^4.0.0" - } - }, - "mitt": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/mitt/-/mitt-1.2.0.tgz", - "integrity": "sha512-r6lj77KlwqLhIUku9UWYes7KJtsczvolZkzp8hbaDPPaE24OmWl5s539Mytlj22siEQKosZ26qCBgda2PKwoJw==", - "dev": true - }, - "mixin-deep": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.2.tgz", - "integrity": "sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==", - "dev": true, - "requires": { - "for-in": "^1.0.2", - "is-extendable": "^1.0.1" - }, - "dependencies": { - "is-extendable": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", - "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", - "dev": true, - "requires": { - "is-plain-object": "^2.0.4" - } - } - } - }, - "mkdirp": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.3.tgz", - "integrity": "sha512-P+2gwrFqx8lhew375MQHHeTlY8AuOJSrGf0R5ddkEndUkmwpgUob/vQuBD1V22/Cw1/lJr4x+EjllSezBThzBg==", - "dev": true, - "requires": { - "minimist": "^1.2.5" - } - }, - "mkdirp-classic": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz", - "integrity": "sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==" - }, - "module-deps": { - "version": "6.2.3", - "resolved": "https://registry.npmjs.org/module-deps/-/module-deps-6.2.3.tgz", - "integrity": "sha512-fg7OZaQBcL4/L+AK5f4iVqf9OMbCclXfy/znXRxTVhJSeW5AIlS9AwheYwDaXM3lVW7OBeaeUEY3gbaC6cLlSA==", - "dev": true, - "requires": { - "browser-resolve": "^2.0.0", - "cached-path-relative": "^1.0.2", - "concat-stream": "~1.6.0", - "defined": "^1.0.0", - "detective": "^5.2.0", - "duplexer2": "^0.1.2", - "inherits": "^2.0.1", - "JSONStream": "^1.0.3", - "parents": "^1.0.0", - "readable-stream": "^2.0.2", - "resolve": "^1.4.0", - "stream-combiner2": "^1.1.1", - "subarg": "^1.0.0", - "through2": "^2.0.0", - "xtend": "^4.0.0" - }, - "dependencies": { - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", - "dev": true - }, - "readable-stream": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", - "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", - "dev": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, - "requires": { - "safe-buffer": "~5.1.0" - } - }, - "through2": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", - "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", - "dev": true, - "requires": { - "readable-stream": "~2.3.6", - "xtend": "~4.0.1" - } - } - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" - }, - "mute-stdout": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/mute-stdout/-/mute-stdout-1.0.1.tgz", - "integrity": "sha512-kDcwXR4PS7caBpuRYYBUz9iVixUk3anO3f5OYFiIPwK/20vCzKCHyKoulbiDY1S53zD2bxUpxN/IJ+TnXjfvxg==", - "dev": true - }, - "nan": { - "version": "2.17.0", - "resolved": "https://registry.npmjs.org/nan/-/nan-2.17.0.tgz", - "integrity": "sha512-2ZTgtl0nJsO0KQCjEpxcIr5D+Yv90plTitZt9JBfQvVJDS5seMl3FOvsh3+9CoYWXf/1l5OaZzzF6nDm4cagaQ==" - }, - "nanomatch": { - "version": "1.2.13", - "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz", - "integrity": "sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==", - "dev": true, - "requires": { - "arr-diff": "^4.0.0", - "array-unique": "^0.3.2", - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "fragment-cache": "^0.2.1", - "is-windows": "^1.0.2", - "kind-of": "^6.0.2", - "object.pick": "^1.3.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" - } - }, - "napi-build-utils": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/napi-build-utils/-/napi-build-utils-1.0.2.tgz", - "integrity": "sha512-ONmRUqK7zj7DWX0D9ADe03wbwOBZxNAfF20PlGfCWQcD3+/MakShIHrMqx9YwPTfxDdF1zLeL+RGZiR9kGMLdg==" - }, - "negotiator": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz", - "integrity": "sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw==", - "dev": true - }, - "next-tick": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/next-tick/-/next-tick-1.0.0.tgz", - "integrity": "sha1-yobR/ogoFpsBICCOPchCS524NCw=", - "dev": true - }, - "nise": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/nise/-/nise-1.5.0.tgz", - "integrity": "sha512-Z3sfYEkLFzFmL8KY6xnSJLRxwQwYBjOXi/24lb62ZnZiGA0JUzGGTI6TBIgfCSMIDl9Jlu8SRmHNACLTemDHww==", - "dev": true, - "requires": { - "@sinonjs/formatio": "^3.1.0", - "@sinonjs/text-encoding": "^0.7.1", - "just-extend": "^4.0.2", - "lolex": "^4.1.0", - "path-to-regexp": "^1.7.0" - } - }, - "node-abi": { - "version": "3.22.0", - "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-3.22.0.tgz", - "integrity": "sha512-u4uAs/4Zzmp/jjsD9cyFYDXeISfUWaAVWshPmDZOFOv4Xl4SbzTXm53I04C2uRueYJ+0t5PEtLH/owbn2Npf/w==", - "requires": { - "semver": "^7.3.5" - }, - "dependencies": { - "lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "requires": { - "yallist": "^4.0.0" - } - }, - "semver": { - "version": "7.3.7", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz", - "integrity": "sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==", - "requires": { - "lru-cache": "^6.0.0" - } - } - } - }, - "node-gyp": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-9.0.0.tgz", - "integrity": "sha512-Ma6p4s+XCTPxCuAMrOA/IJRmVy16R8Sdhtwl4PrCr7IBlj4cPawF0vg/l7nOT1jPbuNS7lIRJpBSvVsXwEZuzw==", - "requires": { - "env-paths": "^2.2.0", - "glob": "^7.1.4", - "graceful-fs": "^4.2.6", - "make-fetch-happen": "^10.0.3", - "nopt": "^5.0.0", - "npmlog": "^6.0.0", - "rimraf": "^3.0.2", - "semver": "^7.3.5", - "tar": "^6.1.2", - "which": "^2.0.2" - }, - "dependencies": { - "lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "requires": { - "yallist": "^4.0.0" - } - }, - "semver": { - "version": "7.3.7", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz", - "integrity": "sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==", - "requires": { - "lru-cache": "^6.0.0" - } - }, - "which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "requires": { - "isexe": "^2.0.0" - } - } - } - }, - "node-watch": { - "version": "0.7.3", - "resolved": "https://registry.npmjs.org/node-watch/-/node-watch-0.7.3.tgz", - "integrity": "sha512-3l4E8uMPY1HdMMryPRUAl+oIHtXtyiTlIiESNSVSNxcPfzAFzeTbXFQkZfAwBbo0B1qMSG8nUABx+Gd+YrbKrQ==", - "dev": true - }, - "noop-logger": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/noop-logger/-/noop-logger-0.1.1.tgz", - "integrity": "sha512-6kM8CLXvuW5crTxsAtva2YLrRrDaiTIkIePWs9moLHqbFWT94WpNFjwS/5dfLfECg5i/lkmw3aoqVidxt23TEQ==", - "peer": true - }, - "nopt": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/nopt/-/nopt-5.0.0.tgz", - "integrity": "sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ==", - "requires": { - "abbrev": "1" - } - }, - "normalize-package-data": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", - "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", - "dev": true, - "requires": { - "hosted-git-info": "^2.1.4", - "resolve": "^1.10.0", - "semver": "2 || 3 || 4 || 5", - "validate-npm-package-license": "^3.0.1" - } - }, - "normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", - "dev": true - }, - "now-and-later": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/now-and-later/-/now-and-later-2.0.1.tgz", - "integrity": "sha512-KGvQ0cB70AQfg107Xvs/Fbu+dGmZoTRJp2TaPwcwQm3/7PteUyN2BCgk8KBMPGBUXZdVwyWS8fDCGFygBm19UQ==", - "dev": true, - "requires": { - "once": "^1.3.2" - } - }, - "npmlog": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-6.0.2.tgz", - "integrity": "sha512-/vBvz5Jfr9dT/aFWd0FIRf+T/Q2WBsLENygUaFUqstqsycmZAP/t5BvFJTK0viFmSUxiUKTUplWy5vt+rvKIxg==", - "requires": { - "are-we-there-yet": "^3.0.0", - "console-control-strings": "^1.1.0", - "gauge": "^4.0.3", - "set-blocking": "^2.0.0" - } - }, - "number-is-nan": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", - "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=" - }, - "o-stream": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/o-stream/-/o-stream-0.3.0.tgz", - "integrity": "sha512-gbzl6qCJZ609x/M2t25HqCYQagFzWYCtQ84jcuObGr+V8D1Am4EVubkF4J+XFs6ukfiv96vNeiBb8FrbbMZYiQ==", - "dev": true - }, - "oauth-sign": { - "version": "0.9.0", - "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", - "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==", - "peer": true - }, - "object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=" - }, - "object-copy": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz", - "integrity": "sha1-fn2Fi3gb18mRpBupde04EnVOmYw=", - "dev": true, - "requires": { - "copy-descriptor": "^0.1.0", - "define-property": "^0.2.5", - "kind-of": "^3.0.3" - }, - "dependencies": { - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, - "requires": { - "is-descriptor": "^0.1.0" - } - }, - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "object-keys": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", - "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", - "dev": true - }, - "object-visit": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz", - "integrity": "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=", - "dev": true, - "requires": { - "isobject": "^3.0.0" - } - }, - "object.assign": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.0.tgz", - "integrity": "sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w==", - "dev": true, - "requires": { - "define-properties": "^1.1.2", - "function-bind": "^1.1.1", - "has-symbols": "^1.0.0", - "object-keys": "^1.0.11" - } - }, - "object.defaults": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/object.defaults/-/object.defaults-1.1.0.tgz", - "integrity": "sha1-On+GgzS0B96gbaFtiNXNKeQ1/s8=", - "dev": true, - "requires": { - "array-each": "^1.0.1", - "array-slice": "^1.0.0", - "for-own": "^1.0.0", - "isobject": "^3.0.0" - } - }, - "object.map": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/object.map/-/object.map-1.0.1.tgz", - "integrity": "sha1-z4Plncj8wK1fQlDh94s7gb2AHTc=", - "dev": true, - "requires": { - "for-own": "^1.0.0", - "make-iterator": "^1.0.0" - } - }, - "object.pick": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", - "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=", - "dev": true, - "requires": { - "isobject": "^3.0.1" - } - }, - "object.reduce": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/object.reduce/-/object.reduce-1.0.1.tgz", - "integrity": "sha1-b+NI8qx/oPlcpiEiZZkJaCW7A60=", - "dev": true, - "requires": { - "for-own": "^1.0.0", - "make-iterator": "^1.0.0" - } - }, - "on-finished": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", - "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", - "dev": true, - "requires": { - "ee-first": "1.1.1" - } - }, - "once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", - "requires": { - "wrappy": "1" - } - }, - "openurl": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/openurl/-/openurl-1.1.1.tgz", - "integrity": "sha512-d/gTkTb1i1GKz5k3XE3XFV/PxQ1k45zDqGP2OA7YhgsaLoqm6qRvARAZOFer1fcXritWlGBRCu/UgeS4HAnXAA==", - "dev": true - }, - "opn": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/opn/-/opn-5.3.0.tgz", - "integrity": "sha512-bYJHo/LOmoTd+pfiYhfZDnf9zekVJrY+cnS2a5F2x+w5ppvTqObojTP7WiFG+kVZs9Inw+qQ/lw7TroWwhdd2g==", - "dev": true, - "requires": { - "is-wsl": "^1.1.0" - } - }, - "ordered-read-streams": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/ordered-read-streams/-/ordered-read-streams-1.0.1.tgz", - "integrity": "sha1-d8DLN8QVJdZBZtmQ/61+xqDhNj4=", - "dev": true, - "requires": { - "readable-stream": "^2.0.1" - }, - "dependencies": { - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", - "dev": true - }, - "readable-stream": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", - "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", - "dev": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, - "requires": { - "safe-buffer": "~5.1.0" - } - } - } - }, - "os-browserify": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/os-browserify/-/os-browserify-0.3.0.tgz", - "integrity": "sha1-hUNzx/XCMVkU/Jv8a9gjj92h7Cc=", - "dev": true - }, - "os-homedir": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", - "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=", - "dev": true - }, - "os-locale": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-1.4.0.tgz", - "integrity": "sha1-IPnxeuKe00XoveWDsT0gCYA8FNk=", - "dev": true, - "requires": { - "lcid": "^1.0.0" - } - }, - "os-tmpdir": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", - "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", - "dev": true - }, - "osenv": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/osenv/-/osenv-0.1.5.tgz", - "integrity": "sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g==", - "dev": true, - "requires": { - "os-homedir": "^1.0.0", - "os-tmpdir": "^1.0.0" - } - }, - "p-limit": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", - "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", - "dev": true, - "requires": { - "yocto-queue": "^0.1.0" - } - }, - "p-locate": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", - "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", - "dev": true, - "requires": { - "p-limit": "^3.0.2" - } - }, - "p-map": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz", - "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==", - "requires": { - "aggregate-error": "^3.0.0" - } - }, - "pako": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.10.tgz", - "integrity": "sha512-0DTvPVU3ed8+HNXOu5Bs+o//Mbdj9VNQMUOe9oKCwh8l0GNwpTDMKCWbRjgtD291AWnkAgkqA/LOnQS8AmS1tw==", - "dev": true - }, - "parents": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/parents/-/parents-1.0.1.tgz", - "integrity": "sha512-mXKF3xkoUt5td2DoxpLmtOmZvko9VfFpwRwkKDHSNvgmpLAeBo18YDhcPbBzJq+QLCHMbGOfzia2cX4U+0v9Mg==", - "dev": true, - "requires": { - "path-platform": "~0.11.15" - } - }, - "parse-asn1": { - "version": "5.1.4", - "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.4.tgz", - "integrity": "sha512-Qs5duJcuvNExRfFZ99HDD3z4mAi3r9Wl/FOjEOijlxwCZs7E7mW2vjTpgQ4J8LpTF8x5v+1Vn5UQFejmWT11aw==", - "dev": true, - "requires": { - "asn1.js": "^4.0.0", - "browserify-aes": "^1.0.0", - "create-hash": "^1.1.0", - "evp_bytestokey": "^1.0.0", - "pbkdf2": "^3.0.3", - "safe-buffer": "^5.1.1" - } - }, - "parse-filepath": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/parse-filepath/-/parse-filepath-1.0.2.tgz", - "integrity": "sha1-pjISf1Oq89FYdvWHLz/6x2PWyJE=", - "dev": true, - "requires": { - "is-absolute": "^1.0.0", - "map-cache": "^0.2.0", - "path-root": "^0.1.1" - } - }, - "parse-json": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", - "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=", - "dev": true, - "requires": { - "error-ex": "^1.2.0" - } - }, - "parse-node-version": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/parse-node-version/-/parse-node-version-1.0.1.tgz", - "integrity": "sha512-3YHlOa/JgH6Mnpr05jP9eDG254US9ek25LyIxZlDItp2iJtwyaXQb57lBYLdT3MowkUFYEV2XXNAYIPlESvJlA==", - "dev": true - }, - "parse-passwd": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/parse-passwd/-/parse-passwd-1.0.0.tgz", - "integrity": "sha1-bVuTSkVpk7I9N/QKOC1vFmao5cY=", - "dev": true - }, - "parseurl": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", - "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", - "dev": true - }, - "pascalcase": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz", - "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=", - "dev": true - }, - "path-browserify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-1.0.1.tgz", - "integrity": "sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==", - "dev": true - }, - "path-dirname": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/path-dirname/-/path-dirname-1.0.2.tgz", - "integrity": "sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA=", - "dev": true - }, - "path-exists": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", - "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=", - "dev": true, - "requires": { - "pinkie-promise": "^2.0.0" - } - }, - "path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=" - }, - "path-key": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", - "dev": true - }, - "path-parse": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", - "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", - "dev": true - }, - "path-platform": { - "version": "0.11.15", - "resolved": "https://registry.npmjs.org/path-platform/-/path-platform-0.11.15.tgz", - "integrity": "sha512-Y30dB6rab1A/nfEKsZxmr01nUotHX0c/ZiIAsCTatEe1CmS5Pm5He7fZ195bPT7RdquoaL8lLxFCMQi/bS7IJg==", - "dev": true - }, - "path-root": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/path-root/-/path-root-0.1.1.tgz", - "integrity": "sha1-mkpoFMrBwM1zNgqV8yCDyOpHRbc=", - "dev": true, - "requires": { - "path-root-regex": "^0.1.0" - } - }, - "path-root-regex": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/path-root-regex/-/path-root-regex-0.1.2.tgz", - "integrity": "sha1-v8zcjfWxLcUsi0PsONGNcsBLqW0=", - "dev": true - }, - "path-sort2": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/path-sort2/-/path-sort2-1.0.0.tgz", - "integrity": "sha512-OwUzmr3+avyEANhpUkUv+nlwAM/sCX5y9Ylok8fj3OK3SmLclq7jyEoqSL5qi+5bJAOskWGZPtdtjnoRGy5lxA==", - "dev": true - }, - "path-to-regexp": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-1.7.0.tgz", - "integrity": "sha1-Wf3g9DW62suhA6hOnTvGTpa5k30=", - "dev": true, - "requires": { - "isarray": "0.0.1" - } - }, - "path-type": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz", - "integrity": "sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE=", - "dev": true, - "requires": { - "graceful-fs": "^4.1.2", - "pify": "^2.0.0", - "pinkie-promise": "^2.0.0" - } - }, - "pbkdf2": { - "version": "3.0.17", - "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.0.17.tgz", - "integrity": "sha512-U/il5MsrZp7mGg3mSQfn742na2T+1/vHDCG5/iTI3X9MKUuYUZVLQhyRsg06mCgDBTd57TxzgZt7P+fYfjRLtA==", - "dev": true, - "requires": { - "create-hash": "^1.1.2", - "create-hmac": "^1.1.4", - "ripemd160": "^2.0.1", - "safe-buffer": "^5.0.1", - "sha.js": "^2.4.8" - } - }, - "performance-now": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", - "integrity": "sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==", - "peer": true - }, - "picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "dev": true - }, - "pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", - "dev": true - }, - "pinkie": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", - "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=", - "dev": true - }, - "pinkie-promise": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", - "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", - "dev": true, - "requires": { - "pinkie": "^2.0.0" - } - }, - "platform": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/platform/-/platform-1.3.5.tgz", - "integrity": "sha512-TuvHS8AOIZNAlE77WUDiR4rySV/VMptyMfcfeoMgs4P8apaZM3JrnbzBiixKUv+XR6i+BXrQh8WAnjaSPFO65Q==", - "dev": true - }, - "plugin-error": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/plugin-error/-/plugin-error-0.1.2.tgz", - "integrity": "sha1-O5uzM1zPAPQl4HQ34ZJ2ln2kes4=", - "dev": true, - "requires": { - "ansi-cyan": "^0.1.1", - "ansi-red": "^0.1.1", - "arr-diff": "^1.0.1", - "arr-union": "^2.0.1", - "extend-shallow": "^1.1.2" - }, - "dependencies": { - "arr-diff": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-1.1.0.tgz", - "integrity": "sha1-aHwydYFjWI/vfeezb6vklesaOZo=", - "dev": true, - "requires": { - "arr-flatten": "^1.0.1", - "array-slice": "^0.2.3" - } - }, - "arr-union": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-2.1.0.tgz", - "integrity": "sha1-IPnqtexw9cfSFbEHexw5Fh0pLH0=", - "dev": true - }, - "array-slice": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/array-slice/-/array-slice-0.2.3.tgz", - "integrity": "sha1-3Tz7gO15c6dRF82sabC5nshhhvU=", - "dev": true - }, - "extend-shallow": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-1.1.4.tgz", - "integrity": "sha1-Gda/lN/AnXa6cR85uHLSH/TdkHE=", - "dev": true, - "requires": { - "kind-of": "^1.1.0" - } - }, - "kind-of": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-1.1.0.tgz", - "integrity": "sha1-FAo9LUGjbS78+pN3tiwk+ElaXEQ=", - "dev": true - } - } - }, - "portscanner": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/portscanner/-/portscanner-2.2.0.tgz", - "integrity": "sha512-IFroCz/59Lqa2uBvzK3bKDbDDIEaAY8XJ1jFxcLWTqosrsc32//P4VuSB2vZXoHiHqOmx8B5L5hnKOxL/7FlPw==", - "dev": true, - "requires": { - "async": "^2.6.0", - "is-number-like": "^1.0.3" - } - }, - "posix-character-classes": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz", - "integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=", - "dev": true - }, - "prebuild-install": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/prebuild-install/-/prebuild-install-7.1.1.tgz", - "integrity": "sha512-jAXscXWMcCK8GgCoHOfIr0ODh5ai8mj63L2nWrjuAgXE6tDyYGnx4/8o/rCgU+B4JSyZBKbeZqzhtwtC3ovxjw==", - "requires": { - "detect-libc": "^2.0.0", - "expand-template": "^2.0.3", - "github-from-package": "0.0.0", - "minimist": "^1.2.3", - "mkdirp-classic": "^0.5.3", - "napi-build-utils": "^1.0.1", - "node-abi": "^3.3.0", - "pump": "^3.0.0", - "rc": "^1.2.7", - "simple-get": "^4.0.0", - "tar-fs": "^2.0.0", - "tunnel-agent": "^0.6.0" - }, - "dependencies": { - "pump": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", - "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", - "requires": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" - } - } - } - }, - "pretty-hrtime": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/pretty-hrtime/-/pretty-hrtime-1.0.3.tgz", - "integrity": "sha1-t+PqQkNaTJsnWdmeDyAesZWALuE=", - "dev": true - }, - "process": { - "version": "0.11.10", - "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", - "integrity": "sha1-czIwDoQBYb2j5podHZGn1LwW8YI=", - "dev": true - }, - "process-nextick-args": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", - "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" - }, - "promise-inflight": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/promise-inflight/-/promise-inflight-1.0.1.tgz", - "integrity": "sha512-6zWPyEOFaQBJYcGMHBKTKJ3u6TBsnMFOIZSa6ce1e/ZrrsOlnHRHbabMjLiBYKp+n44X9eUI6VUPaukCXHuG4g==" - }, - "promise-retry": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/promise-retry/-/promise-retry-2.0.1.tgz", - "integrity": "sha512-y+WKFlBR8BGXnsNlIHFGPZmyDf3DFMoLhaflAnyZgV6rG6xu+JwesTo2Q9R6XwYmtmwAFCkAk3e35jEdoeh/3g==", - "requires": { - "err-code": "^2.0.2", - "retry": "^0.12.0" - } - }, - "proto-list": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/proto-list/-/proto-list-1.2.4.tgz", - "integrity": "sha1-IS1b/hMYMGpCD2QCuOJv85ZHqEk=", - "dev": true - }, - "pseudomap": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", - "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=", - "dev": true - }, - "psl": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/psl/-/psl-1.9.0.tgz", - "integrity": "sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==", - "peer": true - }, - "public-encrypt": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.3.tgz", - "integrity": "sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q==", - "dev": true, - "requires": { - "bn.js": "^4.1.0", - "browserify-rsa": "^4.0.0", - "create-hash": "^1.1.0", - "parse-asn1": "^5.0.0", - "randombytes": "^2.0.1", - "safe-buffer": "^5.1.2" - } - }, - "pump": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/pump/-/pump-2.0.1.tgz", - "integrity": "sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA==", - "dev": true, - "requires": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" - } - }, - "pumpify": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/pumpify/-/pumpify-1.5.1.tgz", - "integrity": "sha512-oClZI37HvuUJJxSKKrC17bZ9Cu0ZYhEAGPsPUy9KlMUmv9dKX2o77RUmq7f3XjIxbwyGwYzbzQ1L2Ks8sIradQ==", - "dev": true, - "requires": { - "duplexify": "^3.6.0", - "inherits": "^2.0.3", - "pump": "^2.0.0" - } - }, - "punycode": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", - "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", - "peer": true - }, - "qs": { - "version": "6.5.3", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.3.tgz", - "integrity": "sha512-qxXIEh4pCGfHICj1mAJQ2/2XVZkjCDTcEgfoSQxc/fYivUZxTkk7L3bDBJSoNrEzXI17oUO5Dp07ktqE5KzczA==", - "peer": true - }, - "querystring": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz", - "integrity": "sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA=", - "dev": true - }, - "querystring-es3": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/querystring-es3/-/querystring-es3-0.2.1.tgz", - "integrity": "sha1-nsYfeQSYdXB9aUFFlv2Qek1xHnM=", - "dev": true - }, - "qunit": { - "version": "2.19.3", - "resolved": "https://registry.npmjs.org/qunit/-/qunit-2.19.3.tgz", - "integrity": "sha512-vEnspSZ37u2oR01OA/IZ1Td5V7BvQYFECdKPv86JaBplDNa5IHg0v7jFSPoP5L5o78Dbi8sl7/ATtpRDAKlSdw==", - "dev": true, - "requires": { - "commander": "7.2.0", - "node-watch": "0.7.3", - "tiny-glob": "0.2.9" - }, - "dependencies": { - "commander": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", - "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", - "dev": true - } - } - }, - "randombytes": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", - "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", - "dev": true, - "requires": { - "safe-buffer": "^5.1.0" - } - }, - "randomfill": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/randomfill/-/randomfill-1.0.4.tgz", - "integrity": "sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw==", - "dev": true, - "requires": { - "randombytes": "^2.0.5", - "safe-buffer": "^5.1.0" - } - }, - "range-parser": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", - "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", - "dev": true - }, - "raw-body": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.1.tgz", - "integrity": "sha512-9WmIKF6mkvA0SLmA2Knm9+qj89e+j1zqgyn8aXGd7+nAduPoqgI9lO57SAZNn/Byzo5P7JhXTyg9PzaJbH73bA==", - "dev": true, - "requires": { - "bytes": "3.1.0", - "http-errors": "1.7.3", - "iconv-lite": "0.4.24", - "unpipe": "1.0.0" - } - }, - "rc": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", - "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", - "requires": { - "deep-extend": "^0.6.0", - "ini": "~1.3.0", - "minimist": "^1.2.0", - "strip-json-comments": "~2.0.1" - } - }, - "read-dir-deep": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/read-dir-deep/-/read-dir-deep-7.0.1.tgz", - "integrity": "sha512-w99fvgqJm3cJ5Vb7b3oGKRDnm/m11q7w5LQ9uBCXe+repIEf1rFtkXLlPAxNrSwlp4skyPyvKd4DNNiIuc0geg==", - "dev": true, - "requires": { - "globby": "^10.0.1", - "is-path-cwd": "^2.2.0", - "is-path-in-cwd": "^3.0.0", - "path-sort2": "^1.0.0", - "slash": "^3.0.0" - } - }, - "read-only-stream": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/read-only-stream/-/read-only-stream-2.0.0.tgz", - "integrity": "sha1-JyT9aoET1zdkrCiNQ4YnDB2/F/A=", - "dev": true, - "requires": { - "readable-stream": "^2.0.2" - }, - "dependencies": { - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", - "dev": true - }, - "readable-stream": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", - "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", - "dev": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, - "requires": { - "safe-buffer": "~5.1.0" - } - } - } - }, - "read-pkg": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz", - "integrity": "sha1-9f+qXs0pyzHAR0vKfXVra7KePyg=", - "dev": true, - "requires": { - "load-json-file": "^1.0.0", - "normalize-package-data": "^2.3.2", - "path-type": "^1.0.0" - } - }, - "read-pkg-up": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz", - "integrity": "sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI=", - "dev": true, - "requires": { - "find-up": "^1.0.0", - "read-pkg": "^1.0.0" - } - }, - "readable-stream": { - "version": "1.0.34", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", - "integrity": "sha512-ok1qVCJuRkNmvebYikljxJA/UEsKwLl2nI1OmaqAu4/UE+h0wKCHok4XkL/gvi39OacXvw59RJUOFUkDib2rHg==", - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.1", - "isarray": "0.0.1", - "string_decoder": "~0.10.x" - } - }, - "readdirp": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.2.1.tgz", - "integrity": "sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ==", - "dev": true, - "requires": { - "graceful-fs": "^4.1.11", - "micromatch": "^3.1.10", - "readable-stream": "^2.0.2" - }, - "dependencies": { - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", - "dev": true - }, - "readable-stream": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", - "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", - "dev": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, - "requires": { - "safe-buffer": "~5.1.0" - } - } - } - }, - "rechoir": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz", - "integrity": "sha1-hSBLVNuoLVdC4oyWdW70OvUOM4Q=", - "dev": true, - "requires": { - "resolve": "^1.1.6" - } - }, - "regex-not": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz", - "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==", - "dev": true, - "requires": { - "extend-shallow": "^3.0.2", - "safe-regex": "^1.1.0" - } - }, - "remove-bom-buffer": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/remove-bom-buffer/-/remove-bom-buffer-3.0.0.tgz", - "integrity": "sha512-8v2rWhaakv18qcvNeli2mZ/TMTL2nEyAKRvzo1WtnZBl15SHyEhrCu2/xKlJyUFKHiHgfXIyuY6g2dObJJycXQ==", - "dev": true, - "requires": { - "is-buffer": "^1.1.5", - "is-utf8": "^0.2.1" - } - }, - "remove-bom-stream": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/remove-bom-stream/-/remove-bom-stream-1.2.0.tgz", - "integrity": "sha1-BfGlk/FuQuH7kOv1nejlaVJflSM=", - "dev": true, - "requires": { - "remove-bom-buffer": "^3.0.0", - "safe-buffer": "^5.1.0", - "through2": "^2.0.3" - }, - "dependencies": { - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", - "dev": true - }, - "readable-stream": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", - "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", - "dev": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, - "requires": { - "safe-buffer": "~5.1.0" - } - }, - "through2": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", - "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", - "dev": true, - "requires": { - "readable-stream": "~2.3.6", - "xtend": "~4.0.1" - } - } - } - }, - "remove-trailing-separator": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", - "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8=", - "dev": true - }, - "repeat-element": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.3.tgz", - "integrity": "sha512-ahGq0ZnV5m5XtZLMb+vP76kcAM5nkLqk0lpqAuojSKGgQtn4eRi4ZZGm2olo2zKFH+sMsWaqOCW1dqAnOru72g==", - "dev": true - }, - "repeat-string": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", - "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=", - "dev": true - }, - "replace-ext": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/replace-ext/-/replace-ext-1.0.0.tgz", - "integrity": "sha1-3mMSg3P8v3w8z6TeWkgMRaZ5WOs=", - "dev": true - }, - "replace-homedir": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/replace-homedir/-/replace-homedir-1.0.0.tgz", - "integrity": "sha1-6H9tUTuSjd6AgmDBK+f+xv9ueYw=", - "dev": true, - "requires": { - "homedir-polyfill": "^1.0.1", - "is-absolute": "^1.0.0", - "remove-trailing-separator": "^1.1.0" - } - }, - "replacestream": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/replacestream/-/replacestream-4.0.3.tgz", - "integrity": "sha512-AC0FiLS352pBBiZhd4VXB1Ab/lh0lEgpP+GGvZqbQh8a5cmXVoTe5EX/YeTFArnp4SRGTHh1qCHu9lGs1qG8sA==", - "dev": true, - "requires": { - "escape-string-regexp": "^1.0.3", - "object-assign": "^4.0.1", - "readable-stream": "^2.0.2" - }, - "dependencies": { - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", - "dev": true - }, - "readable-stream": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", - "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", - "dev": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, - "requires": { - "safe-buffer": "~5.1.0" - } - } - } - }, - "request": { - "version": "2.88.2", - "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz", - "integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==", - "peer": true, - "requires": { - "aws-sign2": "~0.7.0", - "aws4": "^1.8.0", - "caseless": "~0.12.0", - "combined-stream": "~1.0.6", - "extend": "~3.0.2", - "forever-agent": "~0.6.1", - "form-data": "~2.3.2", - "har-validator": "~5.1.3", - "http-signature": "~1.2.0", - "is-typedarray": "~1.0.0", - "isstream": "~0.1.2", - "json-stringify-safe": "~5.0.1", - "mime-types": "~2.1.19", - "oauth-sign": "~0.9.0", - "performance-now": "^2.1.0", - "qs": "~6.5.2", - "safe-buffer": "^5.1.2", - "tough-cookie": "~2.5.0", - "tunnel-agent": "^0.6.0", - "uuid": "^3.3.2" - } - }, - "require-directory": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", - "dev": true - }, - "require-main-filename": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz", - "integrity": "sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE=", - "dev": true - }, - "requires-port": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", - "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==", - "dev": true - }, - "resolve": { - "version": "1.22.1", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz", - "integrity": "sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==", - "dev": true, - "requires": { - "is-core-module": "^2.9.0", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" - } - }, - "resolve-dir": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/resolve-dir/-/resolve-dir-1.0.1.tgz", - "integrity": "sha1-eaQGRMNivoLybv/nOcm7U4IEb0M=", - "dev": true, - "requires": { - "expand-tilde": "^2.0.0", - "global-modules": "^1.0.0" - } - }, - "resolve-options": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/resolve-options/-/resolve-options-1.1.0.tgz", - "integrity": "sha1-MrueOcBtZzONyTeMDW1gdFZq0TE=", - "dev": true, - "requires": { - "value-or-function": "^3.0.0" - } - }, - "resolve-url": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz", - "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=", - "dev": true - }, - "resp-modifier": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/resp-modifier/-/resp-modifier-6.0.2.tgz", - "integrity": "sha1-sSTeXE+6/LpUH0j/pzlw9KpFa08=", - "dev": true, - "requires": { - "debug": "^2.2.0", - "minimatch": "^3.0.2" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - } - } - }, - "ret": { - "version": "0.1.15", - "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz", - "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==", - "dev": true - }, - "retry": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz", - "integrity": "sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==" - }, - "reusify": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", - "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", - "dev": true - }, - "rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "requires": { - "glob": "^7.1.3" - } - }, - "ripemd160": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.2.tgz", - "integrity": "sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==", - "dev": true, - "requires": { - "hash-base": "^3.0.0", - "inherits": "^2.0.1" - } - }, - "run-parallel": { - "version": "1.1.9", - "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.1.9.tgz", - "integrity": "sha512-DEqnSRTDw/Tc3FXf49zedI638Z9onwUotBMiUFKmrO2sdFKIbXamXGQ3Axd4qgphxKB4kw/qP1w5kTxnfU1B9Q==", - "dev": true - }, - "rx": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/rx/-/rx-4.1.0.tgz", - "integrity": "sha1-pfE/957zt0D+MKqAP7CfmIBdR4I=", - "dev": true - }, - "rxjs": { - "version": "5.5.12", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-5.5.12.tgz", - "integrity": "sha512-xx2itnL5sBbqeeiVgNPVuQQ1nC8Jp2WfNJhXWHmElW9YmrpS9UVnNzhP3EH3HFqexO5Tlp8GhYY+WEcqcVMvGw==", - "dev": true, - "requires": { - "symbol-observable": "1.0.1" - } - }, - "safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" - }, - "safe-regex": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz", - "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=", - "dev": true, - "requires": { - "ret": "~0.1.10" - } - }, - "safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" - }, - "semver": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.3.0.tgz", - "integrity": "sha1-myzl094C0XxgEq0yaqa00M9U+U8=", - "dev": true - }, - "semver-greatest-satisfied-range": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/semver-greatest-satisfied-range/-/semver-greatest-satisfied-range-1.1.0.tgz", - "integrity": "sha1-E+jCZYq5aRywzXEJMkAoDTb3els=", - "dev": true, - "requires": { - "sver-compat": "^1.5.0" - } - }, - "send": { - "version": "0.16.2", - "resolved": "https://registry.npmjs.org/send/-/send-0.16.2.tgz", - "integrity": "sha512-E64YFPUssFHEFBvpbbjr44NCLtI1AohxQ8ZSiJjQLskAdKuriYEP6VyGEsRDH8ScozGpkaX1BGvhanqCwkcEZw==", - "dev": true, - "requires": { - "debug": "2.6.9", - "depd": "~1.1.2", - "destroy": "~1.0.4", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "fresh": "0.5.2", - "http-errors": "~1.6.2", - "mime": "1.4.1", - "ms": "2.0.0", - "on-finished": "~2.3.0", - "range-parser": "~1.2.0", - "statuses": "~1.4.0" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "http-errors": { - "version": "1.6.3", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", - "integrity": "sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0=", - "dev": true, - "requires": { - "depd": "~1.1.2", - "inherits": "2.0.3", - "setprototypeof": "1.1.0", - "statuses": ">= 1.4.0 < 2" - } - }, - "inherits": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", - "dev": true - }, - "setprototypeof": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", - "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==", - "dev": true - }, - "statuses": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.4.0.tgz", - "integrity": "sha512-zhSCtt8v2NDrRlPQpCNtw/heZLtfUDqxBM1udqikb/Hbk52LK4nQSwr10u77iopCW5LsyHpuXS0GnEc48mLeew==", - "dev": true - } - } - }, - "serve-index": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/serve-index/-/serve-index-1.9.1.tgz", - "integrity": "sha1-03aNabHn2C5c4FD/9bRTvqEqkjk=", - "dev": true, - "requires": { - "accepts": "~1.3.4", - "batch": "0.6.1", - "debug": "2.6.9", - "escape-html": "~1.0.3", - "http-errors": "~1.6.2", - "mime-types": "~2.1.17", - "parseurl": "~1.3.2" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "http-errors": { - "version": "1.6.3", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", - "integrity": "sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0=", - "dev": true, - "requires": { - "depd": "~1.1.2", - "inherits": "2.0.3", - "setprototypeof": "1.1.0", - "statuses": ">= 1.4.0 < 2" - } - }, - "inherits": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", - "dev": true - }, - "setprototypeof": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", - "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==", - "dev": true - }, - "statuses": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", - "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=", - "dev": true - } - } - }, - "serve-static": { - "version": "1.13.2", - "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.13.2.tgz", - "integrity": "sha512-p/tdJrO4U387R9oMjb1oj7qSMaMfmOyd4j9hOFoxZe2baQszgHcSWjuya/CiT5kgZZKRudHNOA0pYXOl8rQ5nw==", - "dev": true, - "requires": { - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "parseurl": "~1.3.2", - "send": "0.16.2" - } - }, - "server-destroy": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/server-destroy/-/server-destroy-1.0.1.tgz", - "integrity": "sha512-rb+9B5YBIEzYcD6x2VKidaa+cqYBJQKnU4oe4E3ANwRRN56yk/ua1YCJT1n21NTS8w6CcOclAKNP3PhdCXKYtQ==", - "dev": true - }, - "set-blocking": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", - "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=" - }, - "set-value": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.1.tgz", - "integrity": "sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw==", - "dev": true, - "requires": { - "extend-shallow": "^2.0.1", - "is-extendable": "^0.1.1", - "is-plain-object": "^2.0.3", - "split-string": "^3.0.1" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - } - } - }, - "setprototypeof": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz", - "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==", - "dev": true - }, - "sha.js": { - "version": "2.4.11", - "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz", - "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==", - "dev": true, - "requires": { - "inherits": "^2.0.1", - "safe-buffer": "^5.0.1" - } - }, - "shasum-object": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/shasum-object/-/shasum-object-1.0.0.tgz", - "integrity": "sha512-Iqo5rp/3xVi6M4YheapzZhhGPVs0yZwHj7wvwQ1B9z8H6zk+FEnI7y3Teq7qwnekfEhu8WmG2z0z4iWZaxLWVg==", - "dev": true, - "requires": { - "fast-safe-stringify": "^2.0.7" - } - }, - "shebang-command": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", - "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", - "dev": true, - "requires": { - "shebang-regex": "^3.0.0" - } - }, - "shebang-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", - "dev": true - }, - "shell-quote": { - "version": "1.7.3", - "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.7.3.tgz", - "integrity": "sha512-Vpfqwm4EnqGdlsBFNmHhxhElJYrdfcxPThu+ryKS5J8L/fhAwLazFZtq+S+TWZ9ANj2piSQLGj6NQg+lKPmxrw==", - "dev": true - }, - "sigmund": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/sigmund/-/sigmund-1.0.1.tgz", - "integrity": "sha1-P/IfGYytIXX587eBhT/ZTQ0ZtZA=", - "dev": true - }, - "signal-exit": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", - "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=" - }, - "simple-concat": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/simple-concat/-/simple-concat-1.0.0.tgz", - "integrity": "sha1-c0TLuLbib7J9ZrL8hvn21Zl1IcY=" - }, - "simple-get": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/simple-get/-/simple-get-4.0.1.tgz", - "integrity": "sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA==", - "requires": { - "decompress-response": "^6.0.0", - "once": "^1.3.1", - "simple-concat": "^1.0.0" - } - }, - "sinon": { - "version": "7.3.2", - "resolved": "https://registry.npmjs.org/sinon/-/sinon-7.3.2.tgz", - "integrity": "sha512-thErC1z64BeyGiPvF8aoSg0LEnptSaWE7YhdWWbWXgelOyThent7uKOnnEh9zBxDbKixtr5dEko+ws1sZMuFMA==", - "dev": true, - "requires": { - "@sinonjs/commons": "^1.4.0", - "@sinonjs/formatio": "^3.2.1", - "@sinonjs/samsam": "^3.3.1", - "diff": "^3.5.0", - "lolex": "^4.0.1", - "nise": "^1.4.10", - "supports-color": "^5.5.0" - }, - "dependencies": { - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", - "dev": true - }, - "smart-buffer": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz", - "integrity": "sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==" - }, - "snapdragon": { - "version": "0.8.2", - "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz", - "integrity": "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==", - "dev": true, - "requires": { - "base": "^0.11.1", - "debug": "^2.2.0", - "define-property": "^0.2.5", - "extend-shallow": "^2.0.1", - "map-cache": "^0.2.2", - "source-map": "^0.5.6", - "source-map-resolve": "^0.5.0", - "use": "^3.1.0" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, - "requires": { - "is-descriptor": "^0.1.0" - } - }, - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - } - } - }, - "snapdragon-node": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz", - "integrity": "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==", - "dev": true, - "requires": { - "define-property": "^1.0.0", - "isobject": "^3.0.0", - "snapdragon-util": "^3.0.1" - }, - "dependencies": { - "define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", - "dev": true, - "requires": { - "is-descriptor": "^1.0.0" - } - }, - "is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "dev": true, - "requires": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" - } - } - } - }, - "snapdragon-util": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz", - "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==", - "dev": true, - "requires": { - "kind-of": "^3.2.0" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "socket.io": { - "version": "4.5.3", - "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-4.5.3.tgz", - "integrity": "sha512-zdpnnKU+H6mOp7nYRXH4GNv1ux6HL6+lHL8g7Ds7Lj8CkdK1jJK/dlwsKDculbyOHifcJ0Pr/yeXnZQ5GeFrcg==", - "dev": true, - "requires": { - "accepts": "~1.3.4", - "base64id": "~2.0.0", - "debug": "~4.3.2", - "engine.io": "~6.2.0", - "socket.io-adapter": "~2.4.0", - "socket.io-parser": "~4.2.0" - } - }, - "socket.io-adapter": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/socket.io-adapter/-/socket.io-adapter-2.4.0.tgz", - "integrity": "sha512-W4N+o69rkMEGVuk2D/cvca3uYsvGlMwsySWV447y99gUPghxq42BxqLNMndb+a1mm/5/7NeXVQS7RLa2XyXvYg==", - "dev": true - }, - "socket.io-client": { - "version": "4.5.3", - "resolved": "https://registry.npmjs.org/socket.io-client/-/socket.io-client-4.5.3.tgz", - "integrity": "sha512-I/hqDYpQ6JKwtJOf5ikM+Qz+YujZPMEl6qBLhxiP0nX+TfXKhW4KZZG8lamrD6Y5ngjmYHreESVasVCgi5Kl3A==", - "dev": true, - "requires": { - "@socket.io/component-emitter": "~3.1.0", - "debug": "~4.3.2", - "engine.io-client": "~6.2.3", - "socket.io-parser": "~4.2.0" - } - }, - "socket.io-parser": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-4.2.1.tgz", - "integrity": "sha512-V4GrkLy+HeF1F/en3SpUaM+7XxYXpuMUWLGde1kSSh5nQMN4hLrbPIkD+otwh6q9R6NOQBN4AMaOZ2zVjui82g==", - "dev": true, - "requires": { - "@socket.io/component-emitter": "~3.1.0", - "debug": "~4.3.1" - } - }, - "socks": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/socks/-/socks-2.6.2.tgz", - "integrity": "sha512-zDZhHhZRY9PxRruRMR7kMhnf3I8hDs4S3f9RecfnGxvcBHQcKcIH/oUcEWffsfl1XxdYlA7nnlGbbTvPz9D8gA==", - "requires": { - "ip": "^1.1.5", - "smart-buffer": "^4.2.0" - } - }, - "socks-proxy-agent": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-7.0.0.tgz", - "integrity": "sha512-Fgl0YPZ902wEsAyiQ+idGd1A7rSFx/ayC1CQVMw5P+EQx2V0SgpGtf6OKFhVjPflPUl9YMmEOnmfjCdMUsygww==", - "requires": { - "agent-base": "^6.0.2", - "debug": "^4.3.3", - "socks": "^2.6.2" - }, - "dependencies": { - "debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "requires": { - "ms": "2.1.2" - } - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" - } - } - }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true - }, - "source-map-resolve": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.2.tgz", - "integrity": "sha512-MjqsvNwyz1s0k81Goz/9vRBe9SZdB09Bdw+/zYyO+3CuPk6fouTaxscHkgtE8jKvf01kVfl8riHzERQ/kefaSA==", - "dev": true, - "requires": { - "atob": "^2.1.1", - "decode-uri-component": "^0.2.0", - "resolve-url": "^0.2.1", - "source-map-url": "^0.4.0", - "urix": "^0.1.0" - } - }, - "source-map-support": { - "version": "0.5.21", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", - "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", - "dev": true, - "requires": { - "buffer-from": "^1.0.0", - "source-map": "^0.6.0" - }, - "dependencies": { - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - } - } - }, - "source-map-url": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.0.tgz", - "integrity": "sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM=", - "dev": true - }, - "sparkles": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/sparkles/-/sparkles-1.0.1.tgz", - "integrity": "sha512-dSO0DDYUahUt/0/pD/Is3VIm5TGJjludZ0HVymmhYF6eNA53PVLhnUk0znSYbH8IYBuJdCE+1luR22jNLMaQdw==", - "dev": true - }, - "spdx-correct": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.0.tgz", - "integrity": "sha512-lr2EZCctC2BNR7j7WzJ2FpDznxky1sjfxvvYEyzxNyb6lZXHODmEoJeFu4JupYlkfha1KZpJyoqiJ7pgA1qq8Q==", - "dev": true, - "requires": { - "spdx-expression-parse": "^3.0.0", - "spdx-license-ids": "^3.0.0" - } - }, - "spdx-exceptions": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.2.0.tgz", - "integrity": "sha512-2XQACfElKi9SlVb1CYadKDXvoajPgBVPn/gOQLrTvHdElaVhr7ZEbqJaRnJLVNeaI4cMEAgVCeBMKF6MWRDCRA==", - "dev": true - }, - "spdx-expression-parse": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.0.tgz", - "integrity": "sha512-Yg6D3XpRD4kkOmTpdgbUiEJFKghJH03fiC1OPll5h/0sO6neh2jqRDVHOQ4o/LMea0tgCkbMgea5ip/e+MkWyg==", - "dev": true, - "requires": { - "spdx-exceptions": "^2.1.0", - "spdx-license-ids": "^3.0.0" - } - }, - "spdx-license-ids": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.5.tgz", - "integrity": "sha512-J+FWzZoynJEXGphVIS+XEh3kFSjZX/1i9gFBaWQcB+/tmpe2qUsSBABpcxqxnAxFdiUFEgAX1bjYGQvIZmoz9Q==", - "dev": true - }, - "split-string": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz", - "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==", - "dev": true, - "requires": { - "extend-shallow": "^3.0.0" - } - }, - "sshpk": { - "version": "1.17.0", - "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.17.0.tgz", - "integrity": "sha512-/9HIEs1ZXGhSPE8X6Ccm7Nam1z8KcoCqPdI7ecm1N33EzAetWahvQWVqLZtaZQ+IDKX4IyA2o0gBzqIMkAagHQ==", - "peer": true, - "requires": { - "asn1": "~0.2.3", - "assert-plus": "^1.0.0", - "bcrypt-pbkdf": "^1.0.0", - "dashdash": "^1.12.0", - "ecc-jsbn": "~0.1.1", - "getpass": "^0.1.1", - "jsbn": "~0.1.0", - "safer-buffer": "^2.0.2", - "tweetnacl": "~0.14.0" - } - }, - "ssri": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/ssri/-/ssri-9.0.1.tgz", - "integrity": "sha512-o57Wcn66jMQvfHG1FlYbWeZWW/dHZhJXjpIcTfXldXEk5nz5lStPo3mK0OJQfGR3RbZUlbISexbljkJzuEj/8Q==", - "requires": { - "minipass": "^3.1.1" - } - }, - "stack-trace": { - "version": "0.0.10", - "resolved": "https://registry.npmjs.org/stack-trace/-/stack-trace-0.0.10.tgz", - "integrity": "sha1-VHxws0fo0ytOEI6hoqFZ5f3eGcA=", - "dev": true - }, - "static-extend": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz", - "integrity": "sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=", - "dev": true, - "requires": { - "define-property": "^0.2.5", - "object-copy": "^0.1.0" - }, - "dependencies": { - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, - "requires": { - "is-descriptor": "^0.1.0" - } - } - } - }, - "statuses": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.3.1.tgz", - "integrity": "sha1-+vUbnrdKrvOzrPStX2Gr8ky3uT4=", - "dev": true - }, - "stream-browserify": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-3.0.0.tgz", - "integrity": "sha512-H73RAHsVBapbim0tU2JwwOiXUj+fikfiaoYAKHF3VJfA0pe2BCzkhAHBlLG6REzE+2WNZcxOXjK7lkso+9euLA==", - "dev": true, - "requires": { - "inherits": "~2.0.4", - "readable-stream": "^3.5.0" - }, - "dependencies": { - "readable-stream": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", - "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", - "dev": true, - "requires": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - } - }, - "safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "dev": true - }, - "string_decoder": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", - "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", - "dev": true, - "requires": { - "safe-buffer": "~5.2.0" - } - } - } - }, - "stream-combiner2": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/stream-combiner2/-/stream-combiner2-1.1.1.tgz", - "integrity": "sha512-3PnJbYgS56AeWgtKF5jtJRT6uFJe56Z0Hc5Ngg/6sI6rIt8iiMBTa9cvdyFfpMQjaVHr8dusbNeFGIIonxOvKw==", - "dev": true, - "requires": { - "duplexer2": "~0.1.0", - "readable-stream": "^2.0.2" - }, - "dependencies": { - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", - "dev": true - }, - "readable-stream": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", - "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", - "dev": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, - "requires": { - "safe-buffer": "~5.1.0" - } - } - } - }, - "stream-exhaust": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/stream-exhaust/-/stream-exhaust-1.0.2.tgz", - "integrity": "sha512-b/qaq/GlBK5xaq1yrK9/zFcyRSTNxmcZwFLGSTG0mXgZl/4Z6GgiyYOXOvY7N3eEvFRAG1bkDRz5EPGSvPYQlw==", - "dev": true - }, - "stream-http": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/stream-http/-/stream-http-3.2.0.tgz", - "integrity": "sha512-Oq1bLqisTyK3TSCXpPbT4sdeYNdmyZJv1LxpEm2vu1ZhK89kSE5YXwZc3cWk0MagGaKriBh9mCFbVGtO+vY29A==", - "dev": true, - "requires": { - "builtin-status-codes": "^3.0.0", - "inherits": "^2.0.4", - "readable-stream": "^3.6.0", - "xtend": "^4.0.2" - }, - "dependencies": { - "readable-stream": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", - "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", - "dev": true, - "requires": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - } - }, - "safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "dev": true - }, - "string_decoder": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", - "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", - "dev": true, - "requires": { - "safe-buffer": "~5.2.0" - } - } - } - }, - "stream-shift": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.0.tgz", - "integrity": "sha1-1cdSgl5TZ+eG944Y5EXqIjoVWVI=", - "dev": true - }, - "stream-splicer": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/stream-splicer/-/stream-splicer-2.0.1.tgz", - "integrity": "sha512-Xizh4/NPuYSyAXyT7g8IvdJ9HJpxIGL9PjyhtywCZvvP0OPIdqyrr4dMikeuvY8xahpdKEBlBTySe583totajg==", - "dev": true, - "requires": { - "inherits": "^2.0.1", - "readable-stream": "^2.0.2" - }, - "dependencies": { - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", - "dev": true - }, - "readable-stream": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", - "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", - "dev": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, - "requires": { - "safe-buffer": "~5.1.0" - } - } - } - }, - "stream-throttle": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/stream-throttle/-/stream-throttle-0.1.3.tgz", - "integrity": "sha512-889+B9vN9dq7/vLbGyuHeZ6/ctf5sNuGWsDy89uNxkFTAgzy0eK7+w5fL3KLNRTkLle7EgZGvHUphZW0Q26MnQ==", - "dev": true, - "requires": { - "commander": "^2.2.0", - "limiter": "^1.0.5" - } - }, - "string_decoder": { - "version": "0.10.31", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", - "integrity": "sha512-ev2QzSzWPYmy9GuqfIVildA4OdcGLeFZQrq5ys6RtiuF+RQQiZWr8TZNyAcuVXyQRYfEO+MsoB/1BuQVhOJuoQ==" - }, - "string-width": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", - "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", - "requires": { - "code-point-at": "^1.0.0", - "is-fullwidth-code-point": "^1.0.0", - "strip-ansi": "^3.0.0" - } - }, - "strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", - "requires": { - "ansi-regex": "^2.0.0" - } - }, - "strip-bom": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", - "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=", - "dev": true, - "requires": { - "is-utf8": "^0.2.0" - } - }, - "strip-json-comments": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", - "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=" - }, - "subarg": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/subarg/-/subarg-1.0.0.tgz", - "integrity": "sha512-RIrIdRY0X1xojthNcVtgT9sjpOGagEUKpZdgBUi054OEPFo282yg+zE+t1Rj3+RqKq2xStL7uUHhY+AjbC4BXg==", - "dev": true, - "requires": { - "minimist": "^1.1.0" - } - }, - "supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", - "dev": true - }, - "supports-preserve-symlinks-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", - "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", - "dev": true - }, - "sver-compat": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/sver-compat/-/sver-compat-1.5.0.tgz", - "integrity": "sha1-PPh9/rTQe0o/FIJ7wYaz/QxkXNg=", - "dev": true, - "requires": { - "es6-iterator": "^2.0.1", - "es6-symbol": "^3.1.1" - } - }, - "symbol-observable": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/symbol-observable/-/symbol-observable-1.0.1.tgz", - "integrity": "sha512-Kb3PrPYz4HanVF1LVGuAdW6LoVgIwjUYJGzFe7NDrBLCN4lsV/5J0MFurV+ygS4bRVwrCEt2c7MQ1R2a72oJDw==", - "dev": true - }, - "syntax-error": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/syntax-error/-/syntax-error-1.4.0.tgz", - "integrity": "sha512-YPPlu67mdnHGTup2A8ff7BC2Pjq0e0Yp/IyTFN03zWO0RcK07uLcbi7C2KpGR2FvWbaB0+bfE27a+sBKebSo7w==", - "dev": true, - "requires": { - "acorn-node": "^1.2.0" - } - }, - "tar": { - "version": "6.1.12", - "resolved": "https://registry.npmjs.org/tar/-/tar-6.1.12.tgz", - "integrity": "sha512-jU4TdemS31uABHd+Lt5WEYJuzn+TJTCBLljvIAHZOz6M9Os5pJ4dD+vRFLxPa/n3T0iEFzpi+0x1UfuDZYbRMw==", - "requires": { - "chownr": "^2.0.0", - "fs-minipass": "^2.0.0", - "minipass": "^3.0.0", - "minizlib": "^2.1.1", - "mkdirp": "^1.0.3", - "yallist": "^4.0.0" - }, - "dependencies": { - "mkdirp": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", - "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==" - } - } - }, - "tar-fs": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-2.1.1.tgz", - "integrity": "sha512-V0r2Y9scmbDRLCNex/+hYzvp/zyYjvFbHPNgVTKfQvVrb6guiE/fxP+XblDNR011utopbkex2nM4dHNV6GDsng==", - "requires": { - "chownr": "^1.1.1", - "mkdirp-classic": "^0.5.2", - "pump": "^3.0.0", - "tar-stream": "^2.1.4" - }, - "dependencies": { - "chownr": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", - "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==" - }, - "pump": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", - "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", - "requires": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" - } - } - } - }, - "tar-stream": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz", - "integrity": "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==", - "requires": { - "bl": "^4.0.3", - "end-of-stream": "^1.4.1", - "fs-constants": "^1.0.0", - "inherits": "^2.0.3", - "readable-stream": "^3.1.1" - }, - "dependencies": { - "base64-js": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", - "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==" - }, - "bl": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", - "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", - "requires": { - "buffer": "^5.5.0", - "inherits": "^2.0.4", - "readable-stream": "^3.4.0" - } - }, - "buffer": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", - "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", - "requires": { - "base64-js": "^1.3.1", - "ieee754": "^1.1.13" - } - }, - "readable-stream": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", - "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", - "requires": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - } - }, - "safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==" - }, - "string_decoder": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", - "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", - "requires": { - "safe-buffer": "~5.2.0" - } - } - } - }, - "terser": { - "version": "5.15.1", - "resolved": "https://registry.npmjs.org/terser/-/terser-5.15.1.tgz", - "integrity": "sha512-K1faMUvpm/FBxjBXud0LWVAGxmvoPbZbfTCYbSgaaYQaIXI3/TdI7a7ZGA73Zrou6Q8Zmz3oeUTsp/dj+ag2Xw==", - "dev": true, - "requires": { - "@jridgewell/source-map": "^0.3.2", - "acorn": "^8.5.0", - "commander": "^2.20.0", - "source-map-support": "~0.5.20" - }, - "dependencies": { - "acorn": { - "version": "8.8.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.1.tgz", - "integrity": "sha512-7zFpHzhnqYKrkYdUjF1HI1bzd0VygEGX8lFk4k5zVMqHEoES+P+7TKI+EvLO9WVMJ8eekdO0aDEK044xTXwPPA==", - "dev": true - } - } - }, - "test-exclude": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", - "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", - "dev": true, - "requires": { - "@istanbuljs/schema": "^0.1.2", - "glob": "^7.1.4", - "minimatch": "^3.0.4" - } - }, - "textextensions": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/textextensions/-/textextensions-2.4.0.tgz", - "integrity": "sha512-qftQXnX1DzpSV8EddtHIT0eDDEiBF8ywhFYR2lI9xrGtxqKN+CvLXhACeCIGbCpQfxxERbrkZEFb8cZcDKbVZA==", - "dev": true - }, - "tfunk": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/tfunk/-/tfunk-4.0.0.tgz", - "integrity": "sha512-eJQ0dGfDIzWNiFNYFVjJ+Ezl/GmwHaFTBTjrtqNPW0S7cuVDBrZrmzUz6VkMeCR4DZFqhd4YtLwsw3i2wYHswQ==", - "dev": true, - "requires": { - "chalk": "^1.1.3", - "dlv": "^1.1.3" - } - }, - "through": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", - "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=", - "dev": true - }, - "through2": { - "version": "0.6.5", - "resolved": "https://registry.npmjs.org/through2/-/through2-0.6.5.tgz", - "integrity": "sha512-RkK/CCESdTKQZHdmKICijdKKsCRVHs5KsLZ6pACAmF/1GPUQhonHSXWNERctxEp7RmvjdNbZTL5z9V7nSCXKcg==", - "requires": { - "readable-stream": ">=1.0.33-1 <1.1.0-0", - "xtend": ">=4.0.0 <4.1.0-0" - } - }, - "through2-filter": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/through2-filter/-/through2-filter-3.0.0.tgz", - "integrity": "sha512-jaRjI2WxN3W1V8/FMZ9HKIBXixtiqs3SQSX4/YGIiP3gL6djW48VoZq9tDqeCWs3MT8YY5wb/zli8VW8snY1CA==", - "dev": true, - "requires": { - "through2": "~2.0.0", - "xtend": "~4.0.0" - }, - "dependencies": { - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", - "dev": true - }, - "readable-stream": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", - "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", - "dev": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, - "requires": { - "safe-buffer": "~5.1.0" - } - }, - "through2": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", - "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", - "dev": true, - "requires": { - "readable-stream": "~2.3.6", - "xtend": "~4.0.1" - } - } - } - }, - "time-stamp": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/time-stamp/-/time-stamp-1.1.0.tgz", - "integrity": "sha1-dkpaEa9QVhkhsTPztE5hhofg9cM=", - "dev": true - }, - "timers-browserify": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/timers-browserify/-/timers-browserify-1.4.2.tgz", - "integrity": "sha1-ycWLV1voQHN1y14kYtrO50NZ9B0=", - "dev": true, - "requires": { - "process": "~0.11.0" - } - }, - "tiny-glob": { - "version": "0.2.9", - "resolved": "https://registry.npmjs.org/tiny-glob/-/tiny-glob-0.2.9.tgz", - "integrity": "sha512-g/55ssRPUjShh+xkfx9UPDXqhckHEsHr4Vd9zX55oSdGZc/MD0m3sferOkwWtp98bv+kcVfEHtRJgBVJzelrzg==", - "dev": true, - "requires": { - "globalyzer": "0.1.0", - "globrex": "^0.1.2" - } - }, - "to-absolute-glob": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/to-absolute-glob/-/to-absolute-glob-2.0.2.tgz", - "integrity": "sha1-GGX0PZ50sIItufFFt4z/fQ98hJs=", - "dev": true, - "requires": { - "is-absolute": "^1.0.0", - "is-negated-glob": "^1.0.0" - } - }, - "to-object-path": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz", - "integrity": "sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "to-regex": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz", - "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==", - "dev": true, - "requires": { - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "regex-not": "^1.0.2", - "safe-regex": "^1.1.0" - } - }, - "to-regex-range": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", - "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", - "dev": true, - "requires": { - "is-number": "^3.0.0", - "repeat-string": "^1.6.1" - } - }, - "to-through": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/to-through/-/to-through-2.0.0.tgz", - "integrity": "sha1-/JKtq6ByZHvAtn1rA2ZKoZUJOvY=", - "dev": true, - "requires": { - "through2": "^2.0.3" - }, - "dependencies": { - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", - "dev": true - }, - "readable-stream": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", - "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", - "dev": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, - "requires": { - "safe-buffer": "~5.1.0" - } - }, - "through2": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", - "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", - "dev": true, - "requires": { - "readable-stream": "~2.3.6", - "xtend": "~4.0.1" - } - } - } - }, - "toidentifier": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.0.tgz", - "integrity": "sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw==", - "dev": true - }, - "tough-cookie": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", - "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==", - "peer": true, - "requires": { - "psl": "^1.1.28", - "punycode": "^2.1.1" - } - }, - "tty-browserify": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.1.tgz", - "integrity": "sha512-C3TaO7K81YvjCgQH9Q1S3R3P3BtN3RIM8n+OvX4il1K1zgE8ZhI0op7kClgkxtutIE8hQrcrHBXvIheqKUUCxw==", - "dev": true - }, - "tunnel-agent": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", - "integrity": "sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==", - "requires": { - "safe-buffer": "^5.0.1" - } - }, - "tweetnacl": { - "version": "0.14.5", - "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", - "integrity": "sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA==", - "peer": true - }, - "type": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/type/-/type-1.0.1.tgz", - "integrity": "sha512-MAM5dBMJCJNKs9E7JXo4CXRAansRfG0nlJxW7Wf6GZzSOvH31zClSaHdIMWLehe/EGMBkqeC55rrkaOr5Oo7Nw==", - "dev": true - }, - "type-detect": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", - "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", - "dev": true - }, - "typedarray": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", - "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=", - "dev": true - }, - "typescript": { - "version": "4.9.3", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.9.3.tgz", - "integrity": "sha512-CIfGzTelbKNEnLpLdGFgdyKhG23CKdKgQPOBc+OUNrkJ2vr+KSzsSV5kq5iWhEQbok+quxgGzrAtGWCyU7tHnA==", - "dev": true - }, - "ua-parser-js": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-1.0.2.tgz", - "integrity": "sha512-00y/AXhx0/SsnI51fTc0rLRmafiGOM4/O+ny10Ps7f+j/b8p/ZY11ytMgznXkOVo4GQ+KwQG5UQLkLGirsACRg==", - "dev": true - }, - "umd": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/umd/-/umd-3.0.3.tgz", - "integrity": "sha512-4IcGSufhFshvLNcMCV80UnQVlZ5pMOC8mvNPForqwA4+lzYQuetTESLDQkeLmihq8bRcnpbQa48Wb8Lh16/xow==", - "dev": true - }, - "unc-path-regex": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/unc-path-regex/-/unc-path-regex-0.1.2.tgz", - "integrity": "sha1-5z3T17DXxe2G+6xrCufYxqadUPo=", - "dev": true - }, - "undeclared-identifiers": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/undeclared-identifiers/-/undeclared-identifiers-1.1.3.tgz", - "integrity": "sha512-pJOW4nxjlmfwKApE4zvxLScM/njmwj/DiUBv7EabwE4O8kRUy+HIwxQtZLBPll/jx1LJyBcqNfB3/cpv9EZwOw==", - "dev": true, - "requires": { - "acorn-node": "^1.3.0", - "dash-ast": "^1.0.0", - "get-assigned-identifiers": "^1.2.0", - "simple-concat": "^1.0.0", - "xtend": "^4.0.1" - } - }, - "undertaker": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/undertaker/-/undertaker-1.2.1.tgz", - "integrity": "sha512-71WxIzDkgYk9ZS+spIB8iZXchFhAdEo2YU8xYqBYJ39DIUIqziK78ftm26eecoIY49X0J2MLhG4hr18Yp6/CMA==", - "dev": true, - "requires": { - "arr-flatten": "^1.0.1", - "arr-map": "^2.0.0", - "bach": "^1.0.0", - "collection-map": "^1.0.0", - "es6-weak-map": "^2.0.1", - "last-run": "^1.1.0", - "object.defaults": "^1.0.0", - "object.reduce": "^1.0.0", - "undertaker-registry": "^1.0.0" - } - }, - "undertaker-registry": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/undertaker-registry/-/undertaker-registry-1.0.1.tgz", - "integrity": "sha1-XkvaMI5KiirlhPm5pDWaSZglzFA=", - "dev": true - }, - "union-value": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.1.tgz", - "integrity": "sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg==", - "dev": true, - "requires": { - "arr-union": "^3.1.0", - "get-value": "^2.0.6", - "is-extendable": "^0.1.1", - "set-value": "^2.0.1" - } - }, - "unique-filename": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-1.1.1.tgz", - "integrity": "sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ==", - "requires": { - "unique-slug": "^2.0.0" - } - }, - "unique-slug": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-2.0.2.tgz", - "integrity": "sha512-zoWr9ObaxALD3DOPfjPSqxt4fnZiWblxHIgeWqW8x7UqDzEtHEQLzji2cuJYQFCU6KmoJikOYAZlrTHHebjx2w==", - "requires": { - "imurmurhash": "^0.1.4" - } - }, - "unique-stream": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/unique-stream/-/unique-stream-2.3.1.tgz", - "integrity": "sha512-2nY4TnBE70yoxHkDli7DMazpWiP7xMdCYqU2nBRO0UB+ZpEkGsSija7MvmvnZFUeC+mrgiUfcHSr3LmRFIg4+A==", - "dev": true, - "requires": { - "json-stable-stringify-without-jsonify": "^1.0.1", - "through2-filter": "^3.0.0" - } - }, - "universalify": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", - "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", - "dev": true - }, - "unpipe": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", - "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=", - "dev": true - }, - "unset-value": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz", - "integrity": "sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=", - "dev": true, - "requires": { - "has-value": "^0.3.1", - "isobject": "^3.0.0" - }, - "dependencies": { - "has-value": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz", - "integrity": "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=", - "dev": true, - "requires": { - "get-value": "^2.0.3", - "has-values": "^0.1.4", - "isobject": "^2.0.0" - }, - "dependencies": { - "isobject": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", - "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", - "dev": true, - "requires": { - "isarray": "1.0.0" - } - } - } - }, - "has-values": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz", - "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E=", - "dev": true - }, - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", - "dev": true - } - } - }, - "upath": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/upath/-/upath-1.2.0.tgz", - "integrity": "sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg==", - "dev": true - }, - "uri-js": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", - "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", - "peer": true, - "requires": { - "punycode": "^2.1.0" - } - }, - "urix": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz", - "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=", - "dev": true - }, - "url": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/url/-/url-0.11.0.tgz", - "integrity": "sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE=", - "dev": true, - "requires": { - "punycode": "1.3.2", - "querystring": "0.2.0" - }, - "dependencies": { - "punycode": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz", - "integrity": "sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0=", - "dev": true - } - } - }, - "use": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz", - "integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==", - "dev": true - }, - "util": { - "version": "0.12.5", - "resolved": "https://registry.npmjs.org/util/-/util-0.12.5.tgz", - "integrity": "sha512-kZf/K6hEIrWHI6XqOFUiiMa+79wE/D8Q+NCNAWclkyg3b4d2k7s0QGepNjiABc+aR3N1PAyHL7p6UcLY6LmrnA==", - "dev": true, - "requires": { - "inherits": "^2.0.3", - "is-arguments": "^1.0.4", - "is-generator-function": "^1.0.7", - "is-typed-array": "^1.1.3", - "which-typed-array": "^1.1.2" - } - }, - "util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" - }, - "utils-merge": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", - "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=", - "dev": true - }, - "uuid": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", - "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", - "peer": true - }, - "v8-to-istanbul": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-9.0.1.tgz", - "integrity": "sha512-74Y4LqY74kLE6IFyIjPtkSTWzUZmj8tdHT9Ii/26dvQ6K9Dl2NbEfj0XgU2sHCtKgt5VupqhlO/5aWuqS+IY1w==", - "dev": true, - "requires": { - "@jridgewell/trace-mapping": "^0.3.12", - "@types/istanbul-lib-coverage": "^2.0.1", - "convert-source-map": "^1.6.0" - }, - "dependencies": { - "convert-source-map": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", - "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==", - "dev": true - } - } - }, - "v8flags": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/v8flags/-/v8flags-3.1.3.tgz", - "integrity": "sha512-amh9CCg3ZxkzQ48Mhcb8iX7xpAfYJgePHxWMQCBWECpOSqJUXgY26ncA61UTV0BkPqfhcy6mzwCIoP4ygxpW8w==", - "dev": true, - "requires": { - "homedir-polyfill": "^1.0.1" - } - }, - "validate-npm-package-license": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", - "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", - "dev": true, - "requires": { - "spdx-correct": "^3.0.0", - "spdx-expression-parse": "^3.0.0" - } - }, - "value-or-function": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/value-or-function/-/value-or-function-3.0.0.tgz", - "integrity": "sha1-HCQ6ULWVwb5Up1S/7OhWO5/42BM=", - "dev": true - }, - "vary": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", - "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", - "dev": true - }, - "verror": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", - "integrity": "sha512-ZZKSmDAEFOijERBLkmYfJ+vmk3w+7hOLYDNkRCuRuMJGEmqYNCNLyBBFwWKVMhfwaEF3WOd0Zlw86U/WC/+nYw==", - "peer": true, - "requires": { - "assert-plus": "^1.0.0", - "core-util-is": "1.0.2", - "extsprintf": "^1.2.0" - } - }, - "vinyl": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-2.2.1.tgz", - "integrity": "sha512-LII3bXRFBZLlezoG5FfZVcXflZgWP/4dCwKtxd5ky9+LOtM4CS3bIRQsmR1KMnMW07jpE8fqR2lcxPZ+8sJIcw==", - "dev": true, - "requires": { - "clone": "^2.1.1", - "clone-buffer": "^1.0.0", - "clone-stats": "^1.0.0", - "cloneable-readable": "^1.0.0", - "remove-trailing-separator": "^1.0.1", - "replace-ext": "^1.0.0" - } - }, - "vinyl-buffer": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/vinyl-buffer/-/vinyl-buffer-1.0.1.tgz", - "integrity": "sha1-lsGjR5uMU5JULGEgKQE7Wyf4i78=", - "dev": true, - "requires": { - "bl": "^1.2.1", - "through2": "^2.0.3" - }, - "dependencies": { - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", - "dev": true - }, - "readable-stream": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", - "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", - "dev": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, - "requires": { - "safe-buffer": "~5.1.0" - } - }, - "through2": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", - "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", - "dev": true, - "requires": { - "readable-stream": "~2.3.6", - "xtend": "~4.0.1" - } - } - } - }, - "vinyl-fs": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/vinyl-fs/-/vinyl-fs-3.0.3.tgz", - "integrity": "sha512-vIu34EkyNyJxmP0jscNzWBSygh7VWhqun6RmqVfXePrOwi9lhvRs//dOaGOTRUQr4tx7/zd26Tk5WeSVZitgng==", - "dev": true, - "requires": { - "fs-mkdirp-stream": "^1.0.0", - "glob-stream": "^6.1.0", - "graceful-fs": "^4.0.0", - "is-valid-glob": "^1.0.0", - "lazystream": "^1.0.0", - "lead": "^1.0.0", - "object.assign": "^4.0.4", - "pumpify": "^1.3.5", - "readable-stream": "^2.3.3", - "remove-bom-buffer": "^3.0.0", - "remove-bom-stream": "^1.2.0", - "resolve-options": "^1.1.0", - "through2": "^2.0.0", - "to-through": "^2.0.0", - "value-or-function": "^3.0.0", - "vinyl": "^2.0.0", - "vinyl-sourcemap": "^1.1.0" - }, - "dependencies": { - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", - "dev": true - }, - "readable-stream": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", - "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", - "dev": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, - "requires": { - "safe-buffer": "~5.1.0" - } - }, - "through2": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", - "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", - "dev": true, - "requires": { - "readable-stream": "~2.3.6", - "xtend": "~4.0.1" - } - } - } - }, - "vinyl-source-stream": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/vinyl-source-stream/-/vinyl-source-stream-2.0.0.tgz", - "integrity": "sha1-84pa+53R6Ttl1VBGmsYYKsT1S44=", - "dev": true, - "requires": { - "through2": "^2.0.3", - "vinyl": "^2.1.0" - }, - "dependencies": { - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", - "dev": true - }, - "readable-stream": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", - "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", - "dev": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, - "requires": { - "safe-buffer": "~5.1.0" - } - }, - "through2": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", - "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", - "dev": true, - "requires": { - "readable-stream": "~2.3.6", - "xtend": "~4.0.1" - } - } - } - }, - "vinyl-sourcemap": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/vinyl-sourcemap/-/vinyl-sourcemap-1.1.0.tgz", - "integrity": "sha1-kqgAWTo4cDqM2xHYswCtS+Y7PhY=", - "dev": true, - "requires": { - "append-buffer": "^1.0.2", - "convert-source-map": "^1.5.0", - "graceful-fs": "^4.1.6", - "normalize-path": "^2.1.1", - "now-and-later": "^2.0.0", - "remove-bom-buffer": "^3.0.0", - "vinyl": "^2.0.0" - }, - "dependencies": { - "convert-source-map": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.6.0.tgz", - "integrity": "sha512-eFu7XigvxdZ1ETfbgPBohgyQ/Z++C0eEhTor0qRwBw9unw+L0/6V8wkSuGgzdThkiS5lSpdptOQPD8Ak40a+7A==", - "dev": true, - "requires": { - "safe-buffer": "~5.1.1" - } - }, - "normalize-path": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", - "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", - "dev": true, - "requires": { - "remove-trailing-separator": "^1.0.1" - } - } - } - }, - "vinyl-sourcemaps-apply": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/vinyl-sourcemaps-apply/-/vinyl-sourcemaps-apply-0.2.1.tgz", - "integrity": "sha1-q2VJ1h0XLCsbh75cUI0jnI74dwU=", - "dev": true, - "requires": { - "source-map": "^0.5.1" - } - }, - "vm-browserify": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-1.1.0.tgz", - "integrity": "sha512-iq+S7vZJE60yejDYM0ek6zg308+UZsdtPExWP9VZoCFCz1zkJoXFnAX7aZfd/ZwrkidzdUZL0C/ryW+JwAiIGw==", - "dev": true - }, - "webgpu": { - "version": "0.1.16", - "resolved": "https://registry.npmjs.org/webgpu/-/webgpu-0.1.16.tgz", - "integrity": "sha512-KAXn/f8lnL8o4B718zzdfi1l0nEWQpuoWlC1L5WM/svAbeHjShCEI0l5ZcZBEEUm9FF3ZTgRjWk8iwbJfnGKTA==" - }, - "which": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", - "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", - "dev": true, - "requires": { - "isexe": "^2.0.0" - } - }, - "which-module": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/which-module/-/which-module-1.0.0.tgz", - "integrity": "sha1-u6Y8qGGUiZT/MHc2CJ47lgJsKk8=", - "dev": true - }, - "which-pm-runs": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/which-pm-runs/-/which-pm-runs-1.1.0.tgz", - "integrity": "sha512-n1brCuqClxfFfq/Rb0ICg9giSZqCS+pLtccdag6C2HyufBrh3fBOiy9nb6ggRMvWOVH5GrdJskj5iGTZNxd7SA==", - "peer": true - }, - "which-typed-array": { - "version": "1.1.9", - "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.9.tgz", - "integrity": "sha512-w9c4xkx6mPidwp7180ckYWfMmvxpjlZuIudNtDf4N/tTAUB8VJbX25qZoAsrtGuYNnGw3pa0AXgbGKRB8/EceA==", - "dev": true, - "requires": { - "available-typed-arrays": "^1.0.5", - "call-bind": "^1.0.2", - "for-each": "^0.3.3", - "gopd": "^1.0.1", - "has-tostringtag": "^1.0.0", - "is-typed-array": "^1.1.10" - } - }, - "wide-align": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.5.tgz", - "integrity": "sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==", - "requires": { - "string-width": "^1.0.2 || 2 || 3 || 4" - } - }, - "wrap-ansi": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", - "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=", - "dev": true, - "requires": { - "string-width": "^1.0.1", - "strip-ansi": "^3.0.1" - } - }, - "wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" - }, - "ws": { - "version": "8.2.3", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.2.3.tgz", - "integrity": "sha512-wBuoj1BDpC6ZQ1B7DWQBYVLphPWkm8i9Y0/3YdHjHKHiohOJ1ws+3OccDWtH+PoC9DZD5WOTrJvNbWvjS6JWaA==", - "dev": true, - "requires": {} - }, - "xmlhttprequest-ssl": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/xmlhttprequest-ssl/-/xmlhttprequest-ssl-2.0.0.tgz", - "integrity": "sha512-QKxVRxiRACQcVuQEYFsI1hhkrMlrXHPegbbd1yn9UHOmRxY+si12nQYzri3vbzt8VdTTRviqcKxcyllFas5z2A==", - "dev": true - }, - "xtend": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", - "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==" - }, - "y18n": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.2.tgz", - "integrity": "sha512-uGZHXkHnhF0XeeAPgnKfPv1bgKAYyVvmNL1xlKsPYZPaIHxGti2hHqvOCQv71XMsLxu1QjergkqogUnms5D3YQ==", - "dev": true - }, - "yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" - }, - "yargs": { - "version": "17.6.2", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.6.2.tgz", - "integrity": "sha512-1/9UrdHjDZc0eOU0HxOHoS78C69UD3JRMvzlJ7S79S2nTaWRA/whGCTV8o9e/N/1Va9YIV7Q4sOxD8VV4pCWOw==", - "dev": true, - "requires": { - "cliui": "^8.0.1", - "escalade": "^3.1.1", - "get-caller-file": "^2.0.5", - "require-directory": "^2.1.1", - "string-width": "^4.2.3", - "y18n": "^5.0.5", - "yargs-parser": "^21.1.1" - }, - "dependencies": { - "ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true - }, - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "cliui": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", - "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", - "dev": true, - "requires": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.1", - "wrap-ansi": "^7.0.0" - } - }, - "get-caller-file": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", - "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", - "dev": true - }, - "is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true - }, - "string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, - "requires": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - } - }, - "strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, - "requires": { - "ansi-regex": "^5.0.1" - } - }, - "wrap-ansi": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "dev": true, - "requires": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - } - }, - "y18n": { - "version": "5.0.8", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", - "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", - "dev": true - }, - "yargs-parser": { - "version": "21.1.1", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", - "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", - "dev": true - } - } - }, - "yargs-parser": { - "version": "20.2.9", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", - "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", - "dev": true - }, - "yocto-queue": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", - "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", - "dev": true - } - } -} diff --git a/package.json b/package.json index f5d48950..39861cc2 100644 --- a/package.json +++ b/package.json @@ -5,7 +5,15 @@ "engines": { "node": ">=8.0.0" }, - "main": "./src/index.js", + "main": "./dist/gpu-node.js", + "exports": { + ".": { + "require": "./dist/gpu-node.js", + "import": "./dist/gpu-node.esm.js", + "types": "./src/index.d.ts", + "node": "./dist/gpu-node.js" + } + }, "files": [ "src", "dist" @@ -18,39 +26,34 @@ "test": "test" }, "dependencies": { - "acorn": "^7.1.1", - "gl": "^5.0.3", + "acorn": "^8.8.2", + "gl": "^6.0.2", "gl-wiretap": "^0.6.2", - "gpu-mock.js": "^1.3.0", - "webgpu": "^0.1.16" + "gpu-mock.js": "^1.3.1" }, "devDependencies": { + "@rollup/plugin-commonjs": "^24.0.1", + "@rollup/plugin-json": "^6.0.0", + "@rollup/plugin-node-resolve": "^15.0.1", + "@rollup/plugin-replace": "^5.0.2", + "@rollup/plugin-terser": "^0.4.0", "benchmark": "^2.1.4", - "browser-sync": "^2.26.7", - "browserify": "^17.0.0", "c8": "^7.12.0", - "gulp": "^4.0.0", - "gulp-concat": "^2.6.0", - "gulp-header": "^1.7.1", - "gulp-jsbeautifier": "^2.1.0", - "gulp-rename": "^1.2.2", - "gulp-replace": "^1.0.0", - "gulp-strip-comments": "^2.4.5", - "gulp-uglify-es": "^3.0.0", - "merge-stream": "^1.0.1", + "esno": "^0.16.3", + "prettier": "^2.8.3", "qunit": "^2.9.1", "read-dir-deep": "^7.0.1", + "rollup": "^3.12.0", "sinon": "^7.3.2", - "vinyl-buffer": "^1.0.0", - "vinyl-source-stream": "^2.0.0" + "source-map-support": "^0.5.21" }, "scripts": { "test": "qunit test/issues test/internal test/features", + "test:browser": "node scripts/build-tests.js", "coverage": "c8 qunit test/issues test/internal test/features", - "setup": "npm i -g gulp-cli", - "make": "gulp make", - "build": "gulp build", - "docs": "doxdox ./src --layout bootstrap --output docs.html" + "lint": "prettier -w . --cache --no-color --loglevel warn", + "build": "rollup -c --bundleConfigAsCjs", + "watch": "pnpm run build --watch" }, "repository": { "type": "git", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml new file mode 100644 index 00000000..9dde14be --- /dev/null +++ b/pnpm-lock.yaml @@ -0,0 +1,2104 @@ +lockfileVersion: 5.4 + +specifiers: + '@rollup/plugin-commonjs': ^24.0.1 + '@rollup/plugin-json': ^6.0.0 + '@rollup/plugin-node-resolve': ^15.0.1 + '@rollup/plugin-replace': ^5.0.2 + '@rollup/plugin-terser': ^0.4.0 + acorn: ^8.8.2 + benchmark: ^2.1.4 + c8: ^7.12.0 + esno: ^0.16.3 + gl: ^6.0.2 + gl-wiretap: ^0.6.2 + gpu-mock.js: ^1.3.1 + prettier: ^2.8.3 + qunit: ^2.9.1 + read-dir-deep: ^7.0.1 + rollup: ^3.12.0 + sinon: ^7.3.2 + source-map-support: ^0.5.21 + +dependencies: + acorn: 8.8.2 + gl: 6.0.2 + gl-wiretap: 0.6.2 + gpu-mock.js: 1.3.1 + +devDependencies: + '@rollup/plugin-commonjs': 24.0.1_rollup@3.12.0 + '@rollup/plugin-json': 6.0.0_rollup@3.12.0 + '@rollup/plugin-node-resolve': 15.0.1_rollup@3.12.0 + '@rollup/plugin-replace': 5.0.2_rollup@3.12.0 + '@rollup/plugin-terser': 0.4.0_rollup@3.12.0 + benchmark: 2.1.4 + c8: 7.12.0 + esno: 0.16.3 + prettier: 2.8.3 + qunit: 2.19.4 + read-dir-deep: 7.0.1 + rollup: 3.12.0 + sinon: 7.5.0 + source-map-support: 0.5.21 + +packages: + + /@bcoe/v8-coverage/0.2.3: + resolution: {integrity: sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==} + dev: true + + /@esbuild-kit/cjs-loader/2.4.1: + resolution: {integrity: sha512-lhc/XLith28QdW0HpHZvZKkorWgmCNT7sVelMHDj3HFdTfdqkwEKvT+aXVQtNAmCC39VJhunDkWhONWB7335mg==} + dependencies: + '@esbuild-kit/core-utils': 3.0.0 + get-tsconfig: 4.3.0 + dev: true + + /@esbuild-kit/core-utils/3.0.0: + resolution: {integrity: sha512-TXmwH9EFS3DC2sI2YJWJBgHGhlteK0Xyu1VabwetMULfm3oYhbrsWV5yaSr2NTWZIgDGVLHbRf0inxbjXqAcmQ==} + dependencies: + esbuild: 0.15.18 + source-map-support: 0.5.21 + dev: true + + /@esbuild-kit/esm-loader/2.5.4: + resolution: {integrity: sha512-afmtLf6uqxD5IgwCzomtqCYIgz/sjHzCWZFvfS5+FzeYxOURPUo4QcHtqJxbxWOMOogKriZanN/1bJQE/ZL93A==} + dependencies: + '@esbuild-kit/core-utils': 3.0.0 + get-tsconfig: 4.3.0 + dev: true + + /@esbuild/android-arm/0.15.18: + resolution: {integrity: sha512-5GT+kcs2WVGjVs7+boataCkO5Fg0y4kCjzkB5bAip7H4jfnOS3dA6KPiww9W1OEKTKeAcUVhdZGvgI65OXmUnw==} + engines: {node: '>=12'} + cpu: [arm] + os: [android] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-loong64/0.15.18: + resolution: {integrity: sha512-L4jVKS82XVhw2nvzLg/19ClLWg0y27ulRwuP7lcyL6AbUWB5aPglXY3M21mauDQMDfRLs8cQmeT03r/+X3cZYQ==} + engines: {node: '>=12'} + cpu: [loong64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@gar/promisify/1.1.3: + resolution: {integrity: sha512-k2Ty1JcVojjJFwrg/ThKi2ujJ7XNLYaFGNB/bWT9wGR+oSMJHMa5w+CUq6p/pVrKeNNgA7pCqEcjSnHVoqJQFw==} + dev: false + + /@istanbuljs/schema/0.1.3: + resolution: {integrity: sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==} + engines: {node: '>=8'} + dev: true + + /@jridgewell/gen-mapping/0.3.2: + resolution: {integrity: sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A==} + engines: {node: '>=6.0.0'} + dependencies: + '@jridgewell/set-array': 1.1.2 + '@jridgewell/sourcemap-codec': 1.4.14 + '@jridgewell/trace-mapping': 0.3.17 + dev: true + + /@jridgewell/resolve-uri/3.1.0: + resolution: {integrity: sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==} + engines: {node: '>=6.0.0'} + dev: true + + /@jridgewell/set-array/1.1.2: + resolution: {integrity: sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==} + engines: {node: '>=6.0.0'} + dev: true + + /@jridgewell/source-map/0.3.2: + resolution: {integrity: sha512-m7O9o2uR8k2ObDysZYzdfhb08VuEml5oWGiosa1VdaPZ/A6QyPkAJuwN0Q1lhULOf6B7MtQmHENS743hWtCrgw==} + dependencies: + '@jridgewell/gen-mapping': 0.3.2 + '@jridgewell/trace-mapping': 0.3.17 + dev: true + + /@jridgewell/sourcemap-codec/1.4.14: + resolution: {integrity: sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==} + dev: true + + /@jridgewell/trace-mapping/0.3.17: + resolution: {integrity: sha512-MCNzAp77qzKca9+W/+I0+sEpaUnZoeasnghNeVc41VZCEKaCH73Vq3BZZ/SzWIgrqE4H4ceI+p+b6C0mHf9T4g==} + dependencies: + '@jridgewell/resolve-uri': 3.1.0 + '@jridgewell/sourcemap-codec': 1.4.14 + dev: true + + /@nodelib/fs.scandir/2.1.5: + resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} + engines: {node: '>= 8'} + dependencies: + '@nodelib/fs.stat': 2.0.5 + run-parallel: 1.2.0 + dev: true + + /@nodelib/fs.stat/2.0.5: + resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} + engines: {node: '>= 8'} + dev: true + + /@nodelib/fs.walk/1.2.8: + resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} + engines: {node: '>= 8'} + dependencies: + '@nodelib/fs.scandir': 2.1.5 + fastq: 1.15.0 + dev: true + + /@npmcli/fs/2.1.2: + resolution: {integrity: sha512-yOJKRvohFOaLqipNtwYB9WugyZKhC/DZC4VYPmpaCzDBrA8YpK3qHZ8/HGscMnE4GqbkLNuVcCnxkeQEdGt6LQ==} + engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} + dependencies: + '@gar/promisify': 1.1.3 + semver: 7.3.8 + dev: false + + /@npmcli/move-file/2.0.1: + resolution: {integrity: sha512-mJd2Z5TjYWq/ttPLLGqArdtnC74J6bOzg4rMDnN+p1xTacZ2yPRCk2y0oSWQtygLR9YVQXgOcONrwtnk3JupxQ==} + engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} + deprecated: This functionality has been moved to @npmcli/fs + dependencies: + mkdirp: 1.0.4 + rimraf: 3.0.2 + dev: false + + /@rollup/plugin-commonjs/24.0.1_rollup@3.12.0: + resolution: {integrity: sha512-15LsiWRZk4eOGqvrJyu3z3DaBu5BhXIMeWnijSRvd8irrrg9SHpQ1pH+BUK4H6Z9wL9yOxZJMTLU+Au86XHxow==} + engines: {node: '>=14.0.0'} + peerDependencies: + rollup: ^2.68.0||^3.0.0 + peerDependenciesMeta: + rollup: + optional: true + dependencies: + '@rollup/pluginutils': 5.0.2_rollup@3.12.0 + commondir: 1.0.1 + estree-walker: 2.0.2 + glob: 8.1.0 + is-reference: 1.2.1 + magic-string: 0.27.0 + rollup: 3.12.0 + dev: true + + /@rollup/plugin-json/6.0.0_rollup@3.12.0: + resolution: {integrity: sha512-i/4C5Jrdr1XUarRhVu27EEwjt4GObltD7c+MkCIpO2QIbojw8MUs+CCTqOphQi3Qtg1FLmYt+l+6YeoIf51J7w==} + engines: {node: '>=14.0.0'} + peerDependencies: + rollup: ^1.20.0||^2.0.0||^3.0.0 + peerDependenciesMeta: + rollup: + optional: true + dependencies: + '@rollup/pluginutils': 5.0.2_rollup@3.12.0 + rollup: 3.12.0 + dev: true + + /@rollup/plugin-node-resolve/15.0.1_rollup@3.12.0: + resolution: {integrity: sha512-ReY88T7JhJjeRVbfCyNj+NXAG3IIsVMsX9b5/9jC98dRP8/yxlZdz7mHZbHk5zHr24wZZICS5AcXsFZAXYUQEg==} + engines: {node: '>=14.0.0'} + peerDependencies: + rollup: ^2.78.0||^3.0.0 + peerDependenciesMeta: + rollup: + optional: true + dependencies: + '@rollup/pluginutils': 5.0.2_rollup@3.12.0 + '@types/resolve': 1.20.2 + deepmerge: 4.2.2 + is-builtin-module: 3.2.0 + is-module: 1.0.0 + resolve: 1.22.1 + rollup: 3.12.0 + dev: true + + /@rollup/plugin-replace/5.0.2_rollup@3.12.0: + resolution: {integrity: sha512-M9YXNekv/C/iHHK+cvORzfRYfPbq0RDD8r0G+bMiTXjNGKulPnCT9O3Ss46WfhI6ZOCgApOP7xAdmCQJ+U2LAA==} + engines: {node: '>=14.0.0'} + peerDependencies: + rollup: ^1.20.0||^2.0.0||^3.0.0 + peerDependenciesMeta: + rollup: + optional: true + dependencies: + '@rollup/pluginutils': 5.0.2_rollup@3.12.0 + magic-string: 0.27.0 + rollup: 3.12.0 + dev: true + + /@rollup/plugin-terser/0.4.0_rollup@3.12.0: + resolution: {integrity: sha512-Ipcf3LPNerey1q9ZMjiaWHlNPEHNU/B5/uh9zXLltfEQ1lVSLLeZSgAtTPWGyw8Ip1guOeq+mDtdOlEj/wNxQw==} + engines: {node: '>=14.0.0'} + peerDependencies: + rollup: ^2.x || ^3.x + peerDependenciesMeta: + rollup: + optional: true + dependencies: + rollup: 3.12.0 + serialize-javascript: 6.0.1 + smob: 0.0.6 + terser: 5.16.1 + dev: true + + /@rollup/pluginutils/5.0.2_rollup@3.12.0: + resolution: {integrity: sha512-pTd9rIsP92h+B6wWwFbW8RkZv4hiR/xKsqre4SIuAOaOEQRxi0lqLke9k2/7WegC85GgUs9pjmOjCUi3In4vwA==} + engines: {node: '>=14.0.0'} + peerDependencies: + rollup: ^1.20.0||^2.0.0||^3.0.0 + peerDependenciesMeta: + rollup: + optional: true + dependencies: + '@types/estree': 1.0.0 + estree-walker: 2.0.2 + picomatch: 2.3.1 + rollup: 3.12.0 + dev: true + + /@sinonjs/commons/1.8.6: + resolution: {integrity: sha512-Ky+XkAkqPZSm3NLBeUng77EBQl3cmeJhITaGHdYH8kjVB+aun3S4XBRti2zt17mtt0mIUDiNxYeoJm6drVvBJQ==} + dependencies: + type-detect: 4.0.8 + dev: true + + /@sinonjs/formatio/3.2.2: + resolution: {integrity: sha512-B8SEsgd8gArBLMD6zpRw3juQ2FVSsmdd7qlevyDqzS9WTCtvF55/gAL+h6gue8ZvPYcdiPdvueM/qm//9XzyTQ==} + dependencies: + '@sinonjs/commons': 1.8.6 + '@sinonjs/samsam': 3.3.3 + dev: true + + /@sinonjs/samsam/3.3.3: + resolution: {integrity: sha512-bKCMKZvWIjYD0BLGnNrxVuw4dkWCYsLqFOUWw8VgKF/+5Y+mE7LfHWPIYoDXowH+3a9LsWDMo0uAP8YDosPvHQ==} + dependencies: + '@sinonjs/commons': 1.8.6 + array-from: 2.1.1 + lodash: 4.17.21 + dev: true + + /@sinonjs/text-encoding/0.7.2: + resolution: {integrity: sha512-sXXKG+uL9IrKqViTtao2Ws6dy0znu9sOaP1di/jKGW1M6VssO8vlpXCQcpZ+jisQ1tTFAC5Jo/EOzFbggBagFQ==} + dev: true + + /@tootallnate/once/2.0.0: + resolution: {integrity: sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==} + engines: {node: '>= 10'} + dev: false + + /@types/estree/1.0.0: + resolution: {integrity: sha512-WulqXMDUTYAXCjZnk6JtIHPigp55cVtDgDrO2gHRwhyJto21+1zbVCtOYB2L1F9w4qCQ0rOGWBnBe0FNTiEJIQ==} + dev: true + + /@types/glob/7.2.0: + resolution: {integrity: sha512-ZUxbzKl0IfJILTS6t7ip5fQQM/J3TJYubDm3nMbgubNNYS62eXeUpoLUC8/7fJNiFYHTrGPQn7hspDUzIHX3UA==} + dependencies: + '@types/minimatch': 5.1.2 + '@types/node': 18.11.18 + dev: true + + /@types/istanbul-lib-coverage/2.0.4: + resolution: {integrity: sha512-z/QT1XN4K4KYuslS23k62yDIDLwLFkzxOuMplDtObz0+y7VqJCaO2o+SPwHCvLFZh7xazvvoor2tA/hPz9ee7g==} + dev: true + + /@types/minimatch/5.1.2: + resolution: {integrity: sha512-K0VQKziLUWkVKiRVrx4a40iPaxTUefQmjtkQofBkYRcoaaL/8rhwDWww9qWbrgicNOgnpIsMxyNIUM4+n6dUIA==} + dev: true + + /@types/node/18.11.18: + resolution: {integrity: sha512-DHQpWGjyQKSHj3ebjFI/wRKcqQcdR+MoFBygntYOZytCqNfkd2ZC4ARDJ2DQqhjH5p85Nnd3jhUJIXrszFX/JA==} + dev: true + + /@types/resolve/1.20.2: + resolution: {integrity: sha512-60BCwRFOZCQhDncwQdxxeOEEkbc5dIMccYLwbxsS4TUNeVECQ/pBJ0j09mrHOl/JJvpRPGwO9SvE4nR2Nb/a4Q==} + dev: true + + /abbrev/1.1.1: + resolution: {integrity: sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==} + dev: false + + /acorn/8.8.2: + resolution: {integrity: sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw==} + engines: {node: '>=0.4.0'} + hasBin: true + + /agent-base/6.0.2: + resolution: {integrity: sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==} + engines: {node: '>= 6.0.0'} + dependencies: + debug: 4.3.4 + transitivePeerDependencies: + - supports-color + dev: false + + /agentkeepalive/4.2.1: + resolution: {integrity: sha512-Zn4cw2NEqd+9fiSVWMscnjyQ1a8Yfoc5oBajLeo5w+YBHgDUcEBY2hS4YpTz6iN5f/2zQiktcuM6tS8x1p9dpA==} + engines: {node: '>= 8.0.0'} + dependencies: + debug: 4.3.4 + depd: 1.1.2 + humanize-ms: 1.2.1 + transitivePeerDependencies: + - supports-color + dev: false + + /aggregate-error/3.1.0: + resolution: {integrity: sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==} + engines: {node: '>=8'} + dependencies: + clean-stack: 2.2.0 + indent-string: 4.0.0 + dev: false + + /ansi-regex/5.0.1: + resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} + engines: {node: '>=8'} + + /ansi-styles/4.3.0: + resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} + engines: {node: '>=8'} + dependencies: + color-convert: 2.0.1 + dev: true + + /aproba/2.0.0: + resolution: {integrity: sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ==} + dev: false + + /are-we-there-yet/3.0.1: + resolution: {integrity: sha512-QZW4EDmGwlYur0Yyf/b2uGucHQMa8aFUP7eu9ddR73vvhFyt4V0Vl3QHPcTNJ8l6qYOBdxgXdnBXQrHilfRQBg==} + engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} + dependencies: + delegates: 1.0.0 + readable-stream: 3.6.0 + dev: false + + /array-from/2.1.1: + resolution: {integrity: sha512-GQTc6Uupx1FCavi5mPzBvVT7nEOeWMmUA9P95wpfpW1XwMSKs+KaymD5C2Up7KAUKg/mYwbsUYzdZWcoajlNZg==} + dev: true + + /array-union/2.1.0: + resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==} + engines: {node: '>=8'} + dev: true + + /balanced-match/1.0.2: + resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} + + /base64-js/1.5.1: + resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} + dev: false + + /benchmark/2.1.4: + resolution: {integrity: sha512-l9MlfN4M1K/H2fbhfMy3B7vJd6AGKJVQn2h6Sg/Yx+KckoUA7ewS5Vv6TjSq18ooE1kS9hhAlQRH3AkXIh/aOQ==} + dependencies: + lodash: 4.17.21 + platform: 1.3.6 + dev: true + + /bindings/1.5.0: + resolution: {integrity: sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==} + dependencies: + file-uri-to-path: 1.0.0 + dev: false + + /bit-twiddle/1.0.2: + resolution: {integrity: sha512-B9UhK0DKFZhoTFcfvAzhqsjStvGJp9vYWf3+6SNTtdSQnvIgfkHbgHrg/e4+TH71N2GDu8tpmCVoyfrL1d7ntA==} + dev: false + + /bl/4.1.0: + resolution: {integrity: sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==} + dependencies: + buffer: 5.7.1 + inherits: 2.0.4 + readable-stream: 3.6.0 + dev: false + + /brace-expansion/1.1.11: + resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} + dependencies: + balanced-match: 1.0.2 + concat-map: 0.0.1 + + /brace-expansion/2.0.1: + resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==} + dependencies: + balanced-match: 1.0.2 + + /braces/3.0.2: + resolution: {integrity: sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==} + engines: {node: '>=8'} + dependencies: + fill-range: 7.0.1 + dev: true + + /buffer-from/1.1.2: + resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} + dev: true + + /buffer/5.7.1: + resolution: {integrity: sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==} + dependencies: + base64-js: 1.5.1 + ieee754: 1.2.1 + dev: false + + /builtin-modules/3.3.0: + resolution: {integrity: sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw==} + engines: {node: '>=6'} + dev: true + + /c8/7.12.0: + resolution: {integrity: sha512-CtgQrHOkyxr5koX1wEUmN/5cfDa2ckbHRA4Gy5LAL0zaCFtVWJS5++n+w4/sr2GWGerBxgTjpKeDclk/Qk6W/A==} + engines: {node: '>=10.12.0'} + hasBin: true + dependencies: + '@bcoe/v8-coverage': 0.2.3 + '@istanbuljs/schema': 0.1.3 + find-up: 5.0.0 + foreground-child: 2.0.0 + istanbul-lib-coverage: 3.2.0 + istanbul-lib-report: 3.0.0 + istanbul-reports: 3.1.5 + rimraf: 3.0.2 + test-exclude: 6.0.0 + v8-to-istanbul: 9.0.1 + yargs: 16.2.0 + yargs-parser: 20.2.9 + dev: true + + /cacache/16.1.3: + resolution: {integrity: sha512-/+Emcj9DAXxX4cwlLmRI9c166RuL3w30zp4R7Joiv2cQTtTtA+jeuCAjH3ZlGnYS3tKENSrKhAzVVP9GVyzeYQ==} + engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} + dependencies: + '@npmcli/fs': 2.1.2 + '@npmcli/move-file': 2.0.1 + chownr: 2.0.0 + fs-minipass: 2.1.0 + glob: 8.1.0 + infer-owner: 1.0.4 + lru-cache: 7.14.1 + minipass: 3.3.6 + minipass-collect: 1.0.2 + minipass-flush: 1.0.5 + minipass-pipeline: 1.2.4 + mkdirp: 1.0.4 + p-map: 4.0.0 + promise-inflight: 1.0.1 + rimraf: 3.0.2 + ssri: 9.0.1 + tar: 6.1.13 + unique-filename: 2.0.1 + transitivePeerDependencies: + - bluebird + dev: false + + /chownr/1.1.4: + resolution: {integrity: sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==} + dev: false + + /chownr/2.0.0: + resolution: {integrity: sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==} + engines: {node: '>=10'} + dev: false + + /clean-stack/2.2.0: + resolution: {integrity: sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==} + engines: {node: '>=6'} + dev: false + + /cliui/7.0.4: + resolution: {integrity: sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==} + dependencies: + string-width: 4.2.3 + strip-ansi: 6.0.1 + wrap-ansi: 7.0.0 + dev: true + + /color-convert/2.0.1: + resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} + engines: {node: '>=7.0.0'} + dependencies: + color-name: 1.1.4 + dev: true + + /color-name/1.1.4: + resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} + dev: true + + /color-support/1.1.3: + resolution: {integrity: sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==} + hasBin: true + dev: false + + /commander/2.20.3: + resolution: {integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==} + dev: true + + /commander/7.2.0: + resolution: {integrity: sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==} + engines: {node: '>= 10'} + dev: true + + /commondir/1.0.1: + resolution: {integrity: sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==} + dev: true + + /concat-map/0.0.1: + resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} + + /console-control-strings/1.1.0: + resolution: {integrity: sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==} + dev: false + + /convert-source-map/1.9.0: + resolution: {integrity: sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==} + dev: true + + /core-util-is/1.0.3: + resolution: {integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==} + dev: false + + /cross-spawn/7.0.3: + resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==} + engines: {node: '>= 8'} + dependencies: + path-key: 3.1.1 + shebang-command: 2.0.0 + which: 2.0.2 + dev: true + + /debug/4.3.4: + resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==} + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + dependencies: + ms: 2.1.2 + dev: false + + /decompress-response/6.0.0: + resolution: {integrity: sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==} + engines: {node: '>=10'} + dependencies: + mimic-response: 3.1.0 + dev: false + + /deep-extend/0.6.0: + resolution: {integrity: sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==} + engines: {node: '>=4.0.0'} + dev: false + + /deepmerge/4.2.2: + resolution: {integrity: sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg==} + engines: {node: '>=0.10.0'} + dev: true + + /delegates/1.0.0: + resolution: {integrity: sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==} + dev: false + + /depd/1.1.2: + resolution: {integrity: sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==} + engines: {node: '>= 0.6'} + dev: false + + /detect-libc/2.0.1: + resolution: {integrity: sha512-463v3ZeIrcWtdgIg6vI6XUncguvr2TnGl4SzDXinkt9mSLpBJKXT3mW6xT3VQdDN11+WVs29pgvivTc4Lp8v+w==} + engines: {node: '>=8'} + dev: false + + /diff/3.5.0: + resolution: {integrity: sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==} + engines: {node: '>=0.3.1'} + dev: true + + /dir-glob/3.0.1: + resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} + engines: {node: '>=8'} + dependencies: + path-type: 4.0.0 + dev: true + + /emoji-regex/8.0.0: + resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} + + /encoding/0.1.13: + resolution: {integrity: sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==} + requiresBuild: true + dependencies: + iconv-lite: 0.6.3 + dev: false + optional: true + + /end-of-stream/1.4.4: + resolution: {integrity: sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==} + dependencies: + once: 1.4.0 + dev: false + + /env-paths/2.2.1: + resolution: {integrity: sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==} + engines: {node: '>=6'} + dev: false + + /err-code/2.0.3: + resolution: {integrity: sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA==} + dev: false + + /esbuild-android-64/0.15.18: + resolution: {integrity: sha512-wnpt3OXRhcjfIDSZu9bnzT4/TNTDsOUvip0foZOUBG7QbSt//w3QV4FInVJxNhKc/ErhUxc5z4QjHtMi7/TbgA==} + engines: {node: '>=12'} + cpu: [x64] + os: [android] + requiresBuild: true + dev: true + optional: true + + /esbuild-android-arm64/0.15.18: + resolution: {integrity: sha512-G4xu89B8FCzav9XU8EjsXacCKSG2FT7wW9J6hOc18soEHJdtWu03L3TQDGf0geNxfLTtxENKBzMSq9LlbjS8OQ==} + engines: {node: '>=12'} + cpu: [arm64] + os: [android] + requiresBuild: true + dev: true + optional: true + + /esbuild-darwin-64/0.15.18: + resolution: {integrity: sha512-2WAvs95uPnVJPuYKP0Eqx+Dl/jaYseZEUUT1sjg97TJa4oBtbAKnPnl3b5M9l51/nbx7+QAEtuummJZW0sBEmg==} + engines: {node: '>=12'} + cpu: [x64] + os: [darwin] + requiresBuild: true + dev: true + optional: true + + /esbuild-darwin-arm64/0.15.18: + resolution: {integrity: sha512-tKPSxcTJ5OmNb1btVikATJ8NftlyNlc8BVNtyT/UAr62JFOhwHlnoPrhYWz09akBLHI9nElFVfWSTSRsrZiDUA==} + engines: {node: '>=12'} + cpu: [arm64] + os: [darwin] + requiresBuild: true + dev: true + optional: true + + /esbuild-freebsd-64/0.15.18: + resolution: {integrity: sha512-TT3uBUxkteAjR1QbsmvSsjpKjOX6UkCstr8nMr+q7zi3NuZ1oIpa8U41Y8I8dJH2fJgdC3Dj3CXO5biLQpfdZA==} + engines: {node: '>=12'} + cpu: [x64] + os: [freebsd] + requiresBuild: true + dev: true + optional: true + + /esbuild-freebsd-arm64/0.15.18: + resolution: {integrity: sha512-R/oVr+X3Tkh+S0+tL41wRMbdWtpWB8hEAMsOXDumSSa6qJR89U0S/PpLXrGF7Wk/JykfpWNokERUpCeHDl47wA==} + engines: {node: '>=12'} + cpu: [arm64] + os: [freebsd] + requiresBuild: true + dev: true + optional: true + + /esbuild-linux-32/0.15.18: + resolution: {integrity: sha512-lphF3HiCSYtaa9p1DtXndiQEeQDKPl9eN/XNoBf2amEghugNuqXNZA/ZovthNE2aa4EN43WroO0B85xVSjYkbg==} + engines: {node: '>=12'} + cpu: [ia32] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /esbuild-linux-64/0.15.18: + resolution: {integrity: sha512-hNSeP97IviD7oxLKFuii5sDPJ+QHeiFTFLoLm7NZQligur8poNOWGIgpQ7Qf8Balb69hptMZzyOBIPtY09GZYw==} + engines: {node: '>=12'} + cpu: [x64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /esbuild-linux-arm/0.15.18: + resolution: {integrity: sha512-UH779gstRblS4aoS2qpMl3wjg7U0j+ygu3GjIeTonCcN79ZvpPee12Qun3vcdxX+37O5LFxz39XeW2I9bybMVA==} + engines: {node: '>=12'} + cpu: [arm] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /esbuild-linux-arm64/0.15.18: + resolution: {integrity: sha512-54qr8kg/6ilcxd+0V3h9rjT4qmjc0CccMVWrjOEM/pEcUzt8X62HfBSeZfT2ECpM7104mk4yfQXkosY8Quptug==} + engines: {node: '>=12'} + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /esbuild-linux-mips64le/0.15.18: + resolution: {integrity: sha512-Mk6Ppwzzz3YbMl/ZZL2P0q1tnYqh/trYZ1VfNP47C31yT0K8t9s7Z077QrDA/guU60tGNp2GOwCQnp+DYv7bxQ==} + engines: {node: '>=12'} + cpu: [mips64el] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /esbuild-linux-ppc64le/0.15.18: + resolution: {integrity: sha512-b0XkN4pL9WUulPTa/VKHx2wLCgvIAbgwABGnKMY19WhKZPT+8BxhZdqz6EgkqCLld7X5qiCY2F/bfpUUlnFZ9w==} + engines: {node: '>=12'} + cpu: [ppc64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /esbuild-linux-riscv64/0.15.18: + resolution: {integrity: sha512-ba2COaoF5wL6VLZWn04k+ACZjZ6NYniMSQStodFKH/Pu6RxzQqzsmjR1t9QC89VYJxBeyVPTaHuBMCejl3O/xg==} + engines: {node: '>=12'} + cpu: [riscv64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /esbuild-linux-s390x/0.15.18: + resolution: {integrity: sha512-VbpGuXEl5FCs1wDVp93O8UIzl3ZrglgnSQ+Hu79g7hZu6te6/YHgVJxCM2SqfIila0J3k0csfnf8VD2W7u2kzQ==} + engines: {node: '>=12'} + cpu: [s390x] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /esbuild-netbsd-64/0.15.18: + resolution: {integrity: sha512-98ukeCdvdX7wr1vUYQzKo4kQ0N2p27H7I11maINv73fVEXt2kyh4K4m9f35U1K43Xc2QGXlzAw0K9yoU7JUjOg==} + engines: {node: '>=12'} + cpu: [x64] + os: [netbsd] + requiresBuild: true + dev: true + optional: true + + /esbuild-openbsd-64/0.15.18: + resolution: {integrity: sha512-yK5NCcH31Uae076AyQAXeJzt/vxIo9+omZRKj1pauhk3ITuADzuOx5N2fdHrAKPxN+zH3w96uFKlY7yIn490xQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [openbsd] + requiresBuild: true + dev: true + optional: true + + /esbuild-sunos-64/0.15.18: + resolution: {integrity: sha512-On22LLFlBeLNj/YF3FT+cXcyKPEI263nflYlAhz5crxtp3yRG1Ugfr7ITyxmCmjm4vbN/dGrb/B7w7U8yJR9yw==} + engines: {node: '>=12'} + cpu: [x64] + os: [sunos] + requiresBuild: true + dev: true + optional: true + + /esbuild-windows-32/0.15.18: + resolution: {integrity: sha512-o+eyLu2MjVny/nt+E0uPnBxYuJHBvho8vWsC2lV61A7wwTWC3jkN2w36jtA+yv1UgYkHRihPuQsL23hsCYGcOQ==} + engines: {node: '>=12'} + cpu: [ia32] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /esbuild-windows-64/0.15.18: + resolution: {integrity: sha512-qinug1iTTaIIrCorAUjR0fcBk24fjzEedFYhhispP8Oc7SFvs+XeW3YpAKiKp8dRpizl4YYAhxMjlftAMJiaUw==} + engines: {node: '>=12'} + cpu: [x64] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /esbuild-windows-arm64/0.15.18: + resolution: {integrity: sha512-q9bsYzegpZcLziq0zgUi5KqGVtfhjxGbnksaBFYmWLxeV/S1fK4OLdq2DFYnXcLMjlZw2L0jLsk1eGoB522WXQ==} + engines: {node: '>=12'} + cpu: [arm64] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /esbuild/0.15.18: + resolution: {integrity: sha512-x/R72SmW3sSFRm5zrrIjAhCeQSAWoni3CmHEqfQrZIQTM3lVCdehdwuIqaOtfC2slvpdlLa62GYoN8SxT23m6Q==} + engines: {node: '>=12'} + hasBin: true + requiresBuild: true + optionalDependencies: + '@esbuild/android-arm': 0.15.18 + '@esbuild/linux-loong64': 0.15.18 + esbuild-android-64: 0.15.18 + esbuild-android-arm64: 0.15.18 + esbuild-darwin-64: 0.15.18 + esbuild-darwin-arm64: 0.15.18 + esbuild-freebsd-64: 0.15.18 + esbuild-freebsd-arm64: 0.15.18 + esbuild-linux-32: 0.15.18 + esbuild-linux-64: 0.15.18 + esbuild-linux-arm: 0.15.18 + esbuild-linux-arm64: 0.15.18 + esbuild-linux-mips64le: 0.15.18 + esbuild-linux-ppc64le: 0.15.18 + esbuild-linux-riscv64: 0.15.18 + esbuild-linux-s390x: 0.15.18 + esbuild-netbsd-64: 0.15.18 + esbuild-openbsd-64: 0.15.18 + esbuild-sunos-64: 0.15.18 + esbuild-windows-32: 0.15.18 + esbuild-windows-64: 0.15.18 + esbuild-windows-arm64: 0.15.18 + dev: true + + /escalade/3.1.1: + resolution: {integrity: sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==} + engines: {node: '>=6'} + dev: true + + /esno/0.16.3: + resolution: {integrity: sha512-6slSBEV1lMKcX13DBifvnDFpNno5WXhw4j/ff7RI0y51BZiDqEe5dNhhjhIQ3iCOQuzsm2MbVzmwqbN78BBhPg==} + hasBin: true + dependencies: + tsx: 3.12.2 + dev: true + + /estree-walker/2.0.2: + resolution: {integrity: sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==} + dev: true + + /expand-template/2.0.3: + resolution: {integrity: sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==} + engines: {node: '>=6'} + dev: false + + /fast-glob/3.2.12: + resolution: {integrity: sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w==} + engines: {node: '>=8.6.0'} + dependencies: + '@nodelib/fs.stat': 2.0.5 + '@nodelib/fs.walk': 1.2.8 + glob-parent: 5.1.2 + merge2: 1.4.1 + micromatch: 4.0.5 + dev: true + + /fastq/1.15.0: + resolution: {integrity: sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==} + dependencies: + reusify: 1.0.4 + dev: true + + /file-uri-to-path/1.0.0: + resolution: {integrity: sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==} + dev: false + + /fill-range/7.0.1: + resolution: {integrity: sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==} + engines: {node: '>=8'} + dependencies: + to-regex-range: 5.0.1 + dev: true + + /find-up/5.0.0: + resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} + engines: {node: '>=10'} + dependencies: + locate-path: 6.0.0 + path-exists: 4.0.0 + dev: true + + /foreground-child/2.0.0: + resolution: {integrity: sha512-dCIq9FpEcyQyXKCkyzmlPTFNgrCzPudOe+mhvJU5zAtlBnGVy2yKxtfsxK2tQBThwq225jcvBjpw1Gr40uzZCA==} + engines: {node: '>=8.0.0'} + dependencies: + cross-spawn: 7.0.3 + signal-exit: 3.0.7 + dev: true + + /fs-constants/1.0.0: + resolution: {integrity: sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==} + dev: false + + /fs-minipass/2.1.0: + resolution: {integrity: sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==} + engines: {node: '>= 8'} + dependencies: + minipass: 3.3.6 + dev: false + + /fs.realpath/1.0.0: + resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} + + /fsevents/2.3.2: + resolution: {integrity: sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==} + engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} + os: [darwin] + requiresBuild: true + dev: true + optional: true + + /function-bind/1.1.1: + resolution: {integrity: sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==} + dev: true + + /gauge/4.0.4: + resolution: {integrity: sha512-f9m+BEN5jkg6a0fZjleidjN51VE1X+mPFQ2DJ0uv1V39oCLCbsGe6yjbBnp7eK7z/+GAon99a3nHuqbuuthyPg==} + engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} + dependencies: + aproba: 2.0.0 + color-support: 1.1.3 + console-control-strings: 1.1.0 + has-unicode: 2.0.1 + signal-exit: 3.0.7 + string-width: 4.2.3 + strip-ansi: 6.0.1 + wide-align: 1.1.5 + dev: false + + /get-caller-file/2.0.5: + resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} + engines: {node: 6.* || 8.* || >= 10.*} + dev: true + + /get-tsconfig/4.3.0: + resolution: {integrity: sha512-YCcF28IqSay3fqpIu5y3Krg/utCBHBeoflkZyHj/QcqI2nrLPC3ZegS9CmIo+hJb8K7aiGsuUl7PwWVjNG2HQQ==} + dev: true + + /github-from-package/0.0.0: + resolution: {integrity: sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw==} + dev: false + + /gl-wiretap/0.6.2: + resolution: {integrity: sha512-fxy1XGiPkfzK+T3XKDbY7yaqMBmozCGvAFyTwaZA3imeZH83w7Hr3r3bYlMRWIyzMI/lDUvUMM/92LE2OwqFyQ==} + dev: false + + /gl/6.0.2: + resolution: {integrity: sha512-yBbfpChOtFvg5D+KtMaBFvj6yt3vUnheNAH+UrQH2TfDB8kr0tERdL0Tjhe0W7xJ6jR6ftQBluTZR9jXUnKe8g==} + engines: {node: '>=14.0.0'} + requiresBuild: true + dependencies: + bindings: 1.5.0 + bit-twiddle: 1.0.2 + glsl-tokenizer: 2.1.5 + nan: 2.17.0 + node-abi: 3.31.0 + node-gyp: 9.3.1 + prebuild-install: 7.1.1 + transitivePeerDependencies: + - bluebird + - supports-color + dev: false + + /glob-parent/5.1.2: + resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} + engines: {node: '>= 6'} + dependencies: + is-glob: 4.0.3 + dev: true + + /glob/7.2.3: + resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} + dependencies: + fs.realpath: 1.0.0 + inflight: 1.0.6 + inherits: 2.0.4 + minimatch: 3.1.2 + once: 1.4.0 + path-is-absolute: 1.0.1 + + /glob/8.1.0: + resolution: {integrity: sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==} + engines: {node: '>=12'} + dependencies: + fs.realpath: 1.0.0 + inflight: 1.0.6 + inherits: 2.0.4 + minimatch: 5.1.6 + once: 1.4.0 + + /globalyzer/0.1.0: + resolution: {integrity: sha512-40oNTM9UfG6aBmuKxk/giHn5nQ8RVz/SS4Ir6zgzOv9/qC3kKZ9v4etGTcJbEl/NyVQH7FGU7d+X1egr57Md2Q==} + dev: true + + /globby/10.0.2: + resolution: {integrity: sha512-7dUi7RvCoT/xast/o/dLN53oqND4yk0nsHkhRgn9w65C4PofCLOoJ39iSOg+qVDdWQPIEj+eszMHQ+aLVwwQSg==} + engines: {node: '>=8'} + dependencies: + '@types/glob': 7.2.0 + array-union: 2.1.0 + dir-glob: 3.0.1 + fast-glob: 3.2.12 + glob: 7.2.3 + ignore: 5.2.4 + merge2: 1.4.1 + slash: 3.0.0 + dev: true + + /globrex/0.1.2: + resolution: {integrity: sha512-uHJgbwAMwNFf5mLst7IWLNg14x1CkeqglJb/K3doi4dw6q2IvAAmM/Y81kevy83wP+Sst+nutFTYOGg3d1lsxg==} + dev: true + + /glsl-tokenizer/2.1.5: + resolution: {integrity: sha512-XSZEJ/i4dmz3Pmbnpsy3cKh7cotvFlBiZnDOwnj/05EwNp2XrhQ4XKJxT7/pDt4kp4YcpRSKz8eTV7S+mwV6MA==} + dependencies: + through2: 0.6.5 + dev: false + + /gpu-mock.js/1.3.1: + resolution: {integrity: sha512-+lbp8rQ0p1nTa6Gk6HoLiw4yM6JTpql82U+nCF3sZbX4FJWP9PzzF1018dW8K+pbmqRmhLHbn6Bjc6i6tgUpbA==} + peerDependencies: + gpu.js: ^2.10.3 + dev: false + + /graceful-fs/4.2.10: + resolution: {integrity: sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==} + dev: false + + /has-flag/3.0.0: + resolution: {integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==} + engines: {node: '>=4'} + dev: true + + /has-flag/4.0.0: + resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} + engines: {node: '>=8'} + dev: true + + /has-unicode/2.0.1: + resolution: {integrity: sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==} + dev: false + + /has/1.0.3: + resolution: {integrity: sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==} + engines: {node: '>= 0.4.0'} + dependencies: + function-bind: 1.1.1 + dev: true + + /html-escaper/2.0.2: + resolution: {integrity: sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==} + dev: true + + /http-cache-semantics/4.1.1: + resolution: {integrity: sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==} + dev: false + + /http-proxy-agent/5.0.0: + resolution: {integrity: sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==} + engines: {node: '>= 6'} + dependencies: + '@tootallnate/once': 2.0.0 + agent-base: 6.0.2 + debug: 4.3.4 + transitivePeerDependencies: + - supports-color + dev: false + + /https-proxy-agent/5.0.1: + resolution: {integrity: sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==} + engines: {node: '>= 6'} + dependencies: + agent-base: 6.0.2 + debug: 4.3.4 + transitivePeerDependencies: + - supports-color + dev: false + + /humanize-ms/1.2.1: + resolution: {integrity: sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ==} + dependencies: + ms: 2.1.3 + dev: false + + /iconv-lite/0.6.3: + resolution: {integrity: sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==} + engines: {node: '>=0.10.0'} + dependencies: + safer-buffer: 2.1.2 + dev: false + optional: true + + /ieee754/1.2.1: + resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} + dev: false + + /ignore/5.2.4: + resolution: {integrity: sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==} + engines: {node: '>= 4'} + dev: true + + /imurmurhash/0.1.4: + resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} + engines: {node: '>=0.8.19'} + dev: false + + /indent-string/4.0.0: + resolution: {integrity: sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==} + engines: {node: '>=8'} + dev: false + + /infer-owner/1.0.4: + resolution: {integrity: sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A==} + dev: false + + /inflight/1.0.6: + resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} + dependencies: + once: 1.4.0 + wrappy: 1.0.2 + + /inherits/2.0.4: + resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} + + /ini/1.3.8: + resolution: {integrity: sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==} + dev: false + + /ip/2.0.0: + resolution: {integrity: sha512-WKa+XuLG1A1R0UWhl2+1XQSi+fZWMsYKffMZTTYsiZaUD8k2yDAj5atimTUD2TZkyCkNEeYE5NhFZmupOGtjYQ==} + dev: false + + /is-builtin-module/3.2.0: + resolution: {integrity: sha512-phDA4oSGt7vl1n5tJvTWooWWAsXLY+2xCnxNqvKhGEzujg+A43wPlPOyDg3C8XQHN+6k/JTQWJ/j0dQh/qr+Hw==} + engines: {node: '>=6'} + dependencies: + builtin-modules: 3.3.0 + dev: true + + /is-core-module/2.11.0: + resolution: {integrity: sha512-RRjxlvLDkD1YJwDbroBHMb+cukurkDWNyHx7D3oNB5x9rb5ogcksMC5wHCadcXoo67gVr/+3GFySh3134zi6rw==} + dependencies: + has: 1.0.3 + dev: true + + /is-extglob/2.1.1: + resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} + engines: {node: '>=0.10.0'} + dev: true + + /is-fullwidth-code-point/3.0.0: + resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} + engines: {node: '>=8'} + + /is-glob/4.0.3: + resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} + engines: {node: '>=0.10.0'} + dependencies: + is-extglob: 2.1.1 + dev: true + + /is-lambda/1.0.1: + resolution: {integrity: sha512-z7CMFGNrENq5iFB9Bqo64Xk6Y9sg+epq1myIcdHaGnbMTYOxvzsEtdYqQUylB7LxfkvgrrjP32T6Ywciio9UIQ==} + dev: false + + /is-module/1.0.0: + resolution: {integrity: sha512-51ypPSPCoTEIN9dy5Oy+h4pShgJmPCygKfyRCISBI+JoWT/2oJvK8QPxmwv7b/p239jXrm9M1mlQbyKJ5A152g==} + dev: true + + /is-number/7.0.0: + resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} + engines: {node: '>=0.12.0'} + dev: true + + /is-path-cwd/2.2.0: + resolution: {integrity: sha512-w942bTcih8fdJPJmQHFzkS76NEP8Kzzvmw92cXsazb8intwLqPibPPdXf4ANdKV3rYMuuQYGIWtvz9JilB3NFQ==} + engines: {node: '>=6'} + dev: true + + /is-path-in-cwd/3.0.0: + resolution: {integrity: sha512-QGuLYLNfpHI/xLQ8ctyeD9mMCf2eBqrtxYWKQxlExrD0l3wBSDcplKYfV55lnTDB4MDvh9SRDt/VnDwVn0dYOw==} + engines: {node: '>=8'} + dependencies: + is-path-inside: 3.0.3 + dev: true + + /is-path-inside/3.0.3: + resolution: {integrity: sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==} + engines: {node: '>=8'} + dev: true + + /is-reference/1.2.1: + resolution: {integrity: sha512-U82MsXXiFIrjCK4otLT+o2NA2Cd2g5MLoOVXUZjIOhLurrRxpEXzI8O0KZHr3IjLvlAH1kTPYSuqer5T9ZVBKQ==} + dependencies: + '@types/estree': 1.0.0 + dev: true + + /isarray/0.0.1: + resolution: {integrity: sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==} + + /isexe/2.0.0: + resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} + + /istanbul-lib-coverage/3.2.0: + resolution: {integrity: sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw==} + engines: {node: '>=8'} + dev: true + + /istanbul-lib-report/3.0.0: + resolution: {integrity: sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw==} + engines: {node: '>=8'} + dependencies: + istanbul-lib-coverage: 3.2.0 + make-dir: 3.1.0 + supports-color: 7.2.0 + dev: true + + /istanbul-reports/3.1.5: + resolution: {integrity: sha512-nUsEMa9pBt/NOHqbcbeJEgqIlY/K7rVWUX6Lql2orY5e9roQOthbR3vtY4zzf2orPELg80fnxxk9zUyPlgwD1w==} + engines: {node: '>=8'} + dependencies: + html-escaper: 2.0.2 + istanbul-lib-report: 3.0.0 + dev: true + + /just-extend/4.2.1: + resolution: {integrity: sha512-g3UB796vUFIY90VIv/WX3L2c8CS2MdWUww3CNrYmqza1Fg0DURc2K/O4YrnklBdQarSJ/y8JnJYDGc+1iumQjg==} + dev: true + + /locate-path/6.0.0: + resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} + engines: {node: '>=10'} + dependencies: + p-locate: 5.0.0 + dev: true + + /lodash/4.17.21: + resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} + dev: true + + /lolex/4.2.0: + resolution: {integrity: sha512-gKO5uExCXvSm6zbF562EvM+rd1kQDnB9AZBbiQVzf1ZmdDpxUSvpnAaVOP83N/31mRK8Ml8/VE8DMvsAZQ+7wg==} + dev: true + + /lolex/5.1.2: + resolution: {integrity: sha512-h4hmjAvHTmd+25JSwrtTIuwbKdwg5NzZVRMLn9saij4SZaepCrTCxPr35H/3bjwfMJtN+t3CX8672UIkglz28A==} + dependencies: + '@sinonjs/commons': 1.8.6 + dev: true + + /lru-cache/6.0.0: + resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==} + engines: {node: '>=10'} + dependencies: + yallist: 4.0.0 + dev: false + + /lru-cache/7.14.1: + resolution: {integrity: sha512-ysxwsnTKdAx96aTRdhDOCQfDgbHnt8SK0KY8SEjO0wHinhWOFTESbjVCMPbU1uGXg/ch4lifqx0wfjOawU2+WA==} + engines: {node: '>=12'} + dev: false + + /magic-string/0.27.0: + resolution: {integrity: sha512-8UnnX2PeRAPZuN12svgR9j7M1uWMovg/CEnIwIG0LFkXSJJe4PdfUGiTGl8V9bsBHFUtfVINcSyYxd7q+kx9fA==} + engines: {node: '>=12'} + dependencies: + '@jridgewell/sourcemap-codec': 1.4.14 + dev: true + + /make-dir/3.1.0: + resolution: {integrity: sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==} + engines: {node: '>=8'} + dependencies: + semver: 6.3.0 + dev: true + + /make-fetch-happen/10.2.1: + resolution: {integrity: sha512-NgOPbRiaQM10DYXvN3/hhGVI2M5MtITFryzBGxHM5p4wnFxsVCbxkrBrDsk+EZ5OB4jEOT7AjDxtdF+KVEFT7w==} + engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} + dependencies: + agentkeepalive: 4.2.1 + cacache: 16.1.3 + http-cache-semantics: 4.1.1 + http-proxy-agent: 5.0.0 + https-proxy-agent: 5.0.1 + is-lambda: 1.0.1 + lru-cache: 7.14.1 + minipass: 3.3.6 + minipass-collect: 1.0.2 + minipass-fetch: 2.1.2 + minipass-flush: 1.0.5 + minipass-pipeline: 1.2.4 + negotiator: 0.6.3 + promise-retry: 2.0.1 + socks-proxy-agent: 7.0.0 + ssri: 9.0.1 + transitivePeerDependencies: + - bluebird + - supports-color + dev: false + + /merge2/1.4.1: + resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} + engines: {node: '>= 8'} + dev: true + + /micromatch/4.0.5: + resolution: {integrity: sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==} + engines: {node: '>=8.6'} + dependencies: + braces: 3.0.2 + picomatch: 2.3.1 + dev: true + + /mimic-response/3.1.0: + resolution: {integrity: sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==} + engines: {node: '>=10'} + dev: false + + /minimatch/3.1.2: + resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} + dependencies: + brace-expansion: 1.1.11 + + /minimatch/5.1.6: + resolution: {integrity: sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==} + engines: {node: '>=10'} + dependencies: + brace-expansion: 2.0.1 + + /minimist/1.2.7: + resolution: {integrity: sha512-bzfL1YUZsP41gmu/qjrEk0Q6i2ix/cVeAhbCbqH9u3zYutS1cLg00qhrD0M2MVdCcx4Sc0UpP2eBWo9rotpq6g==} + dev: false + + /minipass-collect/1.0.2: + resolution: {integrity: sha512-6T6lH0H8OG9kITm/Jm6tdooIbogG9e0tLgpY6mphXSm/A9u8Nq1ryBG+Qspiub9LjWlBPsPS3tWQ/Botq4FdxA==} + engines: {node: '>= 8'} + dependencies: + minipass: 3.3.6 + dev: false + + /minipass-fetch/2.1.2: + resolution: {integrity: sha512-LT49Zi2/WMROHYoqGgdlQIZh8mLPZmOrN2NdJjMXxYe4nkN6FUyuPuOAOedNJDrx0IRGg9+4guZewtp8hE6TxA==} + engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} + dependencies: + minipass: 3.3.6 + minipass-sized: 1.0.3 + minizlib: 2.1.2 + optionalDependencies: + encoding: 0.1.13 + dev: false + + /minipass-flush/1.0.5: + resolution: {integrity: sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw==} + engines: {node: '>= 8'} + dependencies: + minipass: 3.3.6 + dev: false + + /minipass-pipeline/1.2.4: + resolution: {integrity: sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A==} + engines: {node: '>=8'} + dependencies: + minipass: 3.3.6 + dev: false + + /minipass-sized/1.0.3: + resolution: {integrity: sha512-MbkQQ2CTiBMlA2Dm/5cY+9SWFEN8pzzOXi6rlM5Xxq0Yqbda5ZQy9sU75a673FE9ZK0Zsbr6Y5iP6u9nktfg2g==} + engines: {node: '>=8'} + dependencies: + minipass: 3.3.6 + dev: false + + /minipass/3.3.6: + resolution: {integrity: sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==} + engines: {node: '>=8'} + dependencies: + yallist: 4.0.0 + dev: false + + /minipass/4.0.0: + resolution: {integrity: sha512-g2Uuh2jEKoht+zvO6vJqXmYpflPqzRBT+Th2h01DKh5z7wbY/AZ2gCQ78cP70YoHPyFdY30YBV5WxgLOEwOykw==} + engines: {node: '>=8'} + dependencies: + yallist: 4.0.0 + dev: false + + /minizlib/2.1.2: + resolution: {integrity: sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==} + engines: {node: '>= 8'} + dependencies: + minipass: 3.3.6 + yallist: 4.0.0 + dev: false + + /mkdirp-classic/0.5.3: + resolution: {integrity: sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==} + dev: false + + /mkdirp/1.0.4: + resolution: {integrity: sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==} + engines: {node: '>=10'} + hasBin: true + dev: false + + /ms/2.1.2: + resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} + dev: false + + /ms/2.1.3: + resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} + dev: false + + /nan/2.17.0: + resolution: {integrity: sha512-2ZTgtl0nJsO0KQCjEpxcIr5D+Yv90plTitZt9JBfQvVJDS5seMl3FOvsh3+9CoYWXf/1l5OaZzzF6nDm4cagaQ==} + dev: false + + /napi-build-utils/1.0.2: + resolution: {integrity: sha512-ONmRUqK7zj7DWX0D9ADe03wbwOBZxNAfF20PlGfCWQcD3+/MakShIHrMqx9YwPTfxDdF1zLeL+RGZiR9kGMLdg==} + dev: false + + /negotiator/0.6.3: + resolution: {integrity: sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==} + engines: {node: '>= 0.6'} + dev: false + + /nise/1.5.3: + resolution: {integrity: sha512-Ymbac/94xeIrMf59REBPOv0thr+CJVFMhrlAkW/gjCIE58BGQdCj0x7KRCb3yz+Ga2Rz3E9XXSvUyyxqqhjQAQ==} + dependencies: + '@sinonjs/formatio': 3.2.2 + '@sinonjs/text-encoding': 0.7.2 + just-extend: 4.2.1 + lolex: 5.1.2 + path-to-regexp: 1.8.0 + dev: true + + /node-abi/3.31.0: + resolution: {integrity: sha512-eSKV6s+APenqVh8ubJyiu/YhZgxQpGP66ntzUb3lY1xB9ukSRaGnx0AIxI+IM+1+IVYC1oWobgG5L3Lt9ARykQ==} + engines: {node: '>=10'} + dependencies: + semver: 7.3.8 + dev: false + + /node-gyp/9.3.1: + resolution: {integrity: sha512-4Q16ZCqq3g8awk6UplT7AuxQ35XN4R/yf/+wSAwcBUAjg7l58RTactWaP8fIDTi0FzI7YcVLujwExakZlfWkXg==} + engines: {node: ^12.13 || ^14.13 || >=16} + hasBin: true + dependencies: + env-paths: 2.2.1 + glob: 7.2.3 + graceful-fs: 4.2.10 + make-fetch-happen: 10.2.1 + nopt: 6.0.0 + npmlog: 6.0.2 + rimraf: 3.0.2 + semver: 7.3.8 + tar: 6.1.13 + which: 2.0.2 + transitivePeerDependencies: + - bluebird + - supports-color + dev: false + + /node-watch/0.7.3: + resolution: {integrity: sha512-3l4E8uMPY1HdMMryPRUAl+oIHtXtyiTlIiESNSVSNxcPfzAFzeTbXFQkZfAwBbo0B1qMSG8nUABx+Gd+YrbKrQ==} + engines: {node: '>=6'} + dev: true + + /nopt/6.0.0: + resolution: {integrity: sha512-ZwLpbTgdhuZUnZzjd7nb1ZV+4DoiC6/sfiVKok72ym/4Tlf+DFdlHYmT2JPmcNNWV6Pi3SDf1kT+A4r9RTuT9g==} + engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} + hasBin: true + dependencies: + abbrev: 1.1.1 + dev: false + + /npmlog/6.0.2: + resolution: {integrity: sha512-/vBvz5Jfr9dT/aFWd0FIRf+T/Q2WBsLENygUaFUqstqsycmZAP/t5BvFJTK0viFmSUxiUKTUplWy5vt+rvKIxg==} + engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} + dependencies: + are-we-there-yet: 3.0.1 + console-control-strings: 1.1.0 + gauge: 4.0.4 + set-blocking: 2.0.0 + dev: false + + /once/1.4.0: + resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} + dependencies: + wrappy: 1.0.2 + + /p-limit/3.1.0: + resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} + engines: {node: '>=10'} + dependencies: + yocto-queue: 0.1.0 + dev: true + + /p-locate/5.0.0: + resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} + engines: {node: '>=10'} + dependencies: + p-limit: 3.1.0 + dev: true + + /p-map/4.0.0: + resolution: {integrity: sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==} + engines: {node: '>=10'} + dependencies: + aggregate-error: 3.1.0 + dev: false + + /path-exists/4.0.0: + resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} + engines: {node: '>=8'} + dev: true + + /path-is-absolute/1.0.1: + resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} + engines: {node: '>=0.10.0'} + + /path-key/3.1.1: + resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} + engines: {node: '>=8'} + dev: true + + /path-parse/1.0.7: + resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} + dev: true + + /path-sort2/1.0.0: + resolution: {integrity: sha512-OwUzmr3+avyEANhpUkUv+nlwAM/sCX5y9Ylok8fj3OK3SmLclq7jyEoqSL5qi+5bJAOskWGZPtdtjnoRGy5lxA==} + dev: true + + /path-to-regexp/1.8.0: + resolution: {integrity: sha512-n43JRhlUKUAlibEJhPeir1ncUID16QnEjNpwzNdO3Lm4ywrBpBZ5oLD0I6br9evr1Y9JTqwRtAh7JLoOzAQdVA==} + dependencies: + isarray: 0.0.1 + dev: true + + /path-type/4.0.0: + resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} + engines: {node: '>=8'} + dev: true + + /picomatch/2.3.1: + resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} + engines: {node: '>=8.6'} + dev: true + + /platform/1.3.6: + resolution: {integrity: sha512-fnWVljUchTro6RiCFvCXBbNhJc2NijN7oIQxbwsyL0buWJPG85v81ehlHI9fXrJsMNgTofEoWIQeClKpgxFLrg==} + dev: true + + /prebuild-install/7.1.1: + resolution: {integrity: sha512-jAXscXWMcCK8GgCoHOfIr0ODh5ai8mj63L2nWrjuAgXE6tDyYGnx4/8o/rCgU+B4JSyZBKbeZqzhtwtC3ovxjw==} + engines: {node: '>=10'} + hasBin: true + dependencies: + detect-libc: 2.0.1 + expand-template: 2.0.3 + github-from-package: 0.0.0 + minimist: 1.2.7 + mkdirp-classic: 0.5.3 + napi-build-utils: 1.0.2 + node-abi: 3.31.0 + pump: 3.0.0 + rc: 1.2.8 + simple-get: 4.0.1 + tar-fs: 2.1.1 + tunnel-agent: 0.6.0 + dev: false + + /prettier/2.8.3: + resolution: {integrity: sha512-tJ/oJ4amDihPoufT5sM0Z1SKEuKay8LfVAMlbbhnnkvt6BUserZylqo2PN+p9KeljLr0OHa2rXHU1T8reeoTrw==} + engines: {node: '>=10.13.0'} + hasBin: true + dev: true + + /promise-inflight/1.0.1: + resolution: {integrity: sha512-6zWPyEOFaQBJYcGMHBKTKJ3u6TBsnMFOIZSa6ce1e/ZrrsOlnHRHbabMjLiBYKp+n44X9eUI6VUPaukCXHuG4g==} + peerDependencies: + bluebird: '*' + peerDependenciesMeta: + bluebird: + optional: true + dev: false + + /promise-retry/2.0.1: + resolution: {integrity: sha512-y+WKFlBR8BGXnsNlIHFGPZmyDf3DFMoLhaflAnyZgV6rG6xu+JwesTo2Q9R6XwYmtmwAFCkAk3e35jEdoeh/3g==} + engines: {node: '>=10'} + dependencies: + err-code: 2.0.3 + retry: 0.12.0 + dev: false + + /pump/3.0.0: + resolution: {integrity: sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==} + dependencies: + end-of-stream: 1.4.4 + once: 1.4.0 + dev: false + + /queue-microtask/1.2.3: + resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} + dev: true + + /qunit/2.19.4: + resolution: {integrity: sha512-aqUzzUeCqlleWYKlpgfdHHw9C6KxkB9H3wNfiBg5yHqQMzy0xw/pbCRHYFkjl8MsP/t8qkTQE+JTYL71azgiew==} + engines: {node: '>=10'} + hasBin: true + dependencies: + commander: 7.2.0 + node-watch: 0.7.3 + tiny-glob: 0.2.9 + dev: true + + /randombytes/2.1.0: + resolution: {integrity: sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==} + dependencies: + safe-buffer: 5.2.1 + dev: true + + /rc/1.2.8: + resolution: {integrity: sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==} + hasBin: true + dependencies: + deep-extend: 0.6.0 + ini: 1.3.8 + minimist: 1.2.7 + strip-json-comments: 2.0.1 + dev: false + + /read-dir-deep/7.0.1: + resolution: {integrity: sha512-w99fvgqJm3cJ5Vb7b3oGKRDnm/m11q7w5LQ9uBCXe+repIEf1rFtkXLlPAxNrSwlp4skyPyvKd4DNNiIuc0geg==} + engines: {node: '>=8.9.0'} + dependencies: + globby: 10.0.2 + is-path-cwd: 2.2.0 + is-path-in-cwd: 3.0.0 + path-sort2: 1.0.0 + slash: 3.0.0 + dev: true + + /readable-stream/1.0.34: + resolution: {integrity: sha512-ok1qVCJuRkNmvebYikljxJA/UEsKwLl2nI1OmaqAu4/UE+h0wKCHok4XkL/gvi39OacXvw59RJUOFUkDib2rHg==} + dependencies: + core-util-is: 1.0.3 + inherits: 2.0.4 + isarray: 0.0.1 + string_decoder: 0.10.31 + dev: false + + /readable-stream/3.6.0: + resolution: {integrity: sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==} + engines: {node: '>= 6'} + dependencies: + inherits: 2.0.4 + string_decoder: 1.3.0 + util-deprecate: 1.0.2 + dev: false + + /require-directory/2.1.1: + resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} + engines: {node: '>=0.10.0'} + dev: true + + /resolve/1.22.1: + resolution: {integrity: sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==} + hasBin: true + dependencies: + is-core-module: 2.11.0 + path-parse: 1.0.7 + supports-preserve-symlinks-flag: 1.0.0 + dev: true + + /retry/0.12.0: + resolution: {integrity: sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==} + engines: {node: '>= 4'} + dev: false + + /reusify/1.0.4: + resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} + engines: {iojs: '>=1.0.0', node: '>=0.10.0'} + dev: true + + /rimraf/3.0.2: + resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==} + hasBin: true + dependencies: + glob: 7.2.3 + + /rollup/3.12.0: + resolution: {integrity: sha512-4MZ8kA2HNYahIjz63rzrMMRvDqQDeS9LoriJvMuV0V6zIGysP36e9t4yObUfwdT9h/szXoHQideICftcdZklWg==} + engines: {node: '>=14.18.0', npm: '>=8.0.0'} + hasBin: true + optionalDependencies: + fsevents: 2.3.2 + dev: true + + /run-parallel/1.2.0: + resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} + dependencies: + queue-microtask: 1.2.3 + dev: true + + /safe-buffer/5.2.1: + resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} + + /safer-buffer/2.1.2: + resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} + dev: false + optional: true + + /semver/6.3.0: + resolution: {integrity: sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==} + hasBin: true + dev: true + + /semver/7.3.8: + resolution: {integrity: sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==} + engines: {node: '>=10'} + hasBin: true + dependencies: + lru-cache: 6.0.0 + dev: false + + /serialize-javascript/6.0.1: + resolution: {integrity: sha512-owoXEFjWRllis8/M1Q+Cw5k8ZH40e3zhp/ovX+Xr/vi1qj6QesbyXXViFbpNvWvPNAD62SutwEXavefrLJWj7w==} + dependencies: + randombytes: 2.1.0 + dev: true + + /set-blocking/2.0.0: + resolution: {integrity: sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==} + dev: false + + /shebang-command/2.0.0: + resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} + engines: {node: '>=8'} + dependencies: + shebang-regex: 3.0.0 + dev: true + + /shebang-regex/3.0.0: + resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} + engines: {node: '>=8'} + dev: true + + /signal-exit/3.0.7: + resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==} + + /simple-concat/1.0.1: + resolution: {integrity: sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==} + dev: false + + /simple-get/4.0.1: + resolution: {integrity: sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA==} + dependencies: + decompress-response: 6.0.0 + once: 1.4.0 + simple-concat: 1.0.1 + dev: false + + /sinon/7.5.0: + resolution: {integrity: sha512-AoD0oJWerp0/rY9czP/D6hDTTUYGpObhZjMpd7Cl/A6+j0xBE+ayL/ldfggkBXUs0IkvIiM1ljM8+WkOc5k78Q==} + dependencies: + '@sinonjs/commons': 1.8.6 + '@sinonjs/formatio': 3.2.2 + '@sinonjs/samsam': 3.3.3 + diff: 3.5.0 + lolex: 4.2.0 + nise: 1.5.3 + supports-color: 5.5.0 + dev: true + + /slash/3.0.0: + resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} + engines: {node: '>=8'} + dev: true + + /smart-buffer/4.2.0: + resolution: {integrity: sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==} + engines: {node: '>= 6.0.0', npm: '>= 3.0.0'} + dev: false + + /smob/0.0.6: + resolution: {integrity: sha512-V21+XeNni+tTyiST1MHsa84AQhT1aFZipzPpOFAVB8DkHzwJyjjAmt9bgwnuZiZWnIbMo2duE29wybxv/7HWUw==} + dev: true + + /socks-proxy-agent/7.0.0: + resolution: {integrity: sha512-Fgl0YPZ902wEsAyiQ+idGd1A7rSFx/ayC1CQVMw5P+EQx2V0SgpGtf6OKFhVjPflPUl9YMmEOnmfjCdMUsygww==} + engines: {node: '>= 10'} + dependencies: + agent-base: 6.0.2 + debug: 4.3.4 + socks: 2.7.1 + transitivePeerDependencies: + - supports-color + dev: false + + /socks/2.7.1: + resolution: {integrity: sha512-7maUZy1N7uo6+WVEX6psASxtNlKaNVMlGQKkG/63nEDdLOWNbiUMoLK7X4uYoLhQstau72mLgfEWcXcwsaHbYQ==} + engines: {node: '>= 10.13.0', npm: '>= 3.0.0'} + dependencies: + ip: 2.0.0 + smart-buffer: 4.2.0 + dev: false + + /source-map-support/0.5.21: + resolution: {integrity: sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==} + dependencies: + buffer-from: 1.1.2 + source-map: 0.6.1 + dev: true + + /source-map/0.6.1: + resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} + engines: {node: '>=0.10.0'} + dev: true + + /ssri/9.0.1: + resolution: {integrity: sha512-o57Wcn66jMQvfHG1FlYbWeZWW/dHZhJXjpIcTfXldXEk5nz5lStPo3mK0OJQfGR3RbZUlbISexbljkJzuEj/8Q==} + engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} + dependencies: + minipass: 3.3.6 + dev: false + + /string-width/4.2.3: + resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} + engines: {node: '>=8'} + dependencies: + emoji-regex: 8.0.0 + is-fullwidth-code-point: 3.0.0 + strip-ansi: 6.0.1 + + /string_decoder/0.10.31: + resolution: {integrity: sha512-ev2QzSzWPYmy9GuqfIVildA4OdcGLeFZQrq5ys6RtiuF+RQQiZWr8TZNyAcuVXyQRYfEO+MsoB/1BuQVhOJuoQ==} + dev: false + + /string_decoder/1.3.0: + resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==} + dependencies: + safe-buffer: 5.2.1 + dev: false + + /strip-ansi/6.0.1: + resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} + engines: {node: '>=8'} + dependencies: + ansi-regex: 5.0.1 + + /strip-json-comments/2.0.1: + resolution: {integrity: sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==} + engines: {node: '>=0.10.0'} + dev: false + + /supports-color/5.5.0: + resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==} + engines: {node: '>=4'} + dependencies: + has-flag: 3.0.0 + dev: true + + /supports-color/7.2.0: + resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} + engines: {node: '>=8'} + dependencies: + has-flag: 4.0.0 + dev: true + + /supports-preserve-symlinks-flag/1.0.0: + resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} + engines: {node: '>= 0.4'} + dev: true + + /tar-fs/2.1.1: + resolution: {integrity: sha512-V0r2Y9scmbDRLCNex/+hYzvp/zyYjvFbHPNgVTKfQvVrb6guiE/fxP+XblDNR011utopbkex2nM4dHNV6GDsng==} + dependencies: + chownr: 1.1.4 + mkdirp-classic: 0.5.3 + pump: 3.0.0 + tar-stream: 2.2.0 + dev: false + + /tar-stream/2.2.0: + resolution: {integrity: sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==} + engines: {node: '>=6'} + dependencies: + bl: 4.1.0 + end-of-stream: 1.4.4 + fs-constants: 1.0.0 + inherits: 2.0.4 + readable-stream: 3.6.0 + dev: false + + /tar/6.1.13: + resolution: {integrity: sha512-jdIBIN6LTIe2jqzay/2vtYLlBHa3JF42ot3h1dW8Q0PaAG4v8rm0cvpVePtau5C6OKXGGcgO9q2AMNSWxiLqKw==} + engines: {node: '>=10'} + dependencies: + chownr: 2.0.0 + fs-minipass: 2.1.0 + minipass: 4.0.0 + minizlib: 2.1.2 + mkdirp: 1.0.4 + yallist: 4.0.0 + dev: false + + /terser/5.16.1: + resolution: {integrity: sha512-xvQfyfA1ayT0qdK47zskQgRZeWLoOQ8JQ6mIgRGVNwZKdQMU+5FkCBjmv4QjcrTzyZquRw2FVtlJSRUmMKQslw==} + engines: {node: '>=10'} + hasBin: true + dependencies: + '@jridgewell/source-map': 0.3.2 + acorn: 8.8.2 + commander: 2.20.3 + source-map-support: 0.5.21 + dev: true + + /test-exclude/6.0.0: + resolution: {integrity: sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==} + engines: {node: '>=8'} + dependencies: + '@istanbuljs/schema': 0.1.3 + glob: 7.2.3 + minimatch: 3.1.2 + dev: true + + /through2/0.6.5: + resolution: {integrity: sha512-RkK/CCESdTKQZHdmKICijdKKsCRVHs5KsLZ6pACAmF/1GPUQhonHSXWNERctxEp7RmvjdNbZTL5z9V7nSCXKcg==} + dependencies: + readable-stream: 1.0.34 + xtend: 4.0.2 + dev: false + + /tiny-glob/0.2.9: + resolution: {integrity: sha512-g/55ssRPUjShh+xkfx9UPDXqhckHEsHr4Vd9zX55oSdGZc/MD0m3sferOkwWtp98bv+kcVfEHtRJgBVJzelrzg==} + dependencies: + globalyzer: 0.1.0 + globrex: 0.1.2 + dev: true + + /to-regex-range/5.0.1: + resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} + engines: {node: '>=8.0'} + dependencies: + is-number: 7.0.0 + dev: true + + /tsx/3.12.2: + resolution: {integrity: sha512-ykAEkoBg30RXxeOMVeZwar+JH632dZn9EUJVyJwhfag62k6UO/dIyJEV58YuLF6e5BTdV/qmbQrpkWqjq9cUnQ==} + hasBin: true + dependencies: + '@esbuild-kit/cjs-loader': 2.4.1 + '@esbuild-kit/core-utils': 3.0.0 + '@esbuild-kit/esm-loader': 2.5.4 + optionalDependencies: + fsevents: 2.3.2 + dev: true + + /tunnel-agent/0.6.0: + resolution: {integrity: sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==} + dependencies: + safe-buffer: 5.2.1 + dev: false + + /type-detect/4.0.8: + resolution: {integrity: sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==} + engines: {node: '>=4'} + dev: true + + /unique-filename/2.0.1: + resolution: {integrity: sha512-ODWHtkkdx3IAR+veKxFV+VBkUMcN+FaqzUUd7IZzt+0zhDZFPFxhlqwPF3YQvMHx1TD0tdgYl+kuPnJ8E6ql7A==} + engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} + dependencies: + unique-slug: 3.0.0 + dev: false + + /unique-slug/3.0.0: + resolution: {integrity: sha512-8EyMynh679x/0gqE9fT9oilG+qEt+ibFyqjuVTsZn1+CMxH+XLlpvr2UZx4nVcCwTpx81nICr2JQFkM+HPLq4w==} + engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} + dependencies: + imurmurhash: 0.1.4 + dev: false + + /util-deprecate/1.0.2: + resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} + dev: false + + /v8-to-istanbul/9.0.1: + resolution: {integrity: sha512-74Y4LqY74kLE6IFyIjPtkSTWzUZmj8tdHT9Ii/26dvQ6K9Dl2NbEfj0XgU2sHCtKgt5VupqhlO/5aWuqS+IY1w==} + engines: {node: '>=10.12.0'} + dependencies: + '@jridgewell/trace-mapping': 0.3.17 + '@types/istanbul-lib-coverage': 2.0.4 + convert-source-map: 1.9.0 + dev: true + + /which/2.0.2: + resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} + engines: {node: '>= 8'} + hasBin: true + dependencies: + isexe: 2.0.0 + + /wide-align/1.1.5: + resolution: {integrity: sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==} + dependencies: + string-width: 4.2.3 + dev: false + + /wrap-ansi/7.0.0: + resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} + engines: {node: '>=10'} + dependencies: + ansi-styles: 4.3.0 + string-width: 4.2.3 + strip-ansi: 6.0.1 + dev: true + + /wrappy/1.0.2: + resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} + + /xtend/4.0.2: + resolution: {integrity: sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==} + engines: {node: '>=0.4'} + dev: false + + /y18n/5.0.8: + resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} + engines: {node: '>=10'} + dev: true + + /yallist/4.0.0: + resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} + dev: false + + /yargs-parser/20.2.9: + resolution: {integrity: sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==} + engines: {node: '>=10'} + dev: true + + /yargs/16.2.0: + resolution: {integrity: sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==} + engines: {node: '>=10'} + dependencies: + cliui: 7.0.4 + escalade: 3.1.1 + get-caller-file: 2.0.5 + require-directory: 2.1.1 + string-width: 4.2.3 + y18n: 5.0.8 + yargs-parser: 20.2.9 + dev: true + + /yocto-queue/0.1.0: + resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} + engines: {node: '>=10'} + dev: true diff --git a/rollup.config.js b/rollup.config.js new file mode 100644 index 00000000..675cccfe --- /dev/null +++ b/rollup.config.js @@ -0,0 +1,103 @@ +import { defineConfig } from 'rollup'; +import resolve from '@rollup/plugin-node-resolve'; +import commonjs from '@rollup/plugin-commonjs'; +import terser from '@rollup/plugin-terser'; +import json from '@rollup/plugin-json'; + +import fs from 'fs'; + +const pkg = JSON.parse(fs.readFileSync('./package.json', 'utf-8')); +const banner = `/** +* ${pkg.name} +* ${pkg.homepage} +* +* ${pkg.description} +* +* @version ${pkg.version} +* @date ${new Date().toUTCString()} +* +* @license ${pkg.license} +* The MIT License +* +* Copyright (c) ${new Date().getFullYear()} gpu.js Team +*/`; + +/** + * + * @returns {import('rollup').Plugin} + */ +function pluginReplaceGL() { + const glID = 'gl?replaceEntry'; + const content = `export { default } from 'gl/src/javascript/browser-index';`; + + return { + resolveId(id) { + if (id === 'gl') { + return glID; + } + }, + load(id) { + if (id === glID) { + return content; + } + }, + }; +} + +function commonConfig(plugins = []) { + return defineConfig({ + plugins: [resolve(), commonjs(), json(), ...plugins], + onwarn(msg, warn) { + if (!/Circular/.test(msg)) { + warn(msg); + } + }, + }); +} + +function createOutput(name, format, opts, minify = false) { + return { + banner, + file: `dist/${name}${minify ? '.min' : ''}.js`, + format, + plugins: minify ? [terser()] : [], + sourcemap: true, + ...opts, + }; +} + +function buildBrowser(isCore) { + const id = isCore ? 'gpu-browser-core' : 'gpu-browser'; + const options = isCore + ? { name: 'GPU', globals: { acorn: 'acorn' } } + : { name: 'GPU' }; + + return defineConfig({ + input: './src/browser.js', + output: [ + createOutput(id, 'umd', options), + createOutput(id, 'umd', options, true), + createOutput(id + '.esm', 'esm'), + ], + + external: isCore ? ['acorn'] : [], + + ...commonConfig([pluginReplaceGL()]), + }); +} + +function buildNode() { + return defineConfig({ + input: './src/index.js', + output: [ + createOutput('gpu-node', 'cjs'), + createOutput('gpu-node.esm', 'esm'), + ], + + external: Object.keys(pkg.dependencies).filter(v => v !== 'gpu-mock.js'), + + ...commonConfig(), + }); +} + +export default [buildBrowser(true), buildBrowser(false), buildNode()]; diff --git a/scripts/build-tests.js b/scripts/build-tests.js new file mode 100644 index 00000000..9e86d1e8 --- /dev/null +++ b/scripts/build-tests.js @@ -0,0 +1,26 @@ +const fs = require('fs'); +const path = require('path'); +const { readDirDeepSync } = require('read-dir-deep'); + +const folder = 'test'; +const testFile = 'all.html'; + +try { + fs.unlinkSync(`${folder}/${testFile}`); +} catch (e) {} + +const rootPath = path.resolve(process.cwd(), folder); +const warning = + '\n '; +const tags = readDirDeepSync(rootPath, { + patterns: ['**/*.js'], + ignore: ['*.js'], +}) + .map(file => './' + file.replace(/^test\//, '')) + .map(file => ``) + .join('\n '); + +const template = fs.readFileSync(`${folder}/all-template.html`, 'utf-8'); +const text = template.replace('{{test-files}}', warning + tags); + +fs.writeFileSync(`${folder}/${testFile}`, text, 'utf-8'); diff --git a/src/alias.js b/src/alias.js index 4a279099..6cf284e3 100644 --- a/src/alias.js +++ b/src/alias.js @@ -1,4 +1,4 @@ -const { utils } = require('./utils'); +import { utils } from './utils'; /** * @@ -6,13 +6,11 @@ const { utils } = require('./utils'); * @param source * @returns {Function} */ -function alias(name, source) { +export function alias(name, source) { const fnString = source.toString(); - return new Function(`return function ${ name } (${ utils.getArgumentNamesFromString(fnString).join(', ') }) { - ${ utils.getFunctionBodyFromString(fnString) } + return new Function(`return function ${name} (${utils + .getArgumentNamesFromString(fnString) + .join(', ')}) { + ${utils.getFunctionBodyFromString(fnString)} }`)(); } - -module.exports = { - alias -}; \ No newline at end of file diff --git a/src/backend/cpu/function-node.js b/src/backend/cpu/function-node.js index aa037507..d1f94c55 100644 --- a/src/backend/cpu/function-node.js +++ b/src/backend/cpu/function-node.js @@ -1,11 +1,11 @@ -const { FunctionNode } = require('../function-node'); +import { FunctionNode } from '../function-node'; /** * @desc [INTERNAL] Represents a single function, inside JS * *

This handles all the raw state, converted state, etc. Of a single function.

*/ -class CPUFunctionNode extends FunctionNode { +export class CPUFunctionNode extends FunctionNode { /** * @desc Parses the abstract syntax tree for to its *named function* * @param {Object} ast - the AST object to parse @@ -13,7 +13,6 @@ class CPUFunctionNode extends FunctionNode { * @returns {Array} the append retArr */ astFunction(ast, retArr) { - // Setup function return type and name if (!this.isRootKernel) { retArr.push('function'); @@ -69,10 +68,10 @@ class CPUFunctionNode extends FunctionNode { retArr.push(this.followingReturnStatement); retArr.push('continue;\n'); } else if (this.isSubKernel) { - retArr.push(`subKernelResult_${ this.name } = `); + retArr.push(`subKernelResult_${this.name} = `); this.astGeneric(ast.argument, retArr); retArr.push(';'); - retArr.push(`return subKernelResult_${ this.name };`); + retArr.push(`return subKernelResult_${this.name};`); } else { retArr.push('return '); this.astGeneric(ast.argument, retArr); @@ -88,7 +87,6 @@ class CPUFunctionNode extends FunctionNode { * @returns {Array} the append retArr */ astLiteral(ast, retArr) { - // Reject non numeric literals if (isNaN(ast.value)) { throw this.astErrorOutput( @@ -200,7 +198,11 @@ class CPUFunctionNode extends FunctionNode { } if (isSafe) { - retArr.push(`for (${initArr.join('')};${testArr.join('')};${updateArr.join('')}){\n`); + retArr.push( + `for (${initArr.join('')};${testArr.join('')};${updateArr.join( + '' + )}){\n` + ); retArr.push(bodyArr.join('')); retArr.push('}\n'); } else { @@ -208,7 +210,9 @@ class CPUFunctionNode extends FunctionNode { if (initArr.length > 0) { retArr.push(initArr.join(''), ';\n'); } - retArr.push(`for (let ${iVariableName}=0;${iVariableName} 0) { retArr.push(`if (!${testArr.join('')}) break;\n`); } @@ -227,10 +231,7 @@ class CPUFunctionNode extends FunctionNode { */ astWhileStatement(whileNode, retArr) { if (whileNode.type !== 'WhileStatement') { - throw this.astErrorOutput( - 'Invalid while statement', - whileNode - ); + throw this.astErrorOutput('Invalid while statement', whileNode); } retArr.push('for (let i = 0; i < LOOP_MAX; i++) {'); @@ -254,10 +255,7 @@ class CPUFunctionNode extends FunctionNode { */ astDoWhileStatement(doWhileNode, retArr) { if (doWhileNode.type !== 'DoWhileStatement') { - throw this.astErrorOutput( - 'Invalid while statement', - doWhileNode - ); + throw this.astErrorOutput('Invalid while statement', doWhileNode); } retArr.push('for (let i = 0; i < LOOP_MAX; i++) {'); @@ -270,7 +268,6 @@ class CPUFunctionNode extends FunctionNode { retArr.push('}\n'); return retArr; - } /** @@ -282,7 +279,10 @@ class CPUFunctionNode extends FunctionNode { astAssignmentExpression(assNode, retArr) { const declaration = this.getDeclaration(assNode.left); if (declaration && !declaration.assignable) { - throw this.astErrorOutput(`Variable ${assNode.left.name} is not assignable here`, assNode); + throw this.astErrorOutput( + `Variable ${assNode.left.name} is not assignable here`, + assNode + ); } this.astGeneric(assNode.left, retArr); retArr.push(assNode.operator); @@ -359,7 +359,10 @@ class CPUFunctionNode extends FunctionNode { if (ifNode.alternate) { retArr.push('else '); - if (ifNode.alternate.type === 'BlockStatement' || ifNode.alternate.type === 'IfStatement') { + if ( + ifNode.alternate.type === 'BlockStatement' || + ifNode.alternate.type === 'IfStatement' + ) { this.astGeneric(ifNode.alternate, retArr); } else { retArr.push(' {\n'); @@ -368,7 +371,6 @@ class CPUFunctionNode extends FunctionNode { } } return retArr; - } astSwitchStatement(ast, retArr) { @@ -422,11 +424,11 @@ class CPUFunctionNode extends FunctionNode { yProperty, zProperty, name, - origin + origin, } = this.getMemberExpressionDetails(mNode); switch (signature) { case 'this.thread.value': - retArr.push(`_this.thread.${ name }`); + retArr.push(`_this.thread.${name}`); return retArr; case 'this.output.value': switch (name) { @@ -455,16 +457,16 @@ class CPUFunctionNode extends FunctionNode { } switch (property) { case 'r': - retArr.push(`user_${ name }[0]`); + retArr.push(`user_${name}[0]`); return retArr; case 'g': - retArr.push(`user_${ name }[1]`); + retArr.push(`user_${name}[1]`); return retArr; case 'b': - retArr.push(`user_${ name }[2]`); + retArr.push(`user_${name}[2]`); return retArr; case 'a': - retArr.push(`user_${ name }[3]`); + retArr.push(`user_${name}[3]`); return retArr; } break; @@ -530,16 +532,24 @@ class CPUFunctionNode extends FunctionNode { size = isInput ? constant.size : null; } else { isInput = this.isInput(name); - size = isInput ? this.argumentSizes[this.argumentNames.indexOf(name)] : null; + size = isInput + ? this.argumentSizes[this.argumentNames.indexOf(name)] + : null; } - retArr.push(`${ markupName }`); + retArr.push(`${markupName}`); if (zProperty && yProperty) { if (isInput) { retArr.push('[('); this.astGeneric(zProperty, retArr); - retArr.push(`*${ this.dynamicArguments ? '(outputY * outputX)' : size[1] * size[0] })+(`); + retArr.push( + `*${ + this.dynamicArguments + ? '(outputY * outputX)' + : size[1] * size[0] + })+(` + ); this.astGeneric(yProperty, retArr); - retArr.push(`*${ this.dynamicArguments ? 'outputX' : size[0] })+`); + retArr.push(`*${this.dynamicArguments ? 'outputX' : size[0]})+`); this.astGeneric(xProperty, retArr); retArr.push(']'); } else { @@ -557,7 +567,7 @@ class CPUFunctionNode extends FunctionNode { if (isInput) { retArr.push('[('); this.astGeneric(yProperty, retArr); - retArr.push(`*${ this.dynamicArguments ? 'outputX' : size[0] })+`); + retArr.push(`*${this.dynamicArguments ? 'outputX' : size[0]})+`); this.astGeneric(xProperty, retArr); retArr.push(']'); } else { @@ -662,7 +672,3 @@ class CPUFunctionNode extends FunctionNode { return retArr; } } - -module.exports = { - CPUFunctionNode -}; \ No newline at end of file diff --git a/src/backend/cpu/kernel-string.js b/src/backend/cpu/kernel-string.js index d619b477..05fb31ed 100644 --- a/src/backend/cpu/kernel-string.js +++ b/src/backend/cpu/kernel-string.js @@ -1,4 +1,4 @@ -const { utils } = require('../../utils'); +import { utils } from '../../utils'; function constantsToString(constants, types) { const results = []; @@ -19,14 +19,18 @@ function constantsToString(constants, types) { case 'Matrix(2)': case 'Matrix(3)': case 'Matrix(4)': - results.push(`${name}:new ${constant.constructor.name}(${JSON.stringify(Array.from(constant))})`); + results.push( + `${name}:new ${constant.constructor.name}(${JSON.stringify( + Array.from(constant) + )})` + ); break; } } - return `{ ${ results.join() } }`; + return `{ ${results.join()} }`; } -function cpuKernelString(cpuKernel, name) { +export function cpuKernelString(cpuKernel, name) { const header = []; const thisProperties = []; const beforeReturn = []; @@ -35,9 +39,14 @@ function cpuKernelString(cpuKernel, name) { header.push( ' const { context, canvas, constants: incomingConstants } = settings;', - ` const output = new Int32Array(${JSON.stringify(Array.from(cpuKernel.output))});`, + ` const output = new Int32Array(${JSON.stringify( + Array.from(cpuKernel.output) + )});`, ` const _constantTypes = ${JSON.stringify(cpuKernel.constantTypes)};`, - ` const _constants = ${constantsToString(cpuKernel.constants, cpuKernel.constantTypes)};` + ` const _constants = ${constantsToString( + cpuKernel.constants, + cpuKernel.constantTypes + )};` ); thisProperties.push( @@ -48,46 +57,56 @@ function cpuKernelString(cpuKernel, name) { ); if (cpuKernel.graphical) { - header.push(` const _imageData = context.createImageData(${cpuKernel.output[0]}, ${cpuKernel.output[1]});`); - header.push(` const _colorData = new Uint8ClampedArray(${cpuKernel.output[0]} * ${cpuKernel.output[1]} * 4);`); + header.push( + ` const _imageData = context.createImageData(${cpuKernel.output[0]}, ${cpuKernel.output[1]});` + ); + header.push( + ` const _colorData = new Uint8ClampedArray(${cpuKernel.output[0]} * ${cpuKernel.output[1]} * 4);` + ); - const colorFn = utils.flattenFunctionToString((useFunctionKeyword ? 'function ' : '') + cpuKernel.color.toString(), { - thisLookup: (propertyName) => { - switch (propertyName) { - case '_colorData': - return '_colorData'; - case '_imageData': - return '_imageData'; - case 'output': - return 'output'; - case 'thread': - return 'this.thread'; - } - return JSON.stringify(cpuKernel[propertyName]); - }, - findDependency: (object, name) => { - return null; + const colorFn = utils.flattenFunctionToString( + (useFunctionKeyword ? 'function ' : '') + cpuKernel.color.toString(), + { + thisLookup: propertyName => { + switch (propertyName) { + case '_colorData': + return '_colorData'; + case '_imageData': + return '_imageData'; + case 'output': + return 'output'; + case 'thread': + return 'this.thread'; + } + return JSON.stringify(cpuKernel[propertyName]); + }, + findDependency: (object, name) => { + return null; + }, } - }); + ); - const getPixelsFn = utils.flattenFunctionToString((useFunctionKeyword ? 'function ' : '') + cpuKernel.getPixels.toString(), { - thisLookup: (propertyName) => { - switch (propertyName) { - case '_colorData': - return '_colorData'; - case '_imageData': - return '_imageData'; - case 'output': - return 'output'; - case 'thread': - return 'this.thread'; - } - return JSON.stringify(cpuKernel[propertyName]); - }, - findDependency: () => { - return null; + const getPixelsFn = utils.flattenFunctionToString( + (useFunctionKeyword ? 'function ' : '') + cpuKernel.getPixels.toString(), + { + thisLookup: propertyName => { + switch (propertyName) { + case '_colorData': + return '_colorData'; + case '_imageData': + return '_imageData'; + case 'output': + return 'output'; + case 'thread': + return 'this.thread'; + } + return JSON.stringify(cpuKernel[propertyName]); + }, + findDependency: () => { + return null; + }, } - }); + ); thisProperties.push( ' _imageData,', @@ -95,9 +114,7 @@ function cpuKernelString(cpuKernel, name) { ` color: ${colorFn},` ); - beforeReturn.push( - ` kernel.getPixels = ${getPixelsFn};` - ); + beforeReturn.push(` kernel.getPixels = ${getPixelsFn};`); } const constantTypes = []; @@ -105,48 +122,65 @@ function cpuKernelString(cpuKernel, name) { for (let i = 0; i < constantKeys.length; i++) { constantTypes.push(cpuKernel.constantTypes[constantKeys]); } - if (cpuKernel.argumentTypes.indexOf('HTMLImageArray') !== -1 || constantTypes.indexOf('HTMLImageArray') !== -1) { - const flattenedImageTo3DArray = utils.flattenFunctionToString((useFunctionKeyword ? 'function ' : '') + cpuKernel._imageTo3DArray.toString(), { - doNotDefine: ['canvas'], - findDependency: (object, name) => { - if (object === 'this') { - return (useFunctionKeyword ? 'function ' : '') + cpuKernel[name].toString(); - } - return null; - }, - thisLookup: (propertyName) => { - switch (propertyName) { - case 'canvas': - return; - case 'context': - return 'context'; - } + if ( + cpuKernel.argumentTypes.indexOf('HTMLImageArray') !== -1 || + constantTypes.indexOf('HTMLImageArray') !== -1 + ) { + const flattenedImageTo3DArray = utils.flattenFunctionToString( + (useFunctionKeyword ? 'function ' : '') + + cpuKernel._imageTo3DArray.toString(), + { + doNotDefine: ['canvas'], + findDependency: (object, name) => { + if (object === 'this') { + return ( + (useFunctionKeyword ? 'function ' : '') + + cpuKernel[name].toString() + ); + } + return null; + }, + thisLookup: propertyName => { + switch (propertyName) { + case 'canvas': + return; + case 'context': + return 'context'; + } + }, } - }); + ); beforeReturn.push(flattenedImageTo3DArray); thisProperties.push(` _mediaTo2DArray,`); thisProperties.push(` _imageTo3DArray,`); - } else if (cpuKernel.argumentTypes.indexOf('HTMLImage') !== -1 || constantTypes.indexOf('HTMLImage') !== -1) { - const flattenedImageTo2DArray = utils.flattenFunctionToString((useFunctionKeyword ? 'function ' : '') + cpuKernel._mediaTo2DArray.toString(), { - findDependency: (object, name) => { - return null; - }, - thisLookup: (propertyName) => { - switch (propertyName) { - case 'canvas': - return 'settings.canvas'; - case 'context': - return 'settings.context'; - } - throw new Error('unhandled thisLookup'); + } else if ( + cpuKernel.argumentTypes.indexOf('HTMLImage') !== -1 || + constantTypes.indexOf('HTMLImage') !== -1 + ) { + const flattenedImageTo2DArray = utils.flattenFunctionToString( + (useFunctionKeyword ? 'function ' : '') + + cpuKernel._mediaTo2DArray.toString(), + { + findDependency: (object, name) => { + return null; + }, + thisLookup: propertyName => { + switch (propertyName) { + case 'canvas': + return 'settings.canvas'; + case 'context': + return 'settings.context'; + } + throw new Error('unhandled thisLookup'); + }, } - }); + ); beforeReturn.push(flattenedImageTo2DArray); thisProperties.push(` _mediaTo2DArray,`); } return `function(settings) { -${ header.join('\n') } +${header.join('\n')} for (const p in _constantTypes) { if (!_constantTypes.hasOwnProperty(p)) continue; const type = _constantTypes[p]; @@ -175,11 +209,7 @@ ${ header.join('\n') } ${cpuKernel._kernelString} }) .apply({ ${thisProperties.join('\n')} }); - ${ beforeReturn.join('\n') } + ${beforeReturn.join('\n')} return kernel; }`; } - -module.exports = { - cpuKernelString -}; \ No newline at end of file diff --git a/src/backend/cpu/kernel.js b/src/backend/cpu/kernel.js index 13279e5c..fc0afc95 100644 --- a/src/backend/cpu/kernel.js +++ b/src/backend/cpu/kernel.js @@ -1,21 +1,21 @@ -const { Kernel } = require('../kernel'); -const { FunctionBuilder } = require('../function-builder'); -const { CPUFunctionNode } = require('./function-node'); -const { utils } = require('../../utils'); -const { cpuKernelString } = require('./kernel-string'); +import { Kernel } from '../kernel'; +import { FunctionBuilder } from '../function-builder'; +import { CPUFunctionNode } from './function-node'; +import { utils } from '../../utils'; +import { cpuKernelString } from './kernel-string'; /** * @desc Kernel Implementation for CPU. *

Instantiates properties to the CPU Kernel.

*/ -class CPUKernel extends Kernel { +export class CPUKernel extends Kernel { static getFeatures() { return this.features; } static get features() { return Object.freeze({ kernelMap: true, - isIntegerDivisionAccurate: true + isIntegerDivisionAccurate: true, }); } static get isSupported() { @@ -36,7 +36,9 @@ class CPUKernel extends Kernel { } static nativeFunctionReturnType() { - throw new Error(`Looking up native function return type not supported on ${this.name}`); + throw new Error( + `Looking up native function return type not supported on ${this.name}` + ); } static combineKernels(combinedKernel) { @@ -44,7 +46,9 @@ class CPUKernel extends Kernel { } static getSignature(kernel, argumentTypes) { - return 'cpu' + (argumentTypes.length > 0 ? ':' + argumentTypes.join(',') : ''); + return ( + 'cpu' + (argumentTypes.length > 0 ? ':' + argumentTypes.join(',') : '') + ); } constructor(source, settings) { @@ -58,7 +62,7 @@ class CPUKernel extends Kernel { this.thread = { x: 0, y: 0, - z: 0 + z: 0, }; this.translatedSources = null; } @@ -87,16 +91,23 @@ class CPUKernel extends Kernel { validateSettings(args) { if (!this.output || this.output.length === 0) { if (args.length !== 1) { - throw new Error('Auto output only supported for kernels with only one input'); + throw new Error( + 'Auto output only supported for kernels with only one input' + ); } const argType = utils.getVariableType(args[0], this.strictIntegers); if (argType === 'Array') { this.output = utils.getDimensions(argType); - } else if (argType === 'NumberTexture' || argType === 'ArrayTexture(4)') { + } else if ( + argType === 'NumberTexture' || + argType === 'ArrayTexture(4)' + ) { this.output = args[0].output; } else { - throw new Error('Auto output not supported for input type: ' + argType); + throw new Error( + 'Auto output not supported for input type: ' + argType + ); } } @@ -110,14 +121,17 @@ class CPUKernel extends Kernel { } translateSource() { - this.leadingReturnStatement = this.output.length > 1 ? 'resultX[x] = ' : 'result[x] = '; + this.leadingReturnStatement = + this.output.length > 1 ? 'resultX[x] = ' : 'result[x] = '; if (this.subKernels) { const followingReturnStatement = []; for (let i = 0; i < this.subKernels.length; i++) { - const { - name - } = this.subKernels[i]; - followingReturnStatement.push(this.output.length > 1 ? `resultX_${ name }[x] = subKernelResult_${ name };\n` : `result_${ name }[x] = subKernelResult_${ name };\n`); + const { name } = this.subKernels[i]; + followingReturnStatement.push( + this.output.length > 1 + ? `resultX_${name}[x] = subKernelResult_${name};\n` + : `result_${name}[x] = subKernelResult_${name};\n` + ); } this.followingReturnStatement = followingReturnStatement.join(''); } @@ -143,10 +157,7 @@ class CPUKernel extends Kernel { this.translateSource(); if (this.graphical) { - const { - canvas, - output - } = this; + const { canvas, output } = this; if (!canvas) { throw new Error('no canvas available for using graphical output'); } @@ -213,9 +224,7 @@ class CPUKernel extends Kernel { if (this._kernelString !== null) return this._kernelString; let kernelThreadString = null; - let { - translatedSources - } = this; + let { translatedSources } = this; if (translatedSources.length > 1) { translatedSources = translatedSources.filter(fn => { if (/^function/.test(fn)) return fn; @@ -225,18 +234,24 @@ class CPUKernel extends Kernel { } else { kernelThreadString = translatedSources.shift(); } - return this._kernelString = ` const LOOP_MAX = ${ this._getLoopMaxString() }; - ${ this.injectedNative || '' } + return (this._kernelString = ` const LOOP_MAX = ${this._getLoopMaxString()}; + ${this.injectedNative || ''} const _this = this; - ${ this._resultKernelHeader() } - ${ this._processConstants() } - return (${ this.argumentNames.map(argumentName => 'user_' + argumentName).join(', ') }) => { - ${ this._prependedString.join('') } - ${ this._earlyThrows() } - ${ this._processArguments() } - ${ this.graphical ? this._graphicalKernelBody(kernelThreadString) : this._resultKernelBody(kernelThreadString) } - ${ translatedSources.length > 0 ? translatedSources.join('\n') : '' } - };`; + ${this._resultKernelHeader()} + ${this._processConstants()} + return (${this.argumentNames + .map(argumentName => 'user_' + argumentName) + .join(', ')}) => { + ${this._prependedString.join('')} + ${this._earlyThrows()} + ${this._processArguments()} + ${ + this.graphical + ? this._graphicalKernelBody(kernelThreadString) + : this._resultKernelBody(kernelThreadString) + } + ${translatedSources.length > 0 ? translatedSources.join('\n') : ''} + };`); } /** @@ -251,11 +266,9 @@ class CPUKernel extends Kernel { * @returns {String} result */ _getLoopMaxString() { - return ( - this.loopMaxIterations ? - ` ${ parseInt(this.loopMaxIterations) };` : - ' 1000;' - ); + return this.loopMaxIterations + ? ` ${parseInt(this.loopMaxIterations)};` + : ' 1000;'; } _processConstants() { @@ -271,13 +284,19 @@ class CPUKernel extends Kernel { case 'ImageBitmap': case 'ImageData': case 'HTMLVideo': - result.push(` const constants_${p} = this._mediaTo2DArray(this.constants.${p});\n`); + result.push( + ` const constants_${p} = this._mediaTo2DArray(this.constants.${p});\n` + ); break; case 'HTMLImageArray': - result.push(` const constants_${p} = this._imageTo3DArray(this.constants.${p});\n`); + result.push( + ` const constants_${p} = this._imageTo3DArray(this.constants.${p});\n` + ); break; case 'Input': - result.push(` const constants_${p} = this.constants.${p}.value;\n`); + result.push( + ` const constants_${p} = this.constants.${p}.value;\n` + ); break; default: result.push(` const constants_${p} = this.constants.${p};\n`); @@ -300,10 +319,18 @@ class CPUKernel extends Kernel { const checks = []; for (let i = 0; i < arrayArguments.length; i++) { const argumentName = arrayArguments[i]; - const checkSubKernels = this._mapSubKernels(subKernel => `user_${argumentName} === result_${subKernel.name}`).join(' || '); - checks.push(`user_${argumentName} === result${checkSubKernels ? ` || ${checkSubKernels}` : ''}`); + const checkSubKernels = this._mapSubKernels( + subKernel => `user_${argumentName} === result_${subKernel.name}` + ).join(' || '); + checks.push( + `user_${argumentName} === result${ + checkSubKernels ? ` || ${checkSubKernels}` : '' + }` + ); } - return `if (${checks.join(' || ')}) throw new Error('Source and destination arrays are the same. Use immutable = true');`; + return `if (${checks.join( + ' || ' + )}) throw new Error('Source and destination arrays are the same. Use immutable = true');`; } _processArguments() { @@ -317,10 +344,14 @@ class CPUKernel extends Kernel { case 'ImageBitmap': case 'ImageData': case 'HTMLVideo': - result.push(` ${variableName} = this._mediaTo2DArray(${variableName});\n`); + result.push( + ` ${variableName} = this._mediaTo2DArray(${variableName});\n` + ); break; case 'HTMLImageArray': - result.push(` ${variableName} = this._imageTo3DArray(${variableName});\n`); + result.push( + ` ${variableName} = this._imageTo3DArray(${variableName});\n` + ); break; case 'Input': result.push(` ${variableName} = ${variableName}.value;\n`); @@ -373,7 +404,7 @@ class CPUKernel extends Kernel { const imageArray = new Array(height); let index = 0; for (let y = height - 1; y >= 0; y--) { - const row = imageArray[y] = new Array(width); + const row = (imageArray[y] = new Array(width)); for (let x = 0; x < width; x++) { const pixel = new Float32Array(4); pixel[0] = pixelsData[index++] / 255; // r @@ -394,7 +425,9 @@ class CPUKernel extends Kernel { getPixels(flip) { const [width, height] = this.output; // cpu is not flipped by default - return flip ? utils.flipPixels(this._imageData.data, width, height) : this._imageData.data.slice(0); + return flip + ? utils.flipPixels(this._imageData.data, width, height) + : this._imageData.data.slice(0); } _imageTo3DArray(images) { @@ -422,11 +455,26 @@ class CPUKernel extends Kernel { _resultKernelBody(kernelString) { switch (this.output.length) { case 1: - return (!this.immutable && this.pipeline ? this._resultMutableKernel1DLoop(kernelString) : this._resultImmutableKernel1DLoop(kernelString)) + this._kernelOutput(); + return ( + (!this.immutable && this.pipeline + ? this._resultMutableKernel1DLoop(kernelString) + : this._resultImmutableKernel1DLoop(kernelString)) + + this._kernelOutput() + ); case 2: - return (!this.immutable && this.pipeline ? this._resultMutableKernel2DLoop(kernelString) : this._resultImmutableKernel2DLoop(kernelString)) + this._kernelOutput(); + return ( + (!this.immutable && this.pipeline + ? this._resultMutableKernel2DLoop(kernelString) + : this._resultImmutableKernel2DLoop(kernelString)) + + this._kernelOutput() + ); case 3: - return (!this.immutable && this.pipeline ? this._resultMutableKernel3DLoop(kernelString) : this._resultImmutableKernel3DLoop(kernelString)) + this._kernelOutput(); + return ( + (!this.immutable && this.pipeline + ? this._resultMutableKernel3DLoop(kernelString) + : this._resultImmutableKernel3DLoop(kernelString)) + + this._kernelOutput() + ); default: throw new Error('unsupported size kernel'); } @@ -435,7 +483,10 @@ class CPUKernel extends Kernel { _graphicalKernelBody(kernelThreadString) { switch (this.output.length) { case 2: - return this._graphicalKernel2DLoop(kernelThreadString) + this._graphicalOutput(); + return ( + this._graphicalKernel2DLoop(kernelThreadString) + + this._graphicalOutput() + ); default: throw new Error('unsupported size kernel'); } @@ -445,7 +496,7 @@ class CPUKernel extends Kernel { return ` this._imageData.data.set(this._colorData); this.context.putImageData(this._imageData, 0, 0); - return;` + return;`; } _getKernelResultTypeConstructorString() { @@ -463,7 +514,7 @@ class CPUKernel extends Kernel { if (this.graphical) { return 'Float32Array'; } - throw new Error(`unhandled returnType ${ this.returnType }`); + throw new Error(`unhandled returnType ${this.returnType}`); } } @@ -471,13 +522,18 @@ class CPUKernel extends Kernel { const constructorString = this._getKernelResultTypeConstructorString(); return ` const outputX = _this.output[0]; const result = new ${constructorString}(outputX); - ${ this._mapSubKernels(subKernel => `const result_${ subKernel.name } = new ${constructorString}(outputX);\n`).join(' ') } - ${ this._mapSubKernels(subKernel => `let subKernelResult_${ subKernel.name };\n`).join(' ') } + ${this._mapSubKernels( + subKernel => + `const result_${subKernel.name} = new ${constructorString}(outputX);\n` + ).join(' ')} + ${this._mapSubKernels( + subKernel => `let subKernelResult_${subKernel.name};\n` + ).join(' ')} for (let x = 0; x < outputX; x++) { this.thread.x = x; this.thread.y = 0; this.thread.z = 0; - ${ kernelString } + ${kernelString} }`; } @@ -485,8 +541,13 @@ class CPUKernel extends Kernel { const constructorString = this._getKernelResultTypeConstructorString(); return ` const outputX = _this.output[0]; const result = new ${constructorString}(outputX); - ${ this._mapSubKernels(subKernel => `const result_${ subKernel.name } = new ${constructorString}(outputX);\n`).join(' ') } - ${ this._mapSubKernels(subKernel => `let subKernelResult_${ subKernel.name };\n`).join(' ') }`; + ${this._mapSubKernels( + subKernel => + `const result_${subKernel.name} = new ${constructorString}(outputX);\n` + ).join(' ')} + ${this._mapSubKernels( + subKernel => `let subKernelResult_${subKernel.name};\n` + ).join(' ')}`; } _resultMutableKernel1DLoop(kernelString) { @@ -495,7 +556,7 @@ class CPUKernel extends Kernel { this.thread.x = x; this.thread.y = 0; this.thread.z = 0; - ${ kernelString } + ${kernelString} }`; } @@ -504,16 +565,23 @@ class CPUKernel extends Kernel { return ` const outputX = _this.output[0]; const outputY = _this.output[1]; const result = new Array(outputY); - ${ this._mapSubKernels(subKernel => `const result_${ subKernel.name } = new Array(outputY);\n`).join(' ') } - ${ this._mapSubKernels(subKernel => `let subKernelResult_${ subKernel.name };\n`).join(' ') } + ${this._mapSubKernels( + subKernel => `const result_${subKernel.name} = new Array(outputY);\n` + ).join(' ')} + ${this._mapSubKernels( + subKernel => `let subKernelResult_${subKernel.name};\n` + ).join(' ')} for (let y = 0; y < outputY; y++) { this.thread.z = 0; this.thread.y = y; const resultX = result[y] = new ${constructorString}(outputX); - ${ this._mapSubKernels(subKernel => `const resultX_${ subKernel.name } = result_${subKernel.name}[y] = new ${constructorString}(outputX);\n`).join('') } + ${this._mapSubKernels( + subKernel => + `const resultX_${subKernel.name} = result_${subKernel.name}[y] = new ${constructorString}(outputX);\n` + ).join('')} for (let x = 0; x < outputX; x++) { this.thread.x = x; - ${ kernelString } + ${kernelString} } }`; } @@ -523,11 +591,18 @@ class CPUKernel extends Kernel { return ` const outputX = _this.output[0]; const outputY = _this.output[1]; const result = new Array(outputY); - ${ this._mapSubKernels(subKernel => `const result_${ subKernel.name } = new Array(outputY);\n`).join(' ') } - ${ this._mapSubKernels(subKernel => `let subKernelResult_${ subKernel.name };\n`).join(' ') } + ${this._mapSubKernels( + subKernel => `const result_${subKernel.name} = new Array(outputY);\n` + ).join(' ')} + ${this._mapSubKernels( + subKernel => `let subKernelResult_${subKernel.name};\n` + ).join(' ')} for (let y = 0; y < outputY; y++) { const resultX = result[y] = new ${constructorString}(outputX); - ${ this._mapSubKernels(subKernel => `const resultX_${ subKernel.name } = result_${subKernel.name}[y] = new ${constructorString}(outputX);\n`).join('') } + ${this._mapSubKernels( + subKernel => + `const resultX_${subKernel.name} = result_${subKernel.name}[y] = new ${constructorString}(outputX);\n` + ).join('')} }`; } @@ -539,10 +614,13 @@ class CPUKernel extends Kernel { this.thread.z = 0; this.thread.y = y; const resultX = result[y]; - ${ this._mapSubKernels(subKernel => `const resultX_${ subKernel.name } = result_${subKernel.name}[y] = new ${constructorString}(outputX);\n`).join('') } + ${this._mapSubKernels( + subKernel => + `const resultX_${subKernel.name} = result_${subKernel.name}[y] = new ${constructorString}(outputX);\n` + ).join('')} for (let x = 0; x < outputX; x++) { this.thread.x = x; - ${ kernelString } + ${kernelString} } }`; } @@ -555,7 +633,7 @@ class CPUKernel extends Kernel { this.thread.y = y; for (let x = 0; x < outputX; x++) { this.thread.x = x; - ${ kernelString } + ${kernelString} } }`; } @@ -566,19 +644,29 @@ class CPUKernel extends Kernel { const outputY = _this.output[1]; const outputZ = _this.output[2]; const result = new Array(outputZ); - ${ this._mapSubKernels(subKernel => `const result_${ subKernel.name } = new Array(outputZ);\n`).join(' ') } - ${ this._mapSubKernels(subKernel => `let subKernelResult_${ subKernel.name };\n`).join(' ') } + ${this._mapSubKernels( + subKernel => `const result_${subKernel.name} = new Array(outputZ);\n` + ).join(' ')} + ${this._mapSubKernels( + subKernel => `let subKernelResult_${subKernel.name};\n` + ).join(' ')} for (let z = 0; z < outputZ; z++) { this.thread.z = z; const resultY = result[z] = new Array(outputY); - ${ this._mapSubKernels(subKernel => `const resultY_${ subKernel.name } = result_${subKernel.name}[z] = new Array(outputY);\n`).join(' ') } + ${this._mapSubKernels( + subKernel => + `const resultY_${subKernel.name} = result_${subKernel.name}[z] = new Array(outputY);\n` + ).join(' ')} for (let y = 0; y < outputY; y++) { this.thread.y = y; const resultX = resultY[y] = new ${constructorString}(outputX); - ${ this._mapSubKernels(subKernel => `const resultX_${ subKernel.name } = resultY_${subKernel.name}[y] = new ${constructorString}(outputX);\n`).join(' ') } + ${this._mapSubKernels( + subKernel => + `const resultX_${subKernel.name} = resultY_${subKernel.name}[y] = new ${constructorString}(outputX);\n` + ).join(' ')} for (let x = 0; x < outputX; x++) { this.thread.x = x; - ${ kernelString } + ${kernelString} } } }`; @@ -590,14 +678,24 @@ class CPUKernel extends Kernel { const outputY = _this.output[1]; const outputZ = _this.output[2]; const result = new Array(outputZ); - ${ this._mapSubKernels(subKernel => `const result_${ subKernel.name } = new Array(outputZ);\n`).join(' ') } - ${ this._mapSubKernels(subKernel => `let subKernelResult_${ subKernel.name };\n`).join(' ') } + ${this._mapSubKernels( + subKernel => `const result_${subKernel.name} = new Array(outputZ);\n` + ).join(' ')} + ${this._mapSubKernels( + subKernel => `let subKernelResult_${subKernel.name};\n` + ).join(' ')} for (let z = 0; z < outputZ; z++) { const resultY = result[z] = new Array(outputY); - ${ this._mapSubKernels(subKernel => `const resultY_${ subKernel.name } = result_${subKernel.name}[z] = new Array(outputY);\n`).join(' ') } + ${this._mapSubKernels( + subKernel => + `const resultY_${subKernel.name} = result_${subKernel.name}[z] = new Array(outputY);\n` + ).join(' ')} for (let y = 0; y < outputY; y++) { const resultX = resultY[y] = new ${constructorString}(outputX); - ${ this._mapSubKernels(subKernel => `const resultX_${ subKernel.name } = resultY_${subKernel.name}[y] = new ${constructorString}(outputX);\n`).join(' ') } + ${this._mapSubKernels( + subKernel => + `const resultX_${subKernel.name} = resultY_${subKernel.name}[y] = new ${constructorString}(outputX);\n` + ).join(' ')} } }`; } @@ -614,7 +712,7 @@ class CPUKernel extends Kernel { const resultX = resultY[y]; for (let x = 0; x < outputX; x++) { this.thread.x = x; - ${ kernelString } + ${kernelString} } } }`; @@ -626,13 +724,14 @@ class CPUKernel extends Kernel { } return `\n return { result: result, - ${ this.subKernels.map(subKernel => `${ subKernel.property }: result_${ subKernel.name }`).join(',\n ') } + ${this.subKernels + .map(subKernel => `${subKernel.property}: result_${subKernel.name}`) + .join(',\n ')} };`; } _mapSubKernels(fn) { - return this.subKernels === null ? [''] : - this.subKernels.map(fn); + return this.subKernels === null ? [''] : this.subKernels.map(fn); } destroy(removeCanvasReference) { @@ -645,7 +744,10 @@ class CPUKernel extends Kernel { toJSON() { const json = super.toJSON(); - json.functionNodes = FunctionBuilder.fromKernel(this, CPUFunctionNode).toJSON(); + json.functionNodes = FunctionBuilder.fromKernel( + this, + CPUFunctionNode + ).toJSON(); return json; } @@ -667,7 +769,3 @@ class CPUKernel extends Kernel { return this._prependedString.indexOf(value) > -1; } } - -module.exports = { - CPUKernel -}; \ No newline at end of file diff --git a/src/backend/function-builder.js b/src/backend/function-builder.js index 1633f0e8..cdf0d990 100644 --- a/src/backend/function-builder.js +++ b/src/backend/function-builder.js @@ -3,7 +3,7 @@ * [INTERNAL] A collection of functionNodes. * @class */ -class FunctionBuilder { +export class FunctionBuilder { /** * * @param {Kernel} kernel @@ -58,31 +58,65 @@ class FunctionBuilder { }; const lookupReturnType = (functionName, ast, requestingNode) => { - return functionBuilder.lookupReturnType(functionName, ast, requestingNode); + return functionBuilder.lookupReturnType( + functionName, + ast, + requestingNode + ); }; - const lookupFunctionArgumentTypes = (functionName) => { + const lookupFunctionArgumentTypes = functionName => { return functionBuilder.lookupFunctionArgumentTypes(functionName); }; const lookupFunctionArgumentName = (functionName, argumentIndex) => { - return functionBuilder.lookupFunctionArgumentName(functionName, argumentIndex); + return functionBuilder.lookupFunctionArgumentName( + functionName, + argumentIndex + ); }; const lookupFunctionArgumentBitRatio = (functionName, argumentName) => { - return functionBuilder.lookupFunctionArgumentBitRatio(functionName, argumentName); + return functionBuilder.lookupFunctionArgumentBitRatio( + functionName, + argumentName + ); }; - const triggerImplyArgumentType = (functionName, i, argumentType, requestingNode) => { - functionBuilder.assignArgumentType(functionName, i, argumentType, requestingNode); + const triggerImplyArgumentType = ( + functionName, + i, + argumentType, + requestingNode + ) => { + functionBuilder.assignArgumentType( + functionName, + i, + argumentType, + requestingNode + ); }; - const triggerImplyArgumentBitRatio = (functionName, argumentName, calleeFunctionName, argumentIndex) => { - functionBuilder.assignArgumentBitRatio(functionName, argumentName, calleeFunctionName, argumentIndex); + const triggerImplyArgumentBitRatio = ( + functionName, + argumentName, + calleeFunctionName, + argumentIndex + ) => { + functionBuilder.assignArgumentBitRatio( + functionName, + argumentName, + calleeFunctionName, + argumentIndex + ); }; const onFunctionCall = (functionName, calleeFunctionName, args) => { - functionBuilder.trackFunctionCall(functionName, calleeFunctionName, args); + functionBuilder.trackFunctionCall( + functionName, + calleeFunctionName, + args + ); }; const onNestedFunction = (ast, source) => { @@ -90,11 +124,32 @@ class FunctionBuilder { for (let i = 0; i < ast.params.length; i++) { argumentNames.push(ast.params[i].name); } - const nestedFunction = new FunctionNode(source, Object.assign({}, nodeOptions, { - returnType: null, - ast, - name: ast.id.name, - argumentNames, + const nestedFunction = new FunctionNode( + source, + Object.assign({}, nodeOptions, { + returnType: null, + ast, + name: ast.id.name, + argumentNames, + lookupReturnType, + lookupFunctionArgumentTypes, + lookupFunctionArgumentName, + lookupFunctionArgumentBitRatio, + needsArgumentType, + assignArgumentType, + triggerImplyArgumentType, + triggerImplyArgumentBitRatio, + onFunctionCall, + }) + ); + nestedFunction.traceFunctionAST(ast); + functionBuilder.addFunctionNode(nestedFunction); + }; + + const nodeOptions = Object.assign( + { + isRootKernel: false, + onNestedFunction, lookupReturnType, lookupFunctionArgumentTypes, lookupFunctionArgumentName, @@ -104,35 +159,20 @@ class FunctionBuilder { triggerImplyArgumentType, triggerImplyArgumentBitRatio, onFunctionCall, - })); - nestedFunction.traceFunctionAST(ast); - functionBuilder.addFunctionNode(nestedFunction); - }; - - const nodeOptions = Object.assign({ - isRootKernel: false, - onNestedFunction, - lookupReturnType, - lookupFunctionArgumentTypes, - lookupFunctionArgumentName, - lookupFunctionArgumentBitRatio, - needsArgumentType, - assignArgumentType, - triggerImplyArgumentType, - triggerImplyArgumentBitRatio, - onFunctionCall, - optimizeFloatMemory, - precision, - constants, - constantTypes, - constantBitRatios, - debug, - loopMaxIterations, - output, - plugins, - dynamicArguments, - dynamicOutput, - }, extraNodeOptions || {}); + optimizeFloatMemory, + precision, + constants, + constantTypes, + constantBitRatios, + debug, + loopMaxIterations, + output, + plugins, + dynamicArguments, + dynamicOutput, + }, + extraNodeOptions || {} + ); const rootNodeOptions = Object.assign({}, nodeOptions, { isRootKernel: true, @@ -146,45 +186,54 @@ class FunctionBuilder { }); if (typeof source === 'object' && source.functionNodes) { - return new FunctionBuilder().fromJSON(source.functionNodes, FunctionNode); + return new FunctionBuilder().fromJSON( + source.functionNodes, + FunctionNode + ); } const rootNode = new FunctionNode(source, rootNodeOptions); let functionNodes = null; if (functions) { - functionNodes = functions.map((fn) => new FunctionNode(fn.source, { - returnType: fn.returnType, - argumentTypes: fn.argumentTypes, - output, - plugins, - constants, - constantTypes, - constantBitRatios, - optimizeFloatMemory, - precision, - lookupReturnType, - lookupFunctionArgumentTypes, - lookupFunctionArgumentName, - lookupFunctionArgumentBitRatio, - needsArgumentType, - assignArgumentType, - triggerImplyArgumentType, - triggerImplyArgumentBitRatio, - onFunctionCall, - onNestedFunction, - })); + functionNodes = functions.map( + fn => + new FunctionNode(fn.source, { + returnType: fn.returnType, + argumentTypes: fn.argumentTypes, + output, + plugins, + constants, + constantTypes, + constantBitRatios, + optimizeFloatMemory, + precision, + lookupReturnType, + lookupFunctionArgumentTypes, + lookupFunctionArgumentName, + lookupFunctionArgumentBitRatio, + needsArgumentType, + assignArgumentType, + triggerImplyArgumentType, + triggerImplyArgumentBitRatio, + onFunctionCall, + onNestedFunction, + }) + ); } let subKernelNodes = null; if (subKernels) { - subKernelNodes = subKernels.map((subKernel) => { + subKernelNodes = subKernels.map(subKernel => { const { name, source } = subKernel; - return new FunctionNode(source, Object.assign({}, nodeOptions, { - name, - isSubKernel: true, - isRootKernel: false, - })); + return new FunctionNode( + source, + Object.assign({}, nodeOptions, { + name, + isSubKernel: true, + isRootKernel: false, + }) + ); }); } @@ -193,7 +242,7 @@ class FunctionBuilder { rootNode, functionNodes, nativeFunctions, - subKernelNodes + subKernelNodes, }); return functionBuilder; @@ -279,7 +328,10 @@ class FunctionBuilder { * if dependent function is already in the list, because a function depends on it, and because it has * already been traced, we know that we must move the dependent function to the end of the the retList. * */ - const dependantNativeFunctionName = retList.splice(nativeFunctionIndex, 1)[0]; + const dependantNativeFunctionName = retList.splice( + nativeFunctionIndex, + 1 + )[0]; retList.push(dependantNativeFunctionName); } return retList; @@ -328,7 +380,9 @@ class FunctionBuilder { this.rootNode.toString(); } if (functionName) { - return this.getPrototypesFromFunctionNames(this.traceFunctionCalls(functionName, []).reverse()); + return this.getPrototypesFromFunctionNames( + this.traceFunctionCalls(functionName, []).reverse() + ); } return this.getPrototypesFromFunctionNames(Object.keys(this.functionMap)); } @@ -372,26 +426,31 @@ class FunctionBuilder { } toJSON() { - return this.traceFunctionCalls(this.rootNode.name).reverse().map(name => { - const nativeIndex = this.nativeFunctions.indexOf(name); - if (nativeIndex > -1) { - return { - name, - source: this.nativeFunctions[nativeIndex].source - }; - } else if (this.functionMap[name]) { - return this.functionMap[name].toJSON(); - } else { - throw new Error(`function ${ name } not found`); - } - }); + return this.traceFunctionCalls(this.rootNode.name) + .reverse() + .map(name => { + const nativeIndex = this.nativeFunctions.indexOf(name); + if (nativeIndex > -1) { + return { + name, + source: this.nativeFunctions[nativeIndex].source, + }; + } else if (this.functionMap[name]) { + return this.functionMap[name].toJSON(); + } else { + throw new Error(`function ${name} not found`); + } + }); } fromJSON(jsonFunctionNodes, FunctionNode) { this.functionMap = {}; for (let i = 0; i < jsonFunctionNodes.length; i++) { const jsonFunctionNode = jsonFunctionNodes[i]; - this.functionMap[jsonFunctionNode.settings.name] = new FunctionNode(jsonFunctionNode.ast, jsonFunctionNode.settings); + this.functionMap[jsonFunctionNode.settings.name] = new FunctionNode( + jsonFunctionNode.ast, + jsonFunctionNode.settings + ); } return this; } @@ -403,14 +462,18 @@ class FunctionBuilder { */ getString(functionName) { if (functionName) { - return this.getStringFromFunctionNames(this.traceFunctionCalls(functionName).reverse()); + return this.getStringFromFunctionNames( + this.traceFunctionCalls(functionName).reverse() + ); } return this.getStringFromFunctionNames(Object.keys(this.functionMap)); } lookupReturnType(functionName, ast, requestingNode) { if (ast.type !== 'CallExpression') { - throw new Error(`expected ast type of "CallExpression", but is ${ ast.type }`); + throw new Error( + `expected ast type of "CallExpression", but is ${ast.type}` + ); } if (this._isNativeFunction(functionName)) { return this._lookupNativeFunctionReturnType(functionName); @@ -430,12 +493,12 @@ class FunctionBuilder { this.lookupChain.push({ name: requestingNode.name, ast: args[i], - requestingNode + requestingNode, }); node.argumentTypes[j] = requestingNode.getType(args[j]); this.lookupChain.pop(); } - return node.returnType = node.getType(node.getJsAST()); + return (node.returnType = node.getType(node.getJsAST())); } throw new Error('circlical logic detected!'); @@ -445,11 +508,11 @@ class FunctionBuilder { this.lookupChain.push({ name: requestingNode.name, ast, - requestingNode + requestingNode, }); const type = node.getType(node.getJsAST()); this.lookupChain.pop(); - return node.returnType = type; + return (node.returnType = type); } } @@ -475,7 +538,8 @@ class FunctionBuilder { _getNativeFunction(functionName) { for (let i = 0; i < this.nativeFunctions.length; i++) { - if (this.nativeFunctions[i].name === functionName) return this.nativeFunctions[i]; + if (this.nativeFunctions[i].name === functionName) + return this.nativeFunctions[i]; } return null; } @@ -489,7 +553,7 @@ class FunctionBuilder { if (nativeFunction) { return nativeFunction.returnType; } - throw new Error(`Native function ${ functionName } not found`); + throw new Error(`Native function ${functionName} not found`); } lookupFunctionArgumentTypes(functionName) { @@ -554,25 +618,38 @@ class FunctionBuilder { * @param {number} argumentIndex * @return {number|null} */ - assignArgumentBitRatio(functionName, argumentName, calleeFunctionName, argumentIndex) { + assignArgumentBitRatio( + functionName, + argumentName, + calleeFunctionName, + argumentIndex + ) { const node = this._getFunction(functionName); if (this._isNativeFunction(calleeFunctionName)) return null; const calleeNode = this._getFunction(calleeFunctionName); const i = node.argumentNames.indexOf(argumentName); if (i === -1) { - throw new Error(`Argument ${argumentName} not found in arguments from function ${functionName}`); + throw new Error( + `Argument ${argumentName} not found in arguments from function ${functionName}` + ); } const bitRatio = node.argumentBitRatios[i]; if (typeof bitRatio !== 'number') { - throw new Error(`Bit ratio for argument ${argumentName} not found in function ${functionName}`); + throw new Error( + `Bit ratio for argument ${argumentName} not found in function ${functionName}` + ); } if (!calleeNode.argumentBitRatios) { - calleeNode.argumentBitRatios = new Array(calleeNode.argumentNames.length); + calleeNode.argumentBitRatios = new Array( + calleeNode.argumentNames.length + ); } const calleeBitRatio = calleeNode.argumentBitRatios[i]; if (typeof calleeBitRatio === 'number') { if (calleeBitRatio !== bitRatio) { - throw new Error(`Incompatible bit ratio found at function ${functionName} at argument ${argumentName}`); + throw new Error( + `Incompatible bit ratio found at function ${functionName} at argument ${argumentName}` + ); } return calleeBitRatio; } @@ -590,22 +667,33 @@ class FunctionBuilder { } getKernelResultType() { - return this.rootNode.returnType || this.rootNode.getType(this.rootNode.ast); + return ( + this.rootNode.returnType || this.rootNode.getType(this.rootNode.ast) + ); } getSubKernelResultType(index) { const subKernelNode = this.subKernelNodes[index]; let called = false; - for (let functionCallIndex = 0; functionCallIndex < this.rootNode.functionCalls.length; functionCallIndex++) { + for ( + let functionCallIndex = 0; + functionCallIndex < this.rootNode.functionCalls.length; + functionCallIndex++ + ) { const functionCall = this.rootNode.functionCalls[functionCallIndex]; if (functionCall.ast.callee.name === subKernelNode.name) { called = true; } } if (!called) { - throw new Error(`SubKernel ${ subKernelNode.name } never called by kernel`); - } - return subKernelNode.returnType || subKernelNode.getType(subKernelNode.getJsAST()); + throw new Error( + `SubKernel ${subKernelNode.name} never called by kernel` + ); + } + return ( + subKernelNode.returnType || + subKernelNode.getType(subKernelNode.getJsAST()) + ); } getReturnTypes() { @@ -621,7 +709,3 @@ class FunctionBuilder { return result; } } - -module.exports = { - FunctionBuilder -}; \ No newline at end of file diff --git a/src/backend/function-node.js b/src/backend/function-node.js index 13150609..e313ac2a 100644 --- a/src/backend/function-node.js +++ b/src/backend/function-node.js @@ -1,13 +1,13 @@ -const acorn = require('acorn'); -const { utils } = require('../utils'); -const { FunctionTracer } = require('./function-tracer'); +import * as acorn from 'acorn'; +import { utils } from '../utils'; +import { FunctionTracer } from './function-tracer'; /** * * @desc Represents a single function, inside JS, webGL, or openGL. *

This handles all the raw state, converted state, etc. Of a single function.

*/ -class FunctionNode { +export class FunctionNode { /** * * @param {string|object} source @@ -20,9 +20,12 @@ class FunctionNode { settings = settings || {}; this.source = source; this.ast = null; - this.name = typeof source === 'string' ? settings.isRootKernel ? - 'kernel' : - (settings.name || utils.getFunctionNameFromString(source)) : null; + this.name = + typeof source === 'string' + ? settings.isRootKernel + ? 'kernel' + : settings.name || utils.getFunctionNameFromString(source) + : null; this.calledFunctions = []; this.constants = {}; this.constantTypes = {}; @@ -47,7 +50,10 @@ class FunctionNode { this.optimizeFloatMemory = null; this.precision = null; this.loopMaxIterations = null; - this.argumentNames = (typeof this.source === 'string' ? utils.getArgumentNamesFromString(this.source) : null); + this.argumentNames = + typeof this.source === 'string' + ? utils.getArgumentNamesFromString(this.source) + : null; this.argumentTypes = []; this.argumentSizes = []; this.argumentBitRatios = null; @@ -89,8 +95,13 @@ class FunctionNode { throw new Error('this.name could not be set'); } - if (this.argumentTypes.length > 0 && this.argumentTypes.length !== this.argumentNames.length) { - throw new Error(`argumentTypes count of ${ this.argumentTypes.length } exceeds ${ this.argumentNames.length }`); + if ( + this.argumentTypes.length > 0 && + this.argumentTypes.length !== this.argumentNames.length + ) { + throw new Error( + `argumentTypes count of ${this.argumentTypes.length} exceeds ${this.argumentNames.length}` + ); } if (this.output.length < 1) { @@ -108,7 +119,9 @@ class FunctionNode { } isInput(argumentName) { - return this.argumentTypes[this.argumentNames.indexOf(argumentName)] === 'Input'; + return ( + this.argumentTypes[this.argumentNames.indexOf(argumentName)] === 'Input' + ); } pushState(state) { @@ -117,7 +130,7 @@ class FunctionNode { popState(state) { if (this.state !== state) { - throw new Error(`Cannot popState ${ state } when in ${ this.state }`); + throw new Error(`Cannot popState ${state} when in ${this.state}`); } this.states.pop(); } @@ -166,7 +179,11 @@ class FunctionNode { //babel sniffing if (ast.hasOwnProperty('expressions')) { const firstExpression = ast.expressions[0]; - if (firstExpression.type === 'Literal' && firstExpression.value === 0 && ast.expressions.length === 2) { + if ( + firstExpression.type === 'Literal' && + firstExpression.value === 0 && + ast.expressions.length === 2 + ) { return this.astMemberExpressionUnroll(ast.expressions[1]); } } @@ -189,7 +206,7 @@ class FunctionNode { } if (typeof this.source === 'object') { this.traceFunctionAST(this.source); - return this.ast = this.source; + return (this.ast = this.source); } inParser = inParser || acorn; @@ -197,9 +214,12 @@ class FunctionNode { throw new Error('Missing JS to AST parser'); } - const ast = Object.freeze(inParser.parse(`const parser_${ this.name } = ${ this.source };`, { - locations: true - })); + const ast = Object.freeze( + inParser.parse(`const parser_${this.name} = ${this.source};`, { + locations: true, + ecmaVersion: 'latest', + }) + ); // take out the function object, outside the var declarations const functionAST = ast.body[0].declarations[0].init; this.traceFunctionAST(functionAST); @@ -208,11 +228,12 @@ class FunctionNode { throw new Error('Failed to parse JS code'); } - return this.ast = functionAST; + return (this.ast = functionAST); } traceFunctionAST(ast) { - const { contexts, declarations, functions, identifiers, functionCalls } = new FunctionTracer(ast); + const { contexts, declarations, functions, identifiers, functionCalls } = + new FunctionTracer(ast); this.contexts = contexts; this.identifiers = identifiers; this.functionCalls = functionCalls; @@ -302,7 +323,7 @@ class FunctionNode { */ getLookupType(type) { if (!typeLookupMap.hasOwnProperty(type)) { - throw new Error(`unknown typeLookupMap ${ type }`); + throw new Error(`unknown typeLookupMap ${type}`); } return typeLookupMap[type]; } @@ -316,12 +337,14 @@ class FunctionNode { return type; } } - throw new Error(`Type for constant "${ constantName }" not declared`); + throw new Error(`Type for constant "${constantName}" not declared`); } toString() { if (this._string) return this._string; - return this._string = this.astGeneric(this.getJsAST(), []).join('').trim(); + return (this._string = this.astGeneric(this.getJsAST(), []) + .join('') + .trim()); } toJSON() { @@ -345,7 +368,7 @@ class FunctionNode { return { ast: this.ast, - settings + settings, }; } @@ -369,7 +392,7 @@ class FunctionNode { case 'Array(4)': return `Matrix(${ast.elements.length})`; } - return `Array(${ ast.elements.length })`; + return `Array(${ast.elements.length})`; case 'Literal': const literalKey = this.astKey(ast); if (this.literalTypes[literalKey]) { @@ -382,192 +405,228 @@ class FunctionNode { } else { return 'Number'; } - case 'AssignmentExpression': - return this.getType(ast.left); - case 'CallExpression': - if (this.isAstMathFunction(ast)) { - return 'Number'; + case 'AssignmentExpression': + return this.getType(ast.left); + case 'CallExpression': + if (this.isAstMathFunction(ast)) { + return 'Number'; + } + if (!ast.callee || !ast.callee.name) { + if ( + ast.callee.type === 'SequenceExpression' && + ast.callee.expressions[ast.callee.expressions.length - 1].property + .name + ) { + const functionName = + ast.callee.expressions[ast.callee.expressions.length - 1] + .property.name; + this.inferArgumentTypesIfNeeded(functionName, ast.arguments); + return this.lookupReturnType(functionName, ast, this); } - if (!ast.callee || !ast.callee.name) { - if (ast.callee.type === 'SequenceExpression' && ast.callee.expressions[ast.callee.expressions.length - 1].property.name) { - const functionName = ast.callee.expressions[ast.callee.expressions.length - 1].property.name; - this.inferArgumentTypesIfNeeded(functionName, ast.arguments); - return this.lookupReturnType(functionName, ast, this); - } - if (this.getVariableSignature(ast.callee, true) === 'this.color') { - return null; - } - if (ast.callee.type === 'MemberExpression' && ast.callee.object && ast.callee.property && ast.callee.property.name && ast.arguments) { - const functionName = ast.callee.property.name; - this.inferArgumentTypesIfNeeded(functionName, ast.arguments); - return this.lookupReturnType(functionName, ast, this); - } - throw this.astErrorOutput('Unknown call expression', ast); + if (this.getVariableSignature(ast.callee, true) === 'this.color') { + return null; } - if (ast.callee && ast.callee.name) { - const functionName = ast.callee.name; + if ( + ast.callee.type === 'MemberExpression' && + ast.callee.object && + ast.callee.property && + ast.callee.property.name && + ast.arguments + ) { + const functionName = ast.callee.property.name; this.inferArgumentTypesIfNeeded(functionName, ast.arguments); return this.lookupReturnType(functionName, ast, this); } - throw this.astErrorOutput(`Unhandled getType Type "${ ast.type }"`, ast); - case 'LogicalExpression': - return 'Boolean'; - case 'BinaryExpression': - // modulos is Number - switch (ast.operator) { - case '%': - case '/': - if (this.fixIntegerDivisionAccuracy) { - return 'Number'; - } else { - break; - } - case '>': - case '<': - return 'Boolean'; - case '&': - case '|': - case '^': - case '<<': - case '>>': - case '>>>': - return 'Integer'; - } - const type = this.getType(ast.left); - if (this.isState('skip-literal-correction')) return type; - if (type === 'LiteralInteger') { - const rightType = this.getType(ast.right); - if (rightType === 'LiteralInteger') { - if (ast.left.value % 1 === 0) { - return 'Integer'; - } else { - return 'Float'; - } + throw this.astErrorOutput('Unknown call expression', ast); + } + if (ast.callee && ast.callee.name) { + const functionName = ast.callee.name; + this.inferArgumentTypesIfNeeded(functionName, ast.arguments); + return this.lookupReturnType(functionName, ast, this); + } + throw this.astErrorOutput(`Unhandled getType Type "${ast.type}"`, ast); + case 'LogicalExpression': + return 'Boolean'; + case 'BinaryExpression': + // modulos is Number + switch (ast.operator) { + case '%': + case '/': + if (this.fixIntegerDivisionAccuracy) { + return 'Number'; + } else { + break; } - return rightType; - } - return typeLookupMap[type] || type; - case 'UpdateExpression': - return this.getType(ast.argument); - case 'UnaryExpression': - if (ast.operator === '~') { + case '>': + case '<': + return 'Boolean'; + case '&': + case '|': + case '^': + case '<<': + case '>>': + case '>>>': return 'Integer'; - } - return this.getType(ast.argument); - case 'VariableDeclaration': { - const declarations = ast.declarations; - let lastType; - for (let i = 0; i < declarations.length; i++) { - const declaration = declarations[i]; - lastType = this.getType(declaration); - } - if (!lastType) { - throw this.astErrorOutput(`Unable to find type for declaration`, ast); - } - return lastType; } - case 'VariableDeclarator': - const declaration = this.getDeclaration(ast.id); - if (!declaration) { - throw this.astErrorOutput(`Unable to find declarator`, ast); + const type = this.getType(ast.left); + if (this.isState('skip-literal-correction')) return type; + if (type === 'LiteralInteger') { + const rightType = this.getType(ast.right); + if (rightType === 'LiteralInteger') { + if (ast.left.value % 1 === 0) { + return 'Integer'; + } else { + return 'Float'; + } } + return rightType; + } + return typeLookupMap[type] || type; + case 'UpdateExpression': + return this.getType(ast.argument); + case 'UnaryExpression': + if (ast.operator === '~') { + return 'Integer'; + } + return this.getType(ast.argument); + case 'VariableDeclaration': { + const declarations = ast.declarations; + let lastType; + for (let i = 0; i < declarations.length; i++) { + const declaration = declarations[i]; + lastType = this.getType(declaration); + } + if (!lastType) { + throw this.astErrorOutput( + `Unable to find type for declaration`, + ast + ); + } + return lastType; + } + case 'VariableDeclarator': + const declaration = this.getDeclaration(ast.id); + if (!declaration) { + throw this.astErrorOutput(`Unable to find declarator`, ast); + } - if (!declaration.valueType) { - throw this.astErrorOutput(`Unable to find declarator valueType`, ast); - } + if (!declaration.valueType) { + throw this.astErrorOutput( + `Unable to find declarator valueType`, + ast + ); + } - return declaration.valueType; - case 'Identifier': - if (ast.name === 'Infinity') { - return 'Number'; - } - if (this.isAstVariable(ast)) { - const signature = this.getVariableSignature(ast); - if (signature === 'value') { - return this.getCheckVariableType(ast); - } - } - const origin = this.findIdentifierOrigin(ast); - if (origin && origin.init) { - return this.getType(origin.init); + return declaration.valueType; + case 'Identifier': + if (ast.name === 'Infinity') { + return 'Number'; + } + if (this.isAstVariable(ast)) { + const signature = this.getVariableSignature(ast); + if (signature === 'value') { + return this.getCheckVariableType(ast); } - return null; - case 'ReturnStatement': - return this.getType(ast.argument); - case 'MemberExpression': - if (this.isAstMathFunction(ast)) { - switch (ast.property.name) { - case 'ceil': - return 'Integer'; - case 'floor': - return 'Integer'; - case 'round': - return 'Integer'; - } - return 'Number'; + } + const origin = this.findIdentifierOrigin(ast); + if (origin && origin.init) { + return this.getType(origin.init); + } + return null; + case 'ReturnStatement': + return this.getType(ast.argument); + case 'MemberExpression': + if (this.isAstMathFunction(ast)) { + switch (ast.property.name) { + case 'ceil': + return 'Integer'; + case 'floor': + return 'Integer'; + case 'round': + return 'Integer'; } - if (this.isAstVariable(ast)) { - const variableSignature = this.getVariableSignature(ast); - switch (variableSignature) { - case 'value[]': - return this.getLookupType(this.getCheckVariableType(ast.object)); - case 'value[][]': - return this.getLookupType(this.getCheckVariableType(ast.object.object)); - case 'value[][][]': - return this.getLookupType(this.getCheckVariableType(ast.object.object.object)); - case 'value[][][][]': - return this.getLookupType(this.getCheckVariableType(ast.object.object.object.object)); - case 'value.thread.value': - case 'this.thread.value': - return 'Integer'; - case 'this.output.value': - return this.dynamicOutput ? 'Integer' : 'LiteralInteger'; - case 'this.constants.value': - return this.getConstantType(ast.property.name); - case 'this.constants.value[]': - return this.getLookupType(this.getConstantType(ast.object.property.name)); - case 'this.constants.value[][]': - return this.getLookupType(this.getConstantType(ast.object.object.property.name)); - case 'this.constants.value[][][]': - return this.getLookupType(this.getConstantType(ast.object.object.object.property.name)); - case 'this.constants.value[][][][]': - return this.getLookupType(this.getConstantType(ast.object.object.object.object.property.name)); - case 'fn()[]': - case 'fn()[][]': - case 'fn()[][][]': - return this.getLookupType(this.getType(ast.object)); - case 'value.value': - if (this.isAstMathVariable(ast)) { - return 'Number'; - } - switch (ast.property.name) { - case 'r': - case 'g': - case 'b': - case 'a': - return this.getLookupType(this.getCheckVariableType(ast.object)); - } - case '[][]': - return 'Number'; - } - throw this.astErrorOutput('Unhandled getType MemberExpression', ast); + return 'Number'; + } + if (this.isAstVariable(ast)) { + const variableSignature = this.getVariableSignature(ast); + switch (variableSignature) { + case 'value[]': + return this.getLookupType(this.getCheckVariableType(ast.object)); + case 'value[][]': + return this.getLookupType( + this.getCheckVariableType(ast.object.object) + ); + case 'value[][][]': + return this.getLookupType( + this.getCheckVariableType(ast.object.object.object) + ); + case 'value[][][][]': + return this.getLookupType( + this.getCheckVariableType(ast.object.object.object.object) + ); + case 'value.thread.value': + case 'this.thread.value': + return 'Integer'; + case 'this.output.value': + return this.dynamicOutput ? 'Integer' : 'LiteralInteger'; + case 'this.constants.value': + return this.getConstantType(ast.property.name); + case 'this.constants.value[]': + return this.getLookupType( + this.getConstantType(ast.object.property.name) + ); + case 'this.constants.value[][]': + return this.getLookupType( + this.getConstantType(ast.object.object.property.name) + ); + case 'this.constants.value[][][]': + return this.getLookupType( + this.getConstantType(ast.object.object.object.property.name) + ); + case 'this.constants.value[][][][]': + return this.getLookupType( + this.getConstantType( + ast.object.object.object.object.property.name + ) + ); + case 'fn()[]': + case 'fn()[][]': + case 'fn()[][][]': + return this.getLookupType(this.getType(ast.object)); + case 'value.value': + if (this.isAstMathVariable(ast)) { + return 'Number'; + } + switch (ast.property.name) { + case 'r': + case 'g': + case 'b': + case 'a': + return this.getLookupType( + this.getCheckVariableType(ast.object) + ); + } + case '[][]': + return 'Number'; } throw this.astErrorOutput('Unhandled getType MemberExpression', ast); - case 'ConditionalExpression': - return this.getType(ast.consequent); - case 'FunctionDeclaration': - case 'FunctionExpression': - const lastReturn = this.findLastReturn(ast.body); - if (lastReturn) { - return this.getType(lastReturn); - } - return null; - case 'IfStatement': - return this.getType(ast.consequent); - case 'SequenceExpression': - return this.getType(ast.expressions[ast.expressions.length - 1]); - default: - throw this.astErrorOutput(`Unhandled getType Type "${ ast.type }"`, ast); + } + throw this.astErrorOutput('Unhandled getType MemberExpression', ast); + case 'ConditionalExpression': + return this.getType(ast.consequent); + case 'FunctionDeclaration': + case 'FunctionExpression': + const lastReturn = this.findLastReturn(ast.body); + if (lastReturn) { + return this.getType(lastReturn); + } + return null; + case 'IfStatement': + return this.getType(ast.consequent); + case 'SequenceExpression': + return this.getType(ast.expressions[ast.expressions.length - 1]); + default: + throw this.astErrorOutput(`Unhandled getType Type "${ast.type}"`, ast); } } @@ -602,12 +661,15 @@ class FunctionNode { 'LOG2E', 'LOG10E', ]; - return ast.type === 'MemberExpression' && - ast.object && ast.object.type === 'Identifier' && + return ( + ast.type === 'MemberExpression' && + ast.object && + ast.object.type === 'Identifier' && ast.object.name === 'Math' && ast.property && ast.property.type === 'Identifier' && - mathProperties.indexOf(ast.property.name) > -1; + mathProperties.indexOf(ast.property.name) > -1 + ); } isAstMathFunction(ast) { @@ -647,7 +709,8 @@ class FunctionNode { 'tanh', 'trunc', ]; - return ast.type === 'CallExpression' && + return ( + ast.type === 'CallExpression' && ast.callee && ast.callee.type === 'MemberExpression' && ast.callee.object && @@ -655,7 +718,8 @@ class FunctionNode { ast.callee.object.name === 'Math' && ast.callee.property && ast.callee.property.type === 'Identifier' && - mathFunctions.indexOf(ast.callee.property.name) > -1; + mathFunctions.indexOf(ast.callee.property.name) > -1 + ); } isAstVariable(ast) { @@ -667,7 +731,9 @@ class FunctionNode { } isSafeDependencies(dependencies) { - return dependencies && dependencies.every ? dependencies.every(dependency => dependency.isSafe) : true; + return dependencies && dependencies.every + ? dependencies.every(dependency => dependency.isSafe) + : true; } /** @@ -702,7 +768,12 @@ class FunctionNode { dependencies.push({ origin: 'literal', value: ast.value, - isSafe: isNotSafe === true ? false : ast.value > -Infinity && ast.value < Infinity && !isNaN(ast.value) + isSafe: + isNotSafe === true + ? false + : ast.value > -Infinity && + ast.value < Infinity && + !isNaN(ast.value), }); break; case 'VariableDeclarator': @@ -713,7 +784,9 @@ class FunctionNode { dependencies.push({ name: ast.name, origin: 'declaration', - isSafe: isNotSafe ? false : this.isSafeDependencies(declaration.dependencies), + isSafe: isNotSafe + ? false + : this.isSafeDependencies(declaration.dependencies), }); } else if (this.argumentNames.indexOf(ast.name) > -1) { dependencies.push({ @@ -726,12 +799,16 @@ class FunctionNode { } break; case 'FunctionDeclaration': - return this.getDependencies(ast.body.body[ast.body.body.length - 1], dependencies, isNotSafe); + return this.getDependencies( + ast.body.body[ast.body.body.length - 1], + dependencies, + isNotSafe + ); case 'ReturnStatement': return this.getDependencies(ast.argument, dependencies); case 'BinaryExpression': case 'LogicalExpression': - isNotSafe = (ast.operator === '/' || ast.operator === '*'); + isNotSafe = ast.operator === '/' || ast.operator === '*'; this.getDependencies(ast.left, dependencies, isNotSafe); this.getDependencies(ast.right, dependencies, isNotSafe); return dependencies; @@ -762,7 +839,11 @@ class FunctionNode { this.getDependencies(ast.object.object, dependencies, isNotSafe); break; case 'value[][][]': - this.getDependencies(ast.object.object.object, dependencies, isNotSafe); + this.getDependencies( + ast.object.object.object, + dependencies, + isNotSafe + ); break; case 'this.output.value': if (this.dynamicOutput) { @@ -789,17 +870,20 @@ class FunctionNode { } return dependencies; } - case 'SequenceExpression': - return this.getDependencies(ast.expressions, dependencies, isNotSafe); - default: - throw this.astErrorOutput(`Unhandled type ${ ast.type } in getDependencies`, ast); + case 'SequenceExpression': + return this.getDependencies(ast.expressions, dependencies, isNotSafe); + default: + throw this.astErrorOutput( + `Unhandled type ${ast.type} in getDependencies`, + ast + ); } return dependencies; } getVariableSignature(ast, returnRawValue) { if (!this.isAstVariable(ast)) { - throw new Error(`ast of type "${ ast.type }" is not a variable signature`); + throw new Error(`ast of type "${ast.type}" is not a variable signature`); } if (ast.type === 'Identifier') { return 'value'; @@ -817,7 +901,9 @@ class FunctionNode { ast.property.name === 'y' || ast.property.name === 'z' ) { - signature.unshift(returnRawValue ? '.' + ast.property.name : '.value'); + signature.unshift( + returnRawValue ? '.' + ast.property.name : '.value' + ); } else if ( ast.property.name === 'constants' || ast.property.name === 'thread' || @@ -825,7 +911,9 @@ class FunctionNode { ) { signature.unshift('.' + ast.property.name); } else { - signature.unshift(returnRawValue ? '.' + ast.property.name : '.value'); + signature.unshift( + returnRawValue ? '.' + ast.property.name : '.value' + ); } } else if (ast.name) { signature.unshift(returnRawValue ? ast.name : 'value'); @@ -968,8 +1056,11 @@ class FunctionNode { const debugString = utils.getAstString(this.source, ast); const leadingSource = this.source.substr(ast.start); const splitLines = leadingSource.split(/\n/); - const lineBefore = splitLines.length > 0 ? splitLines[splitLines.length - 1] : 0; - return new Error(`${error} on line ${ splitLines.length }, position ${ lineBefore.length }:\n ${ debugString }`); + const lineBefore = + splitLines.length > 0 ? splitLines[splitLines.length - 1] : 0; + return new Error( + `${error} on line ${splitLines.length}, position ${lineBefore.length}:\n ${debugString}` + ); } astDebuggerStatement(arrNode, retArr) { @@ -997,7 +1088,7 @@ class FunctionNode { * @returns {String[]} */ astFunction(ast, retArr) { - throw new Error(`"astFunction" not defined on ${ this.constructor.name }`); + throw new Error(`"astFunction" not defined on ${this.constructor.name}`); } /** @@ -1206,7 +1297,10 @@ class FunctionNode { */ getMemberExpressionDetails(ast) { if (ast.type !== 'MemberExpression') { - throw this.astErrorOutput(`Expression ${ ast.type } not a MemberExpression`, ast); + throw this.astErrorOutput( + `Expression ${ast.type} not a MemberExpression`, + ast + ); } let name = null; let type = null; @@ -1219,8 +1313,8 @@ class FunctionNode { case 'this.output.value': return { signature: variableSignature, - type: 'Integer', - name: ast.property.name + type: 'Integer', + name: ast.property.name, }; case 'value[]': if (typeof ast.object.name !== 'string') { @@ -1230,9 +1324,9 @@ class FunctionNode { return { name, origin: 'user', - signature: variableSignature, - type: this.getVariableType(ast.object), - xProperty: ast.property + signature: variableSignature, + type: this.getVariableType(ast.object), + xProperty: ast.property, }; case 'value[][]': if (typeof ast.object.object.name !== 'string') { @@ -1242,10 +1336,10 @@ class FunctionNode { return { name, origin: 'user', - signature: variableSignature, - type: this.getVariableType(ast.object.object), - yProperty: ast.object.property, - xProperty: ast.property, + signature: variableSignature, + type: this.getVariableType(ast.object.object), + yProperty: ast.object.property, + xProperty: ast.property, }; case 'value[][][]': if (typeof ast.object.object.object.name !== 'string') { @@ -1255,11 +1349,11 @@ class FunctionNode { return { name, origin: 'user', - signature: variableSignature, - type: this.getVariableType(ast.object.object.object), - zProperty: ast.object.object.property, - yProperty: ast.object.property, - xProperty: ast.property, + signature: variableSignature, + type: this.getVariableType(ast.object.object.object), + zProperty: ast.object.object.property, + yProperty: ast.object.property, + xProperty: ast.property, }; case 'value[][][][]': if (typeof ast.object.object.object.object.name !== 'string') { @@ -1269,11 +1363,11 @@ class FunctionNode { return { name, origin: 'user', - signature: variableSignature, - type: this.getVariableType(ast.object.object.object.object), - zProperty: ast.object.object.property, - yProperty: ast.object.property, - xProperty: ast.property, + signature: variableSignature, + type: this.getVariableType(ast.object.object.object.object), + zProperty: ast.object.object.property, + yProperty: ast.object.property, + xProperty: ast.property, }; case 'value.value': if (typeof ast.property.name !== 'string') { @@ -1297,90 +1391,90 @@ class FunctionNode { return { name, property: ast.property.name, - origin: 'user', - signature: variableSignature, - type: 'Number' + origin: 'user', + signature: variableSignature, + type: 'Number', }; default: throw this.astErrorOutput('Unexpected expression', ast); } - case 'this.constants.value': - if (typeof ast.property.name !== 'string') { - throw this.astErrorOutput('Unexpected expression', ast); - } - name = ast.property.name; - type = this.getConstantType(name); - if (!type) { - throw this.astErrorOutput('Constant has no type', ast); - } - return { - name, - type, - origin: 'constants', - signature: variableSignature, - }; - case 'this.constants.value[]': - if (typeof ast.object.property.name !== 'string') { - throw this.astErrorOutput('Unexpected expression', ast); - } - name = ast.object.property.name; - type = this.getConstantType(name); - if (!type) { - throw this.astErrorOutput('Constant has no type', ast); - } - return { - name, - type, - origin: 'constants', - signature: variableSignature, - xProperty: ast.property, - }; - case 'this.constants.value[][]': { - if (typeof ast.object.object.property.name !== 'string') { - throw this.astErrorOutput('Unexpected expression', ast); - } - name = ast.object.object.property.name; - type = this.getConstantType(name); - if (!type) { - throw this.astErrorOutput('Constant has no type', ast); - } - return { - name, - type, - origin: 'constants', - signature: variableSignature, - yProperty: ast.object.property, - xProperty: ast.property, - }; + case 'this.constants.value': + if (typeof ast.property.name !== 'string') { + throw this.astErrorOutput('Unexpected expression', ast); } - case 'this.constants.value[][][]': { - if (typeof ast.object.object.object.property.name !== 'string') { - throw this.astErrorOutput('Unexpected expression', ast); - } - name = ast.object.object.object.property.name; - type = this.getConstantType(name); - if (!type) { - throw this.astErrorOutput('Constant has no type', ast); - } - return { - name, - type, - origin: 'constants', - signature: variableSignature, - zProperty: ast.object.object.property, - yProperty: ast.object.property, - xProperty: ast.property, - }; + name = ast.property.name; + type = this.getConstantType(name); + if (!type) { + throw this.astErrorOutput('Constant has no type', ast); } - case 'fn()[]': - case 'fn()[][]': - case '[][]': - return { - signature: variableSignature, - property: ast.property, - }; - default: + return { + name, + type, + origin: 'constants', + signature: variableSignature, + }; + case 'this.constants.value[]': + if (typeof ast.object.property.name !== 'string') { + throw this.astErrorOutput('Unexpected expression', ast); + } + name = ast.object.property.name; + type = this.getConstantType(name); + if (!type) { + throw this.astErrorOutput('Constant has no type', ast); + } + return { + name, + type, + origin: 'constants', + signature: variableSignature, + xProperty: ast.property, + }; + case 'this.constants.value[][]': { + if (typeof ast.object.object.property.name !== 'string') { throw this.astErrorOutput('Unexpected expression', ast); + } + name = ast.object.object.property.name; + type = this.getConstantType(name); + if (!type) { + throw this.astErrorOutput('Constant has no type', ast); + } + return { + name, + type, + origin: 'constants', + signature: variableSignature, + yProperty: ast.object.property, + xProperty: ast.property, + }; + } + case 'this.constants.value[][][]': { + if (typeof ast.object.object.object.property.name !== 'string') { + throw this.astErrorOutput('Unexpected expression', ast); + } + name = ast.object.object.object.property.name; + type = this.getConstantType(name); + if (!type) { + throw this.astErrorOutput('Constant has no type', ast); + } + return { + name, + type, + origin: 'constants', + signature: variableSignature, + zProperty: ast.object.object.property, + yProperty: ast.object.property, + xProperty: ast.property, + }; + } + case 'fn()[]': + case 'fn()[][]': + case '[][]': + return { + signature: variableSignature, + property: ast.property, + }; + default: + throw this.astErrorOutput('Unexpected expression', ast); } } @@ -1389,7 +1483,12 @@ class FunctionNode { while (stack.length > 0) { const atNode = stack[0]; - if (atNode.type === 'VariableDeclarator' && atNode.id && atNode.id.name && atNode.id.name === astToFind.name) { + if ( + atNode.type === 'VariableDeclarator' && + atNode.id && + atNode.id.name && + atNode.id.name === astToFind.name + ) { return atNode; } stack.shift(); @@ -1456,28 +1555,28 @@ class FunctionNode { } const typeLookupMap = { - 'Number': 'Number', - 'Float': 'Float', - 'Integer': 'Integer', - 'Array': 'Number', + Number: 'Number', + Float: 'Float', + Integer: 'Integer', + Array: 'Number', 'Array(2)': 'Number', 'Array(3)': 'Number', 'Array(4)': 'Number', 'Matrix(2)': 'Number', 'Matrix(3)': 'Number', 'Matrix(4)': 'Number', - 'Array2D': 'Number', - 'Array3D': 'Number', - 'Input': 'Number', - 'HTMLCanvas': 'Array(4)', - 'OffscreenCanvas': 'Array(4)', - 'HTMLImage': 'Array(4)', - 'ImageBitmap': 'Array(4)', - 'ImageData': 'Array(4)', - 'HTMLVideo': 'Array(4)', - 'HTMLImageArray': 'Array(4)', - 'NumberTexture': 'Number', - 'MemoryOptimizedNumberTexture': 'Number', + Array2D: 'Number', + Array3D: 'Number', + Input: 'Number', + HTMLCanvas: 'Array(4)', + OffscreenCanvas: 'Array(4)', + HTMLImage: 'Array(4)', + ImageBitmap: 'Array(4)', + ImageData: 'Array(4)', + HTMLVideo: 'Array(4)', + HTMLImageArray: 'Array(4)', + NumberTexture: 'Number', + MemoryOptimizedNumberTexture: 'Number', 'Array1D(2)': 'Array(2)', 'Array1D(3)': 'Array(3)', 'Array1D(4)': 'Array(4)', @@ -1492,7 +1591,3 @@ const typeLookupMap = { 'ArrayTexture(3)': 'Array(3)', 'ArrayTexture(4)': 'Array(4)', }; - -module.exports = { - FunctionNode -}; \ No newline at end of file diff --git a/src/backend/function-tracer.js b/src/backend/function-tracer.js index f9779867..9c2dd46d 100644 --- a/src/backend/function-tracer.js +++ b/src/backend/function-tracer.js @@ -1,4 +1,4 @@ -const { utils } = require('../utils'); +import { utils } from '../utils'; function last(array) { return array.length > 0 ? array[array.length - 1] : null; @@ -7,10 +7,10 @@ function last(array) { const states = { trackIdentifiers: 'trackIdentifiers', memberExpression: 'memberExpression', - inForLoopInit: 'inForLoopInit' + inForLoopInit: 'inForLoopInit', }; -class FunctionTracer { +export class FunctionTracer { constructor(ast) { this.runningContexts = []; this.functionContexts = []; @@ -65,13 +65,20 @@ class FunctionTracer { } newContext(run) { - const newContext = Object.assign({ '@contextType': 'const/let' }, this.currentContext); + const newContext = Object.assign( + { '@contextType': 'const/let' }, + this.currentContext + ); this.contexts.push(newContext); this.runningContexts.push(newContext); run(); const { currentFunctionContext } = this; for (const p in currentFunctionContext) { - if (!currentFunctionContext.hasOwnProperty(p) || newContext.hasOwnProperty(p)) continue; + if ( + !currentFunctionContext.hasOwnProperty(p) || + newContext.hasOwnProperty(p) + ) + continue; newContext[p] = currentFunctionContext[p]; } this.runningContexts.pop(); @@ -86,7 +93,7 @@ class FunctionTracer { } getIdentifiers(run) { - const trackedIdentifiers = this.trackedIdentifiers = []; + const trackedIdentifiers = (this.trackedIdentifiers = []); this.pushState(states.trackIdentifiers); run(); this.trackedIdentifiers = null; @@ -100,14 +107,16 @@ class FunctionTracer { */ getDeclaration(name) { const { currentContext, currentFunctionContext, runningContexts } = this; - const declaration = currentContext[name] || currentFunctionContext[name] || null; + const declaration = + currentContext[name] || currentFunctionContext[name] || null; if ( !declaration && currentContext === currentFunctionContext && runningContexts.length > 0 ) { - const previousRunningContext = runningContexts[runningContexts.length - 2]; + const previousRunningContext = + runningContexts[runningContexts.length - 2]; if (previousRunningContext[name]) { return previousRunningContext[name]; } @@ -181,7 +190,9 @@ class FunctionTracer { origin: 'declaration', inForLoopInit, inForLoopTest: null, - assignable: currentContext === this.currentFunctionContext || (!inForLoopInit && !currentContext.hasOwnProperty(ast.id.name)), + assignable: + currentContext === this.currentFunctionContext || + (!inForLoopInit && !currentContext.hasOwnProperty(ast.id.name)), suggestedType: null, valueType: null, dependencies: null, @@ -305,7 +316,3 @@ class FunctionTracer { } } } - -module.exports = { - FunctionTracer, -}; \ No newline at end of file diff --git a/src/backend/gl/kernel-string.js b/src/backend/gl/kernel-string.js index 75ca4064..9efbd2bc 100644 --- a/src/backend/gl/kernel-string.js +++ b/src/backend/gl/kernel-string.js @@ -1,8 +1,9 @@ -const { glWiretap } = require('gl-wiretap'); -const { utils } = require('../../utils'); +import { glWiretap } from 'gl-wiretap'; +import { utils } from '../../utils'; function toStringWithoutUtils(fn) { - return fn.toString() + return fn + .toString() .replace('=>', '') .replace(/^function /, '') .replace(/utils[.]/g, '/*utils.*/'); @@ -17,32 +18,49 @@ function toStringWithoutUtils(fn) { * @param {string} [destroyContextString] * @returns {string} */ -function glKernelString(Kernel, args, originKernel, setupContextString, destroyContextString) { +export function glKernelString( + Kernel, + args, + originKernel, + setupContextString, + destroyContextString +) { if (!originKernel.built) { originKernel.build.apply(originKernel, args); } - args = args ? Array.from(args).map(arg => { - switch (typeof arg) { - case 'boolean': - return new Boolean(arg); - case 'number': - return new Number(arg); - default: - return arg; - } - }) : null; + args = args + ? Array.from(args).map(arg => { + switch (typeof arg) { + case 'boolean': + return new Boolean(arg); + case 'number': + return new Number(arg); + default: + return arg; + } + }) + : null; const uploadedValues = []; const postResult = []; const context = glWiretap(originKernel.context, { useTrackablePrimitives: true, - onReadPixels: (targetName) => { + onReadPixels: targetName => { if (kernel.subKernels) { if (!subKernelsResultVariableSetup) { - postResult.push(` const result = { result: ${getRenderString(targetName, kernel)} };`); + postResult.push( + ` const result = { result: ${getRenderString( + targetName, + kernel + )} };` + ); subKernelsResultVariableSetup = true; } else { const property = kernel.subKernels[subKernelsResultIndex++].property; - postResult.push(` result${isNaN(property) ? '.' + property : `[${property}]`} = ${getRenderString(targetName, kernel)};`); + postResult.push( + ` result${ + isNaN(property) ? '.' + property : `[${property}]` + } = ${getRenderString(targetName, kernel)};` + ); } if (subKernelsResultIndex === kernel.subKernels.length) { postResult.push(' return result;'); @@ -55,17 +73,29 @@ function glKernelString(Kernel, args, originKernel, setupContextString, destroyC postResult.push(` return null;`); } }, - onUnrecognizedArgumentLookup: (argument) => { - const argumentName = findKernelValue(argument, kernel.kernelArguments, [], context, uploadedValues); + onUnrecognizedArgumentLookup: argument => { + const argumentName = findKernelValue( + argument, + kernel.kernelArguments, + [], + context, + uploadedValues + ); if (argumentName) { return argumentName; } - const constantName = findKernelValue(argument, kernel.kernelConstants, constants ? Object.keys(constants).map(key => constants[key]) : [], context, uploadedValues); + const constantName = findKernelValue( + argument, + kernel.kernelConstants, + constants ? Object.keys(constants).map(key => constants[key]) : [], + context, + uploadedValues + ); if (constantName) { return constantName; } return null; - } + }, }); let subKernelsResultVariableSetup = false; let subKernelsResultIndex = 0; @@ -123,7 +153,7 @@ function glKernelString(Kernel, args, originKernel, setupContextString, destroyC case 'Boolean': case 'Number': case 'Float': - // non-primitives + // non-primitives case 'Array': case 'Array(2)': case 'Array(3)': @@ -131,16 +161,25 @@ function glKernelString(Kernel, args, originKernel, setupContextString, destroyC case 'HTMLCanvas': case 'HTMLImage': case 'HTMLVideo': - context.insertVariable(`uploadValue_${kernelArgument.name}`, kernelArgument.uploadValue); + context.insertVariable( + `uploadValue_${kernelArgument.name}`, + kernelArgument.uploadValue + ); break; case 'HTMLImageArray': for (let imageIndex = 0; imageIndex < args[i].length; imageIndex++) { const arg = args[i]; - context.insertVariable(`uploadValue_${kernelArgument.name}[${imageIndex}]`, arg[imageIndex]); + context.insertVariable( + `uploadValue_${kernelArgument.name}[${imageIndex}]`, + arg[imageIndex] + ); } break; case 'Input': - context.insertVariable(`uploadValue_${kernelArgument.name}`, kernelArgument.uploadValue); + context.insertVariable( + `uploadValue_${kernelArgument.name}`, + kernelArgument.uploadValue + ); break; case 'MemoryOptimizedNumberTexture': case 'NumberTexture': @@ -157,10 +196,15 @@ function glKernelString(Kernel, args, originKernel, setupContextString, destroyC case 'ArrayTexture(2)': case 'ArrayTexture(3)': case 'ArrayTexture(4)': - context.insertVariable(`uploadValue_${kernelArgument.name}`, args[i].texture); + context.insertVariable( + `uploadValue_${kernelArgument.name}`, + args[i].texture + ); break; default: - throw new Error(`unhandled kernelArgumentType insertion for glWiretap of type ${kernelArgument.type}`); + throw new Error( + `unhandled kernelArgumentType insertion for glWiretap of type ${kernelArgument.type}` + ); } }); result.push('/** start of injected functions **/'); @@ -171,11 +215,17 @@ function glKernelString(Kernel, args, originKernel, setupContextString, destroyC result.push(`function ${toStringWithoutUtils(utils.isArray)}`); if (kernel.renderOutput !== kernel.renderTexture && kernel.formatValues) { result.push( - ` const renderOutput = function ${toStringWithoutUtils(kernel.formatValues)};` + ` const renderOutput = function ${toStringWithoutUtils( + kernel.formatValues + )};` ); } result.push('/** end of injected functions **/'); - result.push(` const innerKernel = function (${kernel.kernelArguments.map(kernelArgument => kernelArgument.varName).join(', ')}) {`); + result.push( + ` const innerKernel = function (${kernel.kernelArguments + .map(kernelArgument => kernelArgument.varName) + .join(', ')}) {` + ); context.setIndent(4); kernel.run.apply(kernel, args); if (kernel.renderKernels) { @@ -185,7 +235,10 @@ function glKernelString(Kernel, args, originKernel, setupContextString, destroyC } result.push(' /** start setup uploads for kernel values **/'); kernel.kernelArguments.forEach(kernelArgument => { - result.push(' ' + kernelArgument.getStringValueHandler().split('\n').join('\n ')); + result.push( + ' ' + + kernelArgument.getStringValueHandler().split('\n').join('\n ') + ); }); result.push(' /** end setup uploads for kernel values **/'); result.push(context.toString()); @@ -194,38 +247,54 @@ function glKernelString(Kernel, args, originKernel, setupContextString, destroyC const framebufferName = context.getContextVariableName(kernel.framebuffer); if (kernel.renderKernels) { const results = kernel.renderKernels(); - const textureName = context.getContextVariableName(kernel.texture.texture); + const textureName = context.getContextVariableName( + kernel.texture.texture + ); result.push(` return { result: { - texture: ${ textureName }, - type: '${ results.result.type }', - toArray: ${ getToArrayString(results.result, textureName, framebufferName) } + texture: ${textureName}, + type: '${results.result.type}', + toArray: ${getToArrayString( + results.result, + textureName, + framebufferName + )} },`); const { subKernels, mappedTextures } = kernel; for (let i = 0; i < subKernels.length; i++) { const texture = mappedTextures[i]; const subKernel = subKernels[i]; const subKernelResult = results[subKernel.property]; - const subKernelTextureName = context.getContextVariableName(texture.texture); + const subKernelTextureName = context.getContextVariableName( + texture.texture + ); result.push(` ${subKernel.property}: { - texture: ${ subKernelTextureName }, - type: '${ subKernelResult.type }', - toArray: ${ getToArrayString(subKernelResult, subKernelTextureName, framebufferName) } + texture: ${subKernelTextureName}, + type: '${subKernelResult.type}', + toArray: ${getToArrayString( + subKernelResult, + subKernelTextureName, + framebufferName + )} },`); } result.push(` };`); } else { const rendered = kernel.renderOutput(); - const textureName = context.getContextVariableName(kernel.texture.texture); + const textureName = context.getContextVariableName( + kernel.texture.texture + ); result.push(` return { - texture: ${ textureName }, - type: '${ rendered.type }', - toArray: ${ getToArrayString(rendered, textureName, framebufferName) } + texture: ${textureName}, + type: '${rendered.type}', + toArray: ${getToArrayString(rendered, textureName, framebufferName)} };`); } } - result.push(` ${destroyContextString ? '\n' + destroyContextString + ' ': ''}`); + result.push( + ` ${destroyContextString ? '\n' + destroyContextString + ' ' : ''}` + ); result.push(postResult.join('\n')); result.push(' };'); if (kernel.graphical) { @@ -235,7 +304,7 @@ function glKernelString(Kernel, args, originKernel, setupContextString, destroyC result.push(' return innerKernel;'); let constantsUpload = []; - kernelConstants.forEach((kernelConstant) => { + kernelConstants.forEach(kernelConstant => { constantsUpload.push(`${kernelConstant.getStringValueHandler()}`); }); return `function kernel(settings) { @@ -247,7 +316,10 @@ ${result.join('\n')} } function getRenderString(targetName, kernel) { - const readBackValue = kernel.precision === 'single' ? targetName : `new Float32Array(${targetName}.buffer)`; + const readBackValue = + kernel.precision === 'single' + ? targetName + : `new Float32Array(${targetName}.buffer)`; if (kernel.output[2]) { return `renderOutput(${readBackValue}, ${kernel.output[0]}, ${kernel.output[1]}, ${kernel.output[2]})`; } @@ -261,55 +333,63 @@ function getRenderString(targetName, kernel) { function getGetPixelsString(kernel) { const getPixels = kernel.getPixels.toString(); const useFunctionKeyword = !/^function/.test(getPixels); - return utils.flattenFunctionToString(`${useFunctionKeyword ? 'function ' : ''}${ getPixels }`, { - findDependency: (object, name) => { - if (object === 'utils') { - return `const ${name} = ${utils[name].toString()};`; - } - return null; - }, - thisLookup: (property) => { - if (property === 'context') { + return utils.flattenFunctionToString( + `${useFunctionKeyword ? 'function ' : ''}${getPixels}`, + { + findDependency: (object, name) => { + if (object === 'utils') { + return `const ${name} = ${utils[name].toString()};`; + } return null; - } - if (kernel.hasOwnProperty(property)) { - return JSON.stringify(kernel[property]); - } - throw new Error(`unhandled thisLookup ${ property }`); + }, + thisLookup: property => { + if (property === 'context') { + return null; + } + if (kernel.hasOwnProperty(property)) { + return JSON.stringify(kernel[property]); + } + throw new Error(`unhandled thisLookup ${property}`); + }, } - }); + ); } function getToArrayString(kernelResult, textureName, framebufferName) { const toArray = kernelResult.toArray.toString(); const useFunctionKeyword = !/^function/.test(toArray); - const flattenedFunctions = utils.flattenFunctionToString(`${useFunctionKeyword ? 'function ' : ''}${ toArray }`, { - findDependency: (object, name) => { - if (object === 'utils') { - return `const ${name} = ${utils[name].toString()};`; - } else if (object === 'this') { - if (name === 'framebuffer') { - return ''; + const flattenedFunctions = utils.flattenFunctionToString( + `${useFunctionKeyword ? 'function ' : ''}${toArray}`, + { + findDependency: (object, name) => { + if (object === 'utils') { + return `const ${name} = ${utils[name].toString()};`; + } else if (object === 'this') { + if (name === 'framebuffer') { + return ''; + } + return `${useFunctionKeyword ? 'function ' : ''}${kernelResult[ + name + ].toString()}`; + } else { + throw new Error('unhandled fromObject'); } - return `${useFunctionKeyword ? 'function ' : ''}${kernelResult[name].toString()}`; - } else { - throw new Error('unhandled fromObject'); - } - }, - thisLookup: (property, isDeclaration) => { - if (property === 'texture') { - return textureName; - } - if (property === 'context') { - if (isDeclaration) return null; - return 'gl'; - } - if (kernelResult.hasOwnProperty(property)) { - return JSON.stringify(kernelResult[property]); - } - throw new Error(`unhandled thisLookup ${ property }`); + }, + thisLookup: (property, isDeclaration) => { + if (property === 'texture') { + return textureName; + } + if (property === 'context') { + if (isDeclaration) return null; + return 'gl'; + } + if (kernelResult.hasOwnProperty(property)) { + return JSON.stringify(kernelResult[property]); + } + throw new Error(`unhandled thisLookup ${property}`); + }, } - }); + ); return `() => { function framebuffer() { return ${framebufferName}; }; ${flattenedFunctions} @@ -326,7 +406,13 @@ function getToArrayString(kernelResult, textureName, framebufferName) { * @param {KernelVariable[]} uploadedValues * @return {string|null} */ -function findKernelValue(argument, kernelValues, values, context, uploadedValues) { +function findKernelValue( + argument, + kernelValues, + values, + context, + uploadedValues +) { if (argument === null) return null; if (kernelValues === null) return null; switch (typeof argument) { @@ -360,7 +446,3 @@ function findKernelValue(argument, kernelValues, values, context, uploadedValues } return null; } - -module.exports = { - glKernelString -}; \ No newline at end of file diff --git a/src/backend/gl/kernel.js b/src/backend/gl/kernel.js index 29948449..5864298e 100644 --- a/src/backend/gl/kernel.js +++ b/src/backend/gl/kernel.js @@ -1,30 +1,30 @@ -const { Kernel } = require('../kernel'); -const { utils } = require('../../utils'); -const { GLTextureArray2Float } = require('./texture/array-2-float'); -const { GLTextureArray2Float2D } = require('./texture/array-2-float-2d'); -const { GLTextureArray2Float3D } = require('./texture/array-2-float-3d'); -const { GLTextureArray3Float } = require('./texture/array-3-float'); -const { GLTextureArray3Float2D } = require('./texture/array-3-float-2d'); -const { GLTextureArray3Float3D } = require('./texture/array-3-float-3d'); -const { GLTextureArray4Float } = require('./texture/array-4-float'); -const { GLTextureArray4Float2D } = require('./texture/array-4-float-2d'); -const { GLTextureArray4Float3D } = require('./texture/array-4-float-3d'); -const { GLTextureFloat } = require('./texture/float'); -const { GLTextureFloat2D } = require('./texture/float-2d'); -const { GLTextureFloat3D } = require('./texture/float-3d'); -const { GLTextureMemoryOptimized } = require('./texture/memory-optimized'); -const { GLTextureMemoryOptimized2D } = require('./texture/memory-optimized-2d'); -const { GLTextureMemoryOptimized3D } = require('./texture/memory-optimized-3d'); -const { GLTextureUnsigned } = require('./texture/unsigned'); -const { GLTextureUnsigned2D } = require('./texture/unsigned-2d'); -const { GLTextureUnsigned3D } = require('./texture/unsigned-3d'); -const { GLTextureGraphical } = require('./texture/graphical'); +import { Kernel } from '../kernel'; +import { utils } from '../../utils'; +import { GLTextureArray2Float } from './texture/array-2-float'; +import { GLTextureArray2Float2D } from './texture/array-2-float-2d'; +import { GLTextureArray2Float3D } from './texture/array-2-float-3d'; +import { GLTextureArray3Float } from './texture/array-3-float'; +import { GLTextureArray3Float2D } from './texture/array-3-float-2d'; +import { GLTextureArray3Float3D } from './texture/array-3-float-3d'; +import { GLTextureArray4Float } from './texture/array-4-float'; +import { GLTextureArray4Float2D } from './texture/array-4-float-2d'; +import { GLTextureArray4Float3D } from './texture/array-4-float-3d'; +import { GLTextureFloat } from './texture/float'; +import { GLTextureFloat2D } from './texture/float-2d'; +import { GLTextureFloat3D } from './texture/float-3d'; +import { GLTextureMemoryOptimized } from './texture/memory-optimized'; +import { GLTextureMemoryOptimized2D } from './texture/memory-optimized-2d'; +import { GLTextureMemoryOptimized3D } from './texture/memory-optimized-3d'; +import { GLTextureUnsigned } from './texture/unsigned'; +import { GLTextureUnsigned2D } from './texture/unsigned-2d'; +import { GLTextureUnsigned3D } from './texture/unsigned-3d'; +import { GLTextureGraphical } from './texture/graphical'; /** * @abstract * @extends Kernel */ -class GLKernel extends Kernel { +export class GLKernel extends Kernel { static get mode() { return 'gpu'; } @@ -64,7 +64,7 @@ class GLKernel extends Kernel { }); const args = [ [6, 6030401], - [3, 3991] + [3, 3991], ]; kernel.build.apply(kernel, args); kernel.run.apply(kernel, args); @@ -88,28 +88,31 @@ class GLKernel extends Kernel { precision: 'unsigned', tactic: 'speed', }); - const args = [ - [0, 1, 2, 3] - ]; + const args = [[0, 1, 2, 3]]; kernel.build.apply(kernel, args); kernel.run.apply(kernel, args); const result = kernel.renderOutput(); kernel.destroy(true); - return Math.round(result[0]) === 0 && Math.round(result[1]) === 1 && Math.round(result[2]) === 2 && Math.round(result[3]) === 3; + return ( + Math.round(result[0]) === 0 && + Math.round(result[1]) === 1 && + Math.round(result[2]) === 2 && + Math.round(result[3]) === 3 + ); } /** * @abstract */ static get testCanvas() { - throw new Error(`"testCanvas" not defined on ${ this.name }`); + throw new Error(`"testCanvas" not defined on ${this.name}`); } /** * @abstract */ static get testContext() { - throw new Error(`"testContext" not defined on ${ this.name }`); + throw new Error(`"testContext" not defined on ${this.name}`); } static getFeatures() { @@ -124,12 +127,30 @@ class GLKernel extends Kernel { kernelMap: isDrawBuffers, channelCount: this.getChannelCount(), maxTextureSize: this.getMaxTextureSize(), - lowIntPrecision: gl.getShaderPrecisionFormat(gl.FRAGMENT_SHADER, gl.LOW_INT), - lowFloatPrecision: gl.getShaderPrecisionFormat(gl.FRAGMENT_SHADER, gl.LOW_FLOAT), - mediumIntPrecision: gl.getShaderPrecisionFormat(gl.FRAGMENT_SHADER, gl.MEDIUM_INT), - mediumFloatPrecision: gl.getShaderPrecisionFormat(gl.FRAGMENT_SHADER, gl.MEDIUM_FLOAT), - highIntPrecision: gl.getShaderPrecisionFormat(gl.FRAGMENT_SHADER, gl.HIGH_INT), - highFloatPrecision: gl.getShaderPrecisionFormat(gl.FRAGMENT_SHADER, gl.HIGH_FLOAT), + lowIntPrecision: gl.getShaderPrecisionFormat( + gl.FRAGMENT_SHADER, + gl.LOW_INT + ), + lowFloatPrecision: gl.getShaderPrecisionFormat( + gl.FRAGMENT_SHADER, + gl.LOW_FLOAT + ), + mediumIntPrecision: gl.getShaderPrecisionFormat( + gl.FRAGMENT_SHADER, + gl.MEDIUM_INT + ), + mediumFloatPrecision: gl.getShaderPrecisionFormat( + gl.FRAGMENT_SHADER, + gl.MEDIUM_FLOAT + ), + highIntPrecision: gl.getShaderPrecisionFormat( + gl.FRAGMENT_SHADER, + gl.HIGH_INT + ), + highFloatPrecision: gl.getShaderPrecisionFormat( + gl.FRAGMENT_SHADER, + gl.HIGH_FLOAT + ), }); } @@ -137,11 +158,14 @@ class GLKernel extends Kernel { * @abstract */ static setupFeatureChecks() { - throw new Error(`"setupFeatureChecks" not defined on ${ this.name }`); + throw new Error(`"setupFeatureChecks" not defined on ${this.name}`); } static getSignature(kernel, argumentTypes) { - return kernel.getVariablePrecisionString() + (argumentTypes.length > 0 ? ':' + argumentTypes.join(',') : ''); + return ( + kernel.getVariablePrecisionString() + + (argumentTypes.length > 0 ? ':' + argumentTypes.join(',') : '') + ); } /** @@ -168,7 +192,11 @@ class GLKernel extends Kernel { * @deprecated */ setFloatTextures(flag) { - utils.warnDeprecated('method', 'setFloatTextures', 'setOptimizeFloatMemory'); + utils.warnDeprecated( + 'method', + 'setFloatTextures', + 'setOptimizeFloatMemory' + ); this.floatTextures = flag; return this; } @@ -197,7 +225,11 @@ class GLKernel extends Kernel { states.push('MULTI_LINE_COMMENT'); i += 2; continue; - } else if (state === 'MULTI_LINE_COMMENT' && char === '*' && nextChar === '/') { + } else if ( + state === 'MULTI_LINE_COMMENT' && + char === '*' && + nextChar === '/' + ) { states.pop(); i += 2; continue; @@ -205,7 +237,11 @@ class GLKernel extends Kernel { // end MULTI_LINE_COMMENT handling // begin COMMENT handling - else if (state === 'FUNCTION_ARGUMENTS' && char === '/' && nextChar === '/') { + else if ( + state === 'FUNCTION_ARGUMENTS' && + char === '/' && + nextChar === '/' + ) { states.push('COMMENT'); i += 2; continue; @@ -226,31 +262,61 @@ class GLKernel extends Kernel { states.pop(); break; } - if (char === 'f' && nextChar === 'l' && source[i + 2] === 'o' && source[i + 3] === 'a' && source[i + 4] === 't' && source[i + 5] === ' ') { + if ( + char === 'f' && + nextChar === 'l' && + source[i + 2] === 'o' && + source[i + 3] === 'a' && + source[i + 4] === 't' && + source[i + 5] === ' ' + ) { states.push('DECLARE_VARIABLE'); argumentType = 'float'; argumentName = ''; i += 6; continue; - } else if (char === 'i' && nextChar === 'n' && source[i + 2] === 't' && source[i + 3] === ' ') { + } else if ( + char === 'i' && + nextChar === 'n' && + source[i + 2] === 't' && + source[i + 3] === ' ' + ) { states.push('DECLARE_VARIABLE'); argumentType = 'int'; argumentName = ''; i += 4; continue; - } else if (char === 'v' && nextChar === 'e' && source[i + 2] === 'c' && source[i + 3] === '2' && source[i + 4] === ' ') { + } else if ( + char === 'v' && + nextChar === 'e' && + source[i + 2] === 'c' && + source[i + 3] === '2' && + source[i + 4] === ' ' + ) { states.push('DECLARE_VARIABLE'); argumentType = 'vec2'; argumentName = ''; i += 5; continue; - } else if (char === 'v' && nextChar === 'e' && source[i + 2] === 'c' && source[i + 3] === '3' && source[i + 4] === ' ') { + } else if ( + char === 'v' && + nextChar === 'e' && + source[i + 2] === 'c' && + source[i + 3] === '3' && + source[i + 4] === ' ' + ) { states.push('DECLARE_VARIABLE'); argumentType = 'vec3'; argumentName = ''; i += 5; continue; - } else if (char === 'v' && nextChar === 'e' && source[i + 2] === 'c' && source[i + 3] === '4' && source[i + 4] === ' ') { + } else if ( + char === 'v' && + nextChar === 'e' && + source[i + 2] === 'c' && + source[i + 3] === '4' && + source[i + 4] === ' ' + ) { states.push('DECLARE_VARIABLE'); argumentType = 'vec4'; argumentName = ''; @@ -298,11 +364,7 @@ class GLKernel extends Kernel { static combineKernels(combinedKernel, lastKernel) { combinedKernel.apply(null, arguments); - const { - texSize, - context, - threadDim - } = lastKernel.texSize; + const { texSize, context, threadDim } = lastKernel.texSize; let result; if (lastKernel.precision === 'single') { const w = texSize[0]; @@ -311,7 +373,15 @@ class GLKernel extends Kernel { context.readPixels(0, 0, w, h * 4, context.RGBA, context.FLOAT, result); } else { const bytes = new Uint8Array(texSize[0] * texSize[1] * 4); - context.readPixels(0, 0, texSize[0], texSize[1], context.RGBA, context.UNSIGNED_BYTE, bytes); + context.readPixels( + 0, + 0, + texSize[0], + texSize[1], + context.RGBA, + context.UNSIGNED_BYTE, + bytes + ); result = new Float32Array(bytes.buffer); } @@ -322,8 +392,11 @@ class GLKernel extends Kernel { } else if (lastKernel.output.length === 2) { return utils.splitArray(result, lastKernel.output[0]); } else if (lastKernel.output.length === 3) { - const cube = utils.splitArray(result, lastKernel.output[0] * lastKernel.output[1]); - return cube.map(function(x) { + const cube = utils.splitArray( + result, + lastKernel.output[0] * lastKernel.output[1] + ); + return cube.map(function (x) { return utils.splitArray(x, lastKernel.output[0]); }); } @@ -351,13 +424,20 @@ class GLKernel extends Kernel { checkTextureSize() { const { features } = this.constructor; - if (this.texSize[0] > features.maxTextureSize || this.texSize[1] > features.maxTextureSize) { - throw new Error(`Texture size [${this.texSize[0]},${this.texSize[1]}] generated by kernel is larger than supported size [${features.maxTextureSize},${features.maxTextureSize}]`); + if ( + this.texSize[0] > features.maxTextureSize || + this.texSize[1] > features.maxTextureSize + ) { + throw new Error( + `Texture size [${this.texSize[0]},${this.texSize[1]}] generated by kernel is larger than supported size [${features.maxTextureSize},${features.maxTextureSize}]` + ); } } translateSource() { - throw new Error(`"translateSource" not defined on ${this.constructor.name}`); + throw new Error( + `"translateSource" not defined on ${this.constructor.name}` + ); } /** @@ -368,7 +448,7 @@ class GLKernel extends Kernel { pickRenderStrategy(args) { if (this.graphical) { this.renderRawOutput = this.readPackedPixelsToUint8Array; - this.transferValues = (pixels) => pixels; + this.transferValues = pixels => pixels; this.TextureConstructor = GLTextureGraphical; return null; } @@ -395,10 +475,10 @@ class GLKernel extends Kernel { this.TextureConstructor = GLTextureUnsigned; return null; } - case 'Array(2)': - case 'Array(3)': - case 'Array(4)': - return this.requestFallback(args); + case 'Array(2)': + case 'Array(3)': + case 'Array(4)': + return this.requestFallback(args); } } else { if (this.subKernels !== null) { @@ -423,10 +503,10 @@ class GLKernel extends Kernel { this.formatValues = utils.erectPackedFloat; return null; } - case 'Array(2)': - case 'Array(3)': - case 'Array(4)': - return this.requestFallback(args); + case 'Array(2)': + case 'Array(3)': + case 'Array(4)': + return this.requestFallback(args); } } } else if (this.precision === 'single') { @@ -670,7 +750,7 @@ class GLKernel extends Kernel { case 'Array(4)': return this.getMainResultArray4Texture(); default: - throw new Error(`unhandled returnType type ${ this.returnType }`); + throw new Error(`unhandled returnType type ${this.returnType}`); } } @@ -766,23 +846,31 @@ class GLKernel extends Kernel { } getMainResultNumberTexture() { - return utils.linesToString(this.getMainResultKernelNumberTexture()) + - utils.linesToString(this.getMainResultSubKernelNumberTexture()); + return ( + utils.linesToString(this.getMainResultKernelNumberTexture()) + + utils.linesToString(this.getMainResultSubKernelNumberTexture()) + ); } getMainResultArray2Texture() { - return utils.linesToString(this.getMainResultKernelArray2Texture()) + - utils.linesToString(this.getMainResultSubKernelArray2Texture()); + return ( + utils.linesToString(this.getMainResultKernelArray2Texture()) + + utils.linesToString(this.getMainResultSubKernelArray2Texture()) + ); } getMainResultArray3Texture() { - return utils.linesToString(this.getMainResultKernelArray3Texture()) + - utils.linesToString(this.getMainResultSubKernelArray3Texture()); + return ( + utils.linesToString(this.getMainResultKernelArray3Texture()) + + utils.linesToString(this.getMainResultSubKernelArray3Texture()) + ); } getMainResultArray4Texture() { - return utils.linesToString(this.getMainResultKernelArray4Texture()) + - utils.linesToString(this.getMainResultSubKernelArray4Texture()); + return ( + utils.linesToString(this.getMainResultKernelArray4Texture()) + + utils.linesToString(this.getMainResultSubKernelArray4Texture()) + ); } /** @@ -790,7 +878,10 @@ class GLKernel extends Kernel { * @return {string} */ getFloatTacticDeclaration() { - const variablePrecision = this.getVariablePrecisionString(this.texSize, this.tactic); + const variablePrecision = this.getVariablePrecisionString( + this.texSize, + this.tactic + ); return `precision ${variablePrecision} float;\n`; } @@ -799,7 +890,11 @@ class GLKernel extends Kernel { * @return {string} */ getIntTacticDeclaration() { - return `precision ${this.getVariablePrecisionString(this.texSize, this.tactic, true)} int;\n`; + return `precision ${this.getVariablePrecisionString( + this.texSize, + this.tactic, + true + )} int;\n`; } /** @@ -807,24 +902,36 @@ class GLKernel extends Kernel { * @return {string} */ getSampler2DTacticDeclaration() { - return `precision ${this.getVariablePrecisionString(this.texSize, this.tactic)} sampler2D;\n`; + return `precision ${this.getVariablePrecisionString( + this.texSize, + this.tactic + )} sampler2D;\n`; } getSampler2DArrayTacticDeclaration() { - return `precision ${this.getVariablePrecisionString(this.texSize, this.tactic)} sampler2DArray;\n`; + return `precision ${this.getVariablePrecisionString( + this.texSize, + this.tactic + )} sampler2DArray;\n`; } renderTexture() { return this.immutable ? this.texture.clone() : this.texture; } readPackedPixelsToUint8Array() { - if (this.precision !== 'unsigned') throw new Error('Requires this.precision to be "unsigned"'); - const { - texSize, - context: gl - } = this; + if (this.precision !== 'unsigned') + throw new Error('Requires this.precision to be "unsigned"'); + const { texSize, context: gl } = this; const result = new Uint8Array(texSize[0] * texSize[1] * 4); - gl.readPixels(0, 0, texSize[0], texSize[1], gl.RGBA, gl.UNSIGNED_BYTE, result); + gl.readPixels( + 0, + 0, + texSize[0], + texSize[1], + gl.RGBA, + gl.UNSIGNED_BYTE, + result + ); return result; } @@ -833,11 +940,9 @@ class GLKernel extends Kernel { } readFloatPixelsToFloat32Array() { - if (this.precision !== 'single') throw new Error('Requires this.precision to be "single"'); - const { - texSize, - context: gl - } = this; + if (this.precision !== 'single') + throw new Error('Requires this.precision to be "single"'); + const { texSize, context: gl } = this; const w = texSize[0]; const h = texSize[1]; const result = new Float32Array(w * h * 4); @@ -851,15 +956,14 @@ class GLKernel extends Kernel { * @return {Uint8ClampedArray} */ getPixels(flip) { - const { - context: gl, - output - } = this; + const { context: gl, output } = this; const [width, height] = output; const pixels = new Uint8Array(width * height * 4); gl.readPixels(0, 0, width, height, gl.RGBA, gl.UNSIGNED_BYTE, pixels); // flipped by default, so invert - return new Uint8ClampedArray((flip ? pixels : utils.flipPixels(pixels, width, height)).buffer); + return new Uint8ClampedArray( + (flip ? pixels : utils.flipPixels(pixels, width, height)).buffer + ); } renderKernelsToArrays() { @@ -898,25 +1002,42 @@ class GLKernel extends Kernel { const newOutput = this.toKernelOutput(output); if (this.program) { if (!this.dynamicOutput) { - throw new Error('Resizing a kernel with dynamicOutput: false is not possible'); + throw new Error( + 'Resizing a kernel with dynamicOutput: false is not possible' + ); } - const newThreadDim = [newOutput[0], newOutput[1] || 1, newOutput[2] || 1]; - const newTexSize = utils.getKernelTextureSize({ - optimizeFloatMemory: this.optimizeFloatMemory, - precision: this.precision, - }, newThreadDim); + const newThreadDim = [ + newOutput[0], + newOutput[1] || 1, + newOutput[2] || 1, + ]; + const newTexSize = utils.getKernelTextureSize( + { + optimizeFloatMemory: this.optimizeFloatMemory, + precision: this.precision, + }, + newThreadDim + ); const oldTexSize = this.texSize; if (oldTexSize) { - const oldPrecision = this.getVariablePrecisionString(oldTexSize, this.tactic); - const newPrecision = this.getVariablePrecisionString(newTexSize, this.tactic); + const oldPrecision = this.getVariablePrecisionString( + oldTexSize, + this.tactic + ); + const newPrecision = this.getVariablePrecisionString( + newTexSize, + this.tactic + ); if (oldPrecision !== newPrecision) { if (this.debug) { - console.warn('Precision requirement changed, asking GPU instance to recompile'); + console.warn( + 'Precision requirement changed, asking GPU instance to recompile' + ); } this.switchKernels({ type: 'outputPrecisionMismatch', precision: newPrecision, - needed: output + needed: output, }); return; } @@ -964,12 +1085,25 @@ class GLKernel extends Kernel { this.switchingKernels = [reason]; } } - getVariablePrecisionString(textureSize = this.texSize, tactic = this.tactic, isInt = false) { + getVariablePrecisionString( + textureSize = this.texSize, + tactic = this.tactic, + isInt = false + ) { if (!tactic) { if (!this.constructor.features.isSpeedTacticSupported) return 'highp'; - const low = this.constructor.features[isInt ? 'lowIntPrecision' : 'lowFloatPrecision']; - const medium = this.constructor.features[isInt ? 'mediumIntPrecision' : 'mediumFloatPrecision']; - const high = this.constructor.features[isInt ? 'highIntPrecision' : 'highFloatPrecision']; + const low = + this.constructor.features[ + isInt ? 'lowIntPrecision' : 'lowFloatPrecision' + ]; + const medium = + this.constructor.features[ + isInt ? 'mediumIntPrecision' : 'mediumFloatPrecision' + ]; + const high = + this.constructor.features[ + isInt ? 'highIntPrecision' : 'highFloatPrecision' + ]; const requiredSize = Math.log2(textureSize[0] * textureSize[1]); if (requiredSize <= low.rangeMax) { return 'lowp'; @@ -978,7 +1112,9 @@ class GLKernel extends Kernel { } else if (requiredSize <= high.rangeMax) { return 'highp'; } else { - throw new Error(`The required size exceeds that of the ability of your system`); + throw new Error( + `The required size exceeds that of the ability of your system` + ); } } switch (tactic) { @@ -989,7 +1125,9 @@ class GLKernel extends Kernel { case 'precision': return 'highp'; default: - throw new Error(`Unknown tactic "${tactic}" use "speed", "balanced", "precision", or empty for auto`); + throw new Error( + `Unknown tactic "${tactic}" use "speed", "balanced", "precision", or empty for auto` + ); } } @@ -1053,7 +1191,3 @@ const typeMap = { vec3: 'Array(3)', vec4: 'Array(4)', }; - -module.exports = { - GLKernel -}; \ No newline at end of file diff --git a/src/backend/gl/texture/array-2-float-2d.js b/src/backend/gl/texture/array-2-float-2d.js index a0e7defd..663293d2 100644 --- a/src/backend/gl/texture/array-2-float-2d.js +++ b/src/backend/gl/texture/array-2-float-2d.js @@ -1,16 +1,16 @@ -const { utils } = require('../../../utils'); -const { GLTextureFloat } = require('./float'); +import { utils } from '../../../utils'; +import { GLTextureFloat } from './float'; -class GLTextureArray2Float2D extends GLTextureFloat { +export class GLTextureArray2Float2D extends GLTextureFloat { constructor(settings) { super(settings); this.type = 'ArrayTexture(2)'; } toArray() { - return utils.erect2DArray2(this.renderValues(), this.output[0], this.output[1]); + return utils.erect2DArray2( + this.renderValues(), + this.output[0], + this.output[1] + ); } } - -module.exports = { - GLTextureArray2Float2D -}; \ No newline at end of file diff --git a/src/backend/gl/texture/array-2-float-3d.js b/src/backend/gl/texture/array-2-float-3d.js index 28f5b092..197d5ae7 100644 --- a/src/backend/gl/texture/array-2-float-3d.js +++ b/src/backend/gl/texture/array-2-float-3d.js @@ -1,16 +1,17 @@ -const { utils } = require('../../../utils'); -const { GLTextureFloat } = require('./float'); +import { utils } from '../../../utils'; +import { GLTextureFloat } from './float'; -class GLTextureArray2Float3D extends GLTextureFloat { +export class GLTextureArray2Float3D extends GLTextureFloat { constructor(settings) { super(settings); this.type = 'ArrayTexture(2)'; } toArray() { - return utils.erect3DArray2(this.renderValues(), this.output[0], this.output[1], this.output[2]); + return utils.erect3DArray2( + this.renderValues(), + this.output[0], + this.output[1], + this.output[2] + ); } } - -module.exports = { - GLTextureArray2Float3D -}; \ No newline at end of file diff --git a/src/backend/gl/texture/array-2-float.js b/src/backend/gl/texture/array-2-float.js index fab1a2ae..6af8b537 100644 --- a/src/backend/gl/texture/array-2-float.js +++ b/src/backend/gl/texture/array-2-float.js @@ -1,16 +1,16 @@ -const { utils } = require('../../../utils'); -const { GLTextureFloat } = require('./float'); +import { utils } from '../../../utils'; +import { GLTextureFloat } from './float'; -class GLTextureArray2Float extends GLTextureFloat { +export class GLTextureArray2Float extends GLTextureFloat { constructor(settings) { super(settings); this.type = 'ArrayTexture(2)'; } toArray() { - return utils.erectArray2(this.renderValues(), this.output[0], this.output[1]); + return utils.erectArray2( + this.renderValues(), + this.output[0], + this.output[1] + ); } } - -module.exports = { - GLTextureArray2Float -}; \ No newline at end of file diff --git a/src/backend/gl/texture/array-3-float-2d.js b/src/backend/gl/texture/array-3-float-2d.js index 4f615879..af2f4c12 100644 --- a/src/backend/gl/texture/array-3-float-2d.js +++ b/src/backend/gl/texture/array-3-float-2d.js @@ -1,16 +1,16 @@ -const { utils } = require('../../../utils'); -const { GLTextureFloat } = require('./float'); +import { utils } from '../../../utils'; +import { GLTextureFloat } from './float'; -class GLTextureArray3Float2D extends GLTextureFloat { +export class GLTextureArray3Float2D extends GLTextureFloat { constructor(settings) { super(settings); this.type = 'ArrayTexture(3)'; } toArray() { - return utils.erect2DArray3(this.renderValues(), this.output[0], this.output[1]); + return utils.erect2DArray3( + this.renderValues(), + this.output[0], + this.output[1] + ); } } - -module.exports = { - GLTextureArray3Float2D -}; \ No newline at end of file diff --git a/src/backend/gl/texture/array-3-float-3d.js b/src/backend/gl/texture/array-3-float-3d.js index ea53aee0..b359f993 100644 --- a/src/backend/gl/texture/array-3-float-3d.js +++ b/src/backend/gl/texture/array-3-float-3d.js @@ -1,16 +1,17 @@ -const { utils } = require('../../../utils'); -const { GLTextureFloat } = require('./float'); +import { utils } from '../../../utils'; +import { GLTextureFloat } from './float'; -class GLTextureArray3Float3D extends GLTextureFloat { +export class GLTextureArray3Float3D extends GLTextureFloat { constructor(settings) { super(settings); this.type = 'ArrayTexture(3)'; } toArray() { - return utils.erect3DArray3(this.renderValues(), this.output[0], this.output[1], this.output[2]); + return utils.erect3DArray3( + this.renderValues(), + this.output[0], + this.output[1], + this.output[2] + ); } } - -module.exports = { - GLTextureArray3Float3D -}; \ No newline at end of file diff --git a/src/backend/gl/texture/array-3-float.js b/src/backend/gl/texture/array-3-float.js index 5f99396b..01fe4fe0 100644 --- a/src/backend/gl/texture/array-3-float.js +++ b/src/backend/gl/texture/array-3-float.js @@ -1,7 +1,7 @@ -const { utils } = require('../../../utils'); -const { GLTextureFloat } = require('./float'); +import { utils } from '../../../utils'; +import { GLTextureFloat } from './float'; -class GLTextureArray3Float extends GLTextureFloat { +export class GLTextureArray3Float extends GLTextureFloat { constructor(settings) { super(settings); this.type = 'ArrayTexture(3)'; @@ -10,7 +10,3 @@ class GLTextureArray3Float extends GLTextureFloat { return utils.erectArray3(this.renderValues(), this.output[0]); } } - -module.exports = { - GLTextureArray3Float -}; \ No newline at end of file diff --git a/src/backend/gl/texture/array-4-float-2d.js b/src/backend/gl/texture/array-4-float-2d.js index a370eaa2..3510c427 100644 --- a/src/backend/gl/texture/array-4-float-2d.js +++ b/src/backend/gl/texture/array-4-float-2d.js @@ -1,16 +1,16 @@ -const { utils } = require('../../../utils'); -const { GLTextureFloat } = require('./float'); +import { utils } from '../../../utils'; +import { GLTextureFloat } from './float'; -class GLTextureArray4Float2D extends GLTextureFloat { +export class GLTextureArray4Float2D extends GLTextureFloat { constructor(settings) { super(settings); this.type = 'ArrayTexture(4)'; } toArray() { - return utils.erect2DArray4(this.renderValues(), this.output[0], this.output[1]); + return utils.erect2DArray4( + this.renderValues(), + this.output[0], + this.output[1] + ); } } - -module.exports = { - GLTextureArray4Float2D -}; \ No newline at end of file diff --git a/src/backend/gl/texture/array-4-float-3d.js b/src/backend/gl/texture/array-4-float-3d.js index 21e09249..51095734 100644 --- a/src/backend/gl/texture/array-4-float-3d.js +++ b/src/backend/gl/texture/array-4-float-3d.js @@ -1,16 +1,17 @@ -const { utils } = require('../../../utils'); -const { GLTextureFloat } = require('./float'); +import { utils } from '../../../utils'; +import { GLTextureFloat } from './float'; -class GLTextureArray4Float3D extends GLTextureFloat { +export class GLTextureArray4Float3D extends GLTextureFloat { constructor(settings) { super(settings); this.type = 'ArrayTexture(4)'; } toArray() { - return utils.erect3DArray4(this.renderValues(), this.output[0], this.output[1], this.output[2]); + return utils.erect3DArray4( + this.renderValues(), + this.output[0], + this.output[1], + this.output[2] + ); } } - -module.exports = { - GLTextureArray4Float3D -}; \ No newline at end of file diff --git a/src/backend/gl/texture/array-4-float.js b/src/backend/gl/texture/array-4-float.js index 80553d15..443ea12d 100644 --- a/src/backend/gl/texture/array-4-float.js +++ b/src/backend/gl/texture/array-4-float.js @@ -1,7 +1,7 @@ -const { utils } = require('../../../utils'); -const { GLTextureFloat } = require('./float'); +import { utils } from '../../../utils'; +import { GLTextureFloat } from './float'; -class GLTextureArray4Float extends GLTextureFloat { +export class GLTextureArray4Float extends GLTextureFloat { constructor(settings) { super(settings); this.type = 'ArrayTexture(4)'; @@ -10,7 +10,3 @@ class GLTextureArray4Float extends GLTextureFloat { return utils.erectArray4(this.renderValues(), this.output[0]); } } - -module.exports = { - GLTextureArray4Float -}; \ No newline at end of file diff --git a/src/backend/gl/texture/float-2d.js b/src/backend/gl/texture/float-2d.js index 1fb927e9..21f78f62 100644 --- a/src/backend/gl/texture/float-2d.js +++ b/src/backend/gl/texture/float-2d.js @@ -1,16 +1,16 @@ -const { utils } = require('../../../utils'); -const { GLTextureFloat } = require('./float'); +import { utils } from '../../../utils'; +import { GLTextureFloat } from './float'; -class GLTextureFloat2D extends GLTextureFloat { +export class GLTextureFloat2D extends GLTextureFloat { constructor(settings) { super(settings); this.type = 'ArrayTexture(1)'; } toArray() { - return utils.erect2DFloat(this.renderValues(), this.output[0], this.output[1]); + return utils.erect2DFloat( + this.renderValues(), + this.output[0], + this.output[1] + ); } } - -module.exports = { - GLTextureFloat2D -}; \ No newline at end of file diff --git a/src/backend/gl/texture/float-3d.js b/src/backend/gl/texture/float-3d.js index 9a8a536f..77e173b5 100644 --- a/src/backend/gl/texture/float-3d.js +++ b/src/backend/gl/texture/float-3d.js @@ -1,16 +1,17 @@ -const { utils } = require('../../../utils'); -const { GLTextureFloat } = require('./float'); +import { utils } from '../../../utils'; +import { GLTextureFloat } from './float'; -class GLTextureFloat3D extends GLTextureFloat { +export class GLTextureFloat3D extends GLTextureFloat { constructor(settings) { super(settings); this.type = 'ArrayTexture(1)'; } toArray() { - return utils.erect3DFloat(this.renderValues(), this.output[0], this.output[1], this.output[2]); + return utils.erect3DFloat( + this.renderValues(), + this.output[0], + this.output[1], + this.output[2] + ); } } - -module.exports = { - GLTextureFloat3D -}; \ No newline at end of file diff --git a/src/backend/gl/texture/float.js b/src/backend/gl/texture/float.js index 21d3748f..2dfe91d6 100644 --- a/src/backend/gl/texture/float.js +++ b/src/backend/gl/texture/float.js @@ -1,7 +1,7 @@ -const { utils } = require('../../../utils'); -const { GLTexture } = require('./index'); +import { utils } from '../../../utils'; +import { GLTexture } from './index'; -class GLTextureFloat extends GLTexture { +export class GLTextureFloat extends GLTexture { get textureType() { return this.context.FLOAT; } @@ -32,7 +32,3 @@ class GLTextureFloat extends GLTexture { return utils.erectFloat(this.renderValues(), this.output[0]); } } - -module.exports = { - GLTextureFloat -}; \ No newline at end of file diff --git a/src/backend/gl/texture/graphical.js b/src/backend/gl/texture/graphical.js index 18360021..b49ec466 100644 --- a/src/backend/gl/texture/graphical.js +++ b/src/backend/gl/texture/graphical.js @@ -1,6 +1,6 @@ -const { GLTextureUnsigned } = require('./unsigned'); +import { GLTextureUnsigned } from './unsigned'; -class GLTextureGraphical extends GLTextureUnsigned { +export class GLTextureGraphical extends GLTextureUnsigned { constructor(settings) { super(settings); this.type = 'ArrayTexture(4)'; @@ -9,7 +9,3 @@ class GLTextureGraphical extends GLTextureUnsigned { return this.renderValues(); } } - -module.exports = { - GLTextureGraphical -}; \ No newline at end of file diff --git a/src/backend/gl/texture/index.js b/src/backend/gl/texture/index.js index d5cac523..4214d2e2 100644 --- a/src/backend/gl/texture/index.js +++ b/src/backend/gl/texture/index.js @@ -1,17 +1,17 @@ -const { Texture } = require('../../../texture'); +import { Texture } from '../../../texture'; /** * @class * @property framebuffer * @extends Texture */ -class GLTexture extends Texture { +export class GLTexture extends Texture { /** * @returns {Number} * @abstract */ get textureType() { - throw new Error(`"textureType" not implemented on ${ this.name }`); + throw new Error(`"textureType" not implemented on ${this.name}`); } clone() { @@ -40,10 +40,26 @@ class GLTexture extends Texture { } gl.bindFramebuffer(gl.FRAMEBUFFER, this.framebuffer()); selectTexture(gl, texture); - gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, texture, 0); + gl.framebufferTexture2D( + gl.FRAMEBUFFER, + gl.COLOR_ATTACHMENT0, + gl.TEXTURE_2D, + texture, + 0 + ); const target = gl.createTexture(); selectTexture(gl, target); - gl.texImage2D(gl.TEXTURE_2D, 0, this.internalFormat, size[0], size[1], 0, this.textureFormat, this.textureType, null); + gl.texImage2D( + gl.TEXTURE_2D, + 0, + this.internalFormat, + size[0], + size[1], + 0, + this.textureFormat, + this.textureType, + null + ); gl.copyTexSubImage2D(gl.TEXTURE_2D, 0, 0, 0, 0, 0, size[0], size[1]); target._refs = 1; this.texture = target; @@ -62,7 +78,17 @@ class GLTexture extends Texture { } const target = gl.createTexture(); selectTexture(gl, target); - gl.texImage2D(gl.TEXTURE_2D, 0, this.internalFormat, size[0], size[1], 0, this.textureFormat, this.textureType, null); + gl.texImage2D( + gl.TEXTURE_2D, + 0, + this.internalFormat, + size[0], + size[1], + 0, + this.textureFormat, + this.textureType, + null + ); target._refs = 1; this.texture = target; } @@ -71,17 +97,33 @@ class GLTexture extends Texture { if (this.texture._refs) { this.texture._refs--; const gl = this.context; - const target = this.texture = gl.createTexture(); + const target = (this.texture = gl.createTexture()); selectTexture(gl, target); const size = this.size; target._refs = 1; - gl.texImage2D(gl.TEXTURE_2D, 0, this.internalFormat, size[0], size[1], 0, this.textureFormat, this.textureType, null); + gl.texImage2D( + gl.TEXTURE_2D, + 0, + this.internalFormat, + size[0], + size[1], + 0, + this.textureFormat, + this.textureType, + null + ); } const { context: gl, texture } = this; gl.bindFramebuffer(gl.FRAMEBUFFER, this.framebuffer()); gl.bindTexture(gl.TEXTURE_2D, texture); selectTexture(gl, texture); - gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, texture, 0); + gl.framebufferTexture2D( + gl.FRAMEBUFFER, + gl.COLOR_ATTACHMENT0, + gl.TEXTURE_2D, + texture, + 0 + ); gl.clearColor(0, 0, 0, 0); gl.clear(gl.COLOR_BUFFER_BIT | gl.DEPTH_BUFFER_BIT); } @@ -103,7 +145,10 @@ class GLTexture extends Texture { framebuffer() { if (!this._framebuffer) { - this._framebuffer = this.kernel.getRawValueFramebuffer(this.size[0], this.size[1]); + this._framebuffer = this.kernel.getRawValueFramebuffer( + this.size[0], + this.size[1] + ); } return this._framebuffer; } @@ -121,5 +166,3 @@ function selectTexture(gl, texture) { gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.NEAREST); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.NEAREST); } - -module.exports = { GLTexture }; \ No newline at end of file diff --git a/src/backend/gl/texture/memory-optimized-2d.js b/src/backend/gl/texture/memory-optimized-2d.js index 20234ee3..aab68e60 100644 --- a/src/backend/gl/texture/memory-optimized-2d.js +++ b/src/backend/gl/texture/memory-optimized-2d.js @@ -1,16 +1,16 @@ -const { utils } = require('../../../utils'); -const { GLTextureFloat } = require('./float'); +import { utils } from '../../../utils'; +import { GLTextureFloat } from './float'; -class GLTextureMemoryOptimized2D extends GLTextureFloat { +export class GLTextureMemoryOptimized2D extends GLTextureFloat { constructor(settings) { super(settings); this.type = 'MemoryOptimizedNumberTexture'; } toArray() { - return utils.erectMemoryOptimized2DFloat(this.renderValues(), this.output[0], this.output[1]); + return utils.erectMemoryOptimized2DFloat( + this.renderValues(), + this.output[0], + this.output[1] + ); } } - -module.exports = { - GLTextureMemoryOptimized2D -}; \ No newline at end of file diff --git a/src/backend/gl/texture/memory-optimized-3d.js b/src/backend/gl/texture/memory-optimized-3d.js index f65e5f9f..611d227f 100644 --- a/src/backend/gl/texture/memory-optimized-3d.js +++ b/src/backend/gl/texture/memory-optimized-3d.js @@ -1,16 +1,17 @@ -const { utils } = require('../../../utils'); -const { GLTextureFloat } = require('./float'); +import { utils } from '../../../utils'; +import { GLTextureFloat } from './float'; -class GLTextureMemoryOptimized3D extends GLTextureFloat { +export class GLTextureMemoryOptimized3D extends GLTextureFloat { constructor(settings) { super(settings); this.type = 'MemoryOptimizedNumberTexture'; } toArray() { - return utils.erectMemoryOptimized3DFloat(this.renderValues(), this.output[0], this.output[1], this.output[2]); + return utils.erectMemoryOptimized3DFloat( + this.renderValues(), + this.output[0], + this.output[1], + this.output[2] + ); } } - -module.exports = { - GLTextureMemoryOptimized3D -}; \ No newline at end of file diff --git a/src/backend/gl/texture/memory-optimized.js b/src/backend/gl/texture/memory-optimized.js index 03474f58..efb486ec 100644 --- a/src/backend/gl/texture/memory-optimized.js +++ b/src/backend/gl/texture/memory-optimized.js @@ -1,16 +1,15 @@ -const { utils } = require('../../../utils'); -const { GLTextureFloat } = require('./float'); +import { utils } from '../../../utils'; +import { GLTextureFloat } from './float'; -class GLTextureMemoryOptimized extends GLTextureFloat { +export class GLTextureMemoryOptimized extends GLTextureFloat { constructor(settings) { super(settings); this.type = 'MemoryOptimizedNumberTexture'; } toArray() { - return utils.erectMemoryOptimizedFloat(this.renderValues(), this.output[0]); + return utils.erectMemoryOptimizedFloat( + this.renderValues(), + this.output[0] + ); } } - -module.exports = { - GLTextureMemoryOptimized -}; \ No newline at end of file diff --git a/src/backend/gl/texture/unsigned-2d.js b/src/backend/gl/texture/unsigned-2d.js index 3adba8b1..96823b93 100644 --- a/src/backend/gl/texture/unsigned-2d.js +++ b/src/backend/gl/texture/unsigned-2d.js @@ -1,16 +1,16 @@ -const { utils } = require('../../../utils'); -const { GLTextureUnsigned } = require('./unsigned'); +import { utils } from '../../../utils'; +import { GLTextureUnsigned } from './unsigned'; -class GLTextureUnsigned2D extends GLTextureUnsigned { +export class GLTextureUnsigned2D extends GLTextureUnsigned { constructor(settings) { super(settings); this.type = 'NumberTexture'; } toArray() { - return utils.erect2DPackedFloat(this.renderValues(), this.output[0], this.output[1]); + return utils.erect2DPackedFloat( + this.renderValues(), + this.output[0], + this.output[1] + ); } } - -module.exports = { - GLTextureUnsigned2D -}; \ No newline at end of file diff --git a/src/backend/gl/texture/unsigned-3d.js b/src/backend/gl/texture/unsigned-3d.js index ccedf143..c7b3a317 100644 --- a/src/backend/gl/texture/unsigned-3d.js +++ b/src/backend/gl/texture/unsigned-3d.js @@ -1,16 +1,17 @@ -const { utils } = require('../../../utils'); -const { GLTextureUnsigned } = require('./unsigned'); +import { utils } from '../../../utils'; +import { GLTextureUnsigned } from './unsigned'; -class GLTextureUnsigned3D extends GLTextureUnsigned { +export class GLTextureUnsigned3D extends GLTextureUnsigned { constructor(settings) { super(settings); this.type = 'NumberTexture'; } toArray() { - return utils.erect3DPackedFloat(this.renderValues(), this.output[0], this.output[1], this.output[2]); + return utils.erect3DPackedFloat( + this.renderValues(), + this.output[0], + this.output[1], + this.output[2] + ); } } - -module.exports = { - GLTextureUnsigned3D -}; \ No newline at end of file diff --git a/src/backend/gl/texture/unsigned.js b/src/backend/gl/texture/unsigned.js index 0a357206..16800904 100644 --- a/src/backend/gl/texture/unsigned.js +++ b/src/backend/gl/texture/unsigned.js @@ -1,7 +1,7 @@ -const { utils } = require('../../../utils'); -const { GLTexture } = require('./index'); +import { utils } from '../../../utils'; +import { GLTexture } from './index'; -class GLTextureUnsigned extends GLTexture { +export class GLTextureUnsigned extends GLTexture { get textureType() { return this.context.UNSIGNED_BYTE; } @@ -20,7 +20,15 @@ class GLTextureUnsigned extends GLTexture { 0 ); const result = new Uint8Array(this.size[0] * this.size[1] * 4); - gl.readPixels(0, 0, this.size[0], this.size[1], gl.RGBA, gl.UNSIGNED_BYTE, result); + gl.readPixels( + 0, + 0, + this.size[0], + this.size[1], + gl.RGBA, + gl.UNSIGNED_BYTE, + result + ); return result; } renderValues() { @@ -31,7 +39,3 @@ class GLTextureUnsigned extends GLTexture { return utils.erectPackedFloat(this.renderValues(), this.output[0]); } } - -module.exports = { - GLTextureUnsigned -}; \ No newline at end of file diff --git a/src/backend/headless-gl/kernel.js b/src/backend/headless-gl/kernel.js index f91b1352..0b8babd4 100644 --- a/src/backend/headless-gl/kernel.js +++ b/src/backend/headless-gl/kernel.js @@ -1,6 +1,6 @@ -const getContext = require('gl'); -const { WebGLKernel } = require('../web-gl/kernel'); -const { glKernelString } = require('../gl/kernel-string'); +import getContext from 'gl'; +import { WebGLKernel } from '../web-gl/kernel'; +import { glKernelString } from '../gl/kernel-string'; let isSupported = null; let testCanvas = null; @@ -8,7 +8,7 @@ let testContext = null; let testExtensions = null; let features = null; -class HeadlessGLKernel extends WebGLKernel { +export class HeadlessGLKernel extends WebGLKernel { static get isSupported() { if (isSupported !== null) return isSupported; this.setupFeatureChecks(); @@ -20,19 +20,30 @@ class HeadlessGLKernel extends WebGLKernel { testCanvas = null; testExtensions = null; if (typeof getContext !== 'function') return; - try { // just in case, edge cases + try { + // just in case, edge cases testContext = getContext(2, 2, { - preserveDrawingBuffer: true + preserveDrawingBuffer: true, }); if (!testContext || !testContext.getExtension) return; testExtensions = { - STACKGL_resize_drawingbuffer: testContext.getExtension('STACKGL_resize_drawingbuffer'), - STACKGL_destroy_context: testContext.getExtension('STACKGL_destroy_context'), + STACKGL_resize_drawingbuffer: testContext.getExtension( + 'STACKGL_resize_drawingbuffer' + ), + STACKGL_destroy_context: testContext.getExtension( + 'STACKGL_destroy_context' + ), OES_texture_float: testContext.getExtension('OES_texture_float'), - OES_texture_float_linear: testContext.getExtension('OES_texture_float_linear'), - OES_element_index_uint: testContext.getExtension('OES_element_index_uint'), + OES_texture_float_linear: testContext.getExtension( + 'OES_texture_float_linear' + ), + OES_element_index_uint: testContext.getExtension( + 'OES_element_index_uint' + ), WEBGL_draw_buffers: testContext.getExtension('WEBGL_draw_buffers'), - WEBGL_color_buffer_float: testContext.getExtension('WEBGL_color_buffer_float'), + WEBGL_color_buffer_float: testContext.getExtension( + 'WEBGL_color_buffer_float' + ), }; features = this.getFeatures(); } catch (e) { @@ -57,9 +68,11 @@ class HeadlessGLKernel extends WebGLKernel { } static getChannelCount() { - return testExtensions.WEBGL_draw_buffers ? - testContext.getParameter(testExtensions.WEBGL_draw_buffers.MAX_DRAW_BUFFERS_WEBGL) : - 1; + return testExtensions.WEBGL_draw_buffers + ? testContext.getParameter( + testExtensions.WEBGL_draw_buffers.MAX_DRAW_BUFFERS_WEBGL + ) + : 1; } static getMaxTextureSize() { @@ -84,17 +97,25 @@ class HeadlessGLKernel extends WebGLKernel { initContext() { return getContext(2, 2, { - preserveDrawingBuffer: true + preserveDrawingBuffer: true, }); } initExtensions() { this.extensions = { - STACKGL_resize_drawingbuffer: this.context.getExtension('STACKGL_resize_drawingbuffer'), - STACKGL_destroy_context: this.context.getExtension('STACKGL_destroy_context'), + STACKGL_resize_drawingbuffer: this.context.getExtension( + 'STACKGL_resize_drawingbuffer' + ), + STACKGL_destroy_context: this.context.getExtension( + 'STACKGL_destroy_context' + ), OES_texture_float: this.context.getExtension('OES_texture_float'), - OES_texture_float_linear: this.context.getExtension('OES_texture_float_linear'), - OES_element_index_uint: this.context.getExtension('OES_element_index_uint'), + OES_texture_float_linear: this.context.getExtension( + 'OES_texture_float_linear' + ), + OES_element_index_uint: this.context.getExtension( + 'OES_element_index_uint' + ), WEBGL_draw_buffers: this.context.getExtension('WEBGL_draw_buffers'), }; } @@ -102,7 +123,10 @@ class HeadlessGLKernel extends WebGLKernel { build() { super.build.apply(this, arguments); if (!this.fallbackRequested) { - this.extensions.STACKGL_resize_drawingbuffer.resize(this.maxTexSize[0], this.maxTexSize[1]); + this.extensions.STACKGL_resize_drawingbuffer.resize( + this.maxTexSize[0], + this.maxTexSize[1] + ); } } @@ -128,18 +152,23 @@ class HeadlessGLKernel extends WebGLKernel { toString() { const setupContextString = `const gl = context || require('gl')(1, 1);\n`; const destroyContextString = ` if (!context) { gl.getExtension('STACKGL_destroy_context').destroy(); }\n`; - return glKernelString(this.constructor, arguments, this, setupContextString, destroyContextString); + return glKernelString( + this.constructor, + arguments, + this, + setupContextString, + destroyContextString + ); } setOutput(output) { super.setOutput(output); if (this.graphical && this.extensions.STACKGL_resize_drawingbuffer) { - this.extensions.STACKGL_resize_drawingbuffer.resize(this.maxTexSize[0], this.maxTexSize[1]); + this.extensions.STACKGL_resize_drawingbuffer.resize( + this.maxTexSize[0], + this.maxTexSize[1] + ); } return this; } } - -module.exports = { - HeadlessGLKernel -}; \ No newline at end of file diff --git a/src/backend/kernel-value.js b/src/backend/kernel-value.js index 1fdfc369..6ce6986f 100644 --- a/src/backend/kernel-value.js +++ b/src/backend/kernel-value.js @@ -1,7 +1,7 @@ /** * @class KernelValue */ -class KernelValue { +export class KernelValue { /** * @param {KernelVariable} value * @param {IKernelValueSettings} settings @@ -29,7 +29,9 @@ class KernelValue { throw new Error('origin not set'); } if (origin !== 'user' && origin !== 'constants') { - throw new Error(`origin must be "user" or "constants" value is "${ origin }"`); + throw new Error( + `origin must be "user" or "constants" value is "${origin}"` + ); } if (!onRequestContextHandle) { throw new Error('onRequestContextHandle is not set'); @@ -45,7 +47,10 @@ class KernelValue { this.size = value.size || null; this.index = null; this.context = context; - this.checkContext = checkContext !== null && checkContext !== undefined ? checkContext : true; + this.checkContext = + checkContext !== null && checkContext !== undefined + ? checkContext + : true; this.contextHandle = null; this.onRequestContextHandle = onRequestContextHandle; this.onUpdateValueMismatch = onUpdateValueMismatch; @@ -57,14 +62,10 @@ class KernelValue { } getSource() { - throw new Error(`"getSource" not defined on ${ this.constructor.name }`); + throw new Error(`"getSource" not defined on ${this.constructor.name}`); } updateValue(value) { - throw new Error(`"updateValue" not defined on ${ this.constructor.name }`); + throw new Error(`"updateValue" not defined on ${this.constructor.name}`); } } - -module.exports = { - KernelValue -}; \ No newline at end of file diff --git a/src/backend/kernel.js b/src/backend/kernel.js index dd68ca10..d54cd225 100644 --- a/src/backend/kernel.js +++ b/src/backend/kernel.js @@ -1,12 +1,12 @@ -const { utils } = require('../utils'); -const { Input } = require('../input'); +import { utils } from '../utils'; +import { Input } from '../input'; -class Kernel { +export class Kernel { /** * @type {Boolean} */ static get isSupported() { - throw new Error(`"isSupported" not implemented on ${ this.name }`); + throw new Error(`"isSupported" not implemented on ${this.name}`); } /** @@ -14,7 +14,7 @@ class Kernel { * @returns {Boolean} */ static isContextMatch(context) { - throw new Error(`"isContextMatch" not implemented on ${ this.name }`); + throw new Error(`"isContextMatch" not implemented on ${this.name}`); } /** @@ -22,23 +22,23 @@ class Kernel { * Used internally to populate the kernel.feature, which is a getter for the output of this value */ static getFeatures() { - throw new Error(`"getFeatures" not implemented on ${ this.name }`); + throw new Error(`"getFeatures" not implemented on ${this.name}`); } static destroyContext(context) { - throw new Error(`"destroyContext" called on ${ this.name }`); + throw new Error(`"destroyContext" called on ${this.name}`); } static nativeFunctionArguments() { - throw new Error(`"nativeFunctionArguments" called on ${ this.name }`); + throw new Error(`"nativeFunctionArguments" called on ${this.name}`); } static nativeFunctionReturnType() { - throw new Error(`"nativeFunctionReturnType" called on ${ this.name }`); + throw new Error(`"nativeFunctionReturnType" called on ${this.name}`); } static combineKernels() { - throw new Error(`"combineKernels" called on ${ this.name }`); + throw new Error(`"combineKernels" called on ${this.name}`); } /** @@ -63,7 +63,10 @@ class Kernel { * Name of the arguments found from parsing source argument * @type {String[]} */ - this.argumentNames = typeof source === 'string' ? utils.getArgumentNamesFromString(source) : null; + this.argumentNames = + typeof source === 'string' + ? utils.getArgumentNamesFromString(source) + : null; this.argumentTypes = null; this.argumentSizes = null; this.argumentBitRatios = null; @@ -71,7 +74,6 @@ class Kernel { this.kernelConstants = null; this.forceUploadKernelConstants = null; - /** * The function source * @type {String|IKernelJSON} @@ -273,7 +275,7 @@ class Kernel { * @abstract */ build() { - throw new Error(`"build" not defined on ${ this.constructor.name }`); + throw new Error(`"build" not defined on ${this.constructor.name}`); } /** @@ -283,7 +285,7 @@ class Kernel { * @abstract */ run() { - throw new Error(`"run" not defined on ${ this.constructor.name }`) + throw new Error(`"run" not defined on ${this.constructor.name}`); } /** @@ -291,7 +293,7 @@ class Kernel { * @return {Object} */ initCanvas() { - throw new Error(`"initCanvas" not defined on ${ this.constructor.name }`); + throw new Error(`"initCanvas" not defined on ${this.constructor.name}`); } /** @@ -299,7 +301,7 @@ class Kernel { * @return {Object} */ initContext() { - throw new Error(`"initContext" not defined on ${ this.constructor.name }`); + throw new Error(`"initContext" not defined on ${this.constructor.name}`); } /** @@ -308,7 +310,7 @@ class Kernel { * @abstract */ initPlugins(settings) { - throw new Error(`"initPlugins" not defined on ${ this.constructor.name }`); + throw new Error(`"initPlugins" not defined on ${this.constructor.name}`); } /** @@ -318,10 +320,17 @@ class Kernel { * @return {Kernel} */ addFunction(source, settings = {}) { - if (source.name && source.source && source.argumentTypes && 'returnType' in source) { + if ( + source.name && + source.source && + source.argumentTypes && + 'returnType' in source + ) { this.functions.push(source); } else if ('settings' in source && 'source' in source) { - this.functions.push(this.functionToIGPUFunction(source.source, source.settings)); + this.functions.push( + this.functionToIGPUFunction(source.source, source.settings) + ); } else if (typeof source === 'string' || typeof source === 'function') { this.functions.push(this.functionToIGPUFunction(source, settings)); } else { @@ -337,16 +346,18 @@ class Kernel { * @param {IGPUFunctionSettings} [settings] */ addNativeFunction(name, source, settings = {}) { - const { argumentTypes, argumentNames } = settings.argumentTypes ? - splitArgumentTypes(settings.argumentTypes) : - this.constructor.nativeFunctionArguments(source) || {}; + const { argumentTypes, argumentNames } = settings.argumentTypes + ? splitArgumentTypes(settings.argumentTypes) + : this.constructor.nativeFunctionArguments(source) || {}; this.nativeFunctions.push({ name, source, settings, argumentTypes, argumentNames, - returnType: settings.returnType || this.constructor.nativeFunctionReturnType(source) + returnType: + settings.returnType || + this.constructor.nativeFunctionReturnType(source), }); return this; } @@ -367,14 +378,14 @@ class Kernel { const type = argType === 'Integer' ? 'Number' : argType; this.argumentTypes.push(type); this.kernelArguments.push({ - type + type, }); } } } else { for (let i = 0; i < this.argumentTypes.length; i++) { this.kernelArguments.push({ - type: this.argumentTypes[i] + type: this.argumentTypes[i], }); } } @@ -407,16 +418,19 @@ class Kernel { if (this.constants) { for (let name in this.constants) { if (needsConstantTypes) { - const type = utils.getVariableType(this.constants[name], this.strictIntegers); + const type = utils.getVariableType( + this.constants[name], + this.strictIntegers + ); this.constantTypes[name] = type; this.kernelConstants.push({ name, - type + type, }); } else { this.kernelConstants.push({ name, - type: this.constantTypes[name] + type: this.constantTypes[name], }); } this.constantBitRatios[name] = this.getBitRatio(this.constants[name]); @@ -713,7 +727,8 @@ class Kernel { for (const p in argumentTypes) { if (!argumentTypes.hasOwnProperty(p)) continue; const argumentIndex = this.argumentNames.indexOf(p); - if (argumentIndex === -1) throw new Error(`unable to find argument ${ p }`); + if (argumentIndex === -1) + throw new Error(`unable to find argument ${p}`); this.argumentTypes[argumentIndex] = argumentTypes[p]; } } @@ -732,7 +747,9 @@ class Kernel { requestFallback(args) { if (!this.onRequestFallback) { - throw new Error(`"onRequestFallback" not defined on ${ this.constructor.name }`); + throw new Error( + `"onRequestFallback" not defined on ${this.constructor.name}` + ); } this.fallbackRequested = true; return this.onRequestFallback(args); @@ -743,7 +760,9 @@ class Kernel { * @abstract */ validateSettings() { - throw new Error(`"validateSettings" not defined on ${ this.constructor.name }`); + throw new Error( + `"validateSettings" not defined on ${this.constructor.name}` + ); } /** @@ -756,8 +775,10 @@ class Kernel { if (this.subKernels === null) { this.subKernels = []; } - if (!subKernel.source) throw new Error('subKernel missing "source" property'); - if (!subKernel.property && isNaN(subKernel.property)) throw new Error('subKernel missing "property" property'); + if (!subKernel.source) + throw new Error('subKernel missing "source" property'); + if (!subKernel.property && isNaN(subKernel.property)) + throw new Error('subKernel missing "property" property'); if (!subKernel.name) throw new Error('subKernel missing "name" property'); this.subKernels.push(subKernel); return this; @@ -768,7 +789,7 @@ class Kernel { * @param {Boolean} [removeCanvasReferences] remove any associated canvas references */ destroy(removeCanvasReferences) { - throw new Error(`"destroy" called on ${ this.constructor.name }`); + throw new Error(`"destroy" called on ${this.constructor.name}`); } /** @@ -805,15 +826,19 @@ class Kernel { * @returns {Uint8ClampedArray} */ getPixels(flip) { - throw new Error(`"getPixels" called on ${ this.constructor.name }`); + throw new Error(`"getPixels" called on ${this.constructor.name}`); } checkOutput() { - if (!this.output || !utils.isArray(this.output)) throw new Error('kernel.output not an array'); - if (this.output.length < 1) throw new Error('kernel.output is empty, needs at least 1 value'); + if (!this.output || !utils.isArray(this.output)) + throw new Error('kernel.output not an array'); + if (this.output.length < 1) + throw new Error('kernel.output is empty, needs at least 1 value'); for (let i = 0; i < this.output.length; i++) { if (isNaN(this.output[i]) || this.output[i] < 1) { - throw new Error(`${ this.constructor.name }.output[${ i }] incorrectly defined as \`${ this.output[i] }\`, needs to be numeric, and greater than 0`); + throw new Error( + `${this.constructor.name}.output[${i}] incorrectly defined as \`${this.output[i]}\`, needs to be numeric, and greater than 0` + ); } } } @@ -823,7 +848,7 @@ class Kernel { * @param {String} value */ prependString(value) { - throw new Error(`"prependString" called on ${ this.constructor.name }`); + throw new Error(`"prependString" called on ${this.constructor.name}`); } /** @@ -832,7 +857,7 @@ class Kernel { * @return Boolean */ hasPrependString(value) { - throw new Error(`"hasPrependString" called on ${ this.constructor.name }`); + throw new Error(`"hasPrependString" called on ${this.constructor.name}`); } /** @@ -846,9 +871,11 @@ class Kernel { argumentNames: this.argumentNames, argumentsTypes: this.argumentTypes, constants: this.constants, - pluginNames: this.plugins ? this.plugins.map(plugin => plugin.name) : null, + pluginNames: this.plugins + ? this.plugins.map(plugin => plugin.name) + : null, returnType: this.returnType, - } + }, }; } @@ -857,7 +884,10 @@ class Kernel { */ buildSignature(args) { const Constructor = this.constructor; - this.signature = Constructor.getSignature(this, Constructor.getArgumentTypes(this, args)); + this.signature = Constructor.getSignature( + this, + Constructor.getArgumentTypes(this, args) + ); } /** @@ -895,7 +925,7 @@ class Kernel { * @abstract */ static getSignature(kernel, argumentTypes) { - throw new Error(`"getSignature" not implemented on ${ this.name }`); + throw new Error(`"getSignature" not implemented on ${this.name}`); } /** @@ -905,15 +935,19 @@ class Kernel { * @returns {IGPUFunction} */ functionToIGPUFunction(source, settings = {}) { - if (typeof source !== 'string' && typeof source !== 'function') throw new Error('source not a string or function'); - const sourceString = typeof source === 'string' ? source : source.toString(); + if (typeof source !== 'string' && typeof source !== 'function') + throw new Error('source not a string or function'); + const sourceString = + typeof source === 'string' ? source : source.toString(); let argumentTypes = []; if (Array.isArray(settings.argumentTypes)) { argumentTypes = settings.argumentTypes; } else if (typeof settings.argumentTypes === 'object') { - argumentTypes = utils.getArgumentNamesFromString(sourceString) - .map(name => settings.argumentTypes[name]) || []; + argumentTypes = + utils + .getArgumentNamesFromString(sourceString) + .map(name => settings.argumentTypes[name]) || []; } else { argumentTypes = settings.argumentTypes || []; } @@ -943,7 +977,3 @@ function splitArgumentTypes(argumentTypesObject) { } return { argumentTypes, argumentNames }; } - -module.exports = { - Kernel -}; \ No newline at end of file diff --git a/src/backend/web-gl/fragment-shader.js b/src/backend/web-gl/fragment-shader.js index 166e80e5..29123690 100644 --- a/src/backend/web-gl/fragment-shader.js +++ b/src/backend/web-gl/fragment-shader.js @@ -1,5 +1,5 @@ // language=GLSL -const fragmentShader = `__HEADER__; +export const fragmentShader = `__HEADER__; __FLOAT_TACTIC_DECLARATION__; __INT_TACTIC_DECLARATION__; __SAMPLER_2D_TACTIC_DECLARATION__; @@ -490,7 +490,3 @@ void main(void) { index = int(vTexCoord.s * float(uTexSize.x)) + int(vTexCoord.t * float(uTexSize.y)) * uTexSize.x; __MAIN_RESULT__; }`; - -module.exports = { - fragmentShader -}; \ No newline at end of file diff --git a/src/backend/web-gl/function-node.js b/src/backend/web-gl/function-node.js index c0d5f0b6..84e85164 100644 --- a/src/backend/web-gl/function-node.js +++ b/src/backend/web-gl/function-node.js @@ -1,10 +1,10 @@ -const { utils } = require('../../utils'); -const { FunctionNode } = require('../function-node'); +import { utils } from '../../utils'; +import { FunctionNode } from '../function-node'; /** * @desc [INTERNAL] Takes in a function node, and does all the AST voodoo required to toString its respective WebGL code */ -class WebGLFunctionNode extends FunctionNode { +export class WebGLFunctionNode extends FunctionNode { constructor(source, settings) { super(source, settings); if (settings && settings.hasOwnProperty('fixIntegerDivisionAccuracy')) { @@ -86,10 +86,14 @@ class WebGLFunctionNode extends FunctionNode { if (i > 0) { retArr.push(', '); } - let argumentType = this.argumentTypes[this.argumentNames.indexOf(argumentName)]; + let argumentType = + this.argumentTypes[this.argumentNames.indexOf(argumentName)]; // The type is too loose ended, here we decide to solidify a type, lets go with float if (!argumentType) { - throw this.astErrorOutput(`Unknown argument ${argumentName} type`, ast); + throw this.astErrorOutput( + `Unknown argument ${argumentName} type`, + ast + ); } if (argumentType === 'LiteralInteger') { this.argumentTypes[i] = argumentType = 'Number'; @@ -101,7 +105,9 @@ class WebGLFunctionNode extends FunctionNode { const name = utils.sanitizeName(argumentName); if (type === 'sampler2D' || type === 'sampler2DArray') { // mash needed arguments together, since now we have end to end inference - retArr.push(`${type} user_${name},ivec2 user_${name}Size,ivec3 user_${name}Dim`); + retArr.push( + `${type} user_${name},ivec2 user_${name}Size,ivec3 user_${name}Dim` + ); } else { retArr.push(`${type} user_${name}`); } @@ -129,7 +135,8 @@ class WebGLFunctionNode extends FunctionNode { * @returns {Array} the append retArr */ astReturnStatement(ast, retArr) { - if (!ast.argument) throw this.astErrorOutput('Unexpected return statement', ast); + if (!ast.argument) + throw this.astErrorOutput('Unexpected return statement', ast); this.pushState('skip-literal-correction'); const type = this.getType(ast.argument); this.popState('skip-literal-correction'); @@ -191,17 +198,20 @@ class WebGLFunctionNode extends FunctionNode { this.astGeneric(ast.argument, result); break; default: - throw this.astErrorOutput(`unhandled return type ${this.returnType}`, ast); + throw this.astErrorOutput( + `unhandled return type ${this.returnType}`, + ast + ); } if (this.isRootKernel) { - retArr.push(`kernelResult = ${ result.join('') };`); + retArr.push(`kernelResult = ${result.join('')};`); retArr.push('return;'); } else if (this.isSubKernel) { - retArr.push(`subKernelResult_${ this.name } = ${ result.join('') };`); - retArr.push(`return subKernelResult_${ this.name };`); + retArr.push(`subKernelResult_${this.name} = ${result.join('')};`); + retArr.push(`return subKernelResult_${this.name};`); } else { - retArr.push(`return ${ result.join('') };`); + retArr.push(`return ${result.join('')};`); } return retArr; } @@ -225,17 +235,26 @@ class WebGLFunctionNode extends FunctionNode { const key = this.astKey(ast); if (Number.isInteger(ast.value)) { - if (this.isState('casting-to-integer') || this.isState('building-integer')) { + if ( + this.isState('casting-to-integer') || + this.isState('building-integer') + ) { this.literalTypes[key] = 'Integer'; retArr.push(`${ast.value}`); - } else if (this.isState('casting-to-float') || this.isState('building-float')) { + } else if ( + this.isState('casting-to-float') || + this.isState('building-float') + ) { this.literalTypes[key] = 'Number'; retArr.push(`${ast.value}.0`); } else { this.literalTypes[key] = 'Number'; retArr.push(`${ast.value}.0`); } - } else if (this.isState('casting-to-integer') || this.isState('building-integer')) { + } else if ( + this.isState('casting-to-integer') || + this.isState('building-integer') + ) { this.literalTypes[key] = 'Integer'; retArr.push(Math.round(ast.value)); } else { @@ -311,7 +330,10 @@ class WebGLFunctionNode extends FunctionNode { this.popState('building-float'); break; case 'LiteralInteger & LiteralInteger': - if (this.isState('casting-to-integer') || this.isState('building-integer')) { + if ( + this.isState('casting-to-integer') || + this.isState('building-integer') + ) { this.pushState('building-integer'); this.astGeneric(ast.left, retArr); retArr.push(operatorMap[ast.operator] || ast.operator); @@ -328,7 +350,10 @@ class WebGLFunctionNode extends FunctionNode { case 'Integer & Float': case 'Integer & Number': - if (ast.operator === '>' || ast.operator === '<' && ast.right.type === 'Literal') { + if ( + ast.operator === '>' || + (ast.operator === '<' && ast.right.type === 'Literal') + ) { // if right value is actually a float, don't loose that information, cast left to right rather than the usual right to left if (!Number.isInteger(ast.right.value)) { this.pushState('building-float'); @@ -350,7 +375,10 @@ class WebGLFunctionNode extends FunctionNode { if (literalType === 'Integer') { retArr.push(literalResult.join('')); } else { - throw this.astErrorOutput(`Unhandled binary expression with literal`, ast); + throw this.astErrorOutput( + `Unhandled binary expression with literal`, + ast + ); } } else { retArr.push('int('); @@ -426,7 +454,10 @@ class WebGLFunctionNode extends FunctionNode { break; default: - throw this.astErrorOutput(`Unhandled binary expression between ${key}`, ast); + throw this.astErrorOutput( + `Unhandled binary expression between ${key}`, + ast + ); } retArr.push(')'); @@ -439,7 +470,9 @@ class WebGLFunctionNode extends FunctionNode { return bitwiseResult; } const upconvertableOperators = { - '%': this.fixIntegerDivisionAccuracy ? 'integerCorrectionModulo' : 'modulo', + '%': this.fixIntegerDivisionAccuracy + ? 'integerCorrectionModulo' + : 'modulo', '**': 'pow', }; const foundOperator = upconvertableOperators[ast.operator]; @@ -600,7 +633,10 @@ class WebGLFunctionNode extends FunctionNode { */ astIdentifierExpression(idtNode, retArr) { if (idtNode.type !== 'Identifier') { - throw this.astErrorOutput('IdentifierExpression - not an Identifier', idtNode); + throw this.astErrorOutput( + 'IdentifierExpression - not an Identifier', + idtNode + ); } const type = this.getType(idtNode); @@ -680,7 +716,11 @@ class WebGLFunctionNode extends FunctionNode { if (isSafe) { const initString = initArr.join(''); const initNeedsSemiColon = initString[initString.length - 1] !== ';'; - retArr.push(`for (${initString}${initNeedsSemiColon ? ';' : ''}${testArr.join('')};${updateArr.join('')}){\n`); + retArr.push( + `for (${initString}${initNeedsSemiColon ? ';' : ''}${testArr.join( + '' + )};${updateArr.join('')}){\n` + ); retArr.push(bodyArr.join('')); retArr.push('}\n'); } else { @@ -688,7 +728,9 @@ class WebGLFunctionNode extends FunctionNode { if (initArr.length > 0) { retArr.push(initArr.join(''), '\n'); } - retArr.push(`for (int ${iVariableName}=0;${iVariableName} 0) { retArr.push(`if (!${testArr.join('')}) break;\n`); } @@ -711,7 +753,9 @@ class WebGLFunctionNode extends FunctionNode { } const iVariableName = this.getInternalVariableName('safeI'); - retArr.push(`for (int ${iVariableName}=0;${iVariableName} 0) { for (let i = 0; i < this.plugins.length; i++) { const plugin = this.plugins[i]; - if (plugin.functionMatch === 'Math.random()' && plugin.functionReplace) { + if ( + plugin.functionMatch === 'Math.random()' && + plugin.functionReplace + ) { retArr.push(plugin.functionReplace); return retArr; } @@ -1458,10 +1556,17 @@ class WebGLFunctionNode extends FunctionNode { if (targetType === argumentType) { if (argument.type === 'Identifier') { retArr.push(`user_${utils.sanitizeName(argument.name)}`); - } else if (argument.type === 'ArrayExpression' || argument.type === 'MemberExpression' || argument.type === 'CallExpression') { + } else if ( + argument.type === 'ArrayExpression' || + argument.type === 'MemberExpression' || + argument.type === 'CallExpression' + ) { this.astGeneric(argument, retArr); } else { - throw this.astErrorOutput(`Unhandled argument type ${ argument.type }`, ast); + throw this.astErrorOutput( + `Unhandled argument type ${argument.type}`, + ast + ); } continue; } @@ -1480,15 +1585,27 @@ class WebGLFunctionNode extends FunctionNode { case 'Array': case 'Input': if (targetType === argumentType) { - if (argument.type !== 'Identifier') throw this.astErrorOutput(`Unhandled argument type ${ argument.type }`, ast); - this.triggerImplyArgumentBitRatio(this.name, argument.name, functionName, i); + if (argument.type !== 'Identifier') + throw this.astErrorOutput( + `Unhandled argument type ${argument.type}`, + ast + ); + this.triggerImplyArgumentBitRatio( + this.name, + argument.name, + functionName, + i + ); const name = utils.sanitizeName(argument.name); retArr.push(`user_${name},user_${name}Size,user_${name}Dim`); continue; } break; } - throw this.astErrorOutput(`Unhandled argument combination of ${ argumentType } and ${ targetType } for argument named "${ argument.name }"`, ast); + throw this.astErrorOutput( + `Unhandled argument combination of ${argumentType} and ${targetType} for argument named "${argument.name}"`, + ast + ); } } // Close arguments space @@ -1522,7 +1639,7 @@ class WebGLFunctionNode extends FunctionNode { retArr.push(', '); } const subNode = arrNode.elements[i]; - this.astGeneric(subNode, retArr) + this.astGeneric(subNode, retArr); } retArr.push(')'); @@ -1566,41 +1683,37 @@ class WebGLFunctionNode extends FunctionNode { } const typeMap = { - 'Array': 'sampler2D', + Array: 'sampler2D', 'Array(2)': 'vec2', 'Array(3)': 'vec3', 'Array(4)': 'vec4', 'Matrix(2)': 'mat2', 'Matrix(3)': 'mat3', 'Matrix(4)': 'mat4', - 'Array2D': 'sampler2D', - 'Array3D': 'sampler2D', - 'Boolean': 'bool', - 'Float': 'float', - 'Input': 'sampler2D', - 'Integer': 'int', - 'Number': 'float', - 'LiteralInteger': 'float', - 'NumberTexture': 'sampler2D', - 'MemoryOptimizedNumberTexture': 'sampler2D', + Array2D: 'sampler2D', + Array3D: 'sampler2D', + Boolean: 'bool', + Float: 'float', + Input: 'sampler2D', + Integer: 'int', + Number: 'float', + LiteralInteger: 'float', + NumberTexture: 'sampler2D', + MemoryOptimizedNumberTexture: 'sampler2D', 'ArrayTexture(1)': 'sampler2D', 'ArrayTexture(2)': 'sampler2D', 'ArrayTexture(3)': 'sampler2D', 'ArrayTexture(4)': 'sampler2D', - 'HTMLVideo': 'sampler2D', - 'HTMLCanvas': 'sampler2D', - 'OffscreenCanvas': 'sampler2D', - 'HTMLImage': 'sampler2D', - 'ImageBitmap': 'sampler2D', - 'ImageData': 'sampler2D', - 'HTMLImageArray': 'sampler2DArray', + HTMLVideo: 'sampler2D', + HTMLCanvas: 'sampler2D', + OffscreenCanvas: 'sampler2D', + HTMLImage: 'sampler2D', + ImageBitmap: 'sampler2D', + ImageData: 'sampler2D', + HTMLImageArray: 'sampler2DArray', }; const operatorMap = { '===': '==', - '!==': '!=' + '!==': '!=', }; - -module.exports = { - WebGLFunctionNode -}; \ No newline at end of file diff --git a/src/backend/web-gl/kernel-value-maps.js b/src/backend/web-gl/kernel-value-maps.js index 843164a7..ea9c080e 100644 --- a/src/backend/web-gl/kernel-value-maps.js +++ b/src/backend/web-gl/kernel-value-maps.js @@ -1,51 +1,51 @@ -const { WebGLKernelValueBoolean } = require('./kernel-value/boolean'); -const { WebGLKernelValueFloat } = require('./kernel-value/float'); -const { WebGLKernelValueInteger } = require('./kernel-value/integer'); +import { WebGLKernelValueBoolean } from './kernel-value/boolean'; +import { WebGLKernelValueFloat } from './kernel-value/float'; +import { WebGLKernelValueInteger } from './kernel-value/integer'; -const { WebGLKernelValueHTMLImage } = require('./kernel-value/html-image'); -const { WebGLKernelValueDynamicHTMLImage } = require('./kernel-value/dynamic-html-image'); +import { WebGLKernelValueHTMLImage } from './kernel-value/html-image'; +import { WebGLKernelValueDynamicHTMLImage } from './kernel-value/dynamic-html-image'; -const { WebGLKernelValueHTMLVideo } = require('./kernel-value/html-video'); -const { WebGLKernelValueDynamicHTMLVideo } = require('./kernel-value/dynamic-html-video'); +import { WebGLKernelValueHTMLVideo } from './kernel-value/html-video'; +import { WebGLKernelValueDynamicHTMLVideo } from './kernel-value/dynamic-html-video'; -const { WebGLKernelValueSingleInput } = require('./kernel-value/single-input'); -const { WebGLKernelValueDynamicSingleInput } = require('./kernel-value/dynamic-single-input'); +import { WebGLKernelValueSingleInput } from './kernel-value/single-input'; +import { WebGLKernelValueDynamicSingleInput } from './kernel-value/dynamic-single-input'; -const { WebGLKernelValueUnsignedInput } = require('./kernel-value/unsigned-input'); -const { WebGLKernelValueDynamicUnsignedInput } = require('./kernel-value/dynamic-unsigned-input'); +import { WebGLKernelValueUnsignedInput } from './kernel-value/unsigned-input'; +import { WebGLKernelValueDynamicUnsignedInput } from './kernel-value/dynamic-unsigned-input'; -const { WebGLKernelValueMemoryOptimizedNumberTexture } = require('./kernel-value/memory-optimized-number-texture'); -const { WebGLKernelValueDynamicMemoryOptimizedNumberTexture } = require('./kernel-value/dynamic-memory-optimized-number-texture'); +import { WebGLKernelValueMemoryOptimizedNumberTexture } from './kernel-value/memory-optimized-number-texture'; +import { WebGLKernelValueDynamicMemoryOptimizedNumberTexture } from './kernel-value/dynamic-memory-optimized-number-texture'; -const { WebGLKernelValueNumberTexture } = require('./kernel-value/number-texture'); -const { WebGLKernelValueDynamicNumberTexture } = require('./kernel-value/dynamic-number-texture'); +import { WebGLKernelValueNumberTexture } from './kernel-value/number-texture'; +import { WebGLKernelValueDynamicNumberTexture } from './kernel-value/dynamic-number-texture'; -const { WebGLKernelValueSingleArray } = require('./kernel-value/single-array'); -const { WebGLKernelValueDynamicSingleArray } = require('./kernel-value/dynamic-single-array'); +import { WebGLKernelValueSingleArray } from './kernel-value/single-array'; +import { WebGLKernelValueDynamicSingleArray } from './kernel-value/dynamic-single-array'; -const { WebGLKernelValueSingleArray1DI } = require('./kernel-value/single-array1d-i'); -const { WebGLKernelValueDynamicSingleArray1DI } = require('./kernel-value/dynamic-single-array1d-i'); +import { WebGLKernelValueSingleArray1DI } from './kernel-value/single-array1d-i'; +import { WebGLKernelValueDynamicSingleArray1DI } from './kernel-value/dynamic-single-array1d-i'; -const { WebGLKernelValueSingleArray2DI } = require('./kernel-value/single-array2d-i'); -const { WebGLKernelValueDynamicSingleArray2DI } = require('./kernel-value/dynamic-single-array2d-i'); +import { WebGLKernelValueSingleArray2DI } from './kernel-value/single-array2d-i'; +import { WebGLKernelValueDynamicSingleArray2DI } from './kernel-value/dynamic-single-array2d-i'; -const { WebGLKernelValueSingleArray3DI } = require('./kernel-value/single-array3d-i'); -const { WebGLKernelValueDynamicSingleArray3DI } = require('./kernel-value/dynamic-single-array3d-i'); +import { WebGLKernelValueSingleArray3DI } from './kernel-value/single-array3d-i'; +import { WebGLKernelValueDynamicSingleArray3DI } from './kernel-value/dynamic-single-array3d-i'; -const { WebGLKernelValueArray2 } = require('./kernel-value/array2'); -const { WebGLKernelValueArray3 } = require('./kernel-value/array3'); -const { WebGLKernelValueArray4 } = require('./kernel-value/array4'); +import { WebGLKernelValueArray2 } from './kernel-value/array2'; +import { WebGLKernelValueArray3 } from './kernel-value/array3'; +import { WebGLKernelValueArray4 } from './kernel-value/array4'; -const { WebGLKernelValueUnsignedArray } = require('./kernel-value/unsigned-array'); -const { WebGLKernelValueDynamicUnsignedArray } = require('./kernel-value/dynamic-unsigned-array'); +import { WebGLKernelValueUnsignedArray } from './kernel-value/unsigned-array'; +import { WebGLKernelValueDynamicUnsignedArray } from './kernel-value/dynamic-unsigned-array'; -const kernelValueMaps = { +export const kernelValueMaps = { unsigned: { dynamic: { - 'Boolean': WebGLKernelValueBoolean, - 'Integer': WebGLKernelValueInteger, - 'Float': WebGLKernelValueFloat, - 'Array': WebGLKernelValueDynamicUnsignedArray, + Boolean: WebGLKernelValueBoolean, + Integer: WebGLKernelValueInteger, + Float: WebGLKernelValueFloat, + Array: WebGLKernelValueDynamicUnsignedArray, 'Array(2)': WebGLKernelValueArray2, 'Array(3)': WebGLKernelValueArray3, 'Array(4)': WebGLKernelValueArray4, @@ -58,26 +58,27 @@ const kernelValueMaps = { 'Array3D(2)': false, 'Array3D(3)': false, 'Array3D(4)': false, - 'Input': WebGLKernelValueDynamicUnsignedInput, - 'NumberTexture': WebGLKernelValueDynamicNumberTexture, + Input: WebGLKernelValueDynamicUnsignedInput, + NumberTexture: WebGLKernelValueDynamicNumberTexture, 'ArrayTexture(1)': WebGLKernelValueDynamicNumberTexture, 'ArrayTexture(2)': WebGLKernelValueDynamicNumberTexture, 'ArrayTexture(3)': WebGLKernelValueDynamicNumberTexture, 'ArrayTexture(4)': WebGLKernelValueDynamicNumberTexture, - 'MemoryOptimizedNumberTexture': WebGLKernelValueDynamicMemoryOptimizedNumberTexture, - 'HTMLCanvas': WebGLKernelValueDynamicHTMLImage, - 'OffscreenCanvas': WebGLKernelValueDynamicHTMLImage, - 'HTMLImage': WebGLKernelValueDynamicHTMLImage, - 'ImageBitmap': WebGLKernelValueDynamicHTMLImage, - 'ImageData': WebGLKernelValueDynamicHTMLImage, - 'HTMLImageArray': false, - 'HTMLVideo': WebGLKernelValueDynamicHTMLVideo, + MemoryOptimizedNumberTexture: + WebGLKernelValueDynamicMemoryOptimizedNumberTexture, + HTMLCanvas: WebGLKernelValueDynamicHTMLImage, + OffscreenCanvas: WebGLKernelValueDynamicHTMLImage, + HTMLImage: WebGLKernelValueDynamicHTMLImage, + ImageBitmap: WebGLKernelValueDynamicHTMLImage, + ImageData: WebGLKernelValueDynamicHTMLImage, + HTMLImageArray: false, + HTMLVideo: WebGLKernelValueDynamicHTMLVideo, }, static: { - 'Boolean': WebGLKernelValueBoolean, - 'Float': WebGLKernelValueFloat, - 'Integer': WebGLKernelValueInteger, - 'Array': WebGLKernelValueUnsignedArray, + Boolean: WebGLKernelValueBoolean, + Float: WebGLKernelValueFloat, + Integer: WebGLKernelValueInteger, + Array: WebGLKernelValueUnsignedArray, 'Array(2)': WebGLKernelValueArray2, 'Array(3)': WebGLKernelValueArray3, 'Array(4)': WebGLKernelValueArray4, @@ -90,28 +91,29 @@ const kernelValueMaps = { 'Array3D(2)': false, 'Array3D(3)': false, 'Array3D(4)': false, - 'Input': WebGLKernelValueUnsignedInput, - 'NumberTexture': WebGLKernelValueNumberTexture, + Input: WebGLKernelValueUnsignedInput, + NumberTexture: WebGLKernelValueNumberTexture, 'ArrayTexture(1)': WebGLKernelValueNumberTexture, 'ArrayTexture(2)': WebGLKernelValueNumberTexture, 'ArrayTexture(3)': WebGLKernelValueNumberTexture, 'ArrayTexture(4)': WebGLKernelValueNumberTexture, - 'MemoryOptimizedNumberTexture': WebGLKernelValueMemoryOptimizedNumberTexture, - 'HTMLCanvas': WebGLKernelValueHTMLImage, - 'OffscreenCanvas': WebGLKernelValueHTMLImage, - 'HTMLImage': WebGLKernelValueHTMLImage, - 'ImageBitmap': WebGLKernelValueHTMLImage, - 'ImageData': WebGLKernelValueHTMLImage, - 'HTMLImageArray': false, - 'HTMLVideo': WebGLKernelValueHTMLVideo, - } + MemoryOptimizedNumberTexture: + WebGLKernelValueMemoryOptimizedNumberTexture, + HTMLCanvas: WebGLKernelValueHTMLImage, + OffscreenCanvas: WebGLKernelValueHTMLImage, + HTMLImage: WebGLKernelValueHTMLImage, + ImageBitmap: WebGLKernelValueHTMLImage, + ImageData: WebGLKernelValueHTMLImage, + HTMLImageArray: false, + HTMLVideo: WebGLKernelValueHTMLVideo, + }, }, single: { dynamic: { - 'Boolean': WebGLKernelValueBoolean, - 'Integer': WebGLKernelValueInteger, - 'Float': WebGLKernelValueFloat, - 'Array': WebGLKernelValueDynamicSingleArray, + Boolean: WebGLKernelValueBoolean, + Integer: WebGLKernelValueInteger, + Float: WebGLKernelValueFloat, + Array: WebGLKernelValueDynamicSingleArray, 'Array(2)': WebGLKernelValueArray2, 'Array(3)': WebGLKernelValueArray3, 'Array(4)': WebGLKernelValueArray4, @@ -124,26 +126,27 @@ const kernelValueMaps = { 'Array3D(2)': WebGLKernelValueDynamicSingleArray3DI, 'Array3D(3)': WebGLKernelValueDynamicSingleArray3DI, 'Array3D(4)': WebGLKernelValueDynamicSingleArray3DI, - 'Input': WebGLKernelValueDynamicSingleInput, - 'NumberTexture': WebGLKernelValueDynamicNumberTexture, + Input: WebGLKernelValueDynamicSingleInput, + NumberTexture: WebGLKernelValueDynamicNumberTexture, 'ArrayTexture(1)': WebGLKernelValueDynamicNumberTexture, 'ArrayTexture(2)': WebGLKernelValueDynamicNumberTexture, 'ArrayTexture(3)': WebGLKernelValueDynamicNumberTexture, 'ArrayTexture(4)': WebGLKernelValueDynamicNumberTexture, - 'MemoryOptimizedNumberTexture': WebGLKernelValueDynamicMemoryOptimizedNumberTexture, - 'HTMLCanvas': WebGLKernelValueDynamicHTMLImage, - 'OffscreenCanvas': WebGLKernelValueDynamicHTMLImage, - 'HTMLImage': WebGLKernelValueDynamicHTMLImage, - 'ImageBitmap': WebGLKernelValueDynamicHTMLImage, - 'ImageData': WebGLKernelValueDynamicHTMLImage, - 'HTMLImageArray': false, - 'HTMLVideo': WebGLKernelValueDynamicHTMLVideo, + MemoryOptimizedNumberTexture: + WebGLKernelValueDynamicMemoryOptimizedNumberTexture, + HTMLCanvas: WebGLKernelValueDynamicHTMLImage, + OffscreenCanvas: WebGLKernelValueDynamicHTMLImage, + HTMLImage: WebGLKernelValueDynamicHTMLImage, + ImageBitmap: WebGLKernelValueDynamicHTMLImage, + ImageData: WebGLKernelValueDynamicHTMLImage, + HTMLImageArray: false, + HTMLVideo: WebGLKernelValueDynamicHTMLVideo, }, static: { - 'Boolean': WebGLKernelValueBoolean, - 'Float': WebGLKernelValueFloat, - 'Integer': WebGLKernelValueInteger, - 'Array': WebGLKernelValueSingleArray, + Boolean: WebGLKernelValueBoolean, + Float: WebGLKernelValueFloat, + Integer: WebGLKernelValueInteger, + Array: WebGLKernelValueSingleArray, 'Array(2)': WebGLKernelValueArray2, 'Array(3)': WebGLKernelValueArray3, 'Array(4)': WebGLKernelValueArray4, @@ -156,25 +159,26 @@ const kernelValueMaps = { 'Array3D(2)': WebGLKernelValueSingleArray3DI, 'Array3D(3)': WebGLKernelValueSingleArray3DI, 'Array3D(4)': WebGLKernelValueSingleArray3DI, - 'Input': WebGLKernelValueSingleInput, - 'NumberTexture': WebGLKernelValueNumberTexture, + Input: WebGLKernelValueSingleInput, + NumberTexture: WebGLKernelValueNumberTexture, 'ArrayTexture(1)': WebGLKernelValueNumberTexture, 'ArrayTexture(2)': WebGLKernelValueNumberTexture, 'ArrayTexture(3)': WebGLKernelValueNumberTexture, 'ArrayTexture(4)': WebGLKernelValueNumberTexture, - 'MemoryOptimizedNumberTexture': WebGLKernelValueMemoryOptimizedNumberTexture, - 'HTMLCanvas': WebGLKernelValueHTMLImage, - 'OffscreenCanvas': WebGLKernelValueHTMLImage, - 'HTMLImage': WebGLKernelValueHTMLImage, - 'ImageBitmap': WebGLKernelValueHTMLImage, - 'ImageData': WebGLKernelValueHTMLImage, - 'HTMLImageArray': false, - 'HTMLVideo': WebGLKernelValueHTMLVideo, - } + MemoryOptimizedNumberTexture: + WebGLKernelValueMemoryOptimizedNumberTexture, + HTMLCanvas: WebGLKernelValueHTMLImage, + OffscreenCanvas: WebGLKernelValueHTMLImage, + HTMLImage: WebGLKernelValueHTMLImage, + ImageBitmap: WebGLKernelValueHTMLImage, + ImageData: WebGLKernelValueHTMLImage, + HTMLImageArray: false, + HTMLVideo: WebGLKernelValueHTMLVideo, + }, }, }; -function lookupKernelValueType(type, dynamic, precision, value) { +export function lookupKernelValueType(type, dynamic, precision, value) { if (!type) { throw new Error('type missing'); } @@ -191,12 +195,7 @@ function lookupKernelValueType(type, dynamic, precision, value) { if (types[type] === false) { return null; } else if (types[type] === undefined) { - throw new Error(`Could not find a KernelValue for ${ type }`); + throw new Error(`Could not find a KernelValue for ${type}`); } return types[type]; } - -module.exports = { - lookupKernelValueType, - kernelValueMaps, -}; \ No newline at end of file diff --git a/src/backend/web-gl/kernel-value/array.js b/src/backend/web-gl/kernel-value/array.js index b6e77f2f..04f25ae3 100644 --- a/src/backend/web-gl/kernel-value/array.js +++ b/src/backend/web-gl/kernel-value/array.js @@ -1,10 +1,10 @@ -const { WebGLKernelValue } = require('./index'); -const { Input } = require('../../../input'); +import { WebGLKernelValue } from './index'; +import { Input } from '../../../input'; /** * @abstract */ -class WebGLKernelArray extends WebGLKernelValue { +export class WebGLKernelArray extends WebGLKernelValue { /** * * @param {number} width @@ -15,11 +15,17 @@ class WebGLKernelArray extends WebGLKernelValue { const { maxTextureSize } = this.kernel.constructor.features; if (width > maxTextureSize || height > maxTextureSize) { if (width > height) { - throw new Error(`Argument texture width of ${width} larger than maximum size of ${maxTextureSize} for your GPU`); + throw new Error( + `Argument texture width of ${width} larger than maximum size of ${maxTextureSize} for your GPU` + ); } else if (width < height) { - throw new Error(`Argument texture height of ${height} larger than maximum size of ${maxTextureSize} for your GPU`); + throw new Error( + `Argument texture height of ${height} larger than maximum size of ${maxTextureSize} for your GPU` + ); } else { - throw new Error(`Argument texture height and width of ${height} larger than maximum size of ${maxTextureSize} for your GPU`); + throw new Error( + `Argument texture height and width of ${height} larger than maximum size of ${maxTextureSize} for your GPU` + ); } } } @@ -84,7 +90,3 @@ class WebGLKernelArray extends WebGLKernelValue { this.context.deleteTexture(this.texture); } } - -module.exports = { - WebGLKernelArray -}; \ No newline at end of file diff --git a/src/backend/web-gl/kernel-value/array2.js b/src/backend/web-gl/kernel-value/array2.js index ea4f1467..20ed558c 100644 --- a/src/backend/web-gl/kernel-value/array2.js +++ b/src/backend/web-gl/kernel-value/array2.js @@ -1,6 +1,6 @@ -const { WebGLKernelValue } = require('./index'); +import { WebGLKernelValue } from './index'; -class WebGLKernelValueArray2 extends WebGLKernelValue { +export class WebGLKernelValueArray2 extends WebGLKernelValue { constructor(value, settings) { super(value, settings); this.uploadValue = value; @@ -20,10 +20,6 @@ class WebGLKernelValueArray2 extends WebGLKernelValue { updateValue(value) { if (this.origin === 'constants') return; - this.kernel.setUniform2fv(this.id, this.uploadValue = value); + this.kernel.setUniform2fv(this.id, (this.uploadValue = value)); } } - -module.exports = { - WebGLKernelValueArray2 -}; \ No newline at end of file diff --git a/src/backend/web-gl/kernel-value/array3.js b/src/backend/web-gl/kernel-value/array3.js index 47ad55f8..346e2d3a 100644 --- a/src/backend/web-gl/kernel-value/array3.js +++ b/src/backend/web-gl/kernel-value/array3.js @@ -1,6 +1,6 @@ -const { WebGLKernelValue } = require('./index'); +import { WebGLKernelValue } from './index'; -class WebGLKernelValueArray3 extends WebGLKernelValue { +export class WebGLKernelValueArray3 extends WebGLKernelValue { constructor(value, settings) { super(value, settings); this.uploadValue = value; @@ -20,10 +20,6 @@ class WebGLKernelValueArray3 extends WebGLKernelValue { updateValue(value) { if (this.origin === 'constants') return; - this.kernel.setUniform3fv(this.id, this.uploadValue = value); + this.kernel.setUniform3fv(this.id, (this.uploadValue = value)); } } - -module.exports = { - WebGLKernelValueArray3 -}; \ No newline at end of file diff --git a/src/backend/web-gl/kernel-value/array4.js b/src/backend/web-gl/kernel-value/array4.js index a5556476..0ae91897 100644 --- a/src/backend/web-gl/kernel-value/array4.js +++ b/src/backend/web-gl/kernel-value/array4.js @@ -1,6 +1,6 @@ -const { WebGLKernelValue } = require('./index'); +import { WebGLKernelValue } from './index'; -class WebGLKernelValueArray4 extends WebGLKernelValue { +export class WebGLKernelValueArray4 extends WebGLKernelValue { constructor(value, settings) { super(value, settings); this.uploadValue = value; @@ -20,10 +20,6 @@ class WebGLKernelValueArray4 extends WebGLKernelValue { updateValue(value) { if (this.origin === 'constants') return; - this.kernel.setUniform4fv(this.id, this.uploadValue = value); + this.kernel.setUniform4fv(this.id, (this.uploadValue = value)); } } - -module.exports = { - WebGLKernelValueArray4 -}; \ No newline at end of file diff --git a/src/backend/web-gl/kernel-value/boolean.js b/src/backend/web-gl/kernel-value/boolean.js index 895663d0..3c487b01 100644 --- a/src/backend/web-gl/kernel-value/boolean.js +++ b/src/backend/web-gl/kernel-value/boolean.js @@ -1,7 +1,6 @@ -const { utils } = require('../../../utils'); -const { WebGLKernelValue } = require('./index'); +import { WebGLKernelValue } from './index'; -class WebGLKernelValueBoolean extends WebGLKernelValue { +export class WebGLKernelValueBoolean extends WebGLKernelValue { constructor(value, settings) { super(value, settings); this.uploadValue = value; @@ -19,10 +18,6 @@ class WebGLKernelValueBoolean extends WebGLKernelValue { updateValue(value) { if (this.origin === 'constants') return; - this.kernel.setUniform1i(this.id, this.uploadValue = value); + this.kernel.setUniform1i(this.id, (this.uploadValue = value)); } } - -module.exports = { - WebGLKernelValueBoolean -}; \ No newline at end of file diff --git a/src/backend/web-gl/kernel-value/dynamic-html-image.js b/src/backend/web-gl/kernel-value/dynamic-html-image.js index 926ead66..1b985f21 100644 --- a/src/backend/web-gl/kernel-value/dynamic-html-image.js +++ b/src/backend/web-gl/kernel-value/dynamic-html-image.js @@ -1,7 +1,7 @@ -const { utils } = require('../../../utils'); -const { WebGLKernelValueHTMLImage } = require('./html-image'); +import { utils } from '../../../utils'; +import { WebGLKernelValueHTMLImage } from './html-image'; -class WebGLKernelValueDynamicHTMLImage extends WebGLKernelValueHTMLImage { +export class WebGLKernelValueDynamicHTMLImage extends WebGLKernelValueHTMLImage { getSource() { return utils.linesToString([ `uniform sampler2D ${this.id}`, @@ -20,7 +20,3 @@ class WebGLKernelValueDynamicHTMLImage extends WebGLKernelValueHTMLImage { super.updateValue(value); } } - -module.exports = { - WebGLKernelValueDynamicHTMLImage -}; \ No newline at end of file diff --git a/src/backend/web-gl/kernel-value/dynamic-html-video.js b/src/backend/web-gl/kernel-value/dynamic-html-video.js index a10a00f6..2a8e1b0f 100644 --- a/src/backend/web-gl/kernel-value/dynamic-html-video.js +++ b/src/backend/web-gl/kernel-value/dynamic-html-video.js @@ -1,7 +1,3 @@ -const { WebGLKernelValueDynamicHTMLImage } = require('./dynamic-html-image'); +import { WebGLKernelValueDynamicHTMLImage } from './dynamic-html-image'; -class WebGLKernelValueDynamicHTMLVideo extends WebGLKernelValueDynamicHTMLImage {} - -module.exports = { - WebGLKernelValueDynamicHTMLVideo -}; \ No newline at end of file +export class WebGLKernelValueDynamicHTMLVideo extends WebGLKernelValueDynamicHTMLImage {} diff --git a/src/backend/web-gl/kernel-value/dynamic-memory-optimized-number-texture.js b/src/backend/web-gl/kernel-value/dynamic-memory-optimized-number-texture.js index 0db73297..f093f76c 100644 --- a/src/backend/web-gl/kernel-value/dynamic-memory-optimized-number-texture.js +++ b/src/backend/web-gl/kernel-value/dynamic-memory-optimized-number-texture.js @@ -1,7 +1,7 @@ -const { utils } = require('../../../utils'); -const { WebGLKernelValueMemoryOptimizedNumberTexture } = require('./memory-optimized-number-texture'); +import { utils } from '../../../utils'; +import { WebGLKernelValueMemoryOptimizedNumberTexture } from './memory-optimized-number-texture'; -class WebGLKernelValueDynamicMemoryOptimizedNumberTexture extends WebGLKernelValueMemoryOptimizedNumberTexture { +export class WebGLKernelValueDynamicMemoryOptimizedNumberTexture extends WebGLKernelValueMemoryOptimizedNumberTexture { getSource() { return utils.linesToString([ `uniform sampler2D ${this.id}`, @@ -19,7 +19,3 @@ class WebGLKernelValueDynamicMemoryOptimizedNumberTexture extends WebGLKernelVal super.updateValue(inputTexture); } } - -module.exports = { - WebGLKernelValueDynamicMemoryOptimizedNumberTexture -}; \ No newline at end of file diff --git a/src/backend/web-gl/kernel-value/dynamic-number-texture.js b/src/backend/web-gl/kernel-value/dynamic-number-texture.js index edf5980d..75b18735 100644 --- a/src/backend/web-gl/kernel-value/dynamic-number-texture.js +++ b/src/backend/web-gl/kernel-value/dynamic-number-texture.js @@ -1,7 +1,7 @@ -const { utils } = require('../../../utils'); -const { WebGLKernelValueNumberTexture } = require('./number-texture'); +import { utils } from '../../../utils'; +import { WebGLKernelValueNumberTexture } from './number-texture'; -class WebGLKernelValueDynamicNumberTexture extends WebGLKernelValueNumberTexture { +export class WebGLKernelValueDynamicNumberTexture extends WebGLKernelValueNumberTexture { getSource() { return utils.linesToString([ `uniform sampler2D ${this.id}`, @@ -19,7 +19,3 @@ class WebGLKernelValueDynamicNumberTexture extends WebGLKernelValueNumberTexture super.updateValue(value); } } - -module.exports = { - WebGLKernelValueDynamicNumberTexture -}; \ No newline at end of file diff --git a/src/backend/web-gl/kernel-value/dynamic-single-array.js b/src/backend/web-gl/kernel-value/dynamic-single-array.js index 165fa10a..f27c41c8 100644 --- a/src/backend/web-gl/kernel-value/dynamic-single-array.js +++ b/src/backend/web-gl/kernel-value/dynamic-single-array.js @@ -1,7 +1,7 @@ -const { utils } = require('../../../utils'); -const { WebGLKernelValueSingleArray } = require('./single-array'); +import { utils } from '../../../utils'; +import { WebGLKernelValueSingleArray } from './single-array'; -class WebGLKernelValueDynamicSingleArray extends WebGLKernelValueSingleArray { +export class WebGLKernelValueDynamicSingleArray extends WebGLKernelValueSingleArray { getSource() { return utils.linesToString([ `uniform sampler2D ${this.id}`, @@ -12,8 +12,12 @@ class WebGLKernelValueDynamicSingleArray extends WebGLKernelValueSingleArray { updateValue(value) { this.dimensions = utils.getDimensions(value, true); - this.textureSize = utils.getMemoryOptimizedFloatTextureSize(this.dimensions, this.bitRatio); - this.uploadArrayLength = this.textureSize[0] * this.textureSize[1] * this.bitRatio; + this.textureSize = utils.getMemoryOptimizedFloatTextureSize( + this.dimensions, + this.bitRatio + ); + this.uploadArrayLength = + this.textureSize[0] * this.textureSize[1] * this.bitRatio; this.checkSize(this.textureSize[0], this.textureSize[1]); this.uploadValue = new Float32Array(this.uploadArrayLength); this.kernel.setUniform3iv(this.dimensionsId, this.dimensions); @@ -21,7 +25,3 @@ class WebGLKernelValueDynamicSingleArray extends WebGLKernelValueSingleArray { super.updateValue(value); } } - -module.exports = { - WebGLKernelValueDynamicSingleArray -}; \ No newline at end of file diff --git a/src/backend/web-gl/kernel-value/dynamic-single-array1d-i.js b/src/backend/web-gl/kernel-value/dynamic-single-array1d-i.js index 0c9489ce..338f4e68 100644 --- a/src/backend/web-gl/kernel-value/dynamic-single-array1d-i.js +++ b/src/backend/web-gl/kernel-value/dynamic-single-array1d-i.js @@ -1,7 +1,7 @@ -const { utils } = require('../../../utils'); -const { WebGLKernelValueSingleArray1DI } = require('./single-array1d-i'); +import { utils } from '../../../utils'; +import { WebGLKernelValueSingleArray1DI } from './single-array1d-i'; -class WebGLKernelValueDynamicSingleArray1DI extends WebGLKernelValueSingleArray1DI { +export class WebGLKernelValueDynamicSingleArray1DI extends WebGLKernelValueSingleArray1DI { getSource() { return utils.linesToString([ `uniform sampler2D ${this.id}`, @@ -17,7 +17,3 @@ class WebGLKernelValueDynamicSingleArray1DI extends WebGLKernelValueSingleArray1 super.updateValue(value); } } - -module.exports = { - WebGLKernelValueDynamicSingleArray1DI -}; \ No newline at end of file diff --git a/src/backend/web-gl/kernel-value/dynamic-single-array2d-i.js b/src/backend/web-gl/kernel-value/dynamic-single-array2d-i.js index b164f3c1..28d52727 100644 --- a/src/backend/web-gl/kernel-value/dynamic-single-array2d-i.js +++ b/src/backend/web-gl/kernel-value/dynamic-single-array2d-i.js @@ -1,7 +1,7 @@ -const { utils } = require('../../../utils'); -const { WebGLKernelValueSingleArray2DI } = require('./single-array2d-i'); +import { utils } from '../../../utils'; +import { WebGLKernelValueSingleArray2DI } from './single-array2d-i'; -class WebGLKernelValueDynamicSingleArray2DI extends WebGLKernelValueSingleArray2DI { +export class WebGLKernelValueDynamicSingleArray2DI extends WebGLKernelValueSingleArray2DI { getSource() { return utils.linesToString([ `uniform sampler2D ${this.id}`, @@ -17,7 +17,3 @@ class WebGLKernelValueDynamicSingleArray2DI extends WebGLKernelValueSingleArray2 super.updateValue(value); } } - -module.exports = { - WebGLKernelValueDynamicSingleArray2DI -}; \ No newline at end of file diff --git a/src/backend/web-gl/kernel-value/dynamic-single-array3d-i.js b/src/backend/web-gl/kernel-value/dynamic-single-array3d-i.js index b1d52a5d..2a5c1932 100644 --- a/src/backend/web-gl/kernel-value/dynamic-single-array3d-i.js +++ b/src/backend/web-gl/kernel-value/dynamic-single-array3d-i.js @@ -1,7 +1,7 @@ -const { utils } = require('../../../utils'); -const { WebGLKernelValueSingleArray3DI } = require('./single-array3d-i'); +import { utils } from '../../../utils'; +import { WebGLKernelValueSingleArray3DI } from './single-array3d-i'; -class WebGLKernelValueDynamicSingleArray3DI extends WebGLKernelValueSingleArray3DI { +export class WebGLKernelValueDynamicSingleArray3DI extends WebGLKernelValueSingleArray3DI { getSource() { return utils.linesToString([ `uniform sampler2D ${this.id}`, @@ -17,7 +17,3 @@ class WebGLKernelValueDynamicSingleArray3DI extends WebGLKernelValueSingleArray3 super.updateValue(value); } } - -module.exports = { - WebGLKernelValueDynamicSingleArray3DI -}; \ No newline at end of file diff --git a/src/backend/web-gl/kernel-value/dynamic-single-input.js b/src/backend/web-gl/kernel-value/dynamic-single-input.js index 4c17285d..0331d588 100644 --- a/src/backend/web-gl/kernel-value/dynamic-single-input.js +++ b/src/backend/web-gl/kernel-value/dynamic-single-input.js @@ -1,7 +1,7 @@ -const { utils } = require('../../../utils'); -const { WebGLKernelValueSingleInput } = require('./single-input'); +import { utils } from '../../../utils'; +import { WebGLKernelValueSingleInput } from './single-input'; -class WebGLKernelValueDynamicSingleInput extends WebGLKernelValueSingleInput { +export class WebGLKernelValueDynamicSingleInput extends WebGLKernelValueSingleInput { getSource() { return utils.linesToString([ `uniform sampler2D ${this.id}`, @@ -13,8 +13,12 @@ class WebGLKernelValueDynamicSingleInput extends WebGLKernelValueSingleInput { updateValue(value) { let [w, h, d] = value.size; this.dimensions = new Int32Array([w || 1, h || 1, d || 1]); - this.textureSize = utils.getMemoryOptimizedFloatTextureSize(this.dimensions, this.bitRatio); - this.uploadArrayLength = this.textureSize[0] * this.textureSize[1] * this.bitRatio; + this.textureSize = utils.getMemoryOptimizedFloatTextureSize( + this.dimensions, + this.bitRatio + ); + this.uploadArrayLength = + this.textureSize[0] * this.textureSize[1] * this.bitRatio; this.checkSize(this.textureSize[0], this.textureSize[1]); this.uploadValue = new Float32Array(this.uploadArrayLength); this.kernel.setUniform3iv(this.dimensionsId, this.dimensions); @@ -22,7 +26,3 @@ class WebGLKernelValueDynamicSingleInput extends WebGLKernelValueSingleInput { super.updateValue(value); } } - -module.exports = { - WebGLKernelValueDynamicSingleInput -}; \ No newline at end of file diff --git a/src/backend/web-gl/kernel-value/dynamic-unsigned-array.js b/src/backend/web-gl/kernel-value/dynamic-unsigned-array.js index fb2dd7dd..802b4f07 100644 --- a/src/backend/web-gl/kernel-value/dynamic-unsigned-array.js +++ b/src/backend/web-gl/kernel-value/dynamic-unsigned-array.js @@ -1,7 +1,7 @@ -const { utils } = require('../../../utils'); -const { WebGLKernelValueUnsignedArray } = require('./unsigned-array'); +import { utils } from '../../../utils'; +import { WebGLKernelValueUnsignedArray } from './unsigned-array'; -class WebGLKernelValueDynamicUnsignedArray extends WebGLKernelValueUnsignedArray { +export class WebGLKernelValueDynamicUnsignedArray extends WebGLKernelValueUnsignedArray { getSource() { return utils.linesToString([ `uniform sampler2D ${this.id}`, @@ -12,8 +12,12 @@ class WebGLKernelValueDynamicUnsignedArray extends WebGLKernelValueUnsignedArray updateValue(value) { this.dimensions = utils.getDimensions(value, true); - this.textureSize = utils.getMemoryOptimizedPackedTextureSize(this.dimensions, this.bitRatio); - this.uploadArrayLength = this.textureSize[0] * this.textureSize[1] * (4 / this.bitRatio); + this.textureSize = utils.getMemoryOptimizedPackedTextureSize( + this.dimensions, + this.bitRatio + ); + this.uploadArrayLength = + this.textureSize[0] * this.textureSize[1] * (4 / this.bitRatio); this.checkSize(this.textureSize[0], this.textureSize[1]); const Type = this.getTransferArrayType(value); this.preUploadValue = new Type(this.uploadArrayLength); @@ -23,7 +27,3 @@ class WebGLKernelValueDynamicUnsignedArray extends WebGLKernelValueUnsignedArray super.updateValue(value); } } - -module.exports = { - WebGLKernelValueDynamicUnsignedArray -}; \ No newline at end of file diff --git a/src/backend/web-gl/kernel-value/dynamic-unsigned-input.js b/src/backend/web-gl/kernel-value/dynamic-unsigned-input.js index de16334b..83d236ac 100644 --- a/src/backend/web-gl/kernel-value/dynamic-unsigned-input.js +++ b/src/backend/web-gl/kernel-value/dynamic-unsigned-input.js @@ -1,7 +1,7 @@ -const { utils } = require('../../../utils'); -const { WebGLKernelValueUnsignedInput } = require('./unsigned-input'); +import { utils } from '../../../utils'; +import { WebGLKernelValueUnsignedInput } from './unsigned-input'; -class WebGLKernelValueDynamicUnsignedInput extends WebGLKernelValueUnsignedInput { +export class WebGLKernelValueDynamicUnsignedInput extends WebGLKernelValueUnsignedInput { getSource() { return utils.linesToString([ `uniform sampler2D ${this.id}`, @@ -13,8 +13,12 @@ class WebGLKernelValueDynamicUnsignedInput extends WebGLKernelValueUnsignedInput updateValue(value) { let [w, h, d] = value.size; this.dimensions = new Int32Array([w || 1, h || 1, d || 1]); - this.textureSize = utils.getMemoryOptimizedPackedTextureSize(this.dimensions, this.bitRatio); - this.uploadArrayLength = this.textureSize[0] * this.textureSize[1] * (4 / this.bitRatio); + this.textureSize = utils.getMemoryOptimizedPackedTextureSize( + this.dimensions, + this.bitRatio + ); + this.uploadArrayLength = + this.textureSize[0] * this.textureSize[1] * (4 / this.bitRatio); this.checkSize(this.textureSize[0], this.textureSize[1]); const Type = this.getTransferArrayType(value.value); this.preUploadValue = new Type(this.uploadArrayLength); @@ -24,7 +28,3 @@ class WebGLKernelValueDynamicUnsignedInput extends WebGLKernelValueUnsignedInput super.updateValue(value); } } - -module.exports = { - WebGLKernelValueDynamicUnsignedInput -}; \ No newline at end of file diff --git a/src/backend/web-gl/kernel-value/float.js b/src/backend/web-gl/kernel-value/float.js index 3668bfb6..6591c1b4 100644 --- a/src/backend/web-gl/kernel-value/float.js +++ b/src/backend/web-gl/kernel-value/float.js @@ -1,7 +1,7 @@ -const { utils } = require('../../../utils'); -const { WebGLKernelValue } = require('./index'); +import { utils } from '../../../utils'; +import { WebGLKernelValue } from './index'; -class WebGLKernelValueFloat extends WebGLKernelValue { +export class WebGLKernelValueFloat extends WebGLKernelValue { constructor(value, settings) { super(value, settings); this.uploadValue = value; @@ -21,10 +21,6 @@ class WebGLKernelValueFloat extends WebGLKernelValue { updateValue(value) { if (this.origin === 'constants') return; - this.kernel.setUniform1f(this.id, this.uploadValue = value); + this.kernel.setUniform1f(this.id, (this.uploadValue = value)); } } - -module.exports = { - WebGLKernelValueFloat -}; \ No newline at end of file diff --git a/src/backend/web-gl/kernel-value/html-image.js b/src/backend/web-gl/kernel-value/html-image.js index e0f169c2..308ed2a2 100644 --- a/src/backend/web-gl/kernel-value/html-image.js +++ b/src/backend/web-gl/kernel-value/html-image.js @@ -1,7 +1,7 @@ -const { utils } = require('../../../utils'); -const { WebGLKernelArray } = require('./array'); +import { utils } from '../../../utils'; +import { WebGLKernelArray } from './array'; -class WebGLKernelValueHTMLImage extends WebGLKernelArray { +export class WebGLKernelValueHTMLImage extends WebGLKernelArray { constructor(value, settings) { super(value, settings); const { width, height } = value; @@ -32,11 +32,14 @@ class WebGLKernelValueHTMLImage extends WebGLKernelArray { gl.activeTexture(this.contextHandle); gl.bindTexture(gl.TEXTURE_2D, this.texture); gl.pixelStorei(gl.UNPACK_FLIP_Y_WEBGL, true); - gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, this.uploadValue = inputImage); + gl.texImage2D( + gl.TEXTURE_2D, + 0, + gl.RGBA, + gl.RGBA, + gl.UNSIGNED_BYTE, + (this.uploadValue = inputImage) + ); this.kernel.setUniform1i(this.id, this.index); } } - -module.exports = { - WebGLKernelValueHTMLImage -}; \ No newline at end of file diff --git a/src/backend/web-gl/kernel-value/html-video.js b/src/backend/web-gl/kernel-value/html-video.js index 56165481..f6febe4e 100644 --- a/src/backend/web-gl/kernel-value/html-video.js +++ b/src/backend/web-gl/kernel-value/html-video.js @@ -1,7 +1,3 @@ -const { WebGLKernelValueHTMLImage } = require('./html-image'); +import { WebGLKernelValueHTMLImage } from './html-image'; -class WebGLKernelValueHTMLVideo extends WebGLKernelValueHTMLImage {} - -module.exports = { - WebGLKernelValueHTMLVideo -}; \ No newline at end of file +export class WebGLKernelValueHTMLVideo extends WebGLKernelValueHTMLImage {} diff --git a/src/backend/web-gl/kernel-value/index.js b/src/backend/web-gl/kernel-value/index.js index 671bade1..38a82e92 100644 --- a/src/backend/web-gl/kernel-value/index.js +++ b/src/backend/web-gl/kernel-value/index.js @@ -1,7 +1,7 @@ -const { utils } = require('../../../utils'); -const { KernelValue } = require('../../kernel-value'); +import { utils } from '../../../utils'; +import { KernelValue } from '../../kernel-value'; -class WebGLKernelValue extends KernelValue { +export class WebGLKernelValue extends KernelValue { /** * @param {KernelVariable} value * @param {IWebGLKernelValueSettings} settings @@ -43,7 +43,9 @@ class WebGLKernelValue extends KernelValue { case Float64Array: return value.constructor; } - console.warn('Unfamiliar constructor type. Will go ahead and use, but likley this may result in a transfer of zeros'); + console.warn( + 'Unfamiliar constructor type. Will go ahead and use, but likley this may result in a transfer of zeros' + ); return value.constructor; } @@ -51,16 +53,17 @@ class WebGLKernelValue extends KernelValue { * Used for when we want a string output of our kernel, so we can still input values to the kernel */ getStringValueHandler() { - throw new Error(`"getStringValueHandler" not implemented on ${this.constructor.name}`); + throw new Error( + `"getStringValueHandler" not implemented on ${this.constructor.name}` + ); } getVariablePrecisionString() { - return this.kernel.getVariablePrecisionString(this.textureSize || undefined, this.tactic || undefined); + return this.kernel.getVariablePrecisionString( + this.textureSize || undefined, + this.tactic || undefined + ); } destroy() {} } - -module.exports = { - WebGLKernelValue -}; \ No newline at end of file diff --git a/src/backend/web-gl/kernel-value/integer.js b/src/backend/web-gl/kernel-value/integer.js index c7dad4ac..3c75cad3 100644 --- a/src/backend/web-gl/kernel-value/integer.js +++ b/src/backend/web-gl/kernel-value/integer.js @@ -1,7 +1,6 @@ -const { utils } = require('../../../utils'); -const { WebGLKernelValue } = require('./index'); +import { WebGLKernelValue } from './index'; -class WebGLKernelValueInteger extends WebGLKernelValue { +export class WebGLKernelValueInteger extends WebGLKernelValue { constructor(value, settings) { super(value, settings); this.uploadValue = value; @@ -11,17 +10,13 @@ class WebGLKernelValueInteger extends WebGLKernelValue { } getSource(value) { if (this.origin === 'constants') { - return `const int ${this.id} = ${ parseInt(value) };\n`; + return `const int ${this.id} = ${parseInt(value)};\n`; } return `uniform int ${this.id};\n`; } updateValue(value) { if (this.origin === 'constants') return; - this.kernel.setUniform1i(this.id, this.uploadValue = value); + this.kernel.setUniform1i(this.id, (this.uploadValue = value)); } } - -module.exports = { - WebGLKernelValueInteger -}; \ No newline at end of file diff --git a/src/backend/web-gl/kernel-value/memory-optimized-number-texture.js b/src/backend/web-gl/kernel-value/memory-optimized-number-texture.js index 11193441..c89a54c5 100644 --- a/src/backend/web-gl/kernel-value/memory-optimized-number-texture.js +++ b/src/backend/web-gl/kernel-value/memory-optimized-number-texture.js @@ -1,9 +1,9 @@ -const { utils } = require('../../../utils'); -const { WebGLKernelArray } = require('./array'); +import { utils } from '../../../utils'; +import { WebGLKernelArray } from './array'; -const sameError = `Source and destination textures are the same. Use immutable = true and manually cleanup kernel output texture memory with texture.delete()`; +export const sameError = `Source and destination textures are the same. Use immutable = true and manually cleanup kernel output texture memory with texture.delete()`; -class WebGLKernelValueMemoryOptimizedNumberTexture extends WebGLKernelArray { +export class WebGLKernelValueMemoryOptimizedNumberTexture extends WebGLKernelArray { constructor(value, settings) { super(value, settings); const [width, height] = value.size; @@ -39,7 +39,9 @@ class WebGLKernelValueMemoryOptimizedNumberTexture extends WebGLKernelArray { return; } if (this.checkContext && inputTexture.context !== this.context) { - throw new Error(`Value ${this.name} (${this.type}) must be from same context`); + throw new Error( + `Value ${this.name} (${this.type}) must be from same context` + ); } const { kernel, context: gl } = this; @@ -47,7 +49,10 @@ class WebGLKernelValueMemoryOptimizedNumberTexture extends WebGLKernelArray { if (kernel.immutable) { kernel.updateTextureArgumentRefs(this, inputTexture); } else { - if (kernel.texture && kernel.texture.texture === inputTexture.texture) { + if ( + kernel.texture && + kernel.texture.texture === inputTexture.texture + ) { throw new Error(sameError); } else if (kernel.mappedTextures) { const { mappedTextures } = kernel; @@ -61,12 +66,7 @@ class WebGLKernelValueMemoryOptimizedNumberTexture extends WebGLKernelArray { } gl.activeTexture(this.contextHandle); - gl.bindTexture(gl.TEXTURE_2D, this.uploadValue = inputTexture.texture); + gl.bindTexture(gl.TEXTURE_2D, (this.uploadValue = inputTexture.texture)); this.kernel.setUniform1i(this.id, this.index); } } - -module.exports = { - WebGLKernelValueMemoryOptimizedNumberTexture, - sameError -}; \ No newline at end of file diff --git a/src/backend/web-gl/kernel-value/number-texture.js b/src/backend/web-gl/kernel-value/number-texture.js index 97c43e7d..0c49470c 100644 --- a/src/backend/web-gl/kernel-value/number-texture.js +++ b/src/backend/web-gl/kernel-value/number-texture.js @@ -1,8 +1,8 @@ -const { utils } = require('../../../utils'); -const { WebGLKernelArray } = require('./array'); -const { sameError } = require('./memory-optimized-number-texture'); +import { utils } from '../../../utils'; +import { WebGLKernelArray } from './array'; +import { sameError } from './memory-optimized-number-texture'; -class WebGLKernelValueNumberTexture extends WebGLKernelArray { +export class WebGLKernelValueNumberTexture extends WebGLKernelArray { constructor(value, settings) { super(value, settings); const [width, height] = value.size; @@ -41,7 +41,9 @@ class WebGLKernelValueNumberTexture extends WebGLKernelArray { return; } if (this.checkContext && inputTexture.context !== this.context) { - throw new Error(`Value ${this.name} (${this.type}) must be from same context`); + throw new Error( + `Value ${this.name} (${this.type}) must be from same context` + ); } const { kernel, context: gl } = this; @@ -49,7 +51,10 @@ class WebGLKernelValueNumberTexture extends WebGLKernelArray { if (kernel.immutable) { kernel.updateTextureArgumentRefs(this, inputTexture); } else { - if (kernel.texture && kernel.texture.texture === inputTexture.texture) { + if ( + kernel.texture && + kernel.texture.texture === inputTexture.texture + ) { throw new Error(sameError); } else if (kernel.mappedTextures) { const { mappedTextures } = kernel; @@ -63,11 +68,7 @@ class WebGLKernelValueNumberTexture extends WebGLKernelArray { } gl.activeTexture(this.contextHandle); - gl.bindTexture(gl.TEXTURE_2D, this.uploadValue = inputTexture.texture); + gl.bindTexture(gl.TEXTURE_2D, (this.uploadValue = inputTexture.texture)); this.kernel.setUniform1i(this.id, this.index); } } - -module.exports = { - WebGLKernelValueNumberTexture -}; \ No newline at end of file diff --git a/src/backend/web-gl/kernel-value/single-array.js b/src/backend/web-gl/kernel-value/single-array.js index 1684f283..deddb64d 100644 --- a/src/backend/web-gl/kernel-value/single-array.js +++ b/src/backend/web-gl/kernel-value/single-array.js @@ -1,13 +1,17 @@ -const { utils } = require('../../../utils'); -const { WebGLKernelArray } = require('./array'); +import { utils } from '../../../utils'; +import { WebGLKernelArray } from './array'; -class WebGLKernelValueSingleArray extends WebGLKernelArray { +export class WebGLKernelValueSingleArray extends WebGLKernelArray { constructor(value, settings) { super(value, settings); this.bitRatio = 4; this.dimensions = utils.getDimensions(value, true); - this.textureSize = utils.getMemoryOptimizedFloatTextureSize(this.dimensions, this.bitRatio); - this.uploadArrayLength = this.textureSize[0] * this.textureSize[1] * this.bitRatio; + this.textureSize = utils.getMemoryOptimizedFloatTextureSize( + this.dimensions, + this.bitRatio + ); + this.uploadArrayLength = + this.textureSize[0] * this.textureSize[1] * this.bitRatio; this.checkSize(this.textureSize[0], this.textureSize[1]); this.uploadValue = new Float32Array(this.uploadArrayLength); } @@ -37,11 +41,17 @@ class WebGLKernelValueSingleArray extends WebGLKernelArray { gl.activeTexture(this.contextHandle); gl.bindTexture(gl.TEXTURE_2D, this.texture); gl.pixelStorei(gl.UNPACK_FLIP_Y_WEBGL, false); - gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, this.textureSize[0], this.textureSize[1], 0, gl.RGBA, gl.FLOAT, this.uploadValue); + gl.texImage2D( + gl.TEXTURE_2D, + 0, + gl.RGBA, + this.textureSize[0], + this.textureSize[1], + 0, + gl.RGBA, + gl.FLOAT, + this.uploadValue + ); this.kernel.setUniform1i(this.id, this.index); } } - -module.exports = { - WebGLKernelValueSingleArray -}; \ No newline at end of file diff --git a/src/backend/web-gl/kernel-value/single-array1d-i.js b/src/backend/web-gl/kernel-value/single-array1d-i.js index 0f7e4221..e896b4e4 100644 --- a/src/backend/web-gl/kernel-value/single-array1d-i.js +++ b/src/backend/web-gl/kernel-value/single-array1d-i.js @@ -1,7 +1,7 @@ -const { utils } = require('../../../utils'); -const { WebGLKernelArray } = require('./array'); +import { utils } from '../../../utils'; +import { WebGLKernelArray } from './array'; -class WebGLKernelValueSingleArray1DI extends WebGLKernelArray { +export class WebGLKernelValueSingleArray1DI extends WebGLKernelArray { constructor(value, settings) { super(value, settings); this.bitRatio = 4; @@ -10,9 +10,13 @@ class WebGLKernelValueSingleArray1DI extends WebGLKernelArray { setShape(value) { const valueDimensions = utils.getDimensions(value, true); - this.textureSize = utils.getMemoryOptimizedFloatTextureSize(valueDimensions, this.bitRatio); + this.textureSize = utils.getMemoryOptimizedFloatTextureSize( + valueDimensions, + this.bitRatio + ); this.dimensions = new Int32Array([valueDimensions[1], 1, 1]); - this.uploadArrayLength = this.textureSize[0] * this.textureSize[1] * this.bitRatio; + this.uploadArrayLength = + this.textureSize[0] * this.textureSize[1] * this.bitRatio; this.checkSize(this.textureSize[0], this.textureSize[1]); this.uploadValue = new Float32Array(this.uploadArrayLength); } @@ -42,11 +46,17 @@ class WebGLKernelValueSingleArray1DI extends WebGLKernelArray { gl.activeTexture(this.contextHandle); gl.bindTexture(gl.TEXTURE_2D, this.texture); gl.pixelStorei(gl.UNPACK_FLIP_Y_WEBGL, false); - gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, this.textureSize[0], this.textureSize[1], 0, gl.RGBA, gl.FLOAT, this.uploadValue); + gl.texImage2D( + gl.TEXTURE_2D, + 0, + gl.RGBA, + this.textureSize[0], + this.textureSize[1], + 0, + gl.RGBA, + gl.FLOAT, + this.uploadValue + ); this.kernel.setUniform1i(this.id, this.index); } } - -module.exports = { - WebGLKernelValueSingleArray1DI -}; \ No newline at end of file diff --git a/src/backend/web-gl/kernel-value/single-array2d-i.js b/src/backend/web-gl/kernel-value/single-array2d-i.js index 38bbf1ad..4d6447bb 100644 --- a/src/backend/web-gl/kernel-value/single-array2d-i.js +++ b/src/backend/web-gl/kernel-value/single-array2d-i.js @@ -1,7 +1,7 @@ -const { utils } = require('../../../utils'); -const { WebGLKernelArray } = require('./array'); +import { utils } from '../../../utils'; +import { WebGLKernelArray } from './array'; -class WebGLKernelValueSingleArray2DI extends WebGLKernelArray { +export class WebGLKernelValueSingleArray2DI extends WebGLKernelArray { constructor(value, settings) { super(value, settings); this.bitRatio = 4; @@ -10,9 +10,17 @@ class WebGLKernelValueSingleArray2DI extends WebGLKernelArray { setShape(value) { const valueDimensions = utils.getDimensions(value, true); - this.textureSize = utils.getMemoryOptimizedFloatTextureSize(valueDimensions, this.bitRatio); - this.dimensions = new Int32Array([valueDimensions[1], valueDimensions[2], 1]); - this.uploadArrayLength = this.textureSize[0] * this.textureSize[1] * this.bitRatio; + this.textureSize = utils.getMemoryOptimizedFloatTextureSize( + valueDimensions, + this.bitRatio + ); + this.dimensions = new Int32Array([ + valueDimensions[1], + valueDimensions[2], + 1, + ]); + this.uploadArrayLength = + this.textureSize[0] * this.textureSize[1] * this.bitRatio; this.checkSize(this.textureSize[0], this.textureSize[1]); this.uploadValue = new Float32Array(this.uploadArrayLength); } @@ -42,11 +50,17 @@ class WebGLKernelValueSingleArray2DI extends WebGLKernelArray { gl.activeTexture(this.contextHandle); gl.bindTexture(gl.TEXTURE_2D, this.texture); gl.pixelStorei(gl.UNPACK_FLIP_Y_WEBGL, false); - gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, this.textureSize[0], this.textureSize[1], 0, gl.RGBA, gl.FLOAT, this.uploadValue); + gl.texImage2D( + gl.TEXTURE_2D, + 0, + gl.RGBA, + this.textureSize[0], + this.textureSize[1], + 0, + gl.RGBA, + gl.FLOAT, + this.uploadValue + ); this.kernel.setUniform1i(this.id, this.index); } } - -module.exports = { - WebGLKernelValueSingleArray2DI -}; \ No newline at end of file diff --git a/src/backend/web-gl/kernel-value/single-array3d-i.js b/src/backend/web-gl/kernel-value/single-array3d-i.js index 8992f1bd..c9dc1eac 100644 --- a/src/backend/web-gl/kernel-value/single-array3d-i.js +++ b/src/backend/web-gl/kernel-value/single-array3d-i.js @@ -1,7 +1,7 @@ -const { utils } = require('../../../utils'); -const { WebGLKernelArray } = require('./array'); +import { utils } from '../../../utils'; +import { WebGLKernelArray } from './array'; -class WebGLKernelValueSingleArray3DI extends WebGLKernelArray { +export class WebGLKernelValueSingleArray3DI extends WebGLKernelArray { constructor(value, settings) { super(value, settings); this.bitRatio = 4; @@ -10,9 +10,17 @@ class WebGLKernelValueSingleArray3DI extends WebGLKernelArray { setShape(value) { const valueDimensions = utils.getDimensions(value, true); - this.textureSize = utils.getMemoryOptimizedFloatTextureSize(valueDimensions, this.bitRatio); - this.dimensions = new Int32Array([valueDimensions[1], valueDimensions[2], valueDimensions[3]]); - this.uploadArrayLength = this.textureSize[0] * this.textureSize[1] * this.bitRatio; + this.textureSize = utils.getMemoryOptimizedFloatTextureSize( + valueDimensions, + this.bitRatio + ); + this.dimensions = new Int32Array([ + valueDimensions[1], + valueDimensions[2], + valueDimensions[3], + ]); + this.uploadArrayLength = + this.textureSize[0] * this.textureSize[1] * this.bitRatio; this.checkSize(this.textureSize[0], this.textureSize[1]); this.uploadValue = new Float32Array(this.uploadArrayLength); } @@ -42,11 +50,17 @@ class WebGLKernelValueSingleArray3DI extends WebGLKernelArray { gl.activeTexture(this.contextHandle); gl.bindTexture(gl.TEXTURE_2D, this.texture); gl.pixelStorei(gl.UNPACK_FLIP_Y_WEBGL, false); - gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, this.textureSize[0], this.textureSize[1], 0, gl.RGBA, gl.FLOAT, this.uploadValue); + gl.texImage2D( + gl.TEXTURE_2D, + 0, + gl.RGBA, + this.textureSize[0], + this.textureSize[1], + 0, + gl.RGBA, + gl.FLOAT, + this.uploadValue + ); this.kernel.setUniform1i(this.id, this.index); } } - -module.exports = { - WebGLKernelValueSingleArray3DI -}; \ No newline at end of file diff --git a/src/backend/web-gl/kernel-value/single-input.js b/src/backend/web-gl/kernel-value/single-input.js index a9c3dbaa..a26d2908 100644 --- a/src/backend/web-gl/kernel-value/single-input.js +++ b/src/backend/web-gl/kernel-value/single-input.js @@ -1,14 +1,18 @@ -const { utils } = require('../../../utils'); -const { WebGLKernelArray } = require('./array'); +import { utils } from '../../../utils'; +import { WebGLKernelArray } from './array'; -class WebGLKernelValueSingleInput extends WebGLKernelArray { +export class WebGLKernelValueSingleInput extends WebGLKernelArray { constructor(value, settings) { super(value, settings); this.bitRatio = 4; let [w, h, d] = value.size; this.dimensions = new Int32Array([w || 1, h || 1, d || 1]); - this.textureSize = utils.getMemoryOptimizedFloatTextureSize(this.dimensions, this.bitRatio); - this.uploadArrayLength = this.textureSize[0] * this.textureSize[1] * this.bitRatio; + this.textureSize = utils.getMemoryOptimizedFloatTextureSize( + this.dimensions, + this.bitRatio + ); + this.uploadArrayLength = + this.textureSize[0] * this.textureSize[1] * this.bitRatio; this.checkSize(this.textureSize[0], this.textureSize[1]); this.uploadValue = new Float32Array(this.uploadArrayLength); } @@ -38,11 +42,17 @@ class WebGLKernelValueSingleInput extends WebGLKernelArray { gl.activeTexture(this.contextHandle); gl.bindTexture(gl.TEXTURE_2D, this.texture); gl.pixelStorei(gl.UNPACK_FLIP_Y_WEBGL, false); - gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, this.textureSize[0], this.textureSize[1], 0, gl.RGBA, gl.FLOAT, this.uploadValue); + gl.texImage2D( + gl.TEXTURE_2D, + 0, + gl.RGBA, + this.textureSize[0], + this.textureSize[1], + 0, + gl.RGBA, + gl.FLOAT, + this.uploadValue + ); this.kernel.setUniform1i(this.id, this.index); } } - -module.exports = { - WebGLKernelValueSingleInput -}; \ No newline at end of file diff --git a/src/backend/web-gl/kernel-value/unsigned-array.js b/src/backend/web-gl/kernel-value/unsigned-array.js index 8e52ae9f..34a46e2e 100644 --- a/src/backend/web-gl/kernel-value/unsigned-array.js +++ b/src/backend/web-gl/kernel-value/unsigned-array.js @@ -1,13 +1,17 @@ -const { utils } = require('../../../utils'); -const { WebGLKernelArray } = require('./array'); +import { utils } from '../../../utils'; +import { WebGLKernelArray } from './array'; -class WebGLKernelValueUnsignedArray extends WebGLKernelArray { +export class WebGLKernelValueUnsignedArray extends WebGLKernelArray { constructor(value, settings) { super(value, settings); this.bitRatio = this.getBitRatio(value); this.dimensions = utils.getDimensions(value, true); - this.textureSize = utils.getMemoryOptimizedPackedTextureSize(this.dimensions, this.bitRatio); - this.uploadArrayLength = this.textureSize[0] * this.textureSize[1] * (4 / this.bitRatio); + this.textureSize = utils.getMemoryOptimizedPackedTextureSize( + this.dimensions, + this.bitRatio + ); + this.uploadArrayLength = + this.textureSize[0] * this.textureSize[1] * (4 / this.bitRatio); this.checkSize(this.textureSize[0], this.textureSize[1]); this.TranserArrayType = this.getTransferArrayType(value); this.preUploadValue = new this.TranserArrayType(this.uploadArrayLength); @@ -40,11 +44,17 @@ class WebGLKernelValueUnsignedArray extends WebGLKernelArray { gl.activeTexture(this.contextHandle); gl.bindTexture(gl.TEXTURE_2D, this.texture); gl.pixelStorei(gl.UNPACK_FLIP_Y_WEBGL, false); - gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, this.textureSize[0], this.textureSize[1], 0, gl.RGBA, gl.UNSIGNED_BYTE, this.uploadValue); + gl.texImage2D( + gl.TEXTURE_2D, + 0, + gl.RGBA, + this.textureSize[0], + this.textureSize[1], + 0, + gl.RGBA, + gl.UNSIGNED_BYTE, + this.uploadValue + ); this.kernel.setUniform1i(this.id, this.index); } } - -module.exports = { - WebGLKernelValueUnsignedArray -}; \ No newline at end of file diff --git a/src/backend/web-gl/kernel-value/unsigned-input.js b/src/backend/web-gl/kernel-value/unsigned-input.js index 4370ac77..4ab39d5d 100644 --- a/src/backend/web-gl/kernel-value/unsigned-input.js +++ b/src/backend/web-gl/kernel-value/unsigned-input.js @@ -1,14 +1,18 @@ -const { utils } = require('../../../utils'); -const { WebGLKernelArray } = require('./array'); +import { utils } from '../../../utils'; +import { WebGLKernelArray } from './array'; -class WebGLKernelValueUnsignedInput extends WebGLKernelArray { +export class WebGLKernelValueUnsignedInput extends WebGLKernelArray { constructor(value, settings) { super(value, settings); this.bitRatio = this.getBitRatio(value); const [w, h, d] = value.size; this.dimensions = new Int32Array([w || 1, h || 1, d || 1]); - this.textureSize = utils.getMemoryOptimizedPackedTextureSize(this.dimensions, this.bitRatio); - this.uploadArrayLength = this.textureSize[0] * this.textureSize[1] * (4 / this.bitRatio); + this.textureSize = utils.getMemoryOptimizedPackedTextureSize( + this.dimensions, + this.bitRatio + ); + this.uploadArrayLength = + this.textureSize[0] * this.textureSize[1] * (4 / this.bitRatio); this.checkSize(this.textureSize[0], this.textureSize[1]); this.TranserArrayType = this.getTransferArrayType(value.value); this.preUploadValue = new this.TranserArrayType(this.uploadArrayLength); @@ -41,11 +45,17 @@ class WebGLKernelValueUnsignedInput extends WebGLKernelArray { gl.activeTexture(this.contextHandle); gl.bindTexture(gl.TEXTURE_2D, this.texture); gl.pixelStorei(gl.UNPACK_FLIP_Y_WEBGL, false); - gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, this.textureSize[0], this.textureSize[1], 0, gl.RGBA, gl.UNSIGNED_BYTE, this.uploadValue); + gl.texImage2D( + gl.TEXTURE_2D, + 0, + gl.RGBA, + this.textureSize[0], + this.textureSize[1], + 0, + gl.RGBA, + gl.UNSIGNED_BYTE, + this.uploadValue + ); this.kernel.setUniform1i(this.id, this.index); } } - -module.exports = { - WebGLKernelValueUnsignedInput -}; \ No newline at end of file diff --git a/src/backend/web-gl/kernel.js b/src/backend/web-gl/kernel.js index ffea4705..d994921c 100644 --- a/src/backend/web-gl/kernel.js +++ b/src/backend/web-gl/kernel.js @@ -1,12 +1,12 @@ -const { GLKernel } = require('../gl/kernel'); -const { FunctionBuilder } = require('../function-builder'); -const { WebGLFunctionNode } = require('./function-node'); -const { utils } = require('../../utils'); -const mrud = require('../../plugins/math-random-uniformly-distributed'); -const { fragmentShader } = require('./fragment-shader'); -const { vertexShader } = require('./vertex-shader'); -const { glKernelString } = require('../gl/kernel-string'); -const { lookupKernelValueType } = require('./kernel-value-maps'); +import { GLKernel } from '../gl/kernel'; +import { FunctionBuilder } from '../function-builder'; +import { WebGLFunctionNode } from './function-node'; +import { utils } from '../../utils'; +import mrud from '../../plugins/math-random-uniformly-distributed'; +import { fragmentShader } from './fragment-shader'; +import { vertexShader } from './vertex-shader'; +import { glKernelString } from '../gl/kernel-string'; +import { lookupKernelValueType } from './kernel-value-maps'; let isSupported = null; /** @@ -26,7 +26,6 @@ const plugins = [mrud]; const canvases = []; const maxTexSizes = {}; - /** * @desc Kernel Implementation for WebGL. *

This builds the shaders and runs them on the GPU, @@ -45,7 +44,7 @@ const maxTexSizes = {}; * @property {string|null} compiledVertexShader - Compiled Vertical shader string * @extends GLKernel */ -class WebGLKernel extends GLKernel { +export class WebGLKernel extends GLKernel { static get isSupported() { if (isSupported !== null) { return isSupported; @@ -62,12 +61,18 @@ class WebGLKernel extends GLKernel { testCanvas = new OffscreenCanvas(0, 0); } if (!testCanvas) return; - testContext = testCanvas.getContext('webgl') || testCanvas.getContext('experimental-webgl'); + testContext = + testCanvas.getContext('webgl') || + testCanvas.getContext('experimental-webgl'); if (!testContext || !testContext.getExtension) return; testExtensions = { OES_texture_float: testContext.getExtension('OES_texture_float'), - OES_texture_float_linear: testContext.getExtension('OES_texture_float_linear'), - OES_element_index_uint: testContext.getExtension('OES_element_index_uint'), + OES_texture_float_linear: testContext.getExtension( + 'OES_texture_float_linear' + ), + OES_element_index_uint: testContext.getExtension( + 'OES_element_index_uint' + ), WEBGL_draw_buffers: testContext.getExtension('WEBGL_draw_buffers'), }; features = this.getFeatures(); @@ -89,9 +94,11 @@ class WebGLKernel extends GLKernel { } static getChannelCount() { - return testExtensions.WEBGL_draw_buffers ? - testContext.getParameter(testExtensions.WEBGL_draw_buffers.MAX_DRAW_BUFFERS_WEBGL) : - 1; + return testExtensions.WEBGL_draw_buffers + ? testContext.getParameter( + testExtensions.WEBGL_draw_buffers.MAX_DRAW_BUFFERS_WEBGL + ) + : 1; } static getMaxTextureSize() { @@ -199,9 +206,12 @@ class WebGLKernel extends GLKernel { const settings = { alpha: false, depth: false, - antialias: false + antialias: false, }; - return this.canvas.getContext('webgl', settings) || this.canvas.getContext('experimental-webgl', settings); + return ( + this.canvas.getContext('webgl', settings) || + this.canvas.getContext('experimental-webgl', settings) + ); } /** @@ -222,10 +232,13 @@ class WebGLKernel extends GLKernel { } } else if (typeof source === 'object') { // `source` is from object, json - if (settings.pluginNames) { //TODO: in context of JSON support, pluginNames may not exist here + if (settings.pluginNames) { + //TODO: in context of JSON support, pluginNames may not exist here for (let i = 0; i < plugins.length; i++) { const plugin = plugins[i]; - const usePlugin = settings.pluginNames.some(pluginName => pluginName === plugin.name); + const usePlugin = settings.pluginNames.some( + pluginName => pluginName === plugin.name + ); if (usePlugin) { pluginsToUse.push(plugin); } @@ -238,10 +251,16 @@ class WebGLKernel extends GLKernel { initExtensions() { this.extensions = { OES_texture_float: this.context.getExtension('OES_texture_float'), - OES_texture_float_linear: this.context.getExtension('OES_texture_float_linear'), - OES_element_index_uint: this.context.getExtension('OES_element_index_uint'), + OES_texture_float_linear: this.context.getExtension( + 'OES_texture_float_linear' + ), + OES_element_index_uint: this.context.getExtension( + 'OES_element_index_uint' + ), WEBGL_draw_buffers: this.context.getExtension('WEBGL_draw_buffers'), - WEBGL_color_buffer_float: this.context.getExtension('WEBGL_color_buffer_float'), + WEBGL_color_buffer_float: this.context.getExtension( + 'WEBGL_color_buffer_float' + ), }; } @@ -251,10 +270,13 @@ class WebGLKernel extends GLKernel { */ validateSettings(args) { if (!this.validate) { - this.texSize = utils.getKernelTextureSize({ - optimizeFloatMemory: this.optimizeFloatMemory, - precision: this.precision, - }, this.output); + this.texSize = utils.getKernelTextureSize( + { + optimizeFloatMemory: this.optimizeFloatMemory, + precision: this.precision, + }, + this.output + ); return; } @@ -264,17 +286,28 @@ class WebGLKernel extends GLKernel { throw new Error('Float textures are not supported'); } else if (this.precision === 'single' && !features.isFloatRead) { throw new Error('Single precision not supported'); - } else if (!this.graphical && this.precision === null && features.isTextureFloat) { + } else if ( + !this.graphical && + this.precision === null && + features.isTextureFloat + ) { this.precision = features.isFloatRead ? 'single' : 'unsigned'; } - if (this.subKernels && this.subKernels.length > 0 && !this.extensions.WEBGL_draw_buffers) { + if ( + this.subKernels && + this.subKernels.length > 0 && + !this.extensions.WEBGL_draw_buffers + ) { throw new Error('could not instantiate draw buffers extension'); } if (this.fixIntegerDivisionAccuracy === null) { this.fixIntegerDivisionAccuracy = !features.isIntegerDivisionAccurate; - } else if (this.fixIntegerDivisionAccuracy && features.isIntegerDivisionAccurate) { + } else if ( + this.fixIntegerDivisionAccuracy && + features.isIntegerDivisionAccurate + ) { this.fixIntegerDivisionAccuracy = false; } @@ -282,7 +315,9 @@ class WebGLKernel extends GLKernel { if (!this.output || this.output.length === 0) { if (args.length !== 1) { - throw new Error('Auto output only supported for kernels with only one input'); + throw new Error( + 'Auto output only supported for kernels with only one input' + ); } const argType = utils.getVariableType(args[0], this.strictIntegers); @@ -299,7 +334,9 @@ class WebGLKernel extends GLKernel { this.output = args[0].output; break; default: - throw new Error('Auto output not supported for input type: ' + argType); + throw new Error( + 'Auto output not supported for input type: ' + argType + ); } } @@ -310,7 +347,9 @@ class WebGLKernel extends GLKernel { if (this.precision === 'precision') { this.precision = 'unsigned'; - console.warn('Cannot use graphical mode and single precision at the same time'); + console.warn( + 'Cannot use graphical mode and single precision at the same time' + ); } this.texSize = utils.clone(this.output); @@ -319,10 +358,13 @@ class WebGLKernel extends GLKernel { this.precision = 'single'; } - this.texSize = utils.getKernelTextureSize({ - optimizeFloatMemory: this.optimizeFloatMemory, - precision: this.precision, - }, this.output); + this.texSize = utils.getKernelTextureSize( + { + optimizeFloatMemory: this.optimizeFloatMemory, + precision: this.precision, + }, + this.output + ); this.checkTextureSize(); } @@ -373,14 +415,16 @@ class WebGLKernel extends GLKernel { const onRequestIndex = () => { return this.constantTextureCount + textureIndexes++; }; - const onUpdateValueMismatch = (constructor) => { + const onUpdateValueMismatch = constructor => { this.switchKernels({ type: 'argumentMismatch', - needed: constructor + needed: constructor, }); }; const onRequestContextHandle = () => { - return gl.TEXTURE0 + this.constantTextureCount + this.argumentTextureCount++; + return ( + gl.TEXTURE0 + this.constantTextureCount + this.argumentTextureCount++ + ); }; for (let index = 0; index < args.length; index++) { @@ -393,7 +437,12 @@ class WebGLKernel extends GLKernel { } else { type = this.argumentTypes[index]; } - const KernelValue = this.constructor.lookupKernelValueType(type, this.dynamicArguments ? 'dynamic' : 'static', this.precision, args[index]); + const KernelValue = this.constructor.lookupKernelValueType( + type, + this.dynamicArguments ? 'dynamic' : 'static', + this.precision, + args[index] + ); if (KernelValue === null) { return this.requestFallback(args); } @@ -443,7 +492,12 @@ class WebGLKernel extends GLKernel { } else { type = this.constantTypes[name]; } - const KernelValue = this.constructor.lookupKernelValueType(type, 'static', this.precision, value); + const KernelValue = this.constructor.lookupKernelValueType( + type, + 'static', + this.precision, + value + ); if (KernelValue === null) { return this.requestFallback(args); } @@ -464,7 +518,7 @@ class WebGLKernel extends GLKernel { }, onRequestContextHandle: () => { return gl.TEXTURE0 + this.constantTextureCount++; - } + }, }); this.constantBitRatios[name] = kernelValue.bitRatio; this.kernelConstants.push(kernelValue); @@ -500,7 +554,7 @@ class WebGLKernel extends GLKernel { canvas.width = this.maxTexSize[0]; canvas.height = this.maxTexSize[1]; } - const threadDim = this.threadDim = Array.from(this.output); + const threadDim = (this.threadDim = Array.from(this.output)); while (threadDim.length < 3) { threadDim.push(1); } @@ -523,13 +577,17 @@ class WebGLKernel extends GLKernel { } if (!gl.getShaderParameter(vertShader, gl.COMPILE_STATUS)) { - throw new Error('Error compiling vertex shader: ' + gl.getShaderInfoLog(vertShader)); + throw new Error( + 'Error compiling vertex shader: ' + gl.getShaderInfoLog(vertShader) + ); } if (!gl.getShaderParameter(fragShader, gl.COMPILE_STATUS)) { - throw new Error('Error compiling fragment shader: ' + gl.getShaderInfoLog(fragShader)); + throw new Error( + 'Error compiling fragment shader: ' + gl.getShaderInfoLog(fragShader) + ); } - const program = this.program = gl.createProgram(); + const program = (this.program = gl.createProgram()); gl.attachShader(program, vertShader); gl.attachShader(program, fragShader); gl.linkProgram(program); @@ -538,16 +596,8 @@ class WebGLKernel extends GLKernel { this.framebuffer.height = texSize[1]; this.rawValueFramebuffers = {}; - const vertices = new Float32Array([-1, -1, - 1, -1, -1, 1, - 1, 1 - ]); - const texCoords = new Float32Array([ - 0, 0, - 1, 0, - 0, 1, - 1, 1 - ]); + const vertices = new Float32Array([-1, -1, 1, -1, -1, 1, 1, 1]); + const texCoords = new Float32Array([0, 0, 1, 0, 0, 1, 1, 1]); const texCoordOffset = vertices.byteLength; @@ -555,7 +605,11 @@ class WebGLKernel extends GLKernel { if (!buffer) { buffer = this.buffer = gl.createBuffer(); gl.bindBuffer(gl.ARRAY_BUFFER, buffer); - gl.bufferData(gl.ARRAY_BUFFER, vertices.byteLength + texCoords.byteLength, gl.STATIC_DRAW); + gl.bufferData( + gl.ARRAY_BUFFER, + vertices.byteLength + texCoords.byteLength, + gl.STATIC_DRAW + ); } else { gl.bindBuffer(gl.ARRAY_BUFFER, buffer); } @@ -568,7 +622,14 @@ class WebGLKernel extends GLKernel { gl.vertexAttribPointer(aPosLoc, 2, gl.FLOAT, false, 0, 0); const aTexCoordLoc = gl.getAttribLocation(this.program, 'aTexCoord'); gl.enableVertexAttribArray(aTexCoordLoc); - gl.vertexAttribPointer(aTexCoordLoc, 2, gl.FLOAT, false, 0, texCoordOffset); + gl.vertexAttribPointer( + aTexCoordLoc, + 2, + gl.FLOAT, + false, + 0, + texCoordOffset + ); gl.bindFramebuffer(gl.FRAMEBUFFER, this.framebuffer); let i = 0; @@ -578,10 +639,7 @@ class WebGLKernel extends GLKernel { } this._setupOutputTexture(); - if ( - this.subKernels !== null && - this.subKernels.length > 0 - ) { + if (this.subKernels !== null && this.subKernels.length > 0) { this._mappedTextureSwitched = {}; this._setupSubOutputTextures(); } @@ -590,9 +648,13 @@ class WebGLKernel extends GLKernel { } translateSource() { - const functionBuilder = FunctionBuilder.fromKernel(this, WebGLFunctionNode, { - fixIntegerDivisionAccuracy: this.fixIntegerDivisionAccuracy - }); + const functionBuilder = FunctionBuilder.fromKernel( + this, + WebGLFunctionNode, + { + fixIntegerDivisionAccuracy: this.fixIntegerDivisionAccuracy, + } + ); this.translatedSource = functionBuilder.getPrototypeString('kernel'); this.setupReturnTypes(functionBuilder); } @@ -613,7 +675,12 @@ class WebGLKernel extends GLKernel { } run() { - const { kernelArguments, texSize, forceUploadKernelConstants, context: gl } = this; + const { + kernelArguments, + texSize, + forceUploadKernelConstants, + context: gl, + } = this; gl.useProgram(this.program); gl.scissor(0, 0, texSize[0], texSize[1]); @@ -622,7 +689,11 @@ class WebGLKernel extends GLKernel { this.setUniform2iv('uTexSize', texSize); } - this.setUniform2f('ratio', texSize[0] / this.maxTexSize[0], texSize[1] / this.maxTexSize[1]); + this.setUniform2f( + 'ratio', + texSize[0] / this.maxTexSize[0], + texSize[1] / this.maxTexSize[1] + ); for (let i = 0; i < forceUploadKernelConstants.length; i++) { const constant = forceUploadKernelConstants[i]; @@ -698,7 +769,13 @@ class WebGLKernel extends GLKernel { _replaceOutputTexture() { if (this.texture.beforeMutate() || this._textureSwitched) { const gl = this.context; - gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.texture.texture, 0); + gl.framebufferTexture2D( + gl.FRAMEBUFFER, + gl.COLOR_ATTACHMENT0, + gl.TEXTURE_2D, + this.texture.texture, + 0 + ); this._textureSwitched = false; } } @@ -711,11 +788,19 @@ class WebGLKernel extends GLKernel { const texSize = this.texSize; if (this.texture) { // here we inherit from an already existing kernel, so go ahead and just bind textures to the framebuffer - gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.texture.texture, 0); + gl.framebufferTexture2D( + gl.FRAMEBUFFER, + gl.COLOR_ATTACHMENT0, + gl.TEXTURE_2D, + this.texture.texture, + 0 + ); return; } const texture = this.createTexture(); - gl.activeTexture(gl.TEXTURE0 + this.constantTextureCount + this.argumentTextureCount); + gl.activeTexture( + gl.TEXTURE0 + this.constantTextureCount + this.argumentTextureCount + ); gl.bindTexture(gl.TEXTURE_2D, texture); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE); @@ -723,11 +808,37 @@ class WebGLKernel extends GLKernel { gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.NEAREST); const format = this.getInternalFormat(); if (this.precision === 'single') { - gl.texImage2D(gl.TEXTURE_2D, 0, format, texSize[0], texSize[1], 0, gl.RGBA, gl.FLOAT, null); + gl.texImage2D( + gl.TEXTURE_2D, + 0, + format, + texSize[0], + texSize[1], + 0, + gl.RGBA, + gl.FLOAT, + null + ); } else { - gl.texImage2D(gl.TEXTURE_2D, 0, format, texSize[0], texSize[1], 0, format, gl.UNSIGNED_BYTE, null); + gl.texImage2D( + gl.TEXTURE_2D, + 0, + format, + texSize[0], + texSize[1], + 0, + format, + gl.UNSIGNED_BYTE, + null + ); } - gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, texture, 0); + gl.framebufferTexture2D( + gl.FRAMEBUFFER, + gl.COLOR_ATTACHMENT0, + gl.TEXTURE_2D, + texture, + 0 + ); this.texture = new this.TextureConstructor({ texture, size: texSize, @@ -749,7 +860,13 @@ class WebGLKernel extends GLKernel { for (let i = 0; i < this.mappedTextures.length; i++) { const mappedTexture = this.mappedTextures[i]; if (mappedTexture.beforeMutate() || this._mappedTextureSwitched[i]) { - gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0 + i + 1, gl.TEXTURE_2D, mappedTexture.texture, 0); + gl.framebufferTexture2D( + gl.FRAMEBUFFER, + gl.COLOR_ATTACHMENT0 + i + 1, + gl.TEXTURE_2D, + mappedTexture.texture, + 0 + ); this._mappedTextureSwitched[i] = false; } } @@ -763,7 +880,13 @@ class WebGLKernel extends GLKernel { if (this.mappedTextures) { // here we inherit from an already existing kernel, so go ahead and just bind textures to the framebuffer for (let i = 0; i < this.subKernels.length; i++) { - gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0 + i + 1, gl.TEXTURE_2D, this.mappedTextures[i].texture, 0); + gl.framebufferTexture2D( + gl.FRAMEBUFFER, + gl.COLOR_ATTACHMENT0 + i + 1, + gl.TEXTURE_2D, + this.mappedTextures[i].texture, + 0 + ); } return; } @@ -773,29 +896,59 @@ class WebGLKernel extends GLKernel { for (let i = 0; i < this.subKernels.length; i++) { const texture = this.createTexture(); this.drawBuffersMap.push(gl.COLOR_ATTACHMENT0 + i + 1); - gl.activeTexture(gl.TEXTURE0 + this.constantTextureCount + this.argumentTextureCount + i); + gl.activeTexture( + gl.TEXTURE0 + this.constantTextureCount + this.argumentTextureCount + i + ); gl.bindTexture(gl.TEXTURE_2D, texture); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.NEAREST); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.NEAREST); if (this.precision === 'single') { - gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, texSize[0], texSize[1], 0, gl.RGBA, gl.FLOAT, null); + gl.texImage2D( + gl.TEXTURE_2D, + 0, + gl.RGBA, + texSize[0], + texSize[1], + 0, + gl.RGBA, + gl.FLOAT, + null + ); } else { - gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, texSize[0], texSize[1], 0, gl.RGBA, gl.UNSIGNED_BYTE, null); + gl.texImage2D( + gl.TEXTURE_2D, + 0, + gl.RGBA, + texSize[0], + texSize[1], + 0, + gl.RGBA, + gl.UNSIGNED_BYTE, + null + ); } - gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0 + i + 1, gl.TEXTURE_2D, texture, 0); - - this.mappedTextures.push(new this.TextureConstructor({ + gl.framebufferTexture2D( + gl.FRAMEBUFFER, + gl.COLOR_ATTACHMENT0 + i + 1, + gl.TEXTURE_2D, texture, - size: texSize, - dimensions: this.threadDim, - output: this.output, - context: this.context, - internalFormat: this.getInternalFormat(), - textureFormat: this.getTextureFormat(), - kernel: this, - })); + 0 + ); + + this.mappedTextures.push( + new this.TextureConstructor({ + texture, + size: texSize, + dimensions: this.threadDim, + output: this.output, + context: this.context, + internalFormat: this.getInternalFormat(), + textureFormat: this.getTextureFormat(), + kernel: this, + }) + ); } } @@ -826,10 +979,7 @@ class WebGLKernel extends GLKernel { setUniform2f(name, value1, value2) { if (this.uniform2fCache.hasOwnProperty(name)) { const cache = this.uniform2fCache[name]; - if ( - value1 === cache[0] && - value2 === cache[1] - ) { + if (value1 === cache[0] && value2 === cache[1]) { return; } } @@ -841,10 +991,7 @@ class WebGLKernel extends GLKernel { setUniform2fv(name, value) { if (this.uniform2fvCache.hasOwnProperty(name)) { const cache = this.uniform2fvCache[name]; - if ( - value[0] === cache[0] && - value[1] === cache[1] - ) { + if (value[0] === cache[0] && value[1] === cache[1]) { return; } } @@ -856,10 +1003,7 @@ class WebGLKernel extends GLKernel { setUniform2iv(name, value) { if (this.uniform2ivCache.hasOwnProperty(name)) { const cache = this.uniform2ivCache[name]; - if ( - value[0] === cache[0] && - value[1] === cache[1] - ) { + if (value[0] === cache[0] && value[1] === cache[1]) { return; } } @@ -943,7 +1087,8 @@ class WebGLKernel extends GLKernel { if (this.programUniformLocationCache.hasOwnProperty(name)) { return this.programUniformLocationCache[name]; } - return this.programUniformLocationCache[name] = this.context.getUniformLocation(this.program, name); + return (this.programUniformLocationCache[name] = + this.context.getUniformLocation(this.program, name)); } /** @@ -970,7 +1115,8 @@ class WebGLKernel extends GLKernel { FLOAT_TACTIC_DECLARATION: this.getFloatTacticDeclaration(), INT_TACTIC_DECLARATION: this.getIntTacticDeclaration(), SAMPLER_2D_TACTIC_DECLARATION: this.getSampler2DTacticDeclaration(), - SAMPLER_2D_ARRAY_TACTIC_DECLARATION: this.getSampler2DArrayTacticDeclaration(), + SAMPLER_2D_ARRAY_TACTIC_DECLARATION: + this.getSampler2DArrayTacticDeclaration(), }; } @@ -986,7 +1132,8 @@ class WebGLKernel extends GLKernel { FLOAT_TACTIC_DECLARATION: this.getFloatTacticDeclaration(), INT_TACTIC_DECLARATION: this.getIntTacticDeclaration(), SAMPLER_2D_TACTIC_DECLARATION: this.getSampler2DTacticDeclaration(), - SAMPLER_2D_ARRAY_TACTIC_DECLARATION: this.getSampler2DArrayTacticDeclaration(), + SAMPLER_2D_ARRAY_TACTIC_DECLARATION: + this.getSampler2DArrayTacticDeclaration(), }; } @@ -997,11 +1144,9 @@ class WebGLKernel extends GLKernel { * @returns {String} result */ _getHeaderString() { - return ( - this.subKernels !== null ? - '#extension GL_EXT_draw_buffers : require\n' : - '' - ); + return this.subKernels !== null + ? '#extension GL_EXT_draw_buffers : require\n' + : ''; } /** @@ -1009,16 +1154,20 @@ class WebGLKernel extends GLKernel { * @returns {String} result */ _getLoopMaxString() { - return ( - this.loopMaxIterations ? - ` ${parseInt(this.loopMaxIterations)};\n` : - ' 1000;\n' - ); + return this.loopMaxIterations + ? ` ${parseInt(this.loopMaxIterations)};\n` + : ' 1000;\n'; } _getPluginsString() { if (!this.plugins) return '\n'; - return this.plugins.map(plugin => plugin.source && this.source.match(plugin.functionMatch) ? plugin.source : '').join('\n'); + return this.plugins + .map(plugin => + plugin.source && this.source.match(plugin.functionMatch) + ? plugin.source + : '' + ) + .join('\n'); } /** @@ -1029,10 +1178,7 @@ class WebGLKernel extends GLKernel { const result = []; const { threadDim, texSize } = this; if (this.dynamicOutput) { - result.push( - 'uniform ivec3 uOutputDim', - 'uniform ivec2 uTexSize' - ); + result.push('uniform ivec3 uOutputDim', 'uniform ivec2 uTexSize'); } else { result.push( `ivec3 uOutputDim = ivec3(${threadDim[0]}, ${threadDim[1]}, ${threadDim[2]})`, @@ -1060,11 +1206,7 @@ class WebGLKernel extends GLKernel { * @returns {String} result */ _getDecode32EndiannessString() { - return ( - this.endianness === 'LE' ? - '' : - ' texel.rgba = texel.abgr;\n' - ); + return this.endianness === 'LE' ? '' : ' texel.rgba = texel.abgr;\n'; } /** @@ -1072,11 +1214,7 @@ class WebGLKernel extends GLKernel { * @returns {String} result */ _getEncode32EndiannessString() { - return ( - this.endianness === 'LE' ? - '' : - ' texel.rgba = texel.abgr;\n' - ); + return this.endianness === 'LE' ? '' : ' texel.rgba = texel.abgr;\n'; } /** @@ -1084,8 +1222,8 @@ class WebGLKernel extends GLKernel { * @returns {String} result */ _getDivideWithIntegerCheckString() { - return this.fixIntegerDivisionAccuracy ? - `float divWithIntCheck(float x, float y) { + return this.fixIntegerDivisionAccuracy + ? `float divWithIntCheck(float x, float y) { if (floor(x) == x && floor(y) == y && integerMod(x, y) == 0.0) { return float(int(x) / int(y)); } @@ -1104,8 +1242,8 @@ float integerCorrectionModulo(float number, float divisor) { divisor = abs(divisor); } return number - (divisor * floor(divWithIntCheck(number, divisor))); -}` : - ''; +}` + : ''; } /** @@ -1169,7 +1307,7 @@ float integerCorrectionModulo(float number, float divisor) { if (this.graphical) { return 'float kernelResult'; } else { - throw new Error(`unrecognized output type "${ this.returnType }"`); + throw new Error(`unrecognized output type "${this.returnType}"`); } } } @@ -1188,31 +1326,25 @@ float integerCorrectionModulo(float number, float divisor) { for (let i = 0; i < subKernels.length; i++) { const subKernel = subKernels[i]; result.push( - subKernel.returnType === 'Integer' ? - `int subKernelResult_${ subKernel.name } = 0` : - `float subKernelResult_${ subKernel.name } = 0.0` + subKernel.returnType === 'Integer' + ? `int subKernelResult_${subKernel.name} = 0` + : `float subKernelResult_${subKernel.name} = 0.0` ); } break; case 'Array(2)': for (let i = 0; i < subKernels.length; i++) { - result.push( - `vec2 subKernelResult_${ subKernels[i].name }` - ); + result.push(`vec2 subKernelResult_${subKernels[i].name}`); } break; case 'Array(3)': for (let i = 0; i < subKernels.length; i++) { - result.push( - `vec3 subKernelResult_${ subKernels[i].name }` - ); + result.push(`vec3 subKernelResult_${subKernels[i].name}`); } break; case 'Array(4)': for (let i = 0; i < subKernels.length; i++) { - result.push( - `vec4 subKernelResult_${ subKernels[i].name }` - ); + result.push(`vec4 subKernelResult_${subKernels[i].name}`); } break; } @@ -1235,10 +1367,14 @@ float integerCorrectionModulo(float number, float divisor) { case 'Number': case 'Integer': case 'Float': - return this.getMainResultKernelPackedPixels() + - this.getMainResultSubKernelPackedPixels(); + return ( + this.getMainResultKernelPackedPixels() + + this.getMainResultSubKernelPackedPixels() + ); default: - throw new Error(`packed output only usable with Numbers, "${this.returnType}" specified`); + throw new Error( + `packed output only usable with Numbers, "${this.returnType}" specified` + ); } } @@ -1249,7 +1385,9 @@ float integerCorrectionModulo(float number, float divisor) { return utils.linesToString([ ' threadId = indexTo3D(index, uOutputDim)', ' kernel()', - ` gl_FragData[0] = ${this.useLegacyEncoder ? 'legacyEncode32' : 'encode32'}(kernelResult)` + ` gl_FragData[0] = ${ + this.useLegacyEncoder ? 'legacyEncode32' : 'encode32' + }(kernelResult)`, ]); } @@ -1263,11 +1401,15 @@ float integerCorrectionModulo(float number, float divisor) { const subKernel = this.subKernels[i]; if (subKernel.returnType === 'Integer') { result.push( - ` gl_FragData[${i + 1}] = ${this.useLegacyEncoder ? 'legacyEncode32' : 'encode32'}(float(subKernelResult_${this.subKernels[i].name}))` + ` gl_FragData[${i + 1}] = ${ + this.useLegacyEncoder ? 'legacyEncode32' : 'encode32' + }(float(subKernelResult_${this.subKernels[i].name}))` ); } else { result.push( - ` gl_FragData[${i + 1}] = ${this.useLegacyEncoder ? 'legacyEncode32' : 'encode32'}(subKernelResult_${this.subKernels[i].name})` + ` gl_FragData[${i + 1}] = ${ + this.useLegacyEncoder ? 'legacyEncode32' : 'encode32' + }(subKernelResult_${this.subKernels[i].name})` ); } } @@ -1275,9 +1417,7 @@ float integerCorrectionModulo(float number, float divisor) { } getMainResultMemoryOptimizedFloats() { - const result = [ - ' index *= 4', - ]; + const result = [' index *= 4']; switch (this.returnType) { case 'Number': @@ -1294,7 +1434,9 @@ float integerCorrectionModulo(float number, float divisor) { } break; default: - throw new Error(`optimized output only usable with Numbers, ${this.returnType} specified`); + throw new Error( + `optimized output only usable with Numbers, ${this.returnType} specified` + ); } return utils.linesToString(result); @@ -1314,11 +1456,15 @@ float integerCorrectionModulo(float number, float divisor) { const subKernel = this.subKernels[i]; if (subKernel.returnType === 'Integer') { result.push( - ` gl_FragData[${i + 1}].${channel} = float(subKernelResult_${this.subKernels[i].name})` + ` gl_FragData[${i + 1}].${channel} = float(subKernelResult_${ + this.subKernels[i].name + })` ); } else { result.push( - ` gl_FragData[${i + 1}].${channel} = subKernelResult_${this.subKernels[i].name}` + ` gl_FragData[${i + 1}].${channel} = subKernelResult_${ + this.subKernels[i].name + }` ); } } @@ -1339,7 +1485,9 @@ float integerCorrectionModulo(float number, float divisor) { const subKernel = this.subKernels[i]; if (subKernel.returnType === 'Integer') { result.push( - ` gl_FragData[${i + 1}][0] = float(subKernelResult_${subKernel.name})` + ` gl_FragData[${i + 1}][0] = float(subKernelResult_${ + subKernel.name + })` ); } else { result.push( @@ -1364,8 +1512,12 @@ float integerCorrectionModulo(float number, float divisor) { if (!this.subKernels) return result; for (let i = 0; i < this.subKernels.length; ++i) { result.push( - ` gl_FragData[${i + 1}][0] = subKernelResult_${this.subKernels[i].name}[0]`, - ` gl_FragData[${i + 1}][1] = subKernelResult_${this.subKernels[i].name}[1]` + ` gl_FragData[${i + 1}][0] = subKernelResult_${ + this.subKernels[i].name + }[0]`, + ` gl_FragData[${i + 1}][1] = subKernelResult_${ + this.subKernels[i].name + }[1]` ); } return result; @@ -1386,9 +1538,15 @@ float integerCorrectionModulo(float number, float divisor) { if (!this.subKernels) return result; for (let i = 0; i < this.subKernels.length; ++i) { result.push( - ` gl_FragData[${i + 1}][0] = subKernelResult_${this.subKernels[i].name}[0]`, - ` gl_FragData[${i + 1}][1] = subKernelResult_${this.subKernels[i].name}[1]`, - ` gl_FragData[${i + 1}][2] = subKernelResult_${this.subKernels[i].name}[2]` + ` gl_FragData[${i + 1}][0] = subKernelResult_${ + this.subKernels[i].name + }[0]`, + ` gl_FragData[${i + 1}][1] = subKernelResult_${ + this.subKernels[i].name + }[1]`, + ` gl_FragData[${i + 1}][2] = subKernelResult_${ + this.subKernels[i].name + }[2]` ); } return result; @@ -1413,11 +1571,15 @@ float integerCorrectionModulo(float number, float divisor) { const subKernel = this.subKernels[i]; if (subKernel.returnType === 'Integer') { result.push( - ` gl_FragData[${i + 1}] = float(subKernelResult_${this.subKernels[i].name})` + ` gl_FragData[${i + 1}] = float(subKernelResult_${ + this.subKernels[i].name + })` ); } else { result.push( - ` gl_FragData[${i + 1}] = subKernelResult_${this.subKernels[i].name}` + ` gl_FragData[${i + 1}] = subKernelResult_${ + this.subKernels[i].name + }` ); } } @@ -1425,27 +1587,45 @@ float integerCorrectionModulo(float number, float divisor) { case 'Array(2)': for (let i = 0; i < this.subKernels.length; ++i) { result.push( - ` gl_FragData[${i + 1}][0] = subKernelResult_${this.subKernels[i].name}[0]`, - ` gl_FragData[${i + 1}][1] = subKernelResult_${this.subKernels[i].name}[1]` + ` gl_FragData[${i + 1}][0] = subKernelResult_${ + this.subKernels[i].name + }[0]`, + ` gl_FragData[${i + 1}][1] = subKernelResult_${ + this.subKernels[i].name + }[1]` ); } break; case 'Array(3)': for (let i = 0; i < this.subKernels.length; ++i) { result.push( - ` gl_FragData[${i + 1}][0] = subKernelResult_${this.subKernels[i].name}[0]`, - ` gl_FragData[${i + 1}][1] = subKernelResult_${this.subKernels[i].name}[1]`, - ` gl_FragData[${i + 1}][2] = subKernelResult_${this.subKernels[i].name}[2]` + ` gl_FragData[${i + 1}][0] = subKernelResult_${ + this.subKernels[i].name + }[0]`, + ` gl_FragData[${i + 1}][1] = subKernelResult_${ + this.subKernels[i].name + }[1]`, + ` gl_FragData[${i + 1}][2] = subKernelResult_${ + this.subKernels[i].name + }[2]` ); } break; case 'Array(4)': for (let i = 0; i < this.subKernels.length; ++i) { result.push( - ` gl_FragData[${i + 1}][0] = subKernelResult_${this.subKernels[i].name}[0]`, - ` gl_FragData[${i + 1}][1] = subKernelResult_${this.subKernels[i].name}[1]`, - ` gl_FragData[${i + 1}][2] = subKernelResult_${this.subKernels[i].name}[2]`, - ` gl_FragData[${i + 1}][3] = subKernelResult_${this.subKernels[i].name}[3]` + ` gl_FragData[${i + 1}][0] = subKernelResult_${ + this.subKernels[i].name + }[0]`, + ` gl_FragData[${i + 1}][1] = subKernelResult_${ + this.subKernels[i].name + }[1]`, + ` gl_FragData[${i + 1}][2] = subKernelResult_${ + this.subKernels[i].name + }[2]`, + ` gl_FragData[${i + 1}][3] = subKernelResult_${ + this.subKernels[i].name + }[3]` ); } break; @@ -1459,12 +1639,15 @@ float integerCorrectionModulo(float number, float divisor) { * @param {Object} map - Variables/Constants associated with shader */ replaceArtifacts(src, map) { - return src.replace(/[ ]*__([A-Z]+[0-9]*([_]?[A-Z]*[0-9]?)*)__;\n/g, (match, artifact) => { - if (map.hasOwnProperty(artifact)) { - return map[artifact]; + return src.replace( + /[ ]*__([A-Z]+[0-9]*([_]?[A-Z]*[0-9]?)*)__;\n/g, + (match, artifact) => { + if (map.hasOwnProperty(artifact)) { + return map[artifact]; + } + throw `unhandled artifact ${artifact}`; } - throw `unhandled artifact ${artifact}`; - }); + ); } /** @@ -1479,7 +1662,10 @@ float integerCorrectionModulo(float number, float divisor) { if (this.compiledFragmentShader !== null) { return this.compiledFragmentShader; } - return this.compiledFragmentShader = this.replaceArtifacts(this.constructor.fragmentShader, this._getFragShaderArtifactMap(args)); + return (this.compiledFragmentShader = this.replaceArtifacts( + this.constructor.fragmentShader, + this._getFragShaderArtifactMap(args) + )); } /** @@ -1491,17 +1677,23 @@ float integerCorrectionModulo(float number, float divisor) { if (this.compiledVertexShader !== null) { return this.compiledVertexShader; } - return this.compiledVertexShader = this.replaceArtifacts(this.constructor.vertexShader, this._getVertShaderArtifactMap(args)); + return (this.compiledVertexShader = this.replaceArtifacts( + this.constructor.vertexShader, + this._getVertShaderArtifactMap(args) + )); } /** * @desc Returns the *pre-compiled* Kernel as a JS Object String, that can be reused. */ toString() { - const setupContextString = utils.linesToString([ - `const gl = context`, - ]); - return glKernelString(this.constructor, arguments, this, setupContextString); + const setupContextString = utils.linesToString([`const gl = context`]); + return glKernelString( + this.constructor, + arguments, + this, + setupContextString + ); } destroy(removeCanvasReferences) { @@ -1514,7 +1706,9 @@ float integerCorrectionModulo(float number, float divisor) { } for (const width in this.rawValueFramebuffers) { for (const height in this.rawValueFramebuffers[width]) { - this.context.deleteFramebuffer(this.rawValueFramebuffers[width][height]); + this.context.deleteFramebuffer( + this.rawValueFramebuffers[width][height] + ); delete this.rawValueFramebuffers[width][height]; } delete this.rawValueFramebuffers[width]; @@ -1530,7 +1724,9 @@ float integerCorrectionModulo(float number, float divisor) { } if (this.texture) { this.texture.delete(); - const textureCacheIndex = this.textureCache.indexOf(this.texture.texture); + const textureCacheIndex = this.textureCache.indexOf( + this.texture.texture + ); if (textureCacheIndex > -1) { this.textureCache.splice(textureCacheIndex, 1); } @@ -1540,7 +1736,9 @@ float integerCorrectionModulo(float number, float divisor) { for (let i = 0; i < this.mappedTextures.length; i++) { const mappedTexture = this.mappedTextures[i]; mappedTexture.delete(); - const textureCacheIndex = this.textureCache.indexOf(mappedTexture.texture); + const textureCacheIndex = this.textureCache.indexOf( + mappedTexture.texture + ); if (textureCacheIndex > -1) { this.textureCache.splice(textureCacheIndex, 1); } @@ -1596,12 +1794,11 @@ float integerCorrectionModulo(float number, float divisor) { */ toJSON() { const json = super.toJSON(); - json.functionNodes = FunctionBuilder.fromKernel(this, WebGLFunctionNode).toJSON(); + json.functionNodes = FunctionBuilder.fromKernel( + this, + WebGLFunctionNode + ).toJSON(); json.settings.threadDim = this.threadDim; return json; } } - -module.exports = { - WebGLKernel -}; \ No newline at end of file diff --git a/src/backend/web-gl/vertex-shader.js b/src/backend/web-gl/vertex-shader.js index 88647d73..9e350c36 100644 --- a/src/backend/web-gl/vertex-shader.js +++ b/src/backend/web-gl/vertex-shader.js @@ -1,5 +1,5 @@ // language=GLSL -const vertexShader = `__FLOAT_TACTIC_DECLARATION__; +export const vertexShader = `__FLOAT_TACTIC_DECLARATION__; __INT_TACTIC_DECLARATION__; __SAMPLER_2D_TACTIC_DECLARATION__; @@ -13,7 +13,3 @@ void main(void) { gl_Position = vec4((aPos + vec2(1)) * ratio + vec2(-1), 0, 1); vTexCoord = aTexCoord; }`; - -module.exports = { - vertexShader -}; \ No newline at end of file diff --git a/src/backend/web-gl2/fragment-shader.js b/src/backend/web-gl2/fragment-shader.js index b45a8706..1716fc4c 100644 --- a/src/backend/web-gl2/fragment-shader.js +++ b/src/backend/web-gl2/fragment-shader.js @@ -1,5 +1,5 @@ // language=GLSL -const fragmentShader = `#version 300 es +export const fragmentShader = `#version 300 es __HEADER__; __FLOAT_TACTIC_DECLARATION__; __INT_TACTIC_DECLARATION__; @@ -446,7 +446,3 @@ void main(void) { index = int(vTexCoord.s * float(uTexSize.x)) + int(vTexCoord.t * float(uTexSize.y)) * uTexSize.x; __MAIN_RESULT__; }`; - -module.exports = { - fragmentShader -}; \ No newline at end of file diff --git a/src/backend/web-gl2/function-node.js b/src/backend/web-gl2/function-node.js index 69b96e14..ca4e0b09 100644 --- a/src/backend/web-gl2/function-node.js +++ b/src/backend/web-gl2/function-node.js @@ -1,5 +1,5 @@ -const { utils } = require('../../utils'); -const { WebGLFunctionNode } = require('../web-gl/function-node'); +import { utils } from '../../utils'; +import { WebGLFunctionNode } from '../web-gl/function-node'; /** * @class WebGL2FunctionNode @@ -7,8 +7,7 @@ const { WebGLFunctionNode } = require('../web-gl/function-node'); * @extends WebGLFunctionNode * @returns the converted webGL function string */ -class WebGL2FunctionNode extends WebGLFunctionNode { - +export class WebGL2FunctionNode extends WebGLFunctionNode { /** * @desc Parses the abstract syntax tree for *identifier* expression * @param {Object} idtNode - An ast Node @@ -41,7 +40,3 @@ class WebGL2FunctionNode extends WebGLFunctionNode { return retArr; } } - -module.exports = { - WebGL2FunctionNode -}; \ No newline at end of file diff --git a/src/backend/web-gl2/kernel-value-maps.js b/src/backend/web-gl2/kernel-value-maps.js index 728f592c..a2467913 100644 --- a/src/backend/web-gl2/kernel-value-maps.js +++ b/src/backend/web-gl2/kernel-value-maps.js @@ -1,54 +1,54 @@ -const { WebGL2KernelValueBoolean } = require('./kernel-value/boolean'); -const { WebGL2KernelValueFloat } = require('./kernel-value/float'); -const { WebGL2KernelValueInteger } = require('./kernel-value/integer'); +import { WebGL2KernelValueBoolean } from './kernel-value/boolean'; +import { WebGL2KernelValueFloat } from './kernel-value/float'; +import { WebGL2KernelValueInteger } from './kernel-value/integer'; -const { WebGL2KernelValueHTMLImage } = require('./kernel-value/html-image'); -const { WebGL2KernelValueDynamicHTMLImage } = require('./kernel-value/dynamic-html-image'); +import { WebGL2KernelValueHTMLImage } from './kernel-value/html-image'; +import { WebGL2KernelValueDynamicHTMLImage } from './kernel-value/dynamic-html-image'; -const { WebGL2KernelValueHTMLImageArray } = require('./kernel-value/html-image-array'); -const { WebGL2KernelValueDynamicHTMLImageArray } = require('./kernel-value/dynamic-html-image-array'); +import { WebGL2KernelValueHTMLImageArray } from './kernel-value/html-image-array'; +import { WebGL2KernelValueDynamicHTMLImageArray } from './kernel-value/dynamic-html-image-array'; -const { WebGL2KernelValueHTMLVideo } = require('./kernel-value/html-video'); -const { WebGL2KernelValueDynamicHTMLVideo } = require('./kernel-value/dynamic-html-video'); +import { WebGL2KernelValueHTMLVideo } from './kernel-value/html-video'; +import { WebGL2KernelValueDynamicHTMLVideo } from './kernel-value/dynamic-html-video'; -const { WebGL2KernelValueSingleInput } = require('./kernel-value/single-input'); -const { WebGL2KernelValueDynamicSingleInput } = require('./kernel-value/dynamic-single-input'); +import { WebGL2KernelValueSingleInput } from './kernel-value/single-input'; +import { WebGL2KernelValueDynamicSingleInput } from './kernel-value/dynamic-single-input'; -const { WebGL2KernelValueUnsignedInput } = require('./kernel-value/unsigned-input'); -const { WebGL2KernelValueDynamicUnsignedInput } = require('./kernel-value/dynamic-unsigned-input'); +import { WebGL2KernelValueUnsignedInput } from './kernel-value/unsigned-input'; +import { WebGL2KernelValueDynamicUnsignedInput } from './kernel-value/dynamic-unsigned-input'; -const { WebGL2KernelValueMemoryOptimizedNumberTexture } = require('./kernel-value/memory-optimized-number-texture'); -const { WebGL2KernelValueDynamicMemoryOptimizedNumberTexture } = require('./kernel-value/dynamic-memory-optimized-number-texture'); +import { WebGL2KernelValueMemoryOptimizedNumberTexture } from './kernel-value/memory-optimized-number-texture'; +import { WebGL2KernelValueDynamicMemoryOptimizedNumberTexture } from './kernel-value/dynamic-memory-optimized-number-texture'; -const { WebGL2KernelValueNumberTexture } = require('./kernel-value/number-texture'); -const { WebGL2KernelValueDynamicNumberTexture } = require('./kernel-value/dynamic-number-texture'); +import { WebGL2KernelValueNumberTexture } from './kernel-value/number-texture'; +import { WebGL2KernelValueDynamicNumberTexture } from './kernel-value/dynamic-number-texture'; -const { WebGL2KernelValueSingleArray } = require('./kernel-value/single-array'); -const { WebGL2KernelValueDynamicSingleArray } = require('./kernel-value/dynamic-single-array'); +import { WebGL2KernelValueSingleArray } from './kernel-value/single-array'; +import { WebGL2KernelValueDynamicSingleArray } from './kernel-value/dynamic-single-array'; -const { WebGL2KernelValueSingleArray1DI } = require('./kernel-value/single-array1d-i'); -const { WebGL2KernelValueDynamicSingleArray1DI } = require('./kernel-value/dynamic-single-array1d-i'); +import { WebGL2KernelValueSingleArray1DI } from './kernel-value/single-array1d-i'; +import { WebGL2KernelValueDynamicSingleArray1DI } from './kernel-value/dynamic-single-array1d-i'; -const { WebGL2KernelValueSingleArray2DI } = require('./kernel-value/single-array2d-i'); -const { WebGL2KernelValueDynamicSingleArray2DI } = require('./kernel-value/dynamic-single-array2d-i'); +import { WebGL2KernelValueSingleArray2DI } from './kernel-value/single-array2d-i'; +import { WebGL2KernelValueDynamicSingleArray2DI } from './kernel-value/dynamic-single-array2d-i'; -const { WebGL2KernelValueSingleArray3DI } = require('./kernel-value/single-array3d-i'); -const { WebGL2KernelValueDynamicSingleArray3DI } = require('./kernel-value/dynamic-single-array3d-i'); +import { WebGL2KernelValueSingleArray3DI } from './kernel-value/single-array3d-i'; +import { WebGL2KernelValueDynamicSingleArray3DI } from './kernel-value/dynamic-single-array3d-i'; -const { WebGL2KernelValueArray2 } = require('./kernel-value/array2'); -const { WebGL2KernelValueArray3 } = require('./kernel-value/array3'); -const { WebGL2KernelValueArray4 } = require('./kernel-value/array4'); +import { WebGL2KernelValueArray2 } from './kernel-value/array2'; +import { WebGL2KernelValueArray3 } from './kernel-value/array3'; +import { WebGL2KernelValueArray4 } from './kernel-value/array4'; -const { WebGL2KernelValueUnsignedArray } = require('./kernel-value/unsigned-array'); -const { WebGL2KernelValueDynamicUnsignedArray } = require('./kernel-value/dynamic-unsigned-array'); +import { WebGL2KernelValueUnsignedArray } from './kernel-value/unsigned-array'; +import { WebGL2KernelValueDynamicUnsignedArray } from './kernel-value/dynamic-unsigned-array'; -const kernelValueMaps = { +export const kernelValueMaps = { unsigned: { dynamic: { - 'Boolean': WebGL2KernelValueBoolean, - 'Integer': WebGL2KernelValueInteger, - 'Float': WebGL2KernelValueFloat, - 'Array': WebGL2KernelValueDynamicUnsignedArray, + Boolean: WebGL2KernelValueBoolean, + Integer: WebGL2KernelValueInteger, + Float: WebGL2KernelValueFloat, + Array: WebGL2KernelValueDynamicUnsignedArray, 'Array(2)': WebGL2KernelValueArray2, 'Array(3)': WebGL2KernelValueArray3, 'Array(4)': WebGL2KernelValueArray4, @@ -61,26 +61,27 @@ const kernelValueMaps = { 'Array3D(2)': false, 'Array3D(3)': false, 'Array3D(4)': false, - 'Input': WebGL2KernelValueDynamicUnsignedInput, - 'NumberTexture': WebGL2KernelValueDynamicNumberTexture, + Input: WebGL2KernelValueDynamicUnsignedInput, + NumberTexture: WebGL2KernelValueDynamicNumberTexture, 'ArrayTexture(1)': WebGL2KernelValueDynamicNumberTexture, 'ArrayTexture(2)': WebGL2KernelValueDynamicNumberTexture, 'ArrayTexture(3)': WebGL2KernelValueDynamicNumberTexture, 'ArrayTexture(4)': WebGL2KernelValueDynamicNumberTexture, - 'MemoryOptimizedNumberTexture': WebGL2KernelValueDynamicMemoryOptimizedNumberTexture, - 'HTMLCanvas': WebGL2KernelValueDynamicHTMLImage, - 'OffscreenCanvas': WebGL2KernelValueDynamicHTMLImage, - 'HTMLImage': WebGL2KernelValueDynamicHTMLImage, - 'ImageBitmap': WebGL2KernelValueDynamicHTMLImage, - 'ImageData': WebGL2KernelValueDynamicHTMLImage, - 'HTMLImageArray': WebGL2KernelValueDynamicHTMLImageArray, - 'HTMLVideo': WebGL2KernelValueDynamicHTMLVideo, + MemoryOptimizedNumberTexture: + WebGL2KernelValueDynamicMemoryOptimizedNumberTexture, + HTMLCanvas: WebGL2KernelValueDynamicHTMLImage, + OffscreenCanvas: WebGL2KernelValueDynamicHTMLImage, + HTMLImage: WebGL2KernelValueDynamicHTMLImage, + ImageBitmap: WebGL2KernelValueDynamicHTMLImage, + ImageData: WebGL2KernelValueDynamicHTMLImage, + HTMLImageArray: WebGL2KernelValueDynamicHTMLImageArray, + HTMLVideo: WebGL2KernelValueDynamicHTMLVideo, }, static: { - 'Boolean': WebGL2KernelValueBoolean, - 'Float': WebGL2KernelValueFloat, - 'Integer': WebGL2KernelValueInteger, - 'Array': WebGL2KernelValueUnsignedArray, + Boolean: WebGL2KernelValueBoolean, + Float: WebGL2KernelValueFloat, + Integer: WebGL2KernelValueInteger, + Array: WebGL2KernelValueUnsignedArray, 'Array(2)': WebGL2KernelValueArray2, 'Array(3)': WebGL2KernelValueArray3, 'Array(4)': WebGL2KernelValueArray4, @@ -93,28 +94,29 @@ const kernelValueMaps = { 'Array3D(2)': false, 'Array3D(3)': false, 'Array3D(4)': false, - 'Input': WebGL2KernelValueUnsignedInput, - 'NumberTexture': WebGL2KernelValueNumberTexture, + Input: WebGL2KernelValueUnsignedInput, + NumberTexture: WebGL2KernelValueNumberTexture, 'ArrayTexture(1)': WebGL2KernelValueNumberTexture, 'ArrayTexture(2)': WebGL2KernelValueNumberTexture, 'ArrayTexture(3)': WebGL2KernelValueNumberTexture, 'ArrayTexture(4)': WebGL2KernelValueNumberTexture, - 'MemoryOptimizedNumberTexture': WebGL2KernelValueDynamicMemoryOptimizedNumberTexture, - 'HTMLCanvas': WebGL2KernelValueHTMLImage, - 'OffscreenCanvas': WebGL2KernelValueHTMLImage, - 'HTMLImage': WebGL2KernelValueHTMLImage, - 'ImageBitmap': WebGL2KernelValueHTMLImage, - 'ImageData': WebGL2KernelValueHTMLImage, - 'HTMLImageArray': WebGL2KernelValueHTMLImageArray, - 'HTMLVideo': WebGL2KernelValueHTMLVideo, - } + MemoryOptimizedNumberTexture: + WebGL2KernelValueDynamicMemoryOptimizedNumberTexture, + HTMLCanvas: WebGL2KernelValueHTMLImage, + OffscreenCanvas: WebGL2KernelValueHTMLImage, + HTMLImage: WebGL2KernelValueHTMLImage, + ImageBitmap: WebGL2KernelValueHTMLImage, + ImageData: WebGL2KernelValueHTMLImage, + HTMLImageArray: WebGL2KernelValueHTMLImageArray, + HTMLVideo: WebGL2KernelValueHTMLVideo, + }, }, single: { dynamic: { - 'Boolean': WebGL2KernelValueBoolean, - 'Integer': WebGL2KernelValueInteger, - 'Float': WebGL2KernelValueFloat, - 'Array': WebGL2KernelValueDynamicSingleArray, + Boolean: WebGL2KernelValueBoolean, + Integer: WebGL2KernelValueInteger, + Float: WebGL2KernelValueFloat, + Array: WebGL2KernelValueDynamicSingleArray, 'Array(2)': WebGL2KernelValueArray2, 'Array(3)': WebGL2KernelValueArray3, 'Array(4)': WebGL2KernelValueArray4, @@ -127,26 +129,27 @@ const kernelValueMaps = { 'Array3D(2)': WebGL2KernelValueDynamicSingleArray3DI, 'Array3D(3)': WebGL2KernelValueDynamicSingleArray3DI, 'Array3D(4)': WebGL2KernelValueDynamicSingleArray3DI, - 'Input': WebGL2KernelValueDynamicSingleInput, - 'NumberTexture': WebGL2KernelValueDynamicNumberTexture, + Input: WebGL2KernelValueDynamicSingleInput, + NumberTexture: WebGL2KernelValueDynamicNumberTexture, 'ArrayTexture(1)': WebGL2KernelValueDynamicNumberTexture, 'ArrayTexture(2)': WebGL2KernelValueDynamicNumberTexture, 'ArrayTexture(3)': WebGL2KernelValueDynamicNumberTexture, 'ArrayTexture(4)': WebGL2KernelValueDynamicNumberTexture, - 'MemoryOptimizedNumberTexture': WebGL2KernelValueDynamicMemoryOptimizedNumberTexture, - 'HTMLCanvas': WebGL2KernelValueDynamicHTMLImage, - 'OffscreenCanvas': WebGL2KernelValueDynamicHTMLImage, - 'HTMLImage': WebGL2KernelValueDynamicHTMLImage, - 'ImageBitmap': WebGL2KernelValueDynamicHTMLImage, - 'ImageData': WebGL2KernelValueDynamicHTMLImage, - 'HTMLImageArray': WebGL2KernelValueDynamicHTMLImageArray, - 'HTMLVideo': WebGL2KernelValueDynamicHTMLVideo, + MemoryOptimizedNumberTexture: + WebGL2KernelValueDynamicMemoryOptimizedNumberTexture, + HTMLCanvas: WebGL2KernelValueDynamicHTMLImage, + OffscreenCanvas: WebGL2KernelValueDynamicHTMLImage, + HTMLImage: WebGL2KernelValueDynamicHTMLImage, + ImageBitmap: WebGL2KernelValueDynamicHTMLImage, + ImageData: WebGL2KernelValueDynamicHTMLImage, + HTMLImageArray: WebGL2KernelValueDynamicHTMLImageArray, + HTMLVideo: WebGL2KernelValueDynamicHTMLVideo, }, static: { - 'Boolean': WebGL2KernelValueBoolean, - 'Float': WebGL2KernelValueFloat, - 'Integer': WebGL2KernelValueInteger, - 'Array': WebGL2KernelValueSingleArray, + Boolean: WebGL2KernelValueBoolean, + Float: WebGL2KernelValueFloat, + Integer: WebGL2KernelValueInteger, + Array: WebGL2KernelValueSingleArray, 'Array(2)': WebGL2KernelValueArray2, 'Array(3)': WebGL2KernelValueArray3, 'Array(4)': WebGL2KernelValueArray4, @@ -159,25 +162,26 @@ const kernelValueMaps = { 'Array3D(2)': WebGL2KernelValueSingleArray3DI, 'Array3D(3)': WebGL2KernelValueSingleArray3DI, 'Array3D(4)': WebGL2KernelValueSingleArray3DI, - 'Input': WebGL2KernelValueSingleInput, - 'NumberTexture': WebGL2KernelValueNumberTexture, + Input: WebGL2KernelValueSingleInput, + NumberTexture: WebGL2KernelValueNumberTexture, 'ArrayTexture(1)': WebGL2KernelValueNumberTexture, 'ArrayTexture(2)': WebGL2KernelValueNumberTexture, 'ArrayTexture(3)': WebGL2KernelValueNumberTexture, 'ArrayTexture(4)': WebGL2KernelValueNumberTexture, - 'MemoryOptimizedNumberTexture': WebGL2KernelValueMemoryOptimizedNumberTexture, - 'HTMLCanvas': WebGL2KernelValueHTMLImage, - 'OffscreenCanvas': WebGL2KernelValueHTMLImage, - 'HTMLImage': WebGL2KernelValueHTMLImage, - 'ImageBitmap': WebGL2KernelValueHTMLImage, - 'ImageData': WebGL2KernelValueHTMLImage, - 'HTMLImageArray': WebGL2KernelValueHTMLImageArray, - 'HTMLVideo': WebGL2KernelValueHTMLVideo, - } + MemoryOptimizedNumberTexture: + WebGL2KernelValueMemoryOptimizedNumberTexture, + HTMLCanvas: WebGL2KernelValueHTMLImage, + OffscreenCanvas: WebGL2KernelValueHTMLImage, + HTMLImage: WebGL2KernelValueHTMLImage, + ImageBitmap: WebGL2KernelValueHTMLImage, + ImageData: WebGL2KernelValueHTMLImage, + HTMLImageArray: WebGL2KernelValueHTMLImageArray, + HTMLVideo: WebGL2KernelValueHTMLVideo, + }, }, }; -function lookupKernelValueType(type, dynamic, precision, value) { +export function lookupKernelValueType(type, dynamic, precision, value) { if (!type) { throw new Error('type missing'); } @@ -194,12 +198,7 @@ function lookupKernelValueType(type, dynamic, precision, value) { if (types[type] === false) { return null; } else if (types[type] === undefined) { - throw new Error(`Could not find a KernelValue for ${ type }`); + throw new Error(`Could not find a KernelValue for ${type}`); } return types[type]; } - -module.exports = { - kernelValueMaps, - lookupKernelValueType -}; \ No newline at end of file diff --git a/src/backend/web-gl2/kernel-value/array2.js b/src/backend/web-gl2/kernel-value/array2.js index dc4ffab6..a8872d86 100644 --- a/src/backend/web-gl2/kernel-value/array2.js +++ b/src/backend/web-gl2/kernel-value/array2.js @@ -1,7 +1,3 @@ -const { WebGLKernelValueArray2 } = require('../../web-gl/kernel-value/array2'); +import { WebGLKernelValueArray2 } from '../../web-gl/kernel-value/array2'; -class WebGL2KernelValueArray2 extends WebGLKernelValueArray2 {} - -module.exports = { - WebGL2KernelValueArray2 -}; \ No newline at end of file +export class WebGL2KernelValueArray2 extends WebGLKernelValueArray2 {} diff --git a/src/backend/web-gl2/kernel-value/array3.js b/src/backend/web-gl2/kernel-value/array3.js index 6cf3e26a..98bd819a 100644 --- a/src/backend/web-gl2/kernel-value/array3.js +++ b/src/backend/web-gl2/kernel-value/array3.js @@ -1,7 +1,3 @@ -const { WebGLKernelValueArray3 } = require('../../web-gl/kernel-value/array3'); +import { WebGLKernelValueArray3 } from '../../web-gl/kernel-value/array3'; -class WebGL2KernelValueArray3 extends WebGLKernelValueArray3 {} - -module.exports = { - WebGL2KernelValueArray3 -}; \ No newline at end of file +export class WebGL2KernelValueArray3 extends WebGLKernelValueArray3 {} diff --git a/src/backend/web-gl2/kernel-value/array4.js b/src/backend/web-gl2/kernel-value/array4.js index 839613ca..1481a098 100644 --- a/src/backend/web-gl2/kernel-value/array4.js +++ b/src/backend/web-gl2/kernel-value/array4.js @@ -1,7 +1,3 @@ -const { WebGLKernelValueArray4 } = require('../../web-gl/kernel-value/array4'); +import { WebGLKernelValueArray4 } from '../../web-gl/kernel-value/array4'; -class WebGL2KernelValueArray4 extends WebGLKernelValueArray4 {} - -module.exports = { - WebGL2KernelValueArray4 -}; \ No newline at end of file +export class WebGL2KernelValueArray4 extends WebGLKernelValueArray4 {} diff --git a/src/backend/web-gl2/kernel-value/boolean.js b/src/backend/web-gl2/kernel-value/boolean.js index c91a61a9..b77933a0 100644 --- a/src/backend/web-gl2/kernel-value/boolean.js +++ b/src/backend/web-gl2/kernel-value/boolean.js @@ -1,7 +1,3 @@ -const { WebGLKernelValueBoolean } = require('../../web-gl/kernel-value/boolean'); +import { WebGLKernelValueBoolean } from '../../web-gl/kernel-value/boolean'; -class WebGL2KernelValueBoolean extends WebGLKernelValueBoolean {} - -module.exports = { - WebGL2KernelValueBoolean -}; \ No newline at end of file +export class WebGL2KernelValueBoolean extends WebGLKernelValueBoolean {} diff --git a/src/backend/web-gl2/kernel-value/dynamic-html-image-array.js b/src/backend/web-gl2/kernel-value/dynamic-html-image-array.js index 2ee88b4f..efece4b3 100644 --- a/src/backend/web-gl2/kernel-value/dynamic-html-image-array.js +++ b/src/backend/web-gl2/kernel-value/dynamic-html-image-array.js @@ -1,13 +1,13 @@ -const { utils } = require('../../../utils'); -const { WebGL2KernelValueHTMLImageArray } = require('./html-image-array'); +import { utils } from '../../../utils'; +import { WebGL2KernelValueHTMLImageArray } from './html-image-array'; -class WebGL2KernelValueDynamicHTMLImageArray extends WebGL2KernelValueHTMLImageArray { +export class WebGL2KernelValueDynamicHTMLImageArray extends WebGL2KernelValueHTMLImageArray { getSource() { const variablePrecision = this.getVariablePrecisionString(); return utils.linesToString([ - `uniform ${ variablePrecision } sampler2DArray ${this.id}`, - `uniform ${ variablePrecision } ivec2 ${this.sizeId}`, - `uniform ${ variablePrecision } ivec3 ${this.dimensionsId}`, + `uniform ${variablePrecision} sampler2DArray ${this.id}`, + `uniform ${variablePrecision} ivec2 ${this.sizeId}`, + `uniform ${variablePrecision} ivec3 ${this.dimensionsId}`, ]); } @@ -21,7 +21,3 @@ class WebGL2KernelValueDynamicHTMLImageArray extends WebGL2KernelValueHTMLImageA super.updateValue(images); } } - -module.exports = { - WebGL2KernelValueDynamicHTMLImageArray -}; \ No newline at end of file diff --git a/src/backend/web-gl2/kernel-value/dynamic-html-image.js b/src/backend/web-gl2/kernel-value/dynamic-html-image.js index f1ba34eb..4397b7bd 100644 --- a/src/backend/web-gl2/kernel-value/dynamic-html-image.js +++ b/src/backend/web-gl2/kernel-value/dynamic-html-image.js @@ -1,17 +1,13 @@ -const { utils } = require('../../../utils'); -const { WebGLKernelValueDynamicHTMLImage } = require('../../web-gl/kernel-value/dynamic-html-image'); +import { utils } from '../../../utils'; +import { WebGLKernelValueDynamicHTMLImage } from '../../web-gl/kernel-value/dynamic-html-image'; -class WebGL2KernelValueDynamicHTMLImage extends WebGLKernelValueDynamicHTMLImage { +export class WebGL2KernelValueDynamicHTMLImage extends WebGLKernelValueDynamicHTMLImage { getSource() { const variablePrecision = this.getVariablePrecisionString(); return utils.linesToString([ - `uniform ${ variablePrecision } sampler2D ${this.id}`, - `uniform ${ variablePrecision } ivec2 ${this.sizeId}`, - `uniform ${ variablePrecision } ivec3 ${this.dimensionsId}`, + `uniform ${variablePrecision} sampler2D ${this.id}`, + `uniform ${variablePrecision} ivec2 ${this.sizeId}`, + `uniform ${variablePrecision} ivec3 ${this.dimensionsId}`, ]); } } - -module.exports = { - WebGL2KernelValueDynamicHTMLImage -}; \ No newline at end of file diff --git a/src/backend/web-gl2/kernel-value/dynamic-html-video.js b/src/backend/web-gl2/kernel-value/dynamic-html-video.js index 00f723d1..1f83c368 100644 --- a/src/backend/web-gl2/kernel-value/dynamic-html-video.js +++ b/src/backend/web-gl2/kernel-value/dynamic-html-video.js @@ -1,8 +1,3 @@ -const { utils } = require('../../../utils'); -const { WebGL2KernelValueDynamicHTMLImage } = require('./dynamic-html-image'); +import { WebGL2KernelValueDynamicHTMLImage } from './dynamic-html-image'; -class WebGL2KernelValueDynamicHTMLVideo extends WebGL2KernelValueDynamicHTMLImage {} - -module.exports = { - WebGL2KernelValueDynamicHTMLVideo -}; \ No newline at end of file +export class WebGL2KernelValueDynamicHTMLVideo extends WebGL2KernelValueDynamicHTMLImage {} diff --git a/src/backend/web-gl2/kernel-value/dynamic-memory-optimized-number-texture.js b/src/backend/web-gl2/kernel-value/dynamic-memory-optimized-number-texture.js index 5e3cff4b..5a536767 100644 --- a/src/backend/web-gl2/kernel-value/dynamic-memory-optimized-number-texture.js +++ b/src/backend/web-gl2/kernel-value/dynamic-memory-optimized-number-texture.js @@ -1,7 +1,7 @@ -const { utils } = require('../../../utils'); -const { WebGLKernelValueDynamicMemoryOptimizedNumberTexture } = require('../../web-gl/kernel-value/dynamic-memory-optimized-number-texture'); +import { utils } from '../../../utils'; +import { WebGLKernelValueDynamicMemoryOptimizedNumberTexture } from '../../web-gl/kernel-value/dynamic-memory-optimized-number-texture'; -class WebGL2KernelValueDynamicMemoryOptimizedNumberTexture extends WebGLKernelValueDynamicMemoryOptimizedNumberTexture { +export class WebGL2KernelValueDynamicMemoryOptimizedNumberTexture extends WebGLKernelValueDynamicMemoryOptimizedNumberTexture { getSource() { return utils.linesToString([ `uniform sampler2D ${this.id}`, @@ -10,7 +10,3 @@ class WebGL2KernelValueDynamicMemoryOptimizedNumberTexture extends WebGLKernelVa ]); } } - -module.exports = { - WebGL2KernelValueDynamicMemoryOptimizedNumberTexture -}; \ No newline at end of file diff --git a/src/backend/web-gl2/kernel-value/dynamic-number-texture.js b/src/backend/web-gl2/kernel-value/dynamic-number-texture.js index e3820a56..ad900156 100644 --- a/src/backend/web-gl2/kernel-value/dynamic-number-texture.js +++ b/src/backend/web-gl2/kernel-value/dynamic-number-texture.js @@ -1,17 +1,13 @@ -const { utils } = require('../../../utils'); -const { WebGLKernelValueDynamicNumberTexture } = require('../../web-gl/kernel-value/dynamic-number-texture'); +import { utils } from '../../../utils'; +import { WebGLKernelValueDynamicNumberTexture } from '../../web-gl/kernel-value/dynamic-number-texture'; -class WebGL2KernelValueDynamicNumberTexture extends WebGLKernelValueDynamicNumberTexture { +export class WebGL2KernelValueDynamicNumberTexture extends WebGLKernelValueDynamicNumberTexture { getSource() { const variablePrecision = this.getVariablePrecisionString(); return utils.linesToString([ - `uniform ${ variablePrecision } sampler2D ${this.id}`, - `uniform ${ variablePrecision } ivec2 ${this.sizeId}`, - `uniform ${ variablePrecision } ivec3 ${this.dimensionsId}`, + `uniform ${variablePrecision} sampler2D ${this.id}`, + `uniform ${variablePrecision} ivec2 ${this.sizeId}`, + `uniform ${variablePrecision} ivec3 ${this.dimensionsId}`, ]); } } - -module.exports = { - WebGL2KernelValueDynamicNumberTexture -}; \ No newline at end of file diff --git a/src/backend/web-gl2/kernel-value/dynamic-single-array.js b/src/backend/web-gl2/kernel-value/dynamic-single-array.js index 7278317d..07382f59 100644 --- a/src/backend/web-gl2/kernel-value/dynamic-single-array.js +++ b/src/backend/web-gl2/kernel-value/dynamic-single-array.js @@ -1,20 +1,24 @@ -const { utils } = require('../../../utils'); -const { WebGL2KernelValueSingleArray } = require('../../web-gl2/kernel-value/single-array'); +import { utils } from '../../../utils'; +import { WebGL2KernelValueSingleArray } from '../../web-gl2/kernel-value/single-array'; -class WebGL2KernelValueDynamicSingleArray extends WebGL2KernelValueSingleArray { +export class WebGL2KernelValueDynamicSingleArray extends WebGL2KernelValueSingleArray { getSource() { const variablePrecision = this.getVariablePrecisionString(); return utils.linesToString([ - `uniform ${ variablePrecision } sampler2D ${this.id}`, - `uniform ${ variablePrecision } ivec2 ${this.sizeId}`, - `uniform ${ variablePrecision } ivec3 ${this.dimensionsId}`, + `uniform ${variablePrecision} sampler2D ${this.id}`, + `uniform ${variablePrecision} ivec2 ${this.sizeId}`, + `uniform ${variablePrecision} ivec3 ${this.dimensionsId}`, ]); } updateValue(value) { this.dimensions = utils.getDimensions(value, true); - this.textureSize = utils.getMemoryOptimizedFloatTextureSize(this.dimensions, this.bitRatio); - this.uploadArrayLength = this.textureSize[0] * this.textureSize[1] * this.bitRatio; + this.textureSize = utils.getMemoryOptimizedFloatTextureSize( + this.dimensions, + this.bitRatio + ); + this.uploadArrayLength = + this.textureSize[0] * this.textureSize[1] * this.bitRatio; this.checkSize(this.textureSize[0], this.textureSize[1]); this.uploadValue = new Float32Array(this.uploadArrayLength); this.kernel.setUniform3iv(this.dimensionsId, this.dimensions); @@ -22,7 +26,3 @@ class WebGL2KernelValueDynamicSingleArray extends WebGL2KernelValueSingleArray { super.updateValue(value); } } - -module.exports = { - WebGL2KernelValueDynamicSingleArray -}; \ No newline at end of file diff --git a/src/backend/web-gl2/kernel-value/dynamic-single-array1d-i.js b/src/backend/web-gl2/kernel-value/dynamic-single-array1d-i.js index 45203f92..0a4c939e 100644 --- a/src/backend/web-gl2/kernel-value/dynamic-single-array1d-i.js +++ b/src/backend/web-gl2/kernel-value/dynamic-single-array1d-i.js @@ -1,13 +1,13 @@ -const { utils } = require('../../../utils'); -const { WebGL2KernelValueSingleArray1DI } = require('../../web-gl2/kernel-value/single-array1d-i'); +import { utils } from '../../../utils'; +import { WebGL2KernelValueSingleArray1DI } from '../../web-gl2/kernel-value/single-array1d-i'; -class WebGL2KernelValueDynamicSingleArray1DI extends WebGL2KernelValueSingleArray1DI { +export class WebGL2KernelValueDynamicSingleArray1DI extends WebGL2KernelValueSingleArray1DI { getSource() { const variablePrecision = this.getVariablePrecisionString(); return utils.linesToString([ - `uniform ${ variablePrecision } sampler2D ${this.id}`, - `uniform ${ variablePrecision } ivec2 ${this.sizeId}`, - `uniform ${ variablePrecision } ivec3 ${this.dimensionsId}`, + `uniform ${variablePrecision} sampler2D ${this.id}`, + `uniform ${variablePrecision} ivec2 ${this.sizeId}`, + `uniform ${variablePrecision} ivec3 ${this.dimensionsId}`, ]); } @@ -18,7 +18,3 @@ class WebGL2KernelValueDynamicSingleArray1DI extends WebGL2KernelValueSingleArra super.updateValue(value); } } - -module.exports = { - WebGL2KernelValueDynamicSingleArray1DI -}; \ No newline at end of file diff --git a/src/backend/web-gl2/kernel-value/dynamic-single-array2d-i.js b/src/backend/web-gl2/kernel-value/dynamic-single-array2d-i.js index d80f712d..78bb2a7d 100644 --- a/src/backend/web-gl2/kernel-value/dynamic-single-array2d-i.js +++ b/src/backend/web-gl2/kernel-value/dynamic-single-array2d-i.js @@ -1,13 +1,13 @@ -const { utils } = require('../../../utils'); -const { WebGL2KernelValueSingleArray2DI } = require('../../web-gl2/kernel-value/single-array2d-i'); +import { utils } from '../../../utils'; +import { WebGL2KernelValueSingleArray2DI } from '../../web-gl2/kernel-value/single-array2d-i'; -class WebGL2KernelValueDynamicSingleArray2DI extends WebGL2KernelValueSingleArray2DI { +export class WebGL2KernelValueDynamicSingleArray2DI extends WebGL2KernelValueSingleArray2DI { getSource() { const variablePrecision = this.getVariablePrecisionString(); return utils.linesToString([ - `uniform ${ variablePrecision } sampler2D ${this.id}`, - `uniform ${ variablePrecision } ivec2 ${this.sizeId}`, - `uniform ${ variablePrecision } ivec3 ${this.dimensionsId}`, + `uniform ${variablePrecision} sampler2D ${this.id}`, + `uniform ${variablePrecision} ivec2 ${this.sizeId}`, + `uniform ${variablePrecision} ivec3 ${this.dimensionsId}`, ]); } @@ -18,7 +18,3 @@ class WebGL2KernelValueDynamicSingleArray2DI extends WebGL2KernelValueSingleArra super.updateValue(value); } } - -module.exports = { - WebGL2KernelValueDynamicSingleArray2DI -}; \ No newline at end of file diff --git a/src/backend/web-gl2/kernel-value/dynamic-single-array3d-i.js b/src/backend/web-gl2/kernel-value/dynamic-single-array3d-i.js index 15f79ba4..7890be03 100644 --- a/src/backend/web-gl2/kernel-value/dynamic-single-array3d-i.js +++ b/src/backend/web-gl2/kernel-value/dynamic-single-array3d-i.js @@ -1,13 +1,13 @@ -const { utils } = require('../../../utils'); -const { WebGL2KernelValueSingleArray3DI } = require('../../web-gl2/kernel-value/single-array3d-i'); +import { utils } from '../../../utils'; +import { WebGL2KernelValueSingleArray3DI } from '../../web-gl2/kernel-value/single-array3d-i'; -class WebGL2KernelValueDynamicSingleArray3DI extends WebGL2KernelValueSingleArray3DI { +export class WebGL2KernelValueDynamicSingleArray3DI extends WebGL2KernelValueSingleArray3DI { getSource() { const variablePrecision = this.getVariablePrecisionString(); return utils.linesToString([ - `uniform ${ variablePrecision } sampler2D ${this.id}`, - `uniform ${ variablePrecision } ivec2 ${this.sizeId}`, - `uniform ${ variablePrecision } ivec3 ${this.dimensionsId}`, + `uniform ${variablePrecision} sampler2D ${this.id}`, + `uniform ${variablePrecision} ivec2 ${this.sizeId}`, + `uniform ${variablePrecision} ivec3 ${this.dimensionsId}`, ]); } @@ -18,7 +18,3 @@ class WebGL2KernelValueDynamicSingleArray3DI extends WebGL2KernelValueSingleArra super.updateValue(value); } } - -module.exports = { - WebGL2KernelValueDynamicSingleArray3DI -}; \ No newline at end of file diff --git a/src/backend/web-gl2/kernel-value/dynamic-single-input.js b/src/backend/web-gl2/kernel-value/dynamic-single-input.js index 21fa5b31..e2fe650c 100644 --- a/src/backend/web-gl2/kernel-value/dynamic-single-input.js +++ b/src/backend/web-gl2/kernel-value/dynamic-single-input.js @@ -1,21 +1,25 @@ -const { utils } = require('../../../utils'); -const { WebGL2KernelValueSingleInput } = require('../../web-gl2/kernel-value/single-input'); +import { utils } from '../../../utils'; +import { WebGL2KernelValueSingleInput } from '../../web-gl2/kernel-value/single-input'; -class WebGL2KernelValueDynamicSingleInput extends WebGL2KernelValueSingleInput { +export class WebGL2KernelValueDynamicSingleInput extends WebGL2KernelValueSingleInput { getSource() { const variablePrecision = this.getVariablePrecisionString(); return utils.linesToString([ - `uniform ${ variablePrecision } sampler2D ${this.id}`, - `uniform ${ variablePrecision } ivec2 ${this.sizeId}`, - `uniform ${ variablePrecision } ivec3 ${this.dimensionsId}`, + `uniform ${variablePrecision} sampler2D ${this.id}`, + `uniform ${variablePrecision} ivec2 ${this.sizeId}`, + `uniform ${variablePrecision} ivec3 ${this.dimensionsId}`, ]); } updateValue(value) { let [w, h, d] = value.size; this.dimensions = new Int32Array([w || 1, h || 1, d || 1]); - this.textureSize = utils.getMemoryOptimizedFloatTextureSize(this.dimensions, this.bitRatio); - this.uploadArrayLength = this.textureSize[0] * this.textureSize[1] * this.bitRatio; + this.textureSize = utils.getMemoryOptimizedFloatTextureSize( + this.dimensions, + this.bitRatio + ); + this.uploadArrayLength = + this.textureSize[0] * this.textureSize[1] * this.bitRatio; this.checkSize(this.textureSize[0], this.textureSize[1]); this.uploadValue = new Float32Array(this.uploadArrayLength); this.kernel.setUniform3iv(this.dimensionsId, this.dimensions); @@ -23,7 +27,3 @@ class WebGL2KernelValueDynamicSingleInput extends WebGL2KernelValueSingleInput { super.updateValue(value); } } - -module.exports = { - WebGL2KernelValueDynamicSingleInput -}; \ No newline at end of file diff --git a/src/backend/web-gl2/kernel-value/dynamic-unsigned-array.js b/src/backend/web-gl2/kernel-value/dynamic-unsigned-array.js index 514682c5..2e24ca70 100644 --- a/src/backend/web-gl2/kernel-value/dynamic-unsigned-array.js +++ b/src/backend/web-gl2/kernel-value/dynamic-unsigned-array.js @@ -1,17 +1,13 @@ -const { utils } = require('../../../utils'); -const { WebGLKernelValueDynamicUnsignedArray } = require('../../web-gl/kernel-value/dynamic-unsigned-array'); +import { utils } from '../../../utils'; +import { WebGLKernelValueDynamicUnsignedArray } from '../../web-gl/kernel-value/dynamic-unsigned-array'; -class WebGL2KernelValueDynamicUnsignedArray extends WebGLKernelValueDynamicUnsignedArray { +export class WebGL2KernelValueDynamicUnsignedArray extends WebGLKernelValueDynamicUnsignedArray { getSource() { const variablePrecision = this.getVariablePrecisionString(); return utils.linesToString([ - `uniform ${ variablePrecision } sampler2D ${this.id}`, - `uniform ${ variablePrecision } ivec2 ${this.sizeId}`, - `uniform ${ variablePrecision } ivec3 ${this.dimensionsId}`, + `uniform ${variablePrecision} sampler2D ${this.id}`, + `uniform ${variablePrecision} ivec2 ${this.sizeId}`, + `uniform ${variablePrecision} ivec3 ${this.dimensionsId}`, ]); } } - -module.exports = { - WebGL2KernelValueDynamicUnsignedArray -}; \ No newline at end of file diff --git a/src/backend/web-gl2/kernel-value/dynamic-unsigned-input.js b/src/backend/web-gl2/kernel-value/dynamic-unsigned-input.js index 9c79330a..6dbae9d1 100644 --- a/src/backend/web-gl2/kernel-value/dynamic-unsigned-input.js +++ b/src/backend/web-gl2/kernel-value/dynamic-unsigned-input.js @@ -1,17 +1,13 @@ -const { utils } = require('../../../utils'); -const { WebGLKernelValueDynamicUnsignedInput } = require('../../web-gl/kernel-value/dynamic-unsigned-input'); +import { utils } from '../../../utils'; +import { WebGLKernelValueDynamicUnsignedInput } from '../../web-gl/kernel-value/dynamic-unsigned-input'; -class WebGL2KernelValueDynamicUnsignedInput extends WebGLKernelValueDynamicUnsignedInput { +export class WebGL2KernelValueDynamicUnsignedInput extends WebGLKernelValueDynamicUnsignedInput { getSource() { const variablePrecision = this.getVariablePrecisionString(); return utils.linesToString([ - `uniform ${ variablePrecision } sampler2D ${this.id}`, - `uniform ${ variablePrecision } ivec2 ${this.sizeId}`, - `uniform ${ variablePrecision } ivec3 ${this.dimensionsId}`, + `uniform ${variablePrecision} sampler2D ${this.id}`, + `uniform ${variablePrecision} ivec2 ${this.sizeId}`, + `uniform ${variablePrecision} ivec3 ${this.dimensionsId}`, ]); } } - -module.exports = { - WebGL2KernelValueDynamicUnsignedInput -}; \ No newline at end of file diff --git a/src/backend/web-gl2/kernel-value/float.js b/src/backend/web-gl2/kernel-value/float.js index b3fc5a78..e32aca37 100644 --- a/src/backend/web-gl2/kernel-value/float.js +++ b/src/backend/web-gl2/kernel-value/float.js @@ -1,8 +1,3 @@ -const { utils } = require('../../../utils'); -const { WebGLKernelValueFloat } = require('../../web-gl/kernel-value/float'); +import { WebGLKernelValueFloat } from '../../web-gl/kernel-value/float'; -class WebGL2KernelValueFloat extends WebGLKernelValueFloat {} - -module.exports = { - WebGL2KernelValueFloat -}; \ No newline at end of file +export class WebGL2KernelValueFloat extends WebGLKernelValueFloat {} diff --git a/src/backend/web-gl2/kernel-value/html-image-array.js b/src/backend/web-gl2/kernel-value/html-image-array.js index b7707a57..e4644a37 100644 --- a/src/backend/web-gl2/kernel-value/html-image-array.js +++ b/src/backend/web-gl2/kernel-value/html-image-array.js @@ -1,7 +1,7 @@ -const { utils } = require('../../../utils'); -const { WebGLKernelArray } = require('../../web-gl/kernel-value/array'); +import { utils } from '../../../utils'; +import { WebGLKernelArray } from '../../web-gl/kernel-value/array'; -class WebGL2KernelValueHTMLImageArray extends WebGLKernelArray { +export class WebGL2KernelValueHTMLImageArray extends WebGLKernelArray { constructor(value, settings) { super(value, settings); this.checkSize(value[0].width, value[0].height); @@ -22,9 +22,9 @@ class WebGL2KernelValueHTMLImageArray extends WebGLKernelArray { getSource() { const variablePrecision = this.getVariablePrecisionString(); return utils.linesToString([ - `uniform ${ variablePrecision } sampler2DArray ${this.id}`, - `${ variablePrecision } ivec2 ${this.sizeId} = ivec2(${this.textureSize[0]}, ${this.textureSize[1]})`, - `${ variablePrecision } ivec3 ${this.dimensionsId} = ivec3(${this.dimensions[0]}, ${this.dimensions[1]}, ${this.dimensions[2]})`, + `uniform ${variablePrecision} sampler2DArray ${this.id}`, + `${variablePrecision} ivec2 ${this.sizeId} = ivec2(${this.textureSize[0]}, ${this.textureSize[1]})`, + `${variablePrecision} ivec3 ${this.dimensionsId} = ivec3(${this.dimensions[0]}, ${this.dimensions[1]}, ${this.dimensions[2]})`, ]); } @@ -61,13 +61,9 @@ class WebGL2KernelValueHTMLImageArray extends WebGLKernelArray { imageDepth, gl.RGBA, gl.UNSIGNED_BYTE, - this.uploadValue = images[i] + (this.uploadValue = images[i]) ); } this.kernel.setUniform1i(this.id, this.index); } } - -module.exports = { - WebGL2KernelValueHTMLImageArray -}; \ No newline at end of file diff --git a/src/backend/web-gl2/kernel-value/html-image.js b/src/backend/web-gl2/kernel-value/html-image.js index 637182a0..5b8d3936 100644 --- a/src/backend/web-gl2/kernel-value/html-image.js +++ b/src/backend/web-gl2/kernel-value/html-image.js @@ -1,17 +1,13 @@ -const { utils } = require('../../../utils'); -const { WebGLKernelValueHTMLImage } = require('../../web-gl/kernel-value/html-image'); +import { utils } from '../../../utils'; +import { WebGLKernelValueHTMLImage } from '../../web-gl/kernel-value/html-image'; -class WebGL2KernelValueHTMLImage extends WebGLKernelValueHTMLImage { +export class WebGL2KernelValueHTMLImage extends WebGLKernelValueHTMLImage { getSource() { const variablePrecision = this.getVariablePrecisionString(); return utils.linesToString([ - `uniform ${ variablePrecision } sampler2D ${this.id}`, - `${ variablePrecision } ivec2 ${this.sizeId} = ivec2(${this.textureSize[0]}, ${this.textureSize[1]})`, - `${ variablePrecision } ivec3 ${this.dimensionsId} = ivec3(${this.dimensions[0]}, ${this.dimensions[1]}, ${this.dimensions[2]})`, + `uniform ${variablePrecision} sampler2D ${this.id}`, + `${variablePrecision} ivec2 ${this.sizeId} = ivec2(${this.textureSize[0]}, ${this.textureSize[1]})`, + `${variablePrecision} ivec3 ${this.dimensionsId} = ivec3(${this.dimensions[0]}, ${this.dimensions[1]}, ${this.dimensions[2]})`, ]); } } - -module.exports = { - WebGL2KernelValueHTMLImage -}; \ No newline at end of file diff --git a/src/backend/web-gl2/kernel-value/html-video.js b/src/backend/web-gl2/kernel-value/html-video.js index 85fb3953..341b31ef 100644 --- a/src/backend/web-gl2/kernel-value/html-video.js +++ b/src/backend/web-gl2/kernel-value/html-video.js @@ -1,8 +1,4 @@ -const { utils } = require('../../../utils'); -const { WebGL2KernelValueHTMLImage } = require('./html-image'); +import { utils } from '../../../utils'; +import { WebGL2KernelValueHTMLImage } from './html-image'; -class WebGL2KernelValueHTMLVideo extends WebGL2KernelValueHTMLImage {} - -module.exports = { - WebGL2KernelValueHTMLVideo -}; \ No newline at end of file +export class WebGL2KernelValueHTMLVideo extends WebGL2KernelValueHTMLImage {} diff --git a/src/backend/web-gl2/kernel-value/integer.js b/src/backend/web-gl2/kernel-value/integer.js index 8b0467c8..ad4bde4b 100644 --- a/src/backend/web-gl2/kernel-value/integer.js +++ b/src/backend/web-gl2/kernel-value/integer.js @@ -1,20 +1,18 @@ -const { WebGLKernelValueInteger } = require('../../web-gl/kernel-value/integer'); +import { WebGLKernelValueInteger } from '../../web-gl/kernel-value/integer'; -class WebGL2KernelValueInteger extends WebGLKernelValueInteger { +export class WebGL2KernelValueInteger extends WebGLKernelValueInteger { getSource(value) { const variablePrecision = this.getVariablePrecisionString(); if (this.origin === 'constants') { - return `const ${ variablePrecision } int ${this.id} = ${ parseInt(value) };\n`; + return `const ${variablePrecision} int ${this.id} = ${parseInt( + value + )};\n`; } - return `uniform ${ variablePrecision } int ${this.id};\n`; + return `uniform ${variablePrecision} int ${this.id};\n`; } updateValue(value) { if (this.origin === 'constants') return; - this.kernel.setUniform1i(this.id, this.uploadValue = value); + this.kernel.setUniform1i(this.id, (this.uploadValue = value)); } } - -module.exports = { - WebGL2KernelValueInteger -}; \ No newline at end of file diff --git a/src/backend/web-gl2/kernel-value/memory-optimized-number-texture.js b/src/backend/web-gl2/kernel-value/memory-optimized-number-texture.js index 7fd85798..9feab067 100644 --- a/src/backend/web-gl2/kernel-value/memory-optimized-number-texture.js +++ b/src/backend/web-gl2/kernel-value/memory-optimized-number-texture.js @@ -1,18 +1,14 @@ -const { utils } = require('../../../utils'); -const { WebGLKernelValueMemoryOptimizedNumberTexture } = require('../../web-gl/kernel-value/memory-optimized-number-texture'); +import { utils } from '../../../utils'; +import { WebGLKernelValueMemoryOptimizedNumberTexture } from '../../web-gl/kernel-value/memory-optimized-number-texture'; -class WebGL2KernelValueMemoryOptimizedNumberTexture extends WebGLKernelValueMemoryOptimizedNumberTexture { +export class WebGL2KernelValueMemoryOptimizedNumberTexture extends WebGLKernelValueMemoryOptimizedNumberTexture { getSource() { const { id, sizeId, textureSize, dimensionsId, dimensions } = this; const variablePrecision = this.getVariablePrecisionString(); return utils.linesToString([ `uniform sampler2D ${id}`, - `${ variablePrecision } ivec2 ${sizeId} = ivec2(${textureSize[0]}, ${textureSize[1]})`, - `${ variablePrecision } ivec3 ${dimensionsId} = ivec3(${dimensions[0]}, ${dimensions[1]}, ${dimensions[2]})`, + `${variablePrecision} ivec2 ${sizeId} = ivec2(${textureSize[0]}, ${textureSize[1]})`, + `${variablePrecision} ivec3 ${dimensionsId} = ivec3(${dimensions[0]}, ${dimensions[1]}, ${dimensions[2]})`, ]); } } - -module.exports = { - WebGL2KernelValueMemoryOptimizedNumberTexture -}; \ No newline at end of file diff --git a/src/backend/web-gl2/kernel-value/number-texture.js b/src/backend/web-gl2/kernel-value/number-texture.js index 440f1e4e..9f7e137c 100644 --- a/src/backend/web-gl2/kernel-value/number-texture.js +++ b/src/backend/web-gl2/kernel-value/number-texture.js @@ -1,18 +1,14 @@ -const { utils } = require('../../../utils'); -const { WebGLKernelValueNumberTexture } = require('../../web-gl/kernel-value/number-texture'); +import { utils } from '../../../utils'; +import { WebGLKernelValueNumberTexture } from '../../web-gl/kernel-value/number-texture'; -class WebGL2KernelValueNumberTexture extends WebGLKernelValueNumberTexture { +export class WebGL2KernelValueNumberTexture extends WebGLKernelValueNumberTexture { getSource() { const { id, sizeId, textureSize, dimensionsId, dimensions } = this; const variablePrecision = this.getVariablePrecisionString(); return utils.linesToString([ - `uniform ${ variablePrecision } sampler2D ${id}`, - `${ variablePrecision } ivec2 ${sizeId} = ivec2(${textureSize[0]}, ${textureSize[1]})`, - `${ variablePrecision } ivec3 ${dimensionsId} = ivec3(${dimensions[0]}, ${dimensions[1]}, ${dimensions[2]})`, + `uniform ${variablePrecision} sampler2D ${id}`, + `${variablePrecision} ivec2 ${sizeId} = ivec2(${textureSize[0]}, ${textureSize[1]})`, + `${variablePrecision} ivec3 ${dimensionsId} = ivec3(${dimensions[0]}, ${dimensions[1]}, ${dimensions[2]})`, ]); } } - -module.exports = { - WebGL2KernelValueNumberTexture -}; \ No newline at end of file diff --git a/src/backend/web-gl2/kernel-value/single-array.js b/src/backend/web-gl2/kernel-value/single-array.js index c149f06f..d846eb3e 100644 --- a/src/backend/web-gl2/kernel-value/single-array.js +++ b/src/backend/web-gl2/kernel-value/single-array.js @@ -1,13 +1,13 @@ -const { utils } = require('../../../utils'); -const { WebGLKernelValueSingleArray } = require('../../web-gl/kernel-value/single-array'); +import { utils } from '../../../utils'; +import { WebGLKernelValueSingleArray } from '../../web-gl/kernel-value/single-array'; -class WebGL2KernelValueSingleArray extends WebGLKernelValueSingleArray { +export class WebGL2KernelValueSingleArray extends WebGLKernelValueSingleArray { getSource() { const variablePrecision = this.getVariablePrecisionString(); return utils.linesToString([ - `uniform ${ variablePrecision } sampler2D ${this.id}`, - `${ variablePrecision } ivec2 ${this.sizeId} = ivec2(${this.textureSize[0]}, ${this.textureSize[1]})`, - `${ variablePrecision } ivec3 ${this.dimensionsId} = ivec3(${this.dimensions[0]}, ${this.dimensions[1]}, ${this.dimensions[2]})`, + `uniform ${variablePrecision} sampler2D ${this.id}`, + `${variablePrecision} ivec2 ${this.sizeId} = ivec2(${this.textureSize[0]}, ${this.textureSize[1]})`, + `${variablePrecision} ivec3 ${this.dimensionsId} = ivec3(${this.dimensions[0]}, ${this.dimensions[1]}, ${this.dimensions[2]})`, ]); } @@ -21,11 +21,17 @@ class WebGL2KernelValueSingleArray extends WebGLKernelValueSingleArray { gl.activeTexture(this.contextHandle); gl.bindTexture(gl.TEXTURE_2D, this.texture); gl.pixelStorei(gl.UNPACK_FLIP_Y_WEBGL, false); - gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA32F, this.textureSize[0], this.textureSize[1], 0, gl.RGBA, gl.FLOAT, this.uploadValue); + gl.texImage2D( + gl.TEXTURE_2D, + 0, + gl.RGBA32F, + this.textureSize[0], + this.textureSize[1], + 0, + gl.RGBA, + gl.FLOAT, + this.uploadValue + ); this.kernel.setUniform1i(this.id, this.index); } } - -module.exports = { - WebGL2KernelValueSingleArray -}; \ No newline at end of file diff --git a/src/backend/web-gl2/kernel-value/single-array1d-i.js b/src/backend/web-gl2/kernel-value/single-array1d-i.js index 41de1187..f8b6bfb6 100644 --- a/src/backend/web-gl2/kernel-value/single-array1d-i.js +++ b/src/backend/web-gl2/kernel-value/single-array1d-i.js @@ -1,7 +1,7 @@ -const { utils } = require('../../../utils'); -const { WebGLKernelValueSingleArray1DI } = require('../../web-gl/kernel-value/single-array1d-i'); +import { utils } from '../../../utils'; +import { WebGLKernelValueSingleArray1DI } from '../../web-gl/kernel-value/single-array1d-i'; -class WebGL2KernelValueSingleArray1DI extends WebGLKernelValueSingleArray1DI { +export class WebGL2KernelValueSingleArray1DI extends WebGLKernelValueSingleArray1DI { updateValue(value) { if (value.constructor !== this.initialValueConstructor) { this.onUpdateValueMismatch(value.constructor); @@ -12,11 +12,17 @@ class WebGL2KernelValueSingleArray1DI extends WebGLKernelValueSingleArray1DI { gl.activeTexture(this.contextHandle); gl.bindTexture(gl.TEXTURE_2D, this.texture); gl.pixelStorei(gl.UNPACK_FLIP_Y_WEBGL, false); - gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA32F, this.textureSize[0], this.textureSize[1], 0, gl.RGBA, gl.FLOAT, this.uploadValue); + gl.texImage2D( + gl.TEXTURE_2D, + 0, + gl.RGBA32F, + this.textureSize[0], + this.textureSize[1], + 0, + gl.RGBA, + gl.FLOAT, + this.uploadValue + ); this.kernel.setUniform1i(this.id, this.index); } } - -module.exports = { - WebGL2KernelValueSingleArray1DI -}; \ No newline at end of file diff --git a/src/backend/web-gl2/kernel-value/single-array2d-i.js b/src/backend/web-gl2/kernel-value/single-array2d-i.js index f7723860..7a75f606 100644 --- a/src/backend/web-gl2/kernel-value/single-array2d-i.js +++ b/src/backend/web-gl2/kernel-value/single-array2d-i.js @@ -1,7 +1,7 @@ -const { utils } = require('../../../utils'); -const { WebGLKernelValueSingleArray2DI } = require('../../web-gl/kernel-value/single-array2d-i'); +import { utils } from '../../../utils'; +import { WebGLKernelValueSingleArray2DI } from '../../web-gl/kernel-value/single-array2d-i'; -class WebGL2KernelValueSingleArray2DI extends WebGLKernelValueSingleArray2DI { +export class WebGL2KernelValueSingleArray2DI extends WebGLKernelValueSingleArray2DI { updateValue(value) { if (value.constructor !== this.initialValueConstructor) { this.onUpdateValueMismatch(value.constructor); @@ -12,11 +12,17 @@ class WebGL2KernelValueSingleArray2DI extends WebGLKernelValueSingleArray2DI { gl.activeTexture(this.contextHandle); gl.bindTexture(gl.TEXTURE_2D, this.texture); gl.pixelStorei(gl.UNPACK_FLIP_Y_WEBGL, false); - gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA32F, this.textureSize[0], this.textureSize[1], 0, gl.RGBA, gl.FLOAT, this.uploadValue); + gl.texImage2D( + gl.TEXTURE_2D, + 0, + gl.RGBA32F, + this.textureSize[0], + this.textureSize[1], + 0, + gl.RGBA, + gl.FLOAT, + this.uploadValue + ); this.kernel.setUniform1i(this.id, this.index); } } - -module.exports = { - WebGL2KernelValueSingleArray2DI -}; \ No newline at end of file diff --git a/src/backend/web-gl2/kernel-value/single-array3d-i.js b/src/backend/web-gl2/kernel-value/single-array3d-i.js index 904f4bfd..c7878b18 100644 --- a/src/backend/web-gl2/kernel-value/single-array3d-i.js +++ b/src/backend/web-gl2/kernel-value/single-array3d-i.js @@ -1,7 +1,7 @@ -const { utils } = require('../../../utils'); -const { WebGLKernelValueSingleArray3DI } = require('../../web-gl/kernel-value/single-array3d-i'); +import { utils } from '../../../utils'; +import { WebGLKernelValueSingleArray3DI } from '../../web-gl/kernel-value/single-array3d-i'; -class WebGL2KernelValueSingleArray3DI extends WebGLKernelValueSingleArray3DI { +export class WebGL2KernelValueSingleArray3DI extends WebGLKernelValueSingleArray3DI { updateValue(value) { if (value.constructor !== this.initialValueConstructor) { this.onUpdateValueMismatch(value.constructor); @@ -12,11 +12,17 @@ class WebGL2KernelValueSingleArray3DI extends WebGLKernelValueSingleArray3DI { gl.activeTexture(this.contextHandle); gl.bindTexture(gl.TEXTURE_2D, this.texture); gl.pixelStorei(gl.UNPACK_FLIP_Y_WEBGL, false); - gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA32F, this.textureSize[0], this.textureSize[1], 0, gl.RGBA, gl.FLOAT, this.uploadValue); + gl.texImage2D( + gl.TEXTURE_2D, + 0, + gl.RGBA32F, + this.textureSize[0], + this.textureSize[1], + 0, + gl.RGBA, + gl.FLOAT, + this.uploadValue + ); this.kernel.setUniform1i(this.id, this.index); } } - -module.exports = { - WebGL2KernelValueSingleArray3DI -}; \ No newline at end of file diff --git a/src/backend/web-gl2/kernel-value/single-input.js b/src/backend/web-gl2/kernel-value/single-input.js index 261168e2..97eeaf2b 100644 --- a/src/backend/web-gl2/kernel-value/single-input.js +++ b/src/backend/web-gl2/kernel-value/single-input.js @@ -1,13 +1,13 @@ -const { utils } = require('../../../utils'); -const { WebGLKernelValueSingleInput } = require('../../web-gl/kernel-value/single-input'); +import { utils } from '../../../utils'; +import { WebGLKernelValueSingleInput } from '../../web-gl/kernel-value/single-input'; -class WebGL2KernelValueSingleInput extends WebGLKernelValueSingleInput { +export class WebGL2KernelValueSingleInput extends WebGLKernelValueSingleInput { getSource() { const variablePrecision = this.getVariablePrecisionString(); return utils.linesToString([ - `uniform ${ variablePrecision } sampler2D ${this.id}`, - `${ variablePrecision } ivec2 ${this.sizeId} = ivec2(${this.textureSize[0]}, ${this.textureSize[1]})`, - `${ variablePrecision } ivec3 ${this.dimensionsId} = ivec3(${this.dimensions[0]}, ${this.dimensions[1]}, ${this.dimensions[2]})`, + `uniform ${variablePrecision} sampler2D ${this.id}`, + `${variablePrecision} ivec2 ${this.sizeId} = ivec2(${this.textureSize[0]}, ${this.textureSize[1]})`, + `${variablePrecision} ivec3 ${this.dimensionsId} = ivec3(${this.dimensions[0]}, ${this.dimensions[1]}, ${this.dimensions[2]})`, ]); } @@ -17,11 +17,17 @@ class WebGL2KernelValueSingleInput extends WebGLKernelValueSingleInput { gl.activeTexture(this.contextHandle); gl.bindTexture(gl.TEXTURE_2D, this.texture); gl.pixelStorei(gl.UNPACK_FLIP_Y_WEBGL, false); - gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA32F, this.textureSize[0], this.textureSize[1], 0, gl.RGBA, gl.FLOAT, this.uploadValue); + gl.texImage2D( + gl.TEXTURE_2D, + 0, + gl.RGBA32F, + this.textureSize[0], + this.textureSize[1], + 0, + gl.RGBA, + gl.FLOAT, + this.uploadValue + ); this.kernel.setUniform1i(this.id, this.index); } } - -module.exports = { - WebGL2KernelValueSingleInput -}; \ No newline at end of file diff --git a/src/backend/web-gl2/kernel-value/unsigned-array.js b/src/backend/web-gl2/kernel-value/unsigned-array.js index bac1e6f1..02c380ee 100644 --- a/src/backend/web-gl2/kernel-value/unsigned-array.js +++ b/src/backend/web-gl2/kernel-value/unsigned-array.js @@ -1,17 +1,13 @@ -const { utils } = require('../../../utils'); -const { WebGLKernelValueUnsignedArray } = require('../../web-gl/kernel-value/unsigned-array'); +import { utils } from '../../../utils'; +import { WebGLKernelValueUnsignedArray } from '../../web-gl/kernel-value/unsigned-array'; -class WebGL2KernelValueUnsignedArray extends WebGLKernelValueUnsignedArray { +export class WebGL2KernelValueUnsignedArray extends WebGLKernelValueUnsignedArray { getSource() { const variablePrecision = this.getVariablePrecisionString(); return utils.linesToString([ - `uniform ${ variablePrecision } sampler2D ${this.id}`, - `${ variablePrecision } ivec2 ${this.sizeId} = ivec2(${this.textureSize[0]}, ${this.textureSize[1]})`, - `${ variablePrecision } ivec3 ${this.dimensionsId} = ivec3(${this.dimensions[0]}, ${this.dimensions[1]}, ${this.dimensions[2]})`, + `uniform ${variablePrecision} sampler2D ${this.id}`, + `${variablePrecision} ivec2 ${this.sizeId} = ivec2(${this.textureSize[0]}, ${this.textureSize[1]})`, + `${variablePrecision} ivec3 ${this.dimensionsId} = ivec3(${this.dimensions[0]}, ${this.dimensions[1]}, ${this.dimensions[2]})`, ]); } } - -module.exports = { - WebGL2KernelValueUnsignedArray -}; \ No newline at end of file diff --git a/src/backend/web-gl2/kernel-value/unsigned-input.js b/src/backend/web-gl2/kernel-value/unsigned-input.js index ed933347..b93c1ff5 100644 --- a/src/backend/web-gl2/kernel-value/unsigned-input.js +++ b/src/backend/web-gl2/kernel-value/unsigned-input.js @@ -1,17 +1,13 @@ -const { utils } = require('../../../utils'); -const { WebGLKernelValueUnsignedInput } = require('../../web-gl/kernel-value/unsigned-input'); +import { utils } from '../../../utils'; +import { WebGLKernelValueUnsignedInput } from '../../web-gl/kernel-value/unsigned-input'; -class WebGL2KernelValueUnsignedInput extends WebGLKernelValueUnsignedInput { +export class WebGL2KernelValueUnsignedInput extends WebGLKernelValueUnsignedInput { getSource() { const variablePrecision = this.getVariablePrecisionString(); return utils.linesToString([ - `uniform ${ variablePrecision } sampler2D ${this.id}`, - `${ variablePrecision } ivec2 ${this.sizeId} = ivec2(${this.textureSize[0]}, ${this.textureSize[1]})`, - `${ variablePrecision } ivec3 ${this.dimensionsId} = ivec3(${this.dimensions[0]}, ${this.dimensions[1]}, ${this.dimensions[2]})`, + `uniform ${variablePrecision} sampler2D ${this.id}`, + `${variablePrecision} ivec2 ${this.sizeId} = ivec2(${this.textureSize[0]}, ${this.textureSize[1]})`, + `${variablePrecision} ivec3 ${this.dimensionsId} = ivec3(${this.dimensions[0]}, ${this.dimensions[1]}, ${this.dimensions[2]})`, ]); } } - -module.exports = { - WebGL2KernelValueUnsignedInput -}; \ No newline at end of file diff --git a/src/backend/web-gl2/kernel.js b/src/backend/web-gl2/kernel.js index 2728ed8a..4e0b1512 100644 --- a/src/backend/web-gl2/kernel.js +++ b/src/backend/web-gl2/kernel.js @@ -1,10 +1,10 @@ -const { WebGLKernel } = require('../web-gl/kernel'); -const { WebGL2FunctionNode } = require('./function-node'); -const { FunctionBuilder } = require('../function-builder'); -const { utils } = require('../../utils'); -const { fragmentShader } = require('./fragment-shader'); -const { vertexShader } = require('./vertex-shader'); -const { lookupKernelValueType } = require('./kernel-value-maps'); +import { WebGLKernel } from '../web-gl/kernel'; +import { WebGL2FunctionNode } from './function-node'; +import { FunctionBuilder } from '../function-builder'; +import { utils } from '../../utils'; +import { fragmentShader } from './fragment-shader'; +import { vertexShader } from './vertex-shader'; +import { lookupKernelValueType } from './kernel-value-maps'; let isSupported = null; /** @@ -28,7 +28,7 @@ let features = null; /** * @extends WebGLKernel */ -class WebGL2Kernel extends WebGLKernel { +export class WebGL2Kernel extends WebGLKernel { static get isSupported() { if (isSupported !== null) { return isSupported; @@ -48,8 +48,12 @@ class WebGL2Kernel extends WebGLKernel { testContext = testCanvas.getContext('webgl2'); if (!testContext || !testContext.getExtension) return; testExtensions = { - EXT_color_buffer_float: testContext.getExtension('EXT_color_buffer_float'), - OES_texture_float_linear: testContext.getExtension('OES_texture_float_linear'), + EXT_color_buffer_float: testContext.getExtension( + 'EXT_color_buffer_float' + ), + OES_texture_float_linear: testContext.getExtension( + 'OES_texture_float_linear' + ), }; features = this.getFeatures(); } @@ -77,12 +81,30 @@ class WebGL2Kernel extends WebGLKernel { isDrawBuffers: true, channelCount: this.getChannelCount(), maxTextureSize: this.getMaxTextureSize(), - lowIntPrecision: gl.getShaderPrecisionFormat(gl.FRAGMENT_SHADER, gl.LOW_INT), - lowFloatPrecision: gl.getShaderPrecisionFormat(gl.FRAGMENT_SHADER, gl.LOW_FLOAT), - mediumIntPrecision: gl.getShaderPrecisionFormat(gl.FRAGMENT_SHADER, gl.MEDIUM_INT), - mediumFloatPrecision: gl.getShaderPrecisionFormat(gl.FRAGMENT_SHADER, gl.MEDIUM_FLOAT), - highIntPrecision: gl.getShaderPrecisionFormat(gl.FRAGMENT_SHADER, gl.HIGH_INT), - highFloatPrecision: gl.getShaderPrecisionFormat(gl.FRAGMENT_SHADER, gl.HIGH_FLOAT), + lowIntPrecision: gl.getShaderPrecisionFormat( + gl.FRAGMENT_SHADER, + gl.LOW_INT + ), + lowFloatPrecision: gl.getShaderPrecisionFormat( + gl.FRAGMENT_SHADER, + gl.LOW_FLOAT + ), + mediumIntPrecision: gl.getShaderPrecisionFormat( + gl.FRAGMENT_SHADER, + gl.MEDIUM_INT + ), + mediumFloatPrecision: gl.getShaderPrecisionFormat( + gl.FRAGMENT_SHADER, + gl.MEDIUM_FLOAT + ), + highIntPrecision: gl.getShaderPrecisionFormat( + gl.FRAGMENT_SHADER, + gl.HIGH_INT + ), + highFloatPrecision: gl.getShaderPrecisionFormat( + gl.FRAGMENT_SHADER, + gl.HIGH_FLOAT + ), }); } @@ -133,15 +155,19 @@ class WebGL2Kernel extends WebGLKernel { const settings = { alpha: false, depth: false, - antialias: false + antialias: false, }; return this.canvas.getContext('webgl2', settings); } initExtensions() { this.extensions = { - EXT_color_buffer_float: this.context.getExtension('EXT_color_buffer_float'), - OES_texture_float_linear: this.context.getExtension('OES_texture_float_linear'), + EXT_color_buffer_float: this.context.getExtension( + 'EXT_color_buffer_float' + ), + OES_texture_float_linear: this.context.getExtension( + 'OES_texture_float_linear' + ), }; } @@ -151,10 +177,13 @@ class WebGL2Kernel extends WebGLKernel { */ validateSettings(args) { if (!this.validate) { - this.texSize = utils.getKernelTextureSize({ - optimizeFloatMemory: this.optimizeFloatMemory, - precision: this.precision, - }, this.output); + this.texSize = utils.getKernelTextureSize( + { + optimizeFloatMemory: this.optimizeFloatMemory, + precision: this.precision, + }, + this.output + ); return; } @@ -167,7 +196,10 @@ class WebGL2Kernel extends WebGLKernel { if (this.fixIntegerDivisionAccuracy === null) { this.fixIntegerDivisionAccuracy = !features.isIntegerDivisionAccurate; - } else if (this.fixIntegerDivisionAccuracy && features.isIntegerDivisionAccurate) { + } else if ( + this.fixIntegerDivisionAccuracy && + features.isIntegerDivisionAccurate + ) { this.fixIntegerDivisionAccuracy = false; } @@ -175,7 +207,9 @@ class WebGL2Kernel extends WebGLKernel { if (!this.output || this.output.length === 0) { if (args.length !== 1) { - throw new Error('Auto output only supported for kernels with only one input'); + throw new Error( + 'Auto output only supported for kernels with only one input' + ); } const argType = utils.getVariableType(args[0], this.strictIntegers); @@ -192,7 +226,9 @@ class WebGL2Kernel extends WebGLKernel { this.output = args[0].output; break; default: - throw new Error('Auto output not supported for input type: ' + argType); + throw new Error( + 'Auto output not supported for input type: ' + argType + ); } } @@ -202,28 +238,41 @@ class WebGL2Kernel extends WebGLKernel { } if (this.precision === 'single') { - console.warn('Cannot use graphical mode and single precision at the same time'); + console.warn( + 'Cannot use graphical mode and single precision at the same time' + ); this.precision = 'unsigned'; } this.texSize = utils.clone(this.output); return; - } else if (!this.graphical && this.precision === null && features.isTextureFloat) { + } else if ( + !this.graphical && + this.precision === null && + features.isTextureFloat + ) { this.precision = 'single'; } - this.texSize = utils.getKernelTextureSize({ - optimizeFloatMemory: this.optimizeFloatMemory, - precision: this.precision, - }, this.output); + this.texSize = utils.getKernelTextureSize( + { + optimizeFloatMemory: this.optimizeFloatMemory, + precision: this.precision, + }, + this.output + ); this.checkTextureSize(); } translateSource() { - const functionBuilder = FunctionBuilder.fromKernel(this, WebGL2FunctionNode, { - fixIntegerDivisionAccuracy: this.fixIntegerDivisionAccuracy - }); + const functionBuilder = FunctionBuilder.fromKernel( + this, + WebGL2FunctionNode, + { + fixIntegerDivisionAccuracy: this.fixIntegerDivisionAccuracy, + } + ); this.translatedSource = functionBuilder.getPrototypeString('kernel'); this.setupReturnTypes(functionBuilder); } @@ -261,13 +310,13 @@ class WebGL2Kernel extends WebGLKernel { } else { return gl.R32F; } - case 'Array(2)': - return gl.RG32F; - case 'Array(3)': // there is _no_ 3 channel format which is guaranteed to be color-renderable - case 'Array(4)': - return gl.RGBA32F; - default: - throw new Error('Unhandled return type'); + case 'Array(2)': + return gl.RG32F; + case 'Array(3)': // there is _no_ 3 channel format which is guaranteed to be color-renderable + case 'Array(4)': + return gl.RGBA32F; + default: + throw new Error('Unhandled return type'); } } return gl.RGBA32F; @@ -279,13 +328,21 @@ class WebGL2Kernel extends WebGLKernel { const gl = this.context; if (this.texture) { // here we inherit from an already existing kernel, so go ahead and just bind textures to the framebuffer - gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.texture.texture, 0); + gl.framebufferTexture2D( + gl.FRAMEBUFFER, + gl.COLOR_ATTACHMENT0, + gl.TEXTURE_2D, + this.texture.texture, + 0 + ); return; } gl.bindFramebuffer(gl.FRAMEBUFFER, this.framebuffer); const texture = gl.createTexture(); const texSize = this.texSize; - gl.activeTexture(gl.TEXTURE0 + this.constantTextureCount + this.argumentTextureCount); + gl.activeTexture( + gl.TEXTURE0 + this.constantTextureCount + this.argumentTextureCount + ); gl.bindTexture(gl.TEXTURE_2D, texture); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.REPEAT); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.REPEAT); @@ -295,9 +352,25 @@ class WebGL2Kernel extends WebGLKernel { if (this.precision === 'single') { gl.texStorage2D(gl.TEXTURE_2D, 1, format, texSize[0], texSize[1]); } else { - gl.texImage2D(gl.TEXTURE_2D, 0, format, texSize[0], texSize[1], 0, format, gl.UNSIGNED_BYTE, null); + gl.texImage2D( + gl.TEXTURE_2D, + 0, + format, + texSize[0], + texSize[1], + 0, + format, + gl.UNSIGNED_BYTE, + null + ); } - gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, texture, 0); + gl.framebufferTexture2D( + gl.FRAMEBUFFER, + gl.COLOR_ATTACHMENT0, + gl.TEXTURE_2D, + texture, + 0 + ); this.texture = new this.TextureConstructor({ texture, size: texSize, @@ -315,7 +388,13 @@ class WebGL2Kernel extends WebGLKernel { if (this.mappedTextures) { // here we inherit from an already existing kernel, so go ahead and just bind textures to the framebuffer for (let i = 0; i < this.subKernels.length; i++) { - gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0 + i + 1, gl.TEXTURE_2D, this.mappedTextures[i].texture, 0); + gl.framebufferTexture2D( + gl.FRAMEBUFFER, + gl.COLOR_ATTACHMENT0 + i + 1, + gl.TEXTURE_2D, + this.mappedTextures[i].texture, + 0 + ); } return; } @@ -325,7 +404,9 @@ class WebGL2Kernel extends WebGLKernel { for (let i = 0; i < this.subKernels.length; i++) { const texture = this.createTexture(); this.drawBuffersMap.push(gl.COLOR_ATTACHMENT0 + i + 1); - gl.activeTexture(gl.TEXTURE0 + this.constantTextureCount + this.argumentTextureCount + i); + gl.activeTexture( + gl.TEXTURE0 + this.constantTextureCount + this.argumentTextureCount + i + ); gl.bindTexture(gl.TEXTURE_2D, texture); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE); @@ -337,20 +418,38 @@ class WebGL2Kernel extends WebGLKernel { gl.texStorage2D(gl.TEXTURE_2D, 1, format, texSize[0], texSize[1]); // gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA32F, texSize[0], texSize[1], 0, gl.RGBA, gl.FLOAT, null); } else { - gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, texSize[0], texSize[1], 0, gl.RGBA, gl.UNSIGNED_BYTE, null); + gl.texImage2D( + gl.TEXTURE_2D, + 0, + gl.RGBA, + texSize[0], + texSize[1], + 0, + gl.RGBA, + gl.UNSIGNED_BYTE, + null + ); } - gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0 + i + 1, gl.TEXTURE_2D, texture, 0); - - this.mappedTextures.push(new this.TextureConstructor({ + gl.framebufferTexture2D( + gl.FRAMEBUFFER, + gl.COLOR_ATTACHMENT0 + i + 1, + gl.TEXTURE_2D, texture, - size: texSize, - dimensions: this.threadDim, - output: this.output, - context: this.context, - internalFormat: this.getInternalFormat(), - textureFormat: this.getTextureFormat(), - kernel: this, - })); + 0 + ); + + this.mappedTextures.push( + new this.TextureConstructor({ + texture, + size: texSize, + dimensions: this.threadDim, + output: this.output, + context: this.context, + internalFormat: this.getInternalFormat(), + textureFormat: this.getTextureFormat(), + kernel: this, + }) + ); } } @@ -371,11 +470,14 @@ class WebGL2Kernel extends WebGLKernel { */ _getTextureCoordinate() { const subKernels = this.subKernels; - const variablePrecision = this.getVariablePrecisionString(this.texSize, this.tactic); + const variablePrecision = this.getVariablePrecisionString( + this.texSize, + this.tactic + ); if (subKernels === null || subKernels.length < 1) { - return `in ${ variablePrecision } vec2 vTexCoord;\n`; + return `in ${variablePrecision} vec2 vTexCoord;\n`; } else { - return `out ${ variablePrecision } vec2 vTexCoord;\n`; + return `out ${variablePrecision} vec2 vTexCoord;\n`; } } @@ -401,9 +503,7 @@ class WebGL2Kernel extends WebGLKernel { const result = [this.getKernelResultDeclaration()]; const subKernels = this.subKernels; if (subKernels !== null) { - result.push( - 'layout(location = 0) out vec4 data0' - ); + result.push('layout(location = 0) out vec4 data0'); switch (this.returnType) { case 'Number': case 'Float': @@ -411,42 +511,40 @@ class WebGL2Kernel extends WebGLKernel { for (let i = 0; i < subKernels.length; i++) { const subKernel = subKernels[i]; result.push( - subKernel.returnType === 'Integer' ? - `int subKernelResult_${ subKernel.name } = 0` : - `float subKernelResult_${ subKernel.name } = 0.0`, - `layout(location = ${ i + 1 }) out vec4 data${ i + 1 }` + subKernel.returnType === 'Integer' + ? `int subKernelResult_${subKernel.name} = 0` + : `float subKernelResult_${subKernel.name} = 0.0`, + `layout(location = ${i + 1}) out vec4 data${i + 1}` ); } break; case 'Array(2)': for (let i = 0; i < subKernels.length; i++) { result.push( - `vec2 subKernelResult_${ subKernels[i].name }`, - `layout(location = ${ i + 1 }) out vec4 data${ i + 1 }` + `vec2 subKernelResult_${subKernels[i].name}`, + `layout(location = ${i + 1}) out vec4 data${i + 1}` ); } break; case 'Array(3)': for (let i = 0; i < subKernels.length; i++) { result.push( - `vec3 subKernelResult_${ subKernels[i].name }`, - `layout(location = ${ i + 1 }) out vec4 data${ i + 1 }` + `vec3 subKernelResult_${subKernels[i].name}`, + `layout(location = ${i + 1}) out vec4 data${i + 1}` ); } break; case 'Array(4)': for (let i = 0; i < subKernels.length; i++) { result.push( - `vec4 subKernelResult_${ subKernels[i].name }`, - `layout(location = ${ i + 1 }) out vec4 data${ i + 1 }` + `vec4 subKernelResult_${subKernels[i].name}`, + `layout(location = ${i + 1}) out vec4 data${i + 1}` ); } break; } } else { - result.push( - 'out vec4 data0' - ); + result.push('out vec4 data0'); } return utils.linesToString(result) + this.translatedSource; @@ -466,10 +564,14 @@ class WebGL2Kernel extends WebGLKernel { case 'Number': case 'Integer': case 'Float': - return this.getMainResultKernelPackedPixels() + - this.getMainResultSubKernelPackedPixels(); + return ( + this.getMainResultKernelPackedPixels() + + this.getMainResultSubKernelPackedPixels() + ); default: - throw new Error(`packed output only usable with Numbers, "${this.returnType}" specified`); + throw new Error( + `packed output only usable with Numbers, "${this.returnType}" specified` + ); } } @@ -480,7 +582,9 @@ class WebGL2Kernel extends WebGLKernel { return utils.linesToString([ ' threadId = indexTo3D(index, uOutputDim)', ' kernel()', - ` data0 = ${this.useLegacyEncoder ? 'legacyEncode32' : 'encode32'}(kernelResult)` + ` data0 = ${ + this.useLegacyEncoder ? 'legacyEncode32' : 'encode32' + }(kernelResult)`, ]); } @@ -494,11 +598,15 @@ class WebGL2Kernel extends WebGLKernel { const subKernel = this.subKernels[i]; if (subKernel.returnType === 'Integer') { result.push( - ` data${i + 1} = ${this.useLegacyEncoder ? 'legacyEncode32' : 'encode32'}(float(subKernelResult_${this.subKernels[i].name}))` + ` data${i + 1} = ${ + this.useLegacyEncoder ? 'legacyEncode32' : 'encode32' + }(float(subKernelResult_${this.subKernels[i].name}))` ); } else { result.push( - ` data${i + 1} = ${this.useLegacyEncoder ? 'legacyEncode32' : 'encode32'}(subKernelResult_${this.subKernels[i].name})` + ` data${i + 1} = ${ + this.useLegacyEncoder ? 'legacyEncode32' : 'encode32' + }(subKernelResult_${this.subKernels[i].name})` ); } } @@ -519,7 +627,9 @@ class WebGL2Kernel extends WebGLKernel { const subKernel = this.subKernels[i]; if (subKernel.returnType === 'Integer') { result.push( - ` data${i + 1}.${channel} = float(subKernelResult_${subKernel.name})` + ` data${i + 1}.${channel} = float(subKernelResult_${ + subKernel.name + })` ); } else { result.push( @@ -547,9 +657,7 @@ class WebGL2Kernel extends WebGLKernel { ` data${i + 1}[0] = float(subKernelResult_${subKernel.name})` ); } else { - result.push( - ` data${i + 1}[0] = subKernelResult_${subKernel.name}` - ); + result.push(` data${i + 1}[0] = subKernelResult_${subKernel.name}`); } } return result; @@ -630,12 +738,11 @@ class WebGL2Kernel extends WebGLKernel { */ toJSON() { const json = super.toJSON(); - json.functionNodes = FunctionBuilder.fromKernel(this, WebGL2FunctionNode).toJSON(); + json.functionNodes = FunctionBuilder.fromKernel( + this, + WebGL2FunctionNode + ).toJSON(); json.settings.threadDim = this.threadDim; return json; } } - -module.exports = { - WebGL2Kernel -}; \ No newline at end of file diff --git a/src/backend/web-gl2/vertex-shader.js b/src/backend/web-gl2/vertex-shader.js index e44dc986..7e33b18a 100644 --- a/src/backend/web-gl2/vertex-shader.js +++ b/src/backend/web-gl2/vertex-shader.js @@ -1,5 +1,5 @@ // language=GLSL -const vertexShader = `#version 300 es +export const vertexShader = `#version 300 es __FLOAT_TACTIC_DECLARATION__; __INT_TACTIC_DECLARATION__; __SAMPLER_2D_TACTIC_DECLARATION__; @@ -14,7 +14,3 @@ void main(void) { gl_Position = vec4((aPos + vec2(1)) * ratio + vec2(-1), 0, 1); vTexCoord = aTexCoord; }`; - -module.exports = { - vertexShader -}; \ No newline at end of file diff --git a/src/browser-header.txt b/src/browser-header.txt deleted file mode 100644 index ef9d7f8a..00000000 --- a/src/browser-header.txt +++ /dev/null @@ -1,14 +0,0 @@ -/** - * <%= pkg.name %> - * <%= pkg.homepage %> - * - * <%= pkg.description %> - * - * @version <%= pkg.version %> - * @date <%= new Date() %> - * - * @license <%= pkg.license %> - * The MIT License - * - * Copyright (c) <%= new Date().getFullYear() %> gpu.js Team - */ \ No newline at end of file diff --git a/src/browser.js b/src/browser.js index 740a38dc..5b023437 100644 --- a/src/browser.js +++ b/src/browser.js @@ -1,25 +1,15 @@ -const lib = require('./index'); +import * as lib from './index'; const GPU = lib.GPU; + for (const p in lib) { - if (!lib.hasOwnProperty(p)) continue; - if (p === 'GPU') continue; //prevent recursive reference + if (!Object.prototype.hasOwnProperty.call(lib, p)) { + continue; + } + if (p === 'GPU') { + //prevent recursive reference + continue; + } GPU[p] = lib[p]; } -if (typeof window !== 'undefined') { - bindTo(window); -} -if (typeof self !== 'undefined') { - bindTo(self); -} - -function bindTo(target) { - if (target.GPU) return; - Object.defineProperty(target, 'GPU', { - get() { - return GPU; - } - }); -} - -module.exports = lib; \ No newline at end of file +export default lib; diff --git a/src/gpu.js b/src/gpu.js index c9b1166b..f2e27220 100644 --- a/src/gpu.js +++ b/src/gpu.js @@ -1,29 +1,27 @@ -const { gpuMock } = require('gpu-mock.js'); -const { utils } = require('./utils'); -const { Kernel } = require('./backend/kernel'); -const { CPUKernel } = require('./backend/cpu/kernel'); -const { HeadlessGLKernel } = require('./backend/headless-gl/kernel'); -const { WebGL2Kernel } = require('./backend/web-gl2/kernel'); -const { WebGLKernel } = require('./backend/web-gl/kernel'); -const { kernelRunShortcut } = require('./kernel-run-shortcut'); - - +import { gpuMock } from 'gpu-mock.js'; +import { CPUKernel } from './backend/cpu/kernel'; +import { HeadlessGLKernel } from './backend/headless-gl/kernel'; +import { Kernel } from './backend/kernel'; +import { WebGLKernel } from './backend/web-gl/kernel'; +import { WebGL2Kernel } from './backend/web-gl2/kernel'; +import { kernelRunShortcut } from './kernel-run-shortcut'; +import { utils } from './utils'; /** * * @type {Array.} */ -const kernelOrder = [HeadlessGLKernel, WebGL2Kernel, WebGLKernel]; +export const kernelOrder = [HeadlessGLKernel, WebGL2Kernel, WebGLKernel]; /** * * @type {string[]} */ -const kernelTypes = ['gpu', 'cpu']; +export const kernelTypes = ['gpu', 'cpu']; const internalKernels = { - 'headlessgl': HeadlessGLKernel, - 'webgl2': WebGL2Kernel, - 'webgl': WebGLKernel, + headlessgl: HeadlessGLKernel, + webgl2: WebGL2Kernel, + webgl: WebGLKernel, }; let validate = true; @@ -33,7 +31,7 @@ let validate = true; * @class * @return {GPU} */ -class GPU { +export class GPU { static disableValidation() { validate = false; } @@ -51,14 +49,20 @@ class GPU { * @returns {boolean} */ static get isKernelMapSupported() { - return kernelOrder.some(Kernel => Kernel.isSupported && Kernel.features.kernelMap); + return kernelOrder.some( + Kernel => Kernel.isSupported && Kernel.features.kernelMap + ); } /** * @desc TRUE is platform supports OffscreenCanvas */ static get isOffscreenCanvasSupported() { - return (typeof Worker !== 'undefined' && typeof OffscreenCanvas !== 'undefined') || typeof importScripts !== 'undefined'; + return ( + (typeof Worker !== 'undefined' && + typeof OffscreenCanvas !== 'undefined') || + typeof importScripts !== 'undefined' + ); } /** @@ -102,7 +106,12 @@ class GPU { * @returns {boolean} */ static get isSinglePrecisionSupported() { - return kernelOrder.some(Kernel => Kernel.isSupported && Kernel.features.isFloatRead && Kernel.features.isTextureFloat); + return kernelOrder.some( + Kernel => + Kernel.isSupported && + Kernel.features.isFloatRead && + Kernel.features.isTextureFloat + ); } /** @@ -157,7 +166,9 @@ class GPU { const ExternalKernel = kernelOrder[i]; if (ExternalKernel.isContextMatch(this.context)) { if (!ExternalKernel.isSupported) { - throw new Error(`Kernel type ${ExternalKernel.name} not supported`); + throw new Error( + `Kernel type ${ExternalKernel.name} not supported` + ); } Kernel = ExternalKernel; break; @@ -182,7 +193,9 @@ class GPU { Kernel = CPUKernel; } if (!Kernel) { - throw new Error(`A requested mode of "${this.mode}" and is not supported`); + throw new Error( + `A requested mode of "${this.mode}" and is not supported` + ); } } else { for (let i = 0; i < kernelOrder.length; i++) { @@ -212,13 +225,20 @@ class GPU { if (typeof source === 'undefined') { throw new Error('Missing source parameter'); } - if (typeof source !== 'object' && !utils.isFunction(source) && typeof source !== 'string') { + if ( + typeof source !== 'object' && + !utils.isFunction(source) && + typeof source !== 'string' + ) { throw new Error('source parameter not a function'); } const kernels = this.kernels; if (this.mode === 'dev') { - const devKernel = gpuMock(source, upgradeDeprecatedCreateKernelSettings(settings)); + const devKernel = gpuMock( + source, + upgradeDeprecatedCreateKernelSettings(settings) + ); kernels.push(devKernel); return devKernel; } @@ -228,7 +248,9 @@ class GPU { const settingsCopy = upgradeDeprecatedCreateKernelSettings(settings) || {}; // handle conversion of argumentTypes if (settings && typeof settings.argumentTypes === 'object') { - settingsCopy.argumentTypes = Object.keys(settings.argumentTypes).map(argumentName => settings.argumentTypes[argumentName]); + settingsCopy.argumentTypes = Object.keys(settings.argumentTypes).map( + argumentName => settings.argumentTypes[argumentName] + ); } function onRequestFallback(args) { @@ -293,54 +315,60 @@ class GPU { return existingKernel; } - const newKernel = switchableKernels[signature] = new Constructor(source, { - argumentTypes, - constantTypes: _kernel.constantTypes, - graphical: _kernel.graphical, - loopMaxIterations: _kernel.loopMaxIterations, - constants: _kernel.constants, - dynamicOutput: _kernel.dynamicOutput, - dynamicArgument: _kernel.dynamicArguments, - context: _kernel.context, - canvas: _kernel.canvas, - output: newOutput || _kernel.output, - precision: _kernel.precision, - pipeline: _kernel.pipeline, - immutable: _kernel.immutable, - optimizeFloatMemory: _kernel.optimizeFloatMemory, - fixIntegerDivisionAccuracy: _kernel.fixIntegerDivisionAccuracy, - functions: _kernel.functions, - nativeFunctions: _kernel.nativeFunctions, - injectedNative: _kernel.injectedNative, - subKernels: _kernel.subKernels, - strictIntegers: _kernel.strictIntegers, - debug: _kernel.debug, - gpu: _kernel.gpu, - validate, - returnType: _kernel.returnType, - tactic: _kernel.tactic, - onRequestFallback, - onRequestSwitchKernel, - texture: _kernel.texture, - mappedTextures: _kernel.mappedTextures, - drawBuffersMap: _kernel.drawBuffersMap, - }); + const newKernel = (switchableKernels[signature] = new Constructor( + source, + { + argumentTypes, + constantTypes: _kernel.constantTypes, + graphical: _kernel.graphical, + loopMaxIterations: _kernel.loopMaxIterations, + constants: _kernel.constants, + dynamicOutput: _kernel.dynamicOutput, + dynamicArgument: _kernel.dynamicArguments, + context: _kernel.context, + canvas: _kernel.canvas, + output: newOutput || _kernel.output, + precision: _kernel.precision, + pipeline: _kernel.pipeline, + immutable: _kernel.immutable, + optimizeFloatMemory: _kernel.optimizeFloatMemory, + fixIntegerDivisionAccuracy: _kernel.fixIntegerDivisionAccuracy, + functions: _kernel.functions, + nativeFunctions: _kernel.nativeFunctions, + injectedNative: _kernel.injectedNative, + subKernels: _kernel.subKernels, + strictIntegers: _kernel.strictIntegers, + debug: _kernel.debug, + gpu: _kernel.gpu, + validate, + returnType: _kernel.returnType, + tactic: _kernel.tactic, + onRequestFallback, + onRequestSwitchKernel, + texture: _kernel.texture, + mappedTextures: _kernel.mappedTextures, + drawBuffersMap: _kernel.drawBuffersMap, + } + )); newKernel.build.apply(newKernel, args); kernelRun.replaceKernel(newKernel); kernels.push(newKernel); return newKernel; } - const mergedSettings = Object.assign({ - context: this.context, - canvas: this.canvas, - functions: this.functions, - nativeFunctions: this.nativeFunctions, - injectedNative: this.injectedNative, - gpu: this, - validate, - onRequestFallback, - onRequestSwitchKernel - }, settingsCopy); + const mergedSettings = Object.assign( + { + context: this.context, + canvas: this.canvas, + functions: this.functions, + nativeFunctions: this.nativeFunctions, + injectedNative: this.injectedNative, + gpu: this, + validate, + onRequestFallback, + onRequestSwitchKernel, + }, + settingsCopy + ); const kernel = new this.Kernel(source, mergedSettings); const kernelRun = kernelRunShortcut(kernel); @@ -412,7 +440,9 @@ class GPU { const settingsCopy = upgradeDeprecatedCreateKernelSettings(settings); // handle conversion of argumentTypes if (settings && typeof settings.argumentTypes === 'object') { - settingsCopy.argumentTypes = Object.keys(settings.argumentTypes).map(argumentName => settings.argumentTypes[argumentName]); + settingsCopy.argumentTypes = Object.keys(settings.argumentTypes).map( + argumentName => settings.argumentTypes[argumentName] + ); } if (Array.isArray(arguments[0])) { @@ -473,13 +503,10 @@ class GPU { const context = arguments[0].context; const max = arguments.length - 1; for (let i = 0; i < max; i++) { - arguments[i] - .setCanvas(canvas) - .setContext(context) - .setPipeline(true); + arguments[i].setCanvas(canvas).setContext(context).setPipeline(true); } - return function() { + return function () { const texture = combinedKernel.apply(this, arguments); if (texture.toArray) { return texture.toArray(); @@ -518,7 +545,9 @@ class GPU { */ addNativeFunction(name, source, settings) { if (this.kernels.length > 0) { - throw new Error('Cannot call "addNativeFunction" after "createKernels" has been called.'); + throw new Error( + 'Cannot call "addNativeFunction" after "createKernels" has been called.' + ); } this.nativeFunctions.push(Object.assign({ name, source }, settings)); return this; @@ -572,7 +601,6 @@ class GPU { } } - function upgradeDeprecatedCreateKernelSettings(settings) { if (!settings) { return {}; @@ -597,9 +625,3 @@ function upgradeDeprecatedCreateKernelSettings(settings) { } return upgradedSettings; } - -module.exports = { - GPU, - kernelOrder, - kernelTypes -}; \ No newline at end of file diff --git a/src/index.d.ts b/src/index.d.ts index 40d86bd0..c509167f 100644 --- a/src/index.d.ts +++ b/src/index.d.ts @@ -13,35 +13,61 @@ export class GPU { nativeFunctions: IGPUNativeFunction[]; setFunctions(flag: any): this; setNativeFunctions(flag: IGPUNativeFunction[]): this; - addFunction(kernel: GPUFunction, settings?: IGPUFunctionSettings): this; - addNativeFunction(name: string, source: string, settings?: IGPUFunctionSettings): this; + addFunction< + ArgTypes extends ThreadKernelVariable[] = ThreadKernelVariable[], + ConstantsType = {} + >( + kernel: GPUFunction, + settings?: IGPUFunctionSettings + ): this; + addNativeFunction( + name: string, + source: string, + settings?: IGPUFunctionSettings + ): this; combineKernels(...kernels: KernelFunction[]): IKernelRunShortcut; - combineKernels(...kernels: KF[]): - ((...args: Parameters) => - ReturnType[] - | ReturnType[][] - | ReturnType[][][] - | Texture - | void - ) - & IKernelRunShortcutBase; - createKernel(kernel: KernelFunction, settings?: IGPUKernelSettings): IKernelRunShortcut; - createKernel(kernel: KernelType, settings?: IGPUKernelSettings): - ((...args: Parameters) => - ReturnType[] - | ReturnType[][] - | ReturnType[][][] - | Texture - | void - ) - & IKernelRunShortcutBase; + combineKernels( + ...kernels: KF[] + ): (( + ...args: Parameters + ) => + | ReturnType[] + | ReturnType[][] + | ReturnType[][][] + | Texture + | void) & + IKernelRunShortcutBase; + createKernel< + ArgTypes extends ThreadKernelVariable[], + ConstantsT extends IConstantsThis + >( + kernel: KernelFunction, + settings?: IGPUKernelSettings + ): IKernelRunShortcut; + createKernel( + kernel: KernelType, + settings?: IGPUKernelSettings + ): (( + ...args: Parameters + ) => + | ReturnType[] + | ReturnType[][] + | ReturnType[][][] + | Texture + | void) & + IKernelRunShortcutBase; createKernelMap< ArgTypes extends ThreadKernelVariable[], - ConstantsType = null, - >( + ConstantsType = null + >( subKernels: ISubKernelObject, rootKernel: ThreadFunction, - settings?: IGPUKernelSettings): (((this: IKernelFunctionThis, ...args: ArgTypes) => IMappedKernelResult) & IKernelMapRunShortcut); + settings?: IGPUKernelSettings + ): (( + this: IKernelFunctionThis, + ...args: ArgTypes + ) => IMappedKernelResult) & + IKernelMapRunShortcut; destroy(): Promise; Kernel: typeof Kernel; mode: string; @@ -51,13 +77,13 @@ export class GPU { export interface ISubKernelObject { [targetLocation: string]: - ((...args: ThreadKernelVariable[]) => ThreadFunctionResult) + | ((...args: ThreadKernelVariable[]) => ThreadFunctionResult) | ((...args: any[]) => ThreadFunctionResult); } export interface ISubKernelArray { [index: number]: - ((...args: ThreadKernelVariable[]) => ThreadFunctionResult) + | ((...args: ThreadKernelVariable[]) => ThreadFunctionResult) | ((...args: any[]) => ThreadFunctionResult); } @@ -76,7 +102,7 @@ export interface IGPUNativeFunction extends IGPUFunctionSettings { export interface IMappedKernelResult { result?: KernelVariable; - [targetLocation: string]: KernelVariable + [targetLocation: string]: KernelVariable; } export interface INativeFunction extends IGPUFunctionSettings { @@ -90,7 +116,7 @@ export interface IInternalNativeFunction extends IArgumentTypes { } export interface INativeFunctionList { - [name: string]: INativeFunction + [name: string]: INativeFunction; } export type GPUMode = 'gpu' | 'cpu' | 'dev'; @@ -105,8 +131,8 @@ export interface IGPUSettings { // format: 'Float32Array' | 'Float16Array' | 'Float' // WE WANT THIS! } -export type GPUVariableType - = 'Array' +export type GPUVariableType = + | 'Array' | 'Array(2)' | 'Array(3)' | 'Array(4)' @@ -128,16 +154,14 @@ export type GPUVariableType | 'Integer' | GPUTextureType; -export type GPUTextureType - = 'NumberTexture' - | 'ArrayTexture(4)'; +export type GPUTextureType = 'NumberTexture' | 'ArrayTexture(4)'; export interface IGPUArgumentTypes { [argumentName: string]: GPUVariableType; } export interface IGPUFunctionSettings { - argumentTypes?: IGPUArgumentTypes | string[], + argumentTypes?: IGPUArgumentTypes | string[]; returnType?: GPUVariableType; } @@ -176,10 +200,17 @@ export class Kernel { mappedTextures?: Texture[]; TextureConstructor: typeof Texture; getPixels(flip?: boolean): Uint8ClampedArray[]; - getVariablePrecisionString(textureSize?: number[], tactic?: Tactic, isInt?: boolean): string; + getVariablePrecisionString( + textureSize?: number[], + tactic?: Tactic, + isInt?: boolean + ): string; prependString(value: string): void; hasPrependString(value: string): boolean; - constructor(kernel: KernelFunction|IKernelJSON|string, settings?: IDirectKernelSettings); + constructor( + kernel: KernelFunction | IKernelJSON | string, + settings?: IDirectKernelSettings + ); onRequestSwitchKernel?: Kernel; onActivate(previousKernel: Kernel): void; build(...args: KernelVariable[]): void; @@ -203,7 +234,10 @@ export class Kernel { setImmutable(flag: boolean): this; setCanvas(flag: any): this; setContext(flag: any): this; - addFunction(flag: GPUFunction, settings?: IFunctionSettings): this; + addFunction( + flag: GPUFunction, + settings?: IFunctionSettings + ): this; setFunctions(flag: any): this; setNativeFunctions(flag: IGPUNativeFunction[]): this; setStrictIntegers(flag: boolean): this; @@ -215,8 +249,19 @@ export class Kernel { setUniform1f(name: string, value: number): void; setUniform2f(name: string, value1: number, value2: number): void; - setUniform3f(name: string, value1: number, value2: number, value3: number): void; - setUniform4f(name: string, value1: number, value2: number, value3: number, value4: number): void; + setUniform3f( + name: string, + value1: number, + value2: number, + value3: number + ): void; + setUniform4f( + name: string, + value1: number, + value2: number, + value3: number, + value4: number + ): void; setUniform2fv(name: string, value: [number, number]): void; setUniform3fv(name: string, value: [number, number, number]): void; @@ -224,45 +269,53 @@ export class Kernel { setUniform1i(name: string, value: number): void; setUniform2i(name: string, value1: number, value2: number): void; - setUniform3i(name: string, value1: number, value2: number, value3: number): void; - setUniform4i(name: string, value1: number, value2: number, value3: number, value4: number): void; + setUniform3i( + name: string, + value1: number, + value2: number, + value3: number + ): void; + setUniform4i( + name: string, + value1: number, + value2: number, + value3: number, + value4: number + ): void; setUniform2iv(name: string, value: [number, number]): void; setUniform3iv(name: string, value: [number, number, number]): void; setUniform4iv(name: string, value: [number, number, number, number]): void; } - -export type GPUFunction - = ThreadFunction +export type GPUFunction< + ArgTypes extends ThreadKernelVariable[] = ThreadKernelVariable[], + ConstantsType = {} +> = + | ThreadFunction | IFunction | IGPUFunction - | string[]; + | string[]; -export type ThreadFunction = - ((this: IKernelFunctionThis, ...args: ArgTypes) => ThreadFunctionResult); +export type ThreadFunction< + ArgTypes extends ThreadKernelVariable[] = ThreadKernelVariable[], + ConstantsType = {} +> = ( + this: IKernelFunctionThis, + ...args: ArgTypes +) => ThreadFunctionResult; export type Precision = 'single' | 'unsigned'; -export class CPUKernel extends Kernel { - -} -export class GLKernel extends Kernel { - -} -export class WebGLKernel extends GLKernel { - -} -export class WebGL2Kernel extends WebGLKernel { - -} -export class HeadlessGLKernel extends WebGLKernel { - -} +export class CPUKernel extends Kernel {} +export class GLKernel extends Kernel {} +export class WebGLKernel extends GLKernel {} +export class WebGL2Kernel extends WebGLKernel {} +export class HeadlessGLKernel extends WebGLKernel {} export interface IArgumentTypes { - argumentTypes: GPUVariableType[], - argumentNames: string[], + argumentTypes: GPUVariableType[]; + argumentNames: string[]; } export interface IConstants { @@ -309,12 +362,12 @@ export interface IKernelXYZ { } export interface FunctionList { - [functionName: string]: Function + [functionName: string]: Function; } export interface IGPUKernelSettings extends IKernelSettings { argumentTypes?: ITypesList; - functions?: Function[]|FunctionList; + functions?: Function[] | FunctionList; tactic?: Tactic; onRequestSwitchKernel?: Kernel; } @@ -335,17 +388,17 @@ export interface IKernelSettings { dynamicArguments?: boolean; constantTypes?: ITypesList; useLegacyEncoder?: boolean; - nativeFunctions?: IGPUNativeFunction[], + nativeFunctions?: IGPUNativeFunction[]; strictIntegers?: boolean; } export interface IDirectKernelSettings extends IKernelSettings { argumentTypes?: string[]; - functions?: string[]|IFunction; + functions?: string[] | IFunction; } export interface ITypesList { - [typeName: string]: GPUVariableType + [typeName: string]: GPUVariableType; } export interface IKernelRunShortcutBase extends Kernel { @@ -354,12 +407,12 @@ export interface IKernelRunShortcutBase extends Kernel { exec(): Promise; } -export interface IKernelRunShortcut extends IKernelRunShortcutBase { +export interface IKernelRunShortcut extends IKernelRunShortcutBase {} -} - -export interface IKernelMapRunShortcut extends IKernelRunShortcutBase< - { result: KernelOutput } & { [key in keyof SubKernelType]: KernelOutput }> {} +export interface IKernelMapRunShortcut + extends IKernelRunShortcutBase< + { result: KernelOutput } & { [key in keyof SubKernelType]: KernelOutput } + > {} export interface IKernelFeatures { isFloatRead: boolean; @@ -382,14 +435,14 @@ export interface IKernelFunctionThis { output: IKernelXYZ; thread: IKernelXYZ; constants: ConstantsT; - color(r: number): void, - color(r: number, g: number): void, - color(r: number, g: number, b: number): void, - color(r: number, g: number, b: number, a: number): void, + color(r: number): void; + color(r: number, g: number): void; + color(r: number, g: number, b: number): void; + color(r: number, g: number, b: number, a: number): void; } export type KernelVariable = - boolean + | boolean | number | Texture | Input @@ -407,8 +460,8 @@ export type KernelVariable = | Uint8ClampedArray | KernelOutput; -export type ThreadFunctionResult - = number +export type ThreadFunctionResult = + | number | number[] | number[][] | [number, number] @@ -417,35 +470,29 @@ export type ThreadFunctionResult | Pixel | Boolean; -export type ThreadKernelVariable - = boolean +export type ThreadKernelVariable = + | boolean | number | number[] | number[][] | number[][][] - | Float32Array | Float32Array[] | Float32Array[][] - | Pixel | Pixel[][] - | [number, number] | [number, number][] | [number, number][][] | [number, number][][][] - | [number, number, number] | [number, number, number][] | [number, number, number][][] | [number, number, number][][][] - | [number, number, number, number] | [number, number, number, number][] | [number, number, number, number][][] - | [number, number, number, number][][][] - ; + | [number, number, number, number][][][]; export type Pixel = { r: number; @@ -459,35 +506,31 @@ export type Pixel = { // ...args: ArgT // ) => KernelOutput); -export interface KernelFunction { - ( - this: IKernelFunctionThis, - ...args: ArgT - ): KernelOutput; +export interface KernelFunction< + ArgT extends ThreadKernelVariable[] = ThreadKernelVariable[], + ConstantsT = {} +> { + (this: IKernelFunctionThis, ...args: ArgT): KernelOutput; } -export type KernelOutput = void +export type KernelOutput = + | void | number | number[] | number[][] | number[][][] - | Float32Array | Float32Array[] | Float32Array[][] - | [number, number][] | [number, number, number][] | [number, number, number, number][] - | [number, number][][] | [number, number, number][][] | [number, number, number, number][][] - | [number, number][][][] | [number, number, number][][][] | [number, number, number, number][][][] - | Texture; export interface IFunction { @@ -525,9 +568,12 @@ export interface ISubKernel { returnType: string; } - export class FunctionBuilder { - static fromKernel(kernel: Kernel, FunctionNode: FunctionNode, extraNodeOptions?: any): FunctionBuilder; + static fromKernel( + kernel: Kernel, + FunctionNode: FunctionNode, + extraNodeOptions?: any + ): FunctionBuilder; constructor(settings: IFunctionBuilderSettings); addFunctionNode(functionNode: FunctionNode): void; traceFunctionCalls(functionName: string, retList?: string[]): string[]; @@ -537,7 +583,6 @@ export class FunctionBuilder { getPrototypeString(functionName: string): string; } - export interface IFunctionBuilderSettings { kernel: Kernel; rootNode: FunctionNode; @@ -552,7 +597,7 @@ export class FunctionNode implements IFunctionSettings { } export interface IFunctionNodeSettings extends IFunctionSettings { - argumentTypes: string[] + argumentTypes: string[]; } export class WebGLFunctionNode extends FunctionNode {} @@ -571,7 +616,7 @@ export interface IGPUTextureSettings { } export class Texture { - constructor(settings: IGPUTextureSettings) + constructor(settings: IGPUTextureSettings); toArray(): TextureArrayOutput; clone(): Texture; delete(): void; @@ -579,27 +624,22 @@ export class Texture { kernel: Kernel; } -export type TextureArrayOutput - = number[] +export type TextureArrayOutput = + | number[] | number[][] | number[][][] - | Float32Array | Float32Array[] | Float32Array[][] - | [number, number][] | [number, number][][] | [number, number][][][] - | [number, number, number][] | [number, number, number][][] | [number, number, number][][][] - | [number, number, number, number][] | [number, number, number, number][][] - | [number, number, number, number][][][] - ; + | [number, number, number, number][][][]; export interface IPlugin { source: string; @@ -610,7 +650,11 @@ export interface IPlugin { onBeforeRun: (kernel: Kernel) => void; } -export type OutputDimensions = [number] | [number, number] | [number, number, number] | Int32Array; +export type OutputDimensions = + | [number] + | [number, number] + | [number, number, number] + | Int32Array; export type TextureDimensions = [number, number]; export class Input { @@ -662,8 +706,8 @@ export interface IJSONSettings { } export declare const utils: { - getMinifySafeName: (arrowReference: () => T) => string -} + getMinifySafeName: (arrowReference: () => T) => string; +}; export interface IReason { type: 'argumentMismatch' | 'outputPrecisionMismatch'; diff --git a/src/index.js b/src/index.js index 3f6b2ba6..1feff7b6 100644 --- a/src/index.js +++ b/src/index.js @@ -1,57 +1,31 @@ -const { GPU } = require('./gpu'); -const { alias } = require('./alias'); -const { utils } = require('./utils'); -const { Input, input } = require('./input'); -const { Texture } = require('./texture'); -const { FunctionBuilder } = require('./backend/function-builder'); -const { FunctionNode } = require('./backend/function-node'); -const { CPUFunctionNode } = require('./backend/cpu/function-node'); -const { CPUKernel } = require('./backend/cpu/kernel'); - -const { HeadlessGLKernel } = require('./backend/headless-gl/kernel'); - -const { WebGLFunctionNode } = require('./backend/web-gl/function-node'); -const { WebGLKernel } = require('./backend/web-gl/kernel'); -const { kernelValueMaps: webGLKernelValueMaps } = require('./backend/web-gl/kernel-value-maps'); - -const { WebGL2FunctionNode } = require('./backend/web-gl2/function-node'); -const { WebGL2Kernel } = require('./backend/web-gl2/kernel'); -const { kernelValueMaps: webGL2KernelValueMaps } = require('./backend/web-gl2/kernel-value-maps'); - -const { GLKernel } = require('./backend/gl/kernel'); - -const { Kernel } = require('./backend/kernel'); - -const { FunctionTracer } = require('./backend/function-tracer'); - -const mathRandom = require('./plugins/math-random-uniformly-distributed'); - -module.exports = { - alias, - CPUFunctionNode, - CPUKernel, - GPU, - FunctionBuilder, - FunctionNode, - HeadlessGLKernel, - Input, - input, - Texture, - utils, - - WebGL2FunctionNode, - WebGL2Kernel, - webGL2KernelValueMaps, - - WebGLFunctionNode, - WebGLKernel, - webGLKernelValueMaps, - - GLKernel, - Kernel, - FunctionTracer, - - plugins: { - mathRandom - } -}; \ No newline at end of file +export { GPU } from './gpu'; +export { alias } from './alias'; +export { utils } from './utils'; +export { Input, input } from './input'; +export { Texture } from './texture'; +export { FunctionBuilder } from './backend/function-builder'; +export { FunctionNode } from './backend/function-node'; +export { CPUFunctionNode } from './backend/cpu/function-node'; +export { CPUKernel } from './backend/cpu/kernel'; + +export { HeadlessGLKernel } from './backend/headless-gl/kernel'; + +export { WebGLFunctionNode } from './backend/web-gl/function-node'; +export { WebGLKernel } from './backend/web-gl/kernel'; +export { kernelValueMaps as webGLKernelValueMaps } from './backend/web-gl/kernel-value-maps'; + +export { WebGL2FunctionNode } from './backend/web-gl2/function-node'; +export { WebGL2Kernel } from './backend/web-gl2/kernel'; +export { kernelValueMaps as webGL2KernelValueMaps } from './backend/web-gl2/kernel-value-maps'; + +export { GLKernel } from './backend/gl/kernel'; + +export { Kernel } from './backend/kernel'; + +export { FunctionTracer } from './backend/function-tracer'; + +import mathRandom from './plugins/math-random-uniformly-distributed'; + +export const plugins = { + mathRandom, +}; diff --git a/src/input.js b/src/input.js index 12f0c252..7af22f56 100644 --- a/src/input.js +++ b/src/input.js @@ -1,4 +1,6 @@ -class Input { +import { utils } from './utils'; + +export class Input { constructor(value, size) { this.value = value; if (Array.isArray(size)) { @@ -16,39 +18,49 @@ class Input { const [w, h, d] = this.size; if (d) { - if (this.value.length !== (w * h * d)) { - throw new Error(`Input size ${this.value.length} does not match ${w} * ${h} * ${d} = ${(h * w * d)}`); + if (this.value.length !== w * h * d) { + throw new Error( + `Input size ${ + this.value.length + } does not match ${w} * ${h} * ${d} = ${h * w * d}` + ); } } else if (h) { - if (this.value.length !== (w * h)) { - throw new Error(`Input size ${this.value.length} does not match ${w} * ${h} = ${(h * w)}`); + if (this.value.length !== w * h) { + throw new Error( + `Input size ${this.value.length} does not match ${w} * ${h} = ${ + h * w + }` + ); } } else { if (this.value.length !== w) { throw new Error(`Input size ${this.value.length} does not match ${w}`); } } - } toArray() { - const { utils } = require('./utils'); const [w, h, d] = this.size; if (d) { - return utils.erectMemoryOptimized3DFloat(this.value.subarray ? this.value : new Float32Array(this.value), w, h, d); + return utils.erectMemoryOptimized3DFloat( + this.value.subarray ? this.value : new Float32Array(this.value), + w, + h, + d + ); } else if (h) { - return utils.erectMemoryOptimized2DFloat(this.value.subarray ? this.value : new Float32Array(this.value), w, h); + return utils.erectMemoryOptimized2DFloat( + this.value.subarray ? this.value : new Float32Array(this.value), + w, + h + ); } else { return this.value; } } } -function input(value, size) { +export function input(value, size) { return new Input(value, size); } - -module.exports = { - Input, - input -}; \ No newline at end of file diff --git a/src/kernel-run-shortcut.js b/src/kernel-run-shortcut.js index b878c569..3a956573 100644 --- a/src/kernel-run-shortcut.js +++ b/src/kernel-run-shortcut.js @@ -1,18 +1,22 @@ -const { utils } = require('./utils'); +import { utils } from './utils'; /** * Makes kernels easier for mortals (including me) * @param kernel * @returns {function()} */ -function kernelRunShortcut(kernel) { - let run = function() { +export function kernelRunShortcut(kernel) { + let run = function () { kernel.build.apply(kernel, arguments); - run = function() { + run = function () { let result = kernel.run.apply(kernel, arguments); if (kernel.switchingKernels) { const reasons = kernel.resetSwitchingKernels(); - const newKernel = kernel.onRequestSwitchKernel(reasons, arguments, kernel); + const newKernel = kernel.onRequestSwitchKernel( + reasons, + arguments, + kernel + ); shortcut.kernel = kernel = newKernel; result = newKernel.run.apply(newKernel, arguments); } @@ -26,14 +30,14 @@ function kernelRunShortcut(kernel) { }; return run.apply(kernel, arguments); }; - const shortcut = function() { + const shortcut = function () { return run.apply(kernel, arguments); }; /** * Run kernel in async mode * @returns {Promise} */ - shortcut.exec = function() { + shortcut.exec = function () { return new Promise((accept, reject) => { try { accept(run.apply(this, arguments)); @@ -42,7 +46,7 @@ function kernelRunShortcut(kernel) { } }); }; - shortcut.replaceKernel = function(replacementKernel) { + shortcut.replaceKernel = function (replacementKernel) { kernel = replacementKernel; bindKernelToShortcut(kernel, shortcut); }; @@ -61,25 +65,25 @@ function bindKernelToShortcut(kernel, shortcut) { const property = properties[i]; if (property[0] === '_' && property[1] === '_') continue; if (typeof kernel[property] === 'function') { - if (property.substring(0, 3) === 'add' || property.substring(0, 3) === 'set') { - shortcut[property] = function() { + if ( + property.substring(0, 3) === 'add' || + property.substring(0, 3) === 'set' + ) { + shortcut[property] = function () { shortcut.kernel[property].apply(shortcut.kernel, arguments); return shortcut; }; } else { - shortcut[property] = function() { + shortcut[property] = function () { return shortcut.kernel[property].apply(shortcut.kernel, arguments); }; } } else { shortcut.__defineGetter__(property, () => shortcut.kernel[property]); - shortcut.__defineSetter__(property, (value) => { + shortcut.__defineSetter__(property, value => { shortcut.kernel[property] = value; }); } } shortcut.kernel = kernel; } -module.exports = { - kernelRunShortcut -}; \ No newline at end of file diff --git a/src/plugins/math-random-triangle-noise.js b/src/plugins/math-random-triangle-noise.js index 301832be..acc1eb34 100644 --- a/src/plugins/math-random-triangle-noise.js +++ b/src/plugins/math-random-triangle-noise.js @@ -34,7 +34,7 @@ const functionReplace = 'nrand(vTexCoord)'; const functionReturnType = 'Number'; -const onBeforeRun = (kernel) => { +const onBeforeRun = kernel => { kernel.setUniform1f('triangle_noise_seed', Math.random()); }; @@ -42,11 +42,11 @@ const onBeforeRun = (kernel) => { * * @type IPlugin */ -module.exports = { +export default { name, onBeforeRun, functionMatch, functionReplace, functionReturnType, - source -}; \ No newline at end of file + source, +}; diff --git a/src/plugins/math-random-uniformly-distributed.js b/src/plugins/math-random-uniformly-distributed.js index 851443c7..42ce8d11 100644 --- a/src/plugins/math-random-uniformly-distributed.js +++ b/src/plugins/math-random-uniformly-distributed.js @@ -29,7 +29,7 @@ const functionReturnType = 'Number'; * * @param {Kernel} kernel */ -const onBeforeRun = (kernel) => { +const onBeforeRun = kernel => { kernel.setUniform1f('randomSeed1', Math.random()); kernel.setUniform1f('randomSeed2', Math.random()); }; @@ -44,7 +44,7 @@ const plugin = { functionMatch, functionReplace, functionReturnType, - source + source, }; -module.exports = plugin; \ No newline at end of file +export default plugin; diff --git a/src/texture.js b/src/texture.js index fd7ad132..fd9b6ebe 100644 --- a/src/texture.js +++ b/src/texture.js @@ -2,7 +2,7 @@ * @desc WebGl Texture implementation in JS * @param {IGPUTextureSettings} settings */ -class Texture { +export class Texture { constructor(settings) { const { texture, @@ -13,7 +13,7 @@ class Texture { type = 'NumberTexture', kernel, internalFormat, - textureFormat + textureFormat, } = settings; if (!output) throw new Error('settings property "output" required.'); if (!context) throw new Error('settings property "context" required.'); @@ -66,7 +66,3 @@ class Texture { throw new Error(`Not implemented on ${this.constructor.name}`); } } - -module.exports = { - Texture -}; \ No newline at end of file diff --git a/src/utils.js b/src/utils.js index cfcf45ff..64ff9f97 100644 --- a/src/utils.js +++ b/src/utils.js @@ -1,9 +1,9 @@ -const acorn = require('acorn'); -const { Input } = require('./input'); -const { Texture } = require('./texture'); +import * as acorn from 'acorn'; +import { Input } from './input'; +import { Texture } from './texture'; const FUNCTION_NAME = /function ([^(]*)/; -const STRIP_COMMENTS = /((\/\/.*$)|(\/\*[\s\S]*?\*\/))/mg; +const STRIP_COMMENTS = /((\/\/.*$)|(\/\*[\s\S]*?\*\/))/gm; const ARGUMENT_NAMES = /([^\s,]+)/g; /** @@ -12,7 +12,7 @@ const ARGUMENT_NAMES = /([^\s,]+)/g; * @type {utils} * This covers various snippets of code that is not entirely gpu.js specific (ie. may find uses elsewhere) */ -const utils = { +export const utils = { /** * * @desc Gets the system endianness, and cache it @@ -38,7 +38,7 @@ const utils = { * @returns {Boolean} TRUE if the object is a JS function */ isFunction(funcObj) { - return typeof(funcObj) === 'function'; + return typeof funcObj === 'function'; }, /** @@ -50,9 +50,7 @@ const utils = { */ isFunctionString(fn) { if (typeof fn === 'string') { - return (fn - .slice(0, 'function'.length) - .toLowerCase() === 'function'); + return fn.slice(0, 'function'.length).toLowerCase() === 'function'; } return false; }, @@ -69,7 +67,10 @@ const utils = { }, getFunctionBodyFromString(funcStr) { - return funcStr.substring(funcStr.indexOf('{') + 1, funcStr.lastIndexOf('}')); + return funcStr.substring( + funcStr.indexOf('{') + 1, + funcStr.lastIndexOf('}') + ); }, /** @@ -79,7 +80,9 @@ const utils = { */ getArgumentNamesFromString(fn) { const fnStr = fn.replace(STRIP_COMMENTS, ''); - let result = fnStr.slice(fnStr.indexOf('(') + 1, fnStr.indexOf(')')).match(ARGUMENT_NAMES); + let result = fnStr + .slice(fnStr.indexOf('(') + 1, fnStr.indexOf(')')) + .match(ARGUMENT_NAMES); if (result === null) { result = []; } @@ -92,7 +95,12 @@ const utils = { * @returns {Object|Array} Cloned object */ clone(obj) { - if (obj === null || typeof obj !== 'object' || obj.hasOwnProperty('isActiveClone')) return obj; + if ( + obj === null || + typeof obj !== 'object' || + obj.hasOwnProperty('isActiveClone') + ) + return obj; const temp = obj.constructor(); // changed @@ -154,11 +162,20 @@ const utils = { } } else if (value.hasOwnProperty('type')) { return value.type; - } else if (typeof OffscreenCanvas !== 'undefined' && value instanceof OffscreenCanvas) { + } else if ( + typeof OffscreenCanvas !== 'undefined' && + value instanceof OffscreenCanvas + ) { return 'OffscreenCanvas'; - } else if (typeof ImageBitmap !== 'undefined' && value instanceof ImageBitmap) { + } else if ( + typeof ImageBitmap !== 'undefined' && + value instanceof ImageBitmap + ) { return 'ImageBitmap'; - } else if (typeof ImageData !== 'undefined' && value instanceof ImageData) { + } else if ( + typeof ImageData !== 'undefined' && + value instanceof ImageData + ) { return 'ImageData'; } return 'Unknown'; @@ -201,7 +218,13 @@ const utils = { * @returns {TextureDimensions} */ getMemoryOptimizedFloatTextureSize(dimensions, bitRatio) { - const totalArea = utils.roundTo((dimensions[0] || 1) * (dimensions[1] || 1) * (dimensions[2] || 1) * (dimensions[3] || 1), 4); + const totalArea = utils.roundTo( + (dimensions[0] || 1) * + (dimensions[1] || 1) * + (dimensions[2] || 1) * + (dimensions[3] || 1), + 4 + ); const texelCount = totalArea / bitRatio; return utils.closestSquareDimensions(texelCount); }, @@ -335,7 +358,9 @@ const utils = { splitArray(array, part) { const result = []; for (let i = 0; i < array.length; i += part) { - result.push(new array.constructor(array.buffer, i * 4 + array.byteOffset, part)); + result.push( + new array.constructor(array.buffer, i * 4 + array.byteOffset, part) + ); } return result; }, @@ -362,7 +387,7 @@ const utils = { do { props.push.apply(props, Object.getOwnPropertyNames(obj)); - } while (obj = Object.getPrototypeOf(obj)); + } while ((obj = Object.getPrototypeOf(obj))); return props; }, @@ -380,14 +405,18 @@ const utils = { }, warnDeprecated(type, oldName, newName) { if (newName) { - console.warn(`You are using a deprecated ${ type } "${ oldName }". It has been replaced with "${ newName }". Fixing, but please upgrade as it will soon be removed.`); + console.warn( + `You are using a deprecated ${type} "${oldName}". It has been replaced with "${newName}". Fixing, but please upgrade as it will soon be removed.` + ); } else { - console.warn(`You are using a deprecated ${ type } "${ oldName }". It has been removed. Fixing, but please upgrade as it will soon be removed.`); + console.warn( + `You are using a deprecated ${type} "${oldName}". It has been removed. Fixing, but please upgrade as it will soon be removed.` + ); } }, flipPixels: (pixels, width, height) => { // https://stackoverflow.com/a/41973289/1324039 - const halfHeight = height / 2 | 0; // the | 0 keeps the result an int + const halfHeight = (height / 2) | 0; // the | 0 keeps the result an int const bytesPerRow = width * 4; // make a temp buffer to hold one row const temp = new Uint8ClampedArray(width * 4); @@ -424,7 +453,7 @@ const utils = { for (let z = 0; z < depth; z++) { const yResults = new Array(height); for (let y = 0; y < height; y++) { - const xStart = (z * height * width) + y * width; + const xStart = z * height * width + y * width; const xEnd = xStart + width; yResults[y] = array.subarray(xStart, xEnd); } @@ -448,7 +477,7 @@ const utils = { for (let z = 0; z < depth; z++) { const yResults = new Array(height); for (let y = 0; y < height; y++) { - const offset = (z * height * width) + (y * width); + const offset = z * height * width + y * width; yResults[y] = array.subarray(offset, offset + width); } zResults[z] = yResults; @@ -524,7 +553,7 @@ const utils = { const yResults = new Array(height); for (let y = 0; y < height; y++) { const xResults = new Array(width); - const offset = (z * xResultsMax * height) + (y * xResultsMax); + const offset = z * xResultsMax * height + y * xResultsMax; let i = 0; for (let x = 0; x < xResultsMax; x += 4) { xResults[i++] = array.subarray(x + offset, x + offset + 2); @@ -565,7 +594,7 @@ const utils = { const yResults = new Array(height); for (let y = 0; y < height; y++) { const xResults = new Array(width); - const offset = (z * xResultsMax * height) + (y * xResultsMax); + const offset = z * xResultsMax * height + y * xResultsMax; let i = 0; for (let x = 0; x < xResultsMax; x += 4) { xResults[i++] = array.subarray(x + offset, x + offset + 3); @@ -606,7 +635,7 @@ const utils = { const yResults = new Array(height); for (let y = 0; y < height; y++) { const xResults = new Array(width); - const offset = (z * xResultsMax * height) + (y * xResultsMax); + const offset = z * xResultsMax * height + y * xResultsMax; let i = 0; for (let x = 0; x < xResultsMax; x += 4) { xResults[i++] = array.subarray(x + offset, x + offset + 4); @@ -630,7 +659,7 @@ const utils = { if (!flattened) { flattened = settings.flattened = {}; } - const ast = acorn.parse(source); + const ast = acorn.parse(source, { ecmaVersion: 'latest' }); const functionDependencies = []; let indent = 0; @@ -644,9 +673,14 @@ const utils = { } switch (ast.type) { case 'Program': - return flatten(ast.body) + (ast.body[0].type === 'VariableDeclaration' ? ';' : ''); + return ( + flatten(ast.body) + + (ast.body[0].type === 'VariableDeclaration' ? ';' : '') + ); case 'FunctionDeclaration': - return `function ${ast.id.name}(${ast.params.map(flatten).join(', ')}) ${ flatten(ast.body) }`; + return `function ${ast.id.name}(${ast.params + .map(flatten) + .join(', ')}) ${flatten(ast.body)}`; case 'BlockStatement': { const result = []; indent += 2; @@ -660,7 +694,8 @@ const utils = { return `{\n${result.join('')}}`; } case 'VariableDeclaration': - const declarations = utils.normalizeDeclarations(ast) + const declarations = utils + .normalizeDeclarations(ast) .map(flatten) .filter(r => r !== null); if (declarations.length < 1) { @@ -668,99 +703,127 @@ const utils = { } else { return `${ast.kind} ${declarations.join(',')}`; } - case 'VariableDeclarator': - if (ast.init.object && ast.init.object.type === 'ThisExpression') { - const lookup = thisLookup(ast.init.property.name, true); - if (lookup) { - return `${ast.id.name} = ${flatten(ast.init)}`; - } else { - return null; - } - } else { + case 'VariableDeclarator': + if (ast.init.object && ast.init.object.type === 'ThisExpression') { + const lookup = thisLookup(ast.init.property.name, true); + if (lookup) { return `${ast.id.name} = ${flatten(ast.init)}`; + } else { + return null; } - case 'CallExpression': { - if (ast.callee.property.name === 'subarray') { - return `${flatten(ast.callee.object)}.${flatten(ast.callee.property)}(${ast.arguments.map(value => flatten(value)).join(', ')})`; - } - if (ast.callee.object.name === 'gl' || ast.callee.object.name === 'context') { - return `${flatten(ast.callee.object)}.${flatten(ast.callee.property)}(${ast.arguments.map(value => flatten(value)).join(', ')})`; - } - if (ast.callee.object.type === 'ThisExpression') { - functionDependencies.push(findDependency('this', ast.callee.property.name)); - return `${ast.callee.property.name}(${ast.arguments.map(value => flatten(value)).join(', ')})`; - } else if (ast.callee.object.name) { - const foundSource = findDependency(ast.callee.object.name, ast.callee.property.name); - if (foundSource === null) { - // we're not flattening it - return `${ast.callee.object.name}.${ast.callee.property.name}(${ast.arguments.map(value => flatten(value)).join(', ')})`; - } else { - functionDependencies.push(foundSource); - // we're flattening it - return `${ast.callee.property.name}(${ast.arguments.map(value => flatten(value)).join(', ')})`; - } - } else if (ast.callee.object.type === 'MemberExpression') { - return `${flatten(ast.callee.object)}.${ast.callee.property.name}(${ast.arguments.map(value => flatten(value)).join(', ')})`; - } else { - throw new Error('unknown ast.callee'); - } + } else { + return `${ast.id.name} = ${flatten(ast.init)}`; + } + case 'CallExpression': { + if (ast.callee.property.name === 'subarray') { + return `${flatten(ast.callee.object)}.${flatten( + ast.callee.property + )}(${ast.arguments.map(value => flatten(value)).join(', ')})`; + } + if ( + ast.callee.object.name === 'gl' || + ast.callee.object.name === 'context' + ) { + return `${flatten(ast.callee.object)}.${flatten( + ast.callee.property + )}(${ast.arguments.map(value => flatten(value)).join(', ')})`; + } + if (ast.callee.object.type === 'ThisExpression') { + functionDependencies.push( + findDependency('this', ast.callee.property.name) + ); + return `${ast.callee.property.name}(${ast.arguments + .map(value => flatten(value)) + .join(', ')})`; + } else if (ast.callee.object.name) { + const foundSource = findDependency( + ast.callee.object.name, + ast.callee.property.name + ); + if (foundSource === null) { + // we're not flattening it + return `${ast.callee.object.name}.${ + ast.callee.property.name + }(${ast.arguments.map(value => flatten(value)).join(', ')})`; + } else { + functionDependencies.push(foundSource); + // we're flattening it + return `${ast.callee.property.name}(${ast.arguments + .map(value => flatten(value)) + .join(', ')})`; } - case 'ReturnStatement': - return `return ${flatten(ast.argument)}`; - case 'BinaryExpression': - return `(${flatten(ast.left)}${ast.operator}${flatten(ast.right)})`; - case 'UnaryExpression': - if (ast.prefix) { - return `${ast.operator} ${flatten(ast.argument)}`; - } else { - return `${flatten(ast.argument)} ${ast.operator}`; - } - case 'ExpressionStatement': - return `${flatten(ast.expression)}`; - case 'SequenceExpression': - return `(${flatten(ast.expressions)})`; - case 'ArrowFunctionExpression': - return `(${ast.params.map(flatten).join(', ')}) => ${flatten(ast.body)}`; - case 'Literal': - return ast.raw; - case 'Identifier': - return ast.name; - case 'MemberExpression': - if (ast.object.type === 'ThisExpression') { - return thisLookup(ast.property.name); - } - if (ast.computed) { - return `${flatten(ast.object)}[${flatten(ast.property)}]`; - } - return flatten(ast.object) + '.' + flatten(ast.property); - case 'ThisExpression': - return 'this'; - case 'NewExpression': - return `new ${flatten(ast.callee)}(${ast.arguments.map(value => flatten(value)).join(', ')})`; - case 'ForStatement': - return `for (${flatten(ast.init)};${flatten(ast.test)};${flatten(ast.update)}) ${flatten(ast.body)}`; - case 'AssignmentExpression': - return `${flatten(ast.left)}${ast.operator}${flatten(ast.right)}`; - case 'UpdateExpression': - return `${flatten(ast.argument)}${ast.operator}`; - case 'IfStatement': - return `if (${flatten(ast.test)}) ${flatten(ast.consequent)}`; - case 'ThrowStatement': - return `throw ${flatten(ast.argument)}`; - case 'ObjectPattern': - return ast.properties.map(flatten).join(', '); - case 'ArrayPattern': - return ast.elements.map(flatten).join(', '); - case 'DebuggerStatement': - return 'debugger;'; - case 'ConditionalExpression': - return `${flatten(ast.test)}?${flatten(ast.consequent)}:${flatten(ast.alternate)}`; - case 'Property': - if (ast.kind === 'init') { - return flatten(ast.key); - } + } else if (ast.callee.object.type === 'MemberExpression') { + return `${flatten(ast.callee.object)}.${ + ast.callee.property.name + }(${ast.arguments.map(value => flatten(value)).join(', ')})`; + } else { + throw new Error('unknown ast.callee'); + } + } + case 'ReturnStatement': + return `return ${flatten(ast.argument)}`; + case 'BinaryExpression': + return `(${flatten(ast.left)}${ast.operator}${flatten(ast.right)})`; + case 'UnaryExpression': + if (ast.prefix) { + return `${ast.operator} ${flatten(ast.argument)}`; + } else { + return `${flatten(ast.argument)} ${ast.operator}`; + } + case 'ExpressionStatement': + return `${flatten(ast.expression)}`; + case 'SequenceExpression': + return `(${flatten(ast.expressions)})`; + case 'ArrowFunctionExpression': + return `(${ast.params.map(flatten).join(', ')}) => ${flatten( + ast.body + )}`; + case 'Literal': + return ast.raw; + case 'Identifier': + return ast.name; + case 'MemberExpression': + if (ast.object.type === 'ThisExpression') { + return thisLookup(ast.property.name); + } + if (ast.computed) { + return `${flatten(ast.object)}[${flatten(ast.property)}]`; + } + return flatten(ast.object) + '.' + flatten(ast.property); + case 'ThisExpression': + return 'this'; + case 'NewExpression': + return `new ${flatten(ast.callee)}(${ast.arguments + .map(value => flatten(value)) + .join(', ')})`; + case 'ForStatement': + return `for (${flatten(ast.init)};${flatten(ast.test)};${flatten( + ast.update + )}) ${flatten(ast.body)}`; + case 'AssignmentExpression': + return `${flatten(ast.left)}${ast.operator}${flatten(ast.right)}`; + case 'UpdateExpression': + return `${flatten(ast.argument)}${ast.operator}`; + case 'IfStatement': + return `if (${flatten(ast.test)}) ${flatten(ast.consequent)}`; + case 'ThrowStatement': + return `throw ${flatten(ast.argument)}`; + case 'ObjectPattern': + return ast.properties.map(flatten).join(', '); + case 'ArrayPattern': + return ast.elements.map(flatten).join(', '); + case 'DebuggerStatement': + return 'debugger;'; + case 'ConditionalExpression': + return `${flatten(ast.test)}?${flatten(ast.consequent)}:${flatten( + ast.alternate + )}`; + case 'Property': + if (ast.kind === 'init') { + return flatten(ast.key); + } } - throw new Error(`unhandled ast.type of ${ ast.type }`); + throw new Error(`unhandled ast.type of ${ast.type}`); } const result = flatten(ast); if (functionDependencies.length > 0) { @@ -770,31 +833,56 @@ const utils = { if (!flattened[functionDependency]) { flattened[functionDependency] = true; } - functionDependency ? flattenedFunctionDependencies.push(utils.flattenFunctionToString(functionDependency, settings) + '\n') : ''; + functionDependency + ? flattenedFunctionDependencies.push( + utils.flattenFunctionToString(functionDependency, settings) + + '\n' + ) + : ''; } return flattenedFunctionDependencies.join('') + result; } return result; }, - normalizeDeclarations: (ast) => { - if (ast.type !== 'VariableDeclaration') throw new Error('Ast is not of type "VariableDeclaration"'); + normalizeDeclarations: ast => { + if (ast.type !== 'VariableDeclaration') + throw new Error('Ast is not of type "VariableDeclaration"'); const normalizedDeclarations = []; - for (let declarationIndex = 0; declarationIndex < ast.declarations.length; declarationIndex++) { + for ( + let declarationIndex = 0; + declarationIndex < ast.declarations.length; + declarationIndex++ + ) { const declaration = ast.declarations[declarationIndex]; - if (declaration.id && declaration.id.type === 'ObjectPattern' && declaration.id.properties) { + if ( + declaration.id && + declaration.id.type === 'ObjectPattern' && + declaration.id.properties + ) { const { properties } = declaration.id; - for (let propertyIndex = 0; propertyIndex < properties.length; propertyIndex++) { + for ( + let propertyIndex = 0; + propertyIndex < properties.length; + propertyIndex++ + ) { const property = properties[propertyIndex]; - if (property.value.type === 'ObjectPattern' && property.value.properties) { - for (let subPropertyIndex = 0; subPropertyIndex < property.value.properties.length; subPropertyIndex++) { + if ( + property.value.type === 'ObjectPattern' && + property.value.properties + ) { + for ( + let subPropertyIndex = 0; + subPropertyIndex < property.value.properties.length; + subPropertyIndex++ + ) { const subProperty = property.value.properties[subPropertyIndex]; if (subProperty.type === 'Property') { normalizedDeclarations.push({ type: 'VariableDeclarator', id: { type: 'Identifier', - name: subProperty.key.name + name: subProperty.key.name, }, init: { type: 'MemberExpression', @@ -803,16 +891,16 @@ const utils = { object: declaration.init, property: { type: 'Identifier', - name: property.key.name + name: property.key.name, }, - computed: false + computed: false, }, property: { type: 'Identifier', - name: subProperty.key.name + name: subProperty.key.name, }, - computed: false - } + computed: false, + }, }); } else { throw new Error('unexpected state'); @@ -823,32 +911,43 @@ const utils = { type: 'VariableDeclarator', id: { type: 'Identifier', - name: property.value && property.value.name ? property.value.name : property.key.name + name: + property.value && property.value.name + ? property.value.name + : property.key.name, }, init: { type: 'MemberExpression', object: declaration.init, property: { type: 'Identifier', - name: property.key.name + name: property.key.name, }, - computed: false - } + computed: false, + }, }); } else { throw new Error('unexpected state'); } } - } else if (declaration.id && declaration.id.type === 'ArrayPattern' && declaration.id.elements) { + } else if ( + declaration.id && + declaration.id.type === 'ArrayPattern' && + declaration.id.elements + ) { const { elements } = declaration.id; - for (let elementIndex = 0; elementIndex < elements.length; elementIndex++) { + for ( + let elementIndex = 0; + elementIndex < elements.length; + elementIndex++ + ) { const element = elements[elementIndex]; if (element.type === 'Identifier') { normalizedDeclarations.push({ type: 'VariableDeclarator', id: { type: 'Identifier', - name: element.name + name: element.name, }, init: { type: 'MemberExpression', @@ -858,10 +957,10 @@ const utils = { value: elementIndex, raw: elementIndex.toString(), start: element.start, - end: element.end + end: element.end, }, - computed: true - } + computed: true, + }, }); } else { throw new Error('unexpected state'); @@ -881,38 +980,50 @@ const utils = { * @return {Array} */ splitHTMLImageToRGB: (gpu, image) => { - const rKernel = gpu.createKernel(function(a) { - const pixel = a[this.thread.y][this.thread.x]; - return pixel.r * 255; - }, { - output: [image.width, image.height], - precision: 'unsigned', - argumentTypes: { a: 'HTMLImage' }, - }); - const gKernel = gpu.createKernel(function(a) { - const pixel = a[this.thread.y][this.thread.x]; - return pixel.g * 255; - }, { - output: [image.width, image.height], - precision: 'unsigned', - argumentTypes: { a: 'HTMLImage' }, - }); - const bKernel = gpu.createKernel(function(a) { - const pixel = a[this.thread.y][this.thread.x]; - return pixel.b * 255; - }, { - output: [image.width, image.height], - precision: 'unsigned', - argumentTypes: { a: 'HTMLImage' }, - }); - const aKernel = gpu.createKernel(function(a) { - const pixel = a[this.thread.y][this.thread.x]; - return pixel.a * 255; - }, { - output: [image.width, image.height], - precision: 'unsigned', - argumentTypes: { a: 'HTMLImage' }, - }); + const rKernel = gpu.createKernel( + function (a) { + const pixel = a[this.thread.y][this.thread.x]; + return pixel.r * 255; + }, + { + output: [image.width, image.height], + precision: 'unsigned', + argumentTypes: { a: 'HTMLImage' }, + } + ); + const gKernel = gpu.createKernel( + function (a) { + const pixel = a[this.thread.y][this.thread.x]; + return pixel.g * 255; + }, + { + output: [image.width, image.height], + precision: 'unsigned', + argumentTypes: { a: 'HTMLImage' }, + } + ); + const bKernel = gpu.createKernel( + function (a) { + const pixel = a[this.thread.y][this.thread.x]; + return pixel.b * 255; + }, + { + output: [image.width, image.height], + precision: 'unsigned', + argumentTypes: { a: 'HTMLImage' }, + } + ); + const aKernel = gpu.createKernel( + function (a) { + const pixel = a[this.thread.y][this.thread.x]; + return pixel.a * 255; + }, + { + output: [image.width, image.height], + precision: 'unsigned', + argumentTypes: { a: 'HTMLImage' }, + } + ); const result = [ rKernel(image), gKernel(image), @@ -936,44 +1047,56 @@ const utils = { * @return {Object[]} */ splitRGBAToCanvases: (gpu, rgba, width, height) => { - const visualKernelR = gpu.createKernel(function(v) { - const pixel = v[this.thread.y][this.thread.x]; - this.color(pixel.r / 255, 0, 0, 255); - }, { - output: [width, height], - graphical: true, - argumentTypes: { v: 'Array2D(4)' } - }); + const visualKernelR = gpu.createKernel( + function (v) { + const pixel = v[this.thread.y][this.thread.x]; + this.color(pixel.r / 255, 0, 0, 255); + }, + { + output: [width, height], + graphical: true, + argumentTypes: { v: 'Array2D(4)' }, + } + ); visualKernelR(rgba); - const visualKernelG = gpu.createKernel(function(v) { - const pixel = v[this.thread.y][this.thread.x]; - this.color(0, pixel.g / 255, 0, 255); - }, { - output: [width, height], - graphical: true, - argumentTypes: { v: 'Array2D(4)' } - }); + const visualKernelG = gpu.createKernel( + function (v) { + const pixel = v[this.thread.y][this.thread.x]; + this.color(0, pixel.g / 255, 0, 255); + }, + { + output: [width, height], + graphical: true, + argumentTypes: { v: 'Array2D(4)' }, + } + ); visualKernelG(rgba); - const visualKernelB = gpu.createKernel(function(v) { - const pixel = v[this.thread.y][this.thread.x]; - this.color(0, 0, pixel.b / 255, 255); - }, { - output: [width, height], - graphical: true, - argumentTypes: { v: 'Array2D(4)' } - }); + const visualKernelB = gpu.createKernel( + function (v) { + const pixel = v[this.thread.y][this.thread.x]; + this.color(0, 0, pixel.b / 255, 255); + }, + { + output: [width, height], + graphical: true, + argumentTypes: { v: 'Array2D(4)' }, + } + ); visualKernelB(rgba); - const visualKernelA = gpu.createKernel(function(v) { - const pixel = v[this.thread.y][this.thread.x]; - this.color(255, 255, 255, pixel.a / 255); - }, { - output: [width, height], - graphical: true, - argumentTypes: { v: 'Array2D(4)' } - }); + const visualKernelA = gpu.createKernel( + function (v) { + const pixel = v[this.thread.y][this.thread.x]; + this.color(255, 255, 255, pixel.a / 255); + }, + { + output: [width, height], + graphical: true, + argumentTypes: { v: 'Array2D(4)' }, + } + ); visualKernelA(rgba); return [ visualKernelR.canvas, @@ -983,16 +1106,20 @@ const utils = { ]; }, - getMinifySafeName: (fn) => { + getMinifySafeName: fn => { try { - const ast = acorn.parse(`const value = ${fn.toString()}`); + const ast = acorn.parse(`const value = ${fn.toString()}`, { + ecmaVersion: 'latest', + }); const { init } = ast.body[0].declarations[0]; return init.body.name || init.body.body[0].argument.name; } catch (e) { - throw new Error('Unrecognized function type. Please use `() => yourFunctionVariableHere` or function() { return yourFunctionVariableHere; }'); + throw new Error( + 'Unrecognized function type. Please use `() => yourFunctionVariableHere` or function() { return yourFunctionVariableHere; }' + ); } }, - sanitizeName: function(name) { + sanitizeName: function (name) { if (dollarSign.test(name)) { name = name.replace(dollarSign, 'S_S'); } @@ -1002,7 +1129,7 @@ const utils = { name = name.replace(singleUnderscore, 'u_u'); } return name; - } + }, }; const dollarSign = /\$/; @@ -1010,7 +1137,3 @@ const doubleUnderscore = /__/; const singleUnderscore = /_/; const _systemEndianness = utils.getSystemEndianness(); - -module.exports = { - utils -}; \ No newline at end of file diff --git a/test/all-template.html b/test/all-template.html index a605e8e7..c0bc0db2 100644 --- a/test/all-template.html +++ b/test/all-template.html @@ -1,41 +1,42 @@ - - - GPU.JS : Test All - + + + GPU.JS : Test All + - - - - - -

-
- - - - -{{test-files}} - + + + + + +
+
+ + + + + {{test-files}} + diff --git a/test/all.html b/test/all.html deleted file mode 100644 index 460fd639..00000000 --- a/test/all.html +++ /dev/null @@ -1,328 +0,0 @@ - - - - - GPU.JS : Test All - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/test/benchmark-faster.js b/test/benchmark-faster.js index a41e505c..19b2b0d8 100644 --- a/test/benchmark-faster.js +++ b/test/benchmark-faster.js @@ -1,7 +1,7 @@ -const { GPU } = require('../src/index.js'); +const { GPU } = require('..'); const Benchmark = require('benchmark'); -const suite = new Benchmark.Suite; +const suite = new Benchmark.Suite(); const size = 512; @@ -9,35 +9,35 @@ const gpu = new GPU({ mode: 'gpu' }); const cpu = new GPU({ mode: 'cpu' }); const gpuKernel = gpu - .createKernel(function(i, j) { + .createKernel(function (i, j) { return i[this.thread.x] + j[this.thread.x]; }) .setOutput([size, size]); const gpuArg1 = gpu - .createKernel(function() { + .createKernel(function () { return 0.89; }) .setPipeline(true) .setOutput([size, size])(); const gpuArg2 = gpu - .createKernel(function() { + .createKernel(function () { return this.thread.x; }) .setPipeline(true) .setOutput([size, size])(); const cpuKernel = cpu - .createKernel(function(i, j) { + .createKernel(function (i, j) { return i[this.thread.x] + j[this.thread.x]; }) .setOutput([size, size]); const cpuArg1 = cpu - .createKernel(function() { + .createKernel(function () { return 0.89; }) .setOutput([size, size])(); const cpuArg2 = cpu - .createKernel(function() { + .createKernel(function () { return this.thread.x; }) .setOutput([size, size])(); @@ -49,7 +49,7 @@ suite .add('cpu', () => { cpuKernel(cpuArg1, cpuArg2); }) - .on('cycle', (event) => { + .on('cycle', event => { console.log(String(event.target)); }) .on('complete', function () { diff --git a/test/benchmark.js b/test/benchmark.js index 86e72d14..595885c3 100644 --- a/test/benchmark.js +++ b/test/benchmark.js @@ -1,4 +1,4 @@ -const { GPU } = require('../src/index.js'); +const { GPU } = require('..'); const Benchmark = require('benchmark'); const suite = new Benchmark.Suite(); @@ -12,7 +12,7 @@ const b = randomMatrix(size, size); function randomMatrix(width, height) { const matrix = new Array(height); for (let y = 0; y < height; y++) { - const row = matrix[y] = new Float32Array(width); + const row = (matrix[y] = new Float32Array(width)); for (let x = 0; x < width; x++) { row[x] = Math.random(); } @@ -21,7 +21,7 @@ function randomMatrix(width, height) { } const gpuKernel = gpu - .createKernel(function(a, b) { + .createKernel(function (a, b) { let sum = 0; for (let i = 0; i < this.constants.size; i++) { sum += a[this.thread.y][i] * b[i][this.thread.x]; @@ -29,14 +29,14 @@ const gpuKernel = gpu return sum; }) .setConstants({ - size + size, }) .setPipeline(false) .setPrecision('unsigned') .setOutput([size, size]); const cpuKernel = cpu - .createKernel(function(a, b) { + .createKernel(function (a, b) { let sum = 0; for (let i = 0; i < this.constants.size; i++) { sum += a[this.thread.y][i] * b[i][this.thread.x]; @@ -44,7 +44,7 @@ const cpuKernel = cpu return sum; }) .setConstants({ - size + size, }) .setOutput([size, size]); @@ -61,7 +61,7 @@ suite cpuKernel(a, b); }) // add listeners - .on('cycle', (event) => { + .on('cycle', event => { console.log(String(event.target)); }) .on('complete', function () { diff --git a/test/browser-test-utils.js b/test/browser-test-utils.js index f3020caf..45255f7d 100644 --- a/test/browser-test-utils.js +++ b/test/browser-test-utils.js @@ -28,7 +28,7 @@ function imageToArray(image) { } function loadImage(image) { - return new Promise((resolve) => { + return new Promise(resolve => { if (typeof image === 'string') { const src = image; image = new Image(); @@ -50,7 +50,9 @@ function check2DImage(result, expected, channel) { for (let y = 0; y < height; y++) { for (let x = 0; x < width; x++) { if (result[y][x] !== expected[y][x][channel]) { - throw new Error(`result[${y}][${x}] value does not match expected value of ${expected[y][x][channel]}`); + throw new Error( + `result[${y}][${x}] value does not match expected value of ${expected[y][x][channel]}` + ); } } } @@ -59,9 +61,12 @@ function check2DImage(result, expected, channel) { function greenCanvas(mode, width, height) { const gpu = new GPU({ mode }); - const kernel = gpu.createKernel(function() { - this.color(0, 1, 0, 1); - }, { output: [width, height], graphical: true }); + const kernel = gpu.createKernel( + function () { + this.color(0, 1, 0, 1); + }, + { output: [width, height], graphical: true } + ); kernel(); const canvas = kernel.canvas; gpu.destroy(); @@ -80,4 +85,3 @@ if (typeof window !== 'undefined') { } else { module.exports = _exports; } - diff --git a/test/features/add-custom-function.js b/test/features/add-custom-function.js index 0f63773d..b661e6e8 100644 --- a/test/features/add-custom-function.js +++ b/test/features/add-custom-function.js @@ -1,5 +1,5 @@ const { assert, skip, test, module: describe, only } = require('qunit'); -const { GPU } = require('../../src'); +const { GPU } = require('../..'); describe('features: add custom function'); @@ -7,12 +7,15 @@ function inGPUInstanceSettings(mode) { function customAdder(a, b) { return a + b; } - const gpu = new GPU({mode, functions: [customAdder] }); - const kernel = gpu.createKernel(function (a, b) { - return customAdder(a[this.thread.x], b[this.thread.x]); - }, { - output: [6] - }); + const gpu = new GPU({ mode, functions: [customAdder] }); + const kernel = gpu.createKernel( + function (a, b) { + return customAdder(a[this.thread.x], b[this.thread.x]); + }, + { + output: [6], + } + ); const a = [1, 2, 3, 5, 6, 7]; const b = [4, 5, 6, 1, 2, 3]; @@ -37,30 +40,37 @@ test('in GPU instance settings gpu', () => { inGPUInstanceSettings('webgl'); }); -(GPU.isWebGL2Supported ? test : skip)('in GPU instance settings webgl2', () => { - inGPUInstanceSettings('webgl2'); -}); +(GPU.isWebGL2Supported ? test : skip)( + 'in GPU instance settings webgl2', + () => { + inGPUInstanceSettings('webgl2'); + } +); -(GPU.isHeadlessGLSupported ? test : skip)('in GPU instance settings headlessgl', () => { - inGPUInstanceSettings('headlessgl'); -}); +(GPU.isHeadlessGLSupported ? test : skip)( + 'in GPU instance settings headlessgl', + () => { + inGPUInstanceSettings('headlessgl'); + } +); test('in GPU instance settings cpu', () => { inGPUInstanceSettings('cpu'); }); - function withGPUAddFunctionMethod(mode) { function customAdder(a, b) { return a + b; } - const gpu = new GPU({ mode }) - .addFunction(customAdder); - const kernel = gpu.createKernel(function (a, b) { - return customAdder(a[this.thread.x], b[this.thread.x]); - }, { - output: [6] - }); + const gpu = new GPU({ mode }).addFunction(customAdder); + const kernel = gpu.createKernel( + function (a, b) { + return customAdder(a[this.thread.x], b[this.thread.x]); + }, + { + output: [6], + } + ); const a = [1, 2, 3, 5, 6, 7]; const b = [4, 5, 6, 1, 2, 3]; @@ -81,17 +91,26 @@ test('with GPU addFunction method gpu', () => { withGPUAddFunctionMethod('gpu'); }); -(GPU.isWebGLSupported ? test : skip)('with GPU addFunction method webgl', () => { - withGPUAddFunctionMethod('webgl'); -}); +(GPU.isWebGLSupported ? test : skip)( + 'with GPU addFunction method webgl', + () => { + withGPUAddFunctionMethod('webgl'); + } +); -(GPU.isWebGL2Supported ? test : skip)('with GPU addFunction method webgl2', () => { - withGPUAddFunctionMethod('webgl2'); -}); +(GPU.isWebGL2Supported ? test : skip)( + 'with GPU addFunction method webgl2', + () => { + withGPUAddFunctionMethod('webgl2'); + } +); -(GPU.isHeadlessGLSupported ? test : skip)('with GPU addFunction method headlessgl', () => { - withGPUAddFunctionMethod('headlessgl'); -}); +(GPU.isHeadlessGLSupported ? test : skip)( + 'with GPU addFunction method headlessgl', + () => { + withGPUAddFunctionMethod('headlessgl'); + } +); test('with GPU addFunction method cpu', () => { withGPUAddFunctionMethod('cpu'); @@ -102,14 +121,15 @@ function inKernelInstanceSettings(mode) { return a + b; } const gpu = new GPU({ mode }); - const kernel = gpu.createKernel(function (a, b) { - return customAdder(a[this.thread.x], b[this.thread.x]); - }, { - output: [6], - functions: [ - customAdder - ], - }); + const kernel = gpu.createKernel( + function (a, b) { + return customAdder(a[this.thread.x], b[this.thread.x]); + }, + { + output: [6], + functions: [customAdder], + } + ); const a = [1, 2, 3, 5, 6, 7]; const b = [4, 5, 6, 1, 2, 3]; @@ -130,17 +150,26 @@ test('in Kernel instance settings gpu', () => { inKernelInstanceSettings('gpu'); }); -(GPU.isWebGLSupported ? test : skip)('in Kernel instance settings webgl', () => { - inKernelInstanceSettings('webgl'); -}); +(GPU.isWebGLSupported ? test : skip)( + 'in Kernel instance settings webgl', + () => { + inKernelInstanceSettings('webgl'); + } +); -(GPU.isWebGL2Supported ? test : skip)('in Kernel instance settings webgl2', () => { - inKernelInstanceSettings('webgl2'); -}); +(GPU.isWebGL2Supported ? test : skip)( + 'in Kernel instance settings webgl2', + () => { + inKernelInstanceSettings('webgl2'); + } +); -(GPU.isHeadlessGLSupported ? test : skip)('in Kernel instance settings headlessgl', () => { - inKernelInstanceSettings('headlessgl'); -}); +(GPU.isHeadlessGLSupported ? test : skip)( + 'in Kernel instance settings headlessgl', + () => { + inKernelInstanceSettings('headlessgl'); + } +); test('in Kernel instance settings cpu', () => { inKernelInstanceSettings('cpu'); @@ -151,11 +180,15 @@ function withKernelAddFunctionMethod(mode) { return a + b; } const gpu = new GPU({ mode }); - const kernel = gpu.createKernel(function (a, b) { - return customAdder(a[this.thread.x], b[this.thread.x]); - }, { - output: [6] - }) + const kernel = gpu + .createKernel( + function (a, b) { + return customAdder(a[this.thread.x], b[this.thread.x]); + }, + { + output: [6], + } + ) .addFunction(customAdder); const a = [1, 2, 3, 5, 6, 7]; @@ -177,17 +210,26 @@ test('with Kernel addFunction method gpu', () => { withKernelAddFunctionMethod('gpu'); }); -(GPU.isWebGLSupported ? test : skip)('with Kernel addFunction method webgl', () => { - withKernelAddFunctionMethod('webgl'); -}); +(GPU.isWebGLSupported ? test : skip)( + 'with Kernel addFunction method webgl', + () => { + withKernelAddFunctionMethod('webgl'); + } +); -(GPU.isWebGL2Supported ? test : skip)('with Kernel addFunction method webgl2', () => { - withKernelAddFunctionMethod('webgl2'); -}); +(GPU.isWebGL2Supported ? test : skip)( + 'with Kernel addFunction method webgl2', + () => { + withKernelAddFunctionMethod('webgl2'); + } +); -(GPU.isHeadlessGLSupported ? test : skip)('with Kernel addFunction method headlessgl', () => { - withKernelAddFunctionMethod('headlessgl'); -}); +(GPU.isHeadlessGLSupported ? test : skip)( + 'with Kernel addFunction method headlessgl', + () => { + withKernelAddFunctionMethod('headlessgl'); + } +); test('with Kernel addFunction method cpu', () => { withKernelAddFunctionMethod('cpu'); @@ -196,7 +238,7 @@ test('with Kernel addFunction method cpu', () => { describe('features: add custom function with `this.constants.width` in loop'); function sumAB(mode) { - const gpu = new GPU({mode}); + const gpu = new GPU({ mode }); function customAdder(a, b) { let sum = 0; @@ -208,13 +250,16 @@ function sumAB(mode) { gpu.addFunction(customAdder); - const kernel = gpu.createKernel(function (a, b) { - return customAdder(a, b); - }, { - output: [6], - constants: {width: 6}, - precision: 'unsigned', - }); + const kernel = gpu.createKernel( + function (a, b) { + return customAdder(a, b); + }, + { + output: [6], + constants: { width: 6 }, + precision: 'unsigned', + } + ); assert.ok(kernel !== null, 'function generated test'); @@ -253,6 +298,7 @@ test('sumAB cpu', () => { }); describe('features: add custom function with `this.output.x` in loop'); + function sumABThisOutputX(mode) { const gpu = new GPU({ mode, functions: [customAdder] }); @@ -264,18 +310,21 @@ function sumABThisOutputX(mode) { return sum; } - const kernel = gpu.createKernel(function(a, b) { - return customAdder(a, b); - }, { - output : [6], - }); + const kernel = gpu.createKernel( + function (a, b) { + return customAdder(a, b); + }, + { + output: [6], + } + ); assert.ok(kernel !== null, 'function generated test'); const a = [1, 2, 3, 5, 6, 7]; const b = [1, 1, 1, 1, 1, 1]; - const result = kernel(a,b); + const result = kernel(a, b); const expected = [12, 18, 24, 36, 42, 48]; assert.deepEqual(Array.from(result), expected); @@ -298,38 +347,44 @@ test('sumABThisOutputX gpu', () => { sumABThisOutputX('webgl2'); }); -(GPU.isHeadlessGLSupported ? test : skip)('sumABThisOutputX headlessgl', () => { - sumABThisOutputX('headlessgl'); -}); +(GPU.isHeadlessGLSupported ? test : skip)( + 'sumABThisOutputX headlessgl', + () => { + sumABThisOutputX('headlessgl'); + } +); test('sumABThisOutputX cpu', () => { sumABThisOutputX('cpu'); }); - describe('features: add custom private'); + function addCustomPrivate(mode) { const gpu = new GPU({ mode }); - const kernel = gpu.createKernel(function(a, b) { - function customAdder(a, b) { - let sum = 0; - for (let i = 0; i < this.output.x; i++) { - sum += a[this.thread.x] + b[this.thread.x]; + const kernel = gpu.createKernel( + function (a, b) { + function customAdder(a, b) { + let sum = 0; + for (let i = 0; i < this.output.x; i++) { + sum += a[this.thread.x] + b[this.thread.x]; + } + return sum; } - return sum; + return customAdder(a, b); + }, + { + output: [6], } - return customAdder(a, b); - }, { - output : [6], - }); + ); assert.ok(kernel !== null, 'function generated test'); const a = [1, 2, 3, 5, 6, 7]; const b = [1, 1, 1, 1, 1, 1]; - const result = kernel(a,b); + const result = kernel(a, b); const expected = [12, 18, 24, 36, 42, 48]; assert.deepEqual(Array.from(result), expected); @@ -364,12 +419,16 @@ describe('features: setFunctions from array on kernel'); function testSetFunctionsFromArrayOnKernel(mode) { const gpu = new GPU({ mode }); + function custom() { return 1; } - const kernel = gpu.createKernel(function() { - return custom(); - }, { output: [1] }); + const kernel = gpu.createKernel( + function () { + return custom(); + }, + { output: [1] } + ); kernel.setFunctions([custom]); assert.equal(kernel()[0], 1); gpu.destroy(); @@ -403,12 +462,20 @@ describe('features: setFunctions from array on kernel'); function testSetFunctionsFromArrayOnGPU(mode) { const gpu = new GPU({ mode }); - assert.equal(gpu.setFunctions([function custom() { - return 1; - }]), gpu); - const kernel = gpu.createKernel(function() { - return custom(); - }, { output: [1] }); + assert.equal( + gpu.setFunctions([ + function custom() { + return 1; + }, + ]), + gpu + ); + const kernel = gpu.createKernel( + function () { + return custom(); + }, + { output: [1] } + ); assert.equal(kernel()[0], 1); gpu.destroy(); } @@ -441,9 +508,10 @@ describe('features: setFunctions from array on kernel'); function testAddIGPUFunction(mode) { const gpu = new GPU({ mode }); - const kernel = gpu.createKernel(function(value) { - return custom(value); - }) + const kernel = gpu + .createKernel(function (value) { + return custom(value); + }) .setOutput([1]) .addFunction({ name: 'custom', @@ -479,4 +547,4 @@ test('gpu', () => { test('cpu', () => { testAddIGPUFunction('cpu'); -}); \ No newline at end of file +}); diff --git a/test/features/add-custom-native-function.js b/test/features/add-custom-native-function.js index 7e8d9b45..7fb0ebb9 100644 --- a/test/features/add-custom-native-function.js +++ b/test/features/add-custom-native-function.js @@ -1,5 +1,5 @@ const { assert, skip, test, module: describe, only } = require('qunit'); -const { GPU } = require('../../src'); +const { GPU } = require('../..'); describe('features: add native'); @@ -15,22 +15,25 @@ function nativeDivide(mode, fn) { gpu.addNativeFunction('divide', fn, { returnType: 'Number' }); - const f = gpu.createKernel(function(a, b) { - return divide(a[this.thread.x], b[this.thread.x]); - }, { - output : [6] - }); + const f = gpu.createKernel( + function (a, b) { + return divide(a[this.thread.x], b[this.thread.x]); + }, + { + output: [6], + } + ); assert.ok(f !== null, 'function generated test'); const a = [1, 4, 3, 5, 6, 3]; const b = [4, 2, 6, 1, 2, 3]; - const res = f(a,b); + const res = f(a, b); const exp = [0.25, 2, 0.5, 5, 3, 1]; - for(let i = 0; i < exp.length; ++i) { - assert.equal(res[i], exp[i], 'Result arr idx: '+i); + for (let i = 0; i < exp.length; ++i) { + assert.equal(res[i], exp[i], 'Result arr idx: ' + i); } gpu.destroy(); } @@ -59,36 +62,40 @@ test('nativeDivide cpu', () => { nativeDivide('cpu', jsDivide); }); - describe('features: instantiate native and override'); function divideOverride(mode) { const gpu = new GPU({ mode, functions: [divide], - nativeFunctions: [{ - name: 'divide', - // deliberately add, rather than divide, to ensure native functions are treated as more important than regular ones - source: `float divide(float a, float b) { + nativeFunctions: [ + { + name: 'divide', + // deliberately add, rather than divide, to ensure native functions are treated as more important than regular ones + source: `float divide(float a, float b) { return a + b; - }` - }] + }`, + }, + ], }); - function divide(a,b) { + function divide(a, b) { return a / b; } - const kernel = gpu.createKernel(function(a, b) { - return divide(a[this.thread.x], b[this.thread.x]); - }, { - output : [6] - }); + const kernel = gpu.createKernel( + function (a, b) { + return divide(a[this.thread.x], b[this.thread.x]); + }, + { + output: [6], + } + ); const a = [1, 4, 3, 5, 6, 3]; const b = [4, 2, 6, 1, 2, 3]; - const res = kernel(a,b); + const res = kernel(a, b); const exp = [5, 6, 9, 6, 8, 6]; assert.deepEqual(Array.from(res), exp); @@ -107,13 +114,19 @@ test('divideOverride (GPU only) gpu', () => { divideOverride('webgl'); }); -(GPU.isWebGL2Supported ? test : skip)('divideOverride (GPU only) webgl2', () => { - divideOverride('webgl2'); -}); +(GPU.isWebGL2Supported ? test : skip)( + 'divideOverride (GPU only) webgl2', + () => { + divideOverride('webgl2'); + } +); -(GPU.isHeadlessGLSupported ? test : skip)('divideOverride (GPU only) headlessgl', () => { - divideOverride('headlessgl'); -}); +(GPU.isHeadlessGLSupported ? test : skip)( + 'divideOverride (GPU only) headlessgl', + () => { + divideOverride('headlessgl'); + } +); describe('features: argument casting'); @@ -121,29 +134,34 @@ function argumentCasting(mode) { const gpu = new GPU({ mode, functions: [divide], - nativeFunctions: [{ - // deliberately add, rather than divide, to ensure native functions are treated as more important than regular ones - name: 'divide', - source: `float divide(int a, int b) { + nativeFunctions: [ + { + // deliberately add, rather than divide, to ensure native functions are treated as more important than regular ones + name: 'divide', + source: `float divide(int a, int b) { return float(a + b); - }` - }] + }`, + }, + ], }); - function divide(a,b) { + function divide(a, b) { return a / b; } - const kernel = gpu.createKernel(function(a, b) { - return divide(a[this.thread.x], b[this.thread.x]); - }, { - output : [6] - }); + const kernel = gpu.createKernel( + function (a, b) { + return divide(a[this.thread.x], b[this.thread.x]); + }, + { + output: [6], + } + ); const a = [1, 4, 3, 5, 6, 3]; const b = [4, 2, 6, 1, 2, 3]; - const res = kernel(a,b); + const res = kernel(a, b); const exp = [5, 6, 9, 6, 8, 6]; assert.deepEqual(Array.from(res), exp); @@ -158,18 +176,26 @@ test('argumentCasting (GPU only) gpu', () => { argumentCasting('gpu'); }); -(GPU.isWebGLSupported ? test : skip)('argumentCasting (GPU only) webgl', () => { - argumentCasting('webgl'); -}); - -(GPU.isWebGL2Supported ? test : skip)('argumentCasting (GPU only) webgl2', () => { - argumentCasting('webgl2'); -}); +(GPU.isWebGLSupported ? test : skip)( + 'argumentCasting (GPU only) webgl', + () => { + argumentCasting('webgl'); + } +); -(GPU.isHeadlessGLSupported ? test : skip)('argumentCasting (GPU only) headlessgl', () => { - argumentCasting('headlessgl'); -}); +(GPU.isWebGL2Supported ? test : skip)( + 'argumentCasting (GPU only) webgl2', + () => { + argumentCasting('webgl2'); + } +); +(GPU.isHeadlessGLSupported ? test : skip)( + 'argumentCasting (GPU only) headlessgl', + () => { + argumentCasting('headlessgl'); + } +); describe('features: mixed argument casting'); @@ -177,29 +203,34 @@ function mixedArgumentCasting(mode) { const gpu = new GPU({ mode, functions: [divide], - nativeFunctions: [{ - // deliberately add, rather than divide, to ensure native functions are treated as more important than regular ones - name: 'divide', - source: `float divide(int a, float b) { + nativeFunctions: [ + { + // deliberately add, rather than divide, to ensure native functions are treated as more important than regular ones + name: 'divide', + source: `float divide(int a, float b) { return float(a + int(b)); - }` - }] + }`, + }, + ], }); - function divide(a,b) { + function divide(a, b) { return a / b; } - const kernel = gpu.createKernel(function(a, b) { - return divide(a[this.thread.x], b[this.thread.x]); - }, { - output : [6] - }); + const kernel = gpu.createKernel( + function (a, b) { + return divide(a[this.thread.x], b[this.thread.x]); + }, + { + output: [6], + } + ); const a = [1, 4, 3, 5, 6, 3]; const b = [4, 2, 6, 1, 2, 3]; - const res = kernel(a,b); + const res = kernel(a, b); const exp = [5, 6, 9, 6, 8, 6]; assert.deepEqual(Array.from(res), exp); @@ -214,17 +245,26 @@ test('mixedArgumentCasting (GPU only) gpu', () => { mixedArgumentCasting('gpu'); }); -(GPU.isWebGLSupported ? test : skip)('mixedArgumentCasting (GPU only) webgl', () => { - mixedArgumentCasting('webgl'); -}); +(GPU.isWebGLSupported ? test : skip)( + 'mixedArgumentCasting (GPU only) webgl', + () => { + mixedArgumentCasting('webgl'); + } +); -(GPU.isWebGL2Supported ? test : skip)('mixedArgumentCasting (GPU only) webgl2', () => { - mixedArgumentCasting('webgl2'); -}); +(GPU.isWebGL2Supported ? test : skip)( + 'mixedArgumentCasting (GPU only) webgl2', + () => { + mixedArgumentCasting('webgl2'); + } +); -(GPU.isHeadlessGLSupported ? test : skip)('mixedArgumentCasting (GPU only) headlessgl', () => { - mixedArgumentCasting('headlessgl'); -}); +(GPU.isHeadlessGLSupported ? test : skip)( + 'mixedArgumentCasting (GPU only) headlessgl', + () => { + mixedArgumentCasting('headlessgl'); + } +); describe('features: return type casting'); @@ -232,29 +272,34 @@ function returnTypeCasting(mode) { const gpu = new GPU({ mode, functions: [divide], - nativeFunctions: [{ - // deliberately add, rather than divide, to ensure native functions are treated as more important than regular ones - name: 'divide', - source: `int divide(float a, float b) { + nativeFunctions: [ + { + // deliberately add, rather than divide, to ensure native functions are treated as more important than regular ones + name: 'divide', + source: `int divide(float a, float b) { return int(a + b); - }` - }] + }`, + }, + ], }); - function divide(a,b) { + function divide(a, b) { return a / b; } - const kernel = gpu.createKernel(function(a, b) { - return divide(a[this.thread.x], b[this.thread.x]); - }, { - output : [6] - }); + const kernel = gpu.createKernel( + function (a, b) { + return divide(a[this.thread.x], b[this.thread.x]); + }, + { + output: [6], + } + ); const a = [1, 4, 3, 5, 6, 3]; const b = [4, 2, 6, 1, 2, 3]; - const res = kernel(a,b); + const res = kernel(a, b); const exp = [5, 6, 9, 6, 8, 6]; assert.deepEqual(Array.from(res), exp); @@ -269,28 +314,40 @@ test('returnTypeCasting (GPU only) gpu', () => { returnTypeCasting('gpu'); }); -(GPU.isWebGLSupported ? test : skip)('returnTypeCasting (GPU only) webgl', () => { - returnTypeCasting('webgl'); -}); +(GPU.isWebGLSupported ? test : skip)( + 'returnTypeCasting (GPU only) webgl', + () => { + returnTypeCasting('webgl'); + } +); -(GPU.isWebGL2Supported ? test : skip)('returnTypeCasting (GPU only) webgl2', () => { - returnTypeCasting('webgl2'); -}); +(GPU.isWebGL2Supported ? test : skip)( + 'returnTypeCasting (GPU only) webgl2', + () => { + returnTypeCasting('webgl2'); + } +); -(GPU.isHeadlessGLSupported ? test : skip)('returnTypeCasting (GPU only) headlessgl', () => { - returnTypeCasting('headlessgl'); -}); +(GPU.isHeadlessGLSupported ? test : skip)( + 'returnTypeCasting (GPU only) headlessgl', + () => { + returnTypeCasting('headlessgl'); + } +); describe('features: Adding nativeFunctions directly on kernel'); function testDirectlyOnKernelViaSettings(nativeFunctions, mode) { const gpu = new GPU({ mode }); - const kernel = gpu.createKernel(function (v) { - return native(v[this.thread.x]); - }, { - output: [1], - nativeFunctions - }); + const kernel = gpu.createKernel( + function (v) { + return native(v[this.thread.x]); + }, + { + output: [1], + nativeFunctions, + } + ); assert.equal(kernel([1])[0], 2); gpu.destroy(); } @@ -301,68 +358,82 @@ test('via settings auto', () => { name: 'native', source: `float native(float value) { return 1.0 + value; - }` - } - ]) + }`, + }, + ]); }); test('via settings gpu', () => { - testDirectlyOnKernelViaSettings([ - { - name: 'native', - source: `float native(float value) { + testDirectlyOnKernelViaSettings( + [ + { + name: 'native', + source: `float native(float value) { return 1.0 + value; - }` - } - ], 'gpu') + }`, + }, + ], + 'gpu' + ); }); (GPU.isWebGLSupported ? test : skip)('via settings webgl', () => { - testDirectlyOnKernelViaSettings([ - { - name: 'native', - source: `float native(float value) { + testDirectlyOnKernelViaSettings( + [ + { + name: 'native', + source: `float native(float value) { return 1.0 + value; - }` - } - ], 'webgl') + }`, + }, + ], + 'webgl' + ); }); (GPU.isWebGL2Supported ? test : skip)('via settings webgl2', () => { - testDirectlyOnKernelViaSettings([ - { - name: 'native', - source: `float native(float value) { + testDirectlyOnKernelViaSettings( + [ + { + name: 'native', + source: `float native(float value) { return 1.0 + value; - }` - } - ], 'webgl2') + }`, + }, + ], + 'webgl2' + ); }); (GPU.isHeadlessGLSupported ? test : skip)('via settings headlessgl', () => { - testDirectlyOnKernelViaSettings([ - { - name: 'native', - source: `float native(float value) { + testDirectlyOnKernelViaSettings( + [ + { + name: 'native', + source: `float native(float value) { return 1.0 + value; - }` - } - ], 'headlessgl') + }`, + }, + ], + 'headlessgl' + ); }); test('via settings cpu', () => { - testDirectlyOnKernelViaSettings([ - { - name: 'native', - source: `function native(value) { + testDirectlyOnKernelViaSettings( + [ + { + name: 'native', + source: `function native(value) { return 1.0 + value; }`, - returnType: 'Float' - } - ], 'cpu') + returnType: 'Float', + }, + ], + 'cpu' + ); }); - describe('features: Adding nativeFunctions directly on kernel'); /** @@ -372,11 +443,15 @@ describe('features: Adding nativeFunctions directly on kernel'); */ function testDirectlyOnKernelViaMethod(nativeFunctions, mode) { const gpu = new GPU({ mode }); - const kernel = gpu.createKernel(function (v) { - return native(v[this.thread.x]); - }, { - output: [1] - }) + const kernel = gpu + .createKernel( + function (v) { + return native(v[this.thread.x]); + }, + { + output: [1], + } + ) .setNativeFunctions(nativeFunctions); assert.equal(kernel([1])[0], 2); gpu.destroy(); @@ -388,74 +463,91 @@ test('via method auto', () => { name: 'native', source: `float native(float value) { return 1.0 + value; - }` - } - ]) + }`, + }, + ]); }); test('via method gpu', () => { - testDirectlyOnKernelViaMethod([ - { - name: 'native', - source: `float native(float value) { + testDirectlyOnKernelViaMethod( + [ + { + name: 'native', + source: `float native(float value) { return 1.0 + value; - }` - } - ], 'gpu') + }`, + }, + ], + 'gpu' + ); }); (GPU.isWebGLSupported ? test : skip)('via method webgl', () => { - testDirectlyOnKernelViaMethod([ - { - name: 'native', - source: `float native(float value) { + testDirectlyOnKernelViaMethod( + [ + { + name: 'native', + source: `float native(float value) { return 1.0 + value; - }` - } - ], 'webgl') + }`, + }, + ], + 'webgl' + ); }); (GPU.isWebGL2Supported ? test : skip)('via method webgl2', () => { - testDirectlyOnKernelViaMethod([ - { - name: 'native', - source: `float native(float value) { + testDirectlyOnKernelViaMethod( + [ + { + name: 'native', + source: `float native(float value) { return 1.0 + value; - }` - } - ], 'webgl2') + }`, + }, + ], + 'webgl2' + ); }); (GPU.isHeadlessGLSupported ? test : skip)('via method headlessgl', () => { - testDirectlyOnKernelViaMethod([ - { - name: 'native', - source: `float native(float value) { + testDirectlyOnKernelViaMethod( + [ + { + name: 'native', + source: `float native(float value) { return 1.0 + value; - }` - } - ], 'headlessgl') + }`, + }, + ], + 'headlessgl' + ); }); test('via method cpu', () => { - testDirectlyOnKernelViaMethod([ - { - name: 'native', - source: `function native(value) { + testDirectlyOnKernelViaMethod( + [ + { + name: 'native', + source: `function native(value) { return 1.0 + value; }`, - returnType: 'Float' - } - ], 'cpu') + returnType: 'Float', + }, + ], + 'cpu' + ); }); - function testSetNativeFunctionsFromArrayOnGPU(nativeFunction, mode) { const gpu = new GPU({ mode }); assert.equal(gpu.setNativeFunctions([nativeFunction]), gpu); - const kernel = gpu.createKernel(function() { - return custom(); - }, { output: [1] }); + const kernel = gpu.createKernel( + function () { + return custom(); + }, + { output: [1] } + ); assert.equal(kernel()[0], 1); gpu.destroy(); } @@ -465,52 +557,67 @@ test('auto', () => { name: 'custom', source: `float custom() { return 1.0; - }` + }`, }); }); test('gpu', () => { - testSetNativeFunctionsFromArrayOnGPU({ - name: 'custom', - source: `float custom() { + testSetNativeFunctionsFromArrayOnGPU( + { + name: 'custom', + source: `float custom() { return 1.0; - }` - },'gpu'); + }`, + }, + 'gpu' + ); }); (GPU.isWebGLSupported ? test : skip)('webgl', () => { - testSetNativeFunctionsFromArrayOnGPU({ - name: 'custom', - source: `float custom() { + testSetNativeFunctionsFromArrayOnGPU( + { + name: 'custom', + source: `float custom() { return 1.0; - }` - },'webgl'); + }`, + }, + 'webgl' + ); }); (GPU.isWebGL2Supported ? test : skip)('webgl2', () => { - testSetNativeFunctionsFromArrayOnGPU({ - name: 'custom', - source: `float custom() { + testSetNativeFunctionsFromArrayOnGPU( + { + name: 'custom', + source: `float custom() { return 1.0; - }` - }, 'webgl2'); + }`, + }, + 'webgl2' + ); }); (GPU.isHeadlessGLSupported ? test : skip)('headlessgl', () => { - testSetNativeFunctionsFromArrayOnGPU({ - name: 'custom', - source: `float custom() { + testSetNativeFunctionsFromArrayOnGPU( + { + name: 'custom', + source: `float custom() { return 1.0; - }` - },'headlessgl'); + }`, + }, + 'headlessgl' + ); }); test('cpu', () => { - testSetNativeFunctionsFromArrayOnGPU({ - name: 'custom', - source: `function custom() { + testSetNativeFunctionsFromArrayOnGPU( + { + name: 'custom', + source: `function custom() { return 1.0; }`, - returnType: 'Number' - },'cpu'); -}); \ No newline at end of file + returnType: 'Number', + }, + 'cpu' + ); +}); diff --git a/test/features/add-typed-functions.js b/test/features/add-typed-functions.js index 72ec14ec..3762eec7 100644 --- a/test/features/add-typed-functions.js +++ b/test/features/add-typed-functions.js @@ -1,19 +1,22 @@ const { assert, skip, test, module: describe, only } = require('qunit'); -const { GPU } = require('../../src'); +const { GPU } = require('../..'); describe('features: add typed functions vec2Test'); + function vec2Test(mode) { const gpu = new GPU({ mode }); + function typedFunction() { return [1, 2]; } gpu.addFunction(typedFunction, { - returnType: 'Array(2)' + returnType: 'Array(2)', }); - const kernel = gpu.createKernel(function() { - const result = typedFunction(); - return result[0] + result[1]; - }) + const kernel = gpu + .createKernel(function () { + const result = typedFunction(); + return result[0] + result[1]; + }) .setOutput([1]); const result = kernel(); @@ -37,20 +40,22 @@ test('Array(2) - gpu', () => { vec2Test('headlessgl'); }); - describe('features: add typed functions vec3Test'); + function vec3Test(mode) { const gpu = new GPU({ mode }); + function typedFunction() { return [1, 2, 3]; } gpu.addFunction(typedFunction, { - returnType: 'Array(3)' + returnType: 'Array(3)', }); - const kernel = gpu.createKernel(function() { - const result = typedFunction(); - return result[0] + result[1] + result[2]; - }) + const kernel = gpu + .createKernel(function () { + const result = typedFunction(); + return result[0] + result[1] + result[2]; + }) .setOutput([1]); const result = kernel(); assert.equal(result[0], 6); @@ -74,18 +79,21 @@ test('Array(3) - gpu', () => { }); describe('features: add typed functions vec4Test'); + function vec4Test(mode) { const gpu = new GPU({ mode }); + function typedFunction() { return [1, 2, 3, 4]; } gpu.addFunction(typedFunction, { - returnType: 'Array(4)' + returnType: 'Array(4)', }); - const kernel = gpu.createKernel(function() { - const result = typedFunction(); - return result[0] + result[1] + result[2] + result[3]; - }) + const kernel = gpu + .createKernel(function () { + const result = typedFunction(); + return result[0] + result[1] + result[2] + result[3]; + }) .setOutput([1]); const result = kernel(); assert.equal(result[0], 10); diff --git a/test/features/argument-array-types.js b/test/features/argument-array-types.js index 93a1102d..6596c921 100644 --- a/test/features/argument-array-types.js +++ b/test/features/argument-array-types.js @@ -1,41 +1,59 @@ const { assert, skip, test, module: describe, only } = require('qunit'); -const { GPU } = require('../../src'); +const { GPU } = require('../..'); describe('argument array types'); function testSinglePrecisionArray2(mode) { const gpu = new GPU({ mode }); - const kernel = gpu.createKernel(function(value) { - return value[0] + value[1]; - }, { - output: [1], - argumentTypes: { value: 'Array(2)' }, - precision: 'single', - }); - const result = kernel(new Float32Array([1,2])); + const kernel = gpu.createKernel( + function (value) { + return value[0] + value[1]; + }, + { + output: [1], + argumentTypes: { value: 'Array(2)' }, + precision: 'single', + } + ); + const result = kernel(new Float32Array([1, 2])); assert.equal(result[0], 3); gpu.destroy(); } -(GPU.isSinglePrecisionSupported ? test : skip)('single precision Array(2) auto', () => { - testSinglePrecisionArray2(); -}); - -(GPU.isSinglePrecisionSupported ? test : skip)('single precision Array(2) gpu', () => { - testSinglePrecisionArray2('gpu'); -}); - -(GPU.isSinglePrecisionSupported && GPU.isWebGLSupported ? test : skip)('single precision Array(2) webgl', () => { - testSinglePrecisionArray2('webgl'); -}); - -(GPU.isSinglePrecisionSupported && GPU.isWebGL2Supported ? test : skip)('single precision Array(2) webgl2', () => { - testSinglePrecisionArray2('webgl2'); -}); - -(GPU.isSinglePrecisionSupported && GPU.isHeadlessGLSupported ? test : skip)('single precision Array(2) headlessgl', () => { - testSinglePrecisionArray2('headlessgl'); -}); +(GPU.isSinglePrecisionSupported ? test : skip)( + 'single precision Array(2) auto', + () => { + testSinglePrecisionArray2(); + } +); + +(GPU.isSinglePrecisionSupported ? test : skip)( + 'single precision Array(2) gpu', + () => { + testSinglePrecisionArray2('gpu'); + } +); + +(GPU.isSinglePrecisionSupported && GPU.isWebGLSupported ? test : skip)( + 'single precision Array(2) webgl', + () => { + testSinglePrecisionArray2('webgl'); + } +); + +(GPU.isSinglePrecisionSupported && GPU.isWebGL2Supported ? test : skip)( + 'single precision Array(2) webgl2', + () => { + testSinglePrecisionArray2('webgl2'); + } +); + +(GPU.isSinglePrecisionSupported && GPU.isHeadlessGLSupported ? test : skip)( + 'single precision Array(2) headlessgl', + () => { + testSinglePrecisionArray2('headlessgl'); + } +); test('single precision Array(2) cpu', () => { testSinglePrecisionArray2('cpu'); @@ -43,14 +61,17 @@ test('single precision Array(2) cpu', () => { function testUnsignedPrecisionArray2(mode) { const gpu = new GPU({ mode }); - const kernel = gpu.createKernel(function(value) { - return value[0] + value[1]; - }, { - output: [1], - argumentTypes: { value: 'Array(2)' }, - precision: 'unsigned', - }); - const result = kernel(new Float32Array([1,2])); + const kernel = gpu.createKernel( + function (value) { + return value[0] + value[1]; + }, + { + output: [1], + argumentTypes: { value: 'Array(2)' }, + precision: 'unsigned', + } + ); + const result = kernel(new Float32Array([1, 2])); assert.equal(result[0], 3); gpu.destroy(); } @@ -63,17 +84,26 @@ test('unsigned precision Array(2) gpu', () => { testUnsignedPrecisionArray2('gpu'); }); -(GPU.isWebGLSupported ? test : skip)('unsigned precision Array(2) webgl', () => { - testUnsignedPrecisionArray2('webgl'); -}); +(GPU.isWebGLSupported ? test : skip)( + 'unsigned precision Array(2) webgl', + () => { + testUnsignedPrecisionArray2('webgl'); + } +); -(GPU.isWebGL2Supported ? test : skip)('unsigned precision Array(2) webgl2', () => { - testUnsignedPrecisionArray2('webgl2'); -}); +(GPU.isWebGL2Supported ? test : skip)( + 'unsigned precision Array(2) webgl2', + () => { + testUnsignedPrecisionArray2('webgl2'); + } +); -(GPU.isHeadlessGLSupported ? test : skip)('unsigned precision Array(2) headlessgl', () => { - testUnsignedPrecisionArray2('headlessgl'); -}); +(GPU.isHeadlessGLSupported ? test : skip)( + 'unsigned precision Array(2) headlessgl', + () => { + testUnsignedPrecisionArray2('headlessgl'); + } +); test('unsigned precision Array(2) cpu', () => { testUnsignedPrecisionArray2('cpu'); @@ -81,37 +111,55 @@ test('unsigned precision Array(2) cpu', () => { function testSinglePrecisionArray3(mode) { const gpu = new GPU({ mode }); - const kernel = gpu.createKernel(function(value) { - return value[0] + value[1] + value[2]; - }, { - output: [1], - argumentTypes: { value: 'Array(3)' }, - precision: 'single', - }); - const result = kernel(new Float32Array([1,2,3])); + const kernel = gpu.createKernel( + function (value) { + return value[0] + value[1] + value[2]; + }, + { + output: [1], + argumentTypes: { value: 'Array(3)' }, + precision: 'single', + } + ); + const result = kernel(new Float32Array([1, 2, 3])); assert.equal(result[0], 6); gpu.destroy(); } -(GPU.isSinglePrecisionSupported ? test : skip)('single precision Array(3) auto', () => { - testSinglePrecisionArray3(); -}); - -(GPU.isSinglePrecisionSupported ? test : skip)('single precision Array(3) gpu', () => { - testSinglePrecisionArray3('gpu'); -}); - -(GPU.isSinglePrecisionSupported && GPU.isWebGLSupported ? test : skip)('single precision Array(3) webgl', () => { - testSinglePrecisionArray3('webgl'); -}); - -(GPU.isSinglePrecisionSupported && GPU.isWebGL2Supported ? test : skip)('single precision Array(3) webgl2', () => { - testSinglePrecisionArray3('webgl2'); -}); - -(GPU.isSinglePrecisionSupported && GPU.isHeadlessGLSupported ? test : skip)('single precision Array(3) headlessgl', () => { - testSinglePrecisionArray3('headlessgl'); -}); +(GPU.isSinglePrecisionSupported ? test : skip)( + 'single precision Array(3) auto', + () => { + testSinglePrecisionArray3(); + } +); + +(GPU.isSinglePrecisionSupported ? test : skip)( + 'single precision Array(3) gpu', + () => { + testSinglePrecisionArray3('gpu'); + } +); + +(GPU.isSinglePrecisionSupported && GPU.isWebGLSupported ? test : skip)( + 'single precision Array(3) webgl', + () => { + testSinglePrecisionArray3('webgl'); + } +); + +(GPU.isSinglePrecisionSupported && GPU.isWebGL2Supported ? test : skip)( + 'single precision Array(3) webgl2', + () => { + testSinglePrecisionArray3('webgl2'); + } +); + +(GPU.isSinglePrecisionSupported && GPU.isHeadlessGLSupported ? test : skip)( + 'single precision Array(3) headlessgl', + () => { + testSinglePrecisionArray3('headlessgl'); + } +); test('single precision Array(3) cpu', () => { testSinglePrecisionArray3('cpu'); @@ -119,14 +167,17 @@ test('single precision Array(3) cpu', () => { function testUnsignedPrecisionArray3(mode) { const gpu = new GPU({ mode }); - const kernel = gpu.createKernel(function(value) { - return value[0] + value[1] + value[2]; - }, { - output: [1], - argumentTypes: { value: 'Array(3)' }, - precision: 'unsigned', - }); - const result = kernel(new Float32Array([1,2,3])); + const kernel = gpu.createKernel( + function (value) { + return value[0] + value[1] + value[2]; + }, + { + output: [1], + argumentTypes: { value: 'Array(3)' }, + precision: 'unsigned', + } + ); + const result = kernel(new Float32Array([1, 2, 3])); assert.equal(result[0], 6); gpu.destroy(); } @@ -139,17 +190,26 @@ test('unsigned precision Array(3) gpu', () => { testUnsignedPrecisionArray3('gpu'); }); -(GPU.isWebGLSupported ? test : skip)('unsigned precision Array(3) webgl', () => { - testUnsignedPrecisionArray3('webgl'); -}); +(GPU.isWebGLSupported ? test : skip)( + 'unsigned precision Array(3) webgl', + () => { + testUnsignedPrecisionArray3('webgl'); + } +); -(GPU.isWebGL2Supported ? test : skip)('unsigned precision Array(3) webgl2', () => { - testUnsignedPrecisionArray3('webgl2'); -}); +(GPU.isWebGL2Supported ? test : skip)( + 'unsigned precision Array(3) webgl2', + () => { + testUnsignedPrecisionArray3('webgl2'); + } +); -(GPU.isHeadlessGLSupported ? test : skip)('unsigned precision Array(3) headlessgl', () => { - testUnsignedPrecisionArray3('headlessgl'); -}); +(GPU.isHeadlessGLSupported ? test : skip)( + 'unsigned precision Array(3) headlessgl', + () => { + testUnsignedPrecisionArray3('headlessgl'); + } +); test('unsigned precision Array(3) cpu', () => { testUnsignedPrecisionArray3('cpu'); @@ -157,37 +217,55 @@ test('unsigned precision Array(3) cpu', () => { function testSinglePrecisionArray4(mode) { const gpu = new GPU({ mode }); - const kernel = gpu.createKernel(function(value) { - return value[0] + value[1] + value[2] + value[3]; - }, { - output: [1], - argumentTypes: { value: 'Array(4)' }, - precision: 'single', - }); - const result = kernel(new Float32Array([1,2,3,4])); + const kernel = gpu.createKernel( + function (value) { + return value[0] + value[1] + value[2] + value[3]; + }, + { + output: [1], + argumentTypes: { value: 'Array(4)' }, + precision: 'single', + } + ); + const result = kernel(new Float32Array([1, 2, 3, 4])); assert.equal(result[0], 10); gpu.destroy(); } -(GPU.isSinglePrecisionSupported ? test : skip)('single precision Array(4) auto', () => { - testSinglePrecisionArray4(); -}); - -(GPU.isSinglePrecisionSupported ? test : skip)('single precision Array(4) gpu', () => { - testSinglePrecisionArray4('gpu'); -}); - -(GPU.isSinglePrecisionSupported && GPU.isWebGLSupported ? test : skip)('single precision Array(4) webgl', () => { - testSinglePrecisionArray4('webgl'); -}); - -(GPU.isSinglePrecisionSupported && GPU.isWebGL2Supported ? test : skip)('single precision Array(4) webgl2', () => { - testSinglePrecisionArray4('webgl2'); -}); - -(GPU.isSinglePrecisionSupported && GPU.isHeadlessGLSupported ? test : skip)('single precision Array(4) headlessgl', () => { - testSinglePrecisionArray4('headlessgl'); -}); +(GPU.isSinglePrecisionSupported ? test : skip)( + 'single precision Array(4) auto', + () => { + testSinglePrecisionArray4(); + } +); + +(GPU.isSinglePrecisionSupported ? test : skip)( + 'single precision Array(4) gpu', + () => { + testSinglePrecisionArray4('gpu'); + } +); + +(GPU.isSinglePrecisionSupported && GPU.isWebGLSupported ? test : skip)( + 'single precision Array(4) webgl', + () => { + testSinglePrecisionArray4('webgl'); + } +); + +(GPU.isSinglePrecisionSupported && GPU.isWebGL2Supported ? test : skip)( + 'single precision Array(4) webgl2', + () => { + testSinglePrecisionArray4('webgl2'); + } +); + +(GPU.isSinglePrecisionSupported && GPU.isHeadlessGLSupported ? test : skip)( + 'single precision Array(4) headlessgl', + () => { + testSinglePrecisionArray4('headlessgl'); + } +); test('single precision Array(4) cpu', () => { testSinglePrecisionArray4('cpu'); @@ -195,14 +273,17 @@ test('single precision Array(4) cpu', () => { function testUnsignedPrecisionArray4(mode) { const gpu = new GPU({ mode }); - const kernel = gpu.createKernel(function(value) { - return value[0] + value[1] + value[2] + value[3]; - }, { - output: [1], - argumentTypes: { value: 'Array(4)' }, - precision: 'unsigned', - }); - const result = kernel(new Float32Array([1,2,3,4])); + const kernel = gpu.createKernel( + function (value) { + return value[0] + value[1] + value[2] + value[3]; + }, + { + output: [1], + argumentTypes: { value: 'Array(4)' }, + precision: 'unsigned', + } + ); + const result = kernel(new Float32Array([1, 2, 3, 4])); assert.equal(result[0], 10); gpu.destroy(); } @@ -215,17 +296,26 @@ test('unsigned precision Array(4) gpu', () => { testUnsignedPrecisionArray4('gpu'); }); -(GPU.isWebGLSupported ? test : skip)('unsigned precision Array(4) webgl', () => { - testUnsignedPrecisionArray4('webgl'); -}); - -(GPU.isWebGL2Supported ? test : skip)('unsigned precision Array(4) webgl2', () => { - testUnsignedPrecisionArray4('webgl2'); -}); - -(GPU.isHeadlessGLSupported ? test : skip)('unsigned precision Array(4) headlessgl', () => { - testUnsignedPrecisionArray4('headlessgl'); -}); +(GPU.isWebGLSupported ? test : skip)( + 'unsigned precision Array(4) webgl', + () => { + testUnsignedPrecisionArray4('webgl'); + } +); + +(GPU.isWebGL2Supported ? test : skip)( + 'unsigned precision Array(4) webgl2', + () => { + testUnsignedPrecisionArray4('webgl2'); + } +); + +(GPU.isHeadlessGLSupported ? test : skip)( + 'unsigned precision Array(4) headlessgl', + () => { + testUnsignedPrecisionArray4('headlessgl'); + } +); test('unsigned precision Array(4) cpu', () => { testUnsignedPrecisionArray4('cpu'); diff --git a/test/features/argument-array1d-types.js b/test/features/argument-array1d-types.js index ce409417..9f17ae96 100644 --- a/test/features/argument-array1d-types.js +++ b/test/features/argument-array1d-types.js @@ -1,47 +1,65 @@ const { assert, skip, test, module: describe, only } = require('qunit'); -const { GPU } = require('../../src'); +const { GPU } = require('../..'); describe('argument array 1 types'); function testSinglePrecisionArray1D2(mode) { const gpu = new GPU({ mode }); - const kernel = gpu.createKernel(function(value) { - return value[this.thread.x]; - }, { - output: [4], - argumentTypes: { value: 'Array1D(2)' }, - precision: 'single', - }); + const kernel = gpu.createKernel( + function (value) { + return value[this.thread.x]; + }, + { + output: [4], + argumentTypes: { value: 'Array1D(2)' }, + precision: 'single', + } + ); const value = [ - new Float32Array([1,2]), - new Float32Array([3,4]), - new Float32Array([5,6]), - new Float32Array([7,8]), + new Float32Array([1, 2]), + new Float32Array([3, 4]), + new Float32Array([5, 6]), + new Float32Array([7, 8]), ]; const result = kernel(value); assert.deepEqual(result, value); gpu.destroy(); } -(GPU.isSinglePrecisionSupported ? test : skip)('single precision Array1D(2) auto', () => { - testSinglePrecisionArray1D2(); -}); - -(GPU.isSinglePrecisionSupported ? test : skip)('single precision Array1D(2) gpu', () => { - testSinglePrecisionArray1D2('gpu'); -}); - -(GPU.isSinglePrecisionSupported && GPU.isWebGLSupported ? test : skip)('single precision Array1D(2) webgl', () => { - testSinglePrecisionArray1D2('webgl'); -}); - -(GPU.isSinglePrecisionSupported && GPU.isWebGL2Supported ? test : skip)('single precision Array1D(2) webgl2', () => { - testSinglePrecisionArray1D2('webgl2'); -}); - -(GPU.isSinglePrecisionSupported && GPU.isHeadlessGLSupported ? test : skip)('single precision Array1D(2) headlessgl', () => { - testSinglePrecisionArray1D2('headlessgl'); -}); +(GPU.isSinglePrecisionSupported ? test : skip)( + 'single precision Array1D(2) auto', + () => { + testSinglePrecisionArray1D2(); + } +); + +(GPU.isSinglePrecisionSupported ? test : skip)( + 'single precision Array1D(2) gpu', + () => { + testSinglePrecisionArray1D2('gpu'); + } +); + +(GPU.isSinglePrecisionSupported && GPU.isWebGLSupported ? test : skip)( + 'single precision Array1D(2) webgl', + () => { + testSinglePrecisionArray1D2('webgl'); + } +); + +(GPU.isSinglePrecisionSupported && GPU.isWebGL2Supported ? test : skip)( + 'single precision Array1D(2) webgl2', + () => { + testSinglePrecisionArray1D2('webgl2'); + } +); + +(GPU.isSinglePrecisionSupported && GPU.isHeadlessGLSupported ? test : skip)( + 'single precision Array1D(2) headlessgl', + () => { + testSinglePrecisionArray1D2('headlessgl'); + } +); test('single precision Array1D(2) cpu', () => { testSinglePrecisionArray1D2('cpu'); @@ -49,18 +67,21 @@ test('single precision Array1D(2) cpu', () => { function testUnsignedPrecisionArray1D2(mode) { const gpu = new GPU({ mode }); - const kernel = gpu.createKernel(function(value) { - return value[this.thread.x]; - }, { - output: [4], - argumentTypes: { value: 'Array1D(2)' }, - precision: 'unsigned', - }); + const kernel = gpu.createKernel( + function (value) { + return value[this.thread.x]; + }, + { + output: [4], + argumentTypes: { value: 'Array1D(2)' }, + precision: 'unsigned', + } + ); const value = [ - new Float32Array([1,2]), - new Float32Array([3,4]), - new Float32Array([5,6]), - new Float32Array([7,8]), + new Float32Array([1, 2]), + new Float32Array([3, 4]), + new Float32Array([5, 6]), + new Float32Array([7, 8]), ]; const result = kernel(value); assert.deepEqual(result, value); @@ -75,17 +96,26 @@ test('fallback unsigned precision Array1D(2) gpu', () => { testUnsignedPrecisionArray1D2('gpu'); }); -(GPU.isWebGLSupported ? test : skip)('fallback unsigned precision Array1D(2) webgl', () => { - testUnsignedPrecisionArray1D2('webgl'); -}); - -(GPU.isWebGL2Supported ? test : skip)('fallback unsigned precision Array1D(2) webgl2', () => { - testUnsignedPrecisionArray1D2('webgl2'); -}); - -(GPU.isHeadlessGLSupported ? test : skip)('fallback unsigned precision Array1D(2) headlessgl', () => { - testUnsignedPrecisionArray1D2('headlessgl'); -}); +(GPU.isWebGLSupported ? test : skip)( + 'fallback unsigned precision Array1D(2) webgl', + () => { + testUnsignedPrecisionArray1D2('webgl'); + } +); + +(GPU.isWebGL2Supported ? test : skip)( + 'fallback unsigned precision Array1D(2) webgl2', + () => { + testUnsignedPrecisionArray1D2('webgl2'); + } +); + +(GPU.isHeadlessGLSupported ? test : skip)( + 'fallback unsigned precision Array1D(2) headlessgl', + () => { + testUnsignedPrecisionArray1D2('headlessgl'); + } +); test('fallback unsigned precision Array1D(2) cpu', () => { testUnsignedPrecisionArray1D2('cpu'); @@ -93,43 +123,61 @@ test('fallback unsigned precision Array1D(2) cpu', () => { function testSinglePrecisionArray1D3(mode) { const gpu = new GPU({ mode }); - const kernel = gpu.createKernel(function(value) { - return value[this.thread.x]; - }, { - output: [4], - argumentTypes: { value: 'Array1D(3)' }, - precision: 'single', - }); + const kernel = gpu.createKernel( + function (value) { + return value[this.thread.x]; + }, + { + output: [4], + argumentTypes: { value: 'Array1D(3)' }, + precision: 'single', + } + ); const value = [ - new Float32Array([1,2,3]), - new Float32Array([4,5,6]), - new Float32Array([7,8,9]), - new Float32Array([10,11,12]), + new Float32Array([1, 2, 3]), + new Float32Array([4, 5, 6]), + new Float32Array([7, 8, 9]), + new Float32Array([10, 11, 12]), ]; const result = kernel(value); assert.deepEqual(result, value); gpu.destroy(); } -(GPU.isSinglePrecisionSupported ? test : skip)('single precision Array1D(3) auto', () => { - testSinglePrecisionArray1D3(); -}); - -(GPU.isSinglePrecisionSupported ? test : skip)('single precision Array1D(3) gpu', () => { - testSinglePrecisionArray1D3('gpu'); -}); - -(GPU.isSinglePrecisionSupported && GPU.isWebGLSupported ? test : skip)('single precision Array1D(3) webgl', () => { - testSinglePrecisionArray1D3('webgl'); -}); - -(GPU.isSinglePrecisionSupported && GPU.isWebGL2Supported ? test : skip)('single precision Array1D(3) webgl2', () => { - testSinglePrecisionArray1D3('webgl2'); -}); - -(GPU.isSinglePrecisionSupported && GPU.isHeadlessGLSupported ? test : skip)('single precision Array1D(3) headlessgl', () => { - testSinglePrecisionArray1D3('headlessgl'); -}); +(GPU.isSinglePrecisionSupported ? test : skip)( + 'single precision Array1D(3) auto', + () => { + testSinglePrecisionArray1D3(); + } +); + +(GPU.isSinglePrecisionSupported ? test : skip)( + 'single precision Array1D(3) gpu', + () => { + testSinglePrecisionArray1D3('gpu'); + } +); + +(GPU.isSinglePrecisionSupported && GPU.isWebGLSupported ? test : skip)( + 'single precision Array1D(3) webgl', + () => { + testSinglePrecisionArray1D3('webgl'); + } +); + +(GPU.isSinglePrecisionSupported && GPU.isWebGL2Supported ? test : skip)( + 'single precision Array1D(3) webgl2', + () => { + testSinglePrecisionArray1D3('webgl2'); + } +); + +(GPU.isSinglePrecisionSupported && GPU.isHeadlessGLSupported ? test : skip)( + 'single precision Array1D(3) headlessgl', + () => { + testSinglePrecisionArray1D3('headlessgl'); + } +); test('single precision Array1D(3) cpu', () => { testSinglePrecisionArray1D3('cpu'); @@ -137,18 +185,21 @@ test('single precision Array1D(3) cpu', () => { function testUnsignedPrecisionArray1D3(mode) { const gpu = new GPU({ mode }); - const kernel = gpu.createKernel(function(value) { - return value[this.thread.x]; - }, { - output: [4], - argumentTypes: { value: 'Array1D(3)' }, - precision: 'unsigned', - }); + const kernel = gpu.createKernel( + function (value) { + return value[this.thread.x]; + }, + { + output: [4], + argumentTypes: { value: 'Array1D(3)' }, + precision: 'unsigned', + } + ); const value = [ - new Float32Array([1,2,3]), - new Float32Array([4,5,6]), - new Float32Array([7,8,9]), - new Float32Array([10,11,12]), + new Float32Array([1, 2, 3]), + new Float32Array([4, 5, 6]), + new Float32Array([7, 8, 9]), + new Float32Array([10, 11, 12]), ]; const result = kernel(value); assert.deepEqual(result, value); @@ -164,17 +215,26 @@ test('fallback unsigned precision Array1D(3) gpu', () => { testUnsignedPrecisionArray1D3('gpu'); }); -(GPU.isWebGLSupported ? test : skip)('fallback unsigned precision Array1D(3) webgl', () => { - testUnsignedPrecisionArray1D3('webgl'); -}); - -(GPU.isWebGL2Supported ? test : skip)('fallback unsigned precision Array1D(3) webgl2', () => { - testUnsignedPrecisionArray1D3('webgl2'); -}); - -(GPU.isHeadlessGLSupported ? test : skip)('fallback unsigned precision Array1D(3) headlessgl', () => { - testUnsignedPrecisionArray1D3('headlessgl'); -}); +(GPU.isWebGLSupported ? test : skip)( + 'fallback unsigned precision Array1D(3) webgl', + () => { + testUnsignedPrecisionArray1D3('webgl'); + } +); + +(GPU.isWebGL2Supported ? test : skip)( + 'fallback unsigned precision Array1D(3) webgl2', + () => { + testUnsignedPrecisionArray1D3('webgl2'); + } +); + +(GPU.isHeadlessGLSupported ? test : skip)( + 'fallback unsigned precision Array1D(3) headlessgl', + () => { + testUnsignedPrecisionArray1D3('headlessgl'); + } +); test('fallback unsigned precision Array1D(3) cpu', () => { testUnsignedPrecisionArray1D3('cpu'); @@ -182,18 +242,21 @@ test('fallback unsigned precision Array1D(3) cpu', () => { function testUnsignedPrecisionArray1D4(mode) { const gpu = new GPU({ mode }); - const kernel = gpu.createKernel(function(value) { - return value[this.thread.x]; - }, { - output: [4], - argumentTypes: { value: 'Array1D(4)' }, - precision: 'unsigned', - }); + const kernel = gpu.createKernel( + function (value) { + return value[this.thread.x]; + }, + { + output: [4], + argumentTypes: { value: 'Array1D(4)' }, + precision: 'unsigned', + } + ); const value = [ - new Float32Array([1,2,3,4]), - new Float32Array([5,6,7,8]), - new Float32Array([9,10,11,12]), - new Float32Array([13,14,15,16]), + new Float32Array([1, 2, 3, 4]), + new Float32Array([5, 6, 7, 8]), + new Float32Array([9, 10, 11, 12]), + new Float32Array([13, 14, 15, 16]), ]; const result = kernel(value); assert.deepEqual(result, value); @@ -209,17 +272,26 @@ test('fallback unsigned precision Array1D(4) gpu', () => { testUnsignedPrecisionArray1D4('gpu'); }); -(GPU.isWebGLSupported ? test : skip)('fallback unsigned precision Array1D(4) webgl', () => { - testUnsignedPrecisionArray1D4('webgl'); -}); - -(GPU.isWebGL2Supported ? test : skip)('fallback unsigned precision Array1D(4) webgl2', () => { - testUnsignedPrecisionArray1D4('webgl2'); -}); - -(GPU.isHeadlessGLSupported ? test : skip)('fallback unsigned precision Array1D(4) headlessgl', () => { - testUnsignedPrecisionArray1D4('headlessgl'); -}); +(GPU.isWebGLSupported ? test : skip)( + 'fallback unsigned precision Array1D(4) webgl', + () => { + testUnsignedPrecisionArray1D4('webgl'); + } +); + +(GPU.isWebGL2Supported ? test : skip)( + 'fallback unsigned precision Array1D(4) webgl2', + () => { + testUnsignedPrecisionArray1D4('webgl2'); + } +); + +(GPU.isHeadlessGLSupported ? test : skip)( + 'fallback unsigned precision Array1D(4) headlessgl', + () => { + testUnsignedPrecisionArray1D4('headlessgl'); + } +); test('fallback unsigned precision Array1D(4) cpu', () => { testUnsignedPrecisionArray1D4('cpu'); diff --git a/test/features/argument-array2d-types.js b/test/features/argument-array2d-types.js index 44e7e79b..c98b1ec4 100644 --- a/test/features/argument-array2d-types.js +++ b/test/features/argument-array2d-types.js @@ -1,54 +1,73 @@ const { assert, skip, test, module: describe, only } = require('qunit'); -const { GPU } = require('../../src'); +const { GPU } = require('../..'); describe('argument array 2 types'); function testSinglePrecisionArray2D2(mode) { const gpu = new GPU({ mode }); - const kernel = gpu.createKernel(function(value) { - return value[this.thread.y][this.thread.x]; - }, { - output: [4, 2], - argumentTypes: { value: 'Array2D(2)' }, - precision: 'single', - }); + const kernel = gpu.createKernel( + function (value) { + return value[this.thread.y][this.thread.x]; + }, + { + output: [4, 2], + argumentTypes: { value: 'Array2D(2)' }, + precision: 'single', + } + ); const value = [ [ - new Float32Array([1,2]), - new Float32Array([3,4]), - new Float32Array([5,6]), - new Float32Array([7,8]), - ], [ - new Float32Array([9,10]), - new Float32Array([11,12]), - new Float32Array([13,14]), - new Float32Array([15,16]), - ] + new Float32Array([1, 2]), + new Float32Array([3, 4]), + new Float32Array([5, 6]), + new Float32Array([7, 8]), + ], + [ + new Float32Array([9, 10]), + new Float32Array([11, 12]), + new Float32Array([13, 14]), + new Float32Array([15, 16]), + ], ]; const result = kernel(value); assert.deepEqual(result, value); gpu.destroy(); } -(GPU.isSinglePrecisionSupported ? test : skip)('single precision Array2D(2) auto', () => { - testSinglePrecisionArray2D2(); -}); - -(GPU.isSinglePrecisionSupported ? test : skip)('single precision Array2D(2) gpu', () => { - testSinglePrecisionArray2D2('gpu'); -}); - -(GPU.isSinglePrecisionSupported && GPU.isWebGLSupported ? test : skip)('single precision Array2D(2) webgl', () => { - testSinglePrecisionArray2D2('webgl'); -}); - -(GPU.isSinglePrecisionSupported && GPU.isWebGL2Supported ? test : skip)('single precision Array2D(2) webgl2', () => { - testSinglePrecisionArray2D2('webgl2'); -}); - -(GPU.isSinglePrecisionSupported && GPU.isHeadlessGLSupported ? test : skip)('single precision Array2D(2) headlessgl', () => { - testSinglePrecisionArray2D2('headlessgl'); -}); +(GPU.isSinglePrecisionSupported ? test : skip)( + 'single precision Array2D(2) auto', + () => { + testSinglePrecisionArray2D2(); + } +); + +(GPU.isSinglePrecisionSupported ? test : skip)( + 'single precision Array2D(2) gpu', + () => { + testSinglePrecisionArray2D2('gpu'); + } +); + +(GPU.isSinglePrecisionSupported && GPU.isWebGLSupported ? test : skip)( + 'single precision Array2D(2) webgl', + () => { + testSinglePrecisionArray2D2('webgl'); + } +); + +(GPU.isSinglePrecisionSupported && GPU.isWebGL2Supported ? test : skip)( + 'single precision Array2D(2) webgl2', + () => { + testSinglePrecisionArray2D2('webgl2'); + } +); + +(GPU.isSinglePrecisionSupported && GPU.isHeadlessGLSupported ? test : skip)( + 'single precision Array2D(2) headlessgl', + () => { + testSinglePrecisionArray2D2('headlessgl'); + } +); test('single precision Array2D(2) cpu', () => { testSinglePrecisionArray2D2('cpu'); @@ -56,25 +75,29 @@ test('single precision Array2D(2) cpu', () => { function testUnsignedPrecisionArray2D2(mode) { const gpu = new GPU({ mode }); - const kernel = gpu.createKernel(function(value) { - return value[this.thread.y][this.thread.x]; - }, { - output: [4, 2], - argumentTypes: { value: 'Array2D(2)' }, - precision: 'unsigned', - }); + const kernel = gpu.createKernel( + function (value) { + return value[this.thread.y][this.thread.x]; + }, + { + output: [4, 2], + argumentTypes: { value: 'Array2D(2)' }, + precision: 'unsigned', + } + ); const value = [ [ - new Float32Array([1,2]), - new Float32Array([3,4]), - new Float32Array([5,6]), - new Float32Array([7,8]), - ], [ - new Float32Array([9,10]), - new Float32Array([11,12]), - new Float32Array([13,14]), - new Float32Array([15,16]), - ] + new Float32Array([1, 2]), + new Float32Array([3, 4]), + new Float32Array([5, 6]), + new Float32Array([7, 8]), + ], + [ + new Float32Array([9, 10]), + new Float32Array([11, 12]), + new Float32Array([13, 14]), + new Float32Array([15, 16]), + ], ]; const result = kernel(value); assert.deepEqual(result, value); @@ -89,17 +112,26 @@ test('fallback unsigned precision Array2D(2) gpu', () => { testUnsignedPrecisionArray2D2('gpu'); }); -(GPU.isWebGLSupported ? test : skip)('fallback unsigned precision Array2D(2) webgl', () => { - testUnsignedPrecisionArray2D2('webgl'); -}); +(GPU.isWebGLSupported ? test : skip)( + 'fallback unsigned precision Array2D(2) webgl', + () => { + testUnsignedPrecisionArray2D2('webgl'); + } +); -(GPU.isWebGL2Supported ? test : skip)('fallback unsigned precision Array2D(2) webgl2', () => { - testUnsignedPrecisionArray2D2('webgl2'); -}); +(GPU.isWebGL2Supported ? test : skip)( + 'fallback unsigned precision Array2D(2) webgl2', + () => { + testUnsignedPrecisionArray2D2('webgl2'); + } +); -(GPU.isHeadlessGLSupported ? test : skip)('fallback unsigned precision Array(2) headlessgl', () => { - testUnsignedPrecisionArray2D2('headlessgl'); -}); +(GPU.isHeadlessGLSupported ? test : skip)( + 'fallback unsigned precision Array(2) headlessgl', + () => { + testUnsignedPrecisionArray2D2('headlessgl'); + } +); test('fallback unsigned precision Array2D(2) cpu', () => { testUnsignedPrecisionArray2D2('cpu'); @@ -107,50 +139,69 @@ test('fallback unsigned precision Array2D(2) cpu', () => { function testSinglePrecisionArray2D3(mode) { const gpu = new GPU({ mode }); - const kernel = gpu.createKernel(function(value) { - return value[this.thread.y][this.thread.x]; - }, { - output: [4, 2], - argumentTypes: { value: 'Array2D(3)' }, - precision: 'single', - }); + const kernel = gpu.createKernel( + function (value) { + return value[this.thread.y][this.thread.x]; + }, + { + output: [4, 2], + argumentTypes: { value: 'Array2D(3)' }, + precision: 'single', + } + ); const value = [ [ - new Float32Array([1,2,3]), - new Float32Array([4,5,6]), - new Float32Array([7,8,9]), - new Float32Array([10,11,12]), - ], [ - new Float32Array([13,14,15]), - new Float32Array([16,17,18]), - new Float32Array([19,20,21]), - new Float32Array([22,23,25]), - ] + new Float32Array([1, 2, 3]), + new Float32Array([4, 5, 6]), + new Float32Array([7, 8, 9]), + new Float32Array([10, 11, 12]), + ], + [ + new Float32Array([13, 14, 15]), + new Float32Array([16, 17, 18]), + new Float32Array([19, 20, 21]), + new Float32Array([22, 23, 25]), + ], ]; const result = kernel(value); assert.deepEqual(result, value); gpu.destroy(); } -(GPU.isSinglePrecisionSupported ? test : skip)('single precision Array2D(3) auto', () => { - testSinglePrecisionArray2D3(); -}); - -(GPU.isSinglePrecisionSupported ? test : skip)('single precision Array2D(3) gpu', () => { - testSinglePrecisionArray2D3('gpu'); -}); - -(GPU.isSinglePrecisionSupported && GPU.isWebGLSupported ? test : skip)('single precision Array2D(3) webgl', () => { - testSinglePrecisionArray2D3('webgl'); -}); - -(GPU.isSinglePrecisionSupported && GPU.isWebGL2Supported ? test : skip)('single precision Array2D(3) webgl2', () => { - testSinglePrecisionArray2D3('webgl2'); -}); - -(GPU.isSinglePrecisionSupported && GPU.isHeadlessGLSupported ? test : skip)('single precision Array2D(3) headlessgl', () => { - testSinglePrecisionArray2D3('headlessgl'); -}); +(GPU.isSinglePrecisionSupported ? test : skip)( + 'single precision Array2D(3) auto', + () => { + testSinglePrecisionArray2D3(); + } +); + +(GPU.isSinglePrecisionSupported ? test : skip)( + 'single precision Array2D(3) gpu', + () => { + testSinglePrecisionArray2D3('gpu'); + } +); + +(GPU.isSinglePrecisionSupported && GPU.isWebGLSupported ? test : skip)( + 'single precision Array2D(3) webgl', + () => { + testSinglePrecisionArray2D3('webgl'); + } +); + +(GPU.isSinglePrecisionSupported && GPU.isWebGL2Supported ? test : skip)( + 'single precision Array2D(3) webgl2', + () => { + testSinglePrecisionArray2D3('webgl2'); + } +); + +(GPU.isSinglePrecisionSupported && GPU.isHeadlessGLSupported ? test : skip)( + 'single precision Array2D(3) headlessgl', + () => { + testSinglePrecisionArray2D3('headlessgl'); + } +); test('single precision Array2D(3) cpu', () => { testSinglePrecisionArray2D3('cpu'); @@ -158,25 +209,29 @@ test('single precision Array2D(3) cpu', () => { function testUnsignedPrecisionArray2D3(mode) { const gpu = new GPU({ mode }); - const kernel = gpu.createKernel(function(value) { - return value[this.thread.y][this.thread.x]; - }, { - output: [4, 2], - argumentTypes: { value: 'Array2D(3)' }, - precision: 'unsigned', - }); + const kernel = gpu.createKernel( + function (value) { + return value[this.thread.y][this.thread.x]; + }, + { + output: [4, 2], + argumentTypes: { value: 'Array2D(3)' }, + precision: 'unsigned', + } + ); const value = [ [ - new Float32Array([1,2,3]), - new Float32Array([4,5,6]), - new Float32Array([7,8,9]), - new Float32Array([10,11,12]), - ], [ - new Float32Array([13,14,15]), - new Float32Array([16,17,18]), - new Float32Array([19,20,21]), - new Float32Array([22,23,25]), - ] + new Float32Array([1, 2, 3]), + new Float32Array([4, 5, 6]), + new Float32Array([7, 8, 9]), + new Float32Array([10, 11, 12]), + ], + [ + new Float32Array([13, 14, 15]), + new Float32Array([16, 17, 18]), + new Float32Array([19, 20, 21]), + new Float32Array([22, 23, 25]), + ], ]; const result = kernel(value); assert.deepEqual(result, value); @@ -191,17 +246,26 @@ test('fallback unsigned precision Array2D(3) gpu', () => { testUnsignedPrecisionArray2D3('gpu'); }); -(GPU.isWebGLSupported ? test : skip)('fallback unsigned precision Array2D(3) webgl', () => { - testUnsignedPrecisionArray2D3('webgl'); -}); +(GPU.isWebGLSupported ? test : skip)( + 'fallback unsigned precision Array2D(3) webgl', + () => { + testUnsignedPrecisionArray2D3('webgl'); + } +); -(GPU.isWebGL2Supported ? test : skip)('fallback unsigned precision Array2D(3) webgl2', () => { - testUnsignedPrecisionArray2D3('webgl2'); -}); +(GPU.isWebGL2Supported ? test : skip)( + 'fallback unsigned precision Array2D(3) webgl2', + () => { + testUnsignedPrecisionArray2D3('webgl2'); + } +); -(GPU.isHeadlessGLSupported ? test : skip)('fallback unsigned precision Array(3) headlessgl', () => { - testUnsignedPrecisionArray2D3('headlessgl'); -}); +(GPU.isHeadlessGLSupported ? test : skip)( + 'fallback unsigned precision Array(3) headlessgl', + () => { + testUnsignedPrecisionArray2D3('headlessgl'); + } +); test('fallback unsigned precision Array2D(3) cpu', () => { testUnsignedPrecisionArray2D3('cpu'); @@ -209,50 +273,69 @@ test('fallback unsigned precision Array2D(3) cpu', () => { function testSinglePrecisionArray2D4(mode) { const gpu = new GPU({ mode }); - const kernel = gpu.createKernel(function(value) { - return value[this.thread.y][this.thread.x]; - }, { - output: [4, 2], - argumentTypes: { value: 'Array2D(4)' }, - precision: 'single', - }); + const kernel = gpu.createKernel( + function (value) { + return value[this.thread.y][this.thread.x]; + }, + { + output: [4, 2], + argumentTypes: { value: 'Array2D(4)' }, + precision: 'single', + } + ); const value = [ [ - new Float32Array([1,2,3,4]), - new Float32Array([5,6,7,8]), - new Float32Array([9,10,11,12]), - new Float32Array([13,14,15,16]), - ], [ - new Float32Array([17,18,19,20]), - new Float32Array([21,22,23,24]), - new Float32Array([25,26,27,28]), - new Float32Array([29,30,31,32]), - ] + new Float32Array([1, 2, 3, 4]), + new Float32Array([5, 6, 7, 8]), + new Float32Array([9, 10, 11, 12]), + new Float32Array([13, 14, 15, 16]), + ], + [ + new Float32Array([17, 18, 19, 20]), + new Float32Array([21, 22, 23, 24]), + new Float32Array([25, 26, 27, 28]), + new Float32Array([29, 30, 31, 32]), + ], ]; const result = kernel(value); assert.deepEqual(result, value); gpu.destroy(); } -(GPU.isSinglePrecisionSupported ? test : skip)('single precision Array2D(4) auto', () => { - testSinglePrecisionArray2D4(); -}); - -(GPU.isSinglePrecisionSupported ? test : skip)('single precision Array2D(4) gpu', () => { - testSinglePrecisionArray2D4('gpu'); -}); - -(GPU.isSinglePrecisionSupported && GPU.isWebGLSupported ? test : skip)('single precision Array2D(4) webgl', () => { - testSinglePrecisionArray2D4('webgl'); -}); - -(GPU.isSinglePrecisionSupported && GPU.isWebGL2Supported ? test : skip)('single precision Array2D(4) webgl2', () => { - testSinglePrecisionArray2D4('webgl2'); -}); - -(GPU.isSinglePrecisionSupported && GPU.isHeadlessGLSupported ? test : skip)('single precision Array2D(4) headlessgl', () => { - testSinglePrecisionArray2D4('headlessgl'); -}); +(GPU.isSinglePrecisionSupported ? test : skip)( + 'single precision Array2D(4) auto', + () => { + testSinglePrecisionArray2D4(); + } +); + +(GPU.isSinglePrecisionSupported ? test : skip)( + 'single precision Array2D(4) gpu', + () => { + testSinglePrecisionArray2D4('gpu'); + } +); + +(GPU.isSinglePrecisionSupported && GPU.isWebGLSupported ? test : skip)( + 'single precision Array2D(4) webgl', + () => { + testSinglePrecisionArray2D4('webgl'); + } +); + +(GPU.isSinglePrecisionSupported && GPU.isWebGL2Supported ? test : skip)( + 'single precision Array2D(4) webgl2', + () => { + testSinglePrecisionArray2D4('webgl2'); + } +); + +(GPU.isSinglePrecisionSupported && GPU.isHeadlessGLSupported ? test : skip)( + 'single precision Array2D(4) headlessgl', + () => { + testSinglePrecisionArray2D4('headlessgl'); + } +); test('single precision Array2D(4) cpu', () => { testSinglePrecisionArray2D4('cpu'); @@ -260,25 +343,29 @@ test('single precision Array2D(4) cpu', () => { function testUnsignedPrecisionArray2D4(mode) { const gpu = new GPU({ mode }); - const kernel = gpu.createKernel(function(value) { - return value[this.thread.y][this.thread.x]; - }, { - output: [4, 2], - argumentTypes: { value: 'Array2D(4)' }, - precision: 'unsigned', - }); + const kernel = gpu.createKernel( + function (value) { + return value[this.thread.y][this.thread.x]; + }, + { + output: [4, 2], + argumentTypes: { value: 'Array2D(4)' }, + precision: 'unsigned', + } + ); const value = [ [ - new Float32Array([1,2,3,4]), - new Float32Array([5,6,7,8]), - new Float32Array([9,10,11,12]), - new Float32Array([13,14,15,16]), - ], [ - new Float32Array([17,18,19,20]), - new Float32Array([21,22,23,24]), - new Float32Array([25,26,27,28]), - new Float32Array([29,30,31,32]), - ] + new Float32Array([1, 2, 3, 4]), + new Float32Array([5, 6, 7, 8]), + new Float32Array([9, 10, 11, 12]), + new Float32Array([13, 14, 15, 16]), + ], + [ + new Float32Array([17, 18, 19, 20]), + new Float32Array([21, 22, 23, 24]), + new Float32Array([25, 26, 27, 28]), + new Float32Array([29, 30, 31, 32]), + ], ]; const result = kernel(value); assert.deepEqual(result, value); @@ -293,17 +380,26 @@ test('fallback unsigned precision Array2D(4) gpu', () => { testUnsignedPrecisionArray2D4('gpu'); }); -(GPU.isWebGLSupported ? test : skip)('fallback unsigned precision Array2D(4) webgl', () => { - testUnsignedPrecisionArray2D4('webgl'); -}); - -(GPU.isWebGL2Supported ? test : skip)('fallback unsigned precision Array2D(4) webgl2', () => { - testUnsignedPrecisionArray2D4('webgl2'); -}); - -(GPU.isHeadlessGLSupported ? test : skip)('fallback unsigned precision Array(4) headlessgl', () => { - testUnsignedPrecisionArray2D4('headlessgl'); -}); +(GPU.isWebGLSupported ? test : skip)( + 'fallback unsigned precision Array2D(4) webgl', + () => { + testUnsignedPrecisionArray2D4('webgl'); + } +); + +(GPU.isWebGL2Supported ? test : skip)( + 'fallback unsigned precision Array2D(4) webgl2', + () => { + testUnsignedPrecisionArray2D4('webgl2'); + } +); + +(GPU.isHeadlessGLSupported ? test : skip)( + 'fallback unsigned precision Array(4) headlessgl', + () => { + testUnsignedPrecisionArray2D4('headlessgl'); + } +); test('fallback unsigned precision Array2D(4) cpu', () => { testUnsignedPrecisionArray2D4('cpu'); diff --git a/test/features/argument-array3d-types.js b/test/features/argument-array3d-types.js index 68e1fe3a..35464d33 100644 --- a/test/features/argument-array3d-types.js +++ b/test/features/argument-array3d-types.js @@ -1,68 +1,73 @@ const { assert, skip, test, module: describe, only } = require('qunit'); -const { GPU } = require('../../src'); +const { GPU } = require('../..'); describe('argument array 3 types'); function testSinglePrecisionArray3D2(mode) { const gpu = new GPU({ mode }); - const kernel = gpu.createKernel(function(value) { - return value[this.thread.z][this.thread.y][this.thread.x]; - }, { - output: [2,2,3], - argumentTypes: { value: 'Array3D(2)' }, - precision: 'single', - }); + const kernel = gpu.createKernel( + function (value) { + return value[this.thread.z][this.thread.y][this.thread.x]; + }, + { + output: [2, 2, 3], + argumentTypes: { value: 'Array3D(2)' }, + precision: 'single', + } + ); const value = [ [ - [ - new Float32Array([1,2]), - new Float32Array([3,4]), - ],[ - new Float32Array([5,6]), - new Float32Array([7,8]), - ] - ],[ - [ - new Float32Array([9,10]), - new Float32Array([11,12]), - ],[ - new Float32Array([13,14]), - new Float32Array([15,16]), - ] - ],[ - [ - new Float32Array([17,18]), - new Float32Array([19,20]), - ],[ - new Float32Array([21,22]), - new Float32Array([23,24]), - ] - ] + [new Float32Array([1, 2]), new Float32Array([3, 4])], + [new Float32Array([5, 6]), new Float32Array([7, 8])], + ], + [ + [new Float32Array([9, 10]), new Float32Array([11, 12])], + [new Float32Array([13, 14]), new Float32Array([15, 16])], + ], + [ + [new Float32Array([17, 18]), new Float32Array([19, 20])], + [new Float32Array([21, 22]), new Float32Array([23, 24])], + ], ]; const result = kernel(value); assert.deepEqual(result, value); gpu.destroy(); } -(GPU.isSinglePrecisionSupported ? test : skip)('single precision Array3D(2) auto', () => { - testSinglePrecisionArray3D2(); -}); - -(GPU.isSinglePrecisionSupported ? test : skip)('single precision Array3D(2) gpu', () => { - testSinglePrecisionArray3D2('gpu'); -}); - -(GPU.isSinglePrecisionSupported && GPU.isWebGLSupported ? test : skip)('single precision Array3D(2) webgl', () => { - testSinglePrecisionArray3D2('webgl'); -}); - -(GPU.isSinglePrecisionSupported && GPU.isWebGL2Supported ? test : skip)('single precision Array3D(2) webgl2', () => { - testSinglePrecisionArray3D2('webgl2'); -}); - -(GPU.isSinglePrecisionSupported && GPU.isHeadlessGLSupported ? test : skip)('single precision Array3D(2) headlessgl', () => { - testSinglePrecisionArray3D2('headlessgl'); -}); +(GPU.isSinglePrecisionSupported ? test : skip)( + 'single precision Array3D(2) auto', + () => { + testSinglePrecisionArray3D2(); + } +); + +(GPU.isSinglePrecisionSupported ? test : skip)( + 'single precision Array3D(2) gpu', + () => { + testSinglePrecisionArray3D2('gpu'); + } +); + +(GPU.isSinglePrecisionSupported && GPU.isWebGLSupported ? test : skip)( + 'single precision Array3D(2) webgl', + () => { + testSinglePrecisionArray3D2('webgl'); + } +); + +(GPU.isSinglePrecisionSupported && GPU.isWebGL2Supported ? test : skip)( + 'single precision Array3D(2) webgl2', + () => { + testSinglePrecisionArray3D2('webgl2'); + } +); + +(GPU.isSinglePrecisionSupported && GPU.isHeadlessGLSupported ? test : skip)( + 'single precision Array3D(2) headlessgl', + () => { + testSinglePrecisionArray3D2('headlessgl'); + } +); test('single precision Array3D(2) cpu', () => { testSinglePrecisionArray3D2('cpu'); @@ -70,39 +75,29 @@ test('single precision Array3D(2) cpu', () => { function testUnsignedPrecisionArray3D2(mode) { const gpu = new GPU({ mode }); - const kernel = gpu.createKernel(function(value) { - return value[this.thread.z][this.thread.y][this.thread.x]; - }, { - output: [2,2,3], - argumentTypes: { value: 'Array2D(2)' }, - precision: 'unsigned', - }); + const kernel = gpu.createKernel( + function (value) { + return value[this.thread.z][this.thread.y][this.thread.x]; + }, + { + output: [2, 2, 3], + argumentTypes: { value: 'Array2D(2)' }, + precision: 'unsigned', + } + ); const value = [ [ - [ - new Float32Array([1,2]), - new Float32Array([3,4]), - ],[ - new Float32Array([5,6]), - new Float32Array([7,8]), - ] - ],[ - [ - new Float32Array([9,10]), - new Float32Array([11,12]), - ],[ - new Float32Array([13,14]), - new Float32Array([15,16]), - ] - ],[ - [ - new Float32Array([17,18]), - new Float32Array([19,20]), - ],[ - new Float32Array([21,22]), - new Float32Array([23,24]), - ] - ] + [new Float32Array([1, 2]), new Float32Array([3, 4])], + [new Float32Array([5, 6]), new Float32Array([7, 8])], + ], + [ + [new Float32Array([9, 10]), new Float32Array([11, 12])], + [new Float32Array([13, 14]), new Float32Array([15, 16])], + ], + [ + [new Float32Array([17, 18]), new Float32Array([19, 20])], + [new Float32Array([21, 22]), new Float32Array([23, 24])], + ], ]; const result = kernel(value); assert.deepEqual(result, value); @@ -117,17 +112,26 @@ test('fallback unsigned precision Array3D(3) gpu', () => { testUnsignedPrecisionArray3D2('gpu'); }); -(GPU.isWebGLSupported ? test : skip)('fallback unsigned precision Array3D(3) webgl', () => { - testUnsignedPrecisionArray3D2('webgl'); -}); +(GPU.isWebGLSupported ? test : skip)( + 'fallback unsigned precision Array3D(3) webgl', + () => { + testUnsignedPrecisionArray3D2('webgl'); + } +); -(GPU.isWebGL2Supported ? test : skip)('fallback unsigned precision Array3D(3) webgl2', () => { - testUnsignedPrecisionArray3D2('webgl2'); -}); +(GPU.isWebGL2Supported ? test : skip)( + 'fallback unsigned precision Array3D(3) webgl2', + () => { + testUnsignedPrecisionArray3D2('webgl2'); + } +); -(GPU.isHeadlessGLSupported ? test : skip)('fallback unsigned precision Array3D(3) headlessgl', () => { - testUnsignedPrecisionArray3D2('headlessgl'); -}); +(GPU.isHeadlessGLSupported ? test : skip)( + 'fallback unsigned precision Array3D(3) headlessgl', + () => { + testUnsignedPrecisionArray3D2('headlessgl'); + } +); test('fallback unsigned precision Array3D(3) cpu', () => { testUnsignedPrecisionArray3D2('cpu'); @@ -135,64 +139,69 @@ test('fallback unsigned precision Array3D(3) cpu', () => { function testSinglePrecisionArray3D3(mode) { const gpu = new GPU({ mode }); - const kernel = gpu.createKernel(function(value) { - return value[this.thread.z][this.thread.y][this.thread.x]; - }, { - output: [2,2,3], - argumentTypes: { value: 'Array3D(3)' }, - precision: 'single', - }); + const kernel = gpu.createKernel( + function (value) { + return value[this.thread.z][this.thread.y][this.thread.x]; + }, + { + output: [2, 2, 3], + argumentTypes: { value: 'Array3D(3)' }, + precision: 'single', + } + ); const value = [ [ - [ - new Float32Array([1,2,3]), - new Float32Array([4,5,6]), - ],[ - new Float32Array([7,8,9]), - new Float32Array([10,11,12]), - ] - ],[ - [ - new Float32Array([13,14,15]), - new Float32Array([16,17,18]), - ],[ - new Float32Array([19,20,21]), - new Float32Array([22,23,24]), - ] - ],[ - [ - new Float32Array([25,26,27]), - new Float32Array([28,29,30]), - ],[ - new Float32Array([31,32,33]), - new Float32Array([34,35,36]), - ] - ] + [new Float32Array([1, 2, 3]), new Float32Array([4, 5, 6])], + [new Float32Array([7, 8, 9]), new Float32Array([10, 11, 12])], + ], + [ + [new Float32Array([13, 14, 15]), new Float32Array([16, 17, 18])], + [new Float32Array([19, 20, 21]), new Float32Array([22, 23, 24])], + ], + [ + [new Float32Array([25, 26, 27]), new Float32Array([28, 29, 30])], + [new Float32Array([31, 32, 33]), new Float32Array([34, 35, 36])], + ], ]; const result = kernel(value); assert.deepEqual(result, value); gpu.destroy(); } -(GPU.isSinglePrecisionSupported ? test : skip)('single precision Array3D(3) auto', () => { - testSinglePrecisionArray3D3(); -}); - -(GPU.isSinglePrecisionSupported ? test : skip)('single precision Array3D(3) gpu', () => { - testSinglePrecisionArray3D3('gpu'); -}); - -(GPU.isSinglePrecisionSupported && GPU.isWebGLSupported ? test : skip)('single precision Array3D(3) webgl', () => { - testSinglePrecisionArray3D3('webgl'); -}); - -(GPU.isSinglePrecisionSupported && GPU.isWebGL2Supported ? test : skip)('single precision Array3D(3) webgl2', () => { - testSinglePrecisionArray3D3('webgl2'); -}); - -(GPU.isSinglePrecisionSupported && GPU.isHeadlessGLSupported ? test : skip)('single precision Array3D(3) headlessgl', () => { - testSinglePrecisionArray3D3('headlessgl'); -}); +(GPU.isSinglePrecisionSupported ? test : skip)( + 'single precision Array3D(3) auto', + () => { + testSinglePrecisionArray3D3(); + } +); + +(GPU.isSinglePrecisionSupported ? test : skip)( + 'single precision Array3D(3) gpu', + () => { + testSinglePrecisionArray3D3('gpu'); + } +); + +(GPU.isSinglePrecisionSupported && GPU.isWebGLSupported ? test : skip)( + 'single precision Array3D(3) webgl', + () => { + testSinglePrecisionArray3D3('webgl'); + } +); + +(GPU.isSinglePrecisionSupported && GPU.isWebGL2Supported ? test : skip)( + 'single precision Array3D(3) webgl2', + () => { + testSinglePrecisionArray3D3('webgl2'); + } +); + +(GPU.isSinglePrecisionSupported && GPU.isHeadlessGLSupported ? test : skip)( + 'single precision Array3D(3) headlessgl', + () => { + testSinglePrecisionArray3D3('headlessgl'); + } +); test('single precision Array3D(3) cpu', () => { testSinglePrecisionArray3D3('cpu'); @@ -200,39 +209,29 @@ test('single precision Array3D(3) cpu', () => { function testUnsignedPrecisionArray3D3(mode) { const gpu = new GPU({ mode }); - const kernel = gpu.createKernel(function(value) { - return value[this.thread.z][this.thread.y][this.thread.x]; - }, { - output: [2,2,3], - argumentTypes: { value: 'Array2D(3)' }, - precision: 'unsigned', - }); + const kernel = gpu.createKernel( + function (value) { + return value[this.thread.z][this.thread.y][this.thread.x]; + }, + { + output: [2, 2, 3], + argumentTypes: { value: 'Array2D(3)' }, + precision: 'unsigned', + } + ); const value = [ [ - [ - new Float32Array([1,2,3]), - new Float32Array([4,5,6]), - ],[ - new Float32Array([7,8,9]), - new Float32Array([10,11,12]), - ] - ],[ - [ - new Float32Array([13,14,15]), - new Float32Array([16,17,18]), - ],[ - new Float32Array([19,20,21]), - new Float32Array([22,23,24]), - ] - ],[ - [ - new Float32Array([25,26,27]), - new Float32Array([28,29,30]), - ],[ - new Float32Array([31,32,33]), - new Float32Array([34,35,36]), - ] - ] + [new Float32Array([1, 2, 3]), new Float32Array([4, 5, 6])], + [new Float32Array([7, 8, 9]), new Float32Array([10, 11, 12])], + ], + [ + [new Float32Array([13, 14, 15]), new Float32Array([16, 17, 18])], + [new Float32Array([19, 20, 21]), new Float32Array([22, 23, 24])], + ], + [ + [new Float32Array([25, 26, 27]), new Float32Array([28, 29, 30])], + [new Float32Array([31, 32, 33]), new Float32Array([34, 35, 36])], + ], ]; const result = kernel(value); assert.deepEqual(result, value); @@ -247,17 +246,26 @@ test('fallback unsigned precision Array3D(3) gpu', () => { testUnsignedPrecisionArray3D3('gpu'); }); -(GPU.isWebGLSupported ? test : skip)('fallback unsigned precision Array3D(3) webgl', () => { - testUnsignedPrecisionArray3D3('webgl'); -}); +(GPU.isWebGLSupported ? test : skip)( + 'fallback unsigned precision Array3D(3) webgl', + () => { + testUnsignedPrecisionArray3D3('webgl'); + } +); -(GPU.isWebGL2Supported ? test : skip)('fallback unsigned precision Array3D(3) webgl2', () => { - testUnsignedPrecisionArray3D3('webgl2'); -}); +(GPU.isWebGL2Supported ? test : skip)( + 'fallback unsigned precision Array3D(3) webgl2', + () => { + testUnsignedPrecisionArray3D3('webgl2'); + } +); -(GPU.isHeadlessGLSupported ? test : skip)('fallback unsigned precision Array3D(3) headlessgl', () => { - testUnsignedPrecisionArray3D3('headlessgl'); -}); +(GPU.isHeadlessGLSupported ? test : skip)( + 'fallback unsigned precision Array3D(3) headlessgl', + () => { + testUnsignedPrecisionArray3D3('headlessgl'); + } +); test('fallback unsigned precision Array3D(3) cpu', () => { testUnsignedPrecisionArray3D3('cpu'); @@ -265,64 +273,69 @@ test('fallback unsigned precision Array3D(3) cpu', () => { function testSinglePrecisionArray3D4(mode) { const gpu = new GPU({ mode }); - const kernel = gpu.createKernel(function(value) { - return value[this.thread.z][this.thread.y][this.thread.x]; - }, { - output: [2,2,3], - argumentTypes: { value: 'Array3D(4)' }, - precision: 'single', - }); + const kernel = gpu.createKernel( + function (value) { + return value[this.thread.z][this.thread.y][this.thread.x]; + }, + { + output: [2, 2, 3], + argumentTypes: { value: 'Array3D(4)' }, + precision: 'single', + } + ); const value = [ [ - [ - new Float32Array([1,2,3,4]), - new Float32Array([5,6,7,8]), - ],[ - new Float32Array([9,10,11,12]), - new Float32Array([13,14,15,16]), - ] - ],[ - [ - new Float32Array([17,18,19,20]), - new Float32Array([21,22,23,24]), - ],[ - new Float32Array([25,26,27,28]), - new Float32Array([29,30,31,32]), - ] - ],[ - [ - new Float32Array([33,34,35,36]), - new Float32Array([37,38,39,40]), - ],[ - new Float32Array([41,42,43,44]), - new Float32Array([45,46,47,48]), - ] - ] + [new Float32Array([1, 2, 3, 4]), new Float32Array([5, 6, 7, 8])], + [new Float32Array([9, 10, 11, 12]), new Float32Array([13, 14, 15, 16])], + ], + [ + [new Float32Array([17, 18, 19, 20]), new Float32Array([21, 22, 23, 24])], + [new Float32Array([25, 26, 27, 28]), new Float32Array([29, 30, 31, 32])], + ], + [ + [new Float32Array([33, 34, 35, 36]), new Float32Array([37, 38, 39, 40])], + [new Float32Array([41, 42, 43, 44]), new Float32Array([45, 46, 47, 48])], + ], ]; const result = kernel(value); assert.deepEqual(result, value); gpu.destroy(); } -(GPU.isSinglePrecisionSupported ? test : skip)('single precision Array3D(4) auto', () => { - testSinglePrecisionArray3D4(); -}); - -(GPU.isSinglePrecisionSupported ? test : skip)('single precision Array3D(4) gpu', () => { - testSinglePrecisionArray3D4('gpu'); -}); - -(GPU.isSinglePrecisionSupported && GPU.isWebGLSupported ? test : skip)('single precision Array3D(4) webgl', () => { - testSinglePrecisionArray3D4('webgl'); -}); - -(GPU.isSinglePrecisionSupported && GPU.isWebGL2Supported ? test : skip)('single precision Array3D(4) webgl2', () => { - testSinglePrecisionArray3D4('webgl2'); -}); - -(GPU.isSinglePrecisionSupported && GPU.isHeadlessGLSupported ? test : skip)('single precision Array3D(4) headlessgl', () => { - testSinglePrecisionArray3D4('headlessgl'); -}); +(GPU.isSinglePrecisionSupported ? test : skip)( + 'single precision Array3D(4) auto', + () => { + testSinglePrecisionArray3D4(); + } +); + +(GPU.isSinglePrecisionSupported ? test : skip)( + 'single precision Array3D(4) gpu', + () => { + testSinglePrecisionArray3D4('gpu'); + } +); + +(GPU.isSinglePrecisionSupported && GPU.isWebGLSupported ? test : skip)( + 'single precision Array3D(4) webgl', + () => { + testSinglePrecisionArray3D4('webgl'); + } +); + +(GPU.isSinglePrecisionSupported && GPU.isWebGL2Supported ? test : skip)( + 'single precision Array3D(4) webgl2', + () => { + testSinglePrecisionArray3D4('webgl2'); + } +); + +(GPU.isSinglePrecisionSupported && GPU.isHeadlessGLSupported ? test : skip)( + 'single precision Array3D(4) headlessgl', + () => { + testSinglePrecisionArray3D4('headlessgl'); + } +); test('single precision Array3D(4) cpu', () => { testSinglePrecisionArray3D4('cpu'); @@ -330,39 +343,29 @@ test('single precision Array3D(4) cpu', () => { function testUnsignedPrecisionArray3D4(mode) { const gpu = new GPU({ mode }); - const kernel = gpu.createKernel(function(value) { - return value[this.thread.z][this.thread.y][this.thread.x]; - }, { - output: [2,2,3], - argumentTypes: { value: 'Array2D(3)' }, - precision: 'unsigned', - }); + const kernel = gpu.createKernel( + function (value) { + return value[this.thread.z][this.thread.y][this.thread.x]; + }, + { + output: [2, 2, 3], + argumentTypes: { value: 'Array2D(3)' }, + precision: 'unsigned', + } + ); const value = [ [ - [ - new Float32Array([1,2,3,4]), - new Float32Array([5,6,7,8]), - ],[ - new Float32Array([9,10,11,12]), - new Float32Array([13,14,15,16]), - ] - ],[ - [ - new Float32Array([17,18,19,20]), - new Float32Array([21,22,23,24]), - ],[ - new Float32Array([25,26,27,28]), - new Float32Array([29,30,31,32]), - ] - ],[ - [ - new Float32Array([33,34,35,36]), - new Float32Array([37,38,39,40]), - ],[ - new Float32Array([41,42,43,44]), - new Float32Array([45,46,47,48]), - ] - ] + [new Float32Array([1, 2, 3, 4]), new Float32Array([5, 6, 7, 8])], + [new Float32Array([9, 10, 11, 12]), new Float32Array([13, 14, 15, 16])], + ], + [ + [new Float32Array([17, 18, 19, 20]), new Float32Array([21, 22, 23, 24])], + [new Float32Array([25, 26, 27, 28]), new Float32Array([29, 30, 31, 32])], + ], + [ + [new Float32Array([33, 34, 35, 36]), new Float32Array([37, 38, 39, 40])], + [new Float32Array([41, 42, 43, 44]), new Float32Array([45, 46, 47, 48])], + ], ]; const result = kernel(value); assert.deepEqual(result, value); @@ -377,17 +380,26 @@ test('fallback unsigned precision Array3D(4) gpu', () => { testUnsignedPrecisionArray3D4('gpu'); }); -(GPU.isWebGLSupported ? test : skip)('fallback unsigned precision Array3D(4) webgl', () => { - testUnsignedPrecisionArray3D4('webgl'); -}); - -(GPU.isWebGL2Supported ? test : skip)('fallback unsigned precision Array3D(4) webgl2', () => { - testUnsignedPrecisionArray3D4('webgl2'); -}); - -(GPU.isHeadlessGLSupported ? test : skip)('fallback unsigned precision Array3D(4) headlessgl', () => { - testUnsignedPrecisionArray3D4('headlessgl'); -}); +(GPU.isWebGLSupported ? test : skip)( + 'fallback unsigned precision Array3D(4) webgl', + () => { + testUnsignedPrecisionArray3D4('webgl'); + } +); + +(GPU.isWebGL2Supported ? test : skip)( + 'fallback unsigned precision Array3D(4) webgl2', + () => { + testUnsignedPrecisionArray3D4('webgl2'); + } +); + +(GPU.isHeadlessGLSupported ? test : skip)( + 'fallback unsigned precision Array3D(4) headlessgl', + () => { + testUnsignedPrecisionArray3D4('headlessgl'); + } +); test('fallback unsigned precision Array3D(4) cpu', () => { testUnsignedPrecisionArray3D4('cpu'); diff --git a/test/features/arithmetic-operators.js b/test/features/arithmetic-operators.js index 5215b8af..f3d1a570 100644 --- a/test/features/arithmetic-operators.js +++ b/test/features/arithmetic-operators.js @@ -1,13 +1,16 @@ const { assert, skip, test, module: describe, only } = require('qunit'); -const { GPU } = require('../../src'); +const { GPU } = require('../..'); describe('features: arithmetic operators'); function addition(mode) { const gpu = new GPU({ mode }); - const kernel = gpu.createKernel(function() { - return 3 + 2; - }, { output: [1] }); + const kernel = gpu.createKernel( + function () { + return 3 + 2; + }, + { output: [1] } + ); const result = kernel(); assert.equal(result[0], 3 + 2); gpu.destroy(); @@ -37,12 +40,14 @@ test('addition cpu', () => { addition('cpu'); }); - function subtraction(mode) { const gpu = new GPU({ mode }); - const kernel = gpu.createKernel(function() { - return 3 - 2; - }, { output: [1] }); + const kernel = gpu.createKernel( + function () { + return 3 - 2; + }, + { output: [1] } + ); const result = kernel(); assert.equal(result[0], 3 - 2); gpu.destroy(); @@ -74,9 +79,12 @@ test('subtraction cpu', () => { function multiplication(mode) { const gpu = new GPU({ mode }); - const kernel = gpu.createKernel(function() { - return 3 * 2; - }, { output: [1] }); + const kernel = gpu.createKernel( + function () { + return 3 * 2; + }, + { output: [1] } + ); const result = kernel(); assert.equal(result[0], 3 * 2); gpu.destroy(); @@ -108,9 +116,12 @@ test('multiplication cpu', () => { function exponential(mode) { const gpu = new GPU({ mode }); - const kernel = gpu.createKernel(function() { - return 3 ** 2; - }, { output: [1] }); + const kernel = gpu.createKernel( + function () { + return 3 ** 2; + }, + { output: [1] } + ); const result = kernel(); assert.equal(result[0], 3 ** 2); gpu.destroy(); @@ -142,9 +153,12 @@ test('exponential cpu', () => { function division(mode) { const gpu = new GPU({ mode }); - const kernel = gpu.createKernel(function() { - return 3 / 2; - }, { output: [1] }); + const kernel = gpu.createKernel( + function () { + return 3 / 2; + }, + { output: [1] } + ); const result = kernel(); assert.equal(result[0], 3 / 2); gpu.destroy(); @@ -176,19 +190,28 @@ test('division cpu', () => { function modulus(mode) { const gpu = new GPU({ mode }); - const kernel1 = gpu.createKernel(function() { - return 3 % 2; - }, { output: [1] }); + const kernel1 = gpu.createKernel( + function () { + return 3 % 2; + }, + { output: [1] } + ); assert.equal(kernel1()[0], 3 % 2); - const kernel2 = gpu.createKernel(function() { - return -126 % 63.5; - }, { output: [1] }); + const kernel2 = gpu.createKernel( + function () { + return -126 % 63.5; + }, + { output: [1] } + ); assert.equal(kernel2()[0], -126 % 63.5); - const kernel3 = gpu.createKernel(function() { - return 126 % -63.5; - }, { output: [1] }); + const kernel3 = gpu.createKernel( + function () { + return 126 % -63.5; + }, + { output: [1] } + ); assert.equal(kernel3()[0], 126 % -63.5); gpu.destroy(); @@ -220,9 +243,12 @@ test('modulus cpu', () => { function modulusVariable(mode) { const gpu = new GPU({ mode }); - const kernel = gpu.createKernel(function(v) { - return 91 % 7; - }, { output: [1] }); + const kernel = gpu.createKernel( + function (v) { + return 91 % 7; + }, + { output: [1] } + ); assert.equal(kernel(7)[0], 0); gpu.destroy(); } @@ -231,14 +257,16 @@ test('modulus variable auto', () => { modulusVariable(); }); - function increment(mode) { const gpu = new GPU({ mode }); - const kernel = gpu.createKernel(function() { - let i = 3; - i++; - return i; - }, { output: [1] }); + const kernel = gpu.createKernel( + function () { + let i = 3; + i++; + return i; + }, + { output: [1] } + ); const result = kernel(); let i = 3; i++; @@ -272,10 +300,13 @@ test('increment cpu', () => { function incrementEarlyReturn(mode) { const gpu = new GPU({ mode }); - const kernel = gpu.createKernel(function() { - let i = 3; - return i++; - }, { output: [1] }); + const kernel = gpu.createKernel( + function () { + let i = 3; + return i++; + }, + { output: [1] } + ); const result = kernel(); let i = 3; assert.equal(result[0], i++); @@ -298,9 +329,12 @@ test('increment early return auto', () => { incrementEarlyReturn('webgl2'); }); -(GPU.isHeadlessGLSupported ? test : skip)('increment early return headlessgl', () => { - incrementEarlyReturn('headlessgl'); -}); +(GPU.isHeadlessGLSupported ? test : skip)( + 'increment early return headlessgl', + () => { + incrementEarlyReturn('headlessgl'); + } +); test('increment early return cpu', () => { incrementEarlyReturn('cpu'); @@ -308,11 +342,14 @@ test('increment early return cpu', () => { function decrement(mode) { const gpu = new GPU({ mode }); - const kernel = gpu.createKernel(function() { - let i = 3; - i--; - return i; - }, { output: [1] }); + const kernel = gpu.createKernel( + function () { + let i = 3; + i--; + return i; + }, + { output: [1] } + ); const result = kernel(); let i = 3; i--; @@ -346,10 +383,13 @@ test('decrement cpu', () => { function decrementEarlyReturn(mode) { const gpu = new GPU({ mode }); - const kernel = gpu.createKernel(function() { - let i = 3; - return i--; - }, { output: [1] }); + const kernel = gpu.createKernel( + function () { + let i = 3; + return i--; + }, + { output: [1] } + ); const result = kernel(); let i = 3; assert.equal(result[0], i--); @@ -372,9 +412,12 @@ test('decrement early return auto', () => { decrementEarlyReturn('webgl2'); }); -(GPU.isHeadlessGLSupported ? test : skip)('decrement early return headlessgl', () => { - decrementEarlyReturn('headlessgl'); -}); +(GPU.isHeadlessGLSupported ? test : skip)( + 'decrement early return headlessgl', + () => { + decrementEarlyReturn('headlessgl'); + } +); test('decrement early return cpu', () => { decrementEarlyReturn('cpu'); diff --git a/test/features/assignment-operators.js b/test/features/assignment-operators.js index e18bada0..33557660 100644 --- a/test/features/assignment-operators.js +++ b/test/features/assignment-operators.js @@ -1,14 +1,17 @@ const { assert, skip, test, module: describe, only } = require('qunit'); -const { GPU } = require('../../src'); +const { GPU } = require('../..'); describe('features: assignment operators'); function equal(mode) { const gpu = new GPU({ mode }); - const kernel = gpu.createKernel(function() { - let i = 3; - return i; - }, { output: [1] }); + const kernel = gpu.createKernel( + function () { + let i = 3; + return i; + }, + { output: [1] } + ); const result = kernel(); assert.equal(result[0], 3); gpu.destroy(); @@ -40,11 +43,14 @@ test('equal cpu', () => { function plusEqual(mode) { const gpu = new GPU({ mode }); - const kernel = gpu.createKernel(function() { - let i = 3; - i += 3; - return i; - }, { output: [1] }); + const kernel = gpu.createKernel( + function () { + let i = 3; + i += 3; + return i; + }, + { output: [1] } + ); const result = kernel(); let i = 3; i += 3; @@ -78,11 +84,14 @@ test('plus equal cpu', () => { function minusEqual(mode) { const gpu = new GPU({ mode }); - const kernel = gpu.createKernel(function() { - let i = 6; - i -= 3; - return i; - }, { output: [1] }); + const kernel = gpu.createKernel( + function () { + let i = 6; + i -= 3; + return i; + }, + { output: [1] } + ); const result = kernel(); let i = 6; i -= 3; @@ -116,11 +125,14 @@ test('minus equal cpu', () => { function multiplyEqual(mode) { const gpu = new GPU({ mode }); - const kernel = gpu.createKernel(function() { - let i = 6; - i *= 3; - return i; - }, { output: [1] }); + const kernel = gpu.createKernel( + function () { + let i = 6; + i *= 3; + return i; + }, + { output: [1] } + ); const result = kernel(); let i = 6; i *= 3; @@ -154,11 +166,14 @@ test('multiply equal cpu', () => { function divideEqual(mode) { const gpu = new GPU({ mode }); - const kernel = gpu.createKernel(function() { - let i = 6; - i /= 3; - return i; - }, { output: [1] }); + const kernel = gpu.createKernel( + function () { + let i = 6; + i /= 3; + return i; + }, + { output: [1] } + ); const result = kernel(); let i = 6; i /= 3; @@ -190,14 +205,16 @@ test('divide equal cpu', () => { divideEqual('cpu'); }); - function modulusEqual(mode) { const gpu = new GPU({ mode }); - const kernel = gpu.createKernel(function() { - let i = 2; - i %= 3; - return i; - }, { output: [1] }); + const kernel = gpu.createKernel( + function () { + let i = 2; + i %= 3; + return i; + }, + { output: [1] } + ); const result = kernel(); let i = 2; i %= 3; @@ -231,11 +248,14 @@ test('modulus equal cpu', () => { function exponentialEqual(mode) { const gpu = new GPU({ mode }); - const kernel = gpu.createKernel(function() { - let i = 2; - i **= 3; - return i; - }, { output: [1] }); + const kernel = gpu.createKernel( + function () { + let i = 2; + i **= 3; + return i; + }, + { output: [1] } + ); const result = kernel(); let i = 2; i **= 3; @@ -259,9 +279,12 @@ test('exponential equal auto', () => { exponentialEqual('webgl2'); }); -(GPU.isHeadlessGLSupported ? test : skip)('exponential equal headlessgl', () => { - exponentialEqual('headlessgl'); -}); +(GPU.isHeadlessGLSupported ? test : skip)( + 'exponential equal headlessgl', + () => { + exponentialEqual('headlessgl'); + } +); test('exponential equal cpu', () => { exponentialEqual('cpu'); diff --git a/test/features/basic-math.js b/test/features/basic-math.js index 828aec5d..c26118bd 100644 --- a/test/features/basic-math.js +++ b/test/features/basic-math.js @@ -1,27 +1,30 @@ const { assert, skip, test, module: describe, only } = require('qunit'); -const { GPU } = require('../../src'); +const { GPU } = require('../..'); describe('features: basic math'); function sumABTest(mode) { const gpu = new GPU({ mode }); - const f = gpu.createKernel(function(a, b) { - return (a[this.thread.x] + b[this.thread.x]); - }, { - output : [6], - mode : mode, - }); + const f = gpu.createKernel( + function (a, b) { + return a[this.thread.x] + b[this.thread.x]; + }, + { + output: [6], + mode: mode, + } + ); - assert.ok( f !== null, 'function generated test'); + assert.ok(f !== null, 'function generated test'); const a = [1, 2, 3, 5, 6, 7]; const b = [4, 5, 6, 1, 2, 3]; - const res = f(a,b); + const res = f(a, b); const exp = [5, 7, 9, 6, 8, 10]; - for(let i = 0; i < exp.length; ++i) { - assert.equal(res[i], exp[i], 'Result arr idx: '+i); + for (let i = 0; i < exp.length; ++i) { + assert.equal(res[i], exp[i], 'Result arr idx: ' + i); } gpu.destroy(); } @@ -50,35 +53,41 @@ test('sumAB cpu', () => { sumABTest('cpu'); }); - function multABTest(mode) { const gpu = new GPU({ mode }); - const f = gpu.createKernel(function(a, b) { - let sum = 0; - sum += a[this.thread.y][0] * b[0][this.thread.x]; - sum += a[this.thread.y][1] * b[1][this.thread.x]; - sum += a[this.thread.y][2] * b[2][this.thread.x]; - return sum; - }, { - output : [3, 3] - }); + const f = gpu.createKernel( + function (a, b) { + let sum = 0; + sum += a[this.thread.y][0] * b[0][this.thread.x]; + sum += a[this.thread.y][1] * b[1][this.thread.x]; + sum += a[this.thread.y][2] * b[2][this.thread.x]; + return sum; + }, + { + output: [3, 3], + } + ); assert.ok(f !== null, 'function generated test'); - assert.deepEqual(f( - [ - [1, 2, 3], - [4, 5, 6], - [7, 8, 9] - ], - [ - [1, 2, 3], - [4, 5, 6], - [7, 8, 9] - ]).map((object) => { return Array.from(object); }), + assert.deepEqual( + f( + [ + [1, 2, 3], + [4, 5, 6], + [7, 8, 9], + ], + [ + [1, 2, 3], + [4, 5, 6], + [7, 8, 9], + ] + ).map(object => { + return Array.from(object); + }), [ [30, 36, 42], [66, 81, 96], - [102, 126, 150] + [102, 126, 150], ], 'basic mult function test' ); @@ -103,4 +112,3 @@ test('multAB gpu', () => { test('multAB cpu', () => { multABTest('cpu'); }); - diff --git a/test/features/bitwise-operators.js b/test/features/bitwise-operators.js index 3d0ac614..07874129 100644 --- a/test/features/bitwise-operators.js +++ b/test/features/bitwise-operators.js @@ -1,13 +1,14 @@ const { assert, skip, test, module: describe, only } = require('qunit'); -const { GPU } = require('../../src'); +const { GPU } = require('../..'); describe('feature: bitwise operators'); function testBitwiseAndSinglePrecision(mode) { const gpu = new GPU({ mode }); - const kernel = gpu.createKernel(function(v1, v2) { - return v1 & v2; - }) + const kernel = gpu + .createKernel(function (v1, v2) { + return v1 & v2; + }) .setOutput([1]) .setPrecision('single'); @@ -20,25 +21,40 @@ function testBitwiseAndSinglePrecision(mode) { gpu.destroy(); } -(GPU.isSinglePrecisionSupported ? test : skip)('bitwise AND single precision auto', () => { - testBitwiseAndSinglePrecision(); -}); +(GPU.isSinglePrecisionSupported ? test : skip)( + 'bitwise AND single precision auto', + () => { + testBitwiseAndSinglePrecision(); + } +); -(GPU.isSinglePrecisionSupported ? test : skip)('bitwise AND single precision gpu', () => { - testBitwiseAndSinglePrecision('gpu'); -}); +(GPU.isSinglePrecisionSupported ? test : skip)( + 'bitwise AND single precision gpu', + () => { + testBitwiseAndSinglePrecision('gpu'); + } +); -(GPU.isWebGLSupported && GPU.isSinglePrecisionSupported ? test : skip)('bitwise AND single precision webgl', () => { - testBitwiseAndSinglePrecision('webgl'); -}); +(GPU.isWebGLSupported && GPU.isSinglePrecisionSupported ? test : skip)( + 'bitwise AND single precision webgl', + () => { + testBitwiseAndSinglePrecision('webgl'); + } +); -(GPU.isWebGL2Supported ? test : skip)('bitwise AND single precision webgl2', () => { - testBitwiseAndSinglePrecision('webgl2'); -}); +(GPU.isWebGL2Supported ? test : skip)( + 'bitwise AND single precision webgl2', + () => { + testBitwiseAndSinglePrecision('webgl2'); + } +); -(GPU.isHeadlessGLSupported && GPU.isSinglePrecisionSupported ? test : skip)('bitwise AND single precision headlessgl', () => { - testBitwiseAndSinglePrecision('headlessgl'); -}); +(GPU.isHeadlessGLSupported && GPU.isSinglePrecisionSupported ? test : skip)( + 'bitwise AND single precision headlessgl', + () => { + testBitwiseAndSinglePrecision('headlessgl'); + } +); test('bitwise AND single precision cpu', () => { testBitwiseAndSinglePrecision('cpu'); @@ -46,9 +62,10 @@ test('bitwise AND single precision cpu', () => { function testBitwiseAndUnsignedPrecision(mode) { const gpu = new GPU({ mode }); - const kernel = gpu.createKernel(function(v1, v2) { - return v1 & v2; - }) + const kernel = gpu + .createKernel(function (v1, v2) { + return v1 & v2; + }) .setOutput([1]) .setPrecision('unsigned'); @@ -69,17 +86,26 @@ test('bitwise AND unsigned precision gpu', () => { testBitwiseAndUnsignedPrecision('gpu'); }); -(GPU.isWebGLSupported ? test : skip)('bitwise AND unsigned precision webgl', () => { - testBitwiseAndUnsignedPrecision('webgl'); -}); +(GPU.isWebGLSupported ? test : skip)( + 'bitwise AND unsigned precision webgl', + () => { + testBitwiseAndUnsignedPrecision('webgl'); + } +); -(GPU.isWebGL2Supported ? test : skip)('bitwise AND unsigned precision webgl2', () => { - testBitwiseAndUnsignedPrecision('webgl2'); -}); +(GPU.isWebGL2Supported ? test : skip)( + 'bitwise AND unsigned precision webgl2', + () => { + testBitwiseAndUnsignedPrecision('webgl2'); + } +); -(GPU.isHeadlessGLSupported ? test : skip)('bitwise AND unsigned precision headlessgl', () => { - testBitwiseAndUnsignedPrecision('headlessgl'); -}); +(GPU.isHeadlessGLSupported ? test : skip)( + 'bitwise AND unsigned precision headlessgl', + () => { + testBitwiseAndUnsignedPrecision('headlessgl'); + } +); test('bitwise AND unsigned precision cpu', () => { testBitwiseAndUnsignedPrecision('cpu'); @@ -87,9 +113,10 @@ test('bitwise AND unsigned precision cpu', () => { function testBitwiseOrSinglePrecision(mode) { const gpu = new GPU({ mode }); - const kernel = gpu.createKernel(function(v1, v2) { - return v1 | v2; - }) + const kernel = gpu + .createKernel(function (v1, v2) { + return v1 | v2; + }) .setOutput([1]) .setPrecision('single'); @@ -102,25 +129,40 @@ function testBitwiseOrSinglePrecision(mode) { gpu.destroy(); } -(GPU.isSinglePrecisionSupported ? test : skip)('bitwise OR single precision auto', () => { - testBitwiseOrSinglePrecision(); -}); +(GPU.isSinglePrecisionSupported ? test : skip)( + 'bitwise OR single precision auto', + () => { + testBitwiseOrSinglePrecision(); + } +); -(GPU.isSinglePrecisionSupported ? test : skip)('bitwise OR single precision gpu', () => { - testBitwiseOrSinglePrecision('gpu'); -}); +(GPU.isSinglePrecisionSupported ? test : skip)( + 'bitwise OR single precision gpu', + () => { + testBitwiseOrSinglePrecision('gpu'); + } +); -(GPU.isWebGLSupported && GPU.isSinglePrecisionSupported ? test : skip)('bitwise OR single precision webgl', () => { - testBitwiseOrSinglePrecision('webgl'); -}); +(GPU.isWebGLSupported && GPU.isSinglePrecisionSupported ? test : skip)( + 'bitwise OR single precision webgl', + () => { + testBitwiseOrSinglePrecision('webgl'); + } +); -(GPU.isWebGL2Supported ? test : skip)('bitwise OR single precision webgl2', () => { - testBitwiseOrSinglePrecision('webgl2'); -}); +(GPU.isWebGL2Supported ? test : skip)( + 'bitwise OR single precision webgl2', + () => { + testBitwiseOrSinglePrecision('webgl2'); + } +); -(GPU.isHeadlessGLSupported && GPU.isSinglePrecisionSupported? test : skip)('bitwise OR single precision headlessgl', () => { - testBitwiseOrSinglePrecision('headlessgl'); -}); +(GPU.isHeadlessGLSupported && GPU.isSinglePrecisionSupported ? test : skip)( + 'bitwise OR single precision headlessgl', + () => { + testBitwiseOrSinglePrecision('headlessgl'); + } +); test('bitwise OR single precision cpu', () => { testBitwiseOrSinglePrecision('cpu'); @@ -128,9 +170,10 @@ test('bitwise OR single precision cpu', () => { function testBitwiseOrUnsignedPrecision(mode) { const gpu = new GPU({ mode }); - const kernel = gpu.createKernel(function(v1, v2) { - return v1 | v2; - }) + const kernel = gpu + .createKernel(function (v1, v2) { + return v1 | v2; + }) .setOutput([1]) .setPrecision('unsigned'); @@ -151,17 +194,26 @@ test('bitwise OR unsigned precision gpu', () => { testBitwiseOrUnsignedPrecision('gpu'); }); -(GPU.isWebGLSupported ? test : skip)('bitwise OR unsigned precision webgl', () => { - testBitwiseOrUnsignedPrecision('webgl'); -}); +(GPU.isWebGLSupported ? test : skip)( + 'bitwise OR unsigned precision webgl', + () => { + testBitwiseOrUnsignedPrecision('webgl'); + } +); -(GPU.isWebGL2Supported ? test : skip)('bitwise OR unsigned precision webgl2', () => { - testBitwiseOrUnsignedPrecision('webgl2'); -}); +(GPU.isWebGL2Supported ? test : skip)( + 'bitwise OR unsigned precision webgl2', + () => { + testBitwiseOrUnsignedPrecision('webgl2'); + } +); -(GPU.isHeadlessGLSupported ? test : skip)('bitwise OR unsigned precision headlessgl', () => { - testBitwiseOrUnsignedPrecision('headlessgl'); -}); +(GPU.isHeadlessGLSupported ? test : skip)( + 'bitwise OR unsigned precision headlessgl', + () => { + testBitwiseOrUnsignedPrecision('headlessgl'); + } +); test('bitwise OR unsigned precision cpu', () => { testBitwiseOrUnsignedPrecision('cpu'); @@ -169,9 +221,10 @@ test('bitwise OR unsigned precision cpu', () => { function testBitwiseXORSinglePrecision(mode) { const gpu = new GPU({ mode }); - const kernel = gpu.createKernel(function(v1, v2) { - return v1 ^ v2; - }) + const kernel = gpu + .createKernel(function (v1, v2) { + return v1 ^ v2; + }) .setOutput([1]) .setPrecision('single'); @@ -184,25 +237,40 @@ function testBitwiseXORSinglePrecision(mode) { gpu.destroy(); } -(GPU.isSinglePrecisionSupported ? test : skip)('bitwise XOR single precision auto', () => { - testBitwiseXORSinglePrecision(); -}); +(GPU.isSinglePrecisionSupported ? test : skip)( + 'bitwise XOR single precision auto', + () => { + testBitwiseXORSinglePrecision(); + } +); -(GPU.isSinglePrecisionSupported ? test : skip)('bitwise XOR single precision gpu', () => { - testBitwiseXORSinglePrecision('gpu'); -}); +(GPU.isSinglePrecisionSupported ? test : skip)( + 'bitwise XOR single precision gpu', + () => { + testBitwiseXORSinglePrecision('gpu'); + } +); -(GPU.isWebGLSupported && GPU.isSinglePrecisionSupported ? test : skip)('bitwise XOR single precision webgl', () => { - testBitwiseXORSinglePrecision('webgl'); -}); +(GPU.isWebGLSupported && GPU.isSinglePrecisionSupported ? test : skip)( + 'bitwise XOR single precision webgl', + () => { + testBitwiseXORSinglePrecision('webgl'); + } +); -(GPU.isWebGL2Supported ? test : skip)('bitwise XOR single precision webgl2', () => { - testBitwiseXORSinglePrecision('webgl2'); -}); +(GPU.isWebGL2Supported ? test : skip)( + 'bitwise XOR single precision webgl2', + () => { + testBitwiseXORSinglePrecision('webgl2'); + } +); -(GPU.isHeadlessGLSupported && GPU.isSinglePrecisionSupported ? test : skip)('bitwise XOR single precision headlessgl', () => { - testBitwiseXORSinglePrecision('headlessgl'); -}); +(GPU.isHeadlessGLSupported && GPU.isSinglePrecisionSupported ? test : skip)( + 'bitwise XOR single precision headlessgl', + () => { + testBitwiseXORSinglePrecision('headlessgl'); + } +); test('bitwise XOR single precision cpu', () => { testBitwiseXORSinglePrecision('cpu'); @@ -210,9 +278,10 @@ test('bitwise XOR single precision cpu', () => { function testBitwiseXORUnsignedPrecision(mode) { const gpu = new GPU({ mode }); - const kernel = gpu.createKernel(function(v1, v2) { - return v1 ^ v2; - }) + const kernel = gpu + .createKernel(function (v1, v2) { + return v1 ^ v2; + }) .setOutput([1]) .setPrecision('unsigned'); @@ -233,17 +302,26 @@ test('bitwise XOR unsigned precision gpu', () => { testBitwiseXORUnsignedPrecision('gpu'); }); -(GPU.isWebGLSupported ? test : skip)('bitwise XOR unsigned precision webgl', () => { - testBitwiseXORUnsignedPrecision('webgl'); -}); +(GPU.isWebGLSupported ? test : skip)( + 'bitwise XOR unsigned precision webgl', + () => { + testBitwiseXORUnsignedPrecision('webgl'); + } +); -(GPU.isWebGL2Supported ? test : skip)('bitwise XOR unsigned precision webgl2', () => { - testBitwiseXORUnsignedPrecision('webgl2'); -}); +(GPU.isWebGL2Supported ? test : skip)( + 'bitwise XOR unsigned precision webgl2', + () => { + testBitwiseXORUnsignedPrecision('webgl2'); + } +); -(GPU.isHeadlessGLSupported ? test : skip)('bitwise XOR unsigned precision headlessgl', () => { - testBitwiseXORUnsignedPrecision('headlessgl'); -}); +(GPU.isHeadlessGLSupported ? test : skip)( + 'bitwise XOR unsigned precision headlessgl', + () => { + testBitwiseXORUnsignedPrecision('headlessgl'); + } +); test('bitwise XOR unsigned precision cpu', () => { testBitwiseXORUnsignedPrecision('cpu'); @@ -251,9 +329,10 @@ test('bitwise XOR unsigned precision cpu', () => { function testBitwiseNotSinglePrecision(mode) { const gpu = new GPU({ mode }); - const kernel = gpu.createKernel(function(v1) { - return ~v1; - }) + const kernel = gpu + .createKernel(function (v1) { + return ~v1; + }) .setOutput([1]) .setPrecision('single'); @@ -264,25 +343,40 @@ function testBitwiseNotSinglePrecision(mode) { gpu.destroy(); } -(GPU.isSinglePrecisionSupported ? test : skip)('bitwise NOT single precision auto', () => { - testBitwiseNotSinglePrecision(); -}); +(GPU.isSinglePrecisionSupported ? test : skip)( + 'bitwise NOT single precision auto', + () => { + testBitwiseNotSinglePrecision(); + } +); -(GPU.isSinglePrecisionSupported ? test : skip)('bitwise NOT single precision gpu', () => { - testBitwiseNotSinglePrecision('gpu'); -}); +(GPU.isSinglePrecisionSupported ? test : skip)( + 'bitwise NOT single precision gpu', + () => { + testBitwiseNotSinglePrecision('gpu'); + } +); -(GPU.isWebGLSupported && GPU.isSinglePrecisionSupported ? test : skip)('bitwise NOT single precision webgl', () => { - testBitwiseNotSinglePrecision('webgl'); -}); +(GPU.isWebGLSupported && GPU.isSinglePrecisionSupported ? test : skip)( + 'bitwise NOT single precision webgl', + () => { + testBitwiseNotSinglePrecision('webgl'); + } +); -(GPU.isWebGL2Supported ? test : skip)('bitwise NOT single precision webgl2', () => { - testBitwiseNotSinglePrecision('webgl2'); -}); +(GPU.isWebGL2Supported ? test : skip)( + 'bitwise NOT single precision webgl2', + () => { + testBitwiseNotSinglePrecision('webgl2'); + } +); -(GPU.isHeadlessGLSupported && GPU.isSinglePrecisionSupported ? test : skip)('bitwise NOT single precision headlessgl', () => { - testBitwiseNotSinglePrecision('headlessgl'); -}); +(GPU.isHeadlessGLSupported && GPU.isSinglePrecisionSupported ? test : skip)( + 'bitwise NOT single precision headlessgl', + () => { + testBitwiseNotSinglePrecision('headlessgl'); + } +); test('bitwise NOT single precision cpu', () => { testBitwiseNotSinglePrecision('cpu'); @@ -290,9 +384,10 @@ test('bitwise NOT single precision cpu', () => { function testBitwiseNotUnsignedPrecision(mode) { const gpu = new GPU({ mode }); - const kernel = gpu.createKernel(function(v1) { - return ~v1; - }) + const kernel = gpu + .createKernel(function (v1) { + return ~v1; + }) .setOutput([1]) .setPrecision('unsigned'); @@ -311,17 +406,26 @@ test('bitwise NOT unsigned precision gpu', () => { testBitwiseNotUnsignedPrecision('gpu'); }); -(GPU.isWebGLSupported ? test : skip)('bitwise NOT unsigned precision webgl', () => { - testBitwiseNotUnsignedPrecision('webgl'); -}); +(GPU.isWebGLSupported ? test : skip)( + 'bitwise NOT unsigned precision webgl', + () => { + testBitwiseNotUnsignedPrecision('webgl'); + } +); -(GPU.isWebGL2Supported ? test : skip)('bitwise NOT unsigned precision webgl2', () => { - testBitwiseNotUnsignedPrecision('webgl2'); -}); +(GPU.isWebGL2Supported ? test : skip)( + 'bitwise NOT unsigned precision webgl2', + () => { + testBitwiseNotUnsignedPrecision('webgl2'); + } +); -(GPU.isHeadlessGLSupported ? test : skip)('bitwise NOT unsigned precision headlessgl', () => { - testBitwiseNotUnsignedPrecision('headlessgl'); -}); +(GPU.isHeadlessGLSupported ? test : skip)( + 'bitwise NOT unsigned precision headlessgl', + () => { + testBitwiseNotUnsignedPrecision('headlessgl'); + } +); test('bitwise NOT unsigned precision cpu', () => { testBitwiseNotUnsignedPrecision('cpu'); @@ -329,9 +433,10 @@ test('bitwise NOT unsigned precision cpu', () => { function testBitwiseZeroFillLeftShiftSinglePrecision(mode) { const gpu = new GPU({ mode }); - const kernel = gpu.createKernel(function(v1, v2) { - return v1 << v2; - }) + const kernel = gpu + .createKernel(function (v1, v2) { + return v1 << v2; + }) .setOutput([1]) .setPrecision('single'); @@ -344,25 +449,40 @@ function testBitwiseZeroFillLeftShiftSinglePrecision(mode) { gpu.destroy(); } -(GPU.isSinglePrecisionSupported ? test : skip)('bitwise zero fill left shift single precision auto', () => { - testBitwiseZeroFillLeftShiftSinglePrecision(); -}); +(GPU.isSinglePrecisionSupported ? test : skip)( + 'bitwise zero fill left shift single precision auto', + () => { + testBitwiseZeroFillLeftShiftSinglePrecision(); + } +); -(GPU.isSinglePrecisionSupported ? test : skip)('bitwise zero fill left shift single precision gpu', () => { - testBitwiseZeroFillLeftShiftSinglePrecision('gpu'); -}); +(GPU.isSinglePrecisionSupported ? test : skip)( + 'bitwise zero fill left shift single precision gpu', + () => { + testBitwiseZeroFillLeftShiftSinglePrecision('gpu'); + } +); -(GPU.isWebGLSupported && GPU.isSinglePrecisionSupported ? test : skip)('bitwise zero fill left shift single precision webgl', () => { - testBitwiseZeroFillLeftShiftSinglePrecision('webgl'); -}); +(GPU.isWebGLSupported && GPU.isSinglePrecisionSupported ? test : skip)( + 'bitwise zero fill left shift single precision webgl', + () => { + testBitwiseZeroFillLeftShiftSinglePrecision('webgl'); + } +); -(GPU.isWebGL2Supported ? test : skip)('bitwise zero fill left shift single precision webgl2', () => { - testBitwiseZeroFillLeftShiftSinglePrecision('webgl2'); -}); +(GPU.isWebGL2Supported ? test : skip)( + 'bitwise zero fill left shift single precision webgl2', + () => { + testBitwiseZeroFillLeftShiftSinglePrecision('webgl2'); + } +); -(GPU.isHeadlessGLSupported && GPU.isSinglePrecisionSupported ? test : skip)('bitwise zero fill left shift single precision headlessgl', () => { - testBitwiseZeroFillLeftShiftSinglePrecision('headlessgl'); -}); +(GPU.isHeadlessGLSupported && GPU.isSinglePrecisionSupported ? test : skip)( + 'bitwise zero fill left shift single precision headlessgl', + () => { + testBitwiseZeroFillLeftShiftSinglePrecision('headlessgl'); + } +); test('bitwise zero fill left shift single precision cpu', () => { testBitwiseZeroFillLeftShiftSinglePrecision('cpu'); @@ -370,9 +490,10 @@ test('bitwise zero fill left shift single precision cpu', () => { function testBitwiseZeroFillLeftShiftUnsignedPrecision(mode) { const gpu = new GPU({ mode }); - const kernel = gpu.createKernel(function(v1, v2) { - return v1 << v2; - }) + const kernel = gpu + .createKernel(function (v1, v2) { + return v1 << v2; + }) .setOutput([1]) .setPrecision('unsigned'); @@ -393,17 +514,26 @@ test('bitwise zero fill left shift unsigned precision gpu', () => { testBitwiseZeroFillLeftShiftUnsignedPrecision('gpu'); }); -(GPU.isWebGLSupported ? test : skip)('bitwise zero fill left shift unsigned precision webgl', () => { - testBitwiseZeroFillLeftShiftUnsignedPrecision('webgl'); -}); +(GPU.isWebGLSupported ? test : skip)( + 'bitwise zero fill left shift unsigned precision webgl', + () => { + testBitwiseZeroFillLeftShiftUnsignedPrecision('webgl'); + } +); -(GPU.isWebGL2Supported ? test : skip)('bitwise zero fill left shift unsigned precision webgl2', () => { - testBitwiseZeroFillLeftShiftUnsignedPrecision('webgl2'); -}); +(GPU.isWebGL2Supported ? test : skip)( + 'bitwise zero fill left shift unsigned precision webgl2', + () => { + testBitwiseZeroFillLeftShiftUnsignedPrecision('webgl2'); + } +); -(GPU.isHeadlessGLSupported ? test : skip)('bitwise zero fill left shift unsigned precision headlessgl', () => { - testBitwiseZeroFillLeftShiftUnsignedPrecision('headlessgl'); -}); +(GPU.isHeadlessGLSupported ? test : skip)( + 'bitwise zero fill left shift unsigned precision headlessgl', + () => { + testBitwiseZeroFillLeftShiftUnsignedPrecision('headlessgl'); + } +); test('bitwise zero fill left shift unsigned precision cpu', () => { testBitwiseZeroFillLeftShiftUnsignedPrecision('cpu'); @@ -411,9 +541,10 @@ test('bitwise zero fill left shift unsigned precision cpu', () => { function testBitwiseSignedRightShiftSinglePrecision(mode) { const gpu = new GPU({ mode }); - const kernel = gpu.createKernel(function(v1, v2) { - return v1 >> v2; - }) + const kernel = gpu + .createKernel(function (v1, v2) { + return v1 >> v2; + }) .setOutput([1]) .setPrecision('single'); @@ -426,25 +557,40 @@ function testBitwiseSignedRightShiftSinglePrecision(mode) { gpu.destroy(); } -(GPU.isSinglePrecisionSupported ? test : skip)('bitwise signed fill right shift single precision auto', () => { - testBitwiseSignedRightShiftSinglePrecision(); -}); +(GPU.isSinglePrecisionSupported ? test : skip)( + 'bitwise signed fill right shift single precision auto', + () => { + testBitwiseSignedRightShiftSinglePrecision(); + } +); -(GPU.isSinglePrecisionSupported ? test : skip)('bitwise signed fill right shift single precision gpu', () => { - testBitwiseSignedRightShiftSinglePrecision('gpu'); -}); +(GPU.isSinglePrecisionSupported ? test : skip)( + 'bitwise signed fill right shift single precision gpu', + () => { + testBitwiseSignedRightShiftSinglePrecision('gpu'); + } +); -(GPU.isWebGLSupported && GPU.isSinglePrecisionSupported ? test : skip)('bitwise signed fill right shift single precision webgl', () => { - testBitwiseSignedRightShiftSinglePrecision('webgl'); -}); +(GPU.isWebGLSupported && GPU.isSinglePrecisionSupported ? test : skip)( + 'bitwise signed fill right shift single precision webgl', + () => { + testBitwiseSignedRightShiftSinglePrecision('webgl'); + } +); -(GPU.isWebGL2Supported ? test : skip)('bitwise signed fill right shift single precision webgl2', () => { - testBitwiseSignedRightShiftSinglePrecision('webgl2'); -}); +(GPU.isWebGL2Supported ? test : skip)( + 'bitwise signed fill right shift single precision webgl2', + () => { + testBitwiseSignedRightShiftSinglePrecision('webgl2'); + } +); -(GPU.isHeadlessGLSupported && GPU.isSinglePrecisionSupported ? test : skip)('bitwise signed fill right shift single precision headlessgl', () => { - testBitwiseSignedRightShiftSinglePrecision('headlessgl'); -}); +(GPU.isHeadlessGLSupported && GPU.isSinglePrecisionSupported ? test : skip)( + 'bitwise signed fill right shift single precision headlessgl', + () => { + testBitwiseSignedRightShiftSinglePrecision('headlessgl'); + } +); test('bitwise signed fill right shift single precision cpu', () => { testBitwiseSignedRightShiftSinglePrecision('cpu'); @@ -452,9 +598,10 @@ test('bitwise signed fill right shift single precision cpu', () => { function testBitwiseSignedRightShiftUnsignedPrecision(mode) { const gpu = new GPU({ mode }); - const kernel = gpu.createKernel(function(v1, v2) { - return v1 >> v2; - }) + const kernel = gpu + .createKernel(function (v1, v2) { + return v1 >> v2; + }) .setOutput([1]) .setPrecision('unsigned'); @@ -475,17 +622,26 @@ test('bitwise signed fill right shift unsigned precision gpu', () => { testBitwiseSignedRightShiftUnsignedPrecision('gpu'); }); -(GPU.isWebGLSupported ? test : skip)('bitwise signed fill right shift unsigned precision webgl', () => { - testBitwiseSignedRightShiftUnsignedPrecision('webgl'); -}); +(GPU.isWebGLSupported ? test : skip)( + 'bitwise signed fill right shift unsigned precision webgl', + () => { + testBitwiseSignedRightShiftUnsignedPrecision('webgl'); + } +); -(GPU.isWebGL2Supported ? test : skip)('bitwise signed fill right shift unsigned precision webgl2', () => { - testBitwiseSignedRightShiftUnsignedPrecision('webgl2'); -}); +(GPU.isWebGL2Supported ? test : skip)( + 'bitwise signed fill right shift unsigned precision webgl2', + () => { + testBitwiseSignedRightShiftUnsignedPrecision('webgl2'); + } +); -(GPU.isHeadlessGLSupported ? test : skip)('bitwise signed fill right shift unsigned precision headlessgl', () => { - testBitwiseSignedRightShiftUnsignedPrecision('headlessgl'); -}); +(GPU.isHeadlessGLSupported ? test : skip)( + 'bitwise signed fill right shift unsigned precision headlessgl', + () => { + testBitwiseSignedRightShiftUnsignedPrecision('headlessgl'); + } +); test('bitwise signed fill right shift unsigned precision cpu', () => { testBitwiseSignedRightShiftUnsignedPrecision('cpu'); @@ -493,9 +649,10 @@ test('bitwise signed fill right shift unsigned precision cpu', () => { function testBitwiseZeroFillRightShiftSinglePrecision(mode) { const gpu = new GPU({ mode }); - const kernel = gpu.createKernel(function(v1, v2) { - return v1 >>> v2; - }) + const kernel = gpu + .createKernel(function (v1, v2) { + return v1 >>> v2; + }) .setOutput([1]) .setPrecision('single'); @@ -508,25 +665,40 @@ function testBitwiseZeroFillRightShiftSinglePrecision(mode) { gpu.destroy(); } -(GPU.isSinglePrecisionSupported ? test : skip)('bitwise zero fill right shift single precision auto', () => { - testBitwiseZeroFillRightShiftSinglePrecision(); -}); +(GPU.isSinglePrecisionSupported ? test : skip)( + 'bitwise zero fill right shift single precision auto', + () => { + testBitwiseZeroFillRightShiftSinglePrecision(); + } +); -(GPU.isSinglePrecisionSupported ? test : skip)('bitwise zero fill right shift single precision gpu', () => { - testBitwiseZeroFillRightShiftSinglePrecision('gpu'); -}); +(GPU.isSinglePrecisionSupported ? test : skip)( + 'bitwise zero fill right shift single precision gpu', + () => { + testBitwiseZeroFillRightShiftSinglePrecision('gpu'); + } +); -(GPU.isWebGLSupported && GPU.isSinglePrecisionSupported ? test : skip)('bitwise zero fill right shift single precision webgl', () => { - testBitwiseZeroFillRightShiftSinglePrecision('webgl'); -}); +(GPU.isWebGLSupported && GPU.isSinglePrecisionSupported ? test : skip)( + 'bitwise zero fill right shift single precision webgl', + () => { + testBitwiseZeroFillRightShiftSinglePrecision('webgl'); + } +); -(GPU.isWebGL2Supported ? test : skip)('bitwise zero fill right shift single precision webgl2', () => { - testBitwiseZeroFillRightShiftSinglePrecision('webgl2'); -}); +(GPU.isWebGL2Supported ? test : skip)( + 'bitwise zero fill right shift single precision webgl2', + () => { + testBitwiseZeroFillRightShiftSinglePrecision('webgl2'); + } +); -(GPU.isHeadlessGLSupported && GPU.isSinglePrecisionSupported ? test : skip)('bitwise zero fill right shift single precision headlessgl', () => { - testBitwiseZeroFillRightShiftSinglePrecision('headlessgl'); -}); +(GPU.isHeadlessGLSupported && GPU.isSinglePrecisionSupported ? test : skip)( + 'bitwise zero fill right shift single precision headlessgl', + () => { + testBitwiseZeroFillRightShiftSinglePrecision('headlessgl'); + } +); test('bitwise zero fill right shift single precision cpu', () => { testBitwiseZeroFillRightShiftSinglePrecision('cpu'); @@ -534,9 +706,10 @@ test('bitwise zero fill right shift single precision cpu', () => { function testBitwiseZeroFillRightShiftUnsignedPrecision(mode) { const gpu = new GPU({ mode }); - const kernel = gpu.createKernel(function(v1, v2) { - return v1 >>> v2; - }) + const kernel = gpu + .createKernel(function (v1, v2) { + return v1 >>> v2; + }) .setOutput([1]) .setPrecision('unsigned'); @@ -557,17 +730,26 @@ test('bitwise zero fill right shift unsigned precision gpu', () => { testBitwiseZeroFillRightShiftUnsignedPrecision('gpu'); }); -(GPU.isWebGLSupported ? test : skip)('bitwise zero fill right shift unsigned precision webgl', () => { - testBitwiseZeroFillRightShiftUnsignedPrecision('webgl'); -}); +(GPU.isWebGLSupported ? test : skip)( + 'bitwise zero fill right shift unsigned precision webgl', + () => { + testBitwiseZeroFillRightShiftUnsignedPrecision('webgl'); + } +); -(GPU.isWebGL2Supported ? test : skip)('bitwise zero fill right shift unsigned precision webgl2', () => { - testBitwiseZeroFillRightShiftUnsignedPrecision('webgl2'); -}); +(GPU.isWebGL2Supported ? test : skip)( + 'bitwise zero fill right shift unsigned precision webgl2', + () => { + testBitwiseZeroFillRightShiftUnsignedPrecision('webgl2'); + } +); -(GPU.isHeadlessGLSupported ? test : skip)('bitwise zero fill right shift unsigned precision headlessgl', () => { - testBitwiseZeroFillRightShiftUnsignedPrecision('headlessgl'); -}); +(GPU.isHeadlessGLSupported ? test : skip)( + 'bitwise zero fill right shift unsigned precision headlessgl', + () => { + testBitwiseZeroFillRightShiftUnsignedPrecision('headlessgl'); + } +); test('bitwise zero fill right shift unsigned precision cpu', () => { testBitwiseZeroFillRightShiftUnsignedPrecision('cpu'); diff --git a/test/features/boolean-from-expression.js b/test/features/boolean-from-expression.js index 7e2560f5..15c49616 100644 --- a/test/features/boolean-from-expression.js +++ b/test/features/boolean-from-expression.js @@ -1,14 +1,17 @@ const { assert, skip, test, module: describe, only } = require('qunit'); -const { GPU } = require('../../src'); +const { GPU } = require('../..'); describe('feature: bitwise operators'); function testBooleanFromExpression(mode) { const gpu = new GPU({ mode }); - const kernel = gpu.createKernel(function() { - const result = 1 === 1 && 2 === 2; - return result ? 1 : 0; - }, { output: [1] }); + const kernel = gpu.createKernel( + function () { + const result = 1 === 1 && 2 === 2; + return result ? 1 : 0; + }, + { output: [1] } + ); assert.equal(kernel()[0], 1); gpu.destroy(); } @@ -35,4 +38,4 @@ test('gpu', () => { test('cpu', () => { testBooleanFromExpression('cpu'); -}); \ No newline at end of file +}); diff --git a/test/features/canvas.js b/test/features/canvas.js index e0f26661..3f0f41b4 100644 --- a/test/features/canvas.js +++ b/test/features/canvas.js @@ -1,17 +1,21 @@ const { assert, skip, test, module: describe } = require('qunit'); -const { GPU } = require('../../src'); +const { GPU } = require('../..'); const { greenCanvas } = require('../browser-test-utils'); describe('features: canvas argument'); + function canvasArgumentTest(mode) { const gpu = new GPU({ mode }); const canvas = greenCanvas(mode, 1, 1); - const kernel = gpu.createKernel(function(canvas) { - const pixel = canvas[this.thread.y][this.thread.x]; - return pixel[1]; - }, { - output : [canvas.width, canvas.height] - }); + const kernel = gpu.createKernel( + function (canvas) { + const pixel = canvas[this.thread.y][this.thread.x]; + return pixel[1]; + }, + { + output: [canvas.width, canvas.height], + } + ); const result = kernel(canvas); assert.equal(result[0][0], 1); gpu.destroy(); @@ -25,11 +29,15 @@ function canvasArgumentTest(mode) { canvasArgumentTest('gpu'); }); -(GPU.isWebGLSupported && typeof HTMLCanvasElement !== 'undefined' ? test : skip)('webgl', () => { +(GPU.isWebGLSupported && typeof HTMLCanvasElement !== 'undefined' + ? test + : skip)('webgl', () => { canvasArgumentTest('webgl'); }); -(GPU.isWebGL2Supported && typeof HTMLCanvasElement !== 'undefined' ? test : skip)('webgl2', () => { +(GPU.isWebGL2Supported && typeof HTMLCanvasElement !== 'undefined' + ? test + : skip)('webgl2', () => { canvasArgumentTest('webgl2'); }); @@ -40,34 +48,50 @@ function canvasArgumentTest(mode) { function canvasManuallyDefinedArgumentTest(mode) { const gpu = new GPU({ mode }); const canvas = greenCanvas(mode, 1, 1); - const kernel = gpu.createKernel(function(canvas) { - const pixel = canvas[this.thread.y][this.thread.x]; - return pixel[1]; - }, { - output : [canvas.width, canvas.height], - argumentTypes: { canvas: 'HTMLCanvas' } - }); + const kernel = gpu.createKernel( + function (canvas) { + const pixel = canvas[this.thread.y][this.thread.x]; + return pixel[1]; + }, + { + output: [canvas.width, canvas.height], + argumentTypes: { canvas: 'HTMLCanvas' }, + } + ); const result = kernel(canvas); assert.equal(result[0][0], 1); gpu.destroy(); } -(typeof HTMLCanvasElement !== 'undefined' ? test : skip)('manually defined auto', () => { - canvasManuallyDefinedArgumentTest(); -}); +(typeof HTMLCanvasElement !== 'undefined' ? test : skip)( + 'manually defined auto', + () => { + canvasManuallyDefinedArgumentTest(); + } +); -(typeof HTMLCanvasElement !== 'undefined' ? test : skip)('manually defined gpu', () => { - canvasManuallyDefinedArgumentTest('gpu'); -}); +(typeof HTMLCanvasElement !== 'undefined' ? test : skip)( + 'manually defined gpu', + () => { + canvasManuallyDefinedArgumentTest('gpu'); + } +); -(GPU.isWebGLSupported && typeof HTMLCanvasElement !== 'undefined' ? test : skip)('manually defined webgl', () => { +(GPU.isWebGLSupported && typeof HTMLCanvasElement !== 'undefined' + ? test + : skip)('manually defined webgl', () => { canvasManuallyDefinedArgumentTest('webgl'); }); -(GPU.isWebGL2Supported && typeof HTMLCanvasElement !== 'undefined' ? test : skip)('manually defined webgl2', () => { +(GPU.isWebGL2Supported && typeof HTMLCanvasElement !== 'undefined' + ? test + : skip)('manually defined webgl2', () => { canvasManuallyDefinedArgumentTest('webgl2'); }); -(typeof HTMLCanvasElement !== 'undefined' ? test : skip)('manually defined cpu', () => { - canvasManuallyDefinedArgumentTest('cpu'); -}); \ No newline at end of file +(typeof HTMLCanvasElement !== 'undefined' ? test : skip)( + 'manually defined cpu', + () => { + canvasManuallyDefinedArgumentTest('cpu'); + } +); diff --git a/test/features/clear-textures.js b/test/features/clear-textures.js index 0ca3db60..e1ec9c26 100644 --- a/test/features/clear-textures.js +++ b/test/features/clear-textures.js @@ -1,25 +1,29 @@ const { assert, skip, test, module: describe, only } = require('qunit'); -const { GPU } = require('../../src'); +const { GPU } = require('../..'); describe('features: clear textures'); function clearTexture(precision, mode) { const gpu = new GPU({ mode }); + function makeTexture() { - return (gpu.createKernel(function() { - return this.thread.x; - }, { - output: [5], - pipeline: true, - precision - }))(); + return gpu.createKernel( + function () { + return this.thread.x; + }, + { + output: [5], + pipeline: true, + precision, + } + )(); } const texture = makeTexture(); - assert.deepEqual(texture.toArray(), new Float32Array([0,1,2,3,4])); + assert.deepEqual(texture.toArray(), new Float32Array([0, 1, 2, 3, 4])); texture.clear(); const texture2 = makeTexture(); // put another texture in the way - assert.deepEqual(texture.toArray(), new Float32Array([0,0,0,0,0])); - assert.deepEqual(texture2.toArray(), new Float32Array([0,1,2,3,4])); + assert.deepEqual(texture.toArray(), new Float32Array([0, 0, 0, 0, 0])); + assert.deepEqual(texture2.toArray(), new Float32Array([0, 1, 2, 3, 4])); gpu.destroy(); } @@ -35,32 +39,46 @@ test('unsigned precision auto', () => { clearTexture('unsigned', 'webgl2'); }); -(GPU.isHeadlessGLSupported ? test : skip)('unsigned precision headlessgl', () => { - clearTexture('unsigned', 'headlessgl'); -}); +(GPU.isHeadlessGLSupported ? test : skip)( + 'unsigned precision headlessgl', + () => { + clearTexture('unsigned', 'headlessgl'); + } +); (GPU.isSinglePrecisionSupported ? test : skip)('single precision auto', () => { clearTexture('single'); }); -(GPU.isSinglePrecisionSupported && GPU.isWebGLSupported ? test : skip)('single precision webgl', () => { - clearTexture('single', 'webgl'); -}); - -(GPU.isSinglePrecisionSupported && GPU.isWebGL2Supported ? test : skip)('single precision webgl2', () => { - clearTexture('single', 'webgl2'); -}); +(GPU.isSinglePrecisionSupported && GPU.isWebGLSupported ? test : skip)( + 'single precision webgl', + () => { + clearTexture('single', 'webgl'); + } +); -(GPU.isSinglePrecisionSupported && GPU.isHeadlessGLSupported ? test : skip)('single precision headlessgl', () => { - clearTexture('single', 'headlessgl'); -}); +(GPU.isSinglePrecisionSupported && GPU.isWebGL2Supported ? test : skip)( + 'single precision webgl2', + () => { + clearTexture('single', 'webgl2'); + } +); +(GPU.isSinglePrecisionSupported && GPU.isHeadlessGLSupported ? test : skip)( + 'single precision headlessgl', + () => { + clearTexture('single', 'headlessgl'); + } +); function clearClonedTexture(mode) { const gpu = new GPU({ mode }); - const kernel = gpu.createKernel(function() { - return 1; - }, { output: [1], pipeline: true, immutable: true }); + const kernel = gpu.createKernel( + function () { + return 1; + }, + { output: [1], pipeline: true, immutable: true } + ); const result = kernel(); assert.equal(result.toArray()[0], 1); const result2 = result.clone(); @@ -89,6 +107,9 @@ test('clear cloned texture gpu', () => { clearClonedTexture('webgl2'); }); -(GPU.isHeadlessGLSupported ? test : skip)('clear cloned texture headlessgl', () => { - clearClonedTexture('headlessgl'); -}); \ No newline at end of file +(GPU.isHeadlessGLSupported ? test : skip)( + 'clear cloned texture headlessgl', + () => { + clearClonedTexture('headlessgl'); + } +); diff --git a/test/features/clone-textures.js b/test/features/clone-textures.js index db5d3c8c..60aa56ab 100644 --- a/test/features/clone-textures.js +++ b/test/features/clone-textures.js @@ -1,18 +1,22 @@ const { assert, skip, test, module: describe, only } = require('qunit'); -const { GPU } = require('../../src'); +const { GPU } = require('../..'); describe('features: clone textures'); function copy1DTexture(precision, mode) { const gpu = new GPU({ mode }); + function makeTexture() { - return (gpu.createKernel(function() { - return this.thread.x; - }, { - output: [5], - pipeline: true, - precision - }))(); + return gpu.createKernel( + function () { + return this.thread.x; + }, + { + output: [5], + pipeline: true, + precision, + } + )(); } const texture = makeTexture(); const clone = texture.clone(); @@ -34,36 +38,55 @@ test('1D unsigned precision auto', () => { copy1DTexture('unsigned', 'webgl2'); }); -(GPU.isHeadlessGLSupported ? test : skip)('1D unsigned precision headlessgl', () => { - copy1DTexture('unsigned', 'headlessgl'); -}); +(GPU.isHeadlessGLSupported ? test : skip)( + '1D unsigned precision headlessgl', + () => { + copy1DTexture('unsigned', 'headlessgl'); + } +); -(GPU.isSinglePrecisionSupported ? test : skip)('1D single precision auto', () => { - copy1DTexture('single'); -}); +(GPU.isSinglePrecisionSupported ? test : skip)( + '1D single precision auto', + () => { + copy1DTexture('single'); + } +); -(GPU.isSinglePrecisionSupported && GPU.isWebGLSupported ? test : skip)('1D single precision webgl', () => { - copy1DTexture('single', 'webgl'); -}); +(GPU.isSinglePrecisionSupported && GPU.isWebGLSupported ? test : skip)( + '1D single precision webgl', + () => { + copy1DTexture('single', 'webgl'); + } +); -(GPU.isSinglePrecisionSupported && GPU.isWebGL2Supported ? test : skip)('1D single precision webgl2', () => { - copy1DTexture('single', 'webgl2'); -}); +(GPU.isSinglePrecisionSupported && GPU.isWebGL2Supported ? test : skip)( + '1D single precision webgl2', + () => { + copy1DTexture('single', 'webgl2'); + } +); -(GPU.isSinglePrecisionSupported && GPU.isHeadlessGLSupported ? test : skip)('1D single precision headlessgl', () => { - copy1DTexture('single', 'headlessgl'); -}); +(GPU.isSinglePrecisionSupported && GPU.isHeadlessGLSupported ? test : skip)( + '1D single precision headlessgl', + () => { + copy1DTexture('single', 'headlessgl'); + } +); function copy2DTexture(precision, mode) { const gpu = new GPU({ mode }); + function makeTexture() { - return (gpu.createKernel(function() { - return this.thread.x + (this.thread.y * this.output.x); - }, { - output: [5, 5], - pipeline: true, - precision - }))(); + return gpu.createKernel( + function () { + return this.thread.x + this.thread.y * this.output.x; + }, + { + output: [5, 5], + pipeline: true, + precision, + } + )(); } const texture = makeTexture(); const clone = texture.clone(); @@ -85,36 +108,60 @@ test('2D unsigned precision auto', () => { copy2DTexture('unsigned', 'webgl2'); }); -(GPU.isHeadlessGLSupported ? test : skip)('2D unsigned precision headlessgl', () => { - copy2DTexture('unsigned', 'headlessgl'); -}); +(GPU.isHeadlessGLSupported ? test : skip)( + '2D unsigned precision headlessgl', + () => { + copy2DTexture('unsigned', 'headlessgl'); + } +); -(GPU.isSinglePrecisionSupported ? test : skip)('2D single precision auto', () => { - copy2DTexture('single'); -}); +(GPU.isSinglePrecisionSupported ? test : skip)( + '2D single precision auto', + () => { + copy2DTexture('single'); + } +); -(GPU.isSinglePrecisionSupported && GPU.isWebGLSupported ? test : skip)('2D single precision webgl', () => { - copy2DTexture('single', 'webgl'); -}); +(GPU.isSinglePrecisionSupported && GPU.isWebGLSupported ? test : skip)( + '2D single precision webgl', + () => { + copy2DTexture('single', 'webgl'); + } +); -(GPU.isSinglePrecisionSupported && GPU.isWebGL2Supported ? test : skip)('2D single precision webgl2', () => { - copy2DTexture('single', 'webgl2'); -}); +(GPU.isSinglePrecisionSupported && GPU.isWebGL2Supported ? test : skip)( + '2D single precision webgl2', + () => { + copy2DTexture('single', 'webgl2'); + } +); -(GPU.isSinglePrecisionSupported && GPU.isHeadlessGLSupported ? test : skip)('2D single precision headlessgl', () => { - copy2DTexture('single', 'headlessgl'); -}); +(GPU.isSinglePrecisionSupported && GPU.isHeadlessGLSupported ? test : skip)( + '2D single precision headlessgl', + () => { + copy2DTexture('single', 'headlessgl'); + } +); function copy3DTexture(precision, mode) { const gpu = new GPU({ mode }); + function makeTexture() { - return (gpu.createKernel(function() { - return this.thread.x + (this.thread.y * this.output.x) * (this.output.x * this.output.y * this.thread.z); - }, { - output: [5, 5, 5], - pipeline: true, - precision - }))(); + return gpu.createKernel( + function () { + return ( + this.thread.x + + this.thread.y * + this.output.x * + (this.output.x * this.output.y * this.thread.z) + ); + }, + { + output: [5, 5, 5], + pipeline: true, + precision, + } + )(); } const texture = makeTexture(); const clone = texture.clone(); @@ -136,22 +183,37 @@ test('3D unsigned precision auto', () => { copy3DTexture('unsigned', 'webgl2'); }); -(GPU.isHeadlessGLSupported ? test : skip)('3D unsigned precision headlessgl', () => { - copy3DTexture('unsigned', 'headlessgl'); -}); +(GPU.isHeadlessGLSupported ? test : skip)( + '3D unsigned precision headlessgl', + () => { + copy3DTexture('unsigned', 'headlessgl'); + } +); -(GPU.isSinglePrecisionSupported ? test : skip)('3D single precision auto', () => { - copy3DTexture('single'); -}); +(GPU.isSinglePrecisionSupported ? test : skip)( + '3D single precision auto', + () => { + copy3DTexture('single'); + } +); -(GPU.isSinglePrecisionSupported && GPU.isWebGLSupported ? test : skip)('3D single precision webgl', () => { - copy3DTexture('single', 'webgl'); -}); +(GPU.isSinglePrecisionSupported && GPU.isWebGLSupported ? test : skip)( + '3D single precision webgl', + () => { + copy3DTexture('single', 'webgl'); + } +); -(GPU.isSinglePrecisionSupported && GPU.isWebGL2Supported ? test : skip)('3D single precision webgl2', () => { - copy3DTexture('single', 'webgl2'); -}); +(GPU.isSinglePrecisionSupported && GPU.isWebGL2Supported ? test : skip)( + '3D single precision webgl2', + () => { + copy3DTexture('single', 'webgl2'); + } +); -(GPU.isSinglePrecisionSupported && GPU.isHeadlessGLSupported ? test : skip)('3D single precision headlessgl', () => { - copy3DTexture('single', 'headlessgl'); -}); +(GPU.isSinglePrecisionSupported && GPU.isHeadlessGLSupported ? test : skip)( + '3D single precision headlessgl', + () => { + copy3DTexture('single', 'headlessgl'); + } +); diff --git a/test/features/combine-kernels.js b/test/features/combine-kernels.js index 3db77f89..26e878d5 100644 --- a/test/features/combine-kernels.js +++ b/test/features/combine-kernels.js @@ -1,25 +1,40 @@ const { assert, skip, test, module: describe, only } = require('qunit'); -const { GPU } = require('../../src'); +const { GPU } = require('../..'); describe('features: combine kernels'); + function combineKernels(mode) { const gpu = new GPU({ mode }); - const kernel1 = gpu.createKernel(function(a, b) { - return a[this.thread.x] + b[this.thread.x]; - }, { output: [5] }); - - const kernel2 = gpu.createKernel(function(c, d) { - return c[this.thread.x] * d[this.thread.x]; - }, { output: [5] }); - - const superKernel = gpu.combineKernels(kernel1, kernel2, function(array1, array2, array3) { - return kernel2(kernel1(array1, array2), array3); - }); - - const result = superKernel([1,2,3,4,5], [1,2,3,4,5], [1,2,3,4,5]); + const kernel1 = gpu.createKernel( + function (a, b) { + return a[this.thread.x] + b[this.thread.x]; + }, + { output: [5] } + ); + + const kernel2 = gpu.createKernel( + function (c, d) { + return c[this.thread.x] * d[this.thread.x]; + }, + { output: [5] } + ); + + const superKernel = gpu.combineKernels( + kernel1, + kernel2, + function (array1, array2, array3) { + return kernel2(kernel1(array1, array2), array3); + } + ); + + const result = superKernel( + [1, 2, 3, 4, 5], + [1, 2, 3, 4, 5], + [1, 2, 3, 4, 5] + ); assert.deepEqual(Array.from(result), [2, 8, 18, 32, 50]); - gpu.destroy() + gpu.destroy(); } test('combine kernel auto', () => { @@ -46,99 +61,155 @@ test('combine kernel cpu', () => { combineKernels('cpu'); }); - function combineKernelsSinglePrecision(mode) { const gpu = new GPU({ mode }); - const kernel1 = gpu.createKernel(function(a, b) { - return a[this.thread.x] + b[this.thread.x]; - }, { output: [5], precision: 'single' }); - - const kernel2 = gpu.createKernel(function(c, d) { - return c[this.thread.x] * d[this.thread.x]; - }, { output: [5], precision: 'single' }); - - const superKernel = gpu.combineKernels(kernel1, kernel2, function(array1, array2, array3) { - return kernel2(kernel1(array1, array2), array3); - }); - - const result = superKernel([1,2,3,4,5], [1,2,3,4,5], [1,2,3,4,5]); + const kernel1 = gpu.createKernel( + function (a, b) { + return a[this.thread.x] + b[this.thread.x]; + }, + { output: [5], precision: 'single' } + ); + + const kernel2 = gpu.createKernel( + function (c, d) { + return c[this.thread.x] * d[this.thread.x]; + }, + { output: [5], precision: 'single' } + ); + + const superKernel = gpu.combineKernels( + kernel1, + kernel2, + function (array1, array2, array3) { + return kernel2(kernel1(array1, array2), array3); + } + ); + + const result = superKernel( + [1, 2, 3, 4, 5], + [1, 2, 3, 4, 5], + [1, 2, 3, 4, 5] + ); assert.deepEqual(Array.from(result), [2, 8, 18, 32, 50]); - gpu.destroy() + gpu.destroy(); } -(GPU.isSinglePrecisionSupported ? test : skip)('combine kernel single precision auto', () => { - combineKernelsSinglePrecision(); -}); - -(GPU.isSinglePrecisionSupported ? test : skip)('combine kernel single precision gpu', () => { - combineKernelsSinglePrecision('gpu'); -}); - -(GPU.isWebGLSupported && GPU.isSinglePrecisionSupported ? test : skip)('combine kernel single precision webgl', () => { - combineKernelsSinglePrecision('webgl'); -}); - -(GPU.isWebGL2Supported && GPU.isSinglePrecisionSupported ? test : skip)('combine kernel single precision webgl2', () => { - combineKernelsSinglePrecision('webgl2'); -}); - -(GPU.isHeadlessGLSupported && GPU.isSinglePrecisionSupported ? test : skip)('combine kernel single precision headlessgl', () => { - combineKernelsSinglePrecision('headlessgl'); -}); +(GPU.isSinglePrecisionSupported ? test : skip)( + 'combine kernel single precision auto', + () => { + combineKernelsSinglePrecision(); + } +); + +(GPU.isSinglePrecisionSupported ? test : skip)( + 'combine kernel single precision gpu', + () => { + combineKernelsSinglePrecision('gpu'); + } +); + +(GPU.isWebGLSupported && GPU.isSinglePrecisionSupported ? test : skip)( + 'combine kernel single precision webgl', + () => { + combineKernelsSinglePrecision('webgl'); + } +); + +(GPU.isWebGL2Supported && GPU.isSinglePrecisionSupported ? test : skip)( + 'combine kernel single precision webgl2', + () => { + combineKernelsSinglePrecision('webgl2'); + } +); + +(GPU.isHeadlessGLSupported && GPU.isSinglePrecisionSupported ? test : skip)( + 'combine kernel single precision headlessgl', + () => { + combineKernelsSinglePrecision('headlessgl'); + } +); test('combine kernel single precision cpu', () => { combineKernelsSinglePrecision('cpu'); }); - function combineKernelsOptimizeFloatMemory(mode) { const gpu = new GPU({ mode }); - const kernel1 = gpu.createKernel(function(a, b) { - return a[this.thread.x] + b[this.thread.x]; - }, { - output: [5], - precision: 'single', - optimizeFloatMemory: true, - }); - - const kernel2 = gpu.createKernel(function(c, d) { - return c[this.thread.x] * d[this.thread.x]; - }, { - output: [5], - precision: 'single', - optimizeFloatMemory: true, - }); - - const superKernel = gpu.combineKernels(kernel1, kernel2, function(array1, array2, array3) { - return kernel2(kernel1(array1, array2), array3); - }); - - const result = superKernel([1,2,3,4,5], [1,2,3,4,5], [1,2,3,4,5]); + const kernel1 = gpu.createKernel( + function (a, b) { + return a[this.thread.x] + b[this.thread.x]; + }, + { + output: [5], + precision: 'single', + optimizeFloatMemory: true, + } + ); + + const kernel2 = gpu.createKernel( + function (c, d) { + return c[this.thread.x] * d[this.thread.x]; + }, + { + output: [5], + precision: 'single', + optimizeFloatMemory: true, + } + ); + + const superKernel = gpu.combineKernels( + kernel1, + kernel2, + function (array1, array2, array3) { + return kernel2(kernel1(array1, array2), array3); + } + ); + + const result = superKernel( + [1, 2, 3, 4, 5], + [1, 2, 3, 4, 5], + [1, 2, 3, 4, 5] + ); assert.deepEqual(Array.from(result), [2, 8, 18, 32, 50]); - gpu.destroy() + gpu.destroy(); } -(GPU.isSinglePrecisionSupported ? test : skip)('combine kernel float textures auto', () => { - combineKernelsOptimizeFloatMemory(); -}); - -(GPU.isSinglePrecisionSupported ? test : skip)('combine kernel float textures gpu', () => { - combineKernelsOptimizeFloatMemory('gpu'); -}); - -(GPU.isWebGLSupported && GPU.isSinglePrecisionSupported ? test : skip)('combine kernel float textures webgl', () => { - combineKernelsOptimizeFloatMemory('webgl'); -}); - -(GPU.isWebGL2Supported && GPU.isSinglePrecisionSupported ? test : skip)('combine kernel float textures webgl2', () => { - combineKernelsOptimizeFloatMemory('webgl2'); -}); - -(GPU.isHeadlessGLSupported && GPU.isSinglePrecisionSupported ? test : skip)('combine kernel float textures headlessgl', () => { - combineKernelsOptimizeFloatMemory('headlessgl'); -}); +(GPU.isSinglePrecisionSupported ? test : skip)( + 'combine kernel float textures auto', + () => { + combineKernelsOptimizeFloatMemory(); + } +); + +(GPU.isSinglePrecisionSupported ? test : skip)( + 'combine kernel float textures gpu', + () => { + combineKernelsOptimizeFloatMemory('gpu'); + } +); + +(GPU.isWebGLSupported && GPU.isSinglePrecisionSupported ? test : skip)( + 'combine kernel float textures webgl', + () => { + combineKernelsOptimizeFloatMemory('webgl'); + } +); + +(GPU.isWebGL2Supported && GPU.isSinglePrecisionSupported ? test : skip)( + 'combine kernel float textures webgl2', + () => { + combineKernelsOptimizeFloatMemory('webgl2'); + } +); + +(GPU.isHeadlessGLSupported && GPU.isSinglePrecisionSupported ? test : skip)( + 'combine kernel float textures headlessgl', + () => { + combineKernelsOptimizeFloatMemory('headlessgl'); + } +); test('combine kernel float textures cpu', () => { combineKernelsOptimizeFloatMemory('cpu'); diff --git a/test/features/constants-array.js b/test/features/constants-array.js index 910d8086..6f9467a1 100644 --- a/test/features/constants-array.js +++ b/test/features/constants-array.js @@ -1,19 +1,26 @@ const { assert, skip, test, module: describe, only } = require('qunit'); -const { GPU } = require('../../src'); +const { GPU } = require('../..'); describe('features: constants array'); function feature(mode) { const gpu = new GPU({ mode }); const array = [200, 200]; - const tryConst = gpu.createKernel(function() { - return this.constants.array[this.thread.x]; - }, { - constants: { array }, - output: [2] - }); + const tryConst = gpu.createKernel( + function () { + return this.constants.array[this.thread.x]; + }, + { + constants: { array }, + output: [2], + } + ); const result = tryConst(); - assert.deepEqual(Array.from(result), [200, 200], 'array constant passed test'); + assert.deepEqual( + Array.from(result), + [200, 200], + 'array constant passed test' + ); gpu.destroy(); } diff --git a/test/features/constants-bool.js b/test/features/constants-bool.js index 4d9c0bed..82d0dab8 100644 --- a/test/features/constants-bool.js +++ b/test/features/constants-bool.js @@ -1,5 +1,5 @@ const { assert, skip, test, module: describe } = require('qunit'); -const { GPU } = require('../../src'); +const { GPU } = require('../..'); describe('features: constants bool'); @@ -7,13 +7,13 @@ function boolTrueConstantTest(mode) { const gpu = new GPU({ mode }); const bool = true; const tryConst = gpu.createKernel( - function() { + function () { return this.constants.bool ? 1 : 0; }, { constants: { bool }, - output: [1] - }, + output: [1], + } ); const result = tryConst(); assert.equal(result[0], 1, 'bool constant passed test'); @@ -44,18 +44,17 @@ test('true cpu', () => { boolTrueConstantTest('cpu'); }); - function boolFalseConstantTest(mode) { const gpu = new GPU({ mode }); const bool = false; const tryConst = gpu.createKernel( - function() { + function () { return this.constants.bool ? 1 : 0; }, { constants: { bool }, - output: [1] - }, + output: [1], + } ); const result = tryConst(); assert.equal(result[0], 0, 'bool constant passed test'); diff --git a/test/features/constants-canvas.js b/test/features/constants-canvas.js index 373f14c0..5e308c90 100644 --- a/test/features/constants-canvas.js +++ b/test/features/constants-canvas.js @@ -1,13 +1,14 @@ const { assert, skip, test, module: describe } = require('qunit'); -const { GPU } = require('../../src'); +const { GPU } = require('../..'); const { greenCanvas } = require('../browser-test-utils'); describe('features: constants canvas'); + function canvasConstantTest(mode) { const gpu = new GPU({ mode }); const canvas = greenCanvas(mode, 1, 1); const kernel = gpu.createKernel( - function() { + function () { const pixel = this.constants.canvas[this.thread.y][this.thread.x]; return pixel.g; }, @@ -30,11 +31,15 @@ function canvasConstantTest(mode) { canvasConstantTest('gpu'); }); -(GPU.isWebGLSupported && typeof HTMLCanvasElement !== 'undefined' ? test : skip)('webgl', () => { +(GPU.isWebGLSupported && typeof HTMLCanvasElement !== 'undefined' + ? test + : skip)('webgl', () => { canvasConstantTest('webgl'); }); -(GPU.isWebGL2Supported && typeof HTMLCanvasElement !== 'undefined' ? test : skip)('webgl2', () => { +(GPU.isWebGL2Supported && typeof HTMLCanvasElement !== 'undefined' + ? test + : skip)('webgl2', () => { canvasConstantTest('webgl2'); }); diff --git a/test/features/constants-float.js b/test/features/constants-float.js index 16bf7c1c..83297688 100644 --- a/test/features/constants-float.js +++ b/test/features/constants-float.js @@ -1,25 +1,25 @@ const { assert, skip, test, module: describe } = require('qunit'); -const { GPU } = require('../../src'); +const { GPU } = require('../..'); describe('features: constants float'); + function floatConstantTest(mode) { const gpu = new GPU({ mode }); const float = 200.01; const tryConst = gpu.createKernel( - function() { + function () { return this.constants.float; }, { constants: { float }, - output: [2] - }, + output: [2], + } ); const result = tryConst(); const match = new Float32Array([200.01, 200.01]); - const test = ( - result[0].toFixed(1) === match[0].toFixed(1) - && result[1].toFixed(1) === match[1].toFixed(1) - ); + const test = + result[0].toFixed(1) === match[0].toFixed(1) && + result[1].toFixed(1) === match[1].toFixed(1); assert.ok(test, 'float constant passed test'); gpu.destroy(); } diff --git a/test/features/constants-image-array.js b/test/features/constants-image-array.js index f286916b..9decfe74 100644 --- a/test/features/constants-image-array.js +++ b/test/features/constants-image-array.js @@ -1,11 +1,13 @@ const { assert, skip, test, module: describe } = require('qunit'); -const { GPU, WebGLKernel } = require('../../src'); +const { GPU, WebGLKernel } = require('../..'); describe('features: constants image array'); + function feature(mode, done) { const gpu = new GPU({ mode }); const image = new Image(); const imageArray = [image, image]; + function fn() { const pixel1 = this.constants.imageArray[0][this.thread.y][this.thread.x]; const pixel2 = this.constants.imageArray[1][this.thread.y][this.thread.x]; @@ -26,7 +28,7 @@ function feature(mode, done) { } const settings = { constants: { imageArray }, - output: [1, 1, 4] + output: [1, 1, 4], }; if (mode === 'webgl' || gpu.Kernel === WebGLKernel) { @@ -46,23 +48,33 @@ function feature(mode, done) { }; } -(GPU.isGPUHTMLImageArraySupported && typeof Image !== 'undefined' ? test : skip)('auto', t => { +(GPU.isGPUHTMLImageArraySupported && typeof Image !== 'undefined' + ? test + : skip)('auto', t => { feature(null, t.async()); }); -(GPU.isGPUHTMLImageArraySupported && typeof Image !== 'undefined' ? test : skip)('gpu', t => { +(GPU.isGPUHTMLImageArraySupported && typeof Image !== 'undefined' + ? test + : skip)('gpu', t => { feature('gpu', t.async()); }); -(GPU.isWebGLSupported && typeof Image !== 'undefined' ? test : skip)('webgl', t => { - assert.throws(() => { - feature('webgl') - }, 'imageArray are not compatible with webgl'); -}); +(GPU.isWebGLSupported && typeof Image !== 'undefined' ? test : skip)( + 'webgl', + t => { + assert.throws(() => { + feature('webgl'); + }, 'imageArray are not compatible with webgl'); + } +); -(GPU.isWebGL2Supported && typeof Image !== 'undefined' ? test : skip)('webgl2', t => { - feature('webgl2', t.async()); -}); +(GPU.isWebGL2Supported && typeof Image !== 'undefined' ? test : skip)( + 'webgl2', + t => { + feature('webgl2', t.async()); + } +); (typeof Image !== 'undefined' ? test : skip)('cpu', t => { feature('cpu', t.async()); diff --git a/test/features/constants-image.js b/test/features/constants-image.js index ae70389c..6e9e5451 100644 --- a/test/features/constants-image.js +++ b/test/features/constants-image.js @@ -1,16 +1,17 @@ const { assert, skip, test, module: describe } = require('qunit'); -const { GPU } = require('../../src'); +const { GPU } = require('../..'); describe('features: constants image'); + function imageConstantTest(mode, done) { const gpu = new GPU({ mode }); const image = new Image(); image.src = 'jellyfish-1.jpeg'; - image.onload = function() { + image.onload = function () { const width = image.width; const height = image.height; const tryConst = gpu.createKernel( - function() { + function () { const pixel = this.constants.image[this.thread.y][this.thread.x]; let color = 0; if (this.thread.z === 0) { @@ -34,7 +35,7 @@ function imageConstantTest(mode, done) { assert.ok(test, 'image constant passed test'); gpu.destroy(); done(); - } + }; } (typeof Image !== 'undefined' ? test : skip)('auto', t => { @@ -45,13 +46,19 @@ function imageConstantTest(mode, done) { imageConstantTest('gpu', t.async()); }); -(GPU.isWebGLSupported && typeof Image !== 'undefined' ? test : skip)('webgl', t => { - imageConstantTest('webgl', t.async()); -}); +(GPU.isWebGLSupported && typeof Image !== 'undefined' ? test : skip)( + 'webgl', + t => { + imageConstantTest('webgl', t.async()); + } +); -(GPU.isWebGL2Supported && typeof Image !== 'undefined' ? test : skip)('webgl2', t => { - imageConstantTest('webgl2', t.async()); -}); +(GPU.isWebGL2Supported && typeof Image !== 'undefined' ? test : skip)( + 'webgl2', + t => { + imageConstantTest('webgl2', t.async()); + } +); (typeof Image !== 'undefined' ? test : skip)('cpu', t => { imageConstantTest('cpu', t.async()); diff --git a/test/features/constants-integer.js b/test/features/constants-integer.js index b3f20005..56af7f5d 100644 --- a/test/features/constants-integer.js +++ b/test/features/constants-integer.js @@ -1,22 +1,24 @@ const { assert, skip, test, module: describe, only } = require('qunit'); -const { GPU } = require('../../src'); +const { GPU } = require('../..'); describe('features: constants integer'); function integerConstantTest(mode) { const gpu = new GPU({ mode }); const int = 200; - const tryConst = gpu.createKernel( - function() { - return this.constants.int; - }, - { - constants: { int } - } - ).setOutput([2]); + const tryConst = gpu + .createKernel( + function () { + return this.constants.int; + }, + { + constants: { int }, + } + ) + .setOutput([2]); const result = tryConst(); const match = new Float32Array([200, 200]); - const test = (result[0] === match[0] && result[1] === match[1]); + const test = result[0] === match[0] && result[1] === match[1]; assert.ok(test, 'int constant passed test'); gpu.destroy(); } diff --git a/test/features/constants-texture.js b/test/features/constants-texture.js index 83881603..6b8565dd 100644 --- a/test/features/constants-texture.js +++ b/test/features/constants-texture.js @@ -1,24 +1,27 @@ const { assert, skip, test, module: describe, only } = require('qunit'); -const { GPU } = require('../../src'); +const { GPU } = require('../..'); describe('features: constants texture 1d'); + function test1D(mode) { const gpu = new GPU({ mode }); const createTexture = gpu - .createKernel(function() { + .createKernel(function () { return 200; }) .setOutput([2]) .setPipeline(true); const texture = createTexture(); - const tryConst = gpu.createKernel( - function() { - return this.constants.texture[this.thread.x]; - }, - { - constants: { texture } - } - ).setOutput([2]); + const tryConst = gpu + .createKernel( + function () { + return this.constants.texture[this.thread.x]; + }, + { + constants: { texture }, + } + ) + .setOutput([2]); const result = tryConst(); const expected = new Float32Array([200, 200]); assert.deepEqual(result, expected, 'texture constant passed test'); @@ -49,28 +52,32 @@ test('cpu', () => { test1D('cpu'); }); - - describe('features: constants texture 2d'); + function test2D(mode) { const gpu = new GPU({ mode }); const createTexture = gpu - .createKernel(function() { + .createKernel(function () { return 200; }) .setOutput([2, 2]) .setPipeline(true); const texture = createTexture(); - const tryConst = gpu.createKernel( - function() { - return this.constants.texture[this.thread.y][this.thread.x]; - }, - { - constants: { texture } - } - ).setOutput([2, 2]); + const tryConst = gpu + .createKernel( + function () { + return this.constants.texture[this.thread.y][this.thread.x]; + }, + { + constants: { texture }, + } + ) + .setOutput([2, 2]); const result = tryConst(); - const expected = [new Float32Array([200, 200]), new Float32Array([200, 200])]; + const expected = [ + new Float32Array([200, 200]), + new Float32Array([200, 200]), + ]; assert.deepEqual(result, expected, 'texture constant passed test'); gpu.destroy(); } @@ -99,27 +106,34 @@ test('cpu', () => { test2D('cpu'); }); - describe('features: constants texture 3d'); + function test3D(mode) { const gpu = new GPU({ mode }); const createTexture = gpu - .createKernel(function() { + .createKernel(function () { return 200; }) .setOutput([2, 2, 2]) .setPipeline(true); const texture = createTexture(); - const tryConst = gpu.createKernel( - function() { - return this.constants.texture[this.thread.z][this.thread.y][this.thread.x]; - }, - { - constants: { texture } - } - ).setOutput([2, 2, 2]); + const tryConst = gpu + .createKernel( + function () { + return this.constants.texture[this.thread.z][this.thread.y][ + this.thread.x + ]; + }, + { + constants: { texture }, + } + ) + .setOutput([2, 2, 2]); const result = tryConst(); - const expected = [[new Float32Array([200, 200]), new Float32Array([200, 200])],[new Float32Array([200, 200]), new Float32Array([200, 200])]]; + const expected = [ + [new Float32Array([200, 200]), new Float32Array([200, 200])], + [new Float32Array([200, 200]), new Float32Array([200, 200])], + ]; assert.deepEqual(result, expected, 'texture constant passed test'); gpu.destroy(); } diff --git a/test/features/cpu-with-textures.js b/test/features/cpu-with-textures.js index b5d80233..ca8b5f43 100644 --- a/test/features/cpu-with-textures.js +++ b/test/features/cpu-with-textures.js @@ -1,24 +1,30 @@ const { assert, skip, test, module: describe, only } = require('qunit'); -const { GPU } = require('../../src'); +const { GPU } = require('../..'); describe('features: CPU with Textures'); function cpuWithTexturesNumberWithSinglePrecision(mode) { const gpu = new GPU({ mode }); - const kernel = gpu.createKernel(function() { - return this.thread.x; - }, { - output: [2], - pipeline: true, - precision: 'single', - }); + const kernel = gpu.createKernel( + function () { + return this.thread.x; + }, + { + output: [2], + pipeline: true, + precision: 'single', + } + ); const texture = kernel(); assert.ok(texture.toArray); assert.deepEqual(Array.from(texture.toArray()), [0, 1]); const cpu = new GPU({ mode: 'cpu' }); - const cpuKernel = cpu.createKernel(function(v) { - return v[this.thread.x]; - }, { output: [2] }); + const cpuKernel = cpu.createKernel( + function (v) { + return v[this.thread.x]; + }, + { output: [2] } + ); assert.notOk(cpuKernel.kernel.textureCache); const result = cpuKernel(texture); assert.ok(cpuKernel.kernel.textureCache); @@ -32,43 +38,64 @@ function cpuWithTexturesNumberWithSinglePrecision(mode) { gpu.destroy(); } -(GPU.isGPUSupported && GPU.isSinglePrecisionSupported ? test : skip)('number with single precision auto', () => { - cpuWithTexturesNumberWithSinglePrecision(); -}); - -(GPU.isGPUSupported && GPU.isSinglePrecisionSupported ? test : skip)('number with single precision gpu', () => { - cpuWithTexturesNumberWithSinglePrecision('gpu'); -}); - -(GPU.isWebGLSupported && GPU.isSinglePrecisionSupported ? test : skip)('number with single precision webgl', () => { - cpuWithTexturesNumberWithSinglePrecision('webgl'); -}); - -(GPU.isWebGL2Supported && GPU.isSinglePrecisionSupported ? test : skip)('number with single precision webgl2', () => { - cpuWithTexturesNumberWithSinglePrecision('webgl2'); -}); - -(GPU.isHeadlessGLSupported && GPU.isSinglePrecisionSupported ? test : skip)('number with single precision headlessgl', () => { - cpuWithTexturesNumberWithSinglePrecision('headlessgl'); -}); +(GPU.isGPUSupported && GPU.isSinglePrecisionSupported ? test : skip)( + 'number with single precision auto', + () => { + cpuWithTexturesNumberWithSinglePrecision(); + } +); + +(GPU.isGPUSupported && GPU.isSinglePrecisionSupported ? test : skip)( + 'number with single precision gpu', + () => { + cpuWithTexturesNumberWithSinglePrecision('gpu'); + } +); + +(GPU.isWebGLSupported && GPU.isSinglePrecisionSupported ? test : skip)( + 'number with single precision webgl', + () => { + cpuWithTexturesNumberWithSinglePrecision('webgl'); + } +); + +(GPU.isWebGL2Supported && GPU.isSinglePrecisionSupported ? test : skip)( + 'number with single precision webgl2', + () => { + cpuWithTexturesNumberWithSinglePrecision('webgl2'); + } +); + +(GPU.isHeadlessGLSupported && GPU.isSinglePrecisionSupported ? test : skip)( + 'number with single precision headlessgl', + () => { + cpuWithTexturesNumberWithSinglePrecision('headlessgl'); + } +); function cpuWithTexturesMemoryOptimizedNumberWithSinglePrecision(mode) { const gpu = new GPU({ mode }); - const kernel = gpu.createKernel(function() { - return this.thread.x; - }, { - output: [2], - pipeline: true, - precision: 'single', - optimizeFloatMemory: true, - }); + const kernel = gpu.createKernel( + function () { + return this.thread.x; + }, + { + output: [2], + pipeline: true, + precision: 'single', + optimizeFloatMemory: true, + } + ); const texture = kernel(); assert.ok(texture.toArray); assert.deepEqual(Array.from(texture.toArray()), [0, 1]); const cpu = new GPU({ mode: 'cpu' }); - const cpuKernel = cpu.createKernel(function(v) { - return v[this.thread.x]; - }, { output: [2] }); + const cpuKernel = cpu.createKernel( + function (v) { + return v[this.thread.x]; + }, + { output: [2] } + ); assert.notOk(cpuKernel.kernel.textureCache); const result = cpuKernel(texture); assert.ok(cpuKernel.kernel.textureCache); @@ -82,189 +109,327 @@ function cpuWithTexturesMemoryOptimizedNumberWithSinglePrecision(mode) { gpu.destroy(); } -(GPU.isGPUSupported && GPU.isSinglePrecisionSupported ? test : skip)('memory optimized number with single precision auto', () => { - cpuWithTexturesMemoryOptimizedNumberWithSinglePrecision(); -}); - -(GPU.isGPUSupported && GPU.isSinglePrecisionSupported ? test : skip)('memory optimized number with single precision gpu', () => { - cpuWithTexturesMemoryOptimizedNumberWithSinglePrecision('gpu'); -}); - -(GPU.isWebGLSupported && GPU.isSinglePrecisionSupported ? test : skip)('memory optimized number with single precision webgl', () => { - cpuWithTexturesMemoryOptimizedNumberWithSinglePrecision('webgl'); -}); - -(GPU.isWebGL2Supported && GPU.isSinglePrecisionSupported ? test : skip)('memory optimized number with single precision webgl2', () => { - cpuWithTexturesMemoryOptimizedNumberWithSinglePrecision('webgl2'); -}); - -(GPU.isHeadlessGLSupported && GPU.isSinglePrecisionSupported ? test : skip)('memory optimized number with single precision headlessgl', () => { - cpuWithTexturesMemoryOptimizedNumberWithSinglePrecision('headlessgl'); -}); +(GPU.isGPUSupported && GPU.isSinglePrecisionSupported ? test : skip)( + 'memory optimized number with single precision auto', + () => { + cpuWithTexturesMemoryOptimizedNumberWithSinglePrecision(); + } +); + +(GPU.isGPUSupported && GPU.isSinglePrecisionSupported ? test : skip)( + 'memory optimized number with single precision gpu', + () => { + cpuWithTexturesMemoryOptimizedNumberWithSinglePrecision('gpu'); + } +); + +(GPU.isWebGLSupported && GPU.isSinglePrecisionSupported ? test : skip)( + 'memory optimized number with single precision webgl', + () => { + cpuWithTexturesMemoryOptimizedNumberWithSinglePrecision('webgl'); + } +); + +(GPU.isWebGL2Supported && GPU.isSinglePrecisionSupported ? test : skip)( + 'memory optimized number with single precision webgl2', + () => { + cpuWithTexturesMemoryOptimizedNumberWithSinglePrecision('webgl2'); + } +); + +(GPU.isHeadlessGLSupported && GPU.isSinglePrecisionSupported ? test : skip)( + 'memory optimized number with single precision headlessgl', + () => { + cpuWithTexturesMemoryOptimizedNumberWithSinglePrecision('headlessgl'); + } +); function cpuWithTexturesArray2WithSinglePrecision(mode) { const gpu = new GPU({ mode }); - const kernel = gpu.createKernel(function() { - return [this.thread.x, this.thread.x]; - }, { - output: [2], - pipeline: true, - precision: 'single', - }); + const kernel = gpu.createKernel( + function () { + return [this.thread.x, this.thread.x]; + }, + { + output: [2], + pipeline: true, + precision: 'single', + } + ); const texture = kernel(); assert.ok(texture.toArray); - assert.deepEqual(texture.toArray().map(value => Array.from(value)), [[0,0], [1,1]]); + assert.deepEqual( + texture.toArray().map(value => Array.from(value)), + [ + [0, 0], + [1, 1], + ] + ); const cpu = new GPU({ mode: 'cpu' }); - const cpuKernel = cpu.createKernel(function(v) { - return v[this.thread.x]; - }, { output: [2] }); + const cpuKernel = cpu.createKernel( + function (v) { + return v[this.thread.x]; + }, + { output: [2] } + ); assert.notOk(cpuKernel.kernel.textureCache); const result = cpuKernel(texture); assert.ok(cpuKernel.kernel.textureCache); - assert.deepEqual(result.map(value => Array.from(value)), [[0,0], [1,1]]); + assert.deepEqual( + result.map(value => Array.from(value)), + [ + [0, 0], + [1, 1], + ] + ); let calledTwice = false; texture.toArray = () => { calledTwice = true; }; - assert.deepEqual(cpuKernel(texture).map(value => Array.from(value)), [[0,0], [1,1]]); + assert.deepEqual( + cpuKernel(texture).map(value => Array.from(value)), + [ + [0, 0], + [1, 1], + ] + ); assert.equal(calledTwice, false); gpu.destroy(); } -(GPU.isGPUSupported && GPU.isSinglePrecisionSupported ? test : skip)('Array(2) with single precision auto', () => { - cpuWithTexturesArray2WithSinglePrecision(); -}); - -(GPU.isGPUSupported && GPU.isSinglePrecisionSupported ? test : skip)('Array(2) with single precision gpu', () => { - cpuWithTexturesArray2WithSinglePrecision('gpu'); -}); - -(GPU.isWebGLSupported && GPU.isSinglePrecisionSupported ? test : skip)('Array(2) with single precision webgl', () => { - cpuWithTexturesArray2WithSinglePrecision('webgl'); -}); - -(GPU.isWebGL2Supported && GPU.isSinglePrecisionSupported ? test : skip)('Array(2) with single precision webgl2', () => { - cpuWithTexturesArray2WithSinglePrecision('webgl2'); -}); - -(GPU.isHeadlessGLSupported && GPU.isSinglePrecisionSupported ? test : skip)('Array(2) with single precision headlessgl', () => { - cpuWithTexturesArray2WithSinglePrecision('headlessgl'); -}); +(GPU.isGPUSupported && GPU.isSinglePrecisionSupported ? test : skip)( + 'Array(2) with single precision auto', + () => { + cpuWithTexturesArray2WithSinglePrecision(); + } +); + +(GPU.isGPUSupported && GPU.isSinglePrecisionSupported ? test : skip)( + 'Array(2) with single precision gpu', + () => { + cpuWithTexturesArray2WithSinglePrecision('gpu'); + } +); + +(GPU.isWebGLSupported && GPU.isSinglePrecisionSupported ? test : skip)( + 'Array(2) with single precision webgl', + () => { + cpuWithTexturesArray2WithSinglePrecision('webgl'); + } +); + +(GPU.isWebGL2Supported && GPU.isSinglePrecisionSupported ? test : skip)( + 'Array(2) with single precision webgl2', + () => { + cpuWithTexturesArray2WithSinglePrecision('webgl2'); + } +); + +(GPU.isHeadlessGLSupported && GPU.isSinglePrecisionSupported ? test : skip)( + 'Array(2) with single precision headlessgl', + () => { + cpuWithTexturesArray2WithSinglePrecision('headlessgl'); + } +); function cpuWithTexturesArray3WithSinglePrecision(mode) { const gpu = new GPU({ mode }); - const kernel = gpu.createKernel(function() { - return [this.thread.x, this.thread.x, this.thread.x]; - }, { - output: [2], - pipeline: true, - precision: 'single', - }); + const kernel = gpu.createKernel( + function () { + return [this.thread.x, this.thread.x, this.thread.x]; + }, + { + output: [2], + pipeline: true, + precision: 'single', + } + ); const texture = kernel(); assert.ok(texture.toArray); - assert.deepEqual(texture.toArray().map(value => Array.from(value)), [[0,0,0], [1,1,1]]); + assert.deepEqual( + texture.toArray().map(value => Array.from(value)), + [ + [0, 0, 0], + [1, 1, 1], + ] + ); const cpu = new GPU({ mode: 'cpu' }); - const cpuKernel = cpu.createKernel(function(v) { - return v[this.thread.x]; - }, { output: [2] }); + const cpuKernel = cpu.createKernel( + function (v) { + return v[this.thread.x]; + }, + { output: [2] } + ); assert.notOk(cpuKernel.kernel.textureCache); const result = cpuKernel(texture); assert.ok(cpuKernel.kernel.textureCache); - assert.deepEqual(result.map(value => Array.from(value)), [[0,0,0], [1,1,1]]); + assert.deepEqual( + result.map(value => Array.from(value)), + [ + [0, 0, 0], + [1, 1, 1], + ] + ); let calledTwice = false; texture.toArray = () => { calledTwice = true; }; - assert.deepEqual(cpuKernel(texture).map(value => Array.from(value)), [[0,0,0], [1,1,1]]); + assert.deepEqual( + cpuKernel(texture).map(value => Array.from(value)), + [ + [0, 0, 0], + [1, 1, 1], + ] + ); assert.equal(calledTwice, false); gpu.destroy(); } -(GPU.isGPUSupported && GPU.isSinglePrecisionSupported ? test : skip)('Array(3) with single precision auto', () => { - cpuWithTexturesArray3WithSinglePrecision(); -}); - -(GPU.isGPUSupported && GPU.isSinglePrecisionSupported ? test : skip)('Array(3) with single precision gpu', () => { - cpuWithTexturesArray3WithSinglePrecision('gpu'); -}); - -(GPU.isWebGLSupported && GPU.isSinglePrecisionSupported ? test : skip)('Array(3) with single precision webgl', () => { - cpuWithTexturesArray3WithSinglePrecision('webgl'); -}); - -(GPU.isWebGL2Supported && GPU.isSinglePrecisionSupported ? test : skip)('Array(3) with single precision webgl2', () => { - cpuWithTexturesArray3WithSinglePrecision('webgl2'); -}); - -(GPU.isHeadlessGLSupported && GPU.isSinglePrecisionSupported ? test : skip)('Array(3) with single precision headlessgl', () => { - cpuWithTexturesArray3WithSinglePrecision('headlessgl'); -}); +(GPU.isGPUSupported && GPU.isSinglePrecisionSupported ? test : skip)( + 'Array(3) with single precision auto', + () => { + cpuWithTexturesArray3WithSinglePrecision(); + } +); + +(GPU.isGPUSupported && GPU.isSinglePrecisionSupported ? test : skip)( + 'Array(3) with single precision gpu', + () => { + cpuWithTexturesArray3WithSinglePrecision('gpu'); + } +); + +(GPU.isWebGLSupported && GPU.isSinglePrecisionSupported ? test : skip)( + 'Array(3) with single precision webgl', + () => { + cpuWithTexturesArray3WithSinglePrecision('webgl'); + } +); + +(GPU.isWebGL2Supported && GPU.isSinglePrecisionSupported ? test : skip)( + 'Array(3) with single precision webgl2', + () => { + cpuWithTexturesArray3WithSinglePrecision('webgl2'); + } +); + +(GPU.isHeadlessGLSupported && GPU.isSinglePrecisionSupported ? test : skip)( + 'Array(3) with single precision headlessgl', + () => { + cpuWithTexturesArray3WithSinglePrecision('headlessgl'); + } +); function cpuWithTexturesArray4WithSinglePrecision(mode) { const gpu = new GPU({ mode }); - const kernel = gpu.createKernel(function() { - return [this.thread.x, this.thread.x, this.thread.x, this.thread.x]; - }, { - output: [2], - pipeline: true, - precision: 'single', - }); + const kernel = gpu.createKernel( + function () { + return [this.thread.x, this.thread.x, this.thread.x, this.thread.x]; + }, + { + output: [2], + pipeline: true, + precision: 'single', + } + ); const texture = kernel(); assert.ok(texture.toArray); - assert.deepEqual(texture.toArray().map(value => Array.from(value)), [[0,0,0,0], [1,1,1,1]]); + assert.deepEqual( + texture.toArray().map(value => Array.from(value)), + [ + [0, 0, 0, 0], + [1, 1, 1, 1], + ] + ); const cpu = new GPU({ mode: 'cpu' }); - const cpuKernel = cpu.createKernel(function(v) { - return v[this.thread.x]; - }, { output: [2] }); + const cpuKernel = cpu.createKernel( + function (v) { + return v[this.thread.x]; + }, + { output: [2] } + ); assert.notOk(cpuKernel.kernel.textureCache); const result = cpuKernel(texture); assert.ok(cpuKernel.kernel.textureCache); - assert.deepEqual(result.map(value => Array.from(value)), [[0,0,0,0], [1,1,1,1]]); + assert.deepEqual( + result.map(value => Array.from(value)), + [ + [0, 0, 0, 0], + [1, 1, 1, 1], + ] + ); let calledTwice = false; texture.toArray = () => { calledTwice = true; }; - assert.deepEqual(cpuKernel(texture).map(value => Array.from(value)), [[0,0,0,0], [1,1,1,1]]); + assert.deepEqual( + cpuKernel(texture).map(value => Array.from(value)), + [ + [0, 0, 0, 0], + [1, 1, 1, 1], + ] + ); assert.equal(calledTwice, false); gpu.destroy(); } -(GPU.isGPUSupported && GPU.isSinglePrecisionSupported ? test : skip)('Array(4) with single precision auto', () => { - cpuWithTexturesArray4WithSinglePrecision(); -}); - -(GPU.isGPUSupported && GPU.isSinglePrecisionSupported ? test : skip)('Array(4) with single precision gpu', () => { - cpuWithTexturesArray4WithSinglePrecision('gpu'); -}); - -(GPU.isWebGLSupported && GPU.isSinglePrecisionSupported ? test : skip)('Array(4) with single precision webgl', () => { - cpuWithTexturesArray4WithSinglePrecision('webgl'); -}); - -(GPU.isWebGL2Supported && GPU.isSinglePrecisionSupported ? test : skip)('Array(4) with single precision webgl2', () => { - cpuWithTexturesArray4WithSinglePrecision('webgl2'); -}); - -(GPU.isHeadlessGLSupported && GPU.isSinglePrecisionSupported ? test : skip)('Array(4) with single precision headlessgl', () => { - cpuWithTexturesArray4WithSinglePrecision('headlessgl'); -}); +(GPU.isGPUSupported && GPU.isSinglePrecisionSupported ? test : skip)( + 'Array(4) with single precision auto', + () => { + cpuWithTexturesArray4WithSinglePrecision(); + } +); + +(GPU.isGPUSupported && GPU.isSinglePrecisionSupported ? test : skip)( + 'Array(4) with single precision gpu', + () => { + cpuWithTexturesArray4WithSinglePrecision('gpu'); + } +); + +(GPU.isWebGLSupported && GPU.isSinglePrecisionSupported ? test : skip)( + 'Array(4) with single precision webgl', + () => { + cpuWithTexturesArray4WithSinglePrecision('webgl'); + } +); + +(GPU.isWebGL2Supported && GPU.isSinglePrecisionSupported ? test : skip)( + 'Array(4) with single precision webgl2', + () => { + cpuWithTexturesArray4WithSinglePrecision('webgl2'); + } +); + +(GPU.isHeadlessGLSupported && GPU.isSinglePrecisionSupported ? test : skip)( + 'Array(4) with single precision headlessgl', + () => { + cpuWithTexturesArray4WithSinglePrecision('headlessgl'); + } +); function cpuWithTexturesNumberWithUnsignedPrecision(mode) { const gpu = new GPU({ mode }); - const kernel = gpu.createKernel(function() { - return this.thread.x; - }, { - output: [2], - pipeline: true, - precision: 'unsigned', - }); + const kernel = gpu.createKernel( + function () { + return this.thread.x; + }, + { + output: [2], + pipeline: true, + precision: 'unsigned', + } + ); const texture = kernel(); assert.ok(texture.toArray); assert.deepEqual(Array.from(texture.toArray()), [0, 1]); const cpu = new GPU({ mode: 'cpu' }); - const cpuKernel = cpu.createKernel(function(v) { - return v[this.thread.x]; - }, { output: [2] }); + const cpuKernel = cpu.createKernel( + function (v) { + return v[this.thread.x]; + }, + { output: [2] } + ); assert.notOk(cpuKernel.kernel.textureCache); const result = cpuKernel(texture); assert.ok(cpuKernel.kernel.textureCache); @@ -278,22 +443,37 @@ function cpuWithTexturesNumberWithUnsignedPrecision(mode) { gpu.destroy(); } -(GPU.isGPUSupported && GPU.isSinglePrecisionSupported ? test : skip)('number with unsigned precision auto', () => { - cpuWithTexturesNumberWithUnsignedPrecision(); -}); - -(GPU.isGPUSupported && GPU.isSinglePrecisionSupported ? test : skip)('number with unsigned precision gpu', () => { - cpuWithTexturesNumberWithUnsignedPrecision('gpu'); -}); - -(GPU.isWebGLSupported && GPU.isSinglePrecisionSupported ? test : skip)('number with unsigned precision webgl', () => { - cpuWithTexturesNumberWithUnsignedPrecision('webgl'); -}); - -(GPU.isWebGL2Supported && GPU.isSinglePrecisionSupported ? test : skip)('number with unsigned precision webgl2', () => { - cpuWithTexturesNumberWithUnsignedPrecision('webgl2'); -}); - -(GPU.isHeadlessGLSupported && GPU.isSinglePrecisionSupported ? test : skip)('number with unsigned precision headlessgl', () => { - cpuWithTexturesNumberWithUnsignedPrecision('headlessgl'); -}); +(GPU.isGPUSupported && GPU.isSinglePrecisionSupported ? test : skip)( + 'number with unsigned precision auto', + () => { + cpuWithTexturesNumberWithUnsignedPrecision(); + } +); + +(GPU.isGPUSupported && GPU.isSinglePrecisionSupported ? test : skip)( + 'number with unsigned precision gpu', + () => { + cpuWithTexturesNumberWithUnsignedPrecision('gpu'); + } +); + +(GPU.isWebGLSupported && GPU.isSinglePrecisionSupported ? test : skip)( + 'number with unsigned precision webgl', + () => { + cpuWithTexturesNumberWithUnsignedPrecision('webgl'); + } +); + +(GPU.isWebGL2Supported && GPU.isSinglePrecisionSupported ? test : skip)( + 'number with unsigned precision webgl2', + () => { + cpuWithTexturesNumberWithUnsignedPrecision('webgl2'); + } +); + +(GPU.isHeadlessGLSupported && GPU.isSinglePrecisionSupported ? test : skip)( + 'number with unsigned precision headlessgl', + () => { + cpuWithTexturesNumberWithUnsignedPrecision('headlessgl'); + } +); diff --git a/test/features/create-kernel-map.js b/test/features/create-kernel-map.js index 5af56cc7..eb1051c7 100644 --- a/test/features/create-kernel-map.js +++ b/test/features/create-kernel-map.js @@ -1,7 +1,8 @@ const { assert, skip, test, module: describe, only } = require('qunit'); -const { GPU, alias } = require('../../src'); +const { GPU, alias } = require('../..'); describe('features: create kernel map'); + function createPropertyKernels(gpu, output) { function divide(d1, d2) { return d1 / d2; @@ -9,33 +10,46 @@ function createPropertyKernels(gpu, output) { const adder = alias('adder', function add(a1, a2) { return a1 + a2; }); - return gpu.createKernelMap({ - addResult: adder, - divideResult: divide - }, function (k1, k2, k3) { - return divide(adder(k1[this.thread.x], k2[this.thread.x]), k3[this.thread.x]); - }).setOutput(output); + return gpu + .createKernelMap( + { + addResult: adder, + divideResult: divide, + }, + function (k1, k2, k3) { + return divide( + adder(k1[this.thread.x], k2[this.thread.x]), + k3[this.thread.x] + ); + } + ) + .setOutput(output); } function createArrayKernels(gpu, output) { function add(a1, a2) { return a1 + a2; } + function divide(d1, d2) { return d1 / d2; } - return gpu.createKernelMap([ - add, divide - ], function (k1, k2, k3) { - return divide(add(k1[this.thread.x], k2[this.thread.x]), k3[this.thread.x]); - }).setOutput(output) + return gpu + .createKernelMap([add, divide], function (k1, k2, k3) { + return divide( + add(k1[this.thread.x], k2[this.thread.x]), + k3[this.thread.x] + ); + }) + .setOutput(output); } - function createKernel(gpu, output) { - return gpu.createKernel(function (a) { - return a[this.thread.x]; - }).setOutput(output); + return gpu + .createKernel(function (a) { + return a[this.thread.x]; + }) + .setOutput(output); } function createKernelMapObject1Dimension1Length(mode) { @@ -52,31 +66,45 @@ function createKernelMapObject1Dimension1Length(mode) { gpu.destroy(); } -(GPU.isKernelMapSupported ? test : skip)('createKernelMap object 1 dimension 1 length auto', () => { - createKernelMapObject1Dimension1Length(); -}); +(GPU.isKernelMapSupported ? test : skip)( + 'createKernelMap object 1 dimension 1 length auto', + () => { + createKernelMapObject1Dimension1Length(); + } +); -(GPU.isKernelMapSupported ? test : skip)('createKernelMap object 1 dimension 1 length gpu', () => { - createKernelMapObject1Dimension1Length('gpu'); -}); +(GPU.isKernelMapSupported ? test : skip)( + 'createKernelMap object 1 dimension 1 length gpu', + () => { + createKernelMapObject1Dimension1Length('gpu'); + } +); -(GPU.isWebGLSupported ? test : skip)('createKernelMap object 1 dimension 1 length webgl', () => { - createKernelMapObject1Dimension1Length('webgl'); -}); +(GPU.isWebGLSupported ? test : skip)( + 'createKernelMap object 1 dimension 1 length webgl', + () => { + createKernelMapObject1Dimension1Length('webgl'); + } +); -(GPU.isWebGL2Supported ? test : skip)('createKernelMap object 1 dimension 1 length webgl2', () => { - createKernelMapObject1Dimension1Length('webgl2'); -}); +(GPU.isWebGL2Supported ? test : skip)( + 'createKernelMap object 1 dimension 1 length webgl2', + () => { + createKernelMapObject1Dimension1Length('webgl2'); + } +); -(GPU.isHeadlessGLSupported && GPU.isKernelMapSupported ? test : skip)('createKernelMap object 1 dimension 1 length headlessgl', () => { - createKernelMapObject1Dimension1Length('headlessgl'); -}); +(GPU.isHeadlessGLSupported && GPU.isKernelMapSupported ? test : skip)( + 'createKernelMap object 1 dimension 1 length headlessgl', + () => { + createKernelMapObject1Dimension1Length('headlessgl'); + } +); test('createKernelMap object 1 dimension 1 length cpu', () => { createKernelMapObject1Dimension1Length('cpu'); }); - function createKernelMapArray1Dimension1Length(mode) { const gpu = new GPU({ mode }); const superKernel = createArrayKernels(gpu, [1]); @@ -91,36 +119,54 @@ function createKernelMapArray1Dimension1Length(mode) { gpu.destroy(); } -(GPU.isKernelMapSupported ? test : skip)('createKernelMap array 1 dimension 1 length auto', () => { - createKernelMapArray1Dimension1Length(); -}); +(GPU.isKernelMapSupported ? test : skip)( + 'createKernelMap array 1 dimension 1 length auto', + () => { + createKernelMapArray1Dimension1Length(); + } +); -(GPU.isKernelMapSupported ? test : skip)('createKernelMap array 1 dimension 1 length gpu', () => { - createKernelMapArray1Dimension1Length('gpu'); -}); +(GPU.isKernelMapSupported ? test : skip)( + 'createKernelMap array 1 dimension 1 length gpu', + () => { + createKernelMapArray1Dimension1Length('gpu'); + } +); -(GPU.isWebGLSupported ? test : skip)('createKernelMap array 1 dimension 1 length webgl', () => { - createKernelMapArray1Dimension1Length('webgl'); -}); +(GPU.isWebGLSupported ? test : skip)( + 'createKernelMap array 1 dimension 1 length webgl', + () => { + createKernelMapArray1Dimension1Length('webgl'); + } +); -(GPU.isWebGL2Supported ? test : skip)('createKernelMap array 1 dimension 1 length webgl2', () => { - createKernelMapArray1Dimension1Length('webgl2'); -}); +(GPU.isWebGL2Supported ? test : skip)( + 'createKernelMap array 1 dimension 1 length webgl2', + () => { + createKernelMapArray1Dimension1Length('webgl2'); + } +); -(GPU.isHeadlessGLSupported && GPU.isKernelMapSupported ? test : skip)('createKernelMap array 1 dimension 1 length headlessgl', () => { - createKernelMapArray1Dimension1Length('headlessgl'); -}); +(GPU.isHeadlessGLSupported && GPU.isKernelMapSupported ? test : skip)( + 'createKernelMap array 1 dimension 1 length headlessgl', + () => { + createKernelMapArray1Dimension1Length('headlessgl'); + } +); test('createKernelMap array 1 dimension 1 length cpu', () => { createKernelMapArray1Dimension1Length('cpu'); }); - function createKernelMapObject1Dimension5Length(mode) { const gpu = new GPU({ mode }); const superKernel = createPropertyKernels(gpu, [5]); const kernel = createKernel(gpu, [5]); - const output = superKernel([1,2,3,4,5], [1,2,3,4,5], [1,2,3,4,5]); + const output = superKernel( + [1, 2, 3, 4, 5], + [1, 2, 3, 4, 5], + [1, 2, 3, 4, 5] + ); const result = Array.from(output.result); const addResult = Array.from(kernel(output.addResult)); const divideResult = Array.from(kernel(output.divideResult)); @@ -130,36 +176,54 @@ function createKernelMapObject1Dimension5Length(mode) { gpu.destroy(); } -(GPU.isKernelMapSupported ? test : skip)('createKernelMap object 1 dimension 5 length auto', () => { - createKernelMapObject1Dimension5Length(); -}); +(GPU.isKernelMapSupported ? test : skip)( + 'createKernelMap object 1 dimension 5 length auto', + () => { + createKernelMapObject1Dimension5Length(); + } +); -(GPU.isKernelMapSupported ? test : skip)('createKernelMap object 1 dimension 5 length gpu', () => { - createKernelMapObject1Dimension5Length('gpu'); -}); +(GPU.isKernelMapSupported ? test : skip)( + 'createKernelMap object 1 dimension 5 length gpu', + () => { + createKernelMapObject1Dimension5Length('gpu'); + } +); -(GPU.isWebGLSupported ? test : skip)('createKernelMap object 1 dimension 5 length webgl', () => { - createKernelMapObject1Dimension5Length('webgl'); -}); +(GPU.isWebGLSupported ? test : skip)( + 'createKernelMap object 1 dimension 5 length webgl', + () => { + createKernelMapObject1Dimension5Length('webgl'); + } +); -(GPU.isWebGL2Supported ? test : skip)('createKernelMap object 1 dimension 5 length webgl2', () => { - createKernelMapObject1Dimension5Length('webgl2'); -}); +(GPU.isWebGL2Supported ? test : skip)( + 'createKernelMap object 1 dimension 5 length webgl2', + () => { + createKernelMapObject1Dimension5Length('webgl2'); + } +); -(GPU.isHeadlessGLSupported && GPU.isKernelMapSupported ? test : skip)('createKernelMap object 1 dimension 5 length headlessgl', () => { - createKernelMapObject1Dimension5Length('headlessgl'); -}); +(GPU.isHeadlessGLSupported && GPU.isKernelMapSupported ? test : skip)( + 'createKernelMap object 1 dimension 5 length headlessgl', + () => { + createKernelMapObject1Dimension5Length('headlessgl'); + } +); test('createKernelMap object 1 dimension 5 length cpu', () => { createKernelMapObject1Dimension5Length('cpu'); }); - function createKernelMapArrayAuto(mode) { - const gpu = new GPU({mode}); + const gpu = new GPU({ mode }); const superKernel = createArrayKernels(gpu, [5]); const kernel = createKernel(gpu, [5]); - const output = superKernel([1,2,3,4,5], [1,2,3,4,5], [1,2,3,4,5]); + const output = superKernel( + [1, 2, 3, 4, 5], + [1, 2, 3, 4, 5], + [1, 2, 3, 4, 5] + ); const result = Array.from(output.result); const addResult = Array.from(kernel(output[0])); const divideResult = Array.from(kernel(output[1])); @@ -184,9 +248,12 @@ function createKernelMapArrayAuto(mode) { createKernelMapArrayAuto('webgl2'); }); -(GPU.isHeadlessGLSupported && GPU.isKernelMapSupported ? test : skip)('createKernelMap array headlessgl', () => { - createKernelMapArrayAuto('headlessgl'); -}); +(GPU.isHeadlessGLSupported && GPU.isKernelMapSupported ? test : skip)( + 'createKernelMap array headlessgl', + () => { + createKernelMapArrayAuto('headlessgl'); + } +); test('createKernelMap array cpu', () => { createKernelMapArrayAuto('cpu'); @@ -194,16 +261,22 @@ test('createKernelMap array cpu', () => { function createKernelMap3DAuto(mode) { const gpu = new GPU({ mode }); + function saveTarget(value) { return value; } - const kernel = gpu.createKernelMap({ - target: saveTarget - }, function(value) { - return saveTarget(value); - }).setOutput([3,3,3]); + const kernel = gpu + .createKernelMap( + { + target: saveTarget, + }, + function (value) { + return saveTarget(value); + } + ) + .setOutput([3, 3, 3]); const result = kernel(1); - const target = createKernel(gpu, [3,3,3])(result.target); + const target = createKernel(gpu, [3, 3, 3])(result.target); assert.equal(result.result.length, 3); assert.equal(result.result[0].length, 3); assert.equal(result.result[0][0].length, 3); @@ -222,17 +295,23 @@ function createKernelMap3DAuto(mode) { createKernelMap3DAuto('gpu'); }); -(GPU.isWebGLSupported && GPU.isKernelMapSupported ? test : skip)('createKernelMap 3d webgl', () => { - createKernelMap3DAuto('webgl'); -}); +(GPU.isWebGLSupported && GPU.isKernelMapSupported ? test : skip)( + 'createKernelMap 3d webgl', + () => { + createKernelMap3DAuto('webgl'); + } +); (GPU.isWebGL2Supported ? test : skip)('createKernelMap 3d webgl2', () => { createKernelMap3DAuto('webgl2'); }); -(GPU.isHeadlessGLSupported && GPU.isKernelMapSupported ? test : skip)('createKernelMap 3d headlessgl', () => { - createKernelMap3DAuto('headlessgl'); -}); +(GPU.isHeadlessGLSupported && GPU.isKernelMapSupported ? test : skip)( + 'createKernelMap 3d headlessgl', + () => { + createKernelMap3DAuto('headlessgl'); + } +); test('createKernelMap 3d cpu', () => { createKernelMap3DAuto('cpu'); @@ -244,7 +323,7 @@ function createKernelMapArray2(mode) { { mapFunc: function mapFunc(mapFuncVal) { return mapFuncVal; - } + }, }, function main() { const mapFuncVal = [1, 2]; @@ -275,13 +354,19 @@ test('createKernelMap Array(2) gpu', () => { createKernelMapArray2('webgl'); }); -(GPU.isWebGL2Supported ? test : skip)('createKernelMap Array(2) webgl2', () => { - createKernelMapArray2('webgl2'); -}); +(GPU.isWebGL2Supported ? test : skip)( + 'createKernelMap Array(2) webgl2', + () => { + createKernelMapArray2('webgl2'); + } +); -(GPU.isHeadlessGLSupported ? test : skip)('createKernelMap Array(2) headlessgl', () => { - createKernelMapArray2('headlessgl'); -}); +(GPU.isHeadlessGLSupported ? test : skip)( + 'createKernelMap Array(2) headlessgl', + () => { + createKernelMapArray2('headlessgl'); + } +); test('createKernelMap Array(2) cpu', () => { createKernelMapArray2('cpu'); @@ -293,7 +378,7 @@ function createKernelMapArray3(mode) { { mapFunc: function mapFunc(mapFuncVal) { return mapFuncVal; - } + }, }, function main() { const mapFuncVal = [1, 2, 3]; @@ -324,13 +409,19 @@ test('createKernelMap Array(3) gpu', () => { createKernelMapArray3('webgl'); }); -(GPU.isWebGL2Supported ? test : skip)('createKernelMap Array(3) webgl2', () => { - createKernelMapArray3('webgl2'); -}); +(GPU.isWebGL2Supported ? test : skip)( + 'createKernelMap Array(3) webgl2', + () => { + createKernelMapArray3('webgl2'); + } +); -(GPU.isHeadlessGLSupported ? test : skip)('createKernelMap Array(3) headlessgl', () => { - createKernelMapArray3('headlessgl'); -}); +(GPU.isHeadlessGLSupported ? test : skip)( + 'createKernelMap Array(3) headlessgl', + () => { + createKernelMapArray3('headlessgl'); + } +); test('createKernelMap Array(3) cpu', () => { createKernelMapArray3('cpu'); @@ -342,7 +433,7 @@ function createKernelMapArray4(mode) { { mapFunc: function mapFunc(mapFuncVal) { return mapFuncVal; - } + }, }, function main() { const mapFuncVal = [1, 2, 3, 4]; @@ -373,14 +464,20 @@ test('createKernelMap Array(4) gpu', () => { createKernelMapArray4('webgl'); }); -(GPU.isWebGL2Supported ? test : skip)('createKernelMap Array(4) webgl2', () => { - createKernelMapArray4('webgl2'); -}); +(GPU.isWebGL2Supported ? test : skip)( + 'createKernelMap Array(4) webgl2', + () => { + createKernelMapArray4('webgl2'); + } +); -(GPU.isHeadlessGLSupported ? test : skip)('createKernelMap Array(4) headlessgl', () => { - createKernelMapArray4('headlessgl'); -}); +(GPU.isHeadlessGLSupported ? test : skip)( + 'createKernelMap Array(4) headlessgl', + () => { + createKernelMapArray4('headlessgl'); + } +); test('createKernelMap Array(4) cpu', () => { createKernelMapArray4('cpu'); -}); \ No newline at end of file +}); diff --git a/test/features/demo.js b/test/features/demo.js index c31af05c..f247fc60 100644 --- a/test/features/demo.js +++ b/test/features/demo.js @@ -1,5 +1,5 @@ const { assert, skip, test, module: describe } = require('qunit'); -const { GPU } = require('../../src'); +const { GPU } = require('../..'); describe('features: demo'); @@ -9,8 +9,9 @@ function demo(mode) { let b = new Array(matrixSize * matrixSize); a = splitArray(fillArrayRandom(a), matrixSize); b = splitArray(fillArrayRandom(b), matrixSize); + function fillArrayRandom(array) { - for(let i = 0; i < array.length; i++) { + for (let i = 0; i < array.length; i++) { array[i] = Math.random(); } return array; @@ -18,46 +19,47 @@ function demo(mode) { function splitArray(array, part) { const result = []; - for(let i = 0; i < array.length; i += part) { + for (let i = 0; i < array.length; i += part) { result.push(array.slice(i, i + part)); } return result; } const gpu = new GPU({ mode }); - const multiplyMatrix = gpu.createKernel(function(a, b) { - let sum = 0; - for (let i = 0; i < 6; i++) { - sum += a[this.thread.y][i] * b[i][this.thread.x]; - } - return sum; - }) + const multiplyMatrix = gpu + .createKernel(function (a, b) { + let sum = 0; + for (let i = 0; i < 6; i++) { + sum += a[this.thread.y][i] * b[i][this.thread.x]; + } + return sum; + }) .setOutput([6, 6]); - assert.ok( multiplyMatrix !== null, "function generated test"); - assert.equal(multiplyMatrix(a, b).length, 6, "basic return function test"); + assert.ok(multiplyMatrix !== null, 'function generated test'); + assert.equal(multiplyMatrix(a, b).length, 6, 'basic return function test'); gpu.destroy(); } -test("auto", () => { +test('auto', () => { demo(); }); -test("gpu", () => { +test('gpu', () => { demo('gpu'); }); -(GPU.isWebGLSupported ? test : skip)("webgl", function () { +(GPU.isWebGLSupported ? test : skip)('webgl', function () { demo('webgl'); }); -(GPU.isWebGL2Supported ? test : skip)("webgl2", function () { +(GPU.isWebGL2Supported ? test : skip)('webgl2', function () { demo('webgl2'); }); -(GPU.isHeadlessGLSupported ? test : skip)("headlessgl", function () { +(GPU.isHeadlessGLSupported ? test : skip)('headlessgl', function () { demo('headlessgl'); }); -test("cpu", () => { +test('cpu', () => { demo('cpu'); }); diff --git a/test/features/destroy.js b/test/features/destroy.js index 2f2a72e0..346ae51f 100644 --- a/test/features/destroy.js +++ b/test/features/destroy.js @@ -1,5 +1,5 @@ const { assert, skip, test, module: describe } = require('qunit'); -const { GPU, WebGLKernel } = require('../../src'); +const { GPU, WebGLKernel } = require('../..'); const sinon = require('sinon'); describe('features: destroy'); @@ -10,21 +10,20 @@ function testWithoutDestroyContext(done, mode) { gpu.kernels.push({ kernel: { constructor: { - destroyContext: null - } + destroyContext: null, + }, }, - destroy: destroyKernel + destroy: destroyKernel, }); gpu.destroy(); - gpu.destroy() - .then(() => { - assert.equal(destroyKernel.callCount, 2); - assert.ok(true); - done(); - }); + gpu.destroy().then(() => { + assert.equal(destroyKernel.callCount, 2); + assert.ok(true); + done(); + }); } -test('without destroy context', (t) => { +test('without destroy context', t => { const done = t.async(); testWithoutDestroyContext(done); }); @@ -36,27 +35,25 @@ function testWithDestroyContext(done, mode) { gpu.kernels.push({ kernel: { constructor: { - destroyContext: destroyContextSpy - } + destroyContext: destroyContextSpy, + }, }, - destroy: destroyKernel + destroy: destroyKernel, }); gpu.destroy(); - gpu.destroy() - .then(() => { - assert.equal(destroyKernel.callCount, 2); - assert.equal(destroyContextSpy.callCount, 2); - assert.ok(true); - done(); - }); + gpu.destroy().then(() => { + assert.equal(destroyKernel.callCount, 2); + assert.equal(destroyContextSpy.callCount, 2); + assert.ok(true); + done(); + }); } -test('with destroy context', (t) => { +test('with destroy context', t => { const done = t.async(); testWithDestroyContext(done); }); - function testTexturesAreDestroyed(done, mode) { const mockTexture1 = {}; const mockTexture2 = {}; @@ -70,16 +67,16 @@ function testTexturesAreDestroyed(done, mode) { context: mockContext, destroyExtensions: () => {}, }; - mockKernelInstance.destroy = WebGLKernel.prototype.destroy.bind(mockKernelInstance); - GPU.prototype.destroy.call({ kernels: [mockKernelInstance] }) - .then(() => { - assert.equal(deleteTextureMock.callCount, 3); - assert.ok(true); - done(); - }); + mockKernelInstance.destroy = + WebGLKernel.prototype.destroy.bind(mockKernelInstance); + GPU.prototype.destroy.call({ kernels: [mockKernelInstance] }).then(() => { + assert.equal(deleteTextureMock.callCount, 3); + assert.ok(true); + done(); + }); } -test('textures are destroyed', (t) => { +test('textures are destroyed', t => { const done = t.async(); testTexturesAreDestroyed(done); }); @@ -98,23 +95,23 @@ function testKernelTextureIsDeleted(done) { context: mockContext, destroyExtensions: () => {}, }; - mockKernelInstance.destroy = WebGLKernel.prototype.destroy.bind(mockKernelInstance); - GPU.prototype.destroy.call({ kernels: [mockKernelInstance] }) - .then(() => { - assert.equal(mockTextureDelete.callCount, 1); - assert.ok(true); - done(); - }); + mockKernelInstance.destroy = + WebGLKernel.prototype.destroy.bind(mockKernelInstance); + GPU.prototype.destroy.call({ kernels: [mockKernelInstance] }).then(() => { + assert.equal(mockTextureDelete.callCount, 1); + assert.ok(true); + done(); + }); } -test('kernel.texture is deleted', (t) => { +test('kernel.texture is deleted', t => { const done = t.async(); testKernelTextureIsDeleted(done); }); function testKernelMappedTexturesAreDeleted(done) { const mockGPU = { - kernels: [] + kernels: [], }; const webGLTexture1 = {}; const mockTextureDelete1 = sinon.spy(); @@ -137,8 +134,10 @@ function testKernelMappedTexturesAreDeleted(done) { destroyExtensions: () => {}, }; mockGPU.kernels.push(mockKernelInstance); - mockKernelInstance.destroy = WebGLKernel.prototype.destroy.bind(mockKernelInstance); - GPU.prototype.destroy.call({ kernels: [mockKernelInstance] }) + mockKernelInstance.destroy = + WebGLKernel.prototype.destroy.bind(mockKernelInstance); + GPU.prototype.destroy + .call({ kernels: [mockKernelInstance] }) .then(() => { assert.equal(mockTextureDelete1.callCount, 1); assert.equal(mockTextureDelete2.callCount, 1); @@ -146,19 +145,19 @@ function testKernelMappedTexturesAreDeleted(done) { assert.ok(true); done(); }) - .catch((e) => { + .catch(e => { console.error(e); }); } -test('kernel.mappedTextures are deleted', (t) => { +test('kernel.mappedTextures are deleted', t => { const done = t.async(); testKernelMappedTexturesAreDeleted(done); }); test('gpu.kernels is populated and removed by kernel', () => { const gpu = new GPU(); - const kernel = gpu.createKernel(function() { + const kernel = gpu.createKernel(function () { return 1; }); assert.equal(gpu.kernels.length, 1); @@ -171,15 +170,14 @@ test('gpu.kernels is populated and removed by kernel', () => { test('gpu.kernels is populated and removed by gpu', t => { const done = t.async(); const gpu = new GPU(); - const kernel = gpu.createKernel(function() { + const kernel = gpu.createKernel(function () { return 1; }); assert.equal(gpu.kernels.length, 1); assert.equal(gpu.kernels.indexOf(kernel.kernel), 0); - gpu.destroy() - .then(() => { - assert.equal(gpu.kernels.length, 0); - done(); - }); + gpu.destroy().then(() => { + assert.equal(gpu.kernels.length, 0); + done(); + }); }); diff --git a/test/features/destructured-assignment.js b/test/features/destructured-assignment.js index 3687247c..252dbbec 100644 --- a/test/features/destructured-assignment.js +++ b/test/features/destructured-assignment.js @@ -1,15 +1,23 @@ const { assert, skip, test, module: describe, only } = require('qunit'); -const { GPU } = require('../../src'); +const { GPU } = require('../..'); describe('features: destructured assignment'); function testObject(mode) { const gpu = new GPU({ mode }); - const kernel = gpu.createKernel(function() { - const { thread: { x, y } } = this; - return x + y; - }, { output: [2, 2] }); - assert.deepEqual(kernel(), [new Float32Array([0, 1]), new Float32Array([1, 2])]); + const kernel = gpu.createKernel( + function () { + const { + thread: { x, y }, + } = this; + return x + y; + }, + { output: [2, 2] } + ); + assert.deepEqual(kernel(), [ + new Float32Array([0, 1]), + new Float32Array([1, 2]), + ]); } test('object auto', () => { @@ -38,11 +46,17 @@ test('object cpu', () => { function testNestedObject(mode) { const gpu = new GPU({ mode }); - const kernel = gpu.createKernel(function() { - const { x, y } = this.thread; - return x + y; - }, { output: [2, 2] }); - assert.deepEqual(kernel(), [new Float32Array([0, 1]), new Float32Array([1, 2])]); + const kernel = gpu.createKernel( + function () { + const { x, y } = this.thread; + return x + y; + }, + { output: [2, 2] } + ); + assert.deepEqual(kernel(), [ + new Float32Array([0, 1]), + new Float32Array([1, 2]), + ]); } test('nested object auto', () => { @@ -71,10 +85,13 @@ test('nested object cpu', () => { function testArray(mode) { const gpu = new GPU({ mode }); - const kernel = gpu.createKernel(function(array) { - const [first, second] = array; - return first + second; - }, { output: [1], argumentTypes: { array: 'Array(2)' } }); + const kernel = gpu.createKernel( + function (array) { + const [first, second] = array; + return first + second; + }, + { output: [1], argumentTypes: { array: 'Array(2)' } } + ); assert.deepEqual(kernel([1, 2]), new Float32Array([3])); } @@ -100,4 +117,4 @@ test('array gpu', () => { test('array cpu', () => { testArray('cpu'); -}); \ No newline at end of file +}); diff --git a/test/features/dev-mode.js b/test/features/dev-mode.js index 4e2a9ae0..b17710d7 100644 --- a/test/features/dev-mode.js +++ b/test/features/dev-mode.js @@ -1,13 +1,16 @@ const { assert, skip, test, module: describe, only } = require('qunit'); -const { GPU, input } = require('../../src'); +const { GPU, input } = require('../..'); describe('features: dev mode'); test('are added to GPU instance .kernels property', () => { const gpu = new GPU({ mode: 'dev' }); - const kernel = gpu.createKernel(function(value) { - return value; - }, { output: [1] }); + const kernel = gpu.createKernel( + function (value) { + return value; + }, + { output: [1] } + ); assert.equal(gpu.kernels.length, 1); assert.deepEqual(kernel(1), new Float32Array([1])); gpu.destroy(); @@ -15,156 +18,173 @@ test('are added to GPU instance .kernels property', () => { test('works with integer', () => { const gpu = new GPU({ mode: 'dev' }); - const kernel = gpu.createKernel(function(value) { - return value; - }, { output: [1] }); + const kernel = gpu.createKernel( + function (value) { + return value; + }, + { output: [1] } + ); assert.deepEqual(kernel(1), new Float32Array([1])); gpu.destroy(); }); test('works with float', () => { const gpu = new GPU({ mode: 'dev' }); - const kernel = gpu.createKernel(function(value) { - return value; - }, { output: [1] }); + const kernel = gpu.createKernel( + function (value) { + return value; + }, + { output: [1] } + ); assert.deepEqual(kernel(1.5), new Float32Array([1.5])); gpu.destroy(); }); test('works with array', () => { const gpu = new GPU({ mode: 'dev' }); - const kernel = gpu.createKernel(function(value) { - return value[this.thread.x]; - }, { output: [4] }); - assert.deepEqual(kernel([1,2,3,4]), new Float32Array([1,2,3,4])); + const kernel = gpu.createKernel( + function (value) { + return value[this.thread.x]; + }, + { output: [4] } + ); + assert.deepEqual(kernel([1, 2, 3, 4]), new Float32Array([1, 2, 3, 4])); gpu.destroy(); }); test('works with matrix', () => { const gpu = new GPU({ mode: 'dev' }); - const kernel = gpu.createKernel(function(value) { - return value[this.thread.y][this.thread.x]; - }, { output: [4, 2] }); - assert.deepEqual(kernel( - [ - [1,2,3,4], - [5,6,7,8] - ] - ), [ - new Float32Array([1,2,3,4]), - new Float32Array([5,6,7,8]), - ]); + const kernel = gpu.createKernel( + function (value) { + return value[this.thread.y][this.thread.x]; + }, + { output: [4, 2] } + ); + assert.deepEqual( + kernel([ + [1, 2, 3, 4], + [5, 6, 7, 8], + ]), + [new Float32Array([1, 2, 3, 4]), new Float32Array([5, 6, 7, 8])] + ); gpu.destroy(); }); test('works with cube', () => { const gpu = new GPU({ mode: 'dev' }); - const kernel = gpu.createKernel(function(value) { - return value[this.thread.z][this.thread.y][this.thread.x]; - }, { output: [4, 2, 2] }); - assert.deepEqual(kernel( - [ + const kernel = gpu.createKernel( + function (value) { + return value[this.thread.z][this.thread.y][this.thread.x]; + }, + { output: [4, 2, 2] } + ); + assert.deepEqual( + kernel([ [ - [1,2,3,4], - [5,6,7,8] + [1, 2, 3, 4], + [5, 6, 7, 8], ], [ - [9,10,11,12], - [13,14,15,16] - ] - ] - ), [ + [9, 10, 11, 12], + [13, 14, 15, 16], + ], + ]), [ - new Float32Array([1,2,3,4]), - new Float32Array([5,6,7,8]), - ],[ - new Float32Array([9,10,11,12]), - new Float32Array([13,14,15,16]), + [new Float32Array([1, 2, 3, 4]), new Float32Array([5, 6, 7, 8])], + [new Float32Array([9, 10, 11, 12]), new Float32Array([13, 14, 15, 16])], ] - ]); + ); gpu.destroy(); }); test('works with input array', () => { const gpu = new GPU({ mode: 'dev' }); - const kernel = gpu.createKernel(function(value) { - return value[this.thread.x]; - }, { output: [4] }); - assert.deepEqual(kernel(input([1,2,3,4], [4])), new Float32Array([1,2,3,4])); + const kernel = gpu.createKernel( + function (value) { + return value[this.thread.x]; + }, + { output: [4] } + ); + assert.deepEqual( + kernel(input([1, 2, 3, 4], [4])), + new Float32Array([1, 2, 3, 4]) + ); gpu.destroy(); }); test('works with input matrix', () => { const gpu = new GPU({ mode: 'dev' }); - const kernel = gpu.createKernel(function(value) { - return value[this.thread.y][this.thread.x]; - }, { output: [4, 2] }); - assert.deepEqual(kernel(input([1,2,3,4,5,6,7,8], [4, 2])), [ - new Float32Array([1,2,3,4]), - new Float32Array([5,6,7,8]), + const kernel = gpu.createKernel( + function (value) { + return value[this.thread.y][this.thread.x]; + }, + { output: [4, 2] } + ); + assert.deepEqual(kernel(input([1, 2, 3, 4, 5, 6, 7, 8], [4, 2])), [ + new Float32Array([1, 2, 3, 4]), + new Float32Array([5, 6, 7, 8]), ]); gpu.destroy(); }); test('works with input cube', () => { const gpu = new GPU({ mode: 'dev' }); - const kernel = gpu.createKernel(function(value) { - return value[this.thread.z][this.thread.y][this.thread.x]; - }, { output: [4, 2, 2] }); - assert.deepEqual(kernel( - input([1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16], [4,2,2]) - ), [ + const kernel = gpu.createKernel( + function (value) { + return value[this.thread.z][this.thread.y][this.thread.x]; + }, + { output: [4, 2, 2] } + ); + assert.deepEqual( + kernel( + input([1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16], [4, 2, 2]) + ), [ - new Float32Array([1,2,3,4]), - new Float32Array([5,6,7,8]), - ],[ - new Float32Array([9,10,11,12]), - new Float32Array([13,14,15,16]), + [new Float32Array([1, 2, 3, 4]), new Float32Array([5, 6, 7, 8])], + [new Float32Array([9, 10, 11, 12]), new Float32Array([13, 14, 15, 16])], ] - ]); + ); gpu.destroy(); }); test('works with texture', () => { - const texture = ((new GPU()).createKernel(function (cube) { - return cube[this.thread.z][this.thread.y][this.thread.x]; - }, { output: [4,2,2], pipeline: true }))([ - [ - new Float32Array([1,2,3,4]), - new Float32Array([5,6,7,8]), - ],[ - new Float32Array([9,10,11,12]), - new Float32Array([13,14,15,16]), - ] + const texture = new GPU().createKernel( + function (cube) { + return cube[this.thread.z][this.thread.y][this.thread.x]; + }, + { output: [4, 2, 2], pipeline: true } + )([ + [new Float32Array([1, 2, 3, 4]), new Float32Array([5, 6, 7, 8])], + [new Float32Array([9, 10, 11, 12]), new Float32Array([13, 14, 15, 16])], ]); assert.ok(texture.constructor.name.match('Texture')); const gpu = new GPU({ mode: 'dev' }); - const kernel = gpu.createKernel(function(value) { - return value[this.thread.z][this.thread.y][this.thread.x]; - }, { output: [4, 2, 2] }); - assert.deepEqual(kernel( - texture - ), [ - [ - new Float32Array([1,2,3,4]), - new Float32Array([5,6,7,8]), - ],[ - new Float32Array([9,10,11,12]), - new Float32Array([13,14,15,16]), - ] + const kernel = gpu.createKernel( + function (value) { + return value[this.thread.z][this.thread.y][this.thread.x]; + }, + { output: [4, 2, 2] } + ); + assert.deepEqual(kernel(texture), [ + [new Float32Array([1, 2, 3, 4]), new Float32Array([5, 6, 7, 8])], + [new Float32Array([9, 10, 11, 12]), new Float32Array([13, 14, 15, 16])], ]); gpu.destroy(); }); test('works with adding functions', () => { const gpu = new GPU({ mode: 'dev' }); + function addOne(value) { return value + 1; } gpu.addFunction(addOne); - const kernel = gpu.createKernel(function(value) { - return addOne(value); - }, { output: [1] }); + const kernel = gpu.createKernel( + function (value) { + return addOne(value); + }, + { output: [1] } + ); assert.deepEqual(kernel(1), new Float32Array([2])); gpu.destroy(); }); diff --git a/test/features/dynamic-arguments.js b/test/features/dynamic-arguments.js index efbe031c..6339af29 100644 --- a/test/features/dynamic-arguments.js +++ b/test/features/dynamic-arguments.js @@ -1,5 +1,5 @@ const { assert, skip, test, module: describe, only } = require('qunit'); -const { GPU, input } = require('../../src'); +const { GPU, input } = require('../..'); describe('features: dynamic arguments'); @@ -16,10 +16,11 @@ function testHTMLImage(done, mode) { function loaded() { const gpu = new GPU({ mode }); - const kernel = gpu.createKernel(function(image) { - const pixel = image[this.thread.y][this.thread.x]; - return (pixel[0] + pixel[1] + pixel[2]) / 3; - }) + const kernel = gpu + .createKernel(function (image) { + const pixel = image[this.thread.y][this.thread.x]; + return (pixel[0] + pixel[1] + pixel[2]) / 3; + }) .setDynamicArguments(true) .setDynamicOutput(true) .setOutput([276, 183]); @@ -28,12 +29,12 @@ function testHTMLImage(done, mode) { kernel.setOutput([138, 91]); const pixels2 = kernel(image2); - assert.ok(pixels1[0][0] > .43); - assert.ok(pixels1[0][0] < .45); + assert.ok(pixels1[0][0] > 0.43); + assert.ok(pixels1[0][0] < 0.45); assert.equal(pixels1.length, image1.height); assert.equal(pixels1[0].length, image1.width); - assert.ok(pixels2[0][0] > .82); - assert.ok(pixels2[0][0] < .83); + assert.ok(pixels2[0][0] > 0.82); + assert.ok(pixels2[0][0] < 0.83); assert.equal(pixels2.length, image2.height); assert.equal(pixels2[0].length, image2.width); @@ -46,13 +47,19 @@ function testHTMLImage(done, mode) { testHTMLImage(t.async()); }); -(typeof Image !== 'undefined' && GPU.isWebGLSupported ? test : skip)('HTML Image webgl', t => { - testHTMLImage(t.async(), 'webgl'); -}); +(typeof Image !== 'undefined' && GPU.isWebGLSupported ? test : skip)( + 'HTML Image webgl', + t => { + testHTMLImage(t.async(), 'webgl'); + } +); -(typeof Image !== 'undefined' && GPU.isWebGL2Supported ? test : skip)('HTML Image webgl2', t => { - testHTMLImage(t.async(), 'webgl2'); -}); +(typeof Image !== 'undefined' && GPU.isWebGL2Supported ? test : skip)( + 'HTML Image webgl2', + t => { + testHTMLImage(t.async(), 'webgl2'); + } +); (typeof Image !== 'undefined' ? test : skip)('HTML Image cpu', t => { testHTMLImage(t.async(), 'cpu'); @@ -61,172 +68,187 @@ function testHTMLImage(done, mode) { function testMemoryOptimizedNumberTexture(mode) { const gpu = new GPU({ mode }); const matrix4X4 = [ - [1,2,3,4], - [5,6,7,8], - [9,10,11,12], - [13,14,15,16], + [1, 2, 3, 4], + [5, 6, 7, 8], + [9, 10, 11, 12], + [13, 14, 15, 16], ]; - const texture4X4 = ( - gpu.createKernel(function(value) { + const texture4X4 = gpu + .createKernel(function (value) { return value[this.thread.y][this.thread.x]; }) - .setOutput([4, 4]) - .setPrecision('single') - .setOptimizeFloatMemory(true) - .setPipeline(true) - )(matrix4X4); + .setOutput([4, 4]) + .setPrecision('single') + .setOptimizeFloatMemory(true) + .setPipeline(true)(matrix4X4); const matrix3X3 = [ - [1,2,3], - [4,5,6], - [7,8,9] + [1, 2, 3], + [4, 5, 6], + [7, 8, 9], ]; - const texture3X3 = ( - gpu.createKernel(function(value) { + const texture3X3 = gpu + .createKernel(function (value) { return value[this.thread.y][this.thread.x]; }) - .setOutput([3, 3]) - .setPrecision('single') - .setOptimizeFloatMemory(true) - .setPipeline(true) - )(matrix3X3); + .setOutput([3, 3]) + .setPrecision('single') + .setOptimizeFloatMemory(true) + .setPipeline(true)(matrix3X3); const matrix2X2 = [ - [1,2], - [3,4] + [1, 2], + [3, 4], ]; - const texture2X2 = ( - gpu.createKernel(function(value) { + const texture2X2 = gpu + .createKernel(function (value) { return value[this.thread.y][this.thread.x]; }) - .setOutput([2, 2]) - .setPrecision('single') - .setOptimizeFloatMemory(true) - .setPipeline(true) - )(matrix2X2); - - const kernel = gpu.createKernel(function(texture) { - return texture[this.thread.y][this.thread.x]; - }) + .setOutput([2, 2]) + .setPrecision('single') + .setOptimizeFloatMemory(true) + .setPipeline(true)(matrix2X2); + + const kernel = gpu + .createKernel(function (texture) { + return texture[this.thread.y][this.thread.x]; + }) .setDynamicArguments(true) .setDynamicOutput(true) .setOptimizeFloatMemory(true) - .setOutput([4,4]); + .setOutput([4, 4]); assert.deepEqual(kernel(texture4X4), [ - new Float32Array([1,2,3,4]), - new Float32Array([5,6,7,8]), - new Float32Array([9,10,11,12]), - new Float32Array([13,14,15,16]), + new Float32Array([1, 2, 3, 4]), + new Float32Array([5, 6, 7, 8]), + new Float32Array([9, 10, 11, 12]), + new Float32Array([13, 14, 15, 16]), ]); kernel.setOutput([3, 3]); assert.deepEqual(kernel(texture3X3), [ - new Float32Array([1,2,3]), - new Float32Array([4,5,6]), - new Float32Array([7,8,9]), + new Float32Array([1, 2, 3]), + new Float32Array([4, 5, 6]), + new Float32Array([7, 8, 9]), ]); kernel.setOutput([2, 2]); assert.deepEqual(kernel(texture2X2), [ - new Float32Array([1,2]), - new Float32Array([3,4]), + new Float32Array([1, 2]), + new Float32Array([3, 4]), ]); - assert.ok(kernel.kernelArguments[0].constructor.name.match('DynamicMemoryOptimizedNumberTexture')); + assert.ok( + kernel.kernelArguments[0].constructor.name.match( + 'DynamicMemoryOptimizedNumberTexture' + ) + ); gpu.destroy(); } -(GPU.isSinglePrecisionSupported ? test : skip)('MemoryOptimizedNumberTexture (GPU only) auto', () => { - testMemoryOptimizedNumberTexture(); -}); +(GPU.isSinglePrecisionSupported ? test : skip)( + 'MemoryOptimizedNumberTexture (GPU only) auto', + () => { + testMemoryOptimizedNumberTexture(); + } +); -(GPU.isSinglePrecisionSupported ? test : skip)('MemoryOptimizedNumberTexture (GPU only) gpu', () => { - testMemoryOptimizedNumberTexture('gpu'); -}); +(GPU.isSinglePrecisionSupported ? test : skip)( + 'MemoryOptimizedNumberTexture (GPU only) gpu', + () => { + testMemoryOptimizedNumberTexture('gpu'); + } +); -(GPU.isSinglePrecisionSupported && GPU.isWebGLSupported ? test : skip)('MemoryOptimizedNumberTexture (GPU only) webgl', () => { - testMemoryOptimizedNumberTexture('webgl'); -}); +(GPU.isSinglePrecisionSupported && GPU.isWebGLSupported ? test : skip)( + 'MemoryOptimizedNumberTexture (GPU only) webgl', + () => { + testMemoryOptimizedNumberTexture('webgl'); + } +); -(GPU.isSinglePrecisionSupported && GPU.isWebGL2Supported ? test : skip)('MemoryOptimizedNumberTexture (GPU only) webgl2', () => { - testMemoryOptimizedNumberTexture('webgl2'); -}); +(GPU.isSinglePrecisionSupported && GPU.isWebGL2Supported ? test : skip)( + 'MemoryOptimizedNumberTexture (GPU only) webgl2', + () => { + testMemoryOptimizedNumberTexture('webgl2'); + } +); -(GPU.isSinglePrecisionSupported && GPU.isHeadlessGLSupported ? test : skip)('MemoryOptimizedNumberTexture (GPU only) headlessgl', () => { - testMemoryOptimizedNumberTexture('headlessgl'); -}); +(GPU.isSinglePrecisionSupported && GPU.isHeadlessGLSupported ? test : skip)( + 'MemoryOptimizedNumberTexture (GPU only) headlessgl', + () => { + testMemoryOptimizedNumberTexture('headlessgl'); + } +); function testNumberTexture(mode) { const gpu = new GPU({ mode }); const matrix4X4 = [ - [1,2,3,4], - [5,6,7,8], - [9,10,11,12], - [13,14,15,16], + [1, 2, 3, 4], + [5, 6, 7, 8], + [9, 10, 11, 12], + [13, 14, 15, 16], ]; - const texture4X4 = ( - gpu.createKernel(function(value) { + const texture4X4 = gpu + .createKernel(function (value) { return value[this.thread.y][this.thread.x]; }) - .setOutput([4, 4]) - .setPrecision('single') - .setPipeline(true) - )(matrix4X4); + .setOutput([4, 4]) + .setPrecision('single') + .setPipeline(true)(matrix4X4); const matrix3X3 = [ - [1,2,3], - [4,5,6], - [7,8,9] + [1, 2, 3], + [4, 5, 6], + [7, 8, 9], ]; - const texture3X3 = ( - gpu.createKernel(function(value) { + const texture3X3 = gpu + .createKernel(function (value) { return value[this.thread.y][this.thread.x]; }) - .setOutput([3, 3]) - .setPrecision('single') - .setPipeline(true) - )(matrix3X3); + .setOutput([3, 3]) + .setPrecision('single') + .setPipeline(true)(matrix3X3); const matrix2X2 = [ - [1,2], - [3,4] + [1, 2], + [3, 4], ]; - const texture2X2 = ( - gpu.createKernel(function(value) { + const texture2X2 = gpu + .createKernel(function (value) { return value[this.thread.y][this.thread.x]; }) - .setOutput([2, 2]) - .setPrecision('single') - .setPipeline(true) - )(matrix2X2); - - const kernel = gpu.createKernel(function(texture) { - return texture[this.thread.y][this.thread.x]; - }) + .setOutput([2, 2]) + .setPrecision('single') + .setPipeline(true)(matrix2X2); + + const kernel = gpu + .createKernel(function (texture) { + return texture[this.thread.y][this.thread.x]; + }) .setDynamicArguments(true) .setDynamicOutput(true) - .setOutput([4,4]); + .setOutput([4, 4]); assert.deepEqual(kernel(texture4X4), [ - new Float32Array([1,2,3,4]), - new Float32Array([5,6,7,8]), - new Float32Array([9,10,11,12]), - new Float32Array([13,14,15,16]), + new Float32Array([1, 2, 3, 4]), + new Float32Array([5, 6, 7, 8]), + new Float32Array([9, 10, 11, 12]), + new Float32Array([13, 14, 15, 16]), ]); kernel.setOutput([3, 3]); assert.deepEqual(kernel(texture3X3), [ - new Float32Array([1,2,3]), - new Float32Array([4,5,6]), - new Float32Array([7,8,9]), + new Float32Array([1, 2, 3]), + new Float32Array([4, 5, 6]), + new Float32Array([7, 8, 9]), ]); kernel.setOutput([2, 2]); assert.deepEqual(kernel(texture2X2), [ - new Float32Array([1,2]), - new Float32Array([3,4]), + new Float32Array([1, 2]), + new Float32Array([3, 4]), ]); assert.ok(kernel.kernelArguments[0].constructor.name.match('NumberTexture')); @@ -234,97 +256,110 @@ function testNumberTexture(mode) { gpu.destroy(); } -(GPU.isSinglePrecisionSupported ? test : skip)('NumberTexture (GPU only) auto', () => { - testNumberTexture(); -}); +(GPU.isSinglePrecisionSupported ? test : skip)( + 'NumberTexture (GPU only) auto', + () => { + testNumberTexture(); + } +); -(GPU.isSinglePrecisionSupported ? test : skip)('NumberTexture (GPU only) gpu', () => { - testNumberTexture('gpu'); -}); +(GPU.isSinglePrecisionSupported ? test : skip)( + 'NumberTexture (GPU only) gpu', + () => { + testNumberTexture('gpu'); + } +); -(GPU.isSinglePrecisionSupported && GPU.isWebGLSupported ? test : skip)('NumberTexture (GPU only) webgl', () => { - testNumberTexture('webgl'); -}); +(GPU.isSinglePrecisionSupported && GPU.isWebGLSupported ? test : skip)( + 'NumberTexture (GPU only) webgl', + () => { + testNumberTexture('webgl'); + } +); -(GPU.isSinglePrecisionSupported && GPU.isWebGL2Supported ? test : skip)('NumberTexture (GPU only) webgl2', () => { - testNumberTexture('webgl2'); -}); +(GPU.isSinglePrecisionSupported && GPU.isWebGL2Supported ? test : skip)( + 'NumberTexture (GPU only) webgl2', + () => { + testNumberTexture('webgl2'); + } +); -(GPU.isSinglePrecisionSupported && GPU.isHeadlessGLSupported ? test : skip)('NumberTexture (GPU only) headlessgl', () => { - testNumberTexture('headlessgl'); -}); +(GPU.isSinglePrecisionSupported && GPU.isHeadlessGLSupported ? test : skip)( + 'NumberTexture (GPU only) headlessgl', + () => { + testNumberTexture('headlessgl'); + } +); function testMixedNumberTexture(mode) { const gpu = new GPU({ mode }); const matrix4X4 = [ - [1,2,3,4], - [5,6,7,8], - [9,10,11,12], - [13,14,15,16], + [1, 2, 3, 4], + [5, 6, 7, 8], + [9, 10, 11, 12], + [13, 14, 15, 16], ]; - const texture4X4 = ( - gpu.createKernel(function(value) { + const texture4X4 = gpu + .createKernel(function (value) { return value[this.thread.y][this.thread.x]; }) - .setOutput([4, 4]) - .setPrecision('single') - .setOptimizeFloatMemory(true) - .setPipeline(true) - )(matrix4X4); + .setOutput([4, 4]) + .setPrecision('single') + .setOptimizeFloatMemory(true) + .setPipeline(true)(matrix4X4); const matrix3X3 = [ - [1,2,3], - [4,5,6], - [7,8,9] + [1, 2, 3], + [4, 5, 6], + [7, 8, 9], ]; - const texture3X3 = ( - gpu.createKernel(function(value) { + const texture3X3 = gpu + .createKernel(function (value) { return value[this.thread.y][this.thread.x]; }) - .setOutput([3, 3]) - .setPrecision('single') - .setOptimizeFloatMemory(true) - .setPipeline(true) - )(matrix3X3); + .setOutput([3, 3]) + .setPrecision('single') + .setOptimizeFloatMemory(true) + .setPipeline(true)(matrix3X3); const matrix2X2 = [ - [1,2], - [3,4] + [1, 2], + [3, 4], ]; - const texture2X2 = ( - gpu.createKernel(function(value) { + const texture2X2 = gpu + .createKernel(function (value) { return value[this.thread.y][this.thread.x]; }) - .setOutput([2, 2]) - .setPrecision('single') - .setPipeline(true) - )(matrix2X2); - - const kernel = gpu.createKernel(function(texture) { - return texture[this.thread.y][this.thread.x]; - }) + .setOutput([2, 2]) + .setPrecision('single') + .setPipeline(true)(matrix2X2); + + const kernel = gpu + .createKernel(function (texture) { + return texture[this.thread.y][this.thread.x]; + }) .setDynamicArguments(true) .setDynamicOutput(true) - .setOutput([4,4]); + .setOutput([4, 4]); assert.deepEqual(kernel(texture4X4), [ - new Float32Array([1,2,3,4]), - new Float32Array([5,6,7,8]), - new Float32Array([9,10,11,12]), - new Float32Array([13,14,15,16]), + new Float32Array([1, 2, 3, 4]), + new Float32Array([5, 6, 7, 8]), + new Float32Array([9, 10, 11, 12]), + new Float32Array([13, 14, 15, 16]), ]); kernel.setOutput([3, 3]); assert.deepEqual(kernel(texture3X3), [ - new Float32Array([1,2,3]), - new Float32Array([4,5,6]), - new Float32Array([7,8,9]), + new Float32Array([1, 2, 3]), + new Float32Array([4, 5, 6]), + new Float32Array([7, 8, 9]), ]); kernel.setOutput([2, 2]); assert.deepEqual(kernel(texture2X2), [ - new Float32Array([1,2]), - new Float32Array([3,4]), + new Float32Array([1, 2]), + new Float32Array([3, 4]), ]); assert.ok(kernel.kernelArguments[0].constructor.name.match('NumberTexture')); @@ -332,46 +367,61 @@ function testMixedNumberTexture(mode) { gpu.destroy(); } -(GPU.isSinglePrecisionSupported ? test : skip)('Mixed NumberTexture (GPU only) auto', () => { - testMixedNumberTexture(); -}); +(GPU.isSinglePrecisionSupported ? test : skip)( + 'Mixed NumberTexture (GPU only) auto', + () => { + testMixedNumberTexture(); + } +); -(GPU.isSinglePrecisionSupported ? test : skip)('Mixed NumberTexture (GPU only) gpu', () => { - testMixedNumberTexture('gpu'); -}); +(GPU.isSinglePrecisionSupported ? test : skip)( + 'Mixed NumberTexture (GPU only) gpu', + () => { + testMixedNumberTexture('gpu'); + } +); -(GPU.isSinglePrecisionSupported && GPU.isWebGLSupported ? test : skip)('Mixed NumberTexture (GPU only) webgl', () => { - testMixedNumberTexture('webgl'); -}); +(GPU.isSinglePrecisionSupported && GPU.isWebGLSupported ? test : skip)( + 'Mixed NumberTexture (GPU only) webgl', + () => { + testMixedNumberTexture('webgl'); + } +); -(GPU.isSinglePrecisionSupported && GPU.isWebGL2Supported ? test : skip)('Mixed NumberTexture (GPU only) webgl2', () => { - testMixedNumberTexture('webgl2'); -}); +(GPU.isSinglePrecisionSupported && GPU.isWebGL2Supported ? test : skip)( + 'Mixed NumberTexture (GPU only) webgl2', + () => { + testMixedNumberTexture('webgl2'); + } +); -(GPU.isSinglePrecisionSupported && GPU.isHeadlessGLSupported ? test : skip)('Mixed NumberTexture (GPU only) headlessgl', () => { - testMixedNumberTexture('headlessgl'); -}); +(GPU.isSinglePrecisionSupported && GPU.isHeadlessGLSupported ? test : skip)( + 'Mixed NumberTexture (GPU only) headlessgl', + () => { + testMixedNumberTexture('headlessgl'); + } +); function testSingleArray1D2(mode) { const gpu = new GPU({ mode }); - const kernel = gpu.createKernel(function(v) { - return v[this.thread.x]; - }, { - argumentTypes: { v: 'Array1D(2)' }, - dynamicArguments: true, - dynamicOutput: true - }); - const expected1 = [ - new Float32Array([1,2]), - new Float32Array([3,4]), - ]; + const kernel = gpu.createKernel( + function (v) { + return v[this.thread.x]; + }, + { + argumentTypes: { v: 'Array1D(2)' }, + dynamicArguments: true, + dynamicOutput: true, + } + ); + const expected1 = [new Float32Array([1, 2]), new Float32Array([3, 4])]; kernel.setOutput([expected1.length]); assert.deepEqual(kernel(expected1), expected1); const expected2 = [ - new Float32Array([1,2]), - new Float32Array([3,4]), - new Float32Array([5,6]), - new Float32Array([7,8]), + new Float32Array([1, 2]), + new Float32Array([3, 4]), + new Float32Array([5, 6]), + new Float32Array([7, 8]), ]; kernel.setOutput([expected2.length]); assert.deepEqual(kernel(expected2), expected2); @@ -404,24 +454,24 @@ test('Single Array1D2 cpu', () => { function testSingleArray1D3(mode) { const gpu = new GPU({ mode }); - const kernel = gpu.createKernel(function(v) { - return v[this.thread.x]; - }, { - argumentTypes: { v: 'Array1D(3)' }, - dynamicArguments: true, - dynamicOutput: true - }); - const expected1 = [ - new Float32Array([1,2,3]), - new Float32Array([4,5,6]), - ]; + const kernel = gpu.createKernel( + function (v) { + return v[this.thread.x]; + }, + { + argumentTypes: { v: 'Array1D(3)' }, + dynamicArguments: true, + dynamicOutput: true, + } + ); + const expected1 = [new Float32Array([1, 2, 3]), new Float32Array([4, 5, 6])]; kernel.setOutput([expected1.length]); assert.deepEqual(kernel(expected1), expected1); const expected2 = [ - new Float32Array([1,2,3]), - new Float32Array([4,5,6]), - new Float32Array([7,8,9]), - new Float32Array([10,11,12]), + new Float32Array([1, 2, 3]), + new Float32Array([4, 5, 6]), + new Float32Array([7, 8, 9]), + new Float32Array([10, 11, 12]), ]; kernel.setOutput([expected2.length]); assert.deepEqual(kernel(expected2), expected2); @@ -454,24 +504,27 @@ test('Single Array1D3 cpu', () => { function testSingleArray1D4(mode) { const gpu = new GPU({ mode }); - const kernel = gpu.createKernel(function(v) { - return v[this.thread.x]; - }, { - argumentTypes: { v: 'Array1D(4)' }, - dynamicArguments: true, - dynamicOutput: true - }); + const kernel = gpu.createKernel( + function (v) { + return v[this.thread.x]; + }, + { + argumentTypes: { v: 'Array1D(4)' }, + dynamicArguments: true, + dynamicOutput: true, + } + ); const expected1 = [ - new Float32Array([1,2,3,4]), - new Float32Array([5,6,7,8]), + new Float32Array([1, 2, 3, 4]), + new Float32Array([5, 6, 7, 8]), ]; kernel.setOutput([expected1.length]); assert.deepEqual(kernel(expected1), expected1); const expected2 = [ - new Float32Array([1,2,3,4]), - new Float32Array([5,6,7,8]), - new Float32Array([9,10,11,12]), - new Float32Array([13,14,15,16]), + new Float32Array([1, 2, 3, 4]), + new Float32Array([5, 6, 7, 8]), + new Float32Array([9, 10, 11, 12]), + new Float32Array([13, 14, 15, 16]), ]; kernel.setOutput([expected2.length]); assert.deepEqual(kernel(expected2), expected2); @@ -504,36 +557,35 @@ test('Single Array1D4 cpu', () => { function testSingleArray2D2(mode) { const gpu = new GPU({ mode }); - const kernel = gpu.createKernel(function(v) { - return v[this.thread.y][this.thread.x]; - }, { - argumentTypes: { v: 'Array2D(2)' }, - dynamicArguments: true, - dynamicOutput: true - }); + const kernel = gpu.createKernel( + function (v) { + return v[this.thread.y][this.thread.x]; + }, + { + argumentTypes: { v: 'Array2D(2)' }, + dynamicArguments: true, + dynamicOutput: true, + } + ); const expected1 = [ - [ - new Float32Array([1,2]), - new Float32Array([3,4]), - ],[ - new Float32Array([5,6]), - new Float32Array([7,8]), - ] + [new Float32Array([1, 2]), new Float32Array([3, 4])], + [new Float32Array([5, 6]), new Float32Array([7, 8])], ]; kernel.setOutput([expected1[0].length, expected1.length]); assert.deepEqual(kernel(expected1), expected1); const expected2 = [ [ - new Float32Array([1,2]), - new Float32Array([3,4]), - new Float32Array([5,6]), - new Float32Array([7,8]), - ],[ - new Float32Array([9,10]), - new Float32Array([11,12]), - new Float32Array([13,14]), - new Float32Array([15,16]), - ] + new Float32Array([1, 2]), + new Float32Array([3, 4]), + new Float32Array([5, 6]), + new Float32Array([7, 8]), + ], + [ + new Float32Array([9, 10]), + new Float32Array([11, 12]), + new Float32Array([13, 14]), + new Float32Array([15, 16]), + ], ]; kernel.setOutput([expected2[0].length, expected2.length]); assert.deepEqual(kernel(expected2), expected2); @@ -566,36 +618,35 @@ test('Single Array2D2 gpu', () => { function testSingleArray2D3(mode) { const gpu = new GPU({ mode }); - const kernel = gpu.createKernel(function(v) { - return v[this.thread.y][this.thread.x]; - }, { - argumentTypes: { v: 'Array2D(3)' }, - dynamicArguments: true, - dynamicOutput: true - }); + const kernel = gpu.createKernel( + function (v) { + return v[this.thread.y][this.thread.x]; + }, + { + argumentTypes: { v: 'Array2D(3)' }, + dynamicArguments: true, + dynamicOutput: true, + } + ); const expected1 = [ - [ - new Float32Array([1,2,3]), - new Float32Array([4,5,6]), - ],[ - new Float32Array([7,8,9]), - new Float32Array([10,11,12]), - ] + [new Float32Array([1, 2, 3]), new Float32Array([4, 5, 6])], + [new Float32Array([7, 8, 9]), new Float32Array([10, 11, 12])], ]; kernel.setOutput([expected1[0].length, expected1.length]); assert.deepEqual(kernel(expected1), expected1); const expected2 = [ [ - new Float32Array([1,2,3]), - new Float32Array([4,5,6]), - new Float32Array([7,8,9]), - new Float32Array([10,11,12]), - ],[ - new Float32Array([13,14,15]), - new Float32Array([16,17,18]), - new Float32Array([19,20,21]), - new Float32Array([22,23,24]), - ] + new Float32Array([1, 2, 3]), + new Float32Array([4, 5, 6]), + new Float32Array([7, 8, 9]), + new Float32Array([10, 11, 12]), + ], + [ + new Float32Array([13, 14, 15]), + new Float32Array([16, 17, 18]), + new Float32Array([19, 20, 21]), + new Float32Array([22, 23, 24]), + ], ]; kernel.setOutput([expected2[0].length, expected2.length]); assert.deepEqual(kernel(expected2), expected2); @@ -628,36 +679,35 @@ test('Single Array2D3 cpu', () => { function testSingleArray2D4(mode) { const gpu = new GPU({ mode }); - const kernel = gpu.createKernel(function(v) { - return v[this.thread.y][this.thread.x]; - }, { - argumentTypes: { v: 'Array2D(4)' }, - dynamicArguments: true, - dynamicOutput: true - }); + const kernel = gpu.createKernel( + function (v) { + return v[this.thread.y][this.thread.x]; + }, + { + argumentTypes: { v: 'Array2D(4)' }, + dynamicArguments: true, + dynamicOutput: true, + } + ); const expected1 = [ - [ - new Float32Array([1,2,3,4]), - new Float32Array([5,6,7,8]), - ],[ - new Float32Array([9,10,11,12]), - new Float32Array([13,14,15,16]), - ] + [new Float32Array([1, 2, 3, 4]), new Float32Array([5, 6, 7, 8])], + [new Float32Array([9, 10, 11, 12]), new Float32Array([13, 14, 15, 16])], ]; kernel.setOutput([expected1[0].length, expected1.length]); assert.deepEqual(kernel(expected1), expected1); const expected2 = [ [ - new Float32Array([1,2,3,4]), - new Float32Array([5,6,7,8]), - new Float32Array([9,10,11,12]), - new Float32Array([13,14,15,16]), - ],[ - new Float32Array([17,18,19,20]), - new Float32Array([21,22,23,24]), - new Float32Array([25,26,27,28]), - new Float32Array([29,30,31,32]), - ] + new Float32Array([1, 2, 3, 4]), + new Float32Array([5, 6, 7, 8]), + new Float32Array([9, 10, 11, 12]), + new Float32Array([13, 14, 15, 16]), + ], + [ + new Float32Array([17, 18, 19, 20]), + new Float32Array([21, 22, 23, 24]), + new Float32Array([25, 26, 27, 28]), + new Float32Array([29, 30, 31, 32]), + ], ]; kernel.setOutput([expected2[0].length, expected2.length]); assert.deepEqual(kernel(expected2), expected2); @@ -690,62 +740,67 @@ test('Single Array2D4 cpu', () => { function testSingleArray3D2(mode) { const gpu = new GPU({ mode }); - const kernel = gpu.createKernel(function(v) { - return v[this.thread.z][this.thread.y][this.thread.x]; - }, { - argumentTypes: { v: 'Array3D(2)' }, - dynamicArguments: true, - dynamicOutput: true - }); + const kernel = gpu.createKernel( + function (v) { + return v[this.thread.z][this.thread.y][this.thread.x]; + }, + { + argumentTypes: { v: 'Array3D(2)' }, + dynamicArguments: true, + dynamicOutput: true, + } + ); const expected1 = [ [ - [ - new Float32Array([1,2]), - new Float32Array([3,4]), - ],[ - new Float32Array([5,6]), - new Float32Array([7,8]), - ] - ],[ - [ - new Float32Array([9,10]), - new Float32Array([11,12]), - ],[ - new Float32Array([13,14]), - new Float32Array([15,16]), - ] - ] + [new Float32Array([1, 2]), new Float32Array([3, 4])], + [new Float32Array([5, 6]), new Float32Array([7, 8])], + ], + [ + [new Float32Array([9, 10]), new Float32Array([11, 12])], + [new Float32Array([13, 14]), new Float32Array([15, 16])], + ], ]; - kernel.setOutput([expected1[0][0].length, expected1[0].length, expected1.length]); + kernel.setOutput([ + expected1[0][0].length, + expected1[0].length, + expected1.length, + ]); assert.deepEqual(kernel(expected1), expected1); const expected2 = [ [ [ - new Float32Array([1,2]), - new Float32Array([3,4]), - new Float32Array([5,6]), - new Float32Array([7,8]), - ],[ - new Float32Array([9,10]), - new Float32Array([11,12]), - new Float32Array([13,14]), - new Float32Array([15,16]), - ] - ],[ + new Float32Array([1, 2]), + new Float32Array([3, 4]), + new Float32Array([5, 6]), + new Float32Array([7, 8]), + ], + [ + new Float32Array([9, 10]), + new Float32Array([11, 12]), + new Float32Array([13, 14]), + new Float32Array([15, 16]), + ], + ], + [ [ - new Float32Array([17,18]), - new Float32Array([19,20]), - new Float32Array([21,22]), - new Float32Array([23,24]), - ],[ - new Float32Array([25,26]), - new Float32Array([27,28]), - new Float32Array([29,30]), - new Float32Array([31,32]), - ] - ] + new Float32Array([17, 18]), + new Float32Array([19, 20]), + new Float32Array([21, 22]), + new Float32Array([23, 24]), + ], + [ + new Float32Array([25, 26]), + new Float32Array([27, 28]), + new Float32Array([29, 30]), + new Float32Array([31, 32]), + ], + ], ]; - kernel.setOutput([expected2[0][0].length, expected2[0].length, expected2.length]); + kernel.setOutput([ + expected2[0][0].length, + expected2[0].length, + expected2.length, + ]); assert.deepEqual(kernel(expected2), expected2); gpu.destroy(); } @@ -776,62 +831,67 @@ test('Single Array3D2 cpu', () => { function testSingleArray3D3(mode) { const gpu = new GPU({ mode }); - const kernel = gpu.createKernel(function(v) { - return v[this.thread.z][this.thread.y][this.thread.x]; - }, { - argumentTypes: { v: 'Array3D(3)' }, - dynamicArguments: true, - dynamicOutput: true - }); + const kernel = gpu.createKernel( + function (v) { + return v[this.thread.z][this.thread.y][this.thread.x]; + }, + { + argumentTypes: { v: 'Array3D(3)' }, + dynamicArguments: true, + dynamicOutput: true, + } + ); const expected1 = [ [ - [ - new Float32Array([1,2,3]), - new Float32Array([4,5,6]), - ],[ - new Float32Array([7,8,9]), - new Float32Array([10,11,12]), - ] - ],[ - [ - new Float32Array([13,14,15]), - new Float32Array([16,17,18]), - ],[ - new Float32Array([19,20,21]), - new Float32Array([22,23,24]), - ] - ] + [new Float32Array([1, 2, 3]), new Float32Array([4, 5, 6])], + [new Float32Array([7, 8, 9]), new Float32Array([10, 11, 12])], + ], + [ + [new Float32Array([13, 14, 15]), new Float32Array([16, 17, 18])], + [new Float32Array([19, 20, 21]), new Float32Array([22, 23, 24])], + ], ]; - kernel.setOutput([expected1[0][0].length, expected1[0].length, expected1.length]); + kernel.setOutput([ + expected1[0][0].length, + expected1[0].length, + expected1.length, + ]); assert.deepEqual(kernel(expected1), expected1); const expected2 = [ [ [ - new Float32Array([1,2,3]), - new Float32Array([4,5,6]), - new Float32Array([7,8,9]), - new Float32Array([10,11,12]), - ],[ - new Float32Array([13,14,15]), - new Float32Array([16,17,18]), - new Float32Array([19,20,21]), - new Float32Array([22,23,24]), - ] - ],[ + new Float32Array([1, 2, 3]), + new Float32Array([4, 5, 6]), + new Float32Array([7, 8, 9]), + new Float32Array([10, 11, 12]), + ], + [ + new Float32Array([13, 14, 15]), + new Float32Array([16, 17, 18]), + new Float32Array([19, 20, 21]), + new Float32Array([22, 23, 24]), + ], + ], + [ + [ + new Float32Array([25, 26, 27]), + new Float32Array([28, 29, 30]), + new Float32Array([31, 32, 33]), + new Float32Array([34, 35, 36]), + ], [ - new Float32Array([25,26,27]), - new Float32Array([28,29,30]), - new Float32Array([31,32,33]), - new Float32Array([34,35,36]), - ],[ - new Float32Array([37,38,39]), - new Float32Array([40,41,42]), - new Float32Array([43,44,45]), - new Float32Array([46,47,48]), - ] - ] + new Float32Array([37, 38, 39]), + new Float32Array([40, 41, 42]), + new Float32Array([43, 44, 45]), + new Float32Array([46, 47, 48]), + ], + ], ]; - kernel.setOutput([expected2[0][0].length, expected2[0].length, expected2.length]); + kernel.setOutput([ + expected2[0][0].length, + expected2[0].length, + expected2.length, + ]); assert.deepEqual(kernel(expected2), expected2); gpu.destroy(); } @@ -862,62 +922,67 @@ test('Single Array3D3 cpu', () => { function testSingleArray3D4(mode) { const gpu = new GPU({ mode }); - const kernel = gpu.createKernel(function(v) { - return v[this.thread.z][this.thread.y][this.thread.x]; - }, { - argumentTypes: { v: 'Array3D(4)' }, - dynamicArguments: true, - dynamicOutput: true - }); + const kernel = gpu.createKernel( + function (v) { + return v[this.thread.z][this.thread.y][this.thread.x]; + }, + { + argumentTypes: { v: 'Array3D(4)' }, + dynamicArguments: true, + dynamicOutput: true, + } + ); const expected1 = [ [ - [ - new Float32Array([1,2,3,4]), - new Float32Array([5,6,7,8]), - ],[ - new Float32Array([9,10,11,12]), - new Float32Array([13,14,15,16]), - ] - ],[ - [ - new Float32Array([17,18,19,20]), - new Float32Array([21,22,23,24]), - ],[ - new Float32Array([25,26,27,28]), - new Float32Array([29,30,31,32]), - ] - ] + [new Float32Array([1, 2, 3, 4]), new Float32Array([5, 6, 7, 8])], + [new Float32Array([9, 10, 11, 12]), new Float32Array([13, 14, 15, 16])], + ], + [ + [new Float32Array([17, 18, 19, 20]), new Float32Array([21, 22, 23, 24])], + [new Float32Array([25, 26, 27, 28]), new Float32Array([29, 30, 31, 32])], + ], ]; - kernel.setOutput([expected1[0][0].length, expected1[0].length, expected1.length]); + kernel.setOutput([ + expected1[0][0].length, + expected1[0].length, + expected1.length, + ]); assert.deepEqual(kernel(expected1), expected1); const expected2 = [ [ [ - new Float32Array([1,2,3,4]), - new Float32Array([5,6,7,8]), - new Float32Array([9,10,11,12]), - new Float32Array([13,14,15,16]), - ],[ - new Float32Array([17,18,19,20]), - new Float32Array([21,22,23,24]), - new Float32Array([25,26,27,28]), - new Float32Array([29,30,31,32]), - ] - ],[ + new Float32Array([1, 2, 3, 4]), + new Float32Array([5, 6, 7, 8]), + new Float32Array([9, 10, 11, 12]), + new Float32Array([13, 14, 15, 16]), + ], [ - new Float32Array([33,34,35,36]), - new Float32Array([37,38,39,40]), - new Float32Array([41,42,43,44]), - new Float32Array([45,46,47,48]), - ],[ - new Float32Array([49,50,51,52]), - new Float32Array([53,54,56,57]), - new Float32Array([58,59,60,61]), - new Float32Array([62,63,64,65]), - ] - ] + new Float32Array([17, 18, 19, 20]), + new Float32Array([21, 22, 23, 24]), + new Float32Array([25, 26, 27, 28]), + new Float32Array([29, 30, 31, 32]), + ], + ], + [ + [ + new Float32Array([33, 34, 35, 36]), + new Float32Array([37, 38, 39, 40]), + new Float32Array([41, 42, 43, 44]), + new Float32Array([45, 46, 47, 48]), + ], + [ + new Float32Array([49, 50, 51, 52]), + new Float32Array([53, 54, 56, 57]), + new Float32Array([58, 59, 60, 61]), + new Float32Array([62, 63, 64, 65]), + ], + ], ]; - kernel.setOutput([expected2[0][0].length, expected2[0].length, expected2.length]); + kernel.setOutput([ + expected2[0][0].length, + expected2[0].length, + expected2.length, + ]); assert.deepEqual(kernel(expected2), expected2); gpu.destroy(); } @@ -948,21 +1013,22 @@ test('Single Array3D4 cpu', () => { function testUnsignedPrecisionArray(mode) { const gpu = new GPU({ mode }); - const kernel = gpu.createKernel(function(input) { - return input[this.thread.x]; - }) + const kernel = gpu + .createKernel(function (input) { + return input[this.thread.x]; + }) .setPrecision('unsigned') .setDynamicArguments(true) .setDynamicOutput(true) .setOutput([5]); - assert.deepEqual(kernel([1,2,3,4,5]), new Float32Array([1,2,3,4,5])); + assert.deepEqual(kernel([1, 2, 3, 4, 5]), new Float32Array([1, 2, 3, 4, 5])); kernel.setOutput([4]); - assert.deepEqual(kernel([1,2,3,4]), new Float32Array([1,2,3,4])); + assert.deepEqual(kernel([1, 2, 3, 4]), new Float32Array([1, 2, 3, 4])); kernel.setOutput([3]); - assert.deepEqual(kernel([1,2,3]), new Float32Array([1,2,3])); + assert.deepEqual(kernel([1, 2, 3]), new Float32Array([1, 2, 3])); kernel.setOutput([2]); - assert.deepEqual(kernel([1,2]), new Float32Array([1,2])); + assert.deepEqual(kernel([1, 2]), new Float32Array([1, 2])); gpu.destroy(); } @@ -978,13 +1044,19 @@ test('unsigned precision Array gpu', () => { testUnsignedPrecisionArray('webgl'); }); -(GPU.isWebGL2Supported ? test : skip)('unsigned precision Array webgl2', () => { - testUnsignedPrecisionArray('webgl2'); -}); +(GPU.isWebGL2Supported ? test : skip)( + 'unsigned precision Array webgl2', + () => { + testUnsignedPrecisionArray('webgl2'); + } +); -(GPU.isHeadlessGLSupported ? test : skip)('unsigned precision Array headlessgl', () => { - testUnsignedPrecisionArray('headlessgl'); -}); +(GPU.isHeadlessGLSupported ? test : skip)( + 'unsigned precision Array headlessgl', + () => { + testUnsignedPrecisionArray('headlessgl'); + } +); test('unsigned precision Array cpu', () => { testUnsignedPrecisionArray('cpu'); @@ -992,43 +1064,59 @@ test('unsigned precision Array cpu', () => { function testSinglePrecisionArray(mode) { const gpu = new GPU({ mode }); - const kernel = gpu.createKernel(function(input) { - return input[this.thread.x]; - }) + const kernel = gpu + .createKernel(function (input) { + return input[this.thread.x]; + }) .setPrecision('single') .setDynamicArguments(true) .setDynamicOutput(true) .setOutput([5]); - assert.deepEqual(kernel([1,2,3,4,5]), new Float32Array([1,2,3,4,5])); + assert.deepEqual(kernel([1, 2, 3, 4, 5]), new Float32Array([1, 2, 3, 4, 5])); kernel.setOutput([4]); - assert.deepEqual(kernel([1,2,3,4]), new Float32Array([1,2,3,4])); + assert.deepEqual(kernel([1, 2, 3, 4]), new Float32Array([1, 2, 3, 4])); kernel.setOutput([3]); - assert.deepEqual(kernel([1,2,3]), new Float32Array([1,2,3])); + assert.deepEqual(kernel([1, 2, 3]), new Float32Array([1, 2, 3])); kernel.setOutput([2]); - assert.deepEqual(kernel([1,2]), new Float32Array([1,2])); + assert.deepEqual(kernel([1, 2]), new Float32Array([1, 2])); gpu.destroy(); } -(GPU.isSinglePrecisionSupported ? test : skip)('single precision Array auto', () => { - testSinglePrecisionArray(); -}); +(GPU.isSinglePrecisionSupported ? test : skip)( + 'single precision Array auto', + () => { + testSinglePrecisionArray(); + } +); -(GPU.isSinglePrecisionSupported ? test : skip)('single precision Array gpu', () => { - testSinglePrecisionArray('gpu'); -}); +(GPU.isSinglePrecisionSupported ? test : skip)( + 'single precision Array gpu', + () => { + testSinglePrecisionArray('gpu'); + } +); -(GPU.isSinglePrecisionSupported && GPU.isWebGLSupported ? test : skip)('single precision Array webgl', () => { - testSinglePrecisionArray('webgl'); -}); +(GPU.isSinglePrecisionSupported && GPU.isWebGLSupported ? test : skip)( + 'single precision Array webgl', + () => { + testSinglePrecisionArray('webgl'); + } +); -(GPU.isSinglePrecisionSupported && GPU.isWebGL2Supported ? test : skip)('single precision Array webgl2', () => { - testSinglePrecisionArray('webgl2'); -}); +(GPU.isSinglePrecisionSupported && GPU.isWebGL2Supported ? test : skip)( + 'single precision Array webgl2', + () => { + testSinglePrecisionArray('webgl2'); + } +); -(GPU.isSinglePrecisionSupported && GPU.isHeadlessGLSupported ? test : skip)('single precision Array headlessgl', () => { - testSinglePrecisionArray('headlessgl'); -}); +(GPU.isSinglePrecisionSupported && GPU.isHeadlessGLSupported ? test : skip)( + 'single precision Array headlessgl', + () => { + testSinglePrecisionArray('headlessgl'); + } +); test('single precision Array cpu', () => { testSinglePrecisionArray('cpu'); @@ -1036,36 +1124,46 @@ test('single precision Array cpu', () => { function testUnsignedPrecisionMatrix(mode) { const gpu = new GPU({ mode }); - const kernel = gpu.createKernel(function(input) { - return input[this.thread.y][this.thread.x]; - }) + const kernel = gpu + .createKernel(function (input) { + return input[this.thread.y][this.thread.x]; + }) .setPrecision('unsigned') .setDynamicArguments(true) .setDynamicOutput(true) - .setOutput([4,4]); + .setOutput([4, 4]); let matrix = [ - [1,2,3,4], - [5,6,7,8], - [9,10,11,12], - [13,14,15,16] + [1, 2, 3, 4], + [5, 6, 7, 8], + [9, 10, 11, 12], + [13, 14, 15, 16], ]; - assert.deepEqual(kernel(matrix), matrix.map(row => new Float32Array(row))); + assert.deepEqual( + kernel(matrix), + matrix.map(row => new Float32Array(row)) + ); - kernel.setOutput([3,3]); + kernel.setOutput([3, 3]); matrix = [ - [1,2,3], - [4,5,6], - [7,8,9] + [1, 2, 3], + [4, 5, 6], + [7, 8, 9], ]; - assert.deepEqual(kernel(matrix), matrix.map(row => new Float32Array(row))); + assert.deepEqual( + kernel(matrix), + matrix.map(row => new Float32Array(row)) + ); - kernel.setOutput([2,2]); + kernel.setOutput([2, 2]); matrix = [ - [1,2], - [3,4] + [1, 2], + [3, 4], ]; - assert.deepEqual(kernel(matrix), matrix.map(row => new Float32Array(row))); + assert.deepEqual( + kernel(matrix), + matrix.map(row => new Float32Array(row)) + ); gpu.destroy(); } @@ -1081,13 +1179,19 @@ test('unsigned precision Matrix gpu', () => { testUnsignedPrecisionMatrix('webgl'); }); -(GPU.isWebGL2Supported ? test : skip)('unsigned precision Matrix webgl2', () => { - testUnsignedPrecisionMatrix('webgl2'); -}); +(GPU.isWebGL2Supported ? test : skip)( + 'unsigned precision Matrix webgl2', + () => { + testUnsignedPrecisionMatrix('webgl2'); + } +); -(GPU.isHeadlessGLSupported ? test : skip)('unsigned precision Matrix headlessgl', () => { - testUnsignedPrecisionMatrix('headlessgl'); -}); +(GPU.isHeadlessGLSupported ? test : skip)( + 'unsigned precision Matrix headlessgl', + () => { + testUnsignedPrecisionMatrix('headlessgl'); + } +); test('unsigned precision Matrix cpu', () => { testUnsignedPrecisionMatrix('cpu'); @@ -1095,57 +1199,82 @@ test('unsigned precision Matrix cpu', () => { function testSinglePrecisionMatrix(mode) { const gpu = new GPU({ mode }); - const kernel = gpu.createKernel(function(input) { - return input[this.thread.y][this.thread.x]; - }) + const kernel = gpu + .createKernel(function (input) { + return input[this.thread.y][this.thread.x]; + }) .setDynamicArguments(true) .setDynamicOutput(true) - .setOutput([4,4]); + .setOutput([4, 4]); let matrix = [ - [1,2,3,4], - [5,6,7,8], - [9,10,11,12], - [13,14,15,16] + [1, 2, 3, 4], + [5, 6, 7, 8], + [9, 10, 11, 12], + [13, 14, 15, 16], ]; - assert.deepEqual(kernel(matrix), matrix.map(row => new Float32Array(row))); + assert.deepEqual( + kernel(matrix), + matrix.map(row => new Float32Array(row)) + ); - kernel.setOutput([3,3]); + kernel.setOutput([3, 3]); matrix = [ - [1,2,3], - [4,5,6], - [7,8,9] + [1, 2, 3], + [4, 5, 6], + [7, 8, 9], ]; - assert.deepEqual(kernel(matrix), matrix.map(row => new Float32Array(row))); + assert.deepEqual( + kernel(matrix), + matrix.map(row => new Float32Array(row)) + ); - kernel.setOutput([2,2]); + kernel.setOutput([2, 2]); matrix = [ - [1,2], - [3,4] + [1, 2], + [3, 4], ]; - assert.deepEqual(kernel(matrix), matrix.map(row => new Float32Array(row))); + assert.deepEqual( + kernel(matrix), + matrix.map(row => new Float32Array(row)) + ); gpu.destroy(); } -(GPU.isSinglePrecisionSupported ? test : skip)('single precision Matrix auto', () => { - testSinglePrecisionMatrix(); -}); +(GPU.isSinglePrecisionSupported ? test : skip)( + 'single precision Matrix auto', + () => { + testSinglePrecisionMatrix(); + } +); -(GPU.isSinglePrecisionSupported ? test : skip)('single precision Matrix gpu', () => { - testSinglePrecisionMatrix('gpu'); -}); +(GPU.isSinglePrecisionSupported ? test : skip)( + 'single precision Matrix gpu', + () => { + testSinglePrecisionMatrix('gpu'); + } +); -(GPU.isSinglePrecisionSupported && GPU.isWebGLSupported ? test : skip)('single precision Matrix webgl', () => { - testSinglePrecisionMatrix('webgl'); -}); +(GPU.isSinglePrecisionSupported && GPU.isWebGLSupported ? test : skip)( + 'single precision Matrix webgl', + () => { + testSinglePrecisionMatrix('webgl'); + } +); -(GPU.isSinglePrecisionSupported && GPU.isWebGL2Supported ? test : skip)('single precision Matrix webgl2', () => { - testSinglePrecisionMatrix('webgl2'); -}); +(GPU.isSinglePrecisionSupported && GPU.isWebGL2Supported ? test : skip)( + 'single precision Matrix webgl2', + () => { + testSinglePrecisionMatrix('webgl2'); + } +); -(GPU.isSinglePrecisionSupported && GPU.isHeadlessGLSupported ? test : skip)('single precision Matrix headlessgl', () => { - testSinglePrecisionMatrix('headlessgl'); -}); +(GPU.isSinglePrecisionSupported && GPU.isHeadlessGLSupported ? test : skip)( + 'single precision Matrix headlessgl', + () => { + testSinglePrecisionMatrix('headlessgl'); + } +); test('single precision Matrix cpu', () => { testSinglePrecisionMatrix('cpu'); @@ -1153,47 +1282,39 @@ test('single precision Matrix cpu', () => { function testUnsignedPrecisionInputMatrix(mode) { const gpu = new GPU({ mode }); - const kernel = gpu.createKernel(function(input) { - return input[this.thread.y][this.thread.x]; - }) + const kernel = gpu + .createKernel(function (input) { + return input[this.thread.y][this.thread.x]; + }) .setPrecision('unsigned') .setDynamicArguments(true) .setDynamicOutput(true) - .setOutput([4,4]); - - let matrix = input([ - 1,2,3,4, - 5,6,7,8, - 9,10,11,12, - 13,14,15,16 - ], [4, 4]); + .setOutput([4, 4]); + + let matrix = input( + [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16], + [4, 4] + ); assert.deepEqual(kernel(matrix), [ - new Float32Array([1,2,3,4]), - new Float32Array([5,6,7,8]), - new Float32Array([9,10,11,12]), - new Float32Array([13,14,15,16]), + new Float32Array([1, 2, 3, 4]), + new Float32Array([5, 6, 7, 8]), + new Float32Array([9, 10, 11, 12]), + new Float32Array([13, 14, 15, 16]), ]); - kernel.setOutput([3,3]); - matrix = input([ - 1,2,3, - 4,5,6, - 7,8,9 - ], [3,3]); + kernel.setOutput([3, 3]); + matrix = input([1, 2, 3, 4, 5, 6, 7, 8, 9], [3, 3]); assert.deepEqual(kernel(matrix), [ - new Float32Array([1,2,3]), - new Float32Array([4,5,6]), - new Float32Array([7,8,9]) + new Float32Array([1, 2, 3]), + new Float32Array([4, 5, 6]), + new Float32Array([7, 8, 9]), ]); - kernel.setOutput([2,2]); - matrix = input([ - 1,2, - 3,4 - ], [2,2]); + kernel.setOutput([2, 2]); + matrix = input([1, 2, 3, 4], [2, 2]); assert.deepEqual(kernel(matrix), [ - new Float32Array([1,2]), - new Float32Array([3,4]) + new Float32Array([1, 2]), + new Float32Array([3, 4]), ]); gpu.destroy(); } @@ -1206,17 +1327,26 @@ test('unsigned precision Input Matrix gpu', () => { testUnsignedPrecisionInputMatrix('gpu'); }); -(GPU.isWebGLSupported ? test : skip)('unsigned precision Input Matrix webgl', () => { - testUnsignedPrecisionInputMatrix('webgl'); -}); +(GPU.isWebGLSupported ? test : skip)( + 'unsigned precision Input Matrix webgl', + () => { + testUnsignedPrecisionInputMatrix('webgl'); + } +); -(GPU.isWebGL2Supported ? test : skip)('unsigned precision Input Matrix webgl2', () => { - testUnsignedPrecisionInputMatrix('webgl2'); -}); +(GPU.isWebGL2Supported ? test : skip)( + 'unsigned precision Input Matrix webgl2', + () => { + testUnsignedPrecisionInputMatrix('webgl2'); + } +); -(GPU.isHeadlessGLSupported ? test : skip)('unsigned precision Input Matrix headlessgl', () => { - testUnsignedPrecisionInputMatrix('headlessgl'); -}); +(GPU.isHeadlessGLSupported ? test : skip)( + 'unsigned precision Input Matrix headlessgl', + () => { + testUnsignedPrecisionInputMatrix('headlessgl'); + } +); test('unsigned precision Input Matrix cpu', () => { testUnsignedPrecisionInputMatrix('cpu'); @@ -1224,69 +1354,76 @@ test('unsigned precision Input Matrix cpu', () => { function testSinglePrecisionInputMatrix(mode) { const gpu = new GPU({ mode }); - const kernel = gpu.createKernel(function(input) { - return input[this.thread.y][this.thread.x]; - }) + const kernel = gpu + .createKernel(function (input) { + return input[this.thread.y][this.thread.x]; + }) .setDynamicArguments(true) .setDynamicOutput(true) - .setOutput([4,4]); - - let matrix = input([ - 1,2,3,4, - 5,6,7,8, - 9,10,11,12, - 13,14,15,16 - ], [4, 4]); + .setOutput([4, 4]); + + let matrix = input( + [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16], + [4, 4] + ); assert.deepEqual(kernel(matrix), [ - new Float32Array([1,2,3,4]), - new Float32Array([5,6,7,8]), - new Float32Array([9,10,11,12]), - new Float32Array([13,14,15,16]) + new Float32Array([1, 2, 3, 4]), + new Float32Array([5, 6, 7, 8]), + new Float32Array([9, 10, 11, 12]), + new Float32Array([13, 14, 15, 16]), ]); - kernel.setOutput([3,3]); - matrix = input([ - 1,2,3, - 4,5,6, - 7,8,9 - ], [3, 3]); + kernel.setOutput([3, 3]); + matrix = input([1, 2, 3, 4, 5, 6, 7, 8, 9], [3, 3]); assert.deepEqual(kernel(matrix), [ - new Float32Array([1,2,3]), - new Float32Array([4,5,6]), - new Float32Array([7,8,9]) + new Float32Array([1, 2, 3]), + new Float32Array([4, 5, 6]), + new Float32Array([7, 8, 9]), ]); - kernel.setOutput([2,2]); - matrix = input([ - 1,2, - 3,4 - ], [2,2]); + kernel.setOutput([2, 2]); + matrix = input([1, 2, 3, 4], [2, 2]); assert.deepEqual(kernel(matrix), [ - new Float32Array([1,2]), - new Float32Array([3,4]) + new Float32Array([1, 2]), + new Float32Array([3, 4]), ]); gpu.destroy(); } -(GPU.isSinglePrecisionSupported ? test : skip)('single precision Input Matrix auto', () => { - testSinglePrecisionInputMatrix(); -}); +(GPU.isSinglePrecisionSupported ? test : skip)( + 'single precision Input Matrix auto', + () => { + testSinglePrecisionInputMatrix(); + } +); -(GPU.isSinglePrecisionSupported ? test : skip)('single precision Input Matrix gpu', () => { - testSinglePrecisionInputMatrix('gpu'); -}); +(GPU.isSinglePrecisionSupported ? test : skip)( + 'single precision Input Matrix gpu', + () => { + testSinglePrecisionInputMatrix('gpu'); + } +); -(GPU.isSinglePrecisionSupported && GPU.isWebGLSupported ? test : skip)('single precision Input Matrix webgl', () => { - testSinglePrecisionInputMatrix('webgl'); -}); +(GPU.isSinglePrecisionSupported && GPU.isWebGLSupported ? test : skip)( + 'single precision Input Matrix webgl', + () => { + testSinglePrecisionInputMatrix('webgl'); + } +); -(GPU.isSinglePrecisionSupported && GPU.isWebGL2Supported ? test : skip)('single precision Input Matrix webgl2', () => { - testSinglePrecisionInputMatrix('webgl2'); -}); +(GPU.isSinglePrecisionSupported && GPU.isWebGL2Supported ? test : skip)( + 'single precision Input Matrix webgl2', + () => { + testSinglePrecisionInputMatrix('webgl2'); + } +); -(GPU.isSinglePrecisionSupported && GPU.isHeadlessGLSupported ? test : skip)('single precision Input Matrix headlessgl', () => { - testSinglePrecisionInputMatrix('headlessgl'); -}); +(GPU.isSinglePrecisionSupported && GPU.isHeadlessGLSupported ? test : skip)( + 'single precision Input Matrix headlessgl', + () => { + testSinglePrecisionInputMatrix('headlessgl'); + } +); test('single precision Input Matrix cpu', () => { testSinglePrecisionInputMatrix('cpu'); diff --git a/test/features/dynamic-output.js b/test/features/dynamic-output.js index 955c46c6..08961f5f 100644 --- a/test/features/dynamic-output.js +++ b/test/features/dynamic-output.js @@ -1,24 +1,30 @@ const { assert, skip, test, module: describe, only } = require('qunit'); -const { GPU } = require('../../src'); +const { GPU } = require('../..'); describe('features: dynamic output'); function dynamicOutput1DGrows(mode) { const gpu = new GPU({ mode }); - const kernel = gpu.createKernel(function() { - return this.output.x + this.thread.x; - }, { dynamicOutput: true }); + const kernel = gpu.createKernel( + function () { + return this.output.x + this.thread.x; + }, + { dynamicOutput: true } + ); kernel.setOutput([5]); let result = kernel(); assert.equal(result.length, 5); - assert.deepEqual(Array.from(result), [5,6,7,8,9]); + assert.deepEqual(Array.from(result), [5, 6, 7, 8, 9]); assert.deepEqual(Array.from(kernel.output), [5]); kernel.setOutput([10]); result = kernel(); assert.equal(result.length, 10); - assert.deepEqual(Array.from(result), [10,11,12,13,14,15,16,17,18,19]); + assert.deepEqual( + Array.from(result), + [10, 11, 12, 13, 14, 15, 16, 17, 18, 19] + ); assert.deepEqual(Array.from(kernel.output), [10]); gpu.destroy(); @@ -40,31 +46,39 @@ test('dynamic output 1d grows gpu', () => { dynamicOutput1DGrows('webgl2'); }); -(GPU.isHeadlessGLSupported ? test : skip)('dynamic output 1d grows headlessgl', () => { - dynamicOutput1DGrows('headlessgl'); -}); +(GPU.isHeadlessGLSupported ? test : skip)( + 'dynamic output 1d grows headlessgl', + () => { + dynamicOutput1DGrows('headlessgl'); + } +); test('dynamic output 1d grows cpu', () => { dynamicOutput1DGrows('cpu'); }); - function dynamicOutput1DShrinks(mode) { const gpu = new GPU({ mode }); - const kernel = gpu.createKernel(function() { - return this.output.x + this.thread.x; - }, { dynamicOutput: true }); + const kernel = gpu.createKernel( + function () { + return this.output.x + this.thread.x; + }, + { dynamicOutput: true } + ); kernel.setOutput([10]); let result = kernel(); assert.equal(result.length, 10); - assert.deepEqual(Array.from(result), [10,11,12,13,14,15,16,17,18,19]); + assert.deepEqual( + Array.from(result), + [10, 11, 12, 13, 14, 15, 16, 17, 18, 19] + ); assert.deepEqual(Array.from(kernel.output), [10]); kernel.setOutput([5]); result = kernel(); assert.equal(result.length, 5); - assert.deepEqual(Array.from(result), [5,6,7,8,9]); + assert.deepEqual(Array.from(result), [5, 6, 7, 8, 9]); assert.deepEqual(Array.from(kernel.output), [5]); gpu.destroy(); @@ -82,13 +96,19 @@ test('dynamic output 1d shrinks gpu', () => { dynamicOutput1DShrinks('webgl'); }); -(GPU.isWebGL2Supported ? test : skip)('dynamic output 1d shrinks webgl2', () => { - dynamicOutput1DShrinks('webgl2'); -}); +(GPU.isWebGL2Supported ? test : skip)( + 'dynamic output 1d shrinks webgl2', + () => { + dynamicOutput1DShrinks('webgl2'); + } +); -(GPU.isHeadlessGLSupported ? test : skip)('dynamic output 1d shrinks headlessgl', () => { - dynamicOutput1DShrinks('headlessgl'); -}); +(GPU.isHeadlessGLSupported ? test : skip)( + 'dynamic output 1d shrinks headlessgl', + () => { + dynamicOutput1DShrinks('headlessgl'); + } +); test('dynamic output 1d shrinks cpu', () => { dynamicOutput1DShrinks('cpu'); @@ -96,28 +116,38 @@ test('dynamic output 1d shrinks cpu', () => { function dynamicOutput1DKernelMapGrows(mode) { const gpu = new GPU({ mode }); - const kernel = gpu.createKernelMap({ - result2: function map(v) { - return v; - } - }, function() { - return map(this.output.x + this.thread.x); - }, { dynamicOutput: true }); + const kernel = gpu.createKernelMap( + { + result2: function map(v) { + return v; + }, + }, + function () { + return map(this.output.x + this.thread.x); + }, + { dynamicOutput: true } + ); kernel.setOutput([5]); let result = kernel(); assert.equal(result.result.length, 5); assert.equal(result.result2.length, 5); - assert.deepEqual(Array.from(result.result), [5,6,7,8,9]); - assert.deepEqual(Array.from(result.result2), [5,6,7,8,9]); + assert.deepEqual(Array.from(result.result), [5, 6, 7, 8, 9]); + assert.deepEqual(Array.from(result.result2), [5, 6, 7, 8, 9]); assert.deepEqual(Array.from(kernel.output), [5]); kernel.setOutput([10]); result = kernel(); assert.equal(result.result.length, 10); assert.equal(result.result2.length, 10); - assert.deepEqual(Array.from(result.result), [10,11,12,13,14,15,16,17,18,19]); - assert.deepEqual(Array.from(result.result2), [10,11,12,13,14,15,16,17,18,19]); + assert.deepEqual( + Array.from(result.result), + [10, 11, 12, 13, 14, 15, 16, 17, 18, 19] + ); + assert.deepEqual( + Array.from(result.result2), + [10, 11, 12, 13, 14, 15, 16, 17, 18, 19] + ); assert.deepEqual(Array.from(kernel.output), [10]); gpu.destroy(); @@ -131,47 +161,65 @@ test('dynamic output 1d kernel map grows gpu', () => { dynamicOutput1DKernelMapGrows('gpu'); }); -(GPU.isWebGLSupported ? test : skip)('dynamic output 1d kernel map grows webgl', () => { - dynamicOutput1DKernelMapGrows('webgl'); -}); +(GPU.isWebGLSupported ? test : skip)( + 'dynamic output 1d kernel map grows webgl', + () => { + dynamicOutput1DKernelMapGrows('webgl'); + } +); -(GPU.isWebGL2Supported ? test : skip)('dynamic output 1d kernel map grows webgl2', () => { - dynamicOutput1DKernelMapGrows('webgl2'); -}); +(GPU.isWebGL2Supported ? test : skip)( + 'dynamic output 1d kernel map grows webgl2', + () => { + dynamicOutput1DKernelMapGrows('webgl2'); + } +); -(GPU.isHeadlessGLSupported ? test : skip)('dynamic output 1d kernel map grows headlessgl', () => { - dynamicOutput1DKernelMapGrows('headlessgl'); -}); +(GPU.isHeadlessGLSupported ? test : skip)( + 'dynamic output 1d kernel map grows headlessgl', + () => { + dynamicOutput1DKernelMapGrows('headlessgl'); + } +); test('dynamic output 1d kernel map grows cpu', () => { dynamicOutput1DKernelMapGrows('cpu'); }); - function dynamicOutput1DKernelMapShrinks(mode) { const gpu = new GPU({ mode }); - const kernel = gpu.createKernelMap({ - result2: function map(v) { - return v; - } - }, function() { - return map(this.output.x + this.thread.x); - }, { dynamicOutput: true }); + const kernel = gpu.createKernelMap( + { + result2: function map(v) { + return v; + }, + }, + function () { + return map(this.output.x + this.thread.x); + }, + { dynamicOutput: true } + ); kernel.setOutput([10]); let result = kernel(); assert.equal(result.result.length, 10); assert.equal(result.result2.length, 10); - assert.deepEqual(Array.from(result.result), [10,11,12,13,14,15,16,17,18,19]); - assert.deepEqual(Array.from(result.result2), [10,11,12,13,14,15,16,17,18,19]); + assert.deepEqual( + Array.from(result.result), + [10, 11, 12, 13, 14, 15, 16, 17, 18, 19] + ); + assert.deepEqual( + Array.from(result.result2), + [10, 11, 12, 13, 14, 15, 16, 17, 18, 19] + ); assert.deepEqual(Array.from(kernel.output), [10]); kernel.setOutput([5]); result = kernel(); assert.equal(result.result.length, 5); assert.equal(result.result2.length, 5); - assert.deepEqual(Array.from(result.result), [5,6,7,8,9]); - assert.deepEqual(Array.from(result.result2), [5,6,7,8,9]); + assert.deepEqual(Array.from(result.result), [5, 6, 7, 8, 9]); + assert.deepEqual(Array.from(result.result2), [5, 6, 7, 8, 9]); assert.deepEqual(Array.from(kernel.output), [5]); gpu.destroy(); @@ -185,17 +233,26 @@ test('dynamic output 1d kernel map shrinks gpu', () => { dynamicOutput1DKernelMapShrinks('gpu'); }); -(GPU.isWebGLSupported ? test : skip)('dynamic output 1d kernel map shrinks webgl', () => { - dynamicOutput1DKernelMapShrinks('webgl'); -}); +(GPU.isWebGLSupported ? test : skip)( + 'dynamic output 1d kernel map shrinks webgl', + () => { + dynamicOutput1DKernelMapShrinks('webgl'); + } +); -(GPU.isWebGL2Supported ? test : skip)('dynamic output 1d kernel map shrinks webgl2', () => { - dynamicOutput1DKernelMapShrinks('webgl2'); -}); +(GPU.isWebGL2Supported ? test : skip)( + 'dynamic output 1d kernel map shrinks webgl2', + () => { + dynamicOutput1DKernelMapShrinks('webgl2'); + } +); -(GPU.isHeadlessGLSupported ? test : skip)('dynamic output 1d kernel map shrinks headlessgl', () => { - dynamicOutput1DKernelMapShrinks('headlessgl'); -}); +(GPU.isHeadlessGLSupported ? test : skip)( + 'dynamic output 1d kernel map shrinks headlessgl', + () => { + dynamicOutput1DKernelMapShrinks('headlessgl'); + } +); test('dynamic output 1d kernel map shrinks cpu', () => { dynamicOutput1DKernelMapShrinks('cpu'); @@ -203,21 +260,37 @@ test('dynamic output 1d kernel map shrinks cpu', () => { function dynamicOutput2DGrows(mode) { const gpu = new GPU({ mode }); - const kernel = gpu.createKernel(function() { - return this.output.x + this.output.y + this.thread.x + this.thread.y; - }, { dynamicOutput: true }); - - kernel.setOutput([2,2]); + const kernel = gpu.createKernel( + function () { + return this.output.x + this.output.y + this.thread.x + this.thread.y; + }, + { dynamicOutput: true } + ); + + kernel.setOutput([2, 2]); let result = kernel(); assert.equal(result.length, 2); - assert.deepEqual(result.map(row => Array.from(row)), [[4,5],[5,6]]); - assert.deepEqual(Array.from(kernel.output), [2,2]); + assert.deepEqual( + result.map(row => Array.from(row)), + [ + [4, 5], + [5, 6], + ] + ); + assert.deepEqual(Array.from(kernel.output), [2, 2]); - kernel.setOutput([3,3]); + kernel.setOutput([3, 3]); result = kernel(); assert.equal(result.length, 3); - assert.deepEqual(result.map(row => Array.from(row)), [[6,7,8],[7,8,9],[8,9,10]]); - assert.deepEqual(Array.from(kernel.output), [3,3]); + assert.deepEqual( + result.map(row => Array.from(row)), + [ + [6, 7, 8], + [7, 8, 9], + [8, 9, 10], + ] + ); + assert.deepEqual(Array.from(kernel.output), [3, 3]); gpu.destroy(); } @@ -238,32 +311,50 @@ test('dynamic output 2d grows gpu', () => { dynamicOutput2DGrows('webgl2'); }); -(GPU.isHeadlessGLSupported ? test : skip)('dynamic output 2d grows headlessgl', () => { - dynamicOutput2DGrows('headlessgl'); -}); +(GPU.isHeadlessGLSupported ? test : skip)( + 'dynamic output 2d grows headlessgl', + () => { + dynamicOutput2DGrows('headlessgl'); + } +); test('dynamic output 2d grows cpu', () => { dynamicOutput2DGrows('cpu'); }); - function dynamicOutput2DShrinks(mode) { const gpu = new GPU({ mode }); - const kernel = gpu.createKernel(function() { - return this.output.x + this.output.y + this.thread.x + this.thread.y; - }, { dynamicOutput: true }); - - kernel.setOutput([3,3]); + const kernel = gpu.createKernel( + function () { + return this.output.x + this.output.y + this.thread.x + this.thread.y; + }, + { dynamicOutput: true } + ); + + kernel.setOutput([3, 3]); let result = kernel(); assert.equal(result.length, 3); - assert.deepEqual(result.map(row => Array.from(row)), [[6,7,8],[7,8,9],[8,9,10]]); - assert.deepEqual(Array.from(kernel.output), [3,3]); + assert.deepEqual( + result.map(row => Array.from(row)), + [ + [6, 7, 8], + [7, 8, 9], + [8, 9, 10], + ] + ); + assert.deepEqual(Array.from(kernel.output), [3, 3]); - kernel.setOutput([2,2]); + kernel.setOutput([2, 2]); result = kernel(); assert.equal(result.length, 2); - assert.deepEqual(result.map(row => Array.from(row)), [[4,5],[5,6]]); - assert.deepEqual(Array.from(kernel.output), [2,2]); + assert.deepEqual( + result.map(row => Array.from(row)), + [ + [4, 5], + [5, 6], + ] + ); + assert.deepEqual(Array.from(kernel.output), [2, 2]); gpu.destroy(); } @@ -280,13 +371,19 @@ test('dynamic output 2d shrinks gpu', () => { dynamicOutput2DShrinks('webgl'); }); -(GPU.isWebGL2Supported ? test : skip)('dynamic output 2d shrinks webgl2', () => { - dynamicOutput2DShrinks('webgl2'); -}); +(GPU.isWebGL2Supported ? test : skip)( + 'dynamic output 2d shrinks webgl2', + () => { + dynamicOutput2DShrinks('webgl2'); + } +); -(GPU.isHeadlessGLSupported ? test : skip)('dynamic output 2d shrinks headlessgl', () => { - dynamicOutput2DShrinks('headlessgl'); -}); +(GPU.isHeadlessGLSupported ? test : skip)( + 'dynamic output 2d shrinks headlessgl', + () => { + dynamicOutput2DShrinks('headlessgl'); + } +); test('dynamic output 2d shrinks cpu', () => { dynamicOutput2DShrinks('cpu'); @@ -294,29 +391,61 @@ test('dynamic output 2d shrinks cpu', () => { function dynamicOutput2DKernelMapGrows(mode) { const gpu = new GPU({ mode }); - const kernel = gpu.createKernelMap({ - result1: function map(v) { - return v; - } - }, function() { - return map(this.output.x + this.output.y + this.thread.x + this.thread.y); - }, { dynamicOutput: true }); - - kernel.setOutput([2,2]); + const kernel = gpu.createKernelMap( + { + result1: function map(v) { + return v; + }, + }, + function () { + return map( + this.output.x + this.output.y + this.thread.x + this.thread.y + ); + }, + { dynamicOutput: true } + ); + + kernel.setOutput([2, 2]); let result = kernel(); assert.equal(result.result.length, 2); assert.equal(result.result1.length, 2); - assert.deepEqual(result.result.map(row => Array.from(row)), [[4,5],[5,6]]); - assert.deepEqual(result.result1.map(row => Array.from(row)), [[4,5],[5,6]]); - assert.deepEqual(Array.from(kernel.output), [2,2]); + assert.deepEqual( + result.result.map(row => Array.from(row)), + [ + [4, 5], + [5, 6], + ] + ); + assert.deepEqual( + result.result1.map(row => Array.from(row)), + [ + [4, 5], + [5, 6], + ] + ); + assert.deepEqual(Array.from(kernel.output), [2, 2]); - kernel.setOutput([3,3]); + kernel.setOutput([3, 3]); result = kernel(); assert.equal(result.result.length, 3); assert.equal(result.result1.length, 3); - assert.deepEqual(result.result.map(row => Array.from(row)), [[6,7,8],[7,8,9],[8,9,10]]); - assert.deepEqual(result.result1.map(row => Array.from(row)), [[6,7,8],[7,8,9],[8,9,10]]); - assert.deepEqual(Array.from(kernel.output), [3,3]); + assert.deepEqual( + result.result.map(row => Array.from(row)), + [ + [6, 7, 8], + [7, 8, 9], + [8, 9, 10], + ] + ); + assert.deepEqual( + result.result1.map(row => Array.from(row)), + [ + [6, 7, 8], + [7, 8, 9], + [8, 9, 10], + ] + ); + assert.deepEqual(Array.from(kernel.output), [3, 3]); gpu.destroy(); } @@ -329,48 +458,88 @@ test('dynamic output 2d kernel map grows gpu', () => { dynamicOutput2DKernelMapGrows('gpu'); }); -(GPU.isWebGLSupported ? test : skip)('dynamic output 2d kernel map grows webgl', () => { - dynamicOutput2DKernelMapGrows('webgl'); -}); +(GPU.isWebGLSupported ? test : skip)( + 'dynamic output 2d kernel map grows webgl', + () => { + dynamicOutput2DKernelMapGrows('webgl'); + } +); -(GPU.isWebGL2Supported ? test : skip)('dynamic output 2d kernel map grows webgl2', () => { - dynamicOutput2DKernelMapGrows('webgl2'); -}); +(GPU.isWebGL2Supported ? test : skip)( + 'dynamic output 2d kernel map grows webgl2', + () => { + dynamicOutput2DKernelMapGrows('webgl2'); + } +); -(GPU.isHeadlessGLSupported ? test : skip)('dynamic output 2d kernel map grows headlessgl', () => { - dynamicOutput2DKernelMapGrows('headlessgl'); -}); +(GPU.isHeadlessGLSupported ? test : skip)( + 'dynamic output 2d kernel map grows headlessgl', + () => { + dynamicOutput2DKernelMapGrows('headlessgl'); + } +); test('dynamic output 2d kernel map grows cpu', () => { dynamicOutput2DKernelMapGrows('cpu'); }); - function dynamicOutput2DKernelMapShrinks(mode) { const gpu = new GPU({ mode }); - const kernel = gpu.createKernelMap({ - result1: function map(v) { - return v; - } - }, function() { - return map(this.output.x + this.output.y + this.thread.x + this.thread.y); - }, { dynamicOutput: true }); - - kernel.setOutput([3,3]); + const kernel = gpu.createKernelMap( + { + result1: function map(v) { + return v; + }, + }, + function () { + return map( + this.output.x + this.output.y + this.thread.x + this.thread.y + ); + }, + { dynamicOutput: true } + ); + + kernel.setOutput([3, 3]); let result = kernel(); assert.equal(result.result.length, 3); assert.equal(result.result1.length, 3); - assert.deepEqual(result.result.map(row => Array.from(row)), [[6,7,8],[7,8,9],[8,9,10]]); - assert.deepEqual(result.result1.map(row => Array.from(row)), [[6,7,8],[7,8,9],[8,9,10]]); - assert.deepEqual(Array.from(kernel.output), [3,3]); + assert.deepEqual( + result.result.map(row => Array.from(row)), + [ + [6, 7, 8], + [7, 8, 9], + [8, 9, 10], + ] + ); + assert.deepEqual( + result.result1.map(row => Array.from(row)), + [ + [6, 7, 8], + [7, 8, 9], + [8, 9, 10], + ] + ); + assert.deepEqual(Array.from(kernel.output), [3, 3]); - kernel.setOutput([2,2]); + kernel.setOutput([2, 2]); result = kernel(); assert.equal(result.result.length, 2); assert.equal(result.result1.length, 2); - assert.deepEqual(result.result.map(row => Array.from(row)), [[4,5],[5,6]]); - assert.deepEqual(result.result1.map(row => Array.from(row)), [[4,5],[5,6]]); - assert.deepEqual(Array.from(kernel.output), [2,2]); + assert.deepEqual( + result.result.map(row => Array.from(row)), + [ + [4, 5], + [5, 6], + ] + ); + assert.deepEqual( + result.result1.map(row => Array.from(row)), + [ + [4, 5], + [5, 6], + ] + ); + assert.deepEqual(Array.from(kernel.output), [2, 2]); gpu.destroy(); } @@ -387,13 +556,19 @@ test('dynamic output 2d shrinks gpu', () => { dynamicOutput2DShrinks('webgl'); }); -(GPU.isWebGL2Supported ? test : skip)('dynamic output 2d shrinks webgl2', () => { - dynamicOutput2DShrinks('webgl2'); -}); +(GPU.isWebGL2Supported ? test : skip)( + 'dynamic output 2d shrinks webgl2', + () => { + dynamicOutput2DShrinks('webgl2'); + } +); -(GPU.isHeadlessGLSupported ? test : skip)('dynamic output 2d shrinks headlessgl', () => { - dynamicOutput2DShrinks('headlessgl'); -}); +(GPU.isHeadlessGLSupported ? test : skip)( + 'dynamic output 2d shrinks headlessgl', + () => { + dynamicOutput2DShrinks('headlessgl'); + } +); test('dynamic output 2d shrinks cpu', () => { dynamicOutput2DShrinks('cpu'); @@ -402,38 +577,39 @@ test('dynamic output 2d shrinks cpu', () => { function dynamicOutput2DGraphicalGrows(mode) { const gpu = new GPU({ mode }); - const kernel = gpu.createKernel(function() { - this.color(1,1,1,1); - }, { graphical: true, dynamicOutput: true }); - - kernel.setOutput([2,2]); + const kernel = gpu.createKernel( + function () { + this.color(1, 1, 1, 1); + }, + { graphical: true, dynamicOutput: true } + ); + + kernel.setOutput([2, 2]); kernel(); let result = kernel.getPixels(); assert.equal(result.length, 2 * 2 * 4); - assert.deepEqual(Array.from(result), [ - 255, 255, 255, 255, - 255, 255, 255, 255, - 255, 255, 255, 255, - 255, 255, 255, 255 - ]); - assert.deepEqual(Array.from(kernel.output), [2,2]); - - kernel.setOutput([3,3]); + assert.deepEqual( + Array.from(result), + [ + 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, + 255, 255, + ] + ); + assert.deepEqual(Array.from(kernel.output), [2, 2]); + + kernel.setOutput([3, 3]); kernel(); result = kernel.getPixels(); assert.equal(result.length, 3 * 3 * 4); - assert.deepEqual(Array.from(result), [ - 255, 255, 255, 255, - 255, 255, 255, 255, - 255, 255, 255, 255, - 255, 255, 255, 255, - 255, 255, 255, 255, - 255, 255, 255, 255, - 255, 255, 255, 255, - 255, 255, 255, 255, - 255, 255, 255, 255, - ]); - assert.deepEqual(Array.from(kernel.output), [3,3]); + assert.deepEqual( + Array.from(result), + [ + 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, 255, 255, + ] + ); + assert.deepEqual(Array.from(kernel.output), [3, 3]); gpu.destroy(); } @@ -446,57 +622,69 @@ test('dynamic output 2d graphical grows gpu', () => { dynamicOutput2DGraphicalGrows('gpu'); }); -(GPU.isWebGLSupported ? test : skip)('dynamic output 2d graphical grows webgl', () => { - dynamicOutput2DGraphicalGrows('webgl'); -}); - -(GPU.isWebGL2Supported ? test : skip)('dynamic output 2d graphical grows webgl2', () => { - dynamicOutput2DGraphicalGrows('webgl2'); -}); - -(GPU.isHeadlessGLSupported ? test : skip)('dynamic output 2d graphical grows headlessgl', () => { - dynamicOutput2DGraphicalGrows('headlessgl'); -}); - -(GPU.isCanvasSupported ? test : skip)('dynamic output 2d graphical grows cpu', () => { - dynamicOutput2DGraphicalGrows('cpu'); -}); - +(GPU.isWebGLSupported ? test : skip)( + 'dynamic output 2d graphical grows webgl', + () => { + dynamicOutput2DGraphicalGrows('webgl'); + } +); + +(GPU.isWebGL2Supported ? test : skip)( + 'dynamic output 2d graphical grows webgl2', + () => { + dynamicOutput2DGraphicalGrows('webgl2'); + } +); + +(GPU.isHeadlessGLSupported ? test : skip)( + 'dynamic output 2d graphical grows headlessgl', + () => { + dynamicOutput2DGraphicalGrows('headlessgl'); + } +); + +(GPU.isCanvasSupported ? test : skip)( + 'dynamic output 2d graphical grows cpu', + () => { + dynamicOutput2DGraphicalGrows('cpu'); + } +); function dynamicOutput2DGraphicalShrinks(mode) { const gpu = new GPU({ mode }); - const kernel = gpu.createKernel(function() { - this.color(1,1,1,1); - }, { graphical: true, dynamicOutput: true }); - - kernel.setOutput([3,3]); + const kernel = gpu.createKernel( + function () { + this.color(1, 1, 1, 1); + }, + { graphical: true, dynamicOutput: true } + ); + + kernel.setOutput([3, 3]); kernel(); let result = kernel.getPixels(); assert.equal(result.length, 3 * 3 * 4); - assert.deepEqual(Array.from(result), [ - 255, 255, 255, 255, - 255, 255, 255, 255, - 255, 255, 255, 255, - 255, 255, 255, 255, - 255, 255, 255, 255, - 255, 255, 255, 255, - 255, 255, 255, 255, - 255, 255, 255, 255, - 255, 255, 255, 255, - ]); - assert.deepEqual(Array.from(kernel.output), [3,3]); - - kernel.setOutput([2,2]); + assert.deepEqual( + Array.from(result), + [ + 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, 255, 255, + ] + ); + assert.deepEqual(Array.from(kernel.output), [3, 3]); + + kernel.setOutput([2, 2]); kernel(); result = kernel.getPixels(); assert.equal(result.length, 2 * 2 * 4); - assert.deepEqual(Array.from(result), [ - 255, 255, 255, 255, - 255, 255, 255, 255, - 255, 255, 255, 255, - 255, 255, 255, 255 - ]); - assert.deepEqual(Array.from(kernel.output), [2,2]); + assert.deepEqual( + Array.from(result), + [ + 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, + 255, 255, + ] + ); + assert.deepEqual(Array.from(kernel.output), [2, 2]); gpu.destroy(); } @@ -509,55 +697,92 @@ test('dynamic output 2d graphical shrinks gpu', () => { dynamicOutput2DGraphicalShrinks('gpu'); }); -(GPU.isWebGLSupported ? test : skip)('dynamic output 2d graphical shrinks webgl', () => { - dynamicOutput2DGraphicalShrinks('webgl'); -}); - -(GPU.isWebGL2Supported ? test : skip)('dynamic output 2d graphical shrinks webgl2', () => { - dynamicOutput2DGraphicalShrinks('webgl2'); -}); - -(GPU.isHeadlessGLSupported ? test : skip)('dynamic output 2d graphical shrinks headlessgl', () => { - dynamicOutput2DGraphicalShrinks('headlessgl'); -}); - -(GPU.isCanvasSupported ? test : skip)('dynamic output 2d graphical shrinks cpu', () => { - dynamicOutput2DGraphicalShrinks('cpu'); -}); +(GPU.isWebGLSupported ? test : skip)( + 'dynamic output 2d graphical shrinks webgl', + () => { + dynamicOutput2DGraphicalShrinks('webgl'); + } +); + +(GPU.isWebGL2Supported ? test : skip)( + 'dynamic output 2d graphical shrinks webgl2', + () => { + dynamicOutput2DGraphicalShrinks('webgl2'); + } +); + +(GPU.isHeadlessGLSupported ? test : skip)( + 'dynamic output 2d graphical shrinks headlessgl', + () => { + dynamicOutput2DGraphicalShrinks('headlessgl'); + } +); + +(GPU.isCanvasSupported ? test : skip)( + 'dynamic output 2d graphical shrinks cpu', + () => { + dynamicOutput2DGraphicalShrinks('cpu'); + } +); function dynamicOutput3DGrows(mode) { const gpu = new GPU({ mode }); - const kernel = gpu.createKernel(function() { - return this.output.x + this.output.y + this.thread.z + this.thread.x + this.thread.y + this.thread.z; - }, { dynamicOutput: true }); - - kernel.setOutput([2,2,2]); + const kernel = gpu.createKernel( + function () { + return ( + this.output.x + + this.output.y + + this.thread.z + + this.thread.x + + this.thread.y + + this.thread.z + ); + }, + { dynamicOutput: true } + ); + + kernel.setOutput([2, 2, 2]); let result = kernel(); assert.equal(result.length, 2); - assert.deepEqual(result.map(matrix => matrix.map(row => Array.from(row))), [[[4,5],[5,6]],[[6,7],[7,8]]]); - assert.deepEqual(Array.from(kernel.output), [2,2,2]); + assert.deepEqual( + result.map(matrix => matrix.map(row => Array.from(row))), + [ + [ + [4, 5], + [5, 6], + ], + [ + [6, 7], + [7, 8], + ], + ] + ); + assert.deepEqual(Array.from(kernel.output), [2, 2, 2]); - kernel.setOutput([3,3,3]); + kernel.setOutput([3, 3, 3]); result = kernel(); assert.equal(result.length, 3); - assert.deepEqual(result.map(matrix => matrix.map(row => Array.from(row))), [ - [ - [6,7,8], - [7,8,9], - [8,9,10] - ], + assert.deepEqual( + result.map(matrix => matrix.map(row => Array.from(row))), [ - [8,9,10], - [9,10,11], - [10,11,12] - ], - [ - [10,11,12], - [11,12,13], - [12,13,14] + [ + [6, 7, 8], + [7, 8, 9], + [8, 9, 10], + ], + [ + [8, 9, 10], + [9, 10, 11], + [10, 11, 12], + ], + [ + [10, 11, 12], + [11, 12, 13], + [12, 13, 14], + ], ] - ]); - assert.deepEqual(Array.from(kernel.output), [3,3,3]); + ); + assert.deepEqual(Array.from(kernel.output), [3, 3, 3]); gpu.destroy(); } @@ -578,48 +803,75 @@ test('dynamic output 3d grows gpu', () => { dynamicOutput3DGrows('webgl2'); }); -(GPU.isHeadlessGLSupported ? test : skip)('dynamic output 3d grows headlessgl', () => { - dynamicOutput3DGrows('headlessgl'); -}); +(GPU.isHeadlessGLSupported ? test : skip)( + 'dynamic output 3d grows headlessgl', + () => { + dynamicOutput3DGrows('headlessgl'); + } +); test('dynamic output 3d grows cpu', () => { dynamicOutput3DGrows('cpu'); }); - function dynamicOutput3DShrinks(mode) { const gpu = new GPU({ mode }); - const kernel = gpu.createKernel(function() { - return this.output.x + this.output.y + this.thread.z + this.thread.x + this.thread.y + this.thread.z; - }, { dynamicOutput: true }); - - kernel.setOutput([3,3,3]); + const kernel = gpu.createKernel( + function () { + return ( + this.output.x + + this.output.y + + this.thread.z + + this.thread.x + + this.thread.y + + this.thread.z + ); + }, + { dynamicOutput: true } + ); + + kernel.setOutput([3, 3, 3]); let result = kernel(); assert.equal(result.length, 3); - assert.deepEqual(result.map(matrix => matrix.map(row => Array.from(row))), [ + assert.deepEqual( + result.map(matrix => matrix.map(row => Array.from(row))), [ - [6,7,8], - [7,8,9], - [8,9,10] - ], - [ - [8,9,10], - [9,10,11], - [10,11,12] - ], - [ - [10,11,12], - [11,12,13], - [12,13,14] + [ + [6, 7, 8], + [7, 8, 9], + [8, 9, 10], + ], + [ + [8, 9, 10], + [9, 10, 11], + [10, 11, 12], + ], + [ + [10, 11, 12], + [11, 12, 13], + [12, 13, 14], + ], ] - ]); - assert.deepEqual(Array.from(kernel.output), [3,3,3]); + ); + assert.deepEqual(Array.from(kernel.output), [3, 3, 3]); - kernel.setOutput([2,2,2]); + kernel.setOutput([2, 2, 2]); result = kernel(); assert.equal(result.length, 2); - assert.deepEqual(result.map(matrix => matrix.map(row => Array.from(row))), [[[4,5],[5,6]],[[6,7],[7,8]]]); - assert.deepEqual(Array.from(kernel.output), [2,2,2]); + assert.deepEqual( + result.map(matrix => matrix.map(row => Array.from(row))), + [ + [ + [4, 5], + [5, 6], + ], + [ + [6, 7], + [7, 8], + ], + ] + ); + assert.deepEqual(Array.from(kernel.output), [2, 2, 2]); gpu.destroy(); } @@ -636,13 +888,19 @@ test('dynamic output 3d shrinks gpu', () => { dynamicOutput3DShrinks('webgl'); }); -(GPU.isWebGL2Supported ? test : skip)('dynamic output 3d shrinks webgl2', () => { - dynamicOutput3DShrinks('webgl2'); -}); +(GPU.isWebGL2Supported ? test : skip)( + 'dynamic output 3d shrinks webgl2', + () => { + dynamicOutput3DShrinks('webgl2'); + } +); -(GPU.isHeadlessGLSupported ? test : skip)('dynamic output 3d shrinks headlessgl', () => { - dynamicOutput3DShrinks('headlessgl'); -}); +(GPU.isHeadlessGLSupported ? test : skip)( + 'dynamic output 3d shrinks headlessgl', + () => { + dynamicOutput3DShrinks('headlessgl'); + } +); test('dynamic output 3d shrinks cpu', () => { dynamicOutput3DShrinks('cpu'); @@ -650,61 +908,102 @@ test('dynamic output 3d shrinks cpu', () => { function dynamicOutput3DKernelMapGrows(mode) { const gpu = new GPU({ mode }); - const kernel = gpu.createKernelMap({ - result1: function map(v) { - return v; - } - }, function() { - return map(this.output.x + this.output.y + this.thread.z + this.thread.x + this.thread.y + this.thread.z); - }, { dynamicOutput: true }); - - kernel.setOutput([2,2,2]); + const kernel = gpu.createKernelMap( + { + result1: function map(v) { + return v; + }, + }, + function () { + return map( + this.output.x + + this.output.y + + this.thread.z + + this.thread.x + + this.thread.y + + this.thread.z + ); + }, + { dynamicOutput: true } + ); + + kernel.setOutput([2, 2, 2]); let result = kernel(); assert.equal(result.result.length, 2); assert.equal(result.result1.length, 2); - assert.deepEqual(result.result.map(matrix => matrix.map(row => Array.from(row))), [[[4,5],[5,6]],[[6,7],[7,8]]]); - assert.deepEqual(result.result1.map(matrix => matrix.map(row => Array.from(row))), [[[4,5],[5,6]],[[6,7],[7,8]]]); - assert.deepEqual(Array.from(kernel.output), [2,2,2]); + assert.deepEqual( + result.result.map(matrix => matrix.map(row => Array.from(row))), + [ + [ + [4, 5], + [5, 6], + ], + [ + [6, 7], + [7, 8], + ], + ] + ); + assert.deepEqual( + result.result1.map(matrix => matrix.map(row => Array.from(row))), + [ + [ + [4, 5], + [5, 6], + ], + [ + [6, 7], + [7, 8], + ], + ] + ); + assert.deepEqual(Array.from(kernel.output), [2, 2, 2]); - kernel.setOutput([3,3,3]); + kernel.setOutput([3, 3, 3]); result = kernel(); assert.equal(result.result.length, 3); assert.equal(result.result1.length, 3); - assert.deepEqual(result.result.map(matrix => matrix.map(row => Array.from(row))), [ + assert.deepEqual( + result.result.map(matrix => matrix.map(row => Array.from(row))), [ - [6,7,8], - [7,8,9], - [8,9,10] - ], - [ - [8,9,10], - [9,10,11], - [10,11,12] - ], - [ - [10,11,12], - [11,12,13], - [12,13,14] + [ + [6, 7, 8], + [7, 8, 9], + [8, 9, 10], + ], + [ + [8, 9, 10], + [9, 10, 11], + [10, 11, 12], + ], + [ + [10, 11, 12], + [11, 12, 13], + [12, 13, 14], + ], ] - ]); - assert.deepEqual(result.result1.map(matrix => matrix.map(row => Array.from(row))), [ - [ - [6,7,8], - [7,8,9], - [8,9,10] - ], - [ - [8,9,10], - [9,10,11], - [10,11,12] - ], + ); + assert.deepEqual( + result.result1.map(matrix => matrix.map(row => Array.from(row))), [ - [10,11,12], - [11,12,13], - [12,13,14] + [ + [6, 7, 8], + [7, 8, 9], + [8, 9, 10], + ], + [ + [8, 9, 10], + [9, 10, 11], + [10, 11, 12], + ], + [ + [10, 11, 12], + [11, 12, 13], + [12, 13, 14], + ], ] - ]); - assert.deepEqual(Array.from(kernel.output), [3,3,3]); + ); + assert.deepEqual(Array.from(kernel.output), [3, 3, 3]); gpu.destroy(); } @@ -717,80 +1016,129 @@ test('dynamic output 3d kernel map grows gpu', () => { dynamicOutput3DKernelMapGrows('gpu'); }); -(GPU.isWebGLSupported ? test : skip)('dynamic output 3d kernel map grows webgl', () => { - dynamicOutput3DKernelMapGrows('webgl'); -}); +(GPU.isWebGLSupported ? test : skip)( + 'dynamic output 3d kernel map grows webgl', + () => { + dynamicOutput3DKernelMapGrows('webgl'); + } +); -(GPU.isWebGL2Supported ? test : skip)('dynamic output 3d kernel map grows webgl2', () => { - dynamicOutput3DKernelMapGrows('webgl2'); -}); +(GPU.isWebGL2Supported ? test : skip)( + 'dynamic output 3d kernel map grows webgl2', + () => { + dynamicOutput3DKernelMapGrows('webgl2'); + } +); -(GPU.isHeadlessGLSupported ? test : skip)('dynamic output 3d kernel map grows headlessgl', () => { - dynamicOutput3DKernelMapGrows('headlessgl'); -}); +(GPU.isHeadlessGLSupported ? test : skip)( + 'dynamic output 3d kernel map grows headlessgl', + () => { + dynamicOutput3DKernelMapGrows('headlessgl'); + } +); test('dynamic output 3d kernel map grows cpu', () => { dynamicOutput3DKernelMapGrows('cpu'); }); - function dynamicOutput3DKernelMapShrinks(mode) { const gpu = new GPU({ mode }); - const kernel = gpu.createKernelMap({ - result1: function map(v) { - return v; - } - }, function() { - return map(this.output.x + this.output.y + this.thread.z + this.thread.x + this.thread.y + this.thread.z); - }, { dynamicOutput: true }); - - kernel.setOutput([3,3,3]); + const kernel = gpu.createKernelMap( + { + result1: function map(v) { + return v; + }, + }, + function () { + return map( + this.output.x + + this.output.y + + this.thread.z + + this.thread.x + + this.thread.y + + this.thread.z + ); + }, + { dynamicOutput: true } + ); + + kernel.setOutput([3, 3, 3]); let result = kernel(); assert.equal(result.result.length, 3); assert.equal(result.result1.length, 3); - assert.deepEqual(result.result.map(matrix => matrix.map(row => Array.from(row))), [ - [ - [6,7,8], - [7,8,9], - [8,9,10] - ], + assert.deepEqual( + result.result.map(matrix => matrix.map(row => Array.from(row))), [ - [8,9,10], - [9,10,11], - [10,11,12] - ], - [ - [10,11,12], - [11,12,13], - [12,13,14] + [ + [6, 7, 8], + [7, 8, 9], + [8, 9, 10], + ], + [ + [8, 9, 10], + [9, 10, 11], + [10, 11, 12], + ], + [ + [10, 11, 12], + [11, 12, 13], + [12, 13, 14], + ], ] - ]); - assert.deepEqual(result.result1.map(matrix => matrix.map(row => Array.from(row))), [ - [ - [6,7,8], - [7,8,9], - [8,9,10] - ], + ); + assert.deepEqual( + result.result1.map(matrix => matrix.map(row => Array.from(row))), [ - [8,9,10], - [9,10,11], - [10,11,12] - ], - [ - [10,11,12], - [11,12,13], - [12,13,14] + [ + [6, 7, 8], + [7, 8, 9], + [8, 9, 10], + ], + [ + [8, 9, 10], + [9, 10, 11], + [10, 11, 12], + ], + [ + [10, 11, 12], + [11, 12, 13], + [12, 13, 14], + ], ] - ]); - assert.deepEqual(Array.from(kernel.output), [3,3,3]); + ); + assert.deepEqual(Array.from(kernel.output), [3, 3, 3]); - kernel.setOutput([2,2,2]); + kernel.setOutput([2, 2, 2]); result = kernel(); assert.equal(result.result.length, 2); assert.equal(result.result1.length, 2); - assert.deepEqual(result.result.map(matrix => matrix.map(row => Array.from(row))), [[[4,5],[5,6]],[[6,7],[7,8]]]); - assert.deepEqual(result.result1.map(matrix => matrix.map(row => Array.from(row))), [[[4,5],[5,6]],[[6,7],[7,8]]]); - assert.deepEqual(Array.from(kernel.output), [2,2,2]); + assert.deepEqual( + result.result.map(matrix => matrix.map(row => Array.from(row))), + [ + [ + [4, 5], + [5, 6], + ], + [ + [6, 7], + [7, 8], + ], + ] + ); + assert.deepEqual( + result.result1.map(matrix => matrix.map(row => Array.from(row))), + [ + [ + [4, 5], + [5, 6], + ], + [ + [6, 7], + [7, 8], + ], + ] + ); + assert.deepEqual(Array.from(kernel.output), [2, 2, 2]); gpu.destroy(); } @@ -803,17 +1151,26 @@ test('dynamic output 3d kernel map shrinks gpu', () => { dynamicOutput3DKernelMapShrinks('gpu'); }); -(GPU.isWebGLSupported ? test : skip)('dynamic output 3d kernel map shrinks webgl', () => { - dynamicOutput3DKernelMapShrinks('webgl'); -}); - -(GPU.isWebGL2Supported ? test : skip)('dynamic output 3d kernel map shrinks webgl2', () => { - dynamicOutput3DKernelMapShrinks('webgl2'); -}); - -(GPU.isHeadlessGLSupported ? test : skip)('dynamic output 3d kernel map shrinks headlessgl', () => { - dynamicOutput3DKernelMapShrinks('headlessgl'); -}); +(GPU.isWebGLSupported ? test : skip)( + 'dynamic output 3d kernel map shrinks webgl', + () => { + dynamicOutput3DKernelMapShrinks('webgl'); + } +); + +(GPU.isWebGL2Supported ? test : skip)( + 'dynamic output 3d kernel map shrinks webgl2', + () => { + dynamicOutput3DKernelMapShrinks('webgl2'); + } +); + +(GPU.isHeadlessGLSupported ? test : skip)( + 'dynamic output 3d kernel map shrinks headlessgl', + () => { + dynamicOutput3DKernelMapShrinks('headlessgl'); + } +); test('dynamic output 3d kernel map shrinks cpu', () => { dynamicOutput3DKernelMapShrinks('cpu'); diff --git a/test/features/function-return.js b/test/features/function-return.js index 45988f5c..52a15480 100644 --- a/test/features/function-return.js +++ b/test/features/function-return.js @@ -1,15 +1,18 @@ const { assert, skip, test, module: describe, only } = require('qunit'); -const { GPU } = require('../../src'); +const { GPU } = require('../..'); describe('features: function return'); -function functionReturnFloat( mode ) { +function functionReturnFloat(mode) { const gpu = new GPU({ mode }); - const f = gpu.createKernel(function() { - return 42; - }, { - output : [1] - }); + const f = gpu.createKernel( + function () { + return 42; + }, + { + output: [1], + } + ); assert.equal(f()[0], 42); gpu.destroy(); } @@ -38,14 +41,16 @@ test('float cpu', () => { functionReturnFloat('cpu'); }); - -function functionReturnArray2( mode ) { +function functionReturnArray2(mode) { const gpu = new GPU({ mode }); - const f = gpu.createKernel(function() { - return [42, 43]; - }, { - output : [1] - }); + const f = gpu.createKernel( + function () { + return [42, 43]; + }, + { + output: [1], + } + ); const result = f(); assert.equal(result[0].constructor, Float32Array); assert.equal(result[0][0], 42); @@ -61,29 +66,41 @@ function functionReturnArray2( mode ) { functionReturnArray2('gpu'); }); -(GPU.isWebGLSupported && GPU.isSinglePrecisionSupported ? test : skip)('Array(2) webgl', () => { - functionReturnArray2('webgl'); -}); +(GPU.isWebGLSupported && GPU.isSinglePrecisionSupported ? test : skip)( + 'Array(2) webgl', + () => { + functionReturnArray2('webgl'); + } +); -(GPU.isWebGL2Supported && GPU.isSinglePrecisionSupported ? test : skip)('Array(2) webgl2', () => { - functionReturnArray2('webgl2'); -}); +(GPU.isWebGL2Supported && GPU.isSinglePrecisionSupported ? test : skip)( + 'Array(2) webgl2', + () => { + functionReturnArray2('webgl2'); + } +); -(GPU.isHeadlessGLSupported && GPU.isSinglePrecisionSupported ? test : skip)('Array(2) headlessgl', () => { - functionReturnArray2('headlessgl'); -}); +(GPU.isHeadlessGLSupported && GPU.isSinglePrecisionSupported ? test : skip)( + 'Array(2) headlessgl', + () => { + functionReturnArray2('headlessgl'); + } +); test('Array(2) cpu', () => { functionReturnArray2('cpu'); }); -function functionReturnArray3( mode ) { +function functionReturnArray3(mode) { const gpu = new GPU({ mode }); - const f = gpu.createKernel(function() { - return [42, 43, 44]; - }, { - output : [1] - }); + const f = gpu.createKernel( + function () { + return [42, 43, 44]; + }, + { + output: [1], + } + ); const result = f(); assert.equal(result[0].constructor, Float32Array); assert.equal(result[0][0], 42); @@ -100,30 +117,41 @@ function functionReturnArray3( mode ) { functionReturnArray3('gpu'); }); -(GPU.isWebGLSupported && GPU.isSinglePrecisionSupported ? test : skip)('Array(3) webgl', () => { - functionReturnArray3('webgl'); -}); +(GPU.isWebGLSupported && GPU.isSinglePrecisionSupported ? test : skip)( + 'Array(3) webgl', + () => { + functionReturnArray3('webgl'); + } +); -(GPU.isWebGL2Supported && GPU.isSinglePrecisionSupported ? test : skip)('Array(3) webgl2', () => { - functionReturnArray3('webgl2'); -}); +(GPU.isWebGL2Supported && GPU.isSinglePrecisionSupported ? test : skip)( + 'Array(3) webgl2', + () => { + functionReturnArray3('webgl2'); + } +); -(GPU.isHeadlessGLSupported && GPU.isSinglePrecisionSupported ? test : skip)('Array(3) headlessgl', () => { - functionReturnArray3('headlessgl'); -}); +(GPU.isHeadlessGLSupported && GPU.isSinglePrecisionSupported ? test : skip)( + 'Array(3) headlessgl', + () => { + functionReturnArray3('headlessgl'); + } +); test('Array(3) cpu', () => { functionReturnArray3('cpu'); }); - -function functionReturnArray4( mode ) { +function functionReturnArray4(mode) { const gpu = new GPU({ mode }); - const f = gpu.createKernel(function() { - return [42, 43, 44, 45]; - }, { - output : [1] - }); + const f = gpu.createKernel( + function () { + return [42, 43, 44, 45]; + }, + { + output: [1], + } + ); const result = f(); assert.equal(result[0].constructor, Float32Array); @@ -142,17 +170,26 @@ function functionReturnArray4( mode ) { functionReturnArray4('gpu'); }); -(GPU.isWebGLSupported && GPU.isSinglePrecisionSupported ? test : skip)('Array(4) webgl', () => { - functionReturnArray4('webgl'); -}); +(GPU.isWebGLSupported && GPU.isSinglePrecisionSupported ? test : skip)( + 'Array(4) webgl', + () => { + functionReturnArray4('webgl'); + } +); -(GPU.isWebGL2Supported && GPU.isSinglePrecisionSupported ? test : skip)('Array(4) webgl2', () => { - functionReturnArray4('webgl2'); -}); +(GPU.isWebGL2Supported && GPU.isSinglePrecisionSupported ? test : skip)( + 'Array(4) webgl2', + () => { + functionReturnArray4('webgl2'); + } +); -(GPU.isHeadlessGLSupported && GPU.isSinglePrecisionSupported ? test : skip)('Array(4) headlessgl', () => { - functionReturnArray4('headlessgl'); -}); +(GPU.isHeadlessGLSupported && GPU.isSinglePrecisionSupported ? test : skip)( + 'Array(4) headlessgl', + () => { + functionReturnArray4('headlessgl'); + } +); test('Array(4) cpu', () => { functionReturnArray4('cpu'); @@ -160,18 +197,27 @@ test('Array(4) cpu', () => { function functionReturnArray4MemberExpression(mode) { const gpu = new GPU({ mode }); - const kernel = gpu.createKernel(function(value) { - let pixel = toIntArray4(value[this.thread.y][this.thread.x]); - return pixel; - function toIntArray4(pixel) { - return [pixel[0] * 255, pixel[1] * 255, pixel[2] * 255, pixel[3] * 255]; + const kernel = gpu.createKernel( + function (value) { + let pixel = toIntArray4(value[this.thread.y][this.thread.x]); + return pixel; + + function toIntArray4(pixel) { + return [ + pixel[0] * 255, + pixel[1] * 255, + pixel[2] * 255, + pixel[3] * 255, + ]; + } + }, + { + output: [1, 1], + argumentTypes: { value: 'Array2D(4)' }, } - }, { - output: [1, 1], - argumentTypes: { value: 'Array2D(4)' }, - }); - const result = kernel([[[1,1,1,1]]]); - assert.deepEqual(Array.from(result[0][0]), [255,255,255,255]); + ); + const result = kernel([[[1, 1, 1, 1]]]); + assert.deepEqual(Array.from(result[0][0]), [255, 255, 255, 255]); gpu.destroy(); } @@ -197,4 +243,4 @@ test('gpu', () => { test('cpu', () => { functionReturnArray4MemberExpression('cpu'); -}); \ No newline at end of file +}); diff --git a/test/features/get-canvas.js b/test/features/get-canvas.js index ef247ad1..b8db2fd0 100644 --- a/test/features/get-canvas.js +++ b/test/features/get-canvas.js @@ -1,33 +1,38 @@ const { assert, skip, test, module: describe } = require('qunit'); -const { GPU } = require('../../src'); +const { GPU } = require('../..'); describe('get canvas'); -function getCanvasTest(mode ) { +function getCanvasTest(mode) { const gpu = new GPU(); assert.ok(gpu.context === null, 'context is initially null'); assert.ok(gpu.canvas === null, 'canvas is initially null'); - const render = gpu.createKernel(function() { - this.color(0, 0, 0, 1); - }, { - output : [30,30], - mode : mode - }).setGraphical(true); + const render = gpu + .createKernel( + function () { + this.color(0, 0, 0, 1); + }, + { + output: [30, 30], + mode: mode, + } + ) + .setGraphical(true); assert.ok(render !== null, 'function generated test'); - assert.ok(render.canvas, 'testing for canvas after createKernel' ); - assert.ok(render.context, 'testing for context after createKernel' ); - assert.ok(gpu.canvas, 'testing for canvas after createKernel' ); - assert.ok(gpu.context, 'testing for context after createKernel' ); + assert.ok(render.canvas, 'testing for canvas after createKernel'); + assert.ok(render.context, 'testing for context after createKernel'); + assert.ok(gpu.canvas, 'testing for canvas after createKernel'); + assert.ok(gpu.context, 'testing for context after createKernel'); render(); - assert.ok(render.canvas, 'testing for canvas after render' ); - assert.ok(render.context, 'testing for context after render' ); - assert.ok(gpu.canvas, 'testing for canvas after render' ); - assert.ok(gpu.context, 'testing for context after render' ); + assert.ok(render.canvas, 'testing for canvas after render'); + assert.ok(render.context, 'testing for context after render'); + assert.ok(gpu.canvas, 'testing for canvas after render'); + assert.ok(gpu.context, 'testing for context after render'); assert.equal(render.canvas, gpu.canvas); assert.equal(render.context, gpu.context); diff --git a/test/features/get-pixels.js b/test/features/get-pixels.js index 4e15491a..65de1d0a 100644 --- a/test/features/get-pixels.js +++ b/test/features/get-pixels.js @@ -1,325 +1,160 @@ const { assert, test, module: describe, only, skip } = require('qunit'); -const { GPU } = require('../../src'); +const { GPU } = require('../..'); describe('features: getPixels'); function getPixelsStandard(mode) { const gpu = new GPU({ mode }); - const kernel = gpu.createKernel(function(v) { - this.color( - v[this.thread.y][this.thread.x][0], - v[this.thread.y][this.thread.x][1], - v[this.thread.y][this.thread.x][2] - ); - }, { - output: [2,2], - graphical: true, - }); + const kernel = gpu.createKernel( + function (v) { + this.color( + v[this.thread.y][this.thread.x][0], + v[this.thread.y][this.thread.x][1], + v[this.thread.y][this.thread.x][2] + ); + }, + { + output: [2, 2], + graphical: true, + } + ); kernel([ [ - [.02,.04,.06,.08], - [.10,.12,.14,.16] + [0.02, 0.04, 0.06, 0.08], + [0.1, 0.12, 0.14, 0.16], ], [ - [.18,.20,.22,.24], - [.26,.28,.30,.32] - ] + [0.18, 0.2, 0.22, 0.24], + [0.26, 0.28, 0.3, 0.32], + ], ]); const pixels = Array.from(kernel.getPixels()); gpu.destroy(); return pixels; } - test('standard auto', () => { const pixels = getPixelsStandard(); - assert.deepEqual(pixels, [ - 46, - 51, - 56, - 255, - 66, - 71, - 76, - 255, - 5, - 10, - 15, - 255, - 25, - 31, - 36, - 255 - ]); + assert.deepEqual( + pixels, + [46, 51, 56, 255, 66, 71, 76, 255, 5, 10, 15, 255, 25, 31, 36, 255] + ); }); test('standard gpu', () => { const pixels = getPixelsStandard('gpu'); - assert.deepEqual(pixels, [ - 46, - 51, - 56, - 255, - 66, - 71, - 76, - 255, - 5, - 10, - 15, - 255, - 25, - 31, - 36, - 255 - ]); + assert.deepEqual( + pixels, + [46, 51, 56, 255, 66, 71, 76, 255, 5, 10, 15, 255, 25, 31, 36, 255] + ); }); (GPU.isWebGLSupported ? test : skip)('standard webgl', () => { const pixels = getPixelsStandard('webgl'); - assert.deepEqual(pixels, [ - 46, - 51, - 56, - 255, - 66, - 71, - 76, - 255, - 5, - 10, - 15, - 255, - 25, - 31, - 36, - 255 - ]); + assert.deepEqual( + pixels, + [46, 51, 56, 255, 66, 71, 76, 255, 5, 10, 15, 255, 25, 31, 36, 255] + ); }); (GPU.isWebGL2Supported ? test : skip)('standard webgl2', () => { const pixels = getPixelsStandard('webgl2'); - assert.deepEqual(pixels, [ - 46, - 51, - 56, - 255, - 66, - 71, - 76, - 255, - 5, - 10, - 15, - 255, - 25, - 31, - 36, - 255 - ]); + assert.deepEqual( + pixels, + [46, 51, 56, 255, 66, 71, 76, 255, 5, 10, 15, 255, 25, 31, 36, 255] + ); }); (GPU.isHeadlessGLSupported ? test : skip)('standard headlessgl', () => { const pixels = getPixelsStandard('headlessgl'); - assert.deepEqual(pixels, [ - 46, - 51, - 56, - 255, - 66, - 71, - 76, - 255, - 5, - 10, - 15, - 255, - 25, - 31, - 36, - 255 - ]); + assert.deepEqual( + pixels, + [46, 51, 56, 255, 66, 71, 76, 255, 5, 10, 15, 255, 25, 31, 36, 255] + ); }); (GPU.isCanvasSupported ? test : skip)('standard cpu', () => { const pixels = getPixelsStandard('cpu'); - assert.deepEqual(pixels, [ - 45, - 51, - 56, - 255, - 66, - 71, - 76, - 255, - 5, - 10, - 15, - 255, - 25, - 30, - 35, - 255 - ]); + assert.deepEqual( + pixels, + [45, 51, 56, 255, 66, 71, 76, 255, 5, 10, 15, 255, 25, 30, 35, 255] + ); }); - function getPixelsFlipped(mode) { const gpu = new GPU({ mode }); - const kernel = gpu.createKernel(function(v) { - this.color( - v[this.thread.y][this.thread.x][0], - v[this.thread.y][this.thread.x][1], - v[this.thread.y][this.thread.x][2] - ); - }, { - output: [2,2], - graphical: true, - }); + const kernel = gpu.createKernel( + function (v) { + this.color( + v[this.thread.y][this.thread.x][0], + v[this.thread.y][this.thread.x][1], + v[this.thread.y][this.thread.x][2] + ); + }, + { + output: [2, 2], + graphical: true, + } + ); kernel([ [ - [.02,.04,.06,.08], - [.10,.12,.14,.16] + [0.02, 0.04, 0.06, 0.08], + [0.1, 0.12, 0.14, 0.16], ], [ - [.18,.20,.22,.24], - [.26,.28,.30,.32] - ] + [0.18, 0.2, 0.22, 0.24], + [0.26, 0.28, 0.3, 0.32], + ], ]); const pixels = Array.from(kernel.getPixels(true)); gpu.destroy(); return pixels; } - test('flipped auto', () => { const pixels = getPixelsFlipped(); - assert.deepEqual(pixels, [ - 5, - 10, - 15, - 255, - 25, - 31, - 36, - 255, - 46, - 51, - 56, - 255, - 66, - 71, - 76, - 255 - ]); + assert.deepEqual( + pixels, + [5, 10, 15, 255, 25, 31, 36, 255, 46, 51, 56, 255, 66, 71, 76, 255] + ); }); test('flipped gpu', () => { const pixels = getPixelsFlipped('gpu'); - assert.deepEqual(pixels, [ - 5, - 10, - 15, - 255, - 25, - 31, - 36, - 255, - 46, - 51, - 56, - 255, - 66, - 71, - 76, - 255 - ]); + assert.deepEqual( + pixels, + [5, 10, 15, 255, 25, 31, 36, 255, 46, 51, 56, 255, 66, 71, 76, 255] + ); }); (GPU.isWebGLSupported ? test : skip)('flipped webgl', () => { const pixels = getPixelsFlipped('webgl'); - assert.deepEqual(pixels, [ - 5, - 10, - 15, - 255, - 25, - 31, - 36, - 255, - 46, - 51, - 56, - 255, - 66, - 71, - 76, - 255 - ]); + assert.deepEqual( + pixels, + [5, 10, 15, 255, 25, 31, 36, 255, 46, 51, 56, 255, 66, 71, 76, 255] + ); }); (GPU.isWebGL2Supported ? test : skip)('flipped webgl2', () => { const pixels = getPixelsFlipped('webgl2'); - assert.deepEqual(pixels, [ - 5, - 10, - 15, - 255, - 25, - 31, - 36, - 255, - 46, - 51, - 56, - 255, - 66, - 71, - 76, - 255 - ]); + assert.deepEqual( + pixels, + [5, 10, 15, 255, 25, 31, 36, 255, 46, 51, 56, 255, 66, 71, 76, 255] + ); }); (GPU.isHeadlessGLSupported ? test : skip)('flipped headlessgl', () => { const pixels = getPixelsFlipped('headlessgl'); - assert.deepEqual(pixels, [ - 5, - 10, - 15, - 255, - 25, - 31, - 36, - 255, - 46, - 51, - 56, - 255, - 66, - 71, - 76, - 255 - ]); + assert.deepEqual( + pixels, + [5, 10, 15, 255, 25, 31, 36, 255, 46, 51, 56, 255, 66, 71, 76, 255] + ); }); (GPU.isCanvasSupported ? test : skip)('flipped cpu', () => { const pixels = getPixelsFlipped('cpu'); - assert.deepEqual(pixels, [ - 5, - 10, - 15, - 255, - 25, - 30, - 35, - 255, - 45, - 51, - 56, - 255, - 66, - 71, - 76, - 255 - ]); + assert.deepEqual( + pixels, + [5, 10, 15, 255, 25, 30, 35, 255, 45, 51, 56, 255, 66, 71, 76, 255] + ); }); diff --git a/test/features/if-else.js b/test/features/if-else.js index c082c475..1f2494f9 100644 --- a/test/features/if-else.js +++ b/test/features/if-else.js @@ -1,24 +1,28 @@ const { assert, skip, test, module: describe } = require('qunit'); -const { GPU } = require('../../src'); +const { GPU } = require('../..'); describe('if else boolean'); + function ifElseBooleanTest(mode) { const gpu = new GPU({ - mode + mode, }); - const f = gpu.createKernel(function() { - let result = 0; - if (true) { - result = 4; - } else { - result = 2; + const f = gpu.createKernel( + function () { + let result = 0; + if (true) { + result = 4; + } else { + result = 2; + } + return result; + }, + { + output: [1], } - return result; - }, { - output : [1] - }); + ); - assert.ok( f !== null, 'function generated test'); + assert.ok(f !== null, 'function generated test'); assert.equal(f()[0], 4, 'basic return function test'); gpu.destroy(); } @@ -47,22 +51,29 @@ test('cpu', () => { ifElseBooleanTest('cpu'); }); - describe('if else lookup'); -function ifElseLookupTest( mode ) { + +function ifElseLookupTest(mode) { const gpu = new GPU({ mode }); - const f = gpu.createKernel(function(x) { - if (x[this.thread.x] > 0) { - return 0; - } else { - return 1; + const f = gpu.createKernel( + function (x) { + if (x[this.thread.x] > 0) { + return 0; + } else { + return 1; + } + }, + { + output: [4], } - }, { - output : [4] - }); - - assert.ok( f !== null, 'function generated test'); - assert.deepEqual(Array.from(f([1, 1, 0, 0])), [0, 0, 1, 1], 'basic return function test'); + ); + + assert.ok(f !== null, 'function generated test'); + assert.deepEqual( + Array.from(f([1, 1, 0, 0])), + [0, 0, 1, 1], + 'basic return function test' + ); gpu.destroy(); } @@ -91,20 +102,28 @@ test('cpu', () => { }); describe('if else if'); -function ifElseIfTest( mode ) { + +function ifElseIfTest(mode) { const gpu = new GPU({ mode }); - const f = gpu.createKernel(function(x) { - const v = x[this.thread.x]; - if (v > 0) { - return 0; - } else if (v < 1) { - return .5; + const f = gpu.createKernel( + function (x) { + const v = x[this.thread.x]; + if (v > 0) { + return 0; + } else if (v < 1) { + return 0.5; + } + return 1; + }, + { + output: [2], } - return 1; - }, { - output : [2] - }); - assert.deepEqual(Array.from(f([-1, 1])), [.5, 0], 'basic return function test'); + ); + assert.deepEqual( + Array.from(f([-1, 1])), + [0.5, 0], + 'basic return function test' + ); gpu.destroy(); } @@ -130,4 +149,4 @@ test('gpu', () => { test('cpu', () => { ifElseIfTest('cpu'); -}); \ No newline at end of file +}); diff --git a/test/features/image-array.js b/test/features/image-array.js index 023d0ac6..d69dc659 100644 --- a/test/features/image-array.js +++ b/test/features/image-array.js @@ -1,16 +1,18 @@ const { assert, skip, test, module: describe, only } = require('qunit'); -const { GPU, CPUKernel } = require('../../src'); +const { GPU, CPUKernel } = require('../..'); describe('features: image array'); + function getImages(callback) { const imageSources = [ 'data:image/jpeg;base64,/9j/4AAQSkZJRgABAgAAAQABAAD/2wBDAAgGBgcGBQgHBwcJCQgKDBQNDAsLDBkSEw8UHRofHh0aHBwgJC4nICIsIxwcKDcpLDAxNDQ0Hyc5PTgyPC4zNDL/2wBDAQkJCQwLDBgNDRgyIRwhMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjL/wAARCABbAIoDASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwDtjB/vL/wHP8qUBk//AGv8anjEr/7L/wC1z/hUhib+Lb/wHj+dfQOfc893WjK/+8u3/a6f5/OkU7Plb7nZun4Yqx5TJ93/ANB/w4pvkb/67cH8xS5kNW6htpCtRm2b7yv9duf1BNO2/wB75f8AaXj+dO4uVdGBWkI2UpXZ/Ezf72Qf/r1KsS/eXbRzE7Fb/d3Uv/AW/n/KrOyneXRzCKqbX+X/AMd6H8quww76jMKv97/P0qxC2z5W/BvX/wCvWc5aaAONtUDxbKtvLUON9RFvqBGq1JipAlCKzPuocihM06nrFsepNiVDkgKRs4n/AINv+7x/KmeTKn/LVvbdhh/iPzq3HJ/C303difT2PtU+2jna3HzSW5n/AL9PvKrf7uRSM8T/AOsiZf8Aa6/qKumHZ/q/l/2e3/1qbtV/9l/896OdBzLsVBEr/wCrfd/P86Ywli+8m5P5/wBKtPaL97b/AOyn8xTNsqfxbv8AZk4P5iq5gKwVX+aP7v8Ad/wBpEj2fd+51G3t6jB6VK6qn96Dd9Cuf5VG4/iWXa/5girTCxIP++v93r+VPUK/3agllaL5ZEX/AHucfgR0/HFSfvfvSbV9JFbj8Tjp+GKTDke5NspfL/haoVafzPmTcvZl53epA46VaRt393/DPTI7VDdhONiHbs+99z+96fX/ABqZVqbb/eqJJET5V3MvT2B9MmpcriJVjp0UVBbZHuZ4ok/vNz/hUIv7T7v21V/4DgfqKj3nsVYsiOneXTVli8vct1Gyd23KQPyxVT+29MHB1C0z/vCpipS2RSpyeyuUfKn/AIrhW/2vN4+hAUfrSJcT277ZNzJ2aPLAe3DVvgU14ll+WRVb/eXNae27o1VZdUY6ao3/ADyZk6D5GyfXHAx3/KnNqcb/AHopFbt0q81rsj2wttX/AJ5su5fy6j8KhO6L70W3/aVuD+fT86FKD2QOVJ7Rt8yuupx/db7/AF+6w/QrUy3cD/xr/wB9L/LOaZJEv3vs7f8AfJX9QSDVbyf+mUsUq9GVcj+fT2xVpRaIcab2v+BZNxbfd81f93qPyqu/2R/vSqqdmVuP/rfhT992ke1oo2/LP5cGkjWN/mkRWf8A2sqB+GMU1pqCiluQW9xI++NWgliVsDc4BYeuP0/ClS4+zx7Wib5ePlbr+Jx+tPDRyu/z7Zdxxtw2AMDucY46U77b5Ue5pYv9tVz26jB/pVPXoW4puyiPivYn/dq67P7sjBSPT6j3p8vyfeZV7/T15/z+fXOn1LTZZ/IbazbciaFOPx/qKqSXdy8nl2Hn/d5ZWyOuON3GKaotvt6m0MJKT2t67fedLDJE3zM3zc/MzZzjuO1NnuILe3/eN8zNkKq5ZmJyAB3Oa5wJ4it/lWJvK7fKGwPfr/Wov7H1O7f7RLcbZW6qzFcD0yP8MUfV4p+9JWN44CnH3qtVW8tWyxqOptLOvmI3m9Et1+bae+e2ahSy1K4/1zrAjdFVQT/WtLSxY6Z/q5W+0N/E0YbJ7gEdunetq2n1C4j+7Ay/7WVP5ZNVKt7NWgtPMU50qWlKK9WvyT0XzuctZ6TbS3yW0zK0rZKSN82SOcY7cZP4Vq/8I1EON1vx/sf/AF6uXtg1xG3k/u72P50WT2PUH/PXnFU18QQKoEthfrIBhgucA98VDr1Z6wZzTq1amrkzeFLSZozXCcgU1qUmmk1SEQtAv/LNmj/3en5VBI86fet/N/2o8fqDVyirT7jUrbq5nm+g8v8AiXsVkXp6+1RM8cv+p2+zbsEfQdPxP5GrV3brcSRfdV1yQ20Hkdv1P5Uxo28zbG8ay/7K8D684P061onG2hsvZ2utyv5WyPy47hW7/vMce+fWiJInkaHarfxbmYnr1AHIJzzn3qd1kf8Ac/uvvAlmXIb/AOv7fSnppkH3m+ZmxnaoUce3+etHOurHzJLViT2FpcQeXPZfJ1+7nB+oOazDoMtvJ5lle/PtIEMnAxnIHP5fia1xYKnzR7v93eRT/Lb7q3Esbf3ZMOp/E/40o1ZR0i9P69S6eInBcqlp2ev+ZXtNQlidYbuLypePl3AZPsc/596qXl0t7fPpUCSLt5uWXB2L1wMHnPcf1q9cRK8Hk3turRd/Qe4J+6fyrGutMl0+f7bDcSz2rYjkXzCrBeylhzjOBVU1Byvs+na5rh40nJuTs7adrmgkuiW/7mPy1+bDxqpYkHvjB74psWtLFO26KSW328MyZdPw5LD9frVhYrN7RGWw2pt3Iy4baRzkHr9akNnBLI+37/de49x6/wA/rUc0Nea7MZNdE/mWSIru0intLhZEZhsZW3D069vQj3NaCSRuit5mMgHBcAj8O1chPb32j3bzWn325kj/AIJhjrjs3vV3+3NGk+eS3cSNyw9+9TPDSaThqvIajfWJqbqN1V91Lupcpxk2+mFqZmkJppAPzS7qizRmnYRIdr/K1AC+XtX5VqPNKDRYdxQv7xFX+4fvc9SP8DTsyp/DuT9R9PWmj/WbvoPyz/jUgNJjuPR9/wAy0/G/71Q7f4l+V/5/WpFl/hb5W/Q/Q1D8hj1h2f6v/vlun/1qrta7N7W/7p2Uh7duEf6H+E+4/EVcBp/3/lao5mjSLsc9pVxPdR3vk/K0bMGsmwAO3GehOCeuOfrWnDLFcbJFVliZTjdwUx1Xg5GPQ+/pWbqGns2oytC7xy7VeOTqVIHIyTypGePUdQcUmm3Uj3UsckTLKu57iPkkdBuHqcncD1IK9xW00pJzidkoKcXKHT8P815/f3NO5gk8t9v71dvCt1UnsD3z1H/165d7iNXZcKMHGGBz+NdbA2/zVb+HCv8ATkg/1+lYE5fz5N1pEzbjklevNVh52umRSV2y+Gpd1QrThWnKeeS5pM0ykNTYCTdSbqjpafKBJmlBqOlFKwEwNOBqEVIKmwEympAN/wArVCtSCs2UhwLRf7UX5lf8RVlTUK0ltwJVHRTwPTgGoaNER3yr5luzfKrN5b+2eVP/AH0B+dZ0nlJrtr527zZEeEMvthlP5bgfcVpX6hrJlIyPMTj/AIEKxNTZm1OzBJI+XjPq65rSlHm09TqoPX1Vvv2/EtCT+ytZSOT5re4XyQ3XZjkZz2+bH+cVbksJGldlkwCxIFV9SUSW8e4Z4iP6mr8Mj+TH87fdHf2pSm4pS6m0G9Gt+p//2Q==', 'data:image/jpeg;base64,/9j/4AAQSkZJRgABAgAAAQABAAD/2wBDAAgGBgcGBQgHBwcJCQgKDBQNDAsLDBkSEw8UHRofHh0aHBwgJC4nICIsIxwcKDcpLDAxNDQ0Hyc5PTgyPC4zNDL/2wBDAQkJCQwLDBgNDRgyIRwhMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjL/wAARCABbAIoDASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwD1ZOlIwpwjKH5ehprSgHB69MelepfsecRkUgXmrBTofWkK01ICAimkVOVppFNSArkUhFSsvNMK1aYEZ60lPxzSEVQCdKM80YpD0pgLmlzTMU4daQEq9aD1pueKXPFSJjWptONNqkI1XYopwM+1ZbTrPqMUKnKqGdztI6cY/WobvxRpaSDM6SqOixHdmp9ClS8lkuVBHyBcHHBJye/T/AVmqcqcXOSOj2copuSNIAMBjtQV4qQL+8agisLmViAik21MVppWqTEV2WmMOKsEVGRzVJiK5FNIqZhzSYrRMCEikxUpWm7aaYEeKMYp+KQincBmeaN1KRSYqgGlqN1JRTsIqXfhsSZRYFPGd6DBH0rJhkuNPu3t5Lp7eKVhIGiG0E+/p7jpXf2kkc8qskqSxmPcsq9GzzzjjtWRrmlrdNIURfMABB9Mc5/Wpo4tuXJU2OyFSSTiyxpF+9yXguAolxuVlz849a0ytcTo98YxFJ/zwcDj+6ex/X8hXdFRj5elc+Kp+znoYNFcimkVORTCKwUiWiAioytTkc0xulaJksgIpmOamNMIq0xDCKbjmpaaasCIimkU800mqTGMIppFPJqMmqQhpFJQTTc1aAmvdNm065e901QV8zf5QOOeCQfY5P0/GtCG+gvXt7tCyjzfLcNwUJXGD75wPzq9Yyx3mno4fzA2cuv16/yrldRl/sW8unLAxylSUK91wcj8MVyQvWfJL4kd9OnKpLkS1M+ytZItSvtKRdzm4ba57KST+g5rvYohFCsakkKAuT14rlvC8iXur3d7MrfaG+58pIVTyeex6V1veqxs25qL6Wv62Lx1P2dVxe+79X28iIjmo261M1RN1rlRwsjbpUZqRqibpWqIYw0w0400mrQhKaaU00mrQDDTG609jxUZq0Ah6VGaeTTD1q0AxutMp7dKZViuW9JZoAzW2N4Yb0B4cHlWGeM9vy5FUdens7/UrON0DYfLg9kwCQfQ5Q/5xUunTJY395A2VDLuT/fX5vyP+etYWqqxuftoYbp5d7D+7jp/n2qKdK9Zy+75n0eXUU6972009Wv0Op8IKg0yVtipI0zFgO3oPpXQGuV0W7ijsoDE8aXRzvhkfb5uScEH1x+fFbC6oNxSS0nVwOV4JH4Z/kPxrjxEJSqyZw4yEpVpNLqXmqJqSK5juY1lifzEbo3+eh7Y60jNWSTOCWmjI2qJjzTnaoWat4ozYrHimE8UwtzTS9aJCHE03PNNL00tVJAOJphNGaQmrSEIaYad3ppqgGt0plONNqhMj0KJtRivL6fDPHCYVPYNjn/PvVLWopI9Qa3ZT5Yyyt65A/rmtLwwxWDVQMAC6bAA6dR/ICqeruxuYWJyTbqD+lSpNVpW2t+iPrcNFxxcoLZbeXYuaalo2jW0N1DFLIqsoS4j4kwx6Ng/5B/HHv7/AM27SztbYxIxWMIH6OxAHI6rzn/gNWoWIvIwDgc8dv4/8BWAzM9/ZsScmRiefdv8BV0IKTbl1uzVYVqdSpe6ScrPbq9vkek2dt9ktI4twcgEs+MbmJyT9Sc5pzmnn7oqN+lecrt3Z8nOTk231IHNQualeq79a3ijMaTUZahqjNapCuPzSZplFVYB+aM0ylHWiwD6aaKQ9KAGmm0402qEz//Z', 'data:image/jpeg;base64,/9j/4AAQSkZJRgABAgAAAQABAAD/2wBDAAgGBgcGBQgHBwcJCQgKDBQNDAsLDBkSEw8UHRofHh0aHBwgJC4nICIsIxwcKDcpLDAxNDQ0Hyc5PTgyPC4zNDL/2wBDAQkJCQwLDBgNDRgyIRwhMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjL/wAARCABbAIoDASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwD0hXp4eqSyVIJK91wPKuWt1IXqDfSF/ep5QuT76duqtupd9HKFyxvpQ9Vw9OD0uUZZDVKGqoHqRXqHEC2pqQGqqvUivWUojLamkY+XIJR904V/p61ErVJkFdp+6QQfes2jRMW+kEVo7tx04988VhyLHcC4mkYpA5MSuW6Lv4bPb7zc/wC7VLV9YeRjp8SgiEMZ2J+8AOAD2B459xUU93A0VuTM08QBLRxJsRD0wB/U8/06KdKUUu7PYw+BlyRk9L6/Lf8AHpc0xembS4ZJZf3shViUH3QoLYPpzkYpiapqGxfLmjEePlB647VTd2usxoX2KqbS5yAB6Z6dKP7JRvmJ5PJwTT5Yx+I744OnbXS/lciWWpFkx3rPElPEpr0XTPkLl/zaPNqj5h9ad5lT7MLl7zKXfVIS04Se9LkC5cD04PVMS04SVLgO5dD1Kr+9UBJUokqHAdy8slSq9UFkqRZKylAo0FkqUPWeslTLJWUoDTKusaJaalHK4UR3TKQJk4J4wN394fWuVsgyyLbTR+XMp2lC2fMXoefX+tdur4rK1vQ7fWIw2fKuUHyTL1z7j/J461pTqSUeRu1+vb/gHtZbmfsX7OtrD77enl5EdjLDkW0kmzJxBN0Vz2GTwGH93vj3qx/ZMg/vD2S9mRfwUAgD2HArkptB8SQhlWWO4U8ZD4L+mc4Bx75PvVddL1xVAGnSAAYAEygCuSphJyd1JM+gj9Vqe8q8V80v1RoCTNOD1TV6f5lfRuB+elrzDR5lVfMo8ylyCLokpwlqiJKd5nvR7Mdy6JPepBJ71QElSBz61DgO5fV6kElUBJTxLWbgVc0VkqRZKzllqVZazdMdzRWSpBL71nCanib3rN0x3NIS+9O833rOEvvTxL71Hsyrl7ePp+FLvH91aoed707zvep9mO5xCy0/zazxLUgkr6F0zluXPMpfNqn5lKJaXIFy6JKeHqkHp4kqeQZbElPWSqe+nK9Q4AXhJThJVMS04SVDgVcvCWnrLVASe9SCT3qHAdy+JaeJKoLJ71KJKhwGXRKfWneafWqe+jzPeo5ALnmn1pfO96oiSjzKXswuccstSCWqCye9SCSvecDkUy55lKJKqeZTg9TyFcxeWSnB6piSnCT3qHAq5c8yniSqQkp4epcCrlwPTvMqoJKXzKjkGXA59aeJPeqQk96cJKlwGXlkqUSe9UFkp4lqHAdy/wCbS+Z71S8yl8yp5BlzzKPMqp5opfMpcgHFLIakEtVQaXJr3nFHjqbRcEtOEtVATTgT61DgaKoy8JaUSe9Ugx9akyazcDRVLlwSe9PEnvVME+tPBPrU8pqplsSe9P8AMqmCfWnAn1qXEtSLYc+tOElVQT604E1HKirlsSVIJPeqgJpwJ9ankKuWhL707zaqAn1pcn1qeVDuWxJS+ZVTJ9aXJ9aXIO5//9k=', - 'data:image/jpeg;base64,/9j/4AAQSkZJRgABAgAAAQABAAD/2wBDAAgGBgcGBQgHBwcJCQgKDBQNDAsLDBkSEw8UHRofHh0aHBwgJC4nICIsIxwcKDcpLDAxNDQ0Hyc5PTgyPC4zNDL/2wBDAQkJCQwLDBgNDRgyIRwhMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjL/wAARCABbAIoDASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwDso4Esrr7RHsZSNrxyLuBx+owO49a0I7TzTuZcBsYwenoMn3oht44pUiuD+7mbYjnsxH3T6Z7fl1xlYrgtp1vCcieK6jgmz2ZXGfzwPzrvxGLV/c37nvQi4LR3emv9dinqK2tgmnsWBAY/Me6iNyST9AaybCQ6l4isYYlVfs4Bk2jhcrl8+vBA+rVjaxrPn+XAmGREIRAfvs5zj/vnaPo9dt4T0Q6VYefOCbudfnLdVGcgfXkk+7H2rSipQp+0n8jbMZrCYV8/xSul+Ov3M6Qtkf0qJzSlqhdhWcUfFEcjVWdqfI4qu710wiSxGamFqQtTC1bJEkm6jNRbqXdTsFyTNAPNR7qN1FguTbhQTUJak30coXHlqTdUZam7qqwmySS7RLV7XV12RkYDn5WHPGcdccHcMjjnb0HLaz4m8tntICJJ5fLBeLncyMNsg92XA9iuPepLfRdeuI2gldkt3Uqy3M5kH5YOfzArc0XwtYaPL9oI+0XZBBmk6jPXA7fz968iGEad5s+5q47BYNOXMpy6JbfN9PlfoUfCfhM2hTUdTTNx96OI8hM9z7+3auy3gZ96g34Hv60xpa62nLc+UxmNq4yq6tZ6/gvJE7SVA8tRNL71A8laRpnK2Pkkquz80xpOetQu9dEYENkxems/FV95z1prSVooE3J99OD1TMlKH96fIFy5vpN9VvMo3+9HIO5OXpPMquZKb5lNQFctb6TeKreZRv8AenyBc6EyZxxjHpSGQVR873pDL71yezNLlxpKheWq5l96ieWrjTE2TtL71C0tQNLULS1tGmS2TtJUTSe9QNLURkraMCWyw0mKYZarmSmb6tQFcsmSgSVVL+9AkquQLlvzKXzKqiSl8z3pcg7lgyc0hkqsXpN9CgJss+ZR5nvVUyUnmGq5BGuZuOtJ5x9ap+ZSebWKpl3LZlPrTGl96rGT3phk96pQAnaWojJzUReomf3rRQE2TNJUZkqJpKiaStFAlk5kppfiq5kpDJV8gix5lAeq2+jzKfIBbD8UGSq3mcUnmUuQZZ8yk8yq++ml+aagBYL0nmVWaSm+YapQIuavmUhkqt5lMMtZchsWjJ70wye9VjJTTJVqAiwZPeo2k96rmSmGSqUBMnZ6jL1C0nFMMlaKBLZMXpu+oC9NL8VagS2WfMo8yqvmUoejkFct+ZRvqrvo8yjkKuWt9NL1X300yUKAXJzJTfMqu0nNM8z3q1AycjTMlNMnvVfJ9aTJ9ajlRvcn8zmkMlV8nPWkJPrT5RNkxkphlqBic9aYSfWrUCHImMlMMlQkn1qNic9atRRm5k5k96aZarkn1ppJ9atQM3ULHm0ol96pkn1pyk+tHIJVC4JPel82quTjrRk0uVFqZZMtMMtQEn1qMk+tNQIlUJ2lpnmmoCTnrTc1ooHPKo2z/9k=' + 'data:image/jpeg;base64,/9j/4AAQSkZJRgABAgAAAQABAAD/2wBDAAgGBgcGBQgHBwcJCQgKDBQNDAsLDBkSEw8UHRofHh0aHBwgJC4nICIsIxwcKDcpLDAxNDQ0Hyc5PTgyPC4zNDL/2wBDAQkJCQwLDBgNDRgyIRwhMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjL/wAARCABbAIoDASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwDso4Esrr7RHsZSNrxyLuBx+owO49a0I7TzTuZcBsYwenoMn3oht44pUiuD+7mbYjnsxH3T6Z7fl1xlYrgtp1vCcieK6jgmz2ZXGfzwPzrvxGLV/c37nvQi4LR3emv9dinqK2tgmnsWBAY/Me6iNyST9AaybCQ6l4isYYlVfs4Bk2jhcrl8+vBA+rVjaxrPn+XAmGREIRAfvs5zj/vnaPo9dt4T0Q6VYefOCbudfnLdVGcgfXkk+7H2rSipQp+0n8jbMZrCYV8/xSul+Ov3M6Qtkf0qJzSlqhdhWcUfFEcjVWdqfI4qu710wiSxGamFqQtTC1bJEkm6jNRbqXdTsFyTNAPNR7qN1FguTbhQTUJak30coXHlqTdUZam7qqwmySS7RLV7XV12RkYDn5WHPGcdccHcMjjnb0HLaz4m8tntICJJ5fLBeLncyMNsg92XA9iuPepLfRdeuI2gldkt3Uqy3M5kH5YOfzArc0XwtYaPL9oI+0XZBBmk6jPXA7fz968iGEad5s+5q47BYNOXMpy6JbfN9PlfoUfCfhM2hTUdTTNx96OI8hM9z7+3auy3gZ96g34Hv60xpa62nLc+UxmNq4yq6tZ6/gvJE7SVA8tRNL71A8laRpnK2Pkkquz80xpOetQu9dEYENkxems/FV95z1prSVooE3J99OD1TMlKH96fIFy5vpN9VvMo3+9HIO5OXpPMquZKb5lNQFctb6TeKreZRv8AenyBc6EyZxxjHpSGQVR873pDL71yezNLlxpKheWq5l96ieWrjTE2TtL71C0tQNLULS1tGmS2TtJUTSe9QNLURkraMCWyw0mKYZarmSmb6tQFcsmSgSVVL+9AkquQLlvzKXzKqiSl8z3pcg7lgyc0hkqsXpN9CgJss+ZR5nvVUyUnmGq5BGuZuOtJ5x9ap+ZSebWKpl3LZlPrTGl96rGT3phk96pQAnaWojJzUReomf3rRQE2TNJUZkqJpKiaStFAlk5kppfiq5kpDJV8gix5lAeq2+jzKfIBbD8UGSq3mcUnmUuQZZ8yk8yq++ml+aagBYL0nmVWaSm+YapQIuavmUhkqt5lMMtZchsWjJ70wye9VjJTTJVqAiwZPeo2k96rmSmGSqUBMnZ6jL1C0nFMMlaKBLZMXpu+oC9NL8VagS2WfMo8yqvmUoejkFct+ZRvqrvo8yjkKuWt9NL1X300yUKAXJzJTfMqu0nNM8z3q1AycjTMlNMnvVfJ9aTJ9ajlRvcn8zmkMlV8nPWkJPrT5RNkxkphlqBic9aYSfWrUCHImMlMMlQkn1qNic9atRRm5k5k96aZarkn1ppJ9atQM3ULHm0ol96pkn1pyk+tHIJVC4JPel82quTjrRk0uVFqZZMtMMtQEn1qMk+tNQIlUJ2lpnmmoCTnrTc1ooHPKo2z/9k=', ]; const images = []; let finished = 0; + function onload() { finished++; if (finished === imageSources.length) { @@ -27,16 +29,19 @@ function getImages(callback) { function imageArrayTest(mode, done) { const gpu = new GPU({ - mode + mode, }); - const imageKernel = gpu.createKernel(function(images) { - const pixel = images[this.thread.z][this.thread.y][this.thread.x]; - this.color(pixel[0], pixel[1], pixel[2], pixel[3]); - }, { - graphical: true, - output : [138, 91] - }); - getImages(function(images) { + const imageKernel = gpu.createKernel( + function (images) { + const pixel = images[this.thread.z][this.thread.y][this.thread.x]; + this.color(pixel[0], pixel[1], pixel[2], pixel[3]); + }, + { + graphical: true, + output: [138, 91], + } + ); + getImages(function (images) { imageKernel(images); const pixels = imageKernel.getPixels(); assert.equal(pixels.length, 50232); diff --git a/test/features/image.js b/test/features/image.js index 1e7101d9..d44d8270 100644 --- a/test/features/image.js +++ b/test/features/image.js @@ -1,19 +1,23 @@ const { assert, skip, test, module: describe } = require('qunit'); -const { GPU } = require('../../src'); +const { GPU } = require('../..'); describe('image'); + function imageArgumentTest(mode, done) { const gpu = new GPU({ mode }); const image = document.createElement('img'); image.src = 'jellyfish-1.jpeg'; - image.onload = function() { - const imageKernel = gpu.createKernel(function(image) { - const pixel = image[this.thread.y][this.thread.x]; - this.color(pixel[0], pixel[1], pixel[2], pixel[3]); - }, { - graphical: true, - output : [image.width, image.height] - }); + image.onload = function () { + const imageKernel = gpu.createKernel( + function (image) { + const pixel = image[this.thread.y][this.thread.x]; + this.color(pixel[0], pixel[1], pixel[2], pixel[3]); + }, + { + graphical: true, + output: [image.width, image.height], + } + ); imageKernel(image); assert.equal(true, true, 'does not throw'); gpu.destroy(); @@ -29,13 +33,19 @@ function imageArgumentTest(mode, done) { imageArgumentTest('gpu', t.async()); }); -(GPU.isWebGLSupported && typeof Image !== 'undefined' ? test : skip)('image argument webgl', t => { - imageArgumentTest('webgl', t.async()); -}); +(GPU.isWebGLSupported && typeof Image !== 'undefined' ? test : skip)( + 'image argument webgl', + t => { + imageArgumentTest('webgl', t.async()); + } +); -(GPU.isWebGL2Supported && typeof Image !== 'undefined' ? test : skip)('image argument webgl2', t => { - imageArgumentTest('webgl2', t.async()); -}); +(GPU.isWebGL2Supported && typeof Image !== 'undefined' ? test : skip)( + 'image argument webgl2', + t => { + imageArgumentTest('webgl2', t.async()); + } +); (typeof Image !== 'undefined' ? test : skip)('image argument cpu', t => { imageArgumentTest('cpu', t.async()); diff --git a/test/features/infinity.js b/test/features/infinity.js index 6f9ba3e4..efd5d8be 100644 --- a/test/features/infinity.js +++ b/test/features/infinity.js @@ -1,70 +1,112 @@ const { assert, skip, test, module: describe } = require('qunit'); -const { GPU } = require('../../src'); +const { GPU } = require('../..'); describe('infinity'); + function inputWithoutFloat(checks, mode) { const gpu = new GPU({ mode }); - checks(gpu.createKernel(function() { - return Infinity; - }, { precision: 'unsigned' }) - .setOutput([1])()); + checks( + gpu + .createKernel( + function () { + return Infinity; + }, + { precision: 'unsigned' } + ) + .setOutput([1])() + ); gpu.destroy(); } -test("Infinity without float auto", () => { - inputWithoutFloat((v) => assert.deepEqual(v[0], NaN)); -}); - -test("Infinity without float cpu", () => { - inputWithoutFloat((v) => assert.deepEqual(v[0], Infinity), 'cpu'); +test('Infinity without float auto', () => { + inputWithoutFloat(v => assert.deepEqual(v[0], NaN)); }); -test("Infinity without float gpu", () => { - inputWithoutFloat((v) => assert.deepEqual(v[0], NaN), 'gpu'); +test('Infinity without float cpu', () => { + inputWithoutFloat(v => assert.deepEqual(v[0], Infinity), 'cpu'); }); -(GPU.isWebGLSupported ? test : skip)("Infinity without float webgl", () => { - inputWithoutFloat((v) => assert.deepEqual(v[0], NaN), 'webgl'); +test('Infinity without float gpu', () => { + inputWithoutFloat(v => assert.deepEqual(v[0], NaN), 'gpu'); }); -(GPU.isWebGL2Supported ? test : skip)("Infinity without float webgl2", () => { - inputWithoutFloat((v) => assert.deepEqual(v[0], NaN), 'webgl2'); +(GPU.isWebGLSupported ? test : skip)('Infinity without float webgl', () => { + inputWithoutFloat(v => assert.deepEqual(v[0], NaN), 'webgl'); }); -(GPU.isHeadlessGLSupported ? test : skip)("Infinity without float headlessgl", () => { - inputWithoutFloat((v) => assert.deepEqual(v[0], NaN), 'headlessgl'); +(GPU.isWebGL2Supported ? test : skip)('Infinity without float webgl2', () => { + inputWithoutFloat(v => assert.deepEqual(v[0], NaN), 'webgl2'); }); +(GPU.isHeadlessGLSupported ? test : skip)( + 'Infinity without float headlessgl', + () => { + inputWithoutFloat(v => assert.deepEqual(v[0], NaN), 'headlessgl'); + } +); function inputWithFloat(checks, mode) { const gpu = new GPU({ mode }); - checks(gpu.createKernel(function() { - return Infinity; - }, { precision: 'single' }) - .setOutput([1])()); + checks( + gpu + .createKernel( + function () { + return Infinity; + }, + { precision: 'single' } + ) + .setOutput([1])() + ); gpu.destroy(); } -(GPU.isSinglePrecisionSupported ? test : skip)("Infinity with float auto", () => { - inputWithFloat((v) => assert.deepEqual(v[0], 3.4028234663852886e+38)); -}); +(GPU.isSinglePrecisionSupported ? test : skip)( + 'Infinity with float auto', + () => { + inputWithFloat(v => assert.deepEqual(v[0], 3.4028234663852886e38)); + } +); -(GPU.isSinglePrecisionSupported ? test : skip)("Infinity with float cpu", () => { - inputWithFloat((v) => assert.deepEqual(v[0], Infinity), 'cpu'); -}); +(GPU.isSinglePrecisionSupported ? test : skip)( + 'Infinity with float cpu', + () => { + inputWithFloat(v => assert.deepEqual(v[0], Infinity), 'cpu'); + } +); -(GPU.isSinglePrecisionSupported ? test : skip)("Infinity with float gpu", () => { - inputWithFloat((v) => assert.deepEqual(v[0], 3.4028234663852886e+38), 'gpu'); -}); +(GPU.isSinglePrecisionSupported ? test : skip)( + 'Infinity with float gpu', + () => { + inputWithFloat(v => assert.deepEqual(v[0], 3.4028234663852886e38), 'gpu'); + } +); -(GPU.isSinglePrecisionSupported && GPU.isWebGLSupported ? test : skip)("Infinity with float webgl", () => { - inputWithFloat((v) => assert.deepEqual(v[0], 3.4028234663852886e+38), 'webgl'); -}); +(GPU.isSinglePrecisionSupported && GPU.isWebGLSupported ? test : skip)( + 'Infinity with float webgl', + () => { + inputWithFloat( + v => assert.deepEqual(v[0], 3.4028234663852886e38), + 'webgl' + ); + } +); -(GPU.isSinglePrecisionSupported && GPU.isWebGL2Supported ? test : skip)("Infinity with float webgl2", () => { - inputWithFloat((v) => assert.deepEqual(v[0], 3.4028234663852886e+38), 'webgl2'); -}); +(GPU.isSinglePrecisionSupported && GPU.isWebGL2Supported ? test : skip)( + 'Infinity with float webgl2', + () => { + inputWithFloat( + v => assert.deepEqual(v[0], 3.4028234663852886e38), + 'webgl2' + ); + } +); -(GPU.isSinglePrecisionSupported && GPU.isHeadlessGLSupported ? test : skip)("Infinity with float headlessgl", () => { - inputWithFloat((v) => assert.deepEqual(v[0], 3.4028234663852886e+38), 'headlessgl'); -}); +(GPU.isSinglePrecisionSupported && GPU.isHeadlessGLSupported ? test : skip)( + 'Infinity with float headlessgl', + () => { + inputWithFloat( + v => assert.deepEqual(v[0], 3.4028234663852886e38), + 'headlessgl' + ); + } +); diff --git a/test/features/inject-native.js b/test/features/inject-native.js index ed16d9df..0876260b 100644 --- a/test/features/inject-native.js +++ b/test/features/inject-native.js @@ -1,25 +1,33 @@ const { assert, skip, test, module: describe, only } = require('qunit'); -const { GPU } = require('../../src'); +const { GPU } = require('../..'); describe('features: inject native'); function gpuAddAB(mode) { - const gpu = new GPU({mode}); + const gpu = new GPU({ mode }); gpu - .injectNative(` + .injectNative( + ` int customAdder(int a, int b) { return a + b; } -`) - .addNativeFunction('customAdderLink', `int customAdderLink(int a, int b) { +` + ) + .addNativeFunction( + 'customAdderLink', + `int customAdderLink(int a, int b) { return customAdder(a, b); -}`); - const kernel = gpu.createKernel(function (a, b) { - return customAdderLink(a[this.thread.x], b[this.thread.x]); - }, { - output: [6], - returnType: 'Integer' - }); +}` + ); + const kernel = gpu.createKernel( + function (a, b) { + return customAdderLink(a[this.thread.x], b[this.thread.x]); + }, + { + output: [6], + returnType: 'Integer', + } + ); const a = [1, 2, 3, 5, 6, 7]; const b = [4, 5, 6, 1, 2, 3]; @@ -56,15 +64,17 @@ function cpuAddAB(mode) { function customAdder(a, b) { return a + b; } - const gpu = new GPU({mode}); - gpu - .injectNative(customAdder.toString()); - const kernel = gpu.createKernel(function (a, b) { - return customAdder(a[this.thread.x], b[this.thread.x]); - }, { - output: [6], - returnType: 'Integer' - }); + const gpu = new GPU({ mode }); + gpu.injectNative(customAdder.toString()); + const kernel = gpu.createKernel( + function (a, b) { + return customAdder(a[this.thread.x], b[this.thread.x]); + }, + { + output: [6], + returnType: 'Integer', + } + ); const a = [1, 2, 3, 5, 6, 7]; const b = [4, 5, 6, 1, 2, 3]; diff --git a/test/features/input.js b/test/features/input.js index 150557b6..06f9ac1b 100644 --- a/test/features/input.js +++ b/test/features/input.js @@ -1,251 +1,330 @@ const { assert, skip, test, module: describe, only } = require('qunit'); -const { GPU, input } = require('../../src'); +const { GPU, input } = require('../..'); describe('input'); function inputX(mode) { const gpu = new GPU({ mode }); - const kernel = gpu.createKernel(function(a) { - return a[this.thread.x]; - }) + const kernel = gpu + .createKernel(function (a) { + return a[this.thread.x]; + }) .setOutput([9]); const a = new Float32Array(9); - a.set([1,2,3,4,5,6,7,8,9]); + a.set([1, 2, 3, 4, 5, 6, 7, 8, 9]); const result = kernel(input(a, [3, 3])); - assert.deepEqual(Array.from(result), [1,2,3,4,5,6,7,8,9]); + assert.deepEqual(Array.from(result), [1, 2, 3, 4, 5, 6, 7, 8, 9]); gpu.destroy(); } -test("inputX auto", () => { +test('inputX auto', () => { inputX(); }); -test("inputX gpu", () => { +test('inputX gpu', () => { inputX('gpu'); }); -(GPU.isWebGLSupported ? test : skip)("inputX webgl", () => { +(GPU.isWebGLSupported ? test : skip)('inputX webgl', () => { inputX('webgl'); }); -(GPU.isWebGL2Supported ? test : skip)("inputX webgl2", () => { +(GPU.isWebGL2Supported ? test : skip)('inputX webgl2', () => { inputX('webgl2'); }); -test("inputX cpu", () => { +test('inputX cpu', () => { inputX('cpu'); }); - function inputXY(mode) { const gpu = new GPU({ mode }); - const kernel = gpu.createKernel(function(a) { - return a[this.thread.y][this.thread.x]; - }) + const kernel = gpu + .createKernel(function (a) { + return a[this.thread.y][this.thread.x]; + }) .setOutput([9]); const a = new Float32Array(9); - a.set([1,2,3,4,5,6,7,8,9]); + a.set([1, 2, 3, 4, 5, 6, 7, 8, 9]); const b = new Float32Array(9); - b.set([1,2,3,4,5,6,7,8,9]); + b.set([1, 2, 3, 4, 5, 6, 7, 8, 9]); const result = kernel(input(a, [3, 3])); - assert.deepEqual(Array.from(result), [1,2,3,4,5,6,7,8,9]); + assert.deepEqual(Array.from(result), [1, 2, 3, 4, 5, 6, 7, 8, 9]); gpu.destroy(); } -test("inputXY auto", () => { +test('inputXY auto', () => { inputXY(); }); -test("inputXY gpu", () => { +test('inputXY gpu', () => { inputXY('gpu'); }); -(GPU.isWebGLSupported ? test : skip)("inputXY webgl", () => { +(GPU.isWebGLSupported ? test : skip)('inputXY webgl', () => { inputXY('webgl'); }); -(GPU.isWebGL2Supported ? test : skip)("inputXY webgl2", () => { +(GPU.isWebGL2Supported ? test : skip)('inputXY webgl2', () => { inputXY('webgl2'); }); -(GPU.isHeadlessGLSupported ? test : skip)("inputXY headlessgl", () => { +(GPU.isHeadlessGLSupported ? test : skip)('inputXY headlessgl', () => { inputXY('headlessgl'); }); -test("inputXY cpu", () => { +test('inputXY cpu', () => { inputXY('cpu'); }); function inputYX(mode) { const gpu = new GPU({ mode }); - const kernel = gpu.createKernel(function(a) { - return a[this.thread.y][this.thread.x]; - }) + const kernel = gpu + .createKernel(function (a) { + return a[this.thread.y][this.thread.x]; + }) .setOutput([3, 3]); const a = new Float32Array(9); - a.set([1,2,3,4,5,6,7,8,9]); + a.set([1, 2, 3, 4, 5, 6, 7, 8, 9]); const result = kernel(input(a, [3, 3])); - assert.deepEqual(result.map(function(v) { return Array.from(v); }), [[1,2,3],[4,5,6],[7,8,9]]); + assert.deepEqual( + result.map(function (v) { + return Array.from(v); + }), + [ + [1, 2, 3], + [4, 5, 6], + [7, 8, 9], + ] + ); gpu.destroy(); } -test("inputYX auto", () => { +test('inputYX auto', () => { inputYX(); }); -test("inputYX gpu", () => { +test('inputYX gpu', () => { inputYX('gpu'); }); -(GPU.isWebGLSupported ? test : skip)("inputYX webgl", () => { +(GPU.isWebGLSupported ? test : skip)('inputYX webgl', () => { inputYX('webgl'); }); -(GPU.isWebGL2Supported ? test : skip)("inputYX webgl2", () => { +(GPU.isWebGL2Supported ? test : skip)('inputYX webgl2', () => { inputYX('webgl2'); }); -(GPU.isHeadlessGLSupported ? test : skip)("inputYX headlessgl", () => { +(GPU.isHeadlessGLSupported ? test : skip)('inputYX headlessgl', () => { inputYX('headlessgl'); }); -test("inputYX cpu", () => { +test('inputYX cpu', () => { inputYX('cpu'); }); function inputYXOffset(mode) { const gpu = new GPU({ mode }); - const kernel = gpu.createKernel(function(a) { - return a[this.thread.x][this.thread.y]; - }) + const kernel = gpu + .createKernel(function (a) { + return a[this.thread.x][this.thread.y]; + }) .setOutput([8, 2]); const a = new Float32Array(16); - a.set([1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16]); + a.set([1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16]); const result = kernel(input(a, [2, 8])); - assert.deepEqual(result.map(function(v) { return Array.from(v); }), [[1,3,5,7,9,11,13,15],[2,4,6,8,10,12,14,16]]); + assert.deepEqual( + result.map(function (v) { + return Array.from(v); + }), + [ + [1, 3, 5, 7, 9, 11, 13, 15], + [2, 4, 6, 8, 10, 12, 14, 16], + ] + ); gpu.destroy(); } -test("inputYXOffset auto", () => { +test('inputYXOffset auto', () => { inputYXOffset(); }); -test("inputYXOffset gpu", () => { +test('inputYXOffset gpu', () => { inputYXOffset('gpu'); }); -(GPU.isWebGLSupported ? test : skip)("inputYXOffset webgl", () => { +(GPU.isWebGLSupported ? test : skip)('inputYXOffset webgl', () => { inputYXOffset('webgl'); }); -(GPU.isWebGL2Supported ? test : skip)("inputYXOffset webgl2", () => { +(GPU.isWebGL2Supported ? test : skip)('inputYXOffset webgl2', () => { inputYXOffset('webgl2'); }); -(GPU.isHeadlessGLSupported ? test : skip)("inputYXOffset headlessgl", () => { +(GPU.isHeadlessGLSupported ? test : skip)('inputYXOffset headlessgl', () => { inputYXOffset('headlessgl'); }); -test("inputYXOffset cpu", () => { +test('inputYXOffset cpu', () => { inputYXOffset('cpu'); }); function inputYXOffsetPlus1(mode) { const gpu = new GPU({ mode }); - const kernel = gpu.createKernel(function(a) { - return a[this.thread.x][this.thread.y]; - }) + const kernel = gpu + .createKernel(function (a) { + return a[this.thread.x][this.thread.y]; + }) .setOutput([2, 8]); - const a = new Float32Array([1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16]); + const a = new Float32Array([ + 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, + ]); const result = kernel(input(a, [8, 2])); - assert.deepEqual(result.map(function(v) { return Array.from(v); }), [[1,9],[2,10],[3,11],[4,12],[5,13],[6,14],[7,15],[8,16]]); + assert.deepEqual( + result.map(function (v) { + return Array.from(v); + }), + [ + [1, 9], + [2, 10], + [3, 11], + [4, 12], + [5, 13], + [6, 14], + [7, 15], + [8, 16], + ] + ); gpu.destroy(); } -test("inputYXOffsetPlus1 auto", () => { +test('inputYXOffsetPlus1 auto', () => { inputYXOffsetPlus1(); }); -test("inputYXOffsetPlus1 gpu", () => { +test('inputYXOffsetPlus1 gpu', () => { inputYXOffsetPlus1('gpu'); }); -(GPU.isWebGLSupported ? test : skip)("inputYXOffsetPlus1 webgl", () => { +(GPU.isWebGLSupported ? test : skip)('inputYXOffsetPlus1 webgl', () => { inputYXOffsetPlus1('webgl'); }); -(GPU.isWebGL2Supported ? test : skip)("inputYXOffsetPlus1 webgl2", () => { +(GPU.isWebGL2Supported ? test : skip)('inputYXOffsetPlus1 webgl2', () => { inputYXOffsetPlus1('webgl2'); }); -(GPU.isHeadlessGLSupported ? test : skip)("inputYXOffsetPlus1 headlessgl", () => { - inputYXOffsetPlus1('headlessgl'); -}); +(GPU.isHeadlessGLSupported ? test : skip)( + 'inputYXOffsetPlus1 headlessgl', + () => { + inputYXOffsetPlus1('headlessgl'); + } +); -test("inputYXOffsetPlus1 cpu", () => { +test('inputYXOffsetPlus1 cpu', () => { inputYXOffsetPlus1('cpu'); }); function inputZYX(mode) { const gpu = new GPU({ mode }); - const kernel = gpu.createKernel(function(a) { - return a[this.thread.z][this.thread.y][this.thread.x]; - }) + const kernel = gpu + .createKernel(function (a) { + return a[this.thread.z][this.thread.y][this.thread.x]; + }) .setOutput([2, 4, 4]); const a = new Float32Array(32); - a.set([1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32]); + a.set([ + 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, + 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, + ]); const result = kernel(input(a, [2, 4, 4])); - assert.deepEqual(result.map(function(v) { return v.map(function(v) { return Array.from(v); }); }), [[[1,2],[3,4],[5,6],[7,8]],[[9,10],[11,12],[13,14],[15,16]],[[17,18],[19,20],[21,22],[23,24]],[[25,26],[27,28],[29,30],[31,32]]]); + assert.deepEqual( + result.map(function (v) { + return v.map(function (v) { + return Array.from(v); + }); + }), + [ + [ + [1, 2], + [3, 4], + [5, 6], + [7, 8], + ], + [ + [9, 10], + [11, 12], + [13, 14], + [15, 16], + ], + [ + [17, 18], + [19, 20], + [21, 22], + [23, 24], + ], + [ + [25, 26], + [27, 28], + [29, 30], + [31, 32], + ], + ] + ); gpu.destroy(); } -test("inputZYX auto", () => { +test('inputZYX auto', () => { inputZYX(); }); -test("inputZYX gpu", () => { +test('inputZYX gpu', () => { inputZYX('gpu'); }); -(GPU.isWebGLSupported ? test : skip)("inputZYX webgl", () => { +(GPU.isWebGLSupported ? test : skip)('inputZYX webgl', () => { inputZYX('webgl'); }); -(GPU.isWebGL2Supported ? test : skip)("inputZYX webgl2", () => { +(GPU.isWebGL2Supported ? test : skip)('inputZYX webgl2', () => { inputZYX('webgl2'); }); -(GPU.isHeadlessGLSupported ? test : skip)("inputZYX headlessgl", () => { +(GPU.isHeadlessGLSupported ? test : skip)('inputZYX headlessgl', () => { inputZYX('headlessgl'); }); -test("inputZYX cpu", () => { +test('inputZYX cpu', () => { inputZYX('cpu'); }); - function inputZYXVariables(mode) { const gpu = new GPU({ mode }); - const kernel = gpu.createKernel(function(a, x, y, z) { - return a[z][y][x]; - }) + const kernel = gpu + .createKernel(function (a, x, y, z) { + return a[z][y][x]; + }) .setOutput([1]); const a = new Float32Array(32); - a.set([1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32]); + a.set([ + 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, + 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, + ]); const aInput = input(a, [2, 4, 4]); assert.deepEqual(Array.from(kernel(aInput, 1, 2, 3)), [30]); assert.deepEqual(Array.from(kernel(aInput, 0, 2, 3)), [29]); @@ -255,82 +334,86 @@ function inputZYXVariables(mode) { gpu.destroy(); } -test("inputZYXVariables auto", () => { +test('inputZYXVariables auto', () => { inputZYXVariables(); }); -test("inputZYXVariables gpu", () => { +test('inputZYXVariables gpu', () => { inputZYXVariables('gpu'); }); -(GPU.isWebGLSupported ? test : skip)("inputZYXVariables webgl", () => { +(GPU.isWebGLSupported ? test : skip)('inputZYXVariables webgl', () => { inputZYXVariables('webgl'); }); -(GPU.isWebGL2Supported ? test : skip)("inputZYXVariables webgl2", () => { +(GPU.isWebGL2Supported ? test : skip)('inputZYXVariables webgl2', () => { inputZYXVariables('webgl2'); }); -(GPU.isHeadlessGLSupported ? test : skip)("inputZYXVariables headlessgl", () => { - inputZYXVariables('headlessgl'); -}); +(GPU.isHeadlessGLSupported ? test : skip)( + 'inputZYXVariables headlessgl', + () => { + inputZYXVariables('headlessgl'); + } +); -test("inputZYXVariables cpu", () => { +test('inputZYXVariables cpu', () => { inputZYXVariables('cpu'); }); function inputInt32ArrayX(mode) { const gpu = new GPU({ mode }); - const kernel = gpu.createKernel(function(a) { - return a[this.thread.x]; - }) + const kernel = gpu + .createKernel(function (a) { + return a[this.thread.x]; + }) .setPrecision('unsigned') .setOutput([9]); - const a = new Int32Array([1,2,3,4,5,6,7,8,9]); + const a = new Int32Array([1, 2, 3, 4, 5, 6, 7, 8, 9]); const result = kernel(input(a, [3, 3])); - assert.deepEqual(result, new Float32Array([1,2,3,4,5,6,7,8,9])); + assert.deepEqual(result, new Float32Array([1, 2, 3, 4, 5, 6, 7, 8, 9])); gpu.destroy(); } -test("inputInt32ArrayX auto", () => { +test('inputInt32ArrayX auto', () => { inputInt32ArrayX(); }); -test("inputInt32ArrayX gpu", () => { +test('inputInt32ArrayX gpu', () => { inputInt32ArrayX('gpu'); }); -(GPU.isWebGLSupported ? test : skip)("inputInt32ArrayX webgl", () => { +(GPU.isWebGLSupported ? test : skip)('inputInt32ArrayX webgl', () => { inputInt32ArrayX('webgl'); }); -(GPU.isWebGL2Supported ? test : skip)("inputInt32ArrayX webgl2", () => { +(GPU.isWebGL2Supported ? test : skip)('inputInt32ArrayX webgl2', () => { inputInt32ArrayX('webgl2'); }); -test("inputInt32ArrayX cpu", () => { +test('inputInt32ArrayX cpu', () => { inputInt32ArrayX('cpu'); }); test('.toArray() with array', () => { - assert.deepEqual(input([1,2,3,4], [4]).toArray(), [1,2,3,4]); + assert.deepEqual(input([1, 2, 3, 4], [4]).toArray(), [1, 2, 3, 4]); }); test('.toArray() with matrix', () => { - assert.deepEqual(input([1,2,3,4,5,6,7,8], [4,2]).toArray(), [new Float32Array([1,2,3,4]), new Float32Array([5,6,7,8])]); + assert.deepEqual(input([1, 2, 3, 4, 5, 6, 7, 8], [4, 2]).toArray(), [ + new Float32Array([1, 2, 3, 4]), + new Float32Array([5, 6, 7, 8]), + ]); }); test('.toArray() with grid', () => { assert.deepEqual( - input([1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16], [4,2,2]).toArray(), + input( + [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16], + [4, 2, 2] + ).toArray(), [ - [ - new Float32Array([1,2,3,4]), - new Float32Array([5,6,7,8]), - ], - [ - new Float32Array([9,10,11,12]), - new Float32Array([13,14,15,16]) - ] + [new Float32Array([1, 2, 3, 4]), new Float32Array([5, 6, 7, 8])], + [new Float32Array([9, 10, 11, 12]), new Float32Array([13, 14, 15, 16])], ] ); }); diff --git a/test/features/internally-defined-matrices.js b/test/features/internally-defined-matrices.js index 0e338831..94ae4627 100644 --- a/test/features/internally-defined-matrices.js +++ b/test/features/internally-defined-matrices.js @@ -1,21 +1,25 @@ const { assert, skip, test, module: describe, only } = require('qunit'); -const { GPU } = require('../../src'); +const { GPU } = require('../..'); describe('features: internally defined matrices'); function testMatrix2(mode) { const gpu = new GPU({ mode }); + function getMatrix() { const matrix = [ - [1,2], - [3,4] + [1, 2], + [3, 4], ]; return matrix; } gpu.addFunction(getMatrix); - const kernel = gpu.createKernel(function(y, x) { - return getMatrix()[y][x]; - }, { output: [1] }); + const kernel = gpu.createKernel( + function (y, x) { + return getMatrix()[y][x]; + }, + { output: [1] } + ); assert.equal(kernel(0, 0)[0], 1); assert.equal(kernel(0, 1)[0], 2); @@ -51,18 +55,22 @@ test('matrix2 cpu', () => { function testMatrix3(mode) { const gpu = new GPU({ mode }); + function getMatrix() { const matrix = [ - [1,2,3], - [4,5,6], - [7,8,9], + [1, 2, 3], + [4, 5, 6], + [7, 8, 9], ]; return matrix; } gpu.addFunction(getMatrix); - const kernel = gpu.createKernel(function(y, x) { - return getMatrix()[y][x]; - }, { output: [1] }); + const kernel = gpu.createKernel( + function (y, x) { + return getMatrix()[y][x]; + }, + { output: [1] } + ); assert.equal(kernel(0, 0)[0], 1); assert.equal(kernel(0, 1)[0], 2); @@ -103,19 +111,23 @@ test('matrix3 cpu', () => { function testMatrix4(mode) { const gpu = new GPU({ mode }); + function getMatrix() { const matrix = [ - [1,2,3,4], - [5,6,7,8], - [9,10,11,12], - [13,14,15,16], + [1, 2, 3, 4], + [5, 6, 7, 8], + [9, 10, 11, 12], + [13, 14, 15, 16], ]; return matrix; } gpu.addFunction(getMatrix); - const kernel = gpu.createKernel(function(y, x) { - return getMatrix()[y][x]; - }, { output: [1] }); + const kernel = gpu.createKernel( + function (y, x) { + return getMatrix()[y][x]; + }, + { output: [1] } + ); assert.equal(kernel(0, 0)[0], 1); assert.equal(kernel(0, 1)[0], 2); diff --git a/test/features/json.js b/test/features/json.js index 48bb5d7f..159e2f54 100644 --- a/test/features/json.js +++ b/test/features/json.js @@ -1,14 +1,17 @@ const { assert, skip, test, module: describe, only } = require('qunit'); -const { GPU } = require('../../src'); +const { GPU } = require('../..'); describe('json serialize'); function testJSONSerialize(mode) { - const gpu = new GPU({mode}); - - const kernel = gpu.createKernel(function (value) { - return value; - }, {output: [1]}); + const gpu = new GPU({ mode }); + + const kernel = gpu.createKernel( + function (value) { + return value; + }, + { output: [1] } + ); kernel(1); diff --git a/test/features/legacy-encoder.js b/test/features/legacy-encoder.js index 8c361264..a56ec533 100644 --- a/test/features/legacy-encoder.js +++ b/test/features/legacy-encoder.js @@ -1,13 +1,16 @@ const { assert, skip, test, module: describe, only } = require('qunit'); -const { GPU, HeadlessGLKernel, WebGLKernel, WebGL2Kernel } = require('../../src'); +const { GPU, HeadlessGLKernel, WebGLKernel, WebGL2Kernel } = require('../..'); describe('features: legacy encoder'); function testLegacyEncoderOff(mode) { const gpu = new GPU({ mode }); - const kernel = gpu.createKernel(function() { - return 1; - }, { output: [1], precision: 'unsigned' }); + const kernel = gpu.createKernel( + function () { + return 1; + }, + { output: [1], precision: 'unsigned' } + ); assert.equal(kernel()[0], 1); gpu.destroy(); } @@ -34,13 +37,16 @@ test('off cpu', () => { function testLegacyEncoderOn(mode) { const gpu = new GPU({ mode }); - const kernel = gpu.createKernel(function() { - return 1; - }, { - output: [1], - precision: 'unsigned', - useLegacyEncoder: true, - }); + const kernel = gpu.createKernel( + function () { + return 1; + }, + { + output: [1], + precision: 'unsigned', + useLegacyEncoder: true, + } + ); assert.equal(kernel()[0], 1); gpu.destroy(); } @@ -67,15 +73,18 @@ test('on cpu', () => { function testSubKernelsLegacyEncoderOff(mode) { const gpu = new GPU({ mode }); + function addOne(value) { return value + 1; } - const kernel = gpu.createKernelMap([ - addOne, - ], function() { - const result = addOne(1); - return result + 1; - }, { output: [1], precision: 'unsigned' }); + const kernel = gpu.createKernelMap( + [addOne], + function () { + const result = addOne(1); + return result + 1; + }, + { output: [1], precision: 'unsigned' } + ); assert.equal(kernel()[0][0], 2); assert.equal(kernel().result[0], 3); gpu.destroy(); @@ -85,17 +94,26 @@ function testSubKernelsLegacyEncoderOff(mode) { testSubKernelsLegacyEncoderOff(); }); -(GPU.isWebGLSupported && GPU.isKernelMapSupported ? test : skip)('subKernels off webgl', () => { - testSubKernelsLegacyEncoderOff('webgl'); -}); +(GPU.isWebGLSupported && GPU.isKernelMapSupported ? test : skip)( + 'subKernels off webgl', + () => { + testSubKernelsLegacyEncoderOff('webgl'); + } +); -(GPU.isWebGL2Supported && GPU.isKernelMapSupported ? test : skip)('subKernels off webgl2', () => { - testSubKernelsLegacyEncoderOff('webgl2'); -}); +(GPU.isWebGL2Supported && GPU.isKernelMapSupported ? test : skip)( + 'subKernels off webgl2', + () => { + testSubKernelsLegacyEncoderOff('webgl2'); + } +); -(GPU.isHeadlessGLSupported && GPU.isKernelMapSupported ? test : skip)('subKernels off headlessgl', () => { - testSubKernelsLegacyEncoderOff('headlessgl'); -}); +(GPU.isHeadlessGLSupported && GPU.isKernelMapSupported ? test : skip)( + 'subKernels off headlessgl', + () => { + testSubKernelsLegacyEncoderOff('headlessgl'); + } +); test('subKernels off cpu', () => { testSubKernelsLegacyEncoderOff('cpu'); @@ -103,19 +121,22 @@ test('subKernels off cpu', () => { function testSubKernelsLegacyEncoderOn(mode) { const gpu = new GPU({ mode }); + function addOne(value) { return value + 1; } - const kernel = gpu.createKernelMap([ - addOne, - ], function() { - const value = addOne(1); - return value + 1; - }, { - output: [1], - precision: 'unsigned', - useLegacyEncoder: true, - }); + const kernel = gpu.createKernelMap( + [addOne], + function () { + const value = addOne(1); + return value + 1; + }, + { + output: [1], + precision: 'unsigned', + useLegacyEncoder: true, + } + ); assert.equal(kernel()[0][0], 2); assert.equal(kernel().result[0], 3); gpu.destroy(); @@ -125,144 +146,209 @@ function testSubKernelsLegacyEncoderOn(mode) { testSubKernelsLegacyEncoderOn(); }); -(GPU.isWebGLSupported && GPU.isKernelMapSupported ? test : skip)('subKernels on webgl', () => { - testSubKernelsLegacyEncoderOn('webgl'); -}); +(GPU.isWebGLSupported && GPU.isKernelMapSupported ? test : skip)( + 'subKernels on webgl', + () => { + testSubKernelsLegacyEncoderOn('webgl'); + } +); -(GPU.isWebGL2Supported && GPU.isKernelMapSupported ? test : skip)('subKernels on webgl2', () => { - testSubKernelsLegacyEncoderOn('webgl2'); -}); +(GPU.isWebGL2Supported && GPU.isKernelMapSupported ? test : skip)( + 'subKernels on webgl2', + () => { + testSubKernelsLegacyEncoderOn('webgl2'); + } +); -(GPU.isHeadlessGLSupported && GPU.isKernelMapSupported ? test : skip)('subKernels on headlessgl', () => { - testSubKernelsLegacyEncoderOn('headlessgl'); -}); +(GPU.isHeadlessGLSupported && GPU.isKernelMapSupported ? test : skip)( + 'subKernels on headlessgl', + () => { + testSubKernelsLegacyEncoderOn('headlessgl'); + } +); test('subKernels on cpu', () => { testSubKernelsLegacyEncoderOn('cpu'); }); test('HeadlessGLKernel.getMainResultKernelPackedPixels useLegacyEncoder = false', () => { - const result = HeadlessGLKernel.prototype.getMainResultKernelPackedPixels.apply({ - useLegacyEncoder: false - }); - assert.equal(result, ` threadId = indexTo3D(index, uOutputDim); + const result = + HeadlessGLKernel.prototype.getMainResultKernelPackedPixels.apply({ + useLegacyEncoder: false, + }); + assert.equal( + result, + ` threadId = indexTo3D(index, uOutputDim); kernel(); gl_FragData[0] = encode32(kernelResult); -`); +` + ); }); test('WebGLKernel.getMainResultKernelPackedPixels useLegacyEncoder = false', () => { const result = WebGLKernel.prototype.getMainResultKernelPackedPixels.apply({ - useLegacyEncoder: false + useLegacyEncoder: false, }); - assert.equal(result, ` threadId = indexTo3D(index, uOutputDim); + assert.equal( + result, + ` threadId = indexTo3D(index, uOutputDim); kernel(); gl_FragData[0] = encode32(kernelResult); -`); +` + ); }); test('WebGL2Kernel.getMainResultKernelPackedPixels useLegacyEncoder = false', () => { const result = WebGL2Kernel.prototype.getMainResultKernelPackedPixels.apply({ - useLegacyEncoder: false + useLegacyEncoder: false, }); - assert.equal(result, ` threadId = indexTo3D(index, uOutputDim); + assert.equal( + result, + ` threadId = indexTo3D(index, uOutputDim); kernel(); data0 = encode32(kernelResult); -`); +` + ); }); test('HeadlessGLKernel.getMainResultKernelPackedPixels useLegacyEncoder = true', () => { - const result = HeadlessGLKernel.prototype.getMainResultKernelPackedPixels.apply({ - useLegacyEncoder: true - }); - assert.equal(result, ` threadId = indexTo3D(index, uOutputDim); + const result = + HeadlessGLKernel.prototype.getMainResultKernelPackedPixels.apply({ + useLegacyEncoder: true, + }); + assert.equal( + result, + ` threadId = indexTo3D(index, uOutputDim); kernel(); gl_FragData[0] = legacyEncode32(kernelResult); -`); +` + ); }); test('WebGLKernel.getMainResultKernelPackedPixels useLegacyEncoder = true', () => { const result = WebGLKernel.prototype.getMainResultKernelPackedPixels.apply({ - useLegacyEncoder: true + useLegacyEncoder: true, }); - assert.equal(result, ` threadId = indexTo3D(index, uOutputDim); + assert.equal( + result, + ` threadId = indexTo3D(index, uOutputDim); kernel(); gl_FragData[0] = legacyEncode32(kernelResult); -`); +` + ); }); test('WebGL2Kernel.getMainResultKernelPackedPixels useLegacyEncoder = true', () => { const result = WebGL2Kernel.prototype.getMainResultKernelPackedPixels.apply({ - useLegacyEncoder: true + useLegacyEncoder: true, }); - assert.equal(result, ` threadId = indexTo3D(index, uOutputDim); + assert.equal( + result, + ` threadId = indexTo3D(index, uOutputDim); kernel(); data0 = legacyEncode32(kernelResult); -`); +` + ); }); test('HeadlessGLKernel.getMainResultSubKernelPackedPixels useLegacyEncoder = false', () => { - const result = HeadlessGLKernel.prototype.getMainResultSubKernelPackedPixels.apply({ - useLegacyEncoder: false, - subKernels: [{ - name: 'subKernel1' - }] - }); - assert.equal(result, ` gl_FragData[1] = encode32(subKernelResult_subKernel1); -`); + const result = + HeadlessGLKernel.prototype.getMainResultSubKernelPackedPixels.apply({ + useLegacyEncoder: false, + subKernels: [ + { + name: 'subKernel1', + }, + ], + }); + assert.equal( + result, + ` gl_FragData[1] = encode32(subKernelResult_subKernel1); +` + ); }); test('WebGLKernel.getMainResultSubKernelPackedPixels useLegacyEncoder = false', () => { - const result = WebGLKernel.prototype.getMainResultSubKernelPackedPixels.apply({ - useLegacyEncoder: false, - subKernels: [{ - name: 'subKernel1' - }] - }); - assert.equal(result, ` gl_FragData[1] = encode32(subKernelResult_subKernel1); -`); + const result = + WebGLKernel.prototype.getMainResultSubKernelPackedPixels.apply({ + useLegacyEncoder: false, + subKernels: [ + { + name: 'subKernel1', + }, + ], + }); + assert.equal( + result, + ` gl_FragData[1] = encode32(subKernelResult_subKernel1); +` + ); }); test('WebGL2Kernel.getMainResultSubKernelPackedPixels useLegacyEncoder = false', () => { - const result = WebGL2Kernel.prototype.getMainResultSubKernelPackedPixels.apply({ - useLegacyEncoder: false, - subKernels: [{ - name: 'subKernel1' - }] - }); - assert.equal(result, ` data1 = encode32(subKernelResult_subKernel1); -`); + const result = + WebGL2Kernel.prototype.getMainResultSubKernelPackedPixels.apply({ + useLegacyEncoder: false, + subKernels: [ + { + name: 'subKernel1', + }, + ], + }); + assert.equal( + result, + ` data1 = encode32(subKernelResult_subKernel1); +` + ); }); test('HeadlessGLKernel.getMainResultSubKernelPackedPixels useLegacyEncoder = true', () => { - const result = HeadlessGLKernel.prototype.getMainResultSubKernelPackedPixels.apply({ - useLegacyEncoder: true, - subKernels: [{ - name: 'subKernel1' - }] - }); - assert.equal(result, ` gl_FragData[1] = legacyEncode32(subKernelResult_subKernel1); -`); + const result = + HeadlessGLKernel.prototype.getMainResultSubKernelPackedPixels.apply({ + useLegacyEncoder: true, + subKernels: [ + { + name: 'subKernel1', + }, + ], + }); + assert.equal( + result, + ` gl_FragData[1] = legacyEncode32(subKernelResult_subKernel1); +` + ); }); test('WebGLKernel.getMainResultSubKernelPackedPixels useLegacyEncoder = true', () => { - const result = WebGLKernel.prototype.getMainResultSubKernelPackedPixels.apply({ - useLegacyEncoder: true, - subKernels: [{ - name: 'subKernel1' - }] - }); - assert.equal(result, ` gl_FragData[1] = legacyEncode32(subKernelResult_subKernel1); -`); + const result = + WebGLKernel.prototype.getMainResultSubKernelPackedPixels.apply({ + useLegacyEncoder: true, + subKernels: [ + { + name: 'subKernel1', + }, + ], + }); + assert.equal( + result, + ` gl_FragData[1] = legacyEncode32(subKernelResult_subKernel1); +` + ); }); test('WebGL2Kernel.getMainResultSubKernelPackedPixels useLegacyEncoder = true', () => { - const result = WebGL2Kernel.prototype.getMainResultSubKernelPackedPixels.apply({ - useLegacyEncoder: true, - subKernels: [{ - name: 'subKernel1' - }] - }); - assert.equal(result, ` data1 = legacyEncode32(subKernelResult_subKernel1); -`); + const result = + WebGL2Kernel.prototype.getMainResultSubKernelPackedPixels.apply({ + useLegacyEncoder: true, + subKernels: [ + { + name: 'subKernel1', + }, + ], + }); + assert.equal( + result, + ` data1 = legacyEncode32(subKernelResult_subKernel1); +` + ); }); diff --git a/test/features/loops.js b/test/features/loops.js index 597471a2..4b4f0060 100644 --- a/test/features/loops.js +++ b/test/features/loops.js @@ -1,26 +1,30 @@ const { assert, skip, test, module: describe, only } = require('qunit'); -const { GPU } = require('../../src'); +const { GPU } = require('../..'); describe('loops - for'); + function forLoopTest(mode) { const gpu = new GPU({ mode }); - const f = gpu.createKernel(function(a, b) { - let x = 0; - for (let i = 0; i < 10; i++) { - x = x + 1; + const f = gpu.createKernel( + function (a, b) { + let x = 0; + for (let i = 0; i < 10; i++) { + x = x + 1; + } + + return a[this.thread.x] + b[this.thread.x] + x; + }, + { + output: [6], } + ); - return (a[this.thread.x] + b[this.thread.x] + x); - }, { - output : [6] - }); - - assert.ok( f !== null, 'function generated test'); + assert.ok(f !== null, 'function generated test'); const a = [1, 2, 3, 5, 6, 7]; const b = [4, 5, 6, 1, 2, 3]; - const res = f(a,b); + const res = f(a, b); const exp = [15, 17, 19, 16, 18, 20]; assert.deepEqual(Array.from(res), exp); @@ -51,30 +55,33 @@ test('cpu', () => { forLoopTest('cpu'); }); - describe('loops - for with constant'); + function forWithConstantTest(mode) { const gpu = new GPU({ mode }); - const f = gpu.createKernel(function(a, b) { - let x = 0; - for(let i = 0; i < this.constants.max; i++) { - x = x + 1; + const f = gpu.createKernel( + function (a, b) { + let x = 0; + for (let i = 0; i < this.constants.max; i++) { + x = x + 1; + } + + return a[this.thread.x] + b[this.thread.x] + x; + }, + { + output: [6], + constants: { + max: 10, + }, } + ); - return (a[this.thread.x] + b[this.thread.x] + x); - }, { - output : [6], - constants: { - max: 10 - } - }); - - assert.ok( f !== null, 'function generated test'); + assert.ok(f !== null, 'function generated test'); const a = [1, 2, 3, 5, 6, 7]; const b = [4, 5, 6, 1, 2, 3]; - const res = f(a,b); + const res = f(a, b); const exp = [15, 17, 19, 16, 18, 20]; assert.deepEqual(Array.from(res), exp); @@ -98,34 +105,40 @@ test('forConstantLoopTest gpu', () => { forWithConstantTest('webgl2'); }); -(GPU.isHeadlessGLSupported ? test : skip)('forConstantLoopTest headlessgl', () => { - forWithConstantTest('headlessgl'); -}); +(GPU.isHeadlessGLSupported ? test : skip)( + 'forConstantLoopTest headlessgl', + () => { + forWithConstantTest('headlessgl'); + } +); test('forConstantLoopTest cpu', () => { forWithConstantTest('cpu'); }); - describe('loops - while'); + function whileLoopTest(mode) { const gpu = new GPU({ mode }); - const f = gpu.createKernel(function(a, b) { - let x = 0; - let i = 0; - while (i++ < 10) { - x = x + 1; + const f = gpu.createKernel( + function (a, b) { + let x = 0; + let i = 0; + while (i++ < 10) { + x = x + 1; + } + + return a[this.thread.x] + b[this.thread.x] + x; + }, + { + output: [6], } - - return (a[this.thread.x] + b[this.thread.x] + x); - }, { - output : [6] - }); + ); const a = [1, 2, 3, 5, 6, 7]; const b = [4, 5, 6, 1, 2, 3]; - const res = f(a,b); + const res = f(a, b); const exp = [15, 17, 19, 16, 18, 20]; assert.deepEqual(Array.from(res), exp); @@ -156,30 +169,32 @@ test('cpu', () => { whileLoopTest('cpu'); }); - - describe('loops - while with constant'); + function whileWithConstantTest(mode) { const gpu = new GPU({ mode }); - const f = gpu.createKernel(function(a, b) { - let x = 0; - let i = 0; - while (i++ < this.constants.max) { - x = x + 1; + const f = gpu.createKernel( + function (a, b) { + let x = 0; + let i = 0; + while (i++ < this.constants.max) { + x = x + 1; + } + + return a[this.thread.x] + b[this.thread.x] + x; + }, + { + output: [6], + constants: { max: 10 }, } + ); - return (a[this.thread.x] + b[this.thread.x] + x); - }, { - output : [6], - constants: { max: 10 } - }); - - assert.ok( f !== null, 'function generated test'); + assert.ok(f !== null, 'function generated test'); const a = [1, 2, 3, 5, 6, 7]; const b = [4, 5, 6, 1, 2, 3]; - const res = f(a,b); + const res = f(a, b); const exp = [15, 17, 19, 16, 18, 20]; assert.deepEqual(Array.from(res), exp); @@ -210,43 +225,46 @@ test('cpu', () => { whileWithConstantTest('cpu'); }); - describe('loops - evil while loop'); -function evilWhileLoopTest(mode ) { + +function evilWhileLoopTest(mode) { function evilWhileKernelFunction(a, b) { let x = 0; let i = 0; //10000000 or 10 million is the approx upper limit on a chrome + GTX 780 - while(i<100) { + while (i < 100) { x = x + 1.0; ++i; } - return (a[this.thread.x] + b[this.thread.x] + x); + return a[this.thread.x] + b[this.thread.x] + x; } const evil_while_a = [1, 2, 3, 5, 6, 7]; const evil_while_b = [4, 5, 6, 1, 2, 3]; const evil_while_cpuRef = new GPU({ mode: 'cpu' }); - const evil_while_cpuRef_f = evil_while_cpuRef.createKernel(evilWhileKernelFunction, { - output : [6], - loopMaxIterations: 10000, - }); + const evil_while_cpuRef_f = evil_while_cpuRef.createKernel( + evilWhileKernelFunction, + { + output: [6], + loopMaxIterations: 10000, + } + ); - const evil_while_exp = evil_while_cpuRef_f(evil_while_a,evil_while_b); + const evil_while_exp = evil_while_cpuRef_f(evil_while_a, evil_while_b); const gpu = new GPU({ mode }); const f = gpu.createKernel(evilWhileKernelFunction, { - output : [6] + output: [6], }); - assert.ok( f !== null, 'function generated test'); + assert.ok(f !== null, 'function generated test'); - const res = f(evil_while_a,evil_while_b); + const res = f(evil_while_a, evil_while_b); - for(let i = 0; i < evil_while_exp.length; ++i) { - assert.equal(evil_while_exp[i], res[i], 'Result arr idx: '+i); + for (let i = 0; i < evil_while_exp.length; ++i) { + assert.equal(evil_while_exp[i], res[i], 'Result arr idx: ' + i); } evil_while_cpuRef.destroy(); gpu.destroy(); @@ -277,26 +295,30 @@ test('cpu', () => { }); describe('loops - do while'); + function doWhileLoopTest(mode) { const gpu = new GPU({ mode }); - const f = gpu.createKernel(function(a, b) { - let x = 0; - let i = 0; - do { - x = x + 1; - i++; - } while (i < 10); - return (a[this.thread.x] + b[this.thread.x] + x); - }, { - output : [6] - }); + const f = gpu.createKernel( + function (a, b) { + let x = 0; + let i = 0; + do { + x = x + 1; + i++; + } while (i < 10); + return a[this.thread.x] + b[this.thread.x] + x; + }, + { + output: [6], + } + ); - assert.ok( f !== null, 'function generated test'); + assert.ok(f !== null, 'function generated test'); const a = [1, 2, 3, 5, 6, 7]; const b = [4, 5, 6, 1, 2, 3]; - const res = f(a,b); + const res = f(a, b); const exp = [15, 17, 19, 16, 18, 20]; assert.deepEqual(Array.from(res), exp); gpu.destroy(); @@ -327,27 +349,31 @@ test('cpu', () => { }); describe('loops - do while with constant'); + function doWhileWithConstantLoop(mode) { const gpu = new GPU({ mode }); - const f = gpu.createKernel(function(a, b) { - let x = 0; - let i = 0; - do { - x = x + 1; - i++; - } while (i < this.constants.max); - return (a[this.thread.x] + b[this.thread.x] + x); - }, { - output : [6], - constants: { max: 10 } - }); + const f = gpu.createKernel( + function (a, b) { + let x = 0; + let i = 0; + do { + x = x + 1; + i++; + } while (i < this.constants.max); + return a[this.thread.x] + b[this.thread.x] + x; + }, + { + output: [6], + constants: { max: 10 }, + } + ); - assert.ok( f !== null, 'function generated test'); + assert.ok(f !== null, 'function generated test'); const a = [1, 2, 3, 5, 6, 7]; const b = [4, 5, 6, 1, 2, 3]; - const res = f(a,b); + const res = f(a, b); const exp = [15, 17, 19, 16, 18, 20]; assert.deepEqual(Array.from(res), exp); gpu.destroy(); diff --git a/test/features/math-object.js b/test/features/math-object.js index c042dd9b..fc59e7ea 100644 --- a/test/features/math-object.js +++ b/test/features/math-object.js @@ -1,16 +1,28 @@ const { assert, skip, test, module: describe, only } = require('qunit'); -const { GPU } = require('../../src'); +const { GPU } = require('../..'); describe('features: math object'); function mathProps(mode) { - const props = ['E','LN10','LN2','LOG10E','LOG2E','PI','SQRT1_2','SQRT2']; + const props = [ + 'E', + 'LN10', + 'LN2', + 'LOG10E', + 'LOG2E', + 'PI', + 'SQRT1_2', + 'SQRT2', + ]; const gpu = new GPU({ mode }); for (let i = 0; i < props.length; i++) { const prop = props[i]; - const kernel = gpu.createKernel(`function() { + const kernel = gpu.createKernel( + `function() { return Math.${prop}; - }`, { output: [1] }); + }`, + { output: [1] } + ); assert.equal(kernel()[0].toFixed(6), Math[prop].toFixed(6)); } gpu.destroy(); @@ -32,9 +44,12 @@ test('All Math properties gpu', () => { mathProps('webgl2'); }); -(GPU.isHeadlessGLSupported ? test : skip)('All Math properties headlessgl', () => { - mathProps('headlessgl'); -}); +(GPU.isHeadlessGLSupported ? test : skip)( + 'All Math properties headlessgl', + () => { + mathProps('headlessgl'); + } +); test('All Math properties cpu', () => { mathProps('cpu'); @@ -76,11 +91,18 @@ function singleArgumentMathMethods(mode) { const gpu = new GPU({ mode }); for (let i = 0; i < methods.length; i++) { const method = methods[i]; - const kernel = gpu.createKernel(`function(value) { + const kernel = gpu.createKernel( + `function(value) { return Math.${method}(value); - }`, { output: [1] }); + }`, + { output: [1] } + ); for (let j = 0; j < 10; j++) { - assert.equal(kernel(j / 10)[0].toFixed(3), Math[method](j / 10).toFixed(3), `Math.${method}(${j / 10})`); + assert.equal( + kernel(j / 10)[0].toFixed(3), + Math[method](j / 10).toFixed(3), + `Math.${method}(${j / 10})` + ); } } gpu.destroy(); @@ -94,41 +116,51 @@ test('Single argument Math methods gpu', () => { singleArgumentMathMethods('gpu'); }); -(GPU.isWebGLSupported ? test : skip)('Single argument Math methods webgl', () => { - singleArgumentMathMethods('webgl'); -}); +(GPU.isWebGLSupported ? test : skip)( + 'Single argument Math methods webgl', + () => { + singleArgumentMathMethods('webgl'); + } +); -(GPU.isWebGL2Supported ? test : skip)('Single argument Math methods webgl2', () => { - singleArgumentMathMethods('webgl2'); -}); +(GPU.isWebGL2Supported ? test : skip)( + 'Single argument Math methods webgl2', + () => { + singleArgumentMathMethods('webgl2'); + } +); -(GPU.isHeadlessGLSupported ? test : skip)('Single argument Math methods headlessgl', () => { - singleArgumentMathMethods('headlessgl'); -}); +(GPU.isHeadlessGLSupported ? test : skip)( + 'Single argument Math methods headlessgl', + () => { + singleArgumentMathMethods('headlessgl'); + } +); test('Single argument Math methods cpu', () => { singleArgumentMathMethods('cpu'); }); function twoArgumentMathMethods(mode) { - const methods = [ - 'atan2', - 'imul', - 'max', - 'min', - 'pow', - ]; + const methods = ['atan2', 'imul', 'max', 'min', 'pow']; const gpu = new GPU({ mode }); for (let i = 0; i < methods.length; i++) { const method = methods[i]; - const kernel = gpu.createKernel(`function(value1, value2) { + const kernel = gpu.createKernel( + `function(value1, value2) { return Math.${method}(value1, value2); - }`, { output: [1] }); + }`, + { output: [1] } + ); for (let j = 0; j < 10; j++) { const value1 = j / 10; const value2 = value1; - assert.equal(kernel(value1, value2)[0].toFixed(3), Math[method](value1, value2).toFixed(3), `Math.${method}(${value1}, ${value2})`); + assert.equal( + kernel(value1, value2)[0].toFixed(3), + Math[method](value1, value2).toFixed(3), + `Math.${method}(${value1}, ${value2})` + ); } } gpu.destroy(); @@ -146,13 +178,19 @@ test('Two argument Math methods gpu', () => { twoArgumentMathMethods('webgl'); }); -(GPU.isWebGL2Supported ? test : skip)('Two argument Math methods webgl2', () => { - twoArgumentMathMethods('webgl2'); -}); +(GPU.isWebGL2Supported ? test : skip)( + 'Two argument Math methods webgl2', + () => { + twoArgumentMathMethods('webgl2'); + } +); -(GPU.isHeadlessGLSupported ? test : skip)('Two argument Math methods headlessgl', () => { - twoArgumentMathMethods('headlessgl'); -}); +(GPU.isHeadlessGLSupported ? test : skip)( + 'Two argument Math methods headlessgl', + () => { + twoArgumentMathMethods('headlessgl'); + } +); test('Two argument Math methods cpu', () => { twoArgumentMathMethods('cpu'); @@ -160,15 +198,18 @@ test('Two argument Math methods cpu', () => { function sqrtABTest(mode) { const gpu = new GPU({ mode }); - const f = gpu.createKernel(function(a, b) { - return Math.sqrt(a[this.thread.x] * b[this.thread.x]); - }, { - output : [6] - }); + const f = gpu.createKernel( + function (a, b) { + return Math.sqrt(a[this.thread.x] * b[this.thread.x]); + }, + { + output: [6], + } + ); const a = [3, 4, 5, 6, 7, 8]; const b = [3, 4, 5, 6, 7, 8]; - const res = f(a,b); + const res = f(a, b); const exp = [3, 4, 5, 6, 7, 8]; assert.deepEqual(Array.from(res), exp); @@ -199,15 +240,20 @@ test('sqrtAB cpu', () => { sqrtABTest('cpu'); }); - function mathRandom(mode) { const gpu = new GPU({ mode }); - const kernel = gpu.createKernel(function() { - return Math.random(); - }, { output: [1] }); + const kernel = gpu.createKernel( + function () { + return Math.random(); + }, + { output: [1] } + ); const result = kernel(); - assert.ok(result[0] > 0 && result[0] < 1, `value was expected to be between o and 1, but was ${result[0]}`); + assert.ok( + result[0] > 0 && result[0] < 1, + `value was expected to be between o and 1, but was ${result[0]}` + ); } test('random auto', () => { @@ -233,5 +279,3 @@ test('random gpu', () => { test('random cpu', () => { mathRandom('cpu'); }); - - diff --git a/test/features/nested-function.js b/test/features/nested-function.js index 52b830c5..5eb3f582 100644 --- a/test/features/nested-function.js +++ b/test/features/nested-function.js @@ -1,26 +1,29 @@ const { assert, skip, test, module: describe, only } = require('qunit'); -const { GPU } = require('../../src'); +const { GPU } = require('../..'); describe('nested function'); function nestedSumABTest(mode) { const gpu = new GPU({ mode }); - const f = gpu.createKernel(function(a, b) { - function custom_adder(a,b) { - return a+b; + const f = gpu.createKernel( + function (a, b) { + function custom_adder(a, b) { + return a + b; + } + + return custom_adder(a[this.thread.x], b[this.thread.x]); + }, + { + output: [6], } - - return custom_adder(a[this.thread.x], b[this.thread.x]); - }, { - output : [6] - }); + ); assert.ok(f !== null, 'function generated test'); const a = [1, 2, 3, 5, 6, 7]; const b = [4, 5, 6, 1, 2, 3]; - const res = f(a,b); + const res = f(a, b); const exp = [5, 7, 9, 6, 8, 10]; assert.deepEqual(Array.from(res), exp); @@ -61,9 +64,12 @@ function testNestedInCustomFunction(mode) { } const gpu = new GPU({ mode }); gpu.addFunction(custom1); - const kernel = gpu.createKernel(function() { - return custom1(); - }, { output: [1] }); + const kernel = gpu.createKernel( + function () { + return custom1(); + }, + { output: [1] } + ); assert.deepEqual(kernel(), new Float32Array([1])); gpu.destroy(); } @@ -84,9 +90,12 @@ test('nested in custom gpu', () => { testNestedInCustomFunction('webgl2'); }); -(GPU.isHeadlessGLSupported ? test : skip)('nested in custom headlessgl', () => { - testNestedInCustomFunction('headlessgl'); -}); +(GPU.isHeadlessGLSupported ? test : skip)( + 'nested in custom headlessgl', + () => { + testNestedInCustomFunction('headlessgl'); + } +); test('nested in custom cpu', () => { testNestedInCustomFunction('cpu'); diff --git a/test/features/offscreen-canvas.js b/test/features/offscreen-canvas.js index de85ab46..42e2bd46 100644 --- a/test/features/offscreen-canvas.js +++ b/test/features/offscreen-canvas.js @@ -3,11 +3,12 @@ if (typeof importScripts !== 'undefined') { importScripts('../../dist/gpu-browser.js'); onmessage = function (e) { const gpu = new GPU({ mode: e.data }); - const a = [1,2,3]; - const b = [3,2,1]; - const kernel = gpu.createKernel(function(a, b) { - return a[this.thread.x] - b[this.thread.x]; - }) + const a = [1, 2, 3]; + const b = [3, 2, 1]; + const kernel = gpu + .createKernel(function (a, b) { + return a[this.thread.x] - b[this.thread.x]; + }) .setOutput([3]); postMessage({ mode: gpu.mode, result: kernel(a, b) }); gpu.destroy(); @@ -28,21 +29,30 @@ if (typeof importScripts !== 'undefined') { worker.postMessage(mode); } - (GPU.isOffscreenCanvasSupported ? test : skip)('offscreen canvas auto', t => { - testOffscreenCanvas(null, t.async()); - }); + (GPU.isOffscreenCanvasSupported ? test : skip)( + 'offscreen canvas auto', + t => { + testOffscreenCanvas(null, t.async()); + } + ); (GPU.isOffscreenCanvasSupported ? test : skip)('offscreen canvas gpu', t => { testOffscreenCanvas('gpu', t.async()); }); - (GPU.isOffscreenCanvasSupported ? test : skip)('offscreen canvas webgl', t => { - testOffscreenCanvas('webgl', t.async()); - }); + (GPU.isOffscreenCanvasSupported ? test : skip)( + 'offscreen canvas webgl', + t => { + testOffscreenCanvas('webgl', t.async()); + } + ); - (GPU.isOffscreenCanvasSupported ? test : skip)('offscreen canvas webgl2', t => { - testOffscreenCanvas('webgl2', t.async()); - }); + (GPU.isOffscreenCanvasSupported ? test : skip)( + 'offscreen canvas webgl2', + t => { + testOffscreenCanvas('webgl2', t.async()); + } + ); (GPU.isOffscreenCanvasSupported ? test : skip)('offscreen canvas cpu', t => { testOffscreenCanvas('cpu', t.async()); diff --git a/test/features/optimize-float-memory.js b/test/features/optimize-float-memory.js index b929e3aa..743568f4 100644 --- a/test/features/optimize-float-memory.js +++ b/test/features/optimize-float-memory.js @@ -1,143 +1,234 @@ const { assert, skip, test, module: describe, only } = require('qunit'); -const { GPU, utils } = require('../../src'); +const { GPU, utils } = require('../..'); describe('feature: optimizeFloatMemory'); function whenEnabledCallsCorrectRenderFunction(mode) { const gpu = new GPU({ mode }); - const fn = gpu.createKernel(function() { return 1 }, { - output: [1], - precision: 'single', - optimizeFloatMemory: true, - }); + const fn = gpu.createKernel( + function () { + return 1; + }, + { + output: [1], + precision: 'single', + optimizeFloatMemory: true, + } + ); const result = fn(); assert.equal(fn.TextureConstructor.name, 'GLTextureMemoryOptimized'); assert.equal(fn.formatValues, utils.erectMemoryOptimizedFloat); assert.equal(result[0], 1); } -(GPU.isSinglePrecisionSupported && GPU.isGPUSupported ? test : skip)('when enabled calls correct render function gpu (GPU ONLY)', () => { - whenEnabledCallsCorrectRenderFunction('gpu'); -}); -(GPU.isSinglePrecisionSupported && GPU.isWebGLSupported ? test : skip)('when enabled calls correct render function webgl (GPU ONLY)', () => { - whenEnabledCallsCorrectRenderFunction('webgl'); -}); -(GPU.isSinglePrecisionSupported && GPU.isWebGL2Supported ? test : skip)('when enabled calls correct render function webgl2 (GPU ONLY)', () => { - whenEnabledCallsCorrectRenderFunction('webgl2'); -}); -(GPU.isSinglePrecisionSupported && GPU.isHeadlessGLSupported ? test : skip)('when enabled calls correct render function headlessgl (GPU ONLY)', () => { - whenEnabledCallsCorrectRenderFunction('headlessgl'); -}); - +(GPU.isSinglePrecisionSupported && GPU.isGPUSupported ? test : skip)( + 'when enabled calls correct render function gpu (GPU ONLY)', + () => { + whenEnabledCallsCorrectRenderFunction('gpu'); + } +); +(GPU.isSinglePrecisionSupported && GPU.isWebGLSupported ? test : skip)( + 'when enabled calls correct render function webgl (GPU ONLY)', + () => { + whenEnabledCallsCorrectRenderFunction('webgl'); + } +); +(GPU.isSinglePrecisionSupported && GPU.isWebGL2Supported ? test : skip)( + 'when enabled calls correct render function webgl2 (GPU ONLY)', + () => { + whenEnabledCallsCorrectRenderFunction('webgl2'); + } +); +(GPU.isSinglePrecisionSupported && GPU.isHeadlessGLSupported ? test : skip)( + 'when enabled calls correct render function headlessgl (GPU ONLY)', + () => { + whenEnabledCallsCorrectRenderFunction('headlessgl'); + } +); function whenEnabledCallsCorrectRenderFunction2D(mode) { const gpu = new GPU({ mode }); - const fn = gpu.createKernel(function() { return 1 }, { - output: [2, 2], - precision: 'single', - optimizeFloatMemory: true, - }); + const fn = gpu.createKernel( + function () { + return 1; + }, + { + output: [2, 2], + precision: 'single', + optimizeFloatMemory: true, + } + ); const result = fn(); assert.equal(fn.TextureConstructor.name, 'GLTextureMemoryOptimized2D'); assert.equal(fn.formatValues, utils.erectMemoryOptimized2DFloat); - assert.deepEqual(result.map(row => Array.from(row)), [[1,1],[1,1]]); + assert.deepEqual( + result.map(row => Array.from(row)), + [ + [1, 1], + [1, 1], + ] + ); } -(GPU.isSinglePrecisionSupported && GPU.isGPUSupported ? test : skip)('when enabled calls correct render function 2d gpu (GPU ONLY)', () => { - whenEnabledCallsCorrectRenderFunction2D('gpu'); -}); -(GPU.isSinglePrecisionSupported && GPU.isWebGLSupported ? test : skip)('when enabled calls correct render function 2d webgl (GPU ONLY)', () => { - whenEnabledCallsCorrectRenderFunction2D('webgl'); -}); -(GPU.isSinglePrecisionSupported && GPU.isWebGL2Supported ? test : skip)('when enabled calls correct render function 2d webgl2 (GPU ONLY)', () => { - whenEnabledCallsCorrectRenderFunction2D('webgl2'); -}); -(GPU.isSinglePrecisionSupported && GPU.isHeadlessGLSupported ? test : skip)('when enabled calls correct render function 2d headlessgl (GPU ONLY)', () => { - whenEnabledCallsCorrectRenderFunction2D('headlessgl'); -}); +(GPU.isSinglePrecisionSupported && GPU.isGPUSupported ? test : skip)( + 'when enabled calls correct render function 2d gpu (GPU ONLY)', + () => { + whenEnabledCallsCorrectRenderFunction2D('gpu'); + } +); +(GPU.isSinglePrecisionSupported && GPU.isWebGLSupported ? test : skip)( + 'when enabled calls correct render function 2d webgl (GPU ONLY)', + () => { + whenEnabledCallsCorrectRenderFunction2D('webgl'); + } +); +(GPU.isSinglePrecisionSupported && GPU.isWebGL2Supported ? test : skip)( + 'when enabled calls correct render function 2d webgl2 (GPU ONLY)', + () => { + whenEnabledCallsCorrectRenderFunction2D('webgl2'); + } +); +(GPU.isSinglePrecisionSupported && GPU.isHeadlessGLSupported ? test : skip)( + 'when enabled calls correct render function 2d headlessgl (GPU ONLY)', + () => { + whenEnabledCallsCorrectRenderFunction2D('headlessgl'); + } +); function whenEnabledCallsCorrectRenderFunction3D(mode) { const gpu = new GPU({ mode }); - const fn = gpu.createKernel(function() { return 1 }, { - output: [2, 2, 2], - precision: 'single', - optimizeFloatMemory: true, - }); + const fn = gpu.createKernel( + function () { + return 1; + }, + { + output: [2, 2, 2], + precision: 'single', + optimizeFloatMemory: true, + } + ); const result = fn(); assert.equal(fn.TextureConstructor.name, 'GLTextureMemoryOptimized3D'); assert.equal(fn.formatValues, utils.erectMemoryOptimized3DFloat); - assert.deepEqual(result.map(matrix => matrix.map(row => Array.from(row))), [[[1,1],[1,1]],[[1,1],[1,1]]]); + assert.deepEqual( + result.map(matrix => matrix.map(row => Array.from(row))), + [ + [ + [1, 1], + [1, 1], + ], + [ + [1, 1], + [1, 1], + ], + ] + ); } -(GPU.isSinglePrecisionSupported && GPU.isGPUSupported ? test : skip)('when enabled calls correct render function 3d gpu (GPU ONLY)', () => { - whenEnabledCallsCorrectRenderFunction3D('gpu'); -}); -(GPU.isSinglePrecisionSupported && GPU.isWebGLSupported ? test : skip)('when enabled calls correct render function 3d webgl (GPU ONLY)', () => { - whenEnabledCallsCorrectRenderFunction3D('webgl'); -}); -(GPU.isSinglePrecisionSupported && GPU.isWebGL2Supported ? test : skip)('when enabled calls correct render function 3d webgl2 (GPU ONLY)', () => { - whenEnabledCallsCorrectRenderFunction3D('webgl2'); -}); -(GPU.isSinglePrecisionSupported && GPU.isHeadlessGLSupported ? test : skip)('when enabled calls correct render function 3d headlessgl (GPU ONLY)', () => { - whenEnabledCallsCorrectRenderFunction3D('headlessgl'); -}); +(GPU.isSinglePrecisionSupported && GPU.isGPUSupported ? test : skip)( + 'when enabled calls correct render function 3d gpu (GPU ONLY)', + () => { + whenEnabledCallsCorrectRenderFunction3D('gpu'); + } +); +(GPU.isSinglePrecisionSupported && GPU.isWebGLSupported ? test : skip)( + 'when enabled calls correct render function 3d webgl (GPU ONLY)', + () => { + whenEnabledCallsCorrectRenderFunction3D('webgl'); + } +); +(GPU.isSinglePrecisionSupported && GPU.isWebGL2Supported ? test : skip)( + 'when enabled calls correct render function 3d webgl2 (GPU ONLY)', + () => { + whenEnabledCallsCorrectRenderFunction3D('webgl2'); + } +); +(GPU.isSinglePrecisionSupported && GPU.isHeadlessGLSupported ? test : skip)( + 'when enabled calls correct render function 3d headlessgl (GPU ONLY)', + () => { + whenEnabledCallsCorrectRenderFunction3D('headlessgl'); + } +); function singlePrecision(mode) { const gpu = new GPU({ mode }); - const array = [1,2,3,4,5]; - const kernel = gpu.createKernel(function(array) { - return array[this.thread.x]; - }, { - output: [5], - optimizeFloatMemory: true, - precision: 'single', - }); + const array = [1, 2, 3, 4, 5]; + const kernel = gpu.createKernel( + function (array) { + return array[this.thread.x]; + }, + { + output: [5], + optimizeFloatMemory: true, + precision: 'single', + } + ); const result = kernel(array); assert.deepEqual(Array.from(result), array); gpu.destroy(); } -(GPU.isSinglePrecisionSupported && GPU.isGPUSupported ? test : skip)('single precision auto', () => { - singlePrecision(); -}); - -(GPU.isSinglePrecisionSupported && GPU.isGPUSupported ? test : skip)('single precision gpu', () => { - singlePrecision('gpu'); -}); - -(GPU.isSinglePrecisionSupported && GPU.isWebGLSupported ? test : skip)('single precision webgl', () => { - singlePrecision('webgl'); -}); - -(GPU.isSinglePrecisionSupported && GPU.isWebGL2Supported ? test : skip)('single precision webgl2', () => { - singlePrecision('webgl2'); -}); - -(GPU.isSinglePrecisionSupported && GPU.isHeadlessGLSupported ? test : skip)('single precision headlessgl', () => { - singlePrecision('headlessgl'); -}); +(GPU.isSinglePrecisionSupported && GPU.isGPUSupported ? test : skip)( + 'single precision auto', + () => { + singlePrecision(); + } +); + +(GPU.isSinglePrecisionSupported && GPU.isGPUSupported ? test : skip)( + 'single precision gpu', + () => { + singlePrecision('gpu'); + } +); + +(GPU.isSinglePrecisionSupported && GPU.isWebGLSupported ? test : skip)( + 'single precision webgl', + () => { + singlePrecision('webgl'); + } +); + +(GPU.isSinglePrecisionSupported && GPU.isWebGL2Supported ? test : skip)( + 'single precision webgl2', + () => { + singlePrecision('webgl2'); + } +); + +(GPU.isSinglePrecisionSupported && GPU.isHeadlessGLSupported ? test : skip)( + 'single precision headlessgl', + () => { + singlePrecision('headlessgl'); + } +); test('single precision cpu', () => { singlePrecision('cpu'); }); - function float2DOutput(mode) { const gpu = new GPU({ mode }); const matrix = [ - [1,2,3,4,5], - [6,7,8,9,10], - [11,12,13,14,15], + [1, 2, 3, 4, 5], + [6, 7, 8, 9, 10], + [11, 12, 13, 14, 15], ]; - const kernel = gpu.createKernel(function(matrix) { - return matrix[this.thread.y][this.thread.x]; - }, { - output: [5, 3], - optimizeFloatMemory: true, - precision: 'single', - }); + const kernel = gpu.createKernel( + function (matrix) { + return matrix[this.thread.y][this.thread.x]; + }, + { + output: [5, 3], + optimizeFloatMemory: true, + precision: 'single', + } + ); const result = kernel(matrix); - assert.deepEqual(result.map(row => Array.from(row)), matrix); + assert.deepEqual( + result.map(row => Array.from(row)), + matrix + ); gpu.destroy(); } @@ -145,50 +236,67 @@ function float2DOutput(mode) { float2DOutput(); }); -(GPU.isSinglePrecisionSupported && GPU.isGPUSupported ? test : skip)('float 2d output gpu', () => { - float2DOutput('gpu'); -}); - -(GPU.isSinglePrecisionSupported && GPU.isWebGLSupported ? test : skip)('float 2d output webgl', () => { - float2DOutput('webgl'); -}); - -(GPU.isSinglePrecisionSupported && GPU.isWebGL2Supported ? test : skip)('float 2d output webgl2', () => { - float2DOutput('webgl2'); -}); - -(GPU.isSinglePrecisionSupported && GPU.isHeadlessGLSupported ? test : skip)('float 2d output headlessgl', () => { - float2DOutput('headlessgl'); -}); +(GPU.isSinglePrecisionSupported && GPU.isGPUSupported ? test : skip)( + 'float 2d output gpu', + () => { + float2DOutput('gpu'); + } +); + +(GPU.isSinglePrecisionSupported && GPU.isWebGLSupported ? test : skip)( + 'float 2d output webgl', + () => { + float2DOutput('webgl'); + } +); + +(GPU.isSinglePrecisionSupported && GPU.isWebGL2Supported ? test : skip)( + 'float 2d output webgl2', + () => { + float2DOutput('webgl2'); + } +); + +(GPU.isSinglePrecisionSupported && GPU.isHeadlessGLSupported ? test : skip)( + 'float 2d output headlessgl', + () => { + float2DOutput('headlessgl'); + } +); test('float 2d output cpu', () => { float2DOutput('cpu'); }); - function float3DOutput(mode) { const gpu = new GPU({ mode }); const cube = [ [ - [1,2,3,4,5], - [6,7,8,9,10], - [11,12,13,14,15], + [1, 2, 3, 4, 5], + [6, 7, 8, 9, 10], + [11, 12, 13, 14, 15], ], [ - [16,17,18,19,20], - [21,22,23,24,25], - [26,27,28,29,30], - ] + [16, 17, 18, 19, 20], + [21, 22, 23, 24, 25], + [26, 27, 28, 29, 30], + ], ]; - const kernel = gpu.createKernel(function(cube) { - return cube[this.thread.z][this.thread.y][this.thread.x]; - }, { - output: [5, 3, 2], - optimizeFloatMemory: true, - precision: 'single', - }); + const kernel = gpu.createKernel( + function (cube) { + return cube[this.thread.z][this.thread.y][this.thread.x]; + }, + { + output: [5, 3, 2], + optimizeFloatMemory: true, + precision: 'single', + } + ); const result = kernel(cube); - assert.deepEqual(result.map(matrix => matrix.map(row => Array.from(row))), cube); + assert.deepEqual( + result.map(matrix => matrix.map(row => Array.from(row))), + cube + ); gpu.destroy(); } @@ -196,21 +304,33 @@ function float3DOutput(mode) { float3DOutput(); }); -(GPU.isSinglePrecisionSupported && GPU.isGPUSupported ? test : skip)('float 3d output gpu', () => { - float3DOutput('gpu'); -}); - -(GPU.isSinglePrecisionSupported && GPU.isWebGLSupported ? test : skip)('float 3d output webgl', () => { - float3DOutput('webgl'); -}); - -(GPU.isSinglePrecisionSupported && GPU.isWebGL2Supported ? test : skip)('float 3d output webgl2', () => { - float3DOutput('webgl2'); -}); - -(GPU.isSinglePrecisionSupported && GPU.isHeadlessGLSupported ? test : skip)('float 3d output headlessgl', () => { - float3DOutput('headlessgl'); -}); +(GPU.isSinglePrecisionSupported && GPU.isGPUSupported ? test : skip)( + 'float 3d output gpu', + () => { + float3DOutput('gpu'); + } +); + +(GPU.isSinglePrecisionSupported && GPU.isWebGLSupported ? test : skip)( + 'float 3d output webgl', + () => { + float3DOutput('webgl'); + } +); + +(GPU.isSinglePrecisionSupported && GPU.isWebGL2Supported ? test : skip)( + 'float 3d output webgl2', + () => { + float3DOutput('webgl2'); + } +); + +(GPU.isSinglePrecisionSupported && GPU.isHeadlessGLSupported ? test : skip)( + 'float 3d output headlessgl', + () => { + float3DOutput('headlessgl'); + } +); test('float 3d output cpu', () => { float3DOutput('cpu'); @@ -218,116 +338,164 @@ test('float 3d output cpu', () => { function floatPipelineOutput(mode) { const gpu = new GPU({ mode }); - const array = [1,2,3,4,5]; - const kernel = gpu.createKernel(function(array) { - return array[this.thread.x]; - }, { - output: [5], - optimizeFloatMemory: true, - precision: 'single', - pipeline: true, - }); + const array = [1, 2, 3, 4, 5]; + const kernel = gpu.createKernel( + function (array) { + return array[this.thread.x]; + }, + { + output: [5], + optimizeFloatMemory: true, + precision: 'single', + pipeline: true, + } + ); const result = kernel(array).toArray(); assert.deepEqual(Array.from(result), array); gpu.destroy(); } -(GPU.isSinglePrecisionSupported && GPU.isGPUSupported ? test : skip)('float pipeline output gpu (GPU only)', () => { - floatPipelineOutput('gpu'); -}); - -(GPU.isSinglePrecisionSupported && GPU.isWebGLSupported ? test : skip)('float pipeline output webgl (GPU only)', () => { - floatPipelineOutput('webgl'); -}); - -(GPU.isSinglePrecisionSupported && GPU.isWebGL2Supported ? test : skip)('float pipeline output webgl2 (GPU only)', () => { - floatPipelineOutput('webgl2'); -}); - -(GPU.isSinglePrecisionSupported && GPU.isHeadlessGLSupported ? test : skip)('float pipeline output headlessgl (GPU only)', () => { - floatPipelineOutput('headlessgl'); -}); - +(GPU.isSinglePrecisionSupported && GPU.isGPUSupported ? test : skip)( + 'float pipeline output gpu (GPU only)', + () => { + floatPipelineOutput('gpu'); + } +); + +(GPU.isSinglePrecisionSupported && GPU.isWebGLSupported ? test : skip)( + 'float pipeline output webgl (GPU only)', + () => { + floatPipelineOutput('webgl'); + } +); + +(GPU.isSinglePrecisionSupported && GPU.isWebGL2Supported ? test : skip)( + 'float pipeline output webgl2 (GPU only)', + () => { + floatPipelineOutput('webgl2'); + } +); + +(GPU.isSinglePrecisionSupported && GPU.isHeadlessGLSupported ? test : skip)( + 'float pipeline output headlessgl (GPU only)', + () => { + floatPipelineOutput('headlessgl'); + } +); function floatPipeline2DOutput(mode) { const gpu = new GPU({ mode }); const matrix = [ - [1,2,3,4,5], - [6,7,8,9,10], - [11,12,13,14,15], + [1, 2, 3, 4, 5], + [6, 7, 8, 9, 10], + [11, 12, 13, 14, 15], ]; - const kernel = gpu.createKernel(function(matrix) { - return matrix[this.thread.y][this.thread.x]; - }, { - output: [5, 3], - optimizeFloatMemory: true, - precision: 'single', - pipeline: true, - }); + const kernel = gpu.createKernel( + function (matrix) { + return matrix[this.thread.y][this.thread.x]; + }, + { + output: [5, 3], + optimizeFloatMemory: true, + precision: 'single', + pipeline: true, + } + ); const texture = kernel(matrix); const result = texture.toArray(); - assert.deepEqual(result.map(row => Array.from(row)), matrix); + assert.deepEqual( + result.map(row => Array.from(row)), + matrix + ); gpu.destroy(); } - -(GPU.isSinglePrecisionSupported && GPU.isGPUSupported ? test : skip)('float pipeline 2d output gpu (GPU Only)', () => { - floatPipeline2DOutput('gpu'); -}); - -(GPU.isSinglePrecisionSupported && GPU.isWebGLSupported ? test : skip)('float pipeline 2d output webgl (GPU Only)', () => { - floatPipeline2DOutput('webgl'); -}); - -(GPU.isSinglePrecisionSupported && GPU.isWebGL2Supported ? test : skip)('float pipeline 2d output webgl2 (GPU Only)', () => { - floatPipeline2DOutput('webgl2'); -}); - -(GPU.isSinglePrecisionSupported && GPU.isHeadlessGLSupported ? test : skip)('float pipeline 2d output headlessgl (GPU Only)', () => { - floatPipeline2DOutput('headlessgl'); -}); - +(GPU.isSinglePrecisionSupported && GPU.isGPUSupported ? test : skip)( + 'float pipeline 2d output gpu (GPU Only)', + () => { + floatPipeline2DOutput('gpu'); + } +); + +(GPU.isSinglePrecisionSupported && GPU.isWebGLSupported ? test : skip)( + 'float pipeline 2d output webgl (GPU Only)', + () => { + floatPipeline2DOutput('webgl'); + } +); + +(GPU.isSinglePrecisionSupported && GPU.isWebGL2Supported ? test : skip)( + 'float pipeline 2d output webgl2 (GPU Only)', + () => { + floatPipeline2DOutput('webgl2'); + } +); + +(GPU.isSinglePrecisionSupported && GPU.isHeadlessGLSupported ? test : skip)( + 'float pipeline 2d output headlessgl (GPU Only)', + () => { + floatPipeline2DOutput('headlessgl'); + } +); function floatPipeline3DOutput(mode) { const gpu = new GPU({ mode }); const cube = [ [ - [1,2,3,4,5], - [6,7,8,9,10], - [11,12,13,14,15], + [1, 2, 3, 4, 5], + [6, 7, 8, 9, 10], + [11, 12, 13, 14, 15], ], [ - [16,17,18,19,20], - [21,22,23,24,25], - [26,27,28,29,30], - ] + [16, 17, 18, 19, 20], + [21, 22, 23, 24, 25], + [26, 27, 28, 29, 30], + ], ]; - const kernel = gpu.createKernel(function(cube) { - return cube[this.thread.z][this.thread.y][this.thread.x]; - }, { - output: [5, 3, 2], - optimizeFloatMemory: true, - precision: 'single', - pipeline: true, - }); + const kernel = gpu.createKernel( + function (cube) { + return cube[this.thread.z][this.thread.y][this.thread.x]; + }, + { + output: [5, 3, 2], + optimizeFloatMemory: true, + precision: 'single', + pipeline: true, + } + ); const result = kernel(cube).toArray(); - assert.deepEqual(result.map(matrix => matrix.map(row => Array.from(row))), cube); + assert.deepEqual( + result.map(matrix => matrix.map(row => Array.from(row))), + cube + ); gpu.destroy(); } - -(GPU.isSinglePrecisionSupported && GPU.isGPUSupported ? test : skip)('float pipeline 3d output gpu (GPU only)', () => { - floatPipeline3DOutput('gpu'); -}); - -(GPU.isSinglePrecisionSupported && GPU.isWebGLSupported ? test : skip)('float pipeline 3d output webgl (GPU only)', () => { - floatPipeline3DOutput('webgl'); -}); - -(GPU.isSinglePrecisionSupported && GPU.isSinglePrecisionSupported && GPU.isWebGL2Supported ? test : skip)('float pipeline 3d output webgl2 (GPU only)', () => { +(GPU.isSinglePrecisionSupported && GPU.isGPUSupported ? test : skip)( + 'float pipeline 3d output gpu (GPU only)', + () => { + floatPipeline3DOutput('gpu'); + } +); + +(GPU.isSinglePrecisionSupported && GPU.isWebGLSupported ? test : skip)( + 'float pipeline 3d output webgl (GPU only)', + () => { + floatPipeline3DOutput('webgl'); + } +); + +(GPU.isSinglePrecisionSupported && + GPU.isSinglePrecisionSupported && + GPU.isWebGL2Supported + ? test + : skip)('float pipeline 3d output webgl2 (GPU only)', () => { floatPipeline3DOutput('webgl2'); }); -(GPU.isSinglePrecisionSupported && GPU.isHeadlessGLSupported ? test : skip)('float pipeline 3d output headlessgl (GPU only)', () => { - floatPipeline3DOutput('headlessgl'); -}); +(GPU.isSinglePrecisionSupported && GPU.isHeadlessGLSupported ? test : skip)( + 'float pipeline 3d output headlessgl (GPU only)', + () => { + floatPipeline3DOutput('headlessgl'); + } +); diff --git a/test/features/output.js b/test/features/output.js index 17d348e0..8b6bcf6f 100644 --- a/test/features/output.js +++ b/test/features/output.js @@ -1,14 +1,17 @@ const { assert, test, module: describe, only, skip } = require('qunit'); -const { GPU } = require('../../src'); +const { GPU } = require('../..'); describe('features: output'); function outputArray(mode) { const gpu = new GPU({ mode }); - const input = [1,2,3,4,5]; - const kernel = gpu.createKernel(function(input) { - return input[this.thread.x]; - }, { output: [5] }); + const input = [1, 2, 3, 4, 5]; + const kernel = gpu.createKernel( + function (input) { + return input[this.thread.x]; + }, + { output: [5] } + ); const result = kernel(input); assert.deepEqual(Array.from(result), input); gpu.destroy(); @@ -41,17 +44,23 @@ test('output array cpu', () => { function outputMatrix(mode) { const gpu = new GPU({ mode }); const input = [ - [1,2,3,4,5], - [1,2,3,4,5], - [1,2,3,4,5], - [1,2,3,4,5], - [1,2,3,4,5], + [1, 2, 3, 4, 5], + [1, 2, 3, 4, 5], + [1, 2, 3, 4, 5], + [1, 2, 3, 4, 5], + [1, 2, 3, 4, 5], ]; - const kernel = gpu.createKernel(function(input) { - return input[this.thread.y][this.thread.x]; - }, { output: [5, 5] }); + const kernel = gpu.createKernel( + function (input) { + return input[this.thread.y][this.thread.x]; + }, + { output: [5, 5] } + ); const result = kernel(input); - assert.deepEqual(result.map(array => Array.from(array)), input); + assert.deepEqual( + result.map(array => Array.from(array)), + input + ); gpu.destroy(); } @@ -83,46 +92,52 @@ function outputCube(mode) { const gpu = new GPU({ mode }); const input = [ [ - [1,2,3,4,5], - [1,2,3,4,5], - [1,2,3,4,5], - [1,2,3,4,5], - [1,2,3,4,5], + [1, 2, 3, 4, 5], + [1, 2, 3, 4, 5], + [1, 2, 3, 4, 5], + [1, 2, 3, 4, 5], + [1, 2, 3, 4, 5], ], [ - [1,2,3,4,5], - [1,2,3,4,5], - [1,2,3,4,5], - [1,2,3,4,5], - [1,2,3,4,5], + [1, 2, 3, 4, 5], + [1, 2, 3, 4, 5], + [1, 2, 3, 4, 5], + [1, 2, 3, 4, 5], + [1, 2, 3, 4, 5], ], [ - [1,2,3,4,5], - [1,2,3,4,5], - [1,2,3,4,5], - [1,2,3,4,5], - [1,2,3,4,5], + [1, 2, 3, 4, 5], + [1, 2, 3, 4, 5], + [1, 2, 3, 4, 5], + [1, 2, 3, 4, 5], + [1, 2, 3, 4, 5], ], [ - [1,2,3,4,5], - [1,2,3,4,5], - [1,2,3,4,5], - [1,2,3,4,5], - [1,2,3,4,5], + [1, 2, 3, 4, 5], + [1, 2, 3, 4, 5], + [1, 2, 3, 4, 5], + [1, 2, 3, 4, 5], + [1, 2, 3, 4, 5], ], [ - [1,2,3,4,5], - [1,2,3,4,5], - [1,2,3,4,5], - [1,2,3,4,5], - [1,2,3,4,5], - ] + [1, 2, 3, 4, 5], + [1, 2, 3, 4, 5], + [1, 2, 3, 4, 5], + [1, 2, 3, 4, 5], + [1, 2, 3, 4, 5], + ], ]; - const kernel = gpu.createKernel(function(input) { - return input[this.thread.z][this.thread.y][this.thread.x]; - }, { output: [5, 5, 5] }); + const kernel = gpu.createKernel( + function (input) { + return input[this.thread.z][this.thread.y][this.thread.x]; + }, + { output: [5, 5, 5] } + ); const result = kernel(input); - assert.deepEqual(result.map(matrix => matrix.map(array => Array.from(array))), input); + assert.deepEqual( + result.map(matrix => matrix.map(array => Array.from(array))), + input + ); gpu.destroy(); } @@ -153,19 +168,22 @@ test('output cube cpu', () => { function outputGraphicalArray(mode) { const gpu = new GPU({ mode }); const mockContext = { - getExtension: () => {} + getExtension: () => {}, }; const mockCanvas = { getContext: () => mockContext, }; assert.throws(() => { - const kernel = gpu.createKernel(function(input) { - return input[this.thread.x]; - }, { - canvas: mockCanvas, - output: [5], - graphical: true - }); + const kernel = gpu.createKernel( + function (input) { + return input[this.thread.x]; + }, + { + canvas: mockCanvas, + output: [5], + graphical: true, + } + ); kernel([1]); }, new Error('Output must have 2 dimensions on graphical mode')); gpu.destroy(); @@ -187,9 +205,12 @@ test('graphical output array gpu', () => { outputGraphicalArray('webgl2'); }); -(GPU.isHeadlessGLSupported ? test : skip)('graphical output array headlessgl', () => { - outputGraphicalArray('headlessgl'); -}); +(GPU.isHeadlessGLSupported ? test : skip)( + 'graphical output array headlessgl', + () => { + outputGraphicalArray('headlessgl'); + } +); test('graphical output array cpu', () => { outputGraphicalArray('cpu'); @@ -198,18 +219,21 @@ test('graphical output array cpu', () => { function outputGraphicalMatrix(mode, canvas, context) { const gpu = new GPU({ mode }); const input = [ - [0.25,.50], - [.75,1], + [0.25, 0.5], + [0.75, 1], ]; - const kernel = gpu.createKernel(function(input) { - const color = input[this.thread.y][this.thread.x]; - this.color(color, color, color, color); - }, { - context, - canvas, - output: [2, 2], - graphical: true - }); + const kernel = gpu.createKernel( + function (input) { + const color = input[this.thread.y][this.thread.x]; + this.color(color, color, color, color); + }, + { + context, + canvas, + output: [2, 2], + graphical: true, + } + ); const result = kernel(input); assert.equal(result, undefined); const pixels = Array.from(kernel.getPixels()); @@ -221,93 +245,55 @@ function outputGraphicalMatrix(mode, canvas, context) { const canvas = document.createElement('canvas'); const context = canvas.getContext('webgl', { premultipliedAlpha: false }); const pixels = outputGraphicalMatrix('webgl', canvas, context); - assert.deepEqual(pixels, [ - 191, - 191, - 191, - 191, - 255, - 255, - 255, - 255, - 64, - 64, - 64, - 64, - 128, - 128, - 128, - 128 - ]); + assert.deepEqual( + pixels, + [ + 191, 191, 191, 191, 255, 255, 255, 255, 64, 64, 64, 64, 128, 128, 128, + 128, + ] + ); }); (GPU.isWebGL2Supported ? test : skip)('graphical output matrix webgl2', () => { const canvas = document.createElement('canvas'); const context = canvas.getContext('webgl2', { premultipliedAlpha: false }); const pixels = outputGraphicalMatrix('webgl2', canvas, context); - assert.deepEqual(pixels, [ - 191, - 191, - 191, - 191, - 255, - 255, - 255, - 255, - 64, - 64, - 64, - 64, - 128, - 128, - 128, - 128 - ]); -}); - -(GPU.isHeadlessGLSupported ? test : skip)('graphical output matrix headlessgl', () => { - const pixels = outputGraphicalMatrix('headlessgl'); - assert.deepEqual(pixels, [ - 191, - 191, - 191, - 191, - 255, - 255, - 255, - 255, - 64, - 64, - 64, - 64, - 128, - 128, - 128, - 128 - ]); -}); - -(GPU.isCanvasSupported ? test : skip)('graphical output matrix cpu with real canvas', () => { - const pixels = outputGraphicalMatrix('cpu'); - assert.deepEqual(pixels, [ - 191, - 191, - 191, - 191, - 255, - 255, - 255, - 255, - 63, - 63, - 63, - 63, - 127, - 127, - 127, - 127 - ]); -}); + assert.deepEqual( + pixels, + [ + 191, 191, 191, 191, 255, 255, 255, 255, 64, 64, 64, 64, 128, 128, 128, + 128, + ] + ); +}); + +(GPU.isHeadlessGLSupported ? test : skip)( + 'graphical output matrix headlessgl', + () => { + const pixels = outputGraphicalMatrix('headlessgl'); + assert.deepEqual( + pixels, + [ + 191, 191, 191, 191, 255, 255, 255, 255, 64, 64, 64, 64, 128, 128, 128, + 128, + ] + ); + } +); + +(GPU.isCanvasSupported ? test : skip)( + 'graphical output matrix cpu with real canvas', + () => { + const pixels = outputGraphicalMatrix('cpu'); + assert.deepEqual( + pixels, + [ + 191, 191, 191, 191, 255, 255, 255, 255, 63, 63, 63, 63, 127, 127, 127, + 127, + ] + ); + } +); test('graphical output matrix cpu with mocked canvas', () => { // allow tests on node or browser @@ -316,7 +302,7 @@ test('graphical output matrix cpu with mocked canvas', () => { createImageData: () => { return { data: new Uint8ClampedArray(2 * 2 * 4) }; }, - putImageData: (_outputImageData) => { + putImageData: _outputImageData => { outputImageData = _outputImageData; }, getImageData: () => { @@ -324,48 +310,40 @@ test('graphical output matrix cpu with mocked canvas', () => { }, getExtension: () => { return null; - } + }, }; const mockCanvas = { getContext: () => mockContext, }; const pixels = outputGraphicalMatrix('cpu', mockCanvas, mockContext); - assert.deepEqual(pixels, [ - 191, - 191, - 191, - 191, - 255, - 255, - 255, - 255, - 63, - 63, - 63, - 63, - 127, - 127, - 127, - 127 - ]); + assert.deepEqual( + pixels, + [ + 191, 191, 191, 191, 255, 255, 255, 255, 63, 63, 63, 63, 127, 127, 127, + 127, + ] + ); }); function outputGraphicalCube(mode) { const gpu = new GPU({ mode }); const mockContext = { - getExtension: () => {} + getExtension: () => {}, }; const mockCanvas = { - getContext: () => mockContext + getContext: () => mockContext, }; assert.throws(() => { - const kernel = gpu.createKernel(function(input) { - return input[this.thread.x]; - }, { - canvas: mockCanvas, - output: [5,5,5], - graphical: true - }); + const kernel = gpu.createKernel( + function (input) { + return input[this.thread.x]; + }, + { + canvas: mockCanvas, + output: [5, 5, 5], + graphical: true, + } + ); kernel([1]); }, new Error('Output must have 2 dimensions on graphical mode')); gpu.destroy(); @@ -387,9 +365,12 @@ test('graphical output array gpu', () => { outputGraphicalCube('webgl2'); }); -(GPU.isHeadlessGLSupported ? test : skip)('graphical output array headlessgl', () => { - outputGraphicalCube('headlessgl'); -}); +(GPU.isHeadlessGLSupported ? test : skip)( + 'graphical output array headlessgl', + () => { + outputGraphicalCube('headlessgl'); + } +); test('graphical output array cpu', () => { outputGraphicalCube('cpu'); diff --git a/test/features/promise-api.js b/test/features/promise-api.js index f77c6e87..b8cd9ce8 100644 --- a/test/features/promise-api.js +++ b/test/features/promise-api.js @@ -1,17 +1,17 @@ const { assert, skip, test, module: describe } = require('qunit'); -const { GPU } = require('../../src'); +const { GPU } = require('../..'); describe('features: promise api'); function promiseApiFunctionReturn(mode, done) { const gpu = new GPU({ mode }); - const kernelFn = function() { + const kernelFn = function () { return 42.0; }; const settings = { - output : [1] + output: [1], }; // Setup kernel @@ -20,12 +20,12 @@ function promiseApiFunctionReturn(mode, done) { const promiseObj = kernel.exec(); assert.ok(promiseObj !== null, 'Promise object generated test'); promiseObj - .then((res) => { - assert.equal(res[0], 42.0 ); + .then(res => { + assert.equal(res[0], 42.0); gpu.destroy(); done(); }) - .catch((err) => { + .catch(err => { throw err; }); } diff --git a/test/features/raw-output.js b/test/features/raw-output.js index 0f73e5f9..c75f5303 100644 --- a/test/features/raw-output.js +++ b/test/features/raw-output.js @@ -1,16 +1,19 @@ const { assert, skip, test, module: describe } = require('qunit'); -const { GPU } = require('../../src'); +const { GPU } = require('../..'); describe('features: raw output'); function rawUnsignedPrecisionRenderOutput(mode) { const gpu = new GPU({ mode }); - const kernel = gpu.createKernel(function(v) { - return v[this.thread.x]; - }, { - output: [1], - precision: 'unsigned', - }); + const kernel = gpu.createKernel( + function (v) { + return v[this.thread.x]; + }, + { + output: [1], + precision: 'unsigned', + } + ); kernel.build([1]); kernel.run([1]); const result = kernel.renderRawOutput(); @@ -23,21 +26,33 @@ test('raw unsigned precision render output auto', () => { rawUnsignedPrecisionRenderOutput(); }); -(GPU.isGPUSupported ? test : skip)('raw unsigned precision render output gpu', () => { - rawUnsignedPrecisionRenderOutput('gpu'); -}); - -(GPU.isWebGLSupported ? test : skip)('raw unsigned precision render output webgl', () => { - rawUnsignedPrecisionRenderOutput('webgl'); -}); - -(GPU.isWebGL2Supported ? test : skip)('raw unsigned precision render output webgl2', () => { - rawUnsignedPrecisionRenderOutput('webgl2'); -}); - -(GPU.isHeadlessGLSupported ? test : skip)('raw unsigned precision render output headlessgl', () => { - rawUnsignedPrecisionRenderOutput('headlessgl'); -}); +(GPU.isGPUSupported ? test : skip)( + 'raw unsigned precision render output gpu', + () => { + rawUnsignedPrecisionRenderOutput('gpu'); + } +); + +(GPU.isWebGLSupported ? test : skip)( + 'raw unsigned precision render output webgl', + () => { + rawUnsignedPrecisionRenderOutput('webgl'); + } +); + +(GPU.isWebGL2Supported ? test : skip)( + 'raw unsigned precision render output webgl2', + () => { + rawUnsignedPrecisionRenderOutput('webgl2'); + } +); + +(GPU.isHeadlessGLSupported ? test : skip)( + 'raw unsigned precision render output headlessgl', + () => { + rawUnsignedPrecisionRenderOutput('headlessgl'); + } +); test('raw unsigned precision render output cpu', () => { assert.throws(() => { @@ -45,15 +60,17 @@ test('raw unsigned precision render output cpu', () => { }); }); - function rawSinglePrecisionRenderOutput(mode) { const gpu = new GPU({ mode }); - const kernel = gpu.createKernel(function(v) { - return v[this.thread.x]; - }, { - output: [1], - precision: 'single', - }); + const kernel = gpu.createKernel( + function (v) { + return v[this.thread.x]; + }, + { + output: [1], + precision: 'single', + } + ); kernel.build([1]); kernel.run([1]); const result = kernel.renderRawOutput(); @@ -70,25 +87,40 @@ function rawSinglePrecisionRenderOutput(mode) { gpu.destroy(); } -(GPU.isSinglePrecisionSupported ? test : skip)('raw single precision render output auto', () => { - rawSinglePrecisionRenderOutput(); -}); - -(GPU.isGPUSupported && GPU.isSinglePrecisionSupported ? test : skip)('raw single precision render output gpu', () => { - rawSinglePrecisionRenderOutput('gpu'); -}); - -(GPU.isWebGLSupported && GPU.isSinglePrecisionSupported ? test : skip)('raw single precision render output webgl', () => { - rawSinglePrecisionRenderOutput('webgl'); -}); - -(GPU.isWebGL2Supported && GPU.isSinglePrecisionSupported ? test : skip)('raw single precision render output webgl2', () => { - rawSinglePrecisionRenderOutput('webgl2'); -}); - -(GPU.isHeadlessGLSupported && GPU.isSinglePrecisionSupported ? test : skip)('raw single precision render output headlessgl', () => { - rawSinglePrecisionRenderOutput('headlessgl'); -}); +(GPU.isSinglePrecisionSupported ? test : skip)( + 'raw single precision render output auto', + () => { + rawSinglePrecisionRenderOutput(); + } +); + +(GPU.isGPUSupported && GPU.isSinglePrecisionSupported ? test : skip)( + 'raw single precision render output gpu', + () => { + rawSinglePrecisionRenderOutput('gpu'); + } +); + +(GPU.isWebGLSupported && GPU.isSinglePrecisionSupported ? test : skip)( + 'raw single precision render output webgl', + () => { + rawSinglePrecisionRenderOutput('webgl'); + } +); + +(GPU.isWebGL2Supported && GPU.isSinglePrecisionSupported ? test : skip)( + 'raw single precision render output webgl2', + () => { + rawSinglePrecisionRenderOutput('webgl2'); + } +); + +(GPU.isHeadlessGLSupported && GPU.isSinglePrecisionSupported ? test : skip)( + 'raw single precision render output headlessgl', + () => { + rawSinglePrecisionRenderOutput('headlessgl'); + } +); test('raw single precision render output cpu', () => { assert.throws(() => { diff --git a/test/features/read-color-texture.js b/test/features/read-color-texture.js index 40453319..16abae3c 100644 --- a/test/features/read-color-texture.js +++ b/test/features/read-color-texture.js @@ -1,61 +1,56 @@ const { assert, skip, test, module: describe, only } = require('qunit'); -const { GPU } = require('../../src'); +const { GPU } = require('../..'); describe('features: read color texture'); function colorSyntaxTest(mode) { const gpu = new GPU({ mode }); - const createTexture = gpu.createKernel( - function(value) { + const createTexture = gpu + .createKernel(function (value) { this.color( value[this.thread.y][this.thread.x], value[this.thread.y][this.thread.x], value[this.thread.y][this.thread.x], value[this.thread.y][this.thread.x] ); - } - ) + }) .setOutput([4, 4]) .setGraphical(true) .setPipeline(true); - const readRTexture = gpu.createKernel( - function(texture) { + const readRTexture = gpu + .createKernel(function (texture) { const pixel = texture[this.thread.y][this.thread.x]; return pixel.r; - } - ) + }) .setOutput([4, 4]); - const readGTexture = gpu.createKernel( - function(texture) { + const readGTexture = gpu + .createKernel(function (texture) { const pixel = texture[this.thread.y][this.thread.x]; return pixel.g; - } - ) + }) .setOutput([4, 4]); - const readBTexture = gpu.createKernel( - function(texture) { + const readBTexture = gpu + .createKernel(function (texture) { const pixel = texture[this.thread.y][this.thread.x]; return pixel.b; - } - ) + }) .setOutput([4, 4]); - const readATexture = gpu.createKernel( - function(texture) { + const readATexture = gpu + .createKernel(function (texture) { const pixel = texture[this.thread.y][this.thread.x]; return pixel.a; - } - ) + }) .setOutput([4, 4]); const texture = createTexture([ - [.01,.02,.03,.04], - [.05,.06,.07,.08], - [.09,.10,.11,.12], - [.13,.14,.15,.16] + [0.01, 0.02, 0.03, 0.04], + [0.05, 0.06, 0.07, 0.08], + [0.09, 0.1, 0.11, 0.12], + [0.13, 0.14, 0.15, 0.16], ]); const resultR = readRTexture(texture); const resultG = readGTexture(texture); diff --git a/test/features/read-from-texture.js b/test/features/read-from-texture.js index e5e007ae..251d5a3e 100644 --- a/test/features/read-from-texture.js +++ b/test/features/read-from-texture.js @@ -1,5 +1,5 @@ const { assert, skip, test, module: describe } = require('qunit'); -const { GPU, HeadlessGLKernel } = require('../../src'); +const { GPU, HeadlessGLKernel } = require('../..'); describe('features: read from texture'); @@ -10,11 +10,15 @@ function readWithoutTextureKernels(mode) { return m + n; } - const kernels = gpu.createKernelMap({ - addResult: add - }, function (a, b) { - return add(a[this.thread.x], b[this.thread.x]); - }) + const kernels = gpu + .createKernelMap( + { + addResult: add, + }, + function (a, b) { + return add(a[this.thread.x], b[this.thread.x]); + } + ) .setOutput([5]); const result = kernels([1, 2, 3, 4, 5], [1, 2, 3, 4, 5]); const nonTextureResult = result.addResult; @@ -39,20 +43,27 @@ function readWithoutTextureKernels(mode) { readWithoutTextureKernels('webgl2'); }); -(GPU.isHeadlessGLSupported && HeadlessGLKernel.features.kernelMap ? test : skip)('Read without texture headlessgl', () => { +(GPU.isHeadlessGLSupported && HeadlessGLKernel.features.kernelMap + ? test + : skip)('Read without texture headlessgl', () => { readWithoutTextureKernels('headlessgl'); }); function readFromTextureKernels(mode) { const gpu = new GPU({ mode }); + function add(m, n) { return m + n; } - const kernels = gpu.createKernelMap({ - addResult: add - }, function (a, b) { - return add(a[this.thread.x], b[this.thread.x]); - }) + const kernels = gpu + .createKernelMap( + { + addResult: add, + }, + function (a, b) { + return add(a[this.thread.x], b[this.thread.x]); + } + ) .setPipeline(true) .setOutput([5]); const result = kernels([1, 2, 3, 4, 5], [1, 2, 3, 4, 5]); @@ -78,6 +89,8 @@ function readFromTextureKernels(mode) { readFromTextureKernels('webgl2'); }); -(GPU.isHeadlessGLSupported && HeadlessGLKernel.features.kernelMap ? test : skip)('Read from Texture headlessgl', () => { +(GPU.isHeadlessGLSupported && HeadlessGLKernel.features.kernelMap + ? test + : skip)('Read from Texture headlessgl', () => { readFromTextureKernels('headlessgl'); }); diff --git a/test/features/read-image-bitmap.js b/test/features/read-image-bitmap.js index 41205414..0c11e7ea 100644 --- a/test/features/read-image-bitmap.js +++ b/test/features/read-image-bitmap.js @@ -1,5 +1,5 @@ const { assert, skip, test, module: describe } = require('qunit'); -const { GPU } = require('../../src'); +const { GPU } = require('../..'); describe('features: read from image bitmap'); @@ -7,13 +7,16 @@ function readImageBitmap(mode, done) { const gpu = new GPU({ mode }); const image = new Image(); image.src = 'jellyfish.jpeg'; - const kernel = gpu.createKernel(function(image) { - const pixel = image[this.thread.y][this.thread.x]; - return pixel[0] + pixel[1] + pixel[2] + pixel[3]; - }, { - output: [1] - }); - image.onload = async function() { + const kernel = gpu.createKernel( + function (image) { + const pixel = image[this.thread.y][this.thread.x]; + return pixel[0] + pixel[1] + pixel[2] + pixel[3]; + }, + { + output: [1], + } + ); + image.onload = async function () { const imageBitmapPromise = createImageBitmap(image, 0, 0, 1, 1); const imageBitmap = await imageBitmapPromise; const result = kernel(imageBitmap); @@ -24,26 +27,38 @@ function readImageBitmap(mode, done) { }; } -(typeof Image !== 'undefined' ? test : skip)('readImageBitmap auto', (assert) => { - readImageBitmap(null, assert.async()); -}); +(typeof Image !== 'undefined' ? test : skip)( + 'readImageBitmap auto', + assert => { + readImageBitmap(null, assert.async()); + } +); -(typeof Image !== 'undefined' ? test : skip)('readImageBitmap gpu', (assert) => { +(typeof Image !== 'undefined' ? test : skip)('readImageBitmap gpu', assert => { readImageBitmap('gpu', assert.async()); }); -(GPU.isWebGLSupported && typeof Image !== 'undefined' ? test : skip)('readImageBitmap webgl', (assert) => { - readImageBitmap('webgl', assert.async()); -}); +(GPU.isWebGLSupported && typeof Image !== 'undefined' ? test : skip)( + 'readImageBitmap webgl', + assert => { + readImageBitmap('webgl', assert.async()); + } +); -(GPU.isWebGL2Supported && typeof Image !== 'undefined' ? test : skip)('readImageBitmap webgl2', (assert) => { - readImageBitmap('webgl2', assert.async()); -}); +(GPU.isWebGL2Supported && typeof Image !== 'undefined' ? test : skip)( + 'readImageBitmap webgl2', + assert => { + readImageBitmap('webgl2', assert.async()); + } +); -(GPU.isHeadlessGLSupported && typeof Image !== 'undefined' ? test : skip)('readImageBitmap headlessgl', (assert) => { - readImageBitmap('headlessgl', assert.async()); -}); +(GPU.isHeadlessGLSupported && typeof Image !== 'undefined' ? test : skip)( + 'readImageBitmap headlessgl', + assert => { + readImageBitmap('headlessgl', assert.async()); + } +); -(typeof Image !== 'undefined' ? test : skip)('readImageBitmap cpu', (assert) => { +(typeof Image !== 'undefined' ? test : skip)('readImageBitmap cpu', assert => { readImageBitmap('cpu', assert.async()); }); diff --git a/test/features/read-image-data.js b/test/features/read-image-data.js index 726bf8c2..2383b6bb 100644 --- a/test/features/read-image-data.js +++ b/test/features/read-image-data.js @@ -1,5 +1,5 @@ const { assert, skip, test, module: describe } = require('qunit'); -const { GPU } = require('../../src'); +const { GPU } = require('../..'); describe('features: read from image data'); @@ -7,12 +7,15 @@ function readImageData(mode) { const gpu = new GPU({ mode }); const dataArray = new Uint8ClampedArray([255, 255, 255, 255]); const imageData = new ImageData(dataArray, 1, 1); - const kernel = gpu.createKernel(function(imageData) { - const pixel = imageData[this.thread.y][this.thread.x]; - return pixel[0] + pixel[1] + pixel[2] + pixel[3]; - }, { - output: [1] - }); + const kernel = gpu.createKernel( + function (imageData) { + const pixel = imageData[this.thread.y][this.thread.x]; + return pixel[0] + pixel[1] + pixel[2] + pixel[3]; + }, + { + output: [1], + } + ); const result = kernel(imageData); assert.equal(result.length, 1); assert.equal(result[0], 4); @@ -27,17 +30,26 @@ function readImageData(mode) { readImageData('gpu'); }); -(GPU.isWebGLSupported && typeof ImageData !== 'undefined' ? test : skip)('readImageData webgl', () => { - readImageData('webgl'); -}); - -(GPU.isWebGL2Supported && typeof ImageData !== 'undefined' ? test : skip)('readImageData webgl2', () => { - readImageData('webgl2'); -}); - -(GPU.isHeadlessGLSupported && typeof ImageData !== 'undefined' ? test : skip)('readImageData headlessgl', () => { - readImageData('headlessgl'); -}); +(GPU.isWebGLSupported && typeof ImageData !== 'undefined' ? test : skip)( + 'readImageData webgl', + () => { + readImageData('webgl'); + } +); + +(GPU.isWebGL2Supported && typeof ImageData !== 'undefined' ? test : skip)( + 'readImageData webgl2', + () => { + readImageData('webgl2'); + } +); + +(GPU.isHeadlessGLSupported && typeof ImageData !== 'undefined' ? test : skip)( + 'readImageData headlessgl', + () => { + readImageData('headlessgl'); + } +); (typeof ImageData !== 'undefined' ? test : skip)('readImageData cpu', () => { readImageData('cpu'); diff --git a/test/features/read-offscreen-canvas.js b/test/features/read-offscreen-canvas.js index 91b2db39..d9eee586 100644 --- a/test/features/read-offscreen-canvas.js +++ b/test/features/read-offscreen-canvas.js @@ -3,20 +3,26 @@ if (typeof importScripts !== 'undefined') { importScripts('../../dist/gpu-browser.js'); onmessage = function (e) { const gpu = new GPU({ mode: e.data }); - const kernel1 = gpu.createKernel(function() { - this.color(1, 1, 1, 1); - }, { - output: [1, 1], - graphical: true, - }); + const kernel1 = gpu.createKernel( + function () { + this.color(1, 1, 1, 1); + }, + { + output: [1, 1], + graphical: true, + } + ); kernel1(); const { canvas } = kernel1; - const kernel2 = gpu.createKernel(function(canvas) { - const pixel = canvas[0][this.thread.x]; - return pixel[0] + pixel[1] + pixel[2] + pixel[3]; - }, { - output: [1], - }); + const kernel2 = gpu.createKernel( + function (canvas) { + const pixel = canvas[0][this.thread.x]; + return pixel[0] + pixel[1] + pixel[2] + pixel[3]; + }, + { + output: [1], + } + ); postMessage({ mode: gpu.mode, result: kernel2(canvas) }); gpu.destroy(); }; @@ -35,23 +41,38 @@ if (typeof importScripts !== 'undefined') { worker.postMessage(mode); } - (GPU.isOffscreenCanvasSupported ? test : skip)('read offscreen canvas auto', t => { - testReadOffscreenCanvas(null, t.async()); - }); + (GPU.isOffscreenCanvasSupported ? test : skip)( + 'read offscreen canvas auto', + t => { + testReadOffscreenCanvas(null, t.async()); + } + ); - (GPU.isOffscreenCanvasSupported ? test : skip)('read offscreen canvas gpu', t => { - testReadOffscreenCanvas('gpu', t.async()); - }); + (GPU.isOffscreenCanvasSupported ? test : skip)( + 'read offscreen canvas gpu', + t => { + testReadOffscreenCanvas('gpu', t.async()); + } + ); - (GPU.isOffscreenCanvasSupported ? test : skip)('read offscreen canvas webgl', t => { - testReadOffscreenCanvas('webgl', t.async()); - }); + (GPU.isOffscreenCanvasSupported ? test : skip)( + 'read offscreen canvas webgl', + t => { + testReadOffscreenCanvas('webgl', t.async()); + } + ); - (GPU.isOffscreenCanvasSupported ? test : skip)('read offscreen canvas webgl2', t => { - testReadOffscreenCanvas('webgl2', t.async()); - }); + (GPU.isOffscreenCanvasSupported ? test : skip)( + 'read offscreen canvas webgl2', + t => { + testReadOffscreenCanvas('webgl2', t.async()); + } + ); - (GPU.isOffscreenCanvasSupported ? test : skip)('read offscreen canvas cpu', t => { - testReadOffscreenCanvas('cpu', t.async()); - }); + (GPU.isOffscreenCanvasSupported ? test : skip)( + 'read offscreen canvas cpu', + t => { + testReadOffscreenCanvas('cpu', t.async()); + } + ); } diff --git a/test/features/return-arrays.js b/test/features/return-arrays.js index a6faa7bc..3a4d47da 100644 --- a/test/features/return-arrays.js +++ b/test/features/return-arrays.js @@ -1,37 +1,58 @@ const { assert, skip, test, module: describe, only } = require('qunit'); -const { GPU } = require('../../src'); +const { GPU } = require('../..'); describe('features: return arrays'); function returnArray2FromKernel(mode) { const gpu = new GPU({ mode }); - const kernel = gpu.createKernel(function() { - return [1, 2]; - }, { output: [1], precision: 'single' }); + const kernel = gpu.createKernel( + function () { + return [1, 2]; + }, + { output: [1], precision: 'single' } + ); const result = kernel(); - assert.deepEqual(result.map(v => Array.from(v)), [[1, 2]]); + assert.deepEqual( + result.map(v => Array.from(v)), + [[1, 2]] + ); gpu.destroy(); } -(GPU.isSinglePrecisionSupported ? test : skip)('return Array(2) from kernel auto', () => { - returnArray2FromKernel(); -}); +(GPU.isSinglePrecisionSupported ? test : skip)( + 'return Array(2) from kernel auto', + () => { + returnArray2FromKernel(); + } +); -(GPU.isSinglePrecisionSupported ? test : skip)('return Array(2) from kernel gpu', () => { - returnArray2FromKernel('gpu'); -}); +(GPU.isSinglePrecisionSupported ? test : skip)( + 'return Array(2) from kernel gpu', + () => { + returnArray2FromKernel('gpu'); + } +); -(GPU.isSinglePrecisionSupported && GPU.isWebGLSupported ? test : skip)('return Array(2) from kernel webgl', () => { - returnArray2FromKernel('webgl'); -}); +(GPU.isSinglePrecisionSupported && GPU.isWebGLSupported ? test : skip)( + 'return Array(2) from kernel webgl', + () => { + returnArray2FromKernel('webgl'); + } +); -(GPU.isSinglePrecisionSupported && GPU.isWebGL2Supported ? test : skip)('return Array(2) from kernel webgl2', () => { - returnArray2FromKernel('webgl2'); -}); +(GPU.isSinglePrecisionSupported && GPU.isWebGL2Supported ? test : skip)( + 'return Array(2) from kernel webgl2', + () => { + returnArray2FromKernel('webgl2'); + } +); -(GPU.isSinglePrecisionSupported && GPU.isHeadlessGLSupported ? test : skip)('return Array(2) from kernel headlessgl', () => { - returnArray2FromKernel('headlessgl'); -}); +(GPU.isSinglePrecisionSupported && GPU.isHeadlessGLSupported ? test : skip)( + 'return Array(2) from kernel headlessgl', + () => { + returnArray2FromKernel('headlessgl'); + } +); test('return Array(2) from kernel cpu', () => { returnArray2FromKernel('cpu'); @@ -39,38 +60,56 @@ test('return Array(2) from kernel cpu', () => { function returnArray2D2FromKernel(mode) { const gpu = new GPU({ mode }); - const kernel = gpu.createKernel(function() { - return [this.thread.x, this.thread.y]; - }, { output : [3, 7], precision: 'single' }); + const kernel = gpu.createKernel( + function () { + return [this.thread.x, this.thread.y]; + }, + { output: [3, 7], precision: 'single' } + ); const res = kernel(); for (let y = 0; y < 7; ++y) { for (let x = 0; x < 3; ++x) { - assert.equal(res[y][x][0], x); - assert.equal(res[y][x][1], y); + assert.equal(res[y][x][0], x); + assert.equal(res[y][x][1], y); } } gpu.destroy(); } -(GPU.isSinglePrecisionSupported ? test : skip)('return Array2D(2) from kernel auto', () => { - returnArray2D2FromKernel(); -}); +(GPU.isSinglePrecisionSupported ? test : skip)( + 'return Array2D(2) from kernel auto', + () => { + returnArray2D2FromKernel(); + } +); -(GPU.isSinglePrecisionSupported ? test : skip)('return Array2D(2) from kernel gpu', () => { - returnArray2D2FromKernel('gpu'); -}); +(GPU.isSinglePrecisionSupported ? test : skip)( + 'return Array2D(2) from kernel gpu', + () => { + returnArray2D2FromKernel('gpu'); + } +); -(GPU.isSinglePrecisionSupported && GPU.isWebGLSupported ? test : skip)('return Array2D(2) from kernel webgl', () => { - returnArray2D2FromKernel('webgl'); -}); +(GPU.isSinglePrecisionSupported && GPU.isWebGLSupported ? test : skip)( + 'return Array2D(2) from kernel webgl', + () => { + returnArray2D2FromKernel('webgl'); + } +); -(GPU.isSinglePrecisionSupported && GPU.isWebGL2Supported ? test : skip)('return Array2D(2) from kernel webgl2', () => { - returnArray2D2FromKernel('webgl2'); -}); +(GPU.isSinglePrecisionSupported && GPU.isWebGL2Supported ? test : skip)( + 'return Array2D(2) from kernel webgl2', + () => { + returnArray2D2FromKernel('webgl2'); + } +); -(GPU.isSinglePrecisionSupported && GPU.isHeadlessGLSupported ? test : skip)('return Array2D(2) from kernel headlessgl', () => { - returnArray2D2FromKernel('headlessgl'); -}); +(GPU.isSinglePrecisionSupported && GPU.isHeadlessGLSupported ? test : skip)( + 'return Array2D(2) from kernel headlessgl', + () => { + returnArray2D2FromKernel('headlessgl'); + } +); test('return Array2D(2) from kernel cpu', () => { returnArray2D2FromKernel('cpu'); @@ -78,9 +117,12 @@ test('return Array2D(2) from kernel cpu', () => { function returnArray3D2FromKernel(mode) { const gpu = new GPU({ mode }); -const kernel = gpu.createKernel(function() { - return [this.thread.y, this.thread.z]; - }, { output : [3, 5, 7], precision: 'single' }); + const kernel = gpu.createKernel( + function () { + return [this.thread.y, this.thread.z]; + }, + { output: [3, 5, 7], precision: 'single' } + ); const res = kernel(); for (let z = 0; z < 7; ++z) { for (let y = 0; y < 5; ++y) { @@ -93,60 +135,92 @@ const kernel = gpu.createKernel(function() { gpu.destroy(); } -(GPU.isSinglePrecisionSupported ? test : skip)('return Array3D(2) from kernel auto', () => { - returnArray3D2FromKernel(); -}); +(GPU.isSinglePrecisionSupported ? test : skip)( + 'return Array3D(2) from kernel auto', + () => { + returnArray3D2FromKernel(); + } +); -(GPU.isSinglePrecisionSupported ? test : skip)('return Array3D(2) from kernel gpu', () => { - returnArray3D2FromKernel('gpu'); -}); +(GPU.isSinglePrecisionSupported ? test : skip)( + 'return Array3D(2) from kernel gpu', + () => { + returnArray3D2FromKernel('gpu'); + } +); -(GPU.isSinglePrecisionSupported && GPU.isWebGLSupported ? test : skip)('return Array3D(2) from kernel webgl', () => { - returnArray3D2FromKernel('webgl'); -}); +(GPU.isSinglePrecisionSupported && GPU.isWebGLSupported ? test : skip)( + 'return Array3D(2) from kernel webgl', + () => { + returnArray3D2FromKernel('webgl'); + } +); -(GPU.isSinglePrecisionSupported && GPU.isWebGL2Supported ? test : skip)('return Array3D(2) from kernel webgl2', () => { - returnArray3D2FromKernel('webgl2'); -}); +(GPU.isSinglePrecisionSupported && GPU.isWebGL2Supported ? test : skip)( + 'return Array3D(2) from kernel webgl2', + () => { + returnArray3D2FromKernel('webgl2'); + } +); -(GPU.isSinglePrecisionSupported && GPU.isHeadlessGLSupported ? test : skip)('return Array3D(2) from kernel headlessgl', () => { - returnArray3D2FromKernel('headlessgl'); -}); +(GPU.isSinglePrecisionSupported && GPU.isHeadlessGLSupported ? test : skip)( + 'return Array3D(2) from kernel headlessgl', + () => { + returnArray3D2FromKernel('headlessgl'); + } +); test('return Array3D(2) from kernel cpu', () => { returnArray3D2FromKernel('cpu'); }); - function returnArray3FromKernel(mode) { const gpu = new GPU({ mode }); - const kernel = gpu.createKernel(function() { - return [1, 2, 3]; - }, { output: [1], precision: 'single' }); + const kernel = gpu.createKernel( + function () { + return [1, 2, 3]; + }, + { output: [1], precision: 'single' } + ); const result = kernel(); assert.deepEqual(Array.from(result.map(v => Array.from(v))), [[1, 2, 3]]); gpu.destroy(); } -(GPU.isSinglePrecisionSupported ? test : skip)('return Array(3) from kernel auto', () => { - returnArray3FromKernel(); -}); +(GPU.isSinglePrecisionSupported ? test : skip)( + 'return Array(3) from kernel auto', + () => { + returnArray3FromKernel(); + } +); -(GPU.isSinglePrecisionSupported ? test : skip)('return Array(3) from kernel gpu', () => { - returnArray3FromKernel('gpu'); -}); +(GPU.isSinglePrecisionSupported ? test : skip)( + 'return Array(3) from kernel gpu', + () => { + returnArray3FromKernel('gpu'); + } +); -(GPU.isSinglePrecisionSupported && GPU.isWebGLSupported ? test : skip)('return Array(3) from kernel webgl', () => { - returnArray3FromKernel('webgl'); -}); +(GPU.isSinglePrecisionSupported && GPU.isWebGLSupported ? test : skip)( + 'return Array(3) from kernel webgl', + () => { + returnArray3FromKernel('webgl'); + } +); -(GPU.isSinglePrecisionSupported && GPU.isWebGL2Supported ? test : skip)('return Array(3) from kernel webgl2', () => { - returnArray3FromKernel('webgl2'); -}); +(GPU.isSinglePrecisionSupported && GPU.isWebGL2Supported ? test : skip)( + 'return Array(3) from kernel webgl2', + () => { + returnArray3FromKernel('webgl2'); + } +); -(GPU.isSinglePrecisionSupported && GPU.isHeadlessGLSupported ? test : skip)('return Array(3) from kernel headlessgl', () => { - returnArray3FromKernel('headlessgl'); -}); +(GPU.isSinglePrecisionSupported && GPU.isHeadlessGLSupported ? test : skip)( + 'return Array(3) from kernel headlessgl', + () => { + returnArray3FromKernel('headlessgl'); + } +); test('return Array(3) from kernel cpu', () => { returnArray3FromKernel('cpu'); @@ -154,39 +228,57 @@ test('return Array(3) from kernel cpu', () => { function returnArray2D3FromKernel(mode) { const gpu = new GPU({ mode }); - const kernel = gpu.createKernel(function() { - return [this.thread.x, this.thread.y, this.thread.x * this.thread.y]; - }, { output : [3, 7] ,precision: 'single' }); + const kernel = gpu.createKernel( + function () { + return [this.thread.x, this.thread.y, this.thread.x * this.thread.y]; + }, + { output: [3, 7], precision: 'single' } + ); const res = kernel(); for (let y = 0; y < 7; ++y) { for (let x = 0; x < 3; ++x) { - assert.equal(res[y][x][0], x); - assert.equal(res[y][x][1], y); - assert.equal(res[y][x][2], x * y); + assert.equal(res[y][x][0], x); + assert.equal(res[y][x][1], y); + assert.equal(res[y][x][2], x * y); } } gpu.destroy(); } -(GPU.isSinglePrecisionSupported ? test : skip)('return Array2D(3) from kernel auto', () => { - returnArray2D3FromKernel(); -}); +(GPU.isSinglePrecisionSupported ? test : skip)( + 'return Array2D(3) from kernel auto', + () => { + returnArray2D3FromKernel(); + } +); -(GPU.isSinglePrecisionSupported ? test : skip)('return Array2D(3) from kernel gpu', () => { - returnArray2D3FromKernel('gpu'); -}); +(GPU.isSinglePrecisionSupported ? test : skip)( + 'return Array2D(3) from kernel gpu', + () => { + returnArray2D3FromKernel('gpu'); + } +); -(GPU.isSinglePrecisionSupported && GPU.isWebGLSupported ? test : skip)('return Array2D(3) from kernel webgl', () => { - returnArray2D3FromKernel('webgl'); -}); +(GPU.isSinglePrecisionSupported && GPU.isWebGLSupported ? test : skip)( + 'return Array2D(3) from kernel webgl', + () => { + returnArray2D3FromKernel('webgl'); + } +); -(GPU.isSinglePrecisionSupported && GPU.isWebGL2Supported ? test : skip)('return Array2D(3) from kernel webgl2', () => { - returnArray2D3FromKernel('webgl2'); -}); +(GPU.isSinglePrecisionSupported && GPU.isWebGL2Supported ? test : skip)( + 'return Array2D(3) from kernel webgl2', + () => { + returnArray2D3FromKernel('webgl2'); + } +); -(GPU.isSinglePrecisionSupported && GPU.isHeadlessGLSupported ? test : skip)('return Array2D(3) from kernel headlessgl', () => { - returnArray2D3FromKernel('headlessgl'); -}); +(GPU.isSinglePrecisionSupported && GPU.isHeadlessGLSupported ? test : skip)( + 'return Array2D(3) from kernel headlessgl', + () => { + returnArray2D3FromKernel('headlessgl'); + } +); test('return Array2D(3) from kernel cpu', () => { returnArray2D3FromKernel('cpu'); @@ -194,9 +286,12 @@ test('return Array2D(3) from kernel cpu', () => { function returnArray3D3FromKernel(mode) { const gpu = new GPU({ mode }); - const kernel = gpu.createKernel(function() { - return [this.thread.x, this.thread.y, this.thread.z]; - }, { output : [3, 5, 7] ,precision: 'single' }); + const kernel = gpu.createKernel( + function () { + return [this.thread.x, this.thread.y, this.thread.z]; + }, + { output: [3, 5, 7], precision: 'single' } + ); const res = kernel(); for (let z = 0; z < 7; ++z) { for (let y = 0; y < 5; ++y) { @@ -210,25 +305,40 @@ function returnArray3D3FromKernel(mode) { gpu.destroy(); } -(GPU.isSinglePrecisionSupported ? test : skip)('return Array3D(3) from kernel auto', () => { - returnArray3D3FromKernel(); -}); +(GPU.isSinglePrecisionSupported ? test : skip)( + 'return Array3D(3) from kernel auto', + () => { + returnArray3D3FromKernel(); + } +); -(GPU.isSinglePrecisionSupported ? test : skip)('return Array3D(3) from kernel gpu', () => { - returnArray3D3FromKernel('gpu'); -}); +(GPU.isSinglePrecisionSupported ? test : skip)( + 'return Array3D(3) from kernel gpu', + () => { + returnArray3D3FromKernel('gpu'); + } +); -(GPU.isSinglePrecisionSupported && GPU.isWebGLSupported ? test : skip)('return Array3D(3) from kernel webgl', () => { - returnArray3D3FromKernel('webgl'); -}); +(GPU.isSinglePrecisionSupported && GPU.isWebGLSupported ? test : skip)( + 'return Array3D(3) from kernel webgl', + () => { + returnArray3D3FromKernel('webgl'); + } +); -(GPU.isSinglePrecisionSupported && GPU.isWebGL2Supported ? test : skip)('return Array3D(3) from kernel webgl2', () => { - returnArray3D3FromKernel('webgl2'); -}); +(GPU.isSinglePrecisionSupported && GPU.isWebGL2Supported ? test : skip)( + 'return Array3D(3) from kernel webgl2', + () => { + returnArray3D3FromKernel('webgl2'); + } +); -(GPU.isSinglePrecisionSupported && GPU.isHeadlessGLSupported ? test : skip)('return Array3D(3) from kernel headlessgl', () => { - returnArray3D3FromKernel('headlessgl'); -}); +(GPU.isSinglePrecisionSupported && GPU.isHeadlessGLSupported ? test : skip)( + 'return Array3D(3) from kernel headlessgl', + () => { + returnArray3D3FromKernel('headlessgl'); + } +); test('return Array3D(3) from kernel cpu', () => { returnArray3D3FromKernel('cpu'); @@ -236,33 +346,54 @@ test('return Array3D(3) from kernel cpu', () => { function returnArray4FromKernel(mode) { const gpu = new GPU({ mode }); - const kernel = gpu.createKernel(function() { - return [1, 2, 3, 4]; - }, { output: [1], precision: 'single' }); + const kernel = gpu.createKernel( + function () { + return [1, 2, 3, 4]; + }, + { output: [1], precision: 'single' } + ); const result = kernel(); - assert.deepEqual(result.map(v => Array.from(v)), [[1, 2, 3, 4]]); + assert.deepEqual( + result.map(v => Array.from(v)), + [[1, 2, 3, 4]] + ); gpu.destroy(); } -(GPU.isSinglePrecisionSupported ? test : skip)('return Array(4) from kernel auto', () => { - returnArray4FromKernel(); -}); +(GPU.isSinglePrecisionSupported ? test : skip)( + 'return Array(4) from kernel auto', + () => { + returnArray4FromKernel(); + } +); -(GPU.isSinglePrecisionSupported ? test : skip)('return Array(4) from kernel gpu', () => { - returnArray4FromKernel('gpu'); -}); +(GPU.isSinglePrecisionSupported ? test : skip)( + 'return Array(4) from kernel gpu', + () => { + returnArray4FromKernel('gpu'); + } +); -(GPU.isSinglePrecisionSupported && GPU.isWebGLSupported ? test : skip)('return Array(4) from kernel webgl', () => { - returnArray4FromKernel('webgl'); -}); +(GPU.isSinglePrecisionSupported && GPU.isWebGLSupported ? test : skip)( + 'return Array(4) from kernel webgl', + () => { + returnArray4FromKernel('webgl'); + } +); -(GPU.isSinglePrecisionSupported && GPU.isWebGL2Supported ? test : skip)('return Array(4) from kernel webgl2', () => { - returnArray4FromKernel('webgl2'); -}); +(GPU.isSinglePrecisionSupported && GPU.isWebGL2Supported ? test : skip)( + 'return Array(4) from kernel webgl2', + () => { + returnArray4FromKernel('webgl2'); + } +); -(GPU.isSinglePrecisionSupported && GPU.isHeadlessGLSupported ? test : skip)('return Array(4) from kernel headlessgl', () => { - returnArray4FromKernel('headlessgl'); -}); +(GPU.isSinglePrecisionSupported && GPU.isHeadlessGLSupported ? test : skip)( + 'return Array(4) from kernel headlessgl', + () => { + returnArray4FromKernel('headlessgl'); + } +); test('return Array(4) from kernel cpu', () => { returnArray4FromKernel('cpu'); @@ -270,40 +401,63 @@ test('return Array(4) from kernel cpu', () => { function returnArray2D4FromKernel(mode) { const gpu = new GPU({ mode }); - const kernel = gpu.createKernel(function() { - return [this.thread.x, this.thread.y, this.thread.x * this.thread.y, this.thread.x - this.thread.y]; - }, { output : [3, 7], precision: 'single' }); + const kernel = gpu.createKernel( + function () { + return [ + this.thread.x, + this.thread.y, + this.thread.x * this.thread.y, + this.thread.x - this.thread.y, + ]; + }, + { output: [3, 7], precision: 'single' } + ); const res = kernel(); for (let y = 0; y < 3; ++y) { for (let x = 0; x < 3; ++x) { - assert.equal(res[y][x][0], x); - assert.equal(res[y][x][1], y); - assert.equal(res[y][x][2], x * y); - assert.equal(res[y][x][3], x - y); + assert.equal(res[y][x][0], x); + assert.equal(res[y][x][1], y); + assert.equal(res[y][x][2], x * y); + assert.equal(res[y][x][3], x - y); } } gpu.destroy(); } -(GPU.isSinglePrecisionSupported ? test : skip)('return Array2D(4) from kernel auto', () => { - returnArray2D4FromKernel(); -}); +(GPU.isSinglePrecisionSupported ? test : skip)( + 'return Array2D(4) from kernel auto', + () => { + returnArray2D4FromKernel(); + } +); -(GPU.isSinglePrecisionSupported ? test : skip)('return Array2D(4) from kernel gpu', () => { - returnArray2D4FromKernel('gpu'); -}); +(GPU.isSinglePrecisionSupported ? test : skip)( + 'return Array2D(4) from kernel gpu', + () => { + returnArray2D4FromKernel('gpu'); + } +); -(GPU.isSinglePrecisionSupported && GPU.isWebGLSupported ? test : skip)('return Array2D(4) from kernel webgl', () => { - returnArray2D4FromKernel('webgl'); -}); +(GPU.isSinglePrecisionSupported && GPU.isWebGLSupported ? test : skip)( + 'return Array2D(4) from kernel webgl', + () => { + returnArray2D4FromKernel('webgl'); + } +); -(GPU.isSinglePrecisionSupported && GPU.isWebGL2Supported ? test : skip)('return Array2D(4) from kernel webgl2', () => { - returnArray2D4FromKernel('webgl2'); -}); +(GPU.isSinglePrecisionSupported && GPU.isWebGL2Supported ? test : skip)( + 'return Array2D(4) from kernel webgl2', + () => { + returnArray2D4FromKernel('webgl2'); + } +); -(GPU.isSinglePrecisionSupported && GPU.isHeadlessGLSupported ? test : skip)('return Array2D(4) from kernel headlessgl', () => { - returnArray2D4FromKernel('headlessgl'); -}); +(GPU.isSinglePrecisionSupported && GPU.isHeadlessGLSupported ? test : skip)( + 'return Array2D(4) from kernel headlessgl', + () => { + returnArray2D4FromKernel('headlessgl'); + } +); test('return Array2D(4) from kernel cpu', () => { returnArray2D4FromKernel('cpu'); @@ -311,9 +465,17 @@ test('return Array2D(4) from kernel cpu', () => { function returnArray3D4FromKernel(mode) { const gpu = new GPU({ mode }); - const kernel = gpu.createKernel(function() { - return [this.thread.x, this.thread.y, this.thread.z, this.thread.x * this.thread.y * this.thread.z]; - }, { output : [3, 5, 7], precision: 'single' }); + const kernel = gpu.createKernel( + function () { + return [ + this.thread.x, + this.thread.y, + this.thread.z, + this.thread.x * this.thread.y * this.thread.z, + ]; + }, + { output: [3, 5, 7], precision: 'single' } + ); const res = kernel(); for (let z = 0; z < 7; ++z) { for (let y = 0; y < 5; ++y) { @@ -328,25 +490,40 @@ function returnArray3D4FromKernel(mode) { gpu.destroy(); } -(GPU.isSinglePrecisionSupported ? test : skip)('return Array3D(4) from kernel auto', () => { - returnArray3D4FromKernel(); -}); +(GPU.isSinglePrecisionSupported ? test : skip)( + 'return Array3D(4) from kernel auto', + () => { + returnArray3D4FromKernel(); + } +); -(GPU.isSinglePrecisionSupported ? test : skip)('return Array3D(4) from kernel gpu', () => { - returnArray3D4FromKernel('gpu'); -}); +(GPU.isSinglePrecisionSupported ? test : skip)( + 'return Array3D(4) from kernel gpu', + () => { + returnArray3D4FromKernel('gpu'); + } +); -(GPU.isSinglePrecisionSupported && GPU.isWebGLSupported ? test : skip)('return Array3D(4) from kernel webgl', () => { - returnArray3D4FromKernel('webgl'); -}); +(GPU.isSinglePrecisionSupported && GPU.isWebGLSupported ? test : skip)( + 'return Array3D(4) from kernel webgl', + () => { + returnArray3D4FromKernel('webgl'); + } +); -(GPU.isSinglePrecisionSupported && GPU.isWebGL2Supported ? test : skip)('return Array3D(4) from kernel webgl2', () => { - returnArray3D4FromKernel('webgl2'); -}); +(GPU.isSinglePrecisionSupported && GPU.isWebGL2Supported ? test : skip)( + 'return Array3D(4) from kernel webgl2', + () => { + returnArray3D4FromKernel('webgl2'); + } +); -(GPU.isSinglePrecisionSupported && GPU.isHeadlessGLSupported ? test : skip)('return Array3D(4) from kernel headlessgl', () => { - returnArray3D4FromKernel('headlessgl'); -}); +(GPU.isSinglePrecisionSupported && GPU.isHeadlessGLSupported ? test : skip)( + 'return Array3D(4) from kernel headlessgl', + () => { + returnArray3D4FromKernel('headlessgl'); + } +); test('return Array3D(4) from kernel cpu', () => { returnArray3D4FromKernel('cpu'); @@ -354,117 +531,189 @@ test('return Array3D(4) from kernel cpu', () => { function returnArray2FromKernelVariables33Length(mode) { const array = [ - 1,2,3,4, 5,6,7,8, 9,10,11,12, 13,14,15,16, - 17,18,19,20, 21,22,23, 24,25,26,27, 28,29,30,31, - 32,33]; + 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, + 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, + ]; const sixteen = new Uint16Array(array); const eight = new Uint8Array(array); const gpu = new GPU({ mode }); - const kernel = gpu.createKernel(function(v1, v2) { - return [v1[this.thread.x], v2[this.thread.x]]; - }, { output: [33] }); + const kernel = gpu.createKernel( + function (v1, v2) { + return [v1[this.thread.x], v2[this.thread.x]]; + }, + { output: [33] } + ); const result = kernel(sixteen, eight); - assert.deepEqual(result.map(v => Array.from(v)), array.map(v => [v,v])); + assert.deepEqual( + result.map(v => Array.from(v)), + array.map(v => [v, v]) + ); gpu.destroy(); } -(GPU.isSinglePrecisionSupported ? test : skip)('return Array(2) from kernel variables 33 in length auto', () => { - returnArray2FromKernelVariables33Length(); -}); +(GPU.isSinglePrecisionSupported ? test : skip)( + 'return Array(2) from kernel variables 33 in length auto', + () => { + returnArray2FromKernelVariables33Length(); + } +); -(GPU.isSinglePrecisionSupported && GPU.isGPUSupported ? test : skip)('return Array(2) from kernel variables 33 in length gpu', () => { - returnArray2FromKernelVariables33Length('gpu'); -}); +(GPU.isSinglePrecisionSupported && GPU.isGPUSupported ? test : skip)( + 'return Array(2) from kernel variables 33 in length gpu', + () => { + returnArray2FromKernelVariables33Length('gpu'); + } +); -(GPU.isSinglePrecisionSupported && GPU.isWebGLSupported ? test : skip)('return Array(2) from kernel variables 33 in length webgl', () => { - returnArray2FromKernelVariables33Length('webgl'); -}); +(GPU.isSinglePrecisionSupported && GPU.isWebGLSupported ? test : skip)( + 'return Array(2) from kernel variables 33 in length webgl', + () => { + returnArray2FromKernelVariables33Length('webgl'); + } +); -(GPU.isSinglePrecisionSupported && GPU.isWebGL2Supported ? test : skip)('return Array(2) from kernel variables 33 in length webgl2', () => { - returnArray2FromKernelVariables33Length('webgl2'); -}); +(GPU.isSinglePrecisionSupported && GPU.isWebGL2Supported ? test : skip)( + 'return Array(2) from kernel variables 33 in length webgl2', + () => { + returnArray2FromKernelVariables33Length('webgl2'); + } +); -(GPU.isSinglePrecisionSupported && GPU.isHeadlessGLSupported ? test : skip)('return Array(2) from kernel variables 33 in length headlessgl', () => { - returnArray2FromKernelVariables33Length('headlessgl'); -}); +(GPU.isSinglePrecisionSupported && GPU.isHeadlessGLSupported ? test : skip)( + 'return Array(2) from kernel variables 33 in length headlessgl', + () => { + returnArray2FromKernelVariables33Length('headlessgl'); + } +); test('return Array(2) from kernel variables 33 in length cpu', () => { returnArray2FromKernelVariables33Length('cpu'); }); - function returnArray3FromKernelVariables33Length(mode) { - const array = [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33]; + const array = [ + 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, + 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, + ]; const thirtyTwo = new Float32Array(array); const sixteen = new Uint16Array(array); const eight = new Uint8Array(array); const gpu = new GPU({ mode }); - const kernel = gpu.createKernel(function(v1, v2, v3) { - return [v1[this.thread.x], v2[this.thread.x], v3[this.thread.x]]; - }, { output: [33] }); + const kernel = gpu.createKernel( + function (v1, v2, v3) { + return [v1[this.thread.x], v2[this.thread.x], v3[this.thread.x]]; + }, + { output: [33] } + ); const result = kernel(thirtyTwo, sixteen, eight); - assert.deepEqual(result.map(v => Array.from(v)), array.map(v => [v,v,v])); + assert.deepEqual( + result.map(v => Array.from(v)), + array.map(v => [v, v, v]) + ); gpu.destroy(); } -(GPU.isSinglePrecisionSupported ? test : skip)('return Array(3) from kernel variables 33 in length auto', () => { - returnArray3FromKernelVariables33Length(); -}); +(GPU.isSinglePrecisionSupported ? test : skip)( + 'return Array(3) from kernel variables 33 in length auto', + () => { + returnArray3FromKernelVariables33Length(); + } +); -(GPU.isSinglePrecisionSupported && GPU.isGPUSupported ? test : skip)('return Array(3) from kernel variables 33 in length gpu', () => { - returnArray3FromKernelVariables33Length('gpu'); -}); +(GPU.isSinglePrecisionSupported && GPU.isGPUSupported ? test : skip)( + 'return Array(3) from kernel variables 33 in length gpu', + () => { + returnArray3FromKernelVariables33Length('gpu'); + } +); -(GPU.isSinglePrecisionSupported && GPU.isWebGLSupported ? test : skip)('return Array(3) from kernel variables 33 in length webgl', () => { - returnArray3FromKernelVariables33Length('webgl'); -}); +(GPU.isSinglePrecisionSupported && GPU.isWebGLSupported ? test : skip)( + 'return Array(3) from kernel variables 33 in length webgl', + () => { + returnArray3FromKernelVariables33Length('webgl'); + } +); -(GPU.isSinglePrecisionSupported && GPU.isWebGL2Supported ? test : skip)('return Array(3) from kernel variables 33 in length webgl2', () => { - returnArray3FromKernelVariables33Length('webgl2'); -}); +(GPU.isSinglePrecisionSupported && GPU.isWebGL2Supported ? test : skip)( + 'return Array(3) from kernel variables 33 in length webgl2', + () => { + returnArray3FromKernelVariables33Length('webgl2'); + } +); -(GPU.isSinglePrecisionSupported && GPU.isHeadlessGLSupported ? test : skip)('return Array(3) from kernel variables 33 in length headlessgl', () => { - returnArray3FromKernelVariables33Length('headlessgl'); -}); +(GPU.isSinglePrecisionSupported && GPU.isHeadlessGLSupported ? test : skip)( + 'return Array(3) from kernel variables 33 in length headlessgl', + () => { + returnArray3FromKernelVariables33Length('headlessgl'); + } +); test('return Array(3) from kernel variables 33 in length cpu', () => { returnArray3FromKernelVariables33Length('cpu'); }); - function returnArray4FromKernelVariables33Length(mode) { - const array = [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33]; + const array = [ + 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, + 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, + ]; const thirtyTwo = new Float32Array(array); const sixteen = new Uint16Array(array); const eight = new Uint8Array(array); const gpu = new GPU({ mode }); - const kernel = gpu.createKernel(function(v1, v2, v3, v4) { - return [v1[this.thread.x], v2[this.thread.x], v3[this.thread.x], v4[this.thread.x]]; - }, { output: [33] }); + const kernel = gpu.createKernel( + function (v1, v2, v3, v4) { + return [ + v1[this.thread.x], + v2[this.thread.x], + v3[this.thread.x], + v4[this.thread.x], + ]; + }, + { output: [33] } + ); const result = kernel(array, thirtyTwo, sixteen, eight); - assert.deepEqual(result.map(v => Array.from(v)), array.map(v => [v,v,v,v])); + assert.deepEqual( + result.map(v => Array.from(v)), + array.map(v => [v, v, v, v]) + ); gpu.destroy(); } -(GPU.isSinglePrecisionSupported ? test : skip)('return Array(4) from kernel variables 33 in length auto', () => { - returnArray4FromKernelVariables33Length(); -}); +(GPU.isSinglePrecisionSupported ? test : skip)( + 'return Array(4) from kernel variables 33 in length auto', + () => { + returnArray4FromKernelVariables33Length(); + } +); -(GPU.isSinglePrecisionSupported && GPU.isGPUSupported ? test : skip)('return Array(4) from kernel variables 33 in length gpu', () => { - returnArray4FromKernelVariables33Length('gpu'); -}); +(GPU.isSinglePrecisionSupported && GPU.isGPUSupported ? test : skip)( + 'return Array(4) from kernel variables 33 in length gpu', + () => { + returnArray4FromKernelVariables33Length('gpu'); + } +); -(GPU.isSinglePrecisionSupported && GPU.isWebGLSupported ? test : skip)('return Array(4) from kernel variables 33 in length webgl', () => { - returnArray4FromKernelVariables33Length('webgl'); -}); +(GPU.isSinglePrecisionSupported && GPU.isWebGLSupported ? test : skip)( + 'return Array(4) from kernel variables 33 in length webgl', + () => { + returnArray4FromKernelVariables33Length('webgl'); + } +); -(GPU.isSinglePrecisionSupported && GPU.isWebGL2Supported ? test : skip)('return Array(4) from kernel variables 33 in length webgl2', () => { - returnArray4FromKernelVariables33Length('webgl2'); -}); +(GPU.isSinglePrecisionSupported && GPU.isWebGL2Supported ? test : skip)( + 'return Array(4) from kernel variables 33 in length webgl2', + () => { + returnArray4FromKernelVariables33Length('webgl2'); + } +); -(GPU.isSinglePrecisionSupported && GPU.isHeadlessGLSupported ? test : skip)('return Array(4) from kernel variables 33 in length headlessgl', () => { - returnArray4FromKernelVariables33Length('headlessgl'); -}); +(GPU.isSinglePrecisionSupported && GPU.isHeadlessGLSupported ? test : skip)( + 'return Array(4) from kernel variables 33 in length headlessgl', + () => { + returnArray4FromKernelVariables33Length('headlessgl'); + } +); test('return Array(4) from kernel variables 33 in length cpu', () => { returnArray4FromKernelVariables33Length('cpu'); diff --git a/test/features/single-precision-textures.js b/test/features/single-precision-textures.js index 7e2624ce..af147d3b 100644 --- a/test/features/single-precision-textures.js +++ b/test/features/single-precision-textures.js @@ -1,200 +1,300 @@ const { assert, skip, test, only, module: describe } = require('qunit'); -const { GPU } = require('../../src'); +const { GPU } = require('../..'); describe('features: single precision textures'); function singlePrecisionTexturesWithArray(mode) { const original = [1, 2, 3, 4, 5, 6, 7, 8, 9]; const gpu = new GPU({ mode }); - const kernel = gpu.createKernel(function(packed) { - return packed[this.thread.x]; - }, { - output: [9], - precision: 'single' - }); + const kernel = gpu.createKernel( + function (packed) { + return packed[this.thread.x]; + }, + { + output: [9], + precision: 'single', + } + ); const result = kernel(original); assert.deepEqual(Array.from(result), original); gpu.destroy(); } -(GPU.isSinglePrecisionSupported && GPU.isKernelMapSupported ? test : skip)('with Array auto', () => { - singlePrecisionTexturesWithArray(); -}); +(GPU.isSinglePrecisionSupported && GPU.isKernelMapSupported ? test : skip)( + 'with Array auto', + () => { + singlePrecisionTexturesWithArray(); + } +); test('with Array cpu', () => { singlePrecisionTexturesWithArray('cpu'); }); -(GPU.isSinglePrecisionSupported && GPU.isKernelMapSupported ? test : skip)('with Array gpu', () => { - singlePrecisionTexturesWithArray('gpu'); -}); +(GPU.isSinglePrecisionSupported && GPU.isKernelMapSupported ? test : skip)( + 'with Array gpu', + () => { + singlePrecisionTexturesWithArray('gpu'); + } +); -(GPU.isSinglePrecisionSupported && GPU.isWebGLSupported && GPU.isKernelMapSupported ? test : skip)('with Array webgl', () => { +(GPU.isSinglePrecisionSupported && + GPU.isWebGLSupported && + GPU.isKernelMapSupported + ? test + : skip)('with Array webgl', () => { singlePrecisionTexturesWithArray('webgl'); }); -(GPU.isSinglePrecisionSupported && GPU.isWebGL2Supported ? test : skip)('with Array webgl2', () => { - singlePrecisionTexturesWithArray('webgl2'); -}); +(GPU.isSinglePrecisionSupported && GPU.isWebGL2Supported ? test : skip)( + 'with Array webgl2', + () => { + singlePrecisionTexturesWithArray('webgl2'); + } +); -(GPU.isSinglePrecisionSupported && GPU.isHeadlessGLSupported && GPU.isKernelMapSupported ? test : skip)('with Array headlessgl', () => { +(GPU.isSinglePrecisionSupported && + GPU.isHeadlessGLSupported && + GPU.isKernelMapSupported + ? test + : skip)('with Array headlessgl', () => { singlePrecisionTexturesWithArray('headlessgl'); }); function singlePrecisionTexturesWithFloat32Array(mode) { const original = new Float32Array([1, 2, 3, 4, 5, 6, 7, 8, 9]); const gpu = new GPU({ mode }); - const kernel = gpu.createKernel(function(packed) { - return packed[this.thread.x]; - }, { - output: [9], - precision: 'single' - }); + const kernel = gpu.createKernel( + function (packed) { + return packed[this.thread.x]; + }, + { + output: [9], + precision: 'single', + } + ); const result = kernel(original); assert.deepEqual(Array.from(result), Array.from(original)); gpu.destroy(); } -(GPU.isSinglePrecisionSupported && GPU.isKernelMapSupported ? test : skip)('with Float32Array auto', () => { - singlePrecisionTexturesWithFloat32Array(); -}); +(GPU.isSinglePrecisionSupported && GPU.isKernelMapSupported ? test : skip)( + 'with Float32Array auto', + () => { + singlePrecisionTexturesWithFloat32Array(); + } +); test('with Float32Array cpu', () => { singlePrecisionTexturesWithFloat32Array('cpu'); }); -(GPU.isSinglePrecisionSupported && GPU.isKernelMapSupported ? test : skip)('with Float32Array gpu', () => { - singlePrecisionTexturesWithFloat32Array('gpu'); -}); +(GPU.isSinglePrecisionSupported && GPU.isKernelMapSupported ? test : skip)( + 'with Float32Array gpu', + () => { + singlePrecisionTexturesWithFloat32Array('gpu'); + } +); -(GPU.isSinglePrecisionSupported && GPU.isWebGLSupported && GPU.isKernelMapSupported ? test : skip)('with Float32Array webgl', () => { +(GPU.isSinglePrecisionSupported && + GPU.isWebGLSupported && + GPU.isKernelMapSupported + ? test + : skip)('with Float32Array webgl', () => { singlePrecisionTexturesWithFloat32Array('webgl'); }); -(GPU.isSinglePrecisionSupported && GPU.isWebGL2Supported ? test : skip)('with Float32Array webgl2', () => { - singlePrecisionTexturesWithFloat32Array('webgl2'); -}); +(GPU.isSinglePrecisionSupported && GPU.isWebGL2Supported ? test : skip)( + 'with Float32Array webgl2', + () => { + singlePrecisionTexturesWithFloat32Array('webgl2'); + } +); -(GPU.isSinglePrecisionSupported && GPU.isHeadlessGLSupported && GPU.isKernelMapSupported ? test : skip)('with Float32Array headlessgl', () => { +(GPU.isSinglePrecisionSupported && + GPU.isHeadlessGLSupported && + GPU.isKernelMapSupported + ? test + : skip)('with Float32Array headlessgl', () => { singlePrecisionTexturesWithFloat32Array('headlessgl'); }); function singlePrecisionTexturesWithUint16Array(mode) { const original = new Uint16Array([1, 2, 3, 4, 5, 6, 7, 8, 9]); const gpu = new GPU({ mode }); - const kernel = gpu.createKernel(function(packed) { - return packed[this.thread.x]; - }, { - output: [9], - precision: 'single', - }); + const kernel = gpu.createKernel( + function (packed) { + return packed[this.thread.x]; + }, + { + output: [9], + precision: 'single', + } + ); const result = kernel(original); assert.deepEqual(Array.from(result), Array.from(original)); gpu.destroy(); } -(GPU.isSinglePrecisionSupported && GPU.isKernelMapSupported ? test : skip)('with Uint16Array auto', () => { - singlePrecisionTexturesWithUint16Array(); -}); +(GPU.isSinglePrecisionSupported && GPU.isKernelMapSupported ? test : skip)( + 'with Uint16Array auto', + () => { + singlePrecisionTexturesWithUint16Array(); + } +); test('with Uint16Array cpu', () => { singlePrecisionTexturesWithUint16Array('cpu'); }); -(GPU.isSinglePrecisionSupported && GPU.isKernelMapSupported ? test : skip)('with Uint16Array gpu', () => { - singlePrecisionTexturesWithUint16Array('gpu'); -}); +(GPU.isSinglePrecisionSupported && GPU.isKernelMapSupported ? test : skip)( + 'with Uint16Array gpu', + () => { + singlePrecisionTexturesWithUint16Array('gpu'); + } +); -(GPU.isSinglePrecisionSupported && GPU.isWebGLSupported && GPU.isKernelMapSupported ? test : skip)('with Uint16Array webgl', () => { +(GPU.isSinglePrecisionSupported && + GPU.isWebGLSupported && + GPU.isKernelMapSupported + ? test + : skip)('with Uint16Array webgl', () => { singlePrecisionTexturesWithUint16Array('webgl'); }); -(GPU.isSinglePrecisionSupported && GPU.isWebGL2Supported ? test : skip)('with Uint16Array webgl2', () => { - singlePrecisionTexturesWithUint16Array('webgl2'); -}); +(GPU.isSinglePrecisionSupported && GPU.isWebGL2Supported ? test : skip)( + 'with Uint16Array webgl2', + () => { + singlePrecisionTexturesWithUint16Array('webgl2'); + } +); -(GPU.isSinglePrecisionSupported && GPU.isHeadlessGLSupported && GPU.isKernelMapSupported ? test : skip)('with Uint16Array headlessgl', () => { +(GPU.isSinglePrecisionSupported && + GPU.isHeadlessGLSupported && + GPU.isKernelMapSupported + ? test + : skip)('with Uint16Array headlessgl', () => { singlePrecisionTexturesWithUint16Array('headlessgl'); }); function singlePrecisionTexturesWithUint8Array(mode) { const original = new Uint8Array([1, 2, 3, 4, 5, 6, 7, 8, 9]); const gpu = new GPU({ mode }); - const kernel = gpu.createKernel(function(packed) { - return packed[this.thread.x]; - }, { - output: [9], - precision: 'single' - }); + const kernel = gpu.createKernel( + function (packed) { + return packed[this.thread.x]; + }, + { + output: [9], + precision: 'single', + } + ); const result = kernel(original); assert.deepEqual(Array.from(result), Array.from(original)); gpu.destroy(); } -(GPU.isSinglePrecisionSupported && GPU.isKernelMapSupported ? test : skip)('with Uint8Array auto', () => { - singlePrecisionTexturesWithUint8Array(); -}); +(GPU.isSinglePrecisionSupported && GPU.isKernelMapSupported ? test : skip)( + 'with Uint8Array auto', + () => { + singlePrecisionTexturesWithUint8Array(); + } +); test('with Uint8Array cpu', () => { singlePrecisionTexturesWithUint8Array('cpu'); }); -(GPU.isSinglePrecisionSupported && GPU.isKernelMapSupported ? test : skip)('with Uint8Array gpu', () => { - singlePrecisionTexturesWithUint8Array('gpu'); -}); +(GPU.isSinglePrecisionSupported && GPU.isKernelMapSupported ? test : skip)( + 'with Uint8Array gpu', + () => { + singlePrecisionTexturesWithUint8Array('gpu'); + } +); -(GPU.isSinglePrecisionSupported && GPU.isWebGLSupported && GPU.isKernelMapSupported ? test : skip)('with Uint8Array webgl', () => { +(GPU.isSinglePrecisionSupported && + GPU.isWebGLSupported && + GPU.isKernelMapSupported + ? test + : skip)('with Uint8Array webgl', () => { singlePrecisionTexturesWithUint8Array('webgl'); }); -(GPU.isSinglePrecisionSupported && GPU.isWebGL2Supported ? test : skip)('with Uint8Array webgl2', () => { - singlePrecisionTexturesWithUint8Array('webgl2'); -}); +(GPU.isSinglePrecisionSupported && GPU.isWebGL2Supported ? test : skip)( + 'with Uint8Array webgl2', + () => { + singlePrecisionTexturesWithUint8Array('webgl2'); + } +); -(GPU.isSinglePrecisionSupported && GPU.isHeadlessGLSupported && GPU.isKernelMapSupported ? test : skip)('with Uint8Array headlessgl', () => { +(GPU.isSinglePrecisionSupported && + GPU.isHeadlessGLSupported && + GPU.isKernelMapSupported + ? test + : skip)('with Uint8Array headlessgl', () => { singlePrecisionTexturesWithUint8Array('headlessgl'); }); function singlePrecisionTexturesWithUint8ClampedArray(mode) { const original = new Uint8ClampedArray([1, 2, 3, 4, 5, 6, 7, 8, 9]); const gpu = new GPU({ mode }); - const kernel = gpu.createKernel(function(packed) { - return packed[this.thread.x]; - }, { - output: [9], - precision: 'single' - }); + const kernel = gpu.createKernel( + function (packed) { + return packed[this.thread.x]; + }, + { + output: [9], + precision: 'single', + } + ); const result = kernel(original); assert.deepEqual(Array.from(result), Array.from(original)); gpu.destroy(); } -(GPU.isSinglePrecisionSupported && GPU.isKernelMapSupported ? test : skip)('with Uint8ClampedArray auto', () => { - singlePrecisionTexturesWithUint8ClampedArray(); -}); +(GPU.isSinglePrecisionSupported && GPU.isKernelMapSupported ? test : skip)( + 'with Uint8ClampedArray auto', + () => { + singlePrecisionTexturesWithUint8ClampedArray(); + } +); test('with Uint8ClampedArray cpu', () => { singlePrecisionTexturesWithUint8ClampedArray('cpu'); }); -(GPU.isSinglePrecisionSupported && GPU.isKernelMapSupported ? test : skip)('with Uint8ClampedArray gpu', () => { - singlePrecisionTexturesWithUint8ClampedArray('gpu'); -}); +(GPU.isSinglePrecisionSupported && GPU.isKernelMapSupported ? test : skip)( + 'with Uint8ClampedArray gpu', + () => { + singlePrecisionTexturesWithUint8ClampedArray('gpu'); + } +); -(GPU.isSinglePrecisionSupported && GPU.isWebGLSupported && GPU.isKernelMapSupported ? test : skip)('with Uint8ClampedArray webgl', () => { +(GPU.isSinglePrecisionSupported && + GPU.isWebGLSupported && + GPU.isKernelMapSupported + ? test + : skip)('with Uint8ClampedArray webgl', () => { singlePrecisionTexturesWithUint8ClampedArray('webgl'); }); -(GPU.isSinglePrecisionSupported && GPU.isWebGL2Supported ? test : skip)('with Uint8ClampedArray webgl2', () => { - singlePrecisionTexturesWithUint8ClampedArray('webgl2'); -}); +(GPU.isSinglePrecisionSupported && GPU.isWebGL2Supported ? test : skip)( + 'with Uint8ClampedArray webgl2', + () => { + singlePrecisionTexturesWithUint8ClampedArray('webgl2'); + } +); -(GPU.isSinglePrecisionSupported && GPU.isHeadlessGLSupported && GPU.isKernelMapSupported ? test : skip)('with Uint8ClampedArray headlessgl', () => { +(GPU.isSinglePrecisionSupported && + GPU.isHeadlessGLSupported && + GPU.isKernelMapSupported + ? test + : skip)('with Uint8ClampedArray headlessgl', () => { singlePrecisionTexturesWithUint8ClampedArray('headlessgl'); }); @@ -204,39 +304,62 @@ function singlePrecisionTexturesWithArray2D(mode) { [10, 11, 12, 13, 14, 15, 16, 18, 19], ]; const gpu = new GPU({ mode }); - const kernel = gpu.createKernel(function(packed) { - return packed[this.thread.y][this.thread.x]; - }, { - output: [9, 2], - precision: 'single' - }); + const kernel = gpu.createKernel( + function (packed) { + return packed[this.thread.y][this.thread.x]; + }, + { + output: [9, 2], + precision: 'single', + } + ); const result = kernel(original); - assert.deepEqual(result.map(array => Array.from(array)), original.map(array => Array.from(array))); + assert.deepEqual( + result.map(array => Array.from(array)), + original.map(array => Array.from(array)) + ); gpu.destroy(); } -(GPU.isSinglePrecisionSupported && GPU.isKernelMapSupported ? test : skip)('with Array2D auto', () => { - singlePrecisionTexturesWithArray2D(); -}); +(GPU.isSinglePrecisionSupported && GPU.isKernelMapSupported ? test : skip)( + 'with Array2D auto', + () => { + singlePrecisionTexturesWithArray2D(); + } +); test('with Array2D cpu', () => { singlePrecisionTexturesWithArray2D('cpu'); }); -(GPU.isSinglePrecisionSupported && GPU.isKernelMapSupported ? test : skip)('with Array2D gpu', () => { - singlePrecisionTexturesWithArray2D('gpu'); -}); +(GPU.isSinglePrecisionSupported && GPU.isKernelMapSupported ? test : skip)( + 'with Array2D gpu', + () => { + singlePrecisionTexturesWithArray2D('gpu'); + } +); -(GPU.isSinglePrecisionSupported && GPU.isWebGLSupported && GPU.isKernelMapSupported ? test : skip)('with Array2D webgl', () => { +(GPU.isSinglePrecisionSupported && + GPU.isWebGLSupported && + GPU.isKernelMapSupported + ? test + : skip)('with Array2D webgl', () => { singlePrecisionTexturesWithArray2D('webgl'); }); -(GPU.isSinglePrecisionSupported && GPU.isWebGL2Supported ? test : skip)('with Array2D webgl2', () => { - singlePrecisionTexturesWithArray2D('webgl2'); -}); +(GPU.isSinglePrecisionSupported && GPU.isWebGL2Supported ? test : skip)( + 'with Array2D webgl2', + () => { + singlePrecisionTexturesWithArray2D('webgl2'); + } +); -(GPU.isSinglePrecisionSupported && GPU.isHeadlessGLSupported && GPU.isKernelMapSupported ? test : skip)('with Array2D headlessgl', () => { +(GPU.isSinglePrecisionSupported && + GPU.isHeadlessGLSupported && + GPU.isKernelMapSupported + ? test + : skip)('with Array2D headlessgl', () => { singlePrecisionTexturesWithArray2D('headlessgl'); }); @@ -246,39 +369,62 @@ function singlePrecisionTexturesWithFloat32Array2D(mode) { new Float32Array([10, 11, 12, 13, 14, 15, 16, 18, 19]), ]; const gpu = new GPU({ mode }); - const kernel = gpu.createKernel(function(packed) { - return packed[this.thread.y][this.thread.x]; - }, { - output: [9, 2], - precision: 'single' - }); + const kernel = gpu.createKernel( + function (packed) { + return packed[this.thread.y][this.thread.x]; + }, + { + output: [9, 2], + precision: 'single', + } + ); const result = kernel(original); - assert.deepEqual(result.map(array => Array.from(array)), original.map(array => Array.from(array))); + assert.deepEqual( + result.map(array => Array.from(array)), + original.map(array => Array.from(array)) + ); gpu.destroy(); } -(GPU.isSinglePrecisionSupported && GPU.isKernelMapSupported ? test : skip)('with Float32Array2D auto', () => { - singlePrecisionTexturesWithFloat32Array2D(); -}); +(GPU.isSinglePrecisionSupported && GPU.isKernelMapSupported ? test : skip)( + 'with Float32Array2D auto', + () => { + singlePrecisionTexturesWithFloat32Array2D(); + } +); test('with Float32Array2D cpu', () => { singlePrecisionTexturesWithFloat32Array2D('cpu'); }); -(GPU.isSinglePrecisionSupported && GPU.isKernelMapSupported ? test : skip)('with Float32Array2D gpu', () => { - singlePrecisionTexturesWithFloat32Array2D('gpu'); -}); +(GPU.isSinglePrecisionSupported && GPU.isKernelMapSupported ? test : skip)( + 'with Float32Array2D gpu', + () => { + singlePrecisionTexturesWithFloat32Array2D('gpu'); + } +); -(GPU.isSinglePrecisionSupported && GPU.isWebGLSupported && GPU.isKernelMapSupported ? test : skip)('with Float32Array2D webgl', () => { +(GPU.isSinglePrecisionSupported && + GPU.isWebGLSupported && + GPU.isKernelMapSupported + ? test + : skip)('with Float32Array2D webgl', () => { singlePrecisionTexturesWithFloat32Array2D('webgl'); }); -(GPU.isSinglePrecisionSupported && GPU.isWebGL2Supported ? test : skip)('with Float32Array2D webgl2', () => { - singlePrecisionTexturesWithFloat32Array2D('webgl2'); -}); +(GPU.isSinglePrecisionSupported && GPU.isWebGL2Supported ? test : skip)( + 'with Float32Array2D webgl2', + () => { + singlePrecisionTexturesWithFloat32Array2D('webgl2'); + } +); -(GPU.isSinglePrecisionSupported && GPU.isHeadlessGLSupported && GPU.isKernelMapSupported ? test : skip)('with Float32Array2D headlessgl', () => { +(GPU.isSinglePrecisionSupported && + GPU.isHeadlessGLSupported && + GPU.isKernelMapSupported + ? test + : skip)('with Float32Array2D headlessgl', () => { singlePrecisionTexturesWithFloat32Array2D('headlessgl'); }); @@ -288,39 +434,62 @@ function singlePrecisionTexturesWithUint16Array2D(mode) { new Uint16Array([10, 11, 12, 13, 14, 15, 16, 18, 19]), ]; const gpu = new GPU({ mode }); - const kernel = gpu.createKernel(function(packed) { - return packed[this.thread.y][this.thread.x]; - }, { - output: [9, 2], - precision: 'single' - }); + const kernel = gpu.createKernel( + function (packed) { + return packed[this.thread.y][this.thread.x]; + }, + { + output: [9, 2], + precision: 'single', + } + ); const result = kernel(original); - assert.deepEqual(result.map(array => Array.from(array)), original.map(array => Array.from(array))); + assert.deepEqual( + result.map(array => Array.from(array)), + original.map(array => Array.from(array)) + ); gpu.destroy(); } -(GPU.isSinglePrecisionSupported && GPU.isKernelMapSupported ? test : skip)('with Uint16Array2D auto', () => { - singlePrecisionTexturesWithUint16Array2D(); -}); +(GPU.isSinglePrecisionSupported && GPU.isKernelMapSupported ? test : skip)( + 'with Uint16Array2D auto', + () => { + singlePrecisionTexturesWithUint16Array2D(); + } +); test('with Uint16Array2D cpu', () => { singlePrecisionTexturesWithUint16Array2D('cpu'); }); -(GPU.isSinglePrecisionSupported && GPU.isKernelMapSupported ? test : skip)('with Uint16Array2D gpu', () => { - singlePrecisionTexturesWithUint16Array2D('gpu'); -}); +(GPU.isSinglePrecisionSupported && GPU.isKernelMapSupported ? test : skip)( + 'with Uint16Array2D gpu', + () => { + singlePrecisionTexturesWithUint16Array2D('gpu'); + } +); -(GPU.isSinglePrecisionSupported && GPU.isWebGLSupported && GPU.isKernelMapSupported ? test : skip)('with Uint16Array2D webgl', () => { +(GPU.isSinglePrecisionSupported && + GPU.isWebGLSupported && + GPU.isKernelMapSupported + ? test + : skip)('with Uint16Array2D webgl', () => { singlePrecisionTexturesWithUint16Array2D('webgl'); }); -(GPU.isSinglePrecisionSupported && GPU.isWebGL2Supported ? test : skip)('with Uint16Array2D webgl2', () => { - singlePrecisionTexturesWithUint16Array2D('webgl2'); -}); +(GPU.isSinglePrecisionSupported && GPU.isWebGL2Supported ? test : skip)( + 'with Uint16Array2D webgl2', + () => { + singlePrecisionTexturesWithUint16Array2D('webgl2'); + } +); -(GPU.isSinglePrecisionSupported && GPU.isHeadlessGLSupported && GPU.isKernelMapSupported ? test : skip)('with Uint16Array2D headlessgl', () => { +(GPU.isSinglePrecisionSupported && + GPU.isHeadlessGLSupported && + GPU.isKernelMapSupported + ? test + : skip)('with Uint16Array2D headlessgl', () => { singlePrecisionTexturesWithUint16Array2D('headlessgl'); }); @@ -330,39 +499,62 @@ function singlePrecisionTexturesWithUint8Array2D(mode) { new Uint8Array([10, 11, 12, 13, 14, 15, 16, 18, 19]), ]; const gpu = new GPU({ mode }); - const kernel = gpu.createKernel(function(packed) { - return packed[this.thread.y][this.thread.x]; - }, { - output: [9, 2], - precision: 'single' - }); + const kernel = gpu.createKernel( + function (packed) { + return packed[this.thread.y][this.thread.x]; + }, + { + output: [9, 2], + precision: 'single', + } + ); const result = kernel(original); - assert.deepEqual(result.map(array => Array.from(array)), original.map(array => Array.from(array))); + assert.deepEqual( + result.map(array => Array.from(array)), + original.map(array => Array.from(array)) + ); gpu.destroy(); } -(GPU.isSinglePrecisionSupported && GPU.isKernelMapSupported ? test : skip)('with Uint8Array2D auto', () => { - singlePrecisionTexturesWithUint8Array2D(); -}); +(GPU.isSinglePrecisionSupported && GPU.isKernelMapSupported ? test : skip)( + 'with Uint8Array2D auto', + () => { + singlePrecisionTexturesWithUint8Array2D(); + } +); test('with Uint8Array2D cpu', () => { singlePrecisionTexturesWithUint8Array2D('cpu'); }); -(GPU.isSinglePrecisionSupported && GPU.isKernelMapSupported ? test : skip)('with Uint8Array2D gpu', () => { - singlePrecisionTexturesWithUint8Array2D('gpu'); -}); +(GPU.isSinglePrecisionSupported && GPU.isKernelMapSupported ? test : skip)( + 'with Uint8Array2D gpu', + () => { + singlePrecisionTexturesWithUint8Array2D('gpu'); + } +); -(GPU.isSinglePrecisionSupported && GPU.isWebGLSupported && GPU.isKernelMapSupported ? test : skip)('with Uint8Array2D webgl', () => { +(GPU.isSinglePrecisionSupported && + GPU.isWebGLSupported && + GPU.isKernelMapSupported + ? test + : skip)('with Uint8Array2D webgl', () => { singlePrecisionTexturesWithUint8Array2D('webgl'); }); -(GPU.isSinglePrecisionSupported && GPU.isWebGL2Supported ? test : skip)('with Uint8Array2D webgl2', () => { - singlePrecisionTexturesWithUint8Array2D('webgl2'); -}); +(GPU.isSinglePrecisionSupported && GPU.isWebGL2Supported ? test : skip)( + 'with Uint8Array2D webgl2', + () => { + singlePrecisionTexturesWithUint8Array2D('webgl2'); + } +); -(GPU.isSinglePrecisionSupported && GPU.isHeadlessGLSupported && GPU.isKernelMapSupported ? test : skip)('with Uint8Array2D headlessgl', () => { +(GPU.isSinglePrecisionSupported && + GPU.isHeadlessGLSupported && + GPU.isKernelMapSupported + ? test + : skip)('with Uint8Array2D headlessgl', () => { singlePrecisionTexturesWithUint8Array2D('headlessgl'); }); @@ -372,39 +564,62 @@ function singlePrecisionTexturesWithUint8ClampedArray2D(mode) { new Uint8ClampedArray([10, 11, 12, 13, 14, 15, 16, 18, 19]), ]; const gpu = new GPU({ mode }); - const kernel = gpu.createKernel(function(packed) { - return packed[this.thread.y][this.thread.x]; - }, { - output: [9, 2], - precision: 'single' - }); + const kernel = gpu.createKernel( + function (packed) { + return packed[this.thread.y][this.thread.x]; + }, + { + output: [9, 2], + precision: 'single', + } + ); const result = kernel(original); - assert.deepEqual(result.map(array => Array.from(array)), original.map(array => Array.from(array))); + assert.deepEqual( + result.map(array => Array.from(array)), + original.map(array => Array.from(array)) + ); gpu.destroy(); } -(GPU.isSinglePrecisionSupported && GPU.isKernelMapSupported ? test : skip)('with Uint8ClampedArray2D auto', () => { - singlePrecisionTexturesWithUint8ClampedArray2D(); -}); +(GPU.isSinglePrecisionSupported && GPU.isKernelMapSupported ? test : skip)( + 'with Uint8ClampedArray2D auto', + () => { + singlePrecisionTexturesWithUint8ClampedArray2D(); + } +); test('with Uint8ClampedArray2D cpu', () => { singlePrecisionTexturesWithUint8ClampedArray2D('cpu'); }); -(GPU.isSinglePrecisionSupported && GPU.isKernelMapSupported ? test : skip)('with Uint8ClampedArray2D gpu', () => { - singlePrecisionTexturesWithUint8ClampedArray2D('gpu'); -}); +(GPU.isSinglePrecisionSupported && GPU.isKernelMapSupported ? test : skip)( + 'with Uint8ClampedArray2D gpu', + () => { + singlePrecisionTexturesWithUint8ClampedArray2D('gpu'); + } +); -(GPU.isSinglePrecisionSupported && GPU.isWebGLSupported && GPU.isKernelMapSupported ? test : skip)('with Uint8ClampedArray2D webgl', () => { +(GPU.isSinglePrecisionSupported && + GPU.isWebGLSupported && + GPU.isKernelMapSupported + ? test + : skip)('with Uint8ClampedArray2D webgl', () => { singlePrecisionTexturesWithUint8ClampedArray2D('webgl'); }); -(GPU.isSinglePrecisionSupported && GPU.isWebGL2Supported ? test : skip)('with Uint8ClampedArray2D webgl2', () => { - singlePrecisionTexturesWithUint8ClampedArray2D('webgl2'); -}); +(GPU.isSinglePrecisionSupported && GPU.isWebGL2Supported ? test : skip)( + 'with Uint8ClampedArray2D webgl2', + () => { + singlePrecisionTexturesWithUint8ClampedArray2D('webgl2'); + } +); -(GPU.isSinglePrecisionSupported && GPU.isHeadlessGLSupported && GPU.isKernelMapSupported ? test : skip)('with Uint8ClampedArray2D headlessgl', () => { +(GPU.isSinglePrecisionSupported && + GPU.isHeadlessGLSupported && + GPU.isKernelMapSupported + ? test + : skip)('with Uint8ClampedArray2D headlessgl', () => { singlePrecisionTexturesWithUint8ClampedArray2D('headlessgl'); }); @@ -417,42 +632,65 @@ function singlePrecisionTexturesWithArray3D(mode) { [ [20, 21, 22, 23, 24, 25, 26, 27, 28], [29, 30, 31, 32, 33, 34, 35, 36, 37], - ] + ], ]; const gpu = new GPU({ mode }); - const kernel = gpu.createKernel(function(packed) { - return packed[this.thread.z][this.thread.y][this.thread.x]; - }, { - output: [9, 2, 2], - precision: 'single' - }); + const kernel = gpu.createKernel( + function (packed) { + return packed[this.thread.z][this.thread.y][this.thread.x]; + }, + { + output: [9, 2, 2], + precision: 'single', + } + ); const result = kernel(original); - assert.deepEqual(result.map(matrix => matrix.map(array => Array.from(array))), original); + assert.deepEqual( + result.map(matrix => matrix.map(array => Array.from(array))), + original + ); gpu.destroy(); } -(GPU.isSinglePrecisionSupported && GPU.isKernelMapSupported ? test : skip)('with Array3D auto', () => { - singlePrecisionTexturesWithArray3D(); -}); +(GPU.isSinglePrecisionSupported && GPU.isKernelMapSupported ? test : skip)( + 'with Array3D auto', + () => { + singlePrecisionTexturesWithArray3D(); + } +); test('with Array3D cpu', () => { singlePrecisionTexturesWithArray3D('cpu'); }); -(GPU.isSinglePrecisionSupported && GPU.isKernelMapSupported ? test : skip)('with Array3D gpu', () => { - singlePrecisionTexturesWithArray3D('gpu'); -}); +(GPU.isSinglePrecisionSupported && GPU.isKernelMapSupported ? test : skip)( + 'with Array3D gpu', + () => { + singlePrecisionTexturesWithArray3D('gpu'); + } +); -(GPU.isSinglePrecisionSupported && GPU.isWebGLSupported && GPU.isKernelMapSupported ? test : skip)('with Array3D webgl', () => { +(GPU.isSinglePrecisionSupported && + GPU.isWebGLSupported && + GPU.isKernelMapSupported + ? test + : skip)('with Array3D webgl', () => { singlePrecisionTexturesWithArray3D('webgl'); }); -(GPU.isSinglePrecisionSupported && GPU.isWebGL2Supported ? test : skip)('with Array3D webgl2', () => { - singlePrecisionTexturesWithArray3D('webgl2'); -}); +(GPU.isSinglePrecisionSupported && GPU.isWebGL2Supported ? test : skip)( + 'with Array3D webgl2', + () => { + singlePrecisionTexturesWithArray3D('webgl2'); + } +); -(GPU.isSinglePrecisionSupported && GPU.isHeadlessGLSupported && GPU.isKernelMapSupported ? test : skip)('with Array3D headlessgl', () => { +(GPU.isSinglePrecisionSupported && + GPU.isHeadlessGLSupported && + GPU.isKernelMapSupported + ? test + : skip)('with Array3D headlessgl', () => { singlePrecisionTexturesWithArray3D('headlessgl'); }); @@ -465,42 +703,65 @@ function singlePrecisionTexturesWithFloat32Array3D(mode) { [ new Float32Array([20, 21, 22, 23, 24, 25, 26, 27, 28]), new Float32Array([29, 30, 31, 32, 33, 34, 35, 36, 37]), - ] + ], ]; const gpu = new GPU({ mode }); - const kernel = gpu.createKernel(function(packed) { - return packed[this.thread.z][this.thread.y][this.thread.x]; - }, { - output: [9, 2, 2], - precision: 'single' - }); + const kernel = gpu.createKernel( + function (packed) { + return packed[this.thread.z][this.thread.y][this.thread.x]; + }, + { + output: [9, 2, 2], + precision: 'single', + } + ); const result = kernel(original); - assert.deepEqual(result.map(matrix => matrix.map(array => Array.from(array))), original.map(matrix => matrix.map(array => Array.from(array)))); + assert.deepEqual( + result.map(matrix => matrix.map(array => Array.from(array))), + original.map(matrix => matrix.map(array => Array.from(array))) + ); gpu.destroy(); } -(GPU.isSinglePrecisionSupported && GPU.isKernelMapSupported ? test : skip)('with Float32Array3D auto', () => { - singlePrecisionTexturesWithFloat32Array3D(); -}); +(GPU.isSinglePrecisionSupported && GPU.isKernelMapSupported ? test : skip)( + 'with Float32Array3D auto', + () => { + singlePrecisionTexturesWithFloat32Array3D(); + } +); test('with Float32Array3D cpu', () => { singlePrecisionTexturesWithFloat32Array3D('cpu'); }); -(GPU.isSinglePrecisionSupported && GPU.isKernelMapSupported ? test : skip)('with Float32Array3D gpu', () => { - singlePrecisionTexturesWithFloat32Array3D('gpu'); -}); +(GPU.isSinglePrecisionSupported && GPU.isKernelMapSupported ? test : skip)( + 'with Float32Array3D gpu', + () => { + singlePrecisionTexturesWithFloat32Array3D('gpu'); + } +); -(GPU.isSinglePrecisionSupported && GPU.isWebGLSupported && GPU.isKernelMapSupported ? test : skip)('with Float32Array3D webgl', () => { +(GPU.isSinglePrecisionSupported && + GPU.isWebGLSupported && + GPU.isKernelMapSupported + ? test + : skip)('with Float32Array3D webgl', () => { singlePrecisionTexturesWithFloat32Array3D('webgl'); }); -(GPU.isSinglePrecisionSupported && GPU.isWebGL2Supported ? test : skip)('with Float32Array3D webgl2', () => { - singlePrecisionTexturesWithFloat32Array3D('webgl2'); -}); +(GPU.isSinglePrecisionSupported && GPU.isWebGL2Supported ? test : skip)( + 'with Float32Array3D webgl2', + () => { + singlePrecisionTexturesWithFloat32Array3D('webgl2'); + } +); -(GPU.isSinglePrecisionSupported && GPU.isHeadlessGLSupported && GPU.isKernelMapSupported ? test : skip)('with Float32Array3D headlessgl', () => { +(GPU.isSinglePrecisionSupported && + GPU.isHeadlessGLSupported && + GPU.isKernelMapSupported + ? test + : skip)('with Float32Array3D headlessgl', () => { singlePrecisionTexturesWithFloat32Array3D('headlessgl'); }); @@ -513,42 +774,65 @@ function singlePrecisionTexturesWithUint16Array3D(mode) { [ new Uint16Array([20, 21, 22, 23, 24, 25, 26, 27, 28]), new Uint16Array([29, 30, 31, 32, 33, 34, 35, 36, 37]), - ] + ], ]; const gpu = new GPU({ mode }); - const kernel = gpu.createKernel(function(packed) { - return packed[this.thread.z][this.thread.y][this.thread.x]; - }, { - output: [9, 2, 2], - precision: 'single' - }); + const kernel = gpu.createKernel( + function (packed) { + return packed[this.thread.z][this.thread.y][this.thread.x]; + }, + { + output: [9, 2, 2], + precision: 'single', + } + ); const result = kernel(original); - assert.deepEqual(result.map(matrix => matrix.map(array => Array.from(array))), original.map(matrix => matrix.map(array => Array.from(array)))); + assert.deepEqual( + result.map(matrix => matrix.map(array => Array.from(array))), + original.map(matrix => matrix.map(array => Array.from(array))) + ); gpu.destroy(); } -(GPU.isSinglePrecisionSupported && GPU.isKernelMapSupported ? test : skip)('with Uint16Array3D auto', () => { - singlePrecisionTexturesWithUint16Array3D(); -}); +(GPU.isSinglePrecisionSupported && GPU.isKernelMapSupported ? test : skip)( + 'with Uint16Array3D auto', + () => { + singlePrecisionTexturesWithUint16Array3D(); + } +); test('with Uint16Array3D cpu', () => { singlePrecisionTexturesWithUint16Array3D('cpu'); }); -(GPU.isSinglePrecisionSupported && GPU.isKernelMapSupported ? test : skip)('with Uint16Array3D gpu', () => { - singlePrecisionTexturesWithUint16Array3D('gpu'); -}); +(GPU.isSinglePrecisionSupported && GPU.isKernelMapSupported ? test : skip)( + 'with Uint16Array3D gpu', + () => { + singlePrecisionTexturesWithUint16Array3D('gpu'); + } +); -(GPU.isSinglePrecisionSupported && GPU.isWebGLSupported && GPU.isKernelMapSupported ? test : skip)('with Uint16Array3D webgl', () => { +(GPU.isSinglePrecisionSupported && + GPU.isWebGLSupported && + GPU.isKernelMapSupported + ? test + : skip)('with Uint16Array3D webgl', () => { singlePrecisionTexturesWithUint16Array3D('webgl'); }); -(GPU.isSinglePrecisionSupported && GPU.isWebGL2Supported ? test : skip)('with Uint16Array3D webgl2', () => { - singlePrecisionTexturesWithUint16Array3D('webgl2'); -}); +(GPU.isSinglePrecisionSupported && GPU.isWebGL2Supported ? test : skip)( + 'with Uint16Array3D webgl2', + () => { + singlePrecisionTexturesWithUint16Array3D('webgl2'); + } +); -(GPU.isSinglePrecisionSupported && GPU.isHeadlessGLSupported && GPU.isKernelMapSupported ? test : skip)('with Uint16Array3D headlessgl', () => { +(GPU.isSinglePrecisionSupported && + GPU.isHeadlessGLSupported && + GPU.isKernelMapSupported + ? test + : skip)('with Uint16Array3D headlessgl', () => { singlePrecisionTexturesWithUint16Array3D('headlessgl'); }); @@ -561,42 +845,65 @@ function singlePrecisionTexturesWithUint8Array3D(mode) { [ new Uint8Array([20, 21, 22, 23, 24, 25, 26, 27, 28]), new Uint8Array([29, 30, 31, 32, 33, 34, 35, 36, 37]), - ] + ], ]; const gpu = new GPU({ mode }); - const kernel = gpu.createKernel(function(packed) { - return packed[this.thread.z][this.thread.y][this.thread.x]; - }, { - output: [9, 2, 2], - precision: 'single' - }); + const kernel = gpu.createKernel( + function (packed) { + return packed[this.thread.z][this.thread.y][this.thread.x]; + }, + { + output: [9, 2, 2], + precision: 'single', + } + ); const result = kernel(original); - assert.deepEqual(result.map(matrix => matrix.map(array => Array.from(array))), original.map(matrix => matrix.map(array => Array.from(array)))); + assert.deepEqual( + result.map(matrix => matrix.map(array => Array.from(array))), + original.map(matrix => matrix.map(array => Array.from(array))) + ); gpu.destroy(); } -(GPU.isSinglePrecisionSupported && GPU.isKernelMapSupported ? test : skip)('with Uint8Array3D auto', () => { - singlePrecisionTexturesWithUint8Array3D(); -}); +(GPU.isSinglePrecisionSupported && GPU.isKernelMapSupported ? test : skip)( + 'with Uint8Array3D auto', + () => { + singlePrecisionTexturesWithUint8Array3D(); + } +); test('with Uint8Array3D cpu', () => { singlePrecisionTexturesWithUint8Array3D('cpu'); }); -(GPU.isSinglePrecisionSupported && GPU.isKernelMapSupported ? test : skip)('with Uint8Array3D gpu', () => { - singlePrecisionTexturesWithUint8Array3D('gpu'); -}); +(GPU.isSinglePrecisionSupported && GPU.isKernelMapSupported ? test : skip)( + 'with Uint8Array3D gpu', + () => { + singlePrecisionTexturesWithUint8Array3D('gpu'); + } +); -(GPU.isSinglePrecisionSupported && GPU.isWebGLSupported && GPU.isKernelMapSupported ? test : skip)('with Uint8Array3D webgl', () => { +(GPU.isSinglePrecisionSupported && + GPU.isWebGLSupported && + GPU.isKernelMapSupported + ? test + : skip)('with Uint8Array3D webgl', () => { singlePrecisionTexturesWithUint8Array3D('webgl'); }); -(GPU.isSinglePrecisionSupported && GPU.isWebGL2Supported ? test : skip)('with Uint8Array3D webgl2', () => { - singlePrecisionTexturesWithUint8Array3D('webgl2'); -}); +(GPU.isSinglePrecisionSupported && GPU.isWebGL2Supported ? test : skip)( + 'with Uint8Array3D webgl2', + () => { + singlePrecisionTexturesWithUint8Array3D('webgl2'); + } +); -(GPU.isSinglePrecisionSupported && GPU.isHeadlessGLSupported && GPU.isKernelMapSupported ? test : skip)('with Uint8Array3D headlessgl', () => { +(GPU.isSinglePrecisionSupported && + GPU.isHeadlessGLSupported && + GPU.isKernelMapSupported + ? test + : skip)('with Uint8Array3D headlessgl', () => { singlePrecisionTexturesWithUint8Array3D('headlessgl'); }); @@ -609,55 +916,81 @@ function singlePrecisionTexturesWithUint8ClampedArray3D(mode) { [ new Uint8ClampedArray([20, 21, 22, 23, 24, 25, 26, 27, 28]), new Uint8ClampedArray([29, 30, 31, 32, 33, 34, 35, 36, 37]), - ] + ], ]; const gpu = new GPU({ mode }); - const kernel = gpu.createKernel(function(packed) { - return packed[this.thread.z][this.thread.y][this.thread.x]; - }, { - output: [9, 2, 2], - precision: 'single' - }); + const kernel = gpu.createKernel( + function (packed) { + return packed[this.thread.z][this.thread.y][this.thread.x]; + }, + { + output: [9, 2, 2], + precision: 'single', + } + ); const result = kernel(original); - assert.deepEqual(result.map(matrix => matrix.map(array => Array.from(array))), original.map(matrix => matrix.map(array => Array.from(array)))); + assert.deepEqual( + result.map(matrix => matrix.map(array => Array.from(array))), + original.map(matrix => matrix.map(array => Array.from(array))) + ); gpu.destroy(); } -(GPU.isSinglePrecisionSupported && GPU.isKernelMapSupported ? test : skip)('with Uint8ClampedArray3D auto', () => { - singlePrecisionTexturesWithUint8ClampedArray3D(); -}); +(GPU.isSinglePrecisionSupported && GPU.isKernelMapSupported ? test : skip)( + 'with Uint8ClampedArray3D auto', + () => { + singlePrecisionTexturesWithUint8ClampedArray3D(); + } +); test('with Uint8ClampedArray3D cpu', () => { singlePrecisionTexturesWithUint8ClampedArray3D('cpu'); }); -(GPU.isSinglePrecisionSupported && GPU.isKernelMapSupported ? test : skip)('with Uint8ClampedArray3D gpu', () => { - singlePrecisionTexturesWithUint8ClampedArray3D('gpu'); -}); +(GPU.isSinglePrecisionSupported && GPU.isKernelMapSupported ? test : skip)( + 'with Uint8ClampedArray3D gpu', + () => { + singlePrecisionTexturesWithUint8ClampedArray3D('gpu'); + } +); -(GPU.isSinglePrecisionSupported && GPU.isWebGLSupported && GPU.isKernelMapSupported ? test : skip)('with Uint8ClampedArray3D webgl', () => { +(GPU.isSinglePrecisionSupported && + GPU.isWebGLSupported && + GPU.isKernelMapSupported + ? test + : skip)('with Uint8ClampedArray3D webgl', () => { singlePrecisionTexturesWithUint8ClampedArray3D('webgl'); }); -(GPU.isSinglePrecisionSupported && GPU.isWebGL2Supported ? test : skip)('with Uint8ClampedArray3D webgl2', () => { - singlePrecisionTexturesWithUint8ClampedArray3D('webgl2'); -}); +(GPU.isSinglePrecisionSupported && GPU.isWebGL2Supported ? test : skip)( + 'with Uint8ClampedArray3D webgl2', + () => { + singlePrecisionTexturesWithUint8ClampedArray3D('webgl2'); + } +); -(GPU.isSinglePrecisionSupported && GPU.isHeadlessGLSupported && GPU.isKernelMapSupported ? test : skip)('with Uint8ClampedArray3D headlessgl', () => { +(GPU.isSinglePrecisionSupported && + GPU.isHeadlessGLSupported && + GPU.isKernelMapSupported + ? test + : skip)('with Uint8ClampedArray3D headlessgl', () => { singlePrecisionTexturesWithUint8ClampedArray3D('headlessgl'); }); function testImmutableDoesNotCollideWithKernelTexture(mode) { const gpu = new GPU({ mode }); - const kernel = gpu.createKernel(function(v) { - return v[this.thread.x] + 1; - }, { - output: [1], - precision: 'single', - pipeline: true, - immutable: true, - }); + const kernel = gpu.createKernel( + function (v) { + return v[this.thread.x] + 1; + }, + { + output: [1], + precision: 'single', + pipeline: true, + immutable: true, + } + ); const v = [1]; const result1 = kernel(v); assert.deepEqual(result1.toArray(), new Float32Array([2])); @@ -671,23 +1004,37 @@ function testImmutableDoesNotCollideWithKernelTexture(mode) { gpu.destroy(); } -(GPU.isSinglePrecisionSupported ? test : skip)('immutable does not collide with kernel texture auto', () => { - testImmutableDoesNotCollideWithKernelTexture(); -}); - -(GPU.isSinglePrecisionSupported ? test : skip)('immutable does not collide with kernel texture gpu', () => { - testImmutableDoesNotCollideWithKernelTexture('gpu'); -}); - -(GPU.isSinglePrecisionSupported && GPU.isWebGLSupported ? test : skip)('immutable does not collide with kernel texture webgl', () => { - testImmutableDoesNotCollideWithKernelTexture('webgl'); -}); - -(GPU.isSinglePrecisionSupported && GPU.isWebGL2Supported ? test : skip)('immutable does not collide with kernel texture webgl2', () => { - testImmutableDoesNotCollideWithKernelTexture('webgl2'); -}); - -(GPU.isSinglePrecisionSupported && GPU.isHeadlessGLSupported ? test : skip)('immutable does not collide with kernel texture headlessgl', () => { - testImmutableDoesNotCollideWithKernelTexture('headlessgl'); -}); - +(GPU.isSinglePrecisionSupported ? test : skip)( + 'immutable does not collide with kernel texture auto', + () => { + testImmutableDoesNotCollideWithKernelTexture(); + } +); + +(GPU.isSinglePrecisionSupported ? test : skip)( + 'immutable does not collide with kernel texture gpu', + () => { + testImmutableDoesNotCollideWithKernelTexture('gpu'); + } +); + +(GPU.isSinglePrecisionSupported && GPU.isWebGLSupported ? test : skip)( + 'immutable does not collide with kernel texture webgl', + () => { + testImmutableDoesNotCollideWithKernelTexture('webgl'); + } +); + +(GPU.isSinglePrecisionSupported && GPU.isWebGL2Supported ? test : skip)( + 'immutable does not collide with kernel texture webgl2', + () => { + testImmutableDoesNotCollideWithKernelTexture('webgl2'); + } +); + +(GPU.isSinglePrecisionSupported && GPU.isHeadlessGLSupported ? test : skip)( + 'immutable does not collide with kernel texture headlessgl', + () => { + testImmutableDoesNotCollideWithKernelTexture('headlessgl'); + } +); diff --git a/test/features/single-precision.js b/test/features/single-precision.js index 74c11c1b..c530a140 100644 --- a/test/features/single-precision.js +++ b/test/features/single-precision.js @@ -1,40 +1,47 @@ const { assert, skip, test, module: describe } = require('qunit'); -const { GPU } = require('../../src'); +const { GPU } = require('../..'); describe('features: single precision'); + function singlePrecisionKernel(mode) { const lst = new Float32Array([1, 2, 3, 4, 5, 6, 7, 8]); const gpu = new GPU({ mode }); - const kernel = gpu.createKernel(function(lst) { - return lst[this.thread.x]; - }, { - precision: 'single', - output: [lst.length] - }); + const kernel = gpu.createKernel( + function (lst) { + return lst[this.thread.x]; + }, + { + precision: 'single', + output: [lst.length], + } + ); assert.deepEqual(kernel(lst), lst); gpu.destroy(); } -(GPU.isSinglePrecisionSupported ? test : skip)("auto", () => { +(GPU.isSinglePrecisionSupported ? test : skip)('auto', () => { singlePrecisionKernel(null); }); -test("cpu", () => { +test('cpu', () => { singlePrecisionKernel('cpu'); }); -(GPU.isSinglePrecisionSupported ? test : skip)("gpu", () => { +(GPU.isSinglePrecisionSupported ? test : skip)('gpu', () => { singlePrecisionKernel('gpu'); }); -(GPU.isSinglePrecisionSupported && GPU.isWebGLSupported ? test : skip)("webgl", () => { - singlePrecisionKernel('webgl'); -}); +(GPU.isSinglePrecisionSupported && GPU.isWebGLSupported ? test : skip)( + 'webgl', + () => { + singlePrecisionKernel('webgl'); + } +); -(GPU.isWebGL2Supported ? test : skip)("webgl2", () => { +(GPU.isWebGL2Supported ? test : skip)('webgl2', () => { singlePrecisionKernel('webgl2'); }); -(GPU.isHeadlessGLSupported ? test : skip)("headlessgl", () => { +(GPU.isHeadlessGLSupported ? test : skip)('headlessgl', () => { singlePrecisionKernel('headlessgl'); }); diff --git a/test/features/switches.js b/test/features/switches.js index d8b3d2b4..aed58711 100644 --- a/test/features/switches.js +++ b/test/features/switches.js @@ -1,21 +1,27 @@ const { assert, skip, test, only, module: describe } = require('qunit'); -const { GPU } = require('../../src'); +const { GPU } = require('../..'); describe('features: switches'); function testBasic(mode) { const gpu = new GPU({ mode }); - const kernel = gpu.createKernel(function(value) { - switch (value) { - case 1: return 1; - case 2: return 2; - case 3: return 3; + const kernel = gpu.createKernel( + function (value) { + switch (value) { + case 1: + return 1; + case 2: + return 2; + case 3: + return 3; + } + return 0; + }, + { + argumentTypes: ['Integer'], + output: [1], } - return 0; - }, { - argumentTypes: ['Integer'], - output: [1], - }); + ); assert.equal(kernel(1)[0], 1); assert.equal(kernel(2)[0], 2); assert.equal(kernel(3)[0], 3); @@ -47,17 +53,20 @@ test('basic cpu', () => { testBasic('cpu'); }); - function testOnlyDefault(mode) { const gpu = new GPU({ mode }); - const kernel = gpu.createKernel(function(value) { - switch (value) { - default: return 3; + const kernel = gpu.createKernel( + function (value) { + switch (value) { + default: + return 3; + } + }, + { + argumentTypes: ['Integer'], + output: [1], } - }, { - argumentTypes: ['Integer'], - output: [1] - }); + ); assert.equal(kernel(1)[0], 3); assert.equal(kernel(2)[0], 3); assert.equal(kernel(3)[0], 3); @@ -91,16 +100,22 @@ test('only default cpu', () => { function testDefault(mode) { const gpu = new GPU({ mode }); - const kernel = gpu.createKernel(function(value) { - switch (value) { - case 1: return 1; - case 2: return 2; - default: return 3; + const kernel = gpu.createKernel( + function (value) { + switch (value) { + case 1: + return 1; + case 2: + return 2; + default: + return 3; + } + }, + { + argumentTypes: ['Integer'], + output: [1], } - }, { - argumentTypes: ['Integer'], - output: [1] - }); + ); assert.equal(kernel(1)[0], 1); assert.equal(kernel(2)[0], 2); assert.equal(kernel(3)[0], 3); @@ -132,19 +147,24 @@ test('default cpu', () => { testDefault('cpu'); }); - function testEarlyDefault(mode) { const gpu = new GPU({ mode }); - const kernel = gpu.createKernel(function(value) { - switch (value) { - default: return 3; - case 1: return 1; - case 2: return 2; + const kernel = gpu.createKernel( + function (value) { + switch (value) { + default: + return 3; + case 1: + return 1; + case 2: + return 2; + } + }, + { + argumentTypes: ['Integer'], + output: [1], } - }, { - argumentTypes: ['Integer'], - output: [1], - }); + ); assert.equal(kernel(1)[0], 1); assert.equal(kernel(2)[0], 2); assert.equal(kernel(3)[0], 3); @@ -176,20 +196,23 @@ test('early default cpu', () => { testEarlyDefault('cpu'); }); - function testFallThrough(mode) { const gpu = new GPU({ mode }); - const kernel = gpu.createKernel(function(value) { - switch (value) { - case 1: - case 2: - return 1; - default: return 3; + const kernel = gpu.createKernel( + function (value) { + switch (value) { + case 1: + case 2: + return 1; + default: + return 3; + } + }, + { + argumentTypes: ['Integer'], + output: [1], } - }, { - argumentTypes: ['Integer'], - output: [1] - }); + ); assert.equal(kernel(1)[0], 1); assert.equal(kernel(2)[0], 1); assert.equal(kernel(3)[0], 3); diff --git a/test/features/tactic.js b/test/features/tactic.js index 01abb8ce..bed4247c 100644 --- a/test/features/tactic.js +++ b/test/features/tactic.js @@ -1,13 +1,14 @@ const { assert, skip, test, module: describe } = require('qunit'); -const { GPU } = require('../../src'); +const { GPU } = require('../..'); describe('internal: tactic'); function speedTest(mode) { const gpu = new GPU({ mode }); - const add = gpu.createKernel(function(a, b) { - return a + b; - }) + const add = gpu + .createKernel(function (a, b) { + return a + b; + }) .setOutput([1]) .setTactic('speed'); let addResult = add(0.1, 0.2)[0]; @@ -41,9 +42,10 @@ test('speed cpu', () => { function balancedTest(mode) { const gpu = new GPU({ mode }); - const add = gpu.createKernel(function(a, b) { - return a + b; - }) + const add = gpu + .createKernel(function (a, b) { + return a + b; + }) .setOutput([1]) .setTactic('balanced'); let addResult = add(0.1, 0.2)[0]; @@ -77,9 +79,10 @@ test('balanced cpu', () => { function precisionTest(mode) { const gpu = new GPU({ mode }); - const add = gpu.createKernel(function(a, b) { - return a + b; - }) + const add = gpu + .createKernel(function (a, b) { + return a + b; + }) .setOutput([1]) .setTactic('precision'); let addResult = add(0.1, 0.2)[0]; diff --git a/test/features/ternary.js b/test/features/ternary.js index b0caeaba..11ac077d 100644 --- a/test/features/ternary.js +++ b/test/features/ternary.js @@ -1,12 +1,13 @@ const { assert, skip, test, module: describe, only } = require('qunit'); -const { GPU } = require('../../src'); +const { GPU } = require('../..'); describe('feature: Ternary'); function ternaryTest(mode) { const gpu = new GPU({ mode }); + function ternaryFunction(value) { - return (value > 1 ? 1 : 0); + return value > 1 ? 1 : 0; } const kernel = gpu.createKernel(ternaryFunction, { output: [1] }); const truthyResult = kernel(100); @@ -42,10 +43,13 @@ test('cpu', () => { function ternaryWithVariableUsage(mode) { const gpu = new GPU({ mode }); - const kernel = gpu.createKernel(function(value1) { - const value2 = value1 + 1; - return value2 > 10 ? 1 : 0; - }, { output: [1] }); + const kernel = gpu.createKernel( + function (value1) { + const value2 = value1 + 1; + return value2 > 10 ? 1 : 0; + }, + { output: [1] } + ); assert.equal(kernel(9)[0], 0); assert.equal(kernel(10)[0], 1); @@ -69,9 +73,12 @@ test('with variable usage gpu', () => { ternaryWithVariableUsage('webgl2'); }); -(GPU.isHeadlessGLSupported ? test : skip)('with variable usage headlessgl', () => { - ternaryWithVariableUsage('headlessgl'); -}); +(GPU.isHeadlessGLSupported ? test : skip)( + 'with variable usage headlessgl', + () => { + ternaryWithVariableUsage('headlessgl'); + } +); test('with variable usage cpu', () => { ternaryWithVariableUsage('cpu'); diff --git a/test/features/to-string/as-file.js b/test/features/to-string/as-file.js index 8469e0b2..30face01 100644 --- a/test/features/to-string/as-file.js +++ b/test/features/to-string/as-file.js @@ -1,5 +1,5 @@ const { assert, skip, test, module: describe, only } = require('qunit'); -const { GPU } = require('../../../src'); +const { GPU } = require('../../..'); describe('features: to-string as file'); @@ -10,9 +10,12 @@ function toStringAsFileTest(mode) { fs.unlinkSync(path); } const gpu = new GPU({ mode }); - const kernel = gpu.createKernel(function(v) { - return v[this.thread.y][this.thread.x] + 1; - }, { output: [1, 1] }); + const kernel = gpu.createKernel( + function (v) { + return v[this.thread.y][this.thread.x] + 1; + }, + { output: [1, 1] } + ); const a = [[1]]; const expected = kernel(a); assert.deepEqual(expected, [new Float32Array([2])]); @@ -26,12 +29,16 @@ function toStringAsFileTest(mode) { gpu.destroy(); } -(GPU.isHeadlessGLSupported ? test : skip)('can save and restore function headlessgl', () => { - toStringAsFileTest('headlessgl'); -}); - -(GPU.isHeadlessGLSupported ? test : skip)('can save and restore function cpu', () => { - toStringAsFileTest('cpu'); -}); - +(GPU.isHeadlessGLSupported ? test : skip)( + 'can save and restore function headlessgl', + () => { + toStringAsFileTest('headlessgl'); + } +); +(GPU.isHeadlessGLSupported ? test : skip)( + 'can save and restore function cpu', + () => { + toStringAsFileTest('cpu'); + } +); diff --git a/test/features/to-string/precision/single/arguments/array.js b/test/features/to-string/precision/single/arguments/array.js index d115cfe5..d95b1b84 100644 --- a/test/features/to-string/precision/single/arguments/array.js +++ b/test/features/to-string/precision/single/arguments/array.js @@ -1,21 +1,24 @@ const { assert, skip, test, module: describe, only } = require('qunit'); -const { GPU } = require('../../../../../../src'); +const { GPU } = require('../../../../../..'); describe('feature: to-string single precision arguments Array'); function testArgument(mode, context, canvas) { const gpu = new GPU({ mode }); - const originalKernel = gpu.createKernel(function(a) { - return a[this.thread.x]; - }, { - canvas, - context, - output: [4], - precision: 'single', - }); + const originalKernel = gpu.createKernel( + function (a) { + return a[this.thread.x]; + }, + { + canvas, + context, + output: [4], + precision: 'single', + } + ); const a = [1, 2, 3, 4]; - const expected = new Float32Array([1,2,3,4]); + const expected = new Float32Array([1, 2, 3, 4]); const originalResult = originalKernel(a); assert.deepEqual(originalResult, expected); const kernelString = originalKernel.toString(a); @@ -23,28 +26,37 @@ function testArgument(mode, context, canvas) { const newResult = newKernel(a); assert.deepEqual(newResult, expected); - const b = [4,3,2,1]; - const expected2 = new Float32Array([4,3,2,1]); + const b = [4, 3, 2, 1]; + const expected2 = new Float32Array([4, 3, 2, 1]); const newResult2 = newKernel(b); assert.deepEqual(newResult2, expected2); gpu.destroy(); } -(GPU.isSinglePrecisionSupported && GPU.isWebGLSupported ? test : skip)('webgl', () => { - const canvas = document.createElement('canvas'); - const context = canvas.getContext('webgl'); - testArgument('webgl', context, canvas); -}); - -(GPU.isSinglePrecisionSupported && GPU.isWebGL2Supported ? test : skip)('webgl2', () => { - const canvas = document.createElement('canvas'); - const context = canvas.getContext('webgl2'); - testArgument('webgl2', context, canvas); -}); - -(GPU.isSinglePrecisionSupported && GPU.isHeadlessGLSupported ? test : skip)('headlessgl', () => { - testArgument('headlessgl', require('gl')(1, 1), null); -}); +(GPU.isSinglePrecisionSupported && GPU.isWebGLSupported ? test : skip)( + 'webgl', + () => { + const canvas = document.createElement('canvas'); + const context = canvas.getContext('webgl'); + testArgument('webgl', context, canvas); + } +); + +(GPU.isSinglePrecisionSupported && GPU.isWebGL2Supported ? test : skip)( + 'webgl2', + () => { + const canvas = document.createElement('canvas'); + const context = canvas.getContext('webgl2'); + testArgument('webgl2', context, canvas); + } +); + +(GPU.isSinglePrecisionSupported && GPU.isHeadlessGLSupported ? test : skip)( + 'headlessgl', + () => { + testArgument('headlessgl', require('gl')(1, 1), null); + } +); test('cpu', () => { testArgument('cpu'); diff --git a/test/features/to-string/precision/single/arguments/array2.js b/test/features/to-string/precision/single/arguments/array2.js index b68236a8..6402290e 100644 --- a/test/features/to-string/precision/single/arguments/array2.js +++ b/test/features/to-string/precision/single/arguments/array2.js @@ -1,22 +1,25 @@ const { assert, skip, test, module: describe, only } = require('qunit'); -const { GPU } = require('../../../../../../src'); +const { GPU } = require('../../../../../..'); describe('feature: to-string single precision arguments Array(2)'); function testArgument(mode, context, canvas) { const gpu = new GPU({ mode }); - const originalKernel = gpu.createKernel(function(a) { - return a; - }, { - canvas, - context, - output: [1], - precision: 'single', - argumentTypes: { a: 'Array(2)' } - }); + const originalKernel = gpu.createKernel( + function (a) { + return a; + }, + { + canvas, + context, + output: [1], + precision: 'single', + argumentTypes: { a: 'Array(2)' }, + } + ); const a = new Float32Array([1, 2]); - const expected = [new Float32Array([1,2])]; + const expected = [new Float32Array([1, 2])]; const originalResult = originalKernel(a); assert.deepEqual(originalResult, expected); const kernelString = originalKernel.toString(a); @@ -25,27 +28,36 @@ function testArgument(mode, context, canvas) { assert.deepEqual(newResult, expected); const b = new Float32Array([2, 1]); - const expected2 = [new Float32Array([2,1])]; + const expected2 = [new Float32Array([2, 1])]; const newResult2 = newKernel(b); assert.deepEqual(newResult2, expected2); gpu.destroy(); } -(GPU.isSinglePrecisionSupported && GPU.isWebGLSupported ? test : skip)('webgl', () => { - const canvas = document.createElement('canvas'); - const context = canvas.getContext('webgl'); - testArgument('webgl', context, canvas); -}); +(GPU.isSinglePrecisionSupported && GPU.isWebGLSupported ? test : skip)( + 'webgl', + () => { + const canvas = document.createElement('canvas'); + const context = canvas.getContext('webgl'); + testArgument('webgl', context, canvas); + } +); -(GPU.isSinglePrecisionSupported && GPU.isWebGL2Supported ? test : skip)('webgl2', () => { - const canvas = document.createElement('canvas'); - const context = canvas.getContext('webgl2'); - testArgument('webgl2', context, canvas); -}); +(GPU.isSinglePrecisionSupported && GPU.isWebGL2Supported ? test : skip)( + 'webgl2', + () => { + const canvas = document.createElement('canvas'); + const context = canvas.getContext('webgl2'); + testArgument('webgl2', context, canvas); + } +); -(GPU.isSinglePrecisionSupported && GPU.isHeadlessGLSupported ? test : skip)('headlessgl', () => { - testArgument('headlessgl', require('gl')(1, 1), null); -}); +(GPU.isSinglePrecisionSupported && GPU.isHeadlessGLSupported ? test : skip)( + 'headlessgl', + () => { + testArgument('headlessgl', require('gl')(1, 1), null); + } +); test('cpu', () => { testArgument('cpu'); diff --git a/test/features/to-string/precision/single/arguments/array2d.js b/test/features/to-string/precision/single/arguments/array2d.js index 7a503e33..e51eb9fa 100644 --- a/test/features/to-string/precision/single/arguments/array2d.js +++ b/test/features/to-string/precision/single/arguments/array2d.js @@ -1,22 +1,25 @@ const { assert, skip, test, module: describe, only } = require('qunit'); -const { GPU } = require('../../../../../../src'); +const { GPU } = require('../../../../../..'); describe('feature: to-string single precision arguments Array2D'); function testArgument(mode, context, canvas) { const gpu = new GPU({ mode }); - const originalKernel = gpu.createKernel(function(a) { - let sum = 0; - for (let y = 0; y < 4; y++) { - sum += a[y][this.thread.x]; + const originalKernel = gpu.createKernel( + function (a) { + let sum = 0; + for (let y = 0; y < 4; y++) { + sum += a[y][this.thread.x]; + } + return sum; + }, + { + canvas, + context, + output: [4], + precision: 'single', } - return sum; - }, { - canvas, - context, - output: [4], - precision: 'single', - }); + ); const a = [ [1, 2, 3, 4], @@ -30,7 +33,7 @@ function testArgument(mode, context, canvas) { [1, 1, 1, 1], [1, 1, 1, 1], ]; - const expected = new Float32Array([28,32,36,40]); + const expected = new Float32Array([28, 32, 36, 40]); const originalResult = originalKernel(a); assert.deepEqual(originalResult, expected); const kernelString = originalKernel.toString(a); @@ -38,27 +41,36 @@ function testArgument(mode, context, canvas) { const newResult = newKernel(a); assert.deepEqual(newResult, expected); - const expected2 = new Float32Array([4,4,4,4]); + const expected2 = new Float32Array([4, 4, 4, 4]); const newResult2 = newKernel(b); assert.deepEqual(newResult2, expected2); gpu.destroy(); } -(GPU.isSinglePrecisionSupported && GPU.isWebGLSupported ? test : skip)('webgl', () => { - const canvas = document.createElement('canvas'); - const context = canvas.getContext('webgl'); - testArgument('webgl', context, canvas); -}); +(GPU.isSinglePrecisionSupported && GPU.isWebGLSupported ? test : skip)( + 'webgl', + () => { + const canvas = document.createElement('canvas'); + const context = canvas.getContext('webgl'); + testArgument('webgl', context, canvas); + } +); -(GPU.isSinglePrecisionSupported && GPU.isWebGL2Supported ? test : skip)('webgl2', () => { - const canvas = document.createElement('canvas'); - const context = canvas.getContext('webgl2'); - testArgument('webgl2', context, canvas); -}); +(GPU.isSinglePrecisionSupported && GPU.isWebGL2Supported ? test : skip)( + 'webgl2', + () => { + const canvas = document.createElement('canvas'); + const context = canvas.getContext('webgl2'); + testArgument('webgl2', context, canvas); + } +); -(GPU.isSinglePrecisionSupported && GPU.isHeadlessGLSupported ? test : skip)('headlessgl', () => { - testArgument('headlessgl', require('gl')(1, 1), null); -}); +(GPU.isSinglePrecisionSupported && GPU.isHeadlessGLSupported ? test : skip)( + 'headlessgl', + () => { + testArgument('headlessgl', require('gl')(1, 1), null); + } +); test('cpu', () => { testArgument('cpu'); diff --git a/test/features/to-string/precision/single/arguments/array2d2.js b/test/features/to-string/precision/single/arguments/array2d2.js index ae1dcc72..a7cfcb45 100644 --- a/test/features/to-string/precision/single/arguments/array2d2.js +++ b/test/features/to-string/precision/single/arguments/array2d2.js @@ -1,22 +1,25 @@ const { assert, skip, test, module: describe, only } = require('qunit'); -const { GPU } = require('../../../../../../src'); +const { GPU } = require('../../../../../..'); describe('feature: to-string single precision arguments Array2D(2)'); function testArgument(mode, context, canvas) { const gpu = new GPU({ mode }); - const originalKernel = gpu.createKernel(function(a) { - const array2 = a[this.thread.y][this.thread.x]; - return [array2[0] + 1, array2[1] + 1]; - }, { - canvas, - context, - output: [2,2], - precision: 'single', - argumentTypes: { - a: 'Array2D(2)' + const originalKernel = gpu.createKernel( + function (a) { + const array2 = a[this.thread.y][this.thread.x]; + return [array2[0] + 1, array2[1] + 1]; + }, + { + canvas, + context, + output: [2, 2], + precision: 'single', + argumentTypes: { + a: 'Array2D(2)', + }, } - }); + ); const a = [ [ @@ -26,22 +29,16 @@ function testArgument(mode, context, canvas) { [ [5, 6], [7, 8], - ] + ], ]; const expected = [ - [ - new Float32Array([2, 3]), - new Float32Array([4, 5]), - ], - [ - new Float32Array([6, 7]), - new Float32Array([8, 9]), - ] + [new Float32Array([2, 3]), new Float32Array([4, 5])], + [new Float32Array([6, 7]), new Float32Array([8, 9])], ]; const originalResult = originalKernel(a); assert.deepEqual(originalResult, expected); const kernelString = originalKernel.toString(a); - const newKernel = new Function('return ' + kernelString)()({ context }) + const newKernel = new Function('return ' + kernelString)()({ context }); const newResult = newKernel(a); assert.deepEqual(newResult, expected); @@ -53,38 +50,41 @@ function testArgument(mode, context, canvas) { [ [1, 1], [1, 1], - ] + ], ]; const expected2 = [ - [ - new Float32Array([2, 2]), - new Float32Array([2, 2]), - ], - [ - new Float32Array([2, 2]), - new Float32Array([2, 2]), - ] + [new Float32Array([2, 2]), new Float32Array([2, 2])], + [new Float32Array([2, 2]), new Float32Array([2, 2])], ]; const newResult2 = newKernel(b); assert.deepEqual(newResult2, expected2); gpu.destroy(); } -(GPU.isSinglePrecisionSupported && GPU.isWebGLSupported ? test : skip)('webgl', () => { - const canvas = document.createElement('canvas'); - const context = canvas.getContext('webgl'); - testArgument('webgl', context, canvas); -}); +(GPU.isSinglePrecisionSupported && GPU.isWebGLSupported ? test : skip)( + 'webgl', + () => { + const canvas = document.createElement('canvas'); + const context = canvas.getContext('webgl'); + testArgument('webgl', context, canvas); + } +); -(GPU.isSinglePrecisionSupported && GPU.isWebGL2Supported ? test : skip)('webgl2', () => { - const canvas = document.createElement('canvas'); - const context = canvas.getContext('webgl2'); - testArgument('webgl2', context, canvas); -}); +(GPU.isSinglePrecisionSupported && GPU.isWebGL2Supported ? test : skip)( + 'webgl2', + () => { + const canvas = document.createElement('canvas'); + const context = canvas.getContext('webgl2'); + testArgument('webgl2', context, canvas); + } +); -(GPU.isSinglePrecisionSupported && GPU.isHeadlessGLSupported ? test : skip)('headlessgl', () => { - testArgument('headlessgl', require('gl')(1, 1), null); -}); +(GPU.isSinglePrecisionSupported && GPU.isHeadlessGLSupported ? test : skip)( + 'headlessgl', + () => { + testArgument('headlessgl', require('gl')(1, 1), null); + } +); test('cpu', () => { testArgument('cpu'); diff --git a/test/features/to-string/precision/single/arguments/array2d3.js b/test/features/to-string/precision/single/arguments/array2d3.js index 3d2fb874..f2902137 100644 --- a/test/features/to-string/precision/single/arguments/array2d3.js +++ b/test/features/to-string/precision/single/arguments/array2d3.js @@ -1,23 +1,26 @@ const { assert, skip, test, module: describe, only } = require('qunit'); -const { GPU } = require('../../../../../../src'); +const { GPU } = require('../../../../../..'); describe('feature: to-string single precision arguments Array2D(3)'); function testArgument(mode, context, canvas) { const gpu = new GPU({ mode }); - const originalKernel = gpu.createKernel(function(a) { - const array3 = a[this.thread.y][this.thread.x]; - return [array3[0] + 1, array3[1] + 1, array3[2] + 1]; - }, { - canvas, - context, - output: [2,2], - precision: 'single', - dynamicOutput: true, - argumentTypes: { - a: 'Array2D(3)' + const originalKernel = gpu.createKernel( + function (a) { + const array3 = a[this.thread.y][this.thread.x]; + return [array3[0] + 1, array3[1] + 1, array3[2] + 1]; + }, + { + canvas, + context, + output: [2, 2], + precision: 'single', + dynamicOutput: true, + argumentTypes: { + a: 'Array2D(3)', + }, } - }); + ); const a = [ [ @@ -27,22 +30,16 @@ function testArgument(mode, context, canvas) { [ [7, 8, 9], [10, 11, 12], - ] + ], ]; const expected = [ - [ - new Float32Array([2, 3, 4]), - new Float32Array([5, 6, 7]), - ], - [ - new Float32Array([8, 9, 10]), - new Float32Array([11, 12, 13]), - ] + [new Float32Array([2, 3, 4]), new Float32Array([5, 6, 7])], + [new Float32Array([8, 9, 10]), new Float32Array([11, 12, 13])], ]; const originalResult = originalKernel(a); assert.deepEqual(originalResult, expected); const kernelString = originalKernel.toString(a); - const newKernel = new Function('return ' + kernelString)()({ context }) + const newKernel = new Function('return ' + kernelString)()({ context }); const newResult = newKernel(a); assert.deepEqual(newResult, expected); @@ -54,38 +51,41 @@ function testArgument(mode, context, canvas) { [ [1, 1, 1], [1, 1, 1], - ] + ], ]; const expected2 = [ - [ - new Float32Array([2, 2, 2]), - new Float32Array([2, 2, 2]), - ], - [ - new Float32Array([2, 2, 2]), - new Float32Array([2, 2, 2]), - ] + [new Float32Array([2, 2, 2]), new Float32Array([2, 2, 2])], + [new Float32Array([2, 2, 2]), new Float32Array([2, 2, 2])], ]; const newResult2 = newKernel(b); assert.deepEqual(newResult2, expected2); gpu.destroy(); } -(GPU.isSinglePrecisionSupported && GPU.isWebGLSupported ? test : skip)('webgl', () => { - const canvas = document.createElement('canvas'); - const context = canvas.getContext('webgl'); - testArgument('webgl', context, canvas); -}); +(GPU.isSinglePrecisionSupported && GPU.isWebGLSupported ? test : skip)( + 'webgl', + () => { + const canvas = document.createElement('canvas'); + const context = canvas.getContext('webgl'); + testArgument('webgl', context, canvas); + } +); -(GPU.isSinglePrecisionSupported && GPU.isWebGL2Supported ? test : skip)('webgl2', () => { - const canvas = document.createElement('canvas'); - const context = canvas.getContext('webgl2'); - testArgument('webgl2', context, canvas); -}); +(GPU.isSinglePrecisionSupported && GPU.isWebGL2Supported ? test : skip)( + 'webgl2', + () => { + const canvas = document.createElement('canvas'); + const context = canvas.getContext('webgl2'); + testArgument('webgl2', context, canvas); + } +); -(GPU.isSinglePrecisionSupported && GPU.isHeadlessGLSupported ? test : skip)('headlessgl', () => { - testArgument('headlessgl', require('gl')(1, 1), null); -}); +(GPU.isSinglePrecisionSupported && GPU.isHeadlessGLSupported ? test : skip)( + 'headlessgl', + () => { + testArgument('headlessgl', require('gl')(1, 1), null); + } +); test('cpu', () => { testArgument('cpu'); diff --git a/test/features/to-string/precision/single/arguments/array3.js b/test/features/to-string/precision/single/arguments/array3.js index cc982e1d..9e8867b1 100644 --- a/test/features/to-string/precision/single/arguments/array3.js +++ b/test/features/to-string/precision/single/arguments/array3.js @@ -1,22 +1,25 @@ const { assert, skip, test, module: describe, only } = require('qunit'); -const { GPU } = require('../../../../../../src'); +const { GPU } = require('../../../../../..'); describe('feature: to-string single precision arguments Array(3)'); function testArgument(mode, context, canvas) { const gpu = new GPU({ mode }); - const originalKernel = gpu.createKernel(function(a) { - return a; - }, { - canvas, - context, - output: [1], - precision: 'single', - argumentTypes: { a: 'Array(3)' } - }); + const originalKernel = gpu.createKernel( + function (a) { + return a; + }, + { + canvas, + context, + output: [1], + precision: 'single', + argumentTypes: { a: 'Array(3)' }, + } + ); const a = new Float32Array([1, 2, 3]); - const expected = [new Float32Array([1,2,3])]; + const expected = [new Float32Array([1, 2, 3])]; const originalResult = originalKernel(a); assert.deepEqual(originalResult, expected); const kernelString = originalKernel.toString(a); @@ -25,27 +28,36 @@ function testArgument(mode, context, canvas) { assert.deepEqual(newResult, expected); const b = new Float32Array([1, 1, 1]); - const expected2 = [new Float32Array([1,1,1])]; + const expected2 = [new Float32Array([1, 1, 1])]; const newResult2 = newKernel(b); assert.deepEqual(newResult2, expected2); gpu.destroy(); } -(GPU.isSinglePrecisionSupported && GPU.isWebGLSupported ? test : skip)('webgl', () => { - const canvas = document.createElement('canvas'); - const context = canvas.getContext('webgl'); - testArgument('webgl', context, canvas); -}); +(GPU.isSinglePrecisionSupported && GPU.isWebGLSupported ? test : skip)( + 'webgl', + () => { + const canvas = document.createElement('canvas'); + const context = canvas.getContext('webgl'); + testArgument('webgl', context, canvas); + } +); -(GPU.isSinglePrecisionSupported && GPU.isWebGL2Supported ? test : skip)('webgl2', () => { - const canvas = document.createElement('canvas'); - const context = canvas.getContext('webgl2'); - testArgument('webgl2', context, canvas); -}); +(GPU.isSinglePrecisionSupported && GPU.isWebGL2Supported ? test : skip)( + 'webgl2', + () => { + const canvas = document.createElement('canvas'); + const context = canvas.getContext('webgl2'); + testArgument('webgl2', context, canvas); + } +); -(GPU.isSinglePrecisionSupported && GPU.isHeadlessGLSupported ? test : skip)('headlessgl', () => { - testArgument('headlessgl', require('gl')(1, 1), null); -}); +(GPU.isSinglePrecisionSupported && GPU.isHeadlessGLSupported ? test : skip)( + 'headlessgl', + () => { + testArgument('headlessgl', require('gl')(1, 1), null); + } +); test('cpu', () => { testArgument('cpu'); diff --git a/test/features/to-string/precision/single/arguments/array3d.js b/test/features/to-string/precision/single/arguments/array3d.js index 66d2a27b..8f20d4d6 100644 --- a/test/features/to-string/precision/single/arguments/array3d.js +++ b/test/features/to-string/precision/single/arguments/array3d.js @@ -1,24 +1,27 @@ const { assert, skip, test, module: describe, only } = require('qunit'); -const { GPU } = require('../../../../../../src'); +const { GPU } = require('../../../../../..'); describe('feature: to-string single precision arguments Array3D'); function testArgument(mode, context, canvas) { const gpu = new GPU({ mode }); - const originalKernel = gpu.createKernel(function(a) { - let sum = 0; - for (let z = 0; z < 2; z++) { - for (let y = 0; y < 2; y++) { - sum += a[z][y][this.thread.x]; + const originalKernel = gpu.createKernel( + function (a) { + let sum = 0; + for (let z = 0; z < 2; z++) { + for (let y = 0; y < 2; y++) { + sum += a[z][y][this.thread.x]; + } } + return sum; + }, + { + canvas, + context, + output: [2], + precision: 'single', } - return sum; - }, { - canvas, - context, - output: [2], - precision: 'single', - }); + ); const a = [ [ @@ -28,7 +31,7 @@ function testArgument(mode, context, canvas) { [ [5, 6], [7, 8], - ] + ], ]; const expected = new Float32Array([16, 20]); const originalResult = originalKernel(a); @@ -46,7 +49,7 @@ function testArgument(mode, context, canvas) { [ [1, 1], [1, 1], - ] + ], ]; const expected2 = new Float32Array([4, 4]); const newResult2 = newKernel(b); @@ -54,21 +57,30 @@ function testArgument(mode, context, canvas) { gpu.destroy(); } -(GPU.isSinglePrecisionSupported && GPU.isWebGLSupported ? test : skip)('webgl', () => { - const canvas = document.createElement('canvas'); - const context = canvas.getContext('webgl'); - testArgument('webgl', context, canvas); -}); +(GPU.isSinglePrecisionSupported && GPU.isWebGLSupported ? test : skip)( + 'webgl', + () => { + const canvas = document.createElement('canvas'); + const context = canvas.getContext('webgl'); + testArgument('webgl', context, canvas); + } +); -(GPU.isSinglePrecisionSupported && GPU.isWebGL2Supported ? test : skip)('webgl2', () => { - const canvas = document.createElement('canvas'); - const context = canvas.getContext('webgl2'); - testArgument('webgl2', context, canvas); -}); +(GPU.isSinglePrecisionSupported && GPU.isWebGL2Supported ? test : skip)( + 'webgl2', + () => { + const canvas = document.createElement('canvas'); + const context = canvas.getContext('webgl2'); + testArgument('webgl2', context, canvas); + } +); -(GPU.isSinglePrecisionSupported && GPU.isHeadlessGLSupported ? test : skip)('headlessgl', () => { - testArgument('headlessgl', require('gl')(1, 1), null); -}); +(GPU.isSinglePrecisionSupported && GPU.isHeadlessGLSupported ? test : skip)( + 'headlessgl', + () => { + testArgument('headlessgl', require('gl')(1, 1), null); + } +); test('cpu', () => { testArgument('cpu'); diff --git a/test/features/to-string/precision/single/arguments/array4.js b/test/features/to-string/precision/single/arguments/array4.js index 8a3a70df..1fd4ed97 100644 --- a/test/features/to-string/precision/single/arguments/array4.js +++ b/test/features/to-string/precision/single/arguments/array4.js @@ -1,22 +1,25 @@ const { assert, skip, test, module: describe, only } = require('qunit'); -const { GPU } = require('../../../../../../src'); +const { GPU } = require('../../../../../..'); describe('feature: to-string single precision arguments Array(4)'); function testArgument(mode, context, canvas) { const gpu = new GPU({ mode }); - const originalKernel = gpu.createKernel(function(a) { - return a; - }, { - canvas, - context, - output: [1], - precision: 'single', - argumentTypes: { a: 'Array(4)' } - }); + const originalKernel = gpu.createKernel( + function (a) { + return a; + }, + { + canvas, + context, + output: [1], + precision: 'single', + argumentTypes: { a: 'Array(4)' }, + } + ); const a = new Float32Array([1, 2, 3, 4]); - const expected = [new Float32Array([1,2,3,4])]; + const expected = [new Float32Array([1, 2, 3, 4])]; const originalResult = originalKernel(a); assert.deepEqual(originalResult, expected); const kernelString = originalKernel.toString(a); @@ -25,27 +28,36 @@ function testArgument(mode, context, canvas) { assert.deepEqual(newResult, expected); const b = new Float32Array([1, 1, 1, 1]); - const expected2 = [new Float32Array([1,1,1,1])]; + const expected2 = [new Float32Array([1, 1, 1, 1])]; const newResult2 = newKernel(b); assert.deepEqual(newResult2, expected2); gpu.destroy(); } -(GPU.isSinglePrecisionSupported && GPU.isWebGLSupported ? test : skip)('webgl', () => { - const canvas = document.createElement('canvas'); - const context = canvas.getContext('webgl'); - testArgument('webgl', context, canvas); -}); +(GPU.isSinglePrecisionSupported && GPU.isWebGLSupported ? test : skip)( + 'webgl', + () => { + const canvas = document.createElement('canvas'); + const context = canvas.getContext('webgl'); + testArgument('webgl', context, canvas); + } +); -(GPU.isSinglePrecisionSupported && GPU.isWebGL2Supported ? test : skip)('webgl2', () => { - const canvas = document.createElement('canvas'); - const context = canvas.getContext('webgl2'); - testArgument('webgl2', context, canvas); -}); +(GPU.isSinglePrecisionSupported && GPU.isWebGL2Supported ? test : skip)( + 'webgl2', + () => { + const canvas = document.createElement('canvas'); + const context = canvas.getContext('webgl2'); + testArgument('webgl2', context, canvas); + } +); -(GPU.isSinglePrecisionSupported && GPU.isHeadlessGLSupported ? test : skip)('headlessgl', () => { - testArgument('headlessgl', require('gl')(1, 1), null); -}); +(GPU.isSinglePrecisionSupported && GPU.isHeadlessGLSupported ? test : skip)( + 'headlessgl', + () => { + testArgument('headlessgl', require('gl')(1, 1), null); + } +); test('cpu', () => { testArgument('cpu'); diff --git a/test/features/to-string/precision/single/arguments/boolean.js b/test/features/to-string/precision/single/arguments/boolean.js index 3ae322a0..f00b31b1 100644 --- a/test/features/to-string/precision/single/arguments/boolean.js +++ b/test/features/to-string/precision/single/arguments/boolean.js @@ -1,18 +1,21 @@ const { assert, skip, test, module: describe, only } = require('qunit'); -const { GPU } = require('../../../../../../src'); +const { GPU } = require('../../../../../..'); describe('feature: to-string single precision arguments Boolean'); function testArgument(mode, context, canvas) { const gpu = new GPU({ mode }); - const originalKernel = gpu.createKernel(function(a) { - return a ? 42 : -42; - }, { - canvas, - context, - output: [1], - precision: 'single', - }); + const originalKernel = gpu.createKernel( + function (a) { + return a ? 42 : -42; + }, + { + canvas, + context, + output: [1], + precision: 'single', + } + ); assert.deepEqual(originalKernel(true)[0], 42); assert.deepEqual(originalKernel(false)[0], -42); const kernelString = originalKernel.toString(true); @@ -22,21 +25,30 @@ function testArgument(mode, context, canvas) { gpu.destroy(); } -(GPU.isSinglePrecisionSupported && GPU.isWebGLSupported ? test : skip)('webgl', () => { - const canvas = document.createElement('canvas'); - const context = canvas.getContext('webgl'); - testArgument('webgl', context, canvas); -}); +(GPU.isSinglePrecisionSupported && GPU.isWebGLSupported ? test : skip)( + 'webgl', + () => { + const canvas = document.createElement('canvas'); + const context = canvas.getContext('webgl'); + testArgument('webgl', context, canvas); + } +); -(GPU.isSinglePrecisionSupported && GPU.isWebGL2Supported ? test : skip)('webgl2', () => { - const canvas = document.createElement('canvas'); - const context = canvas.getContext('webgl2'); - testArgument('webgl2', context, canvas); -}); +(GPU.isSinglePrecisionSupported && GPU.isWebGL2Supported ? test : skip)( + 'webgl2', + () => { + const canvas = document.createElement('canvas'); + const context = canvas.getContext('webgl2'); + testArgument('webgl2', context, canvas); + } +); -(GPU.isSinglePrecisionSupported && GPU.isHeadlessGLSupported ? test : skip)('headlessgl', () => { - testArgument('headlessgl', require('gl')(1, 1), null); -}); +(GPU.isSinglePrecisionSupported && GPU.isHeadlessGLSupported ? test : skip)( + 'headlessgl', + () => { + testArgument('headlessgl', require('gl')(1, 1), null); + } +); test('cpu', () => { testArgument('cpu'); diff --git a/test/features/to-string/precision/single/arguments/float.js b/test/features/to-string/precision/single/arguments/float.js index 3fd99e9f..85726c03 100644 --- a/test/features/to-string/precision/single/arguments/float.js +++ b/test/features/to-string/precision/single/arguments/float.js @@ -1,19 +1,22 @@ const { assert, skip, test, module: describe, only } = require('qunit'); -const { GPU } = require('../../../../../../src'); +const { GPU } = require('../../../../../..'); describe('feature: to-string single precision arguments Float'); function testArgument(mode, context, canvas) { const gpu = new GPU({ mode }); - const originalKernel = gpu.createKernel(function(a) { - return Math.floor(a) === 100 ? 42 : -42; - }, { - canvas, - context, - output: [1], - precision: 'single', - argumentTypes: { a: 'Float' }, - }); + const originalKernel = gpu.createKernel( + function (a) { + return Math.floor(a) === 100 ? 42 : -42; + }, + { + canvas, + context, + output: [1], + precision: 'single', + argumentTypes: { a: 'Float' }, + } + ); assert.equal(originalKernel.argumentTypes[0], 'Float'); assert.deepEqual(originalKernel(100)[0], 42); assert.deepEqual(originalKernel(10)[0], -42); @@ -24,21 +27,30 @@ function testArgument(mode, context, canvas) { gpu.destroy(); } -(GPU.isSinglePrecisionSupported && GPU.isWebGLSupported ? test : skip)('webgl', () => { - const canvas = document.createElement('canvas'); - const context = canvas.getContext('webgl'); - testArgument('webgl', context, canvas); -}); +(GPU.isSinglePrecisionSupported && GPU.isWebGLSupported ? test : skip)( + 'webgl', + () => { + const canvas = document.createElement('canvas'); + const context = canvas.getContext('webgl'); + testArgument('webgl', context, canvas); + } +); -(GPU.isSinglePrecisionSupported && GPU.isWebGL2Supported ? test : skip)('webgl2', () => { - const canvas = document.createElement('canvas'); - const context = canvas.getContext('webgl2'); - testArgument('webgl2', context, canvas); -}); +(GPU.isSinglePrecisionSupported && GPU.isWebGL2Supported ? test : skip)( + 'webgl2', + () => { + const canvas = document.createElement('canvas'); + const context = canvas.getContext('webgl2'); + testArgument('webgl2', context, canvas); + } +); -(GPU.isSinglePrecisionSupported && GPU.isHeadlessGLSupported ? test : skip)('headlessgl', () => { - testArgument('headlessgl', require('gl')(1, 1), null); -}); +(GPU.isSinglePrecisionSupported && GPU.isHeadlessGLSupported ? test : skip)( + 'headlessgl', + () => { + testArgument('headlessgl', require('gl')(1, 1), null); + } +); test('cpu', () => { testArgument('cpu'); diff --git a/test/features/to-string/precision/single/arguments/html-canvas.js b/test/features/to-string/precision/single/arguments/html-canvas.js index 039f1622..02f27b5f 100644 --- a/test/features/to-string/precision/single/arguments/html-canvas.js +++ b/test/features/to-string/precision/single/arguments/html-canvas.js @@ -1,5 +1,5 @@ const { assert, skip, test, module: describe, only } = require('qunit'); -const { GPU } = require('../../../../../../src'); +const { GPU } = require('../../../../../..'); const { greenCanvas } = require('../../../../../browser-test-utils'); describe('feature: to-string single precision arguments HTMLCanvas'); @@ -7,33 +7,43 @@ describe('feature: to-string single precision arguments HTMLCanvas'); function testArgument(mode, done) { const canvasInput1 = greenCanvas(mode, 1, 1); const canvasInput2 = greenCanvas(mode, 1, 1); - const gpu = new GPU({mode}); - const originalKernel = gpu.createKernel(function (canvas1, canvas2) { - const pixel1 = canvas1[this.thread.y][this.thread.x]; - const pixel2 = canvas2[this.thread.y][this.thread.x]; - return pixel1[1] + pixel2[1]; - }, { - output: [1], - precision: 'single', - argumentTypes: ['HTMLCanvas', 'HTMLCanvas'], - }); + const gpu = new GPU({ mode }); + const originalKernel = gpu.createKernel( + function (canvas1, canvas2) { + const pixel1 = canvas1[this.thread.y][this.thread.x]; + const pixel2 = canvas2[this.thread.y][this.thread.x]; + return pixel1[1] + pixel2[1]; + }, + { + output: [1], + precision: 'single', + argumentTypes: ['HTMLCanvas', 'HTMLCanvas'], + } + ); const canvas = originalKernel.canvas; const context = originalKernel.context; assert.deepEqual(originalKernel(canvasInput1, canvasInput2)[0], 2); const kernelString = originalKernel.toString(canvasInput1, canvasInput2); - const newKernel = new Function('return ' + kernelString)()({context, canvas}); + const newKernel = new Function('return ' + kernelString)()({ + context, + canvas, + }); const canvasInput3 = greenCanvas(mode, 1, 1); const canvasInput4 = greenCanvas(mode, 1, 1); assert.deepEqual(newKernel(canvasInput3, canvasInput4)[0], 2); gpu.destroy(); } -(GPU.isSinglePrecisionSupported && GPU.isWebGLSupported ? test : skip)('webgl', () => { - testArgument('webgl'); -}); - -(GPU.isSinglePrecisionSupported && GPU.isWebGL2Supported ? test : skip)('webgl2', () => { - testArgument('webgl2'); -}); - +(GPU.isSinglePrecisionSupported && GPU.isWebGLSupported ? test : skip)( + 'webgl', + () => { + testArgument('webgl'); + } +); +(GPU.isSinglePrecisionSupported && GPU.isWebGL2Supported ? test : skip)( + 'webgl2', + () => { + testArgument('webgl2'); + } +); diff --git a/test/features/to-string/precision/single/arguments/html-image-array.js b/test/features/to-string/precision/single/arguments/html-image-array.js index 2d2a2fe3..cb9c8636 100644 --- a/test/features/to-string/precision/single/arguments/html-image-array.js +++ b/test/features/to-string/precision/single/arguments/html-image-array.js @@ -1,5 +1,5 @@ const { assert, skip, test, module: describe, only } = require('qunit'); -const { GPU, CPUKernel } = require('../../../../../../src'); +const { GPU, CPUKernel } = require('../../../../../..'); describe('feature: to-string single precision arguments HTMLImageArray'); @@ -9,51 +9,66 @@ function testArgument(mode, done) { 'jellyfish-2.jpeg', 'jellyfish-3.jpeg', 'jellyfish-4.jpeg', - ]) - .then(([image1, image2, image3, image4]) => { - const imagesArray1 = [image1, image2]; - const imagesArray2 = [image3, image4]; - const gpu = new GPU({mode}); - const originalKernel = gpu.createKernel(function (a, selection) { + ]).then(([image1, image2, image3, image4]) => { + const imagesArray1 = [image1, image2]; + const imagesArray2 = [image3, image4]; + const gpu = new GPU({ mode }); + const originalKernel = gpu.createKernel( + function (a, selection) { const image0 = a[0][0][0]; const image1 = a[1][0][0]; switch (selection) { - case 0: return image0.r * 255; - case 1: return image1.r * 255; - case 2: return image0.g * 255; - case 3: return image1.g * 255; + case 0: + return image0.r * 255; + case 1: + return image1.r * 255; + case 2: + return image0.g * 255; + case 3: + return image1.g * 255; } - }, { + }, + { output: [1], precision: 'single', argumentTypes: ['HTMLImageArray', 'Integer'], - }); - assert.deepEqual(originalKernel(imagesArray1, 0)[0], 172); - assert.deepEqual(originalKernel(imagesArray1, 1)[0], 255); - assert.deepEqual(originalKernel(imagesArray2, 2)[0], 87); - assert.deepEqual(originalKernel(imagesArray2, 3)[0], 110); - const kernelString = originalKernel.toString(imagesArray1, 0); - const canvas = originalKernel.canvas; - const context = originalKernel.context; - const newKernel = new Function('return ' + kernelString)()({context, canvas}); - assert.deepEqual(newKernel(imagesArray1, 0)[0], 172); - assert.deepEqual(newKernel(imagesArray1, 1)[0], 255); - assert.deepEqual(newKernel(imagesArray2, 2)[0], 87); - assert.deepEqual(newKernel(imagesArray2, 3)[0], 110); - gpu.destroy(); - done(originalKernel, newKernel); + } + ); + assert.deepEqual(originalKernel(imagesArray1, 0)[0], 172); + assert.deepEqual(originalKernel(imagesArray1, 1)[0], 255); + assert.deepEqual(originalKernel(imagesArray2, 2)[0], 87); + assert.deepEqual(originalKernel(imagesArray2, 3)[0], 110); + const kernelString = originalKernel.toString(imagesArray1, 0); + const canvas = originalKernel.canvas; + const context = originalKernel.context; + const newKernel = new Function('return ' + kernelString)()({ + context, + canvas, }); + assert.deepEqual(newKernel(imagesArray1, 0)[0], 172); + assert.deepEqual(newKernel(imagesArray1, 1)[0], 255); + assert.deepEqual(newKernel(imagesArray2, 2)[0], 87); + assert.deepEqual(newKernel(imagesArray2, 3)[0], 110); + gpu.destroy(); + done(originalKernel, newKernel); + }); } -(GPU.isSinglePrecisionSupported && GPU.isWebGLSupported ? test : skip)('webgl', t => { - const done = t.async(); - testArgument('webgl', (kernel) => { - // They aren't supported, so test that kernel falls back - assert.equal(kernel.kernel.constructor, CPUKernel); - done(); - }); -}); +(GPU.isSinglePrecisionSupported && GPU.isWebGLSupported ? test : skip)( + 'webgl', + t => { + const done = t.async(); + testArgument('webgl', kernel => { + // They aren't supported, so test that kernel falls back + assert.equal(kernel.kernel.constructor, CPUKernel); + done(); + }); + } +); -(GPU.isSinglePrecisionSupported && GPU.isWebGL2Supported ? test : skip)('webgl2', t => { - testArgument('webgl2', t.async()); -}); +(GPU.isSinglePrecisionSupported && GPU.isWebGL2Supported ? test : skip)( + 'webgl2', + t => { + testArgument('webgl2', t.async()); + } +); diff --git a/test/features/to-string/precision/single/arguments/html-image.js b/test/features/to-string/precision/single/arguments/html-image.js index d28f811b..e11967e7 100644 --- a/test/features/to-string/precision/single/arguments/html-image.js +++ b/test/features/to-string/precision/single/arguments/html-image.js @@ -1,38 +1,49 @@ const { assert, skip, test, module: describe, only } = require('qunit'); -const { GPU } = require('../../../../../../src'); +const { GPU } = require('../../../../../..'); describe('feature: to-string single precision arguments HTMLImage'); function testArgument(mode, done) { - loadImages(['jellyfish-1.jpeg', 'jellyfish-2.jpeg']) - .then(([image1, image2]) => { - const gpu = new GPU({mode}); - const originalKernel = gpu.createKernel(function (a) { - const pixel = a[0][0]; - return pixel.b * 255; - }, { - output: [1], - precision: 'single', - argumentTypes: ['HTMLImage'], - }); + loadImages(['jellyfish-1.jpeg', 'jellyfish-2.jpeg']).then( + ([image1, image2]) => { + const gpu = new GPU({ mode }); + const originalKernel = gpu.createKernel( + function (a) { + const pixel = a[0][0]; + return pixel.b * 255; + }, + { + output: [1], + precision: 'single', + argumentTypes: ['HTMLImage'], + } + ); const canvas = originalKernel.canvas; const context = originalKernel.context; assert.deepEqual(originalKernel(image1)[0], 253); const kernelString = originalKernel.toString(image1); - const newKernel = new Function('return ' + kernelString)()({context, canvas}); + const newKernel = new Function('return ' + kernelString)()({ + context, + canvas, + }); assert.deepEqual(newKernel(image1)[0], 253); assert.deepEqual(newKernel(image2)[0], 255); gpu.destroy(); done(); - }); + } + ); } -(GPU.isSinglePrecisionSupported && GPU.isWebGLSupported ? test : skip)('webgl', t => { - testArgument('webgl', t.async()); -}); - -(GPU.isSinglePrecisionSupported && GPU.isWebGL2Supported ? test : skip)('webgl2', t => { - testArgument('webgl2', t.async()); -}); - +(GPU.isSinglePrecisionSupported && GPU.isWebGLSupported ? test : skip)( + 'webgl', + t => { + testArgument('webgl', t.async()); + } +); +(GPU.isSinglePrecisionSupported && GPU.isWebGL2Supported ? test : skip)( + 'webgl2', + t => { + testArgument('webgl2', t.async()); + } +); diff --git a/test/features/to-string/precision/single/arguments/html-video.js b/test/features/to-string/precision/single/arguments/html-video.js index be1a938f..e4493473 100644 --- a/test/features/to-string/precision/single/arguments/html-video.js +++ b/test/features/to-string/precision/single/arguments/html-video.js @@ -1,5 +1,5 @@ const { assert, skip, test, module: describe, only } = require('qunit'); -const { GPU } = require('../../../../../../src'); +const { GPU } = require('../../../../../..'); describe('feature: to-string single precision arguments HTMLVideo'); @@ -7,28 +7,34 @@ function testArgument(mode, done) { const video = document.createElement('video'); video.currentTime = 2; video.src = 'jellyfish.webm'; - video.oncanplay = (e) => { + video.oncanplay = e => { video.oncanplay = null; setTimeout(() => { - const gpu = new GPU({mode}); - const originalKernel = gpu.createKernel(function (a) { - const pixel = a[0][0]; - return pixel.g * 255; - }, { - output: [1], - precision: 'single', - argumentTypes: ['HTMLVideo'], - }); + const gpu = new GPU({ mode }); + const originalKernel = gpu.createKernel( + function (a) { + const pixel = a[0][0]; + return pixel.g * 255; + }, + { + output: [1], + precision: 'single', + argumentTypes: ['HTMLVideo'], + } + ); const canvas = originalKernel.canvas; const context = originalKernel.context; assert.deepEqual(originalKernel(video)[0], 125); const kernelString = originalKernel.toString(video); - const newKernel = new Function('return ' + kernelString)()({context, canvas}); + const newKernel = new Function('return ' + kernelString)()({ + context, + canvas, + }); assert.deepEqual(newKernel(video)[0], 125); gpu.destroy(); done(); }, 1000); - } + }; } (GPU.isWebGLSupported ? test : skip)('webgl', t => { @@ -38,5 +44,3 @@ function testArgument(mode, done) { (GPU.isWebGL2Supported ? test : skip)('webgl2', t => { testArgument('webgl2', t.async()); }); - - diff --git a/test/features/to-string/precision/single/arguments/input.js b/test/features/to-string/precision/single/arguments/input.js index 0b87a66a..97a7e387 100644 --- a/test/features/to-string/precision/single/arguments/input.js +++ b/test/features/to-string/precision/single/arguments/input.js @@ -1,26 +1,29 @@ const { assert, skip, test, module: describe, only } = require('qunit'); -const { GPU, input } = require('../../../../../../src'); +const { GPU, input } = require('../../../../../..'); describe('feature: to-string single precision arguments Input'); function testArgument(mode, context, canvas) { const gpu = new GPU({ mode }); - const originalKernel = gpu.createKernel(function(a) { - let sum = 0; - for (let y = 0; y < 2; y++) { - for (let x = 0; x < 2; x++) { - sum += a[y][x]; + const originalKernel = gpu.createKernel( + function (a) { + let sum = 0; + for (let y = 0; y < 2; y++) { + for (let x = 0; x < 2; x++) { + sum += a[y][x]; + } } + return sum; + }, + { + canvas, + context, + output: [1], + precision: 'single', } - return sum; - }, { - canvas, - context, - output: [1], - precision: 'single', - }); - const arg1 = input([1,2,3,4],[2,2]); - const arg2 = input([5,6,7,8],[2,2]); + ); + const arg1 = input([1, 2, 3, 4], [2, 2]); + const arg2 = input([5, 6, 7, 8], [2, 2]); assert.deepEqual(originalKernel(arg1)[0], 10); assert.deepEqual(originalKernel(arg2)[0], 26); const kernelString = originalKernel.toString(arg1); @@ -30,21 +33,30 @@ function testArgument(mode, context, canvas) { gpu.destroy(); } -(GPU.isSinglePrecisionSupported && GPU.isWebGLSupported ? test : skip)('webgl', () => { - const canvas = document.createElement('canvas'); - const context = canvas.getContext('webgl'); - testArgument('webgl', context, canvas); -}); +(GPU.isSinglePrecisionSupported && GPU.isWebGLSupported ? test : skip)( + 'webgl', + () => { + const canvas = document.createElement('canvas'); + const context = canvas.getContext('webgl'); + testArgument('webgl', context, canvas); + } +); -(GPU.isSinglePrecisionSupported && GPU.isWebGL2Supported ? test : skip)('webgl2', () => { - const canvas = document.createElement('canvas'); - const context = canvas.getContext('webgl2'); - testArgument('webgl2', context, canvas); -}); +(GPU.isSinglePrecisionSupported && GPU.isWebGL2Supported ? test : skip)( + 'webgl2', + () => { + const canvas = document.createElement('canvas'); + const context = canvas.getContext('webgl2'); + testArgument('webgl2', context, canvas); + } +); -(GPU.isSinglePrecisionSupported && GPU.isHeadlessGLSupported ? test : skip)('headlessgl', () => { - testArgument('headlessgl', require('gl')(1, 1), null); -}); +(GPU.isSinglePrecisionSupported && GPU.isHeadlessGLSupported ? test : skip)( + 'headlessgl', + () => { + testArgument('headlessgl', require('gl')(1, 1), null); + } +); test('cpu', () => { testArgument('cpu'); diff --git a/test/features/to-string/precision/single/arguments/integer.js b/test/features/to-string/precision/single/arguments/integer.js index f787e503..27def7a6 100644 --- a/test/features/to-string/precision/single/arguments/integer.js +++ b/test/features/to-string/precision/single/arguments/integer.js @@ -1,19 +1,22 @@ const { assert, skip, test, module: describe, only } = require('qunit'); -const { GPU } = require('../../../../../../src'); +const { GPU } = require('../../../../../..'); describe('feature: to-string single precision arguments Integer'); function testArgument(mode, context, canvas) { const gpu = new GPU({ mode }); - const originalKernel = gpu.createKernel(function(a) { - return Math.floor(a) === 100 ? 42 : -42; - }, { - canvas, - context, - output: [1], - precision: 'single', - argumentTypes: { a: 'Integer' }, - }); + const originalKernel = gpu.createKernel( + function (a) { + return Math.floor(a) === 100 ? 42 : -42; + }, + { + canvas, + context, + output: [1], + precision: 'single', + argumentTypes: { a: 'Integer' }, + } + ); assert.equal(originalKernel.argumentTypes[0], 'Integer'); assert.deepEqual(originalKernel(100)[0], 42); assert.deepEqual(originalKernel(10)[0], -42); @@ -24,21 +27,30 @@ function testArgument(mode, context, canvas) { gpu.destroy(); } -(GPU.isSinglePrecisionSupported && GPU.isWebGLSupported ? test : skip)('webgl', () => { - const canvas = document.createElement('canvas'); - const context = canvas.getContext('webgl'); - testArgument('webgl', context, canvas); -}); +(GPU.isSinglePrecisionSupported && GPU.isWebGLSupported ? test : skip)( + 'webgl', + () => { + const canvas = document.createElement('canvas'); + const context = canvas.getContext('webgl'); + testArgument('webgl', context, canvas); + } +); -(GPU.isSinglePrecisionSupported && GPU.isWebGL2Supported ? test : skip)('webgl2', () => { - const canvas = document.createElement('canvas'); - const context = canvas.getContext('webgl2'); - testArgument('webgl2', context, canvas); -}); +(GPU.isSinglePrecisionSupported && GPU.isWebGL2Supported ? test : skip)( + 'webgl2', + () => { + const canvas = document.createElement('canvas'); + const context = canvas.getContext('webgl2'); + testArgument('webgl2', context, canvas); + } +); -(GPU.isSinglePrecisionSupported && GPU.isHeadlessGLSupported ? test : skip)('headlessgl', () => { - testArgument('headlessgl', require('gl')(1, 1), null); -}); +(GPU.isSinglePrecisionSupported && GPU.isHeadlessGLSupported ? test : skip)( + 'headlessgl', + () => { + testArgument('headlessgl', require('gl')(1, 1), null); + } +); test('cpu', () => { testArgument('cpu'); diff --git a/test/features/to-string/precision/single/arguments/memory-optimized-number-texture.js b/test/features/to-string/precision/single/arguments/memory-optimized-number-texture.js index b8e59340..1f66ef00 100644 --- a/test/features/to-string/precision/single/arguments/memory-optimized-number-texture.js +++ b/test/features/to-string/precision/single/arguments/memory-optimized-number-texture.js @@ -1,59 +1,79 @@ const { assert, skip, test, module: describe, only } = require('qunit'); -const { GPU } = require('../../../../../../src'); +const { GPU } = require('../../../../../..'); -describe('feature: to-string single precision arguments MemoryOptimizedNumberTexture'); +describe( + 'feature: to-string single precision arguments MemoryOptimizedNumberTexture' +); function testArgument(mode, context, canvas) { const gpu = new GPU({ mode, context, canvas }); - const texture1 = gpu.createKernel(function() { - return this.thread.x; - }, { - output: [4], - optimizeFloatMemory: true, - precision: 'single', - pipeline: true, - })(); - const texture2 = gpu.createKernel(function() { - return 4 - this.thread.x; - }, { - output: [4], - optimizeFloatMemory: true, - precision: 'single', - pipeline: true, - })(); - const originalKernel = gpu.createKernel(function(a) { - return a[this.thread.x]; - }, { - canvas, - context, - output: [4], - precision: 'single' - }); - assert.deepEqual(originalKernel(texture1), new Float32Array([0,1,2,3])); - assert.deepEqual(originalKernel(texture2), new Float32Array([4,3,2,1])); + const texture1 = gpu.createKernel( + function () { + return this.thread.x; + }, + { + output: [4], + optimizeFloatMemory: true, + precision: 'single', + pipeline: true, + } + )(); + const texture2 = gpu.createKernel( + function () { + return 4 - this.thread.x; + }, + { + output: [4], + optimizeFloatMemory: true, + precision: 'single', + pipeline: true, + } + )(); + const originalKernel = gpu.createKernel( + function (a) { + return a[this.thread.x]; + }, + { + canvas, + context, + output: [4], + precision: 'single', + } + ); + assert.deepEqual(originalKernel(texture1), new Float32Array([0, 1, 2, 3])); + assert.deepEqual(originalKernel(texture2), new Float32Array([4, 3, 2, 1])); const kernelString = originalKernel.toString(texture1); const newKernel = new Function('return ' + kernelString)()({ context }); - assert.deepEqual(newKernel(texture1), new Float32Array([0,1,2,3])); - assert.deepEqual(newKernel(texture2), new Float32Array([4,3,2,1])); + assert.deepEqual(newKernel(texture1), new Float32Array([0, 1, 2, 3])); + assert.deepEqual(newKernel(texture2), new Float32Array([4, 3, 2, 1])); gpu.destroy(); } -(GPU.isSinglePrecisionSupported && GPU.isWebGLSupported ? test : skip)('webgl', () => { - const canvas = document.createElement('canvas'); - const context = canvas.getContext('webgl'); - testArgument('webgl', context, canvas); -}); +(GPU.isSinglePrecisionSupported && GPU.isWebGLSupported ? test : skip)( + 'webgl', + () => { + const canvas = document.createElement('canvas'); + const context = canvas.getContext('webgl'); + testArgument('webgl', context, canvas); + } +); -(GPU.isSinglePrecisionSupported && GPU.isWebGL2Supported ? test : skip)('webgl2', () => { - const canvas = document.createElement('canvas'); - const context = canvas.getContext('webgl2'); - testArgument('webgl2', context, canvas); -}); +(GPU.isSinglePrecisionSupported && GPU.isWebGL2Supported ? test : skip)( + 'webgl2', + () => { + const canvas = document.createElement('canvas'); + const context = canvas.getContext('webgl2'); + testArgument('webgl2', context, canvas); + } +); -(GPU.isSinglePrecisionSupported && GPU.isHeadlessGLSupported ? test : skip)('headlessgl', () => { - testArgument('headlessgl', require('gl')(1, 1), null); -}); +(GPU.isSinglePrecisionSupported && GPU.isHeadlessGLSupported ? test : skip)( + 'headlessgl', + () => { + testArgument('headlessgl', require('gl')(1, 1), null); + } +); test('cpu', () => { testArgument('cpu'); diff --git a/test/features/to-string/precision/single/arguments/number-texture.js b/test/features/to-string/precision/single/arguments/number-texture.js index 36b80b5c..3f203204 100644 --- a/test/features/to-string/precision/single/arguments/number-texture.js +++ b/test/features/to-string/precision/single/arguments/number-texture.js @@ -1,59 +1,77 @@ const { assert, skip, test, module: describe, only } = require('qunit'); -const { GPU } = require('../../../../../../src'); +const { GPU } = require('../../../../../..'); describe('feature: to-string single precision arguments NumberTexture'); function testArgument(mode, context, canvas) { const gpu = new GPU({ mode, context, canvas }); - const texture1 = gpu.createKernel(function() { - return this.thread.x; - }, { - output: [4], - optimizeFloatMemory: false, - precision: 'single', - pipeline: true, - })(); - const texture2 = gpu.createKernel(function() { - return 4 - this.thread.x; - }, { - output: [4], - optimizeFloatMemory: false, - precision: 'single', - pipeline: true, - })(); - const originalKernel = gpu.createKernel(function(a) { - return a[this.thread.x]; - }, { - canvas, - context, - output: [4], - precision: 'single' - }); - assert.deepEqual(originalKernel(texture1), new Float32Array([0,1,2,3])); - assert.deepEqual(originalKernel(texture2), new Float32Array([4,3,2,1])); + const texture1 = gpu.createKernel( + function () { + return this.thread.x; + }, + { + output: [4], + optimizeFloatMemory: false, + precision: 'single', + pipeline: true, + } + )(); + const texture2 = gpu.createKernel( + function () { + return 4 - this.thread.x; + }, + { + output: [4], + optimizeFloatMemory: false, + precision: 'single', + pipeline: true, + } + )(); + const originalKernel = gpu.createKernel( + function (a) { + return a[this.thread.x]; + }, + { + canvas, + context, + output: [4], + precision: 'single', + } + ); + assert.deepEqual(originalKernel(texture1), new Float32Array([0, 1, 2, 3])); + assert.deepEqual(originalKernel(texture2), new Float32Array([4, 3, 2, 1])); const kernelString = originalKernel.toString(texture1); const newKernel = new Function('return ' + kernelString)()({ context }); - assert.deepEqual(newKernel(texture1), new Float32Array([0,1,2,3])); - assert.deepEqual(newKernel(texture2), new Float32Array([4,3,2,1])); + assert.deepEqual(newKernel(texture1), new Float32Array([0, 1, 2, 3])); + assert.deepEqual(newKernel(texture2), new Float32Array([4, 3, 2, 1])); gpu.destroy(); } -(GPU.isSinglePrecisionSupported && GPU.isWebGLSupported ? test : skip)('webgl', () => { - const canvas = document.createElement('canvas'); - const context = canvas.getContext('webgl'); - testArgument('webgl', context, canvas); -}); +(GPU.isSinglePrecisionSupported && GPU.isWebGLSupported ? test : skip)( + 'webgl', + () => { + const canvas = document.createElement('canvas'); + const context = canvas.getContext('webgl'); + testArgument('webgl', context, canvas); + } +); -(GPU.isSinglePrecisionSupported && GPU.isWebGL2Supported ? test : skip)('webgl2', () => { - const canvas = document.createElement('canvas'); - const context = canvas.getContext('webgl2'); - testArgument('webgl2', context, canvas); -}); +(GPU.isSinglePrecisionSupported && GPU.isWebGL2Supported ? test : skip)( + 'webgl2', + () => { + const canvas = document.createElement('canvas'); + const context = canvas.getContext('webgl2'); + testArgument('webgl2', context, canvas); + } +); -(GPU.isSinglePrecisionSupported && GPU.isHeadlessGLSupported ? test : skip)('headlessgl', () => { - testArgument('headlessgl', require('gl')(1, 1), null); -}); +(GPU.isSinglePrecisionSupported && GPU.isHeadlessGLSupported ? test : skip)( + 'headlessgl', + () => { + testArgument('headlessgl', require('gl')(1, 1), null); + } +); test('cpu', () => { testArgument('cpu'); diff --git a/test/features/to-string/precision/single/constants/array.js b/test/features/to-string/precision/single/constants/array.js index 876d39ad..06a118c6 100644 --- a/test/features/to-string/precision/single/constants/array.js +++ b/test/features/to-string/precision/single/constants/array.js @@ -1,49 +1,67 @@ const { assert, skip, test, module: describe, only } = require('qunit'); -const { GPU } = require('../../../../../../src'); +const { GPU } = require('../../../../../..'); describe('feature: to-string single precision constants Array'); function testConstant(mode, context, canvas) { const gpu = new GPU({ mode }); - const originalKernel = gpu.createKernel(function() { - return this.constants.a[this.thread.x]; - }, { - canvas, - context, - output: [4], - precision: 'single', - constants: { - a: [1, 2, 3, 4] + const originalKernel = gpu.createKernel( + function () { + return this.constants.a[this.thread.x]; + }, + { + canvas, + context, + output: [4], + precision: 'single', + constants: { + a: [1, 2, 3, 4], + }, } - }); - const expected = new Float32Array([1,2,3,4]); + ); + const expected = new Float32Array([1, 2, 3, 4]); const originalResult = originalKernel(); assert.deepEqual(originalResult, expected); const kernelString = originalKernel.toString(); - const newResult = new Function('return ' + kernelString)()({ context, constants: { a: [1, 2, 3, 4] } })(); + const newResult = new Function('return ' + kernelString)()({ + context, + constants: { a: [1, 2, 3, 4] }, + })(); assert.deepEqual(newResult, expected); - const expected2 = new Float32Array([4,3,2,1]); - const newResult2 = new Function('return ' + kernelString)()({ context, constants: { a: [4, 3, 2, 1] } })(); + const expected2 = new Float32Array([4, 3, 2, 1]); + const newResult2 = new Function('return ' + kernelString)()({ + context, + constants: { a: [4, 3, 2, 1] }, + })(); assert.deepEqual(newResult2, expected2); gpu.destroy(); } -(GPU.isSinglePrecisionSupported && GPU.isWebGLSupported ? test : skip)('webgl', () => { - const canvas = document.createElement('canvas'); - const context = canvas.getContext('webgl'); - testConstant('webgl', context, canvas); -}); +(GPU.isSinglePrecisionSupported && GPU.isWebGLSupported ? test : skip)( + 'webgl', + () => { + const canvas = document.createElement('canvas'); + const context = canvas.getContext('webgl'); + testConstant('webgl', context, canvas); + } +); -(GPU.isSinglePrecisionSupported && GPU.isWebGL2Supported ? test : skip)('webgl2', () => { - const canvas = document.createElement('canvas'); - const context = canvas.getContext('webgl2'); - testConstant('webgl2', context, canvas); -}); +(GPU.isSinglePrecisionSupported && GPU.isWebGL2Supported ? test : skip)( + 'webgl2', + () => { + const canvas = document.createElement('canvas'); + const context = canvas.getContext('webgl2'); + testConstant('webgl2', context, canvas); + } +); -(GPU.isSinglePrecisionSupported && GPU.isHeadlessGLSupported ? test : skip)('headlessgl', () => { - testConstant('headlessgl', require('gl')(1, 1), null); -}); +(GPU.isSinglePrecisionSupported && GPU.isHeadlessGLSupported ? test : skip)( + 'headlessgl', + () => { + testConstant('headlessgl', require('gl')(1, 1), null); + } +); test('cpu', () => { testConstant('cpu'); diff --git a/test/features/to-string/precision/single/constants/array2.js b/test/features/to-string/precision/single/constants/array2.js index 3e548306..11967c22 100644 --- a/test/features/to-string/precision/single/constants/array2.js +++ b/test/features/to-string/precision/single/constants/array2.js @@ -1,53 +1,71 @@ const { assert, skip, test, module: describe, only } = require('qunit'); -const { GPU } = require('../../../../../../src'); +const { GPU } = require('../../../../../..'); describe('feature: to-string single precision constants Array(2)'); function testConstant(mode, context, canvas) { const gpu = new GPU({ mode }); - const originalKernel = gpu.createKernel(function() { - return this.constants.a; - }, { - canvas, - context, - output: [1], - precision: 'single', - constants: { - a: new Float32Array([1, 2]) + const originalKernel = gpu.createKernel( + function () { + return this.constants.a; }, - constantTypes: { - a: 'Array(2)' + { + canvas, + context, + output: [1], + precision: 'single', + constants: { + a: new Float32Array([1, 2]), + }, + constantTypes: { + a: 'Array(2)', + }, } - }); + ); const expected = [new Float32Array([1, 2])]; const originalResult = originalKernel(); assert.deepEqual(originalResult, expected); const kernelString = originalKernel.toString(); const Kernel = new Function('return ' + kernelString)(); - const newResult = Kernel({ context, constants: { a: new Float32Array([1, 2]) } })(); + const newResult = Kernel({ + context, + constants: { a: new Float32Array([1, 2]) }, + })(); assert.deepEqual(newResult, expected); // Array(2) is "sticky" as a constant, and cannot reset - const newResult2 = Kernel({ context, constants: { a: new Float32Array([2, 1]) } })(); + const newResult2 = Kernel({ + context, + constants: { a: new Float32Array([2, 1]) }, + })(); assert.deepEqual(newResult2, expected); gpu.destroy(); } -(GPU.isSinglePrecisionSupported && GPU.isWebGLSupported ? test : skip)('webgl', () => { - const canvas = document.createElement('canvas'); - const context = canvas.getContext('webgl'); - testConstant('webgl', context, canvas); -}); +(GPU.isSinglePrecisionSupported && GPU.isWebGLSupported ? test : skip)( + 'webgl', + () => { + const canvas = document.createElement('canvas'); + const context = canvas.getContext('webgl'); + testConstant('webgl', context, canvas); + } +); -(GPU.isSinglePrecisionSupported && GPU.isWebGL2Supported ? test : skip)('webgl2', () => { - const canvas = document.createElement('canvas'); - const context = canvas.getContext('webgl2'); - testConstant('webgl2', context, canvas); -}); +(GPU.isSinglePrecisionSupported && GPU.isWebGL2Supported ? test : skip)( + 'webgl2', + () => { + const canvas = document.createElement('canvas'); + const context = canvas.getContext('webgl2'); + testConstant('webgl2', context, canvas); + } +); -(GPU.isSinglePrecisionSupported && GPU.isHeadlessGLSupported ? test : skip)('headlessgl', () => { - testConstant('headlessgl', require('gl')(1, 1), null); -}); +(GPU.isSinglePrecisionSupported && GPU.isHeadlessGLSupported ? test : skip)( + 'headlessgl', + () => { + testConstant('headlessgl', require('gl')(1, 1), null); + } +); test('cpu', () => { testConstant('cpu'); diff --git a/test/features/to-string/precision/single/constants/array2d.js b/test/features/to-string/precision/single/constants/array2d.js index c48af645..493d996a 100644 --- a/test/features/to-string/precision/single/constants/array2d.js +++ b/test/features/to-string/precision/single/constants/array2d.js @@ -1,5 +1,5 @@ const { assert, skip, test, module: describe, only } = require('qunit'); -const { GPU } = require('../../../../../../src'); +const { GPU } = require('../../../../../..'); describe('feature: to-string single precision constants 2d Array'); @@ -11,22 +11,25 @@ function testConstant(mode, context, canvas) { [9, 10, 11, 12], [13, 14, 15, 16], ]; - const originalKernel = gpu.createKernel(function() { - let sum = 0; - for (let y = 0; y < 4; y++) { - sum += this.constants.a[y][this.thread.x]; + const originalKernel = gpu.createKernel( + function () { + let sum = 0; + for (let y = 0; y < 4; y++) { + sum += this.constants.a[y][this.thread.x]; + } + return sum; + }, + { + canvas, + context, + output: [4], + precision: 'single', + constants: { + a, + }, } - return sum; - }, { - canvas, - context, - output: [4], - precision: 'single', - constants: { - a - } - }); - const expected = new Float32Array([28,32,36,40]); + ); + const expected = new Float32Array([28, 32, 36, 40]); const originalResult = originalKernel(); assert.deepEqual(originalResult, expected); const kernelString = originalKernel.toString(); @@ -40,27 +43,36 @@ function testConstant(mode, context, canvas) { [1, 1, 1, 1], [1, 1, 1, 1], ]; - const expected2 = new Float32Array([4,4,4,4]); + const expected2 = new Float32Array([4, 4, 4, 4]); const newResult2 = Kernel({ context, constants: { a: b } })(); assert.deepEqual(newResult2, expected2); gpu.destroy(); } -(GPU.isSinglePrecisionSupported && GPU.isWebGLSupported ? test : skip)('webgl', () => { - const canvas = document.createElement('canvas'); - const context = canvas.getContext('webgl'); - testConstant('webgl', context, canvas); -}); +(GPU.isSinglePrecisionSupported && GPU.isWebGLSupported ? test : skip)( + 'webgl', + () => { + const canvas = document.createElement('canvas'); + const context = canvas.getContext('webgl'); + testConstant('webgl', context, canvas); + } +); -(GPU.isSinglePrecisionSupported && GPU.isWebGL2Supported ? test : skip)('webgl2', () => { - const canvas = document.createElement('canvas'); - const context = canvas.getContext('webgl2'); - testConstant('webgl2', context, canvas); -}); +(GPU.isSinglePrecisionSupported && GPU.isWebGL2Supported ? test : skip)( + 'webgl2', + () => { + const canvas = document.createElement('canvas'); + const context = canvas.getContext('webgl2'); + testConstant('webgl2', context, canvas); + } +); -(GPU.isSinglePrecisionSupported && GPU.isHeadlessGLSupported ? test : skip)('headlessgl', () => { - testConstant('headlessgl', require('gl')(1, 1), null); -}); +(GPU.isSinglePrecisionSupported && GPU.isHeadlessGLSupported ? test : skip)( + 'headlessgl', + () => { + testConstant('headlessgl', require('gl')(1, 1), null); + } +); test('cpu', () => { testConstant('cpu'); diff --git a/test/features/to-string/precision/single/constants/array3.js b/test/features/to-string/precision/single/constants/array3.js index e1aee848..b88b1e68 100644 --- a/test/features/to-string/precision/single/constants/array3.js +++ b/test/features/to-string/precision/single/constants/array3.js @@ -1,53 +1,71 @@ const { assert, skip, test, module: describe, only } = require('qunit'); -const { GPU } = require('../../../../../../src'); +const { GPU } = require('../../../../../..'); describe('feature: to-string single precision constants Array(3)'); function testConstant(mode, context, canvas) { const gpu = new GPU({ mode }); - const originalKernel = gpu.createKernel(function() { - return this.constants.a; - }, { - canvas, - context, - output: [1], - precision: 'single', - constants: { - a: new Float32Array([1, 2, 3]) + const originalKernel = gpu.createKernel( + function () { + return this.constants.a; }, - constantTypes: { - a: 'Array(3)' + { + canvas, + context, + output: [1], + precision: 'single', + constants: { + a: new Float32Array([1, 2, 3]), + }, + constantTypes: { + a: 'Array(3)', + }, } - }); + ); const expected = [new Float32Array([1, 2, 3])]; const originalResult = originalKernel(); assert.deepEqual(originalResult, expected); const kernelString = originalKernel.toString(); const Kernel = new Function('return ' + kernelString)(); - const newResult = Kernel({ context, constants: { a: new Float32Array([1, 2, 3]) } })(); + const newResult = Kernel({ + context, + constants: { a: new Float32Array([1, 2, 3]) }, + })(); assert.deepEqual(newResult, expected); // Array(3) is "sticky" as a constant, and cannot reset - const newResult2 = Kernel({ context, constants: { a: new Float32Array([3, 2, 1]) } })(); + const newResult2 = Kernel({ + context, + constants: { a: new Float32Array([3, 2, 1]) }, + })(); assert.deepEqual(newResult2, expected); gpu.destroy(); } -(GPU.isSinglePrecisionSupported && GPU.isWebGLSupported ? test : skip)('webgl', () => { - const canvas = document.createElement('canvas'); - const context = canvas.getContext('webgl'); - testConstant('webgl', context, canvas); -}); +(GPU.isSinglePrecisionSupported && GPU.isWebGLSupported ? test : skip)( + 'webgl', + () => { + const canvas = document.createElement('canvas'); + const context = canvas.getContext('webgl'); + testConstant('webgl', context, canvas); + } +); -(GPU.isSinglePrecisionSupported && GPU.isWebGL2Supported ? test : skip)('webgl2', () => { - const canvas = document.createElement('canvas'); - const context = canvas.getContext('webgl2'); - testConstant('webgl2', context, canvas); -}); +(GPU.isSinglePrecisionSupported && GPU.isWebGL2Supported ? test : skip)( + 'webgl2', + () => { + const canvas = document.createElement('canvas'); + const context = canvas.getContext('webgl2'); + testConstant('webgl2', context, canvas); + } +); -(GPU.isSinglePrecisionSupported && GPU.isHeadlessGLSupported ? test : skip)('headlessgl', () => { - testConstant('headlessgl', require('gl')(1, 1), null); -}); +(GPU.isSinglePrecisionSupported && GPU.isHeadlessGLSupported ? test : skip)( + 'headlessgl', + () => { + testConstant('headlessgl', require('gl')(1, 1), null); + } +); test('cpu', () => { testConstant('cpu'); diff --git a/test/features/to-string/precision/single/constants/array3d.js b/test/features/to-string/precision/single/constants/array3d.js index 784ad56d..4f76dd59 100644 --- a/test/features/to-string/precision/single/constants/array3d.js +++ b/test/features/to-string/precision/single/constants/array3d.js @@ -1,5 +1,5 @@ const { assert, skip, test, module: describe, only } = require('qunit'); -const { GPU } = require('../../../../../../src'); +const { GPU } = require('../../../../../..'); describe('feature: to-string single precision constants 3d Array'); @@ -13,25 +13,28 @@ function testConstant(mode, context, canvas) { [ [5, 6], [7, 8], - ] + ], ]; - const originalKernel = gpu.createKernel(function() { - let sum = 0; - for (let z = 0; z < 2; z++) { - for (let y = 0; y < 2; y++) { - sum += this.constants.a[z][y][this.thread.x]; + const originalKernel = gpu.createKernel( + function () { + let sum = 0; + for (let z = 0; z < 2; z++) { + for (let y = 0; y < 2; y++) { + sum += this.constants.a[z][y][this.thread.x]; + } } + return sum; + }, + { + canvas, + context, + output: [2], + precision: 'single', + constants: { + a, + }, } - return sum; - }, { - canvas, - context, - output: [2], - precision: 'single', - constants: { - a - } - }); + ); const expected = new Float32Array([16, 20]); const originalResult = originalKernel(); @@ -41,7 +44,6 @@ function testConstant(mode, context, canvas) { const newResult = Kernel({ context, constants: { a } })(); assert.deepEqual(newResult, expected); - const b = [ [ [1, 1], @@ -50,7 +52,7 @@ function testConstant(mode, context, canvas) { [ [1, 1], [1, 1], - ] + ], ]; const newResult2 = Kernel({ context, constants: { a: b } })(); const expected2 = new Float32Array([4, 4]); @@ -58,21 +60,30 @@ function testConstant(mode, context, canvas) { gpu.destroy(); } -(GPU.isSinglePrecisionSupported && GPU.isWebGLSupported ? test : skip)('webgl', () => { - const canvas = document.createElement('canvas'); - const context = canvas.getContext('webgl'); - testConstant('webgl', context, canvas); -}); +(GPU.isSinglePrecisionSupported && GPU.isWebGLSupported ? test : skip)( + 'webgl', + () => { + const canvas = document.createElement('canvas'); + const context = canvas.getContext('webgl'); + testConstant('webgl', context, canvas); + } +); -(GPU.isSinglePrecisionSupported && GPU.isWebGL2Supported ? test : skip)('webgl2', () => { - const canvas = document.createElement('canvas'); - const context = canvas.getContext('webgl2'); - testConstant('webgl2', context, canvas); -}); +(GPU.isSinglePrecisionSupported && GPU.isWebGL2Supported ? test : skip)( + 'webgl2', + () => { + const canvas = document.createElement('canvas'); + const context = canvas.getContext('webgl2'); + testConstant('webgl2', context, canvas); + } +); -(GPU.isSinglePrecisionSupported && GPU.isHeadlessGLSupported ? test : skip)('headlessgl', () => { - testConstant('headlessgl', require('gl')(1, 1), null); -}); +(GPU.isSinglePrecisionSupported && GPU.isHeadlessGLSupported ? test : skip)( + 'headlessgl', + () => { + testConstant('headlessgl', require('gl')(1, 1), null); + } +); test('cpu', () => { testConstant('cpu'); diff --git a/test/features/to-string/precision/single/constants/array4.js b/test/features/to-string/precision/single/constants/array4.js index 3290d304..8faaabc2 100644 --- a/test/features/to-string/precision/single/constants/array4.js +++ b/test/features/to-string/precision/single/constants/array4.js @@ -1,55 +1,73 @@ const { assert, skip, test, module: describe, only } = require('qunit'); -const { GPU } = require('../../../../../../src'); +const { GPU } = require('../../../../../..'); describe('feature: to-string single precision constants Array(4)'); function testConstant(mode, context, canvas) { const gpu = new GPU({ mode }); const a = new Float32Array([1, 2, 3, 4]); - const originalKernel = gpu.createKernel(function() { - return this.constants.a; - }, { - canvas, - context, - output: [1], - precision: 'single', - constants: { - a + const originalKernel = gpu.createKernel( + function () { + return this.constants.a; }, - constantTypes: { - a: 'Array(4)' + { + canvas, + context, + output: [1], + precision: 'single', + constants: { + a, + }, + constantTypes: { + a: 'Array(4)', + }, } - }); + ); const expected = [new Float32Array([1, 2, 3, 4])]; const originalResult = originalKernel(); assert.deepEqual(originalResult, expected); const kernelString = originalKernel.toString(); - const newResult = new Function('return ' + kernelString)()({ context, constants: { a } })(); + const newResult = new Function('return ' + kernelString)()({ + context, + constants: { a }, + })(); assert.deepEqual(newResult, expected); // Array(3) is "sticky" as a constant, and cannot reset const b = new Float32Array([4, 3, 2, 1]); const expected2 = [new Float32Array([1, 2, 3, 4])]; - const newResult2 = new Function('return ' + kernelString)()({ context, constants: { a: b } })(); + const newResult2 = new Function('return ' + kernelString)()({ + context, + constants: { a: b }, + })(); assert.deepEqual(newResult2, expected2); gpu.destroy(); } -(GPU.isSinglePrecisionSupported && GPU.isWebGLSupported ? test : skip)('webgl', () => { - const canvas = document.createElement('canvas'); - const context = canvas.getContext('webgl'); - testConstant('webgl', context, canvas); -}); +(GPU.isSinglePrecisionSupported && GPU.isWebGLSupported ? test : skip)( + 'webgl', + () => { + const canvas = document.createElement('canvas'); + const context = canvas.getContext('webgl'); + testConstant('webgl', context, canvas); + } +); -(GPU.isSinglePrecisionSupported && GPU.isWebGL2Supported ? test : skip)('webgl2', () => { - const canvas = document.createElement('canvas'); - const context = canvas.getContext('webgl2'); - testConstant('webgl2', context, canvas); -}); +(GPU.isSinglePrecisionSupported && GPU.isWebGL2Supported ? test : skip)( + 'webgl2', + () => { + const canvas = document.createElement('canvas'); + const context = canvas.getContext('webgl2'); + testConstant('webgl2', context, canvas); + } +); -(GPU.isSinglePrecisionSupported && GPU.isHeadlessGLSupported ? test : skip)('headlessgl', () => { - testConstant('headlessgl', require('gl')(1, 1), null); -}); +(GPU.isSinglePrecisionSupported && GPU.isHeadlessGLSupported ? test : skip)( + 'headlessgl', + () => { + testConstant('headlessgl', require('gl')(1, 1), null); + } +); test('cpu', () => { testConstant('cpu'); diff --git a/test/features/to-string/precision/single/constants/boolean.js b/test/features/to-string/precision/single/constants/boolean.js index a1bb6f5a..691d5a94 100644 --- a/test/features/to-string/precision/single/constants/boolean.js +++ b/test/features/to-string/precision/single/constants/boolean.js @@ -1,32 +1,38 @@ const { assert, skip, test, module: describe, only } = require('qunit'); -const { GPU } = require('../../../../../../src'); +const { GPU } = require('../../../../../..'); describe('feature: to-string single precision constants Boolean'); function testConstant(mode, context, canvas) { const gpu = new GPU({ mode }); - const originalKernel1 = gpu.createKernel(function() { - return this.constants.a ? 42 : -42; - }, { - canvas, - context, - output: [1], - precision: 'single', - constants: { - a: true + const originalKernel1 = gpu.createKernel( + function () { + return this.constants.a ? 42 : -42; + }, + { + canvas, + context, + output: [1], + precision: 'single', + constants: { + a: true, + }, } - }); - const originalKernel2 = gpu.createKernel(function() { - return this.constants.a ? 42 : -42; - }, { - canvas, - context, - output: [1], - precision: 'single', - constants: { - a: false + ); + const originalKernel2 = gpu.createKernel( + function () { + return this.constants.a ? 42 : -42; + }, + { + canvas, + context, + output: [1], + precision: 'single', + constants: { + a: false, + }, } - }); + ); assert.deepEqual(originalKernel1()[0], 42); assert.deepEqual(originalKernel2()[0], -42); const kernelString1 = originalKernel1.toString(); @@ -46,21 +52,30 @@ function testConstant(mode, context, canvas) { gpu.destroy(); } -(GPU.isSinglePrecisionSupported && GPU.isWebGLSupported ? test : skip)('webgl', () => { - const canvas = document.createElement('canvas'); - const context = canvas.getContext('webgl'); - testConstant('webgl', context, canvas); -}); +(GPU.isSinglePrecisionSupported && GPU.isWebGLSupported ? test : skip)( + 'webgl', + () => { + const canvas = document.createElement('canvas'); + const context = canvas.getContext('webgl'); + testConstant('webgl', context, canvas); + } +); -(GPU.isSinglePrecisionSupported && GPU.isWebGL2Supported ? test : skip)('webgl2', () => { - const canvas = document.createElement('canvas'); - const context = canvas.getContext('webgl2'); - testConstant('webgl2', context, canvas); -}); +(GPU.isSinglePrecisionSupported && GPU.isWebGL2Supported ? test : skip)( + 'webgl2', + () => { + const canvas = document.createElement('canvas'); + const context = canvas.getContext('webgl2'); + testConstant('webgl2', context, canvas); + } +); -(GPU.isSinglePrecisionSupported && GPU.isHeadlessGLSupported ? test : skip)('headlessgl', () => { - testConstant('headlessgl', require('gl')(1, 1), null); -}); +(GPU.isSinglePrecisionSupported && GPU.isHeadlessGLSupported ? test : skip)( + 'headlessgl', + () => { + testConstant('headlessgl', require('gl')(1, 1), null); + } +); test('cpu', () => { testConstant('cpu'); diff --git a/test/features/to-string/precision/single/constants/float.js b/test/features/to-string/precision/single/constants/float.js index 551a24b4..462f31ca 100644 --- a/test/features/to-string/precision/single/constants/float.js +++ b/test/features/to-string/precision/single/constants/float.js @@ -1,22 +1,25 @@ const { assert, skip, test, module: describe, only } = require('qunit'); -const { GPU } = require('../../../../../../src'); +const { GPU } = require('../../../../../..'); describe('feature: to-string single precision constants Float'); function testConstant(mode, context, canvas) { const gpu = new GPU({ mode }); - const originalKernel = gpu.createKernel(function() { - return Math.floor(this.constants.a) === 100 ? 42 : -42; - }, { - canvas, - context, - output: [1], - precision: 'single', - constants: { - a: 100 + const originalKernel = gpu.createKernel( + function () { + return Math.floor(this.constants.a) === 100 ? 42 : -42; }, - constantTypes: { a: 'Float' } - }); + { + canvas, + context, + output: [1], + precision: 'single', + constants: { + a: 100, + }, + constantTypes: { a: 'Float' }, + } + ); assert.equal(originalKernel.constantTypes.a, 'Float'); assert.deepEqual(originalKernel()[0], 42); const kernelString = originalKernel.toString(); @@ -28,21 +31,30 @@ function testConstant(mode, context, canvas) { gpu.destroy(); } -(GPU.isSinglePrecisionSupported && GPU.isWebGLSupported ? test : skip)('webgl', () => { - const canvas = document.createElement('canvas'); - const context = canvas.getContext('webgl'); - testConstant('webgl', context, canvas); -}); +(GPU.isSinglePrecisionSupported && GPU.isWebGLSupported ? test : skip)( + 'webgl', + () => { + const canvas = document.createElement('canvas'); + const context = canvas.getContext('webgl'); + testConstant('webgl', context, canvas); + } +); -(GPU.isSinglePrecisionSupported && GPU.isWebGL2Supported ? test : skip)('webgl2', () => { - const canvas = document.createElement('canvas'); - const context = canvas.getContext('webgl2'); - testConstant('webgl2', context, canvas); -}); +(GPU.isSinglePrecisionSupported && GPU.isWebGL2Supported ? test : skip)( + 'webgl2', + () => { + const canvas = document.createElement('canvas'); + const context = canvas.getContext('webgl2'); + testConstant('webgl2', context, canvas); + } +); -(GPU.isSinglePrecisionSupported && GPU.isHeadlessGLSupported ? test : skip)('headlessgl', () => { - testConstant('headlessgl', require('gl')(1, 1), null); -}); +(GPU.isSinglePrecisionSupported && GPU.isHeadlessGLSupported ? test : skip)( + 'headlessgl', + () => { + testConstant('headlessgl', require('gl')(1, 1), null); + } +); test('cpu', () => { testConstant('cpu'); diff --git a/test/features/to-string/precision/single/constants/html-canvas.js b/test/features/to-string/precision/single/constants/html-canvas.js index fb9eac43..0d7a6d6a 100644 --- a/test/features/to-string/precision/single/constants/html-canvas.js +++ b/test/features/to-string/precision/single/constants/html-canvas.js @@ -1,5 +1,5 @@ const { assert, skip, test, module: describe, only } = require('qunit'); -const { GPU } = require('../../../../../../src'); +const { GPU } = require('../../../../../..'); const { greenCanvas } = require('../../../../../browser-test-utils'); describe('feature: to-string single precision constants HTMLCanvas'); @@ -7,16 +7,19 @@ describe('feature: to-string single precision constants HTMLCanvas'); function testArgument(mode, done) { const canvasInput1 = greenCanvas(mode, 1, 1); const canvasInput2 = greenCanvas(mode, 1, 1); - const gpu = new GPU({mode}); - const originalKernel = gpu.createKernel(function () { - const pixel1 = this.constants.canvas1[this.thread.y][this.thread.x]; - const pixel2 = this.constants.canvas2[this.thread.y][this.thread.x]; - return pixel1[1] + pixel2[1]; - }, { - output: [1], - precision: 'single', - constants: { canvas1: canvasInput1, canvas2: canvasInput2 } - }); + const gpu = new GPU({ mode }); + const originalKernel = gpu.createKernel( + function () { + const pixel1 = this.constants.canvas1[this.thread.y][this.thread.x]; + const pixel2 = this.constants.canvas2[this.thread.y][this.thread.x]; + return pixel1[1] + pixel2[1]; + }, + { + output: [1], + precision: 'single', + constants: { canvas1: canvasInput1, canvas2: canvasInput2 }, + } + ); const canvas = originalKernel.canvas; const context = originalKernel.context; assert.deepEqual(originalKernel()[0], 2); @@ -28,19 +31,23 @@ function testArgument(mode, done) { canvas, constants: { canvas1: canvasInput3, - canvas2: canvasInput4 - } + canvas2: canvasInput4, + }, }); assert.deepEqual(newKernel()[0], 2); gpu.destroy(); } -(GPU.isSinglePrecisionSupported && GPU.isWebGLSupported ? test : skip)('webgl', () => { - testArgument('webgl'); -}); - -(GPU.isSinglePrecisionSupported && GPU.isWebGL2Supported ? test : skip)('webgl2', () => { - testArgument('webgl2'); -}); - +(GPU.isSinglePrecisionSupported && GPU.isWebGLSupported ? test : skip)( + 'webgl', + () => { + testArgument('webgl'); + } +); +(GPU.isSinglePrecisionSupported && GPU.isWebGL2Supported ? test : skip)( + 'webgl2', + () => { + testArgument('webgl2'); + } +); diff --git a/test/features/to-string/precision/single/constants/html-image-array.js b/test/features/to-string/precision/single/constants/html-image-array.js index a7b0a3a4..aff11f6b 100644 --- a/test/features/to-string/precision/single/constants/html-image-array.js +++ b/test/features/to-string/precision/single/constants/html-image-array.js @@ -1,5 +1,5 @@ const { assert, skip, test, module: describe, only } = require('qunit'); -const { GPU, CPUKernel } = require('../../../../../../src'); +const { GPU, CPUKernel } = require('../../../../../..'); describe('feature: to-string single precision constants HTMLImageArray'); @@ -9,65 +9,80 @@ function testArgument(mode, done) { 'jellyfish-2.jpeg', 'jellyfish-3.jpeg', 'jellyfish-4.jpeg', - ]) - .then(([image1, image2, image3, image4]) => { - const images1 = [image1, image2]; - const images2 = [image3, image4]; - const gpu = new GPU({mode}); - const originalKernel = gpu.createKernel(function (selection) { + ]).then(([image1, image2, image3, image4]) => { + const images1 = [image1, image2]; + const images2 = [image3, image4]; + const gpu = new GPU({ mode }); + const originalKernel = gpu.createKernel( + function (selection) { const image0 = this.constants.a[0][0][0]; const image1 = this.constants.a[1][0][0]; switch (selection) { - case 0: return image0.r * 255; - case 1: return image1.r * 255; - case 2: return image0.b * 255; - case 3: return image1.b * 255; + case 0: + return image0.r * 255; + case 1: + return image1.r * 255; + case 2: + return image0.b * 255; + case 3: + return image1.b * 255; } - }, { + }, + { output: [1], precision: 'single', argumentTypes: ['Integer'], constants: { a: images1, - } - }); - assert.deepEqual(originalKernel(0)[0], 172); - assert.deepEqual(originalKernel(1)[0], 255); - assert.deepEqual(originalKernel(2)[0], 253); - assert.deepEqual(originalKernel(3)[0], 255); - const kernelString = originalKernel.toString(0); - const canvas = originalKernel.canvas; - const context = originalKernel.context; - const Kernel = new Function('return ' + kernelString)(); - const newKernel1 = Kernel({context, canvas, constants: { a: images1 }}); - assert.deepEqual(newKernel1(0)[0], 172); - assert.deepEqual(newKernel1(1)[0], 255); - assert.deepEqual(newKernel1(2)[0], 253); - assert.deepEqual(newKernel1(3)[0], 255); + }, + } + ); + assert.deepEqual(originalKernel(0)[0], 172); + assert.deepEqual(originalKernel(1)[0], 255); + assert.deepEqual(originalKernel(2)[0], 253); + assert.deepEqual(originalKernel(3)[0], 255); + const kernelString = originalKernel.toString(0); + const canvas = originalKernel.canvas; + const context = originalKernel.context; + const Kernel = new Function('return ' + kernelString)(); + const newKernel1 = Kernel({ context, canvas, constants: { a: images1 } }); + assert.deepEqual(newKernel1(0)[0], 172); + assert.deepEqual(newKernel1(1)[0], 255); + assert.deepEqual(newKernel1(2)[0], 253); + assert.deepEqual(newKernel1(3)[0], 255); - const newKernel2 = Kernel({context, canvas, constants: { a: images2 }}); - assert.deepEqual(newKernel2(0)[0], 0); - assert.deepEqual(newKernel2(1)[0], 73); - assert.deepEqual(newKernel2(2)[0], 255); - assert.deepEqual(newKernel2(3)[0], 253); - gpu.destroy(); - done(originalKernel, newKernel1); - }); + const newKernel2 = Kernel({ context, canvas, constants: { a: images2 } }); + assert.deepEqual(newKernel2(0)[0], 0); + assert.deepEqual(newKernel2(1)[0], 73); + assert.deepEqual(newKernel2(2)[0], 255); + assert.deepEqual(newKernel2(3)[0], 253); + gpu.destroy(); + done(originalKernel, newKernel1); + }); } -(GPU.isSinglePrecisionSupported && GPU.isWebGLSupported ? test : skip)('webgl', t => { - const done = t.async(); - testArgument('webgl', (kernel) => { - // They aren't supported, so test that kernel falls back - assert.equal(kernel.kernel.constructor, CPUKernel); - done(); - }); -}); +(GPU.isSinglePrecisionSupported && GPU.isWebGLSupported ? test : skip)( + 'webgl', + t => { + const done = t.async(); + testArgument('webgl', kernel => { + // They aren't supported, so test that kernel falls back + assert.equal(kernel.kernel.constructor, CPUKernel); + done(); + }); + } +); -(GPU.isSinglePrecisionSupported && GPU.isWebGL2Supported ? test : skip)('webgl2', t => { - testArgument('webgl2', t.async()); -}); +(GPU.isSinglePrecisionSupported && GPU.isWebGL2Supported ? test : skip)( + 'webgl2', + t => { + testArgument('webgl2', t.async()); + } +); -(GPU.isSinglePrecisionSupported && (GPU.isWebGLSupported || GPU.isWebGL2Supported) ? test : skip)('cpu', t => { +(GPU.isSinglePrecisionSupported && + (GPU.isWebGLSupported || GPU.isWebGL2Supported) + ? test + : skip)('cpu', t => { testArgument('cpu', t.async()); }); diff --git a/test/features/to-string/precision/single/constants/html-image.js b/test/features/to-string/precision/single/constants/html-image.js index 0da4574f..0a6ad2d7 100644 --- a/test/features/to-string/precision/single/constants/html-image.js +++ b/test/features/to-string/precision/single/constants/html-image.js @@ -1,41 +1,56 @@ const { assert, skip, test, module: describe, only } = require('qunit'); -const { GPU } = require('../../../../../../src'); +const { GPU } = require('../../../../../..'); describe('feature: to-string single precision constants HTMLImage'); function testArgument(mode, done) { - loadImages(['jellyfish-1.jpeg', 'jellyfish-2.jpeg']) - .then(([image1, image2]) => { - const gpu = new GPU({mode}); - const originalKernel = gpu.createKernel(function () { - const pixel = this.constants.a[0][0]; - return pixel.b * 255; - }, { - output: [1], - precision: 'single', - constants: { a: image1 } - }); + loadImages(['jellyfish-1.jpeg', 'jellyfish-2.jpeg']).then( + ([image1, image2]) => { + const gpu = new GPU({ mode }); + const originalKernel = gpu.createKernel( + function () { + const pixel = this.constants.a[0][0]; + return pixel.b * 255; + }, + { + output: [1], + precision: 'single', + constants: { a: image1 }, + } + ); const canvas = originalKernel.canvas; const context = originalKernel.context; assert.deepEqual(originalKernel()[0], 253); const kernelString = originalKernel.toString(); - const newKernel = new Function('return ' + kernelString)()({context, canvas, constants: { a: image2 } }); + const newKernel = new Function('return ' + kernelString)()({ + context, + canvas, + constants: { a: image2 }, + }); assert.deepEqual(newKernel(image2)[0], 255); gpu.destroy(); done(); - }); + } + ); } -(GPU.isSinglePrecisionSupported && GPU.isWebGLSupported ? test : skip)('webgl', t => { - testArgument('webgl', t.async()); -}); +(GPU.isSinglePrecisionSupported && GPU.isWebGLSupported ? test : skip)( + 'webgl', + t => { + testArgument('webgl', t.async()); + } +); -(GPU.isSinglePrecisionSupported && GPU.isWebGL2Supported ? test : skip)('webgl2', t => { - testArgument('webgl2', t.async()); -}); +(GPU.isSinglePrecisionSupported && GPU.isWebGL2Supported ? test : skip)( + 'webgl2', + t => { + testArgument('webgl2', t.async()); + } +); -(GPU.isSinglePrecisionSupported && (GPU.isWebGLSupported || GPU.isWebGL2Supported) ? test : skip)('cpu', t => { +(GPU.isSinglePrecisionSupported && + (GPU.isWebGLSupported || GPU.isWebGL2Supported) + ? test + : skip)('cpu', t => { testArgument('cpu', t.async()); }); - - diff --git a/test/features/to-string/precision/single/constants/input.js b/test/features/to-string/precision/single/constants/input.js index 7f600bad..c906408b 100644 --- a/test/features/to-string/precision/single/constants/input.js +++ b/test/features/to-string/precision/single/constants/input.js @@ -1,55 +1,67 @@ const { assert, skip, test, module: describe, only } = require('qunit'); -const { GPU, input } = require('../../../../../../src'); +const { GPU, input } = require('../../../../../..'); describe('feature: to-string single precision constants Input'); function testConstant(mode, context, canvas) { const gpu = new GPU({ mode }); - const a = input([1,2,3,4],[2,2]); - const originalKernel = gpu.createKernel(function() { - let sum = 0; - for (let y = 0; y < 2; y++) { - for (let x = 0; x < 2; x++) { - sum += this.constants.a[y][x]; + const a = input([1, 2, 3, 4], [2, 2]); + const originalKernel = gpu.createKernel( + function () { + let sum = 0; + for (let y = 0; y < 2; y++) { + for (let x = 0; x < 2; x++) { + sum += this.constants.a[y][x]; + } } + return sum; + }, + { + canvas, + context, + output: [1], + precision: 'single', + constants: { + a, + }, } - return sum; - }, { - canvas, - context, - output: [1], - precision: 'single', - constants: { - a - } - }); + ); assert.deepEqual(originalKernel()[0], 10); const kernelString = originalKernel.toString(); const Kernel = new Function('return ' + kernelString)(); const newKernel = Kernel({ context, constants: { a } }); assert.deepEqual(newKernel()[0], 10); - const b = input([1,1,1,1],[2,2]); + const b = input([1, 1, 1, 1], [2, 2]); const newKernel2 = Kernel({ context, constants: { a: b } }); assert.deepEqual(newKernel2()[0], 4); gpu.destroy(); } -(GPU.isSinglePrecisionSupported && GPU.isWebGLSupported ? test : skip)('webgl', () => { - const canvas = document.createElement('canvas'); - const context = canvas.getContext('webgl'); - testConstant('webgl', context, canvas); -}); +(GPU.isSinglePrecisionSupported && GPU.isWebGLSupported ? test : skip)( + 'webgl', + () => { + const canvas = document.createElement('canvas'); + const context = canvas.getContext('webgl'); + testConstant('webgl', context, canvas); + } +); -(GPU.isSinglePrecisionSupported && GPU.isWebGL2Supported ? test : skip)('webgl2', () => { - const canvas = document.createElement('canvas'); - const context = canvas.getContext('webgl2'); - testConstant('webgl2', context, canvas); -}); +(GPU.isSinglePrecisionSupported && GPU.isWebGL2Supported ? test : skip)( + 'webgl2', + () => { + const canvas = document.createElement('canvas'); + const context = canvas.getContext('webgl2'); + testConstant('webgl2', context, canvas); + } +); -(GPU.isSinglePrecisionSupported && GPU.isHeadlessGLSupported ? test : skip)('headlessgl', () => { - testConstant('headlessgl', require('gl')(1, 1), null); -}); +(GPU.isSinglePrecisionSupported && GPU.isHeadlessGLSupported ? test : skip)( + 'headlessgl', + () => { + testConstant('headlessgl', require('gl')(1, 1), null); + } +); test('cpu', () => { testConstant('cpu'); diff --git a/test/features/to-string/precision/single/constants/integer.js b/test/features/to-string/precision/single/constants/integer.js index aaae2d20..49b3e5ae 100644 --- a/test/features/to-string/precision/single/constants/integer.js +++ b/test/features/to-string/precision/single/constants/integer.js @@ -1,22 +1,25 @@ const { assert, skip, test, module: describe, only } = require('qunit'); -const { GPU } = require('../../../../../../src'); +const { GPU } = require('../../../../../..'); describe('feature: to-string single precision constants Integer'); function testConstant(mode, context, canvas) { const gpu = new GPU({ mode }); - const originalKernel = gpu.createKernel(function() { - return Math.floor(this.constants.a) === 100 ? 42 : -42; - }, { - canvas, - context, - output: [1], - precision: 'single', - constants: { - a: 100 + const originalKernel = gpu.createKernel( + function () { + return Math.floor(this.constants.a) === 100 ? 42 : -42; }, - constantTypes: { a: 'Integer' } - }); + { + canvas, + context, + output: [1], + precision: 'single', + constants: { + a: 100, + }, + constantTypes: { a: 'Integer' }, + } + ); assert.equal(originalKernel.constantTypes.a, 'Integer'); assert.deepEqual(originalKernel()[0], 42); const kernelString = originalKernel.toString(); @@ -30,21 +33,30 @@ function testConstant(mode, context, canvas) { gpu.destroy(); } -(GPU.isSinglePrecisionSupported && GPU.isWebGLSupported ? test : skip)('webgl', () => { - const canvas = document.createElement('canvas'); - const context = canvas.getContext('webgl'); - testConstant('webgl', context, canvas); -}); +(GPU.isSinglePrecisionSupported && GPU.isWebGLSupported ? test : skip)( + 'webgl', + () => { + const canvas = document.createElement('canvas'); + const context = canvas.getContext('webgl'); + testConstant('webgl', context, canvas); + } +); -(GPU.isSinglePrecisionSupported && GPU.isWebGL2Supported ? test : skip)('webgl2', () => { - const canvas = document.createElement('canvas'); - const context = canvas.getContext('webgl2'); - testConstant('webgl2', context, canvas); -}); +(GPU.isSinglePrecisionSupported && GPU.isWebGL2Supported ? test : skip)( + 'webgl2', + () => { + const canvas = document.createElement('canvas'); + const context = canvas.getContext('webgl2'); + testConstant('webgl2', context, canvas); + } +); -(GPU.isSinglePrecisionSupported && GPU.isHeadlessGLSupported ? test : skip)('headlessgl', () => { - testConstant('headlessgl', require('gl')(1, 1), null); -}); +(GPU.isSinglePrecisionSupported && GPU.isHeadlessGLSupported ? test : skip)( + 'headlessgl', + () => { + testConstant('headlessgl', require('gl')(1, 1), null); + } +); test('cpu', () => { testConstant('cpu'); diff --git a/test/features/to-string/precision/single/constants/memory-optimized-number-texture.js b/test/features/to-string/precision/single/constants/memory-optimized-number-texture.js index 9f996df6..fff3e328 100644 --- a/test/features/to-string/precision/single/constants/memory-optimized-number-texture.js +++ b/test/features/to-string/precision/single/constants/memory-optimized-number-texture.js @@ -1,62 +1,88 @@ const { assert, skip, test, module: describe, only } = require('qunit'); -const { GPU } = require('../../../../../../src'); +const { GPU } = require('../../../../../..'); -describe('feature: to-string single precision constants MemoryOptimizedNumberTexture'); +describe( + 'feature: to-string single precision constants MemoryOptimizedNumberTexture' +); function testConstant(mode, context, canvas) { const gpu = new GPU({ mode, context, canvas }); - const texture = gpu.createKernel(function() { - return this.thread.x; - }, { - output: [4], - optimizeFloatMemory: true, - precision: 'single', - pipeline: true, - })(); - const texture2 = gpu.createKernel(function() { - return this.output.x - this.thread.x; - }, { - output: [4], - optimizeFloatMemory: true, - precision: 'single', - pipeline: true, - })(); - const originalKernel = gpu.createKernel(function() { - return this.constants.a[this.thread.x]; - }, { - output: [4], - precision: 'single', - constants: { - a: texture + const texture = gpu.createKernel( + function () { + return this.thread.x; + }, + { + output: [4], + optimizeFloatMemory: true, + precision: 'single', + pipeline: true, } - }); - assert.deepEqual(originalKernel(), new Float32Array([0,1,2,3])); + )(); + const texture2 = gpu.createKernel( + function () { + return this.output.x - this.thread.x; + }, + { + output: [4], + optimizeFloatMemory: true, + precision: 'single', + pipeline: true, + } + )(); + const originalKernel = gpu.createKernel( + function () { + return this.constants.a[this.thread.x]; + }, + { + output: [4], + precision: 'single', + constants: { + a: texture, + }, + } + ); + assert.deepEqual(originalKernel(), new Float32Array([0, 1, 2, 3])); const kernelString = originalKernel.toString(); const Kernel = new Function('return ' + kernelString)(); const newKernel = Kernel({ context, constants: { a: texture } }); const newKernel2 = Kernel({ context, constants: { a: texture2 } }); - assert.deepEqual(texture2.toArray ? texture2.toArray() : texture2, new Float32Array([4,3,2,1])); - assert.deepEqual(texture.toArray ? texture.toArray() : texture, new Float32Array([0,1,2,3])); - assert.deepEqual(newKernel(), new Float32Array([0,1,2,3])); - assert.deepEqual(newKernel2(), new Float32Array([4,3,2,1])); + assert.deepEqual( + texture2.toArray ? texture2.toArray() : texture2, + new Float32Array([4, 3, 2, 1]) + ); + assert.deepEqual( + texture.toArray ? texture.toArray() : texture, + new Float32Array([0, 1, 2, 3]) + ); + assert.deepEqual(newKernel(), new Float32Array([0, 1, 2, 3])); + assert.deepEqual(newKernel2(), new Float32Array([4, 3, 2, 1])); gpu.destroy(); } -(GPU.isSinglePrecisionSupported && GPU.isWebGLSupported ? test : skip)('webgl', () => { - const canvas = document.createElement('canvas'); - const context = canvas.getContext('webgl'); - testConstant('webgl', context, canvas); -}); +(GPU.isSinglePrecisionSupported && GPU.isWebGLSupported ? test : skip)( + 'webgl', + () => { + const canvas = document.createElement('canvas'); + const context = canvas.getContext('webgl'); + testConstant('webgl', context, canvas); + } +); -(GPU.isSinglePrecisionSupported && GPU.isWebGL2Supported ? test : skip)('webgl2', () => { - const canvas = document.createElement('canvas'); - const context = canvas.getContext('webgl2'); - testConstant('webgl2', context, canvas); -}); +(GPU.isSinglePrecisionSupported && GPU.isWebGL2Supported ? test : skip)( + 'webgl2', + () => { + const canvas = document.createElement('canvas'); + const context = canvas.getContext('webgl2'); + testConstant('webgl2', context, canvas); + } +); -(GPU.isSinglePrecisionSupported && GPU.isHeadlessGLSupported ? test : skip)('headlessgl', () => { - testConstant('headlessgl', require('gl')(1, 1), null); -}); +(GPU.isSinglePrecisionSupported && GPU.isHeadlessGLSupported ? test : skip)( + 'headlessgl', + () => { + testConstant('headlessgl', require('gl')(1, 1), null); + } +); test('cpu', () => { testConstant('cpu'); diff --git a/test/features/to-string/precision/single/constants/number-texture.js b/test/features/to-string/precision/single/constants/number-texture.js index d8829edc..23a10569 100644 --- a/test/features/to-string/precision/single/constants/number-texture.js +++ b/test/features/to-string/precision/single/constants/number-texture.js @@ -1,64 +1,88 @@ const { assert, skip, test, module: describe, only } = require('qunit'); -const { GPU } = require('../../../../../../src'); +const { GPU } = require('../../../../../..'); describe('feature: to-string single precision constants NumberTexture'); function testConstant(mode, context, canvas) { const gpu = new GPU({ mode, context, canvas }); - const texture = gpu.createKernel(function() { - return this.thread.x; - }, { - output: [4], - optimizeFloatMemory: false, - precision: 'single', - pipeline: true, - })(); - const texture2 = gpu.createKernel(function() { - return this.output.x - this.thread.x; - }, { - output: [4], - optimizeFloatMemory: false, - precision: 'single', - pipeline: true, - })(); - const originalKernel = gpu.createKernel(function() { - return this.constants.a[this.thread.x]; - }, { - canvas, - context, - output: [4], - precision: 'single', - constants: { - a: texture + const texture = gpu.createKernel( + function () { + return this.thread.x; + }, + { + output: [4], + optimizeFloatMemory: false, + precision: 'single', + pipeline: true, } - }); - assert.deepEqual(originalKernel(), new Float32Array([0,1,2,3])); + )(); + const texture2 = gpu.createKernel( + function () { + return this.output.x - this.thread.x; + }, + { + output: [4], + optimizeFloatMemory: false, + precision: 'single', + pipeline: true, + } + )(); + const originalKernel = gpu.createKernel( + function () { + return this.constants.a[this.thread.x]; + }, + { + canvas, + context, + output: [4], + precision: 'single', + constants: { + a: texture, + }, + } + ); + assert.deepEqual(originalKernel(), new Float32Array([0, 1, 2, 3])); const kernelString = originalKernel.toString(); const Kernel = new Function('return ' + kernelString)(); const newKernel = Kernel({ context, constants: { a: texture } }); const newKernel2 = Kernel({ context, constants: { a: texture2 } }); - assert.deepEqual(texture2.toArray ? texture2.toArray() : texture2, new Float32Array([4,3,2,1])); - assert.deepEqual(texture.toArray ? texture.toArray() : texture, new Float32Array([0,1,2,3])); - assert.deepEqual(newKernel(), new Float32Array([0,1,2,3])); - assert.deepEqual(newKernel2(), new Float32Array([4,3,2,1])); + assert.deepEqual( + texture2.toArray ? texture2.toArray() : texture2, + new Float32Array([4, 3, 2, 1]) + ); + assert.deepEqual( + texture.toArray ? texture.toArray() : texture, + new Float32Array([0, 1, 2, 3]) + ); + assert.deepEqual(newKernel(), new Float32Array([0, 1, 2, 3])); + assert.deepEqual(newKernel2(), new Float32Array([4, 3, 2, 1])); gpu.destroy(); } -(GPU.isSinglePrecisionSupported && GPU.isWebGLSupported ? test : skip)('webgl', () => { - const canvas = document.createElement('canvas'); - const context = canvas.getContext('webgl'); - testConstant('webgl', context, canvas); -}); +(GPU.isSinglePrecisionSupported && GPU.isWebGLSupported ? test : skip)( + 'webgl', + () => { + const canvas = document.createElement('canvas'); + const context = canvas.getContext('webgl'); + testConstant('webgl', context, canvas); + } +); -(GPU.isSinglePrecisionSupported && GPU.isWebGL2Supported ? test : skip)('webgl2', () => { - const canvas = document.createElement('canvas'); - const context = canvas.getContext('webgl2'); - testConstant('webgl2', context, canvas); -}); +(GPU.isSinglePrecisionSupported && GPU.isWebGL2Supported ? test : skip)( + 'webgl2', + () => { + const canvas = document.createElement('canvas'); + const context = canvas.getContext('webgl2'); + testConstant('webgl2', context, canvas); + } +); -(GPU.isSinglePrecisionSupported && GPU.isHeadlessGLSupported ? test : skip)('headlessgl', () => { - testConstant('headlessgl', require('gl')(1, 1), null); -}); +(GPU.isSinglePrecisionSupported && GPU.isHeadlessGLSupported ? test : skip)( + 'headlessgl', + () => { + testConstant('headlessgl', require('gl')(1, 1), null); + } +); test('cpu', () => { testConstant('cpu'); diff --git a/test/features/to-string/precision/single/graphical.js b/test/features/to-string/precision/single/graphical.js index 3d86eb7f..32b87b72 100644 --- a/test/features/to-string/precision/single/graphical.js +++ b/test/features/to-string/precision/single/graphical.js @@ -1,50 +1,63 @@ const { assert, skip, test, module: describe, only } = require('qunit'); -const { GPU } = require('../../../../../src'); +const { GPU } = require('../../../../..'); describe('feature: to-string single precision graphical'); function testGraphical(mode, context, canvas) { const gpu = new GPU({ mode }); - const originalKernel = gpu.createKernel(function() { - this.color(1,1,1,1); - }, { - canvas, - context, - output: [2,2], - precision: 'single', - graphical: true, - }); + const originalKernel = gpu.createKernel( + function () { + this.color(1, 1, 1, 1); + }, + { + canvas, + context, + output: [2, 2], + precision: 'single', + graphical: true, + } + ); const expected = new Uint8ClampedArray([ - 255, 255, 255, 255, - 255, 255, 255, 255, - 255, 255, 255, 255, - 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, + 255, ]); originalKernel(); assert.deepEqual(originalKernel.getPixels(), expected); const kernelString = originalKernel.toString(); - const newKernel = new Function('return ' + kernelString)()({ canvas, context }); + const newKernel = new Function('return ' + kernelString)()({ + canvas, + context, + }); newKernel(); assert.deepEqual(newKernel.getPixels(), expected); gpu.destroy(); } -(GPU.isSinglePrecisionSupported && GPU.isWebGLSupported ? test : skip)('webgl', () => { - const canvas = document.createElement('canvas'); - const context = canvas.getContext('webgl'); - testGraphical('webgl', context, canvas); -}); +(GPU.isSinglePrecisionSupported && GPU.isWebGLSupported ? test : skip)( + 'webgl', + () => { + const canvas = document.createElement('canvas'); + const context = canvas.getContext('webgl'); + testGraphical('webgl', context, canvas); + } +); -(GPU.isSinglePrecisionSupported && GPU.isWebGL2Supported ? test : skip)('webgl2', () => { - const canvas = document.createElement('canvas'); - const context = canvas.getContext('webgl2'); - testGraphical('webgl2', context, canvas); -}); +(GPU.isSinglePrecisionSupported && GPU.isWebGL2Supported ? test : skip)( + 'webgl2', + () => { + const canvas = document.createElement('canvas'); + const context = canvas.getContext('webgl2'); + testGraphical('webgl2', context, canvas); + } +); -(GPU.isSinglePrecisionSupported && GPU.isHeadlessGLSupported ? test : skip)('headlessgl', () => { - testGraphical('headlessgl', require('gl')(1, 1), null); -}); +(GPU.isSinglePrecisionSupported && GPU.isHeadlessGLSupported ? test : skip)( + 'headlessgl', + () => { + testGraphical('headlessgl', require('gl')(1, 1), null); + } +); (GPU.isCanvasSupported ? test : skip)('cpu', () => { const canvas = document.createElement('canvas'); diff --git a/test/features/to-string/precision/single/kernel-map/array/array.js b/test/features/to-string/precision/single/kernel-map/array/array.js index ef7c52f7..12f67399 100644 --- a/test/features/to-string/precision/single/kernel-map/array/array.js +++ b/test/features/to-string/precision/single/kernel-map/array/array.js @@ -1,23 +1,29 @@ const { assert, skip, test, module: describe, only } = require('qunit'); -const { GPU } = require('../../../../../../../src'); +const { GPU } = require('../../../../../../..'); -describe('feature: to-string single precision array style kernel map returns Array'); +describe( + 'feature: to-string single precision array style kernel map returns Array' +); function testReturn(mode, context, canvas) { const gpu = new GPU({ mode }); function addOne(value) { return value + 1; } - const originalKernel = gpu.createKernelMap([addOne], function(a) { - const result = a[this.thread.x] + 1; - addOne(result); - return result; - }, { - canvas, - context, - output: [6], - precision: 'single', - }); + const originalKernel = gpu.createKernelMap( + [addOne], + function (a) { + const result = a[this.thread.x] + 1; + addOne(result); + return result; + }, + { + canvas, + context, + output: [6], + precision: 'single', + } + ); const a = [1, 2, 3, 4, 5, 6]; const expected = new Float32Array([2, 3, 4, 5, 6, 7]); @@ -32,21 +38,30 @@ function testReturn(mode, context, canvas) { gpu.destroy(); } -(GPU.isSinglePrecisionSupported && GPU.isWebGLSupported ? test : skip)('webgl', () => { - const canvas = document.createElement('canvas'); - const context = canvas.getContext('webgl'); - testReturn('webgl', context, canvas); -}); +(GPU.isSinglePrecisionSupported && GPU.isWebGLSupported ? test : skip)( + 'webgl', + () => { + const canvas = document.createElement('canvas'); + const context = canvas.getContext('webgl'); + testReturn('webgl', context, canvas); + } +); -(GPU.isSinglePrecisionSupported && GPU.isWebGL2Supported ? test : skip)('webgl2', () => { - const canvas = document.createElement('canvas'); - const context = canvas.getContext('webgl2'); - testReturn('webgl2', context, canvas); -}); +(GPU.isSinglePrecisionSupported && GPU.isWebGL2Supported ? test : skip)( + 'webgl2', + () => { + const canvas = document.createElement('canvas'); + const context = canvas.getContext('webgl2'); + testReturn('webgl2', context, canvas); + } +); -(GPU.isSinglePrecisionSupported && GPU.isHeadlessGLSupported ? test : skip)('headlessgl', () => { - testReturn('headlessgl', require('gl')(1, 1), null); -}); +(GPU.isSinglePrecisionSupported && GPU.isHeadlessGLSupported ? test : skip)( + 'headlessgl', + () => { + testReturn('headlessgl', require('gl')(1, 1), null); + } +); test('cpu', () => { testReturn('cpu'); diff --git a/test/features/to-string/precision/single/kernel-map/array/array2d.js b/test/features/to-string/precision/single/kernel-map/array/array2d.js index 25bf743c..fb66c523 100644 --- a/test/features/to-string/precision/single/kernel-map/array/array2d.js +++ b/test/features/to-string/precision/single/kernel-map/array/array2d.js @@ -1,33 +1,33 @@ const { assert, skip, test, module: describe, only } = require('qunit'); -const { GPU } = require('../../../../../../../src'); +const { GPU } = require('../../../../../../..'); -describe('feature: to-string single precision array style kernel map returns 2D Array'); +describe( + 'feature: to-string single precision array style kernel map returns 2D Array' +); function testReturn(mode, context, canvas) { const gpu = new GPU({ mode }); function addOne(value) { return value + 1; } - const originalKernel = gpu.createKernelMap([addOne], function(a) { - const result = a[this.thread.x] + 1; - addOne(result); - return result; - }, { - canvas, - context, - output: [2, 2], - precision: 'single', - }); + const originalKernel = gpu.createKernelMap( + [addOne], + function (a) { + const result = a[this.thread.x] + 1; + addOne(result); + return result; + }, + { + canvas, + context, + output: [2, 2], + precision: 'single', + } + ); const a = [1, 2, 3, 4, 5, 6]; - const expected = [ - new Float32Array([2, 3]), - new Float32Array([2, 3]), - ]; - const expectedZero = [ - new Float32Array([3, 4]), - new Float32Array([3, 4]), - ]; + const expected = [new Float32Array([2, 3]), new Float32Array([2, 3])]; + const expectedZero = [new Float32Array([3, 4]), new Float32Array([3, 4])]; const originalResult = originalKernel(a); assert.deepEqual(originalResult.result, expected); assert.deepEqual(originalResult[0], expectedZero); @@ -38,21 +38,30 @@ function testReturn(mode, context, canvas) { gpu.destroy(); } -(GPU.isSinglePrecisionSupported && GPU.isWebGLSupported ? test : skip)('webgl', () => { - const canvas = document.createElement('canvas'); - const context = canvas.getContext('webgl'); - testReturn('webgl', context, canvas); -}); +(GPU.isSinglePrecisionSupported && GPU.isWebGLSupported ? test : skip)( + 'webgl', + () => { + const canvas = document.createElement('canvas'); + const context = canvas.getContext('webgl'); + testReturn('webgl', context, canvas); + } +); -(GPU.isSinglePrecisionSupported && GPU.isWebGL2Supported ? test : skip)('webgl2', () => { - const canvas = document.createElement('canvas'); - const context = canvas.getContext('webgl2'); - testReturn('webgl2', context, canvas); -}); +(GPU.isSinglePrecisionSupported && GPU.isWebGL2Supported ? test : skip)( + 'webgl2', + () => { + const canvas = document.createElement('canvas'); + const context = canvas.getContext('webgl2'); + testReturn('webgl2', context, canvas); + } +); -(GPU.isSinglePrecisionSupported && GPU.isHeadlessGLSupported ? test : skip)('headlessgl', () => { - testReturn('headlessgl', require('gl')(1, 1), null); -}); +(GPU.isSinglePrecisionSupported && GPU.isHeadlessGLSupported ? test : skip)( + 'headlessgl', + () => { + testReturn('headlessgl', require('gl')(1, 1), null); + } +); test('cpu', () => { testReturn('cpu'); diff --git a/test/features/to-string/precision/single/kernel-map/array/array3d.js b/test/features/to-string/precision/single/kernel-map/array/array3d.js index 03c5f117..059219f1 100644 --- a/test/features/to-string/precision/single/kernel-map/array/array3d.js +++ b/test/features/to-string/precision/single/kernel-map/array/array3d.js @@ -1,44 +1,38 @@ const { assert, skip, test, module: describe, only } = require('qunit'); -const { GPU } = require('../../../../../../../src'); +const { GPU } = require('../../../../../../..'); -describe('feature: to-string single precision array style kernel map returns Array3d'); +describe( + 'feature: to-string single precision array style kernel map returns Array3d' +); function testReturn(mode, context, canvas) { const gpu = new GPU({ mode }); function addOne(value) { return value + 1; } - const originalKernel = gpu.createKernelMap([addOne], function(a) { - const result = a[this.thread.x] + 1; - addOne(result); - return result; - }, { - canvas, - context, - output: [2, 2, 2], - precision: 'single', - }); + const originalKernel = gpu.createKernelMap( + [addOne], + function (a) { + const result = a[this.thread.x] + 1; + addOne(result); + return result; + }, + { + canvas, + context, + output: [2, 2, 2], + precision: 'single', + } + ); const a = [1, 2]; const expected = [ - [ - new Float32Array([2, 3]), - new Float32Array([2, 3]), - ], - [ - new Float32Array([2, 3]), - new Float32Array([2, 3]), - ] + [new Float32Array([2, 3]), new Float32Array([2, 3])], + [new Float32Array([2, 3]), new Float32Array([2, 3])], ]; const expectedZero = [ - [ - new Float32Array([3, 4]), - new Float32Array([3, 4]), - ], - [ - new Float32Array([3, 4]), - new Float32Array([3, 4]), - ] + [new Float32Array([3, 4]), new Float32Array([3, 4])], + [new Float32Array([3, 4]), new Float32Array([3, 4])], ]; const originalResult = originalKernel(a); assert.deepEqual(originalResult.result, expected); @@ -50,21 +44,30 @@ function testReturn(mode, context, canvas) { gpu.destroy(); } -(GPU.isSinglePrecisionSupported && GPU.isWebGLSupported ? test : skip)('webgl', () => { - const canvas = document.createElement('canvas'); - const context = canvas.getContext('webgl'); - testReturn('webgl', context, canvas); -}); +(GPU.isSinglePrecisionSupported && GPU.isWebGLSupported ? test : skip)( + 'webgl', + () => { + const canvas = document.createElement('canvas'); + const context = canvas.getContext('webgl'); + testReturn('webgl', context, canvas); + } +); -(GPU.isSinglePrecisionSupported && GPU.isWebGL2Supported ? test : skip)('webgl2', () => { - const canvas = document.createElement('canvas'); - const context = canvas.getContext('webgl2'); - testReturn('webgl2', context, canvas); -}); +(GPU.isSinglePrecisionSupported && GPU.isWebGL2Supported ? test : skip)( + 'webgl2', + () => { + const canvas = document.createElement('canvas'); + const context = canvas.getContext('webgl2'); + testReturn('webgl2', context, canvas); + } +); -(GPU.isSinglePrecisionSupported && GPU.isHeadlessGLSupported ? test : skip)('headlessgl', () => { - testReturn('headlessgl', require('gl')(1, 1), null); -}); +(GPU.isSinglePrecisionSupported && GPU.isHeadlessGLSupported ? test : skip)( + 'headlessgl', + () => { + testReturn('headlessgl', require('gl')(1, 1), null); + } +); test('cpu', () => { testReturn('cpu'); diff --git a/test/features/to-string/precision/single/kernel-map/array/memory-optimized-number-texture.js b/test/features/to-string/precision/single/kernel-map/array/memory-optimized-number-texture.js index e0b61bac..608159fd 100644 --- a/test/features/to-string/precision/single/kernel-map/array/memory-optimized-number-texture.js +++ b/test/features/to-string/precision/single/kernel-map/array/memory-optimized-number-texture.js @@ -1,25 +1,31 @@ const { assert, skip, test, module: describe, only } = require('qunit'); -const { GPU } = require('../../../../../../../src'); +const { GPU } = require('../../../../../../..'); -describe('feature: to-string single precision array style kernel map returns MemoryOptimizedNumberTexture'); +describe( + 'feature: to-string single precision array style kernel map returns MemoryOptimizedNumberTexture' +); function testReturn(mode, context, canvas) { const gpu = new GPU({ mode }); function addOne(value) { return value + 1; } - const originalKernel = gpu.createKernelMap([addOne], function(a) { - const result = a[this.thread.x] + 1; - addOne(result); - return result; - }, { - canvas, - context, - output: [6], - precision: 'single', - pipeline: true, - optimizeFloatMemory: true, - }); + const originalKernel = gpu.createKernelMap( + [addOne], + function (a) { + const result = a[this.thread.x] + 1; + addOne(result); + return result; + }, + { + canvas, + context, + output: [6], + precision: 'single', + pipeline: true, + optimizeFloatMemory: true, + } + ); const a = [1, 2, 3, 4, 5, 6]; const expected = new Float32Array([2, 3, 4, 5, 6, 7]); @@ -34,18 +40,27 @@ function testReturn(mode, context, canvas) { gpu.destroy(); } -(GPU.isSinglePrecisionSupported && GPU.isWebGLSupported ? test : skip)('webgl', () => { - const canvas = document.createElement('canvas'); - const context = canvas.getContext('webgl'); - testReturn('webgl', context, canvas); -}); +(GPU.isSinglePrecisionSupported && GPU.isWebGLSupported ? test : skip)( + 'webgl', + () => { + const canvas = document.createElement('canvas'); + const context = canvas.getContext('webgl'); + testReturn('webgl', context, canvas); + } +); -(GPU.isSinglePrecisionSupported && GPU.isWebGL2Supported ? test : skip)('webgl2', () => { - const canvas = document.createElement('canvas'); - const context = canvas.getContext('webgl2'); - testReturn('webgl2', context, canvas); -}); +(GPU.isSinglePrecisionSupported && GPU.isWebGL2Supported ? test : skip)( + 'webgl2', + () => { + const canvas = document.createElement('canvas'); + const context = canvas.getContext('webgl2'); + testReturn('webgl2', context, canvas); + } +); -(GPU.isSinglePrecisionSupported && GPU.isHeadlessGLSupported ? test : skip)('headlessgl', () => { - testReturn('headlessgl', require('gl')(1, 1), null); -}); +(GPU.isSinglePrecisionSupported && GPU.isHeadlessGLSupported ? test : skip)( + 'headlessgl', + () => { + testReturn('headlessgl', require('gl')(1, 1), null); + } +); diff --git a/test/features/to-string/precision/single/kernel-map/array/number-texture.js b/test/features/to-string/precision/single/kernel-map/array/number-texture.js index 86e8a3e2..44f47073 100644 --- a/test/features/to-string/precision/single/kernel-map/array/number-texture.js +++ b/test/features/to-string/precision/single/kernel-map/array/number-texture.js @@ -1,24 +1,30 @@ const { assert, skip, test, module: describe, only } = require('qunit'); -const { GPU } = require('../../../../../../../src'); +const { GPU } = require('../../../../../../..'); -describe('feature: to-string single precision array style kernel map returns NumberTexture'); +describe( + 'feature: to-string single precision array style kernel map returns NumberTexture' +); function testReturn(mode, context, canvas) { const gpu = new GPU({ mode }); function addOne(value) { return value + 1; } - const originalKernel = gpu.createKernelMap([addOne], function(a) { - const result = a[this.thread.x] + 1; - addOne(result); - return result; - }, { - canvas, - context, - output: [6], - precision: 'single', - pipeline: true, - }); + const originalKernel = gpu.createKernelMap( + [addOne], + function (a) { + const result = a[this.thread.x] + 1; + addOne(result); + return result; + }, + { + canvas, + context, + output: [6], + precision: 'single', + pipeline: true, + } + ); const a = [1, 2, 3, 4, 5, 6]; const expected = new Float32Array([2, 3, 4, 5, 6, 7]); @@ -33,18 +39,27 @@ function testReturn(mode, context, canvas) { gpu.destroy(); } -(GPU.isSinglePrecisionSupported && GPU.isWebGLSupported ? test : skip)('webgl', () => { - const canvas = document.createElement('canvas'); - const context = canvas.getContext('webgl'); - testReturn('webgl', context, canvas); -}); +(GPU.isSinglePrecisionSupported && GPU.isWebGLSupported ? test : skip)( + 'webgl', + () => { + const canvas = document.createElement('canvas'); + const context = canvas.getContext('webgl'); + testReturn('webgl', context, canvas); + } +); -(GPU.isSinglePrecisionSupported && GPU.isWebGL2Supported ? test : skip)('webgl2', () => { - const canvas = document.createElement('canvas'); - const context = canvas.getContext('webgl2'); - testReturn('webgl2', context, canvas); -}); +(GPU.isSinglePrecisionSupported && GPU.isWebGL2Supported ? test : skip)( + 'webgl2', + () => { + const canvas = document.createElement('canvas'); + const context = canvas.getContext('webgl2'); + testReturn('webgl2', context, canvas); + } +); -(GPU.isSinglePrecisionSupported && GPU.isHeadlessGLSupported ? test : skip)('headlessgl', () => { - testReturn('headlessgl', require('gl')(1, 1), null); -}); +(GPU.isSinglePrecisionSupported && GPU.isHeadlessGLSupported ? test : skip)( + 'headlessgl', + () => { + testReturn('headlessgl', require('gl')(1, 1), null); + } +); diff --git a/test/features/to-string/precision/single/kernel-map/object/array.js b/test/features/to-string/precision/single/kernel-map/object/array.js index 6fb90600..b2fda5cc 100644 --- a/test/features/to-string/precision/single/kernel-map/object/array.js +++ b/test/features/to-string/precision/single/kernel-map/object/array.js @@ -1,5 +1,5 @@ const { assert, skip, test, module: describe, only } = require('qunit'); -const { GPU } = require('../../../../../../../src'); +const { GPU } = require('../../../../../../..'); describe('feature: to-string single precision object style returns Array'); @@ -8,16 +8,20 @@ function testReturn(mode, context, canvas) { function addOne(value) { return value + 1; } - const originalKernel = gpu.createKernelMap({ addOneResult: addOne }, function(a) { - const result = a[this.thread.x] + 1; - addOne(result); - return result; - }, { - canvas, - context, - output: [6], - precision: 'single', - }); + const originalKernel = gpu.createKernelMap( + { addOneResult: addOne }, + function (a) { + const result = a[this.thread.x] + 1; + addOne(result); + return result; + }, + { + canvas, + context, + output: [6], + precision: 'single', + } + ); const a = [1, 2, 3, 4, 5, 6]; const expected = new Float32Array([2, 3, 4, 5, 6, 7]); @@ -32,21 +36,30 @@ function testReturn(mode, context, canvas) { gpu.destroy(); } -(GPU.isSinglePrecisionSupported && GPU.isWebGLSupported ? test : skip)('webgl', () => { - const canvas = document.createElement('canvas'); - const context = canvas.getContext('webgl'); - testReturn('webgl', context, canvas); -}); +(GPU.isSinglePrecisionSupported && GPU.isWebGLSupported ? test : skip)( + 'webgl', + () => { + const canvas = document.createElement('canvas'); + const context = canvas.getContext('webgl'); + testReturn('webgl', context, canvas); + } +); -(GPU.isSinglePrecisionSupported && GPU.isWebGL2Supported ? test : skip)('webgl2', () => { - const canvas = document.createElement('canvas'); - const context = canvas.getContext('webgl2'); - testReturn('webgl2', context, canvas); -}); +(GPU.isSinglePrecisionSupported && GPU.isWebGL2Supported ? test : skip)( + 'webgl2', + () => { + const canvas = document.createElement('canvas'); + const context = canvas.getContext('webgl2'); + testReturn('webgl2', context, canvas); + } +); -(GPU.isSinglePrecisionSupported && GPU.isHeadlessGLSupported ? test : skip)('headlessgl', () => { - testReturn('headlessgl', require('gl')(1, 1), null); -}); +(GPU.isSinglePrecisionSupported && GPU.isHeadlessGLSupported ? test : skip)( + 'headlessgl', + () => { + testReturn('headlessgl', require('gl')(1, 1), null); + } +); test('cpu', () => { testReturn('cpu'); diff --git a/test/features/to-string/precision/single/kernel-map/object/array2d.js b/test/features/to-string/precision/single/kernel-map/object/array2d.js index 60b22f91..069488f3 100644 --- a/test/features/to-string/precision/single/kernel-map/object/array2d.js +++ b/test/features/to-string/precision/single/kernel-map/object/array2d.js @@ -1,5 +1,5 @@ const { assert, skip, test, module: describe, only } = require('qunit'); -const { GPU } = require('../../../../../../../src'); +const { GPU } = require('../../../../../../..'); describe('feature: to-string single precision object style returns Array2D'); @@ -8,26 +8,24 @@ function testReturn(mode, context, canvas) { function addOne(value) { return value + 1; } - const originalKernel = gpu.createKernelMap({ addOneResult: addOne }, function(a) { - const result = a[this.thread.x] + 1; - addOne(result); - return result; - }, { - canvas, - context, - output: [2, 2], - precision: 'single', - }); + const originalKernel = gpu.createKernelMap( + { addOneResult: addOne }, + function (a) { + const result = a[this.thread.x] + 1; + addOne(result); + return result; + }, + { + canvas, + context, + output: [2, 2], + precision: 'single', + } + ); const a = [1, 2, 3, 4, 5, 6]; - const expected = [ - new Float32Array([2, 3]), - new Float32Array([2, 3]), - ]; - const expectedZero = [ - new Float32Array([3, 4]), - new Float32Array([3, 4]), - ]; + const expected = [new Float32Array([2, 3]), new Float32Array([2, 3])]; + const expectedZero = [new Float32Array([3, 4]), new Float32Array([3, 4])]; const originalResult = originalKernel(a); assert.deepEqual(originalResult.result, expected); assert.deepEqual(originalResult.addOneResult, expectedZero); @@ -38,21 +36,30 @@ function testReturn(mode, context, canvas) { gpu.destroy(); } -(GPU.isSinglePrecisionSupported && GPU.isWebGLSupported ? test : skip)('webgl', () => { - const canvas = document.createElement('canvas'); - const context = canvas.getContext('webgl'); - testReturn('webgl', context, canvas); -}); +(GPU.isSinglePrecisionSupported && GPU.isWebGLSupported ? test : skip)( + 'webgl', + () => { + const canvas = document.createElement('canvas'); + const context = canvas.getContext('webgl'); + testReturn('webgl', context, canvas); + } +); -(GPU.isSinglePrecisionSupported && GPU.isWebGL2Supported ? test : skip)('webgl2', () => { - const canvas = document.createElement('canvas'); - const context = canvas.getContext('webgl2'); - testReturn('webgl2', context, canvas); -}); +(GPU.isSinglePrecisionSupported && GPU.isWebGL2Supported ? test : skip)( + 'webgl2', + () => { + const canvas = document.createElement('canvas'); + const context = canvas.getContext('webgl2'); + testReturn('webgl2', context, canvas); + } +); -(GPU.isSinglePrecisionSupported && GPU.isHeadlessGLSupported ? test : skip)('headlessgl', () => { - testReturn('headlessgl', require('gl')(1, 1), null); -}); +(GPU.isSinglePrecisionSupported && GPU.isHeadlessGLSupported ? test : skip)( + 'headlessgl', + () => { + testReturn('headlessgl', require('gl')(1, 1), null); + } +); test('cpu', () => { testReturn('cpu'); diff --git a/test/features/to-string/precision/single/kernel-map/object/array3d.js b/test/features/to-string/precision/single/kernel-map/object/array3d.js index 0c1ac27d..3efea9db 100644 --- a/test/features/to-string/precision/single/kernel-map/object/array3d.js +++ b/test/features/to-string/precision/single/kernel-map/object/array3d.js @@ -1,5 +1,5 @@ const { assert, skip, test, module: describe, only } = require('qunit'); -const { GPU } = require('../../../../../../../src'); +const { GPU } = require('../../../../../../..'); describe('feature: to-string single precision object style returns Array3d'); @@ -8,37 +8,29 @@ function testReturn(mode, context, canvas) { function addOne(value) { return value + 1; } - const originalKernel = gpu.createKernelMap({ addOneResult: addOne }, function(a) { - const result = a[this.thread.x] + 1; - addOne(result); - return result; - }, { - canvas, - context, - output: [2, 2, 2], - precision: 'single', - }); + const originalKernel = gpu.createKernelMap( + { addOneResult: addOne }, + function (a) { + const result = a[this.thread.x] + 1; + addOne(result); + return result; + }, + { + canvas, + context, + output: [2, 2, 2], + precision: 'single', + } + ); const a = [1, 2]; const expected = [ - [ - new Float32Array([2, 3]), - new Float32Array([2, 3]), - ], - [ - new Float32Array([2, 3]), - new Float32Array([2, 3]), - ] - ] + [new Float32Array([2, 3]), new Float32Array([2, 3])], + [new Float32Array([2, 3]), new Float32Array([2, 3])], + ]; const expectedZero = [ - [ - new Float32Array([3, 4]), - new Float32Array([3, 4]), - ], - [ - new Float32Array([3, 4]), - new Float32Array([3, 4]), - ] + [new Float32Array([3, 4]), new Float32Array([3, 4])], + [new Float32Array([3, 4]), new Float32Array([3, 4])], ]; const originalResult = originalKernel(a); assert.deepEqual(originalResult.result, expected); @@ -50,21 +42,30 @@ function testReturn(mode, context, canvas) { gpu.destroy(); } -(GPU.isSinglePrecisionSupported && GPU.isWebGLSupported ? test : skip)('webgl', () => { - const canvas = document.createElement('canvas'); - const context = canvas.getContext('webgl'); - testReturn('webgl', context, canvas); -}); +(GPU.isSinglePrecisionSupported && GPU.isWebGLSupported ? test : skip)( + 'webgl', + () => { + const canvas = document.createElement('canvas'); + const context = canvas.getContext('webgl'); + testReturn('webgl', context, canvas); + } +); -(GPU.isSinglePrecisionSupported && GPU.isWebGL2Supported ? test : skip)('webgl2', () => { - const canvas = document.createElement('canvas'); - const context = canvas.getContext('webgl2'); - testReturn('webgl2', context, canvas); -}); +(GPU.isSinglePrecisionSupported && GPU.isWebGL2Supported ? test : skip)( + 'webgl2', + () => { + const canvas = document.createElement('canvas'); + const context = canvas.getContext('webgl2'); + testReturn('webgl2', context, canvas); + } +); -(GPU.isSinglePrecisionSupported && GPU.isHeadlessGLSupported ? test : skip)('headlessgl', () => { - testReturn('headlessgl', require('gl')(1, 1), null); -}); +(GPU.isSinglePrecisionSupported && GPU.isHeadlessGLSupported ? test : skip)( + 'headlessgl', + () => { + testReturn('headlessgl', require('gl')(1, 1), null); + } +); test('cpu', () => { testReturn('cpu'); diff --git a/test/features/to-string/precision/single/kernel-map/object/memory-optimized-number-texture.js b/test/features/to-string/precision/single/kernel-map/object/memory-optimized-number-texture.js index 06c27cd3..bf097a00 100644 --- a/test/features/to-string/precision/single/kernel-map/object/memory-optimized-number-texture.js +++ b/test/features/to-string/precision/single/kernel-map/object/memory-optimized-number-texture.js @@ -1,25 +1,31 @@ const { assert, skip, test, module: describe, only } = require('qunit'); -const { GPU } = require('../../../../../../../src'); +const { GPU } = require('../../../../../../..'); -describe('feature: to-string single precision object style kernel map returns MemoryOptimizedNumberTexture'); +describe( + 'feature: to-string single precision object style kernel map returns MemoryOptimizedNumberTexture' +); function testReturn(mode, context, canvas) { const gpu = new GPU({ mode }); function addOne(value) { return value + 1; } - const originalKernel = gpu.createKernelMap({ addOneResult: addOne }, function(a) { - const result = a[this.thread.x] + 1; - addOne(result); - return result; - }, { - canvas, - context, - output: [6], - precision: 'single', - pipeline: true, - optimizeFloatMemory: true, - }); + const originalKernel = gpu.createKernelMap( + { addOneResult: addOne }, + function (a) { + const result = a[this.thread.x] + 1; + addOne(result); + return result; + }, + { + canvas, + context, + output: [6], + precision: 'single', + pipeline: true, + optimizeFloatMemory: true, + } + ); const a = [1, 2, 3, 4, 5, 6]; const expected = new Float32Array([2, 3, 4, 5, 6, 7]); @@ -34,18 +40,27 @@ function testReturn(mode, context, canvas) { gpu.destroy(); } -(GPU.isSinglePrecisionSupported && GPU.isWebGLSupported ? test : skip)('webgl', () => { - const canvas = document.createElement('canvas'); - const context = canvas.getContext('webgl'); - testReturn('webgl', context, canvas); -}); +(GPU.isSinglePrecisionSupported && GPU.isWebGLSupported ? test : skip)( + 'webgl', + () => { + const canvas = document.createElement('canvas'); + const context = canvas.getContext('webgl'); + testReturn('webgl', context, canvas); + } +); -(GPU.isSinglePrecisionSupported && GPU.isWebGL2Supported ? test : skip)('webgl2', () => { - const canvas = document.createElement('canvas'); - const context = canvas.getContext('webgl2'); - testReturn('webgl2', context, canvas); -}); +(GPU.isSinglePrecisionSupported && GPU.isWebGL2Supported ? test : skip)( + 'webgl2', + () => { + const canvas = document.createElement('canvas'); + const context = canvas.getContext('webgl2'); + testReturn('webgl2', context, canvas); + } +); -(GPU.isSinglePrecisionSupported && GPU.isHeadlessGLSupported ? test : skip)('headlessgl', () => { - testReturn('headlessgl', require('gl')(1, 1), null); -}); +(GPU.isSinglePrecisionSupported && GPU.isHeadlessGLSupported ? test : skip)( + 'headlessgl', + () => { + testReturn('headlessgl', require('gl')(1, 1), null); + } +); diff --git a/test/features/to-string/precision/single/kernel-map/object/number-texture.js b/test/features/to-string/precision/single/kernel-map/object/number-texture.js index ee294f1e..5fe73ed5 100644 --- a/test/features/to-string/precision/single/kernel-map/object/number-texture.js +++ b/test/features/to-string/precision/single/kernel-map/object/number-texture.js @@ -1,24 +1,30 @@ const { assert, skip, test, module: describe, only } = require('qunit'); -const { GPU } = require('../../../../../../../src'); +const { GPU } = require('../../../../../../..'); -describe('feature: to-string single precision object style kernel map returns NumberTexture'); +describe( + 'feature: to-string single precision object style kernel map returns NumberTexture' +); function testReturn(mode, context, canvas) { const gpu = new GPU({ mode }); function addOne(value) { return value + 1; } - const originalKernel = gpu.createKernelMap({ addOneResult: addOne }, function(a) { - const result = a[this.thread.x] + 1; - addOne(result); - return result; - }, { - canvas, - context, - output: [6], - precision: 'single', - pipeline: true, - }); + const originalKernel = gpu.createKernelMap( + { addOneResult: addOne }, + function (a) { + const result = a[this.thread.x] + 1; + addOne(result); + return result; + }, + { + canvas, + context, + output: [6], + precision: 'single', + pipeline: true, + } + ); const a = [1, 2, 3, 4, 5, 6]; const expected = new Float32Array([2, 3, 4, 5, 6, 7]); @@ -33,18 +39,27 @@ function testReturn(mode, context, canvas) { gpu.destroy(); } -(GPU.isSinglePrecisionSupported && GPU.isWebGLSupported ? test : skip)('webgl', () => { - const canvas = document.createElement('canvas'); - const context = canvas.getContext('webgl'); - testReturn('webgl', context, canvas); -}); +(GPU.isSinglePrecisionSupported && GPU.isWebGLSupported ? test : skip)( + 'webgl', + () => { + const canvas = document.createElement('canvas'); + const context = canvas.getContext('webgl'); + testReturn('webgl', context, canvas); + } +); -(GPU.isSinglePrecisionSupported && GPU.isWebGL2Supported ? test : skip)('webgl2', () => { - const canvas = document.createElement('canvas'); - const context = canvas.getContext('webgl2'); - testReturn('webgl2', context, canvas); -}); +(GPU.isSinglePrecisionSupported && GPU.isWebGL2Supported ? test : skip)( + 'webgl2', + () => { + const canvas = document.createElement('canvas'); + const context = canvas.getContext('webgl2'); + testReturn('webgl2', context, canvas); + } +); -(GPU.isSinglePrecisionSupported && GPU.isHeadlessGLSupported ? test : skip)('headlessgl', () => { - testReturn('headlessgl', require('gl')(1, 1), null); -}); +(GPU.isSinglePrecisionSupported && GPU.isHeadlessGLSupported ? test : skip)( + 'headlessgl', + () => { + testReturn('headlessgl', require('gl')(1, 1), null); + } +); diff --git a/test/features/to-string/precision/single/returns/array.js b/test/features/to-string/precision/single/returns/array.js index fde332ec..95f519e0 100644 --- a/test/features/to-string/precision/single/returns/array.js +++ b/test/features/to-string/precision/single/returns/array.js @@ -1,18 +1,21 @@ const { assert, skip, test, module: describe, only } = require('qunit'); -const { GPU } = require('../../../../../../src'); +const { GPU } = require('../../../../../..'); describe('feature: to-string single precision returns Array'); function testReturn(mode, context, canvas) { const gpu = new GPU({ mode }); - const originalKernel = gpu.createKernel(function(a) { - return a[this.thread.x] + 1; - }, { - canvas, - context, - output: [6], - precision: 'single', - }); + const originalKernel = gpu.createKernel( + function (a) { + return a[this.thread.x] + 1; + }, + { + canvas, + context, + output: [6], + precision: 'single', + } + ); const a = [1, 2, 3, 4, 5, 6]; const expected = new Float32Array([2, 3, 4, 5, 6, 7]); @@ -24,21 +27,30 @@ function testReturn(mode, context, canvas) { gpu.destroy(); } -(GPU.isSinglePrecisionSupported && GPU.isWebGLSupported ? test : skip)('webgl', () => { - const canvas = document.createElement('canvas'); - const context = canvas.getContext('webgl'); - testReturn('webgl', context, canvas); -}); +(GPU.isSinglePrecisionSupported && GPU.isWebGLSupported ? test : skip)( + 'webgl', + () => { + const canvas = document.createElement('canvas'); + const context = canvas.getContext('webgl'); + testReturn('webgl', context, canvas); + } +); -(GPU.isSinglePrecisionSupported && GPU.isWebGL2Supported ? test : skip)('webgl2', () => { - const canvas = document.createElement('canvas'); - const context = canvas.getContext('webgl2'); - testReturn('webgl2', context, canvas); -}); +(GPU.isSinglePrecisionSupported && GPU.isWebGL2Supported ? test : skip)( + 'webgl2', + () => { + const canvas = document.createElement('canvas'); + const context = canvas.getContext('webgl2'); + testReturn('webgl2', context, canvas); + } +); -(GPU.isSinglePrecisionSupported && GPU.isHeadlessGLSupported ? test : skip)('headlessgl', () => { - testReturn('headlessgl', require('gl')(1, 1), null); -}); +(GPU.isSinglePrecisionSupported && GPU.isHeadlessGLSupported ? test : skip)( + 'headlessgl', + () => { + testReturn('headlessgl', require('gl')(1, 1), null); + } +); test('cpu', () => { testReturn('cpu'); diff --git a/test/features/to-string/precision/single/returns/array2d.js b/test/features/to-string/precision/single/returns/array2d.js index bea7ee04..09dcb15c 100644 --- a/test/features/to-string/precision/single/returns/array2d.js +++ b/test/features/to-string/precision/single/returns/array2d.js @@ -1,48 +1,60 @@ const { assert, skip, test, module: describe, only } = require('qunit'); -const { GPU } = require('../../../../../../src'); +const { GPU } = require('../../../../../..'); describe('feature: to-string single precision returns Array2D'); function testReturn(mode, context, canvas) { const gpu = new GPU({ mode }); - const originalKernel = gpu.createKernel(function(a, b) { - return a[this.thread.x] + b[this.thread.y]; - }, { - canvas, - context, - output: [2, 2], - precision: 'single', - }); + const originalKernel = gpu.createKernel( + function (a, b) { + return a[this.thread.x] + b[this.thread.y]; + }, + { + canvas, + context, + output: [2, 2], + precision: 'single', + } + ); const a = [1, 2]; const b = [2, 3]; - const expected = [ - new Float32Array([3, 4]), - new Float32Array([4, 5]), - ]; + const expected = [new Float32Array([3, 4]), new Float32Array([4, 5])]; const originalResult = originalKernel(a, b); assert.deepEqual(originalResult, expected); const kernelString = originalKernel.toString(a, b); - const newResult = new Function('return ' + kernelString)()({ context })(a, b); + const newResult = new Function('return ' + kernelString)()({ context })( + a, + b + ); assert.deepEqual(newResult, expected); gpu.destroy(); } -(GPU.isSinglePrecisionSupported && GPU.isWebGLSupported ? test : skip)('webgl', () => { - const canvas = document.createElement('canvas'); - const context = canvas.getContext('webgl'); - testReturn('webgl', context, canvas); -}); +(GPU.isSinglePrecisionSupported && GPU.isWebGLSupported ? test : skip)( + 'webgl', + () => { + const canvas = document.createElement('canvas'); + const context = canvas.getContext('webgl'); + testReturn('webgl', context, canvas); + } +); -(GPU.isSinglePrecisionSupported && GPU.isWebGL2Supported ? test : skip)('webgl2', () => { - const canvas = document.createElement('canvas'); - const context = canvas.getContext('webgl2'); - testReturn('webgl2', context, canvas); -}); +(GPU.isSinglePrecisionSupported && GPU.isWebGL2Supported ? test : skip)( + 'webgl2', + () => { + const canvas = document.createElement('canvas'); + const context = canvas.getContext('webgl2'); + testReturn('webgl2', context, canvas); + } +); -(GPU.isSinglePrecisionSupported && GPU.isHeadlessGLSupported ? test : skip)('headlessgl', () => { - testReturn('headlessgl', require('gl')(1, 1), null); -}); +(GPU.isSinglePrecisionSupported && GPU.isHeadlessGLSupported ? test : skip)( + 'headlessgl', + () => { + testReturn('headlessgl', require('gl')(1, 1), null); + } +); test('cpu', () => { testReturn('cpu'); diff --git a/test/features/to-string/precision/single/returns/array3d.js b/test/features/to-string/precision/single/returns/array3d.js index 04828661..e0b2ebe7 100644 --- a/test/features/to-string/precision/single/returns/array3d.js +++ b/test/features/to-string/precision/single/returns/array3d.js @@ -1,54 +1,65 @@ const { assert, skip, test, module: describe, only } = require('qunit'); -const { GPU } = require('../../../../../../src'); +const { GPU } = require('../../../../../..'); describe('feature: to-string single precision returns Array3d'); function testReturn(mode, context, canvas) { const gpu = new GPU({ mode }); - const originalKernel = gpu.createKernel(function(a, b, c) { - return a[this.thread.x] + b[this.thread.y] + c[this.thread.z]; - }, { - canvas, - context, - output: [2, 2, 2], - precision: 'single', - }); + const originalKernel = gpu.createKernel( + function (a, b, c) { + return a[this.thread.x] + b[this.thread.y] + c[this.thread.z]; + }, + { + canvas, + context, + output: [2, 2, 2], + precision: 'single', + } + ); const a = [1, 2]; const b = [3, 4]; const c = [5, 6]; const expected = [ - [ - new Float32Array([9,10]), - new Float32Array([10,11]), - ],[ - new Float32Array([10,11]), - new Float32Array([11,12]), - ] + [new Float32Array([9, 10]), new Float32Array([10, 11])], + [new Float32Array([10, 11]), new Float32Array([11, 12])], ]; const originalResult = originalKernel(a, b, c); assert.deepEqual(originalResult, expected); const kernelString = originalKernel.toString(a, b, c); - const newResult = new Function('return ' + kernelString)()({ context })(a, b, c); + const newResult = new Function('return ' + kernelString)()({ context })( + a, + b, + c + ); assert.deepEqual(newResult, expected); gpu.destroy(); } -(GPU.isSinglePrecisionSupported && GPU.isWebGLSupported ? test : skip)('webgl', () => { - const canvas = document.createElement('canvas'); - const context = canvas.getContext('webgl'); - testReturn('webgl', context, canvas); -}); +(GPU.isSinglePrecisionSupported && GPU.isWebGLSupported ? test : skip)( + 'webgl', + () => { + const canvas = document.createElement('canvas'); + const context = canvas.getContext('webgl'); + testReturn('webgl', context, canvas); + } +); -(GPU.isSinglePrecisionSupported && GPU.isWebGL2Supported ? test : skip)('webgl2', () => { - const canvas = document.createElement('canvas'); - const context = canvas.getContext('webgl2'); - testReturn('webgl2', context, canvas); -}); +(GPU.isSinglePrecisionSupported && GPU.isWebGL2Supported ? test : skip)( + 'webgl2', + () => { + const canvas = document.createElement('canvas'); + const context = canvas.getContext('webgl2'); + testReturn('webgl2', context, canvas); + } +); -(GPU.isSinglePrecisionSupported && GPU.isHeadlessGLSupported ? test : skip)('headlessgl', () => { - testReturn('headlessgl', require('gl')(1, 1), null); -}); +(GPU.isSinglePrecisionSupported && GPU.isHeadlessGLSupported ? test : skip)( + 'headlessgl', + () => { + testReturn('headlessgl', require('gl')(1, 1), null); + } +); test('cpu', () => { testReturn('cpu'); diff --git a/test/features/to-string/precision/single/returns/texture.js b/test/features/to-string/precision/single/returns/texture.js index d0cf4ecc..34e7105a 100644 --- a/test/features/to-string/precision/single/returns/texture.js +++ b/test/features/to-string/precision/single/returns/texture.js @@ -1,19 +1,22 @@ const { assert, skip, test, module: describe, only } = require('qunit'); -const { GPU } = require('../../../../../../src'); +const { GPU } = require('../../../../../..'); describe('feature: to-string single precision returns Texture'); function testReturn(mode, context, canvas) { const gpu = new GPU({ mode }); - const originalKernel = gpu.createKernel(function(a) { - return a[this.thread.x] + 1; - }, { - canvas, - context, - output: [6], - precision: 'single', - pipeline: true, - }); + const originalKernel = gpu.createKernel( + function (a) { + return a[this.thread.x] + 1; + }, + { + canvas, + context, + output: [6], + precision: 'single', + pipeline: true, + } + ); const a = [1, 2, 3, 4, 5, 6]; const expected = new Float32Array([2, 3, 4, 5, 6, 7]); @@ -25,18 +28,27 @@ function testReturn(mode, context, canvas) { gpu.destroy(); } -(GPU.isSinglePrecisionSupported && GPU.isWebGLSupported ? test : skip)('webgl', () => { - const canvas = document.createElement('canvas'); - const context = canvas.getContext('webgl'); - testReturn('webgl', context, canvas); -}); +(GPU.isSinglePrecisionSupported && GPU.isWebGLSupported ? test : skip)( + 'webgl', + () => { + const canvas = document.createElement('canvas'); + const context = canvas.getContext('webgl'); + testReturn('webgl', context, canvas); + } +); -(GPU.isSinglePrecisionSupported && GPU.isWebGL2Supported ? test : skip)('webgl2', () => { - const canvas = document.createElement('canvas'); - const context = canvas.getContext('webgl2'); - testReturn('webgl2', context, canvas); -}); +(GPU.isSinglePrecisionSupported && GPU.isWebGL2Supported ? test : skip)( + 'webgl2', + () => { + const canvas = document.createElement('canvas'); + const context = canvas.getContext('webgl2'); + testReturn('webgl2', context, canvas); + } +); -(GPU.isSinglePrecisionSupported && GPU.isHeadlessGLSupported ? test : skip)('headlessgl', () => { - testReturn('headlessgl', require('gl')(1, 1), null); -}); +(GPU.isSinglePrecisionSupported && GPU.isHeadlessGLSupported ? test : skip)( + 'headlessgl', + () => { + testReturn('headlessgl', require('gl')(1, 1), null); + } +); diff --git a/test/features/to-string/precision/unsigned/arguments/array.js b/test/features/to-string/precision/unsigned/arguments/array.js index 18f6ef72..9256795e 100644 --- a/test/features/to-string/precision/unsigned/arguments/array.js +++ b/test/features/to-string/precision/unsigned/arguments/array.js @@ -1,21 +1,24 @@ const { assert, skip, test, module: describe, only } = require('qunit'); -const { GPU } = require('../../../../../../src'); +const { GPU } = require('../../../../../..'); describe('feature: to-string unsigned precision arguments Array'); function testArgument(mode, context, canvas) { const gpu = new GPU({ mode }); - const originalKernel = gpu.createKernel(function(a) { - return a[this.thread.x]; - }, { - canvas, - context, - output: [4], - precision: 'unsigned', - }); + const originalKernel = gpu.createKernel( + function (a) { + return a[this.thread.x]; + }, + { + canvas, + context, + output: [4], + precision: 'unsigned', + } + ); const a = [1, 2, 3, 4]; - const expected = new Float32Array([1,2,3,4]); + const expected = new Float32Array([1, 2, 3, 4]); const originalResult = originalKernel(a); assert.deepEqual(originalResult, expected); const kernelString = originalKernel.toString(a); @@ -23,8 +26,8 @@ function testArgument(mode, context, canvas) { const newResult = newKernel(a); assert.deepEqual(newResult, expected); - const b = [4,3,2,1]; - const expected2 = new Float32Array([4,3,2,1]); + const b = [4, 3, 2, 1]; + const expected2 = new Float32Array([4, 3, 2, 1]); const newResult2 = newKernel(b); assert.deepEqual(newResult2, expected2); gpu.destroy(); diff --git a/test/features/to-string/precision/unsigned/arguments/array2.js b/test/features/to-string/precision/unsigned/arguments/array2.js index e4ce7279..537e7fc8 100644 --- a/test/features/to-string/precision/unsigned/arguments/array2.js +++ b/test/features/to-string/precision/unsigned/arguments/array2.js @@ -1,22 +1,25 @@ const { assert, skip, test, module: describe, only } = require('qunit'); -const { GPU } = require('../../../../../../src'); +const { GPU } = require('../../../../../..'); describe('feature: to-string unsigned precision arguments Array(2)'); function testArgument(mode, context, canvas) { const gpu = new GPU({ mode }); - const originalKernel = gpu.createKernel(function(a) { - return a; - }, { - canvas, - context, - output: [1], - precision: 'unsigned', - argumentTypes: { a: 'Array(2)' } - }); + const originalKernel = gpu.createKernel( + function (a) { + return a; + }, + { + canvas, + context, + output: [1], + precision: 'unsigned', + argumentTypes: { a: 'Array(2)' }, + } + ); const a = new Float32Array([1, 2]); - const expected = [new Float32Array([1,2])]; + const expected = [new Float32Array([1, 2])]; const originalResult = originalKernel(a); assert.deepEqual(originalResult, expected); const kernelString = originalKernel.toString(a); @@ -25,7 +28,7 @@ function testArgument(mode, context, canvas) { assert.deepEqual(newResult, expected); const b = new Float32Array([2, 1]); - const expected2 = [new Float32Array([2,1])]; + const expected2 = [new Float32Array([2, 1])]; const newResult2 = newKernel(b); assert.deepEqual(newResult2, expected2); gpu.destroy(); diff --git a/test/features/to-string/precision/unsigned/arguments/array2d.js b/test/features/to-string/precision/unsigned/arguments/array2d.js index 670a0bf7..425b2452 100644 --- a/test/features/to-string/precision/unsigned/arguments/array2d.js +++ b/test/features/to-string/precision/unsigned/arguments/array2d.js @@ -1,22 +1,25 @@ const { assert, skip, test, module: describe, only } = require('qunit'); -const { GPU } = require('../../../../../../src'); +const { GPU } = require('../../../../../..'); describe('feature: to-string unsigned precision arguments Array2D'); function testArgument(mode, context, canvas) { const gpu = new GPU({ mode }); - const originalKernel = gpu.createKernel(function(a) { - let sum = 0; - for (let y = 0; y < 4; y++) { - sum += a[y][this.thread.x]; + const originalKernel = gpu.createKernel( + function (a) { + let sum = 0; + for (let y = 0; y < 4; y++) { + sum += a[y][this.thread.x]; + } + return sum; + }, + { + canvas, + context, + output: [4], + precision: 'unsigned', } - return sum; - }, { - canvas, - context, - output: [4], - precision: 'unsigned', - }); + ); const a = [ [1, 2, 3, 4], @@ -30,7 +33,7 @@ function testArgument(mode, context, canvas) { [1, 1, 1, 1], [1, 1, 1, 1], ]; - const expected = new Float32Array([28,32,36,40]); + const expected = new Float32Array([28, 32, 36, 40]); const originalResult = originalKernel(a); assert.deepEqual(originalResult, expected); const kernelString = originalKernel.toString(a); @@ -38,7 +41,7 @@ function testArgument(mode, context, canvas) { const newResult = newKernel(a); assert.deepEqual(newResult, expected); - const expected2 = new Float32Array([4,4,4,4]); + const expected2 = new Float32Array([4, 4, 4, 4]); const newResult2 = newKernel(b); assert.deepEqual(newResult2, expected2); gpu.destroy(); diff --git a/test/features/to-string/precision/unsigned/arguments/array3.js b/test/features/to-string/precision/unsigned/arguments/array3.js index e1bc7428..3bb4c14d 100644 --- a/test/features/to-string/precision/unsigned/arguments/array3.js +++ b/test/features/to-string/precision/unsigned/arguments/array3.js @@ -1,22 +1,25 @@ const { assert, skip, test, module: describe, only } = require('qunit'); -const { GPU } = require('../../../../../../src'); +const { GPU } = require('../../../../../..'); describe('feature: to-string unsigned precision arguments Array(3)'); function testArgument(mode, context, canvas) { const gpu = new GPU({ mode }); - const originalKernel = gpu.createKernel(function(a) { - return a; - }, { - canvas, - context, - output: [1], - precision: 'unsigned', - argumentTypes: { a: 'Array(3)' } - }); + const originalKernel = gpu.createKernel( + function (a) { + return a; + }, + { + canvas, + context, + output: [1], + precision: 'unsigned', + argumentTypes: { a: 'Array(3)' }, + } + ); const a = new Float32Array([1, 2, 3]); - const expected = [new Float32Array([1,2,3])]; + const expected = [new Float32Array([1, 2, 3])]; const originalResult = originalKernel(a); assert.deepEqual(originalResult, expected); const kernelString = originalKernel.toString(a); @@ -25,7 +28,7 @@ function testArgument(mode, context, canvas) { assert.deepEqual(newResult, expected); const b = new Float32Array([1, 1, 1]); - const expected2 = [new Float32Array([1,1,1])]; + const expected2 = [new Float32Array([1, 1, 1])]; const newResult2 = newKernel(b); assert.deepEqual(newResult2, expected2); gpu.destroy(); diff --git a/test/features/to-string/precision/unsigned/arguments/array3d.js b/test/features/to-string/precision/unsigned/arguments/array3d.js index 46e465f0..c657d915 100644 --- a/test/features/to-string/precision/unsigned/arguments/array3d.js +++ b/test/features/to-string/precision/unsigned/arguments/array3d.js @@ -1,24 +1,27 @@ const { assert, skip, test, module: describe, only } = require('qunit'); -const { GPU } = require('../../../../../../src'); +const { GPU } = require('../../../../../..'); describe('feature: to-string unsigned precision arguments Array3D'); function testArgument(mode, context, canvas) { const gpu = new GPU({ mode }); - const originalKernel = gpu.createKernel(function(a) { - let sum = 0; - for (let z = 0; z < 2; z++) { - for (let y = 0; y < 2; y++) { - sum += a[z][y][this.thread.x]; + const originalKernel = gpu.createKernel( + function (a) { + let sum = 0; + for (let z = 0; z < 2; z++) { + for (let y = 0; y < 2; y++) { + sum += a[z][y][this.thread.x]; + } } + return sum; + }, + { + canvas, + context, + output: [2], + precision: 'unsigned', } - return sum; - }, { - canvas, - context, - output: [2], - precision: 'unsigned', - }); + ); const a = [ [ @@ -28,7 +31,7 @@ function testArgument(mode, context, canvas) { [ [5, 6], [7, 8], - ] + ], ]; const expected = new Float32Array([16, 20]); const originalResult = originalKernel(a); @@ -46,7 +49,7 @@ function testArgument(mode, context, canvas) { [ [1, 1], [1, 1], - ] + ], ]; const expected2 = new Float32Array([4, 4]); const newResult2 = newKernel(b); diff --git a/test/features/to-string/precision/unsigned/arguments/array4.js b/test/features/to-string/precision/unsigned/arguments/array4.js index ca319303..4f1a343c 100644 --- a/test/features/to-string/precision/unsigned/arguments/array4.js +++ b/test/features/to-string/precision/unsigned/arguments/array4.js @@ -1,22 +1,25 @@ const { assert, skip, test, module: describe, only } = require('qunit'); -const { GPU } = require('../../../../../../src'); +const { GPU } = require('../../../../../..'); describe('feature: to-string unsigned precision arguments Array(4)'); function testArgument(mode, context, canvas) { const gpu = new GPU({ mode }); - const originalKernel = gpu.createKernel(function(a) { - return a; - }, { - canvas, - context, - output: [1], - precision: 'unsigned', - argumentTypes: { a: 'Array(4)' } - }); + const originalKernel = gpu.createKernel( + function (a) { + return a; + }, + { + canvas, + context, + output: [1], + precision: 'unsigned', + argumentTypes: { a: 'Array(4)' }, + } + ); const a = new Float32Array([1, 2, 3, 4]); - const expected = [new Float32Array([1,2,3,4])]; + const expected = [new Float32Array([1, 2, 3, 4])]; const originalResult = originalKernel(a); assert.deepEqual(originalResult, expected); const kernelString = originalKernel.toString(a); @@ -25,7 +28,7 @@ function testArgument(mode, context, canvas) { assert.deepEqual(newResult, expected); const b = new Float32Array([1, 1, 1, 1]); - const expected2 = [new Float32Array([1,1,1,1])]; + const expected2 = [new Float32Array([1, 1, 1, 1])]; const newResult2 = newKernel(b); assert.deepEqual(newResult2, expected2); gpu.destroy(); diff --git a/test/features/to-string/precision/unsigned/arguments/boolean.js b/test/features/to-string/precision/unsigned/arguments/boolean.js index 157b3ac3..2dd585b6 100644 --- a/test/features/to-string/precision/unsigned/arguments/boolean.js +++ b/test/features/to-string/precision/unsigned/arguments/boolean.js @@ -1,18 +1,21 @@ const { assert, skip, test, module: describe, only } = require('qunit'); -const { GPU } = require('../../../../../../src'); +const { GPU } = require('../../../../../..'); describe('feature: to-string unsigned precision arguments Boolean'); function testArgument(mode, context, canvas) { const gpu = new GPU({ mode }); - const originalKernel = gpu.createKernel(function(a) { - return a ? 42 : -42; - }, { - canvas, - context, - output: [1], - precision: 'unsigned', - }); + const originalKernel = gpu.createKernel( + function (a) { + return a ? 42 : -42; + }, + { + canvas, + context, + output: [1], + precision: 'unsigned', + } + ); assert.deepEqual(originalKernel(true)[0], 42); assert.deepEqual(originalKernel(false)[0], -42); const kernelString = originalKernel.toString(true); diff --git a/test/features/to-string/precision/unsigned/arguments/float.js b/test/features/to-string/precision/unsigned/arguments/float.js index aabe1cf2..920bcb02 100644 --- a/test/features/to-string/precision/unsigned/arguments/float.js +++ b/test/features/to-string/precision/unsigned/arguments/float.js @@ -1,19 +1,22 @@ const { assert, skip, test, module: describe, only } = require('qunit'); -const { GPU } = require('../../../../../../src'); +const { GPU } = require('../../../../../..'); describe('feature: to-string unsigned precision arguments Float'); function testArgument(mode, context, canvas) { const gpu = new GPU({ mode }); - const originalKernel = gpu.createKernel(function(a) { - return Math.floor(a) === 100 ? 42 : -42; - }, { - canvas, - context, - output: [1], - precision: 'unsigned', - argumentTypes: { a: 'Float' }, - }); + const originalKernel = gpu.createKernel( + function (a) { + return Math.floor(a) === 100 ? 42 : -42; + }, + { + canvas, + context, + output: [1], + precision: 'unsigned', + argumentTypes: { a: 'Float' }, + } + ); assert.equal(originalKernel.argumentTypes[0], 'Float'); assert.deepEqual(originalKernel(100)[0], 42); assert.deepEqual(originalKernel(10)[0], -42); diff --git a/test/features/to-string/precision/unsigned/arguments/html-canvas.js b/test/features/to-string/precision/unsigned/arguments/html-canvas.js index e0ae40ed..62b03344 100644 --- a/test/features/to-string/precision/unsigned/arguments/html-canvas.js +++ b/test/features/to-string/precision/unsigned/arguments/html-canvas.js @@ -1,5 +1,5 @@ const { assert, skip, test, module: describe, only } = require('qunit'); -const { GPU } = require('../../../../../../src'); +const { GPU } = require('../../../../../..'); const { greenCanvas } = require('../../../../../browser-test-utils'); describe('feature: to-string unsigned precision arguments HTMLCanvas'); @@ -7,33 +7,43 @@ describe('feature: to-string unsigned precision arguments HTMLCanvas'); function testArgument(mode, done) { const canvasInput1 = greenCanvas(mode, 1, 1); const canvasInput2 = greenCanvas(mode, 1, 1); - const gpu = new GPU({mode}); - const originalKernel = gpu.createKernel(function (canvas1, canvas2) { - const pixel1 = canvas1[this.thread.y][this.thread.x]; - const pixel2 = canvas2[this.thread.y][this.thread.x]; - return pixel1[1] + pixel2[1]; - }, { - output: [1], - precision: 'unsigned', - argumentTypes: ['HTMLCanvas', 'HTMLCanvas'], - }); + const gpu = new GPU({ mode }); + const originalKernel = gpu.createKernel( + function (canvas1, canvas2) { + const pixel1 = canvas1[this.thread.y][this.thread.x]; + const pixel2 = canvas2[this.thread.y][this.thread.x]; + return pixel1[1] + pixel2[1]; + }, + { + output: [1], + precision: 'unsigned', + argumentTypes: ['HTMLCanvas', 'HTMLCanvas'], + } + ); const canvas = originalKernel.canvas; const context = originalKernel.context; assert.deepEqual(originalKernel(canvasInput1, canvasInput2)[0], 2); const kernelString = originalKernel.toString(canvasInput1, canvasInput2); - const newKernel = new Function('return ' + kernelString)()({context, canvas}); + const newKernel = new Function('return ' + kernelString)()({ + context, + canvas, + }); const canvasInput3 = greenCanvas(mode, 1, 1); const canvasInput4 = greenCanvas(mode, 1, 1); assert.deepEqual(newKernel(canvasInput3, canvasInput4)[0], 2); gpu.destroy(); } -(GPU.isSinglePrecisionSupported && GPU.isWebGLSupported ? test : skip)('webgl', () => { - testArgument('webgl'); -}); - -(GPU.isSinglePrecisionSupported && GPU.isWebGL2Supported ? test : skip)('webgl2', () => { - testArgument('webgl2'); -}); - +(GPU.isSinglePrecisionSupported && GPU.isWebGLSupported ? test : skip)( + 'webgl', + () => { + testArgument('webgl'); + } +); +(GPU.isSinglePrecisionSupported && GPU.isWebGL2Supported ? test : skip)( + 'webgl2', + () => { + testArgument('webgl2'); + } +); diff --git a/test/features/to-string/precision/unsigned/arguments/html-image-array.js b/test/features/to-string/precision/unsigned/arguments/html-image-array.js index a259b44a..44ef2f2d 100644 --- a/test/features/to-string/precision/unsigned/arguments/html-image-array.js +++ b/test/features/to-string/precision/unsigned/arguments/html-image-array.js @@ -1,5 +1,5 @@ const { assert, skip, test, module: describe, only } = require('qunit'); -const { GPU, CPUKernel } = require('../../../../../../src'); +const { GPU, CPUKernel } = require('../../../../../..'); describe('feature: to-string unsigned precision arguments HTMLImageArray'); @@ -9,45 +9,54 @@ function testArgument(mode, done) { 'jellyfish-2.jpeg', 'jellyfish-3.jpeg', 'jellyfish-4.jpeg', - ]) - .then(([image1, image2, image3, image4]) => { - const imagesArray1 = [image1, image2]; - const imagesArray2 = [image3, image4]; - const gpu = new GPU({mode}); - const originalKernel = gpu.createKernel(function (a, selection) { + ]).then(([image1, image2, image3, image4]) => { + const imagesArray1 = [image1, image2]; + const imagesArray2 = [image3, image4]; + const gpu = new GPU({ mode }); + const originalKernel = gpu.createKernel( + function (a, selection) { const image0 = a[0][0][0]; const image1 = a[1][0][0]; switch (selection) { - case 0: return image0.r * 255; - case 1: return image1.r * 255; - case 2: return image0.g * 255; - case 3: return image1.g * 255; + case 0: + return image0.r * 255; + case 1: + return image1.r * 255; + case 2: + return image0.g * 255; + case 3: + return image1.g * 255; } - }, { + }, + { output: [1], precision: 'unsigned', argumentTypes: ['HTMLImageArray', 'Integer'], - }); - assert.deepEqual(originalKernel(imagesArray1, 0)[0], 172); - assert.deepEqual(originalKernel(imagesArray1, 1)[0], 255); - assert.deepEqual(originalKernel(imagesArray2, 2)[0], 87); - assert.deepEqual(originalKernel(imagesArray2, 3)[0], 110); - const kernelString = originalKernel.toString(imagesArray1, 0); - const canvas = originalKernel.canvas; - const context = originalKernel.context; - const newKernel = new Function('return ' + kernelString)()({context, canvas}); - assert.deepEqual(newKernel(imagesArray1, 0)[0], 172); - assert.deepEqual(newKernel(imagesArray1, 1)[0], 255); - assert.deepEqual(newKernel(imagesArray2, 2)[0], 87); - assert.deepEqual(newKernel(imagesArray2, 3)[0], 110); - gpu.destroy(); - done(originalKernel, newKernel); + } + ); + assert.deepEqual(originalKernel(imagesArray1, 0)[0], 172); + assert.deepEqual(originalKernel(imagesArray1, 1)[0], 255); + assert.deepEqual(originalKernel(imagesArray2, 2)[0], 87); + assert.deepEqual(originalKernel(imagesArray2, 3)[0], 110); + const kernelString = originalKernel.toString(imagesArray1, 0); + const canvas = originalKernel.canvas; + const context = originalKernel.context; + const newKernel = new Function('return ' + kernelString)()({ + context, + canvas, }); + assert.deepEqual(newKernel(imagesArray1, 0)[0], 172); + assert.deepEqual(newKernel(imagesArray1, 1)[0], 255); + assert.deepEqual(newKernel(imagesArray2, 2)[0], 87); + assert.deepEqual(newKernel(imagesArray2, 3)[0], 110); + gpu.destroy(); + done(originalKernel, newKernel); + }); } (GPU.isWebGLSupported ? test : skip)('webgl', t => { const done = t.async(); - testArgument('webgl', (kernel) => { + testArgument('webgl', kernel => { // They aren't supported, so test that kernel falls back assert.equal(kernel.kernel.constructor, CPUKernel); done(); diff --git a/test/features/to-string/precision/unsigned/arguments/html-image.js b/test/features/to-string/precision/unsigned/arguments/html-image.js index 86134f88..f60f43f3 100644 --- a/test/features/to-string/precision/unsigned/arguments/html-image.js +++ b/test/features/to-string/precision/unsigned/arguments/html-image.js @@ -1,30 +1,37 @@ const { assert, skip, test, module: describe, only } = require('qunit'); -const { GPU } = require('../../../../../../src'); +const { GPU } = require('../../../../../..'); describe('feature: to-string unsigned precision arguments HTMLImage'); function testArgument(mode, done) { - loadImages(['jellyfish-1.jpeg', 'jellyfish-2.jpeg']) - .then(([image1, image2]) => { - const gpu = new GPU({mode}); - const originalKernel = gpu.createKernel(function (a) { - const pixel = a[0][0]; - return pixel.b * 255; - }, { - output: [1], - precision: 'unsigned', - argumentTypes: ['HTMLImage'], - }); + loadImages(['jellyfish-1.jpeg', 'jellyfish-2.jpeg']).then( + ([image1, image2]) => { + const gpu = new GPU({ mode }); + const originalKernel = gpu.createKernel( + function (a) { + const pixel = a[0][0]; + return pixel.b * 255; + }, + { + output: [1], + precision: 'unsigned', + argumentTypes: ['HTMLImage'], + } + ); const canvas = originalKernel.canvas; const context = originalKernel.context; assert.deepEqual(originalKernel(image1)[0], 253); const kernelString = originalKernel.toString(image1); - const newKernel = new Function('return ' + kernelString)()({context, canvas}); + const newKernel = new Function('return ' + kernelString)()({ + context, + canvas, + }); assert.deepEqual(newKernel(image1)[0], 253); assert.deepEqual(newKernel(image2)[0], 255); gpu.destroy(); done(); - }); + } + ); } (GPU.isWebGLSupported ? test : skip)('webgl', t => { @@ -34,5 +41,3 @@ function testArgument(mode, done) { (GPU.isWebGL2Supported ? test : skip)('webgl2', t => { testArgument('webgl2', t.async()); }); - - diff --git a/test/features/to-string/precision/unsigned/arguments/html-video.js b/test/features/to-string/precision/unsigned/arguments/html-video.js index 5c4f477e..2cb26d5b 100644 --- a/test/features/to-string/precision/unsigned/arguments/html-video.js +++ b/test/features/to-string/precision/unsigned/arguments/html-video.js @@ -1,5 +1,5 @@ const { assert, skip, test, module: describe, only } = require('qunit'); -const { GPU } = require('../../../../../../src'); +const { GPU } = require('../../../../../..'); describe('feature: to-string unsigned precision arguments HTMLVideo'); @@ -7,28 +7,34 @@ function testArgument(mode, done) { const video = document.createElement('video'); video.currentTime = 2; video.src = 'jellyfish.webm'; - video.oncanplay = (e) => { + video.oncanplay = e => { video.oncanplay = null; setTimeout(() => { - const gpu = new GPU({mode}); - const originalKernel = gpu.createKernel(function (a) { - const pixel = a[0][0]; - return pixel.g * 255; - }, { - output: [1], - precision: 'unsigned', - argumentTypes: ['HTMLVideo'], - }); + const gpu = new GPU({ mode }); + const originalKernel = gpu.createKernel( + function (a) { + const pixel = a[0][0]; + return pixel.g * 255; + }, + { + output: [1], + precision: 'unsigned', + argumentTypes: ['HTMLVideo'], + } + ); const canvas = originalKernel.canvas; const context = originalKernel.context; assert.deepEqual(originalKernel(video)[0], 125); const kernelString = originalKernel.toString(video); - const newKernel = new Function('return ' + kernelString)()({context, canvas}); + const newKernel = new Function('return ' + kernelString)()({ + context, + canvas, + }); assert.deepEqual(newKernel(video)[0], 125); gpu.destroy(); done(); }, 1000); - } + }; } (GPU.isWebGLSupported ? test : skip)('webgl', t => { @@ -38,5 +44,3 @@ function testArgument(mode, done) { (GPU.isWebGL2Supported ? test : skip)('webgl2', t => { testArgument('webgl2', t.async()); }); - - diff --git a/test/features/to-string/precision/unsigned/arguments/input.js b/test/features/to-string/precision/unsigned/arguments/input.js index 0d96103d..73d769c3 100644 --- a/test/features/to-string/precision/unsigned/arguments/input.js +++ b/test/features/to-string/precision/unsigned/arguments/input.js @@ -1,26 +1,29 @@ const { assert, skip, test, module: describe, only } = require('qunit'); -const { GPU, input } = require('../../../../../../src'); +const { GPU, input } = require('../../../../../..'); describe('feature: to-string unsigned precision arguments Input'); function testArgument(mode, context, canvas) { const gpu = new GPU({ mode }); - const originalKernel = gpu.createKernel(function(a) { - let sum = 0; - for (let y = 0; y < 2; y++) { - for (let x = 0; x < 2; x++) { - sum += a[y][x]; + const originalKernel = gpu.createKernel( + function (a) { + let sum = 0; + for (let y = 0; y < 2; y++) { + for (let x = 0; x < 2; x++) { + sum += a[y][x]; + } } + return sum; + }, + { + canvas, + context, + output: [1], + precision: 'unsigned', } - return sum; - }, { - canvas, - context, - output: [1], - precision: 'unsigned', - }); - const arg1 = input([1,2,3,4],[2,2]); - const arg2 = input([5,6,7,8],[2,2]); + ); + const arg1 = input([1, 2, 3, 4], [2, 2]); + const arg2 = input([5, 6, 7, 8], [2, 2]); assert.deepEqual(originalKernel(arg1)[0], 10); assert.deepEqual(originalKernel(arg2)[0], 26); const kernelString = originalKernel.toString(arg1); diff --git a/test/features/to-string/precision/unsigned/arguments/integer.js b/test/features/to-string/precision/unsigned/arguments/integer.js index 22d1e750..7e1e1313 100644 --- a/test/features/to-string/precision/unsigned/arguments/integer.js +++ b/test/features/to-string/precision/unsigned/arguments/integer.js @@ -1,19 +1,22 @@ const { assert, skip, test, module: describe, only } = require('qunit'); -const { GPU } = require('../../../../../../src'); +const { GPU } = require('../../../../../..'); describe('feature: to-string unsigned precision arguments Integer'); function testArgument(mode, context, canvas) { const gpu = new GPU({ mode }); - const originalKernel = gpu.createKernel(function(a) { - return Math.floor(a) === 100 ? 42 : -42; - }, { - canvas, - context, - output: [1], - precision: 'unsigned', - argumentTypes: { a: 'Integer' }, - }); + const originalKernel = gpu.createKernel( + function (a) { + return Math.floor(a) === 100 ? 42 : -42; + }, + { + canvas, + context, + output: [1], + precision: 'unsigned', + argumentTypes: { a: 'Integer' }, + } + ); assert.equal(originalKernel.argumentTypes[0], 'Integer'); assert.deepEqual(originalKernel(100)[0], 42); assert.deepEqual(originalKernel(10)[0], -42); diff --git a/test/features/to-string/precision/unsigned/arguments/memory-optimized-number-texture.js b/test/features/to-string/precision/unsigned/arguments/memory-optimized-number-texture.js index 6695695e..55289fdc 100644 --- a/test/features/to-string/precision/unsigned/arguments/memory-optimized-number-texture.js +++ b/test/features/to-string/precision/unsigned/arguments/memory-optimized-number-texture.js @@ -1,41 +1,52 @@ const { assert, skip, test, module: describe, only } = require('qunit'); -const { GPU } = require('../../../../../../src'); +const { GPU } = require('../../../../../..'); -describe('feature: to-string unsigned precision arguments MemoryOptimizedNumberTexture'); +describe( + 'feature: to-string unsigned precision arguments MemoryOptimizedNumberTexture' +); function testArgument(mode, context, canvas) { const gpu = new GPU({ mode, context, canvas }); - const texture1 = gpu.createKernel(function() { - return this.thread.x; - }, { - output: [4], - optimizeFloatMemory: true, - precision: 'unsigned', - pipeline: true, - })(); - const texture2 = gpu.createKernel(function() { - return 4 - this.thread.x; - }, { - output: [4], - optimizeFloatMemory: true, - precision: 'unsigned', - pipeline: true, - })(); - const originalKernel = gpu.createKernel(function(a) { - return a[this.thread.x]; - }, { - canvas, - context, - output: [4], - precision: 'unsigned' - }); - assert.deepEqual(originalKernel(texture1), new Float32Array([0,1,2,3])); - assert.deepEqual(originalKernel(texture2), new Float32Array([4,3,2,1])); + const texture1 = gpu.createKernel( + function () { + return this.thread.x; + }, + { + output: [4], + optimizeFloatMemory: true, + precision: 'unsigned', + pipeline: true, + } + )(); + const texture2 = gpu.createKernel( + function () { + return 4 - this.thread.x; + }, + { + output: [4], + optimizeFloatMemory: true, + precision: 'unsigned', + pipeline: true, + } + )(); + const originalKernel = gpu.createKernel( + function (a) { + return a[this.thread.x]; + }, + { + canvas, + context, + output: [4], + precision: 'unsigned', + } + ); + assert.deepEqual(originalKernel(texture1), new Float32Array([0, 1, 2, 3])); + assert.deepEqual(originalKernel(texture2), new Float32Array([4, 3, 2, 1])); const kernelString = originalKernel.toString(texture1); const newKernel = new Function('return ' + kernelString)()({ context }); - assert.deepEqual(newKernel(texture1), new Float32Array([0,1,2,3])); - assert.deepEqual(newKernel(texture2), new Float32Array([4,3,2,1])); + assert.deepEqual(newKernel(texture1), new Float32Array([0, 1, 2, 3])); + assert.deepEqual(newKernel(texture2), new Float32Array([4, 3, 2, 1])); gpu.destroy(); } diff --git a/test/features/to-string/precision/unsigned/arguments/number-texture.js b/test/features/to-string/precision/unsigned/arguments/number-texture.js index a0012393..0771eafa 100644 --- a/test/features/to-string/precision/unsigned/arguments/number-texture.js +++ b/test/features/to-string/precision/unsigned/arguments/number-texture.js @@ -1,41 +1,50 @@ const { assert, skip, test, module: describe, only } = require('qunit'); -const { GPU } = require('../../../../../../src'); +const { GPU } = require('../../../../../..'); describe('feature: to-string unsigned precision arguments NumberTexture'); function testArgument(mode, context, canvas) { const gpu = new GPU({ mode, context, canvas }); - const texture1 = gpu.createKernel(function() { - return this.thread.x; - }, { - output: [4], - optimizeFloatMemory: false, - precision: 'unsigned', - pipeline: true, - })(); - const texture2 = gpu.createKernel(function() { - return 4 - this.thread.x; - }, { - output: [4], - optimizeFloatMemory: false, - precision: 'unsigned', - pipeline: true, - })(); - const originalKernel = gpu.createKernel(function(a) { - return a[this.thread.x]; - }, { - canvas, - context, - output: [4], - precision: 'unsigned' - }); - assert.deepEqual(originalKernel(texture1), new Float32Array([0,1,2,3])); - assert.deepEqual(originalKernel(texture2), new Float32Array([4,3,2,1])); + const texture1 = gpu.createKernel( + function () { + return this.thread.x; + }, + { + output: [4], + optimizeFloatMemory: false, + precision: 'unsigned', + pipeline: true, + } + )(); + const texture2 = gpu.createKernel( + function () { + return 4 - this.thread.x; + }, + { + output: [4], + optimizeFloatMemory: false, + precision: 'unsigned', + pipeline: true, + } + )(); + const originalKernel = gpu.createKernel( + function (a) { + return a[this.thread.x]; + }, + { + canvas, + context, + output: [4], + precision: 'unsigned', + } + ); + assert.deepEqual(originalKernel(texture1), new Float32Array([0, 1, 2, 3])); + assert.deepEqual(originalKernel(texture2), new Float32Array([4, 3, 2, 1])); const kernelString = originalKernel.toString(texture1); const newKernel = new Function('return ' + kernelString)()({ context }); - assert.deepEqual(newKernel(texture1), new Float32Array([0,1,2,3])); - assert.deepEqual(newKernel(texture2), new Float32Array([4,3,2,1])); + assert.deepEqual(newKernel(texture1), new Float32Array([0, 1, 2, 3])); + assert.deepEqual(newKernel(texture2), new Float32Array([4, 3, 2, 1])); gpu.destroy(); } diff --git a/test/features/to-string/precision/unsigned/constants/array.js b/test/features/to-string/precision/unsigned/constants/array.js index 5e7073c3..7992852b 100644 --- a/test/features/to-string/precision/unsigned/constants/array.js +++ b/test/features/to-string/precision/unsigned/constants/array.js @@ -1,30 +1,39 @@ const { assert, skip, test, module: describe, only } = require('qunit'); -const { GPU } = require('../../../../../../src'); +const { GPU } = require('../../../../../..'); describe('feature: to-string unsigned precision constants Array'); function testConstant(mode, context, canvas) { const gpu = new GPU({ mode }); - const originalKernel = gpu.createKernel(function() { - return this.constants.a[this.thread.x]; - }, { - canvas, - context, - output: [4], - precision: 'unsigned', - constants: { - a: [1, 2, 3, 4] + const originalKernel = gpu.createKernel( + function () { + return this.constants.a[this.thread.x]; + }, + { + canvas, + context, + output: [4], + precision: 'unsigned', + constants: { + a: [1, 2, 3, 4], + }, } - }); - const expected = new Float32Array([1,2,3,4]); + ); + const expected = new Float32Array([1, 2, 3, 4]); const originalResult = originalKernel(); assert.deepEqual(originalResult, expected); const kernelString = originalKernel.toString(); - const newResult = new Function('return ' + kernelString)()({ context, constants: { a: [1, 2, 3, 4] } })(); + const newResult = new Function('return ' + kernelString)()({ + context, + constants: { a: [1, 2, 3, 4] }, + })(); assert.deepEqual(newResult, expected); - const expected2 = new Float32Array([4,3,2,1]); - const newResult2 = new Function('return ' + kernelString)()({ context, constants: { a: [4, 3, 2, 1] } })(); + const expected2 = new Float32Array([4, 3, 2, 1]); + const newResult2 = new Function('return ' + kernelString)()({ + context, + constants: { a: [4, 3, 2, 1] }, + })(); assert.deepEqual(newResult2, expected2); gpu.destroy(); } diff --git a/test/features/to-string/precision/unsigned/constants/array2.js b/test/features/to-string/precision/unsigned/constants/array2.js index bce3d0eb..3a48039f 100644 --- a/test/features/to-string/precision/unsigned/constants/array2.js +++ b/test/features/to-string/precision/unsigned/constants/array2.js @@ -1,34 +1,43 @@ const { assert, skip, test, module: describe, only } = require('qunit'); -const { GPU } = require('../../../../../../src'); +const { GPU } = require('../../../../../..'); describe('feature: to-string unsigned precision constants Array(2)'); function testConstant(mode, context, canvas) { const gpu = new GPU({ mode }); - const originalKernel = gpu.createKernel(function() { - return this.constants.a; - }, { - canvas, - context, - output: [1], - precision: 'unsigned', - constants: { - a: new Float32Array([1, 2]) + const originalKernel = gpu.createKernel( + function () { + return this.constants.a; }, - constantTypes: { - a: 'Array(2)' + { + canvas, + context, + output: [1], + precision: 'unsigned', + constants: { + a: new Float32Array([1, 2]), + }, + constantTypes: { + a: 'Array(2)', + }, } - }); + ); const expected = [new Float32Array([1, 2])]; const originalResult = originalKernel(); assert.deepEqual(originalResult, expected); const kernelString = originalKernel.toString(); const Kernel = new Function('return ' + kernelString)(); - const newResult = Kernel({ context, constants: { a: new Float32Array([1, 2]) } })(); + const newResult = Kernel({ + context, + constants: { a: new Float32Array([1, 2]) }, + })(); assert.deepEqual(newResult, expected); // Array(2) is "sticky" as a constant, and cannot reset - const newResult2 = Kernel({ context, constants: { a: new Float32Array([2, 1]) } })(); + const newResult2 = Kernel({ + context, + constants: { a: new Float32Array([2, 1]) }, + })(); assert.deepEqual(newResult2, expected); gpu.destroy(); } diff --git a/test/features/to-string/precision/unsigned/constants/array2d.js b/test/features/to-string/precision/unsigned/constants/array2d.js index 5728c074..6d18229d 100644 --- a/test/features/to-string/precision/unsigned/constants/array2d.js +++ b/test/features/to-string/precision/unsigned/constants/array2d.js @@ -1,5 +1,5 @@ const { assert, skip, test, module: describe, only } = require('qunit'); -const { GPU } = require('../../../../../../src'); +const { GPU } = require('../../../../../..'); describe('feature: to-string unsigned precision constants Array2D'); @@ -11,22 +11,25 @@ function testConstant(mode, context, canvas) { [9, 10, 11, 12], [13, 14, 15, 16], ]; - const originalKernel = gpu.createKernel(function() { - let sum = 0; - for (let y = 0; y < 4; y++) { - sum += this.constants.a[y][this.thread.x]; + const originalKernel = gpu.createKernel( + function () { + let sum = 0; + for (let y = 0; y < 4; y++) { + sum += this.constants.a[y][this.thread.x]; + } + return sum; + }, + { + canvas, + context, + output: [4], + precision: 'unsigned', + constants: { + a, + }, } - return sum; - }, { - canvas, - context, - output: [4], - precision: 'unsigned', - constants: { - a - } - }); - const expected = new Float32Array([28,32,36,40]); + ); + const expected = new Float32Array([28, 32, 36, 40]); const originalResult = originalKernel(); assert.deepEqual(originalResult, expected); const kernelString = originalKernel.toString(); @@ -40,7 +43,7 @@ function testConstant(mode, context, canvas) { [1, 1, 1, 1], [1, 1, 1, 1], ]; - const expected2 = new Float32Array([4,4,4,4]); + const expected2 = new Float32Array([4, 4, 4, 4]); const newResult2 = Kernel({ context, constants: { a: b } })(); assert.deepEqual(newResult2, expected2); gpu.destroy(); diff --git a/test/features/to-string/precision/unsigned/constants/array3.js b/test/features/to-string/precision/unsigned/constants/array3.js index fae63691..04853984 100644 --- a/test/features/to-string/precision/unsigned/constants/array3.js +++ b/test/features/to-string/precision/unsigned/constants/array3.js @@ -1,34 +1,43 @@ const { assert, skip, test, module: describe, only } = require('qunit'); -const { GPU } = require('../../../../../../src'); +const { GPU } = require('../../../../../..'); describe('feature: to-string unsigned precision constants Array(3)'); function testConstant(mode, context, canvas) { const gpu = new GPU({ mode }); - const originalKernel = gpu.createKernel(function() { - return this.constants.a; - }, { - canvas, - context, - output: [1], - precision: 'unsigned', - constants: { - a: new Float32Array([1, 2, 3]) + const originalKernel = gpu.createKernel( + function () { + return this.constants.a; }, - constantTypes: { - a: 'Array(3)' + { + canvas, + context, + output: [1], + precision: 'unsigned', + constants: { + a: new Float32Array([1, 2, 3]), + }, + constantTypes: { + a: 'Array(3)', + }, } - }); + ); const expected = [new Float32Array([1, 2, 3])]; const originalResult = originalKernel(); assert.deepEqual(originalResult, expected); const kernelString = originalKernel.toString(); const Kernel = new Function('return ' + kernelString)(); - const newResult = Kernel({ context, constants: { a: new Float32Array([1, 2, 3]) } })(); + const newResult = Kernel({ + context, + constants: { a: new Float32Array([1, 2, 3]) }, + })(); assert.deepEqual(newResult, expected); // Array(3) is "sticky" as a constant, and cannot reset - const newResult2 = Kernel({ context, constants: { a: new Float32Array([3, 2, 1]) } })(); + const newResult2 = Kernel({ + context, + constants: { a: new Float32Array([3, 2, 1]) }, + })(); assert.deepEqual(newResult2, expected); gpu.destroy(); } diff --git a/test/features/to-string/precision/unsigned/constants/array3d.js b/test/features/to-string/precision/unsigned/constants/array3d.js index 680ae6e2..d5cef7e8 100644 --- a/test/features/to-string/precision/unsigned/constants/array3d.js +++ b/test/features/to-string/precision/unsigned/constants/array3d.js @@ -1,5 +1,5 @@ const { assert, skip, test, module: describe, only } = require('qunit'); -const { GPU } = require('../../../../../../src'); +const { GPU } = require('../../../../../..'); describe('feature: to-string unsigned precision constants Array3D'); @@ -13,25 +13,28 @@ function testConstant(mode, context, canvas) { [ [5, 6], [7, 8], - ] + ], ]; - const originalKernel = gpu.createKernel(function() { - let sum = 0; - for (let z = 0; z < 2; z++) { - for (let y = 0; y < 2; y++) { - sum += this.constants.a[z][y][this.thread.x]; + const originalKernel = gpu.createKernel( + function () { + let sum = 0; + for (let z = 0; z < 2; z++) { + for (let y = 0; y < 2; y++) { + sum += this.constants.a[z][y][this.thread.x]; + } } + return sum; + }, + { + canvas, + context, + output: [2], + precision: 'unsigned', + constants: { + a, + }, } - return sum; - }, { - canvas, - context, - output: [2], - precision: 'unsigned', - constants: { - a - } - }); + ); const expected = new Float32Array([16, 20]); const originalResult = originalKernel(); @@ -41,7 +44,6 @@ function testConstant(mode, context, canvas) { const newResult = Kernel({ context, constants: { a } })(); assert.deepEqual(newResult, expected); - const b = [ [ [1, 1], @@ -50,7 +52,7 @@ function testConstant(mode, context, canvas) { [ [1, 1], [1, 1], - ] + ], ]; const newResult2 = Kernel({ context, constants: { a: b } })(); const expected2 = new Float32Array([4, 4]); diff --git a/test/features/to-string/precision/unsigned/constants/array4.js b/test/features/to-string/precision/unsigned/constants/array4.js index a0a93754..fa9451f8 100644 --- a/test/features/to-string/precision/unsigned/constants/array4.js +++ b/test/features/to-string/precision/unsigned/constants/array4.js @@ -1,36 +1,45 @@ const { assert, skip, test, module: describe, only } = require('qunit'); -const { GPU } = require('../../../../../../src'); +const { GPU } = require('../../../../../..'); describe('feature: to-string unsigned precision constants Array(4)'); function testConstant(mode, context, canvas) { const gpu = new GPU({ mode }); const a = new Float32Array([1, 2, 3, 4]); - const originalKernel = gpu.createKernel(function() { - return this.constants.a; - }, { - canvas, - context, - output: [1], - precision: 'unsigned', - constants: { - a + const originalKernel = gpu.createKernel( + function () { + return this.constants.a; }, - constantTypes: { - a: 'Array(4)' + { + canvas, + context, + output: [1], + precision: 'unsigned', + constants: { + a, + }, + constantTypes: { + a: 'Array(4)', + }, } - }); + ); const expected = [new Float32Array([1, 2, 3, 4])]; const originalResult = originalKernel(); assert.deepEqual(originalResult, expected); const kernelString = originalKernel.toString(); - const newResult = new Function('return ' + kernelString)()({ context, constants: { a } })(); + const newResult = new Function('return ' + kernelString)()({ + context, + constants: { a }, + })(); assert.deepEqual(newResult, expected); // Array(3) is "sticky" as a constant, and cannot reset const b = new Float32Array([4, 3, 2, 1]); const expected2 = [new Float32Array([1, 2, 3, 4])]; - const newResult2 = new Function('return ' + kernelString)()({ context, constants: { a: b } })(); + const newResult2 = new Function('return ' + kernelString)()({ + context, + constants: { a: b }, + })(); assert.deepEqual(newResult2, expected2); gpu.destroy(); } diff --git a/test/features/to-string/precision/unsigned/constants/boolean.js b/test/features/to-string/precision/unsigned/constants/boolean.js index 6e65b715..a641d6cc 100644 --- a/test/features/to-string/precision/unsigned/constants/boolean.js +++ b/test/features/to-string/precision/unsigned/constants/boolean.js @@ -1,32 +1,38 @@ const { assert, skip, test, module: describe, only } = require('qunit'); -const { GPU } = require('../../../../../../src'); +const { GPU } = require('../../../../../..'); describe('feature: to-string unsigned precision constants Boolean'); function testConstant(mode, context, canvas) { const gpu = new GPU({ mode }); - const originalKernel1 = gpu.createKernel(function() { - return this.constants.a ? 42 : -42; - }, { - canvas, - context, - output: [1], - precision: 'unsigned', - constants: { - a: true + const originalKernel1 = gpu.createKernel( + function () { + return this.constants.a ? 42 : -42; + }, + { + canvas, + context, + output: [1], + precision: 'unsigned', + constants: { + a: true, + }, } - }); - const originalKernel2 = gpu.createKernel(function() { - return this.constants.a ? 42 : -42; - }, { - canvas, - context, - output: [1], - precision: 'unsigned', - constants: { - a: false + ); + const originalKernel2 = gpu.createKernel( + function () { + return this.constants.a ? 42 : -42; + }, + { + canvas, + context, + output: [1], + precision: 'unsigned', + constants: { + a: false, + }, } - }); + ); assert.deepEqual(originalKernel1()[0], 42); assert.deepEqual(originalKernel2()[0], -42); const kernelString1 = originalKernel1.toString(); diff --git a/test/features/to-string/precision/unsigned/constants/float.js b/test/features/to-string/precision/unsigned/constants/float.js index abdebe81..bbd3fcf7 100644 --- a/test/features/to-string/precision/unsigned/constants/float.js +++ b/test/features/to-string/precision/unsigned/constants/float.js @@ -1,22 +1,25 @@ const { assert, skip, test, module: describe, only } = require('qunit'); -const { GPU } = require('../../../../../../src'); +const { GPU } = require('../../../../../..'); describe('feature: to-string unsigned precision constants Float'); function testConstant(mode, context, canvas) { const gpu = new GPU({ mode }); - const originalKernel = gpu.createKernel(function() { - return Math.floor(this.constants.a) === 100 ? 42 : -42; - }, { - canvas, - context, - output: [1], - precision: 'unsigned', - constants: { - a: 100 + const originalKernel = gpu.createKernel( + function () { + return Math.floor(this.constants.a) === 100 ? 42 : -42; }, - constantTypes: { a: 'Float' } - }); + { + canvas, + context, + output: [1], + precision: 'unsigned', + constants: { + a: 100, + }, + constantTypes: { a: 'Float' }, + } + ); assert.equal(originalKernel.constantTypes.a, 'Float'); assert.deepEqual(originalKernel()[0], 42); const kernelString = originalKernel.toString(); diff --git a/test/features/to-string/precision/unsigned/constants/html-canvas.js b/test/features/to-string/precision/unsigned/constants/html-canvas.js index 8c85ba1a..1f6edfda 100644 --- a/test/features/to-string/precision/unsigned/constants/html-canvas.js +++ b/test/features/to-string/precision/unsigned/constants/html-canvas.js @@ -1,5 +1,5 @@ const { assert, skip, test, module: describe, only } = require('qunit'); -const { GPU } = require('../../../../../../src'); +const { GPU } = require('../../../../../..'); const { greenCanvas } = require('../../../../../browser-test-utils'); describe('feature: to-string unsigned precision constants HTMLCanvas'); @@ -7,16 +7,19 @@ describe('feature: to-string unsigned precision constants HTMLCanvas'); function testArgument(mode, done) { const canvasInput1 = greenCanvas(mode, 1, 1); const canvasInput2 = greenCanvas(mode, 1, 1); - const gpu = new GPU({mode}); - const originalKernel = gpu.createKernel(function () { - const pixel1 = this.constants.canvas1[this.thread.y][this.thread.x]; - const pixel2 = this.constants.canvas2[this.thread.y][this.thread.x]; - return pixel1[1] + pixel2[1]; - }, { - output: [1], - precision: 'unsigned', - constants: { canvas1: canvasInput1, canvas2: canvasInput2 } - }); + const gpu = new GPU({ mode }); + const originalKernel = gpu.createKernel( + function () { + const pixel1 = this.constants.canvas1[this.thread.y][this.thread.x]; + const pixel2 = this.constants.canvas2[this.thread.y][this.thread.x]; + return pixel1[1] + pixel2[1]; + }, + { + output: [1], + precision: 'unsigned', + constants: { canvas1: canvasInput1, canvas2: canvasInput2 }, + } + ); const canvas = originalKernel.canvas; const context = originalKernel.context; assert.deepEqual(originalKernel()[0], 2); @@ -28,19 +31,23 @@ function testArgument(mode, done) { canvas, constants: { canvas1: canvasInput3, - canvas2: canvasInput4 - } + canvas2: canvasInput4, + }, }); assert.deepEqual(newKernel()[0], 2); gpu.destroy(); } -(GPU.isSinglePrecisionSupported && GPU.isWebGLSupported ? test : skip)('webgl', () => { - testArgument('webgl'); -}); - -(GPU.isSinglePrecisionSupported && GPU.isWebGL2Supported ? test : skip)('webgl2', () => { - testArgument('webgl2'); -}); - +(GPU.isSinglePrecisionSupported && GPU.isWebGLSupported ? test : skip)( + 'webgl', + () => { + testArgument('webgl'); + } +); +(GPU.isSinglePrecisionSupported && GPU.isWebGL2Supported ? test : skip)( + 'webgl2', + () => { + testArgument('webgl2'); + } +); diff --git a/test/features/to-string/precision/unsigned/constants/html-image-array.js b/test/features/to-string/precision/unsigned/constants/html-image-array.js index db3f5267..7becef4f 100644 --- a/test/features/to-string/precision/unsigned/constants/html-image-array.js +++ b/test/features/to-string/precision/unsigned/constants/html-image-array.js @@ -1,5 +1,5 @@ const { assert, skip, test, module: describe, only } = require('qunit'); -const { GPU, CPUKernel } = require('../../../../../../src'); +const { GPU, CPUKernel } = require('../../../../../..'); describe('feature: to-string unsigned precision constants HTMLImageArray'); @@ -9,55 +9,61 @@ function testArgument(mode, done) { 'jellyfish-2.jpeg', 'jellyfish-3.jpeg', 'jellyfish-4.jpeg', - ]) - .then(([image1, image2, image3, image4]) => { - const images1 = [image1, image2]; - const images2 = [image3, image4]; - const gpu = new GPU({mode}); - const originalKernel = gpu.createKernel(function (selection) { + ]).then(([image1, image2, image3, image4]) => { + const images1 = [image1, image2]; + const images2 = [image3, image4]; + const gpu = new GPU({ mode }); + const originalKernel = gpu.createKernel( + function (selection) { const image0 = this.constants.a[0][0][0]; const image1 = this.constants.a[1][0][0]; switch (selection) { - case 0: return image0.r * 255; - case 1: return image1.r * 255; - case 2: return image0.b * 255; - case 3: return image1.b * 255; + case 0: + return image0.r * 255; + case 1: + return image1.r * 255; + case 2: + return image0.b * 255; + case 3: + return image1.b * 255; } - }, { + }, + { output: [1], precision: 'unsigned', argumentTypes: ['Integer'], constants: { a: images1, - } - }); - assert.deepEqual(originalKernel(0)[0], 172); - assert.deepEqual(originalKernel(1)[0], 255); - assert.deepEqual(originalKernel(2)[0], 253); - assert.deepEqual(originalKernel(3)[0], 255); - const kernelString = originalKernel.toString(0); - const canvas = originalKernel.canvas; - const context = originalKernel.context; - const Kernel = new Function('return ' + kernelString)(); - const newKernel1 = Kernel({context, canvas, constants: { a: images1 }}); - assert.deepEqual(newKernel1(0)[0], 172); - assert.deepEqual(newKernel1(1)[0], 255); - assert.deepEqual(newKernel1(2)[0], 253); - assert.deepEqual(newKernel1(3)[0], 255); + }, + } + ); + assert.deepEqual(originalKernel(0)[0], 172); + assert.deepEqual(originalKernel(1)[0], 255); + assert.deepEqual(originalKernel(2)[0], 253); + assert.deepEqual(originalKernel(3)[0], 255); + const kernelString = originalKernel.toString(0); + const canvas = originalKernel.canvas; + const context = originalKernel.context; + const Kernel = new Function('return ' + kernelString)(); + const newKernel1 = Kernel({ context, canvas, constants: { a: images1 } }); + assert.deepEqual(newKernel1(0)[0], 172); + assert.deepEqual(newKernel1(1)[0], 255); + assert.deepEqual(newKernel1(2)[0], 253); + assert.deepEqual(newKernel1(3)[0], 255); - const newKernel2 = Kernel({context, canvas, constants: { a: images2 }}); - assert.deepEqual(newKernel2(0)[0], 0); - assert.deepEqual(newKernel2(1)[0], 73); - assert.deepEqual(newKernel2(2)[0], 255); - assert.deepEqual(newKernel2(3)[0], 253); - gpu.destroy(); - done(originalKernel, newKernel1); - }); + const newKernel2 = Kernel({ context, canvas, constants: { a: images2 } }); + assert.deepEqual(newKernel2(0)[0], 0); + assert.deepEqual(newKernel2(1)[0], 73); + assert.deepEqual(newKernel2(2)[0], 255); + assert.deepEqual(newKernel2(3)[0], 253); + gpu.destroy(); + done(originalKernel, newKernel1); + }); } (GPU.isWebGLSupported ? test : skip)('webgl', t => { const done = t.async(); - testArgument('webgl', (kernel) => { + testArgument('webgl', kernel => { // They aren't supported, so test that kernel falls back assert.equal(kernel.kernel.constructor, CPUKernel); done(); diff --git a/test/features/to-string/precision/unsigned/constants/html-image.js b/test/features/to-string/precision/unsigned/constants/html-image.js index fd19e827..c133a99e 100644 --- a/test/features/to-string/precision/unsigned/constants/html-image.js +++ b/test/features/to-string/precision/unsigned/constants/html-image.js @@ -1,21 +1,28 @@ const { assert, skip, test, module: describe, only } = require('qunit'); -const { GPU, utils } = require('../../../../../../src'); -const { loadImage, imageToArray, check2DImage } = require('../../../../../browser-test-utils'); +const { GPU, utils } = require('../../../../../..'); +const { + loadImage, + imageToArray, + check2DImage, +} = require('../../../../../browser-test-utils'); describe('feature: to-string unsigned precision constants HTMLImage'); function testArgument(mode, done) { - loadImages(['jellyfish-1.jpeg', 'jellyfish-2.jpeg']) - .then(([image1, image2]) => { - const gpu = new GPU({mode}); - const originalKernel = gpu.createKernel(function () { - const pixel = this.constants.a[0][0]; - return pixel.b * 255; - }, { - output: [1], - precision: 'unsigned', - constants: { a: image1 } - }); + loadImages(['jellyfish-1.jpeg', 'jellyfish-2.jpeg']).then( + ([image1, image2]) => { + const gpu = new GPU({ mode }); + const originalKernel = gpu.createKernel( + function () { + const pixel = this.constants.a[0][0]; + return pixel.b * 255; + }, + { + output: [1], + precision: 'unsigned', + constants: { a: image1 }, + } + ); const canvas = originalKernel.canvas; const context = originalKernel.context; assert.deepEqual(originalKernel()[0], 253); @@ -24,13 +31,14 @@ function testArgument(mode, done) { context, canvas, constants: { - a: image2 - } + a: image2, + }, }); assert.deepEqual(newKernel()[0], 255); gpu.destroy(); done(); - }); + } + ); } (GPU.isWebGLSupported ? test : skip)('webgl', t => { @@ -40,5 +48,3 @@ function testArgument(mode, done) { (GPU.isWebGL2Supported ? test : skip)('webgl2', t => { testArgument('webgl2', t.async()); }); - - diff --git a/test/features/to-string/precision/unsigned/constants/input.js b/test/features/to-string/precision/unsigned/constants/input.js index 8b435a2a..1639a659 100644 --- a/test/features/to-string/precision/unsigned/constants/input.js +++ b/test/features/to-string/precision/unsigned/constants/input.js @@ -1,35 +1,38 @@ const { assert, skip, test, module: describe, only } = require('qunit'); -const { GPU, input } = require('../../../../../../src'); +const { GPU, input } = require('../../../../../..'); describe('feature: to-string unsigned precision constants Input'); function testConstant(mode, context, canvas) { const gpu = new GPU({ mode }); - const a = input([1,2,3,4],[2,2]); - const originalKernel = gpu.createKernel(function() { - let sum = 0; - for (let y = 0; y < 2; y++) { - for (let x = 0; x < 2; x++) { - sum += this.constants.a[y][x]; + const a = input([1, 2, 3, 4], [2, 2]); + const originalKernel = gpu.createKernel( + function () { + let sum = 0; + for (let y = 0; y < 2; y++) { + for (let x = 0; x < 2; x++) { + sum += this.constants.a[y][x]; + } } + return sum; + }, + { + canvas, + context, + output: [1], + precision: 'unsigned', + constants: { + a, + }, } - return sum; - }, { - canvas, - context, - output: [1], - precision: 'unsigned', - constants: { - a - } - }); + ); assert.deepEqual(originalKernel()[0], 10); const kernelString = originalKernel.toString(); const Kernel = new Function('return ' + kernelString)(); const newKernel = Kernel({ context, constants: { a } }); assert.deepEqual(newKernel()[0], 10); - const b = input([1,1,1,1],[2,2]); + const b = input([1, 1, 1, 1], [2, 2]); const newKernel2 = Kernel({ context, constants: { a: b } }); assert.deepEqual(newKernel2()[0], 4); gpu.destroy(); diff --git a/test/features/to-string/precision/unsigned/constants/integer.js b/test/features/to-string/precision/unsigned/constants/integer.js index 8244c9d8..c7dd0f8a 100644 --- a/test/features/to-string/precision/unsigned/constants/integer.js +++ b/test/features/to-string/precision/unsigned/constants/integer.js @@ -1,22 +1,25 @@ const { assert, skip, test, module: describe, only } = require('qunit'); -const { GPU } = require('../../../../../../src'); +const { GPU } = require('../../../../../..'); describe('feature: to-string unsigned precision constants Integer'); function testConstant(mode, context, canvas) { const gpu = new GPU({ mode }); - const originalKernel = gpu.createKernel(function() { - return Math.floor(this.constants.a) === 100 ? 42 : -42; - }, { - canvas, - context, - output: [1], - precision: 'unsigned', - constants: { - a: 100 + const originalKernel = gpu.createKernel( + function () { + return Math.floor(this.constants.a) === 100 ? 42 : -42; }, - constantTypes: { a: 'Integer' } - }); + { + canvas, + context, + output: [1], + precision: 'unsigned', + constants: { + a: 100, + }, + constantTypes: { a: 'Integer' }, + } + ); assert.equal(originalKernel.constantTypes.a, 'Integer'); assert.deepEqual(originalKernel()[0], 42); const kernelString = originalKernel.toString(); diff --git a/test/features/to-string/precision/unsigned/constants/memory-optimized-number-texture.js b/test/features/to-string/precision/unsigned/constants/memory-optimized-number-texture.js index bb65fcc9..479f9e43 100644 --- a/test/features/to-string/precision/unsigned/constants/memory-optimized-number-texture.js +++ b/test/features/to-string/precision/unsigned/constants/memory-optimized-number-texture.js @@ -1,44 +1,61 @@ const { assert, skip, test, module: describe, only } = require('qunit'); -const { GPU } = require('../../../../../../src'); +const { GPU } = require('../../../../../..'); -describe('feature: to-string unsigned precision constants MemoryOptimizedNumberTexture'); +describe( + 'feature: to-string unsigned precision constants MemoryOptimizedNumberTexture' +); function testConstant(mode, context, canvas) { const gpu = new GPU({ mode, context, canvas }); - const texture = gpu.createKernel(function() { - return this.thread.x; - }, { - output: [4], - optimizeFloatMemory: true, - precision: 'unsigned', - pipeline: true, - })(); - const texture2 = gpu.createKernel(function() { - return this.output.x - this.thread.x; - }, { - output: [4], - optimizeFloatMemory: true, - precision: 'unsigned', - pipeline: true, - })(); - const originalKernel = gpu.createKernel(function() { - return this.constants.a[this.thread.x]; - }, { - output: [4], - precision: 'unsigned', - constants: { - a: texture + const texture = gpu.createKernel( + function () { + return this.thread.x; + }, + { + output: [4], + optimizeFloatMemory: true, + precision: 'unsigned', + pipeline: true, } - }); - assert.deepEqual(originalKernel(), new Float32Array([0,1,2,3])); + )(); + const texture2 = gpu.createKernel( + function () { + return this.output.x - this.thread.x; + }, + { + output: [4], + optimizeFloatMemory: true, + precision: 'unsigned', + pipeline: true, + } + )(); + const originalKernel = gpu.createKernel( + function () { + return this.constants.a[this.thread.x]; + }, + { + output: [4], + precision: 'unsigned', + constants: { + a: texture, + }, + } + ); + assert.deepEqual(originalKernel(), new Float32Array([0, 1, 2, 3])); const kernelString = originalKernel.toString(); const Kernel = new Function('return ' + kernelString)(); const newKernel = Kernel({ context, constants: { a: texture } }); const newKernel2 = Kernel({ context, constants: { a: texture2 } }); - assert.deepEqual(texture2.toArray ? texture2.toArray() : texture2, new Float32Array([4,3,2,1])); - assert.deepEqual(texture.toArray ? texture.toArray() : texture, new Float32Array([0,1,2,3])); - assert.deepEqual(newKernel(), new Float32Array([0,1,2,3])); - assert.deepEqual(newKernel2(), new Float32Array([4,3,2,1])); + assert.deepEqual( + texture2.toArray ? texture2.toArray() : texture2, + new Float32Array([4, 3, 2, 1]) + ); + assert.deepEqual( + texture.toArray ? texture.toArray() : texture, + new Float32Array([0, 1, 2, 3]) + ); + assert.deepEqual(newKernel(), new Float32Array([0, 1, 2, 3])); + assert.deepEqual(newKernel2(), new Float32Array([4, 3, 2, 1])); gpu.destroy(); } diff --git a/test/features/to-string/precision/unsigned/constants/number-texture.js b/test/features/to-string/precision/unsigned/constants/number-texture.js index b41fd742..6a4a081b 100644 --- a/test/features/to-string/precision/unsigned/constants/number-texture.js +++ b/test/features/to-string/precision/unsigned/constants/number-texture.js @@ -1,46 +1,61 @@ const { assert, skip, test, module: describe, only } = require('qunit'); -const { GPU } = require('../../../../../../src'); +const { GPU } = require('../../../../../..'); describe('feature: to-string unsigned precision constants NumberTexture'); function testConstant(mode, context, canvas) { const gpu = new GPU({ mode, context, canvas }); - const texture = gpu.createKernel(function() { - return this.thread.x; - }, { - output: [4], - optimizeFloatMemory: false, - precision: 'unsigned', - pipeline: true, - })(); - const texture2 = gpu.createKernel(function() { - return this.output.x - this.thread.x; - }, { - output: [4], - optimizeFloatMemory: false, - precision: 'unsigned', - pipeline: true, - })(); - const originalKernel = gpu.createKernel(function() { - return this.constants.a[this.thread.x]; - }, { - canvas, - context, - output: [4], - precision: 'unsigned', - constants: { - a: texture + const texture = gpu.createKernel( + function () { + return this.thread.x; + }, + { + output: [4], + optimizeFloatMemory: false, + precision: 'unsigned', + pipeline: true, } - }); - assert.deepEqual(originalKernel(), new Float32Array([0,1,2,3])); + )(); + const texture2 = gpu.createKernel( + function () { + return this.output.x - this.thread.x; + }, + { + output: [4], + optimizeFloatMemory: false, + precision: 'unsigned', + pipeline: true, + } + )(); + const originalKernel = gpu.createKernel( + function () { + return this.constants.a[this.thread.x]; + }, + { + canvas, + context, + output: [4], + precision: 'unsigned', + constants: { + a: texture, + }, + } + ); + assert.deepEqual(originalKernel(), new Float32Array([0, 1, 2, 3])); const kernelString = originalKernel.toString(); const Kernel = new Function('return ' + kernelString)(); const newKernel = Kernel({ context, constants: { a: texture } }); const newKernel2 = Kernel({ context, constants: { a: texture2 } }); - assert.deepEqual(texture2.toArray ? texture2.toArray() : texture2, new Float32Array([4,3,2,1])); - assert.deepEqual(texture.toArray ? texture.toArray() : texture, new Float32Array([0,1,2,3])); - assert.deepEqual(newKernel(), new Float32Array([0,1,2,3])); - assert.deepEqual(newKernel2(), new Float32Array([4,3,2,1])); + assert.deepEqual( + texture2.toArray ? texture2.toArray() : texture2, + new Float32Array([4, 3, 2, 1]) + ); + assert.deepEqual( + texture.toArray ? texture.toArray() : texture, + new Float32Array([0, 1, 2, 3]) + ); + assert.deepEqual(newKernel(), new Float32Array([0, 1, 2, 3])); + assert.deepEqual(newKernel2(), new Float32Array([4, 3, 2, 1])); gpu.destroy(); } diff --git a/test/features/to-string/precision/unsigned/graphical.js b/test/features/to-string/precision/unsigned/graphical.js index b6198589..e4678782 100644 --- a/test/features/to-string/precision/unsigned/graphical.js +++ b/test/features/to-string/precision/unsigned/graphical.js @@ -1,30 +1,34 @@ const { assert, skip, test, module: describe, only } = require('qunit'); -const { GPU } = require('../../../../../src'); +const { GPU } = require('../../../../..'); describe('feature: to-string unsigned precision graphical'); function testGraphical(mode, context, canvas) { const gpu = new GPU({ mode }); - const originalKernel = gpu.createKernel(function() { - this.color(1,1,1,1); - }, { - canvas, - context, - output: [2,2], - precision: 'unsigned', - graphical: true, - }); + const originalKernel = gpu.createKernel( + function () { + this.color(1, 1, 1, 1); + }, + { + canvas, + context, + output: [2, 2], + precision: 'unsigned', + graphical: true, + } + ); const expected = new Uint8ClampedArray([ - 255, 255, 255, 255, - 255, 255, 255, 255, - 255, 255, 255, 255, - 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, + 255, ]); originalKernel(); assert.deepEqual(originalKernel.getPixels(), expected); const kernelString = originalKernel.toString(); - const newKernel = new Function('return ' + kernelString)()({ canvas, context }); + const newKernel = new Function('return ' + kernelString)()({ + canvas, + context, + }); newKernel(); assert.deepEqual(newKernel.getPixels(), expected); gpu.destroy(); diff --git a/test/features/to-string/precision/unsigned/kernel-map/array/array.js b/test/features/to-string/precision/unsigned/kernel-map/array/array.js index 093004f3..10530dc7 100644 --- a/test/features/to-string/precision/unsigned/kernel-map/array/array.js +++ b/test/features/to-string/precision/unsigned/kernel-map/array/array.js @@ -1,23 +1,29 @@ const { assert, skip, test, module: describe, only } = require('qunit'); -const { GPU } = require('../../../../../../../src'); +const { GPU } = require('../../../../../../..'); -describe('feature: to-string unsigned precision array style kernel map returns Array'); +describe( + 'feature: to-string unsigned precision array style kernel map returns Array' +); function testReturn(mode, context, canvas) { const gpu = new GPU({ mode }); function addOne(value) { return value + 1; } - const originalKernel = gpu.createKernelMap([addOne], function(a) { - const result = a[this.thread.x] + 1; - addOne(result); - return result; - }, { - canvas, - context, - output: [6], - precision: 'unsigned', - }); + const originalKernel = gpu.createKernelMap( + [addOne], + function (a) { + const result = a[this.thread.x] + 1; + addOne(result); + return result; + }, + { + canvas, + context, + output: [6], + precision: 'unsigned', + } + ); const a = [1, 2, 3, 4, 5, 6]; const expected = new Float32Array([2, 3, 4, 5, 6, 7]); diff --git a/test/features/to-string/precision/unsigned/kernel-map/array/array2d.js b/test/features/to-string/precision/unsigned/kernel-map/array/array2d.js index e4d8c555..8e19e08f 100644 --- a/test/features/to-string/precision/unsigned/kernel-map/array/array2d.js +++ b/test/features/to-string/precision/unsigned/kernel-map/array/array2d.js @@ -1,33 +1,33 @@ const { assert, skip, test, module: describe, only } = require('qunit'); -const { GPU } = require('../../../../../../../src'); +const { GPU } = require('../../../../../../..'); -describe('feature: to-string unsigned precision array style kernel map returns Array2D'); +describe( + 'feature: to-string unsigned precision array style kernel map returns Array2D' +); function testReturn(mode, context, canvas) { const gpu = new GPU({ mode }); function addOne(value) { return value + 1; } - const originalKernel = gpu.createKernelMap([addOne], function(a) { - const result = a[this.thread.x] + 1; - addOne(result); - return result; - }, { - canvas, - context, - output: [2, 2], - precision: 'unsigned', - }); + const originalKernel = gpu.createKernelMap( + [addOne], + function (a) { + const result = a[this.thread.x] + 1; + addOne(result); + return result; + }, + { + canvas, + context, + output: [2, 2], + precision: 'unsigned', + } + ); const a = [1, 2, 3, 4, 5, 6]; - const expected = [ - new Float32Array([2, 3]), - new Float32Array([2, 3]), - ]; - const expectedZero = [ - new Float32Array([3, 4]), - new Float32Array([3, 4]), - ]; + const expected = [new Float32Array([2, 3]), new Float32Array([2, 3])]; + const expectedZero = [new Float32Array([3, 4]), new Float32Array([3, 4])]; const originalResult = originalKernel(a); assert.deepEqual(originalResult.result, expected); assert.deepEqual(originalResult[0], expectedZero); diff --git a/test/features/to-string/precision/unsigned/kernel-map/array/array3d.js b/test/features/to-string/precision/unsigned/kernel-map/array/array3d.js index 631d0c7f..292e0187 100644 --- a/test/features/to-string/precision/unsigned/kernel-map/array/array3d.js +++ b/test/features/to-string/precision/unsigned/kernel-map/array/array3d.js @@ -1,44 +1,38 @@ const { assert, skip, test, module: describe, only } = require('qunit'); -const { GPU } = require('../../../../../../../src'); +const { GPU } = require('../../../../../../..'); -describe('feature: to-string unsigned precision array style kernel map returns Array3d'); +describe( + 'feature: to-string unsigned precision array style kernel map returns Array3d' +); function testReturn(mode, context, canvas) { const gpu = new GPU({ mode }); function addOne(value) { return value + 1; } - const originalKernel = gpu.createKernelMap([addOne], function(a) { - const result = a[this.thread.x] + 1; - addOne(result); - return result; - }, { - canvas, - context, - output: [2, 2, 2], - precision: 'unsigned', - }); + const originalKernel = gpu.createKernelMap( + [addOne], + function (a) { + const result = a[this.thread.x] + 1; + addOne(result); + return result; + }, + { + canvas, + context, + output: [2, 2, 2], + precision: 'unsigned', + } + ); const a = [1, 2]; const expected = [ - [ - new Float32Array([2, 3]), - new Float32Array([2, 3]), - ], - [ - new Float32Array([2, 3]), - new Float32Array([2, 3]), - ] + [new Float32Array([2, 3]), new Float32Array([2, 3])], + [new Float32Array([2, 3]), new Float32Array([2, 3])], ]; const expectedZero = [ - [ - new Float32Array([3, 4]), - new Float32Array([3, 4]), - ], - [ - new Float32Array([3, 4]), - new Float32Array([3, 4]), - ] + [new Float32Array([3, 4]), new Float32Array([3, 4])], + [new Float32Array([3, 4]), new Float32Array([3, 4])], ]; const originalResult = originalKernel(a); assert.deepEqual(originalResult.result, expected); diff --git a/test/features/to-string/precision/unsigned/kernel-map/array/memory-optimized-number-texture.js b/test/features/to-string/precision/unsigned/kernel-map/array/memory-optimized-number-texture.js index 783dbf72..7b78a141 100644 --- a/test/features/to-string/precision/unsigned/kernel-map/array/memory-optimized-number-texture.js +++ b/test/features/to-string/precision/unsigned/kernel-map/array/memory-optimized-number-texture.js @@ -1,25 +1,31 @@ const { assert, skip, test, module: describe, only } = require('qunit'); -const { GPU } = require('../../../../../../../src'); +const { GPU } = require('../../../../../../..'); -describe('feature: to-string unsigned precision array style kernel map returns MemoryOptimizedNumberTexture'); +describe( + 'feature: to-string unsigned precision array style kernel map returns MemoryOptimizedNumberTexture' +); function testReturn(mode, context, canvas) { const gpu = new GPU({ mode }); function addOne(value) { return value + 1; } - const originalKernel = gpu.createKernelMap([addOne], function(a) { - const result = a[this.thread.x] + 1; - addOne(result); - return result; - }, { - canvas, - context, - output: [6], - precision: 'unsigned', - pipeline: true, - optimizeFloatMemory: true, - }); + const originalKernel = gpu.createKernelMap( + [addOne], + function (a) { + const result = a[this.thread.x] + 1; + addOne(result); + return result; + }, + { + canvas, + context, + output: [6], + precision: 'unsigned', + pipeline: true, + optimizeFloatMemory: true, + } + ); const a = [1, 2, 3, 4, 5, 6]; const expected = new Float32Array([2, 3, 4, 5, 6, 7]); diff --git a/test/features/to-string/precision/unsigned/kernel-map/array/number-texture.js b/test/features/to-string/precision/unsigned/kernel-map/array/number-texture.js index 3ace604a..35f616b8 100644 --- a/test/features/to-string/precision/unsigned/kernel-map/array/number-texture.js +++ b/test/features/to-string/precision/unsigned/kernel-map/array/number-texture.js @@ -1,24 +1,30 @@ const { assert, skip, test, module: describe, only } = require('qunit'); -const { GPU } = require('../../../../../../../src'); +const { GPU } = require('../../../../../../..'); -describe('feature: to-string unsigned precision array style kernel map returns NumberTexture'); +describe( + 'feature: to-string unsigned precision array style kernel map returns NumberTexture' +); function testReturn(mode, context, canvas) { const gpu = new GPU({ mode }); function addOne(value) { return value + 1; } - const originalKernel = gpu.createKernelMap([addOne], function(a) { - const result = a[this.thread.x] + 1; - addOne(result); - return result; - }, { - canvas, - context, - output: [6], - precision: 'unsigned', - pipeline: true, - }); + const originalKernel = gpu.createKernelMap( + [addOne], + function (a) { + const result = a[this.thread.x] + 1; + addOne(result); + return result; + }, + { + canvas, + context, + output: [6], + precision: 'unsigned', + pipeline: true, + } + ); const a = [1, 2, 3, 4, 5, 6]; const expected = new Float32Array([2, 3, 4, 5, 6, 7]); diff --git a/test/features/to-string/precision/unsigned/kernel-map/object/array.js b/test/features/to-string/precision/unsigned/kernel-map/object/array.js index 87c40562..cd99bcd9 100644 --- a/test/features/to-string/precision/unsigned/kernel-map/object/array.js +++ b/test/features/to-string/precision/unsigned/kernel-map/object/array.js @@ -1,5 +1,5 @@ const { assert, skip, test, module: describe, only } = require('qunit'); -const { GPU } = require('../../../../../../../src'); +const { GPU } = require('../../../../../../..'); describe('feature: to-string unsigned precision object style returns Array'); @@ -8,16 +8,20 @@ function testReturn(mode, context, canvas) { function addOne(value) { return value + 1; } - const originalKernel = gpu.createKernelMap({ addOneResult: addOne }, function(a) { - const result = a[this.thread.x] + 1; - addOne(result); - return result; - }, { - canvas, - context, - output: [6], - precision: 'unsigned', - }); + const originalKernel = gpu.createKernelMap( + { addOneResult: addOne }, + function (a) { + const result = a[this.thread.x] + 1; + addOne(result); + return result; + }, + { + canvas, + context, + output: [6], + precision: 'unsigned', + } + ); const a = [1, 2, 3, 4, 5, 6]; const expected = new Float32Array([2, 3, 4, 5, 6, 7]); diff --git a/test/features/to-string/precision/unsigned/kernel-map/object/array2d.js b/test/features/to-string/precision/unsigned/kernel-map/object/array2d.js index 05b4231e..66d94bef 100644 --- a/test/features/to-string/precision/unsigned/kernel-map/object/array2d.js +++ b/test/features/to-string/precision/unsigned/kernel-map/object/array2d.js @@ -1,5 +1,5 @@ const { assert, skip, test, module: describe, only } = require('qunit'); -const { GPU } = require('../../../../../../../src'); +const { GPU } = require('../../../../../../..'); describe('feature: to-string unsigned precision object style returns Array2D'); @@ -8,26 +8,24 @@ function testReturn(mode, context, canvas) { function addOne(value) { return value + 1; } - const originalKernel = gpu.createKernelMap({ addOneResult: addOne }, function(a) { - const result = a[this.thread.x] + 1; - addOne(result); - return result; - }, { - canvas, - context, - output: [2, 2], - precision: 'unsigned', - }); + const originalKernel = gpu.createKernelMap( + { addOneResult: addOne }, + function (a) { + const result = a[this.thread.x] + 1; + addOne(result); + return result; + }, + { + canvas, + context, + output: [2, 2], + precision: 'unsigned', + } + ); const a = [1, 2, 3, 4, 5, 6]; - const expected = [ - new Float32Array([2, 3]), - new Float32Array([2, 3]), - ]; - const expectedZero = [ - new Float32Array([3, 4]), - new Float32Array([3, 4]), - ]; + const expected = [new Float32Array([2, 3]), new Float32Array([2, 3])]; + const expectedZero = [new Float32Array([3, 4]), new Float32Array([3, 4])]; const originalResult = originalKernel(a); assert.deepEqual(originalResult.result, expected); assert.deepEqual(originalResult.addOneResult, expectedZero); diff --git a/test/features/to-string/precision/unsigned/kernel-map/object/array3d.js b/test/features/to-string/precision/unsigned/kernel-map/object/array3d.js index 16f1fede..a5a84e38 100644 --- a/test/features/to-string/precision/unsigned/kernel-map/object/array3d.js +++ b/test/features/to-string/precision/unsigned/kernel-map/object/array3d.js @@ -1,5 +1,5 @@ const { assert, skip, test, module: describe, only } = require('qunit'); -const { GPU } = require('../../../../../../../src'); +const { GPU } = require('../../../../../../..'); describe('feature: to-string unsigned precision object style returns Array3d'); @@ -8,37 +8,29 @@ function testReturn(mode, context, canvas) { function addOne(value) { return value + 1; } - const originalKernel = gpu.createKernelMap({ addOneResult: addOne }, function(a) { - const result = a[this.thread.x] + 1; - addOne(result); - return result; - }, { - canvas, - context, - output: [2, 2, 2], - precision: 'unsigned', - }); + const originalKernel = gpu.createKernelMap( + { addOneResult: addOne }, + function (a) { + const result = a[this.thread.x] + 1; + addOne(result); + return result; + }, + { + canvas, + context, + output: [2, 2, 2], + precision: 'unsigned', + } + ); const a = [1, 2]; const expected = [ - [ - new Float32Array([2, 3]), - new Float32Array([2, 3]), - ], - [ - new Float32Array([2, 3]), - new Float32Array([2, 3]), - ] + [new Float32Array([2, 3]), new Float32Array([2, 3])], + [new Float32Array([2, 3]), new Float32Array([2, 3])], ]; const expectedZero = [ - [ - new Float32Array([3, 4]), - new Float32Array([3, 4]), - ], - [ - new Float32Array([3, 4]), - new Float32Array([3, 4]), - ] + [new Float32Array([3, 4]), new Float32Array([3, 4])], + [new Float32Array([3, 4]), new Float32Array([3, 4])], ]; const originalResult = originalKernel(a); assert.deepEqual(originalResult.result, expected); diff --git a/test/features/to-string/precision/unsigned/kernel-map/object/memory-optimized-number-texture.js b/test/features/to-string/precision/unsigned/kernel-map/object/memory-optimized-number-texture.js index 6df0bf2e..a757cceb 100644 --- a/test/features/to-string/precision/unsigned/kernel-map/object/memory-optimized-number-texture.js +++ b/test/features/to-string/precision/unsigned/kernel-map/object/memory-optimized-number-texture.js @@ -1,25 +1,31 @@ const { assert, skip, test, module: describe, only } = require('qunit'); -const { GPU } = require('../../../../../../../src'); +const { GPU } = require('../../../../../../..'); -describe('feature: to-string unsigned precision object style kernel map returns MemoryOptimizedNumberTexture'); +describe( + 'feature: to-string unsigned precision object style kernel map returns MemoryOptimizedNumberTexture' +); function testReturn(mode, context, canvas) { const gpu = new GPU({ mode }); function addOne(value) { return value + 1; } - const originalKernel = gpu.createKernelMap({ addOneResult: addOne }, function(a) { - const result = a[this.thread.x] + 1; - addOne(result); - return result; - }, { - canvas, - context, - output: [6], - precision: 'unsigned', - pipeline: true, - optimizeFloatMemory: true, - }); + const originalKernel = gpu.createKernelMap( + { addOneResult: addOne }, + function (a) { + const result = a[this.thread.x] + 1; + addOne(result); + return result; + }, + { + canvas, + context, + output: [6], + precision: 'unsigned', + pipeline: true, + optimizeFloatMemory: true, + } + ); const a = [1, 2, 3, 4, 5, 6]; const expected = new Float32Array([2, 3, 4, 5, 6, 7]); diff --git a/test/features/to-string/precision/unsigned/kernel-map/object/number-texture.js b/test/features/to-string/precision/unsigned/kernel-map/object/number-texture.js index 22607128..f4462e5f 100644 --- a/test/features/to-string/precision/unsigned/kernel-map/object/number-texture.js +++ b/test/features/to-string/precision/unsigned/kernel-map/object/number-texture.js @@ -1,24 +1,30 @@ const { assert, skip, test, module: describe, only } = require('qunit'); -const { GPU } = require('../../../../../../../src'); +const { GPU } = require('../../../../../../..'); -describe('feature: to-string unsigned precision object style kernel map returns NumberTexture'); +describe( + 'feature: to-string unsigned precision object style kernel map returns NumberTexture' +); function testReturn(mode, context, canvas) { const gpu = new GPU({ mode }); function addOne(value) { return value + 1; } - const originalKernel = gpu.createKernelMap({ addOneResult: addOne }, function(a) { - const result = a[this.thread.x] + 1; - addOne(result); - return result; - }, { - canvas, - context, - output: [6], - precision: 'unsigned', - pipeline: true, - }); + const originalKernel = gpu.createKernelMap( + { addOneResult: addOne }, + function (a) { + const result = a[this.thread.x] + 1; + addOne(result); + return result; + }, + { + canvas, + context, + output: [6], + precision: 'unsigned', + pipeline: true, + } + ); const a = [1, 2, 3, 4, 5, 6]; const expected = new Float32Array([2, 3, 4, 5, 6, 7]); diff --git a/test/features/to-string/precision/unsigned/returns/array.js b/test/features/to-string/precision/unsigned/returns/array.js index 612aad73..923ae90e 100644 --- a/test/features/to-string/precision/unsigned/returns/array.js +++ b/test/features/to-string/precision/unsigned/returns/array.js @@ -1,18 +1,21 @@ const { assert, skip, test, module: describe, only } = require('qunit'); -const { GPU } = require('../../../../../../src'); +const { GPU } = require('../../../../../..'); describe('feature: to-string unsigned precision returns Array'); function testReturn(mode, context, canvas) { const gpu = new GPU({ mode }); - const originalKernel = gpu.createKernel(function(a) { - return a[this.thread.x] + 1; - }, { - canvas, - context, - output: [6], - precision: 'unsigned', - }); + const originalKernel = gpu.createKernel( + function (a) { + return a[this.thread.x] + 1; + }, + { + canvas, + context, + output: [6], + precision: 'unsigned', + } + ); const a = [1, 2, 3, 4, 5, 6]; const expected = new Float32Array([2, 3, 4, 5, 6, 7]); diff --git a/test/features/to-string/precision/unsigned/returns/array2d.js b/test/features/to-string/precision/unsigned/returns/array2d.js index eacfc731..a9355687 100644 --- a/test/features/to-string/precision/unsigned/returns/array2d.js +++ b/test/features/to-string/precision/unsigned/returns/array2d.js @@ -1,29 +1,32 @@ const { assert, skip, test, module: describe, only } = require('qunit'); -const { GPU } = require('../../../../../../src'); +const { GPU } = require('../../../../../..'); describe('feature: to-string unsigned precision returns Array2D'); function testReturn(mode, context, canvas) { const gpu = new GPU({ mode }); - const originalKernel = gpu.createKernel(function(a, b) { - return a[this.thread.x] + b[this.thread.y]; - }, { - canvas, - context, - output: [2, 2], - precision: 'unsigned', - }); + const originalKernel = gpu.createKernel( + function (a, b) { + return a[this.thread.x] + b[this.thread.y]; + }, + { + canvas, + context, + output: [2, 2], + precision: 'unsigned', + } + ); const a = [1, 2]; const b = [2, 3]; - const expected = [ - new Float32Array([3, 4]), - new Float32Array([4, 5]), - ]; + const expected = [new Float32Array([3, 4]), new Float32Array([4, 5])]; const originalResult = originalKernel(a, b); assert.deepEqual(originalResult, expected); const kernelString = originalKernel.toString(a, b); - const newResult = new Function('return ' + kernelString)()({ context })(a, b); + const newResult = new Function('return ' + kernelString)()({ context })( + a, + b + ); assert.deepEqual(newResult, expected); gpu.destroy(); } diff --git a/test/features/to-string/precision/unsigned/returns/array3d.js b/test/features/to-string/precision/unsigned/returns/array3d.js index edebde18..cabf23f8 100644 --- a/test/features/to-string/precision/unsigned/returns/array3d.js +++ b/test/features/to-string/precision/unsigned/returns/array3d.js @@ -1,35 +1,37 @@ const { assert, skip, test, module: describe, only } = require('qunit'); -const { GPU } = require('../../../../../../src'); +const { GPU } = require('../../../../../..'); describe('feature: to-string unsigned precision returns Array3d'); function testReturn(mode, context, canvas) { const gpu = new GPU({ mode }); - const originalKernel = gpu.createKernel(function(a, b, c) { - return a[this.thread.x] + b[this.thread.y] + c[this.thread.z]; - }, { - canvas, - context, - output: [2, 2, 2], - precision: 'unsigned', - }); + const originalKernel = gpu.createKernel( + function (a, b, c) { + return a[this.thread.x] + b[this.thread.y] + c[this.thread.z]; + }, + { + canvas, + context, + output: [2, 2, 2], + precision: 'unsigned', + } + ); const a = [1, 2]; const b = [3, 4]; const c = [5, 6]; const expected = [ - [ - new Float32Array([9,10]), - new Float32Array([10,11]), - ],[ - new Float32Array([10,11]), - new Float32Array([11,12]), - ] + [new Float32Array([9, 10]), new Float32Array([10, 11])], + [new Float32Array([10, 11]), new Float32Array([11, 12])], ]; const originalResult = originalKernel(a, b, c); assert.deepEqual(originalResult, expected); const kernelString = originalKernel.toString(a, b, c); - const newResult = new Function('return ' + kernelString)()({ context })(a, b, c); + const newResult = new Function('return ' + kernelString)()({ context })( + a, + b, + c + ); assert.deepEqual(newResult, expected); gpu.destroy(); } diff --git a/test/features/to-string/precision/unsigned/returns/texture.js b/test/features/to-string/precision/unsigned/returns/texture.js index 6edc33f2..1ca3eb59 100644 --- a/test/features/to-string/precision/unsigned/returns/texture.js +++ b/test/features/to-string/precision/unsigned/returns/texture.js @@ -1,19 +1,22 @@ const { assert, skip, test, module: describe, only } = require('qunit'); -const { GPU } = require('../../../../../../src'); +const { GPU } = require('../../../../../..'); describe('feature: to-string unsigned precision returns Texture'); function testReturn(mode, context, canvas) { const gpu = new GPU({ mode }); - const originalKernel = gpu.createKernel(function(a) { - return a[this.thread.x] + 1; - }, { - canvas, - context, - output: [6], - precision: 'unsigned', - pipeline: true, - }); + const originalKernel = gpu.createKernel( + function (a) { + return a[this.thread.x] + 1; + }, + { + canvas, + context, + output: [6], + precision: 'unsigned', + pipeline: true, + } + ); const a = [1, 2, 3, 4, 5, 6]; const expected = new Float32Array([2, 3, 4, 5, 6, 7]); @@ -25,18 +28,27 @@ function testReturn(mode, context, canvas) { gpu.destroy(); } -(GPU.isSinglePrecisionSupported && GPU.isWebGLSupported ? test : skip)('webgl', () => { - const canvas = document.createElement('canvas'); - const context = canvas.getContext('webgl'); - testReturn('webgl', context, canvas); -}); +(GPU.isSinglePrecisionSupported && GPU.isWebGLSupported ? test : skip)( + 'webgl', + () => { + const canvas = document.createElement('canvas'); + const context = canvas.getContext('webgl'); + testReturn('webgl', context, canvas); + } +); -(GPU.isSinglePrecisionSupported && GPU.isWebGL2Supported ? test : skip)('webgl2', () => { - const canvas = document.createElement('canvas'); - const context = canvas.getContext('webgl2'); - testReturn('webgl2', context, canvas); -}); +(GPU.isSinglePrecisionSupported && GPU.isWebGL2Supported ? test : skip)( + 'webgl2', + () => { + const canvas = document.createElement('canvas'); + const context = canvas.getContext('webgl2'); + testReturn('webgl2', context, canvas); + } +); -(GPU.isSinglePrecisionSupported && GPU.isHeadlessGLSupported ? test : skip)('headlessgl', () => { - testReturn('headlessgl', require('gl')(1, 1), null); -}); +(GPU.isSinglePrecisionSupported && GPU.isHeadlessGLSupported ? test : skip)( + 'headlessgl', + () => { + testReturn('headlessgl', require('gl')(1, 1), null); + } +); diff --git a/test/features/type-management.js b/test/features/type-management.js index 559c8cbe..e34c2a7f 100644 --- a/test/features/type-management.js +++ b/test/features/type-management.js @@ -1,558 +1,861 @@ const { assert, test, module: describe, only, skip } = require('qunit'); -const { GPU, WebGLFunctionNode, WebGL2FunctionNode, CPUFunctionNode } = require('../../src'); +const { + GPU, + WebGLFunctionNode, + WebGL2FunctionNode, + CPUFunctionNode, +} = require('../..'); describe('features: type management'); test('arrays directly - Array(2) webgl', () => { - const node = new WebGLFunctionNode((function direct() { - return [0, 0]; - }).toString(), { returnType: 'Array(2)', output: [1] }); - assert.equal(node.toString(), 'vec2 direct() {\n\ + const node = new WebGLFunctionNode( + function direct() { + return [0, 0]; + }.toString(), + { returnType: 'Array(2)', output: [1] } + ); + assert.equal( + node.toString(), + 'vec2 direct() {\n\ return vec2(0.0, 0.0);\n\ -}'); +}' + ); }); test('arrays directly - Array(2) webgl2', () => { - const node = new WebGL2FunctionNode((function direct() { - return [0, 0]; - }).toString(), { returnType: 'Array(2)', output: [1] }); - assert.equal(node.toString(), 'vec2 direct() {\n\ + const node = new WebGL2FunctionNode( + function direct() { + return [0, 0]; + }.toString(), + { returnType: 'Array(2)', output: [1] } + ); + assert.equal( + node.toString(), + 'vec2 direct() {\n\ return vec2(0.0, 0.0);\n\ -}'); +}' + ); }); test('arrays directly - Array(2) cpu', () => { - const node = new CPUFunctionNode((function direct() { - return [0, 0]; - }).toString(), { returnType: 'Array(2)', output: [1] }); - assert.equal(node.toString(), 'function direct() {\n\ + const node = new CPUFunctionNode( + function direct() { + return [0, 0]; + }.toString(), + { returnType: 'Array(2)', output: [1] } + ); + assert.equal( + node.toString(), + 'function direct() {\n\ return new Float32Array([0, 0]);\n\ -}'); +}' + ); }); test('arrays directly - Array(3) webgl', () => { - const node = new WebGLFunctionNode((function direct() { - return [0, 0, 0]; - }).toString(), { returnType: 'Array(3)', output: [1] }); - assert.equal(node.toString(), 'vec3 direct() {\n\ + const node = new WebGLFunctionNode( + function direct() { + return [0, 0, 0]; + }.toString(), + { returnType: 'Array(3)', output: [1] } + ); + assert.equal( + node.toString(), + 'vec3 direct() {\n\ return vec3(0.0, 0.0, 0.0);\n\ -}'); +}' + ); }); test('arrays directly - Array(3) webgl2', () => { - const node = new WebGL2FunctionNode((function direct() { - return [0, 0, 0]; - }).toString(), { returnType: 'Array(3)', output: [1] }); - assert.equal(node.toString(), 'vec3 direct() {\n\ + const node = new WebGL2FunctionNode( + function direct() { + return [0, 0, 0]; + }.toString(), + { returnType: 'Array(3)', output: [1] } + ); + assert.equal( + node.toString(), + 'vec3 direct() {\n\ return vec3(0.0, 0.0, 0.0);\n\ -}'); +}' + ); }); test('arrays directly - Array(3) cpu', () => { - const node = new CPUFunctionNode((function direct() { - return [0, 0, 0]; - }).toString(), { returnType: 'Array(3)', output: [1] }); - assert.equal(node.toString(), 'function direct() {\n\ + const node = new CPUFunctionNode( + function direct() { + return [0, 0, 0]; + }.toString(), + { returnType: 'Array(3)', output: [1] } + ); + assert.equal( + node.toString(), + 'function direct() {\n\ return new Float32Array([0, 0, 0]);\n\ -}'); +}' + ); }); - test('arrays directly - Array(4) webgl', () => { - const node = new WebGLFunctionNode((function direct() { - return [0, 0, 0, 0]; - }).toString(), { returnType: 'Array(4)', output: [1] }); - assert.equal(node.toString(), 'vec4 direct() {\n\ + const node = new WebGLFunctionNode( + function direct() { + return [0, 0, 0, 0]; + }.toString(), + { returnType: 'Array(4)', output: [1] } + ); + assert.equal( + node.toString(), + 'vec4 direct() {\n\ return vec4(0.0, 0.0, 0.0, 0.0);\n\ -}'); +}' + ); }); test('arrays directly - Array(4) webgl2', () => { - const node = new WebGL2FunctionNode((function direct() { - return [0, 0, 0, 0]; - }).toString(), { returnType: 'Array(4)', output: [1] }); - assert.equal(node.toString(), 'vec4 direct() {\n\ + const node = new WebGL2FunctionNode( + function direct() { + return [0, 0, 0, 0]; + }.toString(), + { returnType: 'Array(4)', output: [1] } + ); + assert.equal( + node.toString(), + 'vec4 direct() {\n\ return vec4(0.0, 0.0, 0.0, 0.0);\n\ -}'); -}); -test("arrays directly - Array(4) cpu", function(assert) { - const node = new CPUFunctionNode((function direct() { - return [0, 0, 0, 0]; - }).toString(), { returnType: 'Array(4)', output: [1] }); - assert.equal(node.toString(), 'function direct() {\n\ +}' + ); +}); +test('arrays directly - Array(4) cpu', function (assert) { + const node = new CPUFunctionNode( + function direct() { + return [0, 0, 0, 0]; + }.toString(), + { returnType: 'Array(4)', output: [1] } + ); + assert.equal( + node.toString(), + 'function direct() {\n\ return new Float32Array([0, 0, 0, 0]);\n\ -}'); +}' + ); }); - test('arrays referenced directly - Array(2) webgl', () => { - const node = new WebGLFunctionNode((function refDirect() { - const array = [0, 0]; - return array; - }).toString(), { returnType: 'Array(2)', output: [1] }); - assert.equal(node.toString(), 'vec2 refDirect() {\n\ + const node = new WebGLFunctionNode( + function refDirect() { + const array = [0, 0]; + return array; + }.toString(), + { returnType: 'Array(2)', output: [1] } + ); + assert.equal( + node.toString(), + 'vec2 refDirect() {\n\ vec2 user_array=vec2(0.0, 0.0);\n\ return user_array;\n\ -}'); +}' + ); }); test('arrays referenced directly - Array(2) webgl2', () => { - const node = new WebGL2FunctionNode((function refDirect() { - const array = [0, 0]; - return array; - }).toString(), { returnType: 'Array(2)', output: [1] }); - assert.equal(node.toString(), 'vec2 refDirect() {\n\ + const node = new WebGL2FunctionNode( + function refDirect() { + const array = [0, 0]; + return array; + }.toString(), + { returnType: 'Array(2)', output: [1] } + ); + assert.equal( + node.toString(), + 'vec2 refDirect() {\n\ vec2 user_array=vec2(0.0, 0.0);\n\ return user_array;\n\ -}'); +}' + ); }); test('arrays referenced directly - Array(2) cpu', () => { - const node = new CPUFunctionNode((function refDirect() { - const array = [0, 0]; - return array; - }).toString(), { returnType: 'Array(2)', output: [1] }); - assert.equal(node.toString(), 'function refDirect() {\n\ + const node = new CPUFunctionNode( + function refDirect() { + const array = [0, 0]; + return array; + }.toString(), + { returnType: 'Array(2)', output: [1] } + ); + assert.equal( + node.toString(), + 'function refDirect() {\n\ const user_array=new Float32Array([0, 0]);\n\ return user_array;\n\ -}'); +}' + ); }); - test('arrays referenced directly - Array(3) webgl', () => { - const node = new WebGLFunctionNode((function refDirect() { - const array = [0, 0, 0]; - return array; - }).toString(), { returnType: 'Array(3)', output: [1] }); - assert.equal(node.toString(), 'vec3 refDirect() {\n\ + const node = new WebGLFunctionNode( + function refDirect() { + const array = [0, 0, 0]; + return array; + }.toString(), + { returnType: 'Array(3)', output: [1] } + ); + assert.equal( + node.toString(), + 'vec3 refDirect() {\n\ vec3 user_array=vec3(0.0, 0.0, 0.0);\n\ return user_array;\n\ -}'); +}' + ); }); test('arrays referenced directly - Array(3) webgl2', () => { - const node = new WebGL2FunctionNode((function refDirect() { - const array = [0, 0, 0]; - return array; - }).toString(), { returnType: 'Array(3)', output: [1] }); - assert.equal(node.toString(), 'vec3 refDirect() {\n\ + const node = new WebGL2FunctionNode( + function refDirect() { + const array = [0, 0, 0]; + return array; + }.toString(), + { returnType: 'Array(3)', output: [1] } + ); + assert.equal( + node.toString(), + 'vec3 refDirect() {\n\ vec3 user_array=vec3(0.0, 0.0, 0.0);\n\ return user_array;\n\ -}'); +}' + ); }); test('arrays referenced directly - Array(3) cpu', () => { - const node = new CPUFunctionNode((function refDirect() { - const array = [0, 0, 0]; - return array; - }).toString(), { returnType: 'Array(3)', output: [1] }); - assert.equal(node.toString(), 'function refDirect() {\n\ + const node = new CPUFunctionNode( + function refDirect() { + const array = [0, 0, 0]; + return array; + }.toString(), + { returnType: 'Array(3)', output: [1] } + ); + assert.equal( + node.toString(), + 'function refDirect() {\n\ const user_array=new Float32Array([0, 0, 0]);\n\ return user_array;\n\ -}'); +}' + ); }); - test('arrays referenced directly - Array(4) webgl', () => { - const node = new WebGLFunctionNode((function refDirect() { - const array = [0, 0, 0, 0]; - return array; - }).toString(), { returnType: 'Array(4)', output: [1] }); - assert.equal(node.toString(), 'vec4 refDirect() {\n\ + const node = new WebGLFunctionNode( + function refDirect() { + const array = [0, 0, 0, 0]; + return array; + }.toString(), + { returnType: 'Array(4)', output: [1] } + ); + assert.equal( + node.toString(), + 'vec4 refDirect() {\n\ vec4 user_array=vec4(0.0, 0.0, 0.0, 0.0);\n\ return user_array;\n\ -}'); +}' + ); }); test('arrays referenced directly - Array(4) webgl2', () => { - const node = new WebGL2FunctionNode((function refDirect() { - const array = [0, 0, 0, 0]; - return array; - }).toString(), { returnType: 'Array(4)', output: [1] }); - assert.equal(node.toString(), 'vec4 refDirect() {\n\ + const node = new WebGL2FunctionNode( + function refDirect() { + const array = [0, 0, 0, 0]; + return array; + }.toString(), + { returnType: 'Array(4)', output: [1] } + ); + assert.equal( + node.toString(), + 'vec4 refDirect() {\n\ vec4 user_array=vec4(0.0, 0.0, 0.0, 0.0);\n\ return user_array;\n\ -}'); +}' + ); }); test('arrays referenced directly - Array(4) cpu', () => { - const node = new CPUFunctionNode((function refDirect() { - const array = [0, 0, 0, 0]; - return array; - }).toString(), { returnType: 'Array(4)', output: [1] }); - assert.equal(node.toString(), 'function refDirect() {\n\ + const node = new CPUFunctionNode( + function refDirect() { + const array = [0, 0, 0, 0]; + return array; + }.toString(), + { returnType: 'Array(4)', output: [1] } + ); + assert.equal( + node.toString(), + 'function refDirect() {\n\ const user_array=new Float32Array([0, 0, 0, 0]);\n\ return user_array;\n\ -}'); +}' + ); }); - test('arrays referenced indirectly - Array(2) webgl', () => { - const node = new WebGLFunctionNode((function indirect() { - const array = [0, 0]; - const array2 = array; - return array2; - }).toString(), { returnType: 'Array(2)', output: [1] }); - assert.equal(node.toString(), 'vec2 indirect() {\n\ + const node = new WebGLFunctionNode( + function indirect() { + const array = [0, 0]; + const array2 = array; + return array2; + }.toString(), + { returnType: 'Array(2)', output: [1] } + ); + assert.equal( + node.toString(), + 'vec2 indirect() {\n\ vec2 user_array=vec2(0.0, 0.0);\n\ vec2 user_array2=user_array;\n\ return user_array2;\n\ -}'); +}' + ); }); test('arrays referenced indirectly - Array(2) webgl2', () => { - const node = new WebGL2FunctionNode((function indirect() { - const array = [0, 0]; - const array2 = array; - return array2; - }).toString(), { returnType: 'Array(2)', output: [1] }); - assert.equal(node.toString(), 'vec2 indirect() {\n\ + const node = new WebGL2FunctionNode( + function indirect() { + const array = [0, 0]; + const array2 = array; + return array2; + }.toString(), + { returnType: 'Array(2)', output: [1] } + ); + assert.equal( + node.toString(), + 'vec2 indirect() {\n\ vec2 user_array=vec2(0.0, 0.0);\n\ vec2 user_array2=user_array;\n\ return user_array2;\n\ -}'); +}' + ); }); test('arrays referenced indirectly - Array(2) cpu', () => { - const node = new CPUFunctionNode((function indirect() { - const array = [0, 0]; - const array2 = array; - return array2; - }).toString(), { returnType: 'Array(2)', output: [1] }); - assert.equal(node.toString(), 'function indirect() {\n\ + const node = new CPUFunctionNode( + function indirect() { + const array = [0, 0]; + const array2 = array; + return array2; + }.toString(), + { returnType: 'Array(2)', output: [1] } + ); + assert.equal( + node.toString(), + 'function indirect() {\n\ const user_array=new Float32Array([0, 0]);\n\ const user_array2=user_array;\n\ return user_array2;\n\ -}'); +}' + ); }); - test('arrays referenced indirectly - Array(3) webgl', () => { - const node = new WebGLFunctionNode((function indirect() { - const array = [0, 0, 0]; - const array2 = array; - return array2; - }).toString(), { returnType: 'Array(3)', output: [1] }); - assert.equal(node.toString(), 'vec3 indirect() {\n\ + const node = new WebGLFunctionNode( + function indirect() { + const array = [0, 0, 0]; + const array2 = array; + return array2; + }.toString(), + { returnType: 'Array(3)', output: [1] } + ); + assert.equal( + node.toString(), + 'vec3 indirect() {\n\ vec3 user_array=vec3(0.0, 0.0, 0.0);\n\ vec3 user_array2=user_array;\n\ return user_array2;\n\ -}'); +}' + ); }); test('arrays referenced indirectly - Array(3) webgl2', () => { - const node = new WebGL2FunctionNode((function indirect() { - const array = [0, 0, 0]; - const array2 = array; - return array2; - }).toString(), { returnType: 'Array(3)', output: [1] }); - assert.equal(node.toString(), 'vec3 indirect() {\n\ + const node = new WebGL2FunctionNode( + function indirect() { + const array = [0, 0, 0]; + const array2 = array; + return array2; + }.toString(), + { returnType: 'Array(3)', output: [1] } + ); + assert.equal( + node.toString(), + 'vec3 indirect() {\n\ vec3 user_array=vec3(0.0, 0.0, 0.0);\n\ vec3 user_array2=user_array;\n\ return user_array2;\n\ -}'); +}' + ); }); test('arrays referenced indirectly - Array(3) cpu', () => { - const node = new CPUFunctionNode((function indirect() { - const array = [0, 0, 0]; - const array2 = array; - return array2; - }).toString(), { returnType: 'Array(3)', output: [1] }); - assert.equal(node.toString(), 'function indirect() {\n\ + const node = new CPUFunctionNode( + function indirect() { + const array = [0, 0, 0]; + const array2 = array; + return array2; + }.toString(), + { returnType: 'Array(3)', output: [1] } + ); + assert.equal( + node.toString(), + 'function indirect() {\n\ const user_array=new Float32Array([0, 0, 0]);\n\ const user_array2=user_array;\n\ return user_array2;\n\ -}'); +}' + ); }); - test('arrays referenced indirectly - Array(4) webgl', () => { - const node = new WebGLFunctionNode((function indirect() { - const array = [0, 0, 0, 0]; - const array2 = array; - return array2; - }).toString(), { returnType: 'Array(4)', output: [1] }); - assert.equal(node.toString(), 'vec4 indirect() {\n\ + const node = new WebGLFunctionNode( + function indirect() { + const array = [0, 0, 0, 0]; + const array2 = array; + return array2; + }.toString(), + { returnType: 'Array(4)', output: [1] } + ); + assert.equal( + node.toString(), + 'vec4 indirect() {\n\ vec4 user_array=vec4(0.0, 0.0, 0.0, 0.0);\n\ vec4 user_array2=user_array;\n\ return user_array2;\n\ -}'); +}' + ); }); test('arrays referenced indirectly - Array(4) webgl2', () => { - const node = new WebGL2FunctionNode((function indirect() { - const array = [0, 0, 0, 0]; - const array2 = array; - return array2; - }).toString(), { returnType: 'Array(4)', output: [1] }); - assert.equal(node.toString(), 'vec4 indirect() {\n\ + const node = new WebGL2FunctionNode( + function indirect() { + const array = [0, 0, 0, 0]; + const array2 = array; + return array2; + }.toString(), + { returnType: 'Array(4)', output: [1] } + ); + assert.equal( + node.toString(), + 'vec4 indirect() {\n\ vec4 user_array=vec4(0.0, 0.0, 0.0, 0.0);\n\ vec4 user_array2=user_array;\n\ return user_array2;\n\ -}'); +}' + ); }); test('arrays referenced indirectly - Array(4) cpu', () => { - const node = new CPUFunctionNode((function indirect() { - const array = [0, 0, 0, 0]; - const array2 = array; - return array2; - }).toString(), { returnType: 'Array(4)', output: [1] }); - assert.equal(node.toString(), 'function indirect() {\n\ + const node = new CPUFunctionNode( + function indirect() { + const array = [0, 0, 0, 0]; + const array2 = array; + return array2; + }.toString(), + { returnType: 'Array(4)', output: [1] } + ); + assert.equal( + node.toString(), + 'function indirect() {\n\ const user_array=new Float32Array([0, 0, 0, 0]);\n\ const user_array2=user_array;\n\ return user_array2;\n\ -}'); +}' + ); }); - test('arrays arguments - Array(2) webgl', () => { - const node = new WebGLFunctionNode((function arrayArguments(array, array2) { - const array3 = [0, 0]; - array3[0] = array[0]; - array3[1] = array[1] * array2[1]; - return array3; - }).toString(), { argumentTypes: ['Array(2)', 'Array(2)'], output: [1] }); - assert.equal(node.toString(), 'vec2 arrayArguments(vec2 user_array, vec2 user_array2) {\n\ + const node = new WebGLFunctionNode( + function arrayArguments(array, array2) { + const array3 = [0, 0]; + array3[0] = array[0]; + array3[1] = array[1] * array2[1]; + return array3; + }.toString(), + { argumentTypes: ['Array(2)', 'Array(2)'], output: [1] } + ); + assert.equal( + node.toString(), + 'vec2 arrayArguments(vec2 user_array, vec2 user_array2) {\n\ vec2 user_array3=vec2(0.0, 0.0);\n\ user_array3[0]=user_array[0];\n\ user_array3[1]=(user_array[1]*user_array2[1]);\n\ return user_array3;\n\ -}'); +}' + ); }); test('arrays arguments - Array(2) webgl2', () => { - const node = new WebGL2FunctionNode((function arrayArguments(array, array2) { - const array3 = [0, 0]; - array3[0] = array[0]; - array3[1] = array[1] * array2[1]; - return array3; - }).toString(), { argumentTypes: ['Array(2)', 'Array(2)'], output: [1] }); - assert.equal(node.toString(), 'vec2 arrayArguments(vec2 user_array, vec2 user_array2) {\n\ + const node = new WebGL2FunctionNode( + function arrayArguments(array, array2) { + const array3 = [0, 0]; + array3[0] = array[0]; + array3[1] = array[1] * array2[1]; + return array3; + }.toString(), + { argumentTypes: ['Array(2)', 'Array(2)'], output: [1] } + ); + assert.equal( + node.toString(), + 'vec2 arrayArguments(vec2 user_array, vec2 user_array2) {\n\ vec2 user_array3=vec2(0.0, 0.0);\n\ user_array3[0]=user_array[0];\n\ user_array3[1]=(user_array[1]*user_array2[1]);\n\ return user_array3;\n\ -}'); +}' + ); }); test('arrays arguments - Array(2) cpu', () => { - const node = new CPUFunctionNode((function arrayArguments(array, array2) { - const array3 = [0, 0]; - array3[0] = array[0]; - array3[1] = array[1] * array2[1]; - return array3; - }).toString(), { argumentTypes: ['Array(2)', 'Array(2)'], output: [1] }); - assert.equal(node.toString(), 'function arrayArguments(user_array, user_array2) {\n\ + const node = new CPUFunctionNode( + function arrayArguments(array, array2) { + const array3 = [0, 0]; + array3[0] = array[0]; + array3[1] = array[1] * array2[1]; + return array3; + }.toString(), + { argumentTypes: ['Array(2)', 'Array(2)'], output: [1] } + ); + assert.equal( + node.toString(), + 'function arrayArguments(user_array, user_array2) {\n\ const user_array3=new Float32Array([0, 0]);\n\ user_array3[0]=user_array[0];\n\ user_array3[1]=(user_array[1]*user_array2[1]);\n\ return user_array3;\n\ -}'); +}' + ); }); test('arrays arguments - Array(3) webgl', () => { - const node = new WebGLFunctionNode((function arrayArguments(array, array2) { - const array3 = [0, 0, 0]; - array3[0] = array[0]; - array3[1] = array[1] * array2[1]; - return array3; - }).toString(), { argumentTypes: ['Array(3)', 'Array(3)'], output: [1] }); - assert.equal(node.toString(), 'vec3 arrayArguments(vec3 user_array, vec3 user_array2) {\n\ + const node = new WebGLFunctionNode( + function arrayArguments(array, array2) { + const array3 = [0, 0, 0]; + array3[0] = array[0]; + array3[1] = array[1] * array2[1]; + return array3; + }.toString(), + { argumentTypes: ['Array(3)', 'Array(3)'], output: [1] } + ); + assert.equal( + node.toString(), + 'vec3 arrayArguments(vec3 user_array, vec3 user_array2) {\n\ vec3 user_array3=vec3(0.0, 0.0, 0.0);\n\ user_array3[0]=user_array[0];\n\ user_array3[1]=(user_array[1]*user_array2[1]);\n\ return user_array3;\n\ -}'); +}' + ); }); test('arrays arguments - Array(3) webgl2', () => { - const node = new WebGL2FunctionNode((function arrayArguments(array, array2) { - const array3 = [0, 0, 0]; - array3[0] = array[0]; - array3[1] = array[1] * array2[1]; - return array3; - }).toString(), { argumentTypes: ['Array(3)', 'Array(3)'], output: [1] }); - assert.equal(node.toString(), 'vec3 arrayArguments(vec3 user_array, vec3 user_array2) {\n\ + const node = new WebGL2FunctionNode( + function arrayArguments(array, array2) { + const array3 = [0, 0, 0]; + array3[0] = array[0]; + array3[1] = array[1] * array2[1]; + return array3; + }.toString(), + { argumentTypes: ['Array(3)', 'Array(3)'], output: [1] } + ); + assert.equal( + node.toString(), + 'vec3 arrayArguments(vec3 user_array, vec3 user_array2) {\n\ vec3 user_array3=vec3(0.0, 0.0, 0.0);\n\ user_array3[0]=user_array[0];\n\ user_array3[1]=(user_array[1]*user_array2[1]);\n\ return user_array3;\n\ -}'); +}' + ); }); test('arrays arguments - Array(3) cpu', () => { - const node = new CPUFunctionNode((function arrayArguments(array, array2) { - const array3 = [0, 0, 0]; - array3[0] = array[0]; - array3[1] = array[1] * array2[1]; - return array3; - }).toString(), { argumentTypes: ['Array(3)', 'Array(3)'], output: [1] }); - assert.equal(node.toString(), 'function arrayArguments(user_array, user_array2) {\n\ + const node = new CPUFunctionNode( + function arrayArguments(array, array2) { + const array3 = [0, 0, 0]; + array3[0] = array[0]; + array3[1] = array[1] * array2[1]; + return array3; + }.toString(), + { argumentTypes: ['Array(3)', 'Array(3)'], output: [1] } + ); + assert.equal( + node.toString(), + 'function arrayArguments(user_array, user_array2) {\n\ const user_array3=new Float32Array([0, 0, 0]);\n\ user_array3[0]=user_array[0];\n\ user_array3[1]=(user_array[1]*user_array2[1]);\n\ return user_array3;\n\ -}'); +}' + ); }); - test('arrays arguments - Array(4) webgl', () => { - const node = new WebGLFunctionNode((function arrayArguments(array, array2) { - const array3 = [0, 0, 0, 0]; - array3[0] = array[0]; - array3[1] = array[1] * array2[1]; - return array3; - }).toString(), { argumentTypes: ['Array(4)', 'Array(4)'], output: [1] }); - assert.equal(node.toString(), 'vec4 arrayArguments(vec4 user_array, vec4 user_array2) {\n\ + const node = new WebGLFunctionNode( + function arrayArguments(array, array2) { + const array3 = [0, 0, 0, 0]; + array3[0] = array[0]; + array3[1] = array[1] * array2[1]; + return array3; + }.toString(), + { argumentTypes: ['Array(4)', 'Array(4)'], output: [1] } + ); + assert.equal( + node.toString(), + 'vec4 arrayArguments(vec4 user_array, vec4 user_array2) {\n\ vec4 user_array3=vec4(0.0, 0.0, 0.0, 0.0);\n\ user_array3[0]=user_array[0];\n\ user_array3[1]=(user_array[1]*user_array2[1]);\n\ return user_array3;\n\ -}'); +}' + ); }); test('arrays arguments - Array(4) webgl2', () => { - const node = new WebGL2FunctionNode((function arrayArguments(array, array2) { - const array3 = [0, 0, 0, 0]; - array3[0] = array[0]; - array3[1] = array[1] * array2[1]; - return array3; - }).toString(), { argumentTypes: ['Array(4)', 'Array(4)'], output: [1] }); - assert.equal(node.toString(), 'vec4 arrayArguments(vec4 user_array, vec4 user_array2) {\n\ + const node = new WebGL2FunctionNode( + function arrayArguments(array, array2) { + const array3 = [0, 0, 0, 0]; + array3[0] = array[0]; + array3[1] = array[1] * array2[1]; + return array3; + }.toString(), + { argumentTypes: ['Array(4)', 'Array(4)'], output: [1] } + ); + assert.equal( + node.toString(), + 'vec4 arrayArguments(vec4 user_array, vec4 user_array2) {\n\ vec4 user_array3=vec4(0.0, 0.0, 0.0, 0.0);\n\ user_array3[0]=user_array[0];\n\ user_array3[1]=(user_array[1]*user_array2[1]);\n\ return user_array3;\n\ -}'); +}' + ); }); test('arrays arguments - Array(4) cpu', () => { - const node = new CPUFunctionNode((function arrayArguments(array, array2) { - const array3 = [0, 0, 0, 0]; - array3[0] = array[0]; - array3[1] = array[1] * array2[1]; - return array3; - }).toString(), { argumentTypes: ['Array(4)', 'Array(4)'], output: [1] }); - assert.equal(node.toString(), 'function arrayArguments(user_array, user_array2) {\n\ + const node = new CPUFunctionNode( + function arrayArguments(array, array2) { + const array3 = [0, 0, 0, 0]; + array3[0] = array[0]; + array3[1] = array[1] * array2[1]; + return array3; + }.toString(), + { argumentTypes: ['Array(4)', 'Array(4)'], output: [1] } + ); + assert.equal( + node.toString(), + 'function arrayArguments(user_array, user_array2) {\n\ const user_array3=new Float32Array([0, 0, 0, 0]);\n\ user_array3[0]=user_array[0];\n\ user_array3[1]=(user_array[1]*user_array2[1]);\n\ return user_array3;\n\ -}'); +}' + ); }); test('arrays inherited - Array(2) webgl', () => { - const node = new WebGLFunctionNode((function inherited(array, array2) { - const array3 = [0, 0]; - array3[0] = array[0]; - array3[1] = array[1] * array2[1]; - return array3; - }).toString(), { argumentTypes: ['Array(2)', 'Array(2)'], returnType: 'Array(2)', output: [1] }); - assert.equal(node.toString(), 'vec2 inherited(vec2 user_array, vec2 user_array2) {\n\ + const node = new WebGLFunctionNode( + function inherited(array, array2) { + const array3 = [0, 0]; + array3[0] = array[0]; + array3[1] = array[1] * array2[1]; + return array3; + }.toString(), + { + argumentTypes: ['Array(2)', 'Array(2)'], + returnType: 'Array(2)', + output: [1], + } + ); + assert.equal( + node.toString(), + 'vec2 inherited(vec2 user_array, vec2 user_array2) {\n\ vec2 user_array3=vec2(0.0, 0.0);\n\ user_array3[0]=user_array[0];\n\ user_array3[1]=(user_array[1]*user_array2[1]);\n\ return user_array3;\n\ -}'); +}' + ); }); test('arrays inherited - Array(2) webgl2', () => { - const node = new WebGL2FunctionNode((function inherited(array, array2) { - const array3 = [0, 0]; - array3[0] = array[0]; - array3[1] = array[1] * array2[1]; - return array3; - }).toString(), { argumentTypes: ['Array(2)', 'Array(2)'], returnType: 'Array(2)', output: [1] }); - assert.equal(node.toString(), 'vec2 inherited(vec2 user_array, vec2 user_array2) {\n\ + const node = new WebGL2FunctionNode( + function inherited(array, array2) { + const array3 = [0, 0]; + array3[0] = array[0]; + array3[1] = array[1] * array2[1]; + return array3; + }.toString(), + { + argumentTypes: ['Array(2)', 'Array(2)'], + returnType: 'Array(2)', + output: [1], + } + ); + assert.equal( + node.toString(), + 'vec2 inherited(vec2 user_array, vec2 user_array2) {\n\ vec2 user_array3=vec2(0.0, 0.0);\n\ user_array3[0]=user_array[0];\n\ user_array3[1]=(user_array[1]*user_array2[1]);\n\ return user_array3;\n\ -}'); +}' + ); }); test('arrays inherited - Array(2) cpu', () => { - const node = new CPUFunctionNode((function inherited(array, array2) { - const array3 = [0, 0]; - array3[0] = array[0]; - array3[1] = array[1] * array2[1]; - return array3; - }).toString(), { argumentTypes: ['Array(2)', 'Array(2)'], returnType: 'Array(2)', output: [1] }); - assert.equal(node.toString(), 'function inherited(user_array, user_array2) {\n\ + const node = new CPUFunctionNode( + function inherited(array, array2) { + const array3 = [0, 0]; + array3[0] = array[0]; + array3[1] = array[1] * array2[1]; + return array3; + }.toString(), + { + argumentTypes: ['Array(2)', 'Array(2)'], + returnType: 'Array(2)', + output: [1], + } + ); + assert.equal( + node.toString(), + 'function inherited(user_array, user_array2) {\n\ const user_array3=new Float32Array([0, 0]);\n\ user_array3[0]=user_array[0];\n\ user_array3[1]=(user_array[1]*user_array2[1]);\n\ return user_array3;\n\ -}'); +}' + ); }); test('arrays inherited - Array(3) webgl', () => { - const node = new WebGLFunctionNode((function inherited(array, array2) { - const array3 = [0, 0, 0]; - array3[0] = array[0]; - array3[1] = array[1] * array2[1]; - return array3; - }).toString(), { argumentTypes: ['Array(3)', 'Array(3)'], returnType: 'Array(3)', output: [1] }); - assert.equal(node.toString(), 'vec3 inherited(vec3 user_array, vec3 user_array2) {\n\ + const node = new WebGLFunctionNode( + function inherited(array, array2) { + const array3 = [0, 0, 0]; + array3[0] = array[0]; + array3[1] = array[1] * array2[1]; + return array3; + }.toString(), + { + argumentTypes: ['Array(3)', 'Array(3)'], + returnType: 'Array(3)', + output: [1], + } + ); + assert.equal( + node.toString(), + 'vec3 inherited(vec3 user_array, vec3 user_array2) {\n\ vec3 user_array3=vec3(0.0, 0.0, 0.0);\n\ user_array3[0]=user_array[0];\n\ user_array3[1]=(user_array[1]*user_array2[1]);\n\ return user_array3;\n\ -}'); +}' + ); }); test('arrays inherited - Array(3) webgl2', () => { - const node = new WebGL2FunctionNode((function inherited(array, array2) { - const array3 = [0, 0, 0]; - array3[0] = array[0]; - array3[1] = array[1] * array2[1]; - return array3; - }).toString(), { argumentTypes: ['Array(3)', 'Array(3)'], returnType: 'Array(3)', output: [1] }); - assert.equal(node.toString(), 'vec3 inherited(vec3 user_array, vec3 user_array2) {\n\ + const node = new WebGL2FunctionNode( + function inherited(array, array2) { + const array3 = [0, 0, 0]; + array3[0] = array[0]; + array3[1] = array[1] * array2[1]; + return array3; + }.toString(), + { + argumentTypes: ['Array(3)', 'Array(3)'], + returnType: 'Array(3)', + output: [1], + } + ); + assert.equal( + node.toString(), + 'vec3 inherited(vec3 user_array, vec3 user_array2) {\n\ vec3 user_array3=vec3(0.0, 0.0, 0.0);\n\ user_array3[0]=user_array[0];\n\ user_array3[1]=(user_array[1]*user_array2[1]);\n\ return user_array3;\n\ -}'); +}' + ); }); test('arrays inherited - Array(3) cpu', () => { - const node = new CPUFunctionNode((function inherited(array, array2) { - const array3 = [0, 0, 0]; - array3[0] = array[0]; - array3[1] = array[1] * array2[1]; - return array3; - }).toString(), { argumentTypes: ['Array(3)', 'Array(3)'], returnType: 'Array(3)', output: [1] }); - assert.equal(node.toString(), 'function inherited(user_array, user_array2) {\n\ + const node = new CPUFunctionNode( + function inherited(array, array2) { + const array3 = [0, 0, 0]; + array3[0] = array[0]; + array3[1] = array[1] * array2[1]; + return array3; + }.toString(), + { + argumentTypes: ['Array(3)', 'Array(3)'], + returnType: 'Array(3)', + output: [1], + } + ); + assert.equal( + node.toString(), + 'function inherited(user_array, user_array2) {\n\ const user_array3=new Float32Array([0, 0, 0]);\n\ user_array3[0]=user_array[0];\n\ user_array3[1]=(user_array[1]*user_array2[1]);\n\ return user_array3;\n\ -}'); +}' + ); }); test('arrays inherited - Array(4) webgl', () => { - const node = new WebGLFunctionNode((function inherited(array, array2) { - const array3 = [0, 0, 0, 0]; - array3[0] = array[0]; - array3[1] = array[1] * array2[1]; - return array3; - }).toString(), { argumentTypes: ['Array(4)', 'Array(4)'], returnType: 'Array(4)', output: [1] }); - assert.equal(node.toString(), 'vec4 inherited(vec4 user_array, vec4 user_array2) {\n\ + const node = new WebGLFunctionNode( + function inherited(array, array2) { + const array3 = [0, 0, 0, 0]; + array3[0] = array[0]; + array3[1] = array[1] * array2[1]; + return array3; + }.toString(), + { + argumentTypes: ['Array(4)', 'Array(4)'], + returnType: 'Array(4)', + output: [1], + } + ); + assert.equal( + node.toString(), + 'vec4 inherited(vec4 user_array, vec4 user_array2) {\n\ vec4 user_array3=vec4(0.0, 0.0, 0.0, 0.0);\n\ user_array3[0]=user_array[0];\n\ user_array3[1]=(user_array[1]*user_array2[1]);\n\ return user_array3;\n\ -}'); +}' + ); }); test('arrays inherited - Array(4) webgl2', () => { - const node = new WebGL2FunctionNode((function inherited(array, array2) { - const array3 = [0, 0, 0, 0]; - array3[0] = array[0]; - array3[1] = array[1] * array2[1]; - return array3; - }).toString(), { argumentTypes: ['Array(4)', 'Array(4)'], returnType: 'Array(4)', output: [1] }); - assert.equal(node.toString(), 'vec4 inherited(vec4 user_array, vec4 user_array2) {' - + '\nvec4 user_array3=vec4(0.0, 0.0, 0.0, 0.0);' - + '\nuser_array3[0]=user_array[0];' - + '\nuser_array3[1]=(user_array[1]*user_array2[1]);' - + '\nreturn user_array3;' - + '\n}'); + const node = new WebGL2FunctionNode( + function inherited(array, array2) { + const array3 = [0, 0, 0, 0]; + array3[0] = array[0]; + array3[1] = array[1] * array2[1]; + return array3; + }.toString(), + { + argumentTypes: ['Array(4)', 'Array(4)'], + returnType: 'Array(4)', + output: [1], + } + ); + assert.equal( + node.toString(), + 'vec4 inherited(vec4 user_array, vec4 user_array2) {' + + '\nvec4 user_array3=vec4(0.0, 0.0, 0.0, 0.0);' + + '\nuser_array3[0]=user_array[0];' + + '\nuser_array3[1]=(user_array[1]*user_array2[1]);' + + '\nreturn user_array3;' + + '\n}' + ); }); test('arrays inherited - Array(4) cpu', () => { - const node = new CPUFunctionNode((function inherited(array, array2) { - const array3 = [0, 0, 0, 0]; - array3[0] = array[0]; - array3[1] = array[1] * array2[1]; - return array3; - }).toString(), { argumentTypes: ['Array(4)', 'Array(4)'], returnType: 'Array(4)', output: [1] }); - assert.equal(node.toString(), 'function inherited(user_array, user_array2) {\n\ + const node = new CPUFunctionNode( + function inherited(array, array2) { + const array3 = [0, 0, 0, 0]; + array3[0] = array[0]; + array3[1] = array[1] * array2[1]; + return array3; + }.toString(), + { + argumentTypes: ['Array(4)', 'Array(4)'], + returnType: 'Array(4)', + output: [1], + } + ); + assert.equal( + node.toString(), + 'function inherited(user_array, user_array2) {\n\ const user_array3=new Float32Array([0, 0, 0, 0]);\n\ user_array3[0]=user_array[0];\n\ user_array3[1]=(user_array[1]*user_array2[1]);\n\ return user_array3;\n\ -}'); +}' + ); }); test('auto detect float, array, array2d, array3d - webgl', () => { - const node = new WebGLFunctionNode(`function advancedUsed(int, array, array2d, array3d) { + const node = new WebGLFunctionNode( + `function advancedUsed(int, array, array2d, array3d) { let allValues = this.constants.float; allValues += this.constants.int; allValues += this.constants.array[this.thread.x]; @@ -564,60 +867,97 @@ test('auto detect float, array, array2d, array3d - webgl', () => { allValues += array3d[this.thread.x][this.thread.y][this.thread.z]; return allValues * Math.random(); - }`, { - returnType: 'Number', - output: [1], - argumentTypes: ['Integer', 'Array', 'Array2D', 'Array3D'], - constants: { float: 1, int: 1, array: [1], array2d: [[1]], array3d: [[[1]]] }, - constantTypes: { float: 'Float', int: 'Integer', array: 'Array', array2d: 'Array2D', array3d: 'Array3D' }, - constantBitRatios: { float: 0, int: 0, array: 4, array2d: 4, array3d: 4 }, - lookupFunctionArgumentBitRatio: () => 4, - }); - - assert.equal(node.toString(), 'float advancedUsed(int user_int, sampler2D user_array,ivec2 user_arraySize,ivec3 user_arrayDim, sampler2D user_array2d,ivec2 user_array2dSize,ivec3 user_array2dDim, sampler2D user_array3d,ivec2 user_array3dSize,ivec3 user_array3dDim) {' - + '\nfloat user_allValues=constants_float;' - + '\nuser_allValues+=float(constants_int);' - + '\nuser_allValues+=get32(constants_array, constants_arraySize, constants_arrayDim, 0, 0, threadId.x);' - + '\nuser_allValues+=get32(constants_array2d, constants_array2dSize, constants_array2dDim, 0, threadId.x, threadId.y);' - + '\nuser_allValues+=get32(constants_array3d, constants_array3dSize, constants_array3dDim, threadId.x, threadId.y, threadId.z);' - + '\nuser_allValues+=float(user_int);' - + '\nuser_allValues+=get32(user_array, user_arraySize, user_arrayDim, 0, 0, threadId.x);' - + '\nuser_allValues+=get32(user_array2d, user_array2dSize, user_array2dDim, 0, threadId.x, threadId.y);' - + '\nuser_allValues+=get32(user_array3d, user_array3dSize, user_array3dDim, threadId.x, threadId.y, threadId.z);' - + '\nreturn (user_allValues*random());' - + '\n}'); + }`, + { + returnType: 'Number', + output: [1], + argumentTypes: ['Integer', 'Array', 'Array2D', 'Array3D'], + constants: { + float: 1, + int: 1, + array: [1], + array2d: [[1]], + array3d: [[[1]]], + }, + constantTypes: { + float: 'Float', + int: 'Integer', + array: 'Array', + array2d: 'Array2D', + array3d: 'Array3D', + }, + constantBitRatios: { + float: 0, + int: 0, + array: 4, + array2d: 4, + array3d: 4, + }, + lookupFunctionArgumentBitRatio: () => 4, + } + ); + + assert.equal( + node.toString(), + 'float advancedUsed(int user_int, sampler2D user_array,ivec2 user_arraySize,ivec3 user_arrayDim, sampler2D user_array2d,ivec2 user_array2dSize,ivec3 user_array2dDim, sampler2D user_array3d,ivec2 user_array3dSize,ivec3 user_array3dDim) {' + + '\nfloat user_allValues=constants_float;' + + '\nuser_allValues+=float(constants_int);' + + '\nuser_allValues+=get32(constants_array, constants_arraySize, constants_arrayDim, 0, 0, threadId.x);' + + '\nuser_allValues+=get32(constants_array2d, constants_array2dSize, constants_array2dDim, 0, threadId.x, threadId.y);' + + '\nuser_allValues+=get32(constants_array3d, constants_array3dSize, constants_array3dDim, threadId.x, threadId.y, threadId.z);' + + '\nuser_allValues+=float(user_int);' + + '\nuser_allValues+=get32(user_array, user_arraySize, user_arrayDim, 0, 0, threadId.x);' + + '\nuser_allValues+=get32(user_array2d, user_array2dSize, user_array2dDim, 0, threadId.x, threadId.y);' + + '\nuser_allValues+=get32(user_array3d, user_array3dSize, user_array3dDim, threadId.x, threadId.y, threadId.z);' + + '\nreturn (user_allValues*random());' + + '\n}' + ); }); - function notDefined(mode) { const gpu = new GPU({ mode }); - const kernel1 = gpu.createKernel(function() { - return result; - }, { output: [1] }); + const kernel1 = gpu.createKernel( + function () { + return result; + }, + { output: [1] } + ); assert.throws(() => { kernel1(); }, new Error('Identifier is not defined on line 1, position 0:\n result')); - const kernel2 = gpu.createKernel(function() { - return result[0]; - }, { output: [1] }); + const kernel2 = gpu.createKernel( + function () { + return result[0]; + }, + { output: [1] } + ); assert.throws(() => { kernel2(); }, new Error('Identifier is not defined on line 1, position 0:\n result')); - const kernel3 = gpu.createKernel(function() { - return result[0][0]; - }, { output: [1] }); + const kernel3 = gpu.createKernel( + function () { + return result[0][0]; + }, + { output: [1] } + ); assert.throws(() => { kernel3(); }, new Error('Identifier is not defined on line 1, position 0:\n result')); - const kernel4 = gpu.createKernel(function() { - return result[0][0][0]; - }, { output: [1] }); + const kernel4 = gpu.createKernel( + function () { + return result[0][0][0]; + }, + { output: [1] } + ); assert.throws(() => { kernel4(); }, new Error('Identifier is not defined on line 1, position 0:\n result')); - const kernel5 = gpu.createKernel(function() { - return result[0][0][0][0]; - }, { output: [1] }); + const kernel5 = gpu.createKernel( + function () { + return result[0][0][0][0]; + }, + { output: [1] } + ); assert.throws(() => { kernel5(); }, new Error('Identifier is not defined on line 1, position 1:\n result')); diff --git a/test/features/unsigned-precision-textures.js b/test/features/unsigned-precision-textures.js index d873d288..efc74e4e 100644 --- a/test/features/unsigned-precision-textures.js +++ b/test/features/unsigned-precision-textures.js @@ -1,17 +1,20 @@ const { assert, skip, test, only, module: describe } = require('qunit'); -const { GPU } = require('../../src'); +const { GPU } = require('../..'); describe('features: unsigned precision textures'); function unsignedPrecisionTexturesWithArray(mode) { const original = [1, 2, 3, 4, 5, 6, 7, 8, 9]; const gpu = new GPU({ mode }); - const kernel = gpu.createKernel(function(packed) { - return packed[this.thread.x]; - }, { - output: [9], - precision: 'unsigned' - }); + const kernel = gpu.createKernel( + function (packed) { + return packed[this.thread.x]; + }, + { + output: [9], + precision: 'unsigned', + } + ); const result = kernel(original); assert.deepEqual(Array.from(result), original); @@ -30,27 +33,36 @@ test('with Array cpu', () => { unsignedPrecisionTexturesWithArray('gpu'); }); -(GPU.isWebGLSupported && GPU.isKernelMapSupported ? test : skip)('with Array webgl', () => { - unsignedPrecisionTexturesWithArray('webgl'); -}); +(GPU.isWebGLSupported && GPU.isKernelMapSupported ? test : skip)( + 'with Array webgl', + () => { + unsignedPrecisionTexturesWithArray('webgl'); + } +); (GPU.isWebGL2Supported ? test : skip)('with Array webgl2', () => { unsignedPrecisionTexturesWithArray('webgl2'); }); -(GPU.isHeadlessGLSupported && GPU.isKernelMapSupported ? test : skip)('with Array headlessgl', () => { - unsignedPrecisionTexturesWithArray('headlessgl'); -}); +(GPU.isHeadlessGLSupported && GPU.isKernelMapSupported ? test : skip)( + 'with Array headlessgl', + () => { + unsignedPrecisionTexturesWithArray('headlessgl'); + } +); function unsignedPrecisionTexturesWithFloat32Array(mode) { const original = new Float32Array([1, 2, 3, 4, 5, 6, 7, 8, 9]); const gpu = new GPU({ mode }); - const kernel = gpu.createKernel(function(packed) { - return packed[this.thread.x]; - }, { - output: [9], - precision: 'unsigned' - }); + const kernel = gpu.createKernel( + function (packed) { + return packed[this.thread.x]; + }, + { + output: [9], + precision: 'unsigned', + } + ); const result = kernel(original); assert.deepEqual(Array.from(result), Array.from(original)); @@ -69,27 +81,36 @@ test('with Float32Array cpu', () => { unsignedPrecisionTexturesWithFloat32Array('gpu'); }); -(GPU.isWebGLSupported && GPU.isKernelMapSupported ? test : skip)('with Float32Array webgl', () => { - unsignedPrecisionTexturesWithFloat32Array('webgl'); -}); +(GPU.isWebGLSupported && GPU.isKernelMapSupported ? test : skip)( + 'with Float32Array webgl', + () => { + unsignedPrecisionTexturesWithFloat32Array('webgl'); + } +); (GPU.isWebGL2Supported ? test : skip)('with Float32Array webgl2', () => { unsignedPrecisionTexturesWithFloat32Array('webgl2'); }); -(GPU.isHeadlessGLSupported && GPU.isKernelMapSupported ? test : skip)('with Float32Array headlessgl', () => { - unsignedPrecisionTexturesWithFloat32Array('headlessgl'); -}); +(GPU.isHeadlessGLSupported && GPU.isKernelMapSupported ? test : skip)( + 'with Float32Array headlessgl', + () => { + unsignedPrecisionTexturesWithFloat32Array('headlessgl'); + } +); function unsignedPrecisionTexturesWithUint16Array(mode) { const original = new Uint16Array([1, 2, 3, 4, 5, 6, 7, 8, 9]); const gpu = new GPU({ mode }); - const kernel = gpu.createKernel(function(packed) { - return packed[this.thread.x]; - }, { - output: [9], - precision: 'unsigned', - }); + const kernel = gpu.createKernel( + function (packed) { + return packed[this.thread.x]; + }, + { + output: [9], + precision: 'unsigned', + } + ); const result = kernel(original); assert.deepEqual(Array.from(result), Array.from(original)); @@ -108,27 +129,36 @@ test('with Uint16Array cpu', () => { unsignedPrecisionTexturesWithUint16Array('gpu'); }); -(GPU.isWebGLSupported && GPU.isKernelMapSupported ? test : skip)('with Uint16Array webgl', () => { - unsignedPrecisionTexturesWithUint16Array('webgl'); -}); +(GPU.isWebGLSupported && GPU.isKernelMapSupported ? test : skip)( + 'with Uint16Array webgl', + () => { + unsignedPrecisionTexturesWithUint16Array('webgl'); + } +); (GPU.isWebGL2Supported ? test : skip)('with Uint16Array webgl2', () => { unsignedPrecisionTexturesWithUint16Array('webgl2'); }); -(GPU.isHeadlessGLSupported && GPU.isKernelMapSupported ? test : skip)('with Uint16Array headlessgl', () => { - unsignedPrecisionTexturesWithUint16Array('headlessgl'); -}); +(GPU.isHeadlessGLSupported && GPU.isKernelMapSupported ? test : skip)( + 'with Uint16Array headlessgl', + () => { + unsignedPrecisionTexturesWithUint16Array('headlessgl'); + } +); function unsignedPrecisionTexturesWithUint8Array(mode) { const original = new Uint8Array([1, 2, 3, 4, 5, 6, 7, 8, 9]); const gpu = new GPU({ mode }); - const kernel = gpu.createKernel(function(packed) { - return packed[this.thread.x]; - }, { - output: [9], - precision: 'unsigned' - }); + const kernel = gpu.createKernel( + function (packed) { + return packed[this.thread.x]; + }, + { + output: [9], + precision: 'unsigned', + } + ); const result = kernel(original); assert.deepEqual(Array.from(result), Array.from(original)); @@ -147,27 +177,36 @@ test('with Uint8Array cpu', () => { unsignedPrecisionTexturesWithUint8Array('gpu'); }); -(GPU.isWebGLSupported && GPU.isKernelMapSupported ? test : skip)('with Uint8Array webgl', () => { - unsignedPrecisionTexturesWithUint8Array('webgl'); -}); +(GPU.isWebGLSupported && GPU.isKernelMapSupported ? test : skip)( + 'with Uint8Array webgl', + () => { + unsignedPrecisionTexturesWithUint8Array('webgl'); + } +); (GPU.isWebGL2Supported ? test : skip)('with Uint8Array webgl2', () => { unsignedPrecisionTexturesWithUint8Array('webgl2'); }); -(GPU.isHeadlessGLSupported && GPU.isKernelMapSupported ? test : skip)('with Uint8Array headlessgl', () => { - unsignedPrecisionTexturesWithUint8Array('headlessgl'); -}); +(GPU.isHeadlessGLSupported && GPU.isKernelMapSupported ? test : skip)( + 'with Uint8Array headlessgl', + () => { + unsignedPrecisionTexturesWithUint8Array('headlessgl'); + } +); function unsignedPrecisionTexturesWithUint8ClampedArray(mode) { const original = new Uint8ClampedArray([1, 2, 3, 4, 5, 6, 7, 8, 9]); const gpu = new GPU({ mode }); - const kernel = gpu.createKernel(function(packed) { - return packed[this.thread.x]; - }, { - output: [9], - precision: 'unsigned' - }); + const kernel = gpu.createKernel( + function (packed) { + return packed[this.thread.x]; + }, + { + output: [9], + precision: 'unsigned', + } + ); const result = kernel(original); assert.deepEqual(Array.from(result), Array.from(original)); @@ -186,17 +225,23 @@ test('with Uint8ClampedArray cpu', () => { unsignedPrecisionTexturesWithUint8ClampedArray('gpu'); }); -(GPU.isWebGLSupported && GPU.isKernelMapSupported ? test : skip)('with Uint8ClampedArray webgl', () => { - unsignedPrecisionTexturesWithUint8ClampedArray('webgl'); -}); +(GPU.isWebGLSupported && GPU.isKernelMapSupported ? test : skip)( + 'with Uint8ClampedArray webgl', + () => { + unsignedPrecisionTexturesWithUint8ClampedArray('webgl'); + } +); (GPU.isWebGL2Supported ? test : skip)('with Uint8ClampedArray webgl2', () => { unsignedPrecisionTexturesWithUint8ClampedArray('webgl2'); }); -(GPU.isHeadlessGLSupported && GPU.isKernelMapSupported ? test : skip)('with Uint8ClampedArray headlessgl', () => { - unsignedPrecisionTexturesWithUint8ClampedArray('headlessgl'); -}); +(GPU.isHeadlessGLSupported && GPU.isKernelMapSupported ? test : skip)( + 'with Uint8ClampedArray headlessgl', + () => { + unsignedPrecisionTexturesWithUint8ClampedArray('headlessgl'); + } +); function unsignedPrecisionTexturesWithArray2D(mode) { const original = [ @@ -204,15 +249,21 @@ function unsignedPrecisionTexturesWithArray2D(mode) { [10, 11, 12, 13, 14, 15, 16, 18, 19], ]; const gpu = new GPU({ mode }); - const kernel = gpu.createKernel(function(packed) { - return packed[this.thread.y][this.thread.x]; - }, { - output: [9, 2], - precision: 'unsigned' - }); + const kernel = gpu.createKernel( + function (packed) { + return packed[this.thread.y][this.thread.x]; + }, + { + output: [9, 2], + precision: 'unsigned', + } + ); const result = kernel(original); - assert.deepEqual(result.map(array => Array.from(array)), original.map(array => Array.from(array))); + assert.deepEqual( + result.map(array => Array.from(array)), + original.map(array => Array.from(array)) + ); gpu.destroy(); } @@ -228,17 +279,23 @@ test('with Array2D cpu', () => { unsignedPrecisionTexturesWithArray2D('gpu'); }); -(GPU.isWebGLSupported && GPU.isKernelMapSupported ? test : skip)('with Array2D webgl', () => { - unsignedPrecisionTexturesWithArray2D('webgl'); -}); +(GPU.isWebGLSupported && GPU.isKernelMapSupported ? test : skip)( + 'with Array2D webgl', + () => { + unsignedPrecisionTexturesWithArray2D('webgl'); + } +); (GPU.isWebGL2Supported ? test : skip)('with Array2D webgl2', () => { unsignedPrecisionTexturesWithArray2D('webgl2'); }); -(GPU.isHeadlessGLSupported && GPU.isKernelMapSupported ? test : skip)('with Array2D headlessgl', () => { - unsignedPrecisionTexturesWithArray2D('headlessgl'); -}); +(GPU.isHeadlessGLSupported && GPU.isKernelMapSupported ? test : skip)( + 'with Array2D headlessgl', + () => { + unsignedPrecisionTexturesWithArray2D('headlessgl'); + } +); function unsignedPrecisionTexturesWithFloat32Array2D(mode) { const original = [ @@ -246,15 +303,21 @@ function unsignedPrecisionTexturesWithFloat32Array2D(mode) { new Float32Array([10, 11, 12, 13, 14, 15, 16, 18, 19]), ]; const gpu = new GPU({ mode }); - const kernel = gpu.createKernel(function(packed) { - return packed[this.thread.y][this.thread.x]; - }, { - output: [9, 2], - precision: 'unsigned' - }); + const kernel = gpu.createKernel( + function (packed) { + return packed[this.thread.y][this.thread.x]; + }, + { + output: [9, 2], + precision: 'unsigned', + } + ); const result = kernel(original); - assert.deepEqual(result.map(array => Array.from(array)), original.map(array => Array.from(array))); + assert.deepEqual( + result.map(array => Array.from(array)), + original.map(array => Array.from(array)) + ); gpu.destroy(); } @@ -270,17 +333,23 @@ test('with Float32Array2D cpu', () => { unsignedPrecisionTexturesWithFloat32Array2D('gpu'); }); -(GPU.isWebGLSupported && GPU.isKernelMapSupported ? test : skip)('with Float32Array2D webgl', () => { - unsignedPrecisionTexturesWithFloat32Array2D('webgl'); -}); +(GPU.isWebGLSupported && GPU.isKernelMapSupported ? test : skip)( + 'with Float32Array2D webgl', + () => { + unsignedPrecisionTexturesWithFloat32Array2D('webgl'); + } +); (GPU.isWebGL2Supported ? test : skip)('with Float32Array2D webgl2', () => { unsignedPrecisionTexturesWithFloat32Array2D('webgl2'); }); -(GPU.isHeadlessGLSupported && GPU.isKernelMapSupported ? test : skip)('with Float32Array2D headlessgl', () => { - unsignedPrecisionTexturesWithFloat32Array2D('headlessgl'); -}); +(GPU.isHeadlessGLSupported && GPU.isKernelMapSupported ? test : skip)( + 'with Float32Array2D headlessgl', + () => { + unsignedPrecisionTexturesWithFloat32Array2D('headlessgl'); + } +); function unsignedPrecisionTexturesWithUint16Array2D(mode) { const original = [ @@ -288,15 +357,21 @@ function unsignedPrecisionTexturesWithUint16Array2D(mode) { new Uint16Array([10, 11, 12, 13, 14, 15, 16, 18, 19]), ]; const gpu = new GPU({ mode }); - const kernel = gpu.createKernel(function(packed) { - return packed[this.thread.y][this.thread.x]; - }, { - output: [9, 2], - precision: 'unsigned' - }); + const kernel = gpu.createKernel( + function (packed) { + return packed[this.thread.y][this.thread.x]; + }, + { + output: [9, 2], + precision: 'unsigned', + } + ); const result = kernel(original); - assert.deepEqual(result.map(array => Array.from(array)), original.map(array => Array.from(array))); + assert.deepEqual( + result.map(array => Array.from(array)), + original.map(array => Array.from(array)) + ); gpu.destroy(); } @@ -312,17 +387,23 @@ test('with Uint16Array2D cpu', () => { unsignedPrecisionTexturesWithUint16Array2D('gpu'); }); -(GPU.isWebGLSupported && GPU.isKernelMapSupported ? test : skip)('with Uint16Array2D webgl', () => { - unsignedPrecisionTexturesWithUint16Array2D('webgl'); -}); +(GPU.isWebGLSupported && GPU.isKernelMapSupported ? test : skip)( + 'with Uint16Array2D webgl', + () => { + unsignedPrecisionTexturesWithUint16Array2D('webgl'); + } +); (GPU.isWebGL2Supported ? test : skip)('with Uint16Array2D webgl2', () => { unsignedPrecisionTexturesWithUint16Array2D('webgl2'); }); -(GPU.isHeadlessGLSupported && GPU.isKernelMapSupported ? test : skip)('with Uint16Array2D headlessgl', () => { - unsignedPrecisionTexturesWithUint16Array2D('headlessgl'); -}); +(GPU.isHeadlessGLSupported && GPU.isKernelMapSupported ? test : skip)( + 'with Uint16Array2D headlessgl', + () => { + unsignedPrecisionTexturesWithUint16Array2D('headlessgl'); + } +); function unsignedPrecisionTexturesWithUint8Array2D(mode) { const original = [ @@ -330,15 +411,21 @@ function unsignedPrecisionTexturesWithUint8Array2D(mode) { new Uint8Array([10, 11, 12, 13, 14, 15, 16, 18, 19]), ]; const gpu = new GPU({ mode }); - const kernel = gpu.createKernel(function(packed) { - return packed[this.thread.y][this.thread.x]; - }, { - output: [9, 2], - precision: 'unsigned' - }); + const kernel = gpu.createKernel( + function (packed) { + return packed[this.thread.y][this.thread.x]; + }, + { + output: [9, 2], + precision: 'unsigned', + } + ); const result = kernel(original); - assert.deepEqual(result.map(array => Array.from(array)), original.map(array => Array.from(array))); + assert.deepEqual( + result.map(array => Array.from(array)), + original.map(array => Array.from(array)) + ); gpu.destroy(); } @@ -354,17 +441,23 @@ test('with Uint8Array2D cpu', () => { unsignedPrecisionTexturesWithUint8Array2D('gpu'); }); -(GPU.isWebGLSupported && GPU.isKernelMapSupported ? test : skip)('with Uint8Array2D webgl', () => { - unsignedPrecisionTexturesWithUint8Array2D('webgl'); -}); +(GPU.isWebGLSupported && GPU.isKernelMapSupported ? test : skip)( + 'with Uint8Array2D webgl', + () => { + unsignedPrecisionTexturesWithUint8Array2D('webgl'); + } +); (GPU.isWebGL2Supported ? test : skip)('with Uint8Array2D webgl2', () => { unsignedPrecisionTexturesWithUint8Array2D('webgl2'); }); -(GPU.isHeadlessGLSupported && GPU.isKernelMapSupported ? test : skip)('with Uint8Array2D headlessgl', () => { - unsignedPrecisionTexturesWithUint8Array2D('headlessgl'); -}); +(GPU.isHeadlessGLSupported && GPU.isKernelMapSupported ? test : skip)( + 'with Uint8Array2D headlessgl', + () => { + unsignedPrecisionTexturesWithUint8Array2D('headlessgl'); + } +); function unsignedPrecisionTexturesWithUint8ClampedArray2D(mode) { const original = [ @@ -372,41 +465,62 @@ function unsignedPrecisionTexturesWithUint8ClampedArray2D(mode) { new Uint8ClampedArray([10, 11, 12, 13, 14, 15, 16, 18, 19]), ]; const gpu = new GPU({ mode }); - const kernel = gpu.createKernel(function(packed) { - return packed[this.thread.y][this.thread.x]; - }, { - output: [9, 2], - precision: 'unsigned' - }); + const kernel = gpu.createKernel( + function (packed) { + return packed[this.thread.y][this.thread.x]; + }, + { + output: [9, 2], + precision: 'unsigned', + } + ); const result = kernel(original); - assert.deepEqual(result.map(array => Array.from(array)), original.map(array => Array.from(array))); + assert.deepEqual( + result.map(array => Array.from(array)), + original.map(array => Array.from(array)) + ); gpu.destroy(); } -(GPU.isKernelMapSupported ? test : skip)('with Uint8ClampedArray2D auto', () => { - unsignedPrecisionTexturesWithUint8ClampedArray2D(); -}); +(GPU.isKernelMapSupported ? test : skip)( + 'with Uint8ClampedArray2D auto', + () => { + unsignedPrecisionTexturesWithUint8ClampedArray2D(); + } +); test('with Uint8ClampedArray2D cpu', () => { unsignedPrecisionTexturesWithUint8ClampedArray2D('cpu'); }); -(GPU.isKernelMapSupported ? test : skip)('with Uint8ClampedArray2D gpu', () => { - unsignedPrecisionTexturesWithUint8ClampedArray2D('gpu'); -}); - -(GPU.isWebGLSupported && GPU.isKernelMapSupported ? test : skip)('with Uint8ClampedArray2D webgl', () => { - unsignedPrecisionTexturesWithUint8ClampedArray2D('webgl'); -}); - -(GPU.isWebGL2Supported ? test : skip)('with Uint8ClampedArray2D webgl2', () => { - unsignedPrecisionTexturesWithUint8ClampedArray2D('webgl2'); -}); - -(GPU.isHeadlessGLSupported && GPU.isKernelMapSupported ? test : skip)('with Uint8ClampedArray2D headlessgl', () => { - unsignedPrecisionTexturesWithUint8ClampedArray2D('headlessgl'); -}); +(GPU.isKernelMapSupported ? test : skip)( + 'with Uint8ClampedArray2D gpu', + () => { + unsignedPrecisionTexturesWithUint8ClampedArray2D('gpu'); + } +); + +(GPU.isWebGLSupported && GPU.isKernelMapSupported ? test : skip)( + 'with Uint8ClampedArray2D webgl', + () => { + unsignedPrecisionTexturesWithUint8ClampedArray2D('webgl'); + } +); + +(GPU.isWebGL2Supported ? test : skip)( + 'with Uint8ClampedArray2D webgl2', + () => { + unsignedPrecisionTexturesWithUint8ClampedArray2D('webgl2'); + } +); + +(GPU.isHeadlessGLSupported && GPU.isKernelMapSupported ? test : skip)( + 'with Uint8ClampedArray2D headlessgl', + () => { + unsignedPrecisionTexturesWithUint8ClampedArray2D('headlessgl'); + } +); function unsignedPrecisionTexturesWithArray3D(mode) { const original = [ @@ -417,18 +531,24 @@ function unsignedPrecisionTexturesWithArray3D(mode) { [ [20, 21, 22, 23, 24, 25, 26, 27, 28], [29, 30, 31, 32, 33, 34, 35, 36, 37], - ] + ], ]; const gpu = new GPU({ mode }); - const kernel = gpu.createKernel(function(packed) { - return packed[this.thread.z][this.thread.y][this.thread.x]; - }, { - output: [9, 2, 2], - precision: 'unsigned' - }); + const kernel = gpu.createKernel( + function (packed) { + return packed[this.thread.z][this.thread.y][this.thread.x]; + }, + { + output: [9, 2, 2], + precision: 'unsigned', + } + ); const result = kernel(original); - assert.deepEqual(result.map(matrix => matrix.map(array => Array.from(array))), original); + assert.deepEqual( + result.map(matrix => matrix.map(array => Array.from(array))), + original + ); gpu.destroy(); } @@ -444,17 +564,23 @@ test('with Array3D cpu', () => { unsignedPrecisionTexturesWithArray3D('gpu'); }); -(GPU.isWebGLSupported && GPU.isKernelMapSupported ? test : skip)('with Array3D webgl', () => { - unsignedPrecisionTexturesWithArray3D('webgl'); -}); +(GPU.isWebGLSupported && GPU.isKernelMapSupported ? test : skip)( + 'with Array3D webgl', + () => { + unsignedPrecisionTexturesWithArray3D('webgl'); + } +); (GPU.isWebGL2Supported ? test : skip)('with Array3D webgl2', () => { unsignedPrecisionTexturesWithArray3D('webgl2'); }); -(GPU.isHeadlessGLSupported && GPU.isKernelMapSupported ? test : skip)('with Array3D headlessgl', () => { - unsignedPrecisionTexturesWithArray3D('headlessgl'); -}); +(GPU.isHeadlessGLSupported && GPU.isKernelMapSupported ? test : skip)( + 'with Array3D headlessgl', + () => { + unsignedPrecisionTexturesWithArray3D('headlessgl'); + } +); function unsignedPrecisionTexturesWithFloat32Array3D(mode) { const original = [ @@ -465,18 +591,24 @@ function unsignedPrecisionTexturesWithFloat32Array3D(mode) { [ new Float32Array([20, 21, 22, 23, 24, 25, 26, 27, 28]), new Float32Array([29, 30, 31, 32, 33, 34, 35, 36, 37]), - ] + ], ]; const gpu = new GPU({ mode }); - const kernel = gpu.createKernel(function(packed) { - return packed[this.thread.z][this.thread.y][this.thread.x]; - }, { - output: [9, 2, 2], - precision: 'unsigned' - }); + const kernel = gpu.createKernel( + function (packed) { + return packed[this.thread.z][this.thread.y][this.thread.x]; + }, + { + output: [9, 2, 2], + precision: 'unsigned', + } + ); const result = kernel(original); - assert.deepEqual(result.map(matrix => matrix.map(array => Array.from(array))), original.map(matrix => matrix.map(array => Array.from(array)))); + assert.deepEqual( + result.map(matrix => matrix.map(array => Array.from(array))), + original.map(matrix => matrix.map(array => Array.from(array))) + ); gpu.destroy(); } @@ -492,17 +624,23 @@ test('with Float32Array3D cpu', () => { unsignedPrecisionTexturesWithFloat32Array3D('gpu'); }); -(GPU.isWebGLSupported && GPU.isKernelMapSupported ? test : skip)('with Float32Array3D webgl', () => { - unsignedPrecisionTexturesWithFloat32Array3D('webgl'); -}); +(GPU.isWebGLSupported && GPU.isKernelMapSupported ? test : skip)( + 'with Float32Array3D webgl', + () => { + unsignedPrecisionTexturesWithFloat32Array3D('webgl'); + } +); (GPU.isWebGL2Supported ? test : skip)('with Float32Array3D webgl2', () => { unsignedPrecisionTexturesWithFloat32Array3D('webgl2'); }); -(GPU.isHeadlessGLSupported && GPU.isKernelMapSupported ? test : skip)('with Float32Array3D headlessgl', () => { - unsignedPrecisionTexturesWithFloat32Array3D('headlessgl'); -}); +(GPU.isHeadlessGLSupported && GPU.isKernelMapSupported ? test : skip)( + 'with Float32Array3D headlessgl', + () => { + unsignedPrecisionTexturesWithFloat32Array3D('headlessgl'); + } +); function unsignedPrecisionTexturesWithUint16Array3D(mode) { const original = [ @@ -513,18 +651,24 @@ function unsignedPrecisionTexturesWithUint16Array3D(mode) { [ new Uint16Array([20, 21, 22, 23, 24, 25, 26, 27, 28]), new Uint16Array([29, 30, 31, 32, 33, 34, 35, 36, 37]), - ] + ], ]; const gpu = new GPU({ mode }); - const kernel = gpu.createKernel(function(packed) { - return packed[this.thread.z][this.thread.y][this.thread.x]; - }, { - output: [9, 2, 2], - precision: 'unsigned' - }); + const kernel = gpu.createKernel( + function (packed) { + return packed[this.thread.z][this.thread.y][this.thread.x]; + }, + { + output: [9, 2, 2], + precision: 'unsigned', + } + ); const result = kernel(original); - assert.deepEqual(result.map(matrix => matrix.map(array => Array.from(array))), original.map(matrix => matrix.map(array => Array.from(array)))); + assert.deepEqual( + result.map(matrix => matrix.map(array => Array.from(array))), + original.map(matrix => matrix.map(array => Array.from(array))) + ); gpu.destroy(); } @@ -540,17 +684,23 @@ test('with Uint16Array3D cpu', () => { unsignedPrecisionTexturesWithUint16Array3D('gpu'); }); -(GPU.isWebGLSupported && GPU.isKernelMapSupported ? test : skip)('with Uint16Array3D webgl', () => { - unsignedPrecisionTexturesWithUint16Array3D('webgl'); -}); +(GPU.isWebGLSupported && GPU.isKernelMapSupported ? test : skip)( + 'with Uint16Array3D webgl', + () => { + unsignedPrecisionTexturesWithUint16Array3D('webgl'); + } +); (GPU.isWebGL2Supported ? test : skip)('with Uint16Array3D webgl2', () => { unsignedPrecisionTexturesWithUint16Array3D('webgl2'); }); -(GPU.isHeadlessGLSupported && GPU.isKernelMapSupported ? test : skip)('with Uint16Array3D headlessgl', () => { - unsignedPrecisionTexturesWithUint16Array3D('headlessgl'); -}); +(GPU.isHeadlessGLSupported && GPU.isKernelMapSupported ? test : skip)( + 'with Uint16Array3D headlessgl', + () => { + unsignedPrecisionTexturesWithUint16Array3D('headlessgl'); + } +); function unsignedPrecisionTexturesWithUint8Array3D(mode) { const original = [ @@ -561,18 +711,24 @@ function unsignedPrecisionTexturesWithUint8Array3D(mode) { [ new Uint8Array([20, 21, 22, 23, 24, 25, 26, 27, 28]), new Uint8Array([29, 30, 31, 32, 33, 34, 35, 36, 37]), - ] + ], ]; const gpu = new GPU({ mode }); - const kernel = gpu.createKernel(function(packed) { - return packed[this.thread.z][this.thread.y][this.thread.x]; - }, { - output: [9, 2, 2], - precision: 'unsigned' - }); + const kernel = gpu.createKernel( + function (packed) { + return packed[this.thread.z][this.thread.y][this.thread.x]; + }, + { + output: [9, 2, 2], + precision: 'unsigned', + } + ); const result = kernel(original); - assert.deepEqual(result.map(matrix => matrix.map(array => Array.from(array))), original.map(matrix => matrix.map(array => Array.from(array)))); + assert.deepEqual( + result.map(matrix => matrix.map(array => Array.from(array))), + original.map(matrix => matrix.map(array => Array.from(array))) + ); gpu.destroy(); } @@ -588,17 +744,23 @@ test('with Uint8Array3D cpu', () => { unsignedPrecisionTexturesWithUint8Array3D('gpu'); }); -(GPU.isWebGLSupported && GPU.isKernelMapSupported ? test : skip)('with Uint8Array3D webgl', () => { - unsignedPrecisionTexturesWithUint8Array3D('webgl'); -}); +(GPU.isWebGLSupported && GPU.isKernelMapSupported ? test : skip)( + 'with Uint8Array3D webgl', + () => { + unsignedPrecisionTexturesWithUint8Array3D('webgl'); + } +); (GPU.isWebGL2Supported ? test : skip)('with Uint8Array3D webgl2', () => { unsignedPrecisionTexturesWithUint8Array3D('webgl2'); }); -(GPU.isHeadlessGLSupported && GPU.isKernelMapSupported ? test : skip)('with Uint8Array3D headlessgl', () => { - unsignedPrecisionTexturesWithUint8Array3D('headlessgl'); -}); +(GPU.isHeadlessGLSupported && GPU.isKernelMapSupported ? test : skip)( + 'with Uint8Array3D headlessgl', + () => { + unsignedPrecisionTexturesWithUint8Array3D('headlessgl'); + } +); function unsignedPrecisionTexturesWithUint8ClampedArray3D(mode) { const original = [ @@ -609,55 +771,79 @@ function unsignedPrecisionTexturesWithUint8ClampedArray3D(mode) { [ new Uint8ClampedArray([20, 21, 22, 23, 24, 25, 26, 27, 28]), new Uint8ClampedArray([29, 30, 31, 32, 33, 34, 35, 36, 37]), - ] + ], ]; const gpu = new GPU({ mode }); - const kernel = gpu.createKernel(function(packed) { - return packed[this.thread.z][this.thread.y][this.thread.x]; - }, { - output: [9, 2, 2], - precision: 'unsigned' - }); + const kernel = gpu.createKernel( + function (packed) { + return packed[this.thread.z][this.thread.y][this.thread.x]; + }, + { + output: [9, 2, 2], + precision: 'unsigned', + } + ); const result = kernel(original); - assert.deepEqual(result.map(matrix => matrix.map(array => Array.from(array))), original.map(matrix => matrix.map(array => Array.from(array)))); + assert.deepEqual( + result.map(matrix => matrix.map(array => Array.from(array))), + original.map(matrix => matrix.map(array => Array.from(array))) + ); gpu.destroy(); } -(GPU.isKernelMapSupported ? test : skip)('with Uint8ClampedArray3D auto', () => { - unsignedPrecisionTexturesWithUint8ClampedArray3D(); -}); +(GPU.isKernelMapSupported ? test : skip)( + 'with Uint8ClampedArray3D auto', + () => { + unsignedPrecisionTexturesWithUint8ClampedArray3D(); + } +); test('with Uint8ClampedArray3D cpu', () => { unsignedPrecisionTexturesWithUint8ClampedArray3D('cpu'); }); -(GPU.isKernelMapSupported ? test : skip)('with Uint8ClampedArray3D gpu', () => { - unsignedPrecisionTexturesWithUint8ClampedArray3D('gpu'); -}); - -(GPU.isWebGLSupported && GPU.isKernelMapSupported ? test : skip)('with Uint8ClampedArray3D webgl', () => { - unsignedPrecisionTexturesWithUint8ClampedArray3D('webgl'); -}); - -(GPU.isWebGL2Supported ? test : skip)('with Uint8ClampedArray3D webgl2', () => { - unsignedPrecisionTexturesWithUint8ClampedArray3D('webgl2'); -}); - -(GPU.isHeadlessGLSupported && GPU.isKernelMapSupported ? test : skip)('with Uint8ClampedArray3D headlessgl', () => { - unsignedPrecisionTexturesWithUint8ClampedArray3D('headlessgl'); -}); +(GPU.isKernelMapSupported ? test : skip)( + 'with Uint8ClampedArray3D gpu', + () => { + unsignedPrecisionTexturesWithUint8ClampedArray3D('gpu'); + } +); + +(GPU.isWebGLSupported && GPU.isKernelMapSupported ? test : skip)( + 'with Uint8ClampedArray3D webgl', + () => { + unsignedPrecisionTexturesWithUint8ClampedArray3D('webgl'); + } +); + +(GPU.isWebGL2Supported ? test : skip)( + 'with Uint8ClampedArray3D webgl2', + () => { + unsignedPrecisionTexturesWithUint8ClampedArray3D('webgl2'); + } +); + +(GPU.isHeadlessGLSupported && GPU.isKernelMapSupported ? test : skip)( + 'with Uint8ClampedArray3D headlessgl', + () => { + unsignedPrecisionTexturesWithUint8ClampedArray3D('headlessgl'); + } +); function testImmutableDoesNotCollideWithKernelTexture(mode) { const gpu = new GPU({ mode }); - const kernel = gpu.createKernel(function(v) { - return v[this.thread.x] + 1; - }, { - output: [1], - precision: 'unsigned', - pipeline: true, - immutable: true, - }); + const kernel = gpu.createKernel( + function (v) { + return v[this.thread.x] + 1; + }, + { + output: [1], + precision: 'unsigned', + pipeline: true, + immutable: true, + } + ); const v = [1]; const result1 = kernel(v); assert.deepEqual(result1.toArray(), new Float32Array([2])); @@ -678,14 +864,23 @@ test('immutable does not collide with kernel texture gpu', () => { testImmutableDoesNotCollideWithKernelTexture('gpu'); }); -(GPU.isWebGLSupported ? test : skip)('immutable does not collide with kernel texture webgl', () => { - testImmutableDoesNotCollideWithKernelTexture('webgl'); -}); - -(GPU.isWebGL2Supported ? test : skip)('immutable does not collide with kernel texture webgl2', () => { - testImmutableDoesNotCollideWithKernelTexture('webgl2'); -}); - -(GPU.isHeadlessGLSupported ? test : skip)('immutable does not collide with kernel texture headlessgl', () => { - testImmutableDoesNotCollideWithKernelTexture('headlessgl'); -}); +(GPU.isWebGLSupported ? test : skip)( + 'immutable does not collide with kernel texture webgl', + () => { + testImmutableDoesNotCollideWithKernelTexture('webgl'); + } +); + +(GPU.isWebGL2Supported ? test : skip)( + 'immutable does not collide with kernel texture webgl2', + () => { + testImmutableDoesNotCollideWithKernelTexture('webgl2'); + } +); + +(GPU.isHeadlessGLSupported ? test : skip)( + 'immutable does not collide with kernel texture headlessgl', + () => { + testImmutableDoesNotCollideWithKernelTexture('headlessgl'); + } +); diff --git a/test/features/video.js b/test/features/video.js index d6474861..579ffcf3 100644 --- a/test/features/video.js +++ b/test/features/video.js @@ -1,20 +1,24 @@ const { assert, skip, test, module: describe } = require('qunit'); -const { GPU } = require('../../src'); +const { GPU } = require('../..'); describe('video'); + function videoArgumentTest(mode, done) { const video = document.createElement('video'); video.src = 'jellyfish.webm'; setTimeout(() => { - const gpu = new GPU({mode}); - const videoKernel = gpu.createKernel(function (a) { - const pixel = a[this.thread.y][this.thread.x]; - return pixel.g * 255; - }, { - output: [200], - precision: 'unsigned', - argumentTypes: ['HTMLVideo'], - }); + const gpu = new GPU({ mode }); + const videoKernel = gpu.createKernel( + function (a) { + const pixel = a[this.thread.y][this.thread.x]; + return pixel.g * 255; + }, + { + output: [200], + precision: 'unsigned', + argumentTypes: ['HTMLVideo'], + } + ); const pixelResult = videoKernel(video)[0]; // CPU captures a bit different of a color assert.ok(pixelResult <= 127 && pixelResult >= 121); @@ -24,22 +28,35 @@ function videoArgumentTest(mode, done) { }, 1000); } -(typeof HTMLVideoElement !== 'undefined' ? test : skip)('video argument auto', t => { - videoArgumentTest(null, t.async()); -}); +(typeof HTMLVideoElement !== 'undefined' ? test : skip)( + 'video argument auto', + t => { + videoArgumentTest(null, t.async()); + } +); -(typeof HTMLVideoElement !== 'undefined' ? test : skip)('video argument gpu', t => { - videoArgumentTest('gpu', t.async()); -}); +(typeof HTMLVideoElement !== 'undefined' ? test : skip)( + 'video argument gpu', + t => { + videoArgumentTest('gpu', t.async()); + } +); -(GPU.isWebGLSupported && typeof HTMLVideoElement !== 'undefined' ? test : skip)('video argument webgl', t => { +(GPU.isWebGLSupported && typeof HTMLVideoElement !== 'undefined' + ? test + : skip)('video argument webgl', t => { videoArgumentTest('webgl', t.async()); }); -(GPU.isWebGL2Supported && typeof HTMLVideoElement !== 'undefined' ? test : skip)('video argument webgl2', t => { +(GPU.isWebGL2Supported && typeof HTMLVideoElement !== 'undefined' + ? test + : skip)('video argument webgl2', t => { videoArgumentTest('webgl2', t.async()); }); -(typeof HTMLVideoElement !== 'undefined' ? test : skip)('video argument cpu', t => { - videoArgumentTest('cpu', t.async()); -}); +(typeof HTMLVideoElement !== 'undefined' ? test : skip)( + 'video argument cpu', + t => { + videoArgumentTest('cpu', t.async()); + } +); diff --git a/test/index.js b/test/index.js index d24b5b6a..c1a4e707 100644 --- a/test/index.js +++ b/test/index.js @@ -1,15 +1,17 @@ const { expect } = require('chai'); -const GPU = require('../src/index.js'); +const GPU = require('..'); describe('Test Node GPU', () => { describe('gpu mode', () => { it('should find and use gpu runner', () => { const gpu = new GPU({ mode: 'gpu' }); - const kernel = gpu.createKernel(function() { - return 1; - }).setOutput([1]); + const kernel = gpu + .createKernel(function () { + return 1; + }) + .setOutput([1]); const result = kernel(); @@ -20,19 +22,19 @@ describe('Test Node GPU', () => { it('supports 2x2 size', () => { const gpu = new GPU({ mode: 'gpu' }); - const kernel = gpu.createKernel(function() { - return this.thread.x * this.thread.y; - }).setOutput([2, 2]); + const kernel = gpu + .createKernel(function () { + return this.thread.x * this.thread.y; + }) + .setOutput([2, 2]); const result = kernel(); expect(gpu.runner.constructor).to.equal(GPU.HeadlessGLRunner); - expect(result).to.deep.equal( - [ - Float32Array.from([0,0]), - Float32Array.from([0,1]) - ] - ); + expect(result).to.deep.equal([ + Float32Array.from([0, 0]), + Float32Array.from([0, 1]), + ]); }); }); @@ -40,9 +42,11 @@ describe('Test Node GPU', () => { it('should find and use gpu runner', () => { const gpu = new GPU({ mode: 'cpu' }); - const kernel = gpu.createKernel(function() { - return 1; - }).setOutput([1]); + const kernel = gpu + .createKernel(function () { + return 1; + }) + .setOutput([1]); const result = kernel(); @@ -53,20 +57,19 @@ describe('Test Node GPU', () => { it('supports 2x2 size', () => { const gpu = new GPU({ mode: 'cpu' }); - const kernel = gpu.createKernel(function() { - return this.thread.x * this.thread.y; - }).setOutput([2, 2]); + const kernel = gpu + .createKernel(function () { + return this.thread.x * this.thread.y; + }) + .setOutput([2, 2]); const result = kernel(); expect(gpu.runner.constructor).to.equal(GPU.CPURunner); - expect(result).to.deep.equal( - [ - Float32Array.from([0,0]), - Float32Array.from([0,1]) - ] - ); + expect(result).to.deep.equal([ + Float32Array.from([0, 0]), + Float32Array.from([0, 1]), + ]); }); }); }); - diff --git a/test/internal/argument-texture-switching.js b/test/internal/argument-texture-switching.js index eb5a1f8b..ae565919 100644 --- a/test/internal/argument-texture-switching.js +++ b/test/internal/argument-texture-switching.js @@ -1,20 +1,22 @@ const { assert, skip, test, module: describe, only } = require('qunit'); -const { GPU } = require('../../src'); +const { GPU } = require('../..'); describe('internal: argument texture switching'); function testArrayWithoutTypeDefined(mode) { const gpu = new GPU({ mode }); - const texture = ( - gpu.createKernel(function() { return this.thread.x; }) - .setOutput([10]) - .setPipeline(true) - .setPrecision('single') - )(); + const texture = gpu + .createKernel(function () { + return this.thread.x; + }) + .setOutput([10]) + .setPipeline(true) + .setPrecision('single')(); const expected = texture.toArray(); - const kernel = gpu.createKernel(function(value) { - return value[this.thread.x]; - }) + const kernel = gpu + .createKernel(function (value) { + return value[this.thread.x]; + }) .setOutput([10]) .setPipeline(false) .setPrecision('single'); @@ -26,40 +28,57 @@ function testArrayWithoutTypeDefined(mode) { gpu.destroy(); } -(GPU.isSinglePrecisionSupported ? test : skip)('Array without type defined (GPU only) auto', () => { - testArrayWithoutTypeDefined(); -}); - -(GPU.isSinglePrecisionSupported ? test : skip)('Array without type defined (GPU only) gpu', () => { - testArrayWithoutTypeDefined('gpu'); -}); - -(GPU.isSinglePrecisionSupported && GPU.isWebGLSupported ? test : skip)('Array without type defined (GPU only) webgl', () => { - testArrayWithoutTypeDefined('webgl'); -}); - -(GPU.isSinglePrecisionSupported && GPU.isWebGL2Supported ? test : skip)('Array without type defined (GPU only) webgl2', () => { - testArrayWithoutTypeDefined('webgl2'); -}); - -(GPU.isSinglePrecisionSupported && GPU.isHeadlessGLSupported ? test : skip)('Array without type defined (GPU only) headlessgl', () => { - testArrayWithoutTypeDefined('headlessgl'); -}); +(GPU.isSinglePrecisionSupported ? test : skip)( + 'Array without type defined (GPU only) auto', + () => { + testArrayWithoutTypeDefined(); + } +); + +(GPU.isSinglePrecisionSupported ? test : skip)( + 'Array without type defined (GPU only) gpu', + () => { + testArrayWithoutTypeDefined('gpu'); + } +); + +(GPU.isSinglePrecisionSupported && GPU.isWebGLSupported ? test : skip)( + 'Array without type defined (GPU only) webgl', + () => { + testArrayWithoutTypeDefined('webgl'); + } +); + +(GPU.isSinglePrecisionSupported && GPU.isWebGL2Supported ? test : skip)( + 'Array without type defined (GPU only) webgl2', + () => { + testArrayWithoutTypeDefined('webgl2'); + } +); + +(GPU.isSinglePrecisionSupported && GPU.isHeadlessGLSupported ? test : skip)( + 'Array without type defined (GPU only) headlessgl', + () => { + testArrayWithoutTypeDefined('headlessgl'); + } +); function testArrayWithTypeDefined(mode) { const gpu = new GPU({ mode }); - const texture = ( - gpu.createKernel(function() { return this.thread.x; }) - .setOutput([10]) - .setPipeline(true) - .setPrecision('single') - )(); + const texture = gpu + .createKernel(function () { + return this.thread.x; + }) + .setOutput([10]) + .setPipeline(true) + .setPrecision('single')(); const expected = texture.toArray(); - const kernel = gpu.createKernel(function(value) { - return value[this.thread.x]; - }) + const kernel = gpu + .createKernel(function (value) { + return value[this.thread.x]; + }) .setArgumentTypes({ - value: 'Array' + value: 'Array', }) .setOutput([10]) .setPipeline(false) @@ -72,40 +91,57 @@ function testArrayWithTypeDefined(mode) { gpu.destroy(); } -(GPU.isSinglePrecisionSupported ? test : skip)('Array with type defined (GPU only) auto', () => { - testArrayWithTypeDefined(); -}); - -(GPU.isSinglePrecisionSupported ? test : skip)('Array with type defined (GPU only) gpu', () => { - testArrayWithTypeDefined('gpu'); -}); - -(GPU.isSinglePrecisionSupported && GPU.isWebGLSupported ? test : skip)('Array with type defined (GPU only) webgl', () => { - testArrayWithTypeDefined('webgl'); -}); - -(GPU.isSinglePrecisionSupported && GPU.isWebGL2Supported ? test : skip)('Array with type defined (GPU only) webgl2', () => { - testArrayWithTypeDefined('webgl2'); -}); - -(GPU.isSinglePrecisionSupported && GPU.isHeadlessGLSupported ? test : skip)('Array with type defined (GPU only) headlessgl', () => { - testArrayWithTypeDefined('headlessgl'); -}); +(GPU.isSinglePrecisionSupported ? test : skip)( + 'Array with type defined (GPU only) auto', + () => { + testArrayWithTypeDefined(); + } +); + +(GPU.isSinglePrecisionSupported ? test : skip)( + 'Array with type defined (GPU only) gpu', + () => { + testArrayWithTypeDefined('gpu'); + } +); + +(GPU.isSinglePrecisionSupported && GPU.isWebGLSupported ? test : skip)( + 'Array with type defined (GPU only) webgl', + () => { + testArrayWithTypeDefined('webgl'); + } +); + +(GPU.isSinglePrecisionSupported && GPU.isWebGL2Supported ? test : skip)( + 'Array with type defined (GPU only) webgl2', + () => { + testArrayWithTypeDefined('webgl2'); + } +); + +(GPU.isSinglePrecisionSupported && GPU.isHeadlessGLSupported ? test : skip)( + 'Array with type defined (GPU only) headlessgl', + () => { + testArrayWithTypeDefined('headlessgl'); + } +); function testArray1D2(mode) { const gpu = new GPU({ mode }); - const texture = ( - gpu.createKernel(function() { return [this.thread.x, this.thread.x + 1]; }) - .setOutput([10]) - .setPipeline(true) - .setPrecision('single') - )(); + const texture = gpu + .createKernel(function () { + return [this.thread.x, this.thread.x + 1]; + }) + .setOutput([10]) + .setPipeline(true) + .setPrecision('single')(); const expected = texture.toArray(); - const kernel = gpu.createKernel(function(value) { - return value[this.thread.x]; - }) + const kernel = gpu + .createKernel(function (value) { + return value[this.thread.x]; + }) .setArgumentTypes({ - value: 'Array1D(2)' + value: 'Array1D(2)', }) .setOutput([10]) .setPipeline(false) @@ -118,40 +154,57 @@ function testArray1D2(mode) { gpu.destroy(); } -(GPU.isSinglePrecisionSupported ? test : skip)('Array1D(2) (GPU only) auto', () => { - testArray1D2(); -}); - -(GPU.isSinglePrecisionSupported ? test : skip)('Array1D(2) (GPU only) gpu', () => { - testArray1D2('gpu'); -}); - -(GPU.isSinglePrecisionSupported && GPU.isWebGLSupported ? test : skip)('Array1D(2) (GPU only) webgl', () => { - testArray1D2('webgl'); -}); - -(GPU.isSinglePrecisionSupported && GPU.isWebGL2Supported ? test : skip)('Array1D(2) (GPU only) webgl2', () => { - testArray1D2('webgl2'); -}); - -(GPU.isSinglePrecisionSupported && GPU.isHeadlessGLSupported ? test : skip)('Array1D(2) (GPU only) headlessgl', () => { - testArray1D2('headlessgl'); -}); +(GPU.isSinglePrecisionSupported ? test : skip)( + 'Array1D(2) (GPU only) auto', + () => { + testArray1D2(); + } +); + +(GPU.isSinglePrecisionSupported ? test : skip)( + 'Array1D(2) (GPU only) gpu', + () => { + testArray1D2('gpu'); + } +); + +(GPU.isSinglePrecisionSupported && GPU.isWebGLSupported ? test : skip)( + 'Array1D(2) (GPU only) webgl', + () => { + testArray1D2('webgl'); + } +); + +(GPU.isSinglePrecisionSupported && GPU.isWebGL2Supported ? test : skip)( + 'Array1D(2) (GPU only) webgl2', + () => { + testArray1D2('webgl2'); + } +); + +(GPU.isSinglePrecisionSupported && GPU.isHeadlessGLSupported ? test : skip)( + 'Array1D(2) (GPU only) headlessgl', + () => { + testArray1D2('headlessgl'); + } +); function testArray1D3(mode) { const gpu = new GPU({ mode }); - const texture = ( - gpu.createKernel(function() { return [this.thread.x, this.thread.x + 1, this.thread.x + 2]; }) - .setOutput([10]) - .setPipeline(true) - .setPrecision('single') - )(); + const texture = gpu + .createKernel(function () { + return [this.thread.x, this.thread.x + 1, this.thread.x + 2]; + }) + .setOutput([10]) + .setPipeline(true) + .setPrecision('single')(); const expected = texture.toArray(); - const kernel = gpu.createKernel(function(value) { - return value[this.thread.x]; - }) + const kernel = gpu + .createKernel(function (value) { + return value[this.thread.x]; + }) .setArgumentTypes({ - value: 'Array1D(3)' + value: 'Array1D(3)', }) .setOutput([10]) .setPipeline(false) @@ -164,40 +217,62 @@ function testArray1D3(mode) { gpu.destroy(); } -(GPU.isSinglePrecisionSupported ? test : skip)('Array1D(3) (GPU only) auto', () => { - testArray1D3(); -}); - -(GPU.isSinglePrecisionSupported ? test : skip)('Array1D(3) (GPU only) gpu', () => { - testArray1D3('gpu'); -}); - -(GPU.isSinglePrecisionSupported && GPU.isWebGLSupported ? test : skip)('Array1D(3) (GPU only) webgl', () => { - testArray1D3('webgl'); -}); - -(GPU.isSinglePrecisionSupported && GPU.isWebGL2Supported ? test : skip)('Array1D(3) (GPU only) webgl2', () => { - testArray1D3('webgl2'); -}); - -(GPU.isSinglePrecisionSupported && GPU.isHeadlessGLSupported ? test : skip)('Array1D(3) (GPU only) headlessgl', () => { - testArray1D3('headlessgl'); -}); +(GPU.isSinglePrecisionSupported ? test : skip)( + 'Array1D(3) (GPU only) auto', + () => { + testArray1D3(); + } +); + +(GPU.isSinglePrecisionSupported ? test : skip)( + 'Array1D(3) (GPU only) gpu', + () => { + testArray1D3('gpu'); + } +); + +(GPU.isSinglePrecisionSupported && GPU.isWebGLSupported ? test : skip)( + 'Array1D(3) (GPU only) webgl', + () => { + testArray1D3('webgl'); + } +); + +(GPU.isSinglePrecisionSupported && GPU.isWebGL2Supported ? test : skip)( + 'Array1D(3) (GPU only) webgl2', + () => { + testArray1D3('webgl2'); + } +); + +(GPU.isSinglePrecisionSupported && GPU.isHeadlessGLSupported ? test : skip)( + 'Array1D(3) (GPU only) headlessgl', + () => { + testArray1D3('headlessgl'); + } +); function testArray1D4(mode) { const gpu = new GPU({ mode }); - const texture = ( - gpu.createKernel(function() { return [this.thread.x, this.thread.x + 1, this.thread.x + 2, this.thread.x + 3]; }) - .setOutput([10]) - .setPipeline(true) - .setPrecision('single') - )(); + const texture = gpu + .createKernel(function () { + return [ + this.thread.x, + this.thread.x + 1, + this.thread.x + 2, + this.thread.x + 3, + ]; + }) + .setOutput([10]) + .setPipeline(true) + .setPrecision('single')(); const expected = texture.toArray(); - const kernel = gpu.createKernel(function(value) { - return value[this.thread.x]; - }) + const kernel = gpu + .createKernel(function (value) { + return value[this.thread.x]; + }) .setArgumentTypes({ - value: 'Array1D(4)' + value: 'Array1D(4)', }) .setOutput([10]) .setPipeline(false) @@ -210,40 +285,57 @@ function testArray1D4(mode) { gpu.destroy(); } -(GPU.isSinglePrecisionSupported ? test : skip)('Array1D(4) (GPU only) auto', () => { - testArray1D4(); -}); - -(GPU.isSinglePrecisionSupported ? test : skip)('Array1D(4) (GPU only) gpu', () => { - testArray1D4('gpu'); -}); - -(GPU.isSinglePrecisionSupported && GPU.isWebGLSupported ? test : skip)('Array1D(4) (GPU only) webgl', () => { - testArray1D4('webgl'); -}); - -(GPU.isSinglePrecisionSupported && GPU.isWebGL2Supported ? test : skip)('Array1D(4) (GPU only) webgl2', () => { - testArray1D4('webgl2'); -}); - -(GPU.isSinglePrecisionSupported && GPU.isHeadlessGLSupported ? test : skip)('Array1D(4) (GPU only) headlessgl', () => { - testArray1D4('headlessgl'); -}); +(GPU.isSinglePrecisionSupported ? test : skip)( + 'Array1D(4) (GPU only) auto', + () => { + testArray1D4(); + } +); + +(GPU.isSinglePrecisionSupported ? test : skip)( + 'Array1D(4) (GPU only) gpu', + () => { + testArray1D4('gpu'); + } +); + +(GPU.isSinglePrecisionSupported && GPU.isWebGLSupported ? test : skip)( + 'Array1D(4) (GPU only) webgl', + () => { + testArray1D4('webgl'); + } +); + +(GPU.isSinglePrecisionSupported && GPU.isWebGL2Supported ? test : skip)( + 'Array1D(4) (GPU only) webgl2', + () => { + testArray1D4('webgl2'); + } +); + +(GPU.isSinglePrecisionSupported && GPU.isHeadlessGLSupported ? test : skip)( + 'Array1D(4) (GPU only) headlessgl', + () => { + testArray1D4('headlessgl'); + } +); function testArray2D2(mode) { const gpu = new GPU({ mode }); - const texture = ( - gpu.createKernel(function() { return [this.thread.x, this.thread.y]; }) - .setOutput([10, 10]) - .setPipeline(true) - .setPrecision('single') - )(); + const texture = gpu + .createKernel(function () { + return [this.thread.x, this.thread.y]; + }) + .setOutput([10, 10]) + .setPipeline(true) + .setPrecision('single')(); const expected = texture.toArray(); - const kernel = gpu.createKernel(function(value) { - return value[this.thread.y][this.thread.x]; - }) + const kernel = gpu + .createKernel(function (value) { + return value[this.thread.y][this.thread.x]; + }) .setArgumentTypes({ - value: 'Array2D(2)' + value: 'Array2D(2)', }) .setOutput([10, 10]) .setPipeline(false) @@ -256,40 +348,57 @@ function testArray2D2(mode) { gpu.destroy(); } -(GPU.isSinglePrecisionSupported ? test : skip)('Array2D(2) (GPU only) auto', () => { - testArray2D2(); -}); - -(GPU.isSinglePrecisionSupported ? test : skip)('Array2D(2) (GPU only) gpu', () => { - testArray2D2('gpu'); -}); - -(GPU.isSinglePrecisionSupported && GPU.isWebGLSupported ? test : skip)('Array2D(2) (GPU only) webgl', () => { - testArray2D2('webgl'); -}); - -(GPU.isSinglePrecisionSupported && GPU.isWebGL2Supported ? test : skip)('Array2D(2) (GPU only) webgl2', () => { - testArray2D2('webgl2'); -}); - -(GPU.isSinglePrecisionSupported && GPU.isHeadlessGLSupported ? test : skip)('Array2D(2) (GPU only) headlessgl', () => { - testArray2D2('headlessgl'); -}); +(GPU.isSinglePrecisionSupported ? test : skip)( + 'Array2D(2) (GPU only) auto', + () => { + testArray2D2(); + } +); + +(GPU.isSinglePrecisionSupported ? test : skip)( + 'Array2D(2) (GPU only) gpu', + () => { + testArray2D2('gpu'); + } +); + +(GPU.isSinglePrecisionSupported && GPU.isWebGLSupported ? test : skip)( + 'Array2D(2) (GPU only) webgl', + () => { + testArray2D2('webgl'); + } +); + +(GPU.isSinglePrecisionSupported && GPU.isWebGL2Supported ? test : skip)( + 'Array2D(2) (GPU only) webgl2', + () => { + testArray2D2('webgl2'); + } +); + +(GPU.isSinglePrecisionSupported && GPU.isHeadlessGLSupported ? test : skip)( + 'Array2D(2) (GPU only) headlessgl', + () => { + testArray2D2('headlessgl'); + } +); function testArray2D3(mode) { const gpu = new GPU({ mode }); - const texture = ( - gpu.createKernel(function() { return [this.thread.x, this.thread.y, this.thread.x * this.thread.y]; }) - .setOutput([10, 10]) - .setPipeline(true) - .setPrecision('single') - )(); + const texture = gpu + .createKernel(function () { + return [this.thread.x, this.thread.y, this.thread.x * this.thread.y]; + }) + .setOutput([10, 10]) + .setPipeline(true) + .setPrecision('single')(); const expected = texture.toArray(); - const kernel = gpu.createKernel(function(value) { - return value[this.thread.y][this.thread.x]; - }) + const kernel = gpu + .createKernel(function (value) { + return value[this.thread.y][this.thread.x]; + }) .setArgumentTypes({ - value: 'Array2D(3)' + value: 'Array2D(3)', }) .setOutput([10, 10]) .setPipeline(false) @@ -302,47 +411,62 @@ function testArray2D3(mode) { gpu.destroy(); } -(GPU.isSinglePrecisionSupported ? test : skip)('Array2D(3) (GPU only) auto', () => { - testArray2D3(); -}); - -(GPU.isSinglePrecisionSupported ? test : skip)('Array1D(3) (GPU only) gpu', () => { - testArray2D3('gpu'); -}); - -(GPU.isSinglePrecisionSupported && GPU.isWebGLSupported ? test : skip)('Array2D(3) (GPU only) webgl', () => { - testArray2D3('webgl'); -}); - -(GPU.isSinglePrecisionSupported && GPU.isWebGL2Supported ? test : skip)('Array2D(3) (GPU only) webgl2', () => { - testArray2D3('webgl2'); -}); - -(GPU.isSinglePrecisionSupported && GPU.isHeadlessGLSupported ? test : skip)('Array2D(3) (GPU only) headlessgl', () => { - testArray2D3('headlessgl'); -}); +(GPU.isSinglePrecisionSupported ? test : skip)( + 'Array2D(3) (GPU only) auto', + () => { + testArray2D3(); + } +); + +(GPU.isSinglePrecisionSupported ? test : skip)( + 'Array1D(3) (GPU only) gpu', + () => { + testArray2D3('gpu'); + } +); + +(GPU.isSinglePrecisionSupported && GPU.isWebGLSupported ? test : skip)( + 'Array2D(3) (GPU only) webgl', + () => { + testArray2D3('webgl'); + } +); + +(GPU.isSinglePrecisionSupported && GPU.isWebGL2Supported ? test : skip)( + 'Array2D(3) (GPU only) webgl2', + () => { + testArray2D3('webgl2'); + } +); + +(GPU.isSinglePrecisionSupported && GPU.isHeadlessGLSupported ? test : skip)( + 'Array2D(3) (GPU only) headlessgl', + () => { + testArray2D3('headlessgl'); + } +); function testArray2D4(mode) { const gpu = new GPU({ mode }); - const texture = ( - gpu.createKernel(function() { + const texture = gpu + .createKernel(function () { return [ this.thread.x, this.thread.y, this.thread.x * this.thread.y, - this.thread.x / this.thread.y + this.thread.x / this.thread.y, ]; }) - .setOutput([10, 10]) - .setPipeline(true) - .setPrecision('single') - )(); + .setOutput([10, 10]) + .setPipeline(true) + .setPrecision('single')(); const expected = texture.toArray(); - const kernel = gpu.createKernel(function(value) { - return value[this.thread.y][this.thread.x]; - }) + const kernel = gpu + .createKernel(function (value) { + return value[this.thread.y][this.thread.x]; + }) .setArgumentTypes({ - value: 'Array2D(4)' + value: 'Array2D(4)', }) .setOutput([10, 10]) .setPipeline(false) @@ -355,40 +479,57 @@ function testArray2D4(mode) { gpu.destroy(); } -(GPU.isSinglePrecisionSupported ? test : skip)('Array2D(4) (GPU only) auto', () => { - testArray2D4(); -}); - -(GPU.isSinglePrecisionSupported ? test : skip)('Array1D(4) (GPU only) gpu', () => { - testArray2D4('gpu'); -}); - -(GPU.isSinglePrecisionSupported && GPU.isWebGLSupported ? test : skip)('Array2D(4) (GPU only) webgl', () => { - testArray2D4('webgl'); -}); - -(GPU.isSinglePrecisionSupported && GPU.isWebGL2Supported ? test : skip)('Array2D(4) (GPU only) webgl2', () => { - testArray2D4('webgl2'); -}); - -(GPU.isSinglePrecisionSupported && GPU.isHeadlessGLSupported ? test : skip)('Array2D(4) (GPU only) headlessgl', () => { - testArray2D4('headlessgl'); -}); +(GPU.isSinglePrecisionSupported ? test : skip)( + 'Array2D(4) (GPU only) auto', + () => { + testArray2D4(); + } +); + +(GPU.isSinglePrecisionSupported ? test : skip)( + 'Array1D(4) (GPU only) gpu', + () => { + testArray2D4('gpu'); + } +); + +(GPU.isSinglePrecisionSupported && GPU.isWebGLSupported ? test : skip)( + 'Array2D(4) (GPU only) webgl', + () => { + testArray2D4('webgl'); + } +); + +(GPU.isSinglePrecisionSupported && GPU.isWebGL2Supported ? test : skip)( + 'Array2D(4) (GPU only) webgl2', + () => { + testArray2D4('webgl2'); + } +); + +(GPU.isSinglePrecisionSupported && GPU.isHeadlessGLSupported ? test : skip)( + 'Array2D(4) (GPU only) headlessgl', + () => { + testArray2D4('headlessgl'); + } +); function testArray3D2(mode) { const gpu = new GPU({ mode }); - const texture = ( - gpu.createKernel(function() { return [this.thread.x, this.thread.x * this.thread.y * this.thread.z]; }) - .setOutput([10, 10, 10]) - .setPipeline(true) - .setPrecision('single') - )(); + const texture = gpu + .createKernel(function () { + return [this.thread.x, this.thread.x * this.thread.y * this.thread.z]; + }) + .setOutput([10, 10, 10]) + .setPipeline(true) + .setPrecision('single')(); const expected = texture.toArray(); - const kernel = gpu.createKernel(function(value) { - return value[this.thread.z][this.thread.y][this.thread.x]; - }) + const kernel = gpu + .createKernel(function (value) { + return value[this.thread.z][this.thread.y][this.thread.x]; + }) .setArgumentTypes({ - value: 'Array3D(2)' + value: 'Array3D(2)', }) .setOutput([10, 10, 10]) .setPipeline(false) @@ -401,40 +542,57 @@ function testArray3D2(mode) { gpu.destroy(); } -(GPU.isSinglePrecisionSupported ? test : skip)('Array3D(2) (GPU only) auto', () => { - testArray3D2(); -}); - -(GPU.isSinglePrecisionSupported ? test : skip)('Array3D(2) (GPU only) gpu', () => { - testArray3D2('gpu'); -}); - -(GPU.isSinglePrecisionSupported && GPU.isWebGLSupported ? test : skip)('Array3D(2) (GPU only) webgl', () => { - testArray3D2('webgl'); -}); - -(GPU.isSinglePrecisionSupported && GPU.isWebGL2Supported ? test : skip)('Array3D(2) (GPU only) webgl2', () => { - testArray3D2('webgl2'); -}); - -(GPU.isSinglePrecisionSupported && GPU.isHeadlessGLSupported ? test : skip)('Array3D(2) (GPU only) headlessgl', () => { - testArray3D2('headlessgl'); -}); +(GPU.isSinglePrecisionSupported ? test : skip)( + 'Array3D(2) (GPU only) auto', + () => { + testArray3D2(); + } +); + +(GPU.isSinglePrecisionSupported ? test : skip)( + 'Array3D(2) (GPU only) gpu', + () => { + testArray3D2('gpu'); + } +); + +(GPU.isSinglePrecisionSupported && GPU.isWebGLSupported ? test : skip)( + 'Array3D(2) (GPU only) webgl', + () => { + testArray3D2('webgl'); + } +); + +(GPU.isSinglePrecisionSupported && GPU.isWebGL2Supported ? test : skip)( + 'Array3D(2) (GPU only) webgl2', + () => { + testArray3D2('webgl2'); + } +); + +(GPU.isSinglePrecisionSupported && GPU.isHeadlessGLSupported ? test : skip)( + 'Array3D(2) (GPU only) headlessgl', + () => { + testArray3D2('headlessgl'); + } +); function testArray3D3(mode) { const gpu = new GPU({ mode }); - const texture = ( - gpu.createKernel(function() { return [this.thread.x, this.thread.y, this.thread.z]; }) - .setOutput([10, 10, 10]) - .setPipeline(true) - .setPrecision('single') - )(); + const texture = gpu + .createKernel(function () { + return [this.thread.x, this.thread.y, this.thread.z]; + }) + .setOutput([10, 10, 10]) + .setPipeline(true) + .setPrecision('single')(); const expected = texture.toArray(); - const kernel = gpu.createKernel(function(value) { - return value[this.thread.z][this.thread.y][this.thread.x]; - }) + const kernel = gpu + .createKernel(function (value) { + return value[this.thread.z][this.thread.y][this.thread.x]; + }) .setArgumentTypes({ - value: 'Array3D(3)' + value: 'Array3D(3)', }) .setOutput([10, 10, 10]) .setPipeline(false) @@ -447,47 +605,62 @@ function testArray3D3(mode) { gpu.destroy(); } -(GPU.isSinglePrecisionSupported ? test : skip)('Array3D(3) (GPU only) auto', () => { - testArray3D3(); -}); - -(GPU.isSinglePrecisionSupported ? test : skip)('Array3D(3) (GPU only) gpu', () => { - testArray3D3('gpu'); -}); - -(GPU.isSinglePrecisionSupported && GPU.isWebGLSupported ? test : skip)('Array3D(3) (GPU only) webgl', () => { - testArray3D3('webgl'); -}); - -(GPU.isSinglePrecisionSupported && GPU.isWebGL2Supported ? test : skip)('Array3D(3) (GPU only) webgl2', () => { - testArray3D3('webgl2'); -}); - -(GPU.isSinglePrecisionSupported && GPU.isHeadlessGLSupported ? test : skip)('Array3D(3) (GPU only) headlessgl', () => { - testArray3D3('headlessgl'); -}); +(GPU.isSinglePrecisionSupported ? test : skip)( + 'Array3D(3) (GPU only) auto', + () => { + testArray3D3(); + } +); + +(GPU.isSinglePrecisionSupported ? test : skip)( + 'Array3D(3) (GPU only) gpu', + () => { + testArray3D3('gpu'); + } +); + +(GPU.isSinglePrecisionSupported && GPU.isWebGLSupported ? test : skip)( + 'Array3D(3) (GPU only) webgl', + () => { + testArray3D3('webgl'); + } +); + +(GPU.isSinglePrecisionSupported && GPU.isWebGL2Supported ? test : skip)( + 'Array3D(3) (GPU only) webgl2', + () => { + testArray3D3('webgl2'); + } +); + +(GPU.isSinglePrecisionSupported && GPU.isHeadlessGLSupported ? test : skip)( + 'Array3D(3) (GPU only) headlessgl', + () => { + testArray3D3('headlessgl'); + } +); function testArray3D4(mode) { const gpu = new GPU({ mode }); - const texture = ( - gpu.createKernel(function() { + const texture = gpu + .createKernel(function () { return [ this.thread.x, this.thread.y, this.thread.z, - this.thread.x * this.thread.y * this.thread.z + this.thread.x * this.thread.y * this.thread.z, ]; }) - .setOutput([10, 10, 10]) - .setPipeline(true) - .setPrecision('single') - )(); + .setOutput([10, 10, 10]) + .setPipeline(true) + .setPrecision('single')(); const expected = texture.toArray(); - const kernel = gpu.createKernel(function(value) { - return value[this.thread.z][this.thread.y][this.thread.x]; - }) + const kernel = gpu + .createKernel(function (value) { + return value[this.thread.z][this.thread.y][this.thread.x]; + }) .setArgumentTypes({ - value: 'Array3D(4)' + value: 'Array3D(4)', }) .setOutput([10, 10, 10]) .setPipeline(false) @@ -500,22 +673,37 @@ function testArray3D4(mode) { gpu.destroy(); } -(GPU.isSinglePrecisionSupported ? test : skip)('Array3D(4) (GPU only) auto', () => { - testArray3D4(); -}); - -(GPU.isSinglePrecisionSupported ? test : skip)('Array3D(4) (GPU only) gpu', () => { - testArray3D4('gpu'); -}); - -(GPU.isSinglePrecisionSupported && GPU.isWebGLSupported ? test : skip)('Array3D(4) (GPU only) webgl', () => { - testArray3D4('webgl'); -}); - -(GPU.isSinglePrecisionSupported && GPU.isWebGL2Supported ? test : skip)('Array3D(4) (GPU only) webgl2', () => { - testArray3D4('webgl2'); -}); - -(GPU.isSinglePrecisionSupported && GPU.isHeadlessGLSupported ? test : skip)('Array3D(4) (GPU only) headlessgl', () => { - testArray3D4('headlessgl'); -}); +(GPU.isSinglePrecisionSupported ? test : skip)( + 'Array3D(4) (GPU only) auto', + () => { + testArray3D4(); + } +); + +(GPU.isSinglePrecisionSupported ? test : skip)( + 'Array3D(4) (GPU only) gpu', + () => { + testArray3D4('gpu'); + } +); + +(GPU.isSinglePrecisionSupported && GPU.isWebGLSupported ? test : skip)( + 'Array3D(4) (GPU only) webgl', + () => { + testArray3D4('webgl'); + } +); + +(GPU.isSinglePrecisionSupported && GPU.isWebGL2Supported ? test : skip)( + 'Array3D(4) (GPU only) webgl2', + () => { + testArray3D4('webgl2'); + } +); + +(GPU.isSinglePrecisionSupported && GPU.isHeadlessGLSupported ? test : skip)( + 'Array3D(4) (GPU only) headlessgl', + () => { + testArray3D4('headlessgl'); + } +); diff --git a/test/internal/backend/cpu-kernel.js b/test/internal/backend/cpu-kernel.js index de633526..5b9701de 100644 --- a/test/internal/backend/cpu-kernel.js +++ b/test/internal/backend/cpu-kernel.js @@ -1,6 +1,6 @@ const sinon = require('sinon'); const { assert, skip, test, module: describe, only } = require('qunit'); -const { CPUKernel } = require('../../../src'); +const { CPUKernel } = require('../../..'); describe('internal: CPUKernel'); @@ -11,4 +11,4 @@ test('.build() checks if already built, and returns early if true', () => { }; CPUKernel.prototype.build.apply(mockContext); assert.equal(mockContext.setupConstants.callCount, 0); -}); \ No newline at end of file +}); diff --git a/test/internal/backend/function-node/isSafe.js b/test/internal/backend/function-node/isSafe.js index ae5f19ae..1c0558c8 100644 --- a/test/internal/backend/function-node/isSafe.js +++ b/test/internal/backend/function-node/isSafe.js @@ -1,25 +1,28 @@ const { assert, test, module: describe, only } = require('qunit'); -const { FunctionNode } = require(process.cwd() + '/src'); +const { FunctionNode } = require('../../../..'); describe('FunctionNode.isSafe()'); test('calls this.getDependencies(ast) and then this.isSafeDependencies()', () => { const mockAst = {}; const dependenciesMock = { - dependencies: [] + dependencies: [], }; let calls = 0; - FunctionNode.prototype.isSafe.call({ - getDependencies: (ast) => { - assert.equal(ast, mockAst); - assert.equal(calls++, 0); - return dependenciesMock; + FunctionNode.prototype.isSafe.call( + { + getDependencies: ast => { + assert.equal(ast, mockAst); + assert.equal(calls++, 0); + return dependenciesMock; + }, + isSafeDependencies: dependencies => { + assert.equal(calls++, 1); + assert.equal(dependencies, dependenciesMock); + }, }, - isSafeDependencies: (dependencies) => { - assert.equal(calls++, 1); - assert.equal(dependencies, dependenciesMock); - } - }, mockAst); + mockAst + ); assert.equal(calls, 2); }); diff --git a/test/internal/backend/function-node/isSafeDependencies.js b/test/internal/backend/function-node/isSafeDependencies.js index 17e1dcde..14d733b6 100644 --- a/test/internal/backend/function-node/isSafeDependencies.js +++ b/test/internal/backend/function-node/isSafeDependencies.js @@ -1,5 +1,5 @@ const { assert, test, module: describe, only } = require('qunit'); -const { FunctionNode } = require(process.cwd() + '/src'); +const { FunctionNode } = require('../../../..'); describe('FunctionNode.isSafeDependencies()'); @@ -8,29 +8,35 @@ test('calls if dependencies are falsey, returns true', () => { }); test('calls if dependencies have all isSafe that are true, returns true', () => { - assert.equal(FunctionNode.prototype.isSafeDependencies([ - { - isSafe: true - }, - { - isSafe: true - }, - { - isSafe: true - } - ]), true); + assert.equal( + FunctionNode.prototype.isSafeDependencies([ + { + isSafe: true, + }, + { + isSafe: true, + }, + { + isSafe: true, + }, + ]), + true + ); }); test('calls if dependencies have any isSafe that are false, returns false', () => { - assert.equal(FunctionNode.prototype.isSafeDependencies([ - { - isSafe: true - }, - { - isSafe: false - }, - { - isSafe: true - } - ]), false); + assert.equal( + FunctionNode.prototype.isSafeDependencies([ + { + isSafe: true, + }, + { + isSafe: false, + }, + { + isSafe: true, + }, + ]), + false + ); }); diff --git a/test/internal/backend/gl-kernel.js b/test/internal/backend/gl-kernel.js index 7af5e074..5e49364d 100644 --- a/test/internal/backend/gl-kernel.js +++ b/test/internal/backend/gl-kernel.js @@ -1,50 +1,54 @@ const { assert, test, module: describe, only, skip } = require('qunit'); const sinon = require('sinon'); -const { GLKernel, GPU } = require(process.cwd() + '/src'); +const { GLKernel, GPU } = require('../../..'); describe('GLKernel'); test('nativeFunctionArguments() parse simple function', () => { - const result = GLKernel.nativeFunctionArguments(`vec2 myFunction(vec2 longName) { + const result = + GLKernel.nativeFunctionArguments(`vec2 myFunction(vec2 longName) { return vec2(1, 1); }`); assert.deepEqual(result, { argumentNames: ['longName'], - argumentTypes: ['Array(2)'] + argumentTypes: ['Array(2)'], }); }); test('nativeFunctionArguments() parse simple function with argument that has number', () => { - const result = GLKernel.nativeFunctionArguments(`vec2 myFunction(vec2 longName123) { + const result = + GLKernel.nativeFunctionArguments(`vec2 myFunction(vec2 longName123) { return vec2(1, 1); }`); assert.deepEqual(result, { argumentNames: ['longName123'], - argumentTypes: ['Array(2)'] + argumentTypes: ['Array(2)'], }); }); test('nativeFunctionArguments() parse simple function, multiple arguments', () => { - const result = GLKernel.nativeFunctionArguments(`vec2 myFunction(vec3 a,vec3 b,float c) { + const result = + GLKernel.nativeFunctionArguments(`vec2 myFunction(vec3 a,vec3 b,float c) { return vec2(1, 1); }`); assert.deepEqual(result, { argumentNames: ['a', 'b', 'c'], - argumentTypes: ['Array(3)', 'Array(3)', 'Number'] + argumentTypes: ['Array(3)', 'Array(3)', 'Number'], }); }); test('nativeFunctionArguments() parse simple function, multiple arguments with comments', () => { - const result = GLKernel.nativeFunctionArguments(`vec2 myFunction(vec3 a /* vec4 b */,vec2 c, /* vec4 d */ float e) { + const result = + GLKernel.nativeFunctionArguments(`vec2 myFunction(vec3 a /* vec4 b */,vec2 c, /* vec4 d */ float e) { return vec2(1, 1); }`); assert.deepEqual(result, { argumentNames: ['a', 'c', 'e'], - argumentTypes: ['Array(3)', 'Array(2)', 'Number'] + argumentTypes: ['Array(3)', 'Array(2)', 'Number'], }); }); @@ -59,7 +63,7 @@ test('nativeFunctionArguments() parse simple function, multiple arguments on mul assert.deepEqual(result, { argumentNames: ['a', 'b', 'c'], - argumentTypes: ['Array(4)', 'Array(3)', 'Number'] + argumentTypes: ['Array(4)', 'Array(3)', 'Number'], }); }); @@ -77,7 +81,7 @@ test('nativeFunctionArguments() parse simple function, multiple arguments on mul assert.deepEqual(result, { argumentNames: ['a', 'b', 'c'], - argumentTypes: ['Array(2)', 'Array(3)', 'Number'] + argumentTypes: ['Array(2)', 'Array(3)', 'Number'], }); }); @@ -92,7 +96,7 @@ test('nativeFunctionArguments() parse simple function, multiple arguments on mul assert.deepEqual(result, { argumentNames: ['a', 'b', 'c'], - argumentTypes: ['Array(2)', 'Array(4)', 'Integer'] + argumentTypes: ['Array(2)', 'Array(4)', 'Integer'], }); }); @@ -105,20 +109,31 @@ test('nativeFunctionArguments() parse simple function that is cut short', () => assert.deepEqual(result, { argumentNames: ['a', 'b', 'c'], - argumentTypes: ['Array(2)', 'Array(3)', 'Number'] + argumentTypes: ['Array(2)', 'Array(3)', 'Number'], }); }); test('getVariablePrecisionString() when tactic is set to "speed" returns "lowp"', () => { - assert.equal(GLKernel.prototype.getVariablePrecisionString.call({ tactic: 'speed' }), 'lowp'); + assert.equal( + GLKernel.prototype.getVariablePrecisionString.call({ tactic: 'speed' }), + 'lowp' + ); }); test('getVariablePrecisionString() when tactic is set to "balanced" returns "mediump"', () => { - assert.equal(GLKernel.prototype.getVariablePrecisionString.call({ tactic: 'balanced' }), 'mediump'); + assert.equal( + GLKernel.prototype.getVariablePrecisionString.call({ tactic: 'balanced' }), + 'mediump' + ); }); test('getVariablePrecisionString() when tactic is set to "precision" returns "highp"', () => { - assert.equal(GLKernel.prototype.getVariablePrecisionString.call({ tactic: 'precision' }), 'highp'); + assert.equal( + GLKernel.prototype.getVariablePrecisionString.call({ + tactic: 'precision', + }), + 'highp' + ); }); test('getVariablePrecisionString() when tactic is not set and texSize is within lowFloatPrecision', () => { @@ -130,11 +145,17 @@ test('getVariablePrecisionString() when tactic is not set and texSize is within mediumFloatPrecision: { rangeMax: Math.log2(4 * 4) }, highFloatPrecision: { rangeMax: Math.log2(5 * 5) }, isSpeedTacticSupported: true, - } - } + }, + }, }; const textureSize = [2, 2]; - assert.equal(GLKernel.prototype.getVariablePrecisionString.call(mockInstance, textureSize), 'lowp'); + assert.equal( + GLKernel.prototype.getVariablePrecisionString.call( + mockInstance, + textureSize + ), + 'lowp' + ); }); test('getVariablePrecisionString() when tactic is not set and texSize is within mediumFloatPrecision', () => { @@ -146,11 +167,17 @@ test('getVariablePrecisionString() when tactic is not set and texSize is within mediumFloatPrecision: { rangeMax: Math.log2(4 * 4) }, highFloatPrecision: { rangeMax: Math.log2(5 * 5) }, isSpeedTacticSupported: true, - } - } + }, + }, }; const textureSize = [4, 4]; - assert.equal(GLKernel.prototype.getVariablePrecisionString.call(mockInstance, textureSize), 'mediump'); + assert.equal( + GLKernel.prototype.getVariablePrecisionString.call( + mockInstance, + textureSize + ), + 'mediump' + ); }); test('getVariablePrecisionString() when tactic is not set and texSize is within highFloatPrecision', () => { @@ -162,11 +189,17 @@ test('getVariablePrecisionString() when tactic is not set and texSize is within mediumFloatPrecision: { rangeMax: Math.log2(4 * 4) }, highFloatPrecision: { rangeMax: Math.log2(5 * 5) }, isSpeedTacticSupported: true, - } - } + }, + }, }; const textureSize = [5, 5]; - assert.equal(GLKernel.prototype.getVariablePrecisionString.call(mockInstance, textureSize), 'highp'); + assert.equal( + GLKernel.prototype.getVariablePrecisionString.call( + mockInstance, + textureSize + ), + 'highp' + ); }); test('getVariablePrecisionString() when tactic is not set and texSize is outside highFloatPrecision', () => { @@ -178,11 +211,16 @@ test('getVariablePrecisionString() when tactic is not set and texSize is outside mediumFloatPrecision: { rangeMax: Math.log2(4 * 4) }, highFloatPrecision: { rangeMax: Math.log2(5 * 5) }, isSpeedTacticSupported: true, - } - } + }, + }, }; const textureSize = [6, 6]; - assert.throws(() => GLKernel.prototype.getVariablePrecisionString.call(mockInstance, textureSize)); + assert.throws(() => + GLKernel.prototype.getVariablePrecisionString.call( + mockInstance, + textureSize + ) + ); }); test('getVariablePrecisionString() when tactic is not set and texSize is within lowIntPrecision', () => { @@ -194,11 +232,19 @@ test('getVariablePrecisionString() when tactic is not set and texSize is within mediumIntPrecision: { rangeMax: Math.log2(4 * 4) }, highIntPrecision: { rangeMax: Math.log2(5 * 5) }, isSpeedTacticSupported: true, - } - } + }, + }, }; const textureSize = [2, 2]; - assert.equal(GLKernel.prototype.getVariablePrecisionString.call(mockInstance, textureSize, null, true), 'lowp'); + assert.equal( + GLKernel.prototype.getVariablePrecisionString.call( + mockInstance, + textureSize, + null, + true + ), + 'lowp' + ); }); test('getVariablePrecisionString() when tactic is not set and texSize is within mediumIntPrecision', () => { @@ -210,11 +256,19 @@ test('getVariablePrecisionString() when tactic is not set and texSize is within mediumIntPrecision: { rangeMax: Math.log2(4 * 4) }, highIntPrecision: { rangeMax: Math.log2(5 * 5) }, isSpeedTacticSupported: true, - } - } + }, + }, }; const textureSize = [4, 4]; - assert.equal(GLKernel.prototype.getVariablePrecisionString.call(mockInstance, textureSize, null, true), 'mediump'); + assert.equal( + GLKernel.prototype.getVariablePrecisionString.call( + mockInstance, + textureSize, + null, + true + ), + 'mediump' + ); }); test('getVariablePrecisionString() when tactic is not set and texSize is within highIntPrecision', () => { @@ -226,11 +280,19 @@ test('getVariablePrecisionString() when tactic is not set and texSize is within mediumIntPrecision: { rangeMax: Math.log2(4 * 4) }, highIntPrecision: { rangeMax: Math.log2(5 * 5) }, isSpeedTacticSupported: true, - } - } + }, + }, }; const textureSize = [5, 5]; - assert.equal(GLKernel.prototype.getVariablePrecisionString.call(mockInstance, textureSize, null, true), 'highp'); + assert.equal( + GLKernel.prototype.getVariablePrecisionString.call( + mockInstance, + textureSize, + null, + true + ), + 'highp' + ); }); test('getVariablePrecisionString() when tactic is not set and texSize is outside highIntPrecision', () => { @@ -242,11 +304,18 @@ test('getVariablePrecisionString() when tactic is not set and texSize is outside mediumIntPrecision: { rangeMax: Math.log2(4 * 4) }, highIntPrecision: { rangeMax: Math.log2(5 * 5) }, isSpeedTacticSupported: true, - } - } + }, + }, }; const textureSize = [6, 6]; - assert.throws(() => GLKernel.prototype.getVariablePrecisionString.call(mockInstance, textureSize, null, true)); + assert.throws(() => + GLKernel.prototype.getVariablePrecisionString.call( + mockInstance, + textureSize, + null, + true + ) + ); }); test('getVariablePrecisionString() when features.isSpeedTacticSupported is false returns "highp"', () => { @@ -255,11 +324,19 @@ test('getVariablePrecisionString() when features.isSpeedTacticSupported is false constructor: { features: { isSpeedTacticSupported: false, - } - } + }, + }, }; const textureSize = [1, 1]; - assert.equal(GLKernel.prototype.getVariablePrecisionString.call(mockInstance, textureSize, null, true), 'highp'); + assert.equal( + GLKernel.prototype.getVariablePrecisionString.call( + mockInstance, + textureSize, + null, + true + ), + 'highp' + ); }); function testGetFeatures(canvas, context) { @@ -310,7 +387,7 @@ test('setOutput() throws when not dynamicOutput and already compiled', () => { GLKernel.prototype.setOutput.call({ program: {}, toKernelOutput: () => {}, - dynamicOutput: false + dynamicOutput: false, }); }, new Error('Resizing a kernel with dynamicOutput: false is not possible')); }); @@ -329,13 +406,13 @@ test('setOutput() when does not need to trigger recompile', () => { const mockContext = { bindFramebuffer: sinon.spy(), FRAMEBUFFER: 'FRAMEBUFFER', - viewport: sinon.spy() + viewport: sinon.spy(), }; const mockTexture = { delete: sinon.spy(), }; const mockMappedTexture = { - delete: sinon.spy() + delete: sinon.spy(), }; const mock_setupOutputTexture = sinon.spy(); const mock_setupSubOutputTextures = sinon.spy(); @@ -360,16 +437,17 @@ test('setOutput() when does not need to trigger recompile', () => { height: 0, }, texture: mockTexture, - mappedTextures: [ - mockMappedTexture - ], + mappedTextures: [mockMappedTexture], _setupOutputTexture: mock_setupOutputTexture, _setupSubOutputTextures: mock_setupSubOutputTextures, }; GLKernel.prototype.setOutput.call(mockInstance, [100, 100]); assert.equal(mockContext.bindFramebuffer.callCount, 1); assert.equal(mockContext.bindFramebuffer.args[0][0], 'FRAMEBUFFER'); - assert.equal(mockContext.bindFramebuffer.args[0][1], mockInstance.framebuffer); + assert.equal( + mockContext.bindFramebuffer.args[0][1], + mockInstance.framebuffer + ); assert.equal(mockInstance.updateMaxTexSize.callCount, 1); assert.equal(mockInstance.framebuffer.width, 100); assert.equal(mockInstance.framebuffer.height, 100); @@ -394,12 +472,12 @@ test('setOutput() when needs to trigger recompile', () => { texSize: [1, 1], toKernelOutput: GLKernel.prototype.toKernelOutput, dynamicOutput: true, - getVariablePrecisionString: (textureSize) => { + getVariablePrecisionString: textureSize => { if (textureSize[0] === 1) return 'lowp'; return 'highp'; }, - switchKernels: sinon.spy() + switchKernels: sinon.spy(), }; GLKernel.prototype.setOutput.call(mockInstance, [100, 100]); assert.ok(mockInstance.switchKernels.callCount, 1); -}); \ No newline at end of file +}); diff --git a/test/internal/backend/headless-gl/kernel/index.js b/test/internal/backend/headless-gl/kernel/index.js index 7e02a453..3190e15f 100644 --- a/test/internal/backend/headless-gl/kernel/index.js +++ b/test/internal/backend/headless-gl/kernel/index.js @@ -2,17 +2,20 @@ const { assert, test, module: describe, only, skip } = require('qunit'); describe('internal: HeadlessGLKernel'); -(typeof global !== 'undefined' ? test : skip)('.setupFeatureChecks() should not blow up, even if global WebGLRenderingContext is available', () => { - global.WebGLRenderingContext = {}; - global.document = { - createElement: () => { - return {}; - } - }; - // this is done late on purpose! Do not change this, as it causes HeadlessGL to initialize with certain values -const { HeadlessGLKernel } = require('../../../../../src'); - HeadlessGLKernel.setupFeatureChecks(); - assert.ok(true); - delete global.document; - delete global.WebGLRenderingContext; -}); +(typeof global !== 'undefined' ? test : skip)( + '.setupFeatureChecks() should not blow up, even if global WebGLRenderingContext is available', + () => { + global.WebGLRenderingContext = {}; + global.document = { + createElement: () => { + return {}; + }, + }; + // this is done late on purpose! Do not change this, as it causes HeadlessGL to initialize with certain values + const { HeadlessGLKernel } = require('../../../../..'); + HeadlessGLKernel.setupFeatureChecks(); + assert.ok(true); + delete global.document; + delete global.WebGLRenderingContext; + } +); diff --git a/test/internal/backend/web-gl/function-node/astBinaryExpression.js b/test/internal/backend/web-gl/function-node/astBinaryExpression.js index a7ef538e..94e58e2e 100644 --- a/test/internal/backend/web-gl/function-node/astBinaryExpression.js +++ b/test/internal/backend/web-gl/function-node/astBinaryExpression.js @@ -1,373 +1,498 @@ const { assert, test, module: describe, only } = require('qunit'); -const { WebGLFunctionNode } = require(process.cwd() + '/src'); +const { WebGLFunctionNode } = require('../../../../..'); describe('WebGLFunctionNode.astBinaryExpression()'); - test('divide float & float', () => { - const node = new WebGLFunctionNode(`function kernel(left, right) { + const node = new WebGLFunctionNode( + `function kernel(left, right) { return left / right; - }`, { - returnType: 'Number', - output: [1], - argumentTypes: ['Number', 'Number'] - }); - - assert.equal(node.toString(), 'float kernel(float user_left, float user_right) {' - + '\nreturn (user_left/user_right);' - + '\n}'); + }`, + { + returnType: 'Number', + output: [1], + argumentTypes: ['Number', 'Number'], + } + ); + + assert.equal( + node.toString(), + 'float kernel(float user_left, float user_right) {' + + '\nreturn (user_left/user_right);' + + '\n}' + ); }); test('divide float & int', () => { - const node = new WebGLFunctionNode(`function kernel(left, right) { + const node = new WebGLFunctionNode( + `function kernel(left, right) { return left / right; - }`, { - returnType: 'Number', - output: [1], - argumentTypes: ['Number', 'Integer'] - }); - - assert.equal(node.toString(), 'float kernel(float user_left, int user_right) {' - + '\nreturn (user_left/float(user_right));' - + '\n}'); + }`, + { + returnType: 'Number', + output: [1], + argumentTypes: ['Number', 'Integer'], + } + ); + + assert.equal( + node.toString(), + 'float kernel(float user_left, int user_right) {' + + '\nreturn (user_left/float(user_right));' + + '\n}' + ); }); test('divide float & literal float', () => { - const node = new WebGLFunctionNode(`function kernel(left) { + const node = new WebGLFunctionNode( + `function kernel(left) { return left / 1.1; - }`, { - returnType: 'Number', - output: [1], - argumentTypes: ['Number'] - }); - - assert.equal(node.toString(), 'float kernel(float user_left) {' - + '\nreturn (user_left/1.1);' - + '\n}'); + }`, + { + returnType: 'Number', + output: [1], + argumentTypes: ['Number'], + } + ); + + assert.equal( + node.toString(), + 'float kernel(float user_left) {' + '\nreturn (user_left/1.1);' + '\n}' + ); }); test('divide float & literal integer', () => { - const node = new WebGLFunctionNode(`function kernel(left) { + const node = new WebGLFunctionNode( + `function kernel(left) { return left / 1; - }`, { - returnType: 'Number', - output: [1], - argumentTypes: ['Number'] - }); - - assert.equal(node.toString(), 'float kernel(float user_left) {' - + '\nreturn (user_left/1.0);' - + '\n}'); + }`, + { + returnType: 'Number', + output: [1], + argumentTypes: ['Number'], + } + ); + + assert.equal( + node.toString(), + 'float kernel(float user_left) {' + '\nreturn (user_left/1.0);' + '\n}' + ); }); test('divide float & Input', () => { - const node = new WebGLFunctionNode(`function kernel(left, right) { + const node = new WebGLFunctionNode( + `function kernel(left, right) { return left / right[this.thread.x]; - }`, { - returnType: 'Number', - output: [1], - argumentTypes: ['Number', 'Input'], - lookupFunctionArgumentBitRatio: () => 4, - }); - - assert.equal(node.toString(), 'float kernel(float user_left, sampler2D user_right,ivec2 user_rightSize,ivec3 user_rightDim) {' - + '\nreturn (user_left/get32(user_right, user_rightSize, user_rightDim, 0, 0, threadId.x));' - + '\n}'); + }`, + { + returnType: 'Number', + output: [1], + argumentTypes: ['Number', 'Input'], + lookupFunctionArgumentBitRatio: () => 4, + } + ); + + assert.equal( + node.toString(), + 'float kernel(float user_left, sampler2D user_right,ivec2 user_rightSize,ivec3 user_rightDim) {' + + '\nreturn (user_left/get32(user_right, user_rightSize, user_rightDim, 0, 0, threadId.x));' + + '\n}' + ); }); test('divide int & float', () => { - const node = new WebGLFunctionNode(`function kernel(left, right) { + const node = new WebGLFunctionNode( + `function kernel(left, right) { return left / right; - }`, { - returnType: 'Number', - output: [1], - argumentTypes: ['Integer', 'Number'] - }); - - assert.equal(node.toString(), 'float kernel(int user_left, float user_right) {' - + '\nreturn float((user_left/int(user_right)));' - + '\n}'); + }`, + { + returnType: 'Number', + output: [1], + argumentTypes: ['Integer', 'Number'], + } + ); + + assert.equal( + node.toString(), + 'float kernel(int user_left, float user_right) {' + + '\nreturn float((user_left/int(user_right)));' + + '\n}' + ); }); test('divide int & int', () => { - const node = new WebGLFunctionNode(`function kernel(left, right) { + const node = new WebGLFunctionNode( + `function kernel(left, right) { return left / right; - }`, { - returnType: 'Number', - output: [1], - argumentTypes: ['Integer', 'Integer'] - }); - - assert.equal(node.toString(), 'float kernel(int user_left, int user_right) {' - + '\nreturn float((user_left/user_right));' - + '\n}'); + }`, + { + returnType: 'Number', + output: [1], + argumentTypes: ['Integer', 'Integer'], + } + ); + + assert.equal( + node.toString(), + 'float kernel(int user_left, int user_right) {' + + '\nreturn float((user_left/user_right));' + + '\n}' + ); }); test('divide int & literal float', () => { - const node = new WebGLFunctionNode(`function kernel(left) { + const node = new WebGLFunctionNode( + `function kernel(left) { return left / 1.1; - }`, { - returnType: 'Number', - output: [1], - argumentTypes: ['Integer'] - }); - - assert.equal(node.toString(), 'float kernel(int user_left) {' - + '\nreturn float((user_left/1));' - + '\n}'); + }`, + { + returnType: 'Number', + output: [1], + argumentTypes: ['Integer'], + } + ); + + assert.equal( + node.toString(), + 'float kernel(int user_left) {' + '\nreturn float((user_left/1));' + '\n}' + ); }); test('divide int & literal integer', () => { - const node = new WebGLFunctionNode(`function kernel(left) { + const node = new WebGLFunctionNode( + `function kernel(left) { return left / 1; - }`, { - returnType: 'Number', - output: [1], - argumentTypes: ['Integer'] - }); - - assert.equal(node.toString(), 'float kernel(int user_left) {' - + '\nreturn float((user_left/1));' - + '\n}'); + }`, + { + returnType: 'Number', + output: [1], + argumentTypes: ['Integer'], + } + ); + + assert.equal( + node.toString(), + 'float kernel(int user_left) {' + '\nreturn float((user_left/1));' + '\n}' + ); }); test('divide int & Input', () => { - const node = new WebGLFunctionNode(`function kernel(left, right) { + const node = new WebGLFunctionNode( + `function kernel(left, right) { return left / right[this.thread.x]; - }`, { - returnType: 'Number', - output: [1], - argumentTypes: ['Integer', 'Input'], - lookupFunctionArgumentBitRatio: () => 4, - }); - - assert.equal(node.toString(), 'float kernel(int user_left, sampler2D user_right,ivec2 user_rightSize,ivec3 user_rightDim) {' - + '\nreturn float((user_left/int(get32(user_right, user_rightSize, user_rightDim, 0, 0, threadId.x))));' - + '\n}'); + }`, + { + returnType: 'Number', + output: [1], + argumentTypes: ['Integer', 'Input'], + lookupFunctionArgumentBitRatio: () => 4, + } + ); + + assert.equal( + node.toString(), + 'float kernel(int user_left, sampler2D user_right,ivec2 user_rightSize,ivec3 user_rightDim) {' + + '\nreturn float((user_left/int(get32(user_right, user_rightSize, user_rightDim, 0, 0, threadId.x))));' + + '\n}' + ); }); test('divide literal integer & float', () => { - const node = new WebGLFunctionNode(`function kernel(left) { + const node = new WebGLFunctionNode( + `function kernel(left) { return 1 / left; - }`, { - returnType: 'Number', - output: [1], - argumentTypes: ['Number'] - }); - - assert.equal(node.toString(), 'float kernel(float user_left) {' - + '\nreturn (1.0/user_left);' - + '\n}'); + }`, + { + returnType: 'Number', + output: [1], + argumentTypes: ['Number'], + } + ); + + assert.equal( + node.toString(), + 'float kernel(float user_left) {' + '\nreturn (1.0/user_left);' + '\n}' + ); }); test('divide literal integer & int', () => { - const node = new WebGLFunctionNode(`function kernel(left) { + const node = new WebGLFunctionNode( + `function kernel(left) { return 1 / left; - }`, { - returnType: 'Number', - output: [1], - argumentTypes: ['Integer'] - }); - - assert.equal(node.toString(), 'float kernel(int user_left) {' - + '\nreturn float((1/user_left));' - + '\n}'); + }`, + { + returnType: 'Number', + output: [1], + argumentTypes: ['Integer'], + } + ); + + assert.equal( + node.toString(), + 'float kernel(int user_left) {' + '\nreturn float((1/user_left));' + '\n}' + ); }); test('divide literal integer & literal float', () => { - const node = new WebGLFunctionNode(`function kernel() { + const node = new WebGLFunctionNode( + `function kernel() { return 1 / 1.1; - }`, { - returnType: 'Number', - output: [1], - argumentTypes: [] - }); - - assert.equal(node.toString(), 'float kernel() {' - + '\nreturn (1.0/1.1);' - + '\n}'); + }`, + { + returnType: 'Number', + output: [1], + argumentTypes: [], + } + ); + + assert.equal( + node.toString(), + 'float kernel() {' + '\nreturn (1.0/1.1);' + '\n}' + ); }); test('divide literal integer & literal integer', () => { - const node = new WebGLFunctionNode(`function kernel() { + const node = new WebGLFunctionNode( + `function kernel() { return 1 / 1; - }`, { - returnType: 'Number', - output: [1], - argumentTypes: [] - }); - - assert.equal(node.toString(), 'float kernel() {' - + '\nreturn (1.0/1.0);' - + '\n}'); + }`, + { + returnType: 'Number', + output: [1], + argumentTypes: [], + } + ); + + assert.equal( + node.toString(), + 'float kernel() {' + '\nreturn (1.0/1.0);' + '\n}' + ); }); test('divide literal integer & Input', () => { - const node = new WebGLFunctionNode(`function kernel(v) { + const node = new WebGLFunctionNode( + `function kernel(v) { return 1 / v[this.thread.x]; - }`, { - returnType: 'Number', - output: [1], - argumentTypes: ['Input'], - lookupFunctionArgumentBitRatio: () => 4, - }); - - assert.equal(node.toString(), 'float kernel(sampler2D user_v,ivec2 user_vSize,ivec3 user_vDim) {' - + '\nreturn (1.0/get32(user_v, user_vSize, user_vDim, 0, 0, threadId.x));' - + '\n}'); + }`, + { + returnType: 'Number', + output: [1], + argumentTypes: ['Input'], + lookupFunctionArgumentBitRatio: () => 4, + } + ); + + assert.equal( + node.toString(), + 'float kernel(sampler2D user_v,ivec2 user_vSize,ivec3 user_vDim) {' + + '\nreturn (1.0/get32(user_v, user_vSize, user_vDim, 0, 0, threadId.x));' + + '\n}' + ); }); test('divide literal float & float', () => { - const node = new WebGLFunctionNode(`function kernel(right) { + const node = new WebGLFunctionNode( + `function kernel(right) { return 1.1 / right; - }`, { - returnType: 'Number', - output: [1], - argumentTypes: ['Number'] - }); - - assert.equal(node.toString(), 'float kernel(float user_right) {' - + '\nreturn (1.1/user_right);' - + '\n}'); + }`, + { + returnType: 'Number', + output: [1], + argumentTypes: ['Number'], + } + ); + + assert.equal( + node.toString(), + 'float kernel(float user_right) {' + '\nreturn (1.1/user_right);' + '\n}' + ); }); test('divide literal float & int', () => { - const node = new WebGLFunctionNode(`function kernel(right) { + const node = new WebGLFunctionNode( + `function kernel(right) { return 1.1 / right; - }`, { - returnType: 'Number', - output: [1], - argumentTypes: ['Integer'] - }); - - assert.equal(node.toString(), 'float kernel(int user_right) {' - + '\nreturn (1.1/float(user_right));' - + '\n}'); + }`, + { + returnType: 'Number', + output: [1], + argumentTypes: ['Integer'], + } + ); + + assert.equal( + node.toString(), + 'float kernel(int user_right) {' + + '\nreturn (1.1/float(user_right));' + + '\n}' + ); }); test('divide literal float & literal float', () => { - const node = new WebGLFunctionNode(`function kernel() { + const node = new WebGLFunctionNode( + `function kernel() { return 1.1 / 1.1; - }`, { - returnType: 'Number', - output: [1], - argumentTypes: [] - }); - - assert.equal(node.toString(), 'float kernel() {' - + '\nreturn (1.1/1.1);' - + '\n}'); + }`, + { + returnType: 'Number', + output: [1], + argumentTypes: [], + } + ); + + assert.equal( + node.toString(), + 'float kernel() {' + '\nreturn (1.1/1.1);' + '\n}' + ); }); test('divide literal float & literal integer', () => { - const node = new WebGLFunctionNode(`function kernel() { + const node = new WebGLFunctionNode( + `function kernel() { return 1.1 / 1; - }`, { - returnType: 'Number', - output: [1], - argumentTypes: [] - }); - - assert.equal(node.toString(), 'float kernel() {' - + '\nreturn (1.1/1.0);' - + '\n}'); + }`, + { + returnType: 'Number', + output: [1], + argumentTypes: [], + } + ); + + assert.equal( + node.toString(), + 'float kernel() {' + '\nreturn (1.1/1.0);' + '\n}' + ); }); test('divide literal float & Input', () => { - const node = new WebGLFunctionNode(`function kernel(v) { + const node = new WebGLFunctionNode( + `function kernel(v) { return 1.1 / v[this.thread.x]; - }`, { - returnType: 'Number', - output: [1], - argumentTypes: ['Input'], - lookupFunctionArgumentBitRatio: () => 4, - }); - - assert.equal(node.toString(), 'float kernel(sampler2D user_v,ivec2 user_vSize,ivec3 user_vDim) {' - + '\nreturn (1.1/get32(user_v, user_vSize, user_vDim, 0, 0, threadId.x));' - + '\n}'); + }`, + { + returnType: 'Number', + output: [1], + argumentTypes: ['Input'], + lookupFunctionArgumentBitRatio: () => 4, + } + ); + + assert.equal( + node.toString(), + 'float kernel(sampler2D user_v,ivec2 user_vSize,ivec3 user_vDim) {' + + '\nreturn (1.1/get32(user_v, user_vSize, user_vDim, 0, 0, threadId.x));' + + '\n}' + ); }); test('divide this.thread.x by this.output.x and multiple, integer, integer, and float with this.fixIntegerDivisionAccuracy = false', () => { - const node = new WebGLFunctionNode(`function kernel() { + const node = new WebGLFunctionNode( + `function kernel() { return (this.thread.x / this.output.x) * 4; - }`, { - returnType: 'Number', - output: [1], - argumentTypes: [], - lookupFunctionArgumentBitRatio: () => 4, - fixIntegerDivisionAccuracy: false, - }); - - assert.equal(node.toString(), 'float kernel() {' - + '\nreturn float(((threadId.x/1)*4));' - + '\n}'); + }`, + { + returnType: 'Number', + output: [1], + argumentTypes: [], + lookupFunctionArgumentBitRatio: () => 4, + fixIntegerDivisionAccuracy: false, + } + ); + + assert.equal( + node.toString(), + 'float kernel() {' + '\nreturn float(((threadId.x/1)*4));' + '\n}' + ); }); test('divide this.thread.x by this.output.x and multiple, integer, integer, and float with this.fixIntegerDivisionAccuracy = true', () => { - const node = new WebGLFunctionNode(`function kernel() { + const node = new WebGLFunctionNode( + `function kernel() { return (this.thread.x / this.output.x) * 4; - }`, { - returnType: 'Number', - output: [1], - argumentTypes: [], - lookupFunctionArgumentBitRatio: () => 4, - fixIntegerDivisionAccuracy: true, - }); - - assert.equal(node.toString(), 'float kernel() {' - + '\nreturn (divWithIntCheck(float(threadId.x), 1.0)*4.0);' - + '\n}'); + }`, + { + returnType: 'Number', + output: [1], + argumentTypes: [], + lookupFunctionArgumentBitRatio: () => 4, + fixIntegerDivisionAccuracy: true, + } + ); + + assert.equal( + node.toString(), + 'float kernel() {' + + '\nreturn (divWithIntCheck(float(threadId.x), 1.0)*4.0);' + + '\n}' + ); }); test('multiply Input and Input', () => { - const node = new WebGLFunctionNode('function kernel(v1, v2) {' - + '\n return v1[this.thread.x] * v2[this.thread.x];' - + '\n}', { - output: [1], - argumentTypes: ['Input', 'Input'], - lookupFunctionArgumentBitRatio: () => 4, - }); - assert.equal(node.toString(), 'float kernel(sampler2D user_v1,ivec2 user_v1Size,ivec3 user_v1Dim, sampler2D user_v2,ivec2 user_v2Size,ivec3 user_v2Dim) {' - + '\nreturn (get32(user_v1, user_v1Size, user_v1Dim, 0, 0, threadId.x)*get32(user_v2, user_v2Size, user_v2Dim, 0, 0, threadId.x));' - + '\n}'); + const node = new WebGLFunctionNode( + 'function kernel(v1, v2) {' + + '\n return v1[this.thread.x] * v2[this.thread.x];' + + '\n}', + { + output: [1], + argumentTypes: ['Input', 'Input'], + lookupFunctionArgumentBitRatio: () => 4, + } + ); + assert.equal( + node.toString(), + 'float kernel(sampler2D user_v1,ivec2 user_v1Size,ivec3 user_v1Dim, sampler2D user_v2,ivec2 user_v2Size,ivec3 user_v2Dim) {' + + '\nreturn (get32(user_v1, user_v1Size, user_v1Dim, 0, 0, threadId.x)*get32(user_v2, user_v2Size, user_v2Dim, 0, 0, threadId.x));' + + '\n}' + ); }); test('multiply Input and int', () => { - const node = new WebGLFunctionNode('function kernel(v1, v2) {' - + '\n return v1[this.thread.x] * v2;' - + '\n}', { - output: [1], - argumentTypes: ['Input', 'Integer'], - lookupFunctionArgumentBitRatio: () => 4, - }); - assert.equal(node.toString(), 'float kernel(sampler2D user_v1,ivec2 user_v1Size,ivec3 user_v1Dim, int user_v2) {' - + '\nreturn (get32(user_v1, user_v1Size, user_v1Dim, 0, 0, threadId.x)*float(user_v2));' - + '\n}'); + const node = new WebGLFunctionNode( + 'function kernel(v1, v2) {' + '\n return v1[this.thread.x] * v2;' + '\n}', + { + output: [1], + argumentTypes: ['Input', 'Integer'], + lookupFunctionArgumentBitRatio: () => 4, + } + ); + assert.equal( + node.toString(), + 'float kernel(sampler2D user_v1,ivec2 user_v1Size,ivec3 user_v1Dim, int user_v2) {' + + '\nreturn (get32(user_v1, user_v1Size, user_v1Dim, 0, 0, threadId.x)*float(user_v2));' + + '\n}' + ); }); test('multiply Input and float', () => { - const node = new WebGLFunctionNode('function kernel(v1, v2) {' - + '\n return v1[this.thread.x] * v2;' - + '\n}', { - output: [1], - argumentTypes: ['Input', 'Float'], - lookupFunctionArgumentBitRatio: () => 4, - }); - assert.equal(node.toString(), 'float kernel(sampler2D user_v1,ivec2 user_v1Size,ivec3 user_v1Dim, float user_v2) {' - + '\nreturn (get32(user_v1, user_v1Size, user_v1Dim, 0, 0, threadId.x)*user_v2);' - + '\n}'); + const node = new WebGLFunctionNode( + 'function kernel(v1, v2) {' + '\n return v1[this.thread.x] * v2;' + '\n}', + { + output: [1], + argumentTypes: ['Input', 'Float'], + lookupFunctionArgumentBitRatio: () => 4, + } + ); + assert.equal( + node.toString(), + 'float kernel(sampler2D user_v1,ivec2 user_v1Size,ivec3 user_v1Dim, float user_v2) {' + + '\nreturn (get32(user_v1, user_v1Size, user_v1Dim, 0, 0, threadId.x)*user_v2);' + + '\n}' + ); }); test('multiply Input and Number', () => { - const node = new WebGLFunctionNode('function kernel(v1, v2) {' - + '\n return v1[this.thread.x] * v2;' - + '\n}', { - output: [1], - argumentTypes: ['Input', 'Number'], - lookupFunctionArgumentBitRatio: () => 4, - }); - assert.equal(node.toString(), 'float kernel(sampler2D user_v1,ivec2 user_v1Size,ivec3 user_v1Dim, float user_v2) {' - + '\nreturn (get32(user_v1, user_v1Size, user_v1Dim, 0, 0, threadId.x)*user_v2);' - + '\n}'); + const node = new WebGLFunctionNode( + 'function kernel(v1, v2) {' + '\n return v1[this.thread.x] * v2;' + '\n}', + { + output: [1], + argumentTypes: ['Input', 'Number'], + lookupFunctionArgumentBitRatio: () => 4, + } + ); + assert.equal( + node.toString(), + 'float kernel(sampler2D user_v1,ivec2 user_v1Size,ivec3 user_v1Dim, float user_v2) {' + + '\nreturn (get32(user_v1, user_v1Size, user_v1Dim, 0, 0, threadId.x)*user_v2);' + + '\n}' + ); }); diff --git a/test/internal/backend/web-gl/function-node/astCallExpression.js b/test/internal/backend/web-gl/function-node/astCallExpression.js index cc55f22b..2bee99d1 100644 --- a/test/internal/backend/web-gl/function-node/astCallExpression.js +++ b/test/internal/backend/web-gl/function-node/astCallExpression.js @@ -1,135 +1,185 @@ const { assert, test, module: describe, only } = require('qunit'); -const { WebGLFunctionNode } = require(process.cwd() + '/src'); +const { WebGLFunctionNode } = require('../../../../..'); describe('WebGLFunctionNode.astCallExpression()'); test('handles Math.abs with floats', () => { - const node = new WebGLFunctionNode(`function kernel(v) { + const node = new WebGLFunctionNode( + `function kernel(v) { return Math.abs(v); - }`, { output: [1], argumentTypes: ['Number'] }); - assert.equal(node.toString(), 'float kernel(float user_v) {' - + '\nreturn abs(user_v);' - + '\n}'); + }`, + { output: [1], argumentTypes: ['Number'] } + ); + assert.equal( + node.toString(), + 'float kernel(float user_v) {' + '\nreturn abs(user_v);' + '\n}' + ); }); test('handles Math.abs with ints', () => { - const node = new WebGLFunctionNode(`function kernel(v) { + const node = new WebGLFunctionNode( + `function kernel(v) { return Math.abs(v); - }`, { output: [1], argumentTypes: ['Integer'] }); - assert.equal(node.toString(), 'float kernel(int user_v) {' - + '\nreturn abs(float(user_v));' - + '\n}'); + }`, + { output: [1], argumentTypes: ['Integer'] } + ); + assert.equal( + node.toString(), + 'float kernel(int user_v) {' + '\nreturn abs(float(user_v));' + '\n}' + ); }); test('handles Math.pow with floats', () => { - const node = new WebGLFunctionNode(`function kernel(v, v2) { + const node = new WebGLFunctionNode( + `function kernel(v, v2) { return Math.pow(v, v2); - }`, { output: [1], argumentTypes: ['Number', 'Number'] }); - assert.equal(node.toString(), 'float kernel(float user_v, float user_v2) {' - + '\nreturn _pow(user_v, user_v2);' - + '\n}'); + }`, + { output: [1], argumentTypes: ['Number', 'Number'] } + ); + assert.equal( + node.toString(), + 'float kernel(float user_v, float user_v2) {' + + '\nreturn _pow(user_v, user_v2);' + + '\n}' + ); }); test('handles Math.pow with mixed 1', () => { - const node = new WebGLFunctionNode(`function kernel(v, v2) { + const node = new WebGLFunctionNode( + `function kernel(v, v2) { return Math.pow(v, v2); - }`, { output: [1], argumentTypes: ['Number', 'Integer'] }); - assert.equal(node.toString(), 'float kernel(float user_v, int user_v2) {' - + '\nreturn _pow(user_v, float(user_v2));' - + '\n}'); + }`, + { output: [1], argumentTypes: ['Number', 'Integer'] } + ); + assert.equal( + node.toString(), + 'float kernel(float user_v, int user_v2) {' + + '\nreturn _pow(user_v, float(user_v2));' + + '\n}' + ); }); test('handles Math.pow with mixed 2', () => { - const node = new WebGLFunctionNode(`function kernel(v, v2) { + const node = new WebGLFunctionNode( + `function kernel(v, v2) { return Math.pow(v, v2); - }`, { output: [1], argumentTypes: ['Integer', 'Number'] }); - assert.equal(node.toString(), 'float kernel(int user_v, float user_v2) {' - + '\nreturn _pow(float(user_v), user_v2);' - + '\n}'); + }`, + { output: [1], argumentTypes: ['Integer', 'Number'] } + ); + assert.equal( + node.toString(), + 'float kernel(int user_v, float user_v2) {' + + '\nreturn _pow(float(user_v), user_v2);' + + '\n}' + ); }); test('handles Math.pow with ints', () => { - const node = new WebGLFunctionNode(`function kernel(v, v2) { + const node = new WebGLFunctionNode( + `function kernel(v, v2) { return Math.pow(v, v2); - }`, { output: [1], argumentTypes: ['Integer', 'Integer'] }); - assert.equal(node.toString(), 'float kernel(int user_v, int user_v2) {' - + '\nreturn _pow(float(user_v), float(user_v2));' - + '\n}'); + }`, + { output: [1], argumentTypes: ['Integer', 'Integer'] } + ); + assert.equal( + node.toString(), + 'float kernel(int user_v, int user_v2) {' + + '\nreturn _pow(float(user_v), float(user_v2));' + + '\n}' + ); }); test('handles argument of type Input', () => { let lookupReturnTypeCalls = 0; let lookupFunctionArgumentTypes = 0; - const node = new WebGLFunctionNode('function kernel(v) {' - + '\n return childFunction(v);' - + '\n}', { - output: [1], - argumentTypes: ['Input'], - needsArgumentType: () => false, - lookupReturnType: (functionName) => { - lookupReturnTypeCalls++; - if (functionName === 'childFunction') { - return 'Number'; - } - throw new Error(`unhanded lookupReturnType for ${functionName}`); - }, - lookupFunctionArgumentTypes: (functionName) => { - lookupFunctionArgumentTypes++; - if (functionName === 'childFunction') { - return ['Input']; - } - throw new Error(`unhanded lookupFunctionArgumentTypes for ${functionName}`); - }, - triggerImplyArgumentBitRatio: () => {}, - assignArgumentType: () => {} - }); - assert.equal(node.toString(), 'float kernel(sampler2D user_v,ivec2 user_vSize,ivec3 user_vDim) {' - + '\nreturn childFunction(user_v,user_vSize,user_vDim);' - + '\n}'); + const node = new WebGLFunctionNode( + 'function kernel(v) {' + '\n return childFunction(v);' + '\n}', + { + output: [1], + argumentTypes: ['Input'], + needsArgumentType: () => false, + lookupReturnType: functionName => { + lookupReturnTypeCalls++; + if (functionName === 'childFunction') { + return 'Number'; + } + throw new Error(`unhanded lookupReturnType for ${functionName}`); + }, + lookupFunctionArgumentTypes: functionName => { + lookupFunctionArgumentTypes++; + if (functionName === 'childFunction') { + return ['Input']; + } + throw new Error( + `unhanded lookupFunctionArgumentTypes for ${functionName}` + ); + }, + triggerImplyArgumentBitRatio: () => {}, + assignArgumentType: () => {}, + } + ); + assert.equal( + node.toString(), + 'float kernel(sampler2D user_v,ivec2 user_vSize,ivec3 user_vDim) {' + + '\nreturn childFunction(user_v,user_vSize,user_vDim);' + + '\n}' + ); assert.equal(lookupReturnTypeCalls, 2); assert.equal(lookupFunctionArgumentTypes, 1); }); test('handles argument of type HTMLImageArray', () => { let lookupReturnTypeCalls = 0; let lookupFunctionArgumentTypes = 0; - const node = new WebGLFunctionNode('function kernel(v) {' - + '\n return childFunction(v);' - + '\n}', { - output: [1], - argumentTypes: ['HTMLImageArray'], - needsArgumentType: () => false, - lookupReturnType: (functionName) => { - lookupReturnTypeCalls++; - if (functionName === 'childFunction') { - return 'Number'; - } - throw new Error(`unhanded lookupReturnType for ${functionName}`); - }, - lookupFunctionArgumentTypes: (functionName) => { - lookupFunctionArgumentTypes++; - if (functionName === 'childFunction') { - return ['HTMLImageArray']; - } - throw new Error(`unhanded lookupFunctionArgumentTypes for ${functionName}`); - }, - triggerImplyArgumentBitRatio: () => {}, - assignArgumentType: () => {} - }); - assert.equal(node.toString(), 'float kernel(sampler2DArray user_v,ivec2 user_vSize,ivec3 user_vDim) {' - + '\nreturn childFunction(user_v,user_vSize,user_vDim);' - + '\n}'); + const node = new WebGLFunctionNode( + 'function kernel(v) {' + '\n return childFunction(v);' + '\n}', + { + output: [1], + argumentTypes: ['HTMLImageArray'], + needsArgumentType: () => false, + lookupReturnType: functionName => { + lookupReturnTypeCalls++; + if (functionName === 'childFunction') { + return 'Number'; + } + throw new Error(`unhanded lookupReturnType for ${functionName}`); + }, + lookupFunctionArgumentTypes: functionName => { + lookupFunctionArgumentTypes++; + if (functionName === 'childFunction') { + return ['HTMLImageArray']; + } + throw new Error( + `unhanded lookupFunctionArgumentTypes for ${functionName}` + ); + }, + triggerImplyArgumentBitRatio: () => {}, + assignArgumentType: () => {}, + } + ); + assert.equal( + node.toString(), + 'float kernel(sampler2DArray user_v,ivec2 user_vSize,ivec3 user_vDim) {' + + '\nreturn childFunction(user_v,user_vSize,user_vDim);' + + '\n}' + ); assert.equal(lookupReturnTypeCalls, 2); assert.equal(lookupFunctionArgumentTypes, 1); }); test('handles argument types of CallExpression that return arrays', () => { - const node = new WebGLFunctionNode(`function kernel() { + const node = new WebGLFunctionNode( + `function kernel() { const p = [this.thread.x, this.thread.y]; const z = array2(array2(p, 0.01), 0.02); return 1.0; - }`, { - output: [1, 1], - lookupReturnType: () => 'Number', - needsArgumentType: () => false, - lookupFunctionArgumentTypes: () => [], - triggerImplyArgumentType: () => {} - }); - assert.equal(node.toString(), `float kernel() { + }`, + { + output: [1, 1], + lookupReturnType: () => 'Number', + needsArgumentType: () => false, + lookupFunctionArgumentTypes: () => [], + triggerImplyArgumentType: () => {}, + } + ); + assert.equal( + node.toString(), + `float kernel() { vec2 user_p=vec2(threadId.x, threadId.y); float user_z=array2(array2(user_p, 0.01), 0.02); return 1.0; -}`); +}` + ); }); diff --git a/test/internal/backend/web-gl/function-node/astForStatement.js b/test/internal/backend/web-gl/function-node/astForStatement.js index 787cf692..7b538f9c 100644 --- a/test/internal/backend/web-gl/function-node/astForStatement.js +++ b/test/internal/backend/web-gl/function-node/astForStatement.js @@ -1,30 +1,37 @@ const { assert, test, module: describe, only } = require('qunit'); -const { WebGLFunctionNode } = require(process.cwd() + '/src'); +const { WebGLFunctionNode } = require('../../../../..'); describe('WebGLFunctionNode.astForStatement()'); test('with safe loop with init', () => { - const node = new WebGLFunctionNode(`function kernel() { + const node = new WebGLFunctionNode( + `function kernel() { let sum = 0; for (let i = 0;i < 100; i++) { sum++; } return sum; - }`, { - output: [1] - }); + }`, + { + output: [1], + } + ); - assert.equal(node.toString(), 'float kernel() {' - + '\nint user_sum=0;' - + '\nfor (int user_i=0;(user_i<100);user_i++){' - + '\nuser_sum++;}' - + '\n' - + '\nreturn float(user_sum);' - + '\n}'); + assert.equal( + node.toString(), + 'float kernel() {' + + '\nint user_sum=0;' + + '\nfor (int user_i=0;(user_i<100);user_i++){' + + '\nuser_sum++;}' + + '\n' + + '\nreturn float(user_sum);' + + '\n}' + ); }); test('with safe loop with init and if', () => { - const node = new WebGLFunctionNode(`function kernel() { + const node = new WebGLFunctionNode( + `function kernel() { let sum = 0; for (let i = 0;i < 100; i++) { if (i > 50) { @@ -32,148 +39,183 @@ test('with safe loop with init and if', () => { } } return sum; - }`, { - output: [1] - }); + }`, + { + output: [1], + } + ); - assert.equal(node.toString(), 'float kernel() {' - + '\nint user_sum=0;' - + '\nfor (int user_i=0;(user_i<100);user_i++){' - + '\nif ((user_i>50)){' - + '\nuser_sum++;}' - + '\n}' - + '\n' - + '\nreturn float(user_sum);' - + '\n}'); + assert.equal( + node.toString(), + 'float kernel() {' + + '\nint user_sum=0;' + + '\nfor (int user_i=0;(user_i<100);user_i++){' + + '\nif ((user_i>50)){' + + '\nuser_sum++;}' + + '\n}' + + '\n' + + '\nreturn float(user_sum);' + + '\n}' + ); }); test('with safe loop with no init', () => { - const node = new WebGLFunctionNode(`function kernel() { + const node = new WebGLFunctionNode( + `function kernel() { let sum = 0; const i = 0; for (;i < 100; i++) { sum++; } return sum; - }`, { - output: [1] - }); + }`, + { + output: [1], + } + ); - assert.equal(node.toString(), 'float kernel() {' - + '\nint user_sum=0;' - + '\nint user_i=0;' - + '\nfor (int safeI=0;safeI { - const node = new WebGLFunctionNode(`function kernel() { + const node = new WebGLFunctionNode( + `function kernel() { let sum = 0; for (let i = 0;; i++) { if (i > 100) break; sum++; } return sum; - }`, { - output: [1] - }); + }`, + { + output: [1], + } + ); - assert.equal(node.toString(), 'float kernel() {' - + '\nint user_sum=0;' - + '\nint user_i=0;' - + '\nfor (int safeI=0;safeI100)) {' - + '\nbreak;' - + '\n}' - + '\nuser_sum++;' - + '\nuser_i++;}' - + '\n' - + '\nreturn float(user_sum);' - + '\n}'); + assert.equal( + node.toString(), + 'float kernel() {' + + '\nint user_sum=0;' + + '\nint user_i=0;' + + '\nfor (int safeI=0;safeI100)) {' + + '\nbreak;' + + '\n}' + + '\nuser_sum++;' + + '\nuser_i++;}' + + '\n' + + '\nreturn float(user_sum);' + + '\n}' + ); }); test('with unsafe loop with init', () => { - const node = new WebGLFunctionNode(`function kernel(arg1) { + const node = new WebGLFunctionNode( + `function kernel(arg1) { let sum = 0; for (let i = 0 + arg1;i < 100; i++) { sum++; } return sum; - }`, { - output: [1], - argumentTypes: ['Number'] - }); + }`, + { + output: [1], + argumentTypes: ['Number'], + } + ); - assert.equal(node.toString(), 'float kernel(float user_arg1) {' - + '\nint user_sum=0;' - + '\nfloat user_i=(0.0+user_arg1);' - + '\nfor (int safeI=0;safeI { - const node = new WebGLFunctionNode(`function kernel(arg1) { + const node = new WebGLFunctionNode( + `function kernel(arg1) { let sum = 0; let i = 0 + arg1; for (;i < 100; i++) { sum++; } return sum; - }`, { - output: [1], - argumentTypes: ['Number'] - }); + }`, + { + output: [1], + argumentTypes: ['Number'], + } + ); - assert.equal(node.toString(), 'float kernel(float user_arg1) {' - + '\nint user_sum=0;' - + '\nfloat user_i=(0.0+user_arg1);' - + '\nfor (int safeI=0;safeI { - const node = new WebGLFunctionNode(`function kernel(arg1) { + const node = new WebGLFunctionNode( + `function kernel(arg1) { let sum = 0; let i = 0 + arg1; for (;100 > i; i++) { sum++; } return sum; - }`, { - output: [1], - argumentTypes: ['Number'] - }); + }`, + { + output: [1], + argumentTypes: ['Number'], + } + ); - assert.equal(node.toString(), 'float kernel(float user_arg1) {' - + '\nint user_sum=0;' - + '\nfloat user_i=(0.0+user_arg1);' - + '\nfor (int safeI=0;safeIuser_i)) break;' - + '\nuser_sum++;' - + '\nuser_i++;}' - + '\n' - + '\nreturn float(user_sum);' - + '\n}'); + assert.equal( + node.toString(), + 'float kernel(float user_arg1) {' + + '\nint user_sum=0;' + + '\nfloat user_i=(0.0+user_arg1);' + + '\nfor (int safeI=0;safeIuser_i)) break;' + + '\nuser_sum++;' + + '\nuser_i++;}' + + '\n' + + '\nreturn float(user_sum);' + + '\n}' + ); }); - test('nested safe loop', () => { - const node = new WebGLFunctionNode(`function kernel() { + const node = new WebGLFunctionNode( + `function kernel() { let sum = 0; for (let i = 0; i < 100; i++) { for (let j = 0; j < 100; j++) { @@ -181,23 +223,29 @@ test('nested safe loop', () => { } } return sum; - }`, { - output: [1] - }); + }`, + { + output: [1], + } + ); - assert.equal(node.toString(), 'float kernel() {' - + '\nint user_sum=0;' - + '\nfor (int user_i=0;(user_i<100);user_i++){' - + '\nfor (int user_j=0;(user_j<100);user_j++){' - + '\nuser_sum++;}' - + '\n}' - + '\n' - + '\nreturn float(user_sum);' - + '\n}'); + assert.equal( + node.toString(), + 'float kernel() {' + + '\nint user_sum=0;' + + '\nfor (int user_i=0;(user_i<100);user_i++){' + + '\nfor (int user_j=0;(user_j<100);user_j++){' + + '\nuser_sum++;}' + + '\n}' + + '\n' + + '\nreturn float(user_sum);' + + '\n}' + ); }); test('nested unsafe loop', () => { - const node = new WebGLFunctionNode(`function kernel(arg1, arg2) { + const node = new WebGLFunctionNode( + `function kernel(arg1, arg2) { let sum = 0; for (let i = arg1; i < 100; i++) { for (let j = arg2; j < 100; j++) { @@ -205,89 +253,112 @@ test('nested unsafe loop', () => { } } return sum; - }`, { - argumentTypes: ['Number', 'Number'], - output: [1] - }); + }`, + { + argumentTypes: ['Number', 'Number'], + output: [1], + } + ); - assert.equal(node.toString(), 'float kernel(float user_arg1, float user_arg2) {' - + '\nint user_sum=0;' - + '\nfloat user_i=user_arg1;' - + '\nfor (int safeI2=0;safeI2 { - const node = new WebGLFunctionNode(`function kernel() { + const node = new WebGLFunctionNode( + `function kernel() { let sum = 0; for (let i = 0; i < this.output.x; i++) { sum += 1; } return sum; - }`, { - argumentTypes: [], - output: [1] - }); + }`, + { + argumentTypes: [], + output: [1], + } + ); - assert.equal(node.toString(), 'float kernel() {' - + '\nfloat user_sum=0.0;' - + '\nfor (int user_i=0;(user_i<1);user_i++){' - + '\nuser_sum+=1.0;}' - + '\n' - + '\nreturn user_sum;' - + '\n}'); + assert.equal( + node.toString(), + 'float kernel() {' + + '\nfloat user_sum=0.0;' + + '\nfor (int user_i=0;(user_i<1);user_i++){' + + '\nuser_sum+=1.0;}' + + '\n' + + '\nreturn user_sum;' + + '\n}' + ); }); test('this.thread.x usage inside loop', () => { - const node = new WebGLFunctionNode(`function kernel() { + const node = new WebGLFunctionNode( + `function kernel() { let sum = 0; for (let i = 0; i < this.thread.x; i++) { sum += 1; } return sum; - }`, { - argumentTypes: [], - output: [1] - }); + }`, + { + argumentTypes: [], + output: [1], + } + ); - assert.equal(node.toString(), 'float kernel() {' - + '\nfloat user_sum=0.0;' - + '\nfor (int user_i=0;(user_i { - const node = new WebGLFunctionNode(`function kernel() { + const node = new WebGLFunctionNode( + `function kernel() { let sum = 0; let x = this.thread.x; for (let i = 0; i < x; i++) { sum += 1; } return sum; - }`, { - argumentTypes: [], - output: [1] - }); + }`, + { + argumentTypes: [], + output: [1], + } + ); - assert.equal(node.toString(), 'float kernel() {' - + '\nfloat user_sum=0.0;' - + '\nfloat user_x=float(threadId.x);' - + '\nfor (int user_i=0;(user_i { - assert.equal(run('const value = it', { - argumentNames: ['it'], - argumentTypes: ['Number'] - }), 'float user_value=user_it;'); + assert.equal( + run('const value = it', { + argumentNames: ['it'], + argumentTypes: ['Number'], + }), + 'float user_value=user_it;' + ); }); test('value int', () => { - assert.equal(run('const value = it', { - argumentNames: ['it'], - argumentTypes: ['Integer'] - }), 'float user_value=float(user_it);'); + assert.equal( + run('const value = it', { + argumentNames: ['it'], + argumentTypes: ['Integer'], + }), + 'float user_value=float(user_it);' + ); }); test('value[] float', () => { - assert.equal(run('const value = it[1]', { - argumentNames: ['it'], - argumentTypes: ['Array'], - lookupFunctionArgumentBitRatio: () => 4, - }), 'float user_value=get32(user_it, user_itSize, user_itDim, 0, 0, 1);'); + assert.equal( + run('const value = it[1]', { + argumentNames: ['it'], + argumentTypes: ['Array'], + lookupFunctionArgumentBitRatio: () => 4, + }), + 'float user_value=get32(user_it, user_itSize, user_itDim, 0, 0, 1);' + ); }); test('value[][] float', () => { - assert.equal(run('const value = it[1][2]', { - argumentNames: ['it'], - argumentTypes: ['Array2D'], - lookupFunctionArgumentBitRatio: () => 4, - }), 'float user_value=get32(user_it, user_itSize, user_itDim, 0, 1, 2);'); + assert.equal( + run('const value = it[1][2]', { + argumentNames: ['it'], + argumentTypes: ['Array2D'], + lookupFunctionArgumentBitRatio: () => 4, + }), + 'float user_value=get32(user_it, user_itSize, user_itDim, 0, 1, 2);' + ); }); test('value[][][] float', () => { - assert.equal(run('const value = it[1][2][3]', { - argumentNames: ['it'], - argumentTypes: ['Array3D'], - lookupFunctionArgumentBitRatio: () => 4, - }), 'float user_value=get32(user_it, user_itSize, user_itDim, 1, 2, 3);'); + assert.equal( + run('const value = it[1][2][3]', { + argumentNames: ['it'], + argumentTypes: ['Array3D'], + lookupFunctionArgumentBitRatio: () => 4, + }), + 'float user_value=get32(user_it, user_itSize, user_itDim, 1, 2, 3);' + ); }); test('Array2 value[] from value[]', () => { - assert.equal(run('const value = [arg1[0], arg2[0]];', { - argumentNames: ['arg1', 'arg2'], - argumentTypes: ['Array', 'Array'], - lookupFunctionArgumentBitRatio: () => 4, - }), 'vec2 user_value=vec2(' - + 'get32(user_arg1, user_arg1Size, user_arg1Dim, 0, 0, 0), ' - + 'get32(user_arg2, user_arg2Size, user_arg2Dim, 0, 0, 0)' - + ');'); + assert.equal( + run('const value = [arg1[0], arg2[0]];', { + argumentNames: ['arg1', 'arg2'], + argumentTypes: ['Array', 'Array'], + lookupFunctionArgumentBitRatio: () => 4, + }), + 'vec2 user_value=vec2(' + + 'get32(user_arg1, user_arg1Size, user_arg1Dim, 0, 0, 0), ' + + 'get32(user_arg2, user_arg2Size, user_arg2Dim, 0, 0, 0)' + + ');' + ); }); test('Array3 value[] from value[]', () => { - assert.equal(run('const value = [arg1[0], arg2[0], arg3[0]];', { - argumentNames: ['arg1', 'arg2', 'arg3'], - argumentTypes: ['Array', 'Array', 'Array'], - lookupFunctionArgumentBitRatio: () => 4, - }), 'vec3 user_value=vec3(' - + 'get32(user_arg1, user_arg1Size, user_arg1Dim, 0, 0, 0), ' - + 'get32(user_arg2, user_arg2Size, user_arg2Dim, 0, 0, 0), ' - + 'get32(user_arg3, user_arg3Size, user_arg3Dim, 0, 0, 0)' - + ');'); + assert.equal( + run('const value = [arg1[0], arg2[0], arg3[0]];', { + argumentNames: ['arg1', 'arg2', 'arg3'], + argumentTypes: ['Array', 'Array', 'Array'], + lookupFunctionArgumentBitRatio: () => 4, + }), + 'vec3 user_value=vec3(' + + 'get32(user_arg1, user_arg1Size, user_arg1Dim, 0, 0, 0), ' + + 'get32(user_arg2, user_arg2Size, user_arg2Dim, 0, 0, 0), ' + + 'get32(user_arg3, user_arg3Size, user_arg3Dim, 0, 0, 0)' + + ');' + ); }); test('Array4 value[] from value[]', () => { - assert.equal(run('const value = [arg1[0], arg2[0], arg3[0], arg4[0]];', { - argumentNames: ['arg1', 'arg2', 'arg3', 'arg4'], - argumentTypes: ['Array', 'Array', 'Array', 'Array'], - lookupFunctionArgumentBitRatio: () => 4, - }), 'vec4 user_value=vec4(' - + 'get32(user_arg1, user_arg1Size, user_arg1Dim, 0, 0, 0), ' - + 'get32(user_arg2, user_arg2Size, user_arg2Dim, 0, 0, 0), ' - + 'get32(user_arg3, user_arg3Size, user_arg3Dim, 0, 0, 0), ' - + 'get32(user_arg4, user_arg4Size, user_arg4Dim, 0, 0, 0)' - + ');'); + assert.equal( + run('const value = [arg1[0], arg2[0], arg3[0], arg4[0]];', { + argumentNames: ['arg1', 'arg2', 'arg3', 'arg4'], + argumentTypes: ['Array', 'Array', 'Array', 'Array'], + lookupFunctionArgumentBitRatio: () => 4, + }), + 'vec4 user_value=vec4(' + + 'get32(user_arg1, user_arg1Size, user_arg1Dim, 0, 0, 0), ' + + 'get32(user_arg2, user_arg2Size, user_arg2Dim, 0, 0, 0), ' + + 'get32(user_arg3, user_arg3Size, user_arg3Dim, 0, 0, 0), ' + + 'get32(user_arg4, user_arg4Size, user_arg4Dim, 0, 0, 0)' + + ');' + ); }); test('float, Array2, Array3 chain values', () => { - assert.equal(run('const value1 = 1, ' - + 'value2 = [arg1[0], arg2[0]], ' - + 'value3 = [arg1[0], arg2[0], arg3[0]], ' - + 'value4 = [arg1[0], arg2[0], arg3[0], arg4[0]];', { - argumentNames: ['arg1', 'arg2', 'arg3', 'arg4'], - argumentTypes: ['Array', 'Array', 'Array', 'Array'], - lookupFunctionArgumentBitRatio: () => 4, - }), 'float user_value1=1.0;' - + 'vec2 user_value2=vec2(' - + 'get32(user_arg1, user_arg1Size, user_arg1Dim, 0, 0, 0), ' - + 'get32(user_arg2, user_arg2Size, user_arg2Dim, 0, 0, 0)' - + ');' - + 'vec3 user_value3=vec3(' - + 'get32(user_arg1, user_arg1Size, user_arg1Dim, 0, 0, 0), ' - + 'get32(user_arg2, user_arg2Size, user_arg2Dim, 0, 0, 0), ' - + 'get32(user_arg3, user_arg3Size, user_arg3Dim, 0, 0, 0)' - + ');' - + 'vec4 user_value4=vec4(' - + 'get32(user_arg1, user_arg1Size, user_arg1Dim, 0, 0, 0), ' - + 'get32(user_arg2, user_arg2Size, user_arg2Dim, 0, 0, 0), ' - + 'get32(user_arg3, user_arg3Size, user_arg3Dim, 0, 0, 0), ' - + 'get32(user_arg4, user_arg4Size, user_arg4Dim, 0, 0, 0)' - + ');'); + assert.equal( + run( + 'const value1 = 1, ' + + 'value2 = [arg1[0], arg2[0]], ' + + 'value3 = [arg1[0], arg2[0], arg3[0]], ' + + 'value4 = [arg1[0], arg2[0], arg3[0], arg4[0]];', + { + argumentNames: ['arg1', 'arg2', 'arg3', 'arg4'], + argumentTypes: ['Array', 'Array', 'Array', 'Array'], + lookupFunctionArgumentBitRatio: () => 4, + } + ), + 'float user_value1=1.0;' + + 'vec2 user_value2=vec2(' + + 'get32(user_arg1, user_arg1Size, user_arg1Dim, 0, 0, 0), ' + + 'get32(user_arg2, user_arg2Size, user_arg2Dim, 0, 0, 0)' + + ');' + + 'vec3 user_value3=vec3(' + + 'get32(user_arg1, user_arg1Size, user_arg1Dim, 0, 0, 0), ' + + 'get32(user_arg2, user_arg2Size, user_arg2Dim, 0, 0, 0), ' + + 'get32(user_arg3, user_arg3Size, user_arg3Dim, 0, 0, 0)' + + ');' + + 'vec4 user_value4=vec4(' + + 'get32(user_arg1, user_arg1Size, user_arg1Dim, 0, 0, 0), ' + + 'get32(user_arg2, user_arg2Size, user_arg2Dim, 0, 0, 0), ' + + 'get32(user_arg3, user_arg3Size, user_arg3Dim, 0, 0, 0), ' + + 'get32(user_arg4, user_arg4Size, user_arg4Dim, 0, 0, 0)' + + ');' + ); }); test('float, Array2, Array3, Array4 multiple values', () => { - assert.equal(run('const value1 = 1, ' - + 'value2 = [arg1[0], arg2[0]], ' - + 'value3 = [arg1[0], arg2[0], arg3[0]], ' - + 'value4 = [arg1[0], arg2[0], arg3[0], arg4[0]];', { - argumentNames: ['arg1', 'arg2', 'arg3', 'arg4'], - argumentTypes: ['Array', 'Array', 'Array', 'Array'], - lookupFunctionArgumentBitRatio: () => 4, - }), 'float user_value1=1.0;' - + 'vec2 user_value2=vec2(' - + 'get32(user_arg1, user_arg1Size, user_arg1Dim, 0, 0, 0), ' - + 'get32(user_arg2, user_arg2Size, user_arg2Dim, 0, 0, 0)' - + ');' - + 'vec3 user_value3=vec3(' - + 'get32(user_arg1, user_arg1Size, user_arg1Dim, 0, 0, 0), ' - + 'get32(user_arg2, user_arg2Size, user_arg2Dim, 0, 0, 0), ' - + 'get32(user_arg3, user_arg3Size, user_arg3Dim, 0, 0, 0)' - + ');' - + 'vec4 user_value4=vec4(' - + 'get32(user_arg1, user_arg1Size, user_arg1Dim, 0, 0, 0), ' - + 'get32(user_arg2, user_arg2Size, user_arg2Dim, 0, 0, 0), ' - + 'get32(user_arg3, user_arg3Size, user_arg3Dim, 0, 0, 0), ' - + 'get32(user_arg4, user_arg4Size, user_arg4Dim, 0, 0, 0)' - + ');'); + assert.equal( + run( + 'const value1 = 1, ' + + 'value2 = [arg1[0], arg2[0]], ' + + 'value3 = [arg1[0], arg2[0], arg3[0]], ' + + 'value4 = [arg1[0], arg2[0], arg3[0], arg4[0]];', + { + argumentNames: ['arg1', 'arg2', 'arg3', 'arg4'], + argumentTypes: ['Array', 'Array', 'Array', 'Array'], + lookupFunctionArgumentBitRatio: () => 4, + } + ), + 'float user_value1=1.0;' + + 'vec2 user_value2=vec2(' + + 'get32(user_arg1, user_arg1Size, user_arg1Dim, 0, 0, 0), ' + + 'get32(user_arg2, user_arg2Size, user_arg2Dim, 0, 0, 0)' + + ');' + + 'vec3 user_value3=vec3(' + + 'get32(user_arg1, user_arg1Size, user_arg1Dim, 0, 0, 0), ' + + 'get32(user_arg2, user_arg2Size, user_arg2Dim, 0, 0, 0), ' + + 'get32(user_arg3, user_arg3Size, user_arg3Dim, 0, 0, 0)' + + ');' + + 'vec4 user_value4=vec4(' + + 'get32(user_arg1, user_arg1Size, user_arg1Dim, 0, 0, 0), ' + + 'get32(user_arg2, user_arg2Size, user_arg2Dim, 0, 0, 0), ' + + 'get32(user_arg3, user_arg3Size, user_arg3Dim, 0, 0, 0), ' + + 'get32(user_arg4, user_arg4Size, user_arg4Dim, 0, 0, 0)' + + ');' + ); }); test('float, float, Array4, Array4, Array4 chain values', () => { - assert.equal(run('const value1 = 1, value2 = 1.5, ' - + 'value3 = [arg1[0], arg2[0], arg3[0], arg4[0]], ' - + 'value4 = [arg4[4], arg3[4], arg2[4], arg1[4]], ' - + 'value5 = [arg2[1], arg2[2], arg2[3], arg2[4]];', { - argumentNames: ['arg1', 'arg2', 'arg3', 'arg4'], - argumentTypes: ['Array', 'Array', 'Array', 'Array'], - lookupFunctionArgumentBitRatio: () => 4, - }), 'float user_value1=1.0,user_value2=1.5;' - + 'vec4 user_value3=vec4(' - + 'get32(user_arg1, user_arg1Size, user_arg1Dim, 0, 0, 0), ' - + 'get32(user_arg2, user_arg2Size, user_arg2Dim, 0, 0, 0), ' - + 'get32(user_arg3, user_arg3Size, user_arg3Dim, 0, 0, 0), ' - + 'get32(user_arg4, user_arg4Size, user_arg4Dim, 0, 0, 0)' - + '),' - + 'user_value4=vec4(' - + 'get32(user_arg4, user_arg4Size, user_arg4Dim, 0, 0, 4), ' - + 'get32(user_arg3, user_arg3Size, user_arg3Dim, 0, 0, 4), ' - + 'get32(user_arg2, user_arg2Size, user_arg2Dim, 0, 0, 4), ' - + 'get32(user_arg1, user_arg1Size, user_arg1Dim, 0, 0, 4)' - + '),' - + 'user_value5=vec4(' - + 'get32(user_arg2, user_arg2Size, user_arg2Dim, 0, 0, 1), ' - + 'get32(user_arg2, user_arg2Size, user_arg2Dim, 0, 0, 2), ' - + 'get32(user_arg2, user_arg2Size, user_arg2Dim, 0, 0, 3), ' - + 'get32(user_arg2, user_arg2Size, user_arg2Dim, 0, 0, 4)' - + ');'); + assert.equal( + run( + 'const value1 = 1, value2 = 1.5, ' + + 'value3 = [arg1[0], arg2[0], arg3[0], arg4[0]], ' + + 'value4 = [arg4[4], arg3[4], arg2[4], arg1[4]], ' + + 'value5 = [arg2[1], arg2[2], arg2[3], arg2[4]];', + { + argumentNames: ['arg1', 'arg2', 'arg3', 'arg4'], + argumentTypes: ['Array', 'Array', 'Array', 'Array'], + lookupFunctionArgumentBitRatio: () => 4, + } + ), + 'float user_value1=1.0,user_value2=1.5;' + + 'vec4 user_value3=vec4(' + + 'get32(user_arg1, user_arg1Size, user_arg1Dim, 0, 0, 0), ' + + 'get32(user_arg2, user_arg2Size, user_arg2Dim, 0, 0, 0), ' + + 'get32(user_arg3, user_arg3Size, user_arg3Dim, 0, 0, 0), ' + + 'get32(user_arg4, user_arg4Size, user_arg4Dim, 0, 0, 0)' + + '),' + + 'user_value4=vec4(' + + 'get32(user_arg4, user_arg4Size, user_arg4Dim, 0, 0, 4), ' + + 'get32(user_arg3, user_arg3Size, user_arg3Dim, 0, 0, 4), ' + + 'get32(user_arg2, user_arg2Size, user_arg2Dim, 0, 0, 4), ' + + 'get32(user_arg1, user_arg1Size, user_arg1Dim, 0, 0, 4)' + + '),' + + 'user_value5=vec4(' + + 'get32(user_arg2, user_arg2Size, user_arg2Dim, 0, 0, 1), ' + + 'get32(user_arg2, user_arg2Size, user_arg2Dim, 0, 0, 2), ' + + 'get32(user_arg2, user_arg2Size, user_arg2Dim, 0, 0, 3), ' + + 'get32(user_arg2, user_arg2Size, user_arg2Dim, 0, 0, 4)' + + ');' + ); }); test('float literal, float literal, multiple values', () => { - assert.equal(run('const value1 = 0, ' - + 'value2 = 0;', { - argumentNames: [], - argumentTypes: [] - }), 'float user_value1=0.0,user_value2=0.0;'); + assert.equal( + run('const value1 = 0, ' + 'value2 = 0;', { + argumentNames: [], + argumentTypes: [], + }), + 'float user_value1=0.0,user_value2=0.0;' + ); }); test('float literal, float literal, multiple values', () => { - assert.equal(run('const value1 = 0, ' - + 'value2 = 0;', { - argumentNames: [], - argumentTypes: [] - }), 'float user_value1=0.0,user_value2=0.0;'); + assert.equal( + run('const value1 = 0, ' + 'value2 = 0;', { + argumentNames: [], + argumentTypes: [], + }), + 'float user_value1=0.0,user_value2=0.0;' + ); }); test('this.constant.value throws', () => { @@ -195,61 +244,85 @@ test('this.constant.value throws', () => { test('this.constants.value without constantTypes declared', () => { assert.throws(() => { - run('const value=this.constants.it') + run('const value=this.constants.it'); }); }); test('this.constants.value float', () => { - assert.equal(run('const value = this.constants.it', { - constantTypes: { it: 'Number' } - }), 'float user_value=constants_it;'); + assert.equal( + run('const value = this.constants.it', { + constantTypes: { it: 'Number' }, + }), + 'float user_value=constants_it;' + ); }); test('this.constants.value int', () => { - assert.equal(run('const value = this.constants.it', { - constantTypes: { - it: 'Integer' - } - }), 'float user_value=float(constants_it);'); + assert.equal( + run('const value = this.constants.it', { + constantTypes: { + it: 'Integer', + }, + }), + 'float user_value=float(constants_it);' + ); }); test('this.constants.value[] float', () => { - assert.equal(run('const value = this.constants.it[1]', { - constantTypes: { - it: 'Array' - }, - constantBitRatios: { it: 4 }, - }), 'float user_value=get32(constants_it, constants_itSize, constants_itDim, 0, 0, 1);'); + assert.equal( + run('const value = this.constants.it[1]', { + constantTypes: { + it: 'Array', + }, + constantBitRatios: { it: 4 }, + }), + 'float user_value=get32(constants_it, constants_itSize, constants_itDim, 0, 0, 1);' + ); }); test('this.constants.value[][] float', () => { - assert.equal(run('const value = this.constants.it[1][2]', { - constantTypes: { - it: 'Array2D' - }, - constantBitRatios: { it: 4 }, - }), 'float user_value=get32(constants_it, constants_itSize, constants_itDim, 0, 1, 2);'); + assert.equal( + run('const value = this.constants.it[1][2]', { + constantTypes: { + it: 'Array2D', + }, + constantBitRatios: { it: 4 }, + }), + 'float user_value=get32(constants_it, constants_itSize, constants_itDim, 0, 1, 2);' + ); }); test('this.constants.value[][][] float', () => { - assert.equal(run('const value = this.constants.it[1][2][3]', { - constantTypes: { - it: 'Array3D' - }, - constantBitRatios: { it: 4 }, - }), 'float user_value=get32(constants_it, constants_itSize, constants_itDim, 1, 2, 3);'); + assert.equal( + run('const value = this.constants.it[1][2][3]', { + constantTypes: { + it: 'Array3D', + }, + constantBitRatios: { it: 4 }, + }), + 'float user_value=get32(constants_it, constants_itSize, constants_itDim, 1, 2, 3);' + ); }); test('this.thread.x float', () => { - assert.equal(run('const value = this.thread.x'), 'float user_value=float(threadId.x);'); + assert.equal( + run('const value = this.thread.x'), + 'float user_value=float(threadId.x);' + ); }); test('this.thread.y float', () => { - assert.equal(run('const value = this.thread.y'), 'float user_value=float(threadId.y);'); + assert.equal( + run('const value = this.thread.y'), + 'float user_value=float(threadId.y);' + ); }); test('this.thread.z float', () => { - assert.equal(run('const value = this.thread.z'), 'float user_value=float(threadId.z);'); + assert.equal( + run('const value = this.thread.z'), + 'float user_value=float(threadId.z);' + ); }); test('this.output.x float', () => { @@ -271,9 +344,15 @@ test('this.outputs.z throws', () => { }); test('Math.E Number float', () => { - assert.equal(run('const value = Math.E'), `float user_value=${Math.E.toString()};`); + assert.equal( + run('const value = Math.E'), + `float user_value=${Math.E.toString()};` + ); }); test('Math.E Number float', () => { - assert.equal(run('const value = Math.E'), `float user_value=${Math.E.toString()};`); + assert.equal( + run('const value = Math.E'), + `float user_value=${Math.E.toString()};` + ); }); diff --git a/test/internal/backend/web-gl/function-node/contexts.js b/test/internal/backend/web-gl/function-node/contexts.js index 89699dea..699c0eb1 100644 --- a/test/internal/backend/web-gl/function-node/contexts.js +++ b/test/internal/backend/web-gl/function-node/contexts.js @@ -1,10 +1,11 @@ const { assert, test, module: describe, only } = require('qunit'); -const { WebGLFunctionNode } = require(process.cwd() + '/src'); +const { WebGLFunctionNode } = require('../../../../..'); describe('WebGLFunctionNode.contexts'); test('safe from literal 1', () => { - const node = new WebGLFunctionNode(`function kernel() { + const node = new WebGLFunctionNode( + `function kernel() { const const1 = 1; const const2 = const1 + 2; const const3 = const2 + 3; @@ -12,7 +13,9 @@ test('safe from literal 1', () => { for (let i = 0; i < const3; i++) { sum += const3; } - }`, { output: [1] }); + }`, + { output: [1] } + ); node.toString(); const { const1, const2, const3 } = node.contexts[1]; @@ -22,37 +25,39 @@ test('safe from literal 1', () => { origin: 'literal', value: 1, isSafe: true, - } + }, ]); assert.equal(const2.isSafe, true); assert.deepEqual(const2.dependencies, [ { name: 'const1', origin: 'declaration', - isSafe: true - },{ + isSafe: true, + }, + { origin: 'literal', value: 2, isSafe: true, - } + }, ]); assert.equal(const3.isSafe, true); assert.deepEqual(const3.dependencies, [ { name: 'const2', origin: 'declaration', - isSafe: true - },{ + isSafe: true, + }, + { origin: 'literal', value: 3, isSafe: true, - } + }, ]); }); - test('safe from argument', () => { - const node = new WebGLFunctionNode(`function kernel(arg1) { + const node = new WebGLFunctionNode( + `function kernel(arg1) { const const1 = arg1 + 3; const const2 = const1 + 2; const const3 = const2 + 1; @@ -60,7 +65,9 @@ test('safe from argument', () => { for (let i = 0; i < const3; i++) { sum += const3; } - }`, { output: [1], argumentTypes: ['Number'] }); + }`, + { output: [1], argumentTypes: ['Number'] } + ); node.toString(); const { const1, const2, const3 } = node.contexts[1]; @@ -69,42 +76,45 @@ test('safe from argument', () => { { name: 'arg1', origin: 'argument', - isSafe: false - },{ + isSafe: false, + }, + { origin: 'literal', value: 3, isSafe: true, - } + }, ]); assert.equal(const2.isSafe, false); assert.deepEqual(const2.dependencies, [ { name: 'const1', origin: 'declaration', - isSafe: false - },{ + isSafe: false, + }, + { origin: 'literal', value: 2, isSafe: true, - } + }, ]); assert.equal(const3.isSafe, false); assert.deepEqual(const3.dependencies, [ { name: 'const2', origin: 'declaration', - isSafe: false - },{ + isSafe: false, + }, + { origin: 'literal', value: 1, isSafe: true, - } + }, ]); }); - test('safe from multiplication', () => { - const node = new WebGLFunctionNode(`function kernel() { + const node = new WebGLFunctionNode( + `function kernel() { const const1 = 555; const const2 = const1 + .555; const const3 = const2 * .1; @@ -112,7 +122,9 @@ test('safe from multiplication', () => { for (let i = 0; i < const3; i++) { sum += const3; } - }`, { output: [1] }); + }`, + { output: [1] } + ); node.toString(); const { const1, const2, const3 } = node.contexts[1]; @@ -121,35 +133,37 @@ test('safe from multiplication', () => { origin: 'literal', value: 555, isSafe: true, - } + }, ]); assert.deepEqual(const2.dependencies, [ { name: 'const1', origin: 'declaration', isSafe: true, - },{ + }, + { origin: 'literal', - value: .555, + value: 0.555, isSafe: true, - } + }, ]); assert.deepEqual(const3.dependencies, [ { name: 'const2', origin: 'declaration', isSafe: false, - },{ + }, + { origin: 'literal', - value: .1, + value: 0.1, isSafe: false, - } + }, ]); }); - test('safe from multiplication deep', () => { - const node = new WebGLFunctionNode(`function kernel() { + const node = new WebGLFunctionNode( + `function kernel() { const const1 = 555 * 1; const const2 = const1 + .555; const const3 = .1 - const2; @@ -164,27 +178,32 @@ test('safe from multiplication deep', () => { for (let i = 0; i < const3; i++) { sum += const3; } - }`, { output: [1] }); + }`, + { output: [1] } + ); node.toString(); const { const1, const10 } = node.contexts[1]; - assert.ok(const1.dependencies.every(dependency => dependency.isSafe === false)); + assert.ok( + const1.dependencies.every(dependency => dependency.isSafe === false) + ); assert.deepEqual(const10.dependencies, [ { name: 'const9', origin: 'declaration', isSafe: false, - },{ + }, + { origin: 'literal', value: 10, isSafe: true, - } + }, ]); }); - test('safe from division', () => { - const node = new WebGLFunctionNode(`function kernel() { + const node = new WebGLFunctionNode( + `function kernel() { const const1 = 555; const const2 = const1 + .555; const const3 = const2 / .1; @@ -192,7 +211,9 @@ test('safe from division', () => { for (let i = 0; i < const3; i++) { sum += const3; } - }`, { output: [1] }); + }`, + { output: [1] } + ); node.toString(); const { const1, const2, const3 } = node.contexts[1]; @@ -201,35 +222,37 @@ test('safe from division', () => { origin: 'literal', value: 555, isSafe: true, - } + }, ]); assert.deepEqual(const2.dependencies, [ { name: 'const1', origin: 'declaration', isSafe: true, - },{ + }, + { origin: 'literal', - value: .555, + value: 0.555, isSafe: true, - } + }, ]); assert.deepEqual(const3.dependencies, [ { name: 'const2', origin: 'declaration', isSafe: false, - },{ + }, + { origin: 'literal', - value: .1, + value: 0.1, isSafe: false, - } + }, ]); }); - test('safe from division deep', () => { - const node = new WebGLFunctionNode(`function kernel() { + const node = new WebGLFunctionNode( + `function kernel() { const const1 = 555 / 1; const const2 = const1 + .555; const const3 = .1 - const2; @@ -244,20 +267,25 @@ test('safe from division deep', () => { for (let i = 0; i < const3; i++) { sum += const3; } - }`, { output: [1] }); + }`, + { output: [1] } + ); node.toString(); const { const1, const10 } = node.contexts[1]; - assert.ok(const1.dependencies.every(dependency => dependency.isSafe === false)); + assert.ok( + const1.dependencies.every(dependency => dependency.isSafe === false) + ); assert.deepEqual(const10.dependencies, [ { name: 'const9', origin: 'declaration', isSafe: false, - },{ + }, + { origin: 'literal', value: 10, isSafe: true, - } + }, ]); }); diff --git a/test/internal/backend/web-gl/function-node/firstAvailableTypeFromAst.js b/test/internal/backend/web-gl/function-node/firstAvailableTypeFromAst.js index 9431062d..991501a1 100644 --- a/test/internal/backend/web-gl/function-node/firstAvailableTypeFromAst.js +++ b/test/internal/backend/web-gl/function-node/firstAvailableTypeFromAst.js @@ -1,12 +1,15 @@ const { assert, test, module: describe, only } = require('qunit'); -const { WebGLFunctionNode } = require(process.cwd() + '/src'); +const { WebGLFunctionNode } = require('../../../../..'); describe('WebGLFunctionNode.getType()'); function run(value, settings) { - const node = new WebGLFunctionNode(`function fn(value, value2, value3) { - ${ value }; - }`, Object.assign({ output: [1] }, settings)); + const node = new WebGLFunctionNode( + `function fn(value, value2, value3) { + ${value}; + }`, + Object.assign({ output: [1] }, settings) + ); const ast = node.getJsAST(); node.traceFunctionAST(ast); @@ -32,59 +35,83 @@ test('unknown value from arguments', () => { }); test('value Number from arguments', () => { - assert.equal(run('value', { - argumentNames: ['value'], - argumentTypes: ['Fake Type'] - }), 'Fake Type'); + assert.equal( + run('value', { + argumentNames: ['value'], + argumentTypes: ['Fake Type'], + }), + 'Fake Type' + ); }); test('value[] Number from arguments', () => { - assert.equal(run('value[0]', { - argumentNames: ['value'], - argumentTypes: ['Array'] - }), 'Number'); + assert.equal( + run('value[0]', { + argumentNames: ['value'], + argumentTypes: ['Array'], + }), + 'Number' + ); }); test('value[][] Number from arguments', () => { - assert.equal(run('value[0][0]', { - argumentNames: ['value'], - argumentTypes: ['Array'] - }), 'Number'); + assert.equal( + run('value[0][0]', { + argumentNames: ['value'], + argumentTypes: ['Array'], + }), + 'Number' + ); }); test('value[][][] Number from arguments', () => { - assert.equal(run('value[0][0][0]', { - argumentNames: ['value'], - argumentTypes: ['Array'] - }), 'Number'); + assert.equal( + run('value[0][0][0]', { + argumentNames: ['value'], + argumentTypes: ['Array'], + }), + 'Number' + ); }); test('this.constants.value Integer', () => { - assert.equal(run('this.constants.value', { - constants: { value: 1 }, - constantTypes: { value: 'Integer' } - }), 'Integer'); + assert.equal( + run('this.constants.value', { + constants: { value: 1 }, + constantTypes: { value: 'Integer' }, + }), + 'Integer' + ); }); test('this.constants.value[] Number', () => { - assert.equal(run('this.constants.value[0]', { - constants: { value: [1] }, - constantTypes: { value: 'Array' } - }), 'Number'); + assert.equal( + run('this.constants.value[0]', { + constants: { value: [1] }, + constantTypes: { value: 'Array' }, + }), + 'Number' + ); }); test('this.constants.value[][] Number', () => { - assert.equal(run('this.constants.value[0][0]', { - constants: { value: [[1]] }, - constantTypes: { value: 'Array' } - }), 'Number'); + assert.equal( + run('this.constants.value[0][0]', { + constants: { value: [[1]] }, + constantTypes: { value: 'Array' }, + }), + 'Number' + ); }); test('this.constants.value[][][] Number', () => { - assert.equal(run('this.constants.value[0][0][0]', { - constants: { value: [[[1]]] }, - constantTypes: { value: 'Array' } - }), 'Number'); + assert.equal( + run('this.constants.value[0][0][0]', { + constants: { value: [[[1]]] }, + constantTypes: { value: 'Array' }, + }), + 'Number' + ); }); test('this.thread.x', () => { @@ -130,9 +157,13 @@ test('unknown function call', () => { }); test('function call', () => { - assert.equal(run('value()', { - lookupReturnType: (name, ast, node) => name === 'value' ? 'Fake Type' : null, - }), 'Fake Type'); + assert.equal( + run('value()', { + lookupReturnType: (name, ast, node) => + name === 'value' ? 'Fake Type' : null, + }), + 'Fake Type' + ); }); test('simple unknown expression', () => { @@ -142,23 +173,33 @@ test('simple unknown expression', () => { }); test('simple expression', () => { - assert.equal(run('value + otherValue', { - argumentNames: ['value'], - argumentTypes: ['Number'] - }), 'Number'); + assert.equal( + run('value + otherValue', { + argumentNames: ['value'], + argumentTypes: ['Number'], + }), + 'Number' + ); }); test('simple right expression', () => { - assert.equal(run('value + value2', { - argumentNames: ['value', 'value2'], - argumentTypes: ['Number', 'Number'] - }), 'Number'); + assert.equal( + run('value + value2', { + argumentNames: ['value', 'value2'], + argumentTypes: ['Number', 'Number'], + }), + 'Number' + ); }); test('function call expression', () => { - assert.equal(run('otherFunction() + value', { - lookupReturnType: (name, ast, node) => name === 'otherFunction' ? 'Fake Type' : null, - }), 'Fake Type'); + assert.equal( + run('otherFunction() + value', { + lookupReturnType: (name, ast, node) => + name === 'otherFunction' ? 'Fake Type' : null, + }), + 'Fake Type' + ); }); test('Math.E', () => { @@ -194,73 +235,139 @@ test('Math.LOG10E', () => { }); test('Math.abs(value)', () => { - assert.equal(run('Math.abs(value)', { argumentTypes: ['Number', 'Number', 'Number'] }), 'Number'); + assert.equal( + run('Math.abs(value)', { argumentTypes: ['Number', 'Number', 'Number'] }), + 'Number' + ); }); test('Math.acos(value)', () => { - assert.equal(run('Math.acos(value)', { argumentTypes: ['Number', 'Number', 'Number'] }), 'Number'); + assert.equal( + run('Math.acos(value)', { argumentTypes: ['Number', 'Number', 'Number'] }), + 'Number' + ); }); test('Math.atan(value)', () => { - assert.equal(run('Math.atan(value)', { argumentTypes: ['Number', 'Number', 'Number'] }), 'Number'); + assert.equal( + run('Math.atan(value)', { argumentTypes: ['Number', 'Number', 'Number'] }), + 'Number' + ); }); test('Math.atan2(value, value2)', () => { - assert.equal(run('Math.atan2(value, value2)', { argumentTypes: ['Number', 'Number', 'Number'] }), 'Number'); + assert.equal( + run('Math.atan2(value, value2)', { + argumentTypes: ['Number', 'Number', 'Number'], + }), + 'Number' + ); }); test('Math.ceil(value)', () => { - assert.equal(run('Math.ceil(value)', { argumentTypes: ['Number', 'Number', 'Number'] }), 'Number'); + assert.equal( + run('Math.ceil(value)', { argumentTypes: ['Number', 'Number', 'Number'] }), + 'Number' + ); }); test('Math.cos(value)', () => { - assert.equal(run('Math.cos(value)', { argumentTypes: ['Number', 'Number', 'Number'] }), 'Number'); + assert.equal( + run('Math.cos(value)', { argumentTypes: ['Number', 'Number', 'Number'] }), + 'Number' + ); }); test('Math.exp(value)', () => { - assert.equal(run('Math.exp(value)', { argumentTypes: ['Number', 'Number', 'Number'] }), 'Number'); + assert.equal( + run('Math.exp(value)', { argumentTypes: ['Number', 'Number', 'Number'] }), + 'Number' + ); }); test('Math.floor(value)', () => { - assert.equal(run('Math.floor(value)', { argumentTypes: ['Number', 'Number', 'Number'] }), 'Number'); + assert.equal( + run('Math.floor(value)', { + argumentTypes: ['Number', 'Number', 'Number'], + }), + 'Number' + ); }); test('Math.log(value)', () => { - assert.equal(run('Math.log(value)', { argumentTypes: ['Number', 'Number', 'Number'] }), 'Number'); + assert.equal( + run('Math.log(value)', { argumentTypes: ['Number', 'Number', 'Number'] }), + 'Number' + ); }); test('Math.max(value, value2, value3)', () => { - assert.equal(run('Math.max(value, value2, value3)', { argumentTypes: ['Number', 'Number', 'Number'] }), 'Number'); + assert.equal( + run('Math.max(value, value2, value3)', { + argumentTypes: ['Number', 'Number', 'Number'], + }), + 'Number' + ); }); test('Math.min(value, value2, value3)', () => { - assert.equal(run('Math.min(value, value2, value3)', { argumentTypes: ['Number', 'Number', 'Number'] }), 'Number'); + assert.equal( + run('Math.min(value, value2, value3)', { + argumentTypes: ['Number', 'Number', 'Number'], + }), + 'Number' + ); }); test('Math.pow(value, value2)', () => { - assert.equal(run('Math.pow(value, value2)', { argumentTypes: ['Number', 'Number', 'Number'] }), 'Number'); + assert.equal( + run('Math.pow(value, value2)', { + argumentTypes: ['Number', 'Number', 'Number'], + }), + 'Number' + ); }); test('Math.random()', () => { - assert.equal(run('Math.random()', { argumentTypes: ['Number', 'Number', 'Number'] }), 'Number'); + assert.equal( + run('Math.random()', { argumentTypes: ['Number', 'Number', 'Number'] }), + 'Number' + ); }); test('Math.round(value)', () => { - assert.equal(run('Math.random(value)', { argumentTypes: ['Number', 'Number', 'Number'] }), 'Number'); + assert.equal( + run('Math.random(value)', { + argumentTypes: ['Number', 'Number', 'Number'], + }), + 'Number' + ); }); test('Math.sin(value)', () => { - assert.equal(run('Math.sin(value)', { argumentTypes: ['Number', 'Number', 'Number'] }), 'Number'); + assert.equal( + run('Math.sin(value)', { argumentTypes: ['Number', 'Number', 'Number'] }), + 'Number' + ); }); test('Math.sqrt(value)', () => { - assert.equal(run('Math.sqrt(value)', { argumentTypes: ['Number', 'Number', 'Number'] }), 'Number'); + assert.equal( + run('Math.sqrt(value)', { argumentTypes: ['Number', 'Number', 'Number'] }), + 'Number' + ); }); test('Math.tan(value)', () => { - assert.equal(run('Math.tan(value)', { argumentTypes: ['Number', 'Number', 'Number'] }), 'Number'); + assert.equal( + run('Math.tan(value)', { argumentTypes: ['Number', 'Number', 'Number'] }), + 'Number' + ); }); test('Math.tanh(value)', () => { - assert.equal(run('Math.tanh(value)', { argumentTypes: ['Number', 'Number', 'Number'] }), 'Number'); + assert.equal( + run('Math.tanh(value)', { argumentTypes: ['Number', 'Number', 'Number'] }), + 'Number' + ); }); diff --git a/test/internal/backend/web-gl/function-node/getVariableSignature.js b/test/internal/backend/web-gl/function-node/getVariableSignature.js index a1fb5bfd..486b0945 100644 --- a/test/internal/backend/web-gl/function-node/getVariableSignature.js +++ b/test/internal/backend/web-gl/function-node/getVariableSignature.js @@ -1,18 +1,21 @@ const { assert, test, module: describe, only } = require('qunit'); -const { WebGLFunctionNode } = require(process.cwd() + '/src'); +const { WebGLFunctionNode } = require('../../../../..'); describe('WebGLFunctionNode.getVariableSignature()'); function run(value) { const mockInstance = { source: `function() { ${value}; }`, - traceFunctionAST: () => {} + traceFunctionAST: () => {}, }; const ast = WebGLFunctionNode.prototype.getJsAST.call(mockInstance); const expression = ast.body.body[0].expression; - return WebGLFunctionNode.prototype.getVariableSignature.call({ - isAstVariable: WebGLFunctionNode.prototype.isAstVariable - }, expression); + return WebGLFunctionNode.prototype.getVariableSignature.call( + { + isAstVariable: WebGLFunctionNode.prototype.isAstVariable, + }, + expression + ); } test('value', () => { @@ -83,16 +86,25 @@ test('this.constants.value[][]', () => { assert.equal(run('this.constants.value[0][0]'), 'this.constants.value[][]'); }); test('this.constants.value[][][]', () => { - assert.equal(run('this.constants.value[0][0][0]'), 'this.constants.value[][][]'); + assert.equal( + run('this.constants.value[0][0][0]'), + 'this.constants.value[][][]' + ); }); test('this.constants.texture[this.thread.z][this.thread.y][this.thread.x]', () => { - assert.equal(run('this.constants.texture[this.thread.z][this.thread.y][this.thread.x]'), 'this.constants.value[][][]'); + assert.equal( + run('this.constants.texture[this.thread.z][this.thread.y][this.thread.x]'), + 'this.constants.value[][][]' + ); }); test('this.whatever.value', () => { assert.equal(run('this.whatever.value'), null); }); test('this.constants.value[][][][]', () => { - assert.equal(run('this.constants.value[0][0][0][0]'), 'this.constants.value[][][][]'); + assert.equal( + run('this.constants.value[0][0][0][0]'), + 'this.constants.value[][][][]' + ); }); test('this.constants.value.something', () => { assert.equal(run('this.constants.value.something'), null); @@ -107,7 +119,8 @@ test('this.constants.value[][][][]', () => { assert.equal(run('this.constants.value[0][0][0].something'), null); }); test('complex nested this.constants.value[][][]', () => { - assert.equal(run(` + assert.equal( + run(` this.constants.value[ this.constants.value[i + 1] ] @@ -117,10 +130,13 @@ test('complex nested this.constants.value[][][]', () => { [ this.thread.x - 100 ] -`), 'this.constants.value[][][]'); +`), + 'this.constants.value[][][]' + ); }); test('complex nested with function call this.constants.value[][][]', () => { - assert.equal(run(` + assert.equal( + run(` this.constants.value[ something() ] @@ -130,7 +146,9 @@ test('complex nested with function call this.constants.value[][][]', () => { [ this.thread.x - 100 ] -`), 'this.constants.value[][][]') +`), + 'this.constants.value[][][]' + ); }); test('non-existent something', () => { assert.equal(run('this.constants.value[0][0].something'), null); diff --git a/test/internal/backend/web-gl/function-node/getVariableType.js b/test/internal/backend/web-gl/function-node/getVariableType.js index f8944092..7373e728 100644 --- a/test/internal/backend/web-gl/function-node/getVariableType.js +++ b/test/internal/backend/web-gl/function-node/getVariableType.js @@ -1,5 +1,5 @@ const { assert, test, module: describe, only } = require('qunit'); -const { WebGLFunctionNode, GLKernel } = require(process.cwd() + '/src'); +const { WebGLFunctionNode, GLKernel } = require('../../../../..'); describe('WebGLFunctionNode.getVariableType()'); @@ -7,148 +7,182 @@ test('Native function > detects same native argument type float, and no cast', ( const nativeFunction = `float nativeFunction(float value) { return value + 1.0; }`; const returnType = GLKernel.nativeFunctionReturnType(nativeFunction); const { argumentTypes } = GLKernel.nativeFunctionArguments(nativeFunction); - const node = new WebGLFunctionNode(`function kernel(value) { + const node = new WebGLFunctionNode( + `function kernel(value) { return nativeFunction(value); - }`, { - output: [1], - argumentTypes: ['Number'], - lookupReturnType: (name, ast, node) => { - if (name === 'nativeFunction') return returnType; - throw new Error('unknown function'); - }, - lookupFunctionArgumentTypes: (functionName) => { - if (functionName === 'nativeFunction') return argumentTypes; - throw new Error('unknown function'); - }, - needsArgumentType: () => false - }); + }`, + { + output: [1], + argumentTypes: ['Number'], + lookupReturnType: (name, ast, node) => { + if (name === 'nativeFunction') return returnType; + throw new Error('unknown function'); + }, + lookupFunctionArgumentTypes: functionName => { + if (functionName === 'nativeFunction') return argumentTypes; + throw new Error('unknown function'); + }, + needsArgumentType: () => false, + } + ); - assert.equal(node.toString(), 'float kernel(float user_value) {' - + '\nreturn nativeFunction(user_value);' - + '\n}'); + assert.equal( + node.toString(), + 'float kernel(float user_value) {' + + '\nreturn nativeFunction(user_value);' + + '\n}' + ); }); test('Native function > detects same native argument type int, and no cast', () => { const nativeFunction = `float nativeFunction(int value) { return float(value + 1); }`; const returnType = GLKernel.nativeFunctionReturnType(nativeFunction); const { argumentTypes } = GLKernel.nativeFunctionArguments(nativeFunction); - const node = new WebGLFunctionNode(`function kernel(value) { + const node = new WebGLFunctionNode( + `function kernel(value) { return nativeFunction(value); - }`, { - output: [1], - argumentTypes: ['Integer'], - lookupReturnType: (name, ast, node) => { - if (name === 'nativeFunction') return returnType; - throw new Error('unknown function'); - }, - lookupFunctionArgumentTypes: (functionName) => { - if (functionName === 'nativeFunction') return argumentTypes; - throw new Error('unknown function'); - }, - needsArgumentType: () => false - }); + }`, + { + output: [1], + argumentTypes: ['Integer'], + lookupReturnType: (name, ast, node) => { + if (name === 'nativeFunction') return returnType; + throw new Error('unknown function'); + }, + lookupFunctionArgumentTypes: functionName => { + if (functionName === 'nativeFunction') return argumentTypes; + throw new Error('unknown function'); + }, + needsArgumentType: () => false, + } + ); - assert.equal(node.toString(), 'float kernel(int user_value) {' - + '\nreturn nativeFunction(user_value);' - + '\n}'); + assert.equal( + node.toString(), + 'float kernel(int user_value) {' + + '\nreturn nativeFunction(user_value);' + + '\n}' + ); }); test('Native function > detects different native argument type int from literal, and cast to it from float', () => { const nativeFunction = `float nativeFunction(int value) { return float(value + 1); }`; const returnType = GLKernel.nativeFunctionReturnType(nativeFunction); const { argumentTypes } = GLKernel.nativeFunctionArguments(nativeFunction); - const node = new WebGLFunctionNode(`function kernel(value) { + const node = new WebGLFunctionNode( + `function kernel(value) { return nativeFunction(1.5); - }`, { - output: [1], - argumentTypes: ['Number'], - lookupReturnType: (name, ast, node) => { - if (name === 'nativeFunction') return returnType; - throw new Error('unknown function'); - }, - lookupFunctionArgumentTypes: (functionName) => { - if (functionName === 'nativeFunction') return argumentTypes; - throw new Error('unknown function'); - }, - needsArgumentType: () => false - }); + }`, + { + output: [1], + argumentTypes: ['Number'], + lookupReturnType: (name, ast, node) => { + if (name === 'nativeFunction') return returnType; + throw new Error('unknown function'); + }, + lookupFunctionArgumentTypes: functionName => { + if (functionName === 'nativeFunction') return argumentTypes; + throw new Error('unknown function'); + }, + needsArgumentType: () => false, + } + ); - assert.equal(node.toString(), 'float kernel(float user_value) {' - + '\nreturn nativeFunction(int(1.5));' - + '\n}'); + assert.equal( + node.toString(), + 'float kernel(float user_value) {' + + '\nreturn nativeFunction(int(1.5));' + + '\n}' + ); }); test('Native function > detects different native argument type float from literal, and cast to it from int', () => { const nativeFunction = `float nativeFunction(int value) { return float(value + 1); }`; const returnType = GLKernel.nativeFunctionReturnType(nativeFunction); const { argumentTypes } = GLKernel.nativeFunctionArguments(nativeFunction); - const node = new WebGLFunctionNode(`function kernel(value) { + const node = new WebGLFunctionNode( + `function kernel(value) { return nativeFunction(1); - }`, { - output: [1], - argumentTypes: ['Number'], - lookupReturnType: (name, ast, node) => { - if (name === 'nativeFunction') return returnType; - throw new Error('unknown function'); - }, - lookupFunctionArgumentTypes: (functionName) => { - if (functionName === 'nativeFunction') return argumentTypes; - throw new Error('unknown function'); - }, - needsArgumentType: () => false - }); + }`, + { + output: [1], + argumentTypes: ['Number'], + lookupReturnType: (name, ast, node) => { + if (name === 'nativeFunction') return returnType; + throw new Error('unknown function'); + }, + lookupFunctionArgumentTypes: functionName => { + if (functionName === 'nativeFunction') return argumentTypes; + throw new Error('unknown function'); + }, + needsArgumentType: () => false, + } + ); - assert.equal(node.toString(), 'float kernel(float user_value) {' - + '\nreturn nativeFunction(1);' - + '\n}'); + assert.equal( + node.toString(), + 'float kernel(float user_value) {' + '\nreturn nativeFunction(1);' + '\n}' + ); }); test('Native function > detects different native argument type int, and cast to it from float', () => { const nativeFunction = `float nativeFunction(int value) { return float(value + 1); }`; const returnType = GLKernel.nativeFunctionReturnType(nativeFunction); const { argumentTypes } = GLKernel.nativeFunctionArguments(nativeFunction); - const node = new WebGLFunctionNode(`function kernel(value) { + const node = new WebGLFunctionNode( + `function kernel(value) { return nativeFunction(value); - }`, { - output: [1], - argumentTypes: ['Number'], - lookupReturnType: (name, ast, node) => { - if (name === 'nativeFunction') return returnType; - throw new Error('unknown function'); - }, - lookupFunctionArgumentTypes: (functionName) => { - if (functionName === 'nativeFunction') return argumentTypes; - throw new Error('unknown function'); - }, - needsArgumentType: () => false - }); + }`, + { + output: [1], + argumentTypes: ['Number'], + lookupReturnType: (name, ast, node) => { + if (name === 'nativeFunction') return returnType; + throw new Error('unknown function'); + }, + lookupFunctionArgumentTypes: functionName => { + if (functionName === 'nativeFunction') return argumentTypes; + throw new Error('unknown function'); + }, + needsArgumentType: () => false, + } + ); - assert.equal(node.toString(), 'float kernel(float user_value) {' - + '\nreturn nativeFunction(int(user_value));' - + '\n}'); + assert.equal( + node.toString(), + 'float kernel(float user_value) {' + + '\nreturn nativeFunction(int(user_value));' + + '\n}' + ); }); test('Native function > detects different native argument type float, and cast to it from int', () => { const nativeFunction = `float nativeFunction(float value) { return value + 1.0; }`; const returnType = GLKernel.nativeFunctionReturnType(nativeFunction); const { argumentTypes } = GLKernel.nativeFunctionArguments(nativeFunction); - const node = new WebGLFunctionNode(`function kernel(value) { + const node = new WebGLFunctionNode( + `function kernel(value) { return nativeFunction(value); - }`, { - output: [1], - argumentTypes: ['Integer'], - lookupReturnType: (name, ast, node) => { - if (name === 'nativeFunction') return returnType; - throw new Error('unknown function'); - }, - lookupFunctionArgumentTypes: (functionName) => { - if (functionName === 'nativeFunction') return argumentTypes; - throw new Error('unknown function'); - }, - needsArgumentType: () => false - }); + }`, + { + output: [1], + argumentTypes: ['Integer'], + lookupReturnType: (name, ast, node) => { + if (name === 'nativeFunction') return returnType; + throw new Error('unknown function'); + }, + lookupFunctionArgumentTypes: functionName => { + if (functionName === 'nativeFunction') return argumentTypes; + throw new Error('unknown function'); + }, + needsArgumentType: () => false, + } + ); - assert.equal(node.toString(), 'float kernel(int user_value) {' - + '\nreturn nativeFunction(float(user_value));' - + '\n}'); + assert.equal( + node.toString(), + 'float kernel(int user_value) {' + + '\nreturn nativeFunction(float(user_value));' + + '\n}' + ); }); diff --git a/test/internal/backend/web-gl/kernel-value/dynamic-html-image.js b/test/internal/backend/web-gl/kernel-value/dynamic-html-image.js index 6b38603b..7c472a9c 100644 --- a/test/internal/backend/web-gl/kernel-value/dynamic-html-image.js +++ b/test/internal/backend/web-gl/kernel-value/dynamic-html-image.js @@ -1,5 +1,5 @@ const { assert, skip, test, module: describe, only } = require('qunit'); -const { webGLKernelValueMaps } = require('../../../../../src'); +const { webGLKernelValueMaps } = require('../../../../..'); describe('internal: WebGLKernelValueDynamicHTMLImage'); @@ -10,16 +10,19 @@ test('.updateValue() checks too large height', () => { }, validate: true, }; - const v = new webGLKernelValueMaps.unsigned.dynamic.HTMLImage({ width: 1, height: 1 }, { - kernel: mockKernel, - name: 'test', - type: 'HTMLImage', - origin: 'user', - tactic: 'speed', - onRequestContextHandle: () => 1, - onRequestTexture: () => null, - onRequestIndex: () => 1 - }); + const v = new webGLKernelValueMaps.unsigned.dynamic.HTMLImage( + { width: 1, height: 1 }, + { + kernel: mockKernel, + name: 'test', + type: 'HTMLImage', + origin: 'user', + tactic: 'speed', + onRequestContextHandle: () => 1, + onRequestTexture: () => null, + onRequestIndex: () => 1, + } + ); assert.throws(() => { v.updateValue({ width: 1, height: 2 }); @@ -34,21 +37,24 @@ test('.updateValue() checks too large width', () => { validate: true, }; - const v = new webGLKernelValueMaps.unsigned.dynamic.HTMLImage({ width: 1, height: 1 }, { - kernel: mockKernel, - name: 'test', - type: 'HTMLImage', - origin: 'user', - tactic: 'speed', - onRequestContextHandle: () => 1, - onRequestTexture: () => null, - onRequestIndex: () => 1 - }); + const v = new webGLKernelValueMaps.unsigned.dynamic.HTMLImage( + { width: 1, height: 1 }, + { + kernel: mockKernel, + name: 'test', + type: 'HTMLImage', + origin: 'user', + tactic: 'speed', + onRequestContextHandle: () => 1, + onRequestTexture: () => null, + onRequestIndex: () => 1, + } + ); assert.throws(() => { v.updateValue({ height: 1, width: 2, - }) + }); }, new Error('Argument texture width of 2 larger than maximum size of 1 for your GPU')); }); @@ -69,17 +75,20 @@ test('.updateValue() checks ok height & width', () => { pixelStorei: () => {}, texImage2D: () => {}, }; - const v = new webGLKernelValueMaps.unsigned.dynamic.HTMLImage({ width: 2, height: 2 }, { - kernel: mockKernel, - name: 'test', - type: 'HTMLImage', - origin: 'user', - tactic: 'speed', - context: mockContext, - onRequestContextHandle: () => 1, - onRequestTexture: () => null, - onRequestIndex: () => 1 - }); + const v = new webGLKernelValueMaps.unsigned.dynamic.HTMLImage( + { width: 2, height: 2 }, + { + kernel: mockKernel, + name: 'test', + type: 'HTMLImage', + origin: 'user', + tactic: 'speed', + context: mockContext, + onRequestContextHandle: () => 1, + onRequestTexture: () => null, + onRequestIndex: () => 1, + } + ); v.updateValue({ height: 1, width: 1, diff --git a/test/internal/backend/web-gl/kernel-value/dynamic-memory-optimized-number-texture.js b/test/internal/backend/web-gl/kernel-value/dynamic-memory-optimized-number-texture.js index b0625f66..35f4d7da 100644 --- a/test/internal/backend/web-gl/kernel-value/dynamic-memory-optimized-number-texture.js +++ b/test/internal/backend/web-gl/kernel-value/dynamic-memory-optimized-number-texture.js @@ -1,5 +1,5 @@ const { assert, skip, test, module: describe, only } = require('qunit'); -const { webGLKernelValueMaps } = require('../../../../../src'); +const { webGLKernelValueMaps } = require('../../../../..'); describe('internal: WebGLKernelValueDynamicMemoryOptimizedNumberTexture'); @@ -10,16 +10,20 @@ test('.updateValue() checks too large height', () => { }, validate: true, }; - const v = new webGLKernelValueMaps.unsigned.dynamic.MemoryOptimizedNumberTexture({ size: [1, 1] }, { - kernel: mockKernel, - name: 'test', - type: 'MemoryOptimizedNumberTexture', - origin: 'user', - tactic: 'speed', - onRequestContextHandle: () => 1, - onRequestTexture: () => null, - onRequestIndex: () => 1 - }); + const v = + new webGLKernelValueMaps.unsigned.dynamic.MemoryOptimizedNumberTexture( + { size: [1, 1] }, + { + kernel: mockKernel, + name: 'test', + type: 'MemoryOptimizedNumberTexture', + origin: 'user', + tactic: 'speed', + onRequestContextHandle: () => 1, + onRequestTexture: () => null, + onRequestIndex: () => 1, + } + ); assert.throws(() => { v.updateValue({ size: [1, 2] }); @@ -34,20 +38,24 @@ test('.updateValue() checks too large width', () => { validate: true, }; - const v = new webGLKernelValueMaps.unsigned.dynamic.MemoryOptimizedNumberTexture({ size: [1, 1] }, { - kernel: mockKernel, - name: 'test', - type: 'MemoryOptimizedNumberTexture', - origin: 'user', - tactic: 'speed', - onRequestContextHandle: () => 1, - onRequestTexture: () => null, - onRequestIndex: () => 1 - }); + const v = + new webGLKernelValueMaps.unsigned.dynamic.MemoryOptimizedNumberTexture( + { size: [1, 1] }, + { + kernel: mockKernel, + name: 'test', + type: 'MemoryOptimizedNumberTexture', + origin: 'user', + tactic: 'speed', + onRequestContextHandle: () => 1, + onRequestTexture: () => null, + onRequestIndex: () => 1, + } + ); assert.throws(() => { v.updateValue({ - size: [2,1] - }) + size: [2, 1], + }); }, new Error('Argument texture width of 2 larger than maximum size of 1 for your GPU')); }); @@ -68,22 +76,29 @@ test('.updateValue() checks ok height & width', () => { pixelStorei: () => {}, texImage2D: () => {}, }; - const v = new webGLKernelValueMaps.unsigned.dynamic.MemoryOptimizedNumberTexture({ size: [2,2], context: mockContext }, { - kernel: mockKernel, - name: 'test', - type: 'MemoryOptimizedNumberTexture', - origin: 'user', - tactic: 'speed', - context: mockContext, - onRequestContextHandle: () => 1, - onRequestTexture: () => null, - onRequestIndex: () => 1 - }); + const v = + new webGLKernelValueMaps.unsigned.dynamic.MemoryOptimizedNumberTexture( + { size: [2, 2], context: mockContext }, + { + kernel: mockKernel, + name: 'test', + type: 'MemoryOptimizedNumberTexture', + origin: 'user', + tactic: 'speed', + context: mockContext, + onRequestContextHandle: () => 1, + onRequestTexture: () => null, + onRequestIndex: () => 1, + } + ); v.updateValue({ - size: [1,1], + size: [1, 1], context: mockContext, - texture: {} + texture: {}, }); - assert.equal(v.constructor.name, 'WebGLKernelValueDynamicMemoryOptimizedNumberTexture'); + assert.equal( + v.constructor.name, + 'WebGLKernelValueDynamicMemoryOptimizedNumberTexture' + ); }); diff --git a/test/internal/backend/web-gl/kernel-value/dynamic-number-texture.js b/test/internal/backend/web-gl/kernel-value/dynamic-number-texture.js index 994044f2..3ac27fd4 100644 --- a/test/internal/backend/web-gl/kernel-value/dynamic-number-texture.js +++ b/test/internal/backend/web-gl/kernel-value/dynamic-number-texture.js @@ -1,5 +1,5 @@ const { assert, skip, test, module: describe, only } = require('qunit'); -const { webGLKernelValueMaps } = require('../../../../../src'); +const { webGLKernelValueMaps } = require('../../../../..'); describe('internal: WebGLKernelValueDynamicNumberTexture'); @@ -10,16 +10,19 @@ test('.updateValue() checks too large height', () => { }, validate: true, }; - const v = new webGLKernelValueMaps.unsigned.dynamic.NumberTexture({ size: [1, 1] }, { - kernel: mockKernel, - name: 'test', - type: 'NumberTexture', - origin: 'user', - tactic: 'speed', - onRequestContextHandle: () => 1, - onRequestTexture: () => null, - onRequestIndex: () => 1 - }); + const v = new webGLKernelValueMaps.unsigned.dynamic.NumberTexture( + { size: [1, 1] }, + { + kernel: mockKernel, + name: 'test', + type: 'NumberTexture', + origin: 'user', + tactic: 'speed', + onRequestContextHandle: () => 1, + onRequestTexture: () => null, + onRequestIndex: () => 1, + } + ); assert.throws(() => { v.updateValue({ size: [1, 2] }); @@ -34,20 +37,23 @@ test('.updateValue() checks too large width', () => { validate: true, }; - const v = new webGLKernelValueMaps.unsigned.dynamic.NumberTexture({ size: [1, 1] }, { - kernel: mockKernel, - name: 'test', - type: 'NumberTexture', - origin: 'user', - tactic: 'speed', - onRequestContextHandle: () => 1, - onRequestTexture: () => null, - onRequestIndex: () => 1 - }); + const v = new webGLKernelValueMaps.unsigned.dynamic.NumberTexture( + { size: [1, 1] }, + { + kernel: mockKernel, + name: 'test', + type: 'NumberTexture', + origin: 'user', + tactic: 'speed', + onRequestContextHandle: () => 1, + onRequestTexture: () => null, + onRequestIndex: () => 1, + } + ); assert.throws(() => { v.updateValue({ - size: [2,1] - }) + size: [2, 1], + }); }, new Error('Argument texture width of 2 larger than maximum size of 1 for your GPU')); }); @@ -68,21 +74,24 @@ test('.updateValue() checks ok height & width', () => { pixelStorei: () => {}, texImage2D: () => {}, }; - const v = new webGLKernelValueMaps.unsigned.dynamic.NumberTexture({ size: [2,2], context: mockContext }, { - kernel: mockKernel, - name: 'test', - type: 'NumberTexture', - origin: 'user', - tactic: 'speed', - context: mockContext, - onRequestContextHandle: () => 1, - onRequestTexture: () => null, - onRequestIndex: () => 1 - }); + const v = new webGLKernelValueMaps.unsigned.dynamic.NumberTexture( + { size: [2, 2], context: mockContext }, + { + kernel: mockKernel, + name: 'test', + type: 'NumberTexture', + origin: 'user', + tactic: 'speed', + context: mockContext, + onRequestContextHandle: () => 1, + onRequestTexture: () => null, + onRequestIndex: () => 1, + } + ); v.updateValue({ - size: [1,1], + size: [1, 1], context: mockContext, - texture: {} + texture: {}, }); assert.equal(v.constructor.name, 'WebGLKernelValueDynamicNumberTexture'); diff --git a/test/internal/backend/web-gl/kernel-value/dynamic-single-array.js b/test/internal/backend/web-gl/kernel-value/dynamic-single-array.js index 98104721..17d99e58 100644 --- a/test/internal/backend/web-gl/kernel-value/dynamic-single-array.js +++ b/test/internal/backend/web-gl/kernel-value/dynamic-single-array.js @@ -1,5 +1,5 @@ const { assert, skip, test, module: describe, only } = require('qunit'); -const { webGLKernelValueMaps } = require('../../../../../src'); +const { webGLKernelValueMaps } = require('../../../../..'); describe('internal: WebGLKernelValueDynamicSingleArray'); @@ -10,7 +10,7 @@ test('.updateValue() checks too large', () => { }, validate: true, }; - const v = new webGLKernelValueMaps.single.dynamic.Array([1,2], { + const v = new webGLKernelValueMaps.single.dynamic.Array([1, 2], { kernel: mockKernel, name: 'test', type: 'Array', @@ -18,11 +18,11 @@ test('.updateValue() checks too large', () => { tactic: 'speed', onRequestContextHandle: () => 1, onRequestTexture: () => null, - onRequestIndex: () => 1 + onRequestIndex: () => 1, }); assert.throws(() => { - v.updateValue(new Array([1,2,3,4,5,6,7,8])); + v.updateValue(new Array([1, 2, 3, 4, 5, 6, 7, 8])); }, new Error('Argument texture height of 2 larger than maximum size of 1 for your GPU')); }); @@ -43,7 +43,7 @@ test('.updateValue() checks ok', () => { pixelStorei: () => {}, texImage2D: () => {}, }; - const v = new webGLKernelValueMaps.single.dynamic.Array([1,2], { + const v = new webGLKernelValueMaps.single.dynamic.Array([1, 2], { kernel: mockKernel, name: 'test', type: 'Array', @@ -52,9 +52,9 @@ test('.updateValue() checks ok', () => { context: mockContext, onRequestContextHandle: () => 1, onRequestTexture: () => null, - onRequestIndex: () => 1 + onRequestIndex: () => 1, }); - v.updateValue(new Array([2,1])); + v.updateValue(new Array([2, 1])); assert.equal(v.constructor.name, 'WebGLKernelValueDynamicSingleArray'); }); diff --git a/test/internal/backend/web-gl/kernel-value/dynamic-single-array1d-i.js b/test/internal/backend/web-gl/kernel-value/dynamic-single-array1d-i.js index 2cf1822a..08951fcb 100644 --- a/test/internal/backend/web-gl/kernel-value/dynamic-single-array1d-i.js +++ b/test/internal/backend/web-gl/kernel-value/dynamic-single-array1d-i.js @@ -1,5 +1,5 @@ const { assert, skip, test, module: describe, only } = require('qunit'); -const { webGLKernelValueMaps } = require('../../../../../src'); +const { webGLKernelValueMaps } = require('../../../../..'); describe('internal: WebGLKernelValueDynamicSingleArray1DI'); @@ -10,7 +10,7 @@ test('.updateValue() checks too large', () => { }, validate: true, }; - const v = new webGLKernelValueMaps.single.dynamic["Array1D(2)"]([[1,2]], { + const v = new webGLKernelValueMaps.single.dynamic['Array1D(2)']([[1, 2]], { kernel: mockKernel, name: 'test', type: 'Array1D(2)', @@ -18,11 +18,16 @@ test('.updateValue() checks too large', () => { tactic: 'speed', onRequestContextHandle: () => 1, onRequestTexture: () => null, - onRequestIndex: () => 1 + onRequestIndex: () => 1, }); assert.throws(() => { - v.updateValue([[1,2],[3,4],[5,6],[7,8]]); + v.updateValue([ + [1, 2], + [3, 4], + [5, 6], + [7, 8], + ]); }, new Error('Argument texture height of 2 larger than maximum size of 1 for your GPU')); }); @@ -43,7 +48,7 @@ test('.updateValue() checks ok', () => { pixelStorei: () => {}, texImage2D: () => {}, }; - const v = new webGLKernelValueMaps.single.dynamic["Array1D(2)"]([[1,2]], { + const v = new webGLKernelValueMaps.single.dynamic['Array1D(2)']([[1, 2]], { kernel: mockKernel, name: 'test', type: 'Array1D(2)', @@ -52,9 +57,9 @@ test('.updateValue() checks ok', () => { context: mockContext, onRequestContextHandle: () => 1, onRequestTexture: () => null, - onRequestIndex: () => 1 + onRequestIndex: () => 1, }); - v.updateValue(new Array(new Array([2,1]))); + v.updateValue(new Array(new Array([2, 1]))); assert.equal(v.constructor.name, 'WebGLKernelValueDynamicSingleArray1DI'); }); diff --git a/test/internal/backend/web-gl/kernel-value/dynamic-single-array2d-i.js b/test/internal/backend/web-gl/kernel-value/dynamic-single-array2d-i.js index f1be9d0d..e2e379f8 100644 --- a/test/internal/backend/web-gl/kernel-value/dynamic-single-array2d-i.js +++ b/test/internal/backend/web-gl/kernel-value/dynamic-single-array2d-i.js @@ -1,5 +1,5 @@ const { assert, skip, test, module: describe, only } = require('qunit'); -const { webGLKernelValueMaps } = require('../../../../../src'); +const { webGLKernelValueMaps } = require('../../../../..'); describe('internal: WebGLKernelValueDynamicSingleArray2DI'); @@ -10,7 +10,7 @@ test('.updateValue() checks too large', () => { }, validate: true, }; - const v = new webGLKernelValueMaps.single.dynamic["Array2D(2)"]([[[1,2]]], { + const v = new webGLKernelValueMaps.single.dynamic['Array2D(2)']([[[1, 2]]], { kernel: mockKernel, name: 'test', type: 'Array2D(2)', @@ -18,11 +18,18 @@ test('.updateValue() checks too large', () => { tactic: 'speed', onRequestContextHandle: () => 1, onRequestTexture: () => null, - onRequestIndex: () => 1 + onRequestIndex: () => 1, }); assert.throws(() => { - v.updateValue([[[1,2],[3,4],[5,6],[7,8]]]); + v.updateValue([ + [ + [1, 2], + [3, 4], + [5, 6], + [7, 8], + ], + ]); }, new Error('Argument texture height of 2 larger than maximum size of 1 for your GPU')); }); @@ -43,7 +50,7 @@ test('.updateValue() checks ok', () => { pixelStorei: () => {}, texImage2D: () => {}, }; - const v = new webGLKernelValueMaps.single.dynamic["Array2D(2)"]([[[1,2]]], { + const v = new webGLKernelValueMaps.single.dynamic['Array2D(2)']([[[1, 2]]], { kernel: mockKernel, name: 'test', type: 'Array2D(2)', @@ -52,9 +59,9 @@ test('.updateValue() checks ok', () => { context: mockContext, onRequestContextHandle: () => 1, onRequestTexture: () => null, - onRequestIndex: () => 1 + onRequestIndex: () => 1, }); - v.updateValue([[[2,1]]]); + v.updateValue([[[2, 1]]]); assert.equal(v.constructor.name, 'WebGLKernelValueDynamicSingleArray2DI'); }); diff --git a/test/internal/backend/web-gl/kernel-value/dynamic-single-array3d-i.js b/test/internal/backend/web-gl/kernel-value/dynamic-single-array3d-i.js index 84c8afa3..b96923f9 100644 --- a/test/internal/backend/web-gl/kernel-value/dynamic-single-array3d-i.js +++ b/test/internal/backend/web-gl/kernel-value/dynamic-single-array3d-i.js @@ -1,5 +1,5 @@ const { assert, skip, test, module: describe, only } = require('qunit'); -const { webGLKernelValueMaps } = require('../../../../../src'); +const { webGLKernelValueMaps } = require('../../../../..'); describe('internal: WebGLKernelValueDynamicSingleArray3DI'); @@ -10,19 +10,31 @@ test('.updateValue() checks too large', () => { }, validate: true, }; - const v = new webGLKernelValueMaps.single.dynamic["Array3D(2)"]([[[[1,2]]]], { - kernel: mockKernel, - name: 'test', - type: 'Array3D(2)', - origin: 'user', - tactic: 'speed', - onRequestContextHandle: () => 1, - onRequestTexture: () => null, - onRequestIndex: () => 1 - }); + const v = new webGLKernelValueMaps.single.dynamic['Array3D(2)']( + [[[[1, 2]]]], + { + kernel: mockKernel, + name: 'test', + type: 'Array3D(2)', + origin: 'user', + tactic: 'speed', + onRequestContextHandle: () => 1, + onRequestTexture: () => null, + onRequestIndex: () => 1, + } + ); assert.throws(() => { - v.updateValue([[[[1,2],[3,4],[5,6],[7,8]]]]); + v.updateValue([ + [ + [ + [1, 2], + [3, 4], + [5, 6], + [7, 8], + ], + ], + ]); }, new Error('Argument texture height of 2 larger than maximum size of 1 for your GPU')); }); @@ -43,18 +55,21 @@ test('.updateValue() checks ok', () => { pixelStorei: () => {}, texImage2D: () => {}, }; - const v = new webGLKernelValueMaps.single.dynamic["Array3D(2)"]([[[[1,2]]]], { - kernel: mockKernel, - name: 'test', - type: 'Array3D(2)', - origin: 'user', - tactic: 'speed', - context: mockContext, - onRequestContextHandle: () => 1, - onRequestTexture: () => null, - onRequestIndex: () => 1 - }); - v.updateValue([[[[2,1]]]]); + const v = new webGLKernelValueMaps.single.dynamic['Array3D(2)']( + [[[[1, 2]]]], + { + kernel: mockKernel, + name: 'test', + type: 'Array3D(2)', + origin: 'user', + tactic: 'speed', + context: mockContext, + onRequestContextHandle: () => 1, + onRequestTexture: () => null, + onRequestIndex: () => 1, + } + ); + v.updateValue([[[[2, 1]]]]); assert.equal(v.constructor.name, 'WebGLKernelValueDynamicSingleArray3DI'); }); diff --git a/test/internal/backend/web-gl/kernel-value/dynamic-single-input.js b/test/internal/backend/web-gl/kernel-value/dynamic-single-input.js index 3d7d1648..9fee9d63 100644 --- a/test/internal/backend/web-gl/kernel-value/dynamic-single-input.js +++ b/test/internal/backend/web-gl/kernel-value/dynamic-single-input.js @@ -1,5 +1,5 @@ const { assert, skip, test, module: describe, only } = require('qunit'); -const { webGLKernelValueMaps } = require('../../../../../src'); +const { webGLKernelValueMaps } = require('../../../../..'); describe('internal: WebGLKernelValueDynamicSingleInput'); @@ -10,19 +10,22 @@ test('.updateValue() checks too large height', () => { }, validate: true, }; - const v = new webGLKernelValueMaps.single.dynamic.Input({ size: [1, 1], value: [0] }, { - kernel: mockKernel, - name: 'test', - type: 'Input', - origin: 'user', - tactic: 'speed', - onRequestContextHandle: () => 1, - onRequestTexture: () => null, - onRequestIndex: () => 1 - }); + const v = new webGLKernelValueMaps.single.dynamic.Input( + { size: [1, 1], value: [0] }, + { + kernel: mockKernel, + name: 'test', + type: 'Input', + origin: 'user', + tactic: 'speed', + onRequestContextHandle: () => 1, + onRequestTexture: () => null, + onRequestIndex: () => 1, + } + ); assert.throws(() => { - v.updateValue({ size: [4,4] }); + v.updateValue({ size: [4, 4] }); }, new Error('Argument texture height and width of 2 larger than maximum size of 1 for your GPU')); }); @@ -34,20 +37,23 @@ test('.updateValue() checks too large width', () => { validate: true, }; - const v = new webGLKernelValueMaps.single.dynamic.Input({ size: [1, 1], value: [0] }, { - kernel: mockKernel, - name: 'test', - type: 'Input', - origin: 'user', - tactic: 'speed', - onRequestContextHandle: () => 1, - onRequestTexture: () => null, - onRequestIndex: () => 1 - }); + const v = new webGLKernelValueMaps.single.dynamic.Input( + { size: [1, 1], value: [0] }, + { + kernel: mockKernel, + name: 'test', + type: 'Input', + origin: 'user', + tactic: 'speed', + onRequestContextHandle: () => 1, + onRequestTexture: () => null, + onRequestIndex: () => 1, + } + ); assert.throws(() => { v.updateValue({ - size: [3,3] - }) + size: [3, 3], + }); }, new Error('Argument texture width of 3 larger than maximum size of 1 for your GPU')); }); @@ -68,21 +74,24 @@ test('.updateValue() checks ok height & width', () => { pixelStorei: () => {}, texImage2D: () => {}, }; - const v = new webGLKernelValueMaps.single.dynamic.Input({ size: [2,2], context: mockContext, value: [0] }, { - kernel: mockKernel, - name: 'test', - type: 'Input', - origin: 'user', - tactic: 'speed', - context: mockContext, - onRequestContextHandle: () => 1, - onRequestTexture: () => null, - onRequestIndex: () => 1 - }); + const v = new webGLKernelValueMaps.single.dynamic.Input( + { size: [2, 2], context: mockContext, value: [0] }, + { + kernel: mockKernel, + name: 'test', + type: 'Input', + origin: 'user', + tactic: 'speed', + context: mockContext, + onRequestContextHandle: () => 1, + onRequestTexture: () => null, + onRequestIndex: () => 1, + } + ); v.updateValue({ - size: [1,1], + size: [1, 1], context: mockContext, - value: [0] + value: [0], }); assert.equal(v.constructor.name, 'WebGLKernelValueDynamicSingleInput'); diff --git a/test/internal/backend/web-gl/kernel-value/dynamic-unsigned-array.js b/test/internal/backend/web-gl/kernel-value/dynamic-unsigned-array.js index de73bd30..e28786ad 100644 --- a/test/internal/backend/web-gl/kernel-value/dynamic-unsigned-array.js +++ b/test/internal/backend/web-gl/kernel-value/dynamic-unsigned-array.js @@ -1,5 +1,5 @@ const { assert, skip, test, module: describe, only } = require('qunit'); -const { webGLKernelValueMaps } = require('../../../../../src'); +const { webGLKernelValueMaps } = require('../../../../..'); describe('internal: WebGLKernelValueDynamicUnsignedArray'); @@ -10,7 +10,7 @@ test('.updateValue() checks too large', () => { }, validate: true, }; - const v = new webGLKernelValueMaps.unsigned.dynamic.Array([1,2], { + const v = new webGLKernelValueMaps.unsigned.dynamic.Array([1, 2], { kernel: mockKernel, name: 'test', type: 'Array', @@ -18,11 +18,11 @@ test('.updateValue() checks too large', () => { tactic: 'speed', onRequestContextHandle: () => 1, onRequestTexture: () => null, - onRequestIndex: () => 1 + onRequestIndex: () => 1, }); assert.throws(() => { - v.updateValue(new Array([1,2,3,4,5,6,7,8])); + v.updateValue(new Array([1, 2, 3, 4, 5, 6, 7, 8])); }, new Error('Argument texture width of 4 larger than maximum size of 2 for your GPU')); }); @@ -43,7 +43,7 @@ test('.updateValue() checks ok', () => { pixelStorei: () => {}, texImage2D: () => {}, }; - const v = new webGLKernelValueMaps.unsigned.dynamic.Array([1,2], { + const v = new webGLKernelValueMaps.unsigned.dynamic.Array([1, 2], { kernel: mockKernel, name: 'test', type: 'Array', @@ -52,9 +52,9 @@ test('.updateValue() checks ok', () => { context: mockContext, onRequestContextHandle: () => 1, onRequestTexture: () => null, - onRequestIndex: () => 1 + onRequestIndex: () => 1, }); - v.updateValue(new Array([2,1])); + v.updateValue(new Array([2, 1])); assert.equal(v.constructor.name, 'WebGLKernelValueDynamicUnsignedArray'); }); diff --git a/test/internal/backend/web-gl/kernel-value/dynamic-unsigned-input.js b/test/internal/backend/web-gl/kernel-value/dynamic-unsigned-input.js index b0bdeb00..a5ac6c59 100644 --- a/test/internal/backend/web-gl/kernel-value/dynamic-unsigned-input.js +++ b/test/internal/backend/web-gl/kernel-value/dynamic-unsigned-input.js @@ -1,5 +1,5 @@ const { assert, skip, test, module: describe, only } = require('qunit'); -const { webGLKernelValueMaps } = require('../../../../../src'); +const { webGLKernelValueMaps } = require('../../../../..'); describe('internal: WebGLKernelValueUnsignedSingleInput'); @@ -11,20 +11,23 @@ test('.updateValue() checks too large', () => { validate: true, }; - const v = new webGLKernelValueMaps.unsigned.dynamic.Input({ size: [1, 1], value: [0] }, { - kernel: mockKernel, - name: 'test', - type: 'Input', - origin: 'user', - tactic: 'speed', - onRequestContextHandle: () => 1, - onRequestTexture: () => null, - onRequestIndex: () => 1 - }); + const v = new webGLKernelValueMaps.unsigned.dynamic.Input( + { size: [1, 1], value: [0] }, + { + kernel: mockKernel, + name: 'test', + type: 'Input', + origin: 'user', + tactic: 'speed', + onRequestContextHandle: () => 1, + onRequestTexture: () => null, + onRequestIndex: () => 1, + } + ); assert.throws(() => { v.updateValue({ - size: [8,8], - value: [0] + size: [8, 8], + value: [0], }); }, new Error('Argument texture height and width of 8 larger than maximum size of 4 for your GPU')); }); @@ -46,21 +49,24 @@ test('.updateValue() checks ok', () => { pixelStorei: () => {}, texImage2D: () => {}, }; - const v = new webGLKernelValueMaps.unsigned.dynamic.Input({ size: [2,2], context: mockContext, value: [0] }, { - kernel: mockKernel, - name: 'test', - type: 'Input', - origin: 'user', - tactic: 'speed', - context: mockContext, - onRequestContextHandle: () => 1, - onRequestTexture: () => null, - onRequestIndex: () => 1 - }); + const v = new webGLKernelValueMaps.unsigned.dynamic.Input( + { size: [2, 2], context: mockContext, value: [0] }, + { + kernel: mockKernel, + name: 'test', + type: 'Input', + origin: 'user', + tactic: 'speed', + context: mockContext, + onRequestContextHandle: () => 1, + onRequestTexture: () => null, + onRequestIndex: () => 1, + } + ); v.updateValue({ - size: [1,1], + size: [1, 1], context: mockContext, - value: [0] + value: [0], }); assert.equal(v.constructor.name, 'WebGLKernelValueDynamicUnsignedInput'); }); diff --git a/test/internal/backend/web-gl/kernel-value/html-image.js b/test/internal/backend/web-gl/kernel-value/html-image.js index 2ab7805e..6326ba43 100644 --- a/test/internal/backend/web-gl/kernel-value/html-image.js +++ b/test/internal/backend/web-gl/kernel-value/html-image.js @@ -1,5 +1,5 @@ const { assert, skip, test, module: describe, only } = require('qunit'); -const { webGLKernelValueMaps } = require('../../../../../src'); +const { webGLKernelValueMaps } = require('../../../../..'); describe('internal: WebGLKernelValueHTMLImage'); @@ -11,16 +11,19 @@ test('.constructor() checks too large height', () => { validate: true, }; assert.throws(() => { - new webGLKernelValueMaps.unsigned.static.HTMLImage({ width: 1, height: 2 }, { - kernel: mockKernel, - name: 'test', - type: 'HTMLImage', - origin: 'user', - tactic: 'speed', - onRequestContextHandle: () => 1, - onRequestTexture: () => null, - onRequestIndex: () => 1 - }); + new webGLKernelValueMaps.unsigned.static.HTMLImage( + { width: 1, height: 2 }, + { + kernel: mockKernel, + name: 'test', + type: 'HTMLImage', + origin: 'user', + tactic: 'speed', + onRequestContextHandle: () => 1, + onRequestTexture: () => null, + onRequestIndex: () => 1, + } + ); }, new Error('Argument texture height of 2 larger than maximum size of 1 for your GPU')); }); @@ -32,16 +35,19 @@ test('.constructor() checks too large width', () => { validate: true, }; assert.throws(() => { - new webGLKernelValueMaps.unsigned.static.HTMLImage({ width: 2, height: 1 }, { - kernel: mockKernel, - name: 'test', - type: 'HTMLImage', - origin: 'user', - tactic: 'speed', - onRequestContextHandle: () => 1, - onRequestTexture: () => null, - onRequestIndex: () => 1 - }); + new webGLKernelValueMaps.unsigned.static.HTMLImage( + { width: 2, height: 1 }, + { + kernel: mockKernel, + name: 'test', + type: 'HTMLImage', + origin: 'user', + tactic: 'speed', + onRequestContextHandle: () => 1, + onRequestTexture: () => null, + onRequestIndex: () => 1, + } + ); }, new Error('Argument texture width of 2 larger than maximum size of 1 for your GPU')); }); @@ -52,15 +58,18 @@ test('.constructor() checks ok height & width', () => { }, validate: true, }; - const v = new webGLKernelValueMaps.unsigned.static.HTMLImage({ width: 2, height: 2 }, { - kernel: mockKernel, - name: 'test', - type: 'HTMLImage', - origin: 'user', - tactic: 'speed', - onRequestContextHandle: () => 1, - onRequestTexture: () => null, - onRequestIndex: () => 1 - }); + const v = new webGLKernelValueMaps.unsigned.static.HTMLImage( + { width: 2, height: 2 }, + { + kernel: mockKernel, + name: 'test', + type: 'HTMLImage', + origin: 'user', + tactic: 'speed', + onRequestContextHandle: () => 1, + onRequestTexture: () => null, + onRequestIndex: () => 1, + } + ); assert.equal(v.constructor.name, 'WebGLKernelValueHTMLImage'); }); diff --git a/test/internal/backend/web-gl/kernel-value/memory-optimized-number-texture.js b/test/internal/backend/web-gl/kernel-value/memory-optimized-number-texture.js index f399dce3..093ac310 100644 --- a/test/internal/backend/web-gl/kernel-value/memory-optimized-number-texture.js +++ b/test/internal/backend/web-gl/kernel-value/memory-optimized-number-texture.js @@ -1,5 +1,5 @@ const { assert, skip, test, module: describe, only } = require('qunit'); -const { webGLKernelValueMaps } = require('../../../../../src'); +const { webGLKernelValueMaps } = require('../../../../..'); describe('internal: WebGLKernelValueMemoryOptimizedNumberTexture'); @@ -11,16 +11,19 @@ test('.constructor() checks too large height', () => { validate: true, }; assert.throws(() => { - new webGLKernelValueMaps.unsigned.static.MemoryOptimizedNumberTexture({ size: [1, 2] }, { - kernel: mockKernel, - name: 'test', - type: 'MemoryOptimizedNumberTexture', - origin: 'user', - tactic: 'speed', - onRequestContextHandle: () => 1, - onRequestTexture: () => null, - onRequestIndex: () => 1 - }); + new webGLKernelValueMaps.unsigned.static.MemoryOptimizedNumberTexture( + { size: [1, 2] }, + { + kernel: mockKernel, + name: 'test', + type: 'MemoryOptimizedNumberTexture', + origin: 'user', + tactic: 'speed', + onRequestContextHandle: () => 1, + onRequestTexture: () => null, + onRequestIndex: () => 1, + } + ); }, new Error('Argument texture height of 2 larger than maximum size of 1 for your GPU')); }); @@ -33,16 +36,19 @@ test('.constructor() checks too large width', () => { }; assert.throws(() => { - new webGLKernelValueMaps.unsigned.static.MemoryOptimizedNumberTexture({ size: [2, 1] }, { - kernel: mockKernel, - name: 'test', - type: 'MemoryOptimizedNumberTexture', - origin: 'user', - tactic: 'speed', - onRequestContextHandle: () => 1, - onRequestTexture: () => null, - onRequestIndex: () => 1 - }); + new webGLKernelValueMaps.unsigned.static.MemoryOptimizedNumberTexture( + { size: [2, 1] }, + { + kernel: mockKernel, + name: 'test', + type: 'MemoryOptimizedNumberTexture', + origin: 'user', + tactic: 'speed', + onRequestContextHandle: () => 1, + onRequestTexture: () => null, + onRequestIndex: () => 1, + } + ); }, new Error('Argument texture width of 2 larger than maximum size of 1 for your GPU')); }); @@ -63,18 +69,25 @@ test('.constructor() checks ok height & width', () => { pixelStorei: () => {}, texImage2D: () => {}, }; - const v = new webGLKernelValueMaps.unsigned.static.MemoryOptimizedNumberTexture({ size: [2,2], context: mockContext }, { - kernel: mockKernel, - name: 'test', - type: 'MemoryOptimizedNumberTexture', - origin: 'user', - tactic: 'speed', - context: mockContext, - onRequestContextHandle: () => 1, - onRequestTexture: () => null, - onRequestIndex: () => 1 - }); - assert.equal(v.constructor.name, 'WebGLKernelValueMemoryOptimizedNumberTexture'); + const v = + new webGLKernelValueMaps.unsigned.static.MemoryOptimizedNumberTexture( + { size: [2, 2], context: mockContext }, + { + kernel: mockKernel, + name: 'test', + type: 'MemoryOptimizedNumberTexture', + origin: 'user', + tactic: 'speed', + context: mockContext, + onRequestContextHandle: () => 1, + onRequestTexture: () => null, + onRequestIndex: () => 1, + } + ); + assert.equal( + v.constructor.name, + 'WebGLKernelValueMemoryOptimizedNumberTexture' + ); }); test('.updateValue() should set uploadValue when a pipeline kernel has no texture', () => { @@ -95,19 +108,27 @@ test('.updateValue() should set uploadValue when a pipeline kernel has no textur pixelStorei: () => {}, texImage2D: () => {}, }; - const v = new webGLKernelValueMaps.unsigned.static.MemoryOptimizedNumberTexture({ size: [2,2], context: mockContext }, { - kernel: mockKernel, - name: 'test', - type: 'MemoryOptimizedNumberTexture', - origin: 'user', - tactic: 'speed', + const v = + new webGLKernelValueMaps.unsigned.static.MemoryOptimizedNumberTexture( + { size: [2, 2], context: mockContext }, + { + kernel: mockKernel, + name: 'test', + type: 'MemoryOptimizedNumberTexture', + origin: 'user', + tactic: 'speed', + context: mockContext, + onRequestContextHandle: () => 1, + onRequestTexture: () => null, + onRequestIndex: () => 1, + } + ); + + const newMockTexture = {}; + v.updateValue({ + size: [2, 2], context: mockContext, - onRequestContextHandle: () => 1, - onRequestTexture: () => null, - onRequestIndex: () => 1 + texture: newMockTexture, }); - - const newMockTexture = {} - v.updateValue({ size: [2,2], context: mockContext, texture: newMockTexture }) - assert.equal(v.uploadValue, newMockTexture) + assert.equal(v.uploadValue, newMockTexture); }); diff --git a/test/internal/backend/web-gl/kernel-value/number-texture.js b/test/internal/backend/web-gl/kernel-value/number-texture.js index 86902f06..9efafdb5 100644 --- a/test/internal/backend/web-gl/kernel-value/number-texture.js +++ b/test/internal/backend/web-gl/kernel-value/number-texture.js @@ -1,5 +1,5 @@ const { assert, skip, test, module: describe, only } = require('qunit'); -const { webGLKernelValueMaps } = require('../../../../../src'); +const { webGLKernelValueMaps } = require('../../../../..'); describe('internal: WebGLKernelValueNumberTexture'); @@ -11,16 +11,19 @@ test('.constructor() checks too large height', () => { validate: true, }; assert.throws(() => { - new webGLKernelValueMaps.unsigned.static.NumberTexture({ size: [1, 2] }, { - kernel: mockKernel, - name: 'test', - type: 'NumberTexture', - origin: 'user', - tactic: 'speed', - onRequestContextHandle: () => 1, - onRequestTexture: () => null, - onRequestIndex: () => 1 - }); + new webGLKernelValueMaps.unsigned.static.NumberTexture( + { size: [1, 2] }, + { + kernel: mockKernel, + name: 'test', + type: 'NumberTexture', + origin: 'user', + tactic: 'speed', + onRequestContextHandle: () => 1, + onRequestTexture: () => null, + onRequestIndex: () => 1, + } + ); }, new Error('Argument texture height of 2 larger than maximum size of 1 for your GPU')); }); @@ -33,16 +36,19 @@ test('.constructor() checks too large width', () => { }; assert.throws(() => { - new webGLKernelValueMaps.unsigned.static.NumberTexture({ size: [2, 1] }, { - kernel: mockKernel, - name: 'test', - type: 'NumberTexture', - origin: 'user', - tactic: 'speed', - onRequestContextHandle: () => 1, - onRequestTexture: () => null, - onRequestIndex: () => 1 - }); + new webGLKernelValueMaps.unsigned.static.NumberTexture( + { size: [2, 1] }, + { + kernel: mockKernel, + name: 'test', + type: 'NumberTexture', + origin: 'user', + tactic: 'speed', + onRequestContextHandle: () => 1, + onRequestTexture: () => null, + onRequestIndex: () => 1, + } + ); }, new Error('Argument texture width of 2 larger than maximum size of 1 for your GPU')); }); @@ -63,17 +69,20 @@ test('.constructor() checks ok height & width', () => { pixelStorei: () => {}, texImage2D: () => {}, }; - const v = new webGLKernelValueMaps.unsigned.static.NumberTexture({ size: [2,2], context: mockContext }, { - kernel: mockKernel, - name: 'test', - type: 'NumberTexture', - origin: 'user', - tactic: 'speed', - context: mockContext, - onRequestContextHandle: () => 1, - onRequestTexture: () => null, - onRequestIndex: () => 1 - }); + const v = new webGLKernelValueMaps.unsigned.static.NumberTexture( + { size: [2, 2], context: mockContext }, + { + kernel: mockKernel, + name: 'test', + type: 'NumberTexture', + origin: 'user', + tactic: 'speed', + context: mockContext, + onRequestContextHandle: () => 1, + onRequestTexture: () => null, + onRequestIndex: () => 1, + } + ); assert.equal(v.constructor.name, 'WebGLKernelValueNumberTexture'); }); @@ -95,19 +104,26 @@ test('.updateValue() should set uploadValue when a pipeline kernel has no textur pixelStorei: () => {}, texImage2D: () => {}, }; - const v = new webGLKernelValueMaps.unsigned.static.NumberTexture({ size: [2,2], context: mockContext }, { - kernel: mockKernel, - name: 'test', - type: 'NumberTexture', - origin: 'user', - tactic: 'speed', + const v = new webGLKernelValueMaps.unsigned.static.NumberTexture( + { size: [2, 2], context: mockContext }, + { + kernel: mockKernel, + name: 'test', + type: 'NumberTexture', + origin: 'user', + tactic: 'speed', + context: mockContext, + onRequestContextHandle: () => 1, + onRequestTexture: () => null, + onRequestIndex: () => 1, + } + ); + + const newMockTexture = {}; + v.updateValue({ + size: [2, 2], context: mockContext, - onRequestContextHandle: () => 1, - onRequestTexture: () => null, - onRequestIndex: () => 1 + texture: newMockTexture, }); - - const newMockTexture = {} - v.updateValue({ size: [2,2], context: mockContext, texture: newMockTexture }) - assert.equal(v.uploadValue, newMockTexture) + assert.equal(v.uploadValue, newMockTexture); }); diff --git a/test/internal/backend/web-gl/kernel-value/single-array.js b/test/internal/backend/web-gl/kernel-value/single-array.js index eb4a33a8..02b5ecf1 100644 --- a/test/internal/backend/web-gl/kernel-value/single-array.js +++ b/test/internal/backend/web-gl/kernel-value/single-array.js @@ -1,5 +1,5 @@ const { assert, skip, test, module: describe, only } = require('qunit'); -const { webGLKernelValueMaps } = require('../../../../../src'); +const { webGLKernelValueMaps } = require('../../../../..'); describe('internal: WebGLKernelValueSingleArray'); @@ -20,7 +20,7 @@ test('.constructor() checks too large height', () => { tactic: 'speed', onRequestContextHandle: () => 1, onRequestTexture: () => null, - onRequestIndex: () => 1 + onRequestIndex: () => 1, }); }, new Error('Argument texture height of 2 larger than maximum size of 1 for your GPU')); }); @@ -42,7 +42,7 @@ test('.constructor() checks ok height & width', () => { pixelStorei: () => {}, texImage2D: () => {}, }; - const v = new webGLKernelValueMaps.single.static.Array([1,2], { + const v = new webGLKernelValueMaps.single.static.Array([1, 2], { kernel: mockKernel, name: 'test', type: 'Array', @@ -51,7 +51,7 @@ test('.constructor() checks ok height & width', () => { context: mockContext, onRequestContextHandle: () => 1, onRequestTexture: () => null, - onRequestIndex: () => 1 + onRequestIndex: () => 1, }); assert.equal(v.constructor.name, 'WebGLKernelValueSingleArray'); }); diff --git a/test/internal/backend/web-gl/kernel-value/single-array1d-i.js b/test/internal/backend/web-gl/kernel-value/single-array1d-i.js index 272d911e..29908ba7 100644 --- a/test/internal/backend/web-gl/kernel-value/single-array1d-i.js +++ b/test/internal/backend/web-gl/kernel-value/single-array1d-i.js @@ -1,5 +1,5 @@ const { assert, skip, test, module: describe, only } = require('qunit'); -const { webGLKernelValueMaps } = require('../../../../../src'); +const { webGLKernelValueMaps } = require('../../../../..'); describe('internal: WebGLKernelValueSingleArray1DI'); @@ -12,7 +12,7 @@ test('.constructor() checks too large height', () => { }; assert.throws(() => { const row = new Float32Array(5); - new webGLKernelValueMaps.single.static["Array1D(2)"]([row], { + new webGLKernelValueMaps.single.static['Array1D(2)']([row], { kernel: mockKernel, name: 'test', type: 'Array1D(2)', @@ -20,7 +20,7 @@ test('.constructor() checks too large height', () => { tactic: 'speed', onRequestContextHandle: () => 1, onRequestTexture: () => null, - onRequestIndex: () => 1 + onRequestIndex: () => 1, }); }, new Error('Argument texture height of 2 larger than maximum size of 1 for your GPU')); }); @@ -42,7 +42,7 @@ test('.constructor() checks ok height & width', () => { pixelStorei: () => {}, texImage2D: () => {}, }; - const v = new webGLKernelValueMaps.single.static["Array1D(2)"]([[1,2]], { + const v = new webGLKernelValueMaps.single.static['Array1D(2)']([[1, 2]], { kernel: mockKernel, name: 'test', type: 'Array1D(2)', @@ -51,7 +51,7 @@ test('.constructor() checks ok height & width', () => { context: mockContext, onRequestContextHandle: () => 1, onRequestTexture: () => null, - onRequestIndex: () => 1 + onRequestIndex: () => 1, }); assert.equal(v.constructor.name, 'WebGLKernelValueSingleArray1DI'); }); diff --git a/test/internal/backend/web-gl/kernel-value/single-array2d-i.js b/test/internal/backend/web-gl/kernel-value/single-array2d-i.js index 911542e5..48533d24 100644 --- a/test/internal/backend/web-gl/kernel-value/single-array2d-i.js +++ b/test/internal/backend/web-gl/kernel-value/single-array2d-i.js @@ -1,5 +1,5 @@ const { assert, skip, test, module: describe, only } = require('qunit'); -const { webGLKernelValueMaps } = require('../../../../../src'); +const { webGLKernelValueMaps } = require('../../../../..'); describe('internal: WebGLKernelValueSingleArray2DI'); @@ -12,7 +12,7 @@ test('.constructor() checks too large height', () => { }; const row = new Float32Array(5); assert.throws(() => { - new webGLKernelValueMaps.single.static["Array2D(2)"]([[row]], { + new webGLKernelValueMaps.single.static['Array2D(2)']([[row]], { kernel: mockKernel, name: 'test', type: 'Array2D(2)', @@ -20,7 +20,7 @@ test('.constructor() checks too large height', () => { tactic: 'speed', onRequestContextHandle: () => 1, onRequestTexture: () => null, - onRequestIndex: () => 1 + onRequestIndex: () => 1, }); }, new Error('Argument texture height of 2 larger than maximum size of 1 for your GPU')); }); @@ -42,7 +42,7 @@ test('.constructor() checks ok height & width', () => { pixelStorei: () => {}, texImage2D: () => {}, }; - const v = new webGLKernelValueMaps.single.static["Array2D(2)"]([[[1,2]]], { + const v = new webGLKernelValueMaps.single.static['Array2D(2)']([[[1, 2]]], { kernel: mockKernel, name: 'test', type: 'Array2D(2)', @@ -51,7 +51,7 @@ test('.constructor() checks ok height & width', () => { context: mockContext, onRequestContextHandle: () => 1, onRequestTexture: () => null, - onRequestIndex: () => 1 + onRequestIndex: () => 1, }); assert.equal(v.constructor.name, 'WebGLKernelValueSingleArray2DI'); }); diff --git a/test/internal/backend/web-gl/kernel-value/single-array3d-i.js b/test/internal/backend/web-gl/kernel-value/single-array3d-i.js index 1666cb2e..afaa236c 100644 --- a/test/internal/backend/web-gl/kernel-value/single-array3d-i.js +++ b/test/internal/backend/web-gl/kernel-value/single-array3d-i.js @@ -1,5 +1,5 @@ const { assert, skip, test, module: describe, only } = require('qunit'); -const { webGLKernelValueMaps } = require('../../../../../src'); +const { webGLKernelValueMaps } = require('../../../../..'); describe('internal: WebGLKernelValueSingleArray3DI'); @@ -12,7 +12,7 @@ test('.constructor() checks too large height', () => { }; assert.throws(() => { const row = new Float32Array(5); - new webGLKernelValueMaps.single.static["Array3D(2)"]([[row]], { + new webGLKernelValueMaps.single.static['Array3D(2)']([[row]], { kernel: mockKernel, name: 'test', type: 'Array3D(2)', @@ -20,7 +20,7 @@ test('.constructor() checks too large height', () => { tactic: 'speed', onRequestContextHandle: () => 1, onRequestTexture: () => null, - onRequestIndex: () => 1 + onRequestIndex: () => 1, }); }, new Error('Argument texture height of 2 larger than maximum size of 1 for your GPU')); }); @@ -42,7 +42,7 @@ test('.constructor() checks ok height & width', () => { pixelStorei: () => {}, texImage2D: () => {}, }; - const v = new webGLKernelValueMaps.single.static["Array3D(2)"]([[[1,2]]], { + const v = new webGLKernelValueMaps.single.static['Array3D(2)']([[[1, 2]]], { kernel: mockKernel, name: 'test', type: 'Array3D(2)', @@ -51,7 +51,7 @@ test('.constructor() checks ok height & width', () => { context: mockContext, onRequestContextHandle: () => 1, onRequestTexture: () => null, - onRequestIndex: () => 1 + onRequestIndex: () => 1, }); assert.equal(v.constructor.name, 'WebGLKernelValueSingleArray3DI'); }); diff --git a/test/internal/backend/web-gl/kernel-value/single-input.js b/test/internal/backend/web-gl/kernel-value/single-input.js index b624ddb1..6a830761 100644 --- a/test/internal/backend/web-gl/kernel-value/single-input.js +++ b/test/internal/backend/web-gl/kernel-value/single-input.js @@ -1,5 +1,5 @@ const { assert, skip, test, module: describe, only } = require('qunit'); -const { webGLKernelValueMaps } = require('../../../../../src'); +const { webGLKernelValueMaps } = require('../../../../..'); describe('internal: WebGLKernelValueSingleInput'); @@ -11,16 +11,19 @@ test('.constructor() checks too large height', () => { validate: true, }; assert.throws(() => { - new webGLKernelValueMaps.single.static.Input({ size: [5,1], value: [1,2] }, { - kernel: mockKernel, - name: 'test', - type: 'Array', - origin: 'user', - tactic: 'speed', - onRequestContextHandle: () => 1, - onRequestTexture: () => null, - onRequestIndex: () => 1 - }); + new webGLKernelValueMaps.single.static.Input( + { size: [5, 1], value: [1, 2] }, + { + kernel: mockKernel, + name: 'test', + type: 'Array', + origin: 'user', + tactic: 'speed', + onRequestContextHandle: () => 1, + onRequestTexture: () => null, + onRequestIndex: () => 1, + } + ); }, new Error('Argument texture height of 2 larger than maximum size of 1 for your GPU')); }); @@ -41,16 +44,19 @@ test('.constructor() checks ok height & width', () => { pixelStorei: () => {}, texImage2D: () => {}, }; - const v = new webGLKernelValueMaps.single.static.Input({ size: [1,2], value: [1,2] }, { - kernel: mockKernel, - name: 'test', - type: 'Array', - origin: 'user', - tactic: 'speed', - context: mockContext, - onRequestContextHandle: () => 1, - onRequestTexture: () => null, - onRequestIndex: () => 1 - }); + const v = new webGLKernelValueMaps.single.static.Input( + { size: [1, 2], value: [1, 2] }, + { + kernel: mockKernel, + name: 'test', + type: 'Array', + origin: 'user', + tactic: 'speed', + context: mockContext, + onRequestContextHandle: () => 1, + onRequestTexture: () => null, + onRequestIndex: () => 1, + } + ); assert.equal(v.constructor.name, 'WebGLKernelValueSingleInput'); }); diff --git a/test/internal/backend/web-gl/kernel-value/unsigned-array.js b/test/internal/backend/web-gl/kernel-value/unsigned-array.js index a05078d4..5b544859 100644 --- a/test/internal/backend/web-gl/kernel-value/unsigned-array.js +++ b/test/internal/backend/web-gl/kernel-value/unsigned-array.js @@ -1,5 +1,5 @@ const { assert, skip, test, module: describe, only } = require('qunit'); -const { webGLKernelValueMaps } = require('../../../../../src'); +const { webGLKernelValueMaps } = require('../../../../..'); describe('internal: WebGLKernelValueUnsignedArray'); @@ -11,7 +11,7 @@ test('.constructor() checks too large height', () => { validate: true, }; assert.throws(() => { - new webGLKernelValueMaps.unsigned.static.Array([1,2], { + new webGLKernelValueMaps.unsigned.static.Array([1, 2], { kernel: mockKernel, name: 'test', type: 'Array', @@ -19,7 +19,7 @@ test('.constructor() checks too large height', () => { tactic: 'speed', onRequestContextHandle: () => 1, onRequestTexture: () => null, - onRequestIndex: () => 1 + onRequestIndex: () => 1, }); }, new Error('Argument texture height and width of 2 larger than maximum size of 1 for your GPU')); }); @@ -41,7 +41,7 @@ test('.constructor() checks ok height & width', () => { pixelStorei: () => {}, texImage2D: () => {}, }; - const v = new webGLKernelValueMaps.unsigned.static.Array([1,2], { + const v = new webGLKernelValueMaps.unsigned.static.Array([1, 2], { kernel: mockKernel, name: 'test', type: 'Array', @@ -50,7 +50,7 @@ test('.constructor() checks ok height & width', () => { context: mockContext, onRequestContextHandle: () => 1, onRequestTexture: () => null, - onRequestIndex: () => 1 + onRequestIndex: () => 1, }); assert.equal(v.constructor.name, 'WebGLKernelValueUnsignedArray'); }); diff --git a/test/internal/backend/web-gl/kernel-value/unsigned-input.js b/test/internal/backend/web-gl/kernel-value/unsigned-input.js index 92be0f20..8936681a 100644 --- a/test/internal/backend/web-gl/kernel-value/unsigned-input.js +++ b/test/internal/backend/web-gl/kernel-value/unsigned-input.js @@ -1,5 +1,5 @@ const { assert, skip, test, module: describe, only } = require('qunit'); -const { webGLKernelValueMaps } = require('../../../../../src'); +const { webGLKernelValueMaps } = require('../../../../..'); describe('internal: WebGLKernelValueUnsignedInput'); @@ -11,16 +11,19 @@ test('.constructor() checks too large height', () => { validate: true, }; assert.throws(() => { - new webGLKernelValueMaps.unsigned.static.Input({ size: [2,1], value: [1,2] }, { - kernel: mockKernel, - name: 'test', - type: 'Array', - origin: 'user', - tactic: 'speed', - onRequestContextHandle: () => 1, - onRequestTexture: () => null, - onRequestIndex: () => 1 - }); + new webGLKernelValueMaps.unsigned.static.Input( + { size: [2, 1], value: [1, 2] }, + { + kernel: mockKernel, + name: 'test', + type: 'Array', + origin: 'user', + tactic: 'speed', + onRequestContextHandle: () => 1, + onRequestTexture: () => null, + onRequestIndex: () => 1, + } + ); }, new Error('Argument texture height and width of 2 larger than maximum size of 1 for your GPU')); }); @@ -41,16 +44,19 @@ test('.constructor() checks ok height & width', () => { pixelStorei: () => {}, texImage2D: () => {}, }; - const v = new webGLKernelValueMaps.unsigned.static.Input({ size: [1,2], value: [1,2] }, { - kernel: mockKernel, - name: 'test', - type: 'Array', - origin: 'user', - tactic: 'speed', - context: mockContext, - onRequestContextHandle: () => 1, - onRequestTexture: () => null, - onRequestIndex: () => 1 - }); + const v = new webGLKernelValueMaps.unsigned.static.Input( + { size: [1, 2], value: [1, 2] }, + { + kernel: mockKernel, + name: 'test', + type: 'Array', + origin: 'user', + tactic: 'speed', + context: mockContext, + onRequestContextHandle: () => 1, + onRequestTexture: () => null, + onRequestIndex: () => 1, + } + ); assert.equal(v.constructor.name, 'WebGLKernelValueUnsignedInput'); }); diff --git a/test/internal/backend/web-gl/kernel/index.js b/test/internal/backend/web-gl/kernel/index.js index 2ae871db..7382a455 100644 --- a/test/internal/backend/web-gl/kernel/index.js +++ b/test/internal/backend/web-gl/kernel/index.js @@ -1,28 +1,31 @@ const sinon = require('sinon'); const { assert, skip, test, module: describe, only } = require('qunit'); -const { WebGLKernel } = require('../../../../../src'); +const { WebGLKernel } = require('../../../../..'); describe('internal: WebGLKernel'); -(typeof global !== 'undefined' ? test : skip)('.setupFeatureChecks() if context is available, but .getExtension() is falsey', () => { - const mockContext = { - getExtension: null // this is important - }; - const mockElement = { - getContext: () => mockContext, - }; - const mockDocument = { - createElement: () => { - return mockElement; - } - }; - global.document = mockDocument; +(typeof global !== 'undefined' ? test : skip)( + '.setupFeatureChecks() if context is available, but .getExtension() is falsey', + () => { + const mockContext = { + getExtension: null, // this is important + }; + const mockElement = { + getContext: () => mockContext, + }; + const mockDocument = { + createElement: () => { + return mockElement; + }, + }; + global.document = mockDocument; - WebGLKernel.setupFeatureChecks(); - assert.ok(true); + WebGLKernel.setupFeatureChecks(); + assert.ok(true); - delete global.document; -}); + delete global.document; + } +); test('.validateSettings() checks output texture size - too large', () => { const mockContext = { diff --git a/test/internal/backend/web-gl/kernel/setupArguments.js b/test/internal/backend/web-gl/kernel/setupArguments.js index 222dc7b2..1fe7c1f3 100644 --- a/test/internal/backend/web-gl/kernel/setupArguments.js +++ b/test/internal/backend/web-gl/kernel/setupArguments.js @@ -1,5 +1,5 @@ const { assert, skip, test, module: describe, only } = require('qunit'); -const { WebGLKernel, input } = require('../../../../../src'); +const { WebGLKernel, input } = require('../../../../..'); describe('internal WebGLKernel.setupArguments Array'); const gl = { @@ -36,102 +36,118 @@ function setupArgumentsTestSuite(testSuiteSettings) { let uniform3ivCalled = false; let uniform2ivCalled = false; let uniform1iCalled = false; - const mockContext = Object.assign({ - activeTexture: (index) => { - assert.equal(index, 0); - activeTextureCalled = true; - }, - bindTexture: (target, texture) => { - assert.equal(target, 'TEXTURE_2D'); - assert.equal(texture, 'TEXTURE'); - bindTextureCalled = true; - }, - texParameteri: (target, pname, param) => { - switch (texParameteriCalls) { - case 0: - assert.equal(target, 'TEXTURE_2D'); - assert.equal(pname, 'TEXTURE_WRAP_S'); - assert.equal(param, 'CLAMP_TO_EDGE'); - texParameteriCalls++; - break; - case 1: - assert.equal(target, 'TEXTURE_2D'); - assert.equal(pname, 'TEXTURE_WRAP_T'); - assert.equal(param, 'CLAMP_TO_EDGE'); - texParameteriCalls++; - break; - case 2: - assert.equal(target, 'TEXTURE_2D'); - assert.equal(pname, 'TEXTURE_MIN_FILTER'); - assert.equal(param, 'NEAREST'); - texParameteriCalls++; - break; - case 3: - assert.equal(target, 'TEXTURE_2D'); - assert.equal(pname, 'TEXTURE_MAG_FILTER'); - assert.equal(param, 'NEAREST'); - texParameteriCalls++; - break; - default: + const mockContext = Object.assign( + { + activeTexture: index => { + assert.equal(index, 0); + activeTextureCalled = true; + }, + bindTexture: (target, texture) => { + assert.equal(target, 'TEXTURE_2D'); + assert.equal(texture, 'TEXTURE'); + bindTextureCalled = true; + }, + texParameteri: (target, pname, param) => { + switch (texParameteriCalls) { + case 0: + assert.equal(target, 'TEXTURE_2D'); + assert.equal(pname, 'TEXTURE_WRAP_S'); + assert.equal(param, 'CLAMP_TO_EDGE'); + texParameteriCalls++; + break; + case 1: + assert.equal(target, 'TEXTURE_2D'); + assert.equal(pname, 'TEXTURE_WRAP_T'); + assert.equal(param, 'CLAMP_TO_EDGE'); + texParameteriCalls++; + break; + case 2: + assert.equal(target, 'TEXTURE_2D'); + assert.equal(pname, 'TEXTURE_MIN_FILTER'); + assert.equal(param, 'NEAREST'); + texParameteriCalls++; + break; + case 3: + assert.equal(target, 'TEXTURE_2D'); + assert.equal(pname, 'TEXTURE_MAG_FILTER'); + assert.equal(param, 'NEAREST'); + texParameteriCalls++; + break; + default: + throw new Error('called too many times'); + } + }, + pixelStorei: (pname, param) => { + assert.equal(pname, 'UNPACK_FLIP_Y_WEBGL'); + assert.equal(param, expectedPixelStorei); + }, + createTexture: () => 'TEXTURE', + getUniformLocation: (program, name) => { + assert.equal(program, 'program'); + if (getUniformLocationCalls > 3) { throw new Error('called too many times'); - } - }, - pixelStorei: (pname, param) => { - assert.equal(pname, 'UNPACK_FLIP_Y_WEBGL'); - assert.equal(param, expectedPixelStorei); - }, - createTexture: () => 'TEXTURE', - getUniformLocation: (program, name) => { - assert.equal(program, 'program'); - if (getUniformLocationCalls > 3) { - throw new Error('called too many times'); - } - getUniformLocationCalls++; - return { - user_vDim: 'user_vDimLocation', - user_vSize: 'user_vSizeLocation', - user_v: 'user_vLocation', - }[name]; + } + getUniformLocationCalls++; + return { + user_vDim: 'user_vDimLocation', + user_vSize: 'user_vSizeLocation', + user_v: 'user_vLocation', + }[name]; + }, + uniform3iv: (location, value) => { + assert.equal(location, 'user_vDimLocation'); + assert.deepEqual(value, expectedDim); + uniform3ivCalled = true; + }, + uniform2iv: (location, value) => { + assert.equal(location, 'user_vSizeLocation'); + assert.deepEqual(value, expectedSize); + uniform2ivCalled = true; + }, + uniform1i: (location, value) => { + assert.equal(location, 'user_vLocation'); + assert.equal(value, 0); + uniform1iCalled = true; + }, + texImage2D: ( + target, + level, + internalFormat, + width, + height, + border, + format, + type, + pixels + ) => { + assert.equal(target, gl.TEXTURE_2D); + assert.equal(level, 0); + assert.equal(internalFormat, gl.RGBA); + assert.equal(width, expectedSize[0]); + assert.equal(height, expectedSize[1]); + assert.equal(border, 0); + assert.equal(format, gl.RGBA); + assert.equal(type, expectedType); + assert.equal(pixels.length, expectedPixels.length); + assert.deepEqual(pixels, expectedPixels); + texImage2DCalled = true; + }, }, - uniform3iv: (location, value) => { - assert.equal(location, 'user_vDimLocation'); - assert.deepEqual(value, expectedDim); - uniform3ivCalled = true; - }, - uniform2iv: (location, value) => { - assert.equal(location, 'user_vSizeLocation'); - assert.deepEqual(value, expectedSize); - uniform2ivCalled = true; - }, - uniform1i: (location, value) => { - assert.equal(location, 'user_vLocation'); - assert.equal(value, 0); - uniform1iCalled = true; - }, - texImage2D: (target, level, internalFormat, width, height, border, format, type, pixels) => { - assert.equal(target, gl.TEXTURE_2D); - assert.equal(level, 0); - assert.equal(internalFormat, gl.RGBA); - assert.equal(width, expectedSize[0]); - assert.equal(height, expectedSize[1]); - assert.equal(border, 0); - assert.equal(format, gl.RGBA); - assert.equal(type, expectedType); - assert.equal(pixels.length, expectedPixels.length); - assert.deepEqual(pixels, expectedPixels); - texImage2DCalled = true; - } - }, gl); + gl + ); const source = `function(v) { return v[this.thread.x]; }`; const settings = { context: mockContext, }; - const kernel = new WebGLKernel(source, Object.assign({}, settings, gpuSettings)); + const kernel = new WebGLKernel( + source, + Object.assign({}, settings, gpuSettings) + ); kernel.constructor = { lookupKernelValueType: WebGLKernel.lookupKernelValueType, features: { - maxTextureSize: 9999 - } + maxTextureSize: 9999, + }, }; const args = [argument]; kernel.program = 'program'; @@ -158,21 +174,23 @@ test('Array with unsigned precision 5 length', () => { setupArgumentsTestSuite({ gpuSettings: { precision: 'unsigned', - output: [4] + output: [4], }, argument: [ // NOTE: formatted like rectangle on purpose, so you can see how the texture should look - 1, 2, 3, 4, - 5 + 1, + 2, 3, 4, 5, ], expectedBitRatio: 4, - expectedPixels: new Uint8Array(new Float32Array([ - // NOTE: formatted like rectangle on purpose, so you can see how the texture should look - 1,2,3,4, - 5,0,0,0 - ]).buffer), - expectedDim: new Int32Array([5,1,1]), - expectedSize: new Int32Array([4,2]), // 4 * 2 = 8 + expectedPixels: new Uint8Array( + new Float32Array([ + // NOTE: formatted like rectangle on purpose, so you can see how the texture should look + 1, + 2, 3, 4, 5, 0, 0, 0, + ]).buffer + ), + expectedDim: new Int32Array([5, 1, 1]), + expectedSize: new Int32Array([4, 2]), // 4 * 2 = 8 expectedType: gl.UNSIGNED_BYTE, expectedArgumentTextureCount: 1, expectedPixelStorei: false, @@ -182,23 +200,23 @@ test('Float32Array with unsigned precision 5 length', () => { setupArgumentsTestSuite({ gpuSettings: { precision: 'unsigned', - output: [4] + output: [4], }, argument: new Float32Array([ // NOTE: formatted like rectangle on purpose, so you can see how the texture should look - 1, 2, 3, 4, - 5 + 1, + 2, 3, 4, 5, ]), expectedBitRatio: 4, expectedPixels: new Uint8Array( new Float32Array([ // NOTE: formatted like rectangle on purpose, so you can see how the texture should look - 1,2,3,4, - 5,0,0,0 + 1, + 2, 3, 4, 5, 0, 0, 0, ]).buffer ), - expectedDim: new Int32Array([5,1,1]), - expectedSize: new Int32Array([4,2]), // 4 * 2 * 1 = 8 + expectedDim: new Int32Array([5, 1, 1]), + expectedSize: new Int32Array([4, 2]), // 4 * 2 * 1 = 8 expectedType: gl.UNSIGNED_BYTE, expectedArgumentTextureCount: 1, expectedPixelStorei: false, @@ -208,23 +226,23 @@ test('Uint16Array with unsigned precision 5 length', () => { setupArgumentsTestSuite({ gpuSettings: { precision: 'unsigned', - output: [4] + output: [4], }, argument: new Uint16Array([ // NOTE: formatted like rectangle on purpose, so you can see how the texture should look - 1, 2, 3, 4, - 5 + 1, + 2, 3, 4, 5, ]), expectedBitRatio: 2, expectedPixels: new Uint8Array( new Uint16Array([ // NOTE: formatted like rectangle on purpose, so you can see how the texture should look - 1,2,3,4, - 5,0,0,0 + 1, + 2, 3, 4, 5, 0, 0, 0, ]).buffer ), - expectedDim: new Int32Array([5,1,1]), - expectedSize: new Int32Array([2,2]), // 2 * 2 * 2 = 8 + expectedDim: new Int32Array([5, 1, 1]), + expectedSize: new Int32Array([2, 2]), // 2 * 2 * 2 = 8 expectedType: gl.UNSIGNED_BYTE, expectedArgumentTextureCount: 1, expectedPixelStorei: false, @@ -234,20 +252,17 @@ test('Uint8Array with unsigned precision 5 length', () => { setupArgumentsTestSuite({ gpuSettings: { precision: 'unsigned', - output: [5] + output: [5], }, - argument: new Uint8Array([ - 1, 2, 3, 4, - 5 - ]), + argument: new Uint8Array([1, 2, 3, 4, 5]), expectedBitRatio: 1, expectedPixels: new Uint8Array([ // NOTE: formatted like rectangle on purpose, so you can see how the texture should look - 1,2,3,4, - 5,0,0,0 + 1, + 2, 3, 4, 5, 0, 0, 0, ]), - expectedDim: new Int32Array([5,1,1]), - expectedSize: new Int32Array([1,2]), // 1 * 2 * 4 = 8 + expectedDim: new Int32Array([5, 1, 1]), + expectedSize: new Int32Array([1, 2]), // 1 * 2 * 4 = 8 expectedType: gl.UNSIGNED_BYTE, expectedArgumentTextureCount: 1, expectedPixelStorei: false, @@ -258,21 +273,21 @@ test('Array with single precision', () => { setupArgumentsTestSuite({ gpuSettings: { precision: 'single', - output: [4] + output: [4], }, argument: [ // NOTE: formatted like rectangle on purpose, so you can see how the texture should look - 1,2,3,4, - 5 + 1, + 2, 3, 4, 5, ], expectedBitRatio: 4, expectedPixels: new Float32Array([ // NOTE: formatted like rectangle on purpose, so you can see how the texture should look - 1,2,3,4, - 5,0,0,0 + 1, + 2, 3, 4, 5, 0, 0, 0, ]), - expectedDim: new Int32Array([5,1,1]), - expectedSize: new Int32Array([1,2]), + expectedDim: new Int32Array([5, 1, 1]), + expectedSize: new Int32Array([1, 2]), expectedType: gl.FLOAT, expectedTextureWidth: 1, expectedTextureHeight: 2, @@ -284,21 +299,21 @@ test('Float32Array with single precision', () => { setupArgumentsTestSuite({ gpuSettings: { precision: 'single', - output: [4] + output: [4], }, argument: new Float32Array([ // NOTE: formatted like rectangle on purpose, so you can see how the texture should look - 1,2,3,4, - 5 + 1, + 2, 3, 4, 5, ]), expectedBitRatio: 4, expectedPixels: new Float32Array([ // NOTE: formatted like rectangle on purpose, so you can see how the texture should look - 1,2,3,4, - 5,0,0,0 + 1, + 2, 3, 4, 5, 0, 0, 0, ]), - expectedDim: new Int32Array([5,1,1]), - expectedSize: new Int32Array([1,2]), + expectedDim: new Int32Array([5, 1, 1]), + expectedSize: new Int32Array([1, 2]), expectedType: gl.FLOAT, expectedTextureWidth: 1, expectedTextureHeight: 2, @@ -310,22 +325,22 @@ test('Uint16Array with single precision', () => { setupArgumentsTestSuite({ gpuSettings: { precision: 'single', - output: [4] + output: [4], }, argument: new Uint16Array([ // NOTE: formatted like rectangle on purpose, so you can see how the texture should look - 1,2,3,4, - 5 + 1, + 2, 3, 4, 5, ]), // upconverted from 2 expectedBitRatio: 4, expectedPixels: new Float32Array([ // NOTE: formatted like rectangle on purpose, so you can see how the texture should look - 1,2,3,4, - 5,0,0,0 + 1, + 2, 3, 4, 5, 0, 0, 0, ]), - expectedDim: new Int32Array([5,1,1]), - expectedSize: new Int32Array([1,2]), + expectedDim: new Int32Array([5, 1, 1]), + expectedSize: new Int32Array([1, 2]), expectedType: gl.FLOAT, expectedArgumentTextureCount: 1, expectedPixelStorei: false, @@ -335,22 +350,22 @@ test('Uint8Array with single precision', () => { setupArgumentsTestSuite({ gpuSettings: { precision: 'single', - output: [4] + output: [4], }, argument: new Uint8Array([ // NOTE: formatted like rectangle on purpose, so you can see how the texture should look - 1,2,3,4, - 5 + 1, + 2, 3, 4, 5, ]), // upconverted from 1 expectedBitRatio: 4, expectedPixels: new Float32Array([ // NOTE: formatted like rectangle on purpose, so you can see how the texture should look - 1,2,3,4, - 5,0,0,0 + 1, + 2, 3, 4, 5, 0, 0, 0, ]), - expectedDim: new Int32Array([5,1,1]), - expectedSize: new Int32Array([1,2]), + expectedDim: new Int32Array([5, 1, 1]), + expectedSize: new Int32Array([1, 2]), expectedType: gl.FLOAT, expectedArgumentTextureCount: 1, expectedPixelStorei: false, @@ -361,18 +376,15 @@ test('Array with unsigned precision length 33', () => { setupArgumentsTestSuite({ gpuSettings: { precision: 'unsigned', - output: [5] + output: [5], }, argument: [ // NOTE: formatted like rectangle on purpose, so you can see how the texture should look // NOTE: Packing is 1 per RGBA, so only 1 of the 4 channels is used // NOTE: 6x6 - 1, 2, 3, 4, 5, 6, - 7, 8, 9, 10, 11, 12, - 13, 14, 15, 16, 17, 18, - 19, 20, 21, 22, 23, 24, - 25, 26, 27, 28, 29, 30, - 31, 32, 33 + 1, + 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, + 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, ], expectedBitRatio: 4, expectedPixels: new Uint8Array( @@ -380,16 +392,13 @@ test('Array with unsigned precision length 33', () => { // NOTE: formatted like rectangle on purpose, so you can see how the texture should look // NOTE: Packing is 1 per RGBA, so only 1 of the 4 channels is used // NOTE: 6x6 - 1, 2, 3, 4, 5, 6, - 7, 8, 9, 10, 11, 12, - 13, 14, 15, 16, 17, 18, - 19, 20, 21, 22, 23, 24, - 25, 26, 27, 28, 29, 30, - 31, 32, 33, 0, 0, 0 + 1, + 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, + 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 0, 0, 0, ]).buffer ), - expectedDim: new Int32Array([33,1,1]), - expectedSize: new Int32Array([6,6]), // 3 * 3 = 9 * 4 = 34 + expectedDim: new Int32Array([33, 1, 1]), + expectedSize: new Int32Array([6, 6]), // 3 * 3 = 9 * 4 = 34 expectedType: gl.UNSIGNED_BYTE, expectedArgumentTextureCount: 1, expectedPixelStorei: false, @@ -400,18 +409,15 @@ test('Float32Array with unsigned precision length 33', () => { setupArgumentsTestSuite({ gpuSettings: { precision: 'unsigned', - output: [5] + output: [5], }, argument: new Float32Array([ // NOTE: formatted like rectangle on purpose, so you can see how the texture should look // NOTE: Packing is 1 per RGBA, so only 1 of the 4 channels is used // NOTE: 6x6 - 1, 2, 3, 4, 5, 6, - 7, 8, 9, 10, 11, 12, - 13, 14, 15, 16, 17, 18, - 19, 20, 21, 22, 23, 24, - 25, 26, 27, 28, 29, 30, - 31, 32, 33 + 1, + 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, + 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, ]), expectedBitRatio: 4, expectedPixels: new Uint8Array( @@ -419,16 +425,13 @@ test('Float32Array with unsigned precision length 33', () => { // NOTE: formatted like rectangle on purpose, so you can see how the texture should look // NOTE: Packing is 1 per RGBA, so only 1 of the 4 channels is used // NOTE: 6x6 - 1, 2, 3, 4, 5, 6, - 7, 8, 9, 10, 11, 12, - 13, 14, 15, 16, 17, 18, - 19, 20, 21, 22, 23, 24, - 25, 26, 27, 28, 29, 30, - 31, 32, 33, 0, 0, 0, + 1, + 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, + 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 0, 0, 0, ]).buffer ), - expectedDim: new Int32Array([33,1,1]), - expectedSize: new Int32Array([6,6]), // 3 * 3 = 9 * 4 = 34 + expectedDim: new Int32Array([33, 1, 1]), + expectedSize: new Int32Array([6, 6]), // 3 * 3 = 9 * 4 = 34 expectedType: gl.UNSIGNED_BYTE, expectedArgumentTextureCount: 1, expectedPixelStorei: false, @@ -439,17 +442,15 @@ test('Uint16Array with unsigned precision length 33', () => { setupArgumentsTestSuite({ gpuSettings: { precision: 'unsigned', - output: [5] + output: [5], }, argument: new Uint16Array([ // NOTE: formatted like rectangle on purpose, so you can see how the texture should look // NOTE: Packing is 2 per RGBA, so only 2 of the 4 channels is used // NOTE: 4x5 - 1,2, 3,4, 5,6, 7,8, - 9,10, 11,12, 13,14, 15,16, - 17,18, 19,20, 21,22, 23,24, - 25,26, 27,28, 29,30, 31,32, - 33, + 1, + 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, + 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, ]), expectedBitRatio: 2, expectedPixels: new Uint8Array( @@ -457,15 +458,13 @@ test('Uint16Array with unsigned precision length 33', () => { // NOTE: formatted like rectangle on purpose, so you can see how the texture should look // NOTE: Packing is 2 per RGBA, so only 2 of the 4 channels is used // NOTE: 4x5 - 1,2, 3,4, 5,6, 7,8, - 9,10, 11,12, 13,14, 15,16, - 17,18, 19,20, 21,22, 23,24, - 25,26, 27,28, 29,30, 31,32, - 33,0, 0,0, 0,0, 0,0 + 1, + 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, + 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 0, 0, 0, 0, 0, 0, 0, ]).buffer ), - expectedDim: new Int32Array([33,1,1]), - expectedSize: new Int32Array([4,5]), // 3 * 3 = 9 * 4 = 34 + expectedDim: new Int32Array([33, 1, 1]), + expectedSize: new Int32Array([4, 5]), // 3 * 3 = 9 * 4 = 34 expectedType: gl.UNSIGNED_BYTE, expectedArgumentTextureCount: 1, expectedPixelStorei: false, @@ -476,28 +475,29 @@ test('Uint8Array with unsigned precision length 33', () => { setupArgumentsTestSuite({ gpuSettings: { precision: 'unsigned', - output: [5] + output: [5], }, argument: new Uint8Array([ // NOTE: formatted like rectangle on purpose, so you can see how the texture should look // NOTE: Packing is 4 per RGBA, so only 2 of the 4 channels is used // NOTE: 3x3 - 1,2,3,4, 5,6,7,8, 9,10,11,12, - 13,14,15,16, 17,18,19,20, 21,22,23,24, - 25,26, 27,28, 29,30,31,32, 33 + 1, + 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, + 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, ]), expectedBitRatio: 1, expectedPixels: new Uint8Array( new Uint8Array([ - // NOTE: formatted like rectangle on purpose, so you can see how the texture should look - // NOTE: Packing is 4 per RGBA, so only 2 of the 4 channels is used - // NOTE: 3x3 - 1,2,3,4, 5,6,7,8, 9,10,11,12, - 13,14,15,16, 17,18,19,20, 21,22,23,24, - 25,26, 27,28, 29,30,31,32, 33,0,0,0 - ]).buffer), - expectedDim: new Int32Array([33,1,1]), - expectedSize: new Int32Array([3,3]), // 3 * 3 = 9 * 4 = 34 + // NOTE: formatted like rectangle on purpose, so you can see how the texture should look + // NOTE: Packing is 4 per RGBA, so only 2 of the 4 channels is used + // NOTE: 3x3 + 1, + 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, + 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 0, 0, 0, + ]).buffer + ), + expectedDim: new Int32Array([33, 1, 1]), + expectedSize: new Int32Array([3, 3]), // 3 * 3 = 9 * 4 = 34 expectedType: gl.UNSIGNED_BYTE, expectedArgumentTextureCount: 1, expectedPixelStorei: false, @@ -508,27 +508,27 @@ test('Array with single precision length 33', () => { setupArgumentsTestSuite({ gpuSettings: { precision: 'single', - output: [5] + output: [5], }, argument: [ // NOTE: formatted like rectangle on purpose, so you can see how the texture should look // NOTE: Packing is 4 per RGBA, so 4 of the 4 channels is used // NOTE: 3x3 - 1,2,3,4, 5,6,7,8, 9,10,11,12, - 13,14,15,16, 17,18,19,20, 21,22,23,24, - 25,26,27,28, 29,30,31,32, 33 + 1, + 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, + 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, ], expectedBitRatio: 4, expectedPixels: new Float32Array([ // NOTE: formatted like rectangle on purpose, so you can see how the texture should look // NOTE: Packing is 4 per RGBA, so 4 of the 4 channels is used // NOTE: 3x3 - 1,2,3,4, 5,6,7,8, 9,10,11,12, - 13,14,15,16, 17,18,19,20, 21,22,23,24, - 25,26,27,28, 29,30,31,32, 33,0,0,0 + 1, + 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, + 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 0, 0, 0, ]), - expectedDim: new Int32Array([33,1,1]), - expectedSize: new Int32Array([3,3]), // 3 * 3 = 9 * 4 = 34 + expectedDim: new Int32Array([33, 1, 1]), + expectedSize: new Int32Array([3, 3]), // 3 * 3 = 9 * 4 = 34 expectedType: gl.FLOAT, expectedArgumentTextureCount: 1, expectedPixelStorei: false, @@ -539,27 +539,27 @@ test('Float32Array with single precision length 33', () => { setupArgumentsTestSuite({ gpuSettings: { precision: 'single', - output: [5] + output: [5], }, argument: new Float32Array([ // NOTE: formatted like rectangle on purpose, so you can see how the texture should look // NOTE: Packing is 4 per RGBA, so 4 of the 4 channels is used // NOTE: 3x3 - 1,2,3,4, 5,6,7,8, 9,10,11,12, - 13,14,15,16, 17,18,19,20, 21,22,23,24, - 25,26,27,28, 29,30,31,32, 33 + 1, + 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, + 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, ]), expectedBitRatio: 4, expectedPixels: new Float32Array([ // NOTE: formatted like rectangle on purpose, so you can see how the texture should look // NOTE: Packing is 4 per RGBA, so 4 of the 4 channels is used // NOTE: 3x3 - 1,2,3,4, 5,6,7,8, 9,10,11,12, - 13,14,15,16, 17,18,19,20, 21,22,23,24, - 25,26,27,28, 29,30,31,32, 33,0,0,0 + 1, + 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, + 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 0, 0, 0, ]), - expectedDim: new Int32Array([33,1,1]), - expectedSize: new Int32Array([3,3]), // 3 * 3 = 9 * 4 = 36 + expectedDim: new Int32Array([33, 1, 1]), + expectedSize: new Int32Array([3, 3]), // 3 * 3 = 9 * 4 = 36 expectedType: gl.FLOAT, expectedArgumentTextureCount: 1, expectedPixelStorei: false, @@ -570,15 +570,15 @@ test('Uint16Array with single precision length 33', () => { setupArgumentsTestSuite({ gpuSettings: { precision: 'single', - output: [5] + output: [5], }, argument: new Uint16Array([ // NOTE: formatted like rectangle on purpose, so you can see how the texture should look // NOTE: Packing is 4 per RGBA, so 4 of the 4 channels is used // NOTE: 3x3 - 1,2,3,4, 5,6,7,8, 9,10,11,12, - 13,14,15,16, 17,18,19,20, 21,22,23,24, - 25,26,27,28, 29,30,31,32, 33 + 1, + 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, + 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, ]), // upconverted from 2 expectedBitRatio: 4, @@ -586,12 +586,12 @@ test('Uint16Array with single precision length 33', () => { // NOTE: formatted like rectangle on purpose, so you can see how the texture should look // NOTE: Packing is 4 per RGBA, so 4 of the 4 channels is used // NOTE: 3x3 - 1,2,3,4, 5,6,7,8, 9,10,11,12, - 13,14,15,16, 17,18,19,20, 21,22,23,24, - 25,26,27,28, 29,30,31,32, 33,0,0,0 + 1, + 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, + 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 0, 0, 0, ]), - expectedDim: new Int32Array([33,1,1]), - expectedSize: new Int32Array([3,3]), // 3 * 3 = 9 * 4 = 36 + expectedDim: new Int32Array([33, 1, 1]), + expectedSize: new Int32Array([3, 3]), // 3 * 3 = 9 * 4 = 36 expectedType: gl.FLOAT, expectedArgumentTextureCount: 1, expectedPixelStorei: false, @@ -602,15 +602,15 @@ test('Uint8Array with single precision length 33', () => { setupArgumentsTestSuite({ gpuSettings: { precision: 'single', - output: [5] + output: [5], }, argument: new Uint8Array([ // NOTE: formatted like rectangle on purpose, so you can see how the texture should look // NOTE: Packing is 4 per RGBA, so 4 of the 4 channels is used // NOTE: 3x3 - 1,2,3,4, 5,6,7,8, 9,10,11,12, - 13,14,15,16, 17,18,19,20, 21,22,23,24, - 25,26,27,28, 29,30,31,32, 33 + 1, + 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, + 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, ]), // upconverted from 1 expectedBitRatio: 4, @@ -618,12 +618,12 @@ test('Uint8Array with single precision length 33', () => { // NOTE: formatted like rectangle on purpose, so you can see how the texture should look // NOTE: Packing is 4 per RGBA, so 4 of the 4 channels is used // NOTE: 3x3 - 1,2,3,4, 5,6,7,8, 9,10,11,12, - 13,14,15,16, 17,18,19,20, 21,22,23,24, - 25,26,27,28, 29,30,31,32, 33,0,0,0 + 1, + 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, + 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 0, 0, 0, ]), - expectedDim: new Int32Array([33,1,1]), - expectedSize: new Int32Array([3,3]), // 3 * 3 = 9 * 4 = 36 + expectedDim: new Int32Array([33, 1, 1]), + expectedSize: new Int32Array([3, 3]), // 3 * 3 = 9 * 4 = 36 expectedType: gl.FLOAT, expectedArgumentTextureCount: 1, expectedPixelStorei: false, @@ -636,21 +636,26 @@ test('Input(Array) with unsigned precision 5 length', () => { setupArgumentsTestSuite({ gpuSettings: { precision: 'unsigned', - output: [4] + output: [4], }, - argument: input([ - // NOTE: formatted like rectangle on purpose, so you can see how the texture should look - 1, 2, 3, 4, - 5, 0 - ], [2,3]), + argument: input( + [ + // NOTE: formatted like rectangle on purpose, so you can see how the texture should look + 1, + 2, 3, 4, 5, 0, + ], + [2, 3] + ), expectedBitRatio: 4, - expectedPixels: new Uint8Array(new Float32Array([ - // NOTE: formatted like rectangle on purpose, so you can see how the texture should look - 1,2,3,4, - 5,0,0,0 - ]).buffer), - expectedDim: new Int32Array([2,3,1]), - expectedSize: new Int32Array([4,2]), // 4 * 2 = 8 + expectedPixels: new Uint8Array( + new Float32Array([ + // NOTE: formatted like rectangle on purpose, so you can see how the texture should look + 1, + 2, 3, 4, 5, 0, 0, 0, + ]).buffer + ), + expectedDim: new Int32Array([2, 3, 1]), + expectedSize: new Int32Array([4, 2]), // 4 * 2 = 8 expectedType: gl.UNSIGNED_BYTE, expectedArgumentTextureCount: 1, expectedPixelStorei: false, @@ -660,23 +665,26 @@ test('Input(Float32Array) with unsigned precision 5 length', () => { setupArgumentsTestSuite({ gpuSettings: { precision: 'unsigned', - output: [4] + output: [4], }, - argument: input(new Float32Array([ - // NOTE: formatted like rectangle on purpose, so you can see how the texture should look - 1, 2, 3, 4, - 5 - ]), [5]), + argument: input( + new Float32Array([ + // NOTE: formatted like rectangle on purpose, so you can see how the texture should look + 1, + 2, 3, 4, 5, + ]), + [5] + ), expectedBitRatio: 4, expectedPixels: new Uint8Array( new Float32Array([ // NOTE: formatted like rectangle on purpose, so you can see how the texture should look - 1,2,3,4, - 5,0,0,0 + 1, + 2, 3, 4, 5, 0, 0, 0, ]).buffer ), - expectedDim: new Int32Array([5,1,1]), - expectedSize: new Int32Array([4,2]), // 4 * 2 * 1 = 8 + expectedDim: new Int32Array([5, 1, 1]), + expectedSize: new Int32Array([4, 2]), // 4 * 2 * 1 = 8 expectedType: gl.UNSIGNED_BYTE, expectedArgumentTextureCount: 1, expectedPixelStorei: false, @@ -686,23 +694,26 @@ test('Input(Uint16Array) with unsigned precision 5 length', () => { setupArgumentsTestSuite({ gpuSettings: { precision: 'unsigned', - output: [4] + output: [4], }, - argument: input(new Uint16Array([ - // NOTE: formatted like rectangle on purpose, so you can see how the texture should look - 1, 2, 3, 4, - 5, 0, - ]), [2,3]), + argument: input( + new Uint16Array([ + // NOTE: formatted like rectangle on purpose, so you can see how the texture should look + 1, + 2, 3, 4, 5, 0, + ]), + [2, 3] + ), expectedBitRatio: 2, expectedPixels: new Uint8Array( new Uint16Array([ // NOTE: formatted like rectangle on purpose, so you can see how the texture should look - 1,2,3,4, - 5,0,0,0 + 1, + 2, 3, 4, 5, 0, 0, 0, ]).buffer ), - expectedDim: new Int32Array([2,3,1]), - expectedSize: new Int32Array([2,2]), // 2 * 2 * 2 = 8 + expectedDim: new Int32Array([2, 3, 1]), + expectedSize: new Int32Array([2, 2]), // 2 * 2 * 2 = 8 expectedType: gl.UNSIGNED_BYTE, expectedArgumentTextureCount: 1, expectedPixelStorei: false, @@ -712,20 +723,17 @@ test('Input(Uint8Array) with unsigned precision 5 length', () => { setupArgumentsTestSuite({ gpuSettings: { precision: 'unsigned', - output: [5] + output: [5], }, - argument: input(new Uint8Array([ - 1, 2, 3, 4, - 5,0 - ]),[2, 3]), + argument: input(new Uint8Array([1, 2, 3, 4, 5, 0]), [2, 3]), expectedBitRatio: 1, expectedPixels: new Uint8Array([ // NOTE: formatted like rectangle on purpose, so you can see how the texture should look - 1,2,3,4, - 5,0,0,0 + 1, + 2, 3, 4, 5, 0, 0, 0, ]), - expectedDim: new Int32Array([2,3,1]), - expectedSize: new Int32Array([1,2]), // 1 * 2 * 4 = 8 + expectedDim: new Int32Array([2, 3, 1]), + expectedSize: new Int32Array([1, 2]), // 1 * 2 * 4 = 8 expectedType: gl.UNSIGNED_BYTE, expectedArgumentTextureCount: 1, expectedPixelStorei: false, @@ -736,21 +744,24 @@ test('Input(Array) with single precision', () => { setupArgumentsTestSuite({ gpuSettings: { precision: 'single', - output: [4] + output: [4], }, - argument: input([ - // NOTE: formatted like rectangle on purpose, so you can see how the texture should look - 1,2,3,4, - 5,0 - ], [2,3]), + argument: input( + [ + // NOTE: formatted like rectangle on purpose, so you can see how the texture should look + 1, + 2, 3, 4, 5, 0, + ], + [2, 3] + ), expectedBitRatio: 4, expectedPixels: new Float32Array([ // NOTE: formatted like rectangle on purpose, so you can see how the texture should look - 1,2,3,4, - 5,0,0,0 + 1, + 2, 3, 4, 5, 0, 0, 0, ]), - expectedDim: new Int32Array([2,3,1]), - expectedSize: new Int32Array([1,2]), + expectedDim: new Int32Array([2, 3, 1]), + expectedSize: new Int32Array([1, 2]), expectedType: gl.FLOAT, expectedTextureWidth: 1, expectedTextureHeight: 2, @@ -762,21 +773,24 @@ test('Input(Float32Array) with single precision', () => { setupArgumentsTestSuite({ gpuSettings: { precision: 'single', - output: [4] + output: [4], }, - argument: input(new Float32Array([ - // NOTE: formatted like rectangle on purpose, so you can see how the texture should look - 1,2,3,4, - 5,0 - ]),[2,3]), + argument: input( + new Float32Array([ + // NOTE: formatted like rectangle on purpose, so you can see how the texture should look + 1, + 2, 3, 4, 5, 0, + ]), + [2, 3] + ), expectedBitRatio: 4, expectedPixels: new Float32Array([ // NOTE: formatted like rectangle on purpose, so you can see how the texture should look - 1,2,3,4, - 5,0,0,0 + 1, + 2, 3, 4, 5, 0, 0, 0, ]), - expectedDim: new Int32Array([2,3,1]), - expectedSize: new Int32Array([1,2]), + expectedDim: new Int32Array([2, 3, 1]), + expectedSize: new Int32Array([1, 2]), expectedType: gl.FLOAT, expectedTextureWidth: 1, expectedTextureHeight: 2, @@ -788,22 +802,25 @@ test('Input(Uint16Array) with single precision', () => { setupArgumentsTestSuite({ gpuSettings: { precision: 'single', - output: [4] + output: [4], }, - argument: input(new Uint16Array([ - // NOTE: formatted like rectangle on purpose, so you can see how the texture should look - 1,2,3,4, - 5,0 - ]), [2,3]), + argument: input( + new Uint16Array([ + // NOTE: formatted like rectangle on purpose, so you can see how the texture should look + 1, + 2, 3, 4, 5, 0, + ]), + [2, 3] + ), // upconverted from 2 expectedBitRatio: 4, expectedPixels: new Float32Array([ // NOTE: formatted like rectangle on purpose, so you can see how the texture should look - 1,2,3,4, - 5,0,0,0 + 1, + 2, 3, 4, 5, 0, 0, 0, ]), - expectedDim: new Int32Array([2,3,1]), - expectedSize: new Int32Array([1,2]), + expectedDim: new Int32Array([2, 3, 1]), + expectedSize: new Int32Array([1, 2]), expectedType: gl.FLOAT, expectedArgumentTextureCount: 1, expectedPixelStorei: false, @@ -813,22 +830,25 @@ test('Input(Uint8Array) with single precision', () => { setupArgumentsTestSuite({ gpuSettings: { precision: 'single', - output: [4] + output: [4], }, - argument: input(new Uint8Array([ - // NOTE: formatted like rectangle on purpose, so you can see how the texture should look - 1,2,3,4, - 5,0 - ]), [2,3]), + argument: input( + new Uint8Array([ + // NOTE: formatted like rectangle on purpose, so you can see how the texture should look + 1, + 2, 3, 4, 5, 0, + ]), + [2, 3] + ), // upconverted from 1 expectedBitRatio: 4, expectedPixels: new Float32Array([ // NOTE: formatted like rectangle on purpose, so you can see how the texture should look - 1,2,3,4, - 5,0,0,0 + 1, + 2, 3, 4, 5, 0, 0, 0, ]), - expectedDim: new Int32Array([2,3,1]), - expectedSize: new Int32Array([1,2]), + expectedDim: new Int32Array([2, 3, 1]), + expectedSize: new Int32Array([1, 2]), expectedType: gl.FLOAT, expectedArgumentTextureCount: 1, expectedPixelStorei: false, @@ -839,35 +859,32 @@ test('Input(Array) with unsigned precision length 33', () => { setupArgumentsTestSuite({ gpuSettings: { precision: 'unsigned', - output: [5] + output: [5], }, - argument: input([ - // NOTE: formatted like rectangle on purpose, so you can see how the texture should look - // NOTE: Packing is 1 per RGBA, so only 1 of the 4 channels is used - // NOTE: 6x6 - 1, 2, 3, 4, 5, 6, - 7, 8, 9, 10, 11, 12, - 13, 14, 15, 16, 17, 18, - 19, 20, 21, 22, 23, 24, - 25, 26, 27, 28, 29, 30, - 31, 32, 33 - ], [33]), + argument: input( + [ + // NOTE: formatted like rectangle on purpose, so you can see how the texture should look + // NOTE: Packing is 1 per RGBA, so only 1 of the 4 channels is used + // NOTE: 6x6 + 1, + 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, + 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, + ], + [33] + ), expectedBitRatio: 4, expectedPixels: new Uint8Array( new Float32Array([ // NOTE: formatted like rectangle on purpose, so you can see how the texture should look // NOTE: Packing is 1 per RGBA, so only 1 of the 4 channels is used // NOTE: 6x6 - 1, 2, 3, 4, 5, 6, - 7, 8, 9, 10, 11, 12, - 13, 14, 15, 16, 17, 18, - 19, 20, 21, 22, 23, 24, - 25, 26, 27, 28, 29, 30, - 31, 32, 33, 0, 0, 0 + 1, + 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, + 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 0, 0, 0, ]).buffer ), - expectedDim: new Int32Array([33,1,1]), - expectedSize: new Int32Array([6,6]), // 3 * 3 = 9 * 4 = 34 + expectedDim: new Int32Array([33, 1, 1]), + expectedSize: new Int32Array([6, 6]), // 3 * 3 = 9 * 4 = 34 expectedType: gl.UNSIGNED_BYTE, expectedArgumentTextureCount: 1, expectedPixelStorei: false, @@ -878,35 +895,32 @@ test('Input(Float32Array) with unsigned precision length 33', () => { setupArgumentsTestSuite({ gpuSettings: { precision: 'unsigned', - output: [5] + output: [5], }, - argument: input(new Float32Array([ - // NOTE: formatted like rectangle on purpose, so you can see how the texture should look - // NOTE: Packing is 1 per RGBA, so only 1 of the 4 channels is used - // NOTE: 6x6 - 1, 2, 3, 4, 5, 6, - 7, 8, 9, 10, 11, 12, - 13, 14, 15, 16, 17, 18, - 19, 20, 21, 22, 23, 24, - 25, 26, 27, 28, 29, 30, - 31, 32, 33 - ]), [33]), + argument: input( + new Float32Array([ + // NOTE: formatted like rectangle on purpose, so you can see how the texture should look + // NOTE: Packing is 1 per RGBA, so only 1 of the 4 channels is used + // NOTE: 6x6 + 1, + 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, + 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, + ]), + [33] + ), expectedBitRatio: 4, expectedPixels: new Uint8Array( new Float32Array([ // NOTE: formatted like rectangle on purpose, so you can see how the texture should look // NOTE: Packing is 1 per RGBA, so only 1 of the 4 channels is used // NOTE: 6x6 - 1, 2, 3, 4, 5, 6, - 7, 8, 9, 10, 11, 12, - 13, 14, 15, 16, 17, 18, - 19, 20, 21, 22, 23, 24, - 25, 26, 27, 28, 29, 30, - 31, 32, 33, 0, 0, 0, + 1, + 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, + 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 0, 0, 0, ]).buffer ), - expectedDim: new Int32Array([33,1,1]), - expectedSize: new Int32Array([6,6]), // 3 * 3 = 9 * 4 = 34 + expectedDim: new Int32Array([33, 1, 1]), + expectedSize: new Int32Array([6, 6]), // 3 * 3 = 9 * 4 = 34 expectedType: gl.UNSIGNED_BYTE, expectedArgumentTextureCount: 1, expectedPixelStorei: false, @@ -917,33 +931,32 @@ test('Input(Uint16Array) with unsigned precision length 33', () => { setupArgumentsTestSuite({ gpuSettings: { precision: 'unsigned', - output: [5] + output: [5], }, - argument: input(new Uint16Array([ - // NOTE: formatted like rectangle on purpose, so you can see how the texture should look - // NOTE: Packing is 2 per RGBA, so only 2 of the 4 channels is used - // NOTE: 4x5 - 1,2, 3,4, 5,6, 7,8, - 9,10, 11,12, 13,14, 15,16, - 17,18, 19,20, 21,22, 23,24, - 25,26, 27,28, 29,30, 31,32, - 33, - ]), [33]), + argument: input( + new Uint16Array([ + // NOTE: formatted like rectangle on purpose, so you can see how the texture should look + // NOTE: Packing is 2 per RGBA, so only 2 of the 4 channels is used + // NOTE: 4x5 + 1, + 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, + 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, + ]), + [33] + ), expectedBitRatio: 2, expectedPixels: new Uint8Array( new Uint16Array([ // NOTE: formatted like rectangle on purpose, so you can see how the texture should look // NOTE: Packing is 2 per RGBA, so only 2 of the 4 channels is used // NOTE: 4x5 - 1,2, 3,4, 5,6, 7,8, - 9,10, 11,12, 13,14, 15,16, - 17,18, 19,20, 21,22, 23,24, - 25,26, 27,28, 29,30, 31,32, - 33,0, 0,0, 0,0, 0,0 + 1, + 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, + 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 0, 0, 0, 0, 0, 0, 0, ]).buffer ), - expectedDim: new Int32Array([33,1,1]), - expectedSize: new Int32Array([4,5]), // 3 * 3 = 9 * 4 = 34 + expectedDim: new Int32Array([33, 1, 1]), + expectedSize: new Int32Array([4, 5]), // 3 * 3 = 9 * 4 = 34 expectedType: gl.UNSIGNED_BYTE, expectedArgumentTextureCount: 1, expectedPixelStorei: false, @@ -954,28 +967,32 @@ test('Input(Uint8Array) with unsigned precision length 33', () => { setupArgumentsTestSuite({ gpuSettings: { precision: 'unsigned', - output: [5] + output: [5], }, - argument: input(new Uint8Array([ - // NOTE: formatted like rectangle on purpose, so you can see how the texture should look - // NOTE: Packing is 4 per RGBA, so only 2 of the 4 channels is used - // NOTE: 3x3 - 1,2,3,4, 5,6,7,8, 9,10,11,12, - 13,14,15,16, 17,18,19,20, 21,22,23,24, - 25,26, 27,28, 29,30,31,32, 33 - ]), [33]), + argument: input( + new Uint8Array([ + // NOTE: formatted like rectangle on purpose, so you can see how the texture should look + // NOTE: Packing is 4 per RGBA, so only 2 of the 4 channels is used + // NOTE: 3x3 + 1, + 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, + 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, + ]), + [33] + ), expectedBitRatio: 1, expectedPixels: new Uint8Array( new Uint8Array([ // NOTE: formatted like rectangle on purpose, so you can see how the texture should look // NOTE: Packing is 4 per RGBA, so only 2 of the 4 channels is used // NOTE: 3x3 - 1,2,3,4, 5,6,7,8, 9,10,11,12, - 13,14,15,16, 17,18,19,20, 21,22,23,24, - 25,26, 27,28, 29,30,31,32, 33,0,0,0 - ]).buffer), - expectedDim: new Int32Array([33,1,1]), - expectedSize: new Int32Array([3,3]), // 3 * 3 = 9 * 4 = 34 + 1, + 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, + 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 0, 0, 0, + ]).buffer + ), + expectedDim: new Int32Array([33, 1, 1]), + expectedSize: new Int32Array([3, 3]), // 3 * 3 = 9 * 4 = 34 expectedType: gl.UNSIGNED_BYTE, expectedArgumentTextureCount: 1, expectedPixelStorei: false, @@ -986,27 +1003,30 @@ test('Input(Array) with single precision length 33', () => { setupArgumentsTestSuite({ gpuSettings: { precision: 'single', - output: [5] + output: [5], }, - argument: input([ - // NOTE: formatted like rectangle on purpose, so you can see how the texture should look - // NOTE: Packing is 4 per RGBA, so 4 of the 4 channels is used - // NOTE: 3x3 - 1,2,3,4, 5,6,7,8, 9,10,11,12, - 13,14,15,16, 17,18,19,20, 21,22,23,24, - 25,26,27,28, 29,30,31,32, 33 - ], [33]), + argument: input( + [ + // NOTE: formatted like rectangle on purpose, so you can see how the texture should look + // NOTE: Packing is 4 per RGBA, so 4 of the 4 channels is used + // NOTE: 3x3 + 1, + 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, + 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, + ], + [33] + ), expectedBitRatio: 4, expectedPixels: new Float32Array([ // NOTE: formatted like rectangle on purpose, so you can see how the texture should look // NOTE: Packing is 4 per RGBA, so 4 of the 4 channels is used // NOTE: 3x3 - 1,2,3,4, 5,6,7,8, 9,10,11,12, - 13,14,15,16, 17,18,19,20, 21,22,23,24, - 25,26,27,28, 29,30,31,32, 33,0,0,0 + 1, + 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, + 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 0, 0, 0, ]), - expectedDim: new Int32Array([33,1,1]), - expectedSize: new Int32Array([3,3]), // 3 * 3 = 9 * 4 = 34 + expectedDim: new Int32Array([33, 1, 1]), + expectedSize: new Int32Array([3, 3]), // 3 * 3 = 9 * 4 = 34 expectedType: gl.FLOAT, expectedArgumentTextureCount: 1, expectedPixelStorei: false, @@ -1017,27 +1037,30 @@ test('Input(Float32Array) with single precision length 33', () => { setupArgumentsTestSuite({ gpuSettings: { precision: 'single', - output: [5] + output: [5], }, - argument: input(new Float32Array([ - // NOTE: formatted like rectangle on purpose, so you can see how the texture should look - // NOTE: Packing is 4 per RGBA, so 4 of the 4 channels is used - // NOTE: 3x3 - 1,2,3,4, 5,6,7,8, 9,10,11,12, - 13,14,15,16, 17,18,19,20, 21,22,23,24, - 25,26,27,28, 29,30,31,32, 33 - ]), [33]), + argument: input( + new Float32Array([ + // NOTE: formatted like rectangle on purpose, so you can see how the texture should look + // NOTE: Packing is 4 per RGBA, so 4 of the 4 channels is used + // NOTE: 3x3 + 1, + 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, + 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, + ]), + [33] + ), expectedBitRatio: 4, expectedPixels: new Float32Array([ // NOTE: formatted like rectangle on purpose, so you can see how the texture should look // NOTE: Packing is 4 per RGBA, so 4 of the 4 channels is used // NOTE: 3x3 - 1,2,3,4, 5,6,7,8, 9,10,11,12, - 13,14,15,16, 17,18,19,20, 21,22,23,24, - 25,26,27,28, 29,30,31,32, 33,0,0,0 + 1, + 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, + 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 0, 0, 0, ]), - expectedDim: new Int32Array([33,1,1]), - expectedSize: new Int32Array([3,3]), // 3 * 3 = 9 * 4 = 34 + expectedDim: new Int32Array([33, 1, 1]), + expectedSize: new Int32Array([3, 3]), // 3 * 3 = 9 * 4 = 34 expectedType: gl.FLOAT, expectedArgumentTextureCount: 1, expectedPixelStorei: false, @@ -1048,28 +1071,31 @@ test('Input(Uint16Array) with single precision length 33', () => { setupArgumentsTestSuite({ gpuSettings: { precision: 'single', - output: [5] + output: [5], }, - argument: input(new Uint16Array([ - // NOTE: formatted like rectangle on purpose, so you can see how the texture should look - // NOTE: Packing is 4 per RGBA, so 4 of the 4 channels is used - // NOTE: 3x3 - 1,2,3,4, 5,6,7,8, 9,10,11,12, - 13,14,15,16, 17,18,19,20, 21,22,23,24, - 25,26,27,28, 29,30,31,32, 33 - ]), [33]), + argument: input( + new Uint16Array([ + // NOTE: formatted like rectangle on purpose, so you can see how the texture should look + // NOTE: Packing is 4 per RGBA, so 4 of the 4 channels is used + // NOTE: 3x3 + 1, + 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, + 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, + ]), + [33] + ), // upconverted from 2 expectedBitRatio: 4, expectedPixels: new Float32Array([ // NOTE: formatted like rectangle on purpose, so you can see how the texture should look // NOTE: Packing is 4 per RGBA, so 4 of the 4 channels is used // NOTE: 3x3 - 1,2,3,4, 5,6,7,8, 9,10,11,12, - 13,14,15,16, 17,18,19,20, 21,22,23,24, - 25,26,27,28, 29,30,31,32, 33,0,0,0 + 1, + 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, + 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 0, 0, 0, ]), - expectedDim: new Int32Array([33,1,1]), - expectedSize: new Int32Array([3,3]), // 3 * 3 = 9 * 4 = 36 + expectedDim: new Int32Array([33, 1, 1]), + expectedSize: new Int32Array([3, 3]), // 3 * 3 = 9 * 4 = 36 expectedType: gl.FLOAT, expectedArgumentTextureCount: 1, expectedPixelStorei: false, @@ -1080,28 +1106,31 @@ test('Input(Uint8Array) with single precision length 33', () => { setupArgumentsTestSuite({ gpuSettings: { precision: 'single', - output: [5] + output: [5], }, - argument: input(new Uint8Array([ - // NOTE: formatted like rectangle on purpose, so you can see how the texture should look - // NOTE: Packing is 4 per RGBA (8 bit, but upconverted to float32), so only 4 of the 4 channels is used - // NOTE: 3x3 - 1,2,3,4, 5,6,7,8, 9,10,11,12, - 13,14,15,16, 17,18,19,20, 21,22,23,24, - 25,26,27,28, 29,30,31,32, 33 - ]), [33]), + argument: input( + new Uint8Array([ + // NOTE: formatted like rectangle on purpose, so you can see how the texture should look + // NOTE: Packing is 4 per RGBA (8 bit, but upconverted to float32), so only 4 of the 4 channels is used + // NOTE: 3x3 + 1, + 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, + 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, + ]), + [33] + ), // upconverted to float32 expectedBitRatio: 4, expectedPixels: new Float32Array([ // NOTE: formatted like rectangle on purpose, so you can see how the texture should look // NOTE: Packing is 4 per RGBA (8 bit, but upconverted to float32), so only 4 of the 4 channels is used // NOTE: 3x3 - 1,2,3,4, 5,6,7,8, 9,10,11,12, - 13,14,15,16, 17,18,19,20, 21,22,23,24, - 25,26,27,28, 29,30,31,32, 33,0,0,0 + 1, + 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, + 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 0, 0, 0, ]), - expectedDim: new Int32Array([33,1,1]), - expectedSize: new Int32Array([3,3]), // 3 * 3 = 9 * 4 = 36 + expectedDim: new Int32Array([33, 1, 1]), + expectedSize: new Int32Array([3, 3]), // 3 * 3 = 9 * 4 = 36 expectedType: gl.FLOAT, expectedArgumentTextureCount: 1, expectedPixelStorei: false, diff --git a/test/internal/backend/web-gl/kernel/setupConstants.js b/test/internal/backend/web-gl/kernel/setupConstants.js index eb575b3f..bd2c0b72 100644 --- a/test/internal/backend/web-gl/kernel/setupConstants.js +++ b/test/internal/backend/web-gl/kernel/setupConstants.js @@ -1,5 +1,5 @@ const { assert, skip, test, module: describe, only } = require('qunit'); -const { WebGLKernel, input } = require('../../../../../src'); +const { WebGLKernel, input } = require('../../../../..'); describe('internal WebGLKernel.setupConstants Array'); const gl = { @@ -36,102 +36,118 @@ function setupConstantsTestSuite(testSuiteSettings) { let uniform3ivCalled = false; let uniform2ivCalled = false; let uniform1iCalled = false; - const mockContext = Object.assign({ - activeTexture: (index) => { - assert.equal(index, 0); - activeTextureCalled = true; - }, - bindTexture: (target, texture) => { - assert.equal(target, 'TEXTURE_2D'); - assert.equal(texture, 'TEXTURE'); - bindTextureCalled = true; - }, - texParameteri: (target, pname, param) => { - switch (texParameteriCalls) { - case 0: - assert.equal(target, 'TEXTURE_2D'); - assert.equal(pname, 'TEXTURE_WRAP_S'); - assert.equal(param, 'CLAMP_TO_EDGE'); - texParameteriCalls++; - break; - case 1: - assert.equal(target, 'TEXTURE_2D'); - assert.equal(pname, 'TEXTURE_WRAP_T'); - assert.equal(param, 'CLAMP_TO_EDGE'); - texParameteriCalls++; - break; - case 2: - assert.equal(target, 'TEXTURE_2D'); - assert.equal(pname, 'TEXTURE_MIN_FILTER'); - assert.equal(param, 'NEAREST'); - texParameteriCalls++; - break; - case 3: - assert.equal(target, 'TEXTURE_2D'); - assert.equal(pname, 'TEXTURE_MAG_FILTER'); - assert.equal(param, 'NEAREST'); - texParameteriCalls++; - break; - default: + const mockContext = Object.assign( + { + activeTexture: index => { + assert.equal(index, 0); + activeTextureCalled = true; + }, + bindTexture: (target, texture) => { + assert.equal(target, 'TEXTURE_2D'); + assert.equal(texture, 'TEXTURE'); + bindTextureCalled = true; + }, + texParameteri: (target, pname, param) => { + switch (texParameteriCalls) { + case 0: + assert.equal(target, 'TEXTURE_2D'); + assert.equal(pname, 'TEXTURE_WRAP_S'); + assert.equal(param, 'CLAMP_TO_EDGE'); + texParameteriCalls++; + break; + case 1: + assert.equal(target, 'TEXTURE_2D'); + assert.equal(pname, 'TEXTURE_WRAP_T'); + assert.equal(param, 'CLAMP_TO_EDGE'); + texParameteriCalls++; + break; + case 2: + assert.equal(target, 'TEXTURE_2D'); + assert.equal(pname, 'TEXTURE_MIN_FILTER'); + assert.equal(param, 'NEAREST'); + texParameteriCalls++; + break; + case 3: + assert.equal(target, 'TEXTURE_2D'); + assert.equal(pname, 'TEXTURE_MAG_FILTER'); + assert.equal(param, 'NEAREST'); + texParameteriCalls++; + break; + default: + throw new Error('called too many times'); + } + }, + pixelStorei: (pname, param) => { + assert.equal(pname, 'UNPACK_FLIP_Y_WEBGL'); + assert.equal(param, expectedPixelStorei); + }, + createTexture: () => 'TEXTURE', + getUniformLocation: (program, name) => { + assert.equal(program, 'program'); + if (getUniformLocationCalls > 3) { throw new Error('called too many times'); - } - }, - pixelStorei: (pname, param) => { - assert.equal(pname, 'UNPACK_FLIP_Y_WEBGL'); - assert.equal(param, expectedPixelStorei); - }, - createTexture: () => 'TEXTURE', - getUniformLocation: (program, name) => { - assert.equal(program, 'program'); - if (getUniformLocationCalls > 3) { - throw new Error('called too many times'); - } - getUniformLocationCalls++; - return { - constants_vDim: 'constants_vDimLocation', - constants_vSize: 'constants_vSizeLocation', - constants_v: 'constants_vLocation', - }[name]; + } + getUniformLocationCalls++; + return { + constants_vDim: 'constants_vDimLocation', + constants_vSize: 'constants_vSizeLocation', + constants_v: 'constants_vLocation', + }[name]; + }, + uniform3iv: (location, value) => { + assert.equal(location, 'constants_vDimLocation'); + assert.deepEqual(value, expectedDim); + uniform3ivCalled = true; + }, + uniform2iv: (location, value) => { + assert.equal(location, 'constants_vSizeLocation'); + assert.deepEqual(value, expectedSize); + uniform2ivCalled = true; + }, + uniform1i: (location, value) => { + assert.equal(location, 'constants_vLocation'); + assert.equal(value, 0); + uniform1iCalled = true; + }, + texImage2D: ( + target, + level, + internalFormat, + width, + height, + border, + format, + type, + pixels + ) => { + assert.equal(target, gl.TEXTURE_2D); + assert.equal(level, 0); + assert.equal(internalFormat, gl.RGBA); + assert.equal(width, expectedSize[0]); + assert.equal(height, expectedSize[1]); + assert.equal(border, 0); + assert.equal(format, gl.RGBA); + assert.equal(type, expectedType); + assert.equal(pixels.length, expectedPixels.length); + assert.deepEqual(pixels, expectedPixels); + texImage2DCalled = true; + }, }, - uniform3iv: (location, value) => { - assert.equal(location, 'constants_vDimLocation'); - assert.deepEqual(value, expectedDim); - uniform3ivCalled = true; - }, - uniform2iv: (location, value) => { - assert.equal(location, 'constants_vSizeLocation'); - assert.deepEqual(value, expectedSize); - uniform2ivCalled = true; - }, - uniform1i: (location, value) => { - assert.equal(location, 'constants_vLocation'); - assert.equal(value, 0); - uniform1iCalled = true; - }, - texImage2D: (target, level, internalFormat, width, height, border, format, type, pixels) => { - assert.equal(target, gl.TEXTURE_2D); - assert.equal(level, 0); - assert.equal(internalFormat, gl.RGBA); - assert.equal(width, expectedSize[0]); - assert.equal(height, expectedSize[1]); - assert.equal(border, 0); - assert.equal(format, gl.RGBA); - assert.equal(type, expectedType); - assert.equal(pixels.length, expectedPixels.length); - assert.deepEqual(pixels, expectedPixels); - texImage2DCalled = true; - } - }, gl); + gl + ); const source = `function(v) { return this.constants.v[this.thread.x]; }`; const settings = { context: mockContext, }; - const kernel = new WebGLKernel(source, Object.assign({ constants: { v: constant } }, settings, gpuSettings)); + const kernel = new WebGLKernel( + source, + Object.assign({ constants: { v: constant } }, settings, gpuSettings) + ); kernel.constructor = { lookupKernelValueType: WebGLKernel.lookupKernelValueType, features: { - maxTextureSize: 9999 - } + maxTextureSize: 9999, + }, }; kernel.program = 'program'; assert.equal(kernel.constantTextureCount, 0); @@ -157,21 +173,23 @@ test('Array with unsigned precision 5 length', () => { setupConstantsTestSuite({ gpuSettings: { precision: 'unsigned', - output: [4] + output: [4], }, constant: [ // NOTE: formatted like rectangle on purpose, so you can see how the texture should look - 1, 2, 3, 4, - 5 + 1, + 2, 3, 4, 5, ], expectedBitRatio: 4, - expectedPixels: new Uint8Array(new Float32Array([ - // NOTE: formatted like rectangle on purpose, so you can see how the texture should look - 1,2,3,4, - 5,0,0,0 - ]).buffer), - expectedDim: new Int32Array([5,1,1]), - expectedSize: new Int32Array([4,2]), // 4 * 2 = 8 + expectedPixels: new Uint8Array( + new Float32Array([ + // NOTE: formatted like rectangle on purpose, so you can see how the texture should look + 1, + 2, 3, 4, 5, 0, 0, 0, + ]).buffer + ), + expectedDim: new Int32Array([5, 1, 1]), + expectedSize: new Int32Array([4, 2]), // 4 * 2 = 8 expectedType: gl.UNSIGNED_BYTE, expectedConstantTextureCount: 1, expectedPixelStorei: false, @@ -181,23 +199,23 @@ test('Float32Array with unsigned precision 5 length', () => { setupConstantsTestSuite({ gpuSettings: { precision: 'unsigned', - output: [4] + output: [4], }, constant: new Float32Array([ // NOTE: formatted like rectangle on purpose, so you can see how the texture should look - 1, 2, 3, 4, - 5 + 1, + 2, 3, 4, 5, ]), expectedBitRatio: 4, expectedPixels: new Uint8Array( new Float32Array([ // NOTE: formatted like rectangle on purpose, so you can see how the texture should look - 1,2,3,4, - 5,0,0,0 + 1, + 2, 3, 4, 5, 0, 0, 0, ]).buffer ), - expectedDim: new Int32Array([5,1,1]), - expectedSize: new Int32Array([4,2]), // 4 * 2 * 1 = 8 + expectedDim: new Int32Array([5, 1, 1]), + expectedSize: new Int32Array([4, 2]), // 4 * 2 * 1 = 8 expectedType: gl.UNSIGNED_BYTE, expectedConstantTextureCount: 1, expectedPixelStorei: false, @@ -207,23 +225,23 @@ test('Uint16Array with unsigned precision 5 length', () => { setupConstantsTestSuite({ gpuSettings: { precision: 'unsigned', - output: [4] + output: [4], }, constant: new Uint16Array([ // NOTE: formatted like rectangle on purpose, so you can see how the texture should look - 1, 2, 3, 4, - 5 + 1, + 2, 3, 4, 5, ]), expectedBitRatio: 2, expectedPixels: new Uint8Array( new Uint16Array([ // NOTE: formatted like rectangle on purpose, so you can see how the texture should look - 1,2,3,4, - 5,0,0,0 + 1, + 2, 3, 4, 5, 0, 0, 0, ]).buffer ), - expectedDim: new Int32Array([5,1,1]), - expectedSize: new Int32Array([2,2]), // 2 * 2 * 2 = 8 + expectedDim: new Int32Array([5, 1, 1]), + expectedSize: new Int32Array([2, 2]), // 2 * 2 * 2 = 8 expectedType: gl.UNSIGNED_BYTE, expectedConstantTextureCount: 1, expectedPixelStorei: false, @@ -233,20 +251,17 @@ test('Uint8Array with unsigned precision 5 length', () => { setupConstantsTestSuite({ gpuSettings: { precision: 'unsigned', - output: [5] + output: [5], }, - constant: new Uint8Array([ - 1, 2, 3, 4, - 5 - ]), + constant: new Uint8Array([1, 2, 3, 4, 5]), expectedBitRatio: 1, expectedPixels: new Uint8Array([ // NOTE: formatted like rectangle on purpose, so you can see how the texture should look - 1,2,3,4, - 5,0,0,0 + 1, + 2, 3, 4, 5, 0, 0, 0, ]), - expectedDim: new Int32Array([5,1,1]), - expectedSize: new Int32Array([1,2]), // 1 * 2 * 4 = 8 + expectedDim: new Int32Array([5, 1, 1]), + expectedSize: new Int32Array([1, 2]), // 1 * 2 * 4 = 8 expectedType: gl.UNSIGNED_BYTE, expectedConstantTextureCount: 1, expectedPixelStorei: false, @@ -257,21 +272,21 @@ test('Array with single precision', () => { setupConstantsTestSuite({ gpuSettings: { precision: 'single', - output: [4] + output: [4], }, constant: [ // NOTE: formatted like rectangle on purpose, so you can see how the texture should look - 1,2,3,4, - 5 + 1, + 2, 3, 4, 5, ], expectedBitRatio: 4, expectedPixels: new Float32Array([ // NOTE: formatted like rectangle on purpose, so you can see how the texture should look - 1,2,3,4, - 5,0,0,0 + 1, + 2, 3, 4, 5, 0, 0, 0, ]), - expectedDim: new Int32Array([5,1,1]), - expectedSize: new Int32Array([1,2]), + expectedDim: new Int32Array([5, 1, 1]), + expectedSize: new Int32Array([1, 2]), expectedType: gl.FLOAT, expectedTextureWidth: 1, expectedTextureHeight: 2, @@ -283,21 +298,21 @@ test('Float32Array with single precision', () => { setupConstantsTestSuite({ gpuSettings: { precision: 'single', - output: [4] + output: [4], }, constant: new Float32Array([ // NOTE: formatted like rectangle on purpose, so you can see how the texture should look - 1,2,3,4, - 5 + 1, + 2, 3, 4, 5, ]), expectedBitRatio: 4, expectedPixels: new Float32Array([ // NOTE: formatted like rectangle on purpose, so you can see how the texture should look - 1,2,3,4, - 5,0,0,0 + 1, + 2, 3, 4, 5, 0, 0, 0, ]), - expectedDim: new Int32Array([5,1,1]), - expectedSize: new Int32Array([1,2]), + expectedDim: new Int32Array([5, 1, 1]), + expectedSize: new Int32Array([1, 2]), expectedType: gl.FLOAT, expectedTextureWidth: 1, expectedTextureHeight: 2, @@ -309,22 +324,22 @@ test('Uint16Array with single precision', () => { setupConstantsTestSuite({ gpuSettings: { precision: 'single', - output: [4] + output: [4], }, constant: new Uint16Array([ // NOTE: formatted like rectangle on purpose, so you can see how the texture should look - 1,2,3,4, - 5 + 1, + 2, 3, 4, 5, ]), // upconverted from 2 expectedBitRatio: 4, expectedPixels: new Float32Array([ // NOTE: formatted like rectangle on purpose, so you can see how the texture should look - 1,2,3,4, - 5,0,0,0 + 1, + 2, 3, 4, 5, 0, 0, 0, ]), - expectedDim: new Int32Array([5,1,1]), - expectedSize: new Int32Array([1,2]), + expectedDim: new Int32Array([5, 1, 1]), + expectedSize: new Int32Array([1, 2]), expectedType: gl.FLOAT, expectedConstantTextureCount: 1, expectedPixelStorei: false, @@ -334,22 +349,22 @@ test('Uint8Array with single precision', () => { setupConstantsTestSuite({ gpuSettings: { precision: 'single', - output: [4] + output: [4], }, constant: new Uint8Array([ // NOTE: formatted like rectangle on purpose, so you can see how the texture should look - 1,2,3,4, - 5 + 1, + 2, 3, 4, 5, ]), // upconverted from 1 expectedBitRatio: 4, expectedPixels: new Float32Array([ // NOTE: formatted like rectangle on purpose, so you can see how the texture should look - 1,2,3,4, - 5,0,0,0 + 1, + 2, 3, 4, 5, 0, 0, 0, ]), - expectedDim: new Int32Array([5,1,1]), - expectedSize: new Int32Array([1,2]), + expectedDim: new Int32Array([5, 1, 1]), + expectedSize: new Int32Array([1, 2]), expectedType: gl.FLOAT, expectedConstantTextureCount: 1, expectedPixelStorei: false, @@ -360,18 +375,15 @@ test('Array with unsigned precision length 33', () => { setupConstantsTestSuite({ gpuSettings: { precision: 'unsigned', - output: [5] + output: [5], }, constant: [ // NOTE: formatted like rectangle on purpose, so you can see how the texture should look // NOTE: Packing is 1 per RGBA, so only 1 of the 4 channels is used // NOTE: 6x6 - 1, 2, 3, 4, 5, 6, - 7, 8, 9, 10, 11, 12, - 13, 14, 15, 16, 17, 18, - 19, 20, 21, 22, 23, 24, - 25, 26, 27, 28, 29, 30, - 31, 32, 33 + 1, + 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, + 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, ], expectedBitRatio: 4, expectedPixels: new Uint8Array( @@ -379,16 +391,13 @@ test('Array with unsigned precision length 33', () => { // NOTE: formatted like rectangle on purpose, so you can see how the texture should look // NOTE: Packing is 1 per RGBA, so only 1 of the 4 channels is used // NOTE: 6x6 - 1, 2, 3, 4, 5, 6, - 7, 8, 9, 10, 11, 12, - 13, 14, 15, 16, 17, 18, - 19, 20, 21, 22, 23, 24, - 25, 26, 27, 28, 29, 30, - 31, 32, 33, 0, 0, 0 + 1, + 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, + 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 0, 0, 0, ]).buffer ), - expectedDim: new Int32Array([33,1,1]), - expectedSize: new Int32Array([6,6]), // 3 * 3 = 9 * 4 = 34 + expectedDim: new Int32Array([33, 1, 1]), + expectedSize: new Int32Array([6, 6]), // 3 * 3 = 9 * 4 = 34 expectedType: gl.UNSIGNED_BYTE, expectedConstantTextureCount: 1, expectedPixelStorei: false, @@ -399,18 +408,15 @@ test('Float32Array with unsigned precision length 33', () => { setupConstantsTestSuite({ gpuSettings: { precision: 'unsigned', - output: [5] + output: [5], }, constant: new Float32Array([ // NOTE: formatted like rectangle on purpose, so you can see how the texture should look // NOTE: Packing is 1 per RGBA, so only 1 of the 4 channels is used // NOTE: 6x6 - 1, 2, 3, 4, 5, 6, - 7, 8, 9, 10, 11, 12, - 13, 14, 15, 16, 17, 18, - 19, 20, 21, 22, 23, 24, - 25, 26, 27, 28, 29, 30, - 31, 32, 33 + 1, + 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, + 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, ]), expectedBitRatio: 4, expectedPixels: new Uint8Array( @@ -418,16 +424,13 @@ test('Float32Array with unsigned precision length 33', () => { // NOTE: formatted like rectangle on purpose, so you can see how the texture should look // NOTE: Packing is 1 per RGBA, so only 1 of the 4 channels is used // NOTE: 6x6 - 1, 2, 3, 4, 5, 6, - 7, 8, 9, 10, 11, 12, - 13, 14, 15, 16, 17, 18, - 19, 20, 21, 22, 23, 24, - 25, 26, 27, 28, 29, 30, - 31, 32, 33, 0, 0, 0, + 1, + 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, + 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 0, 0, 0, ]).buffer ), - expectedDim: new Int32Array([33,1,1]), - expectedSize: new Int32Array([6,6]), // 3 * 3 = 9 * 4 = 34 + expectedDim: new Int32Array([33, 1, 1]), + expectedSize: new Int32Array([6, 6]), // 3 * 3 = 9 * 4 = 34 expectedType: gl.UNSIGNED_BYTE, expectedConstantTextureCount: 1, expectedPixelStorei: false, @@ -438,17 +441,15 @@ test('Uint16Array with unsigned precision length 33', () => { setupConstantsTestSuite({ gpuSettings: { precision: 'unsigned', - output: [5] + output: [5], }, constant: new Uint16Array([ // NOTE: formatted like rectangle on purpose, so you can see how the texture should look // NOTE: Packing is 2 per RGBA, so only 2 of the 4 channels is used // NOTE: 4x5 - 1,2, 3,4, 5,6, 7,8, - 9,10, 11,12, 13,14, 15,16, - 17,18, 19,20, 21,22, 23,24, - 25,26, 27,28, 29,30, 31,32, - 33, + 1, + 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, + 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, ]), expectedBitRatio: 2, expectedPixels: new Uint8Array( @@ -456,15 +457,13 @@ test('Uint16Array with unsigned precision length 33', () => { // NOTE: formatted like rectangle on purpose, so you can see how the texture should look // NOTE: Packing is 2 per RGBA, so only 2 of the 4 channels is used // NOTE: 4x5 - 1,2, 3,4, 5,6, 7,8, - 9,10, 11,12, 13,14, 15,16, - 17,18, 19,20, 21,22, 23,24, - 25,26, 27,28, 29,30, 31,32, - 33,0, 0,0, 0,0, 0,0 + 1, + 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, + 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 0, 0, 0, 0, 0, 0, 0, ]).buffer ), - expectedDim: new Int32Array([33,1,1]), - expectedSize: new Int32Array([4,5]), // 3 * 3 = 9 * 4 = 34 + expectedDim: new Int32Array([33, 1, 1]), + expectedSize: new Int32Array([4, 5]), // 3 * 3 = 9 * 4 = 34 expectedType: gl.UNSIGNED_BYTE, expectedConstantTextureCount: 1, expectedPixelStorei: false, @@ -475,28 +474,29 @@ test('Uint8Array with unsigned precision length 33', () => { setupConstantsTestSuite({ gpuSettings: { precision: 'unsigned', - output: [5] + output: [5], }, constant: new Uint8Array([ // NOTE: formatted like rectangle on purpose, so you can see how the texture should look // NOTE: Packing is 4 per RGBA, so only 2 of the 4 channels is used // NOTE: 3x3 - 1,2,3,4, 5,6,7,8, 9,10,11,12, - 13,14,15,16, 17,18,19,20, 21,22,23,24, - 25,26, 27,28, 29,30,31,32, 33 + 1, + 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, + 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, ]), expectedBitRatio: 1, expectedPixels: new Uint8Array( new Uint8Array([ - // NOTE: formatted like rectangle on purpose, so you can see how the texture should look - // NOTE: Packing is 4 per RGBA, so only 2 of the 4 channels is used - // NOTE: 3x3 - 1,2,3,4, 5,6,7,8, 9,10,11,12, - 13,14,15,16, 17,18,19,20, 21,22,23,24, - 25,26, 27,28, 29,30,31,32, 33,0,0,0 - ]).buffer), - expectedDim: new Int32Array([33,1,1]), - expectedSize: new Int32Array([3,3]), // 3 * 3 = 9 * 4 = 34 + // NOTE: formatted like rectangle on purpose, so you can see how the texture should look + // NOTE: Packing is 4 per RGBA, so only 2 of the 4 channels is used + // NOTE: 3x3 + 1, + 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, + 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 0, 0, 0, + ]).buffer + ), + expectedDim: new Int32Array([33, 1, 1]), + expectedSize: new Int32Array([3, 3]), // 3 * 3 = 9 * 4 = 34 expectedType: gl.UNSIGNED_BYTE, expectedConstantTextureCount: 1, expectedPixelStorei: false, @@ -507,27 +507,27 @@ test('Array with single precision length 33', () => { setupConstantsTestSuite({ gpuSettings: { precision: 'single', - output: [5] + output: [5], }, constant: [ // NOTE: formatted like rectangle on purpose, so you can see how the texture should look // NOTE: Packing is 4 per RGBA, so 4 of the 4 channels is used // NOTE: 3x3 - 1,2,3,4, 5,6,7,8, 9,10,11,12, - 13,14,15,16, 17,18,19,20, 21,22,23,24, - 25,26,27,28, 29,30,31,32, 33 + 1, + 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, + 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, ], expectedBitRatio: 4, expectedPixels: new Float32Array([ // NOTE: formatted like rectangle on purpose, so you can see how the texture should look // NOTE: Packing is 4 per RGBA, so 4 of the 4 channels is used // NOTE: 3x3 - 1,2,3,4, 5,6,7,8, 9,10,11,12, - 13,14,15,16, 17,18,19,20, 21,22,23,24, - 25,26,27,28, 29,30,31,32, 33,0,0,0 + 1, + 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, + 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 0, 0, 0, ]), - expectedDim: new Int32Array([33,1,1]), - expectedSize: new Int32Array([3,3]), // 3 * 3 = 9 * 4 = 34 + expectedDim: new Int32Array([33, 1, 1]), + expectedSize: new Int32Array([3, 3]), // 3 * 3 = 9 * 4 = 34 expectedType: gl.FLOAT, expectedConstantTextureCount: 1, expectedPixelStorei: false, @@ -538,27 +538,27 @@ test('Float32Array with single precision length 33', () => { setupConstantsTestSuite({ gpuSettings: { precision: 'single', - output: [5] + output: [5], }, constant: new Float32Array([ // NOTE: formatted like rectangle on purpose, so you can see how the texture should look // NOTE: Packing is 4 per RGBA, so 4 of the 4 channels is used // NOTE: 3x3 - 1,2,3,4, 5,6,7,8, 9,10,11,12, - 13,14,15,16, 17,18,19,20, 21,22,23,24, - 25,26,27,28, 29,30,31,32, 33 + 1, + 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, + 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, ]), expectedBitRatio: 4, expectedPixels: new Float32Array([ // NOTE: formatted like rectangle on purpose, so you can see how the texture should look // NOTE: Packing is 4 per RGBA, so 4 of the 4 channels is used // NOTE: 3x3 - 1,2,3,4, 5,6,7,8, 9,10,11,12, - 13,14,15,16, 17,18,19,20, 21,22,23,24, - 25,26,27,28, 29,30,31,32, 33,0,0,0 + 1, + 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, + 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 0, 0, 0, ]), - expectedDim: new Int32Array([33,1,1]), - expectedSize: new Int32Array([3,3]), // 3 * 3 = 9 * 4 = 34 + expectedDim: new Int32Array([33, 1, 1]), + expectedSize: new Int32Array([3, 3]), // 3 * 3 = 9 * 4 = 34 expectedType: gl.FLOAT, expectedConstantTextureCount: 1, expectedPixelStorei: false, @@ -569,15 +569,15 @@ test('Uint16Array with single precision length 33', () => { setupConstantsTestSuite({ gpuSettings: { precision: 'single', - output: [5] + output: [5], }, constant: new Uint16Array([ // NOTE: formatted like rectangle on purpose, so you can see how the texture should look // NOTE: Packing is 4 per RGBA, so 4 of the 4 channels is used // NOTE: 3x3 - 1,2,3,4, 5,6,7,8, 9,10,11,12, - 13,14,15,16, 17,18,19,20, 21,22,23,24, - 25,26,27,28, 29,30,31,32, 33 + 1, + 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, + 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, ]), // upconverted from 2 expectedBitRatio: 4, @@ -585,12 +585,12 @@ test('Uint16Array with single precision length 33', () => { // NOTE: formatted like rectangle on purpose, so you can see how the texture should look // NOTE: Packing is 4 per RGBA, so 4 of the 4 channels is used // NOTE: 3x3 - 1,2,3,4, 5,6,7,8, 9,10,11,12, - 13,14,15,16, 17,18,19,20, 21,22,23,24, - 25,26,27,28, 29,30,31,32, 33,0,0,0 + 1, + 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, + 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 0, 0, 0, ]), - expectedDim: new Int32Array([33,1,1]), - expectedSize: new Int32Array([3,3]), // 3 * 3 = 9 * 4 = 36 + expectedDim: new Int32Array([33, 1, 1]), + expectedSize: new Int32Array([3, 3]), // 3 * 3 = 9 * 4 = 36 expectedType: gl.FLOAT, expectedConstantTextureCount: 1, expectedPixelStorei: false, @@ -601,15 +601,15 @@ test('Uint8Array with single precision length 33', () => { setupConstantsTestSuite({ gpuSettings: { precision: 'single', - output: [5] + output: [5], }, constant: new Uint8Array([ // NOTE: formatted like rectangle on purpose, so you can see how the texture should look // NOTE: Packing is 4 per RGBA, so 4 of the 4 channels is used // NOTE: 3x3 - 1,2,3,4, 5,6,7,8, 9,10,11,12, - 13,14,15,16, 17,18,19,20, 21,22,23,24, - 25,26,27,28, 29,30,31,32, 33 + 1, + 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, + 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, ]), // upconverted from 1 expectedBitRatio: 4, @@ -617,12 +617,12 @@ test('Uint8Array with single precision length 33', () => { // NOTE: formatted like rectangle on purpose, so you can see how the texture should look // NOTE: Packing is 4 per RGBA, so 4 of the 4 channels is used // NOTE: 3x3 - 1,2,3,4, 5,6,7,8, 9,10,11,12, - 13,14,15,16, 17,18,19,20, 21,22,23,24, - 25,26,27,28, 29,30,31,32, 33,0,0,0 + 1, + 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, + 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 0, 0, 0, ]), - expectedDim: new Int32Array([33,1,1]), - expectedSize: new Int32Array([3,3]), // 3 * 3 = 9 * 4 = 36 + expectedDim: new Int32Array([33, 1, 1]), + expectedSize: new Int32Array([3, 3]), // 3 * 3 = 9 * 4 = 36 expectedType: gl.FLOAT, expectedConstantTextureCount: 1, expectedPixelStorei: false, @@ -635,21 +635,26 @@ test('Input(Array) with unsigned precision 5 length', () => { setupConstantsTestSuite({ gpuSettings: { precision: 'unsigned', - output: [4] + output: [4], }, - constant: input([ - // NOTE: formatted like rectangle on purpose, so you can see how the texture should look - 1, 2, 3, 4, - 5, 0 - ], [2,3]), + constant: input( + [ + // NOTE: formatted like rectangle on purpose, so you can see how the texture should look + 1, + 2, 3, 4, 5, 0, + ], + [2, 3] + ), expectedBitRatio: 4, - expectedPixels: new Uint8Array(new Float32Array([ - // NOTE: formatted like rectangle on purpose, so you can see how the texture should look - 1,2,3,4, - 5,0,0,0 - ]).buffer), - expectedDim: new Int32Array([2,3,1]), - expectedSize: new Int32Array([4,2]), // 4 * 2 = 8 + expectedPixels: new Uint8Array( + new Float32Array([ + // NOTE: formatted like rectangle on purpose, so you can see how the texture should look + 1, + 2, 3, 4, 5, 0, 0, 0, + ]).buffer + ), + expectedDim: new Int32Array([2, 3, 1]), + expectedSize: new Int32Array([4, 2]), // 4 * 2 = 8 expectedType: gl.UNSIGNED_BYTE, expectedConstantTextureCount: 1, expectedPixelStorei: false, @@ -659,23 +664,26 @@ test('Input(Float32Array) with unsigned precision 5 length', () => { setupConstantsTestSuite({ gpuSettings: { precision: 'unsigned', - output: [4] + output: [4], }, - constant: input(new Float32Array([ - // NOTE: formatted like rectangle on purpose, so you can see how the texture should look - 1, 2, 3, 4, - 5 - ]), [5]), + constant: input( + new Float32Array([ + // NOTE: formatted like rectangle on purpose, so you can see how the texture should look + 1, + 2, 3, 4, 5, + ]), + [5] + ), expectedBitRatio: 4, expectedPixels: new Uint8Array( new Float32Array([ // NOTE: formatted like rectangle on purpose, so you can see how the texture should look - 1,2,3,4, - 5,0,0,0 + 1, + 2, 3, 4, 5, 0, 0, 0, ]).buffer ), - expectedDim: new Int32Array([5,1,1]), - expectedSize: new Int32Array([4,2]), // 4 * 2 * 1 = 8 + expectedDim: new Int32Array([5, 1, 1]), + expectedSize: new Int32Array([4, 2]), // 4 * 2 * 1 = 8 expectedType: gl.UNSIGNED_BYTE, expectedConstantTextureCount: 1, expectedPixelStorei: false, @@ -685,23 +693,26 @@ test('Input(Uint16Array) with unsigned precision 5 length', () => { setupConstantsTestSuite({ gpuSettings: { precision: 'unsigned', - output: [4] + output: [4], }, - constant: input(new Uint16Array([ - // NOTE: formatted like rectangle on purpose, so you can see how the texture should look - 1, 2, 3, 4, - 5, 0, - ]), [2,3]), + constant: input( + new Uint16Array([ + // NOTE: formatted like rectangle on purpose, so you can see how the texture should look + 1, + 2, 3, 4, 5, 0, + ]), + [2, 3] + ), expectedBitRatio: 2, expectedPixels: new Uint8Array( new Uint16Array([ // NOTE: formatted like rectangle on purpose, so you can see how the texture should look - 1,2,3,4, - 5,0,0,0 + 1, + 2, 3, 4, 5, 0, 0, 0, ]).buffer ), - expectedDim: new Int32Array([2,3,1]), - expectedSize: new Int32Array([2,2]), // 2 * 2 * 2 = 8 + expectedDim: new Int32Array([2, 3, 1]), + expectedSize: new Int32Array([2, 2]), // 2 * 2 * 2 = 8 expectedType: gl.UNSIGNED_BYTE, expectedConstantTextureCount: 1, expectedPixelStorei: false, @@ -711,20 +722,17 @@ test('Input(Uint8Array) with unsigned precision 5 length', () => { setupConstantsTestSuite({ gpuSettings: { precision: 'unsigned', - output: [5] + output: [5], }, - constant: input(new Uint8Array([ - 1, 2, 3, 4, - 5,0 - ]),[2, 3]), + constant: input(new Uint8Array([1, 2, 3, 4, 5, 0]), [2, 3]), expectedBitRatio: 1, expectedPixels: new Uint8Array([ // NOTE: formatted like rectangle on purpose, so you can see how the texture should look - 1,2,3,4, - 5,0,0,0 + 1, + 2, 3, 4, 5, 0, 0, 0, ]), - expectedDim: new Int32Array([2,3,1]), - expectedSize: new Int32Array([1,2]), // 1 * 2 * 4 = 8 + expectedDim: new Int32Array([2, 3, 1]), + expectedSize: new Int32Array([1, 2]), // 1 * 2 * 4 = 8 expectedType: gl.UNSIGNED_BYTE, expectedConstantTextureCount: 1, expectedPixelStorei: false, @@ -735,21 +743,24 @@ test('Input(Array) with single precision', () => { setupConstantsTestSuite({ gpuSettings: { precision: 'single', - output: [4] + output: [4], }, - constant: input([ - // NOTE: formatted like rectangle on purpose, so you can see how the texture should look - 1,2,3,4, - 5,0 - ], [2,3]), + constant: input( + [ + // NOTE: formatted like rectangle on purpose, so you can see how the texture should look + 1, + 2, 3, 4, 5, 0, + ], + [2, 3] + ), expectedBitRatio: 4, expectedPixels: new Float32Array([ // NOTE: formatted like rectangle on purpose, so you can see how the texture should look - 1,2,3,4, - 5,0,0,0 + 1, + 2, 3, 4, 5, 0, 0, 0, ]), - expectedDim: new Int32Array([2,3,1]), - expectedSize: new Int32Array([1,2]), + expectedDim: new Int32Array([2, 3, 1]), + expectedSize: new Int32Array([1, 2]), expectedType: gl.FLOAT, expectedTextureWidth: 1, expectedTextureHeight: 2, @@ -761,21 +772,24 @@ test('Input(Float32Array) with single precision', () => { setupConstantsTestSuite({ gpuSettings: { precision: 'single', - output: [4] + output: [4], }, - constant: input(new Float32Array([ - // NOTE: formatted like rectangle on purpose, so you can see how the texture should look - 1,2,3,4, - 5,0 - ]),[2,3]), + constant: input( + new Float32Array([ + // NOTE: formatted like rectangle on purpose, so you can see how the texture should look + 1, + 2, 3, 4, 5, 0, + ]), + [2, 3] + ), expectedBitRatio: 4, expectedPixels: new Float32Array([ // NOTE: formatted like rectangle on purpose, so you can see how the texture should look - 1,2,3,4, - 5,0,0,0 + 1, + 2, 3, 4, 5, 0, 0, 0, ]), - expectedDim: new Int32Array([2,3,1]), - expectedSize: new Int32Array([1,2]), + expectedDim: new Int32Array([2, 3, 1]), + expectedSize: new Int32Array([1, 2]), expectedType: gl.FLOAT, expectedTextureWidth: 1, expectedTextureHeight: 2, @@ -787,22 +801,25 @@ test('Input(Uint16Array) with single precision', () => { setupConstantsTestSuite({ gpuSettings: { precision: 'single', - output: [4] + output: [4], }, - constant: input(new Uint16Array([ - // NOTE: formatted like rectangle on purpose, so you can see how the texture should look - 1,2,3,4, - 5,0 - ]), [2,3]), + constant: input( + new Uint16Array([ + // NOTE: formatted like rectangle on purpose, so you can see how the texture should look + 1, + 2, 3, 4, 5, 0, + ]), + [2, 3] + ), // upconverted from 2 expectedBitRatio: 4, expectedPixels: new Float32Array([ // NOTE: formatted like rectangle on purpose, so you can see how the texture should look - 1,2,3,4, - 5,0,0,0 + 1, + 2, 3, 4, 5, 0, 0, 0, ]), - expectedDim: new Int32Array([2,3,1]), - expectedSize: new Int32Array([1,2]), + expectedDim: new Int32Array([2, 3, 1]), + expectedSize: new Int32Array([1, 2]), expectedType: gl.FLOAT, expectedConstantTextureCount: 1, expectedPixelStorei: false, @@ -812,22 +829,25 @@ test('Input(Uint8Array) with single precision', () => { setupConstantsTestSuite({ gpuSettings: { precision: 'single', - output: [4] + output: [4], }, - constant: input(new Uint8Array([ - // NOTE: formatted like rectangle on purpose, so you can see how the texture should look - 1,2,3,4, - 5,0 - ]), [2,3]), + constant: input( + new Uint8Array([ + // NOTE: formatted like rectangle on purpose, so you can see how the texture should look + 1, + 2, 3, 4, 5, 0, + ]), + [2, 3] + ), // upconverted from 1 expectedBitRatio: 4, expectedPixels: new Float32Array([ // NOTE: formatted like rectangle on purpose, so you can see how the texture should look - 1,2,3,4, - 5,0,0,0 + 1, + 2, 3, 4, 5, 0, 0, 0, ]), - expectedDim: new Int32Array([2,3,1]), - expectedSize: new Int32Array([1,2]), + expectedDim: new Int32Array([2, 3, 1]), + expectedSize: new Int32Array([1, 2]), expectedType: gl.FLOAT, expectedConstantTextureCount: 1, expectedPixelStorei: false, @@ -838,35 +858,32 @@ test('Input(Array) with unsigned precision length 33', () => { setupConstantsTestSuite({ gpuSettings: { precision: 'unsigned', - output: [5] + output: [5], }, - constant: input([ - // NOTE: formatted like rectangle on purpose, so you can see how the texture should look - // NOTE: Packing is 1 per RGBA, so only 1 of the 4 channels is used - // NOTE: 6x6 - 1, 2, 3, 4, 5, 6, - 7, 8, 9, 10, 11, 12, - 13, 14, 15, 16, 17, 18, - 19, 20, 21, 22, 23, 24, - 25, 26, 27, 28, 29, 30, - 31, 32, 33 - ], [33]), + constant: input( + [ + // NOTE: formatted like rectangle on purpose, so you can see how the texture should look + // NOTE: Packing is 1 per RGBA, so only 1 of the 4 channels is used + // NOTE: 6x6 + 1, + 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, + 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, + ], + [33] + ), expectedBitRatio: 4, expectedPixels: new Uint8Array( new Float32Array([ // NOTE: formatted like rectangle on purpose, so you can see how the texture should look // NOTE: Packing is 1 per RGBA, so only 1 of the 4 channels is used // NOTE: 6x6 - 1, 2, 3, 4, 5, 6, - 7, 8, 9, 10, 11, 12, - 13, 14, 15, 16, 17, 18, - 19, 20, 21, 22, 23, 24, - 25, 26, 27, 28, 29, 30, - 31, 32, 33, 0, 0, 0 + 1, + 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, + 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 0, 0, 0, ]).buffer ), - expectedDim: new Int32Array([33,1,1]), - expectedSize: new Int32Array([6,6]), // 3 * 3 = 9 * 4 = 34 + expectedDim: new Int32Array([33, 1, 1]), + expectedSize: new Int32Array([6, 6]), // 3 * 3 = 9 * 4 = 34 expectedType: gl.UNSIGNED_BYTE, expectedConstantTextureCount: 1, expectedPixelStorei: false, @@ -877,35 +894,32 @@ test('Input(Float32Array) with unsigned precision length 33', () => { setupConstantsTestSuite({ gpuSettings: { precision: 'unsigned', - output: [5] + output: [5], }, - constant: input(new Float32Array([ - // NOTE: formatted like rectangle on purpose, so you can see how the texture should look - // NOTE: Packing is 1 per RGBA, so only 1 of the 4 channels is used - // NOTE: 6x6 - 1, 2, 3, 4, 5, 6, - 7, 8, 9, 10, 11, 12, - 13, 14, 15, 16, 17, 18, - 19, 20, 21, 22, 23, 24, - 25, 26, 27, 28, 29, 30, - 31, 32, 33 - ]), [33]), + constant: input( + new Float32Array([ + // NOTE: formatted like rectangle on purpose, so you can see how the texture should look + // NOTE: Packing is 1 per RGBA, so only 1 of the 4 channels is used + // NOTE: 6x6 + 1, + 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, + 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, + ]), + [33] + ), expectedBitRatio: 4, expectedPixels: new Uint8Array( new Float32Array([ // NOTE: formatted like rectangle on purpose, so you can see how the texture should look // NOTE: Packing is 1 per RGBA, so only 1 of the 4 channels is used // NOTE: 6x6 - 1, 2, 3, 4, 5, 6, - 7, 8, 9, 10, 11, 12, - 13, 14, 15, 16, 17, 18, - 19, 20, 21, 22, 23, 24, - 25, 26, 27, 28, 29, 30, - 31, 32, 33, 0, 0, 0, + 1, + 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, + 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 0, 0, 0, ]).buffer ), - expectedDim: new Int32Array([33,1,1]), - expectedSize: new Int32Array([6,6]), // 3 * 3 = 9 * 4 = 34 + expectedDim: new Int32Array([33, 1, 1]), + expectedSize: new Int32Array([6, 6]), // 3 * 3 = 9 * 4 = 34 expectedType: gl.UNSIGNED_BYTE, expectedConstantTextureCount: 1, expectedPixelStorei: false, @@ -916,33 +930,32 @@ test('Input(Uint16Array) with unsigned precision length 33', () => { setupConstantsTestSuite({ gpuSettings: { precision: 'unsigned', - output: [5] + output: [5], }, - constant: input(new Uint16Array([ - // NOTE: formatted like rectangle on purpose, so you can see how the texture should look - // NOTE: Packing is 2 per RGBA, so only 2 of the 4 channels is used - // NOTE: 4x5 - 1,2, 3,4, 5,6, 7,8, - 9,10, 11,12, 13,14, 15,16, - 17,18, 19,20, 21,22, 23,24, - 25,26, 27,28, 29,30, 31,32, - 33, - ]), [33]), + constant: input( + new Uint16Array([ + // NOTE: formatted like rectangle on purpose, so you can see how the texture should look + // NOTE: Packing is 2 per RGBA, so only 2 of the 4 channels is used + // NOTE: 4x5 + 1, + 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, + 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, + ]), + [33] + ), expectedBitRatio: 2, expectedPixels: new Uint8Array( new Uint16Array([ // NOTE: formatted like rectangle on purpose, so you can see how the texture should look // NOTE: Packing is 2 per RGBA, so only 2 of the 4 channels is used // NOTE: 4x5 - 1,2, 3,4, 5,6, 7,8, - 9,10, 11,12, 13,14, 15,16, - 17,18, 19,20, 21,22, 23,24, - 25,26, 27,28, 29,30, 31,32, - 33,0, 0,0, 0,0, 0,0 + 1, + 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, + 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 0, 0, 0, 0, 0, 0, 0, ]).buffer ), - expectedDim: new Int32Array([33,1,1]), - expectedSize: new Int32Array([4,5]), // 3 * 3 = 9 * 4 = 34 + expectedDim: new Int32Array([33, 1, 1]), + expectedSize: new Int32Array([4, 5]), // 3 * 3 = 9 * 4 = 34 expectedType: gl.UNSIGNED_BYTE, expectedConstantTextureCount: 1, expectedPixelStorei: false, @@ -953,28 +966,32 @@ test('Input(Uint8Array) with unsigned precision length 33', () => { setupConstantsTestSuite({ gpuSettings: { precision: 'unsigned', - output: [5] + output: [5], }, - constant: input(new Uint8Array([ - // NOTE: formatted like rectangle on purpose, so you can see how the texture should look - // NOTE: Packing is 4 per RGBA, so only 2 of the 4 channels is used - // NOTE: 3x3 - 1,2,3,4, 5,6,7,8, 9,10,11,12, - 13,14,15,16, 17,18,19,20, 21,22,23,24, - 25,26, 27,28, 29,30,31,32, 33 - ]), [33]), + constant: input( + new Uint8Array([ + // NOTE: formatted like rectangle on purpose, so you can see how the texture should look + // NOTE: Packing is 4 per RGBA, so only 2 of the 4 channels is used + // NOTE: 3x3 + 1, + 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, + 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, + ]), + [33] + ), expectedBitRatio: 1, expectedPixels: new Uint8Array( new Uint8Array([ // NOTE: formatted like rectangle on purpose, so you can see how the texture should look // NOTE: Packing is 4 per RGBA, so only 2 of the 4 channels is used // NOTE: 3x3 - 1,2,3,4, 5,6,7,8, 9,10,11,12, - 13,14,15,16, 17,18,19,20, 21,22,23,24, - 25,26, 27,28, 29,30,31,32, 33,0,0,0 - ]).buffer), - expectedDim: new Int32Array([33,1,1]), - expectedSize: new Int32Array([3,3]), // 3 * 3 = 9 * 4 = 34 + 1, + 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, + 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 0, 0, 0, + ]).buffer + ), + expectedDim: new Int32Array([33, 1, 1]), + expectedSize: new Int32Array([3, 3]), // 3 * 3 = 9 * 4 = 34 expectedType: gl.UNSIGNED_BYTE, expectedConstantTextureCount: 1, expectedPixelStorei: false, @@ -985,27 +1002,30 @@ test('Input(Array) with single precision length 33', () => { setupConstantsTestSuite({ gpuSettings: { precision: 'single', - output: [5] + output: [5], }, - constant: input([ - // NOTE: formatted like rectangle on purpose, so you can see how the texture should look - // NOTE: Packing is 4 per RGBA, so 4 of the 4 channels is used - // NOTE: 3x3 - 1,2,3,4, 5,6,7,8, 9,10,11,12, - 13,14,15,16, 17,18,19,20, 21,22,23,24, - 25,26,27,28, 29,30,31,32, 33 - ], [33]), + constant: input( + [ + // NOTE: formatted like rectangle on purpose, so you can see how the texture should look + // NOTE: Packing is 4 per RGBA, so 4 of the 4 channels is used + // NOTE: 3x3 + 1, + 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, + 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, + ], + [33] + ), expectedBitRatio: 4, expectedPixels: new Float32Array([ // NOTE: formatted like rectangle on purpose, so you can see how the texture should look // NOTE: Packing is 4 per RGBA, so 4 of the 4 channels is used // NOTE: 3x3 - 1,2,3,4, 5,6,7,8, 9,10,11,12, - 13,14,15,16, 17,18,19,20, 21,22,23,24, - 25,26,27,28, 29,30,31,32, 33,0,0,0 + 1, + 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, + 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 0, 0, 0, ]), - expectedDim: new Int32Array([33,1,1]), - expectedSize: new Int32Array([3,3]), // 3 * 3 = 9 * 4 = 34 + expectedDim: new Int32Array([33, 1, 1]), + expectedSize: new Int32Array([3, 3]), // 3 * 3 = 9 * 4 = 34 expectedType: gl.FLOAT, expectedConstantTextureCount: 1, expectedPixelStorei: false, @@ -1016,27 +1036,30 @@ test('Input(Float32Array) with single precision length 33', () => { setupConstantsTestSuite({ gpuSettings: { precision: 'single', - output: [5] + output: [5], }, - constant: input(new Float32Array([ - // NOTE: formatted like rectangle on purpose, so you can see how the texture should look - // NOTE: Packing is 4 per RGBA, so 4 of the 4 channels is used - // NOTE: 3x3 - 1,2,3,4, 5,6,7,8, 9,10,11,12, - 13,14,15,16, 17,18,19,20, 21,22,23,24, - 25,26,27,28, 29,30,31,32, 33 - ]), [33]), + constant: input( + new Float32Array([ + // NOTE: formatted like rectangle on purpose, so you can see how the texture should look + // NOTE: Packing is 4 per RGBA, so 4 of the 4 channels is used + // NOTE: 3x3 + 1, + 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, + 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, + ]), + [33] + ), expectedBitRatio: 4, expectedPixels: new Float32Array([ // NOTE: formatted like rectangle on purpose, so you can see how the texture should look // NOTE: Packing is 4 per RGBA, so 4 of the 4 channels is used // NOTE: 3x3 - 1,2,3,4, 5,6,7,8, 9,10,11,12, - 13,14,15,16, 17,18,19,20, 21,22,23,24, - 25,26,27,28, 29,30,31,32, 33,0,0,0 + 1, + 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, + 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 0, 0, 0, ]), - expectedDim: new Int32Array([33,1,1]), - expectedSize: new Int32Array([3,3]), // 3 * 3 = 9 * 4 = 34 + expectedDim: new Int32Array([33, 1, 1]), + expectedSize: new Int32Array([3, 3]), // 3 * 3 = 9 * 4 = 34 expectedType: gl.FLOAT, expectedConstantTextureCount: 1, expectedPixelStorei: false, @@ -1047,28 +1070,31 @@ test('Input(Uint16Array) with single precision length 33', () => { setupConstantsTestSuite({ gpuSettings: { precision: 'single', - output: [5] + output: [5], }, - constant: input(new Uint16Array([ - // NOTE: formatted like rectangle on purpose, so you can see how the texture should look - // NOTE: Packing is 4 per RGBA, so 4 of the 4 channels is used - // NOTE: 3x3 - 1,2,3,4, 5,6,7,8, 9,10,11,12, - 13,14,15,16, 17,18,19,20, 21,22,23,24, - 25,26,27,28, 29,30,31,32, 33 - ]), [33]), + constant: input( + new Uint16Array([ + // NOTE: formatted like rectangle on purpose, so you can see how the texture should look + // NOTE: Packing is 4 per RGBA, so 4 of the 4 channels is used + // NOTE: 3x3 + 1, + 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, + 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, + ]), + [33] + ), // upconverted from 2 expectedBitRatio: 4, expectedPixels: new Float32Array([ // NOTE: formatted like rectangle on purpose, so you can see how the texture should look // NOTE: Packing is 4 per RGBA, so 4 of the 4 channels is used // NOTE: 3x3 - 1,2,3,4, 5,6,7,8, 9,10,11,12, - 13,14,15,16, 17,18,19,20, 21,22,23,24, - 25,26,27,28, 29,30,31,32, 33,0,0,0 + 1, + 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, + 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 0, 0, 0, ]), - expectedDim: new Int32Array([33,1,1]), - expectedSize: new Int32Array([3,3]), // 3 * 3 = 9 * 4 = 36 + expectedDim: new Int32Array([33, 1, 1]), + expectedSize: new Int32Array([3, 3]), // 3 * 3 = 9 * 4 = 36 expectedType: gl.FLOAT, expectedConstantTextureCount: 1, expectedPixelStorei: false, @@ -1079,28 +1105,31 @@ test('Input(Uint8Array) with single precision length 33', () => { setupConstantsTestSuite({ gpuSettings: { precision: 'single', - output: [5] + output: [5], }, - constant: input(new Uint8Array([ - // NOTE: formatted like rectangle on purpose, so you can see how the texture should look - // NOTE: Packing is 4 per RGBA (8 bit, but upconverted to float32), so only 4 of the 4 channels is used - // NOTE: 3x3 - 1,2,3,4, 5,6,7,8, 9,10,11,12, - 13,14,15,16, 17,18,19,20, 21,22,23,24, - 25,26,27,28, 29,30,31,32, 33 - ]), [33]), + constant: input( + new Uint8Array([ + // NOTE: formatted like rectangle on purpose, so you can see how the texture should look + // NOTE: Packing is 4 per RGBA (8 bit, but upconverted to float32), so only 4 of the 4 channels is used + // NOTE: 3x3 + 1, + 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, + 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, + ]), + [33] + ), // upconverted to float32 expectedBitRatio: 4, expectedPixels: new Float32Array([ // NOTE: formatted like rectangle on purpose, so you can see how the texture should look // NOTE: Packing is 4 per RGBA (8 bit, but upconverted to float32), so only 4 of the 4 channels is used // NOTE: 3x3 - 1,2,3,4, 5,6,7,8, 9,10,11,12, - 13,14,15,16, 17,18,19,20, 21,22,23,24, - 25,26,27,28, 29,30,31,32, 33,0,0,0 + 1, + 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, + 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 0, 0, 0, ]), - expectedDim: new Int32Array([33,1,1]), - expectedSize: new Int32Array([3,3]), // 3 * 3 = 9 * 4 = 36 + expectedDim: new Int32Array([33, 1, 1]), + expectedSize: new Int32Array([3, 3]), // 3 * 3 = 9 * 4 = 36 expectedType: gl.FLOAT, expectedConstantTextureCount: 1, expectedPixelStorei: false, diff --git a/test/internal/backend/web-gl2/kernel-value/dynamic-html-image-array.js b/test/internal/backend/web-gl2/kernel-value/dynamic-html-image-array.js index a75b2305..267233b3 100644 --- a/test/internal/backend/web-gl2/kernel-value/dynamic-html-image-array.js +++ b/test/internal/backend/web-gl2/kernel-value/dynamic-html-image-array.js @@ -1,5 +1,5 @@ const { assert, skip, test, module: describe, only } = require('qunit'); -const { webGL2KernelValueMaps } = require('../../../../../src'); +const { webGL2KernelValueMaps } = require('../../../../..'); describe('internal: WebGL2KernelValueDynamicHTMLImage'); @@ -10,16 +10,19 @@ test('.updateValue() checks too large height', () => { }, validate: true, }; - const v = new webGL2KernelValueMaps.unsigned.dynamic.HTMLImageArray([{ width: 1, height: 1 }], { - kernel: mockKernel, - name: 'test', - type: 'HTMLImage', - origin: 'user', - tactic: 'speed', - onRequestContextHandle: () => 1, - onRequestTexture: () => null, - onRequestIndex: () => 1 - }); + const v = new webGL2KernelValueMaps.unsigned.dynamic.HTMLImageArray( + [{ width: 1, height: 1 }], + { + kernel: mockKernel, + name: 'test', + type: 'HTMLImage', + origin: 'user', + tactic: 'speed', + onRequestContextHandle: () => 1, + onRequestTexture: () => null, + onRequestIndex: () => 1, + } + ); assert.throws(() => { v.updateValue([{ width: 1, height: 2 }]); @@ -34,21 +37,26 @@ test('.updateValue() checks too large width', () => { validate: true, }; - const v = new webGL2KernelValueMaps.unsigned.dynamic.HTMLImageArray([{ width: 1, height: 1 }], { - kernel: mockKernel, - name: 'test', - type: 'HTMLImageArray', - origin: 'user', - tactic: 'speed', - onRequestContextHandle: () => 1, - onRequestTexture: () => null, - onRequestIndex: () => 1 - }); + const v = new webGL2KernelValueMaps.unsigned.dynamic.HTMLImageArray( + [{ width: 1, height: 1 }], + { + kernel: mockKernel, + name: 'test', + type: 'HTMLImageArray', + origin: 'user', + tactic: 'speed', + onRequestContextHandle: () => 1, + onRequestTexture: () => null, + onRequestIndex: () => 1, + } + ); assert.throws(() => { - v.updateValue([{ - height: 1, - width: 2, - }]) + v.updateValue([ + { + height: 1, + width: 2, + }, + ]); }, new Error('Argument texture width of 2 larger than maximum size of 1 for your GPU')); }); @@ -70,21 +78,26 @@ test('.updateValue() checks ok height & width', () => { texImage3D: () => {}, texSubImage3D: () => {}, }; - const v = new webGL2KernelValueMaps.unsigned.dynamic.HTMLImageArray([{ width: 2, height: 2 }], { - kernel: mockKernel, - name: 'test', - type: 'HTMLImageArray', - origin: 'user', - tactic: 'speed', - context: mockContext, - onRequestContextHandle: () => 1, - onRequestTexture: () => null, - onRequestIndex: () => 1 - }); - v.updateValue([{ - height: 1, - width: 1, - }]); + const v = new webGL2KernelValueMaps.unsigned.dynamic.HTMLImageArray( + [{ width: 2, height: 2 }], + { + kernel: mockKernel, + name: 'test', + type: 'HTMLImageArray', + origin: 'user', + tactic: 'speed', + context: mockContext, + onRequestContextHandle: () => 1, + onRequestTexture: () => null, + onRequestIndex: () => 1, + } + ); + v.updateValue([ + { + height: 1, + width: 1, + }, + ]); assert.equal(v.constructor.name, 'WebGL2KernelValueDynamicHTMLImageArray'); }); diff --git a/test/internal/backend/web-gl2/kernel-value/dynamic-single-array.js b/test/internal/backend/web-gl2/kernel-value/dynamic-single-array.js index 150339da..13962d67 100644 --- a/test/internal/backend/web-gl2/kernel-value/dynamic-single-array.js +++ b/test/internal/backend/web-gl2/kernel-value/dynamic-single-array.js @@ -1,5 +1,5 @@ const { assert, skip, test, module: describe, only } = require('qunit'); -const { webGL2KernelValueMaps } = require('../../../../../src'); +const { webGL2KernelValueMaps } = require('../../../../..'); describe('internal: WebGL2KernelValueDynamicSingleArray'); @@ -10,7 +10,7 @@ test('.updateValue() checks too large', () => { }, validate: true, }; - const v = new webGL2KernelValueMaps.single.dynamic.Array([1,2], { + const v = new webGL2KernelValueMaps.single.dynamic.Array([1, 2], { kernel: mockKernel, name: 'test', type: 'Array', @@ -18,11 +18,11 @@ test('.updateValue() checks too large', () => { tactic: 'speed', onRequestContextHandle: () => 1, onRequestTexture: () => null, - onRequestIndex: () => 1 + onRequestIndex: () => 1, }); assert.throws(() => { - v.updateValue(new Array([1,2,3,4,5,6,7,8])); + v.updateValue(new Array([1, 2, 3, 4, 5, 6, 7, 8])); }, new Error('Argument texture height of 2 larger than maximum size of 1 for your GPU')); }); @@ -43,7 +43,7 @@ test('.updateValue() checks ok', () => { pixelStorei: () => {}, texImage2D: () => {}, }; - const v = new webGL2KernelValueMaps.single.dynamic.Array([1,2], { + const v = new webGL2KernelValueMaps.single.dynamic.Array([1, 2], { kernel: mockKernel, name: 'test', type: 'Array', @@ -52,9 +52,9 @@ test('.updateValue() checks ok', () => { context: mockContext, onRequestContextHandle: () => 1, onRequestTexture: () => null, - onRequestIndex: () => 1 + onRequestIndex: () => 1, }); - v.updateValue(new Array([2,1])); + v.updateValue(new Array([2, 1])); assert.equal(v.constructor.name, 'WebGL2KernelValueDynamicSingleArray'); }); diff --git a/test/internal/backend/web-gl2/kernel-value/dynamic-single-input.js b/test/internal/backend/web-gl2/kernel-value/dynamic-single-input.js index 056c5170..b69850d5 100644 --- a/test/internal/backend/web-gl2/kernel-value/dynamic-single-input.js +++ b/test/internal/backend/web-gl2/kernel-value/dynamic-single-input.js @@ -1,5 +1,5 @@ const { assert, skip, test, module: describe, only } = require('qunit'); -const { webGL2KernelValueMaps } = require('../../../../../src'); +const { webGL2KernelValueMaps } = require('../../../../..'); describe('internal: WebGLKernelValueDynamicSingleInput'); @@ -10,19 +10,22 @@ test('.updateValue() checks too large height', () => { }, validate: true, }; - const v = new webGL2KernelValueMaps.single.dynamic.Input({ size: [5, 5], value: [0] }, { - kernel: mockKernel, - name: 'test', - type: 'Input', - origin: 'user', - tactic: 'speed', - onRequestContextHandle: () => 1, - onRequestTexture: () => null, - onRequestIndex: () => 1 - }); + const v = new webGL2KernelValueMaps.single.dynamic.Input( + { size: [5, 5], value: [0] }, + { + kernel: mockKernel, + name: 'test', + type: 'Input', + origin: 'user', + tactic: 'speed', + onRequestContextHandle: () => 1, + onRequestTexture: () => null, + onRequestIndex: () => 1, + } + ); assert.throws(() => { - v.updateValue({ size: [16,16] }); + v.updateValue({ size: [16, 16] }); }, new Error('Argument texture height and width of 8 larger than maximum size of 4 for your GPU')); }); @@ -34,20 +37,23 @@ test('.updateValue() checks too large width', () => { validate: true, }; - const v = new webGL2KernelValueMaps.single.dynamic.Input({ size: [1, 1], value: [0] }, { - kernel: mockKernel, - name: 'test', - type: 'Input', - origin: 'user', - tactic: 'speed', - onRequestContextHandle: () => 1, - onRequestTexture: () => null, - onRequestIndex: () => 1 - }); + const v = new webGL2KernelValueMaps.single.dynamic.Input( + { size: [1, 1], value: [0] }, + { + kernel: mockKernel, + name: 'test', + type: 'Input', + origin: 'user', + tactic: 'speed', + onRequestContextHandle: () => 1, + onRequestTexture: () => null, + onRequestIndex: () => 1, + } + ); assert.throws(() => { v.updateValue({ - size: [12,12] - }) + size: [12, 12], + }); }, new Error('Argument texture height and width of 6 larger than maximum size of 4 for your GPU')); }); @@ -68,21 +74,24 @@ test('.updateValue() checks ok height & width', () => { pixelStorei: () => {}, texImage2D: () => {}, }; - const v = new webGL2KernelValueMaps.single.dynamic.Input({ size: [2,2], context: mockContext, value: [0] }, { - kernel: mockKernel, - name: 'test', - type: 'Input', - origin: 'user', - tactic: 'speed', - context: mockContext, - onRequestContextHandle: () => 1, - onRequestTexture: () => null, - onRequestIndex: () => 1 - }); + const v = new webGL2KernelValueMaps.single.dynamic.Input( + { size: [2, 2], context: mockContext, value: [0] }, + { + kernel: mockKernel, + name: 'test', + type: 'Input', + origin: 'user', + tactic: 'speed', + context: mockContext, + onRequestContextHandle: () => 1, + onRequestTexture: () => null, + onRequestIndex: () => 1, + } + ); v.updateValue({ - size: [1,1], + size: [1, 1], context: mockContext, - value: [0] + value: [0], }); assert.equal(v.constructor.name, 'WebGL2KernelValueDynamicSingleInput'); diff --git a/test/internal/backend/web-gl2/kernel-value/html-image-array.js b/test/internal/backend/web-gl2/kernel-value/html-image-array.js index 00eb5f69..d5ca4e23 100644 --- a/test/internal/backend/web-gl2/kernel-value/html-image-array.js +++ b/test/internal/backend/web-gl2/kernel-value/html-image-array.js @@ -1,5 +1,5 @@ const { assert, skip, test, module: describe, only } = require('qunit'); -const { webGL2KernelValueMaps } = require('../../../../../src'); +const { webGL2KernelValueMaps } = require('../../../../..'); describe('internal: WebGL2KernelValueHTMLImageArray'); @@ -11,16 +11,19 @@ test('.constructor() checks too large height', () => { validate: true, }; assert.throws(() => { - new webGL2KernelValueMaps.unsigned.static.HTMLImageArray([{ width: 1, height: 2 }], { - kernel: mockKernel, - name: 'test', - type: 'HTMLImageArray', - origin: 'user', - tactic: 'speed', - onRequestContextHandle: () => 1, - onRequestTexture: () => null, - onRequestIndex: () => 1 - }); + new webGL2KernelValueMaps.unsigned.static.HTMLImageArray( + [{ width: 1, height: 2 }], + { + kernel: mockKernel, + name: 'test', + type: 'HTMLImageArray', + origin: 'user', + tactic: 'speed', + onRequestContextHandle: () => 1, + onRequestTexture: () => null, + onRequestIndex: () => 1, + } + ); }, new Error('Argument texture height of 2 larger than maximum size of 1 for your GPU')); }); @@ -32,16 +35,19 @@ test('.constructor() checks too large width', () => { validate: true, }; assert.throws(() => { - new webGL2KernelValueMaps.unsigned.static.HTMLImageArray([{ width: 2, height: 1 }], { - kernel: mockKernel, - name: 'test', - type: 'HTMLImageArray', - origin: 'user', - tactic: 'speed', - onRequestContextHandle: () => 1, - onRequestTexture: () => null, - onRequestIndex: () => 1 - }); + new webGL2KernelValueMaps.unsigned.static.HTMLImageArray( + [{ width: 2, height: 1 }], + { + kernel: mockKernel, + name: 'test', + type: 'HTMLImageArray', + origin: 'user', + tactic: 'speed', + onRequestContextHandle: () => 1, + onRequestTexture: () => null, + onRequestIndex: () => 1, + } + ); }, new Error('Argument texture width of 2 larger than maximum size of 1 for your GPU')); }); @@ -52,15 +58,18 @@ test('.constructor() checks ok height & width', () => { }, validate: true, }; - const v = new webGL2KernelValueMaps.unsigned.static.HTMLImageArray([{ width: 2, height: 2 }], { - kernel: mockKernel, - name: 'test', - type: 'HTMLImageArray', - origin: 'user', - tactic: 'speed', - onRequestContextHandle: () => 1, - onRequestTexture: () => null, - onRequestIndex: () => 1 - }); + const v = new webGL2KernelValueMaps.unsigned.static.HTMLImageArray( + [{ width: 2, height: 2 }], + { + kernel: mockKernel, + name: 'test', + type: 'HTMLImageArray', + origin: 'user', + tactic: 'speed', + onRequestContextHandle: () => 1, + onRequestTexture: () => null, + onRequestIndex: () => 1, + } + ); assert.equal(v.constructor.name, 'WebGL2KernelValueHTMLImageArray'); }); diff --git a/test/internal/backend/web-gl2/kernel-value/single-input.js b/test/internal/backend/web-gl2/kernel-value/single-input.js index 0a769d0a..16823c12 100644 --- a/test/internal/backend/web-gl2/kernel-value/single-input.js +++ b/test/internal/backend/web-gl2/kernel-value/single-input.js @@ -1,5 +1,5 @@ const { assert, skip, test, module: describe, only } = require('qunit'); -const { webGL2KernelValueMaps } = require('../../../../../src'); +const { webGL2KernelValueMaps } = require('../../../../..'); describe('internal: WebGL2KernelValueSingleInput'); @@ -11,16 +11,19 @@ test('.constructor() checks too large height', () => { validate: true, }; assert.throws(() => { - new webGL2KernelValueMaps.single.static.Input({ size: [8,1], value: [1,2] }, { - kernel: mockKernel, - name: 'test', - type: 'Array', - origin: 'user', - tactic: 'speed', - onRequestContextHandle: () => 1, - onRequestTexture: () => null, - onRequestIndex: () => 1 - }); + new webGL2KernelValueMaps.single.static.Input( + { size: [8, 1], value: [1, 2] }, + { + kernel: mockKernel, + name: 'test', + type: 'Array', + origin: 'user', + tactic: 'speed', + onRequestContextHandle: () => 1, + onRequestTexture: () => null, + onRequestIndex: () => 1, + } + ); }, new Error('Argument texture height of 2 larger than maximum size of 1 for your GPU')); }); @@ -41,16 +44,19 @@ test('.constructor() checks ok height & width', () => { pixelStorei: () => {}, texImage2D: () => {}, }; - const v = new webGL2KernelValueMaps.single.static.Input({ size: [1,2], value: [1,2] }, { - kernel: mockKernel, - name: 'test', - type: 'Array', - origin: 'user', - tactic: 'speed', - context: mockContext, - onRequestContextHandle: () => 1, - onRequestTexture: () => null, - onRequestIndex: () => 1 - }); + const v = new webGL2KernelValueMaps.single.static.Input( + { size: [1, 2], value: [1, 2] }, + { + kernel: mockKernel, + name: 'test', + type: 'Array', + origin: 'user', + tactic: 'speed', + context: mockContext, + onRequestContextHandle: () => 1, + onRequestTexture: () => null, + onRequestIndex: () => 1, + } + ); assert.equal(v.constructor.name, 'WebGL2KernelValueSingleInput'); }); diff --git a/test/internal/backend/web-gl2/kernel/index.js b/test/internal/backend/web-gl2/kernel/index.js index 97221a5c..7cba8a7c 100644 --- a/test/internal/backend/web-gl2/kernel/index.js +++ b/test/internal/backend/web-gl2/kernel/index.js @@ -1,27 +1,30 @@ const { assert, skip, test, module: describe, only } = require('qunit'); -const { WebGL2Kernel } = require('../../../../../src'); +const { WebGL2Kernel } = require('../../../../..'); describe('internal: WebGL2Kernel'); -(typeof global !== 'undefined' ? test : skip)('.setupFeatureChecks() if context is available, but .getExtension() is falsey', () => { - const mockContext = { - getExtension: null // this is important - }; - const mockElement = { - getContext: () => mockContext, - }; - const mockDocument = { - createElement: () => { - return mockElement; - } - }; - global.document = mockDocument; +(typeof global !== 'undefined' ? test : skip)( + '.setupFeatureChecks() if context is available, but .getExtension() is falsey', + () => { + const mockContext = { + getExtension: null, // this is important + }; + const mockElement = { + getContext: () => mockContext, + }; + const mockDocument = { + createElement: () => { + return mockElement; + }, + }; + global.document = mockDocument; - WebGL2Kernel.setupFeatureChecks(); - assert.ok(true); + WebGL2Kernel.setupFeatureChecks(); + assert.ok(true); - delete global.document; -}); + delete global.document; + } +); test('.validateSettings() checks output texture size - too large', () => { const mockContext = { diff --git a/test/internal/backend/web-gl2/kernel/setupArguments.js b/test/internal/backend/web-gl2/kernel/setupArguments.js index 8acd0176..dc8404a2 100644 --- a/test/internal/backend/web-gl2/kernel/setupArguments.js +++ b/test/internal/backend/web-gl2/kernel/setupArguments.js @@ -1,5 +1,5 @@ const { assert, skip, test, module: describe, only } = require('qunit'); -const { WebGL2Kernel, input } = require('../../../../../src'); +const { WebGL2Kernel, input } = require('../../../../..'); describe('internal WebGL2Kernel.setupArguments Array'); const gl = { @@ -37,102 +37,121 @@ function setupArgumentsTestSuite(testSuiteSettings) { let uniform3ivCalled = false; let uniform2ivCalled = false; let uniform1iCalled = false; - const mockContext = Object.assign({ - activeTexture: (index) => { - assert.equal(index, 0); - activeTextureCalled = true; - }, - bindTexture: (target, texture) => { - assert.equal(target, 'TEXTURE_2D'); - assert.equal(texture, 'TEXTURE'); - bindTextureCalled = true; - }, - texParameteri: (target, pname, param) => { - switch (texParameteriCalls) { - case 0: - assert.equal(target, 'TEXTURE_2D'); - assert.equal(pname, 'TEXTURE_WRAP_S'); - assert.equal(param, 'CLAMP_TO_EDGE'); - texParameteriCalls++; - break; - case 1: - assert.equal(target, 'TEXTURE_2D'); - assert.equal(pname, 'TEXTURE_WRAP_T'); - assert.equal(param, 'CLAMP_TO_EDGE'); - texParameteriCalls++; - break; - case 2: - assert.equal(target, 'TEXTURE_2D'); - assert.equal(pname, 'TEXTURE_MIN_FILTER'); - assert.equal(param, 'NEAREST'); - texParameteriCalls++; - break; - case 3: - assert.equal(target, 'TEXTURE_2D'); - assert.equal(pname, 'TEXTURE_MAG_FILTER'); - assert.equal(param, 'NEAREST'); - texParameteriCalls++; - break; - default: + const mockContext = Object.assign( + { + activeTexture: index => { + assert.equal(index, 0); + activeTextureCalled = true; + }, + bindTexture: (target, texture) => { + assert.equal(target, 'TEXTURE_2D'); + assert.equal(texture, 'TEXTURE'); + bindTextureCalled = true; + }, + texParameteri: (target, pname, param) => { + switch (texParameteriCalls) { + case 0: + assert.equal(target, 'TEXTURE_2D'); + assert.equal(pname, 'TEXTURE_WRAP_S'); + assert.equal(param, 'CLAMP_TO_EDGE'); + texParameteriCalls++; + break; + case 1: + assert.equal(target, 'TEXTURE_2D'); + assert.equal(pname, 'TEXTURE_WRAP_T'); + assert.equal(param, 'CLAMP_TO_EDGE'); + texParameteriCalls++; + break; + case 2: + assert.equal(target, 'TEXTURE_2D'); + assert.equal(pname, 'TEXTURE_MIN_FILTER'); + assert.equal(param, 'NEAREST'); + texParameteriCalls++; + break; + case 3: + assert.equal(target, 'TEXTURE_2D'); + assert.equal(pname, 'TEXTURE_MAG_FILTER'); + assert.equal(param, 'NEAREST'); + texParameteriCalls++; + break; + default: + throw new Error('called too many times'); + } + }, + pixelStorei: (pname, param) => { + assert.equal(pname, 'UNPACK_FLIP_Y_WEBGL'); + assert.equal(param, expectedPixelStorei); + }, + createTexture: () => 'TEXTURE', + getUniformLocation: (program, name) => { + assert.equal(program, 'program'); + if (getUniformLocationCalls > 3) { throw new Error('called too many times'); - } - }, - pixelStorei: (pname, param) => { - assert.equal(pname, 'UNPACK_FLIP_Y_WEBGL'); - assert.equal(param, expectedPixelStorei); - }, - createTexture: () => 'TEXTURE', - getUniformLocation: (program, name) => { - assert.equal(program, 'program'); - if (getUniformLocationCalls > 3) { - throw new Error('called too many times'); - } - getUniformLocationCalls++; - return { - user_vDim: 'user_vDimLocation', - user_vSize: 'user_vSizeLocation', - user_v: 'user_vLocation', - }[name]; + } + getUniformLocationCalls++; + return { + user_vDim: 'user_vDimLocation', + user_vSize: 'user_vSizeLocation', + user_v: 'user_vLocation', + }[name]; + }, + uniform3iv: (location, value) => { + assert.equal(location, 'user_vDimLocation'); + assert.deepEqual(value, expectedDim); + uniform3ivCalled = true; + }, + uniform2iv: (location, value) => { + assert.equal(location, 'user_vSizeLocation'); + assert.deepEqual(value, expectedSize); + uniform2ivCalled = true; + }, + uniform1i: (location, value) => { + assert.equal(location, 'user_vLocation'); + assert.equal(value, 0); + uniform1iCalled = true; + }, + texImage2D: ( + target, + level, + internalFormat, + width, + height, + border, + format, + type, + pixels + ) => { + assert.equal(target, gl.TEXTURE_2D); + assert.equal(level, 0); + assert.equal( + internalFormat, + gpuSettings.precision === 'single' ? gl.RGBA32F : gl.RGBA + ); + assert.equal(width, expectedSize[0]); + assert.equal(height, expectedSize[1]); + assert.equal(border, 0); + assert.equal(format, gl.RGBA); + assert.equal(type, expectedType); + assert.equal(pixels.length, expectedPixels.length); + assert.deepEqual(pixels, expectedPixels); + texImage2DCalled = true; + }, }, - uniform3iv: (location, value) => { - assert.equal(location, 'user_vDimLocation'); - assert.deepEqual(value, expectedDim); - uniform3ivCalled = true; - }, - uniform2iv: (location, value) => { - assert.equal(location, 'user_vSizeLocation'); - assert.deepEqual(value, expectedSize); - uniform2ivCalled = true; - }, - uniform1i: (location, value) => { - assert.equal(location, 'user_vLocation'); - assert.equal(value, 0); - uniform1iCalled = true; - }, - texImage2D: (target, level, internalFormat, width, height, border, format, type, pixels) => { - assert.equal(target, gl.TEXTURE_2D); - assert.equal(level, 0); - assert.equal(internalFormat, gpuSettings.precision === 'single' ? gl.RGBA32F : gl.RGBA); - assert.equal(width, expectedSize[0]); - assert.equal(height, expectedSize[1]); - assert.equal(border, 0); - assert.equal(format, gl.RGBA); - assert.equal(type, expectedType); - assert.equal(pixels.length, expectedPixels.length); - assert.deepEqual(pixels, expectedPixels); - texImage2DCalled = true; - } - }, gl); + gl + ); const source = `function(v) { return v[this.thread.x]; }`; const settings = { context: mockContext, }; - const kernel = new WebGL2Kernel(source, Object.assign({}, settings, gpuSettings)); + const kernel = new WebGL2Kernel( + source, + Object.assign({}, settings, gpuSettings) + ); kernel.constructor = { lookupKernelValueType: WebGL2Kernel.lookupKernelValueType, features: { - maxTextureSize: 9999 - } + maxTextureSize: 9999, + }, }; const args = [argument]; kernel.program = 'program'; @@ -159,21 +178,23 @@ test('Array with unsigned precision 5 length', () => { setupArgumentsTestSuite({ gpuSettings: { precision: 'unsigned', - output: [4] + output: [4], }, argument: [ // NOTE: formatted like rectangle on purpose, so you can see how the texture should look - 1, 2, 3, 4, - 5 + 1, + 2, 3, 4, 5, ], expectedBitRatio: 4, - expectedPixels: new Uint8Array(new Float32Array([ - // NOTE: formatted like rectangle on purpose, so you can see how the texture should look - 1,2,3,4, - 5,0,0,0 - ]).buffer), - expectedDim: new Int32Array([5,1,1]), - expectedSize: new Int32Array([4,2]), // 4 * 2 = 8 + expectedPixels: new Uint8Array( + new Float32Array([ + // NOTE: formatted like rectangle on purpose, so you can see how the texture should look + 1, + 2, 3, 4, 5, 0, 0, 0, + ]).buffer + ), + expectedDim: new Int32Array([5, 1, 1]), + expectedSize: new Int32Array([4, 2]), // 4 * 2 = 8 expectedType: gl.UNSIGNED_BYTE, expectedArgumentTextureCount: 1, expectedPixelStorei: false, @@ -183,23 +204,23 @@ test('Float32Array with unsigned precision 5 length', () => { setupArgumentsTestSuite({ gpuSettings: { precision: 'unsigned', - output: [4] + output: [4], }, argument: new Float32Array([ // NOTE: formatted like rectangle on purpose, so you can see how the texture should look - 1, 2, 3, 4, - 5 + 1, + 2, 3, 4, 5, ]), expectedBitRatio: 4, expectedPixels: new Uint8Array( new Float32Array([ // NOTE: formatted like rectangle on purpose, so you can see how the texture should look - 1,2,3,4, - 5,0,0,0 + 1, + 2, 3, 4, 5, 0, 0, 0, ]).buffer ), - expectedDim: new Int32Array([5,1,1]), - expectedSize: new Int32Array([4,2]), // 4 * 2 * 1 = 8 + expectedDim: new Int32Array([5, 1, 1]), + expectedSize: new Int32Array([4, 2]), // 4 * 2 * 1 = 8 expectedType: gl.UNSIGNED_BYTE, expectedArgumentTextureCount: 1, expectedPixelStorei: false, @@ -209,23 +230,23 @@ test('Uint16Array with unsigned precision 5 length', () => { setupArgumentsTestSuite({ gpuSettings: { precision: 'unsigned', - output: [4] + output: [4], }, argument: new Uint16Array([ // NOTE: formatted like rectangle on purpose, so you can see how the texture should look - 1, 2, 3, 4, - 5 + 1, + 2, 3, 4, 5, ]), expectedBitRatio: 2, expectedPixels: new Uint8Array( new Uint16Array([ // NOTE: formatted like rectangle on purpose, so you can see how the texture should look - 1,2,3,4, - 5,0,0,0 + 1, + 2, 3, 4, 5, 0, 0, 0, ]).buffer ), - expectedDim: new Int32Array([5,1,1]), - expectedSize: new Int32Array([2,2]), // 2 * 2 * 2 = 8 + expectedDim: new Int32Array([5, 1, 1]), + expectedSize: new Int32Array([2, 2]), // 2 * 2 * 2 = 8 expectedType: gl.UNSIGNED_BYTE, expectedArgumentTextureCount: 1, expectedPixelStorei: false, @@ -235,20 +256,17 @@ test('Uint8Array with unsigned precision 5 length', () => { setupArgumentsTestSuite({ gpuSettings: { precision: 'unsigned', - output: [5] + output: [5], }, - argument: new Uint8Array([ - 1, 2, 3, 4, - 5 - ]), + argument: new Uint8Array([1, 2, 3, 4, 5]), expectedBitRatio: 1, expectedPixels: new Uint8Array([ // NOTE: formatted like rectangle on purpose, so you can see how the texture should look - 1,2,3,4, - 5,0,0,0 + 1, + 2, 3, 4, 5, 0, 0, 0, ]), - expectedDim: new Int32Array([5,1,1]), - expectedSize: new Int32Array([1,2]), // 1 * 2 * 4 = 8 + expectedDim: new Int32Array([5, 1, 1]), + expectedSize: new Int32Array([1, 2]), // 1 * 2 * 4 = 8 expectedType: gl.UNSIGNED_BYTE, expectedArgumentTextureCount: 1, expectedPixelStorei: false, @@ -259,21 +277,21 @@ test('Array with single precision', () => { setupArgumentsTestSuite({ gpuSettings: { precision: 'single', - output: [4] + output: [4], }, argument: [ // NOTE: formatted like rectangle on purpose, so you can see how the texture should look - 1,2,3,4, - 5 + 1, + 2, 3, 4, 5, ], expectedBitRatio: 4, expectedPixels: new Float32Array([ // NOTE: formatted like rectangle on purpose, so you can see how the texture should look - 1,2,3,4, - 5,0,0,0 + 1, + 2, 3, 4, 5, 0, 0, 0, ]), - expectedDim: new Int32Array([5,1,1]), - expectedSize: new Int32Array([1,2]), + expectedDim: new Int32Array([5, 1, 1]), + expectedSize: new Int32Array([1, 2]), expectedType: gl.FLOAT, expectedTextureWidth: 1, expectedTextureHeight: 2, @@ -285,21 +303,21 @@ test('Float32Array with single precision', () => { setupArgumentsTestSuite({ gpuSettings: { precision: 'single', - output: [4] + output: [4], }, argument: new Float32Array([ // NOTE: formatted like rectangle on purpose, so you can see how the texture should look - 1,2,3,4, - 5 + 1, + 2, 3, 4, 5, ]), expectedBitRatio: 4, expectedPixels: new Float32Array([ // NOTE: formatted like rectangle on purpose, so you can see how the texture should look - 1,2,3,4, - 5,0,0,0 + 1, + 2, 3, 4, 5, 0, 0, 0, ]), - expectedDim: new Int32Array([5,1,1]), - expectedSize: new Int32Array([1,2]), + expectedDim: new Int32Array([5, 1, 1]), + expectedSize: new Int32Array([1, 2]), expectedType: gl.FLOAT, expectedTextureWidth: 1, expectedTextureHeight: 2, @@ -311,22 +329,22 @@ test('Uint16Array with single precision', () => { setupArgumentsTestSuite({ gpuSettings: { precision: 'single', - output: [4] + output: [4], }, argument: new Uint16Array([ // NOTE: formatted like rectangle on purpose, so you can see how the texture should look - 1,2,3,4, - 5 + 1, + 2, 3, 4, 5, ]), // upconverted from 2 expectedBitRatio: 4, expectedPixels: new Float32Array([ // NOTE: formatted like rectangle on purpose, so you can see how the texture should look - 1,2,3,4, - 5,0,0,0 + 1, + 2, 3, 4, 5, 0, 0, 0, ]), - expectedDim: new Int32Array([5,1,1]), - expectedSize: new Int32Array([1,2]), + expectedDim: new Int32Array([5, 1, 1]), + expectedSize: new Int32Array([1, 2]), expectedType: gl.FLOAT, expectedArgumentTextureCount: 1, expectedPixelStorei: false, @@ -336,22 +354,22 @@ test('Uint8Array with single precision', () => { setupArgumentsTestSuite({ gpuSettings: { precision: 'single', - output: [4] + output: [4], }, argument: new Uint8Array([ // NOTE: formatted like rectangle on purpose, so you can see how the texture should look - 1,2,3,4, - 5 + 1, + 2, 3, 4, 5, ]), // upconverted from 1 expectedBitRatio: 4, expectedPixels: new Float32Array([ // NOTE: formatted like rectangle on purpose, so you can see how the texture should look - 1,2,3,4, - 5,0,0,0 + 1, + 2, 3, 4, 5, 0, 0, 0, ]), - expectedDim: new Int32Array([5,1,1]), - expectedSize: new Int32Array([1,2]), + expectedDim: new Int32Array([5, 1, 1]), + expectedSize: new Int32Array([1, 2]), expectedType: gl.FLOAT, expectedArgumentTextureCount: 1, expectedPixelStorei: false, @@ -362,18 +380,15 @@ test('Array with unsigned precision length 33', () => { setupArgumentsTestSuite({ gpuSettings: { precision: 'unsigned', - output: [5] + output: [5], }, argument: [ // NOTE: formatted like rectangle on purpose, so you can see how the texture should look // NOTE: Packing is 1 per RGBA, so only 1 of the 4 channels is used // NOTE: 6x6 - 1, 2, 3, 4, 5, 6, - 7, 8, 9, 10, 11, 12, - 13, 14, 15, 16, 17, 18, - 19, 20, 21, 22, 23, 24, - 25, 26, 27, 28, 29, 30, - 31, 32, 33 + 1, + 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, + 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, ], expectedBitRatio: 4, expectedPixels: new Uint8Array( @@ -381,16 +396,13 @@ test('Array with unsigned precision length 33', () => { // NOTE: formatted like rectangle on purpose, so you can see how the texture should look // NOTE: Packing is 1 per RGBA, so only 1 of the 4 channels is used // NOTE: 6x6 - 1, 2, 3, 4, 5, 6, - 7, 8, 9, 10, 11, 12, - 13, 14, 15, 16, 17, 18, - 19, 20, 21, 22, 23, 24, - 25, 26, 27, 28, 29, 30, - 31, 32, 33, 0, 0, 0 + 1, + 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, + 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 0, 0, 0, ]).buffer ), - expectedDim: new Int32Array([33,1,1]), - expectedSize: new Int32Array([6,6]), // 3 * 3 = 9 * 4 = 34 + expectedDim: new Int32Array([33, 1, 1]), + expectedSize: new Int32Array([6, 6]), // 3 * 3 = 9 * 4 = 34 expectedType: gl.UNSIGNED_BYTE, expectedArgumentTextureCount: 1, expectedPixelStorei: false, @@ -401,18 +413,15 @@ test('Float32Array with unsigned precision length 33', () => { setupArgumentsTestSuite({ gpuSettings: { precision: 'unsigned', - output: [5] + output: [5], }, argument: new Float32Array([ // NOTE: formatted like rectangle on purpose, so you can see how the texture should look // NOTE: Packing is 1 per RGBA, so only 1 of the 4 channels is used // NOTE: 6x6 - 1, 2, 3, 4, 5, 6, - 7, 8, 9, 10, 11, 12, - 13, 14, 15, 16, 17, 18, - 19, 20, 21, 22, 23, 24, - 25, 26, 27, 28, 29, 30, - 31, 32, 33 + 1, + 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, + 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, ]), expectedBitRatio: 4, expectedPixels: new Uint8Array( @@ -420,16 +429,13 @@ test('Float32Array with unsigned precision length 33', () => { // NOTE: formatted like rectangle on purpose, so you can see how the texture should look // NOTE: Packing is 1 per RGBA, so only 1 of the 4 channels is used // NOTE: 6x6 - 1, 2, 3, 4, 5, 6, - 7, 8, 9, 10, 11, 12, - 13, 14, 15, 16, 17, 18, - 19, 20, 21, 22, 23, 24, - 25, 26, 27, 28, 29, 30, - 31, 32, 33, 0, 0, 0, + 1, + 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, + 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 0, 0, 0, ]).buffer ), - expectedDim: new Int32Array([33,1,1]), - expectedSize: new Int32Array([6,6]), // 3 * 3 = 9 * 4 = 34 + expectedDim: new Int32Array([33, 1, 1]), + expectedSize: new Int32Array([6, 6]), // 3 * 3 = 9 * 4 = 34 expectedType: gl.UNSIGNED_BYTE, expectedArgumentTextureCount: 1, expectedPixelStorei: false, @@ -440,17 +446,15 @@ test('Uint16Array with unsigned precision length 33', () => { setupArgumentsTestSuite({ gpuSettings: { precision: 'unsigned', - output: [5] + output: [5], }, argument: new Uint16Array([ // NOTE: formatted like rectangle on purpose, so you can see how the texture should look // NOTE: Packing is 2 per RGBA, so only 2 of the 4 channels is used // NOTE: 4x5 - 1,2, 3,4, 5,6, 7,8, - 9,10, 11,12, 13,14, 15,16, - 17,18, 19,20, 21,22, 23,24, - 25,26, 27,28, 29,30, 31,32, - 33, + 1, + 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, + 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, ]), expectedBitRatio: 2, expectedPixels: new Uint8Array( @@ -458,15 +462,13 @@ test('Uint16Array with unsigned precision length 33', () => { // NOTE: formatted like rectangle on purpose, so you can see how the texture should look // NOTE: Packing is 2 per RGBA, so only 2 of the 4 channels is used // NOTE: 4x5 - 1,2, 3,4, 5,6, 7,8, - 9,10, 11,12, 13,14, 15,16, - 17,18, 19,20, 21,22, 23,24, - 25,26, 27,28, 29,30, 31,32, - 33,0, 0,0, 0,0, 0,0 + 1, + 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, + 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 0, 0, 0, 0, 0, 0, 0, ]).buffer ), - expectedDim: new Int32Array([33,1,1]), - expectedSize: new Int32Array([4,5]), // 3 * 3 = 9 * 4 = 34 + expectedDim: new Int32Array([33, 1, 1]), + expectedSize: new Int32Array([4, 5]), // 3 * 3 = 9 * 4 = 34 expectedType: gl.UNSIGNED_BYTE, expectedArgumentTextureCount: 1, expectedPixelStorei: false, @@ -477,28 +479,29 @@ test('Uint8Array with unsigned precision length 33', () => { setupArgumentsTestSuite({ gpuSettings: { precision: 'unsigned', - output: [5] + output: [5], }, argument: new Uint8Array([ // NOTE: formatted like rectangle on purpose, so you can see how the texture should look // NOTE: Packing is 4 per RGBA, so only 2 of the 4 channels is used // NOTE: 3x3 - 1,2,3,4, 5,6,7,8, 9,10,11,12, - 13,14,15,16, 17,18,19,20, 21,22,23,24, - 25,26, 27,28, 29,30,31,32, 33 + 1, + 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, + 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, ]), expectedBitRatio: 1, expectedPixels: new Uint8Array( new Uint8Array([ - // NOTE: formatted like rectangle on purpose, so you can see how the texture should look - // NOTE: Packing is 4 per RGBA, so only 2 of the 4 channels is used - // NOTE: 3x3 - 1,2,3,4, 5,6,7,8, 9,10,11,12, - 13,14,15,16, 17,18,19,20, 21,22,23,24, - 25,26, 27,28, 29,30,31,32, 33,0,0,0 - ]).buffer), - expectedDim: new Int32Array([33,1,1]), - expectedSize: new Int32Array([3,3]), // 3 * 3 = 9 * 4 = 34 + // NOTE: formatted like rectangle on purpose, so you can see how the texture should look + // NOTE: Packing is 4 per RGBA, so only 2 of the 4 channels is used + // NOTE: 3x3 + 1, + 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, + 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 0, 0, 0, + ]).buffer + ), + expectedDim: new Int32Array([33, 1, 1]), + expectedSize: new Int32Array([3, 3]), // 3 * 3 = 9 * 4 = 34 expectedType: gl.UNSIGNED_BYTE, expectedArgumentTextureCount: 1, expectedPixelStorei: false, @@ -509,27 +512,27 @@ test('Array with single precision length 33', () => { setupArgumentsTestSuite({ gpuSettings: { precision: 'single', - output: [5] + output: [5], }, argument: [ // NOTE: formatted like rectangle on purpose, so you can see how the texture should look // NOTE: Packing is 4 per RGBA, so 4 of the 4 channels is used // NOTE: 3x3 - 1,2,3,4, 5,6,7,8, 9,10,11,12, - 13,14,15,16, 17,18,19,20, 21,22,23,24, - 25,26,27,28, 29,30,31,32, 33 + 1, + 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, + 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, ], expectedBitRatio: 4, expectedPixels: new Float32Array([ // NOTE: formatted like rectangle on purpose, so you can see how the texture should look // NOTE: Packing is 4 per RGBA, so 4 of the 4 channels is used // NOTE: 3x3 - 1,2,3,4, 5,6,7,8, 9,10,11,12, - 13,14,15,16, 17,18,19,20, 21,22,23,24, - 25,26,27,28, 29,30,31,32, 33,0,0,0 + 1, + 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, + 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 0, 0, 0, ]), - expectedDim: new Int32Array([33,1,1]), - expectedSize: new Int32Array([3,3]), // 3 * 3 = 9 * 4 = 34 + expectedDim: new Int32Array([33, 1, 1]), + expectedSize: new Int32Array([3, 3]), // 3 * 3 = 9 * 4 = 34 expectedType: gl.FLOAT, expectedArgumentTextureCount: 1, expectedPixelStorei: false, @@ -540,27 +543,27 @@ test('Float32Array with single precision length 33', () => { setupArgumentsTestSuite({ gpuSettings: { precision: 'single', - output: [5] + output: [5], }, argument: new Float32Array([ // NOTE: formatted like rectangle on purpose, so you can see how the texture should look // NOTE: Packing is 4 per RGBA, so 4 of the 4 channels is used // NOTE: 3x3 - 1,2,3,4, 5,6,7,8, 9,10,11,12, - 13,14,15,16, 17,18,19,20, 21,22,23,24, - 25,26,27,28, 29,30,31,32, 33 + 1, + 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, + 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, ]), expectedBitRatio: 4, expectedPixels: new Float32Array([ // NOTE: formatted like rectangle on purpose, so you can see how the texture should look // NOTE: Packing is 4 per RGBA, so 4 of the 4 channels is used // NOTE: 3x3 - 1,2,3,4, 5,6,7,8, 9,10,11,12, - 13,14,15,16, 17,18,19,20, 21,22,23,24, - 25,26,27,28, 29,30,31,32, 33,0,0,0 + 1, + 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, + 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 0, 0, 0, ]), - expectedDim: new Int32Array([33,1,1]), - expectedSize: new Int32Array([3,3]), // 3 * 3 = 9 * 4 = 36 + expectedDim: new Int32Array([33, 1, 1]), + expectedSize: new Int32Array([3, 3]), // 3 * 3 = 9 * 4 = 36 expectedType: gl.FLOAT, expectedArgumentTextureCount: 1, expectedPixelStorei: false, @@ -571,15 +574,15 @@ test('Uint16Array with single precision length 33', () => { setupArgumentsTestSuite({ gpuSettings: { precision: 'single', - output: [5] + output: [5], }, argument: new Uint16Array([ // NOTE: formatted like rectangle on purpose, so you can see how the texture should look // NOTE: Packing is 4 per RGBA, so 4 of the 4 channels is used // NOTE: 3x3 - 1,2,3,4, 5,6,7,8, 9,10,11,12, - 13,14,15,16, 17,18,19,20, 21,22,23,24, - 25,26,27,28, 29,30,31,32, 33 + 1, + 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, + 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, ]), // upconverted from 2 expectedBitRatio: 4, @@ -587,12 +590,12 @@ test('Uint16Array with single precision length 33', () => { // NOTE: formatted like rectangle on purpose, so you can see how the texture should look // NOTE: Packing is 4 per RGBA, so 4 of the 4 channels is used // NOTE: 3x3 - 1,2,3,4, 5,6,7,8, 9,10,11,12, - 13,14,15,16, 17,18,19,20, 21,22,23,24, - 25,26,27,28, 29,30,31,32, 33,0,0,0 + 1, + 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, + 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 0, 0, 0, ]), - expectedDim: new Int32Array([33,1,1]), - expectedSize: new Int32Array([3,3]), // 3 * 3 = 9 * 4 = 36 + expectedDim: new Int32Array([33, 1, 1]), + expectedSize: new Int32Array([3, 3]), // 3 * 3 = 9 * 4 = 36 expectedType: gl.FLOAT, expectedArgumentTextureCount: 1, expectedPixelStorei: false, @@ -603,15 +606,15 @@ test('Uint8Array with single precision length 33', () => { setupArgumentsTestSuite({ gpuSettings: { precision: 'single', - output: [5] + output: [5], }, argument: new Uint8Array([ // NOTE: formatted like rectangle on purpose, so you can see how the texture should look // NOTE: Packing is 4 per RGBA, so 4 of the 4 channels is used // NOTE: 3x3 - 1,2,3,4, 5,6,7,8, 9,10,11,12, - 13,14,15,16, 17,18,19,20, 21,22,23,24, - 25,26,27,28, 29,30,31,32, 33 + 1, + 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, + 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, ]), // upconverted from 1 expectedBitRatio: 4, @@ -619,12 +622,12 @@ test('Uint8Array with single precision length 33', () => { // NOTE: formatted like rectangle on purpose, so you can see how the texture should look // NOTE: Packing is 4 per RGBA, so 4 of the 4 channels is used // NOTE: 3x3 - 1,2,3,4, 5,6,7,8, 9,10,11,12, - 13,14,15,16, 17,18,19,20, 21,22,23,24, - 25,26,27,28, 29,30,31,32, 33,0,0,0 + 1, + 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, + 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 0, 0, 0, ]), - expectedDim: new Int32Array([33,1,1]), - expectedSize: new Int32Array([3,3]), // 3 * 3 = 9 * 4 = 36 + expectedDim: new Int32Array([33, 1, 1]), + expectedSize: new Int32Array([3, 3]), // 3 * 3 = 9 * 4 = 36 expectedType: gl.FLOAT, expectedArgumentTextureCount: 1, expectedPixelStorei: false, @@ -637,21 +640,26 @@ test('Input(Array) with unsigned precision 5 length', () => { setupArgumentsTestSuite({ gpuSettings: { precision: 'unsigned', - output: [4] + output: [4], }, - argument: input([ - // NOTE: formatted like rectangle on purpose, so you can see how the texture should look - 1, 2, 3, 4, - 5, 0 - ], [2,3]), + argument: input( + [ + // NOTE: formatted like rectangle on purpose, so you can see how the texture should look + 1, + 2, 3, 4, 5, 0, + ], + [2, 3] + ), expectedBitRatio: 4, - expectedPixels: new Uint8Array(new Float32Array([ - // NOTE: formatted like rectangle on purpose, so you can see how the texture should look - 1,2,3,4, - 5,0,0,0 - ]).buffer), - expectedDim: new Int32Array([2,3,1]), - expectedSize: new Int32Array([4,2]), // 4 * 2 = 8 + expectedPixels: new Uint8Array( + new Float32Array([ + // NOTE: formatted like rectangle on purpose, so you can see how the texture should look + 1, + 2, 3, 4, 5, 0, 0, 0, + ]).buffer + ), + expectedDim: new Int32Array([2, 3, 1]), + expectedSize: new Int32Array([4, 2]), // 4 * 2 = 8 expectedType: gl.UNSIGNED_BYTE, expectedArgumentTextureCount: 1, expectedPixelStorei: false, @@ -661,23 +669,26 @@ test('Input(Float32Array) with unsigned precision 5 length', () => { setupArgumentsTestSuite({ gpuSettings: { precision: 'unsigned', - output: [4] + output: [4], }, - argument: input(new Float32Array([ - // NOTE: formatted like rectangle on purpose, so you can see how the texture should look - 1, 2, 3, 4, - 5 - ]), [5]), + argument: input( + new Float32Array([ + // NOTE: formatted like rectangle on purpose, so you can see how the texture should look + 1, + 2, 3, 4, 5, + ]), + [5] + ), expectedBitRatio: 4, expectedPixels: new Uint8Array( new Float32Array([ // NOTE: formatted like rectangle on purpose, so you can see how the texture should look - 1,2,3,4, - 5,0,0,0 + 1, + 2, 3, 4, 5, 0, 0, 0, ]).buffer ), - expectedDim: new Int32Array([5,1,1]), - expectedSize: new Int32Array([4,2]), // 4 * 2 * 1 = 8 + expectedDim: new Int32Array([5, 1, 1]), + expectedSize: new Int32Array([4, 2]), // 4 * 2 * 1 = 8 expectedType: gl.UNSIGNED_BYTE, expectedArgumentTextureCount: 1, expectedPixelStorei: false, @@ -687,23 +698,26 @@ test('Input(Uint16Array) with unsigned precision 5 length', () => { setupArgumentsTestSuite({ gpuSettings: { precision: 'unsigned', - output: [4] + output: [4], }, - argument: input(new Uint16Array([ - // NOTE: formatted like rectangle on purpose, so you can see how the texture should look - 1, 2, 3, 4, - 5, 0, - ]), [2,3]), + argument: input( + new Uint16Array([ + // NOTE: formatted like rectangle on purpose, so you can see how the texture should look + 1, + 2, 3, 4, 5, 0, + ]), + [2, 3] + ), expectedBitRatio: 2, expectedPixels: new Uint8Array( new Uint16Array([ // NOTE: formatted like rectangle on purpose, so you can see how the texture should look - 1,2,3,4, - 5,0,0,0 + 1, + 2, 3, 4, 5, 0, 0, 0, ]).buffer ), - expectedDim: new Int32Array([2,3,1]), - expectedSize: new Int32Array([2,2]), // 2 * 2 * 2 = 8 + expectedDim: new Int32Array([2, 3, 1]), + expectedSize: new Int32Array([2, 2]), // 2 * 2 * 2 = 8 expectedType: gl.UNSIGNED_BYTE, expectedArgumentTextureCount: 1, expectedPixelStorei: false, @@ -713,20 +727,17 @@ test('Input(Uint8Array) with unsigned precision 5 length', () => { setupArgumentsTestSuite({ gpuSettings: { precision: 'unsigned', - output: [5] + output: [5], }, - argument: input(new Uint8Array([ - 1, 2, 3, 4, - 5,0 - ]),[2, 3]), + argument: input(new Uint8Array([1, 2, 3, 4, 5, 0]), [2, 3]), expectedBitRatio: 1, expectedPixels: new Uint8Array([ // NOTE: formatted like rectangle on purpose, so you can see how the texture should look - 1,2,3,4, - 5,0,0,0 + 1, + 2, 3, 4, 5, 0, 0, 0, ]), - expectedDim: new Int32Array([2,3,1]), - expectedSize: new Int32Array([1,2]), // 1 * 2 * 4 = 8 + expectedDim: new Int32Array([2, 3, 1]), + expectedSize: new Int32Array([1, 2]), // 1 * 2 * 4 = 8 expectedType: gl.UNSIGNED_BYTE, expectedArgumentTextureCount: 1, expectedPixelStorei: false, @@ -737,21 +748,24 @@ test('Input(Array) with single precision', () => { setupArgumentsTestSuite({ gpuSettings: { precision: 'single', - output: [4] + output: [4], }, - argument: input([ - // NOTE: formatted like rectangle on purpose, so you can see how the texture should look - 1,2,3,4, - 5,0 - ], [2,3]), + argument: input( + [ + // NOTE: formatted like rectangle on purpose, so you can see how the texture should look + 1, + 2, 3, 4, 5, 0, + ], + [2, 3] + ), expectedBitRatio: 4, expectedPixels: new Float32Array([ // NOTE: formatted like rectangle on purpose, so you can see how the texture should look - 1,2,3,4, - 5,0,0,0 + 1, + 2, 3, 4, 5, 0, 0, 0, ]), - expectedDim: new Int32Array([2,3,1]), - expectedSize: new Int32Array([1,2]), + expectedDim: new Int32Array([2, 3, 1]), + expectedSize: new Int32Array([1, 2]), expectedType: gl.FLOAT, expectedTextureWidth: 1, expectedTextureHeight: 2, @@ -763,21 +777,24 @@ test('Input(Float32Array) with single precision', () => { setupArgumentsTestSuite({ gpuSettings: { precision: 'single', - output: [4] + output: [4], }, - argument: input(new Float32Array([ - // NOTE: formatted like rectangle on purpose, so you can see how the texture should look - 1,2,3,4, - 5,0 - ]),[2,3]), + argument: input( + new Float32Array([ + // NOTE: formatted like rectangle on purpose, so you can see how the texture should look + 1, + 2, 3, 4, 5, 0, + ]), + [2, 3] + ), expectedBitRatio: 4, expectedPixels: new Float32Array([ // NOTE: formatted like rectangle on purpose, so you can see how the texture should look - 1,2,3,4, - 5,0,0,0 + 1, + 2, 3, 4, 5, 0, 0, 0, ]), - expectedDim: new Int32Array([2,3,1]), - expectedSize: new Int32Array([1,2]), + expectedDim: new Int32Array([2, 3, 1]), + expectedSize: new Int32Array([1, 2]), expectedType: gl.FLOAT, expectedTextureWidth: 1, expectedTextureHeight: 2, @@ -789,22 +806,25 @@ test('Input(Uint16Array) with single precision', () => { setupArgumentsTestSuite({ gpuSettings: { precision: 'single', - output: [4] + output: [4], }, - argument: input(new Uint16Array([ - // NOTE: formatted like rectangle on purpose, so you can see how the texture should look - 1,2,3,4, - 5,0 - ]), [2,3]), + argument: input( + new Uint16Array([ + // NOTE: formatted like rectangle on purpose, so you can see how the texture should look + 1, + 2, 3, 4, 5, 0, + ]), + [2, 3] + ), // upconverted from 2 expectedBitRatio: 4, expectedPixels: new Float32Array([ // NOTE: formatted like rectangle on purpose, so you can see how the texture should look - 1,2,3,4, - 5,0,0,0 + 1, + 2, 3, 4, 5, 0, 0, 0, ]), - expectedDim: new Int32Array([2,3,1]), - expectedSize: new Int32Array([1,2]), + expectedDim: new Int32Array([2, 3, 1]), + expectedSize: new Int32Array([1, 2]), expectedType: gl.FLOAT, expectedArgumentTextureCount: 1, expectedPixelStorei: false, @@ -814,22 +834,25 @@ test('Input(Uint8Array) with single precision', () => { setupArgumentsTestSuite({ gpuSettings: { precision: 'single', - output: [4] + output: [4], }, - argument: input(new Uint8Array([ - // NOTE: formatted like rectangle on purpose, so you can see how the texture should look - 1,2,3,4, - 5,0 - ]), [2,3]), + argument: input( + new Uint8Array([ + // NOTE: formatted like rectangle on purpose, so you can see how the texture should look + 1, + 2, 3, 4, 5, 0, + ]), + [2, 3] + ), // upconverted from 1 expectedBitRatio: 4, expectedPixels: new Float32Array([ // NOTE: formatted like rectangle on purpose, so you can see how the texture should look - 1,2,3,4, - 5,0,0,0 + 1, + 2, 3, 4, 5, 0, 0, 0, ]), - expectedDim: new Int32Array([2,3,1]), - expectedSize: new Int32Array([1,2]), + expectedDim: new Int32Array([2, 3, 1]), + expectedSize: new Int32Array([1, 2]), expectedType: gl.FLOAT, expectedArgumentTextureCount: 1, expectedPixelStorei: false, @@ -840,35 +863,32 @@ test('Input(Array) with unsigned precision length 33', () => { setupArgumentsTestSuite({ gpuSettings: { precision: 'unsigned', - output: [5] + output: [5], }, - argument: input([ - // NOTE: formatted like rectangle on purpose, so you can see how the texture should look - // NOTE: Packing is 1 per RGBA, so only 1 of the 4 channels is used - // NOTE: 6x6 - 1, 2, 3, 4, 5, 6, - 7, 8, 9, 10, 11, 12, - 13, 14, 15, 16, 17, 18, - 19, 20, 21, 22, 23, 24, - 25, 26, 27, 28, 29, 30, - 31, 32, 33 - ], [33]), + argument: input( + [ + // NOTE: formatted like rectangle on purpose, so you can see how the texture should look + // NOTE: Packing is 1 per RGBA, so only 1 of the 4 channels is used + // NOTE: 6x6 + 1, + 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, + 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, + ], + [33] + ), expectedBitRatio: 4, expectedPixels: new Uint8Array( new Float32Array([ // NOTE: formatted like rectangle on purpose, so you can see how the texture should look // NOTE: Packing is 1 per RGBA, so only 1 of the 4 channels is used // NOTE: 6x6 - 1, 2, 3, 4, 5, 6, - 7, 8, 9, 10, 11, 12, - 13, 14, 15, 16, 17, 18, - 19, 20, 21, 22, 23, 24, - 25, 26, 27, 28, 29, 30, - 31, 32, 33, 0, 0, 0 + 1, + 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, + 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 0, 0, 0, ]).buffer ), - expectedDim: new Int32Array([33,1,1]), - expectedSize: new Int32Array([6,6]), // 3 * 3 = 9 * 4 = 34 + expectedDim: new Int32Array([33, 1, 1]), + expectedSize: new Int32Array([6, 6]), // 3 * 3 = 9 * 4 = 34 expectedType: gl.UNSIGNED_BYTE, expectedArgumentTextureCount: 1, expectedPixelStorei: false, @@ -879,35 +899,32 @@ test('Input(Float32Array) with unsigned precision length 33', () => { setupArgumentsTestSuite({ gpuSettings: { precision: 'unsigned', - output: [5] + output: [5], }, - argument: input(new Float32Array([ - // NOTE: formatted like rectangle on purpose, so you can see how the texture should look - // NOTE: Packing is 1 per RGBA, so only 1 of the 4 channels is used - // NOTE: 6x6 - 1, 2, 3, 4, 5, 6, - 7, 8, 9, 10, 11, 12, - 13, 14, 15, 16, 17, 18, - 19, 20, 21, 22, 23, 24, - 25, 26, 27, 28, 29, 30, - 31, 32, 33 - ]), [33]), + argument: input( + new Float32Array([ + // NOTE: formatted like rectangle on purpose, so you can see how the texture should look + // NOTE: Packing is 1 per RGBA, so only 1 of the 4 channels is used + // NOTE: 6x6 + 1, + 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, + 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, + ]), + [33] + ), expectedBitRatio: 4, expectedPixels: new Uint8Array( new Float32Array([ // NOTE: formatted like rectangle on purpose, so you can see how the texture should look // NOTE: Packing is 1 per RGBA, so only 1 of the 4 channels is used // NOTE: 6x6 - 1, 2, 3, 4, 5, 6, - 7, 8, 9, 10, 11, 12, - 13, 14, 15, 16, 17, 18, - 19, 20, 21, 22, 23, 24, - 25, 26, 27, 28, 29, 30, - 31, 32, 33, 0, 0, 0, + 1, + 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, + 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 0, 0, 0, ]).buffer ), - expectedDim: new Int32Array([33,1,1]), - expectedSize: new Int32Array([6,6]), // 3 * 3 = 9 * 4 = 34 + expectedDim: new Int32Array([33, 1, 1]), + expectedSize: new Int32Array([6, 6]), // 3 * 3 = 9 * 4 = 34 expectedType: gl.UNSIGNED_BYTE, expectedArgumentTextureCount: 1, expectedPixelStorei: false, @@ -918,33 +935,32 @@ test('Input(Uint16Array) with unsigned precision length 33', () => { setupArgumentsTestSuite({ gpuSettings: { precision: 'unsigned', - output: [5] + output: [5], }, - argument: input(new Uint16Array([ - // NOTE: formatted like rectangle on purpose, so you can see how the texture should look - // NOTE: Packing is 2 per RGBA, so only 2 of the 4 channels is used - // NOTE: 4x5 - 1,2, 3,4, 5,6, 7,8, - 9,10, 11,12, 13,14, 15,16, - 17,18, 19,20, 21,22, 23,24, - 25,26, 27,28, 29,30, 31,32, - 33, - ]), [33]), + argument: input( + new Uint16Array([ + // NOTE: formatted like rectangle on purpose, so you can see how the texture should look + // NOTE: Packing is 2 per RGBA, so only 2 of the 4 channels is used + // NOTE: 4x5 + 1, + 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, + 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, + ]), + [33] + ), expectedBitRatio: 2, expectedPixels: new Uint8Array( new Uint16Array([ // NOTE: formatted like rectangle on purpose, so you can see how the texture should look // NOTE: Packing is 2 per RGBA, so only 2 of the 4 channels is used // NOTE: 4x5 - 1,2, 3,4, 5,6, 7,8, - 9,10, 11,12, 13,14, 15,16, - 17,18, 19,20, 21,22, 23,24, - 25,26, 27,28, 29,30, 31,32, - 33,0, 0,0, 0,0, 0,0 + 1, + 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, + 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 0, 0, 0, 0, 0, 0, 0, ]).buffer ), - expectedDim: new Int32Array([33,1,1]), - expectedSize: new Int32Array([4,5]), // 3 * 3 = 9 * 4 = 34 + expectedDim: new Int32Array([33, 1, 1]), + expectedSize: new Int32Array([4, 5]), // 3 * 3 = 9 * 4 = 34 expectedType: gl.UNSIGNED_BYTE, expectedArgumentTextureCount: 1, expectedPixelStorei: false, @@ -955,28 +971,32 @@ test('Input(Uint8Array) with unsigned precision length 33', () => { setupArgumentsTestSuite({ gpuSettings: { precision: 'unsigned', - output: [5] + output: [5], }, - argument: input(new Uint8Array([ - // NOTE: formatted like rectangle on purpose, so you can see how the texture should look - // NOTE: Packing is 4 per RGBA, so only 2 of the 4 channels is used - // NOTE: 3x3 - 1,2,3,4, 5,6,7,8, 9,10,11,12, - 13,14,15,16, 17,18,19,20, 21,22,23,24, - 25,26, 27,28, 29,30,31,32, 33 - ]), [33]), + argument: input( + new Uint8Array([ + // NOTE: formatted like rectangle on purpose, so you can see how the texture should look + // NOTE: Packing is 4 per RGBA, so only 2 of the 4 channels is used + // NOTE: 3x3 + 1, + 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, + 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, + ]), + [33] + ), expectedBitRatio: 1, expectedPixels: new Uint8Array( new Uint8Array([ // NOTE: formatted like rectangle on purpose, so you can see how the texture should look // NOTE: Packing is 4 per RGBA, so only 2 of the 4 channels is used // NOTE: 3x3 - 1,2,3,4, 5,6,7,8, 9,10,11,12, - 13,14,15,16, 17,18,19,20, 21,22,23,24, - 25,26, 27,28, 29,30,31,32, 33,0,0,0 - ]).buffer), - expectedDim: new Int32Array([33,1,1]), - expectedSize: new Int32Array([3,3]), // 3 * 3 = 9 * 4 = 34 + 1, + 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, + 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 0, 0, 0, + ]).buffer + ), + expectedDim: new Int32Array([33, 1, 1]), + expectedSize: new Int32Array([3, 3]), // 3 * 3 = 9 * 4 = 34 expectedType: gl.UNSIGNED_BYTE, expectedArgumentTextureCount: 1, expectedPixelStorei: false, @@ -987,27 +1007,30 @@ test('Input(Array) with single precision length 33', () => { setupArgumentsTestSuite({ gpuSettings: { precision: 'single', - output: [5] + output: [5], }, - argument: input([ - // NOTE: formatted like rectangle on purpose, so you can see how the texture should look - // NOTE: Packing is 4 per RGBA, so 4 of the 4 channels is used - // NOTE: 3x3 - 1,2,3,4, 5,6,7,8, 9,10,11,12, - 13,14,15,16, 17,18,19,20, 21,22,23,24, - 25,26,27,28, 29,30,31,32, 33 - ], [33]), + argument: input( + [ + // NOTE: formatted like rectangle on purpose, so you can see how the texture should look + // NOTE: Packing is 4 per RGBA, so 4 of the 4 channels is used + // NOTE: 3x3 + 1, + 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, + 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, + ], + [33] + ), expectedBitRatio: 4, expectedPixels: new Float32Array([ // NOTE: formatted like rectangle on purpose, so you can see how the texture should look // NOTE: Packing is 4 per RGBA, so 4 of the 4 channels is used // NOTE: 3x3 - 1,2,3,4, 5,6,7,8, 9,10,11,12, - 13,14,15,16, 17,18,19,20, 21,22,23,24, - 25,26,27,28, 29,30,31,32, 33,0,0,0 + 1, + 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, + 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 0, 0, 0, ]), - expectedDim: new Int32Array([33,1,1]), - expectedSize: new Int32Array([3,3]), // 3 * 3 = 9 * 4 = 34 + expectedDim: new Int32Array([33, 1, 1]), + expectedSize: new Int32Array([3, 3]), // 3 * 3 = 9 * 4 = 34 expectedType: gl.FLOAT, expectedArgumentTextureCount: 1, expectedPixelStorei: false, @@ -1018,27 +1041,30 @@ test('Input(Float32Array) with single precision length 33', () => { setupArgumentsTestSuite({ gpuSettings: { precision: 'single', - output: [5] + output: [5], }, - argument: input(new Float32Array([ - // NOTE: formatted like rectangle on purpose, so you can see how the texture should look - // NOTE: Packing is 4 per RGBA, so 4 of the 4 channels is used - // NOTE: 3x3 - 1,2,3,4, 5,6,7,8, 9,10,11,12, - 13,14,15,16, 17,18,19,20, 21,22,23,24, - 25,26,27,28, 29,30,31,32, 33 - ]), [33]), + argument: input( + new Float32Array([ + // NOTE: formatted like rectangle on purpose, so you can see how the texture should look + // NOTE: Packing is 4 per RGBA, so 4 of the 4 channels is used + // NOTE: 3x3 + 1, + 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, + 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, + ]), + [33] + ), expectedBitRatio: 4, expectedPixels: new Float32Array([ // NOTE: formatted like rectangle on purpose, so you can see how the texture should look // NOTE: Packing is 4 per RGBA, so 4 of the 4 channels is used // NOTE: 3x3 - 1,2,3,4, 5,6,7,8, 9,10,11,12, - 13,14,15,16, 17,18,19,20, 21,22,23,24, - 25,26,27,28, 29,30,31,32, 33,0,0,0 + 1, + 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, + 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 0, 0, 0, ]), - expectedDim: new Int32Array([33,1,1]), - expectedSize: new Int32Array([3,3]), // 3 * 3 = 9 * 4 = 34 + expectedDim: new Int32Array([33, 1, 1]), + expectedSize: new Int32Array([3, 3]), // 3 * 3 = 9 * 4 = 34 expectedType: gl.FLOAT, expectedArgumentTextureCount: 1, expectedPixelStorei: false, @@ -1049,28 +1075,31 @@ test('Input(Uint16Array) with single precision length 33', () => { setupArgumentsTestSuite({ gpuSettings: { precision: 'single', - output: [5] + output: [5], }, - argument: input(new Uint16Array([ - // NOTE: formatted like rectangle on purpose, so you can see how the texture should look - // NOTE: Packing is 4 per RGBA, so 4 of the 4 channels is used - // NOTE: 3x3 - 1,2,3,4, 5,6,7,8, 9,10,11,12, - 13,14,15,16, 17,18,19,20, 21,22,23,24, - 25,26,27,28, 29,30,31,32, 33 - ]), [33]), + argument: input( + new Uint16Array([ + // NOTE: formatted like rectangle on purpose, so you can see how the texture should look + // NOTE: Packing is 4 per RGBA, so 4 of the 4 channels is used + // NOTE: 3x3 + 1, + 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, + 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, + ]), + [33] + ), // upconverted from 2 expectedBitRatio: 4, expectedPixels: new Float32Array([ // NOTE: formatted like rectangle on purpose, so you can see how the texture should look // NOTE: Packing is 4 per RGBA, so 4 of the 4 channels is used // NOTE: 3x3 - 1,2,3,4, 5,6,7,8, 9,10,11,12, - 13,14,15,16, 17,18,19,20, 21,22,23,24, - 25,26,27,28, 29,30,31,32, 33,0,0,0 + 1, + 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, + 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 0, 0, 0, ]), - expectedDim: new Int32Array([33,1,1]), - expectedSize: new Int32Array([3,3]), // 3 * 3 = 9 * 4 = 36 + expectedDim: new Int32Array([33, 1, 1]), + expectedSize: new Int32Array([3, 3]), // 3 * 3 = 9 * 4 = 36 expectedType: gl.FLOAT, expectedArgumentTextureCount: 1, expectedPixelStorei: false, @@ -1081,28 +1110,31 @@ test('Input(Uint8Array) with single precision length 33', () => { setupArgumentsTestSuite({ gpuSettings: { precision: 'single', - output: [5] + output: [5], }, - argument: input(new Uint8Array([ - // NOTE: formatted like rectangle on purpose, so you can see how the texture should look - // NOTE: Packing is 4 per RGBA (8 bit, but upconverted to float32), so only 4 of the 4 channels is used - // NOTE: 3x3 - 1,2,3,4, 5,6,7,8, 9,10,11,12, - 13,14,15,16, 17,18,19,20, 21,22,23,24, - 25,26,27,28, 29,30,31,32, 33 - ]), [33]), + argument: input( + new Uint8Array([ + // NOTE: formatted like rectangle on purpose, so you can see how the texture should look + // NOTE: Packing is 4 per RGBA (8 bit, but upconverted to float32), so only 4 of the 4 channels is used + // NOTE: 3x3 + 1, + 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, + 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, + ]), + [33] + ), // upconverted to float32 expectedBitRatio: 4, expectedPixels: new Float32Array([ // NOTE: formatted like rectangle on purpose, so you can see how the texture should look // NOTE: Packing is 4 per RGBA (8 bit, but upconverted to float32), so only 4 of the 4 channels is used // NOTE: 3x3 - 1,2,3,4, 5,6,7,8, 9,10,11,12, - 13,14,15,16, 17,18,19,20, 21,22,23,24, - 25,26,27,28, 29,30,31,32, 33,0,0,0 + 1, + 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, + 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 0, 0, 0, ]), - expectedDim: new Int32Array([33,1,1]), - expectedSize: new Int32Array([3,3]), // 3 * 3 = 9 * 4 = 36 + expectedDim: new Int32Array([33, 1, 1]), + expectedSize: new Int32Array([3, 3]), // 3 * 3 = 9 * 4 = 36 expectedType: gl.FLOAT, expectedArgumentTextureCount: 1, expectedPixelStorei: false, diff --git a/test/internal/backend/web-gl2/kernel/setupConstants.js b/test/internal/backend/web-gl2/kernel/setupConstants.js index 9149ed0e..3a889b73 100644 --- a/test/internal/backend/web-gl2/kernel/setupConstants.js +++ b/test/internal/backend/web-gl2/kernel/setupConstants.js @@ -1,5 +1,5 @@ const { assert, skip, test, module: describe, only } = require('qunit'); -const { WebGL2Kernel, input } = require('../../../../../src'); +const { WebGL2Kernel, input } = require('../../../../..'); describe('internal WebGL2Kernel.setupConstants Array'); const gl = { @@ -37,102 +37,121 @@ function setupConstantsTestSuite(testSuiteSettings) { let uniform3ivCalled = false; let uniform2ivCalled = false; let uniform1iCalled = false; - const mockContext = Object.assign({ - activeTexture: (index) => { - assert.equal(index, 0); - activeTextureCalled = true; - }, - bindTexture: (target, texture) => { - assert.equal(target, 'TEXTURE_2D'); - assert.equal(texture, 'TEXTURE'); - bindTextureCalled = true; - }, - texParameteri: (target, pname, param) => { - switch (texParameteriCalls) { - case 0: - assert.equal(target, 'TEXTURE_2D'); - assert.equal(pname, 'TEXTURE_WRAP_S'); - assert.equal(param, 'CLAMP_TO_EDGE'); - texParameteriCalls++; - break; - case 1: - assert.equal(target, 'TEXTURE_2D'); - assert.equal(pname, 'TEXTURE_WRAP_T'); - assert.equal(param, 'CLAMP_TO_EDGE'); - texParameteriCalls++; - break; - case 2: - assert.equal(target, 'TEXTURE_2D'); - assert.equal(pname, 'TEXTURE_MIN_FILTER'); - assert.equal(param, 'NEAREST'); - texParameteriCalls++; - break; - case 3: - assert.equal(target, 'TEXTURE_2D'); - assert.equal(pname, 'TEXTURE_MAG_FILTER'); - assert.equal(param, 'NEAREST'); - texParameteriCalls++; - break; - default: + const mockContext = Object.assign( + { + activeTexture: index => { + assert.equal(index, 0); + activeTextureCalled = true; + }, + bindTexture: (target, texture) => { + assert.equal(target, 'TEXTURE_2D'); + assert.equal(texture, 'TEXTURE'); + bindTextureCalled = true; + }, + texParameteri: (target, pname, param) => { + switch (texParameteriCalls) { + case 0: + assert.equal(target, 'TEXTURE_2D'); + assert.equal(pname, 'TEXTURE_WRAP_S'); + assert.equal(param, 'CLAMP_TO_EDGE'); + texParameteriCalls++; + break; + case 1: + assert.equal(target, 'TEXTURE_2D'); + assert.equal(pname, 'TEXTURE_WRAP_T'); + assert.equal(param, 'CLAMP_TO_EDGE'); + texParameteriCalls++; + break; + case 2: + assert.equal(target, 'TEXTURE_2D'); + assert.equal(pname, 'TEXTURE_MIN_FILTER'); + assert.equal(param, 'NEAREST'); + texParameteriCalls++; + break; + case 3: + assert.equal(target, 'TEXTURE_2D'); + assert.equal(pname, 'TEXTURE_MAG_FILTER'); + assert.equal(param, 'NEAREST'); + texParameteriCalls++; + break; + default: + throw new Error('called too many times'); + } + }, + pixelStorei: (pname, param) => { + assert.equal(pname, 'UNPACK_FLIP_Y_WEBGL'); + assert.equal(param, expectedPixelStorei); + }, + createTexture: () => 'TEXTURE', + getUniformLocation: (program, name) => { + assert.equal(program, 'program'); + if (getUniformLocationCalls > 3) { throw new Error('called too many times'); - } - }, - pixelStorei: (pname, param) => { - assert.equal(pname, 'UNPACK_FLIP_Y_WEBGL'); - assert.equal(param, expectedPixelStorei); - }, - createTexture: () => 'TEXTURE', - getUniformLocation: (program, name) => { - assert.equal(program, 'program'); - if (getUniformLocationCalls > 3) { - throw new Error('called too many times'); - } - getUniformLocationCalls++; - return { - constants_vDim: 'constants_vDimLocation', - constants_vSize: 'constants_vSizeLocation', - constants_v: 'constants_vLocation', - }[name]; + } + getUniformLocationCalls++; + return { + constants_vDim: 'constants_vDimLocation', + constants_vSize: 'constants_vSizeLocation', + constants_v: 'constants_vLocation', + }[name]; + }, + uniform3iv: (location, value) => { + assert.equal(location, 'constants_vDimLocation'); + assert.deepEqual(value, expectedDim); + uniform3ivCalled = true; + }, + uniform2iv: (location, value) => { + assert.equal(location, 'constants_vSizeLocation'); + assert.deepEqual(value, expectedSize); + uniform2ivCalled = true; + }, + uniform1i: (location, value) => { + assert.equal(location, 'constants_vLocation'); + assert.equal(value, 0); + uniform1iCalled = true; + }, + texImage2D: ( + target, + level, + internalFormat, + width, + height, + border, + format, + type, + pixels + ) => { + assert.equal(target, gl.TEXTURE_2D); + assert.equal(level, 0); + assert.equal( + internalFormat, + gpuSettings.precision === 'single' ? gl.RGBA32F : gl.RGBA + ); + assert.equal(width, expectedSize[0]); + assert.equal(height, expectedSize[1]); + assert.equal(border, 0); + assert.equal(format, gl.RGBA); + assert.equal(type, expectedType); + assert.equal(pixels.length, expectedPixels.length); + assert.deepEqual(pixels, expectedPixels); + texImage2DCalled = true; + }, }, - uniform3iv: (location, value) => { - assert.equal(location, 'constants_vDimLocation'); - assert.deepEqual(value, expectedDim); - uniform3ivCalled = true; - }, - uniform2iv: (location, value) => { - assert.equal(location, 'constants_vSizeLocation'); - assert.deepEqual(value, expectedSize); - uniform2ivCalled = true; - }, - uniform1i: (location, value) => { - assert.equal(location, 'constants_vLocation'); - assert.equal(value, 0); - uniform1iCalled = true; - }, - texImage2D: (target, level, internalFormat, width, height, border, format, type, pixels) => { - assert.equal(target, gl.TEXTURE_2D); - assert.equal(level, 0); - assert.equal(internalFormat, gpuSettings.precision === 'single' ? gl.RGBA32F : gl.RGBA); - assert.equal(width, expectedSize[0]); - assert.equal(height, expectedSize[1]); - assert.equal(border, 0); - assert.equal(format, gl.RGBA); - assert.equal(type, expectedType); - assert.equal(pixels.length, expectedPixels.length); - assert.deepEqual(pixels, expectedPixels); - texImage2DCalled = true; - } - }, gl); + gl + ); const source = `function(v) { return this.constants.v[this.thread.x]; }`; const settings = { context: mockContext, }; - const kernel = new WebGL2Kernel(source, Object.assign({ constants: { v: constant } }, settings, gpuSettings)); + const kernel = new WebGL2Kernel( + source, + Object.assign({ constants: { v: constant } }, settings, gpuSettings) + ); kernel.constructor = { lookupKernelValueType: WebGL2Kernel.lookupKernelValueType, features: { - maxTextureSize: 9999 - } + maxTextureSize: 9999, + }, }; kernel.program = 'program'; assert.equal(kernel.constantTextureCount, 0); @@ -158,21 +177,23 @@ test('Array with unsigned precision 5 length', () => { setupConstantsTestSuite({ gpuSettings: { precision: 'unsigned', - output: [4] + output: [4], }, constant: [ // NOTE: formatted like rectangle on purpose, so you can see how the texture should look - 1, 2, 3, 4, - 5 + 1, + 2, 3, 4, 5, ], expectedBitRatio: 4, - expectedPixels: new Uint8Array(new Float32Array([ - // NOTE: formatted like rectangle on purpose, so you can see how the texture should look - 1,2,3,4, - 5,0,0,0 - ]).buffer), - expectedDim: new Int32Array([5,1,1]), - expectedSize: new Int32Array([4,2]), // 4 * 2 = 8 + expectedPixels: new Uint8Array( + new Float32Array([ + // NOTE: formatted like rectangle on purpose, so you can see how the texture should look + 1, + 2, 3, 4, 5, 0, 0, 0, + ]).buffer + ), + expectedDim: new Int32Array([5, 1, 1]), + expectedSize: new Int32Array([4, 2]), // 4 * 2 = 8 expectedType: gl.UNSIGNED_BYTE, expectedConstantTextureCount: 1, expectedPixelStorei: false, @@ -182,23 +203,23 @@ test('Float32Array with unsigned precision 5 length', () => { setupConstantsTestSuite({ gpuSettings: { precision: 'unsigned', - output: [4] + output: [4], }, constant: new Float32Array([ // NOTE: formatted like rectangle on purpose, so you can see how the texture should look - 1, 2, 3, 4, - 5 + 1, + 2, 3, 4, 5, ]), expectedBitRatio: 4, expectedPixels: new Uint8Array( new Float32Array([ // NOTE: formatted like rectangle on purpose, so you can see how the texture should look - 1,2,3,4, - 5,0,0,0 + 1, + 2, 3, 4, 5, 0, 0, 0, ]).buffer ), - expectedDim: new Int32Array([5,1,1]), - expectedSize: new Int32Array([4,2]), // 4 * 2 * 1 = 8 + expectedDim: new Int32Array([5, 1, 1]), + expectedSize: new Int32Array([4, 2]), // 4 * 2 * 1 = 8 expectedType: gl.UNSIGNED_BYTE, expectedConstantTextureCount: 1, expectedPixelStorei: false, @@ -208,23 +229,23 @@ test('Uint16Array with unsigned precision 5 length', () => { setupConstantsTestSuite({ gpuSettings: { precision: 'unsigned', - output: [4] + output: [4], }, constant: new Uint16Array([ // NOTE: formatted like rectangle on purpose, so you can see how the texture should look - 1, 2, 3, 4, - 5 + 1, + 2, 3, 4, 5, ]), expectedBitRatio: 2, expectedPixels: new Uint8Array( new Uint16Array([ // NOTE: formatted like rectangle on purpose, so you can see how the texture should look - 1,2,3,4, - 5,0,0,0 + 1, + 2, 3, 4, 5, 0, 0, 0, ]).buffer ), - expectedDim: new Int32Array([5,1,1]), - expectedSize: new Int32Array([2,2]), // 2 * 2 * 2 = 8 + expectedDim: new Int32Array([5, 1, 1]), + expectedSize: new Int32Array([2, 2]), // 2 * 2 * 2 = 8 expectedType: gl.UNSIGNED_BYTE, expectedConstantTextureCount: 1, expectedPixelStorei: false, @@ -234,20 +255,17 @@ test('Uint8Array with unsigned precision 5 length', () => { setupConstantsTestSuite({ gpuSettings: { precision: 'unsigned', - output: [5] + output: [5], }, - constant: new Uint8Array([ - 1, 2, 3, 4, - 5 - ]), + constant: new Uint8Array([1, 2, 3, 4, 5]), expectedBitRatio: 1, expectedPixels: new Uint8Array([ // NOTE: formatted like rectangle on purpose, so you can see how the texture should look - 1,2,3,4, - 5,0,0,0 + 1, + 2, 3, 4, 5, 0, 0, 0, ]), - expectedDim: new Int32Array([5,1,1]), - expectedSize: new Int32Array([1,2]), // 1 * 2 * 4 = 8 + expectedDim: new Int32Array([5, 1, 1]), + expectedSize: new Int32Array([1, 2]), // 1 * 2 * 4 = 8 expectedType: gl.UNSIGNED_BYTE, expectedConstantTextureCount: 1, expectedPixelStorei: false, @@ -258,21 +276,21 @@ test('Array with single precision', () => { setupConstantsTestSuite({ gpuSettings: { precision: 'single', - output: [4] + output: [4], }, constant: [ // NOTE: formatted like rectangle on purpose, so you can see how the texture should look - 1,2,3,4, - 5 + 1, + 2, 3, 4, 5, ], expectedBitRatio: 4, expectedPixels: new Float32Array([ // NOTE: formatted like rectangle on purpose, so you can see how the texture should look - 1,2,3,4, - 5,0,0,0 + 1, + 2, 3, 4, 5, 0, 0, 0, ]), - expectedDim: new Int32Array([5,1,1]), - expectedSize: new Int32Array([1,2]), + expectedDim: new Int32Array([5, 1, 1]), + expectedSize: new Int32Array([1, 2]), expectedType: gl.FLOAT, expectedTextureWidth: 1, expectedTextureHeight: 2, @@ -284,21 +302,21 @@ test('Float32Array with single precision', () => { setupConstantsTestSuite({ gpuSettings: { precision: 'single', - output: [4] + output: [4], }, constant: new Float32Array([ // NOTE: formatted like rectangle on purpose, so you can see how the texture should look - 1,2,3,4, - 5 + 1, + 2, 3, 4, 5, ]), expectedBitRatio: 4, expectedPixels: new Float32Array([ // NOTE: formatted like rectangle on purpose, so you can see how the texture should look - 1,2,3,4, - 5,0,0,0 + 1, + 2, 3, 4, 5, 0, 0, 0, ]), - expectedDim: new Int32Array([5,1,1]), - expectedSize: new Int32Array([1,2]), + expectedDim: new Int32Array([5, 1, 1]), + expectedSize: new Int32Array([1, 2]), expectedType: gl.FLOAT, expectedTextureWidth: 1, expectedTextureHeight: 2, @@ -310,22 +328,22 @@ test('Uint16Array with single precision', () => { setupConstantsTestSuite({ gpuSettings: { precision: 'single', - output: [4] + output: [4], }, constant: new Uint16Array([ // NOTE: formatted like rectangle on purpose, so you can see how the texture should look - 1,2,3,4, - 5 + 1, + 2, 3, 4, 5, ]), // upconverted from 2 expectedBitRatio: 4, expectedPixels: new Float32Array([ // NOTE: formatted like rectangle on purpose, so you can see how the texture should look - 1,2,3,4, - 5,0,0,0 + 1, + 2, 3, 4, 5, 0, 0, 0, ]), - expectedDim: new Int32Array([5,1,1]), - expectedSize: new Int32Array([1,2]), + expectedDim: new Int32Array([5, 1, 1]), + expectedSize: new Int32Array([1, 2]), expectedType: gl.FLOAT, expectedConstantTextureCount: 1, expectedPixelStorei: false, @@ -335,22 +353,22 @@ test('Uint8Array with single precision', () => { setupConstantsTestSuite({ gpuSettings: { precision: 'single', - output: [4] + output: [4], }, constant: new Uint8Array([ // NOTE: formatted like rectangle on purpose, so you can see how the texture should look - 1,2,3,4, - 5 + 1, + 2, 3, 4, 5, ]), // upconverted from 1 expectedBitRatio: 4, expectedPixels: new Float32Array([ // NOTE: formatted like rectangle on purpose, so you can see how the texture should look - 1,2,3,4, - 5,0,0,0 + 1, + 2, 3, 4, 5, 0, 0, 0, ]), - expectedDim: new Int32Array([5,1,1]), - expectedSize: new Int32Array([1,2]), + expectedDim: new Int32Array([5, 1, 1]), + expectedSize: new Int32Array([1, 2]), expectedType: gl.FLOAT, expectedConstantTextureCount: 1, expectedPixelStorei: false, @@ -361,18 +379,15 @@ test('Array with unsigned precision length 33', () => { setupConstantsTestSuite({ gpuSettings: { precision: 'unsigned', - output: [5] + output: [5], }, constant: [ // NOTE: formatted like rectangle on purpose, so you can see how the texture should look // NOTE: Packing is 1 per RGBA, so only 1 of the 4 channels is used // NOTE: 6x6 - 1, 2, 3, 4, 5, 6, - 7, 8, 9, 10, 11, 12, - 13, 14, 15, 16, 17, 18, - 19, 20, 21, 22, 23, 24, - 25, 26, 27, 28, 29, 30, - 31, 32, 33 + 1, + 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, + 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, ], expectedBitRatio: 4, expectedPixels: new Uint8Array( @@ -380,16 +395,13 @@ test('Array with unsigned precision length 33', () => { // NOTE: formatted like rectangle on purpose, so you can see how the texture should look // NOTE: Packing is 1 per RGBA, so only 1 of the 4 channels is used // NOTE: 6x6 - 1, 2, 3, 4, 5, 6, - 7, 8, 9, 10, 11, 12, - 13, 14, 15, 16, 17, 18, - 19, 20, 21, 22, 23, 24, - 25, 26, 27, 28, 29, 30, - 31, 32, 33, 0, 0, 0 + 1, + 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, + 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 0, 0, 0, ]).buffer ), - expectedDim: new Int32Array([33,1,1]), - expectedSize: new Int32Array([6,6]), // 3 * 3 = 9 * 4 = 34 + expectedDim: new Int32Array([33, 1, 1]), + expectedSize: new Int32Array([6, 6]), // 3 * 3 = 9 * 4 = 34 expectedType: gl.UNSIGNED_BYTE, expectedConstantTextureCount: 1, expectedPixelStorei: false, @@ -400,18 +412,15 @@ test('Float32Array with unsigned precision length 33', () => { setupConstantsTestSuite({ gpuSettings: { precision: 'unsigned', - output: [5] + output: [5], }, constant: new Float32Array([ // NOTE: formatted like rectangle on purpose, so you can see how the texture should look // NOTE: Packing is 1 per RGBA, so only 1 of the 4 channels is used // NOTE: 6x6 - 1, 2, 3, 4, 5, 6, - 7, 8, 9, 10, 11, 12, - 13, 14, 15, 16, 17, 18, - 19, 20, 21, 22, 23, 24, - 25, 26, 27, 28, 29, 30, - 31, 32, 33 + 1, + 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, + 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, ]), expectedBitRatio: 4, expectedPixels: new Uint8Array( @@ -419,16 +428,13 @@ test('Float32Array with unsigned precision length 33', () => { // NOTE: formatted like rectangle on purpose, so you can see how the texture should look // NOTE: Packing is 1 per RGBA, so only 1 of the 4 channels is used // NOTE: 6x6 - 1, 2, 3, 4, 5, 6, - 7, 8, 9, 10, 11, 12, - 13, 14, 15, 16, 17, 18, - 19, 20, 21, 22, 23, 24, - 25, 26, 27, 28, 29, 30, - 31, 32, 33, 0, 0, 0, + 1, + 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, + 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 0, 0, 0, ]).buffer ), - expectedDim: new Int32Array([33,1,1]), - expectedSize: new Int32Array([6,6]), // 3 * 3 = 9 * 4 = 34 + expectedDim: new Int32Array([33, 1, 1]), + expectedSize: new Int32Array([6, 6]), // 3 * 3 = 9 * 4 = 34 expectedType: gl.UNSIGNED_BYTE, expectedConstantTextureCount: 1, expectedPixelStorei: false, @@ -439,17 +445,15 @@ test('Uint16Array with unsigned precision length 33', () => { setupConstantsTestSuite({ gpuSettings: { precision: 'unsigned', - output: [5] + output: [5], }, constant: new Uint16Array([ // NOTE: formatted like rectangle on purpose, so you can see how the texture should look // NOTE: Packing is 2 per RGBA, so only 2 of the 4 channels is used // NOTE: 4x5 - 1,2, 3,4, 5,6, 7,8, - 9,10, 11,12, 13,14, 15,16, - 17,18, 19,20, 21,22, 23,24, - 25,26, 27,28, 29,30, 31,32, - 33, + 1, + 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, + 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, ]), expectedBitRatio: 2, expectedPixels: new Uint8Array( @@ -457,15 +461,13 @@ test('Uint16Array with unsigned precision length 33', () => { // NOTE: formatted like rectangle on purpose, so you can see how the texture should look // NOTE: Packing is 2 per RGBA, so only 2 of the 4 channels is used // NOTE: 4x5 - 1,2, 3,4, 5,6, 7,8, - 9,10, 11,12, 13,14, 15,16, - 17,18, 19,20, 21,22, 23,24, - 25,26, 27,28, 29,30, 31,32, - 33,0, 0,0, 0,0, 0,0 + 1, + 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, + 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 0, 0, 0, 0, 0, 0, 0, ]).buffer ), - expectedDim: new Int32Array([33,1,1]), - expectedSize: new Int32Array([4,5]), // 3 * 3 = 9 * 4 = 34 + expectedDim: new Int32Array([33, 1, 1]), + expectedSize: new Int32Array([4, 5]), // 3 * 3 = 9 * 4 = 34 expectedType: gl.UNSIGNED_BYTE, expectedConstantTextureCount: 1, expectedPixelStorei: false, @@ -476,28 +478,29 @@ test('Uint8Array with unsigned precision length 33', () => { setupConstantsTestSuite({ gpuSettings: { precision: 'unsigned', - output: [5] + output: [5], }, constant: new Uint8Array([ // NOTE: formatted like rectangle on purpose, so you can see how the texture should look // NOTE: Packing is 4 per RGBA, so only 2 of the 4 channels is used // NOTE: 3x3 - 1,2,3,4, 5,6,7,8, 9,10,11,12, - 13,14,15,16, 17,18,19,20, 21,22,23,24, - 25,26, 27,28, 29,30,31,32, 33 + 1, + 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, + 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, ]), expectedBitRatio: 1, expectedPixels: new Uint8Array( new Uint8Array([ - // NOTE: formatted like rectangle on purpose, so you can see how the texture should look - // NOTE: Packing is 4 per RGBA, so only 2 of the 4 channels is used - // NOTE: 3x3 - 1,2,3,4, 5,6,7,8, 9,10,11,12, - 13,14,15,16, 17,18,19,20, 21,22,23,24, - 25,26, 27,28, 29,30,31,32, 33,0,0,0 - ]).buffer), - expectedDim: new Int32Array([33,1,1]), - expectedSize: new Int32Array([3,3]), // 3 * 3 = 9 * 4 = 34 + // NOTE: formatted like rectangle on purpose, so you can see how the texture should look + // NOTE: Packing is 4 per RGBA, so only 2 of the 4 channels is used + // NOTE: 3x3 + 1, + 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, + 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 0, 0, 0, + ]).buffer + ), + expectedDim: new Int32Array([33, 1, 1]), + expectedSize: new Int32Array([3, 3]), // 3 * 3 = 9 * 4 = 34 expectedType: gl.UNSIGNED_BYTE, expectedConstantTextureCount: 1, expectedPixelStorei: false, @@ -508,27 +511,27 @@ test('Array with single precision length 33', () => { setupConstantsTestSuite({ gpuSettings: { precision: 'single', - output: [5] + output: [5], }, constant: [ // NOTE: formatted like rectangle on purpose, so you can see how the texture should look // NOTE: Packing is 4 per RGBA, so 4 of the 4 channels is used // NOTE: 3x3 - 1,2,3,4, 5,6,7,8, 9,10,11,12, - 13,14,15,16, 17,18,19,20, 21,22,23,24, - 25,26,27,28, 29,30,31,32, 33 + 1, + 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, + 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, ], expectedBitRatio: 4, expectedPixels: new Float32Array([ // NOTE: formatted like rectangle on purpose, so you can see how the texture should look // NOTE: Packing is 4 per RGBA, so 4 of the 4 channels is used // NOTE: 3x3 - 1,2,3,4, 5,6,7,8, 9,10,11,12, - 13,14,15,16, 17,18,19,20, 21,22,23,24, - 25,26,27,28, 29,30,31,32, 33,0,0,0 + 1, + 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, + 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 0, 0, 0, ]), - expectedDim: new Int32Array([33,1,1]), - expectedSize: new Int32Array([3,3]), // 3 * 3 = 9 * 4 = 34 + expectedDim: new Int32Array([33, 1, 1]), + expectedSize: new Int32Array([3, 3]), // 3 * 3 = 9 * 4 = 34 expectedType: gl.FLOAT, expectedConstantTextureCount: 1, expectedPixelStorei: false, @@ -539,27 +542,27 @@ test('Float32Array with single precision length 33', () => { setupConstantsTestSuite({ gpuSettings: { precision: 'single', - output: [5] + output: [5], }, constant: new Float32Array([ // NOTE: formatted like rectangle on purpose, so you can see how the texture should look // NOTE: Packing is 4 per RGBA, so 4 of the 4 channels is used // NOTE: 3x3 - 1,2,3,4, 5,6,7,8, 9,10,11,12, - 13,14,15,16, 17,18,19,20, 21,22,23,24, - 25,26,27,28, 29,30,31,32, 33 + 1, + 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, + 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, ]), expectedBitRatio: 4, expectedPixels: new Float32Array([ // NOTE: formatted like rectangle on purpose, so you can see how the texture should look // NOTE: Packing is 4 per RGBA, so 4 of the 4 channels is used // NOTE: 3x3 - 1,2,3,4, 5,6,7,8, 9,10,11,12, - 13,14,15,16, 17,18,19,20, 21,22,23,24, - 25,26,27,28, 29,30,31,32, 33,0,0,0 + 1, + 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, + 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 0, 0, 0, ]), - expectedDim: new Int32Array([33,1,1]), - expectedSize: new Int32Array([3,3]), // 3 * 3 = 9 * 4 = 34 + expectedDim: new Int32Array([33, 1, 1]), + expectedSize: new Int32Array([3, 3]), // 3 * 3 = 9 * 4 = 34 expectedType: gl.FLOAT, expectedConstantTextureCount: 1, expectedPixelStorei: false, @@ -570,15 +573,15 @@ test('Uint16Array with single precision length 33', () => { setupConstantsTestSuite({ gpuSettings: { precision: 'single', - output: [5] + output: [5], }, constant: new Uint16Array([ // NOTE: formatted like rectangle on purpose, so you can see how the texture should look // NOTE: Packing is 4 per RGBA, so 4 of the 4 channels is used // NOTE: 3x3 - 1,2,3,4, 5,6,7,8, 9,10,11,12, - 13,14,15,16, 17,18,19,20, 21,22,23,24, - 25,26,27,28, 29,30,31,32, 33 + 1, + 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, + 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, ]), // upconverted from 2 expectedBitRatio: 4, @@ -586,12 +589,12 @@ test('Uint16Array with single precision length 33', () => { // NOTE: formatted like rectangle on purpose, so you can see how the texture should look // NOTE: Packing is 4 per RGBA, so 4 of the 4 channels is used // NOTE: 3x3 - 1,2,3,4, 5,6,7,8, 9,10,11,12, - 13,14,15,16, 17,18,19,20, 21,22,23,24, - 25,26,27,28, 29,30,31,32, 33,0,0,0 + 1, + 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, + 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 0, 0, 0, ]), - expectedDim: new Int32Array([33,1,1]), - expectedSize: new Int32Array([3,3]), // 3 * 3 = 9 * 4 = 36 + expectedDim: new Int32Array([33, 1, 1]), + expectedSize: new Int32Array([3, 3]), // 3 * 3 = 9 * 4 = 36 expectedType: gl.FLOAT, expectedConstantTextureCount: 1, expectedPixelStorei: false, @@ -602,15 +605,15 @@ test('Uint8Array with single precision length 33', () => { setupConstantsTestSuite({ gpuSettings: { precision: 'single', - output: [5] + output: [5], }, constant: new Uint8Array([ // NOTE: formatted like rectangle on purpose, so you can see how the texture should look // NOTE: Packing is 4 per RGBA, so 4 of the 4 channels is used // NOTE: 3x3 - 1,2,3,4, 5,6,7,8, 9,10,11,12, - 13,14,15,16, 17,18,19,20, 21,22,23,24, - 25,26,27,28, 29,30,31,32, 33 + 1, + 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, + 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, ]), // upconverted from 1 expectedBitRatio: 4, @@ -618,12 +621,12 @@ test('Uint8Array with single precision length 33', () => { // NOTE: formatted like rectangle on purpose, so you can see how the texture should look // NOTE: Packing is 4 per RGBA, so 4 of the 4 channels is used // NOTE: 3x3 - 1,2,3,4, 5,6,7,8, 9,10,11,12, - 13,14,15,16, 17,18,19,20, 21,22,23,24, - 25,26,27,28, 29,30,31,32, 33,0,0,0 + 1, + 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, + 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 0, 0, 0, ]), - expectedDim: new Int32Array([33,1,1]), - expectedSize: new Int32Array([3,3]), // 3 * 3 = 9 * 4 = 36 + expectedDim: new Int32Array([33, 1, 1]), + expectedSize: new Int32Array([3, 3]), // 3 * 3 = 9 * 4 = 36 expectedType: gl.FLOAT, expectedConstantTextureCount: 1, expectedPixelStorei: false, @@ -636,21 +639,26 @@ test('Input(Array) with unsigned precision 5 length', () => { setupConstantsTestSuite({ gpuSettings: { precision: 'unsigned', - output: [4] + output: [4], }, - constant: input([ - // NOTE: formatted like rectangle on purpose, so you can see how the texture should look - 1, 2, 3, 4, - 5, 0 - ], [2,3]), + constant: input( + [ + // NOTE: formatted like rectangle on purpose, so you can see how the texture should look + 1, + 2, 3, 4, 5, 0, + ], + [2, 3] + ), expectedBitRatio: 4, - expectedPixels: new Uint8Array(new Float32Array([ - // NOTE: formatted like rectangle on purpose, so you can see how the texture should look - 1,2,3,4, - 5,0,0,0 - ]).buffer), - expectedDim: new Int32Array([2,3,1]), - expectedSize: new Int32Array([4,2]), // 4 * 2 = 8 + expectedPixels: new Uint8Array( + new Float32Array([ + // NOTE: formatted like rectangle on purpose, so you can see how the texture should look + 1, + 2, 3, 4, 5, 0, 0, 0, + ]).buffer + ), + expectedDim: new Int32Array([2, 3, 1]), + expectedSize: new Int32Array([4, 2]), // 4 * 2 = 8 expectedType: gl.UNSIGNED_BYTE, expectedConstantTextureCount: 1, expectedPixelStorei: false, @@ -660,23 +668,26 @@ test('Input(Float32Array) with unsigned precision 5 length', () => { setupConstantsTestSuite({ gpuSettings: { precision: 'unsigned', - output: [4] + output: [4], }, - constant: input(new Float32Array([ - // NOTE: formatted like rectangle on purpose, so you can see how the texture should look - 1, 2, 3, 4, - 5 - ]), [5]), + constant: input( + new Float32Array([ + // NOTE: formatted like rectangle on purpose, so you can see how the texture should look + 1, + 2, 3, 4, 5, + ]), + [5] + ), expectedBitRatio: 4, expectedPixels: new Uint8Array( new Float32Array([ // NOTE: formatted like rectangle on purpose, so you can see how the texture should look - 1,2,3,4, - 5,0,0,0 + 1, + 2, 3, 4, 5, 0, 0, 0, ]).buffer ), - expectedDim: new Int32Array([5,1,1]), - expectedSize: new Int32Array([4,2]), // 4 * 2 * 1 = 8 + expectedDim: new Int32Array([5, 1, 1]), + expectedSize: new Int32Array([4, 2]), // 4 * 2 * 1 = 8 expectedType: gl.UNSIGNED_BYTE, expectedConstantTextureCount: 1, expectedPixelStorei: false, @@ -686,23 +697,26 @@ test('Input(Uint16Array) with unsigned precision 5 length', () => { setupConstantsTestSuite({ gpuSettings: { precision: 'unsigned', - output: [4] + output: [4], }, - constant: input(new Uint16Array([ - // NOTE: formatted like rectangle on purpose, so you can see how the texture should look - 1, 2, 3, 4, - 5, 0, - ]), [2,3]), + constant: input( + new Uint16Array([ + // NOTE: formatted like rectangle on purpose, so you can see how the texture should look + 1, + 2, 3, 4, 5, 0, + ]), + [2, 3] + ), expectedBitRatio: 2, expectedPixels: new Uint8Array( new Uint16Array([ // NOTE: formatted like rectangle on purpose, so you can see how the texture should look - 1,2,3,4, - 5,0,0,0 + 1, + 2, 3, 4, 5, 0, 0, 0, ]).buffer ), - expectedDim: new Int32Array([2,3,1]), - expectedSize: new Int32Array([2,2]), // 2 * 2 * 2 = 8 + expectedDim: new Int32Array([2, 3, 1]), + expectedSize: new Int32Array([2, 2]), // 2 * 2 * 2 = 8 expectedType: gl.UNSIGNED_BYTE, expectedConstantTextureCount: 1, expectedPixelStorei: false, @@ -712,20 +726,17 @@ test('Input(Uint8Array) with unsigned precision 5 length', () => { setupConstantsTestSuite({ gpuSettings: { precision: 'unsigned', - output: [5] + output: [5], }, - constant: input(new Uint8Array([ - 1, 2, 3, 4, - 5,0 - ]),[2, 3]), + constant: input(new Uint8Array([1, 2, 3, 4, 5, 0]), [2, 3]), expectedBitRatio: 1, expectedPixels: new Uint8Array([ // NOTE: formatted like rectangle on purpose, so you can see how the texture should look - 1,2,3,4, - 5,0,0,0 + 1, + 2, 3, 4, 5, 0, 0, 0, ]), - expectedDim: new Int32Array([2,3,1]), - expectedSize: new Int32Array([1,2]), // 1 * 2 * 4 = 8 + expectedDim: new Int32Array([2, 3, 1]), + expectedSize: new Int32Array([1, 2]), // 1 * 2 * 4 = 8 expectedType: gl.UNSIGNED_BYTE, expectedConstantTextureCount: 1, expectedPixelStorei: false, @@ -736,21 +747,24 @@ test('Input(Array) with single precision', () => { setupConstantsTestSuite({ gpuSettings: { precision: 'single', - output: [4] + output: [4], }, - constant: input([ - // NOTE: formatted like rectangle on purpose, so you can see how the texture should look - 1,2,3,4, - 5,0 - ], [2,3]), + constant: input( + [ + // NOTE: formatted like rectangle on purpose, so you can see how the texture should look + 1, + 2, 3, 4, 5, 0, + ], + [2, 3] + ), expectedBitRatio: 4, expectedPixels: new Float32Array([ // NOTE: formatted like rectangle on purpose, so you can see how the texture should look - 1,2,3,4, - 5,0,0,0 + 1, + 2, 3, 4, 5, 0, 0, 0, ]), - expectedDim: new Int32Array([2,3,1]), - expectedSize: new Int32Array([1,2]), + expectedDim: new Int32Array([2, 3, 1]), + expectedSize: new Int32Array([1, 2]), expectedType: gl.FLOAT, expectedTextureWidth: 1, expectedTextureHeight: 2, @@ -762,21 +776,24 @@ test('Input(Float32Array) with single precision', () => { setupConstantsTestSuite({ gpuSettings: { precision: 'single', - output: [4] + output: [4], }, - constant: input(new Float32Array([ - // NOTE: formatted like rectangle on purpose, so you can see how the texture should look - 1,2,3,4, - 5,0 - ]),[2,3]), + constant: input( + new Float32Array([ + // NOTE: formatted like rectangle on purpose, so you can see how the texture should look + 1, + 2, 3, 4, 5, 0, + ]), + [2, 3] + ), expectedBitRatio: 4, expectedPixels: new Float32Array([ // NOTE: formatted like rectangle on purpose, so you can see how the texture should look - 1,2,3,4, - 5,0,0,0 + 1, + 2, 3, 4, 5, 0, 0, 0, ]), - expectedDim: new Int32Array([2,3,1]), - expectedSize: new Int32Array([1,2]), + expectedDim: new Int32Array([2, 3, 1]), + expectedSize: new Int32Array([1, 2]), expectedType: gl.FLOAT, expectedTextureWidth: 1, expectedTextureHeight: 2, @@ -788,22 +805,25 @@ test('Input(Uint16Array) with single precision', () => { setupConstantsTestSuite({ gpuSettings: { precision: 'single', - output: [4] + output: [4], }, - constant: input(new Uint16Array([ - // NOTE: formatted like rectangle on purpose, so you can see how the texture should look - 1,2,3,4, - 5,0 - ]), [2,3]), + constant: input( + new Uint16Array([ + // NOTE: formatted like rectangle on purpose, so you can see how the texture should look + 1, + 2, 3, 4, 5, 0, + ]), + [2, 3] + ), // upconverted from 2 expectedBitRatio: 4, expectedPixels: new Float32Array([ // NOTE: formatted like rectangle on purpose, so you can see how the texture should look - 1,2,3,4, - 5,0,0,0 + 1, + 2, 3, 4, 5, 0, 0, 0, ]), - expectedDim: new Int32Array([2,3,1]), - expectedSize: new Int32Array([1,2]), + expectedDim: new Int32Array([2, 3, 1]), + expectedSize: new Int32Array([1, 2]), expectedType: gl.FLOAT, expectedConstantTextureCount: 1, expectedPixelStorei: false, @@ -813,22 +833,25 @@ test('Input(Uint8Array) with single precision', () => { setupConstantsTestSuite({ gpuSettings: { precision: 'single', - output: [4] + output: [4], }, - constant: input(new Uint8Array([ - // NOTE: formatted like rectangle on purpose, so you can see how the texture should look - 1,2,3,4, - 5,0 - ]), [2,3]), + constant: input( + new Uint8Array([ + // NOTE: formatted like rectangle on purpose, so you can see how the texture should look + 1, + 2, 3, 4, 5, 0, + ]), + [2, 3] + ), // upconverted from 1 expectedBitRatio: 4, expectedPixels: new Float32Array([ // NOTE: formatted like rectangle on purpose, so you can see how the texture should look - 1,2,3,4, - 5,0,0,0 + 1, + 2, 3, 4, 5, 0, 0, 0, ]), - expectedDim: new Int32Array([2,3,1]), - expectedSize: new Int32Array([1,2]), + expectedDim: new Int32Array([2, 3, 1]), + expectedSize: new Int32Array([1, 2]), expectedType: gl.FLOAT, expectedConstantTextureCount: 1, expectedPixelStorei: false, @@ -839,35 +862,32 @@ test('Input(Array) with unsigned precision length 33', () => { setupConstantsTestSuite({ gpuSettings: { precision: 'unsigned', - output: [5] + output: [5], }, - constant: input([ - // NOTE: formatted like rectangle on purpose, so you can see how the texture should look - // NOTE: Packing is 1 per RGBA, so only 1 of the 4 channels is used - // NOTE: 6x6 - 1, 2, 3, 4, 5, 6, - 7, 8, 9, 10, 11, 12, - 13, 14, 15, 16, 17, 18, - 19, 20, 21, 22, 23, 24, - 25, 26, 27, 28, 29, 30, - 31, 32, 33 - ], [33]), + constant: input( + [ + // NOTE: formatted like rectangle on purpose, so you can see how the texture should look + // NOTE: Packing is 1 per RGBA, so only 1 of the 4 channels is used + // NOTE: 6x6 + 1, + 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, + 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, + ], + [33] + ), expectedBitRatio: 4, expectedPixels: new Uint8Array( new Float32Array([ // NOTE: formatted like rectangle on purpose, so you can see how the texture should look // NOTE: Packing is 1 per RGBA, so only 1 of the 4 channels is used // NOTE: 6x6 - 1, 2, 3, 4, 5, 6, - 7, 8, 9, 10, 11, 12, - 13, 14, 15, 16, 17, 18, - 19, 20, 21, 22, 23, 24, - 25, 26, 27, 28, 29, 30, - 31, 32, 33, 0, 0, 0 + 1, + 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, + 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 0, 0, 0, ]).buffer ), - expectedDim: new Int32Array([33,1,1]), - expectedSize: new Int32Array([6,6]), // 3 * 3 = 9 * 4 = 34 + expectedDim: new Int32Array([33, 1, 1]), + expectedSize: new Int32Array([6, 6]), // 3 * 3 = 9 * 4 = 34 expectedType: gl.UNSIGNED_BYTE, expectedConstantTextureCount: 1, expectedPixelStorei: false, @@ -878,35 +898,32 @@ test('Input(Float32Array) with unsigned precision length 33', () => { setupConstantsTestSuite({ gpuSettings: { precision: 'unsigned', - output: [5] + output: [5], }, - constant: input(new Float32Array([ - // NOTE: formatted like rectangle on purpose, so you can see how the texture should look - // NOTE: Packing is 1 per RGBA, so only 1 of the 4 channels is used - // NOTE: 6x6 - 1, 2, 3, 4, 5, 6, - 7, 8, 9, 10, 11, 12, - 13, 14, 15, 16, 17, 18, - 19, 20, 21, 22, 23, 24, - 25, 26, 27, 28, 29, 30, - 31, 32, 33 - ]), [33]), + constant: input( + new Float32Array([ + // NOTE: formatted like rectangle on purpose, so you can see how the texture should look + // NOTE: Packing is 1 per RGBA, so only 1 of the 4 channels is used + // NOTE: 6x6 + 1, + 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, + 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, + ]), + [33] + ), expectedBitRatio: 4, expectedPixels: new Uint8Array( new Float32Array([ // NOTE: formatted like rectangle on purpose, so you can see how the texture should look // NOTE: Packing is 1 per RGBA, so only 1 of the 4 channels is used // NOTE: 6x6 - 1, 2, 3, 4, 5, 6, - 7, 8, 9, 10, 11, 12, - 13, 14, 15, 16, 17, 18, - 19, 20, 21, 22, 23, 24, - 25, 26, 27, 28, 29, 30, - 31, 32, 33, 0, 0, 0, + 1, + 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, + 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 0, 0, 0, ]).buffer ), - expectedDim: new Int32Array([33,1,1]), - expectedSize: new Int32Array([6,6]), // 3 * 3 = 9 * 4 = 34 + expectedDim: new Int32Array([33, 1, 1]), + expectedSize: new Int32Array([6, 6]), // 3 * 3 = 9 * 4 = 34 expectedType: gl.UNSIGNED_BYTE, expectedConstantTextureCount: 1, expectedPixelStorei: false, @@ -917,33 +934,32 @@ test('Input(Uint16Array) with unsigned precision length 33', () => { setupConstantsTestSuite({ gpuSettings: { precision: 'unsigned', - output: [5] + output: [5], }, - constant: input(new Uint16Array([ - // NOTE: formatted like rectangle on purpose, so you can see how the texture should look - // NOTE: Packing is 2 per RGBA, so only 2 of the 4 channels is used - // NOTE: 4x5 - 1,2, 3,4, 5,6, 7,8, - 9,10, 11,12, 13,14, 15,16, - 17,18, 19,20, 21,22, 23,24, - 25,26, 27,28, 29,30, 31,32, - 33, - ]), [33]), + constant: input( + new Uint16Array([ + // NOTE: formatted like rectangle on purpose, so you can see how the texture should look + // NOTE: Packing is 2 per RGBA, so only 2 of the 4 channels is used + // NOTE: 4x5 + 1, + 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, + 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, + ]), + [33] + ), expectedBitRatio: 2, expectedPixels: new Uint8Array( new Uint16Array([ // NOTE: formatted like rectangle on purpose, so you can see how the texture should look // NOTE: Packing is 2 per RGBA, so only 2 of the 4 channels is used // NOTE: 4x5 - 1,2, 3,4, 5,6, 7,8, - 9,10, 11,12, 13,14, 15,16, - 17,18, 19,20, 21,22, 23,24, - 25,26, 27,28, 29,30, 31,32, - 33,0, 0,0, 0,0, 0,0 + 1, + 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, + 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 0, 0, 0, 0, 0, 0, 0, ]).buffer ), - expectedDim: new Int32Array([33,1,1]), - expectedSize: new Int32Array([4,5]), // 3 * 3 = 9 * 4 = 34 + expectedDim: new Int32Array([33, 1, 1]), + expectedSize: new Int32Array([4, 5]), // 3 * 3 = 9 * 4 = 34 expectedType: gl.UNSIGNED_BYTE, expectedConstantTextureCount: 1, expectedPixelStorei: false, @@ -954,28 +970,32 @@ test('Input(Uint8Array) with unsigned precision length 33', () => { setupConstantsTestSuite({ gpuSettings: { precision: 'unsigned', - output: [5] + output: [5], }, - constant: input(new Uint8Array([ - // NOTE: formatted like rectangle on purpose, so you can see how the texture should look - // NOTE: Packing is 4 per RGBA, so only 2 of the 4 channels is used - // NOTE: 3x3 - 1,2,3,4, 5,6,7,8, 9,10,11,12, - 13,14,15,16, 17,18,19,20, 21,22,23,24, - 25,26, 27,28, 29,30,31,32, 33 - ]), [33]), + constant: input( + new Uint8Array([ + // NOTE: formatted like rectangle on purpose, so you can see how the texture should look + // NOTE: Packing is 4 per RGBA, so only 2 of the 4 channels is used + // NOTE: 3x3 + 1, + 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, + 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, + ]), + [33] + ), expectedBitRatio: 1, expectedPixels: new Uint8Array( new Uint8Array([ // NOTE: formatted like rectangle on purpose, so you can see how the texture should look // NOTE: Packing is 4 per RGBA, so only 2 of the 4 channels is used // NOTE: 3x3 - 1,2,3,4, 5,6,7,8, 9,10,11,12, - 13,14,15,16, 17,18,19,20, 21,22,23,24, - 25,26, 27,28, 29,30,31,32, 33,0,0,0 - ]).buffer), - expectedDim: new Int32Array([33,1,1]), - expectedSize: new Int32Array([3,3]), // 3 * 3 = 9 * 4 = 34 + 1, + 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, + 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 0, 0, 0, + ]).buffer + ), + expectedDim: new Int32Array([33, 1, 1]), + expectedSize: new Int32Array([3, 3]), // 3 * 3 = 9 * 4 = 34 expectedType: gl.UNSIGNED_BYTE, expectedConstantTextureCount: 1, expectedPixelStorei: false, @@ -986,27 +1006,30 @@ test('Input(Array) with single precision length 33', () => { setupConstantsTestSuite({ gpuSettings: { precision: 'single', - output: [5] + output: [5], }, - constant: input([ - // NOTE: formatted like rectangle on purpose, so you can see how the texture should look - // NOTE: Packing is 4 per RGBA, so 4 of the 4 channels is used - // NOTE: 3x3 - 1,2,3,4, 5,6,7,8, 9,10,11,12, - 13,14,15,16, 17,18,19,20, 21,22,23,24, - 25,26,27,28, 29,30,31,32, 33 - ], [33]), + constant: input( + [ + // NOTE: formatted like rectangle on purpose, so you can see how the texture should look + // NOTE: Packing is 4 per RGBA, so 4 of the 4 channels is used + // NOTE: 3x3 + 1, + 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, + 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, + ], + [33] + ), expectedBitRatio: 4, expectedPixels: new Float32Array([ // NOTE: formatted like rectangle on purpose, so you can see how the texture should look // NOTE: Packing is 4 per RGBA, so 4 of the 4 channels is used // NOTE: 3x3 - 1,2,3,4, 5,6,7,8, 9,10,11,12, - 13,14,15,16, 17,18,19,20, 21,22,23,24, - 25,26,27,28, 29,30,31,32, 33,0,0,0 + 1, + 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, + 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 0, 0, 0, ]), - expectedDim: new Int32Array([33,1,1]), - expectedSize: new Int32Array([3,3]), // 3 * 3 = 9 * 4 = 34 + expectedDim: new Int32Array([33, 1, 1]), + expectedSize: new Int32Array([3, 3]), // 3 * 3 = 9 * 4 = 34 expectedType: gl.FLOAT, expectedConstantTextureCount: 1, expectedPixelStorei: false, @@ -1017,27 +1040,30 @@ test('Input(Float32Array) with single precision length 33', () => { setupConstantsTestSuite({ gpuSettings: { precision: 'single', - output: [5] + output: [5], }, - constant: input(new Float32Array([ - // NOTE: formatted like rectangle on purpose, so you can see how the texture should look - // NOTE: Packing is 4 per RGBA, so 4 of the 4 channels is used - // NOTE: 3x3 - 1,2,3,4, 5,6,7,8, 9,10,11,12, - 13,14,15,16, 17,18,19,20, 21,22,23,24, - 25,26,27,28, 29,30,31,32, 33 - ]), [33]), + constant: input( + new Float32Array([ + // NOTE: formatted like rectangle on purpose, so you can see how the texture should look + // NOTE: Packing is 4 per RGBA, so 4 of the 4 channels is used + // NOTE: 3x3 + 1, + 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, + 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, + ]), + [33] + ), expectedBitRatio: 4, expectedPixels: new Float32Array([ // NOTE: formatted like rectangle on purpose, so you can see how the texture should look // NOTE: Packing is 4 per RGBA, so 4 of the 4 channels is used // NOTE: 3x3 - 1,2,3,4, 5,6,7,8, 9,10,11,12, - 13,14,15,16, 17,18,19,20, 21,22,23,24, - 25,26,27,28, 29,30,31,32, 33,0,0,0 + 1, + 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, + 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 0, 0, 0, ]), - expectedDim: new Int32Array([33,1,1]), - expectedSize: new Int32Array([3,3]), // 3 * 3 = 9 * 4 = 34 + expectedDim: new Int32Array([33, 1, 1]), + expectedSize: new Int32Array([3, 3]), // 3 * 3 = 9 * 4 = 34 expectedType: gl.FLOAT, expectedConstantTextureCount: 1, expectedPixelStorei: false, @@ -1048,28 +1074,31 @@ test('Input(Uint16Array) with single precision length 33', () => { setupConstantsTestSuite({ gpuSettings: { precision: 'single', - output: [5] + output: [5], }, - constant: input(new Uint16Array([ - // NOTE: formatted like rectangle on purpose, so you can see how the texture should look - // NOTE: Packing is 4 per RGBA, so 4 of the 4 channels is used - // NOTE: 3x3 - 1,2,3,4, 5,6,7,8, 9,10,11,12, - 13,14,15,16, 17,18,19,20, 21,22,23,24, - 25,26,27,28, 29,30,31,32, 33 - ]), [33]), + constant: input( + new Uint16Array([ + // NOTE: formatted like rectangle on purpose, so you can see how the texture should look + // NOTE: Packing is 4 per RGBA, so 4 of the 4 channels is used + // NOTE: 3x3 + 1, + 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, + 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, + ]), + [33] + ), // upconverted from 2 expectedBitRatio: 4, expectedPixels: new Float32Array([ // NOTE: formatted like rectangle on purpose, so you can see how the texture should look // NOTE: Packing is 4 per RGBA, so 4 of the 4 channels is used // NOTE: 3x3 - 1,2,3,4, 5,6,7,8, 9,10,11,12, - 13,14,15,16, 17,18,19,20, 21,22,23,24, - 25,26,27,28, 29,30,31,32, 33,0,0,0 + 1, + 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, + 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 0, 0, 0, ]), - expectedDim: new Int32Array([33,1,1]), - expectedSize: new Int32Array([3,3]), // 3 * 3 = 9 * 4 = 36 + expectedDim: new Int32Array([33, 1, 1]), + expectedSize: new Int32Array([3, 3]), // 3 * 3 = 9 * 4 = 36 expectedType: gl.FLOAT, expectedConstantTextureCount: 1, expectedPixelStorei: false, @@ -1080,28 +1109,31 @@ test('Input(Uint8Array) with single precision length 33', () => { setupConstantsTestSuite({ gpuSettings: { precision: 'single', - output: [5] + output: [5], }, - constant: input(new Uint8Array([ - // NOTE: formatted like rectangle on purpose, so you can see how the texture should look - // NOTE: Packing is 4 per RGBA (8 bit, but upconverted to float32), so only 4 of the 4 channels is used - // NOTE: 3x3 - 1,2,3,4, 5,6,7,8, 9,10,11,12, - 13,14,15,16, 17,18,19,20, 21,22,23,24, - 25,26,27,28, 29,30,31,32, 33 - ]), [33]), + constant: input( + new Uint8Array([ + // NOTE: formatted like rectangle on purpose, so you can see how the texture should look + // NOTE: Packing is 4 per RGBA (8 bit, but upconverted to float32), so only 4 of the 4 channels is used + // NOTE: 3x3 + 1, + 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, + 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, + ]), + [33] + ), // upconverted to float32 expectedBitRatio: 4, expectedPixels: new Float32Array([ // NOTE: formatted like rectangle on purpose, so you can see how the texture should look // NOTE: Packing is 4 per RGBA (8 bit, but upconverted to float32), so only 4 of the 4 channels is used // NOTE: 3x3 - 1,2,3,4, 5,6,7,8, 9,10,11,12, - 13,14,15,16, 17,18,19,20, 21,22,23,24, - 25,26,27,28, 29,30,31,32, 33,0,0,0 + 1, + 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, + 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 0, 0, 0, ]), - expectedDim: new Int32Array([33,1,1]), - expectedSize: new Int32Array([3,3]), // 3 * 3 = 9 * 4 = 36 + expectedDim: new Int32Array([33, 1, 1]), + expectedSize: new Int32Array([3, 3]), // 3 * 3 = 9 * 4 = 36 expectedType: gl.FLOAT, expectedConstantTextureCount: 1, expectedPixelStorei: false, diff --git a/test/internal/boolean.js b/test/internal/boolean.js index abb2a9df..6563b0dc 100644 --- a/test/internal/boolean.js +++ b/test/internal/boolean.js @@ -1,19 +1,22 @@ const { assert, skip, test, module: describe, only } = require('qunit'); -const { GPU } = require('../../src'); +const { GPU } = require('../..'); describe('internal: boolean'); function booleanLiteral(mode) { const gpu = new GPU({ mode }); - const kernel = gpu.createKernel(function() { - const v = true === true; - if (v) { - return 1; + const kernel = gpu.createKernel( + function () { + const v = true === true; + if (v) { + return 1; + } + return 0; + }, + { + output: [1], } - return 0; - }, { - output: [1], - }); + ); const result = kernel(); assert.ok(result[0]); gpu.destroy(); @@ -43,17 +46,19 @@ test('boolean literal cpu', () => { booleanLiteral('cpu'); }); - function booleanArgumentTrue(mode) { const gpu = new GPU({ mode }); - const kernel = gpu.createKernel(function(v) { - if (v) { - return 1; + const kernel = gpu.createKernel( + function (v) { + if (v) { + return 1; + } + return 0; + }, + { + output: [1], } - return 0; - }, { - output: [1], - }); + ); const result = kernel(true); assert.ok(result[0]); gpu.destroy(); @@ -75,25 +80,30 @@ test('boolean argument true gpu', () => { booleanArgumentTrue('webgl2'); }); -(GPU.isHeadlessGLSupported ? test : skip)('boolean argument true headlessgl', () => { - booleanArgumentTrue('headlessgl'); -}); +(GPU.isHeadlessGLSupported ? test : skip)( + 'boolean argument true headlessgl', + () => { + booleanArgumentTrue('headlessgl'); + } +); test('boolean argument true cpu', () => { booleanArgumentTrue('cpu'); }); - function booleanArgumentFalse(mode) { const gpu = new GPU({ mode }); - const kernel = gpu.createKernel(function(v) { - if (v) { - return 1; + const kernel = gpu.createKernel( + function (v) { + if (v) { + return 1; + } + return 0; + }, + { + output: [1], } - return 0; - }, { - output: [1], - }); + ); const result = kernel(false); assert.notOk(result[0]); gpu.destroy(); @@ -115,26 +125,31 @@ test('boolean argument false gpu', () => { booleanArgumentFalse('webgl2'); }); -(GPU.isHeadlessGLSupported ? test : skip)('boolean argument false headlessgl', () => { - booleanArgumentFalse('headlessgl'); -}); +(GPU.isHeadlessGLSupported ? test : skip)( + 'boolean argument false headlessgl', + () => { + booleanArgumentFalse('headlessgl'); + } +); test('boolean argument false cpu', () => { booleanArgumentFalse('cpu'); }); - function booleanVariableTrue(mode) { const gpu = new GPU({ mode }); - const kernel = gpu.createKernel(function() { - const v = true; - if (v) { - return 1; + const kernel = gpu.createKernel( + function () { + const v = true; + if (v) { + return 1; + } + return 0; + }, + { + output: [1], } - return 0; - }, { - output: [1], - }); + ); const result = kernel(); assert.ok(result[0]); gpu.destroy(); @@ -156,9 +171,12 @@ test('boolean variable true gpu', () => { booleanVariableTrue('webgl2'); }); -(GPU.isHeadlessGLSupported ? test : skip)('boolean variable true headlessgl', () => { - booleanVariableTrue('headlessgl'); -}); +(GPU.isHeadlessGLSupported ? test : skip)( + 'boolean variable true headlessgl', + () => { + booleanVariableTrue('headlessgl'); + } +); test('boolean variable true cpu', () => { booleanVariableTrue('cpu'); @@ -166,15 +184,18 @@ test('boolean variable true cpu', () => { function booleanVariableFalse(mode) { const gpu = new GPU({ mode }); - const kernel = gpu.createKernel(function() { - const v = false; - if (v) { - return 1; + const kernel = gpu.createKernel( + function () { + const v = false; + if (v) { + return 1; + } + return 0; + }, + { + output: [1], } - return 0; - }, { - output: [1], - }); + ); const result = kernel(); assert.notOk(result[0]); gpu.destroy(); @@ -196,9 +217,12 @@ test('boolean variable false gpu', () => { booleanVariableFalse('webgl2'); }); -(GPU.isHeadlessGLSupported ? test : skip)('boolean variable false headlessgl', () => { - booleanVariableFalse('headlessgl'); -}); +(GPU.isHeadlessGLSupported ? test : skip)( + 'boolean variable false headlessgl', + () => { + booleanVariableFalse('headlessgl'); + } +); test('boolean variable false cpu', () => { booleanVariableFalse('cpu'); @@ -206,15 +230,18 @@ test('boolean variable false cpu', () => { function booleanExpressionTrue(mode) { const gpu = new GPU({ mode }); - const kernel = gpu.createKernel(function() { - const v = 1 > 0; - if (v) { - return 1; + const kernel = gpu.createKernel( + function () { + const v = 1 > 0; + if (v) { + return 1; + } + return 0; + }, + { + output: [1], } - return 0; - }, { - output: [1], - }); + ); const result = kernel(); assert.ok(result[0]); gpu.destroy(); @@ -236,26 +263,31 @@ test('boolean expression true gpu', () => { booleanExpressionTrue('webgl2'); }); -(GPU.isHeadlessGLSupported ? test : skip)('boolean expression true headlessgl', () => { - booleanExpressionTrue('headlessgl'); -}); +(GPU.isHeadlessGLSupported ? test : skip)( + 'boolean expression true headlessgl', + () => { + booleanExpressionTrue('headlessgl'); + } +); test('boolean expression true cpu', () => { booleanExpressionTrue('cpu'); }); - function booleanExpressionFalse(mode) { const gpu = new GPU({ mode }); - const kernel = gpu.createKernel(function() { - const v = 1 < 0; - if (v) { - return 1; + const kernel = gpu.createKernel( + function () { + const v = 1 < 0; + if (v) { + return 1; + } + return 0; + }, + { + output: [1], } - return 0; - }, { - output: [1], - }); + ); const result = kernel(); assert.notOk(result[0]); gpu.destroy(); @@ -273,13 +305,19 @@ test('boolean expression false gpu', () => { booleanExpressionFalse('webgl'); }); -(GPU.isWebGL2Supported ? test : skip)('boolean expression false webgl2', () => { - booleanExpressionFalse('webgl2'); -}); +(GPU.isWebGL2Supported ? test : skip)( + 'boolean expression false webgl2', + () => { + booleanExpressionFalse('webgl2'); + } +); -(GPU.isHeadlessGLSupported ? test : skip)('boolean expression false headlessgl', () => { - booleanExpressionFalse('headlessgl'); -}); +(GPU.isHeadlessGLSupported ? test : skip)( + 'boolean expression false headlessgl', + () => { + booleanExpressionFalse('headlessgl'); + } +); test('boolean expression false cpu', () => { booleanExpressionFalse('cpu'); diff --git a/test/internal/casting.js b/test/internal/casting.js index 89635afb..b6b7177e 100644 --- a/test/internal/casting.js +++ b/test/internal/casting.js @@ -1,138 +1,197 @@ const { assert, skip, test, module: describe, only } = require('qunit'); -const { GPU } = require('../../src'); +const { GPU } = require('../..'); describe('internal: casting'); function castingOffsetByThreadXAndOutputX(mode) { const gpu = new GPU({ mode }); - const kernel = gpu.createKernel(function (value) { - // value will be a number - // this.thread.x is an integer - // this.output.x is treated as a literal, so can be either integer or float - // return value will be float - return this.thread.x + (this.output.x * value); - }, { - output: [1], - strictIntegers: true, - }); + const kernel = gpu.createKernel( + function (value) { + // value will be a number + // this.thread.x is an integer + // this.output.x is treated as a literal, so can be either integer or float + // return value will be float + return this.thread.x + this.output.x * value; + }, + { + output: [1], + strictIntegers: true, + } + ); const result = kernel(1); assert.equal(result[0], 1); assert.deepEqual(kernel.argumentTypes, ['Integer']); gpu.destroy(); } -(GPU.isWebGLSupported ? test : skip)('casting offset by this.thread.x and this.output.x webgl', () => { - castingOffsetByThreadXAndOutputX('webgl'); -}); -(GPU.isWebGL2Supported ? test : skip)('casting offset by this.thread.x and this.output.x webgl2', () => { - castingOffsetByThreadXAndOutputX('webgl2'); -}); -(GPU.isHeadlessGLSupported ? test : skip)('casting offset by this.thread.x and this.output.x headlessgl', () => { - castingOffsetByThreadXAndOutputX('headlessgl'); -}); +(GPU.isWebGLSupported ? test : skip)( + 'casting offset by this.thread.x and this.output.x webgl', + () => { + castingOffsetByThreadXAndOutputX('webgl'); + } +); +(GPU.isWebGL2Supported ? test : skip)( + 'casting offset by this.thread.x and this.output.x webgl2', + () => { + castingOffsetByThreadXAndOutputX('webgl2'); + } +); +(GPU.isHeadlessGLSupported ? test : skip)( + 'casting offset by this.thread.x and this.output.x headlessgl', + () => { + castingOffsetByThreadXAndOutputX('headlessgl'); + } +); function handleCastingIntsWithNativeFunctions(mode) { const gpu = new GPU({ mode }); - gpu.addNativeFunction('add', ` + gpu.addNativeFunction( + 'add', + ` int add(int value1, int value2) { return value1 + value2; } - `); - const kernel = gpu.createKernel(function(value1, value2) { - return add(value1, value2); - }, { output: [1] }); + ` + ); + const kernel = gpu.createKernel( + function (value1, value2) { + return add(value1, value2); + }, + { output: [1] } + ); const result = kernel(0.5, 2.5); assert.deepEqual(Array.from(result), [2]); assert.deepEqual(kernel.argumentTypes, ['Float', 'Float']); gpu.destroy(); } -(GPU.isWebGLSupported ? test : skip)('handle casting ints with native functions webgl', () => { - handleCastingIntsWithNativeFunctions('webgl'); -}); -(GPU.isWebGL2Supported ? test : skip)('handle casting ints with native functions webgl2', () => { - handleCastingIntsWithNativeFunctions('webgl2'); -}); -(GPU.isHeadlessGLSupported ? test : skip)('handle casting ints with native functions headlessgl', () => { - handleCastingIntsWithNativeFunctions('headlessgl'); -}); - +(GPU.isWebGLSupported ? test : skip)( + 'handle casting ints with native functions webgl', + () => { + handleCastingIntsWithNativeFunctions('webgl'); + } +); +(GPU.isWebGL2Supported ? test : skip)( + 'handle casting ints with native functions webgl2', + () => { + handleCastingIntsWithNativeFunctions('webgl2'); + } +); +(GPU.isHeadlessGLSupported ? test : skip)( + 'handle casting ints with native functions headlessgl', + () => { + handleCastingIntsWithNativeFunctions('headlessgl'); + } +); function handleCastingFloatsWithNativeFunctions(mode) { const gpu = new GPU({ mode }); - gpu.addNativeFunction('add', ` + gpu.addNativeFunction( + 'add', + ` float add(float value1, float value2) { return value1 + value2; } - `); - const kernel = gpu.createKernel(function(value1, value2) { - return add(value1, value2); - }, { - argumentTypes: ['Integer', 'Integer'], - output: [1], - strictIntegers: true, - }); + ` + ); + const kernel = gpu.createKernel( + function (value1, value2) { + return add(value1, value2); + }, + { + argumentTypes: ['Integer', 'Integer'], + output: [1], + strictIntegers: true, + } + ); const result = kernel(1, 2); assert.deepEqual(Array.from(result), [3]); assert.deepEqual(kernel.argumentTypes, ['Integer', 'Integer']); gpu.destroy(); } -(GPU.isWebGLSupported ? test : skip)('handle casting floats with native functions webgl', () => { - handleCastingFloatsWithNativeFunctions('webgl'); -}); -(GPU.isWebGL2Supported ? test : skip)('handle casting floats with native functions webgl2', () => { - handleCastingFloatsWithNativeFunctions('webgl2'); -}); -(GPU.isHeadlessGLSupported ? test : skip)('handle casting floats with native functions headlessgl', () => { - handleCastingFloatsWithNativeFunctions('headlessgl'); -}); - +(GPU.isWebGLSupported ? test : skip)( + 'handle casting floats with native functions webgl', + () => { + handleCastingFloatsWithNativeFunctions('webgl'); + } +); +(GPU.isWebGL2Supported ? test : skip)( + 'handle casting floats with native functions webgl2', + () => { + handleCastingFloatsWithNativeFunctions('webgl2'); + } +); +(GPU.isHeadlessGLSupported ? test : skip)( + 'handle casting floats with native functions headlessgl', + () => { + handleCastingFloatsWithNativeFunctions('headlessgl'); + } +); function handleCastingMixedWithNativeFunctions(mode) { const gpu = new GPU({ mode }); - gpu.addNativeFunction('add', ` + gpu.addNativeFunction( + 'add', + ` float add(float value1, int value2) { return value1 + float(value2); } - `); - const kernel = gpu.createKernel(function(value1, value2) { - return add(value1, value2); - }, { - output: [1], - strictIntegers: true, - }); + ` + ); + const kernel = gpu.createKernel( + function (value1, value2) { + return add(value1, value2); + }, + { + output: [1], + strictIntegers: true, + } + ); const result = kernel(1, 2.5); assert.deepEqual(Array.from(result), [3]); assert.deepEqual(kernel.argumentTypes, ['Integer', 'Float']); gpu.destroy(); } -(GPU.isWebGLSupported ? test : skip)('handle casting mixed with native functions webgl', () => { - handleCastingMixedWithNativeFunctions('webgl'); -}); -(GPU.isWebGL2Supported ? test : skip)('handle casting mixed with native functions webgl2', () => { - handleCastingMixedWithNativeFunctions('webgl2'); -}); -(GPU.isHeadlessGLSupported ? test : skip)('handle casting mixed with native functions headlessgl', () => { - handleCastingMixedWithNativeFunctions('headlessgl'); -}); +(GPU.isWebGLSupported ? test : skip)( + 'handle casting mixed with native functions webgl', + () => { + handleCastingMixedWithNativeFunctions('webgl'); + } +); +(GPU.isWebGL2Supported ? test : skip)( + 'handle casting mixed with native functions webgl2', + () => { + handleCastingMixedWithNativeFunctions('webgl2'); + } +); +(GPU.isHeadlessGLSupported ? test : skip)( + 'handle casting mixed with native functions headlessgl', + () => { + handleCastingMixedWithNativeFunctions('headlessgl'); + } +); function handleCastingFloat(mode) { const gpu = new GPU({ mode }); + function add(value1, value2) { return value1 + value2; } gpu.addFunction(add, { argumentTypes: ['Float', 'Float'], - returnType: 'Float' - }); - const kernel = gpu.createKernel(function(value1, value2) { - return add(value1, value2); - }, { - output: [1], - argumentTypes: ['Integer', 'Integer'], + returnType: 'Float', }); + const kernel = gpu.createKernel( + function (value1, value2) { + return add(value1, value2); + }, + { + output: [1], + argumentTypes: ['Integer', 'Integer'], + } + ); const result = kernel(1, 2); assert.equal(result[0], 3); gpu.destroy(); @@ -146,13 +205,16 @@ function handleCastingFloat(mode) { handleCastingFloat('webgl2'); }); -(GPU.isHeadlessGLSupported ? test : skip)('handle casting float headlessgl', () => { - handleCastingFloat('headlessgl'); -}); - +(GPU.isHeadlessGLSupported ? test : skip)( + 'handle casting float headlessgl', + () => { + handleCastingFloat('headlessgl'); + } +); function handleCastingBeforeReturn(mode) { const gpu = new GPU({ mode }); + function addOne(v) { return v + v; } @@ -160,21 +222,33 @@ function handleCastingBeforeReturn(mode) { argumentTypes: { v: 'Float' }, returnType: 'Integer', }); - const kernel = gpu.createKernel(function(v) { - return addOne(v); - }, { output: [1] }); + const kernel = gpu.createKernel( + function (v) { + return addOne(v); + }, + { output: [1] } + ); assert.equal(kernel(1)[0], 2); gpu.destroy(); } -(GPU.isWebGLSupported ? test : skip)('handle casting before return webgl', () => { - handleCastingBeforeReturn('webgl'); -}); +(GPU.isWebGLSupported ? test : skip)( + 'handle casting before return webgl', + () => { + handleCastingBeforeReturn('webgl'); + } +); -(GPU.isWebGL2Supported ? test : skip)('handle casting before return webgl2', () => { - handleCastingBeforeReturn('webgl2'); -}); +(GPU.isWebGL2Supported ? test : skip)( + 'handle casting before return webgl2', + () => { + handleCastingBeforeReturn('webgl2'); + } +); -(GPU.isHeadlessGLSupported ? test : skip)('handle casting before return headlessgl', () => { - handleCastingBeforeReturn('headlessgl'); -}); +(GPU.isHeadlessGLSupported ? test : skip)( + 'handle casting before return headlessgl', + () => { + handleCastingBeforeReturn('headlessgl'); + } +); diff --git a/test/internal/constants-texture-switching.js b/test/internal/constants-texture-switching.js index d00951bc..594ab437 100644 --- a/test/internal/constants-texture-switching.js +++ b/test/internal/constants-texture-switching.js @@ -1,25 +1,27 @@ const { assert, skip, test, module: describe, only } = require('qunit'); -const { GPU } = require('../../src'); +const { GPU } = require('../..'); describe('internal: constants texture switching'); function testArray1D2(mode) { const gpu = new GPU({ mode }); - const texture = ( - gpu.createKernel(function() { return [this.thread.x, this.thread.x + 1]; }) - .setOutput([10]) - .setPipeline(true) - .setPrecision('single') - )(); + const texture = gpu + .createKernel(function () { + return [this.thread.x, this.thread.x + 1]; + }) + .setOutput([10]) + .setPipeline(true) + .setPrecision('single')(); const expected = texture.toArray(); - const kernel = gpu.createKernel(function() { - return this.constants.value[this.thread.x]; - }) + const kernel = gpu + .createKernel(function () { + return this.constants.value[this.thread.x]; + }) .setConstants({ - value: texture + value: texture, }) .setConstantTypes({ - value: 'Array1D(2)' + value: 'Array1D(2)', }) .setOutput([10]) .setPipeline(false) @@ -31,43 +33,60 @@ function testArray1D2(mode) { gpu.destroy(); } -(GPU.isSinglePrecisionSupported ? test : skip)('Array1D(2) (GPU only) auto', () => { - testArray1D2(); -}); - -(GPU.isSinglePrecisionSupported ? test : skip)('Array1D(2) (GPU only) gpu', () => { - testArray1D2('gpu'); -}); - -(GPU.isSinglePrecisionSupported && GPU.isWebGLSupported ? test : skip)('Array1D(2) (GPU only) webgl', () => { - testArray1D2('webgl'); -}); - -(GPU.isSinglePrecisionSupported && GPU.isWebGL2Supported ? test : skip)('Array1D(2) (GPU only) webgl2', () => { - testArray1D2('webgl2'); -}); - -(GPU.isSinglePrecisionSupported && GPU.isHeadlessGLSupported ? test : skip)('Array1D(2) (GPU only) headlessgl', () => { - testArray1D2('headlessgl'); -}); +(GPU.isSinglePrecisionSupported ? test : skip)( + 'Array1D(2) (GPU only) auto', + () => { + testArray1D2(); + } +); + +(GPU.isSinglePrecisionSupported ? test : skip)( + 'Array1D(2) (GPU only) gpu', + () => { + testArray1D2('gpu'); + } +); + +(GPU.isSinglePrecisionSupported && GPU.isWebGLSupported ? test : skip)( + 'Array1D(2) (GPU only) webgl', + () => { + testArray1D2('webgl'); + } +); + +(GPU.isSinglePrecisionSupported && GPU.isWebGL2Supported ? test : skip)( + 'Array1D(2) (GPU only) webgl2', + () => { + testArray1D2('webgl2'); + } +); + +(GPU.isSinglePrecisionSupported && GPU.isHeadlessGLSupported ? test : skip)( + 'Array1D(2) (GPU only) headlessgl', + () => { + testArray1D2('headlessgl'); + } +); function testArray1D3(mode) { const gpu = new GPU({ mode }); - const texture = ( - gpu.createKernel(function() { return [this.thread.x, this.thread.x + 1, this.thread.x + 2]; }) - .setOutput([10]) - .setPipeline(true) - .setPrecision('single') - )(); + const texture = gpu + .createKernel(function () { + return [this.thread.x, this.thread.x + 1, this.thread.x + 2]; + }) + .setOutput([10]) + .setPipeline(true) + .setPrecision('single')(); const expected = texture.toArray(); - const kernel = gpu.createKernel(function() { - return this.constants.value[this.thread.x]; - }) + const kernel = gpu + .createKernel(function () { + return this.constants.value[this.thread.x]; + }) .setConstants({ - value: texture + value: texture, }) .setConstantTypes({ - value: 'Array1D(2)' + value: 'Array1D(2)', }) .setOutput([10]) .setPipeline(false) @@ -79,43 +98,65 @@ function testArray1D3(mode) { gpu.destroy(); } -(GPU.isSinglePrecisionSupported ? test : skip)('Array1D(3) (GPU only) auto', () => { - testArray1D3(); -}); - -(GPU.isSinglePrecisionSupported ? test : skip)('Array1D(3) (GPU only) gpu', () => { - testArray1D3('gpu'); -}); - -(GPU.isSinglePrecisionSupported && GPU.isWebGLSupported ? test : skip)('Array1D(3) (GPU only) webgl', () => { - testArray1D3('webgl'); -}); - -(GPU.isSinglePrecisionSupported && GPU.isWebGL2Supported ? test : skip)('Array1D(3) (GPU only) webgl2', () => { - testArray1D3('webgl2'); -}); - -(GPU.isSinglePrecisionSupported && GPU.isHeadlessGLSupported ? test : skip)('Array1D(3) (GPU only) headlessgl', () => { - testArray1D3('headlessgl'); -}); +(GPU.isSinglePrecisionSupported ? test : skip)( + 'Array1D(3) (GPU only) auto', + () => { + testArray1D3(); + } +); + +(GPU.isSinglePrecisionSupported ? test : skip)( + 'Array1D(3) (GPU only) gpu', + () => { + testArray1D3('gpu'); + } +); + +(GPU.isSinglePrecisionSupported && GPU.isWebGLSupported ? test : skip)( + 'Array1D(3) (GPU only) webgl', + () => { + testArray1D3('webgl'); + } +); + +(GPU.isSinglePrecisionSupported && GPU.isWebGL2Supported ? test : skip)( + 'Array1D(3) (GPU only) webgl2', + () => { + testArray1D3('webgl2'); + } +); + +(GPU.isSinglePrecisionSupported && GPU.isHeadlessGLSupported ? test : skip)( + 'Array1D(3) (GPU only) headlessgl', + () => { + testArray1D3('headlessgl'); + } +); function testArray1D4(mode) { const gpu = new GPU({ mode }); - const texture = ( - gpu.createKernel(function() { return [this.thread.x, this.thread.x + 1, this.thread.x + 2, this.thread.x + 3]; }) - .setOutput([10]) - .setPipeline(true) - .setPrecision('single') - )(); + const texture = gpu + .createKernel(function () { + return [ + this.thread.x, + this.thread.x + 1, + this.thread.x + 2, + this.thread.x + 3, + ]; + }) + .setOutput([10]) + .setPipeline(true) + .setPrecision('single')(); const expected = texture.toArray(); - const kernel = gpu.createKernel(function() { - return this.constants.value[this.thread.x]; - }) + const kernel = gpu + .createKernel(function () { + return this.constants.value[this.thread.x]; + }) .setConstants({ - value: texture + value: texture, }) .setConstantTypes({ - value: 'Array1D(2)' + value: 'Array1D(2)', }) .setOutput([10]) .setPipeline(false) @@ -127,43 +168,60 @@ function testArray1D4(mode) { gpu.destroy(); } -(GPU.isSinglePrecisionSupported ? test : skip)('Array1D(4) (GPU only) auto', () => { - testArray1D4(); -}); - -(GPU.isSinglePrecisionSupported ? test : skip)('Array1D(4) (GPU only) gpu', () => { - testArray1D4('gpu'); -}); - -(GPU.isSinglePrecisionSupported && GPU.isWebGLSupported ? test : skip)('Array1D(4) (GPU only) webgl', () => { - testArray1D4('webgl'); -}); - -(GPU.isSinglePrecisionSupported && GPU.isWebGL2Supported ? test : skip)('Array1D(4) (GPU only) webgl2', () => { - testArray1D4('webgl2'); -}); - -(GPU.isSinglePrecisionSupported && GPU.isHeadlessGLSupported ? test : skip)('Array1D(4) (GPU only) headlessgl', () => { - testArray1D4('headlessgl'); -}); +(GPU.isSinglePrecisionSupported ? test : skip)( + 'Array1D(4) (GPU only) auto', + () => { + testArray1D4(); + } +); + +(GPU.isSinglePrecisionSupported ? test : skip)( + 'Array1D(4) (GPU only) gpu', + () => { + testArray1D4('gpu'); + } +); + +(GPU.isSinglePrecisionSupported && GPU.isWebGLSupported ? test : skip)( + 'Array1D(4) (GPU only) webgl', + () => { + testArray1D4('webgl'); + } +); + +(GPU.isSinglePrecisionSupported && GPU.isWebGL2Supported ? test : skip)( + 'Array1D(4) (GPU only) webgl2', + () => { + testArray1D4('webgl2'); + } +); + +(GPU.isSinglePrecisionSupported && GPU.isHeadlessGLSupported ? test : skip)( + 'Array1D(4) (GPU only) headlessgl', + () => { + testArray1D4('headlessgl'); + } +); function testArray2D2(mode) { const gpu = new GPU({ mode }); - const texture = ( - gpu.createKernel(function() { return [this.thread.x, this.thread.y]; }) - .setOutput([10, 10]) - .setPipeline(true) - .setPrecision('single') - )(); + const texture = gpu + .createKernel(function () { + return [this.thread.x, this.thread.y]; + }) + .setOutput([10, 10]) + .setPipeline(true) + .setPrecision('single')(); const expected = texture.toArray(); - const kernel = gpu.createKernel(function() { - return this.constants.value[this.thread.y][this.thread.x]; - }) + const kernel = gpu + .createKernel(function () { + return this.constants.value[this.thread.y][this.thread.x]; + }) .setConstants({ - value: texture + value: texture, }) .setConstantTypes({ - value: 'Array1D(2)' + value: 'Array1D(2)', }) .setOutput([10, 10]) .setPipeline(false) @@ -175,43 +233,60 @@ function testArray2D2(mode) { gpu.destroy(); } -(GPU.isSinglePrecisionSupported ? test : skip)('Array2D(2) (GPU only) auto', () => { - testArray2D2(); -}); - -(GPU.isSinglePrecisionSupported ? test : skip)('Array2D(2) (GPU only) gpu', () => { - testArray2D2('gpu'); -}); - -(GPU.isSinglePrecisionSupported && GPU.isWebGLSupported ? test : skip)('Array2D(2) (GPU only) webgl', () => { - testArray2D2('webgl'); -}); - -(GPU.isSinglePrecisionSupported && GPU.isWebGL2Supported ? test : skip)('Array2D(2) (GPU only) webgl2', () => { - testArray2D2('webgl2'); -}); - -(GPU.isSinglePrecisionSupported && GPU.isHeadlessGLSupported ? test : skip)('Array2D(2) (GPU only) headlessgl', () => { - testArray2D2('headlessgl'); -}); +(GPU.isSinglePrecisionSupported ? test : skip)( + 'Array2D(2) (GPU only) auto', + () => { + testArray2D2(); + } +); + +(GPU.isSinglePrecisionSupported ? test : skip)( + 'Array2D(2) (GPU only) gpu', + () => { + testArray2D2('gpu'); + } +); + +(GPU.isSinglePrecisionSupported && GPU.isWebGLSupported ? test : skip)( + 'Array2D(2) (GPU only) webgl', + () => { + testArray2D2('webgl'); + } +); + +(GPU.isSinglePrecisionSupported && GPU.isWebGL2Supported ? test : skip)( + 'Array2D(2) (GPU only) webgl2', + () => { + testArray2D2('webgl2'); + } +); + +(GPU.isSinglePrecisionSupported && GPU.isHeadlessGLSupported ? test : skip)( + 'Array2D(2) (GPU only) headlessgl', + () => { + testArray2D2('headlessgl'); + } +); function testArray2D3(mode) { const gpu = new GPU({ mode }); - const texture = ( - gpu.createKernel(function() { return [this.thread.x, this.thread.y, this.thread.x * this.thread.y]; }) - .setOutput([10, 10]) - .setPipeline(true) - .setPrecision('single') - )(); + const texture = gpu + .createKernel(function () { + return [this.thread.x, this.thread.y, this.thread.x * this.thread.y]; + }) + .setOutput([10, 10]) + .setPipeline(true) + .setPrecision('single')(); const expected = texture.toArray(); - const kernel = gpu.createKernel(function() { - return this.constants.value[this.thread.y][this.thread.x]; - }) + const kernel = gpu + .createKernel(function () { + return this.constants.value[this.thread.y][this.thread.x]; + }) .setConstants({ - value: texture + value: texture, }) .setConstantTypes({ - value: 'Array1D(2)' + value: 'Array1D(2)', }) .setOutput([10, 10]) .setPipeline(false) @@ -223,50 +298,65 @@ function testArray2D3(mode) { gpu.destroy(); } -(GPU.isSinglePrecisionSupported ? test : skip)('Array2D(3) (GPU only) auto', () => { - testArray2D3(); -}); - -(GPU.isSinglePrecisionSupported ? test : skip)('Array1D(3) (GPU only) gpu', () => { - testArray2D3('gpu'); -}); - -(GPU.isSinglePrecisionSupported && GPU.isWebGLSupported ? test : skip)('Array2D(3) (GPU only) webgl', () => { - testArray2D3('webgl'); -}); - -(GPU.isSinglePrecisionSupported && GPU.isWebGL2Supported ? test : skip)('Array2D(3) (GPU only) webgl2', () => { - testArray2D3('webgl2'); -}); - -(GPU.isSinglePrecisionSupported && GPU.isHeadlessGLSupported ? test : skip)('Array2D(3) (GPU only) headlessgl', () => { - testArray2D3('headlessgl'); -}); +(GPU.isSinglePrecisionSupported ? test : skip)( + 'Array2D(3) (GPU only) auto', + () => { + testArray2D3(); + } +); + +(GPU.isSinglePrecisionSupported ? test : skip)( + 'Array1D(3) (GPU only) gpu', + () => { + testArray2D3('gpu'); + } +); + +(GPU.isSinglePrecisionSupported && GPU.isWebGLSupported ? test : skip)( + 'Array2D(3) (GPU only) webgl', + () => { + testArray2D3('webgl'); + } +); + +(GPU.isSinglePrecisionSupported && GPU.isWebGL2Supported ? test : skip)( + 'Array2D(3) (GPU only) webgl2', + () => { + testArray2D3('webgl2'); + } +); + +(GPU.isSinglePrecisionSupported && GPU.isHeadlessGLSupported ? test : skip)( + 'Array2D(3) (GPU only) headlessgl', + () => { + testArray2D3('headlessgl'); + } +); function testArray2D4(mode) { const gpu = new GPU({ mode }); - const texture = ( - gpu.createKernel(function() { + const texture = gpu + .createKernel(function () { return [ this.thread.x, this.thread.y, this.thread.x * this.thread.y, - this.thread.x / this.thread.y + this.thread.x / this.thread.y, ]; }) - .setOutput([10, 10]) - .setPipeline(true) - .setPrecision('single') - )(); + .setOutput([10, 10]) + .setPipeline(true) + .setPrecision('single')(); const expected = texture.toArray(); - const kernel = gpu.createKernel(function() { - return this.constants.value[this.thread.y][this.thread.x]; - }) + const kernel = gpu + .createKernel(function () { + return this.constants.value[this.thread.y][this.thread.x]; + }) .setConstants({ - value: texture + value: texture, }) .setConstantTypes({ - value: 'Array1D(2)' + value: 'Array1D(2)', }) .setOutput([10, 10]) .setPipeline(false) @@ -278,43 +368,60 @@ function testArray2D4(mode) { gpu.destroy(); } -(GPU.isSinglePrecisionSupported ? test : skip)('Array2D(4) (GPU only) auto', () => { - testArray2D4(); -}); - -(GPU.isSinglePrecisionSupported ? test : skip)('Array1D(4) (GPU only) gpu', () => { - testArray2D4('gpu'); -}); - -(GPU.isSinglePrecisionSupported && GPU.isWebGLSupported ? test : skip)('Array2D(4) (GPU only) webgl', () => { - testArray2D4('webgl'); -}); - -(GPU.isSinglePrecisionSupported && GPU.isWebGL2Supported ? test : skip)('Array2D(4) (GPU only) webgl2', () => { - testArray2D4('webgl2'); -}); - -(GPU.isSinglePrecisionSupported && GPU.isHeadlessGLSupported ? test : skip)('Array2D(4) (GPU only) headlessgl', () => { - testArray2D4('headlessgl'); -}); +(GPU.isSinglePrecisionSupported ? test : skip)( + 'Array2D(4) (GPU only) auto', + () => { + testArray2D4(); + } +); + +(GPU.isSinglePrecisionSupported ? test : skip)( + 'Array1D(4) (GPU only) gpu', + () => { + testArray2D4('gpu'); + } +); + +(GPU.isSinglePrecisionSupported && GPU.isWebGLSupported ? test : skip)( + 'Array2D(4) (GPU only) webgl', + () => { + testArray2D4('webgl'); + } +); + +(GPU.isSinglePrecisionSupported && GPU.isWebGL2Supported ? test : skip)( + 'Array2D(4) (GPU only) webgl2', + () => { + testArray2D4('webgl2'); + } +); + +(GPU.isSinglePrecisionSupported && GPU.isHeadlessGLSupported ? test : skip)( + 'Array2D(4) (GPU only) headlessgl', + () => { + testArray2D4('headlessgl'); + } +); function testArray3D2(mode) { const gpu = new GPU({ mode }); - const texture = ( - gpu.createKernel(function() { return [this.thread.x, this.thread.x * this.thread.y * this.thread.z]; }) - .setOutput([10, 10, 10]) - .setPipeline(true) - .setPrecision('single') - )(); + const texture = gpu + .createKernel(function () { + return [this.thread.x, this.thread.x * this.thread.y * this.thread.z]; + }) + .setOutput([10, 10, 10]) + .setPipeline(true) + .setPrecision('single')(); const expected = texture.toArray(); - const kernel = gpu.createKernel(function() { - return this.constants.value[this.thread.z][this.thread.y][this.thread.x]; - }) + const kernel = gpu + .createKernel(function () { + return this.constants.value[this.thread.z][this.thread.y][this.thread.x]; + }) .setConstants({ - value: texture + value: texture, }) .setConstantTypes({ - value: 'Array1D(2)' + value: 'Array1D(2)', }) .setOutput([10, 10, 10]) .setPipeline(false) @@ -326,43 +433,60 @@ function testArray3D2(mode) { gpu.destroy(); } -(GPU.isSinglePrecisionSupported ? test : skip)('Array3D(2) (GPU only) auto', () => { - testArray3D2(); -}); - -(GPU.isSinglePrecisionSupported ? test : skip)('Array3D(2) (GPU only) gpu', () => { - testArray3D2('gpu'); -}); - -(GPU.isSinglePrecisionSupported && GPU.isWebGLSupported ? test : skip)('Array3D(2) (GPU only) webgl', () => { - testArray3D2('webgl'); -}); - -(GPU.isSinglePrecisionSupported && GPU.isWebGL2Supported ? test : skip)('Array3D(2) (GPU only) webgl2', () => { - testArray3D2('webgl2'); -}); - -(GPU.isSinglePrecisionSupported && GPU.isHeadlessGLSupported ? test : skip)('Array3D(2) (GPU only) headlessgl', () => { - testArray3D2('headlessgl'); -}); +(GPU.isSinglePrecisionSupported ? test : skip)( + 'Array3D(2) (GPU only) auto', + () => { + testArray3D2(); + } +); + +(GPU.isSinglePrecisionSupported ? test : skip)( + 'Array3D(2) (GPU only) gpu', + () => { + testArray3D2('gpu'); + } +); + +(GPU.isSinglePrecisionSupported && GPU.isWebGLSupported ? test : skip)( + 'Array3D(2) (GPU only) webgl', + () => { + testArray3D2('webgl'); + } +); + +(GPU.isSinglePrecisionSupported && GPU.isWebGL2Supported ? test : skip)( + 'Array3D(2) (GPU only) webgl2', + () => { + testArray3D2('webgl2'); + } +); + +(GPU.isSinglePrecisionSupported && GPU.isHeadlessGLSupported ? test : skip)( + 'Array3D(2) (GPU only) headlessgl', + () => { + testArray3D2('headlessgl'); + } +); function testArray3D3(mode) { const gpu = new GPU({ mode }); - const texture = ( - gpu.createKernel(function() { return [this.thread.x, this.thread.y, this.thread.z]; }) - .setOutput([10, 10, 10]) - .setPipeline(true) - .setPrecision('single') - )(); + const texture = gpu + .createKernel(function () { + return [this.thread.x, this.thread.y, this.thread.z]; + }) + .setOutput([10, 10, 10]) + .setPipeline(true) + .setPrecision('single')(); const expected = texture.toArray(); - const kernel = gpu.createKernel(function() { - return this.constants.value[this.thread.z][this.thread.y][this.thread.x]; - }) + const kernel = gpu + .createKernel(function () { + return this.constants.value[this.thread.z][this.thread.y][this.thread.x]; + }) .setConstants({ - value: texture + value: texture, }) .setConstantTypes({ - value: 'Array1D(2)' + value: 'Array1D(2)', }) .setOutput([10, 10, 10]) .setPipeline(false) @@ -374,50 +498,65 @@ function testArray3D3(mode) { gpu.destroy(); } -(GPU.isSinglePrecisionSupported ? test : skip)('Array3D(3) (GPU only) auto', () => { - testArray3D3(); -}); - -(GPU.isSinglePrecisionSupported ? test : skip)('Array3D(3) (GPU only) gpu', () => { - testArray3D3('gpu'); -}); - -(GPU.isSinglePrecisionSupported && GPU.isWebGLSupported ? test : skip)('Array3D(3) (GPU only) webgl', () => { - testArray3D3('webgl'); -}); - -(GPU.isSinglePrecisionSupported && GPU.isWebGL2Supported ? test : skip)('Array3D(3) (GPU only) webgl2', () => { - testArray3D3('webgl2'); -}); - -(GPU.isSinglePrecisionSupported && GPU.isHeadlessGLSupported ? test : skip)('Array3D(3) (GPU only) headlessgl', () => { - testArray3D3('headlessgl'); -}); +(GPU.isSinglePrecisionSupported ? test : skip)( + 'Array3D(3) (GPU only) auto', + () => { + testArray3D3(); + } +); + +(GPU.isSinglePrecisionSupported ? test : skip)( + 'Array3D(3) (GPU only) gpu', + () => { + testArray3D3('gpu'); + } +); + +(GPU.isSinglePrecisionSupported && GPU.isWebGLSupported ? test : skip)( + 'Array3D(3) (GPU only) webgl', + () => { + testArray3D3('webgl'); + } +); + +(GPU.isSinglePrecisionSupported && GPU.isWebGL2Supported ? test : skip)( + 'Array3D(3) (GPU only) webgl2', + () => { + testArray3D3('webgl2'); + } +); + +(GPU.isSinglePrecisionSupported && GPU.isHeadlessGLSupported ? test : skip)( + 'Array3D(3) (GPU only) headlessgl', + () => { + testArray3D3('headlessgl'); + } +); function testArray3D4(mode) { const gpu = new GPU({ mode }); - const texture = ( - gpu.createKernel(function() { + const texture = gpu + .createKernel(function () { return [ this.thread.x, this.thread.y, this.thread.z, - this.thread.x * this.thread.y * this.thread.z + this.thread.x * this.thread.y * this.thread.z, ]; }) - .setOutput([10, 10, 10]) - .setPipeline(true) - .setPrecision('single') - )(); + .setOutput([10, 10, 10]) + .setPipeline(true) + .setPrecision('single')(); const expected = texture.toArray(); - const kernel = gpu.createKernel(function() { - return this.constants.value[this.thread.z][this.thread.y][this.thread.x]; - }) + const kernel = gpu + .createKernel(function () { + return this.constants.value[this.thread.z][this.thread.y][this.thread.x]; + }) .setConstants({ - value: texture + value: texture, }) .setConstantTypes({ - value: 'Array1D(2)' + value: 'Array1D(2)', }) .setOutput([10, 10, 10]) .setPipeline(false) @@ -429,22 +568,37 @@ function testArray3D4(mode) { gpu.destroy(); } -(GPU.isSinglePrecisionSupported ? test : skip)('Array3D(4) (GPU only) auto', () => { - testArray3D4(); -}); - -(GPU.isSinglePrecisionSupported ? test : skip)('Array3D(4) (GPU only) gpu', () => { - testArray3D4('gpu'); -}); - -(GPU.isSinglePrecisionSupported && GPU.isWebGLSupported ? test : skip)('Array3D(4) (GPU only) webgl', () => { - testArray3D4('webgl'); -}); - -(GPU.isSinglePrecisionSupported && GPU.isWebGL2Supported ? test : skip)('Array3D(4) (GPU only) webgl2', () => { - testArray3D4('webgl2'); -}); - -(GPU.isSinglePrecisionSupported && GPU.isHeadlessGLSupported ? test : skip)('Array3D(4) (GPU only) headlessgl', () => { - testArray3D4('headlessgl'); -}); +(GPU.isSinglePrecisionSupported ? test : skip)( + 'Array3D(4) (GPU only) auto', + () => { + testArray3D4(); + } +); + +(GPU.isSinglePrecisionSupported ? test : skip)( + 'Array3D(4) (GPU only) gpu', + () => { + testArray3D4('gpu'); + } +); + +(GPU.isSinglePrecisionSupported && GPU.isWebGLSupported ? test : skip)( + 'Array3D(4) (GPU only) webgl', + () => { + testArray3D4('webgl'); + } +); + +(GPU.isSinglePrecisionSupported && GPU.isWebGL2Supported ? test : skip)( + 'Array3D(4) (GPU only) webgl2', + () => { + testArray3D4('webgl2'); + } +); + +(GPU.isSinglePrecisionSupported && GPU.isHeadlessGLSupported ? test : skip)( + 'Array3D(4) (GPU only) headlessgl', + () => { + testArray3D4('headlessgl'); + } +); diff --git a/test/internal/constructor-features.js b/test/internal/constructor-features.js index be654879..261e714c 100644 --- a/test/internal/constructor-features.js +++ b/test/internal/constructor-features.js @@ -1,13 +1,16 @@ const { assert, test, module: describe, only, skip } = require('qunit'); -const { GPU } = require('../../src'); +const { GPU } = require('../..'); describe('internal: constructor features'); function channelCount(mode) { const gpu = new GPU({ mode }); - const kernel = gpu.createKernel(function() { - return 1; - }, { output: [1] }); + const kernel = gpu.createKernel( + function () { + return 1; + }, + { output: [1] } + ); kernel(); assert.ok(kernel.kernel.constructor.features.channelCount >= 1); gpu.destroy(); diff --git a/test/internal/context-inheritance.js b/test/internal/context-inheritance.js index 01f7ce4e..8ba08831 100644 --- a/test/internal/context-inheritance.js +++ b/test/internal/context-inheritance.js @@ -1,5 +1,5 @@ const { assert, skip, test, module: describe, only } = require('qunit'); -const { GPU, WebGLKernel, WebGL2Kernel, HeadlessGLKernel } = require('../../src'); +const { GPU, WebGLKernel, WebGL2Kernel, HeadlessGLKernel } = require('../..'); describe('internal: context inheritance'); @@ -7,11 +7,14 @@ describe('internal: context inheritance'); const canvas = document.createElement('canvas'); const context = canvas.getContext('webgl'); const gpu = new GPU({ context: context }); - const simpleKernel = gpu.createKernel(function() { + const simpleKernel = gpu.createKernel( + function () { return 1 + 1; - }, { - output: [1] - }); + }, + { + output: [1], + } + ); assert.equal(simpleKernel()[0], 2); assert.equal(gpu.Kernel, WebGLKernel); assert.equal(simpleKernel.context, context); @@ -21,24 +24,30 @@ describe('internal: context inheritance'); const canvas = document.createElement('canvas'); const context = canvas.getContext('webgl2'); const gpu = new GPU({ context: context }); - const simpleKernel = gpu.createKernel(function() { - return 1 + 1; - }, { - output: [1] - }); + const simpleKernel = gpu.createKernel( + function () { + return 1 + 1; + }, + { + output: [1], + } + ); assert.equal(simpleKernel()[0], 2); assert.equal(gpu.Kernel, WebGL2Kernel); assert.equal(simpleKernel.context, context); gpu.destroy(); }); (GPU.isHeadlessGLSupported ? test : skip)('headlessgl', () => { - const context = require('gl')(1,1); + const context = require('gl')(1, 1); const gpu = new GPU({ context: context }); - const simpleKernel = gpu.createKernel(function() { - return 1 + 1; - }, { - output: [1] - }); + const simpleKernel = gpu.createKernel( + function () { + return 1 + 1; + }, + { + output: [1], + } + ); assert.equal(simpleKernel()[0], 2); assert.equal(gpu.Kernel, HeadlessGLKernel); assert.equal(simpleKernel.context, context); diff --git a/test/internal/deep-types.js b/test/internal/deep-types.js index 5fa1cd43..606c9a0e 100644 --- a/test/internal/deep-types.js +++ b/test/internal/deep-types.js @@ -1,25 +1,32 @@ const sinon = require('sinon'); const { assert, test, module: describe, only, skip } = require('qunit'); -const { GPU, FunctionBuilder } = require('../../src'); +const { GPU, FunctionBuilder } = require('../..'); describe('internal: deep types'); function oneLayerDeepFloat(mode) { const gpu = new GPU({ mode }); + function childFunction(childFunctionArgument1) { return childFunctionArgument1 + 1; } gpu.addFunction(childFunction); - const kernel = gpu.createKernel(function(kernelArgument1) { - return childFunction(kernelArgument1); - }, { output: [1] }); + const kernel = gpu.createKernel( + function (kernelArgument1) { + return childFunction(kernelArgument1); + }, + { output: [1] } + ); sinon.spy(FunctionBuilder.prototype, 'lookupReturnType'); try { const result = kernel(1.5); assert.equal(result[0], 2.5); assert.equal(FunctionBuilder.prototype.lookupReturnType.callCount, 1); - assert.equal(FunctionBuilder.prototype.lookupReturnType.args[0][0], 'childFunction'); + assert.equal( + FunctionBuilder.prototype.lookupReturnType.args[0][0], + 'childFunction' + ); } finally { FunctionBuilder.prototype.lookupReturnType.restore(); } @@ -31,32 +38,47 @@ function oneLayerDeepFloat(mode) { (GPU.isWebGL2Supported ? test : skip)('one layer deep float WebGL2', () => { oneLayerDeepFloat('webgl2'); }); -(GPU.isHeadlessGLSupported ? test : skip)('one layer deep float HeadlessGL', () => { - oneLayerDeepFloat('headlessgl'); -}); +(GPU.isHeadlessGLSupported ? test : skip)( + 'one layer deep float HeadlessGL', + () => { + oneLayerDeepFloat('headlessgl'); + } +); function twoLayerDeepFloat(mode) { const gpu = new GPU({ mode }); + function child1Function(child1FunctionArgument1) { return child2Function(child1FunctionArgument1); } + function child2Function(child2FunctionArgument1) { return child2FunctionArgument1 + 1; } - gpu - .addFunction(child1Function) - .addFunction(child2Function); - const kernel = gpu.createKernel(function(kernelArgument1) { - return child1Function(kernelArgument1); - }, { output: [1] }); + gpu.addFunction(child1Function).addFunction(child2Function); + const kernel = gpu.createKernel( + function (kernelArgument1) { + return child1Function(kernelArgument1); + }, + { output: [1] } + ); sinon.spy(FunctionBuilder.prototype, 'lookupReturnType'); try { const result = kernel(1.5); assert.equal(result[0], 2.5); assert.equal(FunctionBuilder.prototype.lookupReturnType.callCount, 3); - assert.equal(FunctionBuilder.prototype.lookupReturnType.args[0][0], 'child1Function'); - assert.equal(FunctionBuilder.prototype.lookupReturnType.args[1][0], 'child2Function'); - assert.equal(FunctionBuilder.prototype.lookupReturnType.args[2][0], 'child2Function'); + assert.equal( + FunctionBuilder.prototype.lookupReturnType.args[0][0], + 'child1Function' + ); + assert.equal( + FunctionBuilder.prototype.lookupReturnType.args[1][0], + 'child2Function' + ); + assert.equal( + FunctionBuilder.prototype.lookupReturnType.args[2][0], + 'child2Function' + ); } finally { FunctionBuilder.prototype.lookupReturnType.restore(); } @@ -68,57 +90,83 @@ function twoLayerDeepFloat(mode) { (GPU.isWebGL2Supported ? test : skip)('two layer deep float WebGL2', () => { twoLayerDeepFloat('webgl2'); }); -(GPU.isHeadlessGLSupported ? test : skip)('two layer deep float HeadlessGL', () => { - twoLayerDeepFloat('headlessgl'); -}); +(GPU.isHeadlessGLSupported ? test : skip)( + 'two layer deep float HeadlessGL', + () => { + twoLayerDeepFloat('headlessgl'); + } +); function twoArgumentLayerDeepFloat(mode) { const gpu = new GPU({ mode }); + function child1Function(child1FunctionArgument1) { return child1FunctionArgument1 + 1; } + function child2Function(child2FunctionArgument1) { return child2FunctionArgument1 + 1; } - gpu - .addFunction(child1Function) - .addFunction(child2Function); - const kernel = gpu.createKernel(function(kernelArgument1) { - return child1Function(child2Function(kernelArgument1)); - }, { output: [1] }); + gpu.addFunction(child1Function).addFunction(child2Function); + const kernel = gpu.createKernel( + function (kernelArgument1) { + return child1Function(child2Function(kernelArgument1)); + }, + { output: [1] } + ); sinon.spy(FunctionBuilder.prototype, 'lookupReturnType'); try { const result = kernel(1.5); assert.equal(kernel.returnType, 'Float'); assert.equal(result[0], 3.5); assert.equal(FunctionBuilder.prototype.lookupReturnType.callCount, 3); - assert.equal(FunctionBuilder.prototype.lookupReturnType.args[0][0], 'child2Function'); - assert.equal(FunctionBuilder.prototype.lookupReturnType.args[1][0], 'child1Function'); - assert.equal(FunctionBuilder.prototype.lookupReturnType.args[2][0], 'child2Function'); + assert.equal( + FunctionBuilder.prototype.lookupReturnType.args[0][0], + 'child2Function' + ); + assert.equal( + FunctionBuilder.prototype.lookupReturnType.args[1][0], + 'child1Function' + ); + assert.equal( + FunctionBuilder.prototype.lookupReturnType.args[2][0], + 'child2Function' + ); } finally { FunctionBuilder.prototype.lookupReturnType.restore(); } } -(GPU.isWebGLSupported ? test : skip)('two argument layer deep float WebGL', () => { - twoArgumentLayerDeepFloat('webgl'); -}); -(GPU.isWebGL2Supported ? test : skip)('two argument layer deep float WebGL2', () => { - twoArgumentLayerDeepFloat('webgl2'); -}); -(GPU.isHeadlessGLSupported ? test : skip)('two argument layer deep float HeadlessGL', () => { - twoArgumentLayerDeepFloat('headlessgl'); -}); - +(GPU.isWebGLSupported ? test : skip)( + 'two argument layer deep float WebGL', + () => { + twoArgumentLayerDeepFloat('webgl'); + } +); +(GPU.isWebGL2Supported ? test : skip)( + 'two argument layer deep float WebGL2', + () => { + twoArgumentLayerDeepFloat('webgl2'); + } +); +(GPU.isHeadlessGLSupported ? test : skip)( + 'two argument layer deep float HeadlessGL', + () => { + twoArgumentLayerDeepFloat('headlessgl'); + } +); function threeLayerDeepFloat(mode) { const gpu = new GPU({ mode }); + function child1Function(child1FunctionArgument1) { return child2Function(child1FunctionArgument1); } + function child2Function(child2FunctionArgument1) { return child3Function(child2FunctionArgument1 + 1); } + function child3Function(child3FunctionArgument1) { return child3FunctionArgument1 + 1; } @@ -126,19 +174,37 @@ function threeLayerDeepFloat(mode) { .addFunction(child1Function) .addFunction(child2Function) .addFunction(child3Function); - const kernel = gpu.createKernel(function(kernelArgument1) { - return child1Function(kernelArgument1); - }, { output: [1] }); + const kernel = gpu.createKernel( + function (kernelArgument1) { + return child1Function(kernelArgument1); + }, + { output: [1] } + ); sinon.spy(FunctionBuilder.prototype, 'lookupReturnType'); try { const result = kernel(1.5); assert.equal(result[0], 3.5); assert.equal(FunctionBuilder.prototype.lookupReturnType.callCount, 5); - assert.equal(FunctionBuilder.prototype.lookupReturnType.args[0][0], 'child1Function'); - assert.equal(FunctionBuilder.prototype.lookupReturnType.args[1][0], 'child2Function'); - assert.equal(FunctionBuilder.prototype.lookupReturnType.args[2][0], 'child3Function'); - assert.equal(FunctionBuilder.prototype.lookupReturnType.args[3][0], 'child2Function'); - assert.equal(FunctionBuilder.prototype.lookupReturnType.args[4][0], 'child3Function'); + assert.equal( + FunctionBuilder.prototype.lookupReturnType.args[0][0], + 'child1Function' + ); + assert.equal( + FunctionBuilder.prototype.lookupReturnType.args[1][0], + 'child2Function' + ); + assert.equal( + FunctionBuilder.prototype.lookupReturnType.args[2][0], + 'child3Function' + ); + assert.equal( + FunctionBuilder.prototype.lookupReturnType.args[3][0], + 'child2Function' + ); + assert.equal( + FunctionBuilder.prototype.lookupReturnType.args[4][0], + 'child3Function' + ); } finally { FunctionBuilder.prototype.lookupReturnType.restore(); } @@ -150,18 +216,24 @@ function threeLayerDeepFloat(mode) { (GPU.isWebGL2Supported ? test : skip)('three layer deep float WebGL2', () => { threeLayerDeepFloat('webgl2'); }); -(GPU.isHeadlessGLSupported ? test : skip)('three layer deep float HeadlessGL', () => { - threeLayerDeepFloat('headlessgl'); -}); +(GPU.isHeadlessGLSupported ? test : skip)( + 'three layer deep float HeadlessGL', + () => { + threeLayerDeepFloat('headlessgl'); + } +); function threeArgumentLayerDeepFloat(mode) { const gpu = new GPU({ mode }); + function child1Function(child1FunctionArgument1) { return child1FunctionArgument1 + 1; } + function child2Function(child2FunctionArgument1) { return child2FunctionArgument1 + 1; } + function child3Function(child3FunctionArgument1) { return child3FunctionArgument1 + 1; } @@ -169,45 +241,78 @@ function threeArgumentLayerDeepFloat(mode) { .addFunction(child1Function) .addFunction(child2Function) .addFunction(child3Function); - const kernel = gpu.createKernel(function(kernelArgument1) { - return child1Function(child2Function(child3Function(kernelArgument1))); - }, { output: [1] }); + const kernel = gpu.createKernel( + function (kernelArgument1) { + return child1Function(child2Function(child3Function(kernelArgument1))); + }, + { output: [1] } + ); sinon.spy(FunctionBuilder.prototype, 'lookupReturnType'); try { const result = kernel(1.5); assert.equal(result[0], 4.5); assert.equal(FunctionBuilder.prototype.lookupReturnType.callCount, 5); - assert.equal(FunctionBuilder.prototype.lookupReturnType.args[0][0], 'child3Function'); - assert.equal(FunctionBuilder.prototype.lookupReturnType.args[1][0], 'child2Function'); - assert.equal(FunctionBuilder.prototype.lookupReturnType.args[2][0], 'child1Function'); - assert.equal(FunctionBuilder.prototype.lookupReturnType.args[3][0], 'child2Function'); - assert.equal(FunctionBuilder.prototype.lookupReturnType.args[4][0], 'child3Function'); + assert.equal( + FunctionBuilder.prototype.lookupReturnType.args[0][0], + 'child3Function' + ); + assert.equal( + FunctionBuilder.prototype.lookupReturnType.args[1][0], + 'child2Function' + ); + assert.equal( + FunctionBuilder.prototype.lookupReturnType.args[2][0], + 'child1Function' + ); + assert.equal( + FunctionBuilder.prototype.lookupReturnType.args[3][0], + 'child2Function' + ); + assert.equal( + FunctionBuilder.prototype.lookupReturnType.args[4][0], + 'child3Function' + ); } finally { FunctionBuilder.prototype.lookupReturnType.restore(); } } -(GPU.isWebGLSupported ? test : skip)('three argument layer deep float WebGL', () => { - threeArgumentLayerDeepFloat('webgl'); -}); -(GPU.isWebGL2Supported ? test : skip)('three argument layer deep float WebGL2', () => { - threeArgumentLayerDeepFloat('webgl2'); -}); -(GPU.isHeadlessGLSupported ? test : skip)('three argument layer deep float HeadlessGL', () => { - threeArgumentLayerDeepFloat('headlessgl'); -}); +(GPU.isWebGLSupported ? test : skip)( + 'three argument layer deep float WebGL', + () => { + threeArgumentLayerDeepFloat('webgl'); + } +); +(GPU.isWebGL2Supported ? test : skip)( + 'three argument layer deep float WebGL2', + () => { + threeArgumentLayerDeepFloat('webgl2'); + } +); +(GPU.isHeadlessGLSupported ? test : skip)( + 'three argument layer deep float HeadlessGL', + () => { + threeArgumentLayerDeepFloat('headlessgl'); + } +); function threeArgumentLayerDeepNumberTexture1(mode) { const gpu = new GPU({ mode }); - const texture = gpu.createKernel(function() { - return 1.5; - }, { output: [1], pipeline: true, precision: 'single' })(); + const texture = gpu.createKernel( + function () { + return 1.5; + }, + { output: [1], pipeline: true, precision: 'single' } + )(); + function child1Function(child1FunctionArgument1) { return child1FunctionArgument1 + 1; } + function child2Function(child2FunctionArgument1) { return child2FunctionArgument1 + 1; } + function child3Function(child3FunctionArgument1) { return child3FunctionArgument1[this.thread.x] + 1; } @@ -215,44 +320,74 @@ function threeArgumentLayerDeepNumberTexture1(mode) { .addFunction(child1Function) .addFunction(child2Function) .addFunction(child3Function); - const kernel = gpu.createKernel(function(kernelArgument1) { - return child1Function(child2Function(child3Function(kernelArgument1))); - }, { output: [1] }); + const kernel = gpu.createKernel( + function (kernelArgument1) { + return child1Function(child2Function(child3Function(kernelArgument1))); + }, + { output: [1] } + ); sinon.spy(FunctionBuilder.prototype, 'lookupReturnType'); try { const result = kernel(texture); assert.equal(result[0], 4.5); assert.equal(FunctionBuilder.prototype.lookupReturnType.callCount, 5); - assert.equal(FunctionBuilder.prototype.lookupReturnType.args[0][0], 'child3Function'); - assert.equal(FunctionBuilder.prototype.lookupReturnType.args[1][0], 'child2Function'); - assert.equal(FunctionBuilder.prototype.lookupReturnType.args[2][0], 'child1Function'); - assert.equal(FunctionBuilder.prototype.lookupReturnType.args[3][0], 'child2Function'); - assert.equal(FunctionBuilder.prototype.lookupReturnType.args[4][0], 'child3Function'); + assert.equal( + FunctionBuilder.prototype.lookupReturnType.args[0][0], + 'child3Function' + ); + assert.equal( + FunctionBuilder.prototype.lookupReturnType.args[1][0], + 'child2Function' + ); + assert.equal( + FunctionBuilder.prototype.lookupReturnType.args[2][0], + 'child1Function' + ); + assert.equal( + FunctionBuilder.prototype.lookupReturnType.args[3][0], + 'child2Function' + ); + assert.equal( + FunctionBuilder.prototype.lookupReturnType.args[4][0], + 'child3Function' + ); } finally { FunctionBuilder.prototype.lookupReturnType.restore(); } } -(GPU.isSinglePrecisionSupported && GPU.isWebGLSupported ? test : skip)('three argument layer deep NumberTexture(1) WebGL', () => { - threeArgumentLayerDeepNumberTexture1('webgl'); -}); -(GPU.isSinglePrecisionSupported && GPU.isWebGL2Supported ? test : skip)('three argument layer deep NumberTexture(1) WebGL2', () => { - threeArgumentLayerDeepNumberTexture1('webgl2'); -}); -(GPU.isSinglePrecisionSupported && GPU.isHeadlessGLSupported ? test : skip)('three argument layer deep NumberTexture(1) HeadlessGL', () => { - threeArgumentLayerDeepNumberTexture1('headlessgl'); -}); +(GPU.isSinglePrecisionSupported && GPU.isWebGLSupported ? test : skip)( + 'three argument layer deep NumberTexture(1) WebGL', + () => { + threeArgumentLayerDeepNumberTexture1('webgl'); + } +); +(GPU.isSinglePrecisionSupported && GPU.isWebGL2Supported ? test : skip)( + 'three argument layer deep NumberTexture(1) WebGL2', + () => { + threeArgumentLayerDeepNumberTexture1('webgl2'); + } +); +(GPU.isSinglePrecisionSupported && GPU.isHeadlessGLSupported ? test : skip)( + 'three argument layer deep NumberTexture(1) HeadlessGL', + () => { + threeArgumentLayerDeepNumberTexture1('headlessgl'); + } +); function circlicalLogic(mode) { const gpu = new GPU({ mode }); + function child1Function(child1FunctionArgument1) { return child1Function(child1FunctionArgument1); } - gpu - .addFunction(child1Function); - const kernel = gpu.createKernel(function(kernelArgument1) { - return child1Function(kernelArgument1); - }, { output: [1] }); + gpu.addFunction(child1Function); + const kernel = gpu.createKernel( + function (kernelArgument1) { + return child1Function(kernelArgument1); + }, + { output: [1] } + ); assert.throws(() => { kernel(1.5); }); @@ -270,199 +405,274 @@ function circlicalLogic(mode) { function arrayTexture1(mode) { const gpu = new GPU({ mode }); + function addOne(functionValue) { return functionValue[this.thread.x] + 1; } gpu.addFunction(addOne); - const texture1 = gpu.createKernel(function() { - return 1; - }, { - output: [1], - precision: 'single', - pipeline: true, - })(); + const texture1 = gpu.createKernel( + function () { + return 1; + }, + { + output: [1], + precision: 'single', + pipeline: true, + } + )(); if (mode !== 'cpu') { assert.equal(texture1.type, 'ArrayTexture(1)'); } - const kernel = gpu.createKernel(function(kernelValue) { - return addOne(kernelValue); - }, { output: [1] }); + const kernel = gpu.createKernel( + function (kernelValue) { + return addOne(kernelValue); + }, + { output: [1] } + ); const result = kernel(texture1); assert.equal(result[0], 2); gpu.destroy(); } -(GPU.isSinglePrecisionSupported ? test : skip)('ArrayTexture(1) auto', ()=> { +(GPU.isSinglePrecisionSupported ? test : skip)('ArrayTexture(1) auto', () => { arrayTexture1(); }); -(GPU.isSinglePrecisionSupported ? test : skip)('ArrayTexture(1) gpu', ()=> { +(GPU.isSinglePrecisionSupported ? test : skip)('ArrayTexture(1) gpu', () => { arrayTexture1('gpu'); }); -(GPU.isSinglePrecisionSupported && GPU.isWebGLSupported ? test : skip)('ArrayTexture(1) webgl', ()=> { - arrayTexture1('webgl'); -}); -(GPU.isSinglePrecisionSupported && GPU.isWebGL2Supported ? test : skip)('ArrayTexture(1) webgl2', ()=> { - arrayTexture1('webgl2'); -}); -(GPU.isSinglePrecisionSupported && GPU.isHeadlessGLSupported ? test : skip)('ArrayTexture(1) headlessgl', ()=> { - arrayTexture1('headlessgl'); -}); -(GPU.isSinglePrecisionSupported ? test : skip)('ArrayTexture(1) cpu', ()=> { +(GPU.isSinglePrecisionSupported && GPU.isWebGLSupported ? test : skip)( + 'ArrayTexture(1) webgl', + () => { + arrayTexture1('webgl'); + } +); +(GPU.isSinglePrecisionSupported && GPU.isWebGL2Supported ? test : skip)( + 'ArrayTexture(1) webgl2', + () => { + arrayTexture1('webgl2'); + } +); +(GPU.isSinglePrecisionSupported && GPU.isHeadlessGLSupported ? test : skip)( + 'ArrayTexture(1) headlessgl', + () => { + arrayTexture1('headlessgl'); + } +); +(GPU.isSinglePrecisionSupported ? test : skip)('ArrayTexture(1) cpu', () => { arrayTexture1('cpu'); }); function arrayTexture2(mode) { const gpu = new GPU({ mode }); + function addOne(functionValue) { const declaredValue = functionValue[this.thread.x]; return declaredValue[0] + 1 + declaredValue[1] + 1; } gpu.addFunction(addOne); - const texture1 = gpu.createKernel(function() { - return [1,2]; - }, { - output: [1], - precision: 'single', - pipeline: true, - })(); + const texture1 = gpu.createKernel( + function () { + return [1, 2]; + }, + { + output: [1], + precision: 'single', + pipeline: true, + } + )(); if (mode !== 'cpu') { assert.equal(texture1.type, 'ArrayTexture(2)'); } - const kernel = gpu.createKernel(function(kernelValue) { - return addOne(kernelValue); - }, { output: [1] }); + const kernel = gpu.createKernel( + function (kernelValue) { + return addOne(kernelValue); + }, + { output: [1] } + ); const result = kernel(texture1); assert.equal(result[0], 5); gpu.destroy(); } -(GPU.isSinglePrecisionSupported ? test : skip)('ArrayTexture(2) auto', ()=> { +(GPU.isSinglePrecisionSupported ? test : skip)('ArrayTexture(2) auto', () => { arrayTexture2(); }); -(GPU.isSinglePrecisionSupported ? test : skip)('ArrayTexture(2) gpu', ()=> { +(GPU.isSinglePrecisionSupported ? test : skip)('ArrayTexture(2) gpu', () => { arrayTexture2('gpu'); }); -(GPU.isSinglePrecisionSupported && GPU.isWebGLSupported ? test : skip)('ArrayTexture(2) webgl', ()=> { - arrayTexture2('webgl'); -}); -(GPU.isSinglePrecisionSupported && GPU.isWebGL2Supported ? test : skip)('ArrayTexture(2) webgl2', ()=> { - arrayTexture2('webgl2'); -}); -(GPU.isSinglePrecisionSupported && GPU.isHeadlessGLSupported ? test : skip)('ArrayTexture(2) headlessgl', ()=> { - arrayTexture2('headlessgl'); -}); -(GPU.isSinglePrecisionSupported ? test : skip)('ArrayTexture(2) cpu', ()=> { +(GPU.isSinglePrecisionSupported && GPU.isWebGLSupported ? test : skip)( + 'ArrayTexture(2) webgl', + () => { + arrayTexture2('webgl'); + } +); +(GPU.isSinglePrecisionSupported && GPU.isWebGL2Supported ? test : skip)( + 'ArrayTexture(2) webgl2', + () => { + arrayTexture2('webgl2'); + } +); +(GPU.isSinglePrecisionSupported && GPU.isHeadlessGLSupported ? test : skip)( + 'ArrayTexture(2) headlessgl', + () => { + arrayTexture2('headlessgl'); + } +); +(GPU.isSinglePrecisionSupported ? test : skip)('ArrayTexture(2) cpu', () => { arrayTexture2('cpu'); }); function arrayTexture3(mode) { const gpu = new GPU({ mode }); + function addOne(functionValue) { const declaredValue = functionValue[this.thread.x]; - return declaredValue[0] + 1 - + declaredValue[1] + 1 - + declaredValue[2] + 1; + return declaredValue[0] + 1 + declaredValue[1] + 1 + declaredValue[2] + 1; } gpu.addFunction(addOne); - const texture1 = gpu.createKernel(function() { - return [1,2,3]; - }, { - output: [1], - precision: 'single', - pipeline: true, - })(); + const texture1 = gpu.createKernel( + function () { + return [1, 2, 3]; + }, + { + output: [1], + precision: 'single', + pipeline: true, + } + )(); if (mode !== 'cpu') { assert.equal(texture1.type, 'ArrayTexture(3)'); } - const kernel = gpu.createKernel(function(kernelValue) { - return addOne(kernelValue); - }, { output: [1] }); + const kernel = gpu.createKernel( + function (kernelValue) { + return addOne(kernelValue); + }, + { output: [1] } + ); const result = kernel(texture1); assert.equal(result[0], 9); gpu.destroy(); } -(GPU.isSinglePrecisionSupported ? test : skip)('ArrayTexture(3) auto', ()=> { +(GPU.isSinglePrecisionSupported ? test : skip)('ArrayTexture(3) auto', () => { arrayTexture3(); }); -(GPU.isSinglePrecisionSupported ? test : skip)('ArrayTexture(3) gpu', ()=> { +(GPU.isSinglePrecisionSupported ? test : skip)('ArrayTexture(3) gpu', () => { arrayTexture3('gpu'); }); -(GPU.isSinglePrecisionSupported && GPU.isWebGLSupported ? test : skip)('ArrayTexture(3) webgl', ()=> { - arrayTexture3('webgl'); -}); -(GPU.isSinglePrecisionSupported && GPU.isWebGL2Supported ? test : skip)('ArrayTexture(3) webgl2', ()=> { - arrayTexture3('webgl2'); -}); -(GPU.isSinglePrecisionSupported && GPU.isHeadlessGLSupported ? test : skip)('ArrayTexture(3) headlessgl', ()=> { - arrayTexture3('headlessgl'); -}); -(GPU.isSinglePrecisionSupported ? test : skip)('ArrayTexture(3) cpu', ()=> { +(GPU.isSinglePrecisionSupported && GPU.isWebGLSupported ? test : skip)( + 'ArrayTexture(3) webgl', + () => { + arrayTexture3('webgl'); + } +); +(GPU.isSinglePrecisionSupported && GPU.isWebGL2Supported ? test : skip)( + 'ArrayTexture(3) webgl2', + () => { + arrayTexture3('webgl2'); + } +); +(GPU.isSinglePrecisionSupported && GPU.isHeadlessGLSupported ? test : skip)( + 'ArrayTexture(3) headlessgl', + () => { + arrayTexture3('headlessgl'); + } +); +(GPU.isSinglePrecisionSupported ? test : skip)('ArrayTexture(3) cpu', () => { arrayTexture3('cpu'); }); function arrayTexture4(mode) { const gpu = new GPU({ mode }); + function addOne(functionValue) { const declaredValue = functionValue[this.thread.x]; - return declaredValue[0] + 1 - + declaredValue[1] + 1 - + declaredValue[2] + 1 - + declaredValue[3] + 1; + return ( + declaredValue[0] + + 1 + + declaredValue[1] + + 1 + + declaredValue[2] + + 1 + + declaredValue[3] + + 1 + ); } gpu.addFunction(addOne); - const texture1 = gpu.createKernel(function() { - return [1,2,3,4]; - }, { - output: [1], - precision: 'single', - pipeline: true, - })(); + const texture1 = gpu.createKernel( + function () { + return [1, 2, 3, 4]; + }, + { + output: [1], + precision: 'single', + pipeline: true, + } + )(); if (mode !== 'cpu') { assert.equal(texture1.type, 'ArrayTexture(4)'); } - const kernel = gpu.createKernel(function(kernelValue) { - return addOne(kernelValue); - }, { output: [1] }); + const kernel = gpu.createKernel( + function (kernelValue) { + return addOne(kernelValue); + }, + { output: [1] } + ); const result = kernel(texture1); assert.equal(result[0], 14); gpu.destroy(); } -(GPU.isSinglePrecisionSupported ? test : skip)('ArrayTexture(4) auto', ()=> { +(GPU.isSinglePrecisionSupported ? test : skip)('ArrayTexture(4) auto', () => { arrayTexture4(); }); -(GPU.isSinglePrecisionSupported ? test : skip)('ArrayTexture(4) gpu', ()=> { +(GPU.isSinglePrecisionSupported ? test : skip)('ArrayTexture(4) gpu', () => { arrayTexture4('gpu'); }); -(GPU.isSinglePrecisionSupported && GPU.isWebGLSupported ? test : skip)('ArrayTexture(4) webgl', ()=> { - arrayTexture4('webgl'); -}); -(GPU.isSinglePrecisionSupported && GPU.isWebGL2Supported ? test : skip)('ArrayTexture(4) webgl2', ()=> { - arrayTexture4('webgl2'); -}); -(GPU.isSinglePrecisionSupported && GPU.isHeadlessGLSupported ? test : skip)('ArrayTexture(4) headlessgl', ()=> { - arrayTexture4('headlessgl'); -}); -(GPU.isSinglePrecisionSupported ? test : skip)('ArrayTexture(4) cpu', ()=> { +(GPU.isSinglePrecisionSupported && GPU.isWebGLSupported ? test : skip)( + 'ArrayTexture(4) webgl', + () => { + arrayTexture4('webgl'); + } +); +(GPU.isSinglePrecisionSupported && GPU.isWebGL2Supported ? test : skip)( + 'ArrayTexture(4) webgl2', + () => { + arrayTexture4('webgl2'); + } +); +(GPU.isSinglePrecisionSupported && GPU.isHeadlessGLSupported ? test : skip)( + 'ArrayTexture(4) headlessgl', + () => { + arrayTexture4('headlessgl'); + } +); +(GPU.isSinglePrecisionSupported ? test : skip)('ArrayTexture(4) cpu', () => { arrayTexture4('cpu'); }); function testTortureTest(mode) { const gpu = new GPU({ mode }); + function addFloatArray(addFloatArrayArgument1, addFloatArrayArgument2) { return addFloatArrayArgument1 + addFloatArrayArgument2[this.thread.x]; } + function addArrayFloat(addArrayFloatArgument1, addArrayFloatArgument2) { return addArrayFloatArgument1[this.thread.x] + addArrayFloatArgument2; } + function addArrayArray(addArrayArrayArgument1, addArrayArrayArgument2) { - return addArrayArrayArgument1[this.thread.x] + addArrayArrayArgument2[this.thread.x]; + return ( + addArrayArrayArgument1[this.thread.x] + + addArrayArrayArgument2[this.thread.x] + ); } + function addFloatFloat(addFloatFloatArgument1, addFloatFloatArgument2) { return addFloatFloatArgument1 + addFloatFloatArgument2; } @@ -472,33 +682,89 @@ function testTortureTest(mode) { .addFunction(addArrayArray) .addFunction(addFloatFloat); - const texture = gpu.createKernel(function() { return 2; }, { output: [1], precision: 'single' })(); + const texture = gpu.createKernel( + function () { + return 2; + }, + { output: [1], precision: 'single' } + )(); // sinon.spy(FunctionBuilder.prototype, 'lookupArgumentType'); sinon.spy(FunctionBuilder.prototype, 'lookupReturnType'); try { - const kernel = gpu.createKernel(function (v1, v2, v3, v4, v5) { - return addFloatFloat(v4, addArrayFloat(v3, addFloatArray(addArrayArray(v1, v5), v2))); - }, {output: [1]}); + const kernel = gpu.createKernel( + function (v1, v2, v3, v4, v5) { + return addFloatFloat( + v4, + addArrayFloat(v3, addFloatArray(addArrayArray(v1, v5), v2)) + ); + }, + { output: [1] } + ); const result = kernel([1], texture, [3], 4, new Float32Array([5])); assert.equal(result[0], 1 + 2 + 3 + 4 + 5); assert.equal(FunctionBuilder.prototype.lookupReturnType.callCount, 7); - assert.equal(FunctionBuilder.prototype.lookupReturnType.returnValues.length, 7); - assert.equal(FunctionBuilder.prototype.lookupReturnType.args[0][0], 'addArrayArray'); - assert.equal(FunctionBuilder.prototype.lookupReturnType.returnValues[0], 'Number'); - assert.equal(FunctionBuilder.prototype.lookupReturnType.args[1][0], 'addFloatArray'); - assert.equal(FunctionBuilder.prototype.lookupReturnType.returnValues[1], 'Number'); - assert.equal(FunctionBuilder.prototype.lookupReturnType.args[2][0], 'addArrayFloat'); - assert.equal(FunctionBuilder.prototype.lookupReturnType.returnValues[2], 'Number'); - assert.equal(FunctionBuilder.prototype.lookupReturnType.args[3][0], 'addFloatFloat'); - assert.equal(FunctionBuilder.prototype.lookupReturnType.returnValues[3], 'Float'); - assert.equal(FunctionBuilder.prototype.lookupReturnType.args[4][0], 'addArrayFloat'); - assert.equal(FunctionBuilder.prototype.lookupReturnType.returnValues[4], 'Number'); - assert.equal(FunctionBuilder.prototype.lookupReturnType.args[5][0], 'addFloatArray'); - assert.equal(FunctionBuilder.prototype.lookupReturnType.returnValues[5], 'Number'); - assert.equal(FunctionBuilder.prototype.lookupReturnType.args[6][0], 'addArrayArray'); - assert.equal(FunctionBuilder.prototype.lookupReturnType.returnValues[6], 'Number'); + assert.equal( + FunctionBuilder.prototype.lookupReturnType.returnValues.length, + 7 + ); + assert.equal( + FunctionBuilder.prototype.lookupReturnType.args[0][0], + 'addArrayArray' + ); + assert.equal( + FunctionBuilder.prototype.lookupReturnType.returnValues[0], + 'Number' + ); + assert.equal( + FunctionBuilder.prototype.lookupReturnType.args[1][0], + 'addFloatArray' + ); + assert.equal( + FunctionBuilder.prototype.lookupReturnType.returnValues[1], + 'Number' + ); + assert.equal( + FunctionBuilder.prototype.lookupReturnType.args[2][0], + 'addArrayFloat' + ); + assert.equal( + FunctionBuilder.prototype.lookupReturnType.returnValues[2], + 'Number' + ); + assert.equal( + FunctionBuilder.prototype.lookupReturnType.args[3][0], + 'addFloatFloat' + ); + assert.equal( + FunctionBuilder.prototype.lookupReturnType.returnValues[3], + 'Float' + ); + assert.equal( + FunctionBuilder.prototype.lookupReturnType.args[4][0], + 'addArrayFloat' + ); + assert.equal( + FunctionBuilder.prototype.lookupReturnType.returnValues[4], + 'Number' + ); + assert.equal( + FunctionBuilder.prototype.lookupReturnType.args[5][0], + 'addFloatArray' + ); + assert.equal( + FunctionBuilder.prototype.lookupReturnType.returnValues[5], + 'Number' + ); + assert.equal( + FunctionBuilder.prototype.lookupReturnType.args[6][0], + 'addArrayArray' + ); + assert.equal( + FunctionBuilder.prototype.lookupReturnType.returnValues[6], + 'Number' + ); } finally { FunctionBuilder.prototype.lookupReturnType.restore(); } @@ -512,17 +778,26 @@ function testTortureTest(mode) { testTortureTest('gpu'); }); -(GPU.isSinglePrecisionSupported && GPU.isWebGLSupported ? test : skip)('torture test webgl', () => { - testTortureTest('webgl'); -}); +(GPU.isSinglePrecisionSupported && GPU.isWebGLSupported ? test : skip)( + 'torture test webgl', + () => { + testTortureTest('webgl'); + } +); -(GPU.isSinglePrecisionSupported && GPU.isWebGL2Supported ? test : skip)('torture test webgl2', () => { - testTortureTest('webgl2'); -}); +(GPU.isSinglePrecisionSupported && GPU.isWebGL2Supported ? test : skip)( + 'torture test webgl2', + () => { + testTortureTest('webgl2'); + } +); -(GPU.isSinglePrecisionSupported && GPU.isHeadlessGLSupported ? test : skip)('torture test headlessgl', () => { - testTortureTest('headlessgl'); -}); +(GPU.isSinglePrecisionSupported && GPU.isHeadlessGLSupported ? test : skip)( + 'torture test headlessgl', + () => { + testTortureTest('headlessgl'); + } +); test('torture test cpu', () => { testTortureTest('cpu'); @@ -530,19 +805,25 @@ test('torture test cpu', () => { function testKernelMap(mode) { const gpu = new GPU({ mode }); + function calc1(v1, v2) { return v2[this.thread.x] - v1; } + function calc2(v1, v2) { return v1 * v2; } - const kernelMap = gpu.createKernelMap({ - calc1, - calc2, - }, function (outputs, targets) { - const output = outputs[this.thread.x]; - return calc2(calc1(output, targets), output); - }, { output: [1], pipeline: true }); + const kernelMap = gpu.createKernelMap( + { + calc1, + calc2, + }, + function (outputs, targets) { + const output = outputs[this.thread.x]; + return calc2(calc1(output, targets), output); + }, + { output: [1], pipeline: true } + ); try { const result = kernelMap([1], [3]); assert.equal(result.calc1.toArray()[0], 2); @@ -553,7 +834,6 @@ function testKernelMap(mode) { } } - (GPU.isWebGLSupported ? test : skip)('kernel map webgl', () => { testKernelMap('webgl'); }); diff --git a/test/internal/deprecated.js b/test/internal/deprecated.js index f5c2848b..db0e193f 100644 --- a/test/internal/deprecated.js +++ b/test/internal/deprecated.js @@ -1,11 +1,11 @@ const { assert, test, module: describe, only, skip } = require('qunit'); -const { GPU, Kernel } = require('../../src'); +const { GPU, Kernel } = require('../..'); describe('internal: deprecated'); test('GPU.createKernel settings floatOutput true', () => { const gpu = new GPU(); - const kernel = gpu.createKernel(function() {}, { floatOutput: true }); + const kernel = gpu.createKernel(function () {}, { floatOutput: true }); assert.equal(kernel.precision, 'single'); assert.notOk(kernel.kernel.hasOwnProperty('floatOutput')); gpu.destroy(); @@ -13,7 +13,7 @@ test('GPU.createKernel settings floatOutput true', () => { test('GPU.createKernel settings floatOutput false', () => { const gpu = new GPU(); - const kernel = gpu.createKernel(function() {}, { floatOutput: false }); + const kernel = gpu.createKernel(function () {}, { floatOutput: false }); assert.equal(kernel.precision, 'unsigned'); assert.notOk(kernel.kernel.hasOwnProperty('floatOutput')); gpu.destroy(); @@ -21,7 +21,7 @@ test('GPU.createKernel settings floatOutput false', () => { test('GPU.createKernel settings outputToTexture true', () => { const gpu = new GPU(); - const kernel = gpu.createKernel(function() {}, { outputToTexture: true }); + const kernel = gpu.createKernel(function () {}, { outputToTexture: true }); assert.equal(kernel.pipeline, true); assert.notOk(kernel.kernel.hasOwnProperty('outputToTexture')); gpu.destroy(); @@ -29,7 +29,7 @@ test('GPU.createKernel settings outputToTexture true', () => { test('GPU.createKernel settings outputToTexture false', () => { const gpu = new GPU(); - const kernel = gpu.createKernel(function() {}, { outputToTexture: false }); + const kernel = gpu.createKernel(function () {}, { outputToTexture: false }); assert.equal(kernel.pipeline, false); assert.notOk(kernel.kernel.hasOwnProperty('outputToTexture')); gpu.destroy(); @@ -37,7 +37,7 @@ test('GPU.createKernel settings outputToTexture false', () => { test('GPU.createKernel settings outputImmutable true', () => { const gpu = new GPU(); - const kernel = gpu.createKernel(function() {}, { outputImmutable: true }); + const kernel = gpu.createKernel(function () {}, { outputImmutable: true }); assert.equal(kernel.immutable, true); assert.notOk(kernel.kernel.hasOwnProperty('outputImmutable')); gpu.destroy(); @@ -45,7 +45,7 @@ test('GPU.createKernel settings outputImmutable true', () => { test('GPU.createKernel settings outputImmutable false', () => { const gpu = new GPU(); - const kernel = gpu.createKernel(function() {}, { outputImmutable: false }); + const kernel = gpu.createKernel(function () {}, { outputImmutable: false }); assert.equal(kernel.immutable, false); assert.notOk(kernel.kernel.hasOwnProperty('outputImmutable')); gpu.destroy(); @@ -53,7 +53,7 @@ test('GPU.createKernel settings outputImmutable false', () => { test('GPU.createKernel settings floatTextures true', () => { const gpu = new GPU(); - const kernel = gpu.createKernel(function() {}, { floatTextures: true }); + const kernel = gpu.createKernel(function () {}, { floatTextures: true }); assert.equal(kernel.optimizeFloatMemory, true); assert.notOk(kernel.kernel.hasOwnProperty('floatTextures')); gpu.destroy(); @@ -61,7 +61,7 @@ test('GPU.createKernel settings floatTextures true', () => { test('GPU.createKernel settings floatTextures false', () => { const gpu = new GPU(); - const kernel = gpu.createKernel(function() {}, { floatTextures: false }); + const kernel = gpu.createKernel(function () {}, { floatTextures: false }); assert.equal(kernel.optimizeFloatMemory, false); assert.notOk(kernel.kernel.hasOwnProperty('floatTextures')); gpu.destroy(); @@ -73,7 +73,7 @@ test('Kernel.getCanvas', () => { kernel.initContext = () => {}; kernel.initPlugins = () => {}; kernel.mergeSettings({ - canvas + canvas, }); assert.equal(kernel.getCanvas(), canvas); }); @@ -86,7 +86,7 @@ test('Kernel.getWebGl', () => { kernel.initPlugins = () => {}; kernel.mergeSettings({ canvas, - context + context, }); assert.equal(kernel.getWebGl(), context); }); diff --git a/test/internal/different-texture-cloning.js b/test/internal/different-texture-cloning.js index e45d5eee..18acb7c6 100644 --- a/test/internal/different-texture-cloning.js +++ b/test/internal/different-texture-cloning.js @@ -1,26 +1,32 @@ const { assert, test, module: describe, only, skip } = require('qunit'); -const { GPU } = require('../../src'); +const { GPU } = require('../..'); describe('internal: different texture cloning'); function testArrayThenArray1D4(mode) { const gpu = new GPU({ mode }); + function createTextureOf(value, type) { - return (gpu.createKernel(function(value) { - return value[this.thread.x]; - }, { - output: [1], - pipeline: true, - argumentTypes: { value: type } - }))(value); + return gpu.createKernel( + function (value) { + return value[this.thread.x]; + }, + { + output: [1], + pipeline: true, + argumentTypes: { value: type }, + } + )(value); } const arrayTexture = createTextureOf([1], 'Array'); const arrayTextureClone = arrayTexture.clone(); - const array4Texture = createTextureOf([[1,2,3,4]], 'Array1D(4)'); + const array4Texture = createTextureOf([[1, 2, 3, 4]], 'Array1D(4)'); const array4TextureClone = array4Texture.clone(); assert.notEqual(arrayTextureClone, array4TextureClone); assert.deepEqual(arrayTextureClone.toArray(), new Float32Array([1])); - assert.deepEqual(array4TextureClone.toArray(), [new Float32Array([1,2,3,4])]); + assert.deepEqual(array4TextureClone.toArray(), [ + new Float32Array([1, 2, 3, 4]), + ]); gpu.destroy(); } @@ -36,27 +42,36 @@ test('Array then Array1D(4) auto', () => { testArrayThenArray1D4('webgl2'); }); -(GPU.isHeadlessGLSupported ? test : skip)('Array then Array1D(4) headlessgl', () => { - testArrayThenArray1D4('headlessgl'); -}); +(GPU.isHeadlessGLSupported ? test : skip)( + 'Array then Array1D(4) headlessgl', + () => { + testArrayThenArray1D4('headlessgl'); + } +); function testArray1D4ThenArray(mode) { const gpu = new GPU({ mode }); + function createTextureOf(value, type) { - return (gpu.createKernel(function(value) { - return value[this.thread.x]; - }, { - output: [1], - pipeline: true, - argumentTypes: { value: type } - }))(value); + return gpu.createKernel( + function (value) { + return value[this.thread.x]; + }, + { + output: [1], + pipeline: true, + argumentTypes: { value: type }, + } + )(value); } - const array4Texture = createTextureOf([[1,2,3,4]], 'Array1D(4)'); + const array4Texture = createTextureOf([[1, 2, 3, 4]], 'Array1D(4)'); const array4TextureClone = array4Texture.clone(); const arrayTexture = createTextureOf([1], 'Array'); const arrayTextureClone = arrayTexture.clone(); assert.notEqual(array4TextureClone, arrayTextureClone); - assert.deepEqual(array4TextureClone.toArray(), [new Float32Array([1,2,3,4])]); + assert.deepEqual(array4TextureClone.toArray(), [ + new Float32Array([1, 2, 3, 4]), + ]); assert.deepEqual(arrayTextureClone.toArray(), new Float32Array([1])); gpu.destroy(); } @@ -73,6 +88,9 @@ test('Array1D(4) then Array auto', () => { testArray1D4ThenArray('webgl2'); }); -(GPU.isHeadlessGLSupported ? test : skip)('Array1D(4) then Array headlessgl', () => { - testArray1D4ThenArray('headlessgl'); -}); +(GPU.isHeadlessGLSupported ? test : skip)( + 'Array1D(4) then Array headlessgl', + () => { + testArray1D4ThenArray('headlessgl'); + } +); diff --git a/test/internal/function-builder.js b/test/internal/function-builder.js index 7755507a..cb97d3e6 100644 --- a/test/internal/function-builder.js +++ b/test/internal/function-builder.js @@ -1,5 +1,10 @@ const { assert, test, module: describe, only } = require('qunit'); -const { FunctionBuilder, CPUFunctionNode, WebGL2FunctionNode, WebGLFunctionNode } = require('../../src'); +const { + FunctionBuilder, + CPUFunctionNode, + WebGL2FunctionNode, + WebGLFunctionNode, +} = require('../..'); describe('internal: function builder'); @@ -23,20 +28,20 @@ function threeLayerTemplate(FunctionNode) { new FunctionNode(layerOne.toString(), { output: [1], lookupReturnType: () => 'Number', - lookupFunctionArgumentTypes: () => {} + lookupFunctionArgumentTypes: () => {}, }), new FunctionNode(layerTwo.toString(), { output: [1], lookupReturnType: () => 'Number', - lookupFunctionArgumentTypes: () => {} + lookupFunctionArgumentTypes: () => {}, }), new FunctionNode(layerThree.toString(), { output: [1], lookupReturnType: () => 'Number', - lookupFunctionArgumentTypes: () => {} + lookupFunctionArgumentTypes: () => {}, }), ], - output: [1] + output: [1], }); } @@ -44,22 +49,43 @@ function threeLayerTemplate(FunctionNode) { test('traceFunctionCalls: 3 layer test cpu', () => { const builder = threeLayerTemplate(CPUFunctionNode); assert.deepEqual(builder.traceFunctionCalls('layerOne'), ['layerOne']); - assert.deepEqual(builder.traceFunctionCalls('layerTwo'), ['layerTwo', 'layerOne']); - assert.deepEqual(builder.traceFunctionCalls('layerThree'), ['layerThree', 'layerTwo', 'layerOne']); + assert.deepEqual(builder.traceFunctionCalls('layerTwo'), [ + 'layerTwo', + 'layerOne', + ]); + assert.deepEqual(builder.traceFunctionCalls('layerThree'), [ + 'layerThree', + 'layerTwo', + 'layerOne', + ]); }); test('traceFunctionCalls: 3 layer test webgl', () => { const builder = threeLayerTemplate(WebGLFunctionNode); assert.deepEqual(builder.traceFunctionCalls('layerOne'), ['layerOne']); - assert.deepEqual(builder.traceFunctionCalls('layerTwo'), ['layerTwo', 'layerOne']); - assert.deepEqual(builder.traceFunctionCalls('layerThree'), ['layerThree', 'layerTwo', 'layerOne']); + assert.deepEqual(builder.traceFunctionCalls('layerTwo'), [ + 'layerTwo', + 'layerOne', + ]); + assert.deepEqual(builder.traceFunctionCalls('layerThree'), [ + 'layerThree', + 'layerTwo', + 'layerOne', + ]); }); test('traceFunctionCalls: 3 layer test webgl2', () => { const builder = threeLayerTemplate(WebGL2FunctionNode); assert.deepEqual(builder.traceFunctionCalls('layerOne'), ['layerOne']); - assert.deepEqual(builder.traceFunctionCalls('layerTwo'), ['layerTwo', 'layerOne']); - assert.deepEqual(builder.traceFunctionCalls('layerThree'), ['layerThree', 'layerTwo', 'layerOne']); + assert.deepEqual(builder.traceFunctionCalls('layerTwo'), [ + 'layerTwo', + 'layerOne', + ]); + assert.deepEqual(builder.traceFunctionCalls('layerThree'), [ + 'layerThree', + 'layerTwo', + 'layerOne', + ]); }); /// Test the function tracing of 3 layers @@ -75,26 +101,23 @@ test('webglString: 3 layer test cpu', () => { ); assert.equal( - builder.getStringFromFunctionNames(['layerOne','layerTwo']), + builder.getStringFromFunctionNames(['layerOne', 'layerTwo']), 'function layerOne() {\nreturn 42;\n}\nfunction layerTwo() {\nreturn (layerOne()*2);\n}' ); assert.equal( builder.getString('layerTwo'), - builder.getStringFromFunctionNames(['layerOne','layerTwo']) + builder.getStringFromFunctionNames(['layerOne', 'layerTwo']) ); assert.equal( - builder.getStringFromFunctionNames(['layerOne','layerTwo','layerThree']), + builder.getStringFromFunctionNames(['layerOne', 'layerTwo', 'layerThree']), 'function layerOne() {\nreturn 42;\n}\nfunction layerTwo() {\nreturn (layerOne()*2);\n}\nfunction layerThree() {\nreturn (layerTwo()*2);\n}' ); assert.equal( builder.getString('layerThree'), - builder.getStringFromFunctionNames(['layerOne','layerTwo','layerThree']) - ); - assert.equal( - builder.getString(null), - builder.getString('layerThree') + builder.getStringFromFunctionNames(['layerOne', 'layerTwo', 'layerThree']) ); + assert.equal(builder.getString(null), builder.getString('layerThree')); }); test('webglString: 3 layer test webgl', () => { @@ -109,26 +132,23 @@ test('webglString: 3 layer test webgl', () => { ); assert.equal( - builder.getStringFromFunctionNames(['layerOne','layerTwo']), + builder.getStringFromFunctionNames(['layerOne', 'layerTwo']), 'float layerOne() {\nreturn 42.0;\n}\nfloat layerTwo() {\nreturn (layerOne()*2.0);\n}' ); assert.equal( builder.getString('layerTwo'), - builder.getStringFromFunctionNames(['layerOne','layerTwo']) + builder.getStringFromFunctionNames(['layerOne', 'layerTwo']) ); assert.equal( - builder.getStringFromFunctionNames(['layerOne','layerTwo','layerThree']), + builder.getStringFromFunctionNames(['layerOne', 'layerTwo', 'layerThree']), 'float layerOne() {\nreturn 42.0;\n}\nfloat layerTwo() {\nreturn (layerOne()*2.0);\n}\nfloat layerThree() {\nreturn (layerTwo()*2.0);\n}' ); assert.equal( builder.getString('layerThree'), - builder.getStringFromFunctionNames(['layerOne','layerTwo','layerThree']) - ); - assert.equal( - builder.getString(null), - builder.getString('layerThree') + builder.getStringFromFunctionNames(['layerOne', 'layerTwo', 'layerThree']) ); + assert.equal(builder.getString(null), builder.getString('layerThree')); }); test('webglString: 3 layer test webgl2', () => { @@ -145,24 +165,21 @@ test('webglString: 3 layer test webgl2', () => { ); assert.equal( - builder.getStringFromFunctionNames(['layerOne','layerTwo']), + builder.getStringFromFunctionNames(['layerOne', 'layerTwo']), 'float layerOne() {\nreturn 42.0;\n}\nfloat layerTwo() {\nreturn (layerOne()*2.0);\n}' ); assert.equal( builder.getString('layerTwo'), - builder.getStringFromFunctionNames(['layerOne','layerTwo']) + builder.getStringFromFunctionNames(['layerOne', 'layerTwo']) ); assert.equal( - builder.getStringFromFunctionNames(['layerOne','layerTwo','layerThree']), + builder.getStringFromFunctionNames(['layerOne', 'layerTwo', 'layerThree']), 'float layerOne() {\nreturn 42.0;\n}\nfloat layerTwo() {\nreturn (layerOne()*2.0);\n}\nfloat layerThree() {\nreturn (layerTwo()*2.0);\n}' ); assert.equal( builder.getString('layerThree'), - builder.getStringFromFunctionNames(['layerOne','layerTwo','layerThree']) - ); - assert.equal( - builder.getString(null), - builder.getString('layerThree') + builder.getStringFromFunctionNames(['layerOne', 'layerTwo', 'layerThree']) ); + assert.equal(builder.getString(null), builder.getString('layerThree')); }); diff --git a/test/internal/function-composition.js b/test/internal/function-composition.js index a65cc81d..f658f365 100644 --- a/test/internal/function-composition.js +++ b/test/internal/function-composition.js @@ -1,53 +1,82 @@ const { assert, test, skip, module: describe, only } = require('qunit'); const sinon = require('sinon'); -const { CPUFunctionNode, FunctionBuilder, GPU, WebGL2FunctionNode, WebGLFunctionNode } = require('../../src'); +const { + CPUFunctionNode, + FunctionBuilder, + GPU, + WebGL2FunctionNode, + WebGLFunctionNode, +} = require('../..'); describe('internal: function composition return values'); function functionCompositionReturnValuesTest(mode) { const gpu = new GPU({ mode }); - return gpu.createKernel(function(oneToFour, fourToOne) { - function add(left, right) { - return left[this.thread.x] + right[this.thread.x]; - } - return add(oneToFour, fourToOne); - }, { output: [4] })([1,2,3,4], [4,3,2,1]); + return gpu.createKernel( + function (oneToFour, fourToOne) { + function add(left, right) { + return left[this.thread.x] + right[this.thread.x]; + } + return add(oneToFour, fourToOne); + }, + { output: [4] } + )([1, 2, 3, 4], [4, 3, 2, 1]); } test('auto', () => { - assert.deepEqual(Array.from(functionCompositionReturnValuesTest()), [5,5,5,5]); + assert.deepEqual( + Array.from(functionCompositionReturnValuesTest()), + [5, 5, 5, 5] + ); }); test('gpu', () => { - assert.deepEqual(Array.from(functionCompositionReturnValuesTest('gpu')), [5,5,5,5]); + assert.deepEqual( + Array.from(functionCompositionReturnValuesTest('gpu')), + [5, 5, 5, 5] + ); }); (GPU.isWebGLSupported ? test : skip)('webgl', () => { - assert.deepEqual(Array.from(functionCompositionReturnValuesTest('webgl')), [5,5,5,5]); + assert.deepEqual( + Array.from(functionCompositionReturnValuesTest('webgl')), + [5, 5, 5, 5] + ); }); (GPU.isWebGL2Supported ? test : skip)('webgl2', () => { - assert.deepEqual(Array.from(functionCompositionReturnValuesTest('webgl2')), [5,5,5,5]); + assert.deepEqual( + Array.from(functionCompositionReturnValuesTest('webgl2')), + [5, 5, 5, 5] + ); }); (GPU.isHeadlessGLSupported ? test : skip)('headlessgl', () => { - assert.deepEqual(Array.from(functionCompositionReturnValuesTest('headlessgl')), [5,5,5,5]); + assert.deepEqual( + Array.from(functionCompositionReturnValuesTest('headlessgl')), + [5, 5, 5, 5] + ); }); test('cpu', () => { - assert.deepEqual(Array.from(functionCompositionReturnValuesTest('cpu')), [5,5,5,5]); + assert.deepEqual( + Array.from(functionCompositionReturnValuesTest('cpu')), + [5, 5, 5, 5] + ); }); - describe('internal: function composition FunctionNode'); function functionCompositionFunctionNode(FunctionNode) { const output = [1]; - const node = new FunctionNode(`function kernel() { + const node = new FunctionNode( + `function kernel() { function inner() { return 1; } return inner(); - }`, { - output, - onNestedFunction: sinon.spy(), - lookupReturnType: () => 'Number', - lookupFunctionArgumentTypes: () => {} - }); + }`, + { + output, + onNestedFunction: sinon.spy(), + lookupReturnType: () => 'Number', + lookupFunctionArgumentTypes: () => {}, + } + ); const string = node.toString(); assert.equal(node.onNestedFunction.callCount, 1); @@ -55,112 +84,136 @@ function functionCompositionFunctionNode(FunctionNode) { } test('CPUFunctionNode', () => { - assert.equal(functionCompositionFunctionNode(CPUFunctionNode), 'function kernel() {' - + '\n' - + '\nreturn inner();' - + '\n}'); + assert.equal( + functionCompositionFunctionNode(CPUFunctionNode), + 'function kernel() {' + '\n' + '\nreturn inner();' + '\n}' + ); }); test('WebGLFunctionNode', () => { - assert.equal(functionCompositionFunctionNode(WebGLFunctionNode), 'float kernel() {' - + '\n' - + '\nreturn inner();' - + '\n}'); + assert.equal( + functionCompositionFunctionNode(WebGLFunctionNode), + 'float kernel() {' + '\n' + '\nreturn inner();' + '\n}' + ); }); test('WebGL2FunctionNode', () => { - assert.equal(functionCompositionFunctionNode(WebGL2FunctionNode), 'float kernel() {' - + '\n' - + '\nreturn inner();' - + '\n}'); + assert.equal( + functionCompositionFunctionNode(WebGL2FunctionNode), + 'float kernel() {' + '\n' + '\nreturn inner();' + '\n}' + ); }); describe('internal: number function composition FunctionBuilder'); function numberFunctionCompositionFunctionBuilder(FunctionNode) { const output = [1]; - const builder = FunctionBuilder.fromKernel({ - source: `function kernel() { + const builder = FunctionBuilder.fromKernel( + { + source: `function kernel() { function inner() { return 1; } return inner(); }`, - argumentTypes: [], - argumentNames: [], - kernelArguments: [], - kernelConstants: [], - output, - leadingReturnStatement: 'resultX[x] = ' - }, FunctionNode); + argumentTypes: [], + argumentNames: [], + kernelArguments: [], + kernelConstants: [], + output, + leadingReturnStatement: 'resultX[x] = ', + }, + FunctionNode + ); return builder.getPrototypeString('kernel'); } test('CPUFunctionNode', () => { - assert.equal(numberFunctionCompositionFunctionBuilder(CPUFunctionNode), 'function inner() {' - + '\nreturn 1;' - + '\n}' - + '\nresultX[x] = inner();\ncontinue;'); + assert.equal( + numberFunctionCompositionFunctionBuilder(CPUFunctionNode), + 'function inner() {' + + '\nreturn 1;' + + '\n}' + + '\nresultX[x] = inner();\ncontinue;' + ); }); test('WebGLFunctionNode', () => { - assert.equal(numberFunctionCompositionFunctionBuilder(WebGLFunctionNode), 'float inner() {' - + '\nreturn 1.0;' - + '\n}' - + '\nvoid kernel() {' - + '\n' - + '\nkernelResult = inner();return;' - + '\n}'); + assert.equal( + numberFunctionCompositionFunctionBuilder(WebGLFunctionNode), + 'float inner() {' + + '\nreturn 1.0;' + + '\n}' + + '\nvoid kernel() {' + + '\n' + + '\nkernelResult = inner();return;' + + '\n}' + ); }); test('WebGL2FunctionNode', () => { - assert.equal(numberFunctionCompositionFunctionBuilder(WebGL2FunctionNode), 'float inner() {' - + '\nreturn 1.0;' - + '\n}' - + '\nvoid kernel() {' - + '\n' - + '\nkernelResult = inner();return;' - + '\n}'); + assert.equal( + numberFunctionCompositionFunctionBuilder(WebGL2FunctionNode), + 'float inner() {' + + '\nreturn 1.0;' + + '\n}' + + '\nvoid kernel() {' + + '\n' + + '\nkernelResult = inner();return;' + + '\n}' + ); }); describe('internal: Array(2) function composition FunctionBuilder'); function array2FunctionCompositionFunctionBuilder(FunctionNode) { const output = [1]; - const builder = FunctionBuilder.fromKernel({ - source: `function kernel() { + const builder = FunctionBuilder.fromKernel( + { + source: `function kernel() { function inner() { return [1,2,3,4]; } return inner()[0]; }`, - argumentTypes: [], - argumentNames: [], - kernelArguments: [], - kernelConstants: [], - output, - leadingReturnStatement: 'resultX[x] = ' - }, FunctionNode); + argumentTypes: [], + argumentNames: [], + kernelArguments: [], + kernelConstants: [], + output, + leadingReturnStatement: 'resultX[x] = ', + }, + FunctionNode + ); return builder.getPrototypeString('kernel'); } test('CPUFunctionNode', () => { - assert.equal(array2FunctionCompositionFunctionBuilder(CPUFunctionNode), 'function inner() {' - + '\nreturn new Float32Array([1, 2, 3, 4]);' - + '\n}' - + '\nresultX[x] = inner()[0];\ncontinue;'); + assert.equal( + array2FunctionCompositionFunctionBuilder(CPUFunctionNode), + 'function inner() {' + + '\nreturn new Float32Array([1, 2, 3, 4]);' + + '\n}' + + '\nresultX[x] = inner()[0];\ncontinue;' + ); }); test('WebGLFunctionNode', () => { - assert.equal(array2FunctionCompositionFunctionBuilder(WebGLFunctionNode), 'vec4 inner() {' - + '\nreturn vec4(1.0, 2.0, 3.0, 4.0);' - + '\n}' - + '\nvoid kernel() {' - + '\n' - + '\nkernelResult = inner()[0];return;' - + '\n}'); + assert.equal( + array2FunctionCompositionFunctionBuilder(WebGLFunctionNode), + 'vec4 inner() {' + + '\nreturn vec4(1.0, 2.0, 3.0, 4.0);' + + '\n}' + + '\nvoid kernel() {' + + '\n' + + '\nkernelResult = inner()[0];return;' + + '\n}' + ); }); test('WebGL2FunctionNode', () => { - assert.equal(array2FunctionCompositionFunctionBuilder(WebGL2FunctionNode), 'vec4 inner() {' - + '\nreturn vec4(1.0, 2.0, 3.0, 4.0);' - + '\n}' - + '\nvoid kernel() {' - + '\n' - + '\nkernelResult = inner()[0];return;' - + '\n}'); + assert.equal( + array2FunctionCompositionFunctionBuilder(WebGL2FunctionNode), + 'vec4 inner() {' + + '\nreturn vec4(1.0, 2.0, 3.0, 4.0);' + + '\n}' + + '\nvoid kernel() {' + + '\n' + + '\nkernelResult = inner()[0];return;' + + '\n}' + ); }); diff --git a/test/internal/function-node.js b/test/internal/function-node.js index fba0fc39..8280dc58 100644 --- a/test/internal/function-node.js +++ b/test/internal/function-node.js @@ -1,5 +1,9 @@ const { assert, test, module: describe, only } = require('qunit'); -const { CPUFunctionNode, WebGLFunctionNode, WebGL2FunctionNode } = require('../../src'); +const { + CPUFunctionNode, + WebGLFunctionNode, + WebGL2FunctionNode, +} = require('../..'); describe('internal: function node'); @@ -7,18 +11,17 @@ describe('internal: function node'); test('hello_world: just return magic 42 cpu', () => { // Create a function hello node const node = new CPUFunctionNode( - (function() { + function () { return 42; - }).toString(), { name: 'hello_world', output: [1] } + }.toString(), + { name: 'hello_world', output: [1] } ); assert.notEqual(node.getJsAST(), null, 'AST fetch check'); assert.equal( node.toString(), - 'function hello_world() {' - + '\nreturn 42;' - + '\n}', + 'function hello_world() {' + '\nreturn 42;' + '\n}', 'function conversion check' ); }); @@ -26,18 +29,17 @@ test('hello_world: just return magic 42 cpu', () => { test('hello_world: just return magic 42 webgl', () => { // Create a function hello node const node = new WebGLFunctionNode( - (function() { + function () { return 42; - }).toString(), { name: 'hello_world', output: [1] } + }.toString(), + { name: 'hello_world', output: [1] } ); assert.notEqual(node.getJsAST(), null, 'AST fetch check'); assert.equal( node.toString(), - 'float hello_world() {' - + '\nreturn 42.0;' - + '\n}', + 'float hello_world() {' + '\nreturn 42.0;' + '\n}', 'function conversion check' ); }); @@ -45,18 +47,17 @@ test('hello_world: just return magic 42 webgl', () => { test('hello_world: just return magic 42 webgl2', () => { // Create a function hello node const node = new WebGL2FunctionNode( - (function() { + function () { return 42; - }).toString(), { name: 'hello_world', output: [1] } + }.toString(), + { name: 'hello_world', output: [1] } ); assert.notEqual(node.getJsAST(), null, 'AST fetch check'); assert.equal( node.toString(), - 'float hello_world() {' - + '\nreturn 42.0;' - + '\n}', + 'float hello_world() {' + '\nreturn 42.0;' + '\n}', 'function conversion check' ); }); @@ -69,14 +70,14 @@ test('hello_inner: call a function inside a function cpu', () => { // Create a function hello node const node = new CPUFunctionNode( - (function() { + function () { return inner(); - }).toString(), + }.toString(), { name: 'hello_inner', output: [1], lookupReturnType: () => 'Number', - lookupFunctionArgumentTypes: () => {} + lookupFunctionArgumentTypes: () => {}, } ); @@ -84,13 +85,11 @@ test('hello_inner: call a function inside a function cpu', () => { assert.equal( node.toString(), - 'function hello_inner() {' - + '\nreturn inner();' - + '\n}', + 'function hello_inner() {' + '\nreturn inner();' + '\n}', 'function conversion check' ); - assert.deepEqual(node.calledFunctions, ['inner'] ); + assert.deepEqual(node.calledFunctions, ['inner']); }); test('hello_inner: call a function inside a function webgl', () => { @@ -100,13 +99,14 @@ test('hello_inner: call a function inside a function webgl', () => { // Create a function hello node const node = new WebGLFunctionNode( - (function() { + function () { return inner(); - }).toString(), { + }.toString(), + { name: 'hello_inner', output: [1], lookupReturnType: () => 'Number', - lookupFunctionArgumentTypes: () => {} + lookupFunctionArgumentTypes: () => {}, } ); @@ -114,13 +114,11 @@ test('hello_inner: call a function inside a function webgl', () => { assert.equal( node.toString(), - 'float hello_inner() {' - + '\nreturn inner();' - + '\n}', + 'float hello_inner() {' + '\nreturn inner();' + '\n}', 'function conversion check' ); - assert.deepEqual(node.calledFunctions, ['inner'] ); + assert.deepEqual(node.calledFunctions, ['inner']); }); /// Test creation of function, that calls another function @@ -131,13 +129,14 @@ test('hello_inner: call a function inside a function webgl2', () => { // Create a function hello node const node = new WebGL2FunctionNode( - (function() { + function () { return inner(); - }).toString(), { + }.toString(), + { name: 'hello_inner', output: [1], lookupReturnType: () => 'Number', - lookupFunctionArgumentTypes: () => {} + lookupFunctionArgumentTypes: () => {}, } ); @@ -145,22 +144,20 @@ test('hello_inner: call a function inside a function webgl2', () => { assert.equal( node.toString(), - 'float hello_inner() {' - + '\nreturn inner();' - + '\n}', + 'float hello_inner() {' + '\nreturn inner();' + '\n}', 'function conversion check' ); - assert.deepEqual(node.calledFunctions, ['inner'] ); + assert.deepEqual(node.calledFunctions, ['inner']); }); /// Test creation of function, that calls another function, with ARGS test('Math.round implementation: A function with arguments cpu', () => { // Math.round node const node = new CPUFunctionNode( - (function(a) { + function (a) { return Math.floor(a + 0.5); - }).toString(), + }.toString(), { name: 'foo', output: [1], @@ -174,9 +171,7 @@ test('Math.round implementation: A function with arguments cpu', () => { assert.equal( node.toString(), - 'function foo(user_a) {' - + '\nreturn Math.floor((user_a+0.5));' - + '\n}', + 'function foo(user_a) {' + '\nreturn Math.floor((user_a+0.5));' + '\n}', 'function conversion check' ); @@ -186,12 +181,13 @@ test('Math.round implementation: A function with arguments cpu', () => { test('Math.round implementation: A function with arguments webgl', () => { // Math.round node const node = new WebGLFunctionNode( - (function(a) { + function (a) { return Math.floor(a + 0.5); - }).toString(), { + }.toString(), + { name: 'foo', output: [1], - argumentTypes: ['Number'] + argumentTypes: ['Number'], } ); @@ -199,24 +195,23 @@ test('Math.round implementation: A function with arguments webgl', () => { assert.equal( node.toString(), - 'float foo(float user_a) {' - + '\nreturn floor((user_a+0.5));' - + '\n}', + 'float foo(float user_a) {' + '\nreturn floor((user_a+0.5));' + '\n}', 'function conversion check' ); - assert.deepEqual(node.calledFunctions, ['floor'] ); + assert.deepEqual(node.calledFunctions, ['floor']); }); test('Math.round implementation: A function with arguments webgl2', () => { // Math.round node const node = new WebGL2FunctionNode( - (function(a) { + function (a) { return Math.floor(a + 0.5); - }).toString(), { + }.toString(), + { name: 'foo', output: [1], - argumentTypes: ['Number'] + argumentTypes: ['Number'], } ); @@ -224,24 +219,23 @@ test('Math.round implementation: A function with arguments webgl2', () => { assert.equal( node.toString(), - 'float foo(float user_a) {' - + '\nreturn floor((user_a+0.5));' - + '\n}', + 'float foo(float user_a) {' + '\nreturn floor((user_a+0.5));' + '\n}', 'function conversion check' ); - assert.deepEqual(node.calledFunctions, ['floor'] ); + assert.deepEqual(node.calledFunctions, ['floor']); }); /// Test creation of function, that calls another function, with ARGS -test('Two arguments test webgl', function(assert){ +test('Two arguments test webgl', function (assert) { const node = new WebGLFunctionNode( - (function(a,b) { - return a+b; - }).toString(), { + function (a, b) { + return a + b; + }.toString(), + { name: 'add_together', output: [1], - argumentTypes: ['Number', 'Number'] + argumentTypes: ['Number', 'Number'], } ); @@ -249,21 +243,22 @@ test('Two arguments test webgl', function(assert){ assert.equal( node.toString(), - 'float add_together(float user_a, float user_b) {' - + '\nreturn (user_a+user_b);' - + '\n}', + 'float add_together(float user_a, float user_b) {' + + '\nreturn (user_a+user_b);' + + '\n}', 'function conversion check' ); }); -test('Two arguments test webgl2', function(assert){ +test('Two arguments test webgl2', function (assert) { const node = new WebGL2FunctionNode( - (function(a,b) { - return a+b; - }).toString(), { + function (a, b) { + return a + b; + }.toString(), + { name: 'add_together', output: [1], - argumentTypes: ['Number', 'Number'] + argumentTypes: ['Number', 'Number'], } ); @@ -271,9 +266,9 @@ test('Two arguments test webgl2', function(assert){ assert.equal( node.toString(), - 'float add_together(float user_a, float user_b) {' - + '\nreturn (user_a+user_b);' - + '\n}', + 'float add_together(float user_a, float user_b) {' + + '\nreturn (user_a+user_b);' + + '\n}', 'function conversion check' ); }); diff --git a/test/internal/function-return-type-detection.js b/test/internal/function-return-type-detection.js index f8bd462a..292dbc14 100644 --- a/test/internal/function-return-type-detection.js +++ b/test/internal/function-return-type-detection.js @@ -1,18 +1,22 @@ const { assert, test, skip, module: describe, only } = require('qunit'); -const { GPU } = require('../../src'); +const { GPU } = require('../..'); describe('internal: Function return type detection'); function canDetectNumberFromAddedFunction(mode) { const gpu = new GPU({ mode }); + function number() { return 1; } gpu.addFunction(number); - const kernel = gpu.createKernel(function() { - const values = number(); - return values + values; - }, { output: [1] }); + const kernel = gpu.createKernel( + function () { + const values = number(); + return values + values; + }, + { output: [1] } + ); const result = kernel(); assert.equal(result[0], 2); @@ -36,9 +40,12 @@ test('can detect Number gpu', () => { canDetectNumberFromAddedFunction('webgl2'); }); -(GPU.isHeadlessGLSupported ? test : skip)('can detect Number headlessgl', () => { - canDetectNumberFromAddedFunction('headlessgl'); -}); +(GPU.isHeadlessGLSupported ? test : skip)( + 'can detect Number headlessgl', + () => { + canDetectNumberFromAddedFunction('headlessgl'); + } +); test('can detect Number cpu', () => { canDetectNumberFromAddedFunction('cpu'); @@ -46,14 +53,18 @@ test('can detect Number cpu', () => { function canDetectArray2FromAddedFunction(mode) { const gpu = new GPU({ mode }); + function array2() { return [1, 2]; } gpu.addFunction(array2); - const kernel = gpu.createKernel(function() { - const values = array2(); - return values[0] + values[1]; - }, { output: [1] }); + const kernel = gpu.createKernel( + function () { + const values = array2(); + return values[0] + values[1]; + }, + { output: [1] } + ); const result = kernel(); assert.equal(result[0], 3); @@ -77,25 +88,31 @@ test('can detect Array(2) gpu', () => { canDetectArray2FromAddedFunction('webgl2'); }); -(GPU.isHeadlessGLSupported ? test : skip)('can detect Array(2) headlessgl', () => { - canDetectArray2FromAddedFunction('headlessgl'); -}); +(GPU.isHeadlessGLSupported ? test : skip)( + 'can detect Array(2) headlessgl', + () => { + canDetectArray2FromAddedFunction('headlessgl'); + } +); test('can detect Array(2) cpu', () => { canDetectArray2FromAddedFunction('cpu'); }); - function canDetectArray3FromAddedFunction(mode) { const gpu = new GPU({ mode }); + function array2() { return [1, 2, 3]; } gpu.addFunction(array2); - const kernel = gpu.createKernel(function() { - const values = array2(); - return values[0] + values[1] + values[2]; - }, { output: [1] }); + const kernel = gpu.createKernel( + function () { + const values = array2(); + return values[0] + values[1] + values[2]; + }, + { output: [1] } + ); const result = kernel(); assert.equal(result[0], 6); @@ -119,25 +136,31 @@ test('can detect Array(3) gpu', () => { canDetectArray3FromAddedFunction('webgl2'); }); -(GPU.isHeadlessGLSupported ? test : skip)('can detect Array(3) headlessgl', () => { - canDetectArray3FromAddedFunction('headlessgl'); -}); +(GPU.isHeadlessGLSupported ? test : skip)( + 'can detect Array(3) headlessgl', + () => { + canDetectArray3FromAddedFunction('headlessgl'); + } +); test('can detect Array(3) cpu', () => { canDetectArray3FromAddedFunction('cpu'); }); - function canDetectArray4FromAddedFunction(mode) { const gpu = new GPU({ mode }); + function array2() { return [1, 2, 3, 4]; } gpu.addFunction(array2); - const kernel = gpu.createKernel(function() { - const values = array2(); - return values[0] + values[1] + values[2] + values[3]; - }, { output: [1] }); + const kernel = gpu.createKernel( + function () { + const values = array2(); + return values[0] + values[1] + values[2] + values[3]; + }, + { output: [1] } + ); const result = kernel(); assert.equal(result[0], 10); @@ -161,9 +184,12 @@ test('can detect Array(4) gpu', () => { canDetectArray4FromAddedFunction('webgl2'); }); -(GPU.isHeadlessGLSupported ? test : skip)('can detect Array(4) headlessgl', () => { - canDetectArray4FromAddedFunction('headlessgl'); -}); +(GPU.isHeadlessGLSupported ? test : skip)( + 'can detect Array(4) headlessgl', + () => { + canDetectArray4FromAddedFunction('headlessgl'); + } +); test('can detect Array(4) cpu', () => { canDetectArray4FromAddedFunction('cpu'); diff --git a/test/internal/function-tracer.js b/test/internal/function-tracer.js index a3608f16..2f00eed6 100644 --- a/test/internal/function-tracer.js +++ b/test/internal/function-tracer.js @@ -1,7 +1,7 @@ const { assert, test, skip, module: describe, only } = require('qunit'); const sinon = require('sinon'); const acorn = require('acorn'); -const { FunctionTracer } = require('../../src'); +const { FunctionTracer } = require('../..'); describe('internal: FunctionTracer'); @@ -19,12 +19,15 @@ test('works with BlockStatement', () => { contexts: [], runningContexts: [], newContext: FunctionTracer.prototype.newContext, - scan: (body) => { + scan: body => { called = true; calledBody = body; - } + }, }; - FunctionTracer.prototype.scan.call(mockInstance, { type: 'BlockStatement', body: mockBody }); + FunctionTracer.prototype.scan.call(mockInstance, { + type: 'BlockStatement', + body: mockBody, + }); assert.ok(called); assert.equal(calledBody, mockBody); assert.equal(mockInstance.contexts.length, 1); @@ -36,12 +39,16 @@ test('works with AssignmentExpression', () => { let called = false; let calledSides = []; const mockInstance = { - scan: (side) => { + scan: side => { called = true; calledSides.push(side); - } + }, }; - FunctionTracer.prototype.scan.call(mockInstance, { type: 'AssignmentExpression', left: mockLeft, right: mockRight }); + FunctionTracer.prototype.scan.call(mockInstance, { + type: 'AssignmentExpression', + left: mockLeft, + right: mockRight, + }); assert.ok(called); assert.deepEqual(calledSides, [mockLeft, mockRight]); }); @@ -52,12 +59,16 @@ test('works with LogicalExpression', () => { let called = false; let calledSides = []; const mockInstance = { - scan: (side) => { + scan: side => { called = true; calledSides.push(side); - } + }, }; - FunctionTracer.prototype.scan.call(mockInstance, { type: 'LogicalExpression', left: mockLeft, right: mockRight }); + FunctionTracer.prototype.scan.call(mockInstance, { + type: 'LogicalExpression', + left: mockLeft, + right: mockRight, + }); assert.ok(called); assert.deepEqual(calledSides, [mockLeft, mockRight]); }); @@ -68,12 +79,16 @@ test('works with BinaryExpression', () => { let called = false; let calledSides = []; const mockInstance = { - scan: (side) => { + scan: side => { called = true; calledSides.push(side); - } + }, }; - FunctionTracer.prototype.scan.call(mockInstance, { type: 'BinaryExpression', left: mockLeft, right: mockRight }); + FunctionTracer.prototype.scan.call(mockInstance, { + type: 'BinaryExpression', + left: mockLeft, + right: mockRight, + }); assert.ok(called); assert.deepEqual(calledSides, [mockLeft, mockRight]); }); @@ -83,12 +98,15 @@ test('works with UpdateExpression', () => { let called = false; let calledBody = null; const mockInstance = { - scan: (argument) => { + scan: argument => { called = true; calledBody = argument; - } + }, }; - FunctionTracer.prototype.scan.call(mockInstance, { type: 'UpdateExpression', argument: mockArgument }); + FunctionTracer.prototype.scan.call(mockInstance, { + type: 'UpdateExpression', + argument: mockArgument, + }); assert.ok(called); assert.equal(calledBody, mockArgument); }); @@ -98,12 +116,15 @@ test('works with UnaryExpression', () => { let called = false; let calledArgument = null; const mockInstance = { - scan: (argument) => { + scan: argument => { called = true; calledArgument = argument; - } + }, }; - FunctionTracer.prototype.scan.call(mockInstance, { type: 'UpdateExpression', argument: mockArgument }); + FunctionTracer.prototype.scan.call(mockInstance, { + type: 'UpdateExpression', + argument: mockArgument, + }); assert.ok(called); assert.equal(calledArgument, mockArgument); }); @@ -113,12 +134,15 @@ test('works with VariableDeclaration', () => { let called = false; let calledDeclarations = null; const mockInstance = { - scan: (declarations) => { + scan: declarations => { called = true; calledDeclarations = declarations; - } + }, }; - FunctionTracer.prototype.scan.call(mockInstance, { type: 'VariableDeclaration', declarations: mockDeclarations }); + FunctionTracer.prototype.scan.call(mockInstance, { + type: 'VariableDeclaration', + declarations: mockDeclarations, + }); assert.ok(called); assert.deepEqual(calledDeclarations, mockDeclarations); }); @@ -159,21 +183,45 @@ test('works with var & let VariableDeclarator together', () => { for (let i = 0; i < 1; i++) { let pop = 0; }`); const functionTracer = new FunctionTracer(ast); - assert.equal(functionTracer.contexts[0].bob.context['@contextType'], 'function'); + assert.equal( + functionTracer.contexts[0].bob.context['@contextType'], + 'function' + ); assert.equal(functionTracer.contexts[0].i, undefined); assert.equal(functionTracer.contexts[0].pop, undefined); - assert.equal(functionTracer.contexts[1].bob.context['@contextType'], 'function'); - assert.equal(functionTracer.contexts[1].i.context['@contextType'], 'function'); + assert.equal( + functionTracer.contexts[1].bob.context['@contextType'], + 'function' + ); + assert.equal( + functionTracer.contexts[1].i.context['@contextType'], + 'function' + ); assert.equal(functionTracer.contexts[1].pop, undefined); - assert.equal(functionTracer.contexts[2].bob.context['@contextType'], 'function'); - assert.equal(functionTracer.contexts[2].i.context['@contextType'], 'function'); + assert.equal( + functionTracer.contexts[2].bob.context['@contextType'], + 'function' + ); + assert.equal( + functionTracer.contexts[2].i.context['@contextType'], + 'function' + ); assert.equal(functionTracer.contexts[2].pop, undefined); - assert.equal(functionTracer.contexts[3].bob.context['@contextType'], 'function'); - assert.equal(functionTracer.contexts[3].i.context['@contextType'], 'function'); - assert.equal(functionTracer.contexts[3].pop.context['@contextType'], 'function'); + assert.equal( + functionTracer.contexts[3].bob.context['@contextType'], + 'function' + ); + assert.equal( + functionTracer.contexts[3].i.context['@contextType'], + 'function' + ); + assert.equal( + functionTracer.contexts[3].pop.context['@contextType'], + 'function' + ); }); test('works with FunctionExpression when runningContexts.length = 0', () => { @@ -183,12 +231,15 @@ test('works with FunctionExpression when runningContexts.length = 0', () => { const mockInstance = { runningContexts: [], functions: [], - scan: (body) => { + scan: body => { called = true; calledBody = body; - } + }, }; - FunctionTracer.prototype.scan.call(mockInstance, { type: 'FunctionExpression', body: mockBody }); + FunctionTracer.prototype.scan.call(mockInstance, { + type: 'FunctionExpression', + body: mockBody, + }); assert.ok(called); assert.equal(calledBody, mockBody); assert.equal(mockInstance.functions.length, 0); @@ -201,12 +252,15 @@ test('works with FunctionDeclaration when runningContexts.length = 0', () => { const mockInstance = { runningContexts: [], functions: [], - scan: (body) => { + scan: body => { called = true; calledBody = body; - } + }, }; - FunctionTracer.prototype.scan.call(mockInstance, { type: 'FunctionDeclaration', body: mockBody }); + FunctionTracer.prototype.scan.call(mockInstance, { + type: 'FunctionDeclaration', + body: mockBody, + }); assert.ok(called); assert.equal(calledBody, mockBody); assert.equal(mockInstance.functions.length, 0); @@ -219,7 +273,7 @@ test('works with FunctionExpression when runningContexts.length > 0', () => { runningContexts: [null], scan: () => { throw new Error('should not be called'); - } + }, }; const mockAst = { type: 'FunctionExpression', body: mockBody }; FunctionTracer.prototype.scan.call(mockInstance, mockAst); @@ -234,7 +288,7 @@ test('works with FunctionDeclaration when runningContexts.length > 0', () => { runningContexts: [null], scan: () => { throw new Error('should not be called'); - } + }, }; const mockAst = { type: 'FunctionDeclaration', body: mockBody }; FunctionTracer.prototype.scan.call(mockInstance, mockAst); @@ -242,7 +296,6 @@ test('works with FunctionDeclaration when runningContexts.length > 0', () => { assert.equal(mockInstance.functions[0], mockAst); }); - test('works with IfStatement', () => { const mockTest = {}; const mockConsequent = {}; @@ -250,10 +303,10 @@ test('works with IfStatement', () => { let called = false; let calledArgs = []; const mockInstance = { - scan: (arg) => { + scan: arg => { called = true; calledArgs.push(arg); - } + }, }; FunctionTracer.prototype.scan.call(mockInstance, { type: 'IfStatement', @@ -283,12 +336,16 @@ test('works with DoWhileStatement', () => { contexts: [], runningContexts: [], newContext: FunctionTracer.prototype.newContext, - scan: (arg) => { + scan: arg => { called = true; calledArgs.push(arg); - } + }, }; - FunctionTracer.prototype.scan.call(mockInstance, { type: 'DoWhileStatement', body: mockBody, test: mockTest }); + FunctionTracer.prototype.scan.call(mockInstance, { + type: 'DoWhileStatement', + body: mockBody, + test: mockTest, + }); assert.ok(called); assert.deepEqual(calledArgs, [mockBody, mockTest]); }); @@ -302,12 +359,16 @@ test('works with WhileStatement', () => { contexts: [], runningContexts: [], newContext: FunctionTracer.prototype.newContext, - scan: (arg) => { + scan: arg => { called = true; calledArgs.push(arg); - } + }, }; - FunctionTracer.prototype.scan.call(mockInstance, { type: 'WhileStatement', body: mockBody, test: mockTest }); + FunctionTracer.prototype.scan.call(mockInstance, { + type: 'WhileStatement', + body: mockBody, + test: mockTest, + }); assert.ok(called); assert.deepEqual(calledArgs, [mockBody, mockTest]); }); @@ -330,8 +391,8 @@ test('works with Identifier', () => { { context: mockInstance.currentContext, ast: mockAst, - declaration: 123 - } + declaration: 123, + }, ]); assert.equal(mockIsState.args[0][0], 'trackIdentifiers'); }); @@ -342,10 +403,10 @@ test('works with ReturnStatement', () => { let calledArgument = null; const mockInstance = { returnStatements: [], - scan: (argument) => { + scan: argument => { called = true; calledArgument = argument; - } + }, }; const mockAst = { type: 'ReturnStatement', argument: mockArgument }; FunctionTracer.prototype.scan.call(mockInstance, mockAst); @@ -354,7 +415,6 @@ test('works with ReturnStatement', () => { assert.equal(mockInstance.returnStatements[0], mockAst); }); - test('works with MemberExpression', () => { const mockBody = {}; const mockProperty = {}; @@ -366,7 +426,11 @@ test('works with MemberExpression', () => { pushState: mockPushState, popState: mockPopState, }; - FunctionTracer.prototype.scan.call(mockInstance, { type: 'MemberExpression', object: mockBody, property: mockProperty }); + FunctionTracer.prototype.scan.call(mockInstance, { + type: 'MemberExpression', + object: mockBody, + property: mockProperty, + }); assert.ok(mockScan.called); assert.equal(mockScan.args[0][0], mockBody); assert.equal(mockScan.args[1][0], mockProperty); @@ -374,18 +438,20 @@ test('works with MemberExpression', () => { assert.equal(mockPopState.args[0][0], 'memberExpression'); }); - test('works with ExpressionStatement', () => { const mockExpression = {}; let called = false; let calledExpression = null; const mockInstance = { - scan: (body) => { + scan: body => { called = true; calledExpression = body; - } + }, }; - FunctionTracer.prototype.scan.call(mockInstance, { type: 'ExpressionStatement', expression: mockExpression }); + FunctionTracer.prototype.scan.call(mockInstance, { + type: 'ExpressionStatement', + expression: mockExpression, + }); assert.ok(called); assert.equal(calledExpression, mockExpression); }); @@ -396,12 +462,15 @@ test('works with SequenceExpression', () => { let called = false; let calledExpression = null; const mockInstance = { - scan: (body) => { + scan: body => { called = true; calledExpression = body; - } + }, }; - FunctionTracer.prototype.scan.call(mockInstance, { type: 'SequenceExpression', expressions: mockExpressions }); + FunctionTracer.prototype.scan.call(mockInstance, { + type: 'SequenceExpression', + expressions: mockExpressions, + }); assert.ok(called); assert.equal(calledExpression, mockExpressions); }); @@ -414,10 +483,10 @@ test('works with CallExpression', () => { const mockInstance = { currentContext: mockCurrentContext, functionCalls: [], - scan: (_arguments) => { + scan: _arguments => { called = true; calledArguments = _arguments; - } + }, }; const mockAst = { type: 'CallExpression', arguments: mockArguments }; FunctionTracer.prototype.scan.call(mockInstance, mockAst); @@ -426,8 +495,8 @@ test('works with CallExpression', () => { assert.deepEqual(mockInstance.functionCalls, [ { context: mockCurrentContext, - ast: mockAst - } + ast: mockAst, + }, ]); }); @@ -436,12 +505,15 @@ test('works with ArrayExpression', () => { let called = false; let calledElements = null; const mockInstance = { - scan: (elements) => { + scan: elements => { called = true; calledElements = elements; - } + }, }; - FunctionTracer.prototype.scan.call(mockInstance, { type: 'ArrayExpression', elements: mockElements }); + FunctionTracer.prototype.scan.call(mockInstance, { + type: 'ArrayExpression', + elements: mockElements, + }); assert.ok(called); assert.equal(calledElements, mockElements); }); @@ -453,12 +525,17 @@ test('works with ConditionalExpression', () => { let called = false; let calledArgs = []; const mockInstance = { - scan: (arg) => { + scan: arg => { called = true; calledArgs.push(arg); - } + }, }; - FunctionTracer.prototype.scan.call(mockInstance, { type: 'ConditionalExpression', test: mockTest, alternate: mockAlternate, consequent: mockConsequent }); + FunctionTracer.prototype.scan.call(mockInstance, { + type: 'ConditionalExpression', + test: mockTest, + alternate: mockAlternate, + consequent: mockConsequent, + }); assert.ok(called); assert.deepEqual(calledArgs, [mockTest, mockConsequent, mockConsequent]); }); @@ -469,12 +546,16 @@ test('works with SwitchStatement', () => { let called = false; let calledArgs = []; const mockInstance = { - scan: (arg) => { + scan: arg => { called = true; calledArgs.push(arg); - } + }, }; - FunctionTracer.prototype.scan.call(mockInstance, { type: 'SwitchStatement', discriminant: mockDiscriminant, cases: mockCases }); + FunctionTracer.prototype.scan.call(mockInstance, { + type: 'SwitchStatement', + discriminant: mockDiscriminant, + cases: mockCases, + }); assert.ok(called); assert.deepEqual(calledArgs, [mockDiscriminant, mockCases]); }); @@ -485,12 +566,16 @@ test('works with SwitchCase', () => { let called = false; let calledArgs = []; const mockInstance = { - scan: (arg) => { + scan: arg => { called = true; calledArgs.push(arg); - } + }, }; - FunctionTracer.prototype.scan.call(mockInstance, { type: 'SwitchCase', test: mockTest, consequent: mockConsequent }); + FunctionTracer.prototype.scan.call(mockInstance, { + type: 'SwitchCase', + test: mockTest, + consequent: mockConsequent, + }); assert.ok(called); assert.deepEqual(calledArgs, [mockTest, mockConsequent]); }); @@ -500,7 +585,7 @@ test('does nothing with un-scan-ables', () => { const mockInstance = { scan: () => { called = true; - } + }, }; [ 'ThisExpression', @@ -508,7 +593,7 @@ test('does nothing with un-scan-ables', () => { 'DebuggerStatement', 'EmptyStatement', 'BreakStatement', - 'ContinueStatement' + 'ContinueStatement', ].forEach(type => { FunctionTracer.prototype.scan.call(mockInstance, { type }); }); @@ -524,15 +609,12 @@ test('when called with fake type, throws', () => { test('can handle direct arrays', () => { const mockBlockBody = {}; const mockProgramBody = {}; - const asts = [ - { type: 'BlockStatement' }, - { type: 'Program' }, - ]; + const asts = [{ type: 'BlockStatement' }, { type: 'Program' }]; const calledAsts = []; const mockInstance = { - scan: (ast) => { + scan: ast => { calledAsts.push(ast); - } + }, }; FunctionTracer.prototype.scan.call(mockInstance, asts); assert.deepEqual(calledAsts, asts); diff --git a/test/internal/gpu-methods.js b/test/internal/gpu-methods.js index b9acb266..50c6e811 100644 --- a/test/internal/gpu-methods.js +++ b/test/internal/gpu-methods.js @@ -1,5 +1,5 @@ const { assert, test, skip, module: describe, only } = require('qunit'); -const { GPU } = require('../../src'); +const { GPU } = require('../..'); describe('internal: GPU methods'); @@ -7,7 +7,9 @@ test('.createKernelMap() object map with settings', () => { const gpu = new GPU(); let source = null; let settings = null; + function bob() {} + function tom() {} class MockKernel { constructor(_source, _settings) { @@ -21,9 +23,9 @@ test('.createKernelMap() object map with settings', () => { gpu.Kernel = MockKernel; const subKernels = { bobResult: bob, - tomResult: tom + tomResult: tom, }; - const kernelSource = function() {}; + const kernelSource = function () {}; const masterSettings = {}; const kernel = gpu.createKernelMap(subKernels, kernelSource, masterSettings); assert.equal(source, kernelSource.toString()); @@ -38,13 +40,13 @@ test('.createKernelMap() object map with settings', () => { { name: 'bob', source: bob.toString(), - property: 'bobResult' + property: 'bobResult', }, { name: 'tom', source: tom.toString(), - property: 'tomResult' - } + property: 'tomResult', + }, ]); }); @@ -52,7 +54,9 @@ test('.createKernelMap() array map with settings', () => { const gpu = new GPU(); let source = null; let settings = null; + function bob() {} + function tom() {} class MockKernel { constructor(_source, _settings) { @@ -65,7 +69,7 @@ test('.createKernelMap() array map with settings', () => { } gpu.Kernel = MockKernel; const subKernels = [bob, tom]; - const kernelSource = function() {}; + const kernelSource = function () {}; const masterSettings = {}; const kernel = gpu.createKernelMap(subKernels, kernelSource, masterSettings); assert.equal(source, kernelSource.toString()); @@ -80,12 +84,12 @@ test('.createKernelMap() array map with settings', () => { { name: 'bob', source: bob.toString(), - property: 0 + property: 0, }, { name: 'tom', source: tom.toString(), - property: 1 - } + property: 1, + }, ]); }); diff --git a/test/internal/implied-else.js b/test/internal/implied-else.js index 9eae23b7..8db318c5 100644 --- a/test/internal/implied-else.js +++ b/test/internal/implied-else.js @@ -1,16 +1,19 @@ const { assert, skip, test, module: describe, only } = require('qunit'); -const { GPU } = require('../../src'); +const { GPU } = require('../..'); describe('internal: Implied else'); function neverReachedWhenEarlyReturn(mode) { const gpu = new GPU({ mode }); - const kernel = gpu.createKernel(function(check, v1, v2) { - if (check) { - return v1; - } - return v2; - }, { output: [1] }); + const kernel = gpu.createKernel( + function (check, v1, v2) { + if (check) { + return v1; + } + return v2; + }, + { output: [1] } + ); const result = kernel(true, 123, 321); assert.equal(result[0], 123); gpu.destroy(); @@ -24,17 +27,26 @@ test('never reached when early return gpu', () => { neverReachedWhenEarlyReturn('gpu'); }); -(GPU.isWebGLSupported ? test : skip)('never reached when early return webgl', () => { - neverReachedWhenEarlyReturn('webgl'); -}); +(GPU.isWebGLSupported ? test : skip)( + 'never reached when early return webgl', + () => { + neverReachedWhenEarlyReturn('webgl'); + } +); -(GPU.isWebGL2Supported ? test : skip)('never reached when early return webgl2', () => { - neverReachedWhenEarlyReturn('webgl2'); -}); +(GPU.isWebGL2Supported ? test : skip)( + 'never reached when early return webgl2', + () => { + neverReachedWhenEarlyReturn('webgl2'); + } +); -(GPU.isHeadlessGLSupported ? test : skip)('never reached when early return headlessgl', () => { - neverReachedWhenEarlyReturn('headlessgl'); -}); +(GPU.isHeadlessGLSupported ? test : skip)( + 'never reached when early return headlessgl', + () => { + neverReachedWhenEarlyReturn('headlessgl'); + } +); test('never reached when early return cpu', () => { neverReachedWhenEarlyReturn('cpu'); @@ -42,12 +54,15 @@ test('never reached when early return cpu', () => { function handlesImpliedElse(mode) { const gpu = new GPU({ mode }); - const kernel = gpu.createKernel(function(check, v1, v2) { - if (check) { - return v1; - } - return v2; - }, { output: [1] }); + const kernel = gpu.createKernel( + function (check, v1, v2) { + if (check) { + return v1; + } + return v2; + }, + { output: [1] } + ); const result = kernel(true, 123, 321); assert.equal(result[0], 123); gpu.destroy(); @@ -69,9 +84,12 @@ test('handles implied else gpu', () => { handlesImpliedElse('webgl2'); }); -(GPU.isHeadlessGLSupported ? test : skip)('handles implied else headlessgl', () => { - handlesImpliedElse('headlessgl'); -}); +(GPU.isHeadlessGLSupported ? test : skip)( + 'handles implied else headlessgl', + () => { + handlesImpliedElse('headlessgl'); + } +); test('handles implied else cpu', () => { handlesImpliedElse('cpu'); diff --git a/test/internal/kernel-run-shortcut.js b/test/internal/kernel-run-shortcut.js index be075f48..c9ec675e 100644 --- a/test/internal/kernel-run-shortcut.js +++ b/test/internal/kernel-run-shortcut.js @@ -1,18 +1,21 @@ const { assert, test, module: describe, skip } = require('qunit'); const sinon = require('sinon'); -const { GPU } = require('../../src'); +const { GPU } = require('../..'); describe('internal: kernelRunShortcut'); function testImmutableSavesSwitchedKernel(mode) { const gpu = new GPU({ mode }); - const kernel = gpu.createKernel(function(value) { - return value[0] + 1; - }, { - output: [1], - pipeline: true, - immutable: true, - }); + const kernel = gpu.createKernel( + function (value) { + return value[0] + 1; + }, + { + output: [1], + pipeline: true, + immutable: true, + } + ); const one = kernel(new Float32Array([0])); const arrayKernel = kernel.kernel; const arrayKernelSpy = sinon.spy(arrayKernel, 'onRequestSwitchKernel'); @@ -69,14 +72,23 @@ test('immutable saves switched kernel gpu', () => { testImmutableSavesSwitchedKernel('gpu'); }); -(GPU.isWebGLSupported ? test : skip)('immutable saves switched kernel webgl', () => { - testImmutableSavesSwitchedKernel('webgl'); -}); +(GPU.isWebGLSupported ? test : skip)( + 'immutable saves switched kernel webgl', + () => { + testImmutableSavesSwitchedKernel('webgl'); + } +); -(GPU.isWebGL2Supported ? test : skip)('immutable saves switched kernel webgl2', () => { - testImmutableSavesSwitchedKernel('webgl2'); -}); +(GPU.isWebGL2Supported ? test : skip)( + 'immutable saves switched kernel webgl2', + () => { + testImmutableSavesSwitchedKernel('webgl2'); + } +); -(GPU.isHeadlessGLSupported ? test : skip)('immutable saves switched kernel headlessgl', () => { - testImmutableSavesSwitchedKernel('headlessgl'); -}); \ No newline at end of file +(GPU.isHeadlessGLSupported ? test : skip)( + 'immutable saves switched kernel headlessgl', + () => { + testImmutableSavesSwitchedKernel('headlessgl'); + } +); diff --git a/test/internal/kernel.js b/test/internal/kernel.js index ec0475e1..5097c455 100644 --- a/test/internal/kernel.js +++ b/test/internal/kernel.js @@ -1,5 +1,12 @@ const { assert, test, module: describe, skip } = require('qunit'); -const { GPU, CPUKernel, WebGLKernel, WebGL2Kernel, HeadlessGLKernel, Kernel } = require('../../src'); +const { + GPU, + CPUKernel, + WebGLKernel, + WebGL2Kernel, + HeadlessGLKernel, + Kernel, +} = require('../..'); describe('internal: kernel'); @@ -8,15 +15,20 @@ describe('internal: kernel'); * @param {Kernel} Kernel */ function argumentTypesTest(Kernel) { - const kernel = new Kernel(`function(value) { return value[this.thread.x]; }`, { - output: [1], - functionBuilder: { - addKernel: function() {}, - addFunctions: function() {}, - getPrototypes: function() { return []; }, - addNativeFunctions: function() {} - }, - }); + const kernel = new Kernel( + `function(value) { return value[this.thread.x]; }`, + { + output: [1], + functionBuilder: { + addKernel: function () {}, + addFunctions: function () {}, + getPrototypes: function () { + return []; + }, + addNativeFunctions: function () {}, + }, + } + ); kernel.build([1]); assert.equal(kernel.argumentTypes.length, 1); assert.equal(kernel.argumentTypes[0], 'Array'); @@ -35,9 +47,12 @@ test('CPUKernel argumentTypes', () => { argumentTypesTest(WebGL2Kernel); }); -(GPU.isHeadlessGLSupported ? test : skip)('HeadlessGLKernel argumentTypes', () => { - argumentTypesTest(HeadlessGLKernel); -}); +(GPU.isHeadlessGLSupported ? test : skip)( + 'HeadlessGLKernel argumentTypes', + () => { + argumentTypesTest(HeadlessGLKernel); + } +); /** * @@ -49,9 +64,9 @@ function setUniform1fTest(Kernel) { uniform1f: () => { if (throws) new Error('This should not get called'); }, - getUniformLocation: (name) => { + getUniformLocation: name => { return name; - } + }, }; const kernel = new Kernel('function() {}', { canvas, context, output: [1] }); let throws = false; @@ -74,9 +89,12 @@ test('WebGLKernel.setUniform1f only calls context when values change', () => { test('WebGL2Kernel.setUniform1f only calls context when values change', () => { setUniform1fTest(WebGL2Kernel); }); -(GPU.isHeadlessGLSupported ? test : skip)('HeadlessGLKernel.setUniform1f only calls context when values change', () => { - setUniform1fTest(HeadlessGLKernel); -}); +(GPU.isHeadlessGLSupported ? test : skip)( + 'HeadlessGLKernel.setUniform1f only calls context when values change', + () => { + setUniform1fTest(HeadlessGLKernel); + } +); /** * @@ -88,9 +106,9 @@ function setUniform1iTest(Kernel) { uniform1i: () => { if (throws) new Error('This should not get called'); }, - getUniformLocation: (name) => { + getUniformLocation: name => { return name; - } + }, }; const kernel = new Kernel('function() {}', { canvas, context, output: [1] }); let throws = false; @@ -113,9 +131,12 @@ test('WebGLKernel.setUniform1i only calls context when values change', () => { test('WebGL2Kernel.setUniform1i only calls context when values change', () => { setUniform1iTest(WebGL2Kernel); }); -(GPU.isHeadlessGLSupported ? test : skip)('HeadlessGLKernel.setUniform1i only calls context when values change', () => { - setUniform1iTest(HeadlessGLKernel); -}); +(GPU.isHeadlessGLSupported ? test : skip)( + 'HeadlessGLKernel.setUniform1i only calls context when values change', + () => { + setUniform1iTest(HeadlessGLKernel); + } +); /** * @@ -127,9 +148,9 @@ function setUniform2fTest(Kernel) { uniform2f: () => { if (throws) new Error('This should not get called'); }, - getUniformLocation: (name) => { + getUniformLocation: name => { return name; - } + }, }; const kernel = new Kernel('function() {}', { canvas, context, output: [1] }); let throws = false; @@ -151,9 +172,12 @@ test('WebGLKernel.setUniform2f only calls context when values change', () => { test('WebGL2Kernel.setUniform2f only calls context when values change', () => { setUniform2fTest(WebGL2Kernel); }); -(GPU.isHeadlessGLSupported ? test : skip)('HeadlessGLKernel.setUniform2f only calls context when values change', () => { - setUniform2fTest(HeadlessGLKernel); -}); +(GPU.isHeadlessGLSupported ? test : skip)( + 'HeadlessGLKernel.setUniform2f only calls context when values change', + () => { + setUniform2fTest(HeadlessGLKernel); + } +); /** * @@ -165,9 +189,9 @@ function setUniform2fvTest(Kernel) { uniform2fv: () => { if (throws) new Error('This should not get called'); }, - getUniformLocation: (name) => { + getUniformLocation: name => { return name; - } + }, }; const kernel = new Kernel('function() {}', { canvas, context, output: [1] }); let throws = false; @@ -203,9 +227,9 @@ function setUniform3fvTest(Kernel) { uniform3fv: () => { if (throws) new Error('This should not get called'); }, - getUniformLocation: (name) => { + getUniformLocation: name => { return name; - } + }, }; const kernel = new Kernel('function() {}', { canvas, context, output: [1] }); let throws = false; @@ -241,9 +265,9 @@ function setUniform4ivTest(Kernel) { uniform4iv: () => { if (throws) new Error('This should not get called'); }, - getUniformLocation: (name) => { + getUniformLocation: name => { return name; - } + }, }; const kernel = new Kernel('function() {}', { canvas, context, output: [1] }); let throws = false; @@ -279,9 +303,9 @@ function setUniform4fvTest(Kernel) { uniform4fv: () => { if (throws) new Error('This should not get called'); }, - getUniformLocation: (name) => { + getUniformLocation: name => { return name; - } + }, }; const kernel = new Kernel('function() {}', { canvas, context, output: [1] }); let throws = false; @@ -314,14 +338,16 @@ test('functionToIFunction with function', () => { name: 'name', source: fn.toString(), argumentTypes: [], - returnType: null + returnType: null, }); }); test('functionToIFunction with function and argumentTypes array', () => { const fn = function name(a, b) {}; - const argumentTypes = ['number','string']; - const result = Kernel.prototype.functionToIGPUFunction(fn, { argumentTypes }); + const argumentTypes = ['number', 'string']; + const result = Kernel.prototype.functionToIGPUFunction(fn, { + argumentTypes, + }); assert.deepEqual(result, { name: 'name', source: fn.toString(), @@ -333,7 +359,9 @@ test('functionToIFunction with function and argumentTypes array', () => { test('functionToIFunction with function and argumentTypes object', () => { const fn = function name(a, b) {}; const argumentTypes = { a: 'number', b: 'string' }; - const result = Kernel.prototype.functionToIGPUFunction(fn, { argumentTypes }); + const result = Kernel.prototype.functionToIGPUFunction(fn, { + argumentTypes, + }); assert.deepEqual(result, { name: 'name', source: fn.toString(), @@ -344,7 +372,9 @@ test('functionToIFunction with function and argumentTypes object', () => { test('functionToIGPUFunction with function and returnType', () => { const fn = function name(a, b) {}; - const result = Kernel.prototype.functionToIGPUFunction(fn, { returnType: 'string' }); + const result = Kernel.prototype.functionToIGPUFunction(fn, { + returnType: 'string', + }); assert.deepEqual(result, { name: 'name', source: fn.toString(), diff --git a/test/internal/loop-int.js b/test/internal/loop-int.js index d9322a7e..d62512cd 100644 --- a/test/internal/loop-int.js +++ b/test/internal/loop-int.js @@ -1,5 +1,5 @@ const { assert, skip, test, module: describe, only } = require('qunit'); -const { GPU, WebGLFunctionNode, WebGL2FunctionNode } = require('../../src'); +const { GPU, WebGLFunctionNode, WebGL2FunctionNode } = require('../..'); describe('internal: loop int'); test('loop int constant output webgl', () => { @@ -14,7 +14,7 @@ test('loop int constant output webgl', () => { isRootKernel: true, output: [1], constantTypes: { - max: 'Integer' + max: 'Integer', }, argumentTypes: ['Array'], lookupFunctionArgumentBitRatio: () => 4, @@ -22,12 +22,13 @@ test('loop int constant output webgl', () => { assert.equal( functionNode.toString(), 'void kernel() {' + - '\nfloat user_sum=0.0;' + - '\nfor (int user_i=0;(user_i { @@ -48,12 +49,13 @@ test('loop int constant output webgl2', () => { assert.equal( functionNode.toString(), 'void kernel() {' + - '\nfloat user_sum=0.0;' + - '\nfor (int user_i=0;(user_i { @@ -67,13 +69,10 @@ test('loop int constant output webgl2', () => { const gpu = new GPU({ mode: 'webgl' }); const output = gpu.createKernel(kernel, { constants: { max: 3 }, - output: [1] - })([[1,2,3]]); + output: [1], + })([[1, 2, 3]]); - assert.equal( - output, - 6 - ); + assert.equal(output, 6); gpu.destroy(); }); @@ -88,36 +87,33 @@ test('loop int constant output webgl2', () => { const gpu = new GPU({ mode: 'webgl2' }); const output = gpu.createKernel(kernel, { constants: { max: 3 }, - output: [1] - })([[1,2,3]]); + output: [1], + })([[1, 2, 3]]); - assert.equal( - output, - 6 - ); + assert.equal(output, 6); gpu.destroy(); }); -(GPU.isHeadlessGLSupported ? test : skip)('loop int constant headlessgl', () => { - function kernel(a) { - let sum = 0; - for (let i = 0; i < this.constants.max; i++) { - sum += a[this.thread.x][i]; +(GPU.isHeadlessGLSupported ? test : skip)( + 'loop int constant headlessgl', + () => { + function kernel(a) { + let sum = 0; + for (let i = 0; i < this.constants.max; i++) { + sum += a[this.thread.x][i]; + } + return sum; } - return sum; - } - const gpu = new GPU({ mode: 'headlessgl' }); - const output = gpu.createKernel(kernel, { - constants: { max: 3 }, - output: [1] - })([[1,2,3]]); + const gpu = new GPU({ mode: 'headlessgl' }); + const output = gpu.createKernel(kernel, { + constants: { max: 3 }, + output: [1], + })([[1, 2, 3]]); - assert.equal( - output, - 6 - ); - gpu.destroy(); -}); + assert.equal(output, 6); + gpu.destroy(); + } +); test('loop int literal output webgl', () => { function kernel(a) { @@ -136,12 +132,13 @@ test('loop int literal output webgl', () => { assert.equal( functionNode.toString(), 'void kernel() {' + - '\nfloat user_sum=0.0;' + - '\nfor (int user_i=0;(user_i<10);user_i++){' + - '\nuser_sum+=get32(user_a, user_aSize, user_aDim, 0, threadId.x, user_i);}' + - '\n' + - '\nkernelResult = user_sum;return;' + - '\n}'); + '\nfloat user_sum=0.0;' + + '\nfor (int user_i=0;(user_i<10);user_i++){' + + '\nuser_sum+=get32(user_a, user_aSize, user_aDim, 0, threadId.x, user_i);}' + + '\n' + + '\nkernelResult = user_sum;return;' + + '\n}' + ); }); test('loop int literal output webgl2', () => { @@ -161,12 +158,13 @@ test('loop int literal output webgl2', () => { assert.equal( functionNode.toString(), 'void kernel() {' + - '\nfloat user_sum=0.0;' + - '\nfor (int user_i=0;(user_i<10);user_i++){' + - '\nuser_sum+=get32(user_a, user_aSize, user_aDim, 0, threadId.x, user_i);}' + - '\n' + - '\nkernelResult = user_sum;return;' + - '\n}'); + '\nfloat user_sum=0.0;' + + '\nfor (int user_i=0;(user_i<10);user_i++){' + + '\nuser_sum+=get32(user_a, user_aSize, user_aDim, 0, threadId.x, user_i);}' + + '\n' + + '\nkernelResult = user_sum;return;' + + '\n}' + ); }); (GPU.isWebGLSupported ? test : skip)('loop int literal webgl', () => { @@ -178,11 +176,8 @@ test('loop int literal output webgl2', () => { return sum; } const gpu = new GPU({ mode: 'webgl' }); - const output = gpu.createKernel(kernel, { output: [1] })([[1,2,3]]); - assert.equal( - output, - 6 - ); + const output = gpu.createKernel(kernel, { output: [1] })([[1, 2, 3]]); + assert.equal(output, 6); gpu.destroy(); }); @@ -195,30 +190,27 @@ test('loop int literal output webgl2', () => { return sum; } const gpu = new GPU({ mode: 'webgl2' }); - const output = gpu.createKernel(kernel, { output: [1] })([[1,2,3]]); - assert.equal( - output, - 6 - ); + const output = gpu.createKernel(kernel, { output: [1] })([[1, 2, 3]]); + assert.equal(output, 6); gpu.destroy(); }); -(GPU.isHeadlessGLSupported ? test : skip)('loop int literal headlessgl', () => { - function kernel(a) { - let sum = 0; - for (let i = 0; i < 3; i++) { - sum += a[this.thread.x][i]; +(GPU.isHeadlessGLSupported ? test : skip)( + 'loop int literal headlessgl', + () => { + function kernel(a) { + let sum = 0; + for (let i = 0; i < 3; i++) { + sum += a[this.thread.x][i]; + } + return sum; } - return sum; + const gpu = new GPU({ mode: 'headlessgl' }); + const output = gpu.createKernel(kernel, { output: [1] })([[1, 2, 3]]); + assert.equal(output, 6); + gpu.destroy(); } - const gpu = new GPU({ mode: 'headlessgl' }); - const output = gpu.createKernel(kernel, { output: [1] })([[1,2,3]]); - assert.equal( - output, - 6 - ); - gpu.destroy(); -}); +); test('loop int parameter output webgl', () => { function kernel(a, b) { @@ -232,20 +224,21 @@ test('loop int parameter output webgl', () => { isRootKernel: true, output: [1], argumentTypes: ['Number', 'Array'], - lookupFunctionArgumentBitRatio: () => 4 + lookupFunctionArgumentBitRatio: () => 4, }); assert.equal( functionNode.toString(), 'void kernel() {' + - '\nfloat user_sum=0.0;' + - '\nint user_i=0;' + - '\nfor (int safeI=0;safeI { @@ -265,15 +258,16 @@ test('loop int parameter output webgl2', () => { assert.equal( functionNode.toString(), 'void kernel() {' + - '\nfloat user_sum=0.0;' + - '\nint user_i=0;' + - '\nfor (int safeI=0;safeI { @@ -285,11 +279,8 @@ test('loop int parameter output webgl2', () => { return sum; } const gpu = new GPU({ mode: 'webgl' }); - const output = gpu.createKernel(kernel, { output: [1] })(3, [[1,2,3]]); - assert.equal( - output, - 6 - ); + const output = gpu.createKernel(kernel, { output: [1] })(3, [[1, 2, 3]]); + assert.equal(output, 6); gpu.destroy(); }); @@ -302,30 +293,27 @@ test('loop int parameter output webgl2', () => { return sum; } const gpu = new GPU({ mode: 'webgl2' }); - const output = gpu.createKernel(kernel, { output: [1] })(3, [[1,2,3]]); - assert.equal( - output, - 6 - ); + const output = gpu.createKernel(kernel, { output: [1] })(3, [[1, 2, 3]]); + assert.equal(output, 6); gpu.destroy(); }); -(GPU.isHeadlessGLSupported ? test : skip)('loop int parameter headlessgl', () => { - function kernel(a, b) { - let sum = 0; - for (let i = 0; i < a; i++) { - sum += b[this.thread.x][i]; +(GPU.isHeadlessGLSupported ? test : skip)( + 'loop int parameter headlessgl', + () => { + function kernel(a, b) { + let sum = 0; + for (let i = 0; i < a; i++) { + sum += b[this.thread.x][i]; + } + return sum; } - return sum; + const gpu = new GPU({ mode: 'headlessgl' }); + const output = gpu.createKernel(kernel, { output: [1] })(3, [[1, 2, 3]]); + assert.equal(output, 6); + gpu.destroy(); } - const gpu = new GPU({ mode: 'headlessgl' }); - const output = gpu.createKernel(kernel, { output: [1] })(3, [[1,2,3]]); - assert.equal( - output, - 6 - ); - gpu.destroy(); -}); +); (GPU.isWebGLSupported ? test : skip)('loop int dynamic output webgl', () => { function kernel(a) { @@ -341,10 +329,7 @@ test('loop int parameter output webgl2', () => { output: [1], })([[3]]); - assert.deepEqual( - Array.from(output), - [3] - ); + assert.deepEqual(Array.from(output), [3]); gpu.destroy(); }); @@ -359,33 +344,30 @@ test('loop int parameter output webgl2', () => { const gpu = new GPU({ mode: 'webgl2' }); const output = gpu.createKernel(kernel, { dynamicOutput: true, - output: [1] + output: [1], })([[3]]); - assert.deepEqual( - Array.from(output), - [3] - ); + assert.deepEqual(Array.from(output), [3]); gpu.destroy(); }); -(GPU.isHeadlessGLSupported ? test : skip)('loop int dynamic output headlessgl', () => { - function kernel(a) { - let sum = 0; - for (let i = 0; i < this.output.x; i++) { - sum += a[this.thread.x][i]; +(GPU.isHeadlessGLSupported ? test : skip)( + 'loop int dynamic output headlessgl', + () => { + function kernel(a) { + let sum = 0; + for (let i = 0; i < this.output.x; i++) { + sum += a[this.thread.x][i]; + } + return sum; } - return sum; - } - const gpu = new GPU({ mode: 'headlessgl' }); - const output = gpu.createKernel(kernel, { - dynamicOutput: true, - output: [1], - })([[3]]); + const gpu = new GPU({ mode: 'headlessgl' }); + const output = gpu.createKernel(kernel, { + dynamicOutput: true, + output: [1], + })([[3]]); - assert.deepEqual( - Array.from(output), - [3] - ); - gpu.destroy(); -}); + assert.deepEqual(Array.from(output), [3]); + gpu.destroy(); + } +); diff --git a/test/internal/loop-max.js b/test/internal/loop-max.js index eb11fa76..bf3058b0 100644 --- a/test/internal/loop-max.js +++ b/test/internal/loop-max.js @@ -1,118 +1,121 @@ const { assert, skip, test, module: describe, only } = require('qunit'); -const { GPU, WebGLFunctionNode, WebGL2FunctionNode } = require('../../src'); +const { GPU, WebGLFunctionNode, WebGL2FunctionNode } = require('../..'); describe('internal: loop max'); test('loop max output webgl', () => { - const functionNode = new WebGLFunctionNode((function(a, b) { - let sum = 0; - for (let i = 0; i < a; i++) { - sum += b[this.thread.x][i]; + const functionNode = new WebGLFunctionNode( + function (a, b) { + let sum = 0; + for (let i = 0; i < a; i++) { + sum += b[this.thread.x][i]; + } + return sum; + }.toString(), + { + isRootKernel: true, + name: 'kernel', + output: [1], + argumentTypes: ['Number', 'Array'], + lookupFunctionArgumentBitRatio: () => 4, } - return sum; - }).toString(), { - isRootKernel: true, - name: 'kernel', - output: [1], - argumentTypes: ['Number', 'Array'], - lookupFunctionArgumentBitRatio: () => 4, - }); + ); assert.equal( functionNode.toString(), 'void kernel() {' + - '\nfloat user_sum=0.0;' + - '\nint user_i=0;' + - '\nfor (int safeI=0;safeI { - const functionNode = new WebGL2FunctionNode((function(a, b) { - let sum = 0; - for (let i = 0; i < a; i++) { - sum += b[this.thread.x][i]; + const functionNode = new WebGL2FunctionNode( + function (a, b) { + let sum = 0; + for (let i = 0; i < a; i++) { + sum += b[this.thread.x][i]; + } + return sum; + }.toString(), + { + isRootKernel: true, + name: 'kernel', + output: [1], + argumentTypes: ['Number', 'Array'], + lookupFunctionArgumentBitRatio: () => 4, } - return sum; - }).toString(), { - isRootKernel: true, - name: 'kernel', - output: [1], - argumentTypes: ['Number', 'Array'], - lookupFunctionArgumentBitRatio: () => 4, - }); + ); assert.equal( functionNode.toString(), 'void kernel() {' + - '\nfloat user_sum=0.0;' + - '\nint user_i=0;' + - '\nfor (int safeI=0;safeI { - const gpu = new GPU({mode: 'webgl'}); - const add = gpu.createKernel(function(a, b) { - let sum = 0; - for (let i = 0; i < a; i++) { - sum += b[this.thread.x][i]; - } - return sum; - }).setOutput([1]); + const gpu = new GPU({ mode: 'webgl' }); + const add = gpu + .createKernel(function (a, b) { + let sum = 0; + for (let i = 0; i < a; i++) { + sum += b[this.thread.x][i]; + } + return sum; + }) + .setOutput([1]); const output = add(1, [[1]]); - assert.equal( - output[0], - 1 - ); + assert.equal(output[0], 1); gpu.destroy(); }); (GPU.isWebGL2Supported ? test : skip)('loop max webgl2', () => { - const gpu = new GPU({mode: 'webgl2'}); - const add = gpu.createKernel(function(a, b) { - let sum = 0; - for (let i = 0; i < a; i++) { - sum += b[this.thread.x][i]; - } - return sum; - }).setOutput([1]); + const gpu = new GPU({ mode: 'webgl2' }); + const add = gpu + .createKernel(function (a, b) { + let sum = 0; + for (let i = 0; i < a; i++) { + sum += b[this.thread.x][i]; + } + return sum; + }) + .setOutput([1]); const output = add(1, [[1]]); - assert.equal( - output[0], - 1 - ); + assert.equal(output[0], 1); gpu.destroy(); }); (GPU.isHeadlessGLSupported ? test : skip)('loop max headlessgl', () => { const gpu = new GPU({ mode: 'headlessgl' }); - const add = gpu.createKernel(function(a, b) { - let sum = 0; - for (let i = 0; i < a; i++) { - sum += b[this.thread.x][i]; - } - return sum; - }) + const add = gpu + .createKernel(function (a, b) { + let sum = 0; + for (let i = 0; i < a; i++) { + sum += b[this.thread.x][i]; + } + return sum; + }) .setOutput([1]); const output = add(1, [[1]]); - assert.equal( - output[0], - 1 - ); + assert.equal(output[0], 1); gpu.destroy(); }); - diff --git a/test/internal/math.random.js b/test/internal/math.random.js index d7df0d11..f7ae4caf 100644 --- a/test/internal/math.random.js +++ b/test/internal/math.random.js @@ -1,6 +1,9 @@ const { assert, skip, test, module: describe, only } = require('qunit'); const sinon = require('sinon'); -const { GPU, plugins: { mathRandom } } = require('../../src'); +const { + GPU, + plugins: { mathRandom }, +} = require('../..'); describe('Math.random() unique'); @@ -9,27 +12,38 @@ function mathRandomUnique(mode) { const checkCount = 20; let seed1 = Math.random(); let seed2 = Math.random(); - let stub = sinon.stub(mathRandom, 'onBeforeRun').callsFake((kernel) => { + let stub = sinon.stub(mathRandom, 'onBeforeRun').callsFake(kernel => { kernel.setUniform1f('randomSeed1', seed1); kernel.setUniform1f('randomSeed2', seed2); }); try { - gpu.addNativeFunction('getSeed', `highp float getSeed() { + gpu.addNativeFunction( + 'getSeed', + `highp float getSeed() { return randomSeedShift; - }`); - const kernel = gpu.createKernel(function () { - const v = Math.random(); - return getSeed(); - }, {output: [1]}); + }` + ); + const kernel = gpu.createKernel( + function () { + const v = Math.random(); + return getSeed(); + }, + { output: [1] } + ); const results = []; for (let i = 0; i < checkCount; i++) { const result = kernel(); - assert.ok(results.indexOf(result[0]) === -1, `duplication at index ${results.indexOf(result[0])} from new value ${result[0]}. Values ${JSON.stringify(results)}`); + assert.ok( + results.indexOf(result[0]) === -1, + `duplication at index ${results.indexOf(result[0])} from new value ${ + result[0] + }. Values ${JSON.stringify(results)}` + ); results.push(result[0]); seed2 = result[0]; assert.ok(stub.called); stub.restore(); - stub.callsFake((kernel) => { + stub.callsFake(kernel => { kernel.setUniform1f('randomSeed1', seed1); kernel.setUniform1f('randomSeed2', seed2); }); @@ -56,9 +70,12 @@ test('unique every time gpu', () => { mathRandomUnique('webgl2'); }); -(GPU.isHeadlessGLSupported ? test : skip)('unique every time headlessgl', () => { - mathRandomUnique('headlessgl'); -}); +(GPU.isHeadlessGLSupported ? test : skip)( + 'unique every time headlessgl', + () => { + mathRandomUnique('headlessgl'); + } +); describe('never above 1'); @@ -68,7 +85,7 @@ function mathRandomNeverAboveOne(mode) { const checkSource = []; for (let i = 0; i < checkCount; i++) { - checkSource.push(`const check${ i } = Math.random();`); + checkSource.push(`const check${i} = Math.random();`); } for (let i = 0; i < checkCount; i++) { @@ -78,10 +95,13 @@ function mathRandomNeverAboveOne(mode) { } } - const kernel = gpu.createKernel(`function() { + const kernel = gpu.createKernel( + `function() { ${checkSource.join('\n')} return 0; - }`, { output: [1] }); + }`, + { output: [1] } + ); const result = kernel(); assert.ok(result.every(value => value === 0)); @@ -99,13 +119,19 @@ test('never above 1 every time gpu', () => { mathRandomNeverAboveOne('webgl'); }); -(GPU.isWebGL2Supported ? test : skip)('never above 1 every time webgl2', () => { - mathRandomNeverAboveOne('webgl2'); -}); +(GPU.isWebGL2Supported ? test : skip)( + 'never above 1 every time webgl2', + () => { + mathRandomNeverAboveOne('webgl2'); + } +); -(GPU.isHeadlessGLSupported ? test : skip)('never above 1 every time headlessgl', () => { - mathRandomNeverAboveOne('headlessgl'); -}); +(GPU.isHeadlessGLSupported ? test : skip)( + 'never above 1 every time headlessgl', + () => { + mathRandomNeverAboveOne('headlessgl'); + } +); test('never above 1 every time cpu', () => { mathRandomNeverAboveOne('cpu'); diff --git a/test/internal/matrix-multiply-precision.js b/test/internal/matrix-multiply-precision.js index 13327dea..7fb4a344 100644 --- a/test/internal/matrix-multiply-precision.js +++ b/test/internal/matrix-multiply-precision.js @@ -1,5 +1,5 @@ const { assert, skip, test, module: describe, only } = require('qunit'); -const { GPU } = require('../../src'); +const { GPU } = require('../..'); describe('internal: matrix multiply precision'); @@ -24,7 +24,7 @@ function vanillaMatrixMultiply(a, b) { function filledMatrix(width, height) { const matrix = new Array(height); for (let y = 0; y < height; y++) { - const row = matrix[y] = new Float32Array(width); + const row = (matrix[y] = new Float32Array(width)); for (let x = 0; x < width; x++) { row[x] = Math.random() * 10; } @@ -38,19 +38,22 @@ function test512x512Matrix(precision, mode) { const a = filledMatrix(width, height); const b = filledMatrix(width, height); const gpu = new GPU({ mode }); - const kernel = gpu.createKernel(function(a, b) { - let sum = 0; - for (let i = 0; i < this.constants.width; i++) { - sum += a[this.thread.y][i] * b[i][this.thread.x]; - } - return sum; - }, { - output: [width, height], - precision, - constants: { - width + const kernel = gpu.createKernel( + function (a, b) { + let sum = 0; + for (let i = 0; i < this.constants.width; i++) { + sum += a[this.thread.y][i] * b[i][this.thread.x]; + } + return sum; + }, + { + output: [width, height], + precision, + constants: { + width, + }, } - }); + ); const cpuResult = vanillaMatrixMultiply(a, b, width, height); const gpuResult = kernel(a, b); let closeEnough = true; @@ -76,17 +79,26 @@ test('512x512 unsigned precision gpu', () => { test512x512Matrix('unsigned', 'gpu'); }); -(GPU.isWebGLSupported ? test : skip)('512x512 unsigned precision webgl', () => { - test512x512Matrix('unsigned', 'webgl'); -}); +(GPU.isWebGLSupported ? test : skip)( + '512x512 unsigned precision webgl', + () => { + test512x512Matrix('unsigned', 'webgl'); + } +); -(GPU.isWebGL2Supported ? test : skip)('512x512 unsigned precision webgl2', () => { - test512x512Matrix('unsigned', 'webgl2'); -}); +(GPU.isWebGL2Supported ? test : skip)( + '512x512 unsigned precision webgl2', + () => { + test512x512Matrix('unsigned', 'webgl2'); + } +); -(GPU.isHeadlessGLSupported ? test : skip)('512x512 unsigned precision headlessgl', () => { - test512x512Matrix('unsigned', 'headlessgl'); -}); +(GPU.isHeadlessGLSupported ? test : skip)( + '512x512 unsigned precision headlessgl', + () => { + test512x512Matrix('unsigned', 'headlessgl'); + } +); test('512x512 unsigned precision cpu', () => { test512x512Matrix('unsigned', 'cpu'); @@ -98,19 +110,22 @@ function test10x512Matrix(precision, mode) { const a = filledMatrix(width, height); const b = filledMatrix(width, height); const gpu = new GPU({ mode }); - const kernel = gpu.createKernel(function(a, b) { - let sum = 0; - for (let i = 0; i < this.constants.width; i++) { - sum += a[this.thread.y][i] * b[i][this.thread.x]; - } - return sum; - }, { - output: [width, height], - precision, - constants: { - width + const kernel = gpu.createKernel( + function (a, b) { + let sum = 0; + for (let i = 0; i < this.constants.width; i++) { + sum += a[this.thread.y][i] * b[i][this.thread.x]; + } + return sum; + }, + { + output: [width, height], + precision, + constants: { + width, + }, } - }); + ); const cpuResult = vanillaMatrixMultiply(a, b, width, height); const gpuResult = kernel(a, b); let closeEnough = true; @@ -140,62 +155,97 @@ test('10x512 unsigned precision gpu', () => { test10x512Matrix('unsigned', 'webgl'); }); -(GPU.isWebGL2Supported ? test : skip)('10x512 unsigned precision webgl2', () => { - test10x512Matrix('unsigned', 'webgl2'); -}); +(GPU.isWebGL2Supported ? test : skip)( + '10x512 unsigned precision webgl2', + () => { + test10x512Matrix('unsigned', 'webgl2'); + } +); -(GPU.isHeadlessGLSupported ? test : skip)('10x512 unsigned precision headlessgl', () => { - test10x512Matrix('unsigned', 'headlessgl'); -}); +(GPU.isHeadlessGLSupported ? test : skip)( + '10x512 unsigned precision headlessgl', + () => { + test10x512Matrix('unsigned', 'headlessgl'); + } +); test('10x512 unsigned precision cpu', () => { test10x512Matrix('unsigned', 'cpu'); }); -(GPU.isSinglePrecisionSupported ? test : skip)('512x512 single precision auto', () => { - test512x512Matrix('single'); -}); +(GPU.isSinglePrecisionSupported ? test : skip)( + '512x512 single precision auto', + () => { + test512x512Matrix('single'); + } +); -(GPU.isSinglePrecisionSupported ? test : skip)('512x512 single precision gpu', () => { - test512x512Matrix('single', 'gpu'); -}); +(GPU.isSinglePrecisionSupported ? test : skip)( + '512x512 single precision gpu', + () => { + test512x512Matrix('single', 'gpu'); + } +); -(GPU.isWebGLSupported && GPU.isSinglePrecisionSupported ? test : skip)('512x512 single precision webgl', () => { - test512x512Matrix('single', 'webgl'); -}); +(GPU.isWebGLSupported && GPU.isSinglePrecisionSupported ? test : skip)( + '512x512 single precision webgl', + () => { + test512x512Matrix('single', 'webgl'); + } +); -(GPU.isWebGL2Supported && GPU.isSinglePrecisionSupported ? test : skip)('512x512 single precision webgl2', () => { - test512x512Matrix('single', 'webgl2'); -}); +(GPU.isWebGL2Supported && GPU.isSinglePrecisionSupported ? test : skip)( + '512x512 single precision webgl2', + () => { + test512x512Matrix('single', 'webgl2'); + } +); -(GPU.isHeadlessGLSupported && GPU.isSinglePrecisionSupported ? test : skip)('512x512 single precision headlessgl', () => { - test512x512Matrix('single', 'headlessgl'); -}); +(GPU.isHeadlessGLSupported && GPU.isSinglePrecisionSupported ? test : skip)( + '512x512 single precision headlessgl', + () => { + test512x512Matrix('single', 'headlessgl'); + } +); test('512x512 single precision cpu', () => { test512x512Matrix('single', 'cpu'); }); +(GPU.isSinglePrecisionSupported ? test : skip)( + '10x512 single precision auto', + () => { + test10x512Matrix('single'); + } +); -(GPU.isSinglePrecisionSupported ? test : skip)('10x512 single precision auto', () => { - test10x512Matrix('single'); -}); - -(GPU.isSinglePrecisionSupported ? test : skip)('10x512 single precision gpu', () => { - test10x512Matrix('single', 'gpu'); -}); +(GPU.isSinglePrecisionSupported ? test : skip)( + '10x512 single precision gpu', + () => { + test10x512Matrix('single', 'gpu'); + } +); -(GPU.isWebGLSupported && GPU.isSinglePrecisionSupported ? test : skip)('10x512 single precision webgl', () => { - test10x512Matrix('single', 'webgl'); -}); +(GPU.isWebGLSupported && GPU.isSinglePrecisionSupported ? test : skip)( + '10x512 single precision webgl', + () => { + test10x512Matrix('single', 'webgl'); + } +); -(GPU.isWebGL2Supported && GPU.isSinglePrecisionSupported ? test : skip)('10x512 single precision webgl2', () => { - test10x512Matrix('single', 'webgl2'); -}); +(GPU.isWebGL2Supported && GPU.isSinglePrecisionSupported ? test : skip)( + '10x512 single precision webgl2', + () => { + test10x512Matrix('single', 'webgl2'); + } +); -(GPU.isHeadlessGLSupported && GPU.isSinglePrecisionSupported ? test : skip)('10x512 single precision headlessgl', () => { - test10x512Matrix('single', 'headlessgl'); -}); +(GPU.isHeadlessGLSupported && GPU.isSinglePrecisionSupported ? test : skip)( + '10x512 single precision headlessgl', + () => { + test10x512Matrix('single', 'headlessgl'); + } +); test('10x512 single precision cpu', () => { test10x512Matrix('precision', 'cpu'); diff --git a/test/internal/mixed-memory-optimize.js b/test/internal/mixed-memory-optimize.js index 00b527cf..a39d9e03 100644 --- a/test/internal/mixed-memory-optimize.js +++ b/test/internal/mixed-memory-optimize.js @@ -1,12 +1,13 @@ const { assert, skip, test, module: describe, only } = require('qunit'); -const { GPU } = require('../../src'); +const { GPU } = require('../..'); describe('internal: mixed memory optimize'); function getOffKernel(gpu) { - return gpu.createKernel(function(value) { - return value[this.thread.x]; - }) // getFloatFromSampler2D + return gpu + .createKernel(function (value) { + return value[this.thread.x]; + }) // getFloatFromSampler2D .setPrecision('single') .setOutput([10]) .setPipeline(true) @@ -14,9 +15,10 @@ function getOffKernel(gpu) { } function getOnKernel(gpu) { - return gpu.createKernel(function(value) { - return value[this.thread.x]; - }) // getMemoryOptimized32 + return gpu + .createKernel(function (value) { + return value[this.thread.x]; + }) // getMemoryOptimized32 .setPrecision('single') .setOutput([10]) .setPipeline(true) @@ -27,7 +29,7 @@ function offOnOff(mode) { const gpu = new GPU({ mode }); const offKernel = getOffKernel(gpu); const onKernel = getOnKernel(gpu); - const value = [1,2,3,4,5,6,7,8,9,10]; + const value = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]; const textureResult = offKernel(value); assert.deepEqual(Array.from(textureResult.toArray()), value); assert.deepEqual(Array.from(onKernel(offKernel(value)).toArray()), value); @@ -40,21 +42,33 @@ function offOnOff(mode) { offOnOff(); }); -(GPU.isGPUSupported && GPU.isSinglePrecisionSupported ? test : skip)('off on off gpu', () => { - offOnOff('gpu'); -}); - -(GPU.isWebGLSupported && GPU.isSinglePrecisionSupported ? test : skip)('off on off webgl', () => { - offOnOff('webgl'); -}); - -(GPU.isWebGL2Supported && GPU.isSinglePrecisionSupported ? test : skip)('off on off webgl2', () => { - offOnOff('webgl2'); -}); - -(GPU.isHeadlessGLSupported && GPU.isSinglePrecisionSupported ? test : skip)('off on off headlessgl', () => { - offOnOff('headlessgl'); -}); +(GPU.isGPUSupported && GPU.isSinglePrecisionSupported ? test : skip)( + 'off on off gpu', + () => { + offOnOff('gpu'); + } +); + +(GPU.isWebGLSupported && GPU.isSinglePrecisionSupported ? test : skip)( + 'off on off webgl', + () => { + offOnOff('webgl'); + } +); + +(GPU.isWebGL2Supported && GPU.isSinglePrecisionSupported ? test : skip)( + 'off on off webgl2', + () => { + offOnOff('webgl2'); + } +); + +(GPU.isHeadlessGLSupported && GPU.isSinglePrecisionSupported ? test : skip)( + 'off on off headlessgl', + () => { + offOnOff('headlessgl'); + } +); test('off on off cpu', () => { assert.throws(() => { @@ -62,12 +76,11 @@ test('off on off cpu', () => { }); }); - function onOffOn(mode) { const gpu = new GPU({ mode }); const onKernel = getOnKernel(gpu); const offKernel = getOffKernel(gpu); - const value = [1,2,3,4,5,6,7,8,9,10]; + const value = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]; const textureResult1 = onKernel(value); const textureResult2 = offKernel(onKernel(value)); @@ -87,21 +100,33 @@ function onOffOn(mode) { onOffOn(); }); -(GPU.isGPUSupported && GPU.isSinglePrecisionSupported ? test : skip)('on off on gpu', () => { - onOffOn('gpu'); -}); - -(GPU.isWebGLSupported && GPU.isSinglePrecisionSupported ? test : skip)('on off on webgl', () => { - onOffOn('webgl'); -}); - -(GPU.isWebGL2Supported && GPU.isSinglePrecisionSupported ? test : skip)('on off on webgl2', () => { - onOffOn('webgl2'); -}); - -(GPU.isHeadlessGLSupported && GPU.isSinglePrecisionSupported ? test : skip)('on off on headlessgl', () => { - onOffOn('headlessgl'); -}); +(GPU.isGPUSupported && GPU.isSinglePrecisionSupported ? test : skip)( + 'on off on gpu', + () => { + onOffOn('gpu'); + } +); + +(GPU.isWebGLSupported && GPU.isSinglePrecisionSupported ? test : skip)( + 'on off on webgl', + () => { + onOffOn('webgl'); + } +); + +(GPU.isWebGL2Supported && GPU.isSinglePrecisionSupported ? test : skip)( + 'on off on webgl2', + () => { + onOffOn('webgl2'); + } +); + +(GPU.isHeadlessGLSupported && GPU.isSinglePrecisionSupported ? test : skip)( + 'on off on headlessgl', + () => { + onOffOn('headlessgl'); + } +); test('on off on cpu', () => { assert.throws(() => { diff --git a/test/internal/modes.js b/test/internal/modes.js index 997c9770..fb10e43e 100644 --- a/test/internal/modes.js +++ b/test/internal/modes.js @@ -1,5 +1,11 @@ const { assert, skip, test, module: describe } = require('qunit'); -const { GPU, WebGLKernel, WebGL2Kernel, HeadlessGLKernel, CPUKernel } = require('../../src'); +const { + GPU, + WebGLKernel, + WebGL2Kernel, + HeadlessGLKernel, + CPUKernel, +} = require('../..'); describe('internal: modes'); @@ -57,6 +63,5 @@ test('modes cpu', () => { }); (GPU.isHeadlessGLSupported ? test : skip)('modes headlessgl', () => { const gpu = new GPU({ mode: 'headlessgl' }); - assert.equal(gpu.Kernel, HeadlessGLKernel - ); + assert.equal(gpu.Kernel, HeadlessGLKernel); }); diff --git a/test/internal/overloading.js b/test/internal/overloading.js index 209d3df1..0c25e528 100644 --- a/test/internal/overloading.js +++ b/test/internal/overloading.js @@ -1,5 +1,5 @@ const { assert, skip, test, module: describe } = require('qunit'); -const { GPU } = require('../../src'); +const { GPU } = require('../..'); describe('internal: overloading'); // TODO: planned for after v2, overload generated functions so as to cut down on casting @@ -8,20 +8,26 @@ describe('internal: overloading'); // TODO: Look into test('with Han', () => { const gpu = new GPU(); - gpu.addFunction(function dbl(v) { - return v + v; - }, { returnType: "Float", argumentTypes: { v: "Float" } }); + gpu.addFunction( + function dbl(v) { + return v + v; + }, + { returnType: 'Float', argumentTypes: { v: 'Float' } } + ); try { - const kernel = gpu.createKernel(function(v) { - // const output2 = dbl(2); - let sum = 0; - for (let i = 0; i < 1; i++) { - dbl(i); - } - // const output1 - dbl(Math.PI); - return sum; - }, { output: [1] }); + const kernel = gpu.createKernel( + function (v) { + // const output2 = dbl(2); + let sum = 0; + for (let i = 0; i < 1; i++) { + dbl(i); + } + // const output1 + dbl(Math.PI); + return sum; + }, + { output: [1] } + ); } finally { gpu.destroy(); } diff --git a/test/internal/precision.js b/test/internal/precision.js index e3f06cec..e7b5e16e 100644 --- a/test/internal/precision.js +++ b/test/internal/precision.js @@ -1,19 +1,23 @@ const { assert, skip, test, module: describe } = require('qunit'); -const { GPU } = require('../../src'); +const { GPU } = require('../..'); describe('internal: precision'); (GPU.isWebGLSupported ? test : skip)('WebGL Decimal Precision', () => { - const gpu = new GPU({mode: 'webgl'}); - const add = gpu.createKernel(function(a, b) { - return a + b; - }).setOutput([1]); + const gpu = new GPU({ mode: 'webgl' }); + const add = gpu + .createKernel(function (a, b) { + return a + b; + }) + .setOutput([1]); let addResult = add(0.1, 0.2)[0]; assert.equal(addResult.toFixed(7), (0.1 + 0.2).toFixed(7)); - const reflectValue = gpu.createKernel(function(a) { - return a; - }).setOutput([1]); + const reflectValue = gpu + .createKernel(function (a) { + return a; + }) + .setOutput([1]); //Just for sanity's sake, recurse the value to see if it spirals out of control for (let i = 0; i < 100; i++) { @@ -25,16 +29,20 @@ describe('internal: precision'); }); (GPU.isWebGL2Supported ? test : skip)('WebGL2 Decimal Precision', () => { - const gpu = new GPU({mode: 'webgl2'}); - const add = gpu.createKernel(function(a, b) { - return a + b; - }).setOutput([1]); + const gpu = new GPU({ mode: 'webgl2' }); + const add = gpu + .createKernel(function (a, b) { + return a + b; + }) + .setOutput([1]); let addResult = add(0.1, 0.2)[0]; assert.equal(addResult.toFixed(7), (0.1 + 0.2).toFixed(7)); - const reflectValue = gpu.createKernel(function(a) { - return a; - }).setOutput([1]); + const reflectValue = gpu + .createKernel(function (a) { + return a; + }) + .setOutput([1]); //Just for sanity's sake, recurse the value to see if it spirals out of control for (let i = 0; i < 100; i++) { @@ -45,23 +53,30 @@ describe('internal: precision'); gpu.destroy(); }); -(GPU.isHeadlessGLSupported ? test : skip)('HeadlessGL Decimal Precision', () => { - const gpu = new GPU({mode: 'headlessgl'}); - const add = gpu.createKernel(function(a, b) { - return a + b; - }).setOutput([1]); - let addResult = add(0.1, 0.2)[0]; - assert.equal(addResult.toFixed(7), (0.1 + 0.2).toFixed(7)); +(GPU.isHeadlessGLSupported ? test : skip)( + 'HeadlessGL Decimal Precision', + () => { + const gpu = new GPU({ mode: 'headlessgl' }); + const add = gpu + .createKernel(function (a, b) { + return a + b; + }) + .setOutput([1]); + let addResult = add(0.1, 0.2)[0]; + assert.equal(addResult.toFixed(7), (0.1 + 0.2).toFixed(7)); - const reflectValue = gpu.createKernel(function(a) { - return a; - }).setOutput([1]); + const reflectValue = gpu + .createKernel(function (a) { + return a; + }) + .setOutput([1]); - //Just for sanity's sake, recurse the value to see if it spirals out of control - for (let i = 0; i < 100; i++) { - const newAddResult = reflectValue(addResult)[0]; - assert.equal(newAddResult, addResult); - addResult = newAddResult; + //Just for sanity's sake, recurse the value to see if it spirals out of control + for (let i = 0; i < 100; i++) { + const newAddResult = reflectValue(addResult)[0]; + assert.equal(newAddResult, addResult); + addResult = newAddResult; + } + gpu.destroy(); } - gpu.destroy(); -}); +); diff --git a/test/internal/recycling.js b/test/internal/recycling.js index 68f9d92c..9044c9b4 100644 --- a/test/internal/recycling.js +++ b/test/internal/recycling.js @@ -1,21 +1,27 @@ const sinon = require('sinon'); const { assert, skip, test, module: describe, only } = require('qunit'); -const { GPU } = require('../../src'); +const { GPU } = require('../..'); describe('internal: recycling'); function testImmutableKernelTextureRecycling(precision, mode) { const gpu = new GPU({ mode }); - const kernel = gpu.createKernel(function(v) { - return v[0] + 1; - }, { - output: [1], - pipeline: true, - immutable: true, - precision, - }); + const kernel = gpu.createKernel( + function (v) { + return v[0] + 1; + }, + { + output: [1], + pipeline: true, + immutable: true, + precision, + } + ); let result = kernel([0]); - const newTextureSpy = sinon.spy(kernel.texture.constructor.prototype, 'newTexture'); + const newTextureSpy = sinon.spy( + kernel.texture.constructor.prototype, + 'newTexture' + ); for (let i = 0; i < 10; i++) { let lastResult = result; result = kernel(result); @@ -29,63 +35,89 @@ function testImmutableKernelTextureRecycling(precision, mode) { } test('immutable single precision kernel auto', () => { - testImmutableKernelTextureRecycling('single') + testImmutableKernelTextureRecycling('single'); }); test('immutable single precision kernel gpu', () => { testImmutableKernelTextureRecycling('single', 'gpu'); }); -(GPU.isWebGLSupported ? test : skip)('immutable single precision kernel webgl', () => { - testImmutableKernelTextureRecycling('single', 'webgl'); -}); +(GPU.isWebGLSupported ? test : skip)( + 'immutable single precision kernel webgl', + () => { + testImmutableKernelTextureRecycling('single', 'webgl'); + } +); -(GPU.isWebGL2Supported ? test : skip)('immutable single precision kernel webgl2', () => { - testImmutableKernelTextureRecycling('single', 'webgl2'); -}); +(GPU.isWebGL2Supported ? test : skip)( + 'immutable single precision kernel webgl2', + () => { + testImmutableKernelTextureRecycling('single', 'webgl2'); + } +); -(GPU.isHeadlessGLSupported ? test : skip)('immutable single precision kernel headlessgl', () => { - testImmutableKernelTextureRecycling('single', 'headlessgl'); -}); +(GPU.isHeadlessGLSupported ? test : skip)( + 'immutable single precision kernel headlessgl', + () => { + testImmutableKernelTextureRecycling('single', 'headlessgl'); + } +); test('immutable unsigned precision kernel auto', () => { - testImmutableKernelTextureRecycling('unsigned') + testImmutableKernelTextureRecycling('unsigned'); }); test('immutable unsigned precision kernel gpu', () => { testImmutableKernelTextureRecycling('unsigned', 'gpu'); }); -(GPU.isWebGLSupported ? test : skip)('immutable unsigned precision kernel webgl', () => { - testImmutableKernelTextureRecycling('unsigned', 'webgl'); -}); +(GPU.isWebGLSupported ? test : skip)( + 'immutable unsigned precision kernel webgl', + () => { + testImmutableKernelTextureRecycling('unsigned', 'webgl'); + } +); -(GPU.isWebGL2Supported ? test : skip)('immutable unsigned precision kernel webgl2', () => { - testImmutableKernelTextureRecycling('unsigned', 'webgl2'); -}); +(GPU.isWebGL2Supported ? test : skip)( + 'immutable unsigned precision kernel webgl2', + () => { + testImmutableKernelTextureRecycling('unsigned', 'webgl2'); + } +); -(GPU.isHeadlessGLSupported ? test : skip)('immutable unsigned precision headlessgl', () => { - testImmutableKernelTextureRecycling('unsigned', 'headlessgl'); -}); +(GPU.isHeadlessGLSupported ? test : skip)( + 'immutable unsigned precision headlessgl', + () => { + testImmutableKernelTextureRecycling('unsigned', 'headlessgl'); + } +); function testImmutableMappedKernelTextureRecycling(precision, mode) { const gpu = new GPU({ mode }); + function oneOff(value) { return value; } - const kernel = gpu.createKernelMap({ - oneOffValue: oneOff - },function(value1, value2) { - oneOff(value2[0] - 1); - return value1[0] + 1; - }, { - output: [1], - pipeline: true, - immutable: true, - precision, - }); + const kernel = gpu.createKernelMap( + { + oneOffValue: oneOff, + }, + function (value1, value2) { + oneOff(value2[0] - 1); + return value1[0] + 1; + }, + { + output: [1], + pipeline: true, + immutable: true, + precision, + } + ); let map = kernel([0], [11]); - const newTextureSpy = sinon.spy(kernel.texture.constructor.prototype, 'newTexture'); + const newTextureSpy = sinon.spy( + kernel.texture.constructor.prototype, + 'newTexture' + ); for (let i = 0; i < 10; i++) { let lastResults = map; map = kernel(map.result, map.oneOffValue); @@ -101,55 +133,76 @@ function testImmutableMappedKernelTextureRecycling(precision, mode) { } test('immutable single precision mapped kernel auto', () => { - testImmutableMappedKernelTextureRecycling('single') + testImmutableMappedKernelTextureRecycling('single'); }); test('immutable single precision mapped kernel gpu', () => { testImmutableMappedKernelTextureRecycling('single', 'gpu'); }); -(GPU.isWebGLSupported ? test : skip)('immutable single precision mapped kernel webgl', () => { - testImmutableMappedKernelTextureRecycling('single', 'webgl'); -}); +(GPU.isWebGLSupported ? test : skip)( + 'immutable single precision mapped kernel webgl', + () => { + testImmutableMappedKernelTextureRecycling('single', 'webgl'); + } +); -(GPU.isWebGL2Supported ? test : skip)('immutable single precision mapped kernel webgl2', () => { - testImmutableMappedKernelTextureRecycling('single', 'webgl2'); -}); +(GPU.isWebGL2Supported ? test : skip)( + 'immutable single precision mapped kernel webgl2', + () => { + testImmutableMappedKernelTextureRecycling('single', 'webgl2'); + } +); -(GPU.isHeadlessGLSupported ? test : skip)('immutable single precision mapped kernel headlessgl', () => { - testImmutableMappedKernelTextureRecycling('single', 'headlessgl'); -}); +(GPU.isHeadlessGLSupported ? test : skip)( + 'immutable single precision mapped kernel headlessgl', + () => { + testImmutableMappedKernelTextureRecycling('single', 'headlessgl'); + } +); test('immutable unsigned precision mapped kernel auto', () => { - testImmutableMappedKernelTextureRecycling('unsigned') + testImmutableMappedKernelTextureRecycling('unsigned'); }); test('immutable unsigned precision mapped kernel gpu', () => { testImmutableMappedKernelTextureRecycling('unsigned', 'gpu'); }); -(GPU.isWebGLSupported ? test : skip)('immutable unsigned precision mapped kernel webgl', () => { - testImmutableMappedKernelTextureRecycling('unsigned', 'webgl'); -}); +(GPU.isWebGLSupported ? test : skip)( + 'immutable unsigned precision mapped kernel webgl', + () => { + testImmutableMappedKernelTextureRecycling('unsigned', 'webgl'); + } +); -(GPU.isWebGL2Supported ? test : skip)('immutable unsigned precision mapped kernel webgl2', () => { - testImmutableMappedKernelTextureRecycling('unsigned', 'webgl2'); -}); +(GPU.isWebGL2Supported ? test : skip)( + 'immutable unsigned precision mapped kernel webgl2', + () => { + testImmutableMappedKernelTextureRecycling('unsigned', 'webgl2'); + } +); -(GPU.isHeadlessGLSupported ? test : skip)('immutable unsigned precision mapped kernel headlessgl', () => { - testImmutableMappedKernelTextureRecycling('unsigned', 'headlessgl'); -}); +(GPU.isHeadlessGLSupported ? test : skip)( + 'immutable unsigned precision mapped kernel headlessgl', + () => { + testImmutableMappedKernelTextureRecycling('unsigned', 'headlessgl'); + } +); function testImmutableTextureDelete(precision, done, mode) { const gpu = new GPU({ mode }); - const kernel = gpu.createKernel(function() { - return this.thread.x; - }, { - output: [1], - pipeline: true, - immutable: true, - precision, - }); + const kernel = gpu.createKernel( + function () { + return this.thread.x; + }, + { + output: [1], + pipeline: true, + immutable: true, + precision, + } + ); const result = kernel(); assert.equal(result.texture._refs, 2); const clone1 = result.clone(); @@ -176,14 +229,13 @@ function testImmutableTextureDelete(precision, done, mode) { result.delete(); assert.equal(result.texture._refs, 1); const spy = sinon.spy(kernel.kernel.context, 'deleteTexture'); - gpu.destroy() - .then(() => { - assert.equal(result.texture._refs, 0); - assert.equal(spy.callCount, 1); - assert.ok(spy.calledWith(result.texture)); - spy.restore(); - done(); - }); + gpu.destroy().then(() => { + assert.equal(result.texture._refs, 0); + assert.equal(spy.callCount, 1); + assert.ok(spy.calledWith(result.texture)); + spy.restore(); + done(); + }); } test('immutable single precision texture delete auto', t => { @@ -194,48 +246,69 @@ test('immutable single precision texture delete gpu', t => { testImmutableTextureDelete('single', t.async(), 'gpu'); }); -(GPU.isWebGLSupported ? test : skip)('immutable single precision texture delete webgl', t => { - testImmutableTextureDelete('single', t.async(), 'webgl'); -}); +(GPU.isWebGLSupported ? test : skip)( + 'immutable single precision texture delete webgl', + t => { + testImmutableTextureDelete('single', t.async(), 'webgl'); + } +); -(GPU.isWebGL2Supported ? test : skip)('immutable single precision texture delete webgl2', t => { - testImmutableTextureDelete('single', t.async(), 'webgl2'); -}); +(GPU.isWebGL2Supported ? test : skip)( + 'immutable single precision texture delete webgl2', + t => { + testImmutableTextureDelete('single', t.async(), 'webgl2'); + } +); -(GPU.isHeadlessGLSupported ? test : skip)('immutable single precision texture delete headlessgl', t => { - testImmutableTextureDelete('single', t.async(), 'headlessgl'); -}); +(GPU.isHeadlessGLSupported ? test : skip)( + 'immutable single precision texture delete headlessgl', + t => { + testImmutableTextureDelete('single', t.async(), 'headlessgl'); + } +); test('immutable unsigned precision texture delete auto', t => { - testImmutableTextureDelete('unsigned', t.async() ); + testImmutableTextureDelete('unsigned', t.async()); }); test('immutable unsigned precision texture delete gpu', t => { testImmutableTextureDelete('unsigned', t.async(), 'gpu'); }); -(GPU.isWebGLSupported ? test : skip)('immutable unsigned precision texture delete webgl', t => { - testImmutableTextureDelete('unsigned', t.async(), 'webgl'); -}); +(GPU.isWebGLSupported ? test : skip)( + 'immutable unsigned precision texture delete webgl', + t => { + testImmutableTextureDelete('unsigned', t.async(), 'webgl'); + } +); -(GPU.isWebGL2Supported ? test : skip)('immutable unsigned precision texture delete webgl2', t => { - testImmutableTextureDelete('unsigned', t.async(), 'webgl2'); -}); +(GPU.isWebGL2Supported ? test : skip)( + 'immutable unsigned precision texture delete webgl2', + t => { + testImmutableTextureDelete('unsigned', t.async(), 'webgl2'); + } +); -(GPU.isHeadlessGLSupported ? test : skip)('immutable unsigned precision texture delete headlessgl', t => { - testImmutableTextureDelete('unsigned', t.async(), 'headlessgl'); -}); +(GPU.isHeadlessGLSupported ? test : skip)( + 'immutable unsigned precision texture delete headlessgl', + t => { + testImmutableTextureDelete('unsigned', t.async(), 'headlessgl'); + } +); function testImmutableKernelTextureDoesNotLeak(precision, done, mode) { const gpu = new GPU({ mode }); - const toTexture = gpu.createKernel(function(value) { - return value[this.thread.x]; - }, { - output: [1], - pipeline: true, - immutable: true, - precision, - }); + const toTexture = gpu.createKernel( + function (value) { + return value[this.thread.x]; + }, + { + output: [1], + pipeline: true, + immutable: true, + precision, + } + ); const one = toTexture([1]); assert.equal(one.texture._refs, 2); // one's texture will be used in two places at first, in one and toTexture.texture assert.equal(toTexture.texture.texture, one.texture); // very important, a clone was mode, but not a deep clone @@ -251,11 +324,10 @@ function testImmutableKernelTextureDoesNotLeak(precision, done, mode) { assert.equal(two.texture._refs, 1); // still used by toTexture.texture two.delete(); // already deleted assert.equal(two.texture._refs, 1); // still used by toTexture - gpu.destroy() - .then(() => { - assert.equal(two.texture._refs, 0); - done(); - }); + gpu.destroy().then(() => { + assert.equal(two.texture._refs, 0); + done(); + }); } test('immutable unsigned precision kernel.texture does not leak auto', t => { @@ -266,17 +338,26 @@ test('immutable unsigned precision kernel.texture does not leak gpu', t => { testImmutableKernelTextureDoesNotLeak('unsigned', t.async(), 'gpu'); }); -(GPU.isWebGLSupported ? test : skip)('immutable unsigned precision kernel.texture does not leak webgl', t => { - testImmutableKernelTextureDoesNotLeak('unsigned', t.async(), 'webgl'); -}); +(GPU.isWebGLSupported ? test : skip)( + 'immutable unsigned precision kernel.texture does not leak webgl', + t => { + testImmutableKernelTextureDoesNotLeak('unsigned', t.async(), 'webgl'); + } +); -(GPU.isWebGL2Supported ? test : skip)('immutable unsigned precision kernel.texture does not leak webgl2', t => { - testImmutableKernelTextureDoesNotLeak('unsigned', t.async(), 'webgl2'); -}); +(GPU.isWebGL2Supported ? test : skip)( + 'immutable unsigned precision kernel.texture does not leak webgl2', + t => { + testImmutableKernelTextureDoesNotLeak('unsigned', t.async(), 'webgl2'); + } +); -(GPU.isHeadlessGLSupported ? test : skip)('immutable unsigned precision kernel.texture does not leak headlessgl', t => { - testImmutableKernelTextureDoesNotLeak('unsigned', t.async(), 'headlessgl'); -}); +(GPU.isHeadlessGLSupported ? test : skip)( + 'immutable unsigned precision kernel.texture does not leak headlessgl', + t => { + testImmutableKernelTextureDoesNotLeak('unsigned', t.async(), 'headlessgl'); + } +); test('immutable single precision kernel.texture does not leak auto', t => { testImmutableKernelTextureDoesNotLeak('single', t.async()); @@ -286,32 +367,46 @@ test('immutable single precision kernel.texture does not leak gpu', t => { testImmutableKernelTextureDoesNotLeak('single', t.async(), 'gpu'); }); -(GPU.isWebGLSupported ? test : skip)('immutable single precision kernel.texture does not leak webgl', t => { - testImmutableKernelTextureDoesNotLeak('single', t.async(), 'webgl'); -}); +(GPU.isWebGLSupported ? test : skip)( + 'immutable single precision kernel.texture does not leak webgl', + t => { + testImmutableKernelTextureDoesNotLeak('single', t.async(), 'webgl'); + } +); -(GPU.isWebGL2Supported ? test : skip)('immutable single precision kernel.texture does not leak webgl2', t => { - testImmutableKernelTextureDoesNotLeak('single', t.async(), 'webgl2'); -}); +(GPU.isWebGL2Supported ? test : skip)( + 'immutable single precision kernel.texture does not leak webgl2', + t => { + testImmutableKernelTextureDoesNotLeak('single', t.async(), 'webgl2'); + } +); -(GPU.isHeadlessGLSupported ? test : skip)('immutable single precision kernel.texture does not leak headlessgl', t => { - testImmutableKernelTextureDoesNotLeak('single', t.async(), 'headlessgl'); -}); +(GPU.isHeadlessGLSupported ? test : skip)( + 'immutable single precision kernel.texture does not leak headlessgl', + t => { + testImmutableKernelTextureDoesNotLeak('single', t.async(), 'headlessgl'); + } +); function testImmutableKernelMappedTexturesDoesNotLeak(precision, done, mode) { const gpu = new GPU({ mode }); + function saveValue(value) { return value; } - const toTextures = gpu.createKernelMap([saveValue],function(value1, value2) { - saveValue(value1[this.thread.x]); - return value2[this.thread.x]; - }, { - output: [1], - pipeline: true, - immutable: true, - precision, - }); + const toTextures = gpu.createKernelMap( + [saveValue], + function (value1, value2) { + saveValue(value1[this.thread.x]); + return value2[this.thread.x]; + }, + { + output: [1], + pipeline: true, + immutable: true, + precision, + } + ); const { result: one, 0: two } = toTextures([1], [2]); assert.equal(one.texture._refs, 2); // one's texture will be used in two places at first, in one and toTexture.texture assert.equal(two.texture._refs, 2); // one's texture will be used in two places at first, in one and toTexture.mappedTextures[0] @@ -340,14 +435,13 @@ function testImmutableKernelMappedTexturesDoesNotLeak(precision, done, mode) { four.delete(); // already deleted assert.equal(three.texture._refs, 1); // still used by toTexture assert.equal(four.texture._refs, 1); // still used by toTexture - gpu.destroy() - .then(() => { - assert.equal(one.texture._refs, 0); - assert.equal(two.texture._refs, 0); - assert.equal(three.texture._refs, 0); - assert.equal(four.texture._refs, 0); - done(); - }); + gpu.destroy().then(() => { + assert.equal(one.texture._refs, 0); + assert.equal(two.texture._refs, 0); + assert.equal(three.texture._refs, 0); + assert.equal(four.texture._refs, 0); + done(); + }); } test('immutable unsigned precision kernel.mappedTextures does not leak auto', t => { @@ -358,17 +452,38 @@ test('immutable unsigned precision kernel.mappedTextures does not leak gpu', t = testImmutableKernelMappedTexturesDoesNotLeak('unsigned', t.async(), 'gpu'); }); -(GPU.isWebGLSupported ? test : skip)('immutable unsigned precision kernel.mappedTextures does not leak webgl', t => { - testImmutableKernelMappedTexturesDoesNotLeak('unsigned', t.async(), 'webgl'); -}); - -(GPU.isWebGL2Supported ? test : skip)('immutable unsigned precision kernel.mappedTextures does not leak webgl2', t => { - testImmutableKernelMappedTexturesDoesNotLeak('unsigned', t.async(), 'webgl2'); -}); - -(GPU.isHeadlessGLSupported ? test : skip)('immutable unsigned precision kernel.mappedTextures does not leak headlessgl', t => { - testImmutableKernelMappedTexturesDoesNotLeak('unsigned', t.async(), 'headlessgl'); -}); +(GPU.isWebGLSupported ? test : skip)( + 'immutable unsigned precision kernel.mappedTextures does not leak webgl', + t => { + testImmutableKernelMappedTexturesDoesNotLeak( + 'unsigned', + t.async(), + 'webgl' + ); + } +); + +(GPU.isWebGL2Supported ? test : skip)( + 'immutable unsigned precision kernel.mappedTextures does not leak webgl2', + t => { + testImmutableKernelMappedTexturesDoesNotLeak( + 'unsigned', + t.async(), + 'webgl2' + ); + } +); + +(GPU.isHeadlessGLSupported ? test : skip)( + 'immutable unsigned precision kernel.mappedTextures does not leak headlessgl', + t => { + testImmutableKernelMappedTexturesDoesNotLeak( + 'unsigned', + t.async(), + 'headlessgl' + ); + } +); test('immutable single precision kernel.mappedTextures does not leak auto', t => { testImmutableKernelMappedTexturesDoesNotLeak('single', t.async()); @@ -378,23 +493,43 @@ test('immutable single precision kernel.mappedTextures does not leak gpu', t => testImmutableKernelMappedTexturesDoesNotLeak('single', t.async(), 'gpu'); }); -(GPU.isWebGLSupported ? test : skip)('immutable single precision kernel.mappedTextures does not leak webgl', t => { - testImmutableKernelMappedTexturesDoesNotLeak('single', t.async(), 'webgl'); -}); - -(GPU.isWebGL2Supported ? test : skip)('immutable single precision kernel.mappedTextures does not leak webgl2', t => { - testImmutableKernelMappedTexturesDoesNotLeak('single', t.async(), 'webgl2'); -}); - -(GPU.isHeadlessGLSupported ? test : skip)('immutable single precision kernel.mappedTextures does not leak headlessgl', t => { - testImmutableKernelMappedTexturesDoesNotLeak('single', t.async(), 'headlessgl'); -}); +(GPU.isWebGLSupported ? test : skip)( + 'immutable single precision kernel.mappedTextures does not leak webgl', + t => { + testImmutableKernelMappedTexturesDoesNotLeak('single', t.async(), 'webgl'); + } +); + +(GPU.isWebGL2Supported ? test : skip)( + 'immutable single precision kernel.mappedTextures does not leak webgl2', + t => { + testImmutableKernelMappedTexturesDoesNotLeak( + 'single', + t.async(), + 'webgl2' + ); + } +); + +(GPU.isHeadlessGLSupported ? test : skip)( + 'immutable single precision kernel.mappedTextures does not leak headlessgl', + t => { + testImmutableKernelMappedTexturesDoesNotLeak( + 'single', + t.async(), + 'headlessgl' + ); + } +); function testCloning(mode) { const gpu = new GPU({ mode }); - const kernel = gpu.createKernel(function(value) { - return value[0] + 1; - }, { output: [1], pipeline: true }); + const kernel = gpu.createKernel( + function (value) { + return value[0] + 1; + }, + { output: [1], pipeline: true } + ); const texture = kernel([1]); const { size } = texture; @@ -406,28 +541,43 @@ function testCloning(mode) { gpu.destroy(); } -(GPU.isWebGLSupported ? test : skip)('cloning sets up framebuffer with correct size webgl', () => { - testCloning('webgl'); -}); +(GPU.isWebGLSupported ? test : skip)( + 'cloning sets up framebuffer with correct size webgl', + () => { + testCloning('webgl'); + } +); -(GPU.isWebGL2Supported ? test : skip)('cloning sets up framebuffer with correct size webgl2', () => { - testCloning('webgl2'); -}); +(GPU.isWebGL2Supported ? test : skip)( + 'cloning sets up framebuffer with correct size webgl2', + () => { + testCloning('webgl2'); + } +); -(GPU.isHeadlessGLSupported ? test : skip)('cloning sets up framebuffer with correct size headlessgl', () => { - testCloning('headlessgl'); -}); +(GPU.isHeadlessGLSupported ? test : skip)( + 'cloning sets up framebuffer with correct size headlessgl', + () => { + testCloning('headlessgl'); + } +); function testMutableLeak(mode) { const gpu = new GPU({ mode }); - const kernel = gpu.createKernel(function() { - return 1; - }, { - output: [1], - pipeline: true - }); + const kernel = gpu.createKernel( + function () { + return 1; + }, + { + output: [1], + pipeline: true, + } + ); kernel.build(); - const cloneTextureSpy = sinon.spy(kernel.texture.constructor.prototype, 'beforeMutate'); + const cloneTextureSpy = sinon.spy( + kernel.texture.constructor.prototype, + 'beforeMutate' + ); const texture1 = kernel(); const texture2 = kernel(); assert.equal(cloneTextureSpy.callCount, 0); @@ -453,21 +603,27 @@ test('test mutable leak gpu', () => { testMutableLeak('webgl2'); }); -(GPU.isHeadlessGLSupported ? test : skip)('test mutable leak headlessgl', () => { - testMutableLeak('headlessgl'); -}); +(GPU.isHeadlessGLSupported ? test : skip)( + 'test mutable leak headlessgl', + () => { + testMutableLeak('headlessgl'); + } +); describe('internal: cpu recycling behaviour'); test('recycle CPU array', () => { const gpu = new GPU({ mode: 'cpu' }); - const kernel = gpu.createKernel(function(v) { - return this.thread.x + v[0]; - }, { - output: [1], - pipeline: true, - immutable: false, - }); + const kernel = gpu.createKernel( + function (v) { + return this.thread.x + v[0]; + }, + { + output: [1], + pipeline: true, + immutable: false, + } + ); const result1 = kernel(new Float32Array([1])); assert.equal(result1[0], 1); const result2 = kernel(new Float32Array([2])); @@ -479,13 +635,16 @@ test('recycle CPU array', () => { test('recycle CPU matrix', () => { const gpu = new GPU({ mode: 'cpu' }); - const kernel = gpu.createKernel(function(v) { - return (this.thread.x + (this.thread.y * this.output.x)) + v[0]; - }, { - output: [2, 2], - pipeline: true, - immutable: false, - }); + const kernel = gpu.createKernel( + function (v) { + return this.thread.x + this.thread.y * this.output.x + v[0]; + }, + { + output: [2, 2], + pipeline: true, + immutable: false, + } + ); const result1 = kernel(new Float32Array([1])); assert.equal(result1[0][0], 1); assert.equal(result1[0][1], 2); @@ -503,13 +662,21 @@ test('recycle CPU matrix', () => { test('recycle CPU cube', () => { const gpu = new GPU({ mode: 'cpu' }); - const kernel = gpu.createKernel(function(v) { - return (this.thread.x + (this.thread.y * this.output.x) + (this.thread.z * this.output.y * this.output.x)) + v[0]; - }, { - output: [2, 2, 2], - pipeline: true, - immutable: false, - }); + const kernel = gpu.createKernel( + function (v) { + return ( + this.thread.x + + this.thread.y * this.output.x + + this.thread.z * this.output.y * this.output.x + + v[0] + ); + }, + { + output: [2, 2, 2], + pipeline: true, + immutable: false, + } + ); const result1 = kernel(new Float32Array([1])); assert.equal(result1[0][0][0], 1); assert.equal(result1[0][0][1], 2); @@ -536,13 +703,16 @@ describe('internal: cpu non-recycling behaviour'); test('non-recycle CPU array', () => { const gpu = new GPU({ mode: 'cpu' }); - const kernel = gpu.createKernel(function(v) { - return this.thread.x + v[0]; - }, { - output: [1], - pipeline: true, - immutable: true, - }); + const kernel = gpu.createKernel( + function (v) { + return this.thread.x + v[0]; + }, + { + output: [1], + pipeline: true, + immutable: true, + } + ); const result1 = kernel(new Float32Array([1])); assert.equal(result1[0], 1); const result2 = kernel(new Float32Array([2])); @@ -555,13 +725,16 @@ test('non-recycle CPU array', () => { test('non-recycle CPU matrix', () => { const gpu = new GPU({ mode: 'cpu' }); - const kernel = gpu.createKernel(function(v) { - return (this.thread.x + (this.thread.y * this.output.x)) + v[0]; - }, { - output: [2, 2], - pipeline: true, - immutable: true, - }); + const kernel = gpu.createKernel( + function (v) { + return this.thread.x + this.thread.y * this.output.x + v[0]; + }, + { + output: [2, 2], + pipeline: true, + immutable: true, + } + ); const result1 = kernel(new Float32Array([1])); assert.equal(result1[0][0], 1); assert.equal(result1[0][1], 2); @@ -585,13 +758,21 @@ test('non-recycle CPU matrix', () => { test('non-recycle CPU cube', () => { const gpu = new GPU({ mode: 'cpu' }); - const kernel = gpu.createKernel(function(v) { - return (this.thread.x + (this.thread.y * this.output.x) + (this.thread.z * this.output.y * this.output.x)) + v[0]; - }, { - output: [2, 2, 2], - pipeline: true, - immutable: true, - }); + const kernel = gpu.createKernel( + function (v) { + return ( + this.thread.x + + this.thread.y * this.output.x + + this.thread.z * this.output.y * this.output.x + + v[0] + ); + }, + { + output: [2, 2, 2], + pipeline: true, + immutable: true, + } + ); const result1 = kernel(new Float32Array([1])); assert.equal(result1[0][0][0], 1); assert.equal(result1[0][0][1], 2); @@ -626,42 +807,62 @@ test('non-recycle CPU cube', () => { function testSameSourceDestinationFromResultThrows(error, precision, mode) { const gpu = new GPU({ mode }); - const kernel = gpu.createKernel(function(value) { - return value[this.thread.x] + 1; - }, { - output: [1], - pipeline: true, - immutable: false, - precision, - }); + const kernel = gpu.createKernel( + function (value) { + return value[this.thread.x] + 1; + }, + { + output: [1], + pipeline: true, + immutable: false, + precision, + } + ); let result = kernel([0]); assert.equal((result.toArray ? result.toArray() : result)[0], 1); assert.throws(() => kernel(result), error); gpu.destroy(); } -const gpuError = new Error('Source and destination textures are the same. Use immutable = true and manually cleanup kernel output texture memory with texture.delete()'); -const cpuError = new Error('Source and destination arrays are the same. Use immutable = true'); +const gpuError = new Error( + 'Source and destination textures are the same. Use immutable = true and manually cleanup kernel output texture memory with texture.delete()' +); +const cpuError = new Error( + 'Source and destination arrays are the same. Use immutable = true' +); test('single precision same source and destination from result mutable throws auto', () => { - testSameSourceDestinationFromResultThrows(gpuError,'single'); + testSameSourceDestinationFromResultThrows(gpuError, 'single'); }); test('single precision same source and destination from result mutable throws gpu', () => { testSameSourceDestinationFromResultThrows(gpuError, 'single', 'gpu'); }); -(GPU.isWebGLSupported ? test : skip)('single precision same source and destination from result mutable throws webgl', () => { - testSameSourceDestinationFromResultThrows(gpuError, 'single', 'webgl'); -}); - -(GPU.isWebGL2Supported ? test : skip)('single precision same source and destination from result mutable throws webgl2', () => { - testSameSourceDestinationFromResultThrows(gpuError, 'single', 'webgl2'); -}); +(GPU.isWebGLSupported ? test : skip)( + 'single precision same source and destination from result mutable throws webgl', + () => { + testSameSourceDestinationFromResultThrows(gpuError, 'single', 'webgl'); + } +); -(GPU.isHeadlessGLSupported ? test : skip)('single precision same source and destination from result mutable throws headlessgl', () => { - testSameSourceDestinationFromResultThrows(gpuError, 'single', 'headlessgl'); -}); +(GPU.isWebGL2Supported ? test : skip)( + 'single precision same source and destination from result mutable throws webgl2', + () => { + testSameSourceDestinationFromResultThrows(gpuError, 'single', 'webgl2'); + } +); + +(GPU.isHeadlessGLSupported ? test : skip)( + 'single precision same source and destination from result mutable throws headlessgl', + () => { + testSameSourceDestinationFromResultThrows( + gpuError, + 'single', + 'headlessgl' + ); + } +); test('single precision same source and destination from result mutable throws cpu', () => { testSameSourceDestinationFromResultThrows(cpuError, 'single', 'cpu'); @@ -675,38 +876,62 @@ test('unsigned precision same source and destination from result mutable throws testSameSourceDestinationFromResultThrows(gpuError, 'unsigned', 'gpu'); }); -(GPU.isWebGLSupported ? test : skip)('unsigned precision same source and destination from result mutable throws webgl', () => { - testSameSourceDestinationFromResultThrows(gpuError, 'unsigned', 'webgl'); -}); - -(GPU.isWebGL2Supported ? test : skip)('unsigned precision same source and destination from result mutable throws webgl2', () => { - testSameSourceDestinationFromResultThrows(gpuError, 'unsigned', 'webgl2'); -}); +(GPU.isWebGLSupported ? test : skip)( + 'unsigned precision same source and destination from result mutable throws webgl', + () => { + testSameSourceDestinationFromResultThrows(gpuError, 'unsigned', 'webgl'); + } +); -(GPU.isHeadlessGLSupported ? test : skip)('unsigned precision same source and destination from result mutable throws headlessgl', () => { - testSameSourceDestinationFromResultThrows(gpuError, 'unsigned', 'headlessgl'); -}); +(GPU.isWebGL2Supported ? test : skip)( + 'unsigned precision same source and destination from result mutable throws webgl2', + () => { + testSameSourceDestinationFromResultThrows(gpuError, 'unsigned', 'webgl2'); + } +); + +(GPU.isHeadlessGLSupported ? test : skip)( + 'unsigned precision same source and destination from result mutable throws headlessgl', + () => { + testSameSourceDestinationFromResultThrows( + gpuError, + 'unsigned', + 'headlessgl' + ); + } +); test('unsigned precision same source and destination from result mutable throws cpu', () => { testSameSourceDestinationFromResultThrows(cpuError, 'unsigned', 'cpu'); }); -function testSameSourceDestinationFromMappedResultThrows(error, precision, mode) { +function testSameSourceDestinationFromMappedResultThrows( + error, + precision, + mode +) { const gpu = new GPU({ mode }); - const kernel = gpu.createKernelMap({ - mappedResult: function map(v) { - return v; + const kernel = gpu.createKernelMap( + { + mappedResult: function map(v) { + return v; + }, + }, + function (value) { + return map(value[this.thread.x] + 1); + }, + { + output: [1], + pipeline: true, + immutable: false, + precision, } - }, function(value) { - return map(value[this.thread.x] + 1); - }, { - output: [1], - pipeline: true, - immutable: false, - precision, - }); + ); let { result, mappedResult } = kernel([0]); - assert.equal((mappedResult.toArray ? mappedResult.toArray() : mappedResult)[0], 1); + assert.equal( + (mappedResult.toArray ? mappedResult.toArray() : mappedResult)[0], + 1 + ); assert.throws(() => kernel(mappedResult), error); assert.throws(() => kernel(result), error); gpu.destroy(); @@ -720,17 +945,38 @@ test('single precision same source and destination from mapped result mutable th testSameSourceDestinationFromMappedResultThrows(gpuError, 'single', 'gpu'); }); -(GPU.isWebGLSupported ? test : skip)('single precision same source and destination from mapped result mutable throws webgl', () => { - testSameSourceDestinationFromMappedResultThrows(gpuError, 'single', 'webgl'); -}); - -(GPU.isWebGL2Supported ? test : skip)('single precision same source and destination from mapped result mutable throws webgl2', () => { - testSameSourceDestinationFromMappedResultThrows(gpuError, 'single', 'webgl2'); -}); - -(GPU.isHeadlessGLSupported ? test : skip)('single precision same source and destination from mapped result mutable throws headlessgl', () => { - testSameSourceDestinationFromMappedResultThrows(gpuError, 'single', 'headlessgl'); -}); +(GPU.isWebGLSupported ? test : skip)( + 'single precision same source and destination from mapped result mutable throws webgl', + () => { + testSameSourceDestinationFromMappedResultThrows( + gpuError, + 'single', + 'webgl' + ); + } +); + +(GPU.isWebGL2Supported ? test : skip)( + 'single precision same source and destination from mapped result mutable throws webgl2', + () => { + testSameSourceDestinationFromMappedResultThrows( + gpuError, + 'single', + 'webgl2' + ); + } +); + +(GPU.isHeadlessGLSupported ? test : skip)( + 'single precision same source and destination from mapped result mutable throws headlessgl', + () => { + testSameSourceDestinationFromMappedResultThrows( + gpuError, + 'single', + 'headlessgl' + ); + } +); test('single precision same source and destination from mapped result mutable throws cpu', () => { testSameSourceDestinationFromMappedResultThrows(cpuError, 'single', 'cpu'); @@ -744,17 +990,38 @@ test('unsigned precision same source and destination from mapped result mutable testSameSourceDestinationFromMappedResultThrows(gpuError, 'unsigned', 'gpu'); }); -(GPU.isWebGLSupported ? test : skip)('unsigned precision same source and destination from mapped result mutable throws webgl', () => { - testSameSourceDestinationFromMappedResultThrows(gpuError, 'unsigned', 'webgl'); -}); - -(GPU.isWebGL2Supported ? test : skip)('unsigned precision same source and destination from mapped result mutable throws webgl2', () => { - testSameSourceDestinationFromMappedResultThrows(gpuError, 'unsigned', 'webgl2'); -}); - -(GPU.isHeadlessGLSupported ? test : skip)('unsigned precision same source and destination from mapped result mutable throws headlessgl', () => { - testSameSourceDestinationFromMappedResultThrows(gpuError, 'unsigned', 'headlessgl'); -}); +(GPU.isWebGLSupported ? test : skip)( + 'unsigned precision same source and destination from mapped result mutable throws webgl', + () => { + testSameSourceDestinationFromMappedResultThrows( + gpuError, + 'unsigned', + 'webgl' + ); + } +); + +(GPU.isWebGL2Supported ? test : skip)( + 'unsigned precision same source and destination from mapped result mutable throws webgl2', + () => { + testSameSourceDestinationFromMappedResultThrows( + gpuError, + 'unsigned', + 'webgl2' + ); + } +); + +(GPU.isHeadlessGLSupported ? test : skip)( + 'unsigned precision same source and destination from mapped result mutable throws headlessgl', + () => { + testSameSourceDestinationFromMappedResultThrows( + gpuError, + 'unsigned', + 'headlessgl' + ); + } +); test('unsigned precision same source and destination from mapped result mutable throws cpu', () => { testSameSourceDestinationFromMappedResultThrows(cpuError, 'unsigned', 'cpu'); @@ -762,9 +1029,12 @@ test('unsigned precision same source and destination from mapped result mutable function testOutputTextureIsClonedWhenRecompiling(mode) { const gpu = new GPU({ mode }); - const kernel = gpu.createKernel(function(value) { - return value[this.thread.x] + 1; - }, { output: [1], immutable: true, pipeline: true }); + const kernel = gpu.createKernel( + function (value) { + return value[this.thread.x] + 1; + }, + { output: [1], immutable: true, pipeline: true } + ); const result1 = kernel([1]); assert.equal(result1.toArray()[0], 2); const result2 = kernel(result1); @@ -788,29 +1058,43 @@ test('output texture is cloned when recompiling gpu', () => { testOutputTextureIsClonedWhenRecompiling('gpu'); }); -(GPU.isWebGLSupported ? test : skip)('output texture is cloned when recompiling webgl', () => { - testOutputTextureIsClonedWhenRecompiling('webgl'); -}); +(GPU.isWebGLSupported ? test : skip)( + 'output texture is cloned when recompiling webgl', + () => { + testOutputTextureIsClonedWhenRecompiling('webgl'); + } +); -(GPU.isWebGL2Supported ? test : skip)('output texture is cloned when recompiling webgl2', () => { - testOutputTextureIsClonedWhenRecompiling('webgl2'); -}); +(GPU.isWebGL2Supported ? test : skip)( + 'output texture is cloned when recompiling webgl2', + () => { + testOutputTextureIsClonedWhenRecompiling('webgl2'); + } +); -(GPU.isHeadlessGLSupported ? test : skip)('output texture is cloned when recompiling headlessgl', () => { - testOutputTextureIsClonedWhenRecompiling('headlessgl'); -}); +(GPU.isHeadlessGLSupported ? test : skip)( + 'output texture is cloned when recompiling headlessgl', + () => { + testOutputTextureIsClonedWhenRecompiling('headlessgl'); + } +); function testMappedOutputTextureIsClonedWhenRecompiling(mode) { const gpu = new GPU({ mode }); + function setValue(value) { return value * 10; } - const kernel = gpu.createKernelMap({ - value: setValue, - },function(value1, value2) { - setValue(value2[this.thread.x]); - return value1[this.thread.x] + 1; - }, { output: [1], immutable: true, pipeline: true }); + const kernel = gpu.createKernelMap( + { + value: setValue, + }, + function (value1, value2) { + setValue(value2[this.thread.x]); + return value1[this.thread.x] + 1; + }, + { output: [1], immutable: true, pipeline: true } + ); const map1 = kernel([1], [1]); assert.equal(map1.result.toArray()[0], 2); assert.equal(map1.value.toArray()[0], 10); @@ -842,14 +1126,23 @@ test('mapped output texture is cloned when recompiling gpu', () => { testMappedOutputTextureIsClonedWhenRecompiling('gpu'); }); -(GPU.isWebGLSupported ? test : skip)('mapped output texture is cloned when recompiling webgl', () => { - testMappedOutputTextureIsClonedWhenRecompiling('webgl'); -}); +(GPU.isWebGLSupported ? test : skip)( + 'mapped output texture is cloned when recompiling webgl', + () => { + testMappedOutputTextureIsClonedWhenRecompiling('webgl'); + } +); -(GPU.isWebGL2Supported ? test : skip)('mapped output texture is cloned when recompiling webgl2', () => { - testMappedOutputTextureIsClonedWhenRecompiling('webgl2'); -}); +(GPU.isWebGL2Supported ? test : skip)( + 'mapped output texture is cloned when recompiling webgl2', + () => { + testMappedOutputTextureIsClonedWhenRecompiling('webgl2'); + } +); -(GPU.isHeadlessGLSupported ? test : skip)('mapped output texture is cloned when recompiling headlessgl', () => { - testMappedOutputTextureIsClonedWhenRecompiling('headlessgl'); -}); \ No newline at end of file +(GPU.isHeadlessGLSupported ? test : skip)( + 'mapped output texture is cloned when recompiling headlessgl', + () => { + testMappedOutputTextureIsClonedWhenRecompiling('headlessgl'); + } +); diff --git a/test/internal/texture-index.js b/test/internal/texture-index.js index 1f5af264..98b5ff35 100644 --- a/test/internal/texture-index.js +++ b/test/internal/texture-index.js @@ -1,12 +1,16 @@ const { assert, skip, test, module: describe, only } = require('qunit'); -const { GPU } = require('../../src'); +const { GPU } = require('../..'); describe('internal: texture index'); + function createKernelWithNumberConstants(mode) { const gpu = new GPU({ mode }); - const kernel = gpu.createKernel(function() { - return this.constants.v1 + this.constants.v2; - }, { output: [1], constants: { v1: 1, v2: 1 } }); + const kernel = gpu.createKernel( + function () { + return this.constants.v1 + this.constants.v2; + }, + { output: [1], constants: { v1: 1, v2: 1 } } + ); kernel(); assert.equal(kernel.kernelConstants.length, 2); @@ -21,25 +25,41 @@ function createKernelWithNumberConstants(mode) { test('createKernel with number constants auto', () => { createKernelWithNumberConstants(); }); -(GPU.isWebGL2Supported ? test : skip)('createKernel with number constants gpu', () => { - createKernelWithNumberConstants('gpu'); -}); -(GPU.isWebGL2Supported ? test : skip)('createKernel with number constants webgl', () => { - createKernelWithNumberConstants('webgl'); -}); -(GPU.isWebGL2Supported ? test : skip)('createKernel with number constants webgl2', () => { - createKernelWithNumberConstants('webgl2'); -}); -(GPU.isHeadlessGLSupported ? test : skip)('createKernel with number constants headlessgl', () => { - createKernelWithNumberConstants('headlessgl'); -}); - +(GPU.isWebGL2Supported ? test : skip)( + 'createKernel with number constants gpu', + () => { + createKernelWithNumberConstants('gpu'); + } +); +(GPU.isWebGL2Supported ? test : skip)( + 'createKernel with number constants webgl', + () => { + createKernelWithNumberConstants('webgl'); + } +); +(GPU.isWebGL2Supported ? test : skip)( + 'createKernel with number constants webgl2', + () => { + createKernelWithNumberConstants('webgl2'); + } +); +(GPU.isHeadlessGLSupported ? test : skip)( + 'createKernel with number constants headlessgl', + () => { + createKernelWithNumberConstants('headlessgl'); + } +); function createKernelWithArrayConstants(mode) { const gpu = new GPU({ mode }); - const kernel = gpu.createKernel(function() { - return this.constants.v1[this.thread.x] + this.constants.v2[this.thread.x]; - }, { output: [1], constants: { v1: [1], v2: [1] } }); + const kernel = gpu.createKernel( + function () { + return ( + this.constants.v1[this.thread.x] + this.constants.v2[this.thread.x] + ); + }, + { output: [1], constants: { v1: [1], v2: [1] } } + ); kernel(); const gl = kernel.context; @@ -54,29 +74,52 @@ function createKernelWithArrayConstants(mode) { test('createKernel with array constants auto', () => { createKernelWithArrayConstants(); }); -(GPU.isGPUSupported ? test : skip)('createKernel with array constants gpu', () => { - createKernelWithArrayConstants('gpu'); -}); -(GPU.isWebGLSupported ? test : skip)('createKernel with array constants webgl', () => { - createKernelWithArrayConstants('webgl'); -}); -(GPU.isWebGL2Supported ? test : skip)('createKernel with array constants webgl2', () => { - createKernelWithArrayConstants('webgl2'); -}); -(GPU.isHeadlessGLSupported ? test : skip)('createKernel with array constants headlessgl', () => { - createKernelWithArrayConstants('headlessgl'); -}); +(GPU.isGPUSupported ? test : skip)( + 'createKernel with array constants gpu', + () => { + createKernelWithArrayConstants('gpu'); + } +); +(GPU.isWebGLSupported ? test : skip)( + 'createKernel with array constants webgl', + () => { + createKernelWithArrayConstants('webgl'); + } +); +(GPU.isWebGL2Supported ? test : skip)( + 'createKernel with array constants webgl2', + () => { + createKernelWithArrayConstants('webgl2'); + } +); +(GPU.isHeadlessGLSupported ? test : skip)( + 'createKernel with array constants headlessgl', + () => { + createKernelWithArrayConstants('headlessgl'); + } +); function creatKernelWithNumberConstantsAndArrayArguments(mode) { const gpu = new GPU({ mode }); - const textureGetter = gpu.createKernel(function() { - return 1; - }, { output: [1], pipeline: true }); + const textureGetter = gpu.createKernel( + function () { + return 1; + }, + { output: [1], pipeline: true } + ); const texture1 = textureGetter(); const texture2 = textureGetter(); - const kernel = gpu.createKernel(function(value1, value2) { - return value1[this.thread.x] + value2[this.thread.x] + this.constants.v1 + this.constants.v2; - }, { output: [1], constants: { v1: 1, v2: 1 } }); + const kernel = gpu.createKernel( + function (value1, value2) { + return ( + value1[this.thread.x] + + value2[this.thread.x] + + this.constants.v1 + + this.constants.v2 + ); + }, + { output: [1], constants: { v1: 1, v2: 1 } } + ); const output = kernel(texture1, texture2); @@ -94,38 +137,64 @@ function creatKernelWithNumberConstantsAndArrayArguments(mode) { test('createKernel with number constants & array arguments auto', () => { creatKernelWithNumberConstantsAndArrayArguments(); }); -(GPU.isGPUSupported ? test : skip)('createKernel with number constants & array arguments gpu', () => { - creatKernelWithNumberConstantsAndArrayArguments('gpu'); -}); -(GPU.isWebGLSupported ? test : skip)('createKernel with number constants & array arguments webgl', () => { - creatKernelWithNumberConstantsAndArrayArguments('webgl'); -}); -(GPU.isWebGL2Supported ? test : skip)('createKernel with number constants & array arguments webgl2', () => { - creatKernelWithNumberConstantsAndArrayArguments('webgl2'); -}); -(GPU.isHeadlessGLSupported ? test : skip)('createKernel with number constants & array arguments headlessgl', () => { - creatKernelWithNumberConstantsAndArrayArguments('headlessgl'); -}); +(GPU.isGPUSupported ? test : skip)( + 'createKernel with number constants & array arguments gpu', + () => { + creatKernelWithNumberConstantsAndArrayArguments('gpu'); + } +); +(GPU.isWebGLSupported ? test : skip)( + 'createKernel with number constants & array arguments webgl', + () => { + creatKernelWithNumberConstantsAndArrayArguments('webgl'); + } +); +(GPU.isWebGL2Supported ? test : skip)( + 'createKernel with number constants & array arguments webgl2', + () => { + creatKernelWithNumberConstantsAndArrayArguments('webgl2'); + } +); +(GPU.isHeadlessGLSupported ? test : skip)( + 'createKernel with number constants & array arguments headlessgl', + () => { + creatKernelWithNumberConstantsAndArrayArguments('headlessgl'); + } +); function createKernelMapWithArrayConstantsAndTextureArguments(mode) { const gpu = new GPU({ mode }); + function calcValue1(v) { return v; } + function calcValue2(v) { return v; } - const textureGetter = gpu.createKernel(function() { - return 1; - }, { output: [1], pipeline: true }); + const textureGetter = gpu.createKernel( + function () { + return 1; + }, + { output: [1], pipeline: true } + ); const texture1 = textureGetter(); const texture2 = textureGetter(); - const kernel = gpu.createKernelMap({ - mappedValue1: calcValue1, - mappedValue2: calcValue2, - }, function(value1, value2) { - return calcValue1(value1[this.thread.x] + value2[this.thread.x]) + calcValue2(this.constants.v1[this.thread.x] + this.constants.v2[this.thread.x]); - }, { output: [1], constants: { v1: [1], v2: [1] } }); + const kernel = gpu.createKernelMap( + { + mappedValue1: calcValue1, + mappedValue2: calcValue2, + }, + function (value1, value2) { + return ( + calcValue1(value1[this.thread.x] + value2[this.thread.x]) + + calcValue2( + this.constants.v1[this.thread.x] + this.constants.v2[this.thread.x] + ) + ); + }, + { output: [1], constants: { v1: [1], v2: [1] } } + ); kernel(texture1, texture2); const gl = kernel.context; @@ -142,15 +211,27 @@ function createKernelMapWithArrayConstantsAndTextureArguments(mode) { test('createKernelMap with array constants & texture arguments auto', () => { createKernelMapWithArrayConstantsAndTextureArguments(); }); -(GPU.isGPUSupported ? test : skip)('createKernelMap with array constants & texture arguments gpu', () => { - createKernelMapWithArrayConstantsAndTextureArguments('gpu'); -}); -(GPU.isWebGLSupported ? test : skip)('createKernelMap with array constants & texture arguments webgl', () => { - createKernelMapWithArrayConstantsAndTextureArguments('webgl'); -}); -(GPU.isWebGL2Supported ? test : skip)('createKernelMap with array constants & texture arguments webgl2', () => { - createKernelMapWithArrayConstantsAndTextureArguments('webgl2'); -}); -(GPU.isHeadlessGLSupported ? test : skip)('createKernelMap with array constants & texture arguments headlessgl', () => { - createKernelMapWithArrayConstantsAndTextureArguments('headlessgl'); -}); +(GPU.isGPUSupported ? test : skip)( + 'createKernelMap with array constants & texture arguments gpu', + () => { + createKernelMapWithArrayConstantsAndTextureArguments('gpu'); + } +); +(GPU.isWebGLSupported ? test : skip)( + 'createKernelMap with array constants & texture arguments webgl', + () => { + createKernelMapWithArrayConstantsAndTextureArguments('webgl'); + } +); +(GPU.isWebGL2Supported ? test : skip)( + 'createKernelMap with array constants & texture arguments webgl2', + () => { + createKernelMapWithArrayConstantsAndTextureArguments('webgl2'); + } +); +(GPU.isHeadlessGLSupported ? test : skip)( + 'createKernelMap with array constants & texture arguments headlessgl', + () => { + createKernelMapWithArrayConstantsAndTextureArguments('headlessgl'); + } +); diff --git a/test/internal/underscores.js b/test/internal/underscores.js index b231709c..1c139d7d 100644 --- a/test/internal/underscores.js +++ b/test/internal/underscores.js @@ -1,13 +1,16 @@ const { assert, skip, test, module: describe, only } = require('qunit'); -const { GPU } = require('../../src'); +const { GPU } = require('../..'); describe('internal: underscores'); function testNumberArgument(mode) { const gpu = new GPU({ mode }); - const kernel = gpu.createKernel(function(value_1) { - return value_1; - }, { output: [1], }); + const kernel = gpu.createKernel( + function (value_1) { + return value_1; + }, + { output: [1] } + ); assert.equal(kernel(1)[0], 1); gpu.destroy(); } @@ -33,9 +36,12 @@ test('number argument cpu', () => { function testArrayArgument(mode) { const gpu = new GPU({ mode }); - const kernel = gpu.createKernel(function(value_1) { - return value_1[this.thread.x]; - }, { output: [1], }); + const kernel = gpu.createKernel( + function (value_1) { + return value_1[this.thread.x]; + }, + { output: [1] } + ); assert.equal(kernel([1])[0], 1); gpu.destroy(); } @@ -61,10 +67,18 @@ test('array argument cpu', () => { function testTextureArgument(mode) { const gpu = new GPU({ mode }); - const texture = gpu.createKernel(function() { return 1; }, { output: [1], pipeline: true })(); - const kernel = gpu.createKernel(function(value_1) { - return value_1[this.thread.x]; - }, { output: [1], }); + const texture = gpu.createKernel( + function () { + return 1; + }, + { output: [1], pipeline: true } + )(); + const kernel = gpu.createKernel( + function (value_1) { + return value_1[this.thread.x]; + }, + { output: [1] } + ); assert.equal(kernel(texture)[0], 1); gpu.destroy(); } @@ -81,21 +95,31 @@ test('texture argument gpu', () => { (GPU.isWebGL2Supported ? test : skip)('texture argument webgl2', () => { testTextureArgument('webgl2'); }); -(GPU.isHeadlessGLSupported ? test : skip)('texture argument headlessgl', () => { - testTextureArgument('headlessgl'); -}); +(GPU.isHeadlessGLSupported ? test : skip)( + 'texture argument headlessgl', + () => { + testTextureArgument('headlessgl'); + } +); test('texture argument cpu', () => { testTextureArgument('cpu'); }); - function testArray2TextureArgument(mode) { const gpu = new GPU({ mode }); - const texture = gpu.createKernel(function() { return [1, 1]; }, { output: [1], pipeline: true })(); - const kernel = gpu.createKernel(function(value_1) { - debugger; - return value_1[this.thread.x]; - }, { output: [1], }); + const texture = gpu.createKernel( + function () { + return [1, 1]; + }, + { output: [1], pipeline: true } + )(); + const kernel = gpu.createKernel( + function (value_1) { + debugger; + return value_1[this.thread.x]; + }, + { output: [1] } + ); assert.deepEqual(kernel(texture)[0], new Float32Array([1, 1])); gpu.destroy(); } @@ -112,21 +136,26 @@ test('array2 texture argument gpu', () => { (GPU.isWebGL2Supported ? test : skip)('array2 texture argument webgl2', () => { testArray2TextureArgument('webgl2'); }); -(GPU.isHeadlessGLSupported ? test : skip)('array2 texture argument headlessgl', () => { - testArray2TextureArgument('headlessgl'); -}); - +(GPU.isHeadlessGLSupported ? test : skip)( + 'array2 texture argument headlessgl', + () => { + testArray2TextureArgument('headlessgl'); + } +); function testNumberConstant(mode) { const gpu = new GPU({ mode }); - const kernel = gpu.createKernel(function() { - return this.constants.value_1; - }, { - output: [1], - constants: { - value_1: 1 + const kernel = gpu.createKernel( + function () { + return this.constants.value_1; }, - }); + { + output: [1], + constants: { + value_1: 1, + }, + } + ); assert.equal(kernel()[0], 1); gpu.destroy(); } @@ -152,14 +181,17 @@ test('number constant cpu', () => { function testArrayConstant(mode) { const gpu = new GPU({ mode }); - const kernel = gpu.createKernel(function() { - return this.constants.value_1[0]; - }, { - output: [1], - constants: { - value_1: [1] + const kernel = gpu.createKernel( + function () { + return this.constants.value_1[0]; }, - }); + { + output: [1], + constants: { + value_1: [1], + }, + } + ); assert.equal(kernel()[0], 1); gpu.destroy(); } @@ -183,18 +215,25 @@ test('array constant cpu', () => { testArrayConstant('cpu'); }); - function testTextureConstant(mode) { const gpu = new GPU({ mode }); - const texture = gpu.createKernel(function() { return 1; }, { output: [1], pipeline: true })(); - const kernel = gpu.createKernel(function() { - return this.constants.value_1[0]; - }, { - output: [1], - constants: { - value_1: texture + const texture = gpu.createKernel( + function () { + return 1; }, - }); + { output: [1], pipeline: true } + )(); + const kernel = gpu.createKernel( + function () { + return this.constants.value_1[0]; + }, + { + output: [1], + constants: { + value_1: texture, + }, + } + ); assert.equal(kernel()[0], 1); gpu.destroy(); } @@ -211,7 +250,9 @@ test('texture constant gpu', () => { (GPU.isWebGL2Supported ? test : skip)('texture constant webgl2', () => { testTextureConstant('webgl2'); }); -(GPU.isHeadlessGLSupported ? test : skip)('texture constant headlessgl', () => { - testTextureConstant('headlessgl'); -}); - +(GPU.isHeadlessGLSupported ? test : skip)( + 'texture constant headlessgl', + () => { + testTextureConstant('headlessgl'); + } +); diff --git a/test/internal/utils.js b/test/internal/utils.js index c18c8b03..7117e825 100644 --- a/test/internal/utils.js +++ b/test/internal/utils.js @@ -1,15 +1,18 @@ const { assert, skip, test, module: describe, only } = require('qunit'); -const { utils } = require('../../src'); +const { utils } = require('../..'); describe('internal: utils'); test('systemEndianness not null', () => { assert.ok(utils.systemEndianness() !== null, 'not null check'); - assert.ok(utils.systemEndianness() === 'LE' || utils.systemEndianness() === 'BE', 'value = ' + utils.systemEndianness()); + assert.ok( + utils.systemEndianness() === 'LE' || utils.systemEndianness() === 'BE', + 'value = ' + utils.systemEndianness() + ); }); test('isFunction', () => { - assert.ok(utils.isFunction(function() { })); + assert.ok(utils.isFunction(function () {})); assert.notOk(utils.isFunction({})); }); @@ -23,523 +26,504 @@ test('getFunctionName_fromString', () => { }); test('getParamNames_fromString', () => { - assert.deepEqual(['a','b','c'], utils.getArgumentNamesFromString('function test(a,b,c) { }')); + assert.deepEqual( + ['a', 'b', 'c'], + utils.getArgumentNamesFromString('function test(a,b,c) { }') + ); }); test('closestSquareDimensions 2', () => { - assert.deepEqual(Array.from(utils.closestSquareDimensions(2)), [1,2]); + assert.deepEqual(Array.from(utils.closestSquareDimensions(2)), [1, 2]); }); test('closestSquareDimensions 5', () => { - assert.deepEqual(Array.from(utils.closestSquareDimensions(5)), [2,3]); + assert.deepEqual(Array.from(utils.closestSquareDimensions(5)), [2, 3]); }); test('closestSquareDimensions 6', () => { - assert.deepEqual(Array.from(utils.closestSquareDimensions(6)), [2,3]); + assert.deepEqual(Array.from(utils.closestSquareDimensions(6)), [2, 3]); }); test('closestSquareDimensions 7', () => { - assert.deepEqual(Array.from(utils.closestSquareDimensions(7)), [4,2]); + assert.deepEqual(Array.from(utils.closestSquareDimensions(7)), [4, 2]); }); test('getDimensions Array of 6, padded', () => { - assert.deepEqual(Array.from(utils.getDimensions(new Array(6).fill(1), true)), [6,1,1]); + assert.deepEqual( + Array.from(utils.getDimensions(new Array(6).fill(1), true)), + [6, 1, 1] + ); }); test('getDimensions Array of 6,1,1, padded', () => { - assert.deepEqual(Array.from(utils.getDimensions([[[1,1,1,1,1,1]]], true)), [6,1,1]); + assert.deepEqual( + Array.from(utils.getDimensions([[[1, 1, 1, 1, 1, 1]]], true)), + [6, 1, 1] + ); }); test('getDimensions Array of 1,6,1, padded', () => { - assert.deepEqual(Array.from(utils.getDimensions([[[1],[1],[1],[1],[1],[1]]], true)), [1,6,1]); + assert.deepEqual( + Array.from(utils.getDimensions([[[1], [1], [1], [1], [1], [1]]], true)), + [1, 6, 1] + ); }); test('getDimensions Array of 1,1,6, padded', () => { - assert.deepEqual(Array.from(utils.getDimensions([[[1]],[[1]],[[1]],[[1]],[[1]],[[1]]], true)), [1,1,6]); + assert.deepEqual( + Array.from( + utils.getDimensions([[[1]], [[1]], [[1]], [[1]], [[1]], [[1]]], true) + ), + [1, 1, 6] + ); }); test('getMemoryOptimizedFloatTextureSize [6,1,1], bitRatio 4', () => { - assert.deepEqual(Array.from(utils.getMemoryOptimizedFloatTextureSize([6, 1, 1], 4)), [1, 2]); + assert.deepEqual( + Array.from(utils.getMemoryOptimizedFloatTextureSize([6, 1, 1], 4)), + [1, 2] + ); }); test('getMemoryOptimizedFloatTextureSize [1,6,1], bitRatio 4', () => { - assert.deepEqual(Array.from(utils.getMemoryOptimizedFloatTextureSize([1, 6, 1], 4)), [1, 2]); + assert.deepEqual( + Array.from(utils.getMemoryOptimizedFloatTextureSize([1, 6, 1], 4)), + [1, 2] + ); }); test('getMemoryOptimizedFloatTextureSize [1,1,6], bitRatio 4', () => { - assert.deepEqual(Array.from(utils.getMemoryOptimizedFloatTextureSize([1, 1, 6], 4)), [1, 2]); + assert.deepEqual( + Array.from(utils.getMemoryOptimizedFloatTextureSize([1, 1, 6], 4)), + [1, 2] + ); }); test('getMemoryOptimizedFloatTextureSize [6,1,1], bitRatio 2', () => { - assert.deepEqual(Array.from(utils.getMemoryOptimizedFloatTextureSize([6, 1, 1], 2)), [2, 2]); + assert.deepEqual( + Array.from(utils.getMemoryOptimizedFloatTextureSize([6, 1, 1], 2)), + [2, 2] + ); }); test('getMemoryOptimizedFloatTextureSize [1,6,1], bitRatio 2', () => { - assert.deepEqual(Array.from(utils.getMemoryOptimizedFloatTextureSize([1, 6, 1], 2)), [2, 2]); + assert.deepEqual( + Array.from(utils.getMemoryOptimizedFloatTextureSize([1, 6, 1], 2)), + [2, 2] + ); }); test('getMemoryOptimizedFloatTextureSize [1,1,6], bitRatio 2', () => { - assert.deepEqual(Array.from(utils.getMemoryOptimizedFloatTextureSize([1, 1, 6], 2)), [2, 2]); + assert.deepEqual( + Array.from(utils.getMemoryOptimizedFloatTextureSize([1, 1, 6], 2)), + [2, 2] + ); }); test('getMemoryOptimizedFloatTextureSize [6,1,1], bitRatio 1', () => { - assert.deepEqual(Array.from(utils.getMemoryOptimizedFloatTextureSize([6, 1, 1], 1)), [4, 2]); + assert.deepEqual( + Array.from(utils.getMemoryOptimizedFloatTextureSize([6, 1, 1], 1)), + [4, 2] + ); }); test('getMemoryOptimizedFloatTextureSize [1,6,1], bitRatio 1', () => { - assert.deepEqual(Array.from(utils.getMemoryOptimizedFloatTextureSize([1, 6, 1], 1)), [4, 2]); + assert.deepEqual( + Array.from(utils.getMemoryOptimizedFloatTextureSize([1, 6, 1], 1)), + [4, 2] + ); }); test('getMemoryOptimizedFloatTextureSize [1,1,6], bitRatio 1', () => { - assert.deepEqual(Array.from(utils.getMemoryOptimizedFloatTextureSize([1, 1, 6], 1)), [4, 2]); + assert.deepEqual( + Array.from(utils.getMemoryOptimizedFloatTextureSize([1, 1, 6], 1)), + [4, 2] + ); }); test('getMemoryOptimizedPackedTextureSize [6,1,1], bitRatio 4', () => { - assert.deepEqual(Array.from(utils.getMemoryOptimizedPackedTextureSize([6, 1, 1], 4)), [4, 2]); + assert.deepEqual( + Array.from(utils.getMemoryOptimizedPackedTextureSize([6, 1, 1], 4)), + [4, 2] + ); }); test('getMemoryOptimizedPackedTextureSize [1,6,1], bitRatio 4', () => { - assert.deepEqual(Array.from(utils.getMemoryOptimizedPackedTextureSize([1, 6, 1], 4)), [4, 2]); + assert.deepEqual( + Array.from(utils.getMemoryOptimizedPackedTextureSize([1, 6, 1], 4)), + [4, 2] + ); }); test('getMemoryOptimizedPackedTextureSize [1,1,6], bitRatio 4', () => { - assert.deepEqual(Array.from(utils.getMemoryOptimizedPackedTextureSize([1, 1, 6], 4)), [4, 2]); + assert.deepEqual( + Array.from(utils.getMemoryOptimizedPackedTextureSize([1, 1, 6], 4)), + [4, 2] + ); }); test('getMemoryOptimizedPackedTextureSize [6,1,1], bitRatio 2', () => { - assert.deepEqual(Array.from(utils.getMemoryOptimizedPackedTextureSize([6, 1, 1], 2)), [2, 2]); + assert.deepEqual( + Array.from(utils.getMemoryOptimizedPackedTextureSize([6, 1, 1], 2)), + [2, 2] + ); }); test('getMemoryOptimizedPackedTextureSize [1,6,1], bitRatio 2', () => { - assert.deepEqual(Array.from(utils.getMemoryOptimizedPackedTextureSize([1, 6, 1], 2)), [2, 2]); + assert.deepEqual( + Array.from(utils.getMemoryOptimizedPackedTextureSize([1, 6, 1], 2)), + [2, 2] + ); }); test('getMemoryOptimizedPackedTextureSize [1,1,6], bitRatio 2', () => { - assert.deepEqual(Array.from(utils.getMemoryOptimizedPackedTextureSize([1, 1, 6], 2)), [2, 2]); + assert.deepEqual( + Array.from(utils.getMemoryOptimizedPackedTextureSize([1, 1, 6], 2)), + [2, 2] + ); }); test('getMemoryOptimizedPackedTextureSize [6,1,1], bitRatio 1', () => { - assert.deepEqual(Array.from(utils.getMemoryOptimizedPackedTextureSize([6, 1, 1], 1)), [1, 2]); + assert.deepEqual( + Array.from(utils.getMemoryOptimizedPackedTextureSize([6, 1, 1], 1)), + [1, 2] + ); }); test('getMemoryOptimizedPackedTextureSize [1,6,1], bitRatio 1', () => { - assert.deepEqual(Array.from(utils.getMemoryOptimizedPackedTextureSize([1, 6, 1], 1)), [1, 2]); + assert.deepEqual( + Array.from(utils.getMemoryOptimizedPackedTextureSize([1, 6, 1], 1)), + [1, 2] + ); }); test('getMemoryOptimizedPackedTextureSize [1,1,6], bitRatio 1', () => { - assert.deepEqual(Array.from(utils.getMemoryOptimizedPackedTextureSize([1, 1, 6], 1)), [1, 2]); + assert.deepEqual( + Array.from(utils.getMemoryOptimizedPackedTextureSize([1, 1, 6], 1)), + [1, 2] + ); }); test('getKernelTextureSize for [1,2] output, optimizeFloatMemory = true, and precision = "unsigned"', () => { - const textureSize = utils.getKernelTextureSize({ - optimizeFloatMemory: true, - precision: 'unsigned', - }, [1,2]); - assert.deepEqual(textureSize, new Int32Array([1,2])); + const textureSize = utils.getKernelTextureSize( + { + optimizeFloatMemory: true, + precision: 'unsigned', + }, + [1, 2] + ); + assert.deepEqual(textureSize, new Int32Array([1, 2])); }); test('getKernelTextureSize for [2,3] output, optimizeFloatMemory = true, and precision = "unsigned"', () => { - const textureSize = utils.getKernelTextureSize({ - optimizeFloatMemory: true, - precision: 'unsigned', - }, [2,3]); - assert.deepEqual(textureSize, new Int32Array([2,3])); + const textureSize = utils.getKernelTextureSize( + { + optimizeFloatMemory: true, + precision: 'unsigned', + }, + [2, 3] + ); + assert.deepEqual(textureSize, new Int32Array([2, 3])); }); test('getKernelTextureSize for [4,2] output, optimizeFloatMemory = true, and precision = "unsigned"', () => { - const textureSize = utils.getKernelTextureSize({ - optimizeFloatMemory: true, - precision: 'unsigned', - }, [4,2]); - assert.deepEqual(textureSize, new Int32Array([4,2])); + const textureSize = utils.getKernelTextureSize( + { + optimizeFloatMemory: true, + precision: 'unsigned', + }, + [4, 2] + ); + assert.deepEqual(textureSize, new Int32Array([4, 2])); }); test('getKernelTextureSize for [6,1,1] output, optimizeFloatMemory = true, and precision = "unsigned"', () => { - const textureSize = utils.getKernelTextureSize({ - optimizeFloatMemory: true, - precision: 'unsigned', - }, [6,1,1]); - assert.deepEqual(textureSize, new Int32Array([2,3])); + const textureSize = utils.getKernelTextureSize( + { + optimizeFloatMemory: true, + precision: 'unsigned', + }, + [6, 1, 1] + ); + assert.deepEqual(textureSize, new Int32Array([2, 3])); }); test('getKernelTextureSize for [1,6,1] output, optimizeFloatMemory = true, and precision = "unsigned"', () => { - const textureSize = utils.getKernelTextureSize({ - optimizeFloatMemory: true, - precision: 'unsigned', - }, [1,6,1]); - assert.deepEqual(textureSize, new Int32Array([1,6])); + const textureSize = utils.getKernelTextureSize( + { + optimizeFloatMemory: true, + precision: 'unsigned', + }, + [1, 6, 1] + ); + assert.deepEqual(textureSize, new Int32Array([1, 6])); }); test('getKernelTextureSize for [1,1,6] output, optimizeFloatMemory = true, and precision = "unsigned"', () => { - const textureSize = utils.getKernelTextureSize({ - optimizeFloatMemory: true, - precision: 'unsigned', - }, [1,1,6]); - assert.deepEqual(textureSize, new Int32Array([2,3])); + const textureSize = utils.getKernelTextureSize( + { + optimizeFloatMemory: true, + precision: 'unsigned', + }, + [1, 1, 6] + ); + assert.deepEqual(textureSize, new Int32Array([2, 3])); }); test('getKernelTextureSize for [1,2] output, optimizeFloatMemory = true, and precision = "single"', () => { - const textureSize = utils.getKernelTextureSize({ - optimizeFloatMemory: true, - precision: 'single', - }, [1,2]); - assert.deepEqual(textureSize, new Int32Array([1,1])); + const textureSize = utils.getKernelTextureSize( + { + optimizeFloatMemory: true, + precision: 'single', + }, + [1, 2] + ); + assert.deepEqual(textureSize, new Int32Array([1, 1])); }); test('getKernelTextureSize for [2,3] output, optimizeFloatMemory = true, and precision = "single"', () => { - const textureSize = utils.getKernelTextureSize({ - optimizeFloatMemory: true, - precision: 'single', - }, [2,3]); - assert.deepEqual(textureSize, new Int32Array([1,2])); + const textureSize = utils.getKernelTextureSize( + { + optimizeFloatMemory: true, + precision: 'single', + }, + [2, 3] + ); + assert.deepEqual(textureSize, new Int32Array([1, 2])); }); test('getKernelTextureSize for [4,2] output, optimizeFloatMemory = true, and precision = "single"', () => { - const textureSize = utils.getKernelTextureSize({ - optimizeFloatMemory: true, - precision: 'single', - }, [4,2]); - assert.deepEqual(textureSize, new Int32Array([1,2])); + const textureSize = utils.getKernelTextureSize( + { + optimizeFloatMemory: true, + precision: 'single', + }, + [4, 2] + ); + assert.deepEqual(textureSize, new Int32Array([1, 2])); }); test('getKernelTextureSize for [6,1,1] output, optimizeFloatMemory = true, and precision = "single"', () => { - const textureSize = utils.getKernelTextureSize({ - optimizeFloatMemory: true, - precision: 'single', - }, [6,1,1]); - assert.deepEqual(textureSize, new Int32Array([1,2])); + const textureSize = utils.getKernelTextureSize( + { + optimizeFloatMemory: true, + precision: 'single', + }, + [6, 1, 1] + ); + assert.deepEqual(textureSize, new Int32Array([1, 2])); }); test('getKernelTextureSize for [1,6,1] output, optimizeFloatMemory = true, and precision = "single"', () => { - const textureSize = utils.getKernelTextureSize({ - optimizeFloatMemory: true, - precision: 'single', - }, [1,6,1]); - assert.deepEqual(textureSize, new Int32Array([1,2])); + const textureSize = utils.getKernelTextureSize( + { + optimizeFloatMemory: true, + precision: 'single', + }, + [1, 6, 1] + ); + assert.deepEqual(textureSize, new Int32Array([1, 2])); }); test('getKernelTextureSize for [1,1,6] output, optimizeFloatMemory = true, and precision = "single"', () => { - const textureSize = utils.getKernelTextureSize({ - optimizeFloatMemory: true, - precision: 'single', - }, [1,1,6]); - assert.deepEqual(textureSize, new Int32Array([1,2])); + const textureSize = utils.getKernelTextureSize( + { + optimizeFloatMemory: true, + precision: 'single', + }, + [1, 1, 6] + ); + assert.deepEqual(textureSize, new Int32Array([1, 2])); }); test('erectPackedFloat', () => { - const array = new Float32Array([0,1,2,3,4,5,0,0]); + const array = new Float32Array([0, 1, 2, 3, 4, 5, 0, 0]); const result = utils.erectPackedFloat(array, 6); - assert.deepEqual(result, new Float32Array([0,1,2,3,4,5])); + assert.deepEqual(result, new Float32Array([0, 1, 2, 3, 4, 5])); }); test('erect2DPackedFloat', () => { - const array = new Float32Array([0,1,2,3,4,5,6,7,8,0,0,0,0]); + const array = new Float32Array([0, 1, 2, 3, 4, 5, 6, 7, 8, 0, 0, 0, 0]); const result = utils.erect2DPackedFloat(array, 3, 3); assert.deepEqual(result, [ - new Float32Array([0,1,2]), - new Float32Array([3,4,5]), - new Float32Array([6,7,8]) + new Float32Array([0, 1, 2]), + new Float32Array([3, 4, 5]), + new Float32Array([6, 7, 8]), ]); }); test('erect3DPackedFloat', () => { - const array = new Float32Array([0,1,2,3,4,5,6,7,0,0,0,0,0]); + const array = new Float32Array([0, 1, 2, 3, 4, 5, 6, 7, 0, 0, 0, 0, 0]); const result = utils.erect3DPackedFloat(array, 2, 2, 2); assert.deepEqual(result, [ - [ - new Float32Array([0,1]), - new Float32Array([2,3]), - ],[ - new Float32Array([4,5]), - new Float32Array([6,7]), - ] + [new Float32Array([0, 1]), new Float32Array([2, 3])], + [new Float32Array([4, 5]), new Float32Array([6, 7])], ]); }); test('erectMemoryOptimizedFloat', () => { - const array = new Float32Array([0,1,2,3,4,5,0,0]); + const array = new Float32Array([0, 1, 2, 3, 4, 5, 0, 0]); const result = utils.erectMemoryOptimizedFloat(array, 6); - assert.deepEqual(result, new Float32Array([0,1,2,3,4,5])); + assert.deepEqual(result, new Float32Array([0, 1, 2, 3, 4, 5])); }); test('erectMemoryOptimized2DFloat', () => { - const array = new Float32Array([0,1,2,3,4,5,6,7,8,0,0,0,0]); + const array = new Float32Array([0, 1, 2, 3, 4, 5, 6, 7, 8, 0, 0, 0, 0]); const result = utils.erectMemoryOptimized2DFloat(array, 3, 3); assert.deepEqual(result, [ - new Float32Array([0,1,2]), - new Float32Array([3,4,5]), - new Float32Array([6,7,8]) + new Float32Array([0, 1, 2]), + new Float32Array([3, 4, 5]), + new Float32Array([6, 7, 8]), ]); }); test('erectMemoryOptimized3DFloat', () => { - const array = new Float32Array([0,1,2,3,4,5,6,7,0,0,0,0,0]); + const array = new Float32Array([0, 1, 2, 3, 4, 5, 6, 7, 0, 0, 0, 0, 0]); const result = utils.erectMemoryOptimized3DFloat(array, 2, 2, 2); assert.deepEqual(result, [ - [ - new Float32Array([0,1]), - new Float32Array([2,3]), - ],[ - new Float32Array([4,5]), - new Float32Array([6,7]), - ] + [new Float32Array([0, 1]), new Float32Array([2, 3])], + [new Float32Array([4, 5]), new Float32Array([6, 7])], ]); }); test('erectFloat', () => { const array = new Float32Array([ - 0,0,0,0, - 1,0,0,0, - 2,0,0,0, - 3,0,0,0, - 4,0,0,0, - 5,0,0,0 + 0, 0, 0, 0, 1, 0, 0, 0, 2, 0, 0, 0, 3, 0, 0, 0, 4, 0, 0, 0, 5, 0, 0, 0, ]); const result = utils.erectFloat(array, 6); - assert.deepEqual(result, new Float32Array([0,1,2,3,4,5])); + assert.deepEqual(result, new Float32Array([0, 1, 2, 3, 4, 5])); }); test('erect2DFloat', () => { const array = new Float32Array([ - 0,0,0,0, - 1,0,0,0, - 2,0,0,0, - 3,0,0,0, - 4,0,0,0, - 5,0,0,0, - 6,0,0,0, - 7,0,0,0, - 8,0,0,0, - 0,0,0,0 + 0, 0, 0, 0, 1, 0, 0, 0, 2, 0, 0, 0, 3, 0, 0, 0, 4, 0, 0, 0, 5, 0, 0, 0, 6, + 0, 0, 0, 7, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, ]); const result = utils.erect2DFloat(array, 3, 3); assert.deepEqual(result, [ - new Float32Array([0,1,2]), - new Float32Array([3,4,5]), - new Float32Array([6,7,8]) + new Float32Array([0, 1, 2]), + new Float32Array([3, 4, 5]), + new Float32Array([6, 7, 8]), ]); }); test('erect3DFloat', () => { const array = new Float32Array([ - 0,0,0,0, - 1,0,0,0, - 2,0,0,0, - 3,0,0,0, - 4,0,0,0, - 5,0,0,0, - 6,0,0,0, - 7,0,0,0, - 0,0,0,0 + 0, 0, 0, 0, 1, 0, 0, 0, 2, 0, 0, 0, 3, 0, 0, 0, 4, 0, 0, 0, 5, 0, 0, 0, 6, + 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, ]); const result = utils.erect3DFloat(array, 2, 2, 2); assert.deepEqual(result, [ - [ - new Float32Array([0,1]), - new Float32Array([2,3]), - ],[ - new Float32Array([4,5]), - new Float32Array([6,7]), - ] + [new Float32Array([0, 1]), new Float32Array([2, 3])], + [new Float32Array([4, 5]), new Float32Array([6, 7])], ]); }); test('erectArray2', () => { const array = new Float32Array([ - 0,1,0,0, - 2,3,0,0, - 4,5,0,0, - 6,7,0,0 + 0, 1, 0, 0, 2, 3, 0, 0, 4, 5, 0, 0, 6, 7, 0, 0, ]); const result = utils.erectArray2(array, 4); assert.deepEqual(result, [ - new Float32Array([0,1]), - new Float32Array([2,3]), - new Float32Array([4,5]), - new Float32Array([6,7]), + new Float32Array([0, 1]), + new Float32Array([2, 3]), + new Float32Array([4, 5]), + new Float32Array([6, 7]), ]); }); test('erect2DArray2', () => { const array = new Float32Array([ - 0,1,0,0, - 2,3,0,0, - 4,5,0,0, - 6,7,0,0 + 0, 1, 0, 0, 2, 3, 0, 0, 4, 5, 0, 0, 6, 7, 0, 0, ]); const result = utils.erect2DArray2(array, 2, 2); assert.deepEqual(result, [ - [ - new Float32Array([0,1]), - new Float32Array([2,3]), - ], - [ - new Float32Array([4,5]), - new Float32Array([6,7]), - ] + [new Float32Array([0, 1]), new Float32Array([2, 3])], + [new Float32Array([4, 5]), new Float32Array([6, 7])], ]); }); test('erect3DArray2', () => { const array = new Float32Array([ - 0,1,0,0, - 2,3,0,0, - 4,5,0,0, - 6,7,0,0, - 8,9,0,0, - 10,11,0,0, - 12,13,0,0, - 14,15,0,0, + 0, 1, 0, 0, 2, 3, 0, 0, 4, 5, 0, 0, 6, 7, 0, 0, 8, 9, 0, 0, 10, 11, 0, 0, + 12, 13, 0, 0, 14, 15, 0, 0, ]); const result = utils.erect3DArray2(array, 2, 2, 2); assert.deepEqual(result, [ [ - [ - new Float32Array([0,1]), - new Float32Array([2,3]), - ], - [ - new Float32Array([4,5]), - new Float32Array([6,7]), - ] + [new Float32Array([0, 1]), new Float32Array([2, 3])], + [new Float32Array([4, 5]), new Float32Array([6, 7])], ], [ - [ - new Float32Array([8,9]), - new Float32Array([10,11]), - ], - [ - new Float32Array([12,13]), - new Float32Array([14,15]), - ] - ] + [new Float32Array([8, 9]), new Float32Array([10, 11])], + [new Float32Array([12, 13]), new Float32Array([14, 15])], + ], ]); }); test('erectArray3', () => { const array = new Float32Array([ - 0,1,2,0, - 3,4,5,0, - 6,7,8,0, - 9,10,11,0 + 0, 1, 2, 0, 3, 4, 5, 0, 6, 7, 8, 0, 9, 10, 11, 0, ]); const result = utils.erectArray3(array, 4); assert.deepEqual(result, [ - new Float32Array([0,1,2]), - new Float32Array([3,4,5]), - new Float32Array([6,7,8]), - new Float32Array([9,10,11]), + new Float32Array([0, 1, 2]), + new Float32Array([3, 4, 5]), + new Float32Array([6, 7, 8]), + new Float32Array([9, 10, 11]), ]); }); test('erect2DArray3', () => { const array = new Float32Array([ - 0,1,2,0, - 3,4,5,0, - 6,7,8,0, - 9,10,11,0, + 0, 1, 2, 0, 3, 4, 5, 0, 6, 7, 8, 0, 9, 10, 11, 0, ]); const result = utils.erect2DArray3(array, 2, 2); assert.deepEqual(result, [ - [ - new Float32Array([0,1,2]), - new Float32Array([3,4,5]), - ], - [ - new Float32Array([6,7,8]), - new Float32Array([9,10,11]), - ] + [new Float32Array([0, 1, 2]), new Float32Array([3, 4, 5])], + [new Float32Array([6, 7, 8]), new Float32Array([9, 10, 11])], ]); }); test('erect3DArray3', () => { const array = new Float32Array([ - 0,1,2,0, - 3,4,5,0, - 6,7,8,0, - 9,10,11,0, - 12,13,14,0, - 15,16,17,0, - 18,19,20,0, - 21,22,23,0, + 0, 1, 2, 0, 3, 4, 5, 0, 6, 7, 8, 0, 9, 10, 11, 0, 12, 13, 14, 0, 15, 16, + 17, 0, 18, 19, 20, 0, 21, 22, 23, 0, ]); const result = utils.erect3DArray3(array, 2, 2, 2); assert.deepEqual(result, [ [ - [ - new Float32Array([0,1,2]), - new Float32Array([3,4,5]), - ], - [ - new Float32Array([6,7,8]), - new Float32Array([9,10,11]), - ] + [new Float32Array([0, 1, 2]), new Float32Array([3, 4, 5])], + [new Float32Array([6, 7, 8]), new Float32Array([9, 10, 11])], ], [ - [ - new Float32Array([12,13,14]), - new Float32Array([15,16,17]), - ], - [ - new Float32Array([18,19,20]), - new Float32Array([21,22,23]), - ] - ] + [new Float32Array([12, 13, 14]), new Float32Array([15, 16, 17])], + [new Float32Array([18, 19, 20]), new Float32Array([21, 22, 23])], + ], ]); }); test('erectArray4', () => { const array = new Float32Array([ - 0,1,2,3, - 4,5,6,7, - 8,9,10,11, - 12,13,14,15, + 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, ]); const result = utils.erectArray4(array, 4); assert.deepEqual(result, [ - new Float32Array([0,1,2,3]), - new Float32Array([4,5,6,7]), - new Float32Array([8,9,10,11]), - new Float32Array([12,13,14,15]), + new Float32Array([0, 1, 2, 3]), + new Float32Array([4, 5, 6, 7]), + new Float32Array([8, 9, 10, 11]), + new Float32Array([12, 13, 14, 15]), ]); - }); test('erect2DArray4', () => { const array = new Float32Array([ - 0,1,2,3, - 4,5,6,7, - 8,9,10,11, - 12,13,14,15, + 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, ]); const result = utils.erect2DArray4(array, 2, 2); assert.deepEqual(result, [ - [ - new Float32Array([0,1,2,3]), - new Float32Array([4,5,6,7]), - ], - [ - new Float32Array([8,9,10,11]), - new Float32Array([12,13,14,15]), - ] + [new Float32Array([0, 1, 2, 3]), new Float32Array([4, 5, 6, 7])], + [new Float32Array([8, 9, 10, 11]), new Float32Array([12, 13, 14, 15])], ]); }); test('erect3DArray4', () => { const array = new Float32Array([ - 0,1,2,3, - 4,5,6,7, - 8,9,10,11, - 12,13,14,15, - 16,17,18,19, - 20,21,22,23, - 24,25,26,27, - 28,29,30,31, + 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, + 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, ]); const result = utils.erect3DArray4(array, 2, 2, 2); assert.deepEqual(result, [ [ - [ - new Float32Array([0,1,2,3]), - new Float32Array([4,5,6,7]), - ], - [ - new Float32Array([8,9,10,11]), - new Float32Array([12,13,14,15]), - ] + [new Float32Array([0, 1, 2, 3]), new Float32Array([4, 5, 6, 7])], + [new Float32Array([8, 9, 10, 11]), new Float32Array([12, 13, 14, 15])], ], [ - [ - new Float32Array([16,17,18,19]), - new Float32Array([20,21,22,23]), - ], - [ - new Float32Array([24,25,26,27]), - new Float32Array([28,29,30,31]), - ] - ] + [new Float32Array([16, 17, 18, 19]), new Float32Array([20, 21, 22, 23])], + [new Float32Array([24, 25, 26, 27]), new Float32Array([28, 29, 30, 31])], + ], ]); }); @@ -563,11 +547,15 @@ test('flattenFunctionToString', () => { utils.erect3DArray3, utils.erectArray4, utils.erect2DArray4, - utils.erect3DArray4 - ].forEach(fn => eval(utils.flattenFunctionToString(fn, { - findDependency: () => {}, - thisLookup: () => {}, - }))); + utils.erect3DArray4, + ].forEach(fn => + eval( + utils.flattenFunctionToString(fn, { + findDependency: () => {}, + thisLookup: () => {}, + }) + ) + ); assert.ok(true); }); @@ -579,7 +567,7 @@ test('improper getMinifySafeName usage with arrow function', () => { test('improper getMinifySafeName usage with regular function', () => { assert.throws(() => { - utils.getMinifySafeName(function() {}); + utils.getMinifySafeName(function () {}); }, 'Unrecognized function type.'); }); @@ -595,4 +583,4 @@ test('proper getMinifySafeName usage with regular function', () => { return n; }); assert.equal(safeName, 'n'); -}); \ No newline at end of file +}); diff --git a/test/issues/114-create-kernel-map-run-second-time.js b/test/issues/114-create-kernel-map-run-second-time.js index 7d15c517..25d25bf7 100644 --- a/test/issues/114-create-kernel-map-run-second-time.js +++ b/test/issues/114-create-kernel-map-run-second-time.js @@ -1,17 +1,20 @@ const { assert, skip, test, module: describe } = require('qunit'); -const { GPU } = require('../../src'); +const { GPU } = require('../..'); describe('issue # 114'); + function secondKernelMap(mode) { const gpu = new GPU({ mode }); const A = [1, 2, 3, 4, 5]; const B = [1, 2, 3, 4, 5]; - function add(a,b){ + + function add(a, b) { return a + b; } - const kernels = gpu.createKernelMap([add], function(a, b) { - return add(a[this.thread.x], b[this.thread.x]); - }) + const kernels = gpu + .createKernelMap([add], function (a, b) { + return add(a[this.thread.x], b[this.thread.x]); + }) .setOutput([5]); const E = kernels(A, B).result; @@ -23,18 +26,33 @@ function secondKernelMap(mode) { assert.deepEqual(Array.from(G), [2, 4, 6, 8, 10]); gpu.destroy(); } -(GPU.isKernelMapSupported ? test : skip)("Issue #114 - run createKernelMap the second time auto", () => { - secondKernelMap(); -}); -(GPU.isKernelMapSupported ? test : skip)("Issue #114 - run createKernelMap the second time gpu", () => { - secondKernelMap('gpu'); -}); -(GPU.isWebGLSupported ? test : skip)("Issue #114 - run createKernelMap the second time webgl", () => { - secondKernelMap('webgl'); -}); -(GPU.isWebGL2Supported ? test : skip)("Issue #114 - run createKernelMap the second time webgl2", () => { - secondKernelMap('webgl2'); -}); -(GPU.isHeadlessGLSupported && GPU.isKernelMapSupported ? test : skip)("Issue #114 - run createKernelMap the second time headlessgl", () => { - secondKernelMap('headlessgl'); -}); +(GPU.isKernelMapSupported ? test : skip)( + 'Issue #114 - run createKernelMap the second time auto', + () => { + secondKernelMap(); + } +); +(GPU.isKernelMapSupported ? test : skip)( + 'Issue #114 - run createKernelMap the second time gpu', + () => { + secondKernelMap('gpu'); + } +); +(GPU.isWebGLSupported ? test : skip)( + 'Issue #114 - run createKernelMap the second time webgl', + () => { + secondKernelMap('webgl'); + } +); +(GPU.isWebGL2Supported ? test : skip)( + 'Issue #114 - run createKernelMap the second time webgl2', + () => { + secondKernelMap('webgl2'); + } +); +(GPU.isHeadlessGLSupported && GPU.isKernelMapSupported ? test : skip)( + 'Issue #114 - run createKernelMap the second time headlessgl', + () => { + secondKernelMap('headlessgl'); + } +); diff --git a/test/issues/116-multiple-kernels-run-again.js b/test/issues/116-multiple-kernels-run-again.js index a3bd4a22..3c161ec2 100644 --- a/test/issues/116-multiple-kernels-run-again.js +++ b/test/issues/116-multiple-kernels-run-again.js @@ -1,5 +1,5 @@ const { assert, skip, test, module: describe } = require('qunit'); -const { GPU } = require('../../src'); +const { GPU } = require('../..'); describe('issue #116'); @@ -10,16 +10,17 @@ function multipleKernels(mode) { const sizes = [2, 5, 1]; - function add(a, b, x){ + function add(a, b, x) { return a[x] + b[x]; } const layerForward = []; - for (let i = 0; i < 2; i++) { - const kernels = gpu.createKernelMap([add],function(a, b){ - return add(a,b, this.thread.x); - }) + for (let i = 0; i < 2; i++) { + const kernels = gpu + .createKernelMap([add], function (a, b) { + return add(a, b, this.thread.x); + }) .setOutput([sizes[i + 1]]); // First: 5. Second: 1. layerForward.push(kernels); @@ -35,26 +36,41 @@ function multipleKernels(mode) { gpu.destroy(); } -(GPU.isKernelMapSupported ? test : skip)("Issue #116 - multiple kernels run again auto", () => { - multipleKernels(); -}); +(GPU.isKernelMapSupported ? test : skip)( + 'Issue #116 - multiple kernels run again auto', + () => { + multipleKernels(); + } +); -(GPU.isKernelMapSupported ? test : skip)("Issue #116 - multiple kernels run again gpu", () => { - multipleKernels('gpu'); -}); +(GPU.isKernelMapSupported ? test : skip)( + 'Issue #116 - multiple kernels run again gpu', + () => { + multipleKernels('gpu'); + } +); -(GPU.isWebGLSupported ? test : skip)("Issue #116 - multiple kernels run again webgl", () => { - multipleKernels('webgl'); -}); +(GPU.isWebGLSupported ? test : skip)( + 'Issue #116 - multiple kernels run again webgl', + () => { + multipleKernels('webgl'); + } +); -(GPU.isWebGL2Supported ? test : skip)("Issue #116 - multiple kernels run again webgl2", () => { - multipleKernels('webgl2'); -}); +(GPU.isWebGL2Supported ? test : skip)( + 'Issue #116 - multiple kernels run again webgl2', + () => { + multipleKernels('webgl2'); + } +); -(GPU.isHeadlessGLSupported && GPU.isKernelMapSupported ? test : skip)("Issue #116 - multiple kernels run again headlessgl", () => { - multipleKernels('headlessgl'); -}); +(GPU.isHeadlessGLSupported && GPU.isKernelMapSupported ? test : skip)( + 'Issue #116 - multiple kernels run again headlessgl', + () => { + multipleKernels('headlessgl'); + } +); -test("Issue #116 - multiple kernels run again cpu", () => { +test('Issue #116 - multiple kernels run again cpu', () => { multipleKernels('cpu'); }); diff --git a/test/issues/130-typed-array.js b/test/issues/130-typed-array.js index ab79483e..aa71901e 100644 --- a/test/issues/130-typed-array.js +++ b/test/issues/130-typed-array.js @@ -1,12 +1,14 @@ const { assert, skip, test, module: describe } = require('qunit'); -const { GPU } = require('../../src'); +const { GPU } = require('../..'); describe('issue #130'); + function typedArrays(mode) { const gpu = new GPU({ mode }); - const kernel = gpu.createKernel(function(changes) { - return changes[this.thread.y][this.thread.x]; - }) + const kernel = gpu + .createKernel(function (changes) { + return changes[this.thread.y][this.thread.x]; + }) .setOutput([2, 1]); const values = [new Float32Array(2)]; @@ -18,26 +20,32 @@ function typedArrays(mode) { gpu.destroy(); } -test("Issue #130 - typed array auto", () => { +test('Issue #130 - typed array auto', () => { typedArrays(null); }); -test("Issue #130 - typed array gpu", () => { +test('Issue #130 - typed array gpu', () => { typedArrays('gpu'); }); -(GPU.isWebGLSupported ? test : skip)("Issue #130 - typed array webgl", () => { +(GPU.isWebGLSupported ? test : skip)('Issue #130 - typed array webgl', () => { typedArrays('webgl'); }); -(GPU.isWebGL2Supported ? test : skip)("Issue #130 - typed array webgl2", () => { - typedArrays('webgl2'); -}); - -(GPU.isHeadlessGLSupported ? test : skip)("Issue #130 - typed array headlessgl", () => { - typedArrays('headlessgl'); -}); - -test("Issue #130 - typed array cpu", () => { +(GPU.isWebGL2Supported ? test : skip)( + 'Issue #130 - typed array webgl2', + () => { + typedArrays('webgl2'); + } +); + +(GPU.isHeadlessGLSupported ? test : skip)( + 'Issue #130 - typed array headlessgl', + () => { + typedArrays('headlessgl'); + } +); + +test('Issue #130 - typed array cpu', () => { typedArrays('cpu'); }); diff --git a/test/issues/147-missing-constant.js b/test/issues/147-missing-constant.js index f6d8a5d9..2a32a5aa 100644 --- a/test/issues/147-missing-constant.js +++ b/test/issues/147-missing-constant.js @@ -1,17 +1,19 @@ const { assert, skip, test, module: describe, only } = require('qunit'); -const { GPU } = require('../../src'); +const { GPU } = require('../..'); describe('issue #147'); function missingConstant(mode) { const gpu = new GPU({ mode }); + function getPi() { return this.constants.pi; } gpu.addFunction(getPi); - const kernel = gpu.createKernel(function() { - return getPi(); - }) + const kernel = gpu + .createKernel(function () { + return getPi(); + }) .setOutput([1]) .setConstants({ pi: Math.PI }); @@ -20,26 +22,35 @@ function missingConstant(mode) { gpu.destroy(); } -test("Issue #147 - missing constant auto", () => { +test('Issue #147 - missing constant auto', () => { missingConstant(null); }); -test("Issue #147 - missing constant gpu", () => { +test('Issue #147 - missing constant gpu', () => { missingConstant('gpu'); }); -(GPU.isWebGLSupported ? test : skip)("Issue #147 - missing constant webgl", () => { - missingConstant('webgl'); -}); +(GPU.isWebGLSupported ? test : skip)( + 'Issue #147 - missing constant webgl', + () => { + missingConstant('webgl'); + } +); -(GPU.isWebGL2Supported ? test : skip)("Issue #147 - missing constant webgl2", () => { - missingConstant('webgl2'); -}); +(GPU.isWebGL2Supported ? test : skip)( + 'Issue #147 - missing constant webgl2', + () => { + missingConstant('webgl2'); + } +); -(GPU.isHeadlessGLSupported ? test : skip)("Issue #147 - missing constant headlessgl", () => { - missingConstant('headlessgl'); -}); +(GPU.isHeadlessGLSupported ? test : skip)( + 'Issue #147 - missing constant headlessgl', + () => { + missingConstant('headlessgl'); + } +); -test("Issue #147 - missing constant cpu", () => { +test('Issue #147 - missing constant cpu', () => { missingConstant('cpu'); }); diff --git a/test/issues/152-for-vars.js b/test/issues/152-for-vars.js index af1eef22..c00e0f31 100644 --- a/test/issues/152-for-vars.js +++ b/test/issues/152-for-vars.js @@ -1,18 +1,19 @@ const { assert, skip, test, module: describe } = require('qunit'); -const { GPU } = require('../../src'); +const { GPU } = require('../..'); describe('issue #152'); function forVars(mode) { const gpu = new GPU({ mode }); - const kernel = gpu.createKernel(function() { - let sum = 0; - for (let i = 0; i < 2; i++) { - sum += i; - } - return sum; - }) + const kernel = gpu + .createKernel(function () { + let sum = 0; + for (let i = 0; i < 2; i++) { + sum += i; + } + return sum; + }) .setOutput([1, 1]); const result = kernel(); @@ -41,6 +42,9 @@ test('Issue #152 - for vars gpu', () => { forVars('webgl2'); }); -(GPU.isHeadlessGLSupported ? test : skip)('Issue #152 - for vars headlessgl', () => { - forVars('headlessgl'); -}); +(GPU.isHeadlessGLSupported ? test : skip)( + 'Issue #152 - for vars headlessgl', + () => { + forVars('headlessgl'); + } +); diff --git a/test/issues/159-3d.js b/test/issues/159-3d.js index 4f4f66ca..733a6f50 100644 --- a/test/issues/159-3d.js +++ b/test/issues/159-3d.js @@ -2,36 +2,46 @@ const { assert, skip, test, module: describe } = require('qunit'); describe('issue # 159'); -(function() { - const { GPU } = require('../../src'); +(function () { + const { GPU } = require('../..'); + function threeD(mode) { const gpu = new GPU({ mode }); - const kernel = gpu.createKernel(function(grid) { - return grid[this.thread.y][this.thread.x]; - }) + const kernel = gpu + .createKernel(function (grid) { + return grid[this.thread.y][this.thread.x]; + }) .setOutput([5, 5]); //This would cause the above to fail - gpu.createKernel(function() { return 0; }) + gpu + .createKernel(function () { + return 0; + }) .setOutput([5, 5, 5]) .build(); const result = kernel([ - [0,1,2,3,4], - [1,2,3,4,5], - [2,3,4,5,6], - [3,4,5,6,7], - [4,5,6,7,8] + [0, 1, 2, 3, 4], + [1, 2, 3, 4, 5], + [2, 3, 4, 5, 6], + [3, 4, 5, 6, 7], + [4, 5, 6, 7, 8], ]); assert.equal(result.length, 5); - assert.deepEqual(result.map(function(v) { return Array.from(v); }), [ - [0,1,2,3,4], - [1,2,3,4,5], - [2,3,4,5,6], - [3,4,5,6,7], - [4,5,6,7,8] - ]); + assert.deepEqual( + result.map(function (v) { + return Array.from(v); + }), + [ + [0, 1, 2, 3, 4], + [1, 2, 3, 4, 5], + [2, 3, 4, 5, 6], + [3, 4, 5, 6, 7], + [4, 5, 6, 7, 8], + ] + ); gpu.destroy(); } @@ -51,9 +61,12 @@ describe('issue # 159'); threeD('webgl2'); }); - (GPU.isHeadlessGLSupported ? test : skip)('Issue #159 - for vars headlessgl', () => { - threeD('headlessgl'); - }); + (GPU.isHeadlessGLSupported ? test : skip)( + 'Issue #159 - for vars headlessgl', + () => { + threeD('headlessgl'); + } + ); test('Issue #159 - for vars cpu', () => { threeD('cpu'); diff --git a/test/issues/174-webgl-context-warning.js b/test/issues/174-webgl-context-warning.js index b9329011..ff487705 100644 --- a/test/issues/174-webgl-context-warning.js +++ b/test/issues/174-webgl-context-warning.js @@ -1,9 +1,13 @@ const { assert, skip, test, module: describe } = require('qunit'); -const { GPU } = require('../../src'); +const { GPU } = require('../..'); describe('issue # 174'); -const input = [[0, 1, 2], [3, 4, 5], [6, 7, 8]]; +const input = [ + [0, 1, 2], + [3, 4, 5], + [6, 7, 8], +]; // recursive! function manyKernels(mode, kernelCount, t) { @@ -12,23 +16,33 @@ function manyKernels(mode, kernelCount, t) { kernelCount--; const gpu = new GPU({ mode }); - const kernel = gpu.createKernel(function(inp) { - return inp[this.thread.y][this.thread.x]; - }, { - output: [3, 3] - }); - const kernel2 = gpu.createKernel(function() { - return this.thread.y * this.thread.x; - }, { - output: [1024, 1024], - pipeline: true - }); + const kernel = gpu.createKernel( + function (inp) { + return inp[this.thread.y][this.thread.x]; + }, + { + output: [3, 3], + } + ); + const kernel2 = gpu.createKernel( + function () { + return this.thread.y * this.thread.x; + }, + { + output: [1024, 1024], + pipeline: true, + } + ); kernel(input); kernel2(); - assert.strictEqual(kernel.context, kernel2.context, "contexts should be the same object"); + assert.strictEqual( + kernel.context, + kernel2.context, + 'contexts should be the same object' + ); manyKernels(mode, kernelCount, t); const canvas = kernel.canvas; - const eventListener = canvas.addEventListener('webglcontextlost', (e) => { + const eventListener = canvas.addEventListener('webglcontextlost', e => { canvas.removeEventListener('webglcontextlost', eventListener); done(); }); @@ -36,10 +50,16 @@ function manyKernels(mode, kernelCount, t) { gpu.destroy(); } -(GPU.isWebGLSupported ? test : skip)('Issue #174 - webgl context leak webgl', t => { - manyKernels('webgl', 10, t); -}); +(GPU.isWebGLSupported ? test : skip)( + 'Issue #174 - webgl context leak webgl', + t => { + manyKernels('webgl', 10, t); + } +); -(GPU.isWebGL2Supported ? test : skip)('Issue #174 - webgl context leak webgl2', t => { - manyKernels('webgl2', 10, t); -}); +(GPU.isWebGL2Supported ? test : skip)( + 'Issue #174 - webgl context leak webgl2', + t => { + manyKernels('webgl2', 10, t); + } +); diff --git a/test/issues/195-read-from-texture2d.js b/test/issues/195-read-from-texture2d.js index 00e1e68f..4ca54e81 100644 --- a/test/issues/195-read-from-texture2d.js +++ b/test/issues/195-read-from-texture2d.js @@ -1,57 +1,75 @@ const { assert, skip, test, module: describe } = require('qunit'); -const { GPU } = require('../../src'); +const { GPU } = require('../..'); describe('issue #195'); + function makeKernel(gpu) { - return gpu.createKernel(function(a){ - return a[this.thread.y][this.thread.x]; - }) + return gpu + .createKernel(function (a) { + return a[this.thread.y][this.thread.x]; + }) .setOutput([matrixSize, matrixSize]); } function splitArray(array, part) { const result = []; - for(let i = 0; i < array.length; i += part) { + for (let i = 0; i < array.length; i += part) { result.push(array.slice(i, i + part)); } return result; } -const matrixSize = 4; -const A = splitArray(Array.apply(null, Array(matrixSize * matrixSize)).map((_, i) => i), matrixSize); +const matrixSize = 4; +const A = splitArray( + Array.apply(null, Array(matrixSize * matrixSize)).map((_, i) => i), + matrixSize +); function readFromTexture(mode) { const gpu = new GPU({ mode }); const noTexture = makeKernel(gpu); - const texture = makeKernel(gpu) - .setPipeline(true); + const texture = makeKernel(gpu).setPipeline(true); const result = noTexture(A); const textureResult = texture(A).toArray(gpu); - assert.deepEqual(result.map((v) => Array.from(v)), A); - assert.deepEqual(textureResult.map((v) => Array.from(v)), A); + assert.deepEqual( + result.map(v => Array.from(v)), + A + ); + assert.deepEqual( + textureResult.map(v => Array.from(v)), + A + ); assert.deepEqual(textureResult, result); gpu.destroy(); } -test("Issue #195 Read from Texture 2D (GPU only) auto", () => { +test('Issue #195 Read from Texture 2D (GPU only) auto', () => { readFromTexture(); }); -test("Issue #195 Read from Texture 2D (GPU only) gpu", () => { +test('Issue #195 Read from Texture 2D (GPU only) gpu', () => { readFromTexture('gpu'); }); -(GPU.isWebGLSupported ? test : skip)("Issue #195 Read from Texture 2D (GPU only) webgl", () => { - readFromTexture('webgl'); -}); - -(GPU.isWebGL2Supported ? test : skip)("Issue #195 Read from Texture 2D (GPU Only) webgl2", () => { - readFromTexture('webgl2'); -}); +(GPU.isWebGLSupported ? test : skip)( + 'Issue #195 Read from Texture 2D (GPU only) webgl', + () => { + readFromTexture('webgl'); + } +); -(GPU.isHeadlessGLSupported ? test : skip)("Issue #195 Read from Texture 2D (GPU Only) headlessgl", () => { - readFromTexture('headlessgl'); -}); +(GPU.isWebGL2Supported ? test : skip)( + 'Issue #195 Read from Texture 2D (GPU Only) webgl2', + () => { + readFromTexture('webgl2'); + } +); +(GPU.isHeadlessGLSupported ? test : skip)( + 'Issue #195 Read from Texture 2D (GPU Only) headlessgl', + () => { + readFromTexture('headlessgl'); + } +); diff --git a/test/issues/207-same-function-reuse.js b/test/issues/207-same-function-reuse.js index c117ada9..10ca314e 100644 --- a/test/issues/207-same-function-reuse.js +++ b/test/issues/207-same-function-reuse.js @@ -1,28 +1,34 @@ const { assert, skip, test, module: describe, only } = require('qunit'); -const { GPU } = require('../../src'); +const { GPU } = require('../..'); describe('issue #207'); function sameFunctionReuse(mode) { const gpu = new GPU({ mode }); - const kernel = gpu.createKernel(function(kernelArg1, kernelArg2) { - function someFun1(someFun1Arg1, someFun1Arg2) { - return customAdder(someFun1Arg1, someFun1Arg2); - } - function someFun2(someFun2Arg1, someFun2Arg2) { - return customAdder(someFun2Arg1, someFun2Arg2); - } - function customAdder(customAdderArg1, customAdderArg2) { - return customAdderArg1 + customAdderArg2; - } - return someFun1(1, 2) + someFun2(kernelArg1[this.thread.x], kernelArg2[this.thread.x]); - }) + const kernel = gpu + .createKernel(function (kernelArg1, kernelArg2) { + function someFun1(someFun1Arg1, someFun1Arg2) { + return customAdder(someFun1Arg1, someFun1Arg2); + } + + function someFun2(someFun2Arg1, someFun2Arg2) { + return customAdder(someFun2Arg1, someFun2Arg2); + } + + function customAdder(customAdderArg1, customAdderArg2) { + return customAdderArg1 + customAdderArg2; + } + return ( + someFun1(1, 2) + + someFun2(kernelArg1[this.thread.x], kernelArg2[this.thread.x]) + ); + }) .setOutput([6]); const a = [1, 2, 3, 5, 6, 7]; const b = [4, 5, 6, 1, 2, 3]; - const result = kernel(a,b); + const result = kernel(a, b); assert.deepEqual(Array.from(result), [8, 10, 12, 9, 11, 13]); gpu.destroy(); } @@ -35,17 +41,26 @@ test('Issue #207 - same function reuse gpu', () => { sameFunctionReuse('gpu'); }); -(GPU.isWebGLSupported ? test : skip)('Issue #207 - same function reuse webgl', () => { - sameFunctionReuse('webgl'); -}); +(GPU.isWebGLSupported ? test : skip)( + 'Issue #207 - same function reuse webgl', + () => { + sameFunctionReuse('webgl'); + } +); -(GPU.isWebGL2Supported ? test : skip)('Issue #207 - same function reuse webgl2', () => { - sameFunctionReuse('webgl2'); -}); +(GPU.isWebGL2Supported ? test : skip)( + 'Issue #207 - same function reuse webgl2', + () => { + sameFunctionReuse('webgl2'); + } +); -(GPU.isHeadlessGLSupported ? test : skip)('Issue #207 - same function reuse headlessgl', () => { - sameFunctionReuse('headlessgl'); -}); +(GPU.isHeadlessGLSupported ? test : skip)( + 'Issue #207 - same function reuse headlessgl', + () => { + sameFunctionReuse('headlessgl'); + } +); test('Issue #207 - same function reuse cpu', () => { sameFunctionReuse('cpu'); diff --git a/test/issues/212-funky-function-support.js b/test/issues/212-funky-function-support.js index de65e5e3..bdff8dfe 100644 --- a/test/issues/212-funky-function-support.js +++ b/test/issues/212-funky-function-support.js @@ -1,5 +1,5 @@ const { assert, skip, test, module: describe, only } = require('qunit'); -const { GPU } = require('../../src'); +const { GPU } = require('../..'); describe('issue #212'); @@ -8,22 +8,31 @@ function funky(mode) { gpu.addFunction(function add(value1, value2) { return value1 + value2; }); - const kernel = gpu.createKernel(`function(v1, v2) { + const kernel = gpu + .createKernel( + `function(v1, v2) { return (0, _add.add)(v1[this.thread.y][this.thread.x], v2[this.thread.y][this.thread.x]); - }`) + }` + ) .setOutput([2, 2]); - const result = kernel([ - [0,1], - [1,2] - ], [ - [0,1], - [1,2] - ]); - assert.deepEqual(result.map((v) => Array.from(v)), [ - [0,2], - [2,4] - ]); + const result = kernel( + [ + [0, 1], + [1, 2], + ], + [ + [0, 1], + [1, 2], + ] + ); + assert.deepEqual( + result.map(v => Array.from(v)), + [ + [0, 2], + [2, 4], + ] + ); gpu.destroy(); } @@ -35,17 +44,26 @@ test('Issue #212 - funky function support gpu', () => { funky('gpu'); }); -(GPU.isWebGLSupported ? test : skip)('Issue #212 - funky function support webgl', () => { - funky('webgl'); -}); +(GPU.isWebGLSupported ? test : skip)( + 'Issue #212 - funky function support webgl', + () => { + funky('webgl'); + } +); -(GPU.isWebGL2Supported ? test : skip)('Issue #212 - funky function support webgl2', () => { - funky('webgl2'); -}); +(GPU.isWebGL2Supported ? test : skip)( + 'Issue #212 - funky function support webgl2', + () => { + funky('webgl2'); + } +); -(GPU.isHeadlessGLSupported ? test : skip)('Issue #212 - funky function support headlessgl', () => { - funky('headlessgl'); -}); +(GPU.isHeadlessGLSupported ? test : skip)( + 'Issue #212 - funky function support headlessgl', + () => { + funky('headlessgl'); + } +); test('Issue #212 - funky function support cpu', () => { funky('cpu'); diff --git a/test/issues/233-kernel-map-single-precision.js b/test/issues/233-kernel-map-single-precision.js index c82ac744..ab80ab9a 100644 --- a/test/issues/233-kernel-map-single-precision.js +++ b/test/issues/233-kernel-map-single-precision.js @@ -1,5 +1,5 @@ const { assert, skip, test, module: describe, only } = require('qunit'); -const { GPU } = require('../../src'); +const { GPU } = require('../..'); describe('issue # 233'); @@ -8,143 +8,210 @@ describe('issue # 233'); function kernelMapSinglePrecision(mode) { const lst = [1, 2, 3, 4, 5, 6, 7]; const gpu = new GPU({ mode }); - const kernels = gpu.createKernelMap({ - stepA: function (x) { - return x * x; + const kernels = gpu.createKernelMap( + { + stepA: function (x) { + return x * x; + }, + stepB: function (x) { + return x + 1; + }, }, - stepB: function (x) { - return x + 1; - } - }, function (lst) { - const val = lst[this.thread.x]; + function (lst) { + const val = lst[this.thread.x]; - stepA(val); - stepB(val); + stepA(val); + stepB(val); - return val; - }, { - precision: 'single', - output: [lst.length] - }); + return val; + }, + { + precision: 'single', + output: [lst.length], + } + ); const result = kernels(lst); - const unwrap = gpu.createKernel(function(x) { - return x[this.thread.x]; - }, { - output: [lst.length], - precision: 'single', - optimizeFloatMemory: true, - }); + const unwrap = gpu.createKernel( + function (x) { + return x[this.thread.x]; + }, + { + output: [lst.length], + precision: 'single', + optimizeFloatMemory: true, + } + ); const stepAResult = unwrap(result.stepA); const stepBResult = unwrap(result.stepB); - assert.deepEqual(Array.from(stepAResult), lst.map((x) => x * x)); - assert.deepEqual(Array.from(stepBResult), lst.map((x) => x + 1)); + assert.deepEqual( + Array.from(stepAResult), + lst.map(x => x * x) + ); + assert.deepEqual( + Array.from(stepBResult), + lst.map(x => x + 1) + ); assert.deepEqual(Array.from(result.result), lst); gpu.destroy(); } -(GPU.isSinglePrecisionSupported && GPU.isKernelMapSupported ? test : skip)('Issue #233 - kernel map with single precision auto', () => { - kernelMapSinglePrecision(); -}); +(GPU.isSinglePrecisionSupported && GPU.isKernelMapSupported ? test : skip)( + 'Issue #233 - kernel map with single precision auto', + () => { + kernelMapSinglePrecision(); + } +); -(GPU.isSinglePrecisionSupported && GPU.isKernelMapSupported ? test : skip)('Issue #233 - kernel map with single precision gpu', () => { - kernelMapSinglePrecision('gpu'); -}); +(GPU.isSinglePrecisionSupported && GPU.isKernelMapSupported ? test : skip)( + 'Issue #233 - kernel map with single precision gpu', + () => { + kernelMapSinglePrecision('gpu'); + } +); -(GPU.isSinglePrecisionSupported && GPU.isWebGLSupported ? test : skip)('Issue #233 - kernel map with single precision webgl', () => { - kernelMapSinglePrecision('webgl'); -}); +(GPU.isSinglePrecisionSupported && GPU.isWebGLSupported ? test : skip)( + 'Issue #233 - kernel map with single precision webgl', + () => { + kernelMapSinglePrecision('webgl'); + } +); -(GPU.isWebGL2Supported ? test : skip)('Issue #233 - kernel map with single precision webgl2', () => { - kernelMapSinglePrecision('webgl2'); -}); +(GPU.isWebGL2Supported ? test : skip)( + 'Issue #233 - kernel map with single precision webgl2', + () => { + kernelMapSinglePrecision('webgl2'); + } +); -(GPU.isHeadlessGLSupported && GPU.isKernelMapSupported ? test : skip)('Issue #233 - kernel map with single precision headlessgl', () => { - kernelMapSinglePrecision('headlessgl'); -}); +(GPU.isHeadlessGLSupported && GPU.isKernelMapSupported ? test : skip)( + 'Issue #233 - kernel map with single precision headlessgl', + () => { + kernelMapSinglePrecision('headlessgl'); + } +); test('Issue #233 - kernel map with single precision cpu', () => { kernelMapSinglePrecision('cpu'); }); - function kernelMapSinglePrecision2D(mode) { const lst = [ - [1,2,3], - [4,5,6], - [7,8,9] + [1, 2, 3], + [4, 5, 6], + [7, 8, 9], ]; const stepAExpected = [ - [1,4,9], - [16,25,36], - [49,64,81], + [1, 4, 9], + [16, 25, 36], + [49, 64, 81], ]; const stepBExpected = [ - [2,3,4], - [5,6,7], - [8,9,10] + [2, 3, 4], + [5, 6, 7], + [8, 9, 10], ]; const gpu = new GPU({ mode }); - const kernels = gpu.createKernelMap({ - stepA: function (x) { - return x * x; + const kernels = gpu.createKernelMap( + { + stepA: function (x) { + return x * x; + }, + stepB: function (x) { + return x + 1; + }, }, - stepB: function (x) { - return x + 1; - } - }, function (lst) { - const val = lst[this.thread.y][this.thread.x]; + function (lst) { + const val = lst[this.thread.y][this.thread.x]; - stepA(val); - stepB(val); + stepA(val); + stepB(val); - return val; - }, { - precision: 'single', - output: [3, 3] - }); + return val; + }, + { + precision: 'single', + output: [3, 3], + } + ); const result = kernels(lst); - assert.deepEqual(result.stepA.map(v => Array.from(v)), stepAExpected); - assert.deepEqual(result.stepB.map(v => Array.from(v)), stepBExpected); - assert.deepEqual(result.result.map(v => Array.from(v)), lst); - const memoryOptimize = gpu.createKernel(function(x) { - return x[this.thread.y][this.thread.x]; - }, { - output: [3, 3], - precision: 'single', - optimizeFloatMemory: true, - }); + assert.deepEqual( + result.stepA.map(v => Array.from(v)), + stepAExpected + ); + assert.deepEqual( + result.stepB.map(v => Array.from(v)), + stepBExpected + ); + assert.deepEqual( + result.result.map(v => Array.from(v)), + lst + ); + const memoryOptimize = gpu.createKernel( + function (x) { + return x[this.thread.y][this.thread.x]; + }, + { + output: [3, 3], + precision: 'single', + optimizeFloatMemory: true, + } + ); const stepAOptimized = memoryOptimize(result.stepA); const stepBOptimized = memoryOptimize(result.stepB); const resultOptimized = memoryOptimize(result.result); - assert.deepEqual(stepAOptimized.map(v => Array.from(v)), stepAExpected); - assert.deepEqual(stepBOptimized.map(v => Array.from(v)), stepBExpected); - assert.deepEqual(resultOptimized.map(v => Array.from(v)), lst); + assert.deepEqual( + stepAOptimized.map(v => Array.from(v)), + stepAExpected + ); + assert.deepEqual( + stepBOptimized.map(v => Array.from(v)), + stepBExpected + ); + assert.deepEqual( + resultOptimized.map(v => Array.from(v)), + lst + ); gpu.destroy(); } -(GPU.isSinglePrecisionSupported && GPU.isKernelMapSupported ? test : skip)('Issue #233 - kernel map with single precision 2d auto', () => { - kernelMapSinglePrecision2D(); -}); +(GPU.isSinglePrecisionSupported && GPU.isKernelMapSupported ? test : skip)( + 'Issue #233 - kernel map with single precision 2d auto', + () => { + kernelMapSinglePrecision2D(); + } +); -(GPU.isSinglePrecisionSupported && GPU.isKernelMapSupported ? test : skip)('Issue #233 - kernel map with single precision 2d gpu', () => { - kernelMapSinglePrecision2D('gpu'); -}); +(GPU.isSinglePrecisionSupported && GPU.isKernelMapSupported ? test : skip)( + 'Issue #233 - kernel map with single precision 2d gpu', + () => { + kernelMapSinglePrecision2D('gpu'); + } +); -(GPU.isSinglePrecisionSupported && GPU.isWebGLSupported ? test : skip)('Issue #233 - kernel map with single precision 2d webgl', () => { - kernelMapSinglePrecision2D('webgl'); -}); +(GPU.isSinglePrecisionSupported && GPU.isWebGLSupported ? test : skip)( + 'Issue #233 - kernel map with single precision 2d webgl', + () => { + kernelMapSinglePrecision2D('webgl'); + } +); -(GPU.isWebGL2Supported ? test : skip)('Issue #233 - kernel map with single precision 2d webgl2', () => { - kernelMapSinglePrecision2D('webgl2'); -}); +(GPU.isWebGL2Supported ? test : skip)( + 'Issue #233 - kernel map with single precision 2d webgl2', + () => { + kernelMapSinglePrecision2D('webgl2'); + } +); -(GPU.isHeadlessGLSupported && GPU.isKernelMapSupported ? test : skip)('Issue #233 - kernel map with single precision 2d headlessgl', () => { - kernelMapSinglePrecision2D('headlessgl'); -}); +(GPU.isHeadlessGLSupported && GPU.isKernelMapSupported ? test : skip)( + 'Issue #233 - kernel map with single precision 2d headlessgl', + () => { + kernelMapSinglePrecision2D('headlessgl'); + } +); test('Issue #233 - kernel map with single precision 2d cpu', () => { kernelMapSinglePrecision2D('cpu'); @@ -153,71 +220,78 @@ test('Issue #233 - kernel map with single precision 2d cpu', () => { function kernelMapSinglePrecision3D(mode) { const lst = [ [ - [1,2,3], - [4,5,6], - [7,8,9] + [1, 2, 3], + [4, 5, 6], + [7, 8, 9], ], [ - [10,11,12], - [13,14,15], - [16,17,18] - ] + [10, 11, 12], + [13, 14, 15], + [16, 17, 18], + ], ]; const stepAExpected = [ [ - [1,4,9], - [16,25,36], - [49,64,81], + [1, 4, 9], + [16, 25, 36], + [49, 64, 81], ], [ - [100,121,144], - [169,196,225], - [256,289,324], - ] + [100, 121, 144], + [169, 196, 225], + [256, 289, 324], + ], ]; const stepBExpected = [ [ - [2,3,4], - [5,6,7], - [8,9,10] + [2, 3, 4], + [5, 6, 7], + [8, 9, 10], ], [ - [11,12,13], - [14,15,16], - [17,18,19] - ] + [11, 12, 13], + [14, 15, 16], + [17, 18, 19], + ], ]; const gpu = new GPU({ mode }); - const kernels = gpu.createKernelMap({ - stepA: function (x) { - return x * x; + const kernels = gpu.createKernelMap( + { + stepA: function (x) { + return x * x; + }, + stepB: function (x) { + return x + 1; + }, }, - stepB: function (x) { - return x + 1; - } - }, function (lst) { - const val = lst[this.thread.z][this.thread.y][this.thread.x]; + function (lst) { + const val = lst[this.thread.z][this.thread.y][this.thread.x]; - stepA(val); - stepB(val); + stepA(val); + stepB(val); - return val; - }, { - precision: 'single', - output: [3, 3, 2] - }); + return val; + }, + { + precision: 'single', + output: [3, 3, 2], + } + ); const result = kernels(lst); assert.deepEqual(arrayFromCube(result.stepA), stepAExpected); assert.deepEqual(arrayFromCube(result.stepB), stepBExpected); assert.deepEqual(arrayFromCube(result.result), lst); - const memoryOptimize = gpu.createKernel(function(x) { - return x[this.thread.z][this.thread.y][this.thread.x]; - }, { - output: [3, 3, 2], - precision: 'single', - optimizeFloatMemory: true, - }); + const memoryOptimize = gpu.createKernel( + function (x) { + return x[this.thread.z][this.thread.y][this.thread.x]; + }, + { + output: [3, 3, 2], + precision: 'single', + optimizeFloatMemory: true, + } + ); const stepAOptimized = memoryOptimize(result.stepA); const stepBOptimized = memoryOptimize(result.stepB); const resultOptimized = memoryOptimize(result.result); @@ -232,25 +306,40 @@ function kernelMapSinglePrecision3D(mode) { gpu.destroy(); } -(GPU.isSinglePrecisionSupported && GPU.isKernelMapSupported ? test : skip)('Issue #233 - kernel map with single precision 3d auto', () => { - kernelMapSinglePrecision3D(); -}); +(GPU.isSinglePrecisionSupported && GPU.isKernelMapSupported ? test : skip)( + 'Issue #233 - kernel map with single precision 3d auto', + () => { + kernelMapSinglePrecision3D(); + } +); -(GPU.isSinglePrecisionSupported && GPU.isKernelMapSupported ? test : skip)('Issue #233 - kernel map with single precision 3d gpu', () => { - kernelMapSinglePrecision3D('gpu'); -}); +(GPU.isSinglePrecisionSupported && GPU.isKernelMapSupported ? test : skip)( + 'Issue #233 - kernel map with single precision 3d gpu', + () => { + kernelMapSinglePrecision3D('gpu'); + } +); -(GPU.isSinglePrecisionSupported && GPU.isWebGLSupported ? test : skip)('Issue #233 - kernel map with single precision 3d webgl', () => { - kernelMapSinglePrecision3D('webgl'); -}); +(GPU.isSinglePrecisionSupported && GPU.isWebGLSupported ? test : skip)( + 'Issue #233 - kernel map with single precision 3d webgl', + () => { + kernelMapSinglePrecision3D('webgl'); + } +); -(GPU.isWebGL2Supported ? test : skip)('Issue #233 - kernel map with single precision 3d webgl2', () => { - kernelMapSinglePrecision3D('webgl2'); -}); +(GPU.isWebGL2Supported ? test : skip)( + 'Issue #233 - kernel map with single precision 3d webgl2', + () => { + kernelMapSinglePrecision3D('webgl2'); + } +); -(GPU.isHeadlessGLSupported && GPU.isKernelMapSupported ? test : skip)('Issue #233 - kernel map with single precision 3d headlessgl', () => { - kernelMapSinglePrecision3D('headlessgl'); -}); +(GPU.isHeadlessGLSupported && GPU.isKernelMapSupported ? test : skip)( + 'Issue #233 - kernel map with single precision 3d headlessgl', + () => { + kernelMapSinglePrecision3D('headlessgl'); + } +); test('Issue #233 - kernel map with single precision 3d cpu', () => { kernelMapSinglePrecision3D('cpu'); diff --git a/test/issues/241-CPU-vs-GPU-maps-output-differently.js b/test/issues/241-CPU-vs-GPU-maps-output-differently.js index 2297a178..aa45d8bc 100644 --- a/test/issues/241-CPU-vs-GPU-maps-output-differently.js +++ b/test/issues/241-CPU-vs-GPU-maps-output-differently.js @@ -1,19 +1,27 @@ const { assert, skip, test, module: describe } = require('qunit'); -const { GPU } = require('../../src'); +const { GPU } = require('../..'); describe('issue #241'); // this is actually equiv to // return this.thread.y * 3 + this.thread.x; -const input = [[0, 1, 2], [3, 4, 5], [6, 7, 8]]; +const input = [ + [0, 1, 2], + [3, 4, 5], + [6, 7, 8], +]; + function buildIndexTestKernel(mode) { const gpu = new GPU({ mode }); - const kernel = gpu.createKernel(function(inp) { - return inp[this.thread.y][this.thread.x]; - }, { - output: [3, 3] - }); - const result = kernel(input).map((v) => Array.from(v)); + const kernel = gpu.createKernel( + function (inp) { + return inp[this.thread.y][this.thread.x]; + }, + { + output: [3, 3], + } + ); + const result = kernel(input).map(v => Array.from(v)); assert.deepEqual(result, input); gpu.destroy(); } @@ -26,17 +34,26 @@ test('Issue #241 small 2d array input output test gpu', () => { buildIndexTestKernel('gpu'); }); -(GPU.isWebGLSupported ? test : skip)('Issue #241 small 2d array input output test webgl', () => { - buildIndexTestKernel('webgl'); -}); - -(GPU.isWebGL2Supported ? test : skip)('Issue #241 small 2d array input output test webgl2', () => { - buildIndexTestKernel('webgl2'); -}); - -(GPU.isHeadlessGLSupported ? test : skip)('Issue #241 small 2d array input output test headlessgl', () => { - buildIndexTestKernel('headlessgl'); -}); +(GPU.isWebGLSupported ? test : skip)( + 'Issue #241 small 2d array input output test webgl', + () => { + buildIndexTestKernel('webgl'); + } +); + +(GPU.isWebGL2Supported ? test : skip)( + 'Issue #241 small 2d array input output test webgl2', + () => { + buildIndexTestKernel('webgl2'); + } +); + +(GPU.isHeadlessGLSupported ? test : skip)( + 'Issue #241 small 2d array input output test headlessgl', + () => { + buildIndexTestKernel('headlessgl'); + } +); test('Issue #241 small 2d array input output test cpu', () => { buildIndexTestKernel('cpu'); diff --git a/test/issues/259-atan2.js b/test/issues/259-atan2.js index b4366d19..fee39146 100644 --- a/test/issues/259-atan2.js +++ b/test/issues/259-atan2.js @@ -1,15 +1,18 @@ const { assert, skip, test, module: describe } = require('qunit'); -const { GPU } = require('../../src'); +const { GPU } = require('../..'); describe('issue #259'); function buildAtan2KernelResult(mode) { const gpu = new GPU({ mode }); - const kernel = gpu.createKernel(function() { - return Math.atan2(1, 2); - }, { - output: [1], - }); + const kernel = gpu.createKernel( + function () { + return Math.atan2(1, 2); + }, + { + output: [1], + } + ); assert.equal(kernel()[0].toFixed(7), 0.4636476); gpu.destroy(); } @@ -30,9 +33,12 @@ test('Issue #259 atan2 - gpu', () => { buildAtan2KernelResult('webgl2'); }); -(GPU.isHeadlessGLSupported ? test : skip)('Issue #259 atan2 - headlessgl', () => { - buildAtan2KernelResult('headlessgl'); -}); +(GPU.isHeadlessGLSupported ? test : skip)( + 'Issue #259 atan2 - headlessgl', + () => { + buildAtan2KernelResult('headlessgl'); + } +); test('Issue #259 atan2 - cpu', () => { buildAtan2KernelResult('cpu'); diff --git a/test/issues/263-to-string.js b/test/issues/263-to-string.js index f811e017..197f3e92 100644 --- a/test/issues/263-to-string.js +++ b/test/issues/263-to-string.js @@ -1,15 +1,18 @@ const { assert, skip, test, module: describe } = require('qunit'); -const { GPU } = require('../../src'); +const { GPU } = require('../..'); describe('issue #263'); function toString(mode, context, canvas) { const gpu = new GPU({ mode, context, canvas }); - const kernel = gpu.createKernel(function() { - return 1; - }, { - output: [1] - }); + const kernel = gpu.createKernel( + function () { + return 1; + }, + { + output: [1], + } + ); kernel.build(); const string = kernel.toString(); const kernel2 = new Function('return ' + string)()({ context, canvas }); @@ -18,21 +21,30 @@ function toString(mode, context, canvas) { gpu.destroy(); } -(GPU.isWebGLSupported ? test : skip)('Issue #263 toString single function - webgl', () => { - const canvas = document.createElement('canvas'); - const context = canvas.getContext('webgl'); - toString('webgl', context, canvas); -}); +(GPU.isWebGLSupported ? test : skip)( + 'Issue #263 toString single function - webgl', + () => { + const canvas = document.createElement('canvas'); + const context = canvas.getContext('webgl'); + toString('webgl', context, canvas); + } +); -(GPU.isWebGL2Supported ? test : skip)('Issue #263 toString single function - webgl2', () => { - const canvas = document.createElement('canvas'); - const context = canvas.getContext('webgl2'); - toString('webgl2', context, canvas); -}); +(GPU.isWebGL2Supported ? test : skip)( + 'Issue #263 toString single function - webgl2', + () => { + const canvas = document.createElement('canvas'); + const context = canvas.getContext('webgl2'); + toString('webgl2', context, canvas); + } +); -(GPU.isHeadlessGLSupported ? test : skip)('Issue #263 toString single function - headlessgl', () => { - toString('headlessgl', require('gl')(1, 1), null); -}); +(GPU.isHeadlessGLSupported ? test : skip)( + 'Issue #263 toString single function - headlessgl', + () => { + toString('headlessgl', require('gl')(1, 1), null); + } +); test('Issue #263 toString single function - cpu', () => { toString('cpu'); diff --git a/test/issues/267-immutable-sub-kernels.js b/test/issues/267-immutable-sub-kernels.js index eda40838..150cdff5 100644 --- a/test/issues/267-immutable-sub-kernels.js +++ b/test/issues/267-immutable-sub-kernels.js @@ -1,18 +1,21 @@ const { assert, skip, test, module: describe, only } = require('qunit'); -const { GPU } = require('../../src'); +const { GPU } = require('../..'); describe('issue #267 kernel'); function immutableKernelWithoutFloats(mode) { const gpu = new GPU({ mode }); - const kernel = gpu.createKernel(function (v) { - return v[this.thread.x] + 1; - }, { - output: [1], - immutable: true, - pipeline: true, - precision: 'unsigned', - }); + const kernel = gpu.createKernel( + function (v) { + return v[this.thread.x] + 1; + }, + { + output: [1], + immutable: true, + pipeline: true, + precision: 'unsigned', + } + ); // start with a value on CPU const output1 = kernel([1]); @@ -40,28 +43,40 @@ test('Issue #267 immutable kernel output without floats - gpu', () => { immutableKernelWithoutFloats('gpu'); }); -(GPU.isWebGL2Supported ? test : skip)('Issue #267 immutable kernel output without floats - webgl', () => { - immutableKernelWithoutFloats('webgl'); -}); +(GPU.isWebGL2Supported ? test : skip)( + 'Issue #267 immutable kernel output without floats - webgl', + () => { + immutableKernelWithoutFloats('webgl'); + } +); -(GPU.isWebGL2Supported ? test : skip)('Issue #267 immutable kernel output without floats - webgl2', () => { - immutableKernelWithoutFloats('webgl2'); -}); +(GPU.isWebGL2Supported ? test : skip)( + 'Issue #267 immutable kernel output without floats - webgl2', + () => { + immutableKernelWithoutFloats('webgl2'); + } +); -(GPU.isHeadlessGLSupported ? test : skip)('Issue #267 immutable kernel output without floats - headlessgl', () => { - immutableKernelWithoutFloats('headlessgl'); -}); +(GPU.isHeadlessGLSupported ? test : skip)( + 'Issue #267 immutable kernel output without floats - headlessgl', + () => { + immutableKernelWithoutFloats('headlessgl'); + } +); function immutableKernelWithFloats(mode) { const gpu = new GPU({ mode }); - const kernel = gpu.createKernel(function (v) { - return v[this.thread.x] + 1; - }, { - output: [1], - immutable: true, - pipeline: true, - precision: 'single', - }); + const kernel = gpu.createKernel( + function (v) { + return v[this.thread.x] + 1; + }, + { + output: [1], + immutable: true, + pipeline: true, + precision: 'single', + } + ); // start with a value on CPU // reuse that output, simulating that this value will be monitored, and updated via the same kernel @@ -76,26 +91,40 @@ function immutableKernelWithFloats(mode) { gpu.destroy(); } -(GPU.isSinglePrecisionSupported ? test : skip)('Issue #267 immutable kernel output with floats - auto', () => { - immutableKernelWithFloats(); -}); - -(GPU.isSinglePrecisionSupported ? test : skip)('Issue #267 immutable kernel output with floats - gpu', () => { - immutableKernelWithFloats('gpu'); -}); +(GPU.isSinglePrecisionSupported ? test : skip)( + 'Issue #267 immutable kernel output with floats - auto', + () => { + immutableKernelWithFloats(); + } +); -(GPU.isSinglePrecisionSupported && GPU.isWebGL2Supported ? test : skip)('Issue #267 immutable kernel output with floats - webgl', () => { - immutableKernelWithFloats('webgl'); -}); +(GPU.isSinglePrecisionSupported ? test : skip)( + 'Issue #267 immutable kernel output with floats - gpu', + () => { + immutableKernelWithFloats('gpu'); + } +); -(GPU.isSinglePrecisionSupported && GPU.isWebGL2Supported ? test : skip)('Issue #267 immutable kernel output with floats - webgl2', () => { - immutableKernelWithFloats('webgl2'); -}); +(GPU.isSinglePrecisionSupported && GPU.isWebGL2Supported ? test : skip)( + 'Issue #267 immutable kernel output with floats - webgl', + () => { + immutableKernelWithFloats('webgl'); + } +); -(GPU.isSinglePrecisionSupported && GPU.isHeadlessGLSupported ? test : skip)('Issue #267 immutable kernel output with floats - headlessgl', () => { - immutableKernelWithFloats('headlessgl'); -}); +(GPU.isSinglePrecisionSupported && GPU.isWebGL2Supported ? test : skip)( + 'Issue #267 immutable kernel output with floats - webgl2', + () => { + immutableKernelWithFloats('webgl2'); + } +); +(GPU.isSinglePrecisionSupported && GPU.isHeadlessGLSupported ? test : skip)( + 'Issue #267 immutable kernel output with floats - headlessgl', + () => { + immutableKernelWithFloats('headlessgl'); + } +); describe('issue #267 sub kernel'); @@ -112,7 +141,7 @@ function immutableSubKernelsWithoutFloats(mode) { const kernel = gpu.createKernelMap( { valueOutput1: value1, - valueOutput2: value2 + valueOutput2: value2, }, function (a, b) { value1(a[this.thread.x]); @@ -143,29 +172,43 @@ function immutableSubKernelsWithoutFloats(mode) { assert.equal(result3, 4); gpu.destroy(); } -(GPU.isKernelMapSupported ? test : skip)('Issue #267 immutable sub-kernel output - auto', () => { - immutableSubKernelsWithoutFloats(); -}); - -(GPU.isKernelMapSupported ? test : skip)('Issue #267 immutable sub-kernel output - gpu', () => { - immutableSubKernelsWithoutFloats('gpu'); -}); - -(GPU.isWebGLSupported ? test : skip)('Issue #267 immutable sub-kernel output - webgl', () => { - immutableSubKernelsWithoutFloats('webgl'); -}); +(GPU.isKernelMapSupported ? test : skip)( + 'Issue #267 immutable sub-kernel output - auto', + () => { + immutableSubKernelsWithoutFloats(); + } +); -(GPU.isWebGL2Supported ? test : skip)('Issue #267 immutable sub-kernel output - webgl2', () => { - immutableSubKernelsWithoutFloats('webgl2'); -}); +(GPU.isKernelMapSupported ? test : skip)( + 'Issue #267 immutable sub-kernel output - gpu', + () => { + immutableSubKernelsWithoutFloats('gpu'); + } +); -(GPU.isHeadlessGLSupported && GPU.isKernelMapSupported ? test : skip)('Issue #267 immutable sub-kernel output - headlessgl', () => { - immutableSubKernelsWithoutFloats('headlessgl'); -}); +(GPU.isWebGLSupported ? test : skip)( + 'Issue #267 immutable sub-kernel output - webgl', + () => { + immutableSubKernelsWithoutFloats('webgl'); + } +); +(GPU.isWebGL2Supported ? test : skip)( + 'Issue #267 immutable sub-kernel output - webgl2', + () => { + immutableSubKernelsWithoutFloats('webgl2'); + } +); +(GPU.isHeadlessGLSupported && GPU.isKernelMapSupported ? test : skip)( + 'Issue #267 immutable sub-kernel output - headlessgl', + () => { + immutableSubKernelsWithoutFloats('headlessgl'); + } +); describe('issue #267 sub kernels mixed'); + function immutableKernelsMixedWithoutFloats(mode) { function value1(value) { return value + 10; @@ -220,25 +263,40 @@ function immutableKernelsMixedWithoutFloats(mode) { gpu.destroy(); } -(GPU.isKernelMapSupported ? test : skip)('Issue #267 immutable kernel & sub-kernel output without floats - auto', () => { - immutableKernelsMixedWithoutFloats(); -}); +(GPU.isKernelMapSupported ? test : skip)( + 'Issue #267 immutable kernel & sub-kernel output without floats - auto', + () => { + immutableKernelsMixedWithoutFloats(); + } +); -(GPU.isKernelMapSupported ? test : skip)('Issue #267 immutable kernel & sub-kernel output without floats - gpu', () => { - immutableKernelsMixedWithoutFloats('gpu'); -}); +(GPU.isKernelMapSupported ? test : skip)( + 'Issue #267 immutable kernel & sub-kernel output without floats - gpu', + () => { + immutableKernelsMixedWithoutFloats('gpu'); + } +); -(GPU.isWebGLSupported ? test : skip)('Issue #267 immutable kernel & sub-kernel output without floats - webgl', () => { - immutableKernelsMixedWithoutFloats('webgl'); -}); +(GPU.isWebGLSupported ? test : skip)( + 'Issue #267 immutable kernel & sub-kernel output without floats - webgl', + () => { + immutableKernelsMixedWithoutFloats('webgl'); + } +); -(GPU.isWebGL2Supported ? test : skip)('Issue #267 immutable kernel & sub-kernel output without floats - webgl2', () => { - immutableKernelsMixedWithoutFloats('webgl2'); -}); +(GPU.isWebGL2Supported ? test : skip)( + 'Issue #267 immutable kernel & sub-kernel output without floats - webgl2', + () => { + immutableKernelsMixedWithoutFloats('webgl2'); + } +); -(GPU.isHeadlessGLSupported && GPU.isKernelMapSupported ? test : skip)('Issue #267 immutable kernel & sub-kernel output without floats - headlessgl', () => { - immutableKernelsMixedWithoutFloats('headlessgl'); -}); +(GPU.isHeadlessGLSupported && GPU.isKernelMapSupported ? test : skip)( + 'Issue #267 immutable kernel & sub-kernel output without floats - headlessgl', + () => { + immutableKernelsMixedWithoutFloats('headlessgl'); + } +); test('Issue #267 immutable kernel & sub-kernel output without floats - cpu', () => { immutableKernelsMixedWithoutFloats('cpu'); diff --git a/test/issues/270-cache.js b/test/issues/270-cache.js index d08a6e80..6e835821 100644 --- a/test/issues/270-cache.js +++ b/test/issues/270-cache.js @@ -1,5 +1,5 @@ const { assert, skip, test, module: describe } = require('qunit'); -const { WebGLKernel } = require('../../src'); +const { WebGLKernel } = require('../..'); describe('issue # 270'); @@ -8,7 +8,7 @@ test('Issue #270 WebGlKernel getUniformLocation caches falsey - gpu', () => { const context = { getUniformLocation() { throw new Error('tried to get getUniformLocation when falsey'); - } + }, }; const kernel = new WebGLKernel('function() {}', { canvas, context }); kernel.programUniformLocationCache.test = false; diff --git a/test/issues/279-wrong-canvas-size.js b/test/issues/279-wrong-canvas-size.js index ea072def..8c9d7c75 100644 --- a/test/issues/279-wrong-canvas-size.js +++ b/test/issues/279-wrong-canvas-size.js @@ -1,23 +1,26 @@ const { assert, skip, test, module: describe } = require('qunit'); -const { GPU } = require('../../src'); +const { GPU } = require('../..'); describe('issue #279'); const WIDTH = 600; -const HEIGHT = 400; +const HEIGHT = 400; + function wrongCanvasSizeOptimized(mode) { const gpu = new GPU({ mode }); - const initMatrix = gpu.createKernel(function(value) { - return value; - }) + const initMatrix = gpu + .createKernel(function (value) { + return value; + }) .setOptimizeFloatMemory(true) .setOutput([WIDTH, HEIGHT]); - const render = gpu.createKernel(function(matrix) { - const i = matrix[this.thread.y][this.thread.x]; - this.color(i, i, i, 1); - }) + const render = gpu + .createKernel(function (matrix) { + const i = matrix[this.thread.y][this.thread.x]; + this.color(i, i, i, 1); + }) .setOutput([WIDTH, HEIGHT]) .setGraphical(true); @@ -29,40 +32,53 @@ function wrongCanvasSizeOptimized(mode) { gpu.destroy(); } -(GPU.isCanvasSupported ? test : skip)('Issue #279 wrong canvas size optimized - cpu', () => { - wrongCanvasSizeOptimized('cpu'); -}); +(GPU.isCanvasSupported ? test : skip)( + 'Issue #279 wrong canvas size optimized - cpu', + () => { + wrongCanvasSizeOptimized('cpu'); + } +); test('Issue #279 wrong canvas size optimized - gpu', () => { wrongCanvasSizeOptimized('gpu'); }); -(GPU.isWebGLSupported ? test : skip)('Issue #279 wrong canvas size optimized - webgl', () => { - wrongCanvasSizeOptimized('webgl'); -}); - -(GPU.isWebGL2Supported ? test : skip)('Issue #279 wrong canvas size optimized - webgl2', () => { - wrongCanvasSizeOptimized('webgl2'); -}); - -(GPU.isHeadlessGLSupported ? test : skip)('Issue #279 wrong canvas size optimized - headlessgl', () => { - wrongCanvasSizeOptimized('headlessgl'); -}); - +(GPU.isWebGLSupported ? test : skip)( + 'Issue #279 wrong canvas size optimized - webgl', + () => { + wrongCanvasSizeOptimized('webgl'); + } +); + +(GPU.isWebGL2Supported ? test : skip)( + 'Issue #279 wrong canvas size optimized - webgl2', + () => { + wrongCanvasSizeOptimized('webgl2'); + } +); + +(GPU.isHeadlessGLSupported ? test : skip)( + 'Issue #279 wrong canvas size optimized - headlessgl', + () => { + wrongCanvasSizeOptimized('headlessgl'); + } +); function wrongCanvasSizeUnoptimized(mode) { const gpu = new GPU({ mode }); - const initMatrix = gpu.createKernel(function(value) { - return value; - }) + const initMatrix = gpu + .createKernel(function (value) { + return value; + }) .setOptimizeFloatMemory(false) .setOutput([WIDTH, HEIGHT]); - const render = gpu.createKernel(function(matrix) { - const i = matrix[this.thread.y][this.thread.x]; - this.color(i, i, i, 1); - }) + const render = gpu + .createKernel(function (matrix) { + const i = matrix[this.thread.y][this.thread.x]; + this.color(i, i, i, 1); + }) .setOutput([WIDTH, HEIGHT]) .setGraphical(true); @@ -74,22 +90,34 @@ function wrongCanvasSizeUnoptimized(mode) { gpu.destroy(); } -(GPU.isCanvasSupported ? test : skip)('Issue #279 wrong canvas size unoptimized - cpu', () => { - wrongCanvasSizeUnoptimized('cpu'); -}); +(GPU.isCanvasSupported ? test : skip)( + 'Issue #279 wrong canvas size unoptimized - cpu', + () => { + wrongCanvasSizeUnoptimized('cpu'); + } +); test('Issue #279 wrong canvas size unoptimized - gpu', () => { wrongCanvasSizeUnoptimized('gpu'); }); -(GPU.isWebGLSupported ? test : skip)('Issue #279 wrong canvas size unoptimized - webgl', () => { - wrongCanvasSizeUnoptimized('webgl'); -}); - -(GPU.isWebGL2Supported ? test : skip)('Issue #279 wrong canvas size unoptimized - webgl2', () => { - wrongCanvasSizeUnoptimized('webgl2'); -}); - -(GPU.isHeadlessGLSupported ? test : skip)('Issue #279 wrong canvas size unoptimized - headlessgl', () => { - wrongCanvasSizeUnoptimized('headlessgl'); -}); +(GPU.isWebGLSupported ? test : skip)( + 'Issue #279 wrong canvas size unoptimized - webgl', + () => { + wrongCanvasSizeUnoptimized('webgl'); + } +); + +(GPU.isWebGL2Supported ? test : skip)( + 'Issue #279 wrong canvas size unoptimized - webgl2', + () => { + wrongCanvasSizeUnoptimized('webgl2'); + } +); + +(GPU.isHeadlessGLSupported ? test : skip)( + 'Issue #279 wrong canvas size unoptimized - headlessgl', + () => { + wrongCanvasSizeUnoptimized('headlessgl'); + } +); diff --git a/test/issues/300-nested-array-index.js b/test/issues/300-nested-array-index.js index c20d59cf..1f6612df 100644 --- a/test/issues/300-nested-array-index.js +++ b/test/issues/300-nested-array-index.js @@ -1,5 +1,5 @@ const { assert, skip, test, module: describe } = require('qunit'); -const { GPU } = require('../../src'); +const { GPU } = require('../..'); describe('issue #300'); @@ -8,15 +8,17 @@ function nestedArrayIndex(mode) { const gpu2 = new GPU({ mode }); // these 2 should be equivalent - const broken = gpu1.createKernel(function(input, lookup) { - return lookup[input[this.thread.x]]; - }) + const broken = gpu1 + .createKernel(function (input, lookup) { + return lookup[input[this.thread.x]]; + }) .setOutput([1]); - const working = gpu2.createKernel(function(input, lookup) { - const idx = input[this.thread.x]; - return lookup[idx]; - }) + const working = gpu2 + .createKernel(function (input, lookup) { + const idx = input[this.thread.x]; + return lookup[idx]; + }) .setOutput([1]); assert.equal(broken([2], [7, 13, 19, 23])[0], 19); @@ -34,17 +36,26 @@ test('Issue #300 nested array index - gpu', () => { nestedArrayIndex('gpu'); }); -(GPU.isWebGLSupported ? test : skip)('Issue #300 nested array index - webgl', () => { - nestedArrayIndex('webgl'); -}); - -(GPU.isWebGL2Supported ? test : skip)('Issue #300 nested array index - webgl2', () => { - nestedArrayIndex('webgl2'); -}); - -(GPU.isHeadlessGLSupported ? test : skip)('Issue #300 nested array index - headlessgl', () => { - nestedArrayIndex('headlessgl'); -}); +(GPU.isWebGLSupported ? test : skip)( + 'Issue #300 nested array index - webgl', + () => { + nestedArrayIndex('webgl'); + } +); + +(GPU.isWebGL2Supported ? test : skip)( + 'Issue #300 nested array index - webgl2', + () => { + nestedArrayIndex('webgl2'); + } +); + +(GPU.isHeadlessGLSupported ? test : skip)( + 'Issue #300 nested array index - headlessgl', + () => { + nestedArrayIndex('headlessgl'); + } +); test('Issue #300 nested array index - cpu', () => { nestedArrayIndex('cpu'); diff --git a/test/issues/31-nested-var-declare-test.js b/test/issues/31-nested-var-declare-test.js index f87deb41..88365cea 100644 --- a/test/issues/31-nested-var-declare-test.js +++ b/test/issues/31-nested-var-declare-test.js @@ -1,5 +1,11 @@ const { assert, skip, test, module: describe, only } = require('qunit'); -const { GPU, FunctionBuilder, WebGLFunctionNode, WebGL2FunctionNode, CPUFunctionNode } = require('../../src'); +const { + GPU, + FunctionBuilder, + WebGLFunctionNode, + WebGL2FunctionNode, + CPUFunctionNode, +} = require('../..'); describe('issue #31 redeclare'); @@ -8,9 +14,9 @@ function nestedVarRedeclareFunction() { let result = 0; // outer loop limit is effectively skipped in CPU - for(let i=0; i<10; ++i) { + for (let i = 0; i < 10; ++i) { // inner loop limit should be higher, to avoid infinite loops - for(i=0; i<20; ++i) { + for (i = 0; i < 20; ++i) { result += 1; } } @@ -37,17 +43,26 @@ test('Issue #31 - nestedVarRedeclare gpu', () => { nestedVarRedeclareTest('gpu'); }); -(GPU.isWebGLSupported ? test : skip)('Issue #31 - nestedVarRedeclare webgl', () => { - nestedVarRedeclareTest('webgl'); -}); +(GPU.isWebGLSupported ? test : skip)( + 'Issue #31 - nestedVarRedeclare webgl', + () => { + nestedVarRedeclareTest('webgl'); + } +); -(GPU.isWebGL2Supported ? test : skip)('Issue #31 - nestedVarRedeclare webgl2', () => { - nestedVarRedeclareTest('webgl2'); -}); +(GPU.isWebGL2Supported ? test : skip)( + 'Issue #31 - nestedVarRedeclare webgl2', + () => { + nestedVarRedeclareTest('webgl2'); + } +); -(GPU.isHeadlessGLSupported ? test : skip)('Issue #31 - nestedVarRedeclare headlessgl', () => { - nestedVarRedeclareTest('headlessgl'); -}); +(GPU.isHeadlessGLSupported ? test : skip)( + 'Issue #31 - nestedVarRedeclare headlessgl', + () => { + nestedVarRedeclareTest('headlessgl'); + } +); test('Issue #31 - nestedVarRedeclare cpu', () => { nestedVarRedeclareTest('cpu'); @@ -55,8 +70,12 @@ test('Issue #31 - nestedVarRedeclare cpu', () => { test('Issue #31 - nestedVarRedeclare : AST handling webgl', () => { const builder = new FunctionBuilder({ - functionNodes: [new WebGLFunctionNode(nestedVarRedeclareFunction.toString(), { output: [1] })], - output: [1] + functionNodes: [ + new WebGLFunctionNode(nestedVarRedeclareFunction.toString(), { + output: [1], + }), + ], + output: [1], }); assert.throws(() => { builder.getStringFromFunctionNames(['nestedVarRedeclareFunction']); @@ -65,8 +84,12 @@ test('Issue #31 - nestedVarRedeclare : AST handling webgl', () => { test('Issue #31 - nestedVarRedeclare : AST handling webgl2', () => { const builder = new FunctionBuilder({ - functionNodes: [new WebGL2FunctionNode(nestedVarRedeclareFunction.toString(), { output: [1] })], - output: [1] + functionNodes: [ + new WebGL2FunctionNode(nestedVarRedeclareFunction.toString(), { + output: [1], + }), + ], + output: [1], }); assert.throws(() => { builder.getStringFromFunctionNames(['nestedVarRedeclareFunction']); @@ -75,24 +98,27 @@ test('Issue #31 - nestedVarRedeclare : AST handling webgl2', () => { test('Issue #31 - nestedVarRedeclare : AST handling cpu', () => { const builder = new FunctionBuilder({ - functionNodes: [new CPUFunctionNode(nestedVarRedeclareFunction.toString(), { output: [1] })], - output: [1] + functionNodes: [ + new CPUFunctionNode(nestedVarRedeclareFunction.toString(), { + output: [1], + }), + ], + output: [1], }); assert.throws(() => { builder.getStringFromFunctionNames(['nestedVarRedeclareFunction']); }); }); - describe('issue #31 nested declare'); // nested declare function nestedVarDeclareFunction() { let result = 0.0; // outer loop limit is effectively skipped in CPU - for(let i=0; i<10; ++i) { + for (let i = 0; i < 10; ++i) { // inner loop limit should be higher, to avoid infinite loops - for(let i=0; i<20; ++i) { + for (let i = 0; i < 20; ++i) { result += 1; } } @@ -100,10 +126,10 @@ function nestedVarDeclareFunction() { return result; } -function nestedVarDeclareTest(mode ) { +function nestedVarDeclareTest(mode) { const gpu = new GPU({ mode }); const f = gpu.createKernel(nestedVarDeclareFunction, { - output : [1] + output: [1], }); assert.equal(f(), 200, 'basic return function test'); @@ -118,17 +144,26 @@ test('Issue #31 - nestedVarDeclare gpu', () => { nestedVarDeclareTest('gpu'); }); -(GPU.isWebGLSupported ? test : skip)('Issue #31 - nestedVarDeclare webgl', () => { - nestedVarDeclareTest('webgl'); -}); +(GPU.isWebGLSupported ? test : skip)( + 'Issue #31 - nestedVarDeclare webgl', + () => { + nestedVarDeclareTest('webgl'); + } +); -(GPU.isWebGL2Supported ? test : skip)('Issue #31 - nestedVarDeclare webgl2', () => { - nestedVarDeclareTest('webgl2'); -}); +(GPU.isWebGL2Supported ? test : skip)( + 'Issue #31 - nestedVarDeclare webgl2', + () => { + nestedVarDeclareTest('webgl2'); + } +); -(GPU.isHeadlessGLSupported ? test : skip)('Issue #31 - nestedVarDeclare headlessgl', () => { - nestedVarDeclareTest('headlessgl'); -}); +(GPU.isHeadlessGLSupported ? test : skip)( + 'Issue #31 - nestedVarDeclare headlessgl', + () => { + nestedVarDeclareTest('headlessgl'); + } +); test('Issue #31 - nestedVarDeclare cpu', () => { nestedVarDeclareTest('cpu'); @@ -136,57 +171,69 @@ test('Issue #31 - nestedVarDeclare cpu', () => { test('Issue #31 - nestedVarDeclare : AST handling webgl', () => { const builder = new FunctionBuilder({ - functionNodes: [new WebGLFunctionNode(nestedVarDeclareFunction.toString(), { output: [1] })] + functionNodes: [ + new WebGLFunctionNode(nestedVarDeclareFunction.toString(), { + output: [1], + }), + ], }); assert.equal( builder.getStringFromFunctionNames(['nestedVarDeclareFunction']), - 'float nestedVarDeclareFunction() {' - + '\nfloat user_result=0.0;' - + '\nfor (int user_i=0;(user_i<10);++user_i){' - + '\nfor (int user_i=0;(user_i<20);++user_i){' //<-- Note: don't do this in real life! - + '\nuser_result+=1.0;}' - + '\n}' - + '\n' - + '\nreturn user_result;' - + '\n}' + 'float nestedVarDeclareFunction() {' + + '\nfloat user_result=0.0;' + + '\nfor (int user_i=0;(user_i<10);++user_i){' + + '\nfor (int user_i=0;(user_i<20);++user_i){' + //<-- Note: don't do this in real life! + '\nuser_result+=1.0;}' + + '\n}' + + '\n' + + '\nreturn user_result;' + + '\n}' ); }); test('Issue #31 - nestedVarDeclare : AST handling webgl2', () => { const builder = new FunctionBuilder({ - functionNodes: [new WebGL2FunctionNode(nestedVarDeclareFunction.toString(), { output: [1] })] + functionNodes: [ + new WebGL2FunctionNode(nestedVarDeclareFunction.toString(), { + output: [1], + }), + ], }); assert.equal( builder.getStringFromFunctionNames(['nestedVarDeclareFunction']), - 'float nestedVarDeclareFunction() {' - + '\nfloat user_result=0.0;' - + '\nfor (int user_i=0;(user_i<10);++user_i){' - + '\nfor (int user_i=0;(user_i<20);++user_i){' //<-- Note: don't do this in real life! - + '\nuser_result+=1.0;}' - + '\n}' - + '\n' - + '\nreturn user_result;' - + '\n}' + 'float nestedVarDeclareFunction() {' + + '\nfloat user_result=0.0;' + + '\nfor (int user_i=0;(user_i<10);++user_i){' + + '\nfor (int user_i=0;(user_i<20);++user_i){' + //<-- Note: don't do this in real life! + '\nuser_result+=1.0;}' + + '\n}' + + '\n' + + '\nreturn user_result;' + + '\n}' ); }); test('Issue #31 - nestedVarDeclare : AST handling cpu', () => { const builder = new FunctionBuilder({ - functionNodes: [new CPUFunctionNode(nestedVarDeclareFunction.toString(), { output: [1] })] + functionNodes: [ + new CPUFunctionNode(nestedVarDeclareFunction.toString(), { + output: [1], + }), + ], }); assert.equal( builder.getStringFromFunctionNames(['nestedVarDeclareFunction']), - 'function nestedVarDeclareFunction() {' - + '\nlet user_result=0;' - + '\nfor (let user_i=0;(user_i<10);++user_i){' - + '\nfor (let user_i=0;(user_i<20);++user_i){' - + '\nuser_result+=1;}' - + '\n}' - + '\n' - + '\nreturn user_result;' - + '\n}' + 'function nestedVarDeclareFunction() {' + + '\nlet user_result=0;' + + '\nfor (let user_i=0;(user_i<10);++user_i){' + + '\nfor (let user_i=0;(user_i<20);++user_i){' + + '\nuser_result+=1;}' + + '\n}' + + '\n' + + '\nreturn user_result;' + + '\n}' ); }); diff --git a/test/issues/313-variable-lookup.js b/test/issues/313-variable-lookup.js index e1dd00e9..3e103686 100644 --- a/test/issues/313-variable-lookup.js +++ b/test/issues/313-variable-lookup.js @@ -1,26 +1,28 @@ const { assert, skip, test, module: describe } = require('qunit'); -const { GPU } = require('../../src'); +const { GPU } = require('../..'); describe('issue #313'); function variableLookup(mode) { function mult2(scale) { - return 2*scale; + return 2 * scale; } const gpu = new GPU({ mode, - functions: [mult2] + functions: [mult2], }); - const render1 = gpu.createKernel(function(input) { - return (mult2(input) + mult2(input*2) + mult2(input*1)) // RIGHT - }) + const render1 = gpu + .createKernel(function (input) { + return mult2(input) + mult2(input * 2) + mult2(input * 1); // RIGHT + }) .setOutput([1]); - const render2 = gpu.createKernel(function(input) { - return (mult2(input) + mult2(input*2) + mult2(input)); // WRONG - }) + const render2 = gpu + .createKernel(function (input) { + return mult2(input) + mult2(input * 2) + mult2(input); // WRONG + }) .setOutput([1]); assert.equal(render1(1)[0], 8, 'render1 equals 8'); @@ -33,15 +35,24 @@ test('Issue #313 Mismatch argument lookup - auto', () => { test('Issue #313 Mismatch argument lookup - gpu', () => { variableLookup('gpu'); }); -(GPU.isWebGLSupported ? test : skip)('Issue #313 Mismatch argument lookup - webgl', () => { - variableLookup('webgl'); -}); -(GPU.isWebGL2Supported ? test : skip)('Issue #313 Mismatch argument lookup - webgl2', () => { - variableLookup('webgl2'); -}); -(GPU.isHeadlessGLSupported ? test : skip)('Issue #313 Mismatch argument lookup - headlessgl', () => { - variableLookup('headlessgl'); -}); +(GPU.isWebGLSupported ? test : skip)( + 'Issue #313 Mismatch argument lookup - webgl', + () => { + variableLookup('webgl'); + } +); +(GPU.isWebGL2Supported ? test : skip)( + 'Issue #313 Mismatch argument lookup - webgl2', + () => { + variableLookup('webgl2'); + } +); +(GPU.isHeadlessGLSupported ? test : skip)( + 'Issue #313 Mismatch argument lookup - headlessgl', + () => { + variableLookup('headlessgl'); + } +); test('Issue #313 Mismatch argument lookup - cpu', () => { variableLookup('cpu'); }); diff --git a/test/issues/314-large-input-array-addressing.js b/test/issues/314-large-input-array-addressing.js index 27882652..5e828351 100644 --- a/test/issues/314-large-input-array-addressing.js +++ b/test/issues/314-large-input-array-addressing.js @@ -1,5 +1,5 @@ const { assert, skip, test, module: describe } = require('qunit'); -const { GPU, WebGLKernel, HeadlessGLKernel } = require('../../src'); +const { GPU, WebGLKernel, HeadlessGLKernel } = require('../..'); describe('issue #314'); @@ -7,22 +7,29 @@ describe('issue #314'); // after this fix max addressing is 2^31 which is the max a int32 can handle // run out of heap before being able to create a butter that big! // wanted to use uints but caused more problems than it solved -const DATA_MAX = (GPU.isHeadlessGLSupported ? HeadlessGLKernel : WebGLKernel).features.maxTextureSize*8; +const DATA_MAX = + (GPU.isHeadlessGLSupported ? HeadlessGLKernel : WebGLKernel).features + .maxTextureSize * 8; const divisor = 100; const data = new Uint16Array(DATA_MAX); let v = 0; -for (let i = 0; i < DATA_MAX/divisor; i++) { +for (let i = 0; i < DATA_MAX / divisor; i++) { for (let j = 0; j < divisor; j++) { - data[i*divisor + j] = v++; + data[i * divisor + j] = v++; } } + function buildLargeArrayAddressKernel(mode) { const gpu = new GPU({ mode }); - const largeArrayAddressKernel = gpu.createKernel(function(data) { - return data[this.thread.x]; - }, { - precision: 'unsigned', - }) + const largeArrayAddressKernel = gpu + .createKernel( + function (data) { + return data[this.thread.x]; + }, + { + precision: 'unsigned', + } + ) .setOutput([DATA_MAX]); const result = largeArrayAddressKernel(data); @@ -35,7 +42,7 @@ function buildLargeArrayAddressKernel(mode) { break; } } - assert.ok(same, "not all elements are the same, failed on index:" + i); + assert.ok(same, 'not all elements are the same, failed on index:' + i); gpu.destroy(); } @@ -47,13 +54,22 @@ test('Issue #314 Large array addressing - gpu', () => { buildLargeArrayAddressKernel('gpu'); }); -(GPU.isWebGLSupported ? test : skip)('Issue #314 Large array addressing - webgl', () => { - buildLargeArrayAddressKernel('webgl'); -}); +(GPU.isWebGLSupported ? test : skip)( + 'Issue #314 Large array addressing - webgl', + () => { + buildLargeArrayAddressKernel('webgl'); + } +); -(GPU.isWebGL2Supported ? test : skip)('Issue #314 Large array addressing - webgl2', () => { - buildLargeArrayAddressKernel('webgl2'); -}); -(GPU.isHeadlessGLSupported ? test : skip)('Issue #314 Large array addressing - headlessgl', () => { - buildLargeArrayAddressKernel('headlessgl'); -}); +(GPU.isWebGL2Supported ? test : skip)( + 'Issue #314 Large array addressing - webgl2', + () => { + buildLargeArrayAddressKernel('webgl2'); + } +); +(GPU.isHeadlessGLSupported ? test : skip)( + 'Issue #314 Large array addressing - headlessgl', + () => { + buildLargeArrayAddressKernel('headlessgl'); + } +); diff --git a/test/issues/335-missing-z-index-issue.js b/test/issues/335-missing-z-index-issue.js index e27d1666..10245040 100644 --- a/test/issues/335-missing-z-index-issue.js +++ b/test/issues/335-missing-z-index-issue.js @@ -1,14 +1,15 @@ const { assert, skip, test, module: describe } = require('qunit'); -const { GPU } = require('../../src'); +const { GPU } = require('../..'); describe('issue #335'); function missingZIndexIssue(mode) { const gpu = new GPU({ mode }); - const kernel = gpu.createKernel(function(value) { - return value[this.thread.z][this.thread.y][this.thread.x]; - }) + const kernel = gpu + .createKernel(function (value) { + return value[this.thread.z][this.thread.y][this.thread.x]; + }) .setOutput([1, 1, undefined]); kernel([[[1]]]); diff --git a/test/issues/346-uint8array-converted.js b/test/issues/346-uint8array-converted.js index 99b749c0..655cfcdb 100644 --- a/test/issues/346-uint8array-converted.js +++ b/test/issues/346-uint8array-converted.js @@ -1,5 +1,5 @@ const { assert, skip, test, module: describe } = require('qunit'); -const { GPU } = require('../../src'); +const { GPU } = require('../..'); describe('issue #346'); @@ -11,11 +11,16 @@ for (let i = 0; i < DATA_MAX; i++) { uint8data[i] = Math.random() * 255; uint16data[i] = Math.random() * 255 * 255; } + function buildUintArrayInputKernel(mode, data) { const gpu = new GPU({ mode }); - const largeArrayAddressKernel = gpu.createKernel(function(data) { - return data[this.thread.x]; - }, { precision: 'unsigned' }) + const largeArrayAddressKernel = gpu + .createKernel( + function (data) { + return data[this.thread.x]; + }, + { precision: 'unsigned' } + ) .setOutput([DATA_MAX]); const result = largeArrayAddressKernel(data); @@ -27,30 +32,48 @@ function buildUintArrayInputKernel(mode, data) { break; } } - assert.ok(same, "not all elements are the same, failed on index:" + i); + assert.ok(same, 'not all elements are the same, failed on index:' + i); gpu.destroy(); } -(GPU.isWebGLSupported ? test : skip)('Issue #346 uint8 input array - webgl', () => { - buildUintArrayInputKernel('webgl', uint8data); -}); +(GPU.isWebGLSupported ? test : skip)( + 'Issue #346 uint8 input array - webgl', + () => { + buildUintArrayInputKernel('webgl', uint8data); + } +); -(GPU.isWebGL2Supported ? test : skip)('Issue #346 uint8 input array - webgl2', () => { - buildUintArrayInputKernel('webgl2', uint8data); -}); +(GPU.isWebGL2Supported ? test : skip)( + 'Issue #346 uint8 input array - webgl2', + () => { + buildUintArrayInputKernel('webgl2', uint8data); + } +); -(GPU.isHeadlessGLSupported ? test : skip)('Issue #346 uint8 input array - headlessgl', () => { - buildUintArrayInputKernel('headlessgl', uint8data); -}); +(GPU.isHeadlessGLSupported ? test : skip)( + 'Issue #346 uint8 input array - headlessgl', + () => { + buildUintArrayInputKernel('headlessgl', uint8data); + } +); -(GPU.isWebGLSupported ? test : skip)('Issue #346 uint16 input array - webgl', () => { - buildUintArrayInputKernel('webgl', uint16data); -}); +(GPU.isWebGLSupported ? test : skip)( + 'Issue #346 uint16 input array - webgl', + () => { + buildUintArrayInputKernel('webgl', uint16data); + } +); -(GPU.isWebGL2Supported ? test : skip)('Issue #346 uint16 input array - webgl2', () => { - buildUintArrayInputKernel('webgl2', uint16data); -}); +(GPU.isWebGL2Supported ? test : skip)( + 'Issue #346 uint16 input array - webgl2', + () => { + buildUintArrayInputKernel('webgl2', uint16data); + } +); -(GPU.isHeadlessGLSupported ? test : skip)('Issue #346 uint16 input array - headlessgl', () => { - buildUintArrayInputKernel('headlessgl', uint16data); -}); +(GPU.isHeadlessGLSupported ? test : skip)( + 'Issue #346 uint16 input array - headlessgl', + () => { + buildUintArrayInputKernel('headlessgl', uint16data); + } +); diff --git a/test/issues/349-division-by-factors-of-3.js b/test/issues/349-division-by-factors-of-3.js index 72462ea0..12d50aec 100644 --- a/test/issues/349-division-by-factors-of-3.js +++ b/test/issues/349-division-by-factors-of-3.js @@ -1,46 +1,64 @@ const { assert, skip, test, module: describe } = require('qunit'); -const { GPU } = require('../../src'); +const { GPU } = require('../..'); describe('issue #349 divide by 3'); function testDivideByThree(mode) { - const gpu = new GPU({mode}); - const k = gpu.createKernel(function (v1, v2) { - return v1 / v2; - }, { - output: [1], - precision: 'single' - }); + const gpu = new GPU({ mode }); + const k = gpu.createKernel( + function (v1, v2) { + return v1 / v2; + }, + { + output: [1], + precision: 'single', + } + ); assert.equal(k(6, 3)[0], 2); gpu.destroy(); } -(GPU.isSinglePrecisionSupported ? test : skip)('Issue #349 - divide by three auto', () => { - testDivideByThree(); -}); +(GPU.isSinglePrecisionSupported ? test : skip)( + 'Issue #349 - divide by three auto', + () => { + testDivideByThree(); + } +); -(GPU.isSinglePrecisionSupported ? test : skip)('Issue #349 - divide by three gpu', () => { - testDivideByThree('gpu'); -}); +(GPU.isSinglePrecisionSupported ? test : skip)( + 'Issue #349 - divide by three gpu', + () => { + testDivideByThree('gpu'); + } +); -(GPU.isSinglePrecisionSupported && GPU.isWebGLSupported ? test : skip)('Issue #349 - divide by three webgl', () => { - testDivideByThree('webgl'); -}); +(GPU.isSinglePrecisionSupported && GPU.isWebGLSupported ? test : skip)( + 'Issue #349 - divide by three webgl', + () => { + testDivideByThree('webgl'); + } +); -(GPU.isWebGL2Supported ? test : skip)('Issue #349 - divide by three webgl2', () => { - testDivideByThree('webgl2'); -}); +(GPU.isWebGL2Supported ? test : skip)( + 'Issue #349 - divide by three webgl2', + () => { + testDivideByThree('webgl2'); + } +); -(GPU.isHeadlessGLSupported ? test : skip)('Issue #349 - divide by three headlessgl', () => { - testDivideByThree('headlessgl'); -}); +(GPU.isHeadlessGLSupported ? test : skip)( + 'Issue #349 - divide by three headlessgl', + () => { + testDivideByThree('headlessgl'); + } +); test('Issue #349 - divide by three cpu', () => { testDivideByThree('cpu'); }); - describe('issue #349 divide by random numbers'); + function someRandomWholeNumberDivisions(mode) { const DATA_MAX = 1024 * 1024; const dividendData = new Float32Array(DATA_MAX); @@ -48,17 +66,26 @@ function someRandomWholeNumberDivisions(mode) { const expectedResults = new Float32Array(DATA_MAX); const maxWholeNumberRepresentation = Math.sqrt(16777217); for (let i = 0; i < DATA_MAX; i++) { - divisorData[i] = parseInt(Math.random() * maxWholeNumberRepresentation + 1, 10); - expectedResults[i] = parseInt(Math.random() * maxWholeNumberRepresentation + 1, 10); + divisorData[i] = parseInt( + Math.random() * maxWholeNumberRepresentation + 1, + 10 + ); + expectedResults[i] = parseInt( + Math.random() * maxWholeNumberRepresentation + 1, + 10 + ); dividendData[i] = divisorData[i] * expectedResults[i]; } - const gpu = new GPU({mode}); - const k = gpu.createKernel(function (v1, v2) { - return v1[this.thread.x] / v2[this.thread.x]; - }, { - output: [DATA_MAX], - precision: 'single' - }); + const gpu = new GPU({ mode }); + const k = gpu.createKernel( + function (v1, v2) { + return v1[this.thread.x] / v2[this.thread.x]; + }, + { + output: [DATA_MAX], + precision: 'single', + } + ); const result = k(dividendData, divisorData); let same = true; let i = 0; @@ -68,78 +95,125 @@ function someRandomWholeNumberDivisions(mode) { break; } } - assert.ok(same, same ? "" : "not all elements are the same, failed on index:" + i + " " + dividendData[i] + "/" + divisorData[i]); + assert.ok( + same, + same + ? '' + : 'not all elements are the same, failed on index:' + + i + + ' ' + + dividendData[i] + + '/' + + divisorData[i] + ); gpu.destroy(); } -(GPU.isSinglePrecisionSupported ? test : skip)('Issue #349 - some random whole number divisions auto', () => { - someRandomWholeNumberDivisions(); -}); -(GPU.isSinglePrecisionSupported ? test : skip)('Issue #349 - some random whole number divisions gpu', () => { - someRandomWholeNumberDivisions('gpu'); -}); -(GPU.isSinglePrecisionSupported && GPU.isWebGLSupported ? test : skip)('Issue #349 - some random whole number divisions webgl', () => { - someRandomWholeNumberDivisions('webgl'); -}); -(GPU.isWebGL2Supported ? test : skip)('Issue #349 - some random whole number divisions webgl2', () => { - someRandomWholeNumberDivisions('webgl2'); -}); -(GPU.isHeadlessGLSupported ? test : skip)('Issue #349 - some random whole number divisions headlessgl', () => { - someRandomWholeNumberDivisions('headlessgl'); -}); +(GPU.isSinglePrecisionSupported ? test : skip)( + 'Issue #349 - some random whole number divisions auto', + () => { + someRandomWholeNumberDivisions(); + } +); +(GPU.isSinglePrecisionSupported ? test : skip)( + 'Issue #349 - some random whole number divisions gpu', + () => { + someRandomWholeNumberDivisions('gpu'); + } +); +(GPU.isSinglePrecisionSupported && GPU.isWebGLSupported ? test : skip)( + 'Issue #349 - some random whole number divisions webgl', + () => { + someRandomWholeNumberDivisions('webgl'); + } +); +(GPU.isWebGL2Supported ? test : skip)( + 'Issue #349 - some random whole number divisions webgl2', + () => { + someRandomWholeNumberDivisions('webgl2'); + } +); +(GPU.isHeadlessGLSupported ? test : skip)( + 'Issue #349 - some random whole number divisions headlessgl', + () => { + someRandomWholeNumberDivisions('headlessgl'); + } +); test('Issue #349 - some random whole number divisions cpu', () => { someRandomWholeNumberDivisions('cpu'); }); - describe('issue #349 disable integer division bug'); + function testDisableFixIntegerDivisionBug(mode) { - const gpu = new GPU({mode}); - const idFix = gpu.createKernel(function(v1, v2) { - return v1 / v2; - }, { precision: 'single', output: [1] }); - - const idDixOff = gpu.createKernel(function(v1, v2) { - return v1 / v2; - }, { - output: [1], - precision: 'single', - fixIntegerDivisionAccuracy: false - }); + const gpu = new GPU({ mode }); + const idFix = gpu.createKernel( + function (v1, v2) { + return v1 / v2; + }, + { precision: 'single', output: [1] } + ); + + const idDixOff = gpu.createKernel( + function (v1, v2) { + return v1 / v2; + }, + { + output: [1], + precision: 'single', + fixIntegerDivisionAccuracy: false, + } + ); if (!gpu.Kernel.features.isIntegerDivisionAccurate) { assert.ok( - ( - idFix(6, 3)[0] === 2 - && idFix(6030401, 3991)[0] === 1511 - ) && ( - idDixOff(6, 3)[0] !== 2 - || idDixOff(6030401, 3991)[0] !== 1511 - ), "when bug is present should show bug!"); + idFix(6, 3)[0] === 2 && + idFix(6030401, 3991)[0] === 1511 && + (idDixOff(6, 3)[0] !== 2 || idDixOff(6030401, 3991)[0] !== 1511), + 'when bug is present should show bug!' + ); } else { - assert.ok(idFix(6, 3)[0] === 2 && idDixOff(6, 3)[0] === 2, "when bug isn't present should not show bug!"); + assert.ok( + idFix(6, 3)[0] === 2 && idDixOff(6, 3)[0] === 2, + "when bug isn't present should not show bug!" + ); } gpu.destroy(); } -(GPU.isSinglePrecisionSupported ? test : skip)('Issue #349 - test disable fix integer division bug auto', () => { - testDisableFixIntegerDivisionBug(); -}); +(GPU.isSinglePrecisionSupported ? test : skip)( + 'Issue #349 - test disable fix integer division bug auto', + () => { + testDisableFixIntegerDivisionBug(); + } +); -(GPU.isSinglePrecisionSupported ? test : skip)('Issue #349 - test disable fix integer division bug gpu', () => { - testDisableFixIntegerDivisionBug('gpu'); -}); +(GPU.isSinglePrecisionSupported ? test : skip)( + 'Issue #349 - test disable fix integer division bug gpu', + () => { + testDisableFixIntegerDivisionBug('gpu'); + } +); -(GPU.isSinglePrecisionSupported && GPU.isWebGLSupported ? test : skip)('Issue #349 - test disable fix integer division bug webgl', () => { - testDisableFixIntegerDivisionBug('webgl'); -}); +(GPU.isSinglePrecisionSupported && GPU.isWebGLSupported ? test : skip)( + 'Issue #349 - test disable fix integer division bug webgl', + () => { + testDisableFixIntegerDivisionBug('webgl'); + } +); -(GPU.isWebGL2Supported ? test : skip)('Issue #349 - test disable fix integer division bug webgl2', () => { - testDisableFixIntegerDivisionBug('webgl2'); -}); +(GPU.isWebGL2Supported ? test : skip)( + 'Issue #349 - test disable fix integer division bug webgl2', + () => { + testDisableFixIntegerDivisionBug('webgl2'); + } +); -(GPU.isHeadlessGLSupported ? test : skip)('Issue #349 - test disable fix integer division bug headlessgl', () => { - testDisableFixIntegerDivisionBug('headlessgl'); -}); +(GPU.isHeadlessGLSupported ? test : skip)( + 'Issue #349 - test disable fix integer division bug headlessgl', + () => { + testDisableFixIntegerDivisionBug('headlessgl'); + } +); test('Issue #349 - test disable fix integer division bug cpu', () => { testDisableFixIntegerDivisionBug('cpu'); diff --git a/test/issues/357-modulus-issue.js b/test/issues/357-modulus-issue.js index 96b0cd48..31c8c497 100644 --- a/test/issues/357-modulus-issue.js +++ b/test/issues/357-modulus-issue.js @@ -1,16 +1,18 @@ const { assert, skip, test, module: describe, only } = require('qunit'); -const { GPU } = require('../../src'); +const { GPU } = require('../..'); describe('issue #357'); // complimentary tests in features/arithmetic-operators.js & features/assignment-operators.js function testModKernel(mode) { - const gpu = new GPU({mode}); + const gpu = new GPU({ mode }); const nValues = 100; - const myFunc3 = gpu.createKernel(function(x) { - return x[this.thread.x % 3]; - }).setOutput([nValues]); + const myFunc3 = gpu + .createKernel(function (x) { + return x[this.thread.x % 3]; + }) + .setOutput([nValues]); const input = [1, 2, 3]; myFunc3(input); @@ -23,15 +25,23 @@ function testModKernel(mode) { gpu.destroy(); } -(GPU.isWebGLSupported ? test : skip)('Issue #357 - modulus issue webgl', () => { - testModKernel('webgl'); -}); - -(GPU.isWebGL2Supported ? test : skip)('Issue #357 - modulus issue webgl2', () => { - testModKernel('webgl2'); -}); +(GPU.isWebGLSupported ? test : skip)( + 'Issue #357 - modulus issue webgl', + () => { + testModKernel('webgl'); + } +); -(GPU.isHeadlessGLSupported ? test : skip)('Issue #357 - modulus issue headlessgl', () => { - testModKernel('headlessgl'); -}); +(GPU.isWebGL2Supported ? test : skip)( + 'Issue #357 - modulus issue webgl2', + () => { + testModKernel('webgl2'); + } +); +(GPU.isHeadlessGLSupported ? test : skip)( + 'Issue #357 - modulus issue headlessgl', + () => { + testModKernel('headlessgl'); + } +); diff --git a/test/issues/359-addfunction-params-wrong.js b/test/issues/359-addfunction-params-wrong.js index 02186d74..13f808ec 100644 --- a/test/issues/359-addfunction-params-wrong.js +++ b/test/issues/359-addfunction-params-wrong.js @@ -1,13 +1,15 @@ const { assert, skip, test, module: describe } = require('qunit'); -const { GPU } = require('../../src'); +const { GPU } = require('../..'); describe('issue #359'); function testAddFunctionKernel(mode) { - const gpu = new GPU({mode}); + const gpu = new GPU({ mode }); + function clcC(xx) { return Math.abs(xx); } + function intermediate(c1) { return clcC(c1); } @@ -15,25 +17,37 @@ function testAddFunctionKernel(mode) { gpu.addFunction(clcC); gpu.addFunction(intermediate); - const nestFunctionsKernel = gpu.createKernel(function() { - return intermediate(-1); - }, { - output: [1] - }); + const nestFunctionsKernel = gpu.createKernel( + function () { + return intermediate(-1); + }, + { + output: [1], + } + ); assert.equal(nestFunctionsKernel()[0], 1); gpu.destroy(); } -(GPU.isWebGLSupported ? test : skip)('Issue #359 - addFunction calls addFunction issue webgl', () => { - testAddFunctionKernel('webgl') -}); +(GPU.isWebGLSupported ? test : skip)( + 'Issue #359 - addFunction calls addFunction issue webgl', + () => { + testAddFunctionKernel('webgl'); + } +); -(GPU.isWebGL2Supported ? test : skip)('Issue #359 - addFunction calls addFunction issue webgl2', () => { - testAddFunctionKernel('webgl2') -}); +(GPU.isWebGL2Supported ? test : skip)( + 'Issue #359 - addFunction calls addFunction issue webgl2', + () => { + testAddFunctionKernel('webgl2'); + } +); -(GPU.isHeadlessGLSupported ? test : skip)('Issue #359 - addFunction calls addFunction issue headlessgl', () => { - testAddFunctionKernel('headlessgl') -}); +(GPU.isHeadlessGLSupported ? test : skip)( + 'Issue #359 - addFunction calls addFunction issue headlessgl', + () => { + testAddFunctionKernel('headlessgl'); + } +); diff --git a/test/issues/378-only-first-iteration.js b/test/issues/378-only-first-iteration.js index 39c5053b..4b58057f 100644 --- a/test/issues/378-only-first-iteration.js +++ b/test/issues/378-only-first-iteration.js @@ -1,37 +1,50 @@ const { assert, skip, test, module: describe, only } = require('qunit'); -const { GPU } = require('../../src'); +const { GPU } = require('../..'); describe('issue #378'); function testOnlyFirstIterationSafari(mode) { const gpu = new GPU({ mode: mode }); const conflictingName = 0.4; - const kernel = gpu.createKernel(function(iter) { - let sum = 0; - for(let i=2; i { - testOnlyFirstIterationSafari('webgl'); -}); +(GPU.isWebGLSupported ? test : skip)( + 'Issue #378 - only first iteration safari webgl', + () => { + testOnlyFirstIterationSafari('webgl'); + } +); -(GPU.isWebGL2Supported ? test : skip)('Issue #378 - only first iteration safari webgl2', () => { - testOnlyFirstIterationSafari('webgl2'); -}); +(GPU.isWebGL2Supported ? test : skip)( + 'Issue #378 - only first iteration safari webgl2', + () => { + testOnlyFirstIterationSafari('webgl2'); + } +); -(GPU.isHeadlessGLSupported ? test : skip)('Issue #378 - only first iteration safari headlessgl', () => { - testOnlyFirstIterationSafari('headlessgl'); -}); +(GPU.isHeadlessGLSupported ? test : skip)( + 'Issue #378 - only first iteration safari headlessgl', + () => { + testOnlyFirstIterationSafari('headlessgl'); + } +); diff --git a/test/issues/382-bad-constant.js b/test/issues/382-bad-constant.js index aa711ce5..be20d1dc 100644 --- a/test/issues/382-bad-constant.js +++ b/test/issues/382-bad-constant.js @@ -1,17 +1,20 @@ const { assert, skip, test, module: describe, only } = require('qunit'); -const { GPU } = require('../../src'); +const { GPU } = require('../..'); describe('issue #382'); function testModKernel(mode) { const gpu = new GPU({ mode: mode }); const conflictingName = 0.4; - const kernel = gpu.createKernel(function(a, conflictingName) { - return a[this.thread.x] + this.constants.conflictingName + conflictingName; - }) + const kernel = gpu + .createKernel(function (a, conflictingName) { + return ( + a[this.thread.x] + this.constants.conflictingName + conflictingName + ); + }) .setOutput([1]) .setConstants({ - conflictingName: conflictingName + conflictingName: conflictingName, }); const result = kernel([1], 0.6); @@ -24,10 +27,16 @@ function testModKernel(mode) { testModKernel('webgl'); }); -(GPU.isWebGL2Supported ? test : skip)('Issue #382 - bad constant webgl2', () => { - testModKernel('webgl2'); -}); +(GPU.isWebGL2Supported ? test : skip)( + 'Issue #382 - bad constant webgl2', + () => { + testModKernel('webgl2'); + } +); -(GPU.isHeadlessGLSupported ? test : skip)('Issue #382 - bad constant headlessgl', () => { - testModKernel('headlessgl'); -}); +(GPU.isHeadlessGLSupported ? test : skip)( + 'Issue #382 - bad constant headlessgl', + () => { + testModKernel('headlessgl'); + } +); diff --git a/test/issues/390-thread-assignment.js b/test/issues/390-thread-assignment.js index b4626a94..fdfddaf5 100644 --- a/test/issues/390-thread-assignment.js +++ b/test/issues/390-thread-assignment.js @@ -1,21 +1,31 @@ const { assert, skip, test, module: describe, only } = require('qunit'); -const { WebGLFunctionNode, WebGL2FunctionNode, CPUFunctionNode } = require('../../src'); +const { + WebGLFunctionNode, + WebGL2FunctionNode, + CPUFunctionNode, +} = require('../..'); describe('issue #390'); -test('Issue #390 - thread assignment webgl', function(assert) { - const node = new WebGLFunctionNode(function assignThreadToVar() { - const x = this.thread.x; - const y = this.thread.y; - const sum = x + y; - return sum; - }.toString(), { output: [1], returnType: 'Number' }); - assert.equal(node.toString(), 'float assignThreadToVar() {' - + '\nfloat user_x=float(threadId.x);' - + '\nfloat user_y=float(threadId.y);' - + '\nfloat user_sum=(user_x+user_y);' - + '\nreturn user_sum;' - + '\n}'); +test('Issue #390 - thread assignment webgl', function (assert) { + const node = new WebGLFunctionNode( + function assignThreadToVar() { + const x = this.thread.x; + const y = this.thread.y; + const sum = x + y; + return sum; + }.toString(), + { output: [1], returnType: 'Number' } + ); + assert.equal( + node.toString(), + 'float assignThreadToVar() {' + + '\nfloat user_x=float(threadId.x);' + + '\nfloat user_y=float(threadId.y);' + + '\nfloat user_sum=(user_x+user_y);' + + '\nreturn user_sum;' + + '\n}' + ); const { x, y, sum } = node.contexts[1]; assert.equal(x.name, 'x'); assert.equal(x.valueType, 'Number'); @@ -25,19 +35,25 @@ test('Issue #390 - thread assignment webgl', function(assert) { assert.equal(sum.valueType, 'Number'); }); -test('Issue #390 - thread assignment webgl2', function(assert) { - const node = new WebGL2FunctionNode(function assignThreadToVar() { - const x = this.thread.x; - const y = this.thread.y; - const sum = x + y; - return sum; - }.toString(), { output: [1], returnType: 'Number' }); - assert.equal(node.toString(), 'float assignThreadToVar() {' - + '\nfloat user_x=float(threadId.x);' - + '\nfloat user_y=float(threadId.y);' - + '\nfloat user_sum=(user_x+user_y);' - + '\nreturn user_sum;' - + '\n}'); +test('Issue #390 - thread assignment webgl2', function (assert) { + const node = new WebGL2FunctionNode( + function assignThreadToVar() { + const x = this.thread.x; + const y = this.thread.y; + const sum = x + y; + return sum; + }.toString(), + { output: [1], returnType: 'Number' } + ); + assert.equal( + node.toString(), + 'float assignThreadToVar() {' + + '\nfloat user_x=float(threadId.x);' + + '\nfloat user_y=float(threadId.y);' + + '\nfloat user_sum=(user_x+user_y);' + + '\nreturn user_sum;' + + '\n}' + ); const { x, y, sum } = node.contexts[1]; assert.equal(x.name, 'x'); assert.equal(x.valueType, 'Number'); @@ -47,19 +63,25 @@ test('Issue #390 - thread assignment webgl2', function(assert) { assert.equal(sum.valueType, 'Number'); }); -test('Issue #390 - thread assignment cpu', function(assert) { - const node = new CPUFunctionNode(function assignThreadToVar() { - const x = this.thread.x; - const y = this.thread.y; - const sum = x + y; - return sum; - }.toString(), { output: [1] }); - assert.equal(node.toString(), 'function assignThreadToVar() {' - + '\nconst user_x=_this.thread.x;' - + '\nconst user_y=_this.thread.y;' - + '\nconst user_sum=(user_x+user_y);' - + '\nreturn user_sum;' - + '\n}'); +test('Issue #390 - thread assignment cpu', function (assert) { + const node = new CPUFunctionNode( + function assignThreadToVar() { + const x = this.thread.x; + const y = this.thread.y; + const sum = x + y; + return sum; + }.toString(), + { output: [1] } + ); + assert.equal( + node.toString(), + 'function assignThreadToVar() {' + + '\nconst user_x=_this.thread.x;' + + '\nconst user_y=_this.thread.y;' + + '\nconst user_sum=(user_x+user_y);' + + '\nreturn user_sum;' + + '\n}' + ); const { x, y, z, sum } = node.contexts[1]; assert.equal(x.name, 'x'); assert.equal(x.valueType, 'Integer'); @@ -69,24 +91,29 @@ test('Issue #390 - thread assignment cpu', function(assert) { assert.equal(sum.valueType, 'Number'); }); - -test('Issue #390 (related) - output assignment webgl', function(assert) { - const node = new WebGLFunctionNode(function assignThreadToVar() { - const x = this.output.x; - const y = this.output.y; - const z = this.output.z; - const sum = x + y + z; - return sum; - }.toString(), { - output: [1,2,3] - }); - assert.equal(node.toString(), 'float assignThreadToVar() {' - + '\nfloat user_x=1.0;' - + '\nfloat user_y=2.0;' - + '\nfloat user_z=3.0;' - + '\nfloat user_sum=((user_x+user_y)+user_z);' - + '\nreturn user_sum;' - + '\n}'); +test('Issue #390 (related) - output assignment webgl', function (assert) { + const node = new WebGLFunctionNode( + function assignThreadToVar() { + const x = this.output.x; + const y = this.output.y; + const z = this.output.z; + const sum = x + y + z; + return sum; + }.toString(), + { + output: [1, 2, 3], + } + ); + assert.equal( + node.toString(), + 'float assignThreadToVar() {' + + '\nfloat user_x=1.0;' + + '\nfloat user_y=2.0;' + + '\nfloat user_z=3.0;' + + '\nfloat user_sum=((user_x+user_y)+user_z);' + + '\nreturn user_sum;' + + '\n}' + ); const { x, y, z, sum } = node.contexts[1]; assert.equal(x.name, 'x'); assert.equal(x.valueType, 'Number'); @@ -98,23 +125,29 @@ test('Issue #390 (related) - output assignment webgl', function(assert) { assert.equal(sum.valueType, 'Number'); }); -test('Issue #390 (related) - output assignment webgl2', function(assert) { - const node = new WebGL2FunctionNode(function assignThreadToVar() { - const x = this.output.x; - const y = this.output.y; - const z = this.output.z; - const sum = x + y + z; - return sum; - }.toString(), { - output: [1,2,3] - }); - assert.equal(node.toString(), 'float assignThreadToVar() {' - + '\nfloat user_x=1.0;' - + '\nfloat user_y=2.0;' - + '\nfloat user_z=3.0;' - + '\nfloat user_sum=((user_x+user_y)+user_z);' - + '\nreturn user_sum;' - + '\n}'); +test('Issue #390 (related) - output assignment webgl2', function (assert) { + const node = new WebGL2FunctionNode( + function assignThreadToVar() { + const x = this.output.x; + const y = this.output.y; + const z = this.output.z; + const sum = x + y + z; + return sum; + }.toString(), + { + output: [1, 2, 3], + } + ); + assert.equal( + node.toString(), + 'float assignThreadToVar() {' + + '\nfloat user_x=1.0;' + + '\nfloat user_y=2.0;' + + '\nfloat user_z=3.0;' + + '\nfloat user_sum=((user_x+user_y)+user_z);' + + '\nreturn user_sum;' + + '\n}' + ); const context = node.contexts[1]; const { x, y, z, sum } = context; assert.equal(x.name, 'x'); @@ -127,23 +160,29 @@ test('Issue #390 (related) - output assignment webgl2', function(assert) { assert.equal(sum.valueType, 'Number'); }); -test('Issue #390 (related) - output assignment cpu', function(assert) { - const node = new CPUFunctionNode(`function assignThreadToVar() { +test('Issue #390 (related) - output assignment cpu', function (assert) { + const node = new CPUFunctionNode( + `function assignThreadToVar() { const x = this.output.x; const y = this.output.y; const z = this.output.z; const sum = x + y + z; return sum; - }`, { - output: [1,2,3] - }); - assert.equal(node.toString(), 'function assignThreadToVar() {' - + '\nconst user_x=outputX;' - + '\nconst user_y=outputY;' - + '\nconst user_z=outputZ;' - + '\nconst user_sum=((user_x+user_y)+user_z);' - + '\nreturn user_sum;' - + '\n}'); + }`, + { + output: [1, 2, 3], + } + ); + assert.equal( + node.toString(), + 'function assignThreadToVar() {' + + '\nconst user_x=outputX;' + + '\nconst user_y=outputY;' + + '\nconst user_z=outputZ;' + + '\nconst user_sum=((user_x+user_y)+user_z);' + + '\nreturn user_sum;' + + '\n}' + ); const context = node.contexts[1]; const { x, y, z, sum } = context; assert.equal(context['@contextType'], 'const/let'); @@ -160,4 +199,3 @@ test('Issue #390 (related) - output assignment cpu', function(assert) { assert.equal(sum.name, 'sum'); assert.equal(sum.valueType, 'Number'); }); - diff --git a/test/issues/396-combine-kernels-example.js b/test/issues/396-combine-kernels-example.js index 3e381431..b41d1dc2 100644 --- a/test/issues/396-combine-kernels-example.js +++ b/test/issues/396-combine-kernels-example.js @@ -1,29 +1,32 @@ const { assert, skip, test, module: describe } = require('qunit'); -const { GPU } = require('../../src'); +const { GPU } = require('../..'); describe('issue #396 - combine kernels example'); function combineKernelsExample(mode) { const gpu = new GPU({ mode }); - const add = gpu.createKernel(function(a, b) { - return a[this.thread.x] + b[this.thread.x]; - }).setOutput([5]); - - const multiply = gpu.createKernel(function(a, b) { - return a[this.thread.x] * b[this.thread.x]; - }).setOutput([5]); - - const superKernel = gpu.combineKernels(add, multiply, function(a, b, c) { + const add = gpu + .createKernel(function (a, b) { + return a[this.thread.x] + b[this.thread.x]; + }) + .setOutput([5]); + + const multiply = gpu + .createKernel(function (a, b) { + return a[this.thread.x] * b[this.thread.x]; + }) + .setOutput([5]); + + const superKernel = gpu.combineKernels(add, multiply, function (a, b, c) { return multiply(add(a, b), c); }); - const result = superKernel([1,2,3,4,5],[1,2,3,4,5],[1,2,3,4,5]); - assert.deepEqual(Array.from(result), [2, - 8, - 18, - 32, - 50 - ]); + const result = superKernel( + [1, 2, 3, 4, 5], + [1, 2, 3, 4, 5], + [1, 2, 3, 4, 5] + ); + assert.deepEqual(Array.from(result), [2, 8, 18, 32, 50]); gpu.destroy(); } diff --git a/test/issues/399-double-definition.js b/test/issues/399-double-definition.js index 515836c9..892f68cb 100644 --- a/test/issues/399-double-definition.js +++ b/test/issues/399-double-definition.js @@ -1,60 +1,84 @@ const { assert, skip, test, module: describe } = require('qunit'); -const { GPU } = require('../../src'); +const { GPU } = require('../..'); describe('issue #399'); function doubleDefinitionUnsignedPrecision(mode) { const gpu = new GPU({ mode }); - const toTexture = gpu.createKernel(function(value) { - return value[this.thread.x]; - }, { - precision: 'unsigned', - output: [2], - pipeline: true, - hardcodeConstants: true, - immutable: true - }); + const toTexture = gpu.createKernel( + function (value) { + return value[this.thread.x]; + }, + { + precision: 'unsigned', + output: [2], + pipeline: true, + hardcodeConstants: true, + immutable: true, + } + ); // basically it doesn't die, but builds all the way through to webGL assert.equal(toTexture([0, 1]).constructor.name, 'GLTextureUnsigned'); gpu.destroy(); } -(GPU.isWebGLSupported ? test : skip)('Issue #399 - double definition unsigned precision webgl', () => { - doubleDefinitionUnsignedPrecision('webgl') -}); +(GPU.isWebGLSupported ? test : skip)( + 'Issue #399 - double definition unsigned precision webgl', + () => { + doubleDefinitionUnsignedPrecision('webgl'); + } +); -(GPU.isWebGL2Supported ? test : skip)('Issue #399 - double definition unsigned precision webgl2', () => { - doubleDefinitionUnsignedPrecision('webgl2') -}); +(GPU.isWebGL2Supported ? test : skip)( + 'Issue #399 - double definition unsigned precision webgl2', + () => { + doubleDefinitionUnsignedPrecision('webgl2'); + } +); -(GPU.isHeadlessGLSupported ? test : skip)('Issue #399 - double definition unsigned precision headlessgl', () => { - doubleDefinitionUnsignedPrecision('headlessgl') -}); +(GPU.isHeadlessGLSupported ? test : skip)( + 'Issue #399 - double definition unsigned precision headlessgl', + () => { + doubleDefinitionUnsignedPrecision('headlessgl'); + } +); function doubleDefinitionSinglePrecision(mode) { const gpu = new GPU({ mode }); - const toTexture = gpu.createKernel(function(value) { - return value[this.thread.x]; - }, { - precision: 'single', - output: [2], - pipeline: true, - hardcodeConstants: true, - immutable: true - }); + const toTexture = gpu.createKernel( + function (value) { + return value[this.thread.x]; + }, + { + precision: 'single', + output: [2], + pipeline: true, + hardcodeConstants: true, + immutable: true, + } + ); // basically it doesn't die, but builds all the way through to webGL assert.equal(toTexture([0, 1]).constructor.name, 'GLTextureFloat'); gpu.destroy(); } -(GPU.isWebGLSupported && GPU.isSinglePrecisionSupported ? test : skip)('Issue #399 - double definition single precision webgl', () => { - doubleDefinitionSinglePrecision('webgl') -}); +(GPU.isWebGLSupported && GPU.isSinglePrecisionSupported ? test : skip)( + 'Issue #399 - double definition single precision webgl', + () => { + doubleDefinitionSinglePrecision('webgl'); + } +); -(GPU.isWebGL2Supported && GPU.isSinglePrecisionSupported ? test : skip)('Issue #399 - double definition single precision webgl2', () => { - doubleDefinitionSinglePrecision('webgl2') -}); +(GPU.isWebGL2Supported && GPU.isSinglePrecisionSupported ? test : skip)( + 'Issue #399 - double definition single precision webgl2', + () => { + doubleDefinitionSinglePrecision('webgl2'); + } +); -(GPU.isHeadlessGLSupported && GPU.isSinglePrecisionSupported ? test : skip)('Issue #399 - double definition single precision headlessgl', () => { - doubleDefinitionSinglePrecision('headlessgl') -}); +(GPU.isHeadlessGLSupported && GPU.isSinglePrecisionSupported ? test : skip)( + 'Issue #399 - double definition single precision headlessgl', + () => { + doubleDefinitionSinglePrecision('headlessgl'); + } +); diff --git a/test/issues/401-cpu-canvas-check.js b/test/issues/401-cpu-canvas-check.js index 42efea53..ab25c86e 100644 --- a/test/issues/401-cpu-canvas-check.js +++ b/test/issues/401-cpu-canvas-check.js @@ -1,37 +1,49 @@ const { assert, skip, test, module: describe } = require('qunit'); -const { GPU, CPUKernel } = require('../../src'); +const { GPU, CPUKernel } = require('../..'); describe('issue #401'); -test('Issue #401 - cpu no canvas graphical', function(assert) { - assert.throws(function() { - CPUKernel.prototype.build.apply({ - setupConstants: function() {}, - setupArguments: function() {}, - validateSettings: function() {}, - getKernelString: function() {}, - translateSource: function() {}, - buildSignature: function() {}, - graphical: true, - output: [1], - canvas: null - }, []); - }, +test('Issue #401 - cpu no canvas graphical', function (assert) { + assert.throws( + function () { + CPUKernel.prototype.build.apply( + { + setupConstants: function () {}, + setupArguments: function () {}, + validateSettings: function () {}, + getKernelString: function () {}, + translateSource: function () {}, + buildSignature: function () {}, + graphical: true, + output: [1], + canvas: null, + }, + [] + ); + }, new Error('no canvas available for using graphical output'), - 'throws when canvas is not available and using graphical output'); + 'throws when canvas is not available and using graphical output' + ); }); -test('Issue #401 - cpu no canvas', function(assert) { - CPUKernel.prototype.build.apply({ - setupConstants: function() {}, - setupArguments: function() {}, - validateSettings: function() {}, - getKernelString: function() {}, - translateSource: function() {}, - buildSignature: function() {}, - graphical: false, - output: [1], - canvas: null - }, []); - assert.equal(true, true, 'ok when canvas is not available and not using graphical output'); +test('Issue #401 - cpu no canvas', function (assert) { + CPUKernel.prototype.build.apply( + { + setupConstants: function () {}, + setupArguments: function () {}, + validateSettings: function () {}, + getKernelString: function () {}, + translateSource: function () {}, + buildSignature: function () {}, + graphical: false, + output: [1], + canvas: null, + }, + [] + ); + assert.equal( + true, + true, + 'ok when canvas is not available and not using graphical output' + ); }); diff --git a/test/issues/410-if-statement.js b/test/issues/410-if-statement.js index 1aad96a6..ac9101bd 100644 --- a/test/issues/410-if-statement.js +++ b/test/issues/410-if-statement.js @@ -1,29 +1,27 @@ const { assert, skip, test, module: describe, only } = require('qunit'); -const { GPU } = require('../../src'); +const { GPU } = require('../..'); describe('issue #410 - if statement when unsigned on NVidia'); function ifStatement(mode) { const gpu = new GPU({ mode }); - const kernel = gpu.createKernel(function(a) { - const paramDenom = a[this.thread.x][1] - a[this.thread.x][0]; - if(paramDenom === 0) { - return 100; - } - return 200; - }) + const kernel = gpu + .createKernel(function (a) { + const paramDenom = a[this.thread.x][1] - a[this.thread.x][0]; + if (paramDenom === 0) { + return 100; + } + return 200; + }) .setPrecision('unsigned') .setOutput([2]); - const result = - kernel( - [ - [0, 0], - [0, 2] - ] - ); + const result = kernel([ + [0, 0], + [0, 2], + ]); - assert.deepEqual(Array.from(result), [100,200]); + assert.deepEqual(Array.from(result), [100, 200]); gpu.destroy(); } diff --git a/test/issues/422-warnings.js b/test/issues/422-warnings.js index 71a31c7f..f72c4232 100644 --- a/test/issues/422-warnings.js +++ b/test/issues/422-warnings.js @@ -1,14 +1,21 @@ const { assert, skip, test, module: describe } = require('qunit'); -const { GPU } = require('../../src'); +const { GPU } = require('../..'); describe('issue #422 - warnings'); function warnings(mode) { const gpu = new GPU({ mode }); - const kernel = gpu.createKernel(function(a, b) { - return a[this.thread.x] + b[this.thread.x]; - }).setOutput([10]); - assert.deepEqual(Array.from(kernel([0,1,2,3,4,5,6,7,8,9], [0,1,2,3,4,5,6,7,8,9])), [0,2,4,6,8,10,12,14,16,18]); + const kernel = gpu + .createKernel(function (a, b) { + return a[this.thread.x] + b[this.thread.x]; + }) + .setOutput([10]); + assert.deepEqual( + Array.from( + kernel([0, 1, 2, 3, 4, 5, 6, 7, 8, 9], [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]) + ), + [0, 2, 4, 6, 8, 10, 12, 14, 16, 18] + ); gpu.destroy(); } diff --git a/test/issues/470-modulus-wrong.js b/test/issues/470-modulus-wrong.js index 0f9c0e7f..07619ae5 100644 --- a/test/issues/470-modulus-wrong.js +++ b/test/issues/470-modulus-wrong.js @@ -1,18 +1,21 @@ const { assert, skip, test, module: describe } = require('qunit'); -const { GPU } = require('../../src'); +const { GPU } = require('../..'); describe('issue #470 - modulus wrong'); function testModulusWrong(mode) { const gpu = new GPU({ mode }); - const kernel = gpu.createKernel(function(mod) { - return this.thread.x % mod; - }, { - output: [10], - argumentTypes: { - mod: 'Integer', + const kernel = gpu.createKernel( + function (mod) { + return this.thread.x % mod; }, - }); + { + output: [10], + argumentTypes: { + mod: 'Integer', + }, + } + ); const result = kernel(6); assert.equal(kernel.argumentTypes[0], 'Integer'); diff --git a/test/issues/471-canvas-issue.js b/test/issues/471-canvas-issue.js index c5030bce..f2110164 100644 --- a/test/issues/471-canvas-issue.js +++ b/test/issues/471-canvas-issue.js @@ -1,10 +1,10 @@ const { assert, skip, test, module: describe } = require('qunit'); -const { GPU } = require('../../src'); +const { GPU } = require('../..'); describe('issue #471 - canvas issue'); function testCanvasIssue(mode) { - const gpu = new GPU({mode}); + const gpu = new GPU({ mode }); const render = gpu .createKernel(function () { this.color(0, 0, 0, 1); diff --git a/test/issues/472-compilation-issue.js b/test/issues/472-compilation-issue.js index 19eeef70..a987ceb7 100644 --- a/test/issues/472-compilation-issue.js +++ b/test/issues/472-compilation-issue.js @@ -1,11 +1,11 @@ const { assert, skip, test, module: describe, only } = require('qunit'); -const { GPU } = require('../../src'); +const { GPU } = require('../..'); describe('issue #472 - compilation issue'); function testCompilationIssue(mode) { const gpu = new GPU({ mode }); - const kernelFunction = function(data, wobble) { + const kernelFunction = function (data, wobble) { let x = this.thread.x, y = this.thread.y; @@ -20,12 +20,13 @@ function testCompilationIssue(mode) { output: [2, 2], graphical: true, }); - render(new Uint8ClampedArray([ - 230,233,240,255, - 231,234,241,255, - 232,235,242,255, - 233,236,243,255 - ]), 14 * Math.sin(Date.now() / 400)); + render( + new Uint8ClampedArray([ + 230, 233, 240, 255, 231, 234, 241, 255, 232, 235, 242, 255, 233, 236, + 243, 255, + ]), + 14 * Math.sin(Date.now() / 400) + ); assert.equal(render.getPixels().length, 2 * 2 * 4); gpu.destroy(); } diff --git a/test/issues/473-4-pixels.js b/test/issues/473-4-pixels.js index fb4ffd94..5d55f349 100644 --- a/test/issues/473-4-pixels.js +++ b/test/issues/473-4-pixels.js @@ -1,12 +1,12 @@ const { assert, skip, test, module: describe } = require('qunit'); -const { GPU } = require('../../src'); +const { GPU } = require('../..'); describe('issue #473 - only 4 pixels are shown'); function testOnly4PixelsAreShownRGBStaticOutput(mode) { const gpu = new GPU({ mode }); const render = gpu.createKernel( - function() { + function () { this.color(1, 1, 1); }, { @@ -39,9 +39,12 @@ test('RGB static output gpu', () => { testOnly4PixelsAreShownRGBStaticOutput('webgl2'); }); -(GPU.isHeadlessGLSupported ? test : skip)('RGB static output headlessgl', () => { - testOnly4PixelsAreShownRGBStaticOutput('headlessgl'); -}); +(GPU.isHeadlessGLSupported ? test : skip)( + 'RGB static output headlessgl', + () => { + testOnly4PixelsAreShownRGBStaticOutput('headlessgl'); + } +); (GPU.isCanvasSupported ? test : skip)('RGB static output cpu', () => { testOnly4PixelsAreShownRGBStaticOutput('cpu'); @@ -50,7 +53,7 @@ test('RGB static output gpu', () => { function testOnly4PixelsAreShownRGBAStaticOutput(mode) { const gpu = new GPU({ mode }); const render = gpu.createKernel( - function() { + function () { this.color(1, 1, 1, 1); }, { @@ -83,9 +86,12 @@ test('RGBA static output gpu', () => { testOnly4PixelsAreShownRGBAStaticOutput('webgl2'); }); -(GPU.isHeadlessGLSupported ? test : skip)('RGBA static output headlessgl', () => { - testOnly4PixelsAreShownRGBAStaticOutput('headlessgl'); -}); +(GPU.isHeadlessGLSupported ? test : skip)( + 'RGBA static output headlessgl', + () => { + testOnly4PixelsAreShownRGBAStaticOutput('headlessgl'); + } +); (GPU.isCanvasSupported ? test : skip)('RGBA static output cpu', () => { testOnly4PixelsAreShownRGBAStaticOutput('cpu'); @@ -94,7 +100,7 @@ test('RGBA static output gpu', () => { function testOnly4PixelsAreShownRGBDynamicOutput(mode) { const gpu = new GPU({ mode }); const render = gpu.createKernel( - function() { + function () { this.color(1, 1, 1); }, { @@ -135,9 +141,12 @@ test('rgb dynamic output gpu', () => { testOnly4PixelsAreShownRGBDynamicOutput('webgl2'); }); -(GPU.isHeadlessGLSupported ? test : skip)('rgb dynamic output headlessgl', () => { - testOnly4PixelsAreShownRGBDynamicOutput('headlessgl'); -}); +(GPU.isHeadlessGLSupported ? test : skip)( + 'rgb dynamic output headlessgl', + () => { + testOnly4PixelsAreShownRGBDynamicOutput('headlessgl'); + } +); (GPU.isCanvasSupported ? test : skip)('rgb dynamic output cpu', () => { testOnly4PixelsAreShownRGBDynamicOutput('cpu'); @@ -146,7 +155,7 @@ test('rgb dynamic output gpu', () => { function testOnly4PixelsAreShownRGBADynamicOutput(mode) { const gpu = new GPU({ mode }); const render = gpu.createKernel( - function() { + function () { this.color(1, 1, 1, 1); }, { @@ -187,9 +196,12 @@ test('rgba dynamic output gpu', () => { testOnly4PixelsAreShownRGBADynamicOutput('webgl2'); }); -(GPU.isHeadlessGLSupported ? test : skip)('rgba dynamic output headlessgl', () => { - testOnly4PixelsAreShownRGBADynamicOutput('headlessgl'); -}); +(GPU.isHeadlessGLSupported ? test : skip)( + 'rgba dynamic output headlessgl', + () => { + testOnly4PixelsAreShownRGBADynamicOutput('headlessgl'); + } +); (GPU.isCanvasSupported ? test : skip)('rgba dynamic output cpu', () => { testOnly4PixelsAreShownRGBADynamicOutput('cpu'); diff --git a/test/issues/487-dynamic-arguments.js b/test/issues/487-dynamic-arguments.js index 3c68bb72..dbd2cf8c 100644 --- a/test/issues/487-dynamic-arguments.js +++ b/test/issues/487-dynamic-arguments.js @@ -1,23 +1,24 @@ const { assert, skip, test, module: describe } = require('qunit'); -const { GPU } = require('../../src'); +const { GPU } = require('../..'); describe('issue #487 - pipeline dynamic arguments'); function testPipelineDynamicArguments(mode) { - const gpu = new GPU({mode: mode}); + const gpu = new GPU({ mode: mode }); - const kernel = gpu.createKernel(function (w) { - return this.thread.x + this.thread.y * w; - }) + const kernel = gpu + .createKernel(function (w) { + return this.thread.x + this.thread.y * w; + }) .setPipeline(true) .setDynamicOutput(true); - const sumRow = gpu.createKernel(function (texture, w) { - let sum = 0; - for (let i = 0; i < w; i++) - sum = sum + texture[this.thread.x][i]; - return sum; - }) + const sumRow = gpu + .createKernel(function (texture, w) { + let sum = 0; + for (let i = 0; i < w; i++) sum = sum + texture[this.thread.x][i]; + return sum; + }) .setDynamicArguments(true) .setDynamicOutput(true); diff --git a/test/issues/493-strange-literal.js b/test/issues/493-strange-literal.js index 089032ac..3bcaeeaf 100644 --- a/test/issues/493-strange-literal.js +++ b/test/issues/493-strange-literal.js @@ -1,30 +1,32 @@ const { assert, skip, test, module: describe, only } = require('qunit'); -const { GPU } = require('../../src'); +const { GPU } = require('../..'); describe('issue #493 - strange literal'); function testStrangeLiteral(mode) { const gpu = new GPU({ mode }); + function kernelFunction(array) { - const xFactor = (1 - 0) * this.constants.x + this.thread.x * this.constants.y; - const yFactor = (1 - .5) * this.constants.x + this.thread.x * this.constants.y; + const xFactor = + (1 - 0) * this.constants.x + this.thread.x * this.constants.y; + const yFactor = + (1 - 0.5) * this.constants.x + this.thread.x * this.constants.y; const value = array[this.thread.x]; - return [ - value[0] / xFactor, - value[1] / yFactor, - ]; + return [value[0] / xFactor, value[1] / yFactor]; } - const kernel1 = gpu.createKernel(kernelFunction) + const kernel1 = gpu + .createKernel(kernelFunction) .setArgumentTypes({ array: 'Array1D(2)' }) - .setConstants({ x: 1, y: 1}) + .setConstants({ x: 1, y: 1 }) .setOutput([1]); - assert.deepEqual(kernel1([[1,2]]), [new Float32Array([1,4])]); - const kernel2 = gpu.createKernel(kernelFunction) + assert.deepEqual(kernel1([[1, 2]]), [new Float32Array([1, 4])]); + const kernel2 = gpu + .createKernel(kernelFunction) .setStrictIntegers(true) .setArgumentTypes({ array: 'Array1D(2)' }) - .setConstants({ x: 1, y: 1}) + .setConstants({ x: 1, y: 1 }) .setOutput([1]); - assert.deepEqual(kernel2([[1,2]]), [new Float32Array([1,4])]); + assert.deepEqual(kernel2([[1, 2]]), [new Float32Array([1, 4])]); gpu.destroy(); } diff --git a/test/issues/500-sticky-arrays.js b/test/issues/500-sticky-arrays.js index db4859db..b8ea0b2c 100644 --- a/test/issues/500-sticky-arrays.js +++ b/test/issues/500-sticky-arrays.js @@ -1,19 +1,27 @@ const { assert, skip, test, module: describe, only } = require('qunit'); -const { GPU } = require('../../src'); +const { GPU } = require('../..'); describe('issue #500 - strange literal'); function testStickyArrays(mode) { const gpu = new GPU({ mode }); + function processImage(image) { return image[0]; } gpu.addFunction(processImage); - const kernel = gpu.createKernel(function(image1, image2, image3) { - return [processImage(image1), processImage(image2), processImage(image3)]; - }, { output: [1] }); - - assert.deepEqual(kernel([1], [2], [3]), [new Float32Array([1,2,3])]); + const kernel = gpu.createKernel( + function (image1, image2, image3) { + return [ + processImage(image1), + processImage(image2), + processImage(image3), + ]; + }, + { output: [1] } + ); + + assert.deepEqual(kernel([1], [2], [3]), [new Float32Array([1, 2, 3])]); } test('auto', () => { diff --git a/test/issues/519-sanitize-names.js b/test/issues/519-sanitize-names.js index 12a72961..a791cdbc 100644 --- a/test/issues/519-sanitize-names.js +++ b/test/issues/519-sanitize-names.js @@ -1,15 +1,18 @@ const { assert, skip, test, module: describe, only } = require('qunit'); -const { GPU } = require('../../src'); +const { GPU } = require('../..'); describe('issue #519 - sanitize names'); function testSanitizeNames(mode) { const gpu = new GPU({ mode }); - const kernel1 = gpu.createKernel(function (value__$, value__, value$, _) { - return value__$ + value__ + value$ + _ + 1; - }, { - output: [1] - }); + const kernel1 = gpu.createKernel( + function (value__$, value__, value$, _) { + return value__$ + value__ + value$ + _ + 1; + }, + { + output: [1], + } + ); assert.equal(kernel1(1, 2, 3, 4)[0], 11); gpu.destroy(); } @@ -36,4 +39,4 @@ test('gpu', () => { test('cpu', () => { testSanitizeNames('cpu'); -}); \ No newline at end of file +}); diff --git a/test/issues/553-permanent-flip.js b/test/issues/553-permanent-flip.js index fc055a76..3d3cde52 100644 --- a/test/issues/553-permanent-flip.js +++ b/test/issues/553-permanent-flip.js @@ -1,24 +1,25 @@ const { assert, skip, test, module: describe, only } = require('qunit'); -const { GPU } = require('../../src'); +const { GPU } = require('../..'); describe('issue #553 - permanent flip'); function testFixPermanentFlip(precision, mode) { const gpu = new GPU({ mode }); - const kernel = gpu.createKernel(function(a1, a2, a3, a4) { - return a2[this.thread.x]; - }, { - precision, - output: [4] - }); + const kernel = gpu.createKernel( + function (a1, a2, a3, a4) { + return a2[this.thread.x]; + }, + { + precision, + output: [4], + } + ); const arr = [1, 2, 3, 4]; for (let i = 0; i < 4; i++) { - assert.deepEqual(kernel( - 999, - arr, - new Image(2, 2), - 999, - ), new Float32Array(arr)); + assert.deepEqual( + kernel(999, arr, new Image(2, 2), 999), + new Float32Array(arr) + ); } gpu.destroy(); @@ -64,4 +65,4 @@ function testFixPermanentFlip(precision, mode) { (typeof Image === 'undefined' ? skip : test)('cpu single', () => { testFixPermanentFlip('single', 'cpu'); -}); \ No newline at end of file +}); diff --git a/test/issues/556-minify-for-loop.js b/test/issues/556-minify-for-loop.js index c4031475..8d736887 100644 --- a/test/issues/556-minify-for-loop.js +++ b/test/issues/556-minify-for-loop.js @@ -1,25 +1,26 @@ const { assert, skip, test, module: describe, only } = require('qunit'); -const { GPU, WebGLFunctionNode } = require('../../src'); +const { GPU, WebGLFunctionNode } = require('../..'); describe('issue #556 - minify for loop'); -const source = 'function w(t,e){for(var r=0,i=0;i 4, - returnType: 'Number' - }); + const node = new WebGLFunctionNode(source, { + constantTypes: { + size: 'Number', + }, + output: [1], + argumentNames: ['t', 'e'], + argumentTypes: ['Array', 'Array'], + lookupFunctionArgumentBitRatio: () => 4, + returnType: 'Number', + }); - assert.equal(node.toString(), `float w(sampler2D user_t,ivec2 user_tSize,ivec3 user_tDim, sampler2D user_e,ivec2 user_eSize,ivec3 user_eDim) { + assert.equal( + node.toString(), + `float w(sampler2D user_t,ivec2 user_tSize,ivec3 user_tDim, sampler2D user_e,ivec2 user_eSize,ivec3 user_eDim) { float user_r=0.0;int user_i=0; for (int safeI=0;safeI { @@ -39,12 +41,11 @@ function testKernel(mode) { const kernel = gpu.createKernel(source, { output: [1, 1], constants: { - size: 1 + size: 1, }, }); const result = kernel([[1]], [[1]]); assert.deepEqual(result, [new Float32Array([1])]); - } test('kernel auto', () => { @@ -69,4 +70,4 @@ test('kernel gpu', () => { test('kernel cpu', () => { testKernel('cpu'); -}); \ No newline at end of file +}); diff --git a/test/issues/560-minification-madness.js b/test/issues/560-minification-madness.js index 4d599d80..e0f2b406 100644 --- a/test/issues/560-minification-madness.js +++ b/test/issues/560-minification-madness.js @@ -1,43 +1,49 @@ const { assert, skip, test, module: describe, only } = require('qunit'); -const { GPU } = require('../../src'); +const { GPU } = require('../..'); describe('issue #560 - minification madness'); function testMinificationMadness(mode, canvas) { const gpu = new GPU({ mode, canvas }); - const kernel = gpu.createKernel(function (t, e, i, n, r) { - for ( - var o = this.constants.maxIter, - a = this.constants.canvasWidth, - s = this.constants.canvasHeight, - l = i + (n - i) * (this.thread.y / s), - c = t + (e - t) * (this.thread.x / a), - p = 0, - u = 0, - h = 0, - d = 0; - p * p + u * u < 4 && h < o - ;) - d = p * p - u * u + c, - u = 2 * p * u + l, - p = d, - h++; - h === o - ? this.color(0, 0, 0, 1) - : this.color(r[3 * h] / 255, r[3 * h + 1] / 255, r[3 * h + 2] / 255, 1); - }, { - output: [1, 1], - constants: { - maxIter: 1, - canvasWidth: 1, - canvasHeight: 1, + const kernel = gpu.createKernel( + function (t, e, i, n, r) { + for ( + var o = this.constants.maxIter, + a = this.constants.canvasWidth, + s = this.constants.canvasHeight, + l = i + (n - i) * (this.thread.y / s), + c = t + (e - t) * (this.thread.x / a), + p = 0, + u = 0, + h = 0, + d = 0; + p * p + u * u < 4 && h < o; + + ) + (d = p * p - u * u + c), (u = 2 * p * u + l), (p = d), h++; + h === o + ? this.color(0, 0, 0, 1) + : this.color( + r[3 * h] / 255, + r[3 * h + 1] / 255, + r[3 * h + 2] / 255, + 1 + ); }, - graphical: true, - }); - kernel(1,2,3,4,[5]); + { + output: [1, 1], + constants: { + maxIter: 1, + canvasWidth: 1, + canvasHeight: 1, + }, + graphical: true, + } + ); + kernel(1, 2, 3, 4, [5]); assert.ok(kernel.getPixels()); if (kernel.context && kernel.context.getError) - assert.ok(kernel.context.getError() === 0); + assert.ok(kernel.context.getError() === 0); gpu.destroy(); } @@ -71,7 +77,10 @@ test('cpu', () => { putImageData: mockPutImageData, }; const mockCanvas = { - getContext: () => mockContext + getContext: () => mockContext, }; - testMinificationMadness('cpu', typeof HTMLCanvasElement === 'undefined' ? mockCanvas : null); -}); \ No newline at end of file + testMinificationMadness( + 'cpu', + typeof HTMLCanvasElement === 'undefined' ? mockCanvas : null + ); +}); diff --git a/test/issues/564-boolean.js b/test/issues/564-boolean.js index 2e2e918a..cf319af0 100644 --- a/test/issues/564-boolean.js +++ b/test/issues/564-boolean.js @@ -1,5 +1,5 @@ const { assert, skip, test, module: describe, only } = require('qunit'); -const { GPU } = require('../../src'); +const { GPU } = require('../..'); describe('issue #564 - boolean handled'); @@ -7,14 +7,15 @@ function testBooleanHandled(fft, mode) { const gpu = new GPU({ mode }); gpu.addNativeFunction('fft', fft, { returnType: 'Array(4)' }); const kernel = gpu.createKernel( - function(){ + function () { let s = true; return fft(s); - },{ - output:[1], + }, + { + output: [1], } ); - assert.deepEqual(Array.from(kernel()[0]), [1,1,1,1]); + assert.deepEqual(Array.from(kernel()[0]), [1, 1, 1, 1]); gpu.destroy(); } @@ -43,7 +44,10 @@ test('gpu', () => { }); test('cpu', () => { - testBooleanHandled(`function fft(horizontal){ + testBooleanHandled( + `function fft(horizontal){ return [1,1,horizontal?1:0,1]; -}`, 'cpu'); -}); \ No newline at end of file +}`, + 'cpu' + ); +}); diff --git a/test/issues/567-wrong-modulus.js b/test/issues/567-wrong-modulus.js index b5e76049..dc0c155b 100644 --- a/test/issues/567-wrong-modulus.js +++ b/test/issues/567-wrong-modulus.js @@ -1,51 +1,66 @@ const { assert, skip, test, module: describe, only } = require('qunit'); -const { GPU } = require('../../src'); +const { GPU } = require('../..'); describe('issue #567 - wrong modulus'); function testWrongModulus(mode) { const gpu = new GPU({ mode }); - const kernel1 = gpu.createKernel(function () { - return 91 % 7; - }, { - output: [1] - }); + const kernel1 = gpu.createKernel( + function () { + return 91 % 7; + }, + { + output: [1], + } + ); assert.equal(kernel1()[0], 91 % 7); - const kernel2 = gpu.createKernel(function (value1, value2) { - return value1 % value2; - }, { - output: [1], - }); + const kernel2 = gpu.createKernel( + function (value1, value2) { + return value1 % value2; + }, + { + output: [1], + } + ); assert.equal(kernel2(91, 7)[0], 91 % 7); - const kernel3 = gpu.createKernel(function (value1, value2) { - return value1 % value2; - }, { - output: [1], - }); + const kernel3 = gpu.createKernel( + function (value1, value2) { + return value1 % value2; + }, + { + output: [1], + } + ); assert.equal(kernel3(91, 7)[0], 91 % 7); - const kernel4 = gpu.createKernel(function () { - return this.constants.value1 % this.constants.value2; - }, { - output: [1], - constants: { - value1: 91, - value2: 7, + const kernel4 = gpu.createKernel( + function () { + return this.constants.value1 % this.constants.value2; + }, + { + output: [1], + constants: { + value1: 91, + value2: 7, + }, } - }); + ); assert.equal(kernel4()[0].toFixed(2), 91 % 7); - const kernel5 = gpu.createKernel(function () { - return 91 % this.constants.value; - }, { - output: [1], - constants: { - value: 7 + const kernel5 = gpu.createKernel( + function () { + return 91 % this.constants.value; }, - strictIntegers: true - }); + { + output: [1], + constants: { + value: 7, + }, + strictIntegers: true, + } + ); assert.equal(kernel5()[0], 91 % 7); gpu.destroy(); @@ -73,4 +88,4 @@ test('gpu', () => { test('cpu', () => { testWrongModulus('cpu'); -}); \ No newline at end of file +}); diff --git a/test/issues/585-inaccurate-lookups.js b/test/issues/585-inaccurate-lookups.js index 362622ed..4e635c07 100644 --- a/test/issues/585-inaccurate-lookups.js +++ b/test/issues/585-inaccurate-lookups.js @@ -1,17 +1,20 @@ const { assert, skip, test, module: describe, only } = require('qunit'); -const { GPU } = require('../../src'); +const { GPU } = require('../..'); describe('issue #585 - inaccurate lookups'); function testResize(mode) { const gpu = new GPU({ mode }); - const kernel = gpu.createKernel(function(value) { - return value[this.thread.x]; - }, { - output: [4], - }); - - const result = kernel([0,1,2,3]); + const kernel = gpu.createKernel( + function (value) { + return value[this.thread.x]; + }, + { + output: [4], + } + ); + + const result = kernel([0, 1, 2, 3]); assert.equal(Math.round(result[0]), 0); assert.equal(Math.round(result[1]), 1); assert.equal(Math.round(result[2]), 2); @@ -41,4 +44,4 @@ test('gpu', () => { test('cpu', () => { testResize('cpu'); -}); \ No newline at end of file +}); diff --git a/test/issues/586-unable-to-resize.js b/test/issues/586-unable-to-resize.js index 9f9192ae..359456a1 100644 --- a/test/issues/586-unable-to-resize.js +++ b/test/issues/586-unable-to-resize.js @@ -1,26 +1,32 @@ const { assert, skip, test, module: describe, only } = require('qunit'); -const { GPU } = require('../../src'); +const { GPU } = require('../..'); describe('issue #586 - unable to resize'); function testResize(convert, mode) { const gpu = new GPU({ mode }); - const createTexture1 = gpu.createKernel(function() { - return 1; - }, { output: [2, 2], pipeline: false}); - - const createTexture2 = gpu.createKernel(function() { - return 1; - }, { output: [4, 4], pipeline: true}); + const createTexture1 = gpu.createKernel( + function () { + return 1; + }, + { output: [2, 2], pipeline: false } + ); + + const createTexture2 = gpu.createKernel( + function () { + return 1; + }, + { output: [4, 4], pipeline: true } + ); var t1 = createTexture1(); var t2 = createTexture2(); assert.deepEqual(convert(t2), [ - new Float32Array([1,1,1,1]), - new Float32Array([1,1,1,1]), - new Float32Array([1,1,1,1]), - new Float32Array([1,1,1,1]), + new Float32Array([1, 1, 1, 1]), + new Float32Array([1, 1, 1, 1]), + new Float32Array([1, 1, 1, 1]), + new Float32Array([1, 1, 1, 1]), ]); gpu.destroy(); @@ -48,4 +54,4 @@ test('gpu', () => { test('cpu', () => { testResize(a => a, 'cpu'); -}); \ No newline at end of file +}); diff --git a/test/issues/608-rewritten-arrays.js b/test/issues/608-rewritten-arrays.js index 42fa3b14..679630ed 100644 --- a/test/issues/608-rewritten-arrays.js +++ b/test/issues/608-rewritten-arrays.js @@ -1,54 +1,81 @@ const { assert, skip, test, module: describe, only } = require('qunit'); -const { GPU } = require('../../src'); +const { GPU } = require('../..'); describe('issue #608 - rewritten arrays'); function testRewrittenArrays(mode) { const gpu = new GPU({ mode }); - const kernel1 = gpu.createKernel(function (a, b) { - return a[this.thread.y][this.thread.x]; - }, { - constants: { - c: [21, 23] + const kernel1 = gpu.createKernel( + function (a, b) { + return a[this.thread.y][this.thread.x]; }, - output: [2, 2] - }); - const kernel2 = gpu.createKernel(function (a, b) { - return b[this.thread.y][this.thread.x]; - }, { - constants: { - c: [21, 23] + { + constants: { + c: [21, 23], + }, + output: [2, 2], + } + ); + const kernel2 = gpu.createKernel( + function (a, b) { + return b[this.thread.y][this.thread.x]; }, - output: [2, 2] - }); - const kernel3 = gpu.createKernel(function (a, b) { - return this.constants.c[this.thread.x]; - }, { - constants: { - c: [21, 23] + { + constants: { + c: [21, 23], + }, + output: [2, 2], + } + ); + const kernel3 = gpu.createKernel( + function (a, b) { + return this.constants.c[this.thread.x]; }, - output: [2, 2] - }); + { + constants: { + c: [21, 23], + }, + output: [2, 2], + } + ); const a = [ [2, 3], - [5, 7] + [5, 7], ]; const b = [ [11, 13], - [17, 19] + [17, 19], ]; const cExpected = [ [21, 23], - [21, 23] + [21, 23], ]; // testing twice to ensure constants are reset - assert.deepEqual(kernel1(a, b).map(v => Array.from(v)), a); - assert.deepEqual(kernel2(a, b).map(v => Array.from(v)), b); - assert.deepEqual(kernel3(a, b).map(v => Array.from(v)), cExpected); + assert.deepEqual( + kernel1(a, b).map(v => Array.from(v)), + a + ); + assert.deepEqual( + kernel2(a, b).map(v => Array.from(v)), + b + ); + assert.deepEqual( + kernel3(a, b).map(v => Array.from(v)), + cExpected + ); - assert.deepEqual(kernel1(a, b).map(v => Array.from(v)), a); - assert.deepEqual(kernel2(a, b).map(v => Array.from(v)), b); - assert.deepEqual(kernel3(a, b).map(v => Array.from(v)), cExpected); + assert.deepEqual( + kernel1(a, b).map(v => Array.from(v)), + a + ); + assert.deepEqual( + kernel2(a, b).map(v => Array.from(v)), + b + ); + assert.deepEqual( + kernel3(a, b).map(v => Array.from(v)), + cExpected + ); gpu.destroy(); } diff --git a/test/issues/91-create-kernel-map-array.js b/test/issues/91-create-kernel-map-array.js index fd42645e..65a8678b 100644 --- a/test/issues/91-create-kernel-map-array.js +++ b/test/issues/91-create-kernel-map-array.js @@ -1,17 +1,24 @@ const { assert, skip, test, module: describe } = require('qunit'); -const { GPU, HeadlessGLKernel, WebGLKernel, WebGL2Kernel, CPUKernel } = require('../../src'); +const { + GPU, + HeadlessGLKernel, + WebGLKernel, + WebGL2Kernel, + CPUKernel, +} = require('../..'); describe('issue #91'); + function getResult(mode) { const A = [ [1, 2], [3, 4], - [5, 6] + [5, 6], ]; const B = [ [6, 5, 4], - [3, 2, 1] + [3, 2, 1], ]; const gpu = new GPU({ mode }); @@ -24,37 +31,68 @@ function getResult(mode) { return sum; } - const kernels = gpu.createKernelMap({ - multiplyResult: multiply - }, function (a, b) { - return multiply(b, a, this.thread.y, this.thread.x); - }) + const kernels = gpu + .createKernelMap( + { + multiplyResult: multiply, + }, + function (a, b) { + return multiply(b, a, this.thread.y, this.thread.x); + } + ) .setOutput([2, 2]); const result = kernels(A, B).result; - assert.deepEqual(Array.from(result[0]), [21,32]); - assert.deepEqual(Array.from(result[1]), [9,14]); + assert.deepEqual(Array.from(result[0]), [21, 32]); + assert.deepEqual(Array.from(result[1]), [9, 14]); gpu.destroy(); return kernels; } -(GPU.isWebGL2Supported || (GPU.isHeadlessGLSupported && HeadlessGLKernel.features.kernelMap) ? test : skip)("Issue #91 - type detection auto", () => { +(GPU.isWebGL2Supported || + (GPU.isHeadlessGLSupported && HeadlessGLKernel.features.kernelMap) + ? test + : skip)('Issue #91 - type detection auto', () => { getResult(); }); -(GPU.isWebGL2Supported || (GPU.isHeadlessGLSupported && HeadlessGLKernel.features.kernelMap) ? test : skip)("Issue #91 - type detection gpu", () => { +(GPU.isWebGL2Supported || + (GPU.isHeadlessGLSupported && HeadlessGLKernel.features.kernelMap) + ? test + : skip)('Issue #91 - type detection gpu', () => { getResult('gpu'); }); -(GPU.isWebGLSupported ? test : skip)("Issue #91 - type detection webgl", () => { - const kernel = getResult('webgl'); - assert.equal(kernel.kernel.constructor, WebGLKernel, 'kernel type is wrong'); -}); -(GPU.isWebGL2Supported ? test : skip)("Issue #91 - type detection webgl2", () => { - const kernel = getResult('webgl2'); - assert.equal(kernel.kernel.constructor, WebGL2Kernel, 'kernel type is wrong'); -}); -(GPU.isHeadlessGLSupported ? test : skip)("Issue #91 - type detection headlessgl", () => { - const kernel = getResult('headlessgl'); - assert.equal(kernel.kernel.constructor, HeadlessGLKernel, 'kernel type is wrong'); -}); -test("Issue #91 - type detection cpu", () => { +(GPU.isWebGLSupported ? test : skip)( + 'Issue #91 - type detection webgl', + () => { + const kernel = getResult('webgl'); + assert.equal( + kernel.kernel.constructor, + WebGLKernel, + 'kernel type is wrong' + ); + } +); +(GPU.isWebGL2Supported ? test : skip)( + 'Issue #91 - type detection webgl2', + () => { + const kernel = getResult('webgl2'); + assert.equal( + kernel.kernel.constructor, + WebGL2Kernel, + 'kernel type is wrong' + ); + } +); +(GPU.isHeadlessGLSupported ? test : skip)( + 'Issue #91 - type detection headlessgl', + () => { + const kernel = getResult('headlessgl'); + assert.equal( + kernel.kernel.constructor, + HeadlessGLKernel, + 'kernel type is wrong' + ); + } +); +test('Issue #91 - type detection cpu', () => { const kernel = getResult('cpu'); assert.equal(kernel.kernel.constructor, CPUKernel, 'kernel type is wrong'); }); diff --git a/test/issues/96-param-names.js b/test/issues/96-param-names.js index 7ac7054f..b61d7ec0 100644 --- a/test/issues/96-param-names.js +++ b/test/issues/96-param-names.js @@ -1,18 +1,18 @@ const { assert, skip, test, module: describe, only } = require('qunit'); -const { GPU } = require('../../src'); +const { GPU } = require('../..'); describe('issue #96'); function getResult(mode) { const A = [ [1, 1, 1], - [1, 1, 1] + [1, 1, 1], ]; const B = [ [1, 1], [1, 1], - [1, 1] + [1, 1], ]; const gpu = new GPU({ mode }); @@ -25,35 +25,45 @@ function getResult(mode) { return sum; } - const kernels = gpu.createKernelMap({ - multiplyResult: multiply - }, function (a, b) { - return multiply(b, a, this.thread.y, this.thread.x); - }) + const kernels = gpu + .createKernelMap( + { + multiplyResult: multiply, + }, + function (a, b) { + return multiply(b, a, this.thread.y, this.thread.x); + } + ) .setOutput([B.length, A.length]); const result = kernels(A, B).result; - assert.deepEqual(Array.from(result[0]), [2,2,2]); - assert.deepEqual(Array.from(result[1]), [2,2,2]); + assert.deepEqual(Array.from(result[0]), [2, 2, 2]); + assert.deepEqual(Array.from(result[1]), [2, 2, 2]); assert.deepEqual(result.length, 2); gpu.destroy(); return result; } -(GPU.isKernelMapSupported ? test : skip)("Issue #96 - param names auto", () => { - getResult(); -}); -(GPU.isKernelMapSupported ? test : skip)("Issue #96 - param names gpu", () => { +(GPU.isKernelMapSupported ? test : skip)( + 'Issue #96 - param names auto', + () => { + getResult(); + } +); +(GPU.isKernelMapSupported ? test : skip)('Issue #96 - param names gpu', () => { getResult('gpu'); }); -(GPU.isWebGLSupported ? test : skip)("Issue #96 - param names webgl", () => { +(GPU.isWebGLSupported ? test : skip)('Issue #96 - param names webgl', () => { getResult('webgl'); }); -(GPU.isWebGL2Supported ? test : skip)("Issue #96 - param names webgl2", () => { +(GPU.isWebGL2Supported ? test : skip)('Issue #96 - param names webgl2', () => { getResult('webgl2'); }); -(GPU.isHeadlessGLSupported && GPU.isKernelMapSupported ? test : skip)("Issue #96 - param names headlessgl", () => { - getResult('headlessgl'); -}); -test("Issue #96 - param names cpu", () => { +(GPU.isHeadlessGLSupported && GPU.isKernelMapSupported ? test : skip)( + 'Issue #96 - param names headlessgl', + () => { + getResult('headlessgl'); + } +); +test('Issue #96 - param names cpu', () => { getResult('cpu'); }); diff --git a/test/test-utils.js b/test/test-utils.js index cad40d56..2821bff3 100644 --- a/test/test-utils.js +++ b/test/test-utils.js @@ -1,4 +1,3 @@ - const testUtils = { /** * A visual debug utility @@ -9,28 +8,56 @@ const testUtils = { * @return {Object[]} */ splitRGBAToCanvases: (gpu, rgba, width, height) => { - const visualKernelR = gpu.createKernel(function(v) { - const pixel = v[this.thread.y][this.thread.x]; - this.color(pixel.r / 255, 0, 0, 255); - }, { output: [width, height], graphical: true, argumentTypes: { v: 'Array2D(4)' } }); + const visualKernelR = gpu.createKernel( + function (v) { + const pixel = v[this.thread.y][this.thread.x]; + this.color(pixel.r / 255, 0, 0, 255); + }, + { + output: [width, height], + graphical: true, + argumentTypes: { v: 'Array2D(4)' }, + } + ); visualKernelR(rgba); - const visualKernelG = gpu.createKernel(function(v) { - const pixel = v[this.thread.y][this.thread.x]; - this.color(0, pixel.g / 255, 0, 255); - }, { output: [width, height], graphical: true, argumentTypes: { v: 'Array2D(4)' } }); + const visualKernelG = gpu.createKernel( + function (v) { + const pixel = v[this.thread.y][this.thread.x]; + this.color(0, pixel.g / 255, 0, 255); + }, + { + output: [width, height], + graphical: true, + argumentTypes: { v: 'Array2D(4)' }, + } + ); visualKernelG(rgba); - const visualKernelB = gpu.createKernel(function(v) { - const pixel = v[this.thread.y][this.thread.x]; - this.color(0, 0, pixel.b / 255, 255); - }, { output: [width, height], graphical: true, argumentTypes: { v: 'Array2D(4)' } }); + const visualKernelB = gpu.createKernel( + function (v) { + const pixel = v[this.thread.y][this.thread.x]; + this.color(0, 0, pixel.b / 255, 255); + }, + { + output: [width, height], + graphical: true, + argumentTypes: { v: 'Array2D(4)' }, + } + ); visualKernelB(rgba); - const visualKernelA = gpu.createKernel(function(v) { - const pixel = v[this.thread.y][this.thread.x]; - this.color(255, 255, 255, pixel.a / 255); - }, { output: [width, height], graphical: true, argumentTypes: { v: 'Array2D(4)' } }); + const visualKernelA = gpu.createKernel( + function (v) { + const pixel = v[this.thread.y][this.thread.x]; + this.color(255, 255, 255, pixel.a / 255); + }, + { + output: [width, height], + graphical: true, + argumentTypes: { v: 'Array2D(4)' }, + } + ); visualKernelA(rgba); return [