diff --git a/Buildfile b/Buildfile index 6b9f67e..e94a732 100644 --- a/Buildfile +++ b/Buildfile @@ -83,7 +83,9 @@ mode :all do :lazy_instantiation => false, # indicates that you want to include bundle loading code. this is almost - # always a setting you want to leave enabled + # always a setting you want to leave enabled. The value of this property + # should be the name of the global loader object. It should also be the + # name of the framework that contains the loader. :use_loader => true, # Actives module loading. Currently off by default. If you enable the diff --git a/buildtasks/build.rake b/buildtasks/build.rake index 4e4d077..60e132f 100644 --- a/buildtasks/build.rake +++ b/buildtasks/build.rake @@ -80,8 +80,8 @@ namespace :build do end desc "builds the bundle_info.js file for a required framework" - build_task :bundle_info do - SC::Builder::BundleInfo.build ENTRY, DST_PATH + build_task :package_info do + SC::Builder::PackageInfo.build ENTRY, DST_PATH end desc "builds a module entries entry" diff --git a/buildtasks/manifest.rake b/buildtasks/manifest.rake index c1ce1b4..11ab1f7 100644 --- a/buildtasks/manifest.rake +++ b/buildtasks/manifest.rake @@ -150,7 +150,11 @@ namespace :manifest do # etc. if entry.ext == 'js' entry = MANIFEST.add_transform entry, - :build_task => 'build:javascript' + :build_task => 'build:javascript', + :module_name => entry.filename.ext, + :use_modules => CONFIG.use_modules, + :use_loader => CONFIG.use_loader + entry.discover_build_directives!(true) end # Add transform to build into test. @@ -204,6 +208,7 @@ namespace :manifest do :filename => ['source', entry.filename].join('/'), :module_name => entry.filename.ext, :use_modules => CONFIG.use_modules, + :use_loader => CONFIG.use_loader, :build_path => File.join(MANIFEST.build_root, 'source', entry.filename), :url => [MANIFEST.url_root, 'source', entry.filename].join("/"), :build_task => 'build:javascript', @@ -301,12 +306,13 @@ namespace :manifest do ordered_entries = SC::Helpers::EntrySorter.sort(entries, pf) # add a bundle_info.js if needed - if CONFIG.use_loader - bundle_info = MANIFEST.add_entry 'bundle_info.js', - :build_task => 'build:bundle_info', + if CONFIG.use_loader && ((ordered_entries.size == 0) || (ordered_entries.find { |e| e.use_loader })) + bundle_info = MANIFEST.add_entry 'package_info.js', + :build_task => 'build:package_info', :resource => resource_name, :entry_type => :javascript, - :source_entries => entries.dup + :source_entries => entries.dup, + :composite => true entries << bundle_info ordered_entries.unshift(bundle_info) # load first @@ -314,15 +320,16 @@ namespace :manifest do # if we're using modules, then add a generated entries module as well has_exports = !!entries.find { |e| e.module_name == 'package' } - if CONFIG.use_modules && !has_exports + if CONFIG.use_modules && !has_exports && ((ordered_entries.size == 0) || (ordered_entries.find { |e| e.use_modules })) module_exports = MANIFEST.add_entry 'package_exports.js', :build_task => 'build:package_exports', :resource => resource_name, :entry_type => :javascript, :source_entries => entries.dup, - :module_name => 'package' + :module_name => 'package', + :composite => true entries << module_exports - ordered_entries.unshift(module_exports) + ordered_entries.push(module_exports) # load last end MANIFEST.add_composite entry_name, diff --git a/lib/sproutcore/builders/bundle.rb b/lib/sproutcore/builders/bundle.rb index 35ba481..943d2c9 100644 --- a/lib/sproutcore/builders/bundle.rb +++ b/lib/sproutcore/builders/bundle.rb @@ -11,7 +11,7 @@ module SC # Builds a bundle_info.js file which MUST be run *before* the framework is # loaded by the application or framework doing the loading. - class Builder::BundleInfo < Builder::Base + class Builder::PackageInfo < Builder::Base def build(dst_path) begin @@ -22,11 +22,14 @@ def build(dst_path) # emit a bundle definition for the current target loader_name = entry.target.config.module_loader - bundle_name = entry.manifest.bundle_name + package_name = entry.manifest.package_name desc = entry.manifest.bundle_info lines = [] - lines << ";#{loader_name}.bundle('#{bundle_name}', #{desc.to_json});\n" - lines << "#{loader_name}.script('#{entry.cacheable_url}');\n" + lines << ";#{loader_name}.register('#{package_name}', #{desc.to_json});\n" + + if !entry.target.config.combine_javascript + lines << "#{loader_name}.script('#{entry.cacheable_url}');\n" + end writelines dst_path, lines end @@ -41,25 +44,25 @@ def build(dst_path) entries = entry.source_entries.reject { |e| e.exports.nil? } - bundle_name = entry.target.bundle_name + package_name = entry.target.package_name loader_name = entry.target.config.module_loader has_main = false lines = [] - lines << "#{loader_name}.module('#{bundle_name}', 'package', function(require, exports, module) {\n" + lines << "#{loader_name}.module('#{package_name}', 'package', function(require, exports, module) {\n" lines << "var m;\n" entries.each do |e| next if e.package_exports.nil? if e.package_exports && e.package_exports.size>0 - lines << "m = require('#{bundle_name}', '#{e.module_name}');\n" + lines << "m = require('#{package_name}', '#{e.module_name}');\n" e.package_exports.each do |exp| - lines << "exports.#{exp} = m.#{exp};\n" - has_main = true if exp == 'main' + lines << "exports.#{exp[1]} = m.#{exp[1]};\n" + has_main = true if exp[1] == 'main' end else - lines << "require('#{bundle_name}', '#{e.module_name}');\n" + lines << "require('#{package_name}', '#{e.module_name}');\n" end end @@ -69,10 +72,14 @@ def build(dst_path) # if this is a loadable target (i.e. an app), and a main() is defined, # then try to call it automatically when the package becomes ready. if entry.target.loadable? - lines << "\n#{loader_name}.load('#{bundle_name}').then(function() {\n #{loader_name}.require('#{bundle_name}','package').main();\n});\n\n" + lines << "\n#{loader_name}.load('#{package_name}').then(function() {\n #{loader_name}.require('#{package_name}','package').main();\n});\n\n" + end + + + if !entry.target.config.combine_javascript + lines << "#{loader_name}.script('#{entry.cacheable_url}');" end - lines << "#{loader_name}.script('#{entry.cacheable_url}');" writelines dst_path, lines end diff --git a/lib/sproutcore/builders/combine.rb b/lib/sproutcore/builders/combine.rb index b8efa02..fcf1814 100644 --- a/lib/sproutcore/builders/combine.rb +++ b/lib/sproutcore/builders/combine.rb @@ -20,6 +20,7 @@ class Builder::Combine < Builder::Base def build(dst_path) lines = [] entries = entry.ordered_entries || entry.source_entries + loader_name = entry.target.config.module_loader target_name = entry.target.target_name.to_s.sub(/^\//,'') if entry.top_level_lazy_instantiation && entry.combined @@ -54,7 +55,7 @@ def build(dst_path) end if entry.notify_onload && entry.entry_type == :javascript - lines << "; sc_loader.script('#{entry.cacheable_url}');" + lines << "; #{loader_name}.script('#{entry.cacheable_url}');" end writelines dst_path, lines diff --git a/lib/sproutcore/builders/html.rb b/lib/sproutcore/builders/html.rb index eddeebd..98f482e 100644 --- a/lib/sproutcore/builders/html.rb +++ b/lib/sproutcore/builders/html.rb @@ -45,7 +45,7 @@ class Builder::Html < Builder::Base attr_reader :manifest def target_name; target.target_name.to_s.sub(/^\//,''); end - alias_method :bundle_name, :target_name # backwards compat + alias_method :package_name, :target_name # backwards compat def config; target.config; end diff --git a/lib/sproutcore/builders/javascript.rb b/lib/sproutcore/builders/javascript.rb index 5dfa888..a68f655 100644 --- a/lib/sproutcore/builders/javascript.rb +++ b/lib/sproutcore/builders/javascript.rb @@ -41,7 +41,7 @@ def build(dst_path) # Wrap in a module if enabled if entry.use_modules lines.unshift entry.module_preamble - lines.unshift "#{loader_name}.module('#{entry.manifest.bundle_name}', '#{entry.module_name}', function(require, exports, module) {" + lines.unshift "#{loader_name}.module('#{entry.manifest.package_name}', '#{entry.module_name}', function(require, exports, module) {" lines << entry.module_postamble lines << "\n});\n" diff --git a/lib/sproutcore/builders/test.rb b/lib/sproutcore/builders/test.rb index dbba54b..b74c187 100644 --- a/lib/sproutcore/builders/test.rb +++ b/lib/sproutcore/builders/test.rb @@ -49,8 +49,20 @@ def default_content_for_key; :body; end def render_jstest(entry) lines = readlines(entry.staging_path) pathname = entry.staging_path.gsub(/^.+\/staging\//,'').gsub(/"/, '\"') - lines.unshift %[\n] + lines.unshift %[\n] + @content_for_final = (@content_for_final || '') + lines.join("") end diff --git a/lib/sproutcore/helpers/static_helper.rb b/lib/sproutcore/helpers/static_helper.rb index 284c84b..c51e8d7 100644 --- a/lib/sproutcore/helpers/static_helper.rb +++ b/lib/sproutcore/helpers/static_helper.rb @@ -18,7 +18,7 @@ module StaticHelper # required by the named bundle. If you pass no options, the current # client will be used. # - # bundle_name = the name of the bundle to render or nil to use the + # package_name = the name of the bundle to render or nil to use the # current :language => the language to render. defaults to current # language # diff --git a/lib/sproutcore/models/manifest.rb b/lib/sproutcore/models/manifest.rb index 0cfb89f..a355aa6 100644 --- a/lib/sproutcore/models/manifest.rb +++ b/lib/sproutcore/models/manifest.rb @@ -352,8 +352,8 @@ def find_entry(fragment, opts = {}, seen=nil) # BUNDLE INFO # - def bundle_name - target.bundle_name + def package_name + target.package_name end # Returns a HashStruct with a valid bundle_info for the bundle that you @@ -400,7 +400,7 @@ def bundle_info(opts ={}) # get all required target names. these go in the depends hash targets = target.required_targets(t_opts) || [] - depends = targets.map { |t| t.bundle_name }.compact + depends = targets.map { |t| t.package_name }.compact bundle_info['depends'] = depends if depends.size>0 # expand to include dynamic required target and build bundle info @@ -410,7 +410,7 @@ def bundle_info(opts ={}) if targets.size > 0 bundles = {} targets.each do |t| - bundles[t.bundle_name] = + bundles[t.package_name] = t.manifest_for(self.variation).bundle_info(:depends => false) end bundle_info['packages'] = bundles diff --git a/lib/sproutcore/models/manifest_entry.rb b/lib/sproutcore/models/manifest_entry.rb index b204fe3..6bdd16c 100644 --- a/lib/sproutcore/models/manifest_entry.rb +++ b/lib/sproutcore/models/manifest_entry.rb @@ -256,7 +256,7 @@ def scan_module(&block) # representing CSS or JavaScript resources. It will yield undefined # results on all other file types. # - def discover_build_directives! + def discover_build_directives!(force = false) target.begin_attr_changes @@ -264,11 +264,11 @@ def discover_build_directives! entry = self.transform? ? self.source_entry : self # use new module parser - if self.use_modules && self.entry_type == :javascript + if self.use_modules && (force || (self.entry_type == :javascript)) self.imports = [] self.exports = [] - bundle_name = self.target.bundle_name + package_name = self.target.package_name entry.scan_module do |directive, args| directive = directive.to_s.downcase.gsub(/^\s+/,'').gsub(/\s+$/,'') @@ -280,29 +280,51 @@ def discover_build_directives! # handle import foo as bar if args.size == 3 && args[1] == 'as' a = args[0] - a = (a =~ /:/ ? a : [bundle_name,a].join(':')) + a = (a =~ /:/ ? a : [package_name,a].join(':')) self.imports << [a, args[2]] - + else # normalize. if no explicit target, assume local args.each do |a| - a = (a =~ /:/ ? a : [bundle_name,a].join(':')) + a = (a =~ /:/ ? a : [package_name,a].join(':')) self.imports << [a, '*'] end end when 'export' - if args.first == 'package' - args.shift # remove package directive + + is_global = args.first == 'global' + is_package = is_global || (args.first == 'package') + args.shift if is_global || is_package + + # convert to tuples; import/export names + if args.size == 3 && args[1] == 'as' + args = [[args[0], args[2]]] + else + args = args.map { |a| [a, a] } + end + + # save in global exports if needed + if is_global + self.global_exports = [] if self.global_exports.nil? + self.global_exports += args + end + + # save in package exports if needed + if is_package self.package_exports = [] if self.package_exports.nil? self.package_exports += args end - + + # save regular exports always self.exports += args when 'use' self.use_modules = (args[1] != 'false') if args[0] == 'modules' + self.use_loader = (args[1] != 'false') if args[0] == 'loader' + when 'require' + self.required += args end end @@ -353,8 +375,8 @@ def module_preamble # import symbols from other modules self.imports.each do |import| import, as_symbol = import # split array - bundle_name, module_name = import.split(':') - bundle_target = self.target.target_for(bundle_name) + package_name, module_name = import.split(':') + bundle_target = self.target.target_for(package_name) puts "IMPORT: import=#{import} as_symbol=#{as_symbol}" if bundle_target @@ -367,13 +389,13 @@ def module_preamble if module_entry if as_symbol != '*' - lines << "var #{as_symbol} = require('#{bundle_name}','#{module_name}');" + lines << "var #{as_symbol} = require('#{package_name}','#{module_name}');" elsif (module_exports = module_entry.exports).size>0 - lines << "var $m__ = require('#{bundle_name}','#{module_name}'), #{module_exports.map { |s| "#{s}=$m__.#{s}" }.join(',')};" + lines << "var $m__ = require('#{package_name}','#{module_name}'), #{module_exports.map { |s| "#{s[1]}=$m__.#{s[1]}" }.join(',')};" else - lines << "require('#{bundle_name}', '#{module_name}');" + lines << "require('#{package_name}', '#{module_name}');" end else @@ -388,7 +410,7 @@ def module_preamble # setup export variables if self.exports.size>0 - lines << "var #{self.exports.join(',')};" + lines << "var #{self.exports.map { |x| x[0].split('.').first }*','};" end return lines * '' @@ -399,7 +421,7 @@ def module_postamble return '' if !self.use_modules lines = [';'] # always add semicolon in case module code is missing one self.exports.each do |export| - lines << "exports.#{export} = #{export};\n" + lines << "exports.#{export[1]} = #{export[0]};\n" end return lines * '' end diff --git a/lib/sproutcore/models/target.rb b/lib/sproutcore/models/target.rb index 8f84815..499d1c7 100644 --- a/lib/sproutcore/models/target.rb +++ b/lib/sproutcore/models/target.rb @@ -455,7 +455,7 @@ def manifest_for(variation={}) # Returns the bundle name. this is the target name without the leading # slash - def bundle_name + def package_name target_name.to_s[1..-1] end