@vitejs/plugin-rsc 0.5.29 → 0.5.31
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +31 -2
- package/dist/{client-reference-DT0MYgPn.d.ts → client-reference-DR15qkcN.d.ts} +1 -1
- package/dist/{index-BjJe9jqG.d.ts → index-COzKOTR1.d.ts} +56 -0
- package/dist/index.d.ts +2 -2
- package/dist/index.js +1 -1
- package/dist/{picocolors-nYPB6lHj.js → picocolors-BVMUFdce.js} +1 -1
- package/dist/{plugin-CaLiN8ED.d.ts → plugin-DQCCjJl0.d.ts} +32 -8
- package/dist/{plugin-DPZnhMn5.js → plugin-DbK8rF7n.js} +125 -39
- package/dist/plugin.d.ts +1 -1
- package/dist/plugin.js +1 -1
- package/dist/rsc/server.d.ts +1 -1
- package/dist/rsc/static.d.ts +1 -1
- package/dist/ssr.d.ts +1 -1
- package/dist/transforms/index.d.ts +1 -1
- package/dist/transforms/index.js +65 -2
- package/package.json +15 -16
package/README.md
CHANGED
|
@@ -25,9 +25,15 @@ npm create vite@latest -- --template rsc
|
|
|
25
25
|
|
|
26
26
|
**Integration examples:**
|
|
27
27
|
|
|
28
|
-
- [`./examples/basic`](./examples/basic) -
|
|
29
|
-
|
|
28
|
+
- [`./examples/basic`](./examples/basic) - Comprehensive showcase of standard RSC features and the primary E2E test fixture.
|
|
29
|
+
- [`./examples/use-cache`](./examples/use-cache) - Minimal cache feature inspired by Next.js's `"use cache"`, built with generic transform and RSC runtime APIs.
|
|
30
|
+
- [`./examples/custom-server-function`](./examples/custom-server-function) - Third-party Server Function directive integration using server reference claims.
|
|
30
31
|
- [`./examples/ssg`](./examples/ssg) - Static site generation with MDX and client components for interactivity.
|
|
32
|
+
- [`./examples/ppr`](./examples/ppr) - Partial prerendering with a reusable static HTML shell and request-time RSC content.
|
|
33
|
+
- [`./examples/no-ssr`](./examples/no-ssr) - RSC application without an SSR environment.
|
|
34
|
+
- [`./examples/client-first`](./examples/client-first) - Experimental client-owned page that consumes RSC function results.
|
|
35
|
+
- [`./examples/browser-mode`](./examples/browser-mode) - Advanced setup that runs both RSC and React client environments in the browser with custom module loading.
|
|
36
|
+
- [`./examples/performance-track`](./examples/performance-track) - Minimal React Server Components performance track probe.
|
|
31
37
|
- [`./examples/react-router`](./examples/react-router) - React Router RSC integration
|
|
32
38
|
- Demonstrates how to integrate [experimental React Router RSC API](https://remix.run/blog/rsc-preview). React Router now provides [official RSC support](https://reactrouter.com/how-to/react-server-components), so it's recommended to follow React Router's official documentation for the latest integration.
|
|
33
39
|
|
|
@@ -524,6 +530,29 @@ This module provides Vite-integrated RSC runtime APIs based on
|
|
|
524
530
|
- `createTemporaryReferenceSet`: Creates a temporary reference set shared by deserialization and reply serialization
|
|
525
531
|
- `setServerCallback`: Configures how server functions are called
|
|
526
532
|
|
|
533
|
+
### Low-level runtime entry points
|
|
534
|
+
|
|
535
|
+
The runtime APIs are exposed through two layers:
|
|
536
|
+
|
|
537
|
+
- `@vitejs/plugin-rsc/rsc`, `@vitejs/plugin-rsc/ssr`, and
|
|
538
|
+
`@vitejs/plugin-rsc/browser` are the recommended entry points for application
|
|
539
|
+
and framework runtime code. They initialize the plugin's built-in module
|
|
540
|
+
loading using the manifests generated by Vite and re-export the corresponding
|
|
541
|
+
React runtime APIs described above.
|
|
542
|
+
- `@vitejs/plugin-rsc/react/rsc`, `@vitejs/plugin-rsc/react/ssr`, and
|
|
543
|
+
`@vitejs/plugin-rsc/react/browser` are low-level runtime adapters. They are
|
|
544
|
+
used by code generated for `"use client"` and `"use server"`, and by custom
|
|
545
|
+
integrations that provide module loading through `setRequireModule` instead
|
|
546
|
+
of using the plugin's generated manifests.
|
|
547
|
+
|
|
548
|
+
The two layers share the same module loader within an environment, which allows
|
|
549
|
+
generated code to use `/react/*` after a top-level entry initializes the
|
|
550
|
+
built-in loader. Application code should continue using the top-level entries,
|
|
551
|
+
which re-export the same runtime APIs. Direct use of `/react/*` is only needed
|
|
552
|
+
by custom integrations that install their own loaders, such as the
|
|
553
|
+
[`examples/browser-mode`](./examples/browser-mode) example, which runs the RSC
|
|
554
|
+
and React client environments in the browser.
|
|
555
|
+
|
|
527
556
|
## Tips
|
|
528
557
|
|
|
529
558
|
### CSS Support
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { t as ClientReferenceMetadata } from "./rsc-C3UdJLOW.js";
|
|
2
|
-
import { i as ResolvedAssetDeps } from "./plugin-
|
|
2
|
+
import { i as ResolvedAssetDeps } from "./plugin-DQCCjJl0.js";
|
|
3
3
|
//#region src/rsc/client-reference.d.ts
|
|
4
4
|
type OnClientReference = (metadata: ClientReferenceMetadata & {
|
|
5
5
|
deps: ResolvedAssetDeps;
|
|
@@ -526,6 +526,59 @@ interface AwaitExpression extends BaseExpression {
|
|
|
526
526
|
}
|
|
527
527
|
//#endregion
|
|
528
528
|
//#region src/transforms/hoist.d.ts
|
|
529
|
+
/**
|
|
530
|
+
* Turns an inline directive function into a module-level registered function.
|
|
531
|
+
* Conceptually:
|
|
532
|
+
*
|
|
533
|
+
* ```js
|
|
534
|
+
* function Component() {
|
|
535
|
+
* const x = 1
|
|
536
|
+
* async function action(y) {
|
|
537
|
+
* "use server"
|
|
538
|
+
* return x + y
|
|
539
|
+
* }
|
|
540
|
+
* }
|
|
541
|
+
* ```
|
|
542
|
+
*
|
|
543
|
+
* becomes:
|
|
544
|
+
*
|
|
545
|
+
* ```js
|
|
546
|
+
* function Component() {
|
|
547
|
+
* const x = 1
|
|
548
|
+
* const action = __RUNTIME__($$hoist_0_action).bind(null, x)
|
|
549
|
+
* }
|
|
550
|
+
* export async function $$hoist_0_action(x, y) {
|
|
551
|
+
* "use server"
|
|
552
|
+
* return x + y
|
|
553
|
+
* }
|
|
554
|
+
* ```
|
|
555
|
+
*
|
|
556
|
+
* The generated export is `$$hoist_0_action`, so `names` contains
|
|
557
|
+
* `['$$hoist_0_action']` for this example.
|
|
558
|
+
*
|
|
559
|
+
* Here, `__RUNTIME__(...)` represents the registration expression returned by the
|
|
560
|
+
* `runtime` callback. When `encode` and `decode` are provided, the closure
|
|
561
|
+
* captures instead travel as one encoded bound argument:
|
|
562
|
+
*
|
|
563
|
+
* ```js
|
|
564
|
+
* function Component() {
|
|
565
|
+
* const x = 1
|
|
566
|
+
* const action = __RUNTIME__($$hoist_0_action).bind(
|
|
567
|
+
* null,
|
|
568
|
+
* __ENCODE__([x]),
|
|
569
|
+
* )
|
|
570
|
+
* }
|
|
571
|
+
*
|
|
572
|
+
* export async function $$hoist_0_action($$hoist_encoded, y) {
|
|
573
|
+
* const [x] = __DECODE__($$hoist_encoded)
|
|
574
|
+
* "use server"
|
|
575
|
+
* return x + y
|
|
576
|
+
* }
|
|
577
|
+
* ```
|
|
578
|
+
*
|
|
579
|
+
* In this second sketch, `__ENCODE__(...)` and `__DECODE__(...)` likewise
|
|
580
|
+
* represent the expressions returned by those code-generation callbacks.
|
|
581
|
+
*/
|
|
529
582
|
declare function transformHoistInlineDirective(input: string, ast: Program, { runtime, rejectNonAsyncFunction, ...options }: {
|
|
530
583
|
runtime: (value: string, name: string, meta: {
|
|
531
584
|
directiveMatch: RegExpMatchArray;
|
|
@@ -534,6 +587,7 @@ declare function transformHoistInlineDirective(input: string, ast: Program, { ru
|
|
|
534
587
|
rejectNonAsyncFunction?: boolean;
|
|
535
588
|
encode?: (value: string) => string;
|
|
536
589
|
decode?: (value: string) => string;
|
|
590
|
+
/** Keep generated hoisted declarations module-local instead of exporting them. */
|
|
537
591
|
noExport?: boolean;
|
|
538
592
|
}): {
|
|
539
593
|
output: MagicString;
|
|
@@ -627,9 +681,11 @@ declare function transformServerActionServer(input: string, ast: Program, option
|
|
|
627
681
|
}): {
|
|
628
682
|
exportNames: string[];
|
|
629
683
|
output: MagicString;
|
|
684
|
+
referenceNames: string[];
|
|
630
685
|
} | {
|
|
631
686
|
output: MagicString;
|
|
632
687
|
names: string[];
|
|
688
|
+
referenceNames: string[];
|
|
633
689
|
};
|
|
634
690
|
//#endregion
|
|
635
691
|
//#region src/transforms/expand-export-all.d.ts
|
package/dist/index.d.ts
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import { c as getPluginApi, r as PluginApi, s as RscPluginOptions, u as vitePluginRsc } from "./plugin-
|
|
2
|
-
export { type PluginApi, type RscPluginOptions, vitePluginRsc as default, getPluginApi };
|
|
1
|
+
import { c as getPluginApi, o as RscPluginManager, r as PluginApi, s as RscPluginOptions, u as vitePluginRsc } from "./plugin-DQCCjJl0.js";
|
|
2
|
+
export { type PluginApi, type RscPluginManager, type RscPluginOptions, vitePluginRsc as default, getPluginApi };
|
package/dist/index.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import { r as vitePluginRsc, t as getPluginApi } from "./plugin-
|
|
1
|
+
import { r as vitePluginRsc, t as getPluginApi } from "./plugin-DbK8rF7n.js";
|
|
2
2
|
export { vitePluginRsc as default, getPluginApi };
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { a as __commonJSMin } from "./plugin-
|
|
1
|
+
import { a as __commonJSMin } from "./plugin-DbK8rF7n.js";
|
|
2
2
|
//#region ../../node_modules/.pnpm/picocolors@1.1.1/node_modules/picocolors/picocolors.js
|
|
3
3
|
var require_picocolors = /* @__PURE__ */ __commonJSMin(((exports, module) => {
|
|
4
4
|
let p = process || {};
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { f as TransformWrapExportFilter } from "./index-
|
|
1
|
+
import { f as TransformWrapExportFilter } from "./index-COzKOTR1.js";
|
|
2
2
|
import MagicString from "magic-string";
|
|
3
3
|
import { Plugin, ResolvedConfig, Rollup, ViteDevServer, parseAstAsync } from "vite";
|
|
4
4
|
//#region src/plugins/import-environment.d.ts
|
|
@@ -9,6 +9,30 @@ type EnvironmentImportMeta = {
|
|
|
9
9
|
specifier: string;
|
|
10
10
|
};
|
|
11
11
|
//#endregion
|
|
12
|
+
//#region src/plugins/server-reference.d.ts
|
|
13
|
+
type ServerReferenceMeta = {
|
|
14
|
+
importId: string;
|
|
15
|
+
referenceKey: string;
|
|
16
|
+
exportNames: string[];
|
|
17
|
+
};
|
|
18
|
+
type ServerReferenceClaimMap = DefaultMap<string, Map<string, ServerReferenceMeta>>;
|
|
19
|
+
declare class ServerReferencesManager {
|
|
20
|
+
private manager;
|
|
21
|
+
claimMap: ServerReferenceClaimMap;
|
|
22
|
+
metaMap: Map<string, ServerReferenceMeta>;
|
|
23
|
+
constructor(manager: RscPluginManager);
|
|
24
|
+
resolve(id: string, serverEnvironmentName: string): ServerReferenceMeta;
|
|
25
|
+
replaceClaim(owner: string, id: string, meta: ServerReferenceMeta): void;
|
|
26
|
+
deleteClaim(owner: string, id: string): void;
|
|
27
|
+
findByReferenceKey(referenceKey: string): ServerReferenceMeta | undefined;
|
|
28
|
+
private normalizeImportId;
|
|
29
|
+
}
|
|
30
|
+
declare class DefaultMap<K, V> extends Map<K, V> {
|
|
31
|
+
private createDefault;
|
|
32
|
+
constructor(createDefault: (key: K) => V);
|
|
33
|
+
override get(key: K): V;
|
|
34
|
+
}
|
|
35
|
+
//#endregion
|
|
12
36
|
//#region src/plugin.d.ts
|
|
13
37
|
type ClientReferenceMeta = {
|
|
14
38
|
importId: string;
|
|
@@ -19,11 +43,6 @@ type ClientReferenceMeta = {
|
|
|
19
43
|
serverChunk?: string;
|
|
20
44
|
groupChunkId?: string;
|
|
21
45
|
};
|
|
22
|
-
type ServerReferenceMeta = {
|
|
23
|
-
importId: string;
|
|
24
|
-
referenceKey: string;
|
|
25
|
-
exportNames: string[];
|
|
26
|
-
};
|
|
27
46
|
/**
|
|
28
47
|
* @experimental
|
|
29
48
|
*/
|
|
@@ -35,7 +54,7 @@ declare class RscPluginManager {
|
|
|
35
54
|
isScanBuild: boolean;
|
|
36
55
|
clientReferenceMetaMap: Record<string, ClientReferenceMeta>;
|
|
37
56
|
clientReferenceGroups: Record<string, ClientReferenceMeta[]>;
|
|
38
|
-
|
|
57
|
+
serverReferences: ServerReferencesManager;
|
|
39
58
|
serverResourcesMetaMap: Record<string, {
|
|
40
59
|
key: string;
|
|
41
60
|
}>;
|
|
@@ -50,7 +69,7 @@ type RscPluginOptions = {
|
|
|
50
69
|
* shorthand for configuring `environments.(name).build.rollupOptions.input.index`
|
|
51
70
|
*/
|
|
52
71
|
entries?: Partial<Record<"client" | "ssr" | "rsc", string>>;
|
|
53
|
-
/** @default {
|
|
72
|
+
/** @default { environmentName: "rsc", entryName: "index" } */
|
|
54
73
|
serverHandler?: {
|
|
55
74
|
environmentName: string;
|
|
56
75
|
entryName: string;
|
|
@@ -78,6 +97,11 @@ type RscPluginOptions = {
|
|
|
78
97
|
*/
|
|
79
98
|
defineEncryptionKey?: string;
|
|
80
99
|
/** Escape hatch for Waku's `allowServer` */
|
|
100
|
+
keepUseClientProxy?: boolean;
|
|
101
|
+
/**
|
|
102
|
+
* @deprecated This option contains a typo. Use `keepUseClientProxy` instead.
|
|
103
|
+
* It will be removed in the next breaking release.
|
|
104
|
+
*/
|
|
81
105
|
keepUseCientProxy?: boolean;
|
|
82
106
|
/**
|
|
83
107
|
* Enable build-time validation of 'client-only' and 'server-only' imports
|
|
@@ -226,7 +226,7 @@ function getEntrySource(config, name) {
|
|
|
226
226
|
throw new Error(`[vite-rsc:getEntrySource] expected 'build.rollupOptions.input' to be an object with a '${name}' property that is a string, but got ${JSON.stringify(input)}`);
|
|
227
227
|
}
|
|
228
228
|
function getFallbackRollupEntry(input = {}) {
|
|
229
|
-
const inputEntries = Object.entries(
|
|
229
|
+
const inputEntries = Object.entries(normalizeRollupOptionsInput(input));
|
|
230
230
|
if (inputEntries.length === 1) {
|
|
231
231
|
const [name, source] = inputEntries[0];
|
|
232
232
|
return {
|
|
@@ -236,7 +236,7 @@ function getFallbackRollupEntry(input = {}) {
|
|
|
236
236
|
}
|
|
237
237
|
throw new Error(`[vite-rsc] cannot determine fallback entry name from multiple entries, please specify the entry name explicitly`);
|
|
238
238
|
}
|
|
239
|
-
function
|
|
239
|
+
function normalizeRollupOptionsInput(input = {}) {
|
|
240
240
|
if (typeof input === "string") input = [input];
|
|
241
241
|
if (Array.isArray(input)) return Object.fromEntries(input.map((file) => [path.basename(file).slice(0, -path.extname(file).length), file]));
|
|
242
242
|
return input;
|
|
@@ -260,7 +260,7 @@ const ENV_IMPORTS_ENTRY_FALLBACK = "virtual:vite-rsc/env-imports-entry-fallback"
|
|
|
260
260
|
function ensureEnvironmentImportsEntryFallback({ environments }) {
|
|
261
261
|
for (const [name, config] of Object.entries(environments)) {
|
|
262
262
|
if (name === "client") continue;
|
|
263
|
-
const input =
|
|
263
|
+
const input = normalizeRollupOptionsInput(config.build?.rollupOptions?.input);
|
|
264
264
|
if (Object.keys(input).length === 0) {
|
|
265
265
|
config.build = config.build || {};
|
|
266
266
|
config.build.rollupOptions = config.build.rollupOptions || {};
|
|
@@ -439,6 +439,80 @@ async function transformScanBuildStrip(code) {
|
|
|
439
439
|
return output;
|
|
440
440
|
}
|
|
441
441
|
//#endregion
|
|
442
|
+
//#region src/plugins/server-reference.ts
|
|
443
|
+
var ServerReferencesManager = class {
|
|
444
|
+
manager;
|
|
445
|
+
claimMap = new DefaultMap(() => /* @__PURE__ */ new Map());
|
|
446
|
+
metaMap = /* @__PURE__ */ new Map();
|
|
447
|
+
constructor(manager) {
|
|
448
|
+
this.manager = manager;
|
|
449
|
+
}
|
|
450
|
+
resolve(id, serverEnvironmentName) {
|
|
451
|
+
const importId = this.normalizeImportId(id);
|
|
452
|
+
return {
|
|
453
|
+
importId,
|
|
454
|
+
referenceKey: this.manager.config.command === "build" ? hashString(this.manager.toRelativeId(importId)) : normalizeViteImportAnalysisUrl(this.manager.server.environments[serverEnvironmentName], importId),
|
|
455
|
+
exportNames: []
|
|
456
|
+
};
|
|
457
|
+
}
|
|
458
|
+
replaceClaim(owner, id, meta) {
|
|
459
|
+
this.claimMap.get(id).set(owner, meta);
|
|
460
|
+
this.metaMap = deriveMetaMap(this.claimMap);
|
|
461
|
+
}
|
|
462
|
+
deleteClaim(owner, id) {
|
|
463
|
+
const ownerMap = this.claimMap.get(id);
|
|
464
|
+
ownerMap.delete(owner);
|
|
465
|
+
if (ownerMap.size === 0) this.claimMap.delete(id);
|
|
466
|
+
this.metaMap = deriveMetaMap(this.claimMap);
|
|
467
|
+
}
|
|
468
|
+
findByReferenceKey(referenceKey) {
|
|
469
|
+
for (const meta of this.metaMap.values()) if (meta.referenceKey === referenceKey) return meta;
|
|
470
|
+
}
|
|
471
|
+
normalizeImportId(id) {
|
|
472
|
+
return this.manager.config.command !== "build" && id.includes("/node_modules/") ? cleanUrl(id) : id;
|
|
473
|
+
}
|
|
474
|
+
};
|
|
475
|
+
function deriveMetaMap(claimMap) {
|
|
476
|
+
const normalizedClaimMap = new DefaultMap(() => /* @__PURE__ */ new Map());
|
|
477
|
+
for (const claims of claimMap.values()) for (const [owner, claim] of claims) normalizedClaimMap.get(claim.importId).set(owner, claim);
|
|
478
|
+
const metaMap = /* @__PURE__ */ new Map();
|
|
479
|
+
for (const [importId, claims] of normalizedClaimMap) metaMap.set(importId, aggregateClaims(importId, claims));
|
|
480
|
+
return metaMap;
|
|
481
|
+
}
|
|
482
|
+
function aggregateClaims(importId, claims) {
|
|
483
|
+
let aggregate;
|
|
484
|
+
const exportOwners = /* @__PURE__ */ new Map();
|
|
485
|
+
for (const [claimOwner, claim] of claims) {
|
|
486
|
+
if (!aggregate) aggregate = {
|
|
487
|
+
importId: claim.importId,
|
|
488
|
+
referenceKey: claim.referenceKey,
|
|
489
|
+
exportNames: []
|
|
490
|
+
};
|
|
491
|
+
else if (aggregate.importId !== claim.importId || aggregate.referenceKey !== claim.referenceKey) throw new Error(`[vite-rsc] conflicting server reference identity for '${importId}'`);
|
|
492
|
+
for (const name of claim.exportNames) {
|
|
493
|
+
const existingOwner = exportOwners.get(name);
|
|
494
|
+
if (existingOwner && existingOwner !== claimOwner) throw new Error(`[vite-rsc] server reference '${claim.referenceKey}#${name}' is claimed by both '${existingOwner}' and '${claimOwner}'`);
|
|
495
|
+
exportOwners.set(name, claimOwner);
|
|
496
|
+
}
|
|
497
|
+
}
|
|
498
|
+
assert(aggregate);
|
|
499
|
+
aggregate.exportNames = [...exportOwners.keys()].sort();
|
|
500
|
+
return aggregate;
|
|
501
|
+
}
|
|
502
|
+
var DefaultMap = class extends Map {
|
|
503
|
+
createDefault;
|
|
504
|
+
constructor(createDefault) {
|
|
505
|
+
super();
|
|
506
|
+
this.createDefault = createDefault;
|
|
507
|
+
}
|
|
508
|
+
get(key) {
|
|
509
|
+
if (super.has(key)) return super.get(key);
|
|
510
|
+
const value = this.createDefault(key);
|
|
511
|
+
this.set(key, value);
|
|
512
|
+
return value;
|
|
513
|
+
}
|
|
514
|
+
};
|
|
515
|
+
//#endregion
|
|
442
516
|
//#region src/plugins/validate-import.ts
|
|
443
517
|
function validateImportPlugin() {
|
|
444
518
|
return {
|
|
@@ -543,7 +617,7 @@ var RscPluginManager = class {
|
|
|
543
617
|
isScanBuild = false;
|
|
544
618
|
clientReferenceMetaMap = {};
|
|
545
619
|
clientReferenceGroups = {};
|
|
546
|
-
|
|
620
|
+
serverReferences = new ServerReferencesManager(this);
|
|
547
621
|
serverResourcesMetaMap = {};
|
|
548
622
|
environmentImportMetaMap = {};
|
|
549
623
|
stabilize() {
|
|
@@ -614,13 +688,13 @@ function vitePluginRscMinimal(rscPluginOptions = {}, manager = new RscPluginMana
|
|
|
614
688
|
if (Object.values(manager.clientReferenceMetaMap).find((meta) => meta.referenceKey === parsed.id)) return `export {}`;
|
|
615
689
|
}
|
|
616
690
|
if (parsed.type === "server") {
|
|
617
|
-
let meta =
|
|
691
|
+
let meta = manager.serverReferences.findByReferenceKey(parsed.id);
|
|
618
692
|
if (!meta) {
|
|
619
693
|
try {
|
|
620
694
|
const id = (await this.resolve(parsed.id))?.id ?? parsed.id;
|
|
621
695
|
if (isFileLoadingAllowed(manager.config, slash(cleanUrl(id)))) await this.environment.transformRequest(parsed.id);
|
|
622
696
|
} catch {}
|
|
623
|
-
meta =
|
|
697
|
+
meta = manager.serverReferences.findByReferenceKey(parsed.id);
|
|
624
698
|
}
|
|
625
699
|
if (meta) return `export {}`;
|
|
626
700
|
}
|
|
@@ -636,7 +710,7 @@ function vitePluginRscMinimal(rscPluginOptions = {}, manager = new RscPluginMana
|
|
|
636
710
|
function vitePluginRsc(rscPluginOptions = {}) {
|
|
637
711
|
const manager = new RscPluginManager();
|
|
638
712
|
const buildApp = async (builder) => {
|
|
639
|
-
const colors = await import("./picocolors-
|
|
713
|
+
const colors = await import("./picocolors-BVMUFdce.js").then((m) => /* @__PURE__ */ __toESM(m.default, 1));
|
|
640
714
|
const logStep = (msg) => {
|
|
641
715
|
builder.config.logger.info(colors.blue(msg));
|
|
642
716
|
};
|
|
@@ -895,8 +969,13 @@ function vitePluginRsc(rscPluginOptions = {}) {
|
|
|
895
969
|
}
|
|
896
970
|
if (this.environment.name === "client") {
|
|
897
971
|
if (ctx.server.environments.rsc.moduleGraph.getModuleById(ctx.file)) {
|
|
898
|
-
|
|
899
|
-
|
|
972
|
+
let hasNonCssImporter = false;
|
|
973
|
+
for (const clientMod of ctx.modules) for (const importer of clientMod.importers) {
|
|
974
|
+
if (!importer.id) continue;
|
|
975
|
+
if (isCSSRequest(importer.id)) await this.environment.reloadModule(importer);
|
|
976
|
+
else hasNonCssImporter = true;
|
|
977
|
+
}
|
|
978
|
+
if (!hasNonCssImporter) return [];
|
|
900
979
|
}
|
|
901
980
|
}
|
|
902
981
|
}
|
|
@@ -1312,7 +1391,7 @@ function vitePluginUseClient(useClientPluginOptions, manager) {
|
|
|
1312
1391
|
const result = withRollupError(this, transformDirectiveProxyExport)(ast, {
|
|
1313
1392
|
directive: "use client",
|
|
1314
1393
|
code,
|
|
1315
|
-
keep: !!useClientPluginOptions.keepUseCientProxy,
|
|
1394
|
+
keep: !!(useClientPluginOptions.keepUseClientProxy ?? useClientPluginOptions.keepUseCientProxy),
|
|
1316
1395
|
runtime: (name, meta) => {
|
|
1317
1396
|
let proxyValue = `() => { throw new Error("Unexpectedly client reference export '" + ` + JSON.stringify(name) + ` + "' is called on server") }`;
|
|
1318
1397
|
if (meta?.value) proxyValue = `(${meta.value})`;
|
|
@@ -1435,7 +1514,13 @@ function vitePluginUseClient(useClientPluginOptions, manager) {
|
|
|
1435
1514
|
if (this.environment.name === serverEnvironmentName && bareImportRE.test(source) && !(source === "client-only" || source === "server-only")) {
|
|
1436
1515
|
const resolved = await this.resolve(source, importer, options);
|
|
1437
1516
|
if (resolved && resolved.id.includes("/node_modules/")) {
|
|
1438
|
-
const
|
|
1517
|
+
const rootImporter = path.join(this.environment.config.root, "index.html");
|
|
1518
|
+
let resolvedAtRoot;
|
|
1519
|
+
try {
|
|
1520
|
+
resolvedAtRoot = await this.resolve(source, rootImporter, options);
|
|
1521
|
+
} catch {
|
|
1522
|
+
return;
|
|
1523
|
+
}
|
|
1439
1524
|
if (!resolvedAtRoot || resolvedAtRoot.id !== resolved.id) return;
|
|
1440
1525
|
packageSources.set(resolved.id, source);
|
|
1441
1526
|
return resolved;
|
|
@@ -1571,11 +1656,12 @@ function vitePluginUseServer(useServerPluginOptions, manager) {
|
|
|
1571
1656
|
const serverEnvironmentName = useServerPluginOptions.environment?.rsc ?? "rsc";
|
|
1572
1657
|
const browserEnvironmentName = useServerPluginOptions.environment?.browser ?? "client";
|
|
1573
1658
|
const debug = createDebug("vite-rsc:use-server");
|
|
1659
|
+
const pluginName = "rsc:use-server";
|
|
1574
1660
|
return [{
|
|
1575
|
-
name:
|
|
1661
|
+
name: pluginName,
|
|
1576
1662
|
transform: { async handler(code, id) {
|
|
1577
1663
|
if (!code.includes("use server")) {
|
|
1578
|
-
|
|
1664
|
+
manager.serverReferences.deleteClaim(pluginName, id);
|
|
1579
1665
|
return;
|
|
1580
1666
|
}
|
|
1581
1667
|
let ast = await parseAstAsync(code);
|
|
@@ -1591,37 +1677,32 @@ function vitePluginUseServer(useServerPluginOptions, manager) {
|
|
|
1591
1677
|
ast = await parseAstAsync(code);
|
|
1592
1678
|
}
|
|
1593
1679
|
}
|
|
1594
|
-
let
|
|
1595
|
-
const
|
|
1596
|
-
if (!
|
|
1597
|
-
if (this.environment.mode === "dev" && id.includes("/node_modules/")) {
|
|
1598
|
-
|
|
1599
|
-
id = cleanUrl(id);
|
|
1600
|
-
}
|
|
1601
|
-
if (manager.config.command === "build") normalizedId_ = hashString(manager.toRelativeId(id));
|
|
1602
|
-
else normalizedId_ = normalizeViteImportAnalysisUrl(manager.server.environments[serverEnvironmentName], id);
|
|
1680
|
+
let serverReference_;
|
|
1681
|
+
const getServerReference = () => {
|
|
1682
|
+
if (!serverReference_) {
|
|
1683
|
+
if (this.environment.mode === "dev" && id.includes("/node_modules/")) debug(`internal server reference created through a package imported in ${this.environment.name} environment: ${id}`);
|
|
1684
|
+
serverReference_ = manager.serverReferences.resolve(id, serverEnvironmentName);
|
|
1603
1685
|
}
|
|
1604
|
-
return
|
|
1686
|
+
return serverReference_;
|
|
1605
1687
|
};
|
|
1606
1688
|
if (this.environment.name === serverEnvironmentName) {
|
|
1607
1689
|
const transformServerActionServer_ = withRollupError(this, transformServerActionServer);
|
|
1608
1690
|
const enableEncryption = useServerPluginOptions.enableActionEncryption ?? true;
|
|
1609
1691
|
const result = transformServerActionServer_(code, ast, {
|
|
1610
|
-
runtime: (value, name) => `$$ReactServer.registerServerReference(${value}, ${JSON.stringify(
|
|
1692
|
+
runtime: (value, name) => `$$ReactServer.registerServerReference(${value}, ${JSON.stringify(getServerReference().referenceKey)}, ${JSON.stringify(name)})`,
|
|
1611
1693
|
rejectNonAsyncFunction: true,
|
|
1612
1694
|
encode: enableEncryption ? (value) => `__vite_rsc_encryption_runtime.encryptActionBoundArgs(${value})` : void 0,
|
|
1613
1695
|
decode: enableEncryption ? (value) => `await __vite_rsc_encryption_runtime.decryptActionBoundArgs(${value})` : void 0
|
|
1614
1696
|
});
|
|
1615
1697
|
const output = result.output;
|
|
1616
1698
|
if (!result || !output.hasChanged()) {
|
|
1617
|
-
|
|
1699
|
+
manager.serverReferences.deleteClaim(pluginName, id);
|
|
1618
1700
|
return;
|
|
1619
1701
|
}
|
|
1620
|
-
manager.
|
|
1621
|
-
|
|
1622
|
-
|
|
1623
|
-
|
|
1624
|
-
};
|
|
1702
|
+
manager.serverReferences.replaceClaim(pluginName, id, {
|
|
1703
|
+
...getServerReference(),
|
|
1704
|
+
exportNames: result.referenceNames
|
|
1705
|
+
});
|
|
1625
1706
|
const importSource = resolvePackage(`${PKG_NAME}/react/rsc/server`);
|
|
1626
1707
|
output.prepend(`import * as $$ReactServer from "${importSource}";\n`);
|
|
1627
1708
|
if (enableEncryption) {
|
|
@@ -1634,23 +1715,28 @@ function vitePluginUseServer(useServerPluginOptions, manager) {
|
|
|
1634
1715
|
};
|
|
1635
1716
|
} else {
|
|
1636
1717
|
if (!hasDirective(ast.body, "use server")) {
|
|
1637
|
-
|
|
1718
|
+
manager.serverReferences.deleteClaim(pluginName, id);
|
|
1638
1719
|
return;
|
|
1639
1720
|
}
|
|
1640
1721
|
const result = withRollupError(this, transformDirectiveProxyExport)(ast, {
|
|
1641
1722
|
code,
|
|
1642
|
-
runtime: (name) => `$$ReactClient.createServerReference(${JSON.stringify(
|
|
1723
|
+
runtime: (name) => `$$ReactClient.createServerReference(${JSON.stringify(getServerReference().referenceKey + "#" + name)},$$ReactClient.callServer, undefined, ` + (this.environment.mode === "dev" ? `$$ReactClient.findSourceMapURL,` : "undefined,") + `${JSON.stringify(name)})`,
|
|
1643
1724
|
directive: "use server",
|
|
1644
1725
|
rejectNonAsyncFunction: true
|
|
1645
1726
|
});
|
|
1646
|
-
if (!result)
|
|
1727
|
+
if (!result) {
|
|
1728
|
+
manager.serverReferences.deleteClaim(pluginName, id);
|
|
1729
|
+
return;
|
|
1730
|
+
}
|
|
1647
1731
|
const output = result?.output;
|
|
1648
|
-
if (!output?.hasChanged())
|
|
1649
|
-
|
|
1650
|
-
|
|
1651
|
-
|
|
1732
|
+
if (!output?.hasChanged()) {
|
|
1733
|
+
manager.serverReferences.deleteClaim(pluginName, id);
|
|
1734
|
+
return;
|
|
1735
|
+
}
|
|
1736
|
+
manager.serverReferences.replaceClaim(pluginName, id, {
|
|
1737
|
+
...getServerReference(),
|
|
1652
1738
|
exportNames: result.exportNames
|
|
1653
|
-
};
|
|
1739
|
+
});
|
|
1654
1740
|
const name = this.environment.name === browserEnvironmentName ? "browser" : "ssr";
|
|
1655
1741
|
const importSource = resolvePackage(`${PKG_NAME}/react/${name}`);
|
|
1656
1742
|
output.prepend(`import * as $$ReactClient from "${importSource}";\n`);
|
|
@@ -1666,7 +1752,7 @@ function vitePluginUseServer(useServerPluginOptions, manager) {
|
|
|
1666
1752
|
map: null
|
|
1667
1753
|
};
|
|
1668
1754
|
let code = "";
|
|
1669
|
-
for (const meta of
|
|
1755
|
+
for (const meta of manager.serverReferences.metaMap.values()) {
|
|
1670
1756
|
const key = JSON.stringify(meta.referenceKey);
|
|
1671
1757
|
const id = JSON.stringify(meta.importId);
|
|
1672
1758
|
const exports = meta.exportNames.map((name) => name === "default" ? "default: _default" : name).sort();
|
package/dist/plugin.d.ts
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import { a as ResolvedAssetsManifest, c as getPluginApi, d as vitePluginRscMinimal, i as ResolvedAssetDeps, l as transformRscCssExport, n as AssetsManifest, o as RscPluginManager, r as PluginApi, s as RscPluginOptions, t as AssetDeps, u as vitePluginRsc } from "./plugin-
|
|
1
|
+
import { a as ResolvedAssetsManifest, c as getPluginApi, d as vitePluginRscMinimal, i as ResolvedAssetDeps, l as transformRscCssExport, n as AssetsManifest, o as RscPluginManager, r as PluginApi, s as RscPluginOptions, t as AssetDeps, u as vitePluginRsc } from "./plugin-DQCCjJl0.js";
|
|
2
2
|
export { AssetDeps, AssetsManifest, PluginApi, ResolvedAssetDeps, ResolvedAssetsManifest, type RscPluginManager, RscPluginOptions, vitePluginRsc as default, getPluginApi, transformRscCssExport, vitePluginRscMinimal };
|
package/dist/plugin.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import { i as vitePluginRscMinimal, n as transformRscCssExport, r as vitePluginRsc, t as getPluginApi } from "./plugin-
|
|
1
|
+
import { i as vitePluginRscMinimal, n as transformRscCssExport, r as vitePluginRsc, t as getPluginApi } from "./plugin-DbK8rF7n.js";
|
|
2
2
|
export { vitePluginRsc as default, getPluginApi, transformRscCssExport, vitePluginRscMinimal };
|
package/dist/rsc/server.d.ts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { a as createServerManifest, o as loadServerAction, r as createClientManifest, s as setRequireModule } from "../rsc-C3UdJLOW.js";
|
|
2
2
|
import { a as registerClientReference, i as decodeReply, n as decodeAction, o as registerServerReference, r as decodeFormState, t as createTemporaryReferenceSet } from "../server-ZBjqNTqU.js";
|
|
3
|
-
import { t as OnClientReference } from "../client-reference-
|
|
3
|
+
import { t as OnClientReference } from "../client-reference-DR15qkcN.js";
|
|
4
4
|
//#region src/rsc/server.d.ts
|
|
5
5
|
declare function renderToReadableStream<T>(data: T, options?: object, extraOptions?: {
|
|
6
6
|
/**
|
package/dist/rsc/static.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { d as RenderToReadableStreamOptions, u as PrerenderResult } from "../index-C5IY2S-e.js";
|
|
2
|
-
import { t as OnClientReference } from "../client-reference-
|
|
2
|
+
import { t as OnClientReference } from "../client-reference-DR15qkcN.js";
|
|
3
3
|
//#region src/rsc/static.d.ts
|
|
4
4
|
declare function prerender<T>(data: T, options?: RenderToReadableStreamOptions, extraOptions?: {
|
|
5
5
|
/**
|
package/dist/ssr.d.ts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { s as EncodeFormActionCallback } from "./index-C5IY2S-e.js";
|
|
2
2
|
import { createServerConsumerManifest, setRequireModule } from "./core/ssr.js";
|
|
3
|
-
import { i as ResolvedAssetDeps } from "./plugin-
|
|
3
|
+
import { i as ResolvedAssetDeps } from "./plugin-DQCCjJl0.js";
|
|
4
4
|
import { callServer, createFromReadableStream, createServerReference, createTemporaryReferenceSet, encodeReply, findSourceMapURL } from "./react/ssr.js";
|
|
5
5
|
//#region src/ssr.d.ts
|
|
6
6
|
/**
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import { a as extractIdentifiers, c as validateNonAsyncFunction, d as transformProxyExport, f as TransformWrapExportFilter, g as transformHoistInlineDirective, h as findDirectives, i as transformServerActionServer, l as TransformProxyExportOptions, m as transformWrapExport, n as TransformExpandExportAllOptions, o as extractNames, p as TransformWrapExportOptions, r as transformExpandExportAll, s as hasDirective, t as TransformExpandExportAllContext, u as transformDirectiveProxyExport } from "../index-
|
|
1
|
+
import { a as extractIdentifiers, c as validateNonAsyncFunction, d as transformProxyExport, f as TransformWrapExportFilter, g as transformHoistInlineDirective, h as findDirectives, i as transformServerActionServer, l as TransformProxyExportOptions, m as transformWrapExport, n as TransformExpandExportAllOptions, o as extractNames, p as TransformWrapExportOptions, r as transformExpandExportAll, s as hasDirective, t as TransformExpandExportAllContext, u as transformDirectiveProxyExport } from "../index-COzKOTR1.js";
|
|
2
2
|
export { TransformExpandExportAllContext, TransformExpandExportAllOptions, TransformProxyExportOptions, TransformWrapExportFilter, TransformWrapExportOptions, extractIdentifiers, extractNames, findDirectives, hasDirective, transformDirectiveProxyExport, transformExpandExportAll, transformHoistInlineDirective, transformProxyExport, transformServerActionServer, transformWrapExport, validateNonAsyncFunction };
|
package/dist/transforms/index.js
CHANGED
|
@@ -3,6 +3,59 @@ import { a as validateNonAsyncFunction, i as hasDirective, n as extractIdentifie
|
|
|
3
3
|
import MagicString from "magic-string";
|
|
4
4
|
import { walk } from "estree-walker";
|
|
5
5
|
//#region src/transforms/hoist.ts
|
|
6
|
+
/**
|
|
7
|
+
* Turns an inline directive function into a module-level registered function.
|
|
8
|
+
* Conceptually:
|
|
9
|
+
*
|
|
10
|
+
* ```js
|
|
11
|
+
* function Component() {
|
|
12
|
+
* const x = 1
|
|
13
|
+
* async function action(y) {
|
|
14
|
+
* "use server"
|
|
15
|
+
* return x + y
|
|
16
|
+
* }
|
|
17
|
+
* }
|
|
18
|
+
* ```
|
|
19
|
+
*
|
|
20
|
+
* becomes:
|
|
21
|
+
*
|
|
22
|
+
* ```js
|
|
23
|
+
* function Component() {
|
|
24
|
+
* const x = 1
|
|
25
|
+
* const action = __RUNTIME__($$hoist_0_action).bind(null, x)
|
|
26
|
+
* }
|
|
27
|
+
* export async function $$hoist_0_action(x, y) {
|
|
28
|
+
* "use server"
|
|
29
|
+
* return x + y
|
|
30
|
+
* }
|
|
31
|
+
* ```
|
|
32
|
+
*
|
|
33
|
+
* The generated export is `$$hoist_0_action`, so `names` contains
|
|
34
|
+
* `['$$hoist_0_action']` for this example.
|
|
35
|
+
*
|
|
36
|
+
* Here, `__RUNTIME__(...)` represents the registration expression returned by the
|
|
37
|
+
* `runtime` callback. When `encode` and `decode` are provided, the closure
|
|
38
|
+
* captures instead travel as one encoded bound argument:
|
|
39
|
+
*
|
|
40
|
+
* ```js
|
|
41
|
+
* function Component() {
|
|
42
|
+
* const x = 1
|
|
43
|
+
* const action = __RUNTIME__($$hoist_0_action).bind(
|
|
44
|
+
* null,
|
|
45
|
+
* __ENCODE__([x]),
|
|
46
|
+
* )
|
|
47
|
+
* }
|
|
48
|
+
*
|
|
49
|
+
* export async function $$hoist_0_action($$hoist_encoded, y) {
|
|
50
|
+
* const [x] = __DECODE__($$hoist_encoded)
|
|
51
|
+
* "use server"
|
|
52
|
+
* return x + y
|
|
53
|
+
* }
|
|
54
|
+
* ```
|
|
55
|
+
*
|
|
56
|
+
* In this second sketch, `__ENCODE__(...)` and `__DECODE__(...)` likewise
|
|
57
|
+
* represent the expressions returned by those code-generation callbacks.
|
|
58
|
+
*/
|
|
6
59
|
function transformHoistInlineDirective(input, ast, { runtime, rejectNonAsyncFunction, ...options }) {
|
|
7
60
|
if (!input.endsWith("\n")) input += "\n";
|
|
8
61
|
const output = new MagicString(input);
|
|
@@ -378,11 +431,21 @@ function transformProxyExport(ast, options) {
|
|
|
378
431
|
//#endregion
|
|
379
432
|
//#region src/transforms/server-action.ts
|
|
380
433
|
function transformServerActionServer(input, ast, options) {
|
|
381
|
-
if (hasDirective(ast.body, "use server"))
|
|
382
|
-
|
|
434
|
+
if (hasDirective(ast.body, "use server")) {
|
|
435
|
+
const result = transformWrapExport(input, ast, options);
|
|
436
|
+
return {
|
|
437
|
+
...result,
|
|
438
|
+
referenceNames: result.exportNames
|
|
439
|
+
};
|
|
440
|
+
}
|
|
441
|
+
const result = transformHoistInlineDirective(input, ast, {
|
|
383
442
|
...options,
|
|
384
443
|
directive: "use server"
|
|
385
444
|
});
|
|
445
|
+
return {
|
|
446
|
+
...result,
|
|
447
|
+
referenceNames: result.names
|
|
448
|
+
};
|
|
386
449
|
}
|
|
387
450
|
//#endregion
|
|
388
451
|
//#region src/transforms/expand-export-all.ts
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@vitejs/plugin-rsc",
|
|
3
|
-
"version": "0.5.
|
|
3
|
+
"version": "0.5.31",
|
|
4
4
|
"description": "React Server Components (RSC) support for Vite.",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"react",
|
|
@@ -28,35 +28,24 @@
|
|
|
28
28
|
"./transforms": "./dist/transforms/index.js",
|
|
29
29
|
"./*": "./dist/*.js"
|
|
30
30
|
},
|
|
31
|
-
"scripts": {
|
|
32
|
-
"test": "vitest",
|
|
33
|
-
"test-e2e": "playwright test --project=chromium",
|
|
34
|
-
"test-e2e-ci": "playwright test",
|
|
35
|
-
"tsc": "tsc -b ./tsconfig.json ./e2e/tsconfig.json ./examples/*/tsconfig.json",
|
|
36
|
-
"tsc-dev": "pnpm tsc --watch --preserveWatchOutput",
|
|
37
|
-
"dev": "tsdown --sourcemap --watch src",
|
|
38
|
-
"build": "tsdown",
|
|
39
|
-
"prepack": "tsdown"
|
|
40
|
-
},
|
|
41
31
|
"dependencies": {
|
|
42
32
|
"@rolldown/pluginutils": "^1.0.1",
|
|
43
33
|
"es-module-lexer": "^2.3.1",
|
|
44
34
|
"estree-walker": "^3.0.3",
|
|
45
35
|
"magic-string": "^0.30.21",
|
|
46
|
-
"srvx": "^0.
|
|
36
|
+
"srvx": "^0.12.4",
|
|
47
37
|
"strip-literal": "^3.1.0",
|
|
48
38
|
"turbo-stream": "^3.2.0",
|
|
49
39
|
"vitefu": "^1.1.3"
|
|
50
40
|
},
|
|
51
41
|
"devDependencies": {
|
|
52
42
|
"@hiogawa/utils": "^1.7.0",
|
|
53
|
-
"@playwright/test": "^1.
|
|
43
|
+
"@playwright/test": "^1.62.0",
|
|
54
44
|
"@tsconfig/strictest": "^2.0.8",
|
|
55
45
|
"@types/estree": "^1.0.9",
|
|
56
46
|
"@types/node": "^24.13.3",
|
|
57
47
|
"@types/react": "^19.2.17",
|
|
58
48
|
"@types/react-dom": "^19.2.3",
|
|
59
|
-
"@vitejs/plugin-react": "workspace:*",
|
|
60
49
|
"@vitejs/test-dep-cjs-and-esm": "./test-dep/cjs-and-esm",
|
|
61
50
|
"@vitejs/test-dep-cjs-falsy-primitive": "./test-dep/cjs-falsy-primitive",
|
|
62
51
|
"picocolors": "^1.1.1",
|
|
@@ -64,7 +53,8 @@
|
|
|
64
53
|
"react-dom": "^19.2.8",
|
|
65
54
|
"react-server-dom-webpack": "^19.2.8",
|
|
66
55
|
"tinyexec": "^1.2.4",
|
|
67
|
-
"tsdown": "^0.22.
|
|
56
|
+
"tsdown": "^0.22.14",
|
|
57
|
+
"@vitejs/plugin-react": "6.0.4"
|
|
68
58
|
},
|
|
69
59
|
"peerDependencies": {
|
|
70
60
|
"react": "*",
|
|
@@ -87,5 +77,14 @@
|
|
|
87
77
|
"type": "incompatible",
|
|
88
78
|
"reason": "Uses Vite-specific APIs"
|
|
89
79
|
}
|
|
80
|
+
},
|
|
81
|
+
"scripts": {
|
|
82
|
+
"test": "vitest",
|
|
83
|
+
"test-e2e": "playwright test --project=chromium",
|
|
84
|
+
"test-e2e-ci": "playwright test",
|
|
85
|
+
"tsc": "tsc -b ./tsconfig.json ./e2e/tsconfig.json ./examples/*/tsconfig.json",
|
|
86
|
+
"tsc-dev": "pnpm tsc --watch --preserveWatchOutput",
|
|
87
|
+
"dev": "tsdown --sourcemap --watch src",
|
|
88
|
+
"build": "tsdown"
|
|
90
89
|
}
|
|
91
|
-
}
|
|
90
|
+
}
|