diff options
author | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-04-07 17:32:43 +0000 |
---|---|---|
committer | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-04-07 17:32:43 +0000 |
commit | 6bf0a5cb5034a7e684dcc3500e841785237ce2dd (patch) | |
tree | a68f146d7fa01f0134297619fbe7e33db084e0aa /comm/tools | |
parent | Initial commit. (diff) | |
download | thunderbird-6bf0a5cb5034a7e684dcc3500e841785237ce2dd.tar.xz thunderbird-6bf0a5cb5034a7e684dcc3500e841785237ce2dd.zip |
Adding upstream version 1:115.7.0.upstream/1%115.7.0upstream
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'comm/tools')
25 files changed, 1881 insertions, 0 deletions
diff --git a/comm/tools/esmify/mach_commands.py b/comm/tools/esmify/mach_commands.py new file mode 100644 index 0000000000..fb02f4982e --- /dev/null +++ b/comm/tools/esmify/mach_commands.py @@ -0,0 +1,705 @@ +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at http://mozilla.org/MPL/2.0/. + +import logging +import os +import pathlib +import re +import subprocess +import sys + +from mach.decorators import Command, CommandArgument + + +def path_sep_to_native(path_str): + """Make separators in the path OS native.""" + return pathlib.os.sep.join(path_str.split("/")) + + +def path_sep_from_native(path): + """Make separators in the path OS native.""" + return "/".join(str(path).split(pathlib.os.sep)) + + +excluded_from_convert_prefix = list( + map( + path_sep_to_native, + [ + # Don't modify suite/ code" + "suite/", + ], + ) +) + + +def is_excluded_from_convert(path): + """Returns true if the JSM file shouldn't be converted to ESM.""" + path_str = str(path) + for prefix in excluded_from_convert_prefix: + if path_str.startswith(prefix): + return True + + return False + + +excluded_from_imports_prefix = list( + map( + path_sep_to_native, + [ + # Vendored or auto-generated files. + "chat/protocols/matrix/lib/", + "chat/protocols/xmpp/lib/", + # Files has macro. + "calendar/base/calendar.js", + "chat/chat-prefs.js", + "mail/app/profile/all-thunderbird.js", + "mail/branding/thunderbird/pref/thunderbird-branding.js", + "mail/components/compose/composer.js", + "mail/components/enterprisepolicies/schemas/schema.sys.mjs", + "mail/locales/en-US/all-l10n.js", + "mail/extensions/am-e2e/prefs/e2e-prefs.js", + "mailnews/extensions/mdn/mdn.js", + "mailnews/mailnews.js", + ], + ) +) + +EXCLUSION_FILES = [ + os.path.join("tools", "lint", "ThirdPartyPaths.txt"), +] + +MAP_JSON = os.path.abspath(os.path.join("tools", "esmify", "map.json")) + + +def load_exclusion_files(): + for path in EXCLUSION_FILES: + with open(path, "r") as f: + for line in f: + p = path_sep_to_native(re.sub("\*$", "", line.strip())) + excluded_from_imports_prefix.append(p) + + +def is_excluded_from_imports(path): + """Returns true if the JS file content shouldn't be handled by + jscodeshift. + + This filter is necessary because jscodeshift cannot handle some + syntax edge cases and results in unexpected rewrite.""" + path_str = str(path) + for prefix in excluded_from_imports_prefix: + if path_str.startswith(prefix): + return True + + return False + + +# Wrapper for hg/git operations +class VCSUtils: + def run(self, cmd): + # Do not pass check=True because the pattern can match no file. + lines = subprocess.run(cmd, stdout=subprocess.PIPE).stdout.decode() + return filter(lambda x: x != "", lines.split("\n")) + + +class HgUtils(VCSUtils): + def is_available(): + return pathlib.Path(".hg").exists() + + def rename(self, before, after): + cmd = ["hg", "rename", before, after] + subprocess.run(cmd, check=True) + + def find_jsms(self, path): + jsms = [] + + cmd = ["hg", "files", f"set:glob:{path}/**/*.jsm"] + for line in self.run(cmd): + jsm = pathlib.Path(line) + if is_excluded_from_convert(jsm): + continue + jsms.append(jsm) + + cmd = [ + "hg", + "files", + f"set:grep('EXPORTED_SYMBOLS = \[') and glob:{path}/**/*.js", + ] + for line in self.run(cmd): + jsm = pathlib.Path(line) + if is_excluded_from_convert(jsm): + continue + jsms.append(jsm) + + return jsms + + def find_all_jss(self, path): + jss = [] + + cmd = ["hg", "files", f"set:glob:{path}/**/*.jsm"] + for line in self.run(cmd): + js = pathlib.Path(line) + if is_excluded_from_imports(js) or is_excluded_from_convert(js): + continue + jss.append(js) + + cmd = ["hg", "files", f"set:glob:{path}/**/*.js"] + for line in self.run(cmd): + js = pathlib.Path(line) + if is_excluded_from_imports(js) or is_excluded_from_convert(js): + continue + jss.append(js) + + cmd = ["hg", "files", f"set:glob:{path}/**/*.mjs"] + for line in self.run(cmd): + js = pathlib.Path(line) + if is_excluded_from_imports(js) or is_excluded_from_convert(js): + continue + jss.append(js) + + return jss + + +class Summary: + def __init__(self): + self.convert_errors = [] + self.import_errors = [] + self.rename_errors = [] + self.no_refs = [] + + +@Command( + "tb-esmify", + category="thunderbird", + description="ESMify JSM files (comm-central variant)", +) +@CommandArgument( + "path", + nargs=1, + help="Path to the JSM file to ESMify, or the directory that contains " + "JSM files and/or JS files that imports ESM-ified JSM. This path is relative" + "to your current directory, $topsrcdir/comm", +) +@CommandArgument( + "--convert", + action="store_true", + help="Only perform the step 1 = convert part", +) +@CommandArgument( + "--imports", + action="store_true", + help="Only perform the step 2 = import calls part", +) +@CommandArgument( + "--upstream-imports", + action="store_true", + help="Perform step 2, import calls, but for converted JSMs in mozilla-central", +) +@CommandArgument( + "--prefix", + default="", + help="Restrict the target of import in the step 2 to ESM-ified JSM, by the " + "prefix match for the JSM file's path. This path is relative to $topsrcdir, " + "not your current directory. e.g. --prefix=comm/mail/ or --prefix=toolkit/", +) +def tb_esmify( + command_context, + path=None, + convert=False, + imports=False, + upstream_imports=False, + prefix="", +): + """ + This command does the following 2 steps: + 1. Convert the JSM file specified by `path` to ESM file, or the JSM files + inside the directory specified by `path` to ESM files, and also + fix references in build files and test definitions + 2. Convert import calls inside file(s) specified by `path` for ESM-ified + files to use new APIs + + Note: When performing import rewrites, when using --imports for comm-central + modules, you will see "Unknown module" WARNING messages referring to modules + from mozilla-central. + When using --upstream-imports for migrated modules from mozilla-central, + you will see "Unknown module" WARNINGs referring to modules from + comm-central. This is expected, and not a problem. + + Example 1: + # Convert all JSM files inside `mail/components/customizableui` directory, + # and replace all references for ESM-ified files in the entire tree to use + # new APIs + + $ ../mach tb-esmify --convert mail/components/customizableui + $ ../mach tb-esmify --imports . --prefix=comm/mail/components/customizableui + + Example 2: + # Convert all JSM files inside `mail` directory, and replace all + # references for the JSM files inside `mail` directory to use + # new APIs + + $ ../mach tb-esmify mail + + Example 3: + # Replace references for ESM-ified files from toolkit/ in calendar/ + + $ ../mach tb-esmify --upstream-imports --prefix=toolkit/ calendar/ + """ + + def error(text): + command_context.log(logging.ERROR, "tb-esmify", {}, f"[ERROR] {text}") + + def warn(text): + command_context.log(logging.WARN, "tb-esmify", {}, f"[WARN] {text}") + + def info(text): + command_context.log(logging.INFO, "tb-esmify", {}, f"[INFO] {text}") + + if upstream_imports: + imports = True + assert not convert, "Cannot use --convert with --upstream-imports" + + # If no options is specified, perform both. + if not convert and not imports: + convert = True + imports = True + + path = pathlib.Path(path[0]) + + if not verify_path(command_context, path): + return 1 + + if HgUtils.is_available(): + vcs_utils = HgUtils() + else: + error( + "This script needs to be run inside mozilla-central + comm-central " + "checkout of mercurial. " + ) + return 1 + + load_exclusion_files() + + info("Setting up jscodeshift...") + setup_jscodeshift() + + is_single_file = path.is_file() + + modified_files = [] + summary = Summary() + + if convert: + info("Searching files to convert to ESM...") + if is_single_file: + jsms = [path] + else: + jsms = vcs_utils.find_jsms(path) + + info(f"Found {len(jsms)} file(s) to convert to ESM.") + + info("Converting to ESM...") + jsms = convert_module(jsms, summary) + if jsms is None: + error("Failed to rewrite exports.") + return 1 + + info("Renaming...") + esms = rename_jsms(command_context, vcs_utils, jsms, summary) + + modified_files += esms + + if imports: + info("Searching files to rewrite imports...") + + if is_single_file: + if convert: + # Already converted above + jss = esms + else: + jss = [path] + else: + jss = vcs_utils.find_all_jss(path) + + info(f"Found {len(jss)} file(s). Rewriting imports...") + + result = rewrite_imports(jss, prefix, summary, upstream_imports) + if result is None: + return 1 + + info(f"Rewritten {len(result)} file(s).") + + # Only modified files needs eslint fix + modified_files += result + + modified_files = list(set(modified_files)) + + info(f"Applying eslint --fix for {len(modified_files)} file(s)...") + eslint_fix(command_context, modified_files) + + def print_files(f, errors): + for [path, message] in errors: + f(f" * {path}") + if message: + f(f" {message}") + + if len(summary.convert_errors): + error("========") + error("Following files are not converted into ESM due to error:") + print_files(error, summary.convert_errors) + + if len(summary.import_errors): + warn("========") + warn("Following files are not rewritten to import ESMs due to error:") + warn( + "(NOTE: Errors related to 'private names' are mostly due to " + " preprocessor macros in the file):" + ) + print_files(warn, summary.import_errors) + + if len(summary.rename_errors): + error("========") + error("Following files are not renamed due to error:") + print_files(error, summary.rename_errors) + + if len(summary.no_refs): + warn("========") + warn("Following files are not found in any build files.") + warn("Please update references to those files manually:") + print_files(warn, summary.rename_errors) + + return 0 + + +def verify_path(command_context, path): + """Check if the path passed to the command is valid relative path.""" + + def error(text): + command_context.log(logging.ERROR, "tb-esmify", {}, f"[ERROR] {text}") + + if not path.exists(): + error(f"{path} does not exist.") + return False + + if path.is_absolute(): + error("Path must be a relative path from comm-central checkout.") + return False + + return True + + +def find_file(path, target): + """Find `target` file in ancestor of path.""" + target_path = path.parent / target + if not target_path.exists(): + if path.parent == path: + return None + + return find_file(path.parent, target) + + return target_path + + +def try_rename_in(command_context, path, target, jsm_name, esm_name, jsm_path): + """Replace the occurrences of `jsm_name` with `esm_name` in `target` + file.""" + + def info(text): + command_context.log(logging.INFO, "tb-esmify", {}, f"[INFO] {text}") + + target_path = find_file(path, target) + if not target_path: + return False + + # Single moz.build or jar.mn can contain multiple files with same name. + # Check the relative path. + + jsm_relative_path = jsm_path.relative_to(target_path.parent) + jsm_relative_str = path_sep_from_native(str(jsm_relative_path)) + + jsm_name_re = re.compile(r"\b" + jsm_name.replace(".", r"\.") + r"\b") + jsm_relative_re = re.compile(r"\b" + jsm_relative_str.replace(".", r"\.") + r"\b") + + modified = False + content = "" + with open(target_path, "r") as f: + for line in f: + if jsm_relative_re.search(line): + modified = True + line = jsm_name_re.sub(esm_name, line) + + content += line + + if modified: + info(f" {str(target_path)}") + info(f" {jsm_name} => {esm_name}") + with open(target_path, "w", newline="\n") as f: + f.write(content) + + return True + + +def try_rename_components_conf(command_context, path, jsm_name, esm_name): + """Replace the occurrences of `jsm_name` with `esm_name` in components.conf + file.""" + + def info(text): + command_context.log(logging.INFO, "tb-esmify", {}, f"[INFO] {text}") + + target_path = find_file(path, "components.conf") + if not target_path: + return False + + # Unlike try_rename_in, components.conf contains the URL instead of + # relative path, and also there are no known files with same name. + # Simply replace the filename. + + with open(target_path, "r") as f: + content = f.read() + + prop_re = re.compile("[\"']jsm[\"']:(.*)" + r"\b" + jsm_name.replace(".", r"\.") + r"\b") + + if not prop_re.search(content): + return False + + info(f" {str(target_path)}") + info(f" {jsm_name} => {esm_name}") + + content = prop_re.sub(r"'esModule':\1" + esm_name, content) + with open(target_path, "w", newline="\n") as f: + f.write(content) + + return True + + +def esmify_name(name): + return re.sub(r"\.(jsm|js|jsm\.js)$", ".sys.mjs", name) + + +def esmify_path(jsm_path): + jsm_name = jsm_path.name + esm_name = re.sub(r"\.(jsm|js|jsm\.js)$", ".sys.mjs", jsm_name) + esm_path = jsm_path.parent / esm_name + return esm_path + + +def rename_single_file(command_context, vcs_utils, jsm_path, summary): + """Rename `jsm_path` to .sys.mjs, and fix references to the file in build and + test definitions.""" + + def info(text): + command_context.log(logging.INFO, "tb-esmify", {}, f"[INFO] {text}") + + esm_path = esmify_path(jsm_path) + + jsm_name = jsm_path.name + esm_name = esm_path.name + + target_files = [ + "moz.build", + "jar.mn", + "browser.ini", + "browser-drawBelowTitlebar.ini", + "browser-detachedWindows.ini", + "browser-drawInTitlebar.ini", + "browser-clear.ini", + "browser_rotated.ini", + "xpcshell.ini", + "xpcshell_cardDAV.ini", + "xpcshell-cpp.ini", + "xpcshell-imap.ini", + "xpcshell-local.ini", + "xpcshell_maildir-cpp.ini", + "xpcshell_maildir.ini", + "xpcshell-nntp.ini", + "xpcshell-shared.ini", + ] + + info(f"{jsm_path} => {esm_path}") + + renamed = False + for target in target_files: + if try_rename_in(command_context, jsm_path, target, jsm_name, esm_name, jsm_path): + renamed = True + + if try_rename_components_conf(command_context, jsm_path, jsm_name, esm_name): + renamed = True + + if not renamed: + summary.no_refs.append([jsm_path, None]) + + if not esm_path.exists(): + vcs_utils.rename(jsm_path, esm_path) + else: + summary.rename_errors.append([jsm_path, f"{esm_path} already exists"]) + + return esm_path + + +def rename_jsms(command_context, vcs_utils, jsms, summary): + esms = [] + for jsm in jsms: + esm = rename_single_file(command_context, vcs_utils, jsm, summary) + esms.append(esm) + + return esms + + +npm_prefix = pathlib.Path("..") / "tools" / "esmify" +path_from_npm_prefix = pathlib.Path("..") / ".." / "comm" + + +def setup_jscodeshift(): + """Install jscodeshift.""" + cmd = [ + sys.executable, + "../mach", + "npm", + "install", + "jscodeshift", + "--save-dev", + "--prefix", + str(npm_prefix), + ] + subprocess.run(cmd, check=True) + + +def run_npm_command(args, env, stdin): + cmd = [ + sys.executable, + "../mach", + "npm", + "run", + ] + args + p = subprocess.Popen(cmd, env=env, stdin=subprocess.PIPE, stdout=subprocess.PIPE) + p.stdin.write(stdin) + p.stdin.close() + + ok_files = [] + errors = [] + while True: + line = p.stdout.readline() + if not line: + break + line = line.rstrip().decode() + + if line.startswith(" NOC "): + continue + + print(line) + + m = re.search(r"^ (OKK|ERR) ([^ ]+)(?: (.+))?", line) + if not m: + continue + + result = m.group(1) + # NOTE: path is written from `tools/esmify`. + path = pathlib.Path(m.group(2)).relative_to(path_from_npm_prefix) + error = m.group(3) + + if result == "OKK": + ok_files.append(path) + + if result == "ERR": + errors.append([path, error]) + + if p.wait() != 0: + return [None, None] + + return ok_files, errors + + +def convert_module(jsms, summary): + """Replace EXPORTED_SYMBOLS with export declarations, and replace + ChromeUtils.importESModule with static import as much as possible, + and return the list of successfully rewritten files.""" + + if len(jsms) == 0: + return [] + + env = os.environ.copy() + env["ESMIFY_MAP_JSON"] = MAP_JSON + + stdin = "\n".join(map(str, paths_from_npm_prefix(jsms))).encode() + + ok_files, errors = run_npm_command( + [ + "convert_module", + "--prefix", + str(npm_prefix), + ], + env=env, + stdin=stdin, + ) + + if ok_files is None and errors is None: + return None + + summary.convert_errors.extend(errors) + + return ok_files + + +def rewrite_imports(jss, prefix, summary, upstream_imports=False): + """Replace import calls for JSM with import calls for ESM or static import + for ESM.""" + + if len(jss) == 0: + return [] + + env = os.environ.copy() + if not upstream_imports: + env["ESMIFY_MAP_JSON"] = MAP_JSON + env["ESMIFY_TARGET_PREFIX"] = prefix + + stdin = "\n".join(map(str, paths_from_npm_prefix(jss))).encode() + + ok_files, errors = run_npm_command( + [ + "rewrite_imports", + "--prefix", + str(npm_prefix), + ], + env=env, + stdin=stdin, + ) + + if ok_files is None and errors is None: + return None + + summary.import_errors.extend(errors) + + return ok_files + + +def paths_from_npm_prefix(paths): + """Convert relative path from mozilla-central to relative path from + tools/esmify.""" + return list(map(lambda path: path_from_npm_prefix / path, paths)) + + +def eslint_fix(command_context, files): + """Auto format files.""" + + def info(text): + command_context.log(logging.INFO, "tb-esmify", {}, f"[INFO] {text}") + + if len(files) == 0: + return + + remaining = files[0:] + + # There can be too many files for single command line, perform by chunk. + max_files = 16 + while len(remaining) > max_files: + info(f"{len(remaining)} files remaining") + + chunk = remaining[0:max_files] + remaining = remaining[max_files:] + + cmd = [sys.executable, "../mach", "eslint", "--fix"] + chunk + subprocess.run(cmd, check=True) + + info(f"{len(remaining)} files remaining") + chunk = remaining + cmd = [sys.executable, "../mach", "eslint", "--fix"] + chunk + subprocess.run(cmd, check=True) diff --git a/comm/tools/esmify/map.json b/comm/tools/esmify/map.json new file mode 100644 index 0000000000..820ad29b12 --- /dev/null +++ b/comm/tools/esmify/map.json @@ -0,0 +1,482 @@ +{ + "chrome://openpgp/content/BondOpenPGP.jsm": "comm/mail/extensions/openpgp/content/BondOpenPGP.jsm", + "chrome://openpgp/content/modules/CollectedKeysDB.jsm": "comm/mail/extensions/openpgp/content/modules/CollectedKeysDB.jsm", + "chrome://openpgp/content/modules/GPGME.jsm": "comm/mail/extensions/openpgp/content/modules/GPGME.jsm", + "chrome://openpgp/content/modules/GPGMELib.jsm": "comm/mail/extensions/openpgp/content/modules/GPGMELib.jsm", + "chrome://openpgp/content/modules/OpenPGPAlias.jsm": "comm/mail/extensions/openpgp/content/modules/OpenPGPAlias.jsm", + "chrome://openpgp/content/modules/RNP.jsm": "comm/mail/extensions/openpgp/content/modules/RNP.jsm", + "chrome://openpgp/content/modules/RNPLib.jsm": "comm/mail/extensions/openpgp/content/modules/RNPLib.jsm", + "chrome://openpgp/content/modules/armor.jsm": "comm/mail/extensions/openpgp/content/modules/armor.jsm", + "chrome://openpgp/content/modules/autocrypt.jsm": "comm/mail/extensions/openpgp/content/modules/autocrypt.jsm", + "chrome://openpgp/content/modules/constants.jsm": "comm/mail/extensions/openpgp/content/modules/constants.jsm", + "chrome://openpgp/content/modules/core.jsm": "comm/mail/extensions/openpgp/content/modules/core.jsm", + "chrome://openpgp/content/modules/cryptoAPI.jsm": "comm/mail/extensions/openpgp/content/modules/cryptoAPI.jsm", + "chrome://openpgp/content/modules/cryptoAPI/GnuPGCryptoAPI.jsm": "comm/mail/extensions/openpgp/content/modules/cryptoAPI/GnuPGCryptoAPI.jsm", + "chrome://openpgp/content/modules/cryptoAPI/RNPCryptoAPI.jsm": "comm/mail/extensions/openpgp/content/modules/cryptoAPI/RNPCryptoAPI.jsm", + "chrome://openpgp/content/modules/data.jsm": "comm/mail/extensions/openpgp/content/modules/data.jsm", + "chrome://openpgp/content/modules/decryption.jsm": "comm/mail/extensions/openpgp/content/modules/decryption.jsm", + "chrome://openpgp/content/modules/dialog.jsm": "comm/mail/extensions/openpgp/content/modules/dialog.jsm", + "chrome://openpgp/content/modules/encryption.jsm": "comm/mail/extensions/openpgp/content/modules/encryption.jsm", + "chrome://openpgp/content/modules/filters.jsm": "comm/mail/extensions/openpgp/content/modules/filters.jsm", + "chrome://openpgp/content/modules/fixExchangeMsg.jsm": "comm/mail/extensions/openpgp/content/modules/fixExchangeMsg.jsm", + "chrome://openpgp/content/modules/funcs.jsm": "comm/mail/extensions/openpgp/content/modules/funcs.jsm", + "chrome://openpgp/content/modules/key.jsm": "comm/mail/extensions/openpgp/content/modules/key.jsm", + "chrome://openpgp/content/modules/keyLookupHelper.jsm": "comm/mail/extensions/openpgp/content/modules/keyLookupHelper.jsm", + "chrome://openpgp/content/modules/keyObj.jsm": "comm/mail/extensions/openpgp/content/modules/keyObj.jsm", + "chrome://openpgp/content/modules/keyRing.jsm": "comm/mail/extensions/openpgp/content/modules/keyRing.jsm", + "chrome://openpgp/content/modules/keyserver.jsm": "comm/mail/extensions/openpgp/content/modules/keyserver.jsm", + "chrome://openpgp/content/modules/keyserverUris.jsm": "comm/mail/extensions/openpgp/content/modules/keyserverUris.jsm", + "chrome://openpgp/content/modules/log.jsm": "comm/mail/extensions/openpgp/content/modules/log.jsm", + "chrome://openpgp/content/modules/masterpass.jsm": "comm/mail/extensions/openpgp/content/modules/masterpass.jsm", + "chrome://openpgp/content/modules/mime.jsm": "comm/mail/extensions/openpgp/content/modules/mime.jsm", + "chrome://openpgp/content/modules/mimeDecrypt.jsm": "comm/mail/extensions/openpgp/content/modules/mimeDecrypt.jsm", + "chrome://openpgp/content/modules/mimeEncrypt.jsm": "comm/mail/extensions/openpgp/content/modules/mimeEncrypt.jsm", + "chrome://openpgp/content/modules/mimeVerify.jsm": "comm/mail/extensions/openpgp/content/modules/mimeVerify.jsm", + "chrome://openpgp/content/modules/msgRead.jsm": "comm/mail/extensions/openpgp/content/modules/msgRead.jsm", + "chrome://openpgp/content/modules/persistentCrypto.jsm": "comm/mail/extensions/openpgp/content/modules/persistentCrypto.jsm", + "chrome://openpgp/content/modules/pgpmimeHandler.jsm": "comm/mail/extensions/openpgp/content/modules/pgpmimeHandler.jsm", + "chrome://openpgp/content/modules/singletons.jsm": "comm/mail/extensions/openpgp/content/modules/singletons.jsm", + "chrome://openpgp/content/modules/sqliteDb.jsm": "comm/mail/extensions/openpgp/content/modules/sqliteDb.jsm", + "chrome://openpgp/content/modules/streams.jsm": "comm/mail/extensions/openpgp/content/modules/streams.jsm", + "chrome://openpgp/content/modules/trust.jsm": "comm/mail/extensions/openpgp/content/modules/trust.jsm", + "chrome://openpgp/content/modules/uris.jsm": "comm/mail/extensions/openpgp/content/modules/uris.jsm", + "chrome://openpgp/content/modules/webKey.jsm": "comm/mail/extensions/openpgp/content/modules/webKey.jsm", + "chrome://openpgp/content/modules/windows.jsm": "comm/mail/extensions/openpgp/content/modules/windows.jsm", + "chrome://openpgp/content/modules/wkdLookup.jsm": "comm/mail/extensions/openpgp/content/modules/wkdLookup.jsm", + "chrome://openpgp/content/modules/wksMimeHandler.jsm": "comm/mail/extensions/openpgp/content/modules/wksMimeHandler.jsm", + "chrome://openpgp/content/modules/zbase32.jsm": "comm/mail/extensions/openpgp/content/modules/zbase32.jsm", + "resource:///actors/ChatActionChild.jsm": "comm/mail/actors/ChatActionChild.jsm", + "resource:///actors/ChatActionParent.jsm": "comm/mail/actors/ChatActionParent.jsm", + "resource:///actors/ContextMenuParent.jsm": "comm/mail/actors/ContextMenuParent.jsm", + "resource:///actors/LinkClickHandlerChild.jsm": "comm/mail/actors/LinkClickHandlerChild.jsm", + "resource:///actors/LinkClickHandlerParent.jsm": "comm/mail/actors/LinkClickHandlerParent.jsm", + "resource:///actors/LinkHandlerParent.jsm": "comm/mail/actors/LinkHandlerParent.jsm", + "resource:///actors/MailLinkChild.jsm": "comm/mail/actors/MailLinkChild.jsm", + "resource:///actors/MailLinkParent.jsm": "comm/mail/actors/MailLinkParent.jsm", + "resource:///actors/PromptParent.jsm": "comm/mail/actors/PromptParent.jsm", + "resource:///actors/VCardChild.jsm": "comm/mail/actors/VCardChild.jsm", + "resource:///actors/VCardParent.jsm": "comm/mail/actors/VCardParent.jsm", + "resource:///modules/ABQueryUtils.jsm": "comm/mailnews/base/src/ABQueryUtils.jsm", + "resource:///modules/AME2E.jsm": "comm/mail/extensions/am-e2e/AME2E.jsm", + "resource:///modules/AbAutoCompleteMyDomain.jsm": "comm/mailnews/addrbook/src/AbAutoCompleteMyDomain.jsm", + "resource:///modules/AbAutoCompleteSearch.jsm": "comm/mailnews/addrbook/src/AbAutoCompleteSearch.jsm", + "resource:///modules/AbLDAPAttributeMap.jsm": "comm/mailnews/addrbook/src/AbLDAPAttributeMap.jsm", + "resource:///modules/AbLDAPAutoCompleteSearch.jsm": "comm/mailnews/addrbook/src/AbLDAPAutoCompleteSearch.jsm", + "resource:///modules/AboutRedirector.jsm": "comm/mail/components/AboutRedirector.jsm", + "resource:///modules/AboutSupportMac.jsm": "comm/mail/components/about-support/AboutSupportMac.jsm", + "resource:///modules/AboutSupportUnix.jsm": "comm/mail/components/about-support/AboutSupportUnix.jsm", + "resource:///modules/AboutSupportWin32.jsm": "comm/mail/components/about-support/AboutSupportWin32.jsm", + "resource:///modules/Activity.jsm": "comm/mail/components/activity/Activity.jsm", + "resource:///modules/ActivityManager.jsm": "comm/mail/components/activity/ActivityManager.jsm", + "resource:///modules/ActivityManagerUI.jsm": "comm/mail/components/activity/ActivityManagerUI.jsm", + "resource:///modules/AddrBookCard.jsm": "comm/mailnews/addrbook/modules/AddrBookCard.jsm", + "resource:///modules/AddrBookDirectory.jsm": "comm/mailnews/addrbook/modules/AddrBookDirectory.jsm", + "resource:///modules/AddrBookFileImporter.jsm": "comm/mailnews/import/modules/AddrBookFileImporter.jsm", + "resource:///modules/AddrBookMailingList.jsm": "comm/mailnews/addrbook/modules/AddrBookMailingList.jsm", + "resource:///modules/AddrBookManager.jsm": "comm/mailnews/addrbook/modules/AddrBookManager.jsm", + "resource:///modules/AddrBookUtils.jsm": "comm/mailnews/addrbook/modules/AddrBookUtils.jsm", + "resource:///modules/AppIdleManager.jsm": "comm/mail/components/AppIdleManager.jsm", + "resource:///modules/AppleMailProfileImporter.jsm": "comm/mailnews/import/modules/AppleMailProfileImporter.jsm", + "resource:///modules/AppUpdateUI.jsm": "comm/mail/modules/AppUpdateUI.jsm", + "resource:///modules/AttachmentChecker.jsm": "comm/mail/modules/AttachmentChecker.jsm", + "resource:///modules/BaseProfileImporter.jsm": "comm/mailnews/import/modules/BaseProfileImporter.jsm", + "resource:///modules/BeckyProfileImporter.jsm": "comm/mailnews/import/modules/BeckyProfileImporter.jsm", + "resource:///modules/BrowserWindowTracker.jsm": "comm/mail/modules/BrowserWindowTracker.jsm", + "resource:///modules/BuiltInThemes.jsm": "comm/mail/themes/BuiltInThemes.jsm", + "resource:///modules/CLib.jsm": "comm/chat/modules/CLib.jsm", + "resource:///modules/CalAlarm.jsm": "comm/calendar/base/src/CalAlarm.jsm", + "resource:///modules/CalAlarmMonitor.jsm": "comm/calendar/base/src/CalAlarmMonitor.jsm", + "resource:///modules/CalAlarmService.jsm": "comm/calendar/base/src/CalAlarmService.jsm", + "resource:///modules/CalAttachment.jsm": "comm/calendar/base/src/CalAttachment.jsm", + "resource:///modules/CalAttendee.jsm": "comm/calendar/base/src/CalAttendee.jsm", + "resource:///modules/CalCalendarManager.jsm": "comm/calendar/base/src/CalCalendarManager.jsm", + "resource:///modules/CalCompositeCalendar.jsm": "comm/calendar/providers/composite/CalCompositeCalendar.jsm", + "resource:///modules/CalDateTime.jsm": "comm/calendar/base/src/CalDateTime.jsm", + "resource:///modules/CalDavCalendar.jsm": "comm/calendar/providers/caldav/CalDavCalendar.jsm", + "resource:///modules/CalDavProvider.jsm": "comm/calendar/providers/caldav/CalDavProvider.jsm", + "resource:///modules/CalDefaultACLManager.jsm": "comm/calendar/base/src/CalDefaultACLManager.jsm", + "resource:///modules/CalDeletedItems.jsm": "comm/calendar/base/src/CalDeletedItems.jsm", + "resource:///modules/CalDuration.jsm": "comm/calendar/base/src/CalDuration.jsm", + "resource:///modules/CalEvent.jsm": "comm/calendar/base/src/CalEvent.jsm", + "resource:///modules/CalFreeBusyService.jsm": "comm/calendar/base/src/CalFreeBusyService.jsm", + "resource:///modules/CalHtmlExport.jsm": "comm/calendar/import-export/CalHtmlExport.jsm", + "resource:///modules/CalICSProvider.jsm": "comm/calendar/providers/ics/CalICSProvider.jsm", + "resource:///modules/CalICSService.jsm": "comm/calendar/base/src/CalICSService.jsm", + "resource:///modules/CalIcsImportExport.jsm": "comm/calendar/import-export/CalIcsImportExport.jsm", + "resource:///modules/CalIcsParser.jsm": "comm/calendar/base/src/CalIcsParser.jsm", + "resource:///modules/CalIcsSerializer.jsm": "comm/calendar/base/src/CalIcsSerializer.jsm", + "resource:///modules/CalItipEmailTransport.jsm": "comm/calendar/itip/CalItipEmailTransport.jsm", + "resource:///modules/CalItipItem.jsm": "comm/calendar/base/src/CalItipItem.jsm", + "resource:///modules/CalItipMessageSender.jsm": "comm/calendar/itip/CalItipMessageSender.jsm", + "resource:///modules/CalItipOutgoingMessage.jsm": "comm/calendar/itip/CalItipOutgoingMessage.jsm", + "resource:///modules/CalItipProtocolHandler.jsm": "comm/calendar/itip/CalItipProtocolHandler.jsm", + "resource:///modules/CalMemoryCalendar.jsm": "comm/calendar/providers/memory/CalMemoryCalendar.jsm", + "resource:///modules/CalMetronome.jsm": "comm/calendar/base/src/CalMetronome.jsm", + "resource:///modules/CalMimeConverter.jsm": "comm/calendar/base/src/CalMimeConverter.jsm", + "resource:///modules/CalPeriod.jsm": "comm/calendar/base/src/CalPeriod.jsm", + "resource:///modules/CalProtocolHandler.jsm": "comm/calendar/base/src/CalProtocolHandler.jsm", + "resource:///modules/CalReadableStreamFactory.jsm": "comm/calendar/base/src/CalReadableStreamFactory.jsm", + "resource:///modules/CalRecurrenceDate.jsm": "comm/calendar/base/src/CalRecurrenceDate.jsm", + "resource:///modules/CalRecurrenceInfo.jsm": "comm/calendar/base/src/CalRecurrenceInfo.jsm", + "resource:///modules/CalRecurrenceRule.jsm": "comm/calendar/base/src/CalRecurrenceRule.jsm", + "resource:///modules/CalRelation.jsm": "comm/calendar/base/src/CalRelation.jsm", + "resource:///modules/CalStartupService.jsm": "comm/calendar/base/src/CalStartupService.jsm", + "resource:///modules/CalStorageCalendar.jsm": "comm/calendar/providers/storage/CalStorageCalendar.jsm", + "resource:///modules/CalTimezone.jsm": "comm/calendar/base/src/CalTimezone.jsm", + "resource:///modules/CalTimezoneService.jsm": "comm/calendar/base/src/CalTimezoneService.jsm", + "resource:///modules/CalTodo.jsm": "comm/calendar/base/src/CalTodo.jsm", + "resource:///modules/CalTransactionManager.jsm": "comm/calendar/base/src/CalTransactionManager.jsm", + "resource:///modules/CalWeekInfoService.jsm": "comm/calendar/base/src/CalWeekInfoService.jsm", + "resource:///modules/CalendarFileImporter.jsm": "comm/mailnews/import/modules/CalendarFileImporter.jsm", + "resource:///modules/CardDAVDirectory.jsm": "comm/mailnews/addrbook/modules/CardDAVDirectory.jsm", + "resource:///modules/CardDAVUtils.jsm": "comm/mailnews/addrbook/modules/CardDAVUtils.jsm", + "resource:///modules/ChatEncryption.jsm": "comm/mail/components/im/modules/ChatEncryption.jsm", + "resource:///modules/ConversationOpener.jsm": "comm/mail/modules/ConversationOpener.jsm", + "resource:///modules/CustomizableUI.jsm": "comm/mail/components/customizableui/CustomizableUI.jsm", + "resource:///modules/CustomizableWidgets.jsm": "comm/mail/components/customizableui/CustomizableWidgets.jsm", + "resource:///modules/DBViewWrapper.jsm": "comm/mail/modules/DBViewWrapper.jsm", + "resource:///modules/DNS.jsm": "comm/mail/modules/DNS.jsm", + "resource:///modules/DisplayNameUtils.jsm": "comm/mail/modules/DisplayNameUtils.jsm", + "resource:///modules/ExtensionBrowsingData.jsm": "comm/mail/components/extensions/ExtensionBrowsingData.jsm", + "resource:///modules/ExtensionPopups.jsm": "comm/mail/components/extensions/ExtensionPopups.jsm", + "resource:///modules/ExtensionSupport.jsm": "comm/mail/modules/ExtensionSupport.jsm", + "resource:///modules/ExtensionToolbarButtons.jsm": "comm/mail/components/extensions/ExtensionToolbarButtons.jsm", + "resource:///modules/ExtensionsUI.jsm": "comm/mail/modules/ExtensionsUI.jsm", + "resource:///modules/Feed.jsm": "comm/mailnews/extensions/newsblog/Feed.jsm", + "resource:///modules/FeedItem.jsm": "comm/mailnews/extensions/newsblog/FeedItem.jsm", + "resource:///modules/FeedParser.jsm": "comm/mailnews/extensions/newsblog/FeedParser.jsm", + "resource:///modules/FeedUtils.jsm": "comm/mailnews/extensions/newsblog/FeedUtils.jsm", + "resource:///modules/FolderLookupService.jsm": "comm/mailnews/base/src/FolderLookupService.jsm", + "resource:///modules/FolderUtils.jsm": "comm/mailnews/base/src/FolderUtils.jsm", + "resource:///modules/GlobalPopupNotifications.jsm": "comm/mail/modules/GlobalPopupNotifications.jsm", + "resource:///modules/GlodaAutoComplete.jsm": "comm/mailnews/db/gloda/components/GlodaAutoComplete.jsm", + "resource:///modules/GlodaIMSearcher.jsm": "comm/mail/components/im/modules/GlodaIMSearcher.jsm", + "resource:///modules/IMIncomingServer.jsm": "comm/mail/components/im/IMIncomingServer.jsm", + "resource:///modules/IMProtocolInfo.jsm": "comm/mail/components/im/IMProtocolInfo.jsm", + "resource:///modules/IMServices.jsm": "comm/chat/modules/IMServices.jsm", + "resource:///modules/ImapChannel.jsm": "comm/mailnews/imap/src/ImapChannel.jsm", + "resource:///modules/ImapClient.jsm": "comm/mailnews/imap/src/ImapClient.jsm", + "resource:///modules/ImapIncomingServer.jsm": "comm/mailnews/imap/src/ImapIncomingServer.jsm", + "resource:///modules/ImapMessageService.jsm": "comm/mailnews/imap/src/ImapMessageService.jsm", + "resource:///modules/ImapModuleLoader.jsm": "comm/mailnews/imap/src/ImapModuleLoader.jsm", + "resource:///modules/ImapProtocolHandler.jsm": "comm/mailnews/imap/src/ImapProtocolHandler.jsm", + "resource:///modules/ImapProtocolInfo.jsm": "comm/mailnews/imap/src/ImapProtocolInfo.jsm", + "resource:///modules/ImapResponse.jsm": "comm/mailnews/imap/src/ImapResponse.jsm", + "resource:///modules/ImapService.jsm": "comm/mailnews/imap/src/ImapService.jsm", + "resource:///modules/ImapUtils.jsm": "comm/mailnews/imap/src/ImapUtils.jsm", + "resource:///modules/InteractiveBrowser.jsm": "comm/chat/modules/InteractiveBrowser.jsm", + "resource:///modules/JXON.jsm": "comm/mailnews/base/src/JXON.jsm", + "resource:///modules/LDAPClient.jsm": "comm/mailnews/addrbook/modules/LDAPClient.jsm", + "resource:///modules/LDAPConnection.jsm": "comm/mailnews/addrbook/modules/LDAPConnection.jsm", + "resource:///modules/LDAPDirectory.jsm": "comm/mailnews/addrbook/modules/LDAPDirectory.jsm", + "resource:///modules/LDAPDirectoryQuery.jsm": "comm/mailnews/addrbook/modules/LDAPDirectoryQuery.jsm", + "resource:///modules/LDAPListenerBase.jsm": "comm/mailnews/addrbook/modules/LDAPListenerBase.jsm", + "resource:///modules/LDAPMessage.jsm": "comm/mailnews/addrbook/modules/LDAPMessage.jsm", + "resource:///modules/LDAPOperation.jsm": "comm/mailnews/addrbook/modules/LDAPOperation.jsm", + "resource:///modules/LDAPProtocolHandler.jsm": "comm/mailnews/addrbook/modules/LDAPProtocolHandler.jsm", + "resource:///modules/LDAPReplicationService.jsm": "comm/mailnews/addrbook/modules/LDAPReplicationService.jsm", + "resource:///modules/LDAPService.jsm": "comm/mailnews/addrbook/modules/LDAPService.jsm", + "resource:///modules/LDAPSyncQuery.jsm": "comm/mailnews/addrbook/modules/LDAPSyncQuery.jsm", + "resource:///modules/LDAPURLParser.jsm": "comm/mailnews/addrbook/modules/LDAPURLParser.jsm", + "resource:///modules/LineReader.jsm": "comm/mailnews/base/src/LineReader.jsm", + "resource:///modules/MDNService.jsm": "comm/mailnews/extensions/mdn/MDNService.jsm", + "resource:///modules/MailAuthenticator.jsm": "comm/mailnews/base/src/MailAuthenticator.jsm", + "resource:///modules/MailConsts.jsm": "comm/mail/modules/MailConsts.jsm", + "resource:///modules/MailCryptoUtils.jsm": "comm/mailnews/base/src/MailCryptoUtils.jsm", + "resource:///modules/MailE10SUtils.jsm": "comm/mail/modules/MailE10SUtils.jsm", + "resource:///modules/MailExtensionShortcuts.jsm": "comm/mail/components/extensions/MailExtensionShortcuts.jsm", + "resource:///modules/MailGlue.jsm": "comm/mail/components/MailGlue.jsm", + "resource:///modules/MailMigrator.jsm": "comm/mail/modules/MailMigrator.jsm", + "resource:///modules/MailNotificationManager.jsm": "comm/mailnews/base/src/MailNotificationManager.jsm", + "resource:///modules/MailNotificationService.jsm": "comm/mailnews/base/src/MailNotificationService.jsm", + "resource:///modules/MailServices.jsm": "comm/mailnews/base/src/MailServices.jsm", + "resource:///modules/MailStringUtils.jsm": "comm/mailnews/base/src/MailStringUtils.jsm", + "resource:///modules/MailUsageTelemetry.jsm": "comm/mail/modules/MailUsageTelemetry.jsm", + "resource:///modules/MailUtils.jsm": "comm/mail/modules/MailUtils.jsm", + "resource:///modules/MailViewManager.jsm": "comm/mail/modules/MailViewManager.jsm", + "resource:///modules/MailnewsMigrator.jsm": "comm/mailnews/base/src/MailnewsMigrator.jsm", + "resource:///modules/MailtoProtocolHandler.jsm": "comm/mailnews/compose/src/MailtoProtocolHandler.jsm", + "resource:///modules/MessageArchiver.jsm": "comm/mail/modules/MessageArchiver.jsm", + "resource:///modules/MessageSend.jsm": "comm/mailnews/compose/src/MessageSend.jsm", + "resource:///modules/MessengerContentHandler.jsm": "comm/mail/components/MessengerContentHandler.jsm", + "resource:///modules/MimeEncoder.jsm": "comm/mailnews/compose/src/MimeEncoder.jsm", + "resource:///modules/MimeJSComponents.jsm": "comm/mailnews/mime/src/MimeJSComponents.jsm", + "resource:///modules/MimeMessage.jsm": "comm/mailnews/compose/src/MimeMessage.jsm", + "resource:///modules/MimeMessageEmitter.jsm": "comm/mailnews/db/gloda/components/MimeMessageEmitter.jsm", + "resource:///modules/MimeMessageUtils.jsm": "comm/mailnews/compose/src/MimeMessageUtils.jsm", + "resource:///modules/MimePart.jsm": "comm/mailnews/compose/src/MimePart.jsm", + "resource:///modules/MsgAsyncPrompter.jsm": "comm/mailnews/base/src/MsgAsyncPrompter.jsm", + "resource:///modules/MsgDBCacheManager.jsm": "comm/mailnews/base/src/MsgDBCacheManager.jsm", + "resource:///modules/MsgHdrSyntheticView.jsm": "comm/mail/modules/MsgHdrSyntheticView.jsm", + "resource:///modules/MsgIncomingServer.jsm": "comm/mailnews/base/src/MsgIncomingServer.jsm", + "resource:///modules/MsgKeySet.jsm": "comm/mailnews/base/src/MsgKeySet.jsm", + "resource:///modules/MsgTraitService.jsm": "comm/mailnews/search/src/MsgTraitService.jsm", + "resource:///modules/NewsAutoCompleteSearch.jsm": "comm/mailnews/news/src/NewsAutoCompleteSearch.jsm", + "resource:///modules/NewsBlog.jsm": "comm/mailnews/extensions/newsblog/NewsBlog.jsm", + "resource:///modules/NntpChannel.jsm": "comm/mailnews/news/src/NntpChannel.jsm", + "resource:///modules/NntpClient.jsm": "comm/mailnews/news/src/NntpClient.jsm", + "resource:///modules/NntpIncomingServer.jsm": "comm/mailnews/news/src/NntpIncomingServer.jsm", + "resource:///modules/NntpMessageService.jsm": "comm/mailnews/news/src/NntpMessageService.jsm", + "resource:///modules/NntpNewsGroup.jsm": "comm/mailnews/news/src/NntpNewsGroup.jsm", + "resource:///modules/NntpProtocolHandler.jsm": "comm/mailnews/news/src/NntpProtocolHandler.jsm", + "resource:///modules/NntpProtocolInfo.jsm": "comm/mailnews/news/src/NntpProtocolInfo.jsm", + "resource:///modules/NntpService.jsm": "comm/mailnews/news/src/NntpService.jsm", + "resource:///modules/NntpUtils.jsm": "comm/mailnews/news/src/NntpUtils.jsm", + "resource:///modules/NormalizedMap.jsm": "comm/chat/modules/NormalizedMap.jsm", + "resource:///modules/OAuth2.jsm": "comm/mailnews/base/src/OAuth2.jsm", + "resource:///modules/OAuth2Module.jsm": "comm/mailnews/base/src/OAuth2Module.jsm", + "resource:///modules/OAuth2Providers.jsm": "comm/mailnews/base/src/OAuth2Providers.jsm", + "resource:///modules/OutlookProfileImporter.jsm": "comm/mailnews/import/modules/OutlookProfileImporter.jsm", + "resource:///modules/OTR.jsm": "comm/chat/modules/OTR.jsm", + "resource:///modules/OTRLib.jsm": "comm/chat/modules/OTRLib.jsm", + "resource:///modules/OTRUI.jsm": "comm/chat/modules/OTRUI.jsm", + "resource:///modules/OfflineStartup.jsm": "comm/mailnews/extensions/offline-startup/OfflineStartup.jsm", + "resource:///modules/PanelMultiView.jsm": "comm/mail/components/customizableui/PanelMultiView.jsm", + "resource:///modules/PeriodicFilterManager.jsm": "comm/mailnews/search/src/PeriodicFilterManager.jsm", + "resource:///modules/PhishingDetector.jsm": "comm/mail/modules/PhishingDetector.jsm", + "resource:///modules/Pop3Channel.jsm": "comm/mailnews/local/src/Pop3Channel.jsm", + "resource:///modules/Pop3Client.jsm": "comm/mailnews/local/src/Pop3Client.jsm", + "resource:///modules/Pop3IncomingServer.jsm": "comm/mailnews/local/src/Pop3IncomingServer.jsm", + "resource:///modules/Pop3ProtocolHandler.jsm": "comm/mailnews/local/src/Pop3ProtocolHandler.jsm", + "resource:///modules/Pop3ProtocolInfo.jsm": "comm/mailnews/local/src/Pop3ProtocolInfo.jsm", + "resource:///modules/Pop3Service.jsm": "comm/mailnews/local/src/Pop3Service.jsm", + "resource:///modules/ProfileExporter.jsm": "comm/mailnews/export/modules/ProfileExporter.jsm", + "resource:///modules/PromptCollection.jsm": "comm/mail/components/prompts/PromptCollection.jsm", + "resource:///modules/QueryStringToExpression.jsm": "comm/mailnews/addrbook/modules/QueryStringToExpression.jsm", + "resource:///modules/QuickFilterManager.jsm": "comm/mail/modules/QuickFilterManager.jsm", + "resource:///modules/SMTPProtocolHandler.jsm": "comm/mailnews/compose/src/SMTPProtocolHandler.jsm", + "resource:///modules/SQLiteDirectory.jsm": "comm/mailnews/addrbook/modules/SQLiteDirectory.jsm", + "resource:///modules/Sanitizer.jsm": "comm/mail/components/accountcreation/Sanitizer.jsm", + "resource:///modules/SeamonkeyImport.jsm": "comm/mailnews/import/src/SeamonkeyImport.jsm", + "resource:///modules/SearchIntegration.jsm": "comm/mail/components/search/SearchIntegration.jsm", + "resource:///modules/SearchSpec.jsm": "comm/mail/modules/SearchSpec.jsm", + "resource:///modules/SearchWidgetTracker.jsm": "comm/mail/components/customizableui/SearchWidgetTracker.jsm", + "resource:///modules/SelectionWidgetController.jsm": "comm/mail/modules/SelectionWidgetController.jsm", + "resource:///modules/SessionStore.jsm": "comm/mail/modules/SessionStore.jsm", + "resource:///modules/SessionStoreManager.jsm": "comm/mail/modules/SessionStoreManager.jsm", + "resource:///modules/ShortcutsManager.jsm": "comm/mail/modules/ShortcutsManager.jsm", + "resource:///modules/SmtpClient.jsm": "comm/mailnews/compose/src/SmtpClient.jsm", + "resource:///modules/SmtpServer.jsm": "comm/mailnews/compose/src/SmtpServer.jsm", + "resource:///modules/SmtpService.jsm": "comm/mailnews/compose/src/SmtpService.jsm", + "resource:///modules/StartupRecorder.jsm": "comm/mail/components/StartupRecorder.jsm", + "resource:///modules/SummaryFrameManager.jsm": "comm/mail/modules/SummaryFrameManager.jsm", + "resource:///modules/TBDistCustomizer.jsm": "comm/mail/modules/TBDistCustomizer.jsm", + "resource:///modules/TabStateFlusher.jsm": "comm/mail/modules/TabStateFlusher.jsm", + "resource:///modules/TagUtils.jsm": "comm/mail/modules/TagUtils.jsm", + "resource:///modules/TemplateUtils.jsm": "comm/mailnews/base/src/TemplateUtils.jsm", + "resource:///modules/ThemeVariableMap.jsm": "comm/mail/themes/ThemeVariableMap.jsm", + "resource:///modules/ThunderbirdImport.jsm": "comm/mailnews/import/src/ThunderbirdImport.jsm", + "resource:///modules/ThunderbirdProfileImporter.jsm": "comm/mailnews/import/modules/ThunderbirdProfileImporter.jsm", + "resource:///modules/ThunderbirdProfileMigrator.jsm": "comm/mail/components/migration/src/ThunderbirdProfileMigrator.jsm", + "resource:///modules/ToLocaleFormat.jsm": "comm/chat/modules/ToLocaleFormat.jsm", + "resource:///modules/UIDensity.jsm": "comm/mail/modules/UIDensity.jsm", + "resource:///modules/UIFontSize.jsm": "comm/mail/modules/UIFontSize.jsm", + "resource:///modules/VCardUtils.jsm": "comm/mailnews/addrbook/modules/VCardUtils.jsm", + "resource:///modules/VirtualFolderWrapper.jsm": "comm/mailnews/base/src/VirtualFolderWrapper.jsm", + "resource:///modules/WinUnreadBadge.jsm": "comm/mailnews/base/src/WinUnreadBadge.jsm", + "resource:///modules/Windows8WindowFrameColor.jsm": "comm/mail/themes/Windows8WindowFrameColor.jsm", + "resource:///modules/WindowsJumpLists.jsm": "comm/mail/modules/WindowsJumpLists.jsm", + "resource:///modules/accountcreation/AccountConfig.jsm": "comm/mail/components/accountcreation/AccountConfig.jsm", + "resource:///modules/accountcreation/AccountCreationUtils.jsm": "comm/mail/components/accountcreation/AccountCreationUtils.jsm", + "resource:///modules/accountcreation/ConfigVerifier.jsm": "comm/mail/components/accountcreation/ConfigVerifier.jsm", + "resource:///modules/accountcreation/CreateInBackend.jsm": "comm/mail/components/accountcreation/CreateInBackend.jsm", + "resource:///modules/accountcreation/ExchangeAutoDiscover.jsm": "comm/mail/components/accountcreation/ExchangeAutoDiscover.jsm", + "resource:///modules/accountcreation/FetchConfig.jsm": "comm/mail/components/accountcreation/FetchConfig.jsm", + "resource:///modules/accountcreation/FetchHTTP.jsm": "comm/mail/components/accountcreation/FetchHTTP.jsm", + "resource:///modules/accountcreation/GuessConfig.jsm": "comm/mail/components/accountcreation/GuessConfig.jsm", + "resource:///modules/accountcreation/readFromXML.jsm": "comm/mail/components/accountcreation/readFromXML.jsm", + "resource:///modules/activity/activityModules.jsm": "comm/mail/components/activity/modules/activityModules.jsm", + "resource:///modules/activity/alertHook.jsm": "comm/mail/components/activity/modules/alertHook.jsm", + "resource:///modules/activity/autosync.jsm": "comm/mail/components/activity/modules/autosync.jsm", + "resource:///modules/activity/glodaIndexer.jsm": "comm/mail/components/activity/modules/glodaIndexer.jsm", + "resource:///modules/activity/moveCopy.jsm": "comm/mail/components/activity/modules/moveCopy.jsm", + "resource:///modules/activity/pop3Download.jsm": "comm/mail/components/activity/modules/pop3Download.jsm", + "resource:///modules/activity/sendLater.jsm": "comm/mail/components/activity/modules/sendLater.jsm", + "resource:///modules/caldav/CalDavRequest.jsm": "comm/calendar/providers/caldav/modules/CalDavRequest.jsm", + "resource:///modules/caldav/CalDavRequestHandlers.jsm": "comm/calendar/providers/caldav/modules/CalDavRequestHandlers.jsm", + "resource:///modules/caldav/CalDavSession.jsm": "comm/calendar/providers/caldav/modules/CalDavSession.jsm", + "resource:///modules/caldav/CalDavUtils.jsm": "comm/calendar/providers/caldav/modules/CalDavUtils.jsm", + "resource:///modules/calendar/CalStorageCachedItemModel.jsm": "comm/calendar/providers/storage/CalStorageCachedItemModel.jsm", + "resource:///modules/calendar/CalStorageDatabase.jsm": "comm/calendar/providers/storage/CalStorageDatabase.jsm", + "resource:///modules/calendar/CalStorageItemModel.jsm": "comm/calendar/providers/storage/CalStorageItemModel.jsm", + "resource:///modules/calendar/CalStorageMetaDataModel.jsm": "comm/calendar/providers/storage/CalStorageMetaDataModel.jsm", + "resource:///modules/calendar/CalStorageModelBase.jsm": "comm/calendar/providers/storage/CalStorageModelBase.jsm", + "resource:///modules/calendar/CalStorageModelFactory.jsm": "comm/calendar/providers/storage/CalStorageModelFactory.jsm", + "resource:///modules/calendar/CalStorageOfflineModel.jsm": "comm/calendar/providers/storage/CalStorageOfflineModel.jsm", + "resource:///modules/calendar/CalStorageStatements.jsm": "comm/calendar/providers/storage/CalStorageStatements.jsm", + "resource:///modules/calendar/Ical.jsm": "comm/calendar/base/modules/Ical.jsm", + "resource:///modules/calendar/calCalendarDeactivator.jsm": "comm/calendar/base/modules/calCalendarDeactivator.jsm", + "resource:///modules/calendar/calExtract.jsm": "comm/calendar/base/modules/calExtract.jsm", + "resource:///modules/calendar/calHashedArray.jsm": "comm/calendar/base/modules/calHashedArray.jsm", + "resource:///modules/calendar/calRecurrenceUtils.jsm": "comm/calendar/base/modules/calRecurrenceUtils.jsm", + "resource:///modules/calendar/calStorageHelpers.jsm": "comm/calendar/providers/storage/calStorageHelpers.jsm", + "resource:///modules/calendar/calStorageUpgrade.jsm": "comm/calendar/providers/storage/calStorageUpgrade.jsm", + "resource:///modules/calendar/calUtils.jsm": "comm/calendar/base/modules/calUtils.jsm", + "resource:///modules/calendar/extract/CalExtractParser.jsm": "comm/calendar/extract/CalExtractParser.jsm", + "resource:///modules/calendar/extract/CalExtractParserService.jsm": "comm/calendar/extract/CalExtractParserService.jsm", + "resource:///modules/calendar/utils/calACLUtils.jsm": "comm/calendar/base/modules/utils/calACLUtils.jsm", + "resource:///modules/calendar/utils/calAlarmUtils.jsm": "comm/calendar/base/modules/utils/calAlarmUtils.jsm", + "resource:///modules/calendar/utils/calAuthUtils.jsm": "comm/calendar/base/modules/utils/calAuthUtils.jsm", + "resource:///modules/calendar/utils/calCategoryUtils.jsm": "comm/calendar/base/modules/utils/calCategoryUtils.jsm", + "resource:///modules/calendar/utils/calDataUtils.jsm": "comm/calendar/base/modules/utils/calDataUtils.jsm", + "resource:///modules/calendar/utils/calDateTimeFormatter.jsm": "comm/calendar/base/modules/utils/calDateTimeFormatter.jsm", + "resource:///modules/calendar/utils/calDateTimeUtils.jsm": "comm/calendar/base/modules/utils/calDateTimeUtils.jsm", + "resource:///modules/calendar/utils/calEmailUtils.jsm": "comm/calendar/base/modules/utils/calEmailUtils.jsm", + "resource:///modules/calendar/utils/calInvitationUtils.jsm": "comm/calendar/base/modules/utils/calInvitationUtils.jsm", + "resource:///modules/calendar/utils/calItemUtils.jsm": "comm/calendar/base/modules/utils/calItemUtils.jsm", + "resource:///modules/calendar/utils/calIteratorUtils.jsm": "comm/calendar/base/modules/utils/calIteratorUtils.jsm", + "resource:///modules/calendar/utils/calItipUtils.jsm": "comm/calendar/base/modules/utils/calItipUtils.jsm", + "resource:///modules/calendar/utils/calL10NUtils.jsm": "comm/calendar/base/modules/utils/calL10NUtils.jsm", + "resource:///modules/calendar/utils/calPrintUtils.jsm": "comm/calendar/base/modules/utils/calPrintUtils.jsm", + "resource:///modules/calendar/utils/calProviderDetectionUtils.jsm": "comm/calendar/base/modules/utils/calProviderDetectionUtils.jsm", + "resource:///modules/calendar/utils/calProviderUtils.jsm": "comm/calendar/base/modules/utils/calProviderUtils.jsm", + "resource:///modules/calendar/utils/calUnifinderUtils.jsm": "comm/calendar/base/modules/utils/calUnifinderUtils.jsm", + "resource:///modules/calendar/utils/calViewUtils.jsm": "comm/calendar/base/modules/utils/calViewUtils.jsm", + "resource:///modules/calendar/utils/calWindowUtils.jsm": "comm/calendar/base/modules/utils/calWindowUtils.jsm", + "resource:///modules/calendar/utils/calXMLUtils.jsm": "comm/calendar/base/modules/utils/calXMLUtils.jsm", + "resource:///modules/chatHandler.jsm": "comm/mail/components/im/modules/chatHandler.jsm", + "resource:///modules/chatIcons.jsm": "comm/mail/components/im/modules/chatIcons.jsm", + "resource:///modules/chatNotifications.jsm": "comm/mail/components/im/modules/chatNotifications.jsm", + "resource:///modules/cloudFileAccounts.jsm": "comm/mail/components/cloudfile/cloudFileAccounts.jsm", + "resource:///modules/devtools-loader.jsm": "comm/mail/components/devtools/devtools-loader.jsm", + "resource:///modules/extraMimeParsers.jsm": "comm/mailnews/mime/src/extraMimeParsers.jsm", + "resource:///modules/facebook.jsm": "comm/chat/protocols/facebook/facebook.jsm", + "resource:///modules/gloda/Collection.jsm": "comm/mailnews/db/gloda/modules/Collection.jsm", + "resource:///modules/gloda/Everybody.jsm": "comm/mailnews/db/gloda/modules/Everybody.jsm", + "resource:///modules/gloda/Facet.jsm": "comm/mailnews/db/gloda/modules/Facet.jsm", + "resource:///modules/gloda/Gloda.jsm": "comm/mailnews/db/gloda/modules/Gloda.jsm", + "resource:///modules/gloda/GlodaConstants.jsm": "comm/mailnews/db/gloda/modules/GlodaConstants.jsm", + "resource:///modules/gloda/GlodaContent.jsm": "comm/mailnews/db/gloda/modules/GlodaContent.jsm", + "resource:///modules/gloda/GlodaDataModel.jsm": "comm/mailnews/db/gloda/modules/GlodaDataModel.jsm", + "resource:///modules/gloda/GlodaDatabind.jsm": "comm/mailnews/db/gloda/modules/GlodaDatabind.jsm", + "resource:///modules/gloda/GlodaDatastore.jsm": "comm/mailnews/db/gloda/modules/GlodaDatastore.jsm", + "resource:///modules/gloda/GlodaExplicitAttr.jsm": "comm/mailnews/db/gloda/modules/GlodaExplicitAttr.jsm", + "resource:///modules/gloda/GlodaFundAttr.jsm": "comm/mailnews/db/gloda/modules/GlodaFundAttr.jsm", + "resource:///modules/gloda/GlodaIndexer.jsm": "comm/mailnews/db/gloda/modules/GlodaIndexer.jsm", + "resource:///modules/gloda/GlodaMsgIndexer.jsm": "comm/mailnews/db/gloda/modules/GlodaMsgIndexer.jsm", + "resource:///modules/gloda/GlodaMsgSearcher.jsm": "comm/mailnews/db/gloda/modules/GlodaMsgSearcher.jsm", + "resource:///modules/gloda/GlodaPublic.jsm": "comm/mailnews/db/gloda/modules/GlodaPublic.jsm", + "resource:///modules/gloda/GlodaQueryClassFactory.jsm": "comm/mailnews/db/gloda/modules/GlodaQueryClassFactory.jsm", + "resource:///modules/gloda/GlodaSyntheticView.jsm": "comm/mailnews/db/gloda/modules/GlodaSyntheticView.jsm", + "resource:///modules/gloda/GlodaUtils.jsm": "comm/mailnews/db/gloda/modules/GlodaUtils.jsm", + "resource:///modules/gloda/IndexMsg.jsm": "comm/mailnews/db/gloda/modules/IndexMsg.jsm", + "resource:///modules/gloda/MimeMessage.jsm": "comm/mailnews/db/gloda/modules/MimeMessage.jsm", + "resource:///modules/gloda/NounFreetag.jsm": "comm/mailnews/db/gloda/modules/NounFreetag.jsm", + "resource:///modules/gloda/NounMimetype.jsm": "comm/mailnews/db/gloda/modules/NounMimetype.jsm", + "resource:///modules/gloda/NounTag.jsm": "comm/mailnews/db/gloda/modules/NounTag.jsm", + "resource:///modules/gloda/SuffixTree.jsm": "comm/mailnews/db/gloda/modules/SuffixTree.jsm", + "resource:///modules/gtalk.jsm": "comm/chat/protocols/gtalk/gtalk.jsm", + "resource:///modules/hostnameUtils.jsm": "comm/mailnews/base/src/hostnameUtils.jsm", + "resource:///modules/imAccounts.jsm": "comm/chat/components/src/imAccounts.jsm", + "resource:///modules/imCommands.jsm": "comm/chat/components/src/imCommands.jsm", + "resource:///modules/imContacts.jsm": "comm/chat/components/src/imContacts.jsm", + "resource:///modules/imContentSink.jsm": "comm/chat/modules/imContentSink.jsm", + "resource:///modules/imConversations.jsm": "comm/chat/components/src/imConversations.jsm", + "resource:///modules/imCore.jsm": "comm/chat/components/src/imCore.jsm", + "resource:///modules/imSmileys.jsm": "comm/chat/modules/imSmileys.jsm", + "resource:///modules/imStatusUtils.jsm": "comm/chat/modules/imStatusUtils.jsm", + "resource:///modules/imTextboxUtils.jsm": "comm/chat/modules/imTextboxUtils.jsm", + "resource:///modules/imThemes.jsm": "comm/chat/modules/imThemes.jsm", + "resource:///modules/imXPCOMUtils.jsm": "comm/chat/modules/imXPCOMUtils.jsm", + "resource:///modules/index_im.jsm": "comm/mail/components/im/modules/index_im.jsm", + "resource:///modules/irc.jsm": "comm/chat/protocols/irc/irc.jsm", + "resource:///modules/ircAccount.jsm": "comm/chat/protocols/irc/ircAccount.jsm", + "resource:///modules/ircBase.jsm": "comm/chat/protocols/irc/ircBase.jsm", + "resource:///modules/ircCAP.jsm": "comm/chat/protocols/irc/ircCAP.jsm", + "resource:///modules/ircCTCP.jsm": "comm/chat/protocols/irc/ircCTCP.jsm", + "resource:///modules/ircCommands.jsm": "comm/chat/protocols/irc/ircCommands.jsm", + "resource:///modules/ircDCC.jsm": "comm/chat/protocols/irc/ircDCC.jsm", + "resource:///modules/ircEchoMessage.jsm": "comm/chat/protocols/irc/ircEchoMessage.jsm", + "resource:///modules/ircHandlerPriorities.jsm": "comm/chat/protocols/irc/ircHandlerPriorities.jsm", + "resource:///modules/ircHandlers.jsm": "comm/chat/protocols/irc/ircHandlers.jsm", + "resource:///modules/ircISUPPORT.jsm": "comm/chat/protocols/irc/ircISUPPORT.jsm", + "resource:///modules/ircMultiPrefix.jsm": "comm/chat/protocols/irc/ircMultiPrefix.jsm", + "resource:///modules/ircNonStandard.jsm": "comm/chat/protocols/irc/ircNonStandard.jsm", + "resource:///modules/ircSASL.jsm": "comm/chat/protocols/irc/ircSASL.jsm", + "resource:///modules/ircServerTime.jsm": "comm/chat/protocols/irc/ircServerTime.jsm", + "resource:///modules/ircServices.jsm": "comm/chat/protocols/irc/ircServices.jsm", + "resource:///modules/ircUtils.jsm": "comm/chat/protocols/irc/ircUtils.jsm", + "resource:///modules/ircWatchMonitor.jsm": "comm/chat/protocols/irc/ircWatchMonitor.jsm", + "resource:///modules/jsProtoHelper.jsm": "comm/chat/modules/jsProtoHelper.jsm", + "resource:///modules/jsTestProtocol.jsm": "comm/chat/protocols/jsTest/jsTestProtocol.jsm", + "resource:///modules/jsaccount/JSAccountUtils.jsm": "comm/mailnews/jsaccount/modules/JSAccountUtils.jsm", + "resource:///modules/jsaccount/JaBaseUrl.jsm": "comm/mailnews/jsaccount/modules/JaBaseUrl.jsm", + "resource:///modules/jsaccount/TestJaMsgProtocolInfoComponent.jsm": "comm/mailnews/jsaccount/test/unit/resources/TestJaMsgProtocolInfoComponent.jsm", + "resource:///modules/jsmime.jsm": "comm/mailnews/mime/src/jsmime.jsm", + "resource:///modules/logger.jsm": "comm/chat/components/src/logger.jsm", + "resource:///modules/mailstoreConverter.jsm": "comm/mailnews/base/src/mailstoreConverter.jsm", + "resource:///modules/matrix-sdk.jsm": "comm/chat/protocols/matrix/matrix-sdk.jsm", + "resource:///modules/matrix.jsm": "comm/chat/protocols/matrix/matrix.jsm", + "resource:///modules/matrixAccount.jsm": "comm/chat/protocols/matrix/matrixAccount.jsm", + "resource:///modules/matrixCommands.jsm": "comm/chat/protocols/matrix/matrixCommands.jsm", + "resource:///modules/matrixMessageContent.jsm": "comm/chat/protocols/matrix/matrixMessageContent.jsm", + "resource:///modules/matrixPowerLevels.jsm": "comm/chat/protocols/matrix/matrixPowerLevels.jsm", + "resource:///modules/matrixTextForEvent.jsm": "comm/chat/protocols/matrix/matrixTextForEvent.jsm", + "resource:///modules/mimeParser.jsm": "comm/mailnews/mime/src/mimeParser.jsm", + "resource:///modules/odnoklassniki.jsm": "comm/chat/protocols/odnoklassniki/odnoklassniki.jsm", + "resource:///modules/sax.jsm": "comm/chat/protocols/xmpp/sax.jsm", + "resource:///modules/socket.jsm": "comm/chat/modules/socket.jsm", + "resource:///modules/twitter.jsm": "comm/chat/protocols/twitter/twitter.jsm", + "resource:///modules/xmpp-authmechs.jsm": "comm/chat/protocols/xmpp/xmpp-authmechs.jsm", + "resource:///modules/xmpp-base.jsm": "comm/chat/protocols/xmpp/xmpp-base.jsm", + "resource:///modules/xmpp-commands.jsm": "comm/chat/protocols/xmpp/xmpp-commands.jsm", + "resource:///modules/xmpp-session.jsm": "comm/chat/protocols/xmpp/xmpp-session.jsm", + "resource:///modules/xmpp-xml.jsm": "comm/chat/protocols/xmpp/xmpp-xml.jsm", + "resource:///modules/xmpp.jsm": "comm/chat/protocols/xmpp/xmpp.jsm", + "resource:///modules/yahoo.jsm": "comm/chat/protocols/yahoo/yahoo.jsm", + "resource://testing-common/CardDAVServer.jsm": "comm/mailnews/addrbook/test/CardDAVServer.jsm", + "resource://testing-common/LDAPServer.jsm": "comm/mailnews/addrbook/test/LDAPServer.jsm", + "resource://testing-common/PromiseTestUtils.jsm": "comm/mailnews/test/resources/PromiseTestUtils.jsm", + "resource://testing-common/TestProtocol.jsm": "comm/mail/components/im/test/TestProtocol.jsm", + "resource://testing-common/calendar/CalDAVServer.jsm": "comm/calendar/test/CalDAVServer.jsm", + "resource://testing-common/calendar/CalendarTestUtils.jsm": "comm/calendar/test/CalendarTestUtils.jsm", + "resource://testing-common/calendar/CalendarUtils.jsm": "comm/calendar/test/CalendarUtils.jsm", + "resource://testing-common/calendar/ICSServer.jsm": "comm/calendar/test/ICSServer.jsm", + "resource://testing-common/calendar/ItemEditingHelpers.jsm": "comm/calendar/test/ItemEditingHelpers.jsm", + "resource://testing-common/gloda/GlodaQueryHelper.jsm": "comm/mailnews/db/gloda/test/unit/resources/GlodaQueryHelper.jsm", + "resource://testing-common/gloda/GlodaTestHelper.jsm": "comm/mailnews/db/gloda/test/unit/resources/GlodaTestHelper.jsm", + "resource://testing-common/gloda/GlodaTestHelperFunctions.jsm": "comm/mailnews/db/gloda/test/unit/resources/GlodaTestHelperFunctions.jsm", + "resource://testing-common/mailnews/Auth.jsm": "comm/mailnews/test/fakeserver/Auth.jsm", + "resource://testing-common/mailnews/Binaryd.jsm": "comm/mailnews/test/fakeserver/Binaryd.jsm", + "resource://testing-common/mailnews/IMAPpump.jsm": "comm/mailnews/test/resources/IMAPpump.jsm", + "resource://testing-common/mailnews/Imapd.jsm": "comm/mailnews/test/fakeserver/Imapd.jsm", + "resource://testing-common/mailnews/Ldapd.jsm": "comm/mailnews/test/fakeserver/Ldapd.jsm", + "resource://testing-common/mailnews/LocalAccountUtils.jsm": "comm/mailnews/test/resources/LocalAccountUtils.jsm", + "resource://testing-common/mailnews/MailTestUtils.jsm": "comm/mailnews/test/resources/MailTestUtils.jsm", + "resource://testing-common/mailnews/Maild.jsm": "comm/mailnews/test/fakeserver/Maild.jsm", + "resource://testing-common/mailnews/MessageGenerator.jsm": "comm/mailnews/test/resources/MessageGenerator.jsm", + "resource://testing-common/mailnews/MessageInjection.jsm": "comm/mailnews/test/resources/MessageInjection.jsm", + "resource://testing-common/mailnews/NetworkTestUtils.jsm": "comm/mailnews/test/resources/NetworkTestUtils.jsm", + "resource://testing-common/mailnews/Nntpd.jsm": "comm/mailnews/test/fakeserver/Nntpd.jsm", + "resource://testing-common/mailnews/Pop3d.jsm": "comm/mailnews/test/fakeserver/Pop3d.jsm", + "resource://testing-common/mailnews/Smtpd.jsm": "comm/mailnews/test/fakeserver/Smtpd.jsm", + "resource://testing-common/mailnews/smimeUtils.jsm": "comm/mailnews/test/resources/smimeUtils.jsm", + "resource://testing-common/mailnews/testJaBaseIncomingServer.jsm": "comm/mailnews/jsaccount/test/unit/resources/testJaBaseIncomingServer.jsm", + "resource://testing-common/mailnews/testJaBaseMsgFolder.jsm": "comm/mailnews/jsaccount/test/unit/resources/testJaBaseMsgFolder.jsm", + "resource://testing-common/mozmill/AccountManagerHelpers.jsm": "comm/mail/test/browser/shared-modules/AccountManagerHelpers.jsm", + "resource://testing-common/mozmill/AddressBookHelpers.jsm": "comm/mail/test/browser/shared-modules/AddressBookHelpers.jsm", + "resource://testing-common/mozmill/AttachmentHelpers.jsm": "comm/mail/test/browser/shared-modules/AttachmentHelpers.jsm", + "resource://testing-common/mozmill/CloudfileHelpers.jsm": "comm/mail/test/browser/shared-modules/CloudfileHelpers.jsm", + "resource://testing-common/mozmill/ComposeHelpers.jsm": "comm/mail/test/browser/shared-modules/ComposeHelpers.jsm", + "resource://testing-common/mozmill/ContentTabHelpers.jsm": "comm/mail/test/browser/shared-modules/ContentTabHelpers.jsm", + "resource://testing-common/mozmill/CustomizationHelpers.jsm": "comm/mail/test/browser/shared-modules/CustomizationHelpers.jsm", + "resource://testing-common/mozmill/DOMHelpers.jsm": "comm/mail/test/browser/shared-modules/DOMHelpers.jsm", + "resource://testing-common/mozmill/EventUtils.jsm": "comm/mail/test/browser/shared-modules/EventUtils.jsm", + "resource://testing-common/mozmill/FolderDisplayHelpers.jsm": "comm/mail/test/browser/shared-modules/FolderDisplayHelpers.jsm", + "resource://testing-common/mozmill/JunkHelpers.jsm": "comm/mail/test/browser/shared-modules/JunkHelpers.jsm", + "resource://testing-common/mozmill/KeyboardHelpers.jsm": "comm/mail/test/browser/shared-modules/KeyboardHelpers.jsm", + "resource://testing-common/mozmill/MockObjectHelpers.jsm": "comm/mail/test/browser/shared-modules/MockObjectHelpers.jsm", + "resource://testing-common/mozmill/MouseEventHelpers.jsm": "comm/mail/test/browser/shared-modules/MouseEventHelpers.jsm", + "resource://testing-common/mozmill/NNTPHelpers.jsm": "comm/mail/test/browser/shared-modules/NNTPHelpers.jsm", + "resource://testing-common/mozmill/NewMailAccountHelpers.jsm": "comm/mail/test/browser/shared-modules/NewMailAccountHelpers.jsm", + "resource://testing-common/mozmill/NotificationBoxHelpers.jsm": "comm/mail/test/browser/shared-modules/NotificationBoxHelpers.jsm", + "resource://testing-common/mozmill/OpenPGPTestUtils.jsm": "comm/mail/test/browser/shared-modules/OpenPGPTestUtils.jsm", + "resource://testing-common/mozmill/PrefTabHelpers.jsm": "comm/mail/test/browser/shared-modules/PrefTabHelpers.jsm", + "resource://testing-common/mozmill/PromptHelpers.jsm": "comm/mail/test/browser/shared-modules/PromptHelpers.jsm", + "resource://testing-common/mozmill/QuickFilterBarHelpers.jsm": "comm/mail/test/browser/shared-modules/QuickFilterBarHelpers.jsm", + "resource://testing-common/mozmill/SearchWindowHelpers.jsm": "comm/mail/test/browser/shared-modules/SearchWindowHelpers.jsm", + "resource://testing-common/mozmill/SubscribeWindowHelpers.jsm": "comm/mail/test/browser/shared-modules/SubscribeWindowHelpers.jsm", + "resource://testing-common/mozmill/WindowHelpers.jsm": "comm/mail/test/browser/shared-modules/WindowHelpers.jsm", + "resource://testing-common/mozmill/controller.jsm": "comm/mail/test/browser/shared-modules/controller.jsm", + "resource://testing-common/mozmill/utils.jsm": "comm/mail/test/browser/shared-modules/utils.jsm" +} diff --git a/comm/tools/lint/Generated.txt b/comm/tools/lint/Generated.txt new file mode 100644 index 0000000000..c3d6090373 --- /dev/null +++ b/comm/tools/lint/Generated.txt @@ -0,0 +1,3 @@ +comm/mailnews/extensions/newsblog/test/unit/resources/feeds-missing-timestamp/feeds.json +comm/mailnews/extensions/newsblog/test/unit/resources/feeds-simple/feeditems.json +comm/mailnews/extensions/newsblog/test/unit/resources/feeds-simple/feeds.json diff --git a/comm/tools/lint/ThirdPartyPaths.txt b/comm/tools/lint/ThirdPartyPaths.txt new file mode 100644 index 0000000000..4b2922e585 --- /dev/null +++ b/comm/tools/lint/ThirdPartyPaths.txt @@ -0,0 +1,18 @@ +comm/calendar/base/modules/Ical.jsm +comm/chat/protocols/matrix/lib +comm/chat/protocols/xmpp/lib +comm/mail/base/content/protovis-r2.6-modded.js +comm/mail/components/compose/texzilla/TeXZilla.js +comm/mail/components/storybook/storybook-static +comm/mailnews/mapi/include +comm/third_party/asn1js +comm/third_party/botan +comm/third_party/bzip2 +comm/third_party/json-c +comm/third_party/libgcrypt +comm/third_party/libgpg-error +comm/third_party/libotr +comm/third_party/niwcompat +comm/third_party/python +comm/third_party/rnp +comm/third_party/zlib diff --git a/comm/tools/lint/black.yml b/comm/tools/lint/black.yml new file mode 100644 index 0000000000..a3850bc7be --- /dev/null +++ b/comm/tools/lint/black.yml @@ -0,0 +1,16 @@ +--- +black: + description: Reformat python + include: + - comm/ + extensions: + - build + - configure + - mozbuild + - py + support-files: + - 'tools/lint/python/**' + type: external + payload: commlint:lint_wrapper + wraps: commlint:black_lint + setup: python.black:setup diff --git a/comm/tools/lint/codespell.yml b/comm/tools/lint/codespell.yml new file mode 100644 index 0000000000..08b68aac81 --- /dev/null +++ b/comm/tools/lint/codespell.yml @@ -0,0 +1,47 @@ +--- +codespell: + description: Check code for common misspellings + include: + - comm/calendar/locales/en-US/ + - comm/chat/locales/en-US/ + - comm/mail/branding/ + - comm/mail/components/telemetry/ + - comm/mail/locales/en-US/ + - comm/mailnews/extensions/fts3/ + - comm/python/ + - comm/taskcluster/docs/ + - comm/third_party/ + - comm/README.md + exclude: + # Timezones have oddly spelled words that tend to confuse codespell + - comm/calendar/locales/en-US/chrome/calendar/timezones.properties + - comm/mailnews/extensions/fts3/fts3_porter.c + # List of extensions coming from: + # tools/lint/{flake8,eslint}.yml + # tools/mach_commands.py (clang-format) + # + documentation + # + localization files + extensions: + - js + - jsm + - jxs + - mjs + - xml + - html + - xhtml + - cpp + - c + - h + - configure + - py + - properties + - rst + - md + - ftl + support-files: + - 'tools/lint/spell/**' + - 'comm/tools/lint/spell/**' + type: external + setup: spell:setup + payload: commlint:lint_wrapper + wraps: spell:lint diff --git a/comm/tools/lint/commlint/__init__.py b/comm/tools/lint/commlint/__init__.py new file mode 100644 index 0000000000..19d887e109 --- /dev/null +++ b/comm/tools/lint/commlint/__init__.py @@ -0,0 +1,111 @@ +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at http://mozilla.org/MPL/2.0/. + +import os +from contextlib import contextmanager +from pathlib import Path + +from mozlint.pathutils import expand_exclusions +from mozlint.types import supported_types +from mozpack import path as mozpath + +COMM_EXCLUSION_FILES = [ + os.path.join("comm", "tools", "lint", "ThirdPartyPaths.txt"), + os.path.join("comm", "tools", "lint", "Generated.txt"), +] + +TASKCLUSTER_EXCLUDE_PATHS = (os.path.join("comm", "suite"),) + + +@contextmanager +def pushd(dest_path: Path): + """ + Sets the cwd within the context + :param Path dest_path: The path to the cwd + """ + origin = Path().absolute() + try: + os.chdir(dest_path) + yield + finally: + os.chdir(origin) + + +def _apply_global_excludes(root, config): + exclude = config.get("exclude", []) + + for path in COMM_EXCLUSION_FILES: + with open(os.path.join(root, path), "r") as fh: + exclude.extend([mozpath.join(root, f.strip()) for f in fh.readlines()]) + + if os.environ.get("MOZLINT_NO_SUITE", None): + # Ignore Seamonkey-only paths when run from Taskcluster + suite_excludes = [mozpath.join(root, path) for path in TASKCLUSTER_EXCLUDE_PATHS] + exclude.extend(suite_excludes) + + config["exclude"] = exclude + + +# This makes support file paths absolute, allowing lintpref to find StaticPrefList.yaml +def _expand_support_files(root, config): + support_files = config.get("support-files", []) + absolute_support_files = [mozpath.join(root, f) for f in support_files] + config["support-files"] = absolute_support_files + + +def eslint_wrapper(paths, config, **lintargs): + comm_root = Path(lintargs["root"]) / "comm" + with pushd(comm_root): + rv = lint_wrapper(paths, config, **lintargs) + + return rv + + +def stylelint_wrapper(paths, config, **lintargs): + comm_root = Path(lintargs["root"]) / "comm" + + ignore_file = str(comm_root / ".stylelintignore") + lintargs.setdefault("extra_args", []) + lintargs["extra_args"].extend(["--ignore-path", ignore_file]) + + with pushd(comm_root): + rv = lint_wrapper(paths, config, **lintargs) + + return rv + + +def black_lint(paths, config, fix=None, **lintargs): + from python.black import run_black + + files = list(expand_exclusions(paths, config, lintargs["root"])) + + # prepend "--line-length 99" to files, it will be processed as an argument + black_args = ["-l", "99"] + files + + return run_black( + config, + black_args, + fix=fix, + log=lintargs["log"], + virtualenv_bin_path=lintargs.get("virtualenv_bin_path"), + ) + + +def lint_wrapper(paths, config, **lintargs): + _apply_global_excludes(lintargs["root"], config) + _expand_support_files(lintargs["root"], config) + + payload = supported_types[config.get("wrappedType", config["type"])] + config["payload"] = config["wraps"] + del config["wraps"] + + if config.get("wrappedType", ""): + config["type"] = config["wrappedType"] + del config["wrappedType"] + + if config.get("commroot", False): + lintargs["root"] = os.path.join(lintargs["root"], "comm") + del config["commroot"] + + return payload(paths, config, **lintargs) diff --git a/comm/tools/lint/commlint/l10n_lint.py b/comm/tools/lint/commlint/l10n_lint.py new file mode 100644 index 0000000000..ad880d5cde --- /dev/null +++ b/comm/tools/lint/commlint/l10n_lint.py @@ -0,0 +1,16 @@ +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at http://mozilla.org/MPL/2.0/. + +from python.l10n_lint import lint_strings, strings_repo_setup + +LOCALE = "comm-strings-quarantine" +STRINGS_REPO = "https://hg.mozilla.org/projects/comm-strings-quarantine" + + +def comm_strings_setup(**lint_args): + return strings_repo_setup(STRINGS_REPO, LOCALE) + + +def lint(paths, lintconfig, **lintargs): + return lint_strings(LOCALE, paths, lintconfig, **lintargs) diff --git a/comm/tools/lint/eslint.yml b/comm/tools/lint/eslint.yml new file mode 100644 index 0000000000..f7ab22e0e8 --- /dev/null +++ b/comm/tools/lint/eslint.yml @@ -0,0 +1,18 @@ +--- +eslint: + description: JavaScript linter + # ESLint infra handles its own path filtering, so just include cwd + include: ['.'] + exclude: [] + extensions: ['mjs', 'js', 'jsm', 'json', 'jsx', 'html', 'sjs', 'xhtml'] + support-files: + - 'comm/**/.eslintrc.js' + - 'comm/.eslintignore' + - 'comm/.prettierignore' + - 'tools/lint/eslint/**' + # Files that can influence global variables + - 'toolkit/modules/Services.jsm' + type: external + payload: commlint:eslint_wrapper + wraps: eslint:lint + setup: eslint:setup diff --git a/comm/tools/lint/file-perm.yml b/comm/tools/lint/file-perm.yml new file mode 100644 index 0000000000..aa20787d14 --- /dev/null +++ b/comm/tools/lint/file-perm.yml @@ -0,0 +1,55 @@ +--- +file-perm: + description: File permission check + include: + - comm/ + extensions: + - .build + - .c + - .cc + - .cpp + - .flac + - .h + - .html + - .idl + - .js + - .jsm + - .jsx + - .m + - .md + - .m4s + - .mjs + - .mm + - .mozbuild + - .mp4 + - .png + - .rs + - .rst + - .svg + - .ttf + - .wasm + - .webidl + - .xhtml + - .xml + - .xul + - .yml + support-files: + - 'tools/lint/file-perm/**' + type: external + payload: commlint:lint_wrapper + wraps: file-perm:lint + +maybe-shebang-file-perm: + description: "File permission check for files that might have `#!` header." + include: + - . + allow-shebang: true + extensions: + - .js + - .py + - .sh + support-files: + - 'tools/lint/file-perm/**' + type: external + payload: commlint:lint_wrapper + wraps: file-perm:lint diff --git a/comm/tools/lint/file-whitespace.yml b/comm/tools/lint/file-whitespace.yml new file mode 100644 index 0000000000..cd09b9c736 --- /dev/null +++ b/comm/tools/lint/file-whitespace.yml @@ -0,0 +1,27 @@ +--- +file-whitespace: + description: File content sanity check + include: + - comm/. + extensions: + - .c + - .cc + - .cpp + - .css + - .dtd + - .idl + - .ftl + - .h + - .html + - .md + - .properties + - .py + - .rs + - .rst + - .webidl + - .xhtml + support-files: + - 'tools/lint/file-whitespace/**' + type: external + payload: commlint:lint_wrapper + wraps: file-whitespace:lint diff --git a/comm/tools/lint/fluent-lint.yml b/comm/tools/lint/fluent-lint.yml new file mode 100644 index 0000000000..bb8ec8443a --- /dev/null +++ b/comm/tools/lint/fluent-lint.yml @@ -0,0 +1,18 @@ +--- +fluent-lint: + description: Linter for Fluent files + include: + - . + exclude: + - dom/l10n/tests/mochitest/document_l10n/non-system-principal/localization/test.ftl + extensions: ['ftl'] + support-files: + - 'tools/lint/fluent-lint/*.py' + - 'comm/tools/lint/fluent-lint/**' + brand-files: + - 'comm/mail/branding/thunderbird/locales/en-US/brand.ftl' + - 'toolkit/locales/en-US/toolkit/branding/brandings.ftl' + type: external + payload: commlint:lint_wrapper + wraps: fluent-lint:lint + commroot: true diff --git a/comm/tools/lint/fluent-lint/exclusions.yml b/comm/tools/lint/fluent-lint/exclusions.yml new file mode 100644 index 0000000000..9701e39086 --- /dev/null +++ b/comm/tools/lint/fluent-lint/exclusions.yml @@ -0,0 +1,82 @@ +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at http://mozilla.org/MPL/2.0/. + +# Warning: Only exclusions for identifiers (ID01) are currently allowed. +--- +# Only add exceptions to this file if the ID is generated programmatically and +# can't easily be changed to follow the naming convention. +# Only lowercase letters and hyphens should be used in Fluent IDs. +ID01: + messages: + - accounts-ID + - msg-compose-partially-encrypted-inlinePGP + - trademarkInfo + # aboutDialog.ftl - exclusions same as Firefox + - aboutDialog-title + - aboutDialog-version + - aboutDialog-version-nightly + files: + # Files listed here must not have a comm/ prefix + # policies-descriptions.ftl: These IDs are generated programmatically + # from policy names. + - mail/locales/en-US/messenger/policies/policies-descriptions.ftl + # The webext-perms-description-* IDs are generated programmatically + - mail/locales/en-US/messenger/extensionPermissions.ftl +ID02: + messages: + # comm/mail/locales/en-US/messenger/accountCentral.ftl + - read + - compose + - search + - filter + - e2e + # comm/mail/locales/en-US/messenger/otr/am-im-otr.ftl + - otr-log + # comm/mail/locales/en-US/messenger/otr/auth.ftl + - otr-auth + - auth-yes + - auth-no + - auth-how + # comm/mail/locales/en-US/messenger/otr/otr.ftl + - resent + # comm/mail/locales/en-US/messenger/preferences/passwordManager.ftl + - remove + - import + # comm/mail/locales/en-US/messenger/preferences/preferences.ftl + - ab-label + - keep-ask + files: [] +# Hard-coded brand names like Firefox or Mozilla should be used only in +# specific cases, in all other cases the corresponding terms should be used. +# Check with the localization team for advice. +CO01: + messages: + # comm/mail/branding/thunderbird/locales/en-US/brand.ftl + - trademarkInfo + # comm/mail/locales/en-US/messenger/aboutRights.ftl + - rights-intro-point-1 + - rights-intro-point-2 + # comm/mail/locales/en-US/messenger/accountcreation/accountSetup.ftl + - account-setup-looking-up-db + - account-setup-success-settings-db + - account-setup-insecure-description + # Importers keep "Thunderbird" since that refers to a profile import + # of an installed Thunderbird application on the user's machine + # aboutImport.ftl + - app-name-thunderbird + - file-profile-description + # importDialog.ftl + - thunderbird-import-name + - thunderbird-import-description + - import-from-thunderbird-zip + - import-from-thunderbird-dir + # accountCentral.ftl - Donation appeals and descriptions about the Org + # rather than the product + - about-paragraph + - about-paragraph-consider-donation + # accountProvisioner.ftl - Refers to agreements made between the Org and + # third parties + - account-provisioner-mail-account-description + - account-provisioner-domain-description + files: [] diff --git a/comm/tools/lint/l10n.yml b/comm/tools/lint/l10n.yml new file mode 100644 index 0000000000..4a01e2b127 --- /dev/null +++ b/comm/tools/lint/l10n.yml @@ -0,0 +1,41 @@ +--- +l10n: + description: Localization linter + # list of include directories of both + # comm/mail and comm/calendar l10n.tomls + # Paths that are not part of Thunderbird (editor/browser/devtools/etc) + # are included to + include: + - browser/locales/en-US/pdfviewer + - comm/calendar/locales/en-US + - comm/chat/locales/en-US + - comm/mail/branding/thunderbird/locales/en-US + - comm/mail/locales/en-US + - comm/tools/lint/l10n.yml + - devtools/client/locales/en-US + - devtools/shared/locales/en-US + - devtools/startup/locales/en-US + - dom/locales/en-US + - netwerk/locales/en-US + - security/manager/locales/en-US + - toolkit/locales/en-US + # files not supported by compare-locales, + # and also not relevant to this linter + exclude: + - comm/mail/locales/en-US/all-l10n.js + - comm/mail/extensions/openpgp/test + - comm/calendar/locales/en-US/README.txt + l10n_configs: + - comm/mail/locales/l10n.toml + - comm/calendar/locales/l10n.toml + type: external + payload: commlint:lint_wrapper + wraps: commlint.l10n_lint:lint + setup: commlint.l10n_lint:comm_strings_setup + support-files: + - 'comm/calendar/locales/l10n.toml' + - 'comm/mail/locales/l10n.toml' + - 'comm/tools/lint/l10n.yml' + - 'third_party/python/compare-locales/**' + - 'third_party/python/fluent/**' + - 'tools/lint/python/l10n_lint.py' diff --git a/comm/tools/lint/license.yml b/comm/tools/lint/license.yml new file mode 100644 index 0000000000..255d06595a --- /dev/null +++ b/comm/tools/lint/license.yml @@ -0,0 +1,51 @@ +--- +license: + description: License Check + include: + - comm/ + exclude: + # By design + - comm/build/macosx/hardenedruntime/developer.entitlements.xml + - comm/build/macosx/hardenedruntime/production.entitlements.xml + # License not super clear, Firefox excludes its branding + - comm/mail/branding/ + # Mostly empty file + - comm/mail/base/content/overrides/app-license-name.html + # Need to verify + - comm/mail/components/im/messages + # Public Domain, but do not match pre-approved strings from Mozilla + - comm/mailnews/db/mork/morkDeque.cpp + - comm/mailnews/db/mork/morkDeque.h + # No license for README files + - comm/mailnews/jsaccount/readme.html + # License file in directory + - comm/mailnews/mime/jsmime + extensions: + - .c + - .cc + - .cpp + - .css + - .dtd + - .ftl + - .h + - .html + - .idl + - .java + - .js + - .jsm + - .jsx + - .m + - .mjs + - .mm + - .properties + - .py + - .rs + - .svg + - .xhtml + - .xml + - .xul + support-files: + - 'tools/lint/license/**' + type: external + payload: commlint:lint_wrapper + wraps: license:lint diff --git a/comm/tools/lint/lintpref.yml b/comm/tools/lint/lintpref.yml new file mode 100644 index 0000000000..2e45627925 --- /dev/null +++ b/comm/tools/lint/lintpref.yml @@ -0,0 +1,20 @@ +--- +lintpref: + description: Linter for static prefs. + include: + - 'comm/calendar/base/calendar.js' + - 'comm/chat/chat-prefs.js' + - 'comm/mail/app/profile/' + - 'comm/mail/branding/' + - 'comm/mail/components/compose/composer.js' + - 'comm/mail/components/im/all-im.js' + - 'comm/mail/locales/en-US/all-l10n.js' + - 'comm/mailnews/extensions/mdn/mdn.js' + - 'comm/mailnews/mailnews.js' + exclude: [] + extensions: ['js'] + type: external + payload: commlint:lint_wrapper + wraps: libpref:checkdupes + support-files: + - 'modules/libpref/init/StaticPrefList.yaml' diff --git a/comm/tools/lint/mach_commands.py b/comm/tools/lint/mach_commands.py new file mode 100644 index 0000000000..da503b2016 --- /dev/null +++ b/comm/tools/lint/mach_commands.py @@ -0,0 +1,24 @@ +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at http://mozilla.org/MPL/2.0/. + +from mach.decorators import Command + + +def setup_argument_parser(): + from mozlint import cli + + return cli.MozlintParser() + + +@Command( + "commlint", + category="thunderbird", + description="Run linters with Thunderbird configurations.", + parser=setup_argument_parser, +) +def commlint(command_context, paths, extra_args=[], **kwargs): + kwargs["config_paths"].insert(0, "comm/tools/lint") + return command_context._mach_context.commands.dispatch( + "lint", command_context._mach_context, paths=paths, argv=extra_args, **kwargs + ) diff --git a/comm/tools/lint/mingw-capitalization.yml b/comm/tools/lint/mingw-capitalization.yml new file mode 100644 index 0000000000..e6679988ab --- /dev/null +++ b/comm/tools/lint/mingw-capitalization.yml @@ -0,0 +1,10 @@ +--- +mingw-capitalization: + description: > + "A Windows include file is not lowercase, and may break the MinGW build" + extensions: ['h', 'cpp', 'cc', 'c'] + include: ['comm/'] + type: external + level: error + payload: commlint:lint_wrapper + wraps: cpp.mingw-capitalization:lint diff --git a/comm/tools/lint/rejected-words.yml b/comm/tools/lint/rejected-words.yml new file mode 100644 index 0000000000..28d958568f --- /dev/null +++ b/comm/tools/lint/rejected-words.yml @@ -0,0 +1,32 @@ +--- +avoid-blacklist-and-whitelist: + description: "Use words like 'skip', 'select', 'allow' or 'deny' instead" + level: error + include: ['comm/'] + exclude: + - comm/tools/lint/rejected-words.yml + type: external + wrappedType: regex + payload: commlint:lint_wrapper + wraps: (black|white)[-_]?list + ignore-case: true + # same as codespell + extensions: + - c + - configure + - cpp + - ftl + - h + - html + - idl + - js + - jsm + - jxs + - md + - mjs + - properties + - py + - rst + - xhtml + - xml + - yml diff --git a/comm/tools/lint/ruff.yml b/comm/tools/lint/ruff.yml new file mode 100644 index 0000000000..1b7eb8a56b --- /dev/null +++ b/comm/tools/lint/ruff.yml @@ -0,0 +1,17 @@ +--- +ruff: + description: An extremely fast Python linter, written in Rust + include: ["."] + extensions: ["py"] + support-files: + - "comm/**/.ruff.toml" + - "comm/**/ruff.toml" + - "comm/**/pyproject.toml" + - "tools/lint/python/ruff.py" + # Rules that should result in warnings rather than errors. + warning-rules: [PLR, PLW] + commroot: true + type: external + payload: commlint:lint_wrapper + wraps: python.ruff:lint + setup: python.ruff:setup diff --git a/comm/tools/lint/shellcheck.yml b/comm/tools/lint/shellcheck.yml new file mode 100644 index 0000000000..a51796c14e --- /dev/null +++ b/comm/tools/lint/shellcheck.yml @@ -0,0 +1,14 @@ +--- +shellcheck: + description: Shell script linter + include: + - comm/ + # 1090: https://github.com/koalaman/shellcheck/wiki/SC1090 + # 'Can't follow a non-constant source' + extensions: ['sh'] + support-files: + - 'tools/lint/shell/**' + excludecodes: ['1090', '1091'] + type: external + payload: commlint:lint_wrapper + wraps: shell:lint diff --git a/comm/tools/lint/spell/exclude-list.txt b/comm/tools/lint/spell/exclude-list.txt new file mode 100644 index 0000000000..c9c6691027 --- /dev/null +++ b/comm/tools/lint/spell/exclude-list.txt @@ -0,0 +1,28 @@ +1nd +aare +acount +aNumber +aparent +cas +complies +crate +delink +dur +falsy +files' +fpr +incrementall +keyserver +keyservers +msdos +nd +Nd +optin +referer +te +thru +tring +ue +warmup +wasn +whats diff --git a/comm/tools/lint/stylelint.yml b/comm/tools/lint/stylelint.yml new file mode 100644 index 0000000000..f23297cd26 --- /dev/null +++ b/comm/tools/lint/stylelint.yml @@ -0,0 +1,17 @@ +--- +stylelint: + description: CSS linter + # Stylelint infra handles its own path filtering, so just include cwd + include: ['.'] + exclude: [] + extensions: ['css'] + support-files: + - 'package.json' + - 'comm/**/.stylelintrc.js' + - 'comm/.stylelintignore' + - 'tools/lint/stylelint/**' + type: external + stylelint-rc: comm/.stylelintrc.js + payload: commlint:stylelint_wrapper + wraps: stylelint:lint + setup: stylelint:setup diff --git a/comm/tools/lint/trojan-source.yml b/comm/tools/lint/trojan-source.yml new file mode 100644 index 0000000000..ba030bff28 --- /dev/null +++ b/comm/tools/lint/trojan-source.yml @@ -0,0 +1,17 @@ +--- +trojan-source: + description: Trojan Source attack - CVE-2021-42572 + include: + - comm/ + extensions: + - .c + - .cc + - .cpp + - .h + - .py + - .rs + support-files: + - 'tools/lint/trojan-source/**' + type: external + payload: commlint:lint_wrapper + wraps: trojan-source:lint diff --git a/comm/tools/lint/yaml.yml b/comm/tools/lint/yaml.yml new file mode 100644 index 0000000000..9451d52d3c --- /dev/null +++ b/comm/tools/lint/yaml.yml @@ -0,0 +1,12 @@ +--- +yamllint: + description: YAML linter + include: + - comm/ + extensions: ['yml', 'yaml'] + support-files: + - '**/.yamllint' + - 'tools/lint/yamllint_/**' + type: external + payload: commlint:lint_wrapper + wraps: yamllint_:lint |