diff --git a/scripts/parsers/directives/reference-links.ts b/scripts/parsers/directives/reference-links.ts index 7f3123e2e..eef527a18 100644 --- a/scripts/parsers/directives/reference-links.ts +++ b/scripts/parsers/directives/reference-links.ts @@ -17,14 +17,14 @@ // node.label is non-empty. Directives that need a computed display label mutate // node.label in their expand hook; render() then omits `label` from output.params. -import { createRequire } from 'module'; import type { DirectiveDef, DirectiveRenderOutput } from '../directive-registry.js'; import { DirectiveParseError } from '../directives.js'; import type { DirectiveNode, ExpandDirectivesContext } from '../directives.js'; +import apiLibsJson from './api-libs.json'; -// Load api-libs.json at module init time -const _require = createRequire(import.meta.url); -const API_LIBS: Record = _require('./api-libs.json'); +// api-libs.json is inlined at bundle time (static JSON import) so no sidecar +// file is needed next to the built parsers.bundle.mjs. +const API_LIBS: Record = apiLibsJson as Record; // ─── :tutorial-ref[slug]{label?} ───────────────────────────────────────────── // diff --git a/scripts/parsers/directives/ui.ts b/scripts/parsers/directives/ui.ts index 3e30e1ac4..a44e71841 100644 --- a/scripts/parsers/directives/ui.ts +++ b/scripts/parsers/directives/ui.ts @@ -10,14 +10,12 @@ // Side-effect: call registerUiDirectives() once at startup. // In tests: resetRegistry(); registerUiDirectives() -import { createRequire } from 'node:module'; import { registerDirective, getRegistry } from '../directive-registry.js'; import { DirectiveParseError } from '../directives.js'; import type { DirectiveNode } from '../directives.js'; +import iconAllowlistJson from './icon-allowlist.json'; -const _require = createRequire(import.meta.url); -// eslint-disable-next-line @typescript-eslint/no-var-requires -const iconAllowlist: string[] = _require('./icon-allowlist.json') as string[]; +const iconAllowlist: string[] = iconAllowlistJson as string[]; // ─── Key token constants ────────────────────────────────────────────────────── diff --git a/test/unit/option-tail-leak.test.ts b/test/unit/option-tail-leak.test.ts index c17c26ccb..308a1f355 100644 --- a/test/unit/option-tail-leak.test.ts +++ b/test/unit/option-tail-leak.test.ts @@ -36,6 +36,7 @@ const __dirname = dirname(fileURLToPath(import.meta.url)); const REPO_ROOT = join(__dirname, '..', '..'); const SHORTCODES = join(REPO_ROOT, 'hugo', 'layouts', 'shortcodes'); const MARKUP = join(REPO_ROOT, 'hugo', 'layouts', '_default', '_markup'); +const PARTIALS = join(REPO_ROOT, 'hugo', 'layouts', 'partials'); function hugoBinary(): string { return process.env.HUGO || 'hugo'; @@ -51,6 +52,7 @@ function renderThroughPipeline(stepBody: string): string { const dir = mkdtempSync(join(tmpdir(), 'opt-tail-leak-')); mkdirSync(join(dir, 'layouts', 'shortcodes'), { recursive: true }); mkdirSync(join(dir, 'layouts', '_default', '_markup'), { recursive: true }); + mkdirSync(join(dir, 'layouts', 'partials'), { recursive: true }); mkdirSync(join(dir, 'content'), { recursive: true }); for (const sc of ['os-options.html', 'os-panel.html', 'option-tabs.html', 'tab.html']) { @@ -67,6 +69,10 @@ function renderThroughPipeline(stepBody: string): string { const p = join(MARKUP, h); if (existsSync(p)) copyFileSync(p, join(dir, 'layouts', '_default', '_markup', h)); } + // render-blockquote.html delegates GitHub-style alerts (`> [!TIP]`) to the + // tut-alert partial (#2595/#71a8d70bc), so it must be present or the Hugo + // build fails resolving `partial "tut-alert.html"`. + copyFileSync(join(PARTIALS, 'tut-alert.html'), join(dir, 'layouts', 'partials', 'tut-alert.html')); writeFileSync(join(dir, 'hugo.toml'), 'baseURL = "http://example.org/"\n' +