UNPKG

2.65 kBJavaScriptView Raw
1const string = require('glsl-token-string')
2const tokenize = require('glsl-tokenizer')
3const resolve = require('glsl-resolve')
4const path = require('path')
5const fs = require('fs')
6
7module.exports = glslifyImport
8module.exports.sync = glslifyImport;
9
10function glslifyImport (file, src, opts, done) {
11 const tokens = tokenize(src)
12
13 var total = 0
14
15 for (var i = 0; i < tokens.length; i++) (function (i) {
16 var token = tokens[i]
17 if (token.type !== 'preprocessor') return
18
19 var imported = /#pragma glslify:\s*import\(([^\)]+)\)/.exec(token.data)
20 if (!imported) return
21 if (!imported[1]) return
22
23 var target = imported[1]
24 .trim()
25 .replace(/^'|'$/g, '')
26 .replace(/^"|"$/g, '')
27
28 total++
29
30 var basedir = path.dirname(file)
31
32 if (typeof done === 'function') {
33 resolve(target, { basedir: basedir }, function (err, resolved) {
34 if (err) return done(err)
35
36 fs.readFile(resolved, 'utf8', function (err, contents) {
37 if (err) return done(err)
38
39 contents = modifyRequirePaths(contents, basedir, target)
40
41 glslifyImport(resolved, contents, opts, function (err, contents) {
42 if (err) return done(err)
43
44 token.data = contents
45 if (--total) return
46
47 done(null, string(tokens))
48 })
49 })
50 })
51 } else {
52 var resolved = resolve.sync(target, { basedir: basedir });
53 var contents = fs.readFileSync(resolved, 'utf8');
54 contents = modifyRequirePaths(contents, basedir, target);
55 token.data = glslifyImport(resolved, contents, opts);
56 total--;
57 }
58 })(i)
59
60 if (!total) return typeof done === 'function' ? done(null, src) : string(tokens);
61}
62
63function modifyRequirePaths (src, basedir, baseTarget) {
64 const tokens = tokenize(src)
65
66 var targetDir = path.dirname(path.resolve(basedir, baseTarget))
67
68 for (var i = 0; i < tokens.length; i++) {
69 var token = tokens[i]
70 if (token.type !== 'preprocessor') continue
71
72 var required = /#pragma glslify:\s*([^=\s]+)\s*=\s*require\(([^\)]+)\)/.exec(token.data)
73 if (!required) continue
74 if (!required[2]) continue
75
76 var name = required[1]
77 var maps = required[2].split(/\s?,\s?/g)
78 var target = maps.shift()
79 .trim()
80 .replace(/^'|'$/g, '')
81 .replace(/^"|"$/g, '')
82
83 var resolvedTarget = path.resolve(targetDir, target)
84
85 if (name) {
86 token.data = '#pragma glslify: ' + name + ' = require("' + [resolvedTarget].concat(maps).join(', ') + '")'
87 } else {
88 token.data = '#pragma glslify: require("' + [resolvedTarget].concat(maps).join(', ') + '")'
89 }
90 }
91
92 return string(tokens)
93}