Skip to content

Commit

Permalink
chore: improve default lang settings
Browse files Browse the repository at this point in the history
Provide settings for new languages
  • Loading branch information
lifeart committed Jul 15, 2023
2 parents 648de6c + aff5140 commit aa3d895
Show file tree
Hide file tree
Showing 2 changed files with 109 additions and 83 deletions.
24 changes: 0 additions & 24 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -47,30 +47,6 @@ export default class MyComponent extends Component {
}
```

Since the Typescript Language Server will not be running for these file types, you will need to add the following settings to your `settings.json` file to fill in the gaps. Consider installing [Glint](https://typed-ember.gitbook.io/glint/) to get type checking and hover information.

```jsonc
// add language specific settings
"[glimmer-js]": {
"editor.defaultFormatter": "esbenp.prettier-vscode",
"editor.foldingStrategy": "indentation"
},
"[glimmer-ts]": {
"editor.defaultFormatter": "esbenp.prettier-vscode",
"editor.foldingStrategy": "indentation"
},
// enable eslint for glimmer files
{
"eslint.validate": [
"glimmer-ts",
"glimmer-js"
],
"eslint.rules.customizations": [
{ "rule": "*", "severity": "warn" },
]
}
```

## Customizing the theme

![customize-theme](assets/customize-theme.gif)
Expand Down
168 changes: 109 additions & 59 deletions src/index.ts
Original file line number Diff line number Diff line change
@@ -1,73 +1,123 @@
import * as vscode from 'vscode';
import * as vscode from "vscode";

const typeScriptExtensionId = 'vscode.typescript-language-features';
const pluginId = 'typescript-hbs-plugin';
const configurationSection = 'hbs';
const typeScriptExtensionId = "vscode.typescript-language-features";
const pluginId = "typescript-hbs-plugin";
const configurationSection = "hbs";

interface SynchronizedConfiguration {
tags?: ReadonlyArray<string>;
format: {
enabled?: boolean;
}
tags?: ReadonlyArray<string>;
format: {
enabled?: boolean;
};
}

function updateLanguageSettings(languageId: string) {
const config = vscode.workspace.getConfiguration("", {
languageId,
});
config.update(
"editor.defaultFormatter",
"esbenp.prettier-vscode",
vscode.ConfigurationTarget.Global,
true
);
config.update(
"editor.foldingStrategy",
"indentation",
vscode.ConfigurationTarget.Global,
true
);
}

updateLanguageSettings("glimmer-js");
updateLanguageSettings("glimmer-ts");

const eslintConfig = vscode.workspace.getConfiguration("eslint");

eslintConfig.update(
"validate",
["glimmer-ts", "glimmer-js"],
vscode.ConfigurationTarget.Global
);
eslintConfig.update(
"rules.customizations",
[{ rule: "*", severity: "warn" }],
vscode.ConfigurationTarget.Global
);

export async function activate(context: vscode.ExtensionContext) {
const extension = vscode.extensions.getExtension(typeScriptExtensionId);
if (!extension) {
return;
}

await extension.activate();
if (!extension.exports || !extension.exports.getAPI) {
return;
}
const api = extension.exports.getAPI(0);
if (!api) {
return;
}

vscode.workspace.onDidChangeConfiguration(e => {
if (e.affectsConfiguration(configurationSection)) {
synchronizeConfiguration(api);
}
}, undefined, context.subscriptions);

synchronizeConfiguration(api);
const extension = vscode.extensions.getExtension(typeScriptExtensionId);
if (!extension) {
return;
}

await extension.activate();
if (!extension.exports || !extension.exports.getAPI) {
return;
}
const api = extension.exports.getAPI(0);
if (!api) {
return;
}

vscode.workspace.onDidChangeConfiguration(
(e) => {
if (e.affectsConfiguration(configurationSection)) {
synchronizeConfiguration(api);
}
},
undefined,
context.subscriptions
);

synchronizeConfiguration(api);
}

function synchronizeConfiguration(api: any) {
api.configurePlugin(pluginId, getConfiguration());
api.configurePlugin(pluginId, getConfiguration());
}

function getConfiguration(): SynchronizedConfiguration {
const config = vscode.workspace.getConfiguration(configurationSection);
const outConfig: SynchronizedConfiguration = {
format: {
enabled: true
},
tags: ['hbs']
};

withConfigValue<string[]>(config, 'tags', tags => { outConfig.tags = tags; });
withConfigValue<boolean>(config, 'format.enabled', enabled => { outConfig.format.enabled = enabled; });
console.log('outConfig', JSON.stringify(outConfig));
return outConfig;
const config = vscode.workspace.getConfiguration(configurationSection);
const outConfig: SynchronizedConfiguration = {
format: {
enabled: true,
},
tags: ["hbs"],
};

withConfigValue<string[]>(config, "tags", (tags) => {
outConfig.tags = tags;
});
withConfigValue<boolean>(config, "format.enabled", (enabled) => {
outConfig.format.enabled = enabled;
});
console.log("outConfig", JSON.stringify(outConfig));
return outConfig;
}

function withConfigValue<T>(config: vscode.WorkspaceConfiguration, key: string, withValue: (value: T) => void): void {
const configSetting = config.inspect(key);
if (!configSetting) {
return;
}

// Make sure the user has actually set the value.
// VS Code will return the default values instead of `undefined`, even if user has not don't set anything.
if (typeof configSetting.globalValue === 'undefined' && typeof configSetting.workspaceFolderValue === 'undefined' && typeof configSetting.workspaceValue === 'undefined') {
return;
}

const value = config.get<T | undefined>(key, undefined);
if (typeof value !== 'undefined') {
withValue(value);
}
}
function withConfigValue<T>(
config: vscode.WorkspaceConfiguration,
key: string,
withValue: (value: T) => void
): void {
const configSetting = config.inspect(key);
if (!configSetting) {
return;
}

// Make sure the user has actually set the value.
// VS Code will return the default values instead of `undefined`, even if user has not don't set anything.
if (
typeof configSetting.globalValue === "undefined" &&
typeof configSetting.workspaceFolderValue === "undefined" &&
typeof configSetting.workspaceValue === "undefined"
) {
return;
}

const value = config.get<T | undefined>(key, undefined);
if (typeof value !== "undefined") {
withValue(value);
}
}

0 comments on commit aa3d895

Please sign in to comment.