"""Reproducible official Monaco ESM -> IIFE conversion. Never edits original min/vendor files."""
import base64
import hashlib
import json
from pathlib import Path
import shutil
import subprocess
import tarfile
import urllib.request
ROOT = Path(__file__).resolve().parents[3]
WORK = ROOT / 'build/BrowserProbe/CoreBundle'
OUTPUT = ROOT / 'assets/Browser/Monaco/0.52.2/Core'
MONACO_SHA = 'c280cdcf0b0c13d1a2bf01af958d4387ed06d7f6c918401d00c4adcae1bc72b6'
ESBUILD_VERSION = '0.25.11'
ESBUILD_ARCHIVE_SHA = '9c3cede332e9bcf3bc8e3378f71e6f817d146faf6ca04be7f9b39cc8fec829bc'
ESBUILD_NATIVE_ARCHIVE_SHA = '4012ce126807f8cc154bf9ac604f77e97a08bb65af1f56d824f7a24c60bd4190'
ESBUILD_BINARY_SHA = 'bfb5d74d47fe94ef99ff7541f97f844c8979bd70c8255d796c2e74bbb3eb99f9'
def sha(data):
return hashlib.sha256(data).hexdigest()
def download(url, destination):
if not destination.exists():
destination.parent.mkdir(parents=True, exist_ok=True)
with urllib.request.urlopen(url) as response:
destination.write_bytes(response.read())
return destination.read_bytes()
def fetch_npm(name, version, prefix):
metadata_path = WORK / (prefix + '-Metadata.json')
metadata = json.loads(download('https://registry.npmjs.org/' + name.replace('/', '%2f') + '/' + version, metadata_path))
archive = WORK / (prefix + '.tgz')
data = download(metadata['dist']['tarball'], archive)
algorithm, expected = metadata['dist']['integrity'].split('-', 1)
if algorithm != 'sha512' or base64.b64encode(hashlib.sha512(data).digest()).decode() != expected:
raise ValueError('Published npm integrity failed for ' + name)
return metadata, archive, data
def extract_member(archive, member, destination):
with tarfile.open(archive, 'r:gz') as tar:
stream = tar.extractfile(member)
if stream is None:
raise ValueError('Missing ' + member)
destination.parent.mkdir(parents=True, exist_ok=True)
destination.write_bytes(stream.read())
WORK.mkdir(parents=True, exist_ok=True)
OUTPUT.mkdir(parents=True, exist_ok=True)
metadata, monaco_archive, monaco_data = fetch_npm('monaco-editor', '0.52.2', 'Monaco-0.52.2')
if sha(monaco_data) != MONACO_SHA:
raise ValueError('Pinned original Monaco archive SHA256 mismatch')
source_root = WORK / 'MonacoPackage'
with tarfile.open(monaco_archive, 'r:gz') as tar:
for member in tar.getmembers():
if member.isfile() and (member.name.startswith('package/esm/') or member.name in ('package/package.json', 'package/LICENSE', 'package/ThirdPartyNotices.txt')):
relative = Path(member.name).relative_to('package')
if '..' in relative.parts:
raise ValueError('Unsafe archive path')
destination = source_root / relative
destination.parent.mkdir(parents=True, exist_ok=True)
destination.write_bytes(tar.extractfile(member).read())
esbuild_metadata, esbuild_archive, esbuild_data = fetch_npm('esbuild', ESBUILD_VERSION, 'Esbuild-' + ESBUILD_VERSION)
binary_metadata, binary_archive, binary_data = fetch_npm('@esbuild/win32-x64', ESBUILD_VERSION, 'Esbuild-Win32-x64-' + ESBUILD_VERSION)
if sha(esbuild_data) != ESBUILD_ARCHIVE_SHA or sha(binary_data) != ESBUILD_NATIVE_ARCHIVE_SHA:
raise ValueError('Pinned esbuild archive SHA256 mismatch')
binary = WORK / ('esbuild-' + ESBUILD_VERSION + '.exe')
extract_member(binary_archive, 'package/esbuild.exe', binary)
if sha(binary.read_bytes()) != ESBUILD_BINARY_SHA:
raise ValueError('Pinned esbuild executable SHA256 mismatch')
extract_member(esbuild_archive, 'package/LICENSE.md', OUTPUT / 'EsbuildLicense.txt')
for name in ('LICENSE', 'ThirdPartyNotices.txt'):
shutil.copyfile(source_root / name, OUTPUT / name)
entry = Path(__file__).with_name('Entry.js')
command = [str(binary), str(entry), '--bundle', '--format=iife', '--platform=browser', '--target=es2020', '--minify',
'--legal-comments=external', '--loader:.ttf=file', '--entry-names=EditorCore', '--asset-names=[name]-[hash]',
'--outdir=' + str(OUTPUT), '--metafile=' + str(WORK / 'Metafile.json'), '--alias:monaco-editor=' + str(source_root)]
subprocess.run(command, cwd=ROOT, check=True)
metafile = json.loads((WORK / 'Metafile.json').read_text('utf-8'))
for source in metafile['inputs']:
if '/language/typescript/' in source or source.endswith('.worker.js'):
raise ValueError('Worker implementation or TypeScript language service unexpectedly entered the core graph: ' + source)
inputs = []
for input_name, info in metafile['inputs'].items():
path = (ROOT / input_name).resolve()
if path.is_relative_to(source_root):
name = 'package/' + path.relative_to(source_root).as_posix()
else:
name = path.relative_to(ROOT).as_posix()
inputs.append({'Path': name, 'Bytes': path.stat().st_size, 'Sha256': sha(path.read_bytes())})
outputs = [{'Path': path.name, 'Bytes': path.stat().st_size, 'Sha256': sha(path.read_bytes())}
for path in sorted(OUTPUT.iterdir()) if path.is_file() and path.name != 'TransformationManifest.json']
manifest = {
'Kind': 'OfficialMonacoEsmCoreToIife', 'MonacoVersion': '0.52.2', 'MonacoTarballSha256': MONACO_SHA,
'MonacoNpmIntegrity': metadata['dist']['integrity'],
'Entry': 'esm/vs/editor/editor.api.js', 'JavaScriptGrammar': 'esm/vs/basic-languages/javascript/javascript.js',
'CSharpGrammar': 'esm/vs/basic-languages/csharp/csharp.js',
'Global': 'globalThis.monaco = real upstream editor API namespace', 'FakeMonacoObjects': False,
'WorkerBundled': False, 'TypeScriptLanguageServiceBundled': False,
'Tool': {'Name': 'esbuild', 'Version': ESBUILD_VERSION, 'PackageTarball': esbuild_metadata['dist']['tarball'],
'PackageSha256': sha(esbuild_data), 'PackageIntegrity': esbuild_metadata['dist']['integrity'],
'NativePackage': '@esbuild/win32-x64', 'NativeTarball': binary_metadata['dist']['tarball'],
'NativeTarballSha256': sha(binary_data), 'NativeIntegrity': binary_metadata['dist']['integrity'],
'BinarySha256': sha(binary.read_bytes()), 'License': 'MIT; EsbuildLicense.txt'},
'Transformations': ['Resolve official ESM imports', 'Bundle and tree-shake', 'Minify', 'Lower to ES2020 IIFE',
'Extract imported CSS without adding DOM shims', 'Register real JavaScript and CSharp Monarch configurations and grammars'],
'Options': command[2:-1], 'Inputs': sorted(inputs, key=lambda item: item['Path']), 'Outputs': outputs,
'PrimaryDocumentation': 'https://github.com/microsoft/monaco-editor/blob/v0.52.2/docs/integrate-esm.md',
'Validation': {'HostProbeCommand': 'ProductionProbe --core', 'NativeGuestTested': False,
'Meaning': 'Transformation manifest is provenance, not a native acceptance receipt.'}
}
(OUTPUT / 'TransformationManifest.json').write_text(json.dumps(manifest, indent=2) + '\n', 'utf-8')
print(json.dumps({'Output': str(OUTPUT), 'EsbuildVersion': ESBUILD_VERSION, 'EsbuildArchiveSha256': sha(esbuild_data),
'NativeArchiveSha256': sha(binary_data), 'BinarySha256': sha(binary.read_bytes()), 'Files': outputs}))
"""Reproducible official Monaco ESM -> IIFE conversion. Never edits original min/vendor files."""
import base64
import hashlib
import json
from pathlib import Path
import shutil
import subprocess
import tarfile
import urllib.request
ROOT = Path(__file__).resolve().parents[3]
WORK = ROOT / 'build/BrowserProbe/CoreBundle'
OUTPUT = ROOT / 'assets/Browser/Monaco/0.52.2/Core'
MONACO_SHA = 'c280cdcf0b0c13d1a2bf01af958d4387ed06d7f6c918401d00c4adcae1bc72b6'
ESBUILD_VERSION = '0.25.11'
ESBUILD_ARCHIVE_SHA = '9c3cede332e9bcf3bc8e3378f71e6f817d146faf6ca04be7f9b39cc8fec829bc'
ESBUILD_NATIVE_ARCHIVE_SHA = '4012ce126807f8cc154bf9ac604f77e97a08bb65af1f56d824f7a24c60bd4190'
ESBUILD_BINARY_SHA = 'bfb5d74d47fe94ef99ff7541f97f844c8979bd70c8255d796c2e74bbb3eb99f9'
def sha(data):
return hashlib.sha256(data).hexdigest()
def download(url, destination):
if not destination.exists():
destination.parent.mkdir(parents=True, exist_ok=True)
with urllib.request.urlopen(url) as response:
destination.write_bytes(response.read())
return destination.read_bytes()
def fetch_npm(name, version, prefix):
metadata_path = WORK / (prefix + '-Metadata.json')
metadata = json.loads(download('https://registry.npmjs.org/' + name.replace('/', '%2f') + '/' + version, metadata_path))
archive = WORK / (prefix + '.tgz')
data = download(metadata['dist']['tarball'], archive)
algorithm, expected = metadata['dist']['integrity'].split('-', 1)
if algorithm != 'sha512' or base64.b64encode(hashlib.sha512(data).digest()).decode() != expected:
raise ValueError('Published npm integrity failed for ' + name)
return metadata, archive, data
def extract_member(archive, member, destination):
with tarfile.open(archive, 'r:gz') as tar:
stream = tar.extractfile(member)
if stream is None:
raise ValueError('Missing ' + member)
destination.parent.mkdir(parents=True, exist_ok=True)
destination.write_bytes(stream.read())
WORK.mkdir(parents=True, exist_ok=True)
OUTPUT.mkdir(parents=True, exist_ok=True)
metadata, monaco_archive, monaco_data = fetch_npm('monaco-editor', '0.52.2', 'Monaco-0.52.2')
if sha(monaco_data) != MONACO_SHA:
raise ValueError('Pinned original Monaco archive SHA256 mismatch')
source_root = WORK / 'MonacoPackage'
with tarfile.open(monaco_archive, 'r:gz') as tar:
for member in tar.getmembers():
if member.isfile() and (member.name.startswith('package/esm/') or member.name in ('package/package.json', 'package/LICENSE', 'package/ThirdPartyNotices.txt')):
relative = Path(member.name).relative_to('package')
if '..' in relative.parts:
raise ValueError('Unsafe archive path')
destination = source_root / relative
destination.parent.mkdir(parents=True, exist_ok=True)
destination.write_bytes(tar.extractfile(member).read())
esbuild_metadata, esbuild_archive, esbuild_data = fetch_npm('esbuild', ESBUILD_VERSION, 'Esbuild-' + ESBUILD_VERSION)
binary_metadata, binary_archive, binary_data = fetch_npm('@esbuild/win32-x64', ESBUILD_VERSION, 'Esbuild-Win32-x64-' + ESBUILD_VERSION)
if sha(esbuild_data) != ESBUILD_ARCHIVE_SHA or sha(binary_data) != ESBUILD_NATIVE_ARCHIVE_SHA:
raise ValueError('Pinned esbuild archive SHA256 mismatch')
binary = WORK / ('esbuild-' + ESBUILD_VERSION + '.exe')
extract_member(binary_archive, 'package/esbuild.exe', binary)
if sha(binary.read_bytes()) != ESBUILD_BINARY_SHA:
raise ValueError('Pinned esbuild executable SHA256 mismatch')
extract_member(esbuild_archive, 'package/LICENSE.md', OUTPUT / 'EsbuildLicense.txt')
for name in ('LICENSE', 'ThirdPartyNotices.txt'):
shutil.copyfile(source_root / name, OUTPUT / name)
entry = Path(__file__).with_name('Entry.js')
command = [str(binary), str(entry), '--bundle', '--format=iife', '--platform=browser', '--target=es2020', '--minify',
'--legal-comments=external', '--loader:.ttf=file', '--entry-names=EditorCore', '--asset-names=[name]-[hash]',
'--outdir=' + str(OUTPUT), '--metafile=' + str(WORK / 'Metafile.json'), '--alias:monaco-editor=' + str(source_root)]
subprocess.run(command, cwd=ROOT, check=True)
metafile = json.loads((WORK / 'Metafile.json').read_text('utf-8'))
for source in metafile['inputs']:
if '/language/typescript/' in source or source.endswith('.worker.js'):
raise ValueError('Worker implementation or TypeScript language service unexpectedly entered the core graph: ' + source)
inputs = []
for input_name, info in metafile['inputs'].items():
path = (ROOT / input_name).resolve()
if path.is_relative_to(source_root):
name = 'package/' + path.relative_to(source_root).as_posix()
else:
name = path.relative_to(ROOT).as_posix()
inputs.append({'Path': name, 'Bytes': path.stat().st_size, 'Sha256': sha(path.read_bytes())})
outputs = [{'Path': path.name, 'Bytes': path.stat().st_size, 'Sha256': sha(path.read_bytes())}
for path in sorted(OUTPUT.iterdir()) if path.is_file() and path.name != 'TransformationManifest.json']
manifest = {
'Kind': 'OfficialMonacoEsmCoreToIife', 'MonacoVersion': '0.52.2', 'MonacoTarballSha256': MONACO_SHA,
'MonacoNpmIntegrity': metadata['dist']['integrity'],
'Entry': 'esm/vs/editor/editor.api.js', 'JavaScriptGrammar': 'esm/vs/basic-languages/javascript/javascript.js',
'CSharpGrammar': 'esm/vs/basic-languages/csharp/csharp.js',
'Global': 'globalThis.monaco = real upstream editor API namespace', 'FakeMonacoObjects': False,
'WorkerBundled': False, 'TypeScriptLanguageServiceBundled': False,
'Tool': {'Name': 'esbuild', 'Version': ESBUILD_VERSION, 'PackageTarball': esbuild_metadata['dist']['tarball'],
'PackageSha256': sha(esbuild_data), 'PackageIntegrity': esbuild_metadata['dist']['integrity'],
'NativePackage': '@esbuild/win32-x64', 'NativeTarball': binary_metadata['dist']['tarball'],
'NativeTarballSha256': sha(binary_data), 'NativeIntegrity': binary_metadata['dist']['integrity'],
'BinarySha256': sha(binary.read_bytes()), 'License': 'MIT; EsbuildLicense.txt'},
'Transformations': ['Resolve official ESM imports', 'Bundle and tree-shake', 'Minify', 'Lower to ES2020 IIFE',
'Extract imported CSS without adding DOM shims', 'Register real JavaScript and CSharp Monarch configurations and grammars'],
'Options': command[2:-1], 'Inputs': sorted(inputs, key=lambda item: item['Path']), 'Outputs': outputs,
'PrimaryDocumentation': 'https://github.com/microsoft/monaco-editor/blob/v0.52.2/docs/integrate-esm.md',
'Validation': {'HostProbeCommand': 'ProductionProbe --core', 'NativeGuestTested': False,
'Meaning': 'Transformation manifest is provenance, not a native acceptance receipt.'}
}
(OUTPUT / 'TransformationManifest.json').write_text(json.dumps(manifest, indent=2) + '\n', 'utf-8')
print(json.dumps({'Output': str(OUTPUT), 'EsbuildVersion': ESBUILD_VERSION, 'EsbuildArchiveSha256': sha(esbuild_data),
'NativeArchiveSha256': sha(binary_data), 'BinarySha256': sha(binary.read_bytes()), 'Files': outputs}))