import fs from 'node:fs/promises' import path from 'node:path' import assert from 'node:assert/strict' import { createHash } from 'node:crypto' import { parse } from '@babel/parser' import traverseModule from '@babel/traverse' const traverse = traverseModule.default, hash = value => createHash('sha256').update(value).digest('hex') const directory = path.resolve('src/renderer/src/workbuddy/workbench/source-code-assets') const manifest = JSON.parse(await fs.readFile(path.join(directory, 'manifest.json'), 'utf8')) assert.equal(manifest.rootSha256, '035254bc76310ea46317433e4840602094543ef323d2d5c5aff7c131729de918') for (const file of manifest.assets) { const bytes = await fs.readFile(path.join(directory, file.name)) assert.equal(hash(bytes), file.outputSha256, 'Recovered asset changed: ' + file.name) if (!file.adapters.length) assert.equal(file.outputSha256, file.sourceSha256, 'Unadapted asset must remain byte-identical') for (const dependency of manifest.graph[file.name]) assert.ok(manifest.assets.some(file => file.name === dependency), 'Missing closure dependency ' + dependency) assert.ok(!/contexts|src-0FG|react-z/.test(file.name), 'Pure Monaco graph must not import original app/React globals') } const wrapper = await fs.readFile(path.join(directory, 'wrapper.mjs'), 'utf8'), found = new Set() traverse(parse(wrapper, { sourceType: 'module' }), { AssignmentExpression(p) { const name = p.node.left.name if (!manifest.wrapper[name]) return const body = wrapper.slice(p.node.start, p.node.end) if (hash(body) === manifest.wrapper[name].sha256) found.add(name) }, FunctionDeclaration(p) { const name = p.node.id?.name if (manifest.wrapper[name] && hash(wrapper.slice(p.node.start, p.node.end)) === manifest.wrapper[name].sha256) found.add(name) } }) for (const name of Object.keys(manifest.wrapper)) assert.ok(found.has(name), 'Original wrapper body changed: ' + name) assert.equal(manifest.wrapper.re.sha256, '6d7aeb7714f2f52fd86c37957a12c5774be029b31e96f39a50b7e8e6ec11b9a8') assert.equal(manifest.wrapper.ee.sha256, 'e8030c9dd9bb94e12f4a3e4816362ec53e52b4380b348c38b42627ff37dbfac4') const { getLanguageFromFileName } = await import('../src/renderer/src/workbuddy/workbench/source-code-assets/extension.mjs') assert.equal(getLanguageFromFileName('file.TSX'), 'typescript') assert.equal(getLanguageFromFileName('file.ps1'), 'powershell') assert.equal(getLanguageFromFileName('file.unknown'), 'plaintext') const init = await fs.readFile(path.join(directory, 'monaco-init-CE4MbM4x.js'), 'utf8') assert.equal((init.match(/YCode local Monaco assets failed to load/g) || []).length, 2) assert.ok(!init.includes('P.config({paths:{vs:`https://cdn.jsdelivr.net/npm/monaco-editor@0.45.0/min/vs`}})'), 'Original CDN failure path must never execute in YCode') assert.ok(wrapper.includes('CloseIcon$2=') && manifest.sourceCloseIcon, 'Source close SVG must be retained') console.log(JSON.stringify({ result: 'PASS', assets: manifest.assets.length, sourceBodies: found.size, exactWrapperCharacters: manifest.wrapper.re.end - manifest.wrapper.re.start, graphDependenciesPresent: true }))