npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2026 – Pkg Stats / Ryan Hefner

@ruijie-sso/code-editor

v1.0.12-beta

Published

code-editor library for SSO Admin

Readme

code-editor 代码编辑器

get-started

1. 所需 app 的 project.json 或 angular.json 里

在 assets 里加上


{
  "glob": "**/*",
  "input": "./node_modules/monaco-editor",
  "output": "monaco-editor/"
},
{
"glob": "**/*",
"input": "./node_modules/monaco-ace-tokenizer",
"output": "monaco-ace-tokenizer/"
}

例如:

{
  "projectType": "application",
  "root": "apps/dev-code-editor",
  "sourceRoot": "apps/dev-code-editor/src",
  "prefix": "app",
  "targets": {
    "build": {
      "executor": "@angular-devkit/build-angular:browser",
      "outputs": ["{options.outputPath}"],
      "options": {
        "outputPath": "dist/apps/dev-code-editor",
        "index": "apps/dev-code-editor/src/index.html",
        "main": "apps/dev-code-editor/src/main.ts",
        "polyfills": "apps/dev-code-editor/src/polyfills.ts",
        "tsConfig": "apps/dev-code-editor/tsconfig.app.json",
        "inlineStyleLanguage": "scss",
        "assets": [
          "apps/dev-code-editor/src/favicon.ico",
          "apps/dev-code-editor/src/assets",
+          {
+            "glob": "**/*",
+            "input": "./node_modules/monaco-editor",
+            "output": "monaco-editor/"
+          },
+          {
+            "glob": "**/*",
+            "input": "./node_modules/monaco-ace-tokenizer",
+            "output": "monaco-ace-tokenizer/"
+          }
        ],
        "styles": ["apps/dev-code-editor/src/styles.scss"],
        "scripts": []
      },
      "configurations": {
        "production": {
          "budgets": [
            {
              "type": "initial",
              "maximumWarning": "500kb",
              "maximumError": "1mb"
            },
            {
              "type": "anyComponentStyle",
              "maximumWarning": "2kb",
              "maximumError": "4kb"
            }
          ],
          "fileReplacements": [
            {
              "replace": "apps/dev-code-editor/src/environments/environment.ts",
              "with": "apps/dev-code-editor/src/environments/environment.prod.ts"
            }
          ],
          "outputHashing": "all"
        },
        "development": {
          "buildOptimizer": false,
          "optimization": false,
          "vendorChunk": true,
          "extractLicenses": false,
          "sourceMap": true,
          "namedChunks": true
        }
      },
      "defaultConfiguration": "production"
    },
    "serve": {
      "executor": "@angular-devkit/build-angular:dev-server",
      "configurations": {
        "production": {
          "browserTarget": "dev-code-editor:build:production"
        },
        "development": {
          "browserTarget": "dev-code-editor:build:development"
        }
      },
      "defaultConfiguration": "development"
    },
    "extract-i18n": {
      "executor": "@angular-devkit/build-angular:extract-i18n",
      "options": {
        "browserTarget": "dev-code-editor:build"
      }
    },
    "lint": {
      "executor": "@nrwl/linter:eslint",
      "options": {
        "lintFilePatterns": ["apps/dev-code-editor/src/**/*.ts", "apps/dev-code-editor/src/**/*.html"]
      }
    },
    "test": {
      "executor": "@nrwl/jest:jest",
      "outputs": ["coverage/apps/dev-code-editor"],
      "options": {
        "jestConfig": "apps/dev-code-editor/jest.config.js",
        "passWithNoTests": true
      }
    }
  },
  "tags": ["angular-app"]
}

因为在加载模块的时候会用到这些变量。

2. 在所需模块里(module)引入

例子:

import { NgModule } from '@angular/core';
import { BrowserModule } from '@angular/platform-browser';

import { AppComponent } from './app.component';
import { CodeEditorAppModule } from '@ruijie-sso/code-editor';
import { FormsModule } from '@angular/forms';

@NgModule({
  declarations: [AppComponent],
  imports: [BrowserModule, +FormsModule, +CodeEditorAppModule],
  providers: [],
  bootstrap: [AppComponent]
})
export class AppModule {}

3. 在 html 里

例子:

<rg-code-editor-app (contentChange)="contentChange($event)"></rg-code-editor-app>

4. 在 ts 里

例子:

import { Component, OnInit, ViewChild } from '@angular/core';
import { CodeEditorAppComponent } from '@ruijie-sso/code-editor';

@Component({
  selector: 'app-root',
  templateUrl: './app.component.html',
  styleUrls: ['./app.component.scss']
})
export class AppComponent implements OnInit {
  @ViewChild(CodeEditorAppComponent) codeEditorApp?: CodeEditorAppComponent;

  constructor() {}

  /* 注意,这里一定要先去等待CodeEditorAppComponent组件里的初始化完成,不然会报错,在其初始化之前就使用它了。
  async ngOnInit() {
    await this.codeEditorApp?.ngOnInit();
  }

  /**
   * 获取当前框里的值
   */
  getValue() {
    console.log(this.codeEditorApp?.getValue());
  }

  /**
   * 监听内容变化值
   * @param res 内容
   */
  contentChange(res: string) {
    console.log(res);
  }
}

项目内容

核心与应用

