From 370ba56ff04c2b255dd4582d6c13c9e808ce0bfa Mon Sep 17 00:00:00 2001 From: JFH <20402845+jfhenon@users.noreply.github.com> Date: Sun, 7 Dec 2025 17:29:10 +0100 Subject: [PATCH] Simplify publish process --- CHANGES.md | 6 + README.md | 2 +- coverage/coverage-summary.json | 66 ++------ docs/ReleaseInstructions.md | 67 ++------ package-lock.json | 8 +- package.json | 15 +- packages/react-test/package.json | 2 +- packages/svgcanvas/package.json | 108 ++++++------- packages/svgcanvas/publish.md | 7 +- playwright.config.mjs | 2 +- publish.md | 10 +- scripts/publish.mjs | 136 ++++++++++++++++ scripts/run-e2e.mjs | 9 ++ scripts/version-bump.mjs | 153 ++++++++++++++++++ .../extensions/ext-layer_view/locale/zh-CN.js | 1 - 15 files changed, 397 insertions(+), 195 deletions(-) create mode 100644 scripts/publish.mjs create mode 100644 scripts/version-bump.mjs diff --git a/CHANGES.md b/CHANGES.md index b6b1490c..8821cdfa 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -1,5 +1,11 @@ # SVG-Edit CHANGES +## 7.4.0 +- Scripts: adapt `build` and `publish` for root-managed builds/publishes across workspaces. +- Docs: Update release/publish instructions to reflect workspace versioning and the new `scripts/version-bump.mjs` helper. +- Improve the toolbar behavior +- Add Flip buttons + ## 7.3.8 - Update svgcanvas to 7.2.7 diff --git a/README.md b/README.md index 73f3ac27..f297be34 100644 --- a/README.md +++ b/README.md @@ -16,7 +16,7 @@ works in any modern browser. **SVGEdit** is based on a powerful SVG canvas **@sv ## Contributions -SVGEdit is the most popular open source SVG editor. It was started more than 13 years ago by a fantastic team of developers. Unfortunately, the product was not maintained for quite a long time. We decided to give this tool a new life by refreshing many aspects. +SVGEdit is the most popular open source SVG editor. It was started more than 15 years ago by a fantastic team of developers. Unfortunately, the product was not maintained for quite a long time. We decided to give this tool a new life by refreshing many aspects. Please let us know by creating an issue or a discussion if you wish to contribute. diff --git a/coverage/coverage-summary.json b/coverage/coverage-summary.json index 1c5b9c4f..d47e24a8 100644 --- a/coverage/coverage-summary.json +++ b/coverage/coverage-summary.json @@ -1,58 +1,14 @@ -{"total": {"lines":{"total":5937,"covered":3761,"skipped":0,"pct":63.34},"statements":{"total":8297,"covered":4850,"skipped":0,"pct":58.45},"functions":{"total":1086,"covered":557,"skipped":0,"pct":51.28},"branches":{"total":3023,"covered":1419,"skipped":0,"pct":46.94},"branchesTrue":{"total":0,"covered":0,"skipped":0,"pct":100}} -,"/Users/jfh/Documents/GitHub/svgedit/packages/svgcanvas/common/browser.js": {"lines":{"total":25,"covered":24,"skipped":0,"pct":96},"functions":{"total":6,"covered":3,"skipped":0,"pct":50},"statements":{"total":30,"covered":26,"skipped":0,"pct":86.66},"branches":{"total":0,"covered":0,"skipped":0,"pct":100}} -,"/Users/jfh/Documents/GitHub/svgedit/packages/svgcanvas/common/util.js": {"lines":{"total":138,"covered":100,"skipped":0,"pct":72.46},"functions":{"total":14,"covered":14,"skipped":0,"pct":100},"statements":{"total":286,"covered":209,"skipped":0,"pct":73.07},"branches":{"total":196,"covered":119,"skipped":0,"pct":60.71}} -,"/Users/jfh/Documents/GitHub/svgedit/packages/svgcanvas/core/clear.js": {"lines":{"total":22,"covered":22,"skipped":0,"pct":100},"functions":{"total":5,"covered":5,"skipped":0,"pct":100},"statements":{"total":60,"covered":60,"skipped":0,"pct":100},"branches":{"total":4,"covered":4,"skipped":0,"pct":100}} -,"/Users/jfh/Documents/GitHub/svgedit/packages/svgcanvas/core/coords.js": {"lines":{"total":252,"covered":181,"skipped":0,"pct":71.82},"functions":{"total":18,"covered":18,"skipped":0,"pct":100},"statements":{"total":577,"covered":318,"skipped":0,"pct":55.11},"branches":{"total":174,"covered":71,"skipped":0,"pct":40.8}} +{"total": {"lines":{"total":1903,"covered":1123,"skipped":0,"pct":59.01},"statements":{"total":2952,"covered":1625,"skipped":0,"pct":55.04},"functions":{"total":219,"covered":123,"skipped":0,"pct":56.16},"branches":{"total":853,"covered":417,"skipped":0,"pct":48.88},"branchesTrue":{"total":0,"covered":0,"skipped":0,"pct":100}} +,"/Users/jfh/Documents/GitHub/svgedit/packages/svgcanvas/common/util.js": {"lines":{"total":138,"covered":99,"skipped":0,"pct":71.73},"functions":{"total":8,"covered":8,"skipped":0,"pct":100},"statements":{"total":194,"covered":136,"skipped":0,"pct":70.1},"branches":{"total":98,"covered":59,"skipped":0,"pct":60.2}} +,"/Users/jfh/Documents/GitHub/svgedit/packages/svgcanvas/core/clear.js": {"lines":{"total":22,"covered":22,"skipped":0,"pct":100},"functions":{"total":3,"covered":3,"skipped":0,"pct":100},"statements":{"total":38,"covered":38,"skipped":0,"pct":100},"branches":{"total":2,"covered":2,"skipped":0,"pct":100}} +,"/Users/jfh/Documents/GitHub/svgedit/packages/svgcanvas/core/coords.js": {"lines":{"total":251,"covered":102,"skipped":0,"pct":40.63},"functions":{"total":12,"covered":8,"skipped":0,"pct":66.66},"statements":{"total":378,"covered":159,"skipped":0,"pct":42.06},"branches":{"total":87,"covered":24,"skipped":0,"pct":27.58}} ,"/Users/jfh/Documents/GitHub/svgedit/packages/svgcanvas/core/dataStorage.js": {"lines":{"total":16,"covered":16,"skipped":0,"pct":100},"functions":{"total":5,"covered":5,"skipped":0,"pct":100},"statements":{"total":20,"covered":20,"skipped":0,"pct":100},"branches":{"total":6,"covered":6,"skipped":0,"pct":100}} -,"/Users/jfh/Documents/GitHub/svgedit/packages/svgcanvas/core/draw.js": {"lines":{"total":360,"covered":203,"skipped":0,"pct":56.38},"functions":{"total":56,"covered":32,"skipped":0,"pct":57.14},"statements":{"total":362,"covered":204,"skipped":0,"pct":56.35},"branches":{"total":170,"covered":95,"skipped":0,"pct":55.88}} -,"/Users/jfh/Documents/GitHub/svgedit/packages/svgcanvas/core/history.js": {"lines":{"total":166,"covered":82,"skipped":0,"pct":49.39},"functions":{"total":48,"covered":36,"skipped":0,"pct":75},"statements":{"total":173,"covered":82,"skipped":0,"pct":47.39},"branches":{"total":88,"covered":30,"skipped":0,"pct":34.09}} -,"/Users/jfh/Documents/GitHub/svgedit/packages/svgcanvas/core/math.js": {"lines":{"total":66,"covered":57,"skipped":0,"pct":86.36},"functions":{"total":11,"covered":10,"skipped":0,"pct":90.9},"statements":{"total":77,"covered":65,"skipped":0,"pct":84.41},"branches":{"total":46,"covered":35,"skipped":0,"pct":76.08}} -,"/Users/jfh/Documents/GitHub/svgedit/packages/svgcanvas/core/namespaces.js": {"lines":{"total":6,"covered":6,"skipped":0,"pct":100},"functions":{"total":2,"covered":2,"skipped":0,"pct":100},"statements":{"total":6,"covered":6,"skipped":0,"pct":100},"branches":{"total":0,"covered":0,"skipped":0,"pct":100}} ,"/Users/jfh/Documents/GitHub/svgedit/packages/svgcanvas/core/paint.js": {"lines":{"total":51,"covered":44,"skipped":0,"pct":86.27},"functions":{"total":1,"covered":1,"skipped":0,"pct":100},"statements":{"total":75,"covered":65,"skipped":0,"pct":86.66},"branches":{"total":24,"covered":21,"skipped":0,"pct":87.5}} -,"/Users/jfh/Documents/GitHub/svgedit/packages/svgcanvas/core/path.js": {"lines":{"total":312,"covered":163,"skipped":0,"pct":52.24},"functions":{"total":39,"covered":13,"skipped":0,"pct":33.33},"statements":{"total":806,"covered":340,"skipped":0,"pct":42.18},"branches":{"total":222,"covered":89,"skipped":0,"pct":40.09}} -,"/Users/jfh/Documents/GitHub/svgedit/packages/svgcanvas/core/recalculate.js": {"lines":{"total":241,"covered":139,"skipped":0,"pct":57.67},"functions":{"total":8,"covered":7,"skipped":0,"pct":87.5},"statements":{"total":530,"covered":241,"skipped":0,"pct":45.47},"branches":{"total":280,"covered":137,"skipped":0,"pct":48.92}} -,"/Users/jfh/Documents/GitHub/svgedit/packages/svgcanvas/core/touch.js": {"lines":{"total":22,"covered":22,"skipped":0,"pct":100},"functions":{"total":5,"covered":5,"skipped":0,"pct":100},"statements":{"total":62,"covered":57,"skipped":0,"pct":91.93},"branches":{"total":12,"covered":8,"skipped":0,"pct":66.66}} -,"/Users/jfh/Documents/GitHub/svgedit/packages/svgcanvas/core/units.js": {"lines":{"total":72,"covered":51,"skipped":0,"pct":70.83},"functions":{"total":10,"covered":8,"skipped":0,"pct":80},"statements":{"total":74,"covered":52,"skipped":0,"pct":70.27},"branches":{"total":28,"covered":15,"skipped":0,"pct":53.57}} -,"/Users/jfh/Documents/GitHub/svgedit/packages/svgcanvas/core/utilities.js": {"lines":{"total":671,"covered":462,"skipped":0,"pct":68.85},"functions":{"total":131,"covered":88,"skipped":0,"pct":67.17},"statements":{"total":1542,"covered":884,"skipped":0,"pct":57.32},"branches":{"total":624,"covered":271,"skipped":0,"pct":43.42}} -,"/Users/jfh/Documents/GitHub/svgedit/src/editor/ConfigObj.js": {"lines":{"total":105,"covered":50,"skipped":0,"pct":47.61},"functions":{"total":15,"covered":11,"skipped":0,"pct":73.33},"statements":{"total":107,"covered":50,"skipped":0,"pct":46.72},"branches":{"total":79,"covered":30,"skipped":0,"pct":37.97}} -,"/Users/jfh/Documents/GitHub/svgedit/src/editor/Editor.js": {"lines":{"total":414,"covered":177,"skipped":0,"pct":42.75},"functions":{"total":103,"covered":27,"skipped":0,"pct":26.21},"statements":{"total":420,"covered":177,"skipped":0,"pct":42.14},"branches":{"total":155,"covered":45,"skipped":0,"pct":29.03}} -,"/Users/jfh/Documents/GitHub/svgedit/src/editor/EditorStartup.js": {"lines":{"total":389,"covered":221,"skipped":0,"pct":56.81},"functions":{"total":58,"covered":25,"skipped":0,"pct":43.1},"statements":{"total":401,"covered":227,"skipped":0,"pct":56.6},"branches":{"total":114,"covered":29,"skipped":0,"pct":25.43}} -,"/Users/jfh/Documents/GitHub/svgedit/src/editor/MainMenu.js": {"lines":{"total":101,"covered":78,"skipped":0,"pct":77.22},"functions":{"total":15,"covered":13,"skipped":0,"pct":86.66},"statements":{"total":102,"covered":79,"skipped":0,"pct":77.45},"branches":{"total":42,"covered":26,"skipped":0,"pct":61.9}} -,"/Users/jfh/Documents/GitHub/svgedit/src/editor/Rulers.js": {"lines":{"total":119,"covered":93,"skipped":0,"pct":78.15},"functions":{"total":6,"covered":5,"skipped":0,"pct":83.33},"statements":{"total":124,"covered":96,"skipped":0,"pct":77.41},"branches":{"total":33,"covered":24,"skipped":0,"pct":72.72}} -,"/Users/jfh/Documents/GitHub/svgedit/src/editor/contextmenu.js": {"lines":{"total":22,"covered":9,"skipped":0,"pct":40.9},"functions":{"total":8,"covered":2,"skipped":0,"pct":25},"statements":{"total":25,"covered":12,"skipped":0,"pct":48},"branches":{"total":15,"covered":5,"skipped":0,"pct":33.33}} -,"/Users/jfh/Documents/GitHub/svgedit/src/editor/locale.js": {"lines":{"total":15,"covered":10,"skipped":0,"pct":66.66},"functions":{"total":3,"covered":3,"skipped":0,"pct":100},"statements":{"total":15,"covered":10,"skipped":0,"pct":66.66},"branches":{"total":8,"covered":2,"skipped":0,"pct":25}} -,"/Users/jfh/Documents/GitHub/svgedit/src/editor/components/PaintBox.js": {"lines":{"total":64,"covered":35,"skipped":0,"pct":54.68},"functions":{"total":4,"covered":4,"skipped":0,"pct":100},"statements":{"total":67,"covered":35,"skipped":0,"pct":52.23},"branches":{"total":28,"covered":10,"skipped":0,"pct":35.71}} -,"/Users/jfh/Documents/GitHub/svgedit/src/editor/components/seButton.js": {"lines":{"total":57,"covered":42,"skipped":0,"pct":73.68},"functions":{"total":15,"covered":7,"skipped":0,"pct":46.66},"statements":{"total":60,"covered":43,"skipped":0,"pct":71.66},"branches":{"total":29,"covered":21,"skipped":0,"pct":72.41}} -,"/Users/jfh/Documents/GitHub/svgedit/src/editor/components/seColorPicker.js": {"lines":{"total":56,"covered":34,"skipped":0,"pct":60.71},"functions":{"total":19,"covered":8,"skipped":0,"pct":42.1},"statements":{"total":57,"covered":34,"skipped":0,"pct":59.64},"branches":{"total":10,"covered":6,"skipped":0,"pct":60}} -,"/Users/jfh/Documents/GitHub/svgedit/src/editor/components/seExplorerButton.js": {"lines":{"total":99,"covered":56,"skipped":0,"pct":56.56},"functions":{"total":18,"covered":9,"skipped":0,"pct":50},"statements":{"total":102,"covered":56,"skipped":0,"pct":54.9},"branches":{"total":29,"covered":9,"skipped":0,"pct":31.03}} -,"/Users/jfh/Documents/GitHub/svgedit/src/editor/components/seFlyingButton.js": {"lines":{"total":77,"covered":46,"skipped":0,"pct":59.74},"functions":{"total":15,"covered":10,"skipped":0,"pct":66.66},"statements":{"total":78,"covered":47,"skipped":0,"pct":60.25},"branches":{"total":29,"covered":9,"skipped":0,"pct":31.03}} -,"/Users/jfh/Documents/GitHub/svgedit/src/editor/components/seInput.js": {"lines":{"total":46,"covered":24,"skipped":0,"pct":52.17},"functions":{"total":16,"covered":5,"skipped":0,"pct":31.25},"statements":{"total":47,"covered":24,"skipped":0,"pct":51.06},"branches":{"total":7,"covered":3,"skipped":0,"pct":42.85}} -,"/Users/jfh/Documents/GitHub/svgedit/src/editor/components/seList.js": {"lines":{"total":87,"covered":50,"skipped":0,"pct":57.47},"functions":{"total":21,"covered":7,"skipped":0,"pct":33.33},"statements":{"total":89,"covered":52,"skipped":0,"pct":58.42},"branches":{"total":18,"covered":9,"skipped":0,"pct":50}} -,"/Users/jfh/Documents/GitHub/svgedit/src/editor/components/seListItem.js": {"lines":{"total":39,"covered":25,"skipped":0,"pct":64.1},"functions":{"total":12,"covered":3,"skipped":0,"pct":25},"statements":{"total":40,"covered":26,"skipped":0,"pct":65},"branches":{"total":9,"covered":7,"skipped":0,"pct":77.77}} -,"/Users/jfh/Documents/GitHub/svgedit/src/editor/components/seMenu.js": {"lines":{"total":27,"covered":21,"skipped":0,"pct":77.77},"functions":{"total":7,"covered":3,"skipped":0,"pct":42.85},"statements":{"total":28,"covered":21,"skipped":0,"pct":75},"branches":{"total":4,"covered":2,"skipped":0,"pct":50}} -,"/Users/jfh/Documents/GitHub/svgedit/src/editor/components/seMenuItem.js": {"lines":{"total":37,"covered":25,"skipped":0,"pct":67.56},"functions":{"total":9,"covered":4,"skipped":0,"pct":44.44},"statements":{"total":40,"covered":25,"skipped":0,"pct":62.5},"branches":{"total":16,"covered":5,"skipped":0,"pct":31.25}} -,"/Users/jfh/Documents/GitHub/svgedit/src/editor/components/sePalette.js": {"lines":{"total":54,"covered":39,"skipped":0,"pct":72.22},"functions":{"total":11,"covered":8,"skipped":0,"pct":72.72},"statements":{"total":54,"covered":39,"skipped":0,"pct":72.22},"branches":{"total":13,"covered":3,"skipped":0,"pct":23.07}} -,"/Users/jfh/Documents/GitHub/svgedit/src/editor/components/sePlainBorderButton.js": {"lines":{"total":3,"covered":3,"skipped":0,"pct":100},"functions":{"total":1,"covered":1,"skipped":0,"pct":100},"statements":{"total":3,"covered":3,"skipped":0,"pct":100},"branches":{"total":0,"covered":0,"skipped":0,"pct":100}} -,"/Users/jfh/Documents/GitHub/svgedit/src/editor/components/sePlainMenuButton.js": {"lines":{"total":2,"covered":2,"skipped":0,"pct":100},"functions":{"total":1,"covered":1,"skipped":0,"pct":100},"statements":{"total":2,"covered":2,"skipped":0,"pct":100},"branches":{"total":0,"covered":0,"skipped":0,"pct":100}} -,"/Users/jfh/Documents/GitHub/svgedit/src/editor/components/seSelect.js": {"lines":{"total":56,"covered":42,"skipped":0,"pct":75},"functions":{"total":17,"covered":8,"skipped":0,"pct":47.05},"statements":{"total":59,"covered":44,"skipped":0,"pct":74.57},"branches":{"total":15,"covered":14,"skipped":0,"pct":93.33}} -,"/Users/jfh/Documents/GitHub/svgedit/src/editor/components/seSpinInput.js": {"lines":{"total":65,"covered":48,"skipped":0,"pct":73.84},"functions":{"total":18,"covered":8,"skipped":0,"pct":44.44},"statements":{"total":66,"covered":48,"skipped":0,"pct":72.72},"branches":{"total":14,"covered":10,"skipped":0,"pct":71.42}} -,"/Users/jfh/Documents/GitHub/svgedit/src/editor/components/seText.js": {"lines":{"total":28,"covered":18,"skipped":0,"pct":64.28},"functions":{"total":10,"covered":4,"skipped":0,"pct":40},"statements":{"total":29,"covered":18,"skipped":0,"pct":62.06},"branches":{"total":7,"covered":4,"skipped":0,"pct":57.14}} -,"/Users/jfh/Documents/GitHub/svgedit/src/editor/components/seZoom.js": {"lines":{"total":102,"covered":65,"skipped":0,"pct":63.72},"functions":{"total":28,"covered":9,"skipped":0,"pct":32.14},"statements":{"total":107,"covered":66,"skipped":0,"pct":61.68},"branches":{"total":27,"covered":6,"skipped":0,"pct":22.22}} -,"/Users/jfh/Documents/GitHub/svgedit/src/editor/dialogs/SePlainAlertDialog.js": {"lines":{"total":12,"covered":7,"skipped":0,"pct":58.33},"functions":{"total":3,"covered":1,"skipped":0,"pct":33.33},"statements":{"total":12,"covered":7,"skipped":0,"pct":58.33},"branches":{"total":2,"covered":0,"skipped":0,"pct":0}} -,"/Users/jfh/Documents/GitHub/svgedit/src/editor/dialogs/cmenuDialog.js": {"lines":{"total":120,"covered":112,"skipped":0,"pct":93.33},"functions":{"total":28,"covered":15,"skipped":0,"pct":53.57},"statements":{"total":131,"covered":116,"skipped":0,"pct":88.54},"branches":{"total":19,"covered":17,"skipped":0,"pct":89.47}} -,"/Users/jfh/Documents/GitHub/svgedit/src/editor/dialogs/cmenuLayersDialog.js": {"lines":{"total":61,"covered":51,"skipped":0,"pct":83.6},"functions":{"total":16,"covered":7,"skipped":0,"pct":43.75},"statements":{"total":66,"covered":51,"skipped":0,"pct":77.27},"branches":{"total":13,"covered":12,"skipped":0,"pct":92.3}} -,"/Users/jfh/Documents/GitHub/svgedit/src/editor/dialogs/editorPreferencesDialog.js": {"lines":{"total":157,"covered":120,"skipped":0,"pct":76.43},"functions":{"total":30,"covered":8,"skipped":0,"pct":26.66},"statements":{"total":159,"covered":121,"skipped":0,"pct":76.1},"branches":{"total":42,"covered":31,"skipped":0,"pct":73.8}} -,"/Users/jfh/Documents/GitHub/svgedit/src/editor/dialogs/exportDialog.js": {"lines":{"total":52,"covered":36,"skipped":0,"pct":69.23},"functions":{"total":14,"covered":5,"skipped":0,"pct":35.71},"statements":{"total":55,"covered":36,"skipped":0,"pct":65.45},"branches":{"total":11,"covered":5,"skipped":0,"pct":45.45}} -,"/Users/jfh/Documents/GitHub/svgedit/src/editor/dialogs/imagePropertiesDialog.js": {"lines":{"total":161,"covered":91,"skipped":0,"pct":56.52},"functions":{"total":20,"covered":5,"skipped":0,"pct":25},"statements":{"total":162,"covered":92,"skipped":0,"pct":56.79},"branches":{"total":46,"covered":24,"skipped":0,"pct":52.17}} -,"/Users/jfh/Documents/GitHub/svgedit/src/editor/dialogs/seAlertDialog.js": {"lines":{"total":6,"covered":6,"skipped":0,"pct":100},"functions":{"total":1,"covered":1,"skipped":0,"pct":100},"statements":{"total":6,"covered":6,"skipped":0,"pct":100},"branches":{"total":0,"covered":0,"skipped":0,"pct":100}} -,"/Users/jfh/Documents/GitHub/svgedit/src/editor/dialogs/seConfirmDialog.js": {"lines":{"total":8,"covered":7,"skipped":0,"pct":87.5},"functions":{"total":1,"covered":1,"skipped":0,"pct":100},"statements":{"total":8,"covered":7,"skipped":0,"pct":87.5},"branches":{"total":4,"covered":1,"skipped":0,"pct":25}} -,"/Users/jfh/Documents/GitHub/svgedit/src/editor/dialogs/sePromptDialog.js": {"lines":{"total":24,"covered":19,"skipped":0,"pct":79.16},"functions":{"total":7,"covered":6,"skipped":0,"pct":85.71},"statements":{"total":24,"covered":19,"skipped":0,"pct":79.16},"branches":{"total":8,"covered":5,"skipped":0,"pct":62.5}} -,"/Users/jfh/Documents/GitHub/svgedit/src/editor/dialogs/seSelectDialog.js": {"lines":{"total":8,"covered":7,"skipped":0,"pct":87.5},"functions":{"total":1,"covered":1,"skipped":0,"pct":100},"statements":{"total":8,"covered":7,"skipped":0,"pct":87.5},"branches":{"total":0,"covered":0,"skipped":0,"pct":100}} -,"/Users/jfh/Documents/GitHub/svgedit/src/editor/dialogs/svgSourceDialog.js": {"lines":{"total":74,"covered":56,"skipped":0,"pct":75.67},"functions":{"total":17,"covered":6,"skipped":0,"pct":35.29},"statements":{"total":75,"covered":56,"skipped":0,"pct":74.66},"branches":{"total":16,"covered":12,"skipped":0,"pct":75}} -,"/Users/jfh/Documents/GitHub/svgedit/src/editor/dialogs/se-elix/define/NumberSpinBox.js": {"lines":{"total":1,"covered":1,"skipped":0,"pct":100},"functions":{"total":0,"covered":0,"skipped":0,"pct":100},"statements":{"total":1,"covered":1,"skipped":0,"pct":100},"branches":{"total":0,"covered":0,"skipped":0,"pct":100}} -,"/Users/jfh/Documents/GitHub/svgedit/src/editor/dialogs/se-elix/src/base/NumberSpinBox.js": {"lines":{"total":54,"covered":31,"skipped":0,"pct":57.4},"functions":{"total":13,"covered":6,"skipped":0,"pct":46.15},"statements":{"total":54,"covered":31,"skipped":0,"pct":57.4},"branches":{"total":46,"covered":33,"skipped":0,"pct":71.73}} -,"/Users/jfh/Documents/GitHub/svgedit/src/editor/panels/BottomPanel.js": {"lines":{"total":84,"covered":46,"skipped":0,"pct":54.76},"functions":{"total":23,"covered":9,"skipped":0,"pct":39.13},"statements":{"total":84,"covered":46,"skipped":0,"pct":54.76},"branches":{"total":28,"covered":6,"skipped":0,"pct":21.42}} -,"/Users/jfh/Documents/GitHub/svgedit/src/editor/panels/LayersPanel.js": {"lines":{"total":165,"covered":125,"skipped":0,"pct":75.75},"functions":{"total":27,"covered":19,"skipped":0,"pct":70.37},"statements":{"total":171,"covered":127,"skipped":0,"pct":74.26},"branches":{"total":35,"covered":18,"skipped":0,"pct":51.42}} -,"/Users/jfh/Documents/GitHub/svgedit/src/editor/panels/LeftPanel.js": {"lines":{"total":57,"covered":28,"skipped":0,"pct":49.12},"functions":{"total":20,"covered":6,"skipped":0,"pct":30},"statements":{"total":58,"covered":28,"skipped":0,"pct":48.27},"branches":{"total":16,"covered":2,"skipped":0,"pct":12.5}} -,"/Users/jfh/Documents/GitHub/svgedit/src/editor/panels/TopPanel.js": {"lines":{"total":409,"covered":233,"skipped":0,"pct":56.96},"functions":{"total":76,"covered":29,"skipped":0,"pct":38.15},"statements":{"total":421,"covered":236,"skipped":0,"pct":56.05},"branches":{"total":162,"covered":73,"skipped":0,"pct":45.06}} +,"/Users/jfh/Documents/GitHub/svgedit/packages/svgcanvas/core/path.js": {"lines":{"total":312,"covered":130,"skipped":0,"pct":41.66},"functions":{"total":21,"covered":11,"skipped":0,"pct":52.38},"statements":{"total":511,"covered":193,"skipped":0,"pct":37.76},"branches":{"total":111,"covered":33,"skipped":0,"pct":29.72}} +,"/Users/jfh/Documents/GitHub/svgedit/packages/svgcanvas/core/recalculate.js": {"lines":{"total":241,"covered":86,"skipped":0,"pct":35.68},"functions":{"total":5,"covered":4,"skipped":0,"pct":80},"statements":{"total":338,"covered":114,"skipped":0,"pct":33.72},"branches":{"total":140,"covered":50,"skipped":0,"pct":35.71}} +,"/Users/jfh/Documents/GitHub/svgedit/packages/svgcanvas/core/touch.js": {"lines":{"total":22,"covered":22,"skipped":0,"pct":100},"functions":{"total":3,"covered":3,"skipped":0,"pct":100},"statements":{"total":40,"covered":36,"skipped":0,"pct":90},"branches":{"total":6,"covered":5,"skipped":0,"pct":83.33}} +,"/Users/jfh/Documents/GitHub/svgedit/packages/svgcanvas/core/utilities.js": {"lines":{"total":669,"covered":438,"skipped":0,"pct":65.47},"functions":{"total":78,"covered":54,"skipped":0,"pct":69.23},"statements":{"total":991,"covered":630,"skipped":0,"pct":63.57},"branches":{"total":312,"covered":163,"skipped":0,"pct":52.24}} +,"/Users/jfh/Documents/GitHub/svgedit/src/editor/MainMenu.js": {"lines":{"total":138,"covered":123,"skipped":0,"pct":89.13},"functions":{"total":15,"covered":13,"skipped":0,"pct":86.66},"statements":{"total":186,"covered":166,"skipped":0,"pct":89.24},"branches":{"total":44,"covered":33,"skipped":0,"pct":75}} +,"/Users/jfh/Documents/GitHub/svgedit/src/editor/contextmenu.js": {"lines":{"total":25,"covered":24,"skipped":0,"pct":96},"functions":{"total":8,"covered":8,"skipped":0,"pct":100},"statements":{"total":38,"covered":36,"skipped":0,"pct":94.73},"branches":{"total":13,"covered":12,"skipped":0,"pct":92.3}} +,"/Users/jfh/Documents/GitHub/svgedit/src/editor/locale.js": {"lines":{"total":18,"covered":17,"skipped":0,"pct":94.44},"functions":{"total":60,"covered":5,"skipped":0,"pct":8.33},"statements":{"total":143,"covered":32,"skipped":0,"pct":22.37},"branches":{"total":10,"covered":9,"skipped":0,"pct":90}} } diff --git a/docs/ReleaseInstructions.md b/docs/ReleaseInstructions.md index c65c1e22..ef36b674 100644 --- a/docs/ReleaseInstructions.md +++ b/docs/ReleaseInstructions.md @@ -1,65 +1,22 @@ # Creating a new svg-edit release ## Prepare - -1. `npm test` - Ensure build steps occur and tests are passing (note that - accessibility tests are currently failing). -1. `npm publish --dry-run` to run the preparatory scripts to ensure the - necessary files are updated and also to see which files will be - included once published and taking into account `.npmignore` - (use `npm pack --dry-run` to see the files without the preparatory - steps). +1. `npm test` - Must pass before version bump (accessibility tests are currently failing; address or accept the known failure before proceeding). +1. `npm run build` - Must pass before version bump; builds all workspaces and the main editor from the root. ## Update the main project -1. Update `version` in `package.json` (and `package-lock.json` (via `npm i`)). -1. Update the `CHANGES.md` file with a summary of all changes (adding the - version of the new release). -1. Add new release info to `Recent news` section in README -1. For major version changes, add a separate document for that version - to `docs/versions/X.Y.Z.md` to summarizethe changes (higher level - than the CHANGES file) and to indicate what is needed to update code - to work with the breaking changes. -1. Commit these changes `git commit -m "Updating CHANGES for release X.Y.Z"`-->. -1. Tag the version, prefixed by "v", e.g., `v6.0.0`. - -The above steps can be done on a fork and committed via a pull request. - -## Create the release as a submodule - -1. Create a branch for the release, e.g., `git branch release-v6.0.0` and - push it to origin. -1. While still on `master`, run the following (changing the version). This - will add the branch to `.gitsubmodules` and have the current version in - `package.json` point `latest` to this new release: - `npm run add-new-release`; if you need to add a specific version (e.g., - an older one that was missing, use the following): - `npm run add-release --release=6.0.0`. If you need to remove a release, - run `npm run remove-release --release=6.0.0` -1. Commit these changes `git commit -m "Updating for release X.Y.Z"`-->. -1. Push to `master`. -1. Ensure the new release is available by visiting - - (and in an ES6-Module-compliant browser, - ). - -## Create the release on GitHub - -1. Go to and select - `Draft a new release`. -1. Make the release target point at the tag where the - changes were updated. -1. Write a short description of the release and include a link to the live - version (in another tab, you may wish to see the source for a previous - release): - . -1. Create the release! - -You will need to be a member of the SVG-Edit GitHub group to do this step. +1. Run `npm run version-bump` (after tests/builds are green) to bump the root and all workspace package versions together and refresh `package-lock.json`. +1. Update the `CHANGES.md` file with a summary of all changes (adding the version of the new release). ## Publish to npm -1. `npm publish` +1. From the repo root, run `npm run publish`. The script will: + - Confirm the version bump is already done. + - Confirm `CHANGES.md` has been updated. + - Run the full release checks (`npm run test-build` → tests, docs, and build); it exits on failure. + - Ask before creating a release commit and tag (defaults to `v`); declining aborts the publish. + - Publish all workspaces and the root package together. + +You will need to be a member of the npm group to do this step. -You will need to be a member of the npm group to do this step. See above -for `npm publish --dry-run`. diff --git a/package-lock.json b/package-lock.json index 7da3f662..37ec84ba 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "svgedit", - "version": "7.3.8", + "version": "7.4.0", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "svgedit", - "version": "7.3.8", + "version": "7.4.0", "license": "(MIT AND Apache-2.0 AND ISC AND LGPL-3.0-or-later AND X11)", "workspaces": [ "packages/svgcanvas", @@ -12295,7 +12295,7 @@ }, "packages/react-test": { "name": "@svgedit/react-test", - "version": "1.1.5", + "version": "7.4.0", "license": "MIT", "dependencies": { "react": "^19.1.0", @@ -12307,7 +12307,7 @@ }, "packages/svgcanvas": { "name": "@svgedit/svgcanvas", - "version": "7.2.7", + "version": "7.4.0", "license": "MIT" } } diff --git a/package.json b/package.json index a6e8e13d..070835dd 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "svgedit", - "version": "7.3.8", + "version": "7.4.0", "description": "Powerful SVG-Editor for your browser ", "main": "dist/editor/Editor.js", "module": "dist/editor/Editor.js", @@ -19,16 +19,13 @@ "scripts": { "lint": "standard .", "pretest": "npm run lint", - "test": "npm run test:unit && npm run test:e2e", - "test:unit": "vitest run --coverage", - "prebuild": "npm run build --workspace=packages/svgcanvas --workspace=packages/react-test", - "build": "vite build", + "test": "vitest run --coverage && node scripts/run-e2e.mjs", + "build": "vite build packages/svgcanvas && vite build packages/react-test && vite build", "postbuild": "node scripts/copy-static.mjs && node scripts/build-extensions.mjs", "start": "vite dev --host --port 8000 --strictPort", "prestart": "echo svgedit is available at http://localhost:8000/src/editor/index.html", "start:iife": "npm run build && vite preview --host --port 8000 --strictPort --outDir dist/editor --open /iife-index.html", - "start:e2e": "npm run build && vite preview --host --port 8000 --strictPort --outDir dist/editor", - "test:e2e": "node scripts/run-e2e.mjs", + "start:e2e": "vite preview --host --port 8000 --strictPort --outDir dist/editor", "open-docs-no-start": "open-cli http://localhost:8000/docs/jsdoc/", "open-docs": "run-p start open-docs-no-start", "build-docs-remove": "rimraf \"docs/jsdoc/\"", @@ -37,7 +34,9 @@ "build-and-open-docs-no-start": "run-s build-docs open-docs-no-start", "build-and-open-docs": "run-s build-docs open-docs", "remark": "remark -q -f .", - "prepublishOnly": "run-s build-docs build" + "version-bump": "node scripts/version-bump.mjs", + "publish": "node scripts/publish.mjs", + "test-build": "run-s test build-docs build" }, "repository": { "type": "git", diff --git a/packages/react-test/package.json b/packages/react-test/package.json index 7d2bc724..937c7cce 100644 --- a/packages/react-test/package.json +++ b/packages/react-test/package.json @@ -1,6 +1,6 @@ { "name": "@svgedit/react-test", - "version": "1.1.5", + "version": "7.4.0", "description": "", "main": "dist/index.js", "scripts": { diff --git a/packages/svgcanvas/package.json b/packages/svgcanvas/package.json index b7c3dd1f..20474dd0 100644 --- a/packages/svgcanvas/package.json +++ b/packages/svgcanvas/package.json @@ -1,58 +1,58 @@ { - "name": "@svgedit/svgcanvas", - "version": "7.2.7", - "description": "SVG Canvas", - "main": "dist/svgcanvas.js", - "author": "Narendra Sisodiya", - "publishConfig": { - "access": "public" - }, - "bugs": { - "url": "https://github.com/SVG-Edit/svgedit/issues" - }, - "repository": { - "type": "git", - "url": "git+https://github.com/SVG-Edit/svgedit.git" - }, - "homepage": "https://github.com/SVG-Edit/svgedit#readme", - "contributors": [ - "Pavol Rusnak", - "Jeff Schiller", - "Vidar Hokstad", - "Alexis Deveria", - "Brett Zamir", - "Fabien Jacq", - "OptimistikSAS" + "name": "@svgedit/svgcanvas", + "version": "7.4.0", + "description": "SVG Canvas", + "main": "dist/svgcanvas.js", + "author": "Narendra Sisodiya", + "publishConfig": { + "access": "public" + }, + "bugs": { + "url": "https://github.com/SVG-Edit/svgedit/issues" + }, + "repository": { + "type": "git", + "url": "git+https://github.com/SVG-Edit/svgedit.git" + }, + "homepage": "https://github.com/SVG-Edit/svgedit#readme", + "contributors": [ + "Pavol Rusnak", + "Jeff Schiller", + "Vidar Hokstad", + "Alexis Deveria", + "Brett Zamir", + "Fabien Jacq", + "OptimistikSAS" + ], + "keywords": [ + "svg-editor", + "javascript", + "svg-edit", + "svg", + "svgcanvas" + ], + "license": "MIT", + "browserslist": [ + "defaults", + "not IE 11", + "not OperaMini all" + ], + "standard": { + "ignore": [ + "dist" ], - "keywords": [ - "svg-editor", - "javascript", - "svg-edit", - "svg", - "svgcanvas" + "globals": [ + "cy", + "assert" ], - "license": "MIT", - "browserslist": [ - "defaults", - "not IE 11", - "not OperaMini all" - ], - "standard": { - "ignore": [ - "dist" - ], - "globals": [ - "cy", - "assert" - ], - "env": [ - "mocha", - "browser" - ] - }, - "scripts": { - "build": "vite build", - "prebuild": "standard . && npm i", - "prepublishOnly": "npm run build" - } + "env": [ + "mocha", + "browser" + ] + }, + "scripts": { + "build": "vite build", + "prebuild": "standard . && npm i", + "prepublishOnly": "npm run build" + } } diff --git a/packages/svgcanvas/publish.md b/packages/svgcanvas/publish.md index 1ae03736..e4e64d10 100644 --- a/packages/svgcanvas/publish.md +++ b/packages/svgcanvas/publish.md @@ -1,6 +1 @@ -## To publish this package -1. update the version number in package.json -2. update the CHANGES.md -3. move to the package directory (packages/svgcanvas) -4. run 'npm publish' (that will automate the build) -5. create a commit with above changes called 'release x.y.z' +see docs/ReleaseInstructions.md diff --git a/playwright.config.mjs b/playwright.config.mjs index 5c701d72..f0283db3 100644 --- a/playwright.config.mjs +++ b/playwright.config.mjs @@ -15,6 +15,6 @@ export default defineConfig({ command: 'npm run start:e2e', url: 'http://localhost:8000/index.html', reuseExistingServer: !process.env.CI, - timeout: 60000 + timeout: 180 * 1000 } }) diff --git a/publish.md b/publish.md index 54cbd3f7..e4e64d10 100644 --- a/publish.md +++ b/publish.md @@ -1,9 +1 @@ -## To publish this package -1. Make sure that @svgedit/packages is published if a new version is made (see publish.md in its corresponding folder) -2. modify package.json to update: - - The new version of svgcanvas (if any) - - The new version of svgedit -2. run 'npm install' to update the corresponding package-lock.json -3. update the CHANGES.md -4. run 'npm publish' (that will automate the build) -5. create a commit with above changes called 'release x.y.z' +see docs/ReleaseInstructions.md diff --git a/scripts/publish.mjs b/scripts/publish.mjs new file mode 100644 index 00000000..dbde823a --- /dev/null +++ b/scripts/publish.mjs @@ -0,0 +1,136 @@ +#!/usr/bin/env node +import { execSync } from 'node:child_process' +import { readdirSync, readFileSync } from 'node:fs' +import { join } from 'node:path' +import readline from 'node:readline' + +const rootDir = process.cwd() +const rootPackagePath = join(rootDir, 'package.json') +const packageLockPath = join(rootDir, 'package-lock.json') +const changesPath = join(rootDir, 'CHANGES.md') + +function readJson (path) { + return JSON.parse(readFileSync(path, 'utf8')) +} + +async function prompt (question) { + const rl = readline.createInterface({ + input: process.stdin, + output: process.stdout + }) + const answer = await new Promise(resolve => rl.question(question, resolve)) + rl.close() + return answer.trim() +} + +function expandWorkspaces (patterns) { + const expanded = [] + for (const pattern of patterns) { + if (!pattern.includes('*')) { + expanded.push(pattern) + continue + } + const [prefix, suffix] = pattern.split('*') + const baseDir = join(rootDir, prefix || '.') + const entries = readdirSync(baseDir, { withFileTypes: true }) + for (const entry of entries) { + if (entry.isDirectory()) { + expanded.push(join(prefix, entry.name, suffix)) + } + } + } + return expanded +} + +function loadWorkspacePackagePaths () { + const rootPackage = readJson(rootPackagePath) + const workspacePatterns = Array.isArray(rootPackage.workspaces) + ? rootPackage.workspaces + : rootPackage.workspaces?.packages ?? [] + return expandWorkspaces(workspacePatterns).map(path => join(rootDir, path, 'package.json')) +} + +function inGitRepo () { + try { + execSync('git rev-parse --is-inside-work-tree', { stdio: 'ignore', cwd: rootDir }) + return true + } catch (error) { + return false + } +} + +function confirmYes (answer) { + return /^y(es)?$/i.test(answer) +} + +function quoteArg (value) { + return JSON.stringify(value) +} + +function run (command) { + execSync(command, { stdio: 'inherit', cwd: rootDir }) +} + +async function main () { + const rootPackage = readJson(rootPackagePath) + const workspacePackages = loadWorkspacePackagePaths() + const releaseVersion = rootPackage.version + const defaultReleaseName = `v${releaseVersion}` + + console.log(`Preparing to publish ${rootPackage.name}@${releaseVersion}\n`) + + const versionBumped = await prompt(`Has the version bump been completed (current version ${releaseVersion})? [y/N]: `) + if (!confirmYes(versionBumped)) { + console.log('Please run version bump before publishing. Exiting.') + process.exit(1) + } + + const changelogUpdated = await prompt('Has CHANGES.md been updated? [y/N]: ') + if (!confirmYes(changelogUpdated)) { + console.log('Please update CHANGES.md before publishing. Exiting.') + process.exit(1) + } + + console.log('\nRunning tests, docs, and builds (test-build)...') + try { + run('npm run test-build') + } catch (error) { + console.error('Tests/builds failed. Aborting publish.') + process.exit(1) + } + + const doCommit = await prompt('\nCreate git commit and tag for this release before publishing? [y/N]: ') + if (!confirmYes(doCommit)) { + console.log('Publish aborted by user.') + process.exit(0) + } + + if (!inGitRepo()) { + console.error('Git repository not detected; cannot create commit/tag.') + process.exit(1) + } + + const releaseNameInput = await prompt(`Release name for commit/tag (default ${defaultReleaseName}): `) + const releaseName = releaseNameInput || defaultReleaseName + + console.log('\nCreating commit and tag...') + const filesToStage = [ + changesPath, + rootPackagePath, + packageLockPath, + ...workspacePackages + ] + run(`git add ${filesToStage.map(quoteArg).join(' ')}`) + run(`git commit -m ${quoteArg(releaseName)}`) + run(`git tag ${quoteArg(releaseName)}`) + + console.log('\nPublishing packages to npm...') + run('npm publish --workspaces --include-workspace-root') + + console.log(`\nDone. Published ${releaseName}.`) +} + +main().catch(err => { + console.error(err) + process.exit(1) +}) diff --git a/scripts/run-e2e.mjs b/scripts/run-e2e.mjs index 3621fdb4..3fda463f 100644 --- a/scripts/run-e2e.mjs +++ b/scripts/run-e2e.mjs @@ -37,6 +37,14 @@ const ensureBrowser = async () => { } } +const ensureBuild = async () => { + const distIndex = join(process.cwd(), 'dist', 'editor', 'index.html') + if (existsSync(distIndex)) return + + console.log('Building dist/editor for Playwright preview (missing build output)...') + await run('npm', ['run', 'build']) +} + const seedNycFromVitest = async () => { const vitestCoverage = join(process.cwd(), 'coverage', 'coverage-final.json') if (existsSync(vitestCoverage)) { @@ -48,6 +56,7 @@ const seedNycFromVitest = async () => { if (await hasPlaywright()) { await ensureBrowser() + await ensureBuild() await run('rimraf', ['.nyc_output/*'], { shell: true }) await seedNycFromVitest() await run('npx', ['playwright', 'test']) diff --git a/scripts/version-bump.mjs b/scripts/version-bump.mjs new file mode 100644 index 00000000..9b058710 --- /dev/null +++ b/scripts/version-bump.mjs @@ -0,0 +1,153 @@ +#!/usr/bin/env node +import { execSync } from 'node:child_process' +import { readdirSync, readFileSync, writeFileSync } from 'node:fs' +import { join } from 'node:path' +import readline from 'node:readline' + +const rootDir = process.cwd() +const rootPackagePath = join(rootDir, 'package.json') + +function readJson (path) { + return JSON.parse(readFileSync(path, 'utf8')) +} + +function writeJson (path, data) { + writeFileSync(path, JSON.stringify(data, null, 2) + '\n') +} + +function parseSemver (version) { + const match = /^(\d+)\.(\d+)\.(\d+)$/.exec(version.trim()) + if (!match) return null + return match.slice(1).map(Number) +} + +function bumpVersion (version, type) { + const parsed = parseSemver(version) + if (!parsed) throw new Error(`Invalid semver: ${version}`) + const [major, minor, patch] = parsed + if (type === 'patch') return `${major}.${minor}.${patch + 1}` + if (type === 'minor') return `${major}.${minor + 1}.0` + if (type === 'major') return `${major + 1}.0.0` + throw new Error(`Unknown bump type: ${type}`) +} + +function isGreaterVersion (a, b) { + const pa = parseSemver(a) + const pb = parseSemver(b) + if (!pa || !pb) return false + for (let i = 0; i < 3; i += 1) { + if (pa[i] > pb[i]) return true + if (pa[i] < pb[i]) return false + } + return false +} + +function expandWorkspaces (patterns) { + const expanded = [] + for (const pattern of patterns) { + if (!pattern.includes('*')) { + expanded.push(pattern) + continue + } + const [prefix, suffix] = pattern.split('*') + const baseDir = join(rootDir, prefix || '.') + const entries = readdirSync(baseDir, { withFileTypes: true }) + for (const entry of entries) { + if (entry.isDirectory()) { + expanded.push(join(prefix, entry.name, suffix)) + } + } + } + return expanded +} + +async function prompt (question) { + const rl = readline.createInterface({ + input: process.stdin, + output: process.stdout + }) + const answer = await new Promise(resolve => rl.question(question, resolve)) + rl.close() + return answer.trim() +} + +function loadPackages () { + const rootPackage = readJson(rootPackagePath) + const workspacePatterns = Array.isArray(rootPackage.workspaces) + ? rootPackage.workspaces + : rootPackage.workspaces?.packages ?? [] + const workspacePaths = expandWorkspaces(workspacePatterns) + const workspaces = workspacePaths.map(path => { + const packagePath = join(rootDir, path, 'package.json') + return { path, packagePath, pkg: readJson(packagePath) } + }) + return { rootPackage, workspaces } +} + +async function chooseVersion (current) { + const suggestions = { + patch: bumpVersion(current, 'patch'), + minor: bumpVersion(current, 'minor'), + major: bumpVersion(current, 'major') + } + console.log('\nSuggested bumps:') + console.log(`- patch: ${suggestions.patch}`) + console.log(`- minor: ${suggestions.minor}`) + console.log(`- major: ${suggestions.major}`) + while (true) { + const answer = await prompt(`\nNew version [p/m/M/custom] (default patch: ${suggestions.patch}): `) + const trimmed = answer.trim() + const lower = trimmed.toLowerCase() + const chosen = !trimmed + ? suggestions.patch + : lower === 'p' || lower === 'patch' + ? suggestions.patch + : lower === 'm' || lower === 'minor' + ? suggestions.minor + : trimmed === 'M' || lower === 'major' + ? suggestions.major + : trimmed + if (!parseSemver(chosen)) { + console.log(`Invalid semver: ${chosen}. Expected format x.y.z`) + continue + } + if (!isGreaterVersion(chosen, current)) { + console.log(`Version must be greater than current (${current}).`) + continue + } + return chosen + } +} + +async function main () { + const { rootPackage, workspaces } = loadPackages() + console.log('Current versions:') + console.log(`- ${rootPackage.name} (root): ${rootPackage.version}`) + for (const ws of workspaces) { + console.log(`- ${ws.pkg.name} (${ws.path}): ${ws.pkg.version}`) + } + + const newVersion = await chooseVersion(rootPackage.version) + + console.log(`\nUpdating all packages to ${newVersion}...`) + rootPackage.version = newVersion + writeJson(rootPackagePath, rootPackage) + for (const ws of workspaces) { + ws.pkg.version = newVersion + writeJson(ws.packagePath, ws.pkg) + } + + console.log('Refreshing package-lock.json...') + execSync('npm install --package-lock-only --workspaces --include-workspace-root', { + stdio: 'inherit', + cwd: rootDir + }) + + console.log('\nDone.') + console.log(`\nMake sure to update any relevant documentation and changelogs for version ${newVersion}...`) +} + +main().catch(err => { + console.error(err) + process.exit(1) +}) diff --git a/src/editor/extensions/ext-layer_view/locale/zh-CN.js b/src/editor/extensions/ext-layer_view/locale/zh-CN.js index ade61deb..2e62301f 100644 --- a/src/editor/extensions/ext-layer_view/locale/zh-CN.js +++ b/src/editor/extensions/ext-layer_view/locale/zh-CN.js @@ -2,7 +2,6 @@ * @file * @module * @author Qscy qscy2011@sina.com - * @LastEditors Qscy qscy2011@sina.com */ export default { name: '图层视图',