Use makefile from calendar app, adjust npm and update gruntfile
This commit is contained in:
parent
b10d89bb57
commit
0544c1616d
3 changed files with 244 additions and 179 deletions
366
Makefile
366
Makefile
|
@ -1,146 +1,232 @@
|
|||
# Makefile for building the project
|
||||
# This file is licensed under the Affero General Public License version 3 or
|
||||
# later. See the COPYING file.
|
||||
# @author Bernhard Posselt <dev@bernhard-posselt.com>
|
||||
# @copyright Bernhard Posselt 2017
|
||||
# @author Georg Ehrke <oc.list@georgehrke.com>
|
||||
# @copyright Georg Ehrke 2017
|
||||
# @author Raimund Schlüßler
|
||||
# @copyright 2017 Raimund Schlüßler <raimund.schluessler@googlemail.com>
|
||||
|
||||
app_name=tasks
|
||||
project_dir=$(CURDIR)/../$(app_name)
|
||||
build_dir=$(CURDIR)/build
|
||||
appstore_dir=$(build_dir)/appstore
|
||||
signed_dir=$(build_dir)/appstore_signed
|
||||
package_name=$(app_name)
|
||||
# Generic Makefile for building and packaging a Nextcloud app which uses npm and
|
||||
# Composer.
|
||||
#
|
||||
# Dependencies:
|
||||
# * make
|
||||
# * which
|
||||
# * curl: used if phpunit and composer are not installed to fetch them from the web
|
||||
# * tar: for building the archive
|
||||
# * npm: for building and testing everything JS
|
||||
#
|
||||
# If no composer.json is in the app root directory, the Composer step
|
||||
# will be skipped. The same goes for the package.json which can be located in
|
||||
# the app root or the js/ directory.
|
||||
#
|
||||
# The npm command by launches the npm build script:
|
||||
#
|
||||
# npm run build
|
||||
#
|
||||
# The npm test command launches the npm test script:
|
||||
#
|
||||
# npm run test
|
||||
#
|
||||
# The idea behind this is to be completely testing and build tool agnostic. All
|
||||
# build tools and additional package managers should be installed locally in
|
||||
# your project, since this won't pollute people's global namespace.
|
||||
#
|
||||
# The following npm scripts in your package.json install and update the bower
|
||||
# and npm dependencies and use gulp as build system (notice how everything is
|
||||
# run from the node_modules folder):
|
||||
#
|
||||
# "scripts": {
|
||||
# "test": "node node_modules/gulp-cli/bin/gulp.js karma",
|
||||
# "prebuild": "npm install && node_modules/bower/bin/bower install && node_modules/bower/bin/bower update",
|
||||
# "build": "node node_modules/gulp-cli/bin/gulp.js"
|
||||
# },
|
||||
|
||||
app_name=$(notdir $(CURDIR))
|
||||
build_tools_directory=$(CURDIR)/build/tools
|
||||
source_build_directory=$(CURDIR)/build/source/tasks
|
||||
source_artifact_directory=$(CURDIR)/build/artifacts/source
|
||||
source_package_name=$(source_artifact_directory)/$(app_name)
|
||||
appstore_build_directory=$(CURDIR)/build/appstore/tasks
|
||||
appstore_artifact_directory=$(CURDIR)/build/artifacts/appstore
|
||||
appstore_package_name=$(appstore_artifact_directory)/$(app_name)
|
||||
npm=$(shell which npm 2> /dev/null)
|
||||
gcp=$(shell which gcp 2> /dev/null)
|
||||
|
||||
ifeq (, $(gcp))
|
||||
copy_command=cp
|
||||
else
|
||||
copy_command=gcp
|
||||
endif
|
||||
|
||||
# code signing
|
||||
# assumes the following:
|
||||
# * the app is inside the nextcloud/apps folder
|
||||
# * the private key is located in ~/.nextcloud/tasks.key
|
||||
# * the certificate is located in ~/.nextcloud/tasks.crt
|
||||
occ=$(CURDIR)/../../occ
|
||||
configdir=$(CURDIR)/../../config
|
||||
private_key=$(HOME)/.nextcloud/$(app_name).key
|
||||
certificate=$(HOME)/.nextcloud/$(app_name).crt
|
||||
sign=php -f $(occ) integrity:sign-app --privateKey="$(private_key)" --certificate="$(certificate)"
|
||||
sign_skip_msg="Skipping signing, either no key and certificate found in $(private_key) and $(certificate) or occ can not be found at $(occ)"
|
||||
ifneq (,$(wildcard $(private_key)))
|
||||
ifneq (,$(wildcard $(certificate)))
|
||||
ifneq (,$(wildcard $(occ)))
|
||||
CAN_SIGN=true
|
||||
endif
|
||||
endif
|
||||
endif
|
||||
|
||||
all: build
|
||||
|
||||
# Fetches the PHP and JS dependencies and compiles the JS. If no composer.json
|
||||
# is present, the composer step is skipped, if no package.json or js/package.json
|
||||
# is present, the npm step is skipped
|
||||
.PHONY: build
|
||||
build:
|
||||
make npm
|
||||
|
||||
# Installs npm dependencies
|
||||
.PHONY: npm
|
||||
npm:
|
||||
cd js && $(npm) run build
|
||||
|
||||
# Removes the appstore build
|
||||
.PHONY: clean
|
||||
clean:
|
||||
rm -rf $(appstore_dir)
|
||||
rm -rf $(signed_dir)
|
||||
rm -rf ./build
|
||||
|
||||
sign:
|
||||
rm -rf $(signed_dir)
|
||||
mkdir -p $(signed_dir)
|
||||
rsync -av \
|
||||
$(project_dir) $(signed_dir) \
|
||||
--exclude=$(app_name)/tests \
|
||||
--exclude=$(app_name)/.git \
|
||||
--exclude=$(app_name)/.idea \
|
||||
--exclude=$(app_name)/.editorconfig \
|
||||
--exclude=$(app_name)/.gitattributes \
|
||||
--exclude=$(app_name)/.gitignore \
|
||||
--exclude=$(app_name)/.scrutinizer.yml \
|
||||
--exclude=$(app_name)/.travis.yml \
|
||||
--exclude=$(app_name)/build.xml \
|
||||
--exclude=$(app_name)/CONTRIBUTING.md \
|
||||
--exclude=$(app_name)/tasks.sublime-project \
|
||||
--exclude=$(app_name)/tasks.sublime-workspace \
|
||||
--exclude=$(app_name)/issue_template.md \
|
||||
--exclude=$(app_name)/Makefile \
|
||||
--exclude=$(app_name)/phpunit.xml \
|
||||
--exclude=$(app_name)/README.md \
|
||||
--exclude=$(app_name)/build \
|
||||
--exclude=$(app_name)/img/source \
|
||||
--exclude=$(app_name)/js/.bowerrc \
|
||||
--exclude=$(app_name)/js/README.md \
|
||||
--exclude=$(app_name)/js/.jshintrc \
|
||||
--exclude=$(app_name)/js/bower.json \
|
||||
--exclude=$(app_name)/js/Gruntfile.js \
|
||||
--exclude=$(app_name)/js/package.json \
|
||||
--exclude=$(app_name)/js/README.mkdir \
|
||||
--exclude=$(app_name)/js/app \
|
||||
--exclude=$(app_name)/js/config \
|
||||
--exclude=$(app_name)/js/node_modules \
|
||||
--exclude=$(app_name)/js/vendor/**/.bower.json \
|
||||
--exclude=$(app_name)/js/vendor/**/.npmignore \
|
||||
--exclude=$(app_name)/js/vendor/**/bower.json \
|
||||
--exclude=$(app_name)/js/vendor/**/Gruntfile.js \
|
||||
--exclude=$(app_name)/js/vendor/**/package.json \
|
||||
--exclude=$(app_name)/js/vendor/**/*.md \
|
||||
--exclude=$(app_name)/js/vendor/**/karma.conf.js \
|
||||
--exclude=$(app_name)/js/vendor/**/*.map \
|
||||
--exclude=$(app_name)/js/vendor/angular-mocks \
|
||||
--exclude=$(app_name)/js/vendor/angular/angular.js \
|
||||
--exclude=$(app_name)/js/vendor/angular-animate/angular-animate.js \
|
||||
--exclude=$(app_name)/js/vendor/angular-draganddrop/angular-drag-and-drop-lists.js \
|
||||
--exclude=$(app_name)/js/vendor/angular-route/angular-route.js \
|
||||
--exclude=$(app_name)/js/vendor/angular-sanitize/angular-sanitize.js \
|
||||
--exclude=$(app_name)/js/vendor/angular-ui-select/dist/select.js \
|
||||
--exclude=$(app_name)/js/vendor/angular-ui-select/dist/select.css \
|
||||
--exclude=$(app_name)/js/vendor/angular-ui-select/docs \
|
||||
--exclude=$(app_name)/js/vendor/angular-ui-select/composer.json \
|
||||
--exclude=$(app_name)/js/vendor/angular-ui-select/deploy-docs.sh \
|
||||
--exclude=$(app_name)/js/vendor/jstzdetect/jstz.js \
|
||||
--exclude=$(app_name)/js/vendor/davclient.js/index.html \
|
||||
--exclude=$(app_name)/js/vendor/ical.js/build/benchmark \
|
||||
--exclude=$(app_name)/js/vendor/ical.js/lib \
|
||||
--exclude=$(app_name)/js/vendor/ical.js/samples \
|
||||
--exclude=$(app_name)/js/vendor/ical.js/sandbox \
|
||||
--exclude=$(app_name)/js/vendor/ical.js/tasks \
|
||||
--exclude=$(app_name)/js/vendor/ical.js/test-agent \
|
||||
--exclude=$(app_name)/js/vendor/ical.js/test-agent-server.js \
|
||||
--exclude=$(app_name)/js/vendor/ical.js/test-agent-coverage.json \
|
||||
--exclude=$(app_name)/js/vendor/jquery-timepicker/i18n \
|
||||
--exclude=$(app_name)/js/vendor/jquery-timepicker/include \
|
||||
--exclude=$(app_name)/js/vendor/jquery-timepicker/legacy_1.2.6 \
|
||||
--exclude=$(app_name)/js/vendor/jquery-timepicker/tests \
|
||||
--exclude=$(app_name)/js/vendor/jquery-timepicker/index.html \
|
||||
--exclude=$(app_name)/screenshots \
|
||||
--exclude=$(app_name)/timezones/INFO.md
|
||||
chown -R www-data $(signed_dir)
|
||||
sudo -u www-data php ../../occ integrity:sign-app --privateKey=$(build_dir)/app-signing/tasks.key --certificate=$(build_dir)/app-signing/tasks.crt --path=$(signed_dir)/$(app_name)
|
||||
cd $(signed_dir); \
|
||||
zip -r $(signed_dir)/$(app_name).zip $(app_name)
|
||||
cd $(signed_dir); \
|
||||
tar cvzf $(signed_dir)/$(app_name).tar.gz $(app_name)
|
||||
rm -rf $(signed_dir)/$(app_name)
|
||||
openssl dgst -sha512 -sign $(build_dir)/app-signing/tasks.key $(signed_dir)/$(app_name).tar.gz | openssl base64 -out $(signed_dir)/$(app_name).sha512
|
||||
# Same as clean but also removes dependencies installed by composer, bower and
|
||||
# npm
|
||||
.PHONY: distclean
|
||||
distclean: clean
|
||||
rm -rf vendor
|
||||
rm -rf node_modules
|
||||
rm -rf js/vendor
|
||||
rm -rf js/node_modules
|
||||
|
||||
# Builds the source and appstore package
|
||||
.PHONY: dist
|
||||
dist:
|
||||
make source
|
||||
make appstore
|
||||
|
||||
# Builds the source package
|
||||
.PHONY: source
|
||||
source:
|
||||
rm -rf $(source_build_directory) $(source_artifact_directory)
|
||||
mkdir -p $(source_build_directory) $(source_artifact_directory)
|
||||
rsync -rv . $(source_build_directory) \
|
||||
--exclude=/.git/ \
|
||||
--exclude=/.idea/ \
|
||||
--exclude=/build/ \
|
||||
--exclude=/js/node_modules/ \
|
||||
--exclude=*.log
|
||||
ifdef CAN_SIGN
|
||||
$(sign) --path "$(source_build_directory)"
|
||||
else
|
||||
@echo $(sign_skip_msg)
|
||||
endif
|
||||
tar -cvzf $(source_package_name).tar.gz -C $(source_build_directory)/../ $(app_name)
|
||||
|
||||
# Builds the source package for the app store, ignores php and js tests
|
||||
.PHONY: appstore
|
||||
appstore:
|
||||
rm -rf $(appstore_build_directory) $(appstore_artifact_directory)
|
||||
mkdir -p $(appstore_build_directory) $(appstore_artifact_directory)
|
||||
rsync -av . $(appstore_build_directory) \
|
||||
--exclude=/tests \
|
||||
--exclude=/.git \
|
||||
--exclude=/.idea \
|
||||
--exclude=/.editorconfig \
|
||||
--exclude=/.gitattributes \
|
||||
--exclude=/.gitignore \
|
||||
--exclude=/.scrutinizer.yml \
|
||||
--exclude=/.travis.yml \
|
||||
--exclude=/build.xml \
|
||||
--exclude=/CONTRIBUTING.md \
|
||||
--exclude=/tasks.sublime-project \
|
||||
--exclude=/tasks.sublime-workspace \
|
||||
--exclude=/issue_template.md \
|
||||
--exclude=/Makefile \
|
||||
--exclude=/phpunit.xml \
|
||||
--exclude=/README.md \
|
||||
--exclude=/build \
|
||||
--exclude=/img/source \
|
||||
--exclude=/js/.bowerrc \
|
||||
--exclude=/js/README.md \
|
||||
--exclude=/js/.jshintrc \
|
||||
--exclude=/js/bower.json \
|
||||
--exclude=/js/Gruntfile.js \
|
||||
--exclude=/js/package.json \
|
||||
--exclude=/js/README.mkdir \
|
||||
--exclude=/js/app \
|
||||
--exclude=/js/config \
|
||||
--exclude=/js/node_modules \
|
||||
--exclude=/js/vendor/**/.bower.json \
|
||||
--exclude=/js/vendor/**/.npmignore \
|
||||
--exclude=/js/vendor/**/bower.json \
|
||||
--exclude=/js/vendor/**/Gruntfile.js \
|
||||
--exclude=/js/vendor/**/package.json \
|
||||
--exclude=/js/vendor/**/*.md \
|
||||
--exclude=/js/vendor/**/karma.conf.js \
|
||||
--exclude=/js/vendor/**/*.map \
|
||||
--exclude=/js/vendor/angular-mocks \
|
||||
--exclude=/js/vendor/angular/angular.js \
|
||||
--exclude=/js/vendor/angular-animate/angular-animate.js \
|
||||
--exclude=/js/vendor/angular-draganddrop/angular-drag-and-drop-lists.js \
|
||||
--exclude=/js/vendor/angular-route/angular-route.js \
|
||||
--exclude=/js/vendor/angular-sanitize/angular-sanitize.js \
|
||||
--exclude=/js/vendor/angular-ui-select/dist/select.js \
|
||||
--exclude=/js/vendor/angular-ui-select/dist/select.css \
|
||||
--exclude=/js/vendor/angular-ui-select/docs \
|
||||
--exclude=/js/vendor/angular-ui-select/composer.json \
|
||||
--exclude=/js/vendor/angular-ui-select/deploy-docs.sh \
|
||||
--exclude=/js/vendor/jstzdetect/jstz.js \
|
||||
--exclude=/js/vendor/davclient.js/index.html \
|
||||
--exclude=/js/vendor/ical.js/build/benchmark \
|
||||
--exclude=/js/vendor/ical.js/lib \
|
||||
--exclude=/js/vendor/ical.js/samples \
|
||||
--exclude=/js/vendor/ical.js/sandbox \
|
||||
--exclude=/js/vendor/ical.js/tasks \
|
||||
--exclude=/js/vendor/ical.js/test-agent \
|
||||
--exclude=/js/vendor/ical.js/test-agent-server.js \
|
||||
--exclude=/js/vendor/ical.js/test-agent-coverage.json \
|
||||
--exclude=/js/vendor/jquery-timepicker/i18n \
|
||||
--exclude=/js/vendor/jquery-timepicker/include \
|
||||
--exclude=/js/vendor/jquery-timepicker/legacy_1.2.6 \
|
||||
--exclude=/js/vendor/jquery-timepicker/tests \
|
||||
--exclude=/js/vendor/jquery-timepicker/index.html \
|
||||
--exclude=/screenshots \
|
||||
--exclude=/timezones/INFO.md
|
||||
ifdef CAN_SIGN
|
||||
mv $(configdir)/config.php $(configdir)/config-2.php
|
||||
$(sign) --path="$(appstore_build_directory)"
|
||||
mv $(configdir)/config-2.php $(configdir)/config.php
|
||||
else
|
||||
@echo $(sign_skip_msg)
|
||||
endif
|
||||
cd $(appstore_build_directory)/../; \
|
||||
zip -r $(appstore_package_name).zip $(app_name)
|
||||
tar -czf $(appstore_package_name).tar.gz -C $(appstore_build_directory)/../ $(app_name)
|
||||
openssl dgst -sha512 -sign $(private_key) $(appstore_package_name).tar.gz | openssl base64 -out $(appstore_artifact_directory)/$(app_name).sha512
|
||||
|
||||
|
||||
appstore: clean
|
||||
mkdir -p $(appstore_dir)
|
||||
tar cvzf $(appstore_dir)/$(package_name).tar.gz $(project_dir) \
|
||||
--exclude-vcs \
|
||||
--exclude=$(project_dir)/tests \
|
||||
--exclude=$(project_dir)/.idea \
|
||||
--exclude=$(project_dir)/.editorconfig \
|
||||
--exclude=$(project_dir)/.gitattributes \
|
||||
--exclude=$(project_dir)/.gitignore \
|
||||
--exclude=$(project_dir)/.scrutinizer.yml \
|
||||
--exclude=$(project_dir)/.travis.yml \
|
||||
--exclude=$(project_dir)/build.xml \
|
||||
--exclude=$(project_dir)/CONTRIBUTING.md \
|
||||
--exclude=$(project_dir)/tasks.sublime-project \
|
||||
--exclude=$(project_dir)/tasks.sublime-workspace \
|
||||
--exclude=$(project_dir)/issue_template.md \
|
||||
--exclude=$(project_dir)/Makefile \
|
||||
--exclude=$(project_dir)/phpunit.xml \
|
||||
--exclude=$(project_dir)/README.md \
|
||||
--exclude=$(project_dir)/build \
|
||||
--exclude=$(project_dir)/img/source \
|
||||
--exclude=$(project_dir)/js/.bowerrc \
|
||||
--exclude=$(project_dir)/js/README.md \
|
||||
--exclude=$(project_dir)/js/.jshintrc \
|
||||
--exclude=$(project_dir)/js/bower.json \
|
||||
--exclude=$(project_dir)/js/Gruntfile.js \
|
||||
--exclude=$(project_dir)/js/package.json \
|
||||
--exclude=$(project_dir)/js/README.mkdir \
|
||||
--exclude=$(project_dir)/js/app \
|
||||
--exclude=$(project_dir)/js/config \
|
||||
--exclude=$(project_dir)/js/node_modules \
|
||||
--exclude=$(project_dir)/js/vendor/**/.bower.json \
|
||||
--exclude=$(project_dir)/js/vendor/**/.npmignore \
|
||||
--exclude=$(project_dir)/js/vendor/**/bower.json \
|
||||
--exclude=$(project_dir)/js/vendor/**/Gruntfile.js \
|
||||
--exclude=$(project_dir)/js/vendor/**/package.json \
|
||||
--exclude=$(project_dir)/js/vendor/**/*.md \
|
||||
--exclude=$(project_dir)/js/vendor/**/karma.conf.js \
|
||||
--exclude=$(project_dir)/js/vendor/angular-mocks \
|
||||
--exclude=$(project_dir)/js/vendor/davclient.js/index.html \
|
||||
--exclude=$(project_dir)/js/vendor/ical.js/build/benchmark \
|
||||
--exclude=$(project_dir)/js/vendor/ical.js/lib \
|
||||
--exclude=$(project_dir)/js/vendor/ical.js/samples \
|
||||
--exclude=$(project_dir)/js/vendor/ical.js/sandbox \
|
||||
--exclude=$(project_dir)/js/vendor/ical.js/tasks \
|
||||
--exclude=$(project_dir)/js/vendor/ical.js/test-agent \
|
||||
--exclude=$(project_dir)/js/vendor/ical.js/test-agent-server.js \
|
||||
--exclude=$(project_dir)/js/vendor/ical.js/test-agent-coverage.json \
|
||||
--exclude=$(project_dir)/js/vendor/jquery-timepicker/i18n \
|
||||
--exclude=$(project_dir)/js/vendor/jquery-timepicker/include \
|
||||
--exclude=$(project_dir)/js/vendor/jquery-timepicker/legacy_1.2.6 \
|
||||
--exclude=$(project_dir)/js/vendor/jquery-timepicker/tests \
|
||||
--exclude=$(project_dir)/js/vendor/jquery-timepicker/index.html \
|
||||
--exclude=$(project_dir)/timezones/INFO.md \
|
||||
# Command for running JS and PHP tests. Works for package.json files in the js/
|
||||
# and root directory. If phpunit is not installed systemwide, a copy is fetched
|
||||
# from the internet
|
||||
.PHONY: test
|
||||
test:
|
||||
cd js && $(npm) run test
|
||||
ifeq (, $(shell which phpunit 2> /dev/null))
|
||||
@echo "No phpunit command available, downloading a copy from the web"
|
||||
mkdir -p $(build_tools_directory)
|
||||
curl -sSL https://phar.phpunit.de/phpunit.phar -o $(build_tools_directory)/phpunit.phar
|
||||
php $(build_tools_directory)/phpunit.phar -c phpunit.xml --coverage-clover build/php-unit.clover
|
||||
php $(build_tools_directory)/phpunit.phar -c phpunit.integration.xml --coverage-clover build/php-integration.clover
|
||||
else
|
||||
phpunit -c phpunit.xml --coverage-clover build/php-unit.clover
|
||||
phpunit -c phpunit.integration.xml --coverage-clover build/php-unit.clover
|
||||
endif
|
||||
|
|
|
@ -26,10 +26,7 @@ module.exports = function(grunt) {
|
|||
grunt.loadNpmTasks('grunt-contrib-watch');
|
||||
grunt.loadNpmTasks('grunt-contrib-jshint');
|
||||
grunt.loadNpmTasks('grunt-wrap');
|
||||
grunt.loadNpmTasks('grunt-phpunit');
|
||||
grunt.loadNpmTasks('grunt-karma');
|
||||
// grunt.loadNpmTasks('grunt-newer');
|
||||
grunt.loadNpmTasks('grunt-phpdocumentor');
|
||||
|
||||
grunt.initConfig({
|
||||
meta: {
|
||||
|
@ -89,35 +86,15 @@ module.exports = function(grunt) {
|
|||
continuous: {
|
||||
configFile: 'config/karma.js',
|
||||
singleRun: true,
|
||||
browsers: ['PhantomJS'],
|
||||
reporters: ['progress', 'junit'],
|
||||
junitReporter: {
|
||||
outputFile: 'test-results.xml'
|
||||
}
|
||||
},
|
||||
unit_phantom: {
|
||||
configFile: 'config/karma.js',
|
||||
browsers: ['PhantomJS']
|
||||
}
|
||||
},
|
||||
phpunit: {
|
||||
classes: {
|
||||
dir: '../tests'
|
||||
},
|
||||
options: {
|
||||
colors: true
|
||||
}
|
||||
},
|
||||
phpdocumentor: {
|
||||
"default": {
|
||||
options: {
|
||||
directory: '../appinfo,../db,../controllers,../service',
|
||||
target: '../docs'
|
||||
}
|
||||
}
|
||||
}
|
||||
});
|
||||
grunt.registerTask('ci', ['karma:continuous']);
|
||||
grunt.registerTask('js', ['concat', 'wrap']);
|
||||
grunt.registerTask('default', 'js');
|
||||
grunt.registerTask('build', ['concat', 'wrap']);
|
||||
};
|
||||
|
|
|
@ -8,6 +8,11 @@
|
|||
},
|
||||
"private": true,
|
||||
"homepage": "",
|
||||
"scripts": {
|
||||
"test": "node node_modules/grunt-cli/bin/grunt karma",
|
||||
"prebuild": "npm install && npm update && node_modules/bower/bin/bower install && node_modules/bower/bin/bower update",
|
||||
"build": "node node_modules/grunt-cli/bin/grunt build"
|
||||
},
|
||||
"repository": {
|
||||
"type": "git",
|
||||
"url": "git@github.com:nextcloud/tasks.git"
|
||||
|
@ -17,20 +22,17 @@
|
|||
"dependencies": {},
|
||||
"devDependencies": {
|
||||
"bower": "*",
|
||||
"grunt": "~0.4.1",
|
||||
"grunt-cli": "~0.1.6",
|
||||
"grunt-contrib-jshint": "*",
|
||||
"jshint-stylish": "^2.1.0",
|
||||
"grunt-concurrent": "~1.0.0",
|
||||
"grunt-contrib-concat": "~0.1.2",
|
||||
"grunt-contrib-less": "~0.6.4",
|
||||
"grunt-contrib-watch": "~0.2.0",
|
||||
"grunt-karma": "~0.4.5",
|
||||
"grunt-newer": "~1.1.1",
|
||||
"grunt-phpdocumentor": "^0.4.1",
|
||||
"grunt-phpunit": "0.2.0",
|
||||
"grunt-wrap": "~0.2.0",
|
||||
"phantomjs": "~1.8.1-3"
|
||||
"grunt": "^1.0.1",
|
||||
"grunt-cli": "^1.2.0",
|
||||
"grunt-contrib-jshint": "^1.0.0",
|
||||
"jshint-stylish": "^2.2.1",
|
||||
"grunt-concurrent": "^2.3.1",
|
||||
"grunt-contrib-concat": "^1.0.1",
|
||||
"grunt-contrib-watch": "^1.0.0",
|
||||
"grunt-karma": "^2.0.0",
|
||||
"grunt-wrap": "^0.3.0"
|
||||
},
|
||||
"engine": "node >= 0.8"
|
||||
"engines": {
|
||||
"node": ">=6"
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue