@life-and-dev/mdsite 0.5.3 → 0.7.0
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 +29 -37
- package/dist/commands/clean.d.ts +1 -0
- package/dist/commands/clean.js +70 -0
- package/dist/commands/clean.js.map +1 -0
- package/dist/commands/commands.test.js +157 -75
- 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 +5 -64
- package/dist/commands/init.js.map +1 -1
- package/dist/commands/prepare.js +2 -14
- package/dist/commands/prepare.js.map +1 -1
- package/dist/commands/prepare.test.js +26 -24
- 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 +42 -56
- 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/index.js +8 -2
- package/dist/index.js.map +1 -1
- package/dist/index.test.js +13 -0
- package/dist/index.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 +41 -5
- 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 +25 -13
- package/dist/process/runtime-state.js.map +1 -1
- package/dist/process/runtime-state.test.js +10 -10
- 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 +32 -27
- package/dist/renderer/mdsite-nuxt.js.map +1 -1
- package/dist/renderer/mdsite-nuxt.test.js +40 -39
- 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/nuxt.config.ts +22 -15
- 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 +71 -10
- package/mdsite-nuxt/scripts/generate-indices.ts +161 -27
- package/mdsite-nuxt/scripts/renderer-hooks.test.ts +0 -91
- package/mdsite-nuxt/scripts/renderer-hooks.ts +1 -50
- package/mdsite-nuxt/scripts/start.test.ts +0 -1
- package/mdsite-nuxt/scripts/start.ts +0 -1
- package/mdsite-nuxt/utils/mdsite-config.ts +86 -41
- package/package.json +1 -1
- package/mdsite-nuxt/example.config.yml +0 -67
|
@@ -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();
|
|
@@ -40,9 +42,9 @@ describe('child-process helpers', () => {
|
|
|
40
42
|
expect(mkdirMock.mock.invocationCallOrder[0]).toBeLessThan(openMock.mock.invocationCallOrder[0] ?? Number.POSITIVE_INFINITY);
|
|
41
43
|
});
|
|
42
44
|
it('uses the same parent-directory log setup for start background processes', async () => {
|
|
43
|
-
await expect(runBackground('npm', ['run', 'dev'], '/renderer', { TEST: '1' }, '/content/.renderer/
|
|
45
|
+
await expect(runBackground('npm', ['run', 'dev'], '/renderer', { TEST: '1' }, '/content/.renderer/live.log')).resolves.toBe(1234);
|
|
44
46
|
expect(mkdirMock).toHaveBeenCalledWith('/content/.renderer', { recursive: true });
|
|
45
|
-
expect(openMock).toHaveBeenCalledWith('/content/.renderer/
|
|
47
|
+
expect(openMock).toHaveBeenCalledWith('/content/.renderer/live.log', 'a');
|
|
46
48
|
});
|
|
47
49
|
it('opens preview URLs in the default browser on supported platforms', async () => {
|
|
48
50
|
const onceMock = vi.fn((event, handler) => {
|
|
@@ -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":"AAAA,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAA;AAE7D,MAAM,EAAE,SAAS,EAAE,QAAQ,EAAE,YAAY,EAAE,SAAS,EAAE,WAAW,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC;IACtF,SAAS,EAAE,EAAE,CAAC,EAAE,EAAE;IAClB,QAAQ,EAAE,EAAE,CAAC,EAAE,EAAE;IACjB,YAAY,EAAE,EAAE,CAAC,EAAE,EAAE;IACrB,SAAS,EAAE,EAAE,CAAC,EAAE,EAAE;IAClB,WAAW,EAAE,EAAE,CAAC,EAAE,EAAE;CACrB,CAAC,CAAC,CAAA;AAEH,EAAE,CAAC,IAAI,CAAC,kBAAkB,EAAE,GAAG,EAAE,CAAC,CAAC;IACjC,KAAK,EAAE,SAAS;IAChB,IAAI,EAAE,QAAQ;IACd,QAAQ,EAAE,YAAY;CACvB,CAAC,CAAC,CAAA;AAEH,EAAE,CAAC,IAAI,CAAC,oBAAoB,EAAE,GAAG,EAAE,CAAC,CAAC;IACnC,KAAK,EAAE,SAAS;CACjB,CAAC,CAAC,CAAA;AAEH,EAAE,CAAC,IAAI,CAAC,UAAU,EAAE,GAAG,EAAE,CAAC,CAAC;IACzB,OAAO,EAAE;QACP,OAAO,EAAE,WAAW;KACrB;CACF,CAAC,CAAC,CAAA;AAEH,OAAO,EAAE,gBAAgB,EAAE,aAAa,EAAE,mBAAmB,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAA;AAEzG,QAAQ,CAAC,uBAAuB,EAAE,GAAG,EAAE;IACrC,UAAU,CAAC,GAAG,EAAE;QACd,EAAE,CAAC,aAAa,EAAE,CAAA;QAClB,SAAS,CAAC,iBAAiB,CAAC,SAAS,CAAC,CAAA;QACtC,QAAQ,CAAC,iBAAiB,CAAC;YACzB,EAAE,EAAE,EAAE;YACN,KAAK,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,iBAAiB,CAAC,SAAS,CAAC;YAC3C,UAAU,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,iBAAiB,CAAC,SAAS,CAAC;SACjD,CAAC,CAAA;QACF,SAAS,CAAC,eAAe,CAAC;YACxB,GAAG,EAAE,IAAI;YACT,IAAI,EAAE,EAAE,CAAC,EAAE,EAAE;YACb,KAAK,EAAE,EAAE,CAAC,EAAE,EAAE;SACf,CAAC,CAAA;IACJ,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,+EAA+E,EAAE,KAAK,IAAI,EAAE;QAC7F,MAAM,MAAM,CAAC,aAAa,CAAC,KAAK,EAAE,CAAC,KAAK,EAAE,SAAS,CAAC,EAAE,WAAW,EAAE,EAAE,IAAI,EAAE,GAAG,EAAE,EAAE,qBAAqB,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;QAE7H,MAAM,CAAC,SAAS,CAAC,CAAC,oBAAoB,CAAC,UAAU,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAA;QACvE,MAAM,CAAC,QAAQ,CAAC,CAAC,oBAAoB,CAAC,qBAAqB,EAAE,GAAG,CAAC,CAAA;QACjE,MAAM,CAAC,SAAS,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,QAAQ,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAC,CAAC,IAAI,MAAM,CAAC,iBAAiB,CAAC,CAAA;IAC9H,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,yEAAyE,EAAE,KAAK,IAAI,EAAE;QACvF,MAAM,MAAM,CAAC,aAAa,CAAC,KAAK,EAAE,CAAC,KAAK,EAAE,KAAK,CAAC,EAAE,WAAW,EAAE,EAAE,IAAI,EAAE,GAAG,EAAE,EAAE,6BAA6B,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;QAEjI,MAAM,CAAC,SAAS,CAAC,CAAC,oBAAoB,CAAC,oBAAoB,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAA;QACjF,MAAM,CAAC,QAAQ,CAAC,CAAC,oBAAoB,CAAC,6BAA6B,EAAE,GAAG,CAAC,CAAA;IAC3E,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,kEAAkE,EAAE,KAAK,IAAI,EAAE;QAChF,MAAM,QAAQ,GAAG,EAAE,CAAC,EAAE,CAAC,CAAC,KAAa,EAAE,OAAmB,EAAE,EAAE;YAC5D,IAAI,KAAK,KAAK,OAAO,EAAE,CAAC;gBACtB,OAAO,EAAE,CAAA;YACX,CAAC;YACD,OAAO,YAAY,CAAA;QACrB,CAAC,CAAC,CAAA;QACF,MAAM,YAAY,GAAG;YACnB,IAAI,EAAE,QAAQ;YACd,KAAK,EAAE,EAAE,CAAC,EAAE,EAAE;SACf,CAAA;QACD,SAAS,CAAC,mBAAmB,CAAC,YAAY,CAAC,CAAA;QAE3C,MAAM,MAAM,CAAC,gBAAgB,CAAC,uBAAuB,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;QAC3E,MAAM,CAAC,SAAS,CAAC,CAAC,oBAAoB,CAAC,UAAU,EAAE,CAAC,uBAAuB,CAAC,EAAE;YAC5E,QAAQ,EAAE,IAAI;YACd,KAAK,EAAE,QAAQ;SAChB,CAAC,CAAA;QACF,MAAM,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC,gBAAgB,EAAE,CAAA;IAC/C,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,kEAAkE,EAAE,KAAK,IAAI,EAAE;QAChF,MAAM,QAAQ,GAAG,EAAE,CAAC,EAAE,CAAC,CAAC,KAAa,EAAE,OAAmB,EAAE,EAAE;YAC5D,IAAI,KAAK,KAAK,OAAO,EAAE,CAAC;gBACtB,OAAO,EAAE,CAAA;YACX,CAAC;YACD,OAAO,YAAY,CAAA;QACrB,CAAC,CAAC,CAAA;QACF,MAAM,YAAY,GAAG;YACnB,IAAI,EAAE,QAAQ;YACd,KAAK,EAAE,EAAE,CAAC,EAAE,EAAE;SACf,CAAA;QACD,SAAS,CAAC,mBAAmB,CAAC,YAAY,CAAC,CAAA;QAE3C,MAAM,MAAM,CAAC,gBAAgB,CAAC,uBAAuB,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;IAC9E,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,2DAA2D,EAAE,KAAK,IAAI,EAAE;QACzE,EAAE,CAAC,aAAa,EAAE,CAAA;QAClB,IAAI,QAAQ,GAAG,CAAC,CAAA;QAChB,WAAW,CAAC,kBAAkB,CAAC,GAAG,EAAE;YAClC,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAsB,CAAA;YAC9C,MAAM,MAAM,GAAG;gBACb,IAAI,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,KAAa,EAAE,OAAmB,EAAE,EAAE;oBACjD,QAAQ,CAAC,GAAG,CAAC,KAAK,EAAE,OAAO,CAAC,CAAA;oBAC5B,OAAO,MAAM,CAAA;gBACf,CAAC,CAAC;gBACF,UAAU,EAAE,EAAE,CAAC,EAAE,EAAE;gBACnB,kBAAkB,EAAE,EAAE,CAAC,EAAE,EAAE;gBAC3B,OAAO,EAAE,EAAE,CAAC,EAAE,EAAE;aACjB,CAAA;YAED,cAAc,CAAC,GAAG,EAAE;gBAClB,QAAQ,IAAI,CAAC,CAAA;gBACb,MAAM,KAAK,GAAG,QAAQ,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,CAAA;gBAChD,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,EAAE,CAAA;YACzB,CAAC,CAAC,CAAA;YAEF,OAAO,MAAM,CAAA;QACf,CAAC,CAAC,CAAA;QAEF,MAAM,WAAW,GAAG,cAAc,CAAC,WAAW,EAAE,IAAI,EAAE,EAAE,eAAe,EAAE,EAAE,EAAE,SAAS,EAAE,GAAG,EAAE,CAAC,CAAA;QAC9F,MAAM,EAAE,CAAC,wBAAwB,CAAC,EAAE,CAAC,CAAA;QAErC,MAAM,MAAM,CAAC,WAAW,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;QAC7C,MAAM,CAAC,WAAW,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAA;QAC5C,MAAM,CAAC,WAAW,CAAC,CAAC,uBAAuB,CAAC,CAAC,EAAE,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAA;IACnF,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,wDAAwD,EAAE,KAAK,IAAI,EAAE;QACtE,EAAE,CAAC,aAAa,EAAE,CAAA;QAClB,WAAW,CAAC,kBAAkB,CAAC,GAAG,EAAE;YAClC,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAsB,CAAA;YAC9C,MAAM,MAAM,GAAG;gBACb,IAAI,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,KAAa,EAAE,OAAmB,EAAE,EAAE;oBACjD,QAAQ,CAAC,GAAG,CAAC,KAAK,EAAE,OAAO,CAAC,CAAA;oBAC5B,OAAO,MAAM,CAAA;gBACf,CAAC,CAAC;gBACF,UAAU,EAAE,EAAE,CAAC,EAAE,EAAE;gBACnB,kBAAkB,EAAE,EAAE,CAAC,EAAE,EAAE;gBAC3B,OAAO,EAAE,EAAE,CAAC,EAAE,EAAE;aACjB,CAAA;YAED,cAAc,CAAC,GAAG,EAAE;gBAClB,QAAQ,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE,EAAE,CAAA;YAC7B,CAAC,CAAC,CAAA;YAEF,OAAO,MAAM,CAAA;QACf,CAAC,CAAC,CAAA;QAEF,MAAM,WAAW,GAAG,cAAc,CAAC,WAAW,EAAE,IAAI,EAAE,EAAE,eAAe,EAAE,EAAE,EAAE,SAAS,EAAE,EAAE,EAAE,gBAAgB,EAAE,EAAE,EAAE,CAAC,CAAA;QACnH,MAAM,EAAE,CAAC,wBAAwB,CAAC,GAAG,CAAC,CAAA;QAEtC,MAAM,MAAM,CAAC,WAAW,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;QAC9C,MAAM,CAAC,WAAW,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAA;IAC9C,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,2EAA2E,EAAE,KAAK,IAAI,EAAE;QACzF,EAAE,CAAC,aAAa,EAAE,CAAA;QAClB,YAAY;aACT,qBAAqB,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,CAAC;aAC1C,qBAAqB,CAAC,6EAA6E,CAAC,CAAA;QAEvG,MAAM,WAAW,GAAG,mBAAmB,CAAC,2BAA2B,EAAE,IAAI,EAAE,EAAE,eAAe,EAAE,EAAE,EAAE,SAAS,EAAE,GAAG,EAAE,CAAC,CAAA;QACnH,MAAM,EAAE,CAAC,wBAAwB,CAAC,EAAE,CAAC,CAAA;QAErC,MAAM,MAAM,CAAC,WAAW,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;QAC7C,MAAM,CAAC,YAAY,CAAC,CAAC,oBAAoB,CAAC,2BAA2B,EAAE,MAAM,CAAC,CAAA;IAChF,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,oFAAoF,EAAE,KAAK,IAAI,EAAE;QAClG,EAAE,CAAC,aAAa,EAAE,CAAA;QAClB,YAAY,CAAC,qBAAqB,CAAC,iCAAiC,CAAC,CAAA;QAErE,MAAM,WAAW,GAAG,mBAAmB,CAAC,6BAA6B,EAAE,IAAI,EAAE,EAAE,eAAe,EAAE,EAAE,EAAE,SAAS,EAAE,GAAG,EAAE,CAAC,CAAA;QACrH,MAAM,EAAE,CAAC,wBAAwB,CAAC,EAAE,CAAC,CAAA;QAErC,MAAM,MAAM,CAAC,WAAW,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;IAC/C,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,kGAAkG,EAAE,KAAK,IAAI,EAAE;QAChH,EAAE,CAAC,aAAa,EAAE,CAAA;QAClB,YAAY,CAAC,iBAAiB,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAA;QAEnD,MAAM,WAAW,GAAG,mBAAmB,CAAC,2BAA2B,EAAE,IAAI,EAAE,EAAE,eAAe,EAAE,EAAE,EAAE,SAAS,EAAE,EAAE,EAAE,CAAC,CAAA;QAClH,MAAM,EAAE,CAAC,wBAAwB,CAAC,GAAG,CAAC,CAAA;QAEtC,MAAM,MAAM,CAAC,WAAW,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;IAC/C,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,mFAAmF,EAAE,KAAK,IAAI,EAAE;QACjG,EAAE,CAAC,aAAa,EAAE,CAAA;QAClB,YAAY;aACT,qBAAqB,CAAC,sBAAsB,CAAC;aAC7C,qBAAqB,CAAC,4DAA4D,CAAC,CAAA;QAEtF,MAAM,WAAW,GAAG,mBAAmB,CAAC,2BAA2B,EAAE,IAAI,EAAE,EAAE,eAAe,EAAE,EAAE,EAAE,SAAS,EAAE,GAAG,EAAE,CAAC,CAAA;QACnH,MAAM,EAAE,CAAC,wBAAwB,CAAC,EAAE,CAAC,CAAA;QAErC,MAAM,MAAM,CAAC,WAAW,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;QAC7C,MAAM,CAAC,YAAY,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,sBAAsB,CAAC,CAAC,CAAC,CAAA;IAClE,CAAC,CAAC,CAAA;AACJ,CAAC,CAAC,CAAA"}
|
|
@@ -9,9 +9,17 @@ export interface RuntimeProcessState {
|
|
|
9
9
|
command: string[];
|
|
10
10
|
startedAt: string;
|
|
11
11
|
}
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
12
|
+
/**
|
|
13
|
+
* Working directory for tracked detached processes.
|
|
14
|
+
*
|
|
15
|
+
* Anchored on the content directory (not the config directory) so that
|
|
16
|
+
* `<paths.build>` and `<paths.output>` resolve relative to the project the
|
|
17
|
+
* user is building, even when `paths.input` points the CLI at a sub-folder
|
|
18
|
+
* of the config directory.
|
|
19
|
+
*/
|
|
20
|
+
export declare function getRuntimeDir(contentDir: string, config: MdsiteConfig): string;
|
|
21
|
+
export declare function getRuntimeLogPath(contentDir: string, config: MdsiteConfig, kind: RuntimeProcessKind): string;
|
|
22
|
+
export declare function readRuntimeState(contentDir: string, config: MdsiteConfig, kind: RuntimeProcessKind): Promise<RuntimeProcessState | null>;
|
|
23
|
+
export declare function writeRuntimeState(contentDir: string, config: MdsiteConfig, state: RuntimeProcessState): Promise<void>;
|
|
24
|
+
export declare function clearRuntimeState(contentDir: string, config: MdsiteConfig, kind: RuntimeProcessKind): Promise<void>;
|
|
17
25
|
export declare function isProcessRunning(pid: number): boolean;
|
|
@@ -1,13 +1,25 @@
|
|
|
1
1
|
import { mkdir, readFile, rm, writeFile } from 'node:fs/promises';
|
|
2
2
|
import path from 'node:path';
|
|
3
|
-
|
|
4
|
-
|
|
3
|
+
const RUNTIME_BASENAME = {
|
|
4
|
+
start: 'live',
|
|
5
|
+
preview: 'static'
|
|
6
|
+
};
|
|
7
|
+
/**
|
|
8
|
+
* Working directory for tracked detached processes.
|
|
9
|
+
*
|
|
10
|
+
* Anchored on the content directory (not the config directory) so that
|
|
11
|
+
* `<paths.build>` and `<paths.output>` resolve relative to the project the
|
|
12
|
+
* user is building, even when `paths.input` points the CLI at a sub-folder
|
|
13
|
+
* of the config directory.
|
|
14
|
+
*/
|
|
15
|
+
export function getRuntimeDir(contentDir, config) {
|
|
16
|
+
return path.resolve(contentDir, config.paths.build);
|
|
5
17
|
}
|
|
6
|
-
export function getRuntimeLogPath(
|
|
7
|
-
return path.join(getRuntimeDir(
|
|
18
|
+
export function getRuntimeLogPath(contentDir, config, kind) {
|
|
19
|
+
return path.join(getRuntimeDir(contentDir, config), `${RUNTIME_BASENAME[kind]}.log`);
|
|
8
20
|
}
|
|
9
|
-
export async function readRuntimeState(
|
|
10
|
-
const statePath = getStatePath(
|
|
21
|
+
export async function readRuntimeState(contentDir, config, kind) {
|
|
22
|
+
const statePath = getStatePath(contentDir, config, kind);
|
|
11
23
|
try {
|
|
12
24
|
const content = await readFile(statePath, 'utf8');
|
|
13
25
|
return JSON.parse(content);
|
|
@@ -16,12 +28,12 @@ export async function readRuntimeState(configDir, config, kind) {
|
|
|
16
28
|
return null;
|
|
17
29
|
}
|
|
18
30
|
}
|
|
19
|
-
export async function writeRuntimeState(
|
|
20
|
-
await mkdir(getRuntimeDir(
|
|
21
|
-
await writeFile(getStatePath(
|
|
31
|
+
export async function writeRuntimeState(contentDir, config, state) {
|
|
32
|
+
await mkdir(getRuntimeDir(contentDir, config), { recursive: true });
|
|
33
|
+
await writeFile(getStatePath(contentDir, config, state.kind), `${JSON.stringify(state, null, 2)}\n`, 'utf8');
|
|
22
34
|
}
|
|
23
|
-
export async function clearRuntimeState(
|
|
24
|
-
await rm(getStatePath(
|
|
35
|
+
export async function clearRuntimeState(contentDir, config, kind) {
|
|
36
|
+
await rm(getStatePath(contentDir, config, kind), { force: true });
|
|
25
37
|
}
|
|
26
38
|
export function isProcessRunning(pid) {
|
|
27
39
|
try {
|
|
@@ -32,7 +44,7 @@ export function isProcessRunning(pid) {
|
|
|
32
44
|
return false;
|
|
33
45
|
}
|
|
34
46
|
}
|
|
35
|
-
function getStatePath(
|
|
36
|
-
return path.join(getRuntimeDir(
|
|
47
|
+
function getStatePath(contentDir, config, kind) {
|
|
48
|
+
return path.join(getRuntimeDir(contentDir, config), `${RUNTIME_BASENAME[kind]}.json`);
|
|
37
49
|
}
|
|
38
50
|
//# sourceMappingURL=runtime-state.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"runtime-state.js","sourceRoot":"","sources":["../../src/process/runtime-state.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,EAAE,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAA;AACjE,OAAO,IAAI,MAAM,WAAW,CAAA;
|
|
1
|
+
{"version":3,"file":"runtime-state.js","sourceRoot":"","sources":["../../src/process/runtime-state.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,EAAE,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAA;AACjE,OAAO,IAAI,MAAM,WAAW,CAAA;AAK5B,MAAM,gBAAgB,GAAuC;IAC3D,KAAK,EAAE,MAAM;IACb,OAAO,EAAE,QAAQ;CAClB,CAAA;AAYD;;;;;;;GAOG;AACH,MAAM,UAAU,aAAa,CAAC,UAAkB,EAAE,MAAoB;IACpE,OAAO,IAAI,CAAC,OAAO,CAAC,UAAU,EAAE,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAA;AACrD,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,UAAkB,EAAE,MAAoB,EAAE,IAAwB;IAClG,OAAO,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,UAAU,EAAE,MAAM,CAAC,EAAE,GAAG,gBAAgB,CAAC,IAAI,CAAC,MAAM,CAAC,CAAA;AACtF,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,gBAAgB,CAAC,UAAkB,EAAE,MAAoB,EAAE,IAAwB;IACvG,MAAM,SAAS,GAAG,YAAY,CAAC,UAAU,EAAE,MAAM,EAAE,IAAI,CAAC,CAAA;IACxD,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC,CAAA;QACjD,OAAO,IAAI,CAAC,KAAK,CAAC,OAAO,CAAwB,CAAA;IACnD,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAA;IACb,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,iBAAiB,CAAC,UAAkB,EAAE,MAAoB,EAAE,KAA0B;IAC1G,MAAM,KAAK,CAAC,aAAa,CAAC,UAAU,EAAE,MAAM,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAA;IACnE,MAAM,SAAS,CAAC,YAAY,CAAC,UAAU,EAAE,MAAM,EAAE,KAAK,CAAC,IAAI,CAAC,EAAE,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,MAAM,CAAC,CAAA;AAC9G,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,iBAAiB,CAAC,UAAkB,EAAE,MAAoB,EAAE,IAAwB;IACxG,MAAM,EAAE,CAAC,YAAY,CAAC,UAAU,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAA;AACnE,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,GAAW;IAC1C,IAAI,CAAC;QACH,OAAO,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC,CAAA;QACpB,OAAO,IAAI,CAAA;IACb,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAA;IACd,CAAC;AACH,CAAC;AAED,SAAS,YAAY,CAAC,UAAkB,EAAE,MAAoB,EAAE,IAAwB;IACtF,OAAO,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,UAAU,EAAE,MAAM,CAAC,EAAE,GAAG,gBAAgB,CAAC,IAAI,CAAC,OAAO,CAAC,CAAA;AACvF,CAAC"}
|
|
@@ -4,12 +4,10 @@ import path from 'node:path';
|
|
|
4
4
|
import { afterEach, describe, expect, it, vi } from 'vitest';
|
|
5
5
|
import { clearRuntimeState, getRuntimeDir, getRuntimeLogPath, isProcessRunning, readRuntimeState, writeRuntimeState } from './runtime-state.js';
|
|
6
6
|
const config = {
|
|
7
|
-
|
|
8
|
-
features: { bibleTooltips: true, sourceEdit: true },
|
|
7
|
+
features: { bibleTooltips: true, sourceEdit: '', footer: [] },
|
|
9
8
|
menu: [],
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
site: { canonical: '', name: 'Docs' },
|
|
9
|
+
paths: { input: '', build: '.renderer', output: '.output' },
|
|
10
|
+
site: { canonical: '', favicon: '', name: 'Docs' },
|
|
13
11
|
themes: { light: { colors: {} }, dark: { colors: {} } }
|
|
14
12
|
};
|
|
15
13
|
const tempDirs = [];
|
|
@@ -25,15 +23,17 @@ afterEach(async () => {
|
|
|
25
23
|
describe('runtime-state helpers', () => {
|
|
26
24
|
it('builds runtime and log paths under the configured server path', () => {
|
|
27
25
|
expect(getRuntimeDir('/content', config)).toBe(path.join('/content', '.renderer'));
|
|
28
|
-
expect(getRuntimeLogPath('/content', config, 'preview')).toBe(path.join('/content', '.renderer', '
|
|
29
|
-
expect(getRuntimeLogPath('/content', config, 'start')).toBe(path.join('/content', '.renderer', '
|
|
26
|
+
expect(getRuntimeLogPath('/content', config, 'preview')).toBe(path.join('/content', '.renderer', 'static.log'));
|
|
27
|
+
expect(getRuntimeLogPath('/content', config, 'start')).toBe(path.join('/content', '.renderer', 'live.log'));
|
|
28
|
+
expect(getRuntimeLogPath('/content', config, 'preview')).not.toBe(path.join('/content', '.renderer', 'preview.log'));
|
|
29
|
+
expect(getRuntimeLogPath('/content', config, 'start')).not.toBe(path.join('/content', '.renderer', 'start.log'));
|
|
30
30
|
});
|
|
31
31
|
it('writes, reads, and clears runtime state', async () => {
|
|
32
32
|
const contentDir = await makeTempDir();
|
|
33
33
|
const state = {
|
|
34
34
|
kind: 'start',
|
|
35
35
|
pid: 321,
|
|
36
|
-
logPath: '/tmp/
|
|
36
|
+
logPath: '/tmp/live.log',
|
|
37
37
|
rendererDir: '/renderer',
|
|
38
38
|
contentDir,
|
|
39
39
|
command: ['npm', 'run', 'dev'],
|
|
@@ -41,7 +41,7 @@ describe('runtime-state helpers', () => {
|
|
|
41
41
|
};
|
|
42
42
|
await writeRuntimeState(contentDir, config, state);
|
|
43
43
|
expect(await readRuntimeState(contentDir, config, 'start')).toEqual(state);
|
|
44
|
-
const raw = await readFile(path.join(getRuntimeDir(contentDir, config), '
|
|
44
|
+
const raw = await readFile(path.join(getRuntimeDir(contentDir, config), 'live.json'), 'utf8');
|
|
45
45
|
expect(raw.endsWith('\n')).toBe(true);
|
|
46
46
|
await clearRuntimeState(contentDir, config, 'start');
|
|
47
47
|
await expect(readRuntimeState(contentDir, config, 'start')).resolves.toBeNull();
|
|
@@ -50,7 +50,7 @@ describe('runtime-state helpers', () => {
|
|
|
50
50
|
const contentDir = await makeTempDir();
|
|
51
51
|
expect(await readRuntimeState(contentDir, config, 'preview')).toBeNull();
|
|
52
52
|
const runtimeDir = getRuntimeDir(contentDir, config);
|
|
53
|
-
await import('node:fs/promises').then(({ mkdir, writeFile }) => mkdir(runtimeDir, { recursive: true }).then(() => writeFile(path.join(runtimeDir, '
|
|
53
|
+
await import('node:fs/promises').then(({ mkdir, writeFile }) => mkdir(runtimeDir, { recursive: true }).then(() => writeFile(path.join(runtimeDir, 'static.json'), '{oops', 'utf8')));
|
|
54
54
|
await expect(readRuntimeState(contentDir, config, 'preview')).resolves.toBeNull();
|
|
55
55
|
});
|
|
56
56
|
it('detects running processes by probing process.kill', () => {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"runtime-state.test.js","sourceRoot":"","sources":["../../src/process/runtime-state.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,kBAAkB,CAAA;AACxD,OAAO,EAAE,MAAM,SAAS,CAAA;AACxB,OAAO,IAAI,MAAM,WAAW,CAAA;AAE5B,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAA;AAI5D,OAAO,EACL,iBAAiB,EACjB,aAAa,EACb,iBAAiB,EACjB,gBAAgB,EAChB,gBAAgB,EAChB,iBAAiB,EAClB,MAAM,oBAAoB,CAAA;AAE3B,MAAM,MAAM,GAAiB;IAC3B,
|
|
1
|
+
{"version":3,"file":"runtime-state.test.js","sourceRoot":"","sources":["../../src/process/runtime-state.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -2,8 +2,34 @@ import type { MdsiteConfig } from '../config/mdsite-config.js';
|
|
|
2
2
|
export declare function getBundledRendererDir(): string;
|
|
3
3
|
export declare function isInsideNodeModules(targetDir: string): boolean;
|
|
4
4
|
interface PreparedRenderer {
|
|
5
|
+
/**
|
|
6
|
+
* Where the renderer scripts run (`npm run dev` / `generate` / `preview`).
|
|
7
|
+
* In production this is `<configDir>/<paths.build>` (a materialized copy of
|
|
8
|
+
* the bundled renderer). In dev, when the CLI is run from this repo, it is
|
|
9
|
+
* the checked-in `mdsite-nuxt/` submodule.
|
|
10
|
+
*/
|
|
5
11
|
rendererDir: string;
|
|
12
|
+
/**
|
|
13
|
+
* Environment to pass to renderer scripts. Includes the bridge vars
|
|
14
|
+
* (`NUXT_CONTENT_PATH`, `CONTENT_DIR`, `MDSITE_CONFIG_PATH`) and, in dev
|
|
15
|
+
* mode, `MDSITE_NITRO_OUTPUT_DIR` pointing the build output at
|
|
16
|
+
* `<configDir>/<paths.build>/.output/` instead of inside the submodule.
|
|
17
|
+
*/
|
|
6
18
|
rendererEnv: NodeJS.ProcessEnv;
|
|
19
|
+
/**
|
|
20
|
+
* Absolute path of the renderer's Nitro build output directory (the
|
|
21
|
+
* directory that contains `public/` after a successful `npm run generate`).
|
|
22
|
+
*
|
|
23
|
+
* - Production: `<configDir>/<paths.build>/.output` (Nitro's default inside
|
|
24
|
+
* the materialized copy).
|
|
25
|
+
* - Dev: `<configDir>/<paths.build>/.output` (set via `MDSITE_NITRO_OUTPUT_DIR`
|
|
26
|
+
* so the build lands alongside the rest of the CLI's working state rather
|
|
27
|
+
* than inside the `mdsite-nuxt/` submodule).
|
|
28
|
+
*
|
|
29
|
+
* `mdsite clean` removes `<configDir>/<paths.build>` entirely, which
|
|
30
|
+
* covers this path in both modes.
|
|
31
|
+
*/
|
|
32
|
+
rendererOutputDir: string;
|
|
7
33
|
}
|
|
8
34
|
interface PrepareRendererOptions {
|
|
9
35
|
configDir?: string;
|
|
@@ -19,7 +45,6 @@ export declare function previewRendererInBackground(rendererDir: string, env: No
|
|
|
19
45
|
export declare function previewRendererForeground(rendererDir: string, env: NodeJS.ProcessEnv): Promise<void>;
|
|
20
46
|
export declare function generateRenderer(rendererDir: string, env: NodeJS.ProcessEnv): Promise<void>;
|
|
21
47
|
export declare function prepareRendererBackend(rendererDir: string, env: NodeJS.ProcessEnv): Promise<void>;
|
|
22
|
-
export declare function hasPreviewArtifacts(
|
|
23
|
-
export declare function ensurePreviewArtifacts(
|
|
24
|
-
export declare function getRendererGeneratedOutputPath(rendererDir: string): string;
|
|
48
|
+
export declare function hasPreviewArtifacts(rendererOutputDir: string): Promise<boolean>;
|
|
49
|
+
export declare function ensurePreviewArtifacts(rendererOutputDir: string): Promise<void>;
|
|
25
50
|
export {};
|
|
@@ -24,35 +24,44 @@ export async function prepareConfiguredRenderer(contentDir, config, options = {}
|
|
|
24
24
|
}
|
|
25
25
|
export async function ensureConfiguredRendererInstalled(contentDir, config, options = {}) {
|
|
26
26
|
const rendererBaseDir = options.configDir ?? contentDir;
|
|
27
|
-
const rendererDir = path.resolve(rendererBaseDir, config.
|
|
27
|
+
const rendererDir = path.resolve(rendererBaseDir, config.paths.build);
|
|
28
28
|
await ensureDirectoryIsAvailable(rendererDir);
|
|
29
|
-
const preserveFiles = new Set();
|
|
30
|
-
for (const name of ['package.json', 'package-lock.json']) {
|
|
31
|
-
if (await pathExists(path.join(rendererDir, name))) {
|
|
32
|
-
preserveFiles.add(name);
|
|
33
|
-
}
|
|
34
|
-
}
|
|
35
29
|
if (rendererDir !== checkedInRendererDir) {
|
|
36
30
|
await cp(checkedInRendererDir, rendererDir, {
|
|
37
31
|
recursive: true,
|
|
38
32
|
force: true,
|
|
39
|
-
filter:
|
|
33
|
+
filter: shouldCopyRendererPath
|
|
40
34
|
});
|
|
41
35
|
}
|
|
42
36
|
return rendererDir;
|
|
43
37
|
}
|
|
44
38
|
async function prepareRendererEnvironment(contentDir, config, rendererDir, configPath) {
|
|
45
39
|
await writeCompatibilityConfigFile(rendererDir, contentDir, config);
|
|
40
|
+
// In dev mode, the renderer IS the checked-in submodule. Redirect Nitro's
|
|
41
|
+
// output to `<configDir>/<paths.build>/.output` so the build artifact lives
|
|
42
|
+
// alongside the rest of the CLI's working state (covered by `mdsite clean`)
|
|
43
|
+
// instead of inside the submodule source tree.
|
|
44
|
+
const isDevRenderer = !isInsideNodeModules(checkedInRendererDir) && path.resolve(rendererDir) === path.resolve(checkedInRendererDir);
|
|
45
|
+
const rendererOutputDir = isDevRenderer
|
|
46
|
+
? path.resolve(contentDir, config.paths.build, '.output')
|
|
47
|
+
: path.join(rendererDir, '.output');
|
|
48
|
+
if (isDevRenderer) {
|
|
49
|
+
await mkdir(rendererOutputDir, { recursive: true });
|
|
50
|
+
}
|
|
46
51
|
const rendererEnv = {
|
|
47
52
|
...process.env,
|
|
48
53
|
NUXT_CONTENT_PATH: contentDir,
|
|
49
54
|
CONTENT_DIR: contentDir,
|
|
50
55
|
MDSITE_CONFIG_PATH: configPath ?? path.join(contentDir, 'mdsite.yml')
|
|
51
56
|
};
|
|
57
|
+
if (isDevRenderer) {
|
|
58
|
+
rendererEnv.MDSITE_NITRO_OUTPUT_DIR = rendererOutputDir;
|
|
59
|
+
}
|
|
52
60
|
await writeEnvFile(rendererDir, rendererEnv);
|
|
53
61
|
return {
|
|
54
62
|
rendererDir,
|
|
55
|
-
rendererEnv
|
|
63
|
+
rendererEnv,
|
|
64
|
+
rendererOutputDir
|
|
56
65
|
};
|
|
57
66
|
}
|
|
58
67
|
export async function ensureRendererDependencies(rendererDir) {
|
|
@@ -83,9 +92,9 @@ export async function generateRenderer(rendererDir, env) {
|
|
|
83
92
|
export async function prepareRendererBackend(rendererDir, env) {
|
|
84
93
|
await runRendererScript(rendererDir, env, 'prepare:renderer');
|
|
85
94
|
}
|
|
86
|
-
export async function hasPreviewArtifacts(
|
|
95
|
+
export async function hasPreviewArtifacts(rendererOutputDir) {
|
|
87
96
|
const previewArtifacts = [
|
|
88
|
-
path.join(
|
|
97
|
+
path.join(rendererOutputDir, 'public')
|
|
89
98
|
];
|
|
90
99
|
for (const artifactPath of previewArtifacts) {
|
|
91
100
|
try {
|
|
@@ -97,14 +106,11 @@ export async function hasPreviewArtifacts(rendererDir) {
|
|
|
97
106
|
}
|
|
98
107
|
return true;
|
|
99
108
|
}
|
|
100
|
-
export async function ensurePreviewArtifacts(
|
|
101
|
-
if (!(await hasPreviewArtifacts(
|
|
109
|
+
export async function ensurePreviewArtifacts(rendererOutputDir) {
|
|
110
|
+
if (!(await hasPreviewArtifacts(rendererOutputDir))) {
|
|
102
111
|
throw new Error('Preview is unavailable. Run `mdsite generate` before `mdsite static`.');
|
|
103
112
|
}
|
|
104
113
|
}
|
|
105
|
-
export function getRendererGeneratedOutputPath(rendererDir) {
|
|
106
|
-
return path.join(rendererDir, '.output', 'public');
|
|
107
|
-
}
|
|
108
114
|
async function resolveRendererDir(rendererBaseDir, config, options = {}) {
|
|
109
115
|
if (isInsideNodeModules(checkedInRendererDir)) {
|
|
110
116
|
return ensureConfiguredRendererInstalled(rendererBaseDir, config, options);
|
|
@@ -115,7 +121,7 @@ async function resolveRendererDir(rendererBaseDir, config, options = {}) {
|
|
|
115
121
|
return checkedInRendererDir;
|
|
116
122
|
}
|
|
117
123
|
async function resolveConfiguredRendererDir(contentDir, config) {
|
|
118
|
-
const rendererDir = path.resolve(contentDir, config.
|
|
124
|
+
const rendererDir = path.resolve(contentDir, config.paths.build);
|
|
119
125
|
let rendererStats;
|
|
120
126
|
try {
|
|
121
127
|
rendererStats = await stat(rendererDir);
|
|
@@ -141,15 +147,9 @@ async function ensureDirectoryIsAvailable(directoryPath) {
|
|
|
141
147
|
throw new Error(`Configured renderer path is not a directory: ${directoryPath}`);
|
|
142
148
|
}
|
|
143
149
|
}
|
|
144
|
-
function shouldCopyRendererPath(sourcePath
|
|
150
|
+
function shouldCopyRendererPath(sourcePath) {
|
|
145
151
|
const baseName = path.basename(sourcePath);
|
|
146
|
-
|
|
147
|
-
return false;
|
|
148
|
-
}
|
|
149
|
-
if ((baseName === 'package.json' || baseName === 'package-lock.json') && preserveFiles.has(baseName)) {
|
|
150
|
-
return false;
|
|
151
|
-
}
|
|
152
|
-
return true;
|
|
152
|
+
return !rendererCopyIgnoredNames.has(baseName);
|
|
153
153
|
}
|
|
154
154
|
async function writeEnvFile(rendererDir, env) {
|
|
155
155
|
const envLines = [
|
|
@@ -157,6 +157,9 @@ async function writeEnvFile(rendererDir, env) {
|
|
|
157
157
|
`CONTENT_DIR=${serializeEnvValue(env.CONTENT_DIR)}`,
|
|
158
158
|
`MDSITE_CONFIG_PATH=${serializeEnvValue(env.MDSITE_CONFIG_PATH)}`
|
|
159
159
|
];
|
|
160
|
+
if (env.MDSITE_NITRO_OUTPUT_DIR) {
|
|
161
|
+
envLines.push(`MDSITE_NITRO_OUTPUT_DIR=${serializeEnvValue(env.MDSITE_NITRO_OUTPUT_DIR)}`);
|
|
162
|
+
}
|
|
160
163
|
await writeFile(path.join(rendererDir, '.env'), `${envLines.join('\n')}\n`, 'utf8');
|
|
161
164
|
}
|
|
162
165
|
async function writeCompatibilityConfigFile(rendererDir, contentDir, config) {
|
|
@@ -164,8 +167,10 @@ async function writeCompatibilityConfigFile(rendererDir, contentDir, config) {
|
|
|
164
167
|
siteName: config.site.name,
|
|
165
168
|
siteCanonical: config.site.canonical,
|
|
166
169
|
contentPath: contentDir,
|
|
167
|
-
|
|
168
|
-
|
|
170
|
+
features: {
|
|
171
|
+
'bible-tooltips': config.features.bibleTooltips,
|
|
172
|
+
'source-edit': config.features.sourceEdit
|
|
173
|
+
},
|
|
169
174
|
themes: config.themes
|
|
170
175
|
};
|
|
171
176
|
await writeFile(path.join(rendererDir, 'content.config.yml'), YAML.stringify(compatibilityConfig), 'utf8');
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mdsite-nuxt.js","sourceRoot":"","sources":["../../src/renderer/mdsite-nuxt.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAA;AACrE,OAAO,IAAI,MAAM,WAAW,CAAA;AAC5B,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAA;AAExC,OAAO,IAAI,MAAM,MAAM,CAAA;AAGvB,OAAO,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,6BAA6B,CAAA;AAE1E,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,CAAA;AACvF,MAAM,oBAAoB,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,aAAa,CAAC,CAAA;AAC/D,MAAM,wBAAwB,GAAG,IAAI,GAAG,CAAC,CAAC,cAAc,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,QAAQ,CAAC,CAAC,CAAA;AAEhG,MAAM,UAAU,qBAAqB;IACnC,OAAO,oBAAoB,CAAA;AAC7B,CAAC;AAED,MAAM,UAAU,mBAAmB,CAAC,SAAiB;IACnD,OAAO,SAAS,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,QAAQ,CAAC,cAAc,CAAC,CAAA;AAC3D,CAAC;
|
|
1
|
+
{"version":3,"file":"mdsite-nuxt.js","sourceRoot":"","sources":["../../src/renderer/mdsite-nuxt.ts"],"names":[],"mappings":"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"}
|