@ngstack/code-editor
Version:
Code editor component for Angular applications.
274 lines (209 loc) • 6.49 kB
Markdown
# /code-editor
Code editor component for Angular applications.
Based on the [Monaco](https://www.npmjs.com/package/monaco-editor) editor
that powers [VS Code](https://github.com/Microsoft/vscode).
<a href="https://www.buymeacoffee.com/denys" target="_blank">
<img src="https://cdn.buymeacoffee.com/buttons/default-orange.png" alt="Buy Me A Coffee" height="51" width="217">
</a>
## Installing
```sh
npm install /code-editor
```
## Integrating with Angular CLI project
Import `CodeEditorModule` into your main application module:
```ts
import { CodeEditorModule } from '@ngstack/code-editor';
export class AppModule {}
```
If you want to use a specific version of the Monaco editor, use `editorVersion` parameter.
If not provided, the component is always going to use the `latest` version.
```ts
export class AppModule {}
```
Update template to use the `ngs-code-editor`:
```html
<ngs-code-editor [theme]="theme" [codeModel]="model" [options]="options" (valueChanged)="onCodeChanged($event)"></ngs-code-editor>
```
Update component controller class and provide corresponding properties and events:
```ts
export class AppComponent {
theme = 'vs-dark';
model: CodeModel = {
language: 'json',
uri: 'main.json',
value: '{}'
};
options = {
contextmenu: true,
minimap: {
enabled: true
}
};
onCodeChanged(value) {
console.log('CODE', value);
}
}
```
## Input Properties
| Name | Type | Default Value | Description |
| --------- | --------- | ------------- | -------------------------------------------------------------- |
| theme | string | vs | Editor theme. Supported values: `vs`, `vs-dark` or `hc-black`. |
| options | Object | {...} | Editor options. |
| readOnly | boolean | false | Toggles readonly state of the editor. |
| codeModel | CodeModel | | Source code model. |
The `codeModel` property holds the value that implements the `CodeModel` interface:
```ts
export interface CodeModel {
language: string;
value: string;
uri: string;
dependencies?: Array<string>;
schemas?: Array<{
uri: string;
schema: Object;
}>;
}
```
### Editor Options
For available options see [IEditorConstructionOptions](https://microsoft.github.io/monaco-editor/typedoc/interfaces/editor.IEditorConstructionOptions.html) docs.
The following options are used by default when Editor Component gets created:
```json
{
"lineNumbers": true,
"contextmenu": false,
"minimap": {
"enabled": false
}
}
```
## Output Events
| Name | Argument Type | Description |
| ------------ | ------------- | ------------------------------------------------------- |
| loaded | | Raised when editor finished loading all its components. |
| valueChanged | string | Raised after editor value gets changed. |
## Typings
The editor is able to resolve typing libraries when set to the `Typescript` or `Javascript` language.
Use `dependencies` property to provide a list of libraries to resolve
```html
<ngs-code-editor [codeModel]="model" ...> </ngs-code-editor>
```
And in the controller class:
```ts
export class MyEditorComponent {
codeModel: CodeModel = {
language: 'typescript',
uri: 'main.ts',
value: '',
dependencies: ['@types/node', '@ngstack/translate', '@ngstack/code-editor']
};
}
```
Run your application, it may take a few seconds to resolve dependencies.
It is performed in the background (web worker), so you can type your code.
Try pasting the following snippet at runtime:
```typescript
import { TranslateModule, TranslateService } from '@ngstack/translate';
import { CodeEditorModule } from '@ngstack/code-editor';
import * as fs from 'fs';
export class MyClass {
constructor(translate: TranslateService) {}
}
```
You should have all the types resolved and auto-completion working.
## JSON schemas
You can associate multiple schemas when working with JSON files.
```html
<ngs-code-editor [codeModel]="model" ...> </ngs-code-editor>
```
Provide the required schemas like in the example below.
```ts
export class MyEditorComponent {
codeModel: CodeModel = {
language: 'json',
uri: 'main.json',
value: '{ "test": true }',
schemas: [
{
uri: 'http://custom/schema.json',
schema: {
type: 'object',
properties: {
type: {
enum: ['button', 'textbox']
}
}
}
}
]
};
}
```
The schemas get automatically installed and associated with the corresponding file.
## Offline Setup
### Editor
You can run the editor in the offline mode with your Angular CLI application using the following steps:
Install the `monaco-editor`:
```sh
npm install monaco-editor
```
Update the `angular.json` file and append the following asset rule:
```json
{
"glob": "**/*",
"input": "../node_modules/monaco-editor/min",
"output": "./assets/monaco"
}
```
Update the main application module and setup the service to use the custom `baseUrl` when application starts:
```ts
import { CodeEditorModule, CodeEditorService } from '@ngstack/code-editor';
export class AppModule {}
```
### Typings Worker
Update the `angular.json` file and append the following asset rule:
```ts
{
"glob": "**/*.js",
"input": "../node_modules/@ngstack/code-editor/workers",
"output": "./assets/workers"
}
```
Then update the `CodeEditorService` configuration at the application startup:
```ts
export class AppModule {}
```
## Lazy Loading
To enable Lazy Loading
use `CodeEditorModule.forRoot()` in the main application,
and `CodeEditorModule.forChild()` in all lazy-loaded feature modules.
For more details please refer to [Lazy Loading Feature Modules](https://angular.io/guide/lazy-loading-ngmodules)