@tanstack/start-plugin-core 1.169.17 → 1.169.19
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/esm/import-protection/analysis.d.ts +5 -5
- package/dist/esm/import-protection/analysis.js +13 -9
- package/dist/esm/import-protection/analysis.js.map +1 -1
- package/dist/esm/import-protection/rewrite.js +5 -3
- package/dist/esm/import-protection/rewrite.js.map +1 -1
- package/dist/esm/import-protection/sourceLocation.d.ts +3 -2
- package/dist/esm/import-protection/sourceLocation.js +1 -0
- package/dist/esm/import-protection/sourceLocation.js.map +1 -1
- package/dist/esm/rsbuild/import-protection.js +9 -6
- package/dist/esm/rsbuild/import-protection.js.map +1 -1
- package/dist/esm/rsbuild/plugin.js +1 -0
- package/dist/esm/rsbuild/plugin.js.map +1 -1
- package/dist/esm/start-compiler/compiler.d.ts +4 -2
- package/dist/esm/start-compiler/compiler.js +8 -4
- package/dist/esm/start-compiler/compiler.js.map +1 -1
- package/dist/esm/vite/import-protection-plugin/plugin.js +4 -3
- package/dist/esm/vite/import-protection-plugin/plugin.js.map +1 -1
- package/package.json +8 -8
- package/src/import-protection/analysis.ts +22 -10
- package/src/import-protection/rewrite.ts +4 -5
- package/src/import-protection/sourceLocation.ts +4 -2
- package/src/rsbuild/import-protection.ts +7 -5
- package/src/rsbuild/plugin.ts +3 -0
- package/src/start-compiler/compiler.ts +13 -3
- package/src/vite/import-protection-plugin/plugin.ts +4 -3
- package/dist/esm/import-protection/ast.d.ts +0 -3
- package/dist/esm/import-protection/ast.js +0 -9
- package/dist/esm/import-protection/ast.js.map +0 -1
- package/src/import-protection/ast.ts +0 -7
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"import-protection.js","names":[],"sources":["../../../src/rsbuild/import-protection.ts"],"sourcesContent":["import { extname, resolve as resolvePath } from 'node:path'\n\nimport {\n getDefaultImportProtectionRules,\n getMarkerSpecifiers,\n} from '../import-protection/defaults'\nimport { normalizePath } from '../utils'\nimport { ExtensionlessAbsoluteIdResolver } from '../import-protection/extensionlessAbsoluteIdResolver'\nimport { compileMatchers, matchesAny } from '../import-protection/matchers'\nimport {\n getImportProtectionEnvType,\n getImportProtectionRelativePath,\n getImportProtectionRulesForEnvironment,\n shouldCheckImportProtectionImporter,\n} from '../import-protection/adapterUtils'\nimport {\n findOriginalUnsafeUsagePosFromResult,\n getImportSources,\n getMockExportNamesBySource,\n getNamedExports,\n} from '../import-protection/analysis'\nimport { rewriteDeniedImports } from '../import-protection/rewrite'\nimport {\n ImportLocCache,\n addTraceImportLocations,\n buildCodeSnippet,\n buildLineIndex,\n createImportSpecifierLocationIndex,\n findImportStatementLocationFromTransformed,\n findOriginalUsageLocation,\n findPostCompileUsageLocation,\n getOrCreateOriginalTransformResult,\n indexToLineColumn,\n normalizeSourceMap,\n pickOriginalCodeFromSourcesContent,\n} from '../import-protection/sourceLocation'\nimport {\n ImportGraph,\n buildTrace,\n formatViolation,\n} from '../import-protection/trace'\nimport {\n generateDevSelfDenialModule,\n generateSelfContainedMockModule,\n loadMockEdgeModule,\n loadMockRuntimeModule,\n loadSilentMockModule,\n} from '../import-protection/virtualModules'\nimport {\n buildResolutionCandidates,\n buildSourceCandidates,\n canonicalizeResolvedId,\n checkFileDenial,\n clearNormalizeFilePathCache,\n dedupePatterns,\n dedupeViolationKey,\n isFileExcluded,\n normalizeFilePath,\n} from '../import-protection/utils'\n\nimport type {\n ImportProtectionBehavior,\n ImportProtectionOptions,\n} from '../schema'\nimport type { CompiledMatcher } from '../import-protection/matchers'\nimport type {\n SourceMapLike,\n TransformResult,\n TransformResultProvider,\n} from '../import-protection/sourceLocation'\nimport type { Loc, TraceStep, ViolationInfo } from '../import-protection/trace'\nimport type { CompileStartFrameworkOptions, GetConfigFn } from '../types'\nimport type {\n RsbuildPluginAPI,\n Rspack,\n rspack as rspackNamespaceType,\n} from '@rsbuild/core'\n\ntype RspackNamespace = typeof rspackNamespaceType\ntype RspackVirtualModulesPlugin = InstanceType<\n RspackNamespace['experiments']['VirtualModulesPlugin']\n>\ntype ProcessAssetsContext = Parameters<\n Parameters<RsbuildPluginAPI['processAssets']>[1]\n>[0]\ntype TransformContext = Parameters<\n Parameters<RsbuildPluginAPI['transform']>[1]\n>[0]\ntype RspackCompilation = Rspack.Compilation\ntype RspackModule = Rspack.Module\ntype RspackModuleGraphConnection = {\n module?: RspackModule | null\n dependency?: unknown\n getActiveState?: (runtime: string | Array<string> | undefined) => unknown\n}\ntype OriginalCodeLoader = (file: string) => Promise<string | undefined>\nconst importSpecifierLocationIndex = createImportSpecifierLocationIndex()\n\ninterface EnvRules {\n specifiers: Array<CompiledMatcher>\n files: Array<CompiledMatcher>\n excludeFiles: Array<CompiledMatcher>\n}\n\ninterface PluginConfig {\n enabled: boolean\n root: string\n command: 'build' | 'serve'\n srcDirectory: string\n framework: CompileStartFrameworkOptions\n effectiveBehavior: ImportProtectionBehavior\n mockAccess: 'error' | 'warn' | 'off'\n logMode: 'once' | 'always'\n maxTraceDepth: number\n compiledRules: {\n client: EnvRules\n server: EnvRules\n }\n includeMatchers: Array<CompiledMatcher>\n excludeMatchers: Array<CompiledMatcher>\n ignoreImporterMatchers: Array<CompiledMatcher>\n markerSpecifiers: {\n serverOnly: Set<string>\n clientOnly: Set<string>\n }\n envTypeMap: Map<string, 'client' | 'server'>\n onViolation?: (\n info: ViolationInfo,\n ) => boolean | void | Promise<boolean | void>\n}\n\ninterface EnvRuntimeState {\n resolveCache: Map<string, string | null>\n seenViolations: Set<string>\n buildTransformResults: Map<string, TransformResult>\n deferredFileViolations: Array<DeferredFileViolation>\n deferredFileViolationKeys: Set<string>\n}\n\ninterface DeferredFileViolation {\n importer: string\n specifier: string\n resolved: string\n relativeResolved: string\n pattern: string | RegExp\n useOriginalLocation: boolean\n}\n\ninterface SharedState {\n root: string\n virtualModules: Map<string, string>\n vmPlugins: Record<string, RspackVirtualModulesPlugin>\n readyVmPlugins: Record<string, boolean>\n inputFileSystems: Record<string, Rspack.Compiler['inputFileSystem']>\n pendingWrites: Map<string, Map<string, string>>\n}\n\ninterface CompilationEdge {\n importer: string\n specifier?: string\n resolved: string\n}\n\ninterface MockEdgePayload {\n exports: Array<string>\n runtimeId: string\n violation: {\n env: string\n envType: 'client' | 'server'\n importer: string\n specifier: string\n resolved?: string\n patternText: string\n }\n}\n\nconst IMPORT_PROTECTION_VIRTUAL_DIR = 'node_modules/.virtual/import-protection'\nconst MOCK_EDGE_FILE_PREFIX = 'mock-edge-'\nconst MOCK_RUNTIME_FILE_PREFIX = 'mock-runtime-'\nconst MOCK_SILENT_FILE = 'mock-silent.mjs'\n\nfunction toBase64Url(input: unknown): string {\n return Buffer.from(JSON.stringify(input), 'utf8').toString('base64url')\n}\n\nfunction fromBase64Url<T>(input: string): T {\n return JSON.parse(Buffer.from(input, 'base64url').toString('utf8')) as T\n}\n\nfunction getRulesForEnvironment(\n config: PluginConfig,\n envName: string,\n): EnvRules {\n return getImportProtectionRulesForEnvironment(config, envName) as EnvRules\n}\n\nfunction serializePattern(pattern: string | RegExp): string {\n return typeof pattern === 'string' ? pattern : pattern.toString()\n}\n\nfunction dedupeKey(info: ViolationInfo): string {\n return dedupeViolationKey(info)\n}\n\nfunction getOrCreateEnvState(\n envStates: Map<string, EnvRuntimeState>,\n envName: string,\n): EnvRuntimeState {\n let env = envStates.get(envName)\n\n if (!env) {\n env = {\n resolveCache: new Map(),\n seenViolations: new Set(),\n buildTransformResults: new Map(),\n deferredFileViolations: [],\n deferredFileViolationKeys: new Set(),\n }\n envStates.set(envName, env)\n }\n\n return env\n}\n\nfunction getVirtualModulePath(\n root: string,\n envName: string,\n filename: string,\n): string {\n return normalizePath(\n resolvePath(root, IMPORT_PROTECTION_VIRTUAL_DIR, envName, filename),\n )\n}\n\nfunction queuePendingWrite(\n shared: SharedState,\n envName: string,\n filePath: string,\n code: string,\n): void {\n let writes = shared.pendingWrites.get(envName)\n if (!writes) {\n writes = new Map()\n shared.pendingWrites.set(envName, writes)\n }\n\n writes.set(filePath, code)\n}\n\nfunction tryWriteVirtualModule(\n shared: SharedState,\n envName: string,\n filePath: string,\n code: string,\n): string {\n const current = shared.virtualModules.get(filePath)\n if (current === code) {\n return filePath\n }\n\n shared.virtualModules.set(filePath, code)\n\n const vmPlugin = shared.vmPlugins[envName]\n if (!vmPlugin || !shared.readyVmPlugins[envName]) {\n queuePendingWrite(shared, envName, filePath, code)\n return filePath\n }\n\n vmPlugin.writeModule(filePath, code)\n return filePath\n}\n\nfunction flushPendingWrites(shared: SharedState, envName: string): void {\n const writes = shared.pendingWrites.get(envName)\n if (!writes?.size || !shared.readyVmPlugins[envName]) {\n return\n }\n\n for (const [filePath, code] of writes) {\n shared.vmPlugins[envName]?.writeModule(filePath, code)\n writes.delete(filePath)\n }\n\n if (writes.size === 0) {\n shared.pendingWrites.delete(envName)\n }\n}\n\nfunction ensureSilentMockModule(shared: SharedState, envName: string): string {\n return tryWriteVirtualModule(\n shared,\n envName,\n getVirtualModulePath(shared.root, envName, MOCK_SILENT_FILE),\n loadSilentMockModule().code,\n )\n}\n\nfunction ensureRuntimeMockModule(opts: {\n shared: SharedState\n envName: string\n mode: 'error' | 'warn' | 'off'\n env: string\n importer: string\n specifier: string\n}): string {\n const encoded = toBase64Url({\n mode: opts.mode,\n env: opts.env,\n importer: opts.importer,\n specifier: opts.specifier,\n trace: [],\n })\n\n return tryWriteVirtualModule(\n opts.shared,\n opts.envName,\n getVirtualModulePath(\n opts.shared.root,\n opts.envName,\n `${MOCK_RUNTIME_FILE_PREFIX}${encoded}.mjs`,\n ),\n loadMockRuntimeModule(encoded).code,\n )\n}\n\nfunction ensureMockEdgeModule(opts: {\n shared: SharedState\n envName: string\n payload: MockEdgePayload\n}): string {\n const encoded = toBase64Url(opts.payload)\n\n return tryWriteVirtualModule(\n opts.shared,\n opts.envName,\n getVirtualModulePath(\n opts.shared.root,\n opts.envName,\n `${MOCK_EDGE_FILE_PREFIX}${encoded}.mjs`,\n ),\n loadMockEdgeModule(encoded).code,\n )\n}\n\nfunction getMockEdgePayloadFromFile(\n filePath: string,\n): MockEdgePayload | undefined {\n const match = /(?:^|[\\\\/])mock-edge-([^/\\\\]+)\\.mjs$/.exec(filePath)\n if (!match) {\n return undefined\n }\n\n try {\n return fromBase64Url<MockEdgePayload>(match[1]!)\n } catch {\n return undefined\n }\n}\n\nasync function loadOriginalCode(\n cache: Map<string, Promise<string | undefined>>,\n file: string,\n loader: OriginalCodeLoader,\n): Promise<string | undefined> {\n let result = cache.get(file)\n if (!result) {\n result = loader(file)\n cache.set(file, result)\n }\n\n return result\n}\n\nasync function loadOriginalCodeFromInputFileSystem(\n inputFileSystem: NonNullable<RspackCompilation['inputFileSystem']>,\n file: string,\n): Promise<string | undefined> {\n return new Promise((resolve) => {\n inputFileSystem.readFile(file, (error, data) => {\n if (error || data == null) {\n resolve(undefined)\n return\n }\n\n resolve(typeof data === 'string' ? data : data.toString('utf8'))\n })\n })\n}\n\nasync function resolveAgainstImporter(opts: {\n envState: EnvRuntimeState\n config: PluginConfig\n ctx: TransformContext\n importerId: string\n source: string\n extensionlessResolver: ExtensionlessAbsoluteIdResolver\n}): Promise<string | null> {\n const normalizedImporter = normalizeFilePath(opts.importerId)\n const cacheKey = `${normalizedImporter}:${opts.source}`\n\n if (opts.envState.resolveCache.has(cacheKey)) {\n return opts.envState.resolveCache.get(cacheKey) ?? null\n }\n\n const importerDir =\n opts.ctx.context ?? opts.importerId.replace(/[/\\\\][^/\\\\]*$/, '')\n\n const resolved = await new Promise<string | null>((resolve, reject) => {\n opts.ctx.resolve(importerDir, opts.source, (error, result) => {\n if (error) {\n reject(error)\n return\n }\n\n resolve(typeof result === 'string' ? result : null)\n })\n }).catch(() => null)\n\n if (!resolved) {\n opts.envState.resolveCache.set(cacheKey, null)\n return null\n }\n\n const canonical = canonicalizeResolvedId(\n resolved,\n opts.config.root,\n (value) => opts.extensionlessResolver.resolve(value),\n )\n\n opts.envState.resolveCache.set(cacheKey, canonical)\n return canonical\n}\n\nfunction getModuleResource(module: RspackModule): string | undefined {\n const candidate = module as RspackModule & {\n nameForCondition?: () => string | undefined\n resourceResolveData?: { resource?: string }\n resource?: string\n userRequest?: string\n request?: string\n }\n\n return (\n candidate.nameForCondition() ??\n candidate.resourceResolveData?.resource ??\n candidate.resource ??\n candidate.userRequest ??\n candidate.request\n )\n}\n\nfunction getModuleFile(module: RspackModule): string {\n return normalizeFilePath(getModuleResource(module) ?? module.identifier())\n}\n\nconst IMPORT_PROTECTION_PARSEABLE_EXTENSIONS = new Set([\n '.ts',\n '.tsx',\n '.mts',\n '.cts',\n '.js',\n '.jsx',\n '.mjs',\n '.cjs',\n])\n\nfunction isImportProtectionSourceFile(file: string | undefined): boolean {\n if (!file) {\n return false\n }\n\n const extension = extname(normalizeFilePath(file))\n return (\n extension.length > 0 &&\n IMPORT_PROTECTION_PARSEABLE_EXTENSIONS.has(extension)\n )\n}\n\nfunction isImportProtectionSourceModule(module: RspackModule): boolean {\n return isImportProtectionSourceFile(getModuleResource(module))\n}\n\nfunction addTransformResult(\n cache: Map<string, TransformResult>,\n key: string,\n result: TransformResult,\n): void {\n cache.set(normalizePath(key), result)\n cache.set(normalizeFilePath(key), result)\n}\n\nfunction hasTransformResult(\n cache: Map<string, TransformResult>,\n key: string,\n): boolean {\n return cache.has(normalizePath(key)) || cache.has(normalizeFilePath(key))\n}\n\nfunction deferFileViolation(\n envState: EnvRuntimeState,\n violation: DeferredFileViolation,\n): void {\n const key = `${violation.importer}:${violation.specifier}:${violation.resolved}:${String(violation.pattern)}`\n if (envState.deferredFileViolationKeys.has(key)) {\n return\n }\n\n envState.deferredFileViolationKeys.add(key)\n envState.deferredFileViolations.push(violation)\n}\n\nfunction hasOriginalUnsafeUsage(\n result: TransformResult | undefined,\n source: string,\n envType: 'client' | 'server',\n): boolean {\n if (!result) {\n return false\n }\n\n const originalResult = getOrCreateOriginalTransformResult(result)\n if (!originalResult) {\n return false\n }\n\n return !!findOriginalUnsafeUsagePosFromResult(originalResult, source, envType)\n}\n\nasync function buildTransformResultProvider(opts: {\n modules: Array<RspackModule>\n root: string\n loadOriginalCode: OriginalCodeLoader\n preloaded?: Map<string, TransformResult>\n}): Promise<TransformResultProvider> {\n const cache = new Map<string, TransformResult>()\n\n if (opts.preloaded) {\n for (const [key, result] of opts.preloaded) {\n cache.set(key, result)\n }\n }\n\n for (const module of opts.modules) {\n const source = module.originalSource()\n if (!source) continue\n\n const sourceAndMap = source.sourceAndMap()\n const code = String(sourceAndMap.source)\n const map = normalizeSourceMap(sourceAndMap.map as SourceMapLike | null)\n const file = getModuleFile(module)\n const resource = getModuleResource(module)\n\n const originalCode = map?.sourcesContent\n ? (pickOriginalCodeFromSourcesContent(map, resource ?? file, opts.root) ??\n (resource ? await opts.loadOriginalCode(resource) : undefined))\n : resource\n ? await opts.loadOriginalCode(resource)\n : undefined\n\n const result: TransformResult = {\n code,\n map,\n originalCode,\n lineIndex: buildLineIndex(code),\n }\n\n if (!hasTransformResult(cache, file)) {\n addTransformResult(cache, file, result)\n }\n\n if (resource && !hasTransformResult(cache, resource)) {\n addTransformResult(cache, resource, result)\n }\n }\n\n return {\n getTransformResult(id: string) {\n return cache.get(normalizePath(id)) ?? cache.get(normalizeFilePath(id))\n },\n }\n}\n\nfunction getConnectionRequest(dependency: unknown): string | undefined {\n const candidate = dependency as { request?: unknown }\n return typeof candidate.request === 'string' ? candidate.request : undefined\n}\n\nfunction addEntryModulesToGraph(opts: {\n compilation: RspackCompilation\n graph: ImportGraph\n}): void {\n for (const entry of opts.compilation.entries.values()) {\n for (const dependency of entry.dependencies) {\n const connection = opts.compilation.moduleGraph.getConnection(dependency)\n const module = connection?.module\n if (!module) continue\n opts.graph.addEntry(getModuleFile(module))\n }\n }\n}\n\nfunction buildCompilationGraph(opts: {\n compilation: RspackCompilation\n modules: Array<RspackModule>\n}): { graph: ImportGraph; edges: Array<CompilationEdge> } {\n const graph = new ImportGraph()\n const edges: Array<CompilationEdge> = []\n\n addEntryModulesToGraph({\n compilation: opts.compilation,\n graph,\n })\n\n for (const module of opts.modules) {\n const importer = getModuleFile(module)\n const connections =\n opts.compilation.moduleGraph.getOutgoingConnectionsInOrder(module)\n\n for (const connection of connections) {\n if (!connection.module) continue\n if (!isActiveConnection(connection)) continue\n\n const resolved = getModuleFile(connection.module)\n const specifier = getConnectionRequest(connection.dependency)\n graph.addEdge(resolved, importer, specifier)\n edges.push({ importer, specifier, resolved })\n }\n }\n\n return { graph, edges }\n}\n\nfunction isActiveConnection(connection: RspackModuleGraphConnection): boolean {\n if (typeof connection.getActiveState !== 'function') {\n return true\n }\n\n return connection.getActiveState(undefined) === true\n}\n\nfunction findImportLocationInOriginalCode(\n provider: TransformResultProvider,\n importer: string,\n source: string,\n): Loc | undefined {\n const result = provider.getTransformResult(importer)\n if (!result) {\n return undefined\n }\n\n const originalResult = getOrCreateOriginalTransformResult(result)\n if (!originalResult) {\n return undefined\n }\n\n const index = importSpecifierLocationIndex.find(originalResult, source)\n if (index === -1) {\n return undefined\n }\n\n const lineIndex =\n originalResult.lineIndex ??\n (originalResult.lineIndex = buildLineIndex(originalResult.code))\n const loc = indexToLineColumn(lineIndex, index)\n\n return {\n file: normalizeFilePath(importer),\n line: loc.line,\n column: loc.column,\n }\n}\n\nasync function resolveImporterLocation(opts: {\n provider: TransformResultProvider\n importLocCache: ImportLocCache\n importer: string\n sourceCandidates: Iterable<string>\n preferOriginalCode?: boolean\n envType?: 'client' | 'server'\n}): Promise<Loc | undefined> {\n if (opts.preferOriginalCode) {\n for (const candidate of opts.sourceCandidates) {\n const loc =\n findOriginalUsageLocation(\n opts.provider,\n opts.importer,\n candidate,\n opts.envType,\n ) ??\n findImportLocationInOriginalCode(\n opts.provider,\n opts.importer,\n candidate,\n )\n if (loc) {\n return loc\n }\n }\n }\n\n for (const candidate of opts.sourceCandidates) {\n const loc =\n (await findPostCompileUsageLocation(\n opts.provider,\n opts.importer,\n candidate,\n )) ||\n (await findImportStatementLocationFromTransformed(\n opts.provider,\n opts.importer,\n candidate,\n opts.importLocCache,\n importSpecifierLocationIndex.find,\n ))\n\n if (loc) {\n return loc\n }\n }\n\n if (!opts.preferOriginalCode) {\n for (const candidate of opts.sourceCandidates) {\n const loc = findImportLocationInOriginalCode(\n opts.provider,\n opts.importer,\n candidate,\n )\n if (loc) {\n return loc\n }\n }\n }\n\n return undefined\n}\n\nasync function rebuildAndAnnotateTrace(opts: {\n provider: TransformResultProvider\n graph: ImportGraph\n importLocCache: ImportLocCache\n importer: string\n specifier: string\n importerLoc?: Loc\n maxTraceDepth: number\n}): Promise<Array<TraceStep>> {\n const trace = buildTrace(opts.graph, opts.importer, opts.maxTraceDepth)\n\n await addTraceImportLocations(\n opts.provider,\n trace,\n opts.importLocCache,\n importSpecifierLocationIndex.find,\n )\n\n if (trace.length > 0) {\n const last = trace[trace.length - 1]!\n if (!last.specifier) {\n last.specifier = opts.specifier\n }\n if (opts.importerLoc && last.line == null) {\n last.line = opts.importerLoc.line\n last.column = opts.importerLoc.column\n }\n }\n\n return trace\n}\n\nasync function buildViolationInfo(opts: {\n config: PluginConfig\n provider: TransformResultProvider\n graph: ImportGraph\n importLocCache: ImportLocCache\n envName: string\n envType: 'client' | 'server'\n importer: string\n source: string\n resolved?: string\n type: 'specifier' | 'file' | 'marker'\n pattern?: string | RegExp\n preferOriginalCode?: boolean\n}): Promise<ViolationInfo> {\n const importerLoc = await resolveImporterLocation({\n provider: opts.provider,\n importLocCache: opts.importLocCache,\n importer: opts.importer,\n sourceCandidates: buildSourceCandidates(\n opts.source,\n opts.resolved,\n opts.config.root,\n ),\n preferOriginalCode: opts.preferOriginalCode,\n envType: opts.envType,\n })\n\n const trace = await rebuildAndAnnotateTrace({\n provider: opts.provider,\n graph: opts.graph,\n importLocCache: opts.importLocCache,\n importer: opts.importer,\n specifier: opts.source,\n importerLoc,\n maxTraceDepth: opts.config.maxTraceDepth,\n })\n\n const snippet = importerLoc\n ? buildCodeSnippet(opts.provider, opts.importer, importerLoc)\n : undefined\n\n return {\n env: opts.envName,\n envType: opts.envType,\n behavior: opts.config.effectiveBehavior,\n type: opts.type,\n pattern: opts.pattern,\n specifier: opts.source,\n importer: opts.importer,\n ...(opts.resolved ? { resolved: opts.resolved } : {}),\n ...(importerLoc ? { importerLoc } : {}),\n trace,\n snippet,\n }\n}\n\nasync function getMarkerKindForFile(opts: {\n config: PluginConfig\n provider: TransformResultProvider\n loadOriginalCode: OriginalCodeLoader\n markerKindCache: Map<string, Promise<'server' | 'client' | undefined>>\n file: string\n}): Promise<'server' | 'client' | undefined> {\n if (!isImportProtectionSourceFile(opts.file)) {\n return undefined\n }\n\n let cached = opts.markerKindCache.get(opts.file)\n if (!cached) {\n cached = (async () => {\n const code =\n opts.provider.getTransformResult(opts.file)?.originalCode ??\n (await opts.loadOriginalCode(opts.file))\n\n if (!code) {\n return undefined\n }\n\n const imports = getImportSources(code)\n const hasServerOnly = imports.some((source) =>\n opts.config.markerSpecifiers.serverOnly.has(source),\n )\n const hasClientOnly = imports.some((source) =>\n opts.config.markerSpecifiers.clientOnly.has(source),\n )\n\n if (hasServerOnly && !hasClientOnly) {\n return 'server'\n }\n\n if (hasClientOnly && !hasServerOnly) {\n return 'client'\n }\n\n return undefined\n })()\n opts.markerKindCache.set(opts.file, cached)\n }\n\n return cached\n}\n\nasync function reportViolation(opts: {\n config: PluginConfig\n envState: EnvRuntimeState\n compilation: RspackCompilation\n rspack: RspackNamespace\n info: ViolationInfo\n}): Promise<void> {\n const key = dedupeKey(opts.info)\n if (\n opts.config.logMode !== 'always' &&\n opts.envState.seenViolations.has(key)\n ) {\n return\n }\n\n opts.envState.seenViolations.add(key)\n\n if (opts.config.onViolation) {\n const result = await opts.config.onViolation(opts.info)\n if (result === false) {\n return\n }\n }\n\n const message = formatViolation(opts.info, opts.config.root)\n const error = new opts.rspack.WebpackError(message)\n\n if (opts.config.effectiveBehavior === 'error') {\n opts.compilation.errors.push(error)\n } else {\n opts.compilation.warnings.push(error)\n }\n}\n\nexport function registerImportProtection(\n api: RsbuildPluginAPI,\n opts: {\n getConfig: GetConfigFn\n framework: CompileStartFrameworkOptions\n environments: Array<{ name: string; type: 'client' | 'server' }>\n },\n): void {\n const extensionlessResolver = new ExtensionlessAbsoluteIdResolver()\n const envStates = new Map<string, EnvRuntimeState>()\n const fileReadCache = new Map<string, Promise<string | undefined>>()\n\n const config: PluginConfig = {\n enabled: true,\n root: '',\n command: api.context.action === 'dev' ? 'serve' : 'build',\n srcDirectory: '',\n framework: opts.framework,\n effectiveBehavior: 'error',\n mockAccess: 'error',\n logMode: 'once',\n maxTraceDepth: 20,\n compiledRules: {\n client: {\n specifiers: [],\n files: [],\n excludeFiles: [],\n },\n server: {\n specifiers: [],\n files: [],\n excludeFiles: [],\n },\n },\n includeMatchers: [],\n excludeMatchers: [],\n ignoreImporterMatchers: [],\n markerSpecifiers: {\n serverOnly: new Set(),\n clientOnly: new Set(),\n },\n envTypeMap: new Map(opts.environments.map((env) => [env.name, env.type])),\n onViolation: undefined,\n }\n\n const shared: SharedState = {\n root: '',\n virtualModules: new Map(),\n vmPlugins: {},\n readyVmPlugins: {},\n inputFileSystems: {},\n pendingWrites: new Map(),\n }\n\n function applyUserConfig(): void {\n const { startConfig, resolvedStartConfig } = opts.getConfig()\n\n config.root = resolvedStartConfig.root\n config.srcDirectory = resolvedStartConfig.srcDirectory\n shared.root = resolvedStartConfig.root\n\n const userOpts: ImportProtectionOptions | undefined =\n startConfig.importProtection\n\n if (userOpts?.enabled === false) {\n config.enabled = false\n return\n }\n\n config.enabled = true\n\n const behavior = userOpts?.behavior\n if (typeof behavior === 'string') {\n config.effectiveBehavior = behavior\n } else {\n config.effectiveBehavior =\n config.command === 'serve'\n ? (behavior?.dev ?? 'mock')\n : (behavior?.build ?? 'error')\n }\n\n config.logMode = userOpts?.log ?? 'once'\n config.mockAccess = userOpts?.mockAccess ?? 'error'\n config.maxTraceDepth = userOpts?.maxTraceDepth ?? 20\n config.onViolation = userOpts?.onViolation\n ? (info) => userOpts.onViolation?.(info)\n : undefined\n\n const defaults = getDefaultImportProtectionRules()\n const pick = <T>(user: Array<T> | undefined, fallback: Array<T>) =>\n user ? [...user] : [...fallback]\n\n const clientSpecifiers = dedupePatterns([\n ...defaults.client.specifiers,\n ...(userOpts?.client?.specifiers ?? []),\n ])\n\n config.compiledRules.client = {\n specifiers: compileMatchers(clientSpecifiers),\n files: compileMatchers(\n pick(userOpts?.client?.files, defaults.client.files),\n ),\n excludeFiles: compileMatchers(\n pick(userOpts?.client?.excludeFiles, defaults.client.excludeFiles),\n ),\n }\n\n config.compiledRules.server = {\n specifiers: compileMatchers(\n dedupePatterns(\n pick(userOpts?.server?.specifiers, defaults.server.specifiers),\n ),\n ),\n files: compileMatchers(\n pick(userOpts?.server?.files, defaults.server.files),\n ),\n excludeFiles: compileMatchers(\n pick(userOpts?.server?.excludeFiles, defaults.server.excludeFiles),\n ),\n }\n\n config.includeMatchers = compileMatchers(userOpts?.include ?? [])\n config.excludeMatchers = compileMatchers(userOpts?.exclude ?? [])\n config.ignoreImporterMatchers = compileMatchers(\n userOpts?.ignoreImporters ?? [],\n )\n\n const markers = getMarkerSpecifiers()\n config.markerSpecifiers = {\n serverOnly: new Set(markers.serverOnly),\n clientOnly: new Set(markers.clientOnly),\n }\n }\n\n api.onBeforeBuild(() => {\n applyUserConfig()\n clearNormalizeFilePathCache()\n extensionlessResolver.clear()\n fileReadCache.clear()\n envStates.clear()\n })\n\n api.onBeforeDevCompile(() => {\n applyUserConfig()\n clearNormalizeFilePathCache()\n extensionlessResolver.clear()\n fileReadCache.clear()\n\n for (const envState of envStates.values()) {\n envState.resolveCache.clear()\n envState.buildTransformResults.clear()\n envState.deferredFileViolations.length = 0\n envState.deferredFileViolationKeys.clear()\n }\n })\n\n api.modifyRspackConfig((rspackConfig, utils) => {\n applyUserConfig()\n\n const envName = utils.environment.name\n const VMP = utils.rspack.experiments.VirtualModulesPlugin\n const vmPlugin = new VMP({})\n\n shared.vmPlugins[envName] = vmPlugin\n shared.readyVmPlugins[envName] = false\n\n rspackConfig.plugins.push(vmPlugin)\n rspackConfig.plugins.push({\n apply(compiler: Rspack.Compiler) {\n shared.inputFileSystems[envName] = compiler.inputFileSystem\n compiler.hooks.thisCompilation.tap(\n 'TanStackStartImportProtectionVirtualModulesReady',\n () => {\n shared.readyVmPlugins[envName] = true\n flushPendingWrites(shared, envName)\n },\n )\n },\n })\n })\n\n for (const environment of opts.environments) {\n api.transform(\n {\n test: /\\.[cm]?[tj]sx?$/,\n environments: [environment.name],\n order: 'post',\n },\n async (ctx) => {\n if (!config.enabled) {\n return ctx.code\n }\n\n const envName = environment.name\n const envType = getImportProtectionEnvType(config, envName)\n const envState = getOrCreateEnvState(envStates, envName)\n const id = ctx.resource\n const file = normalizeFilePath(ctx.resourcePath)\n\n if (!shouldCheckImportProtectionImporter(config, file)) {\n return ctx.code\n }\n\n const matchers = getRulesForEnvironment(config, envName)\n const relativeFile = getImportProtectionRelativePath(config.root, file)\n const importSources = getImportSources(ctx.code)\n const transformedImportSources = new Set(importSources)\n const transformInputFileSystem = shared.inputFileSystems[envName]\n const loadOriginalCodeForTransform: OriginalCodeLoader =\n transformInputFileSystem\n ? (target) =>\n loadOriginalCodeFromInputFileSystem(\n transformInputFileSystem,\n target,\n )\n : () => Promise.resolve(undefined)\n const originalCode =\n config.command === 'build'\n ? await loadOriginalCode(\n fileReadCache,\n file,\n loadOriginalCodeForTransform,\n )\n : undefined\n const buildImportSources = originalCode\n ? getImportSources(originalCode)\n : []\n const buildTransformResult: TransformResult | undefined =\n config.command === 'build'\n ? {\n code: ctx.code,\n map: undefined,\n originalCode,\n lineIndex: buildLineIndex(ctx.code),\n }\n : undefined\n\n if (config.command === 'build') {\n const relativeBuildFile = getImportProtectionRelativePath(\n config.root,\n file,\n )\n addTransformResult(\n envState.buildTransformResults,\n file,\n buildTransformResult!,\n )\n addTransformResult(\n envState.buildTransformResults,\n relativeBuildFile,\n buildTransformResult!,\n )\n if (id !== file) {\n addTransformResult(\n envState.buildTransformResults,\n id,\n buildTransformResult!,\n )\n }\n }\n\n const hasServerOnlyMarker = importSources.some((source) =>\n config.markerSpecifiers.serverOnly.has(source),\n )\n const hasClientOnlyMarker = importSources.some((source) =>\n config.markerSpecifiers.clientOnly.has(source),\n )\n\n if (hasServerOnlyMarker && hasClientOnlyMarker) {\n throw new Error(\n `[import-protection] File \"${relativeFile}\" has both server-only and client-only markers. This is not allowed.`,\n )\n }\n\n const markerKind = hasServerOnlyMarker\n ? ('server' as const)\n : hasClientOnlyMarker\n ? ('client' as const)\n : undefined\n\n const fileMatch = checkFileDenial(relativeFile, matchers)\n const markerViolation =\n (envType === 'client' && markerKind === 'server') ||\n (envType === 'server' && markerKind === 'client')\n\n if (fileMatch || markerViolation) {\n let exportNames: Array<string> = []\n\n try {\n exportNames = getNamedExports(ctx.code)\n } catch {\n exportNames = []\n }\n\n if (config.command === 'build') {\n return generateSelfContainedMockModule(exportNames)\n }\n\n const runtimeId = ensureRuntimeMockModule({\n shared,\n envName,\n mode: config.mockAccess,\n env: envName,\n importer: file,\n specifier: relativeFile,\n })\n\n return generateDevSelfDenialModule(exportNames, runtimeId)\n }\n\n const deniedSpecifierReplacements = new Map<string, string>()\n const exportsBySource = (() => {\n try {\n return getMockExportNamesBySource(ctx.code)\n } catch {\n return new Map<string, Array<string>>()\n }\n })()\n\n for (const source of importSources) {\n const specifierMatch = matchesAny(source, matchers.specifiers)\n if (!specifierMatch && config.command === 'build') {\n const resolved = await resolveAgainstImporter({\n envState,\n config,\n ctx,\n importerId: id,\n source,\n extensionlessResolver,\n })\n\n if (resolved) {\n const relativeResolved = getImportProtectionRelativePath(\n config.root,\n resolved,\n )\n const buildFileMatch = checkFileDenial(relativeResolved, matchers)\n if (\n buildFileMatch &&\n hasOriginalUnsafeUsage(buildTransformResult, source, envType)\n ) {\n deferFileViolation(envState, {\n importer: file,\n specifier: source,\n resolved,\n relativeResolved,\n pattern: buildFileMatch.pattern,\n useOriginalLocation: true,\n })\n }\n }\n\n continue\n }\n\n if (!specifierMatch) {\n continue\n }\n\n const resolved = await resolveAgainstImporter({\n envState,\n config,\n ctx,\n importerId: id,\n source,\n extensionlessResolver,\n })\n\n const runtimeId =\n config.command === 'build'\n ? ensureSilentMockModule(shared, envName)\n : ensureRuntimeMockModule({\n shared,\n envName,\n mode: config.mockAccess,\n env: envName,\n importer: file,\n specifier: source,\n })\n\n const replacement = ensureMockEdgeModule({\n shared,\n envName,\n payload: {\n exports: exportsBySource.get(source) ?? [],\n runtimeId,\n violation: {\n env: envName,\n envType,\n importer: file,\n specifier: source,\n ...(resolved ? { resolved } : {}),\n patternText: serializePattern(specifierMatch.pattern),\n },\n },\n })\n\n deniedSpecifierReplacements.set(source, replacement)\n }\n\n if (config.command === 'build') {\n for (const source of buildImportSources) {\n if (transformedImportSources.has(source)) {\n continue\n }\n\n if (matchesAny(source, matchers.specifiers)) {\n continue\n }\n\n const resolved = await resolveAgainstImporter({\n envState,\n config,\n ctx,\n importerId: id,\n source,\n extensionlessResolver,\n })\n\n if (!resolved) {\n continue\n }\n\n const relativeResolved = getImportProtectionRelativePath(\n config.root,\n resolved,\n )\n const buildFileMatch = checkFileDenial(relativeResolved, matchers)\n if (\n !buildFileMatch ||\n !hasOriginalUnsafeUsage(buildTransformResult, source, envType)\n ) {\n continue\n }\n\n deferFileViolation(envState, {\n importer: file,\n specifier: source,\n resolved,\n relativeResolved,\n pattern: buildFileMatch.pattern,\n useOriginalLocation: true,\n })\n }\n }\n\n if (deniedSpecifierReplacements.size === 0) {\n return ctx.code\n }\n\n const rewritten = rewriteDeniedImports(\n ctx.code,\n id,\n new Set(deniedSpecifierReplacements.keys()),\n (source) => deniedSpecifierReplacements.get(source) ?? source,\n )\n\n if (!rewritten) {\n return ctx.code\n }\n\n return {\n code: rewritten.code,\n map: normalizeSourceMap(rewritten.map) ?? null,\n }\n },\n )\n }\n\n api.processAssets(\n {\n stage: 'report',\n environments: opts.environments.map((environment) => environment.name),\n },\n async (context: ProcessAssetsContext) => {\n if (!config.enabled) {\n return\n }\n\n const envName = context.environment.name\n const envType = getImportProtectionEnvType(config, envName)\n const envState = getOrCreateEnvState(envStates, envName)\n const matchers = getRulesForEnvironment(config, envName)\n const processFileReadCache = new Map<\n string,\n Promise<string | undefined>\n >()\n const loadOriginalCodeFromCompilation: OriginalCodeLoader = (file) =>\n loadOriginalCode(\n processFileReadCache,\n file,\n context.compilation.inputFileSystem\n ? (target) =>\n loadOriginalCodeFromInputFileSystem(\n context.compilation.inputFileSystem!,\n target,\n )\n : () => Promise.resolve(undefined),\n )\n const allModules = Array.from(context.compilation.modules)\n const relevantModules = allModules.filter(isImportProtectionSourceModule)\n\n const provider = await buildTransformResultProvider({\n modules: relevantModules,\n root: config.root,\n loadOriginalCode: loadOriginalCodeFromCompilation,\n preloaded: envState.buildTransformResults,\n })\n const importLocCache = new ImportLocCache()\n const markerKindCache = new Map<\n string,\n Promise<'server' | 'client' | undefined>\n >()\n const { graph, edges } = buildCompilationGraph({\n compilation: context.compilation,\n modules: relevantModules,\n })\n const liveFileEdgeKeys = new Set(\n edges\n .filter((edge) => !!edge.specifier)\n .map(\n (edge) =>\n `${normalizeFilePath(edge.importer)}::${edge.specifier!}::${normalizeFilePath(edge.resolved)}`,\n ),\n )\n const survivingModules = new Set<string>()\n for (const module of relevantModules) {\n for (const candidate of buildResolutionCandidates(\n getModuleFile(module),\n )) {\n survivingModules.add(candidate)\n }\n }\n\n const didModuleSurvive = (id: string): boolean =>\n buildResolutionCandidates(id).some((candidate) =>\n survivingModules.has(candidate),\n )\n\n for (const module of relevantModules) {\n const payload = getMockEdgePayloadFromFile(getModuleFile(module))\n if (!payload) {\n continue\n }\n if (\n !shouldCheckImportProtectionImporter(\n config,\n payload.violation.importer,\n )\n ) {\n continue\n }\n\n const info = await buildViolationInfo({\n config,\n provider,\n graph,\n importLocCache,\n envName,\n envType,\n importer: payload.violation.importer,\n source: payload.violation.specifier,\n resolved: payload.violation.resolved,\n type: 'specifier',\n pattern: payload.violation.patternText,\n preferOriginalCode: true,\n })\n\n await reportViolation({\n config,\n envState,\n compilation: context.compilation,\n rspack: context.compiler.rspack,\n info,\n })\n }\n\n for (const edge of edges) {\n if (!edge.specifier) {\n continue\n }\n if (!shouldCheckImportProtectionImporter(config, edge.importer)) {\n continue\n }\n\n const relativeResolved = getImportProtectionRelativePath(\n config.root,\n edge.resolved,\n )\n if (isFileExcluded(relativeResolved, matchers)) {\n continue\n }\n const fileMatch = checkFileDenial(relativeResolved, matchers)\n if (fileMatch) {\n const info = await buildViolationInfo({\n config,\n provider,\n graph,\n importLocCache,\n envName,\n envType,\n importer: edge.importer,\n source: edge.specifier,\n resolved: edge.resolved,\n type: 'file',\n pattern: fileMatch.pattern,\n })\n\n await reportViolation({\n config,\n envState,\n compilation: context.compilation,\n rspack: context.compiler.rspack,\n info,\n })\n continue\n }\n\n const markerKind = await getMarkerKindForFile({\n config,\n provider,\n loadOriginalCode: loadOriginalCodeFromCompilation,\n markerKindCache,\n file: edge.resolved,\n })\n const violatesMarker =\n (envType === 'client' && markerKind === 'server') ||\n (envType === 'server' && markerKind === 'client')\n\n if (!violatesMarker) {\n continue\n }\n\n const info = await buildViolationInfo({\n config,\n provider,\n graph,\n importLocCache,\n envName,\n envType,\n importer: edge.importer,\n source: edge.specifier,\n resolved: edge.resolved,\n type: 'marker',\n })\n\n await reportViolation({\n config,\n envState,\n compilation: context.compilation,\n rspack: context.compiler.rspack,\n info,\n })\n }\n\n for (const violation of envState.deferredFileViolations) {\n const liveEdgeKey = `${normalizeFilePath(violation.importer)}::${violation.specifier}::${normalizeFilePath(violation.resolved)}`\n if (liveFileEdgeKeys.has(liveEdgeKey)) {\n continue\n }\n\n if (!didModuleSurvive(violation.resolved)) {\n continue\n }\n\n if (!didModuleSurvive(violation.importer)) {\n continue\n }\n\n const info = await buildViolationInfo({\n config,\n provider,\n graph,\n importLocCache,\n envName,\n envType,\n importer: violation.importer,\n source: violation.specifier,\n resolved: violation.resolved,\n type: 'file',\n pattern: violation.pattern,\n preferOriginalCode: violation.useOriginalLocation,\n })\n\n await reportViolation({\n config,\n envState,\n compilation: context.compilation,\n rspack: context.compiler.rspack,\n info,\n })\n }\n },\n )\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"import-protection.js","names":[],"sources":["../../../src/rsbuild/import-protection.ts"],"sourcesContent":["import { extname, resolve as resolvePath } from 'node:path'\n\nimport {\n getDefaultImportProtectionRules,\n getMarkerSpecifiers,\n} from '../import-protection/defaults'\nimport { normalizePath } from '../utils'\nimport { ExtensionlessAbsoluteIdResolver } from '../import-protection/extensionlessAbsoluteIdResolver'\nimport { compileMatchers, matchesAny } from '../import-protection/matchers'\nimport {\n getImportProtectionEnvType,\n getImportProtectionRelativePath,\n getImportProtectionRulesForEnvironment,\n shouldCheckImportProtectionImporter,\n} from '../import-protection/adapterUtils'\nimport {\n findOriginalUnsafeUsagePosFromResult,\n getImportSources,\n getMockExportNamesBySource,\n getNamedExports,\n} from '../import-protection/analysis'\nimport { rewriteDeniedImports } from '../import-protection/rewrite'\nimport {\n ImportLocCache,\n addTraceImportLocations,\n buildCodeSnippet,\n buildLineIndex,\n createImportSpecifierLocationIndex,\n findImportStatementLocationFromTransformed,\n findOriginalUsageLocation,\n findPostCompileUsageLocation,\n getOrCreateOriginalTransformResult,\n indexToLineColumn,\n normalizeSourceMap,\n pickOriginalCodeFromSourcesContent,\n} from '../import-protection/sourceLocation'\nimport {\n ImportGraph,\n buildTrace,\n formatViolation,\n} from '../import-protection/trace'\nimport {\n generateDevSelfDenialModule,\n generateSelfContainedMockModule,\n loadMockEdgeModule,\n loadMockRuntimeModule,\n loadSilentMockModule,\n} from '../import-protection/virtualModules'\nimport {\n buildResolutionCandidates,\n buildSourceCandidates,\n canonicalizeResolvedId,\n checkFileDenial,\n clearNormalizeFilePathCache,\n dedupePatterns,\n dedupeViolationKey,\n isFileExcluded,\n normalizeFilePath,\n} from '../import-protection/utils'\n\nimport type {\n ImportProtectionBehavior,\n ImportProtectionOptions,\n} from '../schema'\nimport type { CompiledMatcher } from '../import-protection/matchers'\nimport type {\n SourceMapLike,\n TransformResult,\n TransformResultProvider,\n} from '../import-protection/sourceLocation'\nimport type { Loc, TraceStep, ViolationInfo } from '../import-protection/trace'\nimport type { CompileStartFrameworkOptions, GetConfigFn } from '../types'\nimport type {\n RsbuildPluginAPI,\n Rspack,\n rspack as rspackNamespaceType,\n} from '@rsbuild/core'\n\ntype RspackNamespace = typeof rspackNamespaceType\ntype RspackVirtualModulesPlugin = InstanceType<\n RspackNamespace['experiments']['VirtualModulesPlugin']\n>\ntype ProcessAssetsContext = Parameters<\n Parameters<RsbuildPluginAPI['processAssets']>[1]\n>[0]\ntype TransformContext = Parameters<\n Parameters<RsbuildPluginAPI['transform']>[1]\n>[0]\ntype RspackCompilation = Rspack.Compilation\ntype RspackModule = Rspack.Module\ntype RspackModuleGraphConnection = {\n module?: RspackModule | null\n dependency?: unknown\n getActiveState?: (runtime: string | Array<string> | undefined) => unknown\n}\ntype OriginalCodeLoader = (file: string) => Promise<string | undefined>\nconst importSpecifierLocationIndex = createImportSpecifierLocationIndex()\n\ninterface EnvRules {\n specifiers: Array<CompiledMatcher>\n files: Array<CompiledMatcher>\n excludeFiles: Array<CompiledMatcher>\n}\n\ninterface PluginConfig {\n enabled: boolean\n root: string\n command: 'build' | 'serve'\n srcDirectory: string\n framework: CompileStartFrameworkOptions\n effectiveBehavior: ImportProtectionBehavior\n mockAccess: 'error' | 'warn' | 'off'\n logMode: 'once' | 'always'\n maxTraceDepth: number\n compiledRules: {\n client: EnvRules\n server: EnvRules\n }\n includeMatchers: Array<CompiledMatcher>\n excludeMatchers: Array<CompiledMatcher>\n ignoreImporterMatchers: Array<CompiledMatcher>\n markerSpecifiers: {\n serverOnly: Set<string>\n clientOnly: Set<string>\n }\n envTypeMap: Map<string, 'client' | 'server'>\n onViolation?: (\n info: ViolationInfo,\n ) => boolean | void | Promise<boolean | void>\n}\n\ninterface EnvRuntimeState {\n resolveCache: Map<string, string | null>\n seenViolations: Set<string>\n buildTransformResults: Map<string, TransformResult>\n deferredFileViolations: Array<DeferredFileViolation>\n deferredFileViolationKeys: Set<string>\n}\n\ninterface DeferredFileViolation {\n importer: string\n specifier: string\n resolved: string\n relativeResolved: string\n pattern: string | RegExp\n useOriginalLocation: boolean\n}\n\ninterface SharedState {\n root: string\n virtualModules: Map<string, string>\n vmPlugins: Record<string, RspackVirtualModulesPlugin>\n readyVmPlugins: Record<string, boolean>\n inputFileSystems: Record<string, Rspack.Compiler['inputFileSystem']>\n pendingWrites: Map<string, Map<string, string>>\n}\n\ninterface CompilationEdge {\n importer: string\n specifier?: string\n resolved: string\n}\n\ninterface MockEdgePayload {\n exports: Array<string>\n runtimeId: string\n violation: {\n env: string\n envType: 'client' | 'server'\n importer: string\n specifier: string\n resolved?: string\n patternText: string\n }\n}\n\nconst IMPORT_PROTECTION_VIRTUAL_DIR = 'node_modules/.virtual/import-protection'\nconst MOCK_EDGE_FILE_PREFIX = 'mock-edge-'\nconst MOCK_RUNTIME_FILE_PREFIX = 'mock-runtime-'\nconst MOCK_SILENT_FILE = 'mock-silent.mjs'\n\nfunction toBase64Url(input: unknown): string {\n return Buffer.from(JSON.stringify(input), 'utf8').toString('base64url')\n}\n\nfunction fromBase64Url<T>(input: string): T {\n return JSON.parse(Buffer.from(input, 'base64url').toString('utf8')) as T\n}\n\nfunction getRulesForEnvironment(\n config: PluginConfig,\n envName: string,\n): EnvRules {\n return getImportProtectionRulesForEnvironment(config, envName) as EnvRules\n}\n\nfunction serializePattern(pattern: string | RegExp): string {\n return typeof pattern === 'string' ? pattern : pattern.toString()\n}\n\nfunction dedupeKey(info: ViolationInfo): string {\n return dedupeViolationKey(info)\n}\n\nfunction getOrCreateEnvState(\n envStates: Map<string, EnvRuntimeState>,\n envName: string,\n): EnvRuntimeState {\n let env = envStates.get(envName)\n\n if (!env) {\n env = {\n resolveCache: new Map(),\n seenViolations: new Set(),\n buildTransformResults: new Map(),\n deferredFileViolations: [],\n deferredFileViolationKeys: new Set(),\n }\n envStates.set(envName, env)\n }\n\n return env\n}\n\nfunction getVirtualModulePath(\n root: string,\n envName: string,\n filename: string,\n): string {\n return normalizePath(\n resolvePath(root, IMPORT_PROTECTION_VIRTUAL_DIR, envName, filename),\n )\n}\n\nfunction queuePendingWrite(\n shared: SharedState,\n envName: string,\n filePath: string,\n code: string,\n): void {\n let writes = shared.pendingWrites.get(envName)\n if (!writes) {\n writes = new Map()\n shared.pendingWrites.set(envName, writes)\n }\n\n writes.set(filePath, code)\n}\n\nfunction tryWriteVirtualModule(\n shared: SharedState,\n envName: string,\n filePath: string,\n code: string,\n): string {\n const current = shared.virtualModules.get(filePath)\n if (current === code) {\n return filePath\n }\n\n shared.virtualModules.set(filePath, code)\n\n const vmPlugin = shared.vmPlugins[envName]\n if (!vmPlugin || !shared.readyVmPlugins[envName]) {\n queuePendingWrite(shared, envName, filePath, code)\n return filePath\n }\n\n vmPlugin.writeModule(filePath, code)\n return filePath\n}\n\nfunction flushPendingWrites(shared: SharedState, envName: string): void {\n const writes = shared.pendingWrites.get(envName)\n if (!writes?.size || !shared.readyVmPlugins[envName]) {\n return\n }\n\n for (const [filePath, code] of writes) {\n shared.vmPlugins[envName]?.writeModule(filePath, code)\n writes.delete(filePath)\n }\n\n if (writes.size === 0) {\n shared.pendingWrites.delete(envName)\n }\n}\n\nfunction ensureSilentMockModule(shared: SharedState, envName: string): string {\n return tryWriteVirtualModule(\n shared,\n envName,\n getVirtualModulePath(shared.root, envName, MOCK_SILENT_FILE),\n loadSilentMockModule().code,\n )\n}\n\nfunction ensureRuntimeMockModule(opts: {\n shared: SharedState\n envName: string\n mode: 'error' | 'warn' | 'off'\n env: string\n importer: string\n specifier: string\n}): string {\n const encoded = toBase64Url({\n mode: opts.mode,\n env: opts.env,\n importer: opts.importer,\n specifier: opts.specifier,\n trace: [],\n })\n\n return tryWriteVirtualModule(\n opts.shared,\n opts.envName,\n getVirtualModulePath(\n opts.shared.root,\n opts.envName,\n `${MOCK_RUNTIME_FILE_PREFIX}${encoded}.mjs`,\n ),\n loadMockRuntimeModule(encoded).code,\n )\n}\n\nfunction ensureMockEdgeModule(opts: {\n shared: SharedState\n envName: string\n payload: MockEdgePayload\n}): string {\n const encoded = toBase64Url(opts.payload)\n\n return tryWriteVirtualModule(\n opts.shared,\n opts.envName,\n getVirtualModulePath(\n opts.shared.root,\n opts.envName,\n `${MOCK_EDGE_FILE_PREFIX}${encoded}.mjs`,\n ),\n loadMockEdgeModule(encoded).code,\n )\n}\n\nfunction getMockEdgePayloadFromFile(\n filePath: string,\n): MockEdgePayload | undefined {\n const match = /(?:^|[\\\\/])mock-edge-([^/\\\\]+)\\.mjs$/.exec(filePath)\n if (!match) {\n return undefined\n }\n\n try {\n return fromBase64Url<MockEdgePayload>(match[1]!)\n } catch {\n return undefined\n }\n}\n\nasync function loadOriginalCode(\n cache: Map<string, Promise<string | undefined>>,\n file: string,\n loader: OriginalCodeLoader,\n): Promise<string | undefined> {\n let result = cache.get(file)\n if (!result) {\n result = loader(file)\n cache.set(file, result)\n }\n\n return result\n}\n\nasync function loadOriginalCodeFromInputFileSystem(\n inputFileSystem: NonNullable<RspackCompilation['inputFileSystem']>,\n file: string,\n): Promise<string | undefined> {\n return new Promise((resolve) => {\n inputFileSystem.readFile(file, (error, data) => {\n if (error || data == null) {\n resolve(undefined)\n return\n }\n\n resolve(typeof data === 'string' ? data : data.toString('utf8'))\n })\n })\n}\n\nasync function resolveAgainstImporter(opts: {\n envState: EnvRuntimeState\n config: PluginConfig\n ctx: TransformContext\n importerId: string\n source: string\n extensionlessResolver: ExtensionlessAbsoluteIdResolver\n}): Promise<string | null> {\n const normalizedImporter = normalizeFilePath(opts.importerId)\n const cacheKey = `${normalizedImporter}:${opts.source}`\n\n if (opts.envState.resolveCache.has(cacheKey)) {\n return opts.envState.resolveCache.get(cacheKey) ?? null\n }\n\n const importerDir =\n opts.ctx.context ?? opts.importerId.replace(/[/\\\\][^/\\\\]*$/, '')\n\n const resolved = await new Promise<string | null>((resolve, reject) => {\n opts.ctx.resolve(importerDir, opts.source, (error, result) => {\n if (error) {\n reject(error)\n return\n }\n\n resolve(typeof result === 'string' ? result : null)\n })\n }).catch(() => null)\n\n if (!resolved) {\n opts.envState.resolveCache.set(cacheKey, null)\n return null\n }\n\n const canonical = canonicalizeResolvedId(\n resolved,\n opts.config.root,\n (value) => opts.extensionlessResolver.resolve(value),\n )\n\n opts.envState.resolveCache.set(cacheKey, canonical)\n return canonical\n}\n\nfunction getModuleResource(module: RspackModule): string | undefined {\n const candidate = module as RspackModule & {\n nameForCondition?: () => string | undefined\n resourceResolveData?: { resource?: string }\n resource?: string\n userRequest?: string\n request?: string\n }\n\n return (\n candidate.nameForCondition() ??\n candidate.resourceResolveData?.resource ??\n candidate.resource ??\n candidate.userRequest ??\n candidate.request\n )\n}\n\nfunction getModuleFile(module: RspackModule): string {\n return normalizeFilePath(getModuleResource(module) ?? module.identifier())\n}\n\nconst IMPORT_PROTECTION_PARSEABLE_EXTENSIONS = new Set([\n '.ts',\n '.tsx',\n '.mts',\n '.cts',\n '.js',\n '.jsx',\n '.mjs',\n '.cjs',\n])\n\nfunction isImportProtectionSourceFile(file: string | undefined): boolean {\n if (!file) {\n return false\n }\n\n const extension = extname(normalizeFilePath(file))\n return (\n extension.length > 0 &&\n IMPORT_PROTECTION_PARSEABLE_EXTENSIONS.has(extension)\n )\n}\n\nfunction isImportProtectionSourceModule(module: RspackModule): boolean {\n return isImportProtectionSourceFile(getModuleResource(module))\n}\n\nfunction addTransformResult(\n cache: Map<string, TransformResult>,\n key: string,\n result: TransformResult,\n): void {\n cache.set(normalizePath(key), result)\n cache.set(normalizeFilePath(key), result)\n}\n\nfunction hasTransformResult(\n cache: Map<string, TransformResult>,\n key: string,\n): boolean {\n return cache.has(normalizePath(key)) || cache.has(normalizeFilePath(key))\n}\n\nfunction deferFileViolation(\n envState: EnvRuntimeState,\n violation: DeferredFileViolation,\n): void {\n const key = `${violation.importer}:${violation.specifier}:${violation.resolved}:${String(violation.pattern)}`\n if (envState.deferredFileViolationKeys.has(key)) {\n return\n }\n\n envState.deferredFileViolationKeys.add(key)\n envState.deferredFileViolations.push(violation)\n}\n\nfunction hasOriginalUnsafeUsage(\n result: TransformResult | undefined,\n source: string,\n envType: 'client' | 'server',\n): boolean {\n if (!result) {\n return false\n }\n\n const originalResult = getOrCreateOriginalTransformResult(result)\n if (!originalResult) {\n return false\n }\n\n return !!findOriginalUnsafeUsagePosFromResult(originalResult, source, envType)\n}\n\nasync function buildTransformResultProvider(opts: {\n modules: Array<RspackModule>\n root: string\n loadOriginalCode: OriginalCodeLoader\n preloaded?: Map<string, TransformResult>\n}): Promise<TransformResultProvider> {\n const cache = new Map<string, TransformResult>()\n\n if (opts.preloaded) {\n for (const [key, result] of opts.preloaded) {\n cache.set(key, result)\n }\n }\n\n for (const module of opts.modules) {\n const source = module.originalSource()\n if (!source) continue\n\n const sourceAndMap = source.sourceAndMap()\n const code = String(sourceAndMap.source)\n const map = normalizeSourceMap(sourceAndMap.map as SourceMapLike | null)\n const file = getModuleFile(module)\n const resource = getModuleResource(module)\n\n const originalCode = map?.sourcesContent\n ? (pickOriginalCodeFromSourcesContent(map, resource ?? file, opts.root) ??\n (resource ? await opts.loadOriginalCode(resource) : undefined))\n : resource\n ? await opts.loadOriginalCode(resource)\n : undefined\n\n const result: TransformResult = {\n code,\n filename: resource ?? file,\n map,\n originalCode,\n lineIndex: buildLineIndex(code),\n }\n\n if (!hasTransformResult(cache, file)) {\n addTransformResult(cache, file, result)\n }\n\n if (resource && !hasTransformResult(cache, resource)) {\n addTransformResult(cache, resource, result)\n }\n }\n\n return {\n getTransformResult(id: string) {\n return cache.get(normalizePath(id)) ?? cache.get(normalizeFilePath(id))\n },\n }\n}\n\nfunction getConnectionRequest(dependency: unknown): string | undefined {\n const candidate = dependency as { request?: unknown }\n return typeof candidate.request === 'string' ? candidate.request : undefined\n}\n\nfunction addEntryModulesToGraph(opts: {\n compilation: RspackCompilation\n graph: ImportGraph\n}): void {\n for (const entry of opts.compilation.entries.values()) {\n for (const dependency of entry.dependencies) {\n const connection = opts.compilation.moduleGraph.getConnection(dependency)\n const module = connection?.module\n if (!module) continue\n opts.graph.addEntry(getModuleFile(module))\n }\n }\n}\n\nfunction buildCompilationGraph(opts: {\n compilation: RspackCompilation\n modules: Array<RspackModule>\n}): { graph: ImportGraph; edges: Array<CompilationEdge> } {\n const graph = new ImportGraph()\n const edges: Array<CompilationEdge> = []\n\n addEntryModulesToGraph({\n compilation: opts.compilation,\n graph,\n })\n\n for (const module of opts.modules) {\n const importer = getModuleFile(module)\n const connections =\n opts.compilation.moduleGraph.getOutgoingConnectionsInOrder(module)\n\n for (const connection of connections) {\n if (!connection.module) continue\n if (!isActiveConnection(connection)) continue\n\n const resolved = getModuleFile(connection.module)\n const specifier = getConnectionRequest(connection.dependency)\n graph.addEdge(resolved, importer, specifier)\n edges.push({ importer, specifier, resolved })\n }\n }\n\n return { graph, edges }\n}\n\nfunction isActiveConnection(connection: RspackModuleGraphConnection): boolean {\n if (typeof connection.getActiveState !== 'function') {\n return true\n }\n\n return connection.getActiveState(undefined) === true\n}\n\nfunction findImportLocationInOriginalCode(\n provider: TransformResultProvider,\n importer: string,\n source: string,\n): Loc | undefined {\n const result = provider.getTransformResult(importer)\n if (!result) {\n return undefined\n }\n\n const originalResult = getOrCreateOriginalTransformResult(result)\n if (!originalResult) {\n return undefined\n }\n\n const index = importSpecifierLocationIndex.find(originalResult, source)\n if (index === -1) {\n return undefined\n }\n\n const lineIndex =\n originalResult.lineIndex ??\n (originalResult.lineIndex = buildLineIndex(originalResult.code))\n const loc = indexToLineColumn(lineIndex, index)\n\n return {\n file: normalizeFilePath(importer),\n line: loc.line,\n column: loc.column,\n }\n}\n\nasync function resolveImporterLocation(opts: {\n provider: TransformResultProvider\n importLocCache: ImportLocCache\n importer: string\n sourceCandidates: Iterable<string>\n preferOriginalCode?: boolean\n envType?: 'client' | 'server'\n}): Promise<Loc | undefined> {\n if (opts.preferOriginalCode) {\n for (const candidate of opts.sourceCandidates) {\n const loc =\n findOriginalUsageLocation(\n opts.provider,\n opts.importer,\n candidate,\n opts.envType,\n ) ??\n findImportLocationInOriginalCode(\n opts.provider,\n opts.importer,\n candidate,\n )\n if (loc) {\n return loc\n }\n }\n }\n\n for (const candidate of opts.sourceCandidates) {\n const loc =\n (await findPostCompileUsageLocation(\n opts.provider,\n opts.importer,\n candidate,\n )) ||\n (await findImportStatementLocationFromTransformed(\n opts.provider,\n opts.importer,\n candidate,\n opts.importLocCache,\n importSpecifierLocationIndex.find,\n ))\n\n if (loc) {\n return loc\n }\n }\n\n if (!opts.preferOriginalCode) {\n for (const candidate of opts.sourceCandidates) {\n const loc = findImportLocationInOriginalCode(\n opts.provider,\n opts.importer,\n candidate,\n )\n if (loc) {\n return loc\n }\n }\n }\n\n return undefined\n}\n\nasync function rebuildAndAnnotateTrace(opts: {\n provider: TransformResultProvider\n graph: ImportGraph\n importLocCache: ImportLocCache\n importer: string\n specifier: string\n importerLoc?: Loc\n maxTraceDepth: number\n}): Promise<Array<TraceStep>> {\n const trace = buildTrace(opts.graph, opts.importer, opts.maxTraceDepth)\n\n await addTraceImportLocations(\n opts.provider,\n trace,\n opts.importLocCache,\n importSpecifierLocationIndex.find,\n )\n\n if (trace.length > 0) {\n const last = trace[trace.length - 1]!\n if (!last.specifier) {\n last.specifier = opts.specifier\n }\n if (opts.importerLoc && last.line == null) {\n last.line = opts.importerLoc.line\n last.column = opts.importerLoc.column\n }\n }\n\n return trace\n}\n\nasync function buildViolationInfo(opts: {\n config: PluginConfig\n provider: TransformResultProvider\n graph: ImportGraph\n importLocCache: ImportLocCache\n envName: string\n envType: 'client' | 'server'\n importer: string\n source: string\n resolved?: string\n type: 'specifier' | 'file' | 'marker'\n pattern?: string | RegExp\n preferOriginalCode?: boolean\n}): Promise<ViolationInfo> {\n const importerLoc = await resolveImporterLocation({\n provider: opts.provider,\n importLocCache: opts.importLocCache,\n importer: opts.importer,\n sourceCandidates: buildSourceCandidates(\n opts.source,\n opts.resolved,\n opts.config.root,\n ),\n preferOriginalCode: opts.preferOriginalCode,\n envType: opts.envType,\n })\n\n const trace = await rebuildAndAnnotateTrace({\n provider: opts.provider,\n graph: opts.graph,\n importLocCache: opts.importLocCache,\n importer: opts.importer,\n specifier: opts.source,\n importerLoc,\n maxTraceDepth: opts.config.maxTraceDepth,\n })\n\n const snippet = importerLoc\n ? buildCodeSnippet(opts.provider, opts.importer, importerLoc)\n : undefined\n\n return {\n env: opts.envName,\n envType: opts.envType,\n behavior: opts.config.effectiveBehavior,\n type: opts.type,\n pattern: opts.pattern,\n specifier: opts.source,\n importer: opts.importer,\n ...(opts.resolved ? { resolved: opts.resolved } : {}),\n ...(importerLoc ? { importerLoc } : {}),\n trace,\n snippet,\n }\n}\n\nasync function getMarkerKindForFile(opts: {\n config: PluginConfig\n provider: TransformResultProvider\n loadOriginalCode: OriginalCodeLoader\n markerKindCache: Map<string, Promise<'server' | 'client' | undefined>>\n file: string\n}): Promise<'server' | 'client' | undefined> {\n if (!isImportProtectionSourceFile(opts.file)) {\n return undefined\n }\n\n let cached = opts.markerKindCache.get(opts.file)\n if (!cached) {\n cached = (async () => {\n const code =\n opts.provider.getTransformResult(opts.file)?.originalCode ??\n (await opts.loadOriginalCode(opts.file))\n\n if (!code) {\n return undefined\n }\n\n const imports = getImportSources(code, opts.file)\n const hasServerOnly = imports.some((source) =>\n opts.config.markerSpecifiers.serverOnly.has(source),\n )\n const hasClientOnly = imports.some((source) =>\n opts.config.markerSpecifiers.clientOnly.has(source),\n )\n\n if (hasServerOnly && !hasClientOnly) {\n return 'server'\n }\n\n if (hasClientOnly && !hasServerOnly) {\n return 'client'\n }\n\n return undefined\n })()\n opts.markerKindCache.set(opts.file, cached)\n }\n\n return cached\n}\n\nasync function reportViolation(opts: {\n config: PluginConfig\n envState: EnvRuntimeState\n compilation: RspackCompilation\n rspack: RspackNamespace\n info: ViolationInfo\n}): Promise<void> {\n const key = dedupeKey(opts.info)\n if (\n opts.config.logMode !== 'always' &&\n opts.envState.seenViolations.has(key)\n ) {\n return\n }\n\n opts.envState.seenViolations.add(key)\n\n if (opts.config.onViolation) {\n const result = await opts.config.onViolation(opts.info)\n if (result === false) {\n return\n }\n }\n\n const message = formatViolation(opts.info, opts.config.root)\n const error = new opts.rspack.WebpackError(message)\n\n if (opts.config.effectiveBehavior === 'error') {\n opts.compilation.errors.push(error)\n } else {\n opts.compilation.warnings.push(error)\n }\n}\n\nexport function registerImportProtection(\n api: RsbuildPluginAPI,\n opts: {\n getConfig: GetConfigFn\n framework: CompileStartFrameworkOptions\n environments: Array<{ name: string; type: 'client' | 'server' }>\n },\n): void {\n const extensionlessResolver = new ExtensionlessAbsoluteIdResolver()\n const envStates = new Map<string, EnvRuntimeState>()\n const fileReadCache = new Map<string, Promise<string | undefined>>()\n\n const config: PluginConfig = {\n enabled: true,\n root: '',\n command: api.context.action === 'dev' ? 'serve' : 'build',\n srcDirectory: '',\n framework: opts.framework,\n effectiveBehavior: 'error',\n mockAccess: 'error',\n logMode: 'once',\n maxTraceDepth: 20,\n compiledRules: {\n client: {\n specifiers: [],\n files: [],\n excludeFiles: [],\n },\n server: {\n specifiers: [],\n files: [],\n excludeFiles: [],\n },\n },\n includeMatchers: [],\n excludeMatchers: [],\n ignoreImporterMatchers: [],\n markerSpecifiers: {\n serverOnly: new Set(),\n clientOnly: new Set(),\n },\n envTypeMap: new Map(opts.environments.map((env) => [env.name, env.type])),\n onViolation: undefined,\n }\n\n const shared: SharedState = {\n root: '',\n virtualModules: new Map(),\n vmPlugins: {},\n readyVmPlugins: {},\n inputFileSystems: {},\n pendingWrites: new Map(),\n }\n\n function applyUserConfig(): void {\n const { startConfig, resolvedStartConfig } = opts.getConfig()\n\n config.root = resolvedStartConfig.root\n config.srcDirectory = resolvedStartConfig.srcDirectory\n shared.root = resolvedStartConfig.root\n\n const userOpts: ImportProtectionOptions | undefined =\n startConfig.importProtection\n\n if (userOpts?.enabled === false) {\n config.enabled = false\n return\n }\n\n config.enabled = true\n\n const behavior = userOpts?.behavior\n if (typeof behavior === 'string') {\n config.effectiveBehavior = behavior\n } else {\n config.effectiveBehavior =\n config.command === 'serve'\n ? (behavior?.dev ?? 'mock')\n : (behavior?.build ?? 'error')\n }\n\n config.logMode = userOpts?.log ?? 'once'\n config.mockAccess = userOpts?.mockAccess ?? 'error'\n config.maxTraceDepth = userOpts?.maxTraceDepth ?? 20\n config.onViolation = userOpts?.onViolation\n ? (info) => userOpts.onViolation?.(info)\n : undefined\n\n const defaults = getDefaultImportProtectionRules()\n const pick = <T>(user: Array<T> | undefined, fallback: Array<T>) =>\n user ? [...user] : [...fallback]\n\n const clientSpecifiers = dedupePatterns([\n ...defaults.client.specifiers,\n ...(userOpts?.client?.specifiers ?? []),\n ])\n\n config.compiledRules.client = {\n specifiers: compileMatchers(clientSpecifiers),\n files: compileMatchers(\n pick(userOpts?.client?.files, defaults.client.files),\n ),\n excludeFiles: compileMatchers(\n pick(userOpts?.client?.excludeFiles, defaults.client.excludeFiles),\n ),\n }\n\n config.compiledRules.server = {\n specifiers: compileMatchers(\n dedupePatterns(\n pick(userOpts?.server?.specifiers, defaults.server.specifiers),\n ),\n ),\n files: compileMatchers(\n pick(userOpts?.server?.files, defaults.server.files),\n ),\n excludeFiles: compileMatchers(\n pick(userOpts?.server?.excludeFiles, defaults.server.excludeFiles),\n ),\n }\n\n config.includeMatchers = compileMatchers(userOpts?.include ?? [])\n config.excludeMatchers = compileMatchers(userOpts?.exclude ?? [])\n config.ignoreImporterMatchers = compileMatchers(\n userOpts?.ignoreImporters ?? [],\n )\n\n const markers = getMarkerSpecifiers()\n config.markerSpecifiers = {\n serverOnly: new Set(markers.serverOnly),\n clientOnly: new Set(markers.clientOnly),\n }\n }\n\n api.onBeforeBuild(() => {\n applyUserConfig()\n clearNormalizeFilePathCache()\n extensionlessResolver.clear()\n fileReadCache.clear()\n envStates.clear()\n })\n\n api.onBeforeDevCompile(() => {\n applyUserConfig()\n clearNormalizeFilePathCache()\n extensionlessResolver.clear()\n fileReadCache.clear()\n\n for (const envState of envStates.values()) {\n envState.resolveCache.clear()\n envState.buildTransformResults.clear()\n envState.deferredFileViolations.length = 0\n envState.deferredFileViolationKeys.clear()\n }\n })\n\n api.modifyRspackConfig((rspackConfig, utils) => {\n applyUserConfig()\n\n const envName = utils.environment.name\n const VMP = utils.rspack.experiments.VirtualModulesPlugin\n const vmPlugin = new VMP({})\n\n shared.vmPlugins[envName] = vmPlugin\n shared.readyVmPlugins[envName] = false\n\n rspackConfig.plugins.push(vmPlugin)\n rspackConfig.plugins.push({\n apply(compiler: Rspack.Compiler) {\n shared.inputFileSystems[envName] = compiler.inputFileSystem\n compiler.hooks.thisCompilation.tap(\n 'TanStackStartImportProtectionVirtualModulesReady',\n () => {\n shared.readyVmPlugins[envName] = true\n flushPendingWrites(shared, envName)\n },\n )\n },\n })\n })\n\n for (const environment of opts.environments) {\n api.transform(\n {\n test: /\\.[cm]?[tj]sx?$/,\n environments: [environment.name],\n order: 'post',\n },\n async (ctx) => {\n if (!config.enabled) {\n return ctx.code\n }\n\n const envName = environment.name\n const envType = getImportProtectionEnvType(config, envName)\n const envState = getOrCreateEnvState(envStates, envName)\n const id = ctx.resource\n const file = normalizeFilePath(ctx.resourcePath)\n\n if (!shouldCheckImportProtectionImporter(config, file)) {\n return ctx.code\n }\n\n const matchers = getRulesForEnvironment(config, envName)\n const relativeFile = getImportProtectionRelativePath(config.root, file)\n const importSources = getImportSources(ctx.code, file)\n const transformedImportSources = new Set(importSources)\n const transformInputFileSystem = shared.inputFileSystems[envName]\n const loadOriginalCodeForTransform: OriginalCodeLoader =\n transformInputFileSystem\n ? (target) =>\n loadOriginalCodeFromInputFileSystem(\n transformInputFileSystem,\n target,\n )\n : () => Promise.resolve(undefined)\n const originalCode =\n config.command === 'build'\n ? await loadOriginalCode(\n fileReadCache,\n file,\n loadOriginalCodeForTransform,\n )\n : undefined\n const buildImportSources = originalCode\n ? getImportSources(originalCode, file)\n : []\n const buildTransformResult: TransformResult | undefined =\n config.command === 'build'\n ? {\n code: ctx.code,\n filename: file,\n map: undefined,\n originalCode,\n lineIndex: buildLineIndex(ctx.code),\n }\n : undefined\n\n if (config.command === 'build') {\n const relativeBuildFile = getImportProtectionRelativePath(\n config.root,\n file,\n )\n addTransformResult(\n envState.buildTransformResults,\n file,\n buildTransformResult!,\n )\n addTransformResult(\n envState.buildTransformResults,\n relativeBuildFile,\n buildTransformResult!,\n )\n if (id !== file) {\n addTransformResult(\n envState.buildTransformResults,\n id,\n buildTransformResult!,\n )\n }\n }\n\n const hasServerOnlyMarker = importSources.some((source) =>\n config.markerSpecifiers.serverOnly.has(source),\n )\n const hasClientOnlyMarker = importSources.some((source) =>\n config.markerSpecifiers.clientOnly.has(source),\n )\n\n if (hasServerOnlyMarker && hasClientOnlyMarker) {\n throw new Error(\n `[import-protection] File \"${relativeFile}\" has both server-only and client-only markers. This is not allowed.`,\n )\n }\n\n const markerKind = hasServerOnlyMarker\n ? ('server' as const)\n : hasClientOnlyMarker\n ? ('client' as const)\n : undefined\n\n const fileMatch = checkFileDenial(relativeFile, matchers)\n const markerViolation =\n (envType === 'client' && markerKind === 'server') ||\n (envType === 'server' && markerKind === 'client')\n\n if (fileMatch || markerViolation) {\n let exportNames: Array<string> = []\n\n try {\n exportNames = getNamedExports(ctx.code, file)\n } catch {\n exportNames = []\n }\n\n if (config.command === 'build') {\n return generateSelfContainedMockModule(exportNames)\n }\n\n const runtimeId = ensureRuntimeMockModule({\n shared,\n envName,\n mode: config.mockAccess,\n env: envName,\n importer: file,\n specifier: relativeFile,\n })\n\n return generateDevSelfDenialModule(exportNames, runtimeId)\n }\n\n const deniedSpecifierReplacements = new Map<string, string>()\n const exportsBySource = (() => {\n try {\n return getMockExportNamesBySource(ctx.code, file)\n } catch {\n return new Map<string, Array<string>>()\n }\n })()\n\n for (const source of importSources) {\n const specifierMatch = matchesAny(source, matchers.specifiers)\n if (!specifierMatch && config.command === 'build') {\n const resolved = await resolveAgainstImporter({\n envState,\n config,\n ctx,\n importerId: id,\n source,\n extensionlessResolver,\n })\n\n if (resolved) {\n const relativeResolved = getImportProtectionRelativePath(\n config.root,\n resolved,\n )\n const buildFileMatch = checkFileDenial(relativeResolved, matchers)\n if (\n buildFileMatch &&\n hasOriginalUnsafeUsage(buildTransformResult, source, envType)\n ) {\n deferFileViolation(envState, {\n importer: file,\n specifier: source,\n resolved,\n relativeResolved,\n pattern: buildFileMatch.pattern,\n useOriginalLocation: true,\n })\n }\n }\n\n continue\n }\n\n if (!specifierMatch) {\n continue\n }\n\n const resolved = await resolveAgainstImporter({\n envState,\n config,\n ctx,\n importerId: id,\n source,\n extensionlessResolver,\n })\n\n const runtimeId =\n config.command === 'build'\n ? ensureSilentMockModule(shared, envName)\n : ensureRuntimeMockModule({\n shared,\n envName,\n mode: config.mockAccess,\n env: envName,\n importer: file,\n specifier: source,\n })\n\n const replacement = ensureMockEdgeModule({\n shared,\n envName,\n payload: {\n exports: exportsBySource.get(source) ?? [],\n runtimeId,\n violation: {\n env: envName,\n envType,\n importer: file,\n specifier: source,\n ...(resolved ? { resolved } : {}),\n patternText: serializePattern(specifierMatch.pattern),\n },\n },\n })\n\n deniedSpecifierReplacements.set(source, replacement)\n }\n\n if (config.command === 'build') {\n for (const source of buildImportSources) {\n if (transformedImportSources.has(source)) {\n continue\n }\n\n if (matchesAny(source, matchers.specifiers)) {\n continue\n }\n\n const resolved = await resolveAgainstImporter({\n envState,\n config,\n ctx,\n importerId: id,\n source,\n extensionlessResolver,\n })\n\n if (!resolved) {\n continue\n }\n\n const relativeResolved = getImportProtectionRelativePath(\n config.root,\n resolved,\n )\n const buildFileMatch = checkFileDenial(relativeResolved, matchers)\n if (\n !buildFileMatch ||\n !hasOriginalUnsafeUsage(buildTransformResult, source, envType)\n ) {\n continue\n }\n\n deferFileViolation(envState, {\n importer: file,\n specifier: source,\n resolved,\n relativeResolved,\n pattern: buildFileMatch.pattern,\n useOriginalLocation: true,\n })\n }\n }\n\n if (deniedSpecifierReplacements.size === 0) {\n return ctx.code\n }\n\n const rewritten = rewriteDeniedImports(\n ctx.code,\n id,\n new Set(deniedSpecifierReplacements.keys()),\n (source) => deniedSpecifierReplacements.get(source) ?? source,\n )\n\n if (!rewritten) {\n return ctx.code\n }\n\n return {\n code: rewritten.code,\n map: normalizeSourceMap(rewritten.map) ?? null,\n }\n },\n )\n }\n\n api.processAssets(\n {\n stage: 'report',\n environments: opts.environments.map((environment) => environment.name),\n },\n async (context: ProcessAssetsContext) => {\n if (!config.enabled) {\n return\n }\n\n const envName = context.environment.name\n const envType = getImportProtectionEnvType(config, envName)\n const envState = getOrCreateEnvState(envStates, envName)\n const matchers = getRulesForEnvironment(config, envName)\n const processFileReadCache = new Map<\n string,\n Promise<string | undefined>\n >()\n const loadOriginalCodeFromCompilation: OriginalCodeLoader = (file) =>\n loadOriginalCode(\n processFileReadCache,\n file,\n context.compilation.inputFileSystem\n ? (target) =>\n loadOriginalCodeFromInputFileSystem(\n context.compilation.inputFileSystem!,\n target,\n )\n : () => Promise.resolve(undefined),\n )\n const allModules = Array.from(context.compilation.modules)\n const relevantModules = allModules.filter(isImportProtectionSourceModule)\n\n const provider = await buildTransformResultProvider({\n modules: relevantModules,\n root: config.root,\n loadOriginalCode: loadOriginalCodeFromCompilation,\n preloaded: envState.buildTransformResults,\n })\n const importLocCache = new ImportLocCache()\n const markerKindCache = new Map<\n string,\n Promise<'server' | 'client' | undefined>\n >()\n const { graph, edges } = buildCompilationGraph({\n compilation: context.compilation,\n modules: relevantModules,\n })\n const liveFileEdgeKeys = new Set(\n edges\n .filter((edge) => !!edge.specifier)\n .map(\n (edge) =>\n `${normalizeFilePath(edge.importer)}::${edge.specifier!}::${normalizeFilePath(edge.resolved)}`,\n ),\n )\n const survivingModules = new Set<string>()\n for (const module of relevantModules) {\n for (const candidate of buildResolutionCandidates(\n getModuleFile(module),\n )) {\n survivingModules.add(candidate)\n }\n }\n\n const didModuleSurvive = (id: string): boolean =>\n buildResolutionCandidates(id).some((candidate) =>\n survivingModules.has(candidate),\n )\n\n for (const module of relevantModules) {\n const payload = getMockEdgePayloadFromFile(getModuleFile(module))\n if (!payload) {\n continue\n }\n if (\n !shouldCheckImportProtectionImporter(\n config,\n payload.violation.importer,\n )\n ) {\n continue\n }\n\n const info = await buildViolationInfo({\n config,\n provider,\n graph,\n importLocCache,\n envName,\n envType,\n importer: payload.violation.importer,\n source: payload.violation.specifier,\n resolved: payload.violation.resolved,\n type: 'specifier',\n pattern: payload.violation.patternText,\n preferOriginalCode: true,\n })\n\n await reportViolation({\n config,\n envState,\n compilation: context.compilation,\n rspack: context.compiler.rspack,\n info,\n })\n }\n\n for (const edge of edges) {\n if (!edge.specifier) {\n continue\n }\n if (!shouldCheckImportProtectionImporter(config, edge.importer)) {\n continue\n }\n\n const relativeResolved = getImportProtectionRelativePath(\n config.root,\n edge.resolved,\n )\n if (isFileExcluded(relativeResolved, matchers)) {\n continue\n }\n const fileMatch = checkFileDenial(relativeResolved, matchers)\n if (fileMatch) {\n const info = await buildViolationInfo({\n config,\n provider,\n graph,\n importLocCache,\n envName,\n envType,\n importer: edge.importer,\n source: edge.specifier,\n resolved: edge.resolved,\n type: 'file',\n pattern: fileMatch.pattern,\n })\n\n await reportViolation({\n config,\n envState,\n compilation: context.compilation,\n rspack: context.compiler.rspack,\n info,\n })\n continue\n }\n\n const markerKind = await getMarkerKindForFile({\n config,\n provider,\n loadOriginalCode: loadOriginalCodeFromCompilation,\n markerKindCache,\n file: edge.resolved,\n })\n const violatesMarker =\n (envType === 'client' && markerKind === 'server') ||\n (envType === 'server' && markerKind === 'client')\n\n if (!violatesMarker) {\n continue\n }\n\n const info = await buildViolationInfo({\n config,\n provider,\n graph,\n importLocCache,\n envName,\n envType,\n importer: edge.importer,\n source: edge.specifier,\n resolved: edge.resolved,\n type: 'marker',\n })\n\n await reportViolation({\n config,\n envState,\n compilation: context.compilation,\n rspack: context.compiler.rspack,\n info,\n })\n }\n\n for (const violation of envState.deferredFileViolations) {\n const liveEdgeKey = `${normalizeFilePath(violation.importer)}::${violation.specifier}::${normalizeFilePath(violation.resolved)}`\n if (liveFileEdgeKeys.has(liveEdgeKey)) {\n continue\n }\n\n if (!didModuleSurvive(violation.resolved)) {\n continue\n }\n\n if (!didModuleSurvive(violation.importer)) {\n continue\n }\n\n const info = await buildViolationInfo({\n config,\n provider,\n graph,\n importLocCache,\n envName,\n envType,\n importer: violation.importer,\n source: violation.specifier,\n resolved: violation.resolved,\n type: 'file',\n pattern: violation.pattern,\n preferOriginalCode: violation.useOriginalLocation,\n })\n\n await reportViolation({\n config,\n envState,\n compilation: context.compilation,\n rspack: context.compiler.rspack,\n info,\n })\n }\n },\n )\n}\n"],"mappings":"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"}
|
|
@@ -104,6 +104,7 @@ function tanStackStartRsbuild(corePluginOpts, startPluginOpts = {}) {
|
|
|
104
104
|
"import.meta.env.TSS_INLINE_CSS_ENABLED": JSON.stringify(inlineCssEnabled ? "true" : "false")
|
|
105
105
|
} },
|
|
106
106
|
server: {
|
|
107
|
+
compress: false,
|
|
107
108
|
htmlFallback: false,
|
|
108
109
|
...isDev && startPluginOpts.rsbuild?.installDevServerMiddleware !== false ? { setup: createServerSetup({ serverFnBasePath: serverFnBase }) } : {}
|
|
109
110
|
},
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"plugin.js","names":[],"sources":["../../../src/rsbuild/plugin.ts"],"sourcesContent":["import { existsSync, readdirSync, realpathSync, statSync } from 'node:fs'\nimport { dirname, join, resolve } from 'node:path'\nimport { fileURLToPath } from 'node:url'\nimport { hasKeys } from '@tanstack/router-core'\nimport { joinURL } from 'ufo'\nimport {\n applyResolvedBaseAndOutput,\n applyResolvedRouterBasepath,\n createStartConfigContext,\n} from '../config-context'\nimport { normalizePath } from '../utils'\nimport { createServerFnBasePath, normalizePublicBase } from '../planning'\nimport { parseStartConfig } from './schema'\nimport {\n RSBUILD_ENVIRONMENT_NAMES,\n RSBUILD_RSC_LAYERS,\n createRsbuildEnvironmentPlan,\n createRsbuildResolvedEntryAliases,\n resolveRsbuildOutputDirectory,\n} from './planning'\nimport { registerStartCompilerTransforms } from './start-compiler-host'\nimport { registerImportProtection } from './import-protection'\nimport {\n START_MANIFEST_PLACEHOLDER,\n registerVirtualModules,\n} from './virtual-modules'\nimport { createServerSetup } from './dev-server'\nimport { registerClientBuildCapture } from './normalized-client-build'\nimport { registerRouterPlugins } from './start-router-plugin'\nimport { postBuildWithRsbuild } from './post-build'\nimport { enableSwcReactServerComponents } from './swc-rsc'\nimport type { ServerFn } from '../start-compiler/types'\nimport type { TanStackStartRsbuildPluginCoreOptions } from './types'\nimport type {\n ModifyRspackConfigFn,\n RsbuildDevServer,\n RsbuildPlugin,\n RsbuildPluginAPI,\n Rspack,\n rspack as rspackNamespaceType,\n} from '@rsbuild/core'\nimport type { TanStackStartRsbuildInputConfig } from './schema'\n\n// Detect whether this plugin source is running from inside the TanStack\n// Router monorepo (packages/start-plugin-core/src/rsbuild/plugin.ts). When\n// installed from npm in a user app, the path structure is different and\n// this evaluates to false. Used to gate dev-only workarounds that only\n// matter when workspace package dists are symlinked into node_modules.\nconst currentDir = dirname(fileURLToPath(import.meta.url))\nconst isInsideRouterMonoRepo = (() => {\n // src layout: <repo>/packages/start-plugin-core/src/rsbuild → 4 levels up\n // dist layout (CJS/ESM): <repo>/packages/start-plugin-core/dist/<fmt>/rsbuild\n // → also 4 levels up\n const candidate = resolve(currentDir, '../../../../')\n return candidate.endsWith('/packages') || candidate.endsWith('\\\\packages')\n})()\n\ntype RspackNamespace = typeof rspackNamespaceType\ntype RscPluginPair = ReturnType<\n NonNullable<RspackNamespace['experiments']['rsc']>['createPlugins']\n>\ntype RspackConfig = Parameters<ModifyRspackConfigFn>[0]\ntype RspackCompiler = Rspack.Compiler\ntype RspackCompilationExtended = Rspack.Compilation\n\nexport function tanStackStartRsbuild(\n corePluginOpts: TanStackStartRsbuildPluginCoreOptions,\n startPluginOpts: TanStackStartRsbuildInputConfig = {},\n): RsbuildPlugin {\n const rscOpts = corePluginOpts.rsc\n const rscEnabled = Boolean(rscOpts)\n\n const configContext = createStartConfigContext({\n corePluginOpts,\n startPluginOpts,\n parseConfig: parseStartConfig,\n })\n const { getConfig, resolvedStartConfig } = configContext\n const serverFnProviderEnv = corePluginOpts.providerEnvironmentName\n const ssrIsProvider = corePluginOpts.ssrIsProvider\n\n // RSC plugin instances — created lazily when rspack namespace is available\n let rscPlugins: RscPluginPair | undefined\n\n // Reference to the dev server for RSC HMR socket writes\n let devServerRef: Pick<RsbuildDevServer, 'sockWrite'> | null = null\n const serverFnsById: Record<string, ServerFn> = {}\n let updateServerFnResolver: (() => void) | undefined\n\n return {\n name: 'tanstack-start-rsbuild',\n setup(api: RsbuildPluginAPI) {\n // ---------------------------------------------------------------\n // 1. modifyRsbuildConfig — resolve config, set up environments\n // ---------------------------------------------------------------\n api.modifyRsbuildConfig((rsbuildConfig, { mergeRsbuildConfig }) => {\n const root =\n typeof rsbuildConfig.root === 'string'\n ? rsbuildConfig.root\n : process.cwd()\n\n const serverBase = rsbuildConfig.server?.base\n const assetPrefix = rsbuildConfig.output?.assetPrefix\n const publicBase = normalizePublicBase(\n typeof serverBase === 'string'\n ? serverBase\n : typeof assetPrefix === 'string' && assetPrefix !== 'auto'\n ? assetPrefix\n : undefined,\n )\n const rootDistPath = rsbuildConfig.output?.distPath\n const clientDistPath =\n rsbuildConfig.environments?.[RSBUILD_ENVIRONMENT_NAMES.client]?.output\n ?.distPath\n const serverDistPath =\n rsbuildConfig.environments?.[RSBUILD_ENVIRONMENT_NAMES.server]?.output\n ?.distPath\n\n applyResolvedBaseAndOutput({\n resolvedStartConfig,\n root,\n publicBase,\n clientOutputDirectory: resolveRsbuildOutputDirectory({\n distPath: clientDistPath,\n rootDistPath,\n fallback: 'dist/client',\n subdirectory: 'client',\n }),\n serverOutputDirectory: resolveRsbuildOutputDirectory({\n distPath: serverDistPath,\n rootDistPath,\n fallback: 'dist/server',\n subdirectory: 'server',\n }),\n })\n\n const { startConfig } = getConfig()\n const routerBasepath = applyResolvedRouterBasepath({\n resolvedStartConfig,\n startConfig,\n })\n\n const resolvedEntryPlan = configContext.resolveEntries()\n const isDev = api.context.action === 'dev'\n\n const entryAliases = createRsbuildResolvedEntryAliases({\n entryPaths: resolvedEntryPlan.entryPaths,\n })\n\n const environmentPlan = createRsbuildEnvironmentPlan({\n root,\n entryAliases,\n clientOutputDirectory: resolvedStartConfig.outputDirectories.client,\n serverOutputDirectory: resolvedStartConfig.outputDirectories.server,\n publicBase: resolvedStartConfig.basePaths.publicBase,\n serverFnProviderEnv,\n environmentOverrides: corePluginOpts.rsbuild?.environments,\n rsc: rscOpts,\n dev: isDev,\n })\n const serverFnBase = createServerFnBasePath({\n routerBasepath,\n serverFnBase: startConfig.serverFns.base,\n })\n const inlineCssEnabled = !isDev && startConfig.server.build.inlineCss\n\n return mergeRsbuildConfig(rsbuildConfig, {\n source: {\n define: {\n 'process.env.TSS_SERVER_FN_BASE': JSON.stringify(serverFnBase),\n 'import.meta.env.TSS_SERVER_FN_BASE':\n JSON.stringify(serverFnBase),\n 'process.env.TSS_ROUTER_BASEPATH': JSON.stringify(routerBasepath),\n 'import.meta.env.TSS_ROUTER_BASEPATH':\n JSON.stringify(routerBasepath),\n 'process.env.TSS_DEV_SERVER': JSON.stringify(\n isDev ? 'true' : 'false',\n ),\n 'import.meta.env.TSS_DEV_SERVER': JSON.stringify(\n isDev ? 'true' : 'false',\n ),\n // Rsbuild dev already injects emitted CSS asset hrefs, so keep\n // Start's synthetic `/@tanstack-start/styles.css` path disabled.\n 'process.env.TSS_DEV_SSR_STYLES_ENABLED': JSON.stringify('false'),\n 'import.meta.env.TSS_DEV_SSR_STYLES_ENABLED':\n JSON.stringify('false'),\n 'process.env.TSS_DEV_SSR_STYLES_BASEPATH': JSON.stringify(\n resolvedStartConfig.basePaths.publicBase,\n ),\n 'import.meta.env.TSS_DEV_SSR_STYLES_BASEPATH': JSON.stringify(\n resolvedStartConfig.basePaths.publicBase,\n ),\n 'process.env.TSS_INLINE_CSS_ENABLED': JSON.stringify(\n inlineCssEnabled ? 'true' : 'false',\n ),\n 'import.meta.env.TSS_INLINE_CSS_ENABLED': JSON.stringify(\n inlineCssEnabled ? 'true' : 'false',\n ),\n },\n },\n server: {\n // SSR apps render every route on the server — disable HTML\n // fallback so rsbuild doesn't intercept /_serverFn/ URLs.\n htmlFallback: false,\n // server.setup returned callback runs after built-in middleware\n // but BEFORE fallback middleware — the ideal slot for SSR.\n ...(isDev &&\n startPluginOpts.rsbuild?.installDevServerMiddleware !== false\n ? {\n setup: createServerSetup({\n serverFnBasePath: serverFnBase,\n }),\n }\n : {}),\n },\n ...(isDev\n ? {\n dev: {\n lazyCompilation: false,\n ...(rscEnabled ? { liveReload: false } : {}),\n },\n }\n : {}),\n environments: environmentPlan.environments,\n resolve: {\n alias: environmentPlan.alias,\n },\n })\n })\n\n // ---------------------------------------------------------------\n // 2. StartCompiler transforms — server fns, isomorphic fns, etc.\n // ---------------------------------------------------------------\n registerStartCompilerTransforms(api, {\n framework: corePluginOpts.framework,\n // modifyRsbuildConfig copies rsbuildConfig.root into resolvedStartConfig.root,\n // so defer this read until transform time instead of falling back to\n // process.cwd() during plugin setup.\n root: () => resolvedStartConfig.root || process.cwd(),\n providerEnvName: serverFnProviderEnv,\n generateFunctionId: startPluginOpts.serverFns?.generateFunctionId,\n compilerTransforms: corePluginOpts.compilerTransforms,\n serverFnProviderModuleDirectives:\n corePluginOpts.serverFnProviderModuleDirectives,\n serverFnsById,\n onServerFnsByIdChange: () => {\n updateServerFnResolver?.()\n },\n })\n\n registerImportProtection(api, {\n getConfig,\n framework: corePluginOpts.framework,\n environments: [\n { name: RSBUILD_ENVIRONMENT_NAMES.client, type: 'client' },\n { name: RSBUILD_ENVIRONMENT_NAMES.server, type: 'server' },\n ...(serverFnProviderEnv !== RSBUILD_ENVIRONMENT_NAMES.server &&\n !rscEnabled\n ? [{ name: serverFnProviderEnv, type: 'server' as const }]\n : []),\n ],\n })\n\n // ---------------------------------------------------------------\n // 3. Virtual modules — manifest, server fn resolver, adapters,\n // RSC runtime, RSC HMR\n // ---------------------------------------------------------------\n const virtualModuleState = registerVirtualModules(api, {\n root: resolvedStartConfig.root || process.cwd(),\n getConfig,\n serverFnsById,\n providerEnvName: serverFnProviderEnv,\n ssrIsProvider,\n serializationAdapters: corePluginOpts.serializationAdapters,\n getDevClientEntryUrl: (publicBase: string) =>\n joinURL(publicBase, 'static/js/index.js'),\n rscEnabled,\n })\n updateServerFnResolver = virtualModuleState.updateServerFnResolver\n\n // ---------------------------------------------------------------\n // 4. Client build stats capture via processAssets\n // ---------------------------------------------------------------\n const { getClientBuild } = registerClientBuildCapture(api)\n\n // ---------------------------------------------------------------\n // 4b. Server manifest module generation (build only)\n // For ordinary multi-environment builds, Rsbuild can compile the\n // server environment after the client environment finishes. Generate\n // the final manifest as module source in that phase instead of\n // patching emitted server assets afterwards.\n // ---------------------------------------------------------------\n if (api.context.action !== 'dev') {\n const normalizedManifestPath = normalizePath(\n virtualModuleState.manifestPath,\n )\n const matchesManifestPath = (id: string) =>\n normalizePath(id) === normalizedManifestPath\n\n api.transform(\n {\n test: (id: string) => matchesManifestPath(id),\n environments: [RSBUILD_ENVIRONMENT_NAMES.server],\n },\n ({ code }) => {\n const clientBuild = getClientBuild()\n\n if (clientBuild) {\n return virtualModuleState.generateManifestContent(clientBuild)\n }\n\n if (!rscEnabled) {\n throw new Error(\n 'TanStack Start could not generate the rsbuild server manifest before the client build completed',\n )\n }\n\n // RSC builds cannot express the required client -> server ordering\n // through MultiCompiler dependencies, so keep the placeholder for\n // the RSC-only asset-patching fallback below.\n return code\n },\n )\n }\n\n // ---------------------------------------------------------------\n // 5. Router plugin wiring (generator + code splitter)\n // ---------------------------------------------------------------\n registerRouterPlugins(api, {\n getConfig,\n corePluginOpts,\n startPluginOpts,\n })\n\n // ---------------------------------------------------------------\n // 6. Dev SSR middleware — registered via server.setup in\n // modifyRsbuildConfig above (returned callback runs after\n // built-ins but before fallback middleware)\n // ---------------------------------------------------------------\n\n // ---------------------------------------------------------------\n // 6b. Dev watcher: ignore workspace package `dist/**` directories.\n //\n // In a real user app, `@tanstack/react-router` and friends live\n // inside `node_modules/` and are ignored by Rspack's default\n // watcher. In this monorepo, pnpm symlinks them to\n // `packages/*/dist` (realpath outside node_modules), so the\n // watcher follows them and treats their dist files as live\n // sources. If anything rewrites those files during dev, Rspack\n // sees transient half-written modules and fails to resolve\n // relative imports between them.\n //\n // Only apply this in monorepo development. In user apps this\n // is a no-op — their `node_modules/@tanstack/*/dist/**` is\n // already ignored by Rspack's default watchOptions.\n // ---------------------------------------------------------------\n if (isInsideRouterMonoRepo && api.context.action === 'dev') {\n api.modifyRspackConfig((config) => {\n const workspaceDistRealpaths = resolveWorkspacePackageDistRealpaths()\n if (workspaceDistRealpaths.length === 0) return\n\n const workspaceDistIgnored = new RegExp(\n workspaceDistRealpaths\n .map((path) => `^${escapeRegExp(path)}(?:[\\\\\\\\/]|$)`)\n .join('|'),\n )\n const ignored = config.watchOptions?.ignored\n\n config.watchOptions = {\n ...(config.watchOptions ?? {}),\n ignored:\n ignored == null\n ? new RegExp(\n `${defaultRspackWatchIgnored.source}|${workspaceDistIgnored.source}`,\n )\n : typeof ignored === 'string'\n ? [ignored, ...workspaceDistRealpaths]\n : Array.isArray(ignored)\n ? [...ignored, ...workspaceDistRealpaths]\n : new RegExp(\n `${ignored.source}|${workspaceDistIgnored.source}`,\n ),\n }\n })\n }\n\n // ---------------------------------------------------------------\n // 7. RSC: rspack layer rules + native RSC plugins\n // When RSC is enabled, we add:\n // - issuerLayer rule for react-server condition propagation\n // - SWC reactServerComponents: true\n // - rspack ServerPlugin (server env) / ClientPlugin (client env)\n // The Coordinator inside createPlugins() handles compilation\n // ordering (server→client→server-actions) automatically.\n // ---------------------------------------------------------------\n if (rscEnabled) {\n api.modifyRspackConfig((config, utils) => {\n const envName = utils.environment.name\n const isServerEnv = envName === RSBUILD_ENVIRONMENT_NAMES.server\n const isClientEnv = envName === RSBUILD_ENVIRONMENT_NAMES.client\n\n // Create RSC plugin pair lazily (once per build)\n if (!rscPlugins) {\n rscPlugins = utils.rspack.experiments.rsc.createPlugins()\n }\n\n if (isServerEnv) {\n // --- issuerLayer rule: modules imported from RSC layer\n // get react-server resolve condition ---\n const moduleRules = (config.module.rules ??= [])\n const root = resolvedStartConfig.root || process.cwd()\n\n // Split server-fn provider modules are the actual RSC execution\n // boundary in Start's layered model. They must compile in the\n // RSC layer so React and react-server-dom-rspack resolve their\n // react-server exports without forcing the whole SSR graph into\n // react-server conditions.\n moduleRules.push({\n resourceQuery: /(?:^|[?&])tss-serverfn-split(?:&|$)/,\n layer: RSBUILD_RSC_LAYERS.rsc,\n resolve: {\n conditionNames: ['react-server', '...'],\n },\n })\n\n // All modules imported from the RSC layer inherit\n // the react-server condition (transitive propagation), except\n // route split virtual modules. Those remain ordinary SSR/client\n // route code; only `?tsr-shared=1` modules may be shared with the\n // provider subtree.\n moduleRules.push({\n issuerLayer: RSBUILD_RSC_LAYERS.rsc,\n resourceQuery: {\n not: [/(?:^|[?&])tsr-split(?:=|&|$)/],\n },\n resolve: {\n conditionNames: ['react-server', '...'],\n },\n })\n\n // The RSC ServerPlugin injects imports like\n // `react-server-dom-rspack/server` into transformed modules.\n // Some modules in the server graph resolve from real package paths\n // outside the app root, so relying on the default relative\n // `node_modules` lookup is not enough. Seed resolve.modules with the\n // app root explicitly, without package-manager-specific heuristics.\n seedResolveModules(config, [`${root}/node_modules`, 'node_modules'])\n\n // Add ServerPlugin with HMR callback\n config.plugins.push(\n new rscPlugins.ServerPlugin({\n clientEntryName: 'index',\n runtimeEntryName: 'index',\n injectSsrModulesToEntries: ['index'],\n onServerComponentChanges: () => {\n // Send rsc:update to connected clients for HMR\n devServerRef?.sockWrite('custom', {\n event: 'rsc:update',\n })\n },\n }),\n )\n\n config.plugins.push({\n apply(compiler: RspackCompiler) {\n compiler.hooks.finishMake.tapPromise(\n {\n name: 'TanStackStartRscServerFnResolverRebuild',\n stage: -10,\n },\n async (compilation: RspackCompilationExtended) => {\n if (!hasKeys(serverFnsById)) {\n return\n }\n\n const resolverContent =\n virtualModuleState.generateCurrentResolverContent(true)\n virtualModuleState.tryUpdateServerFnResolver(\n resolverContent,\n )\n\n await rebuildModulesContaining(\n compilation,\n virtualModuleState.serverFnResolverPath,\n )\n },\n )\n },\n })\n\n if (api.context.action !== 'dev') {\n config.plugins.push({\n apply(compiler: RspackCompiler) {\n compiler.hooks.finishMake.tapPromise(\n {\n name: 'TanStackStartRscManifestRebuild',\n // The native RSC ServerPlugin completes the client-entry\n // handoff during its finishMake hook. Rebuild the manifest\n // after that point so the transform hook can emit the final\n // manifest source instead of the placeholder.\n stage: 10,\n },\n async (compilation: RspackCompilationExtended) => {\n const clientBuild = getClientBuild()\n\n if (!clientBuild) {\n return\n }\n\n virtualModuleState.updateManifest(clientBuild)\n\n await rebuildModulesContaining(\n compilation,\n virtualModuleState.manifestPath,\n )\n },\n )\n },\n })\n }\n }\n\n if (isClientEnv) {\n // Add ClientPlugin — the Coordinator links it to the\n // ServerPlugin's compilation state\n config.plugins.push(new rscPlugins.ClientPlugin())\n }\n\n // --- SWC reactServerComponents ---\n // Enable RSC directive detection where the native RSC plugins need it.\n // In the server build, scope it to the actual RSC provider subtree so\n // ordinary route-split modules (e.g. ?tsr-split=component) stay out of\n // RSC validation unless they are really imported by a provider module.\n if (isServerEnv) {\n enableSwcReactServerComponents(config, 'rsc-subtree')\n } else if (isClientEnv) {\n enableSwcReactServerComponents(config, 'all')\n }\n })\n\n // Capture dev server reference for RSC HMR socket writes\n if (api.context.action === 'dev') {\n api.onBeforeStartDevServer(({ server }) => {\n devServerRef = server\n })\n }\n }\n\n // ---------------------------------------------------------------\n // 8. Build ordering — client must complete before server starts\n // so that the manifest virtual module has real client build stats.\n // Uses rspack MultiCompiler.setDependencies() under the hood.\n //\n // IMPORTANT: When RSC is enabled we must NOT set dependencies.\n // The RSC Coordinator already orchestrates server↔client\n // compilation ordering by interleaving phases within compiler\n // hooks. Adding setDependencies(server, [client]) on top of\n // the Coordinator creates a deadlock: MultiCompiler blocks\n // the server compiler until client is `done`, but the\n // Coordinator blocks the client's `make` hook until the\n // server's entries phase completes — neither can start.\n // ---------------------------------------------------------------\n if (!rscEnabled) {\n api.onAfterCreateCompiler(({ compiler }) => {\n // MultiCompiler has a `compilers` array; single compiler does not\n if ('compilers' in compiler) {\n const serverCompiler = compiler.compilers.find(\n (c) => c.name === RSBUILD_ENVIRONMENT_NAMES.server,\n )\n if (serverCompiler) {\n compiler.setDependencies(serverCompiler, [\n RSBUILD_ENVIRONMENT_NAMES.client,\n ])\n }\n }\n })\n }\n\n // ---------------------------------------------------------------\n // 8b. Manifest asset replacement fallback (RSC build only)\n // Rsbuild's native RSC coordinator interleaves server and client\n // compilers, so the server manifest module can compile before Start's\n // normalized client build stats exist. Keep final replacement in the\n // server asset pipeline, after the client processAssets capture has a\n // chance to run.\n // ---------------------------------------------------------------\n if (api.context.action !== 'dev' && rscEnabled) {\n const manifestPlaceholderLiteral = JSON.stringify(\n START_MANIFEST_PLACEHOLDER,\n )\n api.modifyRspackConfig((config, utils) => {\n if (utils.environment.name !== RSBUILD_ENVIRONMENT_NAMES.server)\n return\n\n config.plugins.push({\n apply(compiler: RspackCompiler) {\n compiler.hooks.compilation.tap(\n 'TanStackStartManifestReplace',\n (compilation: RspackCompilationExtended) => {\n compilation.hooks.processAssets.tap(\n {\n name: 'TanStackStartManifestReplace',\n stage:\n utils.rspack.Compilation\n .PROCESS_ASSETS_STAGE_OPTIMIZE_SIZE,\n },\n () => {\n const assetsWithPlaceholder = compilation\n .getAssets()\n .flatMap((asset) => {\n if (!asset.name.endsWith('.js')) return []\n\n const sourceStr = String(asset.source.source())\n return sourceStr.includes(manifestPlaceholderLiteral)\n ? [{ asset, sourceStr }]\n : []\n })\n\n if (assetsWithPlaceholder.length === 0) return\n\n const clientBuild = getClientBuild()\n if (!clientBuild) {\n throw new Error(\n 'TanStack Start could not replace the rsbuild RSC server manifest placeholder because the client build was unavailable',\n )\n }\n\n const manifestValueLiteral =\n virtualModuleState.generateManifestValueLiteral(\n clientBuild,\n )\n\n for (const {\n asset,\n sourceStr,\n } of assetsWithPlaceholder) {\n compilation.updateAsset(\n asset.name,\n new utils.rspack.sources.RawSource(\n sourceStr.replace(\n manifestPlaceholderLiteral,\n manifestValueLiteral,\n ),\n ),\n )\n }\n },\n )\n },\n )\n },\n })\n })\n }\n\n // ---------------------------------------------------------------\n // 9. After client env compiles — refresh resolver + manifest\n // ---------------------------------------------------------------\n api.onAfterEnvironmentCompile(({ environment }) => {\n if (environment.name !== RSBUILD_ENVIRONMENT_NAMES.client) return\n\n virtualModuleState.updateServerFnResolver()\n\n const clientBuild = getClientBuild()\n if (clientBuild) {\n virtualModuleState.updateManifest(clientBuild)\n }\n })\n\n if (api.context.action === 'build') {\n api.onAfterBuild(async () => {\n const { startConfig } = getConfig()\n\n await postBuildWithRsbuild({\n startConfig,\n clientOutputDirectory: resolvedStartConfig.outputDirectories.client,\n serverOutputDirectory: resolvedStartConfig.outputDirectories.server,\n })\n })\n }\n },\n }\n}\n\nfunction escapeRegExp(value: string): string {\n return value.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&')\n}\n\nconst defaultRspackWatchIgnored = /[\\\\/](?:\\.git|node_modules)[\\\\/]/\n\nfunction seedResolveModules(\n config: RspackConfig,\n entries: Array<string>,\n): void {\n const resolveModules = (config.resolve.modules ??= [])\n\n for (const entry of entries) {\n if (!resolveModules.includes(entry)) {\n resolveModules.push(entry)\n }\n }\n}\n\nfunction rebuildModulesContaining(\n compilation: RspackCompilationExtended,\n identifierFragment: string,\n): Promise<void> {\n const modulesToRebuild = Array.from(compilation.modules).filter((mod) =>\n mod.identifier().includes(identifierFragment),\n )\n\n if (modulesToRebuild.length === 0) {\n return Promise.resolve()\n }\n\n return Promise.all(\n modulesToRebuild.map(\n (mod) =>\n new Promise<void>((resolve, reject) => {\n compilation.rebuildModule(mod, (err: Error | null) => {\n if (err) reject(err)\n else resolve()\n })\n }),\n ),\n ).then(() => undefined)\n}\n\n/**\n * Return the realpath of every packages/<name>/dist directory in the\n * TanStack Router monorepo. Only meaningful when called from inside the\n * monorepo — in user apps, callers should guard with\n * `isInsideRouterMonoRepo` before invoking this.\n */\nfunction resolveWorkspacePackageDistRealpaths(): Array<string> {\n // currentDir points at either <repo>/packages/start-plugin-core/src/rsbuild\n // or <repo>/packages/start-plugin-core/dist/<fmt>/rsbuild. Four levels up\n // lands on <repo>/packages in both layouts.\n const packagesDir = resolve(currentDir, '../../../../')\n if (!existsSync(packagesDir)) return []\n\n let entries: Array<string>\n try {\n entries = readdirSync(packagesDir)\n } catch {\n return []\n }\n\n const dists: Array<string> = []\n for (const entry of entries) {\n const distPath = join(packagesDir, entry, 'dist')\n try {\n if (!statSync(distPath).isDirectory()) continue\n } catch {\n continue\n }\n try {\n dists.push(realpathSync(distPath))\n } catch {\n dists.push(distPath)\n }\n }\n\n return dists\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"plugin.js","names":[],"sources":["../../../src/rsbuild/plugin.ts"],"sourcesContent":["import { existsSync, readdirSync, realpathSync, statSync } from 'node:fs'\nimport { dirname, join, resolve } from 'node:path'\nimport { fileURLToPath } from 'node:url'\nimport { hasKeys } from '@tanstack/router-core'\nimport { joinURL } from 'ufo'\nimport {\n applyResolvedBaseAndOutput,\n applyResolvedRouterBasepath,\n createStartConfigContext,\n} from '../config-context'\nimport { normalizePath } from '../utils'\nimport { createServerFnBasePath, normalizePublicBase } from '../planning'\nimport { parseStartConfig } from './schema'\nimport {\n RSBUILD_ENVIRONMENT_NAMES,\n RSBUILD_RSC_LAYERS,\n createRsbuildEnvironmentPlan,\n createRsbuildResolvedEntryAliases,\n resolveRsbuildOutputDirectory,\n} from './planning'\nimport { registerStartCompilerTransforms } from './start-compiler-host'\nimport { registerImportProtection } from './import-protection'\nimport {\n START_MANIFEST_PLACEHOLDER,\n registerVirtualModules,\n} from './virtual-modules'\nimport { createServerSetup } from './dev-server'\nimport { registerClientBuildCapture } from './normalized-client-build'\nimport { registerRouterPlugins } from './start-router-plugin'\nimport { postBuildWithRsbuild } from './post-build'\nimport { enableSwcReactServerComponents } from './swc-rsc'\nimport type { ServerFn } from '../start-compiler/types'\nimport type { TanStackStartRsbuildPluginCoreOptions } from './types'\nimport type {\n ModifyRspackConfigFn,\n RsbuildDevServer,\n RsbuildPlugin,\n RsbuildPluginAPI,\n Rspack,\n rspack as rspackNamespaceType,\n} from '@rsbuild/core'\nimport type { TanStackStartRsbuildInputConfig } from './schema'\n\n// Detect whether this plugin source is running from inside the TanStack\n// Router monorepo (packages/start-plugin-core/src/rsbuild/plugin.ts). When\n// installed from npm in a user app, the path structure is different and\n// this evaluates to false. Used to gate dev-only workarounds that only\n// matter when workspace package dists are symlinked into node_modules.\nconst currentDir = dirname(fileURLToPath(import.meta.url))\nconst isInsideRouterMonoRepo = (() => {\n // src layout: <repo>/packages/start-plugin-core/src/rsbuild → 4 levels up\n // dist layout (CJS/ESM): <repo>/packages/start-plugin-core/dist/<fmt>/rsbuild\n // → also 4 levels up\n const candidate = resolve(currentDir, '../../../../')\n return candidate.endsWith('/packages') || candidate.endsWith('\\\\packages')\n})()\n\ntype RspackNamespace = typeof rspackNamespaceType\ntype RscPluginPair = ReturnType<\n NonNullable<RspackNamespace['experiments']['rsc']>['createPlugins']\n>\ntype RspackConfig = Parameters<ModifyRspackConfigFn>[0]\ntype RspackCompiler = Rspack.Compiler\ntype RspackCompilationExtended = Rspack.Compilation\n\nexport function tanStackStartRsbuild(\n corePluginOpts: TanStackStartRsbuildPluginCoreOptions,\n startPluginOpts: TanStackStartRsbuildInputConfig = {},\n): RsbuildPlugin {\n const rscOpts = corePluginOpts.rsc\n const rscEnabled = Boolean(rscOpts)\n\n const configContext = createStartConfigContext({\n corePluginOpts,\n startPluginOpts,\n parseConfig: parseStartConfig,\n })\n const { getConfig, resolvedStartConfig } = configContext\n const serverFnProviderEnv = corePluginOpts.providerEnvironmentName\n const ssrIsProvider = corePluginOpts.ssrIsProvider\n\n // RSC plugin instances — created lazily when rspack namespace is available\n let rscPlugins: RscPluginPair | undefined\n\n // Reference to the dev server for RSC HMR socket writes\n let devServerRef: Pick<RsbuildDevServer, 'sockWrite'> | null = null\n const serverFnsById: Record<string, ServerFn> = {}\n let updateServerFnResolver: (() => void) | undefined\n\n return {\n name: 'tanstack-start-rsbuild',\n setup(api: RsbuildPluginAPI) {\n // ---------------------------------------------------------------\n // 1. modifyRsbuildConfig — resolve config, set up environments\n // ---------------------------------------------------------------\n api.modifyRsbuildConfig((rsbuildConfig, { mergeRsbuildConfig }) => {\n const root =\n typeof rsbuildConfig.root === 'string'\n ? rsbuildConfig.root\n : process.cwd()\n\n const serverBase = rsbuildConfig.server?.base\n const assetPrefix = rsbuildConfig.output?.assetPrefix\n const publicBase = normalizePublicBase(\n typeof serverBase === 'string'\n ? serverBase\n : typeof assetPrefix === 'string' && assetPrefix !== 'auto'\n ? assetPrefix\n : undefined,\n )\n const rootDistPath = rsbuildConfig.output?.distPath\n const clientDistPath =\n rsbuildConfig.environments?.[RSBUILD_ENVIRONMENT_NAMES.client]?.output\n ?.distPath\n const serverDistPath =\n rsbuildConfig.environments?.[RSBUILD_ENVIRONMENT_NAMES.server]?.output\n ?.distPath\n\n applyResolvedBaseAndOutput({\n resolvedStartConfig,\n root,\n publicBase,\n clientOutputDirectory: resolveRsbuildOutputDirectory({\n distPath: clientDistPath,\n rootDistPath,\n fallback: 'dist/client',\n subdirectory: 'client',\n }),\n serverOutputDirectory: resolveRsbuildOutputDirectory({\n distPath: serverDistPath,\n rootDistPath,\n fallback: 'dist/server',\n subdirectory: 'server',\n }),\n })\n\n const { startConfig } = getConfig()\n const routerBasepath = applyResolvedRouterBasepath({\n resolvedStartConfig,\n startConfig,\n })\n\n const resolvedEntryPlan = configContext.resolveEntries()\n const isDev = api.context.action === 'dev'\n\n const entryAliases = createRsbuildResolvedEntryAliases({\n entryPaths: resolvedEntryPlan.entryPaths,\n })\n\n const environmentPlan = createRsbuildEnvironmentPlan({\n root,\n entryAliases,\n clientOutputDirectory: resolvedStartConfig.outputDirectories.client,\n serverOutputDirectory: resolvedStartConfig.outputDirectories.server,\n publicBase: resolvedStartConfig.basePaths.publicBase,\n serverFnProviderEnv,\n environmentOverrides: corePluginOpts.rsbuild?.environments,\n rsc: rscOpts,\n dev: isDev,\n })\n const serverFnBase = createServerFnBasePath({\n routerBasepath,\n serverFnBase: startConfig.serverFns.base,\n })\n const inlineCssEnabled = !isDev && startConfig.server.build.inlineCss\n\n return mergeRsbuildConfig(rsbuildConfig, {\n source: {\n define: {\n 'process.env.TSS_SERVER_FN_BASE': JSON.stringify(serverFnBase),\n 'import.meta.env.TSS_SERVER_FN_BASE':\n JSON.stringify(serverFnBase),\n 'process.env.TSS_ROUTER_BASEPATH': JSON.stringify(routerBasepath),\n 'import.meta.env.TSS_ROUTER_BASEPATH':\n JSON.stringify(routerBasepath),\n 'process.env.TSS_DEV_SERVER': JSON.stringify(\n isDev ? 'true' : 'false',\n ),\n 'import.meta.env.TSS_DEV_SERVER': JSON.stringify(\n isDev ? 'true' : 'false',\n ),\n // Rsbuild dev already injects emitted CSS asset hrefs, so keep\n // Start's synthetic `/@tanstack-start/styles.css` path disabled.\n 'process.env.TSS_DEV_SSR_STYLES_ENABLED': JSON.stringify('false'),\n 'import.meta.env.TSS_DEV_SSR_STYLES_ENABLED':\n JSON.stringify('false'),\n 'process.env.TSS_DEV_SSR_STYLES_BASEPATH': JSON.stringify(\n resolvedStartConfig.basePaths.publicBase,\n ),\n 'import.meta.env.TSS_DEV_SSR_STYLES_BASEPATH': JSON.stringify(\n resolvedStartConfig.basePaths.publicBase,\n ),\n 'process.env.TSS_INLINE_CSS_ENABLED': JSON.stringify(\n inlineCssEnabled ? 'true' : 'false',\n ),\n 'import.meta.env.TSS_INLINE_CSS_ENABLED': JSON.stringify(\n inlineCssEnabled ? 'true' : 'false',\n ),\n },\n },\n server: {\n // Rsbuild compression currently treats Node's raw header array\n // writeHead form as an object, which corrupts SSR response headers.\n compress: false,\n // SSR apps render every route on the server — disable HTML\n // fallback so rsbuild doesn't intercept /_serverFn/ URLs.\n htmlFallback: false,\n // server.setup returned callback runs after built-in middleware\n // but BEFORE fallback middleware — the ideal slot for SSR.\n ...(isDev &&\n startPluginOpts.rsbuild?.installDevServerMiddleware !== false\n ? {\n setup: createServerSetup({\n serverFnBasePath: serverFnBase,\n }),\n }\n : {}),\n },\n ...(isDev\n ? {\n dev: {\n lazyCompilation: false,\n ...(rscEnabled ? { liveReload: false } : {}),\n },\n }\n : {}),\n environments: environmentPlan.environments,\n resolve: {\n alias: environmentPlan.alias,\n },\n })\n })\n\n // ---------------------------------------------------------------\n // 2. StartCompiler transforms — server fns, isomorphic fns, etc.\n // ---------------------------------------------------------------\n registerStartCompilerTransforms(api, {\n framework: corePluginOpts.framework,\n // modifyRsbuildConfig copies rsbuildConfig.root into resolvedStartConfig.root,\n // so defer this read until transform time instead of falling back to\n // process.cwd() during plugin setup.\n root: () => resolvedStartConfig.root || process.cwd(),\n providerEnvName: serverFnProviderEnv,\n generateFunctionId: startPluginOpts.serverFns?.generateFunctionId,\n compilerTransforms: corePluginOpts.compilerTransforms,\n serverFnProviderModuleDirectives:\n corePluginOpts.serverFnProviderModuleDirectives,\n serverFnsById,\n onServerFnsByIdChange: () => {\n updateServerFnResolver?.()\n },\n })\n\n registerImportProtection(api, {\n getConfig,\n framework: corePluginOpts.framework,\n environments: [\n { name: RSBUILD_ENVIRONMENT_NAMES.client, type: 'client' },\n { name: RSBUILD_ENVIRONMENT_NAMES.server, type: 'server' },\n ...(serverFnProviderEnv !== RSBUILD_ENVIRONMENT_NAMES.server &&\n !rscEnabled\n ? [{ name: serverFnProviderEnv, type: 'server' as const }]\n : []),\n ],\n })\n\n // ---------------------------------------------------------------\n // 3. Virtual modules — manifest, server fn resolver, adapters,\n // RSC runtime, RSC HMR\n // ---------------------------------------------------------------\n const virtualModuleState = registerVirtualModules(api, {\n root: resolvedStartConfig.root || process.cwd(),\n getConfig,\n serverFnsById,\n providerEnvName: serverFnProviderEnv,\n ssrIsProvider,\n serializationAdapters: corePluginOpts.serializationAdapters,\n getDevClientEntryUrl: (publicBase: string) =>\n joinURL(publicBase, 'static/js/index.js'),\n rscEnabled,\n })\n updateServerFnResolver = virtualModuleState.updateServerFnResolver\n\n // ---------------------------------------------------------------\n // 4. Client build stats capture via processAssets\n // ---------------------------------------------------------------\n const { getClientBuild } = registerClientBuildCapture(api)\n\n // ---------------------------------------------------------------\n // 4b. Server manifest module generation (build only)\n // For ordinary multi-environment builds, Rsbuild can compile the\n // server environment after the client environment finishes. Generate\n // the final manifest as module source in that phase instead of\n // patching emitted server assets afterwards.\n // ---------------------------------------------------------------\n if (api.context.action !== 'dev') {\n const normalizedManifestPath = normalizePath(\n virtualModuleState.manifestPath,\n )\n const matchesManifestPath = (id: string) =>\n normalizePath(id) === normalizedManifestPath\n\n api.transform(\n {\n test: (id: string) => matchesManifestPath(id),\n environments: [RSBUILD_ENVIRONMENT_NAMES.server],\n },\n ({ code }) => {\n const clientBuild = getClientBuild()\n\n if (clientBuild) {\n return virtualModuleState.generateManifestContent(clientBuild)\n }\n\n if (!rscEnabled) {\n throw new Error(\n 'TanStack Start could not generate the rsbuild server manifest before the client build completed',\n )\n }\n\n // RSC builds cannot express the required client -> server ordering\n // through MultiCompiler dependencies, so keep the placeholder for\n // the RSC-only asset-patching fallback below.\n return code\n },\n )\n }\n\n // ---------------------------------------------------------------\n // 5. Router plugin wiring (generator + code splitter)\n // ---------------------------------------------------------------\n registerRouterPlugins(api, {\n getConfig,\n corePluginOpts,\n startPluginOpts,\n })\n\n // ---------------------------------------------------------------\n // 6. Dev SSR middleware — registered via server.setup in\n // modifyRsbuildConfig above (returned callback runs after\n // built-ins but before fallback middleware)\n // ---------------------------------------------------------------\n\n // ---------------------------------------------------------------\n // 6b. Dev watcher: ignore workspace package `dist/**` directories.\n //\n // In a real user app, `@tanstack/react-router` and friends live\n // inside `node_modules/` and are ignored by Rspack's default\n // watcher. In this monorepo, pnpm symlinks them to\n // `packages/*/dist` (realpath outside node_modules), so the\n // watcher follows them and treats their dist files as live\n // sources. If anything rewrites those files during dev, Rspack\n // sees transient half-written modules and fails to resolve\n // relative imports between them.\n //\n // Only apply this in monorepo development. In user apps this\n // is a no-op — their `node_modules/@tanstack/*/dist/**` is\n // already ignored by Rspack's default watchOptions.\n // ---------------------------------------------------------------\n if (isInsideRouterMonoRepo && api.context.action === 'dev') {\n api.modifyRspackConfig((config) => {\n const workspaceDistRealpaths = resolveWorkspacePackageDistRealpaths()\n if (workspaceDistRealpaths.length === 0) return\n\n const workspaceDistIgnored = new RegExp(\n workspaceDistRealpaths\n .map((path) => `^${escapeRegExp(path)}(?:[\\\\\\\\/]|$)`)\n .join('|'),\n )\n const ignored = config.watchOptions?.ignored\n\n config.watchOptions = {\n ...(config.watchOptions ?? {}),\n ignored:\n ignored == null\n ? new RegExp(\n `${defaultRspackWatchIgnored.source}|${workspaceDistIgnored.source}`,\n )\n : typeof ignored === 'string'\n ? [ignored, ...workspaceDistRealpaths]\n : Array.isArray(ignored)\n ? [...ignored, ...workspaceDistRealpaths]\n : new RegExp(\n `${ignored.source}|${workspaceDistIgnored.source}`,\n ),\n }\n })\n }\n\n // ---------------------------------------------------------------\n // 7. RSC: rspack layer rules + native RSC plugins\n // When RSC is enabled, we add:\n // - issuerLayer rule for react-server condition propagation\n // - SWC reactServerComponents: true\n // - rspack ServerPlugin (server env) / ClientPlugin (client env)\n // The Coordinator inside createPlugins() handles compilation\n // ordering (server→client→server-actions) automatically.\n // ---------------------------------------------------------------\n if (rscEnabled) {\n api.modifyRspackConfig((config, utils) => {\n const envName = utils.environment.name\n const isServerEnv = envName === RSBUILD_ENVIRONMENT_NAMES.server\n const isClientEnv = envName === RSBUILD_ENVIRONMENT_NAMES.client\n\n // Create RSC plugin pair lazily (once per build)\n if (!rscPlugins) {\n rscPlugins = utils.rspack.experiments.rsc.createPlugins()\n }\n\n if (isServerEnv) {\n // --- issuerLayer rule: modules imported from RSC layer\n // get react-server resolve condition ---\n const moduleRules = (config.module.rules ??= [])\n const root = resolvedStartConfig.root || process.cwd()\n\n // Split server-fn provider modules are the actual RSC execution\n // boundary in Start's layered model. They must compile in the\n // RSC layer so React and react-server-dom-rspack resolve their\n // react-server exports without forcing the whole SSR graph into\n // react-server conditions.\n moduleRules.push({\n resourceQuery: /(?:^|[?&])tss-serverfn-split(?:&|$)/,\n layer: RSBUILD_RSC_LAYERS.rsc,\n resolve: {\n conditionNames: ['react-server', '...'],\n },\n })\n\n // All modules imported from the RSC layer inherit\n // the react-server condition (transitive propagation), except\n // route split virtual modules. Those remain ordinary SSR/client\n // route code; only `?tsr-shared=1` modules may be shared with the\n // provider subtree.\n moduleRules.push({\n issuerLayer: RSBUILD_RSC_LAYERS.rsc,\n resourceQuery: {\n not: [/(?:^|[?&])tsr-split(?:=|&|$)/],\n },\n resolve: {\n conditionNames: ['react-server', '...'],\n },\n })\n\n // The RSC ServerPlugin injects imports like\n // `react-server-dom-rspack/server` into transformed modules.\n // Some modules in the server graph resolve from real package paths\n // outside the app root, so relying on the default relative\n // `node_modules` lookup is not enough. Seed resolve.modules with the\n // app root explicitly, without package-manager-specific heuristics.\n seedResolveModules(config, [`${root}/node_modules`, 'node_modules'])\n\n // Add ServerPlugin with HMR callback\n config.plugins.push(\n new rscPlugins.ServerPlugin({\n clientEntryName: 'index',\n runtimeEntryName: 'index',\n injectSsrModulesToEntries: ['index'],\n onServerComponentChanges: () => {\n // Send rsc:update to connected clients for HMR\n devServerRef?.sockWrite('custom', {\n event: 'rsc:update',\n })\n },\n }),\n )\n\n config.plugins.push({\n apply(compiler: RspackCompiler) {\n compiler.hooks.finishMake.tapPromise(\n {\n name: 'TanStackStartRscServerFnResolverRebuild',\n stage: -10,\n },\n async (compilation: RspackCompilationExtended) => {\n if (!hasKeys(serverFnsById)) {\n return\n }\n\n const resolverContent =\n virtualModuleState.generateCurrentResolverContent(true)\n virtualModuleState.tryUpdateServerFnResolver(\n resolverContent,\n )\n\n await rebuildModulesContaining(\n compilation,\n virtualModuleState.serverFnResolverPath,\n )\n },\n )\n },\n })\n\n if (api.context.action !== 'dev') {\n config.plugins.push({\n apply(compiler: RspackCompiler) {\n compiler.hooks.finishMake.tapPromise(\n {\n name: 'TanStackStartRscManifestRebuild',\n // The native RSC ServerPlugin completes the client-entry\n // handoff during its finishMake hook. Rebuild the manifest\n // after that point so the transform hook can emit the final\n // manifest source instead of the placeholder.\n stage: 10,\n },\n async (compilation: RspackCompilationExtended) => {\n const clientBuild = getClientBuild()\n\n if (!clientBuild) {\n return\n }\n\n virtualModuleState.updateManifest(clientBuild)\n\n await rebuildModulesContaining(\n compilation,\n virtualModuleState.manifestPath,\n )\n },\n )\n },\n })\n }\n }\n\n if (isClientEnv) {\n // Add ClientPlugin — the Coordinator links it to the\n // ServerPlugin's compilation state\n config.plugins.push(new rscPlugins.ClientPlugin())\n }\n\n // --- SWC reactServerComponents ---\n // Enable RSC directive detection where the native RSC plugins need it.\n // In the server build, scope it to the actual RSC provider subtree so\n // ordinary route-split modules (e.g. ?tsr-split=component) stay out of\n // RSC validation unless they are really imported by a provider module.\n if (isServerEnv) {\n enableSwcReactServerComponents(config, 'rsc-subtree')\n } else if (isClientEnv) {\n enableSwcReactServerComponents(config, 'all')\n }\n })\n\n // Capture dev server reference for RSC HMR socket writes\n if (api.context.action === 'dev') {\n api.onBeforeStartDevServer(({ server }) => {\n devServerRef = server\n })\n }\n }\n\n // ---------------------------------------------------------------\n // 8. Build ordering — client must complete before server starts\n // so that the manifest virtual module has real client build stats.\n // Uses rspack MultiCompiler.setDependencies() under the hood.\n //\n // IMPORTANT: When RSC is enabled we must NOT set dependencies.\n // The RSC Coordinator already orchestrates server↔client\n // compilation ordering by interleaving phases within compiler\n // hooks. Adding setDependencies(server, [client]) on top of\n // the Coordinator creates a deadlock: MultiCompiler blocks\n // the server compiler until client is `done`, but the\n // Coordinator blocks the client's `make` hook until the\n // server's entries phase completes — neither can start.\n // ---------------------------------------------------------------\n if (!rscEnabled) {\n api.onAfterCreateCompiler(({ compiler }) => {\n // MultiCompiler has a `compilers` array; single compiler does not\n if ('compilers' in compiler) {\n const serverCompiler = compiler.compilers.find(\n (c) => c.name === RSBUILD_ENVIRONMENT_NAMES.server,\n )\n if (serverCompiler) {\n compiler.setDependencies(serverCompiler, [\n RSBUILD_ENVIRONMENT_NAMES.client,\n ])\n }\n }\n })\n }\n\n // ---------------------------------------------------------------\n // 8b. Manifest asset replacement fallback (RSC build only)\n // Rsbuild's native RSC coordinator interleaves server and client\n // compilers, so the server manifest module can compile before Start's\n // normalized client build stats exist. Keep final replacement in the\n // server asset pipeline, after the client processAssets capture has a\n // chance to run.\n // ---------------------------------------------------------------\n if (api.context.action !== 'dev' && rscEnabled) {\n const manifestPlaceholderLiteral = JSON.stringify(\n START_MANIFEST_PLACEHOLDER,\n )\n api.modifyRspackConfig((config, utils) => {\n if (utils.environment.name !== RSBUILD_ENVIRONMENT_NAMES.server)\n return\n\n config.plugins.push({\n apply(compiler: RspackCompiler) {\n compiler.hooks.compilation.tap(\n 'TanStackStartManifestReplace',\n (compilation: RspackCompilationExtended) => {\n compilation.hooks.processAssets.tap(\n {\n name: 'TanStackStartManifestReplace',\n stage:\n utils.rspack.Compilation\n .PROCESS_ASSETS_STAGE_OPTIMIZE_SIZE,\n },\n () => {\n const assetsWithPlaceholder = compilation\n .getAssets()\n .flatMap((asset) => {\n if (!asset.name.endsWith('.js')) return []\n\n const sourceStr = String(asset.source.source())\n return sourceStr.includes(manifestPlaceholderLiteral)\n ? [{ asset, sourceStr }]\n : []\n })\n\n if (assetsWithPlaceholder.length === 0) return\n\n const clientBuild = getClientBuild()\n if (!clientBuild) {\n throw new Error(\n 'TanStack Start could not replace the rsbuild RSC server manifest placeholder because the client build was unavailable',\n )\n }\n\n const manifestValueLiteral =\n virtualModuleState.generateManifestValueLiteral(\n clientBuild,\n )\n\n for (const {\n asset,\n sourceStr,\n } of assetsWithPlaceholder) {\n compilation.updateAsset(\n asset.name,\n new utils.rspack.sources.RawSource(\n sourceStr.replace(\n manifestPlaceholderLiteral,\n manifestValueLiteral,\n ),\n ),\n )\n }\n },\n )\n },\n )\n },\n })\n })\n }\n\n // ---------------------------------------------------------------\n // 9. After client env compiles — refresh resolver + manifest\n // ---------------------------------------------------------------\n api.onAfterEnvironmentCompile(({ environment }) => {\n if (environment.name !== RSBUILD_ENVIRONMENT_NAMES.client) return\n\n virtualModuleState.updateServerFnResolver()\n\n const clientBuild = getClientBuild()\n if (clientBuild) {\n virtualModuleState.updateManifest(clientBuild)\n }\n })\n\n if (api.context.action === 'build') {\n api.onAfterBuild(async () => {\n const { startConfig } = getConfig()\n\n await postBuildWithRsbuild({\n startConfig,\n clientOutputDirectory: resolvedStartConfig.outputDirectories.client,\n serverOutputDirectory: resolvedStartConfig.outputDirectories.server,\n })\n })\n }\n },\n }\n}\n\nfunction escapeRegExp(value: string): string {\n return value.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&')\n}\n\nconst defaultRspackWatchIgnored = /[\\\\/](?:\\.git|node_modules)[\\\\/]/\n\nfunction seedResolveModules(\n config: RspackConfig,\n entries: Array<string>,\n): void {\n const resolveModules = (config.resolve.modules ??= [])\n\n for (const entry of entries) {\n if (!resolveModules.includes(entry)) {\n resolveModules.push(entry)\n }\n }\n}\n\nfunction rebuildModulesContaining(\n compilation: RspackCompilationExtended,\n identifierFragment: string,\n): Promise<void> {\n const modulesToRebuild = Array.from(compilation.modules).filter((mod) =>\n mod.identifier().includes(identifierFragment),\n )\n\n if (modulesToRebuild.length === 0) {\n return Promise.resolve()\n }\n\n return Promise.all(\n modulesToRebuild.map(\n (mod) =>\n new Promise<void>((resolve, reject) => {\n compilation.rebuildModule(mod, (err: Error | null) => {\n if (err) reject(err)\n else resolve()\n })\n }),\n ),\n ).then(() => undefined)\n}\n\n/**\n * Return the realpath of every packages/<name>/dist directory in the\n * TanStack Router monorepo. Only meaningful when called from inside the\n * monorepo — in user apps, callers should guard with\n * `isInsideRouterMonoRepo` before invoking this.\n */\nfunction resolveWorkspacePackageDistRealpaths(): Array<string> {\n // currentDir points at either <repo>/packages/start-plugin-core/src/rsbuild\n // or <repo>/packages/start-plugin-core/dist/<fmt>/rsbuild. Four levels up\n // lands on <repo>/packages in both layouts.\n const packagesDir = resolve(currentDir, '../../../../')\n if (!existsSync(packagesDir)) return []\n\n let entries: Array<string>\n try {\n entries = readdirSync(packagesDir)\n } catch {\n return []\n }\n\n const dists: Array<string> = []\n for (const entry of entries) {\n const distPath = join(packagesDir, entry, 'dist')\n try {\n if (!statSync(distPath).isDirectory()) continue\n } catch {\n continue\n }\n try {\n dists.push(realpathSync(distPath))\n } catch {\n dists.push(distPath)\n }\n }\n\n return dists\n}\n"],"mappings":"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"}
|
|
@@ -110,18 +110,20 @@ export declare class StartCompiler {
|
|
|
110
110
|
* Extracts bindings and exports from an already-parsed AST.
|
|
111
111
|
*/
|
|
112
112
|
private extractModuleInfo;
|
|
113
|
-
ingestModule({ code, id }: {
|
|
113
|
+
ingestModule({ code, id, parserFilename, }: {
|
|
114
114
|
code: string;
|
|
115
115
|
id: string;
|
|
116
|
+
parserFilename?: string;
|
|
116
117
|
}): {
|
|
117
118
|
info: ModuleInfo;
|
|
118
119
|
ast: import('@tanstack/router-utils').ParseAstResult;
|
|
119
120
|
};
|
|
120
121
|
invalidateModule(id: string): boolean;
|
|
121
122
|
getTransitiveImporters(id: string): Promise<Set<string>>;
|
|
122
|
-
compile({ code, id, detectedKinds, }: {
|
|
123
|
+
compile({ code, id, parserFilename, detectedKinds, }: {
|
|
123
124
|
code: string;
|
|
124
125
|
id: string;
|
|
126
|
+
parserFilename?: string;
|
|
125
127
|
/** Pre-detected kinds present in this file. If not provided, all valid kinds are checked. */
|
|
126
128
|
detectedKinds?: Set<LookupKind>;
|
|
127
129
|
}): Promise<import('@tanstack/router-utils').GeneratorResult | null>;
|
|
@@ -456,8 +456,11 @@ var StartCompiler = class {
|
|
|
456
456
|
this.moduleCache.set(id, info);
|
|
457
457
|
return info;
|
|
458
458
|
}
|
|
459
|
-
ingestModule({ code, id }) {
|
|
460
|
-
const ast = parseAst({
|
|
459
|
+
ingestModule({ code, id, parserFilename }) {
|
|
460
|
+
const ast = parseAst({
|
|
461
|
+
code,
|
|
462
|
+
filename: parserFilename ?? cleanId(id)
|
|
463
|
+
});
|
|
461
464
|
return {
|
|
462
465
|
info: this.extractModuleInfo(ast, id),
|
|
463
466
|
ast
|
|
@@ -516,7 +519,7 @@ var StartCompiler = class {
|
|
|
516
519
|
}
|
|
517
520
|
return discoveredImporters;
|
|
518
521
|
}
|
|
519
|
-
async compile({ code, id, detectedKinds }) {
|
|
522
|
+
async compile({ code, id, parserFilename, detectedKinds }) {
|
|
520
523
|
if (!this.initialized) await this.init();
|
|
521
524
|
const fileKinds = detectedKinds ? new Set([...detectedKinds].filter((k) => this.validLookupKinds.has(k))) : this.validLookupKinds;
|
|
522
525
|
if (fileKinds.size === 0) return null;
|
|
@@ -525,7 +528,8 @@ var StartCompiler = class {
|
|
|
525
528
|
const canUseFastPath = areAllKindsTopLevelOnly(fileKinds);
|
|
526
529
|
const { ast } = this.ingestModule({
|
|
527
530
|
code,
|
|
528
|
-
id
|
|
531
|
+
id,
|
|
532
|
+
parserFilename
|
|
529
533
|
});
|
|
530
534
|
const candidatePaths = [];
|
|
531
535
|
const chainCallPaths = /* @__PURE__ */ new Map();
|