summaryrefslogtreecommitdiff
path: root/node_modules/jake/lib/namespace.js
diff options
context:
space:
mode:
Diffstat (limited to 'node_modules/jake/lib/namespace.js')
-rw-r--r--node_modules/jake/lib/namespace.js97
1 files changed, 97 insertions, 0 deletions
diff --git a/node_modules/jake/lib/namespace.js b/node_modules/jake/lib/namespace.js
new file mode 100644
index 0000000..e614665
--- /dev/null
+++ b/node_modules/jake/lib/namespace.js
@@ -0,0 +1,97 @@
+const ROOT_NAMESPACE_NAME = '__rootNamespace__';
+
+class Namespace {
+ constructor(name, parentNamespace) {
+ this.name = name;
+ this.parentNamespace = parentNamespace;
+ this.childNamespaces = {};
+ this.tasks = {};
+ this.rules = {};
+ this.path = this.getPath();
+ this.fullName = this.getFullName();
+
+ //console.log('namespace name', this.name);
+ //console.log('namespace path', this.path);
+ //console.log('namespace fullName', this.fullName);
+ }
+
+ resolveTask(name) {
+ // Namespaced, exact matches only
+ let task;
+ if (name.indexOf(':') > -1) {
+ task = jake.Task[name];
+ }
+ // Bare task name, look on the current namespace
+ // Or in top-level namespace
+ else {
+ task = this.tasks[name] || jake.Task[name];
+ }
+ return task || null;
+ }
+
+
+ resolveNamespace(relativeName) {
+ //console.log(relativeName || 'none passed');
+
+ if (!relativeName) {
+ return this;
+ }
+
+ let parts = relativeName.split(':');
+ let ns = this;
+
+ for (let i = 0, ii = parts.length; ns && i < ii; i++) {
+ ns = ns.childNamespaces[parts[i]];
+ }
+
+ return (ns || (this.parentNamespace &&
+ this.parentNamespace.resolveNamespace(relativeName)));
+ }
+
+ matchRule(relativeName) {
+ let parts = relativeName.split(':');
+ parts.pop();
+ let ns = this.resolveNamespace(parts.join(':'));
+ let rules = ns ? ns.rules : [];
+ let r;
+ let match;
+
+ for (let p in rules) {
+ r = rules[p];
+ if (r.match(relativeName)) {
+ match = r;
+ }
+ }
+
+ return (ns && match) ||
+ (this.parentNamespace &&
+ this.parentNamespace.matchRule(relativeName));
+ }
+
+ getPath() {
+ let parts = [];
+ let next = this.parentNamespace;
+ while (next) {
+ parts.push(next.name);
+ next = next.parentNamespace;
+ }
+ parts.pop(); // Remove '__rootNamespace__'
+ return parts.reverse().join(':');
+ }
+
+ getFullName() {
+ let path = this.path;
+ path = (path && path.split(':')) || [];
+ path.push(this.name);
+ return path.join(':');
+ }
+
+ isRootNamespace() {
+ return !this.parentNamespace;
+ }
+}
+
+Namespace.ROOT_NAMESPACE_NAME = ROOT_NAMESPACE_NAME;
+
+module.exports.Namespace = Namespace;
+