diff --git a/.DS_Store b/.DS_Store index e6522615e..a15e3d555 100644 Binary files a/.DS_Store and b/.DS_Store differ diff --git a/.github/workflows/publish-lowcoder-cli.yml b/.github/workflows/publish-lowcoder-cli.yml new file mode 100644 index 000000000..2aadbe488 --- /dev/null +++ b/.github/workflows/publish-lowcoder-cli.yml @@ -0,0 +1,50 @@ +# This workflow will run tests using node and then publish a package to GitHub Packages when a release is created +# For more information see: https://docs.github.com/en/actions/publishing-packages/publishing-nodejs-packages + +name: Publish Lowcoder CLI + +on: + push: + branches: [ "dev" ] + +jobs: + publish-package: + if: ${{ github.repositoryUrl == 'git://github.com/lowcoder/lowcoder.git'}} + runs-on: ubuntu-latest + steps: + - name: Checkout repository + uses: actions/checkout@v3 + + - name: Check version changes + uses: EndBug/version-check@v1 + id: check + with: + diff-search: true + static-checking: localIsNew + file-name: client/packages/lowcoder-cli/package.json + file-url: https://unpkg.com/lowcoder-cli@latest/package.json + + - name: Version update detected + if: steps.check.outputs.changed == 'true' + run: 'echo "Version change found! New version: ${{ steps.check.outputs.version }} (${{ steps.check.outputs.type }})"' + + - name: Set up Node.js for NPM + if: steps.check.outputs.changed == 'true' + uses: actions/setup-node@v3 + with: + node-version: 16 + registry-url: https://registry.npmjs.org/ + + - name: Install dependencies + if: steps.check.outputs.changed == 'true' + uses: borales/actions-yarn@v4.2.0 + with: + cmd: install + dir: client/packages/lowcoder-cli + + - name: Publish package to NPM + if: steps.check.outputs.changed == 'true' + run: npm publish + working-directory: client/packages/lowcoder-cli + env: + NODE_AUTH_TOKEN: ${{ secrets.LOWCODERNPMBOT }} \ No newline at end of file diff --git a/.github/workflows/publish-lowcoder-comps.yml b/.github/workflows/publish-lowcoder-comps.yml new file mode 100644 index 000000000..27ffb60f9 --- /dev/null +++ b/.github/workflows/publish-lowcoder-comps.yml @@ -0,0 +1,52 @@ +# This workflow will run tests using node and then publish a package to GitHub Packages when a release is created +# For more information see: https://docs.github.com/en/actions/publishing-packages/publishing-nodejs-packages + +name: Publish Lowcoder Comps + +on: + push: + branches: [ "dev" ] + +jobs: + publish-package: + if: ${{ github.repositoryUrl == 'git://github.com/lowcoder/lowcoder.git'}} + runs-on: ubuntu-latest + steps: + - name: Checkout repository + uses: actions/checkout@v3 + + - name: Check version changes + uses: EndBug/version-check@v1 + id: check + with: + diff-search: true + static-checking: localIsNew + file-name: client/packages/lowcoder-comps/package.json + file-url: https://unpkg.com/lowcoder-comps@latest/package.json + + - name: Version update detected + if: steps.check.outputs.changed == 'true' + run: 'echo "Version change found! New version: ${{ steps.check.outputs.version }} (${{ steps.check.outputs.type }})"' + + - name: Set up Node.js for NPM + if: steps.check.outputs.changed == 'true' + uses: actions/setup-node@v3 + with: + node-version: 16 + registry-url: https://registry.npmjs.org/ + + - name: Install dependencies + if: steps.check.outputs.changed == 'true' + uses: borales/actions-yarn@v4.2.0 + with: + cmd: install + dir: client/packages/lowcoder-comps + + - name: Publish + if: steps.check.outputs.changed == 'true' + uses: borales/actions-yarn@v4.2.0 + with: + cmd: build_publish + dir: client/packages/lowcoder-comps + env: + NODE_AUTH_TOKEN: ${{ secrets.LOWCODERNPMBOT }} \ No newline at end of file diff --git a/.github/workflows/publish-lowcoder-core.yml b/.github/workflows/publish-lowcoder-core.yml new file mode 100644 index 000000000..34222ad56 --- /dev/null +++ b/.github/workflows/publish-lowcoder-core.yml @@ -0,0 +1,50 @@ +# This workflow will run tests using node and then publish a package to GitHub Packages when a release is created +# For more information see: https://docs.github.com/en/actions/publishing-packages/publishing-nodejs-packages + +name: Publish Lowcoder Core + +on: + push: + branches: [ "dev" ] + +jobs: + publish-package: + if: ${{ github.repositoryUrl == 'git://github.com/lowcoder/lowcoder.git'}} + runs-on: ubuntu-latest + steps: + - name: Checkout repository + uses: actions/checkout@v3 + + - name: Check version changes + uses: EndBug/version-check@v1 + id: check + with: + diff-search: true + static-checking: localIsNew + file-name: client/packages/lowcoder-core/package.json + file-url: https://unpkg.com/lowcoder-core@latest/package.json + + - name: Version update detected + if: steps.check.outputs.changed == 'true' + run: 'echo "Version change found! New version: ${{ steps.check.outputs.version }} (${{ steps.check.outputs.type }})"' + + - name: Set up Node.js for NPM + if: steps.check.outputs.changed == 'true' + uses: actions/setup-node@v3 + with: + node-version: 16 + registry-url: https://registry.npmjs.org/ + + - name: Install dependencies + if: steps.check.outputs.changed == 'true' + uses: borales/actions-yarn@v4.2.0 + with: + cmd: install + dir: client/packages/lowcoder-core + + - name: Publish package to NPM + if: steps.check.outputs.changed == 'true' + run: npm publish + working-directory: client/packages/lowcoder-core + env: + NODE_AUTH_TOKEN: ${{ secrets.LOWCODERNPMBOT }} \ No newline at end of file diff --git a/.github/workflows/publish-lowcoder-sdk.yml b/.github/workflows/publish-lowcoder-sdk.yml new file mode 100644 index 000000000..d9385b7d9 --- /dev/null +++ b/.github/workflows/publish-lowcoder-sdk.yml @@ -0,0 +1,57 @@ +# This workflow will run tests using node and then publish a package to GitHub Packages when a release is created +# For more information see: https://docs.github.com/en/actions/publishing-packages/publishing-nodejs-packages + +name: Publish Lowcoder SDK + +on: + push: + branches: [ "dev" ] + +jobs: + publish-package: + if: ${{ github.repositoryUrl == 'git://github.com/lowcoder/lowcoder.git'}} + runs-on: ubuntu-latest + steps: + - name: Checkout repository + uses: actions/checkout@v3 + + - name: Check version changes + uses: EndBug/version-check@v1 + id: check + with: + diff-search: true + static-checking: localIsNew + file-name: client/packages/lowcoder-sdk/package.json + file-url: https://unpkg.com/lowcoder-sdk@latest/package.json + + - name: Version update detected + if: steps.check.outputs.changed == 'true' + run: 'echo "Version change found! New version: ${{ steps.check.outputs.version }} (${{ steps.check.outputs.type }})"' + + - name: Set up Node.js for NPM + if: steps.check.outputs.changed == 'true' + uses: actions/setup-node@v3 + with: + node-version: 16 + registry-url: https://registry.npmjs.org/ + + - name: Install dependencies + if: steps.check.outputs.changed == 'true' + uses: borales/actions-yarn@v4.2.0 + with: + cmd: install + dir: client/packages/lowcoder-sdk + + - name: Build Package + if: steps.check.outputs.changed == 'true' + uses: borales/actions-yarn@v4.2.0 + with: + cmd: build + dir: client/packages/lowcoder-sdk + + - name: Publish package to NPM + if: steps.check.outputs.changed == 'true' + run: npm publish + working-directory: client/packages/lowcoder-sdk + env: + NODE_AUTH_TOKEN: ${{ secrets.LOWCODERNPMBOT }} \ No newline at end of file diff --git a/.gitignore b/.gitignore index 2e1b56cd5..86b0cc02d 100644 --- a/.gitignore +++ b/.gitignore @@ -9,3 +9,4 @@ client/node_modules/ client/packages/lowcoder-plugin-demo/.yarn/install-state.gz client/packages/lowcoder-plugin-demo/yarn.lock client/packages/lowcoder-plugin-demo/.yarn/cache/@types-node-npm-16.18.68-56f72825c0-094ae9ed80.zip +.DS_Store diff --git a/README.md b/README.md index 91c71b72f..19e28e378 100644 --- a/README.md +++ b/README.md @@ -96,4 +96,4 @@ You can access Lowcoder from [cloud-hosted version](https://app.lowcoder.cloud/) Accelerate the growth of Lowcoder and unleash its potential with your Sponsorship – together, we're shaping the future of Lowcode for everyone! [Be a Sponsor](https://github.com/sponsors/lowcoder-org) -Like ... @CHSchuepfer. Thank you very much! \ No newline at end of file +Like ... @CHSchuepfer & @spacegoats-io. Thank you very much!! \ No newline at end of file diff --git a/client/VERSION b/client/VERSION index 90012116c..38f8e886e 100644 --- a/client/VERSION +++ b/client/VERSION @@ -1 +1 @@ -dev \ No newline at end of file +dev diff --git a/client/config/test/jest.config.js b/client/config/test/jest.config.js index f33e953a6..90fb74572 100644 --- a/client/config/test/jest.config.js +++ b/client/config/test/jest.config.js @@ -1,6 +1,11 @@ -import path from "node:path"; -import { buildVars } from "../../packages/lowcoder-dev-utils/buildVars.js"; -import { currentDirName } from "../../packages/lowcoder-dev-utils/util.js"; +import path, { dirname } from "node:path"; +import { fileURLToPath } from "node:url"; +import { buildVars } from "../../scripts/buildVars.js"; + +export function currentDirName(importMetaUrl) { + return dirname(fileURLToPath(importMetaUrl)); +} + const globals = {}; buildVars.forEach(({ name, defaultValue }) => { @@ -9,34 +14,34 @@ buildVars.forEach(({ name, defaultValue }) => { const edition = process.env.REACT_APP_EDITION; const isEEGlobal = edition === "enterprise-global"; const isEE = edition === "enterprise" || isEEGlobal; -const dirname = currentDirName(import.meta.url); +const currentDir = currentDirName(import.meta.url); export default { testEnvironment: "jsdom", moduleNameMapper: { - "react-markdown": path.resolve(dirname, "./mocks/react-markdown.js"), - "\\.md\\?url$": path.resolve(dirname, "./mocks/markdown-url-module.js"), + "react-markdown": path.resolve(currentDir, "./mocks/react-markdown.js"), + "\\.md\\?url$": path.resolve(currentDir, "./mocks/markdown-url-module.js"), "^@lowcoder-ee(.*)$": path.resolve( - dirname, + currentDir, isEE ? "../../packages/lowcoder/src/ee/$1" : "../../packages/lowcoder/src/$1" ), - "lowcoder-sdk": path.resolve(dirname, "../../packages/lowcoder/src/index.sdk"), + "lowcoder-sdk": path.resolve(currentDir, "../../packages/lowcoder/src/index.sdk"), }, globals, // roots: ["/src"], modulePaths: [ "/src", - path.resolve(dirname, "../../packages/lowcoder/src"), - path.resolve(dirname, "../../packages/lowcoder-comps/src"), - path.resolve(dirname, "../../packages/lowcoder-design/src"), + path.resolve(currentDir, "../../packages/lowcoder/src"), + path.resolve(currentDir, "../../packages/lowcoder-comps/src"), + path.resolve(currentDir, "../../packages/lowcoder-design/src"), ], - setupFiles: [path.resolve(dirname, "./jest.setup.js")], - setupFilesAfterEnv: [path.resolve(dirname, "./jest.setup-after-env.js")], + setupFiles: [path.resolve(currentDir, "./jest.setup.js")], + setupFilesAfterEnv: [path.resolve(currentDir, "./jest.setup-after-env.js"), 'jest-canvas-mock'], transform: { - "^.+\\.(js|jsx|mjs|cjs|ts|tsx)$": path.resolve(dirname, "./transform/babelTransform.js"), - "^.+\\.css$": path.resolve(dirname, "./transform/cssTransform.js"), + "^.+\\.(js|jsx|mjs|cjs|ts|tsx)$": path.resolve(currentDir, "./transform/babelTransform.js"), + "^.+\\.css$": path.resolve(currentDir, "./transform/cssTransform.js"), "^(?!.*\\.(js|jsx|mjs|cjs|ts|tsx|css|json)$)": path.resolve( - dirname, + currentDir, "./transform/fileTransform.js" ), }, diff --git a/client/config/test/jest.setup-after-env.js b/client/config/test/jest.setup-after-env.js index b031316de..f332f518b 100644 --- a/client/config/test/jest.setup-after-env.js +++ b/client/config/test/jest.setup-after-env.js @@ -21,3 +21,36 @@ window.ResizeObserver = function () { disconnect: () => {}, }; }; + +Object.defineProperty(window, 'ImageData', { value: 'yourValue' }); +Object.defineProperty(window, 'MediaStreamTrack', { value: 'yourValue' }); +Object.defineProperty(window, 'URL', { + writable: true, + value: { + createObjectURL: jest.fn(), + } +}); +Object.defineProperty(window, "navigator", { + writable: true, + value: { + mediaDevices: { + enumerateDevices: jest.fn(), + }, + userAgent: '', + language: '', + browserLanguage: '', + }, +}); + +class Worker { + constructor(stringUrl) { + this.url = stringUrl; + this.onmessage = () => {}; + } + + postMessage(msg) { + this.onmessage(msg); + } +} + +window.Worker = Worker; \ No newline at end of file diff --git a/client/package.json b/client/package.json index 531a6e7e2..2f49baf8c 100644 --- a/client/package.json +++ b/client/package.json @@ -25,9 +25,6 @@ "@babel/preset-typescript": "^7.18.6", "@rollup/plugin-typescript": "^8.5.0", "@testing-library/jest-dom": "^5.16.5", - "@testing-library/react": "^12.0.0", - "@testing-library/user-event": "^13.2.1", - "@types/ali-oss": "^6.16.4", "@types/file-saver": "^2.0.5", "@types/jest": "^29.2.2", "@types/mime": "^2.0.3", @@ -37,10 +34,8 @@ "@types/react-resizable": "^3.0.5", "@types/react-router-dom": "^5.3.2", "@types/shelljs": "^0.8.11", - "@types/styled-components": "^5.1.19", "@types/stylis": "^4.0.2", "@types/tern": "0.23.4", - "@types/toposort": "^2.0.3", "@types/ua-parser-js": "^0.7.36", "@welldone-software/why-did-you-render": "^6.2.3", "add": "^2.0.6", @@ -48,10 +43,10 @@ "babel-preset-react-app": "^10.0.1", "husky": "^8.0.1", "jest": "^29.5.0", + "jest-canvas-mock": "^2.5.2", "jest-environment-jsdom": "^29.5.0", "lint-staged": "^13.0.1", "lowcoder-cli": "workspace:^", - "lowcoder-dev-utils": "workspace:^", "mq-polyfill": "^1.1.8", "prettier": "^3.1.0", "rimraf": "^3.0.2", @@ -67,7 +62,7 @@ }, "packageManager": "yarn@3.6.4", "resolutions": { - "@types/react": "^17", + "@types/react": "^18", "moment": "2.29.2", "canvas": "https://registry.yarnpkg.com/@favware/skip-dependency/-/skip-dependency-1.2.1.tgz", "react-virtualized@^9.22.3": "patch:react-virtualized@npm%3A9.22.3#./.yarn/patches/react-virtualized-npm-9.22.3-0fff3cbf64.patch", @@ -75,6 +70,9 @@ }, "dependencies": { "@lottiefiles/react-lottie-player": "^3.5.3", + "@testing-library/react": "^14.1.2", + "@testing-library/user-event": "^14.5.1", + "@types/styled-components": "^5.1.34", "antd-mobile": "^5.28.0", "chalk": "4", "number-precision": "^1.6.0", diff --git a/client/packages/create-lowcoder-plugin/README.md b/client/packages/create-lowcoder-plugin/README.md deleted file mode 100644 index 5d1f154d6..000000000 --- a/client/packages/create-lowcoder-plugin/README.md +++ /dev/null @@ -1,37 +0,0 @@ -# create-lowcoder-plugin - -## How to build a Component Plugin - -This script helps you to create a skeleton Lowcoder Component, which you can then publish on npm and use it as imported Plugin in any app. - -1) Navigate your terminal or bash to /client and install general dependencies -```bash -cd client -yarn install -``` -1) execute the Plugin Builder Script. PLease name your plugin with the prefix lowcoder-comp- - -```bash -npm create lowcoder-plugin lowcoder-comp-my-plugin -``` -3) Navigate your terminal or bash to the newly created Plugin folder -```bash -cd lowcoder-comp-my-plugin -``` -4) install all dependencies: -```bash -yarn install -``` -Now you can start your Plugin in the playground, so during development you have a realtime preview. -4) install all dependencies: -```bash -yarn start -``` -This will start the local development server and open a browser on http://localhost:9000 - -## How to publish a Component Plugin - -With the following command you can publish the script to the NPM repository: -```bash -yarn build --publish -``` \ No newline at end of file diff --git a/client/packages/create-lowcoder-plugin/index.js b/client/packages/create-lowcoder-plugin/index.js deleted file mode 100755 index 943134f17..000000000 --- a/client/packages/create-lowcoder-plugin/index.js +++ /dev/null @@ -1,165 +0,0 @@ -#!/usr/bin/env node -import fs from "fs-extra"; -import path from "node:path"; -import { spawn } from "cross-spawn"; -import { writeFileSync, existsSync } from "node:fs"; -import chalk from "chalk"; -import { createCommand } from "commander"; -import { readJson, currentDirName } from "../lowcoder-dev-utils/util.js"; - -const currentDir = currentDirName(import.meta.url); -const pkg = readJson(path.resolve(currentDir, "./package.json")); - -const isUsingYarn = true; -// const isUsingYarn = (process.env.npm_config_user_agent || "").indexOf("yarn") === 0; -const cliPackageName = "lowcoder-cli"; -const sdkPackageName = "lowcoder-sdk"; -const devPackageName = "lowcoder-dev-utils"; - -let verbose = false; -let registry; - -createCommand(pkg.name) - .version(pkg.version) - .arguments("") - .usage(`${chalk.green("")} [Options]`) - .option("-t, --template", "template name", "typescript") - .option("-f, --force", "force create project, if target dir is not empty, will empty it") - .option("--verbose", "print more info") - .option("--registry [addr]", "npm registry") - .action((name, options) => { - verbose = options.verbose; - registry = options.registry; - return createProject(name, options); - }) - .parse(); - -function writePackageJson(file, content) { - writeFileSync(file, JSON.stringify(content, null, 2)); -} - -function writeYarnFile() { - writeFileSync("yarn.lock", ""); -} - -async function isDirEmpty(dir) { - if (!existsSync(dir)) { - return true; - } - const files = await fs.promises.readdir(dir); - return files.length === 0; -} - -async function install(dependencies) { - return new Promise((resolve, reject) => { - - let cmd = "npm"; - let args = ["install", "--no-audit", "--save", "--save-exact", "--loglevel", "error"]; - if (isUsingYarn) { - cmd = "yarn"; - args = ["add"]; - } - - if (registry) { - args.push("--registry", registry); - } - args.push(...dependencies); - - const child = spawn(cmd, args, { stdio: "inherit" }); - - child.on("close", (code) => { - if (code !== 0) { - reject({ - command: `${cmd} ${args.join(" ")}`, - }); - return; - } - resolve(); - }); - }); -} - -function executeNodeScript({ cwd, args }, data, source) { - return new Promise((resolve, reject) => { - const child = spawn(process.execPath, [...args, "-e", source, "--", JSON.stringify(data)], { - cwd, - stdio: "inherit", - }); - - child.on("close", (code) => { - if (code !== 0) { - reject({ - command: `node ${args.join(" ")}`, - }); - return; - } - resolve(); - }); - }); -} - -/** - * create lowcoder comps project - * 1. create dir - * 2. create package.json - * 3. install lowcoder-cli - * 4. run `lowcoder-cli init` - */ -async function createProject(projectName, options) { - const { template, force } = options; - const originalDirectory = process.cwd(); - const root = path.resolve(originalDirectory, projectName); - - const isRootEmpty = await isDirEmpty(root); - if (!isRootEmpty) { - if (force) { - fs.emptyDirSync(root); - } else { - console.log(); - console.error(`${root} is not empty`); - process.exit(1); - } - } - - const packageJsonFile = path.resolve(root, "package.json"); - fs.ensureDirSync(root); - process.chdir(root); - - const initialPackageJson = { - name: projectName, - version: "0.0.1", - type: "module", - license: "MIT", - }; - - // now we prepare the files - writePackageJson(packageJsonFile, initialPackageJson); - // without empty yarn file the setup will fail - writeYarnFile(); - - await install([ - // cliPackageName, - sdkPackageName, - devPackageName, - "react@17", - "react-dom@17", - "@types/react@17", - "@types/react-dom@17", - "vite", - ]); - - await executeNodeScript( - { - cwd: process.cwd(), - args: ["--input-type=module"], - }, - { template, registry }, - ` - import init from '${cliPackageName}/actions/init.js'; - init(JSON.parse(process.argv[1])); - ` - ); - - process.chdir(originalDirectory); - console.log("Done."); -} diff --git a/client/packages/create-lowcoder-plugin/package.json b/client/packages/create-lowcoder-plugin/package.json deleted file mode 100644 index b3800683f..000000000 --- a/client/packages/create-lowcoder-plugin/package.json +++ /dev/null @@ -1,17 +0,0 @@ -{ - "name": "create-lowcoder-plugin", - "version": "0.0.4", - "bin": "./index.js", - "type": "module", - "dependencies": { - "chalk": "4", - "commander": "^9.4.1", - "cross-spawn": "^7.0.3", - "fs-extra": "^10.1.0", - "lowcoder-dev-utils": "workspace:^" - }, - "license": "MIT", - "keywords": [ - "lowcoder" - ] -} diff --git a/client/packages/lowcoder-cli-template-typescript/.gitignore b/client/packages/lowcoder-cli-template-typescript/.gitignore index e732f2271..7dc34c5d9 100644 --- a/client/packages/lowcoder-cli-template-typescript/.gitignore +++ b/client/packages/lowcoder-cli-template-typescript/.gitignore @@ -1,2 +1,4 @@ *.tgz -/node_modules \ No newline at end of file +.DS_Store +node_modules +*.zip \ No newline at end of file diff --git a/client/packages/lowcoder-cli-template-typescript/README-template.md b/client/packages/lowcoder-cli-template-typescript/README-template.md index 7c74d491a..bd51cb9c3 100644 --- a/client/packages/lowcoder-cli-template-typescript/README-template.md +++ b/client/packages/lowcoder-cli-template-typescript/README-template.md @@ -25,3 +25,13 @@ yarn build npm run build ``` + +## Publish +To publish your plugin on NPM, use following command. +```bash +yarn build_publish + +# or + +npm run build_publish +``` diff --git a/client/packages/lowcoder-cli-template-typescript/README.md b/client/packages/lowcoder-cli-template-typescript/README.md index e95b8830e..e11110bd6 100644 --- a/client/packages/lowcoder-cli-template-typescript/README.md +++ b/client/packages/lowcoder-cli-template-typescript/README.md @@ -1,5 +1,27 @@ -# lowcoder-cli-template-typescript +# Lowcoder Demonstrator Plugin Sourcecode -This is the official typescript template of lowcoder-cli. +## Overview -This template will be used by default. +This repository contains the demonstrator code for a Component Plugin in Lowcoder. It serves as a practical example and a reference for developers looking to build their own Component Plugins within the Lowcoder framework. + +This repository is not about to integrate the Plugin like other NPM repositories. However, for the Lowcoder Component Plugin Creator we wanted to publish the Demonstrator Plugin code sources. + +### The Lowcoder App Editor + +

