@sjcx/vorma 0.0.0-pre.6 → 0.0.0-pre.8
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/LICENSE +197 -1
- package/dist/build/assets/css-static-public-assets.d.ts +22 -0
- package/dist/build/assets/static-public-asset-plugin.d.ts +20 -0
- package/dist/build/assets/static-public-assets.d.ts +44 -0
- package/dist/build/build-application.d.ts +18 -0
- package/dist/build/{bundle-client.d.ts → bundling/bundle-client.d.ts} +16 -5
- package/dist/build/{client-output-hashing.d.ts → bundling/client-output-hashing.d.ts} +1 -1
- package/dist/build/bundling/critical-css.d.ts +19 -0
- package/dist/build/cli.js +4773 -849
- package/dist/build/config/load-config.d.ts +142 -0
- package/dist/build/config/resolve-config.d.ts +63 -0
- package/dist/build/{source-layout.d.ts → config/source-layout.d.ts} +4 -6
- package/dist/build/config/url-pathname.d.ts +13 -0
- package/dist/build/config/vite-options.d.ts +80 -0
- package/dist/build/dev/application-process.d.ts +18 -0
- package/dist/build/dev/artifacts.d.ts +37 -0
- package/dist/build/dev/browser-source.d.ts +25 -0
- package/dist/build/dev/build.d.ts +33 -0
- package/dist/build/dev/cargo-metadata.d.ts +28 -0
- package/dist/build/dev/changes.d.ts +11 -0
- package/dist/build/dev/client-inputs.d.ts +25 -0
- package/dist/build/dev/client.d.ts +39 -0
- package/dist/build/dev/dev-protocol.d.ts +23 -0
- package/dist/build/dev/generated-paths.d.ts +27 -0
- package/dist/build/dev/generation.d.ts +31 -0
- package/dist/build/dev/index-html.d.ts +28 -0
- package/dist/build/dev/module-server.d.ts +24 -0
- package/dist/build/dev/patterns.d.ts +26 -0
- package/dist/build/dev/ports.d.ts +25 -0
- package/dist/build/dev/server-process.d.ts +34 -0
- package/dist/build/dev/server-sources.d.ts +19 -0
- package/dist/build/dev/session.d.ts +28 -0
- package/dist/build/dev/sources.d.ts +46 -0
- package/dist/build/{development-stylesheet.d.ts → dev/stylesheet.d.ts} +4 -4
- package/dist/build/dev/watcher.d.ts +30 -0
- package/dist/build/dev/work.d.ts +67 -0
- package/dist/build/{client-inputs.d.ts → generation/client-view-entries.d.ts} +1 -3
- package/dist/build/generation/compile-application.d.ts +28 -0
- package/dist/build/generation/generate-application.d.ts +52 -0
- package/dist/build/generation/render-client-contracts.d.ts +15 -0
- package/dist/build/{render-source-text.d.ts → generation/render-source-text.d.ts} +3 -7
- package/dist/build/inspection/http-method.d.ts +4 -0
- package/dist/build/inspection/inspect-application.d.ts +25 -0
- package/dist/build/inspection/inspect-projects.d.ts +85 -0
- package/dist/build/inspection/rust-server.d.ts +57 -0
- package/dist/build/inspection/type-declarations.d.ts +20 -0
- package/dist/build/inspection/typescript-projects.d.ts +31 -0
- package/dist/build/issues.d.ts +25 -0
- package/dist/build/{contained-path.d.ts → output/contained-path.d.ts} +3 -13
- package/dist/build/output/content-hash.d.ts +9 -0
- package/dist/build/output/dist-dir.d.ts +34 -0
- package/dist/build/output/output-files.d.ts +23 -0
- package/dist/build/output/output-ownership.d.ts +44 -0
- package/dist/build/output/published-file-url.d.ts +6 -0
- package/dist/build/patterns/nested-route-chains.d.ts +12 -0
- package/dist/build/patterns/pattern-language.d.ts +3 -0
- package/dist/build/patterns/route-patterns.d.ts +12 -0
- package/dist/build/publication/assemble-artifacts.d.ts +37 -0
- package/dist/build/{browser-contracts.d.ts → publication/browser-contracts.d.ts} +1 -1
- package/dist/build/publication/build-metadata.d.ts +45 -0
- package/dist/build/publication/publish-artifacts.d.ts +17 -0
- package/dist/config-FbabCxBO.js +56 -0
- package/dist/config.d.ts +106 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.js +2 -0
- package/dist/plugin-api-Btb0teGk.js +36 -0
- package/dist/vite/index.d.ts +14 -3
- package/dist/vite/index.js +25 -9
- package/dist/vite/plugin-api.d.ts +18 -0
- package/package.json +12 -16
- package/dist/build/assemble-artifacts.d.ts +0 -23
- package/dist/build/client-public-urls.d.ts +0 -20
- package/dist/build/compare-text.d.ts +0 -5
- package/dist/build/compile-application.d.ts +0 -43
- package/dist/build/content-digest.d.ts +0 -7
- package/dist/build/critical-css.d.ts +0 -7
- package/dist/build/css-public-assets.d.ts +0 -15
- package/dist/build/development-artifacts.d.ts +0 -36
- package/dist/build/development-browser-source.d.ts +0 -3
- package/dist/build/development-build.d.ts +0 -27
- package/dist/build/development-changes.d.ts +0 -14
- package/dist/build/development-client.d.ts +0 -21
- package/dist/build/development-generation.d.ts +0 -20
- package/dist/build/development-listener.d.ts +0 -14
- package/dist/build/development-patterns.d.ts +0 -5
- package/dist/build/development-protocol.d.ts +0 -20
- package/dist/build/development-server-process.d.ts +0 -30
- package/dist/build/development-sources.d.ts +0 -22
- package/dist/build/development-watcher.d.ts +0 -15
- package/dist/build/development-work.d.ts +0 -33
- package/dist/build/development.d.ts +0 -3
- package/dist/build/generate-application.d.ts +0 -62
- package/dist/build/index.d.ts +0 -14
- package/dist/build/index.js +0 -2
- package/dist/build/inspect-css-artifacts.d.ts +0 -11
- package/dist/build/inspect-projects.d.ts +0 -68
- package/dist/build/load-config.d.ts +0 -57
- package/dist/build/output-files.d.ts +0 -8
- package/dist/build/output-ownership.d.ts +0 -21
- package/dist/build/public-assets.d.ts +0 -32
- package/dist/build/publish-artifacts.d.ts +0 -20
- package/dist/build/render-client-contracts.d.ts +0 -10
- package/dist/build/render-client-transport.d.ts +0 -11
- package/dist/build/render-server-generated.d.ts +0 -22
- package/dist/build/render-types.d.ts +0 -31
- package/dist/build/resolve-config.d.ts +0 -47
- package/dist/build/typescript-projects.d.ts +0 -43
- package/dist/build-Dy9VE6xO.js +0 -3013
- package/dist/build-invocation-D7Fu8gBK.js +0 -4
- package/dist/vite/build-invocation.d.ts +0 -4
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The markup that Vite produced, with every root-relative URL in an `src` or
|
|
3
|
+
* `href` attribute and in an import specifier of an inline script resolved
|
|
4
|
+
* against the module server's origin. Absolute and protocol-relative URLs stay
|
|
5
|
+
* as they are.
|
|
6
|
+
*/
|
|
7
|
+
export declare function toModuleServerHtml(input: {
|
|
8
|
+
readonly html: string;
|
|
9
|
+
/** `http://127.0.0.1:<port>`. */
|
|
10
|
+
readonly moduleServerOrigin: string;
|
|
11
|
+
}): string;
|
|
12
|
+
/** What Vite's plugins add to a document, by the place where each part goes. */
|
|
13
|
+
export type IndexHtmlParts = {
|
|
14
|
+
/** The tags with `injectTo` set to `"head-prepend"`, `"head"`, or nothing, in Vite's order. */
|
|
15
|
+
readonly headHtml: string;
|
|
16
|
+
/** The tags with `injectTo` set to `"body-prepend"`. */
|
|
17
|
+
readonly bodyPrependHtml: string;
|
|
18
|
+
/** The tags with `injectTo` set to `"body"`. */
|
|
19
|
+
readonly bodyHtml: string;
|
|
20
|
+
};
|
|
21
|
+
/**
|
|
22
|
+
* The page that `splitIndexHtml` expects Vite to transform. The comment in
|
|
23
|
+
* the body separates the tags that Vite puts at the start of the body from the
|
|
24
|
+
* tags that it puts at the end.
|
|
25
|
+
*/
|
|
26
|
+
export declare const INDEX_HTML_TEMPLATE = "<head></head><body><!--vorma-body-separator--></body>";
|
|
27
|
+
/** Splits Vite's transformation of `INDEX_HTML_TEMPLATE` into what goes in each place of the document. */
|
|
28
|
+
export declare function splitIndexHtml(html: string): IndexHtmlParts;
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { type RequestListener } from "node:http";
|
|
2
|
+
import { Effect } from "effect";
|
|
3
|
+
export type DevModuleServerIssue = {
|
|
4
|
+
readonly _tag: "DevModuleServerIssue";
|
|
5
|
+
readonly cause: unknown;
|
|
6
|
+
};
|
|
7
|
+
/** Where Vorma's module server listens; development documents load browser modules from its origin. */
|
|
8
|
+
export type DevModuleServerAddress = {
|
|
9
|
+
readonly port: number;
|
|
10
|
+
/** `http://127.0.0.1:<port>`. */
|
|
11
|
+
readonly origin: string;
|
|
12
|
+
/** `ws://127.0.0.1:<port>`, which Vite's hot update connection uses. */
|
|
13
|
+
readonly webSocketOrigin: string;
|
|
14
|
+
};
|
|
15
|
+
export declare function createDevModuleServerAddress(port: number): DevModuleServerAddress;
|
|
16
|
+
/** Hosts only Vite middleware and its WebSocket; the application has its own server. */
|
|
17
|
+
export declare function createDevModuleServer(address: DevModuleServerAddress): Effect.Effect<{
|
|
18
|
+
server: import("node:http").Server<typeof import("node:http").IncomingMessage, typeof import("node:http").ServerResponse>;
|
|
19
|
+
listen: Effect.Effect<void, DevModuleServerIssue, never>;
|
|
20
|
+
origin: string;
|
|
21
|
+
webSocketOrigin: string;
|
|
22
|
+
port: number;
|
|
23
|
+
setHandler(next: RequestListener): void;
|
|
24
|
+
}, never, import("effect/Scope").Scope>;
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import type { DevAction, VormaConfig } from "../../config.ts";
|
|
2
|
+
export type DevChangeRules = ReturnType<typeof compileDevChangeRules>;
|
|
3
|
+
type DevOnChangeRule = NonNullable<NonNullable<VormaConfig["dev"]>["onChange"]>[number];
|
|
4
|
+
/**
|
|
5
|
+
* The messages for the `dev.onChange` rules that cannot work: a pattern that is
|
|
6
|
+
* empty once trimmed, including `"!"`, and a rule whose patterns are all
|
|
7
|
+
* exclusions, which match nothing.
|
|
8
|
+
*/
|
|
9
|
+
export declare function findInvalidDevChangeRules(rules: ReadonlyArray<DevOnChangeRule>): ReadonlyArray<string>;
|
|
10
|
+
/** Ordered inclusion and exclusion rules use native Vite glob matching. */
|
|
11
|
+
export declare function compileDevPatterns(patterns: ReadonlyArray<string>): {
|
|
12
|
+
roots: string[];
|
|
13
|
+
testRelativePathMatched(relativePath: string): boolean;
|
|
14
|
+
};
|
|
15
|
+
/**
|
|
16
|
+
* Compiles the `dev.onChange` rules. A rule applies to a changed file that one
|
|
17
|
+
* of its patterns matches; the patterns are relative to the configuration
|
|
18
|
+
* directory.
|
|
19
|
+
*/
|
|
20
|
+
export declare function compileDevChangeRules(rules: ReadonlyArray<DevOnChangeRule>): {
|
|
21
|
+
/** The directories that the patterns can match below. */
|
|
22
|
+
roots: string[];
|
|
23
|
+
/** The actions of the rules with a pattern that matches a changed file. */
|
|
24
|
+
getFileActions(relativePath: string): ReadonlyArray<DevAction>;
|
|
25
|
+
};
|
|
26
|
+
export {};
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { Effect } from "effect";
|
|
2
|
+
/** Where `vorma dev` starts looking for the application server's port when the configuration sets no `dev.server.preferredPort`. */
|
|
3
|
+
export declare const APPLICATION_PREFERRED_PORT = 8080;
|
|
4
|
+
/** Where `vorma dev` starts looking for its module server's port: Vite's own default. */
|
|
5
|
+
export declare const MODULE_SERVER_PREFERRED_PORT = 5173;
|
|
6
|
+
/**
|
|
7
|
+
* Reserves the preferred port when it is free, otherwise the first free port
|
|
8
|
+
* among the 1,024 ports after it, otherwise a port that the operating system
|
|
9
|
+
* assigns. The reservation listens on every address until the enclosing scope
|
|
10
|
+
* closes, so a concurrent `vorma dev` process chooses a different port. Close
|
|
11
|
+
* the scope just before the port's owner starts listening.
|
|
12
|
+
*/
|
|
13
|
+
export declare function reserveFirstFreePort(input: {
|
|
14
|
+
readonly preferredPort: number;
|
|
15
|
+
}): Effect.Effect<number, import("effect/socket/SocketServer").SocketServerError, import("effect/Scope").Scope>;
|
|
16
|
+
/**
|
|
17
|
+
* Reserves exactly this port, or fails when it is not free. A port is free
|
|
18
|
+
* when it can be bound on the loopback address and then on every address. The
|
|
19
|
+
* loopback check is released at once; the binding on every address remains as
|
|
20
|
+
* the reservation until the enclosing scope closes.
|
|
21
|
+
*/
|
|
22
|
+
export declare function reserveExactPort(port: number): Effect.Effect<{
|
|
23
|
+
readonly address: import("effect/net/NetAddress").SocketAddress;
|
|
24
|
+
readonly run: <R, E, _>(handler: (socket: import("effect/socket/Socket").Socket) => Effect.Effect<_, E, R>) => Effect.Effect<never, import("effect/socket/SocketServer").SocketServerError, R>;
|
|
25
|
+
}, import("effect/socket/SocketServer").SocketServerError, import("effect/Scope").Scope>;
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import { type Duration, Effect } from "effect";
|
|
2
|
+
export type DevServerExitIssue = {
|
|
3
|
+
readonly _tag: "DevServerExitIssue";
|
|
4
|
+
readonly exitCode: number;
|
|
5
|
+
};
|
|
6
|
+
/**
|
|
7
|
+
* Runs the configured server command; its Effect scope owns process
|
|
8
|
+
* termination. The process is ready when Vorma's handler answers the
|
|
9
|
+
* readiness path at `http://localhost:<port>` with 200 and the build ID that
|
|
10
|
+
* `vorma dev` published for it. Vorma waits until the process is ready or
|
|
11
|
+
* exits; after `waitingMsgDelay`, it prints the URL that it is waiting on
|
|
12
|
+
* and keeps waiting.
|
|
13
|
+
*/
|
|
14
|
+
export declare function startDevServerProcess(input: {
|
|
15
|
+
readonly cmd: readonly [string, ...Array<string>];
|
|
16
|
+
readonly configDir: string;
|
|
17
|
+
readonly port: number;
|
|
18
|
+
/** The dist directory, in which the server reads the build directory of `vorma dev`. */
|
|
19
|
+
readonly distDir: string;
|
|
20
|
+
readonly expectedClientBuildId: string;
|
|
21
|
+
readonly waitingMsgDelay: Duration.Input;
|
|
22
|
+
}): Effect.Effect<{
|
|
23
|
+
childProcess: import("effect/process/ChildProcessSpawner").ChildProcessHandle;
|
|
24
|
+
unexpectedExit: Effect.Effect<never, import("effect/PlatformError").PlatformError | {
|
|
25
|
+
_tag: "DevServerExitIssue";
|
|
26
|
+
exitCode: number & import("effect/Brand").Brand<"ExitCode">;
|
|
27
|
+
}, never>;
|
|
28
|
+
}, import("effect/PlatformError").PlatformError | {
|
|
29
|
+
readonly _tag: "NotReady";
|
|
30
|
+
readonly description: string;
|
|
31
|
+
} | {
|
|
32
|
+
_tag: "DevServerExitIssue";
|
|
33
|
+
exitCode: number & import("effect/Brand").Brand<"ExitCode">;
|
|
34
|
+
}, import("effect/process/ChildProcessSpawner").ChildProcessSpawner | import("effect/Scope").Scope>;
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { Effect, FileSystem, Path } from "effect";
|
|
2
|
+
import type { CargoMetadata } from "./cargo-metadata.ts";
|
|
3
|
+
/**
|
|
4
|
+
* The files whose changes rebuild the Rust server: every file that compiling
|
|
5
|
+
* the binary read outside Cargo's registry, which Cargo lists in the
|
|
6
|
+
* dependency file beside the executable, plus the files that decide what Cargo
|
|
7
|
+
* compiles, which the dependency file omits: the server's manifest and the
|
|
8
|
+
* workspace's root manifest and lockfile.
|
|
9
|
+
*/
|
|
10
|
+
export declare function readServerSourceFiles(input: {
|
|
11
|
+
readonly executable: string;
|
|
12
|
+
readonly cargoManifestFilePath: string;
|
|
13
|
+
readonly cargo: CargoMetadata;
|
|
14
|
+
}): Effect.Effect<Set<string>, {
|
|
15
|
+
_tag: "InspectionIssues";
|
|
16
|
+
issues: {
|
|
17
|
+
msg: string;
|
|
18
|
+
}[];
|
|
19
|
+
}, FileSystem.FileSystem | Path.Path>;
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { Effect, FileSystem, Path, Result } from "effect";
|
|
2
|
+
import type { ResolvedDev, ResolvedVormaConfig } from "../config/resolve-config.ts";
|
|
3
|
+
/**
|
|
4
|
+
* Runs until interrupted; configuration replacement releases the complete
|
|
5
|
+
* previous session. The application keeps one port for the whole run, chosen
|
|
6
|
+
* from `dev.server.preferredPort` in the first configuration. Each session
|
|
7
|
+
* reserves its module server's port, starting the search at the previous
|
|
8
|
+
* session's port, or at 5173 for the first session.
|
|
9
|
+
*/
|
|
10
|
+
export declare function developApplication(configPath: string): Effect.Effect<never, unknown, import("effect/process/ChildProcessSpawner").ChildProcessSpawner | FileSystem.FileSystem | Path.Path>;
|
|
11
|
+
/**
|
|
12
|
+
* Cargo's metadata for the configured manifest, as a result, and the paths
|
|
13
|
+
* that the watcher ignores. Every Cargo build writes the target directory,
|
|
14
|
+
* which is often inside a watched directory, so the watcher learns it before
|
|
15
|
+
* it first scans; while Cargo cannot report it, nothing runs Cargo.
|
|
16
|
+
*/
|
|
17
|
+
export declare function readConfiguredCargoMetadata(resolved: ResolvedVormaConfig & {
|
|
18
|
+
readonly dev: ResolvedDev;
|
|
19
|
+
}): Effect.Effect<{
|
|
20
|
+
cargo: Result.Result<{
|
|
21
|
+
targetDir: string;
|
|
22
|
+
workspaceRoot: string;
|
|
23
|
+
}, {
|
|
24
|
+
_tag: "CargoMetadataIssue";
|
|
25
|
+
msg: string;
|
|
26
|
+
}>;
|
|
27
|
+
generatedPaths: readonly string[];
|
|
28
|
+
}, never, import("effect/process/ChildProcessSpawner").ChildProcessSpawner>;
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import { Effect, Path } from "effect";
|
|
2
|
+
import { type CompiledRustServer } from "../inspection/rust-server.ts";
|
|
3
|
+
import type { DevLayout } from "./generated-paths.ts";
|
|
4
|
+
export type DevSourceInputs = {
|
|
5
|
+
/** The Rust server's inspection, which an inspection after a client-only change reuses. */
|
|
6
|
+
readonly server: CompiledRustServer;
|
|
7
|
+
/** The files whose changes rebuild the Rust server. */
|
|
8
|
+
readonly serverFiles: ReadonlySet<string>;
|
|
9
|
+
readonly clientFiles: ReadonlySet<string>;
|
|
10
|
+
readonly clientRootFiles: ReadonlySet<string>;
|
|
11
|
+
/** Configuration and resolution inputs of the client project that are not program source files. */
|
|
12
|
+
readonly resolutionFiles: ReadonlySet<string>;
|
|
13
|
+
/** Native compiler directory enumeration, including configured inclusion scopes. */
|
|
14
|
+
readonly dirs: ReadonlySet<string>;
|
|
15
|
+
};
|
|
16
|
+
/**
|
|
17
|
+
* Inspects declarations and records the server's and the client compiler's
|
|
18
|
+
* inputs without replacing filesystem behavior. `server` reuses the previous
|
|
19
|
+
* inputs' server inspection when no server source changed, so the inspection
|
|
20
|
+
* runs neither Cargo nor the server.
|
|
21
|
+
*/
|
|
22
|
+
export declare function inspectDevSources(input: {
|
|
23
|
+
readonly layout: DevLayout;
|
|
24
|
+
readonly server: {
|
|
25
|
+
readonly _tag: "Inspect";
|
|
26
|
+
} | {
|
|
27
|
+
readonly _tag: "Reuse";
|
|
28
|
+
readonly previous: DevSourceInputs;
|
|
29
|
+
};
|
|
30
|
+
}): Effect.Effect<{
|
|
31
|
+
inspection: import("../inspection/inspect-projects.ts").InspectedProjects;
|
|
32
|
+
inputs: DevSourceInputs;
|
|
33
|
+
}, import("../inspection/typescript-projects.ts").TsProjectIssue | {
|
|
34
|
+
_tag: "InspectionIssues";
|
|
35
|
+
issues: import("../inspection/inspect-projects.ts").InspectionIssue[];
|
|
36
|
+
} | {
|
|
37
|
+
_tag: "InspectionIssues";
|
|
38
|
+
issues: {
|
|
39
|
+
msg: string;
|
|
40
|
+
}[];
|
|
41
|
+
}, import("effect/process/ChildProcessSpawner").ChildProcessSpawner | import("effect/FileSystem").FileSystem | Path.Path>;
|
|
42
|
+
/** Watches native compiler inputs while keeping generated writes out of the event stream. */
|
|
43
|
+
export declare function getDevSourceWatchPaths(input: {
|
|
44
|
+
readonly layout: DevLayout;
|
|
45
|
+
readonly sources: DevSourceInputs;
|
|
46
|
+
}): Effect.Effect<string[], never, Path.Path>;
|
|
@@ -1,15 +1,15 @@
|
|
|
1
1
|
import { Effect } from "effect";
|
|
2
2
|
import { type ViteDevServer } from "vite";
|
|
3
|
-
export type
|
|
4
|
-
readonly _tag: "
|
|
3
|
+
export type DevStylesheetIssue = {
|
|
4
|
+
readonly _tag: "DevStylesheetIssue";
|
|
5
5
|
readonly filePath: string;
|
|
6
6
|
readonly cause: unknown;
|
|
7
7
|
};
|
|
8
8
|
/** Reads CSS and its dependency files from Vite's native direct-CSS pipeline. */
|
|
9
|
-
export declare function
|
|
9
|
+
export declare function readDevStylesheet(input: {
|
|
10
10
|
readonly server: ViteDevServer;
|
|
11
11
|
readonly filePath: string;
|
|
12
12
|
}): Effect.Effect<{
|
|
13
13
|
css: string;
|
|
14
14
|
inputFilePaths: string[];
|
|
15
|
-
},
|
|
15
|
+
}, DevStylesheetIssue, never>;
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import { Effect } from "effect";
|
|
2
|
+
/** The native watcher could not start. */
|
|
3
|
+
export type DevWatchIssue = {
|
|
4
|
+
readonly _tag: "DevWatchIssue";
|
|
5
|
+
readonly cause: unknown;
|
|
6
|
+
};
|
|
7
|
+
/**
|
|
8
|
+
* Whether a path is inside a directory named `node_modules`, `target`, or
|
|
9
|
+
* `.git` at any level below the configuration directory. Vorma's watcher and
|
|
10
|
+
* Vite's watcher both ignore these paths. Directories above the configuration
|
|
11
|
+
* directory do not count, so a project inside a directory with one of these
|
|
12
|
+
* names is still watched.
|
|
13
|
+
*/
|
|
14
|
+
export declare function testIgnoredDirPath(input: {
|
|
15
|
+
readonly configDir: string;
|
|
16
|
+
readonly filePath: string;
|
|
17
|
+
}): boolean;
|
|
18
|
+
/** Application watching survives Vite restarts and failed replacement builds. */
|
|
19
|
+
export declare function createDevWatcher(input: {
|
|
20
|
+
readonly configFilePath: string;
|
|
21
|
+
readonly generatedPaths: ReadonlyArray<string>;
|
|
22
|
+
}): Effect.Effect<{
|
|
23
|
+
take: Effect.Effect<ReadonlySet<string>, never, never>;
|
|
24
|
+
recordChange: (filePath: string) => void;
|
|
25
|
+
recordError: (cause: unknown) => void;
|
|
26
|
+
watchPaths(next: {
|
|
27
|
+
readonly paths: ReadonlyArray<string>;
|
|
28
|
+
readonly generatedPaths: ReadonlyArray<string>;
|
|
29
|
+
}): Effect.Effect<void, DevWatchIssue, never>;
|
|
30
|
+
}, DevWatchIssue, import("effect/Scope").Scope>;
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
import { Effect, Path } from "effect";
|
|
2
|
+
import type { DevLayout } from "./generated-paths.ts";
|
|
3
|
+
import type { DevChangeRules } from "./patterns.ts";
|
|
4
|
+
import type { DevSourceInputs } from "./sources.ts";
|
|
5
|
+
/**
|
|
6
|
+
* The updates that watcher batches ask for, one field per kind of update. An
|
|
7
|
+
* update of one kind replaces the earlier requests of its kind. A server
|
|
8
|
+
* update also does the work of the client and static updates.
|
|
9
|
+
*/
|
|
10
|
+
export type DevWork = {
|
|
11
|
+
/**
|
|
12
|
+
* A Rust source of the server, a Cargo manifest, the Cargo lockfile, or a
|
|
13
|
+
* file that a `"restart-server"` rule names changed. The update builds and
|
|
14
|
+
* inspects the server, stops it while it does, and starts it again.
|
|
15
|
+
*/
|
|
16
|
+
readonly serverWork: boolean;
|
|
17
|
+
/**
|
|
18
|
+
* A client source, or a configuration file of the client project, changed.
|
|
19
|
+
* The update inspects the client project again and reuses the server's
|
|
20
|
+
* inspection.
|
|
21
|
+
*/
|
|
22
|
+
readonly clientWork: ClientWork | undefined;
|
|
23
|
+
/**
|
|
24
|
+
* A file of the public source directory or of the critical CSS changed, or
|
|
25
|
+
* a `dev.onChange` rule that requests no server restart matched a changed
|
|
26
|
+
* file. The update captures the static public assets and prepares the critical CSS.
|
|
27
|
+
*/
|
|
28
|
+
readonly staticWork: StaticWork | undefined;
|
|
29
|
+
};
|
|
30
|
+
type ClientWork = {
|
|
31
|
+
/** A file that decides how modules resolve, such as `tsconfig.json`, changed, so Vite starts again. */
|
|
32
|
+
readonly restartsVite: boolean;
|
|
33
|
+
};
|
|
34
|
+
type StaticWork = {
|
|
35
|
+
/** A matching rule requests `"revalidate-client-data"`. */
|
|
36
|
+
readonly revalidatesClientData: boolean;
|
|
37
|
+
/** A matching rule requests `"hard-browser-reload"`. */
|
|
38
|
+
readonly reloadsBrowser: boolean;
|
|
39
|
+
};
|
|
40
|
+
export declare const NO_DEV_WORK: DevWork;
|
|
41
|
+
/** Static work that asks for neither a revalidation nor a reload. */
|
|
42
|
+
export declare const STATIC_WORK: DevWork;
|
|
43
|
+
export declare function testDevWorkRequested(work: DevWork): boolean;
|
|
44
|
+
/** The work that either argument asks for. */
|
|
45
|
+
export declare function mergeDevWork(first: DevWork, second: DevWork): DevWork;
|
|
46
|
+
export type DevInputs = {
|
|
47
|
+
readonly sources: DevSourceInputs;
|
|
48
|
+
readonly configFiles: ReadonlySet<string>;
|
|
49
|
+
readonly viteConfigFiles: ReadonlySet<string>;
|
|
50
|
+
readonly criticalCssFiles: ReadonlySet<string>;
|
|
51
|
+
};
|
|
52
|
+
/**
|
|
53
|
+
* Sorts the changed files of one batch into the updates that they ask for,
|
|
54
|
+
* and reports whether the batch changed the Vorma configuration or a file that
|
|
55
|
+
* it imports, which restarts the session. Ordinary browser modules remain
|
|
56
|
+
* Vite's hot update inputs. A batch that asks for no work asks for nothing.
|
|
57
|
+
*/
|
|
58
|
+
export declare function classifyDevChanges(input: {
|
|
59
|
+
readonly layout: DevLayout;
|
|
60
|
+
readonly inputs: DevInputs;
|
|
61
|
+
readonly changedPaths: ReadonlySet<string>;
|
|
62
|
+
readonly changeRules: DevChangeRules;
|
|
63
|
+
}): Effect.Effect<{
|
|
64
|
+
restartsSession: boolean;
|
|
65
|
+
work: DevWork;
|
|
66
|
+
}, import("../inspection/typescript-projects.ts").TsProjectIssue, Path.Path>;
|
|
67
|
+
export {};
|
|
@@ -1,10 +1,8 @@
|
|
|
1
1
|
import type { ApplicationGeneration } from "./generate-application.ts";
|
|
2
|
-
/** Runtime peers that must have one browser identity in development and production. */
|
|
3
|
-
export declare const CLIENT_SHARED_PACKAGES: string[];
|
|
4
2
|
export type ClientViewEntry = {
|
|
5
3
|
readonly pattern: string;
|
|
4
|
+
/** The view module's id, in the form that Vite's `normalizePath` gives its path; its default export is the view. */
|
|
6
5
|
readonly id: string;
|
|
7
|
-
readonly exportName: string;
|
|
8
6
|
};
|
|
9
7
|
/** Projects each validated view declaration into one browser entry. */
|
|
10
8
|
export declare function getClientViewEntries(generation: ApplicationGeneration): ReadonlyArray<ClientViewEntry>;
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { Result } from "effect";
|
|
2
|
+
import type { CompiledNestedPattern } from "primitives-ts/matcher";
|
|
3
|
+
import type { InspectedClientView, InspectedEndpoint, InspectedProjects, InspectedViewLoader } from "../inspection/inspect-projects.ts";
|
|
4
|
+
export type ApplicationView = {
|
|
5
|
+
/** The authored pattern, as the loader or the view wrote it. */
|
|
6
|
+
readonly pattern: string;
|
|
7
|
+
readonly compiledPattern: CompiledNestedPattern;
|
|
8
|
+
readonly loader: InspectedViewLoader | undefined;
|
|
9
|
+
readonly clientView: InspectedClientView | undefined;
|
|
10
|
+
/** The input types of the loaders from the chain root to this view, as type text, in chain order; the view's search combines them. */
|
|
11
|
+
readonly chainLoaderInputs: ReadonlyArray<string>;
|
|
12
|
+
/** The authored patterns of the views nested directly in this one; this view's child error component renders their failures. */
|
|
13
|
+
readonly childPatterns: ReadonlyArray<string>;
|
|
14
|
+
};
|
|
15
|
+
export type ApplicationModel = {
|
|
16
|
+
readonly viewLoaders: ReadonlyArray<InspectedViewLoader>;
|
|
17
|
+
readonly endpoints: ReadonlyArray<InspectedEndpoint>;
|
|
18
|
+
readonly clientViews: ReadonlyArray<InspectedClientView>;
|
|
19
|
+
/** The view modules in stable order, for generated type imports. */
|
|
20
|
+
readonly clientViewModules: ReadonlyArray<string>;
|
|
21
|
+
readonly views: ReadonlyArray<ApplicationView>;
|
|
22
|
+
};
|
|
23
|
+
/** A problem that stops the build from generating types; the message names every declaration involved. */
|
|
24
|
+
export type ApplicationModelIssue = {
|
|
25
|
+
readonly msg: string;
|
|
26
|
+
};
|
|
27
|
+
/** Joins the inspected declarations and views into one model. */
|
|
28
|
+
export declare function compileApplicationModel(inspection: InspectedProjects): Result.Result<ApplicationModel, ReadonlyArray<ApplicationModelIssue>>;
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
import { Effect } from "effect";
|
|
2
|
+
import * as FileSystem from "effect/FileSystem";
|
|
3
|
+
import * as Path from "effect/Path";
|
|
4
|
+
import type { ChildProcessSpawner } from "effect/process";
|
|
5
|
+
import { type StaticPublicAssetIssue, type StaticPublicAssetProjection } from "../assets/static-public-assets.ts";
|
|
6
|
+
import type { ConfigResolutionIssue } from "../config/resolve-config.ts";
|
|
7
|
+
import type { ApplicationSourceLayout, ApplicationSourceLayoutIssues } from "../config/source-layout.ts";
|
|
8
|
+
import type { InspectedProjects, InspectionIssues } from "../inspection/inspect-projects.ts";
|
|
9
|
+
import type { TsProjectIssue } from "../inspection/typescript-projects.ts";
|
|
10
|
+
import { type ApplicationModel, type ApplicationModelIssue } from "./compile-application.ts";
|
|
11
|
+
import type { GeneratedSource } from "./render-source-text.ts";
|
|
12
|
+
export type ApplicationModelIssues = {
|
|
13
|
+
readonly _tag: "ApplicationModelIssues";
|
|
14
|
+
readonly issues: ReadonlyArray<ApplicationModelIssue>;
|
|
15
|
+
};
|
|
16
|
+
/** The `staticPublicAssets` lookups that name assets the static public asset directory does not contain. */
|
|
17
|
+
export type UnknownStaticPublicAssetKeys = {
|
|
18
|
+
readonly _tag: "UnknownStaticPublicAssetKeys";
|
|
19
|
+
readonly issues: ReadonlyArray<{
|
|
20
|
+
readonly msg: string;
|
|
21
|
+
}>;
|
|
22
|
+
};
|
|
23
|
+
export type GeneratedApplicationWriteIssue = {
|
|
24
|
+
readonly _tag: "GeneratedApplicationWriteIssue";
|
|
25
|
+
readonly filePath: string;
|
|
26
|
+
readonly msg: string;
|
|
27
|
+
readonly cause: unknown;
|
|
28
|
+
};
|
|
29
|
+
export type ApplicationGenerationIssue = ConfigResolutionIssue | StaticPublicAssetIssue | TsProjectIssue | InspectionIssues | ApplicationSourceLayoutIssues | ApplicationModelIssues | UnknownStaticPublicAssetKeys;
|
|
30
|
+
export type ApplicationGeneration = {
|
|
31
|
+
readonly sourceLayout: ApplicationSourceLayout;
|
|
32
|
+
readonly model: ApplicationModel;
|
|
33
|
+
readonly inspection: InspectedProjects;
|
|
34
|
+
/** The client project's generated types, at the configured `client.tsGenOutFile`. */
|
|
35
|
+
readonly clientTypes: GeneratedSource;
|
|
36
|
+
readonly staticPublicAssets: StaticPublicAssetProjection;
|
|
37
|
+
};
|
|
38
|
+
/** Reads the server's contract and the client project, captures static public assets, and prepares generated build inputs without publishing them. */
|
|
39
|
+
export declare function prepareApplicationGeneration(sourceLayout: ApplicationSourceLayout): Effect.Effect<ApplicationGeneration, ApplicationGenerationIssue, FileSystem.FileSystem | Path.Path | ChildProcessSpawner.ChildProcessSpawner>;
|
|
40
|
+
/** Reads declarations and static public asset lookups independently of static public asset hashing. */
|
|
41
|
+
export declare function inspectApplicationSources(sourceLayout: ApplicationSourceLayout): Effect.Effect<InspectedProjects, TsProjectIssue | {
|
|
42
|
+
_tag: "InspectionIssues";
|
|
43
|
+
issues: import("../inspection/inspect-projects.ts").InspectionIssue[];
|
|
44
|
+
}, ChildProcessSpawner.ChildProcessSpawner | FileSystem.FileSystem | Path.Path>;
|
|
45
|
+
/** Prepares correlated build inputs from an inspection and a captured public directory. */
|
|
46
|
+
export declare function assembleApplicationGeneration(input: {
|
|
47
|
+
readonly sourceLayout: ApplicationSourceLayout;
|
|
48
|
+
readonly inspection: InspectedProjects;
|
|
49
|
+
readonly staticPublicAssets: StaticPublicAssetProjection;
|
|
50
|
+
}): Effect.Effect<ApplicationGeneration, ApplicationModelIssues | UnknownStaticPublicAssetKeys, Path.Path>;
|
|
51
|
+
/** Writes the client's generated types file, replacing it atomically. */
|
|
52
|
+
export declare function writeApplicationGeneration(generation: ApplicationGeneration): Effect.Effect<void, GeneratedApplicationWriteIssue, FileSystem.FileSystem | Path.Path>;
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import type * as Path from "effect/Path";
|
|
2
|
+
import { type StaticPublicAssetProjection } from "../assets/static-public-assets.ts";
|
|
3
|
+
import type { InspectedProjects } from "../inspection/inspect-projects.ts";
|
|
4
|
+
import type { ApplicationModel } from "./compile-application.ts";
|
|
5
|
+
import { type GeneratedSource } from "./render-source-text.ts";
|
|
6
|
+
/** An identifier that the generated file declares or imports, besides the server's named declarations. */
|
|
7
|
+
export declare function testGeneratedClientIdentifier(name: string): boolean;
|
|
8
|
+
/** Renders the augmentation of `VormaGeneratedTypes` with the fields `views`, `apiEndpoints`, and `assets`. */
|
|
9
|
+
export declare function renderGeneratedClientTypes(input: {
|
|
10
|
+
readonly model: ApplicationModel;
|
|
11
|
+
readonly inspection: InspectedProjects;
|
|
12
|
+
readonly staticPublicAssets: StaticPublicAssetProjection;
|
|
13
|
+
readonly filePath: string;
|
|
14
|
+
readonly path: Path.Path;
|
|
15
|
+
}): GeneratedSource;
|
|
@@ -1,22 +1,18 @@
|
|
|
1
|
-
import type { Schema } from "effect";
|
|
2
1
|
import type * as Path from "effect/Path";
|
|
3
2
|
export type GeneratedSource = {
|
|
4
3
|
readonly filePath: string;
|
|
5
4
|
readonly source: string;
|
|
6
5
|
};
|
|
6
|
+
export declare const GENERATED_SOURCE_HEADER = "// Code generated by Vorma. DO NOT EDIT.";
|
|
7
7
|
/** A tab-indented prefix, matching how a person writes generated source. */
|
|
8
8
|
export declare function toIndent(depth: number): string;
|
|
9
9
|
/** Moves multi-line rendered text deeper by `depth` tabs; the first line keeps its position in the line that embeds it. */
|
|
10
10
|
export declare function indentRenderedText(text: string, depth: number): string;
|
|
11
|
-
export declare function renderPropertyName(name: string): string;
|
|
12
|
-
export declare function renderStringLiteral(value: string): string;
|
|
13
|
-
/** Renders a JSON value as source a person would have written, at the given tab depth for its inner lines. */
|
|
14
|
-
export declare function renderDataValue(value: Schema.Json, depth: number): string;
|
|
15
11
|
/** The path operations module-specifier rendering needs; both Effect Path and node:path satisfy it. */
|
|
16
|
-
export type
|
|
12
|
+
export type SpecifierPathOperations = Pick<Path.Path, "dirname" | "relative" | "sep">;
|
|
17
13
|
/** A relative module specifier, explicitly relative even when the target's own name starts with a dot. */
|
|
18
14
|
export declare function getModuleSpecifier(input: {
|
|
19
|
-
readonly path:
|
|
15
|
+
readonly path: SpecifierPathOperations;
|
|
20
16
|
readonly fromFilePath: string;
|
|
21
17
|
readonly toFilePath: string;
|
|
22
18
|
}): string;
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import * as NativeHttpMethod from "effect/http/HttpMethod";
|
|
2
|
+
/** Methods supported by Vorma's browser-facing endpoint protocol. */
|
|
3
|
+
export type HttpMethod = Exclude<NativeHttpMethod.HttpMethod, "HEAD" | "TRACE">;
|
|
4
|
+
export declare function testHttpMethod(method: unknown): method is HttpMethod;
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { Effect } from "effect";
|
|
2
|
+
import type { APIOptions, Project } from "typescript/unstable/async";
|
|
3
|
+
import type { ApplicationSourceLayout } from "../config/source-layout.ts";
|
|
4
|
+
import { type InspectedProjects, type InspectionIssues, type ServerInspection } from "./inspect-projects.ts";
|
|
5
|
+
/**
|
|
6
|
+
* Inspects the application and passes the result to `useFn` while the client
|
|
7
|
+
* checker session is open. `readServer` reads the Rust server's declarations
|
|
8
|
+
* while the client is inspected, and `useFn` receives what it yields. When
|
|
9
|
+
* both inspections find issues, the failure reports them together.
|
|
10
|
+
*/
|
|
11
|
+
export declare function withApplicationInspection<Server extends {
|
|
12
|
+
readonly inspection: ServerInspection;
|
|
13
|
+
}, A, E, R, ServerR>(input: {
|
|
14
|
+
readonly layout: ApplicationSourceLayout;
|
|
15
|
+
readonly readServer: Effect.Effect<Server, InspectionIssues, ServerR>;
|
|
16
|
+
readonly fileSystem?: APIOptions["fs"];
|
|
17
|
+
readonly useFn: (inspected: {
|
|
18
|
+
readonly inspection: InspectedProjects;
|
|
19
|
+
readonly client: Project;
|
|
20
|
+
readonly server: Server;
|
|
21
|
+
}) => Effect.Effect<A, E, R>;
|
|
22
|
+
}): Effect.Effect<A, E | import("./typescript-projects.ts").TsProjectIssue | {
|
|
23
|
+
_tag: "InspectionIssues";
|
|
24
|
+
issues: import("./inspect-projects.ts").InspectionIssue[];
|
|
25
|
+
}, Exclude<R, import("effect/Scope").Scope> | Exclude<ServerR, import("effect/Scope").Scope>>;
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
import { Effect } from "effect";
|
|
2
|
+
import { type Project } from "typescript/unstable/async";
|
|
3
|
+
import type { ApplicationSourceLayout } from "../config/source-layout.ts";
|
|
4
|
+
import type { HttpMethod } from "./http-method.ts";
|
|
5
|
+
import type { TypeDeclarations } from "./type-declarations.ts";
|
|
6
|
+
import { type TsProjectIssue } from "./typescript-projects.ts";
|
|
7
|
+
export type InspectedViewLoader = {
|
|
8
|
+
readonly kind: "ViewLoader";
|
|
9
|
+
readonly pattern: string;
|
|
10
|
+
/** Where the app lists the loader, as issue messages name it. */
|
|
11
|
+
readonly location: string;
|
|
12
|
+
/** The input type as TypeScript text; absent when the loader takes no input. */
|
|
13
|
+
readonly input: string | undefined;
|
|
14
|
+
/** The output type as TypeScript text; absent when the loader has no output. */
|
|
15
|
+
readonly output: string | undefined;
|
|
16
|
+
readonly errors: ReadonlyArray<InspectedDeclaredError>;
|
|
17
|
+
};
|
|
18
|
+
/** One declared error of a view loader or an endpoint. */
|
|
19
|
+
export type InspectedDeclaredError = {
|
|
20
|
+
/** The declared error type as TypeScript text. */
|
|
21
|
+
readonly typeText: string;
|
|
22
|
+
};
|
|
23
|
+
/** How an endpoint receives its input. */
|
|
24
|
+
export type InputTransportKind = "none" | "search" | "json" | "formData";
|
|
25
|
+
export type InspectedEndpoint = {
|
|
26
|
+
readonly kind: "Endpoint";
|
|
27
|
+
readonly operation: "query" | "mutation";
|
|
28
|
+
readonly method: HttpMethod;
|
|
29
|
+
readonly pattern: string;
|
|
30
|
+
/** Where the app lists the endpoint, as issue messages name it. */
|
|
31
|
+
readonly location: string;
|
|
32
|
+
/** The input type as TypeScript text; absent when the endpoint takes no input. For form data it is the form's fields. */
|
|
33
|
+
readonly input: string | undefined;
|
|
34
|
+
readonly inputTransport: InputTransportKind;
|
|
35
|
+
/** The output type as TypeScript text; absent when the endpoint has no output. */
|
|
36
|
+
readonly output: string | undefined;
|
|
37
|
+
readonly errors: ReadonlyArray<InspectedDeclaredError>;
|
|
38
|
+
};
|
|
39
|
+
export type InspectedServerDeclaration = InspectedViewLoader | InspectedEndpoint;
|
|
40
|
+
export type InspectedClientView = {
|
|
41
|
+
/** The view file. */
|
|
42
|
+
readonly filePath: string;
|
|
43
|
+
readonly pattern: string;
|
|
44
|
+
/** Whether the file's default export is the view itself or an array that contains it. */
|
|
45
|
+
readonly defaultExportShape: "View" | "ViewArray";
|
|
46
|
+
/** Where the file exports the view, as issue messages name it. */
|
|
47
|
+
readonly location: string;
|
|
48
|
+
};
|
|
49
|
+
/** A `staticPublicAssets` lookup: the span to replace and the asset key it names. */
|
|
50
|
+
export type StaticPublicAssetLookup = {
|
|
51
|
+
/** Where the call is, as issue messages name it. */
|
|
52
|
+
readonly location: string;
|
|
53
|
+
readonly filePath: string;
|
|
54
|
+
readonly start: number;
|
|
55
|
+
readonly end: number;
|
|
56
|
+
readonly key: string;
|
|
57
|
+
};
|
|
58
|
+
export type InspectedProjects = {
|
|
59
|
+
/** Every view loader and endpoint of the application, in the order of their contract identities. */
|
|
60
|
+
readonly serverDeclarations: ReadonlyArray<InspectedServerDeclaration>;
|
|
61
|
+
readonly clientViews: ReadonlyArray<InspectedClientView>;
|
|
62
|
+
readonly staticPublicAssetLookups: ReadonlyArray<StaticPublicAssetLookup>;
|
|
63
|
+
/** The text of every client file that has a static public asset lookup, as the checker read it. */
|
|
64
|
+
readonly clientSourceTexts: ReadonlyMap<string, string>;
|
|
65
|
+
/** The named type declarations that the declarations' type texts reference. */
|
|
66
|
+
readonly typeDeclarations: TypeDeclarations;
|
|
67
|
+
/** The server binary's hash of its declarations, which the build directory records. */
|
|
68
|
+
readonly declarationsHash: string;
|
|
69
|
+
};
|
|
70
|
+
export type InspectionIssue = {
|
|
71
|
+
readonly msg: string;
|
|
72
|
+
};
|
|
73
|
+
export type InspectionIssues = {
|
|
74
|
+
readonly _tag: "InspectionIssues";
|
|
75
|
+
readonly issues: ReadonlyArray<InspectionIssue>;
|
|
76
|
+
};
|
|
77
|
+
/** A server's declarations and the named type declarations that their type texts reference. */
|
|
78
|
+
export type ServerInspection = Pick<InspectedProjects, "serverDeclarations" | "typeDeclarations" | "declarationsHash">;
|
|
79
|
+
/** What the client project contributes to an inspection. */
|
|
80
|
+
export type ClientInspection = Omit<InspectedProjects, keyof ServerInspection>;
|
|
81
|
+
/** Reads the client project's views and every lookup of a static public asset. */
|
|
82
|
+
export declare function inspectClientProject(input: {
|
|
83
|
+
readonly client: Project;
|
|
84
|
+
readonly layout: ApplicationSourceLayout;
|
|
85
|
+
}): Effect.Effect<ClientInspection, InspectionIssues | TsProjectIssue>;
|