Index: src/caterpillar.py |
diff --git a/src/caterpillar.py b/src/caterpillar.py |
index 4a0a8b5c38e4e035c8b1953a6cd4babbfe734961..9e19554d7fb077023131f7b3f7b82e82efdcb478 100755 |
--- a/src/caterpillar.py |
+++ b/src/caterpillar.py |
@@ -69,6 +69,9 @@ MAX_CACHE_VERSION = 1000000 |
# Where this file is located (so we can find resources). |
SCRIPT_DIR = os.path.dirname(os.path.realpath(__file__)) |
+# Name of the app info script. |
+INFO_SCRIPT_NAME = 'app.info.js' |
+ |
# Maps dependency managers to the folder they install dependencies into. |
DEPENDENCY_MANAGER_INSTALL_FOLDER = { |
'bower': 'bower_components', |
@@ -440,6 +443,24 @@ def add_service_worker(output_dir, ca_manifest, required_js_paths, |
sw_file.write(surrogateescape.encode(sw_js)) |
+def add_app_info(output_dir, ca_manifest): |
+ """Adds an app info script, containing metadata, to a web app. |
+ |
+ Args: |
+ output_dir: Path to web app to add app info script to. |
+ ca_manifest: Chrome App manifest dictionary. |
+ """ |
+ logging.debug('Generating app info script.') |
+ js_manifest = json.dumps(ca_manifest, sort_keys=True, indent=2, |
+ separators=(',', ': ')).replace('"', "'") |
Matthew Alger
2016/01/28 23:25:32
Changed this to drop trailing spaces by explicitly
Matt Giuca
2016/01/29 02:34:27
Fair enough.
Why is " being replaced with '? Isn'
Matt Giuca
2016/01/29 03:06:53
Acknowledged.
|
+ app_info_js = ('chrome.caterpillar.manifest = {manifest};\n').format( |
+ manifest=js_manifest) |
+ app_info_path = os.path.join(output_dir, INFO_SCRIPT_NAME) |
+ logging.debug('Writing app info script to `%s`.', app_info_path) |
+ with open(app_info_path, 'w') as app_info_file: |
+ app_info_file.write(app_info_js.encode('utf-8')) |
+ |
+ |
class InstallationError(Exception): |
"""Exception raised when a dependency fails to install.""" |
@@ -626,6 +647,10 @@ def convert_app(input_dir, output_dir, config, force=False): |
required_polyfill_paths = polyfill_paths(polyfillable) |
+ # Additionally, we may generate some files we want to use in HTML script tags, |
+ # but we don't want to install as a dependency or copy from a static JS file. |
+ required_generated_paths = [] |
+ |
# Read in and check the manifest file. |
try: |
ca_manifest = chrome_app.manifest.get(input_dir) |
@@ -646,6 +671,11 @@ def convert_app(input_dir, output_dir, config, force=False): |
json.dump(pwa_manifest, pwa_manifest_file, indent=4, sort_keys=True) |
logging.debug('Wrote `%s` to `%s`.', PWA_MANIFEST_FILENAME, pwa_manifest_path) |
+ # Generate and write an app info file so we can access Chrome App metadata |
+ # from polyfills and scripts. |
+ add_app_info(output_dir, ca_manifest) |
+ required_generated_paths.append(os.path.join('..', INFO_SCRIPT_NAME)) |
+ |
# Remove unnecessary files from the output web app. This must be done before |
# the service worker is generated, or these files will be cached. |
cleanup_output_dir(output_dir) |
@@ -655,8 +685,8 @@ def convert_app(input_dir, output_dir, config, force=False): |
# user code directly. This must be done before the static code is copied |
# across, or the polyfills will have TODOs added to them. |
# Order is significant here - always, then dependencies, then polyfills. |
- required_script_paths = (required_always_paths + required_dependency_paths |
- + required_polyfill_paths) |
+ required_script_paths = (required_always_paths + required_generated_paths + |
+ required_dependency_paths + required_polyfill_paths) |
edit_code(output_dir, required_script_paths, ca_manifest, config) |
# We want the static SW file to be copied in too, so we add it here. |