{"version":3,"sources":["jsdelivr-header.js","/npm/programify@0.0.1/index.js"],"names":[],"mappings":"AAAA;AACA;AACA;AACA;AACA;AACA;AACA,ACNA,OAAO,QAAU,WAEjB,IAAI,UAAY,QAAQ,kBACpB,OAAS,QAAQ,eACjB,SAAW,QAAQ,iBACnB,cAAgB,QAAQ,iBACxB,KAAO,QAAQ,iBAEf,KAAO,QAAQ,QACf,GAAK,QAAQ,MACb,OAAS,QAAQ,UAAU,OAE3B,cAAgB,KAAK,uBACrB,UAAY,KAAK,wCAEjB,SAAW,GAAG,aAAa,KAAK,KAAK,UAAW,eAAgB,QAEpE,SAAS,WAAW,EAAQ,GAC1B,IAKI,EALA,EAAc,eA4ClB,SAAoB,EAAK,GACvB,GAAG,EAAK,MAAM,EAEd,IAAI,EAAW,SAAS,QAAQ,aAAc,KAAK,UAAU,IAI7D,GADA,GADA,EAAW,EAAS,QAAQ,cAAe,KAAK,UAAU,kBAAkB,MACxD,QAAQ,eAAgB,KAAK,UAAU,UAAU,MACjD,QAAQ,iBAAkB,kBAAkB,IAEhE,EAAO,MAAM,EACf,IArDI,EAAW,GACX,EAAa,GACb,EAAU,CAAC,EACX,EAAM,EAQV,OALA,EAAS,GAAU,cACnB,EAAU,EAAO,GAMjB,SAAS,IACP,GAAG,IAAQ,EAAO,OAAQ,OACvB,EAAQ,QAAU,EAAY,MAAM,qBACpC,EAAQ,UAAY,EAAY,MAAM,uBAEzC,EACG,KAAK,aACL,KAAK,UACH,GAAG,OAAQ,GACb,KAAK,YACH,GAAG,OAAO,YACN,EAAQ,QAAU,EAAQ,WAAY,EAAY,MAAM,cAE3D,EAAU,IAAS,GACnB,QAAQ,SAAS,EACnB,IACD,KAAK,EAAa,CAAC,IAAK,IAAQ,EAAO,OAAS,IAEnD,EAAQ,QACV,CAvBA,GAEO,EAuBP,SAAS,EAAiB,GAIxB,GAHG,UAAU,KACX,EAAQ,EAAK,MAAM,MAAQ,EAAK,QAE9B,cAAc,GAClB,MAAmC,YAAhC,EAAK,SAAS,GAAG,MAAM,KAA2B,EAAS,KAAK,GAChC,cAAhC,EAAK,SAAS,GAAG,MAAM,KAA6B,EAAW,KAAK,QAAvE,CACF,CAeF,CAEA,SAAS,cACP,IAAI,EAAS,IAAI,OAGjB,OAFA,EAAO,UAAW,EAClB,EAAO,OAAS,WAAW,EACpB,CACT,CAEA,SAAS,kBAAkB,GACzB,MAAO,IACT,CAEA,SAAS,UAAU,GACjB,OAEA,SAAS,EAAK,GACZ,IAAI,EAAM,CAAC,KAAM,EAAK,MAEL,eAAd,EAAK,MAAyB,EAAK,SAAS,SAAQ,EAAI,SAAW,EAAK,SAAS,IAAI,IACrF,EAAK,OAAM,EAAI,KAAO,EAAK,MACb,YAAd,EAAK,OAAoB,EAAI,KAAO,EAAK,MAAM,MAClD,MAAiB,gBAAd,EAAK,KAA+B,KAEhC,CACT,CAXO,CAAK,CAAC,SAAU,GAYzB,CAEA,SAAS,kBAAkB,GACzB,IAAI,EAAM,CAAC,EAEX,IAAI,IAAI,KAAO,EACb,EAAI,GAAO,UAAU,EAAQ,GAAK,UAEpC,OAAO,CACT","file":"/npm/programify@0.0.1/index.js","sourceRoot":"","sourcesContent":["/**\n * Minified by jsDelivr using Terser v5.39.0.\n * Original file: /npm/programify@0.0.1/index.js\n *\n * Do NOT use SRI with dynamically generated files! More information: https://www.jsdelivr.com/using-sri-with-dynamic-files\n */\n","module.exports = programify\n\nvar tokenizer = require('glsl-tokenizer')\n  , parser = require('glsl-parser')\n  , deparser = require('glsl-deparser')\n  , concat_stream = require('concat-stream')\n  , lang = require('cssauron-glsl')\n\nvar Path = require('path')\n  , fs = require('fs')\n  , Stream = require('stream').Stream\n\nvar check_storage = lang(':root > stmt > decl')\n  , is_struct = lang(':root > stmt > decl > struct > ident')\n\nvar template = fs.readFileSync(Path.join(__dirname, 'template.js'), 'utf8')\n\nfunction programify(inputs, output) {\n  var source_code = concat_stream(output_all)\n    , uniforms = []\n    , attributes = []\n    , structs = {}\n    , idx = 0\n    , current\n\n  output = output || make_stream()\n  current = inputs[0]\n\n  iter()\n\n  return output\n\n  function iter() {\n    if(idx === inputs.length) return\n    if(current.vertex) { source_code.write('\\n#ifdef VERTEX\\n') }\n    if(current.fragment) { source_code.write('\\n#ifdef FRAGMENT\\n') }\n\n    current\n      .pipe(tokenizer())\n      .pipe(parser())\n        .on('data', collect_storages)\n      .pipe(deparser())\n        .on('end', function() {\n          if(current.vertex || current.fragment) { source_code.write('\\n#endif\\n') }\n\n          current = inputs[++idx]\n          process.nextTick(iter)\n        })\n      .pipe(source_code, {end: idx === inputs.length - 1})\n\n    current.resume()\n  }\n\n  function collect_storages(node) {\n    if(is_struct(node)) {\n      structs[node.token.data] = node.parent\n    }\n    if(!check_storage(node)) return\n    if(node.children[1].token.data === 'uniform') return uniforms.push(node)\n    if(node.children[1].token.data === 'attribute') return attributes.push(node)\n  }\n\n  function output_all(err, data) {\n    if(err) throw err\n\n    var instance = template.replace(/TPL_SOURCE/, JSON.stringify(data))\n\n    instance = instance.replace(/TPL_STRUCTS/, JSON.stringify(serialize_structs(structs)))\n    instance = instance.replace(/TPL_UNIFORMS/, JSON.stringify(serialize(uniforms)))\n    instance = instance.replace(/TPL_ATTRIBUTES/, create_attributes(attributes))\n\n    output.write(instance)\n  }\n\n  return stream\n}\n\nfunction make_stream() {\n  var stream = new Stream\n  stream.readable = true\n  stream.resume = function(){}\n  return stream\n}\n\nfunction create_attributes(attrs) {\n  return '\"\"'\n}\n\nfunction serialize(any) {\n  return iter({children: any})\n\n  function iter(node) {\n    var out = {type: node.type}\n\n    if(node.type !== 'quantifier' && node.children.length) out.children = node.children.map(iter)\n    if(node.data) out.data = node.data\n    if(node.type === 'keyword') out.data = node.token.data\n    if(node.type === 'placeholder') return null\n\n    return out \n  }\n}\n\nfunction serialize_structs(structs) {\n  var out = {}\n\n  for(var key in structs) {\n    out[key] = serialize(structs[key].children)\n  }\n  return out\n}\n"]}