diff --git a/.travis.yml b/.travis.yml new file mode 100644 index 00000000..f963b7fe --- /dev/null +++ b/.travis.yml @@ -0,0 +1,7 @@ +language: node_js +node_js: + - "0.12" +before_script: + - sudo apt-get install xsltproc + - npm install -g grunt-cli + - grunt prepare diff --git a/Gruntfile.js b/Gruntfile.js index 0aa6b918..2fec18b8 100644 --- a/Gruntfile.js +++ b/Gruntfile.js @@ -102,7 +102,10 @@ grunt.initConfig({ function log( callback, successMsg, errorMsg ) { return function( error, result, code ) { if ( error && errorMsg ) { - grunt.log.error( errorMsg + ": " + error ); + grunt.log.error( errorMsg ); + grunt.log.error( error ); + grunt.log.error( result.stdout ); + grunt.log.error( result.stderr ); } else if ( ! error && successMsg ) { grunt.log.ok( successMsg ); } @@ -306,7 +309,7 @@ function prepare( jqueryUi ) { rimraf.sync( "tmp/api.jqueryui.com/dist" ); grunt.util.spawn({ cmd: "grunt", - args: [ "build" ], + args: [ "build", "--stack" ], opts: { cwd: "tmp/api.jqueryui.com" } diff --git a/app/src/download.js b/app/src/download.js index 6cfc627d..3724fa8d 100644 --- a/app/src/download.js +++ b/app/src/download.js @@ -208,11 +208,23 @@ if ( !thisName || !thisDependencies ) { return; } - thisDependencies = thisDependencies.split( "," ); + + // Adjust path prefixes to match names + var path = thisName.match( /^(.+)\// ); + thisDependencies = thisDependencies.split( "," ).map(function( dependency ) { + if ( !path ) { + return dependency; + } + if ( /\.\.\//.test( dependency ) ) { + return dependency.replace( /^.+\//, "" ); + } + return path[ 1 ] + "/" + dependency; + }); + dependencies[ thisName ] = $(); $.each( thisDependencies, function() { var dependecy = this, - dependecyElem = $( "[name=" + this + "]" ); + dependecyElem = $( ".components-area input[type=checkbox][name='" + this + "']" ); dependencies[ thisName ] = dependencies[ thisName ].add( dependecyElem ); if ( !dependents[ dependecy ] ) { dependents[ dependecy ] = $(); @@ -318,7 +330,7 @@ }); if ( "version" in changed ) { - versionElement = $( "#download-builder [name=version][value=\"" + model.get( "version" ) + "\"]" ); + versionElement = $( "#download-builder input[type=radio][name=version][value=\"" + model.get( "version" ) + "\"]" ); versionElement.trigger( "click" ); themesLoad.done(function() { $( ".advanced-settings .folder-name-area" ).toggle( !versionElement.data( "no-theme-folder" ) ); diff --git a/config.json b/config.json index 83cc5d5f..b057ba48 100644 --- a/config.json +++ b/config.json @@ -1,5 +1,10 @@ { "jqueryUi": [ + { + "version": "origin/master", + "dependsOn": "jQuery1.7+", + "label": "preview" + }, { "version": "1.11.4", "dependsOn": "jQuery1.6+", diff --git a/lib/jquery-ui-1-12.js b/lib/jquery-ui-1-12.js index 428870b4..f9ef3747 100644 --- a/lib/jquery-ui-1-12.js +++ b/lib/jquery-ui-1-12.js @@ -1,13 +1,12 @@ var categories, orderedComponents, _ = require( "underscore" ), fs = require( "fs" ), - glob = require( "./util" ).glob, path = require( "path" ); categories = { - "UI Core": { - name: "UI Core", - description: "A required dependency, contains basic functions and initializers.", + "Core": { + name: "Core", + description: "Various utilities and helpers", order: 0 }, "Interactions": { @@ -68,9 +67,16 @@ function get( data, key ) { return match && match[ 1 ]; } +function trim( string ) { + return string.trim(); +} + function getDependencies( data ) { - var match = data.match( /define\((\ ?\[[\s\S]*?\]\ ?), factory \);/ ); - return match && JSON.parse( match[ 1 ] ) || []; + var match = data.match( /define\(\[([^\]]*?)\]/ ); + if ( match === null ) { + return []; + } + return match[ 1 ].replace( /\/\/.+/g, "" ).replace( /"/, "" ).split( "," ).map( trim ); } function JqueryUiManifests_1_12_0() { diff --git a/lib/jquery-ui-files-1-12.js b/lib/jquery-ui-files-1-12.js index 5628cd10..64ad2c12 100644 --- a/lib/jquery-ui-files-1-12.js +++ b/lib/jquery-ui-files-1-12.js @@ -17,7 +17,7 @@ function JqueryUiFiles_1_12_0( jqueryUi ) { glob( jqueryUi.path + "!(node_modules|build)" ).filter( noDirectory ).map( stripJqueryUiPath ).map( readFile ); glob( jqueryUi.path + "!(node_modules|build)/**" ).filter( noDirectory ).map( stripJqueryUiPath ).map( readFile ); - this.componentFiles = Files( glob( jqueryUi.path + "ui/*.js" ).map( stripJqueryUiPath ).map( readFile ) ); + this.componentFiles = Files( glob( jqueryUi.path + "ui/**/*.js" ).map( stripJqueryUiPath ).map( readFile ) ); // Convert {path:, data:} into {path: }. files = this.cache; diff --git a/lib/package-1-12.js b/lib/package-1-12.js index 0ac3b1cd..4992d650 100644 --- a/lib/package-1-12.js +++ b/lib/package-1-12.js @@ -94,7 +94,7 @@ extend( Package.prototype, { } return indexTemplate({ ui: this.runtime.components.reduce(function( sum, component ) { - sum[ component ] = true; + sum[ component.replace( /^.+\//, "" ) ] = true; return sum; }, {}), version: version @@ -186,6 +186,9 @@ extend( Package.prototype, { appDir: "ui", include: this.runtime.components, onCssBuildWrite: function( _path, data ) { + if ( data === undefined) { + throw new Error( "onCssBuildWrite failed (data is undefined) for path " + _path ); + } structureCssFileNames.push( path.basename( _path ) ); return stripBanner( data ); }, diff --git a/package.json b/package.json index 102fdb03..178f1524 100644 --- a/package.json +++ b/package.json @@ -10,7 +10,7 @@ "async": "0.1.22", "bower": "1.3.8", "builder-amd": "0.0.x", - "builder-jquery-css": "0.0.x", + "builder-jquery-css": "0.0.3", "connect": "1.9.2", "dateformat": "1.0.2-1.2.3", "formidable": "1.0.9", @@ -26,7 +26,7 @@ "handlebars": "1.0.12", "jquery-ui-themeroller": "0.0.x", "lzma": "1.2.1", - "node-packager": "0.0.5", + "node-packager": "0.0.6", "optimist": "0.3.4", "q": "1.1.2", "requirejs": "2.1.8", diff --git a/test/package-1-12.0.js b/test/package-1-12.0.js index d8bfaefe..c39e7f8e 100644 --- a/test/package-1-12.0.js +++ b/test/package-1-12.0.js @@ -14,8 +14,8 @@ function filePresent( files, filepath ) { } defaultTheme = themeGallery[ 0 ].vars; -someWidgets1 = "widget core position autocomplete button menu progressbar spinner tabs".split( " " ); -someWidgets2 = "widget core mouse position draggable resizable button datepicker dialog slider tooltip".split( " " ); +someWidgets1 = "widget core position widgets/autocomplete widgets/button widgets/menu widgets/progressbar widgets/spinner widgets/tabs".split( " " ); +someWidgets2 = "widget core widgets/mouse position widgets/draggable widgets/resizable widgets/button widgets/datepicker widgets/dialog widgets/slider widgets/tooltip".split( " " ); commonFiles = [ "external/jquery/jquery.js", @@ -57,9 +57,11 @@ tests = { components: this.allComponents, themeVars: defaultTheme }); - test.expect( COMMON_FILES_TESTCASES + THEME_FILES_TESTCASES + 1 ); + test.expect( COMMON_FILES_TESTCASES + THEME_FILES_TESTCASES ); pkg.toJson(function( error, files ) { - test.ifError( error ); + if (error) { + return test.done( error ); + } commonFilesCheck( test, files ); themeFilesCheck( test, files, true ); test.done(); @@ -70,9 +72,11 @@ tests = { components: this.allComponents, themeVars: themeGallery[ 1 ].vars }); - test.expect( COMMON_FILES_TESTCASES + THEME_FILES_TESTCASES + 1 ); + test.expect( COMMON_FILES_TESTCASES + THEME_FILES_TESTCASES ); pkg.toJson(function( error, files ) { - test.ifError( error ); + if (error) { + return test.done( error ); + } commonFilesCheck( test, files ); themeFilesCheck( test, files, true ); test.done(); @@ -84,9 +88,11 @@ tests = { components: this.allWidgets, themeVars: defaultTheme }); - test.expect( COMMON_FILES_TESTCASES + THEME_FILES_TESTCASES + 1 ); + test.expect( COMMON_FILES_TESTCASES + THEME_FILES_TESTCASES ); pkg.toJson(function( error, files ) { - test.ifError( error ); + if (error) { + return test.done( error ); + } commonFilesCheck( test, files ); themeFilesCheck( test, files, true ); test.done(); @@ -95,11 +101,13 @@ tests = { "test: select all effects": function( test ) { var pkg = new Packager( this.files, Package, { components: this.allEffects, - themeVars: defaultTheme + themeVars: null }); - test.expect( COMMON_FILES_TESTCASES + THEME_FILES_TESTCASES + 1 ); + test.expect( COMMON_FILES_TESTCASES + THEME_FILES_TESTCASES ); pkg.toJson(function( error, files ) { - test.ifError( error ); + if (error) { + return test.done( error ); + } commonFilesCheck( test, files ); themeFilesCheck( test, files, false ); test.done(); @@ -110,9 +118,11 @@ tests = { components: someWidgets1, themeVars: defaultTheme }); - test.expect( COMMON_FILES_TESTCASES + THEME_FILES_TESTCASES + 1 ); + test.expect( COMMON_FILES_TESTCASES + THEME_FILES_TESTCASES ); pkg.toJson(function( error, files ) { - test.ifError( error ); + if (error) { + return test.done( error ); + } commonFilesCheck( test, files ); themeFilesCheck( test, files, true ); test.done(); @@ -123,9 +133,11 @@ tests = { components: someWidgets2, themeVars: defaultTheme }); - test.expect( COMMON_FILES_TESTCASES + THEME_FILES_TESTCASES + 1 ); + test.expect( COMMON_FILES_TESTCASES + THEME_FILES_TESTCASES ); pkg.toJson(function( error, files ) { - test.ifError( error ); + if (error) { + return test.done( error ); + } commonFilesCheck( test, files ); themeFilesCheck( test, files, true ); test.done(); @@ -144,9 +156,11 @@ tests = { themeVars: defaultTheme, scope: scope }); - test.expect( filesToCheck.length + 1 ); + test.expect( filesToCheck.length ); pkg.toJson(function( error, files ) { - test.ifError( error ); + if (error) { + return test.done( error ); + } filesToCheck.forEach(function( filepath ) { test.ok( scopeRe.test( files[ filepath ] ), "Missing scope selector on \"" + filepath + "\"." ); });