From 529ce8009b1ecafc5617fe8380d01fcd9081c23b Mon Sep 17 00:00:00 2001 From: mdm317 Date: Sat, 10 May 2025 01:04:04 +0900 Subject: [PATCH 1/3] fix : add rootfile name when create program --- packages/website/src/components/linter/bridge.ts | 4 +++- packages/website/src/components/linter/createParser.ts | 2 +- packages/website/src/components/linter/types.ts | 1 + 3 files changed, 5 insertions(+), 2 deletions(-) diff --git a/packages/website/src/components/linter/bridge.ts b/packages/website/src/components/linter/bridge.ts index 414873484c1a..a4f6cd62f488 100644 --- a/packages/website/src/components/linter/bridge.ts +++ b/packages/website/src/components/linter/bridge.ts @@ -78,6 +78,8 @@ export function createFileSystem( const expPath = getPathRegExp(path); return [...files.keys()].filter(fileName => expPath.test(fileName)); }; - + system.getScriptFileNames = (): string[] => { + return [...files.keys()].filter(f => f.endsWith('.ts')); + }; return system; } diff --git a/packages/website/src/components/linter/createParser.ts b/packages/website/src/components/linter/createParser.ts index 89bc7a44735e..58511506fc5e 100644 --- a/packages/website/src/components/linter/createParser.ts +++ b/packages/website/src/components/linter/createParser.ts @@ -28,7 +28,7 @@ export function createParser( ): tsvfs.VirtualTypeScriptEnvironment => { return vfs.createVirtualTypeScriptEnvironment( system, - [...registeredFiles], + [...registeredFiles, ...system.getScriptFileNames()], window.ts, compilerOptions, ); diff --git a/packages/website/src/components/linter/types.ts b/packages/website/src/components/linter/types.ts index 6e8a046733b7..5da48b127074 100644 --- a/packages/website/src/components/linter/types.ts +++ b/packages/website/src/components/linter/types.ts @@ -30,6 +30,7 @@ export interface WebLinterModule { export type PlaygroundSystem = { removeFile: (fileName: string) => void; searchFiles: (path: string) => string[]; + getScriptFileNames: () => string[]; } & Required> & ts.System; From f5d9dfbd9a7a29b07abe46e30aa54d3450c32506 Mon Sep 17 00:00:00 2001 From: mdm317 Date: Mon, 19 May 2025 20:30:23 +0900 Subject: [PATCH 2/3] fix : not including lib file and fix error --- packages/website/src/components/linter/bridge.ts | 8 ++++++-- packages/website/src/components/linter/createParser.ts | 8 +++----- 2 files changed, 9 insertions(+), 7 deletions(-) diff --git a/packages/website/src/components/linter/bridge.ts b/packages/website/src/components/linter/bridge.ts index a4f6cd62f488..1f1dec771aa7 100644 --- a/packages/website/src/components/linter/bridge.ts +++ b/packages/website/src/components/linter/bridge.ts @@ -14,7 +14,9 @@ export function createFileSystem( const files = new Map(); files.set(`/.eslintrc`, config.eslintrc); files.set(`/tsconfig.json`, config.tsconfig); - files.set(`/input${config.fileType}`, config.code); + if (config.code !== '') { + files.set(`/input${config.fileType}`, config.code); + } const fileWatcherCallbacks = new Map>(); @@ -79,7 +81,9 @@ export function createFileSystem( return [...files.keys()].filter(fileName => expPath.test(fileName)); }; system.getScriptFileNames = (): string[] => { - return [...files.keys()].filter(f => f.endsWith('.ts')); + return [...files.keys()] + .filter(fileName => !fileName.startsWith('/lib.')) + .filter(f => !f.endsWith('/.eslintrc') && !f.endsWith('.json')); }; return system; } diff --git a/packages/website/src/components/linter/createParser.ts b/packages/website/src/components/linter/createParser.ts index 58511506fc5e..4327316ec07f 100644 --- a/packages/website/src/components/linter/createParser.ts +++ b/packages/website/src/components/linter/createParser.ts @@ -21,14 +21,12 @@ export function createParser( ): { updateConfig: (compilerOptions: ts.CompilerOptions) => void; } & Parser.ParserModule { - const registeredFiles = new Set(); - const createEnv = ( compilerOptions: ts.CompilerOptions, ): tsvfs.VirtualTypeScriptEnvironment => { return vfs.createVirtualTypeScriptEnvironment( system, - [...registeredFiles, ...system.getScriptFileNames()], + system.getScriptFileNames(), window.ts, compilerOptions, ); @@ -46,10 +44,10 @@ export function createParser( // if text is empty use empty line to avoid error const code = text || '\n'; - if (registeredFiles.has(filePath)) { + if (system.fileExists(filePath)) { compilerHost.updateFile(filePath, code); } else { - registeredFiles.add(filePath); + system.writeFile(filePath, code); compilerHost.createFile(filePath, code); } From f9bd202b6aeffdcb48c68d968f87f8a1b35080da Mon Sep 17 00:00:00 2001 From: mdm317 Date: Wed, 21 May 2025 18:59:28 +0900 Subject: [PATCH 3/3] fix: make features work when code is written in an empty playground --- .../website/src/components/editor/useSandboxServices.ts | 6 +++++- packages/website/src/components/linter/createLinter.ts | 8 ++++++++ packages/website/src/components/linter/createParser.ts | 6 +++++- packages/website/src/components/linter/types.ts | 2 ++ 4 files changed, 20 insertions(+), 2 deletions(-) diff --git a/packages/website/src/components/editor/useSandboxServices.ts b/packages/website/src/components/editor/useSandboxServices.ts index d3a6e7fc00e3..9c2b2ff669e3 100644 --- a/packages/website/src/components/editor/useSandboxServices.ts +++ b/packages/website/src/components/editor/useSandboxServices.ts @@ -6,12 +6,13 @@ import semverSatisfies from 'semver/functions/satisfies'; import type { createTypeScriptSandbox } from '../../vendor/sandbox'; import type { CreateLinter } from '../linter/createLinter'; -import type { PlaygroundSystem } from '../linter/types'; +import type { PlaygroundSystem, RegisterFile } from '../linter/types'; import type { RuleDetails } from '../types'; import type { CommonEditorProps } from './types'; import rootPackageJson from '../../../../../package.json'; import { createCompilerOptions } from '../lib/createCompilerOptions'; +import { createEventsBinder } from '../lib/createEventsBinder'; import { createFileSystem } from '../linter/bridge'; import { createLinter } from '../linter/createLinter'; import { createTwoslashInlayProvider } from './createProvideTwoslashInlay'; @@ -79,6 +80,7 @@ export const useSandboxServices = ( sandboxInstance.language, createTwoslashInlayProvider(sandboxInstance), ); + const onModelCreate = createEventsBinder(); const system = createFileSystem(props, sandboxInstance.tsvfs); @@ -89,6 +91,7 @@ export const useSandboxServices = ( } const path = model.uri.path.replace('/file:///', '/'); system.writeFile(path, model.getValue()); + onModelCreate.trigger(path, model.getValue()); }); // Delete files in vfs when a model is disposed in the editor (this is used only for ATA types) sandboxInstance.monaco.editor.onWillDisposeModel(model => { @@ -117,6 +120,7 @@ export const useSandboxServices = ( lintUtils, sandboxInstance.tsvfs, ); + onModelCreate.register(webLinter.registerFile); onLoaded( [...webLinter.rules.values()], diff --git a/packages/website/src/components/linter/createLinter.ts b/packages/website/src/components/linter/createLinter.ts index 78f001439d87..21620b6dd779 100644 --- a/packages/website/src/components/linter/createLinter.ts +++ b/packages/website/src/components/linter/createLinter.ts @@ -11,6 +11,7 @@ import type { LinterOnLint, LinterOnParse, PlaygroundSystem, + RegisterFile, WebLinterModule, } from './types'; @@ -36,6 +37,7 @@ export interface CreateLinter { triggerFix(filename: string): Linter.FixReport | undefined; triggerLint(filename: string): void; updateParserOptions(sourceType?: SourceType): void; + registerFile: RegisterFile; } export function createLinter( @@ -164,6 +166,11 @@ export function createLinter( } }; + const registerFile = (fileName: string, code: string) => { + parser.registerFile(fileName, code); + triggerLintAll(); + }; + const triggerLintAll = (): void => { system.searchFiles('/input.*').forEach(triggerLint); }; @@ -185,6 +192,7 @@ export function createLinter( configs: [...configs.keys()], onLint: onLint.register, onParse: onParse.register, + registerFile, rules, triggerFix, triggerLint, diff --git a/packages/website/src/components/linter/createParser.ts b/packages/website/src/components/linter/createParser.ts index 4327316ec07f..9d891ef8d433 100644 --- a/packages/website/src/components/linter/createParser.ts +++ b/packages/website/src/components/linter/createParser.ts @@ -6,6 +6,7 @@ import type * as ts from 'typescript'; import type { ParseSettings, PlaygroundSystem, + RegisterFile, UpdateModel, WebLinterModule, } from './types'; @@ -20,6 +21,7 @@ export function createParser( vfs: typeof tsvfs, ): { updateConfig: (compilerOptions: ts.CompilerOptions) => void; + registerFile: RegisterFile; } & Parser.ParserModule { const createEnv = ( compilerOptions: ts.CompilerOptions, @@ -47,7 +49,6 @@ export function createParser( if (system.fileExists(filePath)) { compilerHost.updateFile(filePath, code); } else { - system.writeFile(filePath, code); compilerHost.createFile(filePath, code); } @@ -106,6 +107,9 @@ export function createParser( visitorKeys: utils.visitorKeys, }; }, + registerFile(filePath: string, code: string): void { + compilerHost.createFile(filePath, code); + }, updateConfig(compilerOptions): void { compilerHost = createEnv(compilerOptions); }, diff --git a/packages/website/src/components/linter/types.ts b/packages/website/src/components/linter/types.ts index 5da48b127074..1bd08c8dc50e 100644 --- a/packages/website/src/components/linter/types.ts +++ b/packages/website/src/components/linter/types.ts @@ -40,3 +40,5 @@ export type LinterOnLint = ( ) => void; export type LinterOnParse = (fileName: string, model: UpdateModel) => void; + +export type RegisterFile = (fileName: string, code: string) => void;