Esempio n. 1
0
	def compile_into_bytecode(self, paths):
		for fullpath in paths:
			# skip any JS found inside HTML <script>
			if fullpath in self.html_scripts: continue
			self.compile_javascript(fullpath)
			self.compiled_files.append(fullpath)

		# Pack JavaScript sources into an asset crypt.
		jspacker.pack(self.project_dir, self.compiled_files, self.appid, self.gen_dir)
Esempio n. 2
0
	def compile_into_bytecode(self, paths):
		for fullpath in paths:
			# skip any JS found inside HTML <script>
			if fullpath in self.html_scripts: continue
			self.compile_javascript(fullpath)
			self.compiled_files.append(fullpath)

		# Pack JavaScript sources into an asset crypt.
		jspacker.pack(self.project_dir, self.compiled_files, self.appid, self.gen_dir)
Esempio n. 3
0
def prepare_commonjs(module_dir):
    module_dir = os.path.abspath(os.path.expanduser(module_dir))
    truthy = ("true", "True", 1, "1", "Yes", "yes")
    manifest_file = os.path.join(module_dir, "manifest")
    if not os.path.exists(manifest_file):
        print >> sys.stderr, "Manifest %s does not exist"
        sys.exit(1)

    assets_folder = os.path.join(module_dir, "assets")
    js_assets = []
    for dirpath, dirnames, filenames in os.walk(assets_folder):
        for f in filenames:
            if f.endswith(".js"):
                js_assets.append(os.path.join(dirpath, f))

    is_commonjs = (len(js_assets) > 0)

    f = open(manifest_file, "r")
    lines = f.readlines()
    f.close()
    id_lines = [l for l in lines if l.strip().startswith("moduleid:")]
    if not id_lines:
        print >> sys.stderr, "[ERROR] Manifest %s does not contain moduleid key." % manifest_file
        sys.exit(1)

    moduleid = id_lines[0].split(":")[1].strip()

    commonjs_lines = [l for l in lines if l.strip().startswith("commonjs:")]

    curval = False
    if commonjs_lines:
        curval = commonjs_lines[0].split(":")[1].strip() in truthy

    if (is_commonjs and not curval) or (not is_commonjs and curval):
        # Need to re-write the key-value
        for l in commonjs_lines:
            lines.remove(l)
        lines.append("commonjs: %s\n" %
                     ("true" if is_commonjs else
                      "false"))  # Trying to avoid locale-specific true/false
        f = open(manifest_file, "w")
        f.writelines(lines)
        f.close()
        print "[DEBUG] manifest re-written to set commonjs value"

    if is_commonjs:
        # Create the java source file that will hold the results of
        # jspacker.py (i.e., the encrypted js file contents)
        f = open(
            os.path.join(module_android_dir, "generated",
                         "CommonJsSourceProvider.java"), "r")
        source_provider_template = Template(f.read())
        f.close()
        source_provider_class = source_provider_template.substitute(
            moduleid=moduleid)
        output_folder = os.path.join(module_dir, "build", "generated", "java")
        if not os.path.exists(output_folder):
            os.makedirs(output_folder)
        f = open(os.path.join(output_folder, "CommonJsSourceProvider.java"),
                 "w")
        f.write(source_provider_class)
        f.close()

        from compiler import Compiler
        import simplejson, java, run, jspacker

        java_command_locations = java.find_java_commands()
        java_command = java_command_locations["java"]
        if not java_command:
            print >> sys.stderr, "[ERROR] java command could not be located. Please check your JAVA_HOME environment variable"
            sys.exit(1)

        modules_used = set()
        output_folder = os.path.join(module_dir, "build", "generated", "js")
        compiled_files = []

        for commonjs_filename in js_assets:
            # Determine which Titanium modules are used within the CommonJS code.
            # We piggy-back on the functionality in compiler.py for this.
            c = Compiler(None, None, None, None, None, None)
            f = open(commonjs_filename, "r")
            c.extract_modules(f.read())
            f.close()
            modules_used |= c.modules

            # Compile the JS file.
            relative_name = os.path.relpath(commonjs_filename, assets_folder)
            compiled_filename = os.path.join(output_folder, relative_name)
            if not os.path.exists(os.path.dirname(compiled_filename)):
                os.makedirs(os.path.dirname(compiled_filename))
            command_args = [
                java_command, "-jar",
                os.path.join(sdk_android_dir, "lib", "closure-compiler.jar"),
                "--js", commonjs_filename, "--js_output_file",
                compiled_filename, "--jscomp_off=internetExplorerChecks"
            ]

            print "[DEBUG] Compiling '%s'" % commonjs_filename
            (out, err, javac_process) = run.run(command_args,
                                                ignore_error=True,
                                                return_error=True,
                                                return_process=True)

            if javac_process.returncode != 0:
                print >> sys.stderr, "[ERROR] %s" % str(err)
                sys.exit(1)

            compiled_files.append(compiled_filename)

        # Pack (encrypt) the compiled JS files.
        print "[DEBUG] Packing compiled JavaScript files"
        generated_java_folder = os.path.join(module_dir, "build", "generated",
                                             "java")
        jspacker.pack(output_folder, compiled_files, moduleid,
                      generated_java_folder)

        if len(modules_used) > 0:
            output_folder = os.path.join(module_dir, "build", "generated",
                                         "json")
            if not os.path.exists(output_folder):
                os.makedirs(output_folder)
            f = open(os.path.join(output_folder, "metadata.json"), "w")
            simplejson.dump({"exports": list(modules_used)}, f)
            f.close()
