diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..4ab96f6 --- /dev/null +++ b/.gitignore @@ -0,0 +1,24 @@ +# dependencies +/node_modules +/.pnp +.pnp.js + +/.idea + +# testing +/coverage + +# production +#/build + +# misc +._* +.DS_Store +.env.local +.env.development.local +.env.test.local +.env.production.local + +npm-debug.log* +yarn-debug.log* +yarn-error.log* diff --git a/charlist.js b/charlist.js new file mode 100644 index 0000000..34a37f0 --- /dev/null +++ b/charlist.js @@ -0,0 +1,128 @@ +export const NGLEGENA = { + "h": "ꦲ", + "n": "ꦤ", + "c": "ꦕ", + "r": "ꦫ", + "k": "ꦏ", + "d": "ꦢ", + "t": "ꦠ", + "s": "ꦱ", + "w": "ꦮ", + "l": "ꦭ", + "p": "ꦥ", + "dh": "ꦝ", + "j": "ꦗ", + "y": "ꦪ", + "ny": "ꦚ", + "m": "ꦩ", + "g": "ꦒ", + "b": "ꦧ", + "th": "ꦛ", + "ng": "ꦔ", + //Aksara Rekan + "z": "ꦗ꦳", + "f": "ꦥ꦳", + "v": "ꦮ꦳", + "kh": "ꦏ꦳", + "dz": "ꦢ꦳", + "gh": "ꦒ꦳", + //Aksara Murda + "N": "ꦟ", + "K": "ꦑ", + "T": "ꦡ", + "S": "ꦯ", + "P": "ꦦ", + "NY": "ꦘ", + "G": "ꦓ", + "B": "ꦨ", +}; + +export const SWARA = { + "A": "ꦄ", + "I": "ꦅ", + "U": "ꦈ", + "E": "ꦌ", + "O": "ꦎ", + //Pa Ceret, Nga Lelet + "rx": "ꦉ", + "lx": "ꦊ" +}; + +export const PASANGAN = { + "h": "꧀ꦲ", + "n": "꧀ꦤ", + "c": "꧀ꦕ", + "r": "꧀ꦫ", + "k": "꧀ꦏ", + "d": "꧀ꦢ", + "t": "꧀ꦠ", + "s": "꧀ꦱ", + "w": "꧀ꦮ", + "l": "꧀ꦭ", + "p": "꧀ꦥ", + "dh": "꧀ꦓ", + "j": "꧀ꦗ", + "y": "꧀ꦪ", + "ny": "꧀ꦚ", + "m": "꧀ꦩ", + "g": "꧀ꦒ", + "b": "꧀ꦧ", + "th": "꧀ꦛ", + "ng": "꧀ꦔ", + //Aksara Rekan + "z": "꧀ꦗ꦳", + "f": "꧀ꦥ꦳", + "v": "꧀ꦮ꦳", + "kh": "꧀ꦏ꦳", + "dz": "꧀ꦢ꦳", + "gh": "꧀ꦒ꦳", + //Aksara Murda + "N": "꧀ꦟ", + "K": "꧀ꦑ", + "T": "꧀ꦡ", + "S": "꧀ꦯ", + "P": "꧀ꦦ", + "NY": "꧀ꦘ", + "G": "꧀ꦓ", + "B": "꧀ꦨ", +}; + +export const SANDHANGAN = { + "wulu": "ꦶ", + "suku": "ꦸ", + "taling": "ꦺ", + "talingTarung": "ꦺꦴ", + "pepet": "ꦼ", + "cecak": "ꦁ", + "wignyan": "ꦃ", + "layar": "ꦂ", + "cakra": "ꦿ", + "keret": "ꦽ", + "pengkal": "ꦾ", + "pangkon": "꧀", +}; + +export const PADA = { + "lingsa": "꧈", + "lungsi": "꧉", + "pangkat": "꧇", + "adeg": "꧊", + "adegadeg": "꧋", + "piseleh": "꧌", + "piselehwalik": "꧍", + "rerengankiwa": "꧁", + "rerengantengen": "꧂", +}; + +export const ANGKA = { + "1": "꧑", + "2": "꧒", + "3": "꧓", + "4": "꧔", + "5": "꧕", + "6": "꧖", + "7": "꧗", + "8": "꧘", + "9": "꧙", + "0": "꧐", +}; diff --git a/index.js b/index.js new file mode 100644 index 0000000..80d5467 --- /dev/null +++ b/index.js @@ -0,0 +1,358 @@ +"use strict" + +const matchAll = require("string.prototype.matchall"); +const path = require("path"); +const {NGLEGENA, SWARA, PASANGAN, SANDHANGAN, PADA, ANGKA} = require(path.join(__dirname, "charlist.js")); + +const getInitial = (glyph) => { + if (glyph == null) + return ""; + if (glyph in SWARA) + return SWARA[glyph]; + if (glyph in NGLEGENA) + return NGLEGENA[glyph]; + + return glyph; +}; + +const getSonorant = (consonant) => { + if (consonant == null) + return ""; + if (consonant === "r") + return SANDHANGAN["cakra"]; + if (consonant === "y") + return SANDHANGAN["pengkal"]; + if (consonant === "rx") + return SANDHANGAN["keret"]; + if (consonant in PASANGAN) + return PASANGAN[consonant]; + + return consonant; +}; + +const getVowel = (vowel) => { + if (vowel == null) + return ""; + + switch (vowel.toLowerCase()) { + case "a": + return ""; + case "i": + return SANDHANGAN["wulu"]; + case "u": + return SANDHANGAN["suku"]; + case "é": + case "è": + case "e": + return SANDHANGAN["taling"]; + case "o": + return SANDHANGAN["talingTarung"]; + case "ə": + case "x": + return SANDHANGAN["pepet"]; + } + + return vowel; +}; + +const getFinal = (consonant) => { + if (consonant == null) + return ""; + if (consonant === "r") + return SANDHANGAN["layar"]; + if (consonant === "h") + return SANDHANGAN["wignyan"]; + if (consonant === "ng") + return SANDHANGAN["cecak"]; + if (consonant === "pangkon") + return SANDHANGAN["pangkon"]; + + return PASANGAN[consonant]; +}; + +const getPunctuation = (symbol) => { + if (symbol == null) + return ""; + + switch (symbol) { + case ",": + return PADA["lingsa"]; + case ".": + return PADA["lungsi"]; + case ":": + return PADA["pangkat"]; + case "(": + case ")": + case "'": + case "\"": + return PADA["adeg"]; + case "|": + return PADA["adegadeg"]; + case "<": + return PADA["piseleh"]; + case ">": + return PADA["piselehwalik"]; + case "{": + return PADA["rerengankiwa"]; + case "}": + return PADA["rerengantengen"]; + } + + return symbol; +}; + +const getNumber = (number) => { + if (number == null) + return ""; + if (number in ANGKA) + return ANGKA[number]; + + return ""; +}; + +const isDigit = (text) => { + if (text == null) + return false; + + return /[\d]/.test(text); +}; + +const isSpace = (text) => { + if (text == null) + return false; + + return /^[ ]$/.test(text); +}; + +const returnConsonant = (text, onlyLast = false) => { + let result = ""; + let matches = [...matchAll(text, /(dh|ny|th|ng|kh|dz|sy|gh|NY|[hncrkdtswlpjymgbzfvNKTSPGB])/g)]; + + if (/[aiueoxAIUEOXÉÈéè]/.test(text)) { + let syllableMatches = [...matchAll(text, /(dh|ny|th|ng|kh|dz|sy|gh|NY|[hncrkdtswlpjymgbzfvNKTSPGB]?)?(dh|ny|th|ng|kh|dz|sy|gh|NY|[hncrkdtswlpjymgbzfvNKTSPGB]?)?([aiueoxAIUEOXÉÈéè])/g)]; + for (let i = 0; i < syllableMatches.length; i++) { + if (syllableMatches[i][1] != null) { + result = getInitial(syllableMatches[i][1]) + getSonorant(syllableMatches[i][2]) + getVowel(syllableMatches[i][3]); + } else { + result = getInitial("h") + getVowel(syllableMatches[i][2]); + } + } + return result; + } + + if (matches.length === 0) + return ""; + + if (onlyLast) + return matches[matches.length - 1][1]; + + for (let i = 0; i < matches.length; i++) { + result += getInitial(matches[i][1]) + getFinal("pangkon"); + } + return result; +}; + +// This function transliterates strings which is filtered by the exported function +const doTrans = (current, residue, input, isLast = true) => { + let hasCakret = false; // Has a cakra or cakra keret + let buffer = { + mutedInitial: "", + symbolnum: "", + initial: "", + sonorant: "", + vowel: "", + final: "", + opt: "", + mutedFinal: "", + }; + const insertMutedInitial = () => { + buffer.mutedInitial = returnConsonant(residue); + }; + const insertMutedFinal = () => { + if (isLast && (input.length - current.index > current[0].length)) { + let finalGlyph = input.slice(current.index + current[0].length); + if (!isSpace(finalGlyph)) + buffer.mutedFinal = getInitial(finalGlyph) + getFinal("pangkon"); + } + }; + const output = () => { + // Check if syllable has Cakra or Cakra Keret + if (!hasCakret) insertMutedInitial(); + insertMutedFinal(); + return buffer.mutedInitial + + buffer.symbolnum + // Digits and punctuation will end at this point + + buffer.initial + + buffer.sonorant + + buffer.opt // Only cakra & cakra keret will print this + + buffer.vowel + + buffer.final + // Word in the middle of the input will end at this point + + buffer.mutedFinal; + }; + + // Check if syllable is actually a digit or non-sentence-ender punctuation + // (i.e group 1 matched and therefore not null/undefined) + if (current[1] != null) { + // Check if syllable is a number + if (isDigit(current[1])) { + let result = ""; + for (let i = 0; i < current[1].length; i++) { + result += getNumber(current[1].charAt(i)); + } + // Surround numbers with Pada Pangkat + buffer.symbolnum = getPunctuation(":") + result + getPunctuation(":"); + } + // Else the syllable is a punctuation + else { + buffer.symbolnum = getPunctuation(current[1]); + } + } + + // Check if syllable is actually a sentence ender + // (i.e have no vowel component) + else if (current[4] == null) { + // Handle comma (,) + if (current[7] === ",") { + if (current[6] != null) { + // Insert zero width non-joiner char to preserve pangkon + buffer.symbolnum = getInitial(current[6]) + getFinal("pangkon") + "‌"; + } else { + buffer.symbolnum = getPunctuation(","); + } + } + // Handle dot (.) + else { + if (current[6] != null) { + buffer.symbolnum = getInitial(current[6]) + getFinal("pangkon") + getPunctuation(","); + } else { + buffer.symbolnum = getPunctuation("."); + } + } + } + + // Else, if syllable is an actual Javanese syllable: + else { + // Initialize part of the syllable + let word = { + initial: current[2] != null ? current[2] : null, + sonorant: current[3] != null ? current[3] : null, + vowel: current[4] != null ? current[4] : null, + final: current[5] != null ? current[5] : null, + }; + + // Handle the exception in the rules of Javanese script, smh. + // Check if word is a vowel sound + // (i.e has no initial) + if (word.initial === null) { + if (word.vowel.match(/[AIUEO]/g) !== null) { + buffer.initial = getInitial(word.vowel); + buffer.final = getFinal(word.final); + } else { + buffer.initial = getInitial("h") + getVowel(word.vowel); + buffer.final = getFinal(word.final); + } + } else { + if (word.sonorant === "r") { + if (residue.length > 0 && residue !== " ") { + hasCakret = true; + buffer.mutedInitial = returnConsonant(residue).substring(0, returnConsonant(residue).length - 2); + if (word.vowel === "x") { + buffer.initial = getInitial(returnConsonant(residue, true)); + buffer.sonorant = getSonorant(word.initial); + buffer.opt = getSonorant("rx"); + buffer.final = getFinal(word.final); + } else { + buffer.initial = getInitial(returnConsonant(residue, true)); + buffer.sonorant = getSonorant(word.initial); + buffer.opt = getSonorant("r"); + buffer.vowel = getVowel(word.vowel); + buffer.final = getFinal(word.final); + } + } else { + if (word.vowel === "x") { + buffer.initial = getInitial(word.initial); + buffer.sonorant = getSonorant("rx"); + buffer.final = getFinal(word.final); + } else { + buffer.initial = getInitial(word.initial); + buffer.sonorant = getSonorant(word.sonorant); + buffer.vowel = getVowel(word.vowel); + buffer.final = getFinal(word.final); + } + } + } else if (word.vowel === "x") { + if (word.initial === "r" && word.sonorant === null) { + buffer.initial = getInitial("rx"); + buffer.final = getFinal(word.final); + } else if (word.initial === "l" && word.sonorant === null) { + buffer.initial = getInitial("lx"); + buffer.final = getFinal(word.final); + } else { + buffer.initial = getInitial(word.initial); + buffer.sonorant = getSonorant(word.sonorant); + buffer.vowel = getVowel(word.vowel); + buffer.final = getFinal(word.final); + } + } else { + buffer.initial = getInitial(word.initial); + buffer.sonorant = getSonorant(word.sonorant); + buffer.vowel = getVowel(word.vowel); + buffer.final = getFinal(word.final); + } + } + } + return output(); +}; + +exports.toCarakan = (value, useDiacritics = false, useSwaraMurda = true) => { + if (typeof value !== "string") + throw new TypeError("Expected a string"); + + let input = useDiacritics + ? value.replace(/E(?!`)/g, "X").replace(/E`/g, "E").replace(/e(?!`)/g, "x").replace(/e`/g, "e") + : value; + + if (!useSwaraMurda) input = input.toLowerCase(); + + let result = ""; + const syllableCheck = /([\d]+|[:()'"|<>{}?!])|(dh|ny|th|ng|kh|dz|sy|gh|NY|[hncrkdtswlpjymgbzfvNKTSPGB])?(?![ ](?![aiueoxAIUEOXÉÈéè]))(dh|ny|th|ng|kh|dz|sy|gh|NY|[hncrkdtswlpjymgbzfvNKTSPGB]?)?([aiueoxAIUEOXÉÈéè])(ng|[rh])?(?![aiueoxAIUEOXÉÈéè])|(dh|ny|th|kh|dz|sy|gh|NY|[nckdtswlpjymgbzfvNKTSPGB])?([.,])(?:[ ])?/g; + // Explanation for above's regex match groups: + // + // 1 numbers and punctuation + // -------- + // 2 initial consonant + // 3 sonorant consonant + // 4 vowel + // 5 final consonant (r, h, ng) + // -------- + // 6 muted consonant at the end of sentence (pangkon'd) + // 7 punctuation (.,) + // 8 space (ignored) + + let matches = [...matchAll(input, syllableCheck)]; + + for (let i = 0; i < matches.length; i++) { + let prev = matches[0] === undefined ? [] : i === 0 ? [] : matches[i - 1]; + let current = matches[0] === undefined ? [] : matches[i]; + let isLast = i === matches.length - 1; + + // Residue is the leftover strings which isn't picked up by the regex above + let residue = + // Check if residue is in the middle of the word + (prev.length > 0 && prev.index - current.index < prev[0].length) + ? input.substr(prev.index + prev[0].length, current.index - (prev.index + prev[0].length)) + // Else check if it's still on the beginning of the word (i.e there is no match yet) + : (matches.length === 0 && input.length > 0) + ? input // Else check if it's already in the beginning of the word + : (current.length > 0) + ? input.slice(0, current.index) + : null; + + if (current.length > 0) + // Transliterates the regex-filtered strings + result += doTrans(current, residue, input, isLast, useDiacritics); + } + + return result; +}; diff --git a/package.json b/package.json new file mode 100644 index 0000000..9d0ec60 --- /dev/null +++ b/package.json @@ -0,0 +1,25 @@ +{ + "name": "carakanjs", + "version": "0.3.0", + "description": "Carakan.js is a small library for converting Latin script into Javanese script, also known as Aksara Jawa/Carakan.", + "main": "index.js", + "homepage": "https://github.com/masnormen/carakanjs", + "repository": { + "type": "git", + "url": "https://github.com/masnormen/carakanjs" + }, + "author": "Nourman Hajar (nourman.id)", + "license": "MIT", + "private": false, + "keywords": [ + "jawa", + "transliterate", + "javanese", + "carakan", + "aksara", + "aksara jawa" + ], + "dependencies": { + "string.prototype.matchall": "^4.0.2" + } +} diff --git a/yarn.lock b/yarn.lock new file mode 100644 index 0000000..848b8bc --- /dev/null +++ b/yarn.lock @@ -0,0 +1,173 @@ +# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. +# yarn lockfile v1 + + +define-properties@^1.1.2, define-properties@^1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.1.3.tgz#cf88da6cbee26fe6db7094f61d870cbd84cee9f1" + integrity sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ== + dependencies: + object-keys "^1.0.12" + +es-abstract@^1.17.0, es-abstract@^1.17.0-next.1, es-abstract@^1.17.5: + version "1.17.6" + resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.17.6.tgz#9142071707857b2cacc7b89ecb670316c3e2d52a" + integrity sha512-Fr89bON3WFyUi5EvAeI48QTWX0AyekGgLA8H+c+7fbfCkJwRWRMLd8CQedNEyJuoYYhmtEqY92pgte1FAhBlhw== + dependencies: + es-to-primitive "^1.2.1" + function-bind "^1.1.1" + has "^1.0.3" + has-symbols "^1.0.1" + is-callable "^1.2.0" + is-regex "^1.1.0" + object-inspect "^1.7.0" + object-keys "^1.1.1" + object.assign "^4.1.0" + string.prototype.trimend "^1.0.1" + string.prototype.trimstart "^1.0.1" + +es-abstract@^1.18.0-next.0: + version "1.18.0-next.0" + resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.18.0-next.0.tgz#b302834927e624d8e5837ed48224291f2c66e6fc" + integrity sha512-elZXTZXKn51hUBdJjSZGYRujuzilgXo8vSPQzjGYXLvSlGiCo8VO8ZGV3kjo9a0WNJJ57hENagwbtlRuHuzkcQ== + dependencies: + es-to-primitive "^1.2.1" + function-bind "^1.1.1" + has "^1.0.3" + has-symbols "^1.0.1" + is-callable "^1.2.0" + is-negative-zero "^2.0.0" + is-regex "^1.1.1" + object-inspect "^1.8.0" + object-keys "^1.1.1" + object.assign "^4.1.0" + string.prototype.trimend "^1.0.1" + string.prototype.trimstart "^1.0.1" + +es-to-primitive@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/es-to-primitive/-/es-to-primitive-1.2.1.tgz#e55cd4c9cdc188bcefb03b366c736323fc5c898a" + integrity sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA== + dependencies: + is-callable "^1.1.4" + is-date-object "^1.0.1" + is-symbol "^1.0.2" + +function-bind@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" + integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A== + +has-symbols@^1.0.0, has-symbols@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.1.tgz#9f5214758a44196c406d9bd76cebf81ec2dd31e8" + integrity sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg== + +has@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796" + integrity sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw== + dependencies: + function-bind "^1.1.1" + +internal-slot@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/internal-slot/-/internal-slot-1.0.2.tgz#9c2e9fb3cd8e5e4256c6f45fe310067fcfa378a3" + integrity sha512-2cQNfwhAfJIkU4KZPkDI+Gj5yNNnbqi40W9Gge6dfnk4TocEVm00B3bdiL+JINrbGJil2TeHvM4rETGzk/f/0g== + dependencies: + es-abstract "^1.17.0-next.1" + has "^1.0.3" + side-channel "^1.0.2" + +is-callable@^1.1.4, is-callable@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.0.tgz#83336560b54a38e35e3a2df7afd0454d691468bb" + integrity sha512-pyVD9AaGLxtg6srb2Ng6ynWJqkHU9bEM087AKck0w8QwDarTfNcpIYoU8x8Hv2Icm8u6kFJM18Dag8lyqGkviw== + +is-date-object@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.0.2.tgz#bda736f2cd8fd06d32844e7743bfa7494c3bfd7e" + integrity sha512-USlDT524woQ08aoZFzh3/Z6ch9Y/EWXEHQ/AaRN0SkKq4t2Jw2R2339tSXmwuVoY7LLlBCbOIlx2myP/L5zk0g== + +is-negative-zero@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/is-negative-zero/-/is-negative-zero-2.0.0.tgz#9553b121b0fac28869da9ed459e20c7543788461" + integrity sha1-lVOxIbD6wohp2p7UWeIMdUN4hGE= + +is-regex@^1.1.0, is-regex@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.1.1.tgz#c6f98aacc546f6cec5468a07b7b153ab564a57b9" + integrity sha512-1+QkEcxiLlB7VEyFtyBg94e08OAsvq7FUBgApTq/w2ymCLyKJgDPsybBENVtA7XCQEgEXxKPonG+mvYRxh/LIg== + dependencies: + has-symbols "^1.0.1" + +is-symbol@^1.0.2: + version "1.0.3" + resolved "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.0.3.tgz#38e1014b9e6329be0de9d24a414fd7441ec61937" + integrity sha512-OwijhaRSgqvhm/0ZdAcXNZt9lYdKFpcRDT5ULUuYXPoT794UNOdU+gpT6Rzo7b4V2HUl/op6GqY894AZwv9faQ== + dependencies: + has-symbols "^1.0.1" + +object-inspect@^1.7.0, object-inspect@^1.8.0: + version "1.8.0" + resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.8.0.tgz#df807e5ecf53a609cc6bfe93eac3cc7be5b3a9d0" + integrity sha512-jLdtEOB112fORuypAyl/50VRVIBIdVQOSUUGQHzJ4xBSbit81zRarz7GThkEFZy1RceYrWYcPcBFPQwHyAc1gA== + +object-keys@^1.0.11, object-keys@^1.0.12, object-keys@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e" + integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA== + +object.assign@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.0.tgz#968bf1100d7956bb3ca086f006f846b3bc4008da" + integrity sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w== + dependencies: + define-properties "^1.1.2" + function-bind "^1.1.1" + has-symbols "^1.0.0" + object-keys "^1.0.11" + +regexp.prototype.flags@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/regexp.prototype.flags/-/regexp.prototype.flags-1.3.0.tgz#7aba89b3c13a64509dabcf3ca8d9fbb9bdf5cb75" + integrity sha512-2+Q0C5g951OlYlJz6yu5/M33IcsESLlLfsyIaLJaG4FA2r4yP8MvVMJUUP/fVBkSpbbbZlS5gynbEWLipiiXiQ== + dependencies: + define-properties "^1.1.3" + es-abstract "^1.17.0-next.1" + +side-channel@^1.0.2: + version "1.0.3" + resolved "https://registry.yarnpkg.com/side-channel/-/side-channel-1.0.3.tgz#cdc46b057550bbab63706210838df5d4c19519c3" + integrity sha512-A6+ByhlLkksFoUepsGxfj5x1gTSrs+OydsRptUxeNCabQpCFUvcwIczgOigI8vhY/OJCnPnyE9rGiwgvr9cS1g== + dependencies: + es-abstract "^1.18.0-next.0" + object-inspect "^1.8.0" + +string.prototype.matchall@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/string.prototype.matchall/-/string.prototype.matchall-4.0.2.tgz#48bb510326fb9fdeb6a33ceaa81a6ea04ef7648e" + integrity sha512-N/jp6O5fMf9os0JU3E72Qhf590RSRZU/ungsL/qJUYVTNv7hTG0P/dbPjxINVN9jpscu3nzYwKESU3P3RY5tOg== + dependencies: + define-properties "^1.1.3" + es-abstract "^1.17.0" + has-symbols "^1.0.1" + internal-slot "^1.0.2" + regexp.prototype.flags "^1.3.0" + side-channel "^1.0.2" + +string.prototype.trimend@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/string.prototype.trimend/-/string.prototype.trimend-1.0.1.tgz#85812a6b847ac002270f5808146064c995fb6913" + integrity sha512-LRPxFUaTtpqYsTeNKaFOw3R4bxIzWOnbQ837QfBylo8jIxtcbK/A/sMV7Q+OAV/vWo+7s25pOE10KYSjaSO06g== + dependencies: + define-properties "^1.1.3" + es-abstract "^1.17.5" + +string.prototype.trimstart@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/string.prototype.trimstart/-/string.prototype.trimstart-1.0.1.tgz#14af6d9f34b053f7cfc89b72f8f2ee14b9039a54" + integrity sha512-XxZn+QpvrBI1FOcg6dIpxUPgWCPuNXvMD72aaRaUQv1eD4e/Qy8i/hFTe0BUmD60p/QA6bh1avmuPTfNjqVWRw== + dependencies: + define-properties "^1.1.3" + es-abstract "^1.17.5"