react-cheminfo 0.39.0 → 0.40.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/bin/check-deploy.mjs +4 -2
- package/lib/deploy/core/checkDeploy.d.ts +3 -1
- package/lib/deploy/core/checkDeploy.d.ts.map +1 -1
- package/lib/deploy/core/checkDeploy.js +8 -2
- package/lib/deploy/core/checkDeploy.js.map +1 -1
- package/lib/deploy/core/index.d.ts +1 -0
- package/lib/deploy/core/index.d.ts.map +1 -1
- package/lib/deploy/core/index.js +1 -0
- package/lib/deploy/core/index.js.map +1 -1
- package/lib/deploy/core/publishedImage.d.ts +30 -0
- package/lib/deploy/core/publishedImage.d.ts.map +1 -0
- package/lib/deploy/core/publishedImage.js +96 -0
- package/lib/deploy/core/publishedImage.js.map +1 -0
- package/lib/deploy/core/types.d.ts +1 -1
- package/lib/deploy/core/types.d.ts.map +1 -1
- package/lib/deploy/core/types.js.map +1 -1
- package/lib/molecule3d/ui/Molecule3DToolbar.d.ts +9 -7
- package/lib/molecule3d/ui/Molecule3DToolbar.d.ts.map +1 -1
- package/lib/molecule3d/ui/Molecule3DToolbar.js +13 -8
- package/lib/molecule3d/ui/Molecule3DToolbar.js.map +1 -1
- package/lib/molecule3d/ui/MoleculeCanvas3D.js +1 -1
- package/lib/molecule3d/ui/MoleculeCanvas3D.js.map +1 -1
- package/lib/molecule3d/ui/camera.d.ts +0 -11
- package/lib/molecule3d/ui/camera.d.ts.map +1 -1
- package/lib/molecule3d/ui/camera.js +6 -80
- package/lib/molecule3d/ui/camera.js.map +1 -1
- package/lib/molecule3d/ui/exportMoleculeImage.d.ts +6 -2
- package/lib/molecule3d/ui/exportMoleculeImage.d.ts.map +1 -1
- package/lib/molecule3d/ui/exportMoleculeImage.js.map +1 -1
- package/lib/molecule3d/ui/index.d.ts +9 -0
- package/lib/molecule3d/ui/index.d.ts.map +1 -1
- package/lib/molecule3d/ui/index.js +5 -0
- package/lib/molecule3d/ui/index.js.map +1 -1
- package/lib/molecule3d/ui/measurements.d.ts +22 -2
- package/lib/molecule3d/ui/measurements.d.ts.map +1 -1
- package/lib/molecule3d/ui/measurements.js +25 -3
- package/lib/molecule3d/ui/measurements.js.map +1 -1
- package/lib/molecule3d/ui/useImageExport.d.ts +2 -2
- package/lib/molecule3d/ui/useImageExport.d.ts.map +1 -1
- package/lib/molecule3d/ui/useImageExport.js.map +1 -1
- package/lib/molecule3d/ui/viewer.d.ts.map +1 -1
- package/lib/molecule3d/ui/viewer.js +16 -49
- package/lib/molecule3d/ui/viewer.js.map +1 -1
- package/lib/molstar/core/camera.d.ts +37 -0
- package/lib/molstar/core/camera.d.ts.map +1 -0
- package/lib/molstar/core/camera.js +49 -0
- package/lib/molstar/core/camera.js.map +1 -0
- package/lib/molstar/core/cameraPose.d.ts +54 -0
- package/lib/molstar/core/cameraPose.d.ts.map +1 -0
- package/lib/molstar/core/cameraPose.js +78 -0
- package/lib/molstar/core/cameraPose.js.map +1 -0
- package/lib/molstar/core/hover.d.ts +49 -0
- package/lib/molstar/core/hover.d.ts.map +1 -0
- package/lib/molstar/core/hover.js +91 -0
- package/lib/molstar/core/hover.js.map +1 -0
- package/lib/molstar/core/index.d.ts +7 -0
- package/lib/molstar/core/index.d.ts.map +1 -0
- package/lib/molstar/core/index.js +5 -0
- package/lib/molstar/core/index.js.map +1 -0
- package/lib/molstar/core/plugin.d.ts +80 -0
- package/lib/molstar/core/plugin.d.ts.map +1 -0
- package/lib/molstar/core/plugin.js +125 -0
- package/lib/molstar/core/plugin.js.map +1 -0
- package/lib/molstar.d.ts +18 -0
- package/lib/molstar.d.ts.map +1 -0
- package/lib/molstar.js +17 -0
- package/lib/molstar.js.map +1 -0
- package/lib/share/ui/SharePreview.d.ts.map +1 -1
- package/lib/share/ui/SharePreview.js +25 -0
- package/lib/share/ui/SharePreview.js.map +1 -1
- package/lib/share/ui/useShareRegionReports.d.ts.map +1 -1
- package/lib/share/ui/useShareRegionReports.js +41 -12
- package/lib/share/ui/useShareRegionReports.js.map +1 -1
- package/lib/structure/ui/ConformerTable.d.ts +8 -0
- package/lib/structure/ui/ConformerTable.d.ts.map +1 -1
- package/lib/structure/ui/ConformerTable.js +24 -4
- package/lib/structure/ui/ConformerTable.js.map +1 -1
- package/package.json +2 -1
- package/src/deploy/core/checkDeploy.ts +14 -2
- package/src/deploy/core/index.ts +5 -0
- package/src/deploy/core/publishedImage.ts +110 -0
- package/src/deploy/core/types.ts +3 -1
- package/src/molecule3d/ui/Molecule3DToolbar.tsx +23 -16
- package/src/molecule3d/ui/MoleculeCanvas3D.tsx +1 -1
- package/src/molecule3d/ui/camera.ts +18 -93
- package/src/molecule3d/ui/exportMoleculeImage.ts +6 -2
- package/src/molecule3d/ui/index.ts +12 -0
- package/src/molecule3d/ui/measurements.ts +42 -3
- package/src/molecule3d/ui/useImageExport.ts +2 -2
- package/src/molecule3d/ui/viewer.ts +21 -51
- package/src/molstar/core/camera.ts +61 -0
- package/src/molstar/core/cameraPose.ts +126 -0
- package/src/molstar/core/hover.ts +109 -0
- package/src/molstar/core/index.ts +13 -0
- package/src/molstar/core/plugin.ts +159 -0
- package/src/molstar.ts +22 -0
- package/src/share/ui/SharePreview.tsx +31 -0
- package/src/share/ui/useShareRegionReports.ts +39 -15
- package/src/structure/ui/ConformerTable.tsx +38 -4
- package/lib/molecule3d/ui/viewerSpec.d.ts +0 -17
- package/lib/molecule3d/ui/viewerSpec.d.ts.map +0 -1
- package/lib/molecule3d/ui/viewerSpec.js +0 -34
- package/lib/molecule3d/ui/viewerSpec.js.map +0 -1
- package/src/molecule3d/ui/viewerSpec.ts +0 -38
package/bin/check-deploy.mjs
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
/*
|
|
3
3
|
* Report every way a repository would break, or silently mis-deploy, under the
|
|
4
|
-
* server's global deploy script: a compose file it would not find, an image
|
|
5
|
-
* no selectable tag, a page the browser keeps across a deploy and then cannot
|
|
4
|
+
* server's global deploy script: a compose file it would not find, an image
|
|
5
|
+
* nothing publishes or that carries no selectable tag, a page the browser keeps across a deploy and then cannot
|
|
6
6
|
* run, an `IMAGE_NAME` naming a package this repository never publishes, an
|
|
7
7
|
* `env_file` that fails on a checkout with no `.env` yet, a service with no
|
|
8
8
|
* health probe to read, an `.env.example` that hides a mode.
|
|
@@ -26,6 +26,7 @@ import process from 'node:process';
|
|
|
26
26
|
|
|
27
27
|
import {
|
|
28
28
|
DEPLOY_COMPOSE_FILES,
|
|
29
|
+
DOCKER_IMAGE_WORKFLOW,
|
|
29
30
|
NGINX_CONFIG,
|
|
30
31
|
PAGE_CACHE_CONFIG,
|
|
31
32
|
findDeployProblems,
|
|
@@ -77,6 +78,7 @@ for (const path of [
|
|
|
77
78
|
'Dockerfile',
|
|
78
79
|
PAGE_CACHE_CONFIG,
|
|
79
80
|
NGINX_CONFIG,
|
|
81
|
+
DOCKER_IMAGE_WORKFLOW,
|
|
80
82
|
]) {
|
|
81
83
|
const text = read(path);
|
|
82
84
|
if (text !== undefined) files.push({ path, text });
|
|
@@ -8,7 +8,9 @@ import type { CheckDeployOptions, DeployFile, DeployProblem } from './types.ts';
|
|
|
8
8
|
* reports it healthy. So a repository has to hand it a selectable tag on every
|
|
9
9
|
* image we build, an `IMAGE_NAME` that names the package our own workflow
|
|
10
10
|
* publishes, a compose file that parses on a checkout with no `.env` yet, and a
|
|
11
|
-
* health probe to read. It also has to
|
|
11
|
+
* health probe to read. It also has to publish that image in the first place:
|
|
12
|
+
* with no `latest` to pull the script builds from source on the deploy host,
|
|
13
|
+
* and the install that follows must survive a blip in the registry. It also has to hand the browser a page the browser will
|
|
12
14
|
* not keep, or the next deploy leaves returning visitors on a blank one. Each
|
|
13
15
|
* of those is invisible until a deploy, which is the
|
|
14
16
|
* worst moment to discover it — an `env_file` without `required: false` fails
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"checkDeploy.d.ts","sourceRoot":"","sources":["../../../src/deploy/core/checkDeploy.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"checkDeploy.d.ts","sourceRoot":"","sources":["../../../src/deploy/core/checkDeploy.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,kBAAkB,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAGhF;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,wBAAgB,kBAAkB,CAChC,KAAK,EAAE,SAAS,UAAU,EAAE,EAC5B,OAAO,GAAE,kBAAuB,GAC/B,aAAa,EAAE,CAkEjB"}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { readComposeFile } from "./composeFile.js";
|
|
2
2
|
import { readEnvExample } from "./envExample.js";
|
|
3
3
|
import { readPageCache } from "./pageCache.js";
|
|
4
|
+
import { DOCKER_IMAGE_WORKFLOW, readInstallRetries, readPublishedImage, } from "./publishedImage.js";
|
|
4
5
|
import { DEPLOY_COMPOSE_FILES } from "./types.js";
|
|
5
6
|
/**
|
|
6
7
|
* Every way a repository would break, or silently mis-deploy, under the
|
|
@@ -11,7 +12,9 @@ import { DEPLOY_COMPOSE_FILES } from "./types.js";
|
|
|
11
12
|
* reports it healthy. So a repository has to hand it a selectable tag on every
|
|
12
13
|
* image we build, an `IMAGE_NAME` that names the package our own workflow
|
|
13
14
|
* publishes, a compose file that parses on a checkout with no `.env` yet, and a
|
|
14
|
-
* health probe to read. It also has to
|
|
15
|
+
* health probe to read. It also has to publish that image in the first place:
|
|
16
|
+
* with no `latest` to pull the script builds from source on the deploy host,
|
|
17
|
+
* and the install that follows must survive a blip in the registry. It also has to hand the browser a page the browser will
|
|
15
18
|
* not keep, or the next deploy leaves returning visitors on a blank one. Each
|
|
16
19
|
* of those is invisible until a deploy, which is the
|
|
17
20
|
* worst moment to discover it — an `env_file` without `required: false` fails
|
|
@@ -63,8 +66,11 @@ export function findDeployProblems(files, options = {}) {
|
|
|
63
66
|
readEnvExample(envExample, expected, problems);
|
|
64
67
|
}
|
|
65
68
|
const dockerfile = byPath.get('Dockerfile');
|
|
66
|
-
if (dockerfile !== undefined)
|
|
69
|
+
if (dockerfile !== undefined) {
|
|
67
70
|
readPageCache(dockerfile, byPath, problems);
|
|
71
|
+
readInstallRetries(dockerfile, problems);
|
|
72
|
+
}
|
|
73
|
+
readPublishedImage(byPath.get(DOCKER_IMAGE_WORKFLOW), problems);
|
|
68
74
|
const gitignore = byPath.get('.gitignore');
|
|
69
75
|
if (gitignore === undefined || !/^\s*\/?\.deploy\/?\s*$/m.test(gitignore)) {
|
|
70
76
|
problems.push({
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"checkDeploy.js","sourceRoot":"","sources":["../../../src/deploy/core/checkDeploy.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AACnD,OAAO,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AACjD,OAAO,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;
|
|
1
|
+
{"version":3,"file":"checkDeploy.js","sourceRoot":"","sources":["../../../src/deploy/core/checkDeploy.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
export { findDeployProblems } from './checkDeploy.ts';
|
|
2
2
|
export type { CheckDeployOptions, DeployFile, DeployProblem, DeployProblemKind, } from './types.ts';
|
|
3
3
|
export { NGINX_CONFIG, PAGE_CACHE_CONFIG } from './pageCache.ts';
|
|
4
|
+
export { DOCKER_IMAGE_WORKFLOW, readInstallRetries, readPublishedImage, } from './publishedImage.ts';
|
|
4
5
|
export { DEPLOY_COMPOSE_FILES } from './types.ts';
|
|
5
6
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/deploy/core/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AACtD,YAAY,EACV,kBAAkB,EAClB,UAAU,EACV,aAAa,EACb,iBAAiB,GAClB,MAAM,YAAY,CAAC;AACpB,OAAO,EAAE,YAAY,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AACjE,OAAO,EAAE,oBAAoB,EAAE,MAAM,YAAY,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/deploy/core/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AACtD,YAAY,EACV,kBAAkB,EAClB,UAAU,EACV,aAAa,EACb,iBAAiB,GAClB,MAAM,YAAY,CAAC;AACpB,OAAO,EAAE,YAAY,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AACjE,OAAO,EACL,qBAAqB,EACrB,kBAAkB,EAClB,kBAAkB,GACnB,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAAE,oBAAoB,EAAE,MAAM,YAAY,CAAC"}
|
package/lib/deploy/core/index.js
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
export { findDeployProblems } from "./checkDeploy.js";
|
|
2
2
|
export { NGINX_CONFIG, PAGE_CACHE_CONFIG } from "./pageCache.js";
|
|
3
|
+
export { DOCKER_IMAGE_WORKFLOW, readInstallRetries, readPublishedImage, } from "./publishedImage.js";
|
|
3
4
|
export { DEPLOY_COMPOSE_FILES } from "./types.js";
|
|
4
5
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/deploy/core/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AAOtD,OAAO,EAAE,YAAY,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AACjE,OAAO,EAAE,oBAAoB,EAAE,MAAM,YAAY,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/deploy/core/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AAOtD,OAAO,EAAE,YAAY,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AACjE,OAAO,EACL,qBAAqB,EACrB,kBAAkB,EAClB,kBAAkB,GACnB,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAAE,oBAAoB,EAAE,MAAM,YAAY,CAAC"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import type { DeployProblem } from './types.ts';
|
|
2
|
+
/** The workflow that publishes this repository's image, at its fixed path. */
|
|
3
|
+
export declare const DOCKER_IMAGE_WORKFLOW = ".github/workflows/docker-image.yml";
|
|
4
|
+
/**
|
|
5
|
+
* Report a repository whose image is never published with a `latest` tag.
|
|
6
|
+
*
|
|
7
|
+
* The shared workflow derives `:<version>`, `:<major>.<minor>`, `:<major>` and
|
|
8
|
+
* `:latest` from `tag-version` alone; given nothing it publishes a single
|
|
9
|
+
* `:HEAD` and no `latest`. Compose files default to `${IMAGE_TAG:-latest}`, so
|
|
10
|
+
* the deploy then has nothing to pull and builds the image on the deploy host
|
|
11
|
+
* instead — which is how a registry blip, a build timeout or an out-of-memory
|
|
12
|
+
* kill becomes an outage, reported against npm rather than against the missing
|
|
13
|
+
* tag. The workflow, the release and the push all succeed, so nothing says so.
|
|
14
|
+
* @param workflow - The docker-image workflow, or undefined when there is none.
|
|
15
|
+
* @param problems - Where each problem found is appended.
|
|
16
|
+
*/
|
|
17
|
+
export declare function readPublishedImage(workflow: string | undefined, problems: DeployProblem[]): void;
|
|
18
|
+
/**
|
|
19
|
+
* Report a build stage that installs with npm's own patience.
|
|
20
|
+
*
|
|
21
|
+
* A deploy with no image to pull builds from source on the deploy host, so the
|
|
22
|
+
* whole dependency closure comes over the network at the one moment nothing may
|
|
23
|
+
* fail. npm's two default retries are capped at a minute and spent in under
|
|
24
|
+
* twenty seconds, which is short enough that an ordinary blip reads as a broken
|
|
25
|
+
* repository — so each stage that installs says how long it is willing to try.
|
|
26
|
+
* @param dockerfile - The Dockerfile.
|
|
27
|
+
* @param problems - Where each problem found is appended.
|
|
28
|
+
*/
|
|
29
|
+
export declare function readInstallRetries(dockerfile: string, problems: DeployProblem[]): void;
|
|
30
|
+
//# sourceMappingURL=publishedImage.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"publishedImage.d.ts","sourceRoot":"","sources":["../../../src/deploy/core/publishedImage.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAEhD,8EAA8E;AAC9E,eAAO,MAAM,qBAAqB,uCAAuC,CAAC;AAS1E;;;;;;;;;;;;GAYG;AACH,wBAAgB,kBAAkB,CAChC,QAAQ,EAAE,MAAM,GAAG,SAAS,EAC5B,QAAQ,EAAE,aAAa,EAAE,GACxB,IAAI,CAqCN;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,kBAAkB,CAChC,UAAU,EAAE,MAAM,EAClB,QAAQ,EAAE,aAAa,EAAE,GACxB,IAAI,CAsBN"}
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
/** The workflow that publishes this repository's image, at its fixed path. */
|
|
2
|
+
export const DOCKER_IMAGE_WORKFLOW = '.github/workflows/docker-image.yml';
|
|
3
|
+
const TAG_VERSION = /^\s*tag-version:\s*(?<value>.+?)\s*$/m;
|
|
4
|
+
const INSTALL = /^\s*RUN\s+npm\s+ci\b/;
|
|
5
|
+
const RETRIES = /^\s*ENV\s+.*\bNPM_CONFIG_FETCH_RETRIES=/;
|
|
6
|
+
const STAGE = /^\s*FROM\s+/i;
|
|
7
|
+
// Written with an escaped brace so it is not read as an interpolation here.
|
|
8
|
+
const GUARDED = `\${{ github.event_name == 'push' && github.ref_name || '' }}`;
|
|
9
|
+
/**
|
|
10
|
+
* Report a repository whose image is never published with a `latest` tag.
|
|
11
|
+
*
|
|
12
|
+
* The shared workflow derives `:<version>`, `:<major>.<minor>`, `:<major>` and
|
|
13
|
+
* `:latest` from `tag-version` alone; given nothing it publishes a single
|
|
14
|
+
* `:HEAD` and no `latest`. Compose files default to `${IMAGE_TAG:-latest}`, so
|
|
15
|
+
* the deploy then has nothing to pull and builds the image on the deploy host
|
|
16
|
+
* instead — which is how a registry blip, a build timeout or an out-of-memory
|
|
17
|
+
* kill becomes an outage, reported against npm rather than against the missing
|
|
18
|
+
* tag. The workflow, the release and the push all succeed, so nothing says so.
|
|
19
|
+
* @param workflow - The docker-image workflow, or undefined when there is none.
|
|
20
|
+
* @param problems - Where each problem found is appended.
|
|
21
|
+
*/
|
|
22
|
+
export function readPublishedImage(workflow, problems) {
|
|
23
|
+
if (workflow === undefined) {
|
|
24
|
+
problems.push({
|
|
25
|
+
file: DOCKER_IMAGE_WORKFLOW,
|
|
26
|
+
line: 0,
|
|
27
|
+
kind: 'unpublishable-image',
|
|
28
|
+
message: 'nothing publishes an image, so every deploy builds one on the server',
|
|
29
|
+
hint: 'add docker-image.yml, calling the shared workflow on a v* tag with a guarded tag-version',
|
|
30
|
+
});
|
|
31
|
+
return;
|
|
32
|
+
}
|
|
33
|
+
const match = TAG_VERSION.exec(workflow);
|
|
34
|
+
if (match?.groups === undefined) {
|
|
35
|
+
problems.push({
|
|
36
|
+
file: DOCKER_IMAGE_WORKFLOW,
|
|
37
|
+
line: lineOf(workflow, /docker-image\.yml@docker-image/),
|
|
38
|
+
kind: 'unpublishable-image',
|
|
39
|
+
message: 'no tag-version, so the package gets a single :HEAD and no :latest for a compose file to pull',
|
|
40
|
+
hint: `with: tag-version: ${GUARDED}`,
|
|
41
|
+
});
|
|
42
|
+
return;
|
|
43
|
+
}
|
|
44
|
+
const value = match.groups.value ?? '';
|
|
45
|
+
if (value.includes('github.ref_name') && !value.includes('event_name')) {
|
|
46
|
+
problems.push({
|
|
47
|
+
file: DOCKER_IMAGE_WORKFLOW,
|
|
48
|
+
line: lineOf(workflow, TAG_VERSION),
|
|
49
|
+
kind: 'unpublishable-image',
|
|
50
|
+
message: 'tag-version is the bare ref, which on a manual run is a branch name split as if it were a semver',
|
|
51
|
+
hint: `guard it: ${GUARDED}`,
|
|
52
|
+
});
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* Report a build stage that installs with npm's own patience.
|
|
57
|
+
*
|
|
58
|
+
* A deploy with no image to pull builds from source on the deploy host, so the
|
|
59
|
+
* whole dependency closure comes over the network at the one moment nothing may
|
|
60
|
+
* fail. npm's two default retries are capped at a minute and spent in under
|
|
61
|
+
* twenty seconds, which is short enough that an ordinary blip reads as a broken
|
|
62
|
+
* repository — so each stage that installs says how long it is willing to try.
|
|
63
|
+
* @param dockerfile - The Dockerfile.
|
|
64
|
+
* @param problems - Where each problem found is appended.
|
|
65
|
+
*/
|
|
66
|
+
export function readInstallRetries(dockerfile, problems) {
|
|
67
|
+
const lines = dockerfile.split('\n');
|
|
68
|
+
let patient = false;
|
|
69
|
+
for (let index = 0; index < lines.length; index++) {
|
|
70
|
+
const line = lines[index] ?? '';
|
|
71
|
+
// ENV does not cross a FROM, so each stage answers for itself.
|
|
72
|
+
if (STAGE.test(line)) {
|
|
73
|
+
patient = false;
|
|
74
|
+
}
|
|
75
|
+
else if (RETRIES.test(line)) {
|
|
76
|
+
patient = true;
|
|
77
|
+
}
|
|
78
|
+
else if (INSTALL.test(line) && !patient) {
|
|
79
|
+
problems.push({
|
|
80
|
+
file: 'Dockerfile',
|
|
81
|
+
line: index + 1,
|
|
82
|
+
kind: 'brittle-install',
|
|
83
|
+
message: "npm ci installs with npm's two default retries, so a network blip of twenty seconds fails the deploy",
|
|
84
|
+
hint: 'ENV NPM_CONFIG_FETCH_RETRIES=5 NPM_CONFIG_FETCH_RETRY_MAXTIMEOUT=120000 above it, in this stage',
|
|
85
|
+
});
|
|
86
|
+
patient = true;
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
function lineOf(text, pattern) {
|
|
91
|
+
const match = pattern.exec(text);
|
|
92
|
+
if (match === null)
|
|
93
|
+
return 0;
|
|
94
|
+
return text.slice(0, match.index).split('\n').length;
|
|
95
|
+
}
|
|
96
|
+
//# sourceMappingURL=publishedImage.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"publishedImage.js","sourceRoot":"","sources":["../../../src/deploy/core/publishedImage.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/** What a repository got wrong against the deployment contract. */
|
|
2
|
-
export type DeployProblemKind = 'missing-compose' | 'invalid-compose' | 'unpinned-image' | 'missing-build' | 'wrong-image-name' | 'required-env-file' | 'floating-sidecar' | 'missing-healthcheck' | 'missing-env-example' | 'missing-deploy-ignore' | 'cacheable-page';
|
|
2
|
+
export type DeployProblemKind = 'missing-compose' | 'invalid-compose' | 'unpinned-image' | 'missing-build' | 'wrong-image-name' | 'required-env-file' | 'floating-sidecar' | 'missing-healthcheck' | 'missing-env-example' | 'missing-deploy-ignore' | 'cacheable-page' | 'unpublishable-image' | 'brittle-install';
|
|
3
3
|
/** One way a repository would fail, or silently mis-deploy, on the server. */
|
|
4
4
|
export interface DeployProblem {
|
|
5
5
|
/** The file it was found in, named as the caller named it. */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/deploy/core/types.ts"],"names":[],"mappings":"AAAA,mEAAmE;AACnE,MAAM,MAAM,iBAAiB,GACzB,iBAAiB,GACjB,iBAAiB,GACjB,gBAAgB,GAChB,eAAe,GACf,kBAAkB,GAClB,mBAAmB,GACnB,kBAAkB,GAClB,qBAAqB,GACrB,qBAAqB,GACrB,uBAAuB,GACvB,gBAAgB,CAAC;
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/deploy/core/types.ts"],"names":[],"mappings":"AAAA,mEAAmE;AACnE,MAAM,MAAM,iBAAiB,GACzB,iBAAiB,GACjB,iBAAiB,GACjB,gBAAgB,GAChB,eAAe,GACf,kBAAkB,GAClB,mBAAmB,GACnB,kBAAkB,GAClB,qBAAqB,GACrB,qBAAqB,GACrB,uBAAuB,GACvB,gBAAgB,GAChB,qBAAqB,GACrB,iBAAiB,CAAC;AAEtB,8EAA8E;AAC9E,MAAM,WAAW,aAAa;IAC5B,8DAA8D;IAC9D,IAAI,EAAE,MAAM,CAAC;IACb,6EAA6E;IAC7E,IAAI,EAAE,MAAM,CAAC;IACb,kCAAkC;IAClC,IAAI,EAAE,iBAAiB,CAAC;IACxB,kCAAkC;IAClC,OAAO,EAAE,MAAM,CAAC;IAChB,0CAA0C;IAC1C,IAAI,EAAE,MAAM,CAAC;CACd;AAED,sEAAsE;AACtE,MAAM,WAAW,UAAU;IACzB,iDAAiD;IACjD,IAAI,EAAE,MAAM,CAAC;IACb,mBAAmB;IACnB,IAAI,EAAE,MAAM,CAAC;CACd;AAED,4CAA4C;AAC5C,MAAM,WAAW,kBAAkB;IACjC;;;;;OAKG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB;;;;OAIG;IACH,aAAa,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IAClC;;;;OAIG;IACH,YAAY,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IACjC;;;;OAIG;IACH,kBAAkB,CAAC,EAAE,OAAO,CAAC;IAC7B;;;;;OAKG;IACH,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B;;;;;OAKG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED;;;GAGG;AACH,eAAO,MAAM,oBAAoB,EAAE,SAAS,MAAM,EAIjD,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/deploy/core/types.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/deploy/core/types.ts"],"names":[],"mappings":"AAiFA;;;GAGG;AACH,MAAM,CAAC,MAAM,oBAAoB,GAAsB;IACrD,cAAc;IACd,sBAAsB;IACtB,0BAA0B;CAC3B,CAAC"}
|
|
@@ -9,20 +9,22 @@ import type { MeasurementKind } from '../core/measurement.ts';
|
|
|
9
9
|
import type { Molecule3DTools } from '../core/settings.ts';
|
|
10
10
|
/** Props of {@link Molecule3DToolbar}. */
|
|
11
11
|
export interface Molecule3DToolbarProps {
|
|
12
|
-
tools
|
|
12
|
+
/** Which tools to show; every one it does not name is on. */
|
|
13
|
+
tools?: Partial<Molecule3DTools>;
|
|
13
14
|
measureKind: MeasurementKind | null;
|
|
14
15
|
onMeasureKindChange: (kind: MeasurementKind | null) => void;
|
|
15
16
|
measurementCount: number;
|
|
16
17
|
onClearMeasurements: () => void;
|
|
17
18
|
spinning: boolean;
|
|
18
19
|
onSpinningChange: (spinning: boolean) => void;
|
|
19
|
-
|
|
20
|
-
|
|
20
|
+
/** Whether the molecular surface is drawn; its tool is left out without a handler. */
|
|
21
|
+
showSurface?: boolean;
|
|
22
|
+
onShowSurfaceChange?: (showSurface: boolean) => void;
|
|
21
23
|
onResetView: () => void;
|
|
22
|
-
/** Content of the options popover. */
|
|
23
|
-
options
|
|
24
|
-
/** Content of the export popover. */
|
|
25
|
-
exportPanel
|
|
24
|
+
/** Content of the options popover; its tool is left out without one. */
|
|
25
|
+
options?: ReactElement;
|
|
26
|
+
/** Content of the export popover; its tool is left out without one. */
|
|
27
|
+
exportPanel?: ReactElement;
|
|
26
28
|
}
|
|
27
29
|
/**
|
|
28
30
|
* The two toolbars; either is left out when none of its tools is on.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Molecule3DToolbar.d.ts","sourceRoot":"","sources":["../../../src/molecule3d/ui/Molecule3DToolbar.tsx"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,KAAK,EAAiB,YAAY,EAAE,MAAM,OAAO,CAAC;AAIzD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAM9D,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;
|
|
1
|
+
{"version":3,"file":"Molecule3DToolbar.d.ts","sourceRoot":"","sources":["../../../src/molecule3d/ui/Molecule3DToolbar.tsx"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,KAAK,EAAiB,YAAY,EAAE,MAAM,OAAO,CAAC;AAIzD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAM9D,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AAU3D,0CAA0C;AAC1C,MAAM,WAAW,sBAAsB;IACrC,6DAA6D;IAC7D,KAAK,CAAC,EAAE,OAAO,CAAC,eAAe,CAAC,CAAC;IACjC,WAAW,EAAE,eAAe,GAAG,IAAI,CAAC;IACpC,mBAAmB,EAAE,CAAC,IAAI,EAAE,eAAe,GAAG,IAAI,KAAK,IAAI,CAAC;IAC5D,gBAAgB,EAAE,MAAM,CAAC;IACzB,mBAAmB,EAAE,MAAM,IAAI,CAAC;IAChC,QAAQ,EAAE,OAAO,CAAC;IAClB,gBAAgB,EAAE,CAAC,QAAQ,EAAE,OAAO,KAAK,IAAI,CAAC;IAC9C,sFAAsF;IACtF,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,mBAAmB,CAAC,EAAE,CAAC,WAAW,EAAE,OAAO,KAAK,IAAI,CAAC;IACrD,WAAW,EAAE,MAAM,IAAI,CAAC;IACxB,wEAAwE;IACxE,OAAO,CAAC,EAAE,YAAY,CAAC;IACvB,uEAAuE;IACvE,WAAW,CAAC,EAAE,YAAY,CAAC;CAC5B;AAED;;;;GAIG;AACH,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,sBAAsB,GAAG,YAAY,CA+I7E"}
|
|
@@ -9,6 +9,7 @@ import { Card } from '@blueprintjs/core';
|
|
|
9
9
|
import { Toolbar } from 'react-science/ui';
|
|
10
10
|
import { useChromeT } from "../../i18n/ui/useT.js";
|
|
11
11
|
import { MEASUREMENT_ATOM_COUNTS, MEASUREMENT_KINDS, MEASUREMENT_LABELS, } from "../core/measurement.js";
|
|
12
|
+
import { resolveMolecule3DTools } from "../core/settings.js";
|
|
12
13
|
import { Molecule3DHelp } from "./Molecule3DHelp.js";
|
|
13
14
|
import { ClearMeasurementsIcon, MeasureIcon, SurfaceIcon, } from "./molecule3dIcons.js";
|
|
14
15
|
/**
|
|
@@ -17,24 +18,28 @@ import { ClearMeasurementsIcon, MeasureIcon, SurfaceIcon, } from "./molecule3dIc
|
|
|
17
18
|
* @returns The toolbars, stacked.
|
|
18
19
|
*/
|
|
19
20
|
export function Molecule3DToolbar(props) {
|
|
20
|
-
const { tools, measureKind, onMeasureKindChange, measurementCount, onClearMeasurements, spinning, onSpinningChange, showSurface, onShowSurfaceChange, onResetView, options, exportPanel, } = props;
|
|
21
|
+
const { tools: toolsProp, measureKind, onMeasureKindChange, measurementCount, onClearMeasurements, spinning, onSpinningChange, showSurface, onShowSurfaceChange, onResetView, options, exportPanel, } = props;
|
|
21
22
|
const t = useChromeT();
|
|
23
|
+
const tools = resolveMolecule3DTools(toolsProp);
|
|
24
|
+
const showOptions = tools.options && options !== undefined;
|
|
25
|
+
const showSurfaceTool = tools.surface && onShowSurfaceChange !== undefined;
|
|
26
|
+
const showExport = tools.export && exportPanel !== undefined;
|
|
22
27
|
const hasView = tools.spin ||
|
|
23
28
|
tools.surface ||
|
|
24
29
|
tools.reset ||
|
|
25
|
-
|
|
26
|
-
|
|
30
|
+
showOptions ||
|
|
31
|
+
showExport ||
|
|
27
32
|
tools.help;
|
|
28
|
-
return (_jsxs("div", { style: COLUMN_STYLE, children: [hasView && (_jsx(Card, { elevation: 1, style: CARD_STYLE, children: _jsxs(Toolbar, { vertical: true, "aria-label": t('molecule3d.view'), children: [tools.reset && (_jsx(Toolbar.Item, { icon: "zoom-to-fit", "aria-label": t('molecule3d.resetView'), tooltip: t('molecule3d.resetView'), tooltipProps: TOOLTIP_PROPS, onClick: onResetView })), tools.spin && (_jsx(Toolbar.Item, { icon: "refresh", active: spinning, "aria-label": t('molecule3d.spin'), tooltip: t('molecule3d.spin'), tooltipProps: TOOLTIP_PROPS, onClick: () => {
|
|
33
|
+
return (_jsxs("div", { className: "no-print", style: COLUMN_STYLE, children: [hasView && (_jsx(Card, { elevation: 1, style: CARD_STYLE, children: _jsxs(Toolbar, { vertical: true, "aria-label": t('molecule3d.view'), children: [tools.reset && (_jsx(Toolbar.Item, { icon: "zoom-to-fit", "aria-label": t('molecule3d.resetView'), tooltip: t('molecule3d.resetView'), tooltipProps: TOOLTIP_PROPS, onClick: onResetView })), tools.spin && (_jsx(Toolbar.Item, { icon: "refresh", active: spinning, "aria-label": t('molecule3d.spin'), tooltip: t('molecule3d.spin'), tooltipProps: TOOLTIP_PROPS, onClick: () => {
|
|
29
34
|
onSpinningChange(!spinning);
|
|
30
|
-
} })),
|
|
31
|
-
onShowSurfaceChange(
|
|
32
|
-
} })),
|
|
35
|
+
} })), showSurfaceTool && (_jsx(Toolbar.Item, { icon: _jsx(SurfaceIcon, {}), active: showSurface ?? false, "aria-label": t('molecule3d.surface'), tooltip: t('molecule3d.molecularSurface'), tooltipProps: TOOLTIP_PROPS, onClick: () => {
|
|
36
|
+
onShowSurfaceChange(showSurface !== true);
|
|
37
|
+
} })), showOptions && (_jsx(Toolbar.PopoverItem, { placement: "right-start", content: options, itemProps: {
|
|
33
38
|
icon: 'cog',
|
|
34
39
|
'aria-label': t('molecule3d.displayOptions'),
|
|
35
40
|
tooltip: t('molecule3d.displayOptions'),
|
|
36
41
|
tooltipProps: TOOLTIP_PROPS,
|
|
37
|
-
} })),
|
|
42
|
+
} })), showExport && (_jsx(Toolbar.PopoverItem, { placement: "right-start", content: exportPanel, itemProps: {
|
|
38
43
|
icon: 'download',
|
|
39
44
|
'aria-label': t('molecule3d.exportImage'),
|
|
40
45
|
tooltip: t('molecule3d.exportImage'),
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Molecule3DToolbar.js","sourceRoot":"","sources":["../../../src/molecule3d/ui/Molecule3DToolbar.tsx"],"names":[],"mappings":";AAAA;;;;;GAKG;AAEH,OAAO,EAAE,IAAI,EAAE,MAAM,mBAAmB,CAAC;AAEzC,OAAO,EAAE,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAE3C,OAAO,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AAEnD,OAAO,EACL,uBAAuB,EACvB,iBAAiB,EACjB,kBAAkB,GACnB,MAAM,wBAAwB,CAAC;
|
|
1
|
+
{"version":3,"file":"Molecule3DToolbar.js","sourceRoot":"","sources":["../../../src/molecule3d/ui/Molecule3DToolbar.tsx"],"names":[],"mappings":"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"}
|
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
2
|
import { useEffect, useRef, useState } from 'react';
|
|
3
|
+
import { DEFAULT_SPIN_SPEED } from "../../molstar/core/index.js";
|
|
3
4
|
import { normalizeMolecule3DSettings, resolveMolecule3DTools, } from "../core/settings.js";
|
|
4
5
|
import { Molecule3DExport } from "./Molecule3DExport.js";
|
|
5
6
|
import { Molecule3DOptions } from "./Molecule3DOptions.js";
|
|
6
7
|
import { Molecule3DToolbar } from "./Molecule3DToolbar.js";
|
|
7
|
-
import { DEFAULT_SPIN_SPEED } from "./camera.js";
|
|
8
8
|
import { createMolecule3DViewer } from "./createViewer.js";
|
|
9
9
|
import { useControlledState } from "./useControlledState.js";
|
|
10
10
|
import { useImageExport } from "./useImageExport.js";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"MoleculeCanvas3D.js","sourceRoot":"","sources":["../../../src/molecule3d/ui/MoleculeCanvas3D.tsx"],"names":[],"mappings":";AAQA,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"MoleculeCanvas3D.js","sourceRoot":"","sources":["../../../src/molecule3d/ui/MoleculeCanvas3D.tsx"],"names":[],"mappings":"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"}
|
|
@@ -6,10 +6,6 @@
|
|
|
6
6
|
*/
|
|
7
7
|
import type { PluginContext } from 'molstar/lib/mol-plugin/context.js';
|
|
8
8
|
import type { Molecule3DCamera } from '../core/camera.ts';
|
|
9
|
-
/** Transition length used when the caller does not pick one, milliseconds. */
|
|
10
|
-
export declare const DEFAULT_CAMERA_DURATION = 250;
|
|
11
|
-
/** Turn rate used when the caller does not pick one, in molstar's spin unit. */
|
|
12
|
-
export declare const DEFAULT_SPIN_SPEED: number;
|
|
13
9
|
/**
|
|
14
10
|
* Frame everything currently in the scene.
|
|
15
11
|
*
|
|
@@ -24,13 +20,6 @@ export declare const DEFAULT_SPIN_SPEED: number;
|
|
|
24
20
|
* direction.
|
|
25
21
|
*/
|
|
26
22
|
export declare function resetCamera(plugin: PluginContext, durationMilliseconds?: number, fromFront?: boolean): void;
|
|
27
|
-
/**
|
|
28
|
-
* Turn the automatic spin on or off.
|
|
29
|
-
* @param plugin - The molstar context.
|
|
30
|
-
* @param spinning - Whether the scene should keep turning.
|
|
31
|
-
* @param speed - Turn rate, in molstar's own spin unit.
|
|
32
|
-
*/
|
|
33
|
-
export declare function setSpin(plugin: PluginContext, spinning: boolean, speed?: number): void;
|
|
34
23
|
/**
|
|
35
24
|
* Where the camera stands, against the scene rather than its coordinates.
|
|
36
25
|
*
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"camera.d.ts","sourceRoot":"","sources":["../../../src/molecule3d/ui/camera.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,mCAAmC,CAAC;
|
|
1
|
+
{"version":3,"file":"camera.d.ts","sourceRoot":"","sources":["../../../src/molecule3d/ui/camera.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,mCAAmC,CAAC;AAQvE,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AAM1D;;;;;;;;;;;;GAYG;AACH,wBAAgB,WAAW,CACzB,MAAM,EAAE,aAAa,EACrB,oBAAoB,SAA0B,EAC9C,SAAS,UAAQ,GAChB,IAAI,CAWN;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,UAAU,CAAC,MAAM,EAAE,aAAa,GAAG,gBAAgB,GAAG,IAAI,CAYzE;AAED;;;;;;;;;GASG;AACH,wBAAgB,WAAW,CACzB,MAAM,EAAE,aAAa,EACrB,MAAM,EAAE,gBAAgB,EACxB,oBAAoB,SAAI,GACvB,IAAI,CAeN;AAED;;;;;GAKG;AACH,wBAAgB,WAAW,CACzB,MAAM,EAAE,aAAa,EACrB,QAAQ,EAAE,CAAC,MAAM,EAAE,gBAAgB,GAAG,IAAI,KAAK,IAAI,GAClD,MAAM,IAAI,CASZ"}
|
|
@@ -4,41 +4,11 @@
|
|
|
4
4
|
* directions between molstar's camera and the scene-relative camera a link
|
|
5
5
|
* carries.
|
|
6
6
|
*/
|
|
7
|
-
import {
|
|
8
|
-
import {
|
|
9
|
-
/** Transition length used when the caller does not pick one, milliseconds. */
|
|
10
|
-
export const DEFAULT_CAMERA_DURATION = 250;
|
|
11
|
-
/** Turn rate used when the caller does not pick one, in molstar's spin unit. */
|
|
12
|
-
export const DEFAULT_SPIN_SPEED = 1 / 3;
|
|
13
|
-
/**
|
|
14
|
-
* Fraction of the bounding sphere kept as breathing room around the model.
|
|
15
|
-
*
|
|
16
|
-
* `camera.reset()` frames the scene with molstar's own margin, which suits a
|
|
17
|
-
* protein filling a wide viewport and leaves a small molecule a speck in the
|
|
18
|
-
* middle. Framing the visible bounding sphere directly is what makes a single
|
|
19
|
-
* ethanol legible.
|
|
20
|
-
*/
|
|
21
|
-
const FRAMING_MARGIN = 0.08;
|
|
22
|
-
/** Axis the automatic spin turns about: screen up. */
|
|
23
|
-
const SPIN_AXIS = Vec3.create(0, 1, 0);
|
|
24
|
-
/** Smallest radius framed, in ångström, so a single atom is not a close-up. */
|
|
25
|
-
const MIN_FRAMING_RADIUS = 0.5;
|
|
7
|
+
import { Vec3 } from 'molstar/lib/mol-math/linear-algebra.js';
|
|
8
|
+
import { DEFAULT_CAMERA_DURATION, cameraToPose, framedRadius, poseToCamera, } from "../../molstar/core/index.js";
|
|
26
9
|
/** Screen up and viewing direction when the model is seen as its file lays it. */
|
|
27
10
|
const FRONT_UP = Vec3.create(0, 1, 0);
|
|
28
11
|
const FRONT_DIRECTION = Vec3.create(0, 0, -1);
|
|
29
|
-
/** The camera's own axes, which the stored rotation turns into world ones. */
|
|
30
|
-
const CAMERA_UP = Vec3.create(0, 1, 0);
|
|
31
|
-
const CAMERA_BACK = Vec3.create(0, 0, 1);
|
|
32
|
-
/**
|
|
33
|
-
* The radius a reset frames, which is the length every stored camera is
|
|
34
|
-
* measured against — so reading a camera and applying it are the same move in
|
|
35
|
-
* opposite directions.
|
|
36
|
-
* @param radius - Radius of the scene's visible bounding sphere.
|
|
37
|
-
* @returns The framed radius.
|
|
38
|
-
*/
|
|
39
|
-
function framedRadius(radius) {
|
|
40
|
-
return Math.max(radius * (1 + FRAMING_MARGIN), MIN_FRAMING_RADIUS);
|
|
41
|
-
}
|
|
42
12
|
/**
|
|
43
13
|
* Frame everything currently in the scene.
|
|
44
14
|
*
|
|
@@ -64,21 +34,6 @@ export function resetCamera(plugin, durationMilliseconds = DEFAULT_CAMERA_DURATI
|
|
|
64
34
|
},
|
|
65
35
|
});
|
|
66
36
|
}
|
|
67
|
-
/**
|
|
68
|
-
* Turn the automatic spin on or off.
|
|
69
|
-
* @param plugin - The molstar context.
|
|
70
|
-
* @param spinning - Whether the scene should keep turning.
|
|
71
|
-
* @param speed - Turn rate, in molstar's own spin unit.
|
|
72
|
-
*/
|
|
73
|
-
export function setSpin(plugin, spinning, speed = DEFAULT_SPIN_SPEED) {
|
|
74
|
-
plugin.canvas3d?.setProps({
|
|
75
|
-
trackball: {
|
|
76
|
-
animate: spinning
|
|
77
|
-
? { name: 'spin', params: { speed, axis: SPIN_AXIS } }
|
|
78
|
-
: { name: 'off', params: {} },
|
|
79
|
-
},
|
|
80
|
-
});
|
|
81
|
-
}
|
|
82
37
|
/**
|
|
83
38
|
* Where the camera stands, against the scene rather than its coordinates.
|
|
84
39
|
*
|
|
@@ -99,31 +54,7 @@ export function readCamera(plugin) {
|
|
|
99
54
|
return null;
|
|
100
55
|
const framed = framedRadius(radius);
|
|
101
56
|
const camera = canvas.camera;
|
|
102
|
-
|
|
103
|
-
const back = Vec3.sub(Vec3.zero(), position, target);
|
|
104
|
-
const distance = Vec3.magnitude(back);
|
|
105
|
-
if (distance <= 0)
|
|
106
|
-
return null;
|
|
107
|
-
Vec3.scale(back, back, 1 / distance);
|
|
108
|
-
// The trackball keeps up and back close to square, never exactly so.
|
|
109
|
-
const trueUp = Vec3.scaleAndAdd(Vec3.zero(), up, back, -Vec3.dot(up, back));
|
|
110
|
-
if (Vec3.magnitude(trueUp) <= 0)
|
|
111
|
-
return null;
|
|
112
|
-
Vec3.normalize(trueUp, trueUp);
|
|
113
|
-
const right = Vec3.cross(Vec3.zero(), trueUp, back);
|
|
114
|
-
const rotation = Quat.fromBasis(Quat.identity(), right, trueUp, back);
|
|
115
|
-
const offset = Vec3.sub(Vec3.zero(), target, center);
|
|
116
|
-
Vec3.scale(offset, offset, 1 / framed);
|
|
117
|
-
return normalizeMolecule3DCamera({
|
|
118
|
-
rotation: [
|
|
119
|
-
rotation[0] ?? 0,
|
|
120
|
-
rotation[1] ?? 0,
|
|
121
|
-
rotation[2] ?? 0,
|
|
122
|
-
rotation[3] ?? 1,
|
|
123
|
-
],
|
|
124
|
-
zoom: camera.getTargetDistance(framed) / distance,
|
|
125
|
-
offset: [offset[0] ?? 0, offset[1] ?? 0, offset[2] ?? 0],
|
|
126
|
-
});
|
|
57
|
+
return poseToCamera(camera.getSnapshot(), { center, radius: framed }, camera.getTargetDistance(framed));
|
|
127
58
|
}
|
|
128
59
|
/**
|
|
129
60
|
* Put the camera back where a link says it stood.
|
|
@@ -136,19 +67,14 @@ export function readCamera(plugin) {
|
|
|
136
67
|
* @param durationMilliseconds - Transition length. Pass 0 for an instant jump.
|
|
137
68
|
*/
|
|
138
69
|
export function applyCamera(plugin, camera, durationMilliseconds = 0) {
|
|
139
|
-
const { rotation, zoom, offset } = normalizeMolecule3DCamera(camera);
|
|
140
|
-
const turn = Quat.create(rotation[0], rotation[1], rotation[2], rotation[3]);
|
|
141
70
|
plugin.canvas3d?.requestCameraReset({
|
|
142
71
|
durationMs: durationMilliseconds,
|
|
143
72
|
snapshot: (scene, current) => {
|
|
144
73
|
const { center, radius } = scene.boundingSphereVisible;
|
|
145
74
|
const framed = framedRadius(radius);
|
|
146
|
-
const
|
|
147
|
-
const
|
|
148
|
-
|
|
149
|
-
const distance = current.getTargetDistance(framed) / zoom;
|
|
150
|
-
const position = Vec3.scaleAndAdd(Vec3.zero(), target, back, distance);
|
|
151
|
-
return { target, position, up, radius: framed };
|
|
75
|
+
const reference = { center, radius: framed };
|
|
76
|
+
const pose = cameraToPose(camera, reference, current.getTargetDistance(framed));
|
|
77
|
+
return { ...pose, radius: framed };
|
|
152
78
|
},
|
|
153
79
|
});
|
|
154
80
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"camera.js","sourceRoot":"","sources":["../../../src/molecule3d/ui/camera.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,EAAE,IAAI,EAAE,
|
|
1
|
+
{"version":3,"file":"camera.js","sourceRoot":"","sources":["../../../src/molecule3d/ui/camera.ts"],"names":[],"mappings":"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"}
|