@teselagen/sequence-utils 0.3.31 → 0.3.32-beta.2

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/index.js CHANGED
@@ -2734,30 +2734,31 @@ function adjustRangeToDeletionOfAnotherRange(rangeToBeAdjusted, anotherRange, ma
2734
2734
  anotherRange,
2735
2735
  maxLength
2736
2736
  );
2737
- if (trimmedRange) {
2738
- const nonCircularDeletionRanges = splitRangeIntoTwoPartsIfItIsCircular(
2739
- anotherRange,
2740
- maxLength
2741
- );
2742
- nonCircularDeletionRanges.forEach(function(nonCircularDeletionRange) {
2743
- const deletionLength = nonCircularDeletionRange.end - nonCircularDeletionRange.start + 1;
2744
- if (trimmedRange.start > trimmedRange.end) {
2745
- if (nonCircularDeletionRange.start < trimmedRange.end) {
2746
- trimmedRange.start -= deletionLength;
2747
- trimmedRange.end -= deletionLength;
2748
- } else if (nonCircularDeletionRange.start < trimmedRange.start) {
2749
- trimmedRange.start -= deletionLength;
2750
- } else ;
2751
- } else {
2752
- if (nonCircularDeletionRange.start < trimmedRange.start) {
2753
- trimmedRange.start -= deletionLength;
2754
- trimmedRange.end -= deletionLength;
2755
- } else if (nonCircularDeletionRange.start < trimmedRange.end) {
2756
- trimmedRange.end -= deletionLength;
2757
- } else ;
2758
- }
2759
- });
2737
+ if (!trimmedRange) {
2738
+ return null;
2760
2739
  }
2740
+ const nonCircularDeletionRanges = splitRangeIntoTwoPartsIfItIsCircular(
2741
+ anotherRange,
2742
+ maxLength
2743
+ );
2744
+ nonCircularDeletionRanges.forEach(function(nonCircularDeletionRange) {
2745
+ const deletionLength = nonCircularDeletionRange.end - nonCircularDeletionRange.start + 1;
2746
+ if (trimmedRange.start > trimmedRange.end) {
2747
+ if (nonCircularDeletionRange.start < trimmedRange.end) {
2748
+ trimmedRange.start -= deletionLength;
2749
+ trimmedRange.end -= deletionLength;
2750
+ } else if (nonCircularDeletionRange.start < trimmedRange.start) {
2751
+ trimmedRange.start -= deletionLength;
2752
+ } else ;
2753
+ } else {
2754
+ if (nonCircularDeletionRange.start < trimmedRange.start) {
2755
+ trimmedRange.start -= deletionLength;
2756
+ trimmedRange.end -= deletionLength;
2757
+ } else if (nonCircularDeletionRange.start < trimmedRange.end) {
2758
+ trimmedRange.end -= deletionLength;
2759
+ } else ;
2760
+ }
2761
+ });
2761
2762
  return trimmedRange;
2762
2763
  }
2763
2764
  __name(adjustRangeToDeletionOfAnotherRange, "adjustRangeToDeletionOfAnotherRange");
