MACHIN
This commit is contained in:
44
32/node_modules/jake/Makefile
generated
vendored
Normal file
44
32/node_modules/jake/Makefile
generated
vendored
Normal file
@@ -0,0 +1,44 @@
|
||||
#
|
||||
# Jake JavaScript build tool
|
||||
# Copyright 2112 Matthew Eernisse (mde@fleegix.org)
|
||||
#
|
||||
# Licensed under the Apache License, Version 2.0 (the "License");
|
||||
# you may not use this file except in compliance with the License.
|
||||
# You may obtain a copy of the License at
|
||||
#
|
||||
# http://www.apache.org/licenses/LICENSE-2.0
|
||||
#
|
||||
# Unless required by applicable law or agreed to in writing, software
|
||||
# distributed under the License is distributed on an "AS IS" BASIS,
|
||||
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
# See the License for the specific language governing permissions and
|
||||
# limitations under the License.
|
||||
#
|
||||
|
||||
.PHONY: all build install clean uninstall
|
||||
|
||||
PREFIX=/usr/local
|
||||
DESTDIR=
|
||||
|
||||
all: build
|
||||
|
||||
build:
|
||||
@echo 'Jake built.'
|
||||
|
||||
install:
|
||||
@mkdir -p $(DESTDIR)$(PREFIX)/bin && \
|
||||
mkdir -p $(DESTDIR)$(PREFIX)/lib/node_modules/jake && \
|
||||
mkdir -p ./node_modules && \
|
||||
npm install utilities minimatch && \
|
||||
cp -R ./* $(DESTDIR)$(PREFIX)/lib/node_modules/jake/ && \
|
||||
ln -snf ../lib/node_modules/jake/bin/cli.js $(DESTDIR)$(PREFIX)/bin/jake && \
|
||||
chmod 755 $(DESTDIR)$(PREFIX)/lib/node_modules/jake/bin/cli.js && \
|
||||
echo 'Jake installed.'
|
||||
|
||||
clean:
|
||||
@true
|
||||
|
||||
uninstall:
|
||||
@rm -f $(DESTDIR)$(PREFIX)/bin/jake && \
|
||||
rm -fr $(DESTDIR)$(PREFIX)/lib/node_modules/jake/ && \
|
||||
echo 'Jake uninstalled.'
|
||||
17
32/node_modules/jake/README.md
generated
vendored
Normal file
17
32/node_modules/jake/README.md
generated
vendored
Normal file
@@ -0,0 +1,17 @@
|
||||
### Jake -- the JavaScript build tool for Node.js
|
||||
|
||||
[](https://travis-ci.org/jakejs/jake)
|
||||
|
||||
Documentation site at [http://jakejs.com](http://jakejs.com/)
|
||||
|
||||
### Contributing
|
||||
1. [Install node](http://nodejs.org/#download).
|
||||
2. Clone this repository `$ git clone git@github.com:jakejs/jake.git`.
|
||||
3. Install dependencies `$ npm install`.
|
||||
4. Run tests with `$ npm test`.
|
||||
5. Start Hacking!
|
||||
|
||||
### License
|
||||
|
||||
Licensed under the Apache License, Version 2.0
|
||||
(<http://www.apache.org/licenses/LICENSE-2.0>)
|
||||
41
32/node_modules/jake/bin/bash_completion.sh
generated
vendored
Normal file
41
32/node_modules/jake/bin/bash_completion.sh
generated
vendored
Normal file
@@ -0,0 +1,41 @@
|
||||
#!/bin/bash
|
||||
|
||||
# http://stackoverflow.com/a/246128
|
||||
SOURCE="${BASH_SOURCE[0]}"
|
||||
while [ -h "$SOURCE" ]; do # resolve $SOURCE until the file is no longer a symlink
|
||||
DIR="$( cd -P "$( dirname "$SOURCE" )" && pwd )"
|
||||
SOURCE="$(readlink "$SOURCE")"
|
||||
[[ $SOURCE != /* ]] && SOURCE="$DIR/$SOURCE" # if $SOURCE was a relative symlink, we need to resolve it relative to the path where the symlink file was located
|
||||
done
|
||||
JAKE_BIN_DIR="$( cd -P "$( dirname "$SOURCE" )" && pwd )"
|
||||
|
||||
# http://stackoverflow.com/a/12495480
|
||||
# http://stackoverflow.com/a/28647824
|
||||
_auto_jake()
|
||||
{
|
||||
local cur
|
||||
local -a COMPGEN=()
|
||||
_get_comp_words_by_ref -n : -c cur
|
||||
|
||||
# run auto-completions in jake via our auto_complete.js wrapper
|
||||
local -a auto_complete_info=( $(export COMP_LINE="${COMP_LINE}" && ${JAKE_BIN_DIR}/auto_complete.js "$cur" "${3}") )
|
||||
# check reply flag
|
||||
local reply_flag="${auto_complete_info[0]}"
|
||||
if [[ "${reply_flag}" == "no-complete" ]]; then
|
||||
return 1
|
||||
fi
|
||||
local auto_completions=("${auto_complete_info[@]:1}")
|
||||
COMPGEN=( $(compgen -W "${auto_completions[*]}" -- "$cur") )
|
||||
COMPREPLY=( "${COMPGEN[@]}" )
|
||||
|
||||
__ltrim_colon_completions "$cur"
|
||||
|
||||
# do we need another space??
|
||||
if [[ "${reply_flag}" == "yes-space" ]]; then
|
||||
COMPREPLY=( "${COMPGEN[@]}" " " )
|
||||
fi
|
||||
|
||||
return 0
|
||||
}
|
||||
|
||||
complete -o default -F _auto_jake jake
|
||||
31
32/node_modules/jake/bin/cli.js
generated
vendored
Normal file
31
32/node_modules/jake/bin/cli.js
generated
vendored
Normal file
@@ -0,0 +1,31 @@
|
||||
#!/usr/bin/env node
|
||||
/*
|
||||
* Jake JavaScript build tool
|
||||
* Copyright 2112 Matthew Eernisse (mde@fleegix.org)
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*
|
||||
*/
|
||||
|
||||
// Try to load a local jake
|
||||
try {
|
||||
require(`${ process.cwd() }/node_modules/jake`);
|
||||
}
|
||||
// If that fails, likely running globally
|
||||
catch(e) {
|
||||
require('../lib/jake');
|
||||
}
|
||||
|
||||
var args = process.argv.slice(2);
|
||||
|
||||
jake.run.apply(jake, args);
|
||||
112
32/node_modules/jake/jakefile.js
generated
vendored
Normal file
112
32/node_modules/jake/jakefile.js
generated
vendored
Normal file
@@ -0,0 +1,112 @@
|
||||
let proc = require('child_process');
|
||||
|
||||
const PROJECT_DIR = process.cwd();
|
||||
process.env.PROJECT_DIR = PROJECT_DIR;
|
||||
|
||||
namespace('doc', function () {
|
||||
task('generate', ['doc:clobber'], function () {
|
||||
var cmd = '../node-jsdoc-toolkit/app/run.js -n -r=100 ' +
|
||||
'-t=../node-jsdoc-toolkit/templates/codeview -d=./doc/ ./lib';
|
||||
jake.logger.log('Generating docs ...');
|
||||
jake.exec([cmd], function () {
|
||||
jake.logger.log('Done.');
|
||||
complete();
|
||||
});
|
||||
}, {async: true});
|
||||
|
||||
task('clobber', function () {
|
||||
var cmd = 'rm -fr ./doc/*';
|
||||
jake.exec([cmd], function () {
|
||||
jake.logger.log('Clobbered old docs.');
|
||||
complete();
|
||||
});
|
||||
}, {async: true});
|
||||
|
||||
});
|
||||
|
||||
desc('Generate docs for Jake');
|
||||
task('doc', ['doc:generate']);
|
||||
|
||||
npmPublishTask('jake', function () {
|
||||
this.packageFiles.include([
|
||||
'Makefile',
|
||||
'jakefile.js',
|
||||
'README.md',
|
||||
'package.json',
|
||||
'usage.txt',
|
||||
'lib/**',
|
||||
'bin/**',
|
||||
'test/**'
|
||||
]);
|
||||
this.packageFiles.exclude([
|
||||
'test/tmp'
|
||||
]);
|
||||
});
|
||||
|
||||
jake.Task['publish:package'].directory = PROJECT_DIR;
|
||||
|
||||
namespace('test', function () {
|
||||
|
||||
let integrationTest = task('integration', async function () {
|
||||
let testArgs = [];
|
||||
if (process.env.filter) {
|
||||
testArgs.push(process.env.filter);
|
||||
}
|
||||
else {
|
||||
testArgs.push('*.js');
|
||||
}
|
||||
let spawned = proc.spawn(`${PROJECT_DIR}/node_modules/.bin/mocha`, testArgs, {
|
||||
stdio: 'inherit'
|
||||
});
|
||||
return new Promise((resolve, reject) => {
|
||||
spawned.on('exit', () => {
|
||||
resolve();
|
||||
});
|
||||
});
|
||||
|
||||
});
|
||||
integrationTest.directory = `${PROJECT_DIR}/test/integration`;
|
||||
|
||||
let integrationClobber = task('integrationClobber', function () {
|
||||
proc.execSync('rm -rf package.json pkg tmp_publish');
|
||||
});
|
||||
integrationClobber.directory = `${PROJECT_DIR}/test/integration`;
|
||||
|
||||
let unitTest = task('unit', async function () {
|
||||
let testArgs = [];
|
||||
if (process.env.filter) {
|
||||
testArgs.push(process.env.filter);
|
||||
}
|
||||
else {
|
||||
testArgs.push('*.js');
|
||||
}
|
||||
let spawned = proc.spawn(`${PROJECT_DIR}/node_modules/.bin/mocha`, testArgs, {
|
||||
stdio: 'inherit'
|
||||
});
|
||||
});
|
||||
unitTest.directory = `${PROJECT_DIR}/test/unit`;
|
||||
|
||||
});
|
||||
|
||||
desc('Runs all tests');
|
||||
task('test', ['test:unit', 'test:integration', 'test:integrationClobber']);
|
||||
|
||||
desc('Runs eslint for both lib and test directories');
|
||||
task('lint', function (doFix) {
|
||||
|
||||
let cmd = 'eslint --format codeframe "lib/**/*.js" "test/**/*.js"';
|
||||
if (doFix) {
|
||||
cmd += ' --fix';
|
||||
}
|
||||
try {
|
||||
proc.execSync(cmd);
|
||||
}
|
||||
catch (err) {
|
||||
console.log(err.message);
|
||||
console.log(err.stderr.toString());
|
||||
console.log(err.stdout.toString());
|
||||
fail('eslint failed');
|
||||
}
|
||||
});
|
||||
|
||||
|
||||
409
32/node_modules/jake/lib/api.js
generated
vendored
Normal file
409
32/node_modules/jake/lib/api.js
generated
vendored
Normal file
@@ -0,0 +1,409 @@
|
||||
/*
|
||||
* Jake JavaScript build tool
|
||||
* Copyright 2112 Matthew Eernisse (mde@fleegix.org)
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*
|
||||
*/
|
||||
let { uuid } = require('./utils');
|
||||
|
||||
let api = new (function () {
|
||||
/**
|
||||
@name task
|
||||
@static
|
||||
@function
|
||||
@description Creates a Jake Task
|
||||
`
|
||||
@param {String} name The name of the Task
|
||||
@param {Array} [prereqs] Prerequisites to be run before this task
|
||||
@param {Function} [action] The action to perform for this task
|
||||
@param {Object} [opts]
|
||||
@param {Boolean} [opts.asyc=false] Perform this task asynchronously.
|
||||
If you flag a task with this option, you must call the global
|
||||
`complete` method inside the task's action, for execution to proceed
|
||||
to the next task.
|
||||
|
||||
@example
|
||||
desc('This is the default task.');
|
||||
task('default', function (params) {
|
||||
console.log('This is the default task.');
|
||||
});
|
||||
|
||||
desc('This task has prerequisites.');
|
||||
task('hasPrereqs', ['foo', 'bar', 'baz'], function (params) {
|
||||
console.log('Ran some prereqs first.');
|
||||
});
|
||||
|
||||
desc('This is an asynchronous task.');
|
||||
task('asyncTask', function () {
|
||||
setTimeout(complete, 1000);
|
||||
}, {async: true});
|
||||
*/
|
||||
this.task = function (name, prereqs, action, opts) {
|
||||
let args = Array.prototype.slice.call(arguments);
|
||||
let createdTask;
|
||||
args.unshift('task');
|
||||
createdTask = jake.createTask.apply(global, args);
|
||||
jake.currentTaskDescription = null;
|
||||
return createdTask;
|
||||
};
|
||||
|
||||
/**
|
||||
@name rule
|
||||
@static
|
||||
@function
|
||||
@description Creates a Jake Suffix Rule
|
||||
`
|
||||
@param {String} pattern The suffix name of the objective
|
||||
@param {String} source The suffix name of the objective
|
||||
@param {Array} [prereqs] Prerequisites to be run before this task
|
||||
@param {Function} [action] The action to perform for this task
|
||||
@param {Object} [opts]
|
||||
@param {Boolean} [opts.asyc=false] Perform this task asynchronously.
|
||||
If you flag a task with this option, you must call the global
|
||||
`complete` method inside the task's action, for execution to proceed
|
||||
to the next task.
|
||||
@example
|
||||
desc('This is a rule, which does not support namespace or pattern.');
|
||||
rule('.o', '.c', {async: true}, function () {
|
||||
let cmd = util.format('gcc -o %s %s', this.name, this.source);
|
||||
jake.exec([cmd], function () {
|
||||
complete();
|
||||
}, {printStdout: true});
|
||||
});
|
||||
|
||||
desc('This rule has prerequisites.');
|
||||
rule('.o', '.c', ['util.h'], {async: true}, function () {
|
||||
let cmd = util.format('gcc -o %s %s', this.name, this.source);
|
||||
jake.exec([cmd], function () {
|
||||
complete();
|
||||
}, {printStdout: true});
|
||||
});
|
||||
|
||||
desc('This is a rule with patterns.');
|
||||
rule('%.o', '%.c', {async: true}, function () {
|
||||
let cmd = util.format('gcc -o %s %s', this.name, this.source);
|
||||
jake.exec([cmd], function () {
|
||||
complete();
|
||||
}, {printStdout: true});
|
||||
});
|
||||
|
||||
desc('This is another rule with patterns.');
|
||||
rule('obj/%.o', 'src/%.c', {async: true}, function () {
|
||||
let cmd = util.format('gcc -o %s %s', this.name, this.source);
|
||||
jake.exec([cmd], function () {
|
||||
complete();
|
||||
}, {printStdout: true});
|
||||
});
|
||||
|
||||
desc('This is an example with chain rules.');
|
||||
rule('%.pdf', '%.dvi', {async: true}, function () {
|
||||
let cmd = util.format('dvipdfm %s',this.source);
|
||||
jake.exec([cmd], function () {
|
||||
complete();
|
||||
}, {printStdout: true});
|
||||
});
|
||||
|
||||
rule('%.dvi', '%.tex', {async: true}, function () {
|
||||
let cmd = util.format('latex %s',this.source);
|
||||
jake.exec([cmd], function () {
|
||||
complete();
|
||||
}, {printStdout: true});
|
||||
});
|
||||
|
||||
desc('This rule has a namespace.');
|
||||
task('default', ['debug:obj/main.o]);
|
||||
|
||||
namespace('debug', {async: true}, function() {
|
||||
rule('obj/%.o', 'src/%.c', function () {
|
||||
// ...
|
||||
});
|
||||
}
|
||||
*/
|
||||
this.rule = function () {
|
||||
let args = Array.prototype.slice.call(arguments);
|
||||
let arg;
|
||||
let pattern = args.shift();
|
||||
let source = args.shift();
|
||||
let prereqs = [];
|
||||
let action = function () {};
|
||||
let opts = {};
|
||||
let key = pattern.toString(); // May be a RegExp
|
||||
|
||||
while ((arg = args.shift())) {
|
||||
if (typeof arg == 'function') {
|
||||
action = arg;
|
||||
}
|
||||
else if (Array.isArray(arg)) {
|
||||
prereqs = arg;
|
||||
}
|
||||
else {
|
||||
opts = arg;
|
||||
}
|
||||
}
|
||||
|
||||
jake.currentNamespace.rules[key] = new jake.Rule({
|
||||
pattern: pattern,
|
||||
source: source,
|
||||
prereqs: prereqs,
|
||||
action: action,
|
||||
opts: opts,
|
||||
desc: jake.currentTaskDescription,
|
||||
ns: jake.currentNamespace
|
||||
});
|
||||
jake.currentTaskDescription = null;
|
||||
};
|
||||
|
||||
/**
|
||||
@name directory
|
||||
@static
|
||||
@function
|
||||
@description Creates a Jake DirectoryTask. Can be used as a prerequisite
|
||||
for FileTasks, or for simply ensuring a directory exists for use with a
|
||||
Task's action.
|
||||
`
|
||||
@param {String} name The name of the DiretoryTask
|
||||
|
||||
@example
|
||||
|
||||
// Creates the package directory for distribution
|
||||
directory('pkg');
|
||||
*/
|
||||
this.directory = function (name) {
|
||||
let args = Array.prototype.slice.call(arguments);
|
||||
let createdTask;
|
||||
args.unshift('directory');
|
||||
createdTask = jake.createTask.apply(global, args);
|
||||
jake.currentTaskDescription = null;
|
||||
return createdTask;
|
||||
};
|
||||
|
||||
/**
|
||||
@name file
|
||||
@static
|
||||
@function
|
||||
@description Creates a Jake FileTask.
|
||||
`
|
||||
@param {String} name The name of the FileTask
|
||||
@param {Array} [prereqs] Prerequisites to be run before this task
|
||||
@param {Function} [action] The action to create this file, if it doesn't
|
||||
exist already.
|
||||
@param {Object} [opts]
|
||||
@param {Array} [opts.asyc=false] Perform this task asynchronously.
|
||||
If you flag a task with this option, you must call the global
|
||||
`complete` method inside the task's action, for execution to proceed
|
||||
to the next task.
|
||||
|
||||
*/
|
||||
this.file = function (name, prereqs, action, opts) {
|
||||
let args = Array.prototype.slice.call(arguments);
|
||||
let createdTask;
|
||||
args.unshift('file');
|
||||
createdTask = jake.createTask.apply(global, args);
|
||||
jake.currentTaskDescription = null;
|
||||
return createdTask;
|
||||
};
|
||||
|
||||
/**
|
||||
@name desc
|
||||
@static
|
||||
@function
|
||||
@description Creates a description for a Jake Task (or FileTask,
|
||||
DirectoryTask). When invoked, the description that iscreated will
|
||||
be associated with whatever Task is created next.
|
||||
`
|
||||
@param {String} description The description for the Task
|
||||
*/
|
||||
this.desc = function (description) {
|
||||
jake.currentTaskDescription = description;
|
||||
};
|
||||
|
||||
/**
|
||||
@name namespace
|
||||
@static
|
||||
@function
|
||||
@description Creates a namespace which allows logical grouping
|
||||
of tasks, and prevents name-collisions with task-names. Namespaces
|
||||
can be nested inside of other namespaces.
|
||||
`
|
||||
@param {String} name The name of the namespace
|
||||
@param {Function} scope The enclosing scope for the namespaced tasks
|
||||
|
||||
@example
|
||||
namespace('doc', function () {
|
||||
task('generate', ['doc:clobber'], function () {
|
||||
// Generate some docs
|
||||
});
|
||||
|
||||
task('clobber', function () {
|
||||
// Clobber the doc directory first
|
||||
});
|
||||
});
|
||||
*/
|
||||
this.namespace = function (name, closure) {
|
||||
let curr = jake.currentNamespace;
|
||||
let ns = curr.childNamespaces[name] || new jake.Namespace(name, curr);
|
||||
let fn = closure || function () {};
|
||||
curr.childNamespaces[name] = ns;
|
||||
jake.currentNamespace = ns;
|
||||
fn();
|
||||
jake.currentNamespace = curr;
|
||||
jake.currentTaskDescription = null;
|
||||
return ns;
|
||||
};
|
||||
|
||||
/**
|
||||
@name complete
|
||||
@static
|
||||
@function
|
||||
@description Completes an asynchronous task, allowing Jake's
|
||||
execution to proceed to the next task. Calling complete globally or without
|
||||
arguments completes the last task on the invocationChain. If you use parallel
|
||||
execution of prereqs this will probably complete a wrong task. You should call this
|
||||
function with this task as the first argument, before the optional return value.
|
||||
Alternatively you can call task.complete()
|
||||
`
|
||||
@example
|
||||
task('generate', ['doc:clobber'], function () {
|
||||
exec('./generate_docs.sh', function (err, stdout, stderr) {
|
||||
if (err || stderr) {
|
||||
fail(err || stderr);
|
||||
}
|
||||
else {
|
||||
console.log(stdout);
|
||||
complete();
|
||||
}
|
||||
});
|
||||
}, {async: true});
|
||||
*/
|
||||
this.complete = function (task, val) {
|
||||
//this should detect if the first arg is a task, but I guess it should be more thorough
|
||||
if(task && task. _currentPrereqIndex >=0 ) {
|
||||
task.complete(val);
|
||||
}
|
||||
else {
|
||||
val = task;
|
||||
if(jake._invocationChain.length > 0) {
|
||||
jake._invocationChain[jake._invocationChain.length-1].complete(val);
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
/**
|
||||
@name fail
|
||||
@static
|
||||
@function
|
||||
@description Causes Jake execution to abort with an error.
|
||||
Allows passing an optional error code, which will be used to
|
||||
set the exit-code of exiting process.
|
||||
`
|
||||
@param {Error|String} err The error to thow when aborting execution.
|
||||
If this argument is an Error object, it will simply be thrown. If
|
||||
a String, it will be used as the error-message. (If it is a multi-line
|
||||
String, the first line will be used as the Error message, and the
|
||||
remaining lines will be used as the error-stack.)
|
||||
|
||||
@example
|
||||
task('createTests, function () {
|
||||
if (!fs.existsSync('./tests')) {
|
||||
fail('Test directory does not exist.');
|
||||
}
|
||||
else {
|
||||
// Do some testing stuff ...
|
||||
}
|
||||
});
|
||||
*/
|
||||
this.fail = function (err, code) {
|
||||
let msg;
|
||||
let errObj;
|
||||
if (code) {
|
||||
jake.errorCode = code;
|
||||
}
|
||||
if (err) {
|
||||
if (typeof err == 'string') {
|
||||
// Use the initial or only line of the error as the error-message
|
||||
// If there was a multi-line error, use the rest as the stack
|
||||
msg = err.split('\n');
|
||||
errObj = new Error(msg.shift());
|
||||
if (msg.length) {
|
||||
errObj.stack = msg.join('\n');
|
||||
}
|
||||
throw errObj;
|
||||
}
|
||||
else if (err instanceof Error) {
|
||||
throw err;
|
||||
}
|
||||
else {
|
||||
throw new Error(err.toString());
|
||||
}
|
||||
}
|
||||
else {
|
||||
throw new Error();
|
||||
}
|
||||
};
|
||||
|
||||
this.packageTask = function (name, version, prereqs, definition) {
|
||||
return new jake.PackageTask(name, version, prereqs, definition);
|
||||
};
|
||||
|
||||
this.publishTask = function (name, prereqs, opts, definition) {
|
||||
return new jake.PublishTask(name, prereqs, opts, definition);
|
||||
};
|
||||
|
||||
// Backward-compat
|
||||
this.npmPublishTask = function (name, prereqs, opts, definition) {
|
||||
return new jake.PublishTask(name, prereqs, opts, definition);
|
||||
};
|
||||
|
||||
this.testTask = function () {
|
||||
let ctor = function () {};
|
||||
let t;
|
||||
ctor.prototype = jake.TestTask.prototype;
|
||||
t = new ctor();
|
||||
jake.TestTask.apply(t, arguments);
|
||||
return t;
|
||||
};
|
||||
|
||||
this.setTaskTimeout = function (t) {
|
||||
this._taskTimeout = t;
|
||||
};
|
||||
|
||||
this.setSeriesAutoPrefix = function (prefix) {
|
||||
this._seriesAutoPrefix = prefix;
|
||||
};
|
||||
|
||||
this.series = function (...args) {
|
||||
let prereqs = args.map((arg) => {
|
||||
let name = (this._seriesAutoPrefix || '') + arg.name;
|
||||
jake.task(name, arg);
|
||||
return name;
|
||||
});
|
||||
let seriesName = uuid();
|
||||
let seriesTask = jake.task(seriesName, prereqs);
|
||||
seriesTask._internal = true;
|
||||
let res = function () {
|
||||
return new Promise((resolve) => {
|
||||
seriesTask.invoke();
|
||||
seriesTask.on('complete', (val) => {
|
||||
resolve(val);
|
||||
});
|
||||
});
|
||||
};
|
||||
Object.defineProperty(res, 'name', {value: uuid(),
|
||||
writable: false});
|
||||
return res;
|
||||
};
|
||||
|
||||
})();
|
||||
|
||||
module.exports = api;
|
||||
330
32/node_modules/jake/lib/jake.js
generated
vendored
Normal file
330
32/node_modules/jake/lib/jake.js
generated
vendored
Normal file
@@ -0,0 +1,330 @@
|
||||
/*
|
||||
* Jake JavaScript build tool
|
||||
* Copyright 2112 Matthew Eernisse (mde@fleegix.org)
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*
|
||||
*/
|
||||
|
||||
if (!global.jake) {
|
||||
|
||||
let EventEmitter = require('events').EventEmitter;
|
||||
// And so it begins
|
||||
global.jake = new EventEmitter();
|
||||
|
||||
let fs = require('fs');
|
||||
let chalk = require('chalk');
|
||||
let taskNs = require('./task');
|
||||
let Task = taskNs.Task;
|
||||
let FileTask = taskNs.FileTask;
|
||||
let DirectoryTask = taskNs.DirectoryTask;
|
||||
let Rule = require('./rule').Rule;
|
||||
let Namespace = require('./namespace').Namespace;
|
||||
let RootNamespace = require('./namespace').RootNamespace;
|
||||
let api = require('./api');
|
||||
let utils = require('./utils');
|
||||
let Program = require('./program').Program;
|
||||
let loader = require('./loader')();
|
||||
let pkg = JSON.parse(fs.readFileSync(__dirname + '/../package.json').toString());
|
||||
|
||||
const MAX_RULE_RECURSION_LEVEL = 16;
|
||||
|
||||
// Globalize jake and top-level API methods (e.g., `task`, `desc`)
|
||||
Object.assign(global, api);
|
||||
|
||||
// Copy utils onto base jake
|
||||
jake.logger = utils.logger;
|
||||
jake.exec = utils.exec;
|
||||
|
||||
// File utils should be aliased directly on base jake as well
|
||||
Object.assign(jake, utils.file);
|
||||
|
||||
// Also add top-level API methods to exported object for those who don't want to
|
||||
// use the globals (`file` here will overwrite the 'file' utils namespace)
|
||||
Object.assign(jake, api);
|
||||
|
||||
Object.assign(jake, new (function () {
|
||||
|
||||
this._invocationChain = [];
|
||||
this._taskTimeout = 30000;
|
||||
|
||||
// Public properties
|
||||
// =================
|
||||
this.version = pkg.version;
|
||||
// Used when Jake exits with a specific error-code
|
||||
this.errorCode = null;
|
||||
// Loads Jakefiles/jakelibdirs
|
||||
this.loader = loader;
|
||||
// The root of all ... namespaces
|
||||
this.rootNamespace = new RootNamespace();
|
||||
// Non-namespaced tasks are placed into the default
|
||||
this.defaultNamespace = this.rootNamespace;
|
||||
// Start in the default
|
||||
this.currentNamespace = this.defaultNamespace;
|
||||
// Saves the description created by a 'desc' call that prefaces a
|
||||
// 'task' call that defines a task.
|
||||
this.currentTaskDescription = null;
|
||||
this.program = new Program();
|
||||
this.FileList = require('filelist').FileList;
|
||||
this.PackageTask = require('./package_task').PackageTask;
|
||||
this.PublishTask = require('./publish_task').PublishTask;
|
||||
this.TestTask = require('./test_task').TestTask;
|
||||
this.Task = Task;
|
||||
this.FileTask = FileTask;
|
||||
this.DirectoryTask = DirectoryTask;
|
||||
this.Namespace = Namespace;
|
||||
this.Rule = Rule;
|
||||
|
||||
this.parseAllTasks = function () {
|
||||
let _parseNs = function (ns) {
|
||||
let nsTasks = ns.tasks;
|
||||
let nsNamespaces = ns.childNamespaces;
|
||||
for (let q in nsTasks) {
|
||||
let nsTask = nsTasks[q];
|
||||
jake.Task[nsTask.fullName] = nsTask;
|
||||
}
|
||||
for (let p in nsNamespaces) {
|
||||
let nsNamespace = nsNamespaces[p];
|
||||
_parseNs(nsNamespace);
|
||||
}
|
||||
};
|
||||
_parseNs(jake.defaultNamespace);
|
||||
};
|
||||
|
||||
/**
|
||||
* Displays the list of descriptions available for tasks defined in
|
||||
* a Jakefile
|
||||
*/
|
||||
this.showAllTaskDescriptions = function (f) {
|
||||
let p;
|
||||
let maxTaskNameLength = 0;
|
||||
let task;
|
||||
let padding;
|
||||
let name;
|
||||
let descr;
|
||||
let filter = typeof f == 'string' ? f : null;
|
||||
let taskParams;
|
||||
let len;
|
||||
|
||||
for (p in jake.Task) {
|
||||
if (!Object.prototype.hasOwnProperty.call(jake.Task, p)) {
|
||||
continue;
|
||||
}
|
||||
if (filter && p.indexOf(filter) == -1) {
|
||||
continue;
|
||||
}
|
||||
task = jake.Task[p];
|
||||
taskParams = task.params;
|
||||
|
||||
// Record the length of the longest task name -- used for
|
||||
// pretty alignment of the task descriptions
|
||||
if (task.description) {
|
||||
len = p.length + taskParams.length;
|
||||
maxTaskNameLength = len > maxTaskNameLength ?
|
||||
len : maxTaskNameLength;
|
||||
}
|
||||
}
|
||||
|
||||
// Print out each entry with descriptions neatly aligned
|
||||
for (p in jake.Task) {
|
||||
if (!Object.prototype.hasOwnProperty.call(jake.Task, p)) {
|
||||
continue;
|
||||
}
|
||||
if (filter && p.indexOf(filter) == -1) {
|
||||
continue;
|
||||
}
|
||||
task = jake.Task[p];
|
||||
|
||||
taskParams = "";
|
||||
if (task.params != "") {
|
||||
taskParams = "[" + task.params + "]";
|
||||
}
|
||||
|
||||
//name = '\033[32m' + p + '\033[39m ';
|
||||
name = chalk.green(p);
|
||||
|
||||
descr = task.description;
|
||||
if (descr) {
|
||||
descr = chalk.gray('# ' + descr);
|
||||
|
||||
// Create padding-string with calculated length
|
||||
padding = (new Array(maxTaskNameLength - p.length - taskParams.length + 4)).join(' ');
|
||||
|
||||
console.log('jake ' + name + taskParams + padding + descr);
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
this.createTask = function () {
|
||||
let args = Array.prototype.slice.call(arguments);
|
||||
let arg;
|
||||
let obj;
|
||||
let task;
|
||||
let type;
|
||||
let name;
|
||||
let action;
|
||||
let opts = {};
|
||||
let prereqs = [];
|
||||
|
||||
type = args.shift();
|
||||
|
||||
// name, [deps], [action]
|
||||
// Name (string) + deps (array) format
|
||||
if (typeof args[0] == 'string') {
|
||||
name = args.shift();
|
||||
if (Array.isArray(args[0])) {
|
||||
prereqs = args.shift();
|
||||
}
|
||||
}
|
||||
// name:deps, [action]
|
||||
// Legacy object-literal syntax, e.g.: {'name': ['depA', 'depB']}
|
||||
else {
|
||||
obj = args.shift();
|
||||
for (let p in obj) {
|
||||
prereqs = prereqs.concat(obj[p]);
|
||||
name = p;
|
||||
}
|
||||
}
|
||||
|
||||
// Optional opts/callback or callback/opts
|
||||
while ((arg = args.shift())) {
|
||||
if (typeof arg == 'function') {
|
||||
action = arg;
|
||||
}
|
||||
else {
|
||||
opts = Object.assign(Object.create(null), arg);
|
||||
}
|
||||
}
|
||||
|
||||
task = jake.currentNamespace.resolveTask(name);
|
||||
if (task && !action) {
|
||||
// Task already exists and no action, just update prereqs, and return it.
|
||||
task.prereqs = task.prereqs.concat(prereqs);
|
||||
return task;
|
||||
}
|
||||
|
||||
switch (type) {
|
||||
case 'directory':
|
||||
action = function action() {
|
||||
jake.mkdirP(name);
|
||||
};
|
||||
task = new DirectoryTask(name, prereqs, action, opts);
|
||||
break;
|
||||
case 'file':
|
||||
task = new FileTask(name, prereqs, action, opts);
|
||||
break;
|
||||
default:
|
||||
task = new Task(name, prereqs, action, opts);
|
||||
}
|
||||
|
||||
jake.currentNamespace.addTask(task);
|
||||
|
||||
if (jake.currentTaskDescription) {
|
||||
task.description = jake.currentTaskDescription;
|
||||
jake.currentTaskDescription = null;
|
||||
}
|
||||
|
||||
// FIXME: Should only need to add a new entry for the current
|
||||
// task-definition, not reparse the entire structure
|
||||
jake.parseAllTasks();
|
||||
|
||||
return task;
|
||||
};
|
||||
|
||||
this.attemptRule = function (name, ns, level) {
|
||||
let prereqRule;
|
||||
let prereq;
|
||||
if (level > MAX_RULE_RECURSION_LEVEL) {
|
||||
return null;
|
||||
}
|
||||
// Check Rule
|
||||
prereqRule = ns.matchRule(name);
|
||||
if (prereqRule) {
|
||||
prereq = prereqRule.createTask(name, level);
|
||||
}
|
||||
return prereq || null;
|
||||
};
|
||||
|
||||
this.createPlaceholderFileTask = function (name, namespace) {
|
||||
let parsed = name.split(':');
|
||||
let filePath = parsed.pop(); // Strip any namespace
|
||||
let task;
|
||||
|
||||
task = namespace.resolveTask(name);
|
||||
|
||||
// If there's not already an existing dummy FileTask for it,
|
||||
// create one
|
||||
if (!task) {
|
||||
// Create a dummy FileTask only if file actually exists
|
||||
if (fs.existsSync(filePath)) {
|
||||
task = new jake.FileTask(filePath);
|
||||
task.dummy = true;
|
||||
let ns;
|
||||
if (parsed.length) {
|
||||
ns = namespace.resolveNamespace(parsed.join(':'));
|
||||
}
|
||||
else {
|
||||
ns = namespace;
|
||||
}
|
||||
if (!namespace) {
|
||||
throw new Error('Invalid namespace, cannot add FileTask');
|
||||
}
|
||||
ns.addTask(task);
|
||||
// Put this dummy Task in the global Tasks list so
|
||||
// modTime will be eval'd correctly
|
||||
jake.Task[`${ns.path}:${filePath}`] = task;
|
||||
}
|
||||
}
|
||||
|
||||
return task || null;
|
||||
};
|
||||
|
||||
|
||||
this.run = function () {
|
||||
let args = Array.prototype.slice.call(arguments);
|
||||
let program = this.program;
|
||||
let loader = this.loader;
|
||||
let preempt;
|
||||
let opts;
|
||||
|
||||
program.parseArgs(args);
|
||||
program.init();
|
||||
|
||||
preempt = program.firstPreemptiveOption();
|
||||
if (preempt) {
|
||||
preempt();
|
||||
}
|
||||
else {
|
||||
opts = program.opts;
|
||||
// jakefile flag set but no jakefile yet
|
||||
if (opts.autocomplete && opts.jakefile === true) {
|
||||
process.stdout.write('no-complete');
|
||||
return;
|
||||
}
|
||||
// Load Jakefile and jakelibdir files
|
||||
let jakefileLoaded = loader.loadFile(opts.jakefile);
|
||||
let jakelibdirLoaded = loader.loadDirectory(opts.jakelibdir);
|
||||
|
||||
if(!jakefileLoaded && !jakelibdirLoaded && !opts.autocomplete) {
|
||||
fail('No Jakefile. Specify a valid path with -f/--jakefile, ' +
|
||||
'or place one in the current directory.');
|
||||
}
|
||||
|
||||
program.run();
|
||||
}
|
||||
};
|
||||
|
||||
})());
|
||||
}
|
||||
|
||||
module.exports = jake;
|
||||
173
32/node_modules/jake/lib/loader.js
generated
vendored
Normal file
173
32/node_modules/jake/lib/loader.js
generated
vendored
Normal file
@@ -0,0 +1,173 @@
|
||||
/*
|
||||
* Jake JavaScript build tool
|
||||
* Copyright 2112 Matthew Eernisse (mde@fleegix.org)
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*
|
||||
*/
|
||||
|
||||
let path = require('path');
|
||||
let fs = require('fs');
|
||||
let existsSync = fs.existsSync;
|
||||
let utils = require('./utils');
|
||||
|
||||
// Files like jakelib/foobar.jake.js
|
||||
const JAKELIB_FILE_PAT = /\.jake$|\.js$/;
|
||||
const SUPPORTED_EXTENSIONS = {
|
||||
'js': null,
|
||||
'coffee': function () {
|
||||
try {
|
||||
let cs = require('coffeescript');
|
||||
if (typeof cs.register == 'function') {
|
||||
cs.register();
|
||||
}
|
||||
}
|
||||
catch(e) {
|
||||
throw new Error('You have a CoffeeScript Jakefile, but have not installed CoffeeScript');
|
||||
}
|
||||
},
|
||||
'ls': function () {
|
||||
try {
|
||||
require('livescript');
|
||||
}
|
||||
catch (e) {
|
||||
throw new Error('You have a LiveScript Jakefile, but have not installed LiveScript');
|
||||
}
|
||||
},
|
||||
'ts': function () {
|
||||
try {
|
||||
require('ts-node/register/transpile-only');
|
||||
}
|
||||
catch (e) {
|
||||
throw new Error('You have a TypeScript Jakefile, but have not installed TypeScript and ts-node');
|
||||
}
|
||||
}
|
||||
};
|
||||
const IMPLICIT_JAKEFILE_NAMES = [
|
||||
'Jakefile',
|
||||
'Gulpfile'
|
||||
];
|
||||
|
||||
let Loader = function () {
|
||||
// Load a Jakefile, running the code inside -- this may result in
|
||||
// tasks getting defined using the original Jake API, e.g.,
|
||||
// `task('foo' ['bar', 'baz']);`, or can also auto-create tasks
|
||||
// from any functions exported from the file
|
||||
function loadFile(filePath) {
|
||||
let exported = require(filePath);
|
||||
for (let [key, value] of Object.entries(exported)) {
|
||||
let t;
|
||||
if (typeof value == 'function') {
|
||||
t = jake.task(key, value);
|
||||
t.description = '(Exported function)';
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
function fileExists(name) {
|
||||
let nameWithExt = null;
|
||||
// Support no file extension as well
|
||||
let exts = Object.keys(SUPPORTED_EXTENSIONS).concat(['']);
|
||||
exts.some((ext) => {
|
||||
let fname = ext ? `${name}.${ext}` : name;
|
||||
if (existsSync(fname)) {
|
||||
nameWithExt = fname;
|
||||
return true;
|
||||
}
|
||||
});
|
||||
return nameWithExt;
|
||||
}
|
||||
|
||||
// Recursive
|
||||
function findImplicitJakefile() {
|
||||
let cwd = process.cwd();
|
||||
let names = IMPLICIT_JAKEFILE_NAMES;
|
||||
let found = null;
|
||||
names.some((name) => {
|
||||
let n;
|
||||
// Prefer all-lowercase
|
||||
n = name.toLowerCase();
|
||||
if ((found = fileExists(n))) {
|
||||
return found;
|
||||
}
|
||||
// Check mixed-case as well
|
||||
n = name;
|
||||
if ((found = fileExists(n))) {
|
||||
return found;
|
||||
}
|
||||
});
|
||||
if (found) {
|
||||
return found;
|
||||
}
|
||||
else {
|
||||
process.chdir("..");
|
||||
// If we've walked all the way up the directory tree,
|
||||
// bail out with no result
|
||||
if (cwd === process.cwd()) {
|
||||
return null;
|
||||
}
|
||||
return findImplicitJakefile();
|
||||
}
|
||||
}
|
||||
|
||||
this.loadFile = function (fileSpecified) {
|
||||
let jakefile;
|
||||
let origCwd = process.cwd();
|
||||
|
||||
if (fileSpecified) {
|
||||
if (existsSync(fileSpecified)) {
|
||||
jakefile = fileSpecified;
|
||||
}
|
||||
}
|
||||
else {
|
||||
jakefile = findImplicitJakefile();
|
||||
}
|
||||
|
||||
if (jakefile) {
|
||||
let ext = jakefile.split('.')[1];
|
||||
let loaderFunc = SUPPORTED_EXTENSIONS[ext];
|
||||
loaderFunc && loaderFunc();
|
||||
|
||||
loadFile(utils.file.absolutize(jakefile));
|
||||
return true;
|
||||
}
|
||||
else {
|
||||
if (!fileSpecified) {
|
||||
// Restore the working directory on failure
|
||||
process.chdir(origCwd);
|
||||
}
|
||||
return false;
|
||||
}
|
||||
};
|
||||
|
||||
this.loadDirectory = function (d) {
|
||||
let dirname = d || 'jakelib';
|
||||
let dirlist;
|
||||
dirname = utils.file.absolutize(dirname);
|
||||
if (existsSync(dirname)) {
|
||||
dirlist = fs.readdirSync(dirname);
|
||||
dirlist.forEach(function (filePath) {
|
||||
if (JAKELIB_FILE_PAT.test(filePath)) {
|
||||
loadFile(path.join(dirname, filePath));
|
||||
}
|
||||
});
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
};
|
||||
|
||||
};
|
||||
|
||||
module.exports = function () {
|
||||
return new Loader();
|
||||
};
|
||||
115
32/node_modules/jake/lib/namespace.js
generated
vendored
Normal file
115
32/node_modules/jake/lib/namespace.js
generated
vendored
Normal file
@@ -0,0 +1,115 @@
|
||||
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();
|
||||
}
|
||||
|
||||
get fullName() {
|
||||
return this._getFullName();
|
||||
}
|
||||
|
||||
addTask(task) {
|
||||
this.tasks[task.name] = task;
|
||||
task.namespace = this;
|
||||
}
|
||||
|
||||
resolveTask(name) {
|
||||
if (!name) {
|
||||
return;
|
||||
}
|
||||
|
||||
let taskPath = name.split(':');
|
||||
let taskName = taskPath.pop();
|
||||
let task;
|
||||
let ns;
|
||||
|
||||
// Namespaced, return either relative to current, or from root
|
||||
if (taskPath.length) {
|
||||
taskPath = taskPath.join(':');
|
||||
ns = this.resolveNamespace(taskPath) ||
|
||||
Namespace.ROOT_NAMESPACE.resolveNamespace(taskPath);
|
||||
task = (ns && ns.resolveTask(taskName));
|
||||
}
|
||||
// Bare task, return either local, or top-level
|
||||
else {
|
||||
task = this.tasks[name] || Namespace.ROOT_NAMESPACE.tasks[name];
|
||||
}
|
||||
|
||||
return task || null;
|
||||
}
|
||||
|
||||
|
||||
resolveNamespace(relativeName) {
|
||||
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 || null;
|
||||
}
|
||||
|
||||
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;
|
||||
}
|
||||
}
|
||||
|
||||
class RootNamespace extends Namespace {
|
||||
constructor() {
|
||||
super(ROOT_NAMESPACE_NAME, null);
|
||||
Namespace.ROOT_NAMESPACE = this;
|
||||
}
|
||||
}
|
||||
|
||||
module.exports.Namespace = Namespace;
|
||||
module.exports.RootNamespace = RootNamespace;
|
||||
|
||||
406
32/node_modules/jake/lib/package_task.js
generated
vendored
Normal file
406
32/node_modules/jake/lib/package_task.js
generated
vendored
Normal file
@@ -0,0 +1,406 @@
|
||||
/*
|
||||
* Jake JavaScript build tool
|
||||
* Copyright 2112 Matthew Eernisse (mde@fleegix.org)
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*
|
||||
*/
|
||||
|
||||
let path = require('path');
|
||||
let fs = require('fs');
|
||||
let exec = require('child_process').exec;
|
||||
let FileList = require('filelist').FileList;
|
||||
|
||||
/**
|
||||
@name jake
|
||||
@namespace jake
|
||||
*/
|
||||
/**
|
||||
@name jake.PackageTask
|
||||
@constructor
|
||||
@description Instantiating a PackageTask creates a number of Jake
|
||||
Tasks that make packaging and distributing your software easy.
|
||||
|
||||
@param {String} name The name of the project
|
||||
@param {String} version The current project version (will be
|
||||
appended to the project-name in the package-archive
|
||||
@param {Function} definition Defines the contents of the package,
|
||||
and format of the package-archive. Will be executed on the instantiated
|
||||
PackageTask (i.e., 'this', will be the PackageTask instance),
|
||||
to set the various instance-propertiess.
|
||||
|
||||
@example
|
||||
let t = new jake.PackageTask('rous', 'v' + version, function () {
|
||||
let files = [
|
||||
'Capfile'
|
||||
, 'Jakefile'
|
||||
, 'README.md'
|
||||
, 'package.json'
|
||||
, 'app/*'
|
||||
, 'bin/*'
|
||||
, 'config/*'
|
||||
, 'lib/*'
|
||||
, 'node_modules/*'
|
||||
];
|
||||
this.packageFiles.include(files);
|
||||
this.packageFiles.exclude('node_modules/foobar');
|
||||
this.needTarGz = true;
|
||||
});
|
||||
|
||||
*/
|
||||
let PackageTask = function () {
|
||||
let args = Array.prototype.slice.call(arguments);
|
||||
let name = args.shift();
|
||||
let version = args.shift();
|
||||
let definition = args.pop();
|
||||
let prereqs = args.pop() || []; // Optional
|
||||
|
||||
prereqs = [].concat(prereqs); // Accept string or list
|
||||
|
||||
/**
|
||||
@name jake.PackageTask#name
|
||||
@public
|
||||
@type {String}
|
||||
@description The name of the project
|
||||
*/
|
||||
this.name = name;
|
||||
/**
|
||||
@name jake.PackageTask#version
|
||||
@public
|
||||
@type {String}
|
||||
@description The project version-string
|
||||
*/
|
||||
this.version = version;
|
||||
/**
|
||||
@name jake.PackageTask#prereqs
|
||||
@public
|
||||
@type {Array}
|
||||
@description Tasks to run before packaging
|
||||
*/
|
||||
this.prereqs = prereqs;
|
||||
/**
|
||||
@name jake.PackageTask#packageDir
|
||||
@public
|
||||
@type {String='pkg'}
|
||||
@description The directory-name to use for packaging the software
|
||||
*/
|
||||
this.packageDir = 'pkg';
|
||||
/**
|
||||
@name jake.PackageTask#packageFiles
|
||||
@public
|
||||
@type {jake.FileList}
|
||||
@description The list of files and directories to include in the
|
||||
package-archive
|
||||
*/
|
||||
this.packageFiles = new FileList();
|
||||
/**
|
||||
@name jake.PackageTask#needTar
|
||||
@public
|
||||
@type {Boolean=false}
|
||||
@description If set to true, uses the `tar` utility to create
|
||||
a gzip .tgz archive of the package
|
||||
*/
|
||||
this.needTar = false;
|
||||
/**
|
||||
@name jake.PackageTask#needTarGz
|
||||
@public
|
||||
@type {Boolean=false}
|
||||
@description If set to true, uses the `tar` utility to create
|
||||
a gzip .tar.gz archive of the package
|
||||
*/
|
||||
this.needTarGz = false;
|
||||
/**
|
||||
@name jake.PackageTask#needTarBz2
|
||||
@public
|
||||
@type {Boolean=false}
|
||||
@description If set to true, uses the `tar` utility to create
|
||||
a bzip2 .bz2 archive of the package
|
||||
*/
|
||||
this.needTarBz2 = false;
|
||||
/**
|
||||
@name jake.PackageTask#needJar
|
||||
@public
|
||||
@type {Boolean=false}
|
||||
@description If set to true, uses the `jar` utility to create
|
||||
a .jar archive of the package
|
||||
*/
|
||||
this.needJar = false;
|
||||
/**
|
||||
@name jake.PackageTask#needZip
|
||||
@public
|
||||
@type {Boolean=false}
|
||||
@description If set to true, uses the `zip` utility to create
|
||||
a .zip archive of the package
|
||||
*/
|
||||
this.needZip = false;
|
||||
/**
|
||||
@name jake.PackageTask#manifestFile
|
||||
@public
|
||||
@type {String=null}
|
||||
@description Can be set to point the `jar` utility at a manifest
|
||||
file to use in a .jar archive. If unset, one will be automatically
|
||||
created by the `jar` utility. This path should be relative to the
|
||||
root of the package directory (this.packageDir above, likely 'pkg')
|
||||
*/
|
||||
this.manifestFile = null;
|
||||
/**
|
||||
@name jake.PackageTask#tarCommand
|
||||
@public
|
||||
@type {String='tar'}
|
||||
@description The shell-command to use for creating tar archives.
|
||||
*/
|
||||
this.tarCommand = 'tar';
|
||||
/**
|
||||
@name jake.PackageTask#jarCommand
|
||||
@public
|
||||
@type {String='jar'}
|
||||
@description The shell-command to use for creating jar archives.
|
||||
*/
|
||||
this.jarCommand = 'jar';
|
||||
/**
|
||||
@name jake.PackageTask#zipCommand
|
||||
@public
|
||||
@type {String='zip'}
|
||||
@description The shell-command to use for creating zip archives.
|
||||
*/
|
||||
this.zipCommand = 'zip';
|
||||
/**
|
||||
@name jake.PackageTask#archiveNoBaseDir
|
||||
@public
|
||||
@type {Boolean=false}
|
||||
@description Simple option for performing the archive on the
|
||||
contents of the directory instead of the directory itself
|
||||
*/
|
||||
this.archiveNoBaseDir = false;
|
||||
/**
|
||||
@name jake.PackageTask#archiveChangeDir
|
||||
@public
|
||||
@type {String=null}
|
||||
@description Equivalent to the '-C' command for the `tar` and `jar`
|
||||
commands. ("Change to this directory before adding files.")
|
||||
*/
|
||||
this.archiveChangeDir = null;
|
||||
/**
|
||||
@name jake.PackageTask#archiveContentDir
|
||||
@public
|
||||
@type {String=null}
|
||||
@description Specifies the files and directories to include in the
|
||||
package-archive. If unset, this will default to the main package
|
||||
directory -- i.e., name + version.
|
||||
*/
|
||||
this.archiveContentDir = null;
|
||||
|
||||
if (typeof definition == 'function') {
|
||||
definition.call(this);
|
||||
}
|
||||
this.define();
|
||||
};
|
||||
|
||||
PackageTask.prototype = new (function () {
|
||||
|
||||
let _compressOpts = {
|
||||
Tar: {
|
||||
ext: '.tgz',
|
||||
flags: 'czf',
|
||||
cmd: 'tar'
|
||||
},
|
||||
TarGz: {
|
||||
ext: '.tar.gz',
|
||||
flags: 'czf',
|
||||
cmd: 'tar'
|
||||
},
|
||||
TarBz2: {
|
||||
ext: '.tar.bz2',
|
||||
flags: 'cjf',
|
||||
cmd: 'tar'
|
||||
},
|
||||
Jar: {
|
||||
ext: '.jar',
|
||||
flags: 'cf',
|
||||
cmd: 'jar'
|
||||
},
|
||||
Zip: {
|
||||
ext: '.zip',
|
||||
flags: 'qr',
|
||||
cmd: 'zip'
|
||||
}
|
||||
};
|
||||
|
||||
this.define = function () {
|
||||
let self = this;
|
||||
let packageDirPath = this.packageDirPath();
|
||||
let compressTaskArr = [];
|
||||
|
||||
desc('Build the package for distribution');
|
||||
task('package', self.prereqs.concat(['clobberPackage', 'buildPackage']));
|
||||
// Backward-compat alias
|
||||
task('repackage', ['package']);
|
||||
|
||||
task('clobberPackage', function () {
|
||||
jake.rmRf(self.packageDir, {silent: true});
|
||||
});
|
||||
|
||||
desc('Remove the package');
|
||||
task('clobber', ['clobberPackage']);
|
||||
|
||||
let doCommand = function (p) {
|
||||
let filename = path.resolve(self.packageDir + '/' + self.packageName() +
|
||||
_compressOpts[p].ext);
|
||||
if (process.platform == 'win32') {
|
||||
// Windows full path may have drive letter, which is going to cause
|
||||
// namespace problems, so strip it.
|
||||
if (filename.length > 2 && filename[1] == ':') {
|
||||
filename = filename.substr(2);
|
||||
}
|
||||
}
|
||||
compressTaskArr.push(filename);
|
||||
|
||||
file(filename, [packageDirPath], function () {
|
||||
let cmd;
|
||||
let opts = _compressOpts[p];
|
||||
// Directory to move to when doing the compression-task
|
||||
// Changes in the case of zip for emulating -C option
|
||||
let chdir = self.packageDir;
|
||||
// Save the current dir so it's possible to pop back up
|
||||
// after compressing
|
||||
let currDir = process.cwd();
|
||||
let archiveChangeDir;
|
||||
let archiveContentDir;
|
||||
|
||||
if (self.archiveNoBaseDir) {
|
||||
archiveChangeDir = self.packageName();
|
||||
archiveContentDir = '.';
|
||||
}
|
||||
else {
|
||||
archiveChangeDir = self.archiveChangeDir;
|
||||
archiveContentDir = self.archiveContentDir;
|
||||
}
|
||||
|
||||
cmd = self[opts.cmd + 'Command'];
|
||||
cmd += ' -' + opts.flags;
|
||||
if (opts.cmd == 'jar' && self.manifestFile) {
|
||||
cmd += 'm';
|
||||
}
|
||||
|
||||
// The name of the archive to create -- use full path
|
||||
// so compression can be performed from a different dir
|
||||
// if needed
|
||||
cmd += ' ' + filename;
|
||||
|
||||
if (opts.cmd == 'jar' && self.manifestFile) {
|
||||
cmd += ' ' + self.manifestFile;
|
||||
}
|
||||
|
||||
// Where to perform the compression -- -C option isn't
|
||||
// supported in zip, so actually do process.chdir for this
|
||||
if (archiveChangeDir) {
|
||||
if (opts.cmd == 'zip') {
|
||||
chdir = path.join(chdir, archiveChangeDir);
|
||||
}
|
||||
else {
|
||||
cmd += ' -C ' + archiveChangeDir;
|
||||
}
|
||||
}
|
||||
|
||||
// Where to get the archive content
|
||||
if (archiveContentDir) {
|
||||
cmd += ' ' + archiveContentDir;
|
||||
}
|
||||
else {
|
||||
cmd += ' ' + self.packageName();
|
||||
}
|
||||
|
||||
// Move into the desired dir (usually packageDir) to compress
|
||||
// Return back up to the current dir after the exec
|
||||
process.chdir(chdir);
|
||||
|
||||
exec(cmd, function (err, stdout, stderr) {
|
||||
if (err) { throw err; }
|
||||
|
||||
// Return back up to the starting directory (see above,
|
||||
// before exec)
|
||||
process.chdir(currDir);
|
||||
|
||||
complete();
|
||||
});
|
||||
}, {async: true});
|
||||
};
|
||||
|
||||
for (let p in _compressOpts) {
|
||||
if (this['need' + p]) {
|
||||
doCommand(p);
|
||||
}
|
||||
}
|
||||
|
||||
task('buildPackage', compressTaskArr, function () {});
|
||||
|
||||
directory(this.packageDir);
|
||||
|
||||
file(packageDirPath, this.packageFiles, function () {
|
||||
jake.mkdirP(packageDirPath);
|
||||
let fileList = [];
|
||||
self.packageFiles.forEach(function (name) {
|
||||
let f = path.join(self.packageDirPath(), name);
|
||||
let fDir = path.dirname(f);
|
||||
jake.mkdirP(fDir, {silent: true});
|
||||
|
||||
// Add both files and directories
|
||||
fileList.push({
|
||||
from: name,
|
||||
to: f
|
||||
});
|
||||
});
|
||||
let _copyFile = function () {
|
||||
let file = fileList.pop();
|
||||
let stat;
|
||||
if (file) {
|
||||
stat = fs.statSync(file.from);
|
||||
// Target is a directory, just create it
|
||||
if (stat.isDirectory()) {
|
||||
jake.mkdirP(file.to, {silent: true});
|
||||
_copyFile();
|
||||
}
|
||||
// Otherwise copy the file
|
||||
else {
|
||||
jake.cpR(file.from, file.to, {silent: true});
|
||||
_copyFile();
|
||||
}
|
||||
}
|
||||
else {
|
||||
complete();
|
||||
}
|
||||
};
|
||||
_copyFile();
|
||||
}, {async: true});
|
||||
|
||||
|
||||
};
|
||||
|
||||
this.packageName = function () {
|
||||
if (this.version) {
|
||||
return this.name + '-' + this.version;
|
||||
}
|
||||
else {
|
||||
return this.name;
|
||||
}
|
||||
};
|
||||
|
||||
this.packageDirPath = function () {
|
||||
return this.packageDir + '/' + this.packageName();
|
||||
};
|
||||
|
||||
})();
|
||||
|
||||
jake.PackageTask = PackageTask;
|
||||
exports.PackageTask = PackageTask;
|
||||
|
||||
134
32/node_modules/jake/lib/parseargs.js
generated
vendored
Normal file
134
32/node_modules/jake/lib/parseargs.js
generated
vendored
Normal file
@@ -0,0 +1,134 @@
|
||||
/*
|
||||
* Jake JavaScript build tool
|
||||
* Copyright 2112 Matthew Eernisse (mde@fleegix.org)
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*
|
||||
*/
|
||||
|
||||
let parseargs = {};
|
||||
let isOpt = function (arg) { return arg.indexOf('-') === 0; };
|
||||
let removeOptPrefix = function (opt) { return opt.replace(/^--/, '').replace(/^-/, ''); };
|
||||
|
||||
/**
|
||||
* @constructor
|
||||
* Parses a list of command-line args into a key/value object of
|
||||
* options and an array of positional commands.
|
||||
* @ param {Array} opts A list of options in the following format:
|
||||
* [{full: 'foo', abbr: 'f'}, {full: 'bar', abbr: 'b'}]]
|
||||
*/
|
||||
parseargs.Parser = function (opts) {
|
||||
// A key/value object of matching options parsed out of the args
|
||||
this.opts = {};
|
||||
this.taskNames = null;
|
||||
this.envVars = null;
|
||||
|
||||
// Data structures used for parsing
|
||||
this.reg = opts;
|
||||
this.shortOpts = {};
|
||||
this.longOpts = {};
|
||||
|
||||
let self = this;
|
||||
[].forEach.call(opts, function (item) {
|
||||
self.shortOpts[item.abbr] = item;
|
||||
self.longOpts[item.full] = item;
|
||||
});
|
||||
};
|
||||
|
||||
parseargs.Parser.prototype = new function () {
|
||||
|
||||
let _trueOrNextVal = function (argParts, args) {
|
||||
if (argParts[1]) {
|
||||
return argParts[1];
|
||||
}
|
||||
else {
|
||||
return (!args[0] || isOpt(args[0])) ?
|
||||
true : args.shift();
|
||||
}
|
||||
};
|
||||
|
||||
/**
|
||||
* Parses an array of arguments into options and positional commands
|
||||
* @param {Array} args The command-line args to parse
|
||||
*/
|
||||
this.parse = function (args) {
|
||||
let cmds = [];
|
||||
let cmd;
|
||||
let envVars = {};
|
||||
let opts = {};
|
||||
let arg;
|
||||
let argItem;
|
||||
let argParts;
|
||||
let cmdItems;
|
||||
let taskNames = [];
|
||||
let preempt;
|
||||
|
||||
while (args.length) {
|
||||
arg = args.shift();
|
||||
|
||||
if (isOpt(arg)) {
|
||||
arg = removeOptPrefix(arg);
|
||||
argParts = arg.split('=');
|
||||
argItem = this.longOpts[argParts[0]] || this.shortOpts[argParts[0]];
|
||||
if (argItem) {
|
||||
// First-encountered preemptive opt takes precedence -- no further opts
|
||||
// or possibility of ambiguity, so just look for a value, or set to
|
||||
// true and then bail
|
||||
if (argItem.preempts) {
|
||||
opts[argItem.full] = _trueOrNextVal(argParts, args);
|
||||
preempt = true;
|
||||
break;
|
||||
}
|
||||
// If the opt requires a value, see if we can get a value from the
|
||||
// next arg, or infer true from no-arg -- if it's followed by another
|
||||
// opt, throw an error
|
||||
if (argItem.expectValue || argItem.allowValue) {
|
||||
opts[argItem.full] = _trueOrNextVal(argParts, args);
|
||||
if (argItem.expectValue && !opts[argItem.full]) {
|
||||
throw new Error(argItem.full + ' option expects a value.');
|
||||
}
|
||||
}
|
||||
else {
|
||||
opts[argItem.full] = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
else {
|
||||
cmds.unshift(arg);
|
||||
}
|
||||
}
|
||||
|
||||
if (!preempt) {
|
||||
// Parse out any env-vars and task-name
|
||||
while ((cmd = cmds.pop())) {
|
||||
cmdItems = cmd.split('=');
|
||||
if (cmdItems.length > 1) {
|
||||
envVars[cmdItems[0]] = cmdItems[1];
|
||||
}
|
||||
else {
|
||||
taskNames.push(cmd);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
return {
|
||||
opts: opts,
|
||||
envVars: envVars,
|
||||
taskNames: taskNames
|
||||
};
|
||||
};
|
||||
|
||||
};
|
||||
|
||||
module.exports = parseargs;
|
||||
282
32/node_modules/jake/lib/program.js
generated
vendored
Normal file
282
32/node_modules/jake/lib/program.js
generated
vendored
Normal file
@@ -0,0 +1,282 @@
|
||||
/*
|
||||
* Jake JavaScript build tool
|
||||
* Copyright 2112 Matthew Eernisse (mde@fleegix.org)
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*
|
||||
*/
|
||||
|
||||
let fs = require('fs');
|
||||
let parseargs = require('./parseargs');
|
||||
let utils = require('./utils');
|
||||
let Program;
|
||||
let usage = require('fs').readFileSync(`${__dirname}/../usage.txt`).toString();
|
||||
let { Task } = require('./task/task');
|
||||
|
||||
function die(msg) {
|
||||
console.log(msg);
|
||||
process.stdout.write('', function () {
|
||||
process.stderr.write('', function () {
|
||||
process.exit();
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
let preempts = {
|
||||
version: function () {
|
||||
die(jake.version);
|
||||
},
|
||||
help: function () {
|
||||
die(usage);
|
||||
}
|
||||
};
|
||||
|
||||
let AVAILABLE_OPTS = [
|
||||
{ full: 'jakefile',
|
||||
abbr: 'f',
|
||||
expectValue: true
|
||||
},
|
||||
{ full: 'quiet',
|
||||
abbr: 'q',
|
||||
expectValue: false
|
||||
},
|
||||
{ full: 'directory',
|
||||
abbr: 'C',
|
||||
expectValue: true
|
||||
},
|
||||
{ full: 'always-make',
|
||||
abbr: 'B',
|
||||
expectValue: false
|
||||
},
|
||||
{ full: 'tasks',
|
||||
abbr: 'T',
|
||||
expectValue: false,
|
||||
allowValue: true
|
||||
},
|
||||
// Alias t
|
||||
{ full: 'tasks',
|
||||
abbr: 't',
|
||||
expectValue: false,
|
||||
allowValue: true
|
||||
},
|
||||
// Alias ls
|
||||
{ full: 'tasks',
|
||||
abbr: 'ls',
|
||||
expectValue: false,
|
||||
allowValue: true
|
||||
},
|
||||
{ full: 'help',
|
||||
abbr: 'h',
|
||||
},
|
||||
{ full: 'version',
|
||||
abbr: 'V',
|
||||
},
|
||||
// Alias lowercase v
|
||||
{ full: 'version',
|
||||
abbr: 'v',
|
||||
},
|
||||
{ full: 'jakelibdir',
|
||||
abbr: 'J',
|
||||
expectValue: true
|
||||
},
|
||||
{ full: 'allow-rejection',
|
||||
abbr: 'ar',
|
||||
expectValue: false
|
||||
}
|
||||
];
|
||||
|
||||
Program = function () {
|
||||
this.availableOpts = AVAILABLE_OPTS;
|
||||
this.opts = {};
|
||||
this.taskNames = null;
|
||||
this.taskArgs = null;
|
||||
this.envVars = null;
|
||||
this.die = die;
|
||||
};
|
||||
|
||||
Program.prototype = new (function () {
|
||||
|
||||
this.handleErr = function (err) {
|
||||
if (jake.listeners('error').length !== 0) {
|
||||
jake.emit('error', err);
|
||||
return;
|
||||
}
|
||||
|
||||
if (jake.listeners('error').length) {
|
||||
jake.emit('error', err);
|
||||
return;
|
||||
}
|
||||
|
||||
utils.logger.error('jake aborted.');
|
||||
if (err.stack) {
|
||||
utils.logger.error(err.stack);
|
||||
}
|
||||
else {
|
||||
utils.logger.error(err.message);
|
||||
}
|
||||
|
||||
process.stdout.write('', function () {
|
||||
process.stderr.write('', function () {
|
||||
jake.errorCode = jake.errorCode || 1;
|
||||
process.exit(jake.errorCode);
|
||||
});
|
||||
});
|
||||
};
|
||||
|
||||
this.parseArgs = function (args) {
|
||||
let result = (new parseargs.Parser(this.availableOpts)).parse(args);
|
||||
this.setOpts(result.opts);
|
||||
this.setTaskNames(result.taskNames);
|
||||
this.setEnvVars(result.envVars);
|
||||
};
|
||||
|
||||
this.setOpts = function (options) {
|
||||
let opts = options || {};
|
||||
Object.assign(this.opts, opts);
|
||||
};
|
||||
|
||||
this.internalOpts = function (options) {
|
||||
this.availableOpts = this.availableOpts.concat(options);
|
||||
};
|
||||
|
||||
this.autocompletions = function (cur) {
|
||||
let p; let i; let task;
|
||||
let commonPrefix = '';
|
||||
let matches = [];
|
||||
|
||||
for (p in jake.Task) {
|
||||
task = jake.Task[p];
|
||||
if (
|
||||
'fullName' in task
|
||||
&& (
|
||||
// if empty string, program converts to true
|
||||
cur === true ||
|
||||
task.fullName.indexOf(cur) === 0
|
||||
)
|
||||
) {
|
||||
if (matches.length === 0) {
|
||||
commonPrefix = task.fullName;
|
||||
}
|
||||
else {
|
||||
for (i = commonPrefix.length; i > -1; --i) {
|
||||
commonPrefix = commonPrefix.substr(0, i);
|
||||
if (task.fullName.indexOf(commonPrefix) === 0) {
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
matches.push(task.fullName);
|
||||
}
|
||||
}
|
||||
|
||||
if (matches.length > 1 && commonPrefix === cur) {
|
||||
matches.unshift('yes-space');
|
||||
}
|
||||
else {
|
||||
matches.unshift('no-space');
|
||||
}
|
||||
|
||||
process.stdout.write(matches.join(' '));
|
||||
};
|
||||
|
||||
this.setTaskNames = function (names) {
|
||||
if (names && !Array.isArray(names)) {
|
||||
throw new Error('Task names must be an array');
|
||||
}
|
||||
this.taskNames = (names && names.length) ? names : ['default'];
|
||||
};
|
||||
|
||||
this.setEnvVars = function (vars) {
|
||||
this.envVars = vars || null;
|
||||
};
|
||||
|
||||
this.firstPreemptiveOption = function () {
|
||||
let opts = this.opts;
|
||||
for (let p in opts) {
|
||||
if (preempts[p]) {
|
||||
return preempts[p];
|
||||
}
|
||||
}
|
||||
return false;
|
||||
};
|
||||
|
||||
this.init = function (configuration) {
|
||||
let self = this;
|
||||
let config = configuration || {};
|
||||
if (config.options) {
|
||||
this.setOpts(config.options);
|
||||
}
|
||||
if (config.taskNames) {
|
||||
this.setTaskNames(config.taskNames);
|
||||
}
|
||||
if (config.envVars) {
|
||||
this.setEnvVars(config.envVars);
|
||||
}
|
||||
process.addListener('uncaughtException', function (err) {
|
||||
self.handleErr(err);
|
||||
});
|
||||
if (!this.opts['allow-rejection']) {
|
||||
process.addListener('unhandledRejection', (reason, promise) => {
|
||||
utils.logger.error('Unhandled rejection at:', promise, 'reason:', reason);
|
||||
self.handleErr(reason);
|
||||
});
|
||||
}
|
||||
if (this.envVars) {
|
||||
Object.assign(process.env, this.envVars);
|
||||
}
|
||||
};
|
||||
|
||||
this.run = function () {
|
||||
let rootTask;
|
||||
let taskNames;
|
||||
let dirname;
|
||||
let opts = this.opts;
|
||||
|
||||
if (opts.autocomplete) {
|
||||
return this.autocompletions(opts['autocomplete-cur'], opts['autocomplete-prev']);
|
||||
}
|
||||
// Run with `jake -T`, just show descriptions
|
||||
if (opts.tasks) {
|
||||
return jake.showAllTaskDescriptions(opts.tasks);
|
||||
}
|
||||
|
||||
taskNames = this.taskNames;
|
||||
if (!(Array.isArray(taskNames) && taskNames.length)) {
|
||||
throw new Error('Please pass jake.runTasks an array of task-names');
|
||||
}
|
||||
|
||||
// Set working dir
|
||||
dirname = opts.directory;
|
||||
if (dirname) {
|
||||
if (fs.existsSync(dirname) &&
|
||||
fs.statSync(dirname).isDirectory()) {
|
||||
process.chdir(dirname);
|
||||
}
|
||||
else {
|
||||
throw new Error(dirname + ' is not a valid directory path');
|
||||
}
|
||||
}
|
||||
|
||||
rootTask = task(Task.ROOT_TASK_NAME, taskNames, function () {});
|
||||
rootTask._internal = true;
|
||||
|
||||
rootTask.once('complete', function () {
|
||||
jake.emit('complete');
|
||||
});
|
||||
jake.emit('start');
|
||||
rootTask.invoke();
|
||||
};
|
||||
|
||||
})();
|
||||
|
||||
module.exports.Program = Program;
|
||||
290
32/node_modules/jake/lib/publish_task.js
generated
vendored
Normal file
290
32/node_modules/jake/lib/publish_task.js
generated
vendored
Normal file
@@ -0,0 +1,290 @@
|
||||
/*
|
||||
* Jake JavaScript build tool
|
||||
* Copyright 2112 Matthew Eernisse (mde@fleegix.org)
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*
|
||||
*/
|
||||
|
||||
let fs = require('fs');
|
||||
let path = require('path');
|
||||
let exec = require('child_process').execSync;
|
||||
let FileList = require('filelist').FileList;
|
||||
|
||||
let PublishTask = function () {
|
||||
let args = Array.prototype.slice.call(arguments).filter(function (item) {
|
||||
return typeof item != 'undefined';
|
||||
});
|
||||
let arg;
|
||||
let opts = {};
|
||||
let definition;
|
||||
let prereqs = [];
|
||||
let createDef = function (arg) {
|
||||
return function () {
|
||||
this.packageFiles.include(arg);
|
||||
};
|
||||
};
|
||||
|
||||
this.name = args.shift();
|
||||
|
||||
// Old API, just name + list of files
|
||||
if (args.length == 1 && (Array.isArray(args[0]) || typeof args[0] == 'string')) {
|
||||
definition = createDef(args.pop());
|
||||
}
|
||||
// Current API, name + [prereqs] + [opts] + definition
|
||||
else {
|
||||
while ((arg = args.pop())) {
|
||||
// Definition func
|
||||
if (typeof arg == 'function') {
|
||||
definition = arg;
|
||||
}
|
||||
// Prereqs
|
||||
else if (Array.isArray(arg) || typeof arg == 'string') {
|
||||
prereqs = arg;
|
||||
}
|
||||
// Opts
|
||||
else {
|
||||
opts = arg;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
this.prereqs = prereqs;
|
||||
this.packageFiles = new FileList();
|
||||
this.publishCmd = opts.publishCmd || 'npm publish %filename';
|
||||
this.publishMessage = opts.publishMessage || 'BOOM! Published.';
|
||||
this.gitCmd = opts.gitCmd || 'git';
|
||||
this.versionFiles = opts.versionFiles || ['package.json'];
|
||||
this.scheduleDelay = 5000;
|
||||
|
||||
// Override utility funcs for testing
|
||||
this._ensureRepoClean = function (stdout) {
|
||||
if (stdout.length) {
|
||||
fail(new Error('Git repository is not clean.'));
|
||||
}
|
||||
};
|
||||
this._getCurrentBranch = function (stdout) {
|
||||
return String(stdout).trim();
|
||||
};
|
||||
|
||||
if (typeof definition == 'function') {
|
||||
definition.call(this);
|
||||
}
|
||||
this.define();
|
||||
};
|
||||
|
||||
|
||||
PublishTask.prototype = new (function () {
|
||||
|
||||
let _currentBranch = null;
|
||||
|
||||
let getPackage = function () {
|
||||
let pkg = JSON.parse(fs.readFileSync(path.join(process.cwd(),
|
||||
'/package.json')).toString());
|
||||
return pkg;
|
||||
};
|
||||
let getPackageVersionNumber = function () {
|
||||
return getPackage().version;
|
||||
};
|
||||
|
||||
this.define = function () {
|
||||
let self = this;
|
||||
|
||||
namespace('publish', function () {
|
||||
task('fetchTags', function () {
|
||||
// Make sure local tags are up to date
|
||||
exec(self.gitCmd + ' fetch --tags');
|
||||
console.log('Fetched remote tags.');
|
||||
});
|
||||
|
||||
task('getCurrentBranch', function () {
|
||||
// Figure out what branch to push to
|
||||
let stdout = exec(self.gitCmd + ' symbolic-ref --short HEAD').toString();
|
||||
if (!stdout) {
|
||||
throw new Error('No current Git branch found');
|
||||
}
|
||||
_currentBranch = self._getCurrentBranch(stdout);
|
||||
console.log('On branch ' + _currentBranch);
|
||||
});
|
||||
|
||||
task('ensureClean', function () {
|
||||
// Only bump, push, and tag if the Git repo is clean
|
||||
let stdout = exec(self.gitCmd + ' status --porcelain --untracked-files=no').toString();
|
||||
// Throw if there's output
|
||||
self._ensureRepoClean(stdout);
|
||||
});
|
||||
|
||||
task('updateVersionFiles', function () {
|
||||
let pkg;
|
||||
let version;
|
||||
let arr;
|
||||
let patch;
|
||||
|
||||
// Grab the current version-string
|
||||
pkg = getPackage();
|
||||
version = pkg.version;
|
||||
// Increment the patch-number for the version
|
||||
arr = version.split('.');
|
||||
patch = parseInt(arr.pop(), 10) + 1;
|
||||
arr.push(patch);
|
||||
version = arr.join('.');
|
||||
|
||||
// Update package.json or other files with the new version-info
|
||||
self.versionFiles.forEach(function (file) {
|
||||
let p = path.join(process.cwd(), file);
|
||||
let data = JSON.parse(fs.readFileSync(p).toString());
|
||||
data.version = version;
|
||||
fs.writeFileSync(p, JSON.stringify(data, true, 2) + '\n');
|
||||
});
|
||||
// Return the version string so that listeners for the 'complete' event
|
||||
// for this task can use it (e.g., to update other files before pushing
|
||||
// to Git)
|
||||
return version;
|
||||
});
|
||||
|
||||
task('pushVersion', ['ensureClean', 'updateVersionFiles'], function () {
|
||||
let version = getPackageVersionNumber();
|
||||
let message = 'Version ' + version;
|
||||
let cmds = [
|
||||
self.gitCmd + ' commit -a -m "' + message + '"',
|
||||
self.gitCmd + ' push origin ' + _currentBranch,
|
||||
self.gitCmd + ' tag -a v' + version + ' -m "' + message + '"',
|
||||
self.gitCmd + ' push --tags'
|
||||
];
|
||||
cmds.forEach((cmd) => {
|
||||
exec(cmd);
|
||||
});
|
||||
version = getPackageVersionNumber();
|
||||
console.log('Bumped version number to v' + version + '.');
|
||||
});
|
||||
|
||||
let defineTask = task('definePackage', function () {
|
||||
let version = getPackageVersionNumber();
|
||||
new jake.PackageTask(self.name, 'v' + version, self.prereqs, function () {
|
||||
// Replace the PackageTask's FileList with the PublishTask's FileList
|
||||
this.packageFiles = self.packageFiles;
|
||||
this.needTarGz = true; // Default to tar.gz
|
||||
// If any of the need<CompressionFormat> or archive opts are set
|
||||
// proxy them to the PackageTask
|
||||
for (let p in this) {
|
||||
if (p.indexOf('need') === 0 || p.indexOf('archive') === 0) {
|
||||
if (typeof self[p] != 'undefined') {
|
||||
this[p] = self[p];
|
||||
}
|
||||
}
|
||||
}
|
||||
});
|
||||
});
|
||||
defineTask._internal = true;
|
||||
|
||||
task('package', function () {
|
||||
let definePack = jake.Task['publish:definePackage'];
|
||||
let pack = jake.Task['package'];
|
||||
let version = getPackageVersionNumber();
|
||||
|
||||
// May have already been run
|
||||
if (definePack.taskStatus == jake.Task.runStatuses.DONE) {
|
||||
definePack.reenable(true);
|
||||
}
|
||||
definePack.execute();
|
||||
definePack.on('complete', function () {
|
||||
pack.invoke();
|
||||
console.log('Created package for ' + self.name + ' v' + version);
|
||||
});
|
||||
});
|
||||
|
||||
task('publish', function () {
|
||||
return new Promise((resolve) => {
|
||||
let version = getPackageVersionNumber();
|
||||
let filename;
|
||||
let cmd;
|
||||
|
||||
console.log('Publishing ' + self.name + ' v' + version);
|
||||
|
||||
if (typeof self.createPublishCommand == 'function') {
|
||||
cmd = self.createPublishCommand(version);
|
||||
}
|
||||
else {
|
||||
filename = './pkg/' + self.name + '-v' + version + '.tar.gz';
|
||||
cmd = self.publishCmd.replace(/%filename/gi, filename);
|
||||
}
|
||||
|
||||
if (typeof cmd == 'function') {
|
||||
cmd(function (err) {
|
||||
if (err) {
|
||||
throw err;
|
||||
}
|
||||
console.log(self.publishMessage);
|
||||
resolve();
|
||||
});
|
||||
}
|
||||
else {
|
||||
// Hackity hack -- NPM publish sometimes returns errror like:
|
||||
// Error sending version data\nnpm ERR!
|
||||
// Error: forbidden 0.2.4 is modified, should match modified time
|
||||
setTimeout(function () {
|
||||
let stdout = exec(cmd).toString() || '';
|
||||
stdout = stdout.trim();
|
||||
if (stdout) {
|
||||
console.log(stdout);
|
||||
}
|
||||
console.log(self.publishMessage);
|
||||
resolve();
|
||||
}, self.scheduleDelay);
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||
task('cleanup', function () {
|
||||
return new Promise((resolve) => {
|
||||
let clobber = jake.Task.clobber;
|
||||
clobber.reenable(true);
|
||||
clobber.on('complete', function () {
|
||||
console.log('Cleaned up package');
|
||||
resolve();
|
||||
});
|
||||
clobber.invoke();
|
||||
});
|
||||
});
|
||||
|
||||
});
|
||||
|
||||
let prefixNs = function (item) {
|
||||
return 'publish:' + item;
|
||||
};
|
||||
|
||||
// Create aliases in the default namespace
|
||||
desc('Create a new version and release.');
|
||||
task('publish', self.prereqs.concat(['version', 'release']
|
||||
.map(prefixNs)));
|
||||
|
||||
desc('Release the existing version.');
|
||||
task('publishExisting', self.prereqs.concat(['release']
|
||||
.map(prefixNs)));
|
||||
|
||||
task('version', ['fetchTags', 'getCurrentBranch', 'pushVersion']
|
||||
.map(prefixNs));
|
||||
|
||||
task('release', ['package', 'publish', 'cleanup']
|
||||
.map(prefixNs));
|
||||
|
||||
// Invoke proactively so there will be a callable 'package' task
|
||||
// which can be used apart from 'publish'
|
||||
jake.Task['publish:definePackage'].invoke();
|
||||
};
|
||||
|
||||
})();
|
||||
|
||||
jake.PublishTask = PublishTask;
|
||||
exports.PublishTask = PublishTask;
|
||||
|
||||
311
32/node_modules/jake/lib/rule.js
generated
vendored
Normal file
311
32/node_modules/jake/lib/rule.js
generated
vendored
Normal file
@@ -0,0 +1,311 @@
|
||||
let path = require('path');
|
||||
let fs = require('fs');
|
||||
let Task = require('./task/task').Task;
|
||||
|
||||
// Split a task to two parts, name space and task name.
|
||||
// For example, given 'foo:bin/a%.c', return an object with
|
||||
// - 'ns' : foo
|
||||
// - 'name' : bin/a%.c
|
||||
function splitNs(task) {
|
||||
let parts = task.split(':');
|
||||
let name = parts.pop();
|
||||
let ns = resolveNs(parts);
|
||||
return {
|
||||
'name' : name,
|
||||
'ns' : ns
|
||||
};
|
||||
}
|
||||
|
||||
// Return the namespace based on an array of names.
|
||||
// For example, given ['foo', 'baz' ], return the namespace
|
||||
//
|
||||
// default -> foo -> baz
|
||||
//
|
||||
// where default is the global root namespace
|
||||
// and -> means child namespace.
|
||||
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;
|
||||
}
|
||||
|
||||
// Given a pattern p, say 'foo:bin/a%.c'
|
||||
// Return an object with
|
||||
// - 'ns' : foo
|
||||
// - 'dir' : bin
|
||||
// - 'prefix' : a
|
||||
// - 'suffix' : .c
|
||||
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]
|
||||
};
|
||||
}
|
||||
|
||||
// Test whether string a is a suffix of string b
|
||||
function stringEndWith(a, b) {
|
||||
let l;
|
||||
return (l = b.lastIndexOf(a)) == -1 ? false : l + a.length == b.length;
|
||||
}
|
||||
|
||||
// Replace the suffix a of the string s with b.
|
||||
// Note that, it is assumed a is a suffix of s.
|
||||
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;
|
||||
}
|
||||
|
||||
// Create a file task based on this rule for the specified
|
||||
// task-name
|
||||
// ======
|
||||
// FIXME: Right now this just throws away any passed-in args
|
||||
// for the synthsized task (taskArgs param)
|
||||
// ======
|
||||
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);
|
||||
}
|
||||
|
||||
// TODO: Write a utility function that appends a
|
||||
// taskname to a namespace path
|
||||
src = nsPath.split(':').filter(function (item) {
|
||||
return !!item;
|
||||
}).concat(src).join(':');
|
||||
|
||||
// Generate the prerequisite for the matching task.
|
||||
// It is the original prerequisites plus the prerequisite
|
||||
// representing source file, i.e.,
|
||||
//
|
||||
// rule( '%.o', '%.c', ['some.h'] ...
|
||||
//
|
||||
// If the objective is main.o, then new task should be
|
||||
//
|
||||
// file( 'main.o', ['main.c', 'some.h' ] ...
|
||||
prereqs = this.prereqs.slice(); // Get a copy to work with
|
||||
prereqs.unshift(src);
|
||||
|
||||
// Prereq should be:
|
||||
// 1. an existing task
|
||||
// 2. an existing file on disk
|
||||
// 3. a valid rule (i.e., not at too deep a level)
|
||||
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 any of the prereqs aren't valid, the rule isn't valid
|
||||
if (!valid) {
|
||||
return null;
|
||||
}
|
||||
// Otherwise, hunky-dory, finish creating the task for the rule
|
||||
else {
|
||||
// Create the action for the task
|
||||
action = function () {
|
||||
let task = this;
|
||||
self.action.apply(task);
|
||||
};
|
||||
|
||||
opts = this.opts;
|
||||
|
||||
// Insert the file task into Jake
|
||||
//
|
||||
// Since createTask function stores the task as a child task
|
||||
// of currentNamespace. Here we temporariliy switch the namespace.
|
||||
// FIXME: Should allow optional ns passed in instead of this hack
|
||||
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);
|
||||
}
|
||||
|
||||
// Test wether the a prerequisite matchs the pattern.
|
||||
// The arg 'pattern' does not have namespace as prefix.
|
||||
// For example, the following tests are true
|
||||
//
|
||||
// pattern | name
|
||||
// bin/%.o | bin/main.o
|
||||
// bin/%.o | foo:bin/main.o
|
||||
//
|
||||
// The following tests are false (trivally)
|
||||
//
|
||||
// pattern | name
|
||||
// bin/%.o | foobin/main.o
|
||||
// bin/%.o | bin/main.oo
|
||||
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) {
|
||||
// No Pattern. No Folder. No Namespace.
|
||||
// A Simple Suffix Rule. Just test suffix
|
||||
return stringEndWith(pattern, name);
|
||||
}
|
||||
else {
|
||||
// Resolve the dir, prefix and suffix of pattern
|
||||
p = resolve(pattern);
|
||||
|
||||
// Resolve the namespace and task-name
|
||||
task = splitNs(name);
|
||||
name = task.name;
|
||||
|
||||
// Set the objective as the task-name
|
||||
obj = name;
|
||||
|
||||
// Namespace is already matched.
|
||||
|
||||
// Check dir
|
||||
if (path.dirname(obj) != p.dir) {
|
||||
return false;
|
||||
}
|
||||
|
||||
filename = path.basename(obj);
|
||||
|
||||
// Check file name length
|
||||
if ((p.prefix.length + p.suffix.length + 1) > filename.length) {
|
||||
// Length does not match.
|
||||
return false;
|
||||
}
|
||||
|
||||
// Check prefix
|
||||
if (filename.indexOf(p.prefix) !== 0) {
|
||||
return false;
|
||||
}
|
||||
|
||||
// Check suffix
|
||||
if (!stringEndWith(p.suffix, filename)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
// OK. Find a match.
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
// Generate the source based on
|
||||
// - name name for the synthesized task
|
||||
// - pattern pattern for the objective
|
||||
// - source pattern for the source
|
||||
//
|
||||
// Return the source with properties
|
||||
// - dep the prerequisite of source
|
||||
// (with the namespace)
|
||||
//
|
||||
// - file the file name of source
|
||||
// (without the namespace)
|
||||
//
|
||||
// For example, given
|
||||
//
|
||||
// - name foo:bin/main.o
|
||||
// - pattern bin/%.o
|
||||
// - source src/%.c
|
||||
//
|
||||
// return 'foo:src/main.c',
|
||||
//
|
||||
static getSource(name, pattern, source) {
|
||||
let dep;
|
||||
let pat;
|
||||
let match;
|
||||
let file;
|
||||
let src;
|
||||
|
||||
// Regex pattern -- use to look up the extension
|
||||
if (pattern instanceof RegExp) {
|
||||
match = pattern.exec(name);
|
||||
if (match) {
|
||||
if (typeof source == 'function') {
|
||||
src = source(name);
|
||||
}
|
||||
else {
|
||||
src = stringReplaceSuffix(name, match[0], source);
|
||||
}
|
||||
}
|
||||
}
|
||||
// Assume string
|
||||
else {
|
||||
// Simple string suffix replacement
|
||||
if (pattern.indexOf('%') == -1) {
|
||||
if (typeof source == 'function') {
|
||||
src = source(name);
|
||||
}
|
||||
else {
|
||||
src = stringReplaceSuffix(name, pattern, source);
|
||||
}
|
||||
}
|
||||
// Percent-based substitution
|
||||
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;
|
||||
30
32/node_modules/jake/lib/task/directory_task.js
generated
vendored
Normal file
30
32/node_modules/jake/lib/task/directory_task.js
generated
vendored
Normal file
@@ -0,0 +1,30 @@
|
||||
let fs = require('fs');
|
||||
let FileTask = require('./file_task').FileTask;
|
||||
|
||||
/**
|
||||
@name jake
|
||||
@namespace jake
|
||||
*/
|
||||
/**
|
||||
@name jake.DirectoryTask
|
||||
@constructor
|
||||
@augments EventEmitter
|
||||
@augments jake.Task
|
||||
@augments jake.FileTask
|
||||
@description A Jake DirectoryTask
|
||||
|
||||
@param {String} name The name of the directory to create.
|
||||
*/
|
||||
class DirectoryTask extends FileTask {
|
||||
constructor(...args) {
|
||||
super(...args);
|
||||
if (fs.existsSync(this.name)) {
|
||||
this.updateModTime();
|
||||
}
|
||||
else {
|
||||
this.modTime = null;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
exports.DirectoryTask = DirectoryTask;
|
||||
126
32/node_modules/jake/lib/task/file_task.js
generated
vendored
Normal file
126
32/node_modules/jake/lib/task/file_task.js
generated
vendored
Normal file
@@ -0,0 +1,126 @@
|
||||
let fs = require('fs');
|
||||
let Task = require('./task').Task;
|
||||
|
||||
function isFileOrDirectory(t) {
|
||||
return (t instanceof FileTask ||
|
||||
t instanceof DirectoryTask);
|
||||
}
|
||||
|
||||
function isFile(t) {
|
||||
return (t instanceof FileTask && !(t instanceof DirectoryTask));
|
||||
}
|
||||
|
||||
/**
|
||||
@name jake
|
||||
@namespace jake
|
||||
*/
|
||||
/**
|
||||
@name jake.FileTask
|
||||
@class`
|
||||
@extentds Task
|
||||
@description A Jake FileTask
|
||||
|
||||
@param {String} name The name of the Task
|
||||
@param {Array} [prereqs] Prerequisites to be run before this task
|
||||
@param {Function} [action] The action to perform to create this file
|
||||
@param {Object} [opts]
|
||||
@param {Array} [opts.asyc=false] Perform this task asynchronously.
|
||||
If you flag a task with this option, you must call the global
|
||||
`complete` method inside the task's action, for execution to proceed
|
||||
to the next task.
|
||||
*/
|
||||
class FileTask extends Task {
|
||||
constructor(...args) {
|
||||
super(...args);
|
||||
this.dummy = false;
|
||||
if (fs.existsSync(this.name)) {
|
||||
this.updateModTime();
|
||||
}
|
||||
else {
|
||||
this.modTime = null;
|
||||
}
|
||||
}
|
||||
|
||||
isNeeded() {
|
||||
let prereqs = this.prereqs;
|
||||
let prereqName;
|
||||
let prereqTask;
|
||||
|
||||
// No repeatsies
|
||||
if (this.taskStatus == Task.runStatuses.DONE) {
|
||||
return false;
|
||||
}
|
||||
// The always-make override
|
||||
else if (jake.program.opts['always-make']) {
|
||||
return true;
|
||||
}
|
||||
// Default case
|
||||
else {
|
||||
|
||||
// We need either an existing file, or an action to create one.
|
||||
// First try grabbing the actual mod-time of the file
|
||||
try {
|
||||
this.updateModTime();
|
||||
}
|
||||
// Then fall back to looking for an action
|
||||
catch(e) {
|
||||
if (typeof this.action == 'function') {
|
||||
return true;
|
||||
}
|
||||
else {
|
||||
throw new Error('File-task ' + this.fullName + ' has no ' +
|
||||
'existing file, and no action to create one.');
|
||||
}
|
||||
}
|
||||
|
||||
// Compare mod-time of all the prereqs with its mod-time
|
||||
// If any prereqs are newer, need to run the action to update
|
||||
if (prereqs && prereqs.length) {
|
||||
for (let i = 0, ii = prereqs.length; i < ii; i++) {
|
||||
prereqName = prereqs[i];
|
||||
prereqTask = this.namespace.resolveTask(prereqName) ||
|
||||
jake.createPlaceholderFileTask(prereqName, this.namespace);
|
||||
// Run the action if:
|
||||
// 1. The prereq is a normal task (not file/dir)
|
||||
// 2. The prereq is a file-task with a mod-date more recent than
|
||||
// the one for this file/dir
|
||||
if (prereqTask) {
|
||||
if (!isFileOrDirectory(prereqTask) ||
|
||||
(isFile(prereqTask) && prereqTask.modTime > this.modTime)) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
}
|
||||
this.taskStatus = Task.runStatuses.DONE;
|
||||
return false;
|
||||
}
|
||||
// File/dir has no prereqs, and exists -- no need to run
|
||||
else {
|
||||
// Effectively done
|
||||
this.taskStatus = Task.runStatuses.DONE;
|
||||
return false;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
updateModTime() {
|
||||
let stats = fs.statSync(this.name);
|
||||
this.modTime = stats.mtime;
|
||||
}
|
||||
|
||||
complete() {
|
||||
if (!this.dummy) {
|
||||
this.updateModTime();
|
||||
}
|
||||
// Hackity hack
|
||||
Task.prototype.complete.apply(this, arguments);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
exports.FileTask = FileTask;
|
||||
|
||||
// DirectoryTask is a subclass of FileTask, depends on it
|
||||
// being defined
|
||||
let DirectoryTask = require('./directory_task').DirectoryTask;
|
||||
|
||||
9
32/node_modules/jake/lib/task/index.js
generated
vendored
Normal file
9
32/node_modules/jake/lib/task/index.js
generated
vendored
Normal file
@@ -0,0 +1,9 @@
|
||||
|
||||
let Task = require('./task').Task;
|
||||
let FileTask = require('./file_task').FileTask;
|
||||
let DirectoryTask = require('./directory_task').DirectoryTask;
|
||||
|
||||
exports.Task = Task;
|
||||
exports.FileTask = FileTask;
|
||||
exports.DirectoryTask = DirectoryTask;
|
||||
|
||||
449
32/node_modules/jake/lib/task/task.js
generated
vendored
Normal file
449
32/node_modules/jake/lib/task/task.js
generated
vendored
Normal file
@@ -0,0 +1,449 @@
|
||||
let EventEmitter = require('events').EventEmitter;
|
||||
let async = require('async');
|
||||
let chalk = require('chalk');
|
||||
// 'rule' module is required at the bottom because circular deps
|
||||
|
||||
// Used for task value, so better not to use
|
||||
// null, since value should be unset/uninitialized
|
||||
let UNDEFINED_VALUE;
|
||||
|
||||
const ROOT_TASK_NAME = '__rootTask__';
|
||||
const POLLING_INTERVAL = 100;
|
||||
|
||||
// Parse any positional args attached to the task-name
|
||||
function parsePrereqName(name) {
|
||||
let taskArr = name.split('[');
|
||||
let taskName = taskArr[0];
|
||||
let taskArgs = [];
|
||||
if (taskArr[1]) {
|
||||
taskArgs = taskArr[1].replace(/\]$/, '');
|
||||
taskArgs = taskArgs.split(',');
|
||||
}
|
||||
return {
|
||||
name: taskName,
|
||||
args: taskArgs
|
||||
};
|
||||
}
|
||||
|
||||
/**
|
||||
@name jake.Task
|
||||
@class
|
||||
@extends EventEmitter
|
||||
@description A Jake Task
|
||||
|
||||
@param {String} name The name of the Task
|
||||
@param {Array} [prereqs] Prerequisites to be run before this task
|
||||
@param {Function} [action] The action to perform for this task
|
||||
@param {Object} [opts]
|
||||
@param {Array} [opts.asyc=false] Perform this task asynchronously.
|
||||
If you flag a task with this option, you must call the global
|
||||
`complete` method inside the task's action, for execution to proceed
|
||||
to the next task.
|
||||
*/
|
||||
class Task extends EventEmitter {
|
||||
|
||||
constructor(name, prereqs, action, options) {
|
||||
// EventEmitter ctor takes no args
|
||||
super();
|
||||
|
||||
if (name.indexOf(':') > -1) {
|
||||
throw new Error('Task name cannot include a colon. It is used internally as namespace delimiter.');
|
||||
}
|
||||
let opts = options || {};
|
||||
|
||||
this._currentPrereqIndex = 0;
|
||||
this._internal = false;
|
||||
this._skipped = false;
|
||||
|
||||
this.name = name;
|
||||
this.prereqs = prereqs;
|
||||
this.action = action;
|
||||
this.async = false;
|
||||
this.taskStatus = Task.runStatuses.UNSTARTED;
|
||||
this.description = null;
|
||||
this.args = [];
|
||||
this.value = UNDEFINED_VALUE;
|
||||
this.concurrency = 1;
|
||||
this.startTime = null;
|
||||
this.endTime = null;
|
||||
this.directory = null;
|
||||
this.namespace = null;
|
||||
|
||||
// Support legacy async-flag -- if not explicitly passed or falsy, will
|
||||
// be set to empty-object
|
||||
if (typeof opts == 'boolean' && opts === true) {
|
||||
this.async = true;
|
||||
}
|
||||
else {
|
||||
if (opts.async) {
|
||||
this.async = true;
|
||||
}
|
||||
if (opts.concurrency) {
|
||||
this.concurrency = opts.concurrency;
|
||||
}
|
||||
}
|
||||
|
||||
//Do a test on self dependencies for this task
|
||||
if(Array.isArray(this.prereqs) && this.prereqs.indexOf(this.name) !== -1) {
|
||||
throw new Error("Cannot use prereq " + this.name + " as a dependency of itself");
|
||||
}
|
||||
}
|
||||
|
||||
get fullName() {
|
||||
return this._getFullName();
|
||||
}
|
||||
|
||||
get params() {
|
||||
return this._getParams();
|
||||
}
|
||||
|
||||
_initInvocationChain() {
|
||||
// Legacy global invocation chain
|
||||
jake._invocationChain.push(this);
|
||||
|
||||
// New root chain
|
||||
if (!this._invocationChain) {
|
||||
this._invocationChainRoot = true;
|
||||
this._invocationChain = [];
|
||||
if (jake.currentRunningTask) {
|
||||
jake.currentRunningTask._waitForChains = jake.currentRunningTask._waitForChains || [];
|
||||
jake.currentRunningTask._waitForChains.push(this._invocationChain);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
@name jake.Task#invoke
|
||||
@function
|
||||
@description Runs prerequisites, then this task. If the task has already
|
||||
been run, will not run the task again.
|
||||
*/
|
||||
invoke() {
|
||||
this._initInvocationChain();
|
||||
|
||||
this.args = Array.prototype.slice.call(arguments);
|
||||
this.reenabled = false;
|
||||
this.runPrereqs();
|
||||
}
|
||||
|
||||
/**
|
||||
@name jake.Task#execute
|
||||
@function
|
||||
@description Run only this task, without prereqs. If the task has already
|
||||
been run, *will* run the task again.
|
||||
*/
|
||||
execute() {
|
||||
this._initInvocationChain();
|
||||
|
||||
this.args = Array.prototype.slice.call(arguments);
|
||||
this.reenable();
|
||||
this.reenabled = true;
|
||||
this.run();
|
||||
}
|
||||
|
||||
runPrereqs() {
|
||||
if (this.prereqs && this.prereqs.length) {
|
||||
|
||||
if (this.concurrency > 1) {
|
||||
async.eachLimit(this.prereqs, this.concurrency,
|
||||
|
||||
(name, cb) => {
|
||||
let parsed = parsePrereqName(name);
|
||||
|
||||
let prereq = this.namespace.resolveTask(parsed.name) ||
|
||||
jake.attemptRule(name, this.namespace, 0) ||
|
||||
jake.createPlaceholderFileTask(name, this.namespace);
|
||||
|
||||
if (!prereq) {
|
||||
throw new Error('Unknown task "' + name + '"');
|
||||
}
|
||||
|
||||
//Test for circular invocation
|
||||
if(prereq === this) {
|
||||
setImmediate(function () {
|
||||
cb(new Error("Cannot use prereq " + prereq.name + " as a dependency of itself"));
|
||||
});
|
||||
}
|
||||
|
||||
if (prereq.taskStatus == Task.runStatuses.DONE) {
|
||||
//prereq already done, return
|
||||
setImmediate(cb);
|
||||
}
|
||||
else {
|
||||
//wait for complete before calling cb
|
||||
prereq.once('_done', () => {
|
||||
prereq.removeAllListeners('_done');
|
||||
setImmediate(cb);
|
||||
});
|
||||
// Start the prereq if we are the first to encounter it
|
||||
if (prereq.taskStatus === Task.runStatuses.UNSTARTED) {
|
||||
prereq.taskStatus = Task.runStatuses.STARTED;
|
||||
prereq.invoke.apply(prereq, parsed.args);
|
||||
}
|
||||
}
|
||||
},
|
||||
|
||||
(err) => {
|
||||
//async callback is called after all prereqs have run.
|
||||
if (err) {
|
||||
throw err;
|
||||
}
|
||||
else {
|
||||
setImmediate(this.run.bind(this));
|
||||
}
|
||||
}
|
||||
);
|
||||
}
|
||||
else {
|
||||
setImmediate(this.nextPrereq.bind(this));
|
||||
}
|
||||
}
|
||||
else {
|
||||
setImmediate(this.run.bind(this));
|
||||
}
|
||||
}
|
||||
|
||||
nextPrereq() {
|
||||
let self = this;
|
||||
let index = this._currentPrereqIndex;
|
||||
let name = this.prereqs[index];
|
||||
let prereq;
|
||||
let parsed;
|
||||
|
||||
if (name) {
|
||||
|
||||
parsed = parsePrereqName(name);
|
||||
|
||||
prereq = this.namespace.resolveTask(parsed.name) ||
|
||||
jake.attemptRule(name, this.namespace, 0) ||
|
||||
jake.createPlaceholderFileTask(name, this.namespace);
|
||||
|
||||
if (!prereq) {
|
||||
throw new Error('Unknown task "' + name + '"');
|
||||
}
|
||||
|
||||
// Do when done
|
||||
if (prereq.taskStatus == Task.runStatuses.DONE) {
|
||||
self.handlePrereqDone(prereq);
|
||||
}
|
||||
else {
|
||||
prereq.once('_done', () => {
|
||||
this.handlePrereqDone(prereq);
|
||||
prereq.removeAllListeners('_done');
|
||||
});
|
||||
if (prereq.taskStatus == Task.runStatuses.UNSTARTED) {
|
||||
prereq.taskStatus = Task.runStatuses.STARTED;
|
||||
prereq._invocationChain = this._invocationChain;
|
||||
prereq.invoke.apply(prereq, parsed.args);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
@name jake.Task#reenable
|
||||
@function
|
||||
@description Reenables a task so that it can be run again.
|
||||
*/
|
||||
reenable(deep) {
|
||||
let prereqs;
|
||||
let prereq;
|
||||
this._skipped = false;
|
||||
this.taskStatus = Task.runStatuses.UNSTARTED;
|
||||
this.value = UNDEFINED_VALUE;
|
||||
if (deep && this.prereqs) {
|
||||
prereqs = this.prereqs;
|
||||
for (let i = 0, ii = prereqs.length; i < ii; i++) {
|
||||
prereq = jake.Task[prereqs[i]];
|
||||
if (prereq) {
|
||||
prereq.reenable(deep);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
handlePrereqDone(prereq) {
|
||||
this._currentPrereqIndex++;
|
||||
if (this._currentPrereqIndex < this.prereqs.length) {
|
||||
setImmediate(this.nextPrereq.bind(this));
|
||||
}
|
||||
else {
|
||||
setImmediate(this.run.bind(this));
|
||||
}
|
||||
}
|
||||
|
||||
isNeeded() {
|
||||
let needed = true;
|
||||
if (this.taskStatus == Task.runStatuses.DONE) {
|
||||
needed = false;
|
||||
}
|
||||
return needed;
|
||||
}
|
||||
|
||||
run() {
|
||||
let val, previous;
|
||||
let hasAction = typeof this.action == 'function';
|
||||
|
||||
if (!this.isNeeded()) {
|
||||
this.emit('skip');
|
||||
this.emit('_done');
|
||||
}
|
||||
else {
|
||||
if (this._invocationChain.length) {
|
||||
previous = this._invocationChain[this._invocationChain.length - 1];
|
||||
// If this task is repeating and its previous is equal to this, don't check its status because it was set to UNSTARTED by the reenable() method
|
||||
if (!(this.reenabled && previous == this)) {
|
||||
if (previous.taskStatus != Task.runStatuses.DONE) {
|
||||
let now = (new Date()).getTime();
|
||||
if (now - this.startTime > jake._taskTimeout) {
|
||||
return jake.fail(`Timed out waiting for task: ${previous.name} with status of ${previous.taskStatus}`);
|
||||
}
|
||||
setTimeout(this.run.bind(this), POLLING_INTERVAL);
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
if (!(this.reenabled && previous == this)) {
|
||||
this._invocationChain.push(this);
|
||||
}
|
||||
|
||||
if (!(this._internal || jake.program.opts.quiet)) {
|
||||
console.log("Starting '" + chalk.green(this.fullName) + "'...");
|
||||
}
|
||||
|
||||
this.startTime = (new Date()).getTime();
|
||||
this.emit('start');
|
||||
|
||||
jake.currentRunningTask = this;
|
||||
|
||||
if (hasAction) {
|
||||
try {
|
||||
if (this.directory) {
|
||||
process.chdir(this.directory);
|
||||
}
|
||||
|
||||
val = this.action.apply(this, this.args);
|
||||
|
||||
if (typeof val == 'object' && typeof val.then == 'function') {
|
||||
this.async = true;
|
||||
|
||||
val.then(
|
||||
(result) => {
|
||||
setImmediate(() => {
|
||||
this.complete(result);
|
||||
});
|
||||
},
|
||||
(err) => {
|
||||
setImmediate(() => {
|
||||
this.errorOut(err);
|
||||
});
|
||||
});
|
||||
}
|
||||
}
|
||||
catch (err) {
|
||||
this.errorOut(err);
|
||||
return; // Bail out, not complete
|
||||
}
|
||||
}
|
||||
|
||||
if (!(hasAction && this.async)) {
|
||||
setImmediate(() => {
|
||||
this.complete(val);
|
||||
});
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
errorOut(err) {
|
||||
this.taskStatus = Task.runStatuses.ERROR;
|
||||
this._invocationChain.chainStatus = Task.runStatuses.ERROR;
|
||||
this.emit('error', err);
|
||||
}
|
||||
|
||||
complete(val) {
|
||||
|
||||
if (Array.isArray(this._waitForChains)) {
|
||||
let stillWaiting = this._waitForChains.some((chain) => {
|
||||
return !(chain.chainStatus == Task.runStatuses.DONE ||
|
||||
chain.chainStatus == Task.runStatuses.ERROR);
|
||||
});
|
||||
if (stillWaiting) {
|
||||
let now = (new Date()).getTime();
|
||||
let elapsed = now - this.startTime;
|
||||
if (elapsed > jake._taskTimeout) {
|
||||
return jake.fail(`Timed out waiting for task: ${this.name} with status of ${this.taskStatus}. Elapsed: ${elapsed}`);
|
||||
}
|
||||
setTimeout(() => {
|
||||
this.complete(val);
|
||||
}, POLLING_INTERVAL);
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
jake._invocationChain.splice(jake._invocationChain.indexOf(this), 1);
|
||||
|
||||
if (this._invocationChainRoot) {
|
||||
this._invocationChain.chainStatus = Task.runStatuses.DONE;
|
||||
}
|
||||
|
||||
this._currentPrereqIndex = 0;
|
||||
|
||||
// If 'complete' getting called because task has been
|
||||
// run already, value will not be passed -- leave in place
|
||||
if (!this._skipped) {
|
||||
this.taskStatus = Task.runStatuses.DONE;
|
||||
this.value = val;
|
||||
|
||||
this.emit('complete', this.value);
|
||||
this.emit('_done');
|
||||
|
||||
this.endTime = (new Date()).getTime();
|
||||
let taskTime = this.endTime - this.startTime;
|
||||
|
||||
if (!(this._internal || jake.program.opts.quiet)) {
|
||||
console.log("Finished '" + chalk.green(this.fullName) + "' after " + chalk.magenta(taskTime + ' ms'));
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
_getFullName() {
|
||||
let ns = this.namespace;
|
||||
let path = (ns && ns.path) || '';
|
||||
path = (path && path.split(':')) || [];
|
||||
if (this.namespace !== jake.defaultNamespace) {
|
||||
path.push(this.namespace.name);
|
||||
}
|
||||
path.push(this.name);
|
||||
return path.join(':');
|
||||
}
|
||||
|
||||
_getParams() {
|
||||
if (!this.action) return "";
|
||||
let params = (new RegExp('(?:'+this.action.name+'\\s*|^)\\s*\\((.*?)\\)').exec(this.action.toString().replace(/\n/g, '')) || [''])[1].replace(/\/\*.*?\*\//g, '').replace(/ /g, '');
|
||||
return params;
|
||||
}
|
||||
|
||||
static getBaseNamespacePath(fullName) {
|
||||
return fullName.split(':').slice(0, -1).join(':');
|
||||
}
|
||||
|
||||
static getBaseTaskName(fullName) {
|
||||
return fullName.split(':').pop();
|
||||
}
|
||||
}
|
||||
|
||||
Task.runStatuses = {
|
||||
UNSTARTED: 'unstarted',
|
||||
DONE: 'done',
|
||||
STARTED: 'started',
|
||||
ERROR: 'error'
|
||||
};
|
||||
|
||||
Task.ROOT_TASK_NAME = ROOT_TASK_NAME;
|
||||
|
||||
exports.Task = Task;
|
||||
|
||||
// Required here because circular deps
|
||||
require('../rule');
|
||||
|
||||
270
32/node_modules/jake/lib/test_task.js
generated
vendored
Normal file
270
32/node_modules/jake/lib/test_task.js
generated
vendored
Normal file
@@ -0,0 +1,270 @@
|
||||
/*
|
||||
* Jake JavaScript build tool
|
||||
* Copyright 2112 Matthew Eernisse (mde@fleegix.org)
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*
|
||||
*/
|
||||
|
||||
let path = require('path');
|
||||
let currDir = process.cwd();
|
||||
|
||||
/**
|
||||
@name jake
|
||||
@namespace jake
|
||||
*/
|
||||
/**
|
||||
@name jake.TestTask
|
||||
@constructor
|
||||
@description Instantiating a TestTask creates a number of Jake
|
||||
Tasks that make running tests for your software easy.
|
||||
|
||||
@param {String} name The name of the project
|
||||
@param {Function} definition Defines the list of files containing the tests,
|
||||
and the name of the namespace/task for running them. Will be executed on the
|
||||
instantiated TestTask (i.e., 'this', will be the TestTask instance), to set
|
||||
the various instance-propertiess.
|
||||
|
||||
@example
|
||||
let t = new jake.TestTask('bij-js', function () {
|
||||
this.testName = 'testSpecial';
|
||||
this.testFiles.include('test/**');
|
||||
});
|
||||
|
||||
*/
|
||||
let TestTask = function () {
|
||||
let self = this;
|
||||
let args = Array.prototype.slice.call(arguments);
|
||||
let name = args.shift();
|
||||
let definition = args.pop();
|
||||
let prereqs = args.pop() || [];
|
||||
|
||||
/**
|
||||
@name jake.TestTask#testNam
|
||||
@public
|
||||
@type {String}
|
||||
@description The name of the namespace to place the tests in, and
|
||||
the top-level task for running tests. Defaults to "test"
|
||||
*/
|
||||
this.testName = 'test';
|
||||
|
||||
/**
|
||||
@name jake.TestTask#testFiles
|
||||
@public
|
||||
@type {jake.FileList}
|
||||
@description The list of files containing tests to load
|
||||
*/
|
||||
this.testFiles = new jake.FileList();
|
||||
|
||||
/**
|
||||
@name jake.TestTask#showDescription
|
||||
@public
|
||||
@type {Boolean}
|
||||
@description Show the created task when doing Jake -T
|
||||
*/
|
||||
this.showDescription = true;
|
||||
|
||||
/*
|
||||
@name jake.TestTask#totalTests
|
||||
@public
|
||||
@type {Number}
|
||||
@description The total number of tests to run
|
||||
*/
|
||||
this.totalTests = 0;
|
||||
|
||||
/*
|
||||
@name jake.TestTask#executedTests
|
||||
@public
|
||||
@type {Number}
|
||||
@description The number of tests successfully run
|
||||
*/
|
||||
this.executedTests = 0;
|
||||
|
||||
if (typeof definition == 'function') {
|
||||
definition.call(this);
|
||||
}
|
||||
|
||||
if (this.showDescription) {
|
||||
desc('Run the tests for ' + name);
|
||||
}
|
||||
|
||||
task(this.testName, prereqs, {async: true}, function () {
|
||||
let t = jake.Task[this.fullName + ':run'];
|
||||
t.on('complete', function () {
|
||||
complete();
|
||||
});
|
||||
// Pass args to the namespaced test
|
||||
t.invoke.apply(t, arguments);
|
||||
});
|
||||
|
||||
namespace(self.testName, function () {
|
||||
|
||||
let runTask = task('run', {async: true}, function (pat) {
|
||||
let re;
|
||||
let testFiles;
|
||||
|
||||
// Don't nest; make a top-level namespace. Don't want
|
||||
// re-calling from inside to nest infinitely
|
||||
jake.currentNamespace = jake.defaultNamespace;
|
||||
|
||||
re = new RegExp(pat);
|
||||
// Get test files that match the passed-in pattern
|
||||
testFiles = self.testFiles.toArray()
|
||||
.filter(function (f) {
|
||||
return (re).test(f);
|
||||
}) // Don't load the same file multiple times -- should this be in FileList?
|
||||
.reduce(function (p, c) {
|
||||
if (p.indexOf(c) < 0) {
|
||||
p.push(c);
|
||||
}
|
||||
return p;
|
||||
}, []);
|
||||
|
||||
// Create a namespace for all the testing tasks to live in
|
||||
namespace(self.testName + 'Exec', function () {
|
||||
// Each test will be a prereq for the dummy top-level task
|
||||
let prereqs = [];
|
||||
// Continuation to pass to the async tests, wrapping `continune`
|
||||
let next = function () {
|
||||
complete();
|
||||
};
|
||||
// Create the task for this test-function
|
||||
let createTask = function (name, action) {
|
||||
// If the test-function is defined with a continuation
|
||||
// param, flag the task as async
|
||||
let t;
|
||||
let isAsync = !!action.length;
|
||||
|
||||
// Define the actual namespaced task with the name, the
|
||||
// wrapped action, and the correc async-flag
|
||||
t = task(name, createAction(name, action), {
|
||||
async: isAsync
|
||||
});
|
||||
t.once('complete', function () {
|
||||
self.executedTests++;
|
||||
});
|
||||
t._internal = true;
|
||||
return t;
|
||||
};
|
||||
// Used as the action for the defined task for each test.
|
||||
let createAction = function (n, a) {
|
||||
// A wrapped function that passes in the `next` function
|
||||
// for any tasks that run asynchronously
|
||||
return function () {
|
||||
let cb;
|
||||
if (a.length) {
|
||||
cb = next;
|
||||
}
|
||||
if (!(n == 'before' || n == 'after' ||
|
||||
/_beforeEach$/.test(n) || /_afterEach$/.test(n))) {
|
||||
jake.logger.log(n);
|
||||
}
|
||||
// 'this' will be the task when action is run
|
||||
return a.call(this, cb);
|
||||
};
|
||||
};
|
||||
// Dummy top-level task for everything to be prereqs for
|
||||
let topLevel;
|
||||
|
||||
// Pull in each test-file, and iterate over any exported
|
||||
// test-functions. Register each test-function as a prereq task
|
||||
testFiles.forEach(function (file) {
|
||||
let exp = require(path.join(currDir, file));
|
||||
|
||||
// Create a namespace for each filename, so test-name collisions
|
||||
// won't be a problem
|
||||
namespace(file, function () {
|
||||
let testPrefix = self.testName + 'Exec:' + file + ':';
|
||||
let testName;
|
||||
// Dummy task for displaying file banner
|
||||
testName = '*** Running ' + file + ' ***';
|
||||
prereqs.push(testPrefix + testName);
|
||||
createTask(testName, function () {});
|
||||
|
||||
// 'before' setup
|
||||
if (typeof exp.before == 'function') {
|
||||
prereqs.push(testPrefix + 'before');
|
||||
// Create the task
|
||||
createTask('before', exp.before);
|
||||
}
|
||||
|
||||
// Walk each exported function, and create a task for each
|
||||
for (let p in exp) {
|
||||
if (p == 'before' || p == 'after' ||
|
||||
p == 'beforeEach' || p == 'afterEach') {
|
||||
continue;
|
||||
}
|
||||
|
||||
if (typeof exp.beforeEach == 'function') {
|
||||
prereqs.push(testPrefix + p + '_beforeEach');
|
||||
// Create the task
|
||||
createTask(p + '_beforeEach', exp.beforeEach);
|
||||
}
|
||||
|
||||
// Add the namespace:name of this test to the list of prereqs
|
||||
// for the dummy top-level task
|
||||
prereqs.push(testPrefix + p);
|
||||
// Create the task
|
||||
createTask(p, exp[p]);
|
||||
|
||||
if (typeof exp.afterEach == 'function') {
|
||||
prereqs.push(testPrefix + p + '_afterEach');
|
||||
// Create the task
|
||||
createTask(p + '_afterEach', exp.afterEach);
|
||||
}
|
||||
}
|
||||
|
||||
// 'after' teardown
|
||||
if (typeof exp.after == 'function') {
|
||||
prereqs.push(testPrefix + 'after');
|
||||
// Create the task
|
||||
let afterTask = createTask('after', exp.after);
|
||||
afterTask._internal = true;
|
||||
}
|
||||
|
||||
});
|
||||
});
|
||||
|
||||
self.totalTests = prereqs.length;
|
||||
process.on('exit', function () {
|
||||
// Throw in the case where the process exits without
|
||||
// finishing tests, but no error was thrown
|
||||
if (!jake.errorCode && (self.totalTests > self.executedTests)) {
|
||||
throw new Error('Process exited without all tests completing.');
|
||||
}
|
||||
});
|
||||
|
||||
// Create the dummy top-level task. When calling a task internally
|
||||
// with `invoke` that is async (or has async prereqs), have to listen
|
||||
// for the 'complete' event to know when it's done
|
||||
topLevel = task('__top__', prereqs);
|
||||
topLevel._internal = true;
|
||||
topLevel.addListener('complete', function () {
|
||||
jake.logger.log('All tests ran successfully');
|
||||
complete();
|
||||
});
|
||||
|
||||
topLevel.invoke(); // Do the thing!
|
||||
});
|
||||
|
||||
});
|
||||
runTask._internal = true;
|
||||
|
||||
});
|
||||
|
||||
|
||||
};
|
||||
|
||||
jake.TestTask = TestTask;
|
||||
exports.TestTask = TestTask;
|
||||
|
||||
286
32/node_modules/jake/lib/utils/file.js
generated
vendored
Normal file
286
32/node_modules/jake/lib/utils/file.js
generated
vendored
Normal file
@@ -0,0 +1,286 @@
|
||||
/*
|
||||
* Utilities: A classic collection of JavaScript utilities
|
||||
* Copyright 2112 Matthew Eernisse (mde@fleegix.org)
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*
|
||||
*/
|
||||
|
||||
let fs = require('fs');
|
||||
let path = require('path');
|
||||
|
||||
/**
|
||||
@name file
|
||||
@namespace file
|
||||
*/
|
||||
|
||||
let fileUtils = new (function () {
|
||||
|
||||
// Recursively copy files and directories
|
||||
let _copyFile = function (fromPath, toPath, opts) {
|
||||
let from = path.normalize(fromPath);
|
||||
let to = path.normalize(toPath);
|
||||
let options = opts || {};
|
||||
let fromStat;
|
||||
let toStat;
|
||||
let destExists;
|
||||
let destDoesNotExistErr;
|
||||
let content;
|
||||
let filename;
|
||||
let dirContents;
|
||||
let targetDir;
|
||||
|
||||
fromStat = fs.statSync(from);
|
||||
|
||||
try {
|
||||
//console.dir(to + ' destExists');
|
||||
toStat = fs.statSync(to);
|
||||
destExists = true;
|
||||
}
|
||||
catch(e) {
|
||||
//console.dir(to + ' does not exist');
|
||||
destDoesNotExistErr = e;
|
||||
destExists = false;
|
||||
}
|
||||
// Destination dir or file exists, copy into (directory)
|
||||
// or overwrite (file)
|
||||
if (destExists) {
|
||||
|
||||
// If there's a rename-via-copy file/dir name passed, use it.
|
||||
// Otherwise use the actual file/dir name
|
||||
filename = options.rename || path.basename(from);
|
||||
|
||||
// Copying a directory
|
||||
if (fromStat.isDirectory()) {
|
||||
dirContents = fs.readdirSync(from);
|
||||
targetDir = path.join(to, filename);
|
||||
// We don't care if the target dir already exists
|
||||
try {
|
||||
fs.mkdirSync(targetDir, {mode: fromStat.mode & 0o777});
|
||||
}
|
||||
catch(e) {
|
||||
if (e.code !== 'EEXIST') {
|
||||
throw e;
|
||||
}
|
||||
}
|
||||
for (let i = 0, ii = dirContents.length; i < ii; i++) {
|
||||
_copyFile(path.join(from, dirContents[i]), targetDir, {preserveMode: options.preserveMode});
|
||||
}
|
||||
}
|
||||
// Copying a file
|
||||
else {
|
||||
content = fs.readFileSync(from);
|
||||
let mode = fromStat.mode & 0o777;
|
||||
let targetFile = to;
|
||||
|
||||
if (toStat.isDirectory()) {
|
||||
targetFile = path.join(to, filename);
|
||||
}
|
||||
|
||||
let fileExists = fs.existsSync(targetFile);
|
||||
fs.writeFileSync(targetFile, content);
|
||||
|
||||
// If the file didn't already exist, use the original file mode.
|
||||
// Otherwise, only update the mode if preserverMode is true.
|
||||
if(!fileExists || options.preserveMode) {
|
||||
fs.chmodSync(targetFile, mode);
|
||||
}
|
||||
}
|
||||
}
|
||||
// Dest doesn't exist, can't create it
|
||||
else {
|
||||
throw destDoesNotExistErr;
|
||||
}
|
||||
};
|
||||
|
||||
// Remove the given directory
|
||||
let _rmDir = function (dirPath) {
|
||||
let dir = path.normalize(dirPath);
|
||||
let paths = [];
|
||||
paths = fs.readdirSync(dir);
|
||||
paths.forEach(function (p) {
|
||||
let curr = path.join(dir, p);
|
||||
let stat = fs.lstatSync(curr);
|
||||
if (stat.isDirectory()) {
|
||||
_rmDir(curr);
|
||||
}
|
||||
else {
|
||||
try {
|
||||
fs.unlinkSync(curr);
|
||||
} catch(e) {
|
||||
if (e.code === 'EPERM') {
|
||||
fs.chmodSync(curr, parseInt(666, 8));
|
||||
fs.unlinkSync(curr);
|
||||
} else {
|
||||
throw e;
|
||||
}
|
||||
}
|
||||
}
|
||||
});
|
||||
fs.rmdirSync(dir);
|
||||
};
|
||||
|
||||
/**
|
||||
@name file#cpR
|
||||
@public
|
||||
@function
|
||||
@description Copies a directory/file to a destination
|
||||
@param {String} fromPath The source path to copy from
|
||||
@param {String} toPath The destination path to copy to
|
||||
@param {Object} opts Options to use
|
||||
@param {Boolean} [opts.preserveMode] If target file already exists, this
|
||||
determines whether the original file's mode is copied over. The default of
|
||||
false mimics the behavior of the `cp` command line tool. (Default: false)
|
||||
*/
|
||||
this.cpR = function (fromPath, toPath, options) {
|
||||
let from = path.normalize(fromPath);
|
||||
let to = path.normalize(toPath);
|
||||
let toStat;
|
||||
let doesNotExistErr;
|
||||
let filename;
|
||||
let opts = options || {};
|
||||
|
||||
if (from == to) {
|
||||
throw new Error('Cannot copy ' + from + ' to itself.');
|
||||
}
|
||||
|
||||
// Handle rename-via-copy
|
||||
try {
|
||||
toStat = fs.statSync(to);
|
||||
}
|
||||
catch(e) {
|
||||
doesNotExistErr = e;
|
||||
|
||||
// Get abs path so it's possible to check parent dir
|
||||
if (!this.isAbsolute(to)) {
|
||||
to = path.join(process.cwd(), to);
|
||||
}
|
||||
|
||||
// Save the file/dir name
|
||||
filename = path.basename(to);
|
||||
// See if a parent dir exists, so there's a place to put the
|
||||
/// renamed file/dir (resets the destination for the copy)
|
||||
to = path.dirname(to);
|
||||
try {
|
||||
toStat = fs.statSync(to);
|
||||
}
|
||||
catch(e) {}
|
||||
if (toStat && toStat.isDirectory()) {
|
||||
// Set the rename opt to pass to the copy func, will be used
|
||||
// as the new file/dir name
|
||||
opts.rename = filename;
|
||||
//console.log('filename ' + filename);
|
||||
}
|
||||
else {
|
||||
throw doesNotExistErr;
|
||||
}
|
||||
}
|
||||
|
||||
_copyFile(from, to, opts);
|
||||
};
|
||||
|
||||
/**
|
||||
@name file#mkdirP
|
||||
@public
|
||||
@function
|
||||
@description Create the given directory(ies) using the given mode permissions
|
||||
@param {String} dir The directory to create
|
||||
@param {Number} mode The mode to give the created directory(ies)(Default: 0755)
|
||||
*/
|
||||
this.mkdirP = function (dir, mode) {
|
||||
let dirPath = path.normalize(dir);
|
||||
let paths = dirPath.split(/\/|\\/);
|
||||
let currPath = '';
|
||||
let next;
|
||||
|
||||
if (paths[0] == '' || /^[A-Za-z]+:/.test(paths[0])) {
|
||||
currPath = paths.shift() || '/';
|
||||
currPath = path.join(currPath, paths.shift());
|
||||
//console.log('basedir');
|
||||
}
|
||||
while ((next = paths.shift())) {
|
||||
if (next == '..') {
|
||||
currPath = path.join(currPath, next);
|
||||
continue;
|
||||
}
|
||||
currPath = path.join(currPath, next);
|
||||
try {
|
||||
//console.log('making ' + currPath);
|
||||
fs.mkdirSync(currPath, mode || parseInt(755, 8));
|
||||
}
|
||||
catch(e) {
|
||||
if (e.code != 'EEXIST') {
|
||||
throw e;
|
||||
}
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
/**
|
||||
@name file#rmRf
|
||||
@public
|
||||
@function
|
||||
@description Deletes the given directory/file
|
||||
@param {String} p The path to delete, can be a directory or file
|
||||
*/
|
||||
this.rmRf = function (p, options) {
|
||||
let stat;
|
||||
try {
|
||||
stat = fs.lstatSync(p);
|
||||
if (stat.isDirectory()) {
|
||||
_rmDir(p);
|
||||
}
|
||||
else {
|
||||
fs.unlinkSync(p);
|
||||
}
|
||||
}
|
||||
catch (e) {}
|
||||
};
|
||||
|
||||
/**
|
||||
@name file#isAbsolute
|
||||
@public
|
||||
@function
|
||||
@return {Boolean/String} If it's absolute the first character is returned otherwise false
|
||||
@description Checks if a given path is absolute or relative
|
||||
@param {String} p Path to check
|
||||
*/
|
||||
this.isAbsolute = function (p) {
|
||||
let match = /^[A-Za-z]+:\\|^\//.exec(p);
|
||||
if (match && match.length) {
|
||||
return match[0];
|
||||
}
|
||||
return false;
|
||||
};
|
||||
|
||||
/**
|
||||
@name file#absolutize
|
||||
@public
|
||||
@function
|
||||
@return {String} Returns the absolute path for the given path
|
||||
@description Returns the absolute path for the given path
|
||||
@param {String} p The path to get the absolute path for
|
||||
*/
|
||||
this.absolutize = function (p) {
|
||||
if (this.isAbsolute(p)) {
|
||||
return p;
|
||||
}
|
||||
else {
|
||||
return path.join(process.cwd(), p);
|
||||
}
|
||||
};
|
||||
|
||||
})();
|
||||
|
||||
module.exports = fileUtils;
|
||||
|
||||
297
32/node_modules/jake/lib/utils/index.js
generated
vendored
Normal file
297
32/node_modules/jake/lib/utils/index.js
generated
vendored
Normal file
@@ -0,0 +1,297 @@
|
||||
/*
|
||||
* Jake JavaScript build tool
|
||||
* Copyright 2112 Matthew Eernisse (mde@fleegix.org)
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*
|
||||
*/
|
||||
|
||||
|
||||
let util = require('util'); // Native Node util module
|
||||
let spawn = require('child_process').spawn;
|
||||
let EventEmitter = require('events').EventEmitter;
|
||||
let logger = require('./logger');
|
||||
let file = require('./file');
|
||||
let Exec;
|
||||
|
||||
const _UUID_CHARS = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz'.split('');
|
||||
|
||||
let parseArgs = function (argumentsObj) {
|
||||
let args;
|
||||
let arg;
|
||||
let cmds;
|
||||
let callback;
|
||||
let opts = {
|
||||
interactive: false,
|
||||
printStdout: false,
|
||||
printStderr: false,
|
||||
breakOnError: true
|
||||
};
|
||||
|
||||
args = Array.prototype.slice.call(argumentsObj);
|
||||
|
||||
cmds = args.shift();
|
||||
// Arrayize if passed a single string command
|
||||
if (typeof cmds == 'string') {
|
||||
cmds = [cmds];
|
||||
}
|
||||
// Make a copy if it's an actual list
|
||||
else {
|
||||
cmds = cmds.slice();
|
||||
}
|
||||
|
||||
// Get optional callback or opts
|
||||
while((arg = args.shift())) {
|
||||
if (typeof arg == 'function') {
|
||||
callback = arg;
|
||||
}
|
||||
else if (typeof arg == 'object') {
|
||||
opts = Object.assign(opts, arg);
|
||||
}
|
||||
}
|
||||
|
||||
// Backward-compat shim
|
||||
if (typeof opts.stdout != 'undefined') {
|
||||
opts.printStdout = opts.stdout;
|
||||
delete opts.stdout;
|
||||
}
|
||||
if (typeof opts.stderr != 'undefined') {
|
||||
opts.printStderr = opts.stderr;
|
||||
delete opts.stderr;
|
||||
}
|
||||
|
||||
return {
|
||||
cmds: cmds,
|
||||
opts: opts,
|
||||
callback: callback
|
||||
};
|
||||
};
|
||||
|
||||
/**
|
||||
@name jake
|
||||
@namespace jake
|
||||
*/
|
||||
let utils = new (function () {
|
||||
/**
|
||||
@name jake.exec
|
||||
@static
|
||||
@function
|
||||
@description Executes shell-commands asynchronously with an optional
|
||||
final callback.
|
||||
`
|
||||
@param {String[]} cmds The list of shell-commands to execute
|
||||
@param {Object} [opts]
|
||||
@param {Boolean} [opts.printStdout=false] Print stdout from each command
|
||||
@param {Boolean} [opts.printStderr=false] Print stderr from each command
|
||||
@param {Boolean} [opts.breakOnError=true] Stop further execution on
|
||||
the first error.
|
||||
@param {Boolean} [opts.windowsVerbatimArguments=false] Don't translate
|
||||
arguments on Windows.
|
||||
@param {Function} [callback] Callback to run after executing the
|
||||
commands
|
||||
|
||||
@example
|
||||
let cmds = [
|
||||
'echo "showing directories"'
|
||||
, 'ls -al | grep ^d'
|
||||
, 'echo "moving up a directory"'
|
||||
, 'cd ../'
|
||||
]
|
||||
, callback = function () {
|
||||
console.log('Finished running commands.');
|
||||
}
|
||||
jake.exec(cmds, {stdout: true}, callback);
|
||||
*/
|
||||
this.exec = function (a, b, c) {
|
||||
let parsed = parseArgs(arguments);
|
||||
let cmds = parsed.cmds;
|
||||
let opts = parsed.opts;
|
||||
let callback = parsed.callback;
|
||||
|
||||
let ex = new Exec(cmds, opts, callback);
|
||||
|
||||
ex.addListener('error', function (msg, code) {
|
||||
if (opts.breakOnError) {
|
||||
fail(msg, code);
|
||||
}
|
||||
});
|
||||
ex.run();
|
||||
|
||||
return ex;
|
||||
};
|
||||
|
||||
this.createExec = function (a, b, c) {
|
||||
return new Exec(a, b, c);
|
||||
};
|
||||
|
||||
// From Math.uuid.js, https://github.com/broofa/node-uuid
|
||||
// Robert Kieffer (robert@broofa.com), MIT license
|
||||
this.uuid = function (length, radix) {
|
||||
var chars = _UUID_CHARS
|
||||
, uuid = []
|
||||
, r
|
||||
, i;
|
||||
|
||||
radix = radix || chars.length;
|
||||
|
||||
if (length) {
|
||||
// Compact form
|
||||
i = -1;
|
||||
while (++i < length) {
|
||||
uuid[i] = chars[0 | Math.random()*radix];
|
||||
}
|
||||
} else {
|
||||
// rfc4122, version 4 form
|
||||
|
||||
// rfc4122 requires these characters
|
||||
uuid[8] = uuid[13] = uuid[18] = uuid[23] = '-';
|
||||
uuid[14] = '4';
|
||||
|
||||
// Fill in random data. At i==19 set the high bits of clock sequence as
|
||||
// per rfc4122, sec. 4.1.5
|
||||
i = -1;
|
||||
while (++i < 36) {
|
||||
if (!uuid[i]) {
|
||||
r = 0 | Math.random()*16;
|
||||
uuid[i] = chars[(i == 19) ? (r & 0x3) | 0x8 : r];
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return uuid.join('');
|
||||
};
|
||||
|
||||
})();
|
||||
|
||||
Exec = function () {
|
||||
let parsed = parseArgs(arguments);
|
||||
let cmds = parsed.cmds;
|
||||
let opts = parsed.opts;
|
||||
let callback = parsed.callback;
|
||||
|
||||
this._cmds = cmds;
|
||||
this._callback = callback;
|
||||
this._config = opts;
|
||||
};
|
||||
|
||||
util.inherits(Exec, EventEmitter);
|
||||
|
||||
Object.assign(Exec.prototype, new (function () {
|
||||
|
||||
let _run = function () {
|
||||
let self = this;
|
||||
let sh;
|
||||
let cmd;
|
||||
let args;
|
||||
let next = this._cmds.shift();
|
||||
let config = this._config;
|
||||
let errData = '';
|
||||
let shStdio;
|
||||
let handleStdoutData = function (data) {
|
||||
self.emit('stdout', data);
|
||||
};
|
||||
let handleStderrData = function (data) {
|
||||
let d = data.toString();
|
||||
self.emit('stderr', data);
|
||||
// Accumulate the error-data so we can use it as the
|
||||
// stack if the process exits with an error
|
||||
errData += d;
|
||||
};
|
||||
|
||||
// Keep running as long as there are commands in the array
|
||||
if (next) {
|
||||
let spawnOpts = {};
|
||||
this.emit('cmdStart', next);
|
||||
|
||||
// Ganking part of Node's child_process.exec to get cmdline args parsed
|
||||
if (process.platform == 'win32') {
|
||||
cmd = 'cmd';
|
||||
args = ['/c', next];
|
||||
if (config.windowsVerbatimArguments) {
|
||||
spawnOpts.windowsVerbatimArguments = true;
|
||||
}
|
||||
}
|
||||
else {
|
||||
cmd = '/bin/sh';
|
||||
args = ['-c', next];
|
||||
}
|
||||
|
||||
if (config.interactive) {
|
||||
spawnOpts.stdio = 'inherit';
|
||||
sh = spawn(cmd, args, spawnOpts);
|
||||
}
|
||||
else {
|
||||
shStdio = [
|
||||
process.stdin
|
||||
];
|
||||
if (config.printStdout) {
|
||||
shStdio.push(process.stdout);
|
||||
}
|
||||
else {
|
||||
shStdio.push('pipe');
|
||||
}
|
||||
if (config.printStderr) {
|
||||
shStdio.push(process.stderr);
|
||||
}
|
||||
else {
|
||||
shStdio.push('pipe');
|
||||
}
|
||||
spawnOpts.stdio = shStdio;
|
||||
sh = spawn(cmd, args, spawnOpts);
|
||||
if (!config.printStdout) {
|
||||
sh.stdout.addListener('data', handleStdoutData);
|
||||
}
|
||||
if (!config.printStderr) {
|
||||
sh.stderr.addListener('data', handleStderrData);
|
||||
}
|
||||
}
|
||||
|
||||
// Exit, handle err or run next
|
||||
sh.on('exit', function (code) {
|
||||
let msg;
|
||||
if (code !== 0) {
|
||||
msg = errData || 'Process exited with error.';
|
||||
msg = msg.trim();
|
||||
self.emit('error', msg, code);
|
||||
}
|
||||
if (code === 0 || !config.breakOnError) {
|
||||
self.emit('cmdEnd', next);
|
||||
setTimeout(function () { _run.call(self); }, 0);
|
||||
}
|
||||
});
|
||||
|
||||
}
|
||||
else {
|
||||
self.emit('end');
|
||||
if (typeof self._callback == 'function') {
|
||||
self._callback();
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
this.append = function (cmd) {
|
||||
this._cmds.push(cmd);
|
||||
};
|
||||
|
||||
this.run = function () {
|
||||
_run.call(this);
|
||||
};
|
||||
|
||||
})());
|
||||
|
||||
utils.Exec = Exec;
|
||||
utils.file = file;
|
||||
utils.logger = logger;
|
||||
|
||||
module.exports = utils;
|
||||
|
||||
24
32/node_modules/jake/lib/utils/logger.js
generated
vendored
Normal file
24
32/node_modules/jake/lib/utils/logger.js
generated
vendored
Normal file
@@ -0,0 +1,24 @@
|
||||
let util = require('util');
|
||||
|
||||
let logger = new (function () {
|
||||
let _output = function (type, out) {
|
||||
let quiet = typeof jake != 'undefined' && jake.program &&
|
||||
jake.program.opts && jake.program.opts.quiet;
|
||||
let msg;
|
||||
if (!quiet) {
|
||||
msg = typeof out == 'string' ? out : util.inspect(out);
|
||||
console[type](msg);
|
||||
}
|
||||
};
|
||||
|
||||
this.log = function (out) {
|
||||
_output('log', out);
|
||||
};
|
||||
|
||||
this.error = function (out) {
|
||||
_output('error', out);
|
||||
};
|
||||
|
||||
})();
|
||||
|
||||
module.exports = logger;
|
||||
21
32/node_modules/jake/node_modules/brace-expansion/LICENSE
generated
vendored
Normal file
21
32/node_modules/jake/node_modules/brace-expansion/LICENSE
generated
vendored
Normal file
@@ -0,0 +1,21 @@
|
||||
MIT License
|
||||
|
||||
Copyright (c) 2013 Julian Gruber <julian@juliangruber.com>
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to deal
|
||||
in the Software without restriction, including without limitation the rights
|
||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
copies of the Software, and to permit persons to whom the Software is
|
||||
furnished to do so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in all
|
||||
copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
SOFTWARE.
|
||||
129
32/node_modules/jake/node_modules/brace-expansion/README.md
generated
vendored
Normal file
129
32/node_modules/jake/node_modules/brace-expansion/README.md
generated
vendored
Normal file
@@ -0,0 +1,129 @@
|
||||
# brace-expansion
|
||||
|
||||
[Brace expansion](https://www.gnu.org/software/bash/manual/html_node/Brace-Expansion.html),
|
||||
as known from sh/bash, in JavaScript.
|
||||
|
||||
[](http://travis-ci.org/juliangruber/brace-expansion)
|
||||
[](https://www.npmjs.org/package/brace-expansion)
|
||||
[](https://greenkeeper.io/)
|
||||
|
||||
[](https://ci.testling.com/juliangruber/brace-expansion)
|
||||
|
||||
## Example
|
||||
|
||||
```js
|
||||
var expand = require('brace-expansion');
|
||||
|
||||
expand('file-{a,b,c}.jpg')
|
||||
// => ['file-a.jpg', 'file-b.jpg', 'file-c.jpg']
|
||||
|
||||
expand('-v{,,}')
|
||||
// => ['-v', '-v', '-v']
|
||||
|
||||
expand('file{0..2}.jpg')
|
||||
// => ['file0.jpg', 'file1.jpg', 'file2.jpg']
|
||||
|
||||
expand('file-{a..c}.jpg')
|
||||
// => ['file-a.jpg', 'file-b.jpg', 'file-c.jpg']
|
||||
|
||||
expand('file{2..0}.jpg')
|
||||
// => ['file2.jpg', 'file1.jpg', 'file0.jpg']
|
||||
|
||||
expand('file{0..4..2}.jpg')
|
||||
// => ['file0.jpg', 'file2.jpg', 'file4.jpg']
|
||||
|
||||
expand('file-{a..e..2}.jpg')
|
||||
// => ['file-a.jpg', 'file-c.jpg', 'file-e.jpg']
|
||||
|
||||
expand('file{00..10..5}.jpg')
|
||||
// => ['file00.jpg', 'file05.jpg', 'file10.jpg']
|
||||
|
||||
expand('{{A..C},{a..c}}')
|
||||
// => ['A', 'B', 'C', 'a', 'b', 'c']
|
||||
|
||||
expand('ppp{,config,oe{,conf}}')
|
||||
// => ['ppp', 'pppconfig', 'pppoe', 'pppoeconf']
|
||||
```
|
||||
|
||||
## API
|
||||
|
||||
```js
|
||||
var expand = require('brace-expansion');
|
||||
```
|
||||
|
||||
### var expanded = expand(str)
|
||||
|
||||
Return an array of all possible and valid expansions of `str`. If none are
|
||||
found, `[str]` is returned.
|
||||
|
||||
Valid expansions are:
|
||||
|
||||
```js
|
||||
/^(.*,)+(.+)?$/
|
||||
// {a,b,...}
|
||||
```
|
||||
|
||||
A comma separated list of options, like `{a,b}` or `{a,{b,c}}` or `{,a,}`.
|
||||
|
||||
```js
|
||||
/^-?\d+\.\.-?\d+(\.\.-?\d+)?$/
|
||||
// {x..y[..incr]}
|
||||
```
|
||||
|
||||
A numeric sequence from `x` to `y` inclusive, with optional increment.
|
||||
If `x` or `y` start with a leading `0`, all the numbers will be padded
|
||||
to have equal length. Negative numbers and backwards iteration work too.
|
||||
|
||||
```js
|
||||
/^-?\d+\.\.-?\d+(\.\.-?\d+)?$/
|
||||
// {x..y[..incr]}
|
||||
```
|
||||
|
||||
An alphabetic sequence from `x` to `y` inclusive, with optional increment.
|
||||
`x` and `y` must be exactly one character, and if given, `incr` must be a
|
||||
number.
|
||||
|
||||
For compatibility reasons, the string `${` is not eligible for brace expansion.
|
||||
|
||||
## Installation
|
||||
|
||||
With [npm](https://npmjs.org) do:
|
||||
|
||||
```bash
|
||||
npm install brace-expansion
|
||||
```
|
||||
|
||||
## Contributors
|
||||
|
||||
- [Julian Gruber](https://github.com/juliangruber)
|
||||
- [Isaac Z. Schlueter](https://github.com/isaacs)
|
||||
|
||||
## Sponsors
|
||||
|
||||
This module is proudly supported by my [Sponsors](https://github.com/juliangruber/sponsors)!
|
||||
|
||||
Do you want to support modules like this to improve their quality, stability and weigh in on new features? Then please consider donating to my [Patreon](https://www.patreon.com/juliangruber). Not sure how much of my modules you're using? Try [feross/thanks](https://github.com/feross/thanks)!
|
||||
|
||||
## License
|
||||
|
||||
(MIT)
|
||||
|
||||
Copyright (c) 2013 Julian Gruber <julian@juliangruber.com>
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy of
|
||||
this software and associated documentation files (the "Software"), to deal in
|
||||
the Software without restriction, including without limitation the rights to
|
||||
use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
|
||||
of the Software, and to permit persons to whom the Software is furnished to do
|
||||
so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in all
|
||||
copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
SOFTWARE.
|
||||
201
32/node_modules/jake/node_modules/brace-expansion/index.js
generated
vendored
Normal file
201
32/node_modules/jake/node_modules/brace-expansion/index.js
generated
vendored
Normal file
@@ -0,0 +1,201 @@
|
||||
var concatMap = require('concat-map');
|
||||
var balanced = require('balanced-match');
|
||||
|
||||
module.exports = expandTop;
|
||||
|
||||
var escSlash = '\0SLASH'+Math.random()+'\0';
|
||||
var escOpen = '\0OPEN'+Math.random()+'\0';
|
||||
var escClose = '\0CLOSE'+Math.random()+'\0';
|
||||
var escComma = '\0COMMA'+Math.random()+'\0';
|
||||
var escPeriod = '\0PERIOD'+Math.random()+'\0';
|
||||
|
||||
function numeric(str) {
|
||||
return parseInt(str, 10) == str
|
||||
? parseInt(str, 10)
|
||||
: str.charCodeAt(0);
|
||||
}
|
||||
|
||||
function escapeBraces(str) {
|
||||
return str.split('\\\\').join(escSlash)
|
||||
.split('\\{').join(escOpen)
|
||||
.split('\\}').join(escClose)
|
||||
.split('\\,').join(escComma)
|
||||
.split('\\.').join(escPeriod);
|
||||
}
|
||||
|
||||
function unescapeBraces(str) {
|
||||
return str.split(escSlash).join('\\')
|
||||
.split(escOpen).join('{')
|
||||
.split(escClose).join('}')
|
||||
.split(escComma).join(',')
|
||||
.split(escPeriod).join('.');
|
||||
}
|
||||
|
||||
|
||||
// Basically just str.split(","), but handling cases
|
||||
// where we have nested braced sections, which should be
|
||||
// treated as individual members, like {a,{b,c},d}
|
||||
function parseCommaParts(str) {
|
||||
if (!str)
|
||||
return [''];
|
||||
|
||||
var parts = [];
|
||||
var m = balanced('{', '}', str);
|
||||
|
||||
if (!m)
|
||||
return str.split(',');
|
||||
|
||||
var pre = m.pre;
|
||||
var body = m.body;
|
||||
var post = m.post;
|
||||
var p = pre.split(',');
|
||||
|
||||
p[p.length-1] += '{' + body + '}';
|
||||
var postParts = parseCommaParts(post);
|
||||
if (post.length) {
|
||||
p[p.length-1] += postParts.shift();
|
||||
p.push.apply(p, postParts);
|
||||
}
|
||||
|
||||
parts.push.apply(parts, p);
|
||||
|
||||
return parts;
|
||||
}
|
||||
|
||||
function expandTop(str) {
|
||||
if (!str)
|
||||
return [];
|
||||
|
||||
// I don't know why Bash 4.3 does this, but it does.
|
||||
// Anything starting with {} will have the first two bytes preserved
|
||||
// but *only* at the top level, so {},a}b will not expand to anything,
|
||||
// but a{},b}c will be expanded to [a}c,abc].
|
||||
// One could argue that this is a bug in Bash, but since the goal of
|
||||
// this module is to match Bash's rules, we escape a leading {}
|
||||
if (str.substr(0, 2) === '{}') {
|
||||
str = '\\{\\}' + str.substr(2);
|
||||
}
|
||||
|
||||
return expand(escapeBraces(str), true).map(unescapeBraces);
|
||||
}
|
||||
|
||||
function identity(e) {
|
||||
return e;
|
||||
}
|
||||
|
||||
function embrace(str) {
|
||||
return '{' + str + '}';
|
||||
}
|
||||
function isPadded(el) {
|
||||
return /^-?0\d/.test(el);
|
||||
}
|
||||
|
||||
function lte(i, y) {
|
||||
return i <= y;
|
||||
}
|
||||
function gte(i, y) {
|
||||
return i >= y;
|
||||
}
|
||||
|
||||
function expand(str, isTop) {
|
||||
var expansions = [];
|
||||
|
||||
var m = balanced('{', '}', str);
|
||||
if (!m || /\$$/.test(m.pre)) return [str];
|
||||
|
||||
var isNumericSequence = /^-?\d+\.\.-?\d+(?:\.\.-?\d+)?$/.test(m.body);
|
||||
var isAlphaSequence = /^[a-zA-Z]\.\.[a-zA-Z](?:\.\.-?\d+)?$/.test(m.body);
|
||||
var isSequence = isNumericSequence || isAlphaSequence;
|
||||
var isOptions = m.body.indexOf(',') >= 0;
|
||||
if (!isSequence && !isOptions) {
|
||||
// {a},b}
|
||||
if (m.post.match(/,.*\}/)) {
|
||||
str = m.pre + '{' + m.body + escClose + m.post;
|
||||
return expand(str);
|
||||
}
|
||||
return [str];
|
||||
}
|
||||
|
||||
var n;
|
||||
if (isSequence) {
|
||||
n = m.body.split(/\.\./);
|
||||
} else {
|
||||
n = parseCommaParts(m.body);
|
||||
if (n.length === 1) {
|
||||
// x{{a,b}}y ==> x{a}y x{b}y
|
||||
n = expand(n[0], false).map(embrace);
|
||||
if (n.length === 1) {
|
||||
var post = m.post.length
|
||||
? expand(m.post, false)
|
||||
: [''];
|
||||
return post.map(function(p) {
|
||||
return m.pre + n[0] + p;
|
||||
});
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// at this point, n is the parts, and we know it's not a comma set
|
||||
// with a single entry.
|
||||
|
||||
// no need to expand pre, since it is guaranteed to be free of brace-sets
|
||||
var pre = m.pre;
|
||||
var post = m.post.length
|
||||
? expand(m.post, false)
|
||||
: [''];
|
||||
|
||||
var N;
|
||||
|
||||
if (isSequence) {
|
||||
var x = numeric(n[0]);
|
||||
var y = numeric(n[1]);
|
||||
var width = Math.max(n[0].length, n[1].length)
|
||||
var incr = n.length == 3
|
||||
? Math.abs(numeric(n[2]))
|
||||
: 1;
|
||||
var test = lte;
|
||||
var reverse = y < x;
|
||||
if (reverse) {
|
||||
incr *= -1;
|
||||
test = gte;
|
||||
}
|
||||
var pad = n.some(isPadded);
|
||||
|
||||
N = [];
|
||||
|
||||
for (var i = x; test(i, y); i += incr) {
|
||||
var c;
|
||||
if (isAlphaSequence) {
|
||||
c = String.fromCharCode(i);
|
||||
if (c === '\\')
|
||||
c = '';
|
||||
} else {
|
||||
c = String(i);
|
||||
if (pad) {
|
||||
var need = width - c.length;
|
||||
if (need > 0) {
|
||||
var z = new Array(need + 1).join('0');
|
||||
if (i < 0)
|
||||
c = '-' + z + c.slice(1);
|
||||
else
|
||||
c = z + c;
|
||||
}
|
||||
}
|
||||
}
|
||||
N.push(c);
|
||||
}
|
||||
} else {
|
||||
N = concatMap(n, function(el) { return expand(el, false) });
|
||||
}
|
||||
|
||||
for (var j = 0; j < N.length; j++) {
|
||||
for (var k = 0; k < post.length; k++) {
|
||||
var expansion = pre + N[j] + post[k];
|
||||
if (!isTop || isSequence || expansion)
|
||||
expansions.push(expansion);
|
||||
}
|
||||
}
|
||||
|
||||
return expansions;
|
||||
}
|
||||
|
||||
47
32/node_modules/jake/node_modules/brace-expansion/package.json
generated
vendored
Normal file
47
32/node_modules/jake/node_modules/brace-expansion/package.json
generated
vendored
Normal file
@@ -0,0 +1,47 @@
|
||||
{
|
||||
"name": "brace-expansion",
|
||||
"description": "Brace expansion as known from sh/bash",
|
||||
"version": "1.1.11",
|
||||
"repository": {
|
||||
"type": "git",
|
||||
"url": "git://github.com/juliangruber/brace-expansion.git"
|
||||
},
|
||||
"homepage": "https://github.com/juliangruber/brace-expansion",
|
||||
"main": "index.js",
|
||||
"scripts": {
|
||||
"test": "tape test/*.js",
|
||||
"gentest": "bash test/generate.sh",
|
||||
"bench": "matcha test/perf/bench.js"
|
||||
},
|
||||
"dependencies": {
|
||||
"balanced-match": "^1.0.0",
|
||||
"concat-map": "0.0.1"
|
||||
},
|
||||
"devDependencies": {
|
||||
"matcha": "^0.7.0",
|
||||
"tape": "^4.6.0"
|
||||
},
|
||||
"keywords": [],
|
||||
"author": {
|
||||
"name": "Julian Gruber",
|
||||
"email": "mail@juliangruber.com",
|
||||
"url": "http://juliangruber.com"
|
||||
},
|
||||
"license": "MIT",
|
||||
"testling": {
|
||||
"files": "test/*.js",
|
||||
"browsers": [
|
||||
"ie/8..latest",
|
||||
"firefox/20..latest",
|
||||
"firefox/nightly",
|
||||
"chrome/25..latest",
|
||||
"chrome/canary",
|
||||
"opera/12..latest",
|
||||
"opera/next",
|
||||
"safari/5.1..latest",
|
||||
"ipad/6.0..latest",
|
||||
"iphone/6.0..latest",
|
||||
"android-browser/4.2..latest"
|
||||
]
|
||||
}
|
||||
}
|
||||
15
32/node_modules/jake/node_modules/minimatch/LICENSE
generated
vendored
Normal file
15
32/node_modules/jake/node_modules/minimatch/LICENSE
generated
vendored
Normal file
@@ -0,0 +1,15 @@
|
||||
The ISC License
|
||||
|
||||
Copyright (c) Isaac Z. Schlueter and Contributors
|
||||
|
||||
Permission to use, copy, modify, and/or distribute this software for any
|
||||
purpose with or without fee is hereby granted, provided that the above
|
||||
copyright notice and this permission notice appear in all copies.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
|
||||
WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
|
||||
MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
|
||||
ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
|
||||
WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
|
||||
ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR
|
||||
IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
||||
230
32/node_modules/jake/node_modules/minimatch/README.md
generated
vendored
Normal file
230
32/node_modules/jake/node_modules/minimatch/README.md
generated
vendored
Normal file
@@ -0,0 +1,230 @@
|
||||
# minimatch
|
||||
|
||||
A minimal matching utility.
|
||||
|
||||
[](http://travis-ci.org/isaacs/minimatch)
|
||||
|
||||
|
||||
This is the matching library used internally by npm.
|
||||
|
||||
It works by converting glob expressions into JavaScript `RegExp`
|
||||
objects.
|
||||
|
||||
## Usage
|
||||
|
||||
```javascript
|
||||
var minimatch = require("minimatch")
|
||||
|
||||
minimatch("bar.foo", "*.foo") // true!
|
||||
minimatch("bar.foo", "*.bar") // false!
|
||||
minimatch("bar.foo", "*.+(bar|foo)", { debug: true }) // true, and noisy!
|
||||
```
|
||||
|
||||
## Features
|
||||
|
||||
Supports these glob features:
|
||||
|
||||
* Brace Expansion
|
||||
* Extended glob matching
|
||||
* "Globstar" `**` matching
|
||||
|
||||
See:
|
||||
|
||||
* `man sh`
|
||||
* `man bash`
|
||||
* `man 3 fnmatch`
|
||||
* `man 5 gitignore`
|
||||
|
||||
## Minimatch Class
|
||||
|
||||
Create a minimatch object by instantiating the `minimatch.Minimatch` class.
|
||||
|
||||
```javascript
|
||||
var Minimatch = require("minimatch").Minimatch
|
||||
var mm = new Minimatch(pattern, options)
|
||||
```
|
||||
|
||||
### Properties
|
||||
|
||||
* `pattern` The original pattern the minimatch object represents.
|
||||
* `options` The options supplied to the constructor.
|
||||
* `set` A 2-dimensional array of regexp or string expressions.
|
||||
Each row in the
|
||||
array corresponds to a brace-expanded pattern. Each item in the row
|
||||
corresponds to a single path-part. For example, the pattern
|
||||
`{a,b/c}/d` would expand to a set of patterns like:
|
||||
|
||||
[ [ a, d ]
|
||||
, [ b, c, d ] ]
|
||||
|
||||
If a portion of the pattern doesn't have any "magic" in it
|
||||
(that is, it's something like `"foo"` rather than `fo*o?`), then it
|
||||
will be left as a string rather than converted to a regular
|
||||
expression.
|
||||
|
||||
* `regexp` Created by the `makeRe` method. A single regular expression
|
||||
expressing the entire pattern. This is useful in cases where you wish
|
||||
to use the pattern somewhat like `fnmatch(3)` with `FNM_PATH` enabled.
|
||||
* `negate` True if the pattern is negated.
|
||||
* `comment` True if the pattern is a comment.
|
||||
* `empty` True if the pattern is `""`.
|
||||
|
||||
### Methods
|
||||
|
||||
* `makeRe` Generate the `regexp` member if necessary, and return it.
|
||||
Will return `false` if the pattern is invalid.
|
||||
* `match(fname)` Return true if the filename matches the pattern, or
|
||||
false otherwise.
|
||||
* `matchOne(fileArray, patternArray, partial)` Take a `/`-split
|
||||
filename, and match it against a single row in the `regExpSet`. This
|
||||
method is mainly for internal use, but is exposed so that it can be
|
||||
used by a glob-walker that needs to avoid excessive filesystem calls.
|
||||
|
||||
All other methods are internal, and will be called as necessary.
|
||||
|
||||
### minimatch(path, pattern, options)
|
||||
|
||||
Main export. Tests a path against the pattern using the options.
|
||||
|
||||
```javascript
|
||||
var isJS = minimatch(file, "*.js", { matchBase: true })
|
||||
```
|
||||
|
||||
### minimatch.filter(pattern, options)
|
||||
|
||||
Returns a function that tests its
|
||||
supplied argument, suitable for use with `Array.filter`. Example:
|
||||
|
||||
```javascript
|
||||
var javascripts = fileList.filter(minimatch.filter("*.js", {matchBase: true}))
|
||||
```
|
||||
|
||||
### minimatch.match(list, pattern, options)
|
||||
|
||||
Match against the list of
|
||||
files, in the style of fnmatch or glob. If nothing is matched, and
|
||||
options.nonull is set, then return a list containing the pattern itself.
|
||||
|
||||
```javascript
|
||||
var javascripts = minimatch.match(fileList, "*.js", {matchBase: true}))
|
||||
```
|
||||
|
||||
### minimatch.makeRe(pattern, options)
|
||||
|
||||
Make a regular expression object from the pattern.
|
||||
|
||||
## Options
|
||||
|
||||
All options are `false` by default.
|
||||
|
||||
### debug
|
||||
|
||||
Dump a ton of stuff to stderr.
|
||||
|
||||
### nobrace
|
||||
|
||||
Do not expand `{a,b}` and `{1..3}` brace sets.
|
||||
|
||||
### noglobstar
|
||||
|
||||
Disable `**` matching against multiple folder names.
|
||||
|
||||
### dot
|
||||
|
||||
Allow patterns to match filenames starting with a period, even if
|
||||
the pattern does not explicitly have a period in that spot.
|
||||
|
||||
Note that by default, `a/**/b` will **not** match `a/.d/b`, unless `dot`
|
||||
is set.
|
||||
|
||||
### noext
|
||||
|
||||
Disable "extglob" style patterns like `+(a|b)`.
|
||||
|
||||
### nocase
|
||||
|
||||
Perform a case-insensitive match.
|
||||
|
||||
### nonull
|
||||
|
||||
When a match is not found by `minimatch.match`, return a list containing
|
||||
the pattern itself if this option is set. When not set, an empty list
|
||||
is returned if there are no matches.
|
||||
|
||||
### matchBase
|
||||
|
||||
If set, then patterns without slashes will be matched
|
||||
against the basename of the path if it contains slashes. For example,
|
||||
`a?b` would match the path `/xyz/123/acb`, but not `/xyz/acb/123`.
|
||||
|
||||
### nocomment
|
||||
|
||||
Suppress the behavior of treating `#` at the start of a pattern as a
|
||||
comment.
|
||||
|
||||
### nonegate
|
||||
|
||||
Suppress the behavior of treating a leading `!` character as negation.
|
||||
|
||||
### flipNegate
|
||||
|
||||
Returns from negate expressions the same as if they were not negated.
|
||||
(Ie, true on a hit, false on a miss.)
|
||||
|
||||
### partial
|
||||
|
||||
Compare a partial path to a pattern. As long as the parts of the path that
|
||||
are present are not contradicted by the pattern, it will be treated as a
|
||||
match. This is useful in applications where you're walking through a
|
||||
folder structure, and don't yet have the full path, but want to ensure that
|
||||
you do not walk down paths that can never be a match.
|
||||
|
||||
For example,
|
||||
|
||||
```js
|
||||
minimatch('/a/b', '/a/*/c/d', { partial: true }) // true, might be /a/b/c/d
|
||||
minimatch('/a/b', '/**/d', { partial: true }) // true, might be /a/b/.../d
|
||||
minimatch('/x/y/z', '/a/**/z', { partial: true }) // false, because x !== a
|
||||
```
|
||||
|
||||
### allowWindowsEscape
|
||||
|
||||
Windows path separator `\` is by default converted to `/`, which
|
||||
prohibits the usage of `\` as a escape character. This flag skips that
|
||||
behavior and allows using the escape character.
|
||||
|
||||
## Comparisons to other fnmatch/glob implementations
|
||||
|
||||
While strict compliance with the existing standards is a worthwhile
|
||||
goal, some discrepancies exist between minimatch and other
|
||||
implementations, and are intentional.
|
||||
|
||||
If the pattern starts with a `!` character, then it is negated. Set the
|
||||
`nonegate` flag to suppress this behavior, and treat leading `!`
|
||||
characters normally. This is perhaps relevant if you wish to start the
|
||||
pattern with a negative extglob pattern like `!(a|B)`. Multiple `!`
|
||||
characters at the start of a pattern will negate the pattern multiple
|
||||
times.
|
||||
|
||||
If a pattern starts with `#`, then it is treated as a comment, and
|
||||
will not match anything. Use `\#` to match a literal `#` at the
|
||||
start of a line, or set the `nocomment` flag to suppress this behavior.
|
||||
|
||||
The double-star character `**` is supported by default, unless the
|
||||
`noglobstar` flag is set. This is supported in the manner of bsdglob
|
||||
and bash 4.1, where `**` only has special significance if it is the only
|
||||
thing in a path part. That is, `a/**/b` will match `a/x/y/b`, but
|
||||
`a/**b` will not.
|
||||
|
||||
If an escaped pattern has no matches, and the `nonull` flag is set,
|
||||
then minimatch.match returns the pattern as-provided, rather than
|
||||
interpreting the character escapes. For example,
|
||||
`minimatch.match([], "\\*a\\?")` will return `"\\*a\\?"` rather than
|
||||
`"*a?"`. This is akin to setting the `nullglob` option in bash, except
|
||||
that it does not resolve escaped pattern characters.
|
||||
|
||||
If brace expansion is not disabled, then it is performed before any
|
||||
other interpretation of the glob pattern. Thus, a pattern like
|
||||
`+(a|{b),c)}`, which would not be valid in bash or zsh, is expanded
|
||||
**first** into the set of `+(a|b)` and `+(a|c)`, and those patterns are
|
||||
checked for validity. Since those two are valid, matching proceeds.
|
||||
947
32/node_modules/jake/node_modules/minimatch/minimatch.js
generated
vendored
Normal file
947
32/node_modules/jake/node_modules/minimatch/minimatch.js
generated
vendored
Normal file
@@ -0,0 +1,947 @@
|
||||
module.exports = minimatch
|
||||
minimatch.Minimatch = Minimatch
|
||||
|
||||
var path = (function () { try { return require('path') } catch (e) {}}()) || {
|
||||
sep: '/'
|
||||
}
|
||||
minimatch.sep = path.sep
|
||||
|
||||
var GLOBSTAR = minimatch.GLOBSTAR = Minimatch.GLOBSTAR = {}
|
||||
var expand = require('brace-expansion')
|
||||
|
||||
var plTypes = {
|
||||
'!': { open: '(?:(?!(?:', close: '))[^/]*?)'},
|
||||
'?': { open: '(?:', close: ')?' },
|
||||
'+': { open: '(?:', close: ')+' },
|
||||
'*': { open: '(?:', close: ')*' },
|
||||
'@': { open: '(?:', close: ')' }
|
||||
}
|
||||
|
||||
// any single thing other than /
|
||||
// don't need to escape / when using new RegExp()
|
||||
var qmark = '[^/]'
|
||||
|
||||
// * => any number of characters
|
||||
var star = qmark + '*?'
|
||||
|
||||
// ** when dots are allowed. Anything goes, except .. and .
|
||||
// not (^ or / followed by one or two dots followed by $ or /),
|
||||
// followed by anything, any number of times.
|
||||
var twoStarDot = '(?:(?!(?:\\\/|^)(?:\\.{1,2})($|\\\/)).)*?'
|
||||
|
||||
// not a ^ or / followed by a dot,
|
||||
// followed by anything, any number of times.
|
||||
var twoStarNoDot = '(?:(?!(?:\\\/|^)\\.).)*?'
|
||||
|
||||
// characters that need to be escaped in RegExp.
|
||||
var reSpecials = charSet('().*{}+?[]^$\\!')
|
||||
|
||||
// "abc" -> { a:true, b:true, c:true }
|
||||
function charSet (s) {
|
||||
return s.split('').reduce(function (set, c) {
|
||||
set[c] = true
|
||||
return set
|
||||
}, {})
|
||||
}
|
||||
|
||||
// normalizes slashes.
|
||||
var slashSplit = /\/+/
|
||||
|
||||
minimatch.filter = filter
|
||||
function filter (pattern, options) {
|
||||
options = options || {}
|
||||
return function (p, i, list) {
|
||||
return minimatch(p, pattern, options)
|
||||
}
|
||||
}
|
||||
|
||||
function ext (a, b) {
|
||||
b = b || {}
|
||||
var t = {}
|
||||
Object.keys(a).forEach(function (k) {
|
||||
t[k] = a[k]
|
||||
})
|
||||
Object.keys(b).forEach(function (k) {
|
||||
t[k] = b[k]
|
||||
})
|
||||
return t
|
||||
}
|
||||
|
||||
minimatch.defaults = function (def) {
|
||||
if (!def || typeof def !== 'object' || !Object.keys(def).length) {
|
||||
return minimatch
|
||||
}
|
||||
|
||||
var orig = minimatch
|
||||
|
||||
var m = function minimatch (p, pattern, options) {
|
||||
return orig(p, pattern, ext(def, options))
|
||||
}
|
||||
|
||||
m.Minimatch = function Minimatch (pattern, options) {
|
||||
return new orig.Minimatch(pattern, ext(def, options))
|
||||
}
|
||||
m.Minimatch.defaults = function defaults (options) {
|
||||
return orig.defaults(ext(def, options)).Minimatch
|
||||
}
|
||||
|
||||
m.filter = function filter (pattern, options) {
|
||||
return orig.filter(pattern, ext(def, options))
|
||||
}
|
||||
|
||||
m.defaults = function defaults (options) {
|
||||
return orig.defaults(ext(def, options))
|
||||
}
|
||||
|
||||
m.makeRe = function makeRe (pattern, options) {
|
||||
return orig.makeRe(pattern, ext(def, options))
|
||||
}
|
||||
|
||||
m.braceExpand = function braceExpand (pattern, options) {
|
||||
return orig.braceExpand(pattern, ext(def, options))
|
||||
}
|
||||
|
||||
m.match = function (list, pattern, options) {
|
||||
return orig.match(list, pattern, ext(def, options))
|
||||
}
|
||||
|
||||
return m
|
||||
}
|
||||
|
||||
Minimatch.defaults = function (def) {
|
||||
return minimatch.defaults(def).Minimatch
|
||||
}
|
||||
|
||||
function minimatch (p, pattern, options) {
|
||||
assertValidPattern(pattern)
|
||||
|
||||
if (!options) options = {}
|
||||
|
||||
// shortcut: comments match nothing.
|
||||
if (!options.nocomment && pattern.charAt(0) === '#') {
|
||||
return false
|
||||
}
|
||||
|
||||
return new Minimatch(pattern, options).match(p)
|
||||
}
|
||||
|
||||
function Minimatch (pattern, options) {
|
||||
if (!(this instanceof Minimatch)) {
|
||||
return new Minimatch(pattern, options)
|
||||
}
|
||||
|
||||
assertValidPattern(pattern)
|
||||
|
||||
if (!options) options = {}
|
||||
|
||||
pattern = pattern.trim()
|
||||
|
||||
// windows support: need to use /, not \
|
||||
if (!options.allowWindowsEscape && path.sep !== '/') {
|
||||
pattern = pattern.split(path.sep).join('/')
|
||||
}
|
||||
|
||||
this.options = options
|
||||
this.set = []
|
||||
this.pattern = pattern
|
||||
this.regexp = null
|
||||
this.negate = false
|
||||
this.comment = false
|
||||
this.empty = false
|
||||
this.partial = !!options.partial
|
||||
|
||||
// make the set of regexps etc.
|
||||
this.make()
|
||||
}
|
||||
|
||||
Minimatch.prototype.debug = function () {}
|
||||
|
||||
Minimatch.prototype.make = make
|
||||
function make () {
|
||||
var pattern = this.pattern
|
||||
var options = this.options
|
||||
|
||||
// empty patterns and comments match nothing.
|
||||
if (!options.nocomment && pattern.charAt(0) === '#') {
|
||||
this.comment = true
|
||||
return
|
||||
}
|
||||
if (!pattern) {
|
||||
this.empty = true
|
||||
return
|
||||
}
|
||||
|
||||
// step 1: figure out negation, etc.
|
||||
this.parseNegate()
|
||||
|
||||
// step 2: expand braces
|
||||
var set = this.globSet = this.braceExpand()
|
||||
|
||||
if (options.debug) this.debug = function debug() { console.error.apply(console, arguments) }
|
||||
|
||||
this.debug(this.pattern, set)
|
||||
|
||||
// step 3: now we have a set, so turn each one into a series of path-portion
|
||||
// matching patterns.
|
||||
// These will be regexps, except in the case of "**", which is
|
||||
// set to the GLOBSTAR object for globstar behavior,
|
||||
// and will not contain any / characters
|
||||
set = this.globParts = set.map(function (s) {
|
||||
return s.split(slashSplit)
|
||||
})
|
||||
|
||||
this.debug(this.pattern, set)
|
||||
|
||||
// glob --> regexps
|
||||
set = set.map(function (s, si, set) {
|
||||
return s.map(this.parse, this)
|
||||
}, this)
|
||||
|
||||
this.debug(this.pattern, set)
|
||||
|
||||
// filter out everything that didn't compile properly.
|
||||
set = set.filter(function (s) {
|
||||
return s.indexOf(false) === -1
|
||||
})
|
||||
|
||||
this.debug(this.pattern, set)
|
||||
|
||||
this.set = set
|
||||
}
|
||||
|
||||
Minimatch.prototype.parseNegate = parseNegate
|
||||
function parseNegate () {
|
||||
var pattern = this.pattern
|
||||
var negate = false
|
||||
var options = this.options
|
||||
var negateOffset = 0
|
||||
|
||||
if (options.nonegate) return
|
||||
|
||||
for (var i = 0, l = pattern.length
|
||||
; i < l && pattern.charAt(i) === '!'
|
||||
; i++) {
|
||||
negate = !negate
|
||||
negateOffset++
|
||||
}
|
||||
|
||||
if (negateOffset) this.pattern = pattern.substr(negateOffset)
|
||||
this.negate = negate
|
||||
}
|
||||
|
||||
// Brace expansion:
|
||||
// a{b,c}d -> abd acd
|
||||
// a{b,}c -> abc ac
|
||||
// a{0..3}d -> a0d a1d a2d a3d
|
||||
// a{b,c{d,e}f}g -> abg acdfg acefg
|
||||
// a{b,c}d{e,f}g -> abdeg acdeg abdeg abdfg
|
||||
//
|
||||
// Invalid sets are not expanded.
|
||||
// a{2..}b -> a{2..}b
|
||||
// a{b}c -> a{b}c
|
||||
minimatch.braceExpand = function (pattern, options) {
|
||||
return braceExpand(pattern, options)
|
||||
}
|
||||
|
||||
Minimatch.prototype.braceExpand = braceExpand
|
||||
|
||||
function braceExpand (pattern, options) {
|
||||
if (!options) {
|
||||
if (this instanceof Minimatch) {
|
||||
options = this.options
|
||||
} else {
|
||||
options = {}
|
||||
}
|
||||
}
|
||||
|
||||
pattern = typeof pattern === 'undefined'
|
||||
? this.pattern : pattern
|
||||
|
||||
assertValidPattern(pattern)
|
||||
|
||||
// Thanks to Yeting Li <https://github.com/yetingli> for
|
||||
// improving this regexp to avoid a ReDOS vulnerability.
|
||||
if (options.nobrace || !/\{(?:(?!\{).)*\}/.test(pattern)) {
|
||||
// shortcut. no need to expand.
|
||||
return [pattern]
|
||||
}
|
||||
|
||||
return expand(pattern)
|
||||
}
|
||||
|
||||
var MAX_PATTERN_LENGTH = 1024 * 64
|
||||
var assertValidPattern = function (pattern) {
|
||||
if (typeof pattern !== 'string') {
|
||||
throw new TypeError('invalid pattern')
|
||||
}
|
||||
|
||||
if (pattern.length > MAX_PATTERN_LENGTH) {
|
||||
throw new TypeError('pattern is too long')
|
||||
}
|
||||
}
|
||||
|
||||
// parse a component of the expanded set.
|
||||
// At this point, no pattern may contain "/" in it
|
||||
// so we're going to return a 2d array, where each entry is the full
|
||||
// pattern, split on '/', and then turned into a regular expression.
|
||||
// A regexp is made at the end which joins each array with an
|
||||
// escaped /, and another full one which joins each regexp with |.
|
||||
//
|
||||
// Following the lead of Bash 4.1, note that "**" only has special meaning
|
||||
// when it is the *only* thing in a path portion. Otherwise, any series
|
||||
// of * is equivalent to a single *. Globstar behavior is enabled by
|
||||
// default, and can be disabled by setting options.noglobstar.
|
||||
Minimatch.prototype.parse = parse
|
||||
var SUBPARSE = {}
|
||||
function parse (pattern, isSub) {
|
||||
assertValidPattern(pattern)
|
||||
|
||||
var options = this.options
|
||||
|
||||
// shortcuts
|
||||
if (pattern === '**') {
|
||||
if (!options.noglobstar)
|
||||
return GLOBSTAR
|
||||
else
|
||||
pattern = '*'
|
||||
}
|
||||
if (pattern === '') return ''
|
||||
|
||||
var re = ''
|
||||
var hasMagic = !!options.nocase
|
||||
var escaping = false
|
||||
// ? => one single character
|
||||
var patternListStack = []
|
||||
var negativeLists = []
|
||||
var stateChar
|
||||
var inClass = false
|
||||
var reClassStart = -1
|
||||
var classStart = -1
|
||||
// . and .. never match anything that doesn't start with .,
|
||||
// even when options.dot is set.
|
||||
var patternStart = pattern.charAt(0) === '.' ? '' // anything
|
||||
// not (start or / followed by . or .. followed by / or end)
|
||||
: options.dot ? '(?!(?:^|\\\/)\\.{1,2}(?:$|\\\/))'
|
||||
: '(?!\\.)'
|
||||
var self = this
|
||||
|
||||
function clearStateChar () {
|
||||
if (stateChar) {
|
||||
// we had some state-tracking character
|
||||
// that wasn't consumed by this pass.
|
||||
switch (stateChar) {
|
||||
case '*':
|
||||
re += star
|
||||
hasMagic = true
|
||||
break
|
||||
case '?':
|
||||
re += qmark
|
||||
hasMagic = true
|
||||
break
|
||||
default:
|
||||
re += '\\' + stateChar
|
||||
break
|
||||
}
|
||||
self.debug('clearStateChar %j %j', stateChar, re)
|
||||
stateChar = false
|
||||
}
|
||||
}
|
||||
|
||||
for (var i = 0, len = pattern.length, c
|
||||
; (i < len) && (c = pattern.charAt(i))
|
||||
; i++) {
|
||||
this.debug('%s\t%s %s %j', pattern, i, re, c)
|
||||
|
||||
// skip over any that are escaped.
|
||||
if (escaping && reSpecials[c]) {
|
||||
re += '\\' + c
|
||||
escaping = false
|
||||
continue
|
||||
}
|
||||
|
||||
switch (c) {
|
||||
/* istanbul ignore next */
|
||||
case '/': {
|
||||
// completely not allowed, even escaped.
|
||||
// Should already be path-split by now.
|
||||
return false
|
||||
}
|
||||
|
||||
case '\\':
|
||||
clearStateChar()
|
||||
escaping = true
|
||||
continue
|
||||
|
||||
// the various stateChar values
|
||||
// for the "extglob" stuff.
|
||||
case '?':
|
||||
case '*':
|
||||
case '+':
|
||||
case '@':
|
||||
case '!':
|
||||
this.debug('%s\t%s %s %j <-- stateChar', pattern, i, re, c)
|
||||
|
||||
// all of those are literals inside a class, except that
|
||||
// the glob [!a] means [^a] in regexp
|
||||
if (inClass) {
|
||||
this.debug(' in class')
|
||||
if (c === '!' && i === classStart + 1) c = '^'
|
||||
re += c
|
||||
continue
|
||||
}
|
||||
|
||||
// if we already have a stateChar, then it means
|
||||
// that there was something like ** or +? in there.
|
||||
// Handle the stateChar, then proceed with this one.
|
||||
self.debug('call clearStateChar %j', stateChar)
|
||||
clearStateChar()
|
||||
stateChar = c
|
||||
// if extglob is disabled, then +(asdf|foo) isn't a thing.
|
||||
// just clear the statechar *now*, rather than even diving into
|
||||
// the patternList stuff.
|
||||
if (options.noext) clearStateChar()
|
||||
continue
|
||||
|
||||
case '(':
|
||||
if (inClass) {
|
||||
re += '('
|
||||
continue
|
||||
}
|
||||
|
||||
if (!stateChar) {
|
||||
re += '\\('
|
||||
continue
|
||||
}
|
||||
|
||||
patternListStack.push({
|
||||
type: stateChar,
|
||||
start: i - 1,
|
||||
reStart: re.length,
|
||||
open: plTypes[stateChar].open,
|
||||
close: plTypes[stateChar].close
|
||||
})
|
||||
// negation is (?:(?!js)[^/]*)
|
||||
re += stateChar === '!' ? '(?:(?!(?:' : '(?:'
|
||||
this.debug('plType %j %j', stateChar, re)
|
||||
stateChar = false
|
||||
continue
|
||||
|
||||
case ')':
|
||||
if (inClass || !patternListStack.length) {
|
||||
re += '\\)'
|
||||
continue
|
||||
}
|
||||
|
||||
clearStateChar()
|
||||
hasMagic = true
|
||||
var pl = patternListStack.pop()
|
||||
// negation is (?:(?!js)[^/]*)
|
||||
// The others are (?:<pattern>)<type>
|
||||
re += pl.close
|
||||
if (pl.type === '!') {
|
||||
negativeLists.push(pl)
|
||||
}
|
||||
pl.reEnd = re.length
|
||||
continue
|
||||
|
||||
case '|':
|
||||
if (inClass || !patternListStack.length || escaping) {
|
||||
re += '\\|'
|
||||
escaping = false
|
||||
continue
|
||||
}
|
||||
|
||||
clearStateChar()
|
||||
re += '|'
|
||||
continue
|
||||
|
||||
// these are mostly the same in regexp and glob
|
||||
case '[':
|
||||
// swallow any state-tracking char before the [
|
||||
clearStateChar()
|
||||
|
||||
if (inClass) {
|
||||
re += '\\' + c
|
||||
continue
|
||||
}
|
||||
|
||||
inClass = true
|
||||
classStart = i
|
||||
reClassStart = re.length
|
||||
re += c
|
||||
continue
|
||||
|
||||
case ']':
|
||||
// a right bracket shall lose its special
|
||||
// meaning and represent itself in
|
||||
// a bracket expression if it occurs
|
||||
// first in the list. -- POSIX.2 2.8.3.2
|
||||
if (i === classStart + 1 || !inClass) {
|
||||
re += '\\' + c
|
||||
escaping = false
|
||||
continue
|
||||
}
|
||||
|
||||
// handle the case where we left a class open.
|
||||
// "[z-a]" is valid, equivalent to "\[z-a\]"
|
||||
// split where the last [ was, make sure we don't have
|
||||
// an invalid re. if so, re-walk the contents of the
|
||||
// would-be class to re-translate any characters that
|
||||
// were passed through as-is
|
||||
// TODO: It would probably be faster to determine this
|
||||
// without a try/catch and a new RegExp, but it's tricky
|
||||
// to do safely. For now, this is safe and works.
|
||||
var cs = pattern.substring(classStart + 1, i)
|
||||
try {
|
||||
RegExp('[' + cs + ']')
|
||||
} catch (er) {
|
||||
// not a valid class!
|
||||
var sp = this.parse(cs, SUBPARSE)
|
||||
re = re.substr(0, reClassStart) + '\\[' + sp[0] + '\\]'
|
||||
hasMagic = hasMagic || sp[1]
|
||||
inClass = false
|
||||
continue
|
||||
}
|
||||
|
||||
// finish up the class.
|
||||
hasMagic = true
|
||||
inClass = false
|
||||
re += c
|
||||
continue
|
||||
|
||||
default:
|
||||
// swallow any state char that wasn't consumed
|
||||
clearStateChar()
|
||||
|
||||
if (escaping) {
|
||||
// no need
|
||||
escaping = false
|
||||
} else if (reSpecials[c]
|
||||
&& !(c === '^' && inClass)) {
|
||||
re += '\\'
|
||||
}
|
||||
|
||||
re += c
|
||||
|
||||
} // switch
|
||||
} // for
|
||||
|
||||
// handle the case where we left a class open.
|
||||
// "[abc" is valid, equivalent to "\[abc"
|
||||
if (inClass) {
|
||||
// split where the last [ was, and escape it
|
||||
// this is a huge pita. We now have to re-walk
|
||||
// the contents of the would-be class to re-translate
|
||||
// any characters that were passed through as-is
|
||||
cs = pattern.substr(classStart + 1)
|
||||
sp = this.parse(cs, SUBPARSE)
|
||||
re = re.substr(0, reClassStart) + '\\[' + sp[0]
|
||||
hasMagic = hasMagic || sp[1]
|
||||
}
|
||||
|
||||
// handle the case where we had a +( thing at the *end*
|
||||
// of the pattern.
|
||||
// each pattern list stack adds 3 chars, and we need to go through
|
||||
// and escape any | chars that were passed through as-is for the regexp.
|
||||
// Go through and escape them, taking care not to double-escape any
|
||||
// | chars that were already escaped.
|
||||
for (pl = patternListStack.pop(); pl; pl = patternListStack.pop()) {
|
||||
var tail = re.slice(pl.reStart + pl.open.length)
|
||||
this.debug('setting tail', re, pl)
|
||||
// maybe some even number of \, then maybe 1 \, followed by a |
|
||||
tail = tail.replace(/((?:\\{2}){0,64})(\\?)\|/g, function (_, $1, $2) {
|
||||
if (!$2) {
|
||||
// the | isn't already escaped, so escape it.
|
||||
$2 = '\\'
|
||||
}
|
||||
|
||||
// need to escape all those slashes *again*, without escaping the
|
||||
// one that we need for escaping the | character. As it works out,
|
||||
// escaping an even number of slashes can be done by simply repeating
|
||||
// it exactly after itself. That's why this trick works.
|
||||
//
|
||||
// I am sorry that you have to see this.
|
||||
return $1 + $1 + $2 + '|'
|
||||
})
|
||||
|
||||
this.debug('tail=%j\n %s', tail, tail, pl, re)
|
||||
var t = pl.type === '*' ? star
|
||||
: pl.type === '?' ? qmark
|
||||
: '\\' + pl.type
|
||||
|
||||
hasMagic = true
|
||||
re = re.slice(0, pl.reStart) + t + '\\(' + tail
|
||||
}
|
||||
|
||||
// handle trailing things that only matter at the very end.
|
||||
clearStateChar()
|
||||
if (escaping) {
|
||||
// trailing \\
|
||||
re += '\\\\'
|
||||
}
|
||||
|
||||
// only need to apply the nodot start if the re starts with
|
||||
// something that could conceivably capture a dot
|
||||
var addPatternStart = false
|
||||
switch (re.charAt(0)) {
|
||||
case '[': case '.': case '(': addPatternStart = true
|
||||
}
|
||||
|
||||
// Hack to work around lack of negative lookbehind in JS
|
||||
// A pattern like: *.!(x).!(y|z) needs to ensure that a name
|
||||
// like 'a.xyz.yz' doesn't match. So, the first negative
|
||||
// lookahead, has to look ALL the way ahead, to the end of
|
||||
// the pattern.
|
||||
for (var n = negativeLists.length - 1; n > -1; n--) {
|
||||
var nl = negativeLists[n]
|
||||
|
||||
var nlBefore = re.slice(0, nl.reStart)
|
||||
var nlFirst = re.slice(nl.reStart, nl.reEnd - 8)
|
||||
var nlLast = re.slice(nl.reEnd - 8, nl.reEnd)
|
||||
var nlAfter = re.slice(nl.reEnd)
|
||||
|
||||
nlLast += nlAfter
|
||||
|
||||
// Handle nested stuff like *(*.js|!(*.json)), where open parens
|
||||
// mean that we should *not* include the ) in the bit that is considered
|
||||
// "after" the negated section.
|
||||
var openParensBefore = nlBefore.split('(').length - 1
|
||||
var cleanAfter = nlAfter
|
||||
for (i = 0; i < openParensBefore; i++) {
|
||||
cleanAfter = cleanAfter.replace(/\)[+*?]?/, '')
|
||||
}
|
||||
nlAfter = cleanAfter
|
||||
|
||||
var dollar = ''
|
||||
if (nlAfter === '' && isSub !== SUBPARSE) {
|
||||
dollar = '$'
|
||||
}
|
||||
var newRe = nlBefore + nlFirst + nlAfter + dollar + nlLast
|
||||
re = newRe
|
||||
}
|
||||
|
||||
// if the re is not "" at this point, then we need to make sure
|
||||
// it doesn't match against an empty path part.
|
||||
// Otherwise a/* will match a/, which it should not.
|
||||
if (re !== '' && hasMagic) {
|
||||
re = '(?=.)' + re
|
||||
}
|
||||
|
||||
if (addPatternStart) {
|
||||
re = patternStart + re
|
||||
}
|
||||
|
||||
// parsing just a piece of a larger pattern.
|
||||
if (isSub === SUBPARSE) {
|
||||
return [re, hasMagic]
|
||||
}
|
||||
|
||||
// skip the regexp for non-magical patterns
|
||||
// unescape anything in it, though, so that it'll be
|
||||
// an exact match against a file etc.
|
||||
if (!hasMagic) {
|
||||
return globUnescape(pattern)
|
||||
}
|
||||
|
||||
var flags = options.nocase ? 'i' : ''
|
||||
try {
|
||||
var regExp = new RegExp('^' + re + '$', flags)
|
||||
} catch (er) /* istanbul ignore next - should be impossible */ {
|
||||
// If it was an invalid regular expression, then it can't match
|
||||
// anything. This trick looks for a character after the end of
|
||||
// the string, which is of course impossible, except in multi-line
|
||||
// mode, but it's not a /m regex.
|
||||
return new RegExp('$.')
|
||||
}
|
||||
|
||||
regExp._glob = pattern
|
||||
regExp._src = re
|
||||
|
||||
return regExp
|
||||
}
|
||||
|
||||
minimatch.makeRe = function (pattern, options) {
|
||||
return new Minimatch(pattern, options || {}).makeRe()
|
||||
}
|
||||
|
||||
Minimatch.prototype.makeRe = makeRe
|
||||
function makeRe () {
|
||||
if (this.regexp || this.regexp === false) return this.regexp
|
||||
|
||||
// at this point, this.set is a 2d array of partial
|
||||
// pattern strings, or "**".
|
||||
//
|
||||
// It's better to use .match(). This function shouldn't
|
||||
// be used, really, but it's pretty convenient sometimes,
|
||||
// when you just want to work with a regex.
|
||||
var set = this.set
|
||||
|
||||
if (!set.length) {
|
||||
this.regexp = false
|
||||
return this.regexp
|
||||
}
|
||||
var options = this.options
|
||||
|
||||
var twoStar = options.noglobstar ? star
|
||||
: options.dot ? twoStarDot
|
||||
: twoStarNoDot
|
||||
var flags = options.nocase ? 'i' : ''
|
||||
|
||||
var re = set.map(function (pattern) {
|
||||
return pattern.map(function (p) {
|
||||
return (p === GLOBSTAR) ? twoStar
|
||||
: (typeof p === 'string') ? regExpEscape(p)
|
||||
: p._src
|
||||
}).join('\\\/')
|
||||
}).join('|')
|
||||
|
||||
// must match entire pattern
|
||||
// ending in a * or ** will make it less strict.
|
||||
re = '^(?:' + re + ')$'
|
||||
|
||||
// can match anything, as long as it's not this.
|
||||
if (this.negate) re = '^(?!' + re + ').*$'
|
||||
|
||||
try {
|
||||
this.regexp = new RegExp(re, flags)
|
||||
} catch (ex) /* istanbul ignore next - should be impossible */ {
|
||||
this.regexp = false
|
||||
}
|
||||
return this.regexp
|
||||
}
|
||||
|
||||
minimatch.match = function (list, pattern, options) {
|
||||
options = options || {}
|
||||
var mm = new Minimatch(pattern, options)
|
||||
list = list.filter(function (f) {
|
||||
return mm.match(f)
|
||||
})
|
||||
if (mm.options.nonull && !list.length) {
|
||||
list.push(pattern)
|
||||
}
|
||||
return list
|
||||
}
|
||||
|
||||
Minimatch.prototype.match = function match (f, partial) {
|
||||
if (typeof partial === 'undefined') partial = this.partial
|
||||
this.debug('match', f, this.pattern)
|
||||
// short-circuit in the case of busted things.
|
||||
// comments, etc.
|
||||
if (this.comment) return false
|
||||
if (this.empty) return f === ''
|
||||
|
||||
if (f === '/' && partial) return true
|
||||
|
||||
var options = this.options
|
||||
|
||||
// windows: need to use /, not \
|
||||
if (path.sep !== '/') {
|
||||
f = f.split(path.sep).join('/')
|
||||
}
|
||||
|
||||
// treat the test path as a set of pathparts.
|
||||
f = f.split(slashSplit)
|
||||
this.debug(this.pattern, 'split', f)
|
||||
|
||||
// just ONE of the pattern sets in this.set needs to match
|
||||
// in order for it to be valid. If negating, then just one
|
||||
// match means that we have failed.
|
||||
// Either way, return on the first hit.
|
||||
|
||||
var set = this.set
|
||||
this.debug(this.pattern, 'set', set)
|
||||
|
||||
// Find the basename of the path by looking for the last non-empty segment
|
||||
var filename
|
||||
var i
|
||||
for (i = f.length - 1; i >= 0; i--) {
|
||||
filename = f[i]
|
||||
if (filename) break
|
||||
}
|
||||
|
||||
for (i = 0; i < set.length; i++) {
|
||||
var pattern = set[i]
|
||||
var file = f
|
||||
if (options.matchBase && pattern.length === 1) {
|
||||
file = [filename]
|
||||
}
|
||||
var hit = this.matchOne(file, pattern, partial)
|
||||
if (hit) {
|
||||
if (options.flipNegate) return true
|
||||
return !this.negate
|
||||
}
|
||||
}
|
||||
|
||||
// didn't get any hits. this is success if it's a negative
|
||||
// pattern, failure otherwise.
|
||||
if (options.flipNegate) return false
|
||||
return this.negate
|
||||
}
|
||||
|
||||
// set partial to true to test if, for example,
|
||||
// "/a/b" matches the start of "/*/b/*/d"
|
||||
// Partial means, if you run out of file before you run
|
||||
// out of pattern, then that's fine, as long as all
|
||||
// the parts match.
|
||||
Minimatch.prototype.matchOne = function (file, pattern, partial) {
|
||||
var options = this.options
|
||||
|
||||
this.debug('matchOne',
|
||||
{ 'this': this, file: file, pattern: pattern })
|
||||
|
||||
this.debug('matchOne', file.length, pattern.length)
|
||||
|
||||
for (var fi = 0,
|
||||
pi = 0,
|
||||
fl = file.length,
|
||||
pl = pattern.length
|
||||
; (fi < fl) && (pi < pl)
|
||||
; fi++, pi++) {
|
||||
this.debug('matchOne loop')
|
||||
var p = pattern[pi]
|
||||
var f = file[fi]
|
||||
|
||||
this.debug(pattern, p, f)
|
||||
|
||||
// should be impossible.
|
||||
// some invalid regexp stuff in the set.
|
||||
/* istanbul ignore if */
|
||||
if (p === false) return false
|
||||
|
||||
if (p === GLOBSTAR) {
|
||||
this.debug('GLOBSTAR', [pattern, p, f])
|
||||
|
||||
// "**"
|
||||
// a/**/b/**/c would match the following:
|
||||
// a/b/x/y/z/c
|
||||
// a/x/y/z/b/c
|
||||
// a/b/x/b/x/c
|
||||
// a/b/c
|
||||
// To do this, take the rest of the pattern after
|
||||
// the **, and see if it would match the file remainder.
|
||||
// If so, return success.
|
||||
// If not, the ** "swallows" a segment, and try again.
|
||||
// This is recursively awful.
|
||||
//
|
||||
// a/**/b/**/c matching a/b/x/y/z/c
|
||||
// - a matches a
|
||||
// - doublestar
|
||||
// - matchOne(b/x/y/z/c, b/**/c)
|
||||
// - b matches b
|
||||
// - doublestar
|
||||
// - matchOne(x/y/z/c, c) -> no
|
||||
// - matchOne(y/z/c, c) -> no
|
||||
// - matchOne(z/c, c) -> no
|
||||
// - matchOne(c, c) yes, hit
|
||||
var fr = fi
|
||||
var pr = pi + 1
|
||||
if (pr === pl) {
|
||||
this.debug('** at the end')
|
||||
// a ** at the end will just swallow the rest.
|
||||
// We have found a match.
|
||||
// however, it will not swallow /.x, unless
|
||||
// options.dot is set.
|
||||
// . and .. are *never* matched by **, for explosively
|
||||
// exponential reasons.
|
||||
for (; fi < fl; fi++) {
|
||||
if (file[fi] === '.' || file[fi] === '..' ||
|
||||
(!options.dot && file[fi].charAt(0) === '.')) return false
|
||||
}
|
||||
return true
|
||||
}
|
||||
|
||||
// ok, let's see if we can swallow whatever we can.
|
||||
while (fr < fl) {
|
||||
var swallowee = file[fr]
|
||||
|
||||
this.debug('\nglobstar while', file, fr, pattern, pr, swallowee)
|
||||
|
||||
// XXX remove this slice. Just pass the start index.
|
||||
if (this.matchOne(file.slice(fr), pattern.slice(pr), partial)) {
|
||||
this.debug('globstar found match!', fr, fl, swallowee)
|
||||
// found a match.
|
||||
return true
|
||||
} else {
|
||||
// can't swallow "." or ".." ever.
|
||||
// can only swallow ".foo" when explicitly asked.
|
||||
if (swallowee === '.' || swallowee === '..' ||
|
||||
(!options.dot && swallowee.charAt(0) === '.')) {
|
||||
this.debug('dot detected!', file, fr, pattern, pr)
|
||||
break
|
||||
}
|
||||
|
||||
// ** swallows a segment, and continue.
|
||||
this.debug('globstar swallow a segment, and continue')
|
||||
fr++
|
||||
}
|
||||
}
|
||||
|
||||
// no match was found.
|
||||
// However, in partial mode, we can't say this is necessarily over.
|
||||
// If there's more *pattern* left, then
|
||||
/* istanbul ignore if */
|
||||
if (partial) {
|
||||
// ran out of file
|
||||
this.debug('\n>>> no match, partial?', file, fr, pattern, pr)
|
||||
if (fr === fl) return true
|
||||
}
|
||||
return false
|
||||
}
|
||||
|
||||
// something other than **
|
||||
// non-magic patterns just have to match exactly
|
||||
// patterns with magic have been turned into regexps.
|
||||
var hit
|
||||
if (typeof p === 'string') {
|
||||
hit = f === p
|
||||
this.debug('string match', p, f, hit)
|
||||
} else {
|
||||
hit = f.match(p)
|
||||
this.debug('pattern match', p, f, hit)
|
||||
}
|
||||
|
||||
if (!hit) return false
|
||||
}
|
||||
|
||||
// Note: ending in / means that we'll get a final ""
|
||||
// at the end of the pattern. This can only match a
|
||||
// corresponding "" at the end of the file.
|
||||
// If the file ends in /, then it can only match a
|
||||
// a pattern that ends in /, unless the pattern just
|
||||
// doesn't have any more for it. But, a/b/ should *not*
|
||||
// match "a/b/*", even though "" matches against the
|
||||
// [^/]*? pattern, except in partial mode, where it might
|
||||
// simply not be reached yet.
|
||||
// However, a/b/ should still satisfy a/*
|
||||
|
||||
// now either we fell off the end of the pattern, or we're done.
|
||||
if (fi === fl && pi === pl) {
|
||||
// ran out of pattern and filename at the same time.
|
||||
// an exact hit!
|
||||
return true
|
||||
} else if (fi === fl) {
|
||||
// ran out of file, but still had pattern left.
|
||||
// this is ok if we're doing the match as part of
|
||||
// a glob fs traversal.
|
||||
return partial
|
||||
} else /* istanbul ignore else */ if (pi === pl) {
|
||||
// ran out of pattern, still have file left.
|
||||
// this is only acceptable if we're on the very last
|
||||
// empty segment of a file with a trailing slash.
|
||||
// a/* should match a/b/
|
||||
return (fi === fl - 1) && (file[fi] === '')
|
||||
}
|
||||
|
||||
// should be unreachable.
|
||||
/* istanbul ignore next */
|
||||
throw new Error('wtf?')
|
||||
}
|
||||
|
||||
// replace stuff like \* with *
|
||||
function globUnescape (s) {
|
||||
return s.replace(/\\(.)/g, '$1')
|
||||
}
|
||||
|
||||
function regExpEscape (s) {
|
||||
return s.replace(/[-[\]{}()*+?.,\\^$|#\s]/g, '\\$&')
|
||||
}
|
||||
33
32/node_modules/jake/node_modules/minimatch/package.json
generated
vendored
Normal file
33
32/node_modules/jake/node_modules/minimatch/package.json
generated
vendored
Normal file
@@ -0,0 +1,33 @@
|
||||
{
|
||||
"author": "Isaac Z. Schlueter <i@izs.me> (http://blog.izs.me)",
|
||||
"name": "minimatch",
|
||||
"description": "a glob matcher in javascript",
|
||||
"version": "3.1.2",
|
||||
"publishConfig": {
|
||||
"tag": "v3-legacy"
|
||||
},
|
||||
"repository": {
|
||||
"type": "git",
|
||||
"url": "git://github.com/isaacs/minimatch.git"
|
||||
},
|
||||
"main": "minimatch.js",
|
||||
"scripts": {
|
||||
"test": "tap",
|
||||
"preversion": "npm test",
|
||||
"postversion": "npm publish",
|
||||
"postpublish": "git push origin --all; git push origin --tags"
|
||||
},
|
||||
"engines": {
|
||||
"node": "*"
|
||||
},
|
||||
"dependencies": {
|
||||
"brace-expansion": "^1.1.7"
|
||||
},
|
||||
"devDependencies": {
|
||||
"tap": "^15.1.6"
|
||||
},
|
||||
"license": "ISC",
|
||||
"files": [
|
||||
"minimatch.js"
|
||||
]
|
||||
}
|
||||
42
32/node_modules/jake/package.json
generated
vendored
Normal file
42
32/node_modules/jake/package.json
generated
vendored
Normal file
@@ -0,0 +1,42 @@
|
||||
{
|
||||
"name": "jake",
|
||||
"description": "JavaScript build tool, similar to Make or Rake",
|
||||
"keywords": [
|
||||
"build",
|
||||
"cli",
|
||||
"make",
|
||||
"rake"
|
||||
],
|
||||
"version": "10.8.7",
|
||||
"author": "Matthew Eernisse <mde@fleegix.org> (http://fleegix.org)",
|
||||
"license": "Apache-2.0",
|
||||
"bin": {
|
||||
"jake": "./bin/cli.js"
|
||||
},
|
||||
"main": "./lib/jake.js",
|
||||
"scripts": {
|
||||
"lint": "eslint --format codeframe \"lib/**/*.js\" \"test/**/*.js\"",
|
||||
"lint:fix": "eslint --fix \"lib/**/*.js\" \"test/**/*.js\"",
|
||||
"test": "./bin/cli.js test",
|
||||
"test:ci": "npm run lint && npm run test"
|
||||
},
|
||||
"repository": {
|
||||
"type": "git",
|
||||
"url": "git://github.com/jakejs/jake.git"
|
||||
},
|
||||
"preferGlobal": true,
|
||||
"dependencies": {
|
||||
"async": "^3.2.3",
|
||||
"chalk": "^4.0.2",
|
||||
"filelist": "^1.0.4",
|
||||
"minimatch": "^3.1.2"
|
||||
},
|
||||
"devDependencies": {
|
||||
"eslint": "^6.8.0",
|
||||
"mocha": "^10.2.0",
|
||||
"q": "^1.5.1"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">=10"
|
||||
}
|
||||
}
|
||||
45
32/node_modules/jake/test/integration/concurrent.js
generated
vendored
Normal file
45
32/node_modules/jake/test/integration/concurrent.js
generated
vendored
Normal file
@@ -0,0 +1,45 @@
|
||||
let assert = require('assert');
|
||||
let exec = require('child_process').execSync;
|
||||
|
||||
const PROJECT_DIR = process.env.PROJECT_DIR;
|
||||
const JAKE_CMD = `${PROJECT_DIR}/bin/cli.js`;
|
||||
|
||||
suite('concurrent', function () {
|
||||
|
||||
this.timeout(7000);
|
||||
|
||||
test(' simple concurrent prerequisites 1', function () {
|
||||
let out = exec(`${JAKE_CMD} -q concurrent:simple1`).toString().trim();
|
||||
assert.equal('Started A\nStarted B\nFinished B\nFinished A', out);
|
||||
});
|
||||
|
||||
test(' simple concurrent prerequisites 2', function () {
|
||||
let out = exec(`${JAKE_CMD} -q concurrent:simple2`).toString().trim();
|
||||
assert.equal('Started C\nStarted D\nFinished C\nFinished D', out);
|
||||
});
|
||||
|
||||
test(' sequential concurrent prerequisites', function () {
|
||||
let out = exec(`${JAKE_CMD} -q concurrent:seqconcurrent`).toString().trim();
|
||||
assert.equal('Started A\nStarted B\nFinished B\nFinished A\nStarted C\nStarted D\nFinished C\nFinished D', out);
|
||||
});
|
||||
|
||||
test(' concurrent concurrent prerequisites', function () {
|
||||
let out = exec(`${JAKE_CMD} -q concurrent:concurrentconcurrent`).toString().trim();
|
||||
assert.equal('Started A\nStarted B\nStarted C\nStarted D\nFinished B\nFinished C\nFinished A\nFinished D', out);
|
||||
});
|
||||
|
||||
test(' concurrent prerequisites with subdependency', function () {
|
||||
let out = exec(`${JAKE_CMD} -q concurrent:subdep`).toString().trim();
|
||||
assert.equal('Started A\nFinished A\nStarted Ba\nFinished Ba', out);
|
||||
});
|
||||
|
||||
test(' failing in concurrent prerequisites', function () {
|
||||
try {
|
||||
exec(`${JAKE_CMD} -q concurrent:Cfail`);
|
||||
}
|
||||
catch(err) {
|
||||
assert(err.message.indexOf('Command failed') > -1);
|
||||
}
|
||||
});
|
||||
|
||||
});
|
||||
228
32/node_modules/jake/test/integration/file.js
generated
vendored
Normal file
228
32/node_modules/jake/test/integration/file.js
generated
vendored
Normal file
@@ -0,0 +1,228 @@
|
||||
/*
|
||||
* Jake JavaScript build tool
|
||||
* Copyright 2112 Matthew Eernisse (mde@fleegix.org)
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*
|
||||
*/
|
||||
|
||||
const PROJECT_DIR = process.env.PROJECT_DIR;
|
||||
|
||||
let assert = require('assert');
|
||||
let fs = require('fs');
|
||||
let path = require('path');
|
||||
let file = require(`${PROJECT_DIR}/lib/utils/file`);
|
||||
let existsSync = fs.existsSync || path.existsSync;
|
||||
let exec = require('child_process').execSync;
|
||||
|
||||
suite('fileUtils', function () {
|
||||
|
||||
test('mkdirP', function () {
|
||||
let expected = [
|
||||
['foo'],
|
||||
['foo', 'bar'],
|
||||
['foo', 'bar', 'baz'],
|
||||
['foo', 'bar', 'baz', 'qux']
|
||||
];
|
||||
file.mkdirP('foo/bar/baz/qux');
|
||||
let res = exec('find foo').toString().trim().split('\n');
|
||||
for (let i = 0, ii = res.length; i < ii; i++) {
|
||||
assert.equal(path.join.apply(path, expected[i]), res[i]);
|
||||
}
|
||||
file.rmRf('foo');
|
||||
});
|
||||
|
||||
test('rmRf', function () {
|
||||
file.mkdirP('foo/bar/baz/qux');
|
||||
file.rmRf('foo/bar');
|
||||
let res = exec('find foo').toString().trim().split('\n');
|
||||
assert.equal(1, res.length);
|
||||
assert.equal('foo', res[0]);
|
||||
fs.rmdirSync('foo');
|
||||
});
|
||||
|
||||
test('rmRf with symlink subdir', function () {
|
||||
file.mkdirP('foo');
|
||||
file.mkdirP('bar');
|
||||
fs.writeFileSync('foo/hello.txt', 'hello, it\'s me');
|
||||
fs.symlinkSync('../foo', 'bar/foo'); file.rmRf('bar');
|
||||
|
||||
// Make sure the bar directory was successfully deleted
|
||||
let barDeleted = false;
|
||||
try {
|
||||
fs.statSync('bar');
|
||||
} catch(err) {
|
||||
if(err.code == 'ENOENT') {
|
||||
barDeleted = true;
|
||||
}
|
||||
}
|
||||
assert.equal(true, barDeleted);
|
||||
|
||||
// Make sure that the file inside the linked folder wasn't deleted
|
||||
let res = fs.readdirSync('foo');
|
||||
assert.equal(1, res.length);
|
||||
assert.equal('hello.txt', res[0]);
|
||||
|
||||
// Cleanup
|
||||
fs.unlinkSync('foo/hello.txt');
|
||||
fs.rmdirSync('foo');
|
||||
});
|
||||
|
||||
test('rmRf with symlinked dir', function () {
|
||||
file.mkdirP('foo');
|
||||
fs.writeFileSync('foo/hello.txt', 'hello!');
|
||||
fs.symlinkSync('foo', 'bar');
|
||||
file.rmRf('bar');
|
||||
|
||||
// Make sure the bar directory was successfully deleted
|
||||
let barDeleted = false;
|
||||
try {
|
||||
fs.statSync('bar');
|
||||
} catch(err) {
|
||||
if(err.code == 'ENOENT') {
|
||||
barDeleted = true;
|
||||
}
|
||||
}
|
||||
assert.equal(true, barDeleted);
|
||||
|
||||
// Make sure that the file inside the linked folder wasn't deleted
|
||||
let res = fs.readdirSync('foo');
|
||||
assert.equal(1, res.length);
|
||||
assert.equal('hello.txt', res[0]);
|
||||
|
||||
// Cleanup
|
||||
fs.unlinkSync('foo/hello.txt');
|
||||
fs.rmdirSync('foo');
|
||||
});
|
||||
|
||||
test('cpR with same name and different directory', function () {
|
||||
file.mkdirP('foo');
|
||||
fs.writeFileSync('foo/bar.txt', 'w00t');
|
||||
file.cpR('foo', 'bar');
|
||||
assert.ok(existsSync('bar/bar.txt'));
|
||||
file.rmRf('foo');
|
||||
file.rmRf('bar');
|
||||
});
|
||||
|
||||
test('cpR with same to and from will throw', function () {
|
||||
assert.throws(function () {
|
||||
file.cpR('foo.txt', 'foo.txt');
|
||||
});
|
||||
});
|
||||
|
||||
test('cpR rename via copy in directory', function () {
|
||||
file.mkdirP('foo');
|
||||
fs.writeFileSync('foo/bar.txt', 'w00t');
|
||||
file.cpR('foo/bar.txt', 'foo/baz.txt');
|
||||
assert.ok(existsSync('foo/baz.txt'));
|
||||
file.rmRf('foo');
|
||||
});
|
||||
|
||||
test('cpR rename via copy in base', function () {
|
||||
fs.writeFileSync('bar.txt', 'w00t');
|
||||
file.cpR('bar.txt', 'baz.txt');
|
||||
assert.ok(existsSync('baz.txt'));
|
||||
file.rmRf('bar.txt');
|
||||
file.rmRf('baz.txt');
|
||||
});
|
||||
|
||||
test('cpR keeps file mode', function () {
|
||||
fs.writeFileSync('bar.txt', 'w00t', {mode: 0o750});
|
||||
fs.writeFileSync('bar1.txt', 'w00t!', {mode: 0o744});
|
||||
file.cpR('bar.txt', 'baz.txt');
|
||||
file.cpR('bar1.txt', 'baz1.txt');
|
||||
|
||||
assert.ok(existsSync('baz.txt'));
|
||||
assert.ok(existsSync('baz1.txt'));
|
||||
let bazStat = fs.statSync('baz.txt');
|
||||
let bazStat1 = fs.statSync('baz1.txt');
|
||||
assert.equal(0o750, bazStat.mode & 0o7777);
|
||||
assert.equal(0o744, bazStat1.mode & 0o7777);
|
||||
|
||||
file.rmRf('bar.txt');
|
||||
file.rmRf('baz.txt');
|
||||
file.rmRf('bar1.txt');
|
||||
file.rmRf('baz1.txt');
|
||||
});
|
||||
|
||||
test('cpR keeps file mode when overwriting with preserveMode', function () {
|
||||
fs.writeFileSync('bar.txt', 'w00t', {mode: 0o755});
|
||||
fs.writeFileSync('baz.txt', 'w00t!', {mode: 0o744});
|
||||
file.cpR('bar.txt', 'baz.txt', {silent: true, preserveMode: true});
|
||||
|
||||
assert.ok(existsSync('baz.txt'));
|
||||
let bazStat = fs.statSync('baz.txt');
|
||||
assert.equal(0o755, bazStat.mode & 0o777);
|
||||
|
||||
file.rmRf('bar.txt');
|
||||
file.rmRf('baz.txt');
|
||||
});
|
||||
|
||||
test('cpR does not keep file mode when overwriting', function () {
|
||||
fs.writeFileSync('bar.txt', 'w00t', {mode: 0o766});
|
||||
fs.writeFileSync('baz.txt', 'w00t!', {mode: 0o744});
|
||||
file.cpR('bar.txt', 'baz.txt');
|
||||
|
||||
assert.ok(existsSync('baz.txt'));
|
||||
let bazStat = fs.statSync('baz.txt');
|
||||
assert.equal(0o744, bazStat.mode & 0o777);
|
||||
|
||||
file.rmRf('bar.txt');
|
||||
file.rmRf('baz.txt');
|
||||
});
|
||||
|
||||
test('cpR copies file mode recursively', function () {
|
||||
fs.mkdirSync('foo');
|
||||
fs.writeFileSync('foo/bar.txt', 'w00t', {mode: 0o740});
|
||||
file.cpR('foo', 'baz');
|
||||
|
||||
assert.ok(existsSync('baz'));
|
||||
let barStat = fs.statSync('baz/bar.txt');
|
||||
assert.equal(0o740, barStat.mode & 0o777);
|
||||
|
||||
file.rmRf('foo');
|
||||
file.rmRf('baz');
|
||||
});
|
||||
|
||||
test('cpR keeps file mode recursively', function () {
|
||||
fs.mkdirSync('foo');
|
||||
fs.writeFileSync('foo/bar.txt', 'w00t', {mode: 0o740});
|
||||
fs.mkdirSync('baz');
|
||||
fs.mkdirSync('baz/foo');
|
||||
fs.writeFileSync('baz/foo/bar.txt', 'w00t!', {mode: 0o755});
|
||||
file.cpR('foo', 'baz', {silent: true, preserveMode: true});
|
||||
|
||||
assert.ok(existsSync('baz'));
|
||||
let barStat = fs.statSync('baz/foo/bar.txt');
|
||||
assert.equal(0o740, barStat.mode & 0o777);
|
||||
|
||||
file.rmRf('foo');
|
||||
file.rmRf('baz');
|
||||
});
|
||||
|
||||
test('cpR copies directory mode recursively', function () {
|
||||
fs.mkdirSync('foo', 0o755);
|
||||
fs.mkdirSync('foo/bar', 0o700);
|
||||
file.cpR('foo', 'bar');
|
||||
|
||||
assert.ok(existsSync('foo'));
|
||||
let fooBarStat = fs.statSync('bar/bar');
|
||||
assert.equal(0o700, fooBarStat.mode & 0o777);
|
||||
|
||||
file.rmRf('foo');
|
||||
file.rmRf('bar');
|
||||
});
|
||||
|
||||
});
|
||||
|
||||
|
||||
141
32/node_modules/jake/test/integration/file_task.js
generated
vendored
Normal file
141
32/node_modules/jake/test/integration/file_task.js
generated
vendored
Normal file
@@ -0,0 +1,141 @@
|
||||
/*
|
||||
* Jake JavaScript build tool
|
||||
* Copyright 2112 Matthew Eernisse (mde@fleegix.org)
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*
|
||||
*/
|
||||
|
||||
const PROJECT_DIR = process.env.PROJECT_DIR;
|
||||
const JAKE_CMD = `${PROJECT_DIR}/bin/cli.js`;
|
||||
|
||||
let assert = require('assert');
|
||||
let fs = require('fs');
|
||||
let exec = require('child_process').execSync;
|
||||
let { rmRf } = require(`${PROJECT_DIR}/lib/jake`);
|
||||
|
||||
let cleanUpAndNext = function (callback) {
|
||||
rmRf('./foo', {
|
||||
silent: true
|
||||
});
|
||||
callback && callback();
|
||||
};
|
||||
|
||||
suite('fileTask', function () {
|
||||
this.timeout(7000);
|
||||
|
||||
setup(function () {
|
||||
cleanUpAndNext();
|
||||
});
|
||||
|
||||
test('where a file-task prereq does not change with --always-make', function () {
|
||||
let out;
|
||||
out = exec(`${JAKE_CMD} -q fileTest:foo/from-src1.txt`).toString().trim();
|
||||
assert.equal('fileTest:foo/src1.txt task\nfileTest:foo/from-src1.txt task',
|
||||
out);
|
||||
out = exec(`${JAKE_CMD} -q -B fileTest:foo/from-src1.txt`).toString().trim();
|
||||
assert.equal('fileTest:foo/src1.txt task\nfileTest:foo/from-src1.txt task',
|
||||
out);
|
||||
cleanUpAndNext();
|
||||
});
|
||||
|
||||
test('concating two files', function () {
|
||||
let out;
|
||||
out = exec(`${JAKE_CMD} -q fileTest:foo/concat.txt`).toString().trim();
|
||||
assert.equal('fileTest:foo/src1.txt task\ndefault task\nfileTest:foo/src2.txt task\n' +
|
||||
'fileTest:foo/concat.txt task', out);
|
||||
// Check to see the two files got concat'd
|
||||
let data = fs.readFileSync(process.cwd() + '/foo/concat.txt');
|
||||
assert.equal('src1src2', data.toString());
|
||||
cleanUpAndNext();
|
||||
});
|
||||
|
||||
test('where a file-task prereq does not change', function () {
|
||||
let out;
|
||||
out = exec(`${JAKE_CMD} -q fileTest:foo/from-src1.txt`).toString().trim();
|
||||
assert.equal('fileTest:foo/src1.txt task\nfileTest:foo/from-src1.txt task', out);
|
||||
out = exec(`${JAKE_CMD} -q fileTest:foo/from-src1.txt`).toString().trim();
|
||||
// Second time should be a no-op
|
||||
assert.equal('', out);
|
||||
cleanUpAndNext();
|
||||
});
|
||||
|
||||
test('where a file-task prereq does change, then does not', function (next) {
|
||||
exec('mkdir -p ./foo');
|
||||
exec('touch ./foo/from-src1.txt');
|
||||
setTimeout(() => {
|
||||
fs.writeFileSync('./foo/src1.txt', '-SRC');
|
||||
// Task should run the first time
|
||||
let out;
|
||||
out = exec(`${JAKE_CMD} -q fileTest:foo/from-src1.txt`).toString().trim();
|
||||
assert.equal('fileTest:foo/from-src1.txt task', out);
|
||||
// Task should not run on subsequent invocation
|
||||
out = exec(`${JAKE_CMD} -q fileTest:foo/from-src1.txt`).toString().trim();
|
||||
assert.equal('', out);
|
||||
cleanUpAndNext(next);
|
||||
}, 1000);
|
||||
});
|
||||
|
||||
test('a preexisting file', function () {
|
||||
let prereqData = 'howdy';
|
||||
exec('mkdir -p ./foo');
|
||||
fs.writeFileSync('foo/prereq.txt', prereqData);
|
||||
let out;
|
||||
out = exec(`${JAKE_CMD} -q fileTest:foo/from-prereq.txt`).toString().trim();
|
||||
assert.equal('fileTest:foo/from-prereq.txt task', out);
|
||||
let data = fs.readFileSync(process.cwd() + '/foo/from-prereq.txt');
|
||||
assert.equal(prereqData, data.toString());
|
||||
out = exec(`${JAKE_CMD} -q fileTest:foo/from-prereq.txt`).toString().trim();
|
||||
// Second time should be a no-op
|
||||
assert.equal('', out);
|
||||
cleanUpAndNext();
|
||||
});
|
||||
|
||||
test('a preexisting file with --always-make flag', function () {
|
||||
let prereqData = 'howdy';
|
||||
exec('mkdir -p ./foo');
|
||||
fs.writeFileSync('foo/prereq.txt', prereqData);
|
||||
let out;
|
||||
out = exec(`${JAKE_CMD} -q fileTest:foo/from-prereq.txt`).toString().trim();
|
||||
assert.equal('fileTest:foo/from-prereq.txt task', out);
|
||||
let data = fs.readFileSync(process.cwd() + '/foo/from-prereq.txt');
|
||||
assert.equal(prereqData, data.toString());
|
||||
out = exec(`${JAKE_CMD} -q -B fileTest:foo/from-prereq.txt`).toString().trim();
|
||||
assert.equal('fileTest:foo/from-prereq.txt task', out);
|
||||
cleanUpAndNext();
|
||||
});
|
||||
|
||||
test('nested directory-task', function () {
|
||||
exec(`${JAKE_CMD} -q fileTest:foo/bar/baz/bamf.txt`);
|
||||
let data = fs.readFileSync(process.cwd() + '/foo/bar/baz/bamf.txt');
|
||||
assert.equal('w00t', data);
|
||||
cleanUpAndNext();
|
||||
});
|
||||
|
||||
test('partially existing prereqs', function () {
|
||||
/*
|
||||
dependency graph:
|
||||
/-- foo/output2a.txt --\
|
||||
foo -- foo/output1.txt --+ +-- output3.txt
|
||||
\-- foo/output2b.txt --/
|
||||
*/
|
||||
// build part of the prereqs
|
||||
exec(`${JAKE_CMD} -q fileTest:foo/output2a.txt`);
|
||||
// verify the final target gets built
|
||||
exec(`${JAKE_CMD} -q fileTest:foo/output3.txt`);
|
||||
let data = fs.readFileSync(process.cwd() + '/foo/output3.txt');
|
||||
assert.equal('w00t', data);
|
||||
cleanUpAndNext();
|
||||
});
|
||||
});
|
||||
|
||||
80
32/node_modules/jake/test/integration/helpers.js
generated
vendored
Normal file
80
32/node_modules/jake/test/integration/helpers.js
generated
vendored
Normal file
@@ -0,0 +1,80 @@
|
||||
var exec = require('child_process').exec;
|
||||
|
||||
var helpers = new (function () {
|
||||
var _tests;
|
||||
var _names = [];
|
||||
var _name;
|
||||
var _callback;
|
||||
var _runner = function () {
|
||||
if ((_name = _names.shift())) {
|
||||
console.log('Running ' + _name);
|
||||
_tests[_name]();
|
||||
}
|
||||
else {
|
||||
_callback();
|
||||
}
|
||||
};
|
||||
|
||||
this.exec = function () {
|
||||
var args = Array.prototype.slice.call(arguments);
|
||||
var arg;
|
||||
var cmd = args.shift();
|
||||
var opts = {};
|
||||
var callback;
|
||||
// Optional opts/callback or callback/opts
|
||||
while ((arg = args.shift())) {
|
||||
if (typeof arg == 'function') {
|
||||
callback = arg;
|
||||
}
|
||||
else {
|
||||
opts = arg;
|
||||
}
|
||||
}
|
||||
|
||||
cmd += ' --trace';
|
||||
var execOpts = opts.execOpts ? opts.execOpts : {};
|
||||
exec(cmd, execOpts, function (err, stdout, stderr) {
|
||||
var out = helpers.trim(stdout);
|
||||
if (err) {
|
||||
if (opts.breakOnError === false) {
|
||||
return callback(err);
|
||||
}
|
||||
else {
|
||||
throw err;
|
||||
}
|
||||
}
|
||||
if (stderr) {
|
||||
callback(stderr);
|
||||
}
|
||||
else {
|
||||
callback(out);
|
||||
}
|
||||
});
|
||||
};
|
||||
|
||||
this.trim = function (s) {
|
||||
var str = s || '';
|
||||
return str.replace(/^\s*|\s*$/g, '');
|
||||
};
|
||||
|
||||
this.parse = function (s) {
|
||||
var str = s || '';
|
||||
str = helpers.trim(str);
|
||||
str = str.replace(/'/g, '"');
|
||||
return JSON.parse(str);
|
||||
};
|
||||
|
||||
this.run = function (tests, callback) {
|
||||
_tests = tests;
|
||||
_names = Object.keys(tests);
|
||||
_callback = callback;
|
||||
_runner();
|
||||
};
|
||||
|
||||
this.next = function () {
|
||||
_runner();
|
||||
};
|
||||
|
||||
})();
|
||||
|
||||
module.exports = helpers;
|
||||
352
32/node_modules/jake/test/integration/jakefile.js
generated
vendored
Normal file
352
32/node_modules/jake/test/integration/jakefile.js
generated
vendored
Normal file
@@ -0,0 +1,352 @@
|
||||
let fs = require('fs');
|
||||
let Q = require('q');
|
||||
|
||||
desc('The default t.');
|
||||
task('default', function () {
|
||||
console.log('default task');
|
||||
});
|
||||
|
||||
desc('No action.');
|
||||
task({'noAction': ['default']});
|
||||
|
||||
desc('No action, no prereqs.');
|
||||
task('noActionNoPrereqs');
|
||||
|
||||
desc('Top-level zerbofrangazoomy task');
|
||||
task('zerbofrangazoomy', function () {
|
||||
console.log('Whaaaaaaaa? Ran the zerbofrangazoomy task!');
|
||||
});
|
||||
|
||||
desc('Task that throws');
|
||||
task('throwy', function () {
|
||||
let errorListener = function (err) {
|
||||
console.log('Emitted');
|
||||
console.log(err.toString());
|
||||
|
||||
jake.removeListener('error', errorListener);
|
||||
};
|
||||
|
||||
jake.on('error', errorListener);
|
||||
|
||||
throw new Error('I am bad');
|
||||
});
|
||||
|
||||
desc('Task that rejects a Promise');
|
||||
task('promiseRejecter', function () {
|
||||
const originalOption = jake.program.opts['allow-rejection'];
|
||||
|
||||
const errorListener = function (err) {
|
||||
console.log(err.toString());
|
||||
jake.removeListener('error', errorListener);
|
||||
jake.program.opts['allow-rejection'] = originalOption; // Restore original 'allow-rejection' option
|
||||
};
|
||||
jake.on('error', errorListener);
|
||||
|
||||
jake.program.opts['allow-rejection'] = false; // Do not allow rejection so the rejection is passed to error handlers
|
||||
|
||||
Promise.reject('<promise rejected on purpose>');
|
||||
});
|
||||
|
||||
desc('Accepts args and env vars.');
|
||||
task('argsEnvVars', function () {
|
||||
let res = {
|
||||
args: arguments
|
||||
, env: {
|
||||
foo: process.env.foo
|
||||
, baz: process.env.baz
|
||||
}
|
||||
};
|
||||
console.log(JSON.stringify(res));
|
||||
});
|
||||
|
||||
namespace('foo', function () {
|
||||
desc('The foo:bar t.');
|
||||
task('bar', function () {
|
||||
if (arguments.length) {
|
||||
console.log('foo:bar[' +
|
||||
Array.prototype.join.call(arguments, ',') +
|
||||
'] task');
|
||||
}
|
||||
else {
|
||||
console.log('foo:bar task');
|
||||
}
|
||||
});
|
||||
|
||||
desc('The foo:baz task, calls foo:bar as a prerequisite.');
|
||||
task('baz', ['foo:bar'], function () {
|
||||
console.log('foo:baz task');
|
||||
});
|
||||
|
||||
desc('The foo:qux task, calls foo:bar with cmdline args as a prerequisite.');
|
||||
task('qux', ['foo:bar[asdf,qwer]'], function () {
|
||||
console.log('foo:qux task');
|
||||
});
|
||||
|
||||
desc('The foo:frang task,`invokes` foo:bar with passed args as a prerequisite.');
|
||||
task('frang', function () {
|
||||
let t = jake.Task['foo:bar'];
|
||||
// Do args pass-through
|
||||
t.invoke.apply(t, arguments);
|
||||
t.on('complete', () => {
|
||||
console.log('foo:frang task');
|
||||
});
|
||||
});
|
||||
|
||||
desc('The foo:zerb task, `executes` foo:bar with passed args as a prerequisite.');
|
||||
task('zerb', function () {
|
||||
let t = jake.Task['foo:bar'];
|
||||
// Do args pass-through
|
||||
t.execute.apply(t, arguments);
|
||||
t.on('complete', () => {
|
||||
console.log('foo:zerb task');
|
||||
});
|
||||
});
|
||||
|
||||
desc('The foo:zoobie task, has no prerequisites.');
|
||||
task('zoobie', function () {
|
||||
console.log('foo:zoobie task');
|
||||
});
|
||||
|
||||
desc('The foo:voom task, run the foo:zoobie task repeatedly.');
|
||||
task('voom', function () {
|
||||
let t = jake.Task['foo:bar'];
|
||||
t.on('complete', function () {
|
||||
console.log('complete');
|
||||
});
|
||||
t.execute.apply(t);
|
||||
t.execute.apply(t);
|
||||
});
|
||||
|
||||
desc('The foo:asdf task, has the same prereq twice.');
|
||||
task('asdf', ['foo:bar', 'foo:baz'], function () {
|
||||
console.log('foo:asdf task');
|
||||
});
|
||||
|
||||
});
|
||||
|
||||
namespace('bar', function () {
|
||||
desc('The bar:foo task, has no prerequisites, is async, returns Promise which resolves.');
|
||||
task('foo', async function () {
|
||||
return new Promise((resolve, reject) => {
|
||||
console.log('bar:foo task');
|
||||
resolve();
|
||||
});
|
||||
});
|
||||
|
||||
desc('The bar:promise task has no prerequisites, is async, returns Q-based promise.');
|
||||
task('promise', function () {
|
||||
return Q()
|
||||
.then(function () {
|
||||
console.log('bar:promise task');
|
||||
return 123654;
|
||||
});
|
||||
});
|
||||
|
||||
desc('The bar:dependOnpromise task waits for a promise based async test');
|
||||
task('dependOnpromise', ['promise'], function () {
|
||||
console.log('bar:dependOnpromise task saw value', jake.Task["bar:promise"].value);
|
||||
});
|
||||
|
||||
desc('The bar:brokenPromise task is a failing Q-promise based async task.');
|
||||
task('brokenPromise', function () {
|
||||
return Q()
|
||||
.then(function () {
|
||||
throw new Error("nom nom nom");
|
||||
});
|
||||
});
|
||||
|
||||
desc('The bar:bar task, has the async bar:foo task as a prerequisite.');
|
||||
task('bar', ['bar:foo'], function () {
|
||||
console.log('bar:bar task');
|
||||
});
|
||||
|
||||
});
|
||||
|
||||
namespace('hoge', function () {
|
||||
desc('The hoge:hoge task, has no prerequisites.');
|
||||
task('hoge', function () {
|
||||
console.log('hoge:hoge task');
|
||||
});
|
||||
|
||||
desc('The hoge:piyo task, has no prerequisites.');
|
||||
task('piyo', function () {
|
||||
console.log('hoge:piyo task');
|
||||
});
|
||||
|
||||
desc('The hoge:fuga task, has hoge:hoge and hoge:piyo as prerequisites.');
|
||||
task('fuga', ['hoge:hoge', 'hoge:piyo'], function () {
|
||||
console.log('hoge:fuga task');
|
||||
});
|
||||
|
||||
desc('The hoge:charan task, has hoge:fuga as a prerequisite.');
|
||||
task('charan', ['hoge:fuga'], function () {
|
||||
console.log('hoge:charan task');
|
||||
});
|
||||
|
||||
desc('The hoge:gero task, has hoge:fuga as a prerequisite.');
|
||||
task('gero', ['hoge:fuga'], function () {
|
||||
console.log('hoge:gero task');
|
||||
});
|
||||
|
||||
desc('The hoge:kira task, has hoge:charan and hoge:gero as prerequisites.');
|
||||
task('kira', ['hoge:charan', 'hoge:gero'], function () {
|
||||
console.log('hoge:kira task');
|
||||
});
|
||||
|
||||
});
|
||||
|
||||
namespace('fileTest', function () {
|
||||
directory('foo');
|
||||
|
||||
desc('File task, concatenating two files together');
|
||||
file('foo/concat.txt', ['fileTest:foo', 'fileTest:foo/src1.txt', 'fileTest:foo/src2.txt'], function () {
|
||||
console.log('fileTest:foo/concat.txt task');
|
||||
let data1 = fs.readFileSync('foo/src1.txt');
|
||||
let data2 = fs.readFileSync('foo/src2.txt');
|
||||
fs.writeFileSync('foo/concat.txt', data1 + data2);
|
||||
});
|
||||
|
||||
desc('File task, async creation with writeFile');
|
||||
file('foo/src1.txt', function () {
|
||||
return new Promise(function (resolve, reject) {
|
||||
fs.writeFile('foo/src1.txt', 'src1', function (err) {
|
||||
if (err) {
|
||||
reject(err);
|
||||
}
|
||||
else {
|
||||
console.log('fileTest:foo/src1.txt task');
|
||||
resolve();
|
||||
}
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
desc('File task, sync creation with writeFileSync');
|
||||
file('foo/src2.txt', ['default'], function () {
|
||||
fs.writeFileSync('foo/src2.txt', 'src2');
|
||||
console.log('fileTest:foo/src2.txt task');
|
||||
});
|
||||
|
||||
desc('File task, do not run unless the prereq file changes');
|
||||
file('foo/from-src1.txt', ['fileTest:foo', 'fileTest:foo/src1.txt'], function () {
|
||||
let data = fs.readFileSync('foo/src1.txt').toString();
|
||||
fs.writeFileSync('foo/from-src1.txt', data);
|
||||
console.log('fileTest:foo/from-src1.txt task');
|
||||
});
|
||||
|
||||
desc('File task, run if the prereq file changes');
|
||||
task('touch-prereq', function () {
|
||||
fs.writeFileSync('foo/prereq.txt', 'UPDATED');
|
||||
});
|
||||
|
||||
desc('File task, has a preexisting file (with no associated task) as a prereq');
|
||||
file('foo/from-prereq.txt', ['fileTest:foo', 'foo/prereq.txt'], function () {
|
||||
let data = fs.readFileSync('foo/prereq.txt');
|
||||
fs.writeFileSync('foo/from-prereq.txt', data);
|
||||
console.log('fileTest:foo/from-prereq.txt task');
|
||||
});
|
||||
|
||||
directory('foo/bar/baz');
|
||||
|
||||
desc('Write a file in a nested subdirectory');
|
||||
file('foo/bar/baz/bamf.txt', ['foo/bar/baz'], function () {
|
||||
fs.writeFileSync('foo/bar/baz/bamf.txt', 'w00t');
|
||||
});
|
||||
|
||||
file('foo/output1.txt', ['foo'], () => {
|
||||
fs.writeFileSync('foo/output1.txt', 'Contents of foo/output1.txt');
|
||||
});
|
||||
|
||||
file('foo/output2a.txt', ['foo/output1.txt'], () => {
|
||||
fs.writeFileSync('foo/output2a.txt', 'Contents of foo/output2a.txt');
|
||||
});
|
||||
|
||||
file('foo/output2b.txt', ['foo/output1.txt'], () => {
|
||||
fs.writeFileSync('foo/output2b.txt', 'Contents of foo/output2b.txt');
|
||||
});
|
||||
|
||||
file('foo/output3.txt', [ 'foo/output2a.txt', 'foo/output2b.txt'], () => {
|
||||
fs.writeFileSync('foo/output3.txt', 'w00t');
|
||||
});
|
||||
});
|
||||
|
||||
task('blammo');
|
||||
// Define task
|
||||
task('voom', ['blammo'], function () {
|
||||
console.log(this.prereqs.length);
|
||||
});
|
||||
|
||||
// Modify, add a prereq
|
||||
task('voom', ['noActionNoPrereqs']);
|
||||
|
||||
namespace('vronk', function () {
|
||||
task('groo', function () {
|
||||
let t = jake.Task['vronk:zong'];
|
||||
t.addListener('error', function (e) {
|
||||
console.log(e.message);
|
||||
});
|
||||
t.invoke();
|
||||
});
|
||||
task('zong', function () {
|
||||
throw new Error('OMFGZONG');
|
||||
});
|
||||
});
|
||||
|
||||
// define namespace
|
||||
namespace('one', function () {
|
||||
task('one', function () {
|
||||
console.log('one:one');
|
||||
});
|
||||
});
|
||||
|
||||
// modify namespace (add task)
|
||||
namespace('one', function () {
|
||||
task('two', ['one:one'], function () {
|
||||
console.log('one:two');
|
||||
});
|
||||
});
|
||||
|
||||
task('selfdepconst', [], function () {
|
||||
task('selfdep', ['selfdep'], function () {
|
||||
console.log("I made a task that depends on itself");
|
||||
});
|
||||
});
|
||||
task('selfdepdyn', function () {
|
||||
task('selfdeppar', [], {concurrency: 2}, function () {
|
||||
console.log("I will depend on myself and will fail at runtime");
|
||||
});
|
||||
task('selfdeppar', ['selfdeppar']);
|
||||
jake.Task['selfdeppar'].invoke();
|
||||
});
|
||||
|
||||
namespace("large", function () {
|
||||
task("leaf", function () {
|
||||
console.log("large:leaf");
|
||||
});
|
||||
|
||||
const same = [];
|
||||
for (let i = 0; i < 2000; i++) {
|
||||
same.push("leaf");
|
||||
}
|
||||
|
||||
desc("Task with a large number of same prereqs");
|
||||
task("same", same, { concurrency: 2 }, function () {
|
||||
console.log("large:same");
|
||||
});
|
||||
|
||||
const different = [];
|
||||
for (let i = 0; i < 2000; i++) {
|
||||
const name = "leaf-" + i;
|
||||
task(name, function () {
|
||||
if (name === "leaf-12" || name === "leaf-123") {
|
||||
console.log(name);
|
||||
}
|
||||
});
|
||||
different.push(name);
|
||||
}
|
||||
|
||||
desc("Task with a large number of different prereqs");
|
||||
task("different", different, { concurrency: 2 } , function () {
|
||||
console.log("large:different");
|
||||
});
|
||||
});
|
||||
113
32/node_modules/jake/test/integration/jakelib/concurrent.jake.js
generated
vendored
Normal file
113
32/node_modules/jake/test/integration/jakelib/concurrent.jake.js
generated
vendored
Normal file
@@ -0,0 +1,113 @@
|
||||
|
||||
namespace('concurrent', function () {
|
||||
task('A', function () {
|
||||
console.log('Started A');
|
||||
return new Promise((resolve, reject) => {
|
||||
setTimeout(() => {
|
||||
console.log('Finished A');
|
||||
resolve();
|
||||
}, 200);
|
||||
});
|
||||
});
|
||||
|
||||
task('B', function () {
|
||||
console.log('Started B');
|
||||
return new Promise((resolve, reject) => {
|
||||
setTimeout(() => {
|
||||
console.log('Finished B');
|
||||
resolve();
|
||||
}, 50);
|
||||
});
|
||||
});
|
||||
|
||||
task('C', function () {
|
||||
console.log('Started C');
|
||||
return new Promise((resolve, reject) => {
|
||||
setTimeout(() => {
|
||||
console.log('Finished C');
|
||||
resolve();
|
||||
}, 100);
|
||||
});
|
||||
});
|
||||
|
||||
task('D', function () {
|
||||
console.log('Started D');
|
||||
return new Promise((resolve, reject) => {
|
||||
setTimeout(() => {
|
||||
console.log('Finished D');
|
||||
resolve();
|
||||
}, 300);
|
||||
});
|
||||
});
|
||||
|
||||
task('Ba', ['A'], function () {
|
||||
console.log('Started Ba');
|
||||
return new Promise((resolve, reject) => {
|
||||
setTimeout(() => {
|
||||
console.log('Finished Ba');
|
||||
resolve();
|
||||
}, 50);
|
||||
});
|
||||
});
|
||||
|
||||
task('Afail', function () {
|
||||
console.log('Started failing task');
|
||||
return new Promise((resolve, reject) => {
|
||||
setTimeout(() => {
|
||||
console.log('Failing B with error');
|
||||
throw new Error('I failed');
|
||||
}, 50);
|
||||
});
|
||||
});
|
||||
|
||||
task('simple1', ['A','B'], {concurrency: 2}, function () {
|
||||
return new Promise((resolve, reject) => {
|
||||
setTimeout(() => {
|
||||
resolve();
|
||||
}, 50);
|
||||
});
|
||||
});
|
||||
|
||||
task('simple2', ['C','D'], {concurrency: 2}, function () {
|
||||
return new Promise((resolve, reject) => {
|
||||
setTimeout(() => {
|
||||
resolve();
|
||||
}, 50);
|
||||
});
|
||||
});
|
||||
|
||||
task('seqconcurrent', ['simple1','simple2'], function () {
|
||||
return new Promise((resolve, reject) => {
|
||||
setTimeout(() => {
|
||||
resolve();
|
||||
}, 50);
|
||||
});
|
||||
});
|
||||
|
||||
task('concurrentconcurrent', ['simple1','simple2'], {concurrency: 2}, function () {
|
||||
return new Promise((resolve, reject) => {
|
||||
setTimeout(() => {
|
||||
resolve();
|
||||
}, 50);
|
||||
});
|
||||
});
|
||||
|
||||
task('subdep', ['A','Ba'], {concurrency: 2}, function () {
|
||||
return new Promise((resolve, reject) => {
|
||||
setTimeout(() => {
|
||||
resolve();
|
||||
}, 50);
|
||||
});
|
||||
});
|
||||
|
||||
task('fail', ['A', 'B', 'Afail'], {concurrency: 3}, function () {
|
||||
return new Promise((resolve, reject) => {
|
||||
setTimeout(() => {
|
||||
resolve();
|
||||
}, 50);
|
||||
});
|
||||
});
|
||||
|
||||
});
|
||||
|
||||
|
||||
49
32/node_modules/jake/test/integration/jakelib/publish.jake.js
generated
vendored
Normal file
49
32/node_modules/jake/test/integration/jakelib/publish.jake.js
generated
vendored
Normal file
@@ -0,0 +1,49 @@
|
||||
/*
|
||||
* Jake JavaScript build tool
|
||||
* Copyright 2112 Matthew Eernisse (mde@fleegix.org)
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*
|
||||
*/
|
||||
|
||||
const PROJECT_DIR = process.env.PROJECT_DIR;
|
||||
|
||||
let fs = require('fs');
|
||||
let { publishTask, rmRf, mkdirP } = require(`${PROJECT_DIR}/lib/jake`);
|
||||
|
||||
fs.writeFileSync('package.json', '{"version": "0.0.1"}');
|
||||
mkdirP('tmp_publish');
|
||||
fs.writeFileSync('tmp_publish/foo.txt', 'FOO');
|
||||
|
||||
publishTask('zerb', function () {
|
||||
this.packageFiles.include([
|
||||
'package.json'
|
||||
, 'tmp_publish/**'
|
||||
]);
|
||||
this.publishCmd = 'node -p -e "\'%filename\'"';
|
||||
this.gitCmd = 'echo';
|
||||
this.scheduleDelay = 0;
|
||||
|
||||
this._ensureRepoClean = function () {};
|
||||
this._getCurrentBranch = function () {
|
||||
return 'v0.0';
|
||||
};
|
||||
});
|
||||
|
||||
jake.setTaskTimeout(5000);
|
||||
|
||||
jake.Task['publish'].on('complete', function () {
|
||||
rmRf('tmp_publish', {silent: true});
|
||||
rmRf('package.json', {silent: true});
|
||||
});
|
||||
|
||||
10
32/node_modules/jake/test/integration/jakelib/required_module.jake.js
generated
vendored
Normal file
10
32/node_modules/jake/test/integration/jakelib/required_module.jake.js
generated
vendored
Normal file
@@ -0,0 +1,10 @@
|
||||
let { task, namespace } = require(`${process.env.PROJECT_DIR}/lib/jake`);
|
||||
|
||||
namespace('usingRequire', function () {
|
||||
task('test', () => {
|
||||
console.log('howdy test');
|
||||
});
|
||||
});
|
||||
|
||||
|
||||
|
||||
222
32/node_modules/jake/test/integration/jakelib/rule.jake.js
generated
vendored
Normal file
222
32/node_modules/jake/test/integration/jakelib/rule.jake.js
generated
vendored
Normal file
@@ -0,0 +1,222 @@
|
||||
/*
|
||||
* Jake JavaScript build tool
|
||||
* Copyright 2112 Matthew Eernisse (mde@fleegix.org)
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*
|
||||
*/
|
||||
|
||||
const PROJECT_DIR = process.env.PROJECT_DIR;
|
||||
|
||||
let exec = require('child_process').execSync;
|
||||
let fs = require('fs');
|
||||
let util = require('util');
|
||||
let { rule, rmRf } = require(`${PROJECT_DIR}/lib/jake`);
|
||||
|
||||
directory('tmpsrc');
|
||||
directory('tmpbin');
|
||||
|
||||
////////////////////////////////////////////////////////////
|
||||
// Simple Suffix Rule
|
||||
file('tmp', ['tmp_init', 'tmp_dep1.o', 'tmp_dep2.o'], function (params) {
|
||||
console.log('tmp task');
|
||||
let data1 = fs.readFileSync('tmp_dep1.o');
|
||||
let data2 = fs.readFileSync('tmp_dep2.o');
|
||||
fs.writeFileSync('tmp', data1 + data2);
|
||||
});
|
||||
|
||||
rule('.o', '.c', function () {
|
||||
let cmd = util.format('cp %s %s', this.source, this.name);
|
||||
console.log(cmd + ' task');
|
||||
exec(cmd);
|
||||
});
|
||||
|
||||
file('tmp_dep1.c', function () {
|
||||
fs.writeFileSync('tmp_dep1.c', 'src_1');
|
||||
console.log('tmp_dep1.c task');
|
||||
});
|
||||
|
||||
// note that tmp_dep2.o depends on tmp_dep2.c, which is a
|
||||
// static file.
|
||||
task('tmp_init', function () {
|
||||
fs.writeFileSync('tmp_dep2.c', 'src_2');
|
||||
console.log('tmp_dep2.c task');
|
||||
});
|
||||
////////////////////////////////////////////////////////////
|
||||
|
||||
////////////////////////////////////////////////////////////
|
||||
// Pattern Rule
|
||||
file('tmp_p', ['tmp_init', 'tmp_dep1.oo', 'tmp_dep2.oo'], function (params) {
|
||||
console.log('tmp pattern task');
|
||||
let data1 = fs.readFileSync('tmp_dep1.oo');
|
||||
let data2 = fs.readFileSync('tmp_dep2.oo');
|
||||
fs.writeFileSync('tmp_p', data1 + data2 + ' pattern');
|
||||
});
|
||||
|
||||
rule('%.oo', '%.c', function () {
|
||||
let cmd = util.format('cp %s %s', this.source, this.name);
|
||||
console.log(cmd + ' task');
|
||||
exec(cmd);
|
||||
});
|
||||
////////////////////////////////////////////////////////////
|
||||
|
||||
////////////////////////////////////////////////////////////
|
||||
// Pattern Rule with Folder
|
||||
// i.e. rule('tmpbin/%.oo', 'tmpsrc/%.c', ...
|
||||
file('tmp_pf', [
|
||||
'tmp_src_init'
|
||||
, 'tmpbin'
|
||||
, 'tmpbin/tmp_dep1.oo'
|
||||
, 'tmpbin/tmp_dep2.oo' ], function (params) {
|
||||
console.log('tmp pattern folder task');
|
||||
let data1 = fs.readFileSync('tmpbin/tmp_dep1.oo');
|
||||
let data2 = fs.readFileSync('tmpbin/tmp_dep2.oo');
|
||||
fs.writeFileSync('tmp_pf', data1 + data2 + ' pattern folder');
|
||||
});
|
||||
|
||||
rule('tmpbin/%.oo', 'tmpsrc/%.c', function () {
|
||||
let cmd = util.format('cp %s %s', this.source, this.name);
|
||||
console.log(cmd + ' task');
|
||||
exec(cmd);
|
||||
});
|
||||
|
||||
file('tmpsrc/tmp_dep2.c',['tmpsrc'], function () {
|
||||
fs.writeFileSync('tmpsrc/tmp_dep2.c', 'src/src_2');
|
||||
console.log('tmpsrc/tmp_dep2.c task');
|
||||
});
|
||||
|
||||
// Create static files in folder tmpsrc.
|
||||
task('tmp_src_init', ['tmpsrc'], function () {
|
||||
fs.writeFileSync('tmpsrc/tmp_dep1.c', 'src/src_1');
|
||||
console.log('tmpsrc/tmp_dep1.c task');
|
||||
});
|
||||
////////////////////////////////////////////////////////////
|
||||
|
||||
|
||||
////////////////////////////////////////////////////////////
|
||||
// Namespace Test. This is a Mixed Test.
|
||||
// Test for
|
||||
// - rules belonging to different namespace.
|
||||
// - rules with folder and pattern
|
||||
task('tmp_ns', [
|
||||
'tmpbin'
|
||||
, 'rule:init'
|
||||
, 'tmpbin/tmp_dep2.oo' // *** This relies on a rule defined before.
|
||||
, 'rule:tmpbin/dep1.oo'
|
||||
, 'rule:tmpbin/file2.oo' ], function () {
|
||||
console.log('tmp pattern folder namespace task');
|
||||
let data1 = fs.readFileSync('tmpbin/dep1.oo');
|
||||
let data2 = fs.readFileSync('tmpbin/tmp_dep2.oo');
|
||||
let data3 = fs.readFileSync('tmpbin/file2.oo');
|
||||
fs.writeFileSync('tmp_ns', data1 + data2 + data3 + ' pattern folder namespace');
|
||||
});
|
||||
|
||||
namespace('rule', function () {
|
||||
task('init', ['tmpsrc'], function () {
|
||||
fs.writeFileSync('tmpsrc/file2.c', 'src/src_3');
|
||||
console.log('tmpsrc/file2.c init task');
|
||||
});
|
||||
|
||||
file('tmpsrc/dep1.c',['tmpsrc'], function () {
|
||||
fs.writeFileSync('tmpsrc/dep1.c', 'src/src_1');
|
||||
console.log('tmpsrc/dep1.c task');
|
||||
}, {async: true});
|
||||
|
||||
rule('tmpbin/%.oo', 'tmpsrc/%.c', function () {
|
||||
let cmd = util.format('cp %s %s', this.source, this.name);
|
||||
console.log(cmd + ' ns task');
|
||||
exec(cmd);
|
||||
});
|
||||
});
|
||||
////////////////////////////////////////////////////////////
|
||||
|
||||
////////////////////////////////////////////////////////////
|
||||
// Chain rule
|
||||
// rule('tmpbin/%.pdf', 'tmpbin/%.dvi', function() { ...
|
||||
// rule('tmpbin/%.dvi', 'tmpsrc/%.tex', ['tmpbin'], function() { ...
|
||||
task('tmp_cr', [
|
||||
'chainrule:init'
|
||||
, 'chainrule:tmpbin/file1.pdf'
|
||||
, 'chainrule:tmpbin/file2.pdf' ], function () {
|
||||
console.log('tmp chainrule namespace task');
|
||||
let data1 = fs.readFileSync('tmpbin/file1.pdf');
|
||||
let data2 = fs.readFileSync('tmpbin/file2.pdf');
|
||||
fs.writeFileSync('tmp_cr', data1 + data2 + ' chainrule namespace');
|
||||
});
|
||||
|
||||
namespace('chainrule', function () {
|
||||
task('init', ['tmpsrc', 'tmpbin'], function () {
|
||||
fs.writeFileSync('tmpsrc/file1.tex', 'tex1 ');
|
||||
fs.writeFileSync('tmpsrc/file2.tex', 'tex2 ');
|
||||
console.log('chainrule init task');
|
||||
});
|
||||
|
||||
rule('tmpbin/%.pdf', 'tmpbin/%.dvi', function () {
|
||||
let cmd = util.format('cp %s %s', this.source, this.name);
|
||||
console.log(cmd + ' dvi->pdf task');
|
||||
exec(cmd);
|
||||
});
|
||||
|
||||
rule('tmpbin/%.dvi', 'tmpsrc/%.tex', ['tmpbin'], function () {
|
||||
let cmd = util.format('cp %s %s', this.source, this.name);
|
||||
console.log(cmd + ' tex->dvi task');
|
||||
exec(cmd);
|
||||
});
|
||||
});
|
||||
////////////////////////////////////////////////////////////
|
||||
namespace('precedence', function () {
|
||||
task('test', ['foo.html'], function () {
|
||||
console.log('ran test');
|
||||
});
|
||||
|
||||
rule('.html', '.txt', function () {
|
||||
console.log('created html');
|
||||
let data = fs.readFileSync(this.source);
|
||||
fs.writeFileSync(this.name, data.toString());
|
||||
});
|
||||
});
|
||||
|
||||
namespace('regexPattern', function () {
|
||||
task('test', ['foo.html'], function () {
|
||||
console.log('ran test');
|
||||
});
|
||||
|
||||
rule(/\.html$/, '.txt', function () {
|
||||
console.log('created html');
|
||||
let data = fs.readFileSync(this.source);
|
||||
fs.writeFileSync(this.name, data.toString());
|
||||
});
|
||||
});
|
||||
|
||||
namespace('sourceFunction', function () {
|
||||
|
||||
let srcFunc = function (taskName) {
|
||||
return taskName.replace(/\.[^.]+$/, '.txt');
|
||||
};
|
||||
|
||||
task('test', ['foo.html'], function () {
|
||||
console.log('ran test');
|
||||
});
|
||||
|
||||
rule('.html', srcFunc, function () {
|
||||
console.log('created html');
|
||||
let data = fs.readFileSync(this.source);
|
||||
fs.writeFileSync(this.name, data.toString());
|
||||
});
|
||||
});
|
||||
|
||||
////////////////////////////////////////////////////////////
|
||||
task('clean', function () {
|
||||
rmRf('./foo');
|
||||
rmRf('./tmp');
|
||||
});
|
||||
15
32/node_modules/jake/test/integration/list_tasks.js
generated
vendored
Normal file
15
32/node_modules/jake/test/integration/list_tasks.js
generated
vendored
Normal file
@@ -0,0 +1,15 @@
|
||||
const PROJECT_DIR = process.env.PROJECT_DIR;
|
||||
const JAKE_CMD = `${PROJECT_DIR}/bin/cli.js`;
|
||||
|
||||
let assert = require('assert');
|
||||
let proc = require('child_process');
|
||||
|
||||
suite('listTasks', function () {
|
||||
test('execute "jake -T" without any errors', function () {
|
||||
let message = 'cannot run "jake -T" command';
|
||||
let listTasks = function () {
|
||||
proc.execFileSync(JAKE_CMD, ['-T']);
|
||||
};
|
||||
assert.doesNotThrow(listTasks, TypeError, message);
|
||||
});
|
||||
});
|
||||
27
32/node_modules/jake/test/integration/publish_task.js
generated
vendored
Normal file
27
32/node_modules/jake/test/integration/publish_task.js
generated
vendored
Normal file
@@ -0,0 +1,27 @@
|
||||
let assert = require('assert');
|
||||
let exec = require('child_process').execSync;
|
||||
|
||||
const PROJECT_DIR = process.env.PROJECT_DIR;
|
||||
const JAKE_CMD = `${PROJECT_DIR}/bin/cli.js`;
|
||||
|
||||
suite('publishTask', function () {
|
||||
|
||||
this.timeout(7000);
|
||||
|
||||
test('default task', function () {
|
||||
let out = exec(`${JAKE_CMD} -q publish`).toString().trim();
|
||||
let expected = [
|
||||
'Fetched remote tags.'
|
||||
, 'On branch v0.0'
|
||||
, 'Bumped version number to v0.0.2.'
|
||||
, 'Created package for zerb v0.0.2'
|
||||
, 'Publishing zerb v0.0.2'
|
||||
, './pkg/zerb-v0.0.2.tar.gz'
|
||||
, 'BOOM! Published.'
|
||||
, 'Cleaned up package'
|
||||
].join('\n');
|
||||
assert.equal(expected, out);
|
||||
});
|
||||
|
||||
});
|
||||
|
||||
217
32/node_modules/jake/test/integration/rule.js
generated
vendored
Normal file
217
32/node_modules/jake/test/integration/rule.js
generated
vendored
Normal file
@@ -0,0 +1,217 @@
|
||||
/*
|
||||
* Jake JavaScript build tool
|
||||
* Copyright 2112 Matthew Eernisse (mde@fleegix.org)
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*
|
||||
*/
|
||||
|
||||
const PROJECT_DIR = process.env.PROJECT_DIR;
|
||||
const JAKE_CMD = `${PROJECT_DIR}/bin/cli.js`;
|
||||
|
||||
let assert = require('assert');
|
||||
let exec = require('child_process').execSync;
|
||||
let fs = require('fs');
|
||||
let { Rule } = require(`${PROJECT_DIR}/lib/rule`);
|
||||
let { rmRf } = require(`${PROJECT_DIR}/lib/jake`);
|
||||
|
||||
let cleanUpAndNext = function (callback) {
|
||||
// Gotta add globbing to file utils rmRf
|
||||
let tmpFiles = [
|
||||
'tmp'
|
||||
, 'tmp_ns'
|
||||
, 'tmp_cr'
|
||||
, 'tmp_p'
|
||||
, 'tmp_pf'
|
||||
, 'tmpbin'
|
||||
, 'tmpsrc'
|
||||
, 'tmp_dep1.c'
|
||||
, 'tmp_dep1.o'
|
||||
, 'tmp_dep1.oo'
|
||||
, 'tmp_dep2.c'
|
||||
, 'tmp_dep2.o'
|
||||
, 'tmp_dep2.oo'
|
||||
, 'foo'
|
||||
, 'foo.html'
|
||||
];
|
||||
tmpFiles.forEach(function (f) {
|
||||
rmRf(f, {
|
||||
silent: true
|
||||
});
|
||||
});
|
||||
callback && callback();
|
||||
};
|
||||
|
||||
suite('rule', function () {
|
||||
|
||||
this.timeout(7000);
|
||||
|
||||
setup(function (next) {
|
||||
cleanUpAndNext(next);
|
||||
});
|
||||
|
||||
|
||||
// - name foo:bin/main.o
|
||||
// - pattern bin/%.o
|
||||
// - source src/%.c
|
||||
//
|
||||
// return {
|
||||
// 'dep' : 'foo:src/main.c',
|
||||
// 'file': 'src/main.c'
|
||||
// };
|
||||
test('Rule.getSource', function () {
|
||||
let src = Rule.getSource('foo:bin/main.o', 'bin/%.o', 'src/%.c');
|
||||
assert.equal('foo:src/main.c', src);
|
||||
});
|
||||
|
||||
test('rule w/o pattern', function () {
|
||||
let out = exec( `${JAKE_CMD} -q tmp`).toString().trim();
|
||||
let output = [
|
||||
"tmp_dep2.c task"
|
||||
, "tmp_dep1.c task"
|
||||
, "cp tmp_dep1.c tmp_dep1.o task"
|
||||
, "cp tmp_dep2.c tmp_dep2.o task"
|
||||
, "tmp task"];
|
||||
assert.equal( output.join('\n'), out);
|
||||
let data = fs.readFileSync(process.cwd() + '/tmp');
|
||||
assert.equal('src_1src_2', data.toString());
|
||||
cleanUpAndNext();
|
||||
});
|
||||
|
||||
test('rule w pattern w/o folder w/o namespace', function () {
|
||||
let out = exec( `${JAKE_CMD} -q tmp_p`).toString().trim();
|
||||
let output = [
|
||||
"tmp_dep2.c task"
|
||||
, "tmp_dep1.c task"
|
||||
, "cp tmp_dep1.c tmp_dep1.oo task"
|
||||
, "cp tmp_dep2.c tmp_dep2.oo task"
|
||||
, "tmp pattern task"];
|
||||
let data;
|
||||
assert.equal( output.join('\n'), out);
|
||||
data = fs.readFileSync(process.cwd() + '/tmp_p');
|
||||
assert.equal('src_1src_2 pattern', data.toString());
|
||||
cleanUpAndNext();
|
||||
});
|
||||
|
||||
test('rule w pattern w folder w/o namespace', function () {
|
||||
let out = exec( `${JAKE_CMD} -q tmp_pf`).toString().trim();
|
||||
let output = [
|
||||
"tmpsrc/tmp_dep1.c task"
|
||||
, "cp tmpsrc/tmp_dep1.c tmpbin/tmp_dep1.oo task"
|
||||
, "tmpsrc/tmp_dep2.c task"
|
||||
, "cp tmpsrc/tmp_dep2.c tmpbin/tmp_dep2.oo task"
|
||||
, "tmp pattern folder task"];
|
||||
let data;
|
||||
assert.equal( output.join('\n'), out);
|
||||
data = fs.readFileSync(process.cwd() + '/tmp_pf');
|
||||
assert.equal('src/src_1src/src_2 pattern folder', data.toString());
|
||||
cleanUpAndNext();
|
||||
});
|
||||
|
||||
test.skip('rule w pattern w folder w namespace', function () {
|
||||
let out = exec( `${JAKE_CMD} -q tmp_ns`).toString().trim();
|
||||
let output = [
|
||||
"tmpsrc/file2.c init task" // yes
|
||||
, "tmpsrc/tmp_dep2.c task" // no
|
||||
, "cp tmpsrc/tmp_dep2.c tmpbin/tmp_dep2.oo task" // no
|
||||
, "tmpsrc/dep1.c task" // no
|
||||
, "cp tmpsrc/dep1.c tmpbin/dep1.oo ns task" // no
|
||||
, "cp tmpsrc/file2.c tmpbin/file2.oo ns task" // yes
|
||||
, "tmp pattern folder namespace task"]; // yes
|
||||
let data;
|
||||
assert.equal( output.join('\n'), out);
|
||||
data = fs.readFileSync(process.cwd() + '/tmp_ns');
|
||||
assert.equal('src/src_1src/src_2src/src_3 pattern folder namespace', data.toString());
|
||||
cleanUpAndNext();
|
||||
});
|
||||
|
||||
test.skip('rule w chain w pattern w folder w namespace', function () {
|
||||
let out = exec( `${JAKE_CMD} -q tmp_cr`).toString().trim();
|
||||
let output = [
|
||||
"chainrule init task"
|
||||
, "cp tmpsrc/file1.tex tmpbin/file1.dvi tex->dvi task"
|
||||
, "cp tmpbin/file1.dvi tmpbin/file1.pdf dvi->pdf task"
|
||||
, "cp tmpsrc/file2.tex tmpbin/file2.dvi tex->dvi task"
|
||||
, "cp tmpbin/file2.dvi tmpbin/file2.pdf dvi->pdf task"
|
||||
, "tmp chainrule namespace task"];
|
||||
let data;
|
||||
assert.equal( output.join('\n'), out);
|
||||
data = fs.readFileSync(process.cwd() + '/tmp_cr');
|
||||
assert.equal('tex1 tex2 chainrule namespace', data.toString());
|
||||
cleanUpAndNext();
|
||||
});
|
||||
|
||||
|
||||
['precedence', 'regexPattern', 'sourceFunction'].forEach(function (key) {
|
||||
|
||||
test('rule with source file not created yet (' + key + ')', function () {
|
||||
let write = process.stderr.write;
|
||||
process.stderr.write = () => {};
|
||||
rmRf('foo.txt', {silent: true});
|
||||
rmRf('foo.html', {silent: true});
|
||||
try {
|
||||
exec(`${JAKE_CMD} ` + key + ':test');
|
||||
}
|
||||
catch(err) {
|
||||
// foo.txt prereq doesn't exist yet
|
||||
assert.ok(err.message.indexOf('Unknown task "foo.html"') > -1);
|
||||
}
|
||||
process.stderr.write = write;
|
||||
});
|
||||
|
||||
test('rule with source file now created (' + key + ')', function () {
|
||||
fs.writeFileSync('foo.txt', '');
|
||||
let out = exec(`${JAKE_CMD} -q ` + key + ':test').toString().trim();
|
||||
// Should run prereq and test task
|
||||
let output = [
|
||||
'created html'
|
||||
, 'ran test'
|
||||
];
|
||||
assert.equal(output.join('\n'), out);
|
||||
});
|
||||
|
||||
test('rule with source file modified (' + key + ')', function (next) {
|
||||
setTimeout(function () {
|
||||
fs.writeFileSync('foo.txt', '');
|
||||
let out = exec(`${JAKE_CMD} -q ` + key + ':test').toString().trim();
|
||||
// Should again run both prereq and test task
|
||||
let output = [
|
||||
'created html'
|
||||
, 'ran test'
|
||||
];
|
||||
assert.equal(output.join('\n'), out);
|
||||
//next();
|
||||
cleanUpAndNext(next);
|
||||
}, 1000); // Wait to do the touch to ensure mod-time is different
|
||||
});
|
||||
|
||||
test('rule with existing objective file and no source ' +
|
||||
' (should be normal file-task) (' + key + ')', function () {
|
||||
// Remove just the source file
|
||||
fs.writeFileSync('foo.html', '');
|
||||
rmRf('foo.txt', {silent: true});
|
||||
let out = exec(`${JAKE_CMD} -q ` + key + ':test').toString().trim();
|
||||
// Should treat existing objective file as plain file-task,
|
||||
// and just run test-task
|
||||
let output = [
|
||||
'ran test'
|
||||
];
|
||||
assert.equal(output.join('\n'), out);
|
||||
cleanUpAndNext();
|
||||
});
|
||||
|
||||
});
|
||||
|
||||
});
|
||||
|
||||
|
||||
42
32/node_modules/jake/test/integration/selfdep.js
generated
vendored
Normal file
42
32/node_modules/jake/test/integration/selfdep.js
generated
vendored
Normal file
@@ -0,0 +1,42 @@
|
||||
let assert = require('assert');
|
||||
let exec = require('child_process').execSync;
|
||||
|
||||
const PROJECT_DIR = process.env.PROJECT_DIR;
|
||||
const JAKE_CMD = `${PROJECT_DIR}/bin/cli.js`;
|
||||
|
||||
suite('selfDep', function () {
|
||||
|
||||
this.timeout(7000);
|
||||
|
||||
let origStderrWrite;
|
||||
|
||||
setup(function () {
|
||||
origStderrWrite = process.stderr.write;
|
||||
process.stderr.write = function () {};
|
||||
});
|
||||
|
||||
teardown(function () {
|
||||
process.stderr.write = origStderrWrite;
|
||||
});
|
||||
|
||||
test('self dep const', function () {
|
||||
try {
|
||||
exec(`${JAKE_CMD} selfdepconst`);
|
||||
}
|
||||
catch(e) {
|
||||
assert(e.message.indexOf('dependency of itself') > -1);
|
||||
}
|
||||
});
|
||||
|
||||
test('self dep dyn', function () {
|
||||
try {
|
||||
exec(`${JAKE_CMD} selfdepdyn`);
|
||||
}
|
||||
catch(e) {
|
||||
assert(e.message.indexOf('dependency of itself') > -1);
|
||||
}
|
||||
});
|
||||
|
||||
});
|
||||
|
||||
|
||||
167
32/node_modules/jake/test/integration/task_base.js
generated
vendored
Normal file
167
32/node_modules/jake/test/integration/task_base.js
generated
vendored
Normal file
@@ -0,0 +1,167 @@
|
||||
let assert = require('assert');
|
||||
let h = require('./helpers');
|
||||
let exec = require('child_process').execSync;
|
||||
|
||||
const PROJECT_DIR = process.env.PROJECT_DIR;
|
||||
const JAKE_CMD = `${PROJECT_DIR}/bin/cli.js`;
|
||||
|
||||
suite('taskBase', function () {
|
||||
|
||||
this.timeout(7000);
|
||||
|
||||
test('default task', function () {
|
||||
let out;
|
||||
out = exec(`${JAKE_CMD} -q`).toString().trim();
|
||||
assert.equal(out, 'default task');
|
||||
out = exec(`${JAKE_CMD} -q default`).toString().trim();
|
||||
assert.equal(out, 'default task');
|
||||
});
|
||||
|
||||
test('task with no action', function () {
|
||||
let out = exec(`${JAKE_CMD} -q noAction`).toString().trim();
|
||||
assert.equal(out, 'default task');
|
||||
});
|
||||
|
||||
test('a task with no action and no prereqs', function () {
|
||||
exec(`${JAKE_CMD} noActionNoPrereqs`);
|
||||
});
|
||||
|
||||
test('a task that exists at the top-level, and not in the specified namespace, should error', function () {
|
||||
let res = require('child_process').spawnSync(`${JAKE_CMD}`,
|
||||
['asdfasdfasdf:zerbofrangazoomy']);
|
||||
let err = res.stderr.toString();
|
||||
assert.ok(err.indexOf('Unknown task' > -1));
|
||||
});
|
||||
|
||||
test('passing args to a task', function () {
|
||||
let out = exec(`${JAKE_CMD} -q argsEnvVars[foo,bar]`).toString().trim();
|
||||
let parsed = h.parse(out);
|
||||
let args = parsed.args;
|
||||
assert.equal(args[0], 'foo');
|
||||
assert.equal(args[1], 'bar');
|
||||
});
|
||||
|
||||
test('a task with environment vars', function () {
|
||||
let out = exec(`${JAKE_CMD} -q argsEnvVars foo=bar baz=qux`).toString().trim();
|
||||
let parsed = h.parse(out);
|
||||
let env = parsed.env;
|
||||
assert.equal(env.foo, 'bar');
|
||||
assert.equal(env.baz, 'qux');
|
||||
});
|
||||
|
||||
test('passing args and using environment vars', function () {
|
||||
let out = exec(`${JAKE_CMD} -q argsEnvVars[foo,bar] foo=bar baz=qux`).toString().trim();
|
||||
let parsed = h.parse(out);
|
||||
let args = parsed.args;
|
||||
let env = parsed.env;
|
||||
assert.equal(args[0], 'foo');
|
||||
assert.equal(args[1], 'bar');
|
||||
assert.equal(env.foo, 'bar');
|
||||
assert.equal(env.baz, 'qux');
|
||||
});
|
||||
|
||||
test('a simple prereq', function () {
|
||||
let out = exec(`${JAKE_CMD} -q foo:baz`).toString().trim();
|
||||
assert.equal(out, 'foo:bar task\nfoo:baz task');
|
||||
});
|
||||
|
||||
test('a duplicate prereq only runs once', function () {
|
||||
let out = exec(`${JAKE_CMD} -q foo:asdf`).toString().trim();
|
||||
assert.equal(out, 'foo:bar task\nfoo:baz task\nfoo:asdf task');
|
||||
});
|
||||
|
||||
test('a prereq with command-line args', function () {
|
||||
let out = exec(`${JAKE_CMD} -q foo:qux`).toString().trim();
|
||||
assert.equal(out, 'foo:bar[asdf,qwer] task\nfoo:qux task');
|
||||
});
|
||||
|
||||
test('a prereq with args via invoke', function () {
|
||||
let out = exec(`${JAKE_CMD} -q foo:frang[zxcv,uiop]`).toString().trim();
|
||||
assert.equal(out, 'foo:bar[zxcv,uiop] task\nfoo:frang task');
|
||||
});
|
||||
|
||||
test('a prereq with args via execute', function () {
|
||||
let out = exec(`${JAKE_CMD} -q foo:zerb[zxcv,uiop]`).toString().trim();
|
||||
assert.equal(out, 'foo:bar[zxcv,uiop] task\nfoo:zerb task');
|
||||
});
|
||||
|
||||
test('repeating the task via execute', function () {
|
||||
let out = exec(`${JAKE_CMD} -q foo:voom`).toString().trim();
|
||||
assert.equal(out, 'foo:bar task\nfoo:bar task\ncomplete\ncomplete');
|
||||
});
|
||||
|
||||
test('prereq execution-order', function () {
|
||||
let out = exec(`${JAKE_CMD} -q hoge:fuga`).toString().trim();
|
||||
assert.equal(out, 'hoge:hoge task\nhoge:piyo task\nhoge:fuga task');
|
||||
});
|
||||
|
||||
test('basic async task', function () {
|
||||
let out = exec(`${JAKE_CMD} -q bar:bar`).toString().trim();
|
||||
assert.equal(out, 'bar:foo task\nbar:bar task');
|
||||
});
|
||||
|
||||
test('promise async task', function () {
|
||||
let out = exec(`${JAKE_CMD} -q bar:dependOnpromise`).toString().trim();
|
||||
assert.equal(out, 'bar:promise task\nbar:dependOnpromise task saw value 123654');
|
||||
});
|
||||
|
||||
test('failing promise async task', function () {
|
||||
try {
|
||||
exec(`${JAKE_CMD} -q bar:brokenPromise`);
|
||||
}
|
||||
catch(e) {
|
||||
assert(e.message.indexOf('Command failed') > -1);
|
||||
}
|
||||
});
|
||||
|
||||
test('that current-prereq index gets reset', function () {
|
||||
let out = exec(`${JAKE_CMD} -q hoge:kira`).toString().trim();
|
||||
assert.equal(out, 'hoge:hoge task\nhoge:piyo task\nhoge:fuga task\n' +
|
||||
'hoge:charan task\nhoge:gero task\nhoge:kira task');
|
||||
});
|
||||
|
||||
test('modifying a task by adding prereq during execution', function () {
|
||||
let out = exec(`${JAKE_CMD} -q voom`).toString().trim();
|
||||
assert.equal(out, 2);
|
||||
});
|
||||
|
||||
test('listening for task error-event', function () {
|
||||
try {
|
||||
exec(`${JAKE_CMD} -q vronk:groo`).toString().trim();
|
||||
}
|
||||
catch(e) {
|
||||
assert(e.message.indexOf('OMFGZONG') > -1);
|
||||
}
|
||||
});
|
||||
|
||||
test('listening for jake error-event', function () {
|
||||
let out = exec(`${JAKE_CMD} -q throwy`).toString().trim();
|
||||
assert(out.indexOf('Emitted\nError: I am bad') > -1);
|
||||
});
|
||||
|
||||
test('listening for jake unhandledRejection-event', function () {
|
||||
let out = exec(`${JAKE_CMD} -q promiseRejecter`).toString().trim();
|
||||
assert.equal(out, '<promise rejected on purpose>');
|
||||
});
|
||||
|
||||
test('large number of same prereqs', function () {
|
||||
let out = exec(`${JAKE_CMD} -q large:same`).toString().trim();
|
||||
assert.equal(out, 'large:leaf\nlarge:same');
|
||||
});
|
||||
|
||||
test('large number of different prereqs', function () {
|
||||
let out = exec(`${JAKE_CMD} -q large:different`).toString().trim();
|
||||
assert.equal(out, 'leaf-12\nleaf-123\nlarge:different');
|
||||
});
|
||||
|
||||
test('large number of different prereqs', function () {
|
||||
let out = exec(`${JAKE_CMD} -q usingRequire:test`).toString().trim();
|
||||
assert.equal(out, 'howdy test');
|
||||
});
|
||||
|
||||
test('modifying a namespace by adding a new task', function () {
|
||||
let out = exec(`${JAKE_CMD} -q one:two`).toString().trim();
|
||||
assert.equal('one:one\none:two', out);
|
||||
});
|
||||
|
||||
});
|
||||
36
32/node_modules/jake/test/unit/jakefile.js
generated
vendored
Normal file
36
32/node_modules/jake/test/unit/jakefile.js
generated
vendored
Normal file
@@ -0,0 +1,36 @@
|
||||
|
||||
task('foo', function () {
|
||||
console.log('ran top-level foo');
|
||||
});
|
||||
|
||||
task('bar', function () {
|
||||
console.log('ran top-level bar');
|
||||
});
|
||||
|
||||
task('zerb', function () {
|
||||
console.log('ran zerb');
|
||||
});
|
||||
|
||||
namespace('zooby', function () {
|
||||
task('zerp', function () {});
|
||||
|
||||
task('derp', ['zerp'], function () {});
|
||||
|
||||
namespace('frang', function () {
|
||||
|
||||
namespace('w00t', function () {
|
||||
task('bar', function () {
|
||||
console.log('ran zooby:frang:w00t:bar');
|
||||
});
|
||||
});
|
||||
|
||||
task('asdf', function () {});
|
||||
});
|
||||
|
||||
});
|
||||
|
||||
namespace('hurr', function () {
|
||||
namespace('durr');
|
||||
});
|
||||
|
||||
|
||||
77
32/node_modules/jake/test/unit/namespace.js
generated
vendored
Normal file
77
32/node_modules/jake/test/unit/namespace.js
generated
vendored
Normal file
@@ -0,0 +1,77 @@
|
||||
/*
|
||||
* Jake JavaScript build tool
|
||||
* Copyright 2112 Matthew Eernisse (mde@fleegix.org)
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*
|
||||
*/
|
||||
|
||||
const PROJECT_DIR = process.env.PROJECT_DIR;
|
||||
|
||||
// Load the jake global
|
||||
require(`${PROJECT_DIR}/lib/jake`);
|
||||
let { Namespace } = require(`${PROJECT_DIR}/lib/namespace`);
|
||||
|
||||
require('./jakefile');
|
||||
|
||||
let assert = require('assert');
|
||||
|
||||
suite('namespace', function () {
|
||||
|
||||
this.timeout(7000);
|
||||
|
||||
test('resolve namespace by relative name', function () {
|
||||
let aaa, bbb, ccc;
|
||||
aaa = namespace('aaa', function () {
|
||||
bbb = namespace('bbb', function () {
|
||||
ccc = namespace('ccc', function () {
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
assert.ok(aaa, Namespace.ROOT_NAMESPACE.resolveNamespace('aaa'));
|
||||
assert.ok(bbb === aaa.resolveNamespace('bbb'));
|
||||
assert.ok(ccc === aaa.resolveNamespace('bbb:ccc'));
|
||||
});
|
||||
|
||||
test('resolve task in sub-namespace by relative path', function () {
|
||||
let curr = Namespace.ROOT_NAMESPACE.resolveNamespace('zooby');
|
||||
let task = curr.resolveTask('frang:w00t:bar');
|
||||
assert.ok(task.action.toString().indexOf('zooby:frang:w00t:bar') > -1);
|
||||
});
|
||||
|
||||
test('prefer local to top-level', function () {
|
||||
let curr = Namespace.ROOT_NAMESPACE.resolveNamespace('zooby:frang:w00t');
|
||||
let task = curr.resolveTask('bar');
|
||||
assert.ok(task.action.toString().indexOf('zooby:frang:w00t:bar') > -1);
|
||||
});
|
||||
|
||||
test('does resolve top-level', function () {
|
||||
let curr = Namespace.ROOT_NAMESPACE.resolveNamespace('zooby:frang:w00t');
|
||||
let task = curr.resolveTask('foo');
|
||||
assert.ok(task.action.toString().indexOf('top-level foo') > -1);
|
||||
});
|
||||
|
||||
test('absolute lookup works from sub-namespaces', function () {
|
||||
let curr = Namespace.ROOT_NAMESPACE.resolveNamespace('hurr:durr');
|
||||
let task = curr.resolveTask('zooby:frang:w00t:bar');
|
||||
assert.ok(task.action.toString().indexOf('zooby:frang:w00t:bar') > -1);
|
||||
});
|
||||
|
||||
test('resolution miss with throw error', function () {
|
||||
let curr = Namespace.ROOT_NAMESPACE;
|
||||
let task = curr.resolveTask('asdf:qwer');
|
||||
assert.ok(!task);
|
||||
});
|
||||
|
||||
});
|
||||
169
32/node_modules/jake/test/unit/parseargs.js
generated
vendored
Normal file
169
32/node_modules/jake/test/unit/parseargs.js
generated
vendored
Normal file
@@ -0,0 +1,169 @@
|
||||
/*
|
||||
* Jake JavaScript build tool
|
||||
* Copyright 2112 Matthew Eernisse (mde@fleegix.org)
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*
|
||||
*/
|
||||
|
||||
const PROJECT_DIR = process.env.PROJECT_DIR;
|
||||
|
||||
let parseargs = require(`${PROJECT_DIR}/lib/parseargs`);
|
||||
let assert = require('assert');
|
||||
let optsReg = [
|
||||
{ full: 'directory',
|
||||
abbr: 'C',
|
||||
preempts: false,
|
||||
expectValue: true
|
||||
},
|
||||
{ full: 'jakefile',
|
||||
abbr: 'f',
|
||||
preempts: false,
|
||||
expectValue: true
|
||||
},
|
||||
{ full: 'tasks',
|
||||
abbr: 'T',
|
||||
preempts: true
|
||||
},
|
||||
{ full: 'tasks',
|
||||
abbr: 'ls',
|
||||
preempts: true
|
||||
},
|
||||
{ full: 'trace',
|
||||
abbr: 't',
|
||||
preempts: false,
|
||||
expectValue: false
|
||||
},
|
||||
{ full: 'help',
|
||||
abbr: 'h',
|
||||
preempts: true
|
||||
},
|
||||
{ full: 'version',
|
||||
abbr: 'V',
|
||||
preempts: true
|
||||
}
|
||||
];
|
||||
let p = new parseargs.Parser(optsReg);
|
||||
let z = function (s) { return s.split(' '); };
|
||||
let res;
|
||||
|
||||
suite('parseargs', function () {
|
||||
|
||||
test('long preemptive opt and val with equal-sign, ignore further opts', function () {
|
||||
res = p.parse(z('--tasks=foo --jakefile=asdf'));
|
||||
assert.equal('foo', res.opts.tasks);
|
||||
assert.equal(undefined, res.opts.jakefile);
|
||||
});
|
||||
|
||||
test('long preemptive opt and val without equal-sign, ignore further opts', function () {
|
||||
res = p.parse(z('--tasks foo --jakefile=asdf'));
|
||||
assert.equal('foo', res.opts.tasks);
|
||||
assert.equal(undefined, res.opts.jakefile);
|
||||
});
|
||||
|
||||
test('long preemptive opt and no val, ignore further opts', function () {
|
||||
res = p.parse(z('--tasks --jakefile=asdf'));
|
||||
assert.equal(true, res.opts.tasks);
|
||||
assert.equal(undefined, res.opts.jakefile);
|
||||
});
|
||||
|
||||
test('preemptive opt with no val, should be true', function () {
|
||||
res = p.parse(z('-T'));
|
||||
assert.equal(true, res.opts.tasks);
|
||||
});
|
||||
|
||||
test('preemptive opt with no val, should be true and ignore further opts', function () {
|
||||
res = p.parse(z('-T -f'));
|
||||
assert.equal(true, res.opts.tasks);
|
||||
assert.equal(undefined, res.opts.jakefile);
|
||||
});
|
||||
|
||||
test('preemptive opt with val, should be val', function () {
|
||||
res = p.parse(z('-T zoobie -f foo/bar/baz'));
|
||||
assert.equal('zoobie', res.opts.tasks);
|
||||
assert.equal(undefined, res.opts.jakefile);
|
||||
});
|
||||
|
||||
test('-f expects a value, -t does not (howdy is task-name)', function () {
|
||||
res = p.parse(z('-f zoobie -t howdy'));
|
||||
assert.equal('zoobie', res.opts.jakefile);
|
||||
assert.equal(true, res.opts.trace);
|
||||
assert.equal('howdy', res.taskNames[0]);
|
||||
});
|
||||
|
||||
test('different order, -f expects a value, -t does not (howdy is task-name)', function () {
|
||||
res = p.parse(z('-f zoobie howdy -t'));
|
||||
assert.equal('zoobie', res.opts.jakefile);
|
||||
assert.equal(true, res.opts.trace);
|
||||
assert.equal('howdy', res.taskNames[0]);
|
||||
});
|
||||
|
||||
test('-f expects a value, -t does not (foo=bar is env var)', function () {
|
||||
res = p.parse(z('-f zoobie -t foo=bar'));
|
||||
assert.equal('zoobie', res.opts.jakefile);
|
||||
assert.equal(true, res.opts.trace);
|
||||
assert.equal('bar', res.envVars.foo);
|
||||
assert.equal(undefined, res.taskNames[0]);
|
||||
});
|
||||
|
||||
test('-f expects a value, -t does not (foo=bar is env-var, task-name follows)', function () {
|
||||
res = p.parse(z('-f zoobie -t howdy foo=bar'));
|
||||
assert.equal('zoobie', res.opts.jakefile);
|
||||
assert.equal(true, res.opts.trace);
|
||||
assert.equal('bar', res.envVars.foo);
|
||||
assert.equal('howdy', res.taskNames[0]);
|
||||
});
|
||||
|
||||
test('-t does not expect a value, -f does (howdy is task-name)', function () {
|
||||
res = p.parse(z('-t howdy -f zoobie'));
|
||||
assert.equal(true, res.opts.trace);
|
||||
assert.equal('zoobie', res.opts.jakefile);
|
||||
assert.equal('howdy', res.taskNames[0]);
|
||||
});
|
||||
|
||||
test('--trace does not expect a value, -f does (howdy is task-name)', function () {
|
||||
res = p.parse(z('--trace howdy --jakefile zoobie'));
|
||||
assert.equal(true, res.opts.trace);
|
||||
assert.equal('zoobie', res.opts.jakefile);
|
||||
assert.equal('howdy', res.taskNames[0]);
|
||||
});
|
||||
|
||||
test('--trace does not expect a value (equal), -f does (throw howdy away)', function () {
|
||||
res = p.parse(z('--trace=howdy --jakefile=zoobie'));
|
||||
assert.equal(true, res.opts.trace);
|
||||
assert.equal('zoobie', res.opts.jakefile);
|
||||
assert.equal(undefined, res.taskNames[0]);
|
||||
});
|
||||
|
||||
/*
|
||||
, test('task-name with positional args', function () {
|
||||
res = p.parse(z('foo:bar[asdf,qwer]'));
|
||||
assert.equal('asdf', p.taskArgs[0]);
|
||||
assert.equal('qwer', p.taskArgs[1]);
|
||||
}
|
||||
|
||||
, test('opts, env vars, task-name with positional args', function () {
|
||||
res = p.parse(z('-f ./tests/Jakefile -t default[asdf,qwer] foo=bar'));
|
||||
assert.equal('./tests/Jakefile', res.opts.jakefile);
|
||||
assert.equal(true, res.opts.trace);
|
||||
assert.equal('bar', res.envVars.foo);
|
||||
assert.equal('default', res.taskName);
|
||||
assert.equal('asdf', p.taskArgs[0]);
|
||||
assert.equal('qwer', p.taskArgs[1]);
|
||||
}
|
||||
*/
|
||||
|
||||
|
||||
});
|
||||
|
||||
|
||||
17
32/node_modules/jake/usage.txt
generated
vendored
Normal file
17
32/node_modules/jake/usage.txt
generated
vendored
Normal file
@@ -0,0 +1,17 @@
|
||||
Jake JavaScript build tool
|
||||
********************************************************************************
|
||||
If no flags are given, Jake looks for a Jakefile or Jakefile.js in the current directory.
|
||||
********************************************************************************
|
||||
{Usage}: jake [options ...] [env variables ...] target
|
||||
|
||||
{Options}:
|
||||
-f, --jakefile FILE Use FILE as the Jakefile.
|
||||
-C, --directory DIRECTORY Change to DIRECTORY before running tasks.
|
||||
-q, --quiet Do not log messages to standard output.
|
||||
-B, --always-make Unconditionally make all targets.
|
||||
-T/-ls, --tasks Display the tasks (matching optional PATTERN) with descriptions, then exit.
|
||||
-J, --jakelibdir JAKELIBDIR Auto-import any .jake files in JAKELIBDIR. (default is \'jakelib\')
|
||||
-h, --help Display this help message.
|
||||
-V/-v, --version Display the Jake version.
|
||||
-ar, --allow-rejection Keep running even after unhandled promise rejection.
|
||||
|
||||
Reference in New Issue
Block a user