@kent-tokyo/chematic 1.0.9 → 1.0.11

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
@@ -21,9 +21,16 @@ npm install @kent-tokyo/chematic
21
21
  - SA score: synthetic accessibility estimate [1, 10]
22
22
  - Functional group identification (Ertl 2017 IFG)
23
23
  - Canonical SMILES generation
24
- - ECFP4/6, AtomPair, Torsion, and path fingerprints with Tanimoto similarity
24
+ - ECFP4/6, AtomPair, Torsion, path, and RDKit-compatible RDK fingerprints
25
+ with Tanimoto similarity
25
26
  - BRICS fragment count
26
- - SDF/MOL block parsing
27
+ - SDF/MOL block parsing, including bounded resumable `sdf_records_batch_json`,
28
+ `xyz_frames_batch_json`, and `extxyz_frames_batch_json` manifests with
29
+ deterministic input indices and partial/complete status; bounded malformed
30
+ XYZ frames are grouped inline as rejected records when a later count-line
31
+ boundary is recoverable (core file-backed readers remain fail-stop)
32
+ - Bounded topology parsing for CML, ChemicalJSON (`mol_from_cjson`), MolJSON,
33
+ CDXML, MOL2, and PDB/mmCIF
27
34
  - PDBx/mmCIF, PQR, QCSchema JSON, ORCA input/output, Gaussian Cube, OpenDX,
28
35
  and LAMMPS data/dump I/O (JSON-based bindings; see `format_io.rs`)
29
36
  - Topological descriptors: Wiener index, Hall-Kier κ, χ connectivity indices, Bertz CT
@@ -68,7 +75,7 @@ console.log(mol.qed()); // drug-likeness score [0, 1]
68
75
  console.log(mol.exact_mass()); // ~180.042
69
76
  console.log(mol.hbd_count()); // 1
70
77
  console.log(mol.hba_count()); // 4
71
- console.log(mol.rotatable_bond_count()); // 3
78
+ console.log(mol.rotatable_bond_count()); // 2 (RDKit Lipinski definition)
72
79
  console.log(mol.aromatic_ring_count()); // 1
73
80
  console.log(mol.lipinski_passes()); // true
74
81
  console.log(mol.canonical_smiles()); // canonical SMILES string
@@ -162,7 +169,7 @@ and enforced correctly on all of them.
162
169
 
163
170
  ## Bundle Size
164
171
 
165
- The optimized v1.0.9 candidate artifact was measured at **3.58 MB raw / 1.31 MB gzip**. Bundle size depends on features and toolchain; see [`benchmarks/2026-09-07-wasm-size-v1.0.9.md`](../../benchmarks/2026-09-07-wasm-size-v1.0.9.md) for exact tools, digest, and reproduction steps.
172
+ The optimized v1.0.10 candidate artifact was measured at **3.73 MB raw / 1.36 MB gzip**. Bundle size depends on features and toolchain; see [`benchmarks/2026-09-09-wasm-size-v1.0.10.md`](../../benchmarks/2026-09-09-wasm-size-v1.0.10.md) for exact tools, digest, and reproduction steps.
166
173
 
167
174
  PNG rasterization (`tiny_skia`) is excluded from the WASM build — use SVG output instead. All SVG depiction APIs remain fully available.
168
175
 
@@ -974,6 +974,12 @@ export function estate_indices_json(mol: MolHandle): string;
974
974
  */
975
975
  export function extxyz_frame_json(text: string): string;
976
976
 
977
+ /**
978
+ * Return one deterministic, resumable Extended-XYZ batch as a JSON manifest.
979
+ * Stopping before requesting the next offset is the cancellation boundary.
980
+ */
981
+ export function extxyz_frames_batch_json(text: string, offset: number, batch_size: number): string;
982
+
977
983
  /**
978
984
  * FCFP4 (pharmacophore, radius-2) fingerprint as a bit-packed byte vector (256 bytes).
979
985
  */
@@ -1450,7 +1456,7 @@ export function minimize_mmff94_lbfgs_json(mol: MolHandle, max_iter: number): st
1450
1456
  * `coords_json` — JSON array of `[x,y,z]` arrays (Å), one per atom.
1451
1457
  * `max_iter` — maximum iterations (0 = default 500).
1452
1458
  *
1453
- * Returns JSON: `{"coords":[[x,y,z],...], "energy":float, "iterations":int, "converged":bool, "sound":bool}`
1459
+ * Returns JSON: `{"coords":[[x,y,z],...], "energy":float, "iterations":int, "converged":bool, "sound":bool, "worst_bond_length":float}`
1454
1460
  * or `{"error":"<msg>"}` on failure. `sound` is all-finite coordinates and
1455
1461
  * no bond stretched past a sane covalent-bond length — independent of
1456
1462
  * `converged`, since steepest descent often reports `converged:false` on
@@ -1597,6 +1603,15 @@ export function mol_block_stereo_diagnostics_json(mol_block: string): string;
1597
1603
  */
1598
1604
  export function mol_from_cdxml(cdxml: string): MolHandle;
1599
1605
 
1606
+ /**
1607
+ * Parse a ChemicalJSON (CJSON) string into a `MolHandle`.
1608
+ *
1609
+ * Coordinates and CJSON-specific metadata are intentionally not retained by
1610
+ * this topology handle; use `convert_common_format` when a serialized CJSON
1611
+ * round trip is required.
1612
+ */
1613
+ export function mol_from_cjson(json: string): MolHandle;
1614
+
1600
1615
  /**
1601
1616
  * Parse a CML string into a `MolHandle`.
1602
1617
  *
@@ -1665,6 +1680,21 @@ export function mol_from_orca_input(text: string): MolHandle;
1665
1680
  */
1666
1681
  export function mol_from_pdb(pdb: string): MolHandle;
1667
1682
 
1683
+ /**
1684
+ * Strict PDB parser. Unlike [`mol_from_pdb`], malformed ATOM/HETATM fields
1685
+ * return an error instead of producing a partially recovered molecule.
1686
+ */
1687
+ export function mol_from_pdb_strict(pdb: string): MolHandle;
1688
+
1689
+ /**
1690
+ * Parse an AutoDock PDBQT block into a topology handle.
1691
+ *
1692
+ * Coordinates and partial charges are intentionally discarded, matching the
1693
+ * Python `from_pdbqt` binding; use the Rust parser when those arrays are
1694
+ * needed. Invalid records return a JS error instead of a partial molecule.
1695
+ */
1696
+ export function mol_from_pdbqt(pdbqt: string): MolHandle;
1697
+
1668
1698
  /**
1669
1699
  * Parse a PQR file and return a `MolHandle` (topology only -- element
1670
1700
  * list inferred per-atom, no bonds; PQR carries no connectivity). Use
@@ -1923,6 +1953,12 @@ export function pdb_coords_json(pdb: string): string;
1923
1953
  */
1924
1954
  export function peoe_vsa_json(mol: MolHandle): string;
1925
1955
 
1956
+ /**
1957
+ * Fingerprint a serialized `PeriodicStructure`; invalid or oversized input
1958
+ * returns a stable JSON error rather than being treated as a retrieval hit.
1959
+ */
1960
+ export function periodic_structure_fingerprint_json(json: string, source: string): string;
1961
+
1926
1962
  /**
1927
1963
  * Detect pharmacophore features for virtual screening and lead optimization.
1928
1964
  * Returns JSON array of features: [{type, atom_idx, neighbor_count}, ...]
@@ -1994,6 +2030,16 @@ export function pqr_to_json(text: string): string;
1994
2030
  */
1995
2031
  export function predict_pka_json(smiles: string): string;
1996
2032
 
2033
+ /**
2034
+ * Run deterministic SVG publication preflight for a SMILES string.
2035
+ *
2036
+ * Returns a JSON `PreflightReport` with stable diagnostic paths and a
2037
+ * deterministic input fingerprint. Font metrics are conservative estimates;
2038
+ * the final browser/renderer remains authoritative for pixel-level validation.
2039
+ * The input is capped at the same 1 MiB/10,000-atom limits as other WASM APIs.
2040
+ */
2041
+ export function preflight_smiles_json(smiles: string, width: number, height: number): string;
2042
+
1997
2043
  /**
1998
2044
  * Coordinates (Å) plus molecular charge/multiplicity from a QCSchema
1999
2045
  * `qcschema_molecule` document, in the SAME atom order
@@ -2099,6 +2145,38 @@ export function rdkit_ecfp_config_chiral_detail_json(mol: MolHandle, radius: num
2099
2145
  */
2100
2146
  export function rdkit_ecfp_config_detail_json(mol: MolHandle, radius: number, nbits: number): string;
2101
2147
 
2148
+ /**
2149
+ * Compute the RDKit-compatible Daylight-like path fingerprint as a bit-packed
2150
+ * byte vector (256 bytes = 2048 bits). This is the WASM counterpart of the
2151
+ * Python `path_fp` operation and is intentionally separate from native
2152
+ * `topo_path_bitvec`.
2153
+ */
2154
+ export function rdkit_path_bitvec(mol: MolHandle): Uint8Array;
2155
+
2156
+ /**
2157
+ * Compute the RDKit-compatible RDKFingerprint as a bit-packed byte vector
2158
+ * (256 bytes = 2048 bits). This is separate from both the native
2159
+ * `topo_path_bitvec` operation and the RDKit-compatible path operation.
2160
+ */
2161
+ export function rdkit_rdk_bitvec(mol: MolHandle): Uint8Array;
2162
+
2163
+ /**
2164
+ * Compute the opt-in RDKit-compatible hashed topological-torsion fingerprint
2165
+ * as a bit-packed byte vector (256 bytes = 2048 bits). This remains separate
2166
+ * from the native `torsion_bitvec` operation and its similarity semantics.
2167
+ */
2168
+ export function rdkit_torsion_bitvec(mol: MolHandle): Uint8Array;
2169
+
2170
+ /**
2171
+ * Check whether a reaction SMILES matches a reaction SMARTS query.
2172
+ *
2173
+ * The middle section of the query supports agent alternatives separated by
2174
+ * `|`. This source-level API remains bounded and returns a typed JS error for
2175
+ * invalid input; the generated Node artifact is updated separately when the
2176
+ * wasm-bindgen toolchain is available.
2177
+ */
2178
+ export function reaction_smarts_match(smarts: string, reaction_smiles: string): boolean;
2179
+
2102
2180
  /**
2103
2181
  * Return a copy of the molecule with all explicit hydrogen atoms removed.
2104
2182
  */
@@ -2222,6 +2300,16 @@ export function screen_smiles_json(smiles_batch: string, delimiter: string): str
2222
2300
  */
2223
2301
  export function sdf_from_records_json(smiles_json: string, names_json: string, props_json: string): string;
2224
2302
 
2303
+ /**
2304
+ * Return one deterministic, resumable SDF batch as a JSON manifest.
2305
+ *
2306
+ * `offset` is the zero-based input record to start at and `batch_size` is
2307
+ * bounded by [`crate::WASM_MAX_BATCH_ITEMS`]. Invalid records stay inline as
2308
+ * `status: "rejected"`; callers can stop requesting later batches to cancel
2309
+ * work without a background queue or hidden buffering.
2310
+ */
2311
+ export function sdf_records_batch_json(sdf: string, offset: number, batch_size: number): string;
2312
+
2225
2313
  /**
2226
2314
  * Parse an SDF string and return a JSON array of record objects.
2227
2315
  *
@@ -2530,11 +2618,25 @@ export function to_qcschema_molecule_json(mol: MolHandle, coords_json: string, c
2530
2618
  */
2531
2619
  export function to_xyz(mol: MolHandle): string;
2532
2620
 
2621
+ /**
2622
+ * Compute the native topological path fingerprint as a bit-packed byte vector
2623
+ * (256 bytes = 2048 bits), using the default [`chematic_fp::TopoPathConfig`].
2624
+ * This is the native `topo_path` operation, not the RDKit-compatible path
2625
+ * fingerprint exposed by the separate `path_fp` Python method.
2626
+ */
2627
+ export function topo_path_bitvec(mol: MolHandle): Uint8Array;
2628
+
2533
2629
  /**
2534
2630
  * Torsion fingerprint as a bit-packed byte vector (256 bytes = 2048 bits).
2535
2631
  */
2536
2632
  export function torsion_bitvec(mol: MolHandle): Uint8Array;
2537
2633
 
2634
+ /**
2635
+ * Validate a vendor-neutral NMR spectrum JSON document without parsing a
2636
+ * vendor-specific raw file or predicting peaks.
2637
+ */
2638
+ export function validate_nmr_spectrum_json(json: string): string;
2639
+
2538
2640
  /**
2539
2641
  * Virtual screen a query SMILES against a database of SMILES using ECFP4 Tanimoto.
2540
2642
  *
@@ -2652,6 +2754,12 @@ export function xlogp3_json(mol: MolHandle): string;
2652
2754
  */
2653
2755
  export function xlogp3_per_atom_json(mol: MolHandle): string;
2654
2756
 
2757
+ /**
2758
+ * Return one deterministic, resumable plain-XYZ batch as a JSON manifest.
2759
+ * Stopping before requesting the next offset is the cancellation boundary.
2760
+ */
2761
+ export function xyz_frames_batch_json(text: string, offset: number, batch_size: number): string;
2762
+
2655
2763
  export type InitInput = RequestInfo | URL | Response | BufferSource | WebAssembly.Module;
2656
2764
 
2657
2765
  export interface InitOutput {
@@ -2735,6 +2843,7 @@ export interface InitOutput {
2735
2843
  readonly erg_vec_json: (a: number) => [number, number];
2736
2844
  readonly estate_indices_json: (a: number) => [number, number];
2737
2845
  readonly extxyz_frame_json: (a: number, b: number) => [number, number, number, number];
2846
+ readonly extxyz_frames_batch_json: (a: number, b: number, c: number, d: number) => [number, number, number, number];
2738
2847
  readonly fcfp4_bitvec: (a: number) => [number, number];
2739
2848
  readonly fcfp6_bitvec: (a: number) => [number, number];
2740
2849
  readonly find_reaction_center_json: (a: number, b: number) => [number, number];
@@ -2801,6 +2910,7 @@ export interface InitOutput {
2801
2910
  readonly mol_block_from_smiles: (a: number, b: number) => [number, number, number, number];
2802
2911
  readonly mol_block_stereo_diagnostics_json: (a: number, b: number) => [number, number, number, number];
2803
2912
  readonly mol_from_cdxml: (a: number, b: number) => [number, number, number];
2913
+ readonly mol_from_cjson: (a: number, b: number) => [number, number, number];
2804
2914
  readonly mol_from_cml: (a: number, b: number) => [number, number, number];
2805
2915
  readonly mol_from_cube: (a: number, b: number) => [number, number, number];
2806
2916
  readonly mol_from_extxyz: (a: number, b: number) => [number, number, number];
@@ -2808,6 +2918,8 @@ export interface InitOutput {
2808
2918
  readonly mol_from_moljson: (a: number, b: number) => [number, number, number];
2809
2919
  readonly mol_from_orca_input: (a: number, b: number) => [number, number, number];
2810
2920
  readonly mol_from_pdb: (a: number, b: number) => number;
2921
+ readonly mol_from_pdb_strict: (a: number, b: number) => [number, number, number];
2922
+ readonly mol_from_pdbqt: (a: number, b: number) => [number, number, number];
2811
2923
  readonly mol_from_pqr: (a: number, b: number) => [number, number, number];
2812
2924
  readonly mol_from_qcschema_molecule: (a: number, b: number) => [number, number, number];
2813
2925
  readonly mol_from_sdf_block: (a: number, b: number) => [number, number, number];
@@ -2914,6 +3026,7 @@ export interface InitOutput {
2914
3026
  readonly parse_smiles: (a: number, b: number) => [number, number, number];
2915
3027
  readonly pdb_coords_json: (a: number, b: number) => [number, number];
2916
3028
  readonly peoe_vsa_json: (a: number) => [number, number];
3029
+ readonly periodic_structure_fingerprint_json: (a: number, b: number, c: number, d: number) => [number, number];
2917
3030
  readonly pharmacophore_features_json: (a: number) => [number, number];
2918
3031
  readonly pharmacophore_fp_2d_summary: (a: number) => [number, number];
2919
3032
  readonly pharmacophore_fp_3d_summary: (a: number) => [number, number];
@@ -2922,6 +3035,7 @@ export interface InitOutput {
2922
3035
  readonly pqr_infer_element: (a: number, b: number, c: number, d: number, e: number, f: number) => [number, number];
2923
3036
  readonly pqr_to_json: (a: number, b: number) => [number, number, number, number];
2924
3037
  readonly predict_pka_json: (a: number, b: number) => [number, number];
3038
+ readonly preflight_smiles_json: (a: number, b: number, c: number, d: number) => [number, number];
2925
3039
  readonly qcschema_molecule_coords_json: (a: number, b: number) => [number, number, number, number];
2926
3040
  readonly qcschema_validate_atomic_input: (a: number, b: number) => [number, number, number, number];
2927
3041
  readonly qcschema_validate_atomic_result: (a: number, b: number) => [number, number, number, number];
@@ -2932,6 +3046,10 @@ export interface InitOutput {
2932
3046
  readonly rdkit_ecfp_config_chiral_bitvec: (a: number, b: number, c: number) => [number, number, number, number];
2933
3047
  readonly rdkit_ecfp_config_chiral_detail_json: (a: number, b: number, c: number) => [number, number, number, number];
2934
3048
  readonly rdkit_ecfp_config_detail_json: (a: number, b: number, c: number) => [number, number, number, number];
3049
+ readonly rdkit_path_bitvec: (a: number) => [number, number];
3050
+ readonly rdkit_rdk_bitvec: (a: number) => [number, number];
3051
+ readonly rdkit_torsion_bitvec: (a: number) => [number, number];
3052
+ readonly reaction_smarts_match: (a: number, b: number, c: number, d: number) => [number, number, number];
2935
3053
  readonly remove_hydrogens: (a: number) => number;
2936
3054
  readonly retro_disconnect_json: (a: number, b: number, c: number, d: number) => [number, number, number, number];
2937
3055
  readonly rgroup_decompose_json: (a: number, b: number, c: number, d: number) => [number, number, number, number];
@@ -2942,6 +3060,7 @@ export interface InitOutput {
2942
3060
  readonly sa_score: (a: number) => number;
2943
3061
  readonly screen_smiles_json: (a: number, b: number, c: number, d: number) => [number, number];
2944
3062
  readonly sdf_from_records_json: (a: number, b: number, c: number, d: number, e: number, f: number) => [number, number, number, number];
3063
+ readonly sdf_records_batch_json: (a: number, b: number, c: number, d: number) => [number, number, number, number];
2945
3064
  readonly sdf_to_records_json: (a: number, b: number) => [number, number];
2946
3065
  readonly sdf_to_smiles_json: (a: number, b: number) => [number, number];
2947
3066
  readonly semantic_apply_json_command: (a: number, b: number, c: number, d: number) => [number, number, number, number];
@@ -2983,7 +3102,9 @@ export interface InitOutput {
2983
3102
  readonly to_moljson: (a: number) => [number, number];
2984
3103
  readonly to_qcschema_molecule_json: (a: number, b: number, c: number, d: number, e: bigint) => [number, number, number, number];
2985
3104
  readonly to_xyz: (a: number) => [number, number];
3105
+ readonly topo_path_bitvec: (a: number) => [number, number];
2986
3106
  readonly torsion_bitvec: (a: number) => [number, number];
3107
+ readonly validate_nmr_spectrum_json: (a: number, b: number) => [number, number];
2987
3108
  readonly virtual_screen_ecfp4_json: (a: number, b: number, c: number, d: number, e: number) => [number, number];
2988
3109
  readonly whim_descriptors_json: (a: number) => [number, number];
2989
3110
  readonly whim_getaway_combined_json: (a: number) => [number, number];
@@ -2999,6 +3120,7 @@ export interface InitOutput {
2999
3120
  readonly write_smiles: (a: number) => [number, number];
3000
3121
  readonly xlogp3_json: (a: number) => [number, number];
3001
3122
  readonly xlogp3_per_atom_json: (a: number) => [number, number];
3123
+ readonly xyz_frames_batch_json: (a: number, b: number, c: number, d: number) => [number, number, number, number];
3002
3124
  readonly __wbindgen_malloc: (a: number, b: number) => number;
3003
3125
  readonly __wbindgen_realloc: (a: number, b: number, c: number, d: number) => number;
3004
3126
  readonly __externref_table_alloc: () => number;
package/chematic_wasm.js CHANGED
@@ -2377,6 +2377,35 @@ export function extxyz_frame_json(text) {
2377
2377
  }
2378
2378
  }
2379
2379
 
2380
+ /**
2381
+ * Return one deterministic, resumable Extended-XYZ batch as a JSON manifest.
2382
+ * Stopping before requesting the next offset is the cancellation boundary.
2383
+ * @param {string} text
2384
+ * @param {number} offset
2385
+ * @param {number} batch_size
2386
+ * @returns {string}
2387
+ */
2388
+ export function extxyz_frames_batch_json(text, offset, batch_size) {
2389
+ let deferred3_0;
2390
+ let deferred3_1;
2391
+ try {
2392
+ const ptr0 = passStringToWasm0(text, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc);
2393
+ const len0 = WASM_VECTOR_LEN;
2394
+ const ret = wasm.extxyz_frames_batch_json(ptr0, len0, offset, batch_size);
2395
+ var ptr2 = ret[0];
2396
+ var len2 = ret[1];
2397
+ if (ret[3]) {
2398
+ ptr2 = 0; len2 = 0;
2399
+ throw takeFromExternrefTable0(ret[2]);
2400
+ }
2401
+ deferred3_0 = ptr2;
2402
+ deferred3_1 = len2;
2403
+ return getStringFromWasm0(ptr2, len2);
2404
+ } finally {
2405
+ wasm.__wbindgen_free(deferred3_0, deferred3_1, 1);
2406
+ }
2407
+ }
2408
+
2380
2409
  /**
2381
2410
  * FCFP4 (pharmacophore, radius-2) fingerprint as a bit-packed byte vector (256 bytes).
2382
2411
  * @param {MolHandle} mol
@@ -3551,7 +3580,7 @@ export function minimize_mmff94_lbfgs_json(mol, max_iter) {
3551
3580
  * `coords_json` — JSON array of `[x,y,z]` arrays (Å), one per atom.
3552
3581
  * `max_iter` — maximum iterations (0 = default 500).
3553
3582
  *
3554
- * Returns JSON: `{"coords":[[x,y,z],...], "energy":float, "iterations":int, "converged":bool, "sound":bool}`
3583
+ * Returns JSON: `{"coords":[[x,y,z],...], "energy":float, "iterations":int, "converged":bool, "sound":bool, "worst_bond_length":float}`
3555
3584
  * or `{"error":"<msg>"}` on failure. `sound` is all-finite coordinates and
3556
3585
  * no bond stretched past a sane covalent-bond length — independent of
3557
3586
  * `converged`, since steepest descent often reports `converged:false` on
@@ -3941,6 +3970,25 @@ export function mol_from_cdxml(cdxml) {
3941
3970
  return MolHandle.__wrap(ret[0]);
3942
3971
  }
3943
3972
 
3973
+ /**
3974
+ * Parse a ChemicalJSON (CJSON) string into a `MolHandle`.
3975
+ *
3976
+ * Coordinates and CJSON-specific metadata are intentionally not retained by
3977
+ * this topology handle; use `convert_common_format` when a serialized CJSON
3978
+ * round trip is required.
3979
+ * @param {string} json
3980
+ * @returns {MolHandle}
3981
+ */
3982
+ export function mol_from_cjson(json) {
3983
+ const ptr0 = passStringToWasm0(json, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc);
3984
+ const len0 = WASM_VECTOR_LEN;
3985
+ const ret = wasm.mol_from_cjson(ptr0, len0);
3986
+ if (ret[2]) {
3987
+ throw takeFromExternrefTable0(ret[1]);
3988
+ }
3989
+ return MolHandle.__wrap(ret[0]);
3990
+ }
3991
+
3944
3992
  /**
3945
3993
  * Parse a CML string into a `MolHandle`.
3946
3994
  *
@@ -4076,6 +4124,41 @@ export function mol_from_pdb(pdb) {
4076
4124
  return MolHandle.__wrap(ret);
4077
4125
  }
4078
4126
 
4127
+ /**
4128
+ * Strict PDB parser. Unlike [`mol_from_pdb`], malformed ATOM/HETATM fields
4129
+ * return an error instead of producing a partially recovered molecule.
4130
+ * @param {string} pdb
4131
+ * @returns {MolHandle}
4132
+ */
4133
+ export function mol_from_pdb_strict(pdb) {
4134
+ const ptr0 = passStringToWasm0(pdb, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc);
4135
+ const len0 = WASM_VECTOR_LEN;
4136
+ const ret = wasm.mol_from_pdb_strict(ptr0, len0);
4137
+ if (ret[2]) {
4138
+ throw takeFromExternrefTable0(ret[1]);
4139
+ }
4140
+ return MolHandle.__wrap(ret[0]);
4141
+ }
4142
+
4143
+ /**
4144
+ * Parse an AutoDock PDBQT block into a topology handle.
4145
+ *
4146
+ * Coordinates and partial charges are intentionally discarded, matching the
4147
+ * Python `from_pdbqt` binding; use the Rust parser when those arrays are
4148
+ * needed. Invalid records return a JS error instead of a partial molecule.
4149
+ * @param {string} pdbqt
4150
+ * @returns {MolHandle}
4151
+ */
4152
+ export function mol_from_pdbqt(pdbqt) {
4153
+ const ptr0 = passStringToWasm0(pdbqt, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc);
4154
+ const len0 = WASM_VECTOR_LEN;
4155
+ const ret = wasm.mol_from_pdbqt(ptr0, len0);
4156
+ if (ret[2]) {
4157
+ throw takeFromExternrefTable0(ret[1]);
4158
+ }
4159
+ return MolHandle.__wrap(ret[0]);
4160
+ }
4161
+
4079
4162
  /**
4080
4163
  * Parse a PQR file and return a `MolHandle` (topology only -- element
4081
4164
  * list inferred per-atom, no bonds; PQR carries no connectivity). Use
@@ -4800,6 +4883,30 @@ export function peoe_vsa_json(mol) {
4800
4883
  }
4801
4884
  }
4802
4885
 
4886
+ /**
4887
+ * Fingerprint a serialized `PeriodicStructure`; invalid or oversized input
4888
+ * returns a stable JSON error rather than being treated as a retrieval hit.
4889
+ * @param {string} json
4890
+ * @param {string} source
4891
+ * @returns {string}
4892
+ */
4893
+ export function periodic_structure_fingerprint_json(json, source) {
4894
+ let deferred3_0;
4895
+ let deferred3_1;
4896
+ try {
4897
+ const ptr0 = passStringToWasm0(json, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc);
4898
+ const len0 = WASM_VECTOR_LEN;
4899
+ const ptr1 = passStringToWasm0(source, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc);
4900
+ const len1 = WASM_VECTOR_LEN;
4901
+ const ret = wasm.periodic_structure_fingerprint_json(ptr0, len0, ptr1, len1);
4902
+ deferred3_0 = ret[0];
4903
+ deferred3_1 = ret[1];
4904
+ return getStringFromWasm0(ret[0], ret[1]);
4905
+ } finally {
4906
+ wasm.__wbindgen_free(deferred3_0, deferred3_1, 1);
4907
+ }
4908
+ }
4909
+
4803
4910
  /**
4804
4911
  * Detect pharmacophore features for virtual screening and lead optimization.
4805
4912
  * Returns JSON array of features: [{type, atom_idx, neighbor_count}, ...]
@@ -5006,6 +5113,33 @@ export function predict_pka_json(smiles) {
5006
5113
  }
5007
5114
  }
5008
5115
 
5116
+ /**
5117
+ * Run deterministic SVG publication preflight for a SMILES string.
5118
+ *
5119
+ * Returns a JSON `PreflightReport` with stable diagnostic paths and a
5120
+ * deterministic input fingerprint. Font metrics are conservative estimates;
5121
+ * the final browser/renderer remains authoritative for pixel-level validation.
5122
+ * The input is capped at the same 1 MiB/10,000-atom limits as other WASM APIs.
5123
+ * @param {string} smiles
5124
+ * @param {number} width
5125
+ * @param {number} height
5126
+ * @returns {string}
5127
+ */
5128
+ export function preflight_smiles_json(smiles, width, height) {
5129
+ let deferred2_0;
5130
+ let deferred2_1;
5131
+ try {
5132
+ const ptr0 = passStringToWasm0(smiles, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc);
5133
+ const len0 = WASM_VECTOR_LEN;
5134
+ const ret = wasm.preflight_smiles_json(ptr0, len0, width, height);
5135
+ deferred2_0 = ret[0];
5136
+ deferred2_1 = ret[1];
5137
+ return getStringFromWasm0(ret[0], ret[1]);
5138
+ } finally {
5139
+ wasm.__wbindgen_free(deferred2_0, deferred2_1, 1);
5140
+ }
5141
+ }
5142
+
5009
5143
  /**
5010
5144
  * Coordinates (Å) plus molecular charge/multiplicity from a QCSchema
5011
5145
  * `qcschema_molecule` document, in the SAME atom order
@@ -5298,6 +5432,75 @@ export function rdkit_ecfp_config_detail_json(mol, radius, nbits) {
5298
5432
  }
5299
5433
  }
5300
5434
 
5435
+ /**
5436
+ * Compute the RDKit-compatible Daylight-like path fingerprint as a bit-packed
5437
+ * byte vector (256 bytes = 2048 bits). This is the WASM counterpart of the
5438
+ * Python `path_fp` operation and is intentionally separate from native
5439
+ * `topo_path_bitvec`.
5440
+ * @param {MolHandle} mol
5441
+ * @returns {Uint8Array}
5442
+ */
5443
+ export function rdkit_path_bitvec(mol) {
5444
+ _assertClass(mol, MolHandle);
5445
+ const ret = wasm.rdkit_path_bitvec(mol.__wbg_ptr);
5446
+ var v1 = getArrayU8FromWasm0(ret[0], ret[1]).slice();
5447
+ wasm.__wbindgen_free(ret[0], ret[1] * 1, 1);
5448
+ return v1;
5449
+ }
5450
+
5451
+ /**
5452
+ * Compute the RDKit-compatible RDKFingerprint as a bit-packed byte vector
5453
+ * (256 bytes = 2048 bits). This is separate from both the native
5454
+ * `topo_path_bitvec` operation and the RDKit-compatible path operation.
5455
+ * @param {MolHandle} mol
5456
+ * @returns {Uint8Array}
5457
+ */
5458
+ export function rdkit_rdk_bitvec(mol) {
5459
+ _assertClass(mol, MolHandle);
5460
+ const ret = wasm.rdkit_rdk_bitvec(mol.__wbg_ptr);
5461
+ var v1 = getArrayU8FromWasm0(ret[0], ret[1]).slice();
5462
+ wasm.__wbindgen_free(ret[0], ret[1] * 1, 1);
5463
+ return v1;
5464
+ }
5465
+
5466
+ /**
5467
+ * Compute the opt-in RDKit-compatible hashed topological-torsion fingerprint
5468
+ * as a bit-packed byte vector (256 bytes = 2048 bits). This remains separate
5469
+ * from the native `torsion_bitvec` operation and its similarity semantics.
5470
+ * @param {MolHandle} mol
5471
+ * @returns {Uint8Array}
5472
+ */
5473
+ export function rdkit_torsion_bitvec(mol) {
5474
+ _assertClass(mol, MolHandle);
5475
+ const ret = wasm.rdkit_torsion_bitvec(mol.__wbg_ptr);
5476
+ var v1 = getArrayU8FromWasm0(ret[0], ret[1]).slice();
5477
+ wasm.__wbindgen_free(ret[0], ret[1] * 1, 1);
5478
+ return v1;
5479
+ }
5480
+
5481
+ /**
5482
+ * Check whether a reaction SMILES matches a reaction SMARTS query.
5483
+ *
5484
+ * The middle section of the query supports agent alternatives separated by
5485
+ * `|`. This source-level API remains bounded and returns a typed JS error for
5486
+ * invalid input; the generated Node artifact is updated separately when the
5487
+ * wasm-bindgen toolchain is available.
5488
+ * @param {string} smarts
5489
+ * @param {string} reaction_smiles
5490
+ * @returns {boolean}
5491
+ */
5492
+ export function reaction_smarts_match(smarts, reaction_smiles) {
5493
+ const ptr0 = passStringToWasm0(smarts, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc);
5494
+ const len0 = WASM_VECTOR_LEN;
5495
+ const ptr1 = passStringToWasm0(reaction_smiles, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc);
5496
+ const len1 = WASM_VECTOR_LEN;
5497
+ const ret = wasm.reaction_smarts_match(ptr0, len0, ptr1, len1);
5498
+ if (ret[2]) {
5499
+ throw takeFromExternrefTable0(ret[1]);
5500
+ }
5501
+ return ret[0] !== 0;
5502
+ }
5503
+
5301
5504
  /**
5302
5505
  * Return a copy of the molecule with all explicit hydrogen atoms removed.
5303
5506
  * @param {MolHandle} mol
@@ -5612,6 +5815,39 @@ export function sdf_from_records_json(smiles_json, names_json, props_json) {
5612
5815
  }
5613
5816
  }
5614
5817
 
5818
+ /**
5819
+ * Return one deterministic, resumable SDF batch as a JSON manifest.
5820
+ *
5821
+ * `offset` is the zero-based input record to start at and `batch_size` is
5822
+ * bounded by [`crate::WASM_MAX_BATCH_ITEMS`]. Invalid records stay inline as
5823
+ * `status: "rejected"`; callers can stop requesting later batches to cancel
5824
+ * work without a background queue or hidden buffering.
5825
+ * @param {string} sdf
5826
+ * @param {number} offset
5827
+ * @param {number} batch_size
5828
+ * @returns {string}
5829
+ */
5830
+ export function sdf_records_batch_json(sdf, offset, batch_size) {
5831
+ let deferred3_0;
5832
+ let deferred3_1;
5833
+ try {
5834
+ const ptr0 = passStringToWasm0(sdf, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc);
5835
+ const len0 = WASM_VECTOR_LEN;
5836
+ const ret = wasm.sdf_records_batch_json(ptr0, len0, offset, batch_size);
5837
+ var ptr2 = ret[0];
5838
+ var len2 = ret[1];
5839
+ if (ret[3]) {
5840
+ ptr2 = 0; len2 = 0;
5841
+ throw takeFromExternrefTable0(ret[2]);
5842
+ }
5843
+ deferred3_0 = ptr2;
5844
+ deferred3_1 = len2;
5845
+ return getStringFromWasm0(ptr2, len2);
5846
+ } finally {
5847
+ wasm.__wbindgen_free(deferred3_0, deferred3_1, 1);
5848
+ }
5849
+ }
5850
+
5615
5851
  /**
5616
5852
  * Parse an SDF string and return a JSON array of record objects.
5617
5853
  *
@@ -6568,6 +6804,22 @@ export function to_xyz(mol) {
6568
6804
  }
6569
6805
  }
6570
6806
 
6807
+ /**
6808
+ * Compute the native topological path fingerprint as a bit-packed byte vector
6809
+ * (256 bytes = 2048 bits), using the default [`chematic_fp::TopoPathConfig`].
6810
+ * This is the native `topo_path` operation, not the RDKit-compatible path
6811
+ * fingerprint exposed by the separate `path_fp` Python method.
6812
+ * @param {MolHandle} mol
6813
+ * @returns {Uint8Array}
6814
+ */
6815
+ export function topo_path_bitvec(mol) {
6816
+ _assertClass(mol, MolHandle);
6817
+ const ret = wasm.topo_path_bitvec(mol.__wbg_ptr);
6818
+ var v1 = getArrayU8FromWasm0(ret[0], ret[1]).slice();
6819
+ wasm.__wbindgen_free(ret[0], ret[1] * 1, 1);
6820
+ return v1;
6821
+ }
6822
+
6571
6823
  /**
6572
6824
  * Torsion fingerprint as a bit-packed byte vector (256 bytes = 2048 bits).
6573
6825
  * @param {MolHandle} mol
@@ -6581,6 +6833,27 @@ export function torsion_bitvec(mol) {
6581
6833
  return v1;
6582
6834
  }
6583
6835
 
6836
+ /**
6837
+ * Validate a vendor-neutral NMR spectrum JSON document without parsing a
6838
+ * vendor-specific raw file or predicting peaks.
6839
+ * @param {string} json
6840
+ * @returns {string}
6841
+ */
6842
+ export function validate_nmr_spectrum_json(json) {
6843
+ let deferred2_0;
6844
+ let deferred2_1;
6845
+ try {
6846
+ const ptr0 = passStringToWasm0(json, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc);
6847
+ const len0 = WASM_VECTOR_LEN;
6848
+ const ret = wasm.validate_nmr_spectrum_json(ptr0, len0);
6849
+ deferred2_0 = ret[0];
6850
+ deferred2_1 = ret[1];
6851
+ return getStringFromWasm0(ret[0], ret[1]);
6852
+ } finally {
6853
+ wasm.__wbindgen_free(deferred2_0, deferred2_1, 1);
6854
+ }
6855
+ }
6856
+
6584
6857
  /**
6585
6858
  * Virtual screen a query SMILES against a database of SMILES using ECFP4 Tanimoto.
6586
6859
  *
@@ -6984,6 +7257,35 @@ export function xlogp3_per_atom_json(mol) {
6984
7257
  wasm.__wbindgen_free(deferred1_0, deferred1_1, 1);
6985
7258
  }
6986
7259
  }
7260
+
7261
+ /**
7262
+ * Return one deterministic, resumable plain-XYZ batch as a JSON manifest.
7263
+ * Stopping before requesting the next offset is the cancellation boundary.
7264
+ * @param {string} text
7265
+ * @param {number} offset
7266
+ * @param {number} batch_size
7267
+ * @returns {string}
7268
+ */
7269
+ export function xyz_frames_batch_json(text, offset, batch_size) {
7270
+ let deferred3_0;
7271
+ let deferred3_1;
7272
+ try {
7273
+ const ptr0 = passStringToWasm0(text, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc);
7274
+ const len0 = WASM_VECTOR_LEN;
7275
+ const ret = wasm.xyz_frames_batch_json(ptr0, len0, offset, batch_size);
7276
+ var ptr2 = ret[0];
7277
+ var len2 = ret[1];
7278
+ if (ret[3]) {
7279
+ ptr2 = 0; len2 = 0;
7280
+ throw takeFromExternrefTable0(ret[2]);
7281
+ }
7282
+ deferred3_0 = ptr2;
7283
+ deferred3_1 = len2;
7284
+ return getStringFromWasm0(ptr2, len2);
7285
+ } finally {
7286
+ wasm.__wbindgen_free(deferred3_0, deferred3_1, 1);
7287
+ }
7288
+ }
6987
7289
  function __wbg_get_imports() {
6988
7290
  const import0 = {
6989
7291
  __proto__: null,
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.9",
8
+ "version": "1.0.11",
9
9
  "license": "MIT OR Apache-2.0",
10
10
  "repository": {
11
11
  "type": "git",