| FazBrowse GitHub Viewer | Trending | | Home |
| Tools: [Download Repo ZIP] [Original HTTPS Page] |
1 parent 8312ce6 commit ff41c23
58 files changed
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
@@ -0,0 +1,17 @@ | |||
| 1 | + import { DisposableStore, IDisposable } from '../common/lifecycle.js'; | ||
| 2 | + export declare function isGlobalStylesheet(node: Node): boolean; | ||
| 3 | + /** | ||
| 4 | + * A version of createStyleSheet which has a unified API to initialize/set the style content. | ||
| 5 | + */ | ||
| 6 | + export declare function createStyleSheet2(): WrappedStyleElement; | ||
| 7 | + declare class WrappedStyleElement { | ||
| 8 | + private _currentCssStyle; | ||
| 9 | + private _styleSheet; | ||
| 10 | + setStyle(cssStyle: string): void; | ||
| 11 | + dispose(): void; | ||
| 12 | + } | ||
| 13 | + export declare function createStyleSheet(container?: HTMLElement, beforeAppend?: (style: HTMLStyleElement) => void, disposableStore?: DisposableStore): HTMLStyleElement; | ||
| 14 | + export declare function cloneGlobalStylesheets(targetWindow: Window): IDisposable; | ||
| 15 | + export declare function createCSSRule(selector: string, cssText: string, style?: HTMLStyleElement): void; | ||
| 16 | + export declare function removeCSSRulesContainingSelector(ruleName: string, style?: HTMLStyleElement): void; | ||
| 17 | + export {}; | ||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
@@ -0,0 +1,138 @@ | |||
| 1 | + /*--------------------------------------------------------------------------------------------- | ||
| 2 | + * Copyright (c) Microsoft Corporation. All rights reserved. | ||
| 3 | + * Licensed under the MIT License. See License.txt in the project root for license information. | ||
| 4 | + *--------------------------------------------------------------------------------------------*/ | ||
| 5 | + import { DisposableStore, toDisposable } from '../common/lifecycle.js'; | ||
| 6 | + import { getWindows, sharedMutationObserver } from './dom.js'; | ||
| 7 | + import { mainWindow } from './window.js'; | ||
| 8 | + const globalStylesheets = new Map(); | ||
| 9 | + export function isGlobalStylesheet(node) { | ||
| 10 | + return globalStylesheets.has(node); | ||
| 11 | + } | ||
| 12 | + /** | ||
| 13 | + * A version of createStyleSheet which has a unified API to initialize/set the style content. | ||
| 14 | + */ | ||
| 15 | + export function createStyleSheet2() { | ||
| 16 | + return new WrappedStyleElement(); | ||
| 17 | + } | ||
| 18 | + class WrappedStyleElement { | ||
| 19 | + constructor() { | ||
| 20 | + this._currentCssStyle = ''; | ||
| 21 | + this._styleSheet = undefined; | ||
| 22 | + } | ||
| 23 | + setStyle(cssStyle) { | ||
| 24 | + if (cssStyle === this._currentCssStyle) { | ||
| 25 | + return; | ||
| 26 | + } | ||
| 27 | + this._currentCssStyle = cssStyle; | ||
| 28 | + if (!this._styleSheet) { | ||
| 29 | + this._styleSheet = createStyleSheet(mainWindow.document.head, (s) => s.innerText = cssStyle); | ||
| 30 | + } | ||
| 31 | + else { | ||
| 32 | + this._styleSheet.innerText = cssStyle; | ||
| 33 | + } | ||
| 34 | + } | ||
| 35 | + dispose() { | ||
| 36 | + if (this._styleSheet) { | ||
| 37 | + this._styleSheet.remove(); | ||
| 38 | + this._styleSheet = undefined; | ||
| 39 | + } | ||
| 40 | + } | ||
| 41 | + } | ||
| 42 | + export function createStyleSheet(container = mainWindow.document.head, beforeAppend, disposableStore) { | ||
| 43 | + const style = document.createElement('style'); | ||
| 44 | + style.type = 'text/css'; | ||
| 45 | + style.media = 'screen'; | ||
| 46 | + beforeAppend?.(style); | ||
| 47 | + container.appendChild(style); | ||
| 48 | + if (disposableStore) { | ||
| 49 | + disposableStore.add(toDisposable(() => style.remove())); | ||
| 50 | + } | ||
| 51 | + // With <head> as container, the stylesheet becomes global and is tracked | ||
| 52 | + // to support auxiliary windows to clone the stylesheet. | ||
| 53 | + if (container === mainWindow.document.head) { | ||
| 54 | + const globalStylesheetClones = new Set(); | ||
| 55 | + globalStylesheets.set(style, globalStylesheetClones); | ||
| 56 | + for (const { window: targetWindow, disposables } of getWindows()) { | ||
| 57 | + if (targetWindow === mainWindow) { | ||
| 58 | + continue; // main window is already tracked | ||
| 59 | + } | ||
| 60 | + const cloneDisposable = disposables.add(cloneGlobalStyleSheet(style, globalStylesheetClones, targetWindow)); | ||
| 61 | + disposableStore?.add(cloneDisposable); | ||
| 62 | + } | ||
| 63 | + } | ||
| 64 | + return style; | ||
| 65 | + } | ||
| 66 | + export function cloneGlobalStylesheets(targetWindow) { | ||
| 67 | + const disposables = new DisposableStore(); | ||
| 68 | + for (const [globalStylesheet, clonedGlobalStylesheets] of globalStylesheets) { | ||
| 69 | + disposables.add(cloneGlobalStyleSheet(globalStylesheet, clonedGlobalStylesheets, targetWindow)); | ||
| 70 | + } | ||
| 71 | + return disposables; | ||
| 72 | + } | ||
| 73 | + function cloneGlobalStyleSheet(globalStylesheet, globalStylesheetClones, targetWindow) { | ||
| 74 | + const disposables = new DisposableStore(); | ||
| 75 | + const clone = globalStylesheet.cloneNode(true); | ||
| 76 | + targetWindow.document.head.appendChild(clone); | ||
| 77 | + disposables.add(toDisposable(() => clone.remove())); | ||
| 78 | + for (const rule of getDynamicStyleSheetRules(globalStylesheet)) { | ||
| 79 | + clone.sheet?.insertRule(rule.cssText, clone.sheet?.cssRules.length); | ||
| 80 | + } | ||
| 81 | + disposables.add(sharedMutationObserver.observe(globalStylesheet, disposables, { childList: true })(() => { | ||
| 82 | + clone.textContent = globalStylesheet.textContent; | ||
| 83 | + })); | ||
| 84 | + globalStylesheetClones.add(clone); | ||
| 85 | + disposables.add(toDisposable(() => globalStylesheetClones.delete(clone))); | ||
| 86 | + return disposables; | ||
| 87 | + } | ||
| 88 | + let _sharedStyleSheet = null; | ||
| 89 | + function getSharedStyleSheet() { | ||
| 90 | + if (!_sharedStyleSheet) { | ||
| 91 | + _sharedStyleSheet = createStyleSheet(); | ||
| 92 | + } | ||
| 93 | + return _sharedStyleSheet; | ||
| 94 | + } | ||
| 95 | + function getDynamicStyleSheetRules(style) { | ||
| 96 | + if (style?.sheet?.rules) { | ||
| 97 | + // Chrome, IE | ||
| 98 | + return style.sheet.rules; | ||
| 99 | + } | ||
| 100 | + if (style?.sheet?.cssRules) { | ||
| 101 | + // FF | ||
| 102 | + return style.sheet.cssRules; | ||
| 103 | + } | ||
| 104 | + return []; | ||
| 105 | + } | ||
| 106 | + export function createCSSRule(selector, cssText, style = getSharedStyleSheet()) { | ||
| 107 | + if (!style || !cssText) { | ||
| 108 | + return; | ||
| 109 | + } | ||
| 110 | + style.sheet?.insertRule(`${selector} {${cssText}}`, 0); | ||
| 111 | + // Apply rule also to all cloned global stylesheets | ||
| 112 | + for (const clonedGlobalStylesheet of globalStylesheets.get(style) ?? []) { | ||
| 113 | + createCSSRule(selector, cssText, clonedGlobalStylesheet); | ||
| 114 | + } | ||
| 115 | + } | ||
| 116 | + export function removeCSSRulesContainingSelector(ruleName, style = getSharedStyleSheet()) { | ||
| 117 | + if (!style) { | ||
| 118 | + return; | ||
| 119 | + } | ||
| 120 | + const rules = getDynamicStyleSheetRules(style); | ||
| 121 | + const toDelete = []; | ||
| 122 | + for (let i = 0; i < rules.length; i++) { | ||
| 123 | + const rule = rules[i]; | ||
| 124 | + if (isCSSStyleRule(rule) && rule.selectorText.indexOf(ruleName) !== -1) { | ||
| 125 | + toDelete.push(i); | ||
| 126 | + } | ||
| 127 | + } | ||
| 128 | + for (let i = toDelete.length - 1; i >= 0; i--) { | ||
| 129 | + style.sheet?.deleteRule(toDelete[i]); | ||
| 130 | + } | ||
| 131 | + // Remove rules also from all cloned global stylesheets | ||
| 132 | + for (const clonedGlobalStylesheet of globalStylesheets.get(style) ?? []) { | ||
| 133 | + removeCSSRulesContainingSelector(ruleName, clonedGlobalStylesheet); | ||
| 134 | + } | ||
| 135 | + } | ||
| 136 | + function isCSSStyleRule(rule) { | ||
| 137 | + return typeof rule.selectorText === 'string'; | ||
| 138 | + } | ||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
@@ -0,0 +1,15 @@ | |||
| 1 | + import { Disposable } from '../../../../base/common/lifecycle.js'; | ||
| 2 | + import { INativeEnvironmentService } from '../../../../platform/environment/common/environment.js'; | ||
| 3 | + import { INativeServerExtensionManagementService } from '../../../../platform/extensionManagement/node/extensionManagementService.js'; | ||
| 4 | + import { ILogService } from '../../../../platform/log/common/log.js'; | ||
| 5 | + import { IStorageService } from '../../../../platform/storage/common/storage.js'; | ||
| 6 | + import { IFileService } from '../../../../platform/files/common/files.js'; | ||
| 7 | + export declare class DefaultExtensionsInitializer extends Disposable { | ||
| 8 | + private readonly environmentService; | ||
| 9 | + private readonly extensionManagementService; | ||
| 10 | + private readonly fileService; | ||
| 11 | + private readonly logService; | ||
| 12 | + constructor(environmentService: INativeEnvironmentService, extensionManagementService: INativeServerExtensionManagementService, storageService: IStorageService, fileService: IFileService, logService: ILogService); | ||
| 13 | + private initializeDefaultExtensions; | ||
| 14 | + private getDefaultExtensionVSIXsLocation; | ||
| 15 | + } | ||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
@@ -0,0 +1,86 @@ | |||
| 1 | + /*--------------------------------------------------------------------------------------------- | ||
| 2 | + * Copyright (c) Microsoft Corporation. All rights reserved. | ||
| 3 | + * Licensed under the MIT License. See License.txt in the project root for license information. | ||
| 4 | + *--------------------------------------------------------------------------------------------*/ | ||
| 5 | + var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) { | ||
| 6 | + var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; | ||
| 7 | + if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); | ||
| 8 | + else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; | ||
| 9 | + return c > 3 && r && Object.defineProperty(target, key, r), r; | ||
| 10 | + }; | ||
| 11 | + var __param = (this && this.__param) || function (paramIndex, decorator) { | ||
| 12 | + return function (target, key) { decorator(target, key, paramIndex); } | ||
| 13 | + }; | ||
| 14 | + import { dirname, join } from 'path'; | ||
| 15 | + import { Disposable } from '../../../../base/common/lifecycle.js'; | ||
| 16 | + import { isWindows } from '../../../../base/common/platform.js'; | ||
| 17 | + import { URI } from '../../../../base/common/uri.js'; | ||
| 18 | + import { INativeEnvironmentService } from '../../../../platform/environment/common/environment.js'; | ||
| 19 | + import { INativeServerExtensionManagementService } from '../../../../platform/extensionManagement/node/extensionManagementService.js'; | ||
| 20 | + import { ILogService } from '../../../../platform/log/common/log.js'; | ||
| 21 | + import { IStorageService } from '../../../../platform/storage/common/storage.js'; | ||
| 22 | + import { IFileService, toFileOperationResult } from '../../../../platform/files/common/files.js'; | ||
| 23 | + import { getErrorMessage } from '../../../../base/common/errors.js'; | ||
| 24 | + const defaultExtensionsInitStatusKey = 'initializing-default-extensions'; | ||
| 25 | + let DefaultExtensionsInitializer = class DefaultExtensionsInitializer extends Disposable { | ||
| 26 | + constructor(environmentService, extensionManagementService, storageService, fileService, logService) { | ||
| 27 | + super(); | ||
| 28 | + this.environmentService = environmentService; | ||
| 29 | + this.extensionManagementService = extensionManagementService; | ||
| 30 | + this.fileService = fileService; | ||
| 31 | + this.logService = logService; | ||
| 32 | + if (isWindows && storageService.getBoolean(defaultExtensionsInitStatusKey, -1 /* StorageScope.APPLICATION */, true)) { | ||
| 33 | + storageService.store(defaultExtensionsInitStatusKey, true, -1 /* StorageScope.APPLICATION */, 1 /* StorageTarget.MACHINE */); | ||
| 34 | + this.initializeDefaultExtensions().then(() => storageService.store(defaultExtensionsInitStatusKey, false, -1 /* StorageScope.APPLICATION */, 1 /* StorageTarget.MACHINE */)); | ||
| 35 | + } | ||
| 36 | + } | ||
| 37 | + async initializeDefaultExtensions() { | ||
| 38 | + const extensionsLocation = this.getDefaultExtensionVSIXsLocation(); | ||
| 39 | + let stat; | ||
| 40 | + try { | ||
| 41 | + stat = await this.fileService.resolve(extensionsLocation); | ||
| 42 | + if (!stat.children) { | ||
| 43 | + this.logService.debug('There are no default extensions to initialize', extensionsLocation.toString()); | ||
| 44 | + return; | ||
| 45 | + } | ||
| 46 | + } | ||
| 47 | + catch (error) { | ||
| 48 | + if (toFileOperationResult(error) === 1 /* FileOperationResult.FILE_NOT_FOUND */) { | ||
| 49 | + this.logService.debug('There are no default extensions to initialize', extensionsLocation.toString()); | ||
| 50 | + return; | ||
| 51 | + } | ||
| 52 | + this.logService.error('Error initializing extensions', error); | ||
| 53 | + return; | ||
| 54 | + } | ||
| 55 | + const vsixs = stat.children.filter(child => child.name.endsWith('.vsix')); | ||
| 56 | + if (vsixs.length === 0) { | ||
| 57 | + this.logService.debug('There are no default extensions to initialize', extensionsLocation.toString()); | ||
| 58 | + return; | ||
| 59 | + } | ||
| 60 | + this.logService.info('Initializing default extensions', extensionsLocation.toString()); | ||
| 61 | + await Promise.all(vsixs.map(async (vsix) => { | ||
| 62 | + this.logService.info('Installing default extension', vsix.resource.toString()); | ||
| 63 | + try { | ||
| 64 | + await this.extensionManagementService.install(vsix.resource, { donotIncludePackAndDependencies: true, keepExisting: false }); | ||
| 65 | + this.logService.info('Default extension installed', vsix.resource.toString()); | ||
| 66 | + } | ||
| 67 | + catch (error) { | ||
| 68 | + this.logService.error('Error installing default extension', vsix.resource.toString(), getErrorMessage(error)); | ||
| 69 | + } | ||
| 70 | + })); | ||
| 71 | + this.logService.info('Default extensions initialized', extensionsLocation.toString()); | ||
| 72 | + } | ||
| 73 | + getDefaultExtensionVSIXsLocation() { | ||
| 74 | + // appRoot = C:\Users\<name>\AppData\Local\Programs\Microsoft VS Code Insiders\resources\app | ||
| 75 | + // extensionsPath = C:\Users\<name>\AppData\Local\Programs\Microsoft VS Code Insiders\extras\extensions | ||
| 76 | + return URI.file(join(dirname(dirname(this.environmentService.appRoot)), 'extras', 'extensions')); | ||
| 77 | + } | ||
| 78 | + }; | ||
| 79 | + DefaultExtensionsInitializer = __decorate([ | ||
| 80 | + __param(0, INativeEnvironmentService), | ||
| 81 | + __param(1, INativeServerExtensionManagementService), | ||
| 82 | + __param(2, IStorageService), | ||
| 83 | + __param(3, IFileService), | ||
| 84 | + __param(4, ILogService) | ||
| 85 | + ], DefaultExtensionsInitializer); | ||
| 86 | + export { DefaultExtensionsInitializer }; | ||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
@@ -0,0 +1,26 @@ | |||
| 1 | + import * as viewEvents from '../../../common/viewEvents.js'; | ||
| 2 | + import { ViewContext } from '../../../common/viewModel/viewContext.js'; | ||
| 3 | + import { DynamicViewOverlay } from '../../view/dynamicViewOverlay.js'; | ||
| 4 | + import { RenderingContext } from '../../view/renderingContext.js'; | ||
| 5 | + import './gpuMark.css'; | ||
| 6 | + /** | ||
| 7 | + * A mark on lines to make identification of GPU-rendered lines vs DOM easier. | ||
| 8 | + */ | ||
| 9 | + export declare class GpuMarkOverlay extends DynamicViewOverlay { | ||
| 10 | + static readonly CLASS_NAME = "gpu-mark"; | ||
| 11 | + private readonly _context; | ||
| 12 | + private _renderResult; | ||
| 13 | + constructor(context: ViewContext); | ||
| 14 | + dispose(): void; | ||
| 15 | + onConfigurationChanged(e: viewEvents.ViewConfigurationChangedEvent): boolean; | ||
| 16 | + onCursorStateChanged(e: viewEvents.ViewCursorStateChangedEvent): boolean; | ||
| 17 | + onFlushed(e: viewEvents.ViewFlushedEvent): boolean; | ||
| 18 | + onLinesChanged(e: viewEvents.ViewLinesChangedEvent): boolean; | ||
| 19 | + onLinesDeleted(e: viewEvents.ViewLinesDeletedEvent): boolean; | ||
| 20 | + onLinesInserted(e: viewEvents.ViewLinesInsertedEvent): boolean; | ||
| 21 | + onScrollChanged(e: viewEvents.ViewScrollChangedEvent): boolean; | ||
| 22 | + onZonesChanged(e: viewEvents.ViewZonesChangedEvent): boolean; | ||
| 23 | + onDecorationsChanged(e: viewEvents.ViewDecorationsChangedEvent): boolean; | ||
| 24 | + prepareRender(ctx: RenderingContext): void; | ||
| 25 | + render(startLineNumber: number, lineNumber: number): string; | ||
| 26 | + } | ||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
@@ -0,0 +1,77 @@ | |||
| 1 | + /*--------------------------------------------------------------------------------------------- | ||
| 2 | + * Copyright (c) Microsoft Corporation. All rights reserved. | ||
| 3 | + * Licensed under the MIT License. See License.txt in the project root for license information. | ||
| 4 | + *--------------------------------------------------------------------------------------------*/ | ||
| 5 | + import { ViewGpuContext } from '../../gpu/viewGpuContext.js'; | ||
| 6 | + import { DynamicViewOverlay } from '../../view/dynamicViewOverlay.js'; | ||
| 7 | + import { ViewLineOptions } from '../viewLines/viewLineOptions.js'; | ||
| 8 | + import './gpuMark.css'; | ||
| 9 | + /** | ||
| 10 | + * A mark on lines to make identification of GPU-rendered lines vs DOM easier. | ||
| 11 | + */ | ||
| 12 | + export class GpuMarkOverlay extends DynamicViewOverlay { | ||
| 13 | + static { this.CLASS_NAME = 'gpu-mark'; } | ||
| 14 | + constructor(context) { | ||
| 15 | + super(); | ||
| 16 | + this._context = context; | ||
| 17 | + this._renderResult = null; | ||
| 18 | + this._context.addEventHandler(this); | ||
| 19 | + } | ||
| 20 | + dispose() { | ||
| 21 | + this._context.removeEventHandler(this); | ||
| 22 | + this._renderResult = null; | ||
| 23 | + super.dispose(); | ||
| 24 | + } | ||
| 25 | + // --- begin event handlers | ||
| 26 | + onConfigurationChanged(e) { | ||
| 27 | + return true; | ||
| 28 | + } | ||
| 29 | + onCursorStateChanged(e) { | ||
| 30 | + return true; | ||
| 31 | + } | ||
| 32 | + onFlushed(e) { | ||
| 33 | + return true; | ||
| 34 | + } | ||
| 35 | + onLinesChanged(e) { | ||
| 36 | + return true; | ||
| 37 | + } | ||
| 38 | + onLinesDeleted(e) { | ||
| 39 | + return true; | ||
| 40 | + } | ||
| 41 | + onLinesInserted(e) { | ||
| 42 | + return true; | ||
| 43 | + } | ||
| 44 | + onScrollChanged(e) { | ||
| 45 | + return e.scrollTopChanged; | ||
| 46 | + } | ||
| 47 | + onZonesChanged(e) { | ||
| 48 | + return true; | ||
| 49 | + } | ||
| 50 | + onDecorationsChanged(e) { | ||
| 51 | + return true; | ||
| 52 | + } | ||
| 53 | + // --- end event handlers | ||
| 54 | + prepareRender(ctx) { | ||
| 55 | + const visibleStartLineNumber = ctx.visibleRange.startLineNumber; | ||
| 56 | + const visibleEndLineNumber = ctx.visibleRange.endLineNumber; | ||
| 57 | + const viewportData = ctx.viewportData; | ||
| 58 | + const options = new ViewLineOptions(this._context.configuration, this._context.theme.type); | ||
| 59 | + const output = []; | ||
| 60 | + for (let lineNumber = visibleStartLineNumber; lineNumber <= visibleEndLineNumber; lineNumber++) { | ||
| 61 | + const lineIndex = lineNumber - visibleStartLineNumber; | ||
| 62 | + const cannotRenderReasons = ViewGpuContext.canRenderDetailed(options, viewportData, lineNumber); | ||
| 63 | + output[lineIndex] = cannotRenderReasons.length ? `<div class="${GpuMarkOverlay.CLASS_NAME}" title="Cannot render on GPU: ${cannotRenderReasons.join(', ')}"></div>` : ''; | ||
| 64 | + } | ||
| 65 | + this._renderResult = output; | ||
| 66 | + } | ||
| 67 | + render(startLineNumber, lineNumber) { | ||
| 68 | + if (!this._renderResult) { | ||
| 69 | + return ''; | ||
| 70 | + } | ||
| 71 | + const lineIndex = lineNumber - startLineNumber; | ||
| 72 | + if (lineIndex < 0 || lineIndex >= this._renderResult.length) { | ||
| 73 | + return ''; | ||
| 74 | + } | ||
| 75 | + return this._renderResult[lineIndex]; | ||
| 76 | + } | ||
| 77 | + } | ||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
@@ -0,0 +1,16 @@ | |||
| 1 | + import { IHistory } from '../../../../base/common/history.js'; | ||
| 2 | + import { IStorageService } from '../../../../platform/storage/common/storage.js'; | ||
| 3 | + export declare class FindWidgetSearchHistory implements IHistory<string> { | ||
| 4 | + private readonly storageService; | ||
| 5 | + static readonly FIND_HISTORY_KEY = "workbench.find.history"; | ||
| 6 | + private inMemoryValues; | ||
| 7 | + constructor(storageService: IStorageService); | ||
| 8 | + delete(t: string): boolean; | ||
| 9 | + add(t: string): this; | ||
| 10 | + has(t: string): boolean; | ||
| 11 | + clear(): void; | ||
| 12 | + forEach(callbackfn: (value: string, value2: string, set: Set<string>) => void, thisArg?: any): void; | ||
| 13 | + replace?(t: string[]): void; | ||
| 14 | + load(): void; | ||
| 15 | + save(): Promise<void>; | ||
| 16 | + } | ||
| Back | FazBrowse Home | New Git URL |
0 commit comments