@life-and-dev/mdsite 0.6.0 → 0.7.1
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 +16 -17
- package/dist/commands/clean.js +28 -10
- package/dist/commands/clean.js.map +1 -1
- package/dist/commands/commands.test.js +49 -21
- package/dist/commands/commands.test.js.map +1 -1
- package/dist/commands/generate.js +5 -4
- package/dist/commands/generate.js.map +1 -1
- package/dist/commands/init.js +2 -2
- package/dist/commands/init.js.map +1 -1
- package/dist/commands/prepare.js +2 -2
- package/dist/commands/prepare.js.map +1 -1
- package/dist/commands/prepare.test.js +9 -10
- package/dist/commands/prepare.test.js.map +1 -1
- package/dist/commands/preview.js +21 -21
- package/dist/commands/preview.js.map +1 -1
- package/dist/commands/start.js +13 -11
- package/dist/commands/start.js.map +1 -1
- package/dist/commands/stop.js +7 -4
- package/dist/commands/stop.js.map +1 -1
- package/dist/commands/workflows.test.js +25 -24
- package/dist/commands/workflows.test.js.map +1 -1
- package/dist/config/default-mdsite-config.js +7 -8
- package/dist/config/default-mdsite-config.js.map +1 -1
- package/dist/config/default-mdsite-config.test.js +7 -8
- package/dist/config/default-mdsite-config.test.js.map +1 -1
- package/dist/config/mdsite-config.d.ts +46 -10
- package/dist/config/mdsite-config.js +46 -24
- package/dist/config/mdsite-config.js.map +1 -1
- package/dist/config/mdsite-config.test.js +55 -50
- package/dist/config/mdsite-config.test.js.map +1 -1
- package/dist/process/child-process.d.ts +4 -0
- package/dist/process/child-process.js +33 -1
- package/dist/process/child-process.js.map +1 -1
- package/dist/process/child-process.test.js +39 -3
- package/dist/process/child-process.test.js.map +1 -1
- package/dist/process/runtime-state.d.ts +13 -5
- package/dist/process/runtime-state.js +21 -13
- package/dist/process/runtime-state.js.map +1 -1
- package/dist/process/runtime-state.test.js +3 -5
- package/dist/process/runtime-state.test.js.map +1 -1
- package/dist/renderer/mdsite-nuxt.d.ts +28 -3
- package/dist/renderer/mdsite-nuxt.js +29 -12
- package/dist/renderer/mdsite-nuxt.js.map +1 -1
- package/dist/renderer/mdsite-nuxt.test.js +34 -12
- package/dist/renderer/mdsite-nuxt.test.js.map +1 -1
- package/mdsite-nuxt/app/components/AppFooter.vue +84 -22
- package/mdsite-nuxt/app/composables/useFooter.test.ts +54 -0
- package/mdsite-nuxt/app/composables/useFooter.ts +48 -31
- package/mdsite-nuxt/app/composables/useSiteConfig.test.ts +13 -87
- package/mdsite-nuxt/app/composables/useSiteConfig.ts +7 -26
- package/mdsite-nuxt/app/composables/useSourceEdit.test.ts +103 -0
- package/mdsite-nuxt/app/composables/useSourceEdit.ts +39 -51
- package/mdsite-nuxt/app/layouts/default.vue +10 -3
- package/mdsite-nuxt/content.config.ts +21 -1
- package/mdsite-nuxt/nuxt.config.ts +21 -14
- package/mdsite-nuxt/scripts/generate-favicons.test.ts +3 -3
- package/mdsite-nuxt/scripts/generate-favicons.ts +4 -4
- package/mdsite-nuxt/scripts/generate-indices.test.ts +221 -11
- package/mdsite-nuxt/scripts/generate-indices.ts +187 -28
- package/mdsite-nuxt/scripts/renderer-hooks.test.ts +0 -86
- package/mdsite-nuxt/scripts/renderer-hooks.ts +1 -48
- package/mdsite-nuxt/scripts/sync-content.ts +39 -1
- package/mdsite-nuxt/utils/mdsite-config.ts +86 -41
- package/package.json +1 -1
- package/mdsite-nuxt/example.config.yml +0 -67
|
@@ -1,25 +1,48 @@
|
|
|
1
1
|
export type MenuItem = string | null | {
|
|
2
2
|
[key: string]: string | null | MenuItem[];
|
|
3
3
|
};
|
|
4
|
+
/**
|
|
5
|
+
* Footer items mirror the `menu` shape but with no nested sub-menus. Each item
|
|
6
|
+
* is one of:
|
|
7
|
+
* - a bare markdown file name (string) — title is read from the file's H1
|
|
8
|
+
* - `null` — rendered as a vertical separator
|
|
9
|
+
* - a single-key object — the key is the link text, the value is either an
|
|
10
|
+
* internal markdown path or an external URL (http/https)
|
|
11
|
+
*
|
|
12
|
+
* Lives under `features.footer` in `mdsite.yml`.
|
|
13
|
+
*/
|
|
14
|
+
export type FooterItem = string | null | {
|
|
15
|
+
[key: string]: string | null;
|
|
16
|
+
};
|
|
4
17
|
export interface MdsiteConfig {
|
|
5
|
-
content?: {
|
|
6
|
-
path?: string;
|
|
7
|
-
};
|
|
8
|
-
favicon: string;
|
|
9
18
|
features: {
|
|
10
19
|
bibleTooltips: boolean;
|
|
11
|
-
|
|
20
|
+
/**
|
|
21
|
+
* URL prefix for the "Edit on GitHub" link. The renderer appends
|
|
22
|
+
* `<route>.md` to this value to build the edit URL, so the prefix should
|
|
23
|
+
* end with `/` (e.g. `https://github.com/org/repo/blob/main/`). An
|
|
24
|
+
* empty string disables the edit button entirely.
|
|
25
|
+
*/
|
|
26
|
+
sourceEdit: string;
|
|
27
|
+
/**
|
|
28
|
+
* Footer items mirror the `menu` shape but with no nested sub-menus.
|
|
29
|
+
* Each item is one of:
|
|
30
|
+
* - a bare markdown file name (string) — title is read from the file's H1
|
|
31
|
+
* - `null` — rendered as a vertical separator
|
|
32
|
+
* - a single-key object — the key is the link text, the value is either
|
|
33
|
+
* an internal markdown path or an external URL (http/https)
|
|
34
|
+
*/
|
|
35
|
+
footer: FooterItem[];
|
|
12
36
|
};
|
|
13
37
|
menu: MenuItem[];
|
|
14
|
-
|
|
15
|
-
|
|
38
|
+
paths: {
|
|
39
|
+
input: string;
|
|
40
|
+
build: string;
|
|
16
41
|
output: string;
|
|
17
|
-
path: string;
|
|
18
|
-
repo: string;
|
|
19
|
-
gitBranch: string;
|
|
20
42
|
};
|
|
21
43
|
site: {
|
|
22
44
|
canonical: string;
|
|
45
|
+
favicon: string;
|
|
23
46
|
name: string;
|
|
24
47
|
};
|
|
25
48
|
themes: {
|
|
@@ -31,6 +54,19 @@ export interface MdsiteConfig {
|
|
|
31
54
|
};
|
|
32
55
|
};
|
|
33
56
|
}
|
|
57
|
+
/**
|
|
58
|
+
* Recursive variant of `Partial<T>` for object shapes. Recurses into nested
|
|
59
|
+
* objects so callers can override a single leaf field without restating the
|
|
60
|
+
* rest of the tree. Arrays are passed through unchanged — they should be
|
|
61
|
+
* replaced wholesale, not partially merged — and primitives pass through too.
|
|
62
|
+
*
|
|
63
|
+
* Use this for test/build helpers that layer overrides over a full default
|
|
64
|
+
* object — `Partial<MdsiteConfig>` is too shallow because it only makes the
|
|
65
|
+
* top-level keys optional.
|
|
66
|
+
*/
|
|
67
|
+
export type DeepPartial<T> = T extends ReadonlyArray<unknown> ? T : T extends object ? {
|
|
68
|
+
[K in keyof T]?: DeepPartial<T[K]>;
|
|
69
|
+
} : T;
|
|
34
70
|
export interface LoadedMdsiteConfig {
|
|
35
71
|
config: MdsiteConfig;
|
|
36
72
|
configDir: string;
|
|
@@ -3,6 +3,28 @@ import path from 'node:path';
|
|
|
3
3
|
import YAML from 'yaml';
|
|
4
4
|
import { createDefaultMdsiteConfig } from './default-mdsite-config.js';
|
|
5
5
|
import { deriveSiteNameFromIndex, generateMenuFromMarkdownFiles } from './menu.js';
|
|
6
|
+
/**
|
|
7
|
+
* Runtime type-guard for entries inside the `footer:` YAML list. Accepts:
|
|
8
|
+
* - non-empty strings (file names / external URLs)
|
|
9
|
+
* - `null` (separator)
|
|
10
|
+
* - single-key objects whose value is a string or `null`
|
|
11
|
+
* Drops anything else silently to stay backwards-compatible with malformed
|
|
12
|
+
* user input; the renderer mirrors this filter.
|
|
13
|
+
*/
|
|
14
|
+
function isValidFooterItem(item) {
|
|
15
|
+
if (item === null)
|
|
16
|
+
return true;
|
|
17
|
+
if (typeof item === 'string')
|
|
18
|
+
return item.trim().length > 0;
|
|
19
|
+
if (typeof item === 'object') {
|
|
20
|
+
const keys = Object.keys(item);
|
|
21
|
+
if (keys.length !== 1)
|
|
22
|
+
return false;
|
|
23
|
+
const value = item[keys[0]];
|
|
24
|
+
return value === null || typeof value === 'string';
|
|
25
|
+
}
|
|
26
|
+
return false;
|
|
27
|
+
}
|
|
6
28
|
const configFileName = 'mdsite.yml';
|
|
7
29
|
export async function loadMdsiteConfig(configDir) {
|
|
8
30
|
const configPath = path.join(configDir, configFileName);
|
|
@@ -32,26 +54,26 @@ export function serializeMdsiteConfig(config) {
|
|
|
32
54
|
}
|
|
33
55
|
async function normalizeMdsiteConfig(rawConfig, contentDir) {
|
|
34
56
|
const fallbackConfig = await buildDefaultMdsiteConfig(contentDir);
|
|
35
|
-
const
|
|
57
|
+
const inputPath = resolveInputConfigPath(rawConfig.paths?.input);
|
|
36
58
|
return {
|
|
37
|
-
favicon: typeof rawConfig.favicon === 'string' ? rawConfig.favicon : fallbackConfig.favicon,
|
|
38
59
|
features: {
|
|
39
|
-
bibleTooltips: rawConfig.features?.
|
|
40
|
-
sourceEdit: rawConfig.features?.
|
|
60
|
+
bibleTooltips: rawConfig.features?.['bible-tooltips'] ?? fallbackConfig.features.bibleTooltips,
|
|
61
|
+
sourceEdit: typeof rawConfig.features?.['source-edit'] === 'string'
|
|
62
|
+
? rawConfig.features['source-edit']
|
|
63
|
+
: fallbackConfig.features.sourceEdit,
|
|
64
|
+
footer: Array.isArray(rawConfig.features?.footer)
|
|
65
|
+
? rawConfig.features.footer.filter(isValidFooterItem)
|
|
66
|
+
: fallbackConfig.features.footer
|
|
41
67
|
},
|
|
42
|
-
content: contentPath ? { path: contentPath } : fallbackConfig.content,
|
|
43
68
|
menu: Array.isArray(rawConfig.menu) ? rawConfig.menu : fallbackConfig.menu,
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
repo: typeof rawConfig.server?.repo === 'string' ? rawConfig.server.repo : fallbackConfig.server.repo,
|
|
49
|
-
gitBranch: typeof rawConfig.server?.['git-branch'] === 'string' && rawConfig.server['git-branch'].trim()
|
|
50
|
-
? rawConfig.server['git-branch']
|
|
51
|
-
: fallbackConfig.server.gitBranch
|
|
69
|
+
paths: {
|
|
70
|
+
input: inputPath ?? fallbackConfig.paths.input,
|
|
71
|
+
build: typeof rawConfig.paths?.build === 'string' ? rawConfig.paths.build : fallbackConfig.paths.build,
|
|
72
|
+
output: typeof rawConfig.paths?.output === 'string' ? rawConfig.paths.output : fallbackConfig.paths.output
|
|
52
73
|
},
|
|
53
74
|
site: {
|
|
54
75
|
canonical: typeof rawConfig.site?.canonical === 'string' ? rawConfig.site.canonical : fallbackConfig.site.canonical,
|
|
76
|
+
favicon: typeof rawConfig.site?.favicon === 'string' ? rawConfig.site.favicon : fallbackConfig.site.favicon,
|
|
55
77
|
name: typeof rawConfig.site?.name === 'string' && rawConfig.site.name.trim() ? rawConfig.site.name : fallbackConfig.site.name
|
|
56
78
|
},
|
|
57
79
|
themes: {
|
|
@@ -71,25 +93,25 @@ async function normalizeMdsiteConfig(rawConfig, contentDir) {
|
|
|
71
93
|
};
|
|
72
94
|
}
|
|
73
95
|
export function resolveContentOutputPath(contentDir, config) {
|
|
74
|
-
return path.resolve(contentDir, config.
|
|
96
|
+
return path.resolve(contentDir, config.paths.output, 'public');
|
|
75
97
|
}
|
|
76
98
|
/**
|
|
77
|
-
* Extract the content path from either
|
|
78
|
-
* (`
|
|
79
|
-
*
|
|
99
|
+
* Extract the content path from `paths.input`. Accepts either a shorthand
|
|
100
|
+
* string form (`paths: { input: docs }`) or a nested object form. Returns
|
|
101
|
+
* undefined when no usable path is configured.
|
|
80
102
|
*/
|
|
81
|
-
function
|
|
82
|
-
if (typeof
|
|
83
|
-
const trimmed =
|
|
103
|
+
function resolveInputConfigPath(rawInput) {
|
|
104
|
+
if (typeof rawInput === 'string') {
|
|
105
|
+
const trimmed = rawInput.trim();
|
|
84
106
|
return trimmed.length > 0 ? trimmed : undefined;
|
|
85
107
|
}
|
|
86
|
-
if (
|
|
87
|
-
return
|
|
108
|
+
if (rawInput && typeof rawInput === 'object' && typeof rawInput.path === 'string') {
|
|
109
|
+
return rawInput.path;
|
|
88
110
|
}
|
|
89
111
|
return undefined;
|
|
90
112
|
}
|
|
91
113
|
export function resolveConfiguredContentDir(configDir, rawConfig) {
|
|
92
|
-
const
|
|
93
|
-
return
|
|
114
|
+
const inputPath = resolveInputConfigPath(rawConfig.paths?.input);
|
|
115
|
+
return inputPath ? path.resolve(configDir, inputPath) : configDir;
|
|
94
116
|
}
|
|
95
117
|
//# sourceMappingURL=mdsite-config.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mdsite-config.js","sourceRoot":"","sources":["../../src/config/mdsite-config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAA;AAC3C,OAAO,IAAI,MAAM,WAAW,CAAA;AAE5B,OAAO,IAAI,MAAM,MAAM,CAAA;AAEvB,OAAO,EAAE,yBAAyB,EAAE,MAAM,4BAA4B,CAAA;AACtE,OAAO,EAAE,uBAAuB,EAAE,6BAA6B,EAAE,MAAM,WAAW,CAAA;
|
|
1
|
+
{"version":3,"file":"mdsite-config.js","sourceRoot":"","sources":["../../src/config/mdsite-config.ts"],"names":[],"mappings":"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"}
|
|
@@ -20,7 +20,7 @@ describe('mdsite config helpers', () => {
|
|
|
20
20
|
const config = await buildDefaultMdsiteConfig(contentDir);
|
|
21
21
|
expect(config.site.name).toBe('My Docs');
|
|
22
22
|
expect(config.menu).toEqual(['guide']);
|
|
23
|
-
expect(config.
|
|
23
|
+
expect(config.paths.output).toBe('.output');
|
|
24
24
|
});
|
|
25
25
|
it('serializeMdsiteConfig returns yaml text with the configured values', async () => {
|
|
26
26
|
const contentDir = await makeTempDir();
|
|
@@ -39,15 +39,15 @@ describe('mdsite config helpers', () => {
|
|
|
39
39
|
await writeFile(path.join(contentDir, 'index.md'), '# Derived Name', 'utf8');
|
|
40
40
|
await writeFile(path.join(contentDir, 'guide.md'), '# Guide', 'utf8');
|
|
41
41
|
await writeFile(path.join(contentDir, 'mdsite.yml'), [
|
|
42
|
-
'favicon: assets/favicon.svg',
|
|
43
42
|
'features:',
|
|
44
|
-
'
|
|
43
|
+
' bible-tooltips: false',
|
|
45
44
|
'menu:',
|
|
46
45
|
' - custom/page',
|
|
47
|
-
'
|
|
46
|
+
'paths:',
|
|
48
47
|
' output: dist/public',
|
|
49
|
-
'
|
|
48
|
+
' build: .renderer',
|
|
50
49
|
'site:',
|
|
50
|
+
' favicon: assets/favicon.svg',
|
|
51
51
|
' canonical: https://example.test',
|
|
52
52
|
' name: " "',
|
|
53
53
|
'themes:',
|
|
@@ -62,21 +62,22 @@ describe('mdsite config helpers', () => {
|
|
|
62
62
|
const loaded = await loadMdsiteConfig(contentDir);
|
|
63
63
|
expect(loaded.configPath).toBe(path.join(contentDir, 'mdsite.yml'));
|
|
64
64
|
expect(loaded.contentDir).toBe(contentDir);
|
|
65
|
-
expect(loaded.config.favicon).toBe('assets/favicon.svg');
|
|
65
|
+
expect(loaded.config.site.favicon).toBe('assets/favicon.svg');
|
|
66
66
|
expect(loaded.config.features).toEqual({
|
|
67
67
|
bibleTooltips: false,
|
|
68
|
-
sourceEdit:
|
|
68
|
+
sourceEdit: '',
|
|
69
|
+
footer: []
|
|
69
70
|
});
|
|
70
71
|
expect(loaded.config.menu).toEqual(['custom/page']);
|
|
71
|
-
expect(loaded.config.footer).toEqual([]);
|
|
72
|
-
expect(loaded.config.
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
gitBranch: 'main'
|
|
72
|
+
expect(loaded.config.features.footer).toEqual([]);
|
|
73
|
+
expect(loaded.config.paths).toEqual({
|
|
74
|
+
input: '',
|
|
75
|
+
build: '.renderer',
|
|
76
|
+
output: 'dist/public'
|
|
77
77
|
});
|
|
78
78
|
expect(loaded.config.site).toEqual({
|
|
79
79
|
canonical: 'https://example.test',
|
|
80
|
+
favicon: 'assets/favicon.svg',
|
|
80
81
|
name: 'Derived Name'
|
|
81
82
|
});
|
|
82
83
|
expect(loaded.config.themes.light.colors.primary).toBe('#123456');
|
|
@@ -84,27 +85,51 @@ describe('mdsite config helpers', () => {
|
|
|
84
85
|
expect(loaded.config.themes.dark.colors.outline).toBe('#abcdef');
|
|
85
86
|
expect(loaded.config.themes.dark.colors.primary).toBe('#58a6ff');
|
|
86
87
|
});
|
|
87
|
-
it('loadMdsiteConfig reads footer: as a flat string array', async () => {
|
|
88
|
+
it('loadMdsiteConfig reads features.footer: as a flat string array', async () => {
|
|
88
89
|
const contentDir = await makeTempDir();
|
|
89
90
|
await writeFile(path.join(contentDir, 'index.md'), '# Home', 'utf8');
|
|
90
91
|
await writeFile(path.join(contentDir, 'about.md'), '# About', 'utf8');
|
|
91
92
|
await writeFile(path.join(contentDir, 'contacts.md'), '# Contacts', 'utf8');
|
|
92
93
|
await writeFile(path.join(contentDir, 'mdsite.yml'), [
|
|
93
|
-
'
|
|
94
|
-
'
|
|
95
|
-
'
|
|
96
|
-
'
|
|
94
|
+
'features:',
|
|
95
|
+
' footer:',
|
|
96
|
+
' - about',
|
|
97
|
+
' - contacts',
|
|
98
|
+
' - not-a-string: 1',
|
|
99
|
+
''
|
|
100
|
+
].join('\n'), 'utf8');
|
|
101
|
+
const loaded = await loadMdsiteConfig(contentDir);
|
|
102
|
+
expect(loaded.config.features.footer).toEqual(['about', 'contacts']);
|
|
103
|
+
});
|
|
104
|
+
it('loadMdsiteConfig accepts menu-shaped footer entries (custom labels, external URLs, separators)', async () => {
|
|
105
|
+
const contentDir = await makeTempDir();
|
|
106
|
+
await writeFile(path.join(contentDir, 'about.md'), '# About', 'utf8');
|
|
107
|
+
await writeFile(path.join(contentDir, 'mdsite.yml'), [
|
|
108
|
+
'features:',
|
|
109
|
+
' footer:',
|
|
110
|
+
' - about',
|
|
111
|
+
' - "About Page": about',
|
|
112
|
+
' - "GitHub Repo": https://github.com/life-and-dev/mdsite',
|
|
113
|
+
' - null',
|
|
114
|
+
' - "Multi":',
|
|
115
|
+
' - nested: not allowed',
|
|
116
|
+
' - { too: many, keys: true }',
|
|
97
117
|
''
|
|
98
118
|
].join('\n'), 'utf8');
|
|
99
119
|
const loaded = await loadMdsiteConfig(contentDir);
|
|
100
|
-
expect(loaded.config.footer).toEqual([
|
|
120
|
+
expect(loaded.config.features.footer).toEqual([
|
|
121
|
+
'about',
|
|
122
|
+
{ 'About Page': 'about' },
|
|
123
|
+
{ 'GitHub Repo': 'https://github.com/life-and-dev/mdsite' },
|
|
124
|
+
null,
|
|
125
|
+
]);
|
|
101
126
|
});
|
|
102
|
-
it('loadMdsiteConfig resolves
|
|
127
|
+
it('loadMdsiteConfig resolves paths.input relative to the config directory', async () => {
|
|
103
128
|
const configDir = await makeTempDir();
|
|
104
129
|
const contentDir = path.join(configDir, 'docs');
|
|
105
130
|
await writeFile(path.join(configDir, 'mdsite.yml'), [
|
|
106
|
-
'
|
|
107
|
-
'
|
|
131
|
+
'paths:',
|
|
132
|
+
' input: docs',
|
|
108
133
|
'site:',
|
|
109
134
|
' name: Root Config Docs',
|
|
110
135
|
''
|
|
@@ -115,13 +140,14 @@ describe('mdsite config helpers', () => {
|
|
|
115
140
|
expect(loaded.configDir).toBe(configDir);
|
|
116
141
|
expect(loaded.configPath).toBe(path.join(configDir, 'mdsite.yml'));
|
|
117
142
|
expect(loaded.contentDir).toBe(contentDir);
|
|
118
|
-
expect(loaded.config.
|
|
143
|
+
expect(loaded.config.paths.input).toBe('docs');
|
|
119
144
|
});
|
|
120
|
-
it('loadMdsiteConfig resolves the
|
|
145
|
+
it('loadMdsiteConfig resolves the paths.input string shorthand relative to the config directory', async () => {
|
|
121
146
|
const configDir = await makeTempDir();
|
|
122
147
|
const contentDir = path.join(configDir, 'content');
|
|
123
148
|
await writeFile(path.join(configDir, 'mdsite.yml'), [
|
|
124
|
-
'
|
|
149
|
+
'paths:',
|
|
150
|
+
' input: content',
|
|
125
151
|
'site:',
|
|
126
152
|
' name: Shorthand Content',
|
|
127
153
|
''
|
|
@@ -130,38 +156,17 @@ describe('mdsite config helpers', () => {
|
|
|
130
156
|
await writeFile(path.join(contentDir, 'index.md'), '# Shorthand Index', 'utf8');
|
|
131
157
|
const loaded = await loadMdsiteConfig(configDir);
|
|
132
158
|
expect(loaded.contentDir).toBe(contentDir);
|
|
133
|
-
expect(loaded.config.
|
|
159
|
+
expect(loaded.config.paths.input).toBe('content');
|
|
134
160
|
});
|
|
135
161
|
it('resolveContentOutputPath resolves the configured output relative to the content directory', () => {
|
|
136
162
|
const contentDir = '/tmp/example';
|
|
137
163
|
expect(resolveContentOutputPath(contentDir, {
|
|
138
|
-
|
|
139
|
-
features: { bibleTooltips: true, sourceEdit: true },
|
|
164
|
+
features: { bibleTooltips: true, sourceEdit: '', footer: [] },
|
|
140
165
|
menu: [],
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
site: { canonical: '', name: 'Docs' },
|
|
166
|
+
paths: { input: '', build: '.mdsite', output: 'public/site' },
|
|
167
|
+
site: { canonical: '', favicon: '', name: 'Docs' },
|
|
144
168
|
themes: { light: { colors: {} }, dark: { colors: {} } }
|
|
145
169
|
})).toBe(path.resolve(contentDir, 'public', 'site', 'public'));
|
|
146
170
|
});
|
|
147
|
-
it('loadMdsiteConfig reads server.git-branch and defaults to "main" when missing or blank', async () => {
|
|
148
|
-
const contentDir = await makeTempDir();
|
|
149
|
-
await writeFile(path.join(contentDir, 'index.md'), '# Home', 'utf8');
|
|
150
|
-
const writeConfig = (branch) => writeFile(path.join(contentDir, 'mdsite.yml'), branch === undefined
|
|
151
|
-
? 'site:\n name: Home\n'
|
|
152
|
-
: `site:\n name: Home\nserver:\n git-branch: ${branch}\n`, 'utf8');
|
|
153
|
-
// Missing -> default 'main'
|
|
154
|
-
await writeConfig();
|
|
155
|
-
const defaulted = await loadMdsiteConfig(contentDir);
|
|
156
|
-
expect(defaulted.config.server.gitBranch).toBe('main');
|
|
157
|
-
// Explicit value -> preserved
|
|
158
|
-
await writeConfig('develop');
|
|
159
|
-
const customized = await loadMdsiteConfig(contentDir);
|
|
160
|
-
expect(customized.config.server.gitBranch).toBe('develop');
|
|
161
|
-
// Blank string -> default 'main'
|
|
162
|
-
await writeConfig(' ');
|
|
163
|
-
const blanked = await loadMdsiteConfig(contentDir);
|
|
164
|
-
expect(blanked.config.server.gitBranch).toBe('main');
|
|
165
|
-
});
|
|
166
171
|
});
|
|
167
172
|
//# sourceMappingURL=mdsite-config.test.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mdsite-config.test.js","sourceRoot":"","sources":["../../src/config/mdsite-config.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAA;AAChE,OAAO,EAAE,MAAM,SAAS,CAAA;AACxB,OAAO,IAAI,MAAM,WAAW,CAAA;AAE5B,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAA;AAExD,OAAO,EACL,wBAAwB,EACxB,gBAAgB,EAChB,wBAAwB,EACxB,qBAAqB,EACtB,MAAM,oBAAoB,CAAA;AAE3B,MAAM,QAAQ,GAAa,EAAE,CAAA;AAE7B,KAAK,UAAU,WAAW;IACxB,MAAM,GAAG,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,MAAM,EAAE,EAAE,gBAAgB,CAAC,CAAC,CAAA;IACnE,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;IAClB,OAAO,GAAG,CAAA;AACZ,CAAC;AAED,SAAS,CAAC,KAAK,IAAI,EAAE;IACnB,MAAM,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,EAAE,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAA;AAC/F,CAAC,CAAC,CAAA;AAEF,QAAQ,CAAC,uBAAuB,EAAE,GAAG,EAAE;IACrC,EAAE,CAAC,6EAA6E,EAAE,KAAK,IAAI,EAAE;QAC3F,MAAM,UAAU,GAAG,MAAM,WAAW,EAAE,CAAA;QACtC,MAAM,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,UAAU,CAAC,EAAE,WAAW,EAAE,MAAM,CAAC,CAAA;QACvE,MAAM,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,UAAU,CAAC,EAAE,SAAS,EAAE,MAAM,CAAC,CAAA;QAErE,MAAM,MAAM,GAAG,MAAM,wBAAwB,CAAC,UAAU,CAAC,CAAA;QAEzD,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAA;QACxC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,OAAO,CAAC,CAAC,CAAA;QACtC,MAAM,CAAC,MAAM,CAAC,
|
|
1
|
+
{"version":3,"file":"mdsite-config.test.js","sourceRoot":"","sources":["../../src/config/mdsite-config.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -6,4 +6,8 @@ export declare function waitForTcpPort(host: string, port: number, options?: {
|
|
|
6
6
|
timeoutMs?: number;
|
|
7
7
|
connectTimeoutMs?: number;
|
|
8
8
|
}): Promise<boolean>;
|
|
9
|
+
export declare function waitForRendererPort(logPath: string, fallbackPort: number, options?: {
|
|
10
|
+
retryIntervalMs?: number;
|
|
11
|
+
timeoutMs?: number;
|
|
12
|
+
}): Promise<number>;
|
|
9
13
|
export declare function stopProcess(pid: number): Promise<boolean>;
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { mkdir, open } from 'node:fs/promises';
|
|
1
|
+
import { mkdir, open, readFile } from 'node:fs/promises';
|
|
2
2
|
import { spawn } from 'node:child_process';
|
|
3
3
|
import net from 'node:net';
|
|
4
4
|
import path from 'node:path';
|
|
@@ -73,6 +73,38 @@ export async function waitForTcpPort(host, port, options = {}) {
|
|
|
73
73
|
}
|
|
74
74
|
return false;
|
|
75
75
|
}
|
|
76
|
+
// Matches Nuxt dev ("Local: http://host:port/") and Nitro preview
|
|
77
|
+
// ("Listening on http://[::]:port") URLs so the CLI can follow the
|
|
78
|
+
// fallback port Nuxt picks when the requested one is occupied.
|
|
79
|
+
// The host portion is non-greedy and tolerates both bare hostnames
|
|
80
|
+
// and IPv6 brackets (which contain ":"), and the trailing lookahead
|
|
81
|
+
// stops the host group from swallowing the port digits.
|
|
82
|
+
const LISTENING_URL_PATTERN = /(?:Local|Listening on)[\s:]*https?:\/\/(?:[^\s]+?):(\d+)(?=\D|$)/i;
|
|
83
|
+
export async function waitForRendererPort(logPath, fallbackPort, options = {}) {
|
|
84
|
+
const retryIntervalMs = options.retryIntervalMs ?? 100;
|
|
85
|
+
const timeoutMs = options.timeoutMs ?? 5_000;
|
|
86
|
+
const deadline = Date.now() + timeoutMs;
|
|
87
|
+
while (Date.now() < deadline) {
|
|
88
|
+
try {
|
|
89
|
+
const content = await readFile(logPath, 'utf8');
|
|
90
|
+
const match = content.match(LISTENING_URL_PATTERN);
|
|
91
|
+
if (match) {
|
|
92
|
+
const detected = Number.parseInt(match[1], 10);
|
|
93
|
+
if (Number.isFinite(detected)) {
|
|
94
|
+
return detected;
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
catch {
|
|
99
|
+
// Log file may not exist yet; keep polling until the deadline.
|
|
100
|
+
}
|
|
101
|
+
if (Date.now() >= deadline) {
|
|
102
|
+
break;
|
|
103
|
+
}
|
|
104
|
+
await new Promise((resolve) => setTimeout(resolve, retryIntervalMs));
|
|
105
|
+
}
|
|
106
|
+
return fallbackPort;
|
|
107
|
+
}
|
|
76
108
|
export async function stopProcess(pid) {
|
|
77
109
|
if (!isRunning(pid)) {
|
|
78
110
|
return false;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"child-process.js","sourceRoot":"","sources":["../../src/process/child-process.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAA;
|
|
1
|
+
{"version":3,"file":"child-process.js","sourceRoot":"","sources":["../../src/process/child-process.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,13 +1,15 @@
|
|
|
1
1
|
import { beforeEach, describe, expect, it, vi } from 'vitest';
|
|
2
|
-
const { mkdirMock, openMock, spawnMock, connectMock } = vi.hoisted(() => ({
|
|
2
|
+
const { mkdirMock, openMock, readFileMock, spawnMock, connectMock } = vi.hoisted(() => ({
|
|
3
3
|
mkdirMock: vi.fn(),
|
|
4
4
|
openMock: vi.fn(),
|
|
5
|
+
readFileMock: vi.fn(),
|
|
5
6
|
spawnMock: vi.fn(),
|
|
6
7
|
connectMock: vi.fn()
|
|
7
8
|
}));
|
|
8
9
|
vi.mock('node:fs/promises', () => ({
|
|
9
10
|
mkdir: mkdirMock,
|
|
10
|
-
open: openMock
|
|
11
|
+
open: openMock,
|
|
12
|
+
readFile: readFileMock
|
|
11
13
|
}));
|
|
12
14
|
vi.mock('node:child_process', () => ({
|
|
13
15
|
spawn: spawnMock
|
|
@@ -17,7 +19,7 @@ vi.mock('node:net', () => ({
|
|
|
17
19
|
connect: connectMock
|
|
18
20
|
}
|
|
19
21
|
}));
|
|
20
|
-
import { openUrlInBrowser, runBackground, waitForTcpPort } from './child-process.js';
|
|
22
|
+
import { openUrlInBrowser, runBackground, waitForRendererPort, waitForTcpPort } from './child-process.js';
|
|
21
23
|
describe('child-process helpers', () => {
|
|
22
24
|
beforeEach(() => {
|
|
23
25
|
vi.clearAllMocks();
|
|
@@ -127,5 +129,39 @@ describe('child-process helpers', () => {
|
|
|
127
129
|
await expect(waitPromise).resolves.toBe(false);
|
|
128
130
|
expect(connectMock).toHaveBeenCalledTimes(3);
|
|
129
131
|
});
|
|
132
|
+
it('waitForRendererPort detects the Nuxt dev fallback port from the Local URL', async () => {
|
|
133
|
+
vi.useFakeTimers();
|
|
134
|
+
readFileMock
|
|
135
|
+
.mockRejectedValueOnce(new Error('ENOENT'))
|
|
136
|
+
.mockResolvedValueOnce(' ➜ Local: http://localhost:3001/\n ➜ Network: http://10.0.0.5:3001/\n');
|
|
137
|
+
const waitPromise = waitForRendererPort('/content/.mdsite/live.log', 3000, { retryIntervalMs: 25, timeoutMs: 200 });
|
|
138
|
+
await vi.advanceTimersByTimeAsync(50);
|
|
139
|
+
await expect(waitPromise).resolves.toBe(3001);
|
|
140
|
+
expect(readFileMock).toHaveBeenCalledWith('/content/.mdsite/live.log', 'utf8');
|
|
141
|
+
});
|
|
142
|
+
it('waitForRendererPort detects the Nitro preview fallback port from the Listening URL', async () => {
|
|
143
|
+
vi.useFakeTimers();
|
|
144
|
+
readFileMock.mockResolvedValueOnce('Listening on http://[::]:4173\n');
|
|
145
|
+
const waitPromise = waitForRendererPort('/content/.mdsite/static.log', 4173, { retryIntervalMs: 25, timeoutMs: 200 });
|
|
146
|
+
await vi.advanceTimersByTimeAsync(50);
|
|
147
|
+
await expect(waitPromise).resolves.toBe(4173);
|
|
148
|
+
});
|
|
149
|
+
it('waitForRendererPort returns the fallback port when no listening URL is logged before the timeout', async () => {
|
|
150
|
+
vi.useFakeTimers();
|
|
151
|
+
readFileMock.mockRejectedValue(new Error('ENOENT'));
|
|
152
|
+
const waitPromise = waitForRendererPort('/content/.mdsite/live.log', 3000, { retryIntervalMs: 25, timeoutMs: 60 });
|
|
153
|
+
await vi.advanceTimersByTimeAsync(100);
|
|
154
|
+
await expect(waitPromise).resolves.toBe(3000);
|
|
155
|
+
});
|
|
156
|
+
it('waitForRendererPort keeps polling across partial log writes until the URL appears', async () => {
|
|
157
|
+
vi.useFakeTimers();
|
|
158
|
+
readFileMock
|
|
159
|
+
.mockResolvedValueOnce('Nuxt 4 starting...\n')
|
|
160
|
+
.mockResolvedValueOnce('Nuxt 4 starting...\n ➜ Local: http://localhost:3002/\n');
|
|
161
|
+
const waitPromise = waitForRendererPort('/content/.mdsite/live.log', 3000, { retryIntervalMs: 25, timeoutMs: 200 });
|
|
162
|
+
await vi.advanceTimersByTimeAsync(75);
|
|
163
|
+
await expect(waitPromise).resolves.toBe(3002);
|
|
164
|
+
expect(readFileMock.mock.calls.length).toBeGreaterThanOrEqual(2);
|
|
165
|
+
});
|
|
130
166
|
});
|
|
131
167
|
//# sourceMappingURL=child-process.test.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"child-process.test.js","sourceRoot":"","sources":["../../src/process/child-process.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAA;AAE7D,MAAM,EAAE,SAAS,EAAE,QAAQ,EAAE,SAAS,EAAE,WAAW,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"child-process.test.js","sourceRoot":"","sources":["../../src/process/child-process.test.ts"],"names":[],"mappings":"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"}
|