37 lines
2.3 KiB
JavaScript
37 lines
2.3 KiB
JavaScript
/** Emit one owned memory entry plus its actual production import tree. The
|
|
* measured child runs plain node, not the TypeScript compiler or tsx. */
|
|
import assert from 'node:assert/strict'
|
|
import { lstat, rm } from 'node:fs/promises'
|
|
import { dirname, basename, resolve } from 'node:path'
|
|
import { fileURLToPath } from 'node:url'
|
|
import ts from 'typescript'
|
|
|
|
const backend = resolve(dirname(fileURLToPath(import.meta.url)), '../..')
|
|
const output = resolve(backend, 'dist-mcp-memory')
|
|
assert.equal(dirname(output), backend)
|
|
assert.equal(basename(output), 'dist-mcp-memory')
|
|
const existing = await lstat(output).catch(error => { if (error.code !== 'ENOENT') throw error })
|
|
assert(!existing?.isSymbolicLink(), 'Refuse to clean a redirected output directory')
|
|
if (existing) await rm(output, { recursive: true })
|
|
const configPath = resolve(backend, 'tsconfig.json')
|
|
const config = ts.readConfigFile(configPath, ts.sys.readFile)
|
|
const format = diagnostics => ts.formatDiagnosticsWithColorAndContext(diagnostics, {
|
|
getCurrentDirectory: () => backend, getCanonicalFileName: name => name, getNewLine: () => '\n',
|
|
})
|
|
if (config.error) throw Error(format([config.error]))
|
|
const parsed = ts.parseJsonConfigFileContent(config.config, ts.sys, backend, undefined, configPath)
|
|
if (parsed.errors.length) throw Error(format(parsed.errors))
|
|
const entry = resolve(backend, 'src/services/server-poll-memory.owned.test.ts')
|
|
const options = { ...parsed.options, rootDir: resolve(backend, 'src'), outDir: output,
|
|
noEmit: false, noEmitOnError: true, declaration: false, declarationMap: false, sourceMap: false,
|
|
incremental: false, composite: false, tsBuildInfoFile: undefined }
|
|
// Deliberately override tsconfig include/exclude with this single test root.
|
|
// TypeScript still follows all normal imports; no module/path/IO substitutes.
|
|
const program = ts.createProgram({ rootNames: [entry], options })
|
|
const diagnostics = ts.getPreEmitDiagnostics(program)
|
|
if (diagnostics.length) throw Error(format(diagnostics))
|
|
const emitted = program.emit()
|
|
if (emitted.emitSkipped || emitted.diagnostics.length) throw Error(format(emitted.diagnostics) || 'Memory entry emit skipped')
|
|
console.log(JSON.stringify({ compiledPollMemoryEntry: resolve(output, 'services/server-poll-memory.owned.test.js'),
|
|
outputDirectory: output, rootEntries: 1, noEmitOnError: true, measuredChildUsesTsx: false }))
|