mirror of
https://github.com/molstar/molstar.git
synced 2026-06-04 21:34:23 +08:00
Compare commits
31 Commits
v3.0.0-dev
...
v3.0.0
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
2ad0754b90 | ||
|
|
3ecb3af57b | ||
|
|
ec4f15f549 | ||
|
|
2458ea7b92 | ||
|
|
c5e6bedf11 | ||
|
|
8528e5a666 | ||
|
|
6ed232b3d9 | ||
|
|
f8aae8cbd1 | ||
|
|
00c2517045 | ||
|
|
99b043a929 | ||
|
|
5900e27e39 | ||
|
|
1b79d34907 | ||
|
|
fc52e29c92 | ||
|
|
df23b3c0fe | ||
|
|
5e25716c98 | ||
|
|
f70a10bc56 | ||
|
|
0ccb045f4e | ||
|
|
fbb60c9493 | ||
|
|
9f953ef51c | ||
|
|
4871f1547c | ||
|
|
d6413529f4 | ||
|
|
b6847907ca | ||
|
|
fb54a1aed7 | ||
|
|
c0880b647f | ||
|
|
039dc6a76b | ||
|
|
042a7625ad | ||
|
|
41827c478d | ||
|
|
9a73180c3c | ||
|
|
333ee85fdb | ||
|
|
fa8ca45b6a | ||
|
|
c2bae1aeb7 |
17
CHANGELOG.md
17
CHANGELOG.md
@@ -6,6 +6,21 @@ Note that since we don't clearly distinguish between a public and private interf
|
||||
|
||||
## [Unreleased]
|
||||
|
||||
## [v3.0.0] - 2022-01-23
|
||||
|
||||
- Assembly handling tweaks:
|
||||
- Do not include suffix for "identity assembly operators"
|
||||
- Do not include assembly-related categories to export if the structure was composed from an assembly
|
||||
- Special case for ``structAsymMap`` if Mol* asym id operator mapping is present
|
||||
- Support for opening ZIP files with multiple entries
|
||||
- Add Model Export extension
|
||||
- Bugfix: Automatically treat empty string as "non-present" value in BinaryCIF writer.
|
||||
- Fix coarse model support in entity-id color theme
|
||||
- Fix marking of carbohydrate visuals (whole chain could get marked instead of single residue)
|
||||
- Add custom colors to "element-symbol", "molecule-type", "residue-name", and "secondary-structure" themes
|
||||
- Support/bugfixes for ``atom_site.pdbx_sifts_xref`` categories
|
||||
- Improve/fix marking of ``InteractionsIntraUnitVisual`` (mark when all contact-feature members are given)
|
||||
|
||||
## [v3.0.0-dev.10] - 2022-01-17
|
||||
|
||||
- Fix ``getOperatorsForIndex``
|
||||
@@ -19,7 +34,7 @@ Note that since we don't clearly distinguish between a public and private interf
|
||||
- Add "camera rock" state animation
|
||||
- Add support for custom colors to "molecule-type" theme
|
||||
- [Breaking] Add style parameter to "illustrative" color theme
|
||||
- Defaults to "entity-id" style instad of "chain-id"
|
||||
- Defaults to "entity-id" style instead of "chain-id"
|
||||
- Add "illustrative" representation preset
|
||||
|
||||
## [v3.0.0-dev.9] - 2022-01-09
|
||||
|
||||
591
package-lock.json
generated
591
package-lock.json
generated
@@ -1,19 +1,19 @@
|
||||
{
|
||||
"name": "molstar",
|
||||
"version": "3.0.0-dev.10",
|
||||
"version": "3.0.0",
|
||||
"lockfileVersion": 2,
|
||||
"requires": true,
|
||||
"packages": {
|
||||
"": {
|
||||
"name": "molstar",
|
||||
"version": "3.0.0-dev.10",
|
||||
"version": "3.0.0",
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"@types/argparse": "^2.0.10",
|
||||
"@types/benchmark": "^2.1.1",
|
||||
"@types/compression": "1.7.2",
|
||||
"@types/express": "^4.17.13",
|
||||
"@types/node": "^16.11.19",
|
||||
"@types/node": "^16.11.21",
|
||||
"@types/node-fetch": "^2.5.12",
|
||||
"@types/react": "^17.0.38",
|
||||
"@types/react-dom": "^17.0.11",
|
||||
@@ -26,9 +26,9 @@
|
||||
"h264-mp4-encoder": "^1.0.12",
|
||||
"immer": "^9.0.12",
|
||||
"immutable": "^4.0.0",
|
||||
"node-fetch": "^2.6.2",
|
||||
"node-fetch": "^2.6.7",
|
||||
"rxjs": "^7.5.2",
|
||||
"swagger-ui-dist": "^4.1.3",
|
||||
"swagger-ui-dist": "^4.2.1",
|
||||
"tslib": "^2.3.1",
|
||||
"util.promisify": "^1.1.1",
|
||||
"xhr2": "^0.2.1"
|
||||
@@ -45,7 +45,7 @@
|
||||
},
|
||||
"devDependencies": {
|
||||
"@graphql-codegen/add": "^3.1.1",
|
||||
"@graphql-codegen/cli": "^2.3.1",
|
||||
"@graphql-codegen/cli": "^2.4.0",
|
||||
"@graphql-codegen/time": "^3.1.1",
|
||||
"@graphql-codegen/typescript": "^2.4.2",
|
||||
"@graphql-codegen/typescript-graphql-files-modules": "^2.1.1",
|
||||
@@ -54,8 +54,8 @@
|
||||
"@types/cors": "^2.8.12",
|
||||
"@types/gl": "^4.1.0",
|
||||
"@types/jest": "^27.4.0",
|
||||
"@typescript-eslint/eslint-plugin": "^5.9.1",
|
||||
"@typescript-eslint/parser": "^5.9.1",
|
||||
"@typescript-eslint/eslint-plugin": "^5.10.0",
|
||||
"@typescript-eslint/parser": "^5.10.0",
|
||||
"benchmark": "^2.1.4",
|
||||
"concurrently": "^7.0.0",
|
||||
"cpx2": "^4.1.2",
|
||||
@@ -68,17 +68,17 @@
|
||||
"graphql": "^16.2.0",
|
||||
"http-server": "^14.1.0",
|
||||
"jest": "^27.4.7",
|
||||
"mini-css-extract-plugin": "~2.4.7",
|
||||
"mini-css-extract-plugin": "^2.5.2",
|
||||
"path-browserify": "^1.0.1",
|
||||
"raw-loader": "^4.0.2",
|
||||
"sass": "^1.48.0",
|
||||
"sass": "^1.49.0",
|
||||
"sass-loader": "^12.4.0",
|
||||
"simple-git": "^2.48.0",
|
||||
"stream-browserify": "^3.0.0",
|
||||
"style-loader": "^3.3.1",
|
||||
"ts-jest": "^27.1.3",
|
||||
"typescript": "^4.5.4",
|
||||
"webpack": "^5.66.0",
|
||||
"typescript": "^4.5.5",
|
||||
"webpack": "^5.67.0",
|
||||
"webpack-cli": "^4.9.1"
|
||||
},
|
||||
"optionalDependencies": {
|
||||
@@ -1608,9 +1608,9 @@
|
||||
}
|
||||
},
|
||||
"node_modules/@graphql-codegen/cli": {
|
||||
"version": "2.3.1",
|
||||
"resolved": "https://registry.npmjs.org/@graphql-codegen/cli/-/cli-2.3.1.tgz",
|
||||
"integrity": "sha512-xMSvYqFtnRXOp/sVJSyqiFTm70X8ouLXiq5o/R/D3yQtA6NNudAC+Q4oxg9/LZKnRDL6pehwdC8CNnQk0Tf7Sw==",
|
||||
"version": "2.4.0",
|
||||
"resolved": "https://registry.npmjs.org/@graphql-codegen/cli/-/cli-2.4.0.tgz",
|
||||
"integrity": "sha512-4iiHH2AxBE17lX5cFdFg6+kh7I6uKQLYG0IZRalRbW/grKL7kuVp/RDUjmVB2GNJTJEhjxYLMJFJZocUmAUBlw==",
|
||||
"dev": true,
|
||||
"dependencies": {
|
||||
"@graphql-codegen/core": "2.4.0",
|
||||
@@ -2169,35 +2169,49 @@
|
||||
}
|
||||
},
|
||||
"node_modules/@graphql-tools/url-loader": {
|
||||
"version": "7.5.2",
|
||||
"resolved": "https://registry.npmjs.org/@graphql-tools/url-loader/-/url-loader-7.5.2.tgz",
|
||||
"integrity": "sha512-EilHqbhUY/qg55SSEdklDhPXgSz9+9a63SX3mcD8J2qwZHJD/wOLcyKs8m6BXfuGwUiuB0j3fmDSEVmva2onBg==",
|
||||
"version": "7.7.0",
|
||||
"resolved": "https://registry.npmjs.org/@graphql-tools/url-loader/-/url-loader-7.7.0.tgz",
|
||||
"integrity": "sha512-mBBb+aJqI4E0MVEzyfi76Pi/G6lGxGTVt/tP1YtKJly7UnonNoWOtDusdL3zIVAGhGgLsNrLbGhLDbwSd6TV6A==",
|
||||
"dev": true,
|
||||
"dependencies": {
|
||||
"@graphql-tools/delegate": "^8.4.1",
|
||||
"@graphql-tools/utils": "^8.5.1",
|
||||
"@graphql-tools/wrap": "^8.3.1",
|
||||
"@n1ru4l/graphql-live-query": "0.9.0",
|
||||
"@types/websocket": "1.0.4",
|
||||
"@n1ru4l/graphql-live-query": "^0.9.0",
|
||||
"@types/websocket": "^1.0.4",
|
||||
"@types/ws": "^8.0.0",
|
||||
"cross-undici-fetch": "^0.0.20",
|
||||
"cross-undici-fetch": "^0.1.4",
|
||||
"dset": "^3.1.0",
|
||||
"extract-files": "11.0.0",
|
||||
"extract-files": "^11.0.0",
|
||||
"graphql-sse": "^1.0.1",
|
||||
"graphql-ws": "^5.4.1",
|
||||
"isomorphic-ws": "4.0.1",
|
||||
"meros": "1.1.4",
|
||||
"isomorphic-ws": "^4.0.1",
|
||||
"meros": "^1.1.4",
|
||||
"subscriptions-transport-ws": "^0.11.0",
|
||||
"sync-fetch": "0.3.1",
|
||||
"tslib": "~2.3.0",
|
||||
"valid-url": "1.0.9",
|
||||
"value-or-promise": "1.0.11",
|
||||
"ws": "8.2.3"
|
||||
"sync-fetch": "^0.3.1",
|
||||
"tslib": "^2.3.0",
|
||||
"valid-url": "^1.0.9",
|
||||
"value-or-promise": "^1.0.11",
|
||||
"ws": "^8.3.0"
|
||||
},
|
||||
"peerDependencies": {
|
||||
"graphql": "^14.0.0 || ^15.0.0 || ^16.0.0"
|
||||
}
|
||||
},
|
||||
"node_modules/@graphql-tools/url-loader/node_modules/cross-undici-fetch": {
|
||||
"version": "0.1.16",
|
||||
"resolved": "https://registry.npmjs.org/cross-undici-fetch/-/cross-undici-fetch-0.1.16.tgz",
|
||||
"integrity": "sha512-VoL+4GLbq2R7cfpM3wc3RClV6boUAjbpZ485YHsIeBnWYUi4osdDZhh1ohk9+BjrLvAvwmvQwZC5rTEIVQ2eVQ==",
|
||||
"dev": true,
|
||||
"dependencies": {
|
||||
"abort-controller": "^3.0.0",
|
||||
"form-data-encoder": "^1.7.1",
|
||||
"formdata-node": "^4.3.1",
|
||||
"node-fetch": "^2.6.5",
|
||||
"undici": "^4.9.3",
|
||||
"web-streams-polyfill": "^3.2.0"
|
||||
}
|
||||
},
|
||||
"node_modules/@graphql-tools/utils": {
|
||||
"version": "8.5.3",
|
||||
"resolved": "https://registry.npmjs.org/@graphql-tools/utils/-/utils-8.5.3.tgz",
|
||||
@@ -2930,9 +2944,9 @@
|
||||
"integrity": "sha512-YATxVxgRqNH6nHEIsvg6k2Boc1JHI9ZbH5iWFFv/MTkchz3b1ieGDa5T0a9RznNdI0KhVbdbWSN+KWWrQZRxTw=="
|
||||
},
|
||||
"node_modules/@types/node": {
|
||||
"version": "16.11.19",
|
||||
"resolved": "https://registry.npmjs.org/@types/node/-/node-16.11.19.tgz",
|
||||
"integrity": "sha512-BPAcfDPoHlRQNKktbsbnpACGdypPFBuX4xQlsWDE7B8XXcfII+SpOLay3/qZmCLb39kV5S1RTYwXdkx2lwLYng=="
|
||||
"version": "16.11.21",
|
||||
"resolved": "https://registry.npmjs.org/@types/node/-/node-16.11.21.tgz",
|
||||
"integrity": "sha512-Pf8M1XD9i1ksZEcCP8vuSNwooJ/bZapNmIzpmsMaL+jMI+8mEYU3PKvs+xDNuQcJWF/x24WzY4qxLtB0zNow9A=="
|
||||
},
|
||||
"node_modules/@types/node-fetch": {
|
||||
"version": "2.5.12",
|
||||
@@ -3047,14 +3061,14 @@
|
||||
"dev": true
|
||||
},
|
||||
"node_modules/@typescript-eslint/eslint-plugin": {
|
||||
"version": "5.9.1",
|
||||
"resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.9.1.tgz",
|
||||
"integrity": "sha512-Xv9tkFlyD4MQGpJgTo6wqDqGvHIRmRgah/2Sjz1PUnJTawjHWIwBivUE9x0QtU2WVii9baYgavo/bHjrZJkqTw==",
|
||||
"version": "5.10.0",
|
||||
"resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.10.0.tgz",
|
||||
"integrity": "sha512-XXVKnMsq2fuu9K2KsIxPUGqb6xAImz8MEChClbXmE3VbveFtBUU5bzM6IPVWqzyADIgdkS2Ws/6Xo7W2TeZWjQ==",
|
||||
"dev": true,
|
||||
"dependencies": {
|
||||
"@typescript-eslint/experimental-utils": "5.9.1",
|
||||
"@typescript-eslint/scope-manager": "5.9.1",
|
||||
"@typescript-eslint/type-utils": "5.9.1",
|
||||
"@typescript-eslint/scope-manager": "5.10.0",
|
||||
"@typescript-eslint/type-utils": "5.10.0",
|
||||
"@typescript-eslint/utils": "5.10.0",
|
||||
"debug": "^4.3.2",
|
||||
"functional-red-black-tree": "^1.0.1",
|
||||
"ignore": "^5.1.8",
|
||||
@@ -3079,39 +3093,15 @@
|
||||
}
|
||||
}
|
||||
},
|
||||
"node_modules/@typescript-eslint/experimental-utils": {
|
||||
"version": "5.9.1",
|
||||
"resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-5.9.1.tgz",
|
||||
"integrity": "sha512-cb1Njyss0mLL9kLXgS/eEY53SZQ9sT519wpX3i+U457l2UXRDuo87hgKfgRazmu9/tQb0x2sr3Y0yrU+Zz0y+w==",
|
||||
"dev": true,
|
||||
"dependencies": {
|
||||
"@types/json-schema": "^7.0.9",
|
||||
"@typescript-eslint/scope-manager": "5.9.1",
|
||||
"@typescript-eslint/types": "5.9.1",
|
||||
"@typescript-eslint/typescript-estree": "5.9.1",
|
||||
"eslint-scope": "^5.1.1",
|
||||
"eslint-utils": "^3.0.0"
|
||||
},
|
||||
"engines": {
|
||||
"node": "^12.22.0 || ^14.17.0 || >=16.0.0"
|
||||
},
|
||||
"funding": {
|
||||
"type": "opencollective",
|
||||
"url": "https://opencollective.com/typescript-eslint"
|
||||
},
|
||||
"peerDependencies": {
|
||||
"eslint": "^6.0.0 || ^7.0.0 || ^8.0.0"
|
||||
}
|
||||
},
|
||||
"node_modules/@typescript-eslint/parser": {
|
||||
"version": "5.9.1",
|
||||
"resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.9.1.tgz",
|
||||
"integrity": "sha512-PLYO0AmwD6s6n0ZQB5kqPgfvh73p0+VqopQQLuNfi7Lm0EpfKyDalchpVwkE+81k5HeiRrTV/9w1aNHzjD7C4g==",
|
||||
"version": "5.10.0",
|
||||
"resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.10.0.tgz",
|
||||
"integrity": "sha512-pJB2CCeHWtwOAeIxv8CHVGJhI5FNyJAIpx5Pt72YkK3QfEzt6qAlXZuyaBmyfOdM62qU0rbxJzNToPTVeJGrQw==",
|
||||
"dev": true,
|
||||
"dependencies": {
|
||||
"@typescript-eslint/scope-manager": "5.9.1",
|
||||
"@typescript-eslint/types": "5.9.1",
|
||||
"@typescript-eslint/typescript-estree": "5.9.1",
|
||||
"@typescript-eslint/scope-manager": "5.10.0",
|
||||
"@typescript-eslint/types": "5.10.0",
|
||||
"@typescript-eslint/typescript-estree": "5.10.0",
|
||||
"debug": "^4.3.2"
|
||||
},
|
||||
"engines": {
|
||||
@@ -3131,13 +3121,13 @@
|
||||
}
|
||||
},
|
||||
"node_modules/@typescript-eslint/scope-manager": {
|
||||
"version": "5.9.1",
|
||||
"resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.9.1.tgz",
|
||||
"integrity": "sha512-8BwvWkho3B/UOtzRyW07ffJXPaLSUKFBjpq8aqsRvu6HdEuzCY57+ffT7QoV4QXJXWSU1+7g3wE4AlgImmQ9pQ==",
|
||||
"version": "5.10.0",
|
||||
"resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.10.0.tgz",
|
||||
"integrity": "sha512-tgNgUgb4MhqK6DoKn3RBhyZ9aJga7EQrw+2/OiDk5hKf3pTVZWyqBi7ukP+Z0iEEDMF5FDa64LqODzlfE4O/Dg==",
|
||||
"dev": true,
|
||||
"dependencies": {
|
||||
"@typescript-eslint/types": "5.9.1",
|
||||
"@typescript-eslint/visitor-keys": "5.9.1"
|
||||
"@typescript-eslint/types": "5.10.0",
|
||||
"@typescript-eslint/visitor-keys": "5.10.0"
|
||||
},
|
||||
"engines": {
|
||||
"node": "^12.22.0 || ^14.17.0 || >=16.0.0"
|
||||
@@ -3148,12 +3138,12 @@
|
||||
}
|
||||
},
|
||||
"node_modules/@typescript-eslint/type-utils": {
|
||||
"version": "5.9.1",
|
||||
"resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.9.1.tgz",
|
||||
"integrity": "sha512-tRSpdBnPRssjlUh35rE9ug5HrUvaB9ntREy7gPXXKwmIx61TNN7+l5YKgi1hMKxo5NvqZCfYhA5FvyuJG6X6vg==",
|
||||
"version": "5.10.0",
|
||||
"resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.10.0.tgz",
|
||||
"integrity": "sha512-TzlyTmufJO5V886N+hTJBGIfnjQDQ32rJYxPaeiyWKdjsv2Ld5l8cbS7pxim4DeNs62fKzRSt8Q14Evs4JnZyQ==",
|
||||
"dev": true,
|
||||
"dependencies": {
|
||||
"@typescript-eslint/experimental-utils": "5.9.1",
|
||||
"@typescript-eslint/utils": "5.10.0",
|
||||
"debug": "^4.3.2",
|
||||
"tsutils": "^3.21.0"
|
||||
},
|
||||
@@ -3174,9 +3164,9 @@
|
||||
}
|
||||
},
|
||||
"node_modules/@typescript-eslint/types": {
|
||||
"version": "5.9.1",
|
||||
"resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.9.1.tgz",
|
||||
"integrity": "sha512-SsWegWudWpkZCwwYcKoDwuAjoZXnM1y2EbEerTHho19Hmm+bQ56QG4L4jrtCu0bI5STaRTvRTZmjprWlTw/5NQ==",
|
||||
"version": "5.10.0",
|
||||
"resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.10.0.tgz",
|
||||
"integrity": "sha512-wUljCgkqHsMZbw60IbOqT/puLfyqqD5PquGiBo1u1IS3PLxdi3RDGlyf032IJyh+eQoGhz9kzhtZa+VC4eWTlQ==",
|
||||
"dev": true,
|
||||
"engines": {
|
||||
"node": "^12.22.0 || ^14.17.0 || >=16.0.0"
|
||||
@@ -3187,13 +3177,13 @@
|
||||
}
|
||||
},
|
||||
"node_modules/@typescript-eslint/typescript-estree": {
|
||||
"version": "5.9.1",
|
||||
"resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.9.1.tgz",
|
||||
"integrity": "sha512-gL1sP6A/KG0HwrahVXI9fZyeVTxEYV//6PmcOn1tD0rw8VhUWYeZeuWHwwhnewnvEMcHjhnJLOBhA9rK4vmb8A==",
|
||||
"version": "5.10.0",
|
||||
"resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.10.0.tgz",
|
||||
"integrity": "sha512-x+7e5IqfwLwsxTdliHRtlIYkgdtYXzE0CkFeV6ytAqq431ZyxCFzNMNR5sr3WOlIG/ihVZr9K/y71VHTF/DUQA==",
|
||||
"dev": true,
|
||||
"dependencies": {
|
||||
"@typescript-eslint/types": "5.9.1",
|
||||
"@typescript-eslint/visitor-keys": "5.9.1",
|
||||
"@typescript-eslint/types": "5.10.0",
|
||||
"@typescript-eslint/visitor-keys": "5.10.0",
|
||||
"debug": "^4.3.2",
|
||||
"globby": "^11.0.4",
|
||||
"is-glob": "^4.0.3",
|
||||
@@ -3213,13 +3203,37 @@
|
||||
}
|
||||
}
|
||||
},
|
||||
"node_modules/@typescript-eslint/visitor-keys": {
|
||||
"version": "5.9.1",
|
||||
"resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.9.1.tgz",
|
||||
"integrity": "sha512-Xh37pNz9e9ryW4TVdwiFzmr4hloty8cFj8GTWMXh3Z8swGwyQWeCcNgF0hm6t09iZd6eiZmIf4zHedQVP6TVtg==",
|
||||
"node_modules/@typescript-eslint/utils": {
|
||||
"version": "5.10.0",
|
||||
"resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.10.0.tgz",
|
||||
"integrity": "sha512-IGYwlt1CVcFoE2ueW4/ioEwybR60RAdGeiJX/iDAw0t5w0wK3S7QncDwpmsM70nKgGTuVchEWB8lwZwHqPAWRg==",
|
||||
"dev": true,
|
||||
"dependencies": {
|
||||
"@typescript-eslint/types": "5.9.1",
|
||||
"@types/json-schema": "^7.0.9",
|
||||
"@typescript-eslint/scope-manager": "5.10.0",
|
||||
"@typescript-eslint/types": "5.10.0",
|
||||
"@typescript-eslint/typescript-estree": "5.10.0",
|
||||
"eslint-scope": "^5.1.1",
|
||||
"eslint-utils": "^3.0.0"
|
||||
},
|
||||
"engines": {
|
||||
"node": "^12.22.0 || ^14.17.0 || >=16.0.0"
|
||||
},
|
||||
"funding": {
|
||||
"type": "opencollective",
|
||||
"url": "https://opencollective.com/typescript-eslint"
|
||||
},
|
||||
"peerDependencies": {
|
||||
"eslint": "^6.0.0 || ^7.0.0 || ^8.0.0"
|
||||
}
|
||||
},
|
||||
"node_modules/@typescript-eslint/visitor-keys": {
|
||||
"version": "5.10.0",
|
||||
"resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.10.0.tgz",
|
||||
"integrity": "sha512-GMxj0K1uyrFLPKASLmZzCuSddmjZVbVj3Ouy5QVuIGKZopxvOr24JsS7gruz6C3GExE01mublZ3mIBOaon9zuQ==",
|
||||
"dev": true,
|
||||
"dependencies": {
|
||||
"@typescript-eslint/types": "5.10.0",
|
||||
"eslint-visitor-keys": "^3.0.0"
|
||||
},
|
||||
"engines": {
|
||||
@@ -5121,21 +5135,12 @@
|
||||
"dev": true
|
||||
},
|
||||
"node_modules/cross-fetch": {
|
||||
"version": "3.1.4",
|
||||
"resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-3.1.4.tgz",
|
||||
"integrity": "sha512-1eAtFWdIubi6T4XPy6ei9iUFoKpUkIF971QLN8lIvvvwueI65+Nw5haMNKUwfJxabqlIIDODJKGrQ66gxC0PbQ==",
|
||||
"version": "3.1.5",
|
||||
"resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-3.1.5.tgz",
|
||||
"integrity": "sha512-lvb1SBsI0Z7GDwmuid+mU3kWVBwTVUbe7S0H52yaaAdQOXq2YktTCZdlAcNKFzE6QtRz0snpw9bNiPeOIkkQvw==",
|
||||
"dev": true,
|
||||
"dependencies": {
|
||||
"node-fetch": "2.6.1"
|
||||
}
|
||||
},
|
||||
"node_modules/cross-fetch/node_modules/node-fetch": {
|
||||
"version": "2.6.1",
|
||||
"resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.1.tgz",
|
||||
"integrity": "sha512-V4aYg89jEoVRxRb2fJdAg8FHvI7cEyYdVAh94HH0UIK8oJxUfkjlDQN9RbMx+bEjP7+ggMiFRprSti032Oipxw==",
|
||||
"dev": true,
|
||||
"engines": {
|
||||
"node": "4.x || >=6.0.0"
|
||||
"node-fetch": "2.6.7"
|
||||
}
|
||||
},
|
||||
"node_modules/cross-spawn": {
|
||||
@@ -6685,6 +6690,34 @@
|
||||
"node": ">= 6"
|
||||
}
|
||||
},
|
||||
"node_modules/form-data-encoder": {
|
||||
"version": "1.7.1",
|
||||
"resolved": "https://registry.npmjs.org/form-data-encoder/-/form-data-encoder-1.7.1.tgz",
|
||||
"integrity": "sha512-EFRDrsMm/kyqbTQocNvRXMLjc7Es2Vk+IQFx/YW7hkUH1eBl4J1fqiP34l74Yt0pFLCNpc06fkbVk00008mzjg==",
|
||||
"dev": true
|
||||
},
|
||||
"node_modules/formdata-node": {
|
||||
"version": "4.3.2",
|
||||
"resolved": "https://registry.npmjs.org/formdata-node/-/formdata-node-4.3.2.tgz",
|
||||
"integrity": "sha512-k7lYJyzDOSL6h917favP8j1L0/wNyylzU+x+1w4p5haGVHNlP58dbpdJhiCUsDbWsa9HwEtLp89obQgXl2e0qg==",
|
||||
"dev": true,
|
||||
"dependencies": {
|
||||
"node-domexception": "1.0.0",
|
||||
"web-streams-polyfill": "4.0.0-beta.1"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">= 12.20"
|
||||
}
|
||||
},
|
||||
"node_modules/formdata-node/node_modules/web-streams-polyfill": {
|
||||
"version": "4.0.0-beta.1",
|
||||
"resolved": "https://registry.npmjs.org/web-streams-polyfill/-/web-streams-polyfill-4.0.0-beta.1.tgz",
|
||||
"integrity": "sha512-3ux37gEX670UUphBF9AMCq8XM6iQ8Ac6A+DSRRjDoRBm1ufCkaCDdNVbaqq60PsEkdNlLKrGtv/YBP4EJXqNtQ==",
|
||||
"dev": true,
|
||||
"engines": {
|
||||
"node": ">= 12"
|
||||
}
|
||||
},
|
||||
"node_modules/forwarded": {
|
||||
"version": "0.2.0",
|
||||
"resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz",
|
||||
@@ -10018,9 +10051,9 @@
|
||||
}
|
||||
},
|
||||
"node_modules/mini-css-extract-plugin": {
|
||||
"version": "2.4.7",
|
||||
"resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-2.4.7.tgz",
|
||||
"integrity": "sha512-euWmddf0sk9Nv1O0gfeeUAvAkoSlWncNLF77C0TP2+WoPvy8mAHKOzMajcCz2dzvyt3CNgxb1obIEVFIRxaipg==",
|
||||
"version": "2.5.2",
|
||||
"resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-2.5.2.tgz",
|
||||
"integrity": "sha512-Lwgq9qLNyBK6yNLgzssXnq4r2+mB9Mz3cJWlM8kseysHIvTicFhDNimFgY94jjqlwhNzLPsq8wv4X+vOHtMdYA==",
|
||||
"dev": true,
|
||||
"dependencies": {
|
||||
"schema-utils": "^4.0.0"
|
||||
@@ -10255,9 +10288,9 @@
|
||||
"optional": true
|
||||
},
|
||||
"node_modules/nanoid": {
|
||||
"version": "3.1.30",
|
||||
"resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.1.30.tgz",
|
||||
"integrity": "sha512-zJpuPDwOv8D2zq2WRoMe1HsfZthVewpel9CAvTfc/2mBD1uUT/agc5f7GHGWXlYkFvi1mVxe4IjvP2HNrop7nQ==",
|
||||
"version": "3.2.0",
|
||||
"resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.2.0.tgz",
|
||||
"integrity": "sha512-fmsZYa9lpn69Ad5eDn7FMcnnSR+8R34W9qJEijxYhTbfOWzr22n1QxCMzXLK+ODyW2973V3Fux959iQoUxzUIA==",
|
||||
"dev": true,
|
||||
"bin": {
|
||||
"nanoid": "bin/nanoid.cjs"
|
||||
@@ -10314,15 +10347,42 @@
|
||||
"node": ">=10"
|
||||
}
|
||||
},
|
||||
"node_modules/node-domexception": {
|
||||
"version": "1.0.0",
|
||||
"resolved": "https://registry.npmjs.org/node-domexception/-/node-domexception-1.0.0.tgz",
|
||||
"integrity": "sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==",
|
||||
"dev": true,
|
||||
"funding": [
|
||||
{
|
||||
"type": "github",
|
||||
"url": "https://github.com/sponsors/jimmywarting"
|
||||
},
|
||||
{
|
||||
"type": "github",
|
||||
"url": "https://paypal.me/jimmywarting"
|
||||
}
|
||||
],
|
||||
"engines": {
|
||||
"node": ">=10.5.0"
|
||||
}
|
||||
},
|
||||
"node_modules/node-fetch": {
|
||||
"version": "2.6.6",
|
||||
"resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.6.tgz",
|
||||
"integrity": "sha512-Z8/6vRlTUChSdIgMa51jxQ4lrw/Jy5SOW10ObaA47/RElsAN2c5Pn8bTgFGWn/ibwzXTE8qwr1Yzx28vsecXEA==",
|
||||
"version": "2.6.7",
|
||||
"resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.7.tgz",
|
||||
"integrity": "sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==",
|
||||
"dependencies": {
|
||||
"whatwg-url": "^5.0.0"
|
||||
},
|
||||
"engines": {
|
||||
"node": "4.x || >=6.0.0"
|
||||
},
|
||||
"peerDependencies": {
|
||||
"encoding": "^0.1.0"
|
||||
},
|
||||
"peerDependenciesMeta": {
|
||||
"encoding": {
|
||||
"optional": true
|
||||
}
|
||||
}
|
||||
},
|
||||
"node_modules/node-fetch/node_modules/tr46": {
|
||||
@@ -11853,9 +11913,9 @@
|
||||
"integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg=="
|
||||
},
|
||||
"node_modules/sass": {
|
||||
"version": "1.48.0",
|
||||
"resolved": "https://registry.npmjs.org/sass/-/sass-1.48.0.tgz",
|
||||
"integrity": "sha512-hQi5g4DcfjcipotoHZ80l7GNJHGqQS5LwMBjVYB/TaT0vcSSpbgM8Ad7cgfsB2M0MinbkEQQPO9+sjjSiwxqmw==",
|
||||
"version": "1.49.0",
|
||||
"resolved": "https://registry.npmjs.org/sass/-/sass-1.49.0.tgz",
|
||||
"integrity": "sha512-TVwVdNDj6p6b4QymJtNtRS2YtLJ/CqZriGg0eIAbAKMlN8Xy6kbv33FsEZSF7FufFFM705SQviHjjThfaQ4VNw==",
|
||||
"dev": true,
|
||||
"dependencies": {
|
||||
"chokidar": ">=3.0.0 <4.0.0",
|
||||
@@ -12624,9 +12684,9 @@
|
||||
}
|
||||
},
|
||||
"node_modules/swagger-ui-dist": {
|
||||
"version": "4.1.3",
|
||||
"resolved": "https://registry.npmjs.org/swagger-ui-dist/-/swagger-ui-dist-4.1.3.tgz",
|
||||
"integrity": "sha512-WvfPSfAAMlE/sKS6YkW47nX/hA7StmhYnAHc6wWCXNL0oclwLj6UXv0hQCkLnDgvebi0MEV40SJJpVjKUgH1IQ=="
|
||||
"version": "4.2.1",
|
||||
"resolved": "https://registry.npmjs.org/swagger-ui-dist/-/swagger-ui-dist-4.2.1.tgz",
|
||||
"integrity": "sha512-ZzUeNKIIMXmKI53iLscAVCpQ7jblYxI2XX5EBaoBr6UBEfxT3L0vlnE+fzPBbHc9g0sgdOMLZGhC5OW++9pqlw=="
|
||||
},
|
||||
"node_modules/swap-case": {
|
||||
"version": "2.0.2",
|
||||
@@ -13186,9 +13246,9 @@
|
||||
}
|
||||
},
|
||||
"node_modules/typescript": {
|
||||
"version": "4.5.4",
|
||||
"resolved": "https://registry.npmjs.org/typescript/-/typescript-4.5.4.tgz",
|
||||
"integrity": "sha512-VgYs2A2QIRuGphtzFV7aQJduJ2gyfTljngLzjpfW9FoYZF6xuw1W0vW9ghCKLfcWrCFxK81CSGRAvS1pn4fIUg==",
|
||||
"version": "4.5.5",
|
||||
"resolved": "https://registry.npmjs.org/typescript/-/typescript-4.5.5.tgz",
|
||||
"integrity": "sha512-TCTIul70LyWe6IJWT8QSYeA54WQe8EjQFU4wY52Fasj5UKx88LNYKCgBEHcOMOrFF1rKGbD8v/xcNWVUq9SymA==",
|
||||
"dev": true,
|
||||
"bin": {
|
||||
"tsc": "bin/tsc",
|
||||
@@ -13507,6 +13567,15 @@
|
||||
"defaults": "^1.0.3"
|
||||
}
|
||||
},
|
||||
"node_modules/web-streams-polyfill": {
|
||||
"version": "3.2.0",
|
||||
"resolved": "https://registry.npmjs.org/web-streams-polyfill/-/web-streams-polyfill-3.2.0.tgz",
|
||||
"integrity": "sha512-EqPmREeOzttaLRm5HS7io98goBgZ7IVz79aDvqjD0kYXLtFZTc0T/U6wHTPKyIjb+MdN7DFIIX6hgdBEpWmfPA==",
|
||||
"dev": true,
|
||||
"engines": {
|
||||
"node": ">= 8"
|
||||
}
|
||||
},
|
||||
"node_modules/webidl-conversions": {
|
||||
"version": "6.1.0",
|
||||
"resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-6.1.0.tgz",
|
||||
@@ -13517,9 +13586,9 @@
|
||||
}
|
||||
},
|
||||
"node_modules/webpack": {
|
||||
"version": "5.66.0",
|
||||
"resolved": "https://registry.npmjs.org/webpack/-/webpack-5.66.0.tgz",
|
||||
"integrity": "sha512-NJNtGT7IKpGzdW7Iwpn/09OXz9inIkeIQ/ibY6B+MdV1x6+uReqz/5z1L89ezWnpPDWpXF0TY5PCYKQdWVn8Vg==",
|
||||
"version": "5.67.0",
|
||||
"resolved": "https://registry.npmjs.org/webpack/-/webpack-5.67.0.tgz",
|
||||
"integrity": "sha512-LjFbfMh89xBDpUMgA1W9Ur6Rn/gnr2Cq1jjHFPo4v6a79/ypznSYbAyPgGhwsxBtMIaEmDD1oJoA7BEYw/Fbrw==",
|
||||
"dev": true,
|
||||
"dependencies": {
|
||||
"@types/eslint-scope": "^3.7.0",
|
||||
@@ -13545,7 +13614,7 @@
|
||||
"tapable": "^2.1.1",
|
||||
"terser-webpack-plugin": "^5.1.3",
|
||||
"watchpack": "^2.3.1",
|
||||
"webpack-sources": "^3.2.2"
|
||||
"webpack-sources": "^3.2.3"
|
||||
},
|
||||
"bin": {
|
||||
"webpack": "bin/webpack.js"
|
||||
@@ -13620,9 +13689,9 @@
|
||||
}
|
||||
},
|
||||
"node_modules/webpack-sources": {
|
||||
"version": "3.2.2",
|
||||
"resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.2.2.tgz",
|
||||
"integrity": "sha512-cp5qdmHnu5T8wRg2G3vZZHoJPN14aqQ89SyQ11NpGH5zEMDCclt49rzo+MaRazk7/UeILhAI+/sEtcM+7Fr0nw==",
|
||||
"version": "3.2.3",
|
||||
"resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.2.3.tgz",
|
||||
"integrity": "sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==",
|
||||
"dev": true,
|
||||
"engines": {
|
||||
"node": ">=10.13.0"
|
||||
@@ -13786,9 +13855,9 @@
|
||||
}
|
||||
},
|
||||
"node_modules/ws": {
|
||||
"version": "8.2.3",
|
||||
"resolved": "https://registry.npmjs.org/ws/-/ws-8.2.3.tgz",
|
||||
"integrity": "sha512-wBuoj1BDpC6ZQ1B7DWQBYVLphPWkm8i9Y0/3YdHjHKHiohOJ1ws+3OccDWtH+PoC9DZD5WOTrJvNbWvjS6JWaA==",
|
||||
"version": "8.4.2",
|
||||
"resolved": "https://registry.npmjs.org/ws/-/ws-8.4.2.tgz",
|
||||
"integrity": "sha512-Kbk4Nxyq7/ZWqr/tarI9yIt/+iNNFOjBXEWgTb4ydaNHBNGgvf2QHbS9fdfsndfjFlFwEd4Al+mw83YkaD10ZA==",
|
||||
"dev": true,
|
||||
"engines": {
|
||||
"node": ">=10.0.0"
|
||||
@@ -15040,9 +15109,9 @@
|
||||
}
|
||||
},
|
||||
"@graphql-codegen/cli": {
|
||||
"version": "2.3.1",
|
||||
"resolved": "https://registry.npmjs.org/@graphql-codegen/cli/-/cli-2.3.1.tgz",
|
||||
"integrity": "sha512-xMSvYqFtnRXOp/sVJSyqiFTm70X8ouLXiq5o/R/D3yQtA6NNudAC+Q4oxg9/LZKnRDL6pehwdC8CNnQk0Tf7Sw==",
|
||||
"version": "2.4.0",
|
||||
"resolved": "https://registry.npmjs.org/@graphql-codegen/cli/-/cli-2.4.0.tgz",
|
||||
"integrity": "sha512-4iiHH2AxBE17lX5cFdFg6+kh7I6uKQLYG0IZRalRbW/grKL7kuVp/RDUjmVB2GNJTJEhjxYLMJFJZocUmAUBlw==",
|
||||
"dev": true,
|
||||
"requires": {
|
||||
"@graphql-codegen/core": "2.4.0",
|
||||
@@ -15500,30 +15569,46 @@
|
||||
}
|
||||
},
|
||||
"@graphql-tools/url-loader": {
|
||||
"version": "7.5.2",
|
||||
"resolved": "https://registry.npmjs.org/@graphql-tools/url-loader/-/url-loader-7.5.2.tgz",
|
||||
"integrity": "sha512-EilHqbhUY/qg55SSEdklDhPXgSz9+9a63SX3mcD8J2qwZHJD/wOLcyKs8m6BXfuGwUiuB0j3fmDSEVmva2onBg==",
|
||||
"version": "7.7.0",
|
||||
"resolved": "https://registry.npmjs.org/@graphql-tools/url-loader/-/url-loader-7.7.0.tgz",
|
||||
"integrity": "sha512-mBBb+aJqI4E0MVEzyfi76Pi/G6lGxGTVt/tP1YtKJly7UnonNoWOtDusdL3zIVAGhGgLsNrLbGhLDbwSd6TV6A==",
|
||||
"dev": true,
|
||||
"requires": {
|
||||
"@graphql-tools/delegate": "^8.4.1",
|
||||
"@graphql-tools/utils": "^8.5.1",
|
||||
"@graphql-tools/wrap": "^8.3.1",
|
||||
"@n1ru4l/graphql-live-query": "0.9.0",
|
||||
"@types/websocket": "1.0.4",
|
||||
"@n1ru4l/graphql-live-query": "^0.9.0",
|
||||
"@types/websocket": "^1.0.4",
|
||||
"@types/ws": "^8.0.0",
|
||||
"cross-undici-fetch": "^0.0.20",
|
||||
"cross-undici-fetch": "^0.1.4",
|
||||
"dset": "^3.1.0",
|
||||
"extract-files": "11.0.0",
|
||||
"extract-files": "^11.0.0",
|
||||
"graphql-sse": "^1.0.1",
|
||||
"graphql-ws": "^5.4.1",
|
||||
"isomorphic-ws": "4.0.1",
|
||||
"meros": "1.1.4",
|
||||
"isomorphic-ws": "^4.0.1",
|
||||
"meros": "^1.1.4",
|
||||
"subscriptions-transport-ws": "^0.11.0",
|
||||
"sync-fetch": "0.3.1",
|
||||
"tslib": "~2.3.0",
|
||||
"valid-url": "1.0.9",
|
||||
"value-or-promise": "1.0.11",
|
||||
"ws": "8.2.3"
|
||||
"sync-fetch": "^0.3.1",
|
||||
"tslib": "^2.3.0",
|
||||
"valid-url": "^1.0.9",
|
||||
"value-or-promise": "^1.0.11",
|
||||
"ws": "^8.3.0"
|
||||
},
|
||||
"dependencies": {
|
||||
"cross-undici-fetch": {
|
||||
"version": "0.1.16",
|
||||
"resolved": "https://registry.npmjs.org/cross-undici-fetch/-/cross-undici-fetch-0.1.16.tgz",
|
||||
"integrity": "sha512-VoL+4GLbq2R7cfpM3wc3RClV6boUAjbpZ485YHsIeBnWYUi4osdDZhh1ohk9+BjrLvAvwmvQwZC5rTEIVQ2eVQ==",
|
||||
"dev": true,
|
||||
"requires": {
|
||||
"abort-controller": "^3.0.0",
|
||||
"form-data-encoder": "^1.7.1",
|
||||
"formdata-node": "^4.3.1",
|
||||
"node-fetch": "^2.6.5",
|
||||
"undici": "^4.9.3",
|
||||
"web-streams-polyfill": "^3.2.0"
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"@graphql-tools/utils": {
|
||||
@@ -16153,9 +16238,9 @@
|
||||
"integrity": "sha512-YATxVxgRqNH6nHEIsvg6k2Boc1JHI9ZbH5iWFFv/MTkchz3b1ieGDa5T0a9RznNdI0KhVbdbWSN+KWWrQZRxTw=="
|
||||
},
|
||||
"@types/node": {
|
||||
"version": "16.11.19",
|
||||
"resolved": "https://registry.npmjs.org/@types/node/-/node-16.11.19.tgz",
|
||||
"integrity": "sha512-BPAcfDPoHlRQNKktbsbnpACGdypPFBuX4xQlsWDE7B8XXcfII+SpOLay3/qZmCLb39kV5S1RTYwXdkx2lwLYng=="
|
||||
"version": "16.11.21",
|
||||
"resolved": "https://registry.npmjs.org/@types/node/-/node-16.11.21.tgz",
|
||||
"integrity": "sha512-Pf8M1XD9i1ksZEcCP8vuSNwooJ/bZapNmIzpmsMaL+jMI+8mEYU3PKvs+xDNuQcJWF/x24WzY4qxLtB0zNow9A=="
|
||||
},
|
||||
"@types/node-fetch": {
|
||||
"version": "2.5.12",
|
||||
@@ -16270,14 +16355,14 @@
|
||||
"dev": true
|
||||
},
|
||||
"@typescript-eslint/eslint-plugin": {
|
||||
"version": "5.9.1",
|
||||
"resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.9.1.tgz",
|
||||
"integrity": "sha512-Xv9tkFlyD4MQGpJgTo6wqDqGvHIRmRgah/2Sjz1PUnJTawjHWIwBivUE9x0QtU2WVii9baYgavo/bHjrZJkqTw==",
|
||||
"version": "5.10.0",
|
||||
"resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.10.0.tgz",
|
||||
"integrity": "sha512-XXVKnMsq2fuu9K2KsIxPUGqb6xAImz8MEChClbXmE3VbveFtBUU5bzM6IPVWqzyADIgdkS2Ws/6Xo7W2TeZWjQ==",
|
||||
"dev": true,
|
||||
"requires": {
|
||||
"@typescript-eslint/experimental-utils": "5.9.1",
|
||||
"@typescript-eslint/scope-manager": "5.9.1",
|
||||
"@typescript-eslint/type-utils": "5.9.1",
|
||||
"@typescript-eslint/scope-manager": "5.10.0",
|
||||
"@typescript-eslint/type-utils": "5.10.0",
|
||||
"@typescript-eslint/utils": "5.10.0",
|
||||
"debug": "^4.3.2",
|
||||
"functional-red-black-tree": "^1.0.1",
|
||||
"ignore": "^5.1.8",
|
||||
@@ -16286,67 +16371,53 @@
|
||||
"tsutils": "^3.21.0"
|
||||
}
|
||||
},
|
||||
"@typescript-eslint/experimental-utils": {
|
||||
"version": "5.9.1",
|
||||
"resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-5.9.1.tgz",
|
||||
"integrity": "sha512-cb1Njyss0mLL9kLXgS/eEY53SZQ9sT519wpX3i+U457l2UXRDuo87hgKfgRazmu9/tQb0x2sr3Y0yrU+Zz0y+w==",
|
||||
"dev": true,
|
||||
"requires": {
|
||||
"@types/json-schema": "^7.0.9",
|
||||
"@typescript-eslint/scope-manager": "5.9.1",
|
||||
"@typescript-eslint/types": "5.9.1",
|
||||
"@typescript-eslint/typescript-estree": "5.9.1",
|
||||
"eslint-scope": "^5.1.1",
|
||||
"eslint-utils": "^3.0.0"
|
||||
}
|
||||
},
|
||||
"@typescript-eslint/parser": {
|
||||
"version": "5.9.1",
|
||||
"resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.9.1.tgz",
|
||||
"integrity": "sha512-PLYO0AmwD6s6n0ZQB5kqPgfvh73p0+VqopQQLuNfi7Lm0EpfKyDalchpVwkE+81k5HeiRrTV/9w1aNHzjD7C4g==",
|
||||
"version": "5.10.0",
|
||||
"resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.10.0.tgz",
|
||||
"integrity": "sha512-pJB2CCeHWtwOAeIxv8CHVGJhI5FNyJAIpx5Pt72YkK3QfEzt6qAlXZuyaBmyfOdM62qU0rbxJzNToPTVeJGrQw==",
|
||||
"dev": true,
|
||||
"requires": {
|
||||
"@typescript-eslint/scope-manager": "5.9.1",
|
||||
"@typescript-eslint/types": "5.9.1",
|
||||
"@typescript-eslint/typescript-estree": "5.9.1",
|
||||
"@typescript-eslint/scope-manager": "5.10.0",
|
||||
"@typescript-eslint/types": "5.10.0",
|
||||
"@typescript-eslint/typescript-estree": "5.10.0",
|
||||
"debug": "^4.3.2"
|
||||
}
|
||||
},
|
||||
"@typescript-eslint/scope-manager": {
|
||||
"version": "5.9.1",
|
||||
"resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.9.1.tgz",
|
||||
"integrity": "sha512-8BwvWkho3B/UOtzRyW07ffJXPaLSUKFBjpq8aqsRvu6HdEuzCY57+ffT7QoV4QXJXWSU1+7g3wE4AlgImmQ9pQ==",
|
||||
"version": "5.10.0",
|
||||
"resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.10.0.tgz",
|
||||
"integrity": "sha512-tgNgUgb4MhqK6DoKn3RBhyZ9aJga7EQrw+2/OiDk5hKf3pTVZWyqBi7ukP+Z0iEEDMF5FDa64LqODzlfE4O/Dg==",
|
||||
"dev": true,
|
||||
"requires": {
|
||||
"@typescript-eslint/types": "5.9.1",
|
||||
"@typescript-eslint/visitor-keys": "5.9.1"
|
||||
"@typescript-eslint/types": "5.10.0",
|
||||
"@typescript-eslint/visitor-keys": "5.10.0"
|
||||
}
|
||||
},
|
||||
"@typescript-eslint/type-utils": {
|
||||
"version": "5.9.1",
|
||||
"resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.9.1.tgz",
|
||||
"integrity": "sha512-tRSpdBnPRssjlUh35rE9ug5HrUvaB9ntREy7gPXXKwmIx61TNN7+l5YKgi1hMKxo5NvqZCfYhA5FvyuJG6X6vg==",
|
||||
"version": "5.10.0",
|
||||
"resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.10.0.tgz",
|
||||
"integrity": "sha512-TzlyTmufJO5V886N+hTJBGIfnjQDQ32rJYxPaeiyWKdjsv2Ld5l8cbS7pxim4DeNs62fKzRSt8Q14Evs4JnZyQ==",
|
||||
"dev": true,
|
||||
"requires": {
|
||||
"@typescript-eslint/experimental-utils": "5.9.1",
|
||||
"@typescript-eslint/utils": "5.10.0",
|
||||
"debug": "^4.3.2",
|
||||
"tsutils": "^3.21.0"
|
||||
}
|
||||
},
|
||||
"@typescript-eslint/types": {
|
||||
"version": "5.9.1",
|
||||
"resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.9.1.tgz",
|
||||
"integrity": "sha512-SsWegWudWpkZCwwYcKoDwuAjoZXnM1y2EbEerTHho19Hmm+bQ56QG4L4jrtCu0bI5STaRTvRTZmjprWlTw/5NQ==",
|
||||
"version": "5.10.0",
|
||||
"resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.10.0.tgz",
|
||||
"integrity": "sha512-wUljCgkqHsMZbw60IbOqT/puLfyqqD5PquGiBo1u1IS3PLxdi3RDGlyf032IJyh+eQoGhz9kzhtZa+VC4eWTlQ==",
|
||||
"dev": true
|
||||
},
|
||||
"@typescript-eslint/typescript-estree": {
|
||||
"version": "5.9.1",
|
||||
"resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.9.1.tgz",
|
||||
"integrity": "sha512-gL1sP6A/KG0HwrahVXI9fZyeVTxEYV//6PmcOn1tD0rw8VhUWYeZeuWHwwhnewnvEMcHjhnJLOBhA9rK4vmb8A==",
|
||||
"version": "5.10.0",
|
||||
"resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.10.0.tgz",
|
||||
"integrity": "sha512-x+7e5IqfwLwsxTdliHRtlIYkgdtYXzE0CkFeV6ytAqq431ZyxCFzNMNR5sr3WOlIG/ihVZr9K/y71VHTF/DUQA==",
|
||||
"dev": true,
|
||||
"requires": {
|
||||
"@typescript-eslint/types": "5.9.1",
|
||||
"@typescript-eslint/visitor-keys": "5.9.1",
|
||||
"@typescript-eslint/types": "5.10.0",
|
||||
"@typescript-eslint/visitor-keys": "5.10.0",
|
||||
"debug": "^4.3.2",
|
||||
"globby": "^11.0.4",
|
||||
"is-glob": "^4.0.3",
|
||||
@@ -16354,13 +16425,27 @@
|
||||
"tsutils": "^3.21.0"
|
||||
}
|
||||
},
|
||||
"@typescript-eslint/visitor-keys": {
|
||||
"version": "5.9.1",
|
||||
"resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.9.1.tgz",
|
||||
"integrity": "sha512-Xh37pNz9e9ryW4TVdwiFzmr4hloty8cFj8GTWMXh3Z8swGwyQWeCcNgF0hm6t09iZd6eiZmIf4zHedQVP6TVtg==",
|
||||
"@typescript-eslint/utils": {
|
||||
"version": "5.10.0",
|
||||
"resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.10.0.tgz",
|
||||
"integrity": "sha512-IGYwlt1CVcFoE2ueW4/ioEwybR60RAdGeiJX/iDAw0t5w0wK3S7QncDwpmsM70nKgGTuVchEWB8lwZwHqPAWRg==",
|
||||
"dev": true,
|
||||
"requires": {
|
||||
"@typescript-eslint/types": "5.9.1",
|
||||
"@types/json-schema": "^7.0.9",
|
||||
"@typescript-eslint/scope-manager": "5.10.0",
|
||||
"@typescript-eslint/types": "5.10.0",
|
||||
"@typescript-eslint/typescript-estree": "5.10.0",
|
||||
"eslint-scope": "^5.1.1",
|
||||
"eslint-utils": "^3.0.0"
|
||||
}
|
||||
},
|
||||
"@typescript-eslint/visitor-keys": {
|
||||
"version": "5.10.0",
|
||||
"resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.10.0.tgz",
|
||||
"integrity": "sha512-GMxj0K1uyrFLPKASLmZzCuSddmjZVbVj3Ouy5QVuIGKZopxvOr24JsS7gruz6C3GExE01mublZ3mIBOaon9zuQ==",
|
||||
"dev": true,
|
||||
"requires": {
|
||||
"@typescript-eslint/types": "5.10.0",
|
||||
"eslint-visitor-keys": "^3.0.0"
|
||||
}
|
||||
},
|
||||
@@ -17900,20 +17985,12 @@
|
||||
"dev": true
|
||||
},
|
||||
"cross-fetch": {
|
||||
"version": "3.1.4",
|
||||
"resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-3.1.4.tgz",
|
||||
"integrity": "sha512-1eAtFWdIubi6T4XPy6ei9iUFoKpUkIF971QLN8lIvvvwueI65+Nw5haMNKUwfJxabqlIIDODJKGrQ66gxC0PbQ==",
|
||||
"version": "3.1.5",
|
||||
"resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-3.1.5.tgz",
|
||||
"integrity": "sha512-lvb1SBsI0Z7GDwmuid+mU3kWVBwTVUbe7S0H52yaaAdQOXq2YktTCZdlAcNKFzE6QtRz0snpw9bNiPeOIkkQvw==",
|
||||
"dev": true,
|
||||
"requires": {
|
||||
"node-fetch": "2.6.1"
|
||||
},
|
||||
"dependencies": {
|
||||
"node-fetch": {
|
||||
"version": "2.6.1",
|
||||
"resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.1.tgz",
|
||||
"integrity": "sha512-V4aYg89jEoVRxRb2fJdAg8FHvI7cEyYdVAh94HH0UIK8oJxUfkjlDQN9RbMx+bEjP7+ggMiFRprSti032Oipxw==",
|
||||
"dev": true
|
||||
}
|
||||
"node-fetch": "2.6.7"
|
||||
}
|
||||
},
|
||||
"cross-spawn": {
|
||||
@@ -19119,6 +19196,30 @@
|
||||
"mime-types": "^2.1.12"
|
||||
}
|
||||
},
|
||||
"form-data-encoder": {
|
||||
"version": "1.7.1",
|
||||
"resolved": "https://registry.npmjs.org/form-data-encoder/-/form-data-encoder-1.7.1.tgz",
|
||||
"integrity": "sha512-EFRDrsMm/kyqbTQocNvRXMLjc7Es2Vk+IQFx/YW7hkUH1eBl4J1fqiP34l74Yt0pFLCNpc06fkbVk00008mzjg==",
|
||||
"dev": true
|
||||
},
|
||||
"formdata-node": {
|
||||
"version": "4.3.2",
|
||||
"resolved": "https://registry.npmjs.org/formdata-node/-/formdata-node-4.3.2.tgz",
|
||||
"integrity": "sha512-k7lYJyzDOSL6h917favP8j1L0/wNyylzU+x+1w4p5haGVHNlP58dbpdJhiCUsDbWsa9HwEtLp89obQgXl2e0qg==",
|
||||
"dev": true,
|
||||
"requires": {
|
||||
"node-domexception": "1.0.0",
|
||||
"web-streams-polyfill": "4.0.0-beta.1"
|
||||
},
|
||||
"dependencies": {
|
||||
"web-streams-polyfill": {
|
||||
"version": "4.0.0-beta.1",
|
||||
"resolved": "https://registry.npmjs.org/web-streams-polyfill/-/web-streams-polyfill-4.0.0-beta.1.tgz",
|
||||
"integrity": "sha512-3ux37gEX670UUphBF9AMCq8XM6iQ8Ac6A+DSRRjDoRBm1ufCkaCDdNVbaqq60PsEkdNlLKrGtv/YBP4EJXqNtQ==",
|
||||
"dev": true
|
||||
}
|
||||
}
|
||||
},
|
||||
"forwarded": {
|
||||
"version": "0.2.0",
|
||||
"resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz",
|
||||
@@ -21671,9 +21772,9 @@
|
||||
"dev": true
|
||||
},
|
||||
"mini-css-extract-plugin": {
|
||||
"version": "2.4.7",
|
||||
"resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-2.4.7.tgz",
|
||||
"integrity": "sha512-euWmddf0sk9Nv1O0gfeeUAvAkoSlWncNLF77C0TP2+WoPvy8mAHKOzMajcCz2dzvyt3CNgxb1obIEVFIRxaipg==",
|
||||
"version": "2.5.2",
|
||||
"resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-2.5.2.tgz",
|
||||
"integrity": "sha512-Lwgq9qLNyBK6yNLgzssXnq4r2+mB9Mz3cJWlM8kseysHIvTicFhDNimFgY94jjqlwhNzLPsq8wv4X+vOHtMdYA==",
|
||||
"dev": true,
|
||||
"requires": {
|
||||
"schema-utils": "^4.0.0"
|
||||
@@ -21851,9 +21952,9 @@
|
||||
"optional": true
|
||||
},
|
||||
"nanoid": {
|
||||
"version": "3.1.30",
|
||||
"resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.1.30.tgz",
|
||||
"integrity": "sha512-zJpuPDwOv8D2zq2WRoMe1HsfZthVewpel9CAvTfc/2mBD1uUT/agc5f7GHGWXlYkFvi1mVxe4IjvP2HNrop7nQ==",
|
||||
"version": "3.2.0",
|
||||
"resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.2.0.tgz",
|
||||
"integrity": "sha512-fmsZYa9lpn69Ad5eDn7FMcnnSR+8R34W9qJEijxYhTbfOWzr22n1QxCMzXLK+ODyW2973V3Fux959iQoUxzUIA==",
|
||||
"dev": true
|
||||
},
|
||||
"napi-build-utils": {
|
||||
@@ -21898,10 +21999,16 @@
|
||||
"semver": "^7.3.5"
|
||||
}
|
||||
},
|
||||
"node-domexception": {
|
||||
"version": "1.0.0",
|
||||
"resolved": "https://registry.npmjs.org/node-domexception/-/node-domexception-1.0.0.tgz",
|
||||
"integrity": "sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==",
|
||||
"dev": true
|
||||
},
|
||||
"node-fetch": {
|
||||
"version": "2.6.6",
|
||||
"resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.6.tgz",
|
||||
"integrity": "sha512-Z8/6vRlTUChSdIgMa51jxQ4lrw/Jy5SOW10ObaA47/RElsAN2c5Pn8bTgFGWn/ibwzXTE8qwr1Yzx28vsecXEA==",
|
||||
"version": "2.6.7",
|
||||
"resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.7.tgz",
|
||||
"integrity": "sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==",
|
||||
"requires": {
|
||||
"whatwg-url": "^5.0.0"
|
||||
},
|
||||
@@ -23079,9 +23186,9 @@
|
||||
"integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg=="
|
||||
},
|
||||
"sass": {
|
||||
"version": "1.48.0",
|
||||
"resolved": "https://registry.npmjs.org/sass/-/sass-1.48.0.tgz",
|
||||
"integrity": "sha512-hQi5g4DcfjcipotoHZ80l7GNJHGqQS5LwMBjVYB/TaT0vcSSpbgM8Ad7cgfsB2M0MinbkEQQPO9+sjjSiwxqmw==",
|
||||
"version": "1.49.0",
|
||||
"resolved": "https://registry.npmjs.org/sass/-/sass-1.49.0.tgz",
|
||||
"integrity": "sha512-TVwVdNDj6p6b4QymJtNtRS2YtLJ/CqZriGg0eIAbAKMlN8Xy6kbv33FsEZSF7FufFFM705SQviHjjThfaQ4VNw==",
|
||||
"dev": true,
|
||||
"requires": {
|
||||
"chokidar": ">=3.0.0 <4.0.0",
|
||||
@@ -23646,9 +23753,9 @@
|
||||
}
|
||||
},
|
||||
"swagger-ui-dist": {
|
||||
"version": "4.1.3",
|
||||
"resolved": "https://registry.npmjs.org/swagger-ui-dist/-/swagger-ui-dist-4.1.3.tgz",
|
||||
"integrity": "sha512-WvfPSfAAMlE/sKS6YkW47nX/hA7StmhYnAHc6wWCXNL0oclwLj6UXv0hQCkLnDgvebi0MEV40SJJpVjKUgH1IQ=="
|
||||
"version": "4.2.1",
|
||||
"resolved": "https://registry.npmjs.org/swagger-ui-dist/-/swagger-ui-dist-4.2.1.tgz",
|
||||
"integrity": "sha512-ZzUeNKIIMXmKI53iLscAVCpQ7jblYxI2XX5EBaoBr6UBEfxT3L0vlnE+fzPBbHc9g0sgdOMLZGhC5OW++9pqlw=="
|
||||
},
|
||||
"swap-case": {
|
||||
"version": "2.0.2",
|
||||
@@ -24057,9 +24164,9 @@
|
||||
}
|
||||
},
|
||||
"typescript": {
|
||||
"version": "4.5.4",
|
||||
"resolved": "https://registry.npmjs.org/typescript/-/typescript-4.5.4.tgz",
|
||||
"integrity": "sha512-VgYs2A2QIRuGphtzFV7aQJduJ2gyfTljngLzjpfW9FoYZF6xuw1W0vW9ghCKLfcWrCFxK81CSGRAvS1pn4fIUg==",
|
||||
"version": "4.5.5",
|
||||
"resolved": "https://registry.npmjs.org/typescript/-/typescript-4.5.5.tgz",
|
||||
"integrity": "sha512-TCTIul70LyWe6IJWT8QSYeA54WQe8EjQFU4wY52Fasj5UKx88LNYKCgBEHcOMOrFF1rKGbD8v/xcNWVUq9SymA==",
|
||||
"dev": true
|
||||
},
|
||||
"ua-parser-js": {
|
||||
@@ -24308,6 +24415,12 @@
|
||||
"defaults": "^1.0.3"
|
||||
}
|
||||
},
|
||||
"web-streams-polyfill": {
|
||||
"version": "3.2.0",
|
||||
"resolved": "https://registry.npmjs.org/web-streams-polyfill/-/web-streams-polyfill-3.2.0.tgz",
|
||||
"integrity": "sha512-EqPmREeOzttaLRm5HS7io98goBgZ7IVz79aDvqjD0kYXLtFZTc0T/U6wHTPKyIjb+MdN7DFIIX6hgdBEpWmfPA==",
|
||||
"dev": true
|
||||
},
|
||||
"webidl-conversions": {
|
||||
"version": "6.1.0",
|
||||
"resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-6.1.0.tgz",
|
||||
@@ -24315,9 +24428,9 @@
|
||||
"dev": true
|
||||
},
|
||||
"webpack": {
|
||||
"version": "5.66.0",
|
||||
"resolved": "https://registry.npmjs.org/webpack/-/webpack-5.66.0.tgz",
|
||||
"integrity": "sha512-NJNtGT7IKpGzdW7Iwpn/09OXz9inIkeIQ/ibY6B+MdV1x6+uReqz/5z1L89ezWnpPDWpXF0TY5PCYKQdWVn8Vg==",
|
||||
"version": "5.67.0",
|
||||
"resolved": "https://registry.npmjs.org/webpack/-/webpack-5.67.0.tgz",
|
||||
"integrity": "sha512-LjFbfMh89xBDpUMgA1W9Ur6Rn/gnr2Cq1jjHFPo4v6a79/ypznSYbAyPgGhwsxBtMIaEmDD1oJoA7BEYw/Fbrw==",
|
||||
"dev": true,
|
||||
"requires": {
|
||||
"@types/eslint-scope": "^3.7.0",
|
||||
@@ -24343,7 +24456,7 @@
|
||||
"tapable": "^2.1.1",
|
||||
"terser-webpack-plugin": "^5.1.3",
|
||||
"watchpack": "^2.3.1",
|
||||
"webpack-sources": "^3.2.2"
|
||||
"webpack-sources": "^3.2.3"
|
||||
},
|
||||
"dependencies": {
|
||||
"acorn-import-assertions": {
|
||||
@@ -24397,9 +24510,9 @@
|
||||
}
|
||||
},
|
||||
"webpack-sources": {
|
||||
"version": "3.2.2",
|
||||
"resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.2.2.tgz",
|
||||
"integrity": "sha512-cp5qdmHnu5T8wRg2G3vZZHoJPN14aqQ89SyQ11NpGH5zEMDCclt49rzo+MaRazk7/UeILhAI+/sEtcM+7Fr0nw==",
|
||||
"version": "3.2.3",
|
||||
"resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.2.3.tgz",
|
||||
"integrity": "sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==",
|
||||
"dev": true
|
||||
},
|
||||
"whatwg-encoding": {
|
||||
@@ -24512,9 +24625,9 @@
|
||||
}
|
||||
},
|
||||
"ws": {
|
||||
"version": "8.2.3",
|
||||
"resolved": "https://registry.npmjs.org/ws/-/ws-8.2.3.tgz",
|
||||
"integrity": "sha512-wBuoj1BDpC6ZQ1B7DWQBYVLphPWkm8i9Y0/3YdHjHKHiohOJ1ws+3OccDWtH+PoC9DZD5WOTrJvNbWvjS6JWaA==",
|
||||
"version": "8.4.2",
|
||||
"resolved": "https://registry.npmjs.org/ws/-/ws-8.4.2.tgz",
|
||||
"integrity": "sha512-Kbk4Nxyq7/ZWqr/tarI9yIt/+iNNFOjBXEWgTb4ydaNHBNGgvf2QHbS9fdfsndfjFlFwEd4Al+mw83YkaD10ZA==",
|
||||
"dev": true,
|
||||
"requires": {}
|
||||
},
|
||||
|
||||
22
package.json
22
package.json
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "molstar",
|
||||
"version": "3.0.0-dev.10",
|
||||
"version": "3.0.0",
|
||||
"description": "A comprehensive macromolecular library.",
|
||||
"homepage": "https://github.com/molstar/molstar#readme",
|
||||
"repository": {
|
||||
@@ -92,7 +92,7 @@
|
||||
"license": "MIT",
|
||||
"devDependencies": {
|
||||
"@graphql-codegen/add": "^3.1.1",
|
||||
"@graphql-codegen/cli": "^2.3.1",
|
||||
"@graphql-codegen/cli": "^2.4.0",
|
||||
"@graphql-codegen/time": "^3.1.1",
|
||||
"@graphql-codegen/typescript": "^2.4.2",
|
||||
"@graphql-codegen/typescript-graphql-files-modules": "^2.1.1",
|
||||
@@ -101,8 +101,8 @@
|
||||
"@types/cors": "^2.8.12",
|
||||
"@types/gl": "^4.1.0",
|
||||
"@types/jest": "^27.4.0",
|
||||
"@typescript-eslint/eslint-plugin": "^5.9.1",
|
||||
"@typescript-eslint/parser": "^5.9.1",
|
||||
"@typescript-eslint/eslint-plugin": "^5.10.0",
|
||||
"@typescript-eslint/parser": "^5.10.0",
|
||||
"benchmark": "^2.1.4",
|
||||
"concurrently": "^7.0.0",
|
||||
"cpx2": "^4.1.2",
|
||||
@@ -115,17 +115,17 @@
|
||||
"graphql": "^16.2.0",
|
||||
"http-server": "^14.1.0",
|
||||
"jest": "^27.4.7",
|
||||
"mini-css-extract-plugin": "~2.4.7",
|
||||
"mini-css-extract-plugin": "^2.5.2",
|
||||
"path-browserify": "^1.0.1",
|
||||
"raw-loader": "^4.0.2",
|
||||
"sass": "^1.48.0",
|
||||
"sass": "^1.49.0",
|
||||
"sass-loader": "^12.4.0",
|
||||
"simple-git": "^2.48.0",
|
||||
"stream-browserify": "^3.0.0",
|
||||
"style-loader": "^3.3.1",
|
||||
"ts-jest": "^27.1.3",
|
||||
"typescript": "^4.5.4",
|
||||
"webpack": "^5.66.0",
|
||||
"typescript": "^4.5.5",
|
||||
"webpack": "^5.67.0",
|
||||
"webpack-cli": "^4.9.1"
|
||||
},
|
||||
"dependencies": {
|
||||
@@ -133,7 +133,7 @@
|
||||
"@types/benchmark": "^2.1.1",
|
||||
"@types/compression": "1.7.2",
|
||||
"@types/express": "^4.17.13",
|
||||
"@types/node": "^16.11.19",
|
||||
"@types/node": "^16.11.21",
|
||||
"@types/node-fetch": "^2.5.12",
|
||||
"@types/react": "^17.0.38",
|
||||
"@types/react-dom": "^17.0.11",
|
||||
@@ -146,9 +146,9 @@
|
||||
"h264-mp4-encoder": "^1.0.12",
|
||||
"immer": "^9.0.12",
|
||||
"immutable": "^4.0.0",
|
||||
"node-fetch": "^2.6.2",
|
||||
"node-fetch": "^2.6.7",
|
||||
"rxjs": "^7.5.2",
|
||||
"swagger-ui-dist": "^4.1.3",
|
||||
"swagger-ui-dist": "^4.2.1",
|
||||
"tslib": "^2.3.1",
|
||||
"util.promisify": "^1.1.1",
|
||||
"xhr2": "^0.2.1"
|
||||
|
||||
@@ -13,6 +13,7 @@ import { GeometryExport } from '../../extensions/geo-export';
|
||||
import { MAQualityAssessment } from '../../extensions/model-archive/quality-assessment/behavior';
|
||||
import { QualityAssessmentPLDDTPreset, QualityAssessmentQmeanPreset } from '../../extensions/model-archive/quality-assessment/behavior';
|
||||
import { QualityAssessment } from '../../extensions/model-archive/quality-assessment/prop';
|
||||
import { ModelExport } from '../../extensions/model-export';
|
||||
import { Mp4Export } from '../../extensions/mp4-export';
|
||||
import { PDBeStructureQualityReport } from '../../extensions/pdbe';
|
||||
import { RCSBAssemblySymmetry, RCSBValidationReport } from '../../extensions/rcsb';
|
||||
@@ -57,6 +58,7 @@ const Extensions = {
|
||||
'rcsb-validation-report': PluginSpec.Behavior(RCSBValidationReport),
|
||||
'anvil-membrane-orientation': PluginSpec.Behavior(ANVILMembraneOrientation),
|
||||
'g3d': PluginSpec.Behavior(G3DFormat),
|
||||
'model-export': PluginSpec.Behavior(ModelExport),
|
||||
'mp4-export': PluginSpec.Behavior(Mp4Export),
|
||||
'geo-export': PluginSpec.Behavior(GeometryExport),
|
||||
'ma-quality-assessment': PluginSpec.Behavior(MAQualityAssessment),
|
||||
@@ -99,7 +101,14 @@ export class Viewer {
|
||||
}
|
||||
|
||||
static async create(elementOrId: string | HTMLElement, options: Partial<ViewerOptions> = {}) {
|
||||
const o = { ...DefaultViewerOptions, ...options };
|
||||
const definedOptions = {} as any;
|
||||
// filter for defined properies only so the default values
|
||||
// are property applied
|
||||
for (const p of Object.keys(options) as (keyof ViewerOptions)[]) {
|
||||
if (options[p] !== void 0) definedOptions[p] = options[p];
|
||||
}
|
||||
|
||||
const o: ViewerOptions = { ...DefaultViewerOptions, ...definedOptions };
|
||||
const defaultSpec = DefaultPluginUISpec();
|
||||
|
||||
const spec: PluginUISpec = {
|
||||
|
||||
@@ -57,7 +57,7 @@
|
||||
var pickScale = getParam('pick-scale', '[^&]+').trim();
|
||||
var pickPadding = getParam('pick-padding', '[^&]+').trim();
|
||||
var disableWboit = getParam('disable-wboit', '[^&]+').trim() === '1';
|
||||
var preferWebgl1 = getParam('prefer-webgl1', '[^&]+').trim() === '1';
|
||||
var preferWebgl1 = getParam('prefer-webgl1', '[^&]+').trim() === '1' || void 0;
|
||||
|
||||
molstar.Viewer.create('app', {
|
||||
layoutShowControls: !hideControls,
|
||||
@@ -71,7 +71,7 @@
|
||||
pixelScale: parseFloat(pixelScale) || 1,
|
||||
pickScale: parseFloat(pickScale) || 0.25,
|
||||
pickPadding: isNaN(parseFloat(pickPadding)) ? 1 : parseFloat(pickPadding),
|
||||
enableWboit: !disableWboit,
|
||||
enableWboit: disableWboit ? true : void 0, // use default value if disable-wboit is not set
|
||||
preferWebgl1: preferWebgl1,
|
||||
}).then(viewer => {
|
||||
var snapshotId = getParam('snapshot-id', '[^&]+').trim();
|
||||
|
||||
@@ -9,4 +9,4 @@ import './embedded.html';
|
||||
import './favicon.ico';
|
||||
import './index.html';
|
||||
require('mol-plugin-ui/skin/light.scss');
|
||||
export * from './app';
|
||||
export * from './app';
|
||||
|
||||
87
src/extensions/model-export/export.ts
Normal file
87
src/extensions/model-export/export.ts
Normal file
@@ -0,0 +1,87 @@
|
||||
/**
|
||||
* Copyright (c) 2021 mol* contributors, licensed under MIT, See LICENSE file for more info.
|
||||
*
|
||||
* @author David Sehnal <david.sehnal@gmail.com>
|
||||
*/
|
||||
|
||||
import { utf8ByteCount, utf8Write } from '../../mol-io/common/utf8';
|
||||
import { to_mmCIF, Unit } from '../../mol-model/structure';
|
||||
import { PluginContext } from '../../mol-plugin/context';
|
||||
import { Task } from '../../mol-task';
|
||||
import { getFormattedTime } from '../../mol-util/date';
|
||||
import { download } from '../../mol-util/download';
|
||||
import { zip } from '../../mol-util/zip/zip';
|
||||
|
||||
export async function exportHierarchy(plugin: PluginContext, options?: { format?: 'cif' | 'bcif' }) {
|
||||
try {
|
||||
await plugin.runTask(_exportHierarchy(plugin, options), { useOverlay: true });
|
||||
} catch (e) {
|
||||
console.error(e);
|
||||
plugin.log.error(`Model export failed. See console for details.`);
|
||||
}
|
||||
}
|
||||
|
||||
function _exportHierarchy(plugin: PluginContext, options?: { format?: 'cif' | 'bcif' }) {
|
||||
return Task.create('Export', async ctx => {
|
||||
await ctx.update({ message: 'Exporting...', isIndeterminate: true, canAbort: false });
|
||||
|
||||
const format = options?.format ?? 'cif';
|
||||
const { structures } = plugin.managers.structure.hierarchy.current;
|
||||
|
||||
const files: [name: string, data: string | Uint8Array][] = [];
|
||||
const entryMap = new Map<string, number>();
|
||||
|
||||
for (const _s of structures) {
|
||||
const s = _s.transform?.cell.obj?.data ?? _s.cell.obj?.data;
|
||||
if (!s) continue;
|
||||
if (s.models.length > 1) {
|
||||
plugin.log.warn(`[Export] Skipping ${_s.cell.obj?.label}: Multimodel exports not supported.`);
|
||||
continue;
|
||||
}
|
||||
if (s.units.some(u => !Unit.isAtomic(u))) {
|
||||
plugin.log.warn(`[Export] Skipping ${_s.cell.obj?.label}: Non-atomic model exports not supported.`);
|
||||
continue;
|
||||
}
|
||||
|
||||
const name = entryMap.has(s.model.entryId)
|
||||
? `${s.model.entryId}_${entryMap.get(s.model.entryId)! + 1}.${format}`
|
||||
: `${s.model.entryId}.${format}`;
|
||||
entryMap.set(s.model.entryId, (entryMap.get(s.model.entryId) ?? 0) + 1);
|
||||
|
||||
await ctx.update({ message: `Exporting ${s.model.entryId}...`, isIndeterminate: true, canAbort: false });
|
||||
if (s.elementCount > 100000) {
|
||||
// Give UI chance to update, only needed for larger structures.
|
||||
await new Promise(res => setTimeout(res, 50));
|
||||
}
|
||||
|
||||
try {
|
||||
files.push([name, to_mmCIF(s.model.entryId, s, format === 'bcif', { copyAllCategories: true })]);
|
||||
} catch (e) {
|
||||
if (format === 'cif' && s.elementCount > 2000000) {
|
||||
plugin.log.warn(`[Export] The structure might be too big to be exported as Text CIF, consider using the BinaryCIF format instead.`);
|
||||
}
|
||||
throw e;
|
||||
}
|
||||
}
|
||||
|
||||
if (files.length === 1) {
|
||||
download(new Blob([files[0][1]]), files[0][0]);
|
||||
} else if (files.length > 1) {
|
||||
const zipData: Record<string, Uint8Array> = {};
|
||||
for (const [fn, data] of files) {
|
||||
if (data instanceof Uint8Array) {
|
||||
zipData[fn] = data;
|
||||
} else {
|
||||
const bytes = new Uint8Array(utf8ByteCount(data));
|
||||
utf8Write(bytes, 0, data);
|
||||
zipData[fn] = bytes;
|
||||
}
|
||||
}
|
||||
await ctx.update({ message: `Compressing Data...`, isIndeterminate: true, canAbort: false });
|
||||
const buffer = await zip(ctx, zipData);
|
||||
download(new Blob([new Uint8Array(buffer, 0, buffer.byteLength)]), `structures_${getFormattedTime()}.zip`);
|
||||
}
|
||||
|
||||
plugin.log.info(`[Export] Done.`);
|
||||
});
|
||||
}
|
||||
30
src/extensions/model-export/index.ts
Normal file
30
src/extensions/model-export/index.ts
Normal file
@@ -0,0 +1,30 @@
|
||||
/**
|
||||
* Copyright (c) 2021 mol* contributors, licensed under MIT, See LICENSE file for more info.
|
||||
*
|
||||
* @author David Sehnal <david.sehnal@gmail.com>
|
||||
*/
|
||||
|
||||
import { PluginBehavior } from '../../mol-plugin/behavior/behavior';
|
||||
import { ModelExportUI } from './ui';
|
||||
|
||||
export const ModelExport = PluginBehavior.create<{}>({
|
||||
name: 'extension-model-export',
|
||||
category: 'misc',
|
||||
display: {
|
||||
name: 'Model Export'
|
||||
},
|
||||
ctor: class extends PluginBehavior.Handler<{}> {
|
||||
register(): void {
|
||||
this.ctx.customStructureControls.set('model-export', ModelExportUI as any);
|
||||
}
|
||||
|
||||
update() {
|
||||
return false;
|
||||
}
|
||||
|
||||
unregister() {
|
||||
this.ctx.customStructureControls.delete('model-export');
|
||||
}
|
||||
},
|
||||
params: () => ({})
|
||||
});
|
||||
69
src/extensions/model-export/ui.tsx
Normal file
69
src/extensions/model-export/ui.tsx
Normal file
@@ -0,0 +1,69 @@
|
||||
/**
|
||||
* Copyright (c) 2021 mol* contributors, licensed under MIT, See LICENSE file for more info.
|
||||
*
|
||||
* @author David Sehnal <david.sehnal@gmail.com>
|
||||
*/
|
||||
|
||||
import { useState } from 'react';
|
||||
import { CollapsableControls, CollapsableState } from '../../mol-plugin-ui/base';
|
||||
import { Button } from '../../mol-plugin-ui/controls/common';
|
||||
import { GetAppSvg } from '../../mol-plugin-ui/controls/icons';
|
||||
import { ParameterControls } from '../../mol-plugin-ui/controls/parameters';
|
||||
import { useBehavior } from '../../mol-plugin-ui/hooks/use-behavior';
|
||||
import { PluginContext } from '../../mol-plugin/context';
|
||||
import { ParamDefinition as PD } from '../../mol-util/param-definition';
|
||||
import { exportHierarchy } from './export';
|
||||
|
||||
export class ModelExportUI extends CollapsableControls<{}, {}> {
|
||||
protected defaultState(): CollapsableState {
|
||||
return {
|
||||
header: 'Export Models',
|
||||
isCollapsed: true,
|
||||
brand: { accent: 'cyan', svg: GetAppSvg }
|
||||
};
|
||||
}
|
||||
protected renderControls(): JSX.Element | null {
|
||||
return <ExportControls plugin={this.plugin} />;
|
||||
}
|
||||
}
|
||||
|
||||
const Params = {
|
||||
format: PD.Select<'cif' | 'bcif'>('cif', [['cif', 'mmCIF'], ['bcif', 'Binary mmCIF']])
|
||||
};
|
||||
const DefaultParams = PD.getDefaultValues(Params);
|
||||
|
||||
function ExportControls({ plugin }: { plugin: PluginContext }) {
|
||||
const [params, setParams] = useState(DefaultParams);
|
||||
const [exporting, setExporting] = useState(false);
|
||||
useBehavior(plugin.managers.structure.hierarchy.behaviors.selection); // triggers UI update
|
||||
const isBusy = useBehavior(plugin.behaviors.state.isBusy);
|
||||
const hierarchy = plugin.managers.structure.hierarchy.current;
|
||||
|
||||
let label: string = 'Nothing to Export';
|
||||
if (hierarchy.structures.length === 1) {
|
||||
label = 'Export';
|
||||
} if (hierarchy.structures.length > 1) {
|
||||
label = 'Export (as ZIP)';
|
||||
}
|
||||
|
||||
const onExport = async () => {
|
||||
setExporting(true);
|
||||
try {
|
||||
await exportHierarchy(plugin, { format: params.format });
|
||||
} finally {
|
||||
setExporting(false);
|
||||
}
|
||||
};
|
||||
|
||||
return <>
|
||||
<ParameterControls params={Params} values={params} onChangeValues={setParams} isDisabled={isBusy || exporting} />
|
||||
<Button
|
||||
onClick={onExport}
|
||||
style={{ marginTop: 1 }}
|
||||
disabled={isBusy || hierarchy.structures.length === 0 || exporting}
|
||||
commit={hierarchy.structures.length ? 'on' : 'off'}
|
||||
>
|
||||
{label}
|
||||
</Button>
|
||||
</>;
|
||||
}
|
||||
@@ -191,8 +191,14 @@ function getFieldData(field: Field<any, any>, arrayCtor: ArrayCtor<string | numb
|
||||
array[offset] = '';
|
||||
allPresent = false;
|
||||
} else {
|
||||
mask[offset] = Column.ValueKind.Present;
|
||||
array[offset] = getter(key, d, offset);
|
||||
const value = getter(key, d, offset);
|
||||
if (typeof value === 'string' && !value) {
|
||||
mask[offset] = Column.ValueKind.NotPresent;
|
||||
allPresent = false;
|
||||
} else {
|
||||
mask[offset] = Column.ValueKind.Present;
|
||||
}
|
||||
array[offset] = value;
|
||||
}
|
||||
offset++;
|
||||
}
|
||||
|
||||
@@ -52,24 +52,30 @@ namespace SymmetryOperator {
|
||||
export const RotationTranslationEpsilon = 0.005;
|
||||
|
||||
export type CreateInfo = { assembly?: SymmetryOperator['assembly'], ncsId?: number, hkl?: Vec3, spgrOp?: number }
|
||||
export function create(name: string, matrix: Mat4, info?: CreateInfo): SymmetryOperator {
|
||||
export function create(name: string, matrix: Mat4, info?: CreateInfo | SymmetryOperator): SymmetryOperator {
|
||||
let { assembly, ncsId, hkl, spgrOp } = info || { };
|
||||
const _hkl = hkl ? Vec3.clone(hkl) : Vec3();
|
||||
spgrOp = defaults(spgrOp, -1);
|
||||
ncsId = ncsId || -1;
|
||||
const suffix = getSuffix(info);
|
||||
if (Mat4.isIdentity(matrix)) return { name, assembly, matrix, inverse: Mat4.identity(), isIdentity: true, hkl: _hkl, spgrOp, ncsId, suffix };
|
||||
const isIdentity = Mat4.isIdentity(matrix);
|
||||
const suffix = getSuffix(info, isIdentity);
|
||||
if (isIdentity) return { name, assembly, matrix, inverse: Mat4.identity(), isIdentity: true, hkl: _hkl, spgrOp, ncsId, suffix };
|
||||
if (!Mat4.isRotationAndTranslation(matrix, RotationTranslationEpsilon)) {
|
||||
console.warn(`Symmetry operator (${name}) should be a composition of rotation and translation.`);
|
||||
}
|
||||
return { name, assembly, matrix, inverse: Mat4.invert(Mat4(), matrix), isIdentity: false, hkl: _hkl, spgrOp, ncsId, suffix };
|
||||
}
|
||||
|
||||
function getSuffix(info?: CreateInfo) {
|
||||
function isSymmetryOperator(x: any): x is SymmetryOperator {
|
||||
return !!x && !!x.matrix && !!x.inverse && typeof x.name === 'string';
|
||||
}
|
||||
|
||||
function getSuffix(info?: CreateInfo | SymmetryOperator, isIdentity?: boolean) {
|
||||
if (!info) return '';
|
||||
|
||||
if (info.assembly) {
|
||||
return `_${info.assembly.operId}`;
|
||||
if (isSymmetryOperator(info)) return info.suffix;
|
||||
return isIdentity ? '' : `_${info.assembly.operId}`;
|
||||
}
|
||||
|
||||
if (typeof info.spgrOp !== 'undefined' && typeof info.hkl !== 'undefined' && info.spgrOp !== -1) {
|
||||
|
||||
@@ -7,21 +7,21 @@
|
||||
|
||||
import { Column, Table } from '../../../mol-data/db';
|
||||
import { Interval, Segmentation } from '../../../mol-data/int';
|
||||
import { UUID } from '../../../mol-util/uuid';
|
||||
import { ElementIndex, ChainIndex } from '../../../mol-model/structure';
|
||||
import { toDatabase } from '../../../mol-io/reader/cif/schema';
|
||||
import { SymmetryOperator } from '../../../mol-math/geometry';
|
||||
import { Mat4, Vec3 } from '../../../mol-math/linear-algebra';
|
||||
import { ChainIndex, ElementIndex } from '../../../mol-model/structure';
|
||||
import { AtomSiteOperatorMappingSchema } from '../../../mol-model/structure/export/categories/atom_site_operator_mapping';
|
||||
import { Model } from '../../../mol-model/structure/model/model';
|
||||
import { AtomicConformation, AtomicData, AtomicHierarchy, AtomicSegments, AtomsSchema, ChainsSchema, ResiduesSchema } from '../../../mol-model/structure/model/properties/atomic';
|
||||
import { getAtomicIndex } from '../../../mol-model/structure/model/properties/utils/atomic-index';
|
||||
import { ElementSymbol } from '../../../mol-model/structure/model/types';
|
||||
import { Entities } from '../../../mol-model/structure/model/properties/common';
|
||||
import { getAtomicDerivedData } from '../../../mol-model/structure/model/properties/utils/atomic-derived';
|
||||
import { AtomSite } from './schema';
|
||||
import { getAtomicIndex } from '../../../mol-model/structure/model/properties/utils/atomic-index';
|
||||
import { ElementSymbol } from '../../../mol-model/structure/model/types';
|
||||
import { UUID } from '../../../mol-util/uuid';
|
||||
import { ModelFormat } from '../../format';
|
||||
import { SymmetryOperator } from '../../../mol-math/geometry';
|
||||
import { MmcifFormat } from '../mmcif';
|
||||
import { AtomSiteOperatorMappingSchema } from '../../../mol-model/structure/export/categories/atom_site_operator_mapping';
|
||||
import { toDatabase } from '../../../mol-io/reader/cif/schema';
|
||||
import { Mat4, Vec3 } from '../../../mol-math/linear-algebra';
|
||||
import { AtomSite } from './schema';
|
||||
|
||||
function findHierarchyOffsets(atom_site: AtomSite) {
|
||||
if (atom_site._rowCount === 0) return { residues: [], chains: [] };
|
||||
|
||||
@@ -30,7 +30,7 @@ export interface CoarseData {
|
||||
|
||||
export const EmptyCoarse = { hierarchy: CoarseHierarchy.Empty, conformation: void 0 as any };
|
||||
|
||||
export function getCoarse(data: CoarseData, properties: Model['properties']): { hierarchy: CoarseHierarchy, conformation: CoarseConformation } {
|
||||
export function getCoarse(data: CoarseData, chemicalComponentMap: Model['properties']['chemicalComponentMap']): { hierarchy: CoarseHierarchy, conformation: CoarseConformation } {
|
||||
const { ihm_sphere_obj_site, ihm_gaussian_obj_site } = data;
|
||||
|
||||
if (ihm_sphere_obj_site._rowCount === 0 && ihm_gaussian_obj_site._rowCount === 0) return EmptyCoarse;
|
||||
@@ -38,12 +38,12 @@ export function getCoarse(data: CoarseData, properties: Model['properties']): {
|
||||
const sphereData = getData(ihm_sphere_obj_site);
|
||||
const sphereConformation = getSphereConformation(ihm_sphere_obj_site);
|
||||
const sphereKeys = getCoarseKeys(sphereData, data.entities);
|
||||
const sphereRanges = getCoarseRanges(sphereData, properties.chemicalComponentMap);
|
||||
const sphereRanges = getCoarseRanges(sphereData, chemicalComponentMap);
|
||||
|
||||
const gaussianData = getData(ihm_gaussian_obj_site);
|
||||
const gaussianConformation = getGaussianConformation(ihm_gaussian_obj_site);
|
||||
const gaussianKeys = getCoarseKeys(gaussianData, data.entities);
|
||||
const gaussianRanges = getCoarseRanges(gaussianData, properties.chemicalComponentMap);
|
||||
const gaussianRanges = getCoarseRanges(gaussianData, chemicalComponentMap);
|
||||
|
||||
return {
|
||||
hierarchy: {
|
||||
|
||||
@@ -11,7 +11,7 @@ import { getEntityType, getEntitySubtype } from '../../../mol-model/structure/mo
|
||||
import { ElementIndex, EntityIndex, Model } from '../../../mol-model/structure/model';
|
||||
import { BasicData, BasicSchema, Entity } from './schema';
|
||||
|
||||
export function getEntities(data: BasicData, properties: Model['properties']): Entities {
|
||||
export function getEntityData(data: BasicData): Entities {
|
||||
let entityData: Entity;
|
||||
|
||||
if (!data.entity.id.isDefined) {
|
||||
@@ -121,28 +121,32 @@ export function getEntities(data: BasicData, properties: Model['properties']): E
|
||||
|
||||
const subtypeColumn = Column.ofArray({ array: subtypes, schema: EntitySubtype });
|
||||
|
||||
//
|
||||
|
||||
const prdIds: string[] = new Array(entityData._rowCount);
|
||||
prdIds.fill('');
|
||||
|
||||
if (data.pdbx_molecule && data.pdbx_molecule.prd_id.isDefined) {
|
||||
const { asym_id, prd_id, _rowCount } = data.pdbx_molecule;
|
||||
for (let i = 0; i < _rowCount; ++i) {
|
||||
const asymId = asym_id.value(i);
|
||||
const entityId = properties.structAsymMap.get(asymId)?.entity_id;
|
||||
if (entityId !== undefined) {
|
||||
prdIds[getEntityIndex(entityId)] = prd_id.value(i);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
const prdIdColumn = Column.ofArray({ array: prdIds, schema: Column.Schema.str });
|
||||
|
||||
return {
|
||||
data: entityData,
|
||||
subtype: subtypeColumn,
|
||||
prd_id: prdIdColumn,
|
||||
getEntityIndex
|
||||
};
|
||||
}
|
||||
|
||||
export function getEntitiesWithPRD(data: BasicData, entities: Entities, structAsymMap: Model['properties']['structAsymMap']): Entities {
|
||||
if (!data.pdbx_molecule || !data.pdbx_molecule.prd_id.isDefined) {
|
||||
return entities;
|
||||
}
|
||||
|
||||
const prdIds: string[] = new Array(entities.data._rowCount);
|
||||
prdIds.fill('');
|
||||
const { asym_id, prd_id, _rowCount } = data.pdbx_molecule;
|
||||
for (let i = 0; i < _rowCount; ++i) {
|
||||
const asymId = asym_id.value(i);
|
||||
const entityId = structAsymMap.get(asymId)?.entity_id;
|
||||
if (entityId !== undefined) {
|
||||
prdIds[entities.getEntityIndex(entityId)] = prd_id.value(i);
|
||||
}
|
||||
}
|
||||
const prdIdColumn = Column.ofArray({ array: prdIds, schema: Column.Schema.str });
|
||||
|
||||
return {
|
||||
...entities,
|
||||
prd_id: prdIdColumn
|
||||
};
|
||||
}
|
||||
@@ -18,13 +18,13 @@ import { sortAtomSite } from './sort';
|
||||
import { ModelFormat } from '../../format';
|
||||
import { getAtomicRanges } from '../../../mol-model/structure/model/properties/utils/atomic-ranges';
|
||||
import { AtomSite, BasicData } from './schema';
|
||||
import { getProperties } from './properties';
|
||||
import { getEntities } from './entities';
|
||||
import { getChemicalComponentMap, getMissingResidues, getSaccharideComponentMap, getStructAsymMap } from './properties';
|
||||
import { getEntitiesWithPRD, getEntityData } from './entities';
|
||||
import { getModelGroupName } from './util';
|
||||
import { ArrayTrajectory } from '../../../mol-model/structure/trajectory';
|
||||
|
||||
export async function createModels(data: BasicData, format: ModelFormat, ctx: RuntimeContext) {
|
||||
const properties = getProperties(data);
|
||||
const properties = getCommonProperties(data, format);
|
||||
const models = data.ihm_model_list._rowCount > 0
|
||||
? await readIntegrative(ctx, data, properties, format)
|
||||
: await readStandard(ctx, data, properties, format);
|
||||
@@ -36,9 +36,18 @@ export async function createModels(data: BasicData, format: ModelFormat, ctx: Ru
|
||||
return new ArrayTrajectory(models);
|
||||
}
|
||||
|
||||
/** Standard atomic model */
|
||||
function createStandardModel(data: BasicData, atom_site: AtomSite, sourceIndex: Column<number>, entities: Entities, properties: Model['properties'], format: ModelFormat, previous?: Model): Model {
|
||||
type CommonProperties = Omit<Model['properties'], 'structAsymMap'>
|
||||
|
||||
function getCommonProperties(data: BasicData, format: ModelFormat): CommonProperties {
|
||||
return {
|
||||
missingResidues: getMissingResidues(data),
|
||||
chemicalComponentMap: getChemicalComponentMap(data),
|
||||
saccharideComponentMap: getSaccharideComponentMap(data)
|
||||
};
|
||||
}
|
||||
|
||||
/** Standard atomic model */
|
||||
function createStandardModel(data: BasicData, atom_site: AtomSite, sourceIndex: Column<number>, entities: Entities, properties: CommonProperties, format: ModelFormat, previous?: Model): Model {
|
||||
const atomic = getAtomicHierarchyAndConformation(atom_site, sourceIndex, entities, properties.chemicalComponentMap, format, previous);
|
||||
const modelNum = atom_site.pdbx_PDB_model_num.value(0);
|
||||
if (previous && atomic.sameAsPrevious) {
|
||||
@@ -54,6 +63,7 @@ function createStandardModel(data: BasicData, atom_site: AtomSite, sourceIndex:
|
||||
const coarse = EmptyCoarse;
|
||||
const sequence = getSequence(data, entities, atomic.hierarchy, coarse.hierarchy);
|
||||
const atomicRanges = getAtomicRanges(atomic.hierarchy, entities, atomic.conformation, sequence);
|
||||
const structAsymMap = getStructAsymMap(atomic.hierarchy);
|
||||
|
||||
const entry = data.entry.id.valueKind(0) === Column.ValueKind.Present
|
||||
? data.entry.id.value(0) : format.name;
|
||||
@@ -70,7 +80,7 @@ function createStandardModel(data: BasicData, atom_site: AtomSite, sourceIndex:
|
||||
sourceData: format,
|
||||
modelNum,
|
||||
parent: undefined,
|
||||
entities,
|
||||
entities: getEntitiesWithPRD(data, entities, structAsymMap),
|
||||
sequence,
|
||||
atomicHierarchy: atomic.hierarchy,
|
||||
atomicConformation: atomic.conformation,
|
||||
@@ -78,7 +88,10 @@ function createStandardModel(data: BasicData, atom_site: AtomSite, sourceIndex:
|
||||
atomicChainOperatorMappinng: atomic.chainOperatorMapping,
|
||||
coarseHierarchy: coarse.hierarchy,
|
||||
coarseConformation: coarse.conformation,
|
||||
properties,
|
||||
properties: {
|
||||
...properties,
|
||||
structAsymMap
|
||||
},
|
||||
customProperties: new CustomProperties(),
|
||||
_staticPropertyData: Object.create(null),
|
||||
_dynamicPropertyData: Object.create(null)
|
||||
@@ -86,9 +99,9 @@ function createStandardModel(data: BasicData, atom_site: AtomSite, sourceIndex:
|
||||
}
|
||||
|
||||
/** Integrative model with atomic/coarse parts */
|
||||
function createIntegrativeModel(data: BasicData, ihm: CoarseData, properties: Model['properties'], format: ModelFormat): Model {
|
||||
function createIntegrativeModel(data: BasicData, ihm: CoarseData, properties: CommonProperties, format: ModelFormat): Model {
|
||||
const atomic = getAtomicHierarchyAndConformation(ihm.atom_site, ihm.atom_site_sourceIndex, ihm.entities, properties.chemicalComponentMap, format);
|
||||
const coarse = getCoarse(ihm, properties);
|
||||
const coarse = getCoarse(ihm, properties.chemicalComponentMap);
|
||||
const sequence = getSequence(data, ihm.entities, atomic.hierarchy, coarse.hierarchy);
|
||||
const atomicRanges = getAtomicRanges(atomic.hierarchy, ihm.entities, atomic.conformation, sequence);
|
||||
|
||||
@@ -101,6 +114,8 @@ function createIntegrativeModel(data: BasicData, ihm: CoarseData, properties: Mo
|
||||
if (ihm.model_name) label.push(ihm.model_name);
|
||||
if (ihm.model_group_name) label.push(ihm.model_group_name);
|
||||
|
||||
const structAsymMap = getStructAsymMap(atomic.hierarchy, data);
|
||||
|
||||
return {
|
||||
id: UUID.create22(),
|
||||
entryId: entry,
|
||||
@@ -109,7 +124,7 @@ function createIntegrativeModel(data: BasicData, ihm: CoarseData, properties: Mo
|
||||
sourceData: format,
|
||||
modelNum: ihm.model_id,
|
||||
parent: undefined,
|
||||
entities: ihm.entities,
|
||||
entities: getEntitiesWithPRD(data, ihm.entities, structAsymMap),
|
||||
sequence,
|
||||
atomicHierarchy: atomic.hierarchy,
|
||||
atomicConformation: atomic.conformation,
|
||||
@@ -117,7 +132,10 @@ function createIntegrativeModel(data: BasicData, ihm: CoarseData, properties: Mo
|
||||
atomicChainOperatorMappinng: atomic.chainOperatorMapping,
|
||||
coarseHierarchy: coarse.hierarchy,
|
||||
coarseConformation: coarse.conformation,
|
||||
properties,
|
||||
properties: {
|
||||
...properties,
|
||||
structAsymMap
|
||||
},
|
||||
customProperties: new CustomProperties(),
|
||||
_staticPropertyData: Object.create(null),
|
||||
_dynamicPropertyData: Object.create(null)
|
||||
@@ -132,12 +150,12 @@ function findModelEnd(num: Column<number>, startIndex: number) {
|
||||
return endIndex;
|
||||
}
|
||||
|
||||
async function readStandard(ctx: RuntimeContext, data: BasicData, properties: Model['properties'], format: ModelFormat) {
|
||||
async function readStandard(ctx: RuntimeContext, data: BasicData, properties: CommonProperties, format: ModelFormat) {
|
||||
const models: Model[] = [];
|
||||
|
||||
if (data.atom_site) {
|
||||
const atomCount = data.atom_site.id.rowCount;
|
||||
const entities = getEntities(data, properties);
|
||||
const entities = getEntityData(data);
|
||||
|
||||
let modelStart = 0;
|
||||
while (modelStart < atomCount) {
|
||||
@@ -170,8 +188,8 @@ function splitTable<T extends Table<any>>(table: T, col: Column<number>) {
|
||||
|
||||
|
||||
|
||||
async function readIntegrative(ctx: RuntimeContext, data: BasicData, properties: Model['properties'], format: ModelFormat) {
|
||||
const entities = getEntities(data, properties);
|
||||
async function readIntegrative(ctx: RuntimeContext, data: BasicData, properties: CommonProperties, format: ModelFormat) {
|
||||
const entities = getEntityData(data);
|
||||
// when `atom_site.ihm_model_id` is undefined fall back to `atom_site.pdbx_PDB_model_num`
|
||||
const atom_sites_modelColumn = data.atom_site.ihm_model_id.isDefined
|
||||
? data.atom_site.ihm_model_id : data.atom_site.pdbx_PDB_model_num;
|
||||
@@ -206,7 +224,7 @@ async function readIntegrative(ctx: RuntimeContext, data: BasicData, properties:
|
||||
model_id: id,
|
||||
model_name: model_name.value(i),
|
||||
model_group_name: getModelGroupName(id, data),
|
||||
entities: entities,
|
||||
entities,
|
||||
atom_site,
|
||||
atom_site_sourceIndex,
|
||||
ihm_sphere_obj_site: sphere_sites.has(id) ? sphere_sites.get(id)!.table : Table.window(data.ihm_sphere_obj_site, data.ihm_sphere_obj_site._schema, 0, 0),
|
||||
|
||||
@@ -5,15 +5,16 @@
|
||||
* @author Alexander Rose <alexander.rose@weirdbyte.de>
|
||||
*/
|
||||
|
||||
import { Table } from '../../../mol-data/db';
|
||||
import { Model } from '../../../mol-model/structure/model/model';
|
||||
import { AtomicHierarchy } from '../../../mol-model/structure/model/properties/atomic';
|
||||
import { ChemicalComponent, MissingResidue, StructAsym } from '../../../mol-model/structure/model/properties/common';
|
||||
import { getMoleculeType, MoleculeType, getDefaultChemicalComponent } from '../../../mol-model/structure/model/types';
|
||||
import { SaccharideComponentMap, SaccharideComponent, SaccharidesSnfgMap, SaccharideCompIdMap, UnknownSaccharideComponent } from '../../../mol-model/structure/structure/carbohydrates/constants';
|
||||
import { getDefaultChemicalComponent, getMoleculeType, MoleculeType } from '../../../mol-model/structure/model/types';
|
||||
import { SaccharideCompIdMap, SaccharideComponent, SaccharideComponentMap, SaccharidesSnfgMap, UnknownSaccharideComponent } from '../../../mol-model/structure/structure/carbohydrates/constants';
|
||||
import { memoize1 } from '../../../mol-util/memoize';
|
||||
import { BasicData } from './schema';
|
||||
import { Table } from '../../../mol-data/db';
|
||||
|
||||
function getMissingResidues(data: BasicData): Model['properties']['missingResidues'] {
|
||||
export function getMissingResidues(data: BasicData): Model['properties']['missingResidues'] {
|
||||
const map = new Map<string, MissingResidue>();
|
||||
const getKey = (model_num: number, asym_id: string, seq_id: number) => {
|
||||
return `${model_num}|${asym_id}|${seq_id}`;
|
||||
@@ -36,7 +37,7 @@ function getMissingResidues(data: BasicData): Model['properties']['missingResidu
|
||||
};
|
||||
}
|
||||
|
||||
function getChemicalComponentMap(data: BasicData): Model['properties']['chemicalComponentMap'] {
|
||||
export function getChemicalComponentMap(data: BasicData): Model['properties']['chemicalComponentMap'] {
|
||||
const map = new Map<string, ChemicalComponent>();
|
||||
|
||||
if (data.chem_comp._rowCount > 0) {
|
||||
@@ -53,7 +54,7 @@ function getChemicalComponentMap(data: BasicData): Model['properties']['chemical
|
||||
return map;
|
||||
}
|
||||
|
||||
function getSaccharideComponentMap(data: BasicData): SaccharideComponentMap {
|
||||
export function getSaccharideComponentMap(data: BasicData): SaccharideComponentMap {
|
||||
const map = new Map<string, SaccharideComponent>();
|
||||
|
||||
if (data.pdbx_chem_comp_identifier._rowCount > 0) {
|
||||
@@ -108,22 +109,18 @@ const getUniqueComponentNames = memoize1((data: BasicData) => {
|
||||
});
|
||||
|
||||
|
||||
function getStructAsymMap(data: BasicData): Model['properties']['structAsymMap'] {
|
||||
export function getStructAsymMap(atomic: AtomicHierarchy, data?: BasicData): Model['properties']['structAsymMap'] {
|
||||
const map = new Map<string, StructAsym>();
|
||||
|
||||
const { label_asym_id, auth_asym_id, label_entity_id } = data.atom_site;
|
||||
for (let i = 0, il = label_asym_id.rowCount; i < il; ++i) {
|
||||
const { auth_asym_id, label_asym_id, label_entity_id } = atomic.chains;
|
||||
|
||||
for (let i = 0, _i = atomic.chains._rowCount; i < _i; i ++) {
|
||||
const id = label_asym_id.value(i);
|
||||
if (!map.has(id)) {
|
||||
map.set(id, {
|
||||
id,
|
||||
auth_id: auth_asym_id.value(i),
|
||||
entity_id: label_entity_id.value(i)
|
||||
});
|
||||
}
|
||||
map.set(id, { id, auth_id: auth_asym_id.value(i), entity_id: label_entity_id.value(i) });
|
||||
}
|
||||
|
||||
if (data.struct_asym._rowCount > 0) {
|
||||
// to get asym mapping for coarse/ihm data
|
||||
if (data?.struct_asym._rowCount) {
|
||||
const { id, entity_id } = data.struct_asym;
|
||||
for (let i = 0, il = id.rowCount; i < il; ++i) {
|
||||
const _id = id.value(i);
|
||||
@@ -136,14 +133,6 @@ function getStructAsymMap(data: BasicData): Model['properties']['structAsymMap']
|
||||
}
|
||||
}
|
||||
}
|
||||
return map;
|
||||
}
|
||||
|
||||
export function getProperties(data: BasicData): Model['properties'] {
|
||||
return {
|
||||
missingResidues: getMissingResidues(data),
|
||||
chemicalComponentMap: getChemicalComponentMap(data),
|
||||
saccharideComponentMap: getSaccharideComponentMap(data),
|
||||
structAsymMap: getStructAsymMap(data)
|
||||
};
|
||||
return map;
|
||||
}
|
||||
@@ -1,5 +1,5 @@
|
||||
/**
|
||||
* Copyright (c) 2019-2021 mol* contributors, licensed under MIT, See LICENSE file for more info.
|
||||
* Copyright (c) 2019-2022 mol* contributors, licensed under MIT, See LICENSE file for more info.
|
||||
*
|
||||
* @author Alexander Rose <alexander.rose@weirdbyte.de>
|
||||
*/
|
||||
@@ -123,6 +123,8 @@ function getInteractionLoci(pickingId: PickingId, structureGroup: StructureGroup
|
||||
return EmptyLoci;
|
||||
}
|
||||
|
||||
const __contactIndicesSet = new Set<number>();
|
||||
|
||||
function eachInteraction(loci: Loci, structureGroup: StructureGroup, apply: (interval: Interval) => boolean, isMarking: boolean) {
|
||||
let changed = false;
|
||||
if (Interactions.isLoci(loci)) {
|
||||
@@ -156,21 +158,36 @@ function eachInteraction(loci: Loci, structureGroup: StructureGroup, apply: (int
|
||||
|
||||
const { offset } = contacts;
|
||||
const { offsets: fOffsets, indices: fIndices } = features.elementsIndex;
|
||||
const { members, offsets } = features;
|
||||
|
||||
// TODO: when isMarking, all elements of contact features need to be in the loci
|
||||
for (const e of loci.elements) {
|
||||
const unitIdx = group.unitIndexMap.get(e.unit.id);
|
||||
if (unitIdx !== undefined) continue;
|
||||
if (isMarking && OrderedSet.size(e.indices) === 1) continue;
|
||||
if (unitIdx === undefined) continue;
|
||||
|
||||
__contactIndicesSet.clear();
|
||||
OrderedSet.forEach(e.indices, v => {
|
||||
for (let i = fOffsets[v], il = fOffsets[v + 1]; i < il; ++i) {
|
||||
const fI = fIndices[i];
|
||||
for (let j = offset[fI], jl = offset[fI + 1]; j < jl; ++j) {
|
||||
if (apply(Interval.ofSingleton(unitIdx * groupCount + j))) changed = true;
|
||||
__contactIndicesSet.add(j);
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
__contactIndicesSet.forEach(i => {
|
||||
if (isMarking) {
|
||||
const fA = contacts.a[i];
|
||||
for (let j = offsets[fA], jl = offsets[fA + 1]; j < jl; ++j) {
|
||||
if (!OrderedSet.has(e.indices, members[j])) return;
|
||||
}
|
||||
const fB = contacts.b[i];
|
||||
for (let j = offsets[fB], jl = offsets[fB + 1]; j < jl; ++j) {
|
||||
if (!OrderedSet.has(e.indices, members[j])) return;
|
||||
}
|
||||
}
|
||||
|
||||
if (apply(Interval.ofSingleton(unitIdx * groupCount + i))) changed = true;
|
||||
});
|
||||
}
|
||||
}
|
||||
return changed;
|
||||
|
||||
@@ -29,7 +29,7 @@ namespace BestDatabaseSequenceMapping {
|
||||
type: 'static',
|
||||
defaultParams: {},
|
||||
getParams: () => ({}),
|
||||
isApplicable: (data: Model) => MmcifFormat.is(data.sourceData) && data.sourceData.data.frame.categories?.atom_site?.fieldNames.indexOf('db_name') >= 0,
|
||||
isApplicable: (data: Model) => MmcifFormat.is(data.sourceData) && data.sourceData.data.frame.categories?.atom_site?.fieldNames.indexOf('pdbx_sifts_xref_db_name') >= 0,
|
||||
obtain: async (ctx, data) => {
|
||||
return { value: fromCif(data) };
|
||||
}
|
||||
@@ -40,7 +40,7 @@ namespace BestDatabaseSequenceMapping {
|
||||
const data = Provider.get(model).value;
|
||||
if (!data) return '';
|
||||
const eI = loc.unit.elements[loc.element];
|
||||
const rI = model.atomicHierarchy.residueAtomSegments.offsets[eI];
|
||||
const rI = model.atomicHierarchy.residueAtomSegments.index[eI];
|
||||
return data.accession[rI];
|
||||
}
|
||||
|
||||
@@ -49,7 +49,7 @@ namespace BestDatabaseSequenceMapping {
|
||||
const data = Provider.get(model).value;
|
||||
if (!data) return;
|
||||
const eI = loc.unit.elements[loc.element];
|
||||
const rI = model.atomicHierarchy.residueAtomSegments.offsets[eI];
|
||||
const rI = model.atomicHierarchy.residueAtomSegments.index[eI];
|
||||
const dbName = data.dbName[rI];
|
||||
if (!dbName) return;
|
||||
return `${dbName} ${data.accession[rI]} ${data.num[rI]} ${data.residue[rI]}`;
|
||||
@@ -59,10 +59,10 @@ namespace BestDatabaseSequenceMapping {
|
||||
if (!MmcifFormat.is(model.sourceData)) return;
|
||||
|
||||
const { atom_site } = model.sourceData.data.frame.categories;
|
||||
const db_name = atom_site.getField('db_name');
|
||||
const db_acc = atom_site.getField('db_acc');
|
||||
const db_num = atom_site.getField('db_num');
|
||||
const db_res = atom_site.getField('db_res');
|
||||
const db_name = atom_site.getField('pdbx_sifts_xref_db_name');
|
||||
const db_acc = atom_site.getField('pdbx_sifts_xref_db_acc');
|
||||
const db_num = atom_site.getField('pdbx_sifts_xref_db_num');
|
||||
const db_res = atom_site.getField('pdbx_sifts_xref_db_res');
|
||||
|
||||
if (!db_name || !db_acc || !db_num || !db_res) return;
|
||||
|
||||
@@ -77,17 +77,17 @@ namespace BestDatabaseSequenceMapping {
|
||||
const row = atomSourceIndex.value(residueOffsets[i]);
|
||||
|
||||
if (db_name.valueKind(row) !== Column.ValueKind.Present) {
|
||||
dbName[row] = '';
|
||||
accession[row] = '';
|
||||
num[row] = 0;
|
||||
residue[row] = '';
|
||||
dbName[i] = '';
|
||||
accession[i] = '';
|
||||
num[i] = 0;
|
||||
residue[i] = '';
|
||||
continue;
|
||||
}
|
||||
|
||||
dbName[row] = db_name.str(row);
|
||||
accession[row] = db_acc.str(row);
|
||||
num[row] = db_num.int(row);
|
||||
residue[row] = db_res.str(row);
|
||||
dbName[i] = db_name.str(row);
|
||||
accession[i] = db_acc.str(row);
|
||||
num[i] = db_num.int(row);
|
||||
residue[i] = db_res.str(row);
|
||||
}
|
||||
|
||||
return { dbName, accession, num, residue };
|
||||
|
||||
@@ -52,6 +52,10 @@ function isWithoutSymmetry(structure: Structure) {
|
||||
return structure.units.every(u => u.conformation.operator.isIdentity);
|
||||
}
|
||||
|
||||
function isWithoutOperator(structure: Structure) {
|
||||
return isWithoutSymmetry(structure) && structure.units.every(u => !u.conformation.operator.assembly && !u.conformation.operator.suffix);
|
||||
}
|
||||
|
||||
const Categories = [
|
||||
// Basics
|
||||
copy_mmCif_category('entry'),
|
||||
@@ -63,9 +67,9 @@ const Categories = [
|
||||
copy_mmCif_category('symmetry', isWithoutSymmetry),
|
||||
|
||||
// Assemblies
|
||||
copy_mmCif_category('pdbx_struct_assembly', isWithoutSymmetry),
|
||||
copy_mmCif_category('pdbx_struct_assembly_gen', isWithoutSymmetry),
|
||||
copy_mmCif_category('pdbx_struct_oper_list', isWithoutSymmetry),
|
||||
copy_mmCif_category('pdbx_struct_assembly', isWithoutOperator),
|
||||
copy_mmCif_category('pdbx_struct_assembly_gen', isWithoutOperator),
|
||||
copy_mmCif_category('pdbx_struct_oper_list', isWithoutOperator),
|
||||
|
||||
// Secondary structure
|
||||
_struct_conf,
|
||||
@@ -250,10 +254,10 @@ function encode_mmCIF_categories_copyAll(encoder: CifWriter.Encoder, ctx: CifExp
|
||||
}
|
||||
|
||||
|
||||
function to_mmCIF(name: string, structure: Structure, asBinary = false) {
|
||||
function to_mmCIF(name: string, structure: Structure, asBinary = false, params?: encode_mmCIF_categories_Params) {
|
||||
const enc = CifWriter.createEncoder({ binary: asBinary });
|
||||
enc.startDataBlock(name);
|
||||
encode_mmCIF_categories(enc, structure);
|
||||
encode_mmCIF_categories(enc, structure, params);
|
||||
return enc.getData();
|
||||
}
|
||||
|
||||
|
||||
@@ -22,7 +22,7 @@ export const EntitySubtype = Column.Schema.Aliased<EntitySubtype>(Column.Schema.
|
||||
export interface Entities {
|
||||
data: mmCIF_Database['entity'],
|
||||
subtype: Column<EntitySubtype>,
|
||||
prd_id: Column<string>,
|
||||
prd_id?: Column<string>,
|
||||
getEntityIndex(id: string): EntityIndex
|
||||
}
|
||||
|
||||
|
||||
@@ -126,6 +126,7 @@ const coarse = {
|
||||
z: atom.z,
|
||||
|
||||
asym_id: p(l => !Unit.isCoarse(l.unit) ? notCoarse() : l.unit.coarseElements.asym_id.value(l.element)),
|
||||
entity_id: p(l => !Unit.isCoarse(l.unit) ? notCoarse() : l.unit.coarseElements.entity_id.value(l.element)),
|
||||
seq_id_begin: p(l => !Unit.isCoarse(l.unit) ? notCoarse() : l.unit.coarseElements.seq_id_begin.value(l.element)),
|
||||
seq_id_end: p(l => !Unit.isCoarse(l.unit) ? notCoarse() : l.unit.coarseElements.seq_id_end.value(l.element)),
|
||||
|
||||
@@ -162,7 +163,7 @@ const entity = {
|
||||
pdbx_ec: p(l => l.unit.model.entities.data.pdbx_ec.value(eK(l))),
|
||||
|
||||
subtype: p(l => l.unit.model.entities.subtype.value(eK(l))),
|
||||
prd_id: p(l => l.unit.model.entities.prd_id.value(eK(l))),
|
||||
prd_id: p(l => l.unit.model.entities.prd_id?.value(eK(l)) ?? ''),
|
||||
};
|
||||
|
||||
const _emptyList: any[] = [];
|
||||
|
||||
@@ -5,6 +5,7 @@
|
||||
*/
|
||||
|
||||
import { Segmentation } from '../../../../mol-data/int';
|
||||
import { Mat4 } from '../../../../mol-math/linear-algebra';
|
||||
import { MinimizeRmsd } from '../../../../mol-math/linear-algebra/3d/minimize-rmsd';
|
||||
import { BestDatabaseSequenceMapping } from '../../../../mol-model-props/sequence/best-database-mapping';
|
||||
import { ElementIndex } from '../../model/indexing';
|
||||
@@ -33,6 +34,7 @@ export function alignAndSuperposeWithBestDatabaseMapping(structures: Structure[]
|
||||
for (const p of pairs) {
|
||||
const [a, b] = getPositionTables(index, p.i, p.j, p.count);
|
||||
const transform = MinimizeRmsd.compute({ a, b });
|
||||
console.log(Mat4.makeTable(transform.bTransform), transform.rmsd);
|
||||
ret.push({ transform, pivot: p.i, other: p.j });
|
||||
}
|
||||
|
||||
@@ -51,6 +53,8 @@ function getPositionTables(index: IndexEntry[], pivot: number, other: number, N:
|
||||
|
||||
const l = Math.min(a[2] - a[1], b[2] - b[1]);
|
||||
|
||||
// TODO: allow to use just backbone atoms?
|
||||
// TODO: check if residue types match?
|
||||
for (let i = 0; i < l; i++) {
|
||||
let eI = (a[1] + i) as ElementIndex;
|
||||
xs.x[o] = a[0].conformation.x(eI);
|
||||
@@ -122,7 +126,6 @@ function buildIndex(structure: Structure, index: Map<string, IndexEntry>, sI: nu
|
||||
if (unit.kind !== Unit.Kind.Atomic) continue;
|
||||
|
||||
const { elements, model } = unit;
|
||||
const { offsets: residueOffset } = model.atomicHierarchy.residueAtomSegments;
|
||||
|
||||
const map = BestDatabaseSequenceMapping.Provider.get(model).value;
|
||||
if (!map) return;
|
||||
@@ -137,23 +140,27 @@ function buildIndex(structure: Structure, index: Map<string, IndexEntry>, sI: nu
|
||||
residuesIt.setSegment(chainSegment);
|
||||
while (residuesIt.hasNext) {
|
||||
const residueSegment = residuesIt.move();
|
||||
const eI = elements[residueSegment.start];
|
||||
const rI = residueOffset[eI];
|
||||
const rI = residueSegment.index;
|
||||
|
||||
if (!dbName[rI]) continue;
|
||||
|
||||
const start = elements[residueSegment.start];
|
||||
const end = elements[residueSegment.end - 1] + 1 as ElementIndex;
|
||||
|
||||
const key = `${dbName[rI]}-${accession[rI]}-${num[rI]}`;
|
||||
|
||||
if (!index.has(key)) {
|
||||
index.set(key, { key, pivots: { [sI]: [unit, eI, elements[residueSegment.end]] } });
|
||||
index.set(key, { key, pivots: { [sI]: [unit, start, end] } });
|
||||
} else {
|
||||
const entry = index.get(key)!;
|
||||
|
||||
if (!entry.pivots[sI]) {
|
||||
entry.pivots[sI] = [unit, eI, elements[residueSegment.end]];
|
||||
entry.pivots[sI] = [unit, start, end];
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
console.log(index);
|
||||
}
|
||||
@@ -7,8 +7,10 @@
|
||||
import { PluginContext } from '../../mol-plugin/context';
|
||||
import { StateAction } from '../../mol-state';
|
||||
import { Task } from '../../mol-task';
|
||||
import { Asset } from '../../mol-util/assets';
|
||||
import { getFileInfo } from '../../mol-util/file-info';
|
||||
import { ParamDefinition as PD } from '../../mol-util/param-definition';
|
||||
import { unzip } from '../../mol-util/zip/zip';
|
||||
import { PluginStateObject } from '../objects';
|
||||
|
||||
export const OpenFiles = StateAction.build({
|
||||
@@ -33,24 +35,37 @@ export const OpenFiles = StateAction.build({
|
||||
plugin.log.error('No file(s) selected');
|
||||
return;
|
||||
}
|
||||
|
||||
const processFile = async (file: Asset.File) => {
|
||||
const info = getFileInfo(file.file!);
|
||||
const isBinary = plugin.dataFormats.binaryExtensions.has(info.ext);
|
||||
const { data } = await plugin.builders.data.readFile({ file, isBinary });
|
||||
const provider = params.format.name === 'auto'
|
||||
? plugin.dataFormats.auto(info, data.cell?.obj!)
|
||||
: plugin.dataFormats.get(params.format.params);
|
||||
|
||||
if (!provider) {
|
||||
plugin.log.warn(`OpenFiles: could not find data provider for '${info.name}.${info.ext}'`);
|
||||
return;
|
||||
}
|
||||
|
||||
// need to await so that the enclosing Task finishes after the update is done.
|
||||
const parsed = await provider.parse(plugin, data);
|
||||
if (params.visuals) {
|
||||
await provider.visuals?.(plugin, parsed);
|
||||
}
|
||||
};
|
||||
|
||||
for (const file of params.files) {
|
||||
try {
|
||||
const info = getFileInfo(file.file!);
|
||||
const isBinary = plugin.dataFormats.binaryExtensions.has(info.ext);
|
||||
const { data } = await plugin.builders.data.readFile({ file, isBinary });
|
||||
const provider = params.format.name === 'auto'
|
||||
? plugin.dataFormats.auto(info, data.cell?.obj!)
|
||||
: plugin.dataFormats.get(params.format.params);
|
||||
|
||||
if (!provider) {
|
||||
plugin.log.warn(`OpenFiles: could not find data provider for '${info.name}.${info.ext}'`);
|
||||
continue;
|
||||
}
|
||||
|
||||
// need to await so that the enclosing Task finishes after the update is done.
|
||||
const parsed = await provider.parse(plugin, data);
|
||||
if (params.visuals) {
|
||||
await provider.visuals?.(plugin, parsed);
|
||||
if (file.file && file.name.toLowerCase().endsWith('.zip')) {
|
||||
const zippedFiles = await unzip(taskCtx, await file.file.arrayBuffer());
|
||||
for (const [fn, filedata] of Object.entries(zippedFiles)) {
|
||||
const asset = Asset.File(new File([filedata as Uint8Array], fn));
|
||||
await processFile(asset);
|
||||
}
|
||||
} else {
|
||||
await processFile(file);
|
||||
}
|
||||
} catch (e) {
|
||||
console.error(e);
|
||||
|
||||
@@ -185,9 +185,9 @@ export class SuperpositionControls extends PurePluginUIComponent<{ }, Superposit
|
||||
rmsd += xform.transform.rmsd;
|
||||
}
|
||||
|
||||
rmsd /= transforms.length - 1;
|
||||
rmsd /= Math.max(transforms.length - 1, 1);
|
||||
|
||||
this.plugin.log.info(`Superposed ${input.length} structures with avg. RMSD ${rmsd.toFixed(2)}.`);
|
||||
this.plugin.log.info(`Superposed ${input.length} structures with avg. RMSD ${rmsd.toFixed(2)} Å.`);
|
||||
await new Promise(res => requestAnimationFrame(res));
|
||||
PluginCommands.Camera.Reset(this.plugin);
|
||||
};
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/**
|
||||
* Copyright (c) 2018-2020 mol* contributors, licensed under MIT, See LICENSE file for more info.
|
||||
* Copyright (c) 2018-2022 mol* contributors, licensed under MIT, See LICENSE file for more info.
|
||||
*
|
||||
* @author Alexander Rose <alexander.rose@weirdbyte.de>
|
||||
*/
|
||||
@@ -101,6 +101,8 @@ function getLinkLoci(pickingId: PickingId, structure: Structure, id: number) {
|
||||
return EmptyLoci;
|
||||
}
|
||||
|
||||
const __linkIndicesSet = new Set<number>();
|
||||
|
||||
function eachCarbohydrateLink(loci: Loci, structure: Structure, apply: (interval: Interval) => boolean) {
|
||||
let changed = false;
|
||||
if (!StructureElement.Loci.is(loci)) return false;
|
||||
@@ -110,11 +112,14 @@ function eachCarbohydrateLink(loci: Loci, structure: Structure, apply: (interval
|
||||
for (const { unit, indices } of loci.elements) {
|
||||
if (!Unit.isAtomic(unit)) continue;
|
||||
|
||||
__linkIndicesSet.clear();
|
||||
OrderedSet.forEach(indices, v => {
|
||||
// TODO avoid duplicate calls to apply
|
||||
const linkIndices = getLinkIndices(unit, unit.elements[v]);
|
||||
for (let i = 0, il = linkIndices.length; i < il; ++i) {
|
||||
if (apply(Interval.ofSingleton(linkIndices[i]))) changed = true;
|
||||
if (!__linkIndicesSet.has(linkIndices[i])) {
|
||||
__linkIndicesSet.add(linkIndices[i]);
|
||||
if (apply(Interval.ofSingleton(linkIndices[i]))) changed = true;
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/**
|
||||
* Copyright (c) 2018-2020 mol* contributors, licensed under MIT, See LICENSE file for more info.
|
||||
* Copyright (c) 2018-2022 mol* contributors, licensed under MIT, See LICENSE file for more info.
|
||||
*
|
||||
* @author Alexander Rose <alexander.rose@weirdbyte.de>
|
||||
*/
|
||||
@@ -29,8 +29,8 @@ import { getAltResidueLociFromId } from './util/common';
|
||||
import { BaseGeometry } from '../../../mol-geo/geometry/base';
|
||||
|
||||
const t = Mat4.identity();
|
||||
const sVec = Vec3.zero();
|
||||
const pd = Vec3.zero();
|
||||
const sVec = Vec3();
|
||||
const pd = Vec3();
|
||||
|
||||
const SideFactor = 2 * 0.806; // 0.806 == Math.cos(Math.PI / 4)
|
||||
|
||||
@@ -212,6 +212,8 @@ function getCarbohydrateLoci(pickingId: PickingId, structure: Structure, id: num
|
||||
return EmptyLoci;
|
||||
}
|
||||
|
||||
const __elementIndicesSet = new Set<number>();
|
||||
|
||||
/** For each carbohydrate (usually a monosaccharide) when all its residue's elements are in a loci. */
|
||||
function eachCarbohydrate(loci: Loci, structure: Structure, apply: (interval: Interval) => boolean) {
|
||||
const { getElementIndices } = structure.carbohydrates;
|
||||
@@ -222,11 +224,14 @@ function eachCarbohydrate(loci: Loci, structure: Structure, apply: (interval: In
|
||||
for (const { unit, indices } of loci.elements) {
|
||||
if (!Unit.isAtomic(unit)) continue;
|
||||
|
||||
__elementIndicesSet.clear();
|
||||
OrderedSet.forEach(indices, v => {
|
||||
// TODO avoid duplicate calls to apply
|
||||
const elementIndices = getElementIndices(unit, unit.elements[v]);
|
||||
for (let i = 0, il = elementIndices.length; i < il; ++i) {
|
||||
if (apply(Interval.ofSingleton(elementIndices[i] * 2))) changed = true;
|
||||
if (!__elementIndicesSet.has(elementIndices[i])) {
|
||||
__elementIndicesSet.add(elementIndices[i]);
|
||||
if (apply(Interval.ofSingleton(elementIndices[i] * 2))) changed = true;
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/**
|
||||
* Copyright (c) 2018-2020 mol* contributors, licensed under MIT, See LICENSE file for more info.
|
||||
* Copyright (c) 2018-2022 mol* contributors, licensed under MIT, See LICENSE file for more info.
|
||||
*
|
||||
* @author Alexander Rose <alexander.rose@weirdbyte.de>
|
||||
*/
|
||||
@@ -123,6 +123,8 @@ function getTerminalLinkLoci(pickingId: PickingId, structure: Structure, id: num
|
||||
return EmptyLoci;
|
||||
}
|
||||
|
||||
const __linkIndicesSet = new Set<number>();
|
||||
|
||||
function eachTerminalLink(loci: Loci, structure: Structure, apply: (interval: Interval) => boolean) {
|
||||
let changed = false;
|
||||
if (!StructureElement.Loci.is(loci)) return false;
|
||||
@@ -132,11 +134,14 @@ function eachTerminalLink(loci: Loci, structure: Structure, apply: (interval: In
|
||||
for (const { unit, indices } of loci.elements) {
|
||||
if (!Unit.isAtomic(unit)) continue;
|
||||
|
||||
__linkIndicesSet.clear();
|
||||
OrderedSet.forEach(indices, v => {
|
||||
// TODO avoid duplicate calls to apply
|
||||
const linkIndices = getTerminalLinkIndices(unit, unit.elements[v]);
|
||||
for (let i = 0, il = linkIndices.length; i < il; ++i) {
|
||||
if (apply(Interval.ofSingleton(linkIndices[i]))) changed = true;
|
||||
if (!__linkIndicesSet.has(linkIndices[i])) {
|
||||
__linkIndicesSet.add(linkIndices[i]);
|
||||
if (apply(Interval.ofSingleton(linkIndices[i]))) changed = true;
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/**
|
||||
* Copyright (c) 2018-2021 mol* contributors, licensed under MIT, See LICENSE file for more info.
|
||||
* Copyright (c) 2018-2022 mol* contributors, licensed under MIT, See LICENSE file for more info.
|
||||
*
|
||||
* @author Alexander Rose <alexander.rose@weirdbyte.de>
|
||||
*/
|
||||
@@ -88,6 +88,7 @@ namespace Visual {
|
||||
const currentStatus = markerStatus.ref.value as MarkerInfo['status'];
|
||||
|
||||
if (!isEveryLoci(loci)) {
|
||||
// assume that all interval are non-overlapping
|
||||
let intervalSize = 0;
|
||||
lociApply(loci, interval => {
|
||||
intervalSize += Interval.size(interval);
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/**
|
||||
* Copyright (c) 2018-2020 mol* contributors, licensed under MIT, See LICENSE file for more info.
|
||||
* Copyright (c) 2018-2022 mol* contributors, licensed under MIT, See LICENSE file for more info.
|
||||
*
|
||||
* @author Alexander Rose <alexander.rose@weirdbyte.de>
|
||||
*/
|
||||
@@ -13,6 +13,7 @@ import { ParamDefinition as PD } from '../../mol-util/param-definition';
|
||||
import { ThemeDataContext } from '../theme';
|
||||
import { TableLegend } from '../../mol-util/legend';
|
||||
import { getAdjustedColorMap } from '../../mol-util/color/color';
|
||||
import { getColorMapParams } from '../../mol-util/color/params';
|
||||
import { ChainIdColorTheme, ChainIdColorThemeParams } from './chain-id';
|
||||
import { OperatorNameColorThemeParams, OperatorNameColorTheme } from './operator-name';
|
||||
|
||||
@@ -34,7 +35,11 @@ export const ElementSymbolColorThemeParams = {
|
||||
'element-symbol': PD.Group({})
|
||||
}, { description: 'Use chain-id coloring for carbon atoms.' }),
|
||||
saturation: PD.Numeric(0, { min: -6, max: 6, step: 0.1 }),
|
||||
lightness: PD.Numeric(0.2, { min: -6, max: 6, step: 0.1 })
|
||||
lightness: PD.Numeric(0.2, { min: -6, max: 6, step: 0.1 }),
|
||||
colors: PD.MappedStatic('default', {
|
||||
'default': PD.EmptyGroup(),
|
||||
'custom': PD.Group(getColorMapParams(ElementSymbolColors))
|
||||
})
|
||||
};
|
||||
export type ElementSymbolColorThemeParams = typeof ElementSymbolColorThemeParams
|
||||
export function getElementSymbolColorThemeParams(ctx: ThemeDataContext) {
|
||||
@@ -47,7 +52,7 @@ export function elementSymbolColor(colorMap: ElementSymbolColors, element: Eleme
|
||||
}
|
||||
|
||||
export function ElementSymbolColorTheme(ctx: ThemeDataContext, props: PD.Values<ElementSymbolColorThemeParams>): ColorTheme<ElementSymbolColorThemeParams> {
|
||||
const colorMap = getAdjustedColorMap(ElementSymbolColors, props.saturation, props.lightness);
|
||||
const colorMap = getAdjustedColorMap(props.colors.name === 'default' ? ElementSymbolColors : props.colors.params, props.saturation, props.lightness);
|
||||
|
||||
const carbonColor = props.carbonColor.name === 'chain-id'
|
||||
? ChainIdColorTheme(ctx, props.carbonColor.params).color
|
||||
@@ -86,8 +91,8 @@ export function ElementSymbolColorTheme(ctx: ThemeDataContext, props: PD.Values<
|
||||
color,
|
||||
props,
|
||||
description: Description,
|
||||
legend: TableLegend(Object.keys(ElementSymbolColors).map(name => {
|
||||
return [name, (ElementSymbolColors as any)[name] as Color] as [string, Color];
|
||||
legend: TableLegend(Object.keys(colorMap).map(name => {
|
||||
return [name, (colorMap as any)[name] as Color] as [string, Color];
|
||||
}))
|
||||
};
|
||||
}
|
||||
|
||||
@@ -1,10 +1,10 @@
|
||||
/**
|
||||
* Copyright (c) 2021 mol* contributors, licensed under MIT, See LICENSE file for more info.
|
||||
* Copyright (c) 2021-2022 mol* contributors, licensed under MIT, See LICENSE file for more info.
|
||||
*
|
||||
* @author Alexander Rose <alexander.rose@weirdbyte.de>
|
||||
*/
|
||||
|
||||
import { StructureProperties, StructureElement, Bond, Structure } from '../../mol-model/structure';
|
||||
import { StructureProperties, StructureElement, Bond, Structure, Unit } from '../../mol-model/structure';
|
||||
import { Color } from '../../mol-util/color';
|
||||
import { Location } from '../../mol-model/location';
|
||||
import { ColorTheme, LocationColor } from '../color';
|
||||
@@ -38,10 +38,30 @@ function getEntityIdSerialMap(structure: Structure) {
|
||||
const k = key(label_entity_id.value(j), i);
|
||||
if (!map.has(k)) map.set(k, map.size);
|
||||
}
|
||||
const { entity_id: spheres_entity_id } = structure.models[i].coarseHierarchy.spheres;
|
||||
for (let j = 0, jl = spheres_entity_id.rowCount; j < jl; ++j) {
|
||||
const k = key(spheres_entity_id.value(j), i);
|
||||
if (!map.has(k)) map.set(k, map.size);
|
||||
}
|
||||
const { entity_id: gaussians_entity_id } = structure.models[i].coarseHierarchy.gaussians;
|
||||
for (let j = 0, jl = gaussians_entity_id.rowCount; j < jl; ++j) {
|
||||
const k = key(gaussians_entity_id.value(j), i);
|
||||
if (!map.has(k)) map.set(k, map.size);
|
||||
}
|
||||
}
|
||||
return map;
|
||||
}
|
||||
|
||||
function getEntityId(location: StructureElement.Location): string {
|
||||
switch (location.unit.kind) {
|
||||
case Unit.Kind.Atomic:
|
||||
return StructureProperties.chain.label_entity_id(location);
|
||||
case Unit.Kind.Spheres:
|
||||
case Unit.Kind.Gaussians:
|
||||
return StructureProperties.coarse.entity_id(location);
|
||||
}
|
||||
}
|
||||
|
||||
export function EntityIdColorTheme(ctx: ThemeDataContext, props: PD.Values<EntityIdColorThemeParams>): ColorTheme<EntityIdColorThemeParams> {
|
||||
let color: LocationColor;
|
||||
let legend: ScaleLegend | TableLegend | undefined;
|
||||
@@ -59,16 +79,16 @@ export function EntityIdColorTheme(ctx: ThemeDataContext, props: PD.Values<Entit
|
||||
color = (location: Location): Color => {
|
||||
let serial: number | undefined = undefined;
|
||||
if (StructureElement.Location.is(location)) {
|
||||
const atomId = StructureProperties.chain.label_entity_id(location);
|
||||
const entityId = getEntityId(location);
|
||||
const modelIndex = location.structure.models.indexOf(location.unit.model);
|
||||
const k = key(atomId, modelIndex);
|
||||
const k = key(entityId, modelIndex);
|
||||
serial = entityIdSerialMap.get(k);
|
||||
} else if (Bond.isLocation(location)) {
|
||||
l.unit = location.aUnit;
|
||||
l.element = location.aUnit.elements[location.aIndex];
|
||||
const atomId = StructureProperties.chain.label_entity_id(l);
|
||||
const entityId = getEntityId(l);
|
||||
const modelIndex = l.structure.models.indexOf(l.unit.model);
|
||||
const k = key(atomId, modelIndex);
|
||||
const k = key(entityId, modelIndex);
|
||||
serial = entityIdSerialMap.get(k);
|
||||
}
|
||||
return serial === undefined ? DefaultColor : palette.color(serial);
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
* @author Alexander Rose <alexander.rose@weirdbyte.de>
|
||||
*/
|
||||
|
||||
import { Color } from '../../mol-util/color';
|
||||
import { Color, ColorMap } from '../../mol-util/color';
|
||||
import { StructureElement, Unit, Bond, ElementIndex } from '../../mol-model/structure';
|
||||
import { Location } from '../../mol-model/location';
|
||||
import { ColorTheme } from '../color';
|
||||
@@ -13,6 +13,19 @@ import { getElementMoleculeType } from '../../mol-model/structure/util';
|
||||
import { ParamDefinition as PD } from '../../mol-util/param-definition';
|
||||
import { ThemeDataContext } from '../theme';
|
||||
import { TableLegend } from '../../mol-util/legend';
|
||||
import { getAdjustedColorMap } from '../../mol-util/color/color';
|
||||
import { getColorMapParams } from '../../mol-util/color/params';
|
||||
|
||||
export const MoleculeTypeColors = ColorMap({
|
||||
water: 0x386cb0,
|
||||
ion: 0xf0027f,
|
||||
protein: 0xbeaed4,
|
||||
RNA: 0xfdc086,
|
||||
DNA: 0xbf5b17,
|
||||
PNA: 0x42A49A,
|
||||
saccharide: 0x7fc97f,
|
||||
});
|
||||
export type MoleculeTypeColors = typeof MoleculeTypeColors
|
||||
|
||||
const DefaultMoleculeTypeColor = Color(0xffff99);
|
||||
const Description = 'Assigns a color based on the molecule type of a residue.';
|
||||
@@ -20,15 +33,9 @@ const Description = 'Assigns a color based on the molecule type of a residue.';
|
||||
export const MoleculeTypeColorThemeParams = {
|
||||
saturation: PD.Numeric(0, { min: -6, max: 6, step: 0.1 }),
|
||||
lightness: PD.Numeric(0, { min: -6, max: 6, step: 0.1 }),
|
||||
colors: PD.Group({
|
||||
water: PD.Color(Color(0x386cb0)),
|
||||
ion: PD.Color(Color(0xf0027f)),
|
||||
protein: PD.Color(Color(0xbeaed4)),
|
||||
rna: PD.Color(Color(0xfdc086)),
|
||||
dna: PD.Color(Color(0xbf5b17)),
|
||||
pna: PD.Color(Color(0x42A49A)),
|
||||
saccharide: PD.Color(Color(0x7fc97f)),
|
||||
lipid: PD.Color(Color(0xcccccc)),
|
||||
colors: PD.MappedStatic('default', {
|
||||
'default': PD.EmptyGroup(),
|
||||
'custom': PD.Group(getColorMapParams(MoleculeTypeColors))
|
||||
})
|
||||
};
|
||||
export type MoleculeTypeColorThemeParams = typeof MoleculeTypeColorThemeParams
|
||||
@@ -36,32 +43,28 @@ export function getMoleculeTypeColorThemeParams(ctx: ThemeDataContext) {
|
||||
return MoleculeTypeColorThemeParams; // TODO return copy
|
||||
}
|
||||
|
||||
type MoleculeTypeColorThemeProps = PD.Values<MoleculeTypeColorThemeParams>;
|
||||
export function moleculeTypeColor(props: MoleculeTypeColorThemeProps, unit: Unit, element: ElementIndex): Color {
|
||||
let c = DefaultMoleculeTypeColor;
|
||||
export function moleculeTypeColor(colorMap: MoleculeTypeColors, unit: Unit, element: ElementIndex): Color {
|
||||
const moleculeType = getElementMoleculeType(unit, element);
|
||||
switch (moleculeType) {
|
||||
case MoleculeType.Water: c = props.colors.water; break;
|
||||
case MoleculeType.Ion: c = props.colors.ion; break;
|
||||
case MoleculeType.Protein: c = props.colors.protein; break;
|
||||
case MoleculeType.RNA: c = props.colors.rna; break;
|
||||
case MoleculeType.DNA: c = props.colors.dna; break;
|
||||
case MoleculeType.PNA: c = props.colors.pna; break;
|
||||
case MoleculeType.Saccharide: c = props.colors.saccharide; break;
|
||||
case MoleculeType.Lipid: c = props.colors.lipid; break;
|
||||
case MoleculeType.Water: return colorMap.water;
|
||||
case MoleculeType.Ion: return colorMap.ion;
|
||||
case MoleculeType.Protein: return colorMap.protein;
|
||||
case MoleculeType.RNA: return colorMap.RNA;
|
||||
case MoleculeType.DNA: return colorMap.DNA;
|
||||
case MoleculeType.PNA: return colorMap.PNA;
|
||||
case MoleculeType.Saccharide: return colorMap.saccharide;
|
||||
}
|
||||
c = Color.saturate(c, props.saturation);
|
||||
c = Color.darken(c, -props.lightness);
|
||||
return c;
|
||||
return DefaultMoleculeTypeColor;
|
||||
}
|
||||
|
||||
export function MoleculeTypeColorTheme(ctx: ThemeDataContext, props: PD.Values<MoleculeTypeColorThemeParams>): ColorTheme<MoleculeTypeColorThemeParams> {
|
||||
const colorMap = getAdjustedColorMap(props.colors.name === 'default' ? MoleculeTypeColors : props.colors.params, props.saturation, props.lightness);
|
||||
|
||||
function color(location: Location): Color {
|
||||
if (StructureElement.Location.is(location)) {
|
||||
return moleculeTypeColor(props, location.unit, location.element);
|
||||
return moleculeTypeColor(colorMap, location.unit, location.element);
|
||||
} else if (Bond.isLocation(location)) {
|
||||
return moleculeTypeColor(props, location.aUnit, location.aUnit.elements[location.aIndex]);
|
||||
return moleculeTypeColor(colorMap, location.aUnit, location.aUnit.elements[location.aIndex]);
|
||||
}
|
||||
return DefaultMoleculeTypeColor;
|
||||
}
|
||||
@@ -72,8 +75,8 @@ export function MoleculeTypeColorTheme(ctx: ThemeDataContext, props: PD.Values<M
|
||||
color,
|
||||
props,
|
||||
description: Description,
|
||||
legend: TableLegend(Object.keys(props.colors).map(name => {
|
||||
return [name, (props.colors as any)[name] as Color] as [string, Color];
|
||||
legend: TableLegend(Object.keys(colorMap).map(name => {
|
||||
return [name, (colorMap as any)[name] as Color] as [string, Color];
|
||||
}).concat([['Other/unknown', DefaultMoleculeTypeColor]]))
|
||||
};
|
||||
}
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/**
|
||||
* Copyright (c) 2018-2019 mol* contributors, licensed under MIT, See LICENSE file for more info.
|
||||
* Copyright (c) 2018-2022 mol* contributors, licensed under MIT, See LICENSE file for more info.
|
||||
*
|
||||
* @author Alexander Rose <alexander.rose@weirdbyte.de>
|
||||
*/
|
||||
@@ -12,6 +12,7 @@ import { ParamDefinition as PD } from '../../mol-util/param-definition';
|
||||
import { ThemeDataContext } from '../theme';
|
||||
import { TableLegend } from '../../mol-util/legend';
|
||||
import { getAdjustedColorMap } from '../../mol-util/color/color';
|
||||
import { getColorMapParams } from '../../mol-util/color/params';
|
||||
|
||||
// protein colors from Jmol http://jmol.sourceforge.net/jscolors/
|
||||
export const ResidueNameColors = ColorMap({
|
||||
@@ -66,7 +67,11 @@ const Description = 'Assigns a color to every residue according to its name.';
|
||||
|
||||
export const ResidueNameColorThemeParams = {
|
||||
saturation: PD.Numeric(0, { min: -6, max: 6, step: 0.1 }),
|
||||
lightness: PD.Numeric(1, { min: -6, max: 6, step: 0.1 })
|
||||
lightness: PD.Numeric(1, { min: -6, max: 6, step: 0.1 }),
|
||||
colors: PD.MappedStatic('default', {
|
||||
'default': PD.EmptyGroup(),
|
||||
'custom': PD.Group(getColorMapParams(ResidueNameColors))
|
||||
})
|
||||
};
|
||||
export type ResidueNameColorThemeParams = typeof ResidueNameColorThemeParams
|
||||
export function getResidueNameColorThemeParams(ctx: ThemeDataContext) {
|
||||
@@ -93,7 +98,7 @@ export function residueNameColor(colorMap: ResidueNameColors, residueName: strin
|
||||
}
|
||||
|
||||
export function ResidueNameColorTheme(ctx: ThemeDataContext, props: PD.Values<ResidueNameColorThemeParams>): ColorTheme<ResidueNameColorThemeParams> {
|
||||
const colorMap = getAdjustedColorMap(ResidueNameColors, props.saturation, props.lightness);
|
||||
const colorMap = getAdjustedColorMap(props.colors.name === 'default' ? ResidueNameColors : props.colors.params, props.saturation, props.lightness);
|
||||
|
||||
function color(location: Location): Color {
|
||||
if (StructureElement.Location.is(location)) {
|
||||
@@ -123,8 +128,8 @@ export function ResidueNameColorTheme(ctx: ThemeDataContext, props: PD.Values<Re
|
||||
color,
|
||||
props,
|
||||
description: Description,
|
||||
legend: TableLegend(Object.keys(ResidueNameColors).map(name => {
|
||||
return [name, (ResidueNameColors as any)[name] as Color] as [string, Color];
|
||||
legend: TableLegend(Object.keys(colorMap).map(name => {
|
||||
return [name, (colorMap as any)[name] as Color] as [string, Color];
|
||||
}).concat([['Unknown', DefaultResidueNameColor]]))
|
||||
};
|
||||
}
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/**
|
||||
* Copyright (c) 2018-2019 mol* contributors, licensed under MIT, See LICENSE file for more info.
|
||||
* Copyright (c) 2018-2022 mol* contributors, licensed under MIT, See LICENSE file for more info.
|
||||
*
|
||||
* @author Alexander Rose <alexander.rose@weirdbyte.de>
|
||||
*/
|
||||
@@ -15,6 +15,7 @@ import { ThemeDataContext } from '../theme';
|
||||
import { TableLegend } from '../../mol-util/legend';
|
||||
import { SecondaryStructureProvider, SecondaryStructureValue } from '../../mol-model-props/computed/secondary-structure';
|
||||
import { getAdjustedColorMap } from '../../mol-util/color/color';
|
||||
import { getColorMapParams } from '../../mol-util/color/params';
|
||||
import { CustomProperty } from '../../mol-model-props/common/custom-property';
|
||||
import { hash2 } from '../../mol-data/util';
|
||||
|
||||
@@ -41,7 +42,11 @@ const Description = 'Assigns a color based on the type of secondary structure an
|
||||
|
||||
export const SecondaryStructureColorThemeParams = {
|
||||
saturation: PD.Numeric(-1, { min: -6, max: 6, step: 0.1 }),
|
||||
lightness: PD.Numeric(0, { min: -6, max: 6, step: 0.1 })
|
||||
lightness: PD.Numeric(0, { min: -6, max: 6, step: 0.1 }),
|
||||
colors: PD.MappedStatic('default', {
|
||||
'default': PD.EmptyGroup(),
|
||||
'custom': PD.Group(getColorMapParams(SecondaryStructureColors))
|
||||
})
|
||||
};
|
||||
export type SecondaryStructureColorThemeParams = typeof SecondaryStructureColorThemeParams
|
||||
export function getSecondaryStructureColorThemeParams(ctx: ThemeDataContext) {
|
||||
@@ -88,7 +93,7 @@ export function SecondaryStructureColorTheme(ctx: ThemeDataContext, props: PD.Va
|
||||
const computedSecondaryStructure = ctx.structure && SecondaryStructureProvider.get(ctx.structure);
|
||||
const contextHash = computedSecondaryStructure ? hash2(computedSecondaryStructure.id, computedSecondaryStructure.version) : -1;
|
||||
|
||||
const colorMap = getAdjustedColorMap(SecondaryStructureColors, props.saturation, props.lightness);
|
||||
const colorMap = getAdjustedColorMap(props.colors.name === 'default' ? SecondaryStructureColors : props.colors.params, props.saturation, props.lightness);
|
||||
|
||||
function color(location: Location): Color {
|
||||
if (StructureElement.Location.is(location)) {
|
||||
@@ -107,8 +112,8 @@ export function SecondaryStructureColorTheme(ctx: ThemeDataContext, props: PD.Va
|
||||
props,
|
||||
contextHash,
|
||||
description: Description,
|
||||
legend: TableLegend(Object.keys(SecondaryStructureColors).map(name => {
|
||||
return [name, (SecondaryStructureColors as any)[name] as Color] as [string, Color];
|
||||
legend: TableLegend(Object.keys(colorMap).map(name => {
|
||||
return [name, (colorMap as any)[name] as Color] as [string, Color];
|
||||
}).concat([['Other', DefaultSecondaryStructureColor]]))
|
||||
};
|
||||
}
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/**
|
||||
* Copyright (c) 2018-2020 mol* contributors, licensed under MIT, See LICENSE file for more info.
|
||||
* Copyright (c) 2018-2022 mol* contributors, licensed under MIT, See LICENSE file for more info.
|
||||
*
|
||||
* @author Alexander Rose <alexander.rose@weirdbyte.de>
|
||||
*/
|
||||
|
||||
17
src/mol-util/color/params.ts
Normal file
17
src/mol-util/color/params.ts
Normal file
@@ -0,0 +1,17 @@
|
||||
/**
|
||||
* Copyright (c) 2022 mol* contributors, licensed under MIT, See LICENSE file for more info.
|
||||
*
|
||||
* @author Alexander Rose <alexander.rose@weirdbyte.de>
|
||||
*/
|
||||
|
||||
import { ParamDefinition as PD } from '../../mol-util/param-definition';
|
||||
import { objectForEach } from '../object';
|
||||
import { ColorMap } from './color';
|
||||
|
||||
export function getColorMapParams<T extends { [k: string]: number }>(map: ColorMap<T>) {
|
||||
const colors: Record<string, PD.Color> = {};
|
||||
objectForEach(map, (_, k) => {
|
||||
colors[k] = PD.Color(map[k]);
|
||||
});
|
||||
return colors as { [k in keyof T]: PD.Color };
|
||||
}
|
||||
Reference in New Issue
Block a user