⬅️ Back to Table of Contents
📄 bridge.ts
📊 Analysis Summary
Metric |
Count |
🔧 Functions |
4 |
📦 Imports |
4 |
📊 Variables & Constants |
4 |
📚 Table of Contents
🛠️ File Location:
📂 packages/website/src/components/linter/bridge.ts
📦 Imports
Name |
Source |
ConfigModel |
../types |
PlaygroundSystem |
./types |
debounce |
../lib/debounce |
getPathRegExp |
./utils |
Variables & Constants
Name |
Type |
Kind |
Value |
Exported |
files |
Map<string, string> |
const |
new Map<string, string>() |
✗ |
fileWatcherCallbacks |
Map<RegExp, Set<ts.FileWatcherCallback>> |
const |
new Map<RegExp, Set<ts.FileWatcherCallback>>() |
✗ |
system |
any |
const |
vfs.createSystem(files) as PlaygroundSystem |
✗ |
cb |
any |
const |
pollingInterval ? debounce(callback, pollingInterval) : callback |
✗ |
Functions
createFileSystem(config: Pick<ConfigModel, 'code' | 'eslintrc' | 'fileType' | 'tsconfig'>, vfs: typeof tsvfs): PlaygroundSystem
Code
export function createFileSystem(
config: Pick<ConfigModel, 'code' | 'eslintrc' | 'fileType' | 'tsconfig'>,
vfs: typeof tsvfs,
): PlaygroundSystem {
const files = new Map<string, string>();
files.set(`/.eslintrc`, config.eslintrc);
files.set(`/tsconfig.json`, config.tsconfig);
files.set(`/input${config.fileType}`, config.code);
const fileWatcherCallbacks = new Map<RegExp, Set<ts.FileWatcherCallback>>();
const system = vfs.createSystem(files) as PlaygroundSystem;
system.watchFile = (
path,
callback,
pollingInterval = 500,
): ts.FileWatcher => {
const cb = pollingInterval ? debounce(callback, pollingInterval) : callback;
const expPath = getPathRegExp(path);
let handle = fileWatcherCallbacks.get(expPath);
if (!handle) {
handle = new Set();
fileWatcherCallbacks.set(expPath, handle);
}
handle.add(cb);
return {
close: (): void => {
fileWatcherCallbacks.get(expPath)?.delete(cb);
},
};
};
const triggerCallbacks = (
path: string,
type: ts.FileWatcherEventKind,
): void => {
fileWatcherCallbacks.forEach((callbacks, key) => {
if (key.test(path)) {
callbacks.forEach(cb => cb(path, type));
}
});
};
system.deleteFile = (fileName): void => {
files.delete(fileName);
triggerCallbacks(fileName, 1);
};
system.writeFile = (fileName, contents): void => {
if (!contents) {
contents = '';
}
const file = files.get(fileName);
if (file === contents) {
// do not trigger callbacks if the file has not changed
return;
}
files.set(fileName, contents);
triggerCallbacks(fileName, file ? 2 : 0);
};
system.removeFile = (fileName): void => {
files.delete(fileName);
};
system.searchFiles = (path: string): string[] => {
const expPath = getPathRegExp(path);
return [...files.keys()].filter(fileName => expPath.test(fileName));
};
return system;
}
- Parameters:
config: Pick<ConfigModel, 'code' | 'eslintrc' | 'fileType' | 'tsconfig'>
vfs: typeof tsvfs
- Return Type:
PlaygroundSystem
- Calls:
files.set
vfs.createSystem
debounce (from ../lib/debounce)
getPathRegExp (from ./utils)
fileWatcherCallbacks.get
fileWatcherCallbacks.set
handle.add
fileWatcherCallbacks.get(expPath)?.delete
fileWatcherCallbacks.forEach
key.test
callbacks.forEach
cb
files.delete
triggerCallbacks
files.get
[...files.keys()].filter
files.keys
expPath.test
- Internal Comments:
// do not trigger callbacks if the file has not changed
close(): void
Code
(): void => {
fileWatcherCallbacks.get(expPath)?.delete(cb);
}
- Return Type:
void
- Calls:
fileWatcherCallbacks.get(expPath)?.delete
close(): void
Code
(): void => {
fileWatcherCallbacks.get(expPath)?.delete(cb);
}
- Return Type:
void
- Calls:
fileWatcherCallbacks.get(expPath)?.delete
triggerCallbacks(path: string, type: ts.FileWatcherEventKind): void
Code
(
path: string,
type: ts.FileWatcherEventKind,
): void => {
fileWatcherCallbacks.forEach((callbacks, key) => {
if (key.test(path)) {
callbacks.forEach(cb => cb(path, type));
}
});
}
- Parameters:
path: string
type: ts.FileWatcherEventKind
- Return Type:
void
- Calls:
fileWatcherCallbacks.forEach
key.test
callbacks.forEach
cb