A javascript text differencing implementation.

Overview

jsdiff

Build Status Sauce Test Status

A javascript text differencing implementation.

Based on the algorithm proposed in "An O(ND) Difference Algorithm and its Variations" (Myers, 1986).

Installation

npm install diff --save

API

  • Diff.diffChars(oldStr, newStr[, options]) - diffs two blocks of text, comparing character by character.

    Returns a list of change objects (See below).

    Options

    • ignoreCase: true to ignore casing difference. Defaults to false.
  • Diff.diffWords(oldStr, newStr[, options]) - diffs two blocks of text, comparing word by word, ignoring whitespace.

    Returns a list of change objects (See below).

    Options

    • ignoreCase: Same as in diffChars.
  • Diff.diffWordsWithSpace(oldStr, newStr[, options]) - diffs two blocks of text, comparing word by word, treating whitespace as significant.

    Returns a list of change objects (See below).

  • Diff.diffLines(oldStr, newStr[, options]) - diffs two blocks of text, comparing line by line.

    Options

    • ignoreWhitespace: true to ignore leading and trailing whitespace. This is the same as diffTrimmedLines
    • newlineIsToken: true to treat newline characters as separate tokens. This allows for changes to the newline structure to occur independently of the line content and to be treated as such. In general this is the more human friendly form of diffLines and diffLines is better suited for patches and other computer friendly output.

    Returns a list of change objects (See below).

  • Diff.diffTrimmedLines(oldStr, newStr[, options]) - diffs two blocks of text, comparing line by line, ignoring leading and trailing whitespace.

    Returns a list of change objects (See below).

  • Diff.diffSentences(oldStr, newStr[, options]) - diffs two blocks of text, comparing sentence by sentence.

    Returns a list of change objects (See below).

  • Diff.diffCss(oldStr, newStr[, options]) - diffs two blocks of text, comparing CSS tokens.

    Returns a list of change objects (See below).

  • Diff.diffJson(oldObj, newObj[, options]) - diffs two JSON objects, comparing the fields defined on each. The order of fields, etc does not matter in this comparison.

    Returns a list of change objects (See below).

  • Diff.diffArrays(oldArr, newArr[, options]) - diffs two arrays, comparing each item for strict equality (===).

    Options

    • comparator: function(left, right) for custom equality checks

    Returns a list of change objects (See below).

  • Diff.createTwoFilesPatch(oldFileName, newFileName, oldStr, newStr, oldHeader, newHeader) - creates a unified diff patch.

    Parameters:

    • oldFileName : String to be output in the filename section of the patch for the removals
    • newFileName : String to be output in the filename section of the patch for the additions
    • oldStr : Original string value
    • newStr : New string value
    • oldHeader : Additional information to include in the old file header
    • newHeader : Additional information to include in the new file header
    • options : An object with options. Currently, only context is supported and describes how many lines of context should be included.
  • Diff.createPatch(fileName, oldStr, newStr, oldHeader, newHeader) - creates a unified diff patch.

    Just like Diff.createTwoFilesPatch, but with oldFileName being equal to newFileName.

  • Diff.structuredPatch(oldFileName, newFileName, oldStr, newStr, oldHeader, newHeader, options) - returns an object with an array of hunk objects.

    This method is similar to createTwoFilesPatch, but returns a data structure suitable for further processing. Parameters are the same as createTwoFilesPatch. The data structure returned may look like this:

    {
      oldFileName: 'oldfile', newFileName: 'newfile',
      oldHeader: 'header1', newHeader: 'header2',
      hunks: [{
        oldStart: 1, oldLines: 3, newStart: 1, newLines: 3,
        lines: [' line2', ' line3', '-line4', '+line5', '\\ No newline at end of file'],
      }]
    }
  • Diff.applyPatch(source, patch[, options]) - applies a unified diff patch.

    Return a string containing new version of provided data. patch may be a string diff or the output from the parsePatch or structuredPatch methods.

    The optional options object may have the following keys:

    • fuzzFactor: Number of lines that are allowed to differ before rejecting a patch. Defaults to 0.
    • compareLine(lineNumber, line, operation, patchContent): Callback used to compare to given lines to determine if they should be considered equal when patching. Defaults to strict equality but may be overridden to provide fuzzier comparison. Should return false if the lines should be rejected.
  • Diff.applyPatches(patch, options) - applies one or more patches.

    This method will iterate over the contents of the patch and apply to data provided through callbacks. The general flow for each patch index is:

    • options.loadFile(index, callback) is called. The caller should then load the contents of the file and then pass that to the callback(err, data) callback. Passing an err will terminate further patch execution.
    • options.patched(index, content, callback) is called once the patch has been applied. content will be the return value from applyPatch. When it's ready, the caller should call callback(err) callback. Passing an err will terminate further patch execution.

    Once all patches have been applied or an error occurs, the options.complete(err) callback is made.

  • Diff.parsePatch(diffStr) - Parses a patch into structured data

    Return a JSON object representation of the a patch, suitable for use with the applyPatch method. This parses to the same structure returned by Diff.structuredPatch.

  • convertChangesToXML(changes) - converts a list of changes to a serialized XML format

