1 | // koffee 1.14.0
|
2 |
|
3 | /*
|
4 | 000 000 0000000 000 000 00000000 0000000 0000000
|
5 | 000 000 000 000 0000 000 000 000 000 000 000 000
|
6 | 0000000 000 000 000 0 000 0000000 000000000 000 000
|
7 | 000 000 000 000 000 0000 000 000 000 000 000 000
|
8 | 000 000 0000000 000 000 000 000 000 000 0000000
|
9 | */
|
10 | var _, actions, argDir, args, build, cmd, config, dirty, dotGit, fs, gitcount, gitup, j, klog, kolor, len, noon, opt, optall, pkg, pretty, ref, ref1, runcmd, should, slash, status, walk, watch, wlk;
|
11 |
|
12 | ref = require('kxk'), _ = ref._, args = ref.args, fs = ref.fs, klog = ref.klog, kolor = ref.kolor, noon = ref.noon, slash = ref.slash, watch = ref.watch;
|
13 |
|
14 | argDir = require('./argdir');
|
15 |
|
16 | build = require('./build');
|
17 |
|
18 | config = require('./config');
|
19 |
|
20 | pretty = require('./pretty');
|
21 |
|
22 | runcmd = require('./runcmd');
|
23 |
|
24 | should = require('./should');
|
25 |
|
26 | status = require('./status');
|
27 |
|
28 | watch = require('./watch');
|
29 |
|
30 | walk = require('./walk');
|
31 |
|
32 | pkg = require(__dirname + "/../package");
|
33 |
|
34 | args = args.init("arguments depend on options **\nrun build dirty or missing targets in dir false\nrebuild rebuild all targets in dir false -R\nwatch watch directory for changes false\ninfo show build status of dir false\nbump bump package.* version [major|minor|patch] false\nbuild make package false -m\ndiff show git diff of file/dir false\nstatus show git status of file/dir false\nfetch fetch and show git status of file/dir false\ncommit add, commit and push [msg] false\nupdate update npm packages false\npublish bump, commit & publish to npm [msg] false\ntest run tests false\nverbose log more false\nquiet log nothing false\ndebug log debug false -D\nlogtime log with time true", {
|
35 | pkg: pkg
|
36 | });
|
37 |
|
38 | actions = ['bump', 'build', 'commit', 'publish', 'update', 'test', 'watch', 'run', 'rebuild', 'info', 'status', 'fetch', 'diff'];
|
39 |
|
40 | if (!actions.map(function(a) {
|
41 | return args[a];
|
42 | }).reduce(function(acc, val) {
|
43 | return acc || val;
|
44 | })) {
|
45 | args.run = true;
|
46 | }
|
47 |
|
48 | opt = noon.parse("coffee . ext js . map true . replace .. /coffee/ /js/ .. ^coffee/ js/ \nkoffee . ext js . map true . replace .. /coffee/ /js/ .. ^coffee/ js/ \nnoon . ext json\njson . ext noon . filter .. package.json$\nstyl . ext css . replace .. /style/ /css/ .. /styl/ /js/css/\npug . ext html . replace .. /pug/ /js/");
|
49 |
|
50 | opt.ignore = [/.*\.konrad\.noon$/, /.*menu\.noon$/];
|
51 |
|
52 | wlk = {
|
53 | ignore: [/node_modules$/, /bower_components$/, /\/img$/, /\/\..+$/, /\.git$/, /\.app$/, /.*-x64$/, /.*-arm64$/, /.*-ia32$/, /\/?inno$/, /\/?js$/]
|
54 | };
|
55 |
|
56 | dirty = function(sourceFile, targetFile) {
|
57 | var ss, ts;
|
58 | if (!fs.existsSync(targetFile)) {
|
59 | return true;
|
60 | }
|
61 | ss = fs.statSync(sourceFile);
|
62 | ts = fs.statSync(targetFile);
|
63 | return ss.mtime.getTime() > ts.mtime.getTime();
|
64 | };
|
65 |
|
66 | if (args.info) {
|
67 | console.log(kolor.gray('○● info'));
|
68 | walk(wlk, opt, function(sourceFile, targetFile) {
|
69 | if (args.verbose) {
|
70 | console.log("source: " + sourceFile + " target: " + targetFile);
|
71 | }
|
72 | if (dirty(sourceFile, targetFile)) {
|
73 | return console.log(pretty.filePath(_.padEnd(slash.relative(sourceFile, argDir()), 40), kolor.yellow), kolor.red(kolor.dim(" ► ")), pretty.filePath(slash.relative(targetFile, argDir()), kolor.red));
|
74 | } else if (args.verbose) {
|
75 | return console.log(pretty.filePath(_.padEnd(slash.relative(sourceFile, argDir()), 40), kolor.magenta), kolor.green(kolor.dim(" ► ")), pretty.filePath(slash.relative(targetFile, argDir()), kolor.green));
|
76 | }
|
77 | });
|
78 | }
|
79 |
|
80 | if (args.diff) {
|
81 | args.status = true;
|
82 | }
|
83 |
|
84 | if (args.status || args.fetch) {
|
85 | optall = _.defaults(opt, {
|
86 | all: true
|
87 | });
|
88 | gitcount = 0;
|
89 | walk(wlk, optall, function(sourceFile, targetFile) {
|
90 | var i, j, len, ref1;
|
91 | if (!targetFile) {
|
92 | if (slash.basename(sourceFile) === '.git') {
|
93 | if (args.fetch) {
|
94 | status.gitFetch(sourceFile);
|
95 | } else {
|
96 | status.gitStatus(sourceFile);
|
97 | }
|
98 | gitcount += 1;
|
99 | }
|
100 | if (slash.dirExists(sourceFile)) {
|
101 | ref1 = opt.ignore;
|
102 | for (j = 0, len = ref1.length; j < len; j++) {
|
103 | i = ref1[j];
|
104 | if ((i != null ? i.test : void 0) != null) {
|
105 | if (i.test(sourceFile)) {
|
106 | return false;
|
107 | }
|
108 | } else {
|
109 | klog('ignore?', i);
|
110 | }
|
111 | }
|
112 | }
|
113 | }
|
114 | return true;
|
115 | });
|
116 | if (!gitcount) {
|
117 | gitup = slash.parse(argDir());
|
118 | while (gitup.base) {
|
119 | dotGit = slash.join(gitup.dir, '.git');
|
120 | if (fs.existsSync(dotGit)) {
|
121 | if (args.fetch) {
|
122 | status.gitFetch(dotGit);
|
123 | } else {
|
124 | status.gitStatus(dotGit);
|
125 | }
|
126 | break;
|
127 | }
|
128 | gitup = slash.parse(gitup.dir);
|
129 | }
|
130 | }
|
131 | }
|
132 |
|
133 | if (args.run || args.rebuild) {
|
134 | if (!args.quiet) {
|
135 | console.log('🔧🔧 ' + kolor.gray(args.rebuild && 'rebuild' || 'run'));
|
136 | }
|
137 | walk(wlk, opt, function(sourceFile, targetFile) {
|
138 | var isDirty, src, tgt;
|
139 | if (targetFile) {
|
140 | isDirty = dirty(sourceFile, targetFile);
|
141 | if (args.rebuild || isDirty) {
|
142 | src = pretty.filePath(_.padEnd(slash.relative(sourceFile, argDir()), 40), isDirty && kolor.red || kolor.yellow);
|
143 | tgt = pretty.filePath(slash.relative(targetFile, argDir()), kolor.green);
|
144 | if (!args.quiet) {
|
145 | console.log(src, "🔧 ", tgt);
|
146 | }
|
147 | return build(sourceFile, opt, function(sourceFile, targetFile) {
|
148 | var o;
|
149 | if (!targetFile) {
|
150 | process.exit(1);
|
151 | }
|
152 | o = config.obj(targetFile, opt);
|
153 | if (should('browserify', o, targetFile)) {
|
154 | console.log(pretty.filePath(_.padEnd(slash.relative(o.browserify.main, argDir()), 40), kolor.yellow), "🔧 ", pretty.filePath(slash.relative(o.browserify.out, argDir()), kolor.blue));
|
155 | return runcmd('browserify', o.browserify.main + " " + o.browserify.out, config.path('browserify', slash.resolve(targetFile), opt));
|
156 | }
|
157 | });
|
158 | }
|
159 | }
|
160 | });
|
161 | }
|
162 |
|
163 | ref1 = ['update', 'bump', 'build', 'test', 'commit', 'publish'];
|
164 | for (j = 0, len = ref1.length; j < len; j++) {
|
165 | cmd = ref1[j];
|
166 | if (args[cmd]) {
|
167 | if (!runcmd(cmd, args["arguments"].join(' '), process.cwd())) {
|
168 | process.exit(1);
|
169 | break;
|
170 | }
|
171 | if (args.verbose) {
|
172 | console.log(kolor.gray('🔧 done'));
|
173 | }
|
174 | if (args["arguments"] && (cmd === 'commit' || cmd === 'bump' || cmd === 'build')) {
|
175 | break;
|
176 | }
|
177 | }
|
178 | }
|
179 |
|
180 | if (args.watch) {
|
181 | watch(wlk, opt);
|
182 | } else if (cmd === 'build') {
|
183 | process.exit(0);
|
184 | }
|
185 |
|
186 | //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoia29ucmFkLmpzIiwic291cmNlUm9vdCI6Ii4uL2NvZmZlZSIsInNvdXJjZXMiOlsia29ucmFkLmNvZmZlZSJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUFBOzs7Ozs7O0FBQUEsSUFBQTs7QUFRQSxNQUFtRCxPQUFBLENBQVEsS0FBUixDQUFuRCxFQUFFLFNBQUYsRUFBSyxlQUFMLEVBQVcsV0FBWCxFQUFlLGVBQWYsRUFBcUIsaUJBQXJCLEVBQTRCLGVBQTVCLEVBQWtDLGlCQUFsQyxFQUF5Qzs7QUFFekMsTUFBQSxHQUFTLE9BQUEsQ0FBUSxVQUFSOztBQUNULEtBQUEsR0FBUyxPQUFBLENBQVEsU0FBUjs7QUFDVCxNQUFBLEdBQVMsT0FBQSxDQUFRLFVBQVI7O0FBQ1QsTUFBQSxHQUFTLE9BQUEsQ0FBUSxVQUFSOztBQUNULE1BQUEsR0FBUyxPQUFBLENBQVEsVUFBUjs7QUFDVCxNQUFBLEdBQVMsT0FBQSxDQUFRLFVBQVI7O0FBQ1QsTUFBQSxHQUFTLE9BQUEsQ0FBUSxVQUFSOztBQUNULEtBQUEsR0FBUyxPQUFBLENBQVEsU0FBUjs7QUFDVCxJQUFBLEdBQVMsT0FBQSxDQUFRLFFBQVI7O0FBQ1QsR0FBQSxHQUFTLE9BQUEsQ0FBVyxTQUFELEdBQVcsYUFBckI7O0FBRVQsSUFBQSxHQUFPLElBQUksQ0FBQyxJQUFMLENBQVUsc25DQUFWLEVBbUJFO0lBQUEsR0FBQSxFQUFJLEdBQUo7Q0FuQkY7O0FBcUJQLE9BQUEsR0FBVSxDQUFDLE1BQUQsRUFBUSxPQUFSLEVBQWdCLFFBQWhCLEVBQXlCLFNBQXpCLEVBQW1DLFFBQW5DLEVBQTRDLE1BQTVDLEVBQW1ELE9BQW5ELEVBQTJELEtBQTNELEVBQWlFLFNBQWpFLEVBQTJFLE1BQTNFLEVBQWtGLFFBQWxGLEVBQTJGLE9BQTNGLEVBQW1HLE1BQW5HOztBQUVWLElBQUcsQ0FBSSxPQUFPLENBQUMsR0FBUixDQUFZLFNBQUMsQ0FBRDtXQUFPLElBQUssQ0FBQSxDQUFBO0FBQVosQ0FBWixDQUEyQixDQUFD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LENBQUosRUFBQTs7UUFFQSxJQUFHLElBQUksRUFBQyxTQUFELEVBQUosSUFBbUIsQ0FBQSxHQUFBLEtBQVEsUUFBUixJQUFBLEdBQUEsS0FBaUIsTUFBakIsSUFBQSxHQUFBLEtBQXdCLE9BQXhCLENBQXRCO0FBQ0ksa0JBREo7U0FSSjs7QUFGSjs7QUFhQSxJQUFHLElBQUksQ0FBQyxLQUFSO0lBQ0ksS0FBQSxDQUFNLEdBQU4sRUFBVyxHQUFYLEVBREo7Q0FBQSxNQUVLLElBQUcsR0FBQSxLQUFRLE9BQVg7SUFDRCxPQUFPLENBQUMsSUFBUixDQUFhLENBQWIsRUFEQyIsInNvdXJjZXNDb250ZW50IjpbIiMjI1xuMDAwICAgMDAwICAgMDAwMDAwMCAgIDAwMCAgIDAwMCAgMDAwMDAwMDAgICAgMDAwMDAwMCAgIDAwMDAwMDBcbjAwMCAgMDAwICAgMDAwICAgMDAwICAwMDAwICAwMDAgIDAwMCAgIDAwMCAgMDAwICAgMDAwICAwMDAgICAwMDBcbjAwMDAwMDAgICAgMDAwICAgMDAwICAwMDAgMCAwMDAgIDAwMDAwMDAgICAgMDAwMDAwMDAwICAwMDAgICAwMDBcbjAwMCAgMDAwICAgMDAwICAgMDAwICAwMDAgIDAwMDAgIDAwMCAgIDAwMCAgMDAwICAgMDAwICAwMDAgICAwMDBcbjAwMCAgIDAwMCAgIDAwMDAwMDAgICAwMDAgICAwMDAgIDAwMCAgIDAwMCAgMDAwICAgMDAwICAwMDAwMDAwXG4jIyNcblxueyBfLCBhcmdzLCBmcywga2xvZywga29sb3IsIG5vb24sIHNsYXNoLCB3YXRjaCB9ID0gcmVxdWlyZSAna3hrJ1xuXG5hcmdEaXIgPSByZXF1aXJlICcuL2FyZ2RpcidcbmJ1aWxkICA9IHJlcXVpcmUgJy4vYnVpbGQnXG5jb25maWcgPSByZXF1aXJlICcuL2NvbmZpZydcbnByZXR0eSA9IHJlcXVpcmUgJy4vcHJldHR5J1xucnVuY21kID0gcmVxdWlyZSAnLi9ydW5jbWQnIFxuc2hvdWxkID0gcmVxdWlyZSAnLi9zaG91bGQnXG5zdGF0dXMgPSByZXF1aXJlICcuL3N0YXR1cydcbndhdGNoICA9IHJlcXVpcmUgJy4vd2F0Y2gnXG53YWxrICAgPSByZXF1aXJlICcuL3dhbGsnXG5wa2cgICAgPSByZXF1aXJlIFwiI3tfX2Rpcm5hbWV9Ly4uL3BhY2thZ2VcIlxuXG5hcmdzID0gYXJncy5pbml0IFwiXCJcIlxuICAgIGFyZ3VtZW50cyAgZGVwZW5kIG9uIG9wdGlvbnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgKipcbiAgICBydW4gICAgICAgIGJ1aWxkIGRpcnR5IG9yIG1pc3NpbmcgdGFyZ2V0cyBpbiBkaXIgICAgICAgIGZhbHNlXG4gICAgcmVidWlsZCAgICByZWJ1aWxkIGFsbCB0YXJnZXRzIGluIGRpciAgICAgICAgICAgICAgICAgICBmYWxzZSAgLVJcbiAgICB3YXRjaCAgICAgIHdhdGNoIGRpcmVjdG9yeSBmb3IgY2hhbmdlcyAgICAgICAgICAgICAgICAgIGZhbHNlXG4gICAgaW5mbyAgICAgICBzaG93IGJ1aWxkIHN0YXR1cyBvZiBkaXIgICAgICAgICAgICAgICAgICAgICBmYWxzZVxuICAgIGJ1bXAgICAgICAgYnVtcCBwYWNrYWdlLiogdmVyc2lvbiBbbWFqb3J8bWlub3J8cGF0Y2hdICAgZmFsc2VcbiAgICBidWlsZCAgICAgIG1ha2UgcGFja2FnZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlICAtbVxuICAgIGRpZmYgICAgICAgc2hvdyBnaXQgZGlmZiBvZiBmaWxlL2RpciAgICAgICAgICAgICAgICAgICAgZmFsc2VcbiAgICBzdGF0dXMgICAgIHNob3cgZ2l0IHN0YXR1cyBvZiBmaWxlL2RpciAgICAgICAgICAgICAgICAgIGZhbHNlXG4gICAgZmV0Y2ggICAgICBmZXRjaCBhbmQgc2hvdyBnaXQgc3RhdHVzIG9mIGZpbGUvZGlyICAgICAgICBmYWxzZVxuICAgIGNvbW1pdCAgICAgYWRkLCBjb21taXQgYW5kIHB1c2ggW21zZ10gICAgICAgICAgICAgICAgICAgZmFsc2VcbiAgICB1cGRhdGUgICAgIHVwZGF0ZSBucG0gcGFja2FnZXMgICAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlXG4gICAgcHVibGlzaCAgICBidW1wLCBjb21taXQgJiBwdWJsaXNoIHRvIG5wbSBbbXNnXSAgICAgICAgICBmYWxzZVxuICAgIHRlc3QgICAgICAgcnVuIHRlc3RzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2VcbiAgICB2ZXJib3NlICAgIGxvZyBtb3JlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlXG4gICAgcXVpZXQgICAgICBsb2cgbm90aGluZyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWxzZVxuICAgIGRlYnVnICAgICAgbG9nIGRlYnVnICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UgIC1EXG4gICAgbG9ndGltZSAgICBsb2cgd2l0aCB0aW1lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnVlXG4gICAgXCJcIlwiLCBwa2c6cGtnXG5cbmFjdGlvbnMgPSBbJ2J1bXAnICdidWlsZCcgJ2NvbW1pdCcgJ3B1Ymxpc2gnICd1cGRhdGUnICd0ZXN0JyAnd2F0Y2gnICdydW4nICdyZWJ1aWxkJyAnaW5mbycgJ3N0YXR1cycgJ2ZldGNoJyAnZGlmZiddXG5cbmlmIG5vdCBhY3Rpb25zLm1hcCgoYSkgLT4gYXJnc1thXSkucmVkdWNlKChhY2MsdmFsKSAtPiBhY2Mgb3IgdmFsKVxuICAgIGFyZ3MucnVuID0gdHJ1ZSAjIG1ha2VzIHJ1biB0aGUgZGVmYXVsdCBhY3Rpb24gaWYgbm8gb3RoZXIgYWN0aW9uIGlzIHNldFxuICAgIFxuIyAwMDAwMDAwICAgIDAwMDAwMDAwICAwMDAwMDAwMCAgIDAwMDAwMDAgICAwMDAgICAwMDAgIDAwMCAgICAgIDAwMDAwMDAwMCAgIDAwMDAwMDBcbiMgMDAwICAgMDAwICAwMDAgICAgICAgMDAwICAgICAgIDAwMCAgIDAwMCAgMDAwICAgMDAwICAwMDAgICAgICAgICAwMDAgICAgIDAwMFxuIyAwMDAgICAwMDAgIDAwMDAwMDAgICAwMDAwMDAgICAgMDAwMDAwMDAwICAwMDAgICAwMDAgIDAwMCAgICAgICAgIDAwMCAgICAgMDAwMDAwMFxuIyAwMDAgICAwMDAgIDAwMCAgICAgICAwMDAgICAgICAgMDAwICAgMDAwICAwMDAgICAwMDAgIDAwMCAgICAgICAgIDAwMCAgICAgICAgICAwMDBcbiMgMDAwMDAwMCAgICAwMDAwMDAwMCAgMDAwICAgICAgIDAwMCAgIDAwMCAgIDAwMDAwMDAgICAwMDAwMDAwICAgICAwMDAgICAgIDAwMDAwMDBcblxub3B0ID0gbm9vbi5wYXJzZSBcIlwiXCJcbmNvZmZlZSAgLiBleHQganMgICAuIG1hcCB0cnVlIC4gcmVwbGFjZSAuLiAvY29mZmVlLyAvanMvIC4uIF5jb2ZmZWUvIGpzLyBcbmtvZmZlZSAgLiBleHQganMgICAuIG1hcCB0cnVlIC4gcmVwbGFjZSAuLiAvY29mZmVlLyAvanMvIC4uIF5jb2ZmZWUvIGpzLyBcbm5vb24gICAgLiBleHQganNvblxuanNvbiAgICAuIGV4dCBub29uIC4gZmlsdGVyICAuLiBwYWNrYWdlLmpzb24kXG5zdHlsICAgIC4gZXh0IGNzcyAgLiByZXBsYWNlIC4uIC9zdHlsZS8gL2Nzcy8gLi4gL3N0eWwvIC9qcy9jc3MvXG5wdWcgICAgIC4gZXh0IGh0bWwgLiByZXBsYWNlIC4uIC9wdWcvIC9qcy9cblwiXCJcIlxuXG4jIDAwMCAgIDAwMDAwMDAgICAwMDAgICAwMDAgICAwMDAwMDAwICAgMDAwMDAwMDAgICAwMDAwMDAwMFxuIyAwMDAgIDAwMCAgICAgICAgMDAwMCAgMDAwICAwMDAgICAwMDAgIDAwMCAgIDAwMCAgMDAwXG4jIDAwMCAgMDAwICAwMDAwICAwMDAgMCAwMDAgIDAwMCAgIDAwMCAgMDAwMDAwMCAgICAwMDAwMDAwXG4jIDAwMCAgMDAwICAgMDAwICAwMDAgIDAwMDAgIDAwMCAgIDAwMCAgMDAwICAgMDAwICAwMDBcbiMgMDAwICAgMDAwMDAwMCAgIDAwMCAgIDAwMCAgIDAwMDAwMDAgICAwMDAgICAwMDAgIDAwMDAwMDAwXG5cbm9wdC5pZ25vcmUgPSBbXG4gICAgLy4qXFwua29ucmFkXFwubm9vbiQvXG4gICAgLy4qbWVudVxcLm5vb24kL1xuXVxuXG53bGsgPVxuICAgIGlnbm9yZTogW1xuICAgICAgICAvbm9kZV9tb2R1bGVzJC9cbiAgICAgICAgL2Jvd2VyX2NvbXBvbmVudHMkL1xuICAgICAgICAvXFwvaW1nJC9cbiAgICAgICAgL1xcL1xcLi4rJC9cbiAgICAgICAgL1xcLmdpdCQvXG4gICAgICAgIC9cXC5hcHAkL1xuICAgICAgICAvLioteDY0JC9cbiAgICAgICAgLy4qLWFybTY0JC9cbiAgICAgICAgLy4qLWlhMzIkL1xuICAgICAgICAvXFwvP2lubm8kL1xuICAgICAgICAvXFwvP2pzJC9cbiAgICBdXG5cbiMgMDAwMDAwMCAgICAwMDAgIDAwMDAwMDAwICAgMDAwMDAwMDAwICAwMDAgICAwMDBcbiMgMDAwICAgMDAwICAwMDAgIDAwMCAgIDAwMCAgICAgMDAwICAgICAgMDAwIDAwMFxuIyAwMDAgICAwMDAgIDAwMCAgMDAwMDAwMCAgICAgICAwMDAgICAgICAgMDAwMDBcbiMgMDAwICAgMDAwICAwMDAgIDAwMCAgIDAwMCAgICAgMDAwICAgICAgICAwMDBcbiMgMDAwMDAwMCAgICAwMDAgIDAwMCAgIDAwMCAgICAgMDAwICAgICAgICAwMDBcblxuZGlydHkgPSAoc291cmNlRmlsZSwgdGFyZ2V0RmlsZSkgLT5cbiAgICBcbiAgICBpZiBub3QgZnMuZXhpc3RzU3luYyB0YXJnZXRGaWxlIHRoZW4gcmV0dXJuIHRydWVcbiAgICBzcyA9IGZzLnN0YXRTeW5jIHNvdXJjZUZpbGVcbiAgICB0cyA9IGZzLnN0YXRTeW5jIHRhcmdldEZpbGVcbiAgICBzcy5tdGltZS5nZXRUaW1lKCkgPiB0cy5tdGltZS5nZXRUaW1lKClcblxuIyAwMDAgIDAwMCAgIDAwMCAgMDAwMDAwMDAgICAwMDAwMDAwXG4jIDAwMCAgMDAwMCAgMDAwICAwMDAgICAgICAgMDAwICAgMDAwXG4jIDAwMCAgMDAwIDAgMDAwICAwMDAwMDAgICAgMDAwICAgMDAwXG4jIDAwMCAgMDAwICAwMDAwICAwMDAgICAgICAgMDAwICAgMDAwXG4jIDAwMCAgMDAwICAgMDAwICAwMDAgICAgICAgIDAwMDAwMDBcblxuaWYgYXJncy5pbmZvXG5cbiAgICBsb2cga29sb3IuZ3JheSAn4peL4pePIGluZm8nXG5cbiAgICB3YWxrIHdsaywgb3B0LCAoc291cmNlRmlsZSwgdGFyZ2V0RmlsZSkgLT5cblxuICAgICAgICBsb2cgXCJzb3VyY2U6ICN7c291cmNlRmlsZX0gdGFyZ2V0OiAje3RhcmdldEZpbGV9XCIgaWYgYXJncy52ZXJib3NlXG4gICAgICAgIGlmIGRpcnR5IHNvdXJjZUZpbGUsIHRhcmdldEZpbGVcbiAgICAgICAgICAgIGxvZyBwcmV0dHkuZmlsZVBhdGgoXy5wYWRFbmQoc2xhc2gucmVsYXRpdmUoc291cmNlRmlsZSwgYXJnRGlyKCkpLCA0MCksIGtvbG9yLnllbGxvdyksIGtvbG9yLnJlZChrb2xvci5kaW0oXCIg4pa6IFwiKSksIHByZXR0eS5maWxlUGF0aChzbGFzaC5yZWxhdGl2ZSh0YXJnZXRGaWxlLCBhcmdEaXIoKSksIGtvbG9yLnJlZClcbiAgICAgICAgZWxzZSBpZiBhcmdzLnZlcmJvc2VcbiAgICAgICAgICAgIGxvZyBwcmV0dHkuZmlsZVBhdGgoXy5wYWRFbmQoc2xhc2gucmVsYXRpdmUoc291cmNlRmlsZSwgYXJnRGlyKCkpLCA0MCksIGtvbG9yLm1hZ2VudGEpLCBrb2xvci5ncmVlbihrb2xvci5kaW0oXCIg4pa6IFwiKSksIHByZXR0eS5maWxlUGF0aChzbGFzaC5yZWxhdGl2ZSh0YXJnZXRGaWxlLCBhcmdEaXIoKSksIGtvbG9yLmdyZWVuKVxuXG5pZiBhcmdzLmRpZmZcbiAgICBcbiAgICBhcmdzLnN0YXR1cyA9IHRydWVcblxuIyBrbG9nIGFyZ3NcbiAgICBcbmlmIGFyZ3Muc3RhdHVzIG9yIGFyZ3MuZmV0Y2hcbiAgICBcbiAgICBvcHRhbGwgPSBfLmRlZmF1bHRzIG9wdCwgYWxsOiB0cnVlXG4gICAgZ2l0Y291bnQgPSAwXG5cbiAgICB3YWxrIHdsaywgb3B0YWxsLCAoc291cmNlRmlsZSwgdGFyZ2V0RmlsZSkgLT5cblxuICAgICAgICBpZiBub3QgdGFyZ2V0RmlsZVxuXG4gICAgICAgICAgICBpZiBzbGFzaC5iYXNlbmFtZShzb3VyY2VGaWxlKSA9PSAnLmdpdCdcbiAgICAgICAgICAgICAgICBpZiBhcmdzLmZldGNoXG4gICAgICAgICAgICAgICAgICAgIHN0YXR1cy5naXRGZXRjaCBzb3VyY2VGaWxlXG4gICAgICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgICAgICBzdGF0dXMuZ2l0U3RhdHVzIHNvdXJjZUZpbGVcbiAgICAgICAgICAgICAgICBnaXRjb3VudCArPSAxXG5cbiAgICAgICAgICAgIGlmIHNsYXNoLmRpckV4aXN0cyBzb3VyY2VGaWxlXG4gICAgICAgICAgICAgICAgZm9yIGkgaW4gb3B0Lmlnbm9yZVxuICAgICAgICAgICAgICAgICAgICBpZiBpPy50ZXN0P1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgaS50ZXN0IHNvdXJjZUZpbGVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2VcbiAgICAgICAgICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgICAgICAgICAga2xvZyAnaWdub3JlPycgaVxuICAgICAgICB0cnVlXG5cbiAgICBpZiBub3QgZ2l0Y291bnRcbiAgICAgICAgZ2l0dXAgPSBzbGFzaC5wYXJzZSBhcmdEaXIoKVxuICAgICAgICB3aGlsZSBnaXR1cC5iYXNlXG4gICAgICAgICAgICBkb3RHaXQgPSBzbGFzaC5qb2luIGdpdHVwLmRpciwgJy5naXQnXG4gICAgICAgICAgICBpZiBmcy5leGlzdHNTeW5jIGRvdEdpdFxuICAgICAgICAgICAgICAgIGlmIGFyZ3MuZmV0Y2hcbiAgICAgICAgICAgICAgICAgICAgc3RhdHVzLmdpdEZldGNoIGRvdEdpdFxuICAgICAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICAgICAgc3RhdHVzLmdpdFN0YXR1cyBkb3RHaXRcbiAgICAgICAgICAgICAgICBicmVha1xuICAgICAgICAgICAgZ2l0dXAgPSBzbGFzaC5wYXJzZSBnaXR1cC5kaXJcbiAgICAgICAgICAgIFxuIyAwMDAwMDAwMCAgIDAwMCAgIDAwMCAgMDAwICAgMDAwXG4jIDAwMCAgIDAwMCAgMDAwICAgMDAwICAwMDAwICAwMDBcbiMgMDAwMDAwMCAgICAwMDAgICAwMDAgIDAwMCAwIDAwMFxuIyAwMDAgICAwMDAgIDAwMCAgIDAwMCAgMDAwICAwMDAwXG4jIDAwMCAgIDAwMCAgIDAwMDAwMDAgICAwMDAgICAwMDBcblxuaWYgYXJncy5ydW4gb3IgYXJncy5yZWJ1aWxkXG5cbiAgICBpZiBub3QgYXJncy5xdWlldFxuICAgICAgICBsb2cgJ/CflKfwn5SnICcgKyBrb2xvci5ncmF5KGFyZ3MucmVidWlsZCBhbmQgJ3JlYnVpbGQnIG9yICdydW4nKVxuICAgIFxuICAgIHdhbGsgd2xrLCBvcHQsIChzb3VyY2VGaWxlLCB0YXJnZXRGaWxlKSAtPlxuICAgICAgICBpZiB0YXJnZXRGaWxlXG4gICAgICAgICAgICBpc0RpcnR5ID0gZGlydHkgc291cmNlRmlsZSwgdGFyZ2V0RmlsZVxuICAgICAgICAgICAgaWYgYXJncy5yZWJ1aWxkIG9yIGlzRGlydHlcbiAgICAgICAgICAgICAgICBzcmMgPSBwcmV0dHkuZmlsZVBhdGgoXy5wYWRFbmQoc2xhc2gucmVsYXRpdmUoc291cmNlRmlsZSwgYXJnRGlyKCkpLCA0MCksIGlzRGlydHkgYW5kIGtvbG9yLnJlZCBvciBrb2xvci55ZWxsb3cpXG4gICAgICAgICAgICAgICAgdGd0ID0gcHJldHR5LmZpbGVQYXRoKHNsYXNoLnJlbGF0aXZlKHRhcmdldEZpbGUsIGFyZ0RpcigpKSwga29sb3IuZ3JlZW4pXG4gICAgICAgICAgICAgICAgaWYgbm90IGFyZ3MucXVpZXRcbiAgICAgICAgICAgICAgICAgICAgbG9nIHNyYywgXCLwn5SnICBcIiwgdGd0XG4gICAgICAgICAgICAgICAgYnVpbGQgc291cmNlRmlsZSwgb3B0LCAoc291cmNlRmlsZSwgdGFyZ2V0RmlsZSkgLT5cbiAgICAgICAgICAgICAgICAgICAgaWYgbm90IHRhcmdldEZpbGVcbiAgICAgICAgICAgICAgICAgICAgICAgIHByb2Nlc3MuZXhpdCAxXG4gICAgICAgICAgICAgICAgICAgIG8gPSBjb25maWcub2JqIHRhcmdldEZpbGUsIG9wdFxuICAgICAgICAgICAgICAgICAgICBpZiBzaG91bGQgJ2Jyb3dzZXJpZnknLCBvLCB0YXJnZXRGaWxlXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyBwcmV0dHkuZmlsZVBhdGgoXy5wYWRFbmQoc2xhc2gucmVsYXRpdmUoby5icm93c2VyaWZ5Lm1haW4sIGFyZ0RpcigpKSwgNDApLCBrb2xvci55ZWxsb3cpLCBcIvCflKcgIFwiLCBwcmV0dHkuZmlsZVBhdGgoc2xhc2gucmVsYXRpdmUoby5icm93c2VyaWZ5Lm91dCwgYXJnRGlyKCkpLCBrb2xvci5ibHVlKVxuICAgICAgICAgICAgICAgICAgICAgICAgcnVuY21kICdicm93c2VyaWZ5JyBcIiN7by5icm93c2VyaWZ5Lm1haW59ICN7by5icm93c2VyaWZ5Lm91dH1cIiBjb25maWcucGF0aCAnYnJvd3NlcmlmeScsIHNsYXNoLnJlc29sdmUodGFyZ2V0RmlsZSksIG9wdFxuICAgICAgICAgICAgICAgICAgICAgICAgXG5mb3IgY21kIGluIFsndXBkYXRlJyAnYnVtcCcgJ2J1aWxkJyAndGVzdCcgJ2NvbW1pdCcgJ3B1Ymxpc2gnXVxuXG4gICAgaWYgYXJnc1tjbWRdXG4gICAgICAgIFxuICAgICAgICBpZiBub3QgcnVuY21kIGNtZCwgYXJncy5hcmd1bWVudHMuam9pbignICcpLCBwcm9jZXNzLmN3ZCgpXG4gICAgICAgICAgICBwcm9jZXNzLmV4aXQgMVxuICAgICAgICAgICAgYnJlYWtcblxuICAgICAgICBsb2cga29sb3IuZ3JheSAn8J+UpyAgZG9uZScgaWYgYXJncy52ZXJib3NlXG5cbiAgICAgICAgaWYgYXJncy5hcmd1bWVudHMgYW5kIGNtZCBpbiBbJ2NvbW1pdCcgJ2J1bXAnICdidWlsZCddXG4gICAgICAgICAgICBicmVha1xuXG5pZiBhcmdzLndhdGNoXG4gICAgd2F0Y2ggd2xrLCBvcHRcbmVsc2UgaWYgY21kIGluIFsnYnVpbGQnXVxuICAgIHByb2Nlc3MuZXhpdCAwXG4gICAgIl19
|
187 | //# sourceURL=../coffee/konrad.coffee |
\ | No newline at end of file |