import json import sys import xml.etree.ElementTree as element_tree import zipfile from pathlib import Path source_directory = Path(sys.argv[1]) archive_path = Path(sys.argv[2]) package = json.loads((source_directory / "package.json").read_text()) namespace = "http://schemas.microsoft.com/developer/vsx-schema/2011" element_tree.register_namespace("", namespace) def add_element(parent, name, attributes=None, text=None): child = element_tree.SubElement(parent, f"{{{namespace}}}{name}", attributes or {}) child.text = text return child manifest = element_tree.Element(f"{{{namespace}}}PackageManifest", {"Version": "2.0.0"}) metadata = add_element(manifest, "Metadata") add_element(metadata, "Identity", { "Language": "en-US", "Id": package["name"], "Version": package["version"], "Publisher": package["publisher"], }) add_element(metadata, "DisplayName", text=package["displayName"]) add_element(metadata, "Description", text=package["description"]) properties = add_element(metadata, "Properties") add_element(properties, "Property", { "Id": "Microsoft.VisualStudio.Code.Engine", "Value": package["engines"]["vscode"], }) add_element(properties, "Property", { "Id": "Microsoft.VisualStudio.Code.ExtensionKind", "Value": ",".join(package["extensionKind"]), }) installation = add_element(manifest, "Installation") add_element(installation, "InstallationTarget", {"Id": "Microsoft.VisualStudio.Code"}) add_element(manifest, "Dependencies") assets = add_element(manifest, "Assets") add_element(assets, "Asset", { "Type": "Microsoft.VisualStudio.Code.Manifest", "Path": "extension/package.json", "Addressable": "true", }) content_types = '' with zipfile.ZipFile(archive_path, "w", zipfile.ZIP_DEFLATED) as archive: archive.writestr("extension.vsixmanifest", element_tree.tostring(manifest, encoding="utf-8")) archive.writestr("[Content_Types].xml", content_types) for filename in ("package.json", "extension.js"): archive.write(source_directory / filename, f"extension/{filename}")