├── .babelrc ├── .github ├── FUNDING.yml └── workflows │ └── main.yaml ├── .gitignore ├── README.md ├── es2015 ├── 1.let-const-variables.js ├── 10.iterators-forof.js ├── 11.generators.js ├── 12.modules.js ├── 13.set.js ├── 14.weakset.js ├── 15.map.js ├── 16.weakmap.js ├── 17.unicode.js ├── 18.symbols.js ├── 19.proxies.js ├── 2.arrow-functions.js ├── 20.promises.js ├── 21.reflect.js ├── 22.binary-octal.js ├── 23.proper-tail-calls.js ├── 3.classes.js ├── 4.enhanced-object-literals.js ├── 5.template-literals.js ├── 6.destructuring.js ├── 7.default-parameters.js ├── 8.rest-parameter.js └── 9.spread-operator.js ├── es2016 ├── array-includes.js └── exponential-operator.js ├── es2017 ├── 1.async-functions.js ├── 2.object-values.js ├── 3.object-entries.js ├── 4.object-property-descriptors.js ├── 5.string-padding.js ├── 6.shared-memory-atomics.js └── 7.trailing-commas.js ├── es2018 ├── 1.async-iterators.js ├── 2.object-rest-spread-operators.js └── 3.promise-finally.js ├── es2019 ├── 1.array-flat-flatmap.js ├── 2.object-fromentries.js ├── 3.trimstart-trimend.js ├── 4.symbol-description.js ├── 5.optional-catch-binding.js ├── 6.json-improvements.js ├── 7.array-stable-sort.js └── 8.function-tostring.js ├── es2020 ├── bigint.js ├── dynamic-import │ ├── async-dynamic-import.js │ ├── dynamic-import.js │ └── message.js ├── for-in-order.js ├── globalThis.js ├── import-meta │ ├── import-meta.js │ └── my-module.js ├── nullish-coalescing-operator.js ├── optional-chaining.js ├── promise-allsettled.js └── string.matchAll.js ├── es2021 ├── logical-assignment-operators │ ├── and.js │ ├── nullish.js │ └── or.js ├── numeric-separator │ ├── big-integers.js │ └── binary-hex.js ├── promise-any │ ├── promise-any-error.js │ └── promise-any.js ├── replace-all.js └── weakref │ ├── finalizer.js │ └── weakref.js ├── es2022 ├── array-at.js ├── class fields │ ├── private-fields-methods.js │ └── static-fields-methods.js ├── error-cause.js ├── hasOwn │ ├── hasOwn-create.js │ └── hasOwn-overwritten.js └── regex-indices.js ├── es2023 ├── 1.array-from-last.js ├── 2.hashbang-syntax.js ├── 3.symbols-as-weakmap-keys.js └── 4.change-array-by-copy.js ├── es2024 ├── 1.groupby-objects-maps.js ├── 3.well-formed-unicode-strings.js ├── 4.atomics-waitasync.js └── 6.promise-withResolvers.js ├── es2025 ├── 1.set-methods.js ├── 2.iterator-helpers.js ├── 3.temporal-api.js └── 4.decorator-metadata.js ├── images └── promises.png ├── package-lock.json └── package.json /.babelrc: -------------------------------------------------------------------------------- 1 | { 2 | "presets": ["@babel/preset-env"] 3 | } -------------------------------------------------------------------------------- /.github/FUNDING.yml: -------------------------------------------------------------------------------- 1 | github: [sudheerj] 2 | custom: https://buymeacoffee.com/sudheerj 3 | -------------------------------------------------------------------------------- /.github/workflows/main.yaml: -------------------------------------------------------------------------------- 1 | name: Documentation 2 | 3 | on: 4 | push: 5 | branches: [ master ] 6 | 7 | env: 8 | FILE_NAME: ECMAScript-features 9 | 10 | jobs: 11 | convert_via_pandoc: 12 | runs-on: ubuntu-18.04 13 | steps: 14 | - uses: actions/checkout@v2 15 | 16 | - name: Create output directory 17 | run: | 18 | mkdir output # create output dir 19 | 20 | - name: Create PDF 21 | uses: docker://pandoc/latex:2.9 22 | with: 23 | args: --pdf-engine=xelatex --output=output/${{env.FILE_NAME}}.pdf README.md 24 | 25 | - name: Create epub 26 | uses: docker://pandoc/latex:2.9 27 | with: 28 | args: --output=output/${{env.FILE_NAME}}.epub README.md 29 | 30 | - name: Upload 31 | uses: actions/upload-artifact@master 32 | with: 33 | name: output 34 | path: output -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Cruft 2 | .DS_Store 3 | npm-debug.log 4 | .idea 5 | *.idea/ 6 | .idea/workspace.xml 7 | 8 | # Dependency directories 9 | node_modules/ -------------------------------------------------------------------------------- /es2015/1.let-const-variables.js: -------------------------------------------------------------------------------- 1 | let a = 1; 2 | 3 | if (a === 1) { 4 | let a = 2; 5 | 6 | console.log(a); //2 7 | } 8 | 9 | console.log(a); //1 10 | 11 | const x = 1; 12 | 13 | if (x === 1) { 14 | const y = 2; // You cannot re-assign the value similar to let variable 15 | 16 | console.log(y); //2 17 | } 18 | 19 | console.log(x); //1 -------------------------------------------------------------------------------- /es2015/10.iterators-forof.js: -------------------------------------------------------------------------------- 1 | const collection = { 2 | one: 1, 3 | two: 2, 4 | three: 3, 5 | [Symbol.iterator]() { 6 | const values = Object.keys(this); 7 | let i = 0; 8 | return { 9 | next: () => { 10 | return { 11 | value: this[values[i++]], 12 | done: i > values.length 13 | } 14 | } 15 | }; 16 | } 17 | }; 18 | 19 | const iterator = collection[Symbol.iterator](); 20 | 21 | console.log(iterator.next()); // → {value: 1, done: false} 22 | console.log(iterator.next()); // → {value: 2, done: false} 23 | console.log(iterator.next()); // → {value: 3, done: false} 24 | console.log(iterator.next()); // → {value: undefined, done: true} 25 | 26 | for (const value of collection) { 27 | console.log(value); 28 | } -------------------------------------------------------------------------------- /es2015/11.generators.js: -------------------------------------------------------------------------------- 1 | function* myGenerator(i) { 2 | yield i + 10; 3 | yield i + 20; 4 | return i + 30; 5 | } 6 | 7 | const myGenObj = myGenerator(10); 8 | 9 | console.log(myGenObj.next().value); // 20 10 | console.log(myGenObj.next().value); // 30 11 | console.log(myGenObj.next().value); // 40 -------------------------------------------------------------------------------- /es2015/12.modules.js: -------------------------------------------------------------------------------- 1 | //Export Statement 2 | // Named exports 3 | 4 | // module "my-module.js" 5 | 6 | const PI = Math.PI; 7 | 8 | function add(...args) { 9 | return args.reduce((num, tot) => tot + num); 10 | } 11 | 12 | function multiply(...args) { 13 | return args.reduce((num, tot) => tot * num); 14 | } 15 | 16 | // private function 17 | function print(msg) { 18 | console.log(msg); 19 | } 20 | 21 | export { PI, add, multiply }; 22 | 23 | // Default exports 24 | // module "my-module.js" 25 | 26 | export default function add(...args) { 27 | return args.reduce((num, tot) => tot + num); 28 | } 29 | 30 | //Import Statement 31 | 32 | // 1. Import an entire module's contents 33 | import * as name from "my-module"; 34 | 35 | //2.Import a single export from a module 36 | import { export1 } from "my-module"; 37 | 38 | //3.Import multiple exports from a module 39 | import { export1 , export2 } from "my-module"; 40 | 41 | //4.Import default export from a module 42 | import defaultExport from "my-module"; 43 | 44 | //5.Import an export with an alias 45 | import { export1 as alias1 } from "my-module"; 46 | 47 | -------------------------------------------------------------------------------- /es2015/13.set.js: -------------------------------------------------------------------------------- 1 | let mySet = new Set() 2 | 3 | mySet.add(1); 4 | mySet.add(2); 5 | mySet.add(2); 6 | mySet.add('some text here'); 7 | mySet.add({one: 1, two: 2 , three: 3}); 8 | console.log(mySet); // Set [ 1, 2, 'some text here', {one: 1, two: 2 , three: 3} ] 9 | console.log(mySet.size) // 4 10 | console.log(mySet.has(2)); // true -------------------------------------------------------------------------------- /es2015/14.weakset.js: -------------------------------------------------------------------------------- 1 | let myUserSet = new WeakSet(); 2 | 3 | let john = { name: "John" }; 4 | let rocky = { name: "Rocky" }; 5 | let alex = { name: "Alex" }; 6 | let nick = { name: "Nick" }; 7 | 8 | myUserSet.add(john); 9 | myUserSet.add(rocky); 10 | myUserSet.add(john); 11 | myUserSet.add(nick); 12 | 13 | console.log(myUserSet.has(john)); // true 14 | console.log(myUserSet.has(alex)); // false 15 | console.log(myUserSet.delete(nick)); 16 | console.log(myUserSet.has(nick)); // false 17 | 18 | john = null; -------------------------------------------------------------------------------- /es2015/15.map.js: -------------------------------------------------------------------------------- 1 | let typeMap = new Map(); 2 | 3 | var keyObj = {'one': 1} 4 | 5 | typeMap.set('10', 'string'); // a string key 6 | typeMap.set(10, 'number'); // a numeric key 7 | typeMap.set(true, 'boolean'); // a boolean key 8 | typeMap.set(keyObj, 'object'); // an object key 9 | 10 | 11 | console.log(typeMap.get(10) ); // number 12 | console.log(typeMap.get('10') ); // string 13 | console.log(typeMap.get(keyObj)) // object 14 | console.log(typeMap.get({'one': 1})) // undefined 15 | 16 | console.log(typeMap.size ); // 4 17 | 18 | for(let item of typeMap) { 19 | console.log(item); 20 | } 21 | 22 | 23 | for(let item in typeMap) { 24 | console.log(item); 25 | } -------------------------------------------------------------------------------- /es2015/16.weakmap.js: -------------------------------------------------------------------------------- 1 | var weakMap = new WeakMap(); 2 | 3 | var obj1 = {} 4 | var obj2 = {} 5 | 6 | 7 | weakMap.set(obj1, 1); 8 | weakMap.set(obj2, 2); 9 | weakMap.set({}, {"four": 4}); 10 | 11 | console.log(weakMap.get(obj2)); // 2 12 | console.log(weakMap.has({})); // return false even though empty object exists as key. Because the keys have different references 13 | 14 | delete obj2; 15 | console.log(weakMap.get(obj2)); // 2 16 | weakMap.delete(obj1) 17 | console.log(weakMap.get(obj1)); //undefined -------------------------------------------------------------------------------- /es2015/17.unicode.js: -------------------------------------------------------------------------------- 1 | let str = '𠮷'; 2 | 3 | // new string form 4 | console.log('\u{20BB7}'); // "𠮷" 5 | 6 | // new RegExp u mode 7 | console.log(new RegExp('\u{20BB7}', 'u')); 8 | console.log(/^.$/u.test(str)); // true 9 | 10 | //API methods 11 | console.log(str.codePointAt(0)); // 134071 12 | console.log(str.codePointAt(1)); // 57271 13 | 14 | console.log(String.fromCodePoint(134071)); // "𠮷" -------------------------------------------------------------------------------- /es2015/18.symbols.js: -------------------------------------------------------------------------------- 1 | //1. Object properties 2 | let id = Symbol("id"); 3 | let user = { 4 | name: "John", 5 | age: 40, 6 | [id]: 111 7 | }; 8 | 9 | for (let key in user) { 10 | console.log(key); // name, age without symbols 11 | } 12 | 13 | console.log(JSON.stringify(user)); // {"name":"John", "age": 40} 14 | console.log(Object.keys(user)); // ["name", "age"] 15 | 16 | console.log( "User Id: " + user[id] ); // Direct access by the symbol works 17 | 18 | //2. Unique constants 19 | const logLevels = { 20 | DEBUG: Symbol('debug'), 21 | INFO: Symbol('info'), 22 | WARN: Symbol('warn'), 23 | ERROR: Symbol('error'), 24 | }; 25 | console.log(logLevels.DEBUG, 'debug message'); 26 | console.log(logLevels.INFO, 'info message'); 27 | 28 | //3. Equality Checks 29 | 30 | console.log(Symbol('foo') === Symbol('foo')); // false 31 | console.log(Symbol.for('foo') === Symbol.for('foo')); // true -------------------------------------------------------------------------------- /es2015/19.proxies.js: -------------------------------------------------------------------------------- 1 | const target = { 2 | name: "John", 3 | age: 3 4 | }; 5 | 6 | const handler = { 7 | get: function(target, prop) { 8 | return prop in target ? 9 | target[prop] : 10 | `${prop} does not exist'; 11 | } 12 | }; 13 | 14 | const user = new Proxy(target, handler); 15 | console.log(user.name); // John 16 | console.log(user.age); // 3 17 | console.log(user.gender); // gender does not exist 18 | 19 | // validations 20 | 21 | let ageValidator = { 22 | set: function(obj, prop, value) { 23 | if (prop === 'age') { 24 | if (!Number.isInteger(value)) { 25 | throw new TypeError('The age is not an integer'); 26 | } 27 | if (value > 200) { 28 | throw new RangeError('Invalid age'); 29 | } 30 | } 31 | 32 | obj[prop] = value; // The default behavior to store the value 33 | 34 | return true; // Indicate success 35 | } 36 | }; 37 | 38 | const person = new Proxy({}, ageValidator); 39 | 40 | person.age = 30; 41 | console.log(person.age); // 30 42 | person.age = 'old'; // Throws an exception 43 | person.age = 200; // Throws an exception -------------------------------------------------------------------------------- /es2015/2.arrow-functions.js: -------------------------------------------------------------------------------- 1 | // Arrow functions were introduced in ES6 (ES2015) as a new syntax for writing JavaScript functions. 2 | // They provide a more concise syntax and lexical 'this' binding. 3 | 4 | // 1. Single parameter and single statement 5 | // No parentheses needed for single parameter 6 | const message = name => console.log(`Hello, ${name}!`); 7 | message("Sudheer"); // Hello, Sudheer! 8 | 9 | // 2. Multiple parameters and single statement 10 | // Parentheses required for multiple parameters 11 | const multiply = (x, y) => x * y; 12 | console.log(multiply(2, 3)); // 6 13 | 14 | // 3. Single parameter and multiple statements 15 | // Curly braces required for multiple statements 16 | const even = number => { 17 | if(number % 2 === 0) { 18 | console.log("Even"); 19 | } else { 20 | console.log("Odd"); 21 | } 22 | }; 23 | even(5); // Odd 24 | 25 | // 4. Multiple parameters and multiple statements 26 | const divide = (x, y) => { 27 | if(y !== 0) { 28 | return x / y; 29 | } 30 | return "Cannot divide by zero"; 31 | }; 32 | console.log(divide(100, 5)); // 20 33 | console.log(divide(100, 0)); // Cannot divide by zero 34 | 35 | // 5. No parameter and single statement 36 | // Empty parentheses required when no parameters 37 | const greet = () => console.log('Hello World!'); 38 | greet(); // Hello World! 39 | 40 | // 6. Lexical 'this' binding 41 | // Arrow functions don't have their own 'this' context 42 | const person = { 43 | name: 'John', 44 | regularFunction: function() { 45 | console.log(this.name); // 'John' 46 | }, 47 | arrowFunction: () => { 48 | console.log(this.name); // undefined (or global 'name' if defined) 49 | } 50 | }; 51 | // person.regularFunction(); 52 | // person.arrowFunction(); 53 | -------------------------------------------------------------------------------- /es2015/20.promises.js: -------------------------------------------------------------------------------- 1 | const promise = new Promise(function(resolve, reject) { 2 | setTimeout(() => resolve(1), 1000); 3 | }); 4 | 5 | promise.then(function(result) { 6 | 7 | console.log(result); // 1 8 | return result * 2; 9 | 10 | }).then(function(result) { 11 | 12 | console.log(result); // 2 13 | return result * 3; 14 | 15 | }).then(function(result) { 16 | 17 | console.log(result); // 6 18 | return result * 4; 19 | 20 | }).catch(function(error){ 21 | console.log(error); 22 | }); -------------------------------------------------------------------------------- /es2015/21.reflect.js: -------------------------------------------------------------------------------- 1 | // Creating objects using Reflect.construct() 2 | class User { 3 | constructor(firstName, lastName) { 4 | this.firstName = firstName; 5 | this.lastName = lastName; 6 | } 7 | get fullName() { 8 | return `${this.firstName} ${this.lastName}`; 9 | } 10 | }; 11 | 12 | let args = ['John', 'Emma']; 13 | 14 | let john = Reflect.construct( 15 | User, 16 | args 17 | ); 18 | 19 | console.log(john instanceof User); 20 | console.log(john.fullName); // John Doe 21 | 22 | //Calling a function using Reflect.apply() 23 | const max = Reflect.apply(Math.max, Math, [100, 200, 300]); 24 | console.log(max); 25 | 26 | //Defining a property using Reflect.defineProperty() 27 | class User { 28 | constructor(firstName, lastName) { 29 | this.firstName = firstName; 30 | this.lastName = lastName; 31 | } 32 | get fullName() { 33 | return `${this.firstName} ${this.lastName}`; 34 | } 35 | }; 36 | 37 | let john = new User('John', 'Resig'); 38 | 39 | if (Reflect.defineProperty(john, 'age', { 40 | writable: true, 41 | configurable: true, 42 | enumerable: false, 43 | value: 33, 44 | })) { 45 | console.log(john.age); 46 | } else { 47 | console.log('Cannot define the age property on the user object.'); 48 | 49 | } 50 | 51 | //Delete property using Reflect.deleteProperty() 52 | const user = { 53 | name: 'John', 54 | age: 33 55 | }; 56 | 57 | console.log(Reflect.deleteProperty(user, 'age')); // true 58 | console.log(user.age); // undefined 59 | 60 | //Get property of an object using Reflect.get() 61 | const user = { 62 | name: 'John', 63 | age: 33 64 | }; 65 | 66 | console.log(Reflect.get(user, 'age')); // 33 -------------------------------------------------------------------------------- /es2015/22.binary-octal.js: -------------------------------------------------------------------------------- 1 | //Binary literals 2 | const num = 0b110; 3 | console.log(num); // 6 4 | 5 | //Octal literals 6 | const num = 055; 7 | console.log(num); // 45 8 | 9 | const invalidNum = 028; 10 | console.log(invalidNum); // treated as decimal 28 11 | -------------------------------------------------------------------------------- /es2015/23.proper-tail-calls.js: -------------------------------------------------------------------------------- 1 | function factorial(n, acc = 1) { 2 | if (n === 0) { 3 | return acc 4 | } 5 | return factorial(n - 1, n * acc) 6 | } 7 | console.log(factorial(5)); //120 8 | 9 | console.log(factorial(10)); 10 | console.log(factorial(100)); 11 | console.log(factorial(1000)); 12 | console.log(factorial(10000)); -------------------------------------------------------------------------------- /es2015/3.classes.js: -------------------------------------------------------------------------------- 1 | // Class declarations 2 | class Square { 3 | constructor(length) { 4 | this.length = length; 5 | } 6 | 7 | get area() { 8 | return this.length * this.length; 9 | } 10 | 11 | set area(value) { 12 | this.area = value; 13 | } 14 | } 15 | 16 | // Class expression 17 | const square = class Square { 18 | constructor(length) { 19 | this.length = length; 20 | } 21 | 22 | get area() { 23 | return this.length * this.length; 24 | } 25 | 26 | set area(value) { 27 | this.area = value; 28 | } 29 | } 30 | 31 | // Inheritance 32 | class Vehicle { 33 | constructor(name) { 34 | this.name = name; 35 | } 36 | 37 | start() { 38 | console.log(`${this.name} vehicle started`); 39 | } 40 | } 41 | 42 | class Car extends Vehicle { 43 | start() { 44 | console.log(`${this.name} car started`); 45 | } 46 | } 47 | 48 | const car = new Car('BMW'); 49 | console.log(car.start()); // BMW car started -------------------------------------------------------------------------------- /es2015/4.enhanced-object-literals.js: -------------------------------------------------------------------------------- 1 | // Property shorthand 2 | var a = 1, b = 2, c = 3; 3 | obj = { 4 | a, 5 | b, 6 | c 7 | }; 8 | console.log(obj); 9 | 10 | // Method shorthand 11 | var calculation = { 12 | sum(a, b) { return a + b; }, 13 | multiply(a, b) { return a * b; } 14 | }; 15 | 16 | console.log( calculation.sum(5, 3) ); // 15 17 | console.log( calculation.multiply(5, 3) ); // 15 18 | 19 | // Computed Property Names 20 | const 21 | key = 'three', 22 | computedObj = { 23 | one: 1, 24 | two: 2, 25 | [key]: 3 26 | }; -------------------------------------------------------------------------------- /es2015/5.template-literals.js: -------------------------------------------------------------------------------- 1 | // Template literals 2 | const firstName = 'John'; 3 | console.log(`Hello ${firstName}! 4 | Good morning!`); 5 | 6 | // Tagged template literals 7 | const Button = styled.a` 8 | display: inline-block; 9 | border-radius: 3px; 10 | ` -------------------------------------------------------------------------------- /es2015/6.destructuring.js: -------------------------------------------------------------------------------- 1 | // Destructuring is a JavaScript expression that allows us to extract data from arrays, 2 | // objects, and maps and set them into new, distinct variables. 3 | // Introduced in ES6 (ES2015), it provides a more concise and readable way to extract values. 4 | 5 | // 1. OBJECT DESTRUCTURING 6 | console.log("--- OBJECT DESTRUCTURING ---"); 7 | 8 | // Basic object destructuring 9 | const user = { firstName: 'John', lastName: 'Kary', age: 30 }; 10 | const { firstName, lastName } = user; 11 | console.log("Basic:", firstName, lastName); // John Kary 12 | 13 | // Assigning to new variable names 14 | const { firstName: fName, lastName: lName } = user; 15 | console.log("New variable names:", fName, lName); // John Kary 16 | 17 | // Default values (used when property doesn't exist) 18 | const { firstName: first, middleName = 'M', age } = user; 19 | console.log("With defaults:", first, middleName, age); // John M 30 20 | 21 | // Nested object destructuring 22 | const employee = { 23 | id: 1001, 24 | name: { 25 | first: 'Jane', 26 | last: 'Smith' 27 | }, 28 | department: 'Engineering' 29 | }; 30 | const { name: { first: employeeFirst, last: employeeLast }, department } = employee; 31 | console.log("Nested:", employeeFirst, employeeLast, department); // Jane Smith Engineering 32 | 33 | // Rest operator in object destructuring 34 | const { firstName: userFirst, ...rest } = user; 35 | console.log("Rest operator:", userFirst, rest); // John { lastName: 'Kary', age: 30 } 36 | 37 | // 2. ARRAY DESTRUCTURING 38 | console.log("\n--- ARRAY DESTRUCTURING ---"); 39 | 40 | // Basic array destructuring 41 | const colors = ['red', 'green', 'blue']; 42 | const [first1, second, third] = colors; 43 | console.log("Basic:", first1, second, third); // red green blue 44 | 45 | // Skipping elements 46 | const [red, , blue] = colors; 47 | console.log("Skipping elements:", red, blue); // red blue 48 | 49 | // Default values 50 | const [primary, secondary, tertiary, quaternary = 'yellow'] = colors; 51 | console.log("With defaults:", primary, secondary, tertiary, quaternary); // red green blue yellow 52 | 53 | // Swapping variables without a temporary variable 54 | let a = 1; 55 | let b = 2; 56 | [a, b] = [b, a]; 57 | console.log("Swapped variables:", a, b); // 2 1 58 | 59 | // Rest operator in array destructuring 60 | const [first2, ...remaining] = colors; 61 | console.log("Rest operator:", first2, remaining); // red ['green', 'blue'] 62 | 63 | // 3. FUNCTION PARAMETER DESTRUCTURING 64 | console.log("\n--- FUNCTION PARAMETER DESTRUCTURING ---"); 65 | 66 | // Object parameter destructuring 67 | function printUserInfo({ firstName, lastName, age = 25 }) { 68 | console.log(`Name: ${firstName} ${lastName}, Age: ${age}`); 69 | } 70 | printUserInfo(user); // Name: John Kary, Age: 30 71 | 72 | // Array parameter destructuring 73 | function printRGB([r, g, b]) { 74 | console.log(`RGB: ${r}, ${g}, ${b}`); 75 | } 76 | printRGB(colors); // RGB: red, green, blue 77 | 78 | // 4. PRACTICAL USE CASES 79 | console.log("\n--- PRACTICAL USE CASES ---"); 80 | 81 | // Returning multiple values from a function 82 | function getUserInfo() { 83 | return { 84 | id: 123, 85 | name: 'Alice', 86 | email: 'alice@example.com' 87 | }; 88 | } 89 | const { id, name, email } = getUserInfo(); 90 | console.log("Multiple return values:", id, name, email); // 123 Alice alice@example.com 91 | 92 | // Destructuring in loops 93 | const users = [ 94 | { id: 1, name: 'John' }, 95 | { id: 2, name: 'Jane' } 96 | ]; 97 | for (const { id: userId, name: userName } of users) { 98 | console.log(`User: ${userId} - ${userName}`); 99 | } 100 | // User: 1 - John 101 | // User: 2 - Jane 102 | -------------------------------------------------------------------------------- /es2015/7.default-parameters.js: -------------------------------------------------------------------------------- 1 | function add(a = 10, b = 20) { 2 | return a + b; 3 | } 4 | add(20); // 40 5 | add(); // 30 -------------------------------------------------------------------------------- /es2015/8.rest-parameter.js: -------------------------------------------------------------------------------- 1 | function sum(...args) { 2 | return args.reduce((previous, current) => { 3 | return previous + current; 4 | }); 5 | } 6 | 7 | console.log(sum(1, 2, 3)); // 6 8 | console.log(sum(1, 2, 3, 4)); // 10 9 | console.log(sum(1, 2, 3, 4, 5)); // 15 -------------------------------------------------------------------------------- /es2015/9.spread-operator.js: -------------------------------------------------------------------------------- 1 | // In function and constructor calls 2 | console.log(Math.max(...[-10, 30, 10, 20])); //30 3 | console.log(Math.max(-10, ...[-50, 10], 30)); //30 4 | 5 | // In Array literals and strings 6 | console.log([1, ...[2,3], 4, ...[5, 6, 7]]); // 1, 2, 3, 4, 5, 6, 7 -------------------------------------------------------------------------------- /es2016/array-includes.js: -------------------------------------------------------------------------------- 1 | const array = [1,2,3,4,5,6]; 2 | if(array.includes(5)){ 3 | console.log("Found an element"); 4 | } 5 | 6 | let numbers = [1, 2, 3, 4, NaN, ,]; 7 | console.log(numbers.includes(NaN)); // true 8 | console.log(numbers.includes(undefined)); // true -------------------------------------------------------------------------------- /es2016/exponential-operator.js: -------------------------------------------------------------------------------- 1 | //Prior ES7 2 | const cube = x => Math.pow(x, 3); 3 | console.log(cube(3)); // 27 4 | 5 | //Using ES7 6 | const cube1 = x => x ** 3; 7 | console.log(cube1(3)); // 27 -------------------------------------------------------------------------------- /es2017/1.async-functions.js: -------------------------------------------------------------------------------- 1 | async function logger() { 2 | 3 | let data = await fetch('http://someapi.com/users'); // pause until fetch returns 4 | console.log(data) 5 | } 6 | logger(); -------------------------------------------------------------------------------- /es2017/2.object-values.js: -------------------------------------------------------------------------------- 1 | // Object argument 2 | const countries = { 3 | IN: 'India', 4 | SG: 'Singapore', 5 | } 6 | Object.values(countries) // ['India', 'Singapore'] 7 | 8 | // Non-object argument 9 | console.log(Object.values(['India', 'Singapore'])); // ['India', 'Singapore'] 10 | console.log(Object.values('India')); // ['I', 'n', 'd', 'i', 'a'] -------------------------------------------------------------------------------- /es2017/3.object-entries.js: -------------------------------------------------------------------------------- 1 | // Object argument 2 | const countries = { 3 | IN: 'India', 4 | SG: 'Singapore', 5 | } 6 | Object.entries(countries) // [["IN", "India"], ["SG", "Singapore"]] 7 | 8 | // Non-object argument 9 | const countriesArr = ['India', 'Singapore']; 10 | console.log(Object.entries(countriesArr)); // [ ['0', 'India'], ['1', 'Singapore']] 11 | 12 | const country = 'India'; 13 | console.log(Object.entries(country)); // [["0", "I"], ["1", "n"], ["2", "d"], ["3", "i"], ["4", "a"]] 14 | 15 | console.log(Object.entries(100)); // [], an empty array for any primitive type because it won't have any own properties -------------------------------------------------------------------------------- /es2017/4.object-property-descriptors.js: -------------------------------------------------------------------------------- 1 | const profile = { 2 | age: 42 3 | }; 4 | 5 | const descriptors = Object.getOwnPropertyDescriptors(profile); 6 | console.log(descriptors); // {age: {configurable: true, enumerable: true, writable: true }} -------------------------------------------------------------------------------- /es2017/5.string-padding.js: -------------------------------------------------------------------------------- 1 | // Pad start 2 | const cardNumber = '01234567891234'; 3 | const lastFourDigits = cardNumber.slice(-4); 4 | const maskedCardNumber = lastFourDigits.padStart(cardNumber.length, '*'); 5 | console.log(maskedCardNumber); // expected output: "**********1234" 6 | 7 | // Pad End 8 | const label1 = "Name"; 9 | const label2 = "Phone Number"; 10 | const value1 = "John" 11 | const value2 = "(222)-333-3456"; 12 | 13 | console.log((label1 + ': ').padEnd(20, ' ') + value1); 14 | console.log(label2 + ": " + value2); // Name: John 15 | // Phone Number: (222)-333-3456 -------------------------------------------------------------------------------- /es2017/6.shared-memory-atomics.js: -------------------------------------------------------------------------------- 1 | // Atomic operations 2 | const sharedMemory = new SharedArrayBuffer(1024); 3 | const sharedArray = new Uint8Array(sharedMemory); 4 | sharedArray[0] = 10; 5 | 6 | Atomics.add(sharedArray, 0, 20); 7 | console.log(Atomics.load(sharedArray, 0)); // 30 8 | 9 | Atomics.sub(sharedArray, 0, 10); 10 | console.log(Atomics.load(sharedArray, 0)); // 20 11 | 12 | Atomics.and(sharedArray, 0, 5); 13 | console.log(Atomics.load(sharedArray, 0)); // 4 14 | 15 | Atomics.or(sharedArray, 0, 1); 16 | console.log(Atomics.load(sharedArray, 0)); // 5 17 | 18 | Atomics.xor(sharedArray, 0, 1); 19 | console.log(Atomics.load(sharedArray, 0)); // 4 20 | 21 | Atomics.store(sharedArray, 0, 10); // 10 22 | 23 | Atomics.compareExchange(sharedArray, 0, 5, 10); 24 | console.log(Atomics.load(sharedArray, 0)); // 10 25 | 26 | Atomics.exchange(sharedArray, 0, 10); 27 | console.log(Atomics.load(sharedArray, 0)); //10 28 | 29 | Atomics.isLockFree(1); // true 30 | 31 | // waiting to be notified 32 | const sharedMemory = new SharedArrayBuffer(1024); 33 | const sharedArray = new Int32Array(sharedMemory); 34 | 35 | Atomics.wait(sharedArray, 0, 10); 36 | console.log(sharedArray[0]); // 100 37 | 38 | Atomics.store(sharedArray, 0, 100); 39 | Atomics.notify(sharedArray, 0, 1); -------------------------------------------------------------------------------- /es2017/7.trailing-commas.js: -------------------------------------------------------------------------------- 1 | // Params include trailing comma 2 | function func(a,b,) { // declaration 3 | console.log(a, b); 4 | } 5 | func(1,2,); // invocation 6 | 7 | // function call only contains a comma 8 | function func1(,) { // SyntaxError: missing formal parameter 9 | console.log('no args'); 10 | }; 11 | func1(,); // SyntaxError: expected expression, got ',' -------------------------------------------------------------------------------- /es2018/1.async-iterators.js: -------------------------------------------------------------------------------- 1 | const arr = ['a', 'b', 'c', 'd']; 2 | const syncIterator = arr[Symbol.iterator](); 3 | 4 | console.log(syncIterator.next()); //{value: a, done: false} 5 | console.log(syncIterator.next()); //{value: b, done: false} 6 | console.log(syncIterator.next()); //{value: c, done: false} 7 | console.log(syncIterator.next()); //{value: d, done: false} 8 | console.log(syncIterator.next()); //{value: undefined, done: true} -------------------------------------------------------------------------------- /es2018/2.object-rest-spread-operators.js: -------------------------------------------------------------------------------- 1 | // Rest parameters 2 | 3 | function myfunc(p1, p2, ...p3) { 4 | console.log(p1, p2, p3); // 1, 2, [3, 4, 5, 6] 5 | } 6 | myfunc(1, 2, 3, 4, 5, 6); 7 | 8 | // spread operator 9 | const myArray = [10, 5, 25, -100, 200, -200]; 10 | console.log( Math.max(...myArray) ); // 200 11 | 12 | // Rest parameters for objects 13 | function myfunc1({ a, ...x }) { 14 | console.log(a, x); // 1, { b: 2, c: 3, d:4 } 15 | } 16 | myfunc1({ 17 | a: 1, 18 | b: 2, 19 | c: 3, 20 | d: 4 21 | }); 22 | 23 | // spread operator for objects 24 | const myObject = { a: 1, b: 2, c: 3, d:4 }; 25 | const myNewObject = { ...myObject, e: 5 }; // { a: 1, b: 2, c: 3, d: 4, e: 5 } -------------------------------------------------------------------------------- /es2018/3.promise-finally.js: -------------------------------------------------------------------------------- 1 | let isLoading = true; 2 | fetch('http://somesite.com/users') 3 | .then(data => data.json()) 4 | .catch(err => console.error(err)) 5 | .finally(() => { 6 | isLoading = false; 7 | console.log('Finished loading!!'); 8 | }) -------------------------------------------------------------------------------- /es2019/1.array-flat-flatmap.js: -------------------------------------------------------------------------------- 1 | // flat 2 | const numberArray = [[1, 2], [[3], 4], [5, 6]]; 3 | const charArray = ['a', , 'b', , , ['c', 'd'], 'e']; 4 | const flattenedArrOneLevel = numberArray.flat(1); 5 | const flattenedArrTwoLevel = numberArray.flat(2); 6 | const flattenedCharArrOneLevel = charArray.flat(1); 7 | 8 | console.log(flattenedArrOneLevel); // [1, 2, [3], 4, 5, 6] 9 | console.log(flattenedArrTwoLevel); // [1, 2, 3, 4, 5, 6] 10 | console.log(flattenedCharArrOneLevel); // ['a', 'b', 'c', 'd', 'e'] 11 | 12 | // flatMap 13 | const numberArray1 = [[1], [2], [3], [4], [5]]; 14 | 15 | console.log(numberArray1.flatMap(value => [value * 10])); // [10, 20, 30, 40, 50] -------------------------------------------------------------------------------- /es2019/2.object-fromentries.js: -------------------------------------------------------------------------------- 1 | // Iterable to objects 2 | const arr = [ ['a', '1'], ['b', '2'], ['c', '3'] ]; 3 | const obj = Object.fromEntries(arr); 4 | console.log(obj); // { a: "1", b: "2", c: "3" } 5 | 6 | // URLParams 7 | const paramsString = 'param1=foo¶m2=baz'; 8 | const searchParams = new URLSearchParams(paramsString); 9 | 10 | Object.fromEntries(searchParams); // => {param1: "foo", param2: "baz"} -------------------------------------------------------------------------------- /es2019/3.trimstart-trimend.js: -------------------------------------------------------------------------------- 1 | let messageTwo = " Hello World!! "; 2 | console.log(messageTwo.trimStart()); //Hello World!! 3 | console.log(messageTwo.trimEnd()); // Hello World!! -------------------------------------------------------------------------------- /es2019/4.symbol-description.js: -------------------------------------------------------------------------------- 1 | console.log(Symbol('one').description); // one 2 | 3 | console.log(Symbol.for('one').description); // "one" 4 | 5 | console.log(Symbol('').description); // '' 6 | 7 | console.log(Symbol().description); // unefined 8 | 9 | console.log(Symbol.iterator.description); // "Symbol.iterator" -------------------------------------------------------------------------------- /es2019/5.optional-catch-binding.js: -------------------------------------------------------------------------------- 1 | let isTheFeatureImplemented = false; 2 | try { 3 | if(isFeatureSupported()) { 4 | isTheFeatureImplemented = true; 5 | } 6 | } catch (unused) {} -------------------------------------------------------------------------------- /es2019/6.json-improvements.js: -------------------------------------------------------------------------------- 1 | // JSON Superset 2 | console.log(JSON.parse('"\u2028"')); // '' 3 | 4 | // Well Formed JSON.Stringify 5 | console.log(JSON.stringify("\uD800")); // '"\ud800"' -------------------------------------------------------------------------------- /es2019/7.array-stable-sort.js: -------------------------------------------------------------------------------- 1 | const users = [ 2 | { name: "Albert", age: 30 }, 3 | { name: "Bravo", age: 30 }, 4 | { name: "Colin", age: 30 }, 5 | { name: "Rock", age: 50 }, 6 | { name: "Sunny", age: 50 }, 7 | { name: "Talor", age: 50 }, 8 | { name: "John", age: 25 }, 9 | { name: "Kindo", age: 25 }, 10 | { name: "Lary", age: 25 }, 11 | { name: "Minjie", age: 25 }, 12 | { name: "Nova", age: 25 } 13 | ] 14 | users.sort((a, b) => a.age - b.age); -------------------------------------------------------------------------------- /es2019/8.function-tostring.js: -------------------------------------------------------------------------------- 1 | function sayHello(message) { 2 | let msg = message; 3 | //Print message 4 | console.log(`Hello, ${msg}`); 5 | } 6 | 7 | console.log(sayHello.toString()); 8 | // function sayHello(message) { 9 | // let msg = message; 10 | // //Print message 11 | // console.log(`Hello, ${msg}`); 12 | // } -------------------------------------------------------------------------------- /es2020/bigint.js: -------------------------------------------------------------------------------- 1 | // BigInt is a built-in object introduced in ES2020 (ES11) that provides a way to represent 2 | // integers larger than 2^53 - 1, which is the largest number JavaScript can reliably represent 3 | // with the Number primitive. 4 | 5 | // 1. Limitations of the current number system 6 | console.log("Maximum safe integer in JavaScript:", Number.MAX_SAFE_INTEGER); // 9007199254740991 7 | const max = Number.MAX_SAFE_INTEGER; 8 | console.log("max + 1:", max + 1); // 9007199254740992 9 | console.log("max + 2:", max + 2); // 9007199254740992 (Notice this is the same as max + 1, showing precision loss) 10 | 11 | // 2. BigInt representation - three ways to create BigInts 12 | // a) Using the 'n' suffix 13 | const bigInt = 9007199254740991n; 14 | console.log("Using 'n' suffix:", bigInt); 15 | 16 | // b) Using BigInt constructor with a number 17 | const bigIntFromNumber = BigInt(9007199254740991); 18 | console.log("Using BigInt constructor with number:", bigIntFromNumber); // 9007199254740991n 19 | 20 | // c) Using BigInt constructor with a string (useful for very large numbers) 21 | const bigIntFromString = BigInt("9007199254740991"); 22 | console.log("Using BigInt constructor with string:", bigIntFromString); // 9007199254740991n 23 | 24 | // 3. Type checking with typeof 25 | console.log("\nType checking:"); 26 | console.log("typeof 1:", typeof 1); // number 27 | console.log("typeof 1n:", typeof 1n); // bigint 28 | console.log("typeof BigInt('1'):", typeof BigInt('1')); // bigint 29 | 30 | // 4. Arithmetic operators with BigInt 31 | console.log("\nArithmetic operations with BigInt:"); 32 | const previousMaxNum = BigInt(Number.MAX_SAFE_INTEGER); 33 | console.log("Addition:", previousMaxNum + 2n); // 9007199254740993n (this was not possible with regular numbers) 34 | console.log("Subtraction:", previousMaxNum - 2n); // 9007199254740989n 35 | console.log("Multiplication:", previousMaxNum * 2n); // 18014398509481982n 36 | console.log("Division:", previousMaxNum / 2n); // 4503599627370495n 37 | console.log("Modulus:", previousMaxNum % 2n); // 1n 38 | 39 | // 5. Comparison operations 40 | console.log("\nComparison operations:"); 41 | console.log("1n === 1:", 1n === 1); // false (strict equality checks type) 42 | console.log("1n === BigInt(1):", 1n === BigInt(1)); // true (same type and value) 43 | console.log("1n == 1:", 1n == 1); // true (loose equality converts types) 44 | 45 | // 6. Limitations of BigInt 46 | console.log("\nLimitations of BigInt:"); 47 | // Cannot mix BigInt and other types in operations 48 | try { 49 | console.log(1n + 1); 50 | } catch (error) { 51 | console.log("Error when mixing types:", error.message); // Cannot mix BigInt and other types 52 | } 53 | 54 | // No support for decimal points 55 | console.log("BigInt(1.5):", BigInt(1.5)); // 1n (decimal part is truncated) 56 | 57 | // 7. Use cases for BigInt 58 | console.log("\nUse cases for BigInt:"); 59 | console.log("- Working with large integers beyond Number.MAX_SAFE_INTEGER"); 60 | console.log("- Cryptography and security applications"); 61 | console.log("- High-precision timestamps"); 62 | console.log("- Scientific calculations requiring high precision"); 63 | -------------------------------------------------------------------------------- /es2020/dynamic-import/async-dynamic-import.js: -------------------------------------------------------------------------------- 1 | (async function() { 2 | const moduleSpecifier = './message.js'; 3 | const messageModule = await import(moduleSpecifier); 4 | messageModule.default(); // Hello, default export 5 | messageModule.sayGoodBye(); //Bye, named export 6 | })(); -------------------------------------------------------------------------------- /es2020/dynamic-import/dynamic-import.js: -------------------------------------------------------------------------------- 1 | const moduleSpecifier = './message.js'; 2 | import(moduleSpecifier) 3 | .then((module) => { 4 | module.default(); // Hello, default export 5 | module.sayGoodBye(); //Bye, named export 6 | }) 7 | .catch( err => console.log('loading error')); -------------------------------------------------------------------------------- /es2020/dynamic-import/message.js: -------------------------------------------------------------------------------- 1 | export default () => { 2 | return "Hello, default export"; 3 | } 4 | export const sayGoodBye = () => { 5 | return "Bye, named export" 6 | } 7 | -------------------------------------------------------------------------------- /es2020/for-in-order.js: -------------------------------------------------------------------------------- 1 | var object = { 2 | 'a': 2, 3 | 'b': 3, 4 | 'c': 4 5 | } 6 | 7 | 8 | for(let key in object) { 9 | console.log(key); // a b c 10 | } -------------------------------------------------------------------------------- /es2020/globalThis.js: -------------------------------------------------------------------------------- 1 | var getGlobal = function () { 2 | if (typeof self !== 'undefined') { return self; } 3 | if (typeof window !== 'undefined') { return window; } 4 | if (typeof global !== 'undefined') { return global; } 5 | throw new Error('unable to locate global object'); 6 | }; 7 | 8 | var globals = getGlobal(); 9 | 10 | if (typeof globals.setTimeout !== 'function') { 11 | console.log('no setTimeout in this environment or runtime'); 12 | } 13 | 14 | if (typeof globalThis.setTimeout !== 'function') { 15 | console.log('no setTimeout in this environment or runtime'); 16 | } -------------------------------------------------------------------------------- /es2020/import-meta/import-meta.js: -------------------------------------------------------------------------------- 1 | console.log(import.meta); // { url: "file:///home/user/my-module.js" } -------------------------------------------------------------------------------- /es2020/import-meta/my-module.js: -------------------------------------------------------------------------------- 1 | console.log("'I'm a module"); -------------------------------------------------------------------------------- /es2020/nullish-coalescing-operator.js: -------------------------------------------------------------------------------- 1 | let vehicle = { 2 | car: { 3 | name: "", 4 | speed: 0 5 | } 6 | }; 7 | 8 | console.log(vehicle.car.name || "Unknown"); // Unknown 9 | console.log(vehicle.car.speed || 90); // 90 10 | 11 | console.log(vehicle.car.name ?? "Unknown"); // ""(empty is valid case for name) 12 | console.log(vehicle.car.speed ?? 90); // 0(zero is valid case for speed) -------------------------------------------------------------------------------- /es2020/optional-chaining.js: -------------------------------------------------------------------------------- 1 | let vehicle = { 2 | }; 3 | 4 | let vehicle1 = { 5 | car: { 6 | name: 'ABC', 7 | speed: 90 8 | } 9 | }; 10 | 11 | 12 | console.log(vehicle.car?.name); // Undefined 13 | console.log(vehicle.car?.speed); // Undefined 14 | 15 | console.log(vehicle1.car?.name); // ABC 16 | console.log(vehicle1.car?.speed); // 90 17 | 18 | console.log(vehicle.car?.name ?? "Unknown"); // Unknown 19 | console.log(vehicle.car?.speed ?? 90); // 90 -------------------------------------------------------------------------------- /es2020/promise-allsettled.js: -------------------------------------------------------------------------------- 1 | const promise1 = new Promise((resolve, reject) => setTimeout(() => resolve(100), 1000)); 2 | 3 | const promise2 = new Promise((resolve, reject) => setTimeout(reject, 1000)); 4 | 5 | Promise.allSettled([promise1, promise2]).then(data => console.log(data)); // [ Object { status: "fulfilled", value: 100}, Object { status: "rejected", reason: undefined}] -------------------------------------------------------------------------------- /es2020/string.matchAll.js: -------------------------------------------------------------------------------- 1 | const regex = /t(e)(st(\d?))/g; 2 | const string = 'test1test2'; 3 | const matchesIterator = string.matchAll(regex); 4 | Array.from(matchesIterator, result => console.log(result)); // ["test1", "e", "st1", "1", index: 0, input: "test1test2", groups: undefined] 5 | //["test2", "e", "st2", "2", index: 5, input: "test1test2", groups: undefined] -------------------------------------------------------------------------------- /es2021/logical-assignment-operators/and.js: -------------------------------------------------------------------------------- 1 | let x = 10; 2 | let y = 20; 3 | x &&= y; 4 | console.log(x); // 20 -------------------------------------------------------------------------------- /es2021/logical-assignment-operators/nullish.js: -------------------------------------------------------------------------------- 1 | let x; 2 | let y = 1; 3 | x ??= y; 4 | console.log(x); // 1 -------------------------------------------------------------------------------- /es2021/logical-assignment-operators/or.js: -------------------------------------------------------------------------------- 1 | let x = 0; 2 | let y = 20; 3 | x ||= y; 4 | console.log(x); // 20 -------------------------------------------------------------------------------- /es2021/numeric-separator/big-integers.js: -------------------------------------------------------------------------------- 1 | const billion = 1000_000_000; 2 | console.log(billion); // 1000000000 3 | 4 | const trillion = 1000_000_000_000n; // BigInt number 5 | console.log(trillion); // 1000000000000 -------------------------------------------------------------------------------- /es2021/numeric-separator/binary-hex.js: -------------------------------------------------------------------------------- 1 | const binaryLiteral = 0b1010_1010; 2 | console.log(binaryLiteral); 3 | const hexLiteral = 0xFF_FF_FF_FF; 4 | console.log(hexLiteral); -------------------------------------------------------------------------------- /es2021/promise-any/promise-any-error.js: -------------------------------------------------------------------------------- 1 | (async () => { 2 | try { 3 | const output = await Promise.any([ 4 | Promise.reject('Error 1'), 5 | Promise.reject('Error 2'), 6 | Promise.reject('Error 3'), 7 | ]); 8 | console.log(`Output: ${output}`); 9 | } catch (err) { 10 | console.log(`Error: ${err.errors}`); 11 | } 12 | })(); 13 | // Error: Error1,Error2,Error3 -------------------------------------------------------------------------------- /es2021/promise-any/promise-any.js: -------------------------------------------------------------------------------- 1 | let promise1 = new Promise((resolve) => setTimeout(resolve, 100, 'Resolves after 100ms')); 2 | let promise2 = new Promise((resolve) => setTimeout(resolve, 200, 'Resolves after 200ms')); 3 | let promise3 = new Promise((resolve, reject) => setTimeout(reject, 0) ); 4 | 5 | let promises = [promise1, promise2, promise3]; 6 | 7 | Promise.any(promises) 8 | .then( value => console.log(value)); // Resolves after 100ms -------------------------------------------------------------------------------- /es2021/replace-all.js: -------------------------------------------------------------------------------- 1 | console.log('10101010'.replaceAll('0', '1')); // 11111111 2 | console.log('01010101'.replaceAll('0', '1')); // 11111111 -------------------------------------------------------------------------------- /es2021/weakref/finalizer.js: -------------------------------------------------------------------------------- 1 | // Create new FinalizationRegistry: 2 | const reg = new FinalizationRegistry((val) => { 3 | console.log(val); 4 | }); 5 | 6 | (() => { 7 | // Create new object: 8 | const obj = {} 9 | 10 | // Register finalizer for the "obj" as first argument and value for callback function as second argument: 11 | reg.register(obj, 'obj has been garbage-collected.') 12 | })(); -------------------------------------------------------------------------------- /es2021/weakref/weakref.js: -------------------------------------------------------------------------------- 1 | const myObject = new WeakRef({ 2 | name: ‘Sudheer’, 3 | age: 34 4 | }); 5 | console.log(myObject.deref()); //output: {name: “Sudheer”, age: 35} 6 | console.log(myObject.deref().name); //output: Sudheer -------------------------------------------------------------------------------- /es2022/array-at.js: -------------------------------------------------------------------------------- 1 | const array = [1, 2, 3, 4, 5]; 2 | console.log(array.at(-2)); // 4 3 | 4 | const string = '12345'; 5 | console.log(string.at(-2)); -------------------------------------------------------------------------------- /es2022/class fields/private-fields-methods.js: -------------------------------------------------------------------------------- 1 | class Employee { 2 | name = "John"; 3 | #age=35; 4 | constructor() { 5 | } 6 | 7 | #getAge() { 8 | return #age 9 | } 10 | 11 | } 12 | 13 | const employee = new Employee(); 14 | employee.name = "Jack"; 15 | employee.#age = 35; // Throws an error -------------------------------------------------------------------------------- /es2022/class fields/static-fields-methods.js: -------------------------------------------------------------------------------- 1 | class Employee{ 2 | name = "John"; 3 | static #employerName="Github" 4 | 5 | static #getEmployerName() { 6 | return #employerName 7 | } 8 | } 9 | const employee = new Employee(); 10 | employee.emp = "Jack"; 11 | employee.#employerName = 35; // Throws an error -------------------------------------------------------------------------------- /es2022/error-cause.js: -------------------------------------------------------------------------------- 1 | function processData(arrayData) { 2 | return arrayData.map(data => { 3 | try { 4 | const json = JSON.parse(data); 5 | return json; 6 | } catch (err) { 7 | throw new Error( 8 | `Data processing failed`, 9 | {cause: err} 10 | ); 11 | } 12 | }); 13 | } 14 | 15 | processData({"one": 1, "two": 2}); -------------------------------------------------------------------------------- /es2022/hasOwn/hasOwn-create.js: -------------------------------------------------------------------------------- 1 | const user = Object.create(null); 2 | user.age = 35; 3 | user.hasOwn('age'); // true -------------------------------------------------------------------------------- /es2022/hasOwn/hasOwn-overwritten.js: -------------------------------------------------------------------------------- 1 | const user = { 2 | age: 35, 3 | hasOwnProperty: ()=> { 4 | return false; 5 | } 6 | }; 7 | 8 | user.hasOwn('age') // true -------------------------------------------------------------------------------- /es2022/regex-indices.js: -------------------------------------------------------------------------------- 1 | const regexPatter = /(Jack)/gd; 2 | const input = 'Authos: Jack, Alexander and Jacky'; 3 | const result = [...input.matchAll(regexPatter)]; 4 | console.log(result[0]); // ['Jack', 'Jack', index: 8, input: 'Authos: Jack, Alexander and Jacky', groups: undefined, indices: Array(2)] -------------------------------------------------------------------------------- /es2023/1.array-from-last.js: -------------------------------------------------------------------------------- 1 | const isOdd = (number) => number % 2 === 1; 2 | const numbers = [1, 2, 3, 4, 5]; 3 | 4 | console.log(numbers.findLast(isOdd)); // 5 5 | console.log(numbers.findLastIndex(isOdd)); // 4 -------------------------------------------------------------------------------- /es2023/2.hashbang-syntax.js: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env node 2 | 'use strict'; 3 | console.log("Hello world from hashbang syntax"); -------------------------------------------------------------------------------- /es2023/3.symbols-as-weakmap-keys.js: -------------------------------------------------------------------------------- 1 | const weak = new WeakMap(); 2 | const key = Symbol("ref"); 3 | weak.set(key, "ES2023"); 4 | 5 | console.log(weak.get(key)); //ES2023 -------------------------------------------------------------------------------- /es2023/4.change-array-by-copy.js: -------------------------------------------------------------------------------- 1 | const numbers = [1, 3, 2, 4, 5]; 2 | 3 | // toReversed 4 | const reversedArray = numbers.toReversed(); 5 | console.log(reversedArray); // [5, 4, 2, 3, 1] 6 | console.log(numbers); // [1, 3, 2, 4, 5] 7 | 8 | // toSorted 9 | const sortedArray = numbers.toSorted(); 10 | console.log(sortedArray); // [1, 2, 3, 4, 5] 11 | console.log(numbers); // [1, 3, 2, 4, 5] 12 | 13 | // toSpliced 14 | const splicedArray = numbers.toSpliced(1, 3); 15 | console.log(splicedArray); // [1, 5] 16 | console.log(numbers); // [1, 3, 2, 4, 5] 17 | 18 | // with 19 | const replaceWithArray = numbers.with(2, 10); 20 | console.log(replaceWithArray); // [1, 3, 10, 4, 5] 21 | console.log(numbers); // [1, 3, 2, 4, 5] -------------------------------------------------------------------------------- /es2024/1.groupby-objects-maps.js: -------------------------------------------------------------------------------- 1 | const persons = [ 2 | {name:"John", age:70}, 3 | {name:"Kane", age:5}, 4 | {name:"Jack", age:50}, 5 | {name:"Rambo", age:15} 6 | ]; 7 | 8 | // Callback function to categorize people based on age 9 | function callbackFunc({ age }) { 10 | if(age >= 60) { 11 | return "senior"; 12 | } else if(age > 17 && age < 60) { 13 | return "adult"; 14 | } 15 | else { 16 | return "kid"; 17 | } 18 | } 19 | 20 | //Object groupBy 21 | const result = Object.groupBy(persons, callbackFunc); 22 | 23 | console.log("Kids: "); 24 | for (let [x,y] of result.kid.entries()) { 25 | console.log(y.name + " " + y.age); 26 | } 27 | 28 | console.log("Adults: "); 29 | for (let [x,y] of result.adult.entries()) { 30 | console.log(y.name + " " + y.age); 31 | } 32 | 33 | console.log("Seniors: "); 34 | for (let [x,y] of result.senior.entries()) { 35 | console.log(y.name + " " + y.age); 36 | } 37 | 38 | //Map groupBy 39 | const result1 = Map.groupBy(persons, callbackFunc); 40 | 41 | console.log("Kids: "); 42 | for (let x of result1.get("kid")) { 43 | console.log(x.name + " " + x.age); 44 | } 45 | 46 | console.log("Adults: "); 47 | for (let x of result1.get("adult")) { 48 | console.log(x.name + " " + x.age); 49 | } 50 | 51 | console.log("Seniors: "); 52 | for (let x of result1.get("senior")) { 53 | console.log(x.name + " " + x.age); 54 | } -------------------------------------------------------------------------------- /es2024/3.well-formed-unicode-strings.js: -------------------------------------------------------------------------------- 1 | const str1 = "Hello World \uD815"; 2 | const str2 = "Welcome to ES2024"; 3 | const str3 = "Welcome to ES2024 😀"; 4 | 5 | console.log(str1.isWellFormed()); // false 6 | console.log(str2.isWellFormed()); // true 7 | console.log(str2.isWellFormed()); // true 8 | 9 | console.log(str1.toWellFormed()); // Hello World � 10 | console.log(str2.toWellFormed()); // Welcome to ES2024 11 | 12 | const url = "https://somedomain.com/query=\uD423"; 13 | try { 14 | console.log(encodeURI(url.toWellFormed())); // https://somedomain.com/query=%ED%90%A3 15 | } catch (e) { 16 | console.log('Error:', e.message); 17 | } -------------------------------------------------------------------------------- /es2024/4.atomics-waitasync.js: -------------------------------------------------------------------------------- 1 | const arrayBuffer = new SharedArrayBuffer(1024); 2 | const arr = new Int32Array(arrayBuffer); 3 | 4 | Atomics.waitAsync(arr, 0 , 0 , 500); // { async: true, value: Promise {}} 5 | 6 | Atomics.notify(arr, 0); // { async: true, value: Promise {: 'ok'} } -------------------------------------------------------------------------------- /es2024/6.promise-withResolvers.js: -------------------------------------------------------------------------------- 1 | const { promise, resolve, reject} = Promise.withResolvers(); 2 | 3 | setTimeout(() => { Math.random() > 0.5 ? resolve("Success") : reject("Error")},1000); 4 | promise.then(result => console.log(result)).catch(error => console.error(error)); -------------------------------------------------------------------------------- /es2025/1.set-methods.js: -------------------------------------------------------------------------------- 1 | // Set Methods - New in ES2025 2 | // ES2025 introduces several new methods to the Set prototype that make working with sets more convenient 3 | 4 | // Create some sample sets 5 | const set1 = new Set([1, 2, 3, 4, 5]); 6 | const set2 = new Set([3, 4, 5, 6, 7]); 7 | const set3 = new Set([5, 6, 7, 8, 9]); 8 | 9 | console.log("Original sets:"); 10 | console.log("set1:", [...set1]); // [1, 2, 3, 4, 5] 11 | console.log("set2:", [...set2]); // [3, 4, 5, 6, 7] 12 | console.log("set3:", [...set3]); // [5, 6, 7, 8, 9] 13 | 14 | // 1. Set.prototype.union() 15 | // Returns a new Set containing all elements from both sets 16 | console.log("\n--- Set.prototype.union() ---"); 17 | const union = set1.union(set2); 18 | console.log("set1.union(set2):", [...union]); // [1, 2, 3, 4, 5, 6, 7] 19 | 20 | // Union with multiple sets 21 | const multiUnion = set1.union(set2, set3); 22 | console.log("set1.union(set2, set3):", [...multiUnion]); // [1, 2, 3, 4, 5, 6, 7, 8, 9] 23 | 24 | // 2. Set.prototype.intersection() 25 | // Returns a new Set containing elements present in all sets 26 | console.log("\n--- Set.prototype.intersection() ---"); 27 | const intersection = set1.intersection(set2); 28 | console.log("set1.intersection(set2):", [...intersection]); // [3, 4, 5] 29 | 30 | // Intersection with multiple sets 31 | const multiIntersection = set1.intersection(set2, set3); 32 | console.log("set1.intersection(set2, set3):", [...multiIntersection]); // [5] 33 | 34 | // 3. Set.prototype.difference() 35 | // Returns a new Set containing elements present in the first set but not in the second 36 | console.log("\n--- Set.prototype.difference() ---"); 37 | const difference = set1.difference(set2); 38 | console.log("set1.difference(set2):", [...difference]); // [1, 2] 39 | console.log("set2.difference(set1):", [...set2.difference(set1)]); // [6, 7] 40 | 41 | // 4. Set.prototype.symmetricDifference() 42 | // Returns a new Set containing elements present in either set but not in both 43 | console.log("\n--- Set.prototype.symmetricDifference() ---"); 44 | const symDifference = set1.symmetricDifference(set2); 45 | console.log("set1.symmetricDifference(set2):", [...symDifference]); // [1, 2, 6, 7] 46 | 47 | // 5. Set.prototype.isSubsetOf() 48 | // Returns a boolean indicating if the set is a subset of the given set 49 | console.log("\n--- Set.prototype.isSubsetOf() ---"); 50 | const subset = new Set([3, 4]); 51 | console.log("subset:", [...subset]); // [3, 4] 52 | console.log("subset.isSubsetOf(set1):", subset.isSubsetOf(set1)); // true 53 | console.log("set1.isSubsetOf(subset):", set1.isSubsetOf(subset)); // false 54 | 55 | // 6. Set.prototype.isSupersetOf() 56 | // Returns a boolean indicating if the set is a superset of the given set 57 | console.log("\n--- Set.prototype.isSupersetOf() ---"); 58 | console.log("set1.isSupersetOf(subset):", set1.isSupersetOf(subset)); // true 59 | console.log("subset.isSupersetOf(set1):", subset.isSupersetOf(set1)); // false 60 | 61 | // 7. Set.prototype.isDisjointFrom() 62 | // Returns a boolean indicating if the set has no elements in common with the given set 63 | console.log("\n--- Set.prototype.isDisjointFrom() ---"); 64 | const disjointSet = new Set([10, 11, 12]); 65 | console.log("disjointSet:", [...disjointSet]); // [10, 11, 12] 66 | console.log("set1.isDisjointFrom(disjointSet):", set1.isDisjointFrom(disjointSet)); // true 67 | console.log("set1.isDisjointFrom(set2):", set1.isDisjointFrom(set2)); // false 68 | 69 | // Practical example: Finding common interests between users 70 | console.log("\n--- Practical Example: User Interests ---"); 71 | const user1Interests = new Set(["coding", "reading", "music", "hiking"]); 72 | const user2Interests = new Set(["gaming", "music", "movies", "hiking"]); 73 | const user3Interests = new Set(["travel", "photography", "hiking", "cooking"]); 74 | 75 | // Find common interests between all users 76 | const commonInterests = user1Interests.intersection(user2Interests, user3Interests); 77 | console.log("Common interests among all users:", [...commonInterests]); // ["hiking"] 78 | 79 | // Find unique interests of user1 80 | const uniqueInterests = user1Interests.difference(user2Interests, user3Interests); 81 | console.log("Unique interests of user1:", [...uniqueInterests]); // ["coding", "reading"] 82 | 83 | // Find all interests across users 84 | const allInterests = user1Interests.union(user2Interests, user3Interests); 85 | console.log("All interests:", [...allInterests]); 86 | // ["coding", "reading", "music", "hiking", "gaming", "movies", "travel", "photography", "cooking"] -------------------------------------------------------------------------------- /es2025/2.iterator-helpers.js: -------------------------------------------------------------------------------- 1 | // Iterator Helpers - New in ES2025 2 | // ES2025 introduces several helper methods for working with iterators and iterables 3 | 4 | // Iterator helpers provide a set of utility methods that can be chained together 5 | // to perform operations on iterators in a more readable and functional way 6 | 7 | // 1. Basic Iterator Creation 8 | console.log("--- Basic Iterator Creation ---"); 9 | 10 | // Create an iterator from an array 11 | const numbers = [1, 2, 3, 4, 5]; 12 | const numbersIterator = numbers[Symbol.iterator](); 13 | 14 | console.log(numbersIterator.next()); // { value: 1, done: false } 15 | console.log(numbersIterator.next()); // { value: 2, done: false } 16 | console.log(numbersIterator.next()); // { value: 3, done: false } 17 | 18 | // 2. Iterator.prototype.map() 19 | // Maps each value in the iterator to a new value 20 | console.log("\n--- Iterator.prototype.map() ---"); 21 | 22 | function* generateNumbers() { 23 | yield 1; 24 | yield 2; 25 | yield 3; 26 | yield 4; 27 | yield 5; 28 | } 29 | 30 | const doubledIterator = generateNumbers()[Symbol.iterator]() 31 | .map(x => x * 2); 32 | 33 | console.log([...doubledIterator]); // [2, 4, 6, 8, 10] 34 | 35 | // 3. Iterator.prototype.filter() 36 | // Filters values in the iterator based on a predicate 37 | console.log("\n--- Iterator.prototype.filter() ---"); 38 | 39 | const evenIterator = generateNumbers()[Symbol.iterator]() 40 | .filter(x => x % 2 === 0); 41 | 42 | console.log([...evenIterator]); // [2, 4] 43 | 44 | // 4. Iterator.prototype.take() 45 | // Takes a specified number of values from the iterator 46 | console.log("\n--- Iterator.prototype.take() ---"); 47 | 48 | const firstThreeIterator = generateNumbers()[Symbol.iterator]() 49 | .take(3); 50 | 51 | console.log([...firstThreeIterator]); // [1, 2, 3] 52 | 53 | // 5. Iterator.prototype.drop() 54 | // Skips a specified number of values from the iterator 55 | console.log("\n--- Iterator.prototype.drop() ---"); 56 | 57 | const afterTwoIterator = generateNumbers()[Symbol.iterator]() 58 | .drop(2); 59 | 60 | console.log([...afterTwoIterator]); // [3, 4, 5] 61 | 62 | // 6. Iterator.prototype.flatMap() 63 | // Maps each value and flattens the result 64 | console.log("\n--- Iterator.prototype.flatMap() ---"); 65 | 66 | const flatMappedIterator = generateNumbers()[Symbol.iterator]() 67 | .flatMap(x => [x, x * 10]); 68 | 69 | console.log([...flatMappedIterator]); // [1, 10, 2, 20, 3, 30, 4, 40, 5, 50] 70 | 71 | // 7. Iterator.prototype.reduce() 72 | // Reduces the iterator to a single value 73 | console.log("\n--- Iterator.prototype.reduce() ---"); 74 | 75 | const sum = generateNumbers()[Symbol.iterator]() 76 | .reduce((acc, val) => acc + val, 0); 77 | 78 | console.log("Sum:", sum); // 15 79 | 80 | // 8. Iterator.prototype.toArray() 81 | // Converts the iterator to an array 82 | console.log("\n--- Iterator.prototype.toArray() ---"); 83 | 84 | const numbersArray = generateNumbers()[Symbol.iterator]() 85 | .toArray(); 86 | 87 | console.log("Array:", numbersArray); // [1, 2, 3, 4, 5] 88 | 89 | // 9. Iterator.prototype.forEach() 90 | // Executes a function for each value in the iterator 91 | console.log("\n--- Iterator.prototype.forEach() ---"); 92 | 93 | let forEachSum = 0; 94 | generateNumbers()[Symbol.iterator]() 95 | .forEach(x => { 96 | forEachSum += x; 97 | console.log("Processing:", x); 98 | }); 99 | 100 | console.log("forEach Sum:", forEachSum); // 15 101 | 102 | // 10. Iterator.prototype.some() and Iterator.prototype.every() 103 | // Check if some or all values satisfy a condition 104 | console.log("\n--- Iterator.prototype.some() and Iterator.prototype.every() ---"); 105 | 106 | const hasSomeEven = generateNumbers()[Symbol.iterator]() 107 | .some(x => x % 2 === 0); 108 | 109 | const allEven = generateNumbers()[Symbol.iterator]() 110 | .every(x => x % 2 === 0); 111 | 112 | console.log("Has some even numbers:", hasSomeEven); // true 113 | console.log("All numbers are even:", allEven); // false 114 | 115 | // 11. Chaining Iterator Helpers 116 | // Iterator helpers can be chained together for complex operations 117 | console.log("\n--- Chaining Iterator Helpers ---"); 118 | 119 | const result = generateNumbers()[Symbol.iterator]() 120 | .filter(x => x > 1) 121 | .map(x => x * 10) 122 | .take(3) 123 | .toArray(); 124 | 125 | console.log("Chained result:", result); // [20, 30, 40] 126 | 127 | // 12. Practical Example: Processing a Stream of Data 128 | console.log("\n--- Practical Example: Processing a Stream of Data ---"); 129 | 130 | function* generateUserData() { 131 | yield { id: 1, name: "Alice", age: 25 }; 132 | yield { id: 2, name: "Bob", age: 30 }; 133 | yield { id: 3, name: "Charlie", age: 35 }; 134 | yield { id: 4, name: "Dave", age: 40 }; 135 | yield { id: 5, name: "Eve", age: 45 }; 136 | } 137 | 138 | // Find users over 30, extract their names, and take the first 2 139 | const olderUserNames = generateUserData()[Symbol.iterator]() 140 | .filter(user => user.age > 30) 141 | .map(user => user.name) 142 | .take(2) 143 | .toArray(); 144 | 145 | console.log("Names of first 2 users over 30:", olderUserNames); // ["Charlie", "Dave"] 146 | 147 | // Calculate the average age of all users 148 | const totalUsers = generateUserData()[Symbol.iterator]() 149 | .toArray(); 150 | 151 | const totalAge = totalUsers.reduce((sum, user) => sum + user.age, 0); 152 | const averageAge = totalAge / totalUsers.length; 153 | 154 | console.log("Average age:", averageAge); // 35 -------------------------------------------------------------------------------- /es2025/3.temporal-api.js: -------------------------------------------------------------------------------- 1 | // Temporal API - New in ES2025 2 | // ES2025 introduces a new date and time API called Temporal 3 | // It addresses many of the limitations of the existing Date object 4 | 5 | // The Temporal API provides a modern, immutable, and more intuitive way to work with dates and times 6 | // It includes several objects for different date/time representations 7 | 8 | // 1. Temporal.Now - Get current date and time in various formats 9 | console.log("--- Temporal.Now ---"); 10 | console.log("Instant:", Temporal.Now.instant()); 11 | console.log("TimeZone:", Temporal.Now.timeZone()); 12 | console.log("PlainDate:", Temporal.Now.plainDate()); 13 | console.log("PlainTime:", Temporal.Now.plainTime()); 14 | console.log("PlainDateTime:", Temporal.Now.plainDateTime()); 15 | console.log("ZonedDateTime:", Temporal.Now.zonedDateTime()); 16 | 17 | // 2. Temporal.Instant - Represents a fixed point in time (like a timestamp) 18 | console.log("\n--- Temporal.Instant ---"); 19 | const instant = Temporal.Instant.from("2025-06-01T12:30:45Z"); 20 | console.log("Instant:", instant.toString()); 21 | console.log("Epoch milliseconds:", instant.epochMilliseconds); 22 | console.log("Epoch nanoseconds:", instant.epochNanoseconds); 23 | 24 | // 3. Temporal.PlainDate - Represents a calendar date without time or timezone 25 | console.log("\n--- Temporal.PlainDate ---"); 26 | const date = Temporal.PlainDate.from("2025-06-01"); 27 | console.log("Date:", date.toString()); 28 | console.log("Year:", date.year); 29 | console.log("Month:", date.month); 30 | console.log("Day:", date.day); 31 | console.log("Day of week:", date.dayOfWeek); 32 | console.log("Days in month:", date.daysInMonth); 33 | console.log("Days in year:", date.daysInYear); 34 | console.log("Is leap year:", date.inLeapYear); 35 | 36 | // 4. Temporal.PlainTime - Represents wall-clock time without date or timezone 37 | console.log("\n--- Temporal.PlainTime ---"); 38 | const time = Temporal.PlainTime.from("14:30:45.123"); 39 | console.log("Time:", time.toString()); 40 | console.log("Hour:", time.hour); 41 | console.log("Minute:", time.minute); 42 | console.log("Second:", time.second); 43 | console.log("Millisecond:", time.millisecond); 44 | 45 | // 5. Temporal.PlainDateTime - Combines date and time without timezone 46 | console.log("\n--- Temporal.PlainDateTime ---"); 47 | const dateTime = Temporal.PlainDateTime.from("2025-06-01T14:30:45"); 48 | console.log("DateTime:", dateTime.toString()); 49 | console.log("Date component:", dateTime.toPlainDate().toString()); 50 | console.log("Time component:", dateTime.toPlainTime().toString()); 51 | 52 | // 6. Temporal.ZonedDateTime - Full date, time, and timezone information 53 | console.log("\n--- Temporal.ZonedDateTime ---"); 54 | const zonedDateTime = Temporal.ZonedDateTime.from("2025-06-01T14:30:45+02:00[Europe/Paris]"); 55 | console.log("ZonedDateTime:", zonedDateTime.toString()); 56 | console.log("TimeZone:", zonedDateTime.timeZone.toString()); 57 | console.log("Offset:", zonedDateTime.offset); 58 | console.log("Epoch nanoseconds:", zonedDateTime.epochNanoseconds); 59 | 60 | // 7. Temporal.Duration - Represents a length of time 61 | console.log("\n--- Temporal.Duration ---"); 62 | const duration = Temporal.Duration.from({ 63 | years: 1, 64 | months: 2, 65 | days: 15, 66 | hours: 12, 67 | minutes: 30, 68 | seconds: 45 69 | }); 70 | console.log("Duration:", duration.toString()); 71 | console.log("Total days:", duration.total("days")); 72 | console.log("Total hours:", duration.total("hours")); 73 | 74 | // 8. Temporal.TimeZone - Represents a timezone 75 | console.log("\n--- Temporal.TimeZone ---"); 76 | const timeZone = Temporal.TimeZone.from("America/New_York"); 77 | console.log("TimeZone:", timeZone.toString()); 78 | console.log("Current offset:", timeZone.getOffsetStringFor(Temporal.Now.instant())); 79 | 80 | // 9. Temporal.Calendar - Represents a calendar system 81 | console.log("\n--- Temporal.Calendar ---"); 82 | const calendar = Temporal.Calendar.from("iso8601"); 83 | console.log("Calendar:", calendar.toString()); 84 | console.log("Days in month:", calendar.daysInMonth(2025, 2)); 85 | console.log("Days in year:", calendar.daysInYear(2025)); 86 | console.log("Is leap year:", calendar.inLeapYear(2025)); 87 | 88 | // 10. Date Arithmetic - Adding and subtracting durations 89 | console.log("\n--- Date Arithmetic ---"); 90 | const startDate = Temporal.PlainDate.from("2025-01-15"); 91 | const endDate = startDate.add({ months: 1, days: 20 }); 92 | console.log("Start date:", startDate.toString()); 93 | console.log("End date:", endDate.toString()); 94 | console.log("Difference:", startDate.until(endDate).toString()); 95 | 96 | // 11. Comparing Dates and Times 97 | console.log("\n--- Comparing Dates and Times ---"); 98 | const date1 = Temporal.PlainDate.from("2025-06-01"); 99 | const date2 = Temporal.PlainDate.from("2025-07-15"); 100 | console.log("date1 < date2:", date1.compare(date2) < 0); 101 | console.log("date1 > date2:", date1.compare(date2) > 0); 102 | console.log("date1 == date2:", date1.compare(date2) === 0); 103 | 104 | // 12. Formatting Dates and Times 105 | console.log("\n--- Formatting Dates and Times ---"); 106 | const formatDate = Temporal.PlainDate.from("2025-06-01"); 107 | console.log("ISO format:", formatDate.toString()); 108 | console.log("Custom format (using Intl):", 109 | new Intl.DateTimeFormat("en-US", { 110 | year: "numeric", 111 | month: "long", 112 | day: "numeric" 113 | }).format(new Date(2025, 5, 1)) 114 | ); 115 | 116 | // 13. Practical Examples 117 | console.log("\n--- Practical Examples ---"); 118 | 119 | // Example 1: Calculate age 120 | function calculateAge(birthDate) { 121 | const today = Temporal.Now.plainDate(); 122 | const age = birthDate.until(today).years; 123 | return age; 124 | } 125 | 126 | const birthDate = Temporal.PlainDate.from("1990-05-15"); 127 | console.log("Age:", calculateAge(birthDate)); 128 | 129 | // Example 2: Add business days (skip weekends) 130 | function addBusinessDays(date, days) { 131 | let result = date; 132 | let daysAdded = 0; 133 | 134 | while (daysAdded < days) { 135 | result = result.add({ days: 1 }); 136 | // Skip weekends (6 = Saturday, 7 = Sunday) 137 | if (result.dayOfWeek !== 6 && result.dayOfWeek !== 7) { 138 | daysAdded++; 139 | } 140 | } 141 | 142 | return result; 143 | } 144 | 145 | const startBusinessDate = Temporal.PlainDate.from("2025-06-01"); 146 | console.log("Start date:", startBusinessDate.toString()); 147 | console.log("After 10 business days:", addBusinessDays(startBusinessDate, 10).toString()); 148 | 149 | // Example 3: Flight duration between timezones 150 | function calculateFlightDuration(departure, arrival) { 151 | const departureTZ = Temporal.ZonedDateTime.from(departure); 152 | const arrivalTZ = Temporal.ZonedDateTime.from(arrival); 153 | const duration = departureTZ.until(arrivalTZ); 154 | return duration; 155 | } 156 | 157 | const flightDeparture = "2025-06-01T08:30:00-04:00[America/New_York]"; 158 | const flightArrival = "2025-06-01T22:15:00+02:00[Europe/Paris]"; 159 | console.log("Flight duration:", calculateFlightDuration(flightDeparture, flightArrival).toString()); -------------------------------------------------------------------------------- /es2025/4.decorator-metadata.js: -------------------------------------------------------------------------------- 1 | // Decorator Metadata - New in ES2025 2 | // ES2025 enhances JavaScript decorators by allowing them to associate metadata with decorated elements 3 | 4 | // Decorators were introduced in ES2022 as a way to modify classes and class members 5 | // Decorator Metadata extends this by providing a standard way to attach and retrieve metadata 6 | 7 | // Note: This is experimental syntax and requires appropriate transpiler/compiler support 8 | 9 | // 1. Basic Decorator Syntax (Review) 10 | console.log("--- Basic Decorator Syntax ---"); 11 | 12 | // Class decorator 13 | function logClass(target) { 14 | console.log(`Class decorated: ${target.name}`); 15 | return target; 16 | } 17 | 18 | // Method decorator 19 | function logMethod(target, context) { 20 | const methodName = context.name; 21 | const originalMethod = target.value; 22 | 23 | // Replace the method with a new one that logs before and after execution 24 | target.value = function(...args) { 25 | console.log(`Entering method: ${methodName}`); 26 | const result = originalMethod.apply(this, args); 27 | console.log(`Exiting method: ${methodName}`); 28 | return result; 29 | }; 30 | 31 | return target; 32 | } 33 | 34 | // 2. Decorator Metadata - Attaching Metadata 35 | console.log("\n--- Decorator Metadata - Attaching Metadata ---"); 36 | 37 | // Define a decorator that attaches metadata 38 | function addMetadata(metadataObj) { 39 | return function(target, context) { 40 | // Store metadata on the decorated element 41 | context.metadata = { ...context.metadata, ...metadataObj }; 42 | return target; 43 | }; 44 | } 45 | 46 | // 3. Accessing Decorator Metadata 47 | console.log("\n--- Accessing Decorator Metadata ---"); 48 | 49 | // Define a decorator that reads metadata 50 | function validateParams(target, context) { 51 | const originalMethod = target.value; 52 | const methodMetadata = context.metadata; 53 | 54 | target.value = function(...args) { 55 | // Check if we have validation metadata 56 | if (methodMetadata && methodMetadata.params) { 57 | const validations = methodMetadata.params; 58 | 59 | // Validate each parameter based on metadata 60 | for (let i = 0; i < validations.length; i++) { 61 | const validation = validations[i]; 62 | const arg = args[i]; 63 | 64 | if (validation.required && (arg === undefined || arg === null)) { 65 | throw new Error(`Parameter ${i} is required for ${context.name}`); 66 | } 67 | 68 | if (validation.type && typeof arg !== validation.type) { 69 | throw new Error(`Parameter ${i} must be of type ${validation.type} for ${context.name}`); 70 | } 71 | 72 | if (validation.min !== undefined && arg < validation.min) { 73 | throw new Error(`Parameter ${i} must be >= ${validation.min} for ${context.name}`); 74 | } 75 | 76 | if (validation.max !== undefined && arg > validation.max) { 77 | throw new Error(`Parameter ${i} must be <= ${validation.max} for ${context.name}`); 78 | } 79 | } 80 | } 81 | 82 | return originalMethod.apply(this, args); 83 | }; 84 | 85 | return target; 86 | } 87 | 88 | // 4. Practical Example: API Documentation and Validation 89 | console.log("\n--- Practical Example: API Documentation and Validation ---"); 90 | 91 | // Define decorators for API documentation and validation 92 | function apiEndpoint(path, method = "GET") { 93 | return function(target, context) { 94 | context.metadata = { 95 | ...context.metadata, 96 | api: { path, method } 97 | }; 98 | return target; 99 | }; 100 | } 101 | 102 | function params(validations) { 103 | return function(target, context) { 104 | context.metadata = { 105 | ...context.metadata, 106 | params: validations 107 | }; 108 | return target; 109 | }; 110 | } 111 | 112 | function returns(description) { 113 | return function(target, context) { 114 | context.metadata = { 115 | ...context.metadata, 116 | returns: description 117 | }; 118 | return target; 119 | }; 120 | } 121 | 122 | // 5. Complete Example with Metadata 123 | console.log("\n--- Complete Example with Metadata ---"); 124 | 125 | @logClass 126 | class UserService { 127 | constructor() { 128 | this.users = [ 129 | { id: 1, name: "Alice", age: 30 }, 130 | { id: 2, name: "Bob", age: 25 }, 131 | { id: 3, name: "Charlie", age: 35 } 132 | ]; 133 | } 134 | 135 | @logMethod 136 | @apiEndpoint("/users", "GET") 137 | @returns("Array of all users") 138 | getAllUsers() { 139 | return this.users; 140 | } 141 | 142 | @logMethod 143 | @apiEndpoint("/users/:id", "GET") 144 | @params([ 145 | { name: "id", type: "number", required: true, description: "User ID" } 146 | ]) 147 | @returns("User object or null if not found") 148 | getUserById(id) { 149 | return this.users.find(user => user.id === id) || null; 150 | } 151 | 152 | @logMethod 153 | @apiEndpoint("/users", "POST") 154 | @params([ 155 | { name: "name", type: "string", required: true, description: "User name" }, 156 | { name: "age", type: "number", required: true, min: 0, max: 120, description: "User age" } 157 | ]) 158 | @returns("Created user object with assigned ID") 159 | @validateParams 160 | createUser(name, age) { 161 | const newId = Math.max(...this.users.map(user => user.id)) + 1; 162 | const newUser = { id: newId, name, age }; 163 | this.users.push(newUser); 164 | return newUser; 165 | } 166 | 167 | @logMethod 168 | @apiEndpoint("/users/:id", "PUT") 169 | @params([ 170 | { name: "id", type: "number", required: true, description: "User ID" }, 171 | { name: "name", type: "string", required: false, description: "User name" }, 172 | { name: "age", type: "number", required: false, min: 0, max: 120, description: "User age" } 173 | ]) 174 | @returns("Updated user object or null if not found") 175 | @validateParams 176 | updateUser(id, name, age) { 177 | const user = this.users.find(user => user.id === id); 178 | if (!user) return null; 179 | 180 | if (name !== undefined) user.name = name; 181 | if (age !== undefined) user.age = age; 182 | 183 | return user; 184 | } 185 | 186 | @logMethod 187 | @apiEndpoint("/users/:id", "DELETE") 188 | @params([ 189 | { name: "id", type: "number", required: true, description: "User ID" } 190 | ]) 191 | @returns("Boolean indicating success") 192 | @validateParams 193 | deleteUser(id) { 194 | const index = this.users.findIndex(user => user.id === id); 195 | if (index === -1) return false; 196 | 197 | this.users.splice(index, 1); 198 | return true; 199 | } 200 | } 201 | 202 | // 6. Generate API Documentation from Metadata 203 | console.log("\n--- Generate API Documentation from Metadata ---"); 204 | 205 | function generateApiDocs(serviceClass) { 206 | const docs = { 207 | service: serviceClass.name, 208 | endpoints: [] 209 | }; 210 | 211 | // Get all method names from the prototype 212 | const methodNames = Object.getOwnPropertyNames(serviceClass.prototype) 213 | .filter(name => name !== 'constructor'); 214 | 215 | for (const methodName of methodNames) { 216 | const method = serviceClass.prototype[methodName]; 217 | const metadata = method.context?.metadata; 218 | 219 | if (metadata && metadata.api) { 220 | docs.endpoints.push({ 221 | path: metadata.api.path, 222 | method: metadata.api.method, 223 | function: methodName, 224 | parameters: metadata.params || [], 225 | returns: metadata.returns || "No return description" 226 | }); 227 | } 228 | } 229 | 230 | return docs; 231 | } 232 | 233 | // Create an instance and test the service 234 | const userService = new UserService(); 235 | 236 | // Test the methods 237 | console.log("All users:", userService.getAllUsers()); 238 | console.log("User with ID 2:", userService.getUserById(2)); 239 | console.log("Create user:", userService.createUser("Dave", 40)); 240 | console.log("Update user:", userService.updateUser(1, "Alice Smith", 31)); 241 | console.log("Delete user:", userService.deleteUser(3)); 242 | console.log("All users after operations:", userService.getAllUsers()); 243 | 244 | // Generate API documentation 245 | const apiDocs = generateApiDocs(UserService); 246 | console.log("API Documentation:", JSON.stringify(apiDocs, null, 2)); 247 | 248 | // 7. Error Handling with Validation 249 | console.log("\n--- Error Handling with Validation ---"); 250 | 251 | try { 252 | // This should throw an error because age is out of range 253 | userService.createUser("Invalid", 150); 254 | } catch (error) { 255 | console.error("Validation error:", error.message); 256 | } 257 | 258 | try { 259 | // This should throw an error because name is required 260 | userService.createUser(null, 25); 261 | } catch (error) { 262 | console.error("Validation error:", error.message); 263 | } -------------------------------------------------------------------------------- /images/promises.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sudheerj/ECMAScript-features/ffab637880b0f2a8cfbd4550af1845188e6b4872/images/promises.png -------------------------------------------------------------------------------- /package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "ECMAScript-cheatsheet", 3 | "version": "1.0.0", 4 | "lockfileVersion": 1, 5 | "requires": true, 6 | "dependencies": { 7 | "@babel/code-frame": { 8 | "version": "7.10.1", 9 | "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.1.tgz", 10 | "integrity": "sha512-IGhtTmpjGbYzcEDOw7DcQtbQSXcG9ftmAXtWTu9V936vDye4xjjekktFAtgZsWpzTj/X01jocB46mTywm/4SZw==", 11 | "dev": true, 12 | "requires": { 13 | "@babel/highlight": "^7.10.1" 14 | } 15 | }, 16 | "@babel/compat-data": { 17 | "version": "7.10.1", 18 | "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.10.1.tgz", 19 | "integrity": "sha512-CHvCj7So7iCkGKPRFUfryXIkU2gSBw7VSZFYLsqVhrS47269VK2Hfi9S/YcublPMW8k1u2bQBlbDruoQEm4fgw==", 20 | "dev": true, 21 | "requires": { 22 | "browserslist": "^4.12.0", 23 | "invariant": "^2.2.4", 24 | "semver": "^5.5.0" 25 | } 26 | }, 27 | "@babel/core": { 28 | "version": "7.10.2", 29 | "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.10.2.tgz", 30 | "integrity": "sha512-KQmV9yguEjQsXqyOUGKjS4+3K8/DlOCE2pZcq4augdQmtTy5iv5EHtmMSJ7V4c1BIPjuwtZYqYLCq9Ga+hGBRQ==", 31 | "dev": true, 32 | "requires": { 33 | "@babel/code-frame": "^7.10.1", 34 | "@babel/generator": "^7.10.2", 35 | "@babel/helper-module-transforms": "^7.10.1", 36 | "@babel/helpers": "^7.10.1", 37 | "@babel/parser": "^7.10.2", 38 | "@babel/template": "^7.10.1", 39 | "@babel/traverse": "^7.10.1", 40 | "@babel/types": "^7.10.2", 41 | "convert-source-map": "^1.7.0", 42 | "debug": "^4.1.0", 43 | "gensync": "^1.0.0-beta.1", 44 | "json5": "^2.1.2", 45 | "lodash": "^4.17.13", 46 | "resolve": "^1.3.2", 47 | "semver": "^5.4.1", 48 | "source-map": "^0.5.0" 49 | } 50 | }, 51 | "@babel/generator": { 52 | "version": "7.10.2", 53 | "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.10.2.tgz", 54 | "integrity": "sha512-AxfBNHNu99DTMvlUPlt1h2+Hn7knPpH5ayJ8OqDWSeLld+Fi2AYBTC/IejWDM9Edcii4UzZRCsbUt0WlSDsDsA==", 55 | "dev": true, 56 | "requires": { 57 | "@babel/types": "^7.10.2", 58 | "jsesc": "^2.5.1", 59 | "lodash": "^4.17.13", 60 | "source-map": "^0.5.0" 61 | } 62 | }, 63 | "@babel/helper-annotate-as-pure": { 64 | "version": "7.10.1", 65 | "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.10.1.tgz", 66 | "integrity": "sha512-ewp3rvJEwLaHgyWGe4wQssC2vjks3E80WiUe2BpMb0KhreTjMROCbxXcEovTrbeGVdQct5VjQfrv9EgC+xMzCw==", 67 | "dev": true, 68 | "requires": { 69 | "@babel/types": "^7.10.1" 70 | } 71 | }, 72 | "@babel/helper-builder-binary-assignment-operator-visitor": { 73 | "version": "7.10.1", 74 | "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.10.1.tgz", 75 | "integrity": "sha512-cQpVq48EkYxUU0xozpGCLla3wlkdRRqLWu1ksFMXA9CM5KQmyyRpSEsYXbao7JUkOw/tAaYKCaYyZq6HOFYtyw==", 76 | "dev": true, 77 | "requires": { 78 | "@babel/helper-explode-assignable-expression": "^7.10.1", 79 | "@babel/types": "^7.10.1" 80 | } 81 | }, 82 | "@babel/helper-compilation-targets": { 83 | "version": "7.10.2", 84 | "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.10.2.tgz", 85 | "integrity": "sha512-hYgOhF4To2UTB4LTaZepN/4Pl9LD4gfbJx8A34mqoluT8TLbof1mhUlYuNWTEebONa8+UlCC4X0TEXu7AOUyGA==", 86 | "dev": true, 87 | "requires": { 88 | "@babel/compat-data": "^7.10.1", 89 | "browserslist": "^4.12.0", 90 | "invariant": "^2.2.4", 91 | "levenary": "^1.1.1", 92 | "semver": "^5.5.0" 93 | } 94 | }, 95 | "@babel/helper-create-class-features-plugin": { 96 | "version": "7.10.2", 97 | "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.10.2.tgz", 98 | "integrity": "sha512-5C/QhkGFh1vqcziq1vAL6SI9ymzUp8BCYjFpvYVhWP4DlATIb3u5q3iUd35mvlyGs8fO7hckkW7i0tmH+5+bvQ==", 99 | "dev": true, 100 | "requires": { 101 | "@babel/helper-function-name": "^7.10.1", 102 | "@babel/helper-member-expression-to-functions": "^7.10.1", 103 | "@babel/helper-optimise-call-expression": "^7.10.1", 104 | "@babel/helper-plugin-utils": "^7.10.1", 105 | "@babel/helper-replace-supers": "^7.10.1", 106 | "@babel/helper-split-export-declaration": "^7.10.1" 107 | } 108 | }, 109 | "@babel/helper-create-regexp-features-plugin": { 110 | "version": "7.10.1", 111 | "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.10.1.tgz", 112 | "integrity": "sha512-Rx4rHS0pVuJn5pJOqaqcZR4XSgeF9G/pO/79t+4r7380tXFJdzImFnxMU19f83wjSrmKHq6myrM10pFHTGzkUA==", 113 | "dev": true, 114 | "requires": { 115 | "@babel/helper-annotate-as-pure": "^7.10.1", 116 | "@babel/helper-regex": "^7.10.1", 117 | "regexpu-core": "^4.7.0" 118 | } 119 | }, 120 | "@babel/helper-define-map": { 121 | "version": "7.10.1", 122 | "resolved": "https://registry.npmjs.org/@babel/helper-define-map/-/helper-define-map-7.10.1.tgz", 123 | "integrity": "sha512-+5odWpX+OnvkD0Zmq7panrMuAGQBu6aPUgvMzuMGo4R+jUOvealEj2hiqI6WhxgKrTpFoFj0+VdsuA8KDxHBDg==", 124 | "dev": true, 125 | "requires": { 126 | "@babel/helper-function-name": "^7.10.1", 127 | "@babel/types": "^7.10.1", 128 | "lodash": "^4.17.13" 129 | } 130 | }, 131 | "@babel/helper-explode-assignable-expression": { 132 | "version": "7.10.1", 133 | "resolved": "https://registry.npmjs.org/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.10.1.tgz", 134 | "integrity": "sha512-vcUJ3cDjLjvkKzt6rHrl767FeE7pMEYfPanq5L16GRtrXIoznc0HykNW2aEYkcnP76P0isoqJ34dDMFZwzEpJg==", 135 | "dev": true, 136 | "requires": { 137 | "@babel/traverse": "^7.10.1", 138 | "@babel/types": "^7.10.1" 139 | } 140 | }, 141 | "@babel/helper-function-name": { 142 | "version": "7.10.1", 143 | "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.10.1.tgz", 144 | "integrity": "sha512-fcpumwhs3YyZ/ttd5Rz0xn0TpIwVkN7X0V38B9TWNfVF42KEkhkAAuPCQ3oXmtTRtiPJrmZ0TrfS0GKF0eMaRQ==", 145 | "dev": true, 146 | "requires": { 147 | "@babel/helper-get-function-arity": "^7.10.1", 148 | "@babel/template": "^7.10.1", 149 | "@babel/types": "^7.10.1" 150 | } 151 | }, 152 | "@babel/helper-get-function-arity": { 153 | "version": "7.10.1", 154 | "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.10.1.tgz", 155 | "integrity": "sha512-F5qdXkYGOQUb0hpRaPoetF9AnsXknKjWMZ+wmsIRsp5ge5sFh4c3h1eH2pRTTuy9KKAA2+TTYomGXAtEL2fQEw==", 156 | "dev": true, 157 | "requires": { 158 | "@babel/types": "^7.10.1" 159 | } 160 | }, 161 | "@babel/helper-hoist-variables": { 162 | "version": "7.10.1", 163 | "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.10.1.tgz", 164 | "integrity": "sha512-vLm5srkU8rI6X3+aQ1rQJyfjvCBLXP8cAGeuw04zeAM2ItKb1e7pmVmLyHb4sDaAYnLL13RHOZPLEtcGZ5xvjg==", 165 | "dev": true, 166 | "requires": { 167 | "@babel/types": "^7.10.1" 168 | } 169 | }, 170 | "@babel/helper-member-expression-to-functions": { 171 | "version": "7.10.1", 172 | "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.10.1.tgz", 173 | "integrity": "sha512-u7XLXeM2n50gb6PWJ9hoO5oO7JFPaZtrh35t8RqKLT1jFKj9IWeD1zrcrYp1q1qiZTdEarfDWfTIP8nGsu0h5g==", 174 | "dev": true, 175 | "requires": { 176 | "@babel/types": "^7.10.1" 177 | } 178 | }, 179 | "@babel/helper-module-imports": { 180 | "version": "7.10.1", 181 | "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.10.1.tgz", 182 | "integrity": "sha512-SFxgwYmZ3HZPyZwJRiVNLRHWuW2OgE5k2nrVs6D9Iv4PPnXVffuEHy83Sfx/l4SqF+5kyJXjAyUmrG7tNm+qVg==", 183 | "dev": true, 184 | "requires": { 185 | "@babel/types": "^7.10.1" 186 | } 187 | }, 188 | "@babel/helper-module-transforms": { 189 | "version": "7.10.1", 190 | "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.10.1.tgz", 191 | "integrity": "sha512-RLHRCAzyJe7Q7sF4oy2cB+kRnU4wDZY/H2xJFGof+M+SJEGhZsb+GFj5j1AD8NiSaVBJ+Pf0/WObiXu/zxWpFg==", 192 | "dev": true, 193 | "requires": { 194 | "@babel/helper-module-imports": "^7.10.1", 195 | "@babel/helper-replace-supers": "^7.10.1", 196 | "@babel/helper-simple-access": "^7.10.1", 197 | "@babel/helper-split-export-declaration": "^7.10.1", 198 | "@babel/template": "^7.10.1", 199 | "@babel/types": "^7.10.1", 200 | "lodash": "^4.17.13" 201 | } 202 | }, 203 | "@babel/helper-optimise-call-expression": { 204 | "version": "7.10.1", 205 | "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.10.1.tgz", 206 | "integrity": "sha512-a0DjNS1prnBsoKx83dP2falChcs7p3i8VMzdrSbfLhuQra/2ENC4sbri34dz/rWmDADsmF1q5GbfaXydh0Jbjg==", 207 | "dev": true, 208 | "requires": { 209 | "@babel/types": "^7.10.1" 210 | } 211 | }, 212 | "@babel/helper-plugin-utils": { 213 | "version": "7.10.1", 214 | "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.1.tgz", 215 | "integrity": "sha512-fvoGeXt0bJc7VMWZGCAEBEMo/HAjW2mP8apF5eXK0wSqwLAVHAISCWRoLMBMUs2kqeaG77jltVqu4Hn8Egl3nA==", 216 | "dev": true 217 | }, 218 | "@babel/helper-regex": { 219 | "version": "7.10.1", 220 | "resolved": "https://registry.npmjs.org/@babel/helper-regex/-/helper-regex-7.10.1.tgz", 221 | "integrity": "sha512-7isHr19RsIJWWLLFn21ubFt223PjQyg1HY7CZEMRr820HttHPpVvrsIN3bUOo44DEfFV4kBXO7Abbn9KTUZV7g==", 222 | "dev": true, 223 | "requires": { 224 | "lodash": "^4.17.13" 225 | } 226 | }, 227 | "@babel/helper-remap-async-to-generator": { 228 | "version": "7.10.1", 229 | "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.10.1.tgz", 230 | "integrity": "sha512-RfX1P8HqsfgmJ6CwaXGKMAqbYdlleqglvVtht0HGPMSsy2V6MqLlOJVF/0Qyb/m2ZCi2z3q3+s6Pv7R/dQuZ6A==", 231 | "dev": true, 232 | "requires": { 233 | "@babel/helper-annotate-as-pure": "^7.10.1", 234 | "@babel/helper-wrap-function": "^7.10.1", 235 | "@babel/template": "^7.10.1", 236 | "@babel/traverse": "^7.10.1", 237 | "@babel/types": "^7.10.1" 238 | } 239 | }, 240 | "@babel/helper-replace-supers": { 241 | "version": "7.10.1", 242 | "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.10.1.tgz", 243 | "integrity": "sha512-SOwJzEfpuQwInzzQJGjGaiG578UYmyi2Xw668klPWV5n07B73S0a9btjLk/52Mlcxa+5AdIYqws1KyXRfMoB7A==", 244 | "dev": true, 245 | "requires": { 246 | "@babel/helper-member-expression-to-functions": "^7.10.1", 247 | "@babel/helper-optimise-call-expression": "^7.10.1", 248 | "@babel/traverse": "^7.10.1", 249 | "@babel/types": "^7.10.1" 250 | } 251 | }, 252 | "@babel/helper-simple-access": { 253 | "version": "7.10.1", 254 | "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.10.1.tgz", 255 | "integrity": "sha512-VSWpWzRzn9VtgMJBIWTZ+GP107kZdQ4YplJlCmIrjoLVSi/0upixezHCDG8kpPVTBJpKfxTH01wDhh+jS2zKbw==", 256 | "dev": true, 257 | "requires": { 258 | "@babel/template": "^7.10.1", 259 | "@babel/types": "^7.10.1" 260 | } 261 | }, 262 | "@babel/helper-split-export-declaration": { 263 | "version": "7.10.1", 264 | "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.10.1.tgz", 265 | "integrity": "sha512-UQ1LVBPrYdbchNhLwj6fetj46BcFwfS4NllJo/1aJsT+1dLTEnXJL0qHqtY7gPzF8S2fXBJamf1biAXV3X077g==", 266 | "dev": true, 267 | "requires": { 268 | "@babel/types": "^7.10.1" 269 | } 270 | }, 271 | "@babel/helper-validator-identifier": { 272 | "version": "7.10.1", 273 | "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.1.tgz", 274 | "integrity": "sha512-5vW/JXLALhczRCWP0PnFDMCJAchlBvM7f4uk/jXritBnIa6E1KmqmtrS3yn1LAnxFBypQ3eneLuXjsnfQsgILw==", 275 | "dev": true 276 | }, 277 | "@babel/helper-wrap-function": { 278 | "version": "7.10.1", 279 | "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.10.1.tgz", 280 | "integrity": "sha512-C0MzRGteVDn+H32/ZgbAv5r56f2o1fZSA/rj/TYo8JEJNHg+9BdSmKBUND0shxWRztWhjlT2cvHYuynpPsVJwQ==", 281 | "dev": true, 282 | "requires": { 283 | "@babel/helper-function-name": "^7.10.1", 284 | "@babel/template": "^7.10.1", 285 | "@babel/traverse": "^7.10.1", 286 | "@babel/types": "^7.10.1" 287 | } 288 | }, 289 | "@babel/helpers": { 290 | "version": "7.10.1", 291 | "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.10.1.tgz", 292 | "integrity": "sha512-muQNHF+IdU6wGgkaJyhhEmI54MOZBKsFfsXFhboz1ybwJ1Kl7IHlbm2a++4jwrmY5UYsgitt5lfqo1wMFcHmyw==", 293 | "dev": true, 294 | "requires": { 295 | "@babel/template": "^7.10.1", 296 | "@babel/traverse": "^7.10.1", 297 | "@babel/types": "^7.10.1" 298 | } 299 | }, 300 | "@babel/highlight": { 301 | "version": "7.10.1", 302 | "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.10.1.tgz", 303 | "integrity": "sha512-8rMof+gVP8mxYZApLF/JgNDAkdKa+aJt3ZYxF8z6+j/hpeXL7iMsKCPHa2jNMHu/qqBwzQF4OHNoYi8dMA/rYg==", 304 | "dev": true, 305 | "requires": { 306 | "@babel/helper-validator-identifier": "^7.10.1", 307 | "chalk": "^2.0.0", 308 | "js-tokens": "^4.0.0" 309 | } 310 | }, 311 | "@babel/node": { 312 | "version": "7.10.1", 313 | "resolved": "https://registry.npmjs.org/@babel/node/-/node-7.10.1.tgz", 314 | "integrity": "sha512-HoLxelFIekiipykhN0d3cTSLZVxnl0aZiwv6oW4mxjeQEMOt1J/YGnBaIDyYWQ5tIHkUL1cqqn8LOvmWhFoCyw==", 315 | "dev": true, 316 | "requires": { 317 | "@babel/register": "^7.10.1", 318 | "commander": "^4.0.1", 319 | "core-js": "^3.2.1", 320 | "lodash": "^4.17.13", 321 | "node-environment-flags": "^1.0.5", 322 | "regenerator-runtime": "^0.13.4", 323 | "resolve": "^1.13.1", 324 | "v8flags": "^3.1.1" 325 | } 326 | }, 327 | "@babel/parser": { 328 | "version": "7.10.2", 329 | "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.10.2.tgz", 330 | "integrity": "sha512-PApSXlNMJyB4JiGVhCOlzKIif+TKFTvu0aQAhnTvfP/z3vVSN6ZypH5bfUNwFXXjRQtUEBNFd2PtmCmG2Py3qQ==", 331 | "dev": true 332 | }, 333 | "@babel/plugin-proposal-async-generator-functions": { 334 | "version": "7.10.1", 335 | "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.10.1.tgz", 336 | "integrity": "sha512-vzZE12ZTdB336POZjmpblWfNNRpMSua45EYnRigE2XsZxcXcIyly2ixnTJasJE4Zq3U7t2d8rRF7XRUuzHxbOw==", 337 | "dev": true, 338 | "requires": { 339 | "@babel/helper-plugin-utils": "^7.10.1", 340 | "@babel/helper-remap-async-to-generator": "^7.10.1", 341 | "@babel/plugin-syntax-async-generators": "^7.8.0" 342 | } 343 | }, 344 | "@babel/plugin-proposal-class-properties": { 345 | "version": "7.10.1", 346 | "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.10.1.tgz", 347 | "integrity": "sha512-sqdGWgoXlnOdgMXU+9MbhzwFRgxVLeiGBqTrnuS7LC2IBU31wSsESbTUreT2O418obpfPdGUR2GbEufZF1bpqw==", 348 | "dev": true, 349 | "requires": { 350 | "@babel/helper-create-class-features-plugin": "^7.10.1", 351 | "@babel/helper-plugin-utils": "^7.10.1" 352 | } 353 | }, 354 | "@babel/plugin-proposal-dynamic-import": { 355 | "version": "7.10.1", 356 | "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.10.1.tgz", 357 | "integrity": "sha512-Cpc2yUVHTEGPlmiQzXj026kqwjEQAD9I4ZC16uzdbgWgitg/UHKHLffKNCQZ5+y8jpIZPJcKcwsr2HwPh+w3XA==", 358 | "dev": true, 359 | "requires": { 360 | "@babel/helper-plugin-utils": "^7.10.1", 361 | "@babel/plugin-syntax-dynamic-import": "^7.8.0" 362 | } 363 | }, 364 | "@babel/plugin-proposal-json-strings": { 365 | "version": "7.10.1", 366 | "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.10.1.tgz", 367 | "integrity": "sha512-m8r5BmV+ZLpWPtMY2mOKN7wre6HIO4gfIiV+eOmsnZABNenrt/kzYBwrh+KOfgumSWpnlGs5F70J8afYMSJMBg==", 368 | "dev": true, 369 | "requires": { 370 | "@babel/helper-plugin-utils": "^7.10.1", 371 | "@babel/plugin-syntax-json-strings": "^7.8.0" 372 | } 373 | }, 374 | "@babel/plugin-proposal-nullish-coalescing-operator": { 375 | "version": "7.10.1", 376 | "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.10.1.tgz", 377 | "integrity": "sha512-56cI/uHYgL2C8HVuHOuvVowihhX0sxb3nnfVRzUeVHTWmRHTZrKuAh/OBIMggGU/S1g/1D2CRCXqP+3u7vX7iA==", 378 | "dev": true, 379 | "requires": { 380 | "@babel/helper-plugin-utils": "^7.10.1", 381 | "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.0" 382 | } 383 | }, 384 | "@babel/plugin-proposal-numeric-separator": { 385 | "version": "7.10.1", 386 | "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.10.1.tgz", 387 | "integrity": "sha512-jjfym4N9HtCiNfyyLAVD8WqPYeHUrw4ihxuAynWj6zzp2gf9Ey2f7ImhFm6ikB3CLf5Z/zmcJDri6B4+9j9RsA==", 388 | "dev": true, 389 | "requires": { 390 | "@babel/helper-plugin-utils": "^7.10.1", 391 | "@babel/plugin-syntax-numeric-separator": "^7.10.1" 392 | } 393 | }, 394 | "@babel/plugin-proposal-object-rest-spread": { 395 | "version": "7.10.1", 396 | "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.10.1.tgz", 397 | "integrity": "sha512-Z+Qri55KiQkHh7Fc4BW6o+QBuTagbOp9txE+4U1i79u9oWlf2npkiDx+Rf3iK3lbcHBuNy9UOkwuR5wOMH3LIQ==", 398 | "dev": true, 399 | "requires": { 400 | "@babel/helper-plugin-utils": "^7.10.1", 401 | "@babel/plugin-syntax-object-rest-spread": "^7.8.0", 402 | "@babel/plugin-transform-parameters": "^7.10.1" 403 | } 404 | }, 405 | "@babel/plugin-proposal-optional-catch-binding": { 406 | "version": "7.10.1", 407 | "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.10.1.tgz", 408 | "integrity": "sha512-VqExgeE62YBqI3ogkGoOJp1R6u12DFZjqwJhqtKc2o5m1YTUuUWnos7bZQFBhwkxIFpWYJ7uB75U7VAPPiKETA==", 409 | "dev": true, 410 | "requires": { 411 | "@babel/helper-plugin-utils": "^7.10.1", 412 | "@babel/plugin-syntax-optional-catch-binding": "^7.8.0" 413 | } 414 | }, 415 | "@babel/plugin-proposal-optional-chaining": { 416 | "version": "7.10.1", 417 | "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.10.1.tgz", 418 | "integrity": "sha512-dqQj475q8+/avvok72CF3AOSV/SGEcH29zT5hhohqqvvZ2+boQoOr7iGldBG5YXTO2qgCgc2B3WvVLUdbeMlGA==", 419 | "dev": true, 420 | "requires": { 421 | "@babel/helper-plugin-utils": "^7.10.1", 422 | "@babel/plugin-syntax-optional-chaining": "^7.8.0" 423 | } 424 | }, 425 | "@babel/plugin-proposal-private-methods": { 426 | "version": "7.10.1", 427 | "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.10.1.tgz", 428 | "integrity": "sha512-RZecFFJjDiQ2z6maFprLgrdnm0OzoC23Mx89xf1CcEsxmHuzuXOdniEuI+S3v7vjQG4F5sa6YtUp+19sZuSxHg==", 429 | "dev": true, 430 | "requires": { 431 | "@babel/helper-create-class-features-plugin": "^7.10.1", 432 | "@babel/helper-plugin-utils": "^7.10.1" 433 | } 434 | }, 435 | "@babel/plugin-proposal-unicode-property-regex": { 436 | "version": "7.10.1", 437 | "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.10.1.tgz", 438 | "integrity": "sha512-JjfngYRvwmPwmnbRZyNiPFI8zxCZb8euzbCG/LxyKdeTb59tVciKo9GK9bi6JYKInk1H11Dq9j/zRqIH4KigfQ==", 439 | "dev": true, 440 | "requires": { 441 | "@babel/helper-create-regexp-features-plugin": "^7.10.1", 442 | "@babel/helper-plugin-utils": "^7.10.1" 443 | } 444 | }, 445 | "@babel/plugin-syntax-async-generators": { 446 | "version": "7.8.4", 447 | "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", 448 | "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", 449 | "dev": true, 450 | "requires": { 451 | "@babel/helper-plugin-utils": "^7.8.0" 452 | } 453 | }, 454 | "@babel/plugin-syntax-class-properties": { 455 | "version": "7.10.1", 456 | "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.10.1.tgz", 457 | "integrity": "sha512-Gf2Yx/iRs1JREDtVZ56OrjjgFHCaldpTnuy9BHla10qyVT3YkIIGEtoDWhyop0ksu1GvNjHIoYRBqm3zoR1jyQ==", 458 | "dev": true, 459 | "requires": { 460 | "@babel/helper-plugin-utils": "^7.10.1" 461 | } 462 | }, 463 | "@babel/plugin-syntax-dynamic-import": { 464 | "version": "7.8.3", 465 | "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz", 466 | "integrity": "sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==", 467 | "dev": true, 468 | "requires": { 469 | "@babel/helper-plugin-utils": "^7.8.0" 470 | } 471 | }, 472 | "@babel/plugin-syntax-json-strings": { 473 | "version": "7.8.3", 474 | "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", 475 | "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", 476 | "dev": true, 477 | "requires": { 478 | "@babel/helper-plugin-utils": "^7.8.0" 479 | } 480 | }, 481 | "@babel/plugin-syntax-nullish-coalescing-operator": { 482 | "version": "7.8.3", 483 | "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", 484 | "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", 485 | "dev": true, 486 | "requires": { 487 | "@babel/helper-plugin-utils": "^7.8.0" 488 | } 489 | }, 490 | "@babel/plugin-syntax-numeric-separator": { 491 | "version": "7.10.1", 492 | "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.1.tgz", 493 | "integrity": "sha512-uTd0OsHrpe3tH5gRPTxG8Voh99/WCU78vIm5NMRYPAqC8lR4vajt6KkCAknCHrx24vkPdd/05yfdGSB4EIY2mg==", 494 | "dev": true, 495 | "requires": { 496 | "@babel/helper-plugin-utils": "^7.10.1" 497 | } 498 | }, 499 | "@babel/plugin-syntax-object-rest-spread": { 500 | "version": "7.8.3", 501 | "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", 502 | "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", 503 | "dev": true, 504 | "requires": { 505 | "@babel/helper-plugin-utils": "^7.8.0" 506 | } 507 | }, 508 | "@babel/plugin-syntax-optional-catch-binding": { 509 | "version": "7.8.3", 510 | "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", 511 | "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", 512 | "dev": true, 513 | "requires": { 514 | "@babel/helper-plugin-utils": "^7.8.0" 515 | } 516 | }, 517 | "@babel/plugin-syntax-optional-chaining": { 518 | "version": "7.8.3", 519 | "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", 520 | "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", 521 | "dev": true, 522 | "requires": { 523 | "@babel/helper-plugin-utils": "^7.8.0" 524 | } 525 | }, 526 | "@babel/plugin-syntax-top-level-await": { 527 | "version": "7.10.1", 528 | "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.10.1.tgz", 529 | "integrity": "sha512-hgA5RYkmZm8FTFT3yu2N9Bx7yVVOKYT6yEdXXo6j2JTm0wNxgqaGeQVaSHRjhfnQbX91DtjFB6McRFSlcJH3xQ==", 530 | "dev": true, 531 | "requires": { 532 | "@babel/helper-plugin-utils": "^7.10.1" 533 | } 534 | }, 535 | "@babel/plugin-transform-arrow-functions": { 536 | "version": "7.10.1", 537 | "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.10.1.tgz", 538 | "integrity": "sha512-6AZHgFJKP3DJX0eCNJj01RpytUa3SOGawIxweHkNX2L6PYikOZmoh5B0d7hIHaIgveMjX990IAa/xK7jRTN8OA==", 539 | "dev": true, 540 | "requires": { 541 | "@babel/helper-plugin-utils": "^7.10.1" 542 | } 543 | }, 544 | "@babel/plugin-transform-async-to-generator": { 545 | "version": "7.10.1", 546 | "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.10.1.tgz", 547 | "integrity": "sha512-XCgYjJ8TY2slj6SReBUyamJn3k2JLUIiiR5b6t1mNCMSvv7yx+jJpaewakikp0uWFQSF7ChPPoe3dHmXLpISkg==", 548 | "dev": true, 549 | "requires": { 550 | "@babel/helper-module-imports": "^7.10.1", 551 | "@babel/helper-plugin-utils": "^7.10.1", 552 | "@babel/helper-remap-async-to-generator": "^7.10.1" 553 | } 554 | }, 555 | "@babel/plugin-transform-block-scoped-functions": { 556 | "version": "7.10.1", 557 | "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.10.1.tgz", 558 | "integrity": "sha512-B7K15Xp8lv0sOJrdVAoukKlxP9N59HS48V1J3U/JGj+Ad+MHq+am6xJVs85AgXrQn4LV8vaYFOB+pr/yIuzW8Q==", 559 | "dev": true, 560 | "requires": { 561 | "@babel/helper-plugin-utils": "^7.10.1" 562 | } 563 | }, 564 | "@babel/plugin-transform-block-scoping": { 565 | "version": "7.10.1", 566 | "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.10.1.tgz", 567 | "integrity": "sha512-8bpWG6TtF5akdhIm/uWTyjHqENpy13Fx8chg7pFH875aNLwX8JxIxqm08gmAT+Whe6AOmaTeLPe7dpLbXt+xUw==", 568 | "dev": true, 569 | "requires": { 570 | "@babel/helper-plugin-utils": "^7.10.1", 571 | "lodash": "^4.17.13" 572 | } 573 | }, 574 | "@babel/plugin-transform-classes": { 575 | "version": "7.10.1", 576 | "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.10.1.tgz", 577 | "integrity": "sha512-P9V0YIh+ln/B3RStPoXpEQ/CoAxQIhRSUn7aXqQ+FZJ2u8+oCtjIXR3+X0vsSD8zv+mb56K7wZW1XiDTDGiDRQ==", 578 | "dev": true, 579 | "requires": { 580 | "@babel/helper-annotate-as-pure": "^7.10.1", 581 | "@babel/helper-define-map": "^7.10.1", 582 | "@babel/helper-function-name": "^7.10.1", 583 | "@babel/helper-optimise-call-expression": "^7.10.1", 584 | "@babel/helper-plugin-utils": "^7.10.1", 585 | "@babel/helper-replace-supers": "^7.10.1", 586 | "@babel/helper-split-export-declaration": "^7.10.1", 587 | "globals": "^11.1.0" 588 | } 589 | }, 590 | "@babel/plugin-transform-computed-properties": { 591 | "version": "7.10.1", 592 | "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.10.1.tgz", 593 | "integrity": "sha512-mqSrGjp3IefMsXIenBfGcPXxJxweQe2hEIwMQvjtiDQ9b1IBvDUjkAtV/HMXX47/vXf14qDNedXsIiNd1FmkaQ==", 594 | "dev": true, 595 | "requires": { 596 | "@babel/helper-plugin-utils": "^7.10.1" 597 | } 598 | }, 599 | "@babel/plugin-transform-destructuring": { 600 | "version": "7.10.1", 601 | "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.10.1.tgz", 602 | "integrity": "sha512-V/nUc4yGWG71OhaTH705pU8ZSdM6c1KmmLP8ys59oOYbT7RpMYAR3MsVOt6OHL0WzG7BlTU076va9fjJyYzJMA==", 603 | "dev": true, 604 | "requires": { 605 | "@babel/helper-plugin-utils": "^7.10.1" 606 | } 607 | }, 608 | "@babel/plugin-transform-dotall-regex": { 609 | "version": "7.10.1", 610 | "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.10.1.tgz", 611 | "integrity": "sha512-19VIMsD1dp02RvduFUmfzj8uknaO3uiHHF0s3E1OHnVsNj8oge8EQ5RzHRbJjGSetRnkEuBYO7TG1M5kKjGLOA==", 612 | "dev": true, 613 | "requires": { 614 | "@babel/helper-create-regexp-features-plugin": "^7.10.1", 615 | "@babel/helper-plugin-utils": "^7.10.1" 616 | } 617 | }, 618 | "@babel/plugin-transform-duplicate-keys": { 619 | "version": "7.10.1", 620 | "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.10.1.tgz", 621 | "integrity": "sha512-wIEpkX4QvX8Mo9W6XF3EdGttrIPZWozHfEaDTU0WJD/TDnXMvdDh30mzUl/9qWhnf7naicYartcEfUghTCSNpA==", 622 | "dev": true, 623 | "requires": { 624 | "@babel/helper-plugin-utils": "^7.10.1" 625 | } 626 | }, 627 | "@babel/plugin-transform-exponentiation-operator": { 628 | "version": "7.10.1", 629 | "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.10.1.tgz", 630 | "integrity": "sha512-lr/przdAbpEA2BUzRvjXdEDLrArGRRPwbaF9rvayuHRvdQ7lUTTkZnhZrJ4LE2jvgMRFF4f0YuPQ20vhiPYxtA==", 631 | "dev": true, 632 | "requires": { 633 | "@babel/helper-builder-binary-assignment-operator-visitor": "^7.10.1", 634 | "@babel/helper-plugin-utils": "^7.10.1" 635 | } 636 | }, 637 | "@babel/plugin-transform-for-of": { 638 | "version": "7.10.1", 639 | "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.10.1.tgz", 640 | "integrity": "sha512-US8KCuxfQcn0LwSCMWMma8M2R5mAjJGsmoCBVwlMygvmDUMkTCykc84IqN1M7t+agSfOmLYTInLCHJM+RUoz+w==", 641 | "dev": true, 642 | "requires": { 643 | "@babel/helper-plugin-utils": "^7.10.1" 644 | } 645 | }, 646 | "@babel/plugin-transform-function-name": { 647 | "version": "7.10.1", 648 | "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.10.1.tgz", 649 | "integrity": "sha512-//bsKsKFBJfGd65qSNNh1exBy5Y9gD9ZN+DvrJ8f7HXr4avE5POW6zB7Rj6VnqHV33+0vXWUwJT0wSHubiAQkw==", 650 | "dev": true, 651 | "requires": { 652 | "@babel/helper-function-name": "^7.10.1", 653 | "@babel/helper-plugin-utils": "^7.10.1" 654 | } 655 | }, 656 | "@babel/plugin-transform-literals": { 657 | "version": "7.10.1", 658 | "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.10.1.tgz", 659 | "integrity": "sha512-qi0+5qgevz1NHLZroObRm5A+8JJtibb7vdcPQF1KQE12+Y/xxl8coJ+TpPW9iRq+Mhw/NKLjm+5SHtAHCC7lAw==", 660 | "dev": true, 661 | "requires": { 662 | "@babel/helper-plugin-utils": "^7.10.1" 663 | } 664 | }, 665 | "@babel/plugin-transform-member-expression-literals": { 666 | "version": "7.10.1", 667 | "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.10.1.tgz", 668 | "integrity": "sha512-UmaWhDokOFT2GcgU6MkHC11i0NQcL63iqeufXWfRy6pUOGYeCGEKhvfFO6Vz70UfYJYHwveg62GS83Rvpxn+NA==", 669 | "dev": true, 670 | "requires": { 671 | "@babel/helper-plugin-utils": "^7.10.1" 672 | } 673 | }, 674 | "@babel/plugin-transform-modules-amd": { 675 | "version": "7.10.1", 676 | "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.10.1.tgz", 677 | "integrity": "sha512-31+hnWSFRI4/ACFr1qkboBbrTxoBIzj7qA69qlq8HY8p7+YCzkCT6/TvQ1a4B0z27VeWtAeJd6pr5G04dc1iHw==", 678 | "dev": true, 679 | "requires": { 680 | "@babel/helper-module-transforms": "^7.10.1", 681 | "@babel/helper-plugin-utils": "^7.10.1", 682 | "babel-plugin-dynamic-import-node": "^2.3.3" 683 | } 684 | }, 685 | "@babel/plugin-transform-modules-commonjs": { 686 | "version": "7.10.1", 687 | "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.10.1.tgz", 688 | "integrity": "sha512-AQG4fc3KOah0vdITwt7Gi6hD9BtQP/8bhem7OjbaMoRNCH5Djx42O2vYMfau7QnAzQCa+RJnhJBmFFMGpQEzrg==", 689 | "dev": true, 690 | "requires": { 691 | "@babel/helper-module-transforms": "^7.10.1", 692 | "@babel/helper-plugin-utils": "^7.10.1", 693 | "@babel/helper-simple-access": "^7.10.1", 694 | "babel-plugin-dynamic-import-node": "^2.3.3" 695 | } 696 | }, 697 | "@babel/plugin-transform-modules-systemjs": { 698 | "version": "7.10.1", 699 | "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.10.1.tgz", 700 | "integrity": "sha512-ewNKcj1TQZDL3YnO85qh9zo1YF1CHgmSTlRQgHqe63oTrMI85cthKtZjAiZSsSNjPQ5NCaYo5QkbYqEw1ZBgZA==", 701 | "dev": true, 702 | "requires": { 703 | "@babel/helper-hoist-variables": "^7.10.1", 704 | "@babel/helper-module-transforms": "^7.10.1", 705 | "@babel/helper-plugin-utils": "^7.10.1", 706 | "babel-plugin-dynamic-import-node": "^2.3.3" 707 | } 708 | }, 709 | "@babel/plugin-transform-modules-umd": { 710 | "version": "7.10.1", 711 | "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.10.1.tgz", 712 | "integrity": "sha512-EIuiRNMd6GB6ulcYlETnYYfgv4AxqrswghmBRQbWLHZxN4s7mupxzglnHqk9ZiUpDI4eRWewedJJNj67PWOXKA==", 713 | "dev": true, 714 | "requires": { 715 | "@babel/helper-module-transforms": "^7.10.1", 716 | "@babel/helper-plugin-utils": "^7.10.1" 717 | } 718 | }, 719 | "@babel/plugin-transform-named-capturing-groups-regex": { 720 | "version": "7.8.3", 721 | "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.8.3.tgz", 722 | "integrity": "sha512-f+tF/8UVPU86TrCb06JoPWIdDpTNSGGcAtaD9mLP0aYGA0OS0j7j7DHJR0GTFrUZPUU6loZhbsVZgTh0N+Qdnw==", 723 | "dev": true, 724 | "requires": { 725 | "@babel/helper-create-regexp-features-plugin": "^7.8.3" 726 | } 727 | }, 728 | "@babel/plugin-transform-new-target": { 729 | "version": "7.10.1", 730 | "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.10.1.tgz", 731 | "integrity": "sha512-MBlzPc1nJvbmO9rPr1fQwXOM2iGut+JC92ku6PbiJMMK7SnQc1rytgpopveE3Evn47gzvGYeCdgfCDbZo0ecUw==", 732 | "dev": true, 733 | "requires": { 734 | "@babel/helper-plugin-utils": "^7.10.1" 735 | } 736 | }, 737 | "@babel/plugin-transform-object-super": { 738 | "version": "7.10.1", 739 | "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.10.1.tgz", 740 | "integrity": "sha512-WnnStUDN5GL+wGQrJylrnnVlFhFmeArINIR9gjhSeYyvroGhBrSAXYg/RHsnfzmsa+onJrTJrEClPzgNmmQ4Gw==", 741 | "dev": true, 742 | "requires": { 743 | "@babel/helper-plugin-utils": "^7.10.1", 744 | "@babel/helper-replace-supers": "^7.10.1" 745 | } 746 | }, 747 | "@babel/plugin-transform-parameters": { 748 | "version": "7.10.1", 749 | "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.10.1.tgz", 750 | "integrity": "sha512-tJ1T0n6g4dXMsL45YsSzzSDZCxiHXAQp/qHrucOq5gEHncTA3xDxnd5+sZcoQp+N1ZbieAaB8r/VUCG0gqseOg==", 751 | "dev": true, 752 | "requires": { 753 | "@babel/helper-get-function-arity": "^7.10.1", 754 | "@babel/helper-plugin-utils": "^7.10.1" 755 | } 756 | }, 757 | "@babel/plugin-transform-property-literals": { 758 | "version": "7.10.1", 759 | "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.10.1.tgz", 760 | "integrity": "sha512-Kr6+mgag8auNrgEpbfIWzdXYOvqDHZOF0+Bx2xh4H2EDNwcbRb9lY6nkZg8oSjsX+DH9Ebxm9hOqtKW+gRDeNA==", 761 | "dev": true, 762 | "requires": { 763 | "@babel/helper-plugin-utils": "^7.10.1" 764 | } 765 | }, 766 | "@babel/plugin-transform-regenerator": { 767 | "version": "7.10.1", 768 | "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.10.1.tgz", 769 | "integrity": "sha512-B3+Y2prScgJ2Bh/2l9LJxKbb8C8kRfsG4AdPT+n7ixBHIxJaIG8bi8tgjxUMege1+WqSJ+7gu1YeoMVO3gPWzw==", 770 | "dev": true, 771 | "requires": { 772 | "regenerator-transform": "^0.14.2" 773 | } 774 | }, 775 | "@babel/plugin-transform-reserved-words": { 776 | "version": "7.10.1", 777 | "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.10.1.tgz", 778 | "integrity": "sha512-qN1OMoE2nuqSPmpTqEM7OvJ1FkMEV+BjVeZZm9V9mq/x1JLKQ4pcv8riZJMNN3u2AUGl0ouOMjRr2siecvHqUQ==", 779 | "dev": true, 780 | "requires": { 781 | "@babel/helper-plugin-utils": "^7.10.1" 782 | } 783 | }, 784 | "@babel/plugin-transform-shorthand-properties": { 785 | "version": "7.10.1", 786 | "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.10.1.tgz", 787 | "integrity": "sha512-AR0E/lZMfLstScFwztApGeyTHJ5u3JUKMjneqRItWeEqDdHWZwAOKycvQNCasCK/3r5YXsuNG25funcJDu7Y2g==", 788 | "dev": true, 789 | "requires": { 790 | "@babel/helper-plugin-utils": "^7.10.1" 791 | } 792 | }, 793 | "@babel/plugin-transform-spread": { 794 | "version": "7.10.1", 795 | "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.10.1.tgz", 796 | "integrity": "sha512-8wTPym6edIrClW8FI2IoaePB91ETOtg36dOkj3bYcNe7aDMN2FXEoUa+WrmPc4xa1u2PQK46fUX2aCb+zo9rfw==", 797 | "dev": true, 798 | "requires": { 799 | "@babel/helper-plugin-utils": "^7.10.1" 800 | } 801 | }, 802 | "@babel/plugin-transform-sticky-regex": { 803 | "version": "7.10.1", 804 | "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.10.1.tgz", 805 | "integrity": "sha512-j17ojftKjrL7ufX8ajKvwRilwqTok4q+BjkknmQw9VNHnItTyMP5anPFzxFJdCQs7clLcWpCV3ma+6qZWLnGMA==", 806 | "dev": true, 807 | "requires": { 808 | "@babel/helper-plugin-utils": "^7.10.1", 809 | "@babel/helper-regex": "^7.10.1" 810 | } 811 | }, 812 | "@babel/plugin-transform-template-literals": { 813 | "version": "7.10.1", 814 | "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.10.1.tgz", 815 | "integrity": "sha512-t7B/3MQf5M1T9hPCRG28DNGZUuxAuDqLYS03rJrIk2prj/UV7Z6FOneijhQhnv/Xa039vidXeVbvjK2SK5f7Gg==", 816 | "dev": true, 817 | "requires": { 818 | "@babel/helper-annotate-as-pure": "^7.10.1", 819 | "@babel/helper-plugin-utils": "^7.10.1" 820 | } 821 | }, 822 | "@babel/plugin-transform-typeof-symbol": { 823 | "version": "7.10.1", 824 | "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.10.1.tgz", 825 | "integrity": "sha512-qX8KZcmbvA23zDi+lk9s6hC1FM7jgLHYIjuLgULgc8QtYnmB3tAVIYkNoKRQ75qWBeyzcoMoK8ZQmogGtC/w0g==", 826 | "dev": true, 827 | "requires": { 828 | "@babel/helper-plugin-utils": "^7.10.1" 829 | } 830 | }, 831 | "@babel/plugin-transform-unicode-escapes": { 832 | "version": "7.10.1", 833 | "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.10.1.tgz", 834 | "integrity": "sha512-zZ0Poh/yy1d4jeDWpx/mNwbKJVwUYJX73q+gyh4bwtG0/iUlzdEu0sLMda8yuDFS6LBQlT/ST1SJAR6zYwXWgw==", 835 | "dev": true, 836 | "requires": { 837 | "@babel/helper-plugin-utils": "^7.10.1" 838 | } 839 | }, 840 | "@babel/plugin-transform-unicode-regex": { 841 | "version": "7.10.1", 842 | "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.10.1.tgz", 843 | "integrity": "sha512-Y/2a2W299k0VIUdbqYm9X2qS6fE0CUBhhiPpimK6byy7OJ/kORLlIX+J6UrjgNu5awvs62k+6RSslxhcvVw2Tw==", 844 | "dev": true, 845 | "requires": { 846 | "@babel/helper-create-regexp-features-plugin": "^7.10.1", 847 | "@babel/helper-plugin-utils": "^7.10.1" 848 | } 849 | }, 850 | "@babel/preset-env": { 851 | "version": "7.10.2", 852 | "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.10.2.tgz", 853 | "integrity": "sha512-MjqhX0RZaEgK/KueRzh+3yPSk30oqDKJ5HP5tqTSB1e2gzGS3PLy7K0BIpnp78+0anFuSwOeuCf1zZO7RzRvEA==", 854 | "dev": true, 855 | "requires": { 856 | "@babel/compat-data": "^7.10.1", 857 | "@babel/helper-compilation-targets": "^7.10.2", 858 | "@babel/helper-module-imports": "^7.10.1", 859 | "@babel/helper-plugin-utils": "^7.10.1", 860 | "@babel/plugin-proposal-async-generator-functions": "^7.10.1", 861 | "@babel/plugin-proposal-class-properties": "^7.10.1", 862 | "@babel/plugin-proposal-dynamic-import": "^7.10.1", 863 | "@babel/plugin-proposal-json-strings": "^7.10.1", 864 | "@babel/plugin-proposal-nullish-coalescing-operator": "^7.10.1", 865 | "@babel/plugin-proposal-numeric-separator": "^7.10.1", 866 | "@babel/plugin-proposal-object-rest-spread": "^7.10.1", 867 | "@babel/plugin-proposal-optional-catch-binding": "^7.10.1", 868 | "@babel/plugin-proposal-optional-chaining": "^7.10.1", 869 | "@babel/plugin-proposal-private-methods": "^7.10.1", 870 | "@babel/plugin-proposal-unicode-property-regex": "^7.10.1", 871 | "@babel/plugin-syntax-async-generators": "^7.8.0", 872 | "@babel/plugin-syntax-class-properties": "^7.10.1", 873 | "@babel/plugin-syntax-dynamic-import": "^7.8.0", 874 | "@babel/plugin-syntax-json-strings": "^7.8.0", 875 | "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.0", 876 | "@babel/plugin-syntax-numeric-separator": "^7.10.1", 877 | "@babel/plugin-syntax-object-rest-spread": "^7.8.0", 878 | "@babel/plugin-syntax-optional-catch-binding": "^7.8.0", 879 | "@babel/plugin-syntax-optional-chaining": "^7.8.0", 880 | "@babel/plugin-syntax-top-level-await": "^7.10.1", 881 | "@babel/plugin-transform-arrow-functions": "^7.10.1", 882 | "@babel/plugin-transform-async-to-generator": "^7.10.1", 883 | "@babel/plugin-transform-block-scoped-functions": "^7.10.1", 884 | "@babel/plugin-transform-block-scoping": "^7.10.1", 885 | "@babel/plugin-transform-classes": "^7.10.1", 886 | "@babel/plugin-transform-computed-properties": "^7.10.1", 887 | "@babel/plugin-transform-destructuring": "^7.10.1", 888 | "@babel/plugin-transform-dotall-regex": "^7.10.1", 889 | "@babel/plugin-transform-duplicate-keys": "^7.10.1", 890 | "@babel/plugin-transform-exponentiation-operator": "^7.10.1", 891 | "@babel/plugin-transform-for-of": "^7.10.1", 892 | "@babel/plugin-transform-function-name": "^7.10.1", 893 | "@babel/plugin-transform-literals": "^7.10.1", 894 | "@babel/plugin-transform-member-expression-literals": "^7.10.1", 895 | "@babel/plugin-transform-modules-amd": "^7.10.1", 896 | "@babel/plugin-transform-modules-commonjs": "^7.10.1", 897 | "@babel/plugin-transform-modules-systemjs": "^7.10.1", 898 | "@babel/plugin-transform-modules-umd": "^7.10.1", 899 | "@babel/plugin-transform-named-capturing-groups-regex": "^7.8.3", 900 | "@babel/plugin-transform-new-target": "^7.10.1", 901 | "@babel/plugin-transform-object-super": "^7.10.1", 902 | "@babel/plugin-transform-parameters": "^7.10.1", 903 | "@babel/plugin-transform-property-literals": "^7.10.1", 904 | "@babel/plugin-transform-regenerator": "^7.10.1", 905 | "@babel/plugin-transform-reserved-words": "^7.10.1", 906 | "@babel/plugin-transform-shorthand-properties": "^7.10.1", 907 | "@babel/plugin-transform-spread": "^7.10.1", 908 | "@babel/plugin-transform-sticky-regex": "^7.10.1", 909 | "@babel/plugin-transform-template-literals": "^7.10.1", 910 | "@babel/plugin-transform-typeof-symbol": "^7.10.1", 911 | "@babel/plugin-transform-unicode-escapes": "^7.10.1", 912 | "@babel/plugin-transform-unicode-regex": "^7.10.1", 913 | "@babel/preset-modules": "^0.1.3", 914 | "@babel/types": "^7.10.2", 915 | "browserslist": "^4.12.0", 916 | "core-js-compat": "^3.6.2", 917 | "invariant": "^2.2.2", 918 | "levenary": "^1.1.1", 919 | "semver": "^5.5.0" 920 | } 921 | }, 922 | "@babel/preset-modules": { 923 | "version": "0.1.3", 924 | "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.3.tgz", 925 | "integrity": "sha512-Ra3JXOHBq2xd56xSF7lMKXdjBn3T772Y1Wet3yWnkDly9zHvJki029tAFzvAAK5cf4YV3yoxuP61crYRol6SVg==", 926 | "dev": true, 927 | "requires": { 928 | "@babel/helper-plugin-utils": "^7.0.0", 929 | "@babel/plugin-proposal-unicode-property-regex": "^7.4.4", 930 | "@babel/plugin-transform-dotall-regex": "^7.4.4", 931 | "@babel/types": "^7.4.4", 932 | "esutils": "^2.0.2" 933 | } 934 | }, 935 | "@babel/register": { 936 | "version": "7.10.1", 937 | "resolved": "https://registry.npmjs.org/@babel/register/-/register-7.10.1.tgz", 938 | "integrity": "sha512-sl96+kB3IA2B9EzpwwBmYadOT14vw3KaXOknGDbJaZCOj52GDA4Tivudq9doCJcB+bEIKCEARZYwRgBBsCGXyg==", 939 | "dev": true, 940 | "requires": { 941 | "find-cache-dir": "^2.0.0", 942 | "lodash": "^4.17.13", 943 | "make-dir": "^2.1.0", 944 | "pirates": "^4.0.0", 945 | "source-map-support": "^0.5.16" 946 | } 947 | }, 948 | "@babel/runtime": { 949 | "version": "7.10.2", 950 | "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.10.2.tgz", 951 | "integrity": "sha512-6sF3uQw2ivImfVIl62RZ7MXhO2tap69WeWK57vAaimT6AZbE4FbqjdEJIN1UqoD6wI6B+1n9UiagafH1sxjOtg==", 952 | "dev": true, 953 | "requires": { 954 | "regenerator-runtime": "^0.13.4" 955 | } 956 | }, 957 | "@babel/template": { 958 | "version": "7.10.1", 959 | "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.10.1.tgz", 960 | "integrity": "sha512-OQDg6SqvFSsc9A0ej6SKINWrpJiNonRIniYondK2ViKhB06i3c0s+76XUft71iqBEe9S1OKsHwPAjfHnuvnCig==", 961 | "dev": true, 962 | "requires": { 963 | "@babel/code-frame": "^7.10.1", 964 | "@babel/parser": "^7.10.1", 965 | "@babel/types": "^7.10.1" 966 | } 967 | }, 968 | "@babel/traverse": { 969 | "version": "7.10.1", 970 | "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.10.1.tgz", 971 | "integrity": "sha512-C/cTuXeKt85K+p08jN6vMDz8vSV0vZcI0wmQ36o6mjbuo++kPMdpOYw23W2XH04dbRt9/nMEfA4W3eR21CD+TQ==", 972 | "dev": true, 973 | "requires": { 974 | "@babel/code-frame": "^7.10.1", 975 | "@babel/generator": "^7.10.1", 976 | "@babel/helper-function-name": "^7.10.1", 977 | "@babel/helper-split-export-declaration": "^7.10.1", 978 | "@babel/parser": "^7.10.1", 979 | "@babel/types": "^7.10.1", 980 | "debug": "^4.1.0", 981 | "globals": "^11.1.0", 982 | "lodash": "^4.17.13" 983 | } 984 | }, 985 | "@babel/types": { 986 | "version": "7.10.2", 987 | "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.10.2.tgz", 988 | "integrity": "sha512-AD3AwWBSz0AWF0AkCN9VPiWrvldXq+/e3cHa4J89vo4ymjz1XwrBFFVZmkJTsQIPNk+ZVomPSXUJqq8yyjZsng==", 989 | "dev": true, 990 | "requires": { 991 | "@babel/helper-validator-identifier": "^7.10.1", 992 | "lodash": "^4.17.13", 993 | "to-fast-properties": "^2.0.0" 994 | } 995 | }, 996 | "ansi-styles": { 997 | "version": "3.2.1", 998 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", 999 | "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", 1000 | "dev": true, 1001 | "requires": { 1002 | "color-convert": "^1.9.0" 1003 | } 1004 | }, 1005 | "babel-plugin-dynamic-import-node": { 1006 | "version": "2.3.3", 1007 | "resolved": "https://registry.npmjs.org/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.3.tgz", 1008 | "integrity": "sha512-jZVI+s9Zg3IqA/kdi0i6UDCybUI3aSBLnglhYbSSjKlV7yF1F/5LWv8MakQmvYpnbJDS6fcBL2KzHSxNCMtWSQ==", 1009 | "dev": true, 1010 | "requires": { 1011 | "object.assign": "^4.1.0" 1012 | } 1013 | }, 1014 | "browserslist": { 1015 | "version": "4.16.6", 1016 | "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.16.6.tgz", 1017 | "integrity": "sha512-Wspk/PqO+4W9qp5iUTJsa1B/QrYn1keNCcEP5OvP7WBwT4KaDly0uONYmC6Xa3Z5IqnUgS0KcgLYu1l74x0ZXQ==", 1018 | "dev": true, 1019 | "requires": { 1020 | "caniuse-lite": "^1.0.30001219", 1021 | "colorette": "^1.2.2", 1022 | "electron-to-chromium": "^1.3.723", 1023 | "escalade": "^3.1.1", 1024 | "node-releases": "^1.1.71" 1025 | }, 1026 | "dependencies": { 1027 | "caniuse-lite": { 1028 | "version": "1.0.30001230", 1029 | "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001230.tgz", 1030 | "integrity": "sha512-5yBd5nWCBS+jWKTcHOzXwo5xzcj4ePE/yjtkZyUV1BTUmrBaA9MRGC+e7mxnqXSA90CmCA8L3eKLaSUkt099IQ==", 1031 | "dev": true 1032 | }, 1033 | "electron-to-chromium": { 1034 | "version": "1.3.739", 1035 | "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.739.tgz", 1036 | "integrity": "sha512-+LPJVRsN7hGZ9EIUUiWCpO7l4E3qBYHNadazlucBfsXBbccDFNKUBAgzE68FnkWGJPwD/AfKhSzL+G+Iqb8A4A==", 1037 | "dev": true 1038 | }, 1039 | "node-releases": { 1040 | "version": "1.1.72", 1041 | "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.72.tgz", 1042 | "integrity": "sha512-LLUo+PpH3dU6XizX3iVoubUNheF/owjXCZZ5yACDxNnPtgFuludV1ZL3ayK1kVep42Rmm0+R9/Y60NQbZ2bifw==", 1043 | "dev": true 1044 | } 1045 | } 1046 | }, 1047 | "buffer-from": { 1048 | "version": "1.1.1", 1049 | "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", 1050 | "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==", 1051 | "dev": true 1052 | }, 1053 | "chalk": { 1054 | "version": "2.4.2", 1055 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", 1056 | "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", 1057 | "dev": true, 1058 | "requires": { 1059 | "ansi-styles": "^3.2.1", 1060 | "escape-string-regexp": "^1.0.5", 1061 | "supports-color": "^5.3.0" 1062 | } 1063 | }, 1064 | "color-convert": { 1065 | "version": "1.9.3", 1066 | "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", 1067 | "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", 1068 | "dev": true, 1069 | "requires": { 1070 | "color-name": "1.1.3" 1071 | } 1072 | }, 1073 | "color-name": { 1074 | "version": "1.1.3", 1075 | "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", 1076 | "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", 1077 | "dev": true 1078 | }, 1079 | "colorette": { 1080 | "version": "1.2.2", 1081 | "resolved": "https://registry.npmjs.org/colorette/-/colorette-1.2.2.tgz", 1082 | "integrity": "sha512-MKGMzyfeuutC/ZJ1cba9NqcNpfeqMUcYmyF1ZFY6/Cn7CNSAKx6a+s48sqLqyAiZuaP2TcqMhoo+dlwFnVxT9w==", 1083 | "dev": true 1084 | }, 1085 | "commander": { 1086 | "version": "4.1.1", 1087 | "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz", 1088 | "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==", 1089 | "dev": true 1090 | }, 1091 | "commondir": { 1092 | "version": "1.0.1", 1093 | "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", 1094 | "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=", 1095 | "dev": true 1096 | }, 1097 | "convert-source-map": { 1098 | "version": "1.7.0", 1099 | "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.7.0.tgz", 1100 | "integrity": "sha512-4FJkXzKXEDB1snCFZlLP4gpC3JILicCpGbzG9f9G7tGqGCzETQ2hWPrcinA9oU4wtf2biUaEH5065UnMeR33oA==", 1101 | "dev": true, 1102 | "requires": { 1103 | "safe-buffer": "~5.1.1" 1104 | } 1105 | }, 1106 | "core-js": { 1107 | "version": "3.6.5", 1108 | "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.6.5.tgz", 1109 | "integrity": "sha512-vZVEEwZoIsI+vPEuoF9Iqf5H7/M3eeQqWlQnYa8FSKKePuYTf5MWnxb5SDAzCa60b3JBRS5g9b+Dq7b1y/RCrA==", 1110 | "dev": true 1111 | }, 1112 | "core-js-compat": { 1113 | "version": "3.6.5", 1114 | "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.6.5.tgz", 1115 | "integrity": "sha512-7ItTKOhOZbznhXAQ2g/slGg1PJV5zDO/WdkTwi7UEOJmkvsE32PWvx6mKtDjiMpjnR2CNf6BAD6sSxIlv7ptng==", 1116 | "dev": true, 1117 | "requires": { 1118 | "browserslist": "^4.8.5", 1119 | "semver": "7.0.0" 1120 | }, 1121 | "dependencies": { 1122 | "semver": { 1123 | "version": "7.0.0", 1124 | "resolved": "https://registry.npmjs.org/semver/-/semver-7.0.0.tgz", 1125 | "integrity": "sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A==", 1126 | "dev": true 1127 | } 1128 | } 1129 | }, 1130 | "debug": { 1131 | "version": "4.1.1", 1132 | "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", 1133 | "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", 1134 | "dev": true, 1135 | "requires": { 1136 | "ms": "^2.1.1" 1137 | } 1138 | }, 1139 | "define-properties": { 1140 | "version": "1.1.3", 1141 | "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", 1142 | "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", 1143 | "dev": true, 1144 | "requires": { 1145 | "object-keys": "^1.0.12" 1146 | } 1147 | }, 1148 | "es-abstract": { 1149 | "version": "1.17.5", 1150 | "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.5.tgz", 1151 | "integrity": "sha512-BR9auzDbySxOcfog0tLECW8l28eRGpDpU3Dm3Hp4q/N+VtLTmyj4EUN088XZWQDW/hzj6sYRDXeOFsaAODKvpg==", 1152 | "dev": true, 1153 | "requires": { 1154 | "es-to-primitive": "^1.2.1", 1155 | "function-bind": "^1.1.1", 1156 | "has": "^1.0.3", 1157 | "has-symbols": "^1.0.1", 1158 | "is-callable": "^1.1.5", 1159 | "is-regex": "^1.0.5", 1160 | "object-inspect": "^1.7.0", 1161 | "object-keys": "^1.1.1", 1162 | "object.assign": "^4.1.0", 1163 | "string.prototype.trimleft": "^2.1.1", 1164 | "string.prototype.trimright": "^2.1.1" 1165 | } 1166 | }, 1167 | "es-to-primitive": { 1168 | "version": "1.2.1", 1169 | "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", 1170 | "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", 1171 | "dev": true, 1172 | "requires": { 1173 | "is-callable": "^1.1.4", 1174 | "is-date-object": "^1.0.1", 1175 | "is-symbol": "^1.0.2" 1176 | } 1177 | }, 1178 | "escalade": { 1179 | "version": "3.1.1", 1180 | "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", 1181 | "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", 1182 | "dev": true 1183 | }, 1184 | "escape-string-regexp": { 1185 | "version": "1.0.5", 1186 | "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", 1187 | "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", 1188 | "dev": true 1189 | }, 1190 | "esutils": { 1191 | "version": "2.0.3", 1192 | "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", 1193 | "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", 1194 | "dev": true 1195 | }, 1196 | "find-cache-dir": { 1197 | "version": "2.1.0", 1198 | "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-2.1.0.tgz", 1199 | "integrity": "sha512-Tq6PixE0w/VMFfCgbONnkiQIVol/JJL7nRMi20fqzA4NRs9AfeqMGeRdPi3wIhYkxjeBaWh2rxwapn5Tu3IqOQ==", 1200 | "dev": true, 1201 | "requires": { 1202 | "commondir": "^1.0.1", 1203 | "make-dir": "^2.0.0", 1204 | "pkg-dir": "^3.0.0" 1205 | } 1206 | }, 1207 | "find-up": { 1208 | "version": "3.0.0", 1209 | "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", 1210 | "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", 1211 | "dev": true, 1212 | "requires": { 1213 | "locate-path": "^3.0.0" 1214 | } 1215 | }, 1216 | "function-bind": { 1217 | "version": "1.1.1", 1218 | "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", 1219 | "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", 1220 | "dev": true 1221 | }, 1222 | "gensync": { 1223 | "version": "1.0.0-beta.1", 1224 | "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.1.tgz", 1225 | "integrity": "sha512-r8EC6NO1sngH/zdD9fiRDLdcgnbayXah+mLgManTaIZJqEC1MZstmnox8KpnI2/fxQwrp5OpCOYWLp4rBl4Jcg==", 1226 | "dev": true 1227 | }, 1228 | "globals": { 1229 | "version": "11.12.0", 1230 | "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", 1231 | "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", 1232 | "dev": true 1233 | }, 1234 | "has": { 1235 | "version": "1.0.3", 1236 | "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", 1237 | "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", 1238 | "dev": true, 1239 | "requires": { 1240 | "function-bind": "^1.1.1" 1241 | } 1242 | }, 1243 | "has-flag": { 1244 | "version": "3.0.0", 1245 | "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", 1246 | "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", 1247 | "dev": true 1248 | }, 1249 | "has-symbols": { 1250 | "version": "1.0.1", 1251 | "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.1.tgz", 1252 | "integrity": "sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg==", 1253 | "dev": true 1254 | }, 1255 | "homedir-polyfill": { 1256 | "version": "1.0.3", 1257 | "resolved": "https://registry.npmjs.org/homedir-polyfill/-/homedir-polyfill-1.0.3.tgz", 1258 | "integrity": "sha512-eSmmWE5bZTK2Nou4g0AI3zZ9rswp7GRKoKXS1BLUkvPviOqs4YTN1djQIqrXy9k5gEtdLPy86JjRwsNM9tnDcA==", 1259 | "dev": true, 1260 | "requires": { 1261 | "parse-passwd": "^1.0.0" 1262 | } 1263 | }, 1264 | "invariant": { 1265 | "version": "2.2.4", 1266 | "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz", 1267 | "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==", 1268 | "dev": true, 1269 | "requires": { 1270 | "loose-envify": "^1.0.0" 1271 | } 1272 | }, 1273 | "is-callable": { 1274 | "version": "1.1.5", 1275 | "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.5.tgz", 1276 | "integrity": "sha512-ESKv5sMCJB2jnHTWZ3O5itG+O128Hsus4K4Qh1h2/cgn2vbgnLSVqfV46AeJA9D5EeeLa9w81KUXMtn34zhX+Q==", 1277 | "dev": true 1278 | }, 1279 | "is-date-object": { 1280 | "version": "1.0.2", 1281 | "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.2.tgz", 1282 | "integrity": "sha512-USlDT524woQ08aoZFzh3/Z6ch9Y/EWXEHQ/AaRN0SkKq4t2Jw2R2339tSXmwuVoY7LLlBCbOIlx2myP/L5zk0g==", 1283 | "dev": true 1284 | }, 1285 | "is-regex": { 1286 | "version": "1.0.5", 1287 | "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.5.tgz", 1288 | "integrity": "sha512-vlKW17SNq44owv5AQR3Cq0bQPEb8+kF3UKZ2fiZNOWtztYE5i0CzCZxFDwO58qAOWtxdBRVO/V5Qin1wjCqFYQ==", 1289 | "dev": true, 1290 | "requires": { 1291 | "has": "^1.0.3" 1292 | } 1293 | }, 1294 | "is-symbol": { 1295 | "version": "1.0.3", 1296 | "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.3.tgz", 1297 | "integrity": "sha512-OwijhaRSgqvhm/0ZdAcXNZt9lYdKFpcRDT5ULUuYXPoT794UNOdU+gpT6Rzo7b4V2HUl/op6GqY894AZwv9faQ==", 1298 | "dev": true, 1299 | "requires": { 1300 | "has-symbols": "^1.0.1" 1301 | } 1302 | }, 1303 | "js-tokens": { 1304 | "version": "4.0.0", 1305 | "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", 1306 | "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", 1307 | "dev": true 1308 | }, 1309 | "jsesc": { 1310 | "version": "2.5.2", 1311 | "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", 1312 | "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", 1313 | "dev": true 1314 | }, 1315 | "json5": { 1316 | "version": "2.1.3", 1317 | "resolved": "https://registry.npmjs.org/json5/-/json5-2.1.3.tgz", 1318 | "integrity": "sha512-KXPvOm8K9IJKFM0bmdn8QXh7udDh1g/giieX0NLCaMnb4hEiVFqnop2ImTXCc5e0/oHz3LTqmHGtExn5hfMkOA==", 1319 | "dev": true, 1320 | "requires": { 1321 | "minimist": "^1.2.5" 1322 | } 1323 | }, 1324 | "leven": { 1325 | "version": "3.1.0", 1326 | "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", 1327 | "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==", 1328 | "dev": true 1329 | }, 1330 | "levenary": { 1331 | "version": "1.1.1", 1332 | "resolved": "https://registry.npmjs.org/levenary/-/levenary-1.1.1.tgz", 1333 | "integrity": "sha512-mkAdOIt79FD6irqjYSs4rdbnlT5vRonMEvBVPVb3XmevfS8kgRXwfes0dhPdEtzTWD/1eNE/Bm/G1iRt6DcnQQ==", 1334 | "dev": true, 1335 | "requires": { 1336 | "leven": "^3.1.0" 1337 | } 1338 | }, 1339 | "locate-path": { 1340 | "version": "3.0.0", 1341 | "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", 1342 | "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", 1343 | "dev": true, 1344 | "requires": { 1345 | "p-locate": "^3.0.0", 1346 | "path-exists": "^3.0.0" 1347 | } 1348 | }, 1349 | "lodash": { 1350 | "version": "4.17.21", 1351 | "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", 1352 | "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", 1353 | "dev": true 1354 | }, 1355 | "loose-envify": { 1356 | "version": "1.4.0", 1357 | "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", 1358 | "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", 1359 | "dev": true, 1360 | "requires": { 1361 | "js-tokens": "^3.0.0 || ^4.0.0" 1362 | } 1363 | }, 1364 | "make-dir": { 1365 | "version": "2.1.0", 1366 | "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", 1367 | "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==", 1368 | "dev": true, 1369 | "requires": { 1370 | "pify": "^4.0.1", 1371 | "semver": "^5.6.0" 1372 | } 1373 | }, 1374 | "minimist": { 1375 | "version": "1.2.5", 1376 | "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", 1377 | "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", 1378 | "dev": true 1379 | }, 1380 | "ms": { 1381 | "version": "2.1.2", 1382 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", 1383 | "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", 1384 | "dev": true 1385 | }, 1386 | "node-environment-flags": { 1387 | "version": "1.0.6", 1388 | "resolved": "https://registry.npmjs.org/node-environment-flags/-/node-environment-flags-1.0.6.tgz", 1389 | "integrity": "sha512-5Evy2epuL+6TM0lCQGpFIj6KwiEsGh1SrHUhTbNX+sLbBtjidPZFAnVK9y5yU1+h//RitLbRHTIMyxQPtxMdHw==", 1390 | "dev": true, 1391 | "requires": { 1392 | "object.getownpropertydescriptors": "^2.0.3", 1393 | "semver": "^5.7.0" 1394 | } 1395 | }, 1396 | "node-modules-regexp": { 1397 | "version": "1.0.0", 1398 | "resolved": "https://registry.npmjs.org/node-modules-regexp/-/node-modules-regexp-1.0.0.tgz", 1399 | "integrity": "sha1-jZ2+KJZKSsVxLpExZCEHxx6Q7EA=", 1400 | "dev": true 1401 | }, 1402 | "object-inspect": { 1403 | "version": "1.7.0", 1404 | "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.7.0.tgz", 1405 | "integrity": "sha512-a7pEHdh1xKIAgTySUGgLMx/xwDZskN1Ud6egYYN3EdRW4ZMPNEDUTF+hwy2LUC+Bl+SyLXANnwz/jyh/qutKUw==", 1406 | "dev": true 1407 | }, 1408 | "object-keys": { 1409 | "version": "1.1.1", 1410 | "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", 1411 | "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", 1412 | "dev": true 1413 | }, 1414 | "object.assign": { 1415 | "version": "4.1.0", 1416 | "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.0.tgz", 1417 | "integrity": "sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w==", 1418 | "dev": true, 1419 | "requires": { 1420 | "define-properties": "^1.1.2", 1421 | "function-bind": "^1.1.1", 1422 | "has-symbols": "^1.0.0", 1423 | "object-keys": "^1.0.11" 1424 | } 1425 | }, 1426 | "object.getownpropertydescriptors": { 1427 | "version": "2.1.0", 1428 | "resolved": "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.0.tgz", 1429 | "integrity": "sha512-Z53Oah9A3TdLoblT7VKJaTDdXdT+lQO+cNpKVnya5JDe9uLvzu1YyY1yFDFrcxrlRgWrEFH0jJtD/IbuwjcEVg==", 1430 | "dev": true, 1431 | "requires": { 1432 | "define-properties": "^1.1.3", 1433 | "es-abstract": "^1.17.0-next.1" 1434 | } 1435 | }, 1436 | "p-limit": { 1437 | "version": "2.3.0", 1438 | "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", 1439 | "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", 1440 | "dev": true, 1441 | "requires": { 1442 | "p-try": "^2.0.0" 1443 | } 1444 | }, 1445 | "p-locate": { 1446 | "version": "3.0.0", 1447 | "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", 1448 | "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", 1449 | "dev": true, 1450 | "requires": { 1451 | "p-limit": "^2.0.0" 1452 | } 1453 | }, 1454 | "p-try": { 1455 | "version": "2.2.0", 1456 | "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", 1457 | "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", 1458 | "dev": true 1459 | }, 1460 | "parse-passwd": { 1461 | "version": "1.0.0", 1462 | "resolved": "https://registry.npmjs.org/parse-passwd/-/parse-passwd-1.0.0.tgz", 1463 | "integrity": "sha1-bVuTSkVpk7I9N/QKOC1vFmao5cY=", 1464 | "dev": true 1465 | }, 1466 | "path-exists": { 1467 | "version": "3.0.0", 1468 | "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", 1469 | "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", 1470 | "dev": true 1471 | }, 1472 | "path-parse": { 1473 | "version": "1.0.7", 1474 | "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", 1475 | "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", 1476 | "dev": true 1477 | }, 1478 | "pify": { 1479 | "version": "4.0.1", 1480 | "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", 1481 | "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", 1482 | "dev": true 1483 | }, 1484 | "pirates": { 1485 | "version": "4.0.1", 1486 | "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.1.tgz", 1487 | "integrity": "sha512-WuNqLTbMI3tmfef2TKxlQmAiLHKtFhlsCZnPIpuv2Ow0RDVO8lfy1Opf4NUzlMXLjPl+Men7AuVdX6TA+s+uGA==", 1488 | "dev": true, 1489 | "requires": { 1490 | "node-modules-regexp": "^1.0.0" 1491 | } 1492 | }, 1493 | "pkg-dir": { 1494 | "version": "3.0.0", 1495 | "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-3.0.0.tgz", 1496 | "integrity": "sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==", 1497 | "dev": true, 1498 | "requires": { 1499 | "find-up": "^3.0.0" 1500 | } 1501 | }, 1502 | "private": { 1503 | "version": "0.1.8", 1504 | "resolved": "https://registry.npmjs.org/private/-/private-0.1.8.tgz", 1505 | "integrity": "sha512-VvivMrbvd2nKkiG38qjULzlc+4Vx4wm/whI9pQD35YrARNnhxeiRktSOhSukRLFNlzg6Br/cJPet5J/u19r/mg==", 1506 | "dev": true 1507 | }, 1508 | "regenerate": { 1509 | "version": "1.4.0", 1510 | "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.0.tgz", 1511 | "integrity": "sha512-1G6jJVDWrt0rK99kBjvEtziZNCICAuvIPkSiUFIQxVP06RCVpq3dmDo2oi6ABpYaDYaTRr67BEhL8r1wgEZZKg==", 1512 | "dev": true 1513 | }, 1514 | "regenerate-unicode-properties": { 1515 | "version": "8.2.0", 1516 | "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-8.2.0.tgz", 1517 | "integrity": "sha512-F9DjY1vKLo/tPePDycuH3dn9H1OTPIkVD9Kz4LODu+F2C75mgjAJ7x/gwy6ZcSNRAAkhNlJSOHRe8k3p+K9WhA==", 1518 | "dev": true, 1519 | "requires": { 1520 | "regenerate": "^1.4.0" 1521 | } 1522 | }, 1523 | "regenerator-runtime": { 1524 | "version": "0.13.5", 1525 | "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.5.tgz", 1526 | "integrity": "sha512-ZS5w8CpKFinUzOwW3c83oPeVXoNsrLsaCoLtJvAClH135j/R77RuymhiSErhm2lKcwSCIpmvIWSbDkIfAqKQlA==", 1527 | "dev": true 1528 | }, 1529 | "regenerator-transform": { 1530 | "version": "0.14.4", 1531 | "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.14.4.tgz", 1532 | "integrity": "sha512-EaJaKPBI9GvKpvUz2mz4fhx7WPgvwRLY9v3hlNHWmAuJHI13T4nwKnNvm5RWJzEdnI5g5UwtOww+S8IdoUC2bw==", 1533 | "dev": true, 1534 | "requires": { 1535 | "@babel/runtime": "^7.8.4", 1536 | "private": "^0.1.8" 1537 | } 1538 | }, 1539 | "regexpu-core": { 1540 | "version": "4.7.0", 1541 | "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-4.7.0.tgz", 1542 | "integrity": "sha512-TQ4KXRnIn6tz6tjnrXEkD/sshygKH/j5KzK86X8MkeHyZ8qst/LZ89j3X4/8HEIfHANTFIP/AbXakeRhWIl5YQ==", 1543 | "dev": true, 1544 | "requires": { 1545 | "regenerate": "^1.4.0", 1546 | "regenerate-unicode-properties": "^8.2.0", 1547 | "regjsgen": "^0.5.1", 1548 | "regjsparser": "^0.6.4", 1549 | "unicode-match-property-ecmascript": "^1.0.4", 1550 | "unicode-match-property-value-ecmascript": "^1.2.0" 1551 | } 1552 | }, 1553 | "regjsgen": { 1554 | "version": "0.5.2", 1555 | "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.5.2.tgz", 1556 | "integrity": "sha512-OFFT3MfrH90xIW8OOSyUrk6QHD5E9JOTeGodiJeBS3J6IwlgzJMNE/1bZklWz5oTg+9dCMyEetclvCVXOPoN3A==", 1557 | "dev": true 1558 | }, 1559 | "regjsparser": { 1560 | "version": "0.6.4", 1561 | "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.6.4.tgz", 1562 | "integrity": "sha512-64O87/dPDgfk8/RQqC4gkZoGyyWFIEUTTh80CU6CWuK5vkCGyekIx+oKcEIYtP/RAxSQltCZHCNu/mdd7fqlJw==", 1563 | "dev": true, 1564 | "requires": { 1565 | "jsesc": "~0.5.0" 1566 | }, 1567 | "dependencies": { 1568 | "jsesc": { 1569 | "version": "0.5.0", 1570 | "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", 1571 | "integrity": "sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0=", 1572 | "dev": true 1573 | } 1574 | } 1575 | }, 1576 | "resolve": { 1577 | "version": "1.17.0", 1578 | "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.17.0.tgz", 1579 | "integrity": "sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w==", 1580 | "dev": true, 1581 | "requires": { 1582 | "path-parse": "^1.0.6" 1583 | } 1584 | }, 1585 | "safe-buffer": { 1586 | "version": "5.1.2", 1587 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", 1588 | "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", 1589 | "dev": true 1590 | }, 1591 | "semver": { 1592 | "version": "5.7.1", 1593 | "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", 1594 | "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", 1595 | "dev": true 1596 | }, 1597 | "source-map": { 1598 | "version": "0.5.7", 1599 | "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", 1600 | "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", 1601 | "dev": true 1602 | }, 1603 | "source-map-support": { 1604 | "version": "0.5.19", 1605 | "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.19.tgz", 1606 | "integrity": "sha512-Wonm7zOCIJzBGQdB+thsPar0kYuCIzYvxZwlBa87yi/Mdjv7Tip2cyVbLj5o0cFPN4EVkuTwb3GDDyUx2DGnGw==", 1607 | "dev": true, 1608 | "requires": { 1609 | "buffer-from": "^1.0.0", 1610 | "source-map": "^0.6.0" 1611 | }, 1612 | "dependencies": { 1613 | "source-map": { 1614 | "version": "0.6.1", 1615 | "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", 1616 | "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", 1617 | "dev": true 1618 | } 1619 | } 1620 | }, 1621 | "string.prototype.trimend": { 1622 | "version": "1.0.1", 1623 | "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.1.tgz", 1624 | "integrity": "sha512-LRPxFUaTtpqYsTeNKaFOw3R4bxIzWOnbQ837QfBylo8jIxtcbK/A/sMV7Q+OAV/vWo+7s25pOE10KYSjaSO06g==", 1625 | "dev": true, 1626 | "requires": { 1627 | "define-properties": "^1.1.3", 1628 | "es-abstract": "^1.17.5" 1629 | } 1630 | }, 1631 | "string.prototype.trimleft": { 1632 | "version": "2.1.2", 1633 | "resolved": "https://registry.npmjs.org/string.prototype.trimleft/-/string.prototype.trimleft-2.1.2.tgz", 1634 | "integrity": "sha512-gCA0tza1JBvqr3bfAIFJGqfdRTyPae82+KTnm3coDXkZN9wnuW3HjGgN386D7hfv5CHQYCI022/rJPVlqXyHSw==", 1635 | "dev": true, 1636 | "requires": { 1637 | "define-properties": "^1.1.3", 1638 | "es-abstract": "^1.17.5", 1639 | "string.prototype.trimstart": "^1.0.0" 1640 | } 1641 | }, 1642 | "string.prototype.trimright": { 1643 | "version": "2.1.2", 1644 | "resolved": "https://registry.npmjs.org/string.prototype.trimright/-/string.prototype.trimright-2.1.2.tgz", 1645 | "integrity": "sha512-ZNRQ7sY3KroTaYjRS6EbNiiHrOkjihL9aQE/8gfQ4DtAC/aEBRHFJa44OmoWxGGqXuJlfKkZW4WcXErGr+9ZFg==", 1646 | "dev": true, 1647 | "requires": { 1648 | "define-properties": "^1.1.3", 1649 | "es-abstract": "^1.17.5", 1650 | "string.prototype.trimend": "^1.0.0" 1651 | } 1652 | }, 1653 | "string.prototype.trimstart": { 1654 | "version": "1.0.1", 1655 | "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.1.tgz", 1656 | "integrity": "sha512-XxZn+QpvrBI1FOcg6dIpxUPgWCPuNXvMD72aaRaUQv1eD4e/Qy8i/hFTe0BUmD60p/QA6bh1avmuPTfNjqVWRw==", 1657 | "dev": true, 1658 | "requires": { 1659 | "define-properties": "^1.1.3", 1660 | "es-abstract": "^1.17.5" 1661 | } 1662 | }, 1663 | "supports-color": { 1664 | "version": "5.5.0", 1665 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", 1666 | "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", 1667 | "dev": true, 1668 | "requires": { 1669 | "has-flag": "^3.0.0" 1670 | } 1671 | }, 1672 | "to-fast-properties": { 1673 | "version": "2.0.0", 1674 | "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", 1675 | "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", 1676 | "dev": true 1677 | }, 1678 | "unicode-canonical-property-names-ecmascript": { 1679 | "version": "1.0.4", 1680 | "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-1.0.4.tgz", 1681 | "integrity": "sha512-jDrNnXWHd4oHiTZnx/ZG7gtUTVp+gCcTTKr8L0HjlwphROEW3+Him+IpvC+xcJEFegapiMZyZe02CyuOnRmbnQ==", 1682 | "dev": true 1683 | }, 1684 | "unicode-match-property-ecmascript": { 1685 | "version": "1.0.4", 1686 | "resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-1.0.4.tgz", 1687 | "integrity": "sha512-L4Qoh15vTfntsn4P1zqnHulG0LdXgjSO035fEpdtp6YxXhMT51Q6vgM5lYdG/5X3MjS+k/Y9Xw4SFCY9IkR0rg==", 1688 | "dev": true, 1689 | "requires": { 1690 | "unicode-canonical-property-names-ecmascript": "^1.0.4", 1691 | "unicode-property-aliases-ecmascript": "^1.0.4" 1692 | } 1693 | }, 1694 | "unicode-match-property-value-ecmascript": { 1695 | "version": "1.2.0", 1696 | "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-1.2.0.tgz", 1697 | "integrity": "sha512-wjuQHGQVofmSJv1uVISKLE5zO2rNGzM/KCYZch/QQvez7C1hUhBIuZ701fYXExuufJFMPhv2SyL8CyoIfMLbIQ==", 1698 | "dev": true 1699 | }, 1700 | "unicode-property-aliases-ecmascript": { 1701 | "version": "1.1.0", 1702 | "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-1.1.0.tgz", 1703 | "integrity": "sha512-PqSoPh/pWetQ2phoj5RLiaqIk4kCNwoV3CI+LfGmWLKI3rE3kl1h59XpX2BjgDrmbxD9ARtQobPGU1SguCYuQg==", 1704 | "dev": true 1705 | }, 1706 | "v8flags": { 1707 | "version": "3.2.0", 1708 | "resolved": "https://registry.npmjs.org/v8flags/-/v8flags-3.2.0.tgz", 1709 | "integrity": "sha512-mH8etigqMfiGWdeXpaaqGfs6BndypxusHHcv2qSHyZkGEznCd/qAXCWWRzeowtL54147cktFOC4P5y+kl8d8Jg==", 1710 | "dev": true, 1711 | "requires": { 1712 | "homedir-polyfill": "^1.0.1" 1713 | } 1714 | } 1715 | } 1716 | } 1717 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "ECMAScript-cheatsheet", 3 | "version": "1.0.0", 4 | "description": "ECMAScript features with list of examples.", 5 | "main": "index.js", 6 | "author": "Sudheer Jonna ", 7 | "license": "MIT", 8 | "devDependencies": { 9 | "@babel/core": "^7.9.0", 10 | "@babel/node": "^7.8.7", 11 | "@babel/preset-env": "^7.9.5" 12 | } 13 | } 14 | --------------------------------------------------------------------------------