Esempio n. 4
0
def prepare_commonjs(module_dir):
	module_dir = os.path.abspath(os.path.expanduser(module_dir))
	truthy = ("true", "True", 1, "1", "Yes", "yes")
	manifest_file = os.path.join(module_dir, "manifest")
	if not os.path.exists(manifest_file):
		print >> sys.stderr, "Manifest %s does not exist"
		sys.exit(1)

	assets_folder = os.path.join(module_dir, "assets")
	js_assets = []
	for dirpath, dirnames, filenames in os.walk(assets_folder):
		for f in filenames:
			if f.endswith(".js"):
				js_assets.append(os.path.join(dirpath, f))

	is_commonjs = (len(js_assets) > 0)

	f = open(manifest_file, "r")
	lines = f.readlines()
	f.close()
	id_lines = [l for l in lines if l.strip().startswith("moduleid:")]
	if not id_lines:
		print >> sys.stderr, "[ERROR] Manifest %s does not contain moduleid key." % manifest_file
		sys.exit(1)

	moduleid = id_lines[0].split(":")[1].strip()

	commonjs_lines = [l for l in lines if l.strip().startswith("commonjs:")]

	curval = False
	if commonjs_lines:
		curval = commonjs_lines[0].split(":")[1].strip() in truthy

	if (is_commonjs and not curval) or (not is_commonjs and curval):
		# Need to re-write the key-value
		for l in commonjs_lines:
			lines.remove(l)
		lines.append("commonjs: %s\n" % ("true" if is_commonjs else "false")) # Trying to avoid locale-specific true/false
		f = open(manifest_file, "w")
		f.writelines(lines)
		f.close()
		print "[DEBUG] manifest re-written to set commonjs value"

	if is_commonjs:
		# Create the java source file that will hold the results of
		# jspacker.py (i.e., the encrypted js file contents)
		f = open(os.path.join(module_android_dir, "generated", "CommonJsSourceProvider.java"), "r")
		source_provider_template = Template(f.read())
		f.close()
		source_provider_class = source_provider_template.substitute(moduleid=moduleid)
		output_folder = os.path.join(module_dir, "build", "generated", "java")
		if not os.path.exists(output_folder):
			os.makedirs(output_folder)
		f = open(os.path.join(output_folder, "CommonJsSourceProvider.java"), "w")
		f.write(source_provider_class)
		f.close()

		from compiler import Compiler
		import simplejson, java, run, jspacker

		java_command_locations = java.find_java_commands()
		java_command = java_command_locations["java"]
		if not java_command:
			print >> sys.stderr, "[ERROR] java command could not be located. Please check your JAVA_HOME environment variable"
			sys.exit(1)

		modules_used = set()
		output_folder = os.path.join(module_dir, "build", "generated", "js")
		compiled_files = []

		for commonjs_filename in js_assets:
			# Determine which Titanium modules are used within the CommonJS code.
			# We piggy-back on the functionality in compiler.py for this.
			c = Compiler(None, None, None, None, None, None)
			f = open(commonjs_filename, "r")
			c.extract_modules(f.read())
			f.close()
			modules_used |= c.modules

			# Compile the JS file.
			relative_name = os.path.relpath(commonjs_filename, assets_folder)
			compiled_filename = os.path.join(output_folder, relative_name)
			if not os.path.exists(os.path.dirname(compiled_filename)):
				os.makedirs(os.path.dirname(compiled_filename))
			command_args = [java_command,
					"-jar",
					os.path.join(sdk_android_dir, "lib", "closure-compiler.jar"),
					"--js",
					commonjs_filename,
					"--js_output_file",
					compiled_filename,
					"--jscomp_off=internetExplorerChecks"]

			print "[DEBUG] Compiling '%s'" % commonjs_filename
			(out, err, javac_process) = run.run(
					command_args, ignore_error=True, return_error=True, return_process=True)

			if javac_process.returncode != 0:
				print >> sys.stderr, "[ERROR] %s" % str(err)
				sys.exit(1)

			compiled_files.append(compiled_filename)

		# Pack (encrypt) the compiled JS files.
		print "[DEBUG] Packing compiled JavaScript files"
		generated_java_folder = os.path.join(module_dir, "build", "generated", "java")
		jspacker.pack(output_folder, compiled_files, moduleid, generated_java_folder)

		if len(modules_used) > 0:
			output_folder = os.path.join(module_dir, "build", "generated", "json")
			if not os.path.exists(output_folder):
				os.makedirs(output_folder)
			f = open(os.path.join(output_folder, "metadata.json"), "w")
			simplejson.dump({"exports": list(modules_used)}, f)
			f.close()