Compare commits

..

19 Commits

Author SHA1 Message Date
190d0978ef chore(release): @antv/x6-example-features@1.0.1 [skip ci] 2022-11-05 07:57:45 +00:00
75fa88ec80 chore(release): @antv/x6-plugin-dnd@1.0.3 [skip ci] 2022-11-05 07:57:43 +00:00
a02ca20f05 chore: bump to 2.0
force bump to 2.0

BREAKING CHANGE: bump to 2.0
2022-11-05 15:49:05 +08:00
5c1dc137d5 chore(release): @antv/x6-vue-shape@1.1.0 [skip ci] 2022-11-05 07:23:30 +00:00
b903dc0539 chore(release): @antv/x6-react-shape@1.0.2 [skip ci] 2022-11-05 07:23:27 +00:00
4c61c7f74d chore(release): @antv/x6-react-components@1.1.0 [skip ci] 2022-11-05 07:23:24 +00:00
6f591418d2 chore(release): @antv/x6-plugin-transform@1.0.2 [skip ci] 2022-11-05 07:23:21 +00:00
b1ec2def7b chore(release): @antv/x6-plugin-stencil@1.0.2 [skip ci] 2022-11-05 07:23:18 +00:00
8f57a63206 chore(release): @antv/x6-plugin-snapline@1.0.2 [skip ci] 2022-11-05 07:23:16 +00:00
23120ffc65 chore(release): @antv/x6-plugin-selection@1.0.2 [skip ci] 2022-11-05 07:23:12 +00:00
daac3e5fdc chore(release): @antv/x6-plugin-scroller@1.1.0 [skip ci] 2022-11-05 07:23:10 +00:00
cbb415fc19 chore(release): @antv/x6-plugin-minimap@1.0.2 [skip ci] 2022-11-05 07:23:07 +00:00
75ef37b761 chore(release): @antv/x6-plugin-keyboard@1.0.2 [skip ci] 2022-11-05 07:23:04 +00:00
99e2bea2d8 chore(release): @antv/x6-plugin-history@1.0.2 [skip ci] 2022-11-05 07:23:01 +00:00
bd72005ee2 chore(release): @antv/x6-plugin-export@1.0.2 [skip ci] 2022-11-05 07:22:58 +00:00
0cc1d89eec chore(release): @antv/x6-plugin-clipboard@1.0.2 [skip ci] 2022-11-05 07:22:55 +00:00
1ebf0912d1 chore(release): @antv/x6-common@1.1.0 [skip ci] 2022-11-05 07:22:52 +00:00
da41870afd chore(release): @antv/x6@1.1.0 [skip ci] 2022-11-05 07:22:49 +00:00
db0c31deb0 chore(release): @antv/x6-plugin-dnd@1.0.2 [skip ci] 2022-11-05 07:22:47 +00:00
2116 changed files with 128046 additions and 63844 deletions
.github/workflows
.gitignore
.husky
.lgtm.yml.prettierignore.releaserc.stylelintrcCONTRIBUTORSCONTRIBUTORS.svgLICENSEREADME.en-us.mdREADME.md
examples/x6-example-features
karma.conf.jspackage.json
packages
x6-angular-shape
x6-common
x6-geometry
x6-plugin-clipboard
x6-plugin-dnd
x6-plugin-export
x6-plugin-history
x6-plugin-keyboard
x6-plugin-minimap
x6-plugin-scroller
x6-plugin-selection
x6-plugin-snapline
x6-plugin-stencil
x6-plugin-transform
x6-react-components
CHANGELOG.mdLICENSEpackage.json
src
auto-scroll-box/style
color-picker
context-menu/style
dropdown/style
menu/style
menubar
scroll-box/style
scrollbar/style
split-box/style
style
toolbar
x6-react-shape
x6-vue-shape
x6
pnpm-lock.yamlpnpm-workspace.yamlrollup.config.js
scripts
sites
x6-sites-demos-helper
x6-sites-demos
CHANGELOG.mdpackage.json
packages
api
graph
registry
attr
background
connection-point/playground
connector
edge-anchor/playground
edge-tool
filter
grid
node-anchor/playground
node-tool
port-label-layout
port-layout
router
ui
scene/sankey
tutorial
advanced
animation
layout
react
basic
background/playground
clipboard/playground
dnd
edge
grid/playground
group
history/playground
keyboard/playground
minimap/playground
mousewheel/playground
node/style
port
scroller/playground
selection/playground
snapline/playground
getting-started
intermediate
attrs
custom-edge/custom-edge
custom-node/custom-node
edge-labels
events
interacting
marker
serialization
tools
x6-sites
.dumi
global.ts
theme/locales
.dumirc.ts.eslintrc.gitignoreCHANGELOG.mdCNAMELEGAL.md
docs
api
temp
tutorial
examples
gatsby-browser.jsgatsby-config.jsgatsby-node.jspackage.json
public
site
src
tutorial
basic
getting-started
intermediate
plugins
clipboard
dnd
history
keyboard
minimap
scroller
selection
snapline
stencil
transform
resizing
rotating
typings
x6-svg-to-shape
tsconfig.jsonturbo.json

@ -8,12 +8,13 @@ jobs:
run:
runs-on: ubuntu-latest
steps:
- uses: wow-actions/use-app-token@v2
- uses: wow-actions/use-app-token@v1
with:
app_id: ${{ secrets.APP_ID }}
private_key: ${{ secrets.PRIVATE_KEY }}
env_name: bot_token
- uses: wow-actions/auto-close-fixed-issues@v1
with:
GITHUB_TOKEN: ${{ env.BOT_TOKEN }}
GITHUB_TOKEN: ${{ env.bot_token }}
comment: |
This issue was closed by #{{ pr }}.

@ -4,10 +4,11 @@ jobs:
comment:
runs-on: ubuntu-latest
steps:
- uses: wow-actions/use-app-token@v2
- uses: wow-actions/use-app-token@v1
with:
app_id: ${{ secrets.APP_ID }}
private_key: ${{ secrets.PRIVATE_KEY }}
env_name: bot_token
- uses: wow-actions/auto-comment@v1
with:
GITHUB_TOKEN: ${{ env.BOT_TOKEN }}
GITHUB_TOKEN: ${{ env.bot_token }}

@ -8,12 +8,12 @@ jobs:
run:
runs-on: ubuntu-latest
steps:
- uses: wow-actions/use-app-token@v2
- uses: wow-actions/use-app-token@v1
with:
app_id: ${{ secrets.APP_ID }}
private_key: ${{ secrets.PRIVATE_KEY }}
env_name: bot_token
- uses: wow-actions/auto-assign@v1
with:
GITHUB_TOKEN: ${{ env.BOT_TOKEN }}
GITHUB_TOKEN: ${{ env.bot_token }}
CONFIG_FILE: .github/workflows/config/auto-assign.yml

@ -0,0 +1,27 @@
name: 🚀 Create Release Branch
on:
push:
branches:
- master
jobs:
crb:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- run: |
echo "${{ github.sha }}" > .releasing
- uses: wow-actions/use-app-token@v1
with:
app_id: ${{ secrets.APP_ID }}
private_key: ${{ secrets.PRIVATE_KEY }}
env_name: bot_token
- uses: peter-evans/create-pull-request@v4
with:
token: ${{ env.bot_token }}
branch: semantic-release
commit-message: "trigger semantic release..."
delete-branch: true
labels: semantic-release
title: "chore: semantic release [skip ci]"
body: |
Your **[semantic-release-monorepo](https://github.com/bubkoo/semantic-release-monorepo)** bot base on **[semantic-release](https://github.com/semantic-release/semantic-release)** :package::rocket:`

@ -6,14 +6,14 @@ name: 🚫 Delete Stale Releases
# clean:
# runs-on: ubuntu-latest
# steps:
# - uses: wow-actions/use-app-token@v2
# - uses: wow-actions/use-app-token@v1
# with:
# app_id: ${{ secrets.APP_ID }}
# private_key: ${{ secrets.PRIVATE_KEY }}
#
# env_name: bot_token
# - uses: wow-actions/delete-stale-releases@v1
# with:
# GITHUB_TOKEN: ${{ env.BOT_TOKEN }}
# GITHUB_TOKEN: ${{ env.bot_token }}
# delete_tags: true
# keep_latest_count: 3
# group: '(?!^)@.*$'
@ -36,13 +36,13 @@ jobs:
clean:
runs-on: ubuntu-latest
steps:
- uses: wow-actions/use-app-token@v2
- uses: wow-actions/use-app-token@v1
with:
app_id: ${{ secrets.APP_ID }}
private_key: ${{ secrets.PRIVATE_KEY }}
env_name: bot_token
- uses: wow-actions/delete-stale-releases@v1
with:
GITHUB_TOKEN: ${{ env.BOT_TOKEN }}
GITHUB_TOKEN: ${{ env.bot_token }}
delete_tags: true
keep_latest_count: -1
keep_latest_count: -1

@ -56,11 +56,11 @@ jobs:
run: pnpm run test
- name: 🔑 Generate Token
uses: wow-actions/use-app-token@v2
uses: wow-actions/use-app-token@v1
with:
app_id: ${{ secrets.APP_ID }}
private_key: ${{ secrets.PRIVATE_KEY }}
env_name: bot_token
- name: 💡 Codecov
uses: codecov/codecov-action@v1
@ -72,20 +72,20 @@ jobs:
- name: 🔀 Dispatch(ci_passed)
uses: peter-evans/repository-dispatch@v2
with:
token: ${{ env.BOT_TOKEN }}
token: ${{ env.bot_token }}
event-type: ci_passed
- name: 🔀 Dispatch(ci_pr_passed)
if: github.event_name == 'pull_request_target'
uses: peter-evans/repository-dispatch@v2
with:
token: ${{ env.BOT_TOKEN }}
token: ${{ env.bot_token }}
event-type: ci_pr_passed
- name: 🔀 Dispatch(ci_master_passed)
if: github.event_name == 'push'
uses: peter-evans/repository-dispatch@v2
with:
token: ${{ env.BOT_TOKEN }}
token: ${{ env.bot_token }}
event-type: ci_master_passed

@ -1,42 +0,0 @@
name:  CodeQL
on:
push:
branches: [ "master", "bot", "gh-pages", "v1" ]
pull_request:
branches: [ "master" ]
schedule:
- cron: "41 2 * * 1"
jobs:
analyze:
name: Analyze
runs-on: ubuntu-latest
permissions:
actions: read
contents: read
security-events: write
strategy:
fail-fast: false
matrix:
language: [ javascript ]
steps:
- name: Checkout
uses: actions/checkout@v3
- name: Initialize CodeQL
uses: github/codeql-action/init@v2
with:
languages: ${{ matrix.language }}
config-file: ./.github/workflows/config/codeql.yml
queries: +security-and-quality
- name: Autobuild
uses: github/codeql-action/autobuild@v2
- name: Perform CodeQL Analysis
uses: github/codeql-action/analyze@v2
with:
category: "/language:${{ matrix.language }}"

@ -1,7 +0,0 @@
paths-ignore:
- sites/public
query-filters:
- exclude:
id: js/use-before-declaration
- exclude:
id: js/polynomial-redos

@ -6,11 +6,11 @@ jobs:
cib:
runs-on: ubuntu-latest
steps:
- uses: wow-actions/use-app-token@v2
- uses: wow-actions/use-app-token@v1
with:
app_id: ${{ secrets.APP_ID }}
private_key: ${{ secrets.PRIVATE_KEY }}
env_name: bot_token
- uses: robvanderleek/create-issue-branch@main
env:
GITHUB_TOKEN: ${{ env.BOT_TOKEN }}
GITHUB_TOKEN: ${{ env.bot_token }}

@ -64,15 +64,15 @@ jobs:
run: yarn build:sites
- name: 🔑 Generate Token
uses: wow-actions/use-app-token@v2
uses: wow-actions/use-app-token@v1
with:
app_id: ${{ secrets.APP_ID }}
private_key: ${{ secrets.PRIVATE_KEY }}
env_name: bot_token
- name:  Deploy sites
uses: peaceiris/actions-gh-pages@v3
with:
github_token: ${{ env.BOT_TOKEN }}
github_token: ${{ env.bot_token }}
publish_dir: ./sites/x6-sites/public
publish_branch: gh-pages

@ -8,12 +8,12 @@ jobs:
cmd:
runs-on: ubuntu-latest
steps:
- uses: wow-actions/use-app-token@v2
- uses: wow-actions/use-app-token@v1
with:
app_id: ${{ secrets.APP_ID }}
private_key: ${{ secrets.PRIVATE_KEY }}
env_name: bot_token
- uses: wow-actions/label-commands@v1
with:
GITHUB_TOKEN: ${{ env.BOT_TOKEN }}
GITHUB_TOKEN: ${{ env.bot_token }}
CONFIG_FILE: .github/workflows/config/label-commands.yml

@ -6,14 +6,14 @@ jobs:
lock:
runs-on: ubuntu-latest
steps:
- uses: wow-actions/use-app-token@v2
- uses: wow-actions/use-app-token@v1
with:
app_id: ${{ secrets.APP_ID }}
private_key: ${{ secrets.PRIVATE_KEY }}
env_name: bot_token
- uses: dessant/lock-threads@v2
with:
github-token: ${{ env.BOT_TOKEN }}
github-token: ${{ env.bot_token }}
issue-lock-inactive-days: 365
issue-lock-comment: |
This thread has been automatically locked because it has not had recent activity.

@ -8,13 +8,13 @@ jobs:
evaluate:
runs-on: ubuntu-latest
steps:
- uses: wow-actions/use-app-token@v2
- uses: wow-actions/use-app-token@v1
with:
app_id: ${{ secrets.APP_ID }}
private_key: ${{ secrets.PRIVATE_KEY }}
env_name: bot_token
- uses: wow-actions/needs-more-info@v1
with:
GITHUB_TOKEN: ${{ env.BOT_TOKEN }}
GITHUB_TOKEN: ${{ env.bot_token }}
CONFIG_FILE: .github/workflows/config/needs-more-info.yml

@ -6,11 +6,11 @@ jobs:
run:
runs-on: ubuntu-latest
steps:
- uses: wow-actions/use-app-token@v2
- uses: wow-actions/use-app-token@v1
with:
app_id: ${{ secrets.APP_ID }}
private_key: ${{ secrets.PRIVATE_KEY }}
env_name: bot_token
- uses: wow-actions/potential-duplicates@v1
with:
GITHUB_TOKEN: ${{ env.BOT_TOKEN }}
GITHUB_TOKEN: ${{ env.bot_token }}

@ -6,13 +6,13 @@ jobs:
label:
runs-on: ubuntu-latest
steps:
- uses: wow-actions/use-app-token@v2
- uses: wow-actions/use-app-token@v1
with:
app_id: ${{ secrets.APP_ID }}
private_key: ${{ secrets.PRIVATE_KEY }}
env_name: bot_token
- uses: TimonVS/pr-labeler-action@v3
with:
configuration-path: .github/workflows/config/pr-label-branch-name.yml
env:
GITHUB_TOKEN: ${{ env.BOT_TOKEN }}
GITHUB_TOKEN: ${{ env.bot_token }}

@ -4,12 +4,12 @@ jobs:
label:
runs-on: ubuntu-latest
steps:
- uses: wow-actions/use-app-token@v2
- uses: wow-actions/use-app-token@v1
with:
app_id: ${{ secrets.APP_ID }}
private_key: ${{ secrets.PRIVATE_KEY }}
env_name: bot_token
- uses: actions/labeler@v2
with:
repo-token: ${{ env.BOT_TOKEN }}
repo-token: ${{ env.bot_token }}
configuration-path: .github/workflows/config/pr-label-file-paths.yml

@ -4,12 +4,12 @@ jobs:
label:
runs-on: ubuntu-latest
steps:
- uses: wow-actions/use-app-token@v2
- uses: wow-actions/use-app-token@v1
with:
app_id: ${{ secrets.APP_ID }}
private_key: ${{ secrets.PRIVATE_KEY }}
env_name: bot_token
- uses: pascalgn/size-label-action@v0.4.3
env:
GITHUB_TOKEN: ${{ env.BOT_TOKEN }}
GITHUB_TOKEN: ${{ env.bot_token }}
IGNORED: "!.gitignore\nyarn.lock\npnpm-lock.yaml"

@ -9,12 +9,12 @@ jobs:
triage:
runs-on: ubuntu-latest
steps:
- uses: wow-actions/use-app-token@v2
- uses: wow-actions/use-app-token@v1
with:
app_id: ${{ secrets.APP_ID }}
private_key: ${{ secrets.PRIVATE_KEY }}
env_name: bot_token
- uses: wow-actions/pr-triage@v1
with:
GITHUB_TOKEN: ${{ env.BOT_TOKEN }}
GITHUB_TOKEN: ${{ env.bot_token }}
WORKFLOW-ID: ${{ github.event.workflow_run.id }}

@ -11,15 +11,15 @@ jobs:
label:
runs-on: ubuntu-latest
steps:
- uses: wow-actions/use-app-token@v2
- uses: wow-actions/use-app-token@v1
with:
app_id: ${{ secrets.APP_ID }}
private_key: ${{ secrets.PRIVATE_KEY }}
env_name: bot_token
- uses: Naturalclar/issue-action@v2.0.1
with:
title-or-body: title
github-token: ${{ env.BOT_TOKEN }}
github-token: ${{ env.bot_token }}
parameters: >
[
{

@ -69,17 +69,17 @@ jobs:
run: yarn build:sites
- name: 🔑 Generate Token
uses: wow-actions/use-app-token@v2
uses: wow-actions/use-app-token@v1
with:
app_id: ${{ secrets.APP_ID }}
private_key: ${{ secrets.PRIVATE_KEY }}
env_name: bot_token
- name:  Deploy Sites
uses: afc163/surge-preview@v1
with:
surge_token: ${{ secrets.SURGE_TOKEN }}
github_token: ${{ env.BOT_TOKEN }}
github_token: ${{ env.bot_token }}
build: |
echo Create sites preview
dist: sites/x6-sites/public

@ -10,11 +10,11 @@ jobs:
- uses: actions/checkout@master
with:
fetch-depth: 0
- uses: wow-actions/use-app-token@v2
- uses: wow-actions/use-app-token@v1
with:
app_id: ${{ secrets.APP_ID }}
private_key: ${{ secrets.PRIVATE_KEY }}
env_name: bot_token
- uses: cirrus-actions/rebase@master
env:
GITHUB_TOKEN: ${{ env.BOT_TOKEN }}
GITHUB_TOKEN: ${{ env.bot_token }}

@ -15,8 +15,7 @@ jobs:
steps:
- name:  Checkout
uses: actions/checkout@v3
with:
persist-credentials: false
- name: 🎉 Setup nodejs
uses: actions/setup-node@v3
with:
@ -45,33 +44,40 @@ jobs:
- name: 🚧 Install dependencies
run: pnpm install --no-frozen-lockfile --ignore-scripts
- name: 📦 build
run: pnpm run build
# - name: 📦 build
# run: pnpm run build
# - name: ✅ Test
# run: pnpm run test
- name: 🔑 Generate Token
uses: wow-actions/use-app-token@v2
uses: wow-actions/use-app-token@v1
with:
app_id: ${{ secrets.APP_ID }}
private_key: ${{ secrets.PRIVATE_KEY }}
env_name: bot_token
- name: 📦 Semantic Release
run: pnpm srm --combine-commits --comment-footer 'Thanks for being a part of the [AntV](https://github.com/antvis) community! 💪💯'
run: pnpm srm --debug --comment-footer 'Thanks for being a part of the [AntV](https://github.com/antvis) community! 💪💯'
env:
SRM_DEBUG: ${{ secrets.SRM_DEBUG }}
NPM_TOKEN: ${{ secrets.NPM_TOKEN }}
NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }}
GITHUB_TOKEN: ${{ env.BOT_TOKEN }}
GIT_AUTHOR_NAME: ${{ env.BOT_NAME }}[bot]
GIT_AUTHOR_EMAIL: ${{ env.BOT_NAME }}[bot]@users.noreply.github.com
GIT_COMMITTER_NAME: ${{ env.BOT_NAME }}[bot]
GIT_COMMITTER_EMAIL: ${{ env.BOT_NAME }}[bot]@users.noreply.github.com
GITHUB_TOKEN: ${{ env.bot_token }}
GIT_AUTHOR_NAME: x6-bot
GIT_AUTHOR_EMAIL: x6-bot@users.noreply.github.com
GIT_COMMITTER_NAME: x6-bot
GIT_COMMITTER_EMAIL: x6-bot@users.noreply.github.com
# - uses: actions/github-script@v6
# with:
# github-token: ${{ env.bot_token }}
# script: |
# const action = require('./scripts/finalize-release.js')
# return await action({github, context, core})
- name: 🔀 Repository Dispatch
if: github.ref == 'refs/heads/master'
uses: peter-evans/repository-dispatch@v2
with:
token: ${{ env.BOT_TOKEN }}
token: ${{ env.bot_token }}
event-type: released

@ -6,11 +6,11 @@ jobs:
run:
runs-on: ubuntu-latest
steps:
- uses: wow-actions/use-app-token@v2
- uses: wow-actions/use-app-token@v1
with:
app_id: ${{ secrets.APP_ID }}
private_key: ${{ secrets.PRIVATE_KEY }}
env_name: bot_token
- uses: wow-actions/activity-report@v1
with:
GITHUB_TOKEN: ${{ env.BOT_TOKEN }}
GITHUB_TOKEN: ${{ env.bot_token }}

@ -6,11 +6,11 @@ jobs:
run:
runs-on: ubuntu-latest
steps:
- uses: wow-actions/use-app-token@v2
- uses: wow-actions/use-app-token@v1
with:
app_id: ${{ secrets.APP_ID }}
private_key: ${{ secrets.PRIVATE_KEY }}
env_name: bot_token
- uses: wow-actions/activity-report@v1
with:
GITHUB_TOKEN: ${{ env.BOT_TOKEN }}
GITHUB_TOKEN: ${{ env.bot_token }}

@ -6,12 +6,12 @@ jobs:
cmd:
runs-on: ubuntu-latest
steps:
- uses: wow-actions/use-app-token@v2
- uses: wow-actions/use-app-token@v1
with:
app_id: ${{ secrets.APP_ID }}
private_key: ${{ secrets.PRIVATE_KEY }}
env_name: bot_token
- uses: wow-actions/slash-commands@v1
with:
GITHUB_TOKEN: ${{ env.BOT_TOKEN }}
GITHUB_TOKEN: ${{ env.bot_token }}
CONFIG_FILE: .github/workflows/config/slash-commands.yml

@ -6,14 +6,14 @@ jobs:
stale:
runs-on: ubuntu-latest
steps:
- uses: wow-actions/use-app-token@v2
- uses: wow-actions/use-app-token@v1
with:
app_id: ${{ secrets.APP_ID }}
private_key: ${{ secrets.PRIVATE_KEY }}
env_name: bot_token
- uses: actions/stale@v3
with:
repo-token: ${{ env.BOT_TOKEN }}
repo-token: ${{ env.bot_token }}
stale-issue-message: |
Hiya!

@ -9,13 +9,13 @@ jobs:
sync:
runs-on: ubuntu-latest
steps:
- uses: wow-actions/use-app-token@v2
- uses: wow-actions/use-app-token@v1
with:
app_id: ${{ secrets.APP_ID }}
private_key: ${{ secrets.PRIVATE_KEY }}
env_name: bot_token
- uses: micnncim/action-label-syncer@v1
env:
GITHUB_TOKEN: ${{ env.BOT_TOKEN }}
GITHUB_TOKEN: ${{ env.bot_token }}
with:
manifest: .github/workflows/config/labels.yml

@ -14,14 +14,13 @@ jobs:
- uses: actions/checkout@v3
with:
fetch-depth: 0
- uses: wow-actions/use-app-token@v2
- uses: wow-actions/use-app-token@v1
with:
app_id: ${{ secrets.APP_ID }}
private_key: ${{ secrets.PRIVATE_KEY }}
env_name: bot_token
- uses: wow-actions/update-authors@v1
with:
GITHUB_TOKEN: ${{ env.BOT_TOKEN }}
bots: false
GITHUB_TOKEN: ${{ env.bot_token }}
path: CONTRIBUTORS
commit: 'chore: update CONTRIBUTORS [skip ci]'
bots: false

@ -13,12 +13,12 @@ jobs:
contributors:
runs-on: ubuntu-latest
steps:
- uses: wow-actions/use-app-token@v2
- uses: wow-actions/use-app-token@v1
with:
app_id: ${{ secrets.APP_ID }}
private_key: ${{ secrets.PRIVATE_KEY }}
env_name: bot_token
- uses: wow-actions/contributors-list@v1
with:
GITHUB_TOKEN: ${{ env.BOT_TOKEN }}
GITHUB_TOKEN: ${{ env.bot_token }}
excludeUsers: semantic-release-bot ImgBotApp

@ -9,11 +9,11 @@ jobs:
- uses: actions/checkout@v3
with:
fetch-depth: 0
- uses: wow-actions/use-app-token@v2
- uses: wow-actions/use-app-token@v1
with:
app_id: ${{ secrets.APP_ID }}
private_key: ${{ secrets.PRIVATE_KEY }}
env_name: bot_token
- uses: FantasticFiasco/action-update-license-year@v2
with:
token: ${{ env.BOT_TOKEN }}
token: ${{ env.bot_token }}

@ -8,19 +8,21 @@ jobs:
welcome:
runs-on: ubuntu-latest
steps:
- uses: wow-actions/use-app-token@v2
- uses: wow-actions/use-app-token@v1
with:
app_id: ${{ secrets.APP_ID }}
private_key: ${{ secrets.PRIVATE_KEY }}
env_name: bot_token
- uses: wow-actions/welcome@v1
with:
GITHUB_TOKEN: ${{ env.BOT_TOKEN }}
GITHUB_TOKEN: ${{ env.bot_token }}
FIRST_ISSUE: |
👋 @{{ author }}
Thanks for opening your first issue here! If you're reporting a 🐞 bug, please make sure you include steps to reproduce it.
To help make it easier for us to investigate your issue, please follow the [contributing guidelines](https://github.com/antvis/X6/blob/master/CONTRIBUTING.md).
We get a lot of issues on this repo, so please be patient and we will get back to you as soon as we can.
FIRST_PR: |

2
.gitignore vendored

@ -15,5 +15,3 @@ dist
tmp
test/coverage
packages/**/src/style/raw.ts
.eslintcache
.stylelintcache

@ -1,14 +0,0 @@
#!/bin/sh
. "$(dirname "$0")/_/husky.sh"
branch="$(git rev-parse --abbrev-ref HEAD)"
user="$(git config user.name)"
whitelist=("bubkoo" "NewByVector")
if [[ ! " ${whitelist[@]} " =~ " ${user} " ]]; then
if [ "$branch" = "master" ]; then
echo "Push to master branch is forbidden."
echo "Checkout your owne branch then submit a pr."
exit 1
fi
fi

4
.husky/prepush Executable file

@ -0,0 +1,4 @@
#!/bin/sh
. "$(dirname "$0")/_/husky.sh"
./scripts/pre-push-check

12
.lgtm.yml Normal file

@ -0,0 +1,12 @@
# @see https://help.semmle.com/lgtm-enterprise/user/help/lgtm.yml-configuration-file.html
# @template https://lgtm.com/static/downloads/lgtm.template.yml
queries:
- exclude: js/use-before-declaration
- exclude: js/polynomial-redos
extraction:
javascript:
index:
filters:
- exclude: "sites/x6-sites/static"

@ -12,5 +12,5 @@ es/
lib/
dist/
coverage/
sites/public
sites/x6-sites/static/demos
csstype.ts

@ -12,17 +12,13 @@
"@semantic-release/commit-analyzer",
{
"releaseRules": [
{ "revert": true, "release": "patch" },
{ "type": "feat", "release": "minor" },
{ "type": "build", "release": "patch" },
{ "type": "ci", "release": "patch" },
{ "type": "chore", "release": "patch" },
{ "type": "docs", "release": "patch" },
{ "type": "perf", "release": "patch" },
{ "type": "style", "release": "patch" },
{ "type": "test", "release": "patch" },
{ "type": "refactor", "release": "patch" },
{ "type": "ci", "release": false },
{ "type": "chore", "release": false },
{ "scope": "no-release", "release": false }
{ "type": "style", "release": "patch" },
{ "type": "test", "release": "patch" }
]
}
],
@ -31,7 +27,7 @@
[
"@semantic-release/npm",
{
"npmPublish": true
"npmPublish": false
}
],
[

@ -15,11 +15,6 @@
"no-invalid-double-slash-comments": null,
"no-descending-specificity": null,
"declaration-empty-line-before": null,
"no-duplicate-selectors": null,
"value-no-vendor-prefix": null,
"selector-pseudo-class-no-unknown": null,
"selector-class-pattern": null,
"keyframes-name-pattern": null,
"number-max-precision": null
"no-duplicate-selectors": null
}
}