All methods above which accept the optional callback method will run in sync mode when that parameter is omitted and in async mode when supplied. This allows for larger diffs without blocking the event loop. This may be passed either directly as the final parameter or as the callback field in the options object.

Change Objects

Many of the methods above return change objects. These objects consist of the following fields:

  • value: Text content
  • added: True if the value was inserted into the new string
  • removed: True if the value was removed from the old string

Note that some cases may omit a particular flag field. Comparison on the flag fields should always be done in a truthy or falsy manner.

Examples

Basic example in Node

require('colors');
const Diff = require('diff');

const one = 'beep boop';
const other = 'beep boob blah';

const diff = Diff.diffChars(one, other);

diff.forEach((part) => {
  // green for additions, red for deletions
  // grey for common parts
  const color = part.added ? 'green' :
    part.removed ? 'red' : 'grey';
  process.stderr.write(part.value[color]);
});

console.log();

Running the above program should yield

Node Example

Basic example in a web page

<pre id="display"></pre>
<script src="diff.js"></script>
<script>
const one = 'beep boop',
    other = 'beep boob blah',
    color = '';
    
let span = null;

const diff = Diff.diffChars(one, other),
    display = document.getElementById('display'),
    fragment = document.createDocumentFragment();

diff.forEach((part) => {
  // green for additions, red for deletions
  // grey for common parts
  const color = part.added ? 'green' :
    part.removed ? 'red' : 'grey';
  span = document.createElement('span');
  span.style.color = color;
  span.appendChild(document
    .createTextNode(part.value));
  fragment.appendChild(span);
});

display.appendChild(fragment);
</script>

Open the above .html file in a browser and you should see

Node Example

Full online demo

Compatibility

Sauce Test Status

jsdiff supports all ES3 environments with some known issues on IE8 and below. Under these browsers some diff algorithms such as word diff and others may fail due to lack of support for capturing groups in the split operation.

License

See LICENSE.

