refactor: runtime isolation — deprecate global singletons, add counter resets
config.ts: @deprecated on configure/getConfig/project/getProjectConfig. Current code has zero production callers — dead code path. Functions remain for backward compatibility but signal migration to scoped config. context.ts: @deprecated on setDefaultContext. Documents that consumers should call resetDefaultContext() after use in tests to prevent context-seed leakage. pipeline.ts: Export resetTraceCounter() for test isolation of _traceId counter variable. extraction.ts: Export resetPageCacheNamespaceCounter() for test isolation of pageCacheNamespaceCounter. Combined with prior fix (defaultPredicatesRegistered→sentinel check + compatibilityWarningEmitted→warnedUis WeakSet), 5 of 7 correctness- affecting global mutable state items are now tied down. Remaining: globalPredicateRegistry/globalClauseRegistry (already @deprecated with explicit injection path via LogicEngineOptions/EvalOptions). 605 SDK + 57 E2E = 662 tests pass.
This commit is contained in:
@@ -119,12 +119,12 @@ export function getDefaultContext(): ExecutionContext {
|
|||||||
return _defaultContext
|
return _defaultContext
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Set the global default context (useful for test setup). */
|
/** @deprecated Prefer explicit context injection. Sets the global mutable default context. */
|
||||||
export function setDefaultContext(ctx: ExecutionContext): void {
|
export function setDefaultContext(ctx: ExecutionContext): void {
|
||||||
_defaultContext = ctx
|
_defaultContext = ctx
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Reset the global default context so the next call creates a fresh one. */
|
/** Reset the global default context. Call after using setDefaultContext() in tests. */
|
||||||
export function resetDefaultContext(): void {
|
export function resetDefaultContext(): void {
|
||||||
_defaultContext = undefined
|
_defaultContext = undefined
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -457,10 +457,16 @@ CODE_TO_CLAUSE_KIND[15] = 'size.aspectRatio'
|
|||||||
// ---------------------------------------------------------------------------
|
// ---------------------------------------------------------------------------
|
||||||
|
|
||||||
let _traceId = 0
|
let _traceId = 0
|
||||||
|
|
||||||
function nextTraceId(): string {
|
function nextTraceId(): string {
|
||||||
return `trace_${++_traceId}`
|
return `trace_${++_traceId}`
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/** Reset the trace ID counter (for test isolation). */
|
||||||
|
export function resetTraceCounter(): void {
|
||||||
|
_traceId = 0
|
||||||
|
}
|
||||||
|
|
||||||
function now(): number {
|
function now(): number {
|
||||||
return Date.now()
|
return Date.now()
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -11,12 +11,12 @@ export interface ImhotepConfig {
|
|||||||
|
|
||||||
let globalConfig: ImhotepConfig = {}
|
let globalConfig: ImhotepConfig = {}
|
||||||
|
|
||||||
/** Sets or updates global Imhotep runtime configuration. */
|
/** @deprecated Use explicit runtime-scoped configuration instead of global mutable state. */
|
||||||
export function configure(config: ImhotepConfig): void {
|
export function configure(config: ImhotepConfig): void {
|
||||||
globalConfig = { ...globalConfig, ...config }
|
globalConfig = { ...globalConfig, ...config }
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Returns a shallow copy of the current global config. */
|
/** @deprecated Use explicit runtime-scoped configuration. Returns a shallow copy of the global config. */
|
||||||
export function getConfig(): ImhotepConfig {
|
export function getConfig(): ImhotepConfig {
|
||||||
return { ...globalConfig }
|
return { ...globalConfig }
|
||||||
}
|
}
|
||||||
@@ -31,12 +31,12 @@ export interface ProjectConfig {
|
|||||||
|
|
||||||
let projectConfig: ProjectConfig = {}
|
let projectConfig: ProjectConfig = {}
|
||||||
|
|
||||||
/** Sets or updates project-level defaults, font corpora, and adapters. */
|
/** @deprecated Use explicit runtime-scoped project config instead of global mutable state. */
|
||||||
export function project(config: ProjectConfig): void {
|
export function project(config: ProjectConfig): void {
|
||||||
projectConfig = { ...projectConfig, ...config }
|
projectConfig = { ...projectConfig, ...config }
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Returns a shallow copy of the current project config. */
|
/** @deprecated Returns a shallow copy of the global project config. */
|
||||||
export function getProjectConfig(): ProjectConfig {
|
export function getProjectConfig(): ProjectConfig {
|
||||||
return { ...projectConfig }
|
return { ...projectConfig }
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -96,6 +96,11 @@ export function resetExtractionPathStats(): void {
|
|||||||
const pageCacheNamespace = new WeakMap<Page, string>()
|
const pageCacheNamespace = new WeakMap<Page, string>()
|
||||||
let pageCacheNamespaceCounter = 0
|
let pageCacheNamespaceCounter = 0
|
||||||
|
|
||||||
|
/** Reset the page cache namespace counter (for test isolation). */
|
||||||
|
export function resetPageCacheNamespaceCounter(): void {
|
||||||
|
pageCacheNamespaceCounter = 0
|
||||||
|
}
|
||||||
|
|
||||||
function getPageCacheNamespace(page: Page): string {
|
function getPageCacheNamespace(page: Page): string {
|
||||||
const existing = pageCacheNamespace.get(page)
|
const existing = pageCacheNamespace.get(page)
|
||||||
if (existing) return existing
|
if (existing) return existing
|
||||||
|
|||||||
Reference in New Issue
Block a user