@ -1,26 +1,22 @@
BARM <284942955@qq.com>
Candy <563378816@qq.com>
Chaoqi ZHANG <prncoprs@163.com>
Clifford Fajardo <cliffordfajardo@users.noreply.github.com>
Chaoqi <HAN>
Clifford <ajard>
DaiGang <42136433+daigang666@users.noreply.github.com>
Dong <48054715+halodong@users.noreply.github.com>
Draco <Draco.coder@gmail.com>
Eve-Sama <17764594863@163.com>
Eve-Sama <948832626@qq.com>
Gossypol <31892817+gossypol@users.noreply.github.com>
HQidea <HQidea@users.noreply.github.com>
ImgBotApp <ImgBotHelp@gmail.com>
Indomi <indomi126@gmail.com>
James Tsang <wtzeng1@gmail.com>
Jógvan Olsen <jogvanolsen@hotmail.com>
Ken Geis <geis.ken@gmail.com>
Kent Wood <minzojian@hotmail.com>
Ko.Rei <32183014+Ko-Rei@users.noreply.github.com>
James <san>
Jógvan <lse>
Ken <ei>
Limbo <49612796+JUST-Limbo@users.noreply.github.com>
Lixu <37231473+wflixu@users.noreply.github.com>
Lloyd Zhou <lloydzhou@users.noreply.github.com>
Lloyd <ho>
Lyn <47809781+lyn-boyu@users.noreply.github.com>
MOMO <329053928@qq.com>
Mingfei <az8641683@163.com>
MrMengJ <2646973632@qq.com>
Naveen <172697+naveensrinivasan@users.noreply.github.com>
@ -28,22 +24,16 @@ NewByVector <NewByVector@users.noreply.github.com>
Olive.Wang <olivewind.wang@gmail.com>
Opportunity <opportunity@live.in>
Questions <chip@twostewards.com>
RuiLin Dong <48054715+halodong@users.noreply.github.com>
RuiLin <on>
SSC <273702440@qq.com>
Samuel Bodin <1637651+bodinsamuel@users.noreply.github.com>
Simon He <57086651+Simon-He95@users.noreply.github.com>
Sindori <441933726@qq.com>
Struggle <1178825961@qq.com>
Struggle Roue <47975400+struggleRoue@users.noreply.github.com>
Susan <527971893@qq.com>
Thomas Zeugner <tomsoftware@gmx.de>
Tony Wu <93302820+tonywu6@users.noreply.github.com>
Thomas <eugne>
Tony <>
Utopia <greatauk11@gmail.com>
XLZY <1017866168@qq.com>
Xia Wenqi <xiawenqi90@gmail.com>
Xingjian Zhang <44231913+THUzxj@users.noreply.github.com>
Zhenyu Hou <skyking_H@hotmail.com>
_XiaoTian <istianlei@qq.com>
Xingjian <han>
Zhenyu <o>
arthur657834 <kingkom7834@126.com>
boyu.zlj <boyu.zlj@antgroup.com>
breezefaith <nyzhangzc@qq.com>
@ -59,8 +49,6 @@ kelin.zrh <34393362+AricZhu@users.noreply.github.com>
kingshuaishuai <ken.wang@mrs.ai>
kio <1421104933@qq.com>
lijing666 <lijing241@yeah.net>
linkun <33945539+linkun-wang@users.noreply.github.com>
linkun <linkun0922@163.com>
lopn <lopnxrp@126.com>
luchunwei <luchunwei@gmail.com>
luzhuang <364439895@qq.com>
@ -69,41 +57,32 @@ myzxlin <myzxlin@163.com>
newbyvector <vectorse@126.com>
niexq <1879633916@qq.com>
niexq <niexq@firstgrid.cn>
njshuisheng <34205271+njshuisheng@users.noreply.github.com>
nobugforever <84232410+mengYu-Jin@users.noreply.github.com>
pengxingjian.pxj <pengxingjian.pxj@alibaba-inc.com>
pfdgithub <pfdgithub@users.noreply.github.com>
qingchi <qinky94@163.com>
qu <33251372+Qujh97@users.noreply.github.com>
sallen450 <qinghua10199@gmail.com>
semantic-release-bot <semantic-release-bot@martynus.net>
siaikin <abc1310054026@outlook.com>
vector <vectorse@126.com>
wenbei <38773084+wb-wenbei@users.noreply.github.com>
wgf <34190465+evelope@users.noreply.github.com>
wind X <35559153+XueMeijing@users.noreply.github.com>
wind <>
wjqsummer <52412389+wjqsummer@users.noreply.github.com>
wseven7677 <caoyu_92@126.com>
wtzeng1 <wtzeng1@gmail.com>
x6-bot <x6-bot@users.noreply.github.com>
xrkffgg <xrkffgg@gmail.com>
yaojin2070 <48686959+yaojin2070@users.noreply.github.com>
zdc1111 <39116292+zdc1111@users.noreply.github.com>
€alix <qq287649920@gmail.com>
九思⚡⚡⚡ <2228429150@qq.com>
何腾飞 <avrin.live.cn@outlook.com>
依枫 <deng25st@163.com>
偏右 <afc163@gmail.com>
小耀 <jinyue.gjy@antfin.com>
崖 <bubkoo.wy@gmail.com>
崖崖崖 <bubkoo.wy@gmail.com>
张子睿 <411489774@qq.com>
文瑀 <wenyu.jqq@antfin.com>
映月 <38279397+orientMoon@users.noreply.github.com>
杨凌 <89915256@qq.com>
柏愚 <boyu.zlj@antfin.com>
粑粑超 <842486229@qq.com>
诸岳 <dengfuping_private@163.com>
金强强 <wenyu.jqq@antfin.com>
问崖 <bubkoo.wy@gmail.com>
问崖 <pengxingjian.pxj@antfin.com>

File diff suppressed because one or more lines are too long

Before

(image error) Size: 14 MiB

After

(image error) Size: 9.7 MiB

@ -1,6 +1,6 @@
MIT License
Copyright (c) 2021-2023 Alipay.inc
Copyright (c) 2021-2022 Alipay.inc
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal

@ -17,7 +17,7 @@
<a href="/LICENSE"><img src="https://img.shields.io/github/license/antvis/x6?style=flat-square" alt="MIT License"></a>
<a href="https://www.typescriptlang.org"><img alt="Language" src="https://img.shields.io/badge/language-TypeScript-blue.svg?style=flat-square"></a>
<a href="https://github.com/antvis/x6/pulls"><img alt="PRs Welcome" src="https://img.shields.io/badge/PRs-Welcome-brightgreen.svg?style=flat-square"></a>
<a href="https://x6.antv.antgroup.com/"><img alt="website" src="https://img.shields.io/static/v1?label=&labelColor=505050&message=website&color=0076D6&style=flat-square&logo=google-chrome&logoColor=0076D6"></a>
<a href="https://x6.antv.vision"><img alt="website" src="https://img.shields.io/static/v1?label=&labelColor=505050&message=website&color=0076D6&style=flat-square&logo=google-chrome&logoColor=0076D6"></a>
</p>
## Features
@ -84,8 +84,8 @@ graph.addEdge({
## Links
- [Documents](https://x6.antv.antgroup.com/tutorial/about)
- [Samples](https://x6.antv.antgroup.com/examples)
- [Documents](https://x6.antv.vision/zh/docs/tutorial/about)
- [Samples](https://x6.antv.vision/zh/examples/gallery)
- [Blog](https://www.yuque.com/antv/x6/gcinvi)
- [Versioning Release Note](https://www.yuque.com/antv/x6/bbfu6r)
- [FAQ](https://www.yuque.com/antv/x6/be9pfx)

@ -6,17 +6,18 @@
<p align="center"><strong>提供简单易用的节点定制能力和开箱即用的交互组件方便我们快速搭建流程图、DAG 图、ER 图等图应用</strong></p>
<p align="center">
<a href="https://github.com/antvis/X6/actions/workflows/ci.yml"><img alt="build" src="https://img.shields.io/github/actions/workflow/status/antvis/x6/ci.yml?branch=master&style=for-the-badge&logo=github"></a>
<!-- <a href="https://app.codecov.io/gh/antvis/X6"><img alt="coverage" src="https://img.shields.io/codecov/c/gh/antvis/x6?logo=codecov&style=for-the-badge&token=15CO54WYUV"></a> -->
<a href="https://www.npmjs.com/package/@antv/x6"><img alt="NPM Package" src="https://img.shields.io/npm/v/@antv/x6.svg?logo=npm&style=for-the-badge"></a>
<a href="https://www.npmjs.com/package/@antv/x6"><img alt="NPM Downloads" src="https://img.shields.io/npm/dm/@antv/x6?logo=npm&style=for-the-badge"></a>
<a href="https://github.com/antvis/X6/actions/workflows/ci.yml"><img alt="build" src="https://img.shields.io/github/workflow/status/antvis/x6/%F0%9F%91%B7%E3%80%80CI/master?logo=github&style=flat-square"></a>
<a href="https://app.codecov.io/gh/antvis/X6"><img alt="coverage" src="https://img.shields.io/codecov/c/gh/antvis/x6?logo=codecov&style=flat-square&token=15CO54WYUV"></a>
<a href="https://lgtm.com/projects/g/antvis/x6/context:javascript"><img alt="Language grade: JavaScript" src="https://img.shields.io/lgtm/grade/javascript/g/antvis/x6.svg?logo=lgtm&style=flat-square"></a>
<a href="https://www.npmjs.com/package/@antv/x6"><img alt="NPM Package" src="https://img.shields.io/npm/v/@antv/x6.svg?style=flat-square"></a>
<a href="https://www.npmjs.com/package/@antv/x6"><img alt="NPM Downloads" src="https://img.shields.io/npm/dm/@antv/x6?logo=npm&style=flat-square"></a>
</p>
<p align="center">
<a href="/LICENSE"><img src="https://img.shields.io/github/license/antvis/x6?style=for-the-badge" alt="MIT License"></a>
<a href="https://www.typescriptlang.org"><img alt="Language" src="https://img.shields.io/badge/language-TypeScript-blue.svg?style=for-the-badge"></a>
<a href="https://github.com/antvis/x6/pulls"><img alt="PRs Welcome" src="https://img.shields.io/badge/PRs-Welcome-brightgreen.svg?style=for-the-badge"></a>
<a href="https://x6.antv.antgroup.com"><img alt="website" src="https://img.shields.io/static/v1?label=&labelColor=505050&message=website&color=0076D6&style=for-the-badge&logo=google-chrome&logoColor=f5f5f5"></a>
<a href="/LICENSE"><img src="https://img.shields.io/github/license/antvis/x6?style=flat-square" alt="MIT License"></a>
<a href="https://www.typescriptlang.org"><img alt="Language" src="https://img.shields.io/badge/language-TypeScript-blue.svg?style=flat-square"></a>
<a href="https://github.com/antvis/x6/pulls"><img alt="PRs Welcome" src="https://img.shields.io/badge/PRs-Welcome-brightgreen.svg?style=flat-square"></a>
<a href="https://x6.antv.vision"><img alt="website" src="https://img.shields.io/static/v1?label=&labelColor=505050&message=website&color=0076D6&style=flat-square&logo=google-chrome&logoColor=0076D6"></a>
</p>
## 特性
@ -28,12 +29,12 @@
## 兼容环境
- 现代浏览器
- 现代浏览器和 IE11需要 polyfills
- 支持服务端渲染。
| [<img src="https://raw.githubusercontent.com/alrra/browser-logos/master/src/firefox/firefox_48x48.png" alt="Firefox" width="24px" height="24px" />](http://godban.github.io/browsers-support-badges/)<br>Firefox | [<img src="https://raw.githubusercontent.com/alrra/browser-logos/master/src/chrome/chrome_48x48.png" alt="Chrome" width="24px" height="24px" />](http://godban.github.io/browsers-support-badges/)<br>Chrome | [<img src="https://raw.githubusercontent.com/alrra/browser-logos/master/src/safari/safari_48x48.png" alt="Safari" width="24px" height="24px" />](http://godban.github.io/browsers-support-badges/)<br>Safari |
|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| last 2 versions | last 2 versions | last 2 versions |
| [<img src="https://raw.githubusercontent.com/alrra/browser-logos/master/src/edge/edge_48x48.png" alt="IE / Edge" width="24px" height="24px" />](http://godban.github.io/browsers-support-badges/)<br>IE / Edge | [<img src="https://raw.githubusercontent.com/alrra/browser-logos/master/src/firefox/firefox_48x48.png" alt="Firefox" width="24px" height="24px" />](http://godban.github.io/browsers-support-badges/)<br>Firefox | [<img src="https://raw.githubusercontent.com/alrra/browser-logos/master/src/chrome/chrome_48x48.png" alt="Chrome" width="24px" height="24px" />](http://godban.github.io/browsers-support-badges/)<br>Chrome | [<img src="https://raw.githubusercontent.com/alrra/browser-logos/master/src/safari/safari_48x48.png" alt="Safari" width="24px" height="24px" />](http://godban.github.io/browsers-support-badges/)<br>Safari |
|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| IE11, Edge | last 2 versions | last 2 versions | last 2 versions |
## 安装
@ -83,12 +84,12 @@ graph.addEdge({
## 链接
- [文档](http://x6.antv.antgroup.com/tutorial/about)
- [示例](http://x6.antv.antgroup.com/examples)
- [博客](https://www.yuque.com/antv/x6/huhla47wqalq5n7r)
- [文档](https://x6.antv.vision/zh/docs/tutorial/about)
- [示例](https://x6.antv.vision/zh/examples/gallery)
- [博客](https://www.yuque.com/antv/x6/gcinvi)
- [更新日志](https://www.yuque.com/antv/x6/bbfu6r)
- [常见问题](https://www.yuque.com/antv/x6/tox1ukbz5cw57qfy)
- [CodeSanbox 模板](https://codesandbox.io/s/mo-ban-wchooy?file=/src/App.tsx)
- [常见问题](https://www.yuque.com/antv/x6/be9pfx)
- [CodeSanbox 模板](https://codesandbox.io/s/qosj0?file=/src/app.tsx)
## 本地开发
@ -110,10 +111,9 @@ pnpm run start
如果希望参与到 X6 的开发中,请遵从我们的[贡献指南](/CONTRIBUTING.zh-CN.md)。如果你贡献度足够活跃,你可以申请成为社区协作者。
<a href="https://github.com/antvis/x6/graphs/contributors">
<img src="https://raw.githubusercontent.com/antvis/X6/master/CONTRIBUTORS.svg" alt="Contributors" />
<img src="/CONTRIBUTORS.svg" alt="Contributors" width="740" />
</a>
## 开源协议
该项目的代码和文档基于 [MIT License](/LICENSE) 开源协议。

File diff suppressed because it is too large Load Diff

@ -1,54 +1,61 @@
{
"private": true,
"name": "@antv/x6-example-features",
"version": "2.1.1",
"version": "1.0.1",
"scripts": {
"start": "umi dev",
"build": "umi build",
"lint": "eslint 'src/**/*.{js,ts}?(x)' --fix"
"lint": "eslint 'src/**/*.{js,ts}?(x)' --fix",
"precommit": "lint-staged"
},
"dependencies": {
"@antv/hierarchy": "^0.6.8",
"@antv/x6": "^2.x",
"@antv/x6-plugin-clipboard": "^2.x",
"@antv/x6-plugin-dnd": "^2.x",
"@antv/x6-plugin-export": "^2.x",
"@antv/x6-plugin-history": "^2.x",
"@antv/x6-plugin-keyboard": "^2.x",
"@antv/x6-plugin-minimap": "^2.x",
"@antv/x6-plugin-scroller": "^2.x",
"@antv/x6-plugin-selection": "^2.x",
"@antv/x6-plugin-snapline": "^2.x",
"@antv/x6-plugin-stencil": "^2.x",
"@antv/x6-plugin-transform": "^2.x",
"@antv/x6-react-components": "^2.x",
"@antv/x6-react-shape": "^2.x",
"@antv/x6": "1.1.1",
"@antv/x6-plugin-clipboard": "1.0.3",
"@antv/x6-plugin-dnd": "1.0.3",
"@antv/x6-plugin-history": "1.0.3",
"@antv/x6-plugin-keyboard": "1.0.3",
"@antv/x6-plugin-minimap": "1.0.3",
"@antv/x6-plugin-scroller": "1.1.1",
"@antv/x6-plugin-selection": "1.0.3",
"@antv/x6-plugin-snapline": "1.0.3",
"@antv/x6-plugin-stencil": "1.0.3",
"@antv/x6-plugin-transform": "1.0.3",
"@antv/x6-plugin-export": "1.0.3",
"@antv/x6-react-components": "1.1.1",
"@antv/x6-react-shape": "1.0.3",
"antd": "^4.4.2",
"classnames": "^2.2.6",
"dagre": "^0.8.5",
"elkjs": "^0.8.2",
"elkjs": "^0.7.1",
"react": "^18.0.0",
"react-dom": "^18.0.0",
"react-helmet": "^6.0.0"
"react-helmet": "^6.0.0",
"@antv/hierarchy": "^0.6.8"
},
"devDependencies": {
"@ant-design/icons": "^4.2.2",
"@types/jest": "^29.2.4",
"@types/jest": "^25.2.1",
"@types/react": "^18.0.0",
"@types/react-dom": "^18.0.0",
"@types/react-helmet": "^6.0.0",
"@types/react-test-renderer": "^18.0.0",
"babel-plugin-import": "^1.13.5",
"eslint": "^8.29.0",
"@types/react-test-renderer": "^16.0.3",
"eslint": "^7.16.0",
"eslint-config-umi": "^1.4.0",
"eslint-plugin-flowtype": "^8.0.3",
"eslint-plugin-flowtype": "^4.7.0",
"eslint-plugin-import": "^2.22.1",
"eslint-plugin-jsx-a11y": "^6.2.3",
"eslint-plugin-react": "^7.11.1",
"lint-staged": "^10.5.3",
"react-test-renderer": "^16.7.0",
"umi": "^2.9.0",
"umi-plugin-react": "^1.8.0",
"umi-types": "^0.3.0"
"umi-types": "^0.3.0",
"babel-plugin-import": "^1.13.5"
},
"lint-staged": {
"src/**/*.ts": [
"eslint --fix"
]
},
"engines": {
"node": ">=8.0.0"

@ -7,17 +7,17 @@
.nav {
position: absolute;
z-index: 101;
top: 0;
bottom: 0;
left: 0;
z-index: 101;
box-sizing: border-box;
width: 220px;
padding: 0 16px;
font-size: 13px;
overflow-x: hidden;
overflow-y: auto;
font-size: 13px;
width: 220px;
padding: 0 16px;
border-right: 1px solid #e9e9e9;
box-sizing: border-box;
ul {
padding-left: 16px;
@ -29,11 +29,11 @@
}
.content {
flex-grow: 1;
box-sizing: border-box;
margin-left: 220px;
padding: 34px;
overflow-x: hidden;
overflow-y: auto;
background: #fff;
flex-grow: 1;
margin-left: 220px;
background: #ffffff;
padding: 34px;
}

@ -8,15 +8,13 @@
border: 1px solid #c2c8d5;
border-left: 4px solid #1890ff;
border-radius: 4px;
box-shadow: 0 2px 5px 1px rgb(0 0 0 / 6%);
box-shadow: 0 2px 5px 1px rgba(0, 0, 0, 0.06);
img {
flex-shrink: 0;
width: 20px;
height: 20px;
flex-shrink: 0;
margin-left: 8px;
}
.label {
display: inline-block;
flex-shrink: 0;
@ -25,19 +23,15 @@
color: #666;
font-size: 12px;
}
.status {
flex-shrink: 0;
}
&.success {
border-left: 4px solid #52c41a;
}
&.failed {
border-left: 4px solid #ff4d4f;
}
&.running .status img {
animation: spin 1s linear infinite;
}
@ -49,13 +43,11 @@
border-radius: 2px;
box-shadow: 0 0 0 4px #d4e8fe;
}
.node.success {
border-color: #52c41a;
border-radius: 2px;
box-shadow: 0 0 0 4px #ccecc0;
}
.node.failed {
border-color: #ff4d4f;
border-radius: 2px;
@ -88,7 +80,6 @@
from {
transform: rotate(0deg);
}
to {
transform: rotate(360deg);
}

@ -4,7 +4,6 @@
visibility: hidden;
cursor: pointer;
}
&:hover image {
visibility: visible;
}

@ -212,15 +212,12 @@ export default class Example extends React.Component {
return 'right'
},
})
const cells: Cell[] = []
const traverse = (hierarchyItem: HierarchyResult) => {
if (hierarchyItem) {
const { data, children } = hierarchyItem
// 检查当前遍历的节点已经存在还是需要新添加?
if (graph.hasCell(data.id)) {
const node = graph.getCellById(data.id)
node.prop('position', { x: hierarchyItem.x, y: hierarchyItem.y })
} else {
const node = graph.addNode({
cells.push(
graph.createNode({
id: data.id,
shape: data.type === 'topic-child' ? 'topic-child' : 'topic',
x: hierarchyItem.x,
@ -229,18 +226,13 @@ export default class Example extends React.Component {
height: data.height,
label: data.label,
type: data.type,
})
}
}),
)
if (children) {
children.forEach((item: HierarchyResult) => {
const { id, data } = item
// 先遍历子节点里面包含创建逻辑如果画布没有开启async的时候创建边会提示找不到target节点
traverse(item)
const eid = `${hierarchyItem.id}-->${id}`
// 检查当前边是否已经存在
if (!graph.hasCell(eid)) {
graph.addEdge({
id: eid,
cells.push(
graph.createEdge({
shape: 'mindmap-edge',
source: {
cell: hierarchyItem.id,
@ -265,13 +257,15 @@ export default class Example extends React.Component {
name: 'left',
},
},
})
}
}),
)
traverse(item)
})
}
}
}
traverse(result)
graph.resetCells(cells)
graph.centerContent()
}
@ -309,14 +303,9 @@ export default class Example extends React.Component {
if (dataItem) {
let item: MindMapData | null = null
const length = dataItem.children ? dataItem.children.length : 0
let nid = `${id}-${length + 1}`
if (graph.hasCell(nid)) {
// 如果通过length + 1拼接出来的节点id在画布中存在了就在id后面加上随机数
nid = nid + Math.random()
}
if (type === 'topic') {
item = {
id: nid,
id: `${id}-${length + 1}`,
type: 'topic-branch',
label: `分支主题${length + 1}`,
width: 100,
@ -324,7 +313,7 @@ export default class Example extends React.Component {
}
} else if (type === 'topic-branch') {
item = {
id: nid,
id: `${id}-${length + 1}`,
type: 'topic-child',
label: `子主题${length + 1}`,
width: 60,
@ -345,16 +334,10 @@ export default class Example extends React.Component {
const removeNode = (id: string) => {
const res = findItem(data, id)
const parentItem = res?.parent
const nodeItem = res?.node
if (parentItem && parentItem.children) {
const { children } = parentItem
const dataItem = res?.parent
if (dataItem && dataItem.children) {
const { children } = dataItem
const index = children.findIndex((item) => item.id === id)
// 删除的时候先删节点以及可能存在的子节点再调用render对data数据进行遍历
if (nodeItem && nodeItem.children) {
nodeItem.children.forEach((item) => graph.removeCell(item.id))
}
graph.removeCell(id)
return children.splice(index, 1)
}
return null

@ -2,25 +2,24 @@
position: relative;
}
.validating::after {
.validating:after {
position: absolute;
top: 4px;
left: 4px;
content: ' ';
display: block;
width: 50px;
height: 50px;
border: 6px solid #873bf4;
border-color: #873bf4 transparent;
border-radius: 50%;
border: 6px solid #873bf4;
border-color: #873bf4 transparent #873bf4 transparent;
animation: lds-dual-ring 1.2s linear infinite;
content: ' ';
}
@keyframes lds-dual-ring {
0% {
transform: rotate(0deg);
}
100% {
transform: rotate(360deg);
}

@ -2,14 +2,14 @@
.x6-example-wrap {
width: 100%;
height: 100%;
background-color: #fff;
background-color: #ffffff;
.left-side {
position: fixed;
top: 0;
bottom: 0;
left: 24px;
width: 336px;
left: 24px;
top: 0px;
bottom: 0;
padding: 0 8px;
overflow-x: visible;
overflow-y: auto;
@ -17,18 +17,18 @@
.right-side {
position: fixed;
top: 0;
right: 24px;
bottom: 0;
width: 336px;
padding: 0 8px;
top: 0px;
bottom: 0;
overflow-x: visible;
overflow-y: auto;
}
.ant-card {
margin-top: 24px;
box-shadow: 0 0 10px 1px #e9e9e9;
margin-top: 24px;
}
.ant-row-flex {
@ -36,14 +36,14 @@
}
.slider-value {
display: inline-block;
margin-left: 8px;
padding: 3px 7px;
color: #333;
font-size: 12px;
line-height: 1.25;
background: #eee;
color: #333333;
padding: 3px 7px;
border-radius: 10px;
display: inline-block;
font-size: 12px;
margin-left: 8px;
line-height: 1.25;
}
.x6-graph {
@ -52,15 +52,15 @@
.x6-node {
path {
transition: fill 0.1s;
fill: #6a6c8a;
stroke-width: 0;
stroke-width: 0px;
transition: fill 0.1s;
}
text {
font-weight: lighter;
font-size: 12px;
fill: #fff;
font-size: 12px;
font-weight: lighter;
}
&:hover path {
@ -80,37 +80,37 @@
}
.bbox {
transition-duration: 0.5s;
transition-property: stroke-opacity;
pointer-events: none;
fill: none;
stroke: #16a085;
stroke-width: 2;
stroke-opacity: 0;
fill: none;
transition-property: stroke-opacity;
transition-duration: 0.5s;
pointer-events: none;
}
.axis {
pointer-events: none;
stroke: #95a5a6;
stroke-dasharray: 2, 4;
stroke-width: 1;
pointer-events: none;
}
.padding {
transition-duration: 1s;
transition-property: stroke-opacity;
pointer-events: none;
stroke: #1abc9c;
stroke-opacity: 0;
transition-property: stroke-opacity;
transition-duration: 1s;
pointer-events: none;
}
.grid {
transition-duration: 1s;
transition-property: stroke-opacity;
pointer-events: none;
stroke: #16a085;
stroke-width: 0.5;
stroke-opacity: 0;
transition-property: stroke-opacity;
transition-duration: 1s;
pointer-events: none;
}
.active {

@ -1,104 +0,0 @@
import React from 'react'
import { Graph } from '@antv/x6'
import { Keyboard } from '@antv/x6-plugin-keyboard'
import { Selection } from '@antv/x6-plugin-selection'
import { History } from '@antv/x6-plugin-history'
import '../index.less'
export default class Example extends React.Component<
{},
{ graph: Graph | undefined }
> {
private container: HTMLDivElement
componentDidMount() {
const graph = new Graph({
container: this.container,
width: 800,
height: 600,
grid: true,
})
this.setState({ graph })
const selection = new Selection({ enabled: true })
const keyboard = new Keyboard({ enabled: true })
const history = new History({ enabled: true, stackSize: 5 })
graph.use(selection)
graph.use(keyboard)
graph.use(history)
graph.addNode({
x: 50,
y: 50,
width: 100,
height: 40,
attrs: { label: { text: 'A' } },
})
graph.addNode({
x: 250,
y: 50,
width: 100,
height: 40,
attrs: { label: { text: 'B' } },
})
graph.addNode({
x: 350,
y: 150,
width: 100,
height: 40,
attrs: { label: { text: 'C' } },
})
keyboard.bindKey('backspace', () => {
graph.removeCells(selection.getSelectedCells())
})
keyboard.bindKey('command+z', () => {
this.undo()
})
keyboard.bindKey('command+shift+z', () => {
this.redo()
})
}
refContainer = (container: HTMLDivElement) => {
this.container = container
}
enablePlugins = () => {
const { graph } = this.state
graph?.enablePlugins('keyboard')
}
disablePlugins = () => {
const { graph } = this.state
graph?.disablePlugins('keyboard')
}
undo = () => {
const { graph } = this.state
const history = graph?.getPlugin('history') as History
history?.undo()
}
redo = () => {
const { graph } = this.state
const history = graph?.getPlugin('history') as History
history?.redo()
}
render() {
return (
<div className="x6-graph-wrap">
<div ref={this.refContainer} className="x6-graph" />
<button onClick={this.enablePlugins}>enable</button>
<button onClick={this.disablePlugins}>disable</button>
<button onClick={this.undo}>undo</button>
<button onClick={this.redo}>redo</button>
</div>
)
}
}

@ -1,9 +1,9 @@
.custom-html {
width: 100%;
height: 100%;
display: flex;
align-items: center;
justify-content: center;
width: 100%;
height: 100%;
color: #000;
font-size: 16px;
border: 1px solid #000;

@ -1,27 +1,27 @@
.x6-graph-wrap {
width: 100%;
height: 100%;
padding: 32px 0;
background-color: #ffffff;
overflow: auto;
background-color: #fff;
padding: 32px 0;
> h1 {
display: block;
width: 800px;
margin: 0 auto 32px;
margin: 0 auto 32px auto;
}
}
.x6-graph-tools {
width: 800px;
margin: 0 auto 32px;
margin: 0 auto 32px auto;
}
.x6-graph {
width: 100%;
height: 100%;
margin: 0 auto;
box-shadow: 0 0 10px 1px #e9e9e9;
margin: 0 auto;
}
.x6-node-selected {

@ -179,10 +179,6 @@ const dataSource = [
example: 'animation/transition',
description: '动画',
},
{
example: 'history',
description: '时光回溯',
},
].map((item, index) => ({ key: index, ...item }))
const columns = [

@ -4,10 +4,7 @@ import { Keyboard } from '@antv/x6-plugin-keyboard'
import { Selection } from '@antv/x6-plugin-selection'
import '../index.less'
export default class Example extends React.Component<
{},
{ graph: Graph | undefined }
> {
export default class Example extends React.Component {
private container: HTMLDivElement
componentDidMount() {
@ -18,8 +15,6 @@ export default class Example extends React.Component<
grid: true,
})
this.setState({ graph })
const selection = new Selection({ enabled: true })
const keyboard = new Keyboard({ enabled: true })
graph.use(selection)
@ -58,22 +53,10 @@ export default class Example extends React.Component<
this.container = container
}
enablePlugins = () => {
const { graph } = this.state
graph.enablePlugins('keyboard')
}
disablePlugins = () => {
const { graph } = this.state
graph.disablePlugins('keyboard')
}
render() {
return (
<div className="x6-graph-wrap">
<div ref={this.refContainer} className="x6-graph" />
<button onClick={this.enablePlugins}>enable</button>
<button onClick={this.disablePlugins}>disable</button>
</div>
)
}

@ -1,10 +1,10 @@
.react-algo-node {
display: flex;
align-items: center;
width: 100%;
height: 100%;
border: 1px solid #5f95ff;
border-radius: 14px;
display: flex;
align-items: center;
img {
width: 24px;
@ -13,8 +13,8 @@
span {
margin-left: 4px;
color: #000000a6;
font-size: 12px;
color: #000000a6;
}
&.dark {

@ -2,20 +2,20 @@
.my-port {
width: 100%;
height: 100%;
background: #eee;
border: 1px solid #808080;
border-radius: 100%;
background: #eee;
&.connected {
width: 0;
height: 0;
margin-top: 5px;
margin-left: 1px;
background-color: transparent;
border-color: #808080 transparent transparent;
border-style: solid;
border-width: 5px 4px 0;
border-style: solid;
border-color: #808080 transparent transparent;
border-radius: 0;
background-color: transparent;
}
}
@ -30,30 +30,30 @@
}
body > div::before {
content: ' ';
float: left;
box-sizing: border-box;
width: 20px;
height: 20px;
margin-top: -5px;
margin-left: -5px;
background-color: rgb(57 202 116 / 60%);
border-radius: 50%;
content: ' ';
background-color: rgba(57, 202, 116, 0.6);
box-sizing: border-box;
}
body > div::after {
position: relative;
z-index: 10;
content: ' ';
float: left;
clear: both;
box-sizing: border-box;
width: 10px;
height: 10px;
margin-top: -15px;
border-radius: 50%;
background-color: #fff;
border: 1px solid #39ca74;
border-radius: 50%;
content: ' ';
position: relative;
z-index: 10;
box-sizing: border-box;
}
}
@ -65,30 +65,30 @@
}
body > div::before {
content: ' ';
float: left;
box-sizing: border-box;
width: 28px;
height: 28px;
margin-top: -9px;
margin-left: -9px;
background-color: rgb(57 202 116 / 60%);
border-radius: 50%;
content: ' ';
background-color: rgba(57, 202, 116, 0.6);
box-sizing: border-box;
}
body > div::after {
position: relative;
z-index: 10;
content: ' ';
float: left;
clear: both;
box-sizing: border-box;
width: 10px;
height: 10px;
margin-top: -19px;
border-radius: 50%;
background-color: #fff;
border: 1px solid #39ca74;
border-radius: 50%;
content: ' ';
position: relative;
z-index: 10;
box-sizing: border-box;
}
}
}

@ -1,4 +1,4 @@
.x6-graph-scroller {
margin: 0 auto;
box-shadow: 0 0 10px 1px #e9e9e9;
margin: 0 auto;
}

@ -13,7 +13,7 @@ export default class Example extends React.Component {
private minimapContainer: HTMLDivElement
private scroller: Scroller
private selection: Selection
private exportInstance: Export
private exportObj: Export
componentDidMount() {
this.graph = new Graph({
@ -55,12 +55,12 @@ export default class Example extends React.Component {
height: 200,
padding: 10,
})
this.exportInstance = new Export()
this.exportObj = new Export()
this.graph.use(this.scroller)
this.graph.use(this.selection)
this.graph.use(minimap)
this.graph.use(this.exportInstance)
this.graph.use(this.exportObj)
const rect = this.graph.addNode({
shape: 'rect',
@ -122,7 +122,7 @@ export default class Example extends React.Component {
}
onDownload = () => {
this.exportInstance.exportPNG('scroller')
this.exportObj.exportPNG('scroller')
}
render() {

@ -25,6 +25,7 @@ export default class Example extends React.Component {
strict: true,
showNodeSelectionBox: true,
selectCellOnMoved: false,
useCellGeometry: true,
filter(cell) {
return cell !== a
},

@ -1,20 +1,20 @@
.react-table {
width: 100%;
height: 100%;
overflow: hidden;
background-color: #fff;
border: 1px solid #edf2f5;
background-color: #fff;
border-radius: 5px;
overflow: hidden;
.inner {
display: flex;
flex-direction: column;
width: 100%;
height: 100%;
padding: 12px;
background: #edf2f5;
border: 1px solid #fff;
background: #edf2f5;
border-radius: 5px;
display: flex;
flex-direction: column;
}
.header {
@ -36,21 +36,21 @@
}
ul {
margin: 0;
padding: 0;
margin: 0;
}
li {
height: 40px;
padding-left: 16px;
line-height: 40px;
list-style: none;
height: 40px;
line-height: 40px;
padding-left: 16px;
border: 1px solid transparent;
&:hover {
border: 1px solid #1890ff;
// background: rgba(230,247,255,.92);
z-index: 0;
border: 1px solid #1890ff;
}
}
}
@ -58,8 +58,8 @@
.react-table-port {
width: 100%;
height: 100%;
overflow: hidden;
background: #eee;
border: 1px solid #808080;
border-radius: 100%;
background: #eee;
overflow: hidden;
}

@ -1,44 +1,41 @@
.tools {
width: 800px;
margin: 32px auto;
.ant-input {
margin-bottom: 16px;
}
}
.react-node {
display: flex;
align-items: center;
width: 100%;
height: 100%;
border: 1px solid #5f95ff;
border-radius: 14px;
display: flex;
align-items: center;
img {
width: 24px;
height: 24px;
}
span {
margin-left: 4px;
color: #000000a6;
font-size: 12px;
color: #000000a6;
}
}
.stutterer {
position: absolute;
top: 0;
right: 0;
bottom: 0;
left: 0;
width: 310px;
height: 310px;
margin: auto;
border-radius: 200px;
box-shadow: 0 0 10px 10px rgb(0 0 0 / 20%);
transform: scale(1.5);
height: 310px;
width: 310px;
position: absolute;
left: 0;
right: 0;
top: 0;
bottom: 0;
margin: auto;
box-shadow: 0 0 10px 10px rgba(0, 0, 0, 0.2);
border-radius: 200px;
}
.clockHand {
@ -53,12 +50,12 @@
}
.innerLine {
position: absolute;
top: 0%;
left: 47.5%;
width: 5%;
height: 149px;
background-color: red;
border-radius: 6px;
position: absolute;
height: 149px;
left: 47.5%;
top: 0%;
width: 5%;
background-color: red;
transform-origin: bottom center;
}

@ -96,7 +96,7 @@ module.exports = function (config, base, karmaTypescriptConfig) {
},
coverageOptions: {
instrumentation: !isDebug,
exclude: /\.(test|spec)\.ts$/,
exclude: /\.test|spec\.ts$/,
},
reports: {
html: reportsDir,

@ -2,56 +2,31 @@
"name": "x6",
"private": true,
"scripts": {
"preinstall": "npx only-allow pnpm",
"lint:ts": "eslint '**/src/**/*.{js,ts}?(x)' --cache --fix",
"lint:style": "stylelint '**/src/**/*.less' --customSyntax postcss-less --cache --fix",
"preinstall": "node ./scripts/preinstall.js",
"lint:ts": "eslint '**/src/**/*.{js,ts}?(x)' --fix",
"lint:style": "stylelint '**/src/**/*.less' --syntax less --fix",
"lint": "run-s lint:ts lint:style",
"prettier": "prettier --write '**/*.{js,mjs,jsx,tsx,ts,less,md,json}'",
"pretty-quick": "pretty-quick",
"test": "turbo run test --filter=./packages/*",
"build": "turbo run build --filter=./packages/*",
"build:cjs": "turbo run build:cjs --filter=./packages/*",
"build:esm": "turbo run build:esm --filter=./packages/*",
"build:dev": "turbo run build:dev --filter=./packages/*",
"build:umd": "turbo run build:umd --filter=./packages/*",
"build:demos": "sh ./scripts/build-demos",
"build:sites": "sh ./scripts/build-sites",
"update:deps": "pnpm update --interactive --latest --recursive",
"clean:turbo": "pnpm -r --if-present --parallel --filter=./packages/* run clean:turbo",
"clean:build": "pnpm -r --if-present --parallel --filter=./packages/* run clean",
"clean:modules": "pnpm -r --parallel exec rimraf node_modules && rimraf node_modules",
"clean": "run-s clean:build clean:turbo clean:modules",
"update:deps": "pnpm update --interactive --latest --recursive",
"clean": "run-s clean:build clean:modules",
"setup:husky": "husky install .husky",
"prepare": "is-ci || run-p setup:husky build:dev"
},
"rss": {
"clean:turbo": "rimraf .turbo",
"clean:build": "rimraf dist es lib",
"clean:coverage": "rimraf ./test/coverage",
"clean": "run-p clean:**",
"build:less": {
"file": "./scripts/build-less"
},
"build:esm": "tsc --module esnext --target es6 --outDir ./es",
"build:cjs": "tsc --module commonjs --target es6 --outDir ./lib",
"build:umd": "pnpm run --if-present build:less && rollup -c ../../rollup.config.js --bundleConfigAsCjs",
"build:dev": "pnpm run --if-present build:less && run-p -s build:cjs build:esm",
"build:watch": "run-s -s build:watch:esm",
"build:watch:esm": "run-s -s 'build:esm -- -w'",
"build:watch:cjs": "run-s -s 'build:cjs -- -w'",
"build": "run-p -s build:dev build:umd",
"prebuild": "run-s -s clean:build",
"test": {
"file": "./scripts/run-test"
},
"coveralls": "cat ./test/coverage/lcov.info | coveralls",
"pretest": "run-s -s clean:coverage"
},
"lint-staged": {
"*": [
"prettier --write --ignore-unknown"
],
"*.less": [
"stylelint --customSyntax postcss-less --fix"
"stylelint --syntax less --fix"
],
"*.js": [
"prettier --write"
@ -63,7 +38,7 @@
},
"commitlint": {
"extends": [
"@commitlint/config-conventional"
"@commitlint/config-angular"
]
},
"pnpm": {
@ -88,69 +63,70 @@
}
},
"dependencies": {
"@babel/core": "^7.20.5",
"@antv/x6-build-tools": "workspace:*",
"@babel/core": "^7.19.6",
"@babel/plugin-syntax-flow": "^7.18.6",
"@babel/plugin-transform-react-jsx": "^7.19.0",
"@commitlint/config-conventional": "^17.3.0",
"@rollup/plugin-commonjs": "^23.0.5",
"@commitlint/config-angular": "^17.2.0",
"@commitlint/config-conventional": "^17.2.0",
"@rollup/plugin-commonjs": "^23.0.2",
"@rollup/plugin-node-resolve": "^15.0.1",
"@rollup/plugin-replace": "^5.0.1",
"@rollup/plugin-typescript": "^10.0.1",
"@semantic-release-monorepo/cli": "^2.1.2",
"@semantic-release/changelog": "^6.0.2",
"@rollup/plugin-typescript": "^8.2.5",
"@semantic-release-monorepo/cli": "^1.0.28",
"@semantic-release/changelog": "^6.0.1",
"@semantic-release/git": "^10.0.1",
"@types/jasmine": "^4.3.0",
"@types/jest": "^29.2.4",
"@types/node": "^18.11.15",
"@types/jest": "^29.2.1",
"@types/node": "^18.11.9",
"@types/sinon": "^10.0.2",
"@typescript-eslint/eslint-plugin": "^5.46.1",
"@typescript-eslint/parser": "^5.46.1",
"@typescript-eslint/eslint-plugin": "^5.41.0",
"@typescript-eslint/parser": "^5.41.0",
"boxen": "^7.0.0",
"colors": "^1.4.0",
"coveralls": "^3.1.1",
"eslint": "^8.29.0",
"eslint": "^8.26.0",
"eslint-config-airbnb-base": "^15.0.0",
"eslint-config-prettier": "^8.3.0",
"eslint-plugin-eslint-comments": "^3.2.0",
"eslint-plugin-flowtype": "^8.0.3",
"eslint-plugin-import": "^2.24.2",
"eslint-plugin-jest": "^27.1.7",
"eslint-plugin-jest": "^27.1.3",
"eslint-plugin-jsx-a11y": "^6.4.1",
"eslint-plugin-prettier": "^4.0.0",
"eslint-plugin-promise": "^6.1.1",
"eslint-plugin-react": "^7.31.11",
"eslint-plugin-react": "^7.25.1",
"eslint-plugin-react-hooks": "^4.2.0",
"eslint-plugin-unicorn": "^45.0.2",
"fs-extra": "^11.1.0",
"eslint-plugin-unicorn": "^44.0.2",
"fs-extra": "^10.0.0",
"husky": "^8.0.1",
"is-ci": "^3.0.0",
"jasmine-core": "^4.5.0",
"jest": "^29.3.1",
"jest": "^29.2.2",
"karma": "^6.3.4",
"karma-chrome-launcher": "^3.1.0",
"karma-cli": "^2.0.0",
"karma-jasmine": "^5.1.0",
"karma-spec-reporter": "^0.0.36",
"karma-spec-reporter": "^0.0.34",
"karma-typescript": "5.5.3",
"karma-typescript-es6-transform": "5.5.3",
"less": "^4.1.1",
"lodash": "^4.17.21",
"npm-run-all": "^4.1.5",
"postcss": "^8.4.20",
"postcss-less": "^6.0.0",
"prettier": "^2.8.0",
"postcss": "^8.3.6",
"prettier": "^2.4.0",
"pretty-quick": "^3.1.1",
"rimraf": "^3.0.2",
"rollup": "^3.7.4",
"rollup": "^3.2.5",
"rollup-plugin-auto-external": "^2.0.0",
"rollup-plugin-filesize": "^9.1.1",
"rollup-plugin-postcss": "^4.0.1",
"rollup-plugin-progress": "^1.1.2",
"run-shared-scripts": "^1.1.5",
"rollup-plugin-terser": "^7.0.2",
"semantic-release": "^19.0.5",
"sinon": "^15.0.1",
"stylelint": "^14.15.0",
"stylelint-config-prettier": "^9.0.4",
"sinon": "^14.0.1",
"stylelint": "^14.14.0",
"stylelint-config-prettier": "^9.0.3",
"stylelint-config-rational-order": "^0.1.2",
"stylelint-config-standard": "^29.0.0",
"stylelint-declaration-block-no-ignored-properties": "^2.4.0",
@ -159,9 +135,6 @@
"ts-node": "^10.2.1",
"tslib": "^2.4.1",
"turbo": "^1.6.3",
"typescript": "^4.9.3"
},
"devDependencies": {
"@rollup/plugin-terser": "^0.2.0"
"typescript": "^4.4.3"
}
}

@ -1,21 +0,0 @@
MIT License
Copyright (c) 2021-2023 Alipay.inc
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.

@ -1,136 +0,0 @@
# @antv/x6-angular-shape
## 渲染节点
我们提供了一个独立的包 `@antv/x6-angular-shape` 以支持将 Angular 的组件/模板作为节点进行渲染。
### Component 渲染
```ts
@Component({
selector: 'app-node',
templateUrl: './node.component.html',
styleUrls: ['./node.component.scss'],
})
export class NodeComponent implements AfterViewInit, OnChanges {
@Input() value: string;
}
```
```ts
import { register } from "@antv/x6-angular-shape";
@Component({
selector: 'app-root',
templateUrl: './app.component.html',
styleUrls: ['./app.component.scss'],
})
export class AppComponent implements AfterViewInit {
ngAfterViewInit(): void {
register({
shape: 'custom-angular-component-node',
width: 120,
height: 20,
content: NodeComponent,
injector: this.injector,
});
this.graph.addNode({
shape: 'custom-angular-component-node',
x: 100,
y: 100,
data: {
// Input 的参数必须放在这里
ngArguments: {
value: '糟糕糟糕 Oh my god',
},
},
});
}
}
```
### TemplateRef 渲染
```html
<ng-template #template let-data="ngArguments">
<section class="template-container">
<span class="value">{{ data.value }}</span>
</section>
</ng-template>
```
```ts
import { register } from "@antv/x6-angular-shape";
@Component({
selector: 'app-root',
templateUrl: './app.component.html',
styleUrls: ['./app.component.scss'],
})
export class AppComponent implements AfterViewInit {
@ViewChild('template') template: TemplateRef<{}>;
ngAfterViewInit(): void {
register({
shape: 'custom-angular-template-node',
width: 120,
height: 20,
content: this.template,
injector: this.injector,
});
this.graph.addNode({
shape: 'custom-angular-template-node',
x: 100,
y: 100,
data: {
ngArguments: {
value: '魔法怎么失灵啦',
},
},
});
}
}
```
## 更新节点
无论是使用 Component 还是 TemplateRef, 都是一样的更新方式.
```ts
node.setData({
ngArguments: {
value: '晚风中闪过 几帧从前啊',
},
});
```
## 有 demo 吗?
有的, 因为X6渲染节点部分与框架是解耦的. 因此 `x6-angular-shape` 包并非是直接在源代码里改的, 而是在一个单独的Angular环境中开发的. 该 demo 还提供了多种节点类型的性能测试, 详情请参考[Eve-Sama/x6-angular-shape](https://github.com/Eve-Sama/x6-angular-shape)、[X6与G6的性能对比, 以及X6多节点类型下的FPS临界点讨论](https://github.com/antvis/X6/issues/3266)
## FAQ
### 为什么输入属性不能直接放在 data 中而需要放在 ngArguments 中? 且为什么不叫 ngInput?
因为并非所有 `node.data` 中的属性都是输入属性, 所以遍历 `data` 中的所有属性进行赋值是不合适的. 至于为什么叫 `ngArguments` 主要是有两点考虑.
- 1.x版本中已经这么用了, 沿用该API可以降低用户升级成本
- `Input` 的概念其实是来自 `Component`, 而 `TemplateRef` 中是 `context`, 在二者的基础上抽象一个 `Arguments` 的概念更通用些
### 2.x版本的 x6-angular-shape 相比较1.x版本有什么新特性吗?
实现思路其实和之前是差不多的. 但是确实有几个点值得一提.
#### demo更聚焦
1.x版本的 demo 除了渲染组件外, 还写了连线、清除等一系列案例. 看似扩展, 实则眼花缭乱. 作为 `x6-angular-shape`的 demo, 2.x版本更加聚焦, 更加聚焦于shape的使用与性能测试等, 与插件无关的内容请查看X6官网.
#### 功能更稳定
在1.x版本中, 虽然实现了功能, 但是使用场景的思考不够全面. 比如`ngArguments`的变化, 对 `TemplateRef`的场景并不生效. 虽然对`Component`生效但是无法触发`ngOnChanges`. 而在新版本中, 这些问题都将不复存在.
### 版本要求
你的Angular版本至少在14及以上才可以. 14以下需要用 hack 的方式实现一些特性, 比较麻烦. 暂时不提供, 如有需要可提issue, 我再专门介绍下如何实现.

@ -1,65 +0,0 @@
{
"name": "@antv/x6-angular-shape",
"version": "2.0.0",
"description": "X6 shape for rendering angular components.",
"main": "lib/index.js",
"module": "es/index.js",
"unpkg": "dist/index.js",
"jsdelivr": "dist/index.js",
"types": "lib/index.d.ts",
"files": [
"dist",
"es",
"lib"
],
"keywords": [
"shape",
"angular",
"render",
"x6",
"antv"
],
"scripts": {
"clean:turbo": "rss",
"clean:build": "rss",
"clean:coverage": "rss",
"clean": "rss",
"build:esm": "rss",
"build:cjs": "rss",
"build:umd": "rss",
"build:dev": "rss",
"build:watch": "rss",
"build:watch:esm": "rss",
"build:watch:cjs": "rss",
"build": "rss",
"prebuild": "rss",
"test": "rss",
"coveralls": "rss",
"pretest": "rss"
},
"peerDependencies": {
"@antv/x6": "^2.x",
"@angular/core": ">= 14"
},
"devDependencies": {
"@antv/x6": "^2.x"
},
"author": {
"name": "Eve-Sama",
"email": "948832626@qq.com"
},
"license": "MIT",
"homepage": "https://x6.antv.antgroup.com/tutorial/intermediate/angular",
"bugs": {
"url": "https://github.com/antvis/x6/issues"
},
"repository": {
"type": "git",
"url": "https://github.com/antvis/x6.git",
"directory": "packages/x6-angular-shape"
},
"publishConfig": {
"access": "public",
"registry": "https://registry.npmjs.org"
}
}

@ -1,3 +0,0 @@
export * from './node'
export * from './view'
export * from './registry'

@ -1,102 +0,0 @@
import { Node, Markup, ObjectExt } from '@antv/x6'
export class AngularShape<
Properties extends AngularShape.Properties = AngularShape.Properties,
> extends Node<Properties> {}
export namespace AngularShape {
export type Primer =
| 'rect'
| 'circle'
| 'path'
| 'ellipse'
| 'polygon'
| 'polyline'
export interface Properties extends Node.Properties {
primer?: Primer
}
}
export namespace AngularShape {
function getMarkup(primer?: Primer) {
const markup: Markup.JSONMarkup[] = []
const content = Markup.getForeignObjectMarkup()
if (primer) {
markup.push(
...[
{
tagName: primer,
selector: 'body',
},
content,
],
)
} else {
markup.push(content)
}
return markup
}
AngularShape.config<Properties>({
view: 'angular-shape-view',
markup: getMarkup(),
attrs: {
body: {
fill: 'none',
stroke: 'none',
refWidth: '100%',
refHeight: '100%',
},
fo: {
refWidth: '100%',
refHeight: '100%',
},
},
propHooks(metadata: Properties) {
if (metadata.markup == null) {
const primer = metadata.primer
if (primer) {
metadata.markup = getMarkup(primer)
let attrs = {}
switch (primer) {
case 'circle':
attrs = {
refCx: '50%',
refCy: '50%',
refR: '50%',
}
break
case 'ellipse':
attrs = {
refCx: '50%',
refCy: '50%',
refRx: '50%',
refRy: '50%',
}
break
default:
break
}
metadata.attrs = ObjectExt.merge(
{},
{
body: {
refWidth: null,
refHeight: null,
...attrs,
},
},
metadata.attrs || {},
)
}
}
return metadata
},
})
Node.registry.register('angular-shape', AngularShape, true)
}

@ -1,32 +0,0 @@
import { Injector, TemplateRef, Type } from '@angular/core'
import { Graph, Node } from '@antv/x6'
export type Content = TemplateRef<any> | Type<any>
export type AngularShapeConfig = Node.Properties & {
shape: string
injector: Injector
content: Content
}
export const registerInfo: Map<
string,
{
injector: Injector
content: Content
}
> = new Map()
export function register(config: AngularShapeConfig) {
const { shape, injector, content, ...others } = config
registerInfo.set(shape, { injector, content })
Graph.registerNode(
shape,
{
inherit: 'angular-shape',
...others,
},
true,
)
}

@ -1,124 +0,0 @@
import {
ComponentRef,
EmbeddedViewRef,
TemplateRef,
ViewContainerRef,
} from '@angular/core'
import { Dom, NodeView } from '@antv/x6'
import { AngularShape } from './node'
import { Content, registerInfo } from './registry'
export class AngularShapeView extends NodeView<AngularShape> {
getNodeContainer(): HTMLDivElement {
return this.selectors && (this.selectors.foContent as HTMLDivElement)
}
override confirmUpdate(flag: number): number {
const ret = super.confirmUpdate(flag)
return this.handleAction(ret, AngularShapeView.action, () =>
this.renderAngularContent(),
)
}
private getNgArguments(): Record<string, any> {
const input = (this.cell.data?.ngArguments as Record<string, any>) || {}
return input
}
/** 当执行 node.setData() 时需要对实例设置新的输入值 */
private setInstanceInput(
content: Content,
ref: EmbeddedViewRef<any> | ComponentRef<any>,
): void {
const ngArguments = this.getNgArguments()
if (content instanceof TemplateRef) {
const embeddedViewRef = ref as EmbeddedViewRef<any>
embeddedViewRef.context = { ngArguments }
} else {
const componentRef = ref as ComponentRef<any>
Object.keys(ngArguments).forEach((v) =>
componentRef.setInput(v, ngArguments[v]),
)
componentRef.changeDetectorRef.detectChanges()
}
}
protected renderAngularContent(): void {
this.unmountAngularContent()
const container = this.getNodeContainer()
if (container) {
const node = this.cell
const { injector, content } = registerInfo.get(node.shape)!
const viewContainerRef = injector.get(ViewContainerRef)
if (content instanceof TemplateRef) {
const ngArguments = this.getNgArguments()
const embeddedViewRef = viewContainerRef.createEmbeddedView(content, {
ngArguments,
})
embeddedViewRef.rootNodes.forEach((node) => container.appendChild(node))
embeddedViewRef.detectChanges()
node.on('change:data', () =>
this.setInstanceInput(content, embeddedViewRef),
)
} else {
const componentRef = viewContainerRef.createComponent(content)
const insertNode = (componentRef.hostView as EmbeddedViewRef<any>)
.rootNodes[0] as HTMLElement
container.appendChild(insertNode)
this.setInstanceInput(content, componentRef)
node.on('change:data', () =>
this.setInstanceInput(content, componentRef),
)
}
}
}
protected unmountAngularContent(): HTMLDivElement {
const container = this.getNodeContainer()
container.innerHTML = ''
return container
}
override onMouseDown(e: Dom.MouseDownEvent, x: number, y: number) {
const target = e.target as Element
const tagName = target.tagName.toLowerCase()
if (tagName === 'input') {
const type = target.getAttribute('type')
if (
type == null ||
[
'text',
'password',
'number',
'email',
'search',
'tel',
'url',
].includes(type)
) {
return
}
}
super.onMouseDown(e, x, y)
}
override unmount(): this {
this.unmountAngularContent()
super.unmount()
return this
}
}
export namespace AngularShapeView {
export const action = 'angular' as any
AngularShapeView.config({
bootstrap: [action],
actions: {
component: action,
},
})
NodeView.registry.register('angular-shape-view', AngularShapeView, true)
}

@ -1,43 +1,177 @@
## @antv/x6-common [2.0.10](https://github.com/antvis/x6/compare/@antv/x6-common@2.0.9...@antv/x6-common@2.0.10) (2023-02-24)
# @antv/x6-common [1.1.0](https://github.com/antvis/x6/compare/@antv/x6-common@1.0.1...@antv/x6-common@1.1.0) (2022-11-05)
### Features
* sync some commit from v1 ([#2851](https://github.com/antvis/x6/issues/2851)) ([a772025](https://github.com/antvis/x6/commit/a7720251ff42f2892bff9c3cd5159932322362b1))
## @antv/x6-common [1.0.1](https://github.com/antvis/x6/compare/@antv/x6-common@1.0.0...@antv/x6-common@1.0.1) (2022-11-05)
### chore
* bump to 2.0 ([04cd9de](https://github.com/antvis/x6/commit/04cd9de505bd92a70f33dbc0cfc75b4f9b8126c1))
### BREAKING CHANGES
* bump to 2.0
# @antv/x6-common 1.0.0 (2022-11-05)
### Bug Fixes
* add textLength & lengthAdjust to CASE_SENSITIVE_ATTR ([#3281](https://github.com/antvis/x6/issues/3281)) ([76fb1ac](https://github.com/antvis/x6/commit/76fb1acf74b0f1c308f7c824d02c12244b7ac8f3))
* force bump to 2.0 ([ae7ad05](https://github.com/antvis/x6/commit/ae7ad05d9caddc1056afa17549bda74209cedfc0))
## @antv/x6-common [2.0.8](https://github.com/antvis/x6/compare/@antv/x6-common@2.0.7...@antv/x6-common@2.0.8) (2023-02-18)
### chore
* bump to 2.0 ([94af7fa](https://github.com/antvis/x6/commit/94af7fa7ec96e3417db9aa5d245751507ae2671e))
* bump to 2.0 ([ecffe1a](https://github.com/antvis/x6/commit/ecffe1a2a8bcf5538f027c3c54acaefc50215023))
* bump to 2.0 ([0e258d0](https://github.com/antvis/x6/commit/0e258d0704b444103410a565fe033dae76426ad4))
* force bump to 2.0.0 ([0cab334](https://github.com/antvis/x6/commit/0cab334e4b72a4df33a371c37dfbeff8dc0ae231))
* force release 2.0-beta ([af8c588](https://github.com/antvis/x6/commit/af8c5887b3de721f125da6d71e40c3ec76d0f660))
* release beta ([b5f3cfa](https://github.com/antvis/x6/commit/b5f3cfa2042f5196a995a38a8f41f140cabdce57))
### Features
* ✨ add css method for dom ([#1959](https://github.com/antvis/x6/issues/1959)) ([e8fbcd8](https://github.com/antvis/x6/commit/e8fbcd83fd07b5d2df0abe020fc8e2481332c1b2))
* ✨ add dom data methods ([#1969](https://github.com/antvis/x6/issues/1969)) ([d1eb01c](https://github.com/antvis/x6/commit/d1eb01c491b5509686d0affa8f84fc6438673d80))
* ✨ add dom event to replace jquery event ([#1929](https://github.com/antvis/x6/issues/1929)) ([68c143b](https://github.com/antvis/x6/commit/68c143babf20f84ab7b76aada1794131c49860b2))
* ✨ add events module in common ([#1932](https://github.com/antvis/x6/issues/1932)) ([c1d0fc1](https://github.com/antvis/x6/commit/c1d0fc188e62a8e420ff03512f38c11c5c50a9ba))
* ✨ add minimap plugin ([6cdecbb](https://github.com/antvis/x6/commit/6cdecbbba9a4db1f67189e23fb89f2a7ba2af99e))
* ✨ add panning and mousewheel module ([#2243](https://github.com/antvis/x6/issues/2243)) ([55d36e4](https://github.com/antvis/x6/commit/55d36e46808a4c79b086d7798bce396d5211a1dc))
* ✨ add selection plugin ([#2742](https://github.com/antvis/x6/issues/2742)) ([50a5dc7](https://github.com/antvis/x6/commit/50a5dc7cd8c2e39a1f8bf8359a0eb189dda8cb86))
* ✨ add version.ts ([#1981](https://github.com/antvis/x6/issues/1981)) ([aee3666](https://github.com/antvis/x6/commit/aee3666da25025b7ca284134521d6c6cd7f8edbc))
* ✨ export common and geometry in x6 package ([#2820](https://github.com/antvis/x6/issues/2820)) ([df28200](https://github.com/antvis/x6/commit/df282000cc5e17521147c77c210e172c444c9938))
* ✨ improve auto-resize feature ([40d5335](https://github.com/antvis/x6/commit/40d53355cedc0bbbeb1e26948b67254dc6a40d85))
* ✨ improve scroller plugin ([#2667](https://github.com/antvis/x6/issues/2667)) ([25b238f](https://github.com/antvis/x6/commit/25b238fd0bd289c0175f0cb1282233cb3badbc20))
* ✨ init x6-core repo ([#1954](https://github.com/antvis/x6/issues/1954)) ([d7cfb6a](https://github.com/antvis/x6/commit/d7cfb6af19fc021ad197a8bed187d927a81d7dfa))
* ✨ put animation in x6-common ([#2411](https://github.com/antvis/x6/issues/2411)) ([f1c80a8](https://github.com/antvis/x6/commit/f1c80a8cd75efe1def32168b6acff90ece5723ba))
* ✨ remove jquery deps in x6-core ([#1971](https://github.com/antvis/x6/issues/1971)) ([38c6fd6](https://github.com/antvis/x6/commit/38c6fd69922b3db7eb938f55a8c29f8226edbed1))
* add scheduler for render nodes to improve performance ([#2044](https://github.com/antvis/x6/issues/2044)) ([57a50a9](https://github.com/antvis/x6/commit/57a50a9dec2b9dbe04f51972a1eebd7a98c116e0))
* add scroller plugin ([#2580](https://github.com/antvis/x6/issues/2580)) ([5e0e2ac](https://github.com/antvis/x6/commit/5e0e2acde7d7e259ea27d001983e950878d0ecc8))
* support mouseenter and mouseleave event ([#2559](https://github.com/antvis/x6/issues/2559)) ([ecfd426](https://github.com/antvis/x6/commit/ecfd4263b1266a128bf8651c4dd745ff8ab038b3))
* support turbo ([1da55bf](https://github.com/antvis/x6/commit/1da55bfda73edaa96515998b5766e9ed5f241ee9))
* sync code from master ([#2004](https://github.com/antvis/x6/issues/2004)) ([c681405](https://github.com/antvis/x6/commit/c68140504bd21f654870f3d2fc1ad2f16f1113c8)), closes [#1974](https://github.com/antvis/x6/issues/1974) [#1977](https://github.com/antvis/x6/issues/1977) [#1985](https://github.com/antvis/x6/issues/1985) [#1988](https://github.com/antvis/x6/issues/1988) [#1991](https://github.com/antvis/x6/issues/1991) [#1989](https://github.com/antvis/x6/issues/1989)
### Performance Improvements
* ⚡️ optimize breakText for a high performance version ([#2242](https://github.com/antvis/x6/issues/2242)) ([0aced58](https://github.com/antvis/x6/commit/0aced58056d908ec092bca1889b5ef367a94fe68))
* ⚡️ repalce getTransformToElement and getBBox to improve performance ([#2177](https://github.com/antvis/x6/issues/2177)) ([1436586](https://github.com/antvis/x6/commit/1436586f85cc2e2f6ec71548f6d6c232be793154))
### BREAKING CHANGES
* bump to 2.0
* bump to 2.0
* force bump to 2.0
* bump to 2.0
* force bump to 2.0.0
* force release 2.0-beta
* force release 2.0-beta
* 2.0-beta
# @antv/x6-common 1.0.0 (2022-11-04)
### Features
* ✨ add css method for dom ([#1959](https://github.com/antvis/x6/issues/1959)) ([e8fbcd8](https://github.com/antvis/x6/commit/e8fbcd83fd07b5d2df0abe020fc8e2481332c1b2))
* ✨ add dom data methods ([#1969](https://github.com/antvis/x6/issues/1969)) ([d1eb01c](https://github.com/antvis/x6/commit/d1eb01c491b5509686d0affa8f84fc6438673d80))
* ✨ add dom event to replace jquery event ([#1929](https://github.com/antvis/x6/issues/1929)) ([68c143b](https://github.com/antvis/x6/commit/68c143babf20f84ab7b76aada1794131c49860b2))
* ✨ add events module in common ([#1932](https://github.com/antvis/x6/issues/1932)) ([c1d0fc1](https://github.com/antvis/x6/commit/c1d0fc188e62a8e420ff03512f38c11c5c50a9ba))
* ✨ add minimap plugin ([6cdecbb](https://github.com/antvis/x6/commit/6cdecbbba9a4db1f67189e23fb89f2a7ba2af99e))
* ✨ add panning and mousewheel module ([#2243](https://github.com/antvis/x6/issues/2243)) ([55d36e4](https://github.com/antvis/x6/commit/55d36e46808a4c79b086d7798bce396d5211a1dc))
* ✨ add selection plugin ([#2742](https://github.com/antvis/x6/issues/2742)) ([50a5dc7](https://github.com/antvis/x6/commit/50a5dc7cd8c2e39a1f8bf8359a0eb189dda8cb86))
* ✨ add version.ts ([#1981](https://github.com/antvis/x6/issues/1981)) ([aee3666](https://github.com/antvis/x6/commit/aee3666da25025b7ca284134521d6c6cd7f8edbc))
* ✨ export common and geometry in x6 package ([#2820](https://github.com/antvis/x6/issues/2820)) ([df28200](https://github.com/antvis/x6/commit/df282000cc5e17521147c77c210e172c444c9938))
* ✨ improve auto-resize feature ([40d5335](https://github.com/antvis/x6/commit/40d53355cedc0bbbeb1e26948b67254dc6a40d85))
* ✨ improve scroller plugin ([#2667](https://github.com/antvis/x6/issues/2667)) ([25b238f](https://github.com/antvis/x6/commit/25b238fd0bd289c0175f0cb1282233cb3badbc20))
* ✨ init x6-core repo ([#1954](https://github.com/antvis/x6/issues/1954)) ([d7cfb6a](https://github.com/antvis/x6/commit/d7cfb6af19fc021ad197a8bed187d927a81d7dfa))
* ✨ put animation in x6-common ([#2411](https://github.com/antvis/x6/issues/2411)) ([f1c80a8](https://github.com/antvis/x6/commit/f1c80a8cd75efe1def32168b6acff90ece5723ba))
* ✨ remove jquery deps in x6-core ([#1971](https://github.com/antvis/x6/issues/1971)) ([38c6fd6](https://github.com/antvis/x6/commit/38c6fd69922b3db7eb938f55a8c29f8226edbed1))
* add scheduler for render nodes to improve performance ([#2044](https://github.com/antvis/x6/issues/2044)) ([57a50a9](https://github.com/antvis/x6/commit/57a50a9dec2b9dbe04f51972a1eebd7a98c116e0))
* add scroller plugin ([#2580](https://github.com/antvis/x6/issues/2580)) ([5e0e2ac](https://github.com/antvis/x6/commit/5e0e2acde7d7e259ea27d001983e950878d0ecc8))
* support mouseenter and mouseleave event ([#2559](https://github.com/antvis/x6/issues/2559)) ([ecfd426](https://github.com/antvis/x6/commit/ecfd4263b1266a128bf8651c4dd745ff8ab038b3))
* support turbo ([1da55bf](https://github.com/antvis/x6/commit/1da55bfda73edaa96515998b5766e9ed5f241ee9))
* sync code from master ([#2004](https://github.com/antvis/x6/issues/2004)) ([c681405](https://github.com/antvis/x6/commit/c68140504bd21f654870f3d2fc1ad2f16f1113c8)), closes [#1974](https://github.com/antvis/x6/issues/1974) [#1977](https://github.com/antvis/x6/issues/1977) [#1985](https://github.com/antvis/x6/issues/1985) [#1988](https://github.com/antvis/x6/issues/1988) [#1991](https://github.com/antvis/x6/issues/1991) [#1989](https://github.com/antvis/x6/issues/1989)
### Performance Improvements
* ⚡️ optimize breakText for a high performance version ([#2242](https://github.com/antvis/x6/issues/2242)) ([0aced58](https://github.com/antvis/x6/commit/0aced58056d908ec092bca1889b5ef367a94fe68))
* ⚡️ repalce getTransformToElement and getBBox to improve performance ([#2177](https://github.com/antvis/x6/issues/2177)) ([1436586](https://github.com/antvis/x6/commit/1436586f85cc2e2f6ec71548f6d6c232be793154))
### BREAKING CHANGES
* force bump to 2.0
* bump to 2.0
* force bump to 2.0.0
* force release 2.0-beta
* force release 2.0-beta
* 2.0-beta
# @antv/x6-common [2.0.0](https://github.com/antvis/x6/compare/@antv/x6-common@1.0.0...@antv/x6-common@2.0.0) (2022-11-04)
### Bug Fixes
* fix typo for dom event handlers ([#3255](https://github.com/antvis/x6/issues/3255)) ([9b4fa86](https://github.com/antvis/x6/commit/9b4fa86daa587fe8818f3615bc1e40738a0f2319))
* force bump to 2.0 ([ae7ad05](https://github.com/antvis/x6/commit/ae7ad05d9caddc1056afa17549bda74209cedfc0))
## @antv/x6-common [2.0.6](https://github.com/antvis/x6/compare/@antv/x6-common@2.0.5...@antv/x6-common@2.0.6) (2023-01-31)
### chore
* bump to 2.0 ([0e258d0](https://github.com/antvis/x6/commit/0e258d0704b444103410a565fe033dae76426ad4))
* force bump to 2.0.0 ([0cab334](https://github.com/antvis/x6/commit/0cab334e4b72a4df33a371c37dfbeff8dc0ae231))
### BREAKING CHANGES
* force bump to 2.0
* bump to 2.0
* force bump to 2.0.0
# @antv/x6-common [2.0.0](https://github.com/antvis/x6/compare/@antv/x6-common@1.0.0...@antv/x6-common@2.0.0) (2022-11-04)
### Bug Fixes
* fix index error for priorityQueue ([#3179](https://github.com/antvis/x6/issues/3179)) ([d64150b](https://github.com/antvis/x6/commit/d64150bfadf10fe21f44734a0267261260b8c53b))
* force bump to 2.0 ([ae7ad05](https://github.com/antvis/x6/commit/ae7ad05d9caddc1056afa17549bda74209cedfc0))
## @antv/x6-common [2.0.5](https://github.com/antvis/x6/compare/@antv/x6-common@2.0.4...@antv/x6-common@2.0.5) (2023-01-18)
### chore
* bump to 2.0 ([0e258d0](https://github.com/antvis/x6/commit/0e258d0704b444103410a565fe033dae76426ad4))
* force bump to 2.0.0 ([0cab334](https://github.com/antvis/x6/commit/0cab334e4b72a4df33a371c37dfbeff8dc0ae231))
### BREAKING CHANGES
* force bump to 2.0
* bump to 2.0
* force bump to 2.0.0
# @antv/x6-common [2.0.0](https://github.com/antvis/x6/compare/@antv/x6-common@1.0.0...@antv/x6-common@2.0.0) (2022-11-04)
### Bug Fixes
* optimize css loader ([#3156](https://github.com/antvis/x6/issues/3156)) ([9c48ad8](https://github.com/antvis/x6/commit/9c48ad8dfc99e623a57855295d07c35be5483073))
## @antv/x6-common [2.0.4](https://github.com/antvis/x6/compare/@antv/x6-common@2.0.3...@antv/x6-common@2.0.4) (2022-12-20)
* force bump to 2.0 ([ae7ad05](https://github.com/antvis/x6/commit/ae7ad05d9caddc1056afa17549bda74209cedfc0))
### Bug Fixes
### chore
* fix window incompatibility problem ([#3070](https://github.com/antvis/x6/issues/3070)) ([d8e1e63](https://github.com/antvis/x6/commit/d8e1e637d8027b9494cd26efc87815d74bd51366))
## @antv/x6-common [2.0.1](https://github.com/antvis/x6/compare/@antv/x6-common@2.0.0...@antv/x6-common@2.0.1) (2022-11-25)
* bump to 2.0 ([0e258d0](https://github.com/antvis/x6/commit/0e258d0704b444103410a565fe033dae76426ad4))
* force bump to 2.0.0 ([0cab334](https://github.com/antvis/x6/commit/0cab334e4b72a4df33a371c37dfbeff8dc0ae231))
### Bug Fixes
### BREAKING CHANGES
* npm version ([cb0cfde](https://github.com/antvis/x6/commit/cb0cfdeb4dbe8858569e6899db08ccb9ab8ba4e7))
## @antv/x6-common [2.0.1](https://github.com/antvis/x6/compare/@antv/x6-common@2.0.0...@antv/x6-common@2.0.1) (2022-11-24)
* force bump to 2.0
* bump to 2.0
* force bump to 2.0.0

@ -1,6 +1,6 @@
MIT License
Copyright (c) 2021-2023 Alipay.inc
Copyright (c) 2021-2022 Alipay.inc
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal

@ -1,6 +1,6 @@
{
"name": "@antv/x6-common",
"version": "2.0.10",
"version": "2.0.0",
"description": "Basic toolkit for X6",
"main": "lib/index.js",
"module": "es/index.js",
@ -48,13 +48,13 @@
"email": "vectorse@126.com"
},
"license": "MIT",
"homepage": "https://x6.antv.antgroup.com",
"homepage": "https://github.com/antvis/x6",
"bugs": {
"url": "https://github.com/antvis/x6/issues"
},
"repository": {
"type": "git",
"url": "https://github.com/antvis/x6.git",
"url": "ssh://git@github.com/antvis/x6.git",
"directory": "packages/x6-common"
},
"publishConfig": {

@ -0,0 +1,25 @@
import sinon from 'sinon'
import { Dom } from '../../dom'
describe('af', () => {
describe('#requestAnimationFrame', () => {
it('should call the callback', (done) => {
Dom.requestAnimationFrame(() => {
expect(1).toEqual(1)
done()
})
})
})
describe('#cancelAnimationFrame', () => {
it('requestAnimationFrame can be cancel', (done) => {
const spy = sinon.spy()
const id = Dom.requestAnimationFrame(spy)
Dom.cancelAnimationFrame(id)
setTimeout(() => {
expect(spy.callCount).toEqual(0)
done()
}, 100)
})
})
})

@ -151,4 +151,72 @@ describe('FunctionExt', () => {
expect(spy.calledWith(1, '2', true, obj, reg, arr, 'more')).toBeTruthy()
})
})
describe('#cacher', () => {
it('shoule cache function results with same args', () => {
let counter = 0
const raw = (a: number, b: number) => {
counter += 1
return a + b
}
const fn = FunctionExt.cacher(raw)
const ret1 = fn(1, 2)
expect(counter).toBe(1)
const ret2 = fn(1, 2)
expect(counter).toBe(1)
expect(ret1).toBe(ret2)
fn(2, 3)
expect(counter).toBe(2)
})
it('shoule remove cache when reach the max cache count', () => {
let counter = 0
const raw = (a: number, b: number) => {
counter += 1
return a + b
}
const fn = FunctionExt.cacher(raw)
fn(1, 2)
expect(counter).toBe(1)
for (let i = 0; i < 1000; i += 1) {
fn(i, i)
}
fn(1, 2)
expect(counter).toBe(1002)
})
it('shoule cache function with specified context', () => {
const ctx = {}
const spy = sinon.spy()
const fn = FunctionExt.cacher(spy, ctx)
fn()
expect(spy.calledOn(ctx)).toBeTruthy()
})
it('shoule return result processed by post processor', () => {
let counter = 0
const raw = (a: number, b: number) => {
counter += 1
return a + b
}
const processor = (v: number, hasCache: boolean) => {
return hasCache ? -v : v
}
const fn = FunctionExt.cacher(raw, {}, processor)
const ret1 = fn(1, 2)
const ret2 = fn(1, 2)
expect(counter).toBe(1)
expect(ret1).toBe(3)
expect(ret2).toBe(-3)
})
})
})

@ -0,0 +1,92 @@
import { JSONArray, JSONExt, JSONObject, JSONPrimitive } from '../../json'
describe('JSONExt', () => {
describe('isPrimitive()', () => {
it('should return `true` if the value is a primitive', () => {
expect(JSONExt.isPrimitive(null)).toEqual(true)
expect(JSONExt.isPrimitive(false)).toEqual(true)
expect(JSONExt.isPrimitive(true)).toEqual(true)
expect(JSONExt.isPrimitive(1)).toEqual(true)
expect(JSONExt.isPrimitive('1')).toEqual(true)
})
it('should return `false` if the value is not a primitive', () => {
expect(JSONExt.isPrimitive([])).toEqual(false)
expect(JSONExt.isPrimitive({})).toEqual(false)
})
})
describe('isArray()', () => {
it('should test whether a JSON value is an array', () => {
expect(JSONExt.isArray([])).toEqual(true)
expect(JSONExt.isArray(null)).toEqual(false)
expect(JSONExt.isArray(1)).toEqual(false)
})
})
describe('isObject()', () => {
it('should test whether a JSON value is an object', () => {
expect(JSONExt.isObject({ a: 1 })).toEqual(true)
expect(JSONExt.isObject({})).toEqual(true)
expect(JSONExt.isObject([])).toEqual(false)
expect(JSONExt.isObject(1)).toEqual(false)
})
})
describe('deepEqual()', () => {
it('should compare two JSON values for deep equality', () => {
expect(JSONExt.deepEqual([], [])).toEqual(true)
expect(JSONExt.deepEqual([1], [1])).toEqual(true)
expect(JSONExt.deepEqual({}, {})).toEqual(true)
expect(JSONExt.deepEqual({ a: [] }, { a: [] })).toEqual(true)
expect(JSONExt.deepEqual({ a: { b: null } }, { a: { b: null } })).toEqual(
true,
)
expect(JSONExt.deepEqual({ a: '1' }, { a: '1' })).toEqual(true)
expect(JSONExt.deepEqual({ a: { b: null } }, { a: { b: '1' } })).toEqual(
false,
)
expect(JSONExt.deepEqual({ a: [] }, { a: [1] })).toEqual(false)
expect(JSONExt.deepEqual([1], [1, 2])).toEqual(false)
expect(JSONExt.deepEqual(null, [1, 2])).toEqual(false)
expect(JSONExt.deepEqual([1], {})).toEqual(false)
expect(JSONExt.deepEqual([1], [2])).toEqual(false)
expect(JSONExt.deepEqual({}, { a: 1 })).toEqual(false)
expect(JSONExt.deepEqual({ b: 1 }, { a: 1 })).toEqual(false)
})
})
describe('deepCopy()', () => {
it('should deep copy an object', () => {
const v1: JSONPrimitive = null
const v2: JSONPrimitive = true
const v3: JSONPrimitive = false
const v4: JSONPrimitive = 'foo'
const v5: JSONPrimitive = 42
const v6: JSONArray = [1, 2, 3, [4, 5, 6], { a: 12, b: [4, 5] }, false]
const v7: JSONObject = { a: false, b: [null, [1, 2]], c: { a: 1 } }
const r1 = JSONExt.deepCopy(v1)
const r2 = JSONExt.deepCopy(v2)
const r3 = JSONExt.deepCopy(v3)
const r4 = JSONExt.deepCopy(v4)
const r5 = JSONExt.deepCopy(v5)
const r6 = JSONExt.deepCopy(v6)
const r7 = JSONExt.deepCopy(v7)
expect(v1).toEqual(r1)
expect(v2).toEqual(r2)
expect(v3).toEqual(r3)
expect(v4).toEqual(r4)
expect(v5).toEqual(r5)
expect(v6).toEqual(r6)
expect(v7).toEqual(r7)
expect(v6).toEqual(r6)
expect(v6[3]).not.toBe(r6[3])
expect(v6[4]).not.toBe(r6[4])
expect((v6[4] as JSONObject).b).not.toBe((r6[4] as JSONObject).b)
expect(v7).toEqual(r7)
expect(v7.b).not.toBe(r7.b)
expect((v7.b as JSONArray)[1]).not.toBe((r7.b as JSONArray)[1])
expect(v7.c).not.toBe(r7.c)
})
})
})

@ -45,7 +45,7 @@ export class PriorityQueue<T> {
*/
insert(priority: number, value: T, id?: string) {
const item: PriorityQueue.DataItem<T> = { priority, value }
const index = this.data.length
const index = this.data.length - 1
if (id) {
item.id = id
this.index[id] = index
@ -96,9 +96,7 @@ export class PriorityQueue<T> {
const data = this.data
const peek = data[0]
const last = data.pop()!
if (peek.id) {
delete this.index[peek.id]
}
delete this.index[data.length]
if (data.length > 0) {
data[0] = last

@ -6,5 +6,5 @@ export {
sortBy,
groupBy,
difference,
max,
max
} from 'lodash-es'

@ -1,5 +1,3 @@
/* eslint-disable no-constructor-return */
import { NumberExt } from '../number'
export class Color {

@ -2,7 +2,6 @@ import { Platform } from '../platform'
interface CssModule {
name: string
loadTimes: number
styleElement: HTMLStyleElement | null
}
@ -11,10 +10,7 @@ const cssModules: CssModule[] = []
export function ensure(name: string, content: string) {
const cssModule = cssModules.find((m) => m.name === name)
if (cssModule) {
cssModule.loadTimes += 1
if (cssModule.loadTimes > 1) {
return
}
return
}
if (!Platform.isApplyingHMR()) {
@ -29,7 +25,6 @@ export function ensure(name: string, content: string) {
cssModules.push({
name,
loadTimes: 1,
styleElement,
})
}
@ -39,13 +34,7 @@ export function clean(name: string) {
const index = cssModules.findIndex((m) => m.name === name)
if (index > -1) {
const cssModule = cssModules[index]
cssModule.loadTimes -= 1
if (cssModule.loadTimes > 0) {
return
}
let styleElement = cssModule.styleElement
let styleElement = cssModules[index].styleElement
if (styleElement && styleElement.parentNode) {
styleElement.parentNode.removeChild(styleElement)
}

@ -0,0 +1,63 @@
export const requestAnimationFrame = (function () {
let raf
const win = window as any
if (win != null) {
raf =
win.requestAnimationFrame ||
win.webkitRequestAnimationFrame ||
win.mozRequestAnimationFrame ||
win.oRequestAnimationFrame ||
win.msRequestAnimationFrame
if (raf != null) {
raf = raf.bind(win)
}
}
if (raf == null) {
let lastTime = 0
raf = (callback: FrameRequestCallback) => {
const currTime = new Date().getTime()
const timeToCall = Math.max(0, 16 - (currTime - lastTime))
const id = setTimeout(() => {
callback(currTime + timeToCall)
}, timeToCall)
lastTime = currTime + timeToCall
return id
}
}
return raf as (callback: FrameRequestCallback) => number
})()
export const cancelAnimationFrame = (function () {
let caf
const win = window as any
if (win != null) {
caf =
win.cancelAnimationFrame ||
win.webkitCancelAnimationFrame ||
win.webkitCancelRequestAnimationFrame ||
win.msCancelAnimationFrame ||
win.msCancelRequestAnimationFrame ||
win.oCancelAnimationFrame ||
win.oCancelRequestAnimationFrame ||
win.mozCancelAnimationFrame ||
win.mozCancelRequestAnimationFrame
if (caf) {
caf = caf.bind(win)
}
}
if (caf == null) {
caf = clearTimeout
}
return caf as (handle: number) => void
})()

@ -6,8 +6,6 @@ export const CASE_SENSITIVE_ATTR = [
'attributeName',
'attributeType',
'repeatCount',
'textLength',
'lengthAdjust',
]
export type Attributes = { [key: string]: string | number | null | undefined }

@ -33,7 +33,7 @@ export function addClass(
}
if (typeof selector === 'string' && elem.nodeType === 1) {
const classes: string[] = selector.match(rnotwhite) || []
const classes = selector.match(rnotwhite) || []
const oldValue = fillSpaces(getClass(elem)).replace(rclass, ' ')
let newValue = classes.reduce((memo, cls) => {
if (memo.indexOf(fillSpaces(cls)) < 0) {
@ -63,7 +63,7 @@ export function removeClass(
}
if ((!selector || typeof selector === 'string') && elem.nodeType === 1) {
const classes: string[] = (selector || '').match(rnotwhite) || []
const classes = (selector || '').match(rnotwhite) || []
const oldValue = fillSpaces(getClass(elem)).replace(rclass, ' ')
let newValue = classes.reduce((memo, cls) => {
const className = fillSpaces(cls)

@ -1,25 +1,26 @@
import { StringExt } from '../string'
const dataset: WeakMap<Element, Record<string, any>> = new WeakMap()
export function getData(elem: Element, name: string) {
const key = StringExt.camelCase(name)
const cache = dataset.get(elem)
if (cache) {
return cache[key]
export function getData(dataset: Record<string, any>, name: string) {
const value = dataset[name] || dataset[StringExt.camelCase(name)]
try {
return JSON.parse(value)
} catch {
return value
}
}
export function setData(elem: Element, name: string, value: any) {
const key = StringExt.camelCase(name)
const cache = dataset.get(elem)
if (cache) {
cache[key] = value
} else {
dataset.set(elem, {
[key]: value,
})
export function setData(
dataset: Record<string, any>,
name: string,
value: any,
) {
let val = value
try {
val = JSON.stringify(val)
} catch (e) {
// paas
}
dataset[StringExt.camelCase(name)] = val
}
export function data(elem: Element): Record<string, any> | undefined
@ -33,17 +34,20 @@ export function data(
) {
if (!name) {
const datas: Record<string, any> = {}
Object.keys(dataset).forEach((key) => {
datas[key] = getData(elem, key)
})
const dataset = (elem as any).dataset
// eslint-disable-next-line
for (const key in dataset) {
datas[key] = getData(dataset, key)
}
return datas
}
if (typeof name === 'string') {
const dataset = (elem as any).dataset
if (value === undefined) {
return getData(elem, name)
return getData(dataset, name)
}
setData(elem, name, value)
setData(dataset, name, value)
return
}

@ -729,7 +729,7 @@ type TypeEventHandlersBase<TDelegateTarget, TData, TCurrentTarget, TTarget> = {
TCurrentTarget,
TTarget
>]?:
| TypeEventHandler<TDelegateTarget, TData, TCurrentTarget, TTarget, string>
| TypeEventHandler<TDelegateTarget, TData, TCurrentTarget, TTarget, TType>
| false
| Record<string, unknown>
}

@ -1,3 +1,4 @@
export * from './af'
export * from './attr'
export * from './elem'
export * from './class'

@ -144,8 +144,8 @@ function calculateDY(
case 'bottom':
dy = -(0.25 * llMaxFont) - rLineHeights
break
case 'top':
default:
case 'top':
dy = 0.8 * flMaxFont
break
}
@ -198,14 +198,7 @@ export function text(
const autoLineHeight = defaultLineHeight === 'auto'
const lineHeight = autoLineHeight ? '1.5em' : defaultLineHeight || '1em'
let needEmptyElem = true
const childs = elem.children
if (childs.length === 1 && childs[0].tagName.toUpperCase() === 'TITLE') {
needEmptyElem = false
}
if (needEmptyElem) {
empty(elem)
}
empty(elem)
attr(elem, {
// Preserve spaces, do not consecutive spaces to get collapsed to one.

@ -1,4 +1,4 @@
export { debounce, throttle } from 'lodash-es'
export { debounce, defer } from 'lodash-es'
type Fn = (...args: any[]) => any
@ -46,3 +46,38 @@ export function call<T extends Fn>(
): ReturnType<T> {
return apply(fn, ctx, args)
}
function repush<T>(array: T[], item: T) {
for (let i = 0, ii = array.length; i < ii; i += 1) {
if (array[i] === item) {
return array.push(array.splice(i, 1)[0])
}
}
}
export function cacher<T extends Fn>(
fn: T,
ctx?: ThisParameterType<T>,
postProcessor?: (v: any, hasCache?: boolean) => any,
): T {
const keys: string[] = []
const cache: { [kry: string]: any } = {}
const f = (...args: Parameters<T>) => {
let hasCache = false
const key = args.join('\u2400')
if (key in cache) {
hasCache = true
repush(keys, key)
} else {
if (keys.length >= 1000) {
delete cache[keys.shift()!]
}
keys.push(key)
cache[key] = apply(fn, ctx || (null as ThisParameterType<T>), args)
}
return postProcessor ? postProcessor(cache[key], hasCache) : cache[key]
}
return f as T
}

@ -8,6 +8,7 @@ export * from './number'
export * from './function'
export * from './platform'
export * from './text'
export * from './json'
export * from './datauri'
export * from './unit'
export * from './dom'

@ -0,0 +1,262 @@
/**
* A type alias for a JSON primitive.
*/
export type JSONPrimitive = boolean | number | string | null | undefined
/**
* A type alias for a JSON value.
*/
export type JSONValue = JSONPrimitive | JSONObject | JSONArray
/**
* A type definition for a JSON object.
*/
export interface JSONObject {
[key: string]: JSONValue
}
/**
* A type definition for a JSON array.
*/
export interface JSONArray extends Array<JSONValue> {}
/**
* A type definition for a readonly JSON object.
*/
export interface ReadonlyJSONObject {
readonly [key: string]: ReadonlyJSONValue
}
/**
* A type definition for a readonly JSON array.
*/
export interface ReadonlyJSONArray extends ReadonlyArray<ReadonlyJSONValue> {}
/**
* A type alias for a readonly JSON value.
*/
export type ReadonlyJSONValue =
| JSONPrimitive
| ReadonlyJSONObject
| ReadonlyJSONArray
/**
* The namespace for JSON-specific functions.
*/
export namespace JSONExt {
/**
* A shared frozen empty JSONObject
*/
export const emptyObject = Object.freeze({}) as ReadonlyJSONObject
/**
* A shared frozen empty JSONArray
*/
export const emptyArray = Object.freeze([]) as ReadonlyJSONArray
/**
* Test whether a JSON value is a primitive.
*
* @param value - The JSON value of interest.
*
* @returns `true` if the value is a primitive,`false` otherwise.
*/
export function isPrimitive(
value: ReadonlyJSONValue,
): value is JSONPrimitive {
return (
value === null ||
value === undefined ||
typeof value === 'boolean' ||
typeof value === 'number' ||
typeof value === 'string'
)
}
/**
* Test whether a JSON value is an array.
*
* @param value - The JSON value of interest.
*
* @returns `true` if the value is a an array, `false` otherwise.
*/
export function isArray(value: JSONValue): value is JSONArray
export function isArray(value: ReadonlyJSONValue): value is ReadonlyJSONArray
export function isArray(value: ReadonlyJSONValue): boolean {
return Array.isArray(value)
}
/**
* Test whether a JSON value is an object.
*
* @param value - The JSON value of interest.
*
* @returns `true` if the value is a an object, `false` otherwise.
*/
export function isObject(value: JSONValue): value is JSONObject
export function isObject(
value: ReadonlyJSONValue,
): value is ReadonlyJSONObject
export function isObject(value: ReadonlyJSONValue): boolean {
return !isPrimitive(value) && !isArray(value)
}
/**
* Compare two JSON values for deep equality.
*
* @param first - The first JSON value of interest.
*
* @param second - The second JSON value of interest.
*
* @returns `true` if the values are equivalent, `false` otherwise.
*/
export function deepEqual(
first: ReadonlyJSONValue,
second: ReadonlyJSONValue,
): boolean {
// Check referential and primitive equality first.
if (first === second) {
return true
}
// If one is a primitive, the `===` check ruled out the other.
if (isPrimitive(first) || isPrimitive(second)) {
return false
}
// Test whether they are arrays.
const a1 = isArray(first)
const a2 = isArray(second)
// Bail if the types are different.
if (a1 !== a2) {
return false
}
// If they are both arrays, compare them.
if (a1 && a2) {
return deepArrayEqual(
first as ReadonlyJSONArray,
second as ReadonlyJSONArray,
)
}
// At this point, they must both be objects.
return deepObjectEqual(
first as ReadonlyJSONObject,
second as ReadonlyJSONObject,
)
}
/**
* Create a deep copy of a JSON value.
*
* @param value - The JSON value to copy.
*
* @returns A deep copy of the given JSON value.
*/
export function deepCopy<T extends ReadonlyJSONValue>(value: T): T {
// Do nothing for primitive values.
if (isPrimitive(value)) {
return value
}
// Deep copy an array.
if (isArray(value)) {
return deepArrayCopy(value)
}
// Deep copy an object.
return deepObjectCopy(value)
}
/**
* Compare two JSON arrays for deep equality.
*/
function deepArrayEqual(
first: ReadonlyJSONArray,
second: ReadonlyJSONArray,
): boolean {
// Check referential equality first.
if (first === second) {
return true
}
// Test the arrays for equal length.
if (first.length !== second.length) {
return false
}
// Compare the values for equality.
for (let i = 0, n = first.length; i < n; i += 1) {
if (!deepEqual(first[i], second[i])) {
return false
}
}
// At this point, the arrays are equal.
return true
}
/**
* Compare two JSON objects for deep equality.
*/
function deepObjectEqual(
first: ReadonlyJSONObject,
second: ReadonlyJSONObject,
): boolean {
// Check referential equality first.
if (first === second) {
return true
}
// Check for the first object's keys in the second object.
// eslint-disable-next-line
for (const key in first) {
if (!(key in second)) {
return false
}
}
// Check for the second object's keys in the first object.
// eslint-disable-next-line
for (const key in second) {
if (!(key in first)) {
return false
}
}
// Compare the values for equality.
// eslint-disable-next-line
for (const key in first) {
if (!deepEqual(first[key], second[key])) {
return false
}
}
// At this point, the objects are equal.
return true
}
/**
* Create a deep copy of a JSON array.
*/
function deepArrayCopy(value: any): any {
const result = new Array<any>(value.length) // eslint-disable-line
for (let i = 0, n = value.length; i < n; i += 1) {
result[i] = deepCopy(value[i])
}
return result
}
/**
* Create a deep copy of a JSON object.
*/
function deepObjectCopy(value: any): any {
const result: any = {}
Object.keys(value).forEach((key) => {
result[key] = deepCopy(value[key])
})
return result
}
}

@ -117,7 +117,6 @@ export function unsetByPath(
return obj
}
// eslint-disable-next-line default-param-last
export function flatten(obj: any, delim = '/', stop?: (val: any) => boolean) {
const ret: { [key: string]: any } = {}

@ -1,10 +1,6 @@
// compatible with NodeList.prototype.forEach() before chrome 51
// https://developer.mozilla.org/en-US/docs/Web/API/NodeList/forEach
if (
typeof window === 'object' &&
window.NodeList &&
!NodeList.prototype.forEach
) {
if (window.NodeList && !NodeList.prototype.forEach) {
NodeList.prototype.forEach = Array.prototype.forEach as any
}

@ -1,4 +1,4 @@
export { uniqueId } from 'lodash-es'
export { template, uniqueId } from 'lodash-es'
export * from './format'
export * from './hashcode'

@ -1,75 +1,27 @@
export type Nilable<T> = T | null | undefined
export interface PointLike {
x: number
y: number
}
export type PointData = [number, number]
export interface Translation {
tx: number
ty: number
}
export interface Rotation {
angle: number
cx?: number
cy?: number
}
export interface Scale {
sx: number
sy: number
}
export interface Size {
width: number
height: number
}
export interface KeyValue<T = any> {
export type Nilable<T> = T | null | undefined
export interface KeyValue<T extends any = any> {
[key: string]: T
}
/**
* A type alias for a JSON primitive.
*/
export type JSONPrimitive = boolean | number | string | null | undefined
/**
* A type alias for a JSON value.
*/
export type JSONValue = JSONPrimitive | JSONObject | JSONArray
/**
* A type definition for a JSON object.
*/
export interface JSONObject {
[key: string]: JSONValue
}
/**
* A type definition for a JSON array.
*/
export interface JSONArray extends Array<JSONValue> {}
/**
* A type definition for a readonly JSON object.
*/
export interface ReadonlyJSONObject {
readonly [key: string]: ReadonlyJSONValue
}
/**
* A type definition for a readonly JSON array.
*/
export interface ReadonlyJSONArray extends ReadonlyArray<ReadonlyJSONValue> {}
/**
* A type alias for a readonly JSON value.
*/
export type ReadonlyJSONValue =
| JSONPrimitive
| ReadonlyJSONObject
| ReadonlyJSONArray

@ -1,12 +1,220 @@
## @antv/x6-geometry [2.0.4](https://github.com/antvis/x6/compare/@antv/x6-geometry@2.0.3...@antv/x6-geometry@2.0.4) (2022-11-29)
## @antv/x6-geometry [1.0.1](https://github.com/antvis/x6/compare/@antv/x6-geometry@1.0.0...@antv/x6-geometry@1.0.1) (2022-11-05)
## @antv/x6-geometry [2.0.3](https://github.com/antvis/x6/compare/@antv/x6-geometry@2.0.2...@antv/x6-geometry@2.0.3) (2022-11-25)
### chore
* bump to 2.0 ([04cd9de](https://github.com/antvis/x6/commit/04cd9de505bd92a70f33dbc0cfc75b4f9b8126c1))
### BREAKING CHANGES
* bump to 2.0
# @antv/x6-geometry 1.0.0 (2022-11-05)
### Bug Fixes
* npm version ([cb0cfde](https://github.com/antvis/x6/commit/cb0cfdeb4dbe8858569e6899db08ccb9ab8ba4e7))
* update dependencies and fix type errors ([#1103](https://github.com/antvis/x6/issues/1103)) ([49d4371](https://github.com/antvis/x6/commit/49d43716ada672e609e4e6d9c6fdca3f494b6f68))
## @antv/x6-geometry [2.0.2](https://github.com/antvis/x6/compare/@antv/x6-geometry@2.0.1...@antv/x6-geometry@2.0.2) (2022-11-25)
## @antv/x6-geometry [2.0.1](https://github.com/antvis/x6/compare/@antv/x6-geometry@2.0.0...@antv/x6-geometry@2.0.1) (2022-11-24)
### chore
* bump to 2.0 ([94af7fa](https://github.com/antvis/x6/commit/94af7fa7ec96e3417db9aa5d245751507ae2671e))
* bump to 2.0 ([ecffe1a](https://github.com/antvis/x6/commit/ecffe1a2a8bcf5538f027c3c54acaefc50215023))
* release beta ([b5f3cfa](https://github.com/antvis/x6/commit/b5f3cfa2042f5196a995a38a8f41f140cabdce57))
### Features
* ✨ add geometry library ([dbba32e](https://github.com/antvis/x6/commit/dbba32eebc4531c2f040646667c7db4a69152350))
* ✨ export common and geometry in x6 package ([#2820](https://github.com/antvis/x6/issues/2820)) ([df28200](https://github.com/antvis/x6/commit/df282000cc5e17521147c77c210e172c444c9938))
* ✨ put animation in x6-common ([#2411](https://github.com/antvis/x6/issues/2411)) ([f1c80a8](https://github.com/antvis/x6/commit/f1c80a8cd75efe1def32168b6acff90ece5723ba))
* add scroller plugin ([#2580](https://github.com/antvis/x6/issues/2580)) ([5e0e2ac](https://github.com/antvis/x6/commit/5e0e2acde7d7e259ea27d001983e950878d0ecc8))
* add some getters ([ff0273d](https://github.com/antvis/x6/commit/ff0273d119afd74b7233649308ba0035c737ca1a))
* equalPoints ([6a45c90](https://github.com/antvis/x6/commit/6a45c9027ab869a05c2f561cb7503078b0117264))
* rotate rectangle ([88a4fec](https://github.com/antvis/x6/commit/88a4fec7d1d3a49b6c1373f0641c8949474d7d83))
* round with default precision ([aef56f7](https://github.com/antvis/x6/commit/aef56f73f0627d620d36d116b74c828fa76c13f2))
* support mouseenter and mouseleave event ([#2559](https://github.com/antvis/x6/issues/2559)) ([ecfd426](https://github.com/antvis/x6/commit/ecfd4263b1266a128bf8651c4dd745ff8ab038b3))
* support turbo ([1da55bf](https://github.com/antvis/x6/commit/1da55bfda73edaa96515998b5766e9ed5f241ee9))
### BREAKING CHANGES
* bump to 2.0
* bump to 2.0
* force release 2.0-beta
* 2.0-beta
# @antv/x6-geometry 1.0.0 (2022-11-04)
### Bug Fixes
* update dependencies and fix type errors ([#1103](https://github.com/antvis/x6/issues/1103)) ([49d4371](https://github.com/antvis/x6/commit/49d43716ada672e609e4e6d9c6fdca3f494b6f68))
### Features
* ✨ add geometry library ([dbba32e](https://github.com/antvis/x6/commit/dbba32eebc4531c2f040646667c7db4a69152350))
* ✨ export common and geometry in x6 package ([#2820](https://github.com/antvis/x6/issues/2820)) ([df28200](https://github.com/antvis/x6/commit/df282000cc5e17521147c77c210e172c444c9938))
* ✨ put animation in x6-common ([#2411](https://github.com/antvis/x6/issues/2411)) ([f1c80a8](https://github.com/antvis/x6/commit/f1c80a8cd75efe1def32168b6acff90ece5723ba))
* add scroller plugin ([#2580](https://github.com/antvis/x6/issues/2580)) ([5e0e2ac](https://github.com/antvis/x6/commit/5e0e2acde7d7e259ea27d001983e950878d0ecc8))
* add some getters ([ff0273d](https://github.com/antvis/x6/commit/ff0273d119afd74b7233649308ba0035c737ca1a))
* equalPoints ([6a45c90](https://github.com/antvis/x6/commit/6a45c9027ab869a05c2f561cb7503078b0117264))
* rotate rectangle ([88a4fec](https://github.com/antvis/x6/commit/88a4fec7d1d3a49b6c1373f0641c8949474d7d83))
* round with default precision ([aef56f7](https://github.com/antvis/x6/commit/aef56f73f0627d620d36d116b74c828fa76c13f2))
* support mouseenter and mouseleave event ([#2559](https://github.com/antvis/x6/issues/2559)) ([ecfd426](https://github.com/antvis/x6/commit/ecfd4263b1266a128bf8651c4dd745ff8ab038b3))
* support turbo ([1da55bf](https://github.com/antvis/x6/commit/1da55bfda73edaa96515998b5766e9ed5f241ee9))
### Features
* ✨ export common and geometry in x6 package ([#2820](https://github.com/antvis/x6/issues/2820)) ([df28200](https://github.com/antvis/x6/commit/df282000cc5e17521147c77c210e172c444c9938))
* ✨ put animation in x6-common ([#2411](https://github.com/antvis/x6/issues/2411)) ([f1c80a8](https://github.com/antvis/x6/commit/f1c80a8cd75efe1def32168b6acff90ece5723ba))
* add scroller plugin ([#2580](https://github.com/antvis/x6/issues/2580)) ([5e0e2ac](https://github.com/antvis/x6/commit/5e0e2acde7d7e259ea27d001983e950878d0ecc8))
* support mouseenter and mouseleave event ([#2559](https://github.com/antvis/x6/issues/2559)) ([ecfd426](https://github.com/antvis/x6/commit/ecfd4263b1266a128bf8651c4dd745ff8ab038b3))
* support turbo ([1da55bf](https://github.com/antvis/x6/commit/1da55bfda73edaa96515998b5766e9ed5f241ee9))
### chore
* release beta ([b5f3cfa](https://github.com/antvis/x6/commit/b5f3cfa2042f5196a995a38a8f41f140cabdce57))
### Features
* ✨ export common and geometry in x6 package ([#2820](https://github.com/antvis/x6/issues/2820)) ([df28200](https://github.com/antvis/x6/commit/df282000cc5e17521147c77c210e172c444c9938))
* ✨ put animation in x6-common ([#2411](https://github.com/antvis/x6/issues/2411)) ([f1c80a8](https://github.com/antvis/x6/commit/f1c80a8cd75efe1def32168b6acff90ece5723ba))
* add scroller plugin ([#2580](https://github.com/antvis/x6/issues/2580)) ([5e0e2ac](https://github.com/antvis/x6/commit/5e0e2acde7d7e259ea27d001983e950878d0ecc8))
* support mouseenter and mouseleave event ([#2559](https://github.com/antvis/x6/issues/2559)) ([ecfd426](https://github.com/antvis/x6/commit/ecfd4263b1266a128bf8651c4dd745ff8ab038b3))
* support turbo ([1da55bf](https://github.com/antvis/x6/commit/1da55bfda73edaa96515998b5766e9ed5f241ee9))
### BREAKING CHANGES
* force release 2.0-beta
* 2.0-beta
## @antv/x6-geometry [1.0.11](https://github.com/antvis/x6/compare/@antv/x6-geometry@1.0.10...@antv/x6-geometry@1.0.11) (2021-11-14)
# @antv/x6-geometry 1.0.0 (2021-11-11)
### Bug Fixes
* update dependencies and fix type errors ([#1103](https://github.com/antvis/x6/issues/1103)) ([056b862](https://github.com/antvis/x6/commit/056b862b4efe7dbdc559cac7194c2453996acc07))
### Features
* ✨ add geometry library ([6502513](https://github.com/antvis/x6/commit/650251331c07de39da94b1058239d044f02c8aba))
* add some getters ([ff0273d](https://github.com/antvis/x6/commit/ff0273d119afd74b7233649308ba0035c737ca1a))
* equalPoints ([6a45c90](https://github.com/antvis/x6/commit/6a45c9027ab869a05c2f561cb7503078b0117264))
* rotate rectangle ([88a4fec](https://github.com/antvis/x6/commit/88a4fec7d1d3a49b6c1373f0641c8949474d7d83))
* round with default precision ([aef56f7](https://github.com/antvis/x6/commit/aef56f73f0627d620d36d116b74c828fa76c13f2))
## @antv/x6-geometry [1.0.10](https://github.com/antvis/x6/compare/@antv/x6-geometry@1.0.9...@antv/x6-geometry@1.0.10) (2021-10-22)
## @antv/x6-geometry [1.0.10](https://github.com/antvis/x6/compare/@antv/x6-geometry@1.0.9...@antv/x6-geometry@1.0.10) (2021-10-19)
## @antv/x6-geometry [1.0.9](https://github.com/antvis/x6/compare/@antv/x6-geometry@1.0.8...@antv/x6-geometry@1.0.9) (2021-09-22)
## @antv/x6-geometry [1.0.9](https://github.com/antvis/x6/compare/@antv/x6-geometry@1.0.8...@antv/x6-geometry@1.0.9) (2021-09-13)
## @antv/x6-geometry [1.0.8](https://github.com/antvis/x6/compare/@antv/x6-geometry@1.0.7...@antv/x6-geometry@1.0.8) (2021-07-10)
## @antv/x6-geometry [1.0.7](https://github.com/antvis/x6/compare/@antv/x6-geometry@1.0.6...@antv/x6-geometry@1.0.7) (2021-07-05)
## @antv/x6-geometry [1.0.6](https://github.com/antvis/x6/compare/@antv/x6-geometry@1.0.5...@antv/x6-geometry@1.0.6) (2021-06-17)
### Bug Fixes
* update dependencies and fix type errors ([#1103](https://github.com/antvis/x6/issues/1103)) ([056b862](https://github.com/antvis/x6/commit/056b862b4efe7dbdc559cac7194c2453996acc07))
## @antv/x6-geometry [1.0.6](https://github.com/antvis/x6/compare/@antv/x6-geometry@1.0.5...@antv/x6-geometry@1.0.6) (2021-06-16)
### Bug Fixes
* update dependencies and fix type errors ([#1103](https://github.com/antvis/x6/issues/1103)) ([056b862](https://github.com/antvis/x6/commit/056b862b4efe7dbdc559cac7194c2453996acc07))
## @antv/x6-geometry [1.0.5](https://github.com/antvis/x6/compare/@antv/x6-geometry@1.0.4...@antv/x6-geometry@1.0.5) (2021-06-15)
## @antv/x6-geometry [1.0.5](https://github.com/antvis/x6/compare/@antv/x6-geometry@1.0.4...@antv/x6-geometry@1.0.5) (2021-06-11)
## @antv/x6-geometry [1.0.4](https://github.com/antvis/x6/compare/@antv/x6-geometry@1.0.3...@antv/x6-geometry@1.0.4) (2021-06-09)
## @antv/x6-geometry [1.0.4](https://github.com/antvis/x6/compare/@antv/x6-geometry@1.0.3...@antv/x6-geometry@1.0.4) (2021-06-09)
## @antv/x6-geometry [1.0.3](https://github.com/antvis/x6/compare/@antv/x6-geometry@1.0.2...@antv/x6-geometry@1.0.3) (2021-04-01)
## @antv/x6-geometry [1.0.3](https://github.com/antvis/x6/compare/@antv/x6-geometry@1.0.2...@antv/x6-geometry@1.0.3) (2021-03-30)
## @antv/x6-geometry [1.0.2](https://github.com/antvis/x6/compare/@antv/x6-geometry@1.0.1...@antv/x6-geometry@1.0.2) (2021-03-30)
## @antv/x6-geometry [1.0.2](https://github.com/antvis/x6/compare/@antv/x6-geometry@1.0.1...@antv/x6-geometry@1.0.2) (2021-03-30)
## @antv/x6-geometry [1.0.1](https://github.com/antvis/x6/compare/@antv/x6-geometry@1.0.0...@antv/x6-geometry@1.0.1) (2021-03-28)
## @antv/x6-geometry [1.0.1](https://github.com/antvis/x6/compare/@antv/x6-geometry@1.0.0...@antv/x6-geometry@1.0.1) (2021-03-25)
# @antv/x6-geometry 1.0.0 (2021-03-24)
### Features
* ✨ add geometry library ([6502513](https://github.com/antvis/x6/commit/650251331c07de39da94b1058239d044f02c8aba))
* add some getters ([ff0273d](https://github.com/antvis/x6/commit/ff0273d119afd74b7233649308ba0035c737ca1a))
* equalPoints ([6a45c90](https://github.com/antvis/x6/commit/6a45c9027ab869a05c2f561cb7503078b0117264))
* rotate rectangle ([88a4fec](https://github.com/antvis/x6/commit/88a4fec7d1d3a49b6c1373f0641c8949474d7d83))
* round with default precision ([aef56f7](https://github.com/antvis/x6/commit/aef56f73f0627d620d36d116b74c828fa76c13f2))
# @antv/x6-geometry 1.0.0 (2021-03-23)
### Features
* ✨ add geometry library ([6502513](https://github.com/antvis/x6/commit/650251331c07de39da94b1058239d044f02c8aba))
* add some getters ([ff0273d](https://github.com/antvis/x6/commit/ff0273d119afd74b7233649308ba0035c737ca1a))
* equalPoints ([6a45c90](https://github.com/antvis/x6/commit/6a45c9027ab869a05c2f561cb7503078b0117264))
* rotate rectangle ([88a4fec](https://github.com/antvis/x6/commit/88a4fec7d1d3a49b6c1373f0641c8949474d7d83))
* round with default precision ([aef56f7](https://github.com/antvis/x6/commit/aef56f73f0627d620d36d116b74c828fa76c13f2))
# @antv/x6-geometry 1.0.0 (2021-03-23)
### Features
* ✨ add geometry library ([6502513](https://github.com/antvis/x6/commit/650251331c07de39da94b1058239d044f02c8aba))
* add some getters ([ff0273d](https://github.com/antvis/x6/commit/ff0273d119afd74b7233649308ba0035c737ca1a))
* equalPoints ([6a45c90](https://github.com/antvis/x6/commit/6a45c9027ab869a05c2f561cb7503078b0117264))
* rotate rectangle ([88a4fec](https://github.com/antvis/x6/commit/88a4fec7d1d3a49b6c1373f0641c8949474d7d83))
* round with default precision ([aef56f7](https://github.com/antvis/x6/commit/aef56f73f0627d620d36d116b74c828fa76c13f2))
# @antv/x6-geometry 1.0.0 (2021-03-23)
### Features
* ✨ add geometry library ([6502513](https://github.com/antvis/x6/commit/650251331c07de39da94b1058239d044f02c8aba))
* add some getters ([ff0273d](https://github.com/antvis/x6/commit/ff0273d119afd74b7233649308ba0035c737ca1a))
* equalPoints ([6a45c90](https://github.com/antvis/x6/commit/6a45c9027ab869a05c2f561cb7503078b0117264))
* rotate rectangle ([88a4fec](https://github.com/antvis/x6/commit/88a4fec7d1d3a49b6c1373f0641c8949474d7d83))
* round with default precision ([aef56f7](https://github.com/antvis/x6/commit/aef56f73f0627d620d36d116b74c828fa76c13f2))
# @antv/x6-geometry 1.0.0 (2021-03-23)
### Features
* ✨ add geometry library ([6502513](https://github.com/antvis/x6/commit/650251331c07de39da94b1058239d044f02c8aba))
* add some getters ([ff0273d](https://github.com/antvis/x6/commit/ff0273d119afd74b7233649308ba0035c737ca1a))
* equalPoints ([6a45c90](https://github.com/antvis/x6/commit/6a45c9027ab869a05c2f561cb7503078b0117264))
* rotate rectangle ([88a4fec](https://github.com/antvis/x6/commit/88a4fec7d1d3a49b6c1373f0641c8949474d7d83))
* round with default precision ([aef56f7](https://github.com/antvis/x6/commit/aef56f73f0627d620d36d116b74c828fa76c13f2))

@ -1,6 +1,6 @@
MIT License
Copyright (c) 2021-2023 Alipay.inc
Copyright (c) 2021-2022 Alipay.inc
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal

@ -5,7 +5,7 @@
<a href="/LICENSE"><img src="https://img.shields.io/github/license/antvis/x6?style=flat-square" alt="MIT License"></a>
<a href="https://www.typescriptlang.org"><img alt="Language" src="https://img.shields.io/badge/language-TypeScript-blue.svg?style=flat-square"></a>
<a href="https://github.com/antvis/x6/pulls"><img alt="PRs Welcome" src="https://img.shields.io/badge/PRs-Welcome-brightgreen.svg?style=flat-square"></a>
<a href="https://x6.antv.antgroup.com"><img alt="website" src="https://img.shields.io/static/v1?label=&labelColor=505050&message=website&color=0076D6&style=flat-square&logo=google-chrome&logoColor=0076D6"></a>
<a href="https://x6.antv.vision"><img alt="website" src="https://img.shields.io/static/v1?label=&labelColor=505050&message=website&color=0076D6&style=flat-square&logo=google-chrome&logoColor=0076D6"></a>
<a href="https://github.com/antvis/X6/actions/workflows/ci.yml"><img alt="build" src="https://img.shields.io/github/workflow/status/antvis/x6/%F0%9F%91%B7%E3%80%80CI/master?logo=github&style=flat-square"></a>
<a href="https://app.codecov.io/gh/antvis/x6"><img alt="coverage" src="https://img.shields.io/codecov/c/gh/antvis/x6?logo=codecov&flag=x6-geometry&style=flat-square&token=15CO54WYUV"></a>
<a href="https://lgtm.com/projects/g/antvis/x6/context:javascript"><img alt="Language grade: JavaScript" src="https://img.shields.io/lgtm/grade/javascript/g/antvis/x6.svg?logo=lgtm&style=flat-square"></a>

@ -1,5 +1,5 @@
{
"version": "2.0.4",
"version": "2.0.0",
"name": "@antv/x6-geometry",
"description": "Geometry operations for X6",
"main": "lib/index.js",
@ -41,13 +41,13 @@
"email": "bubkoo.wy@gmail.com"
},
"license": "MIT",
"homepage": "https://x6.antv.antgroup.com",
"homepage": "https://github.com/antvis/x6",
"bugs": {
"url": "https://github.com/antvis/x6/issues"
},
"repository": {
"type": "git",
"url": "https://github.com/antvis/x6.git",
"url": "ssh://git@github.com/antvis/x6.git",
"directory": "packages/x6-geometry"
},
"publishConfig": {

Some files were not shown because too many files have changed in this diff Show More