Comments
  • [Regression] Bad merge when adding new files

    [Regression] Bad merge when adding new files

    When adding a new file, first line of new file is removed from file beggining and added at the end of the new file, corrupting data. This works correctly with diff 3.0.1, so it got broken in some moment after that.

    opened by piranna 16
  • Adding Diff Trimmed Lines

    Adding Diff Trimmed Lines

    I extended the LineDiff.tokenize function to add the ability to ignore leading and trailing spaces when using TrimmedLineDiff, and added diffTrimmedLines to the public-facing functions. My changes should not affect any previous functionality.

    opened by JamesGould123 11
  • `applyPatches` should fail if can't apply a patch

    `applyPatches` should fail if can't apply a patch

    On applyPatches, if a patch can't be applied it's just notified to the user. This should call inmediatly to completed() and raise the full application of patches as a failure.

    opened by piranna 8
  • word tokenizer works only for 7 bit ascii

    word tokenizer works only for 7 bit ascii

    the word tokenizer for WordDiff and WordWithSpaceDiff uses \b in its regular expression. that considers word characters as [a-zA-Z0-9_], which fails on anything beyond 7 bit.

    f.e. the german phrase "wir üben" splits to:

    'wir üben'.split(/\b/);
    -> ["wir", " ü", "ben"]
    

    replacing the tokenizer with value.split(/(\s+)/) is sufficient in my use-case, but i don't have newlines in my text. some further testing needed, i think.

    further reading: http://stackoverflow.com/questions/10590098/javascript-regexp-word-boundaries-unicode-characters/10590620#10590620

    opened by plasmagunman 8
  • Flip added and removed order?

    Flip added and removed order?

    I'm wondering if it would make sense to flip the order in which added vs removed change objects get returned diffLines. This would make it easier to make a "git-like" diff without having to swap the added and removed semantics.

    This is what I'm doing right now for Vaccine:

    var chunks = jsdiff.diffLines(next, old).map(function(d) {
      if (d.removed) {
        return '<span class="added">' + prepend(d.value, '+') + '</span>';
      } else if (d.added) {
        return '<span class="removed">' + prepend(d.value, '-') + '</span>';
      } else {
        return prepend(d.value, ' ');
      }
    });
    return chunks.join('\n');
    
    opened by jacobsandlund 8
  • Support multiple diff hunks

    Support multiple diff hunks

    The method applyPatch() seems only support the first diff hunks, that don't allow to use it when a patch file has several chunks or chunks for several files. First case would be easy to do, just only continue for the next one. For the several files case it would be harder, but how could it be done, specially when you don't know the exact files that need to be patched? Maybe a hash object with the string content of the files, being the paths the key?

    opened by piranna 7
  • Implemented diffJson

    Implemented diffJson

    It takes two objects, serializes them as canonical JSON, then does a line-based diff that ignores differences in trailing commas.

    See discussion here: https://github.com/visionmedia/mocha/pull/1182

    opened by papandreou 7
  • React Native TransformError

    React Native TransformError

    Steps to reproduce,

    1. Create a React Native project.
    react-native init test_diff
    cd test_diff
    npm install --save diff
    
    1. Modify index.ios.js file, and add the following line.
    import {diffChars} from "diff";
    
    1. Now run the React Native packager.
    react-native run-ios
    
    1. Error shows up. See attached.
    screen shot 2017-01-25 at 4 56 50 pm
    opened by vincentma 6
  • diffJson with dates, returns empty curly braces

    diffJson with dates, returns empty curly braces

    Example:

    var after = {
      "fingerprint" : "string1",
      "valid_to" : new Date("2016-08-14T23:59:59Z"),
      "valid_from" : new Date("2016-02-12T00:00:00Z")
    };
    
    var before = {
      "fingerprint" : "string 2",
      "valid_from" : new Date("2016-02-12T00:00:00Z"),
      "valid_to" : new Date("2016-02-20T03:58:53Z")
    };
    
    JsDiff.diffJson(before, after);
    

    Result:

    [
      {
        "count": 1,
        "value": "{\n"
      },
      {
        "count": 1,
        "removed": true,
        "value": "  \"fingerprint\": \"string 2\",\n"
      },
      {
        "count": 1,
        "added": true,
        "value": "  \"fingerprint\": \"string1\",\n"
      },
      {
        "count": 3,
        "value": "  \"valid_from\": {},\n  \"valid_to\": {}\n}"
      }
    ]
    

    Expected result:

    [
      {
        "count": 1,
        "value": "{\n"
      },
      {
        "count": 1,
        "removed": true,
        "value": "  \"fingerprint\": \"string 2\",\n"
      },
      {
        "count": 2,
        "added": true,
        "value": "  \"fingerprint\": \"string 1\",\n  \"valid_to\": \"2016-11-20T03:58:53.000Z\",\n"
      },
      {
        "count": 1,
        "value": "  \"valid_from\": \"2015-11-20T01:36:42.000Z\",\n"
      },
      {
        "count": 1,
        "removed": true,
        "value": "  \"valid_to\": \"2016-02-14T03:58:53.000Z\"\n"
      },
      {
        "count": 1,
        "value": "}"
      }
    ]
    
    opened by dr-dimitru 6
  • Not built (no dist/ dir) using bower

    Not built (no dist/ dir) using bower

    Should the library build itself on install? Currently the 'build' grunt task dies not sppear to be run, and there is no bower.json

    I'm sure it worked yesterday.

    opened by leegee 6
  • Long diff

    Long diff

    If there are so many diffs between two texts, this loop works so slow that the operating system thinks that it fails, so after a while stops it at all.

    It is a variant to show not all diffs, but only a part of them. For example, with the help of some option we could set the maximum amount of diffs.

    opened by eGavr 6
  • Bump express from 4.17.1 to 4.18.2

    Bump express from 4.17.1 to 4.18.2

    Bumps express from 4.17.1 to 4.18.2.

    Release notes

    Sourced from express's releases.

    4.18.2

    4.18.1

    • Fix hanging on large stack of sync routes

    4.18.0

    ... (truncated)

    Changelog

    Sourced from express's changelog.

    4.18.2 / 2022-10-08

    4.18.1 / 2022-04-29

    • Fix hanging on large stack of sync routes

    4.18.0 / 2022-04-25

    ... (truncated)

    Commits

    Dependabot compatibility score

    Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting @dependabot rebase.


    Dependabot commands and options

    You can trigger Dependabot actions by commenting on this PR:

    • @dependabot rebase will rebase this PR
    • @dependabot recreate will recreate this PR, overwriting any edits that have been made to it
    • @dependabot merge will merge this PR after your CI passes on it
    • @dependabot squash and merge will squash and merge this PR after your CI passes on it
    • @dependabot cancel merge will cancel a previously requested merge and block automerging
    • @dependabot reopen will reopen this PR if it is closed
    • @dependabot close will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually
    • @dependabot ignore this major version will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this minor version will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this dependency will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
    • @dependabot use these labels will set the current labels as the default for future PRs for this repo and language
    • @dependabot use these reviewers will set the current reviewers as the default for future PRs for this repo and language
    • @dependabot use these assignees will set the current assignees as the default for future PRs for this repo and language
    • @dependabot use this milestone will set the current milestone as the default for future PRs for this repo and language

    You can disable automated security fix PRs for this repo from the Security Alerts page.

    dependencies 
    opened by dependabot[bot] 0
  • Bump decode-uri-component from 0.2.0 to 0.2.2

    Bump decode-uri-component from 0.2.0 to 0.2.2

    Bumps decode-uri-component from 0.2.0 to 0.2.2.

    Release notes

    Sourced from decode-uri-component's releases.

    v0.2.2

    • Prevent overwriting previously decoded tokens 980e0bf

    https://github.com/SamVerschueren/decode-uri-component/compare/v0.2.1...v0.2.2

    v0.2.1

    • Switch to GitHub workflows 76abc93
    • Fix issue where decode throws - fixes #6 746ca5d
    • Update license (#1) 486d7e2
    • Tidelift tasks a650457
    • Meta tweaks 66e1c28

    https://github.com/SamVerschueren/decode-uri-component/compare/v0.2.0...v0.2.1

    Commits

    Dependabot compatibility score

    Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting @dependabot rebase.


    Dependabot commands and options

    You can trigger Dependabot actions by commenting on this PR:

    • @dependabot rebase will rebase this PR
    • @dependabot recreate will recreate this PR, overwriting any edits that have been made to it
    • @dependabot merge will merge this PR after your CI passes on it
    • @dependabot squash and merge will squash and merge this PR after your CI passes on it
    • @dependabot cancel merge will cancel a previously requested merge and block automerging
    • @dependabot reopen will reopen this PR if it is closed
    • @dependabot close will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually
    • @dependabot ignore this major version will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this minor version will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this dependency will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
    • @dependabot use these labels will set the current labels as the default for future PRs for this repo and language
    • @dependabot use these reviewers will set the current reviewers as the default for future PRs for this repo and language
    • @dependabot use these assignees will set the current assignees as the default for future PRs for this repo and language
    • @dependabot use this milestone will set the current milestone as the default for future PRs for this repo and language

    You can disable automated security fix PRs for this repo from the Security Alerts page.

    dependencies 
    opened by dependabot[bot] 0
  • Bump engine.io from 3.6.0 to 3.6.1

    Bump engine.io from 3.6.0 to 3.6.1

    Bumps engine.io from 3.6.0 to 3.6.1.

    Release notes

    Sourced from engine.io's releases.

    3.6.1

    :warning: This release contains an important security fix :warning:

    A malicious client could send a specially crafted HTTP request, triggering an uncaught exception and killing the Node.js process:

    Error: read ECONNRESET
        at TCP.onStreamRead (internal/stream_base_commons.js:209:20)
    Emitted 'error' event on Socket instance at:
        at emitErrorNT (internal/streams/destroy.js:106:8)
        at emitErrorCloseNT (internal/streams/destroy.js:74:3)
        at processTicksAndRejections (internal/process/task_queues.js:80:21) {
      errno: -104,
      code: 'ECONNRESET',
      syscall: 'read'
    }
    

    Please upgrade as soon as possible.

    Bug Fixes

    • catch errors when destroying invalid upgrades (83c4071)
    Changelog

    Sourced from engine.io's changelog.

    3.6.1 (2022-11-20)

    :warning: This release contains an important security fix :warning:

    A malicious client could send a specially crafted HTTP request, triggering an uncaught exception and killing the Node.js process:

    Error: read ECONNRESET
        at TCP.onStreamRead (internal/stream_base_commons.js:209:20)
    Emitted 'error' event on Socket instance at:
        at emitErrorNT (internal/streams/destroy.js:106:8)
        at emitErrorCloseNT (internal/streams/destroy.js:74:3)
        at processTicksAndRejections (internal/process/task_queues.js:80:21) {
      errno: -104,
      code: 'ECONNRESET',
      syscall: 'read'
    }
    

    Please upgrade as soon as possible.

    Bug Fixes

    • catch errors when destroying invalid upgrades (83c4071)

    6.2.1 (2022-11-20)

    :warning: This release contains an important security fix :warning:

    A malicious client could send a specially crafted HTTP request, triggering an uncaught exception and killing the Node.js process:

    Error: read ECONNRESET
        at TCP.onStreamRead (internal/stream_base_commons.js:209:20)
    Emitted 'error' event on Socket instance at:
        at emitErrorNT (internal/streams/destroy.js:106:8)
        at emitErrorCloseNT (internal/streams/destroy.js:74:3)
        at processTicksAndRejections (internal/process/task_queues.js:80:21) {
      errno: -104,
      code: 'ECONNRESET',
      syscall: 'read'
    }
    

    Please upgrade as soon as possible.

    Bug Fixes

    ... (truncated)

    Commits

    Dependabot compatibility score

    Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting @dependabot rebase.


    Dependabot commands and options

    You can trigger Dependabot actions by commenting on this PR:

    • @dependabot rebase will rebase this PR
    • @dependabot recreate will recreate this PR, overwriting any edits that have been made to it
    • @dependabot merge will merge this PR after your CI passes on it
    • @dependabot squash and merge will squash and merge this PR after your CI passes on it
    • @dependabot cancel merge will cancel a previously requested merge and block automerging
    • @dependabot reopen will reopen this PR if it is closed
    • @dependabot close will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually
    • @dependabot ignore this major version will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this minor version will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this dependency will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
    • @dependabot use these labels will set the current labels as the default for future PRs for this repo and language
    • @dependabot use these reviewers will set the current reviewers as the default for future PRs for this repo and language
    • @dependabot use these assignees will set the current assignees as the default for future PRs for this repo and language
    • @dependabot use this milestone will set the current milestone as the default for future PRs for this repo and language

    You can disable automated security fix PRs for this repo from the Security Alerts page.

    dependencies 
    opened by dependabot[bot] 0
  • [question] Is it possible to preserve the whitespace when using `ignoreWhitespace` ? It breaks the formatting

    [question] Is it possible to preserve the whitespace when using `ignoreWhitespace` ? It breaks the formatting

    Hello and thanks!

    In my situation, I want to compare by ignoring the whitespace, however the documents format should not be broken

    image

    becomes with ignoreWhitespace:true

    image

    opened by dgtlmoon 0
  • JSDiff treats HTML content as a single line if there is no EOL at each line

    JSDiff treats HTML content as a single line if there is no EOL at each line

    I have entered HTML content as input (test, dent, den as example in the image), but it seems like treating it as a single line. Is there a way I can treat it as different lines? Since it treats it like a single line, all the content will be sent as diff instead of getting only the changeset. Any help will be appreciated. image

    image

    opened by srth12 3
  • Line diff apply giving extra line in the end when source is empty string

    Line diff apply giving extra line in the end when source is empty string

    Case 1: When extra \n is added by appyPatch

    source : "" and destination: "abcd"

    above combination will create the patch as --> "@@ -1,0 +1,1 @@\n+abcd\n"

    applyPatch("", ["@@ -1,0 +1,1 @@\n+abcd\n"]) results in --> "abcd\n" (This extra \n is added)

    Case 2: When \n is removed by applyPatch

    source: "" and destination: "abcd\n"

    above combination will still result in patch --> "@@ -1,0 +1,1 @@\n+abcd\n"

    opened by prabhat-awasthi-3697 2
Owner
Kevin Decker
Kevin Decker
A lightweight JavaScript library that renders text in a brilliant style by displaying strings of random characters before the actual text.

cryptoWriter.js A lightweight javascript library which creates brilliant text animation by rendering strings of random characters before the actual te

Keshav Bajaj 2 Sep 13, 2022
Twitter Text Libraries. This code is used at Twitter to tokenize and parse text to meet the expectations for what can be used on the platform.

twitter-text This repository is a collection of libraries and conformance tests to standardize parsing of Tweet text. It synchronizes development, tes

Twitter 2.9k Jan 8, 2023
Obsidian text generator Plugin Text generator using GPT-3 (OpenAI)

is a handy plugin for Obsidian that helps you generate text content using the powerful language model GP

null 356 Dec 29, 2022
Easiest 1-click way to install and use Stable Diffusion on your own computer. Provides a browser UI for generating images from text prompts and images. Just enter your text prompt, and see the generated image.

Stable Diffusion UI Easiest way to install and use Stable Diffusion on your own computer. No dependencies or technical knowledge required. 1-click ins

null 3.5k Dec 30, 2022
Simple Library implemented using HTML, CSS and JavaScript. This is a simple implementation of JavaScript Modules of ES6.

Awesome-books A single page project with the porpuse of storing books' titles and authors. Built With CSS, HTML & Javascript. How to run in your local

Saadat Ali 7 Feb 21, 2022
Javascript implementation of flasher tool for Espressif chips, running in web browser using WebSerial.

Javascript implementation of esptool This repository contains a Javascript implementation of esptool, a serial flasher utility for Espressif chips. Un

Espressif Systems 103 Dec 22, 2022
A JavaScript implementation of Michael Baker's Miner2149

miner2149-js A JavaScript implementation of Michael Baker's Miner2149. This repository is for personal use only. Not for commercial use or distributio

Gabrien Symons 1 Jan 11, 2022
A fast simplex noise implementation in Javascript.

simplex-noise.js API Documentation simplex-noise.js is a simplex noise implementation in Javascript/TypeScript. It works in the browser and nodejs. Us

Jonas Wagner 1.2k Jan 2, 2023
javascript implementation of logistic regression/c4.5 decision tree

LearningJS: A Javascript Implementation of Logistic Regression and C4.5 Decision Tree Algorithms Author: Yandong Liu. Email: yandongl @ cs.cmu.edu Upd

Yandong Liu 67 Aug 19, 2022
ParkyDB - block based, linkable and verifiable document database -- javascript reference implementation

Ancon ParkyDB A data mesh database using Web 3.0 technology Note: Requires Node v17.7.2 and up for development More about data mesh architecture Block

Ancon Protocol 6 Aug 16, 2022
An implementation of (Untyped) Lambda Calculus in JavaScript.

Lambda Calculus More restraint and more pure, so functional and so reduced. -- Anonymous Bauhaus Student An implementation of (Untyped) Lambda Calculu

Cicada Language 25 Nov 17, 2022
An implementation of Interaction Nets in JavaScript.

Interaction Nets An implementation of Interaction Nets in JavaScript. Use S-expression as overall syntax. Use Forth-like postfix stack-based syntax to

Cicada Language 48 Dec 23, 2022
An Open-Source JavaScript Implementation of Bionic Reading.

bionic-reading Try on Runkit or Online Sandbox An Open-Source JavaScript Implementation of Bionic Reading API. ⚙️ Install npm i bionic-reading yarn ad

shj 127 Dec 16, 2022
A tiny CRDT implementation in Javascript.

Tiny Merge A tiny CRDT implemented in Javascript. The philosophy behind Tiny Merge is to strategically reduce the functionality of CRDT's in favour of

James Addison 10 Dec 2, 2022
An Open-Source JavaScript Implementation of Bionic Reading.

TextVide (vide; Latin for "see") Support all languages that separate words with spaces Try on Runkit or Online Sandbox An Open-Source JavaScript Imple

shj 127 Dec 16, 2022
Charm implementation in JavaScript (TypeScript)

charm.js A tiny, self-contained cryptography library, implementing authenticated encryption and keyed hashing. Any number of hashing and authenticated

Frank Denis 12 Nov 2, 2022
A JavaScript implementation of the Spring 83 protocol

An implementation of the Spring 83 protocol. Very much a work-in-progress. This was built in reference to draft-20220616.md@0f63d3d2. Setup Requires n

Ryan Joseph 10 Aug 22, 2022
A native-like JavaScript pull to refresh implementation for the web.

Pull to Refresh for the Web 1.1 This is a pull to refresh implementation for the web. It focuses on buttery UX performance and responsiveness to feel

Andy Peatling 536 Dec 19, 2022
A JavaScript SRP-6a implementation compatible with opencoff/go-srp.

js-srp This is an implementation of the SRP-6a protocol with modifications to provide compatibility with opencoff/go-srp. These differences are quoted

null 3 Dec 20, 2022