Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
12 changes: 12 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,3 +1,15 @@
## 1.6.0
- Auto config for Deno and Node.js
- Toggle between Deno mode and Node.js mode with a one click.
- You can freely combine the runtime (Deno or Node.js), linter (deno_lint or
eslint), and formatter (deno_fmt or prettier).
- fix bug when outline-view result was null (https://github.com/atom-community/atom-languageclient/pull/150)

## 1.5.0
- format on save
- format on Format Current File command (or menu > packages > Deno > Format Curent File)
- format on Format All File command (or menu > packages > Deno > Format All File)

## 1.4.0
- Hotfix because 1.3 is broken
- The package size was temporarily bloated.
Expand Down
10 changes: 10 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,11 @@ Translations:

# atom-ide-deno

[![CI](https://github.com/ayame113/atom-ide-deno/actions/workflows/CI.yml/badge.svg)](https://github.com/ayame113/atom-ide-deno/actions/workflows/CI.yml)
[![Dependency Status](https://david-dm.org/ayame113/atom-ide-deno.svg)](https://david-dm.org/ayame113/atom-ide-deno)
[![apm](https://img.shields.io/apm/dm/atom-ide-deno.svg)](https://atom.io/packages/atom-ide-deno)
[![apm](https://img.shields.io/apm/v/atom-ide-deno.svg)](https://atom.io/packages/atom-ide-deno)

Javascript and TypeScript language support for Atom-IDE, powered by the deno
language server.

Expand Down Expand Up @@ -49,6 +54,11 @@ are available.
The configuration of the settings is similar to
[vscode_deno](https://github.com/denoland/vscode_deno).

- Auto config for Deno and Node.js:
- You can freely combine the runtime (Deno or Node.js), linter (deno_lint or
eslint), and formatter (deno_fmt or prettier). Please note that this rewrite
your settings. This is disabled by default.
![auto config](https://raw.githubusercontent.com/ayame113/atom-ide-deno/main/screenshot/auto_config.png)
- lsp flags
- Enables language server: Whether to turn on Language Server
- Enables code lens implementations: Code lens settings (currently not
Expand Down
Binary file removed deno.png
Binary file not shown.
177 changes: 177 additions & 0 deletions lib/auto_config.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,177 @@
import { CompositeDisposable, Disposable } from "atom";
import type { StatusBar, Tile } from "atom/status-bar";
//https://github.com/atom/atom-select-list/pull/31
//import {SelectListView} from "atom-select-list";

interface SelectListView {
selectItem(item: Record<string, unknown> | string): Promise<void>;
confirmSelection(): void;
cancelSelection(): void;
}

type modes = "deno" | "node";
let statusBarElement: HTMLAnchorElement;
let statusBarTile: Tile;
const subscriptions = new CompositeDisposable();
let tooltip: Disposable;

// consumeStatusBarとactivateの呼ばれる順番が前後する
// statusbarを受け取ってresolveするPromise
// getstatusBar.then(statusBar=>...)
export let consumeStatusBar: (param: StatusBar) => void;
const getStatusBar = new Promise<StatusBar>((resolve) => {
consumeStatusBar = resolve;
});

export function activate({ grammarScopes }: { grammarScopes: string[] }) {
//下部のステータスバーをクリックして切り替え
statusBarElement = document.createElement("a");
statusBarElement.classList.add("inline-block");
if (!atom.config.get("atom-ide-deno.modes.enable")) {
statusBarElement.classList.add("atom-ide-deno-status-bar-disable");
}
getStatusBar.then((statusBar) => {
statusBarTile = statusBar.addRightTile({
item: statusBarElement,
priority: 10.5,
});
});
subscriptions.add(
atom.config.onDidChange("atom-ide-deno.modes.currentMode", changeMode),
atom.config.onDidChange("atom-ide-deno.modes.DenoMode", changeMode),
atom.config.onDidChange("atom-ide-deno.modes.NodeMode", changeMode),
atom.config.onDidChange("atom-ide-deno.modes.enable", ({ newValue }) => {
statusBarElement.classList[newValue ? "remove" : "add"](
"atom-ide-deno-status-bar-disable",
);
changeMode();
}),
atom.workspace.observeActiveTextEditor((editor: any) => {
//js/tsと設定画面以外ではステータスバーを非表示
if (
grammarScopes.includes(editor?.getGrammar?.()?.scopeName) ||
atom.workspace.getPaneItems().some((e: any) =>
e?.getURI() == "atom://config"
)
) {
statusBarElement.classList.remove(
"atom-ide-deno-status-bar-not-in-scope",
);
} else {
statusBarElement.classList.add("atom-ide-deno-status-bar-not-in-scope");
}
}),
);
statusBarElement.addEventListener("click", () => {
atom.config.set(
"atom-ide-deno.modes.currentMode",
atom.config.get("atom-ide-deno.modes.currentMode") == "deno"
? "node"
: "deno",
);
});
// 全てのpackageの初期が終わったらchangeMode
atom.packages.onDidActivateInitialPackages(changeMode);
}

function changeMode() {
if (!atom.config.get("atom-ide-deno.modes.enable")) {
return;
}
const newMode: modes = atom.config.get("atom-ide-deno.modes.currentMode");
console.log(`Mode change to ${newMode}`);
if (newMode == "deno") {
statusBarElement.innerText = "Deno";
statusBarElement.classList.remove("status-bar-icon-node");
statusBarElement.classList.add("status-bar-icon-deno");
} else {
statusBarElement.innerText = "Node.js";
statusBarElement.classList.remove("status-bar-icon-deno");
statusBarElement.classList.add("status-bar-icon-node");
}
//設定変更
//deno lsp: linterOnlyモード+lint:false->なにも行わない
if (newMode == "deno") {
//atom.packages.enablePackage('atom-ide-deno')
atom.config.set("atom-ide-deno.lspFlags.enable", true);
atom.config.set("atom-ide-deno.advanced.linterOnly", false);
atom.packages.disablePackage("atom-ide-javascript");
atom.packages.disablePackage("atom-typescript");
atom.packages.disablePackage("javascript-drag-import");
} else {
//atom.packages.disablePackage('atom-ide-deno')
atom.config.set("atom-ide-deno.lspFlags.enable", true);
atom.config.set("atom-ide-deno.advanced.linterOnly", true);
atom.packages.enablePackage("atom-ide-javascript");
atom.packages.enablePackage("atom-typescript");
atom.packages.enablePackage("javascript-drag-import");
}
const { linter, formatter } = atom.config.get(
`atom-ide-deno.modes.${newMode == "deno" ? "Deno" : "Node"}Mode`,
);
// linter
(async () => {
// deno lint
const isDenoLintEnable = linter == "deno lint";
atom.config.set("atom-ide-deno.lspFlags.lint", isDenoLintEnable);
// eslint
const isEslintEnable = linter == "eslint";
await atom.commands.dispatch(
(atom.workspace as any).getElement(),
isEslintEnable ? "linter:enable-linter" : "linter:disable-linter",
);
const selectListViewItem = atom.workspace.getModalPanels().filter((v) =>
v.isVisible() && v.getItem().constructor.name == "SelectListView"
)[0]?.getItem() as SelectListView;
try {
await selectListViewItem?.selectItem("ESLint");
selectListViewItem?.confirmSelection();
} catch (_) {
selectListViewItem.cancelSelection();
}
try {
await atom.commands.dispatch(
(atom.workspace.getActiveTextEditor() as any).getElement(),
"linter:lint",
);
} catch (_) {
_;
}
})();
// formatter
{
//deno fmt
const isDenoFormatEnable = formatter == "deno fmt";
atom.config.set("atom-ide-deno.format.onSave.enable", isDenoFormatEnable);
// prettier
const isPrettierEnable = formatter == "prettier";
if (isPrettierEnable) {
atom.packages.enablePackage("prettier-atom");
} else {
atom.packages.disablePackage("prettier-atom");
}
}
//tooltip
tooltip?.dispose();
tooltip = atom.tooltips.add(statusBarElement, {
title: `<div style="text-align:left;">
<b>Enabled</b>:<br>
${
(newMode == "deno"
? ["atom-ide-deno"]
: ["atom-ide-javascript", "atom-typescript", "javascript-drag-import"])
.map((v) => `• ${v}<br>`).join("")
}
• ${linter}<br>
• ${formatter}<hr style="margin:0.25em 0;">
Click to toggle Deno<br>and Node.js mode.
</div>`,
delay: { show: 0, hide: 100 },
});
}

export function deactivate() {
statusBarTile.destroy();
subscriptions.dispose();
tooltip.dispose();
}
Loading