+ Lowcoder App Editor +

+ +### Purpose + +The primary goal of this repository is to showcase best practices, demonstrate the structure, and provide a clear example of how to develop Component Plugins for Lowcoder. It is intended to be a learning resource rather than a production-ready solution. + +## Getting Started + +To explore this demonstrator plugin, install and test it in action you can use the "Lowcoder Component Plugin Builder". https://www.npmjs.com/package/create-lowcoder-plugin + +### The Lowcoder Component Plugin Builder and Preivew + +

+ Lowcoder Plugin Preview +

\ No newline at end of file diff --git a/client/packages/lowcoder-cli-template-typescript/icons/hills.svg b/client/packages/lowcoder-cli-template-typescript/icons/hills.svg new file mode 100644 index 000000000..95eb1fb19 --- /dev/null +++ b/client/packages/lowcoder-cli-template-typescript/icons/hills.svg @@ -0,0 +1,17 @@ + + + + + + + + + + + + + diff --git a/client/packages/lowcoder-cli-template-typescript/index.html b/client/packages/lowcoder-cli-template-typescript/index.html index 12f0761f4..6f14c9ea2 100644 --- a/client/packages/lowcoder-cli-template-typescript/index.html +++ b/client/packages/lowcoder-cli-template-typescript/index.html @@ -4,7 +4,7 @@ - Lowcoder Comp Playground + Lowcoder Component Plugin Preview