tiny-essentials
Version:
Collection of small, essential scripts designed to be used across various projects. These simple utilities are crafted for speed, ease of use, and versatility.
1 lines • 2.54 kB
JavaScript
(()=>{"use strict";const e={d:(t,r)=>{if(Array.isArray(r))for(var s=0;s<r.length;){var i=r[s++],o=r[s++];e.o(t,i)?0===o&&s++:0===o?Object.defineProperty(t,i,{enumerable:!0,value:r[s++]}):Object.defineProperty(t,i,{enumerable:!0,get:o})}else for(var i in r)e.o(r,i)&&!e.o(t,i)&&Object.defineProperty(t,i,{enumerable:!0,get:r[i]})},o:(e,t)=>Object.prototype.hasOwnProperty.call(e,t)};let t={};e.d(t,{TinyTextDiffer:()=>r});const r=class{#e=[];#t=!1;get history(){return[...this.#e]}set history(e){if(!Array.isArray(e))throw new TypeError("History data must be provided as an array.");if(!e.every(e=>"string"==typeof e))throw new TypeError("All items in the history array must be strings.");this.#e=[...e]}get size(){return this.#e.length}constructor(e=[]){this.history=e}#r(){if(this.#t)throw new Error("Cannot perform operations on a destroyed TinyTextDiffer instance.")}#s(e){if("number"!=typeof e)throw new TypeError("The provided index must be a valid number.")}#i(e){if("string"!=typeof e)throw new TypeError("The provided text must be a valid string.")}get(e){if(this.#r(),this.#s(e),void 0===this.#e[e])throw new Error(`No text version found at index ${e}.`);return this.#e[e]}has(e){return this.#r(),this.#s(e),void 0!==this.#e[e]}add(e){this.#r(),this.#i(e),this.#e.push(e)}remove(){return this.#r(),this.#e.pop()}addAt(e,t){this.#r(),this.#s(e),this.#i(t),this.#e.splice(e,0,t)}removeAt(e){this.#r(),this.#s(e);const t=this.#e.length;return this.#e.splice(e,1),t!==this.#e.length}clear(){this.#r(),this.#e=[]}compare(...e){this.#r();const t=e.length;if(0===t||t%2!=0)throw new Error("The compare method requires an even number of indices to form comparison pairs.");const r=[];for(let s=0;s<t;s+=2){const i=s+1;if(i>t-1)continue;this.#s(e[s]),this.#s(e[i]);const o=this.#e[e[s]],h=this.#e[e[i]];r.push(this._computeDiff(o,h))}return r}_computeDiff(e,t){const r=e.length,s=t.length,i=Array(r+1).fill(null).map(()=>Array(s+1).fill(0));let o=1,h=1;for(o=1;o<=r;o++)for(h=1;h<=s;h++)e[o-1]===t[h-1]?i[o][h]=i[o-1][h-1]+1:i[o][h]=Math.max(i[o-1][h],i[o][h-1]);o=r,h=s;const n=[];for(;o>0||h>0;)o>0&&h>0&&e[o-1]===t[h-1]?(n.unshift({value:e[o-1],type:"normal"}),o--,h--):h>0&&(0===o||i[o][h-1]>=i[o-1][h])?(n.unshift({value:t[h-1],type:"added"}),h--):o>0&&(0===h||i[o][h-1]<i[o-1][h])&&(n.unshift({value:e[o-1],type:"deleted"}),o--);return n.reduce((e,t)=>{const r=e.length-1;return e.length>0&&e[r].type===t.type?e[r].value+=t.value:e.push(t),e},[])}destroy(){this.#t||(this.#e=[],this.#t=!0)}};window.TinyTextDiffer=t.TinyTextDiffer})();