@life-and-dev/mdsite 0.0.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +228 -0
- package/bin/mdsite.js +3 -0
- package/dist/commands/commands.test.d.ts +1 -0
- package/dist/commands/commands.test.js +302 -0
- package/dist/commands/commands.test.js.map +1 -0
- package/dist/commands/generate.d.ts +1 -0
- package/dist/commands/generate.js +20 -0
- package/dist/commands/generate.js.map +1 -0
- package/dist/commands/init.d.ts +1 -0
- package/dist/commands/init.js +16 -0
- package/dist/commands/init.js.map +1 -0
- package/dist/commands/prepare.d.ts +1 -0
- package/dist/commands/prepare.js +111 -0
- package/dist/commands/prepare.js.map +1 -0
- package/dist/commands/prepare.test.d.ts +1 -0
- package/dist/commands/prepare.test.js +131 -0
- package/dist/commands/prepare.test.js.map +1 -0
- package/dist/commands/preview.d.ts +5 -0
- package/dist/commands/preview.js +62 -0
- package/dist/commands/preview.js.map +1 -0
- package/dist/commands/start.d.ts +5 -0
- package/dist/commands/start.js +50 -0
- package/dist/commands/start.js.map +1 -0
- package/dist/commands/stop.d.ts +1 -0
- package/dist/commands/stop.js +26 -0
- package/dist/commands/stop.js.map +1 -0
- package/dist/commands/workflows.test.d.ts +1 -0
- package/dist/commands/workflows.test.js +183 -0
- package/dist/commands/workflows.test.js.map +1 -0
- package/dist/config/default-mdsite-config.d.ts +2 -0
- package/dist/config/default-mdsite-config.js +82 -0
- package/dist/config/default-mdsite-config.js.map +1 -0
- package/dist/config/default-mdsite-config.test.d.ts +1 -0
- package/dist/config/default-mdsite-config.test.js +42 -0
- package/dist/config/default-mdsite-config.test.js.map +1 -0
- package/dist/config/mdsite-config.d.ts +42 -0
- package/dist/config/mdsite-config.js +74 -0
- package/dist/config/mdsite-config.js.map +1 -0
- package/dist/config/mdsite-config.test.d.ts +1 -0
- package/dist/config/mdsite-config.test.js +115 -0
- package/dist/config/mdsite-config.test.js.map +1 -0
- package/dist/config/menu.d.ts +3 -0
- package/dist/config/menu.js +58 -0
- package/dist/config/menu.js.map +1 -0
- package/dist/config/menu.test.d.ts +1 -0
- package/dist/config/menu.test.js +53 -0
- package/dist/config/menu.test.js.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.js +99 -0
- package/dist/index.js.map +1 -0
- package/dist/index.test.d.ts +1 -0
- package/dist/index.test.js +133 -0
- package/dist/index.test.js.map +1 -0
- package/dist/process/child-process.d.ts +9 -0
- package/dist/process/child-process.js +142 -0
- package/dist/process/child-process.js.map +1 -0
- package/dist/process/child-process.test.d.ts +1 -0
- package/dist/process/child-process.test.js +131 -0
- package/dist/process/child-process.test.js.map +1 -0
- package/dist/process/runtime-state.d.ts +16 -0
- package/dist/process/runtime-state.js +42 -0
- package/dist/process/runtime-state.js.map +1 -0
- package/dist/process/runtime-state.test.d.ts +1 -0
- package/dist/process/runtime-state.test.js +57 -0
- package/dist/process/runtime-state.test.js.map +1 -0
- package/dist/renderer/mdsite-nuxt.d.ts +22 -0
- package/dist/renderer/mdsite-nuxt.js +194 -0
- package/dist/renderer/mdsite-nuxt.js.map +1 -0
- package/dist/renderer/mdsite-nuxt.test.d.ts +1 -0
- package/dist/renderer/mdsite-nuxt.test.js +226 -0
- package/dist/renderer/mdsite-nuxt.test.js.map +1 -0
- package/mdsite-nuxt/app/app.vue +7 -0
- package/mdsite-nuxt/app/assets/css/bible-tooltips.css +87 -0
- package/mdsite-nuxt/app/assets/css/markdown.css +195 -0
- package/mdsite-nuxt/app/assets/css/print.css +133 -0
- package/mdsite-nuxt/app/components/AppBar.vue +138 -0
- package/mdsite-nuxt/app/components/AppFooter.vue +88 -0
- package/mdsite-nuxt/app/components/AppNavigation.vue +162 -0
- package/mdsite-nuxt/app/components/AppTableOfContents.vue +149 -0
- package/mdsite-nuxt/app/components/BreadcrumbNav.vue +139 -0
- package/mdsite-nuxt/app/components/NavigationTree.vue +169 -0
- package/mdsite-nuxt/app/components/SearchBox.vue +212 -0
- package/mdsite-nuxt/app/components/TocItem.vue +75 -0
- package/mdsite-nuxt/app/components/TreeNode.vue +264 -0
- package/mdsite-nuxt/app/components/content/MarkdownAlert.vue +42 -0
- package/mdsite-nuxt/app/components/content/Mermaid.vue +103 -0
- package/mdsite-nuxt/app/components/content/ProseA.vue +57 -0
- package/mdsite-nuxt/app/components/content/ProseBlockquote.vue +14 -0
- package/mdsite-nuxt/app/components/content/ProsePre.vue +49 -0
- package/mdsite-nuxt/app/components/content/ProseTable.vue +143 -0
- package/mdsite-nuxt/app/composables/useAppTheme.ts +89 -0
- package/mdsite-nuxt/app/composables/useBibleTooltips.ts +21 -0
- package/mdsite-nuxt/app/composables/useBreadcrumbs.ts +70 -0
- package/mdsite-nuxt/app/composables/useContentPostProcessing.ts +89 -0
- package/mdsite-nuxt/app/composables/useNavigationTree.ts +174 -0
- package/mdsite-nuxt/app/composables/useSearchIndex.ts +47 -0
- package/mdsite-nuxt/app/composables/useSearchRelevance.test.ts +255 -0
- package/mdsite-nuxt/app/composables/useSearchRelevance.ts +207 -0
- package/mdsite-nuxt/app/composables/useSidebarState.ts +62 -0
- package/mdsite-nuxt/app/composables/useSiteConfig.ts +37 -0
- package/mdsite-nuxt/app/composables/useSourceEdit.ts +69 -0
- package/mdsite-nuxt/app/composables/useTableOfContents.ts +141 -0
- package/mdsite-nuxt/app/composables/useTableParser.ts +106 -0
- package/mdsite-nuxt/app/composables/useTooltipConfig.ts +20 -0
- package/mdsite-nuxt/app/config/themes.ts +17 -0
- package/mdsite-nuxt/app/layouts/default.vue +376 -0
- package/mdsite-nuxt/app/pages/[...slug].vue +56 -0
- package/mdsite-nuxt/app/pages/index.vue +54 -0
- package/mdsite-nuxt/app/plugins/bible-tooltips.client.ts +401 -0
- package/mdsite-nuxt/app/plugins/bible-tooltips.test.ts +284 -0
- package/mdsite-nuxt/app/types/content.d.ts +10 -0
- package/mdsite-nuxt/app/types/table.ts +57 -0
- package/mdsite-nuxt/app/utils/bible-book-names.ts +37 -0
- package/mdsite-nuxt/app/utils/bible-verse-utils.test.ts +148 -0
- package/mdsite-nuxt/app/utils/bible-verse-utils.ts +236 -0
- package/mdsite-nuxt/content.config.ts +18 -0
- package/mdsite-nuxt/example.config.yml +67 -0
- package/mdsite-nuxt/nuxt.config.ts +247 -0
- package/mdsite-nuxt/package-lock.json +15922 -0
- package/mdsite-nuxt/package.json +50 -0
- package/mdsite-nuxt/playwright.config.js +47 -0
- package/mdsite-nuxt/public/robots.txt +2 -0
- package/mdsite-nuxt/scripts/generate-favicons.ts +192 -0
- package/mdsite-nuxt/scripts/generate-indices.ts +508 -0
- package/mdsite-nuxt/scripts/renderer-hooks.test.ts +277 -0
- package/mdsite-nuxt/scripts/renderer-hooks.ts +141 -0
- package/mdsite-nuxt/scripts/start.test.ts +164 -0
- package/mdsite-nuxt/scripts/start.ts +55 -0
- package/mdsite-nuxt/scripts/sync-content.ts +504 -0
- package/mdsite-nuxt/tsconfig.json +18 -0
- package/mdsite-nuxt/utils/mdsite-config.ts +240 -0
- package/mdsite-nuxt/vitest.config.ts +7 -0
- package/package.json +36 -0
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
import { mkdtemp, readFile, rm } from 'node:fs/promises';
|
|
2
|
+
import os from 'node:os';
|
|
3
|
+
import path from 'node:path';
|
|
4
|
+
import { afterEach, describe, expect, it, vi } from 'vitest';
|
|
5
|
+
import { clearRuntimeState, getRuntimeDir, getRuntimeLogPath, isProcessRunning, readRuntimeState, writeRuntimeState } from './runtime-state.js';
|
|
6
|
+
const tempDirs = [];
|
|
7
|
+
async function makeTempDir() {
|
|
8
|
+
const dir = await mkdtemp(path.join(os.tmpdir(), 'mdsite-runtime-'));
|
|
9
|
+
tempDirs.push(dir);
|
|
10
|
+
return dir;
|
|
11
|
+
}
|
|
12
|
+
afterEach(async () => {
|
|
13
|
+
vi.restoreAllMocks();
|
|
14
|
+
await Promise.all(tempDirs.splice(0).map((dir) => rm(dir, { recursive: true, force: true })));
|
|
15
|
+
});
|
|
16
|
+
describe('runtime-state helpers', () => {
|
|
17
|
+
it('builds runtime and log paths under .mdsite-runtime', () => {
|
|
18
|
+
expect(getRuntimeDir('/content')).toBe(path.join('/content', '.mdsite-runtime'));
|
|
19
|
+
expect(getRuntimeLogPath('/content', 'preview')).toBe(path.join('/content', 'mdsite.log'));
|
|
20
|
+
expect(getRuntimeLogPath('/content', 'start')).toBe(path.join('/content', '.mdsite-runtime', 'start.log'));
|
|
21
|
+
});
|
|
22
|
+
it('writes, reads, and clears runtime state', async () => {
|
|
23
|
+
const contentDir = await makeTempDir();
|
|
24
|
+
const state = {
|
|
25
|
+
kind: 'start',
|
|
26
|
+
pid: 321,
|
|
27
|
+
logPath: '/tmp/start.log',
|
|
28
|
+
rendererDir: '/renderer',
|
|
29
|
+
contentDir,
|
|
30
|
+
command: ['npm', 'run', 'dev'],
|
|
31
|
+
startedAt: '2026-04-10T00:00:00.000Z'
|
|
32
|
+
};
|
|
33
|
+
await writeRuntimeState(contentDir, state);
|
|
34
|
+
expect(await readRuntimeState(contentDir, 'start')).toEqual(state);
|
|
35
|
+
const raw = await readFile(path.join(getRuntimeDir(contentDir), 'start.json'), 'utf8');
|
|
36
|
+
expect(raw.endsWith('\n')).toBe(true);
|
|
37
|
+
await clearRuntimeState(contentDir, 'start');
|
|
38
|
+
await expect(readRuntimeState(contentDir, 'start')).resolves.toBeNull();
|
|
39
|
+
});
|
|
40
|
+
it('returns null for missing or malformed state files', async () => {
|
|
41
|
+
const contentDir = await makeTempDir();
|
|
42
|
+
expect(await readRuntimeState(contentDir, 'preview')).toBeNull();
|
|
43
|
+
const runtimeDir = getRuntimeDir(contentDir);
|
|
44
|
+
await import('node:fs/promises').then(({ mkdir, writeFile }) => mkdir(runtimeDir, { recursive: true }).then(() => writeFile(path.join(runtimeDir, 'preview.json'), '{oops', 'utf8')));
|
|
45
|
+
await expect(readRuntimeState(contentDir, 'preview')).resolves.toBeNull();
|
|
46
|
+
});
|
|
47
|
+
it('detects running processes by probing process.kill', () => {
|
|
48
|
+
const killSpy = vi.spyOn(process, 'kill');
|
|
49
|
+
killSpy.mockImplementationOnce(() => true);
|
|
50
|
+
expect(isProcessRunning(123)).toBe(true);
|
|
51
|
+
killSpy.mockImplementationOnce(() => {
|
|
52
|
+
throw new Error('gone');
|
|
53
|
+
});
|
|
54
|
+
expect(isProcessRunning(456)).toBe(false);
|
|
55
|
+
});
|
|
56
|
+
});
|
|
57
|
+
//# sourceMappingURL=runtime-state.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"runtime-state.test.js","sourceRoot":"","sources":["../../src/process/runtime-state.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import type { MdsiteConfig } from '../config/mdsite-config.js';
|
|
2
|
+
interface PreparedRenderer {
|
|
3
|
+
rendererDir: string;
|
|
4
|
+
rendererEnv: NodeJS.ProcessEnv;
|
|
5
|
+
}
|
|
6
|
+
interface PrepareRendererOptions {
|
|
7
|
+
configDir?: string;
|
|
8
|
+
configPath?: string;
|
|
9
|
+
}
|
|
10
|
+
export declare function prepareRenderer(contentDir: string, config: MdsiteConfig, options?: PrepareRendererOptions): Promise<PreparedRenderer>;
|
|
11
|
+
export declare function prepareConfiguredRenderer(contentDir: string, config: MdsiteConfig, options?: PrepareRendererOptions): Promise<PreparedRenderer>;
|
|
12
|
+
export declare function ensureConfiguredRendererInstalled(contentDir: string, config: MdsiteConfig, options?: PrepareRendererOptions): Promise<string>;
|
|
13
|
+
export declare function ensureRendererDependencies(rendererDir: string): Promise<void>;
|
|
14
|
+
export declare function startRendererInBackground(rendererDir: string, env: NodeJS.ProcessEnv, logPath: string): Promise<number>;
|
|
15
|
+
export declare function startRendererForeground(rendererDir: string, env: NodeJS.ProcessEnv): Promise<void>;
|
|
16
|
+
export declare function previewRendererInBackground(rendererDir: string, env: NodeJS.ProcessEnv, logPath: string): Promise<number>;
|
|
17
|
+
export declare function previewRendererForeground(rendererDir: string, env: NodeJS.ProcessEnv): Promise<void>;
|
|
18
|
+
export declare function generateRenderer(rendererDir: string, env: NodeJS.ProcessEnv): Promise<void>;
|
|
19
|
+
export declare function prepareRendererBackend(rendererDir: string, env: NodeJS.ProcessEnv): Promise<void>;
|
|
20
|
+
export declare function ensurePreviewArtifacts(rendererDir: string): Promise<void>;
|
|
21
|
+
export declare function getRendererGeneratedOutputPath(rendererDir: string): string;
|
|
22
|
+
export {};
|
|
@@ -0,0 +1,194 @@
|
|
|
1
|
+
import { access, copyFile, cp, mkdir, rm, stat, symlink, writeFile } from 'node:fs/promises';
|
|
2
|
+
import path from 'node:path';
|
|
3
|
+
import { fileURLToPath } from 'node:url';
|
|
4
|
+
import YAML from 'yaml';
|
|
5
|
+
import { generateMenuFromMarkdownFiles } from '../config/menu.js';
|
|
6
|
+
import { runForeground, runBackground } from '../process/child-process.js';
|
|
7
|
+
const repoRoot = path.resolve(path.dirname(fileURLToPath(import.meta.url)), '..', '..');
|
|
8
|
+
const checkedInRendererDir = path.join(repoRoot, 'mdsite-nuxt');
|
|
9
|
+
const rendererCopyIgnoredNames = new Set(['node_modules', '.nuxt', '.output', 'dist', '.cache']);
|
|
10
|
+
export async function prepareRenderer(contentDir, config, options = {}) {
|
|
11
|
+
const rendererBaseDir = options.configDir ?? contentDir;
|
|
12
|
+
const rendererDir = await resolveRendererDir(rendererBaseDir, config);
|
|
13
|
+
return prepareRendererEnvironment(contentDir, config, rendererDir, options.configPath);
|
|
14
|
+
}
|
|
15
|
+
export async function prepareConfiguredRenderer(contentDir, config, options = {}) {
|
|
16
|
+
const rendererBaseDir = options.configDir ?? contentDir;
|
|
17
|
+
const rendererDir = await resolveConfiguredRendererDir(rendererBaseDir, config);
|
|
18
|
+
return prepareRendererEnvironment(contentDir, config, rendererDir, options.configPath);
|
|
19
|
+
}
|
|
20
|
+
export async function ensureConfiguredRendererInstalled(contentDir, config, options = {}) {
|
|
21
|
+
const rendererBaseDir = options.configDir ?? contentDir;
|
|
22
|
+
const rendererDir = path.resolve(rendererBaseDir, config.server.path);
|
|
23
|
+
await ensureDirectoryIsAvailable(rendererDir);
|
|
24
|
+
if (rendererDir !== checkedInRendererDir) {
|
|
25
|
+
await cp(checkedInRendererDir, rendererDir, {
|
|
26
|
+
recursive: true,
|
|
27
|
+
force: true,
|
|
28
|
+
filter: shouldCopyRendererPath
|
|
29
|
+
});
|
|
30
|
+
}
|
|
31
|
+
return rendererDir;
|
|
32
|
+
}
|
|
33
|
+
async function prepareRendererEnvironment(contentDir, config, rendererDir, configPath) {
|
|
34
|
+
await ensureMenuFile(contentDir, config);
|
|
35
|
+
await ensureRendererFaviconAlias(contentDir, config);
|
|
36
|
+
await writeCompatibilityConfigFile(rendererDir, contentDir, config);
|
|
37
|
+
const rendererEnv = {
|
|
38
|
+
...process.env,
|
|
39
|
+
NUXT_CONTENT_PATH: contentDir,
|
|
40
|
+
CONTENT_DIR: contentDir,
|
|
41
|
+
MDSITE_CONFIG_PATH: configPath ?? path.join(contentDir, 'mdsite.yml')
|
|
42
|
+
};
|
|
43
|
+
await writeEnvFile(rendererDir, rendererEnv);
|
|
44
|
+
return {
|
|
45
|
+
rendererDir,
|
|
46
|
+
rendererEnv
|
|
47
|
+
};
|
|
48
|
+
}
|
|
49
|
+
export async function ensureRendererDependencies(rendererDir) {
|
|
50
|
+
try {
|
|
51
|
+
await access(path.join(rendererDir, 'node_modules'));
|
|
52
|
+
}
|
|
53
|
+
catch {
|
|
54
|
+
const hasLockfile = await pathExists(path.join(rendererDir, 'package-lock.json'));
|
|
55
|
+
const installCommand = hasLockfile ? 'ci' : 'install';
|
|
56
|
+
await runForeground('npm', [installCommand], rendererDir, process.env);
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
export async function startRendererInBackground(rendererDir, env, logPath) {
|
|
60
|
+
return runRendererScriptInBackground(rendererDir, env, 'dev', logPath);
|
|
61
|
+
}
|
|
62
|
+
export async function startRendererForeground(rendererDir, env) {
|
|
63
|
+
await runRendererScript(rendererDir, env, 'dev');
|
|
64
|
+
}
|
|
65
|
+
export async function previewRendererInBackground(rendererDir, env, logPath) {
|
|
66
|
+
return runRendererScriptInBackground(rendererDir, env, 'preview', logPath);
|
|
67
|
+
}
|
|
68
|
+
export async function previewRendererForeground(rendererDir, env) {
|
|
69
|
+
await runRendererScript(rendererDir, env, 'preview');
|
|
70
|
+
}
|
|
71
|
+
export async function generateRenderer(rendererDir, env) {
|
|
72
|
+
await runRendererScript(rendererDir, env, 'generate');
|
|
73
|
+
}
|
|
74
|
+
export async function prepareRendererBackend(rendererDir, env) {
|
|
75
|
+
await runRendererScript(rendererDir, env, 'prepare:renderer');
|
|
76
|
+
}
|
|
77
|
+
export async function ensurePreviewArtifacts(rendererDir) {
|
|
78
|
+
const previewArtifacts = [
|
|
79
|
+
path.join(rendererDir, '.output', 'public')
|
|
80
|
+
];
|
|
81
|
+
for (const artifactPath of previewArtifacts) {
|
|
82
|
+
try {
|
|
83
|
+
await access(artifactPath);
|
|
84
|
+
}
|
|
85
|
+
catch {
|
|
86
|
+
throw new Error('Preview is unavailable. Run `mdsite generate` before `mdsite preview`.');
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
export function getRendererGeneratedOutputPath(rendererDir) {
|
|
91
|
+
return path.join(rendererDir, '.output', 'public');
|
|
92
|
+
}
|
|
93
|
+
async function resolveRendererDir(contentDir, config) {
|
|
94
|
+
const configuredRendererDir = path.resolve(contentDir, config.server.path);
|
|
95
|
+
// Phase 1 uses the checked-in renderer when a configured renderer checkout is not present yet.
|
|
96
|
+
const rendererDir = await pathExists(configuredRendererDir) ? configuredRendererDir : checkedInRendererDir;
|
|
97
|
+
if (!await pathExists(rendererDir)) {
|
|
98
|
+
throw new Error(`Renderer directory not found at ${rendererDir}. Expected checked-in mdsite-nuxt renderer.`);
|
|
99
|
+
}
|
|
100
|
+
return rendererDir;
|
|
101
|
+
}
|
|
102
|
+
async function resolveConfiguredRendererDir(contentDir, config) {
|
|
103
|
+
const rendererDir = path.resolve(contentDir, config.server.path);
|
|
104
|
+
let rendererStats;
|
|
105
|
+
try {
|
|
106
|
+
rendererStats = await stat(rendererDir);
|
|
107
|
+
}
|
|
108
|
+
catch {
|
|
109
|
+
throw new Error(`Configured renderer directory not found at ${rendererDir}.`);
|
|
110
|
+
}
|
|
111
|
+
if (!rendererStats.isDirectory()) {
|
|
112
|
+
throw new Error(`Configured renderer path is not a directory: ${rendererDir}`);
|
|
113
|
+
}
|
|
114
|
+
return rendererDir;
|
|
115
|
+
}
|
|
116
|
+
async function ensureDirectoryIsAvailable(directoryPath) {
|
|
117
|
+
let directoryStats;
|
|
118
|
+
try {
|
|
119
|
+
directoryStats = await stat(directoryPath);
|
|
120
|
+
}
|
|
121
|
+
catch {
|
|
122
|
+
await mkdir(directoryPath, { recursive: true });
|
|
123
|
+
return;
|
|
124
|
+
}
|
|
125
|
+
if (!directoryStats.isDirectory()) {
|
|
126
|
+
throw new Error(`Configured renderer path is not a directory: ${directoryPath}`);
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
function shouldCopyRendererPath(sourcePath) {
|
|
130
|
+
return !rendererCopyIgnoredNames.has(path.basename(sourcePath));
|
|
131
|
+
}
|
|
132
|
+
async function ensureMenuFile(contentDir, config) {
|
|
133
|
+
const menu = config.menu.length > 0 ? config.menu : await generateMenuFromMarkdownFiles(contentDir);
|
|
134
|
+
await writeFile(path.join(contentDir, '_menu.yml'), YAML.stringify(menu), 'utf8');
|
|
135
|
+
}
|
|
136
|
+
async function ensureRendererFaviconAlias(contentDir, config) {
|
|
137
|
+
if (!config.favicon.trim()) {
|
|
138
|
+
return;
|
|
139
|
+
}
|
|
140
|
+
const sourcePath = path.resolve(contentDir, config.favicon);
|
|
141
|
+
if (!await pathExists(sourcePath)) {
|
|
142
|
+
throw new Error(`Configured favicon file not found: ${sourcePath}`);
|
|
143
|
+
}
|
|
144
|
+
const targetPath = path.join(contentDir, 'logo.svg');
|
|
145
|
+
if (sourcePath === targetPath) {
|
|
146
|
+
return;
|
|
147
|
+
}
|
|
148
|
+
await rm(targetPath, { force: true });
|
|
149
|
+
try {
|
|
150
|
+
const relativeTarget = path.relative(contentDir, sourcePath);
|
|
151
|
+
await symlink(relativeTarget, targetPath);
|
|
152
|
+
}
|
|
153
|
+
catch {
|
|
154
|
+
await copyFile(sourcePath, targetPath);
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
async function writeEnvFile(rendererDir, env) {
|
|
158
|
+
const envLines = [
|
|
159
|
+
`NUXT_CONTENT_PATH=${serializeEnvValue(env.NUXT_CONTENT_PATH)}`,
|
|
160
|
+
`CONTENT_DIR=${serializeEnvValue(env.CONTENT_DIR)}`,
|
|
161
|
+
`MDSITE_CONFIG_PATH=${serializeEnvValue(env.MDSITE_CONFIG_PATH)}`
|
|
162
|
+
];
|
|
163
|
+
await writeFile(path.join(rendererDir, '.env'), `${envLines.join('\n')}\n`, 'utf8');
|
|
164
|
+
}
|
|
165
|
+
async function writeCompatibilityConfigFile(rendererDir, contentDir, config) {
|
|
166
|
+
const compatibilityConfig = {
|
|
167
|
+
siteName: config.site.name,
|
|
168
|
+
siteCanonical: config.site.canonical,
|
|
169
|
+
contentPath: contentDir,
|
|
170
|
+
contentGitRepo: config.server.repo,
|
|
171
|
+
features: config.features,
|
|
172
|
+
themes: config.themes
|
|
173
|
+
};
|
|
174
|
+
await writeFile(path.join(rendererDir, 'content.config.yml'), YAML.stringify(compatibilityConfig), 'utf8');
|
|
175
|
+
}
|
|
176
|
+
async function runRendererScript(rendererDir, env, scriptName) {
|
|
177
|
+
await runForeground('npm', ['run', scriptName], rendererDir, env);
|
|
178
|
+
}
|
|
179
|
+
async function runRendererScriptInBackground(rendererDir, env, scriptName, logPath) {
|
|
180
|
+
return runBackground('npm', ['run', scriptName], rendererDir, env, logPath);
|
|
181
|
+
}
|
|
182
|
+
function serializeEnvValue(value) {
|
|
183
|
+
return JSON.stringify(value ?? '');
|
|
184
|
+
}
|
|
185
|
+
async function pathExists(targetPath) {
|
|
186
|
+
try {
|
|
187
|
+
await access(targetPath);
|
|
188
|
+
return true;
|
|
189
|
+
}
|
|
190
|
+
catch {
|
|
191
|
+
return false;
|
|
192
|
+
}
|
|
193
|
+
}
|
|
194
|
+
//# sourceMappingURL=mdsite-nuxt.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mdsite-nuxt.js","sourceRoot":"","sources":["../../src/renderer/mdsite-nuxt.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,226 @@
|
|
|
1
|
+
import path from 'node:path';
|
|
2
|
+
import { beforeEach, describe, expect, it, vi } from 'vitest';
|
|
3
|
+
vi.mock('node:fs/promises', () => ({
|
|
4
|
+
access: vi.fn(),
|
|
5
|
+
copyFile: vi.fn(),
|
|
6
|
+
cp: vi.fn(),
|
|
7
|
+
mkdir: vi.fn(),
|
|
8
|
+
rm: vi.fn(),
|
|
9
|
+
stat: vi.fn(),
|
|
10
|
+
symlink: vi.fn(),
|
|
11
|
+
writeFile: vi.fn()
|
|
12
|
+
}));
|
|
13
|
+
vi.mock('../config/menu.js', () => ({
|
|
14
|
+
generateMenuFromMarkdownFiles: vi.fn()
|
|
15
|
+
}));
|
|
16
|
+
vi.mock('../process/child-process.js', () => ({
|
|
17
|
+
runForeground: vi.fn(),
|
|
18
|
+
runBackground: vi.fn()
|
|
19
|
+
}));
|
|
20
|
+
import { access, copyFile, cp, mkdir, rm, stat, symlink, writeFile } from 'node:fs/promises';
|
|
21
|
+
import { generateMenuFromMarkdownFiles } from '../config/menu.js';
|
|
22
|
+
import { runBackground, runForeground } from '../process/child-process.js';
|
|
23
|
+
import { ensurePreviewArtifacts, ensureConfiguredRendererInstalled, ensureRendererDependencies, generateRenderer, getRendererGeneratedOutputPath, prepareRendererBackend, prepareConfiguredRenderer, prepareRenderer, previewRendererForeground, previewRendererInBackground, startRendererForeground, startRendererInBackground } from './mdsite-nuxt.js';
|
|
24
|
+
const accessMock = vi.mocked(access);
|
|
25
|
+
const copyFileMock = vi.mocked(copyFile);
|
|
26
|
+
const cpMock = vi.mocked(cp);
|
|
27
|
+
const mkdirMock = vi.mocked(mkdir);
|
|
28
|
+
const rmMock = vi.mocked(rm);
|
|
29
|
+
const statMock = vi.mocked(stat);
|
|
30
|
+
const symlinkMock = vi.mocked(symlink);
|
|
31
|
+
const writeFileMock = vi.mocked(writeFile);
|
|
32
|
+
const generateMenuMock = vi.mocked(generateMenuFromMarkdownFiles);
|
|
33
|
+
const runForegroundMock = vi.mocked(runForeground);
|
|
34
|
+
const runBackgroundMock = vi.mocked(runBackground);
|
|
35
|
+
const baseConfig = {
|
|
36
|
+
favicon: '',
|
|
37
|
+
features: { bibleTooltips: true, sourceEdit: true },
|
|
38
|
+
menu: [],
|
|
39
|
+
server: { output: '.output', path: '.renderer', repo: 'repo' },
|
|
40
|
+
site: { canonical: '', name: 'Docs' },
|
|
41
|
+
themes: {
|
|
42
|
+
light: { colors: { primary: '#111111' } },
|
|
43
|
+
dark: { colors: { primary: '#222222' } }
|
|
44
|
+
}
|
|
45
|
+
};
|
|
46
|
+
describe('mdsite-nuxt renderer helpers', () => {
|
|
47
|
+
beforeEach(() => {
|
|
48
|
+
vi.clearAllMocks();
|
|
49
|
+
accessMock.mockResolvedValue(undefined);
|
|
50
|
+
statMock.mockResolvedValue({ isDirectory: () => true });
|
|
51
|
+
generateMenuMock.mockResolvedValue(['generated/page']);
|
|
52
|
+
runBackgroundMock.mockResolvedValue(999);
|
|
53
|
+
});
|
|
54
|
+
it('prepareRenderer prefers the configured renderer dir, generates a menu file, and writes bridge config/env files', async () => {
|
|
55
|
+
const contentDir = '/workspace/content';
|
|
56
|
+
const rendererDir = path.resolve(contentDir, '.renderer');
|
|
57
|
+
const prepared = await prepareRenderer(contentDir, baseConfig);
|
|
58
|
+
expect(prepared.rendererDir).toBe(rendererDir);
|
|
59
|
+
expect(prepared.rendererEnv.NUXT_CONTENT_PATH).toBe(contentDir);
|
|
60
|
+
expect(prepared.rendererEnv.MDSITE_CONFIG_PATH).toBe(path.join(contentDir, 'mdsite.yml'));
|
|
61
|
+
expect(generateMenuMock).toHaveBeenCalledWith(contentDir);
|
|
62
|
+
expect(writeFileMock).toHaveBeenCalledWith(path.join(contentDir, '_menu.yml'), '- generated/page\n', 'utf8');
|
|
63
|
+
expect(writeFileMock).toHaveBeenCalledWith(path.join(rendererDir, 'content.config.yml'), expect.stringContaining('siteName: Docs'), 'utf8');
|
|
64
|
+
expect(writeFileMock).toHaveBeenCalledWith(path.join(rendererDir, '.env'), expect.stringContaining(`NUXT_CONTENT_PATH=${JSON.stringify(contentDir)}`), 'utf8');
|
|
65
|
+
});
|
|
66
|
+
it('prepareRenderer uses effective content dir for content files and config dir for renderer path', async () => {
|
|
67
|
+
const configDir = '/workspace';
|
|
68
|
+
const contentDir = '/workspace/docs';
|
|
69
|
+
const rendererDir = path.resolve(configDir, '.renderer');
|
|
70
|
+
const configPath = path.join(configDir, 'mdsite.yml');
|
|
71
|
+
const prepared = await prepareRenderer(contentDir, baseConfig, { configDir, configPath });
|
|
72
|
+
expect(prepared.rendererDir).toBe(rendererDir);
|
|
73
|
+
expect(prepared.rendererEnv.NUXT_CONTENT_PATH).toBe(contentDir);
|
|
74
|
+
expect(prepared.rendererEnv.CONTENT_DIR).toBe(contentDir);
|
|
75
|
+
expect(prepared.rendererEnv.MDSITE_CONFIG_PATH).toBe(configPath);
|
|
76
|
+
expect(generateMenuMock).toHaveBeenCalledWith(contentDir);
|
|
77
|
+
expect(writeFileMock).toHaveBeenCalledWith(path.join(contentDir, '_menu.yml'), '- generated/page\n', 'utf8');
|
|
78
|
+
});
|
|
79
|
+
it('falls back to the checked-in renderer when the configured renderer dir is absent', async () => {
|
|
80
|
+
const contentDir = '/workspace/content';
|
|
81
|
+
const configuredRendererDir = path.resolve(contentDir, '.renderer');
|
|
82
|
+
const checkedInRendererDir = path.resolve(process.cwd(), 'mdsite-nuxt');
|
|
83
|
+
accessMock.mockImplementation(async (targetPath) => {
|
|
84
|
+
if (targetPath === configuredRendererDir) {
|
|
85
|
+
throw new Error('missing configured renderer');
|
|
86
|
+
}
|
|
87
|
+
});
|
|
88
|
+
const prepared = await prepareRenderer(contentDir, { ...baseConfig, menu: ['docs/getting-started'] });
|
|
89
|
+
expect(prepared.rendererDir).toBe(checkedInRendererDir);
|
|
90
|
+
expect(writeFileMock).toHaveBeenCalledWith(path.join(contentDir, '_menu.yml'), '- docs/getting-started\n', 'utf8');
|
|
91
|
+
});
|
|
92
|
+
it('prepareConfiguredRenderer resolves the configured renderer dir without checking the repo fallback', async () => {
|
|
93
|
+
const contentDir = '/workspace/content';
|
|
94
|
+
const configuredRendererDir = path.resolve(contentDir, '.renderer');
|
|
95
|
+
const prepared = await prepareConfiguredRenderer(contentDir, baseConfig);
|
|
96
|
+
expect(prepared.rendererDir).toBe(configuredRendererDir);
|
|
97
|
+
expect(statMock).toHaveBeenCalledWith(configuredRendererDir);
|
|
98
|
+
expect(statMock).toHaveBeenCalledTimes(1);
|
|
99
|
+
expect(accessMock).not.toHaveBeenCalled();
|
|
100
|
+
});
|
|
101
|
+
it('prepareConfiguredRenderer throws when the configured renderer directory is missing', async () => {
|
|
102
|
+
const contentDir = '/workspace/content';
|
|
103
|
+
const configuredRendererDir = path.resolve(contentDir, '.renderer');
|
|
104
|
+
statMock.mockRejectedValueOnce(new Error('missing configured renderer'));
|
|
105
|
+
await expect(prepareConfiguredRenderer(contentDir, baseConfig)).rejects.toThrow(`Configured renderer directory not found at ${configuredRendererDir}.`);
|
|
106
|
+
});
|
|
107
|
+
it('prepareConfiguredRenderer throws when the configured renderer path is not a directory', async () => {
|
|
108
|
+
const contentDir = '/workspace/content';
|
|
109
|
+
const configuredRendererDir = path.resolve(contentDir, '.renderer');
|
|
110
|
+
statMock.mockResolvedValueOnce({ isDirectory: () => false });
|
|
111
|
+
await expect(prepareConfiguredRenderer(contentDir, baseConfig)).rejects.toThrow(`Configured renderer path is not a directory: ${configuredRendererDir}`);
|
|
112
|
+
});
|
|
113
|
+
it('ensureConfiguredRendererInstalled creates and populates the configured renderer dir', async () => {
|
|
114
|
+
const contentDir = '/workspace/content';
|
|
115
|
+
const configuredRendererDir = path.resolve(contentDir, '.renderer');
|
|
116
|
+
const checkedInRendererDir = path.resolve(process.cwd(), 'mdsite-nuxt');
|
|
117
|
+
statMock.mockRejectedValueOnce(new Error('missing renderer'));
|
|
118
|
+
await expect(ensureConfiguredRendererInstalled(contentDir, baseConfig)).resolves.toBe(configuredRendererDir);
|
|
119
|
+
expect(mkdirMock).toHaveBeenCalledWith(configuredRendererDir, { recursive: true });
|
|
120
|
+
expect(cpMock).toHaveBeenCalledWith(checkedInRendererDir, configuredRendererDir, expect.objectContaining({
|
|
121
|
+
force: true,
|
|
122
|
+
recursive: true
|
|
123
|
+
}));
|
|
124
|
+
const copyOptions = cpMock.mock.calls[0]?.[2];
|
|
125
|
+
expect(copyOptions?.filter?.(path.join(checkedInRendererDir, 'package.json'), configuredRendererDir)).toBe(true);
|
|
126
|
+
expect(copyOptions?.filter?.(path.join(checkedInRendererDir, 'node_modules'), configuredRendererDir)).toBe(false);
|
|
127
|
+
expect(copyOptions?.filter?.(path.join(checkedInRendererDir, '.nuxt'), configuredRendererDir)).toBe(false);
|
|
128
|
+
expect(copyOptions?.filter?.(path.join(checkedInRendererDir, '.output'), configuredRendererDir)).toBe(false);
|
|
129
|
+
expect(copyOptions?.filter?.(path.join(checkedInRendererDir, 'dist'), configuredRendererDir)).toBe(false);
|
|
130
|
+
expect(copyOptions?.filter?.(path.join(checkedInRendererDir, '.cache'), configuredRendererDir)).toBe(false);
|
|
131
|
+
});
|
|
132
|
+
it('throws an actionable error when neither the configured nor checked-in renderer directory exists', async () => {
|
|
133
|
+
const contentDir = '/workspace/content';
|
|
134
|
+
const configuredRendererDir = path.resolve(contentDir, '.renderer');
|
|
135
|
+
const checkedInRendererDir = path.resolve(process.cwd(), 'mdsite-nuxt');
|
|
136
|
+
accessMock.mockImplementation(async (targetPath) => {
|
|
137
|
+
if (targetPath === configuredRendererDir || targetPath === checkedInRendererDir) {
|
|
138
|
+
throw new Error('missing renderer');
|
|
139
|
+
}
|
|
140
|
+
});
|
|
141
|
+
await expect(prepareRenderer(contentDir, baseConfig)).rejects.toThrow(`Renderer directory not found at ${checkedInRendererDir}. Expected checked-in mdsite-nuxt renderer.`);
|
|
142
|
+
});
|
|
143
|
+
it('throws when the configured favicon file does not exist', async () => {
|
|
144
|
+
const contentDir = '/workspace/content';
|
|
145
|
+
const sourcePath = path.resolve(contentDir, 'assets/favicon.svg');
|
|
146
|
+
accessMock.mockImplementation(async (targetPath) => {
|
|
147
|
+
if (targetPath === sourcePath) {
|
|
148
|
+
throw new Error('missing favicon');
|
|
149
|
+
}
|
|
150
|
+
});
|
|
151
|
+
await expect(prepareRenderer(contentDir, { ...baseConfig, favicon: 'assets/favicon.svg' })).rejects.toThrow(`Configured favicon file not found: ${sourcePath}`);
|
|
152
|
+
});
|
|
153
|
+
it('aliases a configured favicon to logo.svg and falls back to copy when symlink creation fails', async () => {
|
|
154
|
+
const contentDir = '/workspace/content';
|
|
155
|
+
const sourcePath = path.resolve(contentDir, 'assets/favicon.svg');
|
|
156
|
+
const targetPath = path.join(contentDir, 'logo.svg');
|
|
157
|
+
symlinkMock.mockRejectedValueOnce(new Error('symlink blocked'));
|
|
158
|
+
await prepareRenderer(contentDir, { ...baseConfig, favicon: 'assets/favicon.svg', menu: ['docs/page'] });
|
|
159
|
+
expect(rmMock).toHaveBeenCalledWith(targetPath, { force: true });
|
|
160
|
+
expect(symlinkMock).toHaveBeenCalledWith(path.relative(contentDir, sourcePath), targetPath);
|
|
161
|
+
expect(copyFileMock).toHaveBeenCalledWith(sourcePath, targetPath);
|
|
162
|
+
});
|
|
163
|
+
it('skips alias work when favicon already points at logo.svg', async () => {
|
|
164
|
+
const contentDir = '/workspace/content';
|
|
165
|
+
await prepareRenderer(contentDir, { ...baseConfig, favicon: 'logo.svg', menu: ['docs/page'] });
|
|
166
|
+
expect(rmMock).not.toHaveBeenCalled();
|
|
167
|
+
expect(symlinkMock).not.toHaveBeenCalled();
|
|
168
|
+
expect(copyFileMock).not.toHaveBeenCalled();
|
|
169
|
+
});
|
|
170
|
+
it('installs renderer dependencies with npm ci when node_modules is missing and package-lock exists', async () => {
|
|
171
|
+
const rendererDir = '/renderer';
|
|
172
|
+
accessMock.mockImplementation(async (targetPath) => {
|
|
173
|
+
if (targetPath === path.join(rendererDir, 'node_modules')) {
|
|
174
|
+
throw new Error('missing node_modules');
|
|
175
|
+
}
|
|
176
|
+
});
|
|
177
|
+
await ensureRendererDependencies(rendererDir);
|
|
178
|
+
expect(runForegroundMock).toHaveBeenCalledWith('npm', ['ci'], rendererDir, process.env);
|
|
179
|
+
});
|
|
180
|
+
it('installs renderer dependencies with npm install when node_modules and package-lock are missing', async () => {
|
|
181
|
+
const rendererDir = '/renderer';
|
|
182
|
+
const nodeModulesPath = path.join(rendererDir, 'node_modules');
|
|
183
|
+
const packageLockPath = path.join(rendererDir, 'package-lock.json');
|
|
184
|
+
accessMock.mockImplementation(async (targetPath) => {
|
|
185
|
+
if (targetPath === nodeModulesPath || targetPath === packageLockPath) {
|
|
186
|
+
throw new Error('missing path');
|
|
187
|
+
}
|
|
188
|
+
});
|
|
189
|
+
await ensureRendererDependencies(rendererDir);
|
|
190
|
+
expect(runForegroundMock).toHaveBeenCalledWith('npm', ['install'], rendererDir, process.env);
|
|
191
|
+
});
|
|
192
|
+
it('skips renderer dependency install when node_modules exists', async () => {
|
|
193
|
+
const rendererDir = '/renderer';
|
|
194
|
+
await ensureRendererDependencies(rendererDir);
|
|
195
|
+
expect(runForegroundMock).not.toHaveBeenCalled();
|
|
196
|
+
});
|
|
197
|
+
it('checks the generated preview artifact and exposes the generated output path', async () => {
|
|
198
|
+
const rendererDir = '/renderer';
|
|
199
|
+
await expect(ensurePreviewArtifacts(rendererDir)).resolves.toBeUndefined();
|
|
200
|
+
expect(getRendererGeneratedOutputPath(rendererDir)).toBe(path.join(rendererDir, '.output', 'public'));
|
|
201
|
+
expect(accessMock).toHaveBeenCalledWith(path.join(rendererDir, '.output', 'public'));
|
|
202
|
+
accessMock.mockImplementationOnce(async () => {
|
|
203
|
+
throw new Error('missing public output');
|
|
204
|
+
});
|
|
205
|
+
await expect(ensurePreviewArtifacts(rendererDir)).rejects.toThrow('Preview is unavailable. Run `mdsite generate` before `mdsite preview`.');
|
|
206
|
+
});
|
|
207
|
+
it('delegates stable dev/generate/preview script names to child-process helpers', async () => {
|
|
208
|
+
const env = { TEST: '1' };
|
|
209
|
+
await startRendererInBackground('/renderer', env, '/logs/start.log');
|
|
210
|
+
await previewRendererInBackground('/renderer', env, '/logs/preview.log');
|
|
211
|
+
await generateRenderer('/renderer', env);
|
|
212
|
+
await startRendererForeground('/renderer', env);
|
|
213
|
+
await previewRendererForeground('/renderer', env);
|
|
214
|
+
expect(runBackgroundMock).toHaveBeenNthCalledWith(1, 'npm', ['run', 'dev'], '/renderer', env, '/logs/start.log');
|
|
215
|
+
expect(runBackgroundMock).toHaveBeenNthCalledWith(2, 'npm', ['run', 'preview'], '/renderer', env, '/logs/preview.log');
|
|
216
|
+
expect(runForegroundMock).toHaveBeenNthCalledWith(1, 'npm', ['run', 'generate'], '/renderer', env);
|
|
217
|
+
expect(runForegroundMock).toHaveBeenNthCalledWith(2, 'npm', ['run', 'dev'], '/renderer', env);
|
|
218
|
+
expect(runForegroundMock).toHaveBeenNthCalledWith(3, 'npm', ['run', 'preview'], '/renderer', env);
|
|
219
|
+
});
|
|
220
|
+
it('delegates renderer backend preparation to the stable prepare:renderer hook name', async () => {
|
|
221
|
+
const env = { TEST: '1' };
|
|
222
|
+
await prepareRendererBackend('/renderer', env);
|
|
223
|
+
expect(runForegroundMock).toHaveBeenCalledWith('npm', ['run', 'prepare:renderer'], '/renderer', env);
|
|
224
|
+
});
|
|
225
|
+
});
|
|
226
|
+
//# sourceMappingURL=mdsite-nuxt.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mdsite-nuxt.test.js","sourceRoot":"","sources":["../../src/renderer/mdsite-nuxt.test.ts"],"names":[],"mappings":"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"}
|