核心模块

  • code-editor/

    该文件夹下为核心文件,仅仅渲染了代码内容区域,不涉及其他任何功能

    主要涉及功能

    1. 自定义宽度(必须用固定值),默认 800px
    2. 自定义高度(必须用固定值),默认 600px
    3. 自定义默认提示(placeholder)----暂未实现
  • utils/

    该文件夹下为核心算法文件

    主要包括内容

    1. base-url => 获取默认 monaco 编辑器资源链接
    2. load-monaco-editor => moaco 加载器
    3. urlJoin => 字符串地址拼接

应用模块

code-editor-app/

应用文件夹,对 code-editor 进行业务性封装

目前主要实现的功能有

  1. 自定义内容区域宽高
  2. 自定义当前国际化语言
  3. 自定义默认代码语言
  4. 自定义默认主题
  5. 监听当前内容变化
  6. 获取当前内容的值
  7. 切换当前代码语言
  • 目前支持代码语言的有(按项目需要排序)
<option value="java">java</option>
<option value="javascript">javascript</option>
<option value="json">json</option>
<option value="sql">sql</option>
<option value="groovy">groovy</option>
<option value="plaintext">plaintext</option>
<option value="abap">abap</option>
<option value="apex">apex</option>
<option value="azcli">azcli</option>
<option value="bat">bat</option>
<option value="bicep">bicep</option>
<option value="cameligo">cameligo</option>
<option value="clojure">clojure</option>
<option value="coffeescript">coffeescript</option>
<option value="c">c</option>
<option value="cpp">cpp</option>
<option value="csharp">csharp</option>
<option value="csp">csp</option>
<option value="css">css</option>
<option value="dart">dart</option>
<option value="dockerfile">dockerfile</option>
<option value="ecl">ecl</option>
<option value="elixir">elixir</option>
<option value="flow9">flow9</option>
<option value="fsharp">fsharp</option>
<option value="go">go</option>
<option value="graphql">graphql</option>
<option value="handlebars">handlebars</option>
<option value="hcl">hcl</option>
<option value="html">html</option>
<option value="ini">ini</option>
<option value="julia">julia</option>
<option value="kotlin">kotlin</option>
<option value="less">less</option>
<option value="lexon">lexon</option>
<option value="liquid">liquid</option>
<option value="lua">lua</option>
<option value="m3">m3</option>
<option value="markdown">markdown</option>
<option value="mips">mips</option>
<option value="msdax">msdax</option>
<option value="mysql">mysql</option>
<option value="objective-c">objective-c</option>
<option value="pascal">pascal</option>
<option value="pascaligo">pascaligo</option>
<option value="perl">perl</option>
<option value="pgsql">pgsql</option>
<option value="php">php</option>
<option value="pla">pla</option>
<option value="postiats">postiats</option>
<option value="powerquery">powerquery</option>
<option value="powershell">powershell</option>
<option value="proto">proto</option>
<option value="pug">pug</option>
<option value="python">python</option>
<option value="qsharp">qsharp</option>
<option value="r">r</option>
<option value="razor">razor</option>
<option value="redis">redis</option>
<option value="redshift">redshift</option>
<option value="restructuredtext">restructuredtext</option>
<option value="ruby">ruby</option>
<option value="rust">rust</option>
<option value="sb">sb</option>
<option value="scala">scala</option>
<option value="scheme">scheme</option>
<option value="scss">scss</option>
<option value="shell">shell</option>
<option value="sol">sol</option>
<option value="aes">aes</option>
<option value="sparql">sparql</option>
<option value="st">st</option>
<option value="swift">swift</option>
<option value="systemverilog">systemverilog</option>
<option value="verilog">verilog</option>
<option value="tcl">tcl</option>
<option value="twig">twig</option>
<option value="typescript">typescript</option>
<option value="vb">vb</option>
<option value="xml">xml</option>
<option value="yaml">yaml</option>
<option value="ada">ada</option>
<option value="cobol">cobol</option>
<option value="d">d</option>
<option value="dart">dart</option>
<option value="elixir">elixir</option>
<option value="erlang">erlang</option>
<option value="fortran">fortran</option>
<option value="haskell">haskell</option>
<option value="julia">julia</option>
<option value="ocaml">ocaml</option>
<option value="racket">racket</option>
<option value="sbcl">sbcl</option>
<option value="scala">scala</option>
  1. 切换当前内容框主题
  • 目前支持的内容框主题有(需要扩展支持的,去demo 上选)
<option value="vs">VS</option>
<option value="vs-dark">VS Dark</option>
<option value="hc-black">High Contrast (Dark)</option>

API

| 属性 | 类型 | 默认值 | 输出 | 描述 | | ----------------- | -------- | ------ | ------- | ---------------------------- | | [baseUrl] | string | "" | ---- | 默认路径 monaco 资源路径 | | [localizeCode] | string | "" | ---- | 显示语言,默认根据浏览器判断 | | [language] | string | "java" | ---- | 默认语言 | | [theme] | string | "vs" | ---- | 默认主题 | | [defaultValue] | string | "" | ---- | 默认代码 | | [contentWidth] | number | 800 | ---- | 内容区域的宽度 | | [contentHeight] | number | 600 | ---- | 内容区域的高度 | | (contentChange) | Function | "" | string | 内容改变事件 | | (syntaxDetection) | Function | "" | boolean | 语法实时检测 |

更新记录(2022.03.02)
  1. 新增@Output syntaxDetection,输出当前代码框中是否含有语法错误
  2. 新增方法 getSyntaxError(),获取当前代码框中是否含有语法错误
  3. 新增方法 listenSyntaxError().用户监听语法错误,并通过 syntaxDetection(),输出语法错误结果