3 # Copyright 2014 The Chromium Authors. All rights reserved.
4 # Use of this source code is governed by a BSD-style license that can be
5 # found in the LICENSE file.
8 Concatenates autostart modules, application modules' module.json descriptors,
9 and the application loader into a single script.
10 Also concatenates all workers' dependencies into individual worker loader scripts.
13 from cStringIO import StringIO
15 from modular_build import read_file, write_file, bail_error
21 import simplejson as json
25 rjsmin_path = os.path.abspath(os.path.join(
26 os.path.dirname(__file__),
31 sys.path.append(rjsmin_path)
35 def minify_if_needed(javascript, minify):
36 return rjsmin.jsmin(javascript) if minify else javascript
39 def concatenate_autostart_modules(descriptors, application_dir, output_dir, output):
41 sorted_module_names = descriptors.sorted_modules()
42 for name in sorted_module_names:
43 desc = descriptors.modules[name]
45 type = descriptors.application[name].get('type')
46 if type == 'autostart':
47 deps = set(desc.get('dependencies', []))
48 non_autostart_deps = deps & non_autostart
49 if len(non_autostart_deps):
50 bail_error('Non-autostart dependencies specified for the autostarted module "%s": %s' % (name, non_autostart_deps))
51 output.write('\n/* Module %s */\n' % name)
52 modular_build.concatenate_scripts(desc.get('scripts'), path.join(application_dir, name), output_dir, output)
53 elif type != 'worker':
54 non_autostart.add(name)
57 def concatenate_application_script(application_name, descriptors, application_dir, output_dir, minify):
58 application_loader_name = application_name + '.js'
60 output.write('/* Runtime.js */\n')
61 output.write(read_file(path.join(application_dir, 'Runtime.js')))
62 output.write('\n/* Autostart modules */\n')
63 concatenate_autostart_modules(descriptors, application_dir, output_dir, output)
64 output.write('/* Application descriptor %s */\n' % (application_name + '.json'))
65 output.write('applicationDescriptor = ')
66 output.write(descriptors.application_json)
67 output.write(';\n/* Module descriptors */\n')
68 output.write('allDescriptors = ')
69 output.write(json.dumps(descriptors.modules.values()))
70 output.write(';\n/* Application loader */\n')
71 output.write(read_file(path.join(application_dir, application_loader_name)))
73 write_file(path.join(output_dir, application_loader_name), minify_if_needed(output.getvalue(), minify))
77 def concatenate_worker(module_name, descriptors, application_dir, output_dir, minify):
78 descriptor = descriptors.modules[module_name]
79 scripts = descriptor.get('scripts')
82 worker_dir = path.join(application_dir, module_name)
83 output_file_path = path.join(output_dir, module_name, module_name + '.js')
86 output.write('/* Worker %s */\n' % module_name)
87 output.write('/* Runtime.js */\n')
88 output.write(read_file(path.join(application_dir, 'Runtime.js')))
89 dependencies = descriptors.sorted_dependencies_closure(module_name)
91 for dep_name in dependencies:
92 dep_descriptor = descriptors.modules[dep_name]
93 dep_descriptors.append(dep_descriptor)
94 scripts = dep_descriptor.get('scripts')
96 output.write('\n/* Module %s */\n' % dep_name)
97 modular_build.concatenate_scripts(scripts, path.join(application_dir, dep_name), output_dir, output)
99 output.write('\n/* Initialize worker */\n')
100 # Tell Runtime we are in the compiled mode.
101 output.write('allDescriptors = ')
102 output.write(json.dumps(dep_descriptors))
103 output.write(';\nRuntime.initializeWorker("%s");' % module_name)
105 write_file(output_file_path, minify_if_needed(output.getvalue(), minify))
109 def build_application(application_name, loader, application_dir, output_dir, minify):
110 descriptors = loader.load_application(application_name + '.json')
111 concatenate_application_script(application_name, descriptors, application_dir, output_dir, minify)
112 for module in filter(lambda desc: desc.get('type') == 'worker', descriptors.application.values()):
113 concatenate_worker(module['name'], descriptors, application_dir, output_dir, minify)