Return-Path: X-Original-To: apmail-cordova-commits-archive@www.apache.org Delivered-To: apmail-cordova-commits-archive@www.apache.org Received: from mail.apache.org (hermes.apache.org [140.211.11.3]) by minotaur.apache.org (Postfix) with SMTP id 4BEB510881 for ; Thu, 20 Nov 2014 00:33:28 +0000 (UTC) Received: (qmail 19139 invoked by uid 500); 20 Nov 2014 00:33:28 -0000 Delivered-To: apmail-cordova-commits-archive@cordova.apache.org Received: (qmail 19023 invoked by uid 500); 20 Nov 2014 00:33:28 -0000 Mailing-List: contact commits-help@cordova.apache.org; run by ezmlm Precedence: bulk List-Help: List-Unsubscribe: List-Post: List-Id: Delivered-To: mailing list commits@cordova.apache.org Received: (qmail 19002 invoked by uid 99); 20 Nov 2014 00:33:28 -0000 Received: from tyr.zones.apache.org (HELO tyr.zones.apache.org) (140.211.11.114) by apache.org (qpsmtpd/0.29) with ESMTP; Thu, 20 Nov 2014 00:33:28 +0000 Received: by tyr.zones.apache.org (Postfix, from userid 65534) id B95F7945FF4; Thu, 20 Nov 2014 00:33:27 +0000 (UTC) Content-Type: text/plain; charset="us-ascii" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit From: shazron@apache.org To: commits@cordova.apache.org Date: Thu, 20 Nov 2014 00:33:28 -0000 Message-Id: <18ace344715c4371a573df6d3b698f89@git.apache.org> In-Reply-To: <23a9be3ef7a04a2488148b6fdef4f822@git.apache.org> References: <23a9be3ef7a04a2488148b6fdef4f822@git.apache.org> X-Mailer: ASF-Git Admin Mailer Subject: [2/2] ios commit: CB-5706 convert some of the bash scripts to nodejs (closes #118) CB-5706 convert some of the bash scripts to nodejs (closes #118) Project: http://git-wip-us.apache.org/repos/asf/cordova-ios/repo Commit: http://git-wip-us.apache.org/repos/asf/cordova-ios/commit/dd54d96b Tree: http://git-wip-us.apache.org/repos/asf/cordova-ios/tree/dd54d96b Diff: http://git-wip-us.apache.org/repos/asf/cordova-ios/diff/dd54d96b Branch: refs/heads/master Commit: dd54d96bd0eddb7f8967d0d1fcfb90f2635ed22a Parents: 5769d58 Author: Edna Morales Authored: Mon Nov 3 15:18:05 2014 -0500 Committer: Shazron Abdullah Committed: Wed Nov 19 16:26:28 2014 -0800 ---------------------------------------------------------------------- bin/apple_ios_version | 47 +- bin/apple_ios_version.bat | 26 + bin/apple_osx_version | 47 +- bin/apple_osx_version.bat | 26 + bin/apple_xcode_version | 47 +- bin/apple_xcode_version.bat | 26 + bin/create | 205 +- bin/create.bat | 26 + bin/lib/create.js | 255 +++ bin/lib/update.js | 72 + bin/lib/versions.js | 101 + bin/node_modules/q/CONTRIBUTING.md | 40 + bin/node_modules/q/LICENSE | 18 + bin/node_modules/q/README.md | 820 ++++++++ .../q/benchmark/compare-with-callbacks.js | 71 + bin/node_modules/q/benchmark/scenarios.js | 36 + bin/node_modules/q/package.json | 112 ++ bin/node_modules/q/q.js | 1904 ++++++++++++++++++ bin/node_modules/q/queue.js | 35 + bin/node_modules/which/LICENSE | 23 + bin/node_modules/which/README.md | 5 + bin/node_modules/which/bin/which | 14 + bin/node_modules/which/package.json | 31 + bin/node_modules/which/which.js | 104 + bin/replaces | 28 - bin/templates/scripts/cordova/version | 51 +- bin/templates/scripts/cordova/version.bat | 26 + bin/update | 95 +- bin/update.bat | 26 + bin/update_cordova_subproject | 137 +- bin/update_cordova_subproject.bat | 26 + 31 files changed, 4019 insertions(+), 461 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/cordova-ios/blob/dd54d96b/bin/apple_ios_version ---------------------------------------------------------------------- diff --git a/bin/apple_ios_version b/bin/apple_ios_version index 8a5aa7d..d397bb6 100755 --- a/bin/apple_ios_version +++ b/bin/apple_ios_version @@ -1,24 +1,27 @@ -#! /bin/sh +#!/usr/bin/env node -# -# Licensed to the Apache Software Foundation (ASF) under one -# or more contributor license agreements. See the NOTICE file -# distributed with this work for additional information -# regarding copyright ownership. The ASF licenses this file -# to you 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. -# +/* + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file + distributed with this work for additional information + regarding copyright ownership. The ASF licenses this file + to you 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 -# outputs the highest level of iOS sdk installed -iOS_X_VERSIONS=$(xcodebuild -showsdks | sed -e '/./{H;$!d;}' -e 'x;/iOS SDKs/!d;' | grep -o '[0-9]*\.[0-9]* '); -echo $iOS_X_VERSIONS | tr " " "\n" | sort -g | tail -1; \ No newline at end of file + 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. +*/ + +var versions = require('./lib/versions.js'); + +versions.get_apple_ios_version().done(null, function(err) { + console.log(err); + process.exit(2); +}); http://git-wip-us.apache.org/repos/asf/cordova-ios/blob/dd54d96b/bin/apple_ios_version.bat ---------------------------------------------------------------------- diff --git a/bin/apple_ios_version.bat b/bin/apple_ios_version.bat new file mode 100644 index 0000000..8219312 --- /dev/null +++ b/bin/apple_ios_version.bat @@ -0,0 +1,26 @@ +:: Licensed to the Apache Software Foundation (ASF) under one +:: or more contributor license agreements. See the NOTICE file +:: distributed with this work for additional information +:: regarding copyright ownership. The ASF licenses this file +:: to you 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. + +@ECHO OFF +SET script="%~dp0apple_ios_version" +IF EXIST %script% ( + node %script% %* +) ELSE ( + ECHO. + ECHO ERROR: Could not find 'apple_ios_version' script in 'bin' folder, aborting...>&2 + EXIT /B 1 +) http://git-wip-us.apache.org/repos/asf/cordova-ios/blob/dd54d96b/bin/apple_osx_version ---------------------------------------------------------------------- diff --git a/bin/apple_osx_version b/bin/apple_osx_version index 401e9cb..6e697ad 100755 --- a/bin/apple_osx_version +++ b/bin/apple_osx_version @@ -1,24 +1,27 @@ -#! /bin/sh +#!/usr/bin/env node -# -# Licensed to the Apache Software Foundation (ASF) under one -# or more contributor license agreements. See the NOTICE file -# distributed with this work for additional information -# regarding copyright ownership. The ASF licenses this file -# to you 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. -# +/* + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file + distributed with this work for additional information + regarding copyright ownership. The ASF licenses this file + to you 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 -# outputs the highest level of OS X sdk installed -OS_X_VERSIONS=$(xcodebuild -showsdks | sed -e '/./{H;$!d;}' -e 'x;/OS X SDKs/!d;' | grep -o '[0-9]*\.[0-9]* '); -echo $OS_X_VERSIONS | tr " " "\n" | sort -g | tail -1; \ No newline at end of file + 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. +*/ + +var versions = require('./lib/versions.js'); + +versions.get_apple_osx_version().done(null, function(err) { + console.log(err); + process.exit(2); +}); http://git-wip-us.apache.org/repos/asf/cordova-ios/blob/dd54d96b/bin/apple_osx_version.bat ---------------------------------------------------------------------- diff --git a/bin/apple_osx_version.bat b/bin/apple_osx_version.bat new file mode 100644 index 0000000..d2acec7 --- /dev/null +++ b/bin/apple_osx_version.bat @@ -0,0 +1,26 @@ +:: Licensed to the Apache Software Foundation (ASF) under one +:: or more contributor license agreements. See the NOTICE file +:: distributed with this work for additional information +:: regarding copyright ownership. The ASF licenses this file +:: to you 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. + +@ECHO OFF +SET script="%~dp0apple_osx_version" +IF EXIST %script% ( + node %script% %* +) ELSE ( + ECHO. + ECHO ERROR: Could not find 'apple_osx_version' script in 'bin' folder, aborting...>&2 + EXIT /B 1 +) http://git-wip-us.apache.org/repos/asf/cordova-ios/blob/dd54d96b/bin/apple_xcode_version ---------------------------------------------------------------------- diff --git a/bin/apple_xcode_version b/bin/apple_xcode_version index d459b30..5dfe501 100755 --- a/bin/apple_xcode_version +++ b/bin/apple_xcode_version @@ -1,24 +1,27 @@ -#! /bin/sh +#!/usr/bin/env node -# -# Licensed to the Apache Software Foundation (ASF) under one -# or more contributor license agreements. See the NOTICE file -# distributed with this work for additional information -# regarding copyright ownership. The ASF licenses this file -# to you 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. -# +/* + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file + distributed with this work for additional information + regarding copyright ownership. The ASF licenses this file + to you 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 -# outputs which version of XCODE is installed -XCODEBUILD_VERSION=$(xcodebuild -version | head -n 1 | sed -e 's/Xcode //') -echo $XCODEBUILD_VERSION \ No newline at end of file + 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. +*/ + +var versions = require('./lib/versions.js'); + +versions.get_apple_xcode_version().done(null, function(err) { + console.log(err); + process.exit(2); +}); http://git-wip-us.apache.org/repos/asf/cordova-ios/blob/dd54d96b/bin/apple_xcode_version.bat ---------------------------------------------------------------------- diff --git a/bin/apple_xcode_version.bat b/bin/apple_xcode_version.bat new file mode 100644 index 0000000..c19f911 --- /dev/null +++ b/bin/apple_xcode_version.bat @@ -0,0 +1,26 @@ +:: Licensed to the Apache Software Foundation (ASF) under one +:: or more contributor license agreements. See the NOTICE file +:: distributed with this work for additional information +:: regarding copyright ownership. The ASF licenses this file +:: to you 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. + +@ECHO OFF +SET script="%~dp0apple_xcode_version" +IF EXIST %script% ( + node %script% %* +) ELSE ( + ECHO. + ECHO ERROR: Could not find 'apple_xcode_version' script in 'bin' folder, aborting...>&2 + EXIT /B 1 +) http://git-wip-us.apache.org/repos/asf/cordova-ios/blob/dd54d96b/bin/create ---------------------------------------------------------------------- diff --git a/bin/create b/bin/create index b652adf..eeffc10 100755 --- a/bin/create +++ b/bin/create @@ -1,165 +1,42 @@ -#! /bin/sh - -# -# Licensed to the Apache Software Foundation (ASF) under one -# or more contributor license agreements. See the NOTICE file -# distributed with this work for additional information -# regarding copyright ownership. The ASF licenses this file -# to you 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. -# - -# -# create a Cordova/iOS project -# -# USAGE -# ./create -# -# EXAMPLE -# ./create ~/Desktop/radness org.apache.cordova.radness Radness -# -set -e - -function usage() { - echo "Usage: $0 [--shared] [--cli] []" - echo " --shared (optional): Link directly against the shared copy of the CordovaLib instead of a copy of it." - echo " --cli (optional): Use the CLI-project template." - echo " : Path to your new Cordova iOS project" - echo " : Package name, following reverse-domain style convention" - echo " : Project name" - echo " : Path to project template (override)." - exit 1 +#!/usr/bin/env node + +/* + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file + distributed with this work for additional information + regarding copyright ownership. The ASF licenses this file + to you 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. +*/ + +/* + * create a Cordova/iOS project + * + * USAGE + * ./create + * + * EXAMPLE + * ./create ~/Desktop/radness org.apache.cordova.radness Radness + */ + +var create = require('./lib/create'); + +if (process.argv.length < 3 || process.argv[2].indexOf('--help') > -1) { + create.createHelp(); +} +else { + create.createProject(process.argv).done(null, function(err) { + console.error('Failed to create project because of error: ' + err); + process.exit(2); + }); } - -USE_SHARED=0 -USE_CLI=0 -while [ $# -gt 0 ]; do - case "$1" in - --shared) USE_SHARED=1 ;; - --cli) USE_CLI=1 ;; - -*) ;; - *) - if [[ -z "$PROJECT_PATH" ]]; then - PROJECT_PATH="$1" - elif [[ -z "$PACKAGE" ]]; then - PACKAGE="$1" - elif [[ -z "$PROJECT_NAME" ]]; then - PROJECT_NAME="$1" - elif [[ -z "$PROJECT_TEMPLATE_DIR" ]]; then - PROJECT_TEMPLATE_DIR="$1" - else - echo "Too many arguments to $0". >&2 - usage - fi - esac - shift -done - -# check whether it is a proper create command (at least 3 arguments) -if [[ -z "$PROJECT_NAME" ]]; then - usage -fi - -# the two lines below are to get the current folder, and resolve symlinks -SCRIPT="$0" -# need this for relative symlinks -while [ -h "$SCRIPT" ] ; do - SCRIPT=`readlink "$SCRIPT"` -done - -BINDIR=$( cd "$( dirname "$SCRIPT" )" && pwd ) -CORDOVALIB_DIR="$BINDIR/../CordovaLib" -CDV_VER=$(cat "$CORDOVALIB_DIR/VERSION") - -PROJECT_PARENT=$(dirname "$PROJECT_PATH") -PROJECT_TEMPLATE_DIR=${PROJECT_TEMPLATE_DIR:-"$BINDIR/templates/project"} -SCRIPT_TEMPLATE_DIR=$BINDIR/templates/scripts - -"$BINDIR/check_reqs" || exit $? - -# check whether the project path exists and is not empty -if [ -d "$PROJECT_PATH" ]; then - if [ "$(ls -1A "$PROJECT_PATH")" ]; then - echo "\033[31mError: $PROJECT_PATH is not empty. Please specify an empty folder.\033[m" - exit 1 - fi -fi - -#Ensure the parent directory exists so cp -r will not fail -if [ ! -d "$PROJECT_PARENT" ]; then - echo "\033[31mError: $PROJECT_PARENT does not exist. Please specify an existing parent folder.\033[m" - exit 1 -fi - -mkdir -p "$PROJECT_PATH" -cp -r "$PROJECT_TEMPLATE_DIR/www" "$PROJECT_PATH"/www -cp "$CORDOVALIB_DIR/cordova.js" "$PROJECT_PATH/www/cordova.js" -if (($USE_CLI)); then - cp -r "$PROJECT_TEMPLATE_DIR/__CLI__.xcodeproj" "$PROJECT_PATH/$PROJECT_NAME.xcodeproj" -else - cp -r "$PROJECT_TEMPLATE_DIR/__NON-CLI__.xcodeproj" "$PROJECT_PATH/$PROJECT_NAME.xcodeproj" -fi -cp -r "$PROJECT_TEMPLATE_DIR/__PROJECT_NAME__" "$PROJECT_PATH/$PROJECT_NAME" - -R=$PROJECT_PATH/$PROJECT_NAME -mv "$R/__PROJECT_NAME__-Info.plist" "$R/$PROJECT_NAME-Info.plist" -mv "$R/__PROJECT_NAME__-Prefix.pch" "$R/$PROJECT_NAME-Prefix.pch" -mv "$R/gitignore" "$R/.gitignore" - -# replace __PROJECT_NAME__ and --ID-- with ACTIVITY and ID strings, respectively, in: -# -# - ./__PROJECT_NAME__.xcodeproj/project.pbxproj -# - ./__PROJECT_NAME__/Classes/AppDelegate.h -# - ./__PROJECT_NAME__/Classes/AppDelegate.m -# - ./__PROJECT_NAME__/Resources/main.m -# - ./__PROJECT_NAME__/Resources/__PROJECT_NAME__-info.plist -# - ./__PROJECT_NAME__/Resources/__PROJECT_NAME__-Prefix.plist - -PROJECT_NAME_ESC="${PROJECT_NAME//&/\\&}" -"$BINDIR/replaces" "$R.xcodeproj/project.pbxproj" __PROJECT_NAME__ "$PROJECT_NAME_ESC" -"$BINDIR/replaces" "$R/Classes/AppDelegate.h" __PROJECT_NAME__ "$PROJECT_NAME_ESC" -"$BINDIR/replaces" "$R/Classes/AppDelegate.m" __PROJECT_NAME__ "$PROJECT_NAME_ESC" -"$BINDIR/replaces" "$R/Classes/MainViewController.h" __PROJECT_NAME__ "$PROJECT_NAME_ESC" -"$BINDIR/replaces" "$R/Classes/MainViewController.m" __PROJECT_NAME__ "$PROJECT_NAME_ESC" -"$BINDIR/replaces" "$R/main.m" __PROJECT_NAME__ "$PROJECT_NAME_ESC" -"$BINDIR/replaces" "$R/$PROJECT_NAME-Info.plist" __PROJECT_NAME__ "$PROJECT_NAME_ESC" -"$BINDIR/replaces" "$R/$PROJECT_NAME-Prefix.pch" __PROJECT_NAME__ "$PROJECT_NAME_ESC" - -"$BINDIR/replaces" "$R/$PROJECT_NAME-Info.plist" --ID-- $PACKAGE - -if [[ $USE_SHARED = 1 ]]; then - # Make the sub-project reference to Cordova have the correct path. - "$BINDIR/update_cordova_subproject" "$R.xcodeproj/project.pbxproj" > /dev/null -else - # Copy in the CordovaLib directory. - mkdir -p "$PROJECT_PATH/CordovaLib/CordovaLib.xcodeproj" - cp "$R/.gitignore" "$PROJECT_PATH/" - cp -r "$BINDIR/../CordovaLib/Classes" "$PROJECT_PATH/CordovaLib" - cp "$BINDIR/../CordovaLib/VERSION" "$PROJECT_PATH/CordovaLib" - cp "$BINDIR/../CordovaLib/cordova.js" "$PROJECT_PATH/CordovaLib" - cp "$BINDIR/../CordovaLib/CordovaLib_Prefix.pch" "$PROJECT_PATH/CordovaLib" - cp "$BINDIR/../CordovaLib/CordovaLib.xcodeproj/project.pbxproj" "$PROJECT_PATH/CordovaLib/CordovaLib.xcodeproj" - # Make the sub-project reference to Cordova have the correct path. - "$BINDIR/update_cordova_subproject" "$R.xcodeproj/project.pbxproj" "$PROJECT_PATH/CordovaLib/CordovaLib.xcodeproj/project.pbxproj" > /dev/null -fi - -# Finally copy the scripts -cp -r "$SCRIPT_TEMPLATE_DIR"/* "$PROJECT_PATH/" - -# copy the check_reqs script -cp "$BINDIR/check_reqs" "$PROJECT_PATH"/cordova - -# copy the version scripts script -cp "$BINDIR/apple_ios_version" "$PROJECT_PATH"/cordova -cp "$BINDIR/apple_osx_version" "$PROJECT_PATH"/cordova -cp "$BINDIR/apple_xcode_version" "$PROJECT_PATH"/cordova http://git-wip-us.apache.org/repos/asf/cordova-ios/blob/dd54d96b/bin/create.bat ---------------------------------------------------------------------- diff --git a/bin/create.bat b/bin/create.bat new file mode 100644 index 0000000..43172a6 --- /dev/null +++ b/bin/create.bat @@ -0,0 +1,26 @@ +:: Licensed to the Apache Software Foundation (ASF) under one +:: or more contributor license agreements. See the NOTICE file +:: distributed with this work for additional information +:: regarding copyright ownership. The ASF licenses this file +:: to you 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. + +@ECHO OFF +SET script="%~dp0create" +IF EXIST %script% ( + node %script% %* +) ELSE ( + ECHO. + ECHO ERROR: Could not find 'create' script in 'bin' folder, aborting...>&2 + EXIT /B 1 +) http://git-wip-us.apache.org/repos/asf/cordova-ios/blob/dd54d96b/bin/lib/create.js ---------------------------------------------------------------------- diff --git a/bin/lib/create.js b/bin/lib/create.js new file mode 100755 index 0000000..8c37c80 --- /dev/null +++ b/bin/lib/create.js @@ -0,0 +1,255 @@ +#!/usr/bin/env node + +/* + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file + distributed with this work for additional information + regarding copyright ownership. The ASF licenses this file + to you 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. +*/ + +var shell = require('shelljs'), + Q = require ('q'), + path = require('path'), + fs = require('fs'), + root = path.join(__dirname, '..', '..'); + +function createHelp() { + console.log("Usage: $0 [--shared] [--cli] []"); + console.log(" --shared (optional): Link directly against the shared copy of the CordovaLib instead of a copy of it."); + console.log(" --cli (optional): Use the CLI-project template."); + console.log(" : Path to your new Cordova iOS project"); + console.log(" : Package name, following reverse-domain style convention"); + console.log(" : Project name"); + console.log(" : Path to project template (override)."); +} + +function updateSubprojectHelp() { + console.log('Updates the subproject path of the CordovaLib entry to point to this script\'s version of Cordova.') + console.log("Usage: CordovaVersion/bin/update_cordova_project path/to/your/app.xcodeproj [path/to/CordovaLib.xcodeproj]"); +} + +function AbsParentPath(_path) { + return path.resolve(path.dirname(_path)); +} + +function AbsProjectPath(relative_path) { + var absolute_path = path.resolve(relative_path); + if (/.pbxproj$/.test(absolute_path)) { + absolute_path = AbsParentPath(absolute_path); + } + else if (!(/.xcodeproj$/.test(absolute_path))) { + throw new Error('The following is not a valid path to an Xcode project' + absolute_path); + } + return absolute_path; +} + +function relpath(_path, start) { + start = start || process.cwd(); + return path.relative(path.resolve(start), path.resolve(_path)); +} + +/* + * Creates a new iOS project with the following options: + * + * - --shared (optional): Link directly against the shared copy of the CordovaLib instead of a copy of it + * - --cli (optional): Use the CLI-project template + * - : Path to your new Cordova iOS project + * - : Package name, following reverse-domain style convention + * - : Project name + * - : Path to a project template (override) + * + */ + +exports.createProject = function(argv) { + var project_path, + package_name, + project_name, + project_template_dir, + use_shared = false, + use_cli = false; + + //get arguments + var args = argv.slice(2); + + //check and set arguments + if (args.length < 3) + { + createHelp(); + return Q.reject('Too few arguments'); + } + + for (var i = 0; i < args.length; i++) { + if (args[i] === '--shared') + use_shared = true; + else if (args[i] === '--cli') + use_cli = true; + else + { + if (!project_path) + project_path = args[i]; + else if (!package_name) + package_name = args[i]; + else if (!project_name) + project_name = args[i]; + else if (!project_template_dir) + project_template_dir = args[i]; + else + { + createHelp(); + return Q.reject('Too many arguments'); + } + } + } + + var bin_dir = path.join(root, 'bin'), + cordovalib_dir = path.join(root, 'CordovaLib'), + cordovalib_ver = fs.readFileSync(path.join(cordovalib_dir, 'VERSION'), 'utf-8').trim(); + project_parent = path.dirname(project_path), + project_template_dir = project_template_dir ? project_template_dir : path.join(bin_dir, 'templates', 'project'), + script_template_dir = path.join(bin_dir, 'templates', 'scripts'); + + //check that project path doesn't exist + if (fs.existsSync(project_path)) { + return Q.reject('Project already exists'); + } + + //check that parent directory does exist so cp -r will not fail + if (!fs.existsSync(project_parent)) { + return Q.reject(project_parent + ' does not exist. Please specify an existing parent folder'); + } + + //create the project directory and copy over files + shell.mkdir('-p', project_path); + shell.cp('-rf', path.join(project_template_dir, 'www'), project_path); + shell.cp('-f', path.join(cordovalib_dir, 'cordova.js'), path.join(project_path, 'www', 'cordova.js')); + if (use_cli) { + shell.cp('-rf', path.join(project_template_dir, '__CLI__.xcodeproj'), project_path); + shell.mv(path.join(project_path, '__CLI__.xcodeproj'), path.join(project_path, project_name+'.xcodeproj')); + } + else { + shell.cp('-rf', path.join(project_template_dir, '__NON-CLI__.xcodeproj'), project_path); + shell.mv(path.join(project_path, '__NON-CLI__.xcodeproj'), path.join(project_path, project_name+'.xcodeproj')); + } + shell.cp('-rf', path.join(project_template_dir, '__PROJECT_NAME__'), project_path); + shell.mv(path.join(project_path, '__PROJECT_NAME__'), path.join(project_path, project_name)); + + var r = path.join(project_path, project_name); + shell.mv(path.join(r, '__PROJECT_NAME__-Info.plist'), path.join(r, project_name+'-Info.plist')); + shell.mv(path.join(r, '__PROJECT_NAME__-Prefix.pch'), path.join(r, project_name+'-Prefix.pch')); + shell.mv(path.join(r, 'gitignore'), path.join(r, '.gitignore')); + + /*replace __PROJECT_NAME__ and --ID-- with ACTIVITY and ID strings, respectively, in: + * + * - ./__PROJECT_NAME__.xcodeproj/project.pbxproj + * - ./__PROJECT_NAME__/Classes/AppDelegate.h + * - ./__PROJECT_NAME__/Classes/AppDelegate.m + * - ./__PROJECT_NAME__/Resources/main.m + * - ./__PROJECT_NAME__/Resources/__PROJECT_NAME__-info.plist + * - ./__PROJECT_NAME__/Resources/__PROJECT_NAME__-Prefix.plist + */ + var project_name_esc = project_name.replace(/&/g, '\\&'); + shell.sed('-i', /__PROJECT_NAME__/g, project_name_esc, path.join(r+'.xcodeproj', 'project.pbxproj')); + shell.sed('-i', /__PROJECT_NAME__/g, project_name_esc, path.join(r, 'Classes', 'AppDelegate.h')); + shell.sed('-i', /__PROJECT_NAME__/g, project_name_esc, path.join(r, 'Classes', 'AppDelegate.m')); + shell.sed('-i', /__PROJECT_NAME__/g, project_name_esc, path.join(r, 'Classes', 'MainViewController.h')); + shell.sed('-i', /__PROJECT_NAME__/g, project_name_esc, path.join(r, 'Classes', 'MainViewController.m')); + shell.sed('-i', /__PROJECT_NAME__/g, project_name_esc, path.join(r, 'main.m')); + shell.sed('-i', /__PROJECT_NAME__/g, project_name_esc, path.join(r, project_name+'-Info.plist')); + shell.sed('-i', /__PROJECT_NAME__/g, project_name_esc, path.join(r, project_name+'-Prefix.pch')); + shell.sed('-i', /--ID--/g, package_name, path.join(r, project_name+'-Info.plist')); + + //CordovaLib stuff + if (use_shared) { + update_cordova_subproject([path.join(r+'.xcodeproj', 'project.pbxproj')]); + } + else { + //copy in the CordovaLib directory + shell.mkdir('-p', path.join(project_path, 'CordovaLib', 'CordovaLib.xcodeproj')); + shell.cp('-f', path.join(r, '.gitignore'), project_path); + shell.cp('-rf', path.join(bin_dir, '..', 'CordovaLib', 'Classes'), path.join(project_path, 'CordovaLib')); + shell.cp('-f', path.join(bin_dir, '..', 'CordovaLib', 'VERSION'), path.join(project_path, 'CordovaLib')); + shell.cp('-f', path.join(bin_dir, '..', 'CordovaLib', 'cordova.js'), path.join(project_path, 'CordovaLib')); + shell.cp('-f', path.join(bin_dir, '..', 'CordovaLib', 'CordovaLib_Prefix.pch'), path.join(project_path, 'CordovaLib')); + shell.cp('-f', path.join(bin_dir, '..', 'CordovaLib', 'CordovaLib.xcodeproj', 'project.pbxproj'), path.join(project_path, 'CordovaLib', 'CordovaLib.xcodeproj')); + update_cordova_subproject([path.join(r+'.xcodeproj', 'project.pbxproj'), path.join(project_path, 'CordovaLib', 'CordovaLib.xcodeproj', 'project.pbxproj')]); + } + + //Finally copy the scripts + shell.cp('-r', path.join(script_template_dir, '*'), project_path); + shell.cp('-r', path.join(bin_dir, 'node_modules'), path.join(project_path, 'cordova')); + + //copy the check_reqs script + shell.cp(path.join(bin_dir, 'check_reqs'), path.join(project_path, 'cordova')); + + //copy the version scripts script + shell.cp(path.join(bin_dir, 'apple_ios_version'), path.join(project_path, 'cordova')); + shell.cp(path.join(bin_dir, 'apple_osx_version'), path.join(project_path, 'cordova')); + shell.cp(path.join(bin_dir, 'apple_xcode_version'), path.join(project_path, 'cordova')); + shell.cp(path.join(bin_dir, 'lib', 'versions.js'), path.join(project_path, 'cordova', 'lib')); + + //Make scripts executable + shell.find(path.join(project_path, 'cordova')).forEach(function(entry) { + shell.chmod(755, entry); + }); + + return Q.resolve(); +} + + +function update_cordova_subproject(argv) { + if (argv.length < 1 || argv.length > 2) + { + updateSubprojectHelp(); + throw new Error('Usage error for update_cordova_subproject'); + } + + var projectPath = AbsProjectPath(argv[0]), + cordovaLibXcodePath; + if (argv.length < 2) { + cordovaLibXcodePath = path.join(root, 'CordovaLib', 'CordovaLib.xcodeproj'); + } + else { + cordovaLibXcodePath = AbsProjectPath(argv[1]); + } + + var parentProjectPath = AbsParentPath(projectPath), + subprojectPath = relpath(cordovaLibXcodePath, parentProjectPath), + REGEX = /(.+PBXFileReference.+wrapper.pb-project.+)(path = .+?;)(.*)(sourceTree.+;)(.+)/, + newLine, + lines = shell.grep('CordovaLib.xcodeproj', path.join(projectPath, 'project.pbxproj')), + found = false; + + subprojectPath = subprojectPath.replace(/\\/g, '/'); + lines = lines.split('\n'); + for (var i = 0; i < lines.length; ++i) { + if (lines[i].match(REGEX)) { + found = true; + newLine = lines[i].replace(/path = .+?;/, 'path = ' + subprojectPath + ';'); + newLine = newLine.replace(/sourceTree.+?;/, 'sourceTree = \"\";'); + if (!newLine.match('name')) { + newLine = newLine.replace('path = ', 'name = CordovaLib.xcodeproj; path = '); + } + shell.sed('-i', lines[i], newLine, path.join(projectPath, 'project.pbxproj')); + } + } + + if (!found) { + throw new Error('Subproject: ' + subprojectPath + ' entry not found in project file'); + } +} + +exports.createHelp = createHelp; +exports.updateSubprojectHelp = updateSubprojectHelp; +exports.update_cordova_subproject = update_cordova_subproject; http://git-wip-us.apache.org/repos/asf/cordova-ios/blob/dd54d96b/bin/lib/update.js ---------------------------------------------------------------------- diff --git a/bin/lib/update.js b/bin/lib/update.js new file mode 100755 index 0000000..e023e58 --- /dev/null +++ b/bin/lib/update.js @@ -0,0 +1,72 @@ +#!/usr/bin/env node + +/* + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file + distributed with this work for additional information + regarding copyright ownership. The ASF licenses this file + to you 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. +*/ +var shell = require('shelljs'), + path = require('path'), + fs = require('fs'), + ROOT = path.join(__dirname, '..', '..'); + +function setShellFatal(value, func) { + var oldVal = shell.config.fatal; + shell.config.fatal = value; + func(); + shell.config.fatal = oldVal; +} + +function copyJsAndCordovaLib(projectPath) { + shell.cp('-f', path.join(ROOT, 'CordovaLib', 'cordova.js'), path.join(projectPath, 'www')); + shell.rm('-rf', path.join(projectPath, 'CordovaLib')); + shell.cp('-r', path.join(ROOT, 'CordovaLib'), projectPath); + // Ensure no workspace files got copied over. + var entries = fs.readdirSync(path.join(projectPath, 'CordovaLib', 'CordovaLib.xcodeproj')); + entries.forEach(function(p) { + if (/.*xc.*/.test(p)) { + shell.rm('-rf', path.join(projectPath, 'CordovaLib', 'CordovaLib.xcodeproj', p)); + } + }); +} + +function copyScripts(projectPath) { + var srcScriptsDir = path.join(ROOT, 'bin', 'templates', 'scripts', 'cordova'); + var destScriptsDir = path.join(projectPath, 'cordova'); + // Delete old scripts directory. + shell.rm('-rf', destScriptsDir); + // Copy in the new ones. + shell.cp('-r', srcScriptsDir, projectPath); + shell.cp('-r', path.join(ROOT, 'bin', 'node_modules'), destScriptsDir); + shell.cp(path.join(ROOT, 'bin', 'check_reqs'), path.join(destScriptsDir, 'check_reqs')); + shell.cp(path.join(ROOT, 'bin', 'apple_ios_version'), destScriptsDir); + shell.cp(path.join(ROOT, 'bin', 'apple_osx_version'), destScriptsDir); + shell.cp(path.join(ROOT, 'bin', 'apple_xcode_version'), destScriptsDir); + shell.cp(path.join(ROOT, 'bin', 'lib', 'versions.js'), path.join(destScriptsDir, 'lib')); + // Make sure they are executable. + shell.find(destScriptsDir).forEach(function(entry) { + shell.chmod(755, entry); + }); +} + +exports.updateProject = function(projectPath) { + var version = fs.readFileSync(path.join(ROOT, 'CordovaLib', 'VERSION'), 'utf-8').trim(); + setShellFatal(true, function() { + copyJsAndCordovaLib(projectPath); + copyScripts(projectPath); + console.log('iOS project is now at version ' + version); + }); +}; http://git-wip-us.apache.org/repos/asf/cordova-ios/blob/dd54d96b/bin/lib/versions.js ---------------------------------------------------------------------- diff --git a/bin/lib/versions.js b/bin/lib/versions.js new file mode 100755 index 0000000..9a8eaec --- /dev/null +++ b/bin/lib/versions.js @@ -0,0 +1,101 @@ +#!/usr/bin/env node + +/* + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file + distributed with this work for additional information + regarding copyright ownership. The ASF licenses this file + to you 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. +*/ + +var child_process = require('child_process'), + Q = require('q'); + +exports.get_apple_ios_version = function() { + var d = Q.defer(); + child_process.exec('xcodebuild -showsdks', function(error, stdout, stderr) { + if (error) { + d.reject(stderr); + } + else { + d.resolve(stdout); + } + }); + + return d.promise.then(function(output) { + var regex = /[0-9]*\.[0-9]*/, + versions = [], + regexIOS = /^iOS \d+/; + output = output.split('\n'); + for (var i = 0; i < output.length; i++) { + if (output[i].trim().match(regexIOS)) { + versions[versions.length] = parseFloat(output[i].match(regex)[0]); + } + } + versions.sort(); + console.log(versions[0]); + return Q(); + }, function(stderr) { + return Q.reject(stderr); + }); +} + +exports.get_apple_osx_version = function() { + var d = Q.defer(); + child_process.exec('xcodebuild -showsdks', function(error, stdout, stderr) { + if (error) { + d.reject(stderr); + } + else { + d.resolve(stdout); + } + }); + + return d.promise.then(function(output) { + var regex = /[0-9]*\.[0-9]*/, + versions = [], + regexOSX = /^OS X \d+/; + output = output.split('\n'); + for (var i = 0; i < output.length; i++) { + if (output[i].trim().match(regexOSX)) { + versions[versions.length] = parseFloat(output[i].match(regex)[0]); + } + } + versions.sort(); + console.log(versions[0]); + return Q(); + }, function(stderr) { + return Q.reject(stderr); + }); +} + +exports.get_apple_xcode_version = function() { + var d = Q.defer(); + child_process.exec('xcodebuild -version', function(error, stdout, stderr) { + if (error) { + d.reject(stderr); + } + else { + d.resolve(stdout); + } + }); + + return d.promise.then(function(output) { + output = output.split('\n'); + console.log(output[0].slice(6)); + return Q(); + }, function(stderr) { + return Q.reject(stderr); + }); +} http://git-wip-us.apache.org/repos/asf/cordova-ios/blob/dd54d96b/bin/node_modules/q/CONTRIBUTING.md ---------------------------------------------------------------------- diff --git a/bin/node_modules/q/CONTRIBUTING.md b/bin/node_modules/q/CONTRIBUTING.md new file mode 100644 index 0000000..500ab17 --- /dev/null +++ b/bin/node_modules/q/CONTRIBUTING.md @@ -0,0 +1,40 @@ + +For pull requests: + +- Be consistent with prevalent style and design decisions. +- Add a Jasmine spec to `specs/q-spec.js`. +- Use `npm test` to avoid regressions. +- Run tests in `q-spec/run.html` in as many supported browsers as you + can find the will to deal with. +- Do not build minified versions; we do this each release. +- If you would be so kind, add a note to `CHANGES.md` in an + appropriate section: + + - `Next Major Version` if it introduces backward incompatibilities + to code in the wild using documented features. + - `Next Minor Version` if it adds a new feature. + - `Next Patch Version` if it fixes a bug. + +For releases: + +- Run `npm test`. +- Run tests in `q-spec/run.html` in a representative sample of every + browser under the sun. +- Run `npm run cover` and make sure you're happy with the results. +- Run `npm run minify` and be sure to commit the resulting `q.min.js`. +- Note the Gzipped size output by the previous command, and update + `README.md` if it has changed to 1 significant digit. +- Stash any local changes. +- Update `CHANGES.md` to reflect all changes in the differences + between `HEAD` and the previous tagged version. Give credit where + credit is due. +- Update `README.md` to address all new, non-experimental features. +- Update the API reference on the Wiki to reflect all non-experimental + features. +- Use `npm version major|minor|patch` to update `package.json`, + commit, and tag the new version. +- Use `npm publish` to send up a new release. +- Send an email to the q-continuum mailing list announcing the new + release and the notes from the change log. This helps folks + maintaining other package ecosystems. + http://git-wip-us.apache.org/repos/asf/cordova-ios/blob/dd54d96b/bin/node_modules/q/LICENSE ---------------------------------------------------------------------- diff --git a/bin/node_modules/q/LICENSE b/bin/node_modules/q/LICENSE new file mode 100644 index 0000000..8a706b5 --- /dev/null +++ b/bin/node_modules/q/LICENSE @@ -0,0 +1,18 @@ +Copyright 2009–2014 Kristopher Michael Kowal. All rights reserved. +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. http://git-wip-us.apache.org/repos/asf/cordova-ios/blob/dd54d96b/bin/node_modules/q/README.md ---------------------------------------------------------------------- diff --git a/bin/node_modules/q/README.md b/bin/node_modules/q/README.md new file mode 100644 index 0000000..bdd4168 --- /dev/null +++ b/bin/node_modules/q/README.md @@ -0,0 +1,820 @@ +[![Build Status](https://secure.travis-ci.org/kriskowal/q.png?branch=master)](http://travis-ci.org/kriskowal/q) + + + Promises/A+ logo + + +*This is Q version 1, from the `v1` branch in Git. This documentation applies to +the latest of both the version 1 and version 0.9 release trains. These releases +are stable. There will be no further releases of 0.9 after 0.9.7 which is nearly +equivalent to version 1.0.0. All further releases of `q@~1.0` will be backward +compatible. The version 2 release train introduces significant but +backward-incompatible changes and is experimental at this time.* + +If a function cannot return a value or throw an exception without +blocking, it can return a promise instead. A promise is an object +that represents the return value or the thrown exception that the +function may eventually provide. A promise can also be used as a +proxy for a [remote object][Q-Connection] to overcome latency. + +[Q-Connection]: https://github.com/kriskowal/q-connection + +On the first pass, promises can mitigate the “[Pyramid of +Doom][POD]”: the situation where code marches to the right faster +than it marches forward. + +[POD]: http://calculist.org/blog/2011/12/14/why-coroutines-wont-work-on-the-web/ + +```javascript +step1(function (value1) { + step2(value1, function(value2) { + step3(value2, function(value3) { + step4(value3, function(value4) { + // Do something with value4 + }); + }); + }); +}); +``` + +With a promise library, you can flatten the pyramid. + +```javascript +Q.fcall(promisedStep1) +.then(promisedStep2) +.then(promisedStep3) +.then(promisedStep4) +.then(function (value4) { + // Do something with value4 +}) +.catch(function (error) { + // Handle any error from all above steps +}) +.done(); +``` + +With this approach, you also get implicit error propagation, just like `try`, +`catch`, and `finally`. An error in `promisedStep1` will flow all the way to +the `catch` function, where it’s caught and handled. (Here `promisedStepN` is +a version of `stepN` that returns a promise.) + +The callback approach is called an “inversion of control”. +A function that accepts a callback instead of a return value +is saying, “Don’t call me, I’ll call you.”. Promises +[un-invert][IOC] the inversion, cleanly separating the input +arguments from control flow arguments. This simplifies the +use and creation of API’s, particularly variadic, +rest and spread arguments. + +[IOC]: http://www.slideshare.net/domenicdenicola/callbacks-promises-and-coroutines-oh-my-the-evolution-of-asynchronicity-in-javascript + + +## Getting Started + +The Q module can be loaded as: + +- A ``