@kent-tokyo/chematic 1.0.41 → 1.1.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/README.md CHANGED
@@ -4,7 +4,7 @@ WebAssembly bindings for [chematic](https://github.com/kent-tokyo/chematic), a p
4
4
 
5
5
  Published to npm as [`@kent-tokyo/chematic`](https://www.npmjs.com/package/@kent-tokyo/chematic).
6
6
 
7
- The current workspace line is 1.0.41. The binding keeps bounded parsing,
7
+ The current workspace line is 1.1.0. The binding keeps bounded parsing,
8
8
  typed failures, and opt-in `embed_pipeline_v2_json`; 3D/MMFF94 behavior remains
9
9
  Experimental and is not a claim of full RDKit parity.
10
10
 
@@ -25,6 +25,9 @@ npm install @kent-tokyo/chematic
25
25
  - SA score: synthetic accessibility estimate [1, 10]
26
26
  - Functional group identification (Ertl 2017 IFG)
27
27
  - Canonical SMILES generation
28
+ - Separately named RDKit 2026.03.1 compatibility bindings for SMARTS/PDB,
29
+ format readers, Murcko/stereo/hash/Morgan inspection, bounded alignment,
30
+ seeded ETKDG, and distance bounds
28
31
  - ECFP4/6, AtomPair, Torsion, path, and RDKit-compatible RDK fingerprints
29
32
  with Tanimoto similarity
30
33
  - BRICS fragment count
@@ -71,6 +74,7 @@ libraries):
71
74
  ```js
72
75
  import init, {
73
76
  parse_smiles,
77
+ add_hydrogens,
74
78
  tanimoto_ecfp4,
75
79
  tanimoto_atom_pair,
76
80
  tanimoto_torsion,
@@ -112,6 +116,28 @@ console.log(tanimoto_atom_pair(mol, caffeine)); // AtomPair Tanimoto
112
116
  console.log(tanimoto_torsion(mol, caffeine)); // Torsion Tanimoto
113
117
  ```
114
118
 
119
+ ### RDKit-compatible interoperability
120
+
121
+ The `rdkit_*` methods are opt-in compatibility paths and do not replace the
122
+ native browser APIs. JSON atom indices and coordinate rows are zero-based in
123
+ `MolHandle` atom order:
124
+
125
+ ```js
126
+ const smarts = mol.rdkit_smarts(true);
127
+ const centers = JSON.parse(mol.rdkit_chiral_centers_json(true));
128
+ const bitInfo = JSON.parse(mol.rdkit_morgan_bit_info_json(2, 2048, false));
129
+
130
+ const withH = add_hydrogens(parse_smiles('CCO'));
131
+ const coords = JSON.parse(withH.rdkit_embed_json(42, 0));
132
+ const bounds = JSON.parse(withH.rdkit_bounds_matrix_json(true, true, false));
133
+ ```
134
+
135
+ PDB, XYZ, and MOL2 readers return `RdkitReadResult`; call `molecule()` for a
136
+ handle and `coords_json()` for index-aligned coordinates. Browser limits are
137
+ explicit: at most 512 atoms for ETKDG/bounds, 4,096 stereoisomers, and
138
+ 1,000,000 alignment matches. Invalid or unsupported inputs throw a stable JS
139
+ error instead of being silently coerced.
140
+
115
141
  ### Node.js
116
142
 
117
143
  The published package is built with wasm-pack's `web` target. In a browser,
@@ -384,6 +384,10 @@ export class MolHandle {
384
384
  * Number of heteroatoms (non-C, non-H heavy atoms).
385
385
  */
386
386
  num_heteroatoms(): number;
387
+ /**
388
+ * Number of rings using RDKit's symmetrized-SSSR semantics.
389
+ */
390
+ num_rings(): number;
387
391
  /**
388
392
  * Number of fully saturated rings containing at least one heteroatom.
389
393
  */
@@ -430,6 +434,63 @@ export class MolHandle {
430
434
  * χ₀ = Σ 1/√(d_i × d_j) over all bonds, where d is heavy-atom degree.
431
435
  */
432
436
  randic_index(): number;
437
+ /**
438
+ * RDKit `AlignMol` result JSON. Coordinates and optional atom map and
439
+ * weights use zero-based molecule atom order.
440
+ */
441
+ rdkit_align_json(probe_coords_json: string, reference_coords_json: string, atom_map_json: string | null | undefined, weights_json: string | null | undefined, reflect: boolean, max_iterations: number): string;
442
+ /**
443
+ * RDKit `GetBestAlignmentTransform` as JSON, bounded by `max_matches`.
444
+ */
445
+ rdkit_best_alignment_json(probe_coords_json: string, reference_coords_json: string, max_matches: number, symmetrize: boolean, weights_json?: string | null): string;
446
+ /**
447
+ * RDKit `GetBestRMS`, bounded by `max_matches <= 1_000_000`.
448
+ */
449
+ rdkit_best_rms(probe_coords_json: string, reference_coords_json: string, max_matches: number, symmetrize: boolean, weights_json?: string | null): number;
450
+ /**
451
+ * RDKit distance-geometry bounds matrix JSON. Row and column `i`
452
+ * refer to zero-based molecule atom `i`; upper bounds are above the
453
+ * diagonal and lower bounds below it. At most 512 atoms are accepted.
454
+ */
455
+ rdkit_bounds_matrix_json(set15bounds: boolean, do_triangle_smoothing: boolean, use_macrocycle_14_config: boolean): string;
456
+ /**
457
+ * RDKit `CalcRMS`, bounded by `max_matches <= 1_000_000`.
458
+ */
459
+ rdkit_calc_rms(probe_coords_json: string, reference_coords_json: string, max_matches: number, symmetrize: boolean, weights_json?: string | null): number;
460
+ /**
461
+ * Chiral centres as `[[atomIndex,"R"|"S"|"?"], ...]` JSON.
462
+ */
463
+ rdkit_chiral_centers_json(include_unassigned: boolean): string;
464
+ /**
465
+ * RDKit-compatible CXSMARTS.
466
+ */
467
+ rdkit_cx_smarts(): string;
468
+ /**
469
+ * Seeded RDKit ETKDGv3 coordinates as JSON. Call on an
470
+ * explicit-hydrogen molecule. At most 512 atoms are accepted.
471
+ */
472
+ rdkit_embed_json(random_seed: number, max_iterations: number): string;
473
+ /**
474
+ * RDKit MolHash by case-insensitive function name.
475
+ */
476
+ rdkit_mol_hash(_function: string, use_cx_smiles: boolean): string;
477
+ /**
478
+ * RDKit Morgan folded bitInfo as `{bit:[[atomIndex,radius],...]}` JSON.
479
+ */
480
+ rdkit_morgan_bit_info_json(radius: number, n_bits: number, include_chirality: boolean): string;
481
+ /**
482
+ * RDKit-compatible Murcko scaffold SMILES.
483
+ */
484
+ rdkit_murcko_scaffold(): string;
485
+ /**
486
+ * RDKit-compatible PDB block. Optional coordinates are a JSON array in
487
+ * zero-based molecule atom order; omit them to write zero coordinates.
488
+ */
489
+ rdkit_pdb_block(coords_json?: string | null): string;
490
+ /**
491
+ * RDKit-compatible SMARTS in input atom order.
492
+ */
493
+ rdkit_smarts(isomeric: boolean, rooted_at_atom?: number | null): string;
433
494
  /**
434
495
  * Canonical SMILES exactly as RDKit 2026.03.1 writes it
435
496
  * (`Chem.MolToSmiles(Chem.MolFromSmiles(s))` for a molecule parsed
@@ -438,6 +499,15 @@ export class MolHandle {
438
499
  * rejects; `canonical_smiles` is unchanged.
439
500
  */
440
501
  rdkit_smiles(): string;
502
+ /**
503
+ * Number of default RDKit stereoisomers as a decimal string (u128-safe).
504
+ */
505
+ rdkit_stereoisomer_count(): string;
506
+ /**
507
+ * Sorted RDKit stereoisomer SMILES JSON. `max_isomers` is required and
508
+ * must be between 1 and 4096 so browser work remains bounded.
509
+ */
510
+ rdkit_stereoisomer_smiles_json(max_isomers: number): string;
441
511
  /**
442
512
  * Returns `true` if the molecule passes the REOS (Rapid Elimination Of Swill) filter.
443
513
  */
@@ -497,6 +567,30 @@ export class PreparedRdkitEcfp4Handle {
497
567
  bitvec(): Uint8Array;
498
568
  }
499
569
 
570
+ /**
571
+ * Result of an RDKit-compatible PDB, XYZ, or MOL2 reader.
572
+ *
573
+ * `coords_json()` is a JSON array with one `[x,y,z]` row per zero-based
574
+ * molecule atom. `smiles` is empty for XYZ and unsanitized readers.
575
+ */
576
+ export class RdkitReadResult {
577
+ private constructor();
578
+ free(): void;
579
+ [Symbol.dispose](): void;
580
+ /**
581
+ * Coordinates as JSON, in zero-based molecule atom order.
582
+ */
583
+ coords_json(): string;
584
+ /**
585
+ * A cloned handle to the parsed molecule.
586
+ */
587
+ molecule(): MolHandle;
588
+ /**
589
+ * RDKit canonical SMILES when the reader sanitized the molecule.
590
+ */
591
+ readonly smiles: string;
592
+ }
593
+
500
594
  /**
501
595
  * Reusable prepared index for the RDKit-compatible Morgan profile.
502
596
  *
@@ -1647,6 +1741,14 @@ export function mmcif_coords_json(text: string): string;
1647
1741
  */
1648
1742
  export function mmcif_to_json(text: string): string;
1649
1743
 
1744
+ /**
1745
+ * Checked legacy MMFF94 charges.
1746
+ *
1747
+ * Returns `{"charges":[...]}` or a typed `{"error":"unsupported_element",...}`
1748
+ * object instead of silently returning zeros for an unparameterized atom.
1749
+ */
1750
+ export function mmff94_charges_checked_json(mol: MolHandle): string;
1751
+
1650
1752
  /**
1651
1753
  * MMFF94 partial charges (BCI table, ±0.1e accuracy) as a JSON array of f64.
1652
1754
  *
@@ -2359,6 +2461,21 @@ export function rdkit_ecfp_config_chiral_detail_json(mol: MolHandle, radius: num
2359
2461
  */
2360
2462
  export function rdkit_ecfp_config_detail_json(mol: MolHandle, radius: number, nbits: number): string;
2361
2463
 
2464
+ /**
2465
+ * RDKit-compatible `MolFromMol2Block` with molecule and coordinates.
2466
+ */
2467
+ export function rdkit_from_mol2_block(text: string, sanitize: boolean, remove_hs: boolean, cleanup_substructures: boolean): RdkitReadResult;
2468
+
2469
+ /**
2470
+ * RDKit-compatible `MolFromPDBBlock` with molecule and coordinates.
2471
+ */
2472
+ export function rdkit_from_pdb_block(text: string, sanitize: boolean, remove_hs: boolean, flavor: number, proximity_bonding: boolean): RdkitReadResult;
2473
+
2474
+ /**
2475
+ * RDKit-compatible `MolFromXYZBlock`; the molecule has atoms but no bonds.
2476
+ */
2477
+ export function rdkit_from_xyz_block(text: string): RdkitReadResult;
2478
+
2362
2479
  /**
2363
2480
  * Find the k nearest neighbours using the RDKit-compatible Morgan/ECFP4
2364
2481
  * profile. This is intentionally separate from [`nearest_neighbors_json`],
@@ -3087,6 +3204,7 @@ export interface InitOutput {
3087
3204
  readonly __wbg_mhfplshhandle_free: (a: number, b: number) => void;
3088
3205
  readonly __wbg_molhandle_free: (a: number, b: number) => void;
3089
3206
  readonly __wbg_preparedrdkitecfp4handle_free: (a: number, b: number) => void;
3207
+ readonly __wbg_rdkitreadresult_free: (a: number, b: number) => void;
3090
3208
  readonly __wbg_rdkitsearchindex_free: (a: number, b: number) => void;
3091
3209
  readonly __wbg_smilesbatchstreamhandle_free: (a: number, b: number) => void;
3092
3210
  readonly add_hydrogens: (a: number) => number;
@@ -3226,6 +3344,7 @@ export interface InitOutput {
3226
3344
  readonly minimize_uff_json: (a: number, b: number, c: number, d: number, e: number) => [number, number];
3227
3345
  readonly mmcif_coords_json: (a: number, b: number) => [number, number, number, number];
3228
3346
  readonly mmcif_to_json: (a: number, b: number) => [number, number, number, number];
3347
+ readonly mmff94_charges_checked_json: (a: number) => [number, number];
3229
3348
  readonly mmff94_charges_json: (a: number) => [number, number];
3230
3349
  readonly mmff94_charges_typed_json: (a: number) => [number, number];
3231
3350
  readonly mmff94_energy_breakdown_from_coords_json: (a: number, b: number, c: number) => [number, number];
@@ -3318,6 +3437,7 @@ export interface InitOutput {
3318
3437
  readonly molhandle_num_aromatic_heterocycles: (a: number) => number;
3319
3438
  readonly molhandle_num_bridgehead_atoms: (a: number) => number;
3320
3439
  readonly molhandle_num_heteroatoms: (a: number) => number;
3440
+ readonly molhandle_num_rings: (a: number) => number;
3321
3441
  readonly molhandle_num_saturated_heterocycles: (a: number) => number;
3322
3442
  readonly molhandle_num_saturated_rings: (a: number) => number;
3323
3443
  readonly molhandle_num_spiro_atoms: (a: number) => number;
@@ -3329,7 +3449,22 @@ export interface InitOutput {
3329
3449
  readonly molhandle_potential_stereocenter_indices: (a: number) => [number, number];
3330
3450
  readonly molhandle_qed: (a: number) => number;
3331
3451
  readonly molhandle_randic_index: (a: number) => number;
3452
+ readonly molhandle_rdkit_align_json: (a: number, b: number, c: number, d: number, e: number, f: number, g: number, h: number, i: number, j: number, k: number) => [number, number, number, number];
3453
+ readonly molhandle_rdkit_best_alignment_json: (a: number, b: number, c: number, d: number, e: number, f: number, g: number, h: number, i: number) => [number, number, number, number];
3454
+ readonly molhandle_rdkit_best_rms: (a: number, b: number, c: number, d: number, e: number, f: number, g: number, h: number, i: number) => [number, number, number];
3455
+ readonly molhandle_rdkit_bounds_matrix_json: (a: number, b: number, c: number, d: number) => [number, number, number, number];
3456
+ readonly molhandle_rdkit_calc_rms: (a: number, b: number, c: number, d: number, e: number, f: number, g: number, h: number, i: number) => [number, number, number];
3457
+ readonly molhandle_rdkit_chiral_centers_json: (a: number, b: number) => [number, number, number, number];
3458
+ readonly molhandle_rdkit_cx_smarts: (a: number) => [number, number, number, number];
3459
+ readonly molhandle_rdkit_embed_json: (a: number, b: number, c: number) => [number, number, number, number];
3460
+ readonly molhandle_rdkit_mol_hash: (a: number, b: number, c: number, d: number) => [number, number, number, number];
3461
+ readonly molhandle_rdkit_morgan_bit_info_json: (a: number, b: number, c: number, d: number) => [number, number, number, number];
3462
+ readonly molhandle_rdkit_murcko_scaffold: (a: number) => [number, number, number, number];
3463
+ readonly molhandle_rdkit_pdb_block: (a: number, b: number, c: number) => [number, number, number, number];
3464
+ readonly molhandle_rdkit_smarts: (a: number, b: number, c: number) => [number, number, number, number];
3332
3465
  readonly molhandle_rdkit_smiles: (a: number) => [number, number, number, number];
3466
+ readonly molhandle_rdkit_stereoisomer_count: (a: number) => [number, number, number, number];
3467
+ readonly molhandle_rdkit_stereoisomer_smiles_json: (a: number, b: number) => [number, number, number, number];
3333
3468
  readonly molhandle_reos_passes: (a: number) => number;
3334
3469
  readonly molhandle_ring_count: (a: number) => number;
3335
3470
  readonly molhandle_rotatable_bond_count: (a: number) => number;
@@ -3383,10 +3518,16 @@ export interface InitOutput {
3383
3518
  readonly rdkit_ecfp_config_chiral_bitvec: (a: number, b: number, c: number) => [number, number, number, number];
3384
3519
  readonly rdkit_ecfp_config_chiral_detail_json: (a: number, b: number, c: number) => [number, number, number, number];
3385
3520
  readonly rdkit_ecfp_config_detail_json: (a: number, b: number, c: number) => [number, number, number, number];
3521
+ readonly rdkit_from_mol2_block: (a: number, b: number, c: number, d: number, e: number) => [number, number, number];
3522
+ readonly rdkit_from_pdb_block: (a: number, b: number, c: number, d: number, e: number, f: number) => [number, number, number];
3523
+ readonly rdkit_from_xyz_block: (a: number, b: number) => [number, number, number];
3386
3524
  readonly rdkit_nearest_neighbors_json: (a: number, b: number, c: number, d: number, e: number) => [number, number];
3387
3525
  readonly rdkit_path_bitvec: (a: number) => [number, number];
3388
3526
  readonly rdkit_rdk_bitvec: (a: number) => [number, number];
3389
3527
  readonly rdkit_torsion_bitvec: (a: number) => [number, number];
3528
+ readonly rdkitreadresult_coords_json: (a: number) => [number, number, number, number];
3529
+ readonly rdkitreadresult_molecule: (a: number) => number;
3530
+ readonly rdkitreadresult_smiles: (a: number) => [number, number];
3390
3531
  readonly rdkitsearchindex_is_empty: (a: number) => number;
3391
3532
  readonly rdkitsearchindex_len: (a: number) => number;
3392
3533
  readonly rdkitsearchindex_new: (a: number, b: number) => [number, number, number];
package/chematic_wasm.js CHANGED
@@ -916,6 +916,14 @@ export class MolHandle {
916
916
  const ret = wasm.molhandle_num_heteroatoms(this.__wbg_ptr);
917
917
  return ret >>> 0;
918
918
  }
919
+ /**
920
+ * Number of rings using RDKit's symmetrized-SSSR semantics.
921
+ * @returns {number}
922
+ */
923
+ num_rings() {
924
+ const ret = wasm.molhandle_num_rings(this.__wbg_ptr);
925
+ return ret >>> 0;
926
+ }
919
927
  /**
920
928
  * Number of fully saturated rings containing at least one heteroatom.
921
929
  * @returns {number}
@@ -1008,6 +1016,340 @@ export class MolHandle {
1008
1016
  const ret = wasm.molhandle_randic_index(this.__wbg_ptr);
1009
1017
  return ret;
1010
1018
  }
1019
+ /**
1020
+ * RDKit `AlignMol` result JSON. Coordinates and optional atom map and
1021
+ * weights use zero-based molecule atom order.
1022
+ * @param {string} probe_coords_json
1023
+ * @param {string} reference_coords_json
1024
+ * @param {string | null | undefined} atom_map_json
1025
+ * @param {string | null | undefined} weights_json
1026
+ * @param {boolean} reflect
1027
+ * @param {number} max_iterations
1028
+ * @returns {string}
1029
+ */
1030
+ rdkit_align_json(probe_coords_json, reference_coords_json, atom_map_json, weights_json, reflect, max_iterations) {
1031
+ let deferred6_0;
1032
+ let deferred6_1;
1033
+ try {
1034
+ const ptr0 = passStringToWasm0(probe_coords_json, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc);
1035
+ const len0 = WASM_VECTOR_LEN;
1036
+ const ptr1 = passStringToWasm0(reference_coords_json, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc);
1037
+ const len1 = WASM_VECTOR_LEN;
1038
+ var ptr2 = isLikeNone(atom_map_json) ? 0 : passStringToWasm0(atom_map_json, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc);
1039
+ var len2 = WASM_VECTOR_LEN;
1040
+ var ptr3 = isLikeNone(weights_json) ? 0 : passStringToWasm0(weights_json, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc);
1041
+ var len3 = WASM_VECTOR_LEN;
1042
+ const ret = wasm.molhandle_rdkit_align_json(this.__wbg_ptr, ptr0, len0, ptr1, len1, ptr2, len2, ptr3, len3, reflect, max_iterations);
1043
+ var ptr5 = ret[0];
1044
+ var len5 = ret[1];
1045
+ if (ret[3]) {
1046
+ ptr5 = 0; len5 = 0;
1047
+ throw takeFromExternrefTable0(ret[2]);
1048
+ }
1049
+ deferred6_0 = ptr5;
1050
+ deferred6_1 = len5;
1051
+ return getStringFromWasm0(ptr5, len5);
1052
+ } finally {
1053
+ wasm.__wbindgen_free(deferred6_0, deferred6_1, 1);
1054
+ }
1055
+ }
1056
+ /**
1057
+ * RDKit `GetBestAlignmentTransform` as JSON, bounded by `max_matches`.
1058
+ * @param {string} probe_coords_json
1059
+ * @param {string} reference_coords_json
1060
+ * @param {number} max_matches
1061
+ * @param {boolean} symmetrize
1062
+ * @param {string | null} [weights_json]
1063
+ * @returns {string}
1064
+ */
1065
+ rdkit_best_alignment_json(probe_coords_json, reference_coords_json, max_matches, symmetrize, weights_json) {
1066
+ let deferred5_0;
1067
+ let deferred5_1;
1068
+ try {
1069
+ const ptr0 = passStringToWasm0(probe_coords_json, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc);
1070
+ const len0 = WASM_VECTOR_LEN;
1071
+ const ptr1 = passStringToWasm0(reference_coords_json, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc);
1072
+ const len1 = WASM_VECTOR_LEN;
1073
+ var ptr2 = isLikeNone(weights_json) ? 0 : passStringToWasm0(weights_json, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc);
1074
+ var len2 = WASM_VECTOR_LEN;
1075
+ const ret = wasm.molhandle_rdkit_best_alignment_json(this.__wbg_ptr, ptr0, len0, ptr1, len1, max_matches, symmetrize, ptr2, len2);
1076
+ var ptr4 = ret[0];
1077
+ var len4 = ret[1];
1078
+ if (ret[3]) {
1079
+ ptr4 = 0; len4 = 0;
1080
+ throw takeFromExternrefTable0(ret[2]);
1081
+ }
1082
+ deferred5_0 = ptr4;
1083
+ deferred5_1 = len4;
1084
+ return getStringFromWasm0(ptr4, len4);
1085
+ } finally {
1086
+ wasm.__wbindgen_free(deferred5_0, deferred5_1, 1);
1087
+ }
1088
+ }
1089
+ /**
1090
+ * RDKit `GetBestRMS`, bounded by `max_matches <= 1_000_000`.
1091
+ * @param {string} probe_coords_json
1092
+ * @param {string} reference_coords_json
1093
+ * @param {number} max_matches
1094
+ * @param {boolean} symmetrize
1095
+ * @param {string | null} [weights_json]
1096
+ * @returns {number}
1097
+ */
1098
+ rdkit_best_rms(probe_coords_json, reference_coords_json, max_matches, symmetrize, weights_json) {
1099
+ const ptr0 = passStringToWasm0(probe_coords_json, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc);
1100
+ const len0 = WASM_VECTOR_LEN;
1101
+ const ptr1 = passStringToWasm0(reference_coords_json, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc);
1102
+ const len1 = WASM_VECTOR_LEN;
1103
+ var ptr2 = isLikeNone(weights_json) ? 0 : passStringToWasm0(weights_json, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc);
1104
+ var len2 = WASM_VECTOR_LEN;
1105
+ const ret = wasm.molhandle_rdkit_best_rms(this.__wbg_ptr, ptr0, len0, ptr1, len1, max_matches, symmetrize, ptr2, len2);
1106
+ if (ret[2]) {
1107
+ throw takeFromExternrefTable0(ret[1]);
1108
+ }
1109
+ return ret[0];
1110
+ }
1111
+ /**
1112
+ * RDKit distance-geometry bounds matrix JSON. Row and column `i`
1113
+ * refer to zero-based molecule atom `i`; upper bounds are above the
1114
+ * diagonal and lower bounds below it. At most 512 atoms are accepted.
1115
+ * @param {boolean} set15bounds
1116
+ * @param {boolean} do_triangle_smoothing
1117
+ * @param {boolean} use_macrocycle_14_config
1118
+ * @returns {string}
1119
+ */
1120
+ rdkit_bounds_matrix_json(set15bounds, do_triangle_smoothing, use_macrocycle_14_config) {
1121
+ let deferred2_0;
1122
+ let deferred2_1;
1123
+ try {
1124
+ const ret = wasm.molhandle_rdkit_bounds_matrix_json(this.__wbg_ptr, set15bounds, do_triangle_smoothing, use_macrocycle_14_config);
1125
+ var ptr1 = ret[0];
1126
+ var len1 = ret[1];
1127
+ if (ret[3]) {
1128
+ ptr1 = 0; len1 = 0;
1129
+ throw takeFromExternrefTable0(ret[2]);
1130
+ }
1131
+ deferred2_0 = ptr1;
1132
+ deferred2_1 = len1;
1133
+ return getStringFromWasm0(ptr1, len1);
1134
+ } finally {
1135
+ wasm.__wbindgen_free(deferred2_0, deferred2_1, 1);
1136
+ }
1137
+ }
1138
+ /**
1139
+ * RDKit `CalcRMS`, bounded by `max_matches <= 1_000_000`.
1140
+ * @param {string} probe_coords_json
1141
+ * @param {string} reference_coords_json
1142
+ * @param {number} max_matches
1143
+ * @param {boolean} symmetrize
1144
+ * @param {string | null} [weights_json]
1145
+ * @returns {number}
1146
+ */
1147
+ rdkit_calc_rms(probe_coords_json, reference_coords_json, max_matches, symmetrize, weights_json) {
1148
+ const ptr0 = passStringToWasm0(probe_coords_json, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc);
1149
+ const len0 = WASM_VECTOR_LEN;
1150
+ const ptr1 = passStringToWasm0(reference_coords_json, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc);
1151
+ const len1 = WASM_VECTOR_LEN;
1152
+ var ptr2 = isLikeNone(weights_json) ? 0 : passStringToWasm0(weights_json, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc);
1153
+ var len2 = WASM_VECTOR_LEN;
1154
+ const ret = wasm.molhandle_rdkit_calc_rms(this.__wbg_ptr, ptr0, len0, ptr1, len1, max_matches, symmetrize, ptr2, len2);
1155
+ if (ret[2]) {
1156
+ throw takeFromExternrefTable0(ret[1]);
1157
+ }
1158
+ return ret[0];
1159
+ }
1160
+ /**
1161
+ * Chiral centres as `[[atomIndex,"R"|"S"|"?"], ...]` JSON.
1162
+ * @param {boolean} include_unassigned
1163
+ * @returns {string}
1164
+ */
1165
+ rdkit_chiral_centers_json(include_unassigned) {
1166
+ let deferred2_0;
1167
+ let deferred2_1;
1168
+ try {
1169
+ const ret = wasm.molhandle_rdkit_chiral_centers_json(this.__wbg_ptr, include_unassigned);
1170
+ var ptr1 = ret[0];
1171
+ var len1 = ret[1];
1172
+ if (ret[3]) {
1173
+ ptr1 = 0; len1 = 0;
1174
+ throw takeFromExternrefTable0(ret[2]);
1175
+ }
1176
+ deferred2_0 = ptr1;
1177
+ deferred2_1 = len1;
1178
+ return getStringFromWasm0(ptr1, len1);
1179
+ } finally {
1180
+ wasm.__wbindgen_free(deferred2_0, deferred2_1, 1);
1181
+ }
1182
+ }
1183
+ /**
1184
+ * RDKit-compatible CXSMARTS.
1185
+ * @returns {string}
1186
+ */
1187
+ rdkit_cx_smarts() {
1188
+ let deferred2_0;
1189
+ let deferred2_1;
1190
+ try {
1191
+ const ret = wasm.molhandle_rdkit_cx_smarts(this.__wbg_ptr);
1192
+ var ptr1 = ret[0];
1193
+ var len1 = ret[1];
1194
+ if (ret[3]) {
1195
+ ptr1 = 0; len1 = 0;
1196
+ throw takeFromExternrefTable0(ret[2]);
1197
+ }
1198
+ deferred2_0 = ptr1;
1199
+ deferred2_1 = len1;
1200
+ return getStringFromWasm0(ptr1, len1);
1201
+ } finally {
1202
+ wasm.__wbindgen_free(deferred2_0, deferred2_1, 1);
1203
+ }
1204
+ }
1205
+ /**
1206
+ * Seeded RDKit ETKDGv3 coordinates as JSON. Call on an
1207
+ * explicit-hydrogen molecule. At most 512 atoms are accepted.
1208
+ * @param {number} random_seed
1209
+ * @param {number} max_iterations
1210
+ * @returns {string}
1211
+ */
1212
+ rdkit_embed_json(random_seed, max_iterations) {
1213
+ let deferred2_0;
1214
+ let deferred2_1;
1215
+ try {
1216
+ const ret = wasm.molhandle_rdkit_embed_json(this.__wbg_ptr, random_seed, max_iterations);
1217
+ var ptr1 = ret[0];
1218
+ var len1 = ret[1];
1219
+ if (ret[3]) {
1220
+ ptr1 = 0; len1 = 0;
1221
+ throw takeFromExternrefTable0(ret[2]);
1222
+ }
1223
+ deferred2_0 = ptr1;
1224
+ deferred2_1 = len1;
1225
+ return getStringFromWasm0(ptr1, len1);
1226
+ } finally {
1227
+ wasm.__wbindgen_free(deferred2_0, deferred2_1, 1);
1228
+ }
1229
+ }
1230
+ /**
1231
+ * RDKit MolHash by case-insensitive function name.
1232
+ * @param {string} _function
1233
+ * @param {boolean} use_cx_smiles
1234
+ * @returns {string}
1235
+ */
1236
+ rdkit_mol_hash(_function, use_cx_smiles) {
1237
+ let deferred3_0;
1238
+ let deferred3_1;
1239
+ try {
1240
+ const ptr0 = passStringToWasm0(_function, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc);
1241
+ const len0 = WASM_VECTOR_LEN;
1242
+ const ret = wasm.molhandle_rdkit_mol_hash(this.__wbg_ptr, ptr0, len0, use_cx_smiles);
1243
+ var ptr2 = ret[0];
1244
+ var len2 = ret[1];
1245
+ if (ret[3]) {
1246
+ ptr2 = 0; len2 = 0;
1247
+ throw takeFromExternrefTable0(ret[2]);
1248
+ }
1249
+ deferred3_0 = ptr2;
1250
+ deferred3_1 = len2;
1251
+ return getStringFromWasm0(ptr2, len2);
1252
+ } finally {
1253
+ wasm.__wbindgen_free(deferred3_0, deferred3_1, 1);
1254
+ }
1255
+ }
1256
+ /**
1257
+ * RDKit Morgan folded bitInfo as `{bit:[[atomIndex,radius],...]}` JSON.
1258
+ * @param {number} radius
1259
+ * @param {number} n_bits
1260
+ * @param {boolean} include_chirality
1261
+ * @returns {string}
1262
+ */
1263
+ rdkit_morgan_bit_info_json(radius, n_bits, include_chirality) {
1264
+ let deferred2_0;
1265
+ let deferred2_1;
1266
+ try {
1267
+ const ret = wasm.molhandle_rdkit_morgan_bit_info_json(this.__wbg_ptr, radius, n_bits, include_chirality);
1268
+ var ptr1 = ret[0];
1269
+ var len1 = ret[1];
1270
+ if (ret[3]) {
1271
+ ptr1 = 0; len1 = 0;
1272
+ throw takeFromExternrefTable0(ret[2]);
1273
+ }
1274
+ deferred2_0 = ptr1;
1275
+ deferred2_1 = len1;
1276
+ return getStringFromWasm0(ptr1, len1);
1277
+ } finally {
1278
+ wasm.__wbindgen_free(deferred2_0, deferred2_1, 1);
1279
+ }
1280
+ }
1281
+ /**
1282
+ * RDKit-compatible Murcko scaffold SMILES.
1283
+ * @returns {string}
1284
+ */
1285
+ rdkit_murcko_scaffold() {
1286
+ let deferred2_0;
1287
+ let deferred2_1;
1288
+ try {
1289
+ const ret = wasm.molhandle_rdkit_murcko_scaffold(this.__wbg_ptr);
1290
+ var ptr1 = ret[0];
1291
+ var len1 = ret[1];
1292
+ if (ret[3]) {
1293
+ ptr1 = 0; len1 = 0;
1294
+ throw takeFromExternrefTable0(ret[2]);
1295
+ }
1296
+ deferred2_0 = ptr1;
1297
+ deferred2_1 = len1;
1298
+ return getStringFromWasm0(ptr1, len1);
1299
+ } finally {
1300
+ wasm.__wbindgen_free(deferred2_0, deferred2_1, 1);
1301
+ }
1302
+ }
1303
+ /**
1304
+ * RDKit-compatible PDB block. Optional coordinates are a JSON array in
1305
+ * zero-based molecule atom order; omit them to write zero coordinates.
1306
+ * @param {string | null} [coords_json]
1307
+ * @returns {string}
1308
+ */
1309
+ rdkit_pdb_block(coords_json) {
1310
+ let deferred3_0;
1311
+ let deferred3_1;
1312
+ try {
1313
+ var ptr0 = isLikeNone(coords_json) ? 0 : passStringToWasm0(coords_json, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc);
1314
+ var len0 = WASM_VECTOR_LEN;
1315
+ const ret = wasm.molhandle_rdkit_pdb_block(this.__wbg_ptr, ptr0, len0);
1316
+ var ptr2 = ret[0];
1317
+ var len2 = ret[1];
1318
+ if (ret[3]) {
1319
+ ptr2 = 0; len2 = 0;
1320
+ throw takeFromExternrefTable0(ret[2]);
1321
+ }
1322
+ deferred3_0 = ptr2;
1323
+ deferred3_1 = len2;
1324
+ return getStringFromWasm0(ptr2, len2);
1325
+ } finally {
1326
+ wasm.__wbindgen_free(deferred3_0, deferred3_1, 1);
1327
+ }
1328
+ }
1329
+ /**
1330
+ * RDKit-compatible SMARTS in input atom order.
1331
+ * @param {boolean} isomeric
1332
+ * @param {number | null} [rooted_at_atom]
1333
+ * @returns {string}
1334
+ */
1335
+ rdkit_smarts(isomeric, rooted_at_atom) {
1336
+ let deferred2_0;
1337
+ let deferred2_1;
1338
+ try {
1339
+ const ret = wasm.molhandle_rdkit_smarts(this.__wbg_ptr, isomeric, isLikeNone(rooted_at_atom) ? Number.MAX_SAFE_INTEGER : (rooted_at_atom) >>> 0);
1340
+ var ptr1 = ret[0];
1341
+ var len1 = ret[1];
1342
+ if (ret[3]) {
1343
+ ptr1 = 0; len1 = 0;
1344
+ throw takeFromExternrefTable0(ret[2]);
1345
+ }
1346
+ deferred2_0 = ptr1;
1347
+ deferred2_1 = len1;
1348
+ return getStringFromWasm0(ptr1, len1);
1349
+ } finally {
1350
+ wasm.__wbindgen_free(deferred2_0, deferred2_1, 1);
1351
+ }
1352
+ }
1011
1353
  /**
1012
1354
  * Canonical SMILES exactly as RDKit 2026.03.1 writes it
1013
1355
  * (`Chem.MolToSmiles(Chem.MolFromSmiles(s))` for a molecule parsed
@@ -1034,6 +1376,52 @@ export class MolHandle {
1034
1376
  wasm.__wbindgen_free(deferred2_0, deferred2_1, 1);
1035
1377
  }
1036
1378
  }
1379
+ /**
1380
+ * Number of default RDKit stereoisomers as a decimal string (u128-safe).
1381
+ * @returns {string}
1382
+ */
1383
+ rdkit_stereoisomer_count() {
1384
+ let deferred2_0;
1385
+ let deferred2_1;
1386
+ try {
1387
+ const ret = wasm.molhandle_rdkit_stereoisomer_count(this.__wbg_ptr);
1388
+ var ptr1 = ret[0];
1389
+ var len1 = ret[1];
1390
+ if (ret[3]) {
1391
+ ptr1 = 0; len1 = 0;
1392
+ throw takeFromExternrefTable0(ret[2]);
1393
+ }
1394
+ deferred2_0 = ptr1;
1395
+ deferred2_1 = len1;
1396
+ return getStringFromWasm0(ptr1, len1);
1397
+ } finally {
1398
+ wasm.__wbindgen_free(deferred2_0, deferred2_1, 1);
1399
+ }
1400
+ }
1401
+ /**
1402
+ * Sorted RDKit stereoisomer SMILES JSON. `max_isomers` is required and
1403
+ * must be between 1 and 4096 so browser work remains bounded.
1404
+ * @param {number} max_isomers
1405
+ * @returns {string}
1406
+ */
1407
+ rdkit_stereoisomer_smiles_json(max_isomers) {
1408
+ let deferred2_0;
1409
+ let deferred2_1;
1410
+ try {
1411
+ const ret = wasm.molhandle_rdkit_stereoisomer_smiles_json(this.__wbg_ptr, max_isomers);
1412
+ var ptr1 = ret[0];
1413
+ var len1 = ret[1];
1414
+ if (ret[3]) {
1415
+ ptr1 = 0; len1 = 0;
1416
+ throw takeFromExternrefTable0(ret[2]);
1417
+ }
1418
+ deferred2_0 = ptr1;
1419
+ deferred2_1 = len1;
1420
+ return getStringFromWasm0(ptr1, len1);
1421
+ } finally {
1422
+ wasm.__wbindgen_free(deferred2_0, deferred2_1, 1);
1423
+ }
1424
+ }
1037
1425
  /**
1038
1426
  * Returns `true` if the molecule passes the REOS (Rapid Elimination Of Swill) filter.
1039
1427
  * @returns {boolean}
@@ -1170,6 +1558,78 @@ export class PreparedRdkitEcfp4Handle {
1170
1558
  }
1171
1559
  if (Symbol.dispose) PreparedRdkitEcfp4Handle.prototype[Symbol.dispose] = PreparedRdkitEcfp4Handle.prototype.free;
1172
1560
 
1561
+ /**
1562
+ * Result of an RDKit-compatible PDB, XYZ, or MOL2 reader.
1563
+ *
1564
+ * `coords_json()` is a JSON array with one `[x,y,z]` row per zero-based
1565
+ * molecule atom. `smiles` is empty for XYZ and unsanitized readers.
1566
+ */
1567
+ export class RdkitReadResult {
1568
+ static __wrap(ptr) {
1569
+ const obj = Object.create(RdkitReadResult.prototype);
1570
+ obj.__wbg_ptr = ptr;
1571
+ RdkitReadResultFinalization.register(obj, obj.__wbg_ptr, obj);
1572
+ return obj;
1573
+ }
1574
+ __destroy_into_raw() {
1575
+ const ptr = this.__wbg_ptr;
1576
+ this.__wbg_ptr = 0;
1577
+ RdkitReadResultFinalization.unregister(this);
1578
+ return ptr;
1579
+ }
1580
+ free() {
1581
+ const ptr = this.__destroy_into_raw();
1582
+ wasm.__wbg_rdkitreadresult_free(ptr, 0);
1583
+ }
1584
+ /**
1585
+ * Coordinates as JSON, in zero-based molecule atom order.
1586
+ * @returns {string}
1587
+ */
1588
+ coords_json() {
1589
+ let deferred2_0;
1590
+ let deferred2_1;
1591
+ try {
1592
+ const ret = wasm.rdkitreadresult_coords_json(this.__wbg_ptr);
1593
+ var ptr1 = ret[0];
1594
+ var len1 = ret[1];
1595
+ if (ret[3]) {
1596
+ ptr1 = 0; len1 = 0;
1597
+ throw takeFromExternrefTable0(ret[2]);
1598
+ }
1599
+ deferred2_0 = ptr1;
1600
+ deferred2_1 = len1;
1601
+ return getStringFromWasm0(ptr1, len1);
1602
+ } finally {
1603
+ wasm.__wbindgen_free(deferred2_0, deferred2_1, 1);
1604
+ }
1605
+ }
1606
+ /**
1607
+ * A cloned handle to the parsed molecule.
1608
+ * @returns {MolHandle}
1609
+ */
1610
+ molecule() {
1611
+ const ret = wasm.rdkitreadresult_molecule(this.__wbg_ptr);
1612
+ return MolHandle.__wrap(ret);
1613
+ }
1614
+ /**
1615
+ * RDKit canonical SMILES when the reader sanitized the molecule.
1616
+ * @returns {string}
1617
+ */
1618
+ get smiles() {
1619
+ let deferred1_0;
1620
+ let deferred1_1;
1621
+ try {
1622
+ const ret = wasm.rdkitreadresult_smiles(this.__wbg_ptr);
1623
+ deferred1_0 = ret[0];
1624
+ deferred1_1 = ret[1];
1625
+ return getStringFromWasm0(ret[0], ret[1]);
1626
+ } finally {
1627
+ wasm.__wbindgen_free(deferred1_0, deferred1_1, 1);
1628
+ }
1629
+ }
1630
+ }
1631
+ if (Symbol.dispose) RdkitReadResult.prototype[Symbol.dispose] = RdkitReadResult.prototype.free;
1632
+
1173
1633
  /**
1174
1634
  * Reusable prepared index for the RDKit-compatible Morgan profile.
1175
1635
  *
@@ -4171,6 +4631,28 @@ export function mmcif_to_json(text) {
4171
4631
  }
4172
4632
  }
4173
4633
 
4634
+ /**
4635
+ * Checked legacy MMFF94 charges.
4636
+ *
4637
+ * Returns `{"charges":[...]}` or a typed `{"error":"unsupported_element",...}`
4638
+ * object instead of silently returning zeros for an unparameterized atom.
4639
+ * @param {MolHandle} mol
4640
+ * @returns {string}
4641
+ */
4642
+ export function mmff94_charges_checked_json(mol) {
4643
+ let deferred1_0;
4644
+ let deferred1_1;
4645
+ try {
4646
+ _assertClass(mol, MolHandle);
4647
+ const ret = wasm.mmff94_charges_checked_json(mol.__wbg_ptr);
4648
+ deferred1_0 = ret[0];
4649
+ deferred1_1 = ret[1];
4650
+ return getStringFromWasm0(ret[0], ret[1]);
4651
+ } finally {
4652
+ wasm.__wbindgen_free(deferred1_0, deferred1_1, 1);
4653
+ }
4654
+ }
4655
+
4174
4656
  /**
4175
4657
  * MMFF94 partial charges (BCI table, ±0.1e accuracy) as a JSON array of f64.
4176
4658
  *
@@ -6082,6 +6564,58 @@ export function rdkit_ecfp_config_detail_json(mol, radius, nbits) {
6082
6564
  }
6083
6565
  }
6084
6566
 
6567
+ /**
6568
+ * RDKit-compatible `MolFromMol2Block` with molecule and coordinates.
6569
+ * @param {string} text
6570
+ * @param {boolean} sanitize
6571
+ * @param {boolean} remove_hs
6572
+ * @param {boolean} cleanup_substructures
6573
+ * @returns {RdkitReadResult}
6574
+ */
6575
+ export function rdkit_from_mol2_block(text, sanitize, remove_hs, cleanup_substructures) {
6576
+ const ptr0 = passStringToWasm0(text, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc);
6577
+ const len0 = WASM_VECTOR_LEN;
6578
+ const ret = wasm.rdkit_from_mol2_block(ptr0, len0, sanitize, remove_hs, cleanup_substructures);
6579
+ if (ret[2]) {
6580
+ throw takeFromExternrefTable0(ret[1]);
6581
+ }
6582
+ return RdkitReadResult.__wrap(ret[0]);
6583
+ }
6584
+
6585
+ /**
6586
+ * RDKit-compatible `MolFromPDBBlock` with molecule and coordinates.
6587
+ * @param {string} text
6588
+ * @param {boolean} sanitize
6589
+ * @param {boolean} remove_hs
6590
+ * @param {number} flavor
6591
+ * @param {boolean} proximity_bonding
6592
+ * @returns {RdkitReadResult}
6593
+ */
6594
+ export function rdkit_from_pdb_block(text, sanitize, remove_hs, flavor, proximity_bonding) {
6595
+ const ptr0 = passStringToWasm0(text, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc);
6596
+ const len0 = WASM_VECTOR_LEN;
6597
+ const ret = wasm.rdkit_from_pdb_block(ptr0, len0, sanitize, remove_hs, flavor, proximity_bonding);
6598
+ if (ret[2]) {
6599
+ throw takeFromExternrefTable0(ret[1]);
6600
+ }
6601
+ return RdkitReadResult.__wrap(ret[0]);
6602
+ }
6603
+
6604
+ /**
6605
+ * RDKit-compatible `MolFromXYZBlock`; the molecule has atoms but no bonds.
6606
+ * @param {string} text
6607
+ * @returns {RdkitReadResult}
6608
+ */
6609
+ export function rdkit_from_xyz_block(text) {
6610
+ const ptr0 = passStringToWasm0(text, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc);
6611
+ const len0 = WASM_VECTOR_LEN;
6612
+ const ret = wasm.rdkit_from_xyz_block(ptr0, len0);
6613
+ if (ret[2]) {
6614
+ throw takeFromExternrefTable0(ret[1]);
6615
+ }
6616
+ return RdkitReadResult.__wrap(ret[0]);
6617
+ }
6618
+
6085
6619
  /**
6086
6620
  * Find the k nearest neighbours using the RDKit-compatible Morgan/ECFP4
6087
6621
  * profile. This is intentionally separate from [`nearest_neighbors_json`],
@@ -8342,6 +8876,9 @@ const MolHandleFinalization = (typeof FinalizationRegistry === 'undefined')
8342
8876
  const PreparedRdkitEcfp4HandleFinalization = (typeof FinalizationRegistry === 'undefined')
8343
8877
  ? { register: () => {}, unregister: () => {} }
8344
8878
  : new FinalizationRegistry(ptr => wasm.__wbg_preparedrdkitecfp4handle_free(ptr, 1));
8879
+ const RdkitReadResultFinalization = (typeof FinalizationRegistry === 'undefined')
8880
+ ? { register: () => {}, unregister: () => {} }
8881
+ : new FinalizationRegistry(ptr => wasm.__wbg_rdkitreadresult_free(ptr, 1));
8345
8882
  const RdkitSearchIndexFinalization = (typeof FinalizationRegistry === 'undefined')
8346
8883
  ? { register: () => {}, unregister: () => {} }
8347
8884
  : new FinalizationRegistry(ptr => wasm.__wbg_rdkitsearchindex_free(ptr, 1));
Binary file
package/package.json CHANGED
@@ -5,7 +5,7 @@
5
5
  "Kentaro Tanabe (kent-tokyo) <kent-tokyo@users.noreply.github.com>"
6
6
  ],
7
7
  "description": "WebAssembly bindings for chematic — use chematic from JavaScript/TypeScript",
8
- "version": "1.0.41",
8
+ "version": "1.1.0",
9
9
  "license": "MIT OR Apache-2.0",
10
10
  "repository": {
11
11
  "type": "git",