From 19c9da23627c2c4fb2d36ccc5020f066fdcbfddd Mon Sep 17 00:00:00 2001 From: Jay Phelps Date: Tue, 17 Feb 2015 15:49:36 -0800 Subject: [PATCH] [WIP] Globals + canary bower artifact repo deployment. Will close #137 --- .travis.yml | 2 ++ Brocfile.js | 64 +++++++++++++++++++++++++++---------- bin/bower_build | 48 ++++++++++++++++++++++++++++ build-support/bower.json | 8 +++++ build-support/globalize.js | 1 + build-support/iife-start.js | 1 + build-support/iife-stop.js | 1 + 7 files changed, 108 insertions(+), 17 deletions(-) create mode 100644 bin/bower_build create mode 100644 build-support/bower.json create mode 100644 build-support/globalize.js create mode 100644 build-support/iife-start.js create mode 100644 build-support/iife-stop.js diff --git a/.travis.yml b/.travis.yml index cb471f83..e894c8c8 100644 --- a/.travis.yml +++ b/.travis.yml @@ -15,3 +15,5 @@ before_script: after_script: - sleep 10 - killall sc +after_success: + - "./bin/bower_build" diff --git a/Brocfile.js b/Brocfile.js index 9c5a2464..8df68fc1 100644 --- a/Brocfile.js +++ b/Brocfile.js @@ -7,7 +7,7 @@ var removeFile = require('broccoli-file-remover'); var transpileES6 = require('broccoli-es6-module-transpiler'); var jsHint = require('broccoli-jshint'); var handlebarsInlinedTrees = require('./build-support/handlebars-inliner'); -var getVersion = require('git-repo-version'); +var gitVersion = require('git-repo-version'); var packages = require('./packages'); @@ -18,11 +18,11 @@ var demos = new Funnel('demos', { destDir: '/demos' }); -var ES6Tokenizer = new Funnel(bower+'/simple-html-tokenizer/lib/'); +var ES6Tokenizer = new Funnel(bower + '/simple-html-tokenizer/lib/'); dependableTrees['simple-html-tokenizer'] = ES6Tokenizer; var npm = 'node_modules'; -var MorphRange = new Funnel(npm+'/morph-range/lib/'); +var MorphRange = new Funnel(npm + '/morph-range/lib/'); dependableTrees['morph-range'] = MorphRange; dependableTrees['syntax-handlebars-inliner'] = handlebarsInlinedTrees.syntax; @@ -53,7 +53,7 @@ function getPackageTrees(packageName, dependencies) { // main lib file libTrees.push(getPackageLibTree(packageName)); // dependencies of lib - for (var i=0;i<(dependencies.lib || []).length;i++) { + for (var i = 0; i < (dependencies.lib || []).length; i++) { var depName = dependencies.lib[i]; libTrees.push(getDependencyTree(depName)); } @@ -65,7 +65,7 @@ function getPackageTrees(packageName, dependencies) { destDir: '/' + packageName + '-tests' })); // dependencies of tests - for (var i=0;i<(dependencies.test || []).length;i++) { + for (var i = 0; i < (dependencies.test || []).length; i++) { var depName = dependencies.test[i]; testTrees.push(getDependencyTree(depName)); } @@ -78,12 +78,12 @@ function getPackageTrees(packageName, dependencies) { var test = new Funnel('tests', { srcDir: '/', - files: [ 'index.html', 'packages-config.js' ], + files: ['index.html', 'packages-config.js'], destDir: '/tests' }); test = replace(test, { - files: [ 'tests/packages-config.js' ], + files: ['tests/packages-config.js'], pattern: { match: /\{\{PACKAGES_CONFIG\}\}/g, replacement: JSON.stringify(packages, null, 2) @@ -92,7 +92,7 @@ test = replace(test, { var loader = new Funnel(bower, { srcDir: '/loader', - files: [ 'loader.js' ], + files: ['loader.js'], destDir: '/assets' }); @@ -103,7 +103,7 @@ var qunit = new Funnel(bower, { var cliSauce = new Funnel('./node_modules/ember-cli-sauce', { srcDir: '/vendor', - files: [ 'export-test-results.js' ], + files: ['export-test-results.js'], destDir: '/tests' }); @@ -137,8 +137,8 @@ for (var packageName in packages.dependencies) { }); trees.push(pickedCjsLib); var pickedCjsMain = new Funnel(transpiledCjsLib, { - srcDir: packageName+'.js', - destDir: '/cjs/' + packageName+'.js' + srcDir: packageName + '.js', + destDir: '/cjs/' + packageName + '.js' }); trees.push(pickedCjsMain); @@ -148,7 +148,7 @@ for (var packageName in packages.dependencies) { var jsHintLibTree = new Funnel(libTree, { include: [new RegExp(packageName), new RegExp(packageName + '.+\.js$')], exclude: [/htmlbars-(syntax|util)\/handlebars/], - destDir: packageName+'-tests/' + destDir: packageName + '-tests/' }); jsHintLibTree = removeFile(jsHintLibTree, { srcFile: 'htmlbars-runtime.js' // Uses ES6 `module` syntax. Breaks jsHint @@ -167,16 +167,46 @@ for (var packageName in packages.dependencies) { // CJS tests var transpiledCjsTests = transpileES6(mergeTrees(testTrees), { type: 'cjs' }); var movedCjsTests = new Funnel(transpiledCjsTests, { - srcDir: packageName+'-tests/', - destDir: '/cjs/'+packageName+"-tests/" + srcDir: packageName + '-tests/', + destDir: '/cjs/' + packageName + '-tests/' }); trees.push(movedCjsTests); } -trees = replace(mergeTrees(trees, {overwrite: true}), { - files: [ 'es6/htmlbars.js', 'es6/htmlbars-compiler/template-compiler.js', 'amd/htmlbars.js', 'cjs/htmlbars.js' ], +// Bower +var generatedBowerConfig = new Funnel('build-support', { + srcDir: '/', + destDir: '/', + files: ['bower.json'] +}); +generatedBowerConfig = replace(generatedBowerConfig, { + files: ['bower.json'], + pattern: { + match: /BOWER_VERSION_STRING_PLACEHOLDER/, + replacement: function() { + // remove leading `v` (since by default our tags use a `v` prefix) + return gitVersion().replace(/^v/, ''); + } + } +}); +trees.push(generatedBowerConfig); + +// Globals lib +var globalizedBuildSupport = new Funnel('build-support', { + srcDir: '/', + files: ['iife-start.js', 'globalize.js', 'iife-stop.js'], + destDir: '/' +}); +var globalsLib = concatFiles(mergeTrees([globalizedBuildSupport].concat(trees), { overwrite: true }), { + inputFiles: ['iife-start.js', 'assets/loader.js', 'amd/htmlbars.amd.js', 'globalize.js', 'iife-stop.js'], + outputFile: '/globals/htmlbars.js' +}); +trees.push(globalsLib); + +trees = replace(mergeTrees(trees, { overwrite: true }), { + files: ['es6/htmlbars.js', 'es6/htmlbars-compiler/template-compiler.js', 'amd/htmlbars.js', 'cjs/htmlbars.js'], patterns: [ - { match: /VERSION_STRING_PLACEHOLDER/g, replacement: getVersion() } + { match: /VERSION_STRING_PLACEHOLDER/g, replacement: gitVersion() } ] }); diff --git a/bin/bower_build b/bin/bower_build new file mode 100644 index 00000000..42c6b1c7 --- /dev/null +++ b/bin/bower_build @@ -0,0 +1,48 @@ +#!/usr/bin/env bash + +git config --global user.email "tomster@emberjs.com" +git config --global user.name "Tomster" + +# Repos +SRC_REPO="tildeio/htmlbars" +BUILDS_REPO="tildeio/htmlbars-builds" + +# Name of source repo as it should appear in commit messages +SRC_NAME="htmlbars" + +# User associated with the GH_TOKEN +USER="tildeio" + +# Ensure that no directories within dist will be copied when script is run. +INCLUDED_FILES=`find find -maxdepth 1 -type f` + +echo -e "SRC_REPO: ${SRC_REPO}\n" +echo -e "BUILDS_REPO: ${BUILDS_REPO}\n" +echo -e "INCLUDED_FILES: ${INCLUDED_FILES}\n" +echo -e "CURRENT_BRANCH: ${TRAVIS_BRANCH}\n" + +# Set channel to publish to. If no suitable branch is found exit successfully. +case $TRAVIS_BRANCH in + "master" ) + CHANNEL="canary" ;; + * ) + echo "Not a bower release branch. Exiting!" + exit 0 ;; +esac +echo -e "CHANNEL: ${CHANNEL}\n" + +# Send output to /dev/null to prevent GH_TOKEN leak on error +git clone --branch ${CHANNEL} https://${USER}:${GH_TOKEN}@github.com/${BUILDS_REPO}.git bower_build &> /dev/null +rm -rf bower_build/* +cp -r ${INCLUDED_FILES} bower_build/ +cd bower_build +git remote rm origin + +# Send output to /dev/null to prevent GH_TOKEN leak on error +git remote add origin https://${USER}:${GH_TOKEN}@github.com/${BUILDS_REPO}.git &> /dev/null +git add -A +git commit -m "${SRC_NAME}: https://github.com/${SRC_REPO}/commits/${TRAVIS_COMMIT}." + +# Send output to /dev/null to prevent GH_TOKEN leak on error +git push -fq origin ${CHANNEL} &> /dev/null +echo -e "Done\n" \ No newline at end of file diff --git a/build-support/bower.json b/build-support/bower.json new file mode 100644 index 00000000..a8348164 --- /dev/null +++ b/build-support/bower.json @@ -0,0 +1,8 @@ +{ + "name": "htmlbars", + "version": "BOWER_VERSION_STRING_PLACEHOLDER", + "license": "MIT", + "ignore": [], + "dependencies": {}, + "devDependencies": {} +} \ No newline at end of file diff --git a/build-support/globalize.js b/build-support/globalize.js new file mode 100644 index 00000000..5c9b41f6 --- /dev/null +++ b/build-support/globalize.js @@ -0,0 +1 @@ +this.HTMLBars = requireModule("htmlbars"); \ No newline at end of file diff --git a/build-support/iife-start.js b/build-support/iife-start.js new file mode 100644 index 00000000..7410c620 --- /dev/null +++ b/build-support/iife-start.js @@ -0,0 +1 @@ +(function() { \ No newline at end of file diff --git a/build-support/iife-stop.js b/build-support/iife-stop.js new file mode 100644 index 00000000..4074382a --- /dev/null +++ b/build-support/iife-stop.js @@ -0,0 +1 @@ +}).call(this); \ No newline at end of file