123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311 |
- let path = require('path');
- let fs = require('fs');
- let Task = require('./task/task').Task;
- function splitNs(task) {
- let parts = task.split(':');
- let name = parts.pop();
- let ns = resolveNs(parts);
- return {
- 'name' : name,
- 'ns' : ns
- };
- }
- function resolveNs(parts) {
- let ns = jake.defaultNamespace;
- for(let i = 0, l = parts.length; ns && i < l; i++) {
- ns = ns.childNamespaces[parts[i]];
- }
- return ns;
- }
- function resolve(p) {
- let task = splitNs(p);
- let name = task.name;
- let ns = task.ns;
- let split = path.basename(name).split('%');
- return {
- ns: ns,
- dir: path.dirname(name),
- prefix: split[0],
- suffix: split[1]
- };
- }
- function stringEndWith(a, b) {
- let l;
- return (l = b.lastIndexOf(a)) == -1 ? false : l + a.length == b.length;
- }
- function stringReplaceSuffix(s, a, b) {
- return s.slice(0, s.lastIndexOf(a)) + b;
- }
- class Rule {
- constructor(opts) {
- this.pattern = opts.pattern;
- this.source = opts.source;
- this.prereqs = opts.prereqs;
- this.action = opts.action;
- this.opts = opts.opts;
- this.desc = opts.desc;
- this.ns = opts.ns;
- }
-
-
-
-
-
-
- createTask(fullName, level) {
- let self = this;
- let pattern;
- let source;
- let action;
- let opts;
- let prereqs;
- let valid;
- let src;
- let tNs;
- let createdTask;
- let name = Task.getBaseTaskName(fullName);
- let nsPath = Task.getBaseNamespacePath(fullName);
- let ns = this.ns.resolveNamespace(nsPath);
- pattern = this.pattern;
- source = this.source;
- if (typeof source == 'string') {
- src = Rule.getSource(name, pattern, source);
- }
- else {
- src = source(name);
- }
-
-
- src = nsPath.split(':').filter(function (item) {
- return !!item;
- }).concat(src).join(':');
-
-
-
-
-
-
-
-
-
- prereqs = this.prereqs.slice();
- prereqs.unshift(src);
-
-
-
-
- valid = prereqs.some(function (p) {
- let ns = self.ns;
- return ns.resolveTask(p) ||
- fs.existsSync(Task.getBaseTaskName(p)) ||
- jake.attemptRule(p, ns, level + 1);
- });
-
- if (!valid) {
- return null;
- }
-
- else {
-
- action = function () {
- let task = this;
- self.action.apply(task);
- };
- opts = this.opts;
-
-
-
-
-
- tNs = jake.currentNamespace;
- jake.currentNamespace = ns;
- createdTask = jake.createTask('file', name, prereqs, action, opts);
- createdTask.source = src.split(':').pop();
- jake.currentNamespace = tNs;
- return createdTask;
- }
- }
- match(name) {
- return Rule.match(this.pattern, name);
- }
-
-
-
-
-
-
-
-
-
-
-
-
-
- static match(pattern, name) {
- let p;
- let task;
- let obj;
- let filename;
- if (pattern instanceof RegExp) {
- return pattern.test(name);
- }
- else if (pattern.indexOf('%') == -1) {
-
-
- return stringEndWith(pattern, name);
- }
- else {
-
- p = resolve(pattern);
-
- task = splitNs(name);
- name = task.name;
-
- obj = name;
-
-
- if (path.dirname(obj) != p.dir) {
- return false;
- }
- filename = path.basename(obj);
-
- if ((p.prefix.length + p.suffix.length + 1) > filename.length) {
-
- return false;
- }
-
- if (filename.indexOf(p.prefix) !== 0) {
- return false;
- }
-
- if (!stringEndWith(p.suffix, filename)) {
- return false;
- }
-
- return true;
- }
- }
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- static getSource(name, pattern, source) {
- let dep;
- let pat;
- let match;
- let file;
- let src;
-
- if (pattern instanceof RegExp) {
- match = pattern.exec(name);
- if (match) {
- if (typeof source == 'function') {
- src = source(name);
- }
- else {
- src = stringReplaceSuffix(name, match[0], source);
- }
- }
- }
-
- else {
-
- if (pattern.indexOf('%') == -1) {
- if (typeof source == 'function') {
- src = source(name);
- }
- else {
- src = stringReplaceSuffix(name, pattern, source);
- }
- }
-
- else {
- pat = pattern.replace('%', '(.*?)');
- pat = new RegExp(pat);
- match = pat.exec(name);
- if (match) {
- if (typeof source == 'function') {
- src = source(name);
- }
- else {
- file = match[1];
- file = source.replace('%', file);
- dep = match[0];
- src = name.replace(dep, file);
- }
- }
- }
- }
- return src;
- }
- }
- exports.Rule = Rule;
|