jqtree 1.6.2 → 1.7.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.eslintrc +3 -12
- package/.github/workflows/ci.yml +57 -30
- package/.github/workflows/codeql-analysis.yml +9 -5
- package/.prettier +3 -0
- package/.tool-versions +1 -0
- package/README.md +12 -9
- package/bower.json +10 -3
- package/{.postcssrc → config/.postcssrc} +0 -0
- package/{babel.config.json → config/babel.config.json} +0 -0
- package/{babel.coverage.config.json → config/babel.coverage.config.json} +0 -0
- package/{jest-jsdom.config.js → config/jest.config.js} +8 -3
- package/config/playwright.config.js +18 -0
- package/config/production +4 -0
- package/{rollup.config.js → config/rollup.config.mjs} +3 -8
- package/{jqtree.postcss → css/jqtree.postcss} +0 -0
- package/devserver/index.html +1 -9
- package/docs/Gemfile +2 -0
- package/docs/Gemfile.lock +263 -0
- package/{_config.yml → docs/_config.yml} +8 -1
- package/{_entries → docs/_entries}/01_general.md +0 -0
- package/{_entries → docs/_entries}/02_introduction.md +0 -0
- package/{_entries → docs/_entries}/03_features.md +1 -1
- package/{_entries → docs/_entries}/04_demo.html +1 -7
- package/{_entries → docs/_entries}/05_requirements.md +0 -0
- package/{_entries → docs/_entries}/06_downloads.md +0 -0
- package/{_entries → docs/_entries}/07_tutorial.md +0 -0
- package/{_entries → docs/_entries}/08_examples.md +0 -0
- package/{_entries → docs/_entries}/09_usecases.md +0 -0
- package/{_entries → docs/_entries}/10_changelog.md +13 -0
- package/{_entries → docs/_entries}/11_options.md +0 -0
- package/{_entries → docs/_entries}/12_animationspeed.md +0 -0
- package/{_entries → docs/_entries}/13_autoescape.md +0 -0
- package/{_entries → docs/_entries}/14_autoopen.md +0 -0
- package/{_entries → docs/_entries}/15_buttonleft.md +0 -0
- package/{_entries → docs/_entries}/16_closedicon.md +0 -0
- package/{_entries → docs/_entries}/17_data.md +0 -0
- package/{_entries → docs/_entries}/18_datafilter.md +0 -0
- package/{_entries → docs/_entries}/19_data-url.md +0 -0
- package/{_entries → docs/_entries}/20_draganddrop.md +0 -0
- package/{_entries → docs/_entries}/21_keyboardsupport.md +0 -0
- package/{_entries → docs/_entries}/22_oncanmove.md +0 -0
- package/{_entries → docs/_entries}/23_oncanmoveto.md +2 -2
- package/{_entries → docs/_entries}/24_oncanselectnode.md +0 -0
- package/{_entries → docs/_entries}/25_oncreateli.md +2 -2
- package/{_entries → docs/_entries}/26_ondragmove.md +0 -0
- package/{_entries → docs/_entries}/27_ondragstop.md +0 -0
- package/{_entries → docs/_entries}/28_onismovehandle.md +0 -0
- package/{_entries → docs/_entries}/29_onloadfailed.md +0 -0
- package/{_entries → docs/_entries}/30_onloading.md +2 -2
- package/{_entries → docs/_entries}/31_openedicon.md +0 -0
- package/{_entries → docs/_entries}/32_openfolderdelay.md +2 -0
- package/{_entries → docs/_entries}/33_rtl.md +0 -0
- package/{_entries → docs/_entries}/34_savestate.md +0 -0
- package/{_entries → docs/_entries}/35_selectable.md +0 -0
- package/{_entries → docs/_entries}/36_showemptyfolder.md +0 -0
- package/{_entries → docs/_entries}/37_slide.md +0 -0
- package/{_entries → docs/_entries}/38_start_dnd_delay.md +0 -0
- package/{_entries → docs/_entries}/39_tabindex.md +0 -0
- package/{_entries → docs/_entries}/40_usecontextmenu.md +0 -0
- package/{_entries → docs/_entries}/41_functions.md +0 -0
- package/{_entries → docs/_entries}/42_addparentnode.md +1 -1
- package/{_entries → docs/_entries}/43_addnodeafter.md +1 -1
- package/{_entries → docs/_entries}/44_addnodebefore.md +1 -1
- package/{_entries → docs/_entries}/45_appendnode.md +5 -5
- package/{_entries → docs/_entries}/46_closenode.md +0 -0
- package/{_entries → docs/_entries}/47_destroy.md +0 -0
- package/{_entries → docs/_entries}/48_getnodebycallback.md +0 -0
- package/{_entries → docs/_entries}/49_getnodebyid.md +0 -0
- package/{_entries → docs/_entries}/50_getnodebyhtmlelement.md +2 -2
- package/{_entries → docs/_entries}/51_getselectednode.md +0 -0
- package/{_entries → docs/_entries}/52_getstate.md +0 -0
- package/{_entries → docs/_entries}/53_gettree.md +1 -1
- package/{_entries → docs/_entries}/54_isdragging.md +1 -1
- package/{_entries → docs/_entries}/55_loaddata.md +3 -3
- package/{_entries → docs/_entries}/56_loaddatafromurl.md +4 -4
- package/{_entries → docs/_entries}/57_movedown.md +0 -0
- package/{_entries → docs/_entries}/58_movenode.md +3 -3
- package/{_entries → docs/_entries}/59_moveup.md +0 -0
- package/{_entries → docs/_entries}/60_opennode.md +3 -3
- package/docs/_entries/61_prependnode.md +21 -0
- package/{_entries → docs/_entries}/62_refresh.md +0 -0
- package/{_entries → docs/_entries}/63_reload.md +2 -2
- package/{_entries → docs/_entries}/64_removenode.md +0 -0
- package/{_entries → docs/_entries}/65_selectnode.md +0 -0
- package/{_entries → docs/_entries}/66_scrolltonode.md +0 -0
- package/{_entries → docs/_entries}/67_setoption.md +0 -0
- package/{_entries → docs/_entries}/68_setstate.md +0 -0
- package/{_entries → docs/_entries}/69_toggle.md +0 -0
- package/{_entries → docs/_entries}/70_tojson.md +0 -0
- package/{_entries → docs/_entries}/71_updatenode.md +1 -1
- package/{_entries → docs/_entries}/72_events.md +0 -0
- package/{_entries → docs/_entries}/73_tree-click.md +0 -0
- package/{_entries → docs/_entries}/74_tree-close.md +0 -0
- package/{_entries → docs/_entries}/75_tree-contextmenu.md +0 -0
- package/{_entries → docs/_entries}/76_tree-dblclick.md +0 -0
- package/{_entries → docs/_entries}/77_tree-init.md +0 -0
- package/{_entries → docs/_entries}/78_tree-load-data.md +0 -0
- package/{_entries → docs/_entries}/79_tree-loading-data.md +0 -0
- package/{_entries → docs/_entries}/80_tree-move.md +0 -0
- package/{_entries → docs/_entries}/81_tree-refresh.md +0 -0
- package/{_entries → docs/_entries}/82_tree-open.md +0 -0
- package/{_entries → docs/_entries}/83_tree-select.md +0 -0
- package/{_entries → docs/_entries}/84_multiple-selection.md +0 -0
- package/{_entries → docs/_entries}/85_add-to-selection.md +0 -0
- package/{_entries → docs/_entries}/86_get-selected-nodes.md +0 -0
- package/{_entries → docs/_entries}/87_is-node-selected.md +1 -1
- package/{_entries → docs/_entries}/88_remove-from-selection.md +0 -0
- package/{_entries → docs/_entries}/89_node-functions.md +0 -0
- package/{_entries → docs/_entries}/90_children.md +0 -0
- package/{_entries → docs/_entries}/91_getdata.md +2 -2
- package/{_entries → docs/_entries}/92_getlevel.md +0 -0
- package/docs/_entries/93_getnextnode.md +15 -0
- package/{_entries → docs/_entries}/94_getnextsibling.md +0 -0
- package/{_entries/95_getpreviousnode.md → docs/_entries/95_getnextvisiblenode.md} +1 -1
- package/docs/_entries/96_getpreviousnode.md +0 -0
- package/{_entries/96_getprevioussibling.md → docs/_entries/97_getprevioussibling.md} +0 -0
- package/docs/_entries/98_getpreviousvisiblenode.md +14 -0
- package/{_entries/97_parent.md → docs/_entries/99_parent.md} +1 -1
- package/{_entries → docs/_entries}/insert.py +0 -0
- package/{_entries → docs/_entries}/renumber.py +0 -0
- package/{_examples → docs/_examples}/01_load_json_data.html +3 -5
- package/{_examples → docs/_examples}/02_load_json_data_from_server.html +3 -5
- package/{_examples → docs/_examples}/03_drag_and_drop.html +3 -5
- package/{_examples → docs/_examples}/04_save_state.html +3 -5
- package/{_examples → docs/_examples}/05_load_on_demand.html +3 -5
- package/{_examples → docs/_examples}/06_autoescape.html +3 -5
- package/{_examples → docs/_examples}/07_autoscroll.html +3 -5
- package/{_examples → docs/_examples}/08_multiple_select.html +3 -5
- package/{_examples → docs/_examples}/09_custom_html.html +3 -5
- package/{_examples → docs/_examples}/10_icon_buttons.html +3 -5
- package/{_examples → docs/_examples}/11_right-to-left.html +3 -5
- package/{_examples → docs/_examples}/12_button_on_right.html +3 -5
- package/docs/_examples/13_drag_outside.html +48 -0
- package/{_examples → docs/_examples}/14_filter.html +7 -9
- package/docs/_layouts/example.html +7 -0
- package/{_layouts/base.html → docs/_layouts/page.html} +4 -11
- package/docs/documentation.css +3 -0
- package/docs/index.html +65 -0
- package/docs/jqtree.css +189 -0
- package/docs/package.json +22 -0
- package/docs/pnpm-lock.yaml +798 -0
- package/docs/postcss.config.js +7 -0
- package/{static → docs/static}/bower.json +1 -2
- package/{static → docs/static}/bower_components/fontawesome/css/all.min.css +0 -0
- package/{static → docs/static}/bower_components/fontawesome/webfonts/fa-brands-400.eot +0 -0
- package/{static → docs/static}/bower_components/fontawesome/webfonts/fa-brands-400.svg +0 -0
- package/{static → docs/static}/bower_components/fontawesome/webfonts/fa-brands-400.ttf +0 -0
- package/{static → docs/static}/bower_components/fontawesome/webfonts/fa-brands-400.woff +0 -0
- package/{static → docs/static}/bower_components/fontawesome/webfonts/fa-brands-400.woff2 +0 -0
- package/{static → docs/static}/bower_components/fontawesome/webfonts/fa-regular-400.eot +0 -0
- package/{static → docs/static}/bower_components/fontawesome/webfonts/fa-regular-400.svg +0 -0
- package/{static → docs/static}/bower_components/fontawesome/webfonts/fa-regular-400.ttf +0 -0
- package/{static → docs/static}/bower_components/fontawesome/webfonts/fa-regular-400.woff +0 -0
- package/{static → docs/static}/bower_components/fontawesome/webfonts/fa-regular-400.woff2 +0 -0
- package/{static → docs/static}/bower_components/fontawesome/webfonts/fa-solid-900.eot +0 -0
- package/{static → docs/static}/bower_components/fontawesome/webfonts/fa-solid-900.svg +0 -0
- package/{static → docs/static}/bower_components/fontawesome/webfonts/fa-solid-900.ttf +0 -0
- package/{static → docs/static}/bower_components/fontawesome/webfonts/fa-solid-900.woff +0 -0
- package/{static → docs/static}/bower_components/fontawesome/webfonts/fa-solid-900.woff2 +0 -0
- package/{static → docs/static}/bower_components/jquery/dist/jquery.js +209 -97
- package/docs/static/bower_components/jquery/dist/jquery.min.js +2 -0
- package/{static → docs/static}/bower_components/jquery-mockjax/dist/jquery.mockjax.js +0 -0
- package/docs/static/documentation.css +1453 -0
- package/docs/static/documentation.js +26 -0
- package/{static → docs/static}/example.css +5 -38
- package/{static → docs/static}/example.postcss +5 -35
- package/{static → docs/static}/example_data.js +0 -0
- package/{static → docs/static}/examples/autoescape.js +0 -0
- package/{static → docs/static}/examples/autoscroll.js +0 -0
- package/{static → docs/static}/examples/button-on-right.js +0 -0
- package/{static → docs/static}/examples/custom_html.js +5 -9
- package/{static → docs/static}/examples/drag-outside.js +0 -0
- package/{static → docs/static}/examples/drag_and_drop.js +0 -0
- package/{static → docs/static}/examples/filter.js +2 -2
- package/{static → docs/static}/examples/icon_buttons.js +0 -0
- package/{static → docs/static}/examples/load_json_data.js +0 -0
- package/{static → docs/static}/examples/load_json_data_from_server.js +0 -0
- package/{static → docs/static}/examples/load_on_demand.js +0 -0
- package/{static → docs/static}/examples/multiple_select.js +0 -0
- package/{static → docs/static}/examples/right-to-left.js +0 -0
- package/{static → docs/static}/examples/save_state.js +0 -0
- package/{static → docs/static}/monokai.css +0 -0
- package/{static → docs/static}/spinner.gif +0 -0
- package/docs/tailwind.config.js +16 -0
- package/docs/tree.jquery.js +21 -0
- package/lib/dataLoader.js +5 -31
- package/lib/dragAndDropHandler.js +26 -135
- package/lib/elementsRenderer.js +29 -59
- package/lib/keyHandler.js +8 -32
- package/lib/mouse.widget.js +16 -77
- package/lib/node.js +60 -125
- package/lib/nodeElement.js +8 -75
- package/lib/playwright/coverage.js +101 -0
- package/lib/playwright/playwright.test.js +212 -182
- package/lib/playwright/testUtils.js +201 -0
- package/lib/saveStateHandler.js +12 -61
- package/lib/scrollHandler.js +17 -74
- package/lib/selectNodeHandler.js +5 -24
- package/lib/simple.widget.js +18 -53
- package/lib/test/jqTree/create.test.js +0 -4
- package/lib/test/jqTree/events.test.js +10 -16
- package/lib/test/jqTree/keyboard.test.js +0 -6
- package/lib/test/jqTree/loadOnDemand.test.js +107 -139
- package/lib/test/jqTree/methods.test.js +136 -159
- package/lib/test/jqTree/options.test.js +53 -63
- package/lib/test/node.test.js +127 -72
- package/lib/test/nodeUtil.test.js +0 -1
- package/lib/test/support/jqTreeMatchers.js +4 -9
- package/lib/test/support/setupTests.js +0 -4
- package/lib/test/support/testUtil.js +2 -11
- package/lib/test/support/treeStructure.js +0 -6
- package/lib/test/util.test.js +0 -1
- package/lib/tree.jquery.js +32 -243
- package/lib/util.js +0 -6
- package/lib/version.js +1 -1
- package/package.json +54 -54
- package/src/dragAndDropHandler.ts +8 -4
- package/src/jqtreeOptions.ts +1 -1
- package/src/keyHandler.ts +3 -3
- package/src/node.ts +43 -12
- package/src/playwright/.eslintrc +2 -2
- package/src/playwright/coverage.ts +41 -0
- package/src/playwright/playwright.test.ts +50 -52
- package/src/playwright/playwright.test.ts-snapshots/with-dragAndDrop-moves-a-node-1-Chromium-darwin.png +0 -0
- package/src/playwright/playwright.test.ts-snapshots/with-dragAndDrop-moves-a-node-1-Chromium-linux.png +0 -0
- package/src/playwright/playwright.test.ts-snapshots/without-dragAndDrop-displays-a-tree-1-Chromium-darwin.png +0 -0
- package/src/playwright/playwright.test.ts-snapshots/without-dragAndDrop-displays-a-tree-1-Chromium-linux.png +0 -0
- package/src/playwright/playwright.test.ts-snapshots/without-dragAndDrop-selects-a-node-1-Chromium-darwin.png +0 -0
- package/src/playwright/playwright.test.ts-snapshots/without-dragAndDrop-selects-a-node-1-Chromium-linux.png +0 -0
- package/src/playwright/testUtils.ts +122 -0
- package/src/test/.eslintrc +15 -3
- package/src/test/jqTree/events.test.ts +10 -9
- package/src/test/jqTree/loadOnDemand.test.ts +10 -10
- package/src/test/jqTree/methods.test.ts +37 -45
- package/src/test/jqTree/options.test.ts +26 -28
- package/src/test/node.test.ts +146 -54
- package/src/tree.jquery.d.ts +1 -1
- package/src/tree.jquery.ts +6 -5
- package/src/version.ts +1 -1
- package/tree.jquery.debug.js +217 -867
- package/tree.jquery.debug.js.map +1 -1
- package/tree.jquery.js +3 -3
- package/tree.jquery.js.map +1 -1
- package/_entries/61_prependnode.md +0 -21
- package/_entries/93_getnextnode.md +0 -12
- package/_examples/13_drag_outside.html +0 -26
- package/_layouts/frontpage.html +0 -20
- package/_layouts/page.html +0 -7
- package/index.html +0 -48
- package/jest-browser.config.js +0 -15
- package/jest-playwright.config.js +0 -21
- package/jest.config.js +0 -8
- package/lib/playwright/testUtil.js +0 -459
- package/lib/playwright/visualRegression.js +0 -193
- package/production +0 -5
- package/src/playwright/screenshots/displays_a_tree_Desktop.png +0 -0
- package/src/playwright/screenshots/displays_a_tree_iPhone 6.png +0 -0
- package/src/playwright/screenshots/moves_a_node_Desktop.png +0 -0
- package/src/playwright/screenshots/moves_a_node_iPhone 6.png +0 -0
- package/src/playwright/screenshots/opens_a_node_Desktop.png +0 -0
- package/src/playwright/screenshots/opens_a_node_iPhone 6.png +0 -0
- package/src/playwright/screenshots/selects_a_node_Desktop.png +0 -0
- package/src/playwright/screenshots/selects_a_node_iPhone 6.png +0 -0
- package/src/playwright/testUtil.ts +0 -170
- package/src/playwright/visualRegression.ts +0 -88
- package/static/bower_components/bootstrap/dist/css/bootstrap-theme.min.css +0 -6
- package/static/bower_components/bootstrap/dist/css/bootstrap.min.css +0 -6
- package/static/bower_components/bootstrap/dist/fonts/glyphicons-halflings-regular.eot +0 -0
- package/static/bower_components/bootstrap/dist/fonts/glyphicons-halflings-regular.svg +0 -288
- package/static/bower_components/bootstrap/dist/fonts/glyphicons-halflings-regular.ttf +0 -0
- package/static/bower_components/bootstrap/dist/fonts/glyphicons-halflings-regular.woff +0 -0
- package/static/bower_components/bootstrap/dist/fonts/glyphicons-halflings-regular.woff2 +0 -0
- package/static/bower_components/bootstrap/dist/js/bootstrap.min.js +0 -6
- package/static/bower_components/jquery/dist/jquery.min.js +0 -2
- package/static/documentation.css +0 -171
- package/static/documentation.js +0 -48
package/lib/util.js
CHANGED
|
@@ -4,21 +4,15 @@ Object.defineProperty(exports, "__esModule", {
|
|
|
4
4
|
value: true
|
|
5
5
|
});
|
|
6
6
|
exports.isInt = exports.isFunction = exports.getBoolString = void 0;
|
|
7
|
-
|
|
8
7
|
var isInt = function isInt(n) {
|
|
9
8
|
return typeof n === "number" && n % 1 === 0;
|
|
10
9
|
};
|
|
11
|
-
|
|
12
10
|
exports.isInt = isInt;
|
|
13
|
-
|
|
14
11
|
var isFunction = function isFunction(v) {
|
|
15
12
|
return typeof v === "function";
|
|
16
13
|
};
|
|
17
|
-
|
|
18
14
|
exports.isFunction = isFunction;
|
|
19
|
-
|
|
20
15
|
var getBoolString = function getBoolString(value) {
|
|
21
16
|
return value ? "true" : "false";
|
|
22
17
|
};
|
|
23
|
-
|
|
24
18
|
exports.getBoolString = getBoolString;
|
package/lib/version.js
CHANGED
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "jqtree",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.7.0",
|
|
4
4
|
"description": "Tree widget for jQuery",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"jquery-plugin",
|
|
@@ -14,69 +14,69 @@
|
|
|
14
14
|
"url": "https://github.com/mbraak/jqtree"
|
|
15
15
|
},
|
|
16
16
|
"scripts": {
|
|
17
|
-
"ci": "pnpm
|
|
18
|
-
"
|
|
19
|
-
"
|
|
20
|
-
"test-watch": "jest --watch",
|
|
17
|
+
"ci": "pnpm lint && pnpm tsc && pnpm test",
|
|
18
|
+
"jest": "jest --coverage --no-cache --verbose --config ./config/jest.config.js",
|
|
19
|
+
"jest-watch": "jest --watch --config ./config/jest.config.js",
|
|
21
20
|
"lint": "eslint src/ --ext .ts,.tsx",
|
|
22
|
-
"production": "./production",
|
|
23
|
-
"
|
|
24
|
-
"
|
|
25
|
-
"
|
|
26
|
-
"
|
|
27
|
-
"
|
|
28
|
-
"coveralls": "nyc report --reporter=text-lcov | coveralls",
|
|
21
|
+
"production": "./config/production",
|
|
22
|
+
"devserver": "SERVE=true rollup --config config/rollup.config.mjs --watch",
|
|
23
|
+
"devserver-with-coverage": "COVERAGE=true SERVE=true rollup --config config/rollup.config.mjs",
|
|
24
|
+
"build-with-coverage": "COVERAGE=true rollup --config config/rollup.config.mjs",
|
|
25
|
+
"prettier": "prettier src/*.ts --write --tab-width 4",
|
|
26
|
+
"write-coverage": "nyc report --reporter=text-lcov > lcov.info",
|
|
29
27
|
"tsc": "tsc --noEmit --project tsconfig.json",
|
|
30
28
|
"merge-coverage": "cp jest-coverage/coverage-final.json .nyc_output/coverage_jsdom.json",
|
|
31
|
-
"clean-coverage": "rm -rf
|
|
32
|
-
"print-coverage": "nyc report"
|
|
29
|
+
"clean-coverage": "rm -rf .nyc_output && jest --clearCache",
|
|
30
|
+
"print-coverage": "nyc report",
|
|
31
|
+
"playwright": "pnpm build-with-coverage && playwright test --config config/playwright.config.js",
|
|
32
|
+
"test": "pnpm jest && pnpm playwright"
|
|
33
33
|
},
|
|
34
34
|
"dependencies": {
|
|
35
|
-
"jquery": "^3.6.
|
|
35
|
+
"jquery": "^3.6.3"
|
|
36
36
|
},
|
|
37
37
|
"devDependencies": {
|
|
38
|
-
"@babel/cli": "^7.
|
|
39
|
-
"@babel/core": "^7.
|
|
40
|
-
"@babel/preset-env": "^7.
|
|
41
|
-
"@babel/preset-typescript": "^7.
|
|
42
|
-
"@
|
|
43
|
-
"@rollup/plugin-
|
|
44
|
-
"@
|
|
45
|
-
"@
|
|
46
|
-
"@
|
|
47
|
-
"@types/
|
|
48
|
-
"@
|
|
49
|
-
"@
|
|
50
|
-
"
|
|
51
|
-
"
|
|
38
|
+
"@babel/cli": "^7.20.7",
|
|
39
|
+
"@babel/core": "^7.20.7",
|
|
40
|
+
"@babel/preset-env": "^7.20.2",
|
|
41
|
+
"@babel/preset-typescript": "^7.18.6",
|
|
42
|
+
"@playwright/test": "^1.29.1",
|
|
43
|
+
"@rollup/plugin-babel": "^6.0.3",
|
|
44
|
+
"@rollup/plugin-node-resolve": "^15.0.1",
|
|
45
|
+
"@rollup/plugin-terser": "^0.1.0",
|
|
46
|
+
"@testing-library/dom": "^8.19.0",
|
|
47
|
+
"@types/debug": "^4.1.7",
|
|
48
|
+
"@types/jest": "^29.2.4",
|
|
49
|
+
"@types/jquery": "^3.5.14",
|
|
50
|
+
"@types/node": "^18.11.17",
|
|
51
|
+
"@typescript-eslint/eslint-plugin": "^5.47.0",
|
|
52
|
+
"@typescript-eslint/parser": "^5.47.0",
|
|
53
|
+
"autoprefixer": "^10.4.13",
|
|
54
|
+
"babel-jest": "^29.3.1",
|
|
52
55
|
"babel-plugin-istanbul": "^6.1.1",
|
|
53
|
-
"
|
|
54
|
-
"eslint": "^
|
|
55
|
-
"eslint-plugin-
|
|
56
|
-
"eslint-plugin-
|
|
57
|
-
"eslint-plugin-
|
|
58
|
-
"eslint-plugin-testing-library": "^5.0.1",
|
|
59
|
-
"expect-playwright": "^0.8.0",
|
|
56
|
+
"eslint": "^8.30.0",
|
|
57
|
+
"eslint-plugin-import": "^2.26.0",
|
|
58
|
+
"eslint-plugin-jest": "^27.1.7",
|
|
59
|
+
"eslint-plugin-playwright": "^0.11.2",
|
|
60
|
+
"eslint-plugin-testing-library": "^5.9.1",
|
|
60
61
|
"givens": "^1.3.9",
|
|
61
|
-
"
|
|
62
|
-
"jest
|
|
63
|
-
"jest-
|
|
62
|
+
"graphql": "^16.6.0",
|
|
63
|
+
"jest": "^29.3.1",
|
|
64
|
+
"jest-environment-jsdom": "^29.3.1",
|
|
65
|
+
"jest-extended": "^3.2.0",
|
|
64
66
|
"jsonfile": "^6.1.0",
|
|
65
67
|
"lodash.template": "^4.5.0",
|
|
66
|
-
"msw": "^0.
|
|
67
|
-
"
|
|
68
|
-
"playwright": "^1.
|
|
69
|
-
"
|
|
70
|
-
"postcss": "^
|
|
71
|
-
"postcss-
|
|
72
|
-
"postcss-load-config": "^
|
|
73
|
-
"postcss-nested": "^
|
|
74
|
-
"prettier": "^2.
|
|
75
|
-
"rollup": "^
|
|
76
|
-
"rollup-plugin-serve": "^
|
|
77
|
-
"
|
|
78
|
-
"
|
|
79
|
-
"tslib": "^2.3.1",
|
|
80
|
-
"typescript": "^4.5.4"
|
|
68
|
+
"msw": "^0.49.2",
|
|
69
|
+
"nyc": "^15.1.0",
|
|
70
|
+
"playwright": "^1.29.1",
|
|
71
|
+
"postcss": "^8.4.20",
|
|
72
|
+
"postcss-cli": "^10.1.0",
|
|
73
|
+
"postcss-import": "^15.1.0",
|
|
74
|
+
"postcss-load-config": "^4.0.1",
|
|
75
|
+
"postcss-nested": "^6.0.0",
|
|
76
|
+
"prettier": "^2.8.1",
|
|
77
|
+
"rollup": "^3.8.1",
|
|
78
|
+
"rollup-plugin-serve": "^2.0.2",
|
|
79
|
+
"tslib": "^2.4.1",
|
|
80
|
+
"typescript": "~4.9.4"
|
|
81
81
|
}
|
|
82
82
|
}
|
|
@@ -312,10 +312,14 @@ export class DragAndDropHandler {
|
|
|
312
312
|
|
|
313
313
|
this.stopOpenFolderTimer();
|
|
314
314
|
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
|
|
315
|
+
const openFolderDelay = this.treeWidget.options.openFolderDelay;
|
|
316
|
+
|
|
317
|
+
if (openFolderDelay !== false) {
|
|
318
|
+
this.openFolderTimer = window.setTimeout(
|
|
319
|
+
openFolder,
|
|
320
|
+
openFolderDelay
|
|
321
|
+
);
|
|
322
|
+
}
|
|
319
323
|
}
|
|
320
324
|
|
|
321
325
|
private stopOpenFolderTimer(): void {
|
package/src/jqtreeOptions.ts
CHANGED
|
@@ -40,7 +40,7 @@ export interface JQTreeOptions {
|
|
|
40
40
|
onLoading: HandleLoadingMethod | undefined;
|
|
41
41
|
onSetStateFromStorage: ((data: string) => void) | undefined;
|
|
42
42
|
openedIcon: string | Element;
|
|
43
|
-
openFolderDelay: number;
|
|
43
|
+
openFolderDelay: number | false;
|
|
44
44
|
rtl: boolean | undefined;
|
|
45
45
|
selectable: boolean;
|
|
46
46
|
saveState: boolean | string;
|
package/src/keyHandler.ts
CHANGED
|
@@ -22,11 +22,11 @@ export default class KeyHandler {
|
|
|
22
22
|
}
|
|
23
23
|
|
|
24
24
|
public moveDown(selectedNode: Node): boolean {
|
|
25
|
-
return this.selectNode(selectedNode.
|
|
25
|
+
return this.selectNode(selectedNode.getNextVisibleNode());
|
|
26
26
|
}
|
|
27
27
|
|
|
28
28
|
public moveUp(selectedNode: Node): boolean {
|
|
29
|
-
return this.selectNode(selectedNode.
|
|
29
|
+
return this.selectNode(selectedNode.getPreviousVisibleNode());
|
|
30
30
|
}
|
|
31
31
|
|
|
32
32
|
public moveRight(selectedNode: Node): boolean {
|
|
@@ -36,7 +36,7 @@ export default class KeyHandler {
|
|
|
36
36
|
// folder node
|
|
37
37
|
if (selectedNode.is_open) {
|
|
38
38
|
// Right moves to the first child of an open node
|
|
39
|
-
return this.selectNode(selectedNode.
|
|
39
|
+
return this.selectNode(selectedNode.getNextVisibleNode());
|
|
40
40
|
} else {
|
|
41
41
|
// Right expands a closed node
|
|
42
42
|
this.treeWidget.openNode(selectedNode);
|
package/src/node.ts
CHANGED
|
@@ -557,7 +557,23 @@ export class Node implements INode {
|
|
|
557
557
|
}
|
|
558
558
|
|
|
559
559
|
public getNextNode(includeChildren = true): Node | null {
|
|
560
|
-
if (includeChildren && this.hasChildren()
|
|
560
|
+
if (includeChildren && this.hasChildren()) {
|
|
561
|
+
return this.children[0];
|
|
562
|
+
} else if (!this.parent) {
|
|
563
|
+
return null;
|
|
564
|
+
} else {
|
|
565
|
+
const nextSibling = this.getNextSibling();
|
|
566
|
+
|
|
567
|
+
if (nextSibling) {
|
|
568
|
+
return nextSibling;
|
|
569
|
+
} else {
|
|
570
|
+
return this.parent.getNextNode(false);
|
|
571
|
+
}
|
|
572
|
+
}
|
|
573
|
+
}
|
|
574
|
+
|
|
575
|
+
public getNextVisibleNode(): Node | null {
|
|
576
|
+
if (this.hasChildren() && this.is_open) {
|
|
561
577
|
// First child
|
|
562
578
|
return this.children[0];
|
|
563
579
|
} else {
|
|
@@ -581,19 +597,34 @@ export class Node implements INode {
|
|
|
581
597
|
return null;
|
|
582
598
|
} else {
|
|
583
599
|
const previousSibling = this.getPreviousSibling();
|
|
584
|
-
|
|
585
|
-
|
|
586
|
-
|
|
587
|
-
|
|
588
|
-
)
|
|
589
|
-
// Previous sibling
|
|
590
|
-
return previousSibling;
|
|
591
|
-
} else {
|
|
592
|
-
// Last child of previous sibling
|
|
593
|
-
return previousSibling.getLastChild();
|
|
594
|
-
}
|
|
600
|
+
|
|
601
|
+
if (!previousSibling) {
|
|
602
|
+
return this.getParent();
|
|
603
|
+
} else if (previousSibling.hasChildren()) {
|
|
604
|
+
return previousSibling.getLastChild();
|
|
595
605
|
} else {
|
|
606
|
+
return previousSibling;
|
|
607
|
+
}
|
|
608
|
+
}
|
|
609
|
+
}
|
|
610
|
+
|
|
611
|
+
public getPreviousVisibleNode(): Node | null {
|
|
612
|
+
if (!this.parent) {
|
|
613
|
+
return null;
|
|
614
|
+
} else {
|
|
615
|
+
const previousSibling = this.getPreviousSibling();
|
|
616
|
+
|
|
617
|
+
if (!previousSibling) {
|
|
596
618
|
return this.getParent();
|
|
619
|
+
} else if (
|
|
620
|
+
!previousSibling.hasChildren() ||
|
|
621
|
+
!previousSibling.is_open
|
|
622
|
+
) {
|
|
623
|
+
// Previous sibling
|
|
624
|
+
return previousSibling;
|
|
625
|
+
} else {
|
|
626
|
+
// Last child of previous sibling
|
|
627
|
+
return previousSibling.getLastChild();
|
|
597
628
|
}
|
|
598
629
|
}
|
|
599
630
|
}
|
package/src/playwright/.eslintrc
CHANGED
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import fs from "fs";
|
|
2
|
+
import path from "path";
|
|
3
|
+
import crypto from "crypto";
|
|
4
|
+
import { BrowserContext } from "@playwright/test";
|
|
5
|
+
|
|
6
|
+
const istanbulCLIOutput = path.join(process.cwd(), ".nyc_output");
|
|
7
|
+
|
|
8
|
+
const generateUUID = () => crypto.randomBytes(16).toString("hex");
|
|
9
|
+
|
|
10
|
+
export const initCoverage = async (context: BrowserContext) => {
|
|
11
|
+
await fs.promises.mkdir(istanbulCLIOutput, { recursive: true });
|
|
12
|
+
|
|
13
|
+
await context.exposeFunction(
|
|
14
|
+
"collectIstanbulCoverage",
|
|
15
|
+
(coverageJSON: string) => {
|
|
16
|
+
if (!coverageJSON) {
|
|
17
|
+
console.log("No coverage");
|
|
18
|
+
} else {
|
|
19
|
+
const filename = path.join(
|
|
20
|
+
istanbulCLIOutput,
|
|
21
|
+
`playwright_coverage_${generateUUID()}.json`
|
|
22
|
+
);
|
|
23
|
+
console.log(`Writing coverage to ${filename}`);
|
|
24
|
+
fs.writeFileSync(filename, coverageJSON);
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
);
|
|
28
|
+
};
|
|
29
|
+
|
|
30
|
+
export const saveCoverage = async (context: BrowserContext) => {
|
|
31
|
+
for (const page of context.pages()) {
|
|
32
|
+
await page.evaluate(() => {
|
|
33
|
+
// eslint-disable-next-line @typescript-eslint/no-unsafe-assignment
|
|
34
|
+
const anyWindow = window as any;
|
|
35
|
+
// eslint-disable-next-line @typescript-eslint/no-unsafe-assignment, @typescript-eslint/no-unsafe-member-access
|
|
36
|
+
const coverageData = anyWindow.__coverage__;
|
|
37
|
+
// eslint-disable-next-line @typescript-eslint/no-unsafe-call, @typescript-eslint/no-unsafe-member-access
|
|
38
|
+
anyWindow.collectIstanbulCoverage(JSON.stringify(coverageData));
|
|
39
|
+
});
|
|
40
|
+
}
|
|
41
|
+
};
|
|
@@ -1,37 +1,27 @@
|
|
|
1
|
-
|
|
2
|
-
/// <reference types="expect-playwright" />
|
|
3
|
-
|
|
4
|
-
import getGiven from "givens";
|
|
1
|
+
import { test, expect, Page } from "@playwright/test";
|
|
5
2
|
import {
|
|
6
3
|
dragAndDrop,
|
|
7
|
-
expectToBeClosed,
|
|
8
|
-
expectToBeOpen,
|
|
9
|
-
expectToBeSelected,
|
|
10
4
|
findNodeElement,
|
|
11
5
|
getTreeStructure,
|
|
12
|
-
openNode,
|
|
13
6
|
selectNode,
|
|
14
|
-
} from "./
|
|
15
|
-
import {
|
|
7
|
+
} from "./testUtils";
|
|
8
|
+
import { initCoverage, saveCoverage } from "./coverage";
|
|
16
9
|
|
|
17
|
-
interface
|
|
10
|
+
interface InitPageParameters {
|
|
11
|
+
baseURL?: string;
|
|
18
12
|
dragAndDrop: boolean;
|
|
13
|
+
page: Page;
|
|
19
14
|
}
|
|
20
15
|
|
|
21
|
-
const
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
await jestPlaywright.resetPage();
|
|
16
|
+
const initPage = async ({ baseURL, dragAndDrop, page }: InitPageParameters) => {
|
|
17
|
+
if (!baseURL) {
|
|
18
|
+
throw new Error("Missing baseURL");
|
|
19
|
+
}
|
|
26
20
|
|
|
27
|
-
await page.goto(
|
|
21
|
+
await page.goto(`${baseURL}/test_index.html`);
|
|
28
22
|
await page.waitForLoadState("domcontentloaded");
|
|
29
23
|
|
|
30
|
-
|
|
31
|
-
await page.evaluate(() => {
|
|
32
|
-
// eslint-disable-next-line @typescript-eslint/no-unsafe-assignment, @typescript-eslint/no-unsafe-member-access
|
|
33
|
-
(window as any)["reportCodeCoverage"] = () => null;
|
|
34
|
-
});
|
|
24
|
+
page.on("console", (msg) => console.log(`console: ${msg.text()}`));
|
|
35
25
|
|
|
36
26
|
await page.evaluate(`
|
|
37
27
|
const $tree = jQuery("#tree1");
|
|
@@ -40,51 +30,58 @@ beforeEach(async () => {
|
|
|
40
30
|
animationSpeed: 0,
|
|
41
31
|
autoOpen: 0,
|
|
42
32
|
data: ExampleData.exampleData,
|
|
43
|
-
dragAndDrop: ${
|
|
33
|
+
dragAndDrop: ${dragAndDrop},
|
|
44
34
|
startDndDelay: 100,
|
|
45
35
|
});
|
|
46
36
|
`);
|
|
47
|
-
});
|
|
48
37
|
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
38
|
+
await page.evaluate(`
|
|
39
|
+
console.log(window.__coverage__ ? 'Coverage enabled' : 'Coverage not enabled');
|
|
40
|
+
`);
|
|
41
|
+
};
|
|
52
42
|
|
|
53
|
-
|
|
54
|
-
await
|
|
55
|
-
|
|
56
|
-
await expect(page).toMatchText(/.*Coelophysoids.*/);
|
|
43
|
+
test.beforeEach(async ({ context }) => {
|
|
44
|
+
await initCoverage(context);
|
|
45
|
+
});
|
|
57
46
|
|
|
58
|
-
|
|
47
|
+
test.afterEach(async ({ context }) => {
|
|
48
|
+
await saveCoverage(context);
|
|
59
49
|
});
|
|
60
50
|
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
await expectToBeSelected(saurischia);
|
|
51
|
+
test.describe("without dragAndDrop", () => {
|
|
52
|
+
test.beforeEach(async ({ baseURL, page }) => {
|
|
53
|
+
await initPage({ baseURL, page, dragAndDrop: false });
|
|
54
|
+
});
|
|
66
55
|
|
|
67
|
-
|
|
68
|
-
|
|
56
|
+
test("displays a tree", async ({ page }) => {
|
|
57
|
+
await expect(page.locator("body")).toHaveText(/.*Saurischia.*/);
|
|
58
|
+
await expect(page.locator("body")).toHaveText(/.*Ornithischians.*/);
|
|
59
|
+
await expect(page.locator("body")).toHaveText(/.*Coelophysoids.*/);
|
|
69
60
|
|
|
70
|
-
|
|
71
|
-
|
|
61
|
+
const screenshot = await page.screenshot();
|
|
62
|
+
expect(screenshot).toMatchSnapshot();
|
|
63
|
+
});
|
|
72
64
|
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
await openNode(theropods);
|
|
76
|
-
await expectToBeOpen(theropods);
|
|
65
|
+
test("selects a node", async ({ page }) => {
|
|
66
|
+
await expect(page.locator("body")).toHaveText(/.*Saurischia.*/);
|
|
77
67
|
|
|
78
|
-
|
|
68
|
+
const saurischia = await findNodeElement(page, "Saurischia");
|
|
69
|
+
await selectNode(saurischia);
|
|
70
|
+
|
|
71
|
+
const screenshot = await page.screenshot();
|
|
72
|
+
expect(screenshot).toMatchSnapshot();
|
|
73
|
+
});
|
|
79
74
|
});
|
|
80
75
|
|
|
81
|
-
describe("dragAndDrop", () => {
|
|
82
|
-
|
|
76
|
+
test.describe("with dragAndDrop", () => {
|
|
77
|
+
test.beforeEach(async ({ baseURL, page }) => {
|
|
78
|
+
await initPage({ baseURL, page, dragAndDrop: true });
|
|
79
|
+
});
|
|
83
80
|
|
|
84
|
-
|
|
85
|
-
await dragAndDrop("Herrerasaurians", "Ornithischians");
|
|
81
|
+
test("moves a node", async ({ page }) => {
|
|
82
|
+
await dragAndDrop(page, "Herrerasaurians", "Ornithischians");
|
|
86
83
|
|
|
87
|
-
const structure = await getTreeStructure();
|
|
84
|
+
const structure = await getTreeStructure(page);
|
|
88
85
|
|
|
89
86
|
expect(structure).toEqual([
|
|
90
87
|
expect.objectContaining({
|
|
@@ -109,6 +106,7 @@ describe("dragAndDrop", () => {
|
|
|
109
106
|
}),
|
|
110
107
|
]);
|
|
111
108
|
|
|
112
|
-
await
|
|
109
|
+
const screenshot = await page.screenshot();
|
|
110
|
+
expect(screenshot).toMatchSnapshot();
|
|
113
111
|
});
|
|
114
112
|
});
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
import { Page, ElementHandle } from "@playwright/test";
|
|
2
|
+
|
|
3
|
+
const locateTitle = (page: Page, title: string) =>
|
|
4
|
+
page.locator(".jqtree-title", {
|
|
5
|
+
hasText: title,
|
|
6
|
+
});
|
|
7
|
+
|
|
8
|
+
export const findNodeElement = async (page: Page, title: string) => {
|
|
9
|
+
const titleElement = await locateTitle(page, title).elementHandle();
|
|
10
|
+
|
|
11
|
+
if (!titleElement) {
|
|
12
|
+
throw new Error(`Title element not found: ${title}`);
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
const nodeElement = await titleElement.evaluateHandle((el) => {
|
|
16
|
+
const li = el.closest("li");
|
|
17
|
+
|
|
18
|
+
if (!li) {
|
|
19
|
+
throw Error("Node element not found");
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
return li;
|
|
23
|
+
});
|
|
24
|
+
|
|
25
|
+
return nodeElement;
|
|
26
|
+
};
|
|
27
|
+
|
|
28
|
+
export const selectNode = async (nodeElement: ElementHandle) => {
|
|
29
|
+
const titleHandle = await nodeElement.$(".jqtree-title");
|
|
30
|
+
|
|
31
|
+
if (!titleHandle) {
|
|
32
|
+
throw new Error("Could not select: title element not found");
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
await titleHandle.click();
|
|
36
|
+
};
|
|
37
|
+
|
|
38
|
+
const getRect = async (elementHandle: ElementHandle<HTMLElement>) => {
|
|
39
|
+
const boundingBox = await elementHandle.boundingBox();
|
|
40
|
+
|
|
41
|
+
if (!boundingBox) {
|
|
42
|
+
throw "No bounding box";
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
return boundingBox;
|
|
46
|
+
};
|
|
47
|
+
|
|
48
|
+
export const getTreeStructure = async (page: Page) => {
|
|
49
|
+
const structure = await page.evaluate<string>(`
|
|
50
|
+
;
|
|
51
|
+
function getTreeNode($li) {
|
|
52
|
+
const $div = $li.children("div.jqtree-element");
|
|
53
|
+
const $span = $div.children("span.jqtree-title");
|
|
54
|
+
const name = $span.text();
|
|
55
|
+
const selected = $li.hasClass("jqtree-selected");
|
|
56
|
+
|
|
57
|
+
if ($li.hasClass("jqtree-folder")) {
|
|
58
|
+
const $ul = $li.children("ul.jqtree_common");
|
|
59
|
+
|
|
60
|
+
return {
|
|
61
|
+
nodeType: "folder",
|
|
62
|
+
children: getChildren($ul),
|
|
63
|
+
name,
|
|
64
|
+
open: !$li.hasClass("jqtree-closed"),
|
|
65
|
+
selected,
|
|
66
|
+
};
|
|
67
|
+
} else {
|
|
68
|
+
return {
|
|
69
|
+
nodeType: "child",
|
|
70
|
+
name,
|
|
71
|
+
selected,
|
|
72
|
+
};
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
function getChildren($ul) {
|
|
77
|
+
return $ul
|
|
78
|
+
.children("li.jqtree_common")
|
|
79
|
+
.map((_, li) => {
|
|
80
|
+
return getTreeNode(jQuery(li));
|
|
81
|
+
})
|
|
82
|
+
.get();
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
JSON.stringify(window.getChildren(jQuery("ul.jqtree-tree")));
|
|
86
|
+
`);
|
|
87
|
+
|
|
88
|
+
return JSON.parse(structure) as JQTreeMatchers.TreeStructure;
|
|
89
|
+
};
|
|
90
|
+
|
|
91
|
+
const getNodeRect = async (page: Page, title: string) => {
|
|
92
|
+
const titleElement = await locateTitle(page, title).elementHandle();
|
|
93
|
+
|
|
94
|
+
if (!titleElement) {
|
|
95
|
+
throw Error("Element not found");
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
const rect = await getRect(titleElement as ElementHandle<HTMLElement>);
|
|
99
|
+
return rect;
|
|
100
|
+
};
|
|
101
|
+
|
|
102
|
+
export const dragAndDrop = async (
|
|
103
|
+
page: Page,
|
|
104
|
+
from: string,
|
|
105
|
+
to: string
|
|
106
|
+
): Promise<void> => {
|
|
107
|
+
const fromRect = await getNodeRect(page, from);
|
|
108
|
+
const toRect = await getNodeRect(page, to);
|
|
109
|
+
|
|
110
|
+
await page.mouse.move(
|
|
111
|
+
fromRect.x + fromRect.width / 2,
|
|
112
|
+
fromRect.y + fromRect.height / 2
|
|
113
|
+
);
|
|
114
|
+
await page.mouse.down();
|
|
115
|
+
// eslint-disable-next-line playwright/no-wait-for-timeout
|
|
116
|
+
await page.waitForTimeout(200);
|
|
117
|
+
await page.mouse.move(
|
|
118
|
+
toRect.x + toRect.width / 2,
|
|
119
|
+
toRect.y + toRect.height / 2
|
|
120
|
+
);
|
|
121
|
+
await page.mouse.up();
|
|
122
|
+
};
|
package/src/test/.eslintrc
CHANGED
|
@@ -1,4 +1,16 @@
|
|
|
1
1
|
{
|
|
2
|
-
"plugins": ["testing-library"],
|
|
3
|
-
"extends": ["plugin:testing-library/dom"]
|
|
4
|
-
|
|
2
|
+
"plugins": ["jest", "testing-library"],
|
|
3
|
+
"extends": ["plugin:jest/all", "plugin:testing-library/dom"],
|
|
4
|
+
"rules": {
|
|
5
|
+
"jest/consistent-test-it": "off",
|
|
6
|
+
"jest/max-expects": ["off"],
|
|
7
|
+
"jest/no-duplicate-hooks": "off",
|
|
8
|
+
"jest/no-hooks": "off",
|
|
9
|
+
"jest/no-identical-title": "off",
|
|
10
|
+
"jest/no-standalone-expect": "off",
|
|
11
|
+
"jest/prefer-expect-assertions": "off",
|
|
12
|
+
"jest/prefer-strict-equal": "off",
|
|
13
|
+
"jest/require-hook": "off",
|
|
14
|
+
"jest/require-top-level-describe": "off"
|
|
15
|
+
}
|
|
16
|
+
}
|