From 8405935ba6b7456cd84afe6246b7a204a315119a Mon Sep 17 00:00:00 2001 From: Ghislain Loaec Date: Thu, 20 Aug 2015 21:20:17 +0200 Subject: [PATCH] Grunt + Assets --- Gruntfile.js | 452 +++++++++++++++++++++++++++++++++++++ assets/scripts/momo.coffee | 38 ++++ package.json | 42 ++++ 3 files changed, 532 insertions(+) create mode 100644 Gruntfile.js create mode 100644 assets/scripts/momo.coffee create mode 100644 package.json diff --git a/Gruntfile.js b/Gruntfile.js new file mode 100644 index 0000000..4cd677b --- /dev/null +++ b/Gruntfile.js @@ -0,0 +1,452 @@ +/** + * Gruntfile + * + * If you created your Sails app with `sails new foo --linker`, + * the following files will be automatically injected (in order) + * into the EJS and HTML files in your `views` and `assets` folders. + * + * At the top part of this file, you'll find a few of the most commonly + * configured options, but Sails' integration with Grunt is also fully + * customizable. If you'd like to work with your assets differently + * you can change this file to do anything you like! + * + * More information on using Grunt to work with static assets: + * http://gruntjs.com/configuring-tasks + */ + +module.exports = function (grunt) { + + var cssFilesToInject = [ + + // Vendors + 'styles/vendor/**/*.css', + + // All of the rest of your app styles imported here + 'styles/**/*.css' + ]; + + var jsFilesToInject = [ + + // Below, as a demonstration, you'll see the built-in dependencies + // linked in the proper order order + + // Bring in the socket.io client + //'scripts/vendor/socket.io.js', + + // A simpler boilerplate library for getting you up and running w/ an + // automatic listener for incoming messages from Socket.io. + //'scripts/vendor/app.js', + + // Vendors + 'scripts/vendor/**/*.js', + + // Marionnette Application + 'scripts/config/**/*.js', + 'scripts/app.js', + 'scripts/controllers/**/*.js', + 'scripts/entities/**/*.js', + 'scripts/views/**/*.js', + 'scripts/components/**/*.js', + 'scripts/apps/**/*.js', + + // All of the rest of your app scripts imported here + 'scripts/**/*.js' + ]; + + var templateFilesToInject = [ + 'templates/**/*.html', + ]; + + var ecoFilesToInject = [ + 'templates/**/*.eco', + 'scripts/**/*.eco', + 'scripts/apps/**/**/templates/*.eco' + ]; + + // Modify css file injection paths to use + cssFilesToInject = cssFilesToInject.map(function (path) { + return 'www/' + path; + }); + + // Modify js file injection paths to use + jsFilesToInject = jsFilesToInject.map(function (path) { + return 'www/' + path; + }); + + templateFilesToInject = templateFilesToInject.map(function (path) { + return 'assets/' + path; + }); + + ecoFilesToInject = ecoFilesToInject.map(function (path) { + return 'assets/' + path; + }); + + // Get path to core grunt dependencies + grunt.loadNpmTasks('grunt-concurrent'); + grunt.loadNpmTasks('grunt-run'); + grunt.loadNpmTasks('grunt-contrib-clean'); + grunt.loadNpmTasks('grunt-contrib-copy'); + grunt.loadNpmTasks('grunt-contrib-concat'); + grunt.loadNpmTasks('grunt-contrib-connect'); + grunt.loadNpmTasks('grunt-sails-linker'); + grunt.loadNpmTasks('grunt-contrib-jst'); + grunt.loadNpmTasks('grunt-contrib-watch'); + grunt.loadNpmTasks('grunt-contrib-uglify'); + grunt.loadNpmTasks('grunt-contrib-cssmin'); + grunt.loadNpmTasks('grunt-contrib-less'); + grunt.loadNpmTasks('grunt-contrib-coffee'); + grunt.loadNpmTasks('grunt-contrib-sass'); + grunt.loadNpmTasks('grunt-eco'); + grunt.loadNpmTasks('grunt-groc'); + + // Project configuration. + grunt.initConfig({ + pkg: grunt.file.readJSON('package.json'), + + copy: { + reload: { + files: [ + { + expand: true, + cwd: './assets', + src: ['templates/core/reload.html'], + dest: 'www', + rename: function(dest, src) { + return dest + '/index.html' + } + } + ] + }, + dev: { + files: [ + { + expand: true, + cwd: './assets', + src: ['**/*.!(coffee|scss|sass|eco|haml)'], + dest: 'www' + } + ] + }, + build: { + files: [ + { + expand: true, + cwd: 'www', + src: ['**/*'], + dest: 'www' + } + ] + } + }, + + clean: { + dev: [ + 'www/scripts', + 'www/styles', + 'www/images', + 'www/fonts', + 'www/templates', + 'www/index.html', + 'www/templates.js' + ], + build: ['www'] + }, + + jst: { + dev: { + + // To use other sorts of templates, specify the regexp below: + // options: { + // templateSettings: { + // interpolate: /\{\{(.+?)\}\}/g + // } + // }, + + files: { + // 'www/jst.js': templateFilesToInject + } + } + }, + + eco: { + dev: { + files: { + 'www/templates.js': ecoFilesToInject + } + } + }, + + less: { + dev: { + files: [ + { + expand: true, + cwd: 'assets/styles/', + src: ['*.less'], + dest: 'www/styles/', + ext: '.css' + } + ] + } + }, + + sass: { + dev: { + files: [ + { + expand: true, + cwd: 'assets/styles/', + src: ['*.scss', '*.sass'], + dest: 'www/styles/', + ext: '.css' + } + ] + } + }, + + groc: { + markdown: [ + "README.md" + ], + coffeescript: [ + "assets/scripts/*.coffee", + "assets/scripts/**/*.coffee" + ], + javascript: [ + ], + stylesheet: [ + "assets/styles/*.scss", + "assets/styles/**/*.scss" + ], + options: { + "out": "assets/doc/", + "strip": "assets/", + "index": "README.md", + 'index-page-title': "BambooJS Documentation" + } + }, + + coffee: { + dev: { + options:{ + bare:true + }, + files: [ + { + expand: true, + cwd: 'assets/scripts/', + src: ['**/*.coffee'], + dest: 'www/scripts/', + ext: '.js' + } + ] + } + }, + + concat: { + js: { + src: jsFilesToInject, + dest: 'www/concat/production.js' + }, + css: { + src: cssFilesToInject, + dest: 'www/concat/production.css' + } + }, + + uglify: { + dist: { + src: ['www/concat/production.js'], + dest: 'www/min/production.js' + } + }, + + cssmin: { + dist: { + src: ['www/concat/production.css'], + dest: 'www/min/production.css' + } + }, + + 'sails-linker': { + + devJs: { + options: { + startTag: '', + endTag: '', + fileTmpl: '', + appRoot: 'www/' + }, + files: { + 'www/**/*.html': jsFilesToInject + } + }, + + prodJs: { + options: { + startTag: '', + endTag: '', + fileTmpl: '', + appRoot: 'www/' + }, + files: { + 'www/**/*.html': ['www/min/production.js'] + } + }, + + devStyles: { + options: { + startTag: '', + endTag: '', + fileTmpl: '', + appRoot: 'www/' + }, + + // cssFilesToInject defined up top + files: { + 'www/**/*.html': cssFilesToInject + } + }, + + prodStyles: { + options: { + startTag: '', + endTag: '', + fileTmpl: '', + appRoot: 'www/' + }, + files: { + 'www/index.html': ['www/min/production.css'] + } + }, + + // Bring in JST template object + devTpl: { + options: { + startTag: '', + endTag: '', + fileTmpl: '', + appRoot: 'www/' + }, + files: { + 'www/index.html': ['www/templates.js'] + } + }, + }, + + watch: { + assets: { + + // Assets to watch: + files: ['assets/**/*'], + + // When assets are changed: + tasks: ['compileAssets', 'linkAssets'] + } + }, + + connect: { + options: { + port: process.env.PORT || 3131, + base: 'dist/', + }, + + all: {}, + }, + + concurrent: { + options: { + logConcurrentOutput: true + }, + dev: { + tasks: ["run:phonegap", "watch"] + } + }, + + run: { + options: { + wait: true//false + }, + phonegap: { + cmd: 'phonegap', + args: ['serve', '--no-autoreload', '-p', 3001] + } + } + + }); + + //require('matchdep').filterDev('grunt-*').forEach(grunt.loadNpmTasks); + + grunt.registerTask('server', [ + 'compileAssets', + 'linkAssets', + 'concurrent:dev', + ]); + + // When Sails is lifted: + grunt.registerTask('default', ['server']); + + grunt.registerTask('compileAssets', [ + 'clean:dev', + 'copy:reload', + 'jst:dev', + 'eco:dev', + 'less:dev', + 'sass:dev', + 'coffee:dev', + 'copy:dev' + ]); + + grunt.registerTask('linkAssets', [ + + // Update link/script/template references in `assets` index.html + 'sails-linker:devJs', + 'sails-linker:devStyles', + 'sails-linker:devTpl' + ]); + + + // Build the assets into a web accessible folder. + // (handy for phone gap apps, chrome extensions, etc.) + grunt.registerTask('build', [ + 'compileAssets', + 'linkAssets', + 'clean:build', + 'copy:build' + ]); + + // When sails is lifted in production + grunt.registerTask('prod', [ + 'clean:dev', + 'eco:dev', + 'jst:dev', + 'less:dev', + 'sass:dev', + 'copy:dev', + 'coffee:dev', + 'concat', + 'uglify', + 'cssmin', + 'sails-linker:prodJs', + 'sails-linker:prodStyles', + 'sails-linker:devTpl' + ]); + + grunt.registerTask('doc', ['groc']); + + // When API files are changed: + // grunt.event.on('watch', function(action, filepath) { + // grunt.log.writeln(filepath + ' has ' + action); + + // // Send a request to a development-only endpoint on the server + // // which will reuptake the file that was changed. + // var baseurl = grunt.option('baseurl'); + // var gruntSignalRoute = grunt.option('signalpath'); + // var url = baseurl + gruntSignalRoute + '?action=' + action + '&filepath=' + filepath; + + // require('http').get(url) + // .on('error', function(e) { + // console.error(filepath + ' has ' + action + ', but could not signal the Sails.js server: ' + e.message); + // }); + // }); +}; diff --git a/assets/scripts/momo.coffee b/assets/scripts/momo.coffee new file mode 100644 index 0000000..a4090de --- /dev/null +++ b/assets/scripts/momo.coffee @@ -0,0 +1,38 @@ +class Momo + + manifest: + meta: + manifestUrl: "index.json" + + contructor: (args...) -> + @bindEvents() + + bindEvents: -> + # Navigation Handler + window.addEventListener "hashchange", @onHashChange, false + document.addEventListener "deviceready", @onDeviceReady, false + + init: -> + @initFileSystem() + @initIndex() + @backupAssets() + @loadLocalManifest() + @checkForUpdate(app.start, app.start) + @updateTimeout = setTimeout( app.checkForLastUpdateCheck, app.manifest.meta.updateFreq ) + + initFileSystem: -> + + + FastClick.attach(document.body) + + start: -> + @loadManifest() + + loadManifest: -> + manifest = JSON.parse + + update: -> + + updateAvailable: (y, n, f) -> + + diff --git a/package.json b/package.json new file mode 100644 index 0000000..90a4a5e --- /dev/null +++ b/package.json @@ -0,0 +1,42 @@ +{ + "name": "momo", + "private": true, + "version": "1.0.3", + "description": "Simple cross-platform application implementing self-update mechanisms", + "dependencies": { + "ejs": "0.8.4", + "optimist": "0.3.4" + }, + "scripts": { + "debug": "node debug app.js", + "grunt": "node_modules/.bin/grunt", + "start": "node_modules/.bin/grunt" + }, + "main": "app.js", + "repository": "http://git.pwr.link/ghis/momo.git", + "author": "Ghislain Loaec", + "license": "", + "devDependencies": { + "font-awesome": "^4.3.0", + "grunt": "^0.4.5", + "grunt-cli": "^0.1.13", + "grunt-concurrent": "^2.0.0", + "grunt-contrib-clean": "^0.6.0", + "grunt-contrib-coffee": "^0.13.0", + "grunt-contrib-concat": "^0.5.1", + "grunt-contrib-connect": "^0.10.1", + "grunt-contrib-copy": "^0.8.0", + "grunt-contrib-cssmin": "^0.12.3", + "grunt-contrib-jst": "^0.6.0", + "grunt-contrib-less": "^1.0.1", + "grunt-contrib-sass": "^0.9.2", + "grunt-contrib-uglify": "^0.9.1", + "grunt-contrib-watch": "^0.6.1", + "grunt-eco": "~0.1.2", + "grunt-groc": "~0.5.0", + "grunt-run": "^0.3.0", + "grunt-sails-linker": "^0.10.1", + "matchdep": "^0.3.0", + "weinre": "^2.0.0-pre-I0Z7U9OV" + } +}