@fluojs/cli 2.0.1 → 3.0.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.ko.md +169 -21
- package/README.md +172 -21
- package/dist/cli.d.ts +5 -4
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +127 -35
- package/dist/commands/diagnostics.d.ts +35 -0
- package/dist/commands/diagnostics.d.ts.map +1 -1
- package/dist/commands/diagnostics.js +60 -0
- package/dist/commands/inspect.d.ts +5 -1
- package/dist/commands/inspect.d.ts.map +1 -1
- package/dist/commands/inspect.js +84 -17
- package/dist/commands/migrate.d.ts.map +1 -1
- package/dist/commands/migrate.js +27 -15
- package/dist/commands/migration-transform-tokens.d.ts +15 -0
- package/dist/commands/migration-transform-tokens.d.ts.map +1 -0
- package/dist/commands/migration-transform-tokens.js +41 -0
- package/dist/commands/new.d.ts.map +1 -1
- package/dist/commands/new.js +29 -9
- package/dist/commands/output-path-safety.d.ts +14 -0
- package/dist/commands/output-path-safety.d.ts.map +1 -0
- package/dist/commands/output-path-safety.js +34 -0
- package/dist/commands/scripts.js +2 -2
- package/dist/commands/typegen-artifact.d.ts +54 -0
- package/dist/commands/typegen-artifact.d.ts.map +1 -0
- package/dist/commands/typegen-artifact.js +117 -0
- package/dist/commands/typegen-generation-child.d.ts +2 -0
- package/dist/commands/typegen-generation-child.d.ts.map +1 -0
- package/dist/commands/typegen-generation-child.js +59 -0
- package/dist/commands/typegen-generation-process.d.ts +46 -0
- package/dist/commands/typegen-generation-process.d.ts.map +1 -0
- package/dist/commands/typegen-generation-process.js +131 -0
- package/dist/commands/typegen-generation-protocol.d.ts +16 -0
- package/dist/commands/typegen-generation-protocol.d.ts.map +1 -0
- package/dist/commands/typegen-generation-protocol.js +35 -0
- package/dist/commands/typegen-isolated-source.d.ts +10 -0
- package/dist/commands/typegen-isolated-source.d.ts.map +1 -0
- package/dist/commands/typegen-isolated-source.js +75 -0
- package/dist/commands/typegen-options.d.ts +20 -0
- package/dist/commands/typegen-options.d.ts.map +1 -0
- package/dist/commands/typegen-options.js +71 -0
- package/dist/commands/typegen-source.d.ts +59 -0
- package/dist/commands/typegen-source.d.ts.map +1 -0
- package/dist/commands/typegen-source.js +183 -0
- package/dist/commands/typegen-watch.d.ts +46 -0
- package/dist/commands/typegen-watch.d.ts.map +1 -0
- package/dist/commands/typegen-watch.js +212 -0
- package/dist/commands/typegen.d.ts +29 -0
- package/dist/commands/typegen.d.ts.map +1 -0
- package/dist/commands/typegen.js +119 -0
- package/dist/dev-runner/node-restart-runner.d.ts.map +1 -1
- package/dist/dev-runner/node-restart-runner.js +54 -7
- package/dist/fixtures/inspect-react-app.module.d.ts +4 -0
- package/dist/fixtures/inspect-react-app.module.d.ts.map +1 -0
- package/dist/fixtures/inspect-react-app.module.js +32 -0
- package/dist/fixtures/typegen-react-app.module.d.ts +4 -0
- package/dist/fixtures/typegen-react-app.module.d.ts.map +1 -0
- package/dist/fixtures/typegen-react-app.module.js +33 -0
- package/dist/index.d.ts +6 -5
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +3 -2
- package/dist/new/install.js +1 -1
- package/dist/new/package-spec-resolver.d.ts.map +1 -1
- package/dist/new/package-spec-resolver.js +50 -59
- package/dist/new/prompt.d.ts +1 -0
- package/dist/new/prompt.d.ts.map +1 -1
- package/dist/new/prompt.js +40 -12
- package/dist/new/published-internal-dependencies.d.ts +20 -0
- package/dist/new/published-internal-dependencies.d.ts.map +1 -0
- package/dist/new/published-internal-dependencies.js +20 -0
- package/dist/new/react-vite-ssr-scaffold.d.ts +19 -0
- package/dist/new/react-vite-ssr-scaffold.d.ts.map +1 -0
- package/dist/new/react-vite-ssr-scaffold.js +108 -0
- package/dist/new/resolver.d.ts +2 -2
- package/dist/new/resolver.d.ts.map +1 -1
- package/dist/new/resolver.js +5 -1
- package/dist/new/scaffold.d.ts.map +1 -1
- package/dist/new/scaffold.js +62 -31
- package/dist/new/starter-profiles.d.ts +8 -4
- package/dist/new/starter-profiles.d.ts.map +1 -1
- package/dist/new/starter-profiles.js +52 -18
- package/dist/new/templates/react-vite-ssr/README.md.ejs +74 -0
- package/dist/new/templates/react-vite-ssr/playwright.config.ts.ejs +26 -0
- package/dist/new/templates/react-vite-ssr/src/app.test.ts.ejs +82 -0
- package/dist/new/templates/react-vite-ssr/src/app.ts.ejs +91 -0
- package/dist/new/templates/react-vite-ssr/src/entry-client.tsx.ejs +29 -0
- package/dist/new/templates/react-vite-ssr/src/entry-server.tsx.ejs +52 -0
- package/dist/new/templates/react-vite-ssr/src/load-manifest.test.ts.ejs +55 -0
- package/dist/new/templates/react-vite-ssr/src/load-manifest.ts.ejs +53 -0
- package/dist/new/templates/react-vite-ssr/src/main.ts.ejs +18 -0
- package/dist/new/templates/react-vite-ssr/src/page.tsx.ejs +43 -0
- package/dist/new/templates/react-vite-ssr/src/react-app.test.tsx.ejs +67 -0
- package/dist/new/templates/react-vite-ssr/src/react-app.tsx.ejs +46 -0
- package/dist/new/templates/react-vite-ssr/src/styles.css.ejs +25 -0
- package/dist/new/templates/react-vite-ssr/src/styles.d.ts.ejs +1 -0
- package/dist/new/templates/react-vite-ssr/tests/production-hydration.spec.ts.ejs +54 -0
- package/dist/new/templates/react-vite-ssr/tsconfig.json.ejs +16 -0
- package/dist/new/templates/react-vite-ssr/vite.client.config.ts.ejs +24 -0
- package/dist/new/templates/react-vite-ssr/vite.server.config.ts.ejs +17 -0
- package/dist/new/templates/react-vite-ssr/vitest.config.ts.ejs +10 -0
- package/dist/new/types.d.ts +4 -0
- package/dist/new/types.d.ts.map +1 -1
- package/dist/public-typegen.d.ts +14 -0
- package/dist/public-typegen.d.ts.map +1 -0
- package/dist/public-typegen.js +17 -0
- package/dist/run-cli.d.ts +2 -1
- package/dist/run-cli.d.ts.map +1 -1
- package/dist/studio/sidecar.d.ts.map +1 -1
- package/dist/studio/sidecar.js +35 -9
- package/dist/transforms/nestjs-migrate.d.ts +4 -1
- package/dist/transforms/nestjs-migrate.d.ts.map +1 -1
- package/dist/transforms/nestjs-migrate.js +625 -65
- package/dist/typegen-contract.d.ts +10 -0
- package/dist/typegen-contract.d.ts.map +1 -0
- package/dist/typegen-contract.js +9 -0
- package/dist/usage.d.ts +6 -0
- package/dist/usage.d.ts.map +1 -1
- package/dist/usage.js +47 -0
- package/package.json +19 -10
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { createFastifyAdapter } from '@fluojs/platform-fastify';
|
|
2
|
+
import { FluoFactory } from '@fluojs/runtime';
|
|
3
|
+
|
|
4
|
+
import { createAppModule } from './app';
|
|
5
|
+
import { createReactPageRenderer } from './entry-server';
|
|
6
|
+
import { loadReactViteManifest } from './load-manifest';
|
|
7
|
+
|
|
8
|
+
const manifest = await loadReactViteManifest(new URL('../client/.vite/manifest.json', import.meta.url));
|
|
9
|
+
const AppModule = createAppModule({
|
|
10
|
+
clientDirectory: new URL('../client/', import.meta.url),
|
|
11
|
+
renderPage: createReactPageRenderer(manifest),
|
|
12
|
+
});
|
|
13
|
+
const port = Number(process.env.PORT ?? '3000');
|
|
14
|
+
const app = await FluoFactory.create(AppModule, {
|
|
15
|
+
adapter: createFastifyAdapter({ host: '127.0.0.1', port }),
|
|
16
|
+
});
|
|
17
|
+
|
|
18
|
+
await app.listen();
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import {
|
|
2
|
+
Link,
|
|
3
|
+
useParams,
|
|
4
|
+
useRouter,
|
|
5
|
+
useSearchParams,
|
|
6
|
+
} from '@fluojs/react/client';
|
|
7
|
+
import { type ReactElement, useId, useState } from 'react';
|
|
8
|
+
|
|
9
|
+
export function HydratedCounter(): ReactElement {
|
|
10
|
+
const [count, setCount] = useState(0);
|
|
11
|
+
return <button onClick={() => setCount((value) => value + 1)} type='button'>Count: {count}</button>;
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
function ProductNavigation(): ReactElement {
|
|
15
|
+
const router = useRouter();
|
|
16
|
+
|
|
17
|
+
return (
|
|
18
|
+
<nav aria-label='Product navigation'>
|
|
19
|
+
<Link href='/products/sku-84?preview=false'>Open sku-84</Link>
|
|
20
|
+
<button onClick={() => router.push('/products/sku-126?preview=true')} type='button'>
|
|
21
|
+
Push sku-126
|
|
22
|
+
</button>
|
|
23
|
+
</nav>
|
|
24
|
+
);
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
export function ProductPage(): ReactElement {
|
|
28
|
+
const identifier = useId();
|
|
29
|
+
const params = useParams();
|
|
30
|
+
const searchParams = useSearchParams();
|
|
31
|
+
const sku = params['sku'] ?? 'unknown';
|
|
32
|
+
const preview = searchParams.get('preview') === 'true';
|
|
33
|
+
|
|
34
|
+
return (
|
|
35
|
+
<main>
|
|
36
|
+
<h1>{`Catalog item ${sku}`}</h1>
|
|
37
|
+
<p>{preview ? 'Preview mode' : 'Published mode'}</p>
|
|
38
|
+
<p data-react-identifier id={identifier}>Shared hydration identifier</p>
|
|
39
|
+
<HydratedCounter />
|
|
40
|
+
<ProductNavigation />
|
|
41
|
+
</main>
|
|
42
|
+
);
|
|
43
|
+
}
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
// @vitest-environment happy-dom
|
|
2
|
+
|
|
3
|
+
import { ReactClientRouterProvider, createReactRouteSnapshot } from '@fluojs/react/client';
|
|
4
|
+
import { hydrateRoot } from 'react-dom/client';
|
|
5
|
+
import { renderToString } from 'react-dom/server';
|
|
6
|
+
import { afterEach, describe, expect, it, vi } from 'vitest';
|
|
7
|
+
|
|
8
|
+
import { HydratedCounter, ProductPage } from './page';
|
|
9
|
+
import { ReactAppDocument, reportReactHydrationMismatch } from './react-app';
|
|
10
|
+
|
|
11
|
+
describe('React Vite SSR app composition', () => {
|
|
12
|
+
afterEach(() => {
|
|
13
|
+
document.body.replaceChildren();
|
|
14
|
+
vi.restoreAllMocks();
|
|
15
|
+
});
|
|
16
|
+
|
|
17
|
+
it('renders the HTTP-owned route snapshot through the shared document', () => {
|
|
18
|
+
const html = renderToString(
|
|
19
|
+
<ReactAppDocument
|
|
20
|
+
page={<ProductPage />}
|
|
21
|
+
route={{ params: { sku: 'sku-42' }, url: '/products/sku-42?preview=true' }}
|
|
22
|
+
stylesheets={['/assets/styles.css']}
|
|
23
|
+
/>,
|
|
24
|
+
);
|
|
25
|
+
|
|
26
|
+
expect(html).toContain('Catalog item sku-42');
|
|
27
|
+
expect(html).toContain('Preview mode');
|
|
28
|
+
expect(html).toContain('href="/assets/styles.css"');
|
|
29
|
+
expect(html).toContain('data-route-sku="sku-42"');
|
|
30
|
+
});
|
|
31
|
+
|
|
32
|
+
it('reports actionable application files when hydration mismatches', () => {
|
|
33
|
+
const consoleError = vi.spyOn(console, 'error').mockImplementation(() => undefined);
|
|
34
|
+
const mismatch = new Error('Hydration mismatch');
|
|
35
|
+
|
|
36
|
+
reportReactHydrationMismatch(mismatch);
|
|
37
|
+
|
|
38
|
+
expect(consoleError).toHaveBeenCalledWith(expect.stringContaining('src/entry-client.tsx'), mismatch);
|
|
39
|
+
expect(consoleError).toHaveBeenCalledWith(expect.stringContaining('src/entry-server.tsx'), mismatch);
|
|
40
|
+
expect(consoleError).toHaveBeenCalledWith(expect.stringContaining('src/react-app.tsx'), mismatch);
|
|
41
|
+
expect(consoleError).toHaveBeenCalledWith(expect.stringContaining('vite.client.config.ts'), mismatch);
|
|
42
|
+
expect(consoleError).toHaveBeenCalledWith(expect.stringContaining('generated build script'), mismatch);
|
|
43
|
+
});
|
|
44
|
+
|
|
45
|
+
it('attaches interaction without hydration warnings', async () => {
|
|
46
|
+
const consoleError = vi.spyOn(console, 'error').mockImplementation(() => undefined);
|
|
47
|
+
const container = document.createElement('div');
|
|
48
|
+
const initialSnapshot = createReactRouteSnapshot({ url: '/products/sku-42' });
|
|
49
|
+
const counter = (
|
|
50
|
+
<ReactClientRouterProvider initialSnapshot={initialSnapshot}>
|
|
51
|
+
<HydratedCounter />
|
|
52
|
+
</ReactClientRouterProvider>
|
|
53
|
+
);
|
|
54
|
+
container.innerHTML = renderToString(counter);
|
|
55
|
+
document.body.append(container);
|
|
56
|
+
|
|
57
|
+
const root = hydrateRoot(container, counter);
|
|
58
|
+
await new Promise<void>((resolve) => queueMicrotask(resolve));
|
|
59
|
+
const button = document.querySelector('button');
|
|
60
|
+
button?.click();
|
|
61
|
+
await new Promise<void>((resolve) => queueMicrotask(resolve));
|
|
62
|
+
|
|
63
|
+
expect(button?.textContent).toBe('Count: 1');
|
|
64
|
+
expect(consoleError).not.toHaveBeenCalled();
|
|
65
|
+
root.unmount();
|
|
66
|
+
});
|
|
67
|
+
});
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import {
|
|
2
|
+
ReactClientRouterProvider,
|
|
3
|
+
createReactRouteSnapshot,
|
|
4
|
+
type ReactRouteSnapshotInput,
|
|
5
|
+
} from '@fluojs/react/client';
|
|
6
|
+
import type { ReactElement } from 'react';
|
|
7
|
+
|
|
8
|
+
export const REACT_IDENTIFIER_PREFIX = 'fluo-react-vite-' as const;
|
|
9
|
+
|
|
10
|
+
export type ReactAppDocumentProps = {
|
|
11
|
+
readonly page: ReactElement;
|
|
12
|
+
readonly route: ReactRouteSnapshotInput;
|
|
13
|
+
readonly stylesheets: readonly string[];
|
|
14
|
+
};
|
|
15
|
+
|
|
16
|
+
export function reportReactHydrationMismatch(error: unknown): void {
|
|
17
|
+
console.error(
|
|
18
|
+
'React hydration did not match. Compare src/entry-client.tsx, src/entry-server.tsx, and src/react-app.tsx; check vite.client.config.ts, then run the generated build script again.',
|
|
19
|
+
error,
|
|
20
|
+
);
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
export function ReactAppDocument({
|
|
24
|
+
page,
|
|
25
|
+
route,
|
|
26
|
+
stylesheets,
|
|
27
|
+
}: ReactAppDocumentProps): ReactElement {
|
|
28
|
+
const initialSnapshot = createReactRouteSnapshot(route);
|
|
29
|
+
|
|
30
|
+
return (
|
|
31
|
+
<ReactClientRouterProvider initialSnapshot={initialSnapshot}>
|
|
32
|
+
<html data-route-sku={initialSnapshot.params['sku'] ?? ''} lang='en'>
|
|
33
|
+
<head>
|
|
34
|
+
<meta charSet='utf-8' />
|
|
35
|
+
<meta content='width=device-width, initial-scale=1' name='viewport' />
|
|
36
|
+
<link href='data:image/svg+xml,<svg xmlns="http://www.w3.org/2000/svg"/>' rel='icon' />
|
|
37
|
+
<title>Fluo React starter</title>
|
|
38
|
+
{stylesheets.map((href) => (
|
|
39
|
+
<link data-vite-style href={href} key={href} rel='stylesheet' />
|
|
40
|
+
))}
|
|
41
|
+
</head>
|
|
42
|
+
<body>{page}</body>
|
|
43
|
+
</html>
|
|
44
|
+
</ReactClientRouterProvider>
|
|
45
|
+
);
|
|
46
|
+
}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
:root {
|
|
2
|
+
color: #172033;
|
|
3
|
+
font-family: system-ui, sans-serif;
|
|
4
|
+
}
|
|
5
|
+
|
|
6
|
+
body {
|
|
7
|
+
margin: 0;
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
main {
|
|
11
|
+
margin: 0 auto;
|
|
12
|
+
max-width: 48rem;
|
|
13
|
+
padding: 4rem 1.5rem;
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
nav {
|
|
17
|
+
display: grid;
|
|
18
|
+
gap: 0.75rem;
|
|
19
|
+
margin-top: 2rem;
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
button,
|
|
23
|
+
a {
|
|
24
|
+
font: inherit;
|
|
25
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
declare module '*.css';
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
import { expect, test } from '@playwright/test';
|
|
2
|
+
|
|
3
|
+
test('hydrates production HTML and preserves HTTP-first navigation', async ({ page }) => {
|
|
4
|
+
const browserDiagnostics: string[] = [];
|
|
5
|
+
const assetResponses = new Map<string, number>();
|
|
6
|
+
|
|
7
|
+
page.on('console', (message) => {
|
|
8
|
+
if (message.type() === 'error' || message.type() === 'warning') {
|
|
9
|
+
browserDiagnostics.push(`${message.type()}: ${message.text()}`);
|
|
10
|
+
}
|
|
11
|
+
});
|
|
12
|
+
page.on('pageerror', (error) => browserDiagnostics.push(`pageerror: ${error.message}`));
|
|
13
|
+
page.on('response', (response) => {
|
|
14
|
+
const pathname = new URL(response.url()).pathname;
|
|
15
|
+
if (pathname.startsWith('/assets/')) {
|
|
16
|
+
assetResponses.set(pathname, response.status());
|
|
17
|
+
}
|
|
18
|
+
});
|
|
19
|
+
|
|
20
|
+
const response = await page.goto('/products/sku-42?preview=true', { waitUntil: 'load' });
|
|
21
|
+
if (response === null) {
|
|
22
|
+
throw new TypeError('The production page did not return a navigation response.');
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
const bootstrapPaths = await page.locator('script[type="module"][src]').evaluateAll((scripts) =>
|
|
26
|
+
scripts.map((script) => new URL(script.getAttribute('src') ?? '', document.baseURI).pathname),
|
|
27
|
+
);
|
|
28
|
+
const stylesheetPaths = await page.locator('link[data-vite-style][href]').evaluateAll((links) =>
|
|
29
|
+
links.map((link) => new URL(link.getAttribute('href') ?? '', document.baseURI).pathname),
|
|
30
|
+
);
|
|
31
|
+
|
|
32
|
+
expect(response.status()).toBe(200);
|
|
33
|
+
expect(response.headers()['content-type']).toContain('text/html');
|
|
34
|
+
expect(bootstrapPaths).toContain('/assets/entry-client.js');
|
|
35
|
+
expect(stylesheetPaths).toHaveLength(1);
|
|
36
|
+
for (const pathname of [...bootstrapPaths, ...stylesheetPaths]) {
|
|
37
|
+
expect(assetResponses.get(pathname)).toBe(200);
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
await expect(page.getByRole('heading', { name: 'Catalog item sku-42' })).toBeVisible();
|
|
41
|
+
await page.getByRole('button', { name: 'Count: 0' }).click();
|
|
42
|
+
await expect(page.getByRole('button', { name: 'Count: 1' })).toBeVisible();
|
|
43
|
+
|
|
44
|
+
const link = page.getByRole('link', { name: 'Open sku-84' });
|
|
45
|
+
await expect(link).toHaveAttribute('href', '/products/sku-84?preview=false');
|
|
46
|
+
await link.click();
|
|
47
|
+
await expect(page).toHaveURL(/\/products\/sku-84\?preview=false$/u);
|
|
48
|
+
await expect(page.getByRole('heading', { name: 'Catalog item sku-84' })).toBeVisible();
|
|
49
|
+
|
|
50
|
+
await page.getByRole('button', { name: 'Push sku-126' }).click();
|
|
51
|
+
await expect(page).toHaveURL(/\/products\/sku-126\?preview=true$/u);
|
|
52
|
+
await expect(page.getByRole('heading', { name: 'Catalog item sku-126' })).toBeVisible();
|
|
53
|
+
expect(browserDiagnostics).toEqual([]);
|
|
54
|
+
});
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
{
|
|
2
|
+
"compilerOptions": {
|
|
3
|
+
"target": "ES2022",
|
|
4
|
+
"module": "ESNext",
|
|
5
|
+
"moduleResolution": "Bundler",
|
|
6
|
+
"strict": true,
|
|
7
|
+
"noEmit": true,
|
|
8
|
+
"skipLibCheck": true,
|
|
9
|
+
"esModuleInterop": true,
|
|
10
|
+
"forceConsistentCasingInFileNames": true,
|
|
11
|
+
"jsx": "react-jsx",
|
|
12
|
+
"resolveJsonModule": true,
|
|
13
|
+
"types": ["node"]
|
|
14
|
+
},
|
|
15
|
+
"include": ["src/**/*.ts", "src/**/*.tsx", "tests/**/*.ts", "*.config.ts"]
|
|
16
|
+
}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { fileURLToPath } from 'node:url';
|
|
2
|
+
|
|
3
|
+
import { defineConfig } from 'vite';
|
|
4
|
+
|
|
5
|
+
export default defineConfig({
|
|
6
|
+
base: '/assets/',
|
|
7
|
+
build: {
|
|
8
|
+
emptyOutDir: true,
|
|
9
|
+
manifest: true,
|
|
10
|
+
outDir: 'dist/client',
|
|
11
|
+
rolldownOptions: {
|
|
12
|
+
input: {
|
|
13
|
+
'entry-client': fileURLToPath(new URL('./src/entry-client.tsx', import.meta.url)),
|
|
14
|
+
'entry-server': fileURLToPath(new URL('./src/entry-server.tsx', import.meta.url)),
|
|
15
|
+
},
|
|
16
|
+
output: {
|
|
17
|
+
assetFileNames: '[name]-[hash][extname]',
|
|
18
|
+
chunkFileNames: '[name]-[hash].js',
|
|
19
|
+
entryFileNames: '[name].js',
|
|
20
|
+
},
|
|
21
|
+
},
|
|
22
|
+
target: 'es2022',
|
|
23
|
+
},
|
|
24
|
+
});
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { fluoDecoratorsPlugin } from '@fluojs/vite';
|
|
2
|
+
import { defineConfig } from 'vite';
|
|
3
|
+
|
|
4
|
+
export default defineConfig({
|
|
5
|
+
build: {
|
|
6
|
+
emptyOutDir: false,
|
|
7
|
+
outDir: 'dist/server',
|
|
8
|
+
rolldownOptions: {
|
|
9
|
+
output: {
|
|
10
|
+
entryFileNames: 'main.js',
|
|
11
|
+
},
|
|
12
|
+
},
|
|
13
|
+
ssr: 'src/main.ts',
|
|
14
|
+
target: 'node24',
|
|
15
|
+
},
|
|
16
|
+
plugins: [fluoDecoratorsPlugin()],
|
|
17
|
+
});
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { fluoBabelDecoratorsPlugin } from '@fluojs/testing/vitest';
|
|
2
|
+
import { defineConfig } from 'vitest/config';
|
|
3
|
+
|
|
4
|
+
export default defineConfig({
|
|
5
|
+
plugins: [fluoBabelDecoratorsPlugin()],
|
|
6
|
+
test: {
|
|
7
|
+
environment: 'node',
|
|
8
|
+
include: ['src/**/*.test.ts', 'src/**/*.test.tsx'],
|
|
9
|
+
},
|
|
10
|
+
});
|
package/dist/new/types.d.ts
CHANGED
|
@@ -4,6 +4,8 @@ export type PackageManager = 'bun' | 'npm' | 'pnpm' | 'yarn';
|
|
|
4
4
|
export type DependencySource = 'local' | 'published';
|
|
5
5
|
/** Supported starter shapes for `fluo new`. */
|
|
6
6
|
export type BootstrapShape = 'application' | 'microservice' | 'mixed';
|
|
7
|
+
/** Named starter variants exposed by `fluo new`. */
|
|
8
|
+
export type BootstrapStarter = 'react-vite-ssr' | 'standard';
|
|
7
9
|
/** Supported runtime families for the current starter matrix. */
|
|
8
10
|
export type BootstrapRuntime = 'bun' | 'cloudflare-workers' | 'deno' | 'node';
|
|
9
11
|
/** Supported platform adapters for the current starter matrix. */
|
|
@@ -36,6 +38,7 @@ export interface BootstrapOptions extends BootstrapSchema {
|
|
|
36
38
|
projectName: string;
|
|
37
39
|
repoRoot?: string;
|
|
38
40
|
skipInstall?: boolean;
|
|
41
|
+
starter?: BootstrapStarter;
|
|
39
42
|
targetDirectory: string;
|
|
40
43
|
}
|
|
41
44
|
/** Prompt descriptor for bootstrap answer collection. */
|
|
@@ -49,6 +52,7 @@ export interface BootstrapAnswers extends BootstrapSchema {
|
|
|
49
52
|
installDependencies: boolean;
|
|
50
53
|
packageManager: PackageManager;
|
|
51
54
|
projectName: string;
|
|
55
|
+
starter: BootstrapStarter;
|
|
52
56
|
targetDirectory: string;
|
|
53
57
|
}
|
|
54
58
|
/** Programmatic overrides for `runNewCommand(...)`. */
|
package/dist/new/types.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/new/types.ts"],"names":[],"mappings":"AAAA,yDAAyD;AACzD,MAAM,MAAM,cAAc,GAAG,KAAK,GAAG,KAAK,GAAG,MAAM,GAAG,MAAM,CAAC;AAC7D,yDAAyD;AACzD,MAAM,MAAM,gBAAgB,GAAG,OAAO,GAAG,WAAW,CAAC;AACrD,+CAA+C;AAC/C,MAAM,MAAM,cAAc,GAAG,aAAa,GAAG,cAAc,GAAG,OAAO,CAAC;AACtE,iEAAiE;AACjE,MAAM,MAAM,gBAAgB,GAAG,KAAK,GAAG,oBAAoB,GAAG,MAAM,GAAG,MAAM,CAAC;AAC9E,kEAAkE;AAClE,MAAM,MAAM,iBAAiB,GAAG,KAAK,GAAG,oBAAoB,GAAG,MAAM,GAAG,SAAS,GAAG,SAAS,GAAG,QAAQ,GAAG,MAAM,CAAC;AAClH,mEAAmE;AACnE,MAAM,MAAM,kBAAkB,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,MAAM,GAAG,MAAM,GAAG,UAAU,GAAG,eAAe,GAAG,KAAK,CAAC;AACpH,gEAAgE;AAChE,MAAM,MAAM,sBAAsB,GAAG,UAAU,CAAC;AAEhD,0DAA0D;AAC1D,MAAM,WAAW,iBAAiB;IAChC,QAAQ,EAAE,OAAO,CAAC;IAClB,IAAI,EAAE,gBAAgB,CAAC;CACxB;AAED,mEAAmE;AACnE,MAAM,WAAW,eAAe;IAC9B,QAAQ,EAAE,iBAAiB,CAAC;IAC5B,OAAO,EAAE,gBAAgB,CAAC;IAC1B,KAAK,EAAE,cAAc,CAAC;IACtB,OAAO,EAAE,sBAAsB,CAAC;IAChC,QAAQ,EAAE,iBAAiB,CAAC;IAC5B,SAAS,EAAE,kBAAkB,CAAC;CAC/B;AAED,2EAA2E;AAC3E,MAAM,WAAW,gBAAiB,SAAQ,eAAe;IACvD,gBAAgB,CAAC,EAAE,gBAAgB,CAAC;IACpC,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,mBAAmB,CAAC,EAAE,OAAO,CAAC;IAC9B,cAAc,EAAE,cAAc,CAAC;IAC/B,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,eAAe,EAAE,MAAM,CAAC;CACzB;AAED,yDAAyD;AACzD,MAAM,WAAW,eAAe;IAC9B,GAAG,EAAE,MAAM,gBAAgB,CAAC;IAC5B,KAAK,EAAE,MAAM,CAAC;CACf;AAED,mFAAmF;AACnF,MAAM,WAAW,gBAAiB,SAAQ,eAAe;IACvD,aAAa,EAAE,OAAO,CAAC;IACvB,mBAAmB,EAAE,OAAO,CAAC;IAC7B,cAAc,EAAE,cAAc,CAAC;IAC/B,WAAW,EAAE,MAAM,CAAC;IACpB,eAAe,EAAE,MAAM,CAAC;CACzB;AAED,uDAAuD;AACvD,MAAM,WAAW,iBAAiB;IAChC,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,mBAAmB,CAAC,EAAE,OAAO,CAAC;IAC9B,WAAW,CAAC,EAAE,OAAO,CAAC;CACvB"}
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/new/types.ts"],"names":[],"mappings":"AAAA,yDAAyD;AACzD,MAAM,MAAM,cAAc,GAAG,KAAK,GAAG,KAAK,GAAG,MAAM,GAAG,MAAM,CAAC;AAC7D,yDAAyD;AACzD,MAAM,MAAM,gBAAgB,GAAG,OAAO,GAAG,WAAW,CAAC;AACrD,+CAA+C;AAC/C,MAAM,MAAM,cAAc,GAAG,aAAa,GAAG,cAAc,GAAG,OAAO,CAAC;AACtE,oDAAoD;AACpD,MAAM,MAAM,gBAAgB,GAAG,gBAAgB,GAAG,UAAU,CAAC;AAC7D,iEAAiE;AACjE,MAAM,MAAM,gBAAgB,GAAG,KAAK,GAAG,oBAAoB,GAAG,MAAM,GAAG,MAAM,CAAC;AAC9E,kEAAkE;AAClE,MAAM,MAAM,iBAAiB,GAAG,KAAK,GAAG,oBAAoB,GAAG,MAAM,GAAG,SAAS,GAAG,SAAS,GAAG,QAAQ,GAAG,MAAM,CAAC;AAClH,mEAAmE;AACnE,MAAM,MAAM,kBAAkB,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,MAAM,GAAG,MAAM,GAAG,UAAU,GAAG,eAAe,GAAG,KAAK,CAAC;AACpH,gEAAgE;AAChE,MAAM,MAAM,sBAAsB,GAAG,UAAU,CAAC;AAEhD,0DAA0D;AAC1D,MAAM,WAAW,iBAAiB;IAChC,QAAQ,EAAE,OAAO,CAAC;IAClB,IAAI,EAAE,gBAAgB,CAAC;CACxB;AAED,mEAAmE;AACnE,MAAM,WAAW,eAAe;IAC9B,QAAQ,EAAE,iBAAiB,CAAC;IAC5B,OAAO,EAAE,gBAAgB,CAAC;IAC1B,KAAK,EAAE,cAAc,CAAC;IACtB,OAAO,EAAE,sBAAsB,CAAC;IAChC,QAAQ,EAAE,iBAAiB,CAAC;IAC5B,SAAS,EAAE,kBAAkB,CAAC;CAC/B;AAED,2EAA2E;AAC3E,MAAM,WAAW,gBAAiB,SAAQ,eAAe;IACvD,gBAAgB,CAAC,EAAE,gBAAgB,CAAC;IACpC,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,mBAAmB,CAAC,EAAE,OAAO,CAAC;IAC9B,cAAc,EAAE,cAAc,CAAC;IAC/B,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,OAAO,CAAC,EAAE,gBAAgB,CAAC;IAC3B,eAAe,EAAE,MAAM,CAAC;CACzB;AAED,yDAAyD;AACzD,MAAM,WAAW,eAAe;IAC9B,GAAG,EAAE,MAAM,gBAAgB,CAAC;IAC5B,KAAK,EAAE,MAAM,CAAC;CACf;AAED,mFAAmF;AACnF,MAAM,WAAW,gBAAiB,SAAQ,eAAe;IACvD,aAAa,EAAE,OAAO,CAAC;IACvB,mBAAmB,EAAE,OAAO,CAAC;IAC7B,cAAc,EAAE,cAAc,CAAC;IAC/B,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,gBAAgB,CAAC;IAC1B,eAAe,EAAE,MAAM,CAAC;CACzB;AAED,uDAAuD;AACvD,MAAM,WAAW,iBAAiB;IAChC,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,mBAAmB,CAAC,EAAE,OAAO,CAAC;IAC9B,WAAW,CAAC,EAAE,OAAO,CAAC;CACvB"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import type { TypegenCommandRuntimeOptions } from './commands/typegen.js';
|
|
2
|
+
import { TYPEGEN_EXIT_CODES } from './typegen-contract.js';
|
|
3
|
+
import { typegenUsage } from './usage.js';
|
|
4
|
+
export type { TypegenCommandRuntimeOptions } from './commands/typegen.js';
|
|
5
|
+
export { TYPEGEN_EXIT_CODES, typegenUsage };
|
|
6
|
+
/**
|
|
7
|
+
* Runs React page generation, checking, or watch mode through a lazy implementation import.
|
|
8
|
+
*
|
|
9
|
+
* @param argv Command arguments after `typegen`.
|
|
10
|
+
* @param runtime Runtime overrides for programmatic callers.
|
|
11
|
+
* @returns Process-style exit code from the typegen command.
|
|
12
|
+
*/
|
|
13
|
+
export declare function runTypegenCommand(argv: readonly string[], runtime?: TypegenCommandRuntimeOptions): Promise<number>;
|
|
14
|
+
//# sourceMappingURL=public-typegen.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"public-typegen.d.ts","sourceRoot":"","sources":["../src/public-typegen.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,4BAA4B,EAAE,MAAM,uBAAuB,CAAC;AAC1E,OAAO,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AAC3D,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAE1C,YAAY,EAAE,4BAA4B,EAAE,MAAM,uBAAuB,CAAC;AAC1E,OAAO,EAAE,kBAAkB,EAAE,YAAY,EAAE,CAAC;AAE5C;;;;;;GAMG;AACH,wBAAsB,iBAAiB,CACrC,IAAI,EAAE,SAAS,MAAM,EAAE,EACvB,OAAO,GAAE,4BAAiC,GACzC,OAAO,CAAC,MAAM,CAAC,CAGjB"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { TYPEGEN_EXIT_CODES } from './typegen-contract.js';
|
|
2
|
+
import { typegenUsage } from './usage.js';
|
|
3
|
+
export { TYPEGEN_EXIT_CODES, typegenUsage };
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* Runs React page generation, checking, or watch mode through a lazy implementation import.
|
|
7
|
+
*
|
|
8
|
+
* @param argv Command arguments after `typegen`.
|
|
9
|
+
* @param runtime Runtime overrides for programmatic callers.
|
|
10
|
+
* @returns Process-style exit code from the typegen command.
|
|
11
|
+
*/
|
|
12
|
+
export async function runTypegenCommand(argv, runtime = {}) {
|
|
13
|
+
const {
|
|
14
|
+
runTypegenCommand: runTypegenCommandImplementation
|
|
15
|
+
} = await import('./commands/typegen.js');
|
|
16
|
+
return runTypegenCommandImplementation(argv, runtime);
|
|
17
|
+
}
|
package/dist/run-cli.d.ts
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import type { CliRuntimeOptions } from './cli.js';
|
|
2
2
|
import type { InspectCommandRuntimeOptions } from './commands/inspect.js';
|
|
3
3
|
import type { NewCommandRuntimeOptions } from './commands/new.js';
|
|
4
|
+
import type { TypegenCommandRuntimeOptions } from './commands/typegen.js';
|
|
4
5
|
export type { CliRuntimeOptions } from './cli.js';
|
|
5
6
|
/**
|
|
6
7
|
* Runs the top-level CLI command dispatcher through a lazy implementation import.
|
|
@@ -12,5 +13,5 @@ export type { CliRuntimeOptions } from './cli.js';
|
|
|
12
13
|
* @param runtime Optional runtime overrides shared by the top-level dispatcher and delegated commands.
|
|
13
14
|
* @returns `0` when the command completes successfully, otherwise the delegated command exit code.
|
|
14
15
|
*/
|
|
15
|
-
export declare function runCli(argv?: string[], runtime?: CliRuntimeOptions & NewCommandRuntimeOptions & InspectCommandRuntimeOptions): Promise<number>;
|
|
16
|
+
export declare function runCli(argv?: string[], runtime?: CliRuntimeOptions & NewCommandRuntimeOptions & InspectCommandRuntimeOptions & TypegenCommandRuntimeOptions): Promise<number>;
|
|
16
17
|
//# sourceMappingURL=run-cli.d.ts.map
|
package/dist/run-cli.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"run-cli.d.ts","sourceRoot":"","sources":["../src/run-cli.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,UAAU,CAAC;AAClD,OAAO,KAAK,EAAE,4BAA4B,EAAE,MAAM,uBAAuB,CAAC;AAC1E,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,mBAAmB,CAAC;
|
|
1
|
+
{"version":3,"file":"run-cli.d.ts","sourceRoot":"","sources":["../src/run-cli.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,UAAU,CAAC;AAClD,OAAO,KAAK,EAAE,4BAA4B,EAAE,MAAM,uBAAuB,CAAC;AAC1E,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,mBAAmB,CAAC;AAClE,OAAO,KAAK,EAAE,4BAA4B,EAAE,MAAM,uBAAuB,CAAC;AAE1E,YAAY,EAAE,iBAAiB,EAAE,MAAM,UAAU,CAAC;AAElD;;;;;;;;;GASG;AACH,wBAAsB,MAAM,CAC1B,IAAI,CAAC,EAAE,MAAM,EAAE,EACf,OAAO,GAAE,iBAAiB,GAAG,wBAAwB,GAAG,4BAA4B,GAAG,4BAAiC,GACvH,OAAO,CAAC,MAAM,CAAC,CAGjB"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sidecar.d.ts","sourceRoot":"","sources":["../../src/studio/sidecar.ts"],"names":[],"mappings":"AAOA;;GAEG;AACH,MAAM,MAAM,oBAAoB,GAAG,KAAK,GAAG,MAAM,GAAG,MAAM,GAAG,SAAS,CAAC;AAEvE;;GAEG;AACH,MAAM,WAAW,oBAAoB;IACnC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,oBAAoB,CAAC;CAChC;AAED;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC,UAAU,CAAC;IAChC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CACxB;
|
|
1
|
+
{"version":3,"file":"sidecar.d.ts","sourceRoot":"","sources":["../../src/studio/sidecar.ts"],"names":[],"mappings":"AAOA;;GAEG;AACH,MAAM,MAAM,oBAAoB,GAAG,KAAK,GAAG,MAAM,GAAG,MAAM,GAAG,SAAS,CAAC;AAEvE;;GAEG;AACH,MAAM,WAAW,oBAAoB;IACnC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,oBAAoB,CAAC;CAChC;AAED;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC,UAAU,CAAC;IAChC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CACxB;AAkVD;;;;;GAKG;AACH,wBAAsB,kBAAkB,CAAC,OAAO,GAAE,oBAAyB,GAAG,OAAO,CAAC,aAAa,CAAC,CAwMnG"}
|
package/dist/studio/sidecar.js
CHANGED
|
@@ -296,6 +296,8 @@ export async function startStudioSidecar(options = {}) {
|
|
|
296
296
|
const token = createToken();
|
|
297
297
|
const events = [];
|
|
298
298
|
const clients = new Set();
|
|
299
|
+
const ingestionRequests = new Set();
|
|
300
|
+
let acceptingIngestion = true;
|
|
299
301
|
let sequence = 0;
|
|
300
302
|
const startedAt = performance.now();
|
|
301
303
|
const publish = incoming => {
|
|
@@ -385,6 +387,11 @@ export async function startStudioSidecar(options = {}) {
|
|
|
385
387
|
return;
|
|
386
388
|
}
|
|
387
389
|
if (request.method === 'POST' && requestUrl.pathname === '/api/runtime/events') {
|
|
390
|
+
if (!acceptingIngestion) {
|
|
391
|
+
request.socket.destroy();
|
|
392
|
+
return;
|
|
393
|
+
}
|
|
394
|
+
ingestionRequests.add(request);
|
|
388
395
|
try {
|
|
389
396
|
const body = await readBody(request);
|
|
390
397
|
const parsed = body ? JSON.parse(body) : {};
|
|
@@ -411,6 +418,8 @@ export async function startStudioSidecar(options = {}) {
|
|
|
411
418
|
writeJson(response, 400, {
|
|
412
419
|
error: error instanceof Error ? error.message : String(error)
|
|
413
420
|
});
|
|
421
|
+
} finally {
|
|
422
|
+
ingestionRequests.delete(request);
|
|
414
423
|
}
|
|
415
424
|
return;
|
|
416
425
|
}
|
|
@@ -427,7 +436,11 @@ export async function startStudioSidecar(options = {}) {
|
|
|
427
436
|
});
|
|
428
437
|
const address = server.address();
|
|
429
438
|
if (!address || typeof address === 'string') {
|
|
430
|
-
await closeServer(server,
|
|
439
|
+
await closeServer(server, {
|
|
440
|
+
clients,
|
|
441
|
+
heartbeat: undefined,
|
|
442
|
+
ingestionRequests
|
|
443
|
+
});
|
|
431
444
|
throw new Error('Failed to resolve Studio sidecar address.');
|
|
432
445
|
}
|
|
433
446
|
const url = `http://${host}:${String(address.port)}`;
|
|
@@ -444,6 +457,7 @@ export async function startStudioSidecar(options = {}) {
|
|
|
444
457
|
});
|
|
445
458
|
}, options.heartbeatMs ?? DEFAULT_HEARTBEAT_MS);
|
|
446
459
|
heartbeat?.unref();
|
|
460
|
+
let closePromise;
|
|
447
461
|
return {
|
|
448
462
|
appId,
|
|
449
463
|
get epoch() {
|
|
@@ -462,20 +476,28 @@ export async function startStudioSidecar(options = {}) {
|
|
|
462
476
|
port: address.port,
|
|
463
477
|
token,
|
|
464
478
|
url,
|
|
465
|
-
|
|
466
|
-
|
|
479
|
+
close() {
|
|
480
|
+
if (!closePromise) {
|
|
481
|
+
acceptingIngestion = false;
|
|
482
|
+
closePromise = closeServer(server, {
|
|
483
|
+
clients,
|
|
484
|
+
heartbeat,
|
|
485
|
+
ingestionRequests
|
|
486
|
+
});
|
|
487
|
+
}
|
|
488
|
+
return closePromise;
|
|
467
489
|
}
|
|
468
490
|
};
|
|
469
491
|
}
|
|
470
|
-
async function closeServer(server,
|
|
471
|
-
if (heartbeat) {
|
|
472
|
-
clearInterval(heartbeat);
|
|
492
|
+
async function closeServer(server, resources) {
|
|
493
|
+
if (resources.heartbeat) {
|
|
494
|
+
clearInterval(resources.heartbeat);
|
|
473
495
|
}
|
|
474
|
-
for (const client of clients) {
|
|
496
|
+
for (const client of resources.clients) {
|
|
475
497
|
client.response.end();
|
|
476
498
|
}
|
|
477
|
-
clients.clear();
|
|
478
|
-
|
|
499
|
+
resources.clients.clear();
|
|
500
|
+
const serverClosed = new Promise((resolve, reject) => {
|
|
479
501
|
server.close(error => {
|
|
480
502
|
if (error) {
|
|
481
503
|
reject(error);
|
|
@@ -484,4 +506,8 @@ async function closeServer(server, clients, heartbeat) {
|
|
|
484
506
|
resolve();
|
|
485
507
|
});
|
|
486
508
|
});
|
|
509
|
+
for (const request of resources.ingestionRequests) {
|
|
510
|
+
request.socket.destroy();
|
|
511
|
+
}
|
|
512
|
+
await serverClosed;
|
|
487
513
|
}
|
|
@@ -6,10 +6,11 @@ export declare const MIGRATION_TRANSFORMS: readonly ["imports", "injectable", "s
|
|
|
6
6
|
* Defines the migration transform kind type.
|
|
7
7
|
*/
|
|
8
8
|
export type MigrationTransformKind = typeof MIGRATION_TRANSFORMS[number];
|
|
9
|
+
type BootstrapPlatform = 'express';
|
|
9
10
|
/**
|
|
10
11
|
* Provides the warning categories value.
|
|
11
12
|
*/
|
|
12
|
-
export declare const WARNING_CATEGORIES: readonly ["inject-token", "request-dto", "pipe-converter", "bootstrap-unsupported", "testing-unsupported", "import-unsupported", "injectable-options", "tsconfig-parse", "bootstrap-port"];
|
|
13
|
+
export declare const WARNING_CATEGORIES: readonly ["inject-token", "inject-token-unsupported", "request-dto", "pipe-converter", "bootstrap-unsupported", "testing-unsupported", "import-unsupported", "injectable-options", "tsconfig-parse", "bootstrap-port"];
|
|
13
14
|
/**
|
|
14
15
|
* Defines the warning category type.
|
|
15
16
|
*/
|
|
@@ -61,6 +62,7 @@ export type MigrationReport = {
|
|
|
61
62
|
*/
|
|
62
63
|
export type RunNestJsMigrationOptions = {
|
|
63
64
|
apply: boolean;
|
|
65
|
+
bootstrapPlatform?: BootstrapPlatform;
|
|
64
66
|
enabledTransforms: ReadonlySet<MigrationTransformKind>;
|
|
65
67
|
targetPath: string;
|
|
66
68
|
};
|
|
@@ -78,4 +80,5 @@ export declare function runNestJsMigration(options: RunNestJsMigrationOptions):
|
|
|
78
80
|
* @returns The render transform list result.
|
|
79
81
|
*/
|
|
80
82
|
export declare function renderTransformList(kinds: readonly MigrationTransformKind[]): string;
|
|
83
|
+
export {};
|
|
81
84
|
//# sourceMappingURL=nestjs-migrate.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"nestjs-migrate.d.ts","sourceRoot":"","sources":["../../src/transforms/nestjs-migrate.ts"],"names":[],"mappings":"AAKA;;GAEG;AACH,eAAO,MAAM,oBAAoB,iFAAkF,CAAC;AAEpH;;GAEG;AACH,MAAM,MAAM,sBAAsB,GAAG,OAAO,oBAAoB,CAAC,MAAM,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"nestjs-migrate.d.ts","sourceRoot":"","sources":["../../src/transforms/nestjs-migrate.ts"],"names":[],"mappings":"AAKA;;GAEG;AACH,eAAO,MAAM,oBAAoB,iFAAkF,CAAC;AAEpH;;GAEG;AACH,MAAM,MAAM,sBAAsB,GAAG,OAAO,oBAAoB,CAAC,MAAM,CAAC,CAAC;AAEzE,KAAK,iBAAiB,GAAG,SAAS,CAAC;AAQnC;;GAEG;AACH,eAAO,MAAM,kBAAkB,wNAWrB,CAAC;AAEX;;GAEG;AACH,MAAM,MAAM,eAAe,GAAG,OAAO,kBAAkB,CAAC,MAAM,CAAC,CAAC;AAEhE;;GAEG;AACH,MAAM,MAAM,gBAAgB,GAAG;IAC7B,QAAQ,EAAE,eAAe,CAAC;IAC1B,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;CACjB,CAAC;AAeF;;;;;GAKG;AACH,wBAAgB,uBAAuB,CAAC,QAAQ,EAAE,eAAe,GAAG,MAAM,CAEzE;AAED;;;;;GAKG;AACH,wBAAgB,uBAAuB,CAAC,QAAQ,EAAE,gBAAgB,EAAE,GAAG,GAAG,CAAC,eAAe,EAAE,gBAAgB,EAAE,CAAC,CAS9G;AAED;;GAEG;AACH,MAAM,MAAM,mBAAmB,GAAG;IAChC,iBAAiB,EAAE,sBAAsB,EAAE,CAAC;IAC5C,OAAO,EAAE,OAAO,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,gBAAgB,EAAE,CAAC;CAC9B,CAAC;AAEF;;GAEG;AACH,MAAM,MAAM,eAAe,GAAG;IAC5B,KAAK,EAAE,OAAO,CAAC;IACf,YAAY,EAAE,MAAM,CAAC;IACrB,YAAY,EAAE,MAAM,CAAC;IACrB,YAAY,EAAE,MAAM,CAAC;IACrB,WAAW,EAAE,mBAAmB,EAAE,CAAC;CACpC,CAAC;AAEF;;GAEG;AACH,MAAM,MAAM,yBAAyB,GAAG;IACtC,KAAK,EAAE,OAAO,CAAC;IACf,iBAAiB,CAAC,EAAE,iBAAiB,CAAC;IACtC,iBAAiB,EAAE,WAAW,CAAC,sBAAsB,CAAC,CAAC;IACvD,UAAU,EAAE,MAAM,CAAC;CACpB,CAAC;AAs4DF;;;;;GAKG;AACH,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,yBAAyB,GAAG,eAAe,CAqDtF;AAED;;;;;GAKG;AACH,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,SAAS,sBAAsB,EAAE,GAAG,MAAM,CAEpF"}
|