@mintlify/previewing 4.0.1492 → 4.0.1494
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/dist/__tests__/packages-collect.test.js +3 -3
- package/dist/__tests__/packages-dev-snippets.test.js +2 -2
- package/dist/__tests__/packages-dev.test.js +19 -19
- package/dist/__tests__/packages-setup.test.js +1 -1
- package/dist/local-preview/packages/dev.d.ts +1 -1
- package/dist/local-preview/packages/dev.js +1 -3
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +6 -6
|
@@ -226,7 +226,7 @@ describe('collectPackageIslands', () => {
|
|
|
226
226
|
{ prefix: `mi-${island.id}-`, html: '<svg></svg>' },
|
|
227
227
|
]));
|
|
228
228
|
const compiled = await compileLikeMintDev('charts.mdx', {
|
|
229
|
-
|
|
229
|
+
buildId: 'abc',
|
|
230
230
|
islands,
|
|
231
231
|
packageNames: [...(setup?.packageNames ?? [])],
|
|
232
232
|
packageSnippets: [...collected.packageSnippets],
|
|
@@ -256,7 +256,7 @@ describe('collectPackageIslands', () => {
|
|
|
256
256
|
{ prefix: `mi-${island.id}-`, html: '<svg></svg>' },
|
|
257
257
|
]));
|
|
258
258
|
const packageBuild = {
|
|
259
|
-
|
|
259
|
+
buildId: 'abc',
|
|
260
260
|
islands,
|
|
261
261
|
packageNames: [...(setup?.packageNames ?? [])],
|
|
262
262
|
packageSnippets: [...collected.packageSnippets],
|
|
@@ -294,7 +294,7 @@ describe('collectPackageIslands', () => {
|
|
|
294
294
|
packageSnippets: collected.packageSnippets,
|
|
295
295
|
});
|
|
296
296
|
const packageBuild = {
|
|
297
|
-
|
|
297
|
+
buildId: 'abc',
|
|
298
298
|
islands: Object.fromEntries(collected.islands.map((island) => [
|
|
299
299
|
island.id,
|
|
300
300
|
{ prefix: `mi-${island.id}-`, html: '<svg></svg>' },
|
|
@@ -165,7 +165,7 @@ describe('package snippet membership in the mint dev watcher', () => {
|
|
|
165
165
|
})));
|
|
166
166
|
};
|
|
167
167
|
const render = async (page) => {
|
|
168
|
-
const {
|
|
168
|
+
const { buildId, islands, packageNames, packageSnippets } = await fse.readJson(join(testPaths.props, PACKAGE_BUILD_PROPS_FILE));
|
|
169
169
|
const compiled = await getMdx({
|
|
170
170
|
path: page.replace(/\.mdx$/, ''),
|
|
171
171
|
content: parseFrontmatter(await output(page)).body,
|
|
@@ -174,7 +174,7 @@ describe('package snippet membership in the mint dev watcher', () => {
|
|
|
174
174
|
subdomain: 'local',
|
|
175
175
|
codeStyling: undefined,
|
|
176
176
|
tailwindSelectors: [],
|
|
177
|
-
packageBuild: {
|
|
177
|
+
packageBuild: { buildId, islands, packageNames, packageSnippets },
|
|
178
178
|
});
|
|
179
179
|
expect(compiled.parseFailed).toBeUndefined();
|
|
180
180
|
return compiled.mdxExtracts.islands ?? {};
|
|
@@ -200,7 +200,7 @@ describe('PackagesDev', () => {
|
|
|
200
200
|
expect(await fse.pathExists(join(propsPath, 'charts.mdx'))).toBe(true);
|
|
201
201
|
const written = await props();
|
|
202
202
|
const [id] = Object.keys(written.islands);
|
|
203
|
-
expect(written.
|
|
203
|
+
expect(written.buildId).toMatch(/^bi[0-9a-f]+-1$/);
|
|
204
204
|
expect(written.islands[id ?? '']).toEqual({
|
|
205
205
|
prefix: `mi-${id}-`,
|
|
206
206
|
html: `<svg data-id="${id}"></svg>`,
|
|
@@ -209,7 +209,7 @@ describe('PackagesDev', () => {
|
|
|
209
209
|
expect(written.css.map((css) => css.path)).toEqual(['client/styles.css']);
|
|
210
210
|
expect(dev.getStatus()).toEqual({ state: 'ready' });
|
|
211
211
|
expect(getPackageImportOptions()?.packageNames).toEqual(new Set(['recharts']));
|
|
212
|
-
expect(await fse.readdir(buildsDir)).toEqual([written.
|
|
212
|
+
expect(await fse.readdir(buildsDir)).toEqual([written.buildId]);
|
|
213
213
|
expect(dev.routeState().enabled).toBe(true);
|
|
214
214
|
});
|
|
215
215
|
it('preserves global and island CSS references in local compile props', async () => {
|
|
@@ -221,7 +221,7 @@ describe('PackagesDev', () => {
|
|
|
221
221
|
expect(written.islands[id ?? '']?.css).toEqual([
|
|
222
222
|
{ path: `client/islands/${id}.css`, integrity: 'sha384-css', bytes: 3 },
|
|
223
223
|
]);
|
|
224
|
-
expect(written.
|
|
224
|
+
expect(written.buildId).not.toContain('/');
|
|
225
225
|
});
|
|
226
226
|
it('adds a changed island right away and swaps in the rebuild', async () => {
|
|
227
227
|
await dev.init();
|
|
@@ -233,14 +233,14 @@ describe('PackagesDev', () => {
|
|
|
233
233
|
const pending = await props();
|
|
234
234
|
const [newId] = Object.keys(pending.islands);
|
|
235
235
|
expect(Object.keys(before.islands)).not.toContain(newId);
|
|
236
|
-
expect(pending.
|
|
236
|
+
expect(pending.buildId).toBe(before.buildId);
|
|
237
237
|
expect(pending.islands[newId ?? '']?.html).toBeUndefined();
|
|
238
238
|
expect(dev.getStatus()).toEqual({ state: 'building' });
|
|
239
|
-
await until(async () => (await props()).
|
|
239
|
+
await until(async () => (await props()).buildId !== before.buildId);
|
|
240
240
|
const after = await props();
|
|
241
241
|
expect(after.islands[newId ?? '']?.html).toContain(newId);
|
|
242
242
|
expect(rebuilt).toBe(1);
|
|
243
|
-
expect((await fse.readdir(buildsDir)).sort()).toEqual([before.
|
|
243
|
+
expect((await fse.readdir(buildsDir)).sort()).toEqual([before.buildId, after.buildId].sort());
|
|
244
244
|
});
|
|
245
245
|
it('keeps listing the islands edits drop until the next build finishes', async () => {
|
|
246
246
|
await dev.init();
|
|
@@ -342,7 +342,7 @@ describe('PackagesDev', () => {
|
|
|
342
342
|
await Promise.all([slow, dev.onFileChange('charts.mdx', 'page')]);
|
|
343
343
|
await until(() => rebuilt === 1);
|
|
344
344
|
const after = await props();
|
|
345
|
-
expect(after.
|
|
345
|
+
expect(after.buildId).not.toBe(before.buildId);
|
|
346
346
|
expect(Object.keys(after.islands)).not.toEqual(Object.keys(before.islands));
|
|
347
347
|
expect(Object.values(after.islands).every((island) => island.html !== undefined)).toBe(true);
|
|
348
348
|
}
|
|
@@ -464,13 +464,13 @@ describe('PackagesDev', () => {
|
|
|
464
464
|
mode.missingNodeModules = true;
|
|
465
465
|
await dev.init();
|
|
466
466
|
const written = await props();
|
|
467
|
-
expect(written.
|
|
467
|
+
expect(written.buildId).toBe('pending');
|
|
468
468
|
expect(Object.values(written.islands).every((island) => island.html === undefined)).toBe(true);
|
|
469
469
|
expect(dev.getStatus()).toEqual({ state: 'missing-node-modules' });
|
|
470
470
|
expect(report.calls).toContain('missing');
|
|
471
471
|
mode.missingNodeModules = false;
|
|
472
472
|
await fse.outputFile(join(docsRoot, 'node_modules/.package-lock.json'), '{}');
|
|
473
|
-
await until(async () => (await props()).
|
|
473
|
+
await until(async () => (await props()).buildId !== 'pending');
|
|
474
474
|
expect(dev.getStatus()).toEqual({ state: 'ready' });
|
|
475
475
|
});
|
|
476
476
|
it('rebuilds once an install without a known marker settles node_modules', async () => {
|
|
@@ -486,7 +486,7 @@ describe('PackagesDev', () => {
|
|
|
486
486
|
version: '2.15.4',
|
|
487
487
|
});
|
|
488
488
|
await until(() => dev.getStatus().state === 'ready');
|
|
489
|
-
expect((await props()).
|
|
489
|
+
expect((await props()).buildId).not.toBe('pending');
|
|
490
490
|
});
|
|
491
491
|
it('waits for the installer marker instead of a half-written node_modules when a lockfile exists', async () => {
|
|
492
492
|
await fse.outputJson(join(docsRoot, 'package-lock.json'), { lockfileVersion: 3, packages: {} });
|
|
@@ -693,12 +693,12 @@ describe('PackagesDev', () => {
|
|
|
693
693
|
'writing package-build.json',
|
|
694
694
|
'ENOSPC: no space left on device',
|
|
695
695
|
'outputFile',
|
|
696
|
-
(target, data, before) => target.includes(PACKAGE_BUILD_PROPS_FILE) && !String(data).includes(before.
|
|
696
|
+
(target, data, before) => target.includes(PACKAGE_BUILD_PROPS_FILE) && !String(data).includes(before.buildId),
|
|
697
697
|
],
|
|
698
698
|
])('keeps the last build when %s fails, cleans up and retries on the next save', async (_, message, name, fails) => {
|
|
699
699
|
await dev.init();
|
|
700
700
|
const before = await props();
|
|
701
|
-
const builtId = before.
|
|
701
|
+
const builtId = before.buildId;
|
|
702
702
|
await fse.ensureDir(join(buildsDir, 'stale'));
|
|
703
703
|
const spy = failOnce(name, fails, message, before);
|
|
704
704
|
try {
|
|
@@ -721,8 +721,8 @@ describe('PackagesDev', () => {
|
|
|
721
721
|
await dev.onFileChange('charts.mdx', 'page');
|
|
722
722
|
await until(() => dev.getStatus().state === 'ready');
|
|
723
723
|
const after = await props();
|
|
724
|
-
expect(after.
|
|
725
|
-
expect((await fse.readdir(buildsDir)).sort()).toEqual([builtId, after.
|
|
724
|
+
expect(after.buildId).not.toBe(before.buildId);
|
|
725
|
+
expect((await fse.readdir(buildsDir)).sort()).toEqual([builtId, after.buildId].sort());
|
|
726
726
|
});
|
|
727
727
|
});
|
|
728
728
|
it('stays off without a packages key and turns on when docs.json adds one', async () => {
|
|
@@ -744,7 +744,7 @@ describe('PackagesDev', () => {
|
|
|
744
744
|
expect(await mtime('generated.mdx')).toBeGreaterThan(0);
|
|
745
745
|
await until(() => rebuilt === 1);
|
|
746
746
|
expect(dev.enabled).toBe(true);
|
|
747
|
-
expect((await props()).
|
|
747
|
+
expect((await props()).buildId).toMatch(/^b/);
|
|
748
748
|
await fse.outputFile(join(propsPath, 'charts.mdx'), 'stale compile');
|
|
749
749
|
await fse.outputJson(join(docsRoot, 'package.json'), {
|
|
750
750
|
dependencies: { recharts: '2.15.4', '@acme/ui': '1.0.0' },
|
|
@@ -758,7 +758,7 @@ describe('PackagesDev', () => {
|
|
|
758
758
|
const settle = () => new Promise((resolve) => setTimeout(resolve, 50));
|
|
759
759
|
it('starts with packages off, shows the schema errors and turns on once it is valid', async () => {
|
|
760
760
|
await fse.outputJson(join(docsRoot, 'docs.json'), { name: 'Docs', packages: 'nope' });
|
|
761
|
-
await fse.outputJson(join(propsPath, PACKAGE_BUILD_PROPS_FILE), {
|
|
761
|
+
await fse.outputJson(join(propsPath, PACKAGE_BUILD_PROPS_FILE), { buildId: 'stale' });
|
|
762
762
|
await dev.init();
|
|
763
763
|
expect(dev.enabled).toBe(false);
|
|
764
764
|
expect(dev.getStatus()).toEqual({ state: 'disabled' });
|
|
@@ -788,7 +788,7 @@ describe('PackagesDev', () => {
|
|
|
788
788
|
await until(() => rebuilt === 1);
|
|
789
789
|
expect(dev.enabled).toBe(true);
|
|
790
790
|
expect(dev.getStatus()).toEqual({ state: 'ready' });
|
|
791
|
-
expect((await props()).
|
|
791
|
+
expect((await props()).buildId).toMatch(/^b/);
|
|
792
792
|
expect(report.calls).toEqual(['building', 'built']);
|
|
793
793
|
});
|
|
794
794
|
it('keeps the last packages setup and shows the schema errors until it is valid again', async () => {
|
|
@@ -982,7 +982,7 @@ describe('PackagesDev', () => {
|
|
|
982
982
|
});
|
|
983
983
|
it('starts with packages off and turns them on once it parses', async () => {
|
|
984
984
|
await fse.outputFile(join(docsRoot, 'docs.json'), INVALID);
|
|
985
|
-
await fse.outputJson(join(propsPath, PACKAGE_BUILD_PROPS_FILE), {
|
|
985
|
+
await fse.outputJson(join(propsPath, PACKAGE_BUILD_PROPS_FILE), { buildId: 'stale' });
|
|
986
986
|
await dev.init();
|
|
987
987
|
expect(dev.enabled).toBe(false);
|
|
988
988
|
expect(dev.getStatus()).toEqual({ state: 'disabled' });
|
|
@@ -995,7 +995,7 @@ describe('PackagesDev', () => {
|
|
|
995
995
|
await until(() => rebuilt === 1);
|
|
996
996
|
expect(dev.enabled).toBe(true);
|
|
997
997
|
expect(dev.getStatus()).toEqual({ state: 'ready' });
|
|
998
|
-
expect((await props()).
|
|
998
|
+
expect((await props()).buildId).toMatch(/^b/);
|
|
999
999
|
});
|
|
1000
1000
|
});
|
|
1001
1001
|
it('keeps the packages setup while package.json does not parse, and drops the names once it is deleted', async () => {
|
|
@@ -42,7 +42,7 @@ describe('package setup config references', () => {
|
|
|
42
42
|
tailwindSelectors: [],
|
|
43
43
|
variables,
|
|
44
44
|
packageBuild: {
|
|
45
|
-
|
|
45
|
+
buildId: 'synthetic',
|
|
46
46
|
islands: Object.fromEntries(collected.islands.map(({ id }) => [id, { prefix: `mi-${id}-`, html: '<button />' }])),
|
|
47
47
|
packageNames: [...packageNames],
|
|
48
48
|
packageSnippets: [...collected.packageSnippets],
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import type { BuildResult } from '@mintlify/package-builder';
|
|
2
|
-
import {
|
|
2
|
+
import type { PackageRouteState } from './serve.js';
|
|
3
3
|
export declare const PACKAGE_BUILD_PROPS_FILE = "package-build.json";
|
|
4
4
|
export type PackagesDevStatus = {
|
|
5
5
|
state: 'disabled';
|
|
@@ -7,7 +7,6 @@ import { formatDiagnostic, loadPackageBuilder } from '../../packages/builder.js'
|
|
|
7
7
|
import { formatProblem, PackageIslandCollector, } from '../../packages/collect.js';
|
|
8
8
|
import { errnoCode } from '../../packages/errno.js';
|
|
9
9
|
import { DocsJsonError, InvalidPackagesError, readPackagesSetup, } from '../../packages/setup.js';
|
|
10
|
-
import { PACKAGE_ROUTE_PREFIX } from './serve.js';
|
|
11
10
|
import { setPackageImportOptions } from './state.js';
|
|
12
11
|
export const PACKAGE_BUILD_PROPS_FILE = 'package-build.json';
|
|
13
12
|
const PENDING_BUILD_ID = 'pending';
|
|
@@ -153,7 +152,6 @@ export class PackagesDev {
|
|
|
153
152
|
return;
|
|
154
153
|
}
|
|
155
154
|
const buildId = this.adopted?.buildId ?? PENDING_BUILD_ID;
|
|
156
|
-
const baseUrl = `${PACKAGE_ROUTE_PREFIX}/${buildId}`;
|
|
157
155
|
const built = this.adopted?.manifest.islands ?? {};
|
|
158
156
|
const collectedIds = this.collected.islands.map((island) => island.id);
|
|
159
157
|
const islands = {};
|
|
@@ -172,7 +170,7 @@ export class PackagesDev {
|
|
|
172
170
|
this.listedIds.add(id);
|
|
173
171
|
const tmp = `${target}.${process.pid}.tmp`;
|
|
174
172
|
const props = {
|
|
175
|
-
|
|
173
|
+
buildId,
|
|
176
174
|
islands,
|
|
177
175
|
packageNames: [...this.setup.packageNames].sort(),
|
|
178
176
|
packageSnippets: [...this.collected.packageSnippets].sort(),
|