@@ -3664,307 +3665,15 @@ const getFeatureToColorMap = /* @__PURE__ */ __name(({ includeHidden } = {}) =>
3664
3665
  const getFeatureTypes = /* @__PURE__ */ __name(({ includeHidden } = {}) => filter(getMergedFeatureMap(), (f) => includeHidden ? true : !f.isHidden).map(
3665
3666
  (f) => f.name
3666
3667
  ), "getFeatureTypes");
3667
- function getDefaultExportFromCjs(x) {
3668
- return x && x.__esModule && Object.prototype.hasOwnProperty.call(x, "default") ? x["default"] : x;
3669
- }
3670
- __name(getDefaultExportFromCjs, "getDefaultExportFromCjs");
3671
- var lib = { exports: {} };
3672
- var randomFromSeed;
3673
- var hasRequiredRandomFromSeed;
3674
- function requireRandomFromSeed() {
3675
- if (hasRequiredRandomFromSeed) return randomFromSeed;
3676
- hasRequiredRandomFromSeed = 1;
3677
- var seed = 1;
3678
- function getNextValue() {
3679
- seed = (seed * 9301 + 49297) % 233280;
3680
- return seed / 233280;
3681
- }
3682
- __name(getNextValue, "getNextValue");
3683
- function setSeed(_seed_) {
3684
- seed = _seed_;
3685
- }
3686
- __name(setSeed, "setSeed");
3687
- randomFromSeed = {
3688
- nextValue: getNextValue,
3689
- seed: setSeed
3690
- };
3691
- return randomFromSeed;
3692
- }
3693
- __name(requireRandomFromSeed, "requireRandomFromSeed");
3694
- var alphabet_1;
3695
- var hasRequiredAlphabet;
3696
- function requireAlphabet() {
3697
- if (hasRequiredAlphabet) return alphabet_1;
3698
- hasRequiredAlphabet = 1;
3699
- var randomFromSeed2 = requireRandomFromSeed();
3700
- var ORIGINAL = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ_-";
3701
- var alphabet;
3702
- var previousSeed;
3703
- var shuffled;
3704
- function reset() {
3705
- shuffled = false;
3706
- }
3707
- __name(reset, "reset");
3708
- function setCharacters(_alphabet_) {
3709
- if (!_alphabet_) {
3710
- if (alphabet !== ORIGINAL) {
3711
- alphabet = ORIGINAL;
3712
- reset();
3713
- }
3714
- return;
3715
- }
3716
- if (_alphabet_ === alphabet) {
3717
- return;
3718
- }
3719
- if (_alphabet_.length !== ORIGINAL.length) {
3720
- throw new Error("Custom alphabet for shortid must be " + ORIGINAL.length + " unique characters. You submitted " + _alphabet_.length + " characters: " + _alphabet_);
3721
- }
3722
- var unique = _alphabet_.split("").filter(function(item, ind, arr) {
3723
- return ind !== arr.lastIndexOf(item);
3724
- });
3725
- if (unique.length) {
3726
- throw new Error("Custom alphabet for shortid must be " + ORIGINAL.length + " unique characters. These characters were not unique: " + unique.join(", "));
3727
- }
3728
- alphabet = _alphabet_;
3729
- reset();
3730
- }
3731
- __name(setCharacters, "setCharacters");
3732
- function characters(_alphabet_) {
3733
- setCharacters(_alphabet_);
3734
- return alphabet;
3735
- }
3736
- __name(characters, "characters");
3737
- function setSeed(seed) {
3738
- randomFromSeed2.seed(seed);
3739
- if (previousSeed !== seed) {
3740
- reset();
3741
- previousSeed = seed;
3742
- }
3743
- }
3744
- __name(setSeed, "setSeed");
3745
- function shuffle() {
3746
- if (!alphabet) {
3747
- setCharacters(ORIGINAL);
3748
- }
3749
- var sourceArray = alphabet.split("");
3750
- var targetArray = [];
3751
- var r = randomFromSeed2.nextValue();
3752
- var characterIndex;
3753
- while (sourceArray.length > 0) {
3754
- r = randomFromSeed2.nextValue();
3755
- characterIndex = Math.floor(r * sourceArray.length);
3756
- targetArray.push(sourceArray.splice(characterIndex, 1)[0]);
3757
- }
3758
- return targetArray.join("");
3759
- }
3760
- __name(shuffle, "shuffle");
3761
- function getShuffled() {
3762
- if (shuffled) {
3763
- return shuffled;
3764
- }
3765
- shuffled = shuffle();
3766
- return shuffled;
3767
- }
3768
- __name(getShuffled, "getShuffled");
3769
- function lookup(index) {
3770
- var alphabetShuffled = getShuffled();
3771
- return alphabetShuffled[index];
3772
- }
3773
- __name(lookup, "lookup");
3774
- function get2() {
3775
- return alphabet || ORIGINAL;
3776
- }
3777
- __name(get2, "get");
3778
- alphabet_1 = {
3779
- get: get2,
3780
- characters,
3781
- seed: setSeed,
3782
- lookup,
3783
- shuffled: getShuffled
3784
- };
3785
- return alphabet_1;
3786
- }
3787
- __name(requireAlphabet, "requireAlphabet");
3788
- var randomByteBrowser;
3789
- var hasRequiredRandomByteBrowser;
3790
- function requireRandomByteBrowser() {
3791
- if (hasRequiredRandomByteBrowser) return randomByteBrowser;
3792
- hasRequiredRandomByteBrowser = 1;
3793
- var crypto = typeof window === "object" && (window.crypto || window.msCrypto);
3794
- var randomByte;
3795
- if (!crypto || !crypto.getRandomValues) {
3796
- randomByte = /* @__PURE__ */ __name(function(size) {
3797
- var bytes = [];
3798
- for (var i = 0; i < size; i++) {
3799
- bytes.push(Math.floor(Math.random() * 256));
3800
- }
3801
- return bytes;
3802
- }, "randomByte");
3803
- } else {
3804
- randomByte = /* @__PURE__ */ __name(function(size) {
3805
- return crypto.getRandomValues(new Uint8Array(size));
3806
- }, "randomByte");
3807
- }
3808
- randomByteBrowser = randomByte;
3809
- return randomByteBrowser;
3810
- }
3811
- __name(requireRandomByteBrowser, "requireRandomByteBrowser");
3812
- var format_browser;
3813
- var hasRequiredFormat_browser;
3814
- function requireFormat_browser() {
3815
- if (hasRequiredFormat_browser) return format_browser;
3816
- hasRequiredFormat_browser = 1;
3817
- format_browser = /* @__PURE__ */ __name(function(random, alphabet, size) {
3818
- var mask = (2 << Math.log(alphabet.length - 1) / Math.LN2) - 1;
3819
- var step = -~(1.6 * mask * size / alphabet.length);
3820
- var id = "";
3821
- while (true) {
3822
- var bytes = random(step);
3823
- var i = step;
3824
- while (i--) {
3825
- id += alphabet[bytes[i] & mask] || "";
3826
- if (id.length === +size) return id;
3827
- }
3828
- }
3829
- }, "format_browser");
3830
- return format_browser;
3831
- }
3832
- __name(requireFormat_browser, "requireFormat_browser");
3833
- var generate_1;
3834
- var hasRequiredGenerate;
3835
- function requireGenerate() {
3836
- if (hasRequiredGenerate) return generate_1;
3837
- hasRequiredGenerate = 1;
3838
- var alphabet = requireAlphabet();
3839
- var random = requireRandomByteBrowser();
3840
- var format = /* @__PURE__ */ requireFormat_browser();
3841
- function generate(number) {
3842
- var loopCounter = 0;
3843
- var done;
3844
- var str = "";
3845
- while (!done) {
3846
- str = str + format(random, alphabet.get(), 1);
3847
- done = number < Math.pow(16, loopCounter + 1);
3848
- loopCounter++;
3849
- }
3850
- return str;
3851
- }
3852
- __name(generate, "generate");
3853
- generate_1 = generate;
3854
- return generate_1;
3855
- }
3856
- __name(requireGenerate, "requireGenerate");
3857
- var build_1;
3858
- var hasRequiredBuild;
3859
- function requireBuild() {
3860
- if (hasRequiredBuild) return build_1;
3861
- hasRequiredBuild = 1;
3862
- var generate = requireGenerate();
3863
- requireAlphabet();
3864
- var REDUCE_TIME = 1567752802062;
3865
- var version = 7;
3866
- var counter;
3867
- var previousSeconds;
3868
- function build(clusterWorkerId) {
3869
- var str = "";
3870
- var seconds = Math.floor((Date.now() - REDUCE_TIME) * 1e-3);
3871
- if (seconds === previousSeconds) {
3872
- counter++;
3873
- } else {
3874
- counter = 0;
3875
- previousSeconds = seconds;
3876
- }
3877
- str = str + generate(version);
3878
- str = str + generate(clusterWorkerId);
3879
- if (counter > 0) {
3880
- str = str + generate(counter);
3881
- }
3882
- str = str + generate(seconds);
3883
- return str;
3884
- }
3885
- __name(build, "build");
3886
- build_1 = build;
3887
- return build_1;
3888
- }
3889
- __name(requireBuild, "requireBuild");
3890
- var isValid;
3891
- var hasRequiredIsValid;
3892
- function requireIsValid() {
3893
- if (hasRequiredIsValid) return isValid;
3894
- hasRequiredIsValid = 1;
3895
- var alphabet = requireAlphabet();
3896
- function isShortId(id) {
3897
- if (!id || typeof id !== "string" || id.length < 6) {
3898
- return false;
3899
- }
3900
- var nonAlphabetic = new RegExp("[^" + alphabet.get().replace(/[|\\{}()[\]^$+*?.-]/g, "\\$&") + "]");
3901
- return !nonAlphabetic.test(id);
3902
- }
3903
- __name(isShortId, "isShortId");
3904
- isValid = isShortId;
3905
- return isValid;
3906
- }
3907
- __name(requireIsValid, "requireIsValid");
3908
- var clusterWorkerIdBrowser;
3909
- var hasRequiredClusterWorkerIdBrowser;
3910
- function requireClusterWorkerIdBrowser() {
3911
- if (hasRequiredClusterWorkerIdBrowser) return clusterWorkerIdBrowser;
3912
- hasRequiredClusterWorkerIdBrowser = 1;
3913
- clusterWorkerIdBrowser = 0;
3914
- return clusterWorkerIdBrowser;
3915
- }
3916
- __name(requireClusterWorkerIdBrowser, "requireClusterWorkerIdBrowser");
3917
- var hasRequiredLib;
3918
- function requireLib() {
3919
- if (hasRequiredLib) return lib.exports;
3920
- hasRequiredLib = 1;
3921
- (function(module2) {
3922
- var alphabet = requireAlphabet();
3923
- var build = requireBuild();
3924
- var isValid2 = requireIsValid();
3925
- var clusterWorkerId = requireClusterWorkerIdBrowser() || 0;
3926
- function seed(seedValue) {
3927
- alphabet.seed(seedValue);
3928
- return module2.exports;
3929
- }
3930
- __name(seed, "seed");
3931
- function worker(workerId) {
3932
- clusterWorkerId = workerId;
3933
- return module2.exports;
3934
- }
3935
- __name(worker, "worker");
3936
- function characters(newCharacters) {
3937
- if (newCharacters !== void 0) {
3938
- alphabet.characters(newCharacters);
3939
- }
3940
- return alphabet.shuffled();
3941
- }
3942
- __name(characters, "characters");
3943
- function generate() {
3944
- return build(clusterWorkerId);
3945
- }
3946
- __name(generate, "generate");
3947
- module2.exports = generate;
3948
- module2.exports.generate = generate;
3949
- module2.exports.seed = seed;
3950
- module2.exports.worker = worker;
3951
- module2.exports.characters = characters;
3952
- module2.exports.isValid = isValid2;
3953
- })(lib);
3954
- return lib.exports;
3955
- }
3956
- __name(requireLib, "requireLib");
3957
- var shortid$1;
3958
- var hasRequiredShortid;
3959
- function requireShortid() {
3960
- if (hasRequiredShortid) return shortid$1;
3961
- hasRequiredShortid = 1;
3962
- shortid$1 = requireLib();
3963
- return shortid$1;
3964
- }
3965
- __name(requireShortid, "requireShortid");
3966
- var shortidExports = requireShortid();
3967
- const shortid = /* @__PURE__ */ getDefaultExportFromCjs(shortidExports);
3668
+ const urlAlphabet = "useandom-26T198340PX75pxJACKVERYMINDBUSHWOLF_GQZbfghjklqvwyzrict";
3669
+ let nanoid = /* @__PURE__ */ __name((size = 21) => {
3670
+ let id = "";
3671
+ let bytes = crypto.getRandomValues(new Uint8Array(size |= 0));
3672
+ while (size--) {
3673
+ id += urlAlphabet[bytes[size] & 63];
3674
+ }
3675
+ return id;
3676
+ }, "nanoid");
3968
3677
  function cutSequenceByRestrictionEnzyme(pSequence, circular, restrictionEnzyme) {
3969
3678
  if (restrictionEnzyme.forwardRegex.length === 0 || restrictionEnzyme.reverseRegex.length === 0) {
3970
3679
  const returnArray = [];
@@ -4172,7 +3881,7 @@ function cutSequence(forwardRegExpPattern, restrictionEnzyme, sequence, circular
4172
3881
  }
4173
3882
  const overhangBps = getSequenceWithinRange(cutRange, originalSequence);
4174
3883
  restrictionCutSite = {
4175
- id: shortid(),
3884
+ id: nanoid(),
4176
3885
  start,
4177
3886
  end,
4178
3887
  topSnipPosition,
@@ -4230,7 +3939,7 @@ function computeDigestFragments({
4230
3939
  });
4231
3940
  if (!circular && cutsites.length) {
4232
3941
  sortedCutsites.push({
4233
- id: "seqTerm_" + shortid(),
3942
+ id: "seqTerm_" + nanoid(),
4234
3943
  start: 0,
4235
3944
  end: 0,
4236
3945
  overhangBps: "",
@@ -4364,6 +4073,10 @@ function getDigestFragsForSeqAndEnzymes({
4364
4073
  });
4365
4074
  }
4366
4075
  __name(getDigestFragsForSeqAndEnzymes, "getDigestFragsForSeqAndEnzymes");
4076
+ function getDefaultExportFromCjs(x) {
4077
+ return x && x.__esModule && Object.prototype.hasOwnProperty.call(x, "default") ? x["default"] : x;
4078
+ }
4079
+ __name(getDefaultExportFromCjs, "getDefaultExportFromCjs");
4367
4080
  var jsondiffpatch_umd$1 = { exports: {} };
4368
4081
  var empty = {};
4369
4082
  var hasRequiredEmpty;
@@ -8962,10 +8675,10 @@ function tidyUpAnnotation(_annotation, {
8962
8675
  annotation.name = "Untitled annotation";
8963
8676
  }
8964
8677
  if (provideNewIdsForAnnotations) {
8965
- annotation.id = shortid();
8678
+ annotation.id = nanoid();
8966
8679
  }
8967
8680
  if (!annotation.id && annotation.id !== 0 && !doNotProvideIdsForAnnotations) {
8968
- annotation.id = shortid();
8681
+ annotation.id = nanoid();
8969
8682
  messages.push(
8970
8683
  "Unable to detect valid ID for annotation, setting ID to " + annotation.id
8971
8684
  );
@@ -9209,7 +8922,7 @@ function tidyUpSequenceData(pSeqData, options = {}) {
9209
8922
  if (item.id || item.id === 0) {
9210
8923
  itemId = item.id;
9211
8924
  } else {
9212
- itemId = shortid();
8925
+ itemId = nanoid();
9213
8926
  if (!doNotProvideIdsForAnnotations) {
9214
8927
  item.id = itemId;
9215
8928
  }
@@ -9512,6 +9225,36 @@ function insertGapsIntoRefSeq(refSeq, seqReads) {
9512
9225
  return refSeqWithGaps.join("");
9513
9226
  }
9514
9227
  __name(insertGapsIntoRefSeq, "insertGapsIntoRefSeq");
9228
+ function findApproxMatches(searchSeq, targetSeq, maxMismatches, circular = false) {
9229
+ const matches = [];
9230
+ const lenA = searchSeq.length;
9231
+ const lenB = targetSeq.length;
9232
+ const targetSeqExtended = circular ? targetSeq + targetSeq.slice(0, lenA - 1) : targetSeq;
9233
+ const limit = circular ? lenB : lenB - lenA + 1;
9234
+ for (let i = 0; i < limit; i++) {
9235
+ const window2 = targetSeqExtended.slice(i, i + lenA);
9236
+ let mismatchCount = 0;
9237
+ const mismatchPositions = [];
9238
+ for (let j = 0; j < lenA; j++) {
9239
+ if (searchSeq[j] !== window2[j]) {
9240
+ mismatchPositions.push(j);
9241
+ mismatchCount++;
9242
+ if (mismatchCount > maxMismatches) break;
9243
+ }
9244
+ }
9245
+ if (mismatchCount <= maxMismatches) {
9246
+ matches.push({
9247
+ index: i,
9248
+ match: window2,
9249
+ mismatchPositions,
9250
+ numMismatches: mismatchPositions.length
9251
+ // Keep for backwards compatibility
9252
+ });
9253
+ }
9254
+ }
9255
+ return matches;
9256
+ }
9257
+ __name(findApproxMatches, "findApproxMatches");
9515
9258
  var spliceString$1;
9516
9259
  var hasRequiredSpliceString;
9517
9260
  function requireSpliceString() {
@@ -17749,7 +17492,7 @@ function generateAnnotation(start, end, maxLength) {
17749
17492
  return __spreadProps(__spreadValues({}, range), {
17750
17493
  name: getRandomInt(0, 1e5).toString(),
17751
17494
  type: "misc_feature",
17752
- id: shortid(),
17495
+ id: nanoid(),
17753
17496
  forward: Math.random() > 0.5,
17754
17497
  notes: {}
17755
17498
  });
@@ -17872,7 +17615,7 @@ function getOrfsFromSequence(options) {
17872
17615
  forward,
17873
17616
  annotationTypePlural: "orfs",
17874
17617
  isOrf: true,
17875
- id: shortid()
17618
+ id: nanoid()
17876
17619
  });
17877
17620
  }
17878
17621
  }
@@ -19321,6 +19064,7 @@ export {
19321
19064
  featureColors,
19322
19065
  filterRnaString,
19323
19066
  filterSequenceString,
19067
+ findApproxMatches,
19324
19068
  findNearestRangeOfSequenceOverlapToPosition,
19325
19069
  findOrfsInPlasmid,
19326
19070
  findSequenceMatches,