Full Code of deadlyjack/code-editor for AI

main 0006340d32f6 cached
510 files
4.6 MB
1.2M tokens
2848 symbols
1 requests
Download .txt
Showing preview only (5,053K chars total). Download the full file or copy to clipboard to get everything.
Repository: deadlyjack/code-editor
Branch: main
Commit: 0006340d32f6
Files: 510
Total size: 4.6 MB

Directory structure:
gitextract_3l2wh458/

├── .babelrc
├── .devcontainer/
│   ├── Dockerfile
│   └── devcontainer.json
├── .dockerignore
├── .gitattributes
├── .github/
│   ├── CODEOWNERS
│   ├── ISSUE_TEMPLATE/
│   │   ├── 0_bug_report.yml
│   │   ├── 1_feature_request.yml
│   │   └── config.yml
│   ├── dependabot.yml
│   ├── labeler.yml
│   └── workflows/
│       ├── add-pr-labels.yml
│       ├── ci.yml
│       ├── close-inactive-issues.yml
│       ├── community-release-notifier.yml
│       ├── nightly-build.yml
│       └── on-demand-preview-releases-PR.yml
├── .gitignore
├── .hintrc
├── .prettierrc
├── .vscode/
│   ├── launch.json
│   ├── plugins.json
│   ├── settings.json
│   └── typings/
│       └── cordova/
│           └── cordova.d.ts
├── CHANGELOG.md
├── CODE_OF_CONDUCT.md
├── CONTRIBUTING.md
├── _typos.toml
├── biome.json
├── build-extras.gradle
├── config.xml
├── fastlane/
│   └── metadata/
│       └── android/
│           └── en-US/
│               ├── full_description.txt
│               ├── short_description.txt
│               └── title.txt
├── hooks/
│   ├── README.md
│   ├── modify-java-files.js
│   ├── move-files.js
│   ├── post-process.js
│   └── restore-cordova-resources.js
├── jsconfig.json
├── license.txt
├── package.json
├── postcss.config.js
├── readme.md
├── res/
│   └── android/
│       ├── drawable/
│       │   ├── ic_launcher_background.xml
│       │   └── ic_launcher_foreground.xml
│       ├── mipmap-anydpi-v26/
│       │   ├── ic_launcher.xml
│       │   └── ic_launcher_round.xml
│       ├── values/
│       │   ├── colors.xml
│       │   ├── ic_launcher_background.xml
│       │   └── themes.xml
│       └── xml/
│           └── network_security_config.xml
├── rspack.config.js
├── src/
│   ├── cm/
│   │   ├── baseExtensions.ts
│   │   ├── colorView.ts
│   │   ├── commandRegistry.js
│   │   ├── editorUtils.ts
│   │   ├── indentGuides.ts
│   │   ├── lsp/
│   │   │   ├── api.ts
│   │   │   ├── clientManager.ts
│   │   │   ├── codeActions.ts
│   │   │   ├── diagnostics.ts
│   │   │   ├── documentSymbols.ts
│   │   │   ├── formatter.ts
│   │   │   ├── formattingSupport.ts
│   │   │   ├── index.ts
│   │   │   ├── inlayHints.ts
│   │   │   ├── installRuntime.ts
│   │   │   ├── installerUtils.ts
│   │   │   ├── providerUtils.ts
│   │   │   ├── references.ts
│   │   │   ├── rename.ts
│   │   │   ├── serverCatalog.ts
│   │   │   ├── serverLauncher.ts
│   │   │   ├── serverRegistry.ts
│   │   │   ├── servers/
│   │   │   │   ├── index.ts
│   │   │   │   ├── javascript.ts
│   │   │   │   ├── luau.ts
│   │   │   │   ├── python.ts
│   │   │   │   ├── shared.ts
│   │   │   │   ├── systems.ts
│   │   │   │   └── web.ts
│   │   │   ├── tooltipExtensions.ts
│   │   │   ├── transport.ts
│   │   │   ├── types.ts
│   │   │   └── workspace.ts
│   │   ├── mainEditorExtensions.ts
│   │   ├── modelist.ts
│   │   ├── modes/
│   │   │   └── luau/
│   │   │       └── index.ts
│   │   ├── rainbowBrackets.ts
│   │   ├── supportedModes.ts
│   │   ├── themes/
│   │   │   ├── aura.js
│   │   │   ├── dracula.js
│   │   │   ├── githubDark.js
│   │   │   ├── githubLight.js
│   │   │   ├── index.js
│   │   │   ├── monokai.js
│   │   │   ├── noctisLilac.js
│   │   │   ├── solarizedDark.js
│   │   │   ├── solarizedLight.js
│   │   │   ├── tokyoNight.js
│   │   │   ├── tokyoNightDay.js
│   │   │   ├── tomorrowNight.js
│   │   │   ├── tomorrowNightBright.js
│   │   │   └── vscodeDark.js
│   │   └── touchSelectionMenu.js
│   ├── components/
│   │   ├── WebComponents/
│   │   │   ├── index.js
│   │   │   └── wcPage.js
│   │   ├── audioPlayer/
│   │   │   ├── index.js
│   │   │   └── style.scss
│   │   ├── checkbox/
│   │   │   ├── index.js
│   │   │   └── styles.scss
│   │   ├── collapsableList.js
│   │   ├── contextmenu/
│   │   │   ├── index.js
│   │   │   └── style.scss
│   │   ├── fileTree/
│   │   │   ├── index.js
│   │   │   └── style.scss
│   │   ├── inputhints/
│   │   │   ├── index.js
│   │   │   └── style.scss
│   │   ├── logo/
│   │   │   ├── index.js
│   │   │   └── style.scss
│   │   ├── lspInfoDialog/
│   │   │   ├── index.js
│   │   │   └── styles.scss
│   │   ├── lspStatusBar/
│   │   │   ├── index.js
│   │   │   └── style.scss
│   │   ├── page.js
│   │   ├── palette/
│   │   │   ├── index.js
│   │   │   └── style.scss
│   │   ├── quickTools/
│   │   │   ├── footer.js
│   │   │   ├── index.js
│   │   │   ├── items.js
│   │   │   └── style.scss
│   │   ├── referencesPanel/
│   │   │   ├── index.js
│   │   │   ├── referencesTab.js
│   │   │   ├── styles.scss
│   │   │   └── utils.js
│   │   ├── scrollbar/
│   │   │   ├── index.js
│   │   │   └── style.scss
│   │   ├── searchbar/
│   │   │   ├── index.js
│   │   │   └── style.scss
│   │   ├── settingsPage.js
│   │   ├── settingsPage.scss
│   │   ├── sideButton/
│   │   │   ├── index.js
│   │   │   └── style.scss
│   │   ├── sidebar/
│   │   │   ├── index.js
│   │   │   └── style.scss
│   │   ├── symbolsPanel/
│   │   │   ├── index.js
│   │   │   └── styles.scss
│   │   ├── tabView.js
│   │   ├── terminal/
│   │   │   ├── index.js
│   │   │   ├── ligatures.js
│   │   │   ├── terminal.js
│   │   │   ├── terminalDefaults.js
│   │   │   ├── terminalManager.js
│   │   │   ├── terminalThemeManager.js
│   │   │   ├── terminalTouchSelection.css
│   │   │   └── terminalTouchSelection.js
│   │   ├── tile/
│   │   │   ├── index.js
│   │   │   └── style.scss
│   │   ├── toast/
│   │   │   ├── index.js
│   │   │   └── style.scss
│   │   ├── tutorial.js
│   │   └── virtualList/
│   │       ├── index.js
│   │       └── style.scss
│   ├── dialogs/
│   │   ├── alert.js
│   │   ├── box.js
│   │   ├── color.js
│   │   ├── confirm.js
│   │   ├── loader.js
│   │   ├── multiPrompt.js
│   │   ├── prompt.js
│   │   ├── rateBox.js
│   │   ├── select.js
│   │   └── style.scss
│   ├── fileSystem/
│   │   ├── externalFs.js
│   │   ├── ftp.js
│   │   ├── index.js
│   │   ├── internalFs.js
│   │   └── sftp.js
│   ├── handlers/
│   │   ├── editorFileTab.js
│   │   ├── intent.js
│   │   ├── keyboard.js
│   │   ├── purchase.js
│   │   ├── quickTools.js
│   │   ├── quickToolsInit.js
│   │   └── windowResize.js
│   ├── index.d.ts
│   ├── lang/
│   │   ├── ar-ye.json
│   │   ├── be-by.json
│   │   ├── bn-bd.json
│   │   ├── cs-cz.json
│   │   ├── de-de.json
│   │   ├── en-us.json
│   │   ├── es-sv.json
│   │   ├── fr-fr.json
│   │   ├── he-il.json
│   │   ├── hi-in.json
│   │   ├── hu-hu.json
│   │   ├── id-id.json
│   │   ├── ir-fa.json
│   │   ├── it-it.json
│   │   ├── ja-jp.json
│   │   ├── ko-kr.json
│   │   ├── ml-in.json
│   │   ├── mm-unicode.json
│   │   ├── mm-zawgyi.json
│   │   ├── pl-pl.json
│   │   ├── pt-br.json
│   │   ├── pu-in.json
│   │   ├── ru-ru.json
│   │   ├── tl-ph.json
│   │   ├── tr-tr.json
│   │   ├── uk-ua.json
│   │   ├── uz-uz.json
│   │   ├── vi-vn.json
│   │   ├── zh-cn.json
│   │   ├── zh-hant.json
│   │   └── zh-tw.json
│   ├── lib/
│   │   ├── acode.js
│   │   ├── actionStack.js
│   │   ├── adRewards.js
│   │   ├── applySettings.js
│   │   ├── auth.js
│   │   ├── checkFiles.js
│   │   ├── checkPluginsUpdate.js
│   │   ├── commands.js
│   │   ├── console.js
│   │   ├── constants.js
│   │   ├── devTools.js
│   │   ├── editorFile.js
│   │   ├── editorManager.js
│   │   ├── fileList.js
│   │   ├── fileTypeHandler.js
│   │   ├── fonts.js
│   │   ├── installPlugin.js
│   │   ├── installState.js
│   │   ├── keyBindings.js
│   │   ├── lang.js
│   │   ├── loadPlugin.js
│   │   ├── loadPlugins.js
│   │   ├── logger.js
│   │   ├── notificationManager.js
│   │   ├── openFile.js
│   │   ├── openFolder.js
│   │   ├── polyfill.js
│   │   ├── prettierFormatter.js
│   │   ├── projects.js
│   │   ├── recents.js
│   │   ├── remoteStorage.js
│   │   ├── removeAds.js
│   │   ├── restoreFiles.js
│   │   ├── restoreTheme.js
│   │   ├── run.js
│   │   ├── saveFile.js
│   │   ├── saveState.js
│   │   ├── searchHistory.js
│   │   ├── secureAdRewardState.js
│   │   ├── selectionMenu.js
│   │   ├── settings.js
│   │   ├── showFileInfo.js
│   │   ├── startAd.js
│   │   └── systemConfiguration.js
│   ├── main.js
│   ├── main.scss
│   ├── pages/
│   │   ├── about/
│   │   │   ├── about.js
│   │   │   ├── about.scss
│   │   │   └── index.js
│   │   ├── adRewards/
│   │   │   ├── adRewards.scss
│   │   │   └── index.js
│   │   ├── changelog/
│   │   │   ├── changelog.js
│   │   │   ├── index.js
│   │   │   └── style.scss
│   │   ├── customTheme/
│   │   │   ├── customTheme.js
│   │   │   ├── customTheme.scss
│   │   │   └── index.js
│   │   ├── fileBrowser/
│   │   │   ├── add-menu-home.hbs
│   │   │   ├── add-menu.hbs
│   │   │   ├── fileBrowser.hbs
│   │   │   ├── fileBrowser.js
│   │   │   ├── fileBrowser.scss
│   │   │   ├── index.js
│   │   │   ├── list.hbs
│   │   │   └── util.js
│   │   ├── fontManager/
│   │   │   ├── fontManager.js
│   │   │   ├── index.js
│   │   │   └── style.scss
│   │   ├── markdownPreview/
│   │   │   ├── index.js
│   │   │   ├── renderer.js
│   │   │   └── style.scss
│   │   ├── plugin/
│   │   │   ├── index.js
│   │   │   ├── plugin.js
│   │   │   ├── plugin.scss
│   │   │   └── plugin.view.js
│   │   ├── plugins/
│   │   │   ├── index.js
│   │   │   ├── item.js
│   │   │   ├── plugins.js
│   │   │   └── plugins.scss
│   │   ├── problems/
│   │   │   ├── index.js
│   │   │   ├── problems.js
│   │   │   └── style.scss
│   │   ├── quickTools/
│   │   │   ├── index.js
│   │   │   ├── quickTools.js
│   │   │   └── style.scss
│   │   ├── sponsor/
│   │   │   ├── index.js
│   │   │   ├── sponsor.js
│   │   │   └── style.scss
│   │   ├── sponsors/
│   │   │   ├── index.js
│   │   │   ├── sponsors.js
│   │   │   └── style.scss
│   │   ├── themeSetting/
│   │   │   ├── index.js
│   │   │   ├── themeSetting.js
│   │   │   └── themeSetting.scss
│   │   └── welcome/
│   │       ├── index.js
│   │       ├── welcome.js
│   │       └── welcome.scss
│   ├── palettes/
│   │   ├── changeEditorTheme/
│   │   │   └── index.js
│   │   ├── changeEncoding/
│   │   │   └── index.js
│   │   ├── changeMode/
│   │   │   └── index.js
│   │   ├── changeTheme/
│   │   │   ├── index.js
│   │   │   └── style.scss
│   │   ├── commandPalette/
│   │   │   └── index.js
│   │   └── findFile/
│   │       └── index.js
│   ├── plugins/
│   │   ├── auth/
│   │   │   ├── package.json
│   │   │   ├── plugin.xml
│   │   │   └── src/
│   │   │       └── android/
│   │   │           ├── Authenticator.java
│   │   │           └── EncryptedPreferenceManager.java
│   │   ├── browser/
│   │   │   ├── android/
│   │   │   │   └── com/
│   │   │   │       └── foxdebug/
│   │   │   │           └── browser/
│   │   │   │               ├── Browser.java
│   │   │   │               ├── BrowserActivity.java
│   │   │   │               ├── Emulator.java
│   │   │   │               ├── Menu.java
│   │   │   │               └── Plugin.java
│   │   │   ├── index.js
│   │   │   ├── package.json
│   │   │   ├── plugin.xml
│   │   │   ├── res/
│   │   │   │   └── android/
│   │   │   │       ├── menu_enter.xml
│   │   │   │       ├── menu_exit.xml
│   │   │   │       └── styles.xml
│   │   │   └── utils/
│   │   │       └── updatePackage.js
│   │   ├── cordova-plugin-buildinfo/
│   │   │   ├── .gitignore
│   │   │   ├── .npmignore
│   │   │   ├── .travis.yml
│   │   │   ├── LICENSE
│   │   │   ├── package.json
│   │   │   ├── plugin.xml
│   │   │   ├── scripts/
│   │   │   │   ├── after_install.js
│   │   │   │   ├── before_uninstall.js
│   │   │   │   └── browser_after_prepare.js
│   │   │   ├── src/
│   │   │   │   └── android/
│   │   │   │       ├── BuildInfo.gradle
│   │   │   │       └── BuildInfo.java
│   │   │   └── www/
│   │   │       └── buildinfo.js
│   │   ├── custom-tabs/
│   │   │   ├── package.json
│   │   │   ├── plugin.xml
│   │   │   ├── src/
│   │   │   │   └── CustomTabsPlugin.java
│   │   │   └── www/
│   │   │       └── customtabs.js
│   │   ├── ftp/
│   │   │   ├── LICENSE.md
│   │   │   ├── README.md
│   │   │   ├── index.d.ts
│   │   │   ├── package.json
│   │   │   ├── plugin.xml
│   │   │   ├── src/
│   │   │   │   └── android/
│   │   │   │       └── com/
│   │   │   │           └── foxdebug/
│   │   │   │               └── ftp/
│   │   │   │                   └── Ftp.java
│   │   │   └── www/
│   │   │       └── ftp.js
│   │   ├── iap/
│   │   │   ├── index.d.ts
│   │   │   ├── package.json
│   │   │   ├── plugin.xml
│   │   │   ├── src/
│   │   │   │   └── com/
│   │   │   │       └── foxdebug/
│   │   │   │           └── iap/
│   │   │   │               └── Iap.java
│   │   │   └── www/
│   │   │       └── plugin.js
│   │   ├── pluginContext/
│   │   │   ├── package.json
│   │   │   ├── plugin.xml
│   │   │   ├── src/
│   │   │   │   └── android/
│   │   │   │       └── Tee.java
│   │   │   └── www/
│   │   │       └── PluginContext.js
│   │   ├── proot/
│   │   │   ├── package.json
│   │   │   └── plugin.xml
│   │   ├── sdcard/
│   │   │   ├── index.d.ts
│   │   │   ├── package.json
│   │   │   ├── plugin.xml
│   │   │   ├── readme.md
│   │   │   ├── src/
│   │   │   │   └── android/
│   │   │   │       └── SDcard.java
│   │   │   └── www/
│   │   │       └── plugin.js
│   │   ├── server/
│   │   │   ├── index.d.ts
│   │   │   ├── package.json
│   │   │   ├── plugin.xml
│   │   │   ├── src/
│   │   │   │   └── android/
│   │   │   │       └── com/
│   │   │   │           └── foxdebug/
│   │   │   │               └── server/
│   │   │   │                   ├── NanoHTTPDWebserver.java
│   │   │   │                   └── Server.java
│   │   │   └── www/
│   │   │       └── server.js
│   │   ├── sftp/
│   │   │   ├── LICENSE.md
│   │   │   ├── README.md
│   │   │   ├── index.d.ts
│   │   │   ├── package.json
│   │   │   ├── plugin.xml
│   │   │   ├── src/
│   │   │   │   └── com/
│   │   │   │       └── foxdebug/
│   │   │   │           └── sftp/
│   │   │   │               └── Sftp.java
│   │   │   └── www/
│   │   │       └── sftp.js
│   │   ├── system/
│   │   │   ├── android/
│   │   │   │   └── com/
│   │   │   │       └── foxdebug/
│   │   │   │           └── system/
│   │   │   │               ├── RewardPassManager.java
│   │   │   │               ├── SoftInputAssist.java
│   │   │   │               ├── System.java
│   │   │   │               └── Ui.java
│   │   │   ├── package.json
│   │   │   ├── plugin.xml
│   │   │   ├── readme.md
│   │   │   ├── res/
│   │   │   │   └── android/
│   │   │   │       └── file_provider.xml
│   │   │   ├── system.d.ts
│   │   │   ├── utils/
│   │   │   │   ├── changeProvider.js
│   │   │   │   ├── fixProvider.js
│   │   │   │   └── resetProvider.js
│   │   │   └── www/
│   │   │       └── plugin.js
│   │   ├── terminal/
│   │   │   ├── package.json
│   │   │   ├── plugin.xml
│   │   │   ├── scripts/
│   │   │   │   ├── init-alpine.sh
│   │   │   │   ├── init-sandbox.sh
│   │   │   │   └── rm-wrapper.sh
│   │   │   ├── src/
│   │   │   │   └── android/
│   │   │   │       ├── AlpineDocumentProvider.java
│   │   │   │       ├── BackgroundExecutor.java
│   │   │   │       ├── Executor.java
│   │   │   │       ├── ProcessManager.java
│   │   │   │       ├── ProcessServer.java
│   │   │   │       ├── ProcessUtils.java
│   │   │   │       ├── StreamHandler.java
│   │   │   │       └── TerminalService.java
│   │   │   └── www/
│   │   │       ├── Executor.js
│   │   │       └── Terminal.js
│   │   └── websocket/
│   │       ├── README.md
│   │       ├── package.json
│   │       ├── plugin.xml
│   │       ├── src/
│   │       │   └── android/
│   │       │       ├── WebSocketInstance.java
│   │       │       └── WebSocketPlugin.java
│   │       └── www/
│   │           └── websocket.js
│   ├── res/
│   │   ├── file-icons/
│   │   │   └── style.css
│   │   └── icons/
│   │       └── style.css
│   ├── settings/
│   │   ├── appSettings.js
│   │   ├── backupRestore.js
│   │   ├── editorSettings.js
│   │   ├── filesSettings.js
│   │   ├── formatterSettings.js
│   │   ├── helpSettings.js
│   │   ├── lspConfigUtils.js
│   │   ├── lspServerDetail.js
│   │   ├── lspSettings.js
│   │   ├── mainSettings.js
│   │   ├── previewSettings.js
│   │   ├── scrollSettings.js
│   │   ├── searchSettings.js
│   │   └── terminalSettings.js
│   ├── sidebarApps/
│   │   ├── extensions/
│   │   │   ├── index.js
│   │   │   └── style.scss
│   │   ├── files/
│   │   │   ├── index.js
│   │   │   └── style.scss
│   │   ├── index.js
│   │   ├── notification/
│   │   │   ├── index.js
│   │   │   └── style.scss
│   │   ├── searchInFiles/
│   │   │   ├── cmResultView.js
│   │   │   ├── index.js
│   │   │   ├── styles.scss
│   │   │   └── worker.js
│   │   └── sidebarApp.js
│   ├── styles/
│   │   ├── codemirror.scss
│   │   ├── console.m.scss
│   │   ├── fileInfo.scss
│   │   ├── fonts.scss
│   │   ├── keyframes.scss
│   │   ├── list.scss
│   │   ├── markdown.scss
│   │   ├── mixins.scss
│   │   ├── overrideAceStyle.scss
│   │   ├── page.scss
│   │   └── wideScreen.scss
│   ├── test/
│   │   ├── ace.test.js
│   │   ├── editor.tests.js
│   │   ├── exec.tests.js
│   │   ├── sanity.tests.js
│   │   ├── tester.js
│   │   └── url.tests.js
│   ├── theme/
│   │   ├── builder.js
│   │   ├── list.js
│   │   └── preInstalled.js
│   ├── utils/
│   │   ├── Path.js
│   │   ├── Uri.js
│   │   ├── Url.js
│   │   ├── codeHighlight.js
│   │   ├── color/
│   │   │   ├── hex.js
│   │   │   ├── hsl.js
│   │   │   ├── index.js
│   │   │   ├── regex.js
│   │   │   └── rgb.js
│   │   ├── encodings.js
│   │   ├── helpers.js
│   │   ├── keyboardEvent.js
│   │   ├── polyfill.js
│   │   └── taskManager.js
│   └── views/
│       ├── console.hbs
│       ├── file-info.hbs
│       ├── file-menu.hbs
│       ├── markdown.hbs
│       ├── menu.hbs
│       └── rating.hbs
├── tsconfig.json
├── utils/
│   ├── code-editor-icon.icomoon.json
│   ├── config.js
│   ├── custom-loaders/
│   │   └── html-tag-jsx-loader.js
│   ├── lang.js
│   ├── loadStyles.js
│   ├── scripts/
│   │   ├── build.sh
│   │   ├── clean.sh
│   │   ├── generate-release-notes.js
│   │   ├── plugin.sh
│   │   ├── setup.sh
│   │   └── start.sh
│   ├── setup.js
│   ├── storage_manager.mjs
│   └── updateAce.js
├── webpack.config.js
└── www/
    └── index.html

================================================
FILE CONTENTS
================================================

================================================
FILE: .babelrc
================================================
{
  "presets": [
    [
      "@babel/preset-env",
      {
        "useBuiltIns": "entry",
        "corejs": "3.22"
      }
    ],
    "@babel/preset-typescript"
  ],
  "plugins": [
    "html-tag-js/jsx/jsx-to-tag.js",
    "html-tag-js/jsx/syntax-parser.js",
    "@babel/plugin-transform-runtime",
    "@babel/plugin-transform-block-scoping"
  ],
  "compact": false,
  "sourceMaps": "inline"
}

================================================
FILE: .devcontainer/Dockerfile
================================================
# Acode Development Container - Standalone Docker Build
# 
# This Dockerfile is for MANUAL Docker builds (docker build/run).
# Usage:
#   docker build -t acode-dev .devcontainer/
#   docker run -it -v $(pwd):/workspaces/acode acode-dev

FROM mcr.microsoft.com/devcontainers/java:1-21-bullseye

ARG ANDROID_PLATFORM=35
ARG ANDROID_BUILD_TOOLS=35.0.0
ARG CMDLINE_TOOLS_VERSION=11076708
ARG NODE_VERSION=22
ARG GRADLE_VERSION=8.11

ENV ANDROID_HOME=/opt/android-sdk
ENV ANDROID_SDK_ROOT=/opt/android-sdk
ENV GRADLE_HOME=/opt/gradle
ENV PATH="${PATH}:${ANDROID_HOME}/cmdline-tools/latest/bin:${ANDROID_HOME}/platform-tools:${GRADLE_HOME}/bin"

RUN apt-get update && apt-get install -y --no-install-recommends \
    wget \
    unzip \
    && rm -rf /var/lib/apt/lists/*

# Install Gradle
RUN wget -q "https://services.gradle.org/distributions/gradle-${GRADLE_VERSION}-bin.zip" -O /tmp/gradle.zip \
    && unzip -q /tmp/gradle.zip -d /opt \
    && rm /tmp/gradle.zip \
    && ln -s /opt/gradle-${GRADLE_VERSION} ${GRADLE_HOME}

# Install fnm and Node.js
ENV FNM_DIR=/usr/local/fnm
ENV PATH="${FNM_DIR}:${PATH}"
RUN curl -fsSL https://fnm.vercel.app/install | bash -s -- --install-dir "${FNM_DIR}" --skip-shell \
    && eval "$(${FNM_DIR}/fnm env)" \
    && fnm install ${NODE_VERSION} \
    && fnm default ${NODE_VERSION} \
    && npm install -g pnpm

ENV PATH="${FNM_DIR}/aliases/default/bin:${PATH}"

# Install Android SDK
RUN mkdir -p ${ANDROID_HOME}/cmdline-tools \
    && cd ${ANDROID_HOME}/cmdline-tools \
    && wget -q "https://dl.google.com/android/repository/commandlinetools-linux-${CMDLINE_TOOLS_VERSION}_latest.zip" -O cmdline-tools.zip \
    && unzip -q cmdline-tools.zip \
    && rm cmdline-tools.zip \
    && mv cmdline-tools latest \
    && yes | ${ANDROID_HOME}/cmdline-tools/latest/bin/sdkmanager --licenses 2>/dev/null || true \
    && ${ANDROID_HOME}/cmdline-tools/latest/bin/sdkmanager --update \
    && ${ANDROID_HOME}/cmdline-tools/latest/bin/sdkmanager \
        "platform-tools" \
        "platforms;android-${ANDROID_PLATFORM}" \
        "build-tools;${ANDROID_BUILD_TOOLS}"

WORKDIR /workspaces/acode

LABEL maintainer="Acode Foundation"
LABEL description="Development environment for building Acode - Code Editor for Android"


================================================
FILE: .devcontainer/devcontainer.json
================================================
{
  "name": "Acode Development",
  "image": "mcr.microsoft.com/devcontainers/java:1-21-bullseye",

  "features": {
    "ghcr.io/devcontainers/features/java:1": {
      "installGradle": true,
      "installGroovy": false,
      "installMaven": false,
      "installAnt": false,
      "version": "21",
      "jdkDistro": "ms",
      "gradleVersion": "latest"
    },
    "ghcr.io/nordcominc/devcontainer-features/android-sdk:1": {
      "platform": "35",
      "build_tools": "35.0.0"
    },
    "ghcr.io/devcontainers/features/node:1": {
      "nodeGypDependencies": false,
      "installYarnUsingApt": false,
      "version": "lts",
      "pnpmVersion": "latest",
      "nvmVersion": "latest"
    }
  },

  "postCreateCommand": "pnpm run setup",

  "customizations": {
    "vscode": {
      "extensions": ["biomejs.biome", "redhat.java"],
      "settings": {
        "editor.formatOnSave": true,
        "editor.defaultFormatter": "biomejs.biome",
        "[java]": {
          "editor.defaultFormatter": "redhat.java"
        }
      }
    }
  }
}


================================================
FILE: .dockerignore
================================================
# Dependencies
node_modules/
.pnpm-store/

# Build outputs
platforms/
plugins/
www/css/build/
www/js/build/

# IDE
.vscode/
.idea/

# Git
.git/
.gitignore

# Misc
*.log
*.apk
*.aab
.DS_Store
Thumbs.db


================================================
FILE: .gitattributes
================================================
*.sh text eol=lf


================================================
FILE: .github/CODEOWNERS
================================================
.github/CODEOWNERS @Acode-Foundation/acode 

# workflows
.github/workflows/nightly-build.yml @unschooledgamer
.github/workflows/on-demand-preview-releases-PR.yml @unschooledgamer
.github/workflows/community-release-notifier.yml @unschooledgamer


================================================
FILE: .github/ISSUE_TEMPLATE/0_bug_report.yml
================================================
name: Bug Report
description: |
  Use this template for bug reports.
labels: []
body:
  - type: checkboxes
    attributes:
      label: Check for existing issues
      description: Check the backlog of issues to reduce duplicates; if an issue already exists, place a 👍 on it.
      options:
        - label: Completed
          required: true
  - type: textarea
    attributes:
      label: Describe the bug / provide steps to reproduce it
      description: A clear and concise description of what the bug is. If possible, then include a clip
    validations:
      required: true
  - type: textarea
    id: environment
    attributes:
      label: Environment
      description: Provide your app version, Android version, webview version, etc (Search "Copy Device Info" in command palette to get all these info and share it)
    validations:
      required: true
  - type: textarea
    attributes:
      label: If applicable, add mockups / screenshots regarding your vision
      description: Drag issues into the text input below
    validations:
      required: false
  - type: textarea
    attributes:
      label: If applicable, attach your Acode.log file to this issue.
      description: |
        Search for `Open Log File` in Acode command palette, it will open Acode.log file then share it
        or Check this location for log file: `/storage/emulated/0/Android/com.foxdebug.acode{in case of free version there will be bit more}/files/Acode.log`
      value: |
        <details><summary>Acode.log</summary><pre>
        <!-- Click below this line and paste or drag-and-drop your log-->

        <!-- Click above this line and paste or drag-and-drop your log--></pre></details>
    validations:
      required: false


================================================
FILE: .github/ISSUE_TEMPLATE/1_feature_request.yml
================================================
name: Feature Request
description: "Suggest a new feature for Acode"
labels: ["enhancement"]
body:
  - type: checkboxes
    attributes:
      label: Check for existing issues
      description: Check the backlog of issues to reduce duplicates; if an issue already exists, place a `+1` (👍) on it.
      options:
        - label: Completed
          required: true
  - type: textarea
    attributes:
      label: Describe the feature
      description: A clear and concise description of what you want to happen.
    validations:
      required: true
  - type: textarea
    attributes:
      label: |
        If applicable, add mockups / screenshots to help present your vision of the feature
      description: Drag images into the text input below
    validations:
      required: false


================================================
FILE: .github/ISSUE_TEMPLATE/config.yml
================================================
blank_issues_enabled: false
contact_links:
  - name: Ask Questions
    url: https://github.com/Acode-Foundation/Acode/discussions
    about: Ask any questions regarding Acode and its ecosystem
  - name: Telegram Group
    url: https://t.me/foxdebug_acode
    about: Friendly Acode Community for helps regarding Acode, development and more
  - name: Discord Server
    url: https://discord.gg/vVxVWYUAWD
    about: Acode discord server 


================================================
FILE: .github/dependabot.yml
================================================
# To get started with Dependabot version updates, you'll need to specify which
# package ecosystems to update and where the package manifests are located.
# Please see the documentation for more information:
# https://docs.github.com/github/administering-a-repository/configuration-options-for-dependency-updates
# https://containers.dev/guide/dependabot

version: 2
updates:
 - package-ecosystem: "devcontainers"
   directory: "/"
   schedule:
     interval: weekly
 
 - package-ecosystem: "github-actions"
   directory: "/"
   schedule:
     interval: weekly


================================================
FILE: .github/labeler.yml
================================================
translations:
  - any: 
    - changed-files: 
      - any-glob-to-any-file: 'src/lang/*.json'

docs:
  - any: 
    - changed-files: 
      - any-glob-to-any-file: '**/*.md'

enhancement:
  - any:
    - head-branch: ['^feature', 'feature', '^feat', '^add']

================================================
FILE: .github/workflows/add-pr-labels.yml
================================================
name: Add Pull Requests Labels
on: 
    pull_request_target: 
        types: [opened, closed, ready_for_review]

jobs:
    add-labels:
        timeout-minutes: 5
        runs-on: ubuntu-latest
        
        if: github.event.action == 'opened'
        permissions: 
            contents: read
            pull-requests: write
        
        steps:
            - uses: actions/labeler@v6


================================================
FILE: .github/workflows/ci.yml
================================================
name: CI

on:
  push:
  pull_request:

jobs:
  spell-check:
    timeout-minutes: 5
    name: Check spelling
    runs-on: ubuntu-latest

    steps:
      - name: Checkout Actions Repository
        uses: actions/checkout@v6

      - name: Check spelling
        uses: crate-ci/typos@master
        with:
          config: ./_typos.toml

  quality:
    timeout-minutes: 5
    name: Linting and formatting
    runs-on: ubuntu-latest

    steps:
      - name: Checkout repository
        uses: actions/checkout@v6

      - name: Setup Biome
        uses: biomejs/setup-biome@v2

      - name: Run Biome
        run: biome ci .

  translation-check:
    name: Translation Check (On PR Only)
    timeout-minutes: 5
    runs-on: ubuntu-latest
    permissions: 
      contents: read
      pull-requests: read
    if: github.event_name == 'pull_request'
    steps:
      - name: Checkout Repository
        uses: actions/checkout@v6
      - name: Use Node.js
        uses: actions/setup-node@v6
        with:
          cache: npm
          cache-dependency-path: '**/package-lock.json'

      - name: Detect Changed Files
        uses: dorny/paths-filter@v4
        id: file-changes
        with:
          list-files: shell
          filters: |
            translation:
              - 'src/lang/*.json'
          token: ${{ secrets.GITHUB_TOKEN }}
      - name: Translation Files Check (if changed)
        if: steps.file-changes.outputs.translation == 'true'
        run: |
            npm ci --no-audit --no-fund
            npm run lang check

================================================
FILE: .github/workflows/close-inactive-issues.yml
================================================
name: Close inactive issues
on:
  schedule:
    - cron: "30 1 * * *"

jobs:
  close-issues:
    runs-on: ubuntu-latest
    permissions:
      issues: write
      pull-requests: write
    steps:
      - uses: actions/stale@v10
        with:
          days-before-issue-stale: 60
          days-before-issue-close: 14
          stale-issue-label: "stale"
          stale-issue-message: >
            Hi there! 👋

            We're working to clean up our issue tracker by closing older issues that might not be relevant anymore. If you are able to reproduce this issue in the latest version of Acode, please let us know by commenting on this issue(i.e Bump!), and we will keep it open. If you can't reproduce it, feel free to close the issue yourself. Otherwise, we'll close it in 14 days.

            Thanks for your help!
          close-issue-message: "This issue was closed because it has been inactive for 14 days since being marked as stale."
          exempt-all-milestones: true
          days-before-pr-stale: -1
          days-before-pr-close: -1
          exempt-issue-labels: "new plugin idea, todo, enhancement, bug, Low priority, documentation"
          operations-per-run: 100
          repo-token: ${{ secrets.GITHUB_TOKEN }}
          


================================================
FILE: .github/workflows/community-release-notifier.yml
================================================
name: community-release-notifier

on:
  release:
    types: [ released ]
  workflow_call:
    inputs:
      tag_name:
        required: true
        description: "Release tag_name"
        type: 'string'
      url:
        required: true
        description: "release URL"
        type: 'string'
      body:
        required: true
        description: "Release Body"
        type: 'string'
        default: ''
    secrets:
      DISCORD_WEBHOOK_RELEASE_NOTES:
        description: 'Discord Webhook for Notifying Releases to Discord'
        required: true
      TELEGRAM_BOT_TOKEN:
        description: 'Telegram Bot Token'
        required: true
      TELEGRAM_CHAT_ID:
        description: 'Telegram Chat ID (group/channel/supergroup)'
        required: true
      TELEGRAM_MESSAGE_THREAD_ID:
        description: 'Topic / message_thread_id for Telegram forum/topic'
        required: true

jobs:
  notify:
    if: github.repository_owner == 'Acode-Foundation'
    runs-on: ubuntu-latest
    steps:
      - name: Prepare release variables
        id: vars
        env:
          INPUT_TAG: ${{ github.event.release.tag_name || inputs.tag_name }}
          INPUT_URL: ${{ github.event.release.url || inputs.url }}
          INPUT_BODY: ${{ github.event.release.body || inputs.body }}
        run: |
          TAG="$INPUT_TAG"
          URL="$INPUT_URL"
          
          # Generate a random delimiter (hex string, safe and collision-resistant)
          DELIMITER=$(openssl rand -hex 16 || head -c 16 /dev/urandom | xxd -p -c 16)
          
          # Escape problematic characters for MarkdownV2 (very conservative escaping)
          # We escape: _ * [ ] ( ) ~ ` > # + - = | { } . ! \
          BODY_SAFE=$(printf '%s' "$INPUT_BODY" | \
            sed 's/[_*[\]()~`>#+=|{}.!\\-]/\\&/g')
          TAG_SAFE=$(printf '%s' "$TAG" | sed 's/[_*[\]()~`>#+=|{}.!\\-]/\\&/g')

          if [[ "$TAG" == *"-nightly"* ]]; then
            SUFFIX=" \(Nightly Release\)"
            SUFFIXPLAIN=" (Nightly Release)"
          else
            SUFFIX=""
            SUFFIXPLAIN=""
          fi

          # Announcement line — also escape for safety
          ANNOUNCE_SAFE="📢 Acode [$TAG_SAFE]($URL) was just Released 🎉${SUFFIX}\\!"

          echo "announce=$ANNOUNCE_SAFE" >> $GITHUB_OUTPUT
          {
            echo "body_safe<<$DELIMITER"
            printf '%s\n' "$BODY_SAFE"
            echo "$DELIMITER"
          } >> $GITHUB_OUTPUT

          # Plain (MD) Announcement for Discord
          ANNOUNCE_PLAIN="📢 Acode [$TAG](<$URL>) was just Released 🎉${SUFFIXPLAIN}!"
          echo "announce_plain=$ANNOUNCE_PLAIN" >> $GITHUB_OUTPUT
          {
            echo "body_plain<<$DELIMITER"
            printf '%s\n' "$INPUT_BODY"
            echo "$DELIMITER"
          } >> $GITHUB_OUTPUT

      # ────────────────────────────────────────────────
      # Truncate for Discord
      # ────────────────────────────────────────────────
      - name: Truncate message for Discord
        id: truncate-discord
        uses: 2428392/gh-truncate-string-action@b3ff790d21cf42af3ca7579146eedb93c8fb0757  # v1.4.1
        env: 
          # https://github.blog/changelog/2025-09-19-deprecation-of-node-20-on-github-actions-runners/
          FORCE_JAVASCRIPT_ACTIONS_TO_NODE24: true
        with:
          maxLength: 2000
          stringToTruncate: |
            ${{ steps.vars.outputs.announce_plain }}

            ${{ steps.vars.outputs.body_plain }}

      # ────────────────────────────────────────────────
      # Discord notification
      # ────────────────────────────────────────────────
      - name: Discord Webhook (Publishing)
        uses: tsickert/discord-webhook@b217a69502f52803de774ded2b1ab7c282e99645  # v7.0.0
        env:
          # https://github.blog/changelog/2025-09-19-deprecation-of-node-20-on-github-actions-runners/
          FORCE_JAVASCRIPT_ACTIONS_TO_NODE24: true
        with:
          webhook-url: ${{ secrets.DISCORD_WEBHOOK_RELEASE_NOTES }}
          content: ${{ steps.truncate-discord.outputs.string }}
          flags: 4 # 1 << 2 - SUPPRESS_EMBEDS!

      # ────────────────────────────────────────────────
      # Telegram notification — MarkdownV2 + no link preview
      # ────────────────────────────────────────────────
      - name: Send to Telegram
        #if: ${{ secrets.TELEGRAM_BOT_TOKEN != '' && secrets.TELEGRAM_CHAT_ID != '' && secrets.TELEGRAM_MESSAGE_THREAD_ID != '' }}
        uses: Salmansha08/telegram-github-action@17c9ce6b4210d2659dca29d34028b02fa29d70ad  # or newer tag if available
        with:
          to: ${{ secrets.TELEGRAM_CHAT_ID }}
          token: ${{ secrets.TELEGRAM_BOT_TOKEN }}
          message: |
            ${{ steps.vars.outputs.announce }}

            ${{ steps.vars.outputs.body_safe }}
          format: markdown
          disable_web_page_preview: true
          # Only needed for topic-enabled supergroups/channels
          message_thread_id: ${{ secrets.TELEGRAM_MESSAGE_THREAD_ID }}
        continue-on-error: true


================================================
FILE: .github/workflows/nightly-build.yml
================================================
# Implement to use environment secrets someday, At the moment GH Actions doesn't support those in reusable workflows (ref: https://github.com/actions/runner/issues/1490)
# at least that's what I found.
  name: Nightly Build

  on:
    schedule:
      # Fire every day at 7:00am UTC (Roughly before EU workday and after US workday)
      - cron: "0 7 * * *"
    push:
      tags:
        - nightly
    workflow_call:
      inputs:
        is_PR:
          default: false
          type: boolean
          description: If a Pull Request has triggered it.
        PR_NUMBER:
          required: true
          type: number
          description: The Pull Request that triggered this workflow
        skip_tagging_and_releases:
          required: false
          default: true
          type: boolean
          description: Skips Tagging & releases, since workflow_call isn't available for github.event_name, default is true
      outputs:
        job_result:
          description: "Build job result"
          value: ${{ jobs.build.result }}

    workflow_dispatch:
      inputs:
        skip_tagging_and_releases:
          required: false
          default: true
          type: boolean
          description: Skips Tagging & releases, since workflow_call isn't available for github.event_name, default is true

  concurrency:
    # Allow only one workflow per any non-`main` branch.
    group: ${{ github.workflow }}-${{ github.ref_name }}-${{ github.ref_name == 'main' && github.sha || 'anysha' }}-${{ inputs.is_PR && 'is_PR' || 'not_PR'}}
    cancel-in-progress: true

  permissions:
    contents: read

  env:
    STORE_FILE_PATH: /tmp/app-debug.keystore
    BUILD_JSON_PATH: build.json
    VERSION_LABEL: ${{ (inputs.is_PR && 'pr') || 'nightly' }}
    DISCORD_RELEASE_NOTIFIER_ENABLED: "true"
  jobs:
    build:
      timeout-minutes: 60
      runs-on: ubuntu-latest
      if: github.repository_owner == 'Acode-Foundation'

      permissions:
#        contents write is needed to create Nightly Releases.
        contents: write
#        issues: write
        pull-requests: write

      outputs:
         release_output_url: ${{ steps.release.outputs.url }} 
         updated_version: ${{ steps.update-version.outputs.UPDATED_VERSION}} 
         RELEASE_NOTES: ${{ env.RELEASE_NOTES }}
      steps:
        - name: Fast Fail if secrets are missing
          if: ${{ env.KEYSTORE_CONTENT == '' || env.BUILD_JSON_CONTENT == '' }}
          env:
             KEYSTORE_CONTENT: ${{ secrets.KEYSTORE_CONTENT }} 
             BUILD_JSON_CONTENT: ${{ secrets.BUILD_JSON_CONTENT }} 
          run: |
            echo "::error title=Missing Secrets::KEYSTORE_CONTENT or BUILD_JSON_CONTENT secrets are missing! Aborting workflow."
            exit 1
        
        - name: Logging & summaries
          run: |
            echo "::group::Logging" 
            echo "🎯 github trigger event name: ${{ github.event_name }}"
            echo "is_PR: ${{ inputs.is_PR }} "
            echo "PR_NUMBER: ${{ inputs.PR_NUMBER }}" 
            echo "env: STORE_FILE_PATH: ${{ env.STORE_FILE_PATH }}" 
            echo "env: BUILD_JSON_PATH: ${{ env.BUILD_JSON_PATH }}" 
            echo "env: VERSION_LABEL: ${{ env. VERSION_LABEL }}"
            echo "github sha: ${{ github.sha }}" 
            echo "should not skip tags, releases: ${{ ! inputs.skip_tagging_and_releases }} " 
            echo "🤐 env: NORMAL_APK_PATH: ${{ env.NORMAL_APK_PATH }}"
            echo "🤐 env: FDROID_APK_PATH: ${{ env.FDROID_APK_PATH }}"            
            echo "::endgroup::" 
            
            echo "## 🚀 Build Type: ${{ env.VERSION_LABEL }}" >> $GITHUB_STEP_SUMMARY
            echo "is_PR: ${{ inputs.is_PR || 'NOT a PR' }}" >> $GITHUB_STEP_SUMMARY
            echo "PR_NUMBER: ${{ inputs.PR_NUMBER || 'not a PR' }}" >> $GITHUB_STEP_SUMMARY
            echo "should not skip tags, releases: ${{ ! inputs.skip_tagging_and_releases }}" >> $GITHUB_STEP_SUMMARY     

        - name: Checkout Repository
          uses: actions/checkout@v6
          with:
            fetch-depth: 0 # Required for tags
            # persists credentials locally if tagging and releases are not skipped.
            persist-credentials: ${{ ! inputs.skip_tagging_and_releases }}
            ref: ${{ (inputs.is_PR && inputs.PR_NUMBER) && github.event.pull_request.head.sha || '' }}

        - name: Set up Java 21
          uses: actions/setup-java@v5
          with:
            distribution: 'temurin'
            java-version: '21'
            cache: ${{ (!(inputs.is_PR && inputs.PR_NUMBER) && github.ref == 'refs/heads/main' && 'gradle') || '' }}

        - name: Set up Node.js
          uses: actions/setup-node@v6
          with:
            node-version: 'lts/*' # or '18.x' for latest stable
            cache: ${{ (!(inputs.is_PR && inputs.PR_NUMBER) && github.ref == 'refs/heads/main' && 'npm') || '' }}

        - name: Add keystore and build.json from secrets
          run: |
            echo "${{ secrets.KEYSTORE_CONTENT }}" | base64 -d > ${{ env.STORE_FILE_PATH }}
            echo "${{ secrets.BUILD_JSON_CONTENT }}" | base64 -d > ${{ env.BUILD_JSON_PATH }}
            echo "Keystore and build.json added successfully."

        - name: Export Commit Hash & prev tag
          run: |
            echo "GIT_COMMIT=$(git rev-parse HEAD)" >> $GITHUB_ENV
            echo "PREV_TAG=$(git describe --tags --abbrev=0 || git rev-list --max-parents=0 HEAD)" >> $GITHUB_ENV

        - name: Extract versionCode and version from config.xml
          id: extract_version
          run: |
            if [ ! -f config.xml ]; then
            echo "config.xml not found!"
            exit 1
            fi
            VERSION_CODE=$(grep 'versionCode=' config.xml | sed -E 's/.*versionCode="([0-9]+)".*/\1/')
            VERSION=$(grep -oP 'version="\K[0-9.]+' config.xml)
            echo "VERSION_CODE=$VERSION_CODE" >> $GITHUB_OUTPUT
            echo "VERSION=$VERSION" >> $GITHUB_OUTPUT
            echo "Extracted Version Code: $VERSION_CODE"
            echo "Extracted Version: $VERSION"

        - name: Append Commit Hash to Version and Update config.xml
          id: update-version 
          run: |
            SHORT_COMMIT_HASH=$(echo "${{ env.GIT_COMMIT }}" | cut -c 1-7)
            if ${{ inputs.is_PR  || false }}; then 
              PR_NUMBER=${{ inputs.PR_NUMBER }}
            else
              PR_NUMBER=
            fi
            UPDATED_VERSION="${{ steps.extract_version.outputs.VERSION }}-${{ env.VERSION_LABEL }}.${PR_NUMBER:-$SHORT_COMMIT_HASH}"
            echo "Updated Version: $UPDATED_VERSION"
            
            # Update config.xml with the new version
            sed -i "s/version=\"${{ steps.extract_version.outputs.VERSION }}\"/version=\"$UPDATED_VERSION\"/g" config.xml
            echo "Updated version in config.xml"
            # Output the updated version
            echo "UPDATED_VERSION=$UPDATED_VERSION" >> $GITHUB_ENV
            echo "UPDATED_VERSION=$UPDATED_VERSION" >> $GITHUB_OUTPUT
            echo "NORMAL_APK_PATH=/tmp/acode-debug-normal-${UPDATED_VERSION}.apk" >> $GITHUB_ENV
            echo "FDROID_APK_PATH=/tmp/acode-debug-fdroid-${UPDATED_VERSION}.apk" >> $GITHUB_ENV

        - name: Install Node.js Packages
          run: npm install

        - name: Install Cordova CLI
          run: npm install -g cordova

        - name: Run npm setup
          run: npm run setup

        - name: Run npm build paid dev apk
          run: |
             node utils/storage_manager.mjs y
             npm run build paid dev apk
             mv platforms/android/app/build/outputs/apk/debug/app-debug.apk ${{ env.NORMAL_APK_PATH }}
             echo "VERSION: $UPDATED_VERSION" >> $GITHUB_STEP_SUMMARY
             
        - name: Upload APK Artifact
          uses: actions/upload-artifact@v7
          with:
            name: app-debug-${{ env.GIT_COMMIT }}
            path: ${{ env.NORMAL_APK_PATH }}
        
        - name: Run npm build paid dev apk fdroid (for F-Droid)
          if: ${{ !inputs.is_PR }}
          run: |
            node utils/storage_manager.mjs y
            npm run build paid dev apk fdroid
            mv platforms/android/app/build/outputs/apk/debug/app-debug.apk ${{ env.FDROID_APK_PATH }}
        
        - name: Upload APK Artifact
          uses: actions/upload-artifact@v7
          if: ${{ !inputs.is_PR }}
          with:
            name: app-debug-fdroid-${{ env.GIT_COMMIT }}
            path: ${{ env.FDROID_APK_PATH }}

        - name: remove keystore and build.json
          run: |
            rm $STORE_FILE_PATH $BUILD_JSON_PATH
            echo "Keystore and build.json removed successfully."
        
        - name: Check Nightly Tag and Force Update
          #if: github.event_name == 'push' && contains(github.event.ref, 'tags/nightly') == false
          if: ${{ ! inputs.skip_tagging_and_releases }}
          id: check-nightly-tag-force-update
          run: |
            # Check if the nightly tag exists and get the commit it points to
            if git show-ref --quiet refs/tags/nightly; then
              TAG_COMMIT=$(git rev-parse nightly)
            else
              TAG_COMMIT=""
            fi
            
            # If the current commit is the same as the tag, skip updating the tag
            if [ "$TAG_COMMIT" != "${{ env.GIT_COMMIT }}" ]; then
              echo "releaseRequired=true" >> $GITHUB_ENV
              # export tag commit before updating for change logs comparing. 
              echo "TAG_COMMIT=$TAG_COMMIT" >> $GITHUB_ENV 
            
              git config --global user.name 'GitHub Actions'
              git config --global user.email 'github-actions@github.com'
              git tag -f nightly
              git push origin nightly --force
            else
              echo "Nightly tag already points to this commit. Skipping update."
            fi

        # 🚨⚠️ WARNING: the GITHUB_TOKEN under this step, has access to write & read access to Contents, Pull Requests
        # Which is why, it uses a fine-granted token with Read-Only Access to Public Repos Only.
        - name: Generate Release Notes (Experimental)
          if: ${{ success() && env.releaseRequired == 'true' }}
          id: gen-release-notes
          continue-on-error: true
          run: |
              RELEASE_NOTES=$(node utils/scripts/generate-release-notes.js ${{ github.repository_owner }} Acode ${{ github.sha }} --format md --from-tag ${{ env.TAG_COMMIT }} --important-only --quiet --changelog-only)
              {
                echo "RELEASE_NOTES<<EOF"
                echo "$RELEASE_NOTES"
                echo "EOF"
              } >> $GITHUB_ENV        
          env: 
            GITHUB_TOKEN: ${{ secrets.NIGHTLY_RELEASE_NOTES_GH_TOKEN }}
        - name: Release Nightly Version
#          Only run this step, if not called from another workflow. And a previous step is successful with releasedRequired=true
          id: release
          if: ${{ ! inputs.skip_tagging_and_releases && steps.check-nightly-tag-force-update.outcome == 'success' && env.releaseRequired == 'true' && !inputs.is_PR }}
          uses: softprops/action-gh-release@v2
          env:
            FORCE_JAVASCRIPT_ACTIONS_TO_NODE24: true
          with:
            prerelease: true
            name: ${{ env.UPDATED_VERSION }}
            tag_name: ${{ env.UPDATED_VERSION }} 
            files: |
              ${{ env.NORMAL_APK_PATH }}
              ${{ env.FDROID_APK_PATH }}
            body: |
              Automated Nightly (pre-release) Releases for Today
              
              [Compare Changes](https://github.com/${{ github.repository }}/compare/${{ env.TAG_COMMIT }}...${{ github.sha }})

              ${{ env.RELEASE_NOTES }}

        - name: Update Last Comment by bot (If ran in PR)
          if: inputs.is_PR
          uses: marocchino/sticky-pull-request-comment@v3
          with:
             hide_and_recreate: true
             hide_classify: "OUTDATED"
             header: on-demand-build-status
             message: |
                   Preview Release for this, has been built.
         
                   [Click here to view that github actions build](https://github.com/${{ github.repository}}/actions/runs/${{ github.run_id }})
             

    community-release-notifier:
      needs: build
#      Run only if push tags, or triggered by a schedule
      if: ${{ github.repository_owner == 'Acode-Foundation' && (contains(fromJSON('["push", "schedule"]'), github.event_name) || ! inputs.skip_tagging_and_releases) && needs.build.outputs.release_output_url }}
      uses: Acode-Foundation/acode/.github/workflows/community-release-notifier.yml@main
      with:
         tag_name: ${{ needs.build.outputs.updated_version }}
         url: ${{ needs.build.outputs.release_output_url }}
         body: ${{ needs.build.outputs.RELEASE_NOTES }}
      secrets:
        DISCORD_WEBHOOK_RELEASE_NOTES: ${{ secrets.DISCORD_WEBHOOK_RELEASE_NOTES }}
        TELEGRAM_BOT_TOKEN: ${{ secrets.TELEGRAM_BOT_TOKEN }}
        TELEGRAM_CHAT_ID: ${{ secrets.TELEGRAM_CHAT_ID }}
        TELEGRAM_MESSAGE_THREAD_ID: ${{ secrets.TELEGRAM_MESSAGE_THREAD_ID }}


================================================
FILE: .github/workflows/on-demand-preview-releases-PR.yml
================================================
name: On Demand Preview Releases for PR
#  avoids paths like .md, and anything in .github folder
on:
  pull_request_target:
    paths-ignore:
      - '!*.md'
#      - '.github/**'
    types: [labeled, synchronize]

# defined at workflow-level as the workflow, Requires these permissions to function.
permissions:
  contents: write
  pull-requests: write
  # All Pull Requests are issues, but not all issues are Pull Requests (like GitHub says 🙃)
  issues: write

concurrency:
  # Allow only one workflow per any non-`main` branch.
  group: ${{ github.workflow }}-${{ github.ref_name }}-${{ github.ref_name == 'main' && github.sha || 'anysha' }}
  cancel-in-progress: true

jobs:
  job_trigger:
    name: Trigger Preview Release (if conditions met)
    if: |
        github.event.pull_request.draft == false
        && (github.repository_owner == 'Acode-Foundation'
        && (!contains(github.event.pull_request.labels.*.name, 'DO NOT PREVIEW RELEASE') 
        && (contains(github.event.pull_request.labels.*.name, 'Bypass check - PREVIEW RELEASE') 
        || contains(github.event.pull_request.labels.*.name, 'CI: RUN ON-DEMAND PREVIEW RELEASES')))
        )

    runs-on: ubuntu-latest

    steps:
      - name: Checkout code
        uses: actions/checkout@v6
        with:
          clean: false
          fetch-depth: 0
          persist-credentials: false
          # Checkout pull request HEAD commit instead of merge commit
          ref: ${{ github.event.pull_request.head.sha }}

      - name: Remove Manually added PR Label
        if: |
          contains(github.event.pull_request.labels.*.name, 'CI: RUN ON-DEMAND PREVIEW RELEASES')

        run: gh pr edit $PR --remove-label "$labels"
        env:
           PR: ${{ github.event.pull_request.number }}
           labels: 'CI: RUN ON-DEMAND PREVIEW RELEASES'
           GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}

      - name: Add comment to PR
        uses: marocchino/sticky-pull-request-comment@v3
        with:
          hide_and_recreate: true
          hide_classify: "OUTDATED"
          header: on-demand-build-status
          message: |
            ⚒️ Starting a workflow to build, Your On-Demand Preview Release/build for ${{ github.event.pull_request.html_url || github.event.pull_request.url }}.
            
            status: **\`🟡 in_progress\`**
            
            Kindly wait, this message may be updated with success or failure status.
            
            For Owners: Please [Click here to view that github actions](https://github.com/${{ github.repository}}/actions/runs/${{ github.run_id }})/

        env:
          PR: ${{ github.event.pull_request.number }}
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}

  trigger_builder:
      needs: job_trigger
      secrets: inherit
      uses: Acode-Foundation/acode/.github/workflows/nightly-build.yml@main
      with:
        is_PR: true
        PR_NUMBER: ${{ github.event.pull_request.number }}
        skip_tagging_and_releases: true

  update_Last_Comment:
      needs: [job_trigger,trigger_builder]
      runs-on: ubuntu-latest
      if: ${{ github.repository_owner == 'Acode-Foundation' && always() && contains(fromJSON('["failure","cancelled"]'), needs.trigger_builder.result) }}
      steps:
#        - name: Checkout code
#          uses: actions/checkout@v4
#          with:
#            clean: false
#            fetch-depth: 0

        - name: Update Last Comment by bot (if Workflow Triggering failed)
          uses: marocchino/sticky-pull-request-comment@v3
          with:
             hide_and_recreate: true
             hide_classify: "OUTDATED"
             header: on-demand-build-status
             message: |
                   🔴 (Workflow Trigger stopped), Your On-Demand Preview Release/build for ${{ github.event.pull_request.html_url || github.event.pull_request.url }}.
                   status: **${{ needs.trigger_builder.result || 'failure'}}**         
               
                   ---
                   For Owners: Please [Click here to view that github actions](https://github.com/${{ github.repository}}/actions/runs/${{ github.run_id }})


================================================
FILE: .gitignore
================================================
/node_modules
/build.json
/www/build
/plugins
/platforms
/keystore.jks
/platforms/android/debug-signing.properties
/platforms/android/release-signing.properties
**/*/.DS_Store
.DS_Store
pnpm-lock.yaml
.zed
.idea
ace-builds
fdroid.bool


================================================
FILE: .hintrc
================================================
{
  "extends": [
    "development"
  ],
  "hints": {
    "compat-api/css": "off",
    "css-prefix-order": "off",
    "meta-viewport": "off",
    "detect-css-reflows/composite": "off",
    "detect-css-reflows/paint": "off"
  }
}

================================================
FILE: .prettierrc
================================================
{}


================================================
FILE: .vscode/launch.json
================================================
{
  // Use IntelliSense to learn about possible attributes.
  // Hover to view descriptions of existing attributes.
  // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
  "version": "0.2.0",
  "configurations": [
    {
      "type": "node",
      "request": "launch",
      "name": "Run Android",
      "skipFiles": [
        "<node_internals>/**"
      ],
      "program": "${workspaceFolder}\\utils\\run-android.js",
    }
  ]
}

================================================
FILE: .vscode/plugins.json
================================================
{"plugins":["cordova-clipboard","cordova-plugin-buildinfo","cordova-plugin-device","cordova-plugin-file","cordova-plugin-sftp","cordova-plugin-server","cordova-plugin-ftp","cordova-plugin-sdcard","cordova-plugin-browser","cordova-plugin-iap","cordova-plugin-system","cordova-plugin-advanced-http"]}

================================================
FILE: .vscode/settings.json
================================================
{
  "editor.formatOnSave": true,
  "autoimport.doubleQuotes": false,
  "java.configuration.updateBuildConfiguration": "disabled",
  "prettier.requireConfig": true,
  "javascript.format.enable": true,
  "editor.defaultFormatter": "esbenp.prettier-vscode",
  "prettier.tabWidth": 2,
  "prettier.useTabs": false,
  "javascript.format.semicolons": "insert",
  "[scss]": {
    "editor.defaultFormatter": "vscode.css-language-features"
  },
  "emmet.syntaxProfiles": {
    "xml": {
      "attr_quotes": "single"
    },
    "html": {
      "attr_quotes": "single"
    },
    "javascript": {
      "attr_quotes": "single",
      "attr_quotes_style": "single",
      "self_closing_tag": true
    },
    "jsx": {
      "attr_quotes": "single"
    }
  },
  "cSpell.words": [
    "abap",
    "Acode",
    "acodefree",
    "actionscript",
    "addedfolder",
    "addedfolders",
    "addstorage",
    "admob",
    "adoc",
    "Ajit",
    "alda",
    "ANDROIDX",
    "anglebracket",
    "angularjs",
    "antlr",
    "anyscript",
    "applescript",
    "ARGB",
    "Astro",
    "Asuming",
    "audiotrack",
    "autocorrect",
    "autohotkey",
    "autoit",
    "autosize",
    "azurepipelines",
    "babelrcpath",
    "backbutton",
    "bazel",
    "biml",
    "bitbucketpipeline",
    "bithound",
    "browserslist",
    "buckbuild",
    "buildinfo",
    "cakefile",
    "cakephp",
    "canrun",
    "canrw",
    "Cascadia",
    "changemode",
    "cheader",
    "cirru",
    "clearclose",
    "clojurescript",
    "cloudfoundry",
    "codacy",
    "codeclimate",
    "codecov",
    "codekit",
    "coffeelint",
    "colorpicker",
    "commitlintignore",
    "commitlintrc",
    "configpath",
    "copyline",
    "copylinesdown",
    "copylinesup",
    "cordova",
    "corejs",
    "cppheader",
    "crossorigin",
    "Csound",
    "csscomb",
    "csslint",
    "cssmap",
    "cuda",
    "curlybracket",
    "customise",
    "cython",
    "darcs",
    "dartlang",
    "deadlyjack",
    "Debuggable",
    "deviceready",
    "dlang",
    "dockertest",
    "docpad",
    "docz",
    "dotjs",
    "downloadget",
    "doxygen",
    "DPAD",
    "dustjs",
    "easylogic",
    "Edifact",
    "editmenu",
    "endregion",
    "ensime",
    "ERUDA",
    "filebrowser",
    "filesize",
    "Fira",
    "firebasehosting",
    "firestore",
    "flac",
    "Flix",
    "floobits",
    "Foxdebug",
    "freemarker",
    "gamemaker",
    "gcode",
    "getfilename",
    "gitmodules",
    "glsl",
    "Gobstones",
    "googleplay",
    "gotoline",
    "graphviz",
    "greenkeeper",
    "gridsome",
    "guardfile",
    "haml",
    "HARDKEYBOARDHIDDEN",
    "haxe",
    "haxecheckstyle",
    "haxedevelop",
    "hideconsole",
    "historyrestore",
    "hjson",
    "hlsl",
    "homeassistant",
    "htgroups",
    "htmlhint",
    "htmlpath",
    "htpasswd",
    "idris",
    "idrisbin",
    "idrispkg",
    "imba",
    "INAPP",
    "infopath",
    "informix",
    "innosetup",
    "inputhints",
    "inputmethod",
    "intoview",
    "Invisibles",
    "irid",
    "jbuilder",
    "JEXL",
    "jsbeautify",
    "jsbeautifyrc",
    "jsmap",
    "jsonld",
    "jsonnet",
    "JSSM",
    "KEYBOARDHIDDEN",
    "KHTML",
    "kitchenci",
    "kivy",
    "Kumar",
    "Laravel",
    "lastfile",
    "lenspalette",
    "lintstagedrc",
    "livescript",
    "loaderror",
    "Localname",
    "Logi",
    "logopath",
    "Logtalk",
    "lolcode",
    "Lucene",
    "lync",
    "markdownlint",
    "markojs",
    "mathml",
    "maxscript",
    "menubutton",
    "MIXAL",
    "mjml",
    "mlang",
    "modeassoc",
    "modelist",
    "mojolicious",
    "moleculer",
    "moveline",
    "movelinesdown",
    "movelinesup",
    "mson",
    "NAVIGATIONHIDDEN",
    "nestjs",
    "njsproj",
    "nodemon",
    "NOKEYS",
    "nord",
    "Noto",
    "NOTOUCH",
    "NSIS",
    "nsri",
    "nunjs",
    "nunjucks",
    "nuxt",
    "objectivecpp",
    "OLED",
    "oncanrun",
    "onchangemode",
    "onchangesession",
    "ondisconnect",
    "onenote",
    "onexpand",
    "onfold",
    "onhide",
    "onloaderror",
    "onpurchase",
    "onref",
    "onremove",
    "onrename",
    "onrun",
    "onsave",
    "onscrollend",
    "onscrollleft",
    "onscrolltop",
    "onsearch",
    "onwilldisconnect",
    "onwriteend",
    "opencl",
    "openfolder",
    "opengl",
    "orangered",
    "ovpn",
    "paket",
    "partiql",
    "PERSISTABLE",
    "pgsql",
    "photoshop",
    "phpcsfixer",
    "phps",
    "phpt",
    "phpunit",
    "phraseapp",
    "plantuml",
    "platformio",
    "Plore",
    "plsql",
    "poedit",
    "Portugues",
    "postcss",
    "postcssconfig",
    "postcssrc",
    "powersave",
    "Praat",
    "praatscript",
    "precommit",
    "prefs",
    "processinglang",
    "procfile",
    "Proggy",
    "protobuf",
    "protobug",
    "PRQL",
    "purescript",
    "pyret",
    "pyup",
    "qlikview",
    "qmldir",
    "qsharp",
    "QUICKTOOLS",
    "rakefile",
    "Raku",
    "rakumod",
    "rakutest",
    "raml",
    "rateapp",
    "reactjs",
    "reacttemplate",
    "reactts",
    "recents",
    "rehype",
    "remotefile",
    "removeads",
    "retext",
    "rhtml",
    "rnfr",
    "rnto",
    "robotframework",
    "Roboto",
    "rollup",
    "rproj",
    "rubocop",
    "ruleset",
    "saltstack",
    "scilab",
    "sconsole",
    "SCROLLBARS",
    "scrollleft",
    "scrolltop",
    "sdcard",
    "sdlang",
    "selectall",
    "sequelize",
    "settitle",
    "shft",
    "showconsole",
    "silverstripe",
    "smali",
    "snapcraft",
    "snyk",
    "SPARQL",
    "sqlserver",
    "squarebracket",
    "stargrade",
    "stata",
    "styl",
    "stylable",
    "stylelint",
    "symfony",
    "systemverilog",
    "Tahoma",
    "tera",
    "Termux",
    "terragrunt",
    "testjs",
    "testts",
    "tfvars",
    "themelist",
    "ttcn",
    "typescriptdef",
    "ungap",
    "unibeautify",
    "unwatch",
    "vala",
    "vapi",
    "vash",
    "vbhtml",
    "Verdana",
    "verilog",
    "vhdl",
    "Visualforce",
    "vsix",
    "vsixmanifest",
    "warningreport",
    "watchmanconfig",
    "webp",
    "wercker",
    "Wollok",
    "wpgm",
    "wpml",
    "wtest",
    "wxml",
    "wxss",
    "xquery",
    "Zeek"
  ],
  "[javascript]": {
    "editor.defaultFormatter": "biomejs.biome"
  }
}


================================================
FILE: .vscode/typings/cordova/cordova.d.ts
================================================
// Type definitions for Apache Cordova
// Project: http://cordova.apache.org
// Definitions by: Microsoft Open Technologies Inc. <http://msopentech.com>
// Definitions: https://github.com/borisyankov/DefinitelyTyped
//
// Copyright (c) Microsoft Open Technologies, Inc.
// Licensed under the MIT license.

interface Cordova {
    /** Invokes native functionality by specifying corresponding service name, action and optional parameters.
     * @param success A success callback function.
     * @param fail An error callback function.
     * @param service The service name to call on the native side (corresponds to a native class).
     * @param action The action name to call on the native side (generally corresponds to the native class method).
     * @param args An array of arguments to pass into the native environment.
     */
    exec(success: () => any, fail: () => any, service: string, action: string, args?: string[]): void;
    /** Gets the operating system name. */
    platformId: string;
    /** Gets Cordova framework version */
    version: string;
    /** Defines custom logic as a Cordova module. Other modules can later access it using module name provided. */
    define(moduleName: string, factory: (require: any, exports: any, module: any) => any): void;
    /** Access a Cordova module by name. */
    require(moduleName: string): any;
    /** Namespace for Cordova plugin functionality */
    plugins:CordovaPlugins;
}

interface CordovaPlugins {}

interface Document {
    addEventListener(type: "deviceready", listener: (ev: Event) => any, useCapture?: boolean): void;
    addEventListener(type: "pause", listener: (ev: Event) => any, useCapture?: boolean): void;
    addEventListener(type: "resume", listener: (ev: Event) => any, useCapture?: boolean): void;
    addEventListener(type: "backbutton", listener: (ev: Event) => any, useCapture?: boolean): void;
    addEventListener(type: "menubutton", listener: (ev: Event) => any, useCapture?: boolean): void;
    addEventListener(type: "searchbutton", listener: (ev: Event) => any, useCapture?: boolean): void;
    addEventListener(type: "startcallbutton", listener: (ev: Event) => any, useCapture?: boolean): void;
    addEventListener(type: "endcallbutton", listener: (ev: Event) => any, useCapture?: boolean): void;
    addEventListener(type: "volumedownbutton", listener: (ev: Event) => any, useCapture?: boolean): void;
    addEventListener(type: "volumeupbutton", listener: (ev: Event) => any, useCapture?: boolean): void;

    removeEventListener(type: "deviceready", listener: (ev: Event) => any, useCapture?: boolean): void;
    removeEventListener(type: "pause", listener: (ev: Event) => any, useCapture?: boolean): void;
    removeEventListener(type: "resume", listener: (ev: Event) => any, useCapture?: boolean): void;
    removeEventListener(type: "backbutton", listener: (ev: Event) => any, useCapture?: boolean): void;
    removeEventListener(type: "menubutton", listener: (ev: Event) => any, useCapture?: boolean): void;
    removeEventListener(type: "searchbutton", listener: (ev: Event) => any, useCapture?: boolean): void;
    removeEventListener(type: "startcallbutton", listener: (ev: Event) => any, useCapture?: boolean): void;
    removeEventListener(type: "endcallbutton", listener: (ev: Event) => any, useCapture?: boolean): void;
    removeEventListener(type: "volumedownbutton", listener: (ev: Event) => any, useCapture?: boolean): void;
    removeEventListener(type: "volumeupbutton", listener: (ev: Event) => any, useCapture?: boolean): void;

    addEventListener(type: string, listener: (ev: Event) => any, useCapture?: boolean): void;
    removeEventListener(type: string, listener: (ev: Event) => any, useCapture?: boolean): void;
}

interface Window {
  cordova:Cordova;
}

// cordova/argscheck module
interface ArgsCheck {
    checkArgs(argsSpec: string, functionName: string, args: any[], callee?: any): void;
    getValue(value?: any, defaultValue?: any): any;
    enableChecks: boolean;
}

// cordova/urlutil module
interface UrlUtil {
    makeAbsolute(url: string): string
}

/** Apache Cordova instance */
declare var cordova: Cordova;



================================================
FILE: CHANGELOG.md
================================================
# Change Log

## v1.11.8 (967) 

### Features
* feat: add acode cli by @bajrangCoder in https://github.com/Acode-Foundation/Acode/pull/1768
* feat: Add FileTree component with virtual scrolling by @bajrangCoder in https://github.com/Acode-Foundation/Acode/pull/1774
* feat(welcome): add welcome tab for first-time users by @bajrangCoder in https://github.com/Acode-Foundation/Acode/pull/1783
* feat: Add visibility toggle for quicktools toggler on terminal input by @bajrangCoder in https://github.com/Acode-Foundation/Acode/pull/1766
* feat: Add smart path shortening to terminal prompt by @bajrangCoder in https://github.com/Acode-Foundation/Acode/pull/1767
* feat(settings): add option to preserve original item order by @bajrangCoder in https://github.com/Acode-Foundation/Acode/pull/1772
* feat: add "Open in Terminal" option to folder context menu by @bajrangCoder in https://github.com/Acode-Foundation/Acode/pull/1809
* feat: add proper fallback and saf uri handling for ischeck by @bajrangCoder in https://github.com/Acode-Foundation/Acode/pull/1814
* feat: extensionless URL resolution in preview server by @bajrangCoder in https://github.com/Acode-Foundation/Acode/pull/1824
* feat: improve DevContainer and Docker support for easier dev setup by @bajrangCoder in https://github.com/Acode-Foundation/Acode/pull/1823
* feat: add eruda devtools for debugging by @bajrangCoder in https://github.com/Acode-Foundation/Acode/pull/1831
* feat: Refactor li-icon set and add new icon by @bajrangCoder in https://github.com/Acode-Foundation/Acode/pull/1759
* feat: Enhance `addIcon` to support svg currentColor by @bajrangCoder in https://github.com/Acode-Foundation/Acode/pull/1760
* feat: Offload file change detection to background thread by @bajrangCoder in https://github.com/Acode-Foundation/Acode/pull/1802
* feat: move service to background by @RohitKushvaha01 in https://github.com/Acode-Foundation/Acode/pull/1754
* feat: add quiet hours for ads by @RohitKushvaha01 in https://github.com/Acode-Foundation/Acode/pull/1779
* feat(auth): move authentication to native Android plugin with encrypted storage by @RohitKushvaha01 in https://github.com/Acode-Foundation/Acode/pull/1794
* feat: do not close milestone issues by @RohitKushvaha01 in https://github.com/Acode-Foundation/Acode/pull/1799
* feat: close search dialog with ctrl+f by @RohitKushvaha01 in https://github.com/Acode-Foundation/Acode/pull/1807
* feat: added executor tests by @RohitKushvaha01 in https://github.com/Acode-Foundation/Acode/pull/1816
* Added tests by @RohitKushvaha01 in https://github.com/Acode-Foundation/Acode/pull/1813
* CustomTabs web api for plugins by @RohitKushvaha01 in https://github.com/Acode-Foundation/Acode/pull/1785
* Implement plugin loading callbacks and tracking for installed plugins by @7HR4IZ3 in https://github.com/Acode-Foundation/Acode/pull/1558
* Added Documents viewer plugin id to load pdf/excel/csv etc. files by @hackesofice in https://github.com/Acode-Foundation/Acode/pull/1833
* Refactor quicktools settings by @bajrangCoder in https://github.com/Acode-Foundation/Acode/pull/1761

### Fixes
* fix: use correct timezone by @RohitKushvaha01 in https://github.com/Acode-Foundation/Acode/pull/1716
* fix: sanitize plugin readme before rendering by @bajrangCoder in https://github.com/Acode-Foundation/Acode/pull/1731
* fix: make rm wrapper silent by @RohitKushvaha01 in https://github.com/Acode-Foundation/Acode/pull/1727
* fix: remove duplicate rm command by @RohitKushvaha01 in https://github.com/Acode-Foundation/Acode/pull/1732
* fix: sidebar app icon size and scrolling by @bajrangCoder in https://github.com/Acode-Foundation/Acode/pull/1733
* fix: terminal bug by @RohitKushvaha01 in https://github.com/Acode-Foundation/Acode/pull/1741
* fix: sidebar apps active and removal things with fallback by @bajrangCoder in https://github.com/Acode-Foundation/Acode/pull/1749
* fix: improve the backup and restore by @bajrangCoder in https://github.com/Acode-Foundation/Acode/pull/1744
* fix: console by @RohitKushvaha01 in https://github.com/Acode-Foundation/Acode/pull/1763
* fix(terminal): cleanup broken tabs and show alerts on terminal errors by @bajrangCoder in https://github.com/Acode-Foundation/Acode/pull/1780
* fix(plugin): sanitize markdown and prevent horizontal overflow by @bajrangCoder in https://github.com/Acode-Foundation/Acode/pull/1782
* fix: run current File not respecting `preview mode` option. by @UnschooledGamer in https://github.com/Acode-Foundation/Acode/pull/1805
* fix: memory leak when toggling search panel by @RohitKushvaha01 in https://github.com/Acode-Foundation/Acode/pull/1808
* fix: prevent mixed content in SFTP/FTP cached files by @bajrangCoder in https://github.com/Acode-Foundation/Acode/pull/1815
* Fix: Remove trimming of matched content in Executor.js by @dikidjatar in https://github.com/Acode-Foundation/Acode/pull/1798
* revert: relative http paths by @RohitKushvaha01 in https://github.com/Acode-Foundation/Acode/pull/1743

### Chore & CI
* Add F-droid Build in GH nightly releases by @UnschooledGamer in https://github.com/Acode-Foundation/Acode/pull/1719
* fix(CI): normal nightly & fdroid flavor build paths. by @UnschooledGamer in https://github.com/Acode-Foundation/Acode/pull/1722
* Update devcontainer.json and add Dependabot for devcontainer's version updates by @UnschooledGamer in https://github.com/Acode-Foundation/Acode/pull/1742
* enhance nightly build workflow by adding a step to generate release notes by @UnschooledGamer in https://github.com/Acode-Foundation/Acode/pull/1747
* chore: update nightly build workflow to use a fine-grained GITHUB_TOKEN for generating nightly release notes by @UnschooledGamer in https://github.com/Acode-Foundation/Acode/pull/1751
* chore: message type detection in release notes script by @UnschooledGamer in https://github.com/Acode-Foundation/Acode/pull/1786
* update(sftp): dependencies for SFTP plugin by @UnschooledGamer in https://github.com/Acode-Foundation/Acode/pull/1792
* chore(deps): bump tmp and cordova by @dependabot[bot] in https://github.com/Acode-Foundation/Acode/pull/1720
* chore(deps): bump tough-cookie and cordova by @dependabot[bot] in https://github.com/Acode-Foundation/Acode/pull/1721
* chore(deps): bump systeminformation from 5.27.11 to 5.27.14 by @dependabot[bot] in https://github.com/Acode-Foundation/Acode/pull/1750
* chore(deps): bump tar from 7.5.2 to 7.5.3 by @dependabot[bot] in https://github.com/Acode-Foundation/Acode/pull/1829

### Translations & i18n
* `pl-pl.json` by @andrewczm in https://github.com/Acode-Foundation/Acode/pull/1709
* `de-de.json` by @Mr-Update in https://github.com/Acode-Foundation/Acode/pull/1714, https://github.com/Acode-Foundation/Acode/pull/1764
* `cs-cz.json` by @Amereyeu in https://github.com/Acode-Foundation/Acode/pull/1752, https://github.com/Acode-Foundation/Acode/pull/1828
* `hu-hu.json` by @summoner001 in https://github.com/Acode-Foundation/Acode/pull/1755, https://github.com/Acode-Foundation/Acode/pull/1762, https://github.com/Acode-Foundation/Acode/pull/1787, https://github.com/Acode-Foundation/Acode/pull/1810, https://github.com/Acode-Foundation/Acode/pull/1834
* `zh-cn.json`, `zh-hant.json` by @LaunchLee in https://github.com/Acode-Foundation/Acode/pull/1769
* `pt-br.json` by @sebastianjnuwu in https://github.com/Acode-Foundation/Acode/pull/1775
* `uk-ua.json` by @PavloPogonets in https://github.com/Acode-Foundation/Acode/pull/1818, https://github.com/Acode-Foundation/Acode/pull/1821

## v1.11.7 (966) 

* revert: sidebar/style.scss changes to fix collapse folders by @UnschooledGamer in https://github.com/Acode-Foundation/Acode/pull/1572
* Terminal Service by @RohitKushvaha01 in https://github.com/Acode-Foundation/Acode/pull/1570
* fix(i18n): fix typo in ./src/lang/id-id.json by @hyperz111 in https://github.com/Acode-Foundation/Acode/pull/1577
* fix: browser download by @RohitKushvaha01 in https://github.com/Acode-Foundation/Acode/pull/1587
* Terminal initrc support by @RohitKushvaha01 in https://github.com/Acode-Foundation/Acode/pull/1590
* chore(i18n): update de-de.json by @Mr-Update in https://github.com/Acode-Foundation/Acode/pull/1600
* Updated & Added Missing ar-ye.json (Arabic) translations by @Hussain96o in https://github.com/Acode-Foundation/Acode/pull/1601
* Restore terminal tabs  by @bajrangCoder in https://github.com/Acode-Foundation/Acode/pull/1592
  - fix: terminal font issue
  - Breaking change: Changed default terminal configs
* feat: service on/off by @RohitKushvaha01 in https://github.com/Acode-Foundation/Acode/pull/1602
* fix: service stop on app exit by @RohitKushvaha01 in https://github.com/Acode-Foundation/Acode/pull/1603
* fix: ED25519 SSH keys not working by @UnschooledGamer in https://github.com/Acode-Foundation/Acode/pull/1595
* CI: Nightly Builds by @UnschooledGamer in https://github.com/Acode-Foundation/Acode/pull/1612
* style(terminal): Some touch selection handle enhancements by @peasneovoyager2banana2 in https://github.com/Acode-Foundation/Acode/pull/1611
* fix: pip by @RohitKushvaha01 in https://github.com/Acode-Foundation/Acode/pull/1617
* feat: Enable all file access in nightly builds by @RohitKushvaha01 in https://github.com/Acode-Foundation/Acode/pull/1618
* Add support for renaming documents in provider by @bajrangCoder in https://github.com/Acode-Foundation/Acode/pull/1619
* fix: support for Acode terminal SAF URIs by @bajrangCoder in https://github.com/Acode-Foundation/Acode/pull/1621
* fix: rm command by @RohitKushvaha01 in https://github.com/Acode-Foundation/Acode/pull/1623
* feat: add 'check for app updates' setting to toggle the automatic behaviour by @bajrangCoder in https://github.com/Acode-Foundation/Acode/pull/1624
* chore(i18n): update hu-hu.json by @summoner001 in https://github.com/Acode-Foundation/Acode/pull/1626
* Enforce Unix lf endings for shell scripts by @RohitKushvaha01 in https://github.com/Acode-Foundation/Acode/pull/1637
* AutoSuggest install command in terminal by @RohitKushvaha01 in https://github.com/Acode-Foundation/Acode/pull/1638
* feat: add plugin filtering by author and keywords by @bajrangCoder in https://github.com/Acode-Foundation/Acode/pull/1625
  - Refactored filtering logic to support multi-page results and improved UI feedback for filter actions.
* Translation: Update hu-hu.json by @summoner001 in https://github.com/Acode-Foundation/Acode/pull/1640
* fix: init-alpine by @RohitKushvaha01 in https://github.com/Acode-Foundation/Acode/pull/1641
* fix: ANSI escape sequence in init-alpine by @RohitKushvaha01 in https://github.com/Acode-Foundation/Acode/pull/1643
* chore(i18n): update de-de.json by @Mr-Update in https://github.com/Acode-Foundation/Acode/pull/1648
* fix: update proot binaries to support 16kb page size by @RohitKushvaha01 in https://github.com/Acode-Foundation/Acode/pull/1649
* chore(i18n): update id-id.json with new strings by @hyperz111 in https://github.com/Acode-Foundation/Acode/pull/1650
* Translation: Update hu-Hu.json by @summoner001 in https://github.com/Acode-Foundation/Acode/pull/1653
* Add confirmation prompt before closing terminal tabs by @bajrangCoder in https://github.com/Acode-Foundation/Acode/pull/1655
* fix: compatibility for old android versions by @bajrangCoder in https://github.com/Acode-Foundation/Acode/pull/1656
* fix: improve file sharing and URI handling by @bajrangCoder in https://github.com/Acode-Foundation/Acode/pull/1662
  - Improved file sharing and fixed permission issue (also in case of open with , edit with)
* fix: do not restore terminals if axs is dead by @RohitKushvaha01 in https://github.com/Acode-Foundation/Acode/pull/1664
* fix: .capitalize() removed because it changes the translations (also English) by @Mr-Update in https://github.com/Acode-Foundation/Acode/pull/1665
* fix: `switchFile` api to respect custom subtitle by @bajrangCoder in https://github.com/Acode-Foundation/Acode/pull/1672
* Update zh-cn.json and zh-hant.json by @LaunchLee in https://github.com/Acode-Foundation/Acode/pull/1674
* fix: Translation corrected in terminal settings by @Mr-Update in https://github.com/Acode-Foundation/Acode/pull/1676
* fix: Added missing translation for info window in file browser and app settings. by @Mr-Update in https://github.com/Acode-Foundation/Acode/pull/1677
* Translation: Update hungarian hu-HU.json by @summoner001 in https://github.com/Acode-Foundation/Acode/pull/1680
* Update ads plugin and fix some issues of free version by @bajrangCoder in https://github.com/Acode-Foundation/Acode/pull/1683
  - fix: system them on free version
* fix: restore folds when formatting if available by @bajrangCoder in https://github.com/Acode-Foundation/Acode/pull/1682
* fix: Added missing translation for info window in terminal settings by @Mr-Update in https://github.com/Acode-Foundation/Acode/pull/1681
* Translation: Update hungarian hu-hu.json by @summoner001 in https://github.com/Acode-Foundation/Acode/pull/1687
* feat: Add clean install state functionality to app settings by @UnschooledGamer in https://github.com/Acode-Foundation/Acode/pull/1690
* Translation: Update hungarian hu-hu.json by @summoner001 in https://github.com/Acode-Foundation/Acode/pull/1693


## v1.11.6 (965)

* fix: Terminal in F-Droid flavour by @RohitKushvaha01 in https://github.com/Acode-Foundation/Acode/pull/1478
* feat: update target SDK to API 35 and fix edge-to-edge compatibility by @bajrangCoder in https://github.com/Acode-Foundation/Acode/pull/1486
* improve German translation by @brian200508 in https://github.com/Acode-Foundation/Acode/pull/1487
* Translation: Update hu-hu.json by @summoner001 in https://github.com/Acode-Foundation/Acode/pull/1489
* chore(update IAP library to lateset version) by @deadlyjack in https://github.com/Acode-Foundation/Acode/pull/1405
* feat: font manager ui for managing custom fonts by @bajrangCoder in https://github.com/Acode-Foundation/Acode/pull/1491
* feat: add package updated time display on plugin page by @bajrangCoder in https://github.com/Acode-Foundation/Acode/pull/1494
* chore: update id-id.json by @hyperz111 in https://github.com/Acode-Foundation/Acode/pull/1495
* fix: document provider by @RohitKushvaha01 in https://github.com/Acode-Foundation/Acode/pull/1497
* feat(sponsor page) by @deadlyjack in https://github.com/Acode-Foundation/Acode/pull/1496
* fix: load custom fonts on restart by @bajrangCoder in https://github.com/Acode-Foundation/Acode/pull/1499
* Update hu-hu.json by @summoner001 in https://github.com/Acode-Foundation/Acode/pull/1498
* fix: resolve GitHub URI preview issues in server by @bajrangCoder in https://github.com/Acode-Foundation/Acode/pull/1501
* fix: plugins page scrolling by @deadlyjack in https://github.com/Acode-Foundation/Acode/pull/1505
* [chore] bump workflow dependencies to latest versions by @Jvr2022 in https://github.com/Acode-Foundation/Acode/pull/1506
* fix: load base app stylesheet in custom editor tab by @deadlyjack in https://github.com/Acode-Foundation/Acode/pull/1507
* update src/lang/pt-br.json by @sebastianjnuwu in https://github.com/Acode-Foundation/Acode/pull/1510
* Add code formatter keybind by @UnschooledGamer in https://github.com/Acode-Foundation/Acode/pull/1511
* Added hyphen in quicktools and more strings for i18n by @bajrangCoder in https://github.com/Acode-Foundation/Acode/pull/1516
* chore(i18n): update id-id.json with new strings by @hyperz111 in https://github.com/Acode-Foundation/Acode/pull/1521
* chore(i18n): update hu-hu.json with new strings by @summoner001 in https://github.com/Acode-Foundation/Acode/pull/1520
* Add/Update Bengali (bn-BD) Translation File by @thebadhonbiswas in https://github.com/Acode-Foundation/Acode/pull/1522
* feat: take confirmation before uninstalling terminal by @bajrangCoder in https://github.com/Acode-Foundation/Acode/pull/1528
* fix ui issue by @bajrangCoder in https://github.com/Acode-Foundation/Acode/pull/1527
* fix: disable changing editor theme when system is selected by @RohitKushvaha01 in https://github.com/Acode-Foundation/Acode/pull/1529
* fix: svg render issue by @RohitKushvaha01 in https://github.com/Acode-Foundation/Acode/pull/1530
* fix: encoding detection by @bajrangCoder in https://github.com/Acode-Foundation/Acode/pull/1533
* fix: big screen ui and global search worker issue by @deadlyjack in https://github.com/Acode-Foundation/Acode/pull/1534
* fix: improved terminal mounts by @RohitKushvaha01 in https://github.com/Acode-Foundation/Acode/pull/1537
* chore(i18n): refine Russian (ru-ru.json) localization with updated and new strings by @Nein-Ich-wurde-Gewinnen in https://github.com/Acode-Foundation/Acode/pull/1541
* Fixed Plugin installation issues(in some cases) by @bajrangCoder in https://github.com/Acode-Foundation/Acode/pull/1546
* feat: add option to auto detect encoding by @bajrangCoder in https://github.com/Acode-Foundation/Acode/pull/1547
* fix: ftp infinite loading by @RohitKushvaha01 in https://github.com/Acode-Foundation/Acode/pull/1552
* fix: tab active state when switching tab with api by @bajrangCoder in https://github.com/Acode-Foundation/Acode/pull/1557
* fix: resize of terminal and some small patches by @bajrangCoder in https://github.com/Acode-Foundation/Acode/pull/1562
* fix: fdroid builds by @RohitKushvaha01 in https://github.com/Acode-Foundation/Acode/pull/1565

## v1.11.5 (963)

* Alpine Linux Backend by @RohitKushvaha01 in https://github.com/Acode-Foundation/Acode/pull/1401
* fix: html escaping for console page by @bajrangCoder in https://github.com/Acode-Foundation/Acode/pull/1411
* Create plugin for native libs by @RohitKushvaha01 in https://github.com/Acode-Foundation/Acode/pull/1413
* feat: terminal frontend by @bajrangCoder in https://github.com/Acode-Foundation/Acode/pull/1415
* Update hu-hu.json translation by @summoner001 in https://github.com/Acode-Foundation/Acode/pull/1423, https://github.com/Acode-Foundation/Acode/pull/1425, https://github.com/Acode-Foundation/Acode/pull/1440
* chore: update id-id.json translation by @hyperz111 in https://github.com/Acode-Foundation/Acode/pull/1424, https://github.com/Acode-Foundation/Acode/pull/1447
* All file access permission for terminal by @RohitKushvaha01 in https://github.com/Acode-Foundation/Acode/pull/1426
* refactor: plugins page by @bajrangCoder in https://github.com/Acode-Foundation/Acode/pull/1428
	* Fixed infinite scrolling in case of filtering on both plugin page and sidebar
    * Ui improvements on plugin page
* Revamped few themes(fixes visibility issue) and Added few new ones  by @bajrangCoder in https://github.com/Acode-Foundation/Acode/pull/1430
	* New theme: Neon, Sunset, Glass, Glass Dark
	* Revamped themes: System (Dark & Light), Oled, Light
	* System theme option is available on free too.
* fix: scaling issue by @bajrangCoder in https://github.com/Acode-Foundation/Acode/pull/1431
* fix: quicktools toggler responsiveness(scaling) and migrate biome by @bajrangCoder in https://github.com/Acode-Foundation/Acode/pull/1442
* chore: update ace to v1.43.2 by @bajrangCoder in https://github.com/Acode-Foundation/Acode/pull/1443
* feat: add uninstall option in terminal setting and tab subtitle fixes by @bajrangCoder in https://github.com/Acode-Foundation/Acode/pull/1445
* feat: alpine document provider(exposes terminal public dir to saf picker) by @RohitKushvaha01 in https://github.com/Acode-Foundation/Acode/pull/1444
* feat: improved logging + fix terminal installation failure by @RohitKushvaha01 in https://github.com/Acode-Foundation/Acode/pull/1446
* some terminal related quality improvements by @bajrangCoder in https://github.com/Acode-Foundation/Acode/pull/1449
	* fix: dont start selection in case of back gesture
	* remove useless border-radius from terminal container
	* fix: improve terminal cursor positioning for mobile keyboard events
	* fix: update terminal container background when theme changes
* exclude alpine/public while backup by @RohitKushvaha01 in https://github.com/Acode-Foundation/Acode/pull/1450
* Custom port support in Terminal manager by @RohitKushvaha01 in https://github.com/Acode-Foundation/Acode/pull/1459
* 🌐 i18n(locale): update vietnamese translations by @Nekitori17 in https://github.com/Acode-Foundation/Acode/pull/1461
* fix: infinite loading when previewing by @RohitKushvaha01 in https://github.com/Acode-Foundation/Acode/pull/1460
* Feat/some improvements to terminal and its api by @bajrangCoder in https://github.com/Acode-Foundation/Acode/pull/1463
* Fixes/sidebar extension state by clearing and active autocompletion box background  by @bajrangCoder in https://github.com/Acode-Foundation/Acode/pull/1466
* feat: add terminal like search and replace history by @bajrangCoder in https://github.com/Acode-Foundation/Acode/pull/1467
* fix: theme issue in terminal context menu
* fix: prevent folder paste loops and improve SAF handling(termux) in cut operation by @bajrangCoder in https://github.com/Acode-Foundation/Acode/pull/1474
	- Add validation to prevent pasting folders into themselves or subdirectories
	- Implement special Termux SAF handling for cut operations with recursive file/folder moving
	- Fix createFileStructure to handle nested paths (foo/bar) for file:// URIs

## v1.11.4 (962)

* Fix renaming current Termux URI file whilst viewing/editing it by @peasneovoyager2banana2
* fix: html preview on unsaved files by @RohitKushvaha01
* Add markdown-it-footnote and task lists support by @UnschooledGamer
* Fix quickTools height fallback by @bajrangCoder
* Comment out column adjustment in touchHandler.js for weird selection by @bajrangCoder
* Update Indonesian Translation by @hyperz111
* feat: :sparkles: Native Websocket Plugin (uses okhttp) by @UnschooledGamer
* fix: unintentional scrolling of tab container while dragging a tab by @peasneovoyager2banana2
* feat. alert user when changing editor theme by @RohitKushvaha01
* feat: Improve handling of intents before files are restored on startup by @bajrangCoder
* fix: don't save state of SAFMode="single" files by @bajrangCoder
* fix: plugin passing undefined to plugin item on plugin page by @bajrangCoder
* Integrated cordova-plugin-buildinfo as a local plugin by @RohitKushvaha01
* fix: crash when running unsaved file by @RohitKushvaha01
* feat: show open source plugin url on plugin page by @bajrangCoder
* fix: Make "None" option clickable in select dialog on formatter settings by @bajrangCoder
* fix: show confirm when copy/cut in sidebar instead of alert so user can proceed if they want by @bajrangCoder
* feat: plugin enable/disable functionality and update translations by @UnschooledGamer
* Update hu-hu.json by @summoner001
* Advanced execution interface by @RohitKushvaha01

## v1.11.3 (959)

* feat: added system theme by @RohitKushvaha01
* add: close-inactive-issues.yml by @UnschooledGamer
* Added Executor by @RohitKushvaha01
* fix: Executor Plugin's js module/interface path by @UnschooledGamer
* fix: teardrop goes out of viewport when there is no gutter by @bajrangCoder
* fix: infinite loading screen due to executor by @RohitKushvaha01
* fix: infinite loading when previewing html files by @RohitKushvaha01
* fix: apk related issues

## v1.11.2 (958)

* fix: cors related issues when installing plugins from remote by @bajrangCoder
* fix: Acode ignoring main, readme and icon fields in plugin manifest by @alMukaafih
* feat: inapp acode account login by @bajrangCoder
* fix: launchApp function by @RohitKushvaha01
* Update plugin documentation url by @RohitKushvaha01
* Backup restore fixes by @bajrangCoder
* file: re-emit switch and load file events after plugin load by @bajrangCoder
* fix: File copy-paste retains paste option after file is copied. by @RohitKushvaha01
* Fix sftp sidebar UI issue by @bajrangCoder
* fix: http relative path by @RohitKushvaha01
* Download support by @RohitKushvaha01
* Add Custom File Type Handler API by @bajrangCoder
* fix: applying folds on reopening the app by @bajrangCoder
* feat(tabs): Implement Shadow DOM isolation for non-editor tabs by @bajrangCoder
* remove invalid font by @bajrangCoder
* Improve Indonesian Translation by @hyperz111
* feat: improve changelogs page by @bajrangCoder
* Refactor, feat: Select dialog by @overskul
* Fix: Translate "Donation Message" and some words by @hyperz111
* Fix: "File Not Found" error when previewing HTML files from a Termux directory by @RohitKushvaha01
* Update zh-cn.json and zh-hant.json by @LaunchLee
* fix: console not showing on unsaved html file by @RohitKushvaha01
* File Menu & QuickTools Visibility for editor tabs by @bajrangCoder
* fix: handle edge case for `hideQuickTools` property by @bajrangCoder
* feat: add more new keys(<kbd>Home</kbd>,<kbd>End</kbd>, <kbd>PageUp</kbd>, <kbd>PageDown</kbd>, <kbd>Delete</kbd>) and symbols(`~` `Backtick`,`#` ,`$` ,`%` ,`^`) for quicktools by @bajrangCoder
* Fixed select box issue and improved it by @bajrangCoder
	* Added `x` to delete recent files/folder from dialog
* Update Hungarian translation by @summoner001
* chore(i18n): update vi-vn.json by @Nekitori17
* fix: file not found error by @RohitKushvaha01
* feat: revamped file tree by @bajrangCoder
* fix: pagedown key issue in editor by @bajrangCoder
* feat: open files with arbitrary extension names by @RohitKushvaha01
* add Hebrew language by @elid34
* feat: add support for compound file paths like `.blade.php` by @bajrangCoder
* support string content in tabs by @overskul
* update Tagalog/Filipino language by @ychwah
* fix: keyboard shortcuts leaks into ace editor by @RohitKushvaha01
* Resizeable activity by @RohitKushvaha01
* update ace v1.41.0 by @bajrangCoder
* Fix html content access by @RohitKushvaha01
* fix: path overlap issue in html viewer by @RohitKushvaha01
* fix: only initiate iap stuff in case of paid plugin on sidebar by @bajrangCoder

## v1.11.1 (957)

### Features
- **Syntax Highlighting**: Added syntax highlighting for code blocks on the plugin page using Ace Editor.
- **Theme Settings Fallback**: Implemented a fallback mechanism on the theme settings page when a custom tab is opened.
- **QuickTools Scroll Wheel Support**: Added support for scroll wheel events in QuickTools when in click mode.
- **SFTP Improvements**:
  - Enhanced logging for better debugging.
  - Enabled Bouncy Castle for SFTP, resolving connection issues with certain key types.
- **App Update Mechanism**:
  - Now checks for updates after app startup.
  - Uses a native approach instead of traditional fetch.

### Fixes & Improvements
- **SD Card Plugin**: Handled a few edge cases to prevent crashes.
- **GitHub Plugin Palette Fix**: Resolved an issue where the color palette was breaking the GitHub plugin.
- **Plugin Installation Fixes**:
  - Updated the install button in the sidebar to prevent multiple installations.
  - Fixed the installation mechanism in both the sidebar and the `installPlugin` API.
- **Quality of Life Enhancements**:
  - Various small improvements when installing/uninstalling plugins from the sidebar.

#### ⚠️ Experimental Changes ⚠️
- **Improved Plugin Loading**:
  - Only **theme plugins** load on Acode startup for faster performance.
  - All other plugins load **after** Acode startup.
- **Important for Theme Developers**:
  - Ensure your **plugin ID includes the word "theme"** to be correctly recognized as a theme plugin.
  - No changes are needed for existing theme plugins.
- **Potential Issues**: Since this is an experimental change, some features may break. Please report any issues encountered.

## v1.11.0 (956)

### Fixes
* Fixed a typo: "vission" → "vision" by @ByteJoseph in #1125
* Fixed heading and image alignment issues with `alignment="center"` on the plugin page by @bajrangCoder in #1132
* Fixed file listing in SFTP by @bajrangCoder in #1133
* Fixed fallback to `*/*` when the `accept` attribute is absent in `<input type="file">` in the in-app browser by @bajrangCoder in #1154
* Fixed console not reappearing after page reload in the in-app browser by @bajrangCoder in #1155
* Fixed infinite scroll on the plugin page to remove duplicates by @bajrangCoder in #1171
* Fixed logger to limit its size in #1167
* Fixed an issue where the info dialog wouldn't appear for non-editor tabs in #1167
* Fixed incorrect file attributes in FTP by @bajrangCoder in #1194
* Fixed the palette not opening when triggered from an existing palette by @bajrangCoder in #1197
* Fixed triggering of infinite scroll on plugin page while searching by @bajrangCoder in #1200

### Features
* Improved tab view gesture handling to distinguish between scroll and swipe on the plugin page by @bajrangCoder in #1131
* Added color preview for SVG files by @bajrangCoder in #1135
* Implemented custom editor tab support by @bajrangCoder in #1136
  * Now supports image, video, and audio previews directly in the editor instead of pop-ups
  * Exposed API for plugin developers to add content in editor tabs via `EditorFile`
* Redesigned the About page by @bajrangCoder in #1153
* Added a plugin rebuild option for local plugins by @bajrangCoder in #1150
  * Plugins can use `cordova.plugin.http` instead of `fetch` to avoid CORS issues when making network requests
* Redesigned the Plugin page by @bajrangCoder in #1152
  * Added new metadata fields in `plugin.json`: `license`, `changelog`, `keywords`, and `contributors`
* Added a new option to open files in an external app from the file browser in #1163
* Added minor sidebar UI tweaks and improved input element styling in #1164
* Used theme colors in the extra cutout area in landscape mode instead of the default color in #1165
* Improved file info dialog design in #1170
* Added Eruda console support for external sites in Acode's built-in browser in #1172
* Added a new editor setting: **"Fade fold widgets"** by @bajrangCoder in #1195
* Added a command to change the editor and app theme via the command palette by @bajrangCoder in #1197
* Added option to install plugins directly from sidebar extensions app by @bajrangCoder in #1200

### Improvements
* Improved paste operation with proper error handling in #1162
* Rewritten SFTP implementation(#1167):
  * Better performance and stability
  * Improved symlink support with better visual distinction
  * Proper error handling
  * Enhanced file reading (downloading) and writing
  * Uses native APIs for file system operations
  * Better buffer handling—now even 30-40 minute videos load within seconds (faster than internal storage)
  * Emoji support added
* Improved the FTP client (#1193) by @bajrangCoder
  * Supports emoji-named files
  * Improved symlink handling
  * Better handling of videos and images as binary files
  * Displays file names instead of full paths
* Reworked the plugin page UI—now displays essential info such as author, license, price, etc., in the list view by @bajrangCoder in #1196
* Tweaked breadcrumbs in the file browser to follow the app theme in #1167
* Updated the SSH library to `v3.1.2` in #1167
* Removed deprecated APIs in #1167
* Added experimental support for saving native logs in Acode Logger in #1167
* Tweaked the donation page  #1188

### Other Changes
* **Chore**: Updated Ace Editor to `v1.39.0`
  * Added CSV & TSV mode
  * Improved search support for multi-line patterns (`\n`, `\t`)
  * And more—see the Ace Changelog
* Many translation updates for `hu-hu` by @summoner

## v1.10.7 (955)

* Update hu-hu.json by @summoner001 in https://github.com/Acode-Foundation/Acode/pull/1092
* build(deps): bump path-to-regexp and express by @dependabot in https://github.com/Acode-Foundation/Acode/pull/1093
* Update hu-hu.json by @summoner001 in https://github.com/Acode-Foundation/Acode/pull/1094
* Exclude python `venv` and php `vendor` folders to speedup startup by @Jobians in https://github.com/Acode-Foundation/Acode/pull/1096
* Update de-de.json to 1.10.6.954 by @Micha-he in https://github.com/Acode-Foundation/Acode/pull/1097
* Update pl-pl.json by @andrewczm in https://github.com/Acode-Foundation/Acode/pull/1099
* minor fixes and tweaks by @bajrangCoder in https://github.com/Acode-Foundation/Acode/pull/1103
  * Added new command(file explorer) to open file manager
  * Added copy button to code blocks on plugin page
  * some error logging for debugging
  * few markdown tweaks
* Updating Brazilian Portuguese language  by @sebastianjnuwu in https://github.com/Acode-Foundation/Acode/pull/1102
* add className by @NezitX in https://github.com/Acode-Foundation/Acode/pull/1104
* Add monochrome icon by @Npepperlinux in https://github.com/Acode-Foundation/Acode/pull/1108
* fix: issue while making request to any ipv4, etc from app by @bajrangCoder in https://github.com/Acode-Foundation/Acode/pull/1107
* Update zh-cn.json and zh-hant.json by @LaunchLee in https://github.com/Acode-Foundation/Acode/pull/1109
* fix: show "No matches found" when palette has no matching items by @bajrangCoder in https://github.com/Acode-Foundation/Acode/pull/1110
* build(deps): bump systeminformation from 5.21.8 to 5.23.14 by @dependabot in https://github.com/Acode-Foundation/Acode/pull/1111
* Follow up for #1110 by @bajrangCoder in https://github.com/Acode-Foundation/Acode/pull/1112
* fix: cleanup plugin install state on failed installations by @bajrangCoder in https://github.com/Acode-Foundation/Acode/pull/1113
* feat: implement infinite scroll for plugin list by @bajrangCoder in https://github.com/Acode-Foundation/Acode/pull/1114
* feat: add quick install button for plugins in sidebar by @bajrangCoder in https://github.com/Acode-Foundation/Acode/pull/1115
* Plugin Dependencies by @alMukaafih in https://github.com/Acode-Foundation/Acode/pull/1030
* updated install state to reflect fs behaviour of android by @alMukaafih in https://github.com/Acode-Foundation/Acode/pull/1118
* fix: clean broken or half installed plugins on start by @bajrangCoder in https://github.com/Acode-Foundation/Acode/pull/1121
* few improvements by @bajrangCoder in https://github.com/Acode-Foundation/Acode/pull/1122

## v1.10.6 (954)

### New Features
- **Install State for Plugins**: Added an install state to improve plugin updates (#1026) by @alMukaafih, further enhanced by @bajrangCoder.
- **Selection Mode in File Browser**: Introduced a selection mode in the file browser by @bajrangCoder.
- **Persistent Notification System**: Added a persistent notification system with toast notifications by @bajrangCoder.
- **In-App Browser Command**: Added a command to open an in-app browser with a given URL by @angeloyana.
- **Font Size Shortcut Keys**: Added new key shortcuts for changing font size by @bajrangCoder:
    - Increase Font Size: `Ctrl - +` or `Ctrl - =`
    - Decrease Font Size: `Ctrl + -` or `Ctrl - _`
- **Command Palette Enhancements**:
    - "Open Plugin Page" command for quick access to plugin pages, especially for keyboard users.
    - "Copy Device Info" command to share device information for troubleshooting.
- **GitHub Alert Support**: Added GitHub alert support in plugin descriptions by @bajrangCoder.
- **File Tab Drop Behavior**: Dropping a file tab into any input or editor now inserts its path by @bajrangCoder.
- **File Browser Context Menu**: Added a "Copy URI" option in the file browser context menu by @bajrangCoder.
- **Project Import as ZIP**: Added the option to import projects as ZIP files by @bajrangCoder.
- **Backup Plugins**: You can now back up plugins, whether they are paid or free by @bajrangCoder.
- **Task List Markdown Support**: Added support for task lists (`- [x]`) in the plugin page markdown by @bajrangCoder.
- **Install as Plugin for ZIP Files**: Added the "Install as Plugin" option in the sidebar files section for ZIP files containing a `plugin.json` in the root directory by @bajrangCoder.
- **`acode.installPlugin` API**: Introduced an API for plugins to install other plugins with user consent by @bajrangCoder(available from versionCode: `954`).
- **View Changelogs in Settings**: Added an option in the settings page to view changelogs directly inside the app by @bajrangCoder.
- **App Update Checker**: Implemented an app update checker that runs on startup by @bajrangCoder.
- feat: copy/cut current line when selection is empty with same key shortcut by @angeloyana
- feat: add symlinks support in SFTP by @bajrangCoder

### Fixes
- **Plugin Loading Failures**: Improved handling of plugin loading failures by @bajrangCoder:
    - Prevents the app from crashing when plugins fail to load.
    - Shows user feedback for each failed plugin while continuing to load others.
- **Internal URL Navigation**: Replaced browser navigation with scroll behavior for internal links in plugin descriptions. Links to the same markdown now scroll instead of opening a browser by @bajrangCoder.
- **Pro Version Ads Issue**: Fixed an issue where plugin context menu actions displayed ads even if the Pro version was purchased by @UnschooledGamer.
- **Termux Private URI Operations**: Resolved issues with deleting folders/files and renaming files in Termux private URI file systems.
- **Logger Enhancements**: Improved the logger to automatically detect failures and use `console.error` in Acode.
- **Preview and Server Port Issue**: Fixed an issue where the browser did not open on the given port when the preview port and server port differed.
- **Font Persistence**: Resolved an issue where fonts did not persist after restarting the app.
- **Markdown Linking**: Fixed issues with linking to headings within the same page in markdown.
- **Search Bar in File Browser**: Fixed a bug where the search bar in the file browser would get stuck and become unclosable.
- **Theme Page Issues**: Addressed issues with theme plugins, including preview rendering and checkbox state changes.
- **Formatter Mode Selection**: Fixed the formatter ignoring the selected mode for files by @alMukaafih.
- fix: fetch plugin updates even if any fails by @UnschooledGamer
- fix: plugin update page by removing unwanted option icon @bajrangCoder

### Others
- **Plugin Refactor**: Migrated the old plugin update icon to a new toast-like notification widget.

### Translators
- Updated translations for specific languages contributed by:
    - **@Micha-he**: `de-de.json`
    - **@LaunchLee**: `zh-cn.json` and `zh-hant.json`
    - **@andrewczm**: `pl-pl.json`
    - **@Nekitori17**: `vi-vn`
    - **@s4ntiksu**: `ru-ru.json`
    - **@summoner001**: `hu-hu.json`
    - **@antikruk**: `be-by.json`

---

## [1.10.5] (953)

- New
  - Plugin Filtering System in #1011
  - feat: Add more action menu in sidebar plugin in #1017
  - Implement Logger system in #1020
  - Feat: Use Current File for preview (Toggle option) in #1006
  - updated ace editor to v1.36.2 in #1025

- Fixes
  - Update de-de.json in #1039
  - fixed sidebar plugin search list scrolling in #1002
  - Improve zh-TW traditional Chinese translation in #1004
  - fix: Fixed save all changes option in #1010
  - chore(i18n): vi-vn in #1016
  - removed auto paste of url on plugin page in #1023
  - fixed weird spacing issue on header #925 in #1024
  - Update zh-cn.json and zh-hant.json in #1031
  - Refactor Iap.java: Use WeakReference for Context and Activity to prevent memory leaks in #1040
  - Updated Polish translation in #1043
  - ru-ru improved in #1041
  - Update pl-pl.json in #1044 & #1045
  - fix: termux related fs operations failure in #1046

## [1.10.4] (952)

- New
  - Nested Files/Folder Creation
  - Updated ace to latest version
  - Improved displaying of Download count on Plugins page as well as on Sidebar
  - Enhanced search functionality to allow searching across all available plugins from the "all" section of the plugin page.
  - Added a new option on Help page for submitting bug reports.
- Fixes
  - Fixed issue with the search bar on the plugin page
  - Fixed issue with the search bar closing accidentally when clicking elsewhere on the screen

## [1.10.2]

- New
  - [x] **Updated Ace editor** | 947
    - Updated Ace editor to version 1.33.1.

## [1.10.1]

- New
  - [x] **Updated Ace editor** | 946
    - Updated Ace editor to version 1.32.9
- Fixes
  - [x] **Scrolling** | 946
    - Fixed scrollbars not showing up properly.

## [1.10.0]

- New
  - [x] **Ace editor** | 937
    - Updated Ace editor to version 1.32.7
- Fixes
  - [x] **UI** | 944
    - Fixed status and navigation text color not visible in light theme.
  - [x] **Plugin** | 944
    - Fixed updates for plugin not showing up.
  - [x] **Markdown** | 945
    - Fixed markdown preview not working properly.
  - [x] **Text selection** | 937
    - Fixed context menu not showing up when selecting all text from context menu after click and hold.

## [1.9.0]

- New
  - [x] **New in app browser** | 324
    - New in app browser with new UI.
    - You can emulate multiple devices.
  - [x] **New mode** | 933
    - Zig mode
    - Astro mode
- Fixes
  - [x] **File** | 931
    - Fixed not able share, edit or open with other apps.
    - Fixed file rename not working properly. | 934
  - [x] **Preview** | 934
    - Fixed preview where it opens browser two times.

## [1.8.8]

- New
  - [x] **Natural Scrolling** | 331
    - Acode now uses natural scrolling.
- Fixes
  - [x] **Selecting text** | 331
    - Fixed an issue where selecting text using long press and adding text to selection behaves unexpectedly.
  - [x] **Open folders** | 331
    - Fixed an issue where removing folder from sidebar doesn't remove the selected folder.

## [1.8.7]

- New
  - [x] **Updated Ace editor** | 318
    - Updated Ace editor to version 1.28.0
  - [x] **New problems page** | 318
    - You can now see all the problems in one place.
    - You can also see the problems in opened file.
  - [x] **New settings** | 318
    - New settings to toggle side buttons.
  - [x] **New Plugin API** | 318
    - `SideButton` is a new component that can be used to add side buttons.
  - [x] **New theme color** | 318
    - New `danger-color` and `danger-text-color` theme color.
  - [x] **New key binding** | 318
    - Use `Ctrl+Shift+X` key binding to open problems page.
  - [x] **Plugin** | 320
    - Install plugin directly from browser.
  - [x] **Intent** | 323
    - Plugin has now API to handle intent with uri acode://module/action/value.
- Fixes
  - [x] **Plugin page** | 318
    - Improved plugin page UI.
    - Shows plugin quickly when opened and loads new information in background.
  - [x] **Unsaved changes** | 318
    - Fixed unsaved changes not showing up in file when app restarted.
  - [x] **Quicktools** | 319
    - Fixed quicktools slides back when touch moved slightly.
  - [x] **Settings** | 321
    - Fixed settings not saving properly.
  - [x] **Internal storage** | 322
    - Fixed renaming file.
  - [x] **Side buttons** | 323
    - Fixed side buttons not shown properly.
  - [x] **Open folders** | 330
    - Fixed move file/folder not working properly.
  - [x] **Editor** | 330
    - Improved scrolling.
  - [x] **Quicktools** | 330
    - Improved quicktools.

## [1.8.6] - Build 313

- New
  - [x] **Search in settings**
    - You can now search for any settings in settings page.
- Updates
  - [x] **Language**
    - Updated language pack for Russian, Spanish, Portuguese and Deutsche.
  - [x] **Updated Ace editor**
    - Updated Ace editor to version 1.5.0
- Fixes
  - [x] **Sidebar search**
    - Fixed sidebar search not rendering words with special characters.
  - [x] **Not Loading**
    - Fixed app not loading on older devices.
  - [x] **Scrolling**
    - Fixed scrolling not working properly on some devices.
  - [x] **Eruda console**
    - Fixed eruda console not working properly.
  - [x] **Scrollbar**
    - Fixed scrollbar not working properly.
  - [x] **Custom theme**
    - Fixed custom theme not working properly.

## [1.8.5] - Build 295

- New
  - [x] **Scroll speed**
    - New 'Fast x2' scroll speed.
  - [x] **Touch handling**
    - Prevent accidental touch when tapping tear drop.
  - [x] **Color Preview**
    - You can now see color preview in css, scss, less, stylus and sass codes.
    - No need to select the whole color.
    - Enable/disable this feature from editor settings.
  - [x] **Smaller app size**
    - Reduced app size.
  - [x] **Updated icon pack**
    - Updated icon pack (mono color).
  - [x] **Default file encoding**
    - You can set default file encoding from settings.
  - [x] **File encoding**
    - Remember file encoding for each file.
  - [x] **Sidebar apps**
    - File list and extension list now remembers scroll position.
  - [x] **File tab bar**
    - When repositioning file tab bar, tab container will scroll when current tab is at the edge.
- Fixes
  - [x] **Touch handling**
    - Fixed teardrop and text menu not updated when switching tabs.
  - [x] **File encoding**
    - Fixed file encoding not working properly.
  - [x] **File icon**
    - Fixed inconsistent file icon.
  - [x] **JavaScript console**
    - Fixed JavaScript console not opening.
  - [x] **Ads**
    - Fixed ads taking screen when keyboard is open.
  - [x] **Insert file**
    - Fixed 'insert file' in opened folder not working properly.

## [1.8.4] - Build 283

- New
  - [x] **Updated Ace editor**
    - Updated Ace editor to version 1.22.0
  - [x] **Open files position**
    - **Bottom** `beta`: This is new option for open files position. You can change
      this from settings. This will open files in bottom of the screen.
  - [x] **Search in All Files** `beta`
    - This feature can be used to search and replace in all files in the opened projects.
    - To use this feature, open side bar and click on the search icon.
    - Note: This feature is in beta, so it may not work as expected.
  - [x] **Fast File Listing in Find Files (Ctrl + P)**
    - Loads files at startup and caches them for faster loading.
    - Watches file being created or modified from sidebar and updates the list
      accordingly.
  - [x] **Ctrl Key Functionality**
    - Keyboard shortcuts:
      - Ctrl+S: Save
      - Ctrl+Shift+P: Open the command palette. (Your shortcut may be different
        depending on what is saved in .keybindings.json file.)
  - [x] **Plugin API**
    - `contextMenu` is a component that can be used to show context menu in your plugin page.
  - [x] **Customisable quick tools**
    - You can now customise quick tools from settings.
- Fixes
  - [x] **Scrolling Issue**
    - Resolved an issue causing automatic scrolling from the cursor's
      position when the back button is pressed with the soft keyboard up.
    - Fixed a bug where scrollbar gets visible even when the file is not
      scrollable.
  - [x] **Active files in sidebar**
    - Fixed active files taking whole height of sidebar.
  - [x] **File opened using intent**
    - Fixed file opened using intent is not set as active file.
  - [x] **App doesn't load**
    - Fixed an issue where the app wouldn't load when an error occurred.
  - [x] **File tab bar**
    - Changing file tab bar position will not make editor lose focus.
  - [x] **Sidebar**
    - Fixed sidebar resized unknowingly when dragged to open or close it.
  - [x] **Close all tabs**
    - Fixed "close all" action opens up multiple confirm dialog for every unsaved file.
    - Now it will ask what to do with unsaved files.
  - [x] **File changed alert**
    - Fixed file changed alert showing up even when file is not changed.
  - [x] **Explore**
    - Fixed file not opening when opened from Explore.
  - [x] **Extensions app in sidebar**
    - Fixed extensions app's explore not rendering properly.
  - [x] **Minor bugs**
    - Fixed many minor bugs.
    - Improved stability.

## [1.8.3] - Build 278

- [x] Bugs fixes

## [1.8.2] - Build 276

- [x] Updated ace editor to version v1.18.0
- [x] Bugs fixes

## [1.8.1] - Build 274

- [x] Clicking on gutter will go to that line
- [x] Plugin Stability improvement
- [x] Updated ace editor
- [x] Bugs fixes

## [1.8.0] - Build 272

- [x] Plugins can support themes, fonts and sidebar items
- [x] Redesigned sidebar and quicktools
- [x] UI improvements
- [x] Bugs fixes

## [1.7.2] - Build 268

- [x] Added new command to toggle quick tools
- [x] Added back search in quick tools
- [x] Palette will close on ESC key
- [x] Plugin settings UI
- [x] Bugs fixes

## [1.7.1] - Build 266

- [x] Swipe to change tab in plugins page
- [x] Fixed update paid plugin
- [x] Bugs fixes

## [1.7.0] - Build 262

- [x] New medium size teardrop
- [x] Fixed some indic languages rendering
- [x] Fixed selection bug
- [x] Support for paid plugins
- [x] Quick tools improvement
- [x] Settings will have info button, you can see more info about settings
- [x] Updated plugin system
- [x] You can see plugin review and rating
- [x] GitHub is removed from app but, you can still use it from plugin
- [x] Bugs fixes

## [1.7.0] - Build 260

- [x] Quick tools improvement
- [x] Settings will have info button, you can see more info about settings
- [x] Updated plugin system
- [x] You can see plugin review and rating
- [x] GitHub is removed from app but, you can still use it from plugin
- [x] Bugs fixes

## [1.6.1] - Build 245

- [x] Updated plugin CDN

## [1.6.0] - Build 244

- [x] Updated plugin APIs
- [x] Updated text menu
- [x] Install plugin form device
- [x] Updated ace editor

## [1.6.0] - Build 239

- [x] Fixed horizontal scroll bug
- [x] Updated ace editor

## [1.6.0] - Build 235

- [x] Retry FTP/SFTP connection when fail
- [x] Supports plugin
- [x] Updated custom theme settings
- [x] Set custom port for preview in app settings
- [x] New option find file
- [x] Stability improvement
- [x] UI improvement
- [x] Fixed keyboard issues
- [x] Fixed tap hold to select text
- [x] Fixed loading files using FTP/SFTP
- [x] Fixed File checking
- [x] Fixed settings
- [x] Various fixes


================================================
FILE: CODE_OF_CONDUCT.md
================================================
# Contributor Covenant Code of Conduct

## Our Pledge

We as members, contributors, and leaders pledge to make participation in our
community a harassment-free experience for everyone, regardless of age, body
size, visible or invisible disability, ethnicity, sex characteristics, gender
identity and expression, level of experience, education, socio-economic status,
nationality, personal appearance, race, religion, or sexual identity
and orientation.

We pledge to act and interact in ways that contribute to an open, welcoming,
diverse, inclusive, and healthy community.

## Our Standards

Examples of behavior that contributes to a positive environment for our
community include:

* Demonstrating empathy and kindness toward other people
* Being respectful of differing opinions, viewpoints, and experiences
* Giving and gracefully accepting constructive feedback
* Accepting responsibility and apologizing to those affected by our mistakes,
  and learning from the experience
* Focusing on what is best not just for us as individuals, but for the
  overall community

Examples of unacceptable behavior include:

* The use of sexualized language or imagery, and sexual attention or
  advances of any kind
* Trolling, insulting or derogatory comments, and personal or political attacks
* Public or private harassment
* Publishing others' private information, such as a physical or email
  address, without their explicit permission
* Other conduct which could reasonably be considered inappropriate in a
  professional setting

## Enforcement Responsibilities

Community leaders are responsible for clarifying and enforcing our standards of
acceptable behavior and will take appropriate and fair corrective action in
response to any behavior that they deem inappropriate, threatening, offensive,
or harmful.

Community leaders have the right and responsibility to remove, edit, or reject
comments, commits, code, wiki edits, issues, and other contributions that are
not aligned to this Code of Conduct, and will communicate reasons for moderation
decisions when appropriate.

## Scope

This Code of Conduct applies within all community spaces, and also applies when
an individual is officially representing the community in public spaces.
Examples of representing our community include using an official e-mail address,
posting via an official social media account, or acting as an appointed
representative at an online or offline event.

## Enforcement

Instances of abusive, harassing, or otherwise unacceptable behavior may be
reported to the community leaders responsible for enforcement at Acode.CODE_OF_CONDUCT.md
All complaints will be reviewed and investigated promptly and fairly.

All community leaders are obligated to respect the privacy and security of the
reporter of any incident.

## Enforcement Guidelines

Community leaders will follow these Community Impact Guidelines in determining
the consequences for any action they deem in violation of this Code of Conduct:

### 1. Corrections Issues

**Community Impact**: Must Not Use of inappropriate coding language or other hacker behavior deemed
Any professional or manipulative findings like ease dropping hackers, malware bots, or faulty A.I. that breaks code for attacks against citizens cut-off for those programs and users are rendered fictitious businesses spammers using meta-trans-users causing confusion and corruption problems recirculating systems. Without help fixing these misconducts are responsible with talk back in any encryptions Acode intelligence blocking them from entry to another account. Issues and comments are welcome in the community.

**Consequence**: A private, written warning from community leaders, providing
clarity around the nature of the violation and an explanation of why the
behavior was inappropriate. A public apology may be requested.

### 2. Warning

**Community Impact**: A violation through a single incident or series
of actions.

**Consequence**: A warning with consequences for continued behavior. No
interaction with the people involved, including unsolicited interaction with
those enforcing the Code of Conduct, for a specified period of time. This
includes avoiding interactions in community spaces as well as external channels
like social media. Violating these terms may lead to a temporary or
permanent ban.

### 3. Temporary Guidance
**Community Impact**: A serious violation of community standards, including
sustained inappropriate behavior.

**Consequence**: A temporary ban from any sort of interaction or public
communication with the community for a specified period of time. No public or
private interaction with the people involved, including unsolicited interaction
with those enforcing the Code of Conduct, is allowed during this period.
Violating these terms may lead to a permanent ban.

### 4. Permanent view

**Community Impact**: Demonstrating a pattern of violation of community
standards, including sustained inappropriate behavior,  harassment of an
individual, or aggression toward or disparagement of classes of individuals.

**Consequence**: A permanent free service for bandwidth/LTE technology, for opening arguments within discussions hearing any testing that class forms, and any sort of arbitration claims processed are settled. Giving back to private sectors,to public interaction within
the community, state, country, and never excludes global conglomerates due to consumer reports, feedbacks, sharing viable information that interests any disadvantages against

## Attribution

This Code of Conduct is adapted from the [Contributor Covenant][homepage],
version 2.0, available at
https://www.contributor-covenant.org/version/2/0/code_of_conduct.html.

Community Impact Guidelines were inspired by [Mozilla's code of conduct
enforcement reversal legislation relativity](https://github.com/mozilla/diversity).

[homepage]: https://www.contributor-covenant.org

For answers to common questions about this code of conduct, see the FAQ at
https://www.contributor-covenant.org/faq. Translations are available at
https://www.contributor-covenant.org/translations.


================================================
FILE: CONTRIBUTING.md
================================================
# Contributing to Acode

Thank you for your interest in contributing to Acode! This guide will help you get started with development.

## Quick Start Options

### Option 1: DevContainer (Recommended)

1. Install the [Dev Containers extension](https://marketplace.visualstudio.com/items?itemName=ms-vscode-remote.remote-containers) in VS Code or other editors that support DevContainers.

2. Clone and open the repository:
   ```bash
   git clone https://github.com/Acode-Foundation/Acode.git
   code Acode
   ```

3. When VS Code prompts "Reopen in Container", click it
   - Or use Command Palette (Cmd/Ctrl+Shift+P) → "Dev Containers: Reopen in Container"

4. Wait for the container to build (~5-10 minutes first time, subsequent opens are instant)

5. Once ready, build the APK:
   ```bash
   pnpm run build paid dev apk
   ```

   > Use any package manager (pnpm, bun, npm, yarn, etc.)

### Option 2: Docker CLI (For Any Editor)

If your editor doesn't support DevContainers, you can use Docker directly:

```bash
# Clone the repository
git clone https://github.com/Acode-Foundation/Acode.git
cd Acode

# Build the Docker image from our Dockerfile
docker build -t acode-dev .devcontainer/

# Run the container with your code mounted
docker run -it --rm \
  -v "$(pwd):/workspaces/acode" \
  -w /workspaces/acode \
  acode-dev \
  bash

# Inside the container, run setup and build
# bun run setup && bun run build paid dev apk
pnpm run setup
pnpm run build paid dev apk # or pnpm run build p d
```

**Keep container running for repeated use:**
```bash
# Start container in background
docker run -d --name acode-dev \
  -v "$(pwd):/workspaces/acode" \
  -w /workspaces/acode \
  acode-dev \
  sleep infinity

# Execute commands in the running container
docker exec -it acode-dev bash -c "pnpm run setup"
docker exec -it acode-dev pnpm run build paid dev apk

# Stop and remove when done
docker stop acode-dev && docker rm acode-dev
```

---

## 🛠️ Manual Setup (Without Docker)

If you prefer not to use Docker at all:

### Prerequisites

| Requirement | Version |
|------------|---------|
| **Node.js** | 18+ (22 recommended) |
| **pnpm** or **bun** | Latest |
| **Java JDK** | 17+ (21 recommended) |
| **Android SDK** | API 35 | 
| **Gradle** | 8.x |

### Environment Setup

Add these to your shell profile (`~/.bashrc`, `~/.zshrc`, or `~/.config/fish/config.fish`):

**macOS:**
```bash
export ANDROID_HOME="$HOME/Library/Android/sdk"
export PATH="$PATH:$ANDROID_HOME/platform-tools:$ANDROID_HOME/cmdline-tools/latest/bin"
```

**Linux:**
```bash
export ANDROID_HOME="$HOME/Android/Sdk"
export PATH="$PATH:$ANDROID_HOME/platform-tools:$ANDROID_HOME/cmdline-tools/latest/bin"
```

Some more environment variables, check [cordova docs](https://cordova.apache.org/docs/en/latest/guide/platforms/android/index.html).

### Build Steps

```bash
# Clone the repository
git clone https://github.com/Acode-Foundation/Acode.git
cd Acode

# Install dependencies and set up Cordova
pnpm run setup

# Build the APK
pnpm run build paid dev apk # or pnpm run build p d
```

The APK will be at: `platforms/android/app/build/outputs/apk/debug/app-debug.apk`


## 📝 Contribution Guidelines

### Before Submitting a PR

1. **Fork** the repository and create a branch from `main`
2. **Make changes** - keep commits focused and atomic
3. **Check code quality:**
   ```bash
   pnpm run check
   ```
4. **Test** on a device or emulator if possible

### Pull Request Checklist

- [ ] Clear description of changes
- [ ] Reference to related issue (if applicable)
- [ ] Screenshots/GIFs for UI changes
- [ ] Passing CI checks

### Code Style

We use [Biome](https://biomejs.dev/) for linting and formatting:
- Run `pnpm run check` before committing
- Install the Biome VS Code extension for auto-formatting

### Commit Messages

Use clear, descriptive messages:
```
feat: add dark mode toggle to settings
fix: resolve crash when opening large files
docs: update build instructions
refactor: simplify file loading logic
```

## 🌍 Adding Translations

1. Create a JSON file in `src/lang/` (e.g., `fr-fr.json` for French)
2. Add it to `src/lib/lang.js`
3. Use the translation utilities:
   ```bash
   pnpm run lang add       # Add new string
   pnpm run lang remove    # Remove string
   pnpm run lang search    # Search strings
   pnpm run lang update    # Update translations
   ```

## ℹ️ Adding New Icons (to the existing font family)
> [!NOTE]
> Acode uses SVG and converts them into a font family, to be used inside the editor and generally for plugin devs.
> 
> **Plugin-specific icons SHOULD NOT be added into the editor. Only generally helpful icons SHOULD BE added**

Many font editing software and web-based tools exist for this purpose. Some of them are listed below.

| Name | Platform |
|------|----------|
| https://icomoon.io/ | Free (Web-Based, PWA-supported, Offline-supported) |
| https://fontforge.org/ | Open-Source (Linux, Mac, Windows) |

### Steps in Icomoon to add new Icons

1. Download the `code-editor-icon.icomoon.json` file from https://github.com/Acode-Foundation/Acode/tree/main/utils
2. Go to https://icomoon.io/ > Import
3. Import the `code-editor-icon.icomoon.json` downloaded (in step 1)
4. All icons will be displayed after importing.
5. Import the SVG icon created/downloaded to be added to the Font Family.
6. On the right side, press **enable Show Characters** & **Show Names** to view the Unicode character & Name for that icon.
7. Provided the newly added SVG icon with a name (in the name box).
8. Repeat Step 5 and Step 7 until all needed new icons are added.
9. Press the export icon from the top left-hand side.
10. Press the download button, and a zip file will be downloaded.
11. Go to the Projects section of [icomoon](https://icomoon.io/new-app), uncollapse/expand the Project named `code-editor-icon`  and press the **save** button (this downloads the project file named: `code-editor-icon.icomoon.json`)

### Updating Project files for Icon Contribution
1. Extract the downloaded zip file; navigate to the `fonts` folder inside it.
2. Rename `code-editor-icon.ttf` to `icons.ttf`.
3. Copy & paste the renamed `icons.ttf` into https://github.com/Acode-Foundation/Acode/tree/main/src/res/icons
4. Copy and paste the `code-editor-icon.icomoon.json` file (downloaded in the adding icons steps) onto https://github.com/Acode-Foundation/Acode/tree/main/utils (yes, replace it with the newer one; we downloaded!)
4. Commit the changes **ON A NEW branch** (by following: [Commit Messages guide](#commit-messages))

## 🔌 Plugin Development

To create plugins for Acode:
- [Plugin Starter Repository](https://github.com/Acode-Foundation/acode-plugin)
- [Plugin Documentation](https://docs.acode.app/)


================================================
FILE: _typos.toml
================================================
[default]
check-filename = true

[files]
extend-exclude = [
    "node_modules",
    "www",
    "*.yaml",
    ".vscode",
    "fastlane",
    "hooks",
    "*.gradle",
    "plugins",
    "platforms",
    "src/lang/ar-ye.json",
    "src/lang/be-by.json",
    "src/lang/bn-bd.json",
    "src/lang/cs-cz.json",
    "src/lang/de-de.json",
    "src/lang/es-sv.json",
    "src/lang/fr-fr.json",
    "src/lang/hi-in.json",
    "src/lang/hu-hu.json",
    "src/lang/id-id.json",
    "src/lang/ir-fa.json",
    "src/lang/it-it.json",
    "src/lang/ja-jp.json",
    "src/lang/ko-kr.json",
    "src/lang/ml-in.json",
    "src/lang/mm-unicode.json",
    "src/lang/mm-zawgyi.json",
    "src/lang/pl-pl.json",
    "src/lang/pt-br.json",
    "src/lang/pu-in.json",
    "src/lang/ru-ru.json",
    "src/lang/tl-ph.json",
    "src/lang/tr-tr.json",
    "src/lang/uk-ua.json",
    "src/lang/uz-uz.json",
    "src/lang/vi-vn.json",
    "src/lang/zh-cn.json",
    "src/lang/zh-hant.json",
    "src/lang/zh-tw.json",
]

[default.extend-words]
# temporary thing to staisfy the linter
strech = "strech"
contaienr = "contaienr"
formate = "formate"
collapsable = "collapsable"
styl = "styl"
IZ = "IZ"
shft = "shft"
multline = "multline"


================================================
FILE: biome.json
================================================
{
	"$schema": "https://biomejs.dev/schemas/2.4.11/schema.json",
	"formatter": {
		"enabled": true,
		"indentStyle": "tab"
	},
	"assist": {
		"actions": {
			"source": {
				"organizeImports": "on"
			}
		}
	},
	"linter": {
		"enabled": true,
		"rules": {
			"recommended": false,
			"complexity": {
				"noForEach": "off",
				"noStaticOnlyClass": "error",
				"noUselessSwitchCase": "error",
				"useFlatMap": "error"
			},
			"style": {
				"noNegationElse": "off",
				"useForOf": "error",
				"useNodejsImportProtocol": "error",
				"useNumberNamespace": "error"
			},
			"suspicious": {
				"noDoubleEquals": "error",
				"noThenProperty": "error",
				"useIsArray": "error"
			}
		}
	},
	"javascript": {
		"globals": ["Global1"]
	},
	"files": {
		"includes": [
			"**/src/**/*",
			"**/utils/**/*.js",
			"!**/www/build/**/*",
			"**/www/res/**/*.css",
			"**/src/plugins/terminal/**",
			"!**/ace-builds",
			"!**/src/plugins/**/*",
			"!**/plugins/**/*",
			"!**/hooks/**/*",
			"!**/fastlane/**/*",
			"!**/res/**/*",
			"!**/platforms/**/*"
		]
	}
}


================================================
FILE: build-extras.gradle
================================================
android {
    packagingOptions {
        pickFirst 'META-INF/versions/9/OSGI-INF/MANIFEST.MF'
    }
}

configurations {
  all {
      exclude module: 'commons-logging'
      exclude group: 'org.bouncycastle', module: 'bcprov-jdk15on'
      exclude group: 'org.bouncycastle', module: 'bcpkix-jdk15on'
      exclude group: 'org.bouncycastle', module: 'bcpkix-jdk18on'
      exclude group: 'org.bouncycastle', module: 'bcprov-jdk18on'
  }
}

================================================
FILE: config.xml
================================================
<?xml version='1.0' encoding='utf-8' ?>
<widget id="com.foxdebug.acode" android-versionCode="967" version="1.11.8"
    xmlns="http://www.w3.org/ns/widgets"
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:cdv="http://cordova.apache.org/ns/1.0">
    <name>Acode</name>
    <description>
        Light weight code editor and web IDE for android.
    </description>
    <author email="ajit@foxdebug.com" href="https://foxdebug.com">
       Foxdebug
    </author>
    <content src="index.html" />
    <access launch-external="yes" origin="*" />
    <allow-navigation href="https://*/*" />
    <allow-navigation href="http://*/*" />
    <allow-intent href="http://*/*" />
    <allow-intent href="https://*/*" />
    <allow-intent href="tel:*" />
    <allow-intent href="sms:*" />
    <allow-intent href="mailto:*" />
    <allow-intent href="geo:*" />

    <platform name="android">
        <allow-intent href="market:*" />
        <preference name="fullscreen" value="false"/>
        <preference name="SplashScreen" value="none"/>
        <preference name="ShowTitle" value="true"/>
        <preference name="DisallowOverscroll" value="true" />
        <preference name="BackgroundColor" value="0xFF313131" />
        <preference name="AndroidWindowSplashScreenBackground" value="@color/ic_splash_background" />
        <preference name="AndroidWindowSplashScreenAnimatedIcon" value="res/android/drawable/ic_launcher_foreground.xml" />
        <preference name="AndroidPostSplashScreenTheme" value="@style/Theme.App.Activity" />
        <preference name="AndroidPersistentFileLocation" value="Compatibility" />
        <preference name="AndroidLaunchMode" value="singleTask" />
        <preference name="prerendered-icon" value="false" />
        <preference name="androidxEnabled" value="true" />
        <preference name="GradlePluginKotlinEnabled" value="true" />
        <preference name="android-targetSdkVersion" value="36" />

        <!-- Cordova does not merge this unless both of these are present -->
        <edit-config file="AndroidManifest.xml" mode="merge" target="/manifest/application">
            <application 
                android:usesCleartextTraffic="true"
                android:networkSecurityConfig="@xml/network_security_config"
                android:hardwareAccelerated="true"
                android:largeHeap="true"
                android:requestLegacyExternalStorage="true"
                android:enableOnBackInvokedCallback="false" />
        </edit-config>

        <!-- Cordova does not merge this unless both of these are present -->
        <edit-config file="app/src/main/AndroidManifest.xml" mode="merge" target="/manifest/application">
            <application android:networkSecurityConfig="@xml/network_security_config" />
            <application android:usesCleartextTraffic="true" />
            <application android:hardwareAccelerated="true" />
            <application android:largeHeap="true" />
            <application android:requestLegacyExternalStorage="true"/>
            <application android:enableOnBackInvokedCallback="false" />
        </edit-config>

        <edit-config file="app/src/main/AndroidManifest.xml" mode="merge" target="/manifest/application/activity[@android:name='MainActivity']">
            <activity android:resizeableActivity="true" />
        </edit-config>

        <config-file parent="./application/activity" target="AndroidManifest.xml">
            <intent-filter>
                <action android:name="android.intent.action.VIEW" />
                <action android:name="android.intent.action.EDIT" />
                <category android:name="android.intent.category.DEFAULT" />
                <category android:name="android.intent.category.LAUNCHER" />
                <data android:mimeType="*/*"/>
            </intent-filter>
            <!-- Allow app to open using url from browser -->
            <intent-filter android:autoVerify="true">
                <action android:name="android.intent.action.VIEW" />
                <category android:name="android.intent.category.DEFAULT" />
                <category android:name="android.intent.category.BROWSABLE" />
                <data android:scheme="acode" />
            </intent-filter>
        </config-file>

        <config-file target="AndroidManifest.xml" parent="/manifest">
            <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
            <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
            <uses-permission android:name="android.permission.WRITE_MEDIA_STORAGE" />
            <uses-permission android:name="android.permission.VIBRATE" />
        </config-file>

        <hook type="before_prepare" src="hooks/restore-cordova-resources.js" />
        <hook type="before_prepare" src="hooks/modify-java-files.js" />
        <hook type="after_prepare" src="hooks/post-process.js" />
    </platform>
    <preference name="AndroidBlacklistSecureSocketProtocols" value="SSLv3,TLSv1" />
</widget>


================================================
FILE: fastlane/metadata/android/en-US/full_description.txt
================================================
Welcome to Acode!

A powerful, lightweight code editor, and web IDE for Android. Now enhanced with cutting-edge features and updates to transform your coding experience.

What's New?

Step into the future of coding with our innovative Plugin System. This brand new feature supports a wide range of plugins, boosting the functionality of Acode to meet all your development needs. With over 30 plugins already available in the Plugin Store, the possibilities are endless.

Latest Updates Include:

- Enhanced Ace Editor: Now updated to version 1.22.0 for more efficient editing.
- Search in All Files: Our beta feature lets you search and replace text in all files within your opened projects.
- Customizable Quick Tools: Personalize your quick tools to enhance your workflow.
- Fast File Listing in Find Files (Ctrl + P): Acode now loads and caches files at startup, leading to faster file listing.
- Ctrl Key Functionality: Take advantage of keyboard shortcuts for actions such as save (Ctrl+S) and open command palette (Ctrl+Shift+P).

Why Choose Acode?

Acode lets you build and run websites directly within your browser, debug with ease using the integrated console, and edit a wide range of source files - from Python and CSS to Java, JavaScript, Dart, and more.

Key Features:

- Universal File Editor: Edit any file directly from your device.
- GitHub Integration: Seamlessly sync your projects with GitHub.
- FTP/SFTP Support: Manage your files efficiently with FTP/SFTP.
- Extensive Syntax Highlighting: Supports over 100 programming languages.
- Personalized Themes: Choose from dozens of unique themes to match your style.
- User-Friendly Interface: Navigate with ease through our intuitive design.
- In-App Preview: Instantly view your HTML/MarkDown files within the app.
- Interactive JavaScript Console: Debug JavaScript code right from the console.
- In-App File Browser: Access your files directly within Acode.
- Open Source: Benefit from our transparent and community-driven project.
- High Performance: Supports files with over 50,000 lines, ensuring smooth workflow.
- Multi-File Support: Work on multiple files simultaneously for productive multitasking.
- Customizable Interface: Adapt Acode to your personal coding style.
- Keyboard Shortcuts: Speed up your coding with handy shortcuts.
- File Recovery: Never lose your work with our reliable file recovery feature.
- File Management: Keep your projects organized with effective file management.

Start your streamlined coding journey with Acode today. Join our ever-growing community of developers and experience the difference for yourself!

================================================
FILE: fastlane/metadata/android/en-US/short_description.txt
================================================
A lightweight but powerful text/code editor.

================================================
FILE: fastlane/metadata/android/en-US/title.txt
================================================
Acode editor - Android code editor

================================================
FILE: hooks/README.md
================================================
<!--
#
# Licensed to the Apache Software Foundation (ASF) under one
# or more contributor license agreements.  See the NOTICE file
# distributed with this work for additional information
# regarding copyright ownership.  The ASF licenses this file
# to you under the Apache License, Version 2.0 (the
# "License"); you may not use this file except in compliance
# with the License.  You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing,
# software distributed under the License is distributed on an
# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
#  KIND, either express or implied.  See the License for the
# specific language governing permissions and limitations
# under the License.
#
-->
# Cordova Hooks

Cordova Hooks represent special scripts which could be added by application and plugin developers or even by your own build system  to customize cordova commands. See Hooks Guide for more details:  http://cordova.apache.org/docs/en/edge/guide_appdev_hooks_index.md.html#Hooks%20Guide.


================================================
FILE: hooks/modify-java-files.js
================================================
const path = require('path');
const fs = require('fs');
const prettier = require('prettier');

main();

async function main() {
  const patchVersion = '2';
  const flagFile = path.resolve(__dirname, '../platforms/android/.flag_done');
  if (fs.existsSync(flagFile)) {
    const appliedVersion = fs.readFileSync(flagFile, 'utf8').trim();
    if (appliedVersion === patchVersion) {
      return;
    }
  }

  const base = path.resolve(__dirname, `../platforms/android/CordovaLib/src/org/apache/cordova`);
  const files = {
    'SystemWebView.java': `${base}/engine/SystemWebView.java`,
    'SystemWebViewEngine.java': `${base}/engine/SystemWebViewEngine.java`,
    'CordovaWebViewEngine.java': `${base}/CordovaWebViewEngine.java`,
    'CordovaWebView.java': `${base}/CordovaWebView.java`,
    'CordovaWebViewImpl.java': `${base}/CordovaWebViewImpl.java`,
  };

  const interfaceMethod = {
    name: 'setInputType',
    modifier: 'public',
    returnType: 'void',
    params: [
      {
        type: 'int',
        name: 'type',
      }
    ],
  };

  const nativeContextMenuInterfaceMethod = {
    name: 'setNativeContextMenuDisabled',
    modifier: 'public',
    returnType: 'void',
    params: [
      {
        type: 'boolean',
        name: 'disabled',
      }
    ],
  };

  const setInputTypeMethod = {
    name: 'setInputType',
    modifier: 'public',
    returnType: 'void',
    params: [
      {
        type: 'int',
        name: 'type',
      }
    ],
    body: ['webView.setInputType(type);'],
  };

  const setNativeContextMenuDisabledMethod = {
    name: 'setNativeContextMenuDisabled',
    modifier: 'public',
    returnType: 'void',
    params: [
      {
        type: 'boolean',
        name: 'disabled',
      }
    ],
    body: ['webView.setNativeContextMenuDisabled(disabled);'],
  };

  const contentToAdd = {
    'SystemWebView.java': {
      'import': [
        'android.graphics.Rect',
        'android.os.Build',
        'android.text.InputType',
        'android.view.ActionMode',
        'android.view.inputmethod.InputConnection',
        'android.view.inputmethod.EditorInfo',
        'android.view.Menu',
        'android.view.MenuItem',
        'android.view.View',
      ],
      'fields': [
        {
          type: 'int',
          name: 'type',
          modifier: 'private',
          value: '-1',
        },
        {
          type: 'int',
          name: 'NO_SUGGESTIONS',
          modifier: 'private',
          value: '0',
        },
        {
          type: 'int',
          name: 'NO_SUGGESTIONS_AGGRESSIVE',
          modifier: 'private',
          value: '1',
        },
        {
          type: 'boolean',
          name: 'nativeContextMenuDisabled',
          modifier: 'private',
          value: 'false',
        },
      ],
      methods: [
        {
          ...setInputTypeMethod,
          body: [`this.type = type;`]
        },
        {
          name: 'setNativeContextMenuDisabled',
          modifier: 'public',
          returnType: 'void',
          params: [
            {
              type: 'boolean',
              name: 'disabled',
            }
          ],
          body: [`this.nativeContextMenuDisabled = disabled;`],
        },
        {
          name: 'onCreateInputConnection',
          modifier: 'public',
          returnType: 'InputConnection',
          params: [
            {
              type: 'EditorInfo',
              name: 'outAttrs',
            }
          ],
          body: [
            `InputConnection ic = super.onCreateInputConnection(outAttrs);
            if (type == NO_SUGGESTIONS) {
              outAttrs.inputType |= InputType.TYPE_TEXT_FLAG_NO_SUGGESTIONS;
            } else if (type == NO_SUGGESTIONS_AGGRESSIVE) {
              outAttrs.inputType =
                InputType.TYPE_TEXT_FLAG_NO_SUGGESTIONS |
                InputType.TYPE_TEXT_VARIATION_VISIBLE_PASSWORD;
            } else {
              outAttrs.inputType |= InputType.TYPE_NULL;
            }

            return ic;`,
          ],
          notation: '@Override',
        },
        {
          name: 'startActionMode',
          modifier: 'public',
          returnType: 'ActionMode',
          params: [
            {
              type: 'ActionMode.Callback',
              name: 'callback',
            }
          ],
          body: [
            `return suppressActionMode(super.startActionMode(wrapActionModeCallback(callback)));`,
          ],
          notation: '@Override',
        },
        {
          name: 'startActionMode',
          modifier: 'public',
          returnType: 'ActionMode',
          params: [
            {
              type: 'ActionMode.Callback',
              name: 'callback',
            },
            {
              type: 'int',
              name: 'type',
            }
          ],
          body: [
            `return suppressActionMode(super.startActionMode(wrapActionModeCallback(callback), type));`,
          ],
          notation: '@Override',
        },
        {
          name: 'startActionModeForChild',
          modifier: 'public',
          returnType: 'ActionMode',
          params: [
            {
              type: 'View',
              name: 'originalView',
            },
            {
              type: 'ActionMode.Callback',
              name: 'callback',
            }
          ],
          body: [
            `return suppressActionMode(super.startActionModeForChild(originalView, wrapActionModeCallback(callback)));`,
          ],
          notation: '@Override',
        },
        {
          name: 'startActionModeForChild',
          modifier: 'public',
          returnType: 'ActionMode',
          params: [
            {
              type: 'View',
              name: 'originalView',
            },
            {
              type: 'ActionMode.Callback',
              name: 'callback',
            },
            {
              type: 'int',
              name: 'type',
            }
          ],
          body: [
            `return suppressActionMode(super.startActionModeForChild(originalView, wrapActionModeCallback(callback), type));`,
          ],
          notation: '@Override',
        },
        {
          name: 'wrapActionModeCallback',
          modifier: 'private',
          returnType: 'ActionMode.Callback',
          params: [
            {
              type: 'ActionMode.Callback',
              name: 'callback',
            }
          ],
          body: [
            `if (!nativeContextMenuDisabled || callback == null) {
              return callback;
            }
            return new ActionMode.Callback2() {
              @Override
              public boolean onCreateActionMode(ActionMode mode, Menu menu) {
                boolean created = callback.onCreateActionMode(mode, menu);
                if (created) {
                  suppressActionModeUi(mode, menu);
                }
                return created;
              }

              @Override
              public boolean onPrepareActionMode(ActionMode mode, Menu menu) {
                boolean prepared = callback.onPrepareActionMode(mode, menu);
                suppressActionModeUi(mode, menu);
                return prepared;
              }

              @Override
              public boolean onActionItemClicked(ActionMode mode, MenuItem item) {
                return callback.onActionItemClicked(mode, item);
              }

              @Override
              public void onDestroyActionMode(ActionMode mode) {
                callback.onDestroyActionMode(mode);
              }

              @Override
              public void onGetContentRect(ActionMode mode, View view, Rect outRect) {
                if (callback instanceof ActionMode.Callback2) {
                  ((ActionMode.Callback2) callback).onGetContentRect(mode, view, outRect);
                  return;
                }
                super.onGetContentRect(mode, view, outRect);
              }
            };`,
          ],
        },
        {
          name: 'suppressActionMode',
          modifier: 'private',
          returnType: 'ActionMode',
          params: [
            {
              type: 'ActionMode',
              name: 'mode',
            }
          ],
          body: [
            `if (mode == null || !nativeContextMenuDisabled) {
              return mode;
            }
            suppressActionModeUi(mode, mode.getMenu());
            return mode;`,
          ],
        },
        {
          name: 'suppressActionModeUi',
          modifier: 'private',
          returnType: 'void',
          params: [
            {
              type: 'ActionMode',
              name: 'mode',
            },
            {
              type: 'Menu',
              name: 'menu',
            }
          ],
          body: [
            `if (mode == null || !nativeContextMenuDisabled || menu == null) {
              return;
            }
            menu.clear();
            mode.setTitle(null);
            mode.setSubtitle(null);
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
              post(() -> {
                if (!nativeContextMenuDisabled) {
                  return;
                }
                try {
                  mode.hide(0);
                } catch (Throwable ignored) {
                }
              });
            }`,
          ],
        },
      ]
    },
    'SystemWebViewEngine.java': {
      methods: [
        setInputTypeMethod,
        setNativeContextMenuDisabledMethod,
      ]
    },
    'CordovaWebViewEngine.java': {
      methods: [
        interfaceMethod,
        nativeContextMenuInterfaceMethod,
      ]
    },
    'CordovaWebView.java': {
      methods: [
        interfaceMethod,
        nativeContextMenuInterfaceMethod,
      ]
    },
    'CordovaWebViewImpl.java': {
      methods: [
        {
          ...setInputTypeMethod,
          body: [`engine.setInputType(type);`]
        },
        {
          ...setNativeContextMenuDisabledMethod,
          body: [`engine.setNativeContextMenuDisabled(disabled);`]
        }
      ]
    }
  };

  const fileContent = {};

  for (let file in files) {
    fileContent[file] = fs.readFileSync(files[file], 'utf8');
  }

  for (let file in contentToAdd) {
    const content = fileContent[file];
    const contentToAddTo = contentToAdd[file];
    const text = removeComments(content);
    let newContent = await format(text);
    if (contentToAddTo.import) {
      const imports = contentToAddTo.import.map(importStr => {
        return `import ${importStr};`;
      }).join('\n');

      newContent = newContent.replace(
        /^(\s*)(import.*;)/m,
        `$1${imports}\n$2`
      );
    }
    if (contentToAddTo.fields) {
      const fields = contentToAddTo.fields.map(field => {
        return getFieldString(field);
      }).join('\n');
      newContent = newContent.replace(
        /^(\s*)(\w+\s+\w+\s*;)/m,
        `$1${fields}\n$2`
      );
    }
    if (contentToAddTo.methods) {
      const methods = contentToAddTo.methods.map(method => {
        return getMethodString(method);
      }).join('\n');

      if (isInterface(file, content)) {
        const regex = getInterfaceDeclarationRegex(file);
        newContent = newContent.replace(
          regex,
          `$1${methods}\n$2`
        );
      } else {
        let regex = getConstructorRegex(file);
        if (regex.test(newContent)) {
          newContent = newContent.replace(
            regex,
            `$1${methods}\n$2`
          );
        } else {
          regex = getClassDeclarationRegex(file);
          newContent = newContent.replace(
            regex,
            `$1${methods}\n$2`
          );
        }
      }
    }

    newContent = await format(newContent);
    fs.writeFile(files[file], newContent, err => {
      if (err) {
        console.log(err);
        process.exit(1);
      }

      console.log(`${files[file]} updated`);
    });
  }

  fs.writeFile(flagFile, patchVersion, err => {
    if (err) {
      console.log(err);
      process.exit(1);
    }

    console.log(`${flagFile} updated`);
  });

  async function format(content) {
    return prettier.format(content, {
      plugins: ['prettier-plugin-java'],
      parser: 'java',
      tabWidth: 2,
      printWidth: Infinity
    });
  }

  function getMethodString(method) {
    const params = method.params.map(param => {
      return `${param.type} ${param.name}`;
    }).join(', ');

    let str = `${method.modifier} ${method.returnType} ${method.name}(${params})`;
    if (method.notation) {
      str = `\n${method.notation}\n${str}`;
    }
    if (method.body) {
      return str + `{${method.body.join('')}}`;
    }
    return str + ';';
  }

  function getFieldString(field) {
    return `${field.modifier} ${field.type} ${field.name}${field.value ? ` = ${field.value}` : ''};`;
  }

  function isInterface(filename, content) {
    return content.indexOf(`interface ${filename.split('.')[0]}`) > -1;
  }

  function getConstructorRegex(filename) {
    return new RegExp(`([^]*${filename.split('.')[0]}\\s*\\(.*\\)\\s*{[^}]*})([^]*)`, 'm');
  }

  function getInterfaceDeclarationRegex(filename) {
    return new RegExp(`([^]*interface\\s+${filename.split('.')[0]}[\\s\\w]*{)([^]*})`, 'm');
  }

  function getClassDeclarationRegex(filename) {
    return new RegExp(`([^]*class\\s+${filename.split('.')[0]}[\\s\\w]*{)([^]*})`, 'm');
  }

  function removeComments(content) {
    return content.replace(/\/\*[\s\S]*?\*\/|([^\\:]|^)\/\/.*$/gm, '');
  }
}


================================================
FILE: hooks/move-files.js
================================================
const path = require('path');
const fs = require('fs');

const gradleFilePath = path.resolve(__dirname, '../build-extras.gradle');
const newGradleFilePath = path.resolve(
  __dirname,
  '../platforms/android/app/build-extras.gradle'
);
const buildFilePath = path.resolve(__dirname, '../build.json');
const newBuildFilePath = path.resolve(
  __dirname,
  '../platforms/android/build.json'
);

const repeatChar = (char, times) => {
  let res = '';
  while (--times >= 0) res += char;
  return res;
};

let msg;
if (!fs.existsSync(newBuildFilePath) && fs.existsSync(buildFilePath)) {
  msg = '== Moved build.json ==';
  console.log(repeatChar('=', msg.length));
  console.log(msg);
  console.log(repeatChar('=', msg.length));
  fs.copyFileSync(buildFilePath, newBuildFilePath);
}

if (!fs.existsSync(newGradleFilePath) && fs.existsSync(gradleFilePath)) {
  msg = '== Moved build-extras.gradle ==';
  console.log(repeatChar('=', msg.length));
  console.log(msg);
  console.log(repeatChar('=', msg.length));
  fs.copyFileSync(gradleFilePath, newGradleFilePath);
}


================================================
FILE: hooks/post-process.js
================================================
/* eslint-disable no-console */
const path = require('path');
const fs = require('fs');
const { execSync } = require('child_process');

const buildFilePath = path.resolve(__dirname, '../build.json');
const copyToPath = path.resolve(__dirname, '../platforms/android/build.json');
const gradleFilePath = path.resolve(__dirname, '../build-extras.gradle');
const androidGradleFilePath = path.resolve(
  __dirname,
  '../platforms/android/app/build-extras.gradle'
);
const resPath = path.resolve(__dirname, '../platforms/android/app/src/main/res/');
const localResPath = path.resolve(__dirname, '../res/android/');

if (
  !fs.existsSync(copyToPath)
  && fs.existsSync(buildFilePath)
) fs.copyFileSync(buildFilePath, copyToPath);

if (fs.existsSync(androidGradleFilePath)) fs.unlinkSync(androidGradleFilePath);
fs.copyFileSync(gradleFilePath, androidGradleFilePath);

// Cordova Android 15 generates `cdv_*` resources and version-qualified value
// directories that are required later in the build. Keep the generated tree and
// only overlay this project's custom resources on top of it.
copyDirRecursively(localResPath, resPath);
enableLegacyJni();
enableStaticContext();
patchTargetSdkVersion();
enableKeyboardWorkaround();


function getTmpDir() {
  const tmpdirEnv = process.env.TMPDIR;

  if (tmpdirEnv) {
    try {
      fs.accessSync(tmpdirEnv, fs.constants.R_OK | fs.constants.W_OK);
      return tmpdirEnv;
    } catch {
      // TMPDIR exists but not accessible
    }
  }

  try {
    fs.accessSync("/tmp", fs.constants.R_OK | fs.constants.W_OK);
    return "/tmp";
  } catch {
    console.log("Error: No usable temporary directory found (TMPDIR or /tmp not accessible).");
    return null;
    // process.exit(1);
  }
}

function patchTargetSdkVersion() {
  const prefix = execSync('npm prefix').toString().trim();
  const gradleFile = path.join(prefix, 'platforms/android/app/build.gradle');

  if (!fs.existsSync(gradleFile)) {
    console.warn('[Cordova Hook] ⚠️ build.gradle not found');
    return;
  }

  let content = fs.readFileSync(gradleFile, 'utf-8');

  const sdkRegex = /targetSdkVersion\s+(cordovaConfig\.SDK_VERSION|\d+)/;

  if (sdkRegex.test(content)) {
    let api = "36";
    const tmp = getTmpDir();
    if (tmp == null) {
      console.warn("---------------------------------------------------------------------------------\n\n\n\n");
      console.warn(`⚠️ fdroid.bool not found`);
      console.warn("⚠️ Fdroid flavour will be built");
      api = "28";
      console.warn("\n\n\n\n---------------------------------------------------------------------------------");
    } else {
      const froidFlag = path.join(getTmpDir(), 'fdroid.bool');

      if (fs.existsSync(froidFlag)) {
        const fdroid = fs.readFileSync(froidFlag, 'utf-8').trim();
        if (fdroid == "true") {
          api = "28";
        }
      } else {
        console.warn("---------------------------------------------------------------------------------\n\n\n\n");
        console.warn(`⚠️ fdroid.bool not found`);
        console.warn("⚠️ Fdroid flavour will be built");
        api = "28";
        console.warn("\n\n\n\n---------------------------------------------------------------------------------");
        //process.exit(1);
      }
    }


    content = content.replace(sdkRegex, 'targetSdkVersion ' + api);
    fs.writeFileSync(gradleFile, content, 'utf-8');
    console.log('[Cordova Hook] ✅ Patched targetSdkVersion to ' + api);
  } else {
    console.warn('[Cordova Hook] ⚠️ targetSdkVersion not found');
  }
}


function enableLegacyJni() {
  const prefix = execSync('npm prefix').toString().trim();
  const gradleFile = path.join(prefix, 'platforms/android/app/build.gradle');

  if (!fs.existsSync(gradleFile)) return;

  let content = fs.readFileSync(gradleFile, 'utf-8');
  // Check for correct block to avoid duplicate insertion
  if (content.includes('useLegacyPackaging = true')) return;

  // Inject under android block with correct Groovy syntax
  content = content.replace(/android\s*{/, match => {
    return (
      match +
      `
    packagingOptions {
        jniLibs {
            useLegacyPackaging = true
        }
    }`
    );
  });

  fs.writeFileSync(gradleFile, content, 'utf-8');
  console.log('[Cordova Hook] ✅ Enabled legacy JNI packaging');
}

function enableStaticContext() {
  try {
    const prefix = execSync('npm prefix').toString().trim();
    const mainActivityPath = path.join(
      prefix,
      'platforms/android/app/src/main/java/com/foxdebug/acode/MainActivity.java'
    );

    if (!fs.existsSync(mainActivityPath)) {
      return;
    }

    let content = fs.readFileSync(mainActivityPath, 'utf-8');

    // Skip if fully patched
    if (
      content.includes('WeakReference<Context>') &&
      content.includes('public static Context getContext()') &&
      content.includes('weakContext = new WeakReference<>(this);')
    ) {
      return;
    }

    // Add missing imports
    if (!content.includes('import java.lang.ref.WeakReference;')) {
      content = content.replace(
        /import org\.apache\.cordova\.\*;/,
        match =>
          match +
          '\nimport android.content.Context;\nimport java.lang.ref.WeakReference;'
      );
    }

    // Inject static field and method into class body
    content = content.replace(
      /public class MainActivity extends CordovaActivity\s*\{/,
      match =>
        match +
        `\n\n    private static WeakReference<Context> weakContext;\n\n` +
        `    public static Context getContext() {\n` +
        `        return weakContext != null ? weakContext.get() : null;\n` +
        `    }\n`
    );

    // Insert weakContext assignment inside onCreate
    content = content.replace(
      /super\.onCreate\(savedInstanceState\);/,
      `super.onCreate(savedInstanceState);\n        weakContext = new WeakReference<>(this);`
    );

    fs.writeFileSync(mainActivityPath, content, 'utf-8');
  } catch (err) {
    console.error('[Cordova Hook] ❌ Failed to patch MainActivity:', err.message);
  }
}

function enableKeyboardWorkaround() {
  try{
    const prefix = execSync('npm prefix').toString().trim();
    const mainActivityPath = path.join(
      prefix,
      'platforms/android/app/src/main/java/com/foxdebug/acode/MainActivity.java'
    );

    if (!fs.existsSync(mainActivityPath)) {
      return;
    }

    let content = fs.readFileSync(mainActivityPath, 'utf-8');

    // Skip if already patched
    if (content.includes('SoftInputAssist')) {
      return;
    }

    // Add import
    if (!content.includes('import com.foxdebug.system.SoftInputAssist;')) {
      content = content.replace(
        /import java.lang.ref.WeakReference;|import org\.apache\.cordova\.\*;/,
        match =>
          match + '\nimport com.foxdebug.system.SoftInputAssist;'
      );
    }

    // Declare field
    if (!content.includes('private SoftInputAssist softInputAssist;')) {
      content = content.replace(
        /public class MainActivity extends CordovaActivity\s*\{/,
        match =>
          match +
          `\n\n    private SoftInputAssist softInputAssist;\n`
      );
    }

    // Initialize in onCreate
    content = content.replace(
      /loadUrl\(launchUrl\);/,
      `loadUrl(launchUrl);\n\n        softInputAssist = new SoftInputAssist(this);`
    );

    fs.writeFileSync(mainActivityPath, content, 'utf-8');
    console.log('[Cordova Hook] ✅ Enabled keyboard workaround');
  } catch (err) {
    console.error('[Cordova Hook] ❌ Failed to enable keyboard workaround:', err.message);
  }
}


/**
 * Copy directory recursively
 * @param {string} src Source directory
 * @param {string} dest Destination directory
 * @param {string[]} skip Files to not copy
 */
function copyDirRecursively(src, dest, skip = [], currPath = '') {
  const exists = fs.existsSync(src);
  const stats = exists && fs.statSync(src);
  const isDirectory = exists && stats.isDirectory();

  if (!exists) {
    console.log(`File ${src} does not exist`);
    return;
  }

  if (!fs.existsSync(dest) && isDirectory) {
    fs.mkdirSync(dest);
  }

  if (exists && isDirectory) {
    fs.mkdirSync(dest, { recursive: true });
    fs.readdirSync(src).forEach((childItemName) => {
      const relativePath = path.join(currPath, childItemName);
      if (childItemName.startsWith('.')) return;
      if (skip.includes(childItemName) || skip.includes(relativePath)) return;
      copyDirRecursively(
        path.join(src, childItemName),
        path.join(dest, childItemName),
        skip,
        relativePath,
      );
    });
  } else {
    removeConflictingResourceFiles(src, dest);
    fs.copyFileSync(src, dest);

    // log
    const message = `copied: ${path.basename(src)}`;
    console.log('\x1b[32m%s\x1b[0m', message); // green
  }
}

function removeConflictingResourceFiles(src, dest) {
  const parentDir = path.dirname(dest);

  if (!fs.existsSync(parentDir)) {
    return;
  }

  const resourceDirName = path.basename(parentDir);
  if (!resourceDirName.startsWith('mipmap') && !resourceDirName.startsWith('drawable')) {
    return;
  }

  const srcExt = path.extname(src);
  const resourceName = path.basename(src, srcExt);

  for (const existingName of fs.readdirSync(parentDir)) {
    const existingPath = path.join(parentDir, existingName);
    if (existingPath === dest || !fs.statSync(existingPath).isFile()) {
      continue;
    }

    const existingExt = path.extname(existingName);
    const existingResourceName = path.basename(existingName, existingExt);

    if (existingResourceName !== resourceName || existingExt === srcExt) {
      continue;
    }

    fs.rmSync(existingPath);
    console.log('\x1b[31m%s\x1b[0m', `deleted conflicting resource: ${existingName}`);
  }
}


================================================
FILE: hooks/restore-cordova-resources.js
================================================
const fs = require("fs");
const path = require("path");

const templateResPath = path.resolve(
  __dirname,
  "../node_modules/cordova-android/templates/project/res",
);
const androidResPath = path.resolve(
  __dirname,
  "../platforms/android/app/src/main/res",
);

if (!fs.existsSync(templateResPath) || !fs.existsSync(androidResPath)) {
  process.exit(0);
}

restoreCordovaResourceFiles(templateResPath);

function restoreCordovaResourceFiles(currentPath) {
  for (const entry of fs.readdirSync(currentPath, { withFileTypes: true })) {
    const absolutePath = path.join(currentPath, entry.name);

    if (entry.isDirectory()) {
      restoreCordovaResourceFiles(absolutePath);
      continue;
    }

    if (!shouldRestore(absolutePath)) {
      continue;
    }

    const relativePath = path.relative(templateResPath, absolutePath);
    const destinationPath = path.join(androidResPath, relativePath);

    if (fs.existsSync(destinationPath)) {
      continue;
    }

    fs.mkdirSync(path.dirname(destinationPath), { recursive: true });
    fs.copyFileSync(absolutePath, destinationPath);
    console.log(`[Cordova Hook] Restored ${relativePath}`);
  }
}

function shouldRestore(filePath) {
  const fileName = path.basename(filePath);

  return fileName.startsWith("cdv_") || fileName === "ic_cdv_splashscreen.xml";
}


================================================
FILE: jsconfig.json
================================================
{
  "exclude": ["**/node_modules", "**/platforms", "**/www", "www/js/ace/**/*"],
  "compilerOptions": {
    "baseUrl": "./src",
    "paths": {
      "*": ["*"]
    }
  },
  "include": ["src/**/*"],
  "typeAcquisition": {
    "enable": true
  }
}


================================================
FILE: license.txt
================================================
Copyright 2020 Foxdebug(Ajit Kumar)

Permission is hereby granted, free of charge, to any person obtaining a copy of this software
and associated documentation files (the "Software"), to deal in the Software without 
restriction, including without limitation the rights to use, copy, modify, merge, publish, 
distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom 
the Software is furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all copies or 
substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, 
INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR 
PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE 
FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR 
OTHERWISE,ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER 
DEALINGS IN THE SOFTWARE.

================================================
FILE: package.json
================================================
{
  "name": "com.foxdebug.acode",
  "displayName": "Acode",
  "version": "1.11.8",
  "description": "Acode is a code editor for android",
  "scripts": {
    "lang": "node ./utils/lang.js",
    "build": "sh utils/scripts/build.sh",
    "start": "sh utils/scripts/start.sh",
    "clean": "sh utils/scripts/clean.sh android android",
    "plugin": "sh utils/scripts/plugin.sh",
    "setup": "node ./utils/setup.js",
    "lint": "biome lint --write",
    "format": "biome format --write",
    "check": "biome check --write",
    "typecheck": "tsc --noEmit",
    "updateAce": "node ./utils/updateAce.js"
  },
  "keywords": [
    "ecosystem:cordova"
  ],
  "author": "Foxdebug (Ajit Kumar)",
  "license": "MIT",
  "cordova": {
    "plugins": {
      "cordova-clipboard": {},
      "cordova-plugin-device": {},
      "cordova-plugin-file": {},
      "cordova-plugin-server": {},
      "cordova-plugin-ftp": {},
      "cordova-plugin-sdcard": {},
      "cordova-plugin-iap": {},
      "cordova-plugin-advanced-http": {
        "ANDROIDBLACKLISTSECURESOCKETPROTOCOLS": "SSLv3,TLSv1"
      },
      "cordova-plugin-websocket": {},
      "cordova-plugin-buildinfo": {},
      "cordova-plugin-browser": {},
      "cordova-plugin-sftp": {},
      "com.foxdebug.acode.rk.exec.proot": {},
      "com.foxdebug.acode.rk.exec.terminal": {},
      "com.foxdebug.acode.rk.customtabs": {},
      "com.foxdebug.acode.rk.plugin.plugincontext": {},
      "com.foxdebug.acode.rk.auth": {},
      "cordova-plugin-system": {}
    },
    "platforms": [
      "android"
    ]
  },
  "repository": {
    "type": "git",
    "url": "git+https://github.com/deadlyjack/acode.git"
  },
  "bugs": {
    "url": "https://github.com/deadlyjack/acode/issues"
  },
  "homepage": "https://github.com/deadlyjack/acode#readme",
  "devDependencies": {
    "@babel/core": "^7.28.5",
    "@babel/plugin-transform-runtime": "^7.28.5",
    "@babel/preset-env": "^7.28.5",
    "@babel/preset-typescript": "^7.28.5",
    "@babel/runtime": "^7.28.4",
    "@babel/runtime-corejs3": "^7.28.4",
    "@biomejs/biome": "2.4.11",
    "@rspack/cli": "^1.7.0",
    "@rspack/core": "^1.7.0",
    "@types/ace": "^0.0.52",
    "@types/url-parse": "^1.4.11",
    "autoprefixer": "^10.4.22",
    "babel-loader": "^10.0.0",
    "com.foxdebug.acode.rk.auth": "file:src/plugins/auth",
    "com.foxdebug.acode.rk.customtabs": "file:src/plugins/custom-tabs",
    "com.foxdebug.acode.rk.exec.proot": "file:src/plugins/proot",
    "com.foxdebug.acode.rk.exec.terminal": "file:src/plugins/terminal",
    "com.foxdebug.acode.rk.plugin.plugincontext": "file:src/plugins/pluginContext",
    "cordova-android": "^15.0.0",
    "cordova-clipboard": "^1.3.0",
    "cordova-plugin-advanced-http": "^3.3.1",
    "cordova-plugin-browser": "file:src/plugins/browser",
    "cordova-plugin-buildinfo": "file:src/plugins/cordova-plugin-buildinfo",
    "cordova-plugin-device": "^2.1.0",
    "cordova-plugin-file": "^8.1.3",
    "cordova-plugin-ftp": "file:src/plugins/ftp",
    "cordova-plugin-iap": "file:src/plugins/iap",
    "cordova-plugin-sdcard": "file:src/plugins/sdcard",
    "cordova-plugin-server": "file:src/plugins/server",
    "cordova-plugin-sftp": "file:src/plugins/sftp",
    "cordova-plugin-system": "file:src/plugins/system",
    "cordova-plugin-websocket": "file:src/plugins/websocket",
    "css-loader": "^7.1.2",
    "mini-css-extract-plugin": "^2.9.4",
    "path-browserify": "^1.0.1",
    "postcss-loader": "^8.2.0",
    "prettier": "^3.7.4",
    "prettier-plugin-java": "^2.7.7",
    "raw-loader": "^4.0.2",
    "sass": "^1.94.2",
    "sass-loader": "^16.0.6",
    "style-loader": "^4.0.0",
    "terminal": "^0.1.4",
    "ts-loader": "^9.5.4",
    "typescript": "^5.9.3",
    "vscode-languageserver-types": "^3.17.5"
  },
  "dependencies": {
    "@codemirror/autocomplete": "^6.20.1",
    "@codemirror/commands": "^6.10.3",
    "@codemirror/lang-angular": "^0.1.4",
    "@codemirror/lang-cpp": "^6.0.3",
    "@codemirror/lang-css": "^6.3.1",
    "@codemirror/lang-go": "^6.0.1",
    "@codemirror/lang-html": "^6.4.11",
    "@codemirror/lang-java": "^6.0.2",
    "@codemirror/lang-javascript": "^6.2.5",
    "@codemirror/lang-jinja": "^6.0.0",
    "@codemirror/lang-json": "^6.0.2",
    "@codemirror/lang-less": "^6.0.2",
    "@codemirror/lang-liquid": "^6.3.2",
    "@codemirror/lang-markdown": "^6.5.0",
    "@codemirror/lang-php": "^6.0.2",
    "@codemirror/lang-python": "^6.2.1",
    "@codemirror/lang-rust": "^6.0.2",
    "@codemirror/lang-sass": "^6.0.2",
    "@codemirror/lang-sql": "^6.10.0",
    "@codemirror/lang-vue": "^0.1.3",
    "@codemirror/lang-wast": "^6.0.2",
    "@codemirror/lang-xml": "^6.1.0",
    "@codemirror/lang-yaml": "^6.1.2",
    "@codemirror/language": "^6.12.2",
    "@codemirror/language-data": "^6.5.2",
    "@codemirror/legacy-modes": "^6.5.2",
    "@codemirror/lint": "^6.9.5",
    "@codemirror/lsp-client": "^6.2.2",
    "@codemirror/search": "^6.6.0",
    "@codemirror/state": "^6.6.0",
    "@codemirror/theme-one-dark": "^6.1.3",
    "@codemirror/view": "^6.40.0",
    "@deadlyjack/ajax": "^1.2.6",
    "@emmetio/codemirror6-plugin": "^0.4.0",
    "@lezer/highlight": "^1.2.3",
    "@ungap/custom-elements": "^1.3.0",
    "@xterm/addon-attach": "^0.11.0",
    "@xterm/addon-fit": "^0.10.0",
    "@xterm/addon-image": "^0.8.0",
    "@xterm/addon-search": "^0.15.0",
    "@xterm/addon-unicode11": "^0.8.0",
    "@xterm/addon-web-links": "^0.11.0",
    "@xterm/addon-webgl": "^0.18.0",
    "@xterm/xterm": "^5.5.0",
    "acorn": "^8.15.0",
    "autosize": "^6.0.1",
    "codemirror": "^6.0.2",
    "cordova": "13.0.0",
    "core-js": "^3.47.0",
    "dayjs": "^1.11.19",
    "dompurify": "^3.3.2",
    "escape-string-regexp": "^5.0.0",
    "esprima": "^4.0.1",
    "filesize": "^11.0.13",
    "html-tag-js": "^2.4.16",
    "jszip": "^3.10.1",
    "katex": "^0.16.39",
    "markdown-it": "^14.1.1",
    "markdown-it-anchor": "^9.2.0",
    "markdown-it-emoji": "^3.0.0",
    "markdown-it-footnote": "^4.0.0",
    "markdown-it-github-alerts": "^1.0.0",
    "markdown-it-task-lists": "^2.1.1",
    "markdown-it-texmath": "^1.0.0",
    "mermaid": "^11.13.0",
    "mime-types": "^3.0.1",
    "mustache": "^4.2.0",
    "picomatch": "^4.0.4",
    "url-parse": "^1.5.10",
    "vanilla-picker": "^2.12.3",
    "yargs": "^18.0.0"
  },
  "overrides": {
    "@codemirror/autocomplete": "^6.20.1",
    "@codemirror/commands": "^6.10.3",
    "@codemirror/language": "^6.12.2",
    "@codemirror/lint": "^6.9.5",
    "@codemirror/search": "^6.6.0",
    "@codemirror/state": "^6.6.0",
    "@codemirror/view": "^6.40.0"
  },
  "browserslist": "cover 100%,not android < 5"
}


================================================
FILE: postcss.config.js
================================================
module.exports = {
    plugins: [
        require('autoprefixer')({})
    ]
};

================================================
FILE: readme.md
================================================
# Acode - Code Editor for Android

<p align="center">
  <img src='res/logo_1.png' width='250'>
</p>

[![](https://img.shields.io/endpoint?logo=telegram&label=Acode&style=flat&url=https%3A%2F%2Facode.app%2Fapi%2Ftelegram-members-count)](https://t.me/foxdebug_acode) [![](https://dcbadge.vercel.app/api/server/vVxVWYUAWD?style=flat)](https://discord.gg/vVxVWYUAWD)

## • Overview

Welcome to Acode Editor - a powerful and versatile code editing tool designed specifically for Android devices. Whether you're working on HTML, CSS, JavaScript, or other programming languages, Acode empowers you to code on-the-go with confidence.

## • Features

- Edit and create websites, and instantly preview them in a browser.
- Seamlessly modify source files for various languages like Python, Java, JavaScript, and more.
- Built-in javascript console
- Enjoy multi-language editing support with easy management tools.
- Enjoy a large collections of community plugins to enhance your coding experience.

## • Installation

You can get Acode Editor from popular platforms:

[<img src="https://play.google.com/intl/en_us/badges/images/generic/en-play-badge.png" alt="Get it on Google Play" height="60">](https://play.google.com/store/apps/details?id=com.foxdebug.acodefree) [<img src="https://fdroid.gitlab.io/artwork/badge/get-it-on.png" alt="Get it on F-Droid" height="60"/>](https://www.f-droid.org/packages/com.foxdebug.acode/)

## • Project Structure

<pre>
Acode/
|
|- src/   - Core code and language files
|
|- www/   - Public documents, compiled files, and HTML templates
|
|- utils/ - CLI tools for building, string manipulation, and more
</pre>

## • Multi-language Support

Enhance Acode's capabilities by adding new languages easily. Just create a file with the language code (e.g., en-us for English) in [`src/lang/`](https://github.com/Acode-Foundation/Acode/tree/main/src/lang) and include it in [`src/lib/lang.js`](https://github.com/Acode-Foundation/Acode/blob/main/src/lib/lang.js). Manage strings across languages effortlessly using utility commands:

```shell
pnpm run lang add
pnpm run lang remove
pnpm run lang search
pnpm run lang update
```

## • Contributing & Building the Application

See [CONTRIBUTING.md](CONTRIBUTING.md) for detailed instructions.

## • Contributors

<a href="https://github.com/Acode-Foundation/Acode/graphs/contributors">
  <img src="https://contrib.rocks/image?repo=Acode-Foundation/Acode" />
</a>

## • Developing a Plugin for Acode

For comprehensive documentation on creating plugins for Acode Editor, visit the [repository](https://github.com/Acode-Foundation/acode-plugin).

For plugin development information, refer to: [Acode Plugin Documentation](https://docs.acode.app/)

## Star History

<a href="https://star-history.com/#Acode-Foundation/Acode&Date">
 <picture>
   <source media="(prefers-color-scheme: dark)" srcset="https://api.star-history.com/svg?repos=Acode-Foundation/Acode&type=Date&theme=dark" />
   <source media="(prefers-color-scheme: light)" srcset="https://api.star-history.com/svg?repos=Acode-Foundation/Acode&type=Date" />
   <img alt="Star History Chart" src="https://api.star-history.com/svg?repos=Acode-Foundation/Acode&type=Date" />
 </picture>
</a>


================================================
FILE: res/android/drawable/ic_launcher_background.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<vector xmlns:android="http://schemas.android.com/apk/res/android"
    android:width="108dp"
    android:height="108dp"
    android:viewportWidth="108"
    android:viewportHeight="108">
    <path
        android:fillColor="#3DDC84"
        android:pathData="M0,0h108v108h-108z" />
    <path
        android:fillColor="#00000000"
        android:pathData="M9,0L9,108"
        android:strokeWidth="0.8"
        android:strokeColor="#33FFFFFF" />
    <path
        android:fillColor="#00000000"
        android:pathData="M19,0L19,108"
        android:strokeWidth="0.8"
        android:strokeColor="#33FFFFFF" />
    <path
        android:fillColor="#00000000"
        android:pathData="M29,0L29,108"
        android:strokeWidth="0.8"
        android:strokeColor="#33FFFFFF" />
    <path
        android:fillColor="#00000000"
        android:pathData="M39,0L39,108"
        android:strokeWidth="0.8"
        android:strokeColor="#33FFFFFF" />
    <path
        android:fillColor="#00000000"
        android:pathData="M49,0L49,108"
        android:strokeWidth="0.8"
        android:strokeColor="#33FFFFFF" />
    <path
        android:fillColor="#00000000"
        android:pathData="M59,0L59,108"
        android:strokeWidth="0.8"
        android:strokeColor="#33FFFFFF" />
    <path
        android:fillColor="#00000000"
        android:pathData="M69,0L69,108"
        android:strokeWidth="0.8"
        android:strokeColor="#33FFFFFF" />
    <path
        android:fillColor="#00000000"
        android:pathData="M79,0L79,108"
        android:strokeWidth="0.8"
        android:strokeColor="#33FFFFFF" />
    <path
        android:fillColor="#00000000"
        android:pathData="M89,0L89,108"
        android:strokeWidth="0.8"
        android:strokeColor="#33FFFFFF" />
    <path
        android:fillColor="#00000000"
        android:pathData="M99,0L99,108"
        android:strokeWidth="0.8"
        android:strokeColor="#33FFFFFF" />
    <path
        android:fillColor="#00000000"
        android:pathData="M0,9L108,9"
        android:strokeWidth="0.8"
        android:strokeColor="#33FFFFFF" />
    <path
        android:fillColor="#00000000"
        android:pathData="M0,19L108,19"
        android:strokeWidth="0.8"
        android:strokeColor="#33FFFFFF" />
    <path
        android:fillColor="#00000000"
        android:pathData="M0,29L108,29"
        android:strokeWidth="0.8"
        android:strokeColor="#33FFFFFF" />
    <path
        android:fillColor="#00000000"
        android:pathData="M0,39L108,39"
        android:strokeWidth="0.8"
        android:strokeColor="#33FFFFFF" />
    <path
        android:fillColor="#00000000"
        android:pathData="M0,49L108,49"
        android:strokeWidth="0.8"
        android:strokeColor="#33FFFFFF" />
    <path
        android:fillColor="#00000000"
        android:pathData="M0,59L108,59"
        android:strokeWidth="0.8"
        android:strokeColor="#33FFFFFF" />
    <path
        android:fillColor="#00000000"
        android:pathData="M0,69L108,69"
        android:strokeWidth="0.8"
        android:strokeColor="#33FFFFFF" />
    <path
        android:fillColor="#00000000"
        android:pathData="M0,79L108,79"
        android:strokeWidth="0.8"
        android:strokeColor="#33FFFFFF" />
    <path
        android:fillColor="#00000000"
        android:pathData="M0,89L108,89"
        android:strokeWidth="0.8"
        android:strokeColor="#33FFFFFF" />
    <path
        android:fillColor="#00000000"
        android:pathData="M0,99L108,99"
        android:strokeWidth="0.8"
        android:strokeColor="#33FFFFFF" />
    <path
        android:fillColor="#00000000"
        android:pathData="M19,29L89,29"
        android:strokeWidth="0.8"
        android:strokeColor="#33FFFFFF" />
    <path
        android:fillColor="#00000000"
        android:pathData="M19,39L89,39"
        android:strokeWidth="0.8"
        android:strokeColor="#33FFFFFF" />
    <path
        android:fillColor="#00000000"
        android:pathData="M19,49L89,49"
        android:strokeWidth="0.8"
        android:strokeColor="#33FFFFFF" />
    <path
        android:fillColor="#00000000"
        android:pathData="M19,59L89,59"
        android:strokeWidth="0.8"
        android:strokeColor="#33FFFFFF" />
    <path
        android:fillColor="#00000000"
        android:pathData="M19,69L89,69"
        android:strokeWidth="0.8"
        android:strokeColor="#33FFFFFF" />
    <path
        android:fillColor="#00000000"
        android:pathData="M19,79L89,79"
        android:strokeWidth="0.8"
        android:strokeColor="#33FFFFFF" />
    <path
        android:fillColor="#00000000"
        android:pathData="M29,19L29,89"
        android:strokeWidth="0.8"
        android:strokeColor="#33FFFFFF" />
    <path
        android:fillColor="#00000000"
        android:pathData="M39,19L39,89"
        android:strokeWidth="0.8"
        android:strokeColor="#33FFFFFF" />
    <path
        android:fillColor="#00000000"
        android:pathData="M49,19L49,89"
        android:strokeWidth="0.8"
        android:strokeColor="#33FFFFFF" />
    <path
        android:fillColor="#00000000"
        android:pathData="M59,19L59,89"
        android:strokeWidth="0.8"
        android:strokeColor="#33FFFFFF" />
    <path
        android:fillColor="#00000000"
        android:pathData="M69,19L69,89"
        android:strokeWidth="0.8"
        android:strokeColor="#33FFFFFF" />
    <path
        android:fillColor="#00000000"
        android:pathData="M79,19L79,89"
        android:strokeWidth="0.8"
        android:strokeColor="#33FFFFFF" />
</vector>


================================================
FILE: res/android/drawable/ic_launcher_foreground.xml
================================================
<vector xmlns:android="http://schemas.android.com/apk/res/android"
    android:width="108dp"
    android:height="108dp"
    android:viewportWidth="544.37"
    android:viewportHeight="452.63">
  <group android:scaleX="0.55"
      android:scaleY="0.4573112"
      android:translateX="122.48325"
      android:translateY="122.81861">
    <path
        android:pathData="m216.9,55.7c1.54,-9.11 9.61,-17.98 16.49,-17.98 10.54,0 32.1,0 42.28,0 9.31,0 17.81,11.45 15,25.95 -16.32,84.09 -48.75,253.82 -63.92,334.21 -2.15,11.4 -10.51,17.02 -16.04,17.02 -8.59,0 -25.2,0 -36.49,0 -7.06,0 -17.09,-9.66 -15.71,-17.67 18.15,-105.18 43.83,-255.62 58.39,-341.53z"
        android:fillColor="#3499FE"/>
    <path
        android:pathData="m327.13,55.71c-1.54,-9.11 -9.61,-17.98 -16.49,-17.98 -10.54,0 -32.1,0 -42.28,0 -9.31,0 -17.81,11.45 -15,25.95 16.32,84.09 48.75,253.82 63.92,334.21 2.15,11.4 10.51,17.02 16.04,17.02 8.59,0 25.2,0 36.49,0 7.06,0 17.09,-9.66 15.71,-17.67 -18.15,-105.18 -43.83,-255.62 -58.39,-341.53z"
        android:fillColor="#3499FE"/>
    <path
        android:pathData="m438.86,233.19c-4.64,-4.84 -53.34,-55.72 -70.25,-72.53 -6.23,-6.19 -6.23,-16.45 -3.45,-23.32 2.17,-5.36 8.75,-11.32 15.15,-11.29 11.27,0.05 35.05,0 46.31,0 4.16,0 7.87,2.18 11.59,5.95 20.31,20.55 59,60.43 80.61,83.36v0c1.44,1.52 2.93,2.88 4.1,4.12 3.54,3.75 4.64,8.13 4.84,11.56 0.09,0.93 0.13,1.8 0.15,2.58 0.09,3.59 -0.81,8.86 -4.99,13.27 -1.17,1.24 -2.66,2.6 -4.1,4.12v0c-21.61,22.93 -60.3,62.81 -80.61,83.36 -3.72,3.77 -7.43,5.95 -11.59,5.95 -11.26,0 -35.04,-0.05 -46.31,0 -6.4,0.03 -12.98,-5.93 -15.15,-11.29 -2.78,-6.87 -2.78,-17.13 3.45,-23.32 16.92,-16.79 65.62,-67.67 70.25,-72.52z"
        android:fillColor="#3499FE"/>
    <path
        android:pathData="m105.51,233.77c4.64,-4.84 53.34,-55.72 70.25,-72.53 6.23,-6.19 6.23,-16.45 3.45,-23.32 -2.17,-5.36 -8.75,-11.32 -15.15,-11.29 -11.27,0.05 -35.05,0 -46.31,0 -4.16,0 -7.87,2.18 -11.59,5.95 -20.31,20.55 -59,60.43 -80.61,83.36v0c-1.44,1.52 -2.93,2.88 -4.1,4.12 -3.54,3.75 -4.64,8.13 -4.84,11.56 -0.09,0.93 -0.13,1.8 -0.15,2.58 -0.09,3.59 0.81,8.86 4.99,13.27 1.17,1.24 2.66,2.6 4.1,4.12v0c21.61,22.93 60.3,62.81 80.61,83.36 3.72,3.77 7.43,5.95 11.59,5.95 11.26,0 35.04,-0.05 46.31,0 6.4,0.03 12.98,-5.93 15.15,-11.29 2.78,-6.87 2.78,-17.13 -3.45,-23.32 -16.91,-16.8 -65.61,-67.68 -70.25,-72.52z"
        android:fillColor="#3499FE"/>
  </group>
</vector>


================================================
FILE: res/android/mipmap-anydpi-v26/ic_launcher.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
    <background android:drawable="@color/ic_launcher_background"/>
    <foreground android:drawable="@drawable/ic_launcher_foreground"/>
    <monochrome android:drawable="@drawable/ic_launcher_foreground"/>
</adaptive-icon>

================================================
FILE: res/android/mipmap-anydpi-v26/ic_launcher_round.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
    <background android:drawable="@color/ic_launcher_background"/>
    <foreground android:drawable="@drawable/ic_launcher_foreground"/>
    <monochrome android:drawable="@drawable/ic_launcher_foreground"/>
</adaptive-icon>

================================================
FILE: res/android/values/colors.xml
================================================
<?xml version='1.0' encoding='utf-8'?>
<resources xmlns:tools="http://schemas.android.com/tools">
  <color name="teardrop">#FFFFFF</color>
</resources>


================================================
FILE: res/android/values/ic_launcher_background.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<resources>
    <color name="ic_launcher_background">#3a3e54</color>
    <color name="ic_splash_background">#3a3e54</color>
</resources>

================================================
FILE: res/android/values/themes.xml
================================================
<?xml version='1.0' encoding='utf-8'?>
<resources>
    <style name="Theme.App.Activity" parent="Theme.AppCompat.DayNight.NoActionBar">
        <item name="colorAccent">@color/teardrop</item>
        <item name="android:colorAccent">@color/teardrop</item>
        <item name="colorControlActivated">@color/teardrop</item>
        <item name="android:colorControlActivated">@color/teardrop</item>
        <item name="android:windowOptOutEdgeToEdgeEnforcement">true</item>
    </style>
</resources>


================================================
FILE: res/android/xml/network_security_config.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
  <base-config cleartextTrafficPermitted="true">
    <trust-anchors>
      <certificates src="system" />
    </trust-anchors>
  </base-config>
</network-security-config>

================================================
FILE: rspack.config.js
================================================
const path = require('path');
const { rspack } = require('@rspack/core');

module.exports = (env, options) => {
  const { mode = 'development' } = options;
  const prod = mode === 'production';

  const rules = [
    // TypeScript/TSX files - Custom JSX loader + SWC
    {
      test: /\.tsx?$/,
      exclude: /node_modules/,
      use: [
        {
          loader: 'builtin:swc-loader',
          options: {
            jsc: {
              parser: {
                syntax: 'typescript',
                tsx: false,
              },
              transform: {
                // react: {
                //   pragma: 'tag',
                //   pragmaFrag: 'Array',
                //   throwIfNamespace: false,
                //   development: false,
                //   useBuiltins: false,
                //   runtime: 'classic',
                // },
              },
              target: 'es2015',
            },
          },
        },
        path.resolve(__dirname, 'utils/custom-loaders/html-tag-jsx-loader.js'),
      ],
    },
    // JavaScript files
    {
      test: /\.m?js$/,
      oneOf: [
        // Node modules - use builtin:swc-loader only
        {
          include: /node_modules/,
          use: [
            {
              loader: 'builtin:swc-loader',
              options: {
                jsc: {
                  parser: {
                    syntax: 'ecmascript',
                  },
                  target: 'es2015',
                },
              },
            },
          ],
        },
        // Source JS files - Custom JSX loader + SWC (JSX will be removed first)
        {
          use: [
            {
              loader: 'builtin:swc-loader',
              options: {
                jsc: {
                  parser: {
                    syntax: 'ecmascript',
                    jsx: false,
                  },
                  target: 'es2015',
                },
              },
            },
            path.resolve(__dirname, 'utils/custom-loaders/html-tag-jsx-loader.js'),
          ],
        },
      ],
    },
    // Handlebars and Markdown files
    {
      test: /\.(hbs|md)$/,
      type: 'asset/source',
    },
    // Module CSS/SCSS (with .m prefix)
    {
      test: /\.m\.(sa|sc|c)ss$/,
      use: [
        'raw-loader',
        'postcss-loader',
        'sass-loader',
      ],
      type: 'javascript/auto',
    },
    // Asset files
    {
      test: /\.(png|svg|jpg|jpeg|ico|ttf|webp|eot|woff|webm|mp4|wav)(\?.*)?$/,
      type: 'asset/resource',
    },
    // Regular CSS/SCSS files
    {
      test: /(?<!\.m)\.(sa|sc|c)ss$/,
      use: [
        rspack.CssExtractRspackPlugin.loader,
        'css-loader',
        'postcss-loader',
        'sass-loader',
      ],
      type: 'javascript/auto',
    },
  ];

  const main = {
    mode,
    entry: {
      main: './src/main.js',
      console: './src/lib/console.js',
      searchInFilesWorker: './src/sidebarApps/searchInFiles/worker.js',
    },
    output: {
      path: path.resolve(__dirname, 'www/build/'),
      filename: '[name].js',
      chunkFilename: '[name].chunk.js',
      assetModuleFilename: '[name][ext]',
      publicPath: '/build/',
      clean: true,
    },
    module: {
      rules,
    },
    resolve: {
      extensions: ['.ts', '.tsx', '.js', '.mjs', '.json'],
      fallback: {
        path: require.resolve('path-browserify'),
        crypto: false,
      },
      modules: ['node_modules', 'src'],
    },
    plugins: [
      new rspack.CssExtractRspackPlugin({
        filename: '[name].css',
      }),
    ],
  };

  return [main];
};


================================================
FILE: src/cm/baseExtensions.ts
================================================
import { closeBrackets, completionKeymap } from "@codemirror/autocomplete";
import { defaultKeymap, history, historyKeymap } from "@codemirror/commands";
import {
	bracketMatching,
	defaultHighlightStyle,
	foldGutter,
	indentOnInput,
	syntaxHighlighting,
} from "@codemirror/language";
import { highlightSelectionMatches } from "@codemirror/search";
import type { Extension } from "@codemirror/state";
import { EditorState } from "@codemirror/state";
import {
	crosshairCursor,
	drawSelection,
	dropCursor,
	highlightActiveLine,
	highlightActiveLineGutter,
	highlightSpecialChars,
	keymap,
	rectangularSelection,
	tooltips,
} from "@codemirror/view";

/**
 * Base extensions roughly matching the useful parts of CodeMirror's basicSetup
 */
export default function createBaseExtensions(): Extension[] {
	return [
		highlightActiveLineGutter(),
		highlightSpecialChars(),
		history(),
		foldGutter(),
		drawSelection(),
		dropCursor(),
		EditorState.allowMultipleSelections.of(true),
		indentOnInput(),
		syntaxHighlighting(defaultHighlightStyle, { fallback: true }),
		bracketMatching(),
		closeBrackets(),
		rectangularSelection(),
		crosshairCursor(),
		highlightActiveLine(),
		highlightSelectionMatches(),
		keymap.of([...completionKeymap, ...defaultKeymap, ...historyKeymap]),
		// This prevents tooltips from being going out of the editor area
		tooltips({
			tooltipSpace: (view) => {
				const rect = view.dom.getBoundingClientRect();
				return {
					top: rect.top,
					left: rect.left,
					bottom: window.innerHeight,
					right: window.innerWidth,
				};
			},
		}),
	];
}


================================================
FILE: src/cm/colorView.ts
================================================
import type { Range, Text } from "@codemirror/state";
import type { DecorationSet, ViewUpdate } from "@codemirror/view";
import {
	Decoration,
	EditorView,
	ViewPlugin,
	WidgetType,
} from "@codemirror/view";
import pickColor from "dialogs/color";
import color from "utils/color";
import { colorRegex, HEX } from "utils/color/regex";

interface ColorWidgetState {
	from: number;
	to: number;
	colorType: string;
	alpha?: string;
}

interface ColorWidgetParams extends ColorWidgetState {
	color: string;
	colorRaw: string;
}

// WeakMap to carry state from widget DOM back into handler
const colorState = new WeakMap<HTMLElement, ColorWidgetState>();

const HEX_RE = new RegExp(HEX, "gi");

const RGBG = new RegExp(colorRegex.anyGlobal);

const enumColorType = { hex: "hex", rgb: "rgb", hsl: "hsl", named: "named" };

const disallowedBoundaryBefore = new Set(["-", ".", "/", "#"]);
const disallowedBoundaryAfter = new Set(["-", ".", "/"]);
const ignoredLeadingWords = new Set(["url"]);

function isWhitespace(char: string): boolean {
	return (
		char === " " ||
		char === "\t" ||
		char === "\n" ||
		char === "\r" ||
		char === "\f"
	);
}

function isAlpha(char: string): boolean {
	if (!char) return false;
	const code = char.charCodeAt(0);
	return (
		(code >= 65 && code <= 90) || // A-Z
		(code >= 97 && code <= 122)
	);
}

function charAt(doc: Text, index: number): string {
	if (index < 0 || index >= doc.length) return "";
	return doc.sliceString(index, index + 1);
}

function findPrevNonWhitespace(doc: Text, index: number): number {
	for (let i = index - 1; i >= 0; i--) {
		if (!isWhitespace(charAt(doc, i))) return i;
	}
	return -1;
}

function findNextNonWhitespace(doc: Text, index: number): number {
	for (let i = index; i < doc.length; i++) {
		if (!isWhitespace(charAt(doc, i))) return i;
	}
	return doc.length;
}

function readWordBefore(doc: Text, index: number): string {
	let pos = index;
	while (pos >= 0 && isWhitespace(charAt(doc, pos))) pos--;
	if (pos < 0) return "";
	if (charAt(doc, pos) === "(") {
		pos--;
	}
	while (pos >= 0 && isWhitespace(charAt(doc, pos))) pos--;
	const end = pos;
	while (pos >= 0 && isAlpha(charAt(doc, pos))) pos--;
	const start = pos + 1;
	if (end < start) return "";
	return doc.sliceString(start, end + 1).toLowerCase();
}

function shouldRenderColor(doc: Text, start: number, end: number): boolean {
	const immediatePrev = charAt(doc, start - 1);
	if (disallowedBoundaryBefore.has(immediatePrev)) return false;

	const immediateNext = charAt(doc, end);
	if (disallowedBoundaryAfter.has(immediateNext)) return false;

	const prevNonWhitespaceIndex = findPrevNonWhitespace(doc, start);
	if (prevNonWhitespaceIndex !== -1) {
		const prevNonWhitespaceChar = charAt(doc, prevNonWhitespaceIndex);
		if (disallowedBoundaryBefore.has(prevNonWhitespaceChar)) return false;
		const prevWord = readWordBefore(doc, prevNonWhitespaceIndex);
		if (ignoredLeadingWords.has(prevWord)) return false;
	}

	const nextNonWhitespaceIndex = findNextNonWhitespace(doc, end);
	if (nextNonWhitespaceIndex < doc.length) {
		const nextNonWhitespaceChar = charAt(doc, nextNonWhitespaceIndex);
		if (disallowedBoundaryAfter.has(nextNonWhitespaceChar)) return false;
	}

	return true;
}

class ColorWidget extends WidgetType {
	state: ColorWidgetState;
	color: string;
	colorRaw: string;

	constructor({ color, colorRaw, ...state }: ColorWidgetParams) {
		super();
		this.state = state; // from, to, colorType, alpha
		this.color = color; // hex for input value
		this.colorRaw = colorRaw; // original css color string
	}

	eq(other: ColorWidget): boolean {
		return (
			other.state.colorType === this.state.colorType &&
			other.color === this.color &&
			other.state.from === this.state.from &&
			other.state.to === this.state.to &&
			(other.state.alpha || "") === (this.state.alpha || "")
		);
	}

	toDOM(): HTMLElement {
		const wrapper = document.createElement("span");
		wrapper.className = "cm-color-chip";
		wrapper.style.display = "inline-block";
		wrapper.style.width = "0.9em";
		wrapper.style.height = "0.9em";
		wrapper.style.borderRadius = "2px";
		wrapper.style.verticalAlign = "middle";
		wrapper.style.margin = "0 2px";
		wrapper.style.boxSizing = "border-box";
		wrapper.style.border = "1px solid rgba(0,0,0,0.2)";
		wrapper.style.backgroundColor = this.colorRaw;
		wrapper.dataset["color"] = this.color;
		wrapper.dataset["colorraw"] = this.colorRaw;
		wrapper.style.cursor = "pointer";
		colorState.set(wrapper, this.state);
		return wrapper;
	}

	ignoreEvent(): boolean {
		return false;
	}
}

function colorDecorations(view: EditorView): DecorationSet {
	const deco: Range<Decoration>[] = [];
	const ranges = view.visibleRanges;
	const doc = view.state.doc;
	for (const { from, to } of ranges) {
		const text = doc.sliceString(from, to);
		// Any color using global matcher from utils (captures named/rgb/rgba/hsl/hsla/hex)
		RGBG.lastIndex = 0;
		for (let m: RegExpExecArray | null; (m = RGBG.exec(text)); ) {
			const raw = m[2];
			const start = from + m.index + m[1].length;
			const end = start + raw.length;
			if (!shouldRenderColor(doc, start, end)) continue;
			const c = color(raw);
			const colorHex = c.hex.toString(false);
			deco.push(
				Decoration.widget({
					widget: new ColorWidget({
						from: start,
						to: end,
						color: colorHex,
						colorRaw: raw,
						colorType: enumColorType.named,
					}),
					side: -1,
				}).range(start),
			);
		}
	}

	return Decoration.set(deco, true);
}

class ColorViewPlugin {
	decorations: DecorationSet;
	raf = 0;
	pendingView: EditorView | null = null;

	constructor(view: EditorView) {
		this.decorations = colorDecorations(view);
	}

	update(update: ViewUpdate): void {
		if (update.docChanged || update.viewportChanged) {
			this.scheduleDecorations(update.view);
		}
		const readOnly = update.view.contentDOM.ariaReadOnly === "true";
		const editable = update.view.contentDOM.contentEditable === "true";
		const canBeEdited = readOnly === false && editable;
		this.changePicker(update.view, canBeEdited);
	}

	scheduleDecorations(view: EditorView): void {
		this.pendingView = view;
		if (this.raf) return;
		// Color chips are decorative, so batch rapid viewport/doc changes into
		// one animation frame instead of rebuilding on every intermediate update.
		this.raf = requestAnimationFrame(() => {
			this.raf = 0;
			const pendingView = this.pendingView;
			this.pendingView = null;
			if (!pendingView) return;
			this.decorations = colorDecorations(pendingView);
		});
	}

	changePicker(view: EditorView, canBeEdited: boolean): void {
		const doms = view.contentDOM.querySelectorAll("input[type=color]");
		doms.forEach((inp) => {
			const input = inp as HTMLInputElement;
			if (canBeEdited) {
				input.removeAttribute("disabled");
			} else {
				input.setAttribute("disabled", "");
			}
		});
	}

	destroy(): void {
		if (this.raf) {
			cancelAnimationFrame(this.raf);
			this.raf = 0;
		}
		this.pendingView = null;
	}
}

export const colorView = (showPicker = true) =>
	ViewPlugin.fromClass(ColorViewPlugin, {
		decorations: (v) => v.decorations,
		eventHandlers: {
			click: (e: PointerEvent, view: EditorView): boolean => {
				const target = e.target as HTMLElement | null;
				const chip = target?.closest?.(".cm-color-chip") as HTMLElement | null;
				if (!chip) return false;
				// Respect read-only and setting toggle
				const readOnly = view.contentDOM.ariaReadOnly === "true";
				const editable = view.contentDOM.contentEditable === "true";
				const canBeEdited = !readOnly && editable;
				if (!canBeEdited) return true;
				const data = colorState.get(chip);
				if (!data) return false;

				pickColor(chip.dataset.colorraw || chip.dataset.color || "")
					.then((picked: string | null) => {
						if (!picked) return;
						view.dispatch({
							changes: { from: data.from, to: data.to, insert: picked },
						});
					})
					.catch(() => {
						/* ignore */
					});

				return true;
			},
		},
	});

export default colorView;


================================================
FILE: src/cm/commandRegistry.js
================================================
import fsOperation from "fileSystem";
import * as cmCommands from "@codemirror/commands";
import {
	copyLineDown,
	copyLineUp,
	cursorCharLeft,
	cursorCharRight,
	cursorDocEnd,
	cursorDocStart,
	cursorGroupLeft,
	cursorGroupRight,
	cursorLineDown,
	cursorLineEnd,
	cursorLineStart,
	cursorLineUp,
	cursorMatchingBracket,
	cursorPageDown,
	cursorPageUp,
	deleteCharBackward,
	deleteCharForward,
	deleteGroupBackward,
	deleteGroupForward,
	deleteLine,
	deleteLineBoundaryForward,
	deleteToLineEnd,
	deleteToLineStart,
	indentLess,
	indentMore,
	indentSelection,
	insertBlankLine,
	insertNewlineAndIndent,
	lineComment,
	lineUncomment,
	moveLineDown,
	moveLineUp,
	redo,
	selectAll,
	selectCharLeft,
	selectCharRight,
	selectDocEnd,
	selectDocStart,
	selectGroupLeft,
	selectGroupRight,
	selectLine,
	selectLineDown,
	selectLineEnd,
	selectLineStart,
	selectLineUp,
	selectMatchingBracket,
	selectPageDown,
	selectPageUp,
	simplifySelection,
	toggleBlockComment,
	undo,
} from "@codemirror/commands";
import { indentUnit as indentUnitFacet } from "@codemirror/language";
import {
	closeLintPanel,
	forceLinting,
	nextDiagnostic,
	openLintPanel,
	previousDiagnostic,
} from "@codemirror/lint";
import {
	LSPPlugin,
	closeReferencePanel as lspCloseReferencePanel,
	findReferences as lspFindReferences,
	formatDocument as lspFormatDocument,
	jumpToDeclaration as lspJumpToDeclaration,
	jumpToDefinition as lspJumpToDefinition,
	jumpToImplementation as lspJumpToImplementation,
	jumpToTypeDefinition as lspJumpToTypeDefinition,
} from "@codemirror/lsp-client";
import { Compartment, EditorSelection } from "@codemirror/state";
import { keymap } from "@codemirror/view";
import {
	renameSymbol as acodeRenameSymbol,
	clearDiagnosticsEffect,
	clientManager,
	nextSignature as lspNextSignature,
	prevSignature as lspPrevSignature,
	showSignatureHelp as lspShowSignatureHelp,
} from "cm/lsp";
import {
	closeReferencesPanel as acodeCloseReferencesPanel,
	findAllReferences as acodeFindAllReferences,
	findAllReferencesInTab as acodeFindAllReferencesInTab,
} from "cm/lsp/references";
import { showDocumentSymbols } from "components/symbolsPanel";
import toast from "components/toast";
import prompt from "dialogs/prompt";
import actions from "handlers/quickTools";
import keyBindings from "lib/keyBindings";
import settings from "lib/settings";
import Url from "utils/Url";

const commandKeymapCompartment = new Compartment();

/**
 * @typedef {import("@codemirror/view").EditorView} EditorView
 */

/**
 * @typedef {{
 *  name: string;
 *  description?: string;
 *  readOnly?: boolean;
 *  run: (view?: EditorView | null) => boolean | void;
 *  requiresView?: boolean;
 *  defaultDescription?: string;
 *  defaultKey?: string | null;
 *  key?: string | null;
 * }} CommandEntry
 */

/** @type {Map<string, CommandEntry>} */
const commandMap = new Map();

/** @type {Record<string, any>} */
let resolvedKeyBindings = keyBindings;

/** @type {Record<string, any>} */
let cachedResolvedKeyBindings = {};

let resolvedKeyBindingsVersion = 0;

/** @type {import("@codemirror/view").KeyBinding[]} */
let cachedKeymap = [];

const ARROW_KEY_MAP = {
	left: "ArrowLeft",
	right: "ArrowRight",
	up: "ArrowUp",
	down: "ArrowDown",
};

const SPECIAL_KEY_MAP = {
	esc: "Escape",
	escape: "Escape",
	return: "Enter",
	enter: "Enter",
	space: "Space",
	del: "Delete",
	delete: "Delete",
	backspace: "Backspace",
	tab: "Tab",
	home: "Home",
	end: "End",
	pageup: "PageUp",
	pagedown: "PageDown",
	insert: "Insert",
};

const MODIFIER_MAP = {
	ctrl: "Mod",
	control: "Mod",
	cmd: "Mod",
	meta: "Mod",
	shift: "Shift",
	alt: "Alt",
	option: "Alt",
};

const CODEMIRROR_COMMAND_ENTRIES = Object.entries(cmCommands).filter(
	([, value]) => typeof value === "function",
);

const CODEMIRROR_COMMAND_MAP = new Map(
	CODEMIRROR_COMMAND_ENTRIES.map(([name, fn]) => [name, fn]),
);

registerCoreCommands();
registerLspCommands();
registerLintCommands();
registerCommandsFromKeyBindings();
rebuildKeymap();

function registerCoreCommands() {
	addCommand({
		name: "focusEditor",
		description: "Focus editor",
		readOnly: true,
		requiresView: false,
		run(view) {
			const resolvedView = resolveView(view);
			resolvedView?.focus();
			return true;
		},
	});
	addCommand({
		name: "findFile",
		description: "Find file in workspace",
		readOnly: true,
		requiresView: false,
		run() {
			acode.exec("find-file");
			return true;
		},
	});
	addCommand({
		name: "closeCurrentTab",
		description: "Close current tab",
		readOnly: false,
		requiresView: false,
		run() {
			acode.exec("close-current-tab");
			return true;
		},
	});
	addCommand({
		name: "closeAllTabs",
		description: "Close all tabs",
		readOnly: false,
		requiresView: false,
		run() {
			acode.exec("close-all-tabs");
			return true;
		},
	});
	addCommand({
		name: "togglePinnedTab",
		description: "Pin or unpin current tab",
		readOnly: true,
		requiresView: false,
		run() {
			acode.exec("toggle-pin-tab");
			return true;
		},
	});
	addCommand({
		name: "newFile",
		description: "Create new file",
		readOnly: true,
		requiresView: false,
		run() {
			acode.exec("new-file");
			return true;
		},
	});
	addCommand({
		name: "openFile",
		description: "Open a file",
		readOnly: true,
		requiresView: false,
		run() {
			acode.exec("open-file");
			return true;
		},
	});
	addCommand({
		name: "openFolder",
		description: "Open a folder",
		readOnly: true,
		requiresView: false,
		run() {
			acode.exec("open-folder");
			return true;
		},
	});
	addCommand({
		name: "saveFile",
		description: "Save current file",
		readOnly: true,
		requiresView: false,
		run() {
			acode.exec("save");
			return true;
		},
	});
	addCommand({
		name: "saveFileAs",
		description: "Save as current file",
		readOnly: true,
		requiresView: false,
		run() {
			acode.exec("save-as");
			return true;
		},
	});
	addCommand({
		name: "saveAllChanges",
		description: "Save all changes",
		readOnly: true,
		requiresView: false,
		run() {
			acode.exec("save-all-changes");
			return true;
		},
	});
	addCommand({
		name: "nextFile",
		description: "Open next file tab",
		readOnly: true,
		requiresView: false,
		run() {
			acode.exec("next-file");
			return true;
		},
	});
	addCommand({
		name: "prevFile",
		description: "Open previous file tab",
		readOnly: true,
		requiresView: false,
		run() {
			acode.exec("prev-file");
			return true;
		},
	});
	addCommand({
		name: "showSettingsMenu",
		description: "Show settings menu",
		readOnly: true,
		requiresView: false,
		run() {
			acode.exec("open", "settings");
			return true;
		},
	});
	addCommand({
		name: "renameFile",
		description: "Rename active file",
		readOnly: true,
		requiresView: false,
		run() {
			acode.exec("rename");
			return true;
		},
	});
	addCommand({
		name: "run",
		description: "Preview HTML and MarkDown",
		readOnly: true,
		requiresView: false,
		run() {
			acode.exec("run");
			return true;
		},
	});
	addCommand({
		name: "openInAppBrowser",
		description: "Open In-App Browser",
		readOnly: true,
		requiresView: false,
		run: openInAppBrowserCommand,
	});
	addCommand({
		name: "toggleFullscreen",
		description: "Toggle full screen mode",
		readOnly: true,
		requiresView: false,
		run() {
			acode.exec("toggle-fullscreen");
			return true;
		},
	});
	addCommand({
		name: "toggleSidebar",
		description: "Toggle sidebar",
		readOnly: true,
		requiresView: false,
		run() {
			acode.exec("toggle-sidebar");
			return true;
		},
	});
	addCommand({
		name: "toggleMenu",
		description: "Toggle main menu",
		readOnly: true,
		requiresView: false,
		run() {
			acode.exec("toggle-menu");
			return true;
		},
	});
	addCommand({
		name: "toggleEditMenu",
		description: "Toggle edit menu",
		readOnly: true,
		requiresView: false,
		run() {
			acode.exec("toggle-editmenu");
			return true;
		},
	});
	addCommand({
		name: "selectall",
		description: "Select all",
		readOnly: true,
		requiresView: true,
		run(view) {
			const resolvedView = resolveView(view);
			if (!resolvedView) return false;
			return selectAll(resolvedView);
		},
	});
	addCommand({
		name: "gotoline",
		description: "Go to line...",
		readOnly: true,
		requiresView: false,
		run() {
			acode.exec("goto");
			return true;
		},
	});
	addCommand({
		name: "find",
		description: "Find",
		readOnly: true,
		requiresView: false,
		run() {
			acode.exec("find");
			return true;
		},
	});
	addCommand({
		name: "copy",
		description: "Copy",
		readOnly: true,
		requiresView: true,
		run: copyCommand,
	});
	addCommand({
		name: "cut",
		description: "Cut",
		readOnly: false,
		requiresView: true,
		run: cutCommand,
	});
	addCommand({
		name: "paste",
		description: "Paste",
		readOnly: false,
		requiresView: true,
		run: pasteCommand,
	});
	addCommand({
		name: "problems",
		description: "Show errors and warnings",
		readOnly: true,
		requiresView: false,
		run() {
			acode.exec("open", "problems");
			return true;
		},
	});
	addCommand({
		name: "replace",
		description: "Replace",
		readOnly: true,
		requiresView: false,
		run() {
			acode.exec("replace");
			return true;
		},
	});
	addCommand({
		name: "openCommandPalette",
		description: "Open command palette",
		readOnly: true,
		requiresView: false,
		run() {
			acode.exec("command-palette");
			return true;
		},
	});
	addCommand({
		name: "modeSelect",
		description: "Change language mode...",
		readOnly: true,
		requiresView: false,
		run() {
			acode.exec("syntax");
			return true;
		},
	});
	addCommand({
		name: "toggleQuickTools",
		description: "Toggle quick tools",
		readOnly: true,
		requiresView: false,
		run() {
			actions("toggle");
			return true;
		},
	});
	addCommand({
		name: "selectWord",
		description: "Select current word",
		readOnly: false,
		requiresView: true,
		run: selectWordCommand,
	});
	addCommand({
		name: "openLogFile",
		description: "Open Log File",
		readOnly: true,
		requiresView: false,
		run() {
			acode.exec("open-log-file");
			return true;
		},
	});
	addCommand({
		name: "increaseFontSize",
		description: "Increase font size",
		readOnly: false,
		requiresView: false,
		run: () => adjustFontSize(1),
	});
	addCommand({
		name: "decreaseFontSize",
		description: "Decrease font size",
		readOnly: false,
		requiresView: false,
		run: () => adjustFontSize(-1),
	});
	addCommand({
		name: "openPluginsPage",
		description: "Open Plugins Page",
		readOnly: true,
		requiresView: false,
		run() {
			acode.exec("open", "plugins");
			return true;
		},
	});
	addCommand({
		name: "openFileExplorer",
		description: "File Explorer",
		readOnly: true,
		requiresView: false,
		run() {
			acode.exec("open", "file_browser");
			return true;
		},
	});
	addCommand({
		name: "copyDeviceInfo",
		description: "Copy Device info",
		readOnly: true,
		requiresView: false,
		run() {
			acode.exec("copy-device-info");
			return true;
		},
	});
	addCommand({
		name: "changeAppTheme",
		description: "Change App Theme",
		readOnly: true,
		requiresView: false,
		run() {
			acode.exec("change-app-theme");
			return true;
		},
	});
	addCommand({
		name: "changeEditorTheme",
		description: "Change Editor Theme",
		readOnly: true,
		requiresView: false,
		run() {
			acode.exec("change-editor-theme");
			return true;
		},
	});
	addCommand({
		name: "openTerminal",
		description: "Open Terminal",
		readOnly: true,
		requiresView: false,
		run() {
			acode.exec("new-terminal");
			return true;
		},
	});
	addCommand({
		name: "acode:showWelcome",
		description: "Show Welcome",
		readOnly: true,
		requiresView: false,
		run() {
			acode.exec("welcome");
			return true;
		},
	});
	addCommand({
		name: "run-tests",
		description: "Run Tests",
		key: "Ctrl-Shift-T",
		readOnly: true,
		requiresView: false,
		run() {
			acode.exec("run-tests");
			return true;
		},
	});
	addCommand({
		name: "dev:openInspector",
		description: "Open Inspector",
		run() {
			acode.exec("open-inspector");
			return true;
		},
		readOnly: true,
		requiresView: false,
	});
	addCommand({
		name: "dev:toggleDevTools",
		description: "Toggle Developer Tools",
		run() {
			acode.exec("toggle-inspector");
			return true;
		},
		readOnly: true,
		requiresView: false,
		key: "Ctrl-Shift-I",
	});

	// Additional editor-centric helpers mapped to CodeMirror primitives that have existing key bindings in defaults.
	addCommand({
		name: "duplicateSelection",
		description: "Duplicate selection",
		readOnly: false,
		requiresView: true,
		run(view) {
			const resolvedView = resolveView(view);
			if (!resolvedView) return false;
			return copyLineDown(resolvedView);
		},
	});
	addCommand({
		name: "copylinesdown",
		description: "Copy lines down",
		readOnly: false,
		requiresView: true,
		run(view) {
			const resolvedView = resolveView(view);
			if (!resolvedView) return false;
			return copyLineDown(resolvedView);
		},
	});
	addCommand({
		name: "copylinesup",
		description: "Copy lines up",
		readOnly: false,
		requiresView: true,
		run(view) {
			const resolvedView = resolveView(view);
			if (!resolvedView) return false;
			return copyLineUp(resolvedView);
		},
	});
	addCommand({
		name: "movelinesdown",
		description: "Move lines down",
		readOnly: false,
		requiresView: true,
		run(view) {
			const resolvedView = resolveView(view);
			if (!resolvedView) return false;
			return moveLineDown(resolvedView);
		},
	});
	addCommand({
		name: "movelinesup",
		description: "Move lines up",
		readOnly: false,
		requiresView: true,
		run(view) {
			const resolvedView = resolveView(view);
			if (!resolvedView) return false;
	
Download .txt
gitextract_3l2wh458/

├── .babelrc
├── .devcontainer/
│   ├── Dockerfile
│   └── devcontainer.json
├── .dockerignore
├── .gitattributes
├── .github/
│   ├── CODEOWNERS
│   ├── ISSUE_TEMPLATE/
│   │   ├── 0_bug_report.yml
│   │   ├── 1_feature_request.yml
│   │   └── config.yml
│   ├── dependabot.yml
│   ├── labeler.yml
│   └── workflows/
│       ├── add-pr-labels.yml
│       ├── ci.yml
│       ├── close-inactive-issues.yml
│       ├── community-release-notifier.yml
│       ├── nightly-build.yml
│       └── on-demand-preview-releases-PR.yml
├── .gitignore
├── .hintrc
├── .prettierrc
├── .vscode/
│   ├── launch.json
│   ├── plugins.json
│   ├── settings.json
│   └── typings/
│       └── cordova/
│           └── cordova.d.ts
├── CHANGELOG.md
├── CODE_OF_CONDUCT.md
├── CONTRIBUTING.md
├── _typos.toml
├── biome.json
├── build-extras.gradle
├── config.xml
├── fastlane/
│   └── metadata/
│       └── android/
│           └── en-US/
│               ├── full_description.txt
│               ├── short_description.txt
│               └── title.txt
├── hooks/
│   ├── README.md
│   ├── modify-java-files.js
│   ├── move-files.js
│   ├── post-process.js
│   └── restore-cordova-resources.js
├── jsconfig.json
├── license.txt
├── package.json
├── postcss.config.js
├── readme.md
├── res/
│   └── android/
│       ├── drawable/
│       │   ├── ic_launcher_background.xml
│       │   └── ic_launcher_foreground.xml
│       ├── mipmap-anydpi-v26/
│       │   ├── ic_launcher.xml
│       │   └── ic_launcher_round.xml
│       ├── values/
│       │   ├── colors.xml
│       │   ├── ic_launcher_background.xml
│       │   └── themes.xml
│       └── xml/
│           └── network_security_config.xml
├── rspack.config.js
├── src/
│   ├── cm/
│   │   ├── baseExtensions.ts
│   │   ├── colorView.ts
│   │   ├── commandRegistry.js
│   │   ├── editorUtils.ts
│   │   ├── indentGuides.ts
│   │   ├── lsp/
│   │   │   ├── api.ts
│   │   │   ├── clientManager.ts
│   │   │   ├── codeActions.ts
│   │   │   ├── diagnostics.ts
│   │   │   ├── documentSymbols.ts
│   │   │   ├── formatter.ts
│   │   │   ├── formattingSupport.ts
│   │   │   ├── index.ts
│   │   │   ├── inlayHints.ts
│   │   │   ├── installRuntime.ts
│   │   │   ├── installerUtils.ts
│   │   │   ├── providerUtils.ts
│   │   │   ├── references.ts
│   │   │   ├── rename.ts
│   │   │   ├── serverCatalog.ts
│   │   │   ├── serverLauncher.ts
│   │   │   ├── serverRegistry.ts
│   │   │   ├── servers/
│   │   │   │   ├── index.ts
│   │   │   │   ├── javascript.ts
│   │   │   │   ├── luau.ts
│   │   │   │   ├── python.ts
│   │   │   │   ├── shared.ts
│   │   │   │   ├── systems.ts
│   │   │   │   └── web.ts
│   │   │   ├── tooltipExtensions.ts
│   │   │   ├── transport.ts
│   │   │   ├── types.ts
│   │   │   └── workspace.ts
│   │   ├── mainEditorExtensions.ts
│   │   ├── modelist.ts
│   │   ├── modes/
│   │   │   └── luau/
│   │   │       └── index.ts
│   │   ├── rainbowBrackets.ts
│   │   ├── supportedModes.ts
│   │   ├── themes/
│   │   │   ├── aura.js
│   │   │   ├── dracula.js
│   │   │   ├── githubDark.js
│   │   │   ├── githubLight.js
│   │   │   ├── index.js
│   │   │   ├── monokai.js
│   │   │   ├── noctisLilac.js
│   │   │   ├── solarizedDark.js
│   │   │   ├── solarizedLight.js
│   │   │   ├── tokyoNight.js
│   │   │   ├── tokyoNightDay.js
│   │   │   ├── tomorrowNight.js
│   │   │   ├── tomorrowNightBright.js
│   │   │   └── vscodeDark.js
│   │   └── touchSelectionMenu.js
│   ├── components/
│   │   ├── WebComponents/
│   │   │   ├── index.js
│   │   │   └── wcPage.js
│   │   ├── audioPlayer/
│   │   │   ├── index.js
│   │   │   └── style.scss
│   │   ├── checkbox/
│   │   │   ├── index.js
│   │   │   └── styles.scss
│   │   ├── collapsableList.js
│   │   ├── contextmenu/
│   │   │   ├── index.js
│   │   │   └── style.scss
│   │   ├── fileTree/
│   │   │   ├── index.js
│   │   │   └── style.scss
│   │   ├── inputhints/
│   │   │   ├── index.js
│   │   │   └── style.scss
│   │   ├── logo/
│   │   │   ├── index.js
│   │   │   └── style.scss
│   │   ├── lspInfoDialog/
│   │   │   ├── index.js
│   │   │   └── styles.scss
│   │   ├── lspStatusBar/
│   │   │   ├── index.js
│   │   │   └── style.scss
│   │   ├── page.js
│   │   ├── palette/
│   │   │   ├── index.js
│   │   │   └── style.scss
│   │   ├── quickTools/
│   │   │   ├── footer.js
│   │   │   ├── index.js
│   │   │   ├── items.js
│   │   │   └── style.scss
│   │   ├── referencesPanel/
│   │   │   ├── index.js
│   │   │   ├── referencesTab.js
│   │   │   ├── styles.scss
│   │   │   └── utils.js
│   │   ├── scrollbar/
│   │   │   ├── index.js
│   │   │   └── style.scss
│   │   ├── searchbar/
│   │   │   ├── index.js
│   │   │   └── style.scss
│   │   ├── settingsPage.js
│   │   ├── settingsPage.scss
│   │   ├── sideButton/
│   │   │   ├── index.js
│   │   │   └── style.scss
│   │   ├── sidebar/
│   │   │   ├── index.js
│   │   │   └── style.scss
│   │   ├── symbolsPanel/
│   │   │   ├── index.js
│   │   │   └── styles.scss
│   │   ├── tabView.js
│   │   ├── terminal/
│   │   │   ├── index.js
│   │   │   ├── ligatures.js
│   │   │   ├── terminal.js
│   │   │   ├── terminalDefaults.js
│   │   │   ├── terminalManager.js
│   │   │   ├── terminalThemeManager.js
│   │   │   ├── terminalTouchSelection.css
│   │   │   └── terminalTouchSelection.js
│   │   ├── tile/
│   │   │   ├── index.js
│   │   │   └── style.scss
│   │   ├── toast/
│   │   │   ├── index.js
│   │   │   └── style.scss
│   │   ├── tutorial.js
│   │   └── virtualList/
│   │       ├── index.js
│   │       └── style.scss
│   ├── dialogs/
│   │   ├── alert.js
│   │   ├── box.js
│   │   ├── color.js
│   │   ├── confirm.js
│   │   ├── loader.js
│   │   ├── multiPrompt.js
│   │   ├── prompt.js
│   │   ├── rateBox.js
│   │   ├── select.js
│   │   └── style.scss
│   ├── fileSystem/
│   │   ├── externalFs.js
│   │   ├── ftp.js
│   │   ├── index.js
│   │   ├── internalFs.js
│   │   └── sftp.js
│   ├── handlers/
│   │   ├── editorFileTab.js
│   │   ├── intent.js
│   │   ├── keyboard.js
│   │   ├── purchase.js
│   │   ├── quickTools.js
│   │   ├── quickToolsInit.js
│   │   └── windowResize.js
│   ├── index.d.ts
│   ├── lang/
│   │   ├── ar-ye.json
│   │   ├── be-by.json
│   │   ├── bn-bd.json
│   │   ├── cs-cz.json
│   │   ├── de-de.json
│   │   ├── en-us.json
│   │   ├── es-sv.json
│   │   ├── fr-fr.json
│   │   ├── he-il.json
│   │   ├── hi-in.json
│   │   ├── hu-hu.json
│   │   ├── id-id.json
│   │   ├── ir-fa.json
│   │   ├── it-it.json
│   │   ├── ja-jp.json
│   │   ├── ko-kr.json
│   │   ├── ml-in.json
│   │   ├── mm-unicode.json
│   │   ├── mm-zawgyi.json
│   │   ├── pl-pl.json
│   │   ├── pt-br.json
│   │   ├── pu-in.json
│   │   ├── ru-ru.json
│   │   ├── tl-ph.json
│   │   ├── tr-tr.json
│   │   ├── uk-ua.json
│   │   ├── uz-uz.json
│   │   ├── vi-vn.json
│   │   ├── zh-cn.json
│   │   ├── zh-hant.json
│   │   └── zh-tw.json
│   ├── lib/
│   │   ├── acode.js
│   │   ├── actionStack.js
│   │   ├── adRewards.js
│   │   ├── applySettings.js
│   │   ├── auth.js
│   │   ├── checkFiles.js
│   │   ├── checkPluginsUpdate.js
│   │   ├── commands.js
│   │   ├── console.js
│   │   ├── constants.js
│   │   ├── devTools.js
│   │   ├── editorFile.js
│   │   ├── editorManager.js
│   │   ├── fileList.js
│   │   ├── fileTypeHandler.js
│   │   ├── fonts.js
│   │   ├── installPlugin.js
│   │   ├── installState.js
│   │   ├── keyBindings.js
│   │   ├── lang.js
│   │   ├── loadPlugin.js
│   │   ├── loadPlugins.js
│   │   ├── logger.js
│   │   ├── notificationManager.js
│   │   ├── openFile.js
│   │   ├── openFolder.js
│   │   ├── polyfill.js
│   │   ├── prettierFormatter.js
│   │   ├── projects.js
│   │   ├── recents.js
│   │   ├── remoteStorage.js
│   │   ├── removeAds.js
│   │   ├── restoreFiles.js
│   │   ├── restoreTheme.js
│   │   ├── run.js
│   │   ├── saveFile.js
│   │   ├── saveState.js
│   │   ├── searchHistory.js
│   │   ├── secureAdRewardState.js
│   │   ├── selectionMenu.js
│   │   ├── settings.js
│   │   ├── showFileInfo.js
│   │   ├── startAd.js
│   │   └── systemConfiguration.js
│   ├── main.js
│   ├── main.scss
│   ├── pages/
│   │   ├── about/
│   │   │   ├── about.js
│   │   │   ├── about.scss
│   │   │   └── index.js
│   │   ├── adRewards/
│   │   │   ├── adRewards.scss
│   │   │   └── index.js
│   │   ├── changelog/
│   │   │   ├── changelog.js
│   │   │   ├── index.js
│   │   │   └── style.scss
│   │   ├── customTheme/
│   │   │   ├── customTheme.js
│   │   │   ├── customTheme.scss
│   │   │   └── index.js
│   │   ├── fileBrowser/
│   │   │   ├── add-menu-home.hbs
│   │   │   ├── add-menu.hbs
│   │   │   ├── fileBrowser.hbs
│   │   │   ├── fileBrowser.js
│   │   │   ├── fileBrowser.scss
│   │   │   ├── index.js
│   │   │   ├── list.hbs
│   │   │   └── util.js
│   │   ├── fontManager/
│   │   │   ├── fontManager.js
│   │   │   ├── index.js
│   │   │   └── style.scss
│   │   ├── markdownPreview/
│   │   │   ├── index.js
│   │   │   ├── renderer.js
│   │   │   └── style.scss
│   │   ├── plugin/
│   │   │   ├── index.js
│   │   │   ├── plugin.js
│   │   │   ├── plugin.scss
│   │   │   └── plugin.view.js
│   │   ├── plugins/
│   │   │   ├── index.js
│   │   │   ├── item.js
│   │   │   ├── plugins.js
│   │   │   └── plugins.scss
│   │   ├── problems/
│   │   │   ├── index.js
│   │   │   ├── problems.js
│   │   │   └── style.scss
│   │   ├── quickTools/
│   │   │   ├── index.js
│   │   │   ├── quickTools.js
│   │   │   └── style.scss
│   │   ├── sponsor/
│   │   │   ├── index.js
│   │   │   ├── sponsor.js
│   │   │   └── style.scss
│   │   ├── sponsors/
│   │   │   ├── index.js
│   │   │   ├── sponsors.js
│   │   │   └── style.scss
│   │   ├── themeSetting/
│   │   │   ├── index.js
│   │   │   ├── themeSetting.js
│   │   │   └── themeSetting.scss
│   │   └── welcome/
│   │       ├── index.js
│   │       ├── welcome.js
│   │       └── welcome.scss
│   ├── palettes/
│   │   ├── changeEditorTheme/
│   │   │   └── index.js
│   │   ├── changeEncoding/
│   │   │   └── index.js
│   │   ├── changeMode/
│   │   │   └── index.js
│   │   ├── changeTheme/
│   │   │   ├── index.js
│   │   │   └── style.scss
│   │   ├── commandPalette/
│   │   │   └── index.js
│   │   └── findFile/
│   │       └── index.js
│   ├── plugins/
│   │   ├── auth/
│   │   │   ├── package.json
│   │   │   ├── plugin.xml
│   │   │   └── src/
│   │   │       └── android/
│   │   │           ├── Authenticator.java
│   │   │           └── EncryptedPreferenceManager.java
│   │   ├── browser/
│   │   │   ├── android/
│   │   │   │   └── com/
│   │   │   │       └── foxdebug/
│   │   │   │           └── browser/
│   │   │   │               ├── Browser.java
│   │   │   │               ├── BrowserActivity.java
│   │   │   │               ├── Emulator.java
│   │   │   │               ├── Menu.java
│   │   │   │               └── Plugin.java
│   │   │   ├── index.js
│   │   │   ├── package.json
│   │   │   ├── plugin.xml
│   │   │   ├── res/
│   │   │   │   └── android/
│   │   │   │       ├── menu_enter.xml
│   │   │   │       ├── menu_exit.xml
│   │   │   │       └── styles.xml
│   │   │   └── utils/
│   │   │       └── updatePackage.js
│   │   ├── cordova-plugin-buildinfo/
│   │   │   ├── .gitignore
│   │   │   ├── .npmignore
│   │   │   ├── .travis.yml
│   │   │   ├── LICENSE
│   │   │   ├── package.json
│   │   │   ├── plugin.xml
│   │   │   ├── scripts/
│   │   │   │   ├── after_install.js
│   │   │   │   ├── before_uninstall.js
│   │   │   │   └── browser_after_prepare.js
│   │   │   ├── src/
│   │   │   │   └── android/
│   │   │   │       ├── BuildInfo.gradle
│   │   │   │       └── BuildInfo.java
│   │   │   └── www/
│   │   │       └── buildinfo.js
│   │   ├── custom-tabs/
│   │   │   ├── package.json
│   │   │   ├── plugin.xml
│   │   │   ├── src/
│   │   │   │   └── CustomTabsPlugin.java
│   │   │   └── www/
│   │   │       └── customtabs.js
│   │   ├── ftp/
│   │   │   ├── LICENSE.md
│   │   │   ├── README.md
│   │   │   ├── index.d.ts
│   │   │   ├── package.json
│   │   │   ├── plugin.xml
│   │   │   ├── src/
│   │   │   │   └── android/
│   │   │   │       └── com/
│   │   │   │           └── foxdebug/
│   │   │   │               └── ftp/
│   │   │   │                   └── Ftp.java
│   │   │   └── www/
│   │   │       └── ftp.js
│   │   ├── iap/
│   │   │   ├── index.d.ts
│   │   │   ├── package.json
│   │   │   ├── plugin.xml
│   │   │   ├── src/
│   │   │   │   └── com/
│   │   │   │       └── foxdebug/
│   │   │   │           └── iap/
│   │   │   │               └── Iap.java
│   │   │   └── www/
│   │   │       └── plugin.js
│   │   ├── pluginContext/
│   │   │   ├── package.json
│   │   │   ├── plugin.xml
│   │   │   ├── src/
│   │   │   │   └── android/
│   │   │   │       └── Tee.java
│   │   │   └── www/
│   │   │       └── PluginContext.js
│   │   ├── proot/
│   │   │   ├── package.json
│   │   │   └── plugin.xml
│   │   ├── sdcard/
│   │   │   ├── index.d.ts
│   │   │   ├── package.json
│   │   │   ├── plugin.xml
│   │   │   ├── readme.md
│   │   │   ├── src/
│   │   │   │   └── android/
│   │   │   │       └── SDcard.java
│   │   │   └── www/
│   │   │       └── plugin.js
│   │   ├── server/
│   │   │   ├── index.d.ts
│   │   │   ├── package.json
│   │   │   ├── plugin.xml
│   │   │   ├── src/
│   │   │   │   └── android/
│   │   │   │       └── com/
│   │   │   │           └── foxdebug/
│   │   │   │               └── server/
│   │   │   │                   ├── NanoHTTPDWebserver.java
│   │   │   │                   └── Server.java
│   │   │   └── www/
│   │   │       └── server.js
│   │   ├── sftp/
│   │   │   ├── LICENSE.md
│   │   │   ├── README.md
│   │   │   ├── index.d.ts
│   │   │   ├── package.json
│   │   │   ├── plugin.xml
│   │   │   ├── src/
│   │   │   │   └── com/
│   │   │   │       └── foxdebug/
│   │   │   │           └── sftp/
│   │   │   │               └── Sftp.java
│   │   │   └── www/
│   │   │       └── sftp.js
│   │   ├── system/
│   │   │   ├── android/
│   │   │   │   └── com/
│   │   │   │       └── foxdebug/
│   │   │   │           └── system/
│   │   │   │               ├── RewardPassManager.java
│   │   │   │               ├── SoftInputAssist.java
│   │   │   │               ├── System.java
│   │   │   │               └── Ui.java
│   │   │   ├── package.json
│   │   │   ├── plugin.xml
│   │   │   ├── readme.md
│   │   │   ├── res/
│   │   │   │   └── android/
│   │   │   │       └── file_provider.xml
│   │   │   ├── system.d.ts
│   │   │   ├── utils/
│   │   │   │   ├── changeProvider.js
│   │   │   │   ├── fixProvider.js
│   │   │   │   └── resetProvider.js
│   │   │   └── www/
│   │   │       └── plugin.js
│   │   ├── terminal/
│   │   │   ├── package.json
│   │   │   ├── plugin.xml
│   │   │   ├── scripts/
│   │   │   │   ├── init-alpine.sh
│   │   │   │   ├── init-sandbox.sh
│   │   │   │   └── rm-wrapper.sh
│   │   │   ├── src/
│   │   │   │   └── android/
│   │   │   │       ├── AlpineDocumentProvider.java
│   │   │   │       ├── BackgroundExecutor.java
│   │   │   │       ├── Executor.java
│   │   │   │       ├── ProcessManager.java
│   │   │   │       ├── ProcessServer.java
│   │   │   │       ├── ProcessUtils.java
│   │   │   │       ├── StreamHandler.java
│   │   │   │       └── TerminalService.java
│   │   │   └── www/
│   │   │       ├── Executor.js
│   │   │       └── Terminal.js
│   │   └── websocket/
│   │       ├── README.md
│   │       ├── package.json
│   │       ├── plugin.xml
│   │       ├── src/
│   │       │   └── android/
│   │       │       ├── WebSocketInstance.java
│   │       │       └── WebSocketPlugin.java
│   │       └── www/
│   │           └── websocket.js
│   ├── res/
│   │   ├── file-icons/
│   │   │   └── style.css
│   │   └── icons/
│   │       └── style.css
│   ├── settings/
│   │   ├── appSettings.js
│   │   ├── backupRestore.js
│   │   ├── editorSettings.js
│   │   ├── filesSettings.js
│   │   ├── formatterSettings.js
│   │   ├── helpSettings.js
│   │   ├── lspConfigUtils.js
│   │   ├── lspServerDetail.js
│   │   ├── lspSettings.js
│   │   ├── mainSettings.js
│   │   ├── previewSettings.js
│   │   ├── scrollSettings.js
│   │   ├── searchSettings.js
│   │   └── terminalSettings.js
│   ├── sidebarApps/
│   │   ├── extensions/
│   │   │   ├── index.js
│   │   │   └── style.scss
│   │   ├── files/
│   │   │   ├── index.js
│   │   │   └── style.scss
│   │   ├── index.js
│   │   ├── notification/
│   │   │   ├── index.js
│   │   │   └── style.scss
│   │   ├── searchInFiles/
│   │   │   ├── cmResultView.js
│   │   │   ├── index.js
│   │   │   ├── styles.scss
│   │   │   └── worker.js
│   │   └── sidebarApp.js
│   ├── styles/
│   │   ├── codemirror.scss
│   │   ├── console.m.scss
│   │   ├── fileInfo.scss
│   │   ├── fonts.scss
│   │   ├── keyframes.scss
│   │   ├── list.scss
│   │   ├── markdown.scss
│   │   ├── mixins.scss
│   │   ├── overrideAceStyle.scss
│   │   ├── page.scss
│   │   └── wideScreen.scss
│   ├── test/
│   │   ├── ace.test.js
│   │   ├── editor.tests.js
│   │   ├── exec.tests.js
│   │   ├── sanity.tests.js
│   │   ├── tester.js
│   │   └── url.tests.js
│   ├── theme/
│   │   ├── builder.js
│   │   ├── list.js
│   │   └── preInstalled.js
│   ├── utils/
│   │   ├── Path.js
│   │   ├── Uri.js
│   │   ├── Url.js
│   │   ├── codeHighlight.js
│   │   ├── color/
│   │   │   ├── hex.js
│   │   │   ├── hsl.js
│   │   │   ├── index.js
│   │   │   ├── regex.js
│   │   │   └── rgb.js
│   │   ├── encodings.js
│   │   ├── helpers.js
│   │   ├── keyboardEvent.js
│   │   ├── polyfill.js
│   │   └── taskManager.js
│   └── views/
│       ├── console.hbs
│       ├── file-info.hbs
│       ├── file-menu.hbs
│       ├── markdown.hbs
│       ├── menu.hbs
│       └── rating.hbs
├── tsconfig.json
├── utils/
│   ├── code-editor-icon.icomoon.json
│   ├── config.js
│   ├── custom-loaders/
│   │   └── html-tag-jsx-loader.js
│   ├── lang.js
│   ├── loadStyles.js
│   ├── scripts/
│   │   ├── build.sh
│   │   ├── clean.sh
│   │   ├── generate-release-notes.js
│   │   ├── plugin.sh
│   │   ├── setup.sh
│   │   └── start.sh
│   ├── setup.js
│   ├── storage_manager.mjs
│   └── updateAce.js
├── webpack.config.js
└── www/
    └── index.html
Download .txt
Showing preview only (214K chars total). Download the full file or copy to clipboard to get everything.
SYMBOL INDEX (2848 symbols across 288 files)

FILE: .vscode/typings/cordova/cordova.d.ts
  type Cordova (line 9) | interface Cordova {
  type CordovaPlugins (line 30) | interface CordovaPlugins {}
  type Document (line 32) | interface Document {
  type Window (line 59) | interface Window {
  type ArgsCheck (line 64) | interface ArgsCheck {
  type UrlUtil (line 71) | interface UrlUtil {

FILE: hooks/modify-java-files.js
  function main (line 7) | async function main() {

FILE: hooks/post-process.js
  function getTmpDir (line 34) | function getTmpDir() {
  function patchTargetSdkVersion (line 56) | function patchTargetSdkVersion() {
  function enableLegacyJni (line 106) | function enableLegacyJni() {
  function enableStaticContext (line 133) | function enableStaticContext() {
  function enableKeyboardWorkaround (line 189) | function enableKeyboardWorkaround() {
  function copyDirRecursively (line 247) | function copyDirRecursively(src, dest, skip = [], currPath = '') {
  function removeConflictingResourceFiles (line 284) | function removeConflictingResourceFiles(src, dest) {

FILE: hooks/restore-cordova-resources.js
  function restoreCordovaResourceFiles (line 19) | function restoreCordovaResourceFiles(currentPath) {
  function shouldRestore (line 45) | function shouldRestore(filePath) {

FILE: src/cm/baseExtensions.ts
  function createBaseExtensions (line 28) | function createBaseExtensions(): Extension[] {

FILE: src/cm/colorView.ts
  type ColorWidgetState (line 13) | interface ColorWidgetState {
  type ColorWidgetParams (line 20) | interface ColorWidgetParams extends ColorWidgetState {
  constant HEX_RE (line 28) | const HEX_RE = new RegExp(HEX, "gi");
  constant RGBG (line 30) | const RGBG = new RegExp(colorRegex.anyGlobal);
  function isWhitespace (line 38) | function isWhitespace(char: string): boolean {
  function isAlpha (line 48) | function isAlpha(char: string): boolean {
  function charAt (line 57) | function charAt(doc: Text, index: number): string {
  function findPrevNonWhitespace (line 62) | function findPrevNonWhitespace(doc: Text, index: number): number {
  function findNextNonWhitespace (line 69) | function findNextNonWhitespace(doc: Text, index: number): number {
  function readWordBefore (line 76) | function readWordBefore(doc: Text, index: number): string {
  function shouldRenderColor (line 91) | function shouldRenderColor(doc: Text, start: number, end: number): boole...
  class ColorWidget (line 115) | class ColorWidget extends WidgetType {
    method constructor (line 120) | constructor({ color, colorRaw, ...state }: ColorWidgetParams) {
    method eq (line 127) | eq(other: ColorWidget): boolean {
    method toDOM (line 137) | toDOM(): HTMLElement {
    method ignoreEvent (line 156) | ignoreEvent(): boolean {
  function colorDecorations (line 161) | function colorDecorations(view: EditorView): DecorationSet {
  class ColorViewPlugin (line 194) | class ColorViewPlugin {
    method constructor (line 199) | constructor(view: EditorView) {
    method update (line 203) | update(update: ViewUpdate): void {
    method scheduleDecorations (line 213) | scheduleDecorations(view: EditorView): void {
    method changePicker (line 227) | changePicker(view: EditorView, canBeEdited: boolean): void {
    method destroy (line 239) | destroy(): void {

FILE: src/cm/commandRegistry.js
  constant ARROW_KEY_MAP (line 130) | const ARROW_KEY_MAP = {
  constant SPECIAL_KEY_MAP (line 137) | const SPECIAL_KEY_MAP = {
  constant MODIFIER_MAP (line 154) | const MODIFIER_MAP = {
  constant CODEMIRROR_COMMAND_ENTRIES (line 164) | const CODEMIRROR_COMMAND_ENTRIES = Object.entries(cmCommands).filter(
  constant CODEMIRROR_COMMAND_MAP (line 168) | const CODEMIRROR_COMMAND_MAP = new Map(
  function registerCoreCommands (line 178) | function registerCoreCommands() {
  function registerLspCommands (line 929) | function registerLspCommands() {
  function registerLintCommands (line 1088) | function registerLintCommands() {
  function registerCommandsFromKeyBindings (line 1135) | function registerCommandsFromKeyBindings() {
  function addCommand (line 1182) | function addCommand(entry) {
  function resolveView (line 1192) | function resolveView(view) {
  function notifyLspUnavailable (line 1196) | function notifyLspUnavailable() {
  function runLspCommand (line 1200) | function runLspCommand(commandFn, options = {}) {
  function humanizeCommandName (line 1216) | function humanizeCommandName(name) {
  function copyCommand (line 1223) | function copyCommand(view) {
  function cutCommand (line 1240) | function cutCommand(view) {
  function pasteCommand (line 1267) | function pasteCommand(view) {
  function selectWordCommand (line 1282) | function selectWordCommand(view) {
  function openInAppBrowserCommand (line 1298) | async function openInAppBrowserCommand() {
  function adjustFontSize (line 1307) | function adjustFontSize(delta) {
  function parseKeyString (line 1316) | function parseKeyString(keyString) {
  function hasOwnBindingOverride (line 1324) | function hasOwnBindingOverride(name) {
  function resolveBindingInfo (line 1328) | function resolveBindingInfo(name) {
  function buildResolvedKeyBindingsSnapshot (line 1344) | function buildResolvedKeyBindingsSnapshot() {
  function toCodeMirrorKey (line 1357) | function toCodeMirrorKey(combo) {
  function rebuildKeymap (line 1396) | function rebuildKeymap() {
  function resolveCommand (line 1424) | function resolveCommand(name) {
  function commandRunsInReadOnly (line 1428) | function commandRunsInReadOnly(command, view) {
  function executeCommand (line 1433) | function executeCommand(name, view, args) {
  function getRegisteredCommands (line 1450) | function getRegisteredCommands() {
  function getResolvedKeyBindings (line 1458) | function getResolvedKeyBindings() {
  function getResolvedKeyBindingsVersion (line 1462) | function getResolvedKeyBindingsVersion() {
  function getCommandKeymapExtension (line 1466) | function getCommandKeymapExtension() {
  function setKeyBindings (line 1470) | async function setKeyBindings(view) {
  function loadCustomKeyBindings (line 1477) | async function loadCustomKeyBindings() {
  function resetKeyBindings (line 1494) | async function resetKeyBindings() {
  function registerExternalCommand (line 1512) | function registerExternalCommand(descriptor = {}) {
  function removeExternalCommand (line 1531) | function removeExternalCommand(name) {
  function refreshCommandKeymap (line 1540) | function refreshCommandKeymap(view) {
  function normalizeExternalCommand (line 1545) | function normalizeExternalCommand(descriptor) {
  function normalizeExternalKey (line 1583) | function normalizeExternalKey(bindKey) {
  function applyCommandKeymap (line 1598) | function applyCommandKeymap(view, bindings = cachedKeymap) {

FILE: src/cm/editorUtils.ts
  type FoldSpan (line 6) | interface FoldSpan {
  type SelectionRange (line 12) | interface SelectionRange {
  type SerializedSelection (line 16) | interface SerializedSelection {
  type ScrollPosition (line 20) | interface ScrollPosition {
  function getAllFolds (line 28) | function getAllFolds(state: EditorState): FoldSpan[] {
  function getSelection (line 49) | function getSelection(view: EditorView): SerializedSelection {
  function getScrollPosition (line 60) | function getScrollPosition(view: EditorView): ScrollPosition {
  function setScrollPosition (line 68) | function setScrollPosition(
  function restoreSelection (line 87) | function restoreSelection(
  function restoreFolds (line 116) | function restoreFolds(
  function clearSelection (line 161) | function clearSelection(view: EditorView): void {

FILE: src/cm/indentGuides.ts
  type IndentGuidesConfig (line 16) | interface IndentGuidesConfig {
  constant GUIDE_MARK_CLASS (line 28) | const GUIDE_MARK_CLASS = "cm-indent-guides";
  function getTabSize (line 33) | function getTabSize(state: EditorState): number {
  function getIndentUnitColumns (line 41) | function getIndentUnitColumns(state: EditorState): number {
  function getLineIndentation (line 50) | function getLineIndentation(line: string, tabSize: number): number {
  function isBlankLine (line 67) | function isBlankLine(line: string): boolean {
  function getLeadingWhitespaceLength (line 74) | function getLeadingWhitespaceLength(line: string): number {
  constant SCOPE_NODE_TYPES (line 89) | const SCOPE_NODE_TYPES = new Set([
  type ActiveScope (line 123) | interface ActiveScope {
  function getActiveScope (line 132) | function getActiveScope(
  function getActiveScopeByIndentation (line 193) | function getActiveScopeByIndentation(
  function buildGuideStyle (line 248) | function buildGuideStyle(
  function buildDecorations (line 278) | function buildDecorations(
  function createIndentGuidesPlugin (line 339) | function createIndentGuidesPlugin(
  function indentGuides (line 418) | function indentGuides(config: IndentGuidesConfig = {}): Extension {
  function indentGuidesExtension (line 427) | function indentGuidesExtension(

FILE: src/cm/lsp/api.ts
  type LspRegistrationEntry (line 27) | type LspRegistrationEntry = LspServerManifest | LspServerBundle;
  function isBundleEntry (line 29) | function isBundleEntry(entry: LspRegistrationEntry): entry is LspServerB...
  function register (line 33) | function register(
  function upsert (line 44) | function upsert(
  method get (line 51) | get(id: string): LspServerDefinition | null {
  method list (line 54) | list(): LspServerDefinition[] {
  method listForLanguage (line 57) | listForLanguage(
  method update (line 63) | update(id: string, updater: ServerUpdater): LspServerDefinition | null {
  method unregister (line 66) | unregister(id: string): boolean {
  method onChange (line 69) | onChange(listener: Parameters<typeof onRegistryChange>[0]): () => void {
  method list (line 75) | list(): LspServerBundle[] {
  method getForServer (line 78) | getForServer(id: string): LspServerBundle | null {
  method unregister (line 81) | unregister(id: string): boolean {

FILE: src/cm/lsp/clientManager.ts
  function asArray (line 42) | function asArray<T>(value: T | T[] | null | undefined): T[] {
  function pluginKey (line 47) | function pluginKey(
  function safeString (line 59) | function safeString(value: unknown): string {
  function isVerboseLspLoggingEnabled (line 63) | function isVerboseLspLoggingEnabled(): boolean {
  function logLspInfo (line 69) | function logLspInfo(...args: unknown[]): void {
  function isPlainObject (line 74) | function isPlainObject(value: unknown): value is Record<string, unknown> {
  function resolveInitializationOptions (line 78) | function resolveInitializationOptions(
  type InternalLSPRequest (line 99) | interface InternalLSPRequest<Result> {
  type RequestInnerFn (line 103) | type RequestInnerFn = <Params, Result>(
  function connectClient (line 109) | function connectClient(
  type BuiltinExtensionsResult (line 147) | interface BuiltinExtensionsResult {
  function buildBuiltinExtensions (line 152) | function buildBuiltinExtensions(
  type LSPError (line 195) | interface LSPError extends Error {
  type InitContext (line 199) | interface InitContext {
  type ExtendedLSPClient (line 205) | interface ExtendedLSPClient extends LSPClient {
  class LspClientManager (line 209) | class LspClientManager {
    method constructor (line 215) | constructor(options: ClientManagerOptions = {}) {
    method setOptions (line 221) | setOptions(next: Partial<ClientManagerOptions>): void {
    method getActiveClients (line 225) | getActiveClients(): ClientState[] {
    method getExtensionsForFile (line 229) | async getExtensionsForFile(metadata: FileMetadata): Promise<Extension[...
    method formatDocument (line 318) | async formatDocument(
    method detach (line 382) | detach(uri: string, view: EditorView): void {
    method dispose (line 388) | async dispose(): Promise<void> {
    method #ensureClient (line 445) | async #ensureClient(
    method #initializeClient (line 492) | async #initializeClient(
    method #createClientState (line 814) | #createClientState(params: {
    method #resolveRootUri (line 906) | async #resolveRootUri(
    method #resolveDocumentUri (line 933) | async #resolveDocumentUri(
  type Change (line 973) | interface Change {
  function applyTextEdits (line 979) | function applyTextEdits(
  function buildFormattingOptions (line 1018) | function buildFormattingOptions(
  function resolveIndentWidth (line 1047) | function resolveIndentWidth(unit: string): number {
  function normalizeRootUriForServer (line 1061) | function normalizeRootUriForServer(
  function normalizeDocumentUri (line 1090) | function normalizeDocumentUri(uri: string | null | undefined): string | ...
  function contentUriToFileUri (line 1114) | function contentUriToFileUri(uri: string): string | null {
  function buildFileUri (line 1186) | function buildFileUri(pathname: string): string | null {

FILE: src/cm/lsp/codeActions.ts
  type CodeActionResponse (line 17) | type CodeActionResponse = (CodeAction | Command)[] | null;
  constant CODE_ACTION_KINDS (line 19) | const CODE_ACTION_KINDS = {
  constant CODE_ACTION_ICONS (line 30) | const CODE_ACTION_ICONS: Record<string, string> = {
  function getCodeActionIcon (line 41) | function getCodeActionIcon(kind?: CodeActionKind): string {
  function formatCodeActionKind (line 49) | function formatCodeActionKind(kind?: CodeActionKind): string {
  function isCommand (line 57) | function isCommand(item: CodeAction | Command): item is Command {
  function lspPositionToOffset (line 63) | function lspPositionToOffset(
  function requestCodeActions (line 70) | async function requestCodeActions(
  function resolveCodeAction (line 94) | async function resolveCodeAction(
  function executeCommand (line 124) | async function executeCommand(
  type LspChange (line 147) | interface LspChange {
  function applyChangesToFile (line 152) | async function applyChangesToFile(
  function applyWorkspaceEdit (line 191) | async function applyWorkspaceEdit(
  function applyCodeAction (line 242) | async function applyCodeAction(
  type CodeActionItem (line 270) | interface CodeActionItem {
  function fetchCodeActions (line 280) | async function fetchCodeActions(
  function executeCodeAction (line 334) | async function executeCodeAction(
  function supportsCodeActions (line 357) | function supportsCodeActions(view: EditorView): boolean {
  function showCodeActionsMenu (line 362) | async function showCodeActionsMenu(view: EditorView): Promise<boolean> {
  function performQuickFix (line 401) | async function performQuickFix(view: EditorView): Promise<boolean> {

FILE: src/cm/lsp/diagnostics.ts
  constant LSP_DIAGNOSTICS_EVENT (line 24) | const LSP_DIAGNOSTICS_EVENT = "acode:lsp-diagnostics-updated";
  function isCoarsePointerDevice (line 26) | function isCoarsePointerDevice(): boolean {
  function emitDiagnosticsUpdated (line 43) | function emitDiagnosticsUpdated(): void {
  function clearScheduledDiagnosticsUpdated (line 71) | function clearScheduledDiagnosticsUpdated(): void {
  method create (line 78) | create(): LspDiagnostic[] {
  method update (line 81) | update(value: LspDiagnostic[], tr): LspDiagnostic[] {
  type DiagnosticSeverity (line 91) | type DiagnosticSeverity = "error" | "warning" | "info" | "hint";
  function collectLspDiagnostics (line 100) | function collectLspDiagnostics(
  function storeLspDiagnostics (line 146) | function storeLspDiagnostics(
  function sameDiagnostics (line 152) | function sameDiagnostics(
  function scheduleDiagnosticsUpdated (line 173) | function scheduleDiagnosticsUpdated(): void {
  method constructor (line 185) | constructor() {
  method destroy (line 189) | destroy(): void {
  function mapDiagnostics (line 198) | function mapDiagnostics(
  function lspLinterSource (line 223) | function lspLinterSource(view: EditorView): Diagnostic[] {
  function lspDiagnosticsClientExtension (line 229) | function lspDiagnosticsClientExtension(): {
  function lspDiagnosticsUiExtension (line 281) | function lspDiagnosticsUiExtension(includeGutter = true): Extension[] {
  type DiagnosticsExtension (line 315) | interface DiagnosticsExtension {
  function lspDiagnosticsExtension (line 324) | function lspDiagnosticsExtension(
  function clearDiagnosticsEffect (line 335) | function clearDiagnosticsEffect(): StateEffect<LspDiagnostic[]> {
  function getLspDiagnostics (line 339) | function getLspDiagnostics(state: EditorState | null): LspDiagnostic[] {

FILE: src/cm/lsp/documentSymbols.ts
  type DocumentSymbolParams (line 18) | interface DocumentSymbolParams {
  type ProcessedSymbol (line 22) | interface ProcessedSymbol {
  type FlatSymbol (line 44) | interface FlatSymbol {
  constant SYMBOL_KIND_NAMES (line 57) | const SYMBOL_KIND_NAMES: Record<SymbolKind, string> = {
  constant SYMBOL_KIND_ICONS (line 86) | const SYMBOL_KIND_ICONS: Record<SymbolKind, string> = {
  function getSymbolKindName (line 115) | function getSymbolKindName(kind: SymbolKind): string {
  function getSymbolKindIcon (line 119) | function getSymbolKindIcon(kind: SymbolKind): string {
  function isDocumentSymbol (line 123) | function isDocumentSymbol(
  function processDocumentSymbol (line 129) | function processDocumentSymbol(
  function processSymbolInformation (line 164) | function processSymbolInformation(
  function flattenSymbols (line 189) | function flattenSymbols(
  function fetchDocumentSymbols (line 215) | async function fetchDocumentSymbols(
  function getDocumentSymbolsFlat (line 261) | async function getDocumentSymbolsFlat(
  function navigateToSymbol (line 272) | async function navigateToSymbol(
  function supportsDocumentSymbols (line 310) | function supportsDocumentSymbols(view: EditorView): boolean {
  type DocumentSymbolsResult (line 319) | interface DocumentSymbolsResult {
  function getDocumentSymbols (line 324) | async function getDocumentSymbols(

FILE: src/cm/lsp/formatter.ts
  type Mode (line 9) | interface Mode {
  type EditorManagerWithLsp (line 14) | interface EditorManagerWithLsp {
  function getActiveMetadata (line 20) | function getActiveMetadata(
  function registerLspFormatter (line 33) | function registerLspFormatter(acode: AcodeApi): void {
  function collectFormatterExtensions (line 82) | function collectFormatterExtensions(languages: Set<string>): string[] {

FILE: src/cm/lsp/formattingSupport.ts
  function supportsBuiltinFormatting (line 3) | function supportsBuiltinFormatting(

FILE: src/cm/lsp/inlayHints.ts
  type InlayHintParams (line 30) | interface InlayHintParams {
  type ProcessedHint (line 35) | interface ProcessedHint {
  type InlayHintsConfig (line 43) | interface InlayHintsConfig {
  constant TYPE_HINT (line 52) | const TYPE_HINT = 1;
  constant PARAM_HINT (line 53) | const PARAM_HINT = 2;
  method update (line 63) | update(hints, tr) {
  class HintWidget (line 75) | class HintWidget extends WidgetType {
    method constructor (line 76) | constructor(
    method eq (line 85) | eq(other: HintWidget): boolean {
    method toDOM (line 93) | toDOM(): HTMLSpanElement {
    method ignoreEvent (line 101) | ignoreEvent(): boolean {
  function buildDecos (line 110) | function buildDecos(hints: ProcessedHint[], docLen: number): DecorationS...
  function createPlugin (line 135) | function createPlugin(config: InlayHintsConfig) {
  function inlayHintsClientExtension (line 308) | function inlayHintsClientExtension(): LSPClientExtension {
  function inlayHintsEditorExtension (line 329) | function inlayHintsEditorExtension(
  function inlayHintsExtension (line 336) | function inlayHintsExtension(

FILE: src/cm/lsp/installRuntime.ts
  function getExecutor (line 1) | function getExecutor(): Executor {
  function getBackgroundExecutor (line 9) | function getBackgroundExecutor(): Executor {
  function quoteArg (line 14) | function quoteArg(value: unknown): string {
  function formatCommand (line 21) | function formatCommand(
  function wrapShellCommand (line 33) | function wrapShellCommand(command: string): string {
  function runQuickCommand (line 38) | async function runQuickCommand(command: string): Promise<string> {
  function runForegroundCommand (line 43) | async function runForegroundCommand(command: string): Promise<string> {

FILE: src/cm/lsp/installerUtils.ts
  constant ARCH_ALIASES (line 1) | const ARCH_ALIASES = {
  type NormalizedArch (line 7) | type NormalizedArch = keyof typeof ARCH_ALIASES;
  function normalizeArchitecture (line 9) | function normalizeArchitecture(arch: string | null | undefined): string {
  function getArchitectureMatchers (line 23) | function getArchitectureMatchers(
  function buildShellArchCase (line 49) | function buildShellArchCase(

FILE: src/cm/lsp/providerUtils.ts
  type ManagedServerOptions (line 10) | interface ManagedServerOptions {
  type BundleHooks (line 34) | interface BundleHooks {
  function defineBundle (line 51) | function defineBundle(options: {
  function defineServer (line 66) | function defineServer(options: ManagedServerOptions): LspServerManifest {
  method apk (line 129) | apk(options: {
  method npm (line 143) | npm(options: {
  method pip (line 159) | pip(options: {
  method cargo (line 175) | cargo(options: {
  method manual (line 189) | manual(options: {
  method shell (line 203) | shell(options: {
  method githubRelease (line 221) | githubRelease(options: {

FILE: src/cm/lsp/references.ts
  type Position (line 10) | interface Position {
  type Range (line 15) | interface Range {
  type Location (line 20) | interface Location {
  type ReferenceWithContext (line 25) | interface ReferenceWithContext extends Location {
  type ReferenceParams (line 29) | interface ReferenceParams {
  function fetchLineText (line 35) | async function fetchLineText(uri: string, line: number): Promise<string> {
  function getWordAtCursor (line 91) | function getWordAtCursor(view: EditorView): string {
  function fetchReferences (line 101) | async function fetchReferences(
  function findAllReferences (line 159) | async function findAllReferences(view: EditorView): Promise<boolean> {
  function findAllReferencesInTab (line 185) | async function findAllReferencesInTab(
  function closeReferencesPanel (line 222) | function closeReferencesPanel(): boolean {

FILE: src/cm/lsp/rename.ts
  type RenameParams (line 12) | interface RenameParams {
  type TextDocumentEdit (line 18) | interface TextDocumentEdit {
  type PrepareRenameResponse (line 23) | interface PrepareRenameResponse {
  type LspChange (line 29) | interface LspChange {
  function getRename (line 34) | function getRename(plugin: LSPPlugin, pos: number, newName: string) {
  function getPrepareRename (line 45) | function getPrepareRename(plugin: LSPPlugin, pos: number) {
  function performRename (line 55) | async function performRename(view: EditorView): Promise<boolean> {
  function lspPositionToOffset (line 146) | function lspPositionToOffset(
  function applyChangesToFile (line 154) | async function applyChangesToFile(
  function doRename (line 196) | async function doRename(

FILE: src/cm/lsp/serverCatalog.ts
  function toKey (line 4) | function toKey(id: string | undefined | null): string {
  type RegistryAdapter (line 10) | interface RegistryAdapter {
  function bindServerRegistry (line 25) | function bindServerRegistry(adapter: RegistryAdapter): void {
  function requireRegistry (line 29) | function requireRegistry(): RegistryAdapter {
  function resolveBundleServers (line 36) | function resolveBundleServers(bundle: LspServerBundle): LspServerManifes...
  function registerServerBundle (line 41) | function registerServerBundle(
  function unregisterServerBundle (line 95) | function unregisterServerBundle(id: string): boolean {
  function listServerBundles (line 111) | function listServerBundles(): LspServerBundle[] {
  function getServerBundle (line 115) | function getServerBundle(id: string): LspServerBundle | null {
  function ensureBuiltinBundlesRegistered (line 121) | function ensureBuiltinBundlesRegistered(): void {

FILE: src/cm/lsp/serverLauncher.ts
  constant STATUS_PRESENT (line 32) | const STATUS_PRESENT: InstallStatus = "present";
  constant STATUS_DECLINED (line 33) | const STATUS_DECLINED: InstallStatus = "declined";
  constant STATUS_FAILED (line 34) | const STATUS_FAILED: InstallStatus = "failed";
  constant AXS_BINARY (line 36) | const AXS_BINARY = "$PREFIX/axs";
  function getTerminalRequiredMessage (line 38) | function getTerminalRequiredMessage(): string {
  type LspError (line 45) | interface LspError extends Error {
  function getExecutor (line 49) | function getExecutor(): Executor {
  function getBackgroundExecutor (line 60) | function getBackgroundExecutor(): Executor {
  function joinCommand (line 65) | function joinCommand(command: string, args: string[] = []): string {
  function getTerminalHomeDir (line 83) | async function getTerminalHomeDir(): Promise<string> {
  function getPortFilePath (line 118) | async function getPortFilePath(
  function readPortFromFile (line 132) | async function readPortFromFile(filePath: string): Promise<number | null> {
  function getLspPort (line 164) | async function getLspPort(
  function waitForServerReady (line 187) | async function waitForServerReady(
  function waitForPort (line 209) | async function waitForPort(
  function checkServerAlive (line 246) | async function checkServerAlive(url: string, timeout = 1000): Promise<bo...
  function canReuseExistingServer (line 284) | async function canReuseExistingServer(
  function buildAxsBridgeCommand (line 316) | function buildAxsBridgeCommand(
  function resolveStartCommand (line 359) | function resolveStartCommand(
  function getStartCommand (line 379) | function getStartCommand(server: LspServerDefinition): string | null {
  function getInstallCacheKey (line 383) | function getInstallCacheKey(server: LspServerDefinition): string | null {
  function normalizeInstallSpec (line 390) | function normalizeInstallSpec(server: LspServerDefinition) {
  function getInstallerExecutable (line 466) | function getInstallerExecutable(server: LspServerDefinition): string | n...
  function getProviderExecutable (line 472) | function getProviderExecutable(server: LspServerDefinition): string | nu...
  function resolveServerExecutable (line 483) | function resolveServerExecutable(server: LspServerDefinition): string | ...
  function getInstallLabel (line 493) | function getInstallLabel(server: LspServerDefinition): string {
  function buildUninstallCommand (line 502) | function buildUninstallCommand(server: LspServerDefinition): string | nu...
  function buildInstallCommand (line 543) | function buildInstallCommand(
  function buildDerivedCheckCommand (line 600) | function buildDerivedCheckCommand(server: LspServerDefinition): string |...
  function getUpdateCommand (line 619) | function getUpdateCommand(server: LspServerDefinition): string | null {
  function readServerVersion (line 631) | async function readServerVersion(
  function getInstallCommand (line 649) | function getInstallCommand(
  function getInstallSource (line 659) | function getInstallSource(server: LspServerDefinition): string | null {
  function getUninstallCommand (line 663) | function getUninstallCommand(
  function checkServerInstallation (line 669) | async function checkServerInstallation(
  function resetInstallState (line 723) | function resetInstallState(serverId?: string): void {
  function ensureInstalled (line 737) | async function ensureInstalled(server: LspServerDefinition): Promise<boo...
  type LoaderDialog (line 775) | interface LoaderDialog {
  type InstallActionMode (line 780) | type InstallActionMode = "install" | "update" | "reinstall";
  function installServer (line 782) | async function installServer(
  function uninstallServer (line 854) | async function uninstallServer(
  function performInstallCheck (line 905) | async function performInstallCheck(
  function startInteractiveServer (line 940) | async function startInteractiveServer(
  function sleep (line 966) | function sleep(ms: number): Promise<void> {
  function signalServerReady (line 980) | function signalServerReady(serverId: string): void {
  function waitForWebSocket (line 989) | async function waitForWebSocket(
  type EnsureServerResult (line 1034) | interface EnsureServerResult {
  function ensureServerRunning (line 1040) | async function ensureServerRunning(
  function stopManagedServer (line 1173) | function stopManagedServer(serverId: string): void {
  function resetManagedServers (line 1189) | function resetManagedServers(): void {
  function getManagedServerInfo (line 1203) | function getManagedServerInfo(
  function getAllManagedServers (line 1212) | function getAllManagedServers(): Map<string, ManagedServerEntry> {
  function formatMemory (line 1216) | function formatMemory(bytes: number): string {
  function formatUptime (line 1224) | function formatUptime(seconds: number): string {
  function getServerStats (line 1240) | async function getServerStats(

FILE: src/cm/lsp/serverRegistry.ts
  function toKey (line 22) | function toKey(id: string | undefined | null): string {
  function clone (line 28) | function clone<T>(value: T): T | undefined {
  function sanitizeLanguages (line 37) | function sanitizeLanguages(languages: string[] = []): string[] {
  function parsePort (line 48) | function parsePort(value: unknown): number | null {
  type RawBridgeConfig (line 56) | interface RawBridgeConfig {
  function sanitizeInstallKind (line 64) | function sanitizeInstallKind(
  function sanitizeBridge (line 89) | function sanitizeBridge(
  type RawTransportDescriptor (line 118) | interface RawTransportDescriptor {
  type RawLauncherConfig (line 126) | interface RawLauncherConfig {
  type RawServerDefinition (line 156) | type RawServerDefinition = LspServerManifest;
  function sanitizeDefinition (line 158) | function sanitizeDefinition(
  function notify (line 316) | function notify(event: RegistryEventType, payload: LspServerDefinition):...
  type RegisterServerOptions (line 326) | interface RegisterServerOptions {
  function registerServer (line 330) | function registerServer(
  function unregisterServer (line 347) | function unregisterServer(id: string): boolean {
  type ServerUpdater (line 358) | type ServerUpdater = (
  function updateServer (line 362) | function updateServer(
  function getServer (line 382) | function getServer(id: string): LspServerDefinition | null {
  function listServers (line 386) | function listServers(): LspServerDefinition[] {
  type GetServersOptions (line 390) | interface GetServersOptions {
  function getServersForLanguage (line 394) | function getServersForLanguage(
  function onRegistryChange (line 408) | function onRegistryChange(listener: RegistryEventListener): () => void {

FILE: src/cm/lsp/servers/luau.ts
  function isGlibcRuntimeError (line 17) | function isGlibcRuntimeError(output: string): boolean {
  function getLuauRuntimeFailureMessage (line 30) | function getLuauRuntimeFailureMessage(output: string): string {
  function readLuauRuntimeFailure (line 42) | async function readLuauRuntimeFailure(binaryPath: string): Promise<strin...
  method checkInstallation (line 94) | async checkInstallation(_, manifest): Promise<InstallCheckResult> {
  method installServer (line 136) | async installServer(_, manifest, mode, options = {}): Promise<boolean> {

FILE: src/cm/lsp/servers/shared.ts
  function normalizeServerLanguageKey (line 1) | function normalizeServerLanguageKey(
  function resolveJsTsLanguageId (line 9) | function resolveJsTsLanguageId(

FILE: src/cm/lsp/tooltipExtensions.ts
  type LspClientInternals (line 39) | interface LspClientInternals {
  constant SIGNATURE_TRIGGER_DELAY (line 46) | const SIGNATURE_TRIGGER_DELAY = 120;
  constant SIGNATURE_RETRIGGER_DELAY (line 47) | const SIGNATURE_RETRIGGER_DELAY = 250;
  function fromPosition (line 49) | function fromPosition(
  function escapeHtml (line 57) | function escapeHtml(value: string): string {
  function renderCode (line 74) | function renderCode(plugin: LSPPlugin, code: MarkedString): string {
  function renderTooltipContent (line 110) | function renderTooltipContent(
  function isPointerOrTouchSelection (line 128) | function isPointerOrTouchSelection(update: ViewUpdate): boolean {
  function closeHoverIfNeeded (line 141) | function closeHoverIfNeeded(view: EditorView): void {
  function hoverRequest (line 147) | function hoverRequest(plugin: LSPPlugin, pos: number) {
  function lspTooltipSource (line 163) | function lspTooltipSource(
  method constructor (line 191) | constructor(readonly view: EditorView) {}
  method pointerdown (line 195) | pointerdown() {
  method touchstart (line 198) | touchstart() {
  method wheel (line 201) | wheel() {
  method scroll (line 204) | scroll() {
  function getSignatureHelp (line 211) | function getSignatureHelp(
  function sameSignatures (line 232) | function sameSignatures(a: LspSignatureHelp, b: LspSignatureHelp): boole...
  function sameActiveParam (line 239) | function sameActiveParam(
  class SignatureState (line 254) | class SignatureState {
    method constructor (line 255) | constructor(
  function signatureTooltip (line 268) | function signatureTooltip(
  method create (line 281) | create() {
  method update (line 284) | update(value, tr) {
  function drawSignatureTooltip (line 315) | function drawSignatureTooltip(
  method constructor (line 384) | constructor(readonly view: EditorView) {}
  method update (line 386) | update(update: ViewUpdate) {
  method scheduleRequest (line 453) | scheduleRequest(
  method startRequest (line 467) | startRequest(plugin: LSPPlugin, context: SignatureHelpContext) {
  method close (line 510) | close() {
  method destroy (line 524) | destroy() {
  method pointerdown (line 530) | pointerdown() {
  method touchstart (line 533) | touchstart() {
  method wheel (line 536) | wheel() {
  method scroll (line 539) | scroll() {
  function hoverTooltips (line 605) | function hoverTooltips(config: { hoverTime?: number } = {}): Extension {
  function signatureHelp (line 615) | function signatureHelp(config: { keymap?: boolean } = {}): Extension {

FILE: src/cm/lsp/transport.ts
  constant DEFAULT_TIMEOUT (line 14) | const DEFAULT_TIMEOUT = 5000;
  constant RECONNECT_BASE_DELAY (line 15) | const RECONNECT_BASE_DELAY = 500;
  constant RECONNECT_MAX_DELAY (line 16) | const RECONNECT_MAX_DELAY = 10000;
  constant RECONNECT_MAX_ATTEMPTS (line 17) | const RECONNECT_MAX_ATTEMPTS = 5;
  type MessageListener (line 19) | type MessageListener = (data: string) => void;
  type TransportInterface (line 21) | interface TransportInterface extends Transport {
  function createWebSocketTransport (line 27) | function createWebSocketTransport(
  function createStdioTransport (line 338) | function createStdioTransport(
  function createTransport (line 363) | function createTransport(

FILE: src/cm/lsp/types.ts
  type WorkspaceFileUpdate (line 34) | interface WorkspaceFileUpdate {
  type TransportKind (line 44) | type TransportKind = "websocket" | "stdio" | "external";
  type MaybePromise (line 45) | type MaybePromise<T> = T | Promise<T>;
  type WebSocketTransportOptions (line 47) | interface WebSocketTransportOptions {
  type TransportDescriptor (line 54) | interface TransportDescriptor {
  type TransportHandle (line 67) | interface TransportHandle {
  type TransportContext (line 73) | interface TransportContext {
  type BridgeConfig (line 89) | interface BridgeConfig {
  type InstallerKind (line 99) | type InstallerKind =
  type LauncherInstallConfig (line 108) | interface LauncherInstallConfig {
  type LauncherConfig (line 129) | interface LauncherConfig {
  type BuiltinExtensionsConfig (line 141) | interface BuiltinExtensionsConfig {
  type AcodeClientConfig (line 151) | interface AcodeClientConfig {
  type LanguageResolverContext (line 164) | interface LanguageResolverContext {
  type DocumentUriContext (line 171) | interface DocumentUriContext extends RootUriContext {
  type LspServerManifest (line 175) | interface LspServerManifest {
  type LspServerBundle (line 202) | interface LspServerBundle {
  type LspServerProvider (line 227) | type LspServerProvider = LspServerBundle;
  type LspServerDefinition (line 229) | interface LspServerDefinition {
  type RootUriContext (line 260) | interface RootUriContext {
  type RegistryEventType (line 268) | type RegistryEventType = "register" | "unregister" | "update";
  type RegistryEventListener (line 270) | type RegistryEventListener = (
  type FileMetadata (line 279) | interface FileMetadata {
  type FormattingOptions (line 288) | interface FormattingOptions {
  type ClientManagerOptions (line 294) | interface ClientManagerOptions {
  type ClientIdleInfo (line 304) | interface ClientIdleInfo {
  type ClientState (line 310) | interface ClientState {
  type NormalizedRootUri (line 320) | interface NormalizedRootUri {
  type ManagedServerEntry (line 329) | interface ManagedServerEntry {
  type InstallStatus (line 337) | type InstallStatus = "present" | "declined" | "failed";
  type InstallCheckResult (line 339) | interface InstallCheckResult {
  type PortInfo (line 350) | interface PortInfo {
  type WaitOptions (line 359) | interface WaitOptions {
  type EnsureServerResult (line 368) | interface EnsureServerResult {
  type LspServerStats (line 377) | interface LspServerStats {
  type LspServerStatsFormatted (line 389) | interface LspServerStatsFormatted {
  type WorkspaceOptions (line 402) | interface WorkspaceOptions {
  type LspDiagnostic (line 412) | interface LspDiagnostic {
  type DiagnosticRelatedInformation (line 423) | interface DiagnosticRelatedInformation {
  type PublishDiagnosticsParams (line 434) | interface PublishDiagnosticsParams {
  type RawDiagnostic (line 440) | interface RawDiagnostic {
  type RawDiagnosticRelatedInformation (line 451) | interface RawDiagnosticRelatedInformation {
  type AcodeApi (line 463) | interface AcodeApi {
  type ParsedUri (line 475) | interface ParsedUri {
  type LSPPluginAPI (line 484) | interface LSPPluginAPI {
  type WorkspaceFileWithView (line 510) | interface WorkspaceFileWithView {
  type WorkspaceWithFileAccess (line 518) | interface WorkspaceWithFileAccess {
  type LSPClientWithWorkspace (line 525) | interface LSPClientWithWorkspace {
  type LSPClient (line 531) | interface LSPClient {

FILE: src/cm/lsp/workspace.ts
  class AcodeWorkspaceFile (line 8) | class AcodeWorkspaceFile implements WorkspaceFile {
    method constructor (line 15) | constructor(
    method getView (line 30) | getView(preferred?: EditorView): EditorView | null {
  class AcodeWorkspace (line 38) | class AcodeWorkspace extends Workspace {
    method constructor (line 46) | constructor(
    method #getOrCreateFile (line 58) | #getOrCreateFile(
    method #getFileEntry (line 86) | #getFileEntry(uri: string): AcodeWorkspaceFile | null {
    method #removeFileEntry (line 90) | #removeFileEntry(file: AcodeWorkspaceFile): void {
    method #nextFileVersion (line 95) | #nextFileVersion(uri: string): number {
    method #resolveLanguageIdForUri (line 102) | #resolveLanguageIdForUri(uri: string): string {
    method syncFiles (line 121) | syncFiles(): readonly WorkspaceFileUpdate[] {
    method openFile (line 139) | openFile(uri: string, languageId: string, view: EditorView): void {
    method closeFile (line 144) | closeFile(uri: string, view?: EditorView): void {
    method getFile (line 158) | getFile(uri: string): AcodeWorkspaceFile | null {
    method requestFile (line 162) | requestFile(uri: string): Promise<AcodeWorkspaceFile | null> {
    method connected (line 166) | connected(): void {
    method updateFile (line 172) | updateFile(uri: string, update: TransactionSpec): void {
    method #applyUpdateToClosedFile (line 189) | async #applyUpdateToClosedFile(
    method displayFile (line 209) | async displayFile(uri: string): Promise<EditorView | null> {
    method #getFolderName (line 224) | #getFolderName(uri: string): string {
    method #sendNotification (line 229) | #sendNotification(method: string, params: unknown): void {
    method hasWorkspaceFolder (line 250) | hasWorkspaceFolder(uri: string): boolean {
    method getWorkspaceFolders (line 254) | getWorkspaceFolders(): string[] {
    method addWorkspaceFolder (line 258) | addWorkspaceFolder(uri: string): boolean {
    method removeWorkspaceFolder (line 274) | removeWorkspaceFolder(uri: string): boolean {

FILE: src/cm/mainEditorExtensions.ts
  type MainEditorExtensionOptions (line 4) | interface MainEditorExtensionOptions {
  function pushExtension (line 17) | function pushExtension(target: Extension[], extension?: Extension): void {
  function createMainEditorExtensions (line 27) | function createMainEditorExtensions(

FILE: src/cm/modelist.ts
  type LanguageExtensionProvider (line 3) | type LanguageExtensionProvider = () => Extension | Promise<Extension>;
  type AddModeOptions (line 5) | interface AddModeOptions {
  type ModesByName (line 10) | interface ModesByName {
  function normalizeModeKey (line 17) | function normalizeModeKey(value: string): string {
  function normalizeAliases (line 23) | function normalizeAliases(aliases: string[] = [], name: string): string[] {
  function escapeRegExp (line 33) | function escapeRegExp(value: string): string {
  function initModes (line 40) | function initModes(): void {
  function addMode (line 48) | function addMode(
  function removeMode (line 75) | function removeMode(name: string): void {
  function getModeForPath (line 98) | function getModeForPath(path: string): Mode {
  function getModeSpecificityScore (line 122) | function getModeSpecificityScore(modeInstance: Mode): number {
  function getModesByName (line 156) | function getModesByName(): ModesByName {
  function getModes (line 163) | function getModes(): Mode[] {
  function getMode (line 167) | function getMode(name: string): Mode | null {
  class Mode (line 171) | class Mode {
    method constructor (line 181) | constructor(
    method supportsFile (line 236) | supportsFile(filename: string): boolean {
    method getExtension (line 248) | getExtension(): LanguageExtensionProvider | null {
    method isAvailable (line 255) | isAvailable(): boolean {

FILE: src/cm/modes/luau/index.ts
  type Tokenizer (line 8) | type Tokenizer = (stream: StringStream, state: LuauState) => string | null;
  type LuauState (line 10) | interface LuauState {
  function pushTokenizer (line 176) | function pushTokenizer(state: LuauState, tokenizer: Tokenizer) {
  function popTokenizer (line 181) | function popTokenizer(state: LuauState) {
  function enterTypeContext (line 185) | function enterTypeContext(state: LuauState, depth = 0) {
  function exitTypeContext (line 190) | function exitTypeContext(state: LuauState) {
  function isWordStart (line 197) | function isWordStart(char: string) {
  function isWord (line 201) | function isWord(char: string) {
  function isUpperConstant (line 205) | function isUpperConstant(word: string) {
  function isStandardWord (line 209) | function isStandardWord(word: string) {
  function looksLikeMethodSeparator (line 217) | function looksLikeMethodSeparator(stream: StringStream) {
  function readLongBracket (line 223) | function readLongBracket(stream: StringStream) {
  function bracketed (line 229) | function bracketed(level: number, style: string): Tokenizer {
  function quotedString (line 251) | function quotedString(quote: string): Tokenizer {
  function readNumber (line 371) | function readNumber(stream: StringStream, firstChar: string) {
  function classifyIdentifier (line 394) | function classifyIdentifier(word: string, state: LuauState) {
  method startState (line 743) | startState() {
  method copyState (line 764) | copyState(state) {
  method token (line 770) | token(stream, state) {
  method indent (line 784) | indent(state, textAfter, context: IndentContext) {
  function luau (line 797) | function luau() {

FILE: src/cm/rainbowBrackets.ts
  constant DEFAULT_DARK_COLORS (line 7) | const DEFAULT_DARK_COLORS = [
  constant DEFAULT_LIGHT_COLORS (line 16) | const DEFAULT_LIGHT_COLORS = [
  constant BLOCK_SIZE (line 25) | const BLOCK_SIZE = 2048;
  constant MAX_BLOCK_CACHE_ENTRIES (line 26) | const MAX_BLOCK_CACHE_ENTRIES = 192;
  constant CONTEXT_SIGNATURE_DEPTH (line 27) | const CONTEXT_SIGNATURE_DEPTH = 4;
  constant MIN_LOOK_BEHIND (line 28) | const MIN_LOOK_BEHIND = 4000;
  constant MAX_LOOK_BEHIND (line 29) | const MAX_LOOK_BEHIND = 24000;
  constant DEFAULT_EXACT_SCAN_LIMIT (line 30) | const DEFAULT_EXACT_SCAN_LIMIT = 24000;
  constant SKIP_CONTEXTS (line 32) | const SKIP_CONTEXTS = new Set([
  constant CLOSING_TO_OPENING (line 41) | const CLOSING_TO_OPENING = {
  type ClosingBracket (line 47) | type ClosingBracket = keyof typeof CLOSING_TO_OPENING;
  type RainbowBracketThemeConfig (line 49) | interface RainbowBracketThemeConfig {
  type RainbowBracketsOptions (line 62) | interface RainbowBracketsOptions {
  type BracketInfo (line 68) | interface BracketInfo {
  type BracketToken (line 73) | interface BracketToken {
  type BlockCacheEntry (line 78) | interface BlockCacheEntry {
  function normalizeHexColor (line 83) | function normalizeHexColor(value: unknown): string | null {
  function alignToBlockStart (line 90) | function alignToBlockStart(pos: number): number {
  function clampLookBehind (line 94) | function clampLookBehind(value: number | undefined): number {
  function getScanStart (line 102) | function getScanStart(
  function isBracketCode (line 130) | function isBracketCode(code: number): boolean {
  function isOpeningBracket (line 141) | function isOpeningBracket(char: string): boolean {
  function getSkipContextEnd (line 145) | function getSkipContextEnd(
  function getContextChainSignature (line 159) | function getContextChainSignature(
  function getBlockContextSignature (line 177) | function getBlockContextSignature(
  function getBlockCacheKey (line 187) | function getBlockCacheKey(
  function tokenizeBlock (line 195) | function tokenizeBlock(
  function isVisiblePosition (line 234) | function isVisiblePosition(
  function buildTheme (line 247) | function buildTheme(colors: readonly string[]) {
  function getRainbowBracketColors (line 259) | function getRainbowBracketColors(
  function rainbowBrackets (line 299) | function rainbowBrackets(options: RainbowBracketsOptions = {}) {

FILE: src/cm/supportedModes.ts
  type FilenameMatcher (line 5) | type FilenameMatcher = string | RegExp;
  type LanguageDescription (line 7) | interface LanguageDescription {
  function normalizeModeKey (line 16) | function normalizeModeKey(value: string): string {
  function isSafeModeId (line 22) | function isSafeModeId(value: string): boolean {
  function slugifyModeId (line 26) | function slugifyModeId(value: string): string {
  function collectAliases (line 35) | function collectAliases(
  function getModeId (line 46) | function getModeId(name: string, aliases: string[]): string {
  function escapeRegExp (line 56) | function escapeRegExp(value: string): string {

FILE: src/cm/themes/aura.js
  function aura (line 146) | function aura() {

FILE: src/cm/themes/dracula.js
  function dracula (line 143) | function dracula() {

FILE: src/cm/themes/githubDark.js
  function githubDark (line 143) | function githubDark() {

FILE: src/cm/themes/githubLight.js
  function githubLight (line 143) | function githubLight() {

FILE: src/cm/themes/index.js
  function normalizeExtensions (line 42) | function normalizeExtensions(value, target = []) {
  function toExtensionGetter (line 55) | function toExtensionGetter(getExtension) {
  function logInvalidThemeOnce (line 63) | function logInvalidThemeOnce(themeId, error, reason = "") {
  function validateThemeExtensions (line 72) | function validateThemeExtensions(themeId, extensions) {
  function resolveThemeEntryExtensions (line 88) | function resolveThemeEntryExtensions(theme, fallbackExtensions) {
  function addTheme (line 107) | function addTheme(id, caption, isDark, getExtension, config = null) {
  function getThemes (line 129) | function getThemes() {
  function getThemeById (line 133) | function getThemeById(id) {
  function getThemeConfig (line 138) | function getThemeConfig(id) {
  function getThemeExtensions (line 144) | function getThemeExtensions(id, fallback = [oneDark]) {
  function removeTheme (line 151) | function removeTheme(id) {

FILE: src/cm/themes/monokai.js
  function monokai (line 151) | function monokai() {

FILE: src/cm/themes/noctisLilac.js
  function noctisLilac (line 134) | function noctisLilac() {

FILE: src/cm/themes/solarizedDark.js
  function solarizedDark (line 143) | function solarizedDark() {

FILE: src/cm/themes/solarizedLight.js
  function solarizedLight (line 143) | function solarizedLight() {

FILE: src/cm/themes/tokyoNight.js
  function tokyoNight (line 143) | function tokyoNight() {

FILE: src/cm/themes/tokyoNightDay.js
  function tokyoNightDay (line 143) | function tokyoNightDay() {

FILE: src/cm/themes/tomorrowNight.js
  function tomorrowNight (line 151) | function tomorrowNight() {

FILE: src/cm/themes/tomorrowNightBright.js
  function tomorrowNightBright (line 151) | function tomorrowNightBright() {

FILE: src/cm/themes/vscodeDark.js
  function vscodeDark (line 185) | function vscodeDark() {

FILE: src/cm/touchSelectionMenu.js
  constant TAP_MAX_DELAY (line 4) | const TAP_MAX_DELAY = 500;
  constant TAP_MAX_DISTANCE (line 5) | const TAP_MAX_DISTANCE = 20;
  constant EDGE_SCROLL_GAP (line 6) | const EDGE_SCROLL_GAP = 40;
  constant MENU_MARGIN (line 7) | const MENU_MARGIN = 10;
  constant MENU_SHOW_DELAY (line 8) | const MENU_SHOW_DELAY = 120;
  constant MENU_CARET_GAP (line 9) | const MENU_CARET_GAP = 10;
  constant MENU_SELECTION_GAP (line 10) | const MENU_SELECTION_GAP = 12;
  constant MENU_HANDLE_CLEARANCE (line 11) | const MENU_HANDLE_CLEARANCE = 28;
  constant TAP_MAX_COLUMN_DELTA (line 12) | const TAP_MAX_COLUMN_DELTA = 2;
  constant TAP_MAX_POS_DELTA (line 13) | const TAP_MAX_POS_DELTA = 2;
  function classifyTap (line 21) | function classifyTap(previousTap, tap) {
  function clampMenuPosition (line 60) | function clampMenuPosition(menuRect, containerRect) {
  function filterSelectionMenuItems (line 81) | function filterSelectionMenuItems(items, options) {
  function getEdgeScrollDirections (line 102) | function getEdgeScrollDirections(options) {
  function clamp (line 118) | function clamp(value, min, max) {
  function createTouchSelectionMenu (line 122) | function createTouchSelectionMenu(view, options = {}) {
  class TouchSelectionMenuController (line 126) | class TouchSelectionMenuController {
    method constructor (line 142) | constructor(view, options = {}) {
    method #bindEvents (line 154) | #bindEvents() {
    method destroy (line 162) | destroy() {
    method setEnabled (line 184) | setEnabled(enabled) {
    method setSelection (line 198) | setSelection(value) {
    method setMenu (line 209) | setMenu(value) {
    method isMenuVisible (line 220) | isMenuVisible() {
    method onScrollStart (line 224) | onScrollStart() {
    method onScrollEnd (line 232) | onScrollEnd() {
    method onStateChanged (line 238) | onStateChanged(meta = {}) {
    method onSessionChanged (line 257) | onSessionChanged() {
    method #captureShiftSelection (line 316) | #captureShiftSelection(event) {
    method #commitShiftSelection (line 330) | #commitShiftSelection(event) {
    method #canExtendSelection (line 364) | #canExtendSelection(event) {
    method consumePendingShiftSelectionClick (line 371) | consumePendingShiftSelectionClick(event) {
    method #shouldShowMenu (line 389) | #shouldShowMenu() {
    method #scheduleMenuShow (line 395) | #scheduleMenuShow(delay = 0) {
    method #safeCoordsAtPos (line 416) | #safeCoordsAtPos(view, pos) {
    method #getMenuAnchor (line 424) | #getMenuAnchor(selection = this.#hasSelection()) {
    method #showMenu (line 450) | #showMenu(anchor) {
    method #showMenuDeferred (line 536) | #showMenuDeferred() {
    method #hideMenu (line 555) | #hideMenu(force = false) {
    method #clearMenuShowTimer (line 563) | #clearMenuShowTimer() {
    method #isReadOnly (line 568) | #isReadOnly() {
    method #isIgnoredPointerTarget (line 576) | #isIgnoredPointerTarget(target) {
    method #hasSelection (line 599) | #hasSelection() {

FILE: src/components/WebComponents/wcPage.js
  class WCPage (line 3) | class WCPage extends HTMLElement {
    method constructor (line 20) | constructor() {
    method appendBody (line 63) | appendBody(...$els) {
    method appendOuter (line 71) | appendOuter(...$els) {
    method attributeChangedCallback (line 75) | attributeChangedCallback(name, oldValue, newValue) {
    method connectedCallback (line 81) | connectedCallback() {
    method disconnectedCallback (line 87) | disconnectedCallback() {
    method on (line 97) | on(event, cb) {
    method off (line 108) | off(event, cb) {
    method settitle (line 118) | settitle(title) {
    method hide (line 122) | hide() {
    method body (line 131) | get body() {
    method body (line 135) | set body($el) {
    method innerHTML (line 147) | get innerHTML() {
    method innerHTML (line 151) | set innerHTML(html) {
    method textContent (line 155) | get textContent() {
    method textContent (line 159) | set textContent(text) {
    method lead (line 163) | get lead() {
    method lead (line 167) | set lead($el) {
    method header (line 172) | get header() {
    method header (line 176) | set header($el) {
    method initializeIfNotAlreadyInitialized (line 181) | initializeIfNotAlreadyInitialized() {
    method #addHeaderOrAssignHeader (line 187) | #addHeaderOrAssignHeader() {
  class PageHandler (line 200) | class PageHandler {
    method constructor (line 210) | constructor($el) {
    method replaceEl (line 226) | replaceEl() {
    method restoreEl (line 237) | restoreEl() {
    method onhide (line 245) | onhide() {
    method onshow (line 250) | onshow() {
    method remove (line 255) | remove() {
  function handlePagesForSmoothExperience (line 263) | function handlePagesForSmoothExperience() {
  function handlePagesForSmoothExperienceBack (line 270) | function handlePagesForSmoothExperienceBack() {

FILE: src/components/audioPlayer/index.js
  class AudioPlayer (line 4) | class AudioPlayer {
    method constructor (line 5) | constructor(container) {
    method initializeUI (line 24) | initializeUI() {
    method initializeEvents (line 64) | initializeEvents() {
    method togglePlay (line 84) | togglePlay() {
    method seek (line 97) | seek(e) {
    method updateProgress (line 105) | updateProgress() {
    method formatTime (line 114) | formatTime(seconds) {
    method toggleMute (line 120) | toggleMute() {
    method audioEnded (line 131) | audioEnded() {
    method loadTrack (line 137) | loadTrack(src) {
    method cleanup (line 142) | cleanup() {

FILE: src/components/checkbox/index.js
  function Checkbox (line 26) | function Checkbox(text, checked, name, id, type, ref, size) {

FILE: src/components/collapsableList.js
  function collapsableList (line 31) | function collapsableList(

FILE: src/components/contextmenu/index.js
  function Contextmenu (line 34) | function Contextmenu(content, options) {

FILE: src/components/fileTree/index.js
  constant VIRTUALIZATION_THRESHOLD (line 8) | const VIRTUALIZATION_THRESHOLD = Number.POSITIVE_INFINITY;
  constant ITEM_HEIGHT (line 9) | const ITEM_HEIGHT = 30;
  class FileTree (line 23) | class FileTree {
    method constructor (line 28) | constructor(container, options = {}) {
    method load (line 44) | async load(url) {
    method renderWithFragment (line 71) | renderWithFragment() {
    method renderVirtualized (line 85) | renderVirtualized() {
    method createEntryElement (line 104) | createEntryElement(entry, recycledEl) {
    method createFolderElement (line 121) | createFolderElement(name, url, recycledEl) {
    method createFileElement (line 261) | createFileElement(name, url, recycledEl) {
    method clear (line 300) | clear() {
    method destroy (line 315) | destroy() {
    method findElement (line 325) | findElement(url) {
    method refresh (line 332) | async refresh() {
    method destroyChildTrees (line 341) | destroyChildTrees() {
    method appendEntry (line 354) | appendEntry(name, url, isDirectory) {
    method removeEntry (line 392) | removeEntry(url) {

FILE: src/components/inputhints/index.js
  function inputhints (line 32) | function inputhints($input, hints, onSelect) {
  function Hint (line 352) | function Hint({ hint }) {
  function Ul (line 382) | function Ul({ hints = [] }) {
  function escapeRegExp (line 392) | function escapeRegExp(value) {

FILE: src/components/logo/index.js
  function Logo (line 3) | function Logo() {

FILE: src/components/lspInfoDialog/index.js
  constant MAX_LOGS (line 12) | const MAX_LOGS = 200;
  constant IGNORED_LOG_PATTERNS (line 14) | const IGNORED_LOG_PATTERNS = [
  function shouldIgnoreLog (line 21) | function shouldIgnoreLog(message) {
  function addLspLog (line 26) | function addLspLog(serverId, level, message, details = null) {
  function getLspLogs (line 48) | function getLspLogs(serverId) {
  function clearLspLogs (line 52) | function clearLspLogs(serverId) {
  function stripAnsi (line 60) | function stripAnsi(str) {
  function extractServerId (line 65) | function extractServerId(message) {
  function extractLogMessage (line 81) | function extractLogMessage(message) {
  function getActiveClients (line 141) | function getActiveClients() {
  function getCurrentFileLanguage (line 149) | function getCurrentFileLanguage() {
  function getServersForCurrentFile (line 159) | function getServersForCurrentFile() {
  function getServerStatus (line 170) | function getServerStatus(serverId) {
  function getClientState (line 181) | function getClientState(serverId) {
  function getStatusColor (line 186) | function getStatusColor(status) {
  function copyLogsToClipboard (line 197) | function copyLogsToClipboard(serverId, serverLabel) {
  function restartServer (line 235) | async function restartServer(serverId) {
  function stopServer (line 258) | async function stopServer(serverId) {
  function startAllServers (line 279) | async function startAllServers() {
  function restartAllServers (line 289) | async function restartAllServers() {
  function stopAllServers (line 308) | async function stopAllServers() {
  function showLspInfoDialog (line 325) | function showLspInfoDialog() {
  function hasConnectedServers (line 702) | function hasConnectedServers() {

FILE: src/components/lspStatusBar/index.js
  function ensureStatusBar (line 41) | function ensureStatusBar() {
  function buildAggregatedStatus (line 84) | function buildAggregatedStatus() {
  function updateStatusBarDisplay (line 130) | function updateStatusBarDisplay() {
  function hideStatusBar (line 169) | function hideStatusBar() {
  function showLspStatus (line 191) | function showLspStatus(options) {
  function hideStatus (line 274) | function hideStatus(id) {
  function hideLspStatus (line 292) | function hideLspStatus() {
  function updateLspStatus (line 302) | function updateLspStatus(options) {
  function isLspStatusVisible (line 324) | function isLspStatusVisible() {
  function getActiveStatusCount (line 332) | function getActiveStatusCount() {
  function hasStatus (line 341) | function hasStatus(id) {

FILE: src/components/page.js
  function Page (line 11) | function Page(title, options = {}) {

FILE: src/components/palette/index.js
  function palette (line 53) | function palette(getList, onsSelectCb, placeholder, onremove) {

FILE: src/components/quickTools/footer.js
  function RowItem (line 107) | function RowItem({ id, icon, letters, action, value, ref, repeat }) {
  function Extras (line 134) | function Extras({ extras }) {

FILE: src/components/quickTools/index.js
  method $footer (line 28) | get $footer() {
  method $row1 (line 31) | get $row1() {
  method $row2 (line 41) | get $row2() {
  method $searchRow1 (line 51) | get $searchRow1() {
  method $searchRow2 (line 56) | get $searchRow2() {
  method $input (line 67) | get $input() {
  method $toggler (line 70) | get $toggler() {
  method $searchInput (line 73) | get $searchInput() {
  method $replaceInput (line 76) | get $replaceInput() {
  method $searchPos (line 79) | get $searchPos() {
  method $searchTotal (line 82) | get $searchTotal() {

FILE: src/components/quickTools/items.js
  function description (line 56) | function description(id) {
  function item (line 69) | function item(id, icon, action, value, letters, repeat) {

FILE: src/components/referencesPanel/index.js
  function createReferencesPanel (line 15) | function createReferencesPanel() {
  function getPanel (line 311) | function getPanel() {
  function showReferencesPanel (line 318) | function showReferencesPanel(options) {
  function hideReferencesPanel (line 324) | function hideReferencesPanel() {

FILE: src/components/referencesPanel/referencesTab.js
  function createReferencesTab (line 11) | function createReferencesTab(options = {}) {
  function openReferencesTab (line 113) | async function openReferencesTab(options = {}) {

FILE: src/components/referencesPanel/utils.js
  function getFilename (line 14) | function getFilename(uri) {
  function escapeRegExp (line 26) | function escapeRegExp(string) {
  function groupReferencesByFile (line 30) | function groupReferencesByFile(references) {
  function buildFlatList (line 41) | async function buildFlatList(references, symbolName) {
  function createReferenceItem (line 76) | function createReferenceItem(item, options = {}) {
  function navigateToReference (line 110) | async function navigateToReference(ref) {
  function getReferencesStats (line 137) | function getReferencesStats(references) {

FILE: src/components/scrollbar/index.js
  function ScrollBar (line 29) | function ScrollBar(options) {

FILE: src/components/searchbar/index.js
  function searchBar (line 12) | function searchBar($list, setHide, onhideCb, searchFunction) {

FILE: src/components/settingsPage.js
  function settingsPage (line 46) | function settingsPage(
  function listItems (line 194) | function listItems($list, items, callback, options = {}) {
  function normalizeSettings (line 247) | function normalizeSettings(settings) {
  function shouldEnableSearch (line 265) | function shouldEnableSearch(type, settingsCount) {
  function restoreAllSettingsPages (line 269) | function restoreAllSettingsPages() {
  function createSearchHandler (line 275) | function createSearchHandler(type, searchItems) {
  function createNote (line 292) | function createNote(note) {
  function createListItemElement (line 304) | function createListItemElement(item, options, useInfoAsDescription) {
  function isBooleanSetting (line 371) | function isBooleanSetting(item) {
  function getItemDisplayState (line 375) | function getItemDisplayState(item, useInfoAsDescription) {
  function createSubtitleElement (line 392) | function createSubtitleElement(item, state) {
  function shouldShowTrailingValue (line 407) | function shouldShowTrailingValue(item, options) {
  function createTrailingValueDisplay (line 416) | function createTrailingValueDisplay(item) {
  function shouldShowTailChevron (line 434) | function shouldShowTailChevron(item) {
  function insertRenderedItem (line 442) | function insertRenderedItem(renderedItems, item, $item) {
  function buildListContent (line 451) | function buildListContent(renderedItems, options) {
  function createSectionElements (line 481) | function createSectionElements(category) {
  function resolveItemInteraction (line 498) | async function resolveItemInteraction(item, $target) {
  function updateItemValueDisplay (line 588) | function updateItemValueDisplay($target, item, options, useInfoAsDescrip...
  function syncTrailingValueDisplay (line 598) | function syncTrailingValueDisplay($target, item, options) {
  function syncInlineValueDisplay (line 639) | function syncInlineValueDisplay($target, item, useInfoAsDescription) {
  function getSubtitleText (line 668) | function getSubtitleText(item, useInfoAsDescription) {
  function setColor (line 682) | function setColor($setting, color) {
  function setValueText (line 697) | function setValueText($valueText, value, valueText) {

FILE: src/components/sideButton/index.js
  function SideButtons (line 6) | function SideButtons({

FILE: src/components/sidebar/index.js
  function create (line 31) | function create($container, $toggler) {
  function Sidebar (line 509) | function Sidebar({ container, toggler }) {
  method get (line 538) | get() {
  function testScrollable (line 552) | function testScrollable(container) {
  function preventSlide (line 580) | function preventSlide(test) {

FILE: src/components/symbolsPanel/index.js
  constant SYMBOL_KIND_ABBREV (line 7) | const SYMBOL_KIND_ABBREV = {
  function sanitize (line 36) | function sanitize(str) {
  function flattenSymbolsForDisplay (line 45) | function flattenSymbolsForDisplay(symbols, depth = 0) {
  function createSymbolsPanel (line 60) | function createSymbolsPanel() {
  function getPanel (line 437) | function getPanel() {
  function showSymbolsPanel (line 444) | function showSymbolsPanel(options) {
  function hideSymbolsPanel (line 450) | function hideSymbolsPanel() {
  function showDocumentSymbols (line 455) | async function showDocumentSymbols(view) {

FILE: src/components/tabView.js
  function TabView (line 9) | function TabView({ id, disableSwipe = false }, children) {

FILE: src/components/terminal/ligatures.js
  class LigaturesAddon (line 2) | class LigaturesAddon {
    method constructor (line 3) | constructor(options = {}) {
    method activate (line 67) | activate(terminal) {
    method dispose (line 75) | dispose() {
    method _joinCharacters (line 85) | _joinCharacters(text) {
    method _findLigatureRanges (line 89) | _findLigatureRanges(text, ligatures) {

FILE: src/components/terminal/terminal.js
  class TerminalComponent (line 27) | class TerminalComponent {
    method constructor (line 28) | constructor(options = {}) {
    method init (line 73) | init() {
    method setupEventHandlers (line 112) | setupEventHandlers() {
    method setupOscHandler (line 137) | setupOscHandler() {
    method handleOscOpen (line 175) | handleOscOpen(type, path) {
    method setupResizeHandling (line 185) | setupResizeHandling() {
    method preserveViewportPosition (line 296) | preserveViewportPosition(targetScrollPosition) {
    method setupTouchSelection (line 317) | setupTouchSelection() {
    method parseAppKeybindings (line 342) | parseAppKeybindings() {
    method setupCopyPasteHandlers (line 400) | setupCopyPasteHandlers() {
    method copySelection (line 481) | copySelection() {
    method pasteFromClipboard (line 492) | pasteFromClipboard() {
    method createContainer (line 504) | createContainer() {
    method mount (line 523) | mount(container) {
    method createSession (line 588) | async createSession() {
    method connectToSession (line 658) | async connectToSession(pid) {
    method resizeTerminal (line 771) | async resizeTerminal(cols, rows) {
    method fit (line 793) | fit() {
    method write (line 803) | write(data) {
    method writeln (line 822) | writeln(data) {
    method clear (line 829) | clear() {
    method focus (line 836) | focus() {
    method blur (line 843) | blur() {
    method search (line 853) | search(term, skip, backward) {
    method updateTheme (line 881) | updateTheme(theme) {
    method updateOptions (line 893) | updateOptions(options) {
    method loadImageAddon (line 907) | loadImageAddon() {
    method disposeImageAddon (line 921) | disposeImageAddon() {
    method updateImageSupport (line 936) | updateImageSupport(enabled) {
    method loadLigaturesAddon (line 947) | loadLigaturesAddon() {
    method disposeLigaturesAddon (line 961) | disposeLigaturesAddon() {
    method updateFontLigatures (line 976) | updateFontLigatures(enabled) {
    method loadTerminalFont (line 987) | async loadTerminalFont() {
    method increaseFontSize (line 1001) | increaseFontSize() {
    method decreaseFontSize (line 1010) | decreaseFontSize() {
    method updateFontSize (line 1019) | updateFontSize(fontSize) {
    method terminate (line 1051) | async terminate() {
    method dispose (line 1073) | dispose() {
    method onConnect (line 1096) | onConnect() {}
    method onDisconnect (line 1097) | onDisconnect() {}
    method onError (line 1098) | onError(error) {}
    method onTitleChange (line 1099) | onTitleChange(title) {}
    method onBell (line 1100) | onBell() {}
    method onProcessExit (line 1101) | onProcessExit(exitData) {}

FILE: src/components/terminal/terminalDefaults.js
  constant DEFAULT_TERMINAL_SETTINGS (line 3) | const DEFAULT_TERMINAL_SETTINGS = {
  function getTerminalSettings (line 26) | function getTerminalSettings() {

FILE: src/components/terminal/terminalManager.js
  constant TERMINAL_SESSION_STORAGE_KEY (line 19) | const TERMINAL_SESSION_STORAGE_KEY = "acodeTerminalSessions";
  class TerminalManager (line 21) | class TerminalManager {
    method constructor (line 22) | constructor() {
    method extractTerminalNumber (line 27) | extractTerminalNumber(name) {
    method getNextAvailableTerminalNumber (line 35) | getNextAvailableTerminalNumber() {
    method normalizePersistedSessions (line 53) | normalizePersistedSessions(stored) {
    method readPersistedSessions (line 128) | readPersistedSessions() {
    method getPersistedSessions (line 142) | async getPersistedSessions() {
    method savePersistedSessions (line 169) | savePersistedSessions(sessions) {
    method persistTerminalSession (line 180) | async persistTerminalSession(pid, name, pinned = false) {
    method removePersistedSession (line 206) | async removePersistedSession(pid) {
    method restorePersistedSessions (line 218) | async restorePersistedSessions() {
    method createTerminal (line 272) | async createTerminal(options = {}) {
    method checkAndInstallTerminal (line 421) | async checkAndInstallTerminal() {
    method createInstallationTerminal (line 480) | async createInstallationTerminal() {
    method setupTerminalHandlers (line 562) | async setupTerminalHandlers(
    method closeTerminal (line 817) | closeTerminal(terminalId, removeTab = false) {
    method getTerminal (line 868) | getTerminal(terminalId) {
    method getAllTerminals (line 876) | getAllTerminals() {
    method addTouchSelectionMoreOption (line 885) | addTouchSelectionMoreOption(option) {
    method removeTouchSelectionMoreOption (line 894) | removeTouchSelectionMoreOption(id) {
    method getTouchSelectionMoreOptions (line 902) | getTouchSelectionMoreOptions() {
    method writeToTerminal (line 911) | writeToTerminal(terminalId, data) {
    method clearTerminal (line 922) | clearTerminal(terminalId) {
    method getTerminalStyles (line 933) | getTerminalStyles() {
    method createLocalTerminal (line 956) | async createLocalTerminal(options = {}) {
    method createServerTerminal (line 968) | async createServerTerminal(options = {}) {
    method handleKeyboardResize (line 979) | handleKeyboardResize() {
    method stabilizeTerminals (line 1019) | stabilizeTerminals() {
    method convertProotPath (line 1052) | convertProotPath(prootPath) {
    method getPathDisplayName (line 1087) | getPathDisplayName(path) {
    method shouldConfirmTerminalClose (line 1103) | shouldConfirmTerminalClose() {

FILE: src/components/terminal/terminalThemeManager.js
  class TerminalThemeManager (line 6) | class TerminalThemeManager {
    method constructor (line 7) | constructor() {
    method getTheme (line 456) | getTheme(themeName) {
    method getAllThemes (line 470) | getAllThemes() {
    method getThemeNames (line 485) | getThemeNames() {
    method registerTheme (line 495) | registerTheme(name, theme, pluginId) {
    method unregisterTheme (line 525) | unregisterTheme(name, pluginId) {
    method unregisterPluginThemes (line 549) | unregisterPluginThemes(pluginId) {
    method validateTheme (line 574) | validateTheme(theme) {
    method createVariant (line 618) | createVariant(baseName, overrides) {

FILE: src/components/terminal/terminalTouchSelection.js
  constant DEFAULT_MORE_OPTION_ID (line 7) | const DEFAULT_MORE_OPTION_ID = "__acode_terminal_select_all__";
  function ensureDefaultMoreOption (line 11) | function ensureDefaultMoreOption() {
  function normalizeMoreOption (line 22) | function normalizeMoreOption(option) {
  function resolveMoreOptionLabel (line 60) | function resolveMoreOptionLabel(option, context) {
  function isMoreOptionEnabled (line 74) | function isMoreOptionEnabled(option, context) {
  class TerminalTouchSelection (line 90) | class TerminalTouchSelection {
    method addMoreOption (line 106) | static addMoreOption(option) {
    method removeMoreOption (line 119) | static removeMoreOption(id) {
    method getMoreOptions (line 129) | static getMoreOptions() {
    method constructor (line 134) | constructor(terminal, container, options = {}) {
    method init (line 202) | init() {
    method createSelectionOverlay (line 209) | createSelectionOverlay() {
    method createHandles (line 225) | createHandles() {
    method createHandle (line 242) | createHandle(type) {
    method attachEventListeners (line 265) | attachEventListeners() {
    method onTerminalTouchStart (line 353) | onTerminalTouchStart(event) {
    method onTerminalTouchMove (line 402) | onTerminalTouchMove(event) {
    method onTerminalTouchEnd (line 468) | onTerminalTouchEnd(event) {
    method onHandleTouchStart (line 512) | onHandleTouchStart(event) {
    method onHandleTouchMove (line 558) | onHandleTouchMove(event) {
    method onHandleTouchEnd (line 625) | onHandleTouchEnd(event) {
    method onSelectionChange (line 647) | onSelectionChange() {
    method onOrientationChange (line 657) | onOrientationChange() {
    method onTerminalScroll (line 667) | onTerminalScroll() {
    method onTerminalScrollEnd (line 682) | onTerminalScrollEnd() {
    method onTerminalResize (line 693) | onTerminalResize(size) {
    method startSelection (line 732) | startSelection(touch) {
    method extendSelection (line 790) | extendSelection(touch) {
    method updateSelection (line 798) | updateSelection() {
    method calculateSelectionLength (line 839) | calculateSelectionLength(startRow, startCol, endRow, endCol) {
    method finalizeSelection (line 852) | finalizeSelection() {
    method showHandles (line 858) | showHandles() {
    method hideHandles (line 864) | hideHandles() {
    method getHandleBaseTransform (line 869) | getHandleBaseTransform(orientation) {
    method setHandleOrientation (line 876) | setHandleOrientation(handle, orientation) {
    method updateHandleOrientationForViewportEdges (line 887) | updateHandleOrientationForViewportEdges() {
    method updateHandlePositions (line 907) | updateHandlePositions() {
    method showContextMenu (line 947) | showContextMenu() {
    method createContextMenu (line 1013) | createContextMenu() {
    method hideContextMenu (line 1078) | hideContextMenu(force = false) {
    method forceHideContextMenu (line 1085) | forceHideContextMenu() {
    method copySelection (line 1093) | copySelection() {
    method pasteFromClipboard (line 1104) | pasteFromClipboard() {
    method selectAllText (line 1113) | selectAllText() {
    method getMoreOptionsContext (line 1127) | getMoreOptionsContext() {
    method getResolvedMoreOptions (line 1139) | getResolvedMoreOptions() {
    method executeMoreOption (line 1157) | async executeMoreOption(option) {
    method showMoreOptions (line 1180) | showMoreOptions() {
    method clearSelection (line 1205) | clearSelection() {
    method forceClearSelection (line 1259) | forceClearSelection() {
    method touchToTerminalCoords (line 1266) | touchToTerminalCoords(touch) {
    method terminalCoordsToPixels (line 1286) | terminalCoordsToPixels(coords) {
    method updateCellDimensions (line 1305) | updateCellDimensions() {
    method isTerminalFocused (line 1320) | isTerminalFocused() {
    method getWordBoundsAt (line 1336) | getWordBoundsAt(coords) {
    method isWordCharacter (line 1381) | isWordCharacter(char) {
    method startPinchZoom (line 1390) | startPinchZoom(event) {
    method handlePinchZoom (line 1412) | handlePinchZoom(event) {
    method endPinchZoom (line 1442) | endPinchZoom() {
    method getDistance (line 1452) | getDistance(touch1, touch2) {
    method isEdgeGesture (line 1461) | isEdgeGesture(touch) {
    method destroy (line 1478) | destroy() {

FILE: src/components/tile/index.js
  function tile (line 21) | function tile(options = {}) {

FILE: src/components/toast/index.js
  function toast (line 13) | function toast(message, duration = 0, bgColor, color) {

FILE: src/components/tutorial.js
  function tutorial (line 9) | function tutorial(id, message) {

FILE: src/components/virtualList/index.js
  class VirtualList (line 15) | class VirtualList {
    method constructor (line 20) | constructor(container, options = {}) {
    method setItems (line 61) | setItems(items) {
    method onScroll (line 70) | onScroll() {
    method render (line 81) | render() {
    method scrollToIndex (line 140) | scrollToIndex(index) {
    method getVisibleRange (line 148) | getVisibleRange() {
    method destroy (line 155) | destroy() {

FILE: src/dialogs/alert.js
  function alert (line 11) | function alert(titleText, message, onhide) {

FILE: src/dialogs/box.js
  function box (line 14) | function box(titleText, html, hideButtonText, cancelButtonText) {

FILE: src/dialogs/color.js
  function color (line 13) | function color(defaultColor, onhide) {
  function checkColorType (line 136) | function checkColorType(color) {

FILE: src/dialogs/confirm.js
  function confirm (line 12) | function confirm(titleText, message, isHTML) {

FILE: src/dialogs/loader.js
  function create (line 33) | function create(titleText, message = "", options = {}) {
  function destroy (line 102) | function destroy() {
  function hide (line 124) | function hide() {
  function show (line 141) | function show() {
  function showTitleLoader (line 156) | function showTitleLoader(immortal = false) {
  function removeTitleLoader (line 172) | function removeTitleLoader(immortal = undefined) {

FILE: src/dialogs/multiPrompt.js
  function multiPrompt (line 34) | function multiPrompt(message, inputs, help) {

FILE: src/dialogs/prompt.js
  function prompt (line 24) | function prompt(

FILE: src/dialogs/rateBox.js
  function rateBox (line 5) | function rateBox() {
  function getFeedbackBody (line 53) | function getFeedbackBody(eol) {
  function getStars (line 77) | function getStars(num) {

FILE: src/dialogs/select.js
  function select (line 35) | function select(title, items, options = {}) {

FILE: src/fileSystem/externalFs.js
  method readFile (line 7) | async readFile(url) {
  method writeFile (line 14) | async writeFile(filename, data) {
  method copy (line 20) | async copy(src, dest) {
  method move (line 26) | async move(src, dest) {
  method delete (line 32) | async delete(name) {
  method createFile (line 38) | async createFile(parent, filename, data) {
  method createDir (line 54) | async createDir(parent, dirname) {
  method listDir (line 60) | async listDir(pathname) {
  method renameFile (line 66) | async renameFile(src, newname) {
  method getStorageAccessPermission (line 72) | getStorageAccessPermission(uuid, name) {
  method listStorages (line 81) | listStorages() {
  method getPath (line 87) | getPath(uri, filename) {
  method stats (line 93) | async stats(uri) {
  method formatUri (line 153) | formatUri(uri) {
  method test (line 164) | test(url) {
  function createFs (line 175) | function createFs(url) {

FILE: src/fileSystem/ftp.js
  class FtpClient (line 9) | class FtpClient {
    method constructor (line 23) | constructor(
    method connect (line 56) | connect() {
    method setPath (line 88) | setPath(val) {
    method listDir (line 92) | async listDir() {
    method readFile (line 118) | async readFile() {
    method writeFile (line 142) | async writeFile(content = "") {
    method createFile (line 160) | async createFile(name, content = "") {
    method createDir (line 178) | async createDir(name) {
    method delete (line 192) | async delete() {
    method rename (line 217) | async rename(newName) {
    method moveTo (line 235) | async moveTo(newPath) {
    method exists (line 252) | async exists() {
    method stat (line 262) | async stat() {
    method copyTo (line 269) | async copyTo() {
    method getWorkingDirectory (line 273) | async getWorkingDirectory() {
    method localName (line 280) | get localName() {
    method #getStat (line 284) | async #getStat(url = this.#path) {
    method #cacheFile (line 315) | get #cacheFile() {
    method #isConnected (line 322) | async #isConnected() {
    method #connectIfNotConnected (line 338) | async #connectIfNotConnected() {
  function Ftp (line 346) | function Ftp(
  function createFs (line 382) | function createFs(ftp) {

FILE: src/fileSystem/index.js
  function fsOperation (line 55) | function fsOperation(...url) {
  method readFile (line 84) | async readFile(encoding, progress) {
  method writeFile (line 97) | async writeFile(content, progress) {

FILE: src/fileSystem/internalFs.js
  method listDir (line 13) | listDir(url) {
  method writeFile (line 37) | writeFile(filename, data, create = false, exclusive = true) {
  method delete (line 70) | delete(filename) {
  method readFile (line 93) | readFile(filename) {
  method renameFile (line 131) | renameFile(url, newname) {
  method createDir (line 160) | createDir(path, dirname) {
  method copy (line 187) | copy(src, dest) {
  method move (line 197) | move(src, dest) {
  method moveOrCopy (line 208) | moveOrCopy(action, src, dest) {
  method stats (line 231) | stats(filename) {
  method verify (line 267) | verify(src, dest) {
  method exists (line 307) | exists(url) {
  method test (line 328) | test(url) {
  function setMessage (line 336) | function setMessage(reject) {
  function getErrorMessage (line 352) | function getErrorMessage(code) {
  function createFs (line 388) | function createFs(url) {

FILE: src/fileSystem/sftp.js
  class SftpClient (line 9) | class SftpClient {
    method constructor (line 31) | constructor(hostname, port = 22, username, authentication) {
    method setPath (line 54) | setPath(path) {
    method lsDir (line 63) | lsDir(filename = this.#path) {
    method createFile (line 104) | createFile(filename, content) {
    method createDir (line 136) | createDir(dirname) {
    method writeFile (line 169) | writeFile(content, remotefile) {
    method readFile (line 194) | readFile() {
    method copyTo (line 229) | async copyTo(dest) {
    method #copyFile (line 257) | async #copyFile(src, dest) {
    method #copyDirectory (line 279) | async #copyDirectory(src, dest) {
    method moveTo (line 300) | moveTo(dest) {
    method rename (line 309) | rename(newname, move) {
    method delete (line 343) | delete() {
    method pwd (line 374) | pwd() {
    method connect (line 400) | async connect() {
    method exists (line 439) | async exists() {
    method stat (line 443) | async stat() {
    method localName (line 489) | get localName() {
    method #safeName (line 497) | #safeName(name) {
    method #notConnected (line 556) | #notConnected(connectionID) {
    method #getLocalname (line 565) | #getLocalname(filename) {
    method #setStat (line 572) | async #setStat() {
  function Sftp (line 586) | function Sftp(host, port, username, authentication) {
  function createFs (line 611) | function createFs(sftp) {

FILE: src/handlers/editorFileTab.js
  constant MAX_SCROLL (line 22) | let MAX_SCROLL = 0;
  constant MIN_SCROLL (line 23) | let MIN_SCROLL = 0;
  constant MAX_SCROLL_SPEED (line 70) | const MAX_SCROLL_SPEED = 4;
  function startDrag (line 76) | function startDrag(e) {
  function onDrag (line 143) | function onDrag(e) {
  function releaseDrag (line 177) | function releaseDrag(e) {
  function preventDefaultScroll (line 240) | function preventDefaultScroll() {
  function scrollContainer (line 247) | function scrollContainer() {
  function getClientPos (line 263) | function getClientPos(e) {
  function updateFileList (line 285) | function updateFileList($parent) {
  function getScroll (line 323) | function getScroll() {

FILE: src/handlers/intent.js
  function HandleIntent (line 16) | async function HandleIntent(intent = {}) {
  function addIntentHandler (line 69) | function addIntentHandler(handler) {
  function removeIntentHandler (line 73) | function removeIntentHandler(handler) {
  function processPendingIntents (line 83) | async function processPendingIntents() {
  class IntentEvent (line 97) | class IntentEvent {
    method constructor (line 111) | constructor(module, action, value) {
    method preventDefault (line 117) | preventDefault() {
    method stopPropagation (line 121) | stopPropagation() {
    method defaultPrevented (line 125) | get defaultPrevented() {
    method propagationStopped (line 129) | get propagationStopped() {

FILE: src/handlers/keyboard.js
  constant MIN_KEYBOARD_HEIGHT (line 14) | let MIN_KEYBOARD_HEIGHT = 100;
  method esc (line 34) | get esc() {
  method esc (line 41) | set esc(val) {
  function keyboardHandler (line 55) | function keyboardHandler(e) {
  function shouldIgnoreEditorShortcutTarget (line 90) | function shouldIgnoreEditorShortcutTarget(target) {
  function emit (line 179) | function emit(eventName) {
  function focusBlurEditor (line 189) | function focusBlurEditor(keyboardHidden) {
  function showHideAd (line 199) | function showHideAd(keyboardHidden) {

FILE: src/handlers/purchase.js
  function purchaseListener (line 3) | function purchaseListener(onpurchase, onerror) {

FILE: src/handlers/quickTools.js
  function getRefValue (line 35) | function getRefValue(ref) {
  function setRefValue (line 48) | function setRefValue(ref, value) {
  function applySearchQuery (line 55) | function applySearchQuery(editor, searchValue, replaceValue) {
  function clearSearchQuery (line 72) | function clearSearchQuery(editor) {
  function getSelectedText (line 79) | function getSelectedText(editor) {
  function selectionMatchesQuery (line 100) | function selectionMatchesQuery(editor, query) {
  function setupHistoryNavigation (line 178) | function setupHistoryNavigation() {
  method shift (line 246) | get shift() {
  method alt (line 249) | get alt() {
  method ctrl (line 252) | get ctrl() {
  method meta (line 255) | get meta() {
  method on (line 263) | on(event, callback) {
  method off (line 271) | off(event, callback) {
  function actions (line 282) | function actions(action, value) {
  function setInput (line 399) | function setInput() {
  function toggleSearch (line 416) | function toggleSearch() {
  function toggle (line 476) | function toggle() {
  function setHeight (line 498) | function setHeight(height = 1, save = true) {
  function removeSearch (line 543) | function removeSearch() {
  function find (line 576) | function find(skip, backward) {
  function updateSearchState (line 611) | function updateSearchState() {
  function setFooterHeight (line 657) | function setFooterHeight(height) {
  function getFooterHeight (line 673) | function getFooterHeight() {
  function focusEditor (line 677) | function focusEditor() {
  function resetKeys (line 693) | function resetKeys() {
  function getKeys (line 712) | function getKeys(key = {}) {
  function getActiveTerminalComponent (line 722) | function getActiveTerminalComponent() {
  function getActiveTerminalInput (line 728) | function getActiveTerminalInput() {
  function insertText (line 732) | function insertText(value) {
  function shiftKeyMapping (line 757) | function shiftKeyMapping(char) {

FILE: src/handlers/quickToolsInit.js
  constant CONTEXT_MENU_TIMEOUT (line 6) | const CONTEXT_MENU_TIMEOUT = 500;
  constant MOVE_X_THRESHOLD (line 7) | const MOVE_X_THRESHOLD = 50;
  function reset (line 27) | function reset() {
  function init (line 43) | function init() {
  function onwheel (line 116) | function onwheel(e) {
  function onclick (line 133) | function onclick(e) {
  function touchstart (line 142) | function touchstart(e) {
  function touchmove (line 179) | function touchmove(e) {
  function touchend (line 232) | function touchend(e) {
  function touchcancel (line 278) | function touchcancel(e) {
  function oncontextmenu (line 292) | function oncontextmenu(e) {
  function click (line 325) | function click($el) {

FILE: src/handlers/windowResize.js
  function windowResize (line 27) | function windowResize() {
  function onResize (line 61) | function onResize() {
  function emit (line 71) | function emit(eventName) {

FILE: src/index.d.ts
  type LanguageMap (line 1) | type LanguageMap = { [key: string]: string };
  type Window (line 13) | interface Window {
  type String (line 25) | interface String {
  type ExecutorCallback (line 36) | type ExecutorCallback = (
  type Executor (line 41) | interface Executor {
  type Window (line 65) | interface Window {
  type EditorManager (line 70) | interface EditorManager {
  type LspFileMetadata (line 77) | interface LspFileMetadata {
  type AcodeFile (line 89) | interface AcodeFile {

FILE: src/lib/acode.js
  class Acode (line 79) | class Acode {
    method clearBrokenPluginMark (line 91) | clearBrokenPluginMark(pluginId) {
    method constructor (line 101) | constructor() {
    method #secureTerminalWrite (line 389) | #secureTerminalWrite(id, data) {
    method define (line 483) | define(name, module) {
    method require (line 487) | require(module) {
    method exec (line 491) | exec(key, val) {
    method installPlugin (line 504) | installPlugin(pluginId, installerPluginName) {
    method [onPluginLoadCallback] (line 618) | [onPluginLoadCallback](pluginId) {
    method [onPluginsLoadCompleteCallback] (line 625) | [onPluginsLoadCompleteCallback]() {
    method waitForPlugin (line 634) | waitForPlugin(pluginId) {
    method exitAppMessage (line 647) | get exitAppMessage() {
    method setLoadingMessage (line 655) | setLoadingMessage(message) {
    method setPluginInit (line 665) | setPluginInit(id, initFunction, settings) {
    method setPluginUnmount (line 684) | setPluginUnmount(id, unmountFunction) {
    method initPlugin (line 694) | async initPlugin(id, baseUrl, $page, options) {
    method unmountPlugin (line 700) | unmountPlugin(id) {
    method registerFormatter (line 709) | registerFormatter(id, extensions, format, displayName) {
    method unregisterFormatter (line 727) | unregisterFormatter(id) {
    method format (line 740) | async format(selectIfNull = true) {
    method #afterSelectFormatter (line 781) | #afterSelectFormatter(name) {
    method fsOperation (line 792) | fsOperation(file) {
    method newEditorFile (line 796) | newEditorFile(filename, options) {
    method formatters (line 800) | get formatters() {
    method getFormatterFor (line 813) | getFormatterFor(extensions) {
    method alert (line 824) | alert(title, message, onhide) {
    method loader (line 828) | loader(title, message, cancel) {
    method joinUrl (line 832) | joinUrl(...args) {
    method addIcon (line 843) | addIcon(className, src, options = {}) {
    method prompt (line 871) | async prompt(message, defaultValue, type, options) {
    method confirm (line 876) | async confirm(title, message) {
    method select (line 881) | async select(title, options, config) {
    method multiPrompt (line 886) | async multiPrompt(title, inputs, help) {
    method fileBrowser (line 891) | async fileBrowser(mode, info, openLast) {
    method toInternalUrl (line 896) | async toInternalUrl(url) {
    method pushNotification (line 910) | pushNotification(
    method registerFileHandler (line 933) | registerFileHandler(id, options) {
    method unregisterFileHandler (line 941) | unregisterFileHandler(id) {
    method addCommand (line 945) | addCommand(descriptor) {
    method removeCommand (line 951) | removeCommand(name) {
    method execCommand (line 957) | execCommand(name, view, args) {
    method listCommands (line 963) | listCommands() {
    method #refreshCommandBindings (line 967) | #refreshCommandBindings() {
    method #createCommandApi (line 972) | #createCommandApi() {

FILE: src/lib/actionStack.js
  method length (line 15) | get length() {
  method onCloseApp (line 22) | get onCloseApp() {
  method onCloseApp (line 29) | set onCloseApp(cb) {
  method windowCopy (line 36) | windowCopy() {
  method push (line 54) | push(fun) {
  method pop (line 62) | async pop(repeat) {
  method get (line 102) | get(id) {
  method remove (line 110) | remove(id) {
  method has (line 126) | has(id) {
  method setMark (line 133) | setMark() {
  method clearFromMark (line 139) | clearFromMark() {
  method freeze (line 144) | freeze() {
  method unfreeze (line 147) | unfreeze() {

FILE: src/lib/adRewards.js
  constant ONE_HOUR (line 5) | const ONE_HOUR = 60 * 60 * 1000;
  constant MAX_TIMEOUT (line 6) | const MAX_TIMEOUT = 2_147_483_647;
  constant REWARDED_RESULT_TIMEOUT_MS (line 7) | const REWARDED_RESULT_TIMEOUT_MS = 90 * 1000;
  constant OFFERS (line 9) | const OFFERS = [
  function getDefaultState (line 35) | function getDefaultState() {
  function formatDuration (line 52) | function formatDuration(durationMs) {
  function formatDurationRange (line 59) | function formatDurationRange(minDurationMs, maxDurationMs) {
  function getRewardedUnitId (line 69) | function getRewardedUnitId() {
  function getExpiryDate (line 73) | function getExpiryDate() {
  function emitChange (line 77) | function emitChange() {
  function hideActiveBanner (line 91) | function hideActiveBanner() {
  function notify (line 98) | function notify(title, message, type = "info") {
  function normalizeStatus (line 106) | function normalizeStatus(status) {
  function clearExpiryTimer (line 132) | function clearExpiryTimer() {
  function refreshState (line 139) | async function refreshState({ notifyExpiry = false } = {}) {
  function scheduleExpiryCheck (line 161) | function scheduleExpiryCheck() {
  function getRewardIdentity (line 179) | async function getRewardIdentity() {
  function createRewardedAd (line 196) | async function createRewardedAd(offer, step, sessionId) {
  function waitForRewardedResult (line 219) | function waitForRewardedResult(ad) {
  function showRewardedStep (line 260) | async function showRewardedStep(offer, step, sessionId) {
  method init (line 272) | async init() {
  method onChange (line 275) | onChange(listener) {
  method handleResume (line 279) | async handleResume() {
  method getState (line 282) | getState() {
  method getOffers (line 288) | getOffers() {
  method getRemainingMs (line 297) | getRemainingMs() {
  method getRemainingLabel (line 300) | getRemainingLabel() {
  method getExpiryLabel (line 317) | getExpiryLabel() {
  method isAdFreeActive (line 322) | isAdFreeActive() {
  method canShowAds (line 325) | canShowAds() {
  method isRewardedSupported (line 328) | isRewardedSupported() {
  method getRewardedUnavailableReason (line 333) | getRewardedUnavailableReason() {
  method canRedeemNow (line 343) | canRedeemNow() {
  method isWatchingReward (line 349) | isWatchingReward() {
  method watchOffer (line 352) | async watchOffer(offerId, { onStep } = {}) {

FILE: src/lib/applySettings.js
  method beforeRender (line 8) | beforeRender() {
  method afterRender (line 29) | afterRender() {

FILE: src/lib/auth.js
  method emit (line 6) | emit(data) {
  method on (line 11) | on(callback) {
  method off (line 14) | off(callback) {
  class AuthService (line 19) | class AuthService {
    method constructor (line 20) | constructor() {
    method onIntentReceiver (line 24) | async onIntentReceiver(event) {
    method _exec (line 46) | _exec(action, args = []) {
    method openLoginUrl (line 52) | async openLoginUrl() {
    method logout (line 65) | async logout() {
    method isLoggedIn (line 75) | async isLoggedIn() {
    method getUserInfo (line 87) | async getUserInfo() {
    method getAvatar (line 97) | async getAvatar() {
    method _generateInitialsAvatar (line 117) | _generateInitialsAvatar(name) {

FILE: src/lib/checkFiles.js
  method set (line 8) | set(value) {
  method get (line 11) | get() {
  function checkFiles (line 16) | async function checkFiles() {

FILE: src/lib/checkPluginsUpdate.js
  function checkPluginsUpdate (line 5) | async function checkPluginsUpdate() {

FILE: src/lib/commands.js
  method "run-tests" (line 39) | async "run-tests"() {
  method "close-all-tabs" (line 42) | async "close-all-tabs"() {
  method "save-all-changes" (line 87) | async "save-all-changes"() {
  method "close-current-tab" (line 98) | "close-current-tab"() {
  method "toggle-pin-tab" (line 101) | "toggle-pin-tab"() {
  method console (line 104) | console() {
  method "check-files" (line 107) | "check-files"() {
  method "command-palette" (line 111) | "command-palette"() {
  method "disable-fullscreen" (line 114) | "disable-fullscreen"() {
  method "enable-fullscreen" (line 118) | "enable-fullscreen"() {
  method encoding (line 122) | encoding() {
  method exit (line 125) | exit() {
  method "edit-with" (line 128) | "edit-with"() {
  method "find-file" (line 131) | "find-file"() {
  method files (line 134) | files() {
  method find (line 139) | find() {
  method "file-info" (line 142) | "file-info"(url) {
  method goto (line 145) | async goto() {
  method "new-file" (line 158) | async "new-file"() {
  method "next-file" (line 171) | "next-file"() {
  method open (line 180) | open(page) {
  method "open-with" (line 211) | "open-with"() {
  method "open-file" (line 214) | "open-file"() {
  method "open-folder" (line 220) | "open-folder"() {
  method "prev-file" (line 226) | "prev-file"() {
  method "read-only" (line 235) | "read-only"() {
  method recent (line 239) | recent() {
  method replace (line 255) | replace() {
  method "resize-editor" (line 258) | "resize-editor"() {
  method "open-inapp-browser" (line 262) | "open-inapp-browser"(url) {
  method run (line 265) | run() {
  method "run-file" (line 270) | "run-file"() {
  method save (line 273) | async save(showToast) {
  method "save-as" (line 283) | async "save-as"(showToast) {
  method "save-state" (line 293) | "save-state"() {
  method share (line 296) | share() {
  method "pin-file-shortcut" (line 299) | async "pin-file-shortcut"() {
  method syntax (line 353) | syntax() {
  method "change-app-theme" (line 356) | "change-app-theme"() {
  method "change-editor-theme" (line 359) | "change-editor-theme"() {
  method "toggle-fullscreen" (line 362) | "toggle-fullscreen"() {
  method "toggle-sidebar" (line 366) | "toggle-sidebar"() {
  method "toggle-menu" (line 369) | "toggle-menu"() {
  method "toggle-editmenu" (line 372) | "toggle-editmenu"() {
  method "insert-color" (line 375) | async "insert-color"() {
  method copy (line 404) | copy() {
  method cut (line 407) | cut() {
  method paste (line 410) | paste() {
  method "select-all" (line 413) | "select-all"() {
  method rename (line 417) | async rename(file) {
  method format (line 463) | async format(selectIfNull) {
  method eol (line 473) | async eol() {
  method "open-log-file" (line 479) | "open-log-file"() {
  method "copy-device-info" (line 482) | "copy-device-info"() {
  method "new-terminal" (line 551) | async "new-terminal"() {
  method welcome (line 559) | welcome() {
  method "toggle-inspector" (line 562) | async "toggle-inspector"() {
  method "open-inspector" (line 566) | async "open-inspector"() {
  method "lsp-info" (line 570) | async "lsp-info"() {

FILE: src/lib/console.js
  method onblur (line 14) | onblur() {
  method onclick (line 27) | onclick() {
  method ontouchstart (line 35) | ontouchstart() {
  method onclick (line 50) | onclick(e) {
  function touchmove (line 92) | function touchmove(e) {
  function assignCustomConsole (line 99) | function assignCustomConsole() {
  function showConsole (line 207) | function showConsole() {
  function hideConsole (line 212) | function hideConsole() {
  function onCodeInput (line 217) | function onCodeInput(e) {
  function getBody (line 241) | function getBody(obj, ...keys) {
  function appendProperties (line 295) | function appendProperties(obj, ...keys) {
  function objValue (line 340) | function objValue(obj, ...keys) {
  function getPromiseStatus (line 344) | function getPromiseStatus(obj) {
  function getElement (line 371) | function getElement(type) {
  function parseFunction (line 382) | function parseFunction(data) {
  function log (line 436) | function log(mode, options, ...args) {
  function format (line 501) | function format(args) {
  function getStack (line 602) | function getStack(error, skip = false) {
  function execute (line 637) | function execute(code) {
  function onError (line 682) | function onError(err) {
  function escapeHTML (line 687) | function escapeHTML(str) {

FILE: src/lib/constants.js
  method PLAY_STORE_URL (line 19) | get PLAY_STORE_URL() {

FILE: src/lib/devTools.js
  method isInitialized (line 19) | get isInitialized() {
  method eruda (line 27) | get eruda() {
  method init (line 36) | async init(showLoader = false) {
  method show (line 100) | show() {
  method hide (line 114) | hide() {
  method toggle (line 125) | toggle() {
  method destroy (line 140) | destroy() {

FILE: src/lib/editorFile.js
  function createSessionProxy (line 35) | function createSessionProxy(state, file) {
  class EditorFile (line 234) | class EditorFile {
    method constructor (line 395) | constructor(filename, options) {
    method type (line 551) | get type() {
    method tabIcon (line 555) | get tabIcon() {
    method content (line 559) | get content() {
    method session (line 568) | get session() {
    method session (line 576) | set session(value) {
    method _setRawSession (line 585) | _setRawSession(state) {
    method id (line 592) | get id() {
    method id (line 600) | set id(value) {
    method filename (line 608) | get filename() {
    method filename (line 616) | set filename(value) {
    method location (line 652) | get location() {
    method location (line 668) | set location(value) {
    method uri (line 684) | get uri() {
    method uri (line 692) | set uri(value) {
    method eol (line 718) | get eol() {
    method eol (line 726) | set eol(value) {
    method editable (line 744) | get editable() {
    method editable (line 752) | set editable(value) {
    method isUnsaved (line 760) | get isUnsaved() {
    method isUnsaved (line 764) | set isUnsaved(value) {
    method pinned (line 771) | get pinned() {
    method pinned (line 775) | set pinned(value) {
    method setPinnedState (line 779) | setPinnedState(value, options = {}) {
    method togglePinned (line 800) | togglePinned() {
    method name (line 807) | get name() {
    method cacheFile (line 814) | get cacheFile() {
    method icon (line 821) | get icon() {
    method tab (line 828) | get tab() {
    method SAFMode (line 832) | get SAFMode() {
    method writeToCache (line 836) | async writeToCache() {
    method isChanged (line 853) | async isChanged() {
    method canRun (line 930) | async canRun() {
    method readCanRun (line 936) | async readCanRun() {
    method writeCanRun (line 968) | async writeCanRun(cb) {
    method remove (line 983) | async remove(force = false, options = {}) {
    method save (line 1033) | save() {
    method saveAs (line 1042) | saveAs() {
    method setReadOnly (line 1047) | setReadOnly(value) {
    method setMode (line 1076) | setMode(mode) {
    method makeActive (line 1109) | makeActive() {
    method removeActive (line 1178) | removeActive() {
    method openWith (line 1182) | openWith() {
    method editWith (line 1186) | editWith() {
    method share (line 1190) | share() {
    method runAction (line 1194) | runAction() {
    method run (line 1198) | run() {
    method runFile (line 1202) | runFile() {
    method render (line 1206) | render() {
    method on (line 1235) | on(event, callback) {
    method off (line 1244) | off(event, callback) {
    method #addCustomStyles (line 1256) | #addCustomStyles(styles, shadow) {
    method addStyle (line 1283) | addStyle(style) {
    method setCustomTitle (line 1294) | setCustomTitle(titleFn) {
    method headerSubtitle (line 1302) | get headerSubtitle() {
    method #fileAction (line 1310) | async #fileAction(action, mimeType) {
    method #getShareableUri (line 1326) | async #getShareableUri() {
    method #renameCacheFile (line 1341) | async #renameCacheFile(newId) {
    method #removeCache (line 1355) | async #removeCache() {
    method #loadText (line 1365) | async #loadText() {
    method #save (line 1459) | #save(as) {
    method #run (line 1467) | #run(file) {
    method #updateTab (line 1474) | #updateTab() {
    method #setupSession (line 1490) | #setupSession() {
    method #destroy (line 1501) | #destroy() {
    method #showNoAppError (line 1516) | #showNoAppError() {
    method #createTabTail (line 1520) | #createTabTail() {
    method #getTitle (line 1539) | #getTitle() {
    method #emit (line 1565) | #emit(eventName, event) {
  function tabOnclick (line 1580) | function tabOnclick(e) {
  function createFileEvent (line 1594) | function createFileEvent(file) {
  class FileEvent (line 1598) | class FileEvent {
    method constructor (line 1602) | constructor(file) {
    method stopPropagation (line 1605) | stopPropagation() {
    method preventDefault (line 1608) | preventDefault() {
    method BUBBLING_PHASE (line 1611) | get BUBBLING_PHASE() {
    method defaultPrevented (line 1614) | get defaultPrevented() {

FILE: src/lib/editorManager.js
  function EditorManager (line 85) | async function EditorManager($header, $body) {

FILE: src/lib/fileList.js
  function initFileList (line 21) | function initFileList() {
  function append (line 36) | async function append(parent, child) {
  function remove (line 50) | function remove(item) {
  function refresh (line 68) | async function refresh() {
  function rename (line 90) | function rename(oldUrl, newUrl) {
  function files (line 102) | function files(dir) {
  function getTree (line 148) | function getTree(treeList, dir) {
  function getFile (line 169) | function getFile(path, tree) {
  function flattenTree (line 188) | function flattenTree(tree, transform, listedDirs) {
  function addRoot (line 210) | async function addRoot({ url, name }) {
  function onRemoveFolder (line 233) | function onRemoveFolder({ url }) {
  function getAllFiles (line 245) | async function getAllFiles(parent, root) {
  function emit (line 280) | function emit(event, ...args) {
  function createChildTree (line 292) | async function createChildTree(parent, item, root) {
  class Tree (line 327) | class Tree {
    method constructor (line 348) | constructor(name, url, isDirectory) {
    method #childrenArray (line 355) | #childrenArray() {
    method create (line 374) | static async create(url, name, isDirectory) {
    method createRoot (line 390) | static async createRoot(url, name) {
    method name (line 397) | get name() {
    method url (line 402) | get url() {
    method path (line 407) | get path() {
    method children (line 412) | get children() {
    method children (line 416) | set children(value) {
    method parent (line 422) | get parent() {
    method parent (line 427) | set parent(value) {
    method isConnected (line 439) | get isConnected() {
    method root (line 448) | get root() {
    method update (line 461) | update(url, name) {
    method toJSON (line 482) | toJSON() {
    method fromJSON (line 497) | static fromJSON(json) {

FILE: src/lib/fileTypeHandler.js
  class FileTypeHandlerRegistry (line 17) | class FileTypeHandlerRegistry {
    method registerFileHandler (line 28) | registerFileHandler(id, { extensions, handleFile }) {
    method unregisterFileHandler (line 56) | unregisterFileHandler(id) {
    method getFileHandler (line 65) | getFileHandler(filename) {
    method getHandlers (line 87) | getHandlers() {

FILE: src/lib/fonts.js
  constant CUSTOM_FONTS_KEY (line 11) | const CUSTOM_FONTS_KEY = "custom_fonts";
  constant FONT_FACE_STYLE_ID (line 12) | const FONT_FACE_STYLE_ID = "font-face-style";
  constant EDITOR_STYLE_ID (line 13) | const EDITOR_STYLE_ID = "editor-font-style";
  constant APP_STYLE_ID (line 14) | const APP_STYLE_ID = "app-font-style";
  constant DEFAULT_EDITOR_FONT (line 15) | const DEFAULT_EDITOR_FONT = "Roboto Mono";
  constant DEFAULT_APP_FONT_STACK (line 16) | const DEFAULT_APP_FONT_STACK = `"Roboto", sans-serif`;
  function add (line 134) | function add(name, css) {
  function addCustom (line 138) | function addCustom(name, css) {
  function saveCustomFonts (line 144) | function saveCustomFonts() {
  function loadCustomFonts (line 157) | function loadCustomFonts() {
  function get (line 172) | function get(name) {
  function getNames (line 176) | function getNames() {
  function remove (line 180) | function remove(name) {
  function has (line 189) | function has(name) {
  function isCustom (line 193) | function isCustom(name) {
  function setEditorFont (line 197) | async function setEditorFont(name) {
  function setAppFont (line 216) | async function setAppFont(name) {
  function downloadFont (line 239) | async function downloadFont(name, link) {
  function loadFont (line 257) | async function loadFont(name) {
  function ensureStyleElement (line 285) | function ensureStyleElement(id) {

FILE: src/lib/installPlugin.js
  function installPlugin (line 26) | async function installPlugin(
  function createFileRecursive (line 291) | async function createFileRecursive(parent, dir, shouldBeDirAtEnd) {
  function sanitizeZipPath (line 340) | function sanitizeZipPath(p, isDir) {
  function isUnsafeAbsolutePath (line 373) | function isUnsafeAbsolutePath(p) {
  function resolveDepsManifest (line 396) | async function resolveDepsManifest(deps) {
  function resolveDep (line 443) | async function resolveDep(manifest) {
  function listFileRecursive (line 502) | async function listFileRecursive(dir, files) {
  function deleteRedundantFiles (line 517) | async function deleteRedundantFiles(pluginDir, state) {

FILE: src/lib/installState.js
  constant INSTALL_STATE_STORAGE (line 4) | const INSTALL_STATE_STORAGE = Url.join(DATA_STORAGE, ".install-state");
  class InstallState (line 6) | class InstallState {
    method new (line 17) | static async new(id) {
    method isUpdated (line 76) | async isUpdated(url, content) {
    method exists (line 97) | exists(url) {
    method save (line 105) | async save() {
    method delete (line 112) | async delete(url) {
    method clear (line 119) | async clear() {
  function checksum (line 147) | async function checksum(data) {
  function checksumText (line 161) | async function checksumText(text) {

FILE: src/lib/keyBindings.js
  constant MODIFIER_ORDER (line 10) | const MODIFIER_ORDER = ["Ctrl", "Alt", "Shift", "Cmd"];
  constant KEYMAP_SOURCES (line 11) | const KEYMAP_SOURCES = [
  constant APP_BINDING_CONFIG (line 19) | const APP_BINDING_CONFIG = [
  constant APP_KEY_BINDINGS (line 481) | const APP_KEY_BINDINGS = buildAppBindings(APP_BINDING_CONFIG);
  constant APP_CUSTOM_COMMANDS (line 482) | const APP_CUSTOM_COMMANDS = new Set(
  constant FORCE_READ_ONLY (line 488) | const FORCE_READ_ONLY = new Set([
  constant MUTATING_COMMAND_PATTERN (line 492) | const MUTATING_COMMAND_PATTERN =
  constant CODEMIRROR_COMMAND_NAMES (line 495) | const CODEMIRROR_COMMAND_NAMES = new Set(
  constant CODEMIRROR_KEY_BINDINGS (line 501) | const CODEMIRROR_KEY_BINDINGS = buildCodemirrorKeyBindings(APP_KEY_BINDI...
  function buildAppBindings (line 517) | function buildAppBindings(configs) {
  function buildCodemirrorKeyBindings (line 541) | function buildCodemirrorKeyBindings(appBindings) {
  function addCommandCombo (line 601) | function addCommandCombo(map, name, combo) {
  function normalizeKey (line 611) | function normalizeKey(key, platform = "win") {
  function ensureModifier (line 620) | function ensureModifier(combo, modifier) {
  function parseKeyParts (line 629) | function parseKeyParts(combo) {
  function humanizeCommandName (line 646) | function humanizeCommandName(name) {
  function inferReadOnly (line 653) | function inferReadOnly(name) {

FILE: src/lib/lang.js
  method strings (line 4) | async strings() {
  method strings (line 10) | async strings() {
  method strings (line 16) | async strings() {
  method strings (line 22) | async strings() {
  method strings (line 28) | async strings() {
  method strings (line 34) | async strings() {
  method strings (line 40) | async strings() {
  method strings (line 46) | async strings() {
  method strings (line 52) | async strings() {
  method strings (line 58) | async strings() {
  method strings (line 64) | async strings() {
  method strings (line 70) | async strings() {
  method strings (line 76) | async strings() {
  method strings (line 82) | async strings() {
  method strings (line 88) | async strings() {
  method strings (line 94) | async strings() {
  method strings (line 100) | async strings() {
  method strings (line 106) | async strings() {
  method strings (line 112) | async strings() {
  method strings (line 118) | async strings() {
  method strings (line 124) | async strings() {
  method strings (line 130) | async strings() {
  method strings (line 136) | async strings() {
  method strings (line 142) | async strings() {
  method strings (line 148) | async strings() {
  method strings (line 154) | async strings() {
  method strings (line 160) | async strings() {
  method strings (line 166) | async strings() {
  method strings (line 172) | async strings() {
  method strings (line 178) | async strings() {
  method strings (line 184) | async strings() {
  method set (line 191) | async set(code) {
  method getName (line 198) | getName(code) {

FILE: src/lib/loadPlugin.js
  function loadPlugin (line 7) | async function loadPlugin(pluginId, justInstalled = false) {

FILE: src/lib/loadPlugins.js
  constant THEME_IDENTIFIERS (line 7) | const THEME_IDENTIFIERS = new Set([
  constant LOADED_PLUGINS (line 33) | const LOADED_PLUGINS = new Set();
  constant BROKEN_PLUGINS (line 34) | const BROKEN_PLUGINS = new Map();
  function loadPlugins (line 36) | async function loadPlugins(loadOnlyTheme = false) {
  function isThemePlugin (line 134) | function isThemePlugin(pluginId) {
  function cleanupFailedPlugins (line 141) | async function cleanupFailedPlugins(pluginIds) {

FILE: src/lib/logger.js
  class Logger (line 18) | class Logger {
    method constructor (line 27) | constructor(
    method log (line 48) | log(level, message) {
    method flushLogs (line 69) | flushLogs() {
    method stopAutoFlush (line 116) | stopAutoFlush() {

FILE: src/lib/notificationManager.js
  class NotificationManager (line 7) | class NotificationManager {
    method constructor (line 14) | constructor() {
    method init (line 22) | init() {
    method startTimeUpdates (line 35) | startTimeUpdates() {
    method updateNotificationTimes (line 45) | updateNotificationTimes() {
    method renderNotifications (line 66) | renderNotifications() {
    method handleClick (line 83) | handleClick(e) {
    method createNotificationElement (line 104) | createNotificationElement(notification) {
    method createToastNotification (line 140) | createToastNotification(notification) {
    method addNotification (line 182) | addNotification(notification) {
    method pushNotification (line 198) | pushNotification({
    method parseIcon (line 219) | parseIcon(icon) {
    method sanitizeText (line 227) | sanitizeText(text) {
    method sanitizeIcon (line 234) | sanitizeIcon(iconMarkup) {
    method formatTime (line 241) | formatTime(date) {
    method clearAll (line 253) | clearAll() {

FILE: src/lib/openFile.js
  function openFile (line 31) | async function openFile(file, options = {}) {
  function fileToDataUrl (line 433) | async function fileToDataUrl(file) {

FILE: src/lib/openFolder.js
  constant ACODE_PLUGIN_MANIFEST_FILE (line 118) | const ACODE_PLUGIN_MANIFEST_FILE = "plugin.json";
  function openFolder (line 129) | function openFolder(_path, opts = {}) {
  function expandList (line 237) | async function expandList($list) {
  function collapsed (line 295) | function collapsed($el, isFile) {
  function handleItems (line 309) | function handleItems(e) {
  function handleContextmenu (line 332) | async function handleContextmenu(type, url, name, $target) {
  function execOperation (line 430) | function execOperation(type, action, url, $target, name) {
  function handleClick (line 962) | function handleClick(type, uri) {
  function appendTile (line 973) | function appendTile($target, $tile) {
  function appendList (line 985) | function appendList($target, $list) {
  function getLoadedFileTree (line 997) | function getLoadedFileTree($el) {
  function appendEntryToOpenFolder (line 1009) | function appendEntryToOpenFolder(parentUrl, entryUrl, type) {
  function refreshOpenFolder (line 1040) | async function refreshOpenFolder(folderUrl) {
  function createFolderTile (line 1064) | function createFolderTile(name, url) {
  function createFileTile (line 1082) | function createFileTile(name, url) {

FILE: src/lib/prettierFormatter.js
  constant PRETTIER_ID (line 17) | const PRETTIER_ID = "prettier";
  constant PRETTIER_NAME (line 18) | const PRETTIER_NAME = "Prettier";
  constant CONFIG_FILENAMES (line 19) | const CONFIG_FILENAMES = [
  constant PRETTIER_PLUGINS (line 36) | const PRETTIER_PLUGINS = [
  constant MODE_TO_PARSER (line 51) | const MODE_TO_PARSER = {
  constant SUPPORTED_EXTENSIONS (line 75) | const SUPPORTED_EXTENSIONS = [
  function registerPrettierFormatter (line 102) | function registerPrettierFormatter() {
  function formatActiveFileWithPrettier (line 116) | async function formatActiveFileWithPrettier() {
  function getParserForMode (line 158) | function getParserForMode(modeName) {
  function resolvePrettierConfig (line 165) | async function resolvePrettierConfig(file) {
  function loadProjectConfig (line 184) | async function loadProjectConfig(file) {
  function findProjectRoot (line 199) | function findProjectRoot(uri) {
  function collectCandidateDirectories (line 223) | function collectCandidateDirectories(fileUri, projectRoot) {
  function safeDirname (line 249) | function safeDirname(path) {
  function readConfigFromDirectory (line 257) | async function readConfigFromDirectory(directory) {
  function loadConfigFile (line 268) | async function loadConfigFile(directory, basename) {
  function loadPrettierFromPackageJson (line 303) | async function loadPrettierFromPackageJson(directory) {
  function parseJsonLike (line 317) | function parseJsonLike(text) {
  function parseJsConfig (line 329) | function parseJsConfig(directory, source, absolutePath) {
  function parseProgram (line 340) | function parseProgram(source) {
  function extractConfigFromProgram (line 356) | function extractConfigFromProgram(source) {
  function parseSafeExpression (line 379) | function parseSafeExpression(text) {
  function readVariableDeclaration (line 391) | function readVariableDeclaration(statement, scope) {
  function readCommonJsExport (line 412) | function readCommonJsExport(statement, scope) {
  function readEsmExport (line 423) | function readEsmExport(statement, scope) {
  function isModuleExports (line 428) | function isModuleExports(node) {
  function evaluateNode (line 439) | function evaluateNode(node, scope) {
  function evaluateObjectExpression (line 465) | function evaluateObjectExpression(node, scope) {
  function getPropertyKey (line 487) | function getPropertyKey(node) {
  function evaluateUnaryExpression (line 493) | function evaluateUnaryExpression(node, scope) {
  function normalizePath (line 507) | function normalizePath(path) {
  function pathsAreSame (line 517) | function pathsAreSame(a, b) {

FILE: src/lib/projects.js
  method html (line 2) | html() {
  method list (line 22) | list() {
  method get (line 28) | get(project) {
  method set (line 37) | set(project, files, iconSrc) {
  method delete (line 42) | delete(project) {

FILE: src/lib/recents.js
  method files (line 10) | get files() {
  method folders (line 17) | get folders() {
  method files (line 21) | set files(list) {
  method folders (line 24) | set folders(list) {
  method addFile (line 32) | addFile(file) {
  method addFolder (line 39) | addFolder(url, opts) {
  method removeFolder (line 54) | removeFolder(url) {
  method removeFile (line 61) | removeFile(url) {
  method clear (line 68) | clear() {
  method select (line 79) | select(extra, type = "all", title = strings["open recent"]) {

FILE: src/lib/remoteStorage.js
  method addFtp (line 15) | async addFtp(...args) {
  method addSftp (line 166) | async addSftp(...args) {
  method edit (line 368) | edit({ name, storageType, url }) {
  function loadAd (line 426) | async function loadAd() {

FILE: src/lib/removeAds.js
  function removeAds (line 8) | function removeAds() {

FILE: src/lib/restoreFiles.js
  function restoreFiles (line 8) | async function restoreFiles(files) {

FILE: src/lib/restoreTheme.js
  function restoreTheme (line 13) | function restoreTheme(darken = false) {

FILE: src/lib/run.js
  function run (line 30) | async function run(

FILE: src/lib/saveFile.js
  constant SELECT_FOLDER (line 15) | const SELECT_FOLDER = "select-folder";
  function saveFile (line 22) | async function saveFile(file, isSaveAs = false) {

FILE: src/lib/searchHistory.js
  constant HISTORY_KEY (line 6) | const HISTORY_KEY = "acode.searchreplace.history";
  constant MAX_HISTORY_ITEMS (line 7) | const MAX_HISTORY_ITEMS = 20;
  class SearchHistory (line 9) | class SearchHistory {
    method constructor (line 10) | constructor() {
    method loadHistory (line 23) | loadHistory(key) {
    method saveHistory (line 36) | saveHistory() {
    method addToHistory (line 48) | addToHistory(item) {
    method getHistory (line 71) | getHistory() {
    method clearHistory (line 78) | clearHistory() {
    method navigateSearchUp (line 88) | navigateSearchUp(currentValue) {
    method navigateSearchDown (line 107) | navigateSearchDown(currentValue) {
    method navigateReplaceUp (line 128) | navigateReplaceUp(currentValue) {
    method navigateReplaceDown (line 147) | navigateReplaceDown(currentValue) {
    method resetSearchNavigation (line 166) | resetSearchNavigation() {
    method resetReplaceNavigation (line 174) | resetReplaceNavigation() {
    method resetAllNavigation (line 182) | resetAllNavigation() {

FILE: src/lib/secureAdRewardState.js
  function execSystem (line 1) | function execSystem(action, args = []) {
  method getStatus (line 13) | async getStatus() {
  method redeem (line 23) | async redeem(offerId) {

FILE: src/lib/selectionMenu.js
  function selectionMenu (line 29) | function selectionMenu() {
  function item (line 75) | function item(onclick, text, mode = "all", readOnly = false) {

FILE: src/lib/settings.js
  class Settings (line 24) | class Settings {
    method constructor (line 109) | constructor() {
    method init (line 193) | async init() {
    method #save (line 244) | async #save() {
    method update (line 265) | async update(settings, showToast = true, saveFile = true) {
    method reset (line 302) | async reset(setting) {
    method on (line 323) | on(event, callback) {
    method off (line 333) | off(event, callback) {
    method get (line 343) | get(key) {
    method #getChangedKeys (line 351) | #getChangedKeys() {
    method #applySettings (line 366) | #applySettings(setting) {
    method applyAnimationSetting (line 381) | async applyAnimationSetting() {
    method applyLangSetting (line 398) | async applyLangSetting() {
  function areEqual (line 410) | function areEqual(obj1, obj2) {

FILE: src/lib/showFileInfo.js
  function showFileInfo (line 14) | async function showFileInfo(url) {

FILE: src/lib/startAd.js
  function startAd (line 8) | async function startAd() {
  function hideAd (line 67) | function hideAd(force = false) {

FILE: src/lib/systemConfiguration.js
  constant HARDKEYBOARDHIDDEN_NO (line 1) | const HARDKEYBOARDHIDDEN_NO = 1;
  constant HARDKEYBOARDHIDDEN_YES (line 2) | const HARDKEYBOARDHIDDEN_YES = 2;
  constant HARDKEYBOARDHIDDEN_UNDEFINED (line 3) | const HARDKEYBOARDHIDDEN_UNDEFINED = 0;
  constant KEYBOARDHIDDEN_NO (line 5) | const KEYBOARDHIDDEN_NO = 1;
  constant KEYBOARDHIDDEN_YES (line 6) | const KEYBOARDHIDDEN_YES = 2;
  constant KEYBOARDHIDDEN_UNDEFINED (line 7) | const KEYBOARDHIDDEN_UNDEFINED = 0;
  constant KEYBOARD_12KEY (line 9) | const KEYBOARD_12KEY = 3;
  constant KEYBOARD_QWERTY (line 10) | const KEYBOARD_QWERTY = 2;
  constant KEYBOARD_UNDEFINED (line 11) | const KEYBOARD_UNDEFINED = 0;
  constant KEYBOARD_NOKEYS (line 12) | const KEYBOARD_NOKEYS = 1;
  constant NAVIGATIONHIDDEN_NO (line 14) | const NAVIGATIONHIDDEN_NO = 1;
  constant NAVIGATIONHIDDEN_YES (line 15) | const NAVIGATIONHIDDEN_YES = 2;
  constant NAVIGATIONHIDDEN_UNDEFINED (line 16) | const NAVIGATIONHIDDEN_UNDEFINED = 0;
  constant NAVIGATION_DPAD (line 18) | const NAVIGATION_DPAD = 2;
  constant NAVIGATION_TRACKBALL (line 19) | const NAVIGATION_TRACKBALL = 3;
  constant NAVIGATION_WHEEL (line 20) | const NAVIGATION_WHEEL = 4;
  constant NAVIGATION_UNDEFINED (line 21) | const NAVIGATION_UNDEFINED = 0;
  constant ORIENTATION_LANDSCAPE (line 23) | const ORIENTATION_LANDSCAPE = 2;
  constant ORIENTATION_PORTRAIT (line 24) | const ORIENTATION_PORTRAIT = 1;
  constant ORIENTATION_SQUARE (line 25) | const ORIENTATION_SQUARE = 3;
  constant ORIENTATION_UNDEFINED (line 26) | const ORIENTATION_UNDEFINED = 0;
  constant TOUCHSCREEN_FINGER (line 28) | const TOUCHSCREEN_FINGER = 3;
  constant TOUCHSCREEN_NOTOUCH (line 29) | const TOUCHSCREEN_NOTOUCH = 1;
  constant TOUCHSCREEN_STYLUS (line 30) | const TOUCHSCREEN_STYLUS = 2;
  constant TOUCHSCREEN_UNDEFINED (line 31) | const TOUCHSCREEN_UNDEFINED = 0;
  function getSystemConfiguration (line 50) | function getSystemConfiguration() {
  function isDeviceDarkTheme (line 56) | function isDeviceDarkTheme() {

FILE: src/main.js
  function createAceModelistCompatModule (line 73) | function createAceModelistCompatModule() {
  function ensureAceCompatApi (line 110) | function ensureAceCompatApi() {
  function Main (line 126) | async function Main() {
  function onDeviceReady (line 150) | async function onDeviceReady() {
  function setDebugInfo (line 406) | async function setDebugInfo() {
  function promptUpdateCheckConsent (line 430) | async function promptUpdateCheckConsent() {
  function loadApp (line 450) | async function loadApp() {
  function onClickApp (line 698) | function onClickApp(e) {
  function mainPageOnShow (line 721) | function mainPageOnShow() {
  function createMainMenu (line 727) | function createMainMenu({ top, bottom, toggler }) {
  function createFileMenu (line 740) | function createFileMenu({ top, bottom, toggler }) {
  function showTutorials (line 785) | function showTutorials() {
  function backButtonHandler (line 809) | function backButtonHandler() {
  function menuButtonHandler (line 817) | function menuButtonHandler() {
  function pauseHandler (line 822) | function pauseHandler() {
  function resumeHandler (line 827) | function resumeHandler() {

FILE: src/pages/about/about.js
  function AboutInclude (line 9) | function AboutInclude() {

FILE: src/pages/about/index.js
  function About (line 3) | function About() {

FILE: src/pages/adRewards/index.js
  function openAdRewardsPage (line 13) | function openAdRewardsPage() {

FILE: src/pages/changelog/changelog.js
  function Changelog (line 15) | async function Changelog() {

FILE: src/pages/changelog/index.js
  function plugin (line 1) | function plugin({ id, installed }, onInstall, onUninstall) {

FILE: src/pages/customTheme/customTheme.js
  function CustomThemeInclude (line 15) | function CustomThemeInclude() {

FILE: src/pages/customTheme/index.js
  function CustomTheme (line 1) | async function CustomTheme(...args) {

FILE: src/pages/fileBrowser/fileBrowser.js
  function FileBrowserInclude (line 56) | function FileBrowserInclude(mode, info, doesOpenLast = true) {

FILE: src/pages/fileBrowser/index.js
  function FileBrowser (line 20) | function FileBrowser(mode, info, doesOpenLast, ...args) {

FILE: src/pages/fileBrowser/util.js
  method pushFolder (line 12) | pushFolder(list, name, url, extra = {}) {
  method addPath (line 27) | async addPath(name, uuid) {

FILE: src/pages/fontManager/fontManager.js
  function fontManager (line 22) | function fontManager() {

FILE: src/pages/fontManager/index.js
  function fontManager (line 1) | function fontManager(...args) {

FILE: src/pages/markdownPreview/index.js
  function getThemeColor (line 23) | function getThemeColor(name, fallback) {
  function isDarkColor (line 30) | function isDarkColor(color) {
  function escapeHtml (line 43) | function escapeHtml(text) {
  function getTargetElement (line 51) | function getTargetElement(container, targetId) {
  function getOffsetTopWithinContainer (line 65) | function getOffsetTopWithinContainer(target, container) {
  function getMermaid (line 77) | async function getMermaid() {
  function ensureMathStyles (line 90) | async function ensureMathStyles() {
  function getMermaidThemeConfig (line 104) | function getMermaidThemeConfig() {
  function initializeMermaid (line 166) | function initializeMermaid(mermaid) {
  function copyText (line 174) | async function copyText(text) {
  function fileToObjectUrl (line 188) | async function fileToObjectUrl(file) {
  function revokeObjectUrls (line 197) | function revokeObjectUrls(urls) {
  function resolveRenderedImages (line 207) | async function resolveRenderedImages(container, file) {
  function createMarkdownPreview (line 247) | function createMarkdownPreview(file) {
  function openMarkdownPreview (line 555) | async function openMarkdownPreview(file, hash = "") {

FILE: src/pages/markdownPreview/renderer.js
  constant EXTERNAL_LINK_PATTERN (line 9) | const EXTERNAL_LINK_PATTERN = /^(?:[a-z][a-z0-9+.-]*:|\/\/)/i;
  constant IMAGE_PLACEHOLDER (line 10) | const IMAGE_PLACEHOLDER =
  constant BLOCK_MATH_PATTERN (line 12) | const BLOCK_MATH_PATTERN = /(^|[^\\])\$\$[\s\S]+?\$\$/m;
  constant INLINE_MATH_PATTERN (line 13) | const INLINE_MATH_PATTERN =
  constant BEGIN_END_MATH_PATTERN (line 15) | const BEGIN_END_MATH_PATTERN =
  function slugify (line 21) | function slugify(text) {
  function escapeAttribute (line 31) | function escapeAttribute(value = "") {
  function splitLinkTarget (line 39) | function splitLinkTarget(target = "") {
  function isExternalLink (line 51) | function isExternalLink(target = "") {
  function isMarkdownPath (line 55) | function isMarkdownPath(target = "") {
  function getMarkdownBaseUri (line 59) | function getMarkdownBaseUri(file) {
  function resolveMarkdownTarget (line 68) | function resolveMarkdownTarget(target = "", baseUri = "") {
  function resolveImageTarget (line 87) | function resolveImageTarget(target = "", baseUri = "") {
  function collectTokens (line 112) | function collectTokens(tokens, callback) {
  function hasMathContent (line 121) | function hasMathContent(text = "") {
  function getKatexAndTexmathModules (line 129) | async function getKatexAndTexmathModules() {
  function createMarkdownIt (line 149) | function createMarkdownIt({ katex = null, markdownItTexmath = null } = {...
  function getMarkdownIt (line 213) | async function getMarkdownIt(text = "") {
  function renderMarkdown (line 232) | async function renderMarkdown(text, file) {

FILE: src/pages/plugin/index.js
  function plugin (line 1) | function plugin({ id, installed, install }, onInstall, onUninstall) {

FILE: src/pages/plugin/plugin.js
  function PluginInclude (line 34) | async function PluginInclude(
  function isValidSource (line 497) | function isValidSource(source) {

FILE: src/pages/plugin/plugin.view.js
  function handleTabClick (line 257) | function handleTabClick(e) {
  function Buttons (line 272) | function Buttons({
  function Version (line 361) | function Version({
  function showReviews (line 391) | async function showReviews(pluginId, author) {
  function Review (line 494) | function Review({
  function MoreInfo (line 541) | function MoreInfo({ purchased, price, refund }) {

FILE: src/pages/plugins/index.js
  function plugins (line 1) | function plugins(updates) {

FILE: src/pages/plugins/item.js
  function Item (line 17) | function Item({

FILE: src/pages/plugins/plugins.js
  function PluginsInclude (line 25) | function PluginsInclude(updates) {

FILE: src/pages/problems/index.js
  function plugin (line 1) | function plugin({ id, installed }, onInstall, onUninstall) {

FILE: src/pages/problems/problems.js
  function Problems (line 9) | function Problems() {

FILE: src/pages/quickTools/index.js
  function QuickToolsSettings (line 1) | async function QuickToolsSettings() {

FILE: src/pages/quickTools/quickTools.js
  function QuickTools (line 9) | function QuickTools() {
  class QuickToolsManager (line 43) | class QuickToolsManager {
    method constructor (line 44) | constructor() {
    method getContainer (line 53) | getContainer() {
    method render (line 57) | render() {
    method createItemElement (line 128) | createItemElement(itemDef, index, type) {
    method bindEvents (line 155) | bindEvents() {
    method handleTouchStart (line 171) | handleTouchStart(e) {
    method handleTouchMove (line 187) | handleTouchMove(e) {
    method handleTouchEnd (line 207) | handleTouchEnd(e) {
    method handleMouseDown (line 223) | handleMouseDown(e) {
    method startDrag (line 268) | startDrag(el, pointer) {
    method updateDrag (line 301) | updateDrag(pointer) {
    method cleanupHighlight (line 322) | cleanupHighlight() {
    method endDrag (line 327) | endDrag() {
    method swapItems (line 350) | swapItems(srcIndex, destIndex) {
    method replaceItem (line 360) | replaceItem(slotIndex, newItemId) {
    method handleClick (line 366) | async handleClick(el) {
    method destroy (line 384) | destroy() {

FILE: src/pages/sponsor/index.js
  function Sponsor (line 5) | function Sponsor(onclose) {

FILE: src/pages/sponsor/sponsor.js
  function Sponsor (line 20) | function Sponsor(onclose) {
  function handlePurchase (line 186) | async function handlePurchase(productId, title) {
  function onlyTitle (line 281) | function onlyTitle(title) {

FILE: src/pages/sponsors/index.js
  function Sponsors (line 1) | function Sponsors() {

FILE: src/pages/sponsors/sponsors.js
  function Sponsors (line 11) | function Sponsors() {
  function SponsorCard (line 183) | function SponsorCard({ name, image, website, tier, tagline }) {
  function handleLinkClick (line 210) | function handleLinkClick(e) {

FILE: src/pages/themeSetting/index.js
  function themeSetting (line 1) | function themeSetting(...args) {

FILE: src/pages/themeSetting/themeSetting.js
  function destroyPreview (line 35) | function destroyPreview(context) {
  function createPreview (line 46) | function createPreview(themeId) {
  function renderAppThemes (line 96) | function renderAppThemes() {
  function renderEditorThemes (line 136) | function renderEditorThemes() {
  function clickHandler (line 169) | function clickHandler(e) {
  function setAppTheme (line 189) | async function setAppTheme(theme, buy) {
  function setEditorTheme (line 215) | function setEditorTheme({ caption, theme }) {
  function updateCheckedItem (line 245) | function updateCheckedItem(theme) {
  function Item (line 250) | function Item({ name, swatches, onclick, isCurrent, isPremium }) {
  function createSwatchPreview (line 281) | function createSwatchPreview(swatches) {
  function getAppThemeSwatches (line 307) | function getAppThemeSwatches(theme) {
  function getEditorThemeSwatches (line 319) | function getEditorThemeSwatches(themeId) {

FILE: src/pages/welcome/welcome.js
  function openWelcomeTab (line 10) | function openWelcomeTab() {
  function createWelcomeContent (line 42) | function createWelcomeContent() {
  function ActionRow (line 148) | function ActionRow({ icon, label, shortcut, onClick }) {
  function LinkItem (line 161) | function LinkItem({ icon, label, url }) {

FILE: src/palettes/changeEditorTheme/index.js
  function changeEditorTheme (line 5) | function changeEditorTheme() {
  function generateHints (line 9) | function generateHints() {
  function onselect (line 23) | function onselect(themeId) {

FILE: src/palettes/changeEncoding/index.js
  function changeEncoding (line 6) | function changeEncoding() {
  function generateHints (line 10) | function generateHints() {
  function reopenWithNewEncoding (line 24) | async function reopenWithNewEncoding(encoding) {

FILE: src/palettes/changeMode/index.js
  function changeMode (line 6) | function changeMode() {
  function generateHints (line 10) | function generateHints() {
  function onselect (line 40) | function onselect(mode) {

FILE: src/palettes/changeTheme/index.js
  function changeTheme (line 9) | function changeTheme(type = "editor") {
  function generateHints (line 18) | function generateHints(type) {
  function syncSystemTheme (line 48) | function syncSystemTheme() {
  function startSystemThemeWatcher (line 58) | function startSystemThemeWatcher() {
  function stopSystemThemeWatcher (line 63) | function stopSystemThemeWatcher() {
  function updateSystemThemeWatcher (line 69) | function updateSystemThemeWatcher(theme) {
  function onselect (line 81) | function onselect(value) {

FILE: src/palettes/commandPalette/index.js
  function commandPalette (line 5) | async function commandPalette() {
  function RecentlyUsedCommands (line 40) | function RecentlyUsedCommands() {

FILE: src/palettes/findFile/index.js
  function findFile (line 14) | async function findFile() {
  function hintItem (line 59) | function hintItem(name, path, url) {
  function onAddFile (line 77) | function onAddFile({ name, url, path: visiblePath }) {
  function onRemoveFile (line 81) | function onRemoveFile({ name, url, path: visiblePath }) {

FILE: src/plugins/auth/src/android/Authenticator.java
  class Authenticator (line 12) | public class Authenticator extends CordovaPlugin {
    method pluginInitialize (line 19) | @Override
    method execute (line 25) | @Override
    method logout (line 51) | private void logout(CallbackContext callbackContext) {
    method isLoggedIn (line 57) | private void isLoggedIn(CallbackContext callbackContext) {
    method getUserInfo (line 85) | private void getUserInfo(CallbackContext callbackContext) {
    method validateToken (line 113) | private String validateToken(String token) {

FILE: src/plugins/auth/src/android/EncryptedPreferenceManager.java
  class EncryptedPreferenceManager (line 10) | public class EncryptedPreferenceManager {
    method EncryptedPreferenceManager (line 17) | public EncryptedPreferenceManager(Context context, String prefName) {
    method setString (line 37) | public void setString(String key, String value) {
    method getString (line 41) | public String getString(String key, String defaultValue) {
    method setInt (line 45) | public void setInt(String key, int value) {
    method getInt (line 49) | public int getInt(String key, int defaultValue) {
    method remove (line 53) | public void remove(String key) {
    method exists (line 57) | public boolean exists(String key) {
    method clear (line 61) | public void clear() {

FILE: src/plugins/browser/android/com/foxdebug/browser/Browser.java
  class Browser (line 56) | public class Browser extends LinearLayout {
    method Browser (line 88) | public Browser(Context context, Ui.Theme theme, Boolean onlyConsole) {
    method init (line 102) | public void init() {
    method createMenu (line 232) | private void createMenu() {
    method createDeviceEmulatorLayout (line 311) | private void createDeviceEmulatorLayout() {
    method setTextViewProperties (line 325) | private void setTextViewProperties(TextView textView, int height) {
    method setDesktopMode (line 341) | private void setDesktopMode(boolean enabled) {
    method setDesktopMode (line 366) | public void setDesktopMode() {
    method setUrl (line 374) | public void setUrl(String url) {
    method setTitle (line 381) | public void setTitle(String title) {
    method setFavicon (line 386) | public void setFavicon(Bitmap icon) {
    method setConsoleVisible (line 390) | public void setConsoleVisible(boolean visible) {
    method setProgressBarVisible (line 397) | public void setProgressBarVisible(boolean visible) {
    method updateViewportDimension (line 401) | private void updateViewportDimension(int width, int height) {
    method fitWebViewTo (line 420) | private void fitWebViewTo(int width, int height, float scale) {
    method styleIcon (line 434) | private void styleIcon(ImageView view) {
    method keyboardVisible (line 449) | private void keyboardVisible(boolean visible) {
    method goBack (line 463) | public boolean goBack() {
    method createTextView (line 479) | private TextView createTextView(String text) {
    method createEditText (line 486) | private EditText createEditText(String text) {
    method createTile (line 546) | private LinearLayout createTile() {
    method createTile (line 550) | private LinearLayout createTile(int height) {
    method createIconButton (line 562) | private ImageButton createIconButton(String icon) {
    method createIconButton (line 568) | private ImageButton createIconButton(Bitmap icon) {
    method createIcon (line 575) | private ImageView createIcon(String code) {
    method exit (line 583) | public void exit() {
  class BrowserChromeClient (line 599) | class BrowserChromeClient extends WebChromeClient {
    method BrowserChromeClient (line 603) | public BrowserChromeClient(Browser browser) {
    method onReceivedTitle (line 608) | @Override
    method onReceivedIcon (line 614) | @Override
    method onShowFileChooser (line 620) | public boolean onShowFileChooser(
  class BrowserWebViewClient (line 659) | class BrowserWebViewClient extends WebViewClient {
    method BrowserWebViewClient (line 663) | public BrowserWebViewClient(Browser browser) {
    method shouldOverrideUrlLoading (line 668) | @Override
    method onPageStarted (line 675) | @Override
    method onPageFinished (line 681) | @Override
    method onLoadResource (line 760) | @Override

FILE: src/plugins/browser/android/com/foxdebug/browser/BrowserActivity.java
  class BrowserActivity (line 16) | public class BrowserActivity extends Activity {
    method onCreate (line 21) | @Override
    method onBackPressed (line 43) | @Override
    method setSystemTheme (line 52) | private void setSystemTheme(int systemBarColor) {
    method setStatusBarStyle (line 98) | private void setStatusBarStyle(final Window window) {
    method setNavigationBarStyle (line 111) | private void setNavigationBarStyle(final Window window) {
    method onActivityResult (line 122) | @Override

FILE: src/plugins/browser/android/com/foxdebug/browser/Emulator.java
  class Emulator (line 19) | public class Emulator extends LinearLayout {
    class Callback (line 32) | public abstract static class Callback {
      method onChange (line 34) | public abstract void onChange(int width, int height, float scale);
    method Emulator (line 37) | public Emulator(Context context, Ui.Theme theme) {
    method setChangeListener (line 123) | public void setChangeListener(Callback listener) {
    method setReference (line 127) | public void setReference(View view) {
    method getWidthProgress (line 171) | public int getWidthProgress() {
    method getHeightProgress (line 175) | public int getHeightProgress() {
    method getScaleProgress (line 179) | public float getScaleProgress() {
    method addControl (line 183) | private void addControl(String id, int height, String label) {
    method selectDevice (line 265) | private void selectDevice(Device device) {
    method setMaxScale (line 305) | private void setMaxScale(int width, int height) {
  class Device (line 321) | class Device {
    method Device (line 331) | public Device(
    method Device (line 346) | public Device(String name, int width, int height, String icon) {
    method Device (line 350) | public Device(String name, int width, int height) {
    method select (line 354) | public void select() {
    method deselect (line 360) | public void deselect() {
  class DeviceListView (line 367) | class DeviceListView extends ScrollView {
    class Callback (line 375) | public abstract static class Callback {
      method onSelect (line 377) | public abstract void onSelect(Device device);
    method DeviceListView (line 380) | public DeviceListView(Context context, Ui.Theme theme) {
    method add (line 397) | public void add(Device... devices) {
    method select (line 403) | public void select(Device device) {
    method add (line 409) | public void add(Device device) {
    method setOnSelect (line 429) | public void setOnSelect(Callback callback) {
  class DeviceView (line 434) | class DeviceView extends LinearLayout {
    class Callback (line 443) | public abstract static class Callback {
      method onSelect (line 445) | public abstract void onSelect(DeviceView device);
    method DeviceView (line 448) | public DeviceView(Context context, Device device, Ui.Theme theme) {
    method setOnSelect (line 480) | public void setOnSelect(Callback callback) {
    method deselect (line 492) | public void deselect() {
    method select (line 500) | public void select() {

FILE: src/plugins/browser/android/com/foxdebug/browser/Menu.java
  class Menu (line 21) | public class Menu extends PopupWindow {
    class Callback (line 32) | public abstract static class Callback {
      method onSelect (line 34) | public abstract void onSelect(String action, Boolean checked);
    method Menu (line 37) | public Menu(Context context, Ui.Theme theme) {
    method setCallback (line 75) | public void setCallback(Callback callback) {
    method addItem (line 79) | public void addItem(String icon, String text) {
    method addItem (line 83) | public void addItem(String icon, String text, Boolean toggle) {
    method setChecked (line 107) | public void setChecked(String action, Boolean checked) {
    method setVisible (line 117) | public void setVisible(String action, Boolean visible) {
    method show (line 127) | public void show(View view) {
    method hide (line 133) | public void hide() {
  class MenuItemCallback (line 138) | abstract class MenuItemCallback {
    method onClick (line 140) | public abstract void onClick(MenuItem menuItem);
  class MenuItem (line 143) | class MenuItem extends LinearLayout {
    method MenuItem (line 159) | public MenuItem(Menu menu, String action) {
    method setPadding (line 184) | public void setPadding() {
    method setIcon (line 188) | public void setIcon(String icon, int iconColor) {
    method setText (line 202) | public void setText(String text, int color) {
    method setChecked (line 217) | public void setChecked(boolean checked) {
    method setOnClickListener (line 252) | public void setOnClickListener(MenuItemCallback listener) {

FILE: src/plugins/browser/android/com/foxdebug/browser/Plugin.java
  class Plugin (line 11) | public class Plugin extends CordovaPlugin {
    method execute (line 13) | @Override

FILE: src/plugins/browser/index.js
  constant SERVICE (line 4) | const SERVICE = 'Browser';
  function open (line 6) | function open(url, isConsole = false) {

FILE: src/plugins/browser/utils/updatePackage.js
  function replaceImport (line 16) | function replaceImport(filePath, appName) {

FILE: src/plugins/cordova-plugin-buildinfo/scripts/after_install.js
  function installWindows (line 30) | function installWindows(windowsPath) {

FILE: src/plugins/cordova-plugin-buildinfo/scripts/before_uninstall.js
  function uninstallWindows (line 30) | function uninstallWindows(context, windowsPath) {

FILE: src/plugins/cordova-plugin-buildinfo/scripts/browser_after_prepare.js
  function rewriteBuildInfoProxy (line 30) | function rewriteBuildInfoProxy(context, pathPrefix) {

FILE: src/plugins/cordova-plugin-buildinfo/src/android/BuildInfo.java
  class BuildInfo (line 47) | public class BuildInfo extends CordovaPlugin {
    method BuildInfo (line 58) | public BuildInfo() {
    method execute (line 69) | public boolean execute(String action, JSONArray args, CallbackContext ...
    method init (line 89) | private void init(String buildConfigClassName, CallbackContext callbac...
    method getClassFieldBoolean (line 186) | private static boolean getClassFieldBoolean(Class c, String fieldName,...
    method getClassFieldString (line 208) | private static String getClassFieldString(Class c, String fieldName, S...
    method getClassFieldInt (line 230) | private static int getClassFieldInt(Class c, String fieldName, int def...
    method getClassFieldLong (line 252) | private static long getClassFieldLong(Class c, String fieldName, long ...
    method getClassField (line 273) | private static Field getClassField(Class c, String fieldName) {
    method convertLongToDateTimeString (line 285) | private static String convertLongToDateTimeString(long mills) {

FILE: src/plugins/cordova-plugin-buildinfo/www/buildinfo.js
  function _buldinfoCheckCordovaPlatform (line 43) | function _buldinfoCheckCordovaPlatform() {
  function _findBaseUrl (line 49) | function _findBaseUrl() {

FILE: src/plugins/custom-tabs/src/CustomTabsPlugin.java
  class CustomTabsPlugin (line 15) | public class CustomTabsPlugin extends CordovaPlugin {
    method execute (line 17) | @Override
    method openCustomTab (line 51) | private void openCustomTab(String url, JSONObject options) {

FILE: src/plugins/ftp/index.d.ts
  type FtpOptions (line 1) | interface FtpOptions {
  type SuccessCallback (line 7) | type SuccessCallback = (res: any) => void;
  type ErrorCallback (line 8) | type ErrorCallback = (err: any) => void;
  type Ftp (line 10) | interface Ftp{

FILE: src/plugins/ftp/src/android/com/foxdebug/ftp/Ftp.java
  class Ftp (line 38) | public class Ftp extends CordovaPlugin {
    method initialize (line 45) | public void initialize(CordovaInterface cordova, CordovaWebView webVie...
    method execute (line 51) | public boolean execute(
    method connect (line 77) | public void connect(JSONArray args, CallbackContext callback) {
    method connect (line 81) | public void connect(
    method getBaseName (line 187) | private static String getBaseName(String path) {
    method getParentPath (line 196) | private static String getParentPath(String path) {
    method listDirectory (line 205) | public void listDirectory(JSONArray args, CallbackContext callback) {
    method exists (line 318) | public void exists(JSONArray args, CallbackContext callback) {
    method sendNoOp (line 368) | public void sendNoOp(JSONArray args, CallbackContext callback) {
    method deleteFile (line 391) | public void deleteFile(JSONArray args, CallbackContext callback) {
    method deleteDirectory (line 431) | public void deleteDirectory(JSONArray args, CallbackContext callback) {
    method rename (line 474) | public void rename(JSONArray args, CallbackContext callback) {
    method downloadFile (line 561) | public void downloadFile(JSONArray args, CallbackContext callback) {
    method uploadFile (line 648) | public void uploadFile(JSONArray args, CallbackContext callback) {
    method getKeepAlive (line 726) | public void getKeepAlive(JSONArray args, CallbackContext callback) {
    method execCommand (line 755) | public void execCommand(JSONArray args, CallbackContext callback) {
    method isConnected (line 794) | public void isConnected(JSONArray args, CallbackContext callback) {
    method disconnect (line 825) | public void disconnect(JSONArray args, CallbackContext callback) {
    method createDirectory (line 849) | public void createDirectory(JSONArray args, CallbackContext callback) {
    method changeDirectory (line 887) | public void changeDirectory(JSONArray args, CallbackContext callback) {
    method changeToParentDirectory (line 925) | public void changeToParentDirectory(
    method getWorkingDirectory (line 960) | public void getWorkingDirectory(JSONArray args, CallbackContext callba...
    method getStat (line 992) | public void getStat(JSONArray args, CallbackContext callback) {
    method getFtpId (line 1065) | private String getFtpId(String host, int port, String username) {
    method errMessage (line 1069) | private String errMessage(Exception e) {
    method emptyDirectory (line 1078) | private void emptyDirectory(String directory, FTPClient client)
    method joinPath (line 1097) | private String joinPath(String p1, String p2) {

FILE: src/plugins/iap/index.d.ts
  type Iap (line 1) | interface Iap {

FILE: src/plugins/iap/src/com/foxdebug/iap/Iap.java
  class Iap (line 37) | public class Iap extends CordovaPlugin {
    method initialize (line 44) | public void initialize(CordovaInterface cordova, CordovaWebView webVie...
    method execute (line 51) | @Override
    method getBillingClient (line 106) | private BillingClient getBillingClient() {
    method setPurchaseUpdatedListener (line 143) | private void setPurchaseUpdatedListener(CallbackContext callbackContex...
    method consume (line 147) | private void consume(String token, CallbackContext callbackContext) {
    method startConnection (line 169) | private void startConnection(CallbackContext callbackContext) {
    method getProducts (line 195) | private void getProducts(
    method purchase (line 261) | private void purchase(String productIdOrJson, CallbackContext callback...
    method getPurchases (line 322) | private void getPurchases(CallbackContext callbackContext) {
    method acknowledgePurchase (line 358) | private void acknowledgePurchase(
    method purchaseToJson (line 387) | private JSONObject purchaseToJson(Purchase purchase) throws JSONExcept...
    method sendPurchasePluginResult (line 405) | private void sendPurchasePluginResult(PluginResult result) {
    method getString (line 412) | private String getString(JSONArray args, int index) {
    method getStringList (line 420) | private List<String> getStringList(JSONArray args, int index) {

FILE: src/plugins/pluginContext/src/android/Tee.java
  class Tee (line 23) | public class Tee extends CordovaPlugin {
    method initialize (line 39) | public void initialize(CordovaInterface cordova, CordovaWebView webVie...
    method execute (line 44) | @Override
    method getPluginIdFromToken (line 130) | private String getPluginIdFromToken(String token) {
    method isTokenValid (line 141) | public boolean isTokenValid(String token, String pluginId) {
    method grantedPermission (line 147) | public boolean grantedPermission(String token, String permission) {
    method listAllPermissions (line 152) | public List<String> listAllPermissions(String token) {
    method handleTokenRequest (line 164) | private synchronized void handleTokenRequest(

FILE: src/plugins/pluginContext/www/PluginContext.js
  class _PluginContext (line 5) | class _PluginContext {
    method constructor (line 6) | constructor(uuid) {
    method toString (line 12) | toString() {
    method grantedPermission (line 23) | grantedPermission(permission) {
    method listAllPermissions (line 32) | listAllPermissions() {
    method getSecret (line 38) | getSecret(key, defaultValue = "") {
    method setSecret (line 51) | setSecret(key, value) {
  method [Symbol.toPrimitive] (line 16) | [Symbol.toPrimitive](hint) {
  function requestToken (line 71) | function requestToken(pluginId) {

FILE: src/plugins/sdcard/index.d.ts
  type Storage (line 1) | interface Storage {
  type DirListItem (line 12) | interface DirListItem {
  type Stats (line 20) | interface Stats {
  type DocumentFile (line 34) | interface DocumentFile {
  type SDcard (line 42) | interface SDcard {

FILE: src/plugins/sdcard/src/android/SDcard.java
  class SDcard (line 44) | public class SDcard extends CordovaPlugin {
    method initialize (line 62) | public void initialize(CordovaInterface cordova, CordovaWebView webVie...
    method execute (line 72) | public boolean execute(
    method formatUri (line 163) | private String formatUri(String filename) {
    method watchFile (line 177) | private void watchFile(
    method unwatchFile (line 208) | private void unwatchFile(String id) {
    method openDocumentFile (line 215) | public void openDocumentFile(String mimeType, CallbackContext callback) {
    method getImage (line 225) | public void getImage(String mimeType, CallbackContext callback) {
    method getStorageVolumes (line 234) | public void getStorageVolumes(CallbackContext callback) {
    method getStorageAccess (line 278) | public void getStorageAccess(String SDCardUUID, CallbackContext callba...
    method onActivityResult (line 309) | public void onActivityResult(int requestCode, int resultCode, Intent d...
    method readFile (line 406) | private void readFile(String filename, CallbackContext callback) {
    method writeFile (line 439) | private void writeFile(
    method createDir (line 488) | private void createDir(String parent, String name, CallbackContext cal...
    method createFile (line 492) | private void createFile(
    method create (line 506) | private void create(
    method rename (line 567) | private void rename(
    method delete (line 612) | private void delete(String filename, CallbackContext callback) {
    method move (line 641) | private void move(String src, String dest, final CallbackContext callb...
    method copy (line 674) | private void copy(String src, String dest, final CallbackContext callb...
    method copy (line 703) | private Uri copy(String root, String srcId, String destId)
    method copyFile (line 749) | private Uri copyFile(DocumentFile src, DocumentFile dest)
    method listDir (line 780) | private void listDir(String src, String parentId, CallbackContext call...
    method isDirectory (line 867) | private boolean isDirectory(String mimeType) {
    method getStats (line 871) | private void getStats(String filename, CallbackContext callback) {
    method getUri (line 904) | private Uri getUri(String src, String docId) {
    method exists (line 911) | private void exists(String path, CallbackContext callback) {
    method error (line 925) | private void error(String err, CallbackContext callback) {
    method getPath (line 929) | private void getPath(String uriString, String src, CallbackContext cal...
    method geRelativeDocumentFile (line 950) | private DocumentFile geRelativeDocumentFile(String uri, String filenam...
    method getFile (line 975) | private DocumentFile getFile(Uri uri) {
    method getFile (line 979) | private DocumentFile getFile(String filePath) {
    method takePermission (line 993) | private void takePermission(Uri uri) {
    method canWrite (line 1002) | public boolean canWrite(Uri uri) {
  class MyFileObserver (line 1023) | class MyFileObserver extends FileObserver {
    method MyFileObserver (line 1029) | public MyFileObserver(String path, CallbackContext listener) {
    method MyFileObserver (line 1035) | public MyFileObserver(File file, CallbackContext listener) {
    method onEvent (line 1041) | @Override
    method startObserving (line 1049) | public void startObserving() {
    method stopObserving (line 1053) | public void stopObserving() {

FILE: src/plugins/server/index.d.ts
  type Server (line 1) | interface Server{

FILE: src/plugins/server/src/android/com/foxdebug/server/NanoHTTPDWebserver.java
  class NanoHTTPDWebserver (line 24) | public class NanoHTTPDWebserver extends NanoHTTPD {
    method NanoHTTPDWebserver (line 30) | public NanoHTTPDWebserver(int port, Context context) {
    method getBodyText (line 36) | private String getBodyText(IHTTPSession session) {
    method createJSONRequest (line 62) | private JSONObject createJSONRequest(String requestId, IHTTPSession se...
    method getContentType (line 74) | private String getContentType(JSONObject responseObject)
    method newFixedFileResponse (line 86) | private Response newFixedFileResponse(DocumentFile file, String mime)
    method serveFile (line 100) | Response serveFile(
    method serve (line 243) | @Override
    method getFile (line 318) | private DocumentFile getFile(String filePath) {
    method getInputStream (line 332) | private InputStream getInputStream(DocumentFile file)
    method getJSONObject (line 339) | private JSONObject getJSONObject(JSONObject ob, String key) {

FILE: src/plugins/server/src/android/com/foxdebug/server/Server.java
  class Server (line 9) | public class Server extends CordovaPlugin {
    method initialize (line 13) | @Override
    method execute (line 19) | @Override
    method start (line 55) | private void start(JSONArray args, CallbackContext callbackContext)
    method setOnRequestHandler (line 81) | private void setOnRequestHandler(
    method stop (line 101) | private void stop(JSONArray args, CallbackContext callbackContext)
    method send (line 121) | private void send(JSONArray args, CallbackContext callbackContext)

FILE: src/plugins/sftp/index.d.ts
  type Stats (line 1) | interface Stats {
  type ExecResult (line 15) | interface ExecResult{
  type Sftp (line 20) | interface Sftp {

FILE: src/plugins/sftp/src/com/foxdebug/sftp/Sftp.java
  class Sftp (line 47) | public class Sftp extends CordovaPlugin {
    method initialize (line 56) | public void initialize(CordovaInterface cordova, CordovaWebView webVie...
    method execute (line 63) | public boolean execute(
    method connectUsingPassword (line 90) | public void connectUsingPassword(JSONArray args, CallbackContext callb...
    method connectUsingKeyFile (line 164) | public void connectUsingKeyFile(JSONArray args, CallbackContext callba...
    method exec (line 275) | public void exec(JSONArray args, CallbackContext callback) {
    method getFile (line 302) | public void getFile(JSONArray args, CallbackContext callback) {
    method putFile (line 356) | public void putFile(JSONArray args, CallbackContext callback) {
    method lsDir (line 409) | public void lsDir(JSONArray args, CallbackContext callback) {
    method stat (line 485) | public void stat(JSONArray args, CallbackContext callback) {
    method mkdir (line 569) | public void mkdir(JSONArray args, CallbackContext callback) {
    method rm (line 591) | public void rm(JSONArray args, CallbackContext callback) {
    method createFile (line 616) | public void createFile(JSONArray args, CallbackContext callback) {
    method rename (line 660) | public void rename(JSONArray args, CallbackContext callback) {
    method pwd (line 684) | public void pwd(JSONArray args, CallbackContext callback) {
    method sanitizePath (line 705) | private String sanitizePath(String path) {
    method close (line 725) | public void close(JSONArray args, CallbackContext callback) {
    method isConnected (line 747) | public void isConnected(JSONArray args, CallbackContext callback) {
    method errMessage (line 769) | public String errMessage(Exception e) {

FILE: src/plugins/system/android/com/foxdebug/system/RewardPassManager.java
  class RewardPassManager (line 13) | public class RewardPassManager {
    method RewardPassManager (line 24) | public RewardPassManager(Context context) {
    method getRewardStatus (line 28) | public String getRewardStatus() throws JSONException {
    method redeemReward (line 40) | public String redeemReward(String offerId) throws JSONException {
    method loadRewardState (line 76) | private JSONObject loadRewardState() {
    method defaultRewardState (line 90) | private JSONObject defaultRewardState() {
    method mergeRewardState (line 103) | private JSONObject mergeRewardState(JSONObject parsed) {
    method saveRewardState (line 116) | private void saveRewardState(JSONObject state) {
    method syncRewardState (line 120) | private JSONObject syncRewardState(JSONObject state) throws JSONExcept...
    method buildRewardStatus (line 140) | private JSONObject buildRewardStatus(JSONObject state) throws JSONExce...
    method getRedeemDisabledReason (line 165) | private String getRedeemDisabledReason(int remainingRedemptions, long ...
    method resolveRewardDuration (line 175) | private long resolveRewardDuration(String offerId) throws JSONException {
    method getTodayKey (line 186) | private String getTodayKey() {

FILE: src/plugins/system/android/com/foxdebug/system/SoftInputAssist.java
  class SoftInputAssist (line 12) | public class SoftInputAssist {
    method SoftInputAssist (line 16) | public SoftInputAssist(Activity activity) {

FILE: src/plugins/system/android/com/foxdebug/system/System.java
  class System (line 115) | public class System extends CordovaPlugin {
    method initialize (line 130) | public void initialize(CordovaInterface cordova, CordovaWebView webVie...
    method execute (line 171) | public boolean execute(
    method sendLogToJavaScript (line 606) | private void sendLogToJavaScript(String level, String message) {
    method getMimeTypeFromExtension (line 622) | private String getMimeTypeFromExtension(String fileName) {
    method getConfiguration (line 633) | private void getConfiguration(CallbackContext callback) {
    method decode (line 664) | private void decode(
    method encode (line 686) | private void encode(
    method compareFileText (line 716) | private void compareFileText(
    method compareTexts (line 846) | private void compareTexts(
    method getAvailableEncodings (line 873) | private void getAvailableEncodings(CallbackContext callback) {
    method requestPermissions (line 891) | private void requestPermissions(JSONArray arr, CallbackContext callbac...
    method requestPermission (line 915) | private void requestPermission(String permission, CallbackContext call...
    method hasPermission (line 935) | private void hasPermission(String permission, CallbackContext callback) {
    method fileExists (line 948) | public boolean fileExists(String path, String countSymlinks) {
    method createSymlink (line 978) | public boolean createSymlink(String target, String linkPath) {
    method getNativeLibraryPath (line 992) | public String getNativeLibraryPath() {
    method getFilesDir (line 997) | public String getFilesDir() {
    method getParentPath (line 1001) | public String getParentPath(String path) {
    method listChildren (line 1007) | public JSONArray listChildren(String path) throws JSONException {
    method onRequestPermissionResult (line 1021) | public void onRequestPermissionResult(
    method checkPermissions (line 1054) | private String[] checkPermissions(JSONArray arr) throws Exception {
    method getAndroidVersion (line 1074) | private void getAndroidVersion(CallbackContext callback) {
    method getWebkitInfo (line 1078) | private void getWebkitInfo(CallbackContext callback) {
    method isPowerSaveMode (line 1121) | private void isPowerSaveMode(CallbackContext callback) {
    method pinFileShortcut (line 1130) | private void pinFileShortcut(JSONObject shortcutJson, CallbackContext ...
    method getFileShortcutIcon (line 1234) | private IconCompat getFileShortcutIcon(String filename) {
    method createFileShortcutBitmap (line 1242) | private Bitmap createFileShortcutBitmap(String filename) {
    method getFileExtension (line 1278) | private String getFileExtension(String filename) {
    method getShortcutLabel (line 1285) | private String getShortcutLabel(String filename) {
    method pickShortcutColor (line 1361) | private int pickShortcutColor(String filename) {
    method fileAction (line 1433) | private void fileAction(
    method getAppInfo (line 1535) | private void getAppInfo(CallbackContext callback) {
    method openInBrowser (line 1559) | private void openInBrowser(String src, CallbackContext callback) {
    method launchApp (line 1564) | private void launchApp(
    method addShortcut (line 1620) | private void addShortcut(
    method pinShortcut (line 1661) | private void pinShortcut(String id, CallbackContext callback) {
    method removeShortcut (line 1694) | private void removeShortcut(String id, CallbackContext callback) {
    method setUiTheme (line 1705) | private void setUiTheme(
    method applySystemBarTheme (line 1726) | private void applySystemBarTheme() {
    method setStatusBarStyle (line 1757) | private void setStatusBarStyle(final Window window) {
    method setNavigationBarStyle (line 1786) | private void setNavigationBarStyle(final Window window) {
    method deprecatedFlagUiLightStatusBar (line 1815) | private int deprecatedFlagUiLightStatusBar() {
    method getDeprecatedSystemUiVisibility (line 1819) | private int getDeprecatedSystemUiVisibility(View decorView) {
    method setDeprecatedSystemUiVisibility (line 1823) | private void setDeprecatedSystemUiVisibility(View decorView, int visib...
    method getCordovaIntent (line 1827) | private void getCordovaIntent(CallbackContext callback) {
    method setIntentHandler (line 1834) | private void setIntentHandler(CallbackContext callback) {
    method onNewIntent (line 1841) | @Override
    method getIntentJson (line 1853) | private JSONObject getIntentJson(Intent intent) {
    method getExtrasJson (line 1867) | private JSONObject getExtrasJson(Bundle extras) {
    method getContentProviderUri (line 1898) | private Uri getContentProviderUri(String fileUri) {
    method getContentProviderUri (line 1902) | private Uri getContentProviderUri(String fileUri, String filename) {
    method ensureShareableCopy (line 1940) | private File ensureShareableCopy(File source, String displayName) thro...
    method ensureUniqueFile (line 1962) | private File ensureUniqueFile(File target) {
    method copyFile (line 1985) | private void copyFile(File source, File destination) throws IOException {
    method grantUriPermissions (line 1999) | private void grantUriPermissions(Intent intent, Uri uri, int flags) {
    method resolveMimeType (line 2009) | private String resolveMimeType(String currentMime, Uri uri, String fil...
    method getFileProviderAuthority (line 2033) | private String getFileProviderAuthority() {
    method isPackageInstalled (line 2067) | private boolean isPackageInstalled(
    method getGlobalSetting (line 2080) | private void getGlobalSetting(String setting, CallbackContext callback) {
    method clearCache (line 2088) | private void clearCache(CallbackContext callback) {
    method setInputType (line 2093) | private void setInputType(String type) {
    method setNativeContextMenuDisabled (line 2103) | private void setNativeContextMenuDisabled(boolean disabled) {

FILE: src/plugins/system/android/com/foxdebug/system/Ui.java
  class Ui (line 13) | public class Ui {
    class Icons (line 15) | public static class Icons {
      method get (line 40) | public static Bitmap get(
      method get (line 72) | public static Bitmap get(
      method get (line 82) | public static Bitmap get(Context context, String code) {
      method get (line 86) | public static Bitmap get(Context context, String code, String color) {
      method get (line 91) | public static Bitmap get(Context context, String code, int color) {
      method setSize (line 95) | public static void setSize(int size) {
      method setColor (line 99) | public static void setColor(int color) {
    class Theme (line 104) | public static class Theme {
      method Theme (line 108) | public Theme(JSONObject theme) {
      method get (line 112) | public int get(String color) {
      method get (line 116) | public int get(String color, String fallback) {
      method getType (line 121) | public String getType() {
    method dpToPixels (line 126) | public static int dpToPixels(Context context, int dipValue) {

FILE: src/plugins/system/system.d.ts
  type Info (line 1) | interface Info {
  type AppInfo (line 7) | interface AppInfo extends Info {
  type ShortCut (line 13) | interface ShortCut {
  type FileShortcut (line 22) | interface FileShortcut {
  type Intent (line 30) | interface Intent {
  type RewardStatus (line 40) | interface RewardStatus {
  type FileAction (line 58) | type FileAction = 'VIEW' | 'EDIT' | 'SEND' | 'RUN';
  type OnFail (line 59) | type OnFail = (err: string) => void;
  type OnSuccessBool (line 60) | type OnSuccessBool = (res: boolean) => void;
  type System (line 62) | interface System {
  type Window (line 300) | interface Window{

FILE: src/plugins/system/utils/changeProvider.js
  method changeProvider (line 2) | changeProvider(reset) {

FILE: src/plugins/terminal/src/android/AlpineDocumentProvider.java
  class AlpineDocumentProvider (line 25) | public class AlpineDocumentProvider extends DocumentsProvider {
    method queryRoots (line 54) | @Override
    method queryDocument (line 83) | @Override
    method queryChildDocuments (line 92) | @Override
    method openDocument (line 113) | @Override
    method openDocumentThumbnail (line 124) | @Override
    method onCreate (line 135) | @Override
    method createDocument (line 140) | @Override
    method deleteDocument (line 168) | @Override
    method renameDocument (line 176) | @Override
    method getDocumentType (line 203) | @Override
    method querySearchDocuments (line 209) | @Override
    method isChildDocument (line 259) | @Override
    method includeFile (line 271) | private void includeFile(MatrixCursor result, String docId, File file)...
    method isDocumentProviderEnabled (line 308) | public static boolean isDocumentProviderEnabled(Context context) {
    method setDocumentProviderEnabled (line 315) | public static void setDocumentProviderEnabled(Context context, boolean...
    method getDocIdForFile (line 337) | private static String getDocIdForFile(File file) {
    method getFileForDocId (line 344) | private static File getFileForDocId(String docId) throws FileNotFoundE...
    method getMimeType (line 352) | private static String getMimeType(File file) {
    method resolveLauncherIcon (line 368) | private int resolveLauncherIcon() {
    method getApplicationLabel (line 375) | private String getApplicationLabel() {

FILE: src/plugins/terminal/src/android/BackgroundExecutor.java
  class BackgroundExecutor (line 10) | public class BackgroundExecutor extends CordovaPlugin {
    method initialize (line 17) | @Override
    method execute (line 23) | @Override
    method exec (line 51) | private void exec(String cmd, boolean useAlpine, CallbackContext callb...
    method startProcess (line 67) | private void startProcess(String pid, String cmd, boolean useAlpine, C...
    method writeToProcess (line 100) | private void writeToProcess(String pid, String input, CallbackContext ...
    method stopProcess (line 114) | private void stopProcess(String pid, CallbackContext callbackContext) {
    method isProcessRunning (line 125) | private void isProcessRunning(String pid, CallbackContext callbackCont...
    method loadLibrary (line 137) | private void loadLibrary(String path, CallbackContext callbackContext) {
    method sendPluginResult (line 146) | private void sendPluginResult(CallbackContext ctx, String message, boo...
    method sendPluginMessage (line 152) | private void sendPluginMessage(String pid, String message) {
    method cleanup (line 159) | private void cleanup(String pid) {

FILE: src/plugins/terminal/src/android/Executor.java
  class Executor (line 36) | public class Executor extends CordovaPlugin {
    method askNotificationPermission (line 51) | private void askNotificationPermission(Activity context) {
    method initialize (line 73) | @Override
    method ensureServiceBound (line 88) | private boolean ensureServiceBound(CallbackContext callbackContext) {
    method bindServiceNow (line 118) | private boolean bindServiceNow(CallbackContext callbackContext) {
    method onServiceConnected (line 161) | @Override
    method onServiceDisconnected (line 172) | @Override
    class IncomingHandler (line 182) | private class IncomingHandler extends Handler {
      method handleMessage (line 183) | @Override
    method execute (line 226) | @Override
    method stopServiceNow (line 325) | private void stopServiceNow() {
    method startProcess (line 347) | private void startProcess(String pid, String cmd, String alpine) {
    method exec (line 373) | private void exec(String execId, String cmd, String alpine) {
    method writeToProcess (line 392) | private void writeToProcess(String pid, String input, CallbackContext ...
    method stopProcess (line 406) | private void stopProcess(String pid, CallbackContext callbackContext) {
    method isProcessRunning (line 419) | private void isProcessRunning(String pid) {
    method getCallbackContext (line 436) | private CallbackContext getCallbackContext(String id) {
    method cleanupCallback (line 440) | private void cleanupCallback(String id) {
    method onDestroy (line 444) | @Override

FILE: src/plugins/terminal/src/android/ProcessManager.java
  class ProcessManager (line 10) | public class ProcessManager {
    method ProcessManager (line 14) | public ProcessManager(Context context) {
    method createProcessBuilder (line 21) | public ProcessBuilder createProcessBuilder(String cmd, boolean useAlpi...
    method setupEnvironment (line 31) | private void setupEnvironment(Map<String, String> env) {
    method readStream (line 51) | public static String readStream(InputStream stream) throws IOException {
    method executeCommand (line 64) | public ExecResult executeCommand(String cmd, boolean useAlpine) throws...
    class ExecResult (line 78) | public static class ExecResult {
      method ExecResult (line 83) | public ExecResult(int exitCode, String stdout, String stderr) {
      method isSuccess (line 89) | public boolean isSuccess() {
      method getErrorMessage (line 93) | public String getErrorMessage() {

FILE: src/plugins/terminal/src/android/ProcessServer.java
  class ProcessServer (line 15) | class ProcessServer extends WebSocketServer {
    class ConnState (line 21) | private static final class ConnState {
      method ConnState (line 25) | ConnState(Process process, OutputStream stdin) {
    method ProcessServer (line 31) | ProcessServer(int port, String[] cmd) {
    method startAndAwait (line 36) | void startAndAwait() throws Exception {
    method onStart (line 43) | @Override
    method onError (line 48) | @Override
    method onOpen (line 59) | @Override
    method onMessage (line 84) | @Override
    method onMessage (line 93) | @Override
    method onClose (line 102) | @Override

FILE: src/plugins/terminal/src/android/ProcessUtils.java
  class ProcessUtils (line 7) | public class ProcessUtils {
    method getPid (line 12) | public static long getPid(Process process) {
    method isAlive (line 25) | public static boolean isAlive(Process process) {
    method killProcessTree (line 37) | public static void killProcessTree(Process process) {

FILE: src/plugins/terminal/src/android/StreamHandler.java
  class StreamHandler (line 5) | public class StreamHandler {
    type OutputListener (line 7) | public interface OutputListener {
      method onLine (line 8) | void onLine(String line);
    method streamOutput (line 14) | public static void streamOutput(InputStream inputStream, OutputListene...
    method writeToStream (line 27) | public static void writeToStream(OutputStream outputStream, String inp...

FILE: src/plugins/terminal/src/android/TerminalService.java
  class TerminalService (line 27) | public class TerminalService extends Service {
    method onCreate (line 54) | @Override
    method onBind (line 64) | @Override
    method onStartCommand (line 69) | @Override
    class ServiceHandler (line 91) | private class ServiceHandler extends Handler {
      method handleMessage (line 92) | @Override
    method toggleWakeLock (line 125) | private void toggleWakeLock() {
    method acquireWakeLock (line 134) | private void acquireWakeLock() {
    method releaseWakeLock (line 146) | private void releaseWakeLock() {
    method startProcess (line 153) | private void startProcess(String pid, String cmd, boolean useAlpine) {
    method exec (line 193) | private void exec(String execId, String cmd, boolean useAlpine) {
    method sendMessageToClient (line 212) | private void sendMessageToClient(String id, String action, String data) {
    method sendExecResultToClient (line 229) | private void sendExecResultToClient(String id, boolean isSuccess, Stri...
    method writeToProcess (line 247) | private void writeToProcess(String pid, String input) {
    method stopProcess (line 258) | private void stopProcess(String pid) {
    method isProcessRunning (line 266) | private void isProcessRunning(String pid, Messenger clientMessenger) {
    method cleanup (line 285) | private void cleanup(String id) {
    method createNotificationChannel (line 291) | private void createNotificationChannel() {
    method updateNotification (line 305) | private void updateNotification() {
    method onDestroy (line 333) | @Override
    method resolveDrawableId (line 349) | private int resolveDrawableId(String... names) {

FILE: src/plugins/terminal/www/Executor.js
  class Executor (line 11) | class Executor {
    method constructor (line 12) | constructor(BackgroundExecutor = false) {
    method spawnStream (line 23) | spawnStream(cmd, callback, onError) {
    method start (line 60) | start(command, onData, alpine = false) {
    method write (line 100) | write(uuid, input) {
    method moveToBackground (line 115) | moveToBackground() {
    method moveToForeground (line 129) | moveToForeground() {
    method stop (line 144) | stop(uuid) {
    method isRunning (line 159) | isRunning(uuid) {
    method stopService (line 183) | stopService() {
    method execute (line 202) | execute(command, alpine = false) {
    method loadLibrary (line 217) | loadLibrary(path) {

FILE: src/plugins/terminal/www/Terminal.js
  method startAxs (line 11) | async startAxs(installing = false, logger = console.log, err_logger = co...
  method stopAxs (line 73) | async stopAxs() {
  method isAxsRunning (line 81) | async isAxsRunning() {
  method install (line 105) | async install(logger = console.log, err_logger = console.error) {
  method isInstalled (line 263) | isInstalled() {
  method isSupported (line 301) | isSupported() {
  method backup (line 324) | backup() {
  method restore (line 366) | restore() {
  method uninstall (line 414) | uninstall() {
  function readAsset (line 446) | function readAsset(assetPath, callback) {

FILE: src/plugins/websocket/src/android/WebSocketInstance.java
  class WebSocketInstance (line 20) | public class WebSocketInstance extends WebSocketListener {
    method WebSocketInstance (line 35) | public WebSocketInstance(String url, JSONArray protocols, JSONObject h...
    method setCallback (line 71) | public void setCallback(CallbackContext callbackContext) {
    method send (line 78) | public void send(String message, boolean isBinary) {
    method sendBinary (line 95) | private void sendBinary(String base64Data) {
    method close (line 100) | public String close(int code, String reason) {
    method close (line 124) | public String close() {
    method onOpen (line 130) | @Override
    method onMessage (line 140) | @Override
    method onMessage (line 147) | @Override
    method onClosing (line 164) | @Override
    method onClosed (line 171) | @Override
    method onFailure (line 187) | @Override
    method setBinaryType (line 194) | public void setBinaryType(String binaryType) {
    method sendEvent (line 198) | private void sendEvent(String type, String data, boolean isBinary, boo...

FILE: src/plugins/websocket/src/android/WebSocketPlugin.java
  class WebSocketPlugin (line 14) | public class WebSocketPlugin extends CordovaPlugin {
    method pluginInitialize (line 18) | @Override
    method execute (line 23) | @Override
    method onDestroy (line 115) | @Override
    method removeInstance (line 127) | public static void removeInstance(String instanceId) {

FILE: src/plugins/websocket/www/websocket.js
  constant DEBUG (line 5) | let DEBUG = false;
  class WebSocketInstance (line 14) | class WebSocketInstance extends EventTarget {
    method constructor (line 15) | constructor(url, instanceId, binaryType) {
    method binaryType (line 82) | get binaryType() {
    method binaryType (line 86) | set binaryType(type) {
    method send (line 98) | send(message, binary) {
    method close (line 130) | close(code, reason) {

FILE: src/settings/appSettings.js
  function otherSettings (line 20) | function otherSettings() {

FILE: src/settings/backupRestore.js
  constant BACKUP_VERSION (line 15) | const BACKUP_VERSION = 2;
  constant CRC32_TABLE (line 20) | const CRC32_TABLE = (() => {
  function generateChecksum (line 38) | function generateChecksum(data) {
  function validateBackupStructure (line 53) | function validateBackupStructure(backup) {
  function formatDateForFilename (line 128) | function formatDateForFilename(date) {
  function backupRestore (line 137) | function backupRestore() {

FILE: src/settings/editorSettings.js
  function editorSettings (line 7) | function editorSettings() {

FILE: src/settings/filesSettings.js
  function filesSettings (line 4) | function filesSettings() {

FILE: src/settings/formatterSettings.js
  function formatterSettings (line 6) | function formatterSettings(languageName) {

FILE: src/settings/helpSettings.js
  function help (line 4) | function help() {

FILE: src/settings/lspConfigUtils.js
  function cloneLspSettings (line 4) | function cloneLspSettings() {
  function normalizeServerId (line 8) | function normalizeServerId(id) {
  function normalizeLanguages (line 14) | function normalizeLanguages(value) {
  function getServerOverride (line 31) | function getServerOverride(id) {
  function isCustomServer (line 35) | function isCustomServer(id) {
  function updateServerConfig (line 39) | async function updateServerConfig(serverId, partial) {
  function upsertCustomServer (line 68) | async function upsertCustomServer(serverId, config) {
  function removeCustomServer (line 136) | async function removeCustomServer(serverId) {

FILE: src/settings/lspServerDetail.js
  function getFeatureItems (line 23) | function getFeatureItems() {
  function fillTemplate (line 64) | function fillTemplate(template, replacements) {
  function clone (line 71) | function clone(value) {
  function mergeLauncher (line 76) | function mergeLauncher(base, patch) {
  function isDirectWebSocketServer (line 92) | function isDirectWebSocketServer(server) {
  function getMergedConfig (line 96) | function getMergedConfig(server) {
  function formatInstallStatus (line 118) | function formatInstallStatus(result) {
  function formatStartupTimeoutValue (line 135) | function formatStartupTimeoutValue(timeout) {
  function sanitizeInstallMessage (line 141) | function sanitizeInstallMessage(message) {
  function formatInstallInfo (line 157) | function formatInstallInfo(result) {
  function formatValue (line 176) | function formatValue(value) {
  function escapeHtml (line 188) | function escapeHtml(text) {
  function updateItemDisplay (line 194) | function updateItemDisplay($list, itemsByKey, key, value, extras = {}) {
  function buildSnapshot (line 233) | async function buildSnapshot(serverId) {
  function createItems (line 270) | function createItems(snapshot) {
  function refreshVisibleState (line 373) | async function refreshVisibleState($list, itemsByKey, serverId) {
  function isBuiltinFeatureEnabled (line 416) | function isBuiltinFeatureEnabled(builtinExts, extKey) {
  function persistEnabled (line 423) | async function persistEnabled(serverId, value) {
  function persistClientConfig (line 431) | async function persistClientConfig(serverId, clientConfig) {
  function persistStartupTimeout (line 442) | async function persistStartupTimeout(serverId, timeout) {
  function persistInitOptions (line 450) | async function persistInitOptions(serverId, value) {
  function lspServerDetail (line 458) | function lspServerDetail(serverId) {

FILE: src/settings/lspSettings.js
  function parseArgsInput (line 15) | function parseArgsInput(value) {
  function normalizePackages (line 26) | function normalizePackages(value) {
  function getInstallMethods (line 33) | function getInstallMethods() {
  function getTransportMethods (line 44) | function getTransportMethods() {
  function parseWebSocketUrl (line 61) | function parseWebSocketUrl(value) {
  function buildDefaultCheckCommand (line 78) | function buildDefaultCheckCommand(binaryCommand, installer) {
  function promptInstaller (line 92) | async function promptInstaller(binaryCommand) {
  function lspSettings (line 168) | function lspSettings() {

FILE: src/settings/mainSettings.js
  function mainSettings (line 27) | function mainSettings() {

FILE: src/settings/previewSettings.js
  function previewSettings (line 4) | function previewSettings() {

FILE: src/settings/scrollSettings.js
  function scrollSettings (line 5) | function scrollSettings() {
  function getScrollSpeedString (line 57) | function getScrollSpeedString(speed) {

FILE: src/settings/searchSettings.js
  function searchSettings (line 4) | function searchSettings() {

FILE: src/settings/terminalSettings.js
  function terminalSettings (line 16) | function terminalSettings() {
  function updateActiveTerminals (line 370) | async function updateActiveTerminals(key, value) {

FILE: src/sidebarApps/extensions/index.js
  constant LIMIT (line 29) | const LIMIT = 50;
  constant SUPPORTED_EDITOR (line 36) | const SUPPORTED_EDITOR = "cm";
  function withSupportedEditor (line 38) | function withSupportedEditor(url) {
  function onSelected (line 89) | function onSelected(el) {
  function initApp (line 100) | function initApp(el) {
  function handleScroll (line 127) | async function handleScroll(e) {
  function handleFilterScroll (line 137) | async function handleFilterScroll(e) {
  function loadMorePlugins (line 147) | async function loadMorePlugins() {
  function loadFilteredPlugins (line 177) | async function loadFilteredPlugins(filterState, isInitial = false) {
  function searchPlugin (line 215) | async function searchPlugin() {
  function filterPlugins (line 256) | async function filterPlugins() {
  function addSource (line 369) | async function addSource(sourceType, value = "https://") {
  function loadInstalled (line 404) | async function loadInstalled() {
  function loadExplore (line 415) | async function loadExplore() {
  function listInstalledPlugins (line 452) | async function listInstalledPlugins() {
  function getFilteredPlugins (line 488) | async function getFilteredPlugins(filterState) {
  function doesPluginMatchFilter (line 583) | function doesPluginMatchFilter(plugin, filterState) {
  function getPluginAuthorName (line 608) | function getPluginAuthorName(plugin) {
  function getPluginKeywords (line 618) | function getPluginKeywords(plugin) {
  function startLoading (line 636) | function startLoading($list) {
  function stopLoading (line 640) | function stopLoading($list) {
  function updateHeight (line 648) | function updateHeight($el) {
  function removeHeight (line 672) | function removeHeight($el, collapse = false) {
  function setHeight (line 684) | function setHeight($el, height) {
  function updateStyle (line 697) | function updateStyle() {
  function getLocalRes (line 711) | function getLocalRes(id, name) {
  function ListItem (line 715) | function ListItem({ icon, name, id, version, downloads, installed, sourc...
  function loadAd (line 896) | async function loadAd(el) {
  function uninstall (line 910) | async function uninstall(id) {
  function more_plugin_action (line 945) | async function more_plugin_action(id, pluginName) {

FILE: src/sidebarApps/files/index.js
  function initApp (line 21) | function initApp(el) {
  function onSelected (line 47) | function onSelected(el) {
  function clickHandler (line 59) | function clickHandler(e) {
  function fixHeight (line 75) | function fixHeight(target) {

FILE: src/sidebarApps/index.js
  constant SIDEBAR_APPS_LAST_SECTION (line 5) | const SIDEBAR_APPS_LAST_SECTION = "sidebarAppsLastSection";
  function add (line 28) | function add(
  function remove (line 52) | function remove(id) {
  function init (line 74) | function init($el) {
  function loadApps (line 88) | async function loadApps() {
  function setSponsorSidebarAppVisibility (line 100) | function setSponsorSidebarAppVisibility(visible) {
  function ensureActiveApp (line 128) | function ensureActiveApp() {
  function get (line 151) | function get(id) {
  function onclick (line 160) | function onclick(e) {
  function setActiveApp (line 174) | function setActiveApp(id) {

FILE: src/sidebarApps/notification/index.js
  function initApp (line 40) | function initApp(el) {
  function onSelected (line 58) | function onSelected(el) {

FILE: src/sidebarApps/searchInFiles/cmResultView.js
  function createSearchResultView (line 20) | function createSearchResultView(

FILE: src/sidebarApps/searchInFiles/index.js
  constant MAX_HL_WORDS (line 19) | const MAX_HL_WORDS = 400;
  method reset (line 42) | reset() {
  constant CASE_SENSITIVE (line 50) | const CASE_SENSITIVE = "search-in-files-case-sensitive";
  constant WHOLE_WORD (line 51) | const WHOLE_WORD = "search-in-files-whole-word";
  constant REG_EXP (line 52) | const REG_EXP = "search-in-files-reg-exp";
  constant EXCLUDE (line 53) | const EXCLUDE = "search-in-files-exclude";
  constant INCLUDE (line 54) | const INCLUDE = "search-in-files-include";
  method caseSensitive (line 57) | get caseSensitive() {
  method caseSensitive (line 60) | set caseSensitive(value) {
  method wholeWord (line 63) | get wholeWord() {
  method wholeWord (line 66) | set wholeWord(value) {
  method regExp (line 69) | get regExp() {
  method regExp (line 72) | set regExp(value) {
  method exclude (line 75) | get exclude() {
  method exclude (line 78) | set exclude(value) {
  method include (line 81) | get include() {
  method include (line 84) | set include(value) {
  function onWorkerMessage (line 224) | async function onWorkerMessage(e) {
  function onInput (line 372) | function onInput(e) {
  function searchAll (line 411) | async function searchAll() {
  function replaceAll (line 453) | async function replaceAll() {
  function sendMessage (line 477) | function sendMessage(action, files, search, options, replace) {
  function onErrorMessage (line 504) | function onErrorMessage(e) {
  function terminateWorker (line 513) | function terminateWorker(initializeNewWorkers = true) {
  function getWorker (line 534) | function getWorker() {
  function getOptions (line 557) | function getOptions() {
  function addEventListener (line 585) | function addEventListener($ref, type, handler) {
  function searchResultText (line 598) | function searchResultText(files, matches) {
  function Details (line 613) | function Details({ onexpand }, children) {
  function Summary (line 632) | function Summary({ marker = true, className }, children) {
  function Textarea (line 675) | function Textarea({ name, placeholder, ref }) {
  function toRegex (line 691) | function toRegex(search, options) {
  function onCursorChange (line 718) | async function onCursorChange(line) {
  function onFileUpdate (line 751) | function onFileUpdate(tree) {
  function addEvents (line 759) | function addEvents() {
  function removeEvents (line 772) | function removeEvents() {

FILE: src/sidebarApps/searchInFiles/worker.js
  function processFiles (line 36) | function processFiles(data, mode = "search") {
  function searchInFile (line 76) | function searchInFile({ file, content, search }) {
  function replaceInFile (line 117) | function replaceInFile({ file, content, search, replace }) {
  function getSurrounding (line 133) | function getSurrounding(content, word, start, end) {
  function getLineColumn (line 172) | function getLineColumn(file, position) {
  function getFile (line 184) | function getFile(url, cb) {
  function done (line 200) | function done(ratio, mode) {
  function Skip (line 224) | function Skip({ exclude, include }) {

FILE: src/sidebarApps/sidebarApp.js
  class SidebarApp (line 8) | class SidebarApp {
    method constructor (line 32) | constructor(icon, id, title, init, onselect) {
    method install (line 48) | install(prepend = false) {
    method init (line 62) | static init($el, $el2) {
    method icon (line 68) | get icon() {
    method id (line 73) | get id() {
    method title (line 78) | get title() {
    method active (line 83) | get active() {
    method active (line 88) | set active(value) {
    method container (line 123) | get container() {
    method init (line 128) | get init() {
    method onselect (line 133) | get onselect() {
    method remove (line 137) | remove() {
  function Icon (line 156) | function Icon({ icon, id, title }) {
  function getContainer (line 173) | function getContainer($el) {

FILE: src/test/ace.test.js
  function runAceCompatibilityTests (line 9) | async function runAceCompatibilityTests(writeOutput) {

FILE: src/test/editor.tests.js
  function runCodeMirrorTests (line 16) | async function runCodeMirrorTests(writeOutput) {

FILE: src/test/exec.tests.js
  function runExecutorTests (line 3) | async function runExecutorTests(writeOutput) {

FILE: src/test/sanity.tests.js
  function runSanityTests (line 3) | async function runSanityTests(writeOutput) {

FILE: src/test/tester.js
  function runAllTests (line 7) | async function runAllTests() {
  constant COLORS (line 33) | const COLORS = {
  function delay (line 56) | function delay(ms) {
  function startSpinner (line 60) | function startSpinner(writeOutput, text) {
  constant SPINNER_FRAMES (line 80) | const SPINNER_FRAMES = ["⠋", "⠙", "⠹", "⠸", "⠼", "⠴", "⠦", "⠧", "⠇", "⠏"];
  class TestRunner (line 82) | class TestRunner {
    method constructor (line 83) | constructor(name = "Test Suite") {
    method test (line 95) | test(testName, testFn) {
    method assert (line 102) | assert(condition, message) {
    method assertEqual (line 108) | assertEqual(actual, expected, message) {
    method skip (line 114) | skip(reason = "Skipped") {
    method _runWithTimeout (line 118) | async _runWithTimeout(fn, ctx, timeoutMs) {
    method run (line 148) | async run(writeOutput) {
    method _padCenter (line 254) | _padCenter(text, width) {
  class SkipTest (line 262) | class SkipTest extends Error {
    method constructor (line 263) | constructor(message = "Skipped") {

FILE: src/test/url.tests.js
  constant JOIN_CASES (line 4) | const JOIN_CASES = [
  constant TRAILING_SLASH_CASES (line 34) | const TRAILING_SLASH_CASES = [
  function assertJoinCase (line 52) | function assertJoinCase(
  function runUrlTests (line 70) | async function runUrlTests(writeOutput) {

FILE: src/theme/builder.js
  class ThemeBuilder (line 3) | class ThemeBuilder {
    method constructor (line 45) | constructor(name = "", type = "dark", version = "free") {
    method id (line 51) | get id() {
    method popupBorderRadius (line 55) | get popupBorderRadius() {
    method popupBorderRadius (line 59) | set popupBorderRadius(value) {
    method activeColor (line 63) | get activeColor() {
    method activeColor (line 67) | set activeColor(value) {
    method activeIconColor (line 71) | get activeIconColor() {
    method activeIconColor (line 75) | set activeIconColor(value) {
    method borderColor (line 79) | get borderColor() {
    method borderColor (line 83) | set borderColor(value) {
    method boxShadowColor (line 87) | get boxShadowColor() {
    method boxShadowColor (line 91) | set boxShadowColor(value) {
    method buttonActiveColor (line 95) | get buttonActiveColor() {
    method buttonActiveColor (line 99) | set buttonActiveColor(value) {
    method buttonBackgroundColor (line 103) | get buttonBackgroundColor() {
    method buttonBackgroundColor (line 107) | set buttonBackgroundColor(value) {
    method buttonTextColor (line 111) | get buttonTextColor() {
    method buttonTextColor (line 115) | set buttonTextColor(value) {
    method errorTextColor (line 119) | get errorTextColor() {
    method errorTextColor (line 123) | set errorTextColor(value) {
    method primaryColor (line 127) | get primaryColor() {
    method primaryColor (line 131) | set primaryColor(value) {
  
Condensed preview — 510 files, each showing path, character count, and a content snippet. Download the .json file or copy for the full structured content (5,583K chars).
[
  {
    "path": ".babelrc",
    "chars": 411,
    "preview": "{\r\n  \"presets\": [\r\n    [\r\n      \"@babel/preset-env\",\r\n      {\r\n        \"useBuiltIns\": \"entry\",\r\n        \"corejs\": \"3.22\""
  },
  {
    "path": ".devcontainer/Dockerfile",
    "chars": 2249,
    "preview": "# Acode Development Container - Standalone Docker Build\n# \n# This Dockerfile is for MANUAL Docker builds (docker build/r"
  },
  {
    "path": ".devcontainer/devcontainer.json",
    "chars": 1048,
    "preview": "{\n  \"name\": \"Acode Development\",\n  \"image\": \"mcr.microsoft.com/devcontainers/java:1-21-bullseye\",\n\n  \"features\": {\n    \""
  },
  {
    "path": ".dockerignore",
    "chars": 201,
    "preview": "# Dependencies\nnode_modules/\n.pnpm-store/\n\n# Build outputs\nplatforms/\nplugins/\nwww/css/build/\nwww/js/build/\n\n# IDE\n.vsco"
  },
  {
    "path": ".gitattributes",
    "chars": 17,
    "preview": "*.sh text eol=lf\n"
  },
  {
    "path": ".github/CODEOWNERS",
    "chars": 245,
    "preview": ".github/CODEOWNERS @Acode-Foundation/acode \n\n# workflows\n.github/workflows/nightly-build.yml @unschooledgamer\n.github/wo"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/0_bug_report.yml",
    "chars": 1729,
    "preview": "name: Bug Report\ndescription: |\n  Use this template for bug reports.\nlabels: []\nbody:\n  - type: checkboxes\n    attribute"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/1_feature_request.yml",
    "chars": 787,
    "preview": "name: Feature Request\ndescription: \"Suggest a new feature for Acode\"\nlabels: [\"enhancement\"]\nbody:\n  - type: checkboxes\n"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/config.yml",
    "chars": 436,
    "preview": "blank_issues_enabled: false\ncontact_links:\n  - name: Ask Questions\n    url: https://github.com/Acode-Foundation/Acode/di"
  },
  {
    "path": ".github/dependabot.yml",
    "chars": 561,
    "preview": "# To get started with Dependabot version updates, you'll need to specify which\n# package ecosystems to update and where "
  },
  {
    "path": ".github/labeler.yml",
    "chars": 255,
    "preview": "translations:\n  - any: \n    - changed-files: \n      - any-glob-to-any-file: 'src/lang/*.json'\n\ndocs:\n  - any: \n    - cha"
  },
  {
    "path": ".github/workflows/add-pr-labels.yml",
    "chars": 391,
    "preview": "name: Add Pull Requests Labels\non: \n    pull_request_target: \n        types: [opened, closed, ready_for_review]\n\njobs:\n "
  },
  {
    "path": ".github/workflows/ci.yml",
    "chars": 1538,
    "preview": "name: CI\n\non:\n  push:\n  pull_request:\n\njobs:\n  spell-check:\n    timeout-minutes: 5\n    name: Check spelling\n    runs-on:"
  },
  {
    "path": ".github/workflows/close-inactive-issues.yml",
    "chars": 1253,
    "preview": "name: Close inactive issues\non:\n  schedule:\n    - cron: \"30 1 * * *\"\n\njobs:\n  close-issues:\n    runs-on: ubuntu-latest\n "
  },
  {
    "path": ".github/workflows/community-release-notifier.yml",
    "chars": 5007,
    "preview": "name: community-release-notifier\n\non:\n  release:\n    types: [ released ]\n  workflow_call:\n    inputs:\n      tag_name:\n  "
  },
  {
    "path": ".github/workflows/nightly-build.yml",
    "chars": 13192,
    "preview": "# Implement to use environment secrets someday, At the moment GH Actions doesn't support those in reusable workflows (re"
  },
  {
    "path": ".github/workflows/on-demand-preview-releases-PR.yml",
    "chars": 4135,
    "preview": "name: On Demand Preview Releases for PR\n#  avoids paths like .md, and anything in .github folder\non:\n  pull_request_targ"
  },
  {
    "path": ".gitignore",
    "chars": 250,
    "preview": "/node_modules\r\n/build.json\r\n/www/build\r\n/plugins\r\n/platforms\r\n/keystore.jks\r\n/platforms/android/debug-signing.properties"
  },
  {
    "path": ".hintrc",
    "chars": 227,
    "preview": "{\n  \"extends\": [\n    \"development\"\n  ],\n  \"hints\": {\n    \"compat-api/css\": \"off\",\n    \"css-prefix-order\": \"off\",\n    \"me"
  },
  {
    "path": ".prettierrc",
    "chars": 3,
    "preview": "{}\n"
  },
  {
    "path": ".vscode/launch.json",
    "chars": 458,
    "preview": "{\n  // Use IntelliSense to learn about possible attributes.\n  // Hover to view descriptions of existing attributes.\n  //"
  },
  {
    "path": ".vscode/plugins.json",
    "chars": 298,
    "preview": "{\"plugins\":[\"cordova-clipboard\",\"cordova-plugin-buildinfo\",\"cordova-plugin-device\",\"cordova-plugin-file\",\"cordova-plugin"
  },
  {
    "path": ".vscode/settings.json",
    "chars": 6290,
    "preview": "{\n  \"editor.formatOnSave\": true,\n  \"autoimport.doubleQuotes\": false,\n  \"java.configuration.updateBuildConfiguration\": \"d"
  },
  {
    "path": ".vscode/typings/cordova/cordova.d.ts",
    "chars": 4235,
    "preview": "// Type definitions for Apache Cordova\r\n// Project: http://cordova.apache.org\r\n// Definitions by: Microsoft Open Technol"
  },
  {
    "path": "CHANGELOG.md",
    "chars": 49559,
    "preview": "# Change Log\n\n## v1.11.8 (967) \n\n### Features\n* feat: add acode cli by @bajrangCoder in https://github.com/Acode-Foundat"
  },
  {
    "path": "CODE_OF_CONDUCT.md",
    "chars": 6109,
    "preview": "# Contributor Covenant Code of Conduct\n\n## Our Pledge\n\nWe as members, contributors, and leaders pledge to make participa"
  },
  {
    "path": "CONTRIBUTING.md",
    "chars": 6717,
    "preview": "# Contributing to Acode\n\nThank you for your interest in contributing to Acode! This guide will help you get started with"
  },
  {
    "path": "_typos.toml",
    "chars": 1207,
    "preview": "[default]\ncheck-filename = true\n\n[files]\nextend-exclude = [\n    \"node_modules\",\n    \"www\",\n    \"*.yaml\",\n    \".vscode\",\n"
  },
  {
    "path": "biome.json",
    "chars": 1060,
    "preview": "{\n\t\"$schema\": \"https://biomejs.dev/schemas/2.4.11/schema.json\",\n\t\"formatter\": {\n\t\t\"enabled\": true,\n\t\t\"indentStyle\": \"tab"
  },
  {
    "path": "build-extras.gradle",
    "chars": 437,
    "preview": "android {\n    packagingOptions {\n        pickFirst 'META-INF/versions/9/OSGI-INF/MANIFEST.MF'\n    }\n}\n\nconfigurations {\n"
  },
  {
    "path": "config.xml",
    "chars": 5139,
    "preview": "<?xml version='1.0' encoding='utf-8' ?>\r\n<widget id=\"com.foxdebug.acode\" android-versionCode=\"967\" version=\"1.11.8\"\r\n   "
  },
  {
    "path": "fastlane/metadata/android/en-US/full_description.txt",
    "chars": 2614,
    "preview": "Welcome to Acode!\n\nA powerful, lightweight code editor, and web IDE for Android. Now enhanced with cutting-edge features"
  },
  {
    "path": "fastlane/metadata/android/en-US/short_description.txt",
    "chars": 44,
    "preview": "A lightweight but powerful text/code editor."
  },
  {
    "path": "fastlane/metadata/android/en-US/title.txt",
    "chars": 34,
    "preview": "Acode editor - Android code editor"
  },
  {
    "path": "hooks/README.md",
    "chars": 1122,
    "preview": "<!--\r\n#\r\n# Licensed to the Apache Software Foundation (ASF) under one\r\n# or more contributor license agreements.  See th"
  },
  {
    "path": "hooks/modify-java-files.js",
    "chars": 13516,
    "preview": "const path = require('path');\nconst fs = require('fs');\nconst prettier = require('prettier');\n\nmain();\n\nasync function m"
  },
  {
    "path": "hooks/move-files.js",
    "chars": 1059,
    "preview": "const path = require('path');\nconst fs = require('fs');\n\nconst gradleFilePath = path.resolve(__dirname, '../build-extras"
  },
  {
    "path": "hooks/post-process.js",
    "chars": 9723,
    "preview": "/* eslint-disable no-console */\nconst path = require('path');\nconst fs = require('fs');\nconst { execSync } = require('ch"
  },
  {
    "path": "hooks/restore-cordova-resources.js",
    "chars": 1324,
    "preview": "const fs = require(\"fs\");\nconst path = require(\"path\");\n\nconst templateResPath = path.resolve(\n  __dirname,\n  \"../node_m"
  },
  {
    "path": "jsconfig.json",
    "chars": 246,
    "preview": "{\n  \"exclude\": [\"**/node_modules\", \"**/platforms\", \"**/www\", \"www/js/ace/**/*\"],\n  \"compilerOptions\": {\n    \"baseUrl\": \""
  },
  {
    "path": "license.txt",
    "chars": 1067,
    "preview": "Copyright 2020 Foxdebug(Ajit Kumar)\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of thi"
  },
  {
    "path": "package.json",
    "chars": 6626,
    "preview": "{\n  \"name\": \"com.foxdebug.acode\",\n  \"displayName\": \"Acode\",\n  \"version\": \"1.11.8\",\n  \"description\": \"Acode is a code edi"
  },
  {
    "path": "postcss.config.js",
    "chars": 82,
    "preview": "module.exports = {\r\n    plugins: [\r\n        require('autoprefixer')({})\r\n    ]\r\n};"
  },
  {
    "path": "readme.md",
    "chars": 3214,
    "preview": "# Acode - Code Editor for Android\n\n<p align=\"center\">\n  <img src='res/logo_1.png' width='250'>\n</p>\n\n[![](https://img.sh"
  },
  {
    "path": "res/android/drawable/ic_launcher_background.xml",
    "chars": 5606,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:wi"
  },
  {
    "path": "res/android/drawable/ic_launcher_foreground.xml",
    "chars": 2396,
    "preview": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"108dp\"\n    android:height=\"108dp\"\n"
  },
  {
    "path": "res/android/mipmap-anydpi-v26/ic_launcher.xml",
    "chars": 337,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<adaptive-icon xmlns:android=\"http://schemas.android.com/apk/res/android\">\n    <b"
  },
  {
    "path": "res/android/mipmap-anydpi-v26/ic_launcher_round.xml",
    "chars": 337,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<adaptive-icon xmlns:android=\"http://schemas.android.com/apk/res/android\">\n    <b"
  },
  {
    "path": "res/android/values/colors.xml",
    "chars": 152,
    "preview": "<?xml version='1.0' encoding='utf-8'?>\n<resources xmlns:tools=\"http://schemas.android.com/tools\">\n  <color name=\"teardro"
  },
  {
    "path": "res/android/values/ic_launcher_background.xml",
    "chars": 175,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <color name=\"ic_launcher_background\">#3a3e54</color>\n    <color n"
  },
  {
    "path": "res/android/values/themes.xml",
    "chars": 496,
    "preview": "<?xml version='1.0' encoding='utf-8'?>\n<resources>\n    <style name=\"Theme.App.Activity\" parent=\"Theme.AppCompat.DayNight"
  },
  {
    "path": "res/android/xml/network_security_config.xml",
    "chars": 234,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<network-security-config>\n  <base-config cleartextTrafficPermitted=\"true\">\n    <t"
  },
  {
    "path": "rspack.config.js",
    "chars": 3603,
    "preview": "const path = require('path');\nconst { rspack } = require('@rspack/core');\n\nmodule.exports = (env, options) => {\n  const "
  },
  {
    "path": "src/cm/baseExtensions.ts",
    "chars": 1586,
    "preview": "import { closeBrackets, completionKeymap } from \"@codemirror/autocomplete\";\nimport { defaultKeymap, history, historyKeym"
  },
  {
    "path": "src/cm/colorView.ts",
    "chars": 7990,
    "preview": "import type { Range, Text } from \"@codemirror/state\";\nimport type { DecorationSet, ViewUpdate } from \"@codemirror/view\";"
  },
  {
    "path": "src/cm/commandRegistry.js",
    "chars": 36869,
    "preview": "import fsOperation from \"fileSystem\";\nimport * as cmCommands from \"@codemirror/commands\";\nimport {\n\tcopyLineDown,\n\tcopyL"
  },
  {
    "path": "src/cm/editorUtils.ts",
    "chars": 4214,
    "preview": "import { foldEffect, foldedRanges } from \"@codemirror/language\";\nimport type { EditorState, StateEffect } from \"@codemir"
  },
  {
    "path": "src/cm/indentGuides.ts",
    "chars": 10187,
    "preview": "import { getIndentUnit, syntaxTree } from \"@codemirror/language\";\nimport type { Extension } from \"@codemirror/state\";\nim"
  },
  {
    "path": "src/cm/lsp/api.ts",
    "chars": 2209,
    "preview": "import { defineBundle, defineServer, installers } from \"./providerUtils\";\nimport {\n\tgetServerBundle,\n\tlistServerBundles,"
  },
  {
    "path": "src/cm/lsp/clientManager.ts",
    "chars": 32449,
    "preview": "import { getIndentUnit, indentUnit } from \"@codemirror/language\";\nimport type { LSPClientExtension } from \"@codemirror/l"
  },
  {
    "path": "src/cm/lsp/codeActions.ts",
    "chars": 10466,
    "preview": "import { LSPPlugin } from \"@codemirror/lsp-client\";\nimport { EditorView } from \"@codemirror/view\";\nimport toast from \"co"
  },
  {
    "path": "src/cm/lsp/diagnostics.ts",
    "chars": 8384,
    "preview": "import { Diagnostic, linter, lintGutter } from \"@codemirror/lint\";\nimport type { LSPClient } from \"@codemirror/lsp-clien"
  },
  {
    "path": "src/cm/lsp/documentSymbols.ts",
    "chars": 7347,
    "preview": "/**\n * LSP Document Symbols Extension for CodeMirror\n *\n * Provides document symbol information (functions, classes, var"
  },
  {
    "path": "src/cm/lsp/formatter.ts",
    "chars": 3081,
    "preview": "import type { EditorView } from \"@codemirror/view\";\nimport { getModes } from \"cm/modelist\";\nimport toast from \"component"
  },
  {
    "path": "src/cm/lsp/formattingSupport.ts",
    "chars": 211,
    "preview": "import type { LspServerDefinition } from \"./types\";\n\nexport function supportsBuiltinFormatting(\n\tserver: LspServerDefini"
  },
  {
    "path": "src/cm/lsp/index.ts",
    "chars": 2093,
    "preview": "export {\n\tbundles,\n\tdefault as lspApi,\n\tdefineBundle,\n\tdefineServer,\n\tinstallers,\n\tregister,\n\tservers,\n\tupsert,\n} from \""
  },
  {
    "path": "src/cm/lsp/inlayHints.ts",
    "chars": 8641,
    "preview": "/**\n * LSP Inlay Hints Extension for CodeMirror\n *\n * Provides inline hints (type annotations, parameter names, etc.) fr"
  },
  {
    "path": "src/cm/lsp/installRuntime.ts",
    "chars": 1307,
    "preview": "function getExecutor(): Executor {\n\tconst executor = (globalThis as unknown as { Executor?: Executor }).Executor;\n\tif (!"
  },
  {
    "path": "src/cm/lsp/installerUtils.ts",
    "chars": 1660,
    "preview": "const ARCH_ALIASES = {\n\taarch64: [\"aarch64\", \"arm64\", \"arm64-v8a\"],\n\tx86_64: [\"x86_64\", \"amd64\"],\n\tarmv7: [\"armv7\", \"arm"
  },
  {
    "path": "src/cm/lsp/providerUtils.ts",
    "chars": 5372,
    "preview": "import type {\n\tBridgeConfig,\n\tInstallCheckResult,\n\tLauncherInstallConfig,\n\tLspServerBundle,\n\tLspServerManifest,\n\tTranspo"
  },
  {
    "path": "src/cm/lsp/references.ts",
    "chars": 5403,
    "preview": "import fsOperation from \"fileSystem\";\nimport { LSPPlugin } from \"@codemirror/lsp-client\";\nimport type { EditorView } fro"
  },
  {
    "path": "src/cm/lsp/rename.ts",
    "chars": 6873,
    "preview": "import { LSPPlugin } from \"@codemirror/lsp-client\";\nimport {\n\ttype Command,\n\tEditorView,\n\ttype KeyBinding,\n\tkeymap,\n} fr"
  },
  {
    "path": "src/cm/lsp/serverCatalog.ts",
    "chars": 3445,
    "preview": "import { builtinServerBundles } from \"./servers\";\nimport type { LspServerBundle, LspServerManifest } from \"./types\";\n\nfu"
  },
  {
    "path": "src/cm/lsp/serverLauncher.ts",
    "chars": 35154,
    "preview": "import lspStatusBar from \"components/lspStatusBar\";\nimport toast from \"components/toast\";\nimport alert from \"dialogs/ale"
  },
  {
    "path": "src/cm/lsp/serverRegistry.ts",
    "chars": 11484,
    "preview": "import {\n\tbindServerRegistry,\n\tensureBuiltinBundlesRegistered,\n} from \"./serverCatalog\";\nimport type {\n\tAcodeClientConfi"
  },
  {
    "path": "src/cm/lsp/servers/index.ts",
    "chars": 636,
    "preview": "import type { LspServerBundle, LspServerManifest } from \"../types\";\nimport { javascriptBundle, javascriptServers } from "
  },
  {
    "path": "src/cm/lsp/servers/javascript.ts",
    "chars": 7703,
    "preview": "import { defineBundle, defineServer, installers } from \"../providerUtils\";\nimport type { LspServerBundle, LspServerManif"
  },
  {
    "path": "src/cm/lsp/servers/luau.ts",
    "chars": 5980,
    "preview": "import toast from \"components/toast\";\nimport confirm from \"dialogs/confirm\";\nimport loader from \"dialogs/loader\";\nimport"
  },
  {
    "path": "src/cm/lsp/servers/python.ts",
    "chars": 1006,
    "preview": "import { defineBundle, defineServer, installers } from \"../providerUtils\";\nimport type { LspServerBundle, LspServerManif"
  },
  {
    "path": "src/cm/lsp/servers/shared.ts",
    "chars": 615,
    "preview": "export function normalizeServerLanguageKey(\n\tvalue: string | undefined | null,\n): string {\n\treturn String(value ?? \"\")\n\t"
  },
  {
    "path": "src/cm/lsp/servers/systems.ts",
    "chars": 4911,
    "preview": "import { defineBundle, defineServer, installers } from \"../providerUtils\";\nimport type { LspServerBundle, LspServerManif"
  },
  {
    "path": "src/cm/lsp/servers/web.ts",
    "chars": 1581,
    "preview": "import { defineBundle, defineServer, installers } from \"../providerUtils\";\nimport type { LspServerBundle, LspServerManif"
  },
  {
    "path": "src/cm/lsp/tooltipExtensions.ts",
    "chars": 14838,
    "preview": "import {\n\thighlightingFor,\n\ttype Language,\n\tlanguage as languageFacet,\n} from \"@codemirror/language\";\nimport { LSPPlugin"
  },
  {
    "path": "src/cm/lsp/transport.ts",
    "chars": 10358,
    "preview": "/*\n\tLanguage servers that expose stdio are proxied through a lightweight\n\tWebSocket bridge so the CodeMirror client can "
  },
  {
    "path": "src/cm/lsp/types.ts",
    "chars": 13176,
    "preview": "import type {\n\tLSPClient,\n\tLSPClientConfig,\n\tLSPClientExtension,\n\tTransport,\n\tWorkspace,\n\tWorkspaceFile,\n} from \"@codemi"
  },
  {
    "path": "src/cm/lsp/workspace.ts",
    "chars": 7300,
    "preview": "import type { WorkspaceFile } from \"@codemirror/lsp-client\";\nimport { LSPPlugin, Workspace } from \"@codemirror/lsp-clien"
  },
  {
    "path": "src/cm/mainEditorExtensions.ts",
    "chars": 1762,
    "preview": "import type { Extension } from \"@codemirror/state\";\nimport { EditorView, scrollPastEnd } from \"@codemirror/view\";\n\ninter"
  },
  {
    "path": "src/cm/modelist.ts",
    "chars": 6086,
    "preview": "import type { Extension } from \"@codemirror/state\";\n\nexport type LanguageExtensionProvider = () => Extension | Promise<E"
  },
  {
    "path": "src/cm/modes/luau/index.ts",
    "chars": 17815,
    "preview": "import {\n\tIndentContext,\n\tLanguageSupport,\n\tStreamLanguage,\n\tStringStream,\n} from \"@codemirror/language\";\n\ntype Tokenize"
  },
  {
    "path": "src/cm/rainbowBrackets.ts",
    "chars": 11381,
    "preview": "import { syntaxTree } from \"@codemirror/language\";\nimport { RangeSetBuilder } from \"@codemirror/state\";\nimport type { De"
  },
  {
    "path": "src/cm/supportedModes.ts",
    "chars": 3520,
    "preview": "import { languages } from \"@codemirror/language-data\";\nimport type { Extension } from \"@codemirror/state\";\nimport { addM"
  },
  {
    "path": "src/cm/themes/aura.js",
    "chars": 4448,
    "preview": "import { HighlightStyle, syntaxHighlighting } from \"@codemirror/language\";\nimport { EditorView } from \"@codemirror/view\""
  },
  {
    "path": "src/cm/themes/dracula.js",
    "chars": 4449,
    "preview": "import { HighlightStyle, syntaxHighlighting } from \"@codemirror/language\";\nimport { EditorView, lineNumbers } from \"@cod"
  },
  {
    "path": "src/cm/themes/githubDark.js",
    "chars": 4474,
    "preview": "import { HighlightStyle, syntaxHighlighting } from \"@codemirror/language\";\nimport { EditorView, lineNumbers } from \"@cod"
  },
  {
    "path": "src/cm/themes/githubLight.js",
    "chars": 4478,
    "preview": "import { HighlightStyle, syntaxHighlighting } from \"@codemirror/language\";\nimport { EditorView, lineNumbers } from \"@cod"
  },
  {
    "path": "src/cm/themes/index.js",
    "chars": 6037,
    "preview": "import { EditorState } from \"@codemirror/state\";\nimport { oneDark } from \"@codemirror/theme-one-dark\";\nimport aura, { co"
  },
  {
    "path": "src/cm/themes/monokai.js",
    "chars": 4529,
    "preview": "import { HighlightStyle, syntaxHighlighting } from \"@codemirror/language\";\nimport { EditorView } from \"@codemirror/view\""
  },
  {
    "path": "src/cm/themes/noctisLilac.js",
    "chars": 4025,
    "preview": "import { HighlightStyle, syntaxHighlighting } from \"@codemirror/language\";\nimport { EditorView } from \"@codemirror/view\""
  },
  {
    "path": "src/cm/themes/solarizedDark.js",
    "chars": 4493,
    "preview": "import { HighlightStyle, syntaxHighlighting } from \"@codemirror/language\";\nimport { EditorView, lineNumbers } from \"@cod"
  },
  {
    "path": "src/cm/themes/solarizedLight.js",
    "chars": 4507,
    "preview": "import { HighlightStyle, syntaxHighlighting } from \"@codemirror/language\";\nimport { EditorView, lineNumbers } from \"@cod"
  },
  {
    "path": "src/cm/themes/tokyoNight.js",
    "chars": 4472,
    "preview": "import { HighlightStyle, syntaxHighlighting } from \"@codemirror/language\";\nimport { EditorView, lineNumbers } from \"@cod"
  },
  {
    "path": "src/cm/themes/tokyoNightDay.js",
    "chars": 4494,
    "preview": "import { HighlightStyle, syntaxHighlighting } from \"@codemirror/language\";\nimport { EditorView, lineNumbers } from \"@cod"
  },
  {
    "path": "src/cm/themes/tomorrowNight.js",
    "chars": 4637,
    "preview": "import { HighlightStyle, syntaxHighlighting } from \"@codemirror/language\";\nimport { EditorView } from \"@codemirror/view\""
  },
  {
    "path": "src/cm/themes/tomorrowNightBright.js",
    "chars": 4694,
    "preview": "import { HighlightStyle, syntaxHighlighting } from \"@codemirror/language\";\nimport { EditorView } from \"@codemirror/view\""
  },
  {
    "path": "src/cm/themes/vscodeDark.js",
    "chars": 4785,
    "preview": "import { HighlightStyle, syntaxHighlighting } from \"@codemirror/language\";\nimport { EditorView } from \"@codemirror/view\""
  },
  {
    "path": "src/cm/touchSelectionMenu.js",
    "chars": 16515,
    "preview": "import { EditorSelection } from \"@codemirror/state\";\nimport selectionMenu from \"lib/selectionMenu\";\n\nconst TAP_MAX_DELAY"
  },
  {
    "path": "src/components/WebComponents/index.js",
    "chars": 107,
    "preview": "import \"@ungap/custom-elements\";\nimport WcPage from \"./wcPage\";\n\ncustomElements.define(\"wc-page\", WcPage);\n"
  },
  {
    "path": "src/components/WebComponents/wcPage.js",
    "chars": 5561,
    "preview": "import tile from \"../tile\";\n\nexport default class WCPage extends HTMLElement {\n\t#leadBtn;\n\t#header;\n\t#on = {\n\t\thide: [],"
  },
  {
    "path": "src/components/audioPlayer/index.js",
    "chars": 4798,
    "preview": "import \"./style.scss\";\nimport Ref from \"html-tag-js/ref\";\n\nexport default class AudioPlayer {\n\tconstructor(container) {\n"
  },
  {
    "path": "src/components/audioPlayer/style.scss",
    "chars": 1733,
    "preview": ".audio-player {\n  background: var(--primary-color, #1e1e1e);\n  border-radius: 10px;\n  padding: 15px;\n  display: flex;\n  "
  },
  {
    "path": "src/components/checkbox/index.js",
    "chars": 1853,
    "preview": "import \"./styles.scss\";\nimport Ref from \"html-tag-js/ref\";\n\n/**\n * @typedef {Object} Checkbox\n * @property {string} text"
  },
  {
    "path": "src/components/checkbox/styles.scss",
    "chars": 672,
    "preview": ".input-checkbox {\n  display: inline-flex;\n  align-items: center;\n\n  input {\n    display: none;\n  }\n\n  .box {\n    display"
  },
  {
    "path": "src/components/collapsableList.js",
    "chars": 3429,
    "preview": "import tag from \"html-tag-js\";\nimport tile from \"./tile\";\n\n/**\n * @typedef {object} CollapsibleBase\n * @property {HTMLEl"
  },
  {
    "path": "src/components/contextmenu/index.js",
    "chars": 3530,
    "preview": "import \"./style.scss\";\nimport actionStack from \"lib/actionStack\";\n\n/**\n * @typedef {object} ContextMenuObj\n * @extends H"
  },
  {
    "path": "src/components/contextmenu/style.scss",
    "chars": 1930,
    "preview": "body.no-animation {\n  .context-menu {\n    border: solid 1px rgba($color: #000000, $alpha: 0.2);\n  }\n}\n\n.context-menu {\n "
  },
  {
    "path": "src/components/fileTree/index.js",
    "chars": 10841,
    "preview": "import \"./style.scss\";\nimport tile from \"components/tile\";\nimport VirtualList from \"components/virtualList\";\nimport tag "
  },
  {
    "path": "src/components/fileTree/style.scss",
    "chars": 1615,
    "preview": "@use \"../../styles/mixins.scss\";\n\n.file-tree {\n    --file-tree-indent: 24px;\n\n    min-width: 100%;\n    width: max-conten"
  },
  {
    "path": "src/components/inputhints/index.js",
    "chars": 9200,
    "preview": "import \"./style.scss\";\n\n/**\n * @typedef {Object} HintObj\n * @property {string} value\n * @property {string} text\n * @prop"
  },
  {
    "path": "src/components/inputhints/style.scss",
    "chars": 1827,
    "preview": "@use \"../../styles/mixins.scss\";\n\n#hints {\n  position: fixed;\n  top: 0;\n  left: 0;\n  padding: 0;\n  margin: 0;\n  border-r"
  },
  {
    "path": "src/components/logo/index.js",
    "chars": 93,
    "preview": "import \"./style.scss\";\n\nexport default function Logo() {\n\treturn <div className=\"logo\" />;\n}\n"
  },
  {
    "path": "src/components/logo/style.scss",
    "chars": 628,
    "preview": ".logo {\n  display: block;\n  width: 150px;\n  height: 150px;\n  position: relative;\n  margin: 0 auto;\n\n  &::after {\n    con"
  },
  {
    "path": "src/components/lspInfoDialog/index.js",
    "chars": 18381,
    "preview": "import \"./styles.scss\";\nimport lspClientManager from \"cm/lsp/clientManager\";\nimport { getServerStats } from \"cm/lsp/serv"
  },
  {
    "path": "src/components/lspInfoDialog/styles.scss",
    "chars": 8107,
    "preview": ":root {\n    --lsp-status-active: #22c55e;\n    --lsp-status-connecting: #f59e0b;\n    --lsp-status-stopped: #6b7280;\n}\n\n.l"
  },
  {
    "path": "src/components/lspStatusBar/index.js",
    "chars": 8998,
    "preview": "import \"./style.scss\";\n\n/**@type {HTMLElement | null} */\nlet $statusBar = null;\n\n/**@type {number | null} */\nlet hideTim"
  },
  {
    "path": "src/components/lspStatusBar/style.scss",
    "chars": 3980,
    "preview": "@use \"../../styles/mixins.scss\";\n\n#lsp-status-bar {\n    position: fixed;\n    bottom: 50px;\n    left: 0;\n    right: 0;\n  "
  },
  {
    "path": "src/components/page.js",
    "chars": 546,
    "preview": "import WCPage from \"./WebComponents/wcPage\";\n\n/**\n *\n * @param {string} title\n * @param {object} options\n * @param {HTML"
  },
  {
    "path": "src/components/palette/index.js",
    "chars": 4828,
    "preview": "import \"./style.scss\";\nimport inputhints from \"components/inputhints\";\nimport keyboardHandler from \"handlers/keyboard\";\n"
  },
  {
    "path": "src/components/palette/style.scss",
    "chars": 511,
    "preview": "#palette {\n  position: fixed;\n  top: 0;\n  left: 0;\n  right: 0;\n  margin: auto;\n  height: 40px;\n  width: 90vw;\n  max-widt"
  },
  {
    "path": "src/components/quickTools/footer.js",
    "chars": 4016,
    "preview": "/**\n * @typedef {import('html-tag-js/ref')} Ref\n */\n\nimport settings from \"lib/settings\";\nimport items, { ref } from \"./"
  },
  {
    "path": "src/components/quickTools/index.js",
    "chars": 1501,
    "preview": "import \"./style.scss\";\nimport Ref from \"html-tag-js/ref\";\nimport settings from \"lib/settings\";\nimport {\n\t$footer,\n\t$inpu"
  },
  {
    "path": "src/components/quickTools/items.js",
    "chars": 3077,
    "preview": "export default [\n\titem(\"ctrl-key\", \"letters\", \"ctrl\", undefined, \"ctrl\", false),\n\titem(\"tab-key\", \"keyboard_tab\", \"key\","
  },
  {
    "path": "src/components/quickTools/style.scss",
    "chars": 651,
    "preview": "@use '../../styles/mixins.scss';\n\n#quick-tools {\n  .icon.click {\n    @include mixins.active-icon;\n    transition: all 0."
  },
  {
    "path": "src/components/referencesPanel/index.js",
    "chars": 7334,
    "preview": "import \"./styles.scss\";\nimport actionStack from \"lib/actionStack\";\nimport { openReferencesTab } from \"./referencesTab\";\n"
  },
  {
    "path": "src/components/referencesPanel/referencesTab.js",
    "chars": 3300,
    "preview": "import EditorFile from \"lib/editorFile\";\nimport {\n\tbuildFlatList,\n\tclearHighlightCache,\n\tcreateReferenceItem,\n\tgetRefere"
  },
  {
    "path": "src/components/referencesPanel/styles.scss",
    "chars": 7502,
    "preview": "@use \"../../styles/mixins.scss\";\n\n.references-panel-mask {\n  position: fixed;\n  top: 0;\n  left: 0;\n  right: 0;\n  bottom:"
  },
  {
    "path": "src/components/referencesPanel/utils.js",
    "chars": 3612,
    "preview": "import { EditorView } from \"@codemirror/view\";\nimport Sidebar from \"components/sidebar\";\nimport DOMPurify from \"dompurif"
  },
  {
    "path": "src/components/scrollbar/index.js",
    "chars": 7529,
    "preview": "import \"./style.scss\";\nimport tag from \"html-tag-js\";\n\n/**\n * @typedef {object} Scrollbar\n * @property {function():void}"
  },
  {
    "path": "src/components/scrollbar/style.scss",
    "chars": 1405,
    "preview": ".scrollbar-container {\n  position: absolute;\n  background-color: transparent;\n  padding: 10px;\n  opacity: 0.5;\n  z-index"
  },
  {
    "path": "src/components/searchbar/index.js",
    "chars": 4345,
    "preview": "import \"./style.scss\";\nimport Ref from \"html-tag-js/ref\";\nimport actionStack from \"lib/actionStack\";\n\n/**\n * Create and "
  },
  {
    "path": "src/components/searchbar/style.scss",
    "chars": 886,
    "preview": "#search-bar {\n  position: fixed;\n  top: 0;\n  left: 0;\n  height: 45px;\n  width: 100%;\n  animation: show-searchbar 300ms e"
  },
  {
    "path": "src/components/settingsPage.js",
    "chars": 17691,
    "preview": "import \"./settingsPage.scss\";\nimport colorPicker from \"dialogs/color\";\nimport prompt from \"dialogs/prompt\";\nimport selec"
  },
  {
    "path": "src/components/settingsPage.scss",
    "chars": 18503,
    "preview": "@mixin settings-page-shell($list-selector) {\n\t#{$list-selector} {\n\t\tdisplay: flex;\n\t\tflex-direction: column;\n\t\tgap: 1.2r"
  },
  {
    "path": "src/components/sideButton/index.js",
    "chars": 547,
    "preview": "import \"./style.scss\";\n\n/**@type {HTMLDivElement} */\nexport const sideButtonContainer = <div className=\"side-buttons\"></"
  },
  {
    "path": "src/components/sideButton/style.scss",
    "chars": 517,
    "preview": ".side-button {\n  position: relative;\n  width: 15px;\n  padding: 2.5px 0;\n  border: none;\n  box-sizing: border-box;\n\n  .ic"
  },
  {
    "path": "src/components/sidebar/index.js",
    "chars": 14812,
    "preview": "import \"./style.scss\";\nimport toast from \"components/toast\";\nimport Ref from \"html-tag-js/ref\";\nimport actionStack from "
  },
  {
    "path": "src/components/sidebar/style.scss",
    "chars": 8315,
    "preview": "body.no-animation {\n  #sidebar {\n    border-right: solid 1px rgba(0, 0, 0, 0.2);\n  }\n}\n\n.page-replacement~#sidebar {\n  o"
  },
  {
    "path": "src/components/symbolsPanel/index.js",
    "chars": 10683,
    "preview": "import \"./styles.scss\";\nimport { fetchDocumentSymbols, navigateToSymbol } from \"cm/lsp\";\nimport actionStack from \"lib/ac"
  },
  {
    "path": "src/components/symbolsPanel/styles.scss",
    "chars": 9502,
    "preview": "@use \"../../styles/mixins.scss\";\n\n.symbols-panel-mask {\n    position: fixed;\n    top: 0;\n    left: 0;\n    right: 0;\n    "
  },
  {
    "path": "src/components/tabView.js",
    "chars": 2222,
    "preview": "import Ref from \"html-tag-js/ref\";\n\n/**\n *\n * @param {object} param0\n * @param {string} param0.id\n * @returns\n */\nexport"
  },
  {
    "path": "src/components/terminal/index.js",
    "chars": 467,
    "preview": "/**\n * Terminal Components Export\n */\n\nimport TerminalComponent from \"./terminal\";\nimport { DEFAULT_TERMINAL_SETTINGS } "
  },
  {
    "path": "src/components/terminal/ligatures.js",
    "chars": 1866,
    "preview": "// pretty basic ligature implementation for webview\nexport default class LigaturesAddon {\n\tconstructor(options = {}) {\n\t"
  },
  {
    "path": "src/components/terminal/terminal.js",
    "chars": 28074,
    "preview": "/**\n * Terminal Component using xtermjs\n * Provides a pluggable and customizable terminal interface\n */\n\nimport { Attach"
  },
  {
    "path": "src/components/terminal/terminalDefaults.js",
    "chars": 766,
    "preview": "import appSettings from \"lib/settings\";\n\nexport const DEFAULT_TERMINAL_SETTINGS = {\n\tfontSize: 12,\n\tfontFamily: \"MesloLG"
  },
  {
    "path": "src/components/terminal/terminalManager.js",
    "chars": 29484,
    "preview": "/**\n * Terminal Manager\n * Handles terminal session creation and management\n */\n\nimport EditorFile from \"lib/editorFile\""
  },
  {
    "path": "src/components/terminal/terminalThemeManager.js",
    "chars": 14493,
    "preview": "/**\n * Terminal Theme Manager\n * Manages terminal themes and provides plugin API for custom themes\n */\n\nclass TerminalTh"
  },
  {
    "path": "src/components/terminal/terminalTouchSelection.css",
    "chars": 2506,
    "preview": "/**\n * Terminal Touch Selection Styles\n */\n\n.terminal-selection-overlay {\n\tposition: absolute;\n\ttop: 0;\n\tleft: 0;\n\twidth"
  },
  {
    "path": "src/components/terminal/terminalTouchSelection.js",
    "chars": 41003,
    "preview": "/**\n * Touch Selection for Terminal\n */\nimport select from \"dialogs/select\";\nimport \"./terminalTouchSelection.css\";\n\ncon"
  },
  {
    "path": "src/components/tile/index.js",
    "chars": 1708,
    "preview": "import \"./style.scss\";\n\n/**\n * @typedef {object} Tile\n * @property {String} text\n * @property {String} subText\n * @prope"
  },
  {
    "path": "src/components/tile/style.scss",
    "chars": 1855,
    "preview": ".header,\nheader {\n  &.tile {\n    z-index: 98;\n    height: 45px;\n    background-color: rgb(153, 153, 255);\n    background"
  },
  {
    "path": "src/components/toast/index.js",
    "chars": 1280,
    "preview": "import \"./style.scss\";\n\n/**@type {Array<HTMLElement>} */\nconst toastQueue = [];\n\n/**\n * Show a toast message\n * @param {"
  },
  {
    "path": "src/components/toast/style.scss",
    "chars": 761,
    "preview": "#toast {\n  position: fixed;\n  bottom: 10px;\n  left: 0;\n  right: 0;\n  margin: 0 auto;\n  background-color: rgba(9, 14, 29,"
  },
  {
    "path": "src/components/tutorial.js",
    "chars": 395,
    "preview": "import toast from \"./toast\";\n\n/**\n *\n * @param {string} id\n * @param {string|HTMLElement|(hide: ()=>void)=>HTMLElement} "
  },
  {
    "path": "src/components/virtualList/index.js",
    "chars": 4088,
    "preview": "import \"./style.scss\";\nimport tag from \"html-tag-js\";\n\n/**\n * @typedef {object} VirtualListOptions\n * @property {number}"
  },
  {
    "path": "src/components/virtualList/style.scss",
    "chars": 116,
    "preview": ".virtual-spacer {\n\twidth: 100%;\n\tpointer-events: none;\n}\n\n.virtual-items {\n\tposition: relative;\n\tmin-width: 100%;\n}\n"
  },
  {
    "path": "src/dialogs/alert.js",
    "chars": 1515,
    "preview": "import DOMPurify from \"dompurify\";\nimport actionStack from \"lib/actionStack\";\nimport restoreTheme from \"lib/restoreTheme"
  },
  {
    "path": "src/dialogs/box.js",
    "chars": 3771,
    "preview": "import \"./style.scss\";\n\nimport actionStack from \"lib/actionStack\";\nimport restoreTheme from \"lib/restoreTheme\";\n\n/**\n * "
  },
  {
    "path": "src/dialogs/color.js",
    "chars": 3123,
    "preview": "import actionStack from \"lib/actionStack\";\nimport restoreTheme from \"lib/restoreTheme\";\nimport Picker from \"vanilla-pick"
  },
  {
    "path": "src/dialogs/confirm.js",
    "chars": 1717,
    "preview": "import DOMPurify from \"dompurify\";\nimport actionStack from \"lib/actionStack\";\nimport restoreTheme from \"lib/restoreTheme"
  },
  {
    "path": "src/dialogs/loader.js",
    "chars": 4336,
    "preview": "import DOMPurify from \"dompurify\";\nimport Ref from \"html-tag-js/ref\";\nimport actionStack from \"lib/actionStack\";\nimport "
  },
  {
    "path": "src/dialogs/multiPrompt.js",
    "chars": 7170,
    "preview": "import autosize from \"autosize\";\nimport Checkbox from \"components/checkbox\";\nimport inputhints from \"components/inputhin"
  },
  {
    "path": "src/dialogs/prompt.js",
    "chars": 3871,
    "preview": "import autosize from \"autosize\";\nimport actionStack from \"lib/actionStack\";\nimport restoreTheme from \"lib/restoreTheme\";"
  },
  {
    "path": "src/dialogs/rateBox.js",
    "chars": 1907,
    "preview": "import constants from \"lib/constants\";\nimport template from \"views/rating.hbs\";\nimport box from \"./box\";\n\nfunction rateB"
  },
  {
    "path": "src/dialogs/select.js",
    "chars": 5548,
    "preview": "import Checkbox from \"components/checkbox\";\nimport tile from \"components/tile\";\nimport DOMPurify from \"dompurify\";\nimpor"
  },
  {
    "path": "src/dialogs/style.scss",
    "chars": 5194,
    "preview": "@use \"../styles/mixins.scss\";\n\n.prompt {\n  position: fixed;\n  left: 50%;\n  top: 50%;\n  transform: translate(-50%, -50%) "
  },
  {
    "path": "src/fileSystem/externalFs.js",
    "chars": 4619,
    "preview": "import loader from \"dialogs/loader\";\nimport { decode, encode } from \"utils/encodings\";\nimport helpers from \"utils/helper"
  },
  {
    "path": "src/fileSystem/ftp.js",
    "chars": 8343,
    "preview": "import settings from \"lib/settings\";\nimport mimeType from \"mime-types\";\nimport { decode, encode } from \"utils/encodings\""
  },
  {
    "path": "src/fileSystem/index.js",
    "chars": 3137,
    "preview": "import ajax from \"@deadlyjack/ajax\";\nimport { decode } from \"utils/encodings\";\nimport Url from \"utils/Url\";\nimport exter"
  },
  {
    "path": "src/fileSystem/internalFs.js",
    "chars": 9737,
    "preview": "import fsOperation from \"fileSystem\";\nimport ajax from \"@deadlyjack/ajax\";\nimport { decode, encode } from \"utils/encodin"
  },
  {
    "path": "src/fileSystem/sftp.js",
    "chars": 14079,
    "preview": "import settings from \"lib/settings\";\nimport mimeType from \"mime-types\";\nimport { decode, encode } from \"utils/encodings\""
  },
  {
    "path": "src/handlers/editorFileTab.js",
    "chars": 8539,
    "preview": "import constants from \"lib/constants\";\nimport settings from \"lib/settings\";\n\nconst opts = { passive: false };\n\n/**\n * Cl"
  },
  {
    "path": "src/handlers/intent.js",
    "chars": 2976,
    "preview": "import fsOperation from \"fileSystem\";\nimport openFile from \"lib/openFile\";\nimport helpers from \"utils/helpers\";\n\nconst h"
  },
  {
    "path": "src/handlers/keyboard.js",
    "chars": 4983,
    "preview": "import {\n\tgetSystemConfiguration,\n\tHARDKEYBOARDHIDDEN_NO,\n} from \"lib/systemConfiguration\";\nimport KeyboardEvent from \"u"
  },
  {
    "path": "src/handlers/purchase.js",
    "chars": 991,
    "preview": "import helpers from \"utils/helpers\";\n\nexport default function purchaseListener(onpurchase, onerror) {\n\treturn [\n\t\t(purch"
  },
  {
    "path": "src/handlers/quickTools.js",
    "chars": 19132,
    "preview": "import {\n\tfindNext as cmFindNext,\n\tfindPrevious as cmFindPrevious,\n\treplaceAll as cmReplaceAll,\n\treplaceNext as cmReplac"
  },
  {
    "path": "src/handlers/quickToolsInit.js",
    "chars": 7669,
    "preview": "import quickTools from \"components/quickTools\";\nimport constants from \"lib/constants\";\nimport appSettings from \"lib/sett"
  },
  {
    "path": "src/handlers/windowResize.js",
    "chars": 1650,
    "preview": "let resizeTimeout;\n\n/**\n * @typedef {'resize'|'resizeStart'} ResizeEventName\n */\n\nconst event = {\n\tresize: [],\n\tresizeSt"
  },
  {
    "path": "src/index.d.ts",
    "chars": 2347,
    "preview": "type LanguageMap = { [key: string]: string };\ndeclare const strings: LanguageMap;\ndeclare const ASSETS_DIRECTORY: string"
  },
  {
    "path": "src/lang/ar-ye.json",
    "chars": 35605,
    "preview": "{\n\t\"lang\": \"العربية\",\n\t\"about\": \"حول\",\n\t\"active files\": \"الملفات المفتوحة\",\n\t\"add path\": \"إضافة مسار\",\n\t\"alert\": \"تنبيه\""
  },
  {
    "path": "src/lang/be-by.json",
    "chars": 38013,
    "preview": "{\n\t\"lang\": \"Беларуская\",\n\t\"about\": \"Пра праграму\",\n\t\"active files\": \"Адкрытыя файлы\",\n\t\"alert\": \"Абвестка\",\n\t\"app theme\""
  },
  {
    "path": "src/lang/bn-bd.json",
    "chars": 37307,
    "preview": "{\n\t\"lang\": \"বাংলা\",\n\t\"about\": \"সম্পর্কে\",\n\t\"active files\": \"সক্রিয় ফাইল\",\n\t\"alert\": \"সতর্কীকরণ\",\n\t\"app theme\": \"অ্যাপ থ"
  },
  {
    "path": "src/lang/cs-cz.json",
    "chars": 37932,
    "preview": "{\n\t\"lang\": \"Čeština\",\n\t\"about\": \"O aplikaci\",\n\t\"active files\": \"Zobrazení aktivních souborů\",\n\t\"alert\": \"Upozornění\",\n\t\""
  },
  {
    "path": "src/lang/de-de.json",
    "chars": 39394,
    "preview": "{\n\t\"lang\": \"Deutsch\",\n\t\"about\": \"über\",\n\t\"active files\": \"Aktive Dateien\",\n\t\"alert\": \"Warnung\",\n\t\"app theme\": \"App-Desig"
  },
  {
    "path": "src/lang/en-us.json",
    "chars": 36406,
    "preview": "{\n\t\"lang\": \"English\",\n\t\"about\": \"About\",\n\t\"active files\": \"Active files\",\n\t\"alert\": \"Alert\",\n\t\"app theme\": \"App theme\",\n"
  },
  {
    "path": "src/lang/es-sv.json",
    "chars": 38843,
    "preview": "{\n\t\"lang\": \"Español (by DouZerr)\",\n\t\"about\": \"Información\",\n\t\"active files\": \"Archivos Activos\",\n\t\"alert\": \"Alerta\",\n\t\"a"
  },
  {
    "path": "src/lang/fr-fr.json",
    "chars": 38517,
    "preview": "{\n\t\"lang\": \"Français\",\n\t\"about\": \"À propos\",\n\t\"active files\": \"Fichiers ouverts\",\n\t\"alert\": \"Alerte\",\n\t\"app theme\": \"Thè"
  },
  {
    "path": "src/lang/he-il.json",
    "chars": 35540,
    "preview": "{\n\t\"lang\": \"עברית\",\n\t\"about\": \"אודות\",\n\t\"active files\": \"קבצים פעילים\",\n\t\"alert\": \"התראה\",\n\t\"app theme\": \"עיצוב\",\n\t\"auto"
  },
  {
    "path": "src/lang/hi-in.json",
    "chars": 37023,
    "preview": "{\n\t\"lang\": \"हिंदी\",\n\t\"about\": \"एप्लीकेशन के बारे में\",\n\t\"active files\": \"सक्रिय फ़ाइलें\",\n\t\"alert\": \"चेतावनी\",\n\t\"app the"
  },
  {
    "path": "src/lang/hu-hu.json",
    "chars": 41192,
    "preview": "{\n\t\"lang\": \"Magyar\",\n\t\"about\": \"Névjegy\",\n\t\"active files\": \"Megnyitott fájlok\",\n\t\"alert\": \"Figyelmeztetés\",\n\t\"app theme\""
  },
  {
    "path": "src/lang/id-id.json",
    "chars": 39023,
    "preview": "{\n\t\"lang\": \"Bahasa Indonesia\",\n\t\"about\": \"Tentang\",\n\t\"active files\": \"Berkas Aktif\",\n\t\"alert\": \"Peringatan\",\n\t\"app theme"
  },
  {
    "path": "src/lang/ir-fa.json",
    "chars": 36677,
    "preview": "{\n\t\"lang\": \"فارسی - ترجمه صفا صفری\",\n\t\"about\": \"درباره ما\",\n\t\"active files\": \"فایلهای فعال\",\n\t\"alert\": \"هشدار\",\n\t\"app th"
  }
]

// ... and 310 more files (download for full content)

About this extraction

This page contains the full source code of the deadlyjack/code-editor GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 510 files (4.6 MB), approximately 1.2M tokens, and a symbol index with 2848 extracted functions, classes, methods, constants, and types. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.

Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.

Copied